第3章:Skills 工程实践
请使用电脑访问
https://myblog-ad4.pages.dev第3章:Skills 工程实践
在使用 Claude Code 处理重复性工程任务时,常见问题是:每次新建会话,都需要重新注入一批固定上下文。
例如在生成支付模块 API 文档时,模型需要提前了解以下约束:
- 接口设计遵循 RESTful 规范
- 文档格式采用 OpenAPI 3.0
- 错误码对齐公司内部标准
- 示例数据需要真实有效
- 输出内容需要包含中英双语
这些信息本身并不会频繁变化,但如果只依赖普通对话上下文,每次开启新会话都需要重新说明。即使在同一会话中,当任务从“生成 API 文档”切换到“代码质量审查”时,也需要重新定义代码审查标准,例如审查优先级、输出格式、问题严重等级等。
类似问题也会出现在其他领域。例如进行财务分析时,模型可能需要固定加载毛利率计算公式、行业基准数据、分析口径以及报告模板。若这些知识无法被结构化复用,每次任务都需要重复输入相同背景信息。
CLAUDE.md 可以解决一部分项目级记忆问题,例如项目结构、编码规范、常用命令等。但它更适合承载通用项目上下文,无法很好地处理“按任务类型自动加载特定知识”的需求。
Skills 的作用,就是将某一类任务所需的知识、流程、规范和输出格式封装成可复用能力。这样,当用户触发特定任务场景时,Claude 可以自动加载对应 Skill,例如:
- 提到“API 文档”时,自动应用 RESTful、OpenAPI 3.0、错误码规范和双语输出要求
- 提到“代码审查”时,自动应用审查维度、严重等级和输出模板
- 提到“财务分析”时,自动应用财务指标公式、行业基准和报告结构
因此,Skills 可以理解为一种面向任务场景的上下文封装机制。它比普通提示词更稳定,比项目级记忆更精细,适合沉淀可重复使用的专业工作流。
3.1 从 CLAUDE.md 到 Skills: 知识的两个维度
3.1 从 CLAUDE.md 到 Skills:知识的两个维度
CLAUDE.md 和 Skills 解决的是两类不同的上下文管理问题。
CLAUDE.md 适合存放项目级通用规范,例如:
- 项目整体约束
- 代码缩进、命名规范、目录结构
- 常用命令
这类信息需要在当前项目中始终生效,因此通常会常驻上下文,并在每次会话中加载。它的优势是稳定、统一,但缺点也很明显:无论当前任务是否需要,这些内容都会持续占用 Token。
Skills 则适合承载任务级或领域级知识,例如:
- API 文档生成规范
- 代码审查流程
- 财务分析公式、行业基准和报告模板
**这些知识并不需要在所有任务中始终存在。只有当用户执行特定任务时,**例如“生成 API 文档”“代码审查”“财务分析”,对应知识才需要被加载。
因此,CLAUDE.md 解决的是“项目通用规则常驻”的问题,而 Skills 解决的是“专业知识按需加载”的问题。
| 对比项 | CLAUDE.md | Skills |
|---|---|---|
| 承载内容 | 项目通用规范 | 专业工作流、领域知识、任务模板 |
| 生效范围 | 当前项目 | 可跨项目、跨会话 |
| 触发方式 | 始终生效 | 按任务场景激活 |
| 加载策略 | 每次全量加载 | 渐进式按需加载 |
| 典型用途 | 项目编码规范、常用命令、目录约定 | API 文档生成、代码审查、财务分析 |
| 与 Agent 的关系 | 所有 Agent 共享 | 可绑定特定 Agent |
| Token 消耗 | 固定开销 | 用到时才消耗 |
| 知识类型 | 项目规则 | SOP 操作手册 |
从知识组织角度看,CLAUDE.md 更像项目的基础规则层,适合放置所有任务都必须遵守的内容;Skills 更像可复用的 SOP,用来封装某类任务的执行方法、判断标准、输入输出格式和辅助资源。
Claude Code 对 Skills 的定义可以概括为:Skill 是一个包含指令的文件夹,用于教 Claude 如何处理特定任务或工作流。
这里有两个关键点。
第一,Skill 是“文件夹”,Skill绝不仅仅是一段 Prompt 或一个简单的配置项,它是一个完整的工程化目录,可以容纳复杂的代码库、详尽的领域文档、多样的模板,甚至可执行的脚本。
第二,Skill 的目标是“教会”Claude 执行某类任务。它不是简单地限制模型行为,而是把某个任务场景中的流程、标准、资源和输出要求结构化封装起来,使 Claude 在触发该任务时能够自动采用对应的工作模式。
可以简单理解为:
CLAUDE.md 用来定义项目规则,Skills 用来封装专业任务能力。
前者解决“所有任务都要遵守什么”,后者解决“遇到某类任务时应该怎么做”。
3.2 解剖一个 Skill: 骨骼与纹理
3.2.1 目录结构
下面是一个典型的 Skill 目录结构。
api-doc-generator/ ← Skill 名称(kebab-case,短横线分隔,像文件名一样清晰) |
“这些看似烦琐的‘清规戒律”,实则是工程实践中用血泪换来的防错机制。
文件名:SKILL.md:唯一的“触发器”。文件名必须采用全大写文件名:SKILL.md,其他形式统统无效。Claude 的加载器在扫码文件时,执行的是精确字符串匹配,而非模糊搜索。
目录名:kebab-case:跨平台的“通用语”。目录名采用全小写 + 短横线的形式(如 api-doc-generator),至多64个字符,字符集限制为[a-z0-9-]。**不能存在空格、下画线、大写字母、首尾横线和连续横线。**这是为了抹平操作系统的差异。Windows 操作系统不区分大小写,Linux 操作系统严格区分。kebab-case 是互联网时代的“世界语”,它保证了你的 Skills 在任何环境、任何工具链中都能被无损识别。
禁放 README.md:纯净的“指令空间”。Skills 目录内严禁放置 README.md。人类阅读的文档应放置在父目录中。这一点至关重要。当 Claude 激活一个 Skill 时,它会贪婪地读取目录下的 Markdown 文件作为上下文。SKILL.md 包含的是给 Claude 看的指令。而 README.md 通常包含的是给人类看的介绍。如果将 README.md 混在里面,会干扰 Claude 对指令内容的理解,引人不必要的噪声。
命名中立:不要包含 “claude” 或 “anthropic” 。name 字段中不得包含品牌词。Skills 是一种通用的知识封装格式,它的生命力在于开放性。保持品牌中立,是为了让知识本身流动起来,而不是成为某个产品的附属品。
3.2.2 YAML 前置元数据: Skill 的“身份证”
SKILL.md 顶部的 YAML Frontmatter 定义了 Skill 的身份标识与行为边界。完整字段说明如下。
|
这些字段可划分为三大逻辑组,分别对应 Skills 设计的3个核心维度:触发机制、权限控制与运行时环境。
身份字段(触发机制):包含 name、description、argument-hint。它们定义了“Skill 是什么”,负责向 Claude 和用户清晰传达 Skill 的功能定位及调用方式,是触发逻辑的基础。
权限字段(权限控制):包含 disable-model-invocation、user-invocable、allowed-tools、model。它们规定了“谁能调用”以及“能做什么”,通过限制调用来源、可用工具及指定模型,构建起严格的安全与资源边界。
执行字段(运行时环境):包含 context、agent、hooks。它们决定了“在哪里执行”以及“执行过程中发生什么”,用于配置隔离环境、子智能体类型及生命周期事件钩子,确保任务在预期的上下文中运行。掌握这3个维度,即掌握了 Skills 架构设计的完整框架。
disable-model-invocation 和 user-invocable 控制的是两个不同的调用入口:
disable-model-invocation: true表示禁止 Claude 自动触发该 Skill,只能由用户通过/skill-name手动调用。适合代码提交、服务部署等有副作用或高风险的操作。默认值是false。user-invocable: false表示该 Skill 不出现在/菜单中,用户不能手动调用,但 Claude 仍可自动调用。适合纯知识型或辅助型 Skill,避免菜单过于杂乱。默认值是true。默认情况下(两个都不写),Skill 既可被 Claude 自动调用,也可被用户手动调用。
3.3 渐进式披露: 知识的投资回报率
与 CLAUDE.md 不同的是,Skill 是按需加载的。
Skills 系统最巧妙的设计核心——渐进式披露(ProgressiveDisclosure)。
3.3.1 图书馆模型
这里可以用一座图书馆作类比。想象你走进一座图书馆寻找资料。你绝不会一次性读完所有藏书,而是遵循一套高效的检索流程——先浏览图书分类编目定位分类,再提取目标书籍查阅图书目录,最后仅精读所需章节。
Skills系统正是采用了类似的三层渐进式披露模型(见下图),以极低的 Token 成本实现海量知识的按需
调用。

该模型在实际应用中带来的性能提升是显著的。以一个完整的财务分析Skill(总计 5300 Token)为例,其文件构成如下表所示。
| 一个完整的财务分析 Skill 的文件构成 | ||
|---|---|---|
| 文件路径 | Token 数 | 说明 |
| SKILL.md | 800 | 主逻辑与路由指引 |
| reference/revenue.md | 1500 | 收入数据参考 |
| reference/costs.md | 1200 | 成本结构参考 |
| reference/profitability.md | 1000 | 利润率公式参考 |
| templates/report.md | 800 | 报告模板 |
| 不同加载方式的 Token 消耗对比 | |||
|---|---|---|---|
| 场景 | 传统全量加载 | 渐进式披露 | 节省比例 |
| 不激活 Skill | 0 | 0 | — |
| 扫描阶段(仅判断相关性) | 5300 | 约 100 | 98% |
| 简单请求(仅需要主文件) | 5300 | 800 | 85% |
| 中等请求(需要一个参考文件) | 5300 | 2300 | 57% |
| 复杂请求(需要所有资源) | 5300 | 5300 | 0% |
数据显示,绝大多数请求仅需部分资源。当用户询问“毛利率怎么算”时,ClaudeCode只需要加载 SKILL.md(定位路由)和 profitability.md(获取公式),总计约1800 Token。其他3个文件(合计 3500 Token)完全保留在磁盘上,零消耗。这是“按需投放知识”的核心经济学优势:用最小的上下文成本,换取最大的知识覆盖范围。
3.3.2 description 的预算机制
渐进式披露的第一层级,即所有 Skill 的 description(描述),是以常驻方式注入 Claude 上下文中的。这意味着它们必须共同瓜分一个有限的 Token 预算,构成了系统的“人口瓶颈”。
Claude Code 官方的规则:description 总预算上限为上下文窗口总量的2%,若未指定或计算异常,默认固定为16000个字符。
该预算由所有已安装的 Skill 平分,而非按需分配。
计算公式:单个 Skill 可用字符数 = 总预算/ Skill 的总数(如果某个 Skill 的 description 超过 可用的字符数,那它会被排除)
假设你安装了20个 Skill,在默认16000个字符的预算下,每个 description 平均只能分到800个字符。如果某个 Skill 的 description 超过800个字符,它将被静默排除。
Claude Code 完全不知道该 Skill 的存在,既不会在扫描阶段看到它,更无法在后续步骤中加载它。对用户而言,这个 Skill 仿佛 “消失” 了。
针对 description 预算的限制,这里有 3 个关键的实操技巧,能帮你避开陷阱,灵活掌控系统。
- 技巧 1:在 SkilI 配置中设置
disable-model-invocation: true。该 Skill的 description 不会被注入上下文中。 - 技巧 2:运行诊断命令 /context 可查看是否有超出预算的 Skill 被“静默排除”。
- 技巧 3:通过调整环境变量 SLASH_COMMAND_TOOL_CHAR_BUDGET,你可以手动扩大预算池。
这个预算机制揭示了一条核心的工程哲学:不要盲目创建 Skill,而要追求“少而精”的架构设计。
当你发现需要安装超过 20 个 Skill 时,这通常是一个信号,提示你需要重新审视架构策略。
- 合并同类项。将多个零碎的 Skill 合并为一个综合性的 Skill。
- 隐藏内部工具。将纯内部调用的子任务标记为
disable-model-invocation: true,减少对预算的占用。 - 采取“Token 投资”回报率思维。将 description 中的每一个字符视为一笔昂贵的“Token 投资”,投入精准,就换来高效的检索和准确的执行;投入浪费,不仅浪费自身的预算配额,而且挤占其他 Skill 的生存空间。
3.4 触发机制: Claude Code 如何抉择 Skills 的调用
Skills 的触发机制是整个系统中最为关键,也是最需要深入理解的核心环节。它直接决定了 Skill 能否在恰当时机被激活。这一点甚至比 Skill 的内容本身的优劣更为重要。毕竟,若无法成功触发,再精彩的内容也将形同虚设。
3.4.1 双通道激活机制
每个 Skill 均支持两种激活路径。
1.显式调用
用户在对话中输入 /skill-name,Claude Code 即刻加载并执行对应 Skill。此方式类似于终端命令,具有明确、直接且无歧义的特点。若 Skill 定义了 argument-hint,用户还可携带参数进行调用,如 /commit fix login bug 或 /review src/auth/login.ts
2.语义匹配
Claude 在深入理解用户意图后,自主研判哪个 Skill 与当前任务最为契合,从而自动加载。在日常应用中,这正是 Skills 的核心价值所在。用户仅需要描述需求,Claude 便会在幕后智能决策是否调用以及如何调用最合适的 Skill。整个过程对用户完全透明,实现了“所想即所得”的无缝体验。

3.4.2 description — Skills 的灵魂
语义匹配机制完全依赖于 description 字段。该字段并非人类阅读的说明性文字,而是 Claude 在决策 “是否调用此 Skill” 时所依据的唯一信号。
Claude Code 推荐的 description 撰写结构公式如下。
[功能定义](做什么)+[触发场景](何时用)+[核心能力](能做什么)
理解上述公式的最好途径,是通过对比“低效”与“高效”的写法。以下展示了两种写法的对比。
# 过于模糊,导致 Claude 无法判断使用时机 |
description 字段设有1024个字符的上限。这一空间并不宽裕,因此需要字斟句酌、精心选词。
一个高效实用的写作策略可分为以下3步。
第1步:定义核心能力(What)。用一句话精准概括该 Skill“能做什么”,确定其基本功能定位。
第2步:明确触发场景(When)。使用 Use when user.. 句式,详细列举各种可能触发该 Skill 的用户指令、短语或关键词,提高语义匹配的命中率。
第3步:划定排除范围(Not For)。(可选但推荐)如果该 Skill 容易被误触发,务必加上 Not for…,明确指出其不适用的场景,以优化决策的准确性。
你撰写的 description,其核心受众是 Claude,而非人类读者。人类阅读文档时倾向于扫描标题、浏览结构,快速抓取大意;而 Claude 阅读 description 字段时是在进行深度的语义匹配。它需要捕捉用户意图的细微差别。为了提升触发准确率,你必须在 description 中穷尽用户可能使用的各种表达方式。
例如,针对“生成 API 文档”这一需求,用户可能会说 “生成API文档”、”编写接口文档”、 “输出OpenAPI 规范”、 “帮我写个 Swagger”。这些不同的表述都应显式地包含在 description 中。同义词库越丰富,语义匹配的覆盖面就越广,触发的准确率也就越高。
3.4.3 防止过触发与欠触发
在实践中,Skills 的触发机制常面临两种典型的失效模式。理解并修复这些问题,是优化 Claude 表现的关键。
1.欠触发
现象:Skill 本应被调用,但没有被调用。
数据警示:Vercel 的评测数据显示,若缺乏明确指引,Agent 有 56% 的概率完全不会去查看可用的 Skills。
根本原因:description 写得过于技术化或学术化,与用户自然的口语化表述之间存在巨大的语义鸿沟。
修复策略:“翻译”用户语言。在 description 中大量加入用户常用的表达词汇,涵盖领域术语的同义词、口语化说法,甚至是常见但不准确的表述(例如,很多用户混淆“Swagger”和“OpenAPI”,两者都需要写入)。
2.过触发
现象:Skill 在不该被调用的场景下被错误激活。
根本原因:description 定义得过于宽泛,包含了太多高频通用词汇,导致匹配阈值过低。
修复策略:引人负向约束。明确划定边界,使用 Not for.. 句式排除干扰项。
示例: “Not for general code questions or debugging. Only for structured documentation generation.”(不适用于通用代码问题或调试,仅用于结构化文档生成。)要测试一个 Skill 的触发是否准确,可以构建一个包含10~20个测试用例的验证集,同时覆盖“应触发”和“不应触发”两类场景。
以下是一个实用的测试模板示例。
应该触发的测试用例: |
验收标准是:针对相关任务触发率,应达到90%以上,针对无关任务误触发率,应控制在 5% 以下。
3.4.4 参考型 Skill 与任务型 Skill:两种 Skill 哲学
在 Skill 的设计哲学中,disable-model-invocation 字段不仅仅是一个简单的开关,它定义了两种截然不同的 Skill 交互模式:参考型与任务型。
1.参考型 Skill
配置:默认行为。
核心逻辑:“按需加载的知识库”。Claude 会根据对话上下文自动判断是否需要该类 Skill。description 是触发条件,直接注入 Claude 的上下文,用于语义匹配。
使用场景:提供知识、规范、框架或标准。用户不需要感知 Skill 的存在,Claude 会在合适时机自动“翻开手册”。
示例:API 设计规范、代码审查清单、行业标准文档。
2.任务型 Skill
配置:显式设置 disable-model-invocation: true。
核心逻辑:“受控的执行工具”。Claude 无法自动触发,必须由用户通过 /skill-name 命令手动调用。description 不注入 Claude 的上下文,仅作为用户在命令行中选择 Skill 时的识别说明。
使用场景:具有副作用的操作,需要用户明确授权才能执行。
示例:/commit(提交代码)、/deploy(部署应用)、/notify(发送通知)。
| 维度 | 参考型 Skill | 任务型 Skill |
|---|---|---|
| Claude 自动触发 | 能(基于语义匹配) | 不能(必须手动) |
| 用户/触发 | 能 | 能 |
| description 作用 | 触发条件(注入 Claude 上下文) | 仅供用户识别(不注入 Claude 上下文) |
| 消耗 Token 预算 | 是(自动加载即消耗) | 否(仅手动调用时消耗) |
| 典型场景 | 知识提供、规范查询 | 动作执行、副作用操作 |
| 经典案例 | API 规范、审查清单 | /commit、/deploy |
| 这里说的副作用(Side Effect),指的是一个操作不仅返回结果,还改变了系统外部状态。比如提交代码会修改 Git 仓库历史,部署应用会改变线上服务状态,发送通知会真的给别人发消息。这些动作一旦执行,就会对真实世界产生影响,而且通常不可逆。所以这类 Skill 通常设计成用户显式触发,而不能让模型自己决定什么时候执行。 |
那么如何判断一个任务应该设计成参考型 Skill 还是任务型 Skill?
可以用一个简单的 “最坏情况测试” 来做决定,”如果 Claude 自动执行这个任务,最坏的情况是什么?”
如果答案让你感到紧张,例如,自动提交了未测试的代码、自动部署了包含 bug 的版本、自动删除了生产数据、自动发送了错误的通知,必须选择任务型 Skill。请加上 disable-model-invocation: true。把控制权牢牢握在用户手中,只有当用户显式输入 /skill-name 时才执行。
如果答案无关痛痒,例如,多展示了一段参考文档、多提供了一条建议、稍微增加了一点儿 Token 消耗,可以选择参考型 Skill。让 Claude 根据上下文智能判断,按需自动加载,为用户提供无缝的知识辅助。
核心原则:“副作用” 越大,控制权越要收紧。对于任何可能改变系统状态、造成不可逆后果的操作,永远不要信任 Claude 的自动判断。”
3.5 SKILL.md 正文:是路由器,不是仓库
理解了 Frontmatter 的触发机制和权限控制后,现在进人 SKILL.md 正文的设计核心。这是 Skills 真正发挥作用的地方。
3.5.1 路由器思维
一个常见的误区是将 SKILL.md 视为“知识仓库”,试图将所有相关信息堆砌其中。正确的设计思维应将其定位为路由器:文件自身仅包含核心流程与路由表,而详尽的知识内容则分散存储于被引用的文件中。

路由设计的核心技巧在于构建“快速参考”(Quick Reference)表格。该表格能以极低的 Token(大概3行仅需50 Token),清晰地向 Claude 指引 5个关键维度的路由条件。
| 分析类型 | 触发关键词 | 参考资源 |
|---|---|---|
| 收入分析(Revenue) | 收入、营收、销售额 | reference/revenue.md |
| 成本分析(Cost) | 成本、费用、支出 | reference/costs.md |
| 盈利分析(Profitability) | 利润、毛利率、净利率 | reference/profitability.md |
3.5.2 契约式引用
在 SKILL.md 中引用辅助文件时,切勿只罗列路径。应当建立一份明确的“契约”,确保 Claude 清晰知晓3个核心要素:触发时机(何时加载)、资源位置(去哪查找)以及预期产出(获取何物)。
以下示例展示了“弱引用”与“契约式引用”的写法。
# 弱引用:缺乏上下文(Claude 无法判断何时该加载此文件,缺乏行动指令) |
这一设计理念与子智能体流水线中的“交接契约”一脉相承:下游消费者不仅需要知道上游的位置,更必须明确上游能提供什么。
3.5.3 500 行法则
Claude Code 建议将 SKILL.md 的篇幅控制在500行以内。
为何设定为500行?这是因为500行代码等于2000~3000 Token,是单个 Skill 激活后合理的上下文开销。将其与 Claude 的 System Prompt 及当前对话历史累加,能确保总 Token 数维持在可控范围内。若超过500行,通常意味着你将 ‘参考资料’ 与 ‘路由指令’ 混淆了,此时的应对策略并非继续扩充内容,而是立即进行重构。
下表列出了当 Skills 内容过载时的重构信号及对策。
| 重构信号 | 对策 |
|---|---|
| 大段公式或规范说明 | 移至 reference/ 目录 |
| 多个完整示例(单个超过 30 行) | 移至 examples/ 目录 |
| 多个输出模板 | 移至 templates/ 目录 |
| 可独立执行的逻辑 | 封装为 scripts/ 脚本 |
| 多个平行的功能模块 | 考虑拆分为多个独立的 Skill |
3.6 allowed-tools: 知识约束行动
allowed-tools 是 Skills 安全架构中的核心字段。它不仅仅是一份权限清单,更体现了一项深层设计原则:知识应当约束行动。
具体的权限配置应基于 Skills 对业务逻辑的“认知”。
代码审查 Skills:审查过程仅需读取代码,严禁修改,因此仅授予只读工具。
文档生成 Skills:需要创建新文件,但绝不应篡改既有文件,因此仅授予写入(Write)权限,但明确禁止编辑(Edit)权限。
测试运行 Skills:仅需要执行特定的测试命令,因此精确限制可执行的 Bash 命令,防止任意命令注入。
3.6.1 权限设计模板
以下是针对不同 Skill 类型的 allowed-tools 配置最佳实践。这些配置体现了最小权限原则,确保每个 Skill 仅拥有完成其特定任务所需的最低限度工具权限。
# 审计类Skill:严格只读 |
3.6.2 Bash 的精细控制语法
Bash 工具支持通过前缀匹配机制,实现对可执行命令的细粒度管控。其核心语法为 Bash(prefix:*),其中 prefix 指定允许的命令前缀,*作为通配符代表后续参数。
权限控制示例如下。
Bash(git:*) # 允许所有以 git 开头的子命令 |
当 Claude 尝试执行 Bash 命令时,系统会进行前置校验。
- 提取前缀:获取用户请求执行的完整命令字符串。
- 匹配规则:检查该命令是否匹配 prefix 开头。
执行决策:若匹配成功,则放行执行;若匹配失败,则直接拒绝,并返回权限错误。
遵循权限最小化原则(Principle of Least Privilege)是构建安全 Skills 的基石。以下是关于 allowed-tools 配置的正反案例对比。
# 精确授权:只明确列出任务所需的具体命令子集 |
Bash(*)在安全性上几乎等价于未设置 allowed-tools。这意味着
Claude Code 获得了宿主机的完整 Shell 权限。对于像 /deploy 这样的高危任务型 Skill,这种配置是致命的。一旦模型被提示注入攻击权限,攻击者可利用此权限窃取密钥、删除生产数据或植入后门。
3.7 参数传递与动态注入
Skills 不仅是静态指令,更支持运行时参数传递与上下文预注入,使其行为能够根据调用场景进行动态调整。
3.7.1 $ARGUMENTS 和位置参数
当用户通过 /skill-name arg1arg2 调用 Skills 时,可在 SKILL.md 正文中引用下表所示的变量。
| 变量 | 说明 |
|---|---|
$ARGUMENTS |
所有参数的完整字符串 |
$ARGUMENTS[0] |
第一个参数(索引从 0 开始) |
$ARGUMENTS[1] |
第二个参数 |
$0、$1、$2 |
位置参数的简写形式 |
一个引用示例如下。
--- |
当执行调用 /migrate-component SearchBar React Vue 时,Claude 实际接收到的指令为“Migrate the SearchBar component from React to Vue. Preserve all existing behavior and tests.”。
3.7.2 动态上下文注入
这是 Skills 系统中最具威力且独一无二的特性。!`command` 语法允许在将 SKILL.md 发送给 Claude 之前,先在 Shell 环境中执行指定命令,并将命令的输出结果直接内联替换到 Prompt 中,再交给 Claude。
“动态上下文注入”的意思是:Claude 在执行任务前,系统先自动收集当前项目状态,然后把这些状态作为上下文一起发给 Claude。
一个示例如下。
## Current Context (Auto-detected) |
前面的
!表示:不要把这行原样发给 Claude,而是先在 Shell 里执行这个命令,然后把执行结果填到这里。所以下面这句什么意思?
Current branch:
!`git branch --show-current`
git branch --show-current意思是 查看当前 Git 分支名。假设你现在在这个分支feature/auth那这条命令执行后,就会输出feature/auth所以原来的:
Current branch:
!`git branch --show-current`会变成:
Current branch:
feature/auth
当执行 /pr-create “Add auth” 命令时,Claude 实际接收到的已是填充了动态数据的 Prompt。
## Current Context (Auto-detected) |
这一设计的工程价值巨大。!`command` 特性未使用与使用的对比如下表所示。
| 维度 | 未使用 !`command` | 使用 !`command` |
|---|---|---|
| Claude 启动时的上下文 | 空白,需要多轮对话探索 | 已预注入关键信息 |
| 首次响应的工具调用次数 | 3~5 次(用于收集信息) | 0~1 次(直接执行行动) |
| Token 消耗 | 高 | 低 |
| 响应速度 | 慢 | 快 |
| 结果一致性 | 低(存在信息遗漏风险) | 高(固定注入相同信息) |
Claude 在执行 !`command` 时会遵循严格的时序:先替换 $ARGUMENTS 变量,再执行 Shell 命令。这意味着用户的输入内容将被直接拼接到 Shell 命令中,若未加管控,极易受到 Shell 注入攻击。所以必须用 allowed-tools 限制 Skill 能执行的命令范围,避免它变成“用户想让它执行什么就执行什么”。
比如用户输入的不是:
Add auth而是故意输入:
Add auth"; rm -rf .; echo "那原来的模板:
git log --grep="$ARGUMENTS"替换后可能就变成:
git log --grep="Add auth"; rm -rf .; echo ""这就严重了。
Shell 会把它理解成三条命令:
git log --grep="Add auth"
rm -rf .
echo ""其中:
rm -rf .可能会删除当前目录下的文件。
这就是所谓的 Shell 注入攻击。
3.8 作用域与优先级
Skills 文件可部署于不同的层级,每个层级对应特定的生效范围与适用场景,具体如下表所示。
| 存放位置 | 生效范围 | 典型用途 |
|---|---|---|
| 企业配置中心 | 全员生效 | 强制执行的企业级开发规范与安全策略 |
~/.claude/skills/<name>/ |
个人所有项目 | 个人编码习惯、通用工具集及跨项目辅助脚本 |
<project>/.claude/skills/<name>/ |
仅限当前项目 | 项目特有的工作流、业务逻辑定制及团队协同规范 |
| Plugin 内置资源 | Plugin 启用时 | 社区共享的能力包、特定框架的专用指令集 |
当多个来源存在同名的 Skill 时,系统将按照从高到低的优先级顺序进行解析与加载。
企业策略 > 个人配置(~/.claude/) > 项目配置(.claude/)> Plugin 内置 |
这一优先级顺序的设计逻辑严格遵循企业治理架构,确保了从“强制底线”到“个性化偏好”的有序过渡。
企业策略(不可逾越的底线):企业级配置拥有最高权限,用于强制执行全局安全与合规策略。例如,安全审计类 Skill 必须强制检查 OWASP Top 10 漏洞,此类的关键规则绝不允许被项目级或个人配置覆盖,从而确保组织层面的安全红线不被突破。
个人配置(个性化效率工具):位于个人目录的配置旨在满足开发者的个人习惯。例如,用户可以定义 /commit 命令,使其自动按照 conventional commit 规范生成提交消息,这种偏好仅作用于个人环境,不影响他人。
项目配置(业务场景定制):位于项目根目录的配置,专为特定代码库服务。例如,某个前端项目可定制专属的组件文档生成 Skill,以适配其特有的技术栈和文档结构。
将 Skill 目录(.claude/skills/)纳入项目的 Git 版本控制,是实现团队知识零成本共享的最优解。
即插即用:团队新成员克隆代码库后,相关 Skill 自动生效,无需任何手动安装或配置步骤。
同步演进:随着项目选代,Skill 库可随代码一同更新,确保团队始终使用最新的工作流规范。
3.9 实战: 从零构建 3 类 Skill
理论阐述至此已臻完备,接下来我们将进人核心的工程实战环节。
在本节中,我们将通过 3 个复杂度递进的完整案例,手把手演示如何构建高价值的 Skill。这 3 个案例并非随意选取,而是精准对应了前面所述的 3 种典型应用场景。
3.9.1 参考型 Skill: 代码审查
某团队每日需要执行大量代码审查。为此,团队制定了以下内部约定。
优先级原则:优先关注安全问题,其次是性能问题,最后才是代码风格。
反馈要求:必须提供具体的修改建议,严禁仅指出问题而不给方案。
分级标注:每个问题均需标注严重等级。
鉴于相关规范散落在不同文档中,新人难以一次性掌握,现整理如下核心指南及目录结构。
目录结构如下。
code-reviewing/ |
SKILL.md 的核心内容如下。
--- |
该 Skill 的设计聚焦三大核心要点。
只读权限保障:仅开发 Read、Grep、Glob 工具,从机制上杜绝审查过程中意外修改代码的风险。
优先级排序策略:严格遵循“安全 > 性能 > 质量”的审查顺序,确保关键隐患优先被发现,避免遗漏。
结构化输出规范:统一采用 “严重等级+问题描述+文件位置+修改建议” 的输出格式,保证每次审查结果的一致性与可追溯性。
3.9.2 任务型 Skill: 智能提交
开发者可能每日需要频繁提交代码(日均十余次),手动撰写 commit message 既耗时又容易不规范。为此,我们设计了以下任务型 Skill。鉴于该操作具有副作用(直接修改 Git 历史),系统设定为必须由用户主动触发,严禁自动执行。
--- |
上述 Skill 展示了多项高级特性的深度组合。
安全控制(
disable-model-invocation: true):强制禁用模型调用,确保执行过程纯粹依赖预设脚本,防止意外的 AI 推理介入。动态参数($ARGUMENTS):支持灵活的参数传递机制,允许用户直接指定提交信息或留空以触发自动生成。
上下文预注入(!`command`):利用 Shell 命令在执行前即时捕获并注入当前的 Git 状态。这使得 Claude 在启动时即拥有完整的上下文信息,不需要额外调用工具即可感知变更内容,显著提升了响应速度。
成本与性能优化(model:haiku):指定使用轻量级模型(Haiku)。鉴于提交操作主要依赖规则匹配而非复杂推理,该配置在保证准确性的同时,有效降低了延迟与资源消耗。
一个使用示例如下。
# 自动生成提交信息(commit message) |
3.9.3 复合型 Skill: 财务分析(渐进式披露完整案例)
本案例展示了一种高度模块化的渐进式披露架构。该设计通过分层解耦,实现了复杂任务的高效管理。
主控层:由主文件负责意图识别与流程路由。
知识层:由参考文件提供垂直领域的深度知识与基准。
规范层:由模板确保输出格式的高度一致性。
执行层:由脚本封装确定性的计算逻辑,消除幻觉风险。
目录结构如下。
financial-analyzing/ |
SKILL.md 的核心内容如下。
--- |
上述 SKILL.md 仅约 200 行,完全符合 “500行法则”。
其中的“快速参考”(Quick Reference)表格充当了路由器的角色:当 Claude 识别到 “毛利率” 时,能直接定位至 reference/profitability.md 获取公式,不需要加载收入与成本相关的冗余文件。此外,calculate_ratios.py 脚本封装了确定性计算的逻辑,使 Claude 不需要执行易出错的浮点数运算,只需要调用脚本即可获取精确结果。
这是 “渐进式披露” 理念的完整体现:以最小的 Token 投入,实现任务完成质量的最优化。
3.10 Skills 的4种设计模式
从工程实践中,我们提炼出 4 种经过验证的 Skill 设计模式(见下图)。这些模式并非互斥,成熟的 Skills 系统通常会组合运用多种模式。

模板驱动模式:利用预定义模板严格约束输出格式。该模式适用于周报、事故报告、审查报告等需要标准化输出的场景。在此模式下,Claude 的输出将严格遵循模板结构,确保结果具备可预期性、可对比性,并支持自动化后处理。
脚本增强模式:将确定性计算逻辑封装为脚本,由模型调用执行而非自行推导。该模式适用于财务计算、正则匹配、数据转换等场景。相较于大模型推理,脚本执行更精准、更节省 Token 且更具可复现性。一条经验法则是:如果发现自己在 SKILL.md 中编写公式使 Claude 运行计算,请立即停止一该逻辑应当被移至脚本中。
知识分层模式:依据使用频率对知识进行分层组织。遵循“80/20法则”(即80%的请求仅需要20%的核心内容),将高频知识内联至 SKILL.md,而低频知识则置于引用文件中按需加载。这正是“渐进式披露”理念的模式化总结。
工具隔离模式:通过 allowed-tools 机制严格界定 Skill 的能力边界。这属于安全设计范畴,而非单纯的功能设计,其核心价值在于明确“禁止做什么”,这往往比定义“能做什么”更为关键。例如,审计类 Skill 不授予写入权限,生成类 Skill 不授予修改权限。
3.11 测试与迭代
写完 Skill 就结束了吗?当然没有。Skill 是活文档,需要持续打磨。
Claude Code 官网推荐了 3 类核心测试方法,以确保 Skill 的健壮性。
触发测试:准备 10 个应触发 Skill 的问题和 10 个不应触发的问题,以验证 Claude 判断的准确率。目标是,相关任务触发率需要高于90%,而无关任务误触发率应低于 5%
功能测试:验证 Skill 加载后的执行质量。检查点包括输出格式是否符合预期、检查项是否完整覆盖、边界情况是否得到妥善处理。
性能对比:针对同一任务,分别在 “有 Skill” 和 “无 Skill” 两种状态下各执行 5 次,对比 Token 消耗量、用户修正次数以及最终输出质量。
如果你发现自己反复手动修正 Claude 的输出(例如,每次都要提醒它 “记得标注认证要求” ),这是 SKILL.md 正文需要更新的明确信号。将修正逻辑直接写入 SKILL.md,下次就不会发生同类错误。
这个选代过程与传统软件的 bug 修复循环完全一致:发现问题→定位原因(description 不精确?步骤遗漏?格式定义模糊?)→ 修复文档 → 验证效果。
Claude Code 还提供了一个名为 skill-creator 的专用 Skill,它能协助你从自然语言描述中生成 SKILL.md 的初始版本。指令示例如下。
Use the skill-creator skill to help me build a skill for [your use case] |
该工具的存在本身揭示了一个重要事实:Skills 系统已经足够成熟,实现了“自举”,即利用 Skills 系统自身来构建新的 Skill。
3.12 从软件工程看 Skills
正如子智能体一样,Skills 也是一个全新的概念。它的核心本质,是将软件工程中历经验证的经典智慧,迁移并适配到 AI Agent 的知识架构之中。
1.关注点分离(Separation of Concerns)
核心理念:“授人以鱼,不如授人以渔”。Skills 将解决问题的方法、步骤与经验沉淀为可复用的结构化资产,而非仅提供一次性答案。这使得 Agent 从依赖 “临时灵感” 转变为能够稳定复现高质量工作流。
三层架构职责划分如下。
CLAUDE.md:全局规则(项目背景、通用规范)。
Skills:专业工作流(特定领域的复杂逻辑封装)。
子智能体:任务执行(动态规划与实时操作)。
工程师警示:严禁将所有逻辑塞入 CLAUDE.md。如同在软件开发中将所有代码写在 main 函数中一样,这会导致上下文冗余、维护困难且难以扩展。
2.依赖倒置(Dependency Inversion)
核心机制:面向接口编程,而非面向实现编程。
Claude 不直接依赖 Skill 的具体内部实现(如具体的脚本或 Prompt 细节),而是依赖其抽象接口(即 description 和输出契约)。只要保持接口契约不变,开发者可以随时替换、重构或升级 Skill 的内部逻辑。
对 Claude 和用户来说,这种变化是完全透明的,极大地降低了系统的耦合度。
3.缓存优化与情性加载
核心策略:渐进式披露 = 按需加载。
“渐进式披露”是一种典型的惰性加载(Lazy Loading)策略。系统不在启动时预加载所有知识库,而是在首次需要特定技能时才加载相关资源。
这与Web开发中的代码分割(Code Splitting)和数据库中的延迟加载的思想异曲同工:在正确的时间加载正确的资源,从而最小化初始开销,提升响应速度。
4.最小权限原则
安全基石:allowed-tools 是安全经典在 AI 领域的直接映射。
仅授予 Skill 完成其职责所恰好足够的权限,不多也不少。如同 Linux 操作系统中使用 hmod 精确控制文件读写执行权限、AWS 中使用 IAM Policy 精细限定服务访问范围。
明确 “不能做什么” 比定义 “能做什么” 更能保障系统安全,防止恶意代码或幻觉导致的越权操作。
5.开放标准
生态愿景:声明式、自包含、知识本位。
Anthropic 将 Skills 作为 Agent Skills 的开放标准(agentskills.io)规范推广。自 2025 年 12 月发布以来,已有超过 27 个 Agent 平台(包括 OpenAI Codex CLI、Google Gemini CLI、Cursor、GitHub Copilot 等)提供原生支持。
Skills 成功的三大本质属性如下。
声明式(Declarative):纯 Markdown 格式,任何大模型均可读取和理解,无黑盒二进制。
自包含(Self-contained):一个文件夹即包含全部所需,复制即安装,无需复杂的依赖管理。
知识本位(Knowledge-Centric):核心价值在于内容本身而非特定格式,不绑定单一平台。
开发者在 Claude Code 中精心设计的 Skill,理论上可以无缝迁移至任何支持该标准的 AI 平台,真正实现了“一次编写,到处运行”。
这不仅仅是一个关于产品特性的故事,而是一个关乎行业标准的故事。你所学到的,不只是“如何在 Claude Code 中配置某项功能”,而是“如何为 AI Agent 生态构建标准化的知识包”。
本章小结
Skills 直击开发者日常痛点:如何让 Claude 永久铭记专业工作范式,从而避免在每次对话中重新“教学”。在 Claude Code 的五层架构中,Skills 位居知识层,上承工具层(定义“能做什么”),下启智能体层(决定“谁来做”)。它向下通过 allowed-tools 约束工具行为,向上利用 skills 字段为子智能体注入专业知识,并与 CLAUDE.md 形成互补(前者常驻生效,后者按需调用)。
理解这套机制,关键在于把握四大核心设计。
渐进式披露:实现知识的按需加载。从始终驻留上下文的 description,到触发时加载的 SKILL.md 正文,再到执行中动态读取的引用文件。这一机制在多数场景下可节省 50%~98% 的 Token 消耗。
语义触发:确保专业能力在恰当时机自动激活。其中,description 是此机制的灵魂:它并非供人类阅读的说明书,而是辅助 Claude 决策的“语义指纹”。
安全约束:通过
allowed-tools将知识限定在安全的行动边界内,实现“知行合一”的安全设计。动态注入:借助参数传递(
$ARGUMENTS)与命令执行(!`command`),赋予 Skill 依据运行时上下文灵活应变的能力。
从更宏观的视角审视,Skills 实质上是人类组织数十年知识管理经验的数字化映射。在此体系中,SKILL.md 等同于部门 SOP 首页,reference/ 对应企业知识库,templates/ 即标准化输出模板,而 scripts/ 则是自动化工具集——这些角色在任一成熟企业中皆能找到精准对标。
更为关键的是,Skills 通过开放标准(agentskills.io)规范,将这一映射从企业内部拓展至行业层面:它推动知识管理从企业级的 “SOP” 跃升为行业级的 “ISO 标准”,确保 Skills 的知识价值不再受制于单一平台,而是成为整个生态的通用资产。