Claude Code 学习站

自定义命令与 Skills

考点 3.2 · Commands & skills · 所属域权重 20% · Claude Code 配置与工作流

本页目录5

这个考点是什么

这个考点考的是 Claude Code 里两种「让 Claude 按你定义的方式做事」的机制:自定义斜杠命令(custom slash commands)和 skills。

官方文档口径是二者已经合并——一个放在 .claude/commands/deploy.md 的文件和一个放在 .claude/skills/deploy/SKILL.md 的文件,都会创建 /deploy 命令,行为等价,命令名来自文件名或目录名。

理解这一点是这个考点的地基:不要把 commands 和 skills 当成两套并列的知识去记,它们的 frontmatter 字段(如 $ARGUMENTSallowed-toolsdisable-model-invocation)和触发方式是共用的。

第二层是作用域(scope)。项目级放在 .claude/,随仓库签入版本库,团队共享;个人级放在 ~/.claude/,跨项目生效但只对你自己可见。

这条边界和 subagents(.claude/agents/ vs ~/.claude/agents/)、MCP 服务器配置的 local/project/user 三级是同一类分层逻辑的不同实例,但字段名、默认值、冲突时谁优先各不相同,容易在选项里被互相替换成干扰项。

第三层是触发方式与执行位置的区分:

  • 命令/skill 默认可以被 Claude 根据 description 自动判断加载,也可以用 disable-model-invocation: true 限定为只能用户手动 /name 触发;

  • context: fork 这类 frontmatter 会让 skill 的正文变成一个隔离子代理(subagent)的 prompt,不携带主对话历史,只把最终结果带回主会话——这与 skill 默认在主上下文内联执行是两种截然不同的执行模型。

为什么考

命题人常见的出题角度有三类:

  • 一是把「commands 和 skills 已合并」这条容易被想当然按旧知识分开记的事实,做成判断题或多选的其中一项;

  • 二是围绕 frontmatter 字段的默认值出反直觉陷阱,例如 $ARGUMENTS 未在正文出现时参数并不会丢失,而是被追加为 ARGUMENTS: <value>,以及 tools/allowed-tools 省略时是「继承/放开」而非「禁止」;

  • 三是拿 skill 和 subagent 的执行模型做对照——skill 默认在主上下文里跑、由模型自动判断触发,context: fork 才会启动独立上下文的子代理,这条边界经常被出成「以为 skill 天然就是隔离执行」的错误选项。

多选题里还会混入个人/项目作用域谁对谁公开、谁进版本库的选项做干扰。

核心辨析

  1. 1

    commands 与 skills 是同一机制的两种落地位置,不是两套体系

    .claude/commands/x.md.claude/skills/x/SKILL.md 都产生 /x 命令,共享 $ARGUMENTSallowed-tools 等 frontmatter 语义。遇到选项把二者描述成「需要分别配置触发规则」或「行为不同」,基本可判定为错。

  2. 2

    作用域优先级要按类型分别记,不能混用同一条规则套所有机制

    commands/skills 的项目级(.claude/,签入仓库、团队共享)vs 个人级(~/.claude/,跨项目、仅自己可见)是「共享范围」的区分;subagents 同名冲突时是「项目定义覆盖用户定义」的优先级区分;MCP 的 local/project/user 三级则精度更细、且 local 默认写入 ~/.claude.json 而非 .claude/settings.local.json。三者字面相似但规则不通用,题目常把某一类的规则错配到另一类上作为干扰项。

  3. 3

    $ARGUMENTS 只替换为命令名之后的原始文本,不包含命令名本身

    例如 /fix-issue 123 展开后 $ARGUMENTS123 而不是 /fix-issue 123 或空。若正文里没写 $ARGUMENTS 但用户仍传了参数,不会被丢弃,而是以 ARGUMENTS: <value> 的形式追加——这是「省略字段≠功能失效」这一出题套路在 commands/skills 上的具体表现。

  4. 4

    allowed-tools 的免确认权限是当次调用有效,不是永久授权

    写在 frontmatter 里的工具列表让 Claude 在这一次命令/skill 调用的这一轮里跳过权限确认,下一条用户消息发出后授权即失效,不能理解成「从此这个工具再也不用确认」。

  5. 5

    context: fork 触发的是隔离子代理执行,默认执行是内联在主上下文

    不加这个字段时,skill 正文就是主对话里追加的一段指令,共享现有上下文和工具权限;加了 context: fork 后,正文变成驱动一个独立子代理的 prompt,该子代理看不到主对话历史,执行完只把最终结果带回来——这条边界经常被出成「skill 默认就是独立进程/独立上下文」的错误描述。

  6. 6

    disable-model-invocation 控制的是「谁能触发」,不是「工具权限」

    设为 true 时 Claude 不会根据 description 自动加载该 skill/命令,只能由用户显式敲 /name 触发;这与 allowed-tools(控制免确认执行哪些工具)是两个独立维度,题目常把两者的作用故意调换。

反模式对照

常见做法

把自定义斜杠命令和 skills 当成两套需要分别配置触发规则的独立系统来学

正确做法

记住二者已合并为同一机制的两种文件落位,frontmatter 字段和触发语义通用

文档明确写出 .claude/commands/deploy.md.claude/skills/deploy/SKILL.md 行为等价,分开记忆容易在选项里被「触发方式不同」这类干扰项带偏。

常见做法

认为省略 tools/allowed-tools 等字段会导致该命令、skill 或 subagent 无法使用任何工具

正确做法

省略这类字段时默认是继承/放开(subagent 继承全部可用工具),而不是收紧为零

这是题库里反复出现的「省略字段≠受限」套路,凭直觉认为「没写=没有」是最容易失分的地方。

常见做法

以为 context: fork 只是个可选的性能优化标记,skill 实际执行方式不受影响

正确做法

context: fork 会让 skill 正文变成隔离子代理的 prompt,不带主对话历史,仅返回最终结果

默认(不加 fork)是内联在主上下文执行、共享现有对话;两种执行模型的边界是这条考点的高频陷阱。

常见做法

看到 $ARGUMENTS 没出现在命令正文里,就以为用户输入的参数会被忽略

正确做法

未使用 $ARGUMENTS 时,传入的参数会以 ARGUMENTS: <value> 形式自动追加到内容末尾

官方文档明确说明了这一兜底行为,题目常用「参数丢失/报错」作为错误干扰项来测试这一点是否被记混。

练这个考点