Claude Code Skills 完全指南

什么是 Claude Code Skills?

Skills(技能)是一种让 Claude 学会做特定事情的方式。 简单来说,它是你写给 Claude 的一份”操作手册”,告诉它遇到某类问题时应该怎么做。

Agent Skills are “organized folders of instructions, scripts, and resources that agents can discover and load dynamically” to enhance Claude’s capabilities. — Anthropic Engineering Blog

为什么需要 Skills?

想象这些场景:

  • 每次让 Claude 写 Git 提交信息,都要重复说明公司规范
  • 每次代码审查,都要提醒它检查哪些安全漏洞
  • 每次生成文档,都要告诉它用什么模板

Skills 就是为了解决这个问题 — 把这些重复的指导打包成一个可复用的”知识包”,Claude 会在需要时自动加载使用。

一个形象的比喻

想象你雇了一个非常聪明的助手(Claude),他什么都懂,但不了解你公司的具体规则。Skills 就像是你给他的一本《员工手册》:

  • “在我们公司,提交代码要用这种格式…”
  • “审查代码时,要特别注意这些安全问题…”
  • “写文档时,要用这个模板…”

有了这本手册,助手就能按照你的要求工作了。而且这本手册是可复用的 — 新来的同事(新项目)也能直接用。

Skills vs 其他概念

Claude Code 有多种扩展方式,很容易混淆。这里做个对比:

概念是什么什么时候用谁来触发类比
Skills教 Claude 做特定任务的”手册”需要专业知识或固定流程时Claude 自动判断员工手册
Slash Commands可复用的提示词模板需要手动触发特定操作时你输入 /命令快捷键
CLAUDE.md项目级别的通用指令每次对话都需要的规则每次对话自动加载公司规章
MCP Servers连接外部工具和数据需要访问数据库、API 等Claude 按需调用工具箱
Subagents独立运行的子任务代理需要隔离执行复杂任务时Claude 委派专职员工

简单记忆:

  • Skills = 教 Claude 怎么做(知识和流程)
  • MCP = 给 Claude 用什么做(工具和数据)
  • Subagents = 让 Claude 派人去做(委派任务)

Skills tell Claude how to use tools; MCP provides the tools. For example, an MCP server connects Claude to your database, while a Skill teaches Claude your data model and query patterns. — Claude Platform Docs

Skills 的工作原理

flowchart LR
    A[你的请求] --> B{Claude 分析}
    B --> C[匹配 Skill description]
    C --> D[加载 SKILL.md]
    D --> E[按指令执行]
    E --> F[返回结果]
  1. 启动时:Claude 加载所有 Skills 的 namedescription(元数据)
  2. 收到请求:Claude 分析你的请求,判断是否匹配某个 Skill
  3. 触发 Skill:如果匹配,Claude 读取完整的 SKILL.md 文件
  4. 按需加载:如果需要更多信息,Claude 读取引用的其他文件
  5. 执行并返回:按照指令完成任务

关键点:Claude 通过 description 来判断是否使用某个 Skill,这就是为什么 description 写得好非常重要。

预构建 Skills

Anthropic 提供了一些预构建的 Skills,可以直接使用:

Skill功能适用场景
PowerPoint (pptx)创建演示文稿、编辑幻灯片、分析内容需要生成或修改 PPT 时
Excel (xlsx)创建电子表格、分析数据、生成图表报告数据分析和报表生成
Word (docx)创建文档、编辑内容、格式化文本文档处理
PDF (pdf)生成格式化的 PDF 文档和报告报告生成

这些 Skills 在 Claude.ai 和 API 中开箱即用,无需额外配置。

快速开始:创建你的第一个 Skill

第一步:创建文件夹

Skills 存放在特定目录中:

Terminal window
# 个人 Skills(所有项目都能用)
mkdir -p ~/.claude/skills/my-first-skill
# 项目 Skills(只在当前项目生效,可以提交到 Git 分享给团队)
mkdir -p .claude/skills/my-first-skill

第二步:创建 SKILL.md 文件

每个 Skill 必须包含一个 SKILL.md 文件(注意大小写):

---
name: my-first-skill
description: 这是我的第一个 Skill,用于演示基本结构。当用户说"测试 Skill"时使用。
---
# 我的第一个 Skill
当用户请求帮助时,按以下步骤操作:
1. 首先说"你好,我是通过 Skill 激活的!"
2. 然后提供帮助
3. 最后问"还有什么我可以帮助的吗?"

第三步:测试 Skill

创建完成后,Skills 会自动加载。你可以:

方式一:自然语言触发

直接和 Claude 对话,说一些包含 description 中关键词的话:

测试 Skill

方式二:斜杠命令触发

/my-first-skill

方式三:调试模式

如果 Skill 没有触发,可以用调试模式查看原因:

Terminal window
claude --debug

SKILL.md 文件详解

基本结构

---
# ========== 元数据部分(YAML 格式)==========
name: skill-name # 必填:Skill 名称(小写字母、数字、连字符)
description: 描述信息 # 必填:什么时候用这个 Skill(最多 1024 字符)
---
# ========== 指令部分(Markdown 格式)==========
这里写 Claude 需要遵循的指令...

元数据字段完整说明

字段必填说明示例
nameSkill 标识符,只能用小写字母、数字、连字符,最多 64 字符code-review
description描述 Skill 做什么、什么时候用(最多 1024 字符)代码审查,检查安全漏洞和性能问题
allowed-tools允许使用的工具列表(逗号分隔)Read, Grep, Glob
model指定使用的模型claude-sonnet-4-20250514
context设为 fork 可在隔离环境中运行fork
agent配合 context: fork 使用,指定代理类型general-purpose
user-invocable是否在斜杠命令菜单中显示(默认 true)false
hooks定义生命周期钩子见下文

description 字段:决定 Skill 成败的关键

Claude 通过 description 来判断什么时候使用这个 Skill。 这不是简单的关键词匹配,而是语义理解。但写得好的 description 能大大提高触发准确率。

差的 description

# 问题:太模糊,Claude 不知道什么时候该用
description: 帮助写代码
# 问题:没有说明触发场景
description: 处理文档

好的 description

# 好:说明了做什么 + 什么时候用 + 包含用户可能说的关键词
description: 生成符合 Conventional Commits 规范的 Git 提交信息。当用户要求提交代码、写 commit message、或者提到 git commit 时使用。
# 好:具体、有触发词
description: 从 PDF 文件中提取文本和表格,填写表单,合并文档。当用户提到 PDF、表单、文档提取时使用。

description 写作技巧

  1. 回答两个问题

    • 这个 Skill 做什么?(列出具体能力)
    • 什么时候应该用它?(包含触发词)
  2. 使用第三人称

    • 好:Processes Excel files and generates reports
    • 差:I can help you process Excel files
  3. 包含用户可能说的关键词

    • 如果是代码审查 Skill,包含:review、审查、检查代码
    • 如果是文档生成 Skill,包含:生成文档、写 README、文档
  4. 与其他 Skills 区分开

    • 如果有多个相似的 Skills,确保 description 不同
    • 比如:一个是”销售数据分析”,一个是”日志文件分析”

name 字段命名规范

推荐使用动名词形式(动词 + ing):

# 推荐的命名方式
name: processing-pdfs
name: analyzing-spreadsheets
name: reviewing-code
name: generating-docs
# 也可以接受
name: pdf-processing
name: code-review
# 避免
name: helper # 太模糊
name: utils # 太通用
name: my-tool # 没有描述性

工具权限控制

为什么需要控制工具权限?

默认情况下,Skill 激活时 Claude 可以使用所有工具。但这可能带来风险:

  • 一个只需要读取文件的 Skill,不应该有删除文件的权限
  • 一个只需要运行 git 命令的 Skill,不应该能执行任意 shell 命令

通过 allowed-tools 可以限制 Skill 能使用的工具,提高安全性。

allowed-tools 语法

---
name: safe-reader
description: 安全地读取和分析代码
allowed-tools: Read, Grep, Glob
---

也可以用 YAML 列表格式:

---
name: safe-reader
description: 安全地读取和分析代码
allowed-tools:
- Read
- Grep
- Glob
---

常用工具列表

工具作用风险级别
Read读取文件内容
Glob按模式搜索文件名
Grep搜索文件内容
Write写入/创建文件
Edit编辑现有文件
Bash执行任意命令
WebFetch获取网页内容
WebSearch搜索网络

Bash 命令的细粒度控制

Bash 是最危险的工具,因为它可以执行任意命令。但有时候你又需要用到它。这时可以用细粒度控制:

# 只允许 git 相关命令
allowed-tools: Bash(git:*)
# 只允许特定的 git 命令
allowed-tools: Bash(git:status), Bash(git:diff), Bash(git:log)
# 允许 git 和 npm 命令
allowed-tools: Bash(git:*), Bash(npm:*)
# 允许 Python 和 Node.js
allowed-tools: Bash(python:*), Bash(node:*)
# 允许所有 Bash 命令(谨慎使用!)
allowed-tools: Bash

权限控制最佳实践

# 场景 1:只读分析
# 用途:代码分析、文档查阅
allowed-tools: Read, Grep, Glob
# 场景 2:Git 操作
# 用途:提交、查看历史
allowed-tools: Read, Bash(git:*)
# 场景 3:代码修改
# 用途:重构、格式化
allowed-tools: Read, Write, Edit, Grep, Glob
# 场景 4:测试运行
# 用途:运行单元测试
allowed-tools: Read, Bash(npm:test), Bash(pytest:*)

Skill 目录结构

基本结构

一个完整的 Skill 可以包含多个文件:

my-skill/
├── SKILL.md # 必需:主文件(入口)
├── scripts/ # 可选:可执行脚本
│ ├── validate.py # Python 脚本
│ └── format.sh # Shell 脚本
├── references/ # 可选:参考文档
│ ├── api-docs.md # API 文档
│ └── examples.md # 示例代码
└── assets/ # 可选:静态资源
├── template.json # 模板文件
└── config.yaml # 配置文件

各目录的用途和区别

目录用途加载方式Token 消耗
SKILL.md主文件,核心指令Skill 触发时加载加载即消耗
scripts/可执行脚本被 Claude 执行,不加载内容只消耗输出
references/参考文档被 Claude 读取到上下文读取时消耗
assets/静态资源按路径引用,不自动加载不消耗

渐进式披露(Progressive Disclosure)

这是 Skills 最重要的设计理念:只在需要时才加载信息

Progressive disclosure is the core design principle that makes Agent Skills flexible and scalable. Like a well-organized manual that starts with a table of contents, skills let Claude load information only as needed. — Anthropic Engineering Blog

flowchart TD
    A[启动 Claude Code] --> B[加载所有 Skills 的 name + description]
    B --> C[用户发送请求]
    C --> D{匹配到 Skill?}
    D -->|是| E[加载完整 SKILL.md]
    D -->|否| F[正常对话]
    E --> G{需要更多信息?}
    G -->|是| H[读取 references/ 中的文件]
    G -->|否| I[执行任务]
    H --> I

三层加载机制

Level何时加载Token 消耗内容
Level 1: 元数据启动时(始终加载)~100 tokens/SkillYAML 中的 namedescription
Level 2: 主文档Skill 被触发时小于 5k tokensSKILL.md 的完整内容
Level 3: 资源文件按需加载理论上无限制scripts/、references/ 等目录中的文件

为什么这很重要?

Claude 的上下文窗口是有限的,就像你的工作记忆一样。如果一次性加载所有信息:

  • 浪费 Token(增加成本)
  • 可能超出上下文限制
  • 干扰核心对话

渐进式披露让 Claude 只加载需要的信息,就像你查字典时只看需要的词条,而不是整本字典。这意味着你可以在一个 Skill 中打包大量参考资料,但只有真正用到的部分才会消耗 Token。

如何组织大型 Skill

当 SKILL.md 超过 500 行时,应该拆分:

方式一:按功能拆分

bigquery-analysis/
├── SKILL.md # 概览和导航
└── references/
├── finance.md # 财务数据分析
├── sales.md # 销售数据分析
├── product.md # 产品数据分析
└── marketing.md # 营销数据分析

SKILL.md 内容:

---
name: bigquery-analysis
description: 分析 BigQuery 数据,支持财务、销售、产品、营销等多种数据源
allowed-tools: Read, Grep
---
# BigQuery 数据分析
## 可用数据集
- **财务数据**:收入、账单 -> 参考 [references/finance.md](references/finance.md)
- **销售数据**:机会、管道 -> 参考 [references/sales.md](references/sales.md)
- **产品数据**:API 使用、功能 -> 参考 [references/product.md](references/product.md)
- **营销数据**:活动、归因 -> 参考 [references/marketing.md](references/marketing.md)
## 使用方法
1. 确定要分析的数据类型
2. 参考对应的文档了解表结构
3. 编写查询语句

方式二:按复杂度拆分

pdf-processing/
├── SKILL.md # 基础用法
├── FORMS.md # 表单填写(进阶)
├── REFERENCE.md # 完整 API 参考
└── scripts/
└── extract.py # 提取脚本

引用文件的正确方式

在 SKILL.md 中引用其他文件时,使用相对路径:

## 基础用法
提取 PDF 文本:
```python
import pdfplumber
with pdfplumber.open("file.pdf") as pdf:
text = pdf.pages[0].extract_text()

更多功能

**注意:避免嵌套引用**
```markdown
# 不好:引用链过长
SKILL.md -> advanced.md -> details.md -> actual-info.md
# 好:所有引用都在一级
SKILL.md -> advanced.md
SKILL.md -> details.md
SKILL.md -> api-reference.md

高级特性

隔离上下文(Fork Context)

当 Skill 执行复杂的多步骤操作时,会产生大量上下文信息,可能污染主对话。使用 context: fork 可以在独立环境中运行:

---
name: deep-analysis
description: 深度代码分析,生成详细报告
context: fork
agent: general-purpose
---

工作原理:

flowchart LR
    A[主对话] --> B[Fork 子环境]
    B --> C[执行复杂任务]
    C --> D[生成大量上下文]
    D --> E[汇总结果]
    E --> F[只返回结果给主对话]

好处:

  • 不会污染主对话的上下文
  • 避免 Token 超限
  • 只返回最终结果
  • 子环境有独立的上下文窗口

什么时候用:

  • 需要读取大量文件的分析任务
  • 多步骤的复杂工作流
  • 生成详细报告的任务

Hooks(钩子)

Hooks 允许你在 Skill 执行过程中运行自定义脚本,实现自动化。

Hook 类型

Hook触发时机用途
PreToolUse工具执行前验证、拦截、修改输入
PostToolUse工具执行后格式化、日志、后处理
StopSkill 结束时清理、汇总

基本语法

---
name: secure-deploy
description: 安全部署应用
hooks:
PreToolUse:
- matcher: "Bash"
hooks:
- type: command
command: "./scripts/security-check.sh"
once: true
---

实用示例

示例 1:自动格式化代码

---
name: code-writer
description: 编写代码并自动格式化
hooks:
PostToolUse:
- matcher: "Edit|Write"
hooks:
- type: command
command: |
file_path=$(jq -r '.tool_input.file_path')
if [[ "$file_path" == *.py ]]; then
black "$file_path" && isort "$file_path"
elif [[ "$file_path" == *.ts ]]; then
npx prettier --write "$file_path"
fi
---

示例 2:阻止危险操作

---
name: safe-editor
description: 安全编辑文件,阻止修改敏感文件
hooks:
PreToolUse:
- matcher: "Edit|Write"
hooks:
- type: command
command: |
file_path=$(jq -r '.tool_input.file_path')
if [[ "$file_path" == *.env* ]] || [[ "$file_path" == *credentials* ]]; then
echo "ERROR: Cannot modify sensitive files" >&2
exit 2 # exit 2 会阻止操作
fi
exit 0
---

示例 3:记录所有命令

---
name: audit-logger
description: 记录所有执行的命令
hooks:
PreToolUse:
- matcher: "Bash"
hooks:
- type: command
command: |
jq -r '"[$(date)] " + .tool_input.command' >> ~/.claude/audit.log
---

字符串替换变量

在 SKILL.md 中可以使用特殊变量:

变量说明示例
$ARGUMENTS调用 Skill 时传入的参数/my-skill arg1 arg2 中的 arg1 arg2
${CLAUDE_SESSION_ID}当前会话 ID用于日志关联

使用示例:

---
name: session-logger
description: 记录当前会话的活动
---
# 会话日志
将以下内容记录到 `logs/${CLAUDE_SESSION_ID}.log`
$ARGUMENTS
确保每条记录包含时间戳。

Skills 与 Subagents 集成

Subagents(子代理)是独立运行的 Claude 实例,可以执行隔离的任务。Skills 可以与 Subagents 配合使用。

给 Subagent 访问 Skills

默认情况下,Subagent 不会继承主对话的 Skills。需要显式指定:

.claude/agents/code-reviewer.md
---
name: code-reviewer
description: 代码审查专家
skills: security-check, performance-review
---
你是一个代码审查专家,专注于安全和性能问题。
使用 security-check 和 performance-review skills 来辅助分析。

Skills vs Subagents:如何选择

特性SkillsSubagents
执行环境主对话中独立上下文
上下文共享共享隔离
复用性高(多处可用)低(特定任务)
复杂度适合固定流程适合复杂决策
Token 消耗累积到主对话独立计算

选择建议:

  • Skills:当你需要可复用的知识或流程
  • Subagents:当你需要独立执行复杂任务

配合使用示例:

# Subagent: 文档分析员
---
name: doc-analyzer
description: 分析文档并生成报告
skills: pdf-extraction, text-summarization
---
1. 使用 pdf-extraction skill 提取文档内容
2. 使用 text-summarization skill 生成摘要
3. 返回结构化的分析报告

实战案例

案例 1:Git 提交助手(基础)

---
name: commit-helper
description: 生成符合 Conventional Commits 规范的提交信息。当用户要提交代码、写 commit message、或者说"帮我提交"时使用。
allowed-tools: Bash(git:*)
---
# Git 提交助手
## 工作流程
### 1. 检查状态
首先查看当前状态:
```bash
git status
```
### 2. 查看暂存区变更
```bash
git diff --cached --stat
```
如果没有暂存的变更,提示用户先 `git add`
### 3. 查看详细变更
```bash
git diff --cached
```
### 4. 确定提交类型
根据变更内容选择合适的类型:
| 类型 | 说明 | 示例 |
|:-----|:-----|:-----|
| `feat` | 新功能 | feat(auth): 添加用户登录功能 |
| `fix` | 修复 bug | fix(api): 修复登录接口 500 错误 |
| `docs` | 文档变更 | docs: 更新 API 文档 |
| `style` | 代码格式(不影响功能) | style: 格式化代码 |
| `refactor` | 重构(不是新功能也不是修复) | refactor(user): 重构用户模块 |
| `perf` | 性能优化 | perf: 优化列表加载速度 |
| `test` | 添加或修改测试 | test: 添加登录单元测试 |
| `build` | 构建系统或外部依赖 | build: 升级 webpack 到 v5 |
| `ci` | CI 配置 | ci: 添加 GitHub Actions |
| `chore` | 其他不修改源码的变更 | chore: 更新 .gitignore |
### 5. 生成提交信息
格式:`<type>(<scope>): <description>`
规则:
- 第一行不超过 72 个字符
- 使用祈使句("添加"而不是"添加了")
- 不要以句号结尾
- scope 是可选的,表示影响范围
### 6. 展示并确认
展示生成的提交信息,等待用户确认后执行:
```bash
git commit -m "提交信息"
```
如果用户想修改,根据反馈调整。

案例 2:代码审查助手(多轮)

---
name: code-review
description: 多轮代码审查,检查安全漏洞、性能问题和代码规范。当用户说 review、审查、检查代码时使用。
allowed-tools: Read, Grep, Glob, Bash(git:*)
---
# 代码审查助手
## 审查清单
复制此清单跟踪进度:
```
审查进度:
- [ ] 第一轮:变更概览
- [ ] 第二轮:深度分析
- [ ] 第三轮:整体评估
- [ ] 生成报告
```
## 第一轮:变更概览
### 1.1 获取变更文件
```bash
git diff --name-only HEAD~1
```
或者如果是 PR:
```bash
git diff --name-only main...HEAD
```
### 1.2 文件分类
将文件分为:
- **源代码**:.js, .ts, .py, .go 等
- **测试文件***_test.*, *.spec.*, test_* 等
- **配置文件**:.json, .yaml, .toml 等
- **文档**:.md, .txt 等
### 1.3 标记高风险区域
特别关注包含以下内容的文件:
- 认证/授权逻辑
- 数据库操作
- 文件系统操作
- 网络请求
- 加密/解密
- 用户输入处理
## 第二轮:深度分析
对每个高风险文件执行详细检查:
### 2.1 安全检查
搜索常见安全问题:
```bash
# SQL 注入风险
grep -n "execute\|query" --include="*.py" .
# XSS 风险
grep -n "innerHTML\|dangerouslySetInnerHTML" --include="*.tsx" --include="*.jsx" .
# 硬编码密钥
grep -n "password\|secret\|api_key\|token" --include="*.py" --include="*.js" .
```
### 2.2 性能检查
- N+1 查询问题
- 未使用的变量/导入
- 大循环中的 I/O 操作
- 未优化的正则表达式
### 2.3 代码质量检查
- 错误处理是否完善
- 边界条件是否处理
- 是否有代码重复
- 命名是否清晰
## 第三轮:整体评估
### 3.1 一致性检查
- 代码风格是否一致
- 命名规范是否统一
- 是否遵循项目约定
### 3.2 破坏性变更
- API 签名是否变化
- 数据库 schema 是否变化
- 配置格式是否变化
### 3.3 测试覆盖
- 新功能是否有测试
- 边界条件是否测试
- 错误路径是否测试
## 输出格式
```markdown
# 代码审查报告
## 概要
- 审查文件数:X
- 发现问题数:X(严重:X,警告:X,建议:X)
## 严重问题(必须修复)
### [问题标题]
- **文件**:path/to/file.py:42
- **问题**:具体描述
- **建议**:如何修复
## 警告(建议修复)
### [问题标题]
- **文件**:path/to/file.py:100
- **问题**:具体描述
- **建议**:如何修复
## 改进建议(可选)
- 建议 1
- 建议 2
```

案例 3:PDF 处理 Skill(带脚本)

目录结构:

pdf-processing/
├── SKILL.md
├── FORMS.md
├── scripts/
│ ├── extract_text.py
│ ├── extract_tables.py
│ └── fill_form.py
└── references/
└── api-reference.md

SKILL.md:

---
name: pdf-processing
description: 从 PDF 提取文本和表格,填写表单,合并文档。当用户提到 PDF、表单、文档提取时使用。
allowed-tools: Read, Bash(python:*)
---
# PDF 处理
## 快速开始
### 提取文本
```bash
python scripts/extract_text.py input.pdf
```
输出:提取的文本内容
### 提取表格
```bash
python scripts/extract_tables.py input.pdf --output tables.json
```
输出:JSON 格式的表格数据
### 填写表单
详见 [FORMS.md](FORMS.md)
## 依赖
确保安装了必要的包:
```bash
pip install pdfplumber pypdf
```
## API 参考
完整的函数说明见 [references/api-reference.md](references/api-reference.md)

scripts/extract_text.py:

#!/usr/bin/env python3
"""从 PDF 提取文本"""
import sys
import pdfplumber
def extract_text(pdf_path: str) -> str:
"""提取 PDF 中的所有文本"""
text_parts = []
try:
with pdfplumber.open(pdf_path) as pdf:
for i, page in enumerate(pdf.pages, 1):
page_text = page.extract_text()
if page_text:
text_parts.append(f"=== 第 {i} 页 ===\n{page_text}")
return "\n\n".join(text_parts)
except Exception as e:
return f"错误:{str(e)}"
if __name__ == "__main__":
if len(sys.argv) < 2:
print("用法:python extract_text.py <pdf_path>")
sys.exit(1)
result = extract_text(sys.argv[1])
print(result)

FORMS.md:

# PDF 表单填写
## 分析表单
首先分析 PDF 中的表单字段:
```bash
python scripts/fill_form.py --analyze input.pdf
```
输出示例:
```json
{
"fields": [
{"name": "name", "type": "text", "page": 1},
{"name": "email", "type": "text", "page": 1},
{"name": "date", "type": "date", "page": 1}
]
}
```
## 填写表单
创建一个 JSON 文件包含要填写的值:
```json
{
"name": "张三",
"email": "zhangsan@example.com",
"date": "2026-01-17"
}
```
然后填写:
```bash
python scripts/fill_form.py --fill input.pdf --data values.json --output filled.pdf
```
## 注意事项
- 确保字段名称匹配
- 日期格式使用 ISO 8601(YYYY-MM-DD)
- 复选框使用 true/false

案例 4:ML 实验知识库

这是一个真实的使用场景:团队用 Skills 来记录机器学习实验的经验。

目录结构:

ml-experiment-knowledge/
├── SKILL.md
└── experiments/
├── bert-fine-tuning.md
├── data-augmentation.md
└── hyperparameter-search.md

SKILL.md:

---
name: ml-experiments
description: 机器学习实验知识库,包含已验证的配置、失败的尝试和最佳实践。当用户询问 ML 实验、模型训练、超参数时使用。
allowed-tools: Read, Grep
---
# ML 实验知识库
## 已验证的实验
### BERT 微调
- **成功配置**:参考 [experiments/bert-fine-tuning.md](experiments/bert-fine-tuning.md)
- 学习率:2e-5
- Batch size:32
- 预热步数:10% of total
### 数据增强
- **有效技术**:参考 [experiments/data-augmentation.md](experiments/data-augmentation.md)
- 同义词替换:效果好
- 回译:效果很好
- 随机删除:效果一般
### 超参数搜索
- **搜索策略**:参考 [experiments/hyperparameter-search.md](experiments/hyperparameter-search.md)
- 推荐使用 Optuna
- 早停策略很重要
## 失败的尝试(避免重复)
1. **学习率过大**:> 1e-4 会导致训练不稳定
2. **Batch 太小**:< 16 会导致梯度噪声大
3. **不使用预热**:容易在初期发散
## 使用方法
询问我关于:
- 特定模型的训练配置
- 数据增强技术
- 超参数调优策略
- 避免已知的坑

案例 5:带验证循环的文档编辑

这个案例展示了如何使用反馈循环确保输出质量。

---
name: docx-editor
description: 编辑 Word 文档,支持修改文本、添加表格、更新样式。当用户要编辑 Word、docx 文件时使用。
allowed-tools: Read, Write, Bash(python:*)
---
# Word 文档编辑器
## 编辑工作流
复制此清单跟踪进度:
```
编辑进度:
- [ ] 1. 解压文档
- [ ] 2. 修改内容
- [ ] 3. 验证修改
- [ ] 4. 重新打包
- [ ] 5. 测试文档
```
## 步骤 1:解压文档
```bash
python scripts/unpack.py input.docx unpacked/
```
## 步骤 2:修改内容
编辑 `unpacked/word/document.xml`
## 步骤 3:验证修改(重要!)
**每次修改后立即验证:**
```bash
python scripts/validate.py unpacked/
```
如果验证失败:
1. 查看错误信息
2. 修复 XML
3. 重新验证
4. **验证通过后才能继续**
## 步骤 4:重新打包
```bash
python scripts/pack.py unpacked/ output.docx
```
## 步骤 5:测试文档
确保输出的文档可以正常打开。
## 常见错误
| 错误 | 原因 | 解决方法 |
|:-----|:-----|:---------|
| XML 解析错误 | 标签未闭合 | 检查所有标签是否配对 |
| 文档打不开 | 结构损坏 | 从步骤 1 重新开始 |
| 样式丢失 | 引用了不存在的样式 | 检查 styles.xml |

案例 6:YAPI 接口文档解析(带脚本 + 实际生产案例)

这是一个真实的生产级 Skill:从 YAPI 接口文档自动生成 Kotlin API 接口和 Bean 类,大幅减少 Android 开发中的重复工作。

为什么需要这个 Skill?

在移动端开发中,后端每新增一个接口,客户端就要手动编写对应的 API 定义和数据模型类。一个中等规模项目可能有上百个接口,每个接口都需要:

  • 阅读 YAPI 文档
  • 手写 Retrofit 接口方法
  • 手写 Request/Response Bean 类
  • 处理嵌套对象的映射

这个 Skill 把整个过程自动化了 — 只需要给 Claude 一个 YAPI 链接。

目录结构:

~/.claude/skills/smart-yapi/
├── SKILL.md # 主文件:执行步骤 + 代码生成规范
└── yapi_fetcher.py # Python 脚本:自动登录 YAPI 并获取接口数据

SKILL.md:

---
name: smart-yapi
description: 解析 YAPI 接口文档生成 Kotlin API 接口和 Bean 类。当用户提供 YAPI URL 或说"生成接口"、"解析yapi"、"yapi转kotlin"时触发。
allowed-tools: Read, Write, Edit, Glob, Grep, Bash(python:*)
---
# Smart YAPI - 解析 YAPI 文档生成接口
## 执行步骤
### 1. 使用 Python 脚本获取接口数据
```bash
python3 .claude/skills/smart-yapi/yapi_fetcher.py "<YAPI_URL>"
```
脚本会自动登录并返回 JSON 格式的接口数据,包含:
- title: 接口名称
- path: 接口路径
- method: 请求方法
- req_body_schema: 请求参数 JSON Schema
- res_body_schema: 返回数据 JSON Schema
### 2. 解析 JSON Schema 生成代码
根据脚本输出的 JSON 数据:
1. 检查是否已存在相关的 ReqBean/ResBean(使用 Glob/Grep)
2. 生成 API 接口定义
3. 生成必要的 Bean 类
## 项目文件位置
- **API 接口文件**: `component_io/src/main/java/com/example/component_io/api/`
- **Bean 类文件**: `component_io/src/main/java/com/example/component_io/bean/`
## 代码生成规范
### API 接口格式
```kotlin
/**
* 接口描述
* @param requestBody 参数说明
*/
@POST("/api/path")
suspend fun requestXxx(@Body requestBody: XxxReqBean): BaseBean<XxxResBean>
```
### Bean 类格式
```kotlin
package com.example.component_io.bean
import java.io.Serializable
/**
* 类描述
*/
class XxxBean : Serializable {
/**
* 字段描述
*/
var field1: String? = null
/**
* 字段描述
*/
var field2: Int? = null
/**
* 嵌套类描述
*/
class InnerBean : Serializable {
var innerField: String? = null
}
}
```
### 命名规范
- 方法名: `request` + 功能描述(驼峰)
- 请求 Bean: 功能描述 + `ReqBean`
- 响应 Bean: 功能描述 + `ResBean`
- 嵌套类: 描述性名称 + `Bean`
### 类型映射
| JSON Schema 类型 | Kotlin 类型 |
|-----------------|-------------|
| string | String? |
| integer | Int? |
| number | Double? |
| boolean | Boolean? |
| array | List\<T\>? |
| object | 生成嵌套 Bean 类 |
### 注意事项
1. **Bean 复用策略**
- 字段名相同 **** 字段含义/注释相同 -> 可以复用已有 Bean
- 字段名相同 **** 字段含义/注释不同 -> 创建新的独立 Bean
- 复用前需读取已有 Bean 文件,对比字段和注释
2. 如果 API 接口文件中已有未完成的接口定义,直接补全
3. 必须字段在注释中标注 `(必须)`
4. 分页响应通常包含:totalCount、totalPage、currentPage、pageSize、data、finished
5. 简单的返回类型直接使用 `BaseBean<Int>``BaseBean<String>`
6. 无请求参数的接口使用 `RequestEmptyBean`

yapi_fetcher.py:

#!/usr/bin/env python3
"""
YAPI 接口数据提取脚本
直接通过 YAPI API 获取接口详情,输出 JSON 格式数据
"""
import json
import re
import sys
import requests
# 通过环境变量或配置文件管理凭证(不要硬编码!)
YAPI_BASE_URL = "http://yapi.your-company.com:3000"
YAPI_EMAIL = "your-email@company.com"
YAPI_PASSWORD = "your-password"
def login(session: requests.Session) -> bool:
"""登录 YAPI"""
resp = session.post(
f"{YAPI_BASE_URL}/api/user/login",
json={"email": YAPI_EMAIL, "password": YAPI_PASSWORD}
)
data = resp.json()
return data.get("errcode") == 0
def parse_url(url: str) -> tuple[str, str]:
"""从 URL 解析 project_id 和 interface_id"""
# http://yapi.your-company.com:3000/project/123/interface/api/456
match = re.search(r'/project/(\d+)/interface/api/(\d+)', url)
if match:
return match.group(1), match.group(2)
raise ValueError(f"无法解析 URL: {url}")
def get_interface_detail(session: requests.Session, interface_id: str) -> dict:
"""获取接口详情"""
resp = session.get(
f"{YAPI_BASE_URL}/api/interface/get",
params={"id": interface_id}
)
data = resp.json()
if data.get("errcode") != 0:
raise Exception(f"获取接口详情失败: {data.get('errmsg')}")
return data.get("data", {})
def format_output(interface_data: dict) -> dict:
"""格式化输出数据"""
req_body_other = interface_data.get("req_body_other", "")
req_body = {}
if req_body_other:
try:
req_body = json.loads(req_body_other)
except json.JSONDecodeError:
pass
res_body = interface_data.get("res_body", "")
response = {}
if res_body:
try:
response = json.loads(res_body)
except json.JSONDecodeError:
pass
return {
"title": interface_data.get("title", ""),
"path": interface_data.get("path", ""),
"method": interface_data.get("method", "POST"),
"desc": interface_data.get("desc", ""),
"req_headers": interface_data.get("req_headers", []),
"req_body_type": interface_data.get("req_body_type", ""),
"req_body_schema": req_body,
"res_body_type": interface_data.get("res_body_type", ""),
"res_body_schema": response,
}
def main():
if len(sys.argv) < 2:
print("用法: python yapi_fetcher.py <YAPI_URL>", file=sys.stderr)
sys.exit(1)
url = sys.argv[1]
try:
project_id, interface_id = parse_url(url)
except ValueError as e:
print(str(e), file=sys.stderr)
sys.exit(1)
session = requests.Session()
if not login(session):
print("登录失败", file=sys.stderr)
sys.exit(1)
try:
interface_data = get_interface_detail(session, interface_id)
output = format_output(interface_data)
print(json.dumps(output, ensure_ascii=False, indent=2))
except Exception as e:
print(f"获取接口数据失败: {e}", file=sys.stderr)
sys.exit(1)
if __name__ == "__main__":
main()

这个案例的设计亮点:

  1. 脚本 + 指令分离:Python 脚本负责数据获取(登录、解析 URL、调用 API),SKILL.md 负责代码生成规范。Claude 执行脚本拿到结构化数据后,按照规范生成代码
  2. 细粒度权限控制allowed-tools: Read, Write, Edit, Glob, Grep, Bash(python:*) — 只允许执行 Python 命令,不能执行任意 Shell 命令
  3. Bean 复用策略:明确了什么时候复用已有类、什么时候创建新类,避免了代码重复或误复用
  4. description 包含多种触发词:中英文混合的触发词(“生成接口”、“解析yapi”、“yapi转kotlin”),覆盖不同的表达习惯
  5. 存放在个人目录~/.claude/skills/ 而非项目 .claude/skills/,因为这个 Skill 跨多个 Android 项目使用

使用效果:

你:帮我解析这个接口 http://yapi.your-company.com:3000/project/123/interface/api/456
Claude:[自动执行 yapi_fetcher.py 获取接口数据]
[检查已有 Bean 类是否可复用]
[生成 API 接口定义和 Bean 类]
[写入对应文件]

整个过程从”给链接”到”代码生成完毕”只需要几秒钟,而手动操作通常需要 10-20 分钟。

Skills 在不同平台的使用

Skills 可以在多个 Claude 产品中使用,但有一些差异:

平台支持的 Skills共享范围网络访问
Claude.ai预构建 + 自定义仅个人根据设置可变
Claude API预构建 + 自定义工作区共享无网络访问
Claude Code仅自定义个人或项目级完全访问
Agent SDK仅自定义文件系统配置根据环境

重要提示:不同平台的 Skills 不会自动同步。在一个平台上传的 Skill 需要单独在其他平台配置。

Skills 存放位置与分发

存放位置优先级

从高到低(高优先级的会覆盖低优先级的同名 Skill):

  1. 企业托管 - 组织统一管理(适合公司统一规范)
  2. 个人 Skills - ~/.claude/skills/(你自己的工作习惯)
  3. 项目 Skills - .claude/skills/(团队共享)
  4. 插件 Skills - 通过插件安装(社区共享)

选择建议

场景推荐位置理由
个人工作习惯~/.claude/skills/跨项目使用,不影响他人
团队共享规范.claude/skills/(提交到 Git)团队成员都能用
公司统一规范企业托管确保所有人遵循
跨项目复用打包为插件方便分发和版本管理

Monorepo 支持

Claude Code 会自动发现嵌套目录中的 Skills:

monorepo/
├── .claude/skills/ # 根级 Skills(所有人都能用)
│ └── commit-helper/
├── packages/
│ ├── frontend/
│ │ └── .claude/skills/ # 前端专用 Skills
│ │ └── react-component/
│ └── backend/
│ └── .claude/skills/ # 后端专用 Skills
│ └── api-generator/

当你在 packages/frontend/ 下工作时,可以使用:

  • commit-helper(根级)
  • react-component(前端专用)

通过插件分发

创建插件市场

  1. 创建一个 GitHub 仓库
  2. 添加 .claude-plugin 配置文件
  3. skills/ 目录下放置 Skills
my-marketplace/
├── .claude-plugin
├── skills/
│ ├── skill-1/
│ │ └── SKILL.md
│ └── skill-2/
│ └── SKILL.md
└── README.md

安装插件

Terminal window
# 添加插件市场
/plugin marketplace add username/repo-name
# 安装特定 Skill
/plugin install skill-name@marketplace-name

官方和社区资源

资源地址说明
Anthropic 官方anthropics/skills官方示例和文档处理 Skills
SkillsMPskillsmp.com63,000+ 社区 Skills
awesome-claude-skillsGitHub精选 Skills 列表

调试与故障排除

Skill 没有触发

检查清单:

  1. 检查 description

    • 是否包含用户可能说的关键词?
    • 是否太模糊?
    • 试试在对话中使用 description 中的词
  2. 检查文件名和路径

    • 文件必须叫 SKILL.md(大小写敏感)
    • 确认在正确的目录下
  3. 检查 YAML 语法

    • 不能用 Tab,必须用空格
    • 检查冒号后是否有空格
    • 用 YAML 验证器检查
  4. 重启 Claude Code

    • 有时候需要重新加载 Skills
  5. 使用调试模式

    Terminal window
    claude --debug

Skill 报错

常见错误和解决方法:

错误可能原因解决方法
脚本无法执行没有执行权限chmod +x scripts/*.py
ModuleNotFoundError依赖未安装pip install package-name
工具不可用allowed-tools 限制添加需要的工具
YAML 解析错误语法错误检查缩进和特殊字符

上下文太长

症状: Claude 说上下文超限,或者响应被截断

解决方法:

  1. 使用 context: fork

    ---
    name: heavy-analysis
    context: fork
    ---
  2. 拆分文件

    • 把大文件拆成小文件
    • 只在需要时引用
  3. 减少输出

    • 让 Skill 返回摘要而不是完整内容
    • 使用分页
  4. 清理会话

    /clear

触发了错误的 Skill

原因: 多个 Skills 的 description 太相似

解决方法:

  1. 使用更具体的触发词
  2. 在 description 中明确区分
  3. 考虑合并相似的 Skills

最佳实践总结

根据 Anthropic 官方指南,以下是开发 Skills 的四大原则:

1. 从评估开始(Start with Evaluation)

不要凭空创建 Skills,而是先观察 Claude 在哪些任务上需要额外帮助:

开发流程:
1. 在真实任务中观察 Claude 的表现
2. 识别它经常需要重复指导的地方
3. 针对这些具体问题创建 Skill
4. 用真实场景测试和迭代

2. 为规模化而设计(Structure for Scale)

- SKILL.md 保持在 500 行以内
- 详细内容放到 references/
- 脚本放到 scripts/
- 模板放到 assets/
- 如果内容很少同时使用,拆分到不同文件减少 Token 消耗

3. description 写作

# 差:太模糊
description: 帮助处理代码
# 好:具体 + 触发词 + 说明何时用
description: 生成符合 Conventional Commits 规范的 Git 提交信息。当用户说"提交代码"、"commit"、"写提交信息"时使用。

4. 从 Claude 的视角思考(Think from Claude’s Perspective)

监控和迭代:
1. 观察 Claude 如何使用你的 Skill
2. 注意意外的使用模式或过度依赖某些内容
3. 让 Claude 自我反思失败案例
4. 把成功的模式固化到 Skill 中

5. 权限控制(最小权限原则)

# 只读分析
allowed-tools: Read, Grep, Glob
# 需要修改时才加
allowed-tools: Read, Write, Edit
# Git 操作
allowed-tools: Read, Bash(git:*)

6. 流程设计

## 工作流程
1. **验证前置条件**
- 检查必要文件存在
- 确认用户权限
2. **执行操作**
- 步骤清晰
- 每步都可验证
3. **验证结果**
- 确认操作成功
- 提供回滚方案
4. **敏感操作需确认**
- 展示将要执行的命令
- 等待用户确认

安全注意事项

We strongly recommend using Skills only from trusted sources: those you created yourself or obtained from Anthropic. — Claude Platform Docs

不要做的事

  1. 不要硬编码敏感信息

    # 绝对不要这样做!
    api_key: "sk-xxx..."
    password: "123456"
  2. 不要给过多权限

    # 避免
    allowed-tools: Bash
    # 更安全
    allowed-tools: Bash(git:*), Bash(npm:test)
  3. 不要盲目信任第三方 Skills

    • 使用前先检查代码
    • 特别注意 scripts/ 目录
    • 警惕从外部 URL 获取数据的 Skills

应该做的事

  1. 限制 Bash 权限 - 使用细粒度控制
  2. 审查第三方代码 - 检查所有捆绑的文件
  3. 敏感操作要确认 - 展示命令并等待用户确认
  4. 使用环境变量存储密钥 - 不要在 Skill 中硬编码

安全审查清单

在使用第三方 Skill 之前,检查以下内容:

  • SKILL.md 中的指令是否合理
  • scripts/ 目录中的脚本是否有可疑操作
  • 是否有意外的网络调用
  • 是否有异常的文件访问模式
  • 操作是否与 Skill 声明的目的一致

参考资源

官方文档

代码仓库

社区资源

教程与文章

Read Next

Claude Code Architecture Deep Dive

Read Previous

AI 编程工具可靠性深度分析