@cnife/pi-skills-injection
交互式控制哪些技能被注入到 pi 的系统提示词,持久化配置
Package details
Install @cnife/pi-skills-injection from npm and Pi will load the resources declared by the package manifest.
$ pi install npm:@cnife/pi-skills-injection- Package
@cnife/pi-skills-injection- Version
0.1.2- Published
- Jul 26, 2026
- Downloads
- 443/mo · 27/wk
- Author
- cnife
- License
- MIT
- Types
- extension
- Size
- 16.8 KB
- Dependencies
- 0 dependencies · 1 peer
Pi manifest JSON
{
"extensions": [
"./extensions"
]
}Security note
Pi packages can execute code and influence agent behavior. Review the source before installing third-party packages.
README
@cnife/pi-skills-injection
交互式控制哪些技能被注入到 pi 的系统提示词(available_skills),持久化配置。
解决的痛点
pi 启动时会加载所有已安装技能(~/.pi/agent/skills/、.agents/skills/ 等),并把它们的名称、描述、路径以 <available_skills> XML 注入系统提示词。技能一多,系统提示词变长、占用上下文、干扰模型注意力,但用户无法 selectively 关闭某些技能的注入。
本扩展让用户交互式开关技能注入,配置持久化,下一条消息即生效。
安装
pi install npm:@cnife/pi-skills-injection
使用
输入 /skills-injection 打开设置列表(与 /settings、/tools 同款交互):
↑↓导航- 输入字符模糊筛选技能名
Space/Enter切换enabled/disabled(即时保存)Esc关闭
语义:
enabled= 注入到系统提示词disabled= 不注入
列表按技能名字母序排列。切换后下一条消息即生效,无需 /reload。
每次启动会话时,扩展会用英文 notify 列出三类技能(名字字母序 + 数量;空类列表位写 0):
Skills injection
injected (N): a, b
forbidden (0): 0
non-injectable (K): z
injected:会注入系统提示词forbidden:用户在/skills-injection里 disabled 的non-injectable:disableModelInvocation,本身不进系统提示词(TUI 列表不展示)
配置
配置文件:~/.pi/agent/cnife-skills-injection.json
{
"excluded": ["skill-name-1", "skill-name-2"]
}
excluded 是内部存储(disabled 的技能名)。也可手动编辑此文件,下一条消息生效。
技术实现
三个部分:
before_agent_start拦截:读取配置,从event.systemPromptOptions.skills过滤掉被排除的技能,用 pi 导出的formatSkillsForPrompt重新渲染<available_skills>段,正则替换系统提示词中对应的整段。每 turn 读配置文件,所以下一条消息即生效。/skills-injection命令:ctx.ui.custom()+DynamicBorder(border 色,对齐/settings)+SettingsList,enableSearch做名称模糊筛选。切换即时写配置。技能列表与启动通知同源(见下)。session_start通知(与命令共用resolveSkills):- 技能名单以
pi.getCommands()(source === "skill")为准 disableModelInvocation优先用 pi 导出的loadSkills()(Skill.disableModelInvocation)- 仅当某技能不在
loadSkills结果里(如resources_discover额外路径)时,才读该技能文件 frontmatter - 读文件失败时静默按可注入处理
- 按配置分成 injected / forbidden / non-injectable,英文多行
ctx.ui.notify
- 技能名单以
边界情况
| 情况 | 处理 |
|---|---|
| 配置为空 / 无排除项 | before_agent_start 直接 return,不修改系统提示词 |
| 排除项未命中任何实际技能 | 不修改(避免无谓替换) |
| 所有技能都被排除 | formatSkillsForPrompt([]) 返回空串,整段从系统提示词移除 |
disable-model-invocation 技能 |
本就不注入 available_skills;命令列表中也不显示(排除它无意义) |
正则未匹配(如无 read 工具) |
不修改,静默跳过 |
| 技能名冲突 | pi 自身按 name 去重,name 是安全键 |
生效时机
before_agent_start 在每次用户发消息时触发,每次重新读配置文件。所以 /skills-injection 保存后,下一条消息就按新配置注入,比 /reload 更快。重启 pi 后同样读配置文件生效。