1. 从"agent-skills"说起:为什么AI编程助手需要一套技能体系
第一次看到agent-skills这个项目名,我脑子里蹦出来的不是"又一个工具库",而是一个更实际的问题:我们天天在用 Claude Code、Cursor 这类 AI coding agent 写代码,但它们到底"会"什么?它们的技能边界在哪里?能不能像给新员工做岗前培训一样,把一套标准化的技能喂给它们?
agent-skills解决的正是这个问题。它本质上是一套面向 AI coding agents 的技能定义与组织规范,核心载体是一个叫skills CLI的命令行工具,配合Claude Code这类支持技能加载的 agent 使用。你可以把它理解成给 AI 助手准备的"技能包管理系统"——每个技能是一个独立目录,里面用 Markdown 描述这个技能是什么、什么时候用、怎么用,agent 在需要的时候自动加载对应技能。
这套东西适合谁?三类人最该关注:一是每天用 Claude Code 写业务代码、但总觉得它"不够懂行"的开发者;二是想把团队内部规范、最佳实践沉淀成可复用资产的 Tech Lead;三是正在研究 AI agent 工程化落地的同学。它不解决模型能力问题,它解决的是"如何把人的经验结构化地交给 agent"这个问题。
我实测下来最大的感受是:以前给 AI 写 prompt 是"一次性消耗品",聊完就没了;现在用 skills 组织起来,是"可积累的资产"。这个差别,用过一段时间之后体感非常明显。
2. agent-skills 的整体设计与思路拆解
2.1 为什么是"技能"而不是"提示词"
传统做法是把所有要求塞进一个巨大的 system prompt 或者 CLAUDE.md 里。项目小的时候没问题,一旦规则超过几十条,就会出现两个典型症状:一是 agent 开始"选择性失忆",前面说的规则后面就忘了;二是 token 消耗飙升,每次对话都要把全部规则重新读一遍。
agent-skills的设计思路是按需加载。每个技能独立成目录,agent 只在判断当前任务需要某个技能时才把它读进来。这跟人处理工作的方式很像——你不需要在脑子里同时装着公司所有部门的 SOP,只需要在遇到具体问题时去翻对应的手册。
这个设计带来的直接好处有三个。第一是上下文干净,agent 的注意力集中在当前任务相关的规则上,不会被无关内容干扰。第二是可维护,改一个技能不影响其他技能,团队里不同人负责不同技能目录,冲突面很小。第三是可组合,一个复杂任务可以同时激活多个技能,比如"写测试"和"代码审查"两个技能可以叠加使用。
2.2 skills CLI 在整条链路里的位置
skills CLI是这套体系的入口工具。它的职责不是执行技能,而是管理技能——安装、列出、更新、删除。你可以把它类比成npm之于 Node 包,或者brew之于 macOS 软件。它本身很轻,真正的价值在于它定义了一套目录结构和元数据规范,让技能可以被发现、被版本化、被共享。
我一开始以为 CLI 只是个脚手架工具,用了几次才发现它的关键作用是统一约定。比如技能目录里必须有一个描述文件说明触发条件,必须有明确的输入输出说明,这些约定让 agent 能够可靠地判断"什么时候该用这个技能"。没有这层约定,技能就是一堆散落的 Markdown,agent 根本不知道该不该读。
2.3 和 Claude Code 的配合逻辑
Claude Code是目前对 skills 支持比较完整的 agent 之一。它的工作方式是:启动时扫描技能目录,建立索引;对话过程中根据用户请求和当前上下文,判断是否需要加载某个技能;需要时把技能内容注入上下文,然后按技能里描述的步骤执行。
这里有个容易被忽略的细节:技能不是"命令",而是"指导"。agent 读了技能之后,仍然是用自己的判断力去执行,技能提供的是领域知识、步骤框架和注意事项,而不是死板的脚本。这个定位很重要,它决定了技能应该写成"给聪明人看的操作手册",而不是"给机器执行的程序"。
提示:写技能的时候,把 agent 当成一个聪明但对你团队业务不熟的新同事。你要告诉它的是"我们这边通常怎么做、为什么这么做、哪些坑别踩",而不是"第一步敲这个命令第二步敲那个命令"。
3. 核心细节解析与实操要点
3.1 一个技能目录到底长什么样
基于常见实践,一个标准的技能目录结构大致是这样组织的:
skills/ test-driven-development/ SKILL.md references/ testing-patterns.md scripts/ run-tests.sh核心是SKILL.md这个文件,它承担了技能的"说明书"角色。里面通常包含几个关键部分:技能名称和一句话描述、触发条件(什么情况下该用这个技能)、执行步骤、注意事项、参考资源。references/放补充材料,scripts/放可执行脚本,这两块都是可选的,按需添加。
我踩过的一个坑是:一开始把SKILL.md写得太长,恨不得把所有相关知识都塞进去。结果 agent 加载之后反而抓不住重点。后来改成"主文件讲流程和判断标准,细节丢到 references 里按需引用",效果好很多。这个原则跟写技术文档是一样的——主文档给框架,附录给细节。
3.2 触发条件怎么写才靠谱
触发条件是整个技能里最需要打磨的部分。写得太宽,agent 动不动就加载,浪费上下文;写得太窄,该用的时候用不上。
我的经验是分三层来描述触发条件。第一层是任务类型,比如"当用户要求编写新功能代码时"。第二层是排除条件,比如"但如果只是修改配置或文档,不触发此技能"。第三层是优先级提示,比如"当同时匹配多个技能时,本技能优先于通用编码技能"。
举个具体的例子,test-driven-development这个技能的触发条件可以这样写:
- 当用户要求实现新功能或修复 bug 时触发
- 当用户明确提到"测试""TDD""先写测试"时强制触发
- 当任务只是重构且已有测试覆盖时,不强制触发,但建议参考
- 与代码生成类技能同时匹配时,本技能决定编码顺序
这种写法的好处是给 agent 提供了明确的决策依据,而不是让它猜。
3.3 技能内容的组织原则
技能内容我总结出四条原则,都是实际用下来觉得必须遵守的。
第一条:先讲为什么,再讲怎么做。agent 理解了意图之后,遇到技能没覆盖到的边缘情况也能做出合理判断。只讲步骤的技能,一旦遇到变体就抓瞎。
第二条:给判断标准,不给死规则。比如不要写"函数超过 20 行就拆分",而要写"函数职责是否单一,如果一段代码需要注释才能说清楚它在干什么,通常意味着该拆了"。前者是死规则,后者是判断力。
第三条:把坑写进去。这是技能最有价值的部分。团队踩过的坑、常见的错误做法、容易忽略的边界情况,这些是通用模型知识里没有的,也是技能区别于普通文档的核心。
第四条:保持可执行。技能里提到的脚本、命令、文件路径必须是真实可用的。我见过有人写技能时随手编了个命令,结果 agent 照着执行直接报错,整个流程就断了。
3.4 版本管理与团队协作
技能是要演进的。业务变了、工具升级了、踩了新坑,技能都得跟着更新。skills CLI通常提供版本管理能力,可以给技能打标签、记录变更。
团队协作场景下,我的建议是把技能目录纳入 Git 管理,跟代码一起走 PR 流程。谁改了哪个技能、为什么改,都有记录。新同事入职,clone 下来就能用团队积累的全部技能,这个上手速度比看文档快得多。
注意:技能里不要写敏感信息,比如内部系统地址、账号、密钥。技能是会被 agent 读取并可能出现在对话上下文里的,安全边界要划清楚。
4. 实操过程与核心环节实现
4.1 环境准备与 skills CLI 安装
先说环境。Claude Code本身支持 macOS、Linux 和 Windows(通过 WSL),skills CLI一般通过包管理器安装。以常见的 Node 环境为例:
# 确认 Node 版本,建议 18 以上 node -v # 全局安装 skills CLI(具体包名以官方文档为准) npm install -g skills-cli # 验证安装 skills --version如果你用的是 macOS,也可以用 Homebrew 装;Ubuntu 环境下 npm 方式最省事。安装完之后第一件事是初始化技能目录:
skills init这个命令会在当前目录创建skills/文件夹和基础配置文件。我建议把技能目录放在项目根目录,跟代码在一起,这样 agent 启动时能自动发现。
4.2 创建第一个技能:以 test-driven-development 为例
我们拿test-driven-development这个技能走一遍完整流程。先创建目录:
skills create test-driven-developmentCLI 会生成一个模板SKILL.md,然后我们往里填内容。核心结构如下:
# Test-Driven Development ## 何时使用 - 实现新功能时 - 修复有明确复现步骤的 bug 时 - 用户明确要求先写测试时 ## 执行流程 1. 先写一个失败的测试,明确期望行为 2. 运行测试,确认它确实失败(红) 3. 写最少量的代码让测试通过(绿) 4. 重构,保持测试通过(重构) 5. 重复上述循环 ## 判断标准 - 测试是否描述了行为而非实现 - 测试失败信息是否能直接指出问题 - 是否有测试覆盖边界情况 ## 常见坑 - 一次写太多测试再一起实现,失去 TDD 的反馈节奏 - 测试依赖实现细节,重构时大量测试失败 - 忘记先运行测试确认失败,导致测试本身有问题却没发现这个技能写完之后,agent 在处理编码任务时就会按这个节奏走。实测下来,它确实会先写测试再写实现,而不是像默认状态那样一口气把代码写完。
4.3 技能加载与验证
技能写好了,怎么确认 agent 真的会用?我的做法是设计一个验证任务。比如让 agent 实现一个简单的字符串处理函数,观察它的行为:
- 如果它先写测试文件,再写实现,说明技能生效了
- 如果它直接写实现,说明触发条件没匹配上,需要调整描述
验证的时候可以打开 Claude Code 的详细日志,看它加载了哪些技能。这个信息对调试技能非常关键。我一开始有个技能死活不触发,查了日志才发现是触发条件里的关键词跟用户实际表述对不上,改了几个词就正常了。
4.4 多技能组合的实战场景
真实项目里很少只用单个技能。举个我实际遇到的场景:给一个已有模块加新功能,同时要求代码质量和测试覆盖。这时候会同时激活三个技能——test-driven-development管编码节奏,code-review管质量标准,project-conventions管团队规范。
组合使用时要注意技能之间的优先级和冲突。比如 TDD 技能要求先写测试,而某个团队规范可能要求先定义接口。这时候需要在技能里明确说明优先级,或者在项目级配置里指定技能加载顺序。我的做法是在每个技能开头加一段"与其他技能的关系",说明本技能在什么情况下让位于其他技能。
4.5 技能的分发与更新
团队里技能怎么共享?两种方式。小团队直接把skills/目录提交到项目仓库,所有人 clone 就有。大团队或者跨项目复用,可以建一个独立的技能仓库,通过skills CLI的安装命令拉取:
skills install git+https://your-repo/skills.git#test-driven-development更新的时候:
skills update test-driven-development这里有个实践经验:技能更新要谨慎,尤其是被多个项目依赖的公共技能。我建议给技能做语义化版本,破坏性变更升大版本,让使用方有明确的升级预期。
5. 常见问题与排查技巧实录
5.1 技能不触发怎么办
这是最高频的问题。排查顺序我总结成一张表:
| 现象 | 可能原因 | 排查方法 |
|---|---|---|
| 完全不触发 | 技能目录位置不对 | 确认 agent 扫描路径包含技能目录 |
| 偶尔触发 | 触发条件描述模糊 | 检查关键词是否覆盖用户常见表述 |
| 该触发没触发 | 被其他技能抢占 | 查看日志确认加载了哪个技能 |
| 触发了但没效果 | 技能内容太抽象 | 补充具体步骤和判断标准 |
我遇到最多的是第二种,触发条件写得太"书面",而用户实际说话很口语。解决办法是在触发条件里同时写上正式表述和口语表述。
5.2 技能加载后 agent 行为异常
有时候技能加载了,但 agent 的行为反而变差了。常见原因是技能内容自相矛盾,或者跟 agent 的默认行为冲突太厉害。
我踩过一次坑:在技能里写了"所有函数必须有文档注释",结果 agent 给每个小函数都加了一堆废话注释,代码反而更难读。后来改成"公开 API 必须有文档注释,内部辅助函数按需",问题就解决了。技能里的规则要留出判断空间,不能一刀切。
5.3 上下文被技能占满
技能加载是要消耗 token 的。如果一次加载太多技能,或者单个技能太长,会挤占正常对话的上下文空间。我的控制策略是:单个SKILL.md控制在 500 行以内,超出部分拆到 references;同时激活的技能不超过 3 个;长技能用摘要加引用的方式组织。
5.4 技能与项目实际不符
技能是通用的,项目是具体的。经常出现技能说的做法跟项目实际情况对不上。这时候不要改技能去迁就单个项目,而是用项目级配置做覆盖。大多数 skills 体系都支持项目级覆盖文件,优先级高于通用技能。这样通用技能保持干净,项目特殊需求在项目层解决。
5.5 独家避坑清单
最后分享几条我实际踩出来的经验,都是文档里不会写的:
- 技能名用英文短横线命名,中文名在某些文件系统上会有编码问题
- 技能里引用的脚本要给绝对路径或明确的相对路径基准,否则 agent 执行时找不到
- 写完技能先自己手动走一遍流程,确认每一步都真的能执行,别让 agent 当小白鼠
- 技能更新后要重新验证,我遇到过更新技能后触发条件失效的情况
- 不要在一个技能里塞多个不相关的职责,一个技能解决一类问题,组合使用比大杂烩好维护
- 给技能写变更日志,尤其是团队共享的技能,别人需要知道改了什么
这套东西用下来,我最大的体会是:agent-skills 的价值不在于让 AI 变聪明,而在于让人的经验变得可传递、可积累。以前团队里的"老司机经验"散落在各种聊天记录和口头传授里,现在可以沉淀成技能,agent 每次执行都带着这些经验。这个转变,对团队整体效率的影响比换一个更强的模型要实在得多。