卷七 02|为什么 slash commands / prompt commands 不是普通快捷方式¶
导读¶
- 所属卷:卷七:命令、工作流与产品层整合
- 卷内位置:02 / 08
- 上一篇:卷七 01|为什么 Claude Code 需要控制层
- 下一篇:卷七 03|命令入口是怎样接进 runtime 的
第 01 篇已经先把“控制层一定会出现”立住了。
第 02 篇接着要回答的,是控制层最先暴露给用户的一面:
为什么 slash commands / prompt commands 不是普通快捷方式,而是 Claude Code 的正式用户入口?
这篇只负责把 command 立成入口层对象,不展开完整接入主链。
这篇要回答的问题¶
卷七第一篇已经把大问题立住:Claude Code 在平台层和协作层之后,还必须继续长出控制层。
那控制层最先暴露给用户的一面是什么?
不是 workflow 清单,也不是产品包装,而是:
用户通过什么正式入口,把当前意图送进 runtime。
所以这一篇要回答的不是“命令有哪些”,而是另一个更硬的问题:
为什么 slash commands / prompt commands 不是普通快捷方式,而是 Claude Code 的正式用户入口。
这篇不展开什么¶
按写作卡片,这篇必须守住边界:
- 不展开完整的命令接入主链细节;
- 不提前写 interface / frontmatter 正文;
- 不展开 workflow control layer。
这篇只把一件事说死:command 属于入口层,不属于交互糖衣层。
旧文与源码锚点¶
旧文素材锚点¶
docs/guidebook/volume-1/20-processpromptslashcommand.mddocs/guidebook/volume-1/31-prompt-as-instruction-layer.md
源码锚点¶
cc/src/commands/cc/src/prompt/
主证据链¶
slash command / prompt command 并不是对已有功能的 UI 简写 → 它们会把用户意图组织成系统可识别、可展开、可注入的正式输入 → 因而它们属于控制层中的用户入口,而不是普通快捷方式。
mermaid 主图:用户输入 → command / prompt command → runtime 入口图¶
flowchart TD
U[用户输入意图] --> A{普通自然语言
还是正式 command}
A --> B[/slash command]
A --> C[prompt command / skill command]
B --> D[命令解析与匹配]
C --> E[prompt 展开与说明注入]
D --> F[进入 runtime 入口面]
E --> F
F --> G[改变当前查询、上下文或后续行为]
这张图要表达的重点很简单:
command 的意义不在“更快输入”,而在“让某类意图以正式入口身份进入系统”。
先给结论¶
结论一:如果 command 只是快捷方式,它就不该改变 runtime 入口结构¶
普通快捷方式通常只是把:
- 一个长动作,缩成短输入;
- 一个常见操作,变成更省事的按钮;
- 一个既有流程,包成更顺手的壳。
也就是说,快捷方式改善的是交互效率,不改变系统对输入的解释层级。
但 Claude Code 里的 slash command / prompt command 明显不是这个地位。
从卷一旧稿能看到,processPromptSlashCommand(...) 干的不是“把短指令替换成长文本”,而是:
- 找到被调用的 command;
- 确认它的类型与入口语义;
- 调用
getPromptForCommand(...)之类的展开逻辑; - 生成 metadata message、main content message、attachment messages、command permissions attachment 等结构化消息;
- 把 hooks、allowedTools、model、effort 这类运行信息一并带出去。
只要一条 command 会做到这里,它就已经不是快捷方式了。它已经在定义:
用户的这次输入,应以哪种正式入口语义进入 runtime。
结论二:slash / prompt command 的真正作用,是把“输入”变成“可执行的入口声明”¶
这一点最容易被低估。
用户看见 /something,很容易以为它只是:
- 少打几句话;
- 调用一个预设动作;
- 省一点提示词成本。
但系统视角不是这样。
Claude Code 这里的 command 更像一个入口声明:
- 这是哪一类输入;
- 它是否应被当成正式 command 处理;
- 它应展开成什么运行说明;
- 它允许附带什么额外工具或模型设定;
- 它会不会把当前消息流和后续执行方式一起改写。
所以 command 不只是“替用户少打几句”,而是在告诉 runtime:
请按这条入口语义理解我的当前意图。
结论三:prompt command 之所以重要,不是因为它更像 prompt,而是因为它已经是正式入口对象¶
卷一第 20 篇最关键的收获,不是某个函数名,而是一个判断:
inline skill / prompt command 的产物不是一段文本,而是一组结构化消息与副作用。
这意味着 prompt command 不是“把一段模板文字塞进上下文”。
它做的事情更像:
- 以 command 身份被发现;
- 以 command 身份被展开;
- 以 command 身份带着 metadata、权限、附件、模型信息进入当前消息流。
只要它的运行语义是这样,它就已经和“普通宏替换”不在同一个层级上了。
第一部分:为什么“快捷方式心智”会误解 Claude Code 的 command¶
1. 快捷方式只压缩输入,command 则重写输入的系统身份¶
快捷方式的核心是“更省事”,比如:
- 快速打开一个菜单;
- 少打一段固定文本;
- 把常见操作绑定成别名。
但 Claude Code 的 command 更深一层:
- 它不是只让用户少打字;
- 它在决定这段输入会被当成什么正式对象理解。
用户打一段自然语言,系统可能把它当普通请求继续推理;
用户打一条 /command,系统则会进入另一个更明确的入口分支。
这就不是输入长度问题,而是输入身份问题。
2. 快捷方式通常不自带运行语义,command 则会带运行副作用¶
从卷一第 20 篇能回收到几个很硬的事实:
- command 会生成专门的 metadata;
- command 会把正文展开成 meta content message;
- command 还能发现 attachment message;
- command 会附带
command_permissions这样的结构化运行信息; - 某些情况下还会触发 hooks 注册、invoked skill 记录等状态行为。
如果一个输入对象会连带这些副作用,它就已经不是普通快捷方式。
快捷方式一般不会决定:
- 这次调用允许哪些工具;
- 当前会话要登记哪次 skill 调用;
- 渲染层应把这次输入展示成什么命令事件。
而 command 会。
3. 所以“命令 = 交互糖衣”在 Claude Code 里是不成立的¶
Claude Code 里的命令之所以值得单独成卷,不是因为它有很多,而是因为它承担的是入口责任。
这层责任至少包括:
- 让某种输入被正式识别;
- 让某种输入被稳定展开;
- 让某种输入在 runtime 里带着明确的后续语义继续往前走。
只要承担的是这些责任,它就属于控制层入口,而不是糖衣层。
第二部分:prompt 之所以和 command 紧挨在一起,是因为两者都在组织“用户意图怎样被讲给 runtime”¶
卷一第 31 篇虽然主看的是 AgentTool 的 prompt.ts,但它给卷七很重要的一条启发是:
prompt 在 Claude Code 里,常常不是装饰文案,而是模型如何理解和使用某个运行对象的正式说明层。
这条判断放到本篇里特别重要。
因为它说明 Claude Code 里的 prompt,不是那种“说得更像人话”的附属层,而是:
- 在告诉模型什么时候该用某个对象;
- 在告诉模型哪些边界该遵守;
- 在告诉模型什么场景不要误用某种能力。
于是 slash command / prompt command 就和 prompt 层自然接上了:
- command 提供用户入口;
- prompt 负责把这类入口的语义讲清给模型或运行时;
- 两者共同完成“用户意图如何被正式引导进 runtime”的第一段工作。
所以这不是快捷入口加说明文案,而是入口层和说明层的配合。
第三部分:为什么 command 必须被叫作“正式用户入口”¶
1. 它有明确可识别的入口身份¶
系统会去找 command、匹配 command、判断 command 类型。
这说明它不是普通聊天内容里的偶然字符串,而是被 Claude Code 承认的正式输入类型。
2. 它有明确的展开路径¶
不论是 slash command 还是 prompt command,都不是“看一眼名称就完事”,而是会进入某条正式展开逻辑。
这条展开逻辑会决定:
- 返回哪些消息;
- 挂上哪些附加信息;
- 使用什么说明与权限边界。
这已经是典型入口对象的待遇,不是简写别名的待遇。
3. 它有明确的运行语义落点¶
command 的结果不会停在“解析完成”。
它最终要么进入当前消息流,要么影响当前 query 的后续装配,要么改变某些工具、模型、skill 的使用边界。
这说明 command 不只是输入层,它还是控制层对 runtime 的第一跳。
第四部分:为什么这篇不该把 command 写成命令大全¶
卷七这里最容易跑偏成命令说明书。
但如果这样写,就会把最值钱的判断写丢:
- command 不是因为多,所以重要;
- command 不是因为方便,所以重要;
- command 是因为它定义了用户怎样进入 Claude Code,所以重要。
也正因为如此,本篇必须拒绝三种写法:
/xxx、/yyy、/zzz的列举文;- “有哪些提高效率的小技巧”式教程文;
- “Claude Code 有很多好用命令”式产品文。
卷七这一篇要保住的不是命令数量,而是入口层地位。
这篇收住什么¶
到这里,这篇只把一个判断压稳:slash command / prompt command 不属于交互糖衣,而属于控制层中的正式用户入口。至于它们怎样从入口位置接进 runtime 主链,要留给第 03 篇单独展开。
最后收一下¶
为什么 slash commands / prompt commands 不是普通快捷方式?
因为快捷方式只改善输入效率,不改变输入的系统身份;而 Claude Code 里的 command 会:
- 被正式发现与匹配;
- 被正式展开成结构化消息;
- 附带 metadata、permission、attachment、model 等运行信息;
- 把用户当前意图以特定入口语义送进 runtime。
再加上 cc/src/prompt/ 所体现出来的使用说明层逻辑,可以更清楚地看到:Claude Code 不是把 command 当成交互糖衣,而是把它当成控制层中的正式用户入口对象。
所以本篇最稳的结论是:
slash commands / prompt commands 的本质,不是给已有功能包一层快捷外壳,而是把用户意图转换成 Claude Code 可识别、可展开、可继续装配的正式入口声明。