命令与技能共用同一个目录,只靠一个字段区分。判据只有一条:触发动作必须由人发出,不能由助手判断「这次相关」。
这份清单,助手会在没输入 /名称 的时候自己读进去吗?
答「会」,说明它现在还是技能,不是命令。
命令在 Cursor 和 Claude Code 里与技能同目录,靠前置元数据里的一个字段区分;TraeCode 把命令单列到 commands/,文件名就是调用名。
仓库根目录/ ├── .cursor/skills/check-scope/SKILL.md # 命令:带 disable-model-invocation: true ├── .claude/skills/check-scope/SKILL.md # 与 .cursor 同正文,前置元数据同 └── .trae/commands/check-scope.md # 独立目录,文件名就是调用名
判据落到目录与字段上:放在 skills/ 下且带 disable-model-invocation: true 的,是命令;不带这个字段的,是技能;TraeCode 的命令放在 commands/。别提交个人全局命令——它不经过评审,别人机器上也不存在。同一份清单三种工具的目录与字段不同:正文逐字照抄,前置元数据按工具换,.cursor/skills/ 与 .claude/skills/ 写三个字段,.trae/commands/ 只写两个。
跑这条自检:grep -rl "disable-model-invocation" .cursor/skills .claude/skills .trae/commands。列出来的应当都是命令,.trae/commands 下的文件不该出现这个字段——把 Cursor 的字段原样贴进去不报错,只是被忽略,现象是「命令能调用,但助手仍会自行读取它」。
场景:改动准备提合并请求,人输入 /check-scope——触发动作由人发出,不是助手判断「这次相关」。
scope_id;是否新增了仓库脚本里没有的测试参数。第 2 项答「是」,它说明冲突的是哪一条并停下来,回退那部分再提请求。
这三者最容易混用,因为它们都装「一段步骤」。判据是谁在什么时候决定用它,不是步骤长短。按下面的问句逐行选,只能命中一行。
| 要做的事 | 做成什么 | 什么时候生效 | 怎么判 |
|---|---|---|---|
人输入 /名称 才执行的一套固定清单 | 命令 | 人输入 /名称 时 | 需不需要人记得去用、由人拍板?是 → 命令 |
| 同类任务一出现就该想起来的一段步骤 | 技能 | 助手识别到同类任务后 | 同类任务一出现就该想起来,而且不止一条步骤?是 → 技能 |
| 需要独立上下文、或要把工具权限收紧的核对 | 子智能体 | 由主流程或人指定 | 要不要独立上下文,或更小的工具范围?是 → 子智能体 |
| 只对某类文件成立的一条约束 | 规则 | 匹配的文件进入上下文时 | 这条约束只在改这类文件时才用得到吗?是 → 规则 |
误用能认出来:合并请求里出现「助手自行执行了一次范围核对」——那是清单没写 disable-model-invocation: true;「命令写了但从来没人用」——说明它本该是技能。六个落点的完整对照见规则页的总表。
命令与技能同在 skills/ 下,靠 disable-model-invocation: true 区分;TraeCode 用独立的 commands/ 目录表示人触发。别提交个人全局命令——它不经过评审,别人机器上也不存在。
| 工具 | 命令文件 | 落地页 |
|---|---|---|
| Cursor | .cursor/skills/名称/SKILL.md | Cursor 命令落地页 |
| TraeCode | .trae/commands/名称.md | TraeCode 命令落地页 |
| Claude Code | .claude/skills/名称/SKILL.md | Claude Code 命令落地页 |