转载自公众号:敢敢AUTOHUB
0. 引言
在使用 Claude Code 的过程中,相当一部分开发者都会遭遇同一种尴尬:兴致勃勃地装了一批社区 skill,或者照着教程自己写了几个 SKILL.md,结果用了一两个月,Claude 几乎从未主动触发过任何一个。那些精心编排的文件最终安静地躺在目录里,像极了浏览器收藏夹里那些"以后一定会看"的文章。
这种现象的根源并不在于 skill 机制本身存在缺陷。根据 Anthropic 官方公开的数据,他们内部活跃使用的 skill 数量已经达到数百个量级,并且每天都在持续产生新的高质量 skill。官方近期发布了一篇题为《Lessons from building Claude Code: How we use skills》的技术博客,系统性地总结了大规模使用 skill 后沉淀下来的工程经验。这些经验涵盖了 skill 的本质定位、触发原理、内容编写要点、团队分发模式以及效果度量方法。
本文将围绕 skill 机制展开一次系统性的拆解,并结合源码分析、官方推荐实践、Claude Code 的运行时行为以及实战中验证过的具体 skill 列表,构建一份从原理到工程落地的完整指南。无论你是刚接触 Claude Code 的新手,还是已经在团队内部推广 skill 体系的工程师,都可以在文中找到对应深度的参考内容。
1. skill 是文件夹而非文件
1.1 最普遍的认知偏差
如果让一名普通用户描述什么是 skill,最常见的回答会是:"一份写了操作步骤的 markdown 文件,Claude 在需要时会去读取它。"Anthropic 在官方博客中明确指出,这正是关于 skill 机制最广泛、影响也最深远的认知偏差。
实际上 skill 的标准形态是一个目录结构。除了承担入口角色的 SKILL.md 之外,目录中还可以放置可执行脚本、参考资料、数据文件以及输出模板等多类资源。Claude 在执行任务的过程中能够自主发现并组合这些资源,从而完成远超"读一份说明"所能覆盖的复杂工作流程。
1.2 一个完整 skill 的目录结构
以一个用于服务部署的 skill 为例,规范的目录结构通常呈现如下形式:
deploy-service/
├── SKILL.md # 入口文件:触发条件 + 操作流程 + 坑点清单
├── references/ # 参考资料层(详细文档)
│ ├── api.md # 部署平台 API 的完整参数说明
│ └── troubleshooting.md # 部署失败时的系统化排查路径
├── scripts/ # 可执行脚本层(现成工具)
│ ├── smoke_test.sh # 部署后的冒烟测试脚本
│ └── rollback.sh # 一键回滚脚本
└── assets/ # 输出模板层(产物模板)
└── release_note.md # 发布报告的固定格式模板
在这个结构中,只有SKILL.md是强制要求的,其余目录都是按需添加的可选组件。references、scripts、assets 这些命名约定并非硬性规范,可以根据具体场景重新组织为更具语义表达力的目录名。
更值得注意的一个机制是,这些子文件并不会在 skill 被激活时一次性加载到 Claude 的上下文中。Claude 会根据任务推进的进度,按需到目录里检索对应资源。例如执行回滚操作时才去读取 rollback.sh,遇到陌生错误码时才去翻 troubleshooting.md。这套按需加载机制保证了即便 skill 体积膨胀到数十个文件,也不会对单次任务的上下文窗口造成不可控的压力。
1.3 文件夹结构带来的能力跃迁
可以做一个直观的类比来理解这种结构的价值。仅由 markdown 文件构成的 skill,相当于你给一名新同事发了一条微信消息:"部署流程是先这样再那样。"而完整目录形态的 skill,则相当于给这名同事提供了一整个工位:桌面上摆着操作手册,抽屉里准备好了现成的工具,墙上还贴着前任留下的"这台打印机会卡纸,要先按两下"的便利贴。两种交付方式对应的工作启动效率,会出现数量级上的差异。
在 Claude Code 的实现中,skill 还可以在 frontmatter 里声明额外的配置项,例如绑定特定的触发条件、注册仅在 skill 运行期间生效的动态 hook(这部分会在第五章详细展开)。Anthropic 内部统计发现,效果最好的那批 skill 几乎无一例外地把目录结构和配置项的能力用满了。仅写一份 markdown 的 skill,相当于只激活了这套机制大约十分之一的潜力。
下面给出一个最小可用的 SKILL.md frontmatter 示例,展示文件夹形态下入口文件的标准写法:
---
name: deploy-service
description: 当用户需要部署后端服务、检查发布状态、或在发布失败后回滚时使用。覆盖 staging 与 production 两个环境的完整发布流程。
allowed-tools:
- Bash
- Read
- Edit
metadata:
category: ci-cd
owner: platform-team
---
frontmatter 之后的正文部分则承担"操作流程 + 坑点清单 + 资源索引"三种角色,既给出标准动作,也提示 Claude 在哪些步骤可能需要额外加载 references 目录下的细节文档。
2. Anthropic 内部 skill 的九大分类
2.1 从混乱到秩序的归类工作
将认知从"一份文档"切换到"一个工具箱"之后,下一个值得讨论的问题是:到底什么样的任务才值得做成 skill。这个问题在团队推广 skill 体系的初期尤其重要,因为方向错了会导致大量精力投入到低频甚至零频的场景上,而真正高价值的痛点反而被遗漏。
Anthropic 内部做了一件相当有价值的工作:将公司内部数百个活跃 skill 全部拉出来进行聚类归纳,最终自然形成了九个稳定的类别。这份分类表可以直接作为团队规划 skill 体系时的参考蓝图。
2.2 九大类别速查表
| 类别 | 核心职责 | 典型示例 |
|---|---|---|
| 库与 API 参考 | 教 Claude 正确使用某个内部库或 CLI | 内部计费库的边界条件与历史坑点 |
| 产品验证 | 教 Claude 如何验证自己写出的代码 | 用 headless 浏览器跑通注册流程并逐步断言 |
| 数据查询与分析 | 连接数据仓库与监控系统 | 该 join 哪些表才能还原转化漏斗 |
| 业务流程自动化 | 将重复工作流压缩为单条命令 | 自动聚合工单与 PR 生成站会日报 |
| 代码脚手架 | 按团队规范生成样板代码 | 新建预接好鉴权与日志的内部应用 |
| 代码质量与审查 | 在组织内强制执行质量基线 | 派一个全新视角的子 agent 做对抗式审查 |
| CI/CD 与部署 | 拉取、推送、部署代码 | 监控 PR 状态、重试 flaky CI、解决冲突 |
| Runbook 排障手册 | 从报警症状出发的多工具排查 | 给定 trace id 把跨系统日志拉齐 |
| 基础设施运维 | 带护栏的例行维护操作 | 清理孤儿资源前先在 Slack 发起确认 |
2.3 分类表的两种使用方式
这张表格的实战价值体现在两个方向。第一种用法是检视已有 skill 库的合理性:把团队已经写好的所有 skill 对照这九个类别逐一归位,可以立刻识别出两类问题,一类是某些 skill 试图同时跨越多个类别,导致触发条件模糊不清;另一类是某些类别完全空白,对应的痛点尚未被覆盖。官方给出的判断标准非常直接:表现优秀的 skill 必须干净地落在某一个类别内,那些试图一次完成多类工作的 skill,反而容易让 agent 在判断该不该触发时陷入混乱。
第二种用法是规划新 skill 的优先级。如果团队精力有限,只能从九个类别里先打磨一个,官方给出了一个掷地有声的结论:验证类 skill 是内部实测对 Claude 输出质量提升最显著的一类。原文甚至建议派一名工程师专门花一整周的时间,什么都不做,只把验证类 skill 打磨到极致。这个投入产出比的判断背后有清晰的逻辑支撑。
2.4 为什么验证类 skill 价值最高
Claude 自身的代码生成能力已经足够强大,真正区分输出质量的关键变量其实不是"能不能写",而是"能不能确认自己写的东西是对的"。在缺少验证手段的情况下,Claude 只能停留在"我认为应该没问题"的状态;一旦配备了完善的验证 skill,它可以自动启动 headless 浏览器把注册流程、邮箱验证、引导页一步步跑完,每一步都附带断言,甚至录制一段视频让用户回看它实际测了哪些内容。
一个具备自我验收能力的 Claude 与一个只会"交作业"的 Claude,在工程产出质量上几乎是两种不同的物种。这也是官方反复强调要把首次 skill 投入压在验证类上的根本原因。下面给出一个产品验证 skill 的最小骨架,展示其与普通 skill 在结构上的差异:
---
name: e2e-signup-validator
description: 在用户完成与注册流程相关的代码改动后使用,自动启动 headless 浏览器跑完注册、邮箱验证、引导页全链路并对每一步进行断言。
allowed-tools:
- Bash
- Read
---
## 何时触发
- 用户修改了 src/auth、src/onboarding 目录下的文件
- 用户提到 "注册"、"signup"、"onboarding" 等关键词
## 验证步骤
1. 调用 scripts/run_signup_e2e.sh 启动测试
2. 收集 reports/last-run.json 中的断言结果
3. 任一断言失败时,引用 references/known-issues.md 给出排查建议
这种"知道何时启动、跑哪些断言、失败如何归因"的闭环,正是验证类 skill 价值的核心来源。
3. 渐进式披露与触发机制的底层原理
3.1 一个被反复忽视的问题
写好了 skill,却发现 Claude 从来不主动调用,这是社区里出现频率最高的反馈之一。要解释清楚这个现象,必须先回答一个底层问题:Claude 究竟是怎么判断"现在该用哪个 skill"的?
不少用户会下意识地认为,Claude 在每次对话开始前会读取所有 skill 的完整内容,然后挑选一个匹配度最高的。如果机制真的是这样设计的,装上五十个 skill 就足以把上下文窗口耗尽,整个体系完全无法在生产环境里使用。
实际的机制要精巧得多。Anthropic 把这种设计命名为渐进式披露(Progressive Disclosure):会话启动时只把每个 skill 的 name 与 description 拼接成一张"目录页"注入上下文;Claude 判断某个任务匹配上了某个 skill 之后,才会真正加载 SKILL.md 的完整正文;正文里引用到的 references、scripts 等子文件,则要等到 Claude 在执行过程中真正用到时才会被读取。整套披露过程像剥洋葱一样,分三层逐步打开。
3.2 源码层面的预算约束
理解了原理之后,可以进一步看一下 Claude Code 在源码层面是如何实现这套预算控制的。在 src/tools/SkillTool/prompt.ts 中可以找到两个关键常量:
export const SKILL_BUDGET_CONTEXT_PERCENT = 0.01;
export const MAX_LISTING_DESC_CHARS = 250;
这两行代码翻译成自然语言就是:整张 skill 清单允许占用的上下文窗口比例硬性上限为 1%;单个 skill 的 description 在清单中最多保留 250 个字符。一旦超过这个长度,截断逻辑会立即生效:
return desc.length > MAX_LISTING_DESC_CHARS
? desc.slice(0, MAX_LISTING_DESC_CHARS - 1) + '…'
: desc;
也就是说,第 251 个字符之后的所有内容会被直接砍掉,替换为一个省略号。如果你把核心触发条件写在 description 的第 300 个字符附近,Claude 实际上从未见过那段文字。这也解释了为什么很多看似详尽的 description 最终触发率反而很低。
3.3 装得越多反而越不触发
更极端的情形发生在 skill 数量过多时。一旦所有 description 加起来超出了 1% 的预算上限,Claude Code 会先按比例压缩每条 description;如果压缩后仍然装不下,就会进入降级模式,只显示 skill 名字,连一个字的描述都不保留。这种降级会以极其隐蔽的方式发生,用户在 UI 层完全感知不到。
这也合理解释了一个普遍的反直觉现象:装了几十个 skill 之后,触发率不仅没有上升,反而集体下降。装得越多,每个 skill 在 Claude 眼前能保留的判断信息就越少,最终所有 skill 都退化成只有名字的"哑巴"。skill 不是收藏品,贵精不贵多,这是从源码约束推导出来的硬结论。
3.4 description 的写法准则
明白了上述机制之后,写 description 的方法就有了明确的工程准则。description 的真正读者是模型而不是人类,因此它必须以"触发条件"的形式被组织,而非以"功能摘要"的形式被组织。下面是两种风格的对比:
| 风格 | 写法示例 | 触发表现 |
|---|---|---|
| 人类视角摘要 | 帮助处理数据库相关工作 | Claude 几乎从不主动激活 |
| 模型视角触发条件 | 当用户要写数据库迁移、修改表结构、或遇到 migration 报错时使用,覆盖 Postgres 与 MySQL 两种方言 | 命中率显著提升 |
更进一步的准则是,description 中应该明确包含"何时使用"以及"在什么场景下不使用"两类边界信号。Claude 在判断是否激活时会同时参考这两类信号,前者负责拉近相关任务的匹配度,后者负责把高度相关但实际不该走这条路径的任务排除掉。
3.5 SKILL.md 全文的懒加载
回到渐进式披露的第二层。当 Claude 决定调用某个 skill 时,Claude Code 会执行懒加载逻辑,并在拼接 SKILL.md 内容之前注入一段关键的元信息。在 src/skills/loadSkillsDir.ts 中可以找到:
async getPromptForCommand(args, toolUseContext) {
let finalContent = baseDir
? `Base directory for this skill: ${baseDir}nn${markdownContent}`
: markdownContent;
// ...
}
这段代码在 SKILL.md 全文的最前面追加了一行"该 skill 的根目录路径"。这一行的存在直接决定了第一章描述的子文件按需加载机制如何运转:references、scripts 等目录中的文件不会被系统主动加载,而是由 Claude 拿到根目录后,按 SKILL.md 中的指引主动调用文件读取工具去检索。三层披露由此完整闭环。
4. skill 正文的含金量法则
4.1 一道判断题
skill 被成功触发之后,正文的内容质量就成了决定输出效果的核心变量。下面给出两条候选内容,可以先做一个直观判断:哪一条更值得放进 skill。
候选 A:写完代码之后要运行测试,确保所有用例通过。
候选 B:subscriptions 表是只追加不修改的,你要找的那行记录是 version 字段最大的那条,而不是 created_at 最新的那条。
正确答案是候选 B。这个对比并非"略好一点"那种程度的差异,而是"一个有价值,一个反而有害"的天壤之别。要解释清楚这个判断,需要先理解一条官方反复强调的反模式。
4.2 反模式:陈述显而易见的事
候选 A 触犯了官方明令禁止的一条写作禁忌——陈述显而易见的事(don't state the obvious)。Claude 本身就具备完整的代码生成能力,本身就理解"写完代码要跑测试"这种基本工作流。把它默认就会做的事再写一遍,等价于向上下文里灌入纯噪音,没有提供任何增量信息,反而会挤占真正有价值内容的展示空间。
官方给出的判断标准非常简洁:如果一个 skill 的主要任务是传授知识,那么正文里只应包含能够把 Claude 推离默认思路的信息。所有 Claude 默认就会做、默认就会想到的内容,全部应该删掉。
一个具有代表性的应用案例是 Anthropic 自家的前端设计 skill。这份 skill 通篇没有教 Claude 任何 CSS 写法,而是反向列出了一长串"不要做"的清单:不要张口就用 Inter 字体,不要无脑套用紫色渐变,不要把所有按钮都做成圆角矩形等等。整篇 skill 的功能不是教学,而是纠偏。
4.3 含金量最高的内容形态:Gotchas
候选 B 之所以价值高,是因为它属于官方认定的、整个 skill 中信号最强的内容形态——Gotchas(坑点清单)。这类内容具有一个共同特征:Claude 仅靠阅读代码永远无法推断出来,只有真正在生产环境踩过坑的人才知道。下面三条来自官方博客的真实示例可以更直观地展示这种特征:
这个字段在 API 网关里叫 @request_id,在计费服务里叫 trace_id,它们指向的是同一个值。
staging 环境即便 Stripe 的回调没有被真正处理,也会返回 200,真实的处理状态需要去 payment_events 表里查询。
orders 表里 status=cancelled 的订单仍然会保留发货记录,过滤时必须额外排除 shipped_at 不为空的行。
每一条都在为 Claude 排除掉一个它必然会踩的雷。这种内容的密度直接决定了 skill 的实际生产价值。
4.4 坑点清单的持续积累机制
更重要的是,Gotchas 清单不是一次性写完的产物,而是随着使用反复迭代积累出来的。官方推荐的工作流是:每次 Claude 在使用某个 skill 时栽进了一个新的坑,立刻把这个坑回写到 SKILL.md 的对应位置。skill 会在这种持续反馈中越用越准。
下面给出一段建议的 Gotchas 章节模板,可以直接复用到自己的 skill 中:
## Gotchas(持续更新)
### 字段命名不一致
- API 网关:`@request_id`
- 计费服务:`trace_id`
- 日志系统:`req_id`
> 它们指向同一个值,跨系统排查时必须做归一化。
### staging 环境的回调误差
- Stripe 回调在 staging 即使未真正处理也会返回 200。
- 真实处理状态必须查询 `payment_events` 表,过滤 `status='processed'`。
### 不要相信 created_at
- subscriptions 表只追加,不修改。
- 取最新记录请使用 `version` 字段的最大值,而不是 `created_at`。
4.5 另一个反模式:把 Claude 锁死在轨道上
正文也不是写得越细越好,这里存在一个相反方向的陷阱,官方称之为避免铁轨化(avoid railroading)。Claude 对指令的服从度非常高,如果把执行步骤写得过于死板,它在遇到指令未覆盖的边界情况时会僵在轨道上硬开,明明应该随机应变的地方反而不敢偏离。
正确的写作姿势可以总结为一句话:把必要的信息给足,把走路的自由留给它。具体来说,应该明确给出目标、约束、边界条件和已知坑点,但不要把每一步操作都写成"先点这里、再点那里"的脚本式指令。Claude 在拥有充分信息后选择路径的能力,往往比开发者写死的路径更优。
5. skill 的三种进阶玩法
5.1 玩法一:给 skill 装上记忆
skill 的标准生命周期是无状态的,每次会话都是从零开始。但在某些场景下,"无状态"会成为致命缺陷。一个典型例子是自动写站会日报的 skill:今天跑一次,明天再跑一次,它如何知道哪些内容已经在前一天的日报里汇报过?如果每天都把所有进展从头讲一遍,输出价值会被严重稀释。
官方推荐的解法相当朴素:让 skill 把执行结果存在自己的目录里。日报 skill 可以维护一个 history.jsonl 文件,每发一次日报就追加一条记录。下次执行时,Claude 先读取这份历史,自然就能识别出"只汇报上次执行之后的增量"。简单场景下使用追加式的文本日志或 JSON 即可,复杂场景甚至可以在 skill 目录里塞一个 SQLite 数据库。
为了让这种"记忆"能够跨越 plugin 升级安全留存,Claude Code 专门提供了一个稳定的数据目录,可以通过环境变量 CLAUDE_PLUGIN_DATA 在 skill 中读取:
#!/usr/bin/env bash
# scripts/append_history.sh
DATA_DIR="${CLAUDE_PLUGIN_DATA:-$(dirname "$0")/../.data}"
mkdir -p "$DATA_DIR"
HISTORY_FILE="$DATA_DIR/standup_history.jsonl"
TODAY=$(date -u +%Y-%m-%d)
SUMMARY="$1"
echo "{"date":"$TODAY","summary":$(jq -Rs . <<<"$SUMMARY")}" >> "$HISTORY_FILE"
echo "Appended entry for $TODAY"
这个目录的最大特点是持久性:plugin 升级换版本时都不会被清空,只有彻底卸载时才会被删除。也就是说,skill 的记忆可以放心地活得比 skill 自身的版本周期更久。
记忆机制还有一个非常实用的变种用法——存储首次配置。某些 skill 在第一次使用前需要从用户那里收集少量信息,比如日报 skill 需要知道目标频道是哪一个。这类信息既不该硬编码在 SKILL.md 里(否则无法分发),也不该每次执行都重新询问(用户体验灾难)。规范的模式是在 skill 目录下维护一份 config.json:执行时先检查配置是否存在,存在就直接读取,不存在就主动以选择题形式向用户收集,写入配置后下次直接使用。
5.2 玩法二:把现成代码交给 Claude 编排
官方博客中有一句论断值得反复体会:你能交给 Claude 最有力的工具,就是代码本身。这句话的含义是,与其让 Claude 每次都从零现场写一段处理逻辑,不如把成熟的函数库预先放进 skill 目录,让 Claude 在每个回合里只负责"组合调用",而不是"重新发明"。
举一个数据分析 skill 的例子。如果 skill 目录下什么辅助代码都没有,Claude 每次分析都要现场写连接数据源、拼 SQL、计算留存率的样板代码,又慢又容易出错。但如果 skill 目录下提供了一份 analytics_lib.py,里面把取数、清洗、对比、可视化全部封装成现成的函数,Claude 的每一个回合就都花在刀刃上——思考接下来该组合哪几个函数,而不是重新写一遍轮子。
# scripts/analytics_lib.py
def fetch_dau(start_date: str, end_date: str) -> "pd.DataFrame":
"""拉取指定日期范围的 DAU 数据,已自动剔除内部账号。"""
...
def cohort_retention(df, cohort_field="signup_date", event_field="active_date"):
"""计算同期群留存矩阵,返回标准化后的百分比表。"""
...
def compare_periods(metric, current_range, baseline_range):
"""对比两个时间段的指标差异,自动检测显著性。"""
...
用户问一句"周二的 DAU 数据怎么了",Claude 现场写一段十几行的小脚本,把上述函数组合起来就能跑出答案。这种"函数库 + 编排"的模式,是把 skill 从文档升级为生产工具的关键路径。
5.3 玩法三:注册仅在 skill 激活期间生效的 hook
三种进阶玩法中最容易被忽视、但想象空间最大的一项是动态 hook。skill 可以在 frontmatter 里声明一组只在当前 skill 被调用时注册、会话结束自动失效的 hook。这种设计的精妙之处在于,它把"高强度的护栏"与"低骚扰的日常"完全解耦。
官方给出的两个实战案例值得反复揣摩。第一个 skill 名叫 careful:激活后会自动拦截 rm -rf、DROP TABLE、git push --force 这类高破坏性命令。如果这种拦截常驻开启,普通开发体验会被破坏到无法忍受;但当用户明确意识到"我现在要操作生产环境"的时刻,手动激活这个 skill,就构成了一道恰到好处的保险。
第二个 skill 名叫 freeze:激活后会禁止修改指定目录之外的任何文件。这个 skill 专治排查 bug 时常见的副作用问题——开发者只是想加两行调试日志,结果 Claude 顺手把一段无关代码也"优化"掉了。下面是动态 hook 的声明示例:
---
name: freeze
description: 在 debug 模式下使用,禁止 Claude 修改用户指定目录之外的任何文件,防止意外副作用。
hooks:
PreToolUse:
- matcher: Edit|Write
command: scripts/check_frozen_paths.sh
---
这种 hook 直接在 frontmatter 里声明,skill 被调用时自动注册,会话结束自动失效,无需用户手动维护全局 hook 配置。它把"可被随时启用、随时关闭的临时保险丝"以极轻的方式集成进了 skill 体系。
6. 从个人工作台到团队 marketplace
6.1 两条分发路径
一个人把 skill 用明白了,价值是 1;让整个团队都用上,价值才是 N。但 skill 走向团队化时会立刻遇到三个新问题:怎么分发、谁来审批、质量如何保证。先看分发。
官方给出了两条成熟路径。第一条路径是直接将 skill 提交进代码仓库,统一放在 .claude/skills 目录下。团队成员拉取代码时 skill 会跟随到位,零成本同步。这种方式适合小团队、仓库数量有限的场景。但它有一个隐性代价:仓库里每多一个 skill,所有人每次会话的清单中就会多一行,无差别承担那 1% 的上下文预算开销,无论用不用得上。
第二条路径是将 skill 打包为 plugin,搭建团队内部的 plugin marketplace。需要的成员手动安装,上下文成本回归到"谁用谁付"。新人入职时统一安装团队的核心 plugin 集合,立刻获得与老员工同等的工具装备。当团队规模扩大、skill 数量增长之后,这条路径几乎是必选项。
6.2 自然演化的审批机制
那么 marketplace 由谁来管?哪些 skill 能上架?Anthropic 内部的实践可能会颠覆很多团队的预期:没有任何中心化的团队负责审批。
他们的实际玩法是完全的自然演化机制。任何人写了一个新 skill,先把它扔进 GitHub 上的"沙盒文件夹",并在 Slack 里吆喝一声。使用者多了、口碑积累起来之后(火没火完全由 skill 作者自己判断),作者再发起一个 PR,把这个 skill 从沙盒挪进正式 marketplace。整个过程没有任何评审委员会、没有强制门禁、没有 KPI 推动。
这个机制的底层逻辑与开源社区高度相似:好东西靠口碑自然生长,而不是靠委员会评选。审批环节越重,愿意分享的人越少;门槛低到"扔进沙盒就行",几百个高质量 skill 才能在合理时间内积累起来。从治理角度看,这是一种刻意保持低摩擦的设计选择。
6.3 skill 之间的依赖管理
团队规模扩大后必然会面对一个绕不开的问题:skill 之间能否互相依赖?例如一个生成 CSV 的 skill,最后一步需要调用另一个文件上传 skill,这种调用关系如何描述?
官方对此给出了一个略带"惊喜感"的答案:依赖管理目前没有原生支持,但解法出乎意料地简单——直接在 skill 正文里报另一个 skill 的名字即可,只要对方已经安装,模型自然会去调用。一段示例如下:
## 后处理步骤
完成 CSV 生成后,请调用 `file-upload` skill 把结果上传到团队的共享存储,
并把上传后的下载链接附在最终回复里。
这种依赖声明能够生效,前提是执行者本身就是一个能够理解自然语言指令的 agent。"用 file-upload skill 把结果传上去"这句话本身就构成了一份显式的依赖声明,无需任何额外的 manifest 字段或 lock 文件。这种设计在大规模 skill 生态里看起来反直觉,但在实际使用中却出奇稳定。
7. 用数据让 skill 体系自我进化
7.1 一个少有人问的关键问题
skill 攒到几十个、marketplace 也搭起来之后,绝大多数团队都会忽略掉最关键的一步:到底哪些 skill 真的有人在用,哪些写完就成了仓库里的化石?
如果没有量化数据,这个问题只能靠"感觉"来回答。靠感觉的结果通常是:团队继续给那些没人使用的 skill 添砖加瓦,而真正高频被调用的 skill 反而无人维护。久而久之,skill 库会演变成一个谁也不敢动、谁也不愿意用的杂物间。
7.2 用 PreToolUse hook 做埋点
Anthropic 给出的解法非常工程化:用一个 PreToolUse hook 监听 skill 工具的每一次调用,把"谁在什么时候用了哪个 skill"记录下来,最终汇总成全公司层面的使用统计。下面给出一个最小可用的埋点脚本骨架,可以直接放在团队 plugin 中:
#!/usr/bin/env bash
# hooks/skill-usage-logger.sh
LOG_FILE="${CLAUDE_TEAM_DATA:-$HOME/.claude/team}/skill-usage.jsonl"
mkdir -p "$(dirname "$LOG_FILE")"
TIMESTAMP=$(date -u +%Y-%m-%dT%H:%M:%SZ)
USER="${USER:-unknown}"
SKILL_NAME="$1"
echo "{"ts":"$TIMESTAMP","user":"$USER","skill":"$SKILL_NAME"}" >> "$LOG_FILE"
把这段脚本绑定到 SkillTool 的 PreToolUse 事件上,每个 skill 调用就会自动留下一条结构化日志。汇总分析后,两类问题会立即浮现:第一类是"高频受欢迎 skill",调用量大、值得优先维护与打磨;第二类是"触发不足(undertriggering)",预期高频却几乎无人使用——这往往是第三章描述的 description 写法问题,应该回头去优化触发条件。
7.3 把 skill 建设从凭感觉做切换到看数据做
这件事的实施成本低到几乎没有任何借口拒绝:一个 hook、一段日志脚本、一个简单的聚合查询即可起步。但它对 skill 体系的影响是结构性的——它把 skill 建设从"凭感觉做"切换到了"看数据做"。当团队具备了使用频次数据后,所有的资源投入都可以被合理排序,所有的废弃决策都有数据支撑,整个 skill 库进入了一种自我进化的良性循环。
不被度量的 skill 库迟早会变成一个杂物间,被持续度量的 skill 库才能持续产生复利。这是 Anthropic 内部数百个 skill 能够长期保持高质量的底层机制。
8. 实战 skill 精选
理论部分已经足够支撑你写出高质量的 skill。但对很多刚开始接触 Claude Code 的用户而言,更直接的需求是"先有几个能用的 skill 装上"。以下是经过实战验证、值得优先安装的几款开源 skill,覆盖浏览器自动化、内容生产、代码可视化等常见场景。
8.1 Web-access:让 Claude 控制本地浏览器
仓库地址:https://github.com/eze-is/web-access
当 Claude Code 自带的浏览器插件无法控制本地 Chrome 时,Web-access 是最稳定的替代方案。它通过 Chrome DevTools Protocol(CDP)与本地浏览器通信,让 Claude 能够带着登录态去点击页面、滚动、截图、读取动态加载的内容。适用场景包括读取需要登录的页面、提取动态渲染的 SPA 内容,以及把固定的浏览器操作封装为自动化流程。
启用前需要打开浏览器的远程调试开关:
| 浏览器 | 入口地址 |
|---|---|
| Chrome | chrome://inspect/#remote-debugging |
| Edge | edge://inspect/#remote-debugging |
打开开关后,Claude 就可以通过 CDP 接口接管浏览器,完成普通 HTTP 抓取做不到的任务。
8.2 Agent-Reach:跨平台社媒内容读取
仓库地址:https://github.com/Panniantong/Agent-Reach
如果说 Web-access 解决的是"操作浏览器"的问题,Agent-Reach 解决的就是"读懂内容"的问题。它内置了一份覆盖 YouTube、Reddit、X、GitHub、B 站、小红书、RSS 等主流平台的"信息地图",每个平台对应的目标数据所在页面、需要提取的关键字段都已经预先标记完毕。
Claude 在使用这份 skill 时,相当于拿到了一份各大平台的导航说明书,可以按图索骥地完成调研、内容总结、社区口碑搜索、竞品观察等任务。在跨平台情报汇总场景下,它的效率比逐站手写抓取脚本要高出一个量级。
8.3 Humanizer-zh:去除 AI 写作痕迹
仓库地址:https://github.com/op7418/Humanizer-zh
这个 skill 专门用来处理"AI 味"问题。如果你觉得 Claude 输出的中文内容太机械、太模板化,或者太像"正确但没感情的总结",可以用它做一次后处理。它能够识别并改写常见的 AI 写作痕迹,包括空泛拔高、三段式结构、宣传腔调、过度连接词以及结尾强行升华等问题。
它的典型应用场景是公众号推文、情感类长文、演讲稿等需要更强"人味"的文本类型。在这些场景下,去除 AI 味甚至比内容本身的信息密度更影响最终阅读体验。
8.4 html-anything:把任何内容转换为可视化形态
仓库地址:https://github.com/nexu-io/html-anything
这个 skill 解决的是"AI 输出过度依赖 markdown"的体验问题。markdown 在内容超过 100 行后阅读体验会迅速下降,而 html-anything 让 Claude 能够把内容转换为更适合阅读与传播的形式:主题演讲、网页原型、数据报告、海报、小红书卡片、推文卡片等等。
工作流非常简洁:把草稿交给 Claude,由 Claude 负责生成 HTML 内容,前端工具负责预览与导出。这种"内容生成与渲染解耦"的模式,让同一份信息可以根据传播渠道灵活适配为不同形态。
8.5 HyperFrames:用网页生成视频
仓库地址:https://github.com/heygen-com/hyperframes
HyperFrames 不只是一份 SKILL.md,而是一整套视频生成框架。它的核心思路是让 Claude 写 HTML、CSS、动画与媒体内容,再通过 Headless Chrome 渲染画面,最后用 FFmpeg 将渲染序列合成为 MP4。Claude 不需要学习任何传统剪辑软件,它只需要写网页,HyperFrames 负责把网页变成视频。
它适合产品介绍、代码讲解、数据动画、短视频内容等场景。在团队内部,这种 skill 还可以与 CI 流水线结合,每次发布版本自动生成发布说明视频,进一步压缩内容生产成本。
8.6 GitNexus:把仓库变成知识图谱
仓库地址:https://github.com/abhigyanpatwari/GitNexus
GitNexus 把代码库转换为结构化知识图谱,提取仓库内的依赖关系、调用链、模块边界与执行流程,再通过工具接口暴露给 Claude。这个能力在大型仓库里尤其重要——如果 Claude 仅依赖文件检索,会非常容易漏掉跨文件的上下文。
有了代码图谱之后,"这个函数被谁调用"、"这个模块和哪里有关"、"修改这里会影响什么"这类问题都能得到精确回答。它本质上是把传统 IDE 的符号索引能力,以 skill 的形式补给 Claude 使用。
8.7 Skill Creator:用 skill 生产 skill
最值得单独介绍的是一份"用来制作 skill 的 skill"——Skill Creator。它把"识别可复用流程 → 提取输入输出 → 生成 SKILL.md → 编写坑点清单"整个工作流封装成了一份元 skill。
实际使用方式非常自然:当你刚刚和 Claude 完成一项重复性任务(例如整理周报、做数据分析、跑一组检查),可以在同一个对话窗口里让 Skill Creator 把刚才的过程沉淀为一份正式 skill。下次再遇到类似任务时,直接复用即可。这是把 Claude Code 从"对话工具"升级为"持续增强的本地工作台"的关键习惯。
9. 完整落地流程
把前面八章串起来,可以得到一份从零开始构建 skill 体系的完整实施路径。下面以一个团队为单位给出一份可执行的阶段化方案。
9.1 第一阶段:从单点验证类 skill 起步
不要一开始就尝试覆盖所有九个类别。优先选择第二章列出的"产品验证"类别中最高频的痛点,例如核心业务流的端到端测试、关键页面的视觉回归、核心 API 的契约校验。投入一名工程师一周时间,把这一个 skill 做到极致。这个阶段的成功标志是:Claude 在涉及对应代码的任何修改之后,都能自动激活这份 skill 并产出可读的验证报告。
9.2 第二阶段:建立坑点清单文化
第一份 skill 上线之后,立刻建立"踩坑回写"的工作纪律。每当 Claude 在使用 skill 的过程中产生了错误结论或走了弯路,回写一条 Gotchas 进 SKILL.md。两到四周之后,这份 skill 的命中率会开始出现可观察的提升。这个阶段的成功标志是:skill 的 Gotchas 章节稳定增长,并且团队成员开始主动贡献坑点。
9.3 第三阶段:扩展到九大类别中的高频领域
有了第一份 skill 的成功范本之后,按照团队实际工作流的频次排序,逐步扩展到 CI/CD、Runbook 排障、代码脚手架等高频类别。在这个阶段需要严格遵守第三章的 description 写法准则,并控制单个 skill 的职责边界,避免出现跨类别的 hybrid skill。
9.4 第四阶段:搭建 marketplace 与埋点体系
当 skill 数量增长到接近上下文预算阈值时,立刻启动 plugin marketplace 的搭建。同时按照第七章描述的方式部署 PreToolUse 埋点 hook,把 skill 调用的频次数据采集起来。这个阶段的成功标志是:团队拥有一份可以按周更新的"skill 使用仪表盘",能够清晰看到高频 skill 与触发不足 skill 的分布。
9.5 第五阶段:进入数据驱动的持续进化
最后一个阶段是把上述能力整合为一个良性循环:数据驱动的 skill 优先级排序、坑点清单的持续积累、新场景的 skill 化沉淀(借助 Skill Creator)。在这个阶段,skill 体系会成为一项具有复利效应的资产,越用越好用。
10. 结语
把整份文档浓缩成三句可以反复回味的结论:
第一,skill 的本质是文件夹而非文件。脚本、坑点清单、记忆文件、临时 hook 都用上之后,它才能成为一个完整的工作系统,而不仅仅是一份说明文档。
第二,决定 skill 命运的是 description 的前 250 个字符。把它写成"什么场景下使用我"的触发条件,而不是给人看的功能摘要。装太多 skill 会互相挤占清单预算,贵精不贵多。
第三,如果只能投入做一件事,先做验证类 skill。让 Claude 能够自己确认工作成果,是 Anthropic 内部实测回报最大的投入方向。
Anthropic 官方博客的结尾有一句话值得作为长期的提醒:他们内部最好的那批 skill,几乎都是从"几行字加一个坑点"开始的,然后随着 Claude 撞上一个个新的边界情况,被人一点点喂养大。skill 不是一次写完的产物,而是一份和 Claude 共同成长的契约。
参考资料
- • Anthropic 官方博客《Lessons from building Claude Code: How we use skills》:https://claude.com/blog/lessons-from-building-claude-code-how-we-use-skills• 分享8个codex必装的skill,让你的AI能力起飞!(https://mp.weixin.qq.com/s/_Mc5H3vcntXQ61ks9zE2Rg)• Claude Code 官方文档(Skills 章节)(https://code.claude.com/docs/en/skills)• 官方示例 skill 仓库(https://github.com/anthropics/skills)• Web-access(https://github.com/eze-is/web-access)• Agent-Reach(https://github.com/Panniantong/Agent-Reach)• Humanizer-zh(https://github.com/op7418/Humanizer-zh)• Guizang PPT Skill(https://github.com/op7418/guizang-ppt-Skill)• html-anything(https://github.com/nexu-io/html-anything)• HyperFrames(https://github.com/heygen-com/hyperframes)• GitNexus(https://github.com/abhigyanpatwari/GitNexus)
224