pi-inline-slash0.1.0
Inline skill and prompt-template name completion for Pi, without send-time expansion
Untested on omp
This is a pi package. No one has reported whether it works on omp yet. If you try it, add your result below.
Reports 0
No reports yet.
Readme
pi-inline-slash
为 Pi 输入框增加行内技能 / 提示词模板名称补全,复用原生菜单、模糊匹配和按键行为。只补全名称,不负责执行或展开。
请用 /co│ 检查代码
↓ 选择 code-review,按 Tab
请用 /skill:code-review│ 检查代码
│ 表示光标,不会插入文本。
本地加载
已验证 @earendil-works/pi-coding-agent / pi-tui 0.86.0。需要交互式 TUI;RPC、print、JSON 模式不启用。
无需构建或全局安装,在本仓库运行:
pi -e ./src/index.ts
在其他工作目录运行(路径替换为你的 checkout):
pi -e /absolute/path/to/pi-inline-slash/src/index.ts
若要排除其他扩展干扰:
pi --no-extensions -e /absolute/path/to/pi-inline-slash/src/index.ts
可选:在希望启用插件的项目目录执行项目级安装:
pi install -l /absolute/path/to/pi-inline-slash
# 取消该项目的安装
pi remove -l /absolute/path/to/pi-inline-slash
这只登记本地路径,不复制源码;项目资源须获得 Pi 的项目信任。也可将绝对入口路径合并进该项目 .pi/settings.json 的 extensions 数组(不要覆盖其他配置)。首次启用后重启 Pi;修改源码后可 /reload。同一个插件只选择一种加载方式。
本仓库未修改 Pi 安装文件。发布目标为官方 npm registry,包带有 Pi 市场识别的 pi-package 关键词。
npm 发布
Pi 的包市场展示带 pi-package 关键词的 npm 包,不需要另行上传扩展文件。发布成功并被市场索引后,可使用:
pi install npm:pi-inline-slash
维护者发布步骤(需要 npm 发布权限,可能要求二次验证):
npm run check
npm pack --dry-run
npm publish --registry=https://registry.npmjs.org/ --access public
npm 发布成功不代表市场已即时完成索引;应分别核验 npm 包与 https://pi.dev/packages 的展示。
行为
| 位置 / 输入 | 行为 |
|---|---|
整个文本从 / 开始 |
原菜单不变,保留内置命令、扩展命令、模板、技能及原生参数补全 |
请用 /、请用 /co |
只显示已加载技能和模板 |
第二行或后续真实换行后的 / |
行内菜单,不是开头菜单 |
开头空格后的 / |
行内菜单 |
https://、src/file、正文/co |
不触发新增行内菜单;不禁用原生路径补全 |
| 没有匹配项 | 不显示行内菜单,也不退回无关命令或文件候选 |
- 仅空格(U+0020)和真实换行作为新增触发边界;不按屏幕折行、视觉列号或其他空白判断。原生编辑器自身可能将粘贴的 Tab 归一化为空格,插件不改变此行为。
- 候选来自
pi.getCommands(),严格过滤source === "skill" || source === "prompt",不靠名称猜来源。API 已提供skill:名称,不会重复添加前缀。 - 与原生相同的
fuzzyFilter;/co可匹配skill:code-review,也支持/skill:co。候选读取当前注册表,重载后不会使用旧快照。 - 只替换当前光标前的
/关键词;光标后的全部字符保持原样,即使光标位于某个单词中间。光标放在插入的名称后。行内补全不额外插入空格,避免重复或改变正文。 - Tab 补全、不发送;Enter 在菜单中补全并立即发送。上下键、Escape、撤销和菜单渲染均由 Pi 处理。无菜单时按 Tab,沿用原生显式补全行为(只有一个候选时可立即插入)。不改键位,不实现两次 Enter 发送。
- 不解析 Markdown,不单独跳过反引号或代码块;满足相同文本边界时可弹菜单。
重要限制:补全不等于技能 / 模板调用
当前 Pi 的 _expandSkillCommand 仅对 text.startsWith('/skill:') 自动展开技能。
行内 /skill:名称 只是普通文本,不保证触发技能。 模型可能自行识别并读取,但这不是插件的保证。行内 /模板名 同样不会由本插件展开。
插件不会:
- 注册
input或其他发送期消息改写逻辑; - 读取、附加
SKILL.md正文或加载技能; - 展开模板或修改系统提示词;
- 给输入保存隐藏身份标记。
手动输入和菜单补全产生的相同字符串没有区别。整个文本开头命令的 Pi 原生处理不受插件改变;其他扩展自行实现的发送处理也不由本插件控制。
API 兼容性与其他 editor 扩展
当前版本不能仅靠公开 autocomplete API 完成自动触发:Pi 0.86.0 的 Editor.setAutocompleteTriggerCharacters() 明确过滤 /,原生自动 slash 触发又仅限第一逻辑行的开头上下文。
实现采用:
- 正式
ctx.ui.addAutocompleteProvider()包装现有 provider;非行内场景原样委托。 - 正式
ctx.ui.setEditorComponent()/CustomEditor保留原生编辑行为。 - 唯一内部 API 兼容桥:
src/editor.ts调用继承的tryTriggerAutocomplete(),仅请求原生菜单。不会模拟 Tab(避免单候选自动插入)、拦截发送或修改全局类 / 原型。
这不是完全稳定的公开 API 实现。升级 Pi 后应重新跑测试;内部方法缺失时插件提示错误并禁用,不静默降级。运行时存在性检查不能检测所有上游行为变化。
不支持与其他替换输入框的扩展自动组合。 若加载时已有自定义 editor,本插件警告并禁用,绝不覆盖。若另一个扩展在本插件之后替换 editor,则它可能使自动触发失效,Pi 没有 editor 变更通知 API 可可靠检测;请只启用一个 editor 扩展。其他 autocomplete provider 可按 Pi 包装链共存,但同一触发语法仍可能有优先级冲突。
开发与验证
开发测试使用 Node.js >= 22.18(原生 TypeScript 类型擦除),实际验证环境为 Node 24.14.0。
npm install --ignore-scripts
npm run check
运行插件本身由 Pi 提供核心依赖,无需事先安装本仓库开发依赖。开发依赖固定为已验证版本,Pi 核心包按官方包约定声明为 peer dependencies。
测试覆盖:
- 开头菜单委托、真实换行 / 空格边界、URL / 路径 / Tab / 非断行空格、屏幕折行;
- 技能 / 模板来源过滤、原生模糊匹配、无匹配、动态注册表、取消请求;
- 使用真实 Pi editor / provider / SelectList 的按键集成测试:过滤、Tab、Enter 一次发送、菜单导航、Escape、撤销、中文 / 多行 / 光标后文本保留;
- 生命周期注册范围、非 TUI 模式、已有 editor 冲突、API 缺失提示。
测试仅替代终端输出接口和扩展宿主,不调用模型。实现期间另用隔离 PI_CODING_AGENT_DIR、离线模式和临时技能 / 模板,在真实 bundled Pi CLI 的 PTY 中验证了插件加载、空格后及换行后菜单、Tab 补全。未向模型发送请求。
手工验收
- 用已加载的技能 / 模板启动,输入整个文本开头
/,确认仍有/model等内置命令及扩展命令。 - 输入
请用 /和第一行+ Ctrl+J +/,确认只有技能 / 模板。 - 输入
/co继续过滤,分别用 Tab、Enter 验证;Enter 会真的发送,请仅用无害文本或离线测试。 - 在
请用 /co 检查代码中把光标移至/co后,补全并检查后文与光标。 - 输入网址、路径,确认不出现新增技能菜单。用窄窗口重复测试,检查视觉折行不改变边界。
/reload后重复;如收到 editor 冲突警告,停用另一个 editor 扩展再重载。
核查依据(Pi 0.86.0 安装包)
docs/extensions.md、docs/tui.md、docs/packages.md、docs/keybindings.mdexamples/extensions/github-issue-autocomplete.ts、examples/extensions/modal-editor.tsdist/core/agent-session.js:getCommands()的source/ 名称格式及_expandSkillCommanddist/modes/interactive/interactive-mode.js:provider 包装、editor 接入、重载时 UI 重置pi-tui/dist/autocomplete.js:原生候选匹配与插入pi-tui/dist/components/editor.js:逻辑行、触发限制、Enter slash 前缀补全后发送