{"_id":"@cnife/pi-skills-injection","_rev":"3-5273be6e32c2675cc5bb591997f9c9a3","name":"@cnife/pi-skills-injection","dist-tags":{"latest":"0.1.2"},"versions":{"0.1.0":{"name":"@cnife/pi-skills-injection","version":"0.1.0","keywords":["pi-package"],"author":{"name":"CNife","email":"CNife@vip.qq.com"},"license":"MIT","_id":"@cnife/pi-skills-injection@0.1.0","maintainers":[{"name":"cnife","email":"CNife@vip.qq.com"}],"homepage":"https://github.com/CNife/pi-extensions#readme","bugs":{"url":"https://github.com/CNife/pi-extensions/issues"},"pi":{"extensions":["./extensions"]},"dist":{"shasum":"1f80a2014839875ab5e7090bd4fb9752b01a2549","tarball":"https://registry.npmjs.org/@cnife/pi-skills-injection/-/pi-skills-injection-0.1.0.tgz","fileCount":4,"integrity":"sha512-QwI5NA97F9Tvt1+oi2XFPcl+gLo5IHcrzfAD5DqAI46i3NOSc/kWsbnUwmp7X+5V7yn7UYl+pztHMvirPSI9ug==","signatures":[{"sig":"MEUCIQDS2WwGTYhOs5XPIDG5wUGOa4I9pkP0cHXMih/GAhxE/wIgJgRsiw+Hzg4zH6gq3yN+EDi7sxKjBJU7PdrP6qTq+Do=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":16603},"gitHead":"94aed5fc7111b414cc96764f78dab3824bbdca0e","private":false,"_npmUser":{"name":"cnife","email":"CNife@vip.qq.com"},"repository":{"url":"git+https://github.com/CNife/pi-extensions.git","type":"git"},"_npmVersion":"12.0.1","description":"交互式控制哪些技能被注入到 pi 的系统提示词，持久化配置","directories":{},"_nodeVersion":"26.4.0","publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"peerDependencies":{"@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-skills-injection_0.1.0_1784811643472_0.23756955124337953","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@cnife/pi-skills-injection","version":"0.1.1","keywords":["pi-package"],"author":{"name":"CNife","email":"CNife@vip.qq.com"},"license":"MIT","_id":"@cnife/pi-skills-injection@0.1.1","maintainers":[{"name":"cnife","email":"CNife@vip.qq.com"}],"homepage":"https://github.com/CNife/pi-extensions#readme","bugs":{"url":"https://github.com/CNife/pi-extensions/issues"},"pi":{"extensions":["./extensions"]},"dist":{"shasum":"2055f0dce4e1e13492c78ec3e4881a0aae575471","tarball":"https://registry.npmjs.org/@cnife/pi-skills-injection/-/pi-skills-injection-0.1.1.tgz","fileCount":4,"integrity":"sha512-xZsxEoO+4PG+OBvRMAu9It/LnFXAdVftW+ZnXy8d500JzIyOQAgpHWD/DaJY7PW9a2YSMVRWpyh29Vc3SkXcSw==","signatures":[{"sig":"MEYCIQCEhZgp13qhId2LjAGtxuzA6uMdfmSl2o0JPuLctxaWlwIhANo3UapLvWBBI3QQrbKd16Hkf9gPq6ZzNkYiuEBhF+1b","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@cnife%2fpi-skills-injection@0.1.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":13720},"gitHead":"60dbced72f27af9ac72f9aacb809eff1d4a6c509","private":false,"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:895e0042-4eb5-442b-8b61-6c055ceb894c"}},"repository":{"url":"git+https://github.com/CNife/pi-extensions.git","type":"git"},"_npmVersion":"11.16.0","description":"交互式控制哪些技能被注入到 pi 的系统提示词，持久化配置","directories":{},"_nodeVersion":"24.18.0","publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"peerDependencies":{"@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-skills-injection_0.1.1_1784814891115_0.6016508867646864","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@cnife/pi-skills-injection","version":"0.1.2","private":false,"keywords":["pi-package"],"description":"交互式控制哪些技能被注入到 pi 的系统提示词，持久化配置","homepage":"https://github.com/CNife/pi-extensions#readme","bugs":{"url":"https://github.com/CNife/pi-extensions/issues"},"license":"MIT","author":{"name":"CNife","email":"CNife@vip.qq.com"},"repository":{"type":"git","url":"git+https://github.com/CNife/pi-extensions.git"},"publishConfig":{"access":"public","provenance":true},"pi":{"extensions":["./extensions"]},"peerDependencies":{"@earendil-works/pi-coding-agent":"*"},"gitHead":"26493762014f3a1bad39f5c3cb52fb07e3e6648b","_id":"@cnife/pi-skills-injection@0.1.2","_nodeVersion":"24.18.0","_npmVersion":"11.16.0","dist":{"integrity":"sha512-QoIHsHF7O36j1DdOxEpxOn0dBqmLaF4FY5miaPV+7pwhn16jihk1qnrnPoMsAjaT+7j849LqF3wkLDqkifUTMQ==","shasum":"48fe2b0077773fe684a9b9b9853086f87c76b8e5","tarball":"https://registry.npmjs.org/@cnife/pi-skills-injection/-/pi-skills-injection-0.1.2.tgz","fileCount":4,"unpackedSize":17154,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@cnife%2fpi-skills-injection@0.1.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDGSc2oWI3sQ1OkQ9HWpEa+2AOmdxoJaFS7jO/TJ0fegwIhANDvMib0q8YJ9VmspV+LsYBoAGeKsEnfKfq8KICxKrLC"}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:895e0042-4eb5-442b-8b61-6c055ceb894c"}},"directories":{},"maintainers":[{"name":"cnife","email":"CNife@vip.qq.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/pi-skills-injection_0.1.2_1785072426988_0.08397965320124601"},"_hasShrinkwrap":false}},"time":{"created":"2026-07-23T13:00:43.282Z","modified":"2026-07-26T13:27:07.515Z","0.1.0":"2026-07-23T13:00:43.605Z","0.1.1":"2026-07-23T13:54:51.310Z","0.1.2":"2026-07-26T13:27:07.150Z"},"bugs":{"url":"https://github.com/CNife/pi-extensions/issues"},"author":{"name":"CNife","email":"CNife@vip.qq.com"},"license":"MIT","homepage":"https://github.com/CNife/pi-extensions#readme","keywords":["pi-package"],"repository":{"type":"git","url":"git+https://github.com/CNife/pi-extensions.git"},"description":"交互式控制哪些技能被注入到 pi 的系统提示词，持久化配置","maintainers":[{"name":"cnife","email":"CNife@vip.qq.com"}],"readme":"# @cnife/pi-skills-injection\n\n交互式控制哪些技能被注入到 pi 的系统提示词（`available_skills`），持久化配置。\n\n## 解决的痛点\n\npi 启动时会加载所有已安装技能（`~/.pi/agent/skills/`、`.agents/skills/` 等），并把它们的名称、描述、路径以 `<available_skills>` XML 注入系统提示词。技能一多，系统提示词变长、占用上下文、干扰模型注意力，但用户无法 selectively 关闭某些技能的注入。\n\n本扩展让用户交互式开关技能注入，配置持久化，下一条消息即生效。\n\n## 安装\n\n```bash\npi install npm:@cnife/pi-skills-injection\n```\n\n## 使用\n\n输入 `/skills-injection` 打开设置列表（与 `/settings`、`/tools` 同款交互）：\n\n- `↑↓` 导航\n- 输入字符模糊筛选技能名\n- `Space` / `Enter` 切换 `enabled` / `disabled`（即时保存）\n- `Esc` 关闭\n\n语义：\n\n- `enabled` = 注入到系统提示词\n- `disabled` = 不注入\n\n列表按技能名字母序排列。切换后下一条消息即生效，无需 `/reload`。\n\n每次启动会话时，扩展会用英文 notify 列出三类技能（名字字母序 + 数量；空类列表位写 `0`）：\n\n```text\nSkills injection\ninjected (N): a, b\nforbidden (0): 0\nnon-injectable (K): z\n```\n\n- `injected`：会注入系统提示词\n- `forbidden`：用户在 `/skills-injection` 里 disabled 的\n- `non-injectable`：`disableModelInvocation`，本身不进系统提示词（TUI 列表不展示）\n\n## 配置\n\n配置文件：`~/.pi/agent/cnife-skills-injection.json`\n\n```json\n{\n  \"excluded\": [\"skill-name-1\", \"skill-name-2\"]\n}\n```\n\n`excluded` 是内部存储（disabled 的技能名）。也可手动编辑此文件，下一条消息生效。\n\n## 技术实现\n\n三个部分：\n\n1. **`before_agent_start` 拦截**：读取配置，从 `event.systemPromptOptions.skills` 过滤掉被排除的技能，用 pi 导出的 `formatSkillsForPrompt` 重新渲染 `<available_skills>` 段，正则替换系统提示词中对应的整段。每 turn 读配置文件，所以下一条消息即生效。\n\n2. **`/skills-injection` 命令**：`ctx.ui.custom()` + `DynamicBorder`（border 色，对齐 `/settings`）+ `SettingsList`，`enableSearch` 做名称模糊筛选。切换即时写配置。技能列表与启动通知同源（见下）。\n\n3. **`session_start` 通知**（与命令共用 `resolveSkills`）：\n   - 技能名单以 `pi.getCommands()`（`source === \"skill\"`）为准\n   - `disableModelInvocation` **优先**用 pi 导出的 `loadSkills()`（`Skill.disableModelInvocation`）\n   - 仅当某技能不在 `loadSkills` 结果里（如 `resources_discover` 额外路径）时，才读该技能文件 frontmatter\n   - 读文件失败时静默按可注入处理\n   - 按配置分成 injected / forbidden / non-injectable，英文多行 `ctx.ui.notify`\n\n### 边界情况\n\n| 情况 | 处理 |\n|------|------|\n| 配置为空 / 无排除项 | `before_agent_start` 直接 return，不修改系统提示词 |\n| 排除项未命中任何实际技能 | 不修改（避免无谓替换） |\n| 所有技能都被排除 | `formatSkillsForPrompt([])` 返回空串，整段从系统提示词移除 |\n| `disable-model-invocation` 技能 | 本就不注入 `available_skills`；命令列表中也不显示（排除它无意义） |\n| 正则未匹配（如无 `read` 工具） | 不修改，静默跳过 |\n| 技能名冲突 | pi 自身按 name 去重，name 是安全键 |\n\n### 生效时机\n\n`before_agent_start` 在每次用户发消息时触发，每次重新读配置文件。所以 `/skills-injection` 保存后，**下一条消息**就按新配置注入，比 `/reload` 更快。重启 pi 后同样读配置文件生效。\n","readmeFilename":"README.md"}