omp packages

pi-inline-slash0.1.0

Inline skill and prompt-template name completion for Pi, without send-time expansion

paulchess Published 1 month ago ~336 downloads/mo

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.

Did it work for you?

Result

One report per person. A new report replaces your old one.

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 触发又仅限第一逻辑行的开头上下文。

实现采用:

  1. 正式 ctx.ui.addAutocompleteProvider() 包装现有 provider;非行内场景原样委托。
  2. 正式 ctx.ui.setEditorComponent() / CustomEditor 保留原生编辑行为。
  3. 唯一内部 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 补全。未向模型发送请求。

手工验收

  1. 用已加载的技能 / 模板启动,输入整个文本开头 /,确认仍有 /model 等内置命令及扩展命令。
  2. 输入 请用 / 和 第一行 + Ctrl+J + /,确认只有技能 / 模板。
  3. 输入 /co 继续过滤,分别用 Tab、Enter 验证;Enter 会真的发送,请仅用无害文本或离线测试。
  4. 在 请用 /co 检查代码 中把光标移至 /co 后,补全并检查后文与光标。
  5. 输入网址、路径,确认不出现新增技能菜单。用窄窗口重复测试,检查视觉折行不改变边界。
  6. /reload 后重复;如收到 editor 冲突警告,停用另一个 editor 扩展再重载。

核查依据(Pi 0.86.0 安装包)

  • docs/extensions.md、docs/tui.md、docs/packages.md、docs/keybindings.md
  • examples/extensions/github-issue-autocomplete.ts、examples/extensions/modal-editor.ts
  • dist/core/agent-session.js:getCommands() 的 source / 名称格式及 _expandSkillCommand
  • dist/modes/interactive/interactive-mode.js:provider 包装、editor 接入、重载时 UI 重置
  • pi-tui/dist/autocomplete.js:原生候选匹配与插入
  • pi-tui/dist/components/editor.js:逻辑行、触发限制、Enter slash 前缀补全后发送