docs/design/slash-command/compare.md
本方案以以下原则为唯一前提:
这里的“对齐”指用户可直接感知的能力,包括:
本次重构不是补几个字段,也不是把现有 SlashCommand 小修小补,而是把 command 模块从“interactive UI 附属能力”升级为“跨 interactive / ACP / non-interactive / model 的统一命令平台”。
Qwen 现有 command 系统的问题,不是完全没有能力,而是:
因此新的方案必须同时解决四件事:
允许不同:
不允许不同:
如果出现取舍,优先级应为:
不建议机械复制 Claude 的执行实现。
Qwen 当前统一结果模型仍然值得保留,因为它天然适合:
但它必须被升级为能够承载 Claude 级别的 command 能力,而不是继续作为简化版 UI 命令框架存在。
新的 command 模型至少要把以下维度拆开:
Qwen 需要显式支持三类命令:
promptlocallocal-jsxQwen 的 command schema 从第一阶段开始就必须覆盖以下来源:
这里不能再退回到“先只支持当前已有那几类”。
至少补齐以下字段:
argumentHintwhenToUseexamplessourceLabeluserFacingNamealiasimmediateisSensitiveuserInvocablemodelInvocablesupportedModesrequiresUi至少补齐以下体验:
建议引入统一 CommandDescriptor,作为所有命令的注册格式。
它至少包含四部分:
identitymetadatacapabilitieshandleridentityidnamealtNamescanonicalPathmetadatadescriptionargumentHintwhenToUseexamplesgroupsourcesourceLabeluserFacingNamehiddencapabilitiestype: prompt | local | local-jsxsupportedModes: interactive | acp | non_interactiverequiresUisupportsDialogsupportsStreamingsupportsToolInvocationsupportsConfirmationremoteSafereadOnlyimmediateisSensitiveuserInvocablemodelInvocablehandlerresolveArgs()execute()completion()fallback()prompt用于:
特点:
local用于:
特点:
local-jsx用于:
特点:
这是给用户看的来源模型,必须和 Claude Code 的心智尽量一致:
builtin-commandbundled-skillskill-dir-commandworkflow-commandplugin-commandplugin-skilldynamic-skillbuiltin-plugin-skillmcp-promptmcp-skill这组字段将直接用于:
为了不被外部命名绑死,内部再补一层实现字段:
providerTypeartifactTypeactivationModebuiltinProvidedoriginPathnamespace这样可以做到:
统一按稳定 id 管理,展示名和输入名分离:
id:稳定唯一标识name:输入主名userFacingName:帮助/补全展示名冲突优先级建议:
CommandRegistry职责:
必须支持的 provider:
BuiltinCommandLoaderBundledSkillLoaderFileCommandLoaderMcpPromptLoaderWorkflowCommandLoaderPluginCommandLoaderPluginSkillLoaderDynamicSkillProviderBuiltinPluginSkillLoader即便部分 provider 首期未完全落地,schema 和 API 也必须先支持。
CommandResolver职责:
CommandExecutor职责:
prompt | local | local-jsxModeAdapter必须拆出三种 adapter:
InteractiveModeAdapterAcpModeAdapterNonInteractiveModeAdapter这样三种模式才能共用同一套 command registry 和 executor,而不是各自硬编码。
这是 ACP 和 non-interactive 真正可用的关键。
凡是当前本质为“打开 dialog”的命令,都必须改造成:
/model/permissions/mcp/resume/hooks/extensions/agents/approval-mode/model/model/model show/model list/model set <id>/permissions/permissions/permissions show/permissions set <mode>/permissions allow <tool>/permissions deny <tool>/mcp/mcp/mcp list/mcp show <server>/mcp enable <server>/mcp disable <server>这是重构里的 P0,不是后补能力。
建立统一的 Model-Invocable Prompt Command Registry,把以下资产合并为一个模型可调用视图:
必须新增:
userInvocablemodelInvocableallowedToolswhenToUseargSchema 或最小参数描述contextMode: inline | forkagenteffortSkillTool 的关系重构后不应再由 SkillTool 只消费狭义 skills。
应改成:
CommandRegistry.getModelInvocablePromptCommands() 产出统一视图SkillTool 或未来统一 command tool 消费该视图这样 Qwen 才能在体验上接近 Claude 对 /review、/commit、/openspec-apply 这类能力的处理方式。
补全项至少要展示:
labeldescriptionargumentHintsourceBadgemodeBadgesaliasHitrecentlyUsedScore排序至少考虑:
必须补齐:
第一阶段先对齐输入体验;是否引入更强的“内嵌命令执行语义”可在后续迭代。
Help 不再是平铺列表,而是完整命令目录。
至少分组为:
每条命令至少展示:
旧方案:
新方案:
submit_promptmessagestream_messagestooldialogload_historyconfirm_actionconfirm_shell_commandssubmit_promptmessagestream_messagestoolconfirm_actionconfirm_shell_commandsdialog fallbacksubmit_promptmessagestream_messagestoolconfirm_actionconfirm_shell_commandsdialog fallback / structured failure必须至少包含:
namedescriptionargumentHintsourceexamplessupportedModesinteractiveOnlysubcommandsmodelInvocable重构后以下内容必须由同一个 registry 视图导出:
这是为了解决当前“实现、帮助、文档三套命令面不一致”的问题。
交付:
CommandDescriptoruserInvocable / modelInvocableCommandRegistryCommandResolverCommandExecutorModeAdaptergetModelInvocablePromptCommands()交付:
/model/permissions/mcp/resume/hooks/extensions/agents/approval-mode这些命令都必须完成“interactive shell + local 子命令”重构。
交付:
SkillTool 接入统一 registry 视图交付:
完成后至少满足:
这次重构的本质不是“给现有 SlashCommand 多加几个字段”,而是:
如果必须二选一:
本方案明确选择后者。