本页判断标准

不输斜杠、只问一句「要不要核对范围」,这条命令会自己跑起来吗?

答「会跑」,说明 disable-model-invocation: true 漏写了,它现在是普通技能。补上这一行,再开一轮新对话确认。

建命令之前先问三句

命令不是给助手用的能力,是给人按下去的快捷方式。判断标准只有一条:这几步每次都要照着做,而且顺序固定。

1. 步骤是不是已经固定? 固定了才建。还在边做边改的,先写进 可执行规约,等它稳定了再固化成命令。
2. 是不是必须由人按下去? 需要人挑时机的,加 disable-model-invocation: true。助手自己该做、不用人喊的,写成普通技能,见 技能。
3. 判据指向哪个文件? 命令正文里的每一条判断都要指向一个具体文件,例如 README 的「当前阶段」。指不到文件的判断不要写。
建目录在仓库里建 .claude/skills/<名称>/SKILL.md,文件名必须是全大写的 SKILL.md。
写前置元数据name 与目录名一致;description 写明「用户输入 /名称 时使用」;加上 disable-model-invocation: true。
写正文只写有先后顺序的步骤,每条一行。判据指向仓库里的具体文件。
验证只由人触发开一轮新对话,不输斜杠,问它「要不要核对范围」。它不该主动跑;再输入 /check-scope,应能正常执行。
可以这么做 步骤固定、需要人挑时机的流程做成命令:发布前核对清单、提交前核对范围。旧文件用 git mv .claude/commands/check-scope.md .claude/skills/check-scope/SKILL.md 迁到技能目录。
不要这么做 步骤还没定就先建文件;同名命令在新旧两个目录各留一份;把「顺便优化一下代码」这类没有结束标志的动作写进命令。

边界:命令只在人输入斜杠时执行,所以它挡不住助手自己动手。需要百分百拦住的(例如不读 .env),放 钩子,不放命令。

命令在三个工具里的写法

三处的差别集中在「新命令写到哪个目录、叫什么名字」。TraeCode 没有技能形式的命令,文件名本身就是调用名。迁之前先对一遍目录名,迁完输入一次 / 确认它在列表里。

项Claude CodeCursorTraeCode
新写法.claude/skills/<名称>/SKILL.md 加 disable-model-invocation: true.cursor/skills/<名称>/SKILL.md 加 disable-model-invocation: true.trae/commands/<名称>.md,文件名就是调用名
旧写法.claude/commands/*.md 仍作为同名命令加载;同名时技能优先.cursor/commands/*.md 仍能加载无旧写法
个人位置无对等注意项,个人命令并入 ~/.claude/skills/无对等位置~/.trae-cn/commands
目录深度按技能目录规则按技能目录规则项目命令最多嵌套 3 层目录
调用方式输入 /输入 /输入 /,从 Commands 里选择
名称约束技能 name 建议与目录名一致name 与目录名相同,只用小写字母、数字和连字符文件名即名称

本课只保留一种落点:Claude Code 写成带 disable-model-invocation: true 的技能。旧目录在迁移期间允许存在,但同名两份必须在同一次合并请求里清掉一份。

一份新写法,一份旧写法

第一份是本课推荐的新写法,在对话里输入 /check-scope 触发,它先看 README 里写明做什么、不做什么。第二份是旧写法的格式,留着它只为看懂存量仓库,新写的不要照它建。

.claude/skills/check-scope/SKILL.md

disable-model-invocation: true 让它只在人输入 /check-scope 时执行。判据指向 README.md 的「当前阶段」。建完开一轮新对话,不输斜杠问一次、再输斜杠跑一次,两端都对才算配好。

---
name: check-scope
description: 判断这次改动是否越出当前阶段已经写明的范围。用户输入 /check-scope 时使用。
disable-model-invocation: true
---

只做 README 里写明的角色和能力,数据按登录用户的所属范围隔离。
当前阶段有哪些能力,以 README.md 的「当前阶段」一节为准。
产品里给最终用户使用的功能,不是仓库里的技能文件。
不做:家长端、多校区运营、学科交易市场。

先列出这次会改的目录。
再逐条说明:哪条在上面的范围内,哪条该停。
不要为了「顺便」加上范围内没有的角色或存储。

.claude/commands/release-note.md(旧写法)

旧命令就是一段纯文本,没有前置元数据,文件名即命令名,输入 /release-note 触发。同名技能存在时,这份会被忽略。用 ls .claude/commands .claude/skills 确认有没有同名两份。

读最近的合并请求与提交记录,按 feat / fix / chore 分组,生成一段发布说明。
只写已经合并的内容,不写计划。
每条一行,带合并请求编号。

迁移存量命令时改名要一起改:git mv .claude/commands/release-note.md .claude/skills/release-note/SKILL.md,再补上前置元数据与 disable-model-invocation: true。两份同名的,以 .claude/skills/ 那份为准,旧的那份删掉。

命令不响应的四种现象

命令出问题多数不是写错内容,是没被识别、没被选中或选错了那一份。按「现象 → 原因 → 修法」对号入座,改完开一轮新对话再验一次。

现象原因修法
在 .claude/commands/check-scope.md 里改了步骤,输入 /check-scope 却没变化同名技能 .claude/skills/check-scope/SKILL.md 优先,旧文件被忽略改技能那份,或删掉旧文件;用 ls .claude/skills/check-scope .claude/commands 2>/dev/null 确认同名两份是否并存
建完命令,助手没等人输入斜杠就自己执行了核对范围漏写 disable-model-invocation: true,它被当成普通技能按 description 加载前置元数据补上 disable-model-invocation: true,并在 description 里写明「用户输入 /check-scope 时使用」
/check-scope 每次输出不一样,有时直接放行越界改动步骤没固定,判断留给了模型自由发挥把正文改成固定编号的步骤,每条判据指向 README.md 的具体小节
输入 / 时列表里没有 check-scope,提示未知命令路径或文件名不符,例如目录写成 .claude/skill/,或文件写成 skill.md确认路径是 .claude/skills/check-scope/SKILL.md,文件名全大写
对应知识点 这一页只是 命令 在 Claude Code 里的落地写法。通用规则看 命令(第一层 · 能力);助手自己该用的能力写成技能,见 技能;必须百分百拦住的放 钩子。