1. 前言
为什么同样用 Claude,你的效率差这么多,本文将会带大家了解 Skill,不管你是什么语言,没写过的情况下,你都可以学会他
2. 背景
如果你用过 Claude Code ,大概率遇到过这样的场景: 每次让 Claude Code 写代码,让部分代码风格保持一致, 你会告诉他项目的编码风格,或者是一段样本代码,或者是指定某个文件;
也就是,重复描述具体的某一流程,为了解决这个问题,那么就要引出今天我们要说的 Skill 。
核心速览: Skill 的本质就是一个文件夹里面放了一个 SKILL.md 文件,通过编写重复的指令,Claude 就会识别这个文件,执行特定的功能
3. 初始 Skill
在开始讨论 Skill 之前,我们要区分一个事情,它和CLAUDE.md 的区别是什么,CLAUDE.md 里的内容每次对话都会加载,而 Skill 只在需要时才加载,不用的时候几乎不占上下文。
Skill 遵循的规范 (Specification - Agent Skills)。
3.1 Skill 的位置存放
| 位置 | 路径 | 适用范围 |
|---|---|---|
| 个人 | ~/.claude/skills/<name>/SKILL.md |
你所有的项目 |
| 项目 | .claude/skills/<name>/SKILL.md |
仅当前项目 |
| 插件 | <plugin>/skills/<name>/SKILL.md |
启用了该插件的地方 |
3.2 一个最小的 Skill
接下来我们就按项目级别的 Skill 来给大家说一下,如何实现,这也是你能看完本文快速能落地的方案,聪明的你,就知道如何去提取 Skill 然后省下自己的token,并且在简历猛吹,自研xxxSkill 这是我的路径: .claude\skills\my-skill\SKILL.md
yaml
my-skill/
└── SKILL.md
SKILL.md 由两部分组成------YAML 头部(frontmatter)和 Markdown 正文:
yaml
---
name: hello-world
description: 一个示例 skill,用于演示基本结构
---
当用户打招呼时,用中文回复,并附上一个冷笑话。
创建之后,你可以通过 /hello-world 手动调用,也可以让 Claude 在匹配到 description 时自动调用。
你执行的时候 在对话框输入 / ,就可以得到下图:

注意: 如果没有,记得创建好上面的步骤,重启你的 Claude
最终执行,我们将得到:

常用 frontmatter 字段速查:
| 字段 | 作用 |
|---|---|
name |
名称,也是 /hello-world 的名字 |
description |
最重要的字段,Claude 根据它决定是否加载 |
disable-model-invocation |
设为 true 则只能手动调用,Claude 不会自动触发 |
allowed-tools |
该 skill 激活时允许 Claude 免确认使用的工具 |
context |
设为 fork 可在子代理中隔离运行 |
具体的东西,可以在上面的规范中去查询,值得注意是 description 你尽量要写的通俗易懂,上图的内容,你可以再去看看,就知道指的是哪里
4. 如何高效写出一个 Skill
掌握基本结构之后,关键在于写得 "好用"。以下是从官方文档和实践中总结的核心要点:
第一,description 是触发器,不是摘要。
Claude 决定是否加载一个 Skill,完全依赖 name + description。不要写 "这是一个帮助生成代码的工具",而要写 "生成 Vue 3 组件。当用户要求创建组件、页面或 Vue 文件时使用"。把触发词和使用场景写进去,Claude 才能准确匹配。说白了,把 Claude 当成你的合伙人,他要阅读这个说明书,才能懂你意思。
第二,指令用命令语气,按步骤编号。
写 "提取颜色主题",不要写 "你应该提取颜色主题"。
第三,SKILL.md 控制在 500 行以内。
当你的项目特别庞大的时候,此时你的内容也会越来越多,我们可以把详细的参考资料、模板、示例拆到同目录下的独立文件里,在 SKILL.md 中引用它们:
yaml
my-skill/
├── SKILL.md # 主指令(必须)
├── template.vue # 组件模板
├── examples/
│ └── sample.vue # 示例输出
└── scripts/
└── validate.sh # 辅助脚本
在 SKILL.md 中这样引用:
markdown
## 参考资料
- 组件模板见 [template.vue](template.vue)
- 输出示例见 [examples/sample.vue](examples/sample.vue)
第四,善用动态注入。
``!`command``` 语法可以在 skill 加载前执行 shell 命令,把输出注入到提示词中:
yaml
---
name: pr-review
description: 审查当前 PR 的代码变更
---
## 当前变更
!`git diff --stat`
## 变更详情
!`git diff`
请审查以上代码变更,关注潜在的 bug 和规范问题。
Claude 看到的不是命令本身,而是命令的输出结果。
第五,用 $ARGUMENTS 接收参数。
yaml
---
name: fix-issue
description: 修复 GitHub issue
disable-model-invocation: true
---
修复 GitHub issue #$ARGUMENTS:
1. 阅读 issue 描述
2. 实现修复
3. 编写测试
4. 创建 commit
调用 /fix-issue 42 时,$ARGUMENTS 会被替换为 42。也支持 $0、$1 按位置取参数。
编号可以让 Claude 按顺序执行,减少遗漏。
第六,区分"谁来调用"。
有副作用的操作(部署、发消息)加 disable-model-invocation: true,防止 Claude 自作主张。
5. 总结
建议从你日常最重复的流程开始操作,把它封装成第一个 Skill。写好之后提交到项目的 .claude/skills/ 里,这样团队成员都能受益。(前提不是古法编程)
注意: description 写成触发条件而非摘要;指令用命令语气并编号;大文件拆分引用;善用动态注入和参数传递。