Claude Code Skills 深度解析:从原理到工程实践
引言
如果你用过 Claude Code 一段时间,一定遇到过这个问题:每次开启新对话,都要把同一套上下文——“用 TypeScript,遵循我们的 API 规范,错误处理用 Result 类型……”——重新粘贴一遍。
这正是 Skills(技能) 要解决的问题。
Skills 是 Claude Code 的可插拔指令包:把重复的提示词、工作流程、代码规范封装成一个目录,下次只需输入 /my-skill,Claude 就自动获取完整的上下文并按规范执行。
本文从机制原理到工程实践,逐层拆解 Skills 的每个细节。
一、Skills 与 Slash Commands 的关系
在理解 Skills 之前,有必要先厘清它与内置命令的区别。
Claude Code 内置了一批固定功能的 / 命令:
| 命令 | 作用 |
|---|---|
/clear | 清空对话历史 |
/compact | 压缩上下文,节省 token |
/cost | 查看当前会话 token 用量 |
/help | 列出所有可用命令 |
/diff | 查看 Claude 做出的所有文件变更 |
/init | 初始化项目,生成 CLAUDE.md |
这些是硬编码进 CLI 的逻辑,用户无法修改。
Skills 则是用户定义的扩展层。早期版本里,Claude Code 有两个存放路径:
.claude/commands/*.md—— 命令文件.claude/skills/*/SKILL.md—— 技能目录
两者现已合并为统一机制,推荐使用 .claude/skills/ 路径,因为它支持更多功能:支持文件(模板、脚本、参考文档)、完整的 frontmatter 控制,以及 Agent 子进程模式。
个人级技能放在
~/.claude/skills/(对所有项目生效),项目级技能放在项目根目录的.claude/skills/(可纳入 git 版本管理,团队共享)。
二、SKILL.md:技能的基本单元
每个技能本质上是一个目录,目录里必须包含一个 SKILL.md 文件:
.claude/
└── skills/
└── api-design/ ← 技能目录名(对应 /api-design 命令)
├── SKILL.md ← 必须:主指令文件
├── template.ts ← 可选:模板文件
├── examples/ ← 可选:示例目录
└── docs/ ← 可选:参考文档
SKILL.md 由两部分组成:
---
name: api-design
description: 按照项目 RESTful 规范设计 API 接口,包括路由、请求/响应结构和错误处理
---
## API 设计规范
设计接口时遵循以下原则:
1. 路由使用复数名词:`/users`、`/orders`
2. 错误响应统一使用 `{ code, message, data }` 结构
3. 分页参数:`page`(从 1 开始)+ `pageSize`(默认 20,最大 100)
## 参考模板
见同目录的 `template.ts`,包含标准的 Controller 和 Service 结构。
用户请求:$ARGUMENTS
YAML frontmatter(--- 之间的部分)控制技能行为,markdown 正文是 Claude 执行时读取的指令。
三、Frontmatter 字段全解
这是 Skills 与普通 .md 文件的核心差异所在。官方文档和社区实践共识的字段如下:
name
name: api-design
技能的唯一标识符,对应用户输入的 /api-design。只允许小写字母、数字和连字符,最长 64 个字符。若省略,使用目录名。
description
description: 按照项目 RESTful 规范设计 API 接口
这个字段有两个作用:
- 在
/help列表中展示给用户 - 帮助 Claude 自动判断是否应该调用这个技能
关键限制:每条 description 最多显示 250 个字符,且所有技能描述共用一个上下文预算(默认为上下文窗口的 1%,约 8000 个字符)。建议把最关键的使用场景放在前 50 个字里。
allowed-tools
allowed-tools: [Read, Grep, Glob]
限制技能执行期间 Claude 可以使用的工具集合。这是一个安全边界机制,常见模式:
- 只读分析技能:
[Read, Grep, Glob] - 代码执行技能:
[Bash, Read, Write] - 纯文档技能:
[Read]
未列出的工具在技能执行期间不可用,即使 Claude 尝试调用也会被拦截。
disable-model-invocation
disable-model-invocation: true
设为 true 时,该技能不会出现在 Claude 可自动调用的工具列表中,只能由用户显式输入 /skill-name 触发。
适用场景:
- 危险操作:生产环境部署、数据库迁移
- 交互式工作流:需要用户逐步确认的操作
- 一次性配置命令:不希望 Claude 在对话中自动触发
副作用:减少无关的上下文消耗,提升其他技能的可用预算。
user-invocable
user-invocable: false
设为 false 时,技能不出现在用户可见的命令列表中,但 Claude 可以自动调用它。
这是与 disable-model-invocation 相对的设计:适合作为”背景知识”存在的技能——比如项目的编码规范、架构决策记录,Claude 可以在任何时候参考,但用户不需要手动触发。
argument-hint
argument-hint: "[issue-number] [分配给谁]"
在命令补全时显示的参数提示,纯 UX 用途,不影响逻辑。
context
context: fork
设置技能在独立子进程中执行。技能内容成为子进程的任务 prompt,不继承当前对话历史。
适合长时间、消耗大量上下文的分析任务,执行结果会被汇总后返回主对话。
agent
agent: Explore
配合 context: fork 使用,指定子进程使用的 Agent 类型。可用选项:
| Agent | 特点 |
|---|---|
Explore | 只读工具,专为代码库探索优化 |
Plan | 设计实现方案的架构师 Agent |
general-purpose | 默认,拥有全部工具 |
| 自定义 Agent 名称 | 来自 .claude/agents/ 的配置 |
$ARGUMENTS
不是 frontmatter 字段,而是正文中的占位符。用户输入 /my-skill some text 时,some text 会替换 $ARGUMENTS:
---
name: translate
description: 翻译文本到指定语言
argument-hint: "[目标语言] [文本]"
---
请将以下内容翻译为 $ARGUMENTS
四、三种典型技能模式
理解了字段含义,来看三种实际工程场景的设计模式。
模式一:标准提示词封装
最简单的用法,把重复的 prompt 固化下来:
---
name: commit
description: 生成符合项目规范的 git commit 信息
---
分析当前 staged changes,生成一条符合 Conventional Commits 规范的提交信息:
- 格式:`type(scope): description`
- type 范围:feat / fix / docs / refactor / test / chore
- description 用中文,动词开头,不超过 50 字
- 如果变更涉及 breaking change,在正文中注明
先用 Bash 运行 `git diff --staged` 查看变更内容,再生成提交信息。
模式二:只读分析技能
适合代码审查、安全扫描等场景,配合 allowed-tools 防止意外修改:
---
name: security-review
description: 对当前代码库进行 OWASP Top 10 安全审查
allowed-tools: [Read, Grep, Glob]
disable-model-invocation: true
---
对 $ARGUMENTS 路径下的代码进行安全审查,重点检查:
1. SQL 注入风险(拼接查询字符串)
2. XSS 漏洞(未转义的用户输入输出到 HTML)
3. 不安全的反序列化
4. 硬编码的密钥或敏感信息
5. 目录遍历漏洞
输出格式:
- 风险等级(High / Medium / Low)
- 文件位置(文件名:行号)
- 漏洞描述
- 修复建议
模式三:Fork Agent 深度探索
适合需要大量读取和分析、但不希望污染主对话上下文的任务:
---
name: deep-audit
description: 在独立 Agent 中对代码库进行深度架构分析
context: fork
agent: Explore
---
对当前项目进行全面架构分析:
1. 找出所有模块的依赖关系
2. 识别潜在的循环依赖
3. 统计各模块的代码行数和复杂度
4. 找出没有测试覆盖的关键路径
生成一份结构化的架构报告,包含可量化的指标和具体的改进建议。
五、支持文件:让技能更强大
技能目录中除了 SKILL.md,还可以放置支持文件。在 SKILL.md 正文中引用它们,Claude 就会在执行时加载:
.claude/skills/generate-component/
├── SKILL.md
├── component.template.tsx ← 组件模板
├── stories.template.ts ← Storybook 故事模板
└── test.template.spec.ts ← 测试文件模板
---
name: generate-component
description: 生成符合项目规范的 React 组件,含 Storybook 故事和单元测试
---
生成 React 组件 `$ARGUMENTS`,参考以下模板:
- 组件代码:见 `component.template.tsx`
- Storybook:见 `stories.template.ts`
- 测试:见 `test.template.spec.ts`
组件应支持 dark mode,使用 Tailwind CSS,Props 类型定义完整。
六、从 GitHub 安装社区技能
技能社区已经相当活跃,截至 2026 年 4 月,仅一个社区目录就收录了超过 9000 个技能。
官方技能库
Anthropic 官方维护了一个技能仓库 github.com/anthropics/skills,包含文档处理(docx、xlsx、pdf)、创意应用(算法艺术、UI 设计)等官方出品的技能。
安装方法
方法一:手动克隆(推荐,可审查代码)
# 克隆到个人技能目录
git clone https://github.com/author/skill-name.git \
~/.claude/skills/skill-name
# 或者只下载单个 SKILL.md
mkdir -p ~/.claude/skills/my-skill
curl -o ~/.claude/skills/my-skill/SKILL.md \
https://raw.githubusercontent.com/author/repo/main/SKILL.md
方法二:使用 clawhub CLI
npx clawhub@latest install <skill-name>
安装后重启 Claude Code 即可生效。
方法三:项目级技能(团队共享)
把 .claude/skills/ 目录纳入 git 版本管理:
# 将技能目录加入版本控制
git add .claude/skills/
git commit -m "chore: add team skills"
团队成员克隆仓库后,技能自动可用。
知名社区资源
| 仓库 | 内容 |
|---|---|
| hesreallyhim/awesome-claude-code | 技能、Hook、Agent 策划列表,含自治开发框架 |
| travisvn/awesome-claude-skills | 社区技能合集,含 TDD、调试、协作等模式 |
| ComposioHQ/awesome-claude-skills | 面向生产力的技能,含 MCP 构建器、子 Agent 开发 |
| rohitg00/awesome-claude-code-toolkit | 综合工具箱,含 135 个 Agent、35 个技能 |
| VoltAgent/awesome-agent-skills | 跨工具技能,同时兼容 Codex CLI、Gemini CLI |
安全提示:技能可以执行任意代码。安装前务必阅读
SKILL.md内容,像对待开源依赖一样审查来源。优先选择有一定 star 数、有 CI 验证、有活跃维护者的仓库。
七、上下文预算与技能命名的工程考量
技能数量越多,上下文预算的管理就越重要。
技能描述预算
所有技能名称始终加载,但 description 受到字符预算限制:
- 默认预算 = 上下文窗口的 1%(GPT-4 级别约 1280 字符,Claude 3.5 约 2000 字符)
- 单条 description 最多 250 个字符
- 超出预算时,Claude 会截断描述
提升预算:
export SLASH_COMMAND_TOOL_CHAR_BUDGET=16000
更根本的解法是精简 description:把最关键的触发场景放在前 30 个字,其余细节放到 SKILL.md 正文里。
技能命名策略
技能名即命令名,命名应该清晰表达”做什么”而不是”怎么做”:
# 好的命名
/commit # 生成提交信息
/security-review # 安全审查
/generate-api # 生成 API 接口
# 不好的命名
/helper # 模糊
/do-stuff # 无意义
/gpt-style-thing # 实现细节暴露
八、最佳实践总结
经过社区实践沉淀,以下是值得遵循的工程原则:
1. 一技能一工作流
不要把”代码审查 + 生成测试 + 写文档”塞进一个技能。拆成三个独立技能,可组合性更好,描述也更精准。
2. 控制技能正文长度
技能内容会占用上下文窗口。超过 500 词的技能,执行时会明显压缩可用的对话空间。把详细规范放到支持文件里,SKILL.md 只保留核心指令。
3. 用 disable-model-invocation 保护高风险操作
部署、数据库操作、发送消息等不可逆操作,一律设置 disable-model-invocation: true,要求用户显式触发。
4. 项目技能纳入版本控制
.claude/skills/ 目录跟代码一起提交,技能的变更走 PR 流程审查,团队规范就不会因为”只改了提示词”而绕过代码评审。
5. 用 user-invocable: false 构建隐式规范层
把项目的编码规范、架构约束写成 user-invocable: false 的技能,Claude 会在任何相关操作时自动参考,无需用户记住命令名。
结语
Skills 本质上是把提示词工程的成果固化为工程资产。它把”每次告诉 Claude 怎么做”变成”一次定义,反复复用”。
从单人开发者的个人效率工具,到团队共享的工程规范载体,Skills 的价值会随着使用深度指数级增长。
如果你发现自己在某个场景下反复输入同样的 prompt——那就是该写一个技能的信号。
参考资料
- Extend Claude with skills — 官方文档
- Slash Commands in the SDK — Claude API 文档
- anthropics/skills — Anthropic 官方技能仓库
- hesreallyhim/awesome-claude-code — 社区技能策划列表
- travisvn/awesome-claude-skills — 社区技能合集
- How to Build Claude Code Skills That Actually Work — DEV Community
- A Mental Model for Claude Code: Skills, Subagents, and Plugins — Level Up Coding