跳转至

卷七 02|为什么 slash commands / prompt commands 不是普通快捷方式

导读

第 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.md
  • docs/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,所以重要。

也正因为如此,本篇必须拒绝三种写法:

  1. /xxx/yyy/zzz 的列举文;
  2. “有哪些提高效率的小技巧”式教程文;
  3. “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 可识别、可展开、可继续装配的正式入口声明。