首页 › tutorials › Claude Code Skill开发实战:从创建到发布全流程

Claude Code Skill开发实战:从创建到发布全流程

学习目标:掌握Claude Code Skill从零开发、测试调优到团队分发的完整工作流,理解渐进式披露架构的设计哲学,独立构建生产级自定义Skill。

适用人群:已有Claude Code基础使用经验的开发者,希望将重复性工作流封装为可复用的自动化Skill。


一、Skill是什么:三种配置机制的定位

Claude Code有三种核心配置机制,各有明确边界:

机制 文件位置 加载时机 典型场景
CLAUDE.md 项目根或~/.claude/ 每次会话自动加载 项目规范、团队约定、全局偏好
Custom Command .claude/commands/*.md 用户输入/<command>手动触发 一次性脚本、快速操作
Skill .claude/skills/<name>/SKILL.md 按需自动匹配或手动调用 复杂工作流、领域专家知识、多步骤任务

三者的核心区别在于加载粒度。CLAUDE.md全量加载、Command手动加载、Skill则采用渐进式披露(Progressive Disclosure)——系统先用约100 token的元数据判断相关性,只在匹配时才加载完整指令。这意味着即使安装了100个Skill,也不会挤占上下文窗口。

.claude/
├── CLAUDE.md                          # 项目级全局指令
├── skills/
│   ├── code-review/
│   │   ├── SKILL.md                   # Skill主文件
│   │   ├── templates/                 # 支撑资源
│   │   │   └── review-checklist.md
│   │   └── examples/
│   │       └── sample-review.md
│   ├── api-doc-generator/
│   │   ├── SKILL.md
│   │   └── resources/
│   │       └── openapi-template.yaml
│   └── deploy/
│       └── SKILL.md
├── commands/                          # 自定义命令(已逐渐融入Skill体系)
│   └── quick-fix.md
└── settings.json

二、SKILL.md解剖:Frontmatter与指令体

每个Skill的核心是一个SKILL.md文件,由YAML Frontmatter和Markdown指令体两部分组成。

2.1 Frontmatter字段全解

---
name: api-doc-generator
description: >
  从Express/FastAPI路由代码自动生成OpenAPI 3.0规范文档。
  当用户提到"生成API文档"、"OpenAPI"、"Swagger规范"时触发。
  支持从JSDoc/Python type hints自动提取参数与响应类型。
trigger: |
  用户提到以下任一场景时触发:
  - 生成或更新OpenAPI/Swagger文档
  - 从代码提取API端点信息
  - API文档化、接口文档
  用户主动调用 /api-doc-generator 时直接加载。
allowed-tools:
  - Read
  - Write
  - Glob
  - Grep
  - Bash(npx swagger-cli validate *)
disabled: false
version: 1.2.0
author: your-team
---

关键字段说明:

字段 必填 作用
name 是 Skill唯一标识,用于/name手动调用
description 是 约50-150字,描述功能与触发场景。这是渐进式披露的第一层——Claude仅凭这段文字判断是否加载完整Skill
trigger 否 明确列出触发条件,提高自动匹配准确率
allowed-tools 否 声明Skill需要使用的工具白名单,未列出的工具默认需要用户确认
disabled 否 设为true可临时禁用Skill而不删除文件

2.2 指令体:分阶段写法

指令体采用最小上下文原则——只写Claude执行任务时需要的信息,避免冗余解释。

---
name: api-doc-generator
description: 从路由代码生成OpenAPI 3.0规范文档
---

# API文档生成器

## 触发条件
当用户要求生成API文档、OpenAPI规范、Swagger文档时触发。

## 工作流程

### 第1步:发现路由文件
使用Glob定位所有路由定义文件:
- Express: `**/routes/**/*.{js,ts}` 或文件中包含 `router.(get|post|put|delete)`
- FastAPI: `**/*.py` 中包含 `@router` 或 `@app` 装饰器
- NestJS: `**/*.controller.ts`

### 第2步:提取端点信息
对每个路由文件,提取:
- HTTP方法和路径
- 请求参数(query/path/body)
- 认证要求
- 响应类型和状态码
- JSDoc/Python type hints中的描述

### 第3步:生成OpenAPI规范
输出完整的`openapi.yaml`文件,包含:
- `info`区块(从package.json读取项目名称和版本)
- `paths`区块(所有端点)
- `components/schemas`(复用类型定义)
- `securitySchemes`(如果检测到认证中间件)

### 第4步:验证
运行 `npx swagger-cli validate openapi.yaml` 确认规范正确。

## 输出格式
- 文件路径: `docs/openapi.yaml`
- 如已存在,增量更新而非覆盖

## 约束
- 不生成伪造的端点,只文档化实际存在的路由
- 响应schema必须与代码中的类型定义一致
- 遇到无法推断的类型时,标记为`object`并在注释中提醒用户

三、渐进式披露:三层加载架构

理解渐进式披露是写出高效Skill的关键。系统按需加载三个层次:

flowchart TB
    subgraph "第1层:元数据索引 (~100 tokens)"
        A["name + description"] --> B{匹配用户意图?}
    end
    B -->|否| C["跳过,不消耗更多token"]
    B -->|是| D["加载SKILL.md完整内容"]

    subgraph "第2层:核心指令 (500-2000 tokens)"
        D --> E["工作流程步骤"]
        E --> F["约束条件"]
        F --> G{需要参考资源?}
    end
    G -->|否| H["直接执行任务"]
    G -->|是| I["按需读取resources/"]

    subgraph "第3层:支撑资源 (按需加载)"
        I --> J["模板文件"]
        I --> K["示例文件"]
        I --> L["参考文档"]
    end

    J --> H
    K --> H
    L --> H

设计原则:

  1. Description是门面:写好description比写长指令体更重要。它决定了Skill能否被正确触发。包含触发关键词和适用场景。
  2. 指令体是骨架:保持500-2000 token,只写执行步骤和约束,不写背景知识。
  3. 资源是肌肉:模板、示例、参考文档放在子目录,按需引用,不占用基础上下文。

四、实战:构建一个Git提交规范化Skill

下面从零构建一个完整的生产级Skill,强制执行Conventional Commits规范。

第1步:创建目录结构

mkdir -p ~/.claude/skills/conventional-commit

第2步:编写SKILL.md

---
name: conventional-commit
description: >
  Git提交规范化助手。根据暂存区的代码变更自动生成符合Conventional Commits规范的提交信息。
  当用户要求commit、提交代码、写commit message时触发。
  支持type自动推断、scope提取、breaking change检测。
trigger: |
  用户提到commit、提交、commit message、git commit时触发。
  不在用户讨论Git其他操作(push、pull、merge)时触发。
allowed-tools:
  - Bash(git status *)
  - Bash(git diff *)
  - Bash(git log *)
  - Bash(git add *)
  - Bash(git commit *)
---

# Conventional Commit 规范化助手

## 工作流程

### 第1步:分析变更
1. 运行 `git status` 查看暂存区和工作区状态
2. 运行 `git diff --cached` 查看已暂存的变更
3. 运行 `git diff` 查看未暂存的变更
4. 运行 `git log --oneline -10` 了解最近提交风格

### 第2步:推断type
根据变更内容推断commit type:
- `feat`: 新增功能、新增文件、新增路由/端点
- `fix`: 修复bug、修正错误行为、修复测试
- `docs`: 仅文档变更(README、注释、JSDoc)
- `style`: 代码格式调整,不影响逻辑(空格、分号、import排序)
- `refactor`: 重构,既非新功能也非修复(重命名、提取函数、移动文件)
- `perf`: 性能优化(缓存、惰性加载、查询优化)
- `test`: 新增或修改测试
- `ci`: CI/CD配置变更(GitHub Actions、Dockerfile)
- `chore`: 构建工具、依赖更新、配置文件

### 第3步:提取scope
- 从变更文件路径推断scope(如 `src/auth/` → scope为 `auth`)
- 如果涉及多个scope,选择影响最大的一个
- 如果无法确定,省略scope

### 第4步:检测Breaking Change
- 查找 `BREAKING CHANGE:` 或 `BREAKING-CHANGE:` 注释
- 检查是否删除了公开API、重命名了导出函数、修改了配置格式
- 如检测到,在type后加 `!` 并在footer中说明

### 第5步:生成提交信息
格式:

(): <描述>

[可选的详细说明,每行不超过72字符]

[可选的footer]

规则:
- 描述用祈使句("add feature" 非 "added feature")
- 描述不超过50字符
- 不以句号结尾
- 如有Co-Author-By信息,保留在footer

### 第6步:执行提交
- 使用HEREDOC格式传递commit message
- 提交后运行 `git status` 确认成功

## 约束
- 不自动 `git add`,只提交已暂存的文件
- 不自动push
- 如果暂存区为空,提醒用户先暂存文件
- 遵循项目已有的commit风格(从git log学习)

第3步:添加支撑资源

创建模板文件 ~/.claude/skills/conventional-commit/resources/type-examples.md:

# Type推断示例

## feat
- 新增 `src/api/users.ts` 文件,包含用户CRUD端点
- 在 `index.ts` 中新增路由注册
- 添加新的环境变量配置项

## fix
- 修复 `validateToken` 在过期时间为null时的空指针异常
- 修正用户角色权限检查的逻辑错误
- 修复测试中的mock数据与实际schema不匹配

## refactor
- 将 `UserService` 拆分为 `UserQueryService` 和 `UserCommandService`
- 将公共工具函数从 `utils.ts` 提取到 `shared/utils.ts`
- 重命名 `getUserById` → `findUserById`

第4步:验证安装

在Claude Code中输入:

> /conventional-commit 帮我提交代码

或直接对话触发:

> 请帮我commit当前的变更

Claude会自动匹配Skill并按照工作流执行。


五、多文件Skill Bundle

当Skill需要更多支撑材料时,可以组织为多文件Bundle:

.claude/skills/api-doc-generator/
├── SKILL.md                    # 核心指令
├── resources/
│   ├── openapi-template.yaml   # OpenAPI模板
│   ├── express-patterns.md     # Express路由识别模式
│   └── fastapi-patterns.md     # FastAPI路由识别模式
├── examples/
│   ├── sample-input.ts         # 示例输入代码
│   └── sample-output.yaml      # 示例输出文档
└── TROUBLESHOOTING.md          # 调试指南

在SKILL.md中引用资源文件:

### 第3步:生成规范
参考 `resources/openapi-template.yaml` 生成基础结构。
参照 `examples/sample-output.yaml` 的格式。

Claude会按需读取这些文件,而不是在初始加载时全部注入上下文。


六、Skill质量评估与调优

6.1 使用skill-creator内置评估

Anthropic在2026年推出的Skills 2.0为skill-creator引入了评估框架:

# 在Claude Code中使用skill-creator进行评估
> 使用skill-creator评估我的conventional-commit skill

评估维度包括: - 触发率(Trigger Rate):用户意图匹配到Skill的比例 - 指令遵循度(Instruction Compliance):Claude执行时是否严格遵循步骤 - 输出质量(Output Quality):最终产出的准确性和完整性 - Token效率(Token Efficiency):执行过程中消耗的token数

6.2 手动A/B测试

flowchart LR
    A["编写Skill v1"] --> B["运行10次测试任务"]
    B --> C["记录触发率和输出质量"]
    C --> D["修改description/指令体 → v2"]
    D --> E["运行相同10次测试任务"]
    E --> F["对比v1 vs v2"]
    F --> G{v2更优?}
    G -->|是| H["采用v2"]
    G -->|否| I["回退v1,调整方向"]
    I --> D

A/B测试关注点:

  1. Description变体测试:同一个Skill写2-3个不同description,测试哪个触发率最高
  2. 指令长度测试:对比简洁版和详细版的输出质量差异
  3. Trigger条件测试:检查是否出现误触发(不该触发时触发)或漏触发(该触发时未触发)

6.3 常见质量问题和修复

问题 症状 修复方法
漏触发 明确提到相关场景但Skill未加载 在description中增加同义词和场景描述
误触发 无关任务也触发了Skill 收窄trigger条件,增加排除场景
步骤遗漏 Claude跳过了某些步骤 为关键步骤增加明确的编号和强制检查点
输出不一致 同样的输入产生不同的输出格式 增加"输出格式"section,提供模板
Token浪费 执行消耗过多token 精简指令体,将背景知识移到resources/

七、触发问题调试指南

7.1 Skill未被触发的八大原因

flowchart TD
    A["Skill未触发"] --> B{"文件路径正确?"}
    B -->|否| C["修正路径:<br/>.claude/skills/name/SKILL.md"]
    B -->|是| D{"description足够具体?"}
    D -->|否| E["增加触发关键词<br/>和场景描述"]
    D -->|是| F{"与CLAUDE.md冲突?"}
    F -->|是| G["CLAUDE.md可能包含<br/>矛盾的指令"]
    F -->|否| H{"disabled: true?"}
    H -->|是| I["设为false"]
    H -->|否| J{"settings.json中<br/>被禁用?"}
    J -->|是| K["检查settings.json<br/>skills配置"]
    J -->|否| L{"与其他Skill冲突?"}
    L -->|是| M["合并或差异化<br/>description"]
    L -->|否| N["用斜杠命令手动测试<br/>/skill-name"]

7.2 调试命令

# 检查Skill是否被识别
ls -la ~/.claude/skills/conventional-commit/SKILL.md

# 验证YAML语法
head -20 ~/.claude/skills/conventional-commit/SKILL.md

# 在Claude Code中强制触发
> /conventional-commit

# 查看Skill加载状态
> 你加载了哪些Skills?请列出所有已安装的Skill名称和描述

八、团队分发:从个人到组织

8.1 通过Git仓库分发

最推荐的团队分发方式——将Skill纳入项目仓库:

# 项目级Skill(跟随项目)
.claude/skills/conventional-commit/SKILL.md

# 全局Skill(跟随个人)
~/.claude/skills/conventional-commit/SKILL.md

团队协作最佳实践:

  1. 项目Skill提交到仓库:放在项目的.claude/skills/目录下,通过Git共享
  2. 团队规范Skill优于个人Skill:避免同名Skill导致冲突
  3. .claude/目录提交到Git:但排除.claude/settings.local.json(含个人配置)

8.2 通过Plugin Marketplace分发

2026年Claude Code支持Plugin Marketplace机制:

# 发布到marketplace(使用publishing-a-claude-skill skill)
> 使用publishing-a-claude-skill发布我的conventional-commit skill

# 安装他人发布的Skill
claude skill install @author/conventional-commit

8.3 通过GitHub仓库批量安装

# 从GitHub仓库安装
git clone https://github.com/anthropics/skills.git /tmp/skills
cp -r /tmp/skills/conventional-commit ~/.claude/skills/

# 或使用社区工具
npx -y claude-skills-cli install conventional-commit

九、高级模式:Skill组合与链式调用

9.1 Skill之间的协作

多个Skill可以协同工作。例如,一个完整的代码发布流程可能涉及:

sequenceDiagram
    participant U as 用户
    participant CR as code-review Skill
    participant CC as conventional-commit Skill
    participant DP as deploy Skill

    U->>CR: /code-review 审查PR
    CR->>CR: 分析代码变更
    CR-->>U: 审查报告+修改建议
    U->>CC: /conventional-commit 提交
    CC->>CC: 分析暂存区
    CC-->>U: 生成规范commit
    U->>DP: /deploy 发布到staging
    DP->>DP: 执行部署流水线
    DP-->>U: 部署结果

9.2 带参数的Skill

Skill可以接受用户参数,在指令体中用自然语言描述参数处理逻辑:

---
name: scaffold
description: >
  代码脚手架生成器。根据指定类型和名称生成项目文件。
  支持类型: component, service, hook, util。
trigger: |
  用户提到"生成"、"创建"、"新建"并包含以下类型时触发:
  component、service、hook、util
  格式: /scaffold <type> <name>
---

十、完整实战项目:API文档生成器Skill

将前面学到的所有知识整合,构建一个完整的多文件Skill Bundle。

项目结构

~/.claude/skills/api-doc-generator/
├── SKILL.md
├── resources/
│   ├── openapi-skeleton.yaml
│   └── type-mapping.md
└── examples/
    └── sample-output.yaml

SKILL.md完整内容

---
name: api-doc-generator
description: >
  从Express/FastAPI/NestJS路由代码自动生成OpenAPI 3.0规范文档。
  支持从JSDoc、Python type hints、TypeScript interface自动提取参数与响应类型。
  当用户提到生成API文档、OpenAPI、Swagger规范、接口文档时触发。
trigger: |
  触发场景:
  - 生成/更新OpenAPI文档或Swagger规范
  - 从代码提取API端点信息
  - API文档化
  排除:仅讨论API设计而不需要生成文档时不要触发。
allowed-tools:
  - Read
  - Write
  - Glob
  - Grep
  - Bash(npx swagger-cli validate *)
---

# API文档生成器

## 工作流程

### 第1步:识别框架
检测项目使用的后端框架:
- Express: 查找 `express` 依赖和 `app.get/post/put/delete` 调用
- FastAPI: 查找 `fastapi` 依赖和 `@app.get/post` 装饰器
- NestJS: 查找 `@nestjs/core` 依赖和 `@Controller` 装饰器

### 第2步:发现路由文件
根据框架使用Glob模式定位:
- Express: `**/routes/**/*.{js,ts}`, `**/router*.{js,ts}`
- FastAPI: `**/*.py`(过滤包含 `@router` 或 `@app` 的文件)
- NestJS: `**/*.controller.ts`

### 第3步:提取端点信息
对每个路由文件提取:
1. HTTP方法和路径(如 `GET /api/users/:id`)
2. 路径参数、查询参数、请求体
3. 认证/授权要求(从中间件推断)
4. 响应类型和状态码
5. JSDoc/TypeScript/Python中的描述文字

### 第4步:读取类型定义
使用Grep查找相关的interface/type/class定义:
- TypeScript: `interface User`, `type UserResponse`
- Python: `class User(BaseModel)`
将类型映射为OpenAPI schema。

### 第5步:生成OpenAPI规范
参考 `resources/openapi-skeleton.yaml` 生成基础结构。
参考 `examples/sample-output.yaml` 了解预期格式。

输出到 `docs/openapi.yaml`。如果文件已存在,增量合并而非覆盖。

### 第6步:验证
运行 `npx swagger-cli validate docs/openapi.yaml`。
如果验证失败,分析错误并修复。

## 输出规范
- OpenAPI版本: 3.0.3
- 所有端点必须有 `operationId`
- 所有响应必须有 `description`
- 复用类型放入 `components/schemas`
- 认证方案放入 `components/securitySchemes`

## 约束
- 只文档化实际存在的路由,不生成假设端点
- 无法推断类型时使用 `object` 并添加 `x-undocumented: true` 扩展字段
- 保持与项目现有OpenAPI文件的风格一致

资源文件:openapi-skeleton.yaml

openapi: "3.0.3"
info:
  title: ""        # 从package.json读取
  version: ""      # 从package.json读取
  description: ""

servers:
  - url: http://localhost:3000
    description: 开发环境

paths:
  # 自动生成的端点

components:
  schemas:
    # 自动生成的类型定义
  securitySchemes:
    # 自动生成的认证方案(如检测到)

安装与测试

# 创建目录
mkdir -p ~/.claude/skills/api-doc-generator/resources
mkdir -p ~/.claude/skills/api-doc-generator/examples

# 写入文件后测试
# 方式1:手动调用
# > /api-doc-generator 为我的项目生成API文档

# 方式2:自然语言触发
# > 帮我生成OpenAPI文档

# 方式3:在具体项目中测试
cd your-express-project
# > 分析路由代码,生成Swagger文档

十一、Skill开发最佳实践清单

描述优化

指令体编写

质量保障

团队协作


十二、Skill生态系统全景

mindmap
  root((Claude Code<br/>Skill生态))
    创建
      手动编写SKILL.md
      skill-creator Skill辅助生成
      Skill Factory批量生产
    测试
      手动场景测试
      skill-creator Evals
      A/B Benchmark
      Quality Analyzer
    分发
      Git仓库(项目内)
      Plugin Marketplace
      GitHub社区仓库
      npm包
    管理
      ~/.claude/skills/(全局)
      .claude/skills/(项目级)
      settings.json配置
      enabled/disabled控制

延伸阅读

参考来源

  1. Extend Claude with skills — Claude Code Docs — Anthropic官方Skills文档,涵盖创建、管理、分发全流程
  2. Skill Authoring Best Practices — Claude API Docs — 官方Skill编写最佳实践,包含token效率优化指南
  3. Improving skill-creator: Test, measure, and refine Agent Skills — Claude Blog — Skills 2.0评估框架详解,A/B测试与benchmark方法
  4. Claude Code Skills: The Complete Setup and Creation Guide — MasteringAI — 社区综合指南,包含从安装到发布完整教程
  5. How to Create a Skill in Claude Code — Verdent Guides — 实战导向的Skill创建教程,含多文件Bundle示例

训练营适用性评估

维度 评估
适合训练营类型 AI开发工具训练营、DevOps自动化训练营、团队效能提升工作坊
预计教学时长 3-4小时(含动手实操)
前置知识要求 Claude Code基本使用经验、Git基础、Markdown语法
实操比重 70%实操 + 30%理论
考核方式 学员独立构建一个自定义Skill并通过触发测试
分组建议 2-3人一组,每组构建不同类型的Skill,最后互相评测

[!tip] 51学通信知识星球 星主:爱卫生(微信:gprshome201101)——公众号「51学通信」创办者,19 年通信行业运维与讲师经验,著有《GPRS网络信令实例详解》《EPC原理与实践》《5G核心网原理与实践》三本纸质书(各大电商平台有售)。 星球定位:深耕 5G 核心网、IMS、NFV/AI、云原生等 ICT 领域,主打运维岗位与信令分析。 当前规模:5200 篇主题 / 990 个回答,198 元/年。 加入福利:加入星球后请加爱卫生微信,拉您进知识星球年度陪伴与答疑群——不限量回复您的各种问题,另有群内分享。 AI 加持:51学通信知识星球已作为 skill 接入 WorkBuddy,使用 deepseek-4-flash 在海量星球帖子中精准找贴、找视频、找 FAQ 和案例,做总结、找文档和 PPT 等场景全覆盖。

51学通信知识星球海报-扫码加入