Mascot Logo
ai-agents-tutorial

Part 2 · 第 8 课,共 16 课

用 SKILL.md 打造你的 Claude Code 自定义技能

自动加载的知识与指令包。使用和编写自定义技能。

10 min

第 1 步 / 共 6 步 · 什么是技能 (Skills)?

技能 (Skill) 是一个可复用的指令包(也可以包含脚本),用于扩展 Claude Code 的能力。你只需在一个名为 SKILL.md 的文件里把指令写好一次,Claude 就会把它加入自己的工具箱。

你可以把它看作一份定制的“小抄”。每当任务匹配时,Claude 就能按需加载该技能,并精确遵循你写的指令。这样你就能自动化重复性工作,比如格式化代码、跑一遍发布检查清单、或生成数据库 Schema,而不必每次都重新输入这些步骤。

与把所有内容都塞进 CLAUDE.md 不同,技能的正文只在真正被用到时才加载,所以即使是很长的参考资料,在你需要之前几乎不占用上下文。

第 2 步 / 共 6 步 · 技能存放在哪里、结构如何

每个技能都是一个包含 SKILL.md 文件的文件夹。文件夹放在哪里,决定了谁能使用它:

  • 个人级(你的所有项目都可用):~/.claude/skills/<技能名>/SKILL.md
  • 项目级(仅当前仓库,提交后即可共享):.claude/skills/<技能名>/SKILL.md

文件夹名就是你要输入的命令。位于 .claude/skills/deploy-staging/SKILL.md 的技能,调用方式就是 /deploy-staging

一个 SKILL.md 由两部分组成:

  1. YAML frontmatter,写在 --- 标记之间。最重要的字段是 description——Claude 会读取它来判断何时自动使用该技能。(name 是可选的,只用作显示名称。)
  2. Markdown 指令,写在 frontmatter 下方——技能运行时 Claude 需要遵循的步骤。
---
description: 格式化并整理 Markdown 文件。当被要求整理或格式化 .md 文档时使用。
---

格式化 Markdown 文件时:
- 在每个标题前留一个空行
- 删除每行行尾的空格
- 将段落按 80 字符换行

技能文件夹里还可以放配套文件——模板、示例输出,或供 Claude 运行的辅助脚本(Shell 或 Python),但只有 SKILL.md 是必需的。

第 3 步 / 共 6 步 · 自动调用 vs. 用 /名称 手动触发

技能有两种运行方式,理解二者的区别正是技能的精髓所在:

  • 由 Claude 自动调用。 Claude 始终能看到每个技能的 description。当你的请求与之匹配时,它会自动加载该技能。你说*“整理一下 README.md”*,一个描述写得好的格式化技能就会自动生效,而无需你点名。
  • 由你直接调用,输入 /<技能名>(即文件夹名),例如 /format-md。当你想自己触发技能时就用这种方式。

你可以通过 frontmatter 来控制这一点。加上 disable-model-invocation: true,技能就变成仅限手动触发——这对有副作用的操作很有用,比如 /deploy/commit,你不会希望 Claude 自作主张去运行它们。默认情况下,你和 Claude 都可以调用一个技能。

第 4 步 / 共 6 步 · 创建一个 Markdown 格式化技能

让我们做一个真正的项目级技能,指导 Claude 如何整理 Markdown 文件。在你的 playground 中创建技能文件夹:

mkdir -p .claude/skills/format-md

现在创建 .claude/skills/format-md/SKILL.md。用编辑器打开它并粘贴:

---
description: 格式化并整理 Markdown 文件。当被要求整理、清理或格式化 .md 文档时使用。
---

格式化 Markdown 文件时:
- 在每个标题前留一个空行
- 删除每行行尾的空格
- 将段落按 80 字符换行

由于这个文件夹叫 format-md,该技能既可以自动使用(根据它的描述),也可以用 /format-md 直接调用。

第 5 步 / 共 6 步 · 验证你的技能

在 playground 中启动 Claude Code:

claude

先确认 Claude 能看到这个技能。问它:

现在有哪些可用的技能?

你应该能在列表里看到 format-md。接下来分别测试两种调用方式。

直接调用——输入命令并带上目标文件:

/format-md 整理一下 intro.md

自动调用——只描述任务、不点名技能,让 Claude 自己判断:

帮我整理一下 intro.md 的格式

无论哪种方式,Claude 都会读取你技能里的规则,在标题前加上空行、去掉行尾空白、把段落重新换行,并保存结果。

输入 /exit 关闭会话。

第 6 步 / 共 6 步 · 检查点与本节回顾

本节回顾

  • 技能是写在 SKILL.md 里的可复用指令包,只在被使用时才加载。
  • 位置决定范围~/.claude/skills/ 是个人级,.claude/skills/ 是项目级;文件夹名就是 /命令
  • 两种运行方式:Claude 根据 description 自动调用,或你输入 /<名称>。用 disable-model-invocation: true 设为仅手动触发。
  • 自定义命令也是技能.claude/commands/*.md 文件依旧有效,并以相同方式创建 /命令

常见问题

Claude Code 的技能存放在哪里?

一个技能就是一个包含 SKILL.md 文件的文件夹。把它放到 ~/.claude/skills/<名称>/SKILL.md,就能在你的所有项目中使用;放到 .claude/skills/<名称>/SKILL.md,则只在当前仓库生效(把该文件夹提交到版本库即可与团队共享)。文件夹名就是你要输入的命令,所以 .claude/skills/format-md/SKILL.md 的调用方式是 /format-md

Claude 如何决定何时自动使用一个技能?

Claude 始终能看到每个技能的 description 字段。当你的请求与该描述匹配时,它会自动加载技能并遵循其中的指令——你无需点名。这正是为什么一个清晰、具体、且用上你平时会自然说出的词的 description 最为关键。如果想阻止 Claude 自动运行某个技能,就在 frontmatter 里加上 disable-model-invocation: true,这样就只有你才能用 /名称 来调用它。

技能和自定义斜杠命令有什么区别?

它们是同一套系统。位于 .claude/commands/deploy.md 的文件和位于 .claude/skills/deploy/SKILL.md 的技能,都会创建 /deploy 并以相同方式工作。技能额外提供了一些可选能力——存放辅助脚本等配套文件的文件夹、用来控制由谁调用的 frontmatter,以及在相关时自动加载。现有的 .claude/commands/ 文件依旧可用;如果一个技能和一个命令同名,技能优先。

如何列出或重新加载我的技能?

在会话中,问“现在有哪些可用的技能?”或运行 /skills 即可查看列表。如果你在会话进行中在磁盘上添加或修改了技能,Claude Code 通常会自动识别;如果没有,运行 /reload-skills 重新扫描技能和命令目录。

技能可以运行脚本吗?

可以。一个技能文件夹里可以打包任意语言的辅助脚本(例如放在 scripts/ 子文件夹中),并由你 SKILL.md 中的指令告诉 Claude 何时运行它们。这让技能能够完成纯靠提示词做不到的重活——比如生成一份 HTML 报告。