Repository navigation
fix(composer): 斜杠命令跨来源重名去重,Enter/Tab 与高亮项保持一致(#84) - #93
Merged
Merged
Conversation
同一个 /名字 只列执行时真正命中的那条,按实际分发顺序先到先得: 内置(渲染端 runSlashCommand 先拦截)> 扩展(SDK prompt() 先查扩展命令) > skill > 模板。会话态与新会话页共用同一规则,扩展之间的 :N 消歧不变。 filterCommands 按 SOURCE_ORDER 输出,与 SlashMenu 分组渲染顺序一致, 键盘按下标取到的就是高亮的那条。
Owner
|
复核过了,同意合并。下面是我独立验证的过程和几条非阻塞建议。 复核结果
顺序证据( 另外两点也核对过:
非阻塞建议(可另开 issue)
加分项测试写法很扎实:真实 按项目惯例 squash 合并。 |
This was referenced Oct 8, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What does this PR do?
Fixes #84
我顺着执行链路看了一下,重名的条目其实只对应一个执行入口:渲染端的
runSlashCommand会先拦下 compact/name/export/settings,剩下的才交给 SDK 的prompt(),而 SDK 又是先查扩展命令,再展开/skill:,最后才套模板。所以在 main 上,点「扩展 /compact」或「模板 /compact」跑的都是内置压缩(胶囊上显示的也是「压缩」),点「模板 /review」「技能 /skill:lint」跑的却是同名扩展。菜单上看着是不同的命令,实际跑的是同一个入口。冲突策略我直接照这个分发顺序来定:同一个
/名字只保留执行时真正会命中的那条,优先级是内置 > 扩展 > skill > 模板,被占名的不再列出。这样内置命令的行为一点没变;被遮住的扩展或模板在桌面端本来就调不到,列出来只会误导人。pi CLI 自己也是这么处理的,交互模式里和内置同名的扩展命令同样不进补全。扩展之间的:N不受影响:两个扩展都注册compact时,它们本来就叫/compact:1、/compact:2,跟内置不冲突,照常列出、照常执行。规则放在slash-commands.ts的mergeCommands里,会话态和新会话页的两份清单都走它,所以两边结果一致。核对「鼠标、Enter、Tab 一致」这一条时,我还碰到一个跟重名无关的问题:
SlashMenu按SOURCE_ORDER(内置/模板/skill/扩展)分组渲染,use-slash-menu里的 Enter/Tab 却是按下标去取filterCommands的结果,而它原来把扩展排在 skill 前面。只要 skill 和扩展同时命中就会错位,比如输入/sy,有skill:sync-docs和扩展sync,高亮停在/sync上按 Enter,选中的却是/skill:sync-docs。现在filterCommands直接按SOURCE_ORDER输出(它的注释原本就是这么写的),两边的下标就对上了。另外顺手把
docs/INDEX.md里slash-commands.ts那一行同步了一下。How was it tested?
回归测试先在没改动的 main 上跑过,确认能复现。
packages/backend/test/slash-commands.test.ts用真实的DefaultResourceLoader和createAgentSession(临时目录,不调用模型),准备了模板 compact/review/plain、skill lint、一个注册 compact/review/skill:lint 的扩展,以及两个都注册 deploy 的扩展。测试断言每个名字只出现一次、标注的来源就是执行时命中的那个、会话态与新会话页清单一致,并对列出的扩展条目调用session.prompt(),确认跑到的是对应 handler;两个扩展都注册 compact 的情况也单独测了。在 main 上这 4 条里有 3 条失败,「会话态与新会话页一致」那条能过,因为两边重复得一模一样。SlashMenu.test.ts里新加的顺序用例在 main 上也是失败的。改完之后都通过了。本地
npm run lint、npm run typecheck、npm run build和npx electron-builder --dir都通过。npm run test是在 Windows 11 上跑的:backend 有 24 条、desktop 有 3 条失败,都跟 POSIX 路径、/tmp、文件权限有关(比如 show-image-tool、permission-tmp-zone、path-target)。我在 main 上也完整跑了一遍,失败集合完全相同,跟这次改动无关,Ubuntu 的 CI 上应该是干净的。我还用 playwright-core 驱动真实的 Electron 应用,在隔离的
PI_CODING_AGENT_DIR和 userData 里放了同样的模板、skill 和扩展(扩展 handler 会写日志并 notify),main 和本分支跑的是同一套脚本。在 main 上,菜单里/compact有三条、/review和/skill:lint各两条;点「模板 /review」和「技能 /skill:lint」执行的都是扩展;点「扩展 /compact」时后端日志里只有PiBackend.compact,扩展 handler 一次都没被调到;输入/sy后高亮/sync按 Enter,得到的是/skill:sync-docs。本分支我用开发构建和electron-builder --dir打出来的 Percho.exe 各跑了一遍:每个名字只剩一条,新会话页和会话内的菜单完全一致;鼠标点/review、Enter 选/deploy:1、↓ + Tab 选/deploy:2、/sy↓ + Enter 选/sync、点/skill:lint,执行的都是对应扩展;/compact只剩内置那条,走的是PiBackend.compact。没覆盖到的部分:模板真正展开后发给模型那一步(本地没配置模型),以及 macOS/Linux 上的手动验证。
如果你更希望被遮住的扩展命令换个别名继续保留可调用,或者像 CLI 那样在扩展诊断里加一条「与内置命令同名,已在面板中跳过」的提示,告诉我一声,我再补上。
Checklist
npm run lintpassesnpm run typecheckpassesnpm run testpasses(新增用例全部通过;Windows 本地另有 27 条在 main 上同样失败的路径类用例,见上)zhandendictionaries(本次没有新增文案)