Skip to main content

前言

在持续使用Claude Code的过程中,开发者往往会积累一套属于自己或团队的最佳实践:提交代码时要遵循特定格式、代码审查时要检查哪些维度、部署前要验证哪些步骤。这些经验通常存在于脑海或文档中,每次都需要手动向Claude解释一遍,耗时且容易遗漏。

Skills正是为了解决这一痛点而设计的。它允许将任意知识、规范或工作流封装进一个SKILL.md文件,Claude便能将其纳入自己的工具箱——在合适的时机自动调用,或者由用户以斜杠命令主动触发。

什么是Skills

Claude Code Skills

SkillsClaude Code提供的技能扩展机制,核心是一个包含SKILL.md文件的目录。创建SKILL.md后,Claude会将该技能加入工具箱:可以用/技能名直接调用,也可以由Claude在对话时判断相关性后自动加载。

Claude CodeSkills遵循 Agent Skills 开放标准。该标准由Anthropic主导维护,旨在让技能文件可以跨多种AI工具使用,实现"编写一次,到处运行"。Claude Code在标准基础上扩展了调用控制、子智能体执行、动态上下文注入等高级特性。

NOTE

Skills与旧版.claude/commands/目录完全兼容。commands/下的.md文件和skills/下的SKILL.md都能创建同名斜杠命令,两者功能一致。Skills额外支持支撑文件目录、自动加载触发和调用权限控制。如果同名冲突,Skills优先级更高。

设计目标

Skills设计的核心目标是将领域知识与工作流程变为可复用、可分发的单元,主要解决以下问题:

  • 知识固化:将代码规范、架构约定、业务领域知识写入技能,让Claude始终"记住",无需每次重复说明
  • 工作流标准化:将部署、提交、代码审查等多步骤流程封装为一条命令,保证团队执行一致性
  • 上下文按需加载:技能描述始终在上下文中,完整内容只在调用时加载,避免浪费上下文窗口
  • 跨项目复用:个人技能在所有项目中通用,项目技能随代码仓库版本控制,团队成员可直接使用

设计原理:渐进式披露

Skills采用 渐进式披露(Progressive Disclosure) 机制管理上下文效率:

Session Start
|
v
[Discovery] ── 仅加载所有技能的 name + description
| (轻量级,让 Claude 知道"有什么可用")
v
[Activation] ── 用户输入或对话内容匹配技能 description
| (Claude 决定加载完整 SKILL.md)
v
[Execution] ── Claude 按照 SKILL.md 指令执行任务
(按需加载支撑文件、执行脚本)

这种设计确保大量技能同时存在时,不会撑满上下文窗口;只有真正需要的技能才会被完整加载。

内置技能(Bundled Skills)

Claude Code自带一批开箱即用的内置技能,随每次会话提供,通过/技能名调用:

技能名调用方式功能说明
simplify/simplify [重点]审查近期改动文件,并行启动代码复用、质量、效率三个子智能体,汇总后修复问题
batch/batch <指令>将大规模代码变更分解为530个独立单元,每单元启动独立子智能体并行实现,各自运行测试和开PR
debug/debug [描述]读取当前会话调试日志,分析会话异常,可传入描述来聚焦分析方向
loop/loop [间隔] <提示词>按指定时间间隔循环执行提示词,适用于轮询部署状态、持续监控PR等场景
claude-api/claude-api加载当前项目语言对应的Claude API参考资料,也会在代码import anthropic时自动激活

技能存储位置

技能的存储位置决定了它的适用范围:

级别存放路径适用范围
企业级由管理员通过托管设置下发组织内所有用户
个人级~/.claude/skills/<技能名>/SKILL.md本人的所有项目
项目级.claude/skills/<技能名>/SKILL.md当前项目仅
插件级<插件目录>/skills/<技能名>/SKILL.md安装了该插件的项目

当不同级别存在同名技能时,优先级为:企业 > 个人 > 项目。插件技能使用插件名:技能名的命名空间,不会与其他级别冲突。

tip

monorepo大仓管理的代码仓库场景下,Claude Code会自动发现嵌套目录中的.claude/skills/子目录。例如编辑packages/frontend/中的文件时,也会自动加载packages/frontend/.claude/skills/里的技能。

编写技能

目录结构

每个技能是一个独立目录,SKILL.md是必需的入口文件:

my-skill/
├── SKILL.md # 必需:主指令文件
├── template.md # 可选:供 Claude 填写的模板
├── examples/
│ └── sample.md # 可选:示例输出,展示期望格式
└── scripts/
└── helper.py # 可选:Claude 可执行的脚本

SKILL.md以外的文件属于支撑文件,需在SKILL.md中显式引用,Claude才知道它们的存在和用途。这让技能可以将大型参考文档、API规范等按需加载,而非每次都占用上下文。

tip

保持SKILL.md500行以内,将详细参考资料移至独立文件中。

SKILL.md格式

SKILL.md由两部分组成:顶部的YAML frontmatter和正文Markdown指令。

---
name: 技能名称
description: 技能描述,说明功能和触发时机
---

## 技能正文指令

在此编写 Claude 需要遵循的步骤和规则……

Frontmatter配置项

Frontmatter的配置字段均为可选内容。

字段说明
name技能名称,成为/斜杠命令的名称。仅允许小写字母、数字和连字符,最长64字符。省略时使用目录名
description技能描述,Claude依此判断何时自动加载。省略时使用正文第一段
argument-hint在自动补全时显示的参数提示,如[issue-number][filename] [format]
disable-model-invocation设为true时,仅用户可手动调用,Claude不会自动触发。适合有副作用的工作流(如部署、发送消息)。默认false
user-invocable设为false时,技能从/菜单中隐藏,仅Claude可调用。适合作为后台知识库的技能。默认true
allowed-tools技能激活时Claude可免确认使用的工具列表,如Read, Grep, Bash(git *)
model该技能激活时使用的模型
context设为fork时,技能在独立子智能体中运行,拥有隔离的上下文
agentcontext: fork时指定使用的子智能体类型:ExplorePlangeneral-purpose或自定义子智能体名
hooks作用于该技能生命周期的Hooks配置

调用控制矩阵

disable-model-invocationuser-invocable两个字段共同决定技能的调用权限:

配置用户可调用Claude可自动调用description加载入上下文
默认
disable-model-invocation: true
user-invocable: false

参数传递

技能支持通过$ARGUMENTS占位符接收参数:

占位符含义
$ARGUMENTS调用时传入的全部参数文本
$ARGUMENTS[N]按位置(0起始)访问第N个参数
$N$ARGUMENTS[N]的简写,如$0表示第一个参数
${CLAUDE_SESSION_ID}当前会话ID
${CLAUDE_SKILL_DIR}技能目录路径,用于引用技能内的脚本或文件

若调用时传入了参数但技能内无$ARGUMENTS占位符,Claude Code会自动将参数以ARGUMENTS: <内容>的形式追加到技能内容末尾。

使用示例

示例一:代码讲解技能

创建一个能用类比和图示讲解代码的个人技能:

第一步:创建技能目录

mkdir -p ~/.claude/skills/explain-code

第二步:编写SKILL.md

---
name: explain-code
description: 用类比和图示讲解代码。当用户询问代码工作原理、请求介绍代码库、或询问"这是怎么工作的"时使用。
---

讲解代码时,始终包含以下内容:

1. **从类比开始**:将代码比作日常生活中熟悉的事物
2. **绘制图示**:用 ASCII 艺术展示流程、结构或关系
3. **逐步拆解**:一步一步解释代码执行过程
4. **指出常见误区**:指出容易踩的坑或常见误解

保持解释口语化。对于复杂概念,使用多个类比。

第三步:测试技能

# 让 Claude 自动识别触发(描述匹配)
How does this authentication flow work?

# 直接调用技能
/explain-code src/auth/login.ts

示例二:规范化提交技能

创建一个强制代码提交遵循Conventional Commits规范的项目技能:

mkdir -p .claude/skills/commit
---
name: commit
description: 将当前改动以规范格式提交到 Git
disable-model-invocation: true
---

将当前所有改动提交到 Git,严格遵循 Conventional Commits 规范:

1. 运行 `git diff --staged` 查看暂存的改动
2. 分析改动类型,选择合适的提交类型前缀:
- `feat`: 新功能
- `fix`: Bug 修复
- `docs`: 文档更新
- `refactor`: 代码重构(无功能变更)
- `test`: 测试相关
- `chore`: 构建/工具链相关
3. 若存在 breaking change,在类型后加 `!`,并在正文中注明 `BREAKING CHANGE:`
4. 提交信息格式为:`<类型>(<范围>): <简短描述>`
5. 执行 `git commit -m "<提交信息>"`

不要直接 push,以便用户检查。

由于设置了disable-model-invocation: trueClaude不会在你没准备好时自动提交,只有你手动输入/commit才会触发。

示例三:PR摘要生成技能

使用动态上下文注入和子智能体的进阶技能:

mkdir -p ~/.claude/skills/pr-summary
---
name: pr-summary
description: 为当前 Pull Request 生成结构化摘要,包括改动说明、影响范围和测试建议
context: fork
agent: Explore
allowed-tools: Bash(gh *)
---

## Pull Request 上下文

- PR 差异(diff):!`gh pr diff`
- PR 评论:!`gh pr view --comments`
- 改动文件清单:!`gh pr diff --name-only`

## 你的任务

根据以上 PR 数据,生成一份结构化摘要,包含:

1. **改动概述**:用两三句话说明本次 PR 做了什么
2. **改动文件分析**:按模块分组列出关键改动
3. **潜在风险**:指出可能影响稳定性的改动点
4. **建议测试方向**:列出验证本次改动所需的关键测试场景

该技能的特点:

  • !command:该语法在技能内容发送给Claude之前先执行Shell命令,将真实的PR数据注入提示词
  • context: fork让技能在独立上下文的子智能体中运行,不占用主会话的上下文窗口
  • agent: Explore使用只读工具集,确保摘要分析阶段不会意外修改任何文件

示例四:代码库规范知识库技能

将项目编码规范作为背景知识Claude自动参考,而非用户手动调用的命令:

---
name: project-conventions
description: 本项目的编码规范和架构约定,包括 API 设计、错误处理、数据库操作等规则
user-invocable: false
---

## API 设计规范

- 所有`REST`接口使用复数名词,如`/users`而非`/user`
- 错误响应格式统一为`{"code": "ERROR_CODE", "message": "..."}`
- 分页参数统一使用`page``pageSize`,默认`pageSize``20`

## 数据库操作规范

- 禁止在循环中执行数据库查询(N+1 问题)
- 所有批量写操作必须在事务中执行
- 查询语句必须有索引覆盖,禁止全表扫描

## 错误处理规范

- 业务错误使用自定义`AppError`类,包含错误码和用户可读信息
- 系统级错误需记录堆栈日志,不向用户暴露内部细节

user-invocable: false让这个技能不出现在/菜单中(它不是一个"命令"),但Claude在写代码时会自动参考其中的规范。

常见问题排查

技能没有自动触发

  1. 检查description字段是否包含用户自然语言中会出现的关键词
  2. 运行What skills are available?确认技能已被发现
  3. 尝试换个措辞,让请求更贴近description中的描述
  4. 若技能是user-invocable,可以直接用/技能名手动触发验证

技能触发频率过高

  1. 使描述更精确,减少误匹配范围
  2. 添加disable-model-invocation: true,改为仅手动调用

Claude看不到全部技能

技能描述会占用上下文配额(默认为上下文窗口的2%,最少16,000字符)。若技能太多,部分技能可能被排除。运行/context可查看是否有技能被忽略的警告。

可通过设置环境变量SLASH_COMMAND_TOOL_CHAR_BUDGET来覆盖默认配额限制。

技能分发

根据受众不同,技能可以用多种方式分发:

  • 项目共享:将.claude/skills/目录提交到版本控制库,团队成员clone即可使用
  • 插件打包:在Pluginskills/目录下提供技能,通过插件市场安装
  • 企业下发:通过托管设置(managed settings)将技能推送给组织内所有用户

参考资料