你是否经常在和 AI 编程助手对话时,反复粘贴同一套代码规范或重复描述任务流程?这种“ Ctrl C + Ctrl V ”式的指令重复,不仅效率低下,也容易遗漏关键细节。 Claude Code 的 Skill 机制正是解决这个问题的“银弹”——它能把重复指令沉淀为团队可共享的数字资产,在恰当的时机自动加载执行。
本文提炼的 6 条要点,能帮你快速掌握 Skill 的核心设计思路,实现从“每次口述”到“自动触发”的跨越。

Skill 是什么:按需加载的“任务 SOP”
Skill 的结构简单到令人惊讶——它本质上就是一个包含 SKILL.md 文件的文件夹。
但其核心魅力不在于格式,而在于精妙的加载时机:
Claude Code 启动时,只扫描所有 Skill 的 name 和 description——大约消耗 100 个 token 来标记“有哪些可用技能”。只有当你真正需要某个 Skill 时,其完整内容才会被动态加载进上下文。
这揭示了一个关键的设计哲学:没用上的不占上下文。即便你的笔记本上安装了几百个 Skill,对每次会话的成本影响也几乎为零。
Skill vs CLAUDE.md:各司其职
很多人会困惑:CLAUDE.md 也能存放规则,那还需要 Skill 做什么?
两者的区别在于分工维度:
| 维度 |
CLAUDE.md |
Skill |
| 加载时机 |
每次对话全量加载 |
按需加载——初始仅加载 name + description |
| Token 消耗 |
文件多大就消耗多大 |
初始约 100 token,触发后才加载全文 |
| 适合放什么 |
全局规则、项目约定 |
特定任务的 SOP / 工作流 |
| 触发方式 |
自动 |
手动执行 /命令 或 Claude 自动匹配 |
打个比方:CLAUDE.md 更像是“这个项目的基本规矩”——比如用什么语言、代码风格要求;而 Skill 则是“某类任务的具体做法”——比如审查 PR 的流程、编写组件的规范。两者不是替代关系,CLAUDE.md 太重塞不进每次对话,而 Skill 则让你能为具体任务封装规则,按需取用。
Skill 放在哪:3 个位置 × 3 种作用范围
Skill 的存放位置决定了它的作用边界:
| 位置 |
范围 |
典型用法 |
~/.claude/skills/<name>/SKILL.md |
个人级别 |
所有项目都能用 |
.claude/skills/<name>/SKILL.md |
项目级别 |
只对当前项目生效(可提交 Git) |
<plugin>/skills/<name>/SKILL.md |
插件级别 |
随插件分发 |
大多数情况下,项目级别就够用了。 将 .claude/skills/ 目录提交到 Git,团队成员拉取代码后即可直接使用,无需任何额外配置。
关键约束:文件夹名字必须和 SKILL.md 里的 name 字段严格一致——这是规范要求。
写一个最简单的 Skill(5 分钟跑通)
一个 Skill 文件由 YAML 头部和 Markdown 正文两部分组成:
---
name: hello-world
description: 一个示例 skill,用于演示基本结构
---
当用户打招呼时,用中文回复,并附上一个冷笑话。
将这个文件放到 ~/.claude/skills/hello-world/SKILL.md 后:
- 手动调用:在对话框输入
/ 就能看到 Skill 列表,选中 hello-world 或直接输 /hello-world 触发。
- 自动触发:当 Claude 识别到对话内容与
description 匹配(例如有人说“你好”),就会自动加载这个 Skill。
创建后没看到?重启 Claude Code 就行(或执行 /reload)。
就这样——建文件夹、写文件、重启,3 步 5 分钟,一个带自动触发逻辑的 Skill 就跑通了。
Frontmatter 字段速查表
SKILL.md 的 YAML 头部常用字段如下,记住这张表能帮你避免很多基础失误:
| 字段 |
是否必填 |
说明 |
name |
✅ 是 |
1–64 字符,只能用小写字母/数字/连字符,须与文件夹同名 |
description |
✅ 是 |
最重要的字段——Claude 据此决定是否加载该 Skill |
disable-model-invocation |
否 |
设为 true 则只能手动调用,Claude 不会自动触发 |
allowed-tools |
否 |
Skill 激活时允许免确认使用的工具 |
license |
否 |
许可证类型 |
compatibility |
否 |
环境要求说明,例如 Requires python3.10+ |
metadata |
否 |
自定义键值对,存放额外信息 |
description 长度上限为 1024 字符。这个字段是写给 Claude 看的,不是写给人看的。内容务必清晰地写明“干什么”和“什么时候用”,把触发词和应用场景都放进去。
6 个把 Skill 写好的实战要点
掌握结构只是开始,让 Skill 变得“好用”才是关键。以下 6 条经验提炼自实战踩坑,能让你的 Skill 自动触发率提升一个台阶。

1. description 是“触发器”,不是“摘要”
这个字段的质量直接决定了 Skill 能否被精准、自动地加载。
- ❌ 不好的写法(摘要式):
description: 这是一个帮助生成代码的工具
- ✅ 好的写法(触发词+场景式):
description: 生成 Spring Boot Service 类。当用户要求写业务逻辑、新建 Service、实现业务接口时使用。
两者的区别在于,前者过于抽象,Claude 无法判断何时该用它;后者则提供了明确的动作和触发词,匹配命中率大幅提升。
2. 正文用命令语气、加编号
Claude 按指令执行,编号能引导它按顺序完成步骤,有效减少遗漏。请直接说“提取颜色主题”,而不要说“你应该提取颜色主题”。
1. 读取当前文件
2. 检查安全问题
3. 输出审查结果
3. SKILL.md 控制在 500 行以内
当 Skill 内容变得庞杂时,不要全堆在主文件里,可以拆解到同目录下的独立文件中,然后在 SKILL.md 里引用。
my-skill/
├── SKILL.md # 主指令(必须)
├── template.java # 业务代码模板
├── examples/
│ └── UserService.java # 示例代码
└── references/
└── REFERENCE.md # 详细技术参考
引用方式:
## 参考资料
- 代码模板见 [template.java](template.java)
- 详细技术参考见 [references/REFERENCE.md](references/REFERENCE.md)
这样做的好处是,Claude 只在真正需要时才读取关联文件,不会一次性把所有内容都塞进宝贵的上下文窗口。
4. 动态注入:让 Skill 自己去拿上下文
利用 !命令` 语法,你可以在 Skill 加载前执行Shell` 命令,并将输出结果直接嵌入提示词。
---
name: pr-review
description: 审查当前 PR 的代码变更
---
## 当前变更
!`git diff --stat`
## 变更详情
!`git diff`
请审查以上代码变更,关注潜在的 bug 和规范问题。
这样 Claude 拿到的是真实的、动态的 diff 数据,你再也不用手动粘贴一遍了。
5. 用 $ARGUMENTS 接收参数
如果 Skill 需要处理动态变量,用 $ARGUMENTS 来接收。调用 /fix-issue 42 时,$ARGUMENTS 会被替换为 42。多个参数还可以使用 $0、$1 按位置获取。
---
name: fix-issue
description: 修复 GitHub issue
disable-model-invocation: true
---
修复 GitHub issue #$ARGUMENTS:
1. 阅读 issue 描述
2. 实现修复
3. 编写测试
4. 创建 commit
特别注意,这里设置了 disable-model-invocation: true,意味着此 Skill 只能手动调用。任何涉及副作用(如部署、发版、文件修改)的 Skill,都强烈建议加上这行保护,避免 AI 自作主张。
6. 区分谁能调用
一个简单的划分原则:
- 辅助查询、生成类任务:允许自动触发。
- 部署、发消息、修改文件等有副作用的操作:加上
disable-model-invocation: true,仅允许手动调用。
实战案例:将团队 Spring Boot Controller 规范封成 Skill
这里有一个非常典型的场景:在一个 Java 技术栈的 Spring Boot 项目中,每次要求 AI 写接口,你都得重复一遍“用 @RestController、参数加 @Validated、返回 CommonResult 包装、路径用 kebab-case …”。
现在,我们把它封装成一个 Skill:
spring-controller/
├── SKILL.md
├── template.java # 一个符合规范的 Controller 模板
└── examples/
└── UserController.java # 示例 Controller
SKILL.md 内容如下:
---
name: spring-controller
description: 生成符合团队规范的 Spring Boot Controller。当用户要求创建接口、写 Controller、加 API、新建 endpoint 时使用。
---
按以下规范生成 Spring Boot Controller:
1. 使用 @RestController + @RequestMapping("/api/v1/...") 注解
2. 所有接口入参必须加 @Validated 校验
3. 返回值统一用 CommonResult<T> 包装
4. 接口路径用 kebab-case(如 /user-info,不是 /userInfo)
5. 用 Swagger 注解 @Tag / @Operation 写文档,描述参数与返回值
6. 参考 [template.java](template.java) 的结构
输出示例见 [examples/UserController.java](examples/UserController.java)。
以后,当你说“帮我写一个用户登录的 Controller”,或者执行 /spring-controller,Claude 就会立刻生成符合团队风格的代码,无需再多费口舌。DAO 层、前端组件、单元测试等场景,都可以套用这个模板结构来封装。
验证与团队共享:用 skills-ref + Git
验证
Skill 写好后,可使用官方工具模拟验证,检查 name 格式、description 是否为空等规范性要求。
# 安装验证工具(参考 GitHub: agentskills/agentskills)
skills-ref validate ./spring-controller
如果想公开发布或团队共享,通过这个检查会更稳妥。
团队共享
最简单高效的方式是直接将 .claude/skills/ 目录提交到 Git 仓库。新人克隆仓库后即可直接使用,零配置成本,这就是模块化、按需加载的威力。它比在 CLAUDE.md 里堆积大量规范合理得多。
团队内部分工时,可以由资深成员沉淀一批高价值的 Skill 并提交至仓库,新人入职即用,实现团队经验的有效传承。
3 个新人最常踩的小坑
name 格式写错(最常见):name 字段只能包含小写字母、数字和单个连字符。my-skill、spring-controller 是合法的;my_skill、MySkill、my--skill 均不合法。
- 改完忘了重启:新增或修改 Skill 后,如果当前有活跃的 Claude Code 会话,需要重启或执行
/reload 才能生效。当发现 / 命令里没出现新 Skill 时,90% 是这个原因。
description 太空,Claude 抓不到:你以为写了就行,但 Claude 可能因描述不精确而忽略它。解决方法就是把 description 当成 SEO 关键词来写,把所有可能触发的“动词+名词”都列上去。
最后说一句
Skill 的核心逻辑就是用标准化的方式,把重复指令封装起来,让 Claude 在恰当时机自动执行。它的价值在于让规则自动出现在合适的时机。

行动起来:想想你日常工作中最常重复说的那一类指令,现在就把它封装成 Skill,提交到项目的 .claude/skills/ 目录下。用不了一周,你就会积累起 3-5 个 Skill,团队协作效率也会因此显著提升。
在 云栈社区,我们鼓励这种将个体经验转化为团队工具的知识共享方式。把那些重复劳动封装起来,把精力留给更有创造性的工作。
参考资料:
- Agent Skills Specification 官方规范
- agentskills/agentskills GitHub Skill 验证工具
- 掘金参考文章