1. 从"agent-skills"这个标题能读出什么
第一次看到agent-skills这个仓库名,我的直觉是:这不是又一个"提示词合集",而是一套把 AI coding agent 当"可训练对象"来对待的工程化方案。关键词里同时出现了skills CLI、test-driven-development、Claude Code,这三者放在一起,指向的其实是一条很清晰的链路——用命令行工具管理技能包,用测试驱动的方式约束 agent 的行为,最终落到 Claude Code 这类终端 agent 上跑起来。
很多人对 AI coding agent 的理解还停留在"对话框里问一句、它答一句"。但真正在项目里用过一段时间就会发现,agent 最大的问题不是"不够聪明",而是"不稳定":同一个任务,今天跑得对,明天换个上下文就跑偏;你教它一次规范,下次开新会话它全忘了。agent-skills这类项目要解决的核心痛点,就是把"你希望 agent 怎么做"这件事,从一次性的对话,变成可复用、可版本管理、可测试的资产。
这篇文章适合三类人看:一是已经在用 Claude Code 或类似终端 agent、但总觉得"每次都要重新调教"的开发者;二是想给团队建立一套 AI 协作规范、却不知道从哪下手的技术负责人;三是纯粹好奇"skills 到底是个什么东西、值不值得投入时间学"的观望者。我会从概念拆解讲到实操落地,把中间那些文档里不会写的坑一并交代清楚。
需要先说明一点:agent-skills这个仓库本身公开信息有限,下面的内容是基于标题、关键词和当前 AI coding agent 生态的常见实践做的合理推演与补全,凡是推演的部分我都会明确标注,方便你对照自己的实际情况判断。
2. skills 到底是什么:把"调教经验"变成可复用资产
2.1 从"提示词"到"技能包"的认知升级
大部分人用 agent 的方式是:遇到问题,写一段提示词,得到结果,关掉窗口。下次遇到类似问题,再写一遍,或者翻聊天记录复制粘贴。这种做法在一次性任务上没问题,但一旦任务重复出现——比如"每次新增 API 都要写对应的测试""每次改数据库 schema 都要同步更新文档"——你就会发现自己在做大量重复劳动。
skills 的思路完全不同。它把一类任务的触发条件、执行步骤、约束规则、验收标准打包成一个结构化的目录,agent 在遇到匹配场景时自动加载。你可以把它理解成给 agent 装的"插件"或者"操作手册":不是每次口头交代,而是提前写好、随取随用。
这里有个关键区别值得强调:普通提示词是"上下文相关"的,会话一结束就失效;skills 是"持久化"的,存在文件系统里,可以提交到 git,可以 review,可以迭代。这个差别看起来小,实际上决定了你能不能把 AI 协作真正纳入工程流程。
2.2 一个 skill 通常包含哪些部分
根据当前主流 agent 框架的通用设计,一个 skill 目录大致长这样:
skills/ add-api-endpoint/ SKILL.md # 技能说明:什么时候用、怎么用 template.py # 代码模板 checklist.md # 验收清单 examples/ # 正反例SKILL.md是核心,通常包含几块内容:触发描述(什么情况下该激活这个技能)、前置条件(需要哪些信息才能开始)、执行步骤(分几步、每步做什么)、输出格式(结果长什么样)、常见错误(哪些坑要避开)。这个结构和人写 SOP 的逻辑是一样的,只不过读者从人变成了 agent。
我个人的经验是,SKILL.md里最值钱的不是"步骤",而是"常见错误"那一节。步骤 agent 自己也能推出来个大概,但那些"上次这里踩过坑"的经验,只有写进去它才知道。这恰恰是 skills 相对于通用提示词的核心价值——承载的是你的项目特定知识,而不是通用能力。
2.3 为什么用 CLI 来管理
关键词里出现了skills CLI,这说明项目提供了命令行工具来管理技能包。为什么不用图形界面、不用手动复制文件夹?因为 CLI 天然适合集成到开发流程里。
想象几个场景:新同事入职,一条命令skills install就把团队所有规范装好;技能更新了,skills update一键同步;想看看某个技能被用过多少次、效果如何,skills list --stats直接出报表。这些操作如果靠手动拖文件夹,很快就会乱成一锅粥。
CLI 还有一个隐性好处:可脚本化。你可以在 CI 流程里加一步"检查 skills 是否最新",在 pre-commit hook 里加一步"验证 skill 格式合法性"。这些自动化能力,是图形工具给不了的。
3. 为什么 skills 和测试驱动开发绑在一起
3.1 agent 的不确定性需要"测试"来兜底
传统软件开发里,测试的作用是保证"改了 A 不会弄坏 B"。AI agent 场景下,这个问题更严重:agent 的行为受上下文、模型版本、甚至温度参数影响,同一段提示词在不同时间可能给出不同结果。如果没有一套验证机制,你根本不知道"这次改动到底让 agent 变好了还是变坏了"。
test-driven-development出现在关键词里,我认为它有两层含义。第一层是用 TDD 的方式开发 skill 本身:先写清楚"这个 skill 应该产出什么结果"(相当于测试用例),再写 skill 内容,最后跑验证。第二层是skill 的内容本身就在教 agent 做 TDD:比如一个"新增功能"的 skill,会强制要求 agent 先写测试、再写实现。
这两层其实是统一的:你希望 agent 遵守 TDD,那你自己定义 skill 的过程也得是 TDD 式的。以身作则,逻辑才自洽。
3.2 给 skill 写"测试"具体怎么写
给代码写测试大家都熟,给 skill 写测试是个新问题。我的做法是维护一个"场景-期望"对照表:
| 场景输入 | 期望行为 | 验证方式 |
|---|---|---|
| 用户说"加个登录接口" | 激活 add-api-endpoint skill | 检查 agent 是否读取了 SKILL.md |
| 用户说"改下这个函数名" | 不激活该 skill | 检查是否走了通用流程 |
| skill 执行到第 3 步 | 产出符合模板的代码 | 对比 template.py 结构 |
| 故意给错误输入 | 触发"常见错误"提示 | 检查是否命中 checklist |
这张表不需要多复杂,关键是把"我以为它会怎么做"变成"我验证过它会怎么做"。很多 skill 写完之后从没验证过,结果 agent 要么不激活,要么激活了乱来,你还以为是模型不行。
3.3 一个反直觉的结论
我踩过最大的坑是:skill 写得越详细,agent 反而越容易僵化。早期我给一个 skill 写了 20 多条规则,结果 agent 遇到稍微不同的场景就卡住,因为它死抠规则字面意思,不会变通。
后来我调整了策略:规则只写"必须遵守的硬约束"(比如"必须写测试""不能改公共接口"),把"建议做法"单独放一节,明确标注"可灵活调整"。这样 agent 既有边界感,又有发挥空间。这个经验我认为对所有写 skill 的人都适用——约束要硬,建议要软,两者别混在一起。
4. 在 Claude Code 里跑通 skills 的完整链路
4.1 环境准备:别在第一步就卡住
Claude Code 是终端里的 agent 工具,安装方式根据系统不同有差异。macOS 和 Ubuntu 上的安装流程基本一致,核心是确保 Node 环境版本够新(建议 18 以上),然后用官方提供的安装方式拉取。安装完成后,第一次运行会引导你完成账号相关配置。
这里有个常见问题:很多人装完之后发现命令找不到,八成是 PATH 没配好。解决办法是检查安装脚本输出的路径提示,手动加到 shell 配置文件里,然后source一下。这个坑几乎每个新手都会踩一次,提前知道能省半小时。
VS Code 用户还可以装对应的插件,把 Claude Code 集成到编辑器里。插件配置的核心是告诉它"用哪个终端、走哪个模型"。如果你用的是第三方模型接入方案,配置项会多一些,需要填 API 地址和密钥。这部分配置建议单独放一个文件管理,别硬编码在项目里,避免误提交。
4.2 把 skills 挂载到 agent 上
skills 目录准备好之后,需要让 Claude Code 知道去哪找。通常有两种方式:一是放在项目根目录的约定位置(比如.claude/skills/),agent 启动时自动扫描;二是通过 CLI 显式注册路径。
我推荐第一种,因为约定优于配置,团队协作时不用每个人都去配一遍。目录结构建议按功能分类:
.claude/skills/ backend/ add-api-endpoint/ add-db-migration/ frontend/ add-component/ common/ write-tests/ update-docs/分类的好处是,当技能多起来之后,你能快速定位。而且 agent 扫描时也能根据当前任务类型缩小范围,减少误激活。
4.3 验证 skill 是否真的生效
挂载完之后别急着用,先做一次验证。最简单的办法是给 agent 一个明确匹配某个 skill 的任务,然后观察它的行为:有没有读取 SKILL.md?执行步骤是否符合预期?输出格式对不对?
如果没生效,排查顺序是:先确认目录路径对不对,再确认 SKILL.md 的触发描述是否够明确,最后确认 agent 的版本是否支持 skills 机制。我遇到过最隐蔽的问题是触发描述写得太抽象,比如写"处理代码相关任务",结果 agent 觉得所有任务都匹配,反而不知道该不该激活。触发描述要具体到"当用户要求新增 REST API 端点时"这种程度。
提示:skill 调试期间,建议开一个单独的测试项目,别在正式项目里试。agent 误操作改坏代码的情况虽然少见,但一旦发生很耽误事。
5. 写一个能用的 skill:从零到跑通的实操
5.1 先想清楚"这个 skill 解决什么重复问题"
不是所有任务都值得做成 skill。判断标准很简单:这个任务你会不会做第二次、第三次?如果是一次性的,写提示词就够了;如果是反复出现的,才值得投入时间做 skill。
举个例子,"给项目加一个新的 API 端点"就是典型的高频任务,涉及路由注册、控制器编写、参数校验、测试补充、文档更新等一串固定动作,非常适合做成 skill。而"帮我分析下这段代码为什么慢"这种高度依赖具体上下文的任务,做成 skill 反而累赘。
我一般会先列一个"重复任务清单",按频率排序,从最高频的开始做 skill。做完一个用一周,看效果再决定要不要做下一个。别一上来就想搞个大而全的技能库,那是典型的过度设计。
5.2 SKILL.md 的写法:结构比文采重要
一份好的 SKILL.md,我总结成"五段式":
第一段是触发条件,用一两句话说明什么情况下激活。要具体,包含关键词,比如"当用户要求新增 API 端点、添加路由、创建控制器时激活"。
第二段是前置检查,列出开始前必须确认的信息。比如"确认端点路径、HTTP 方法、是否需要鉴权"。如果信息不全,agent 应该主动询问而不是瞎猜。
第三段是执行步骤,分步骤写,每步一个动作。步骤之间要有明确的先后依赖,别写成并列的清单。
第四段是输出要求,说明结果应该包含哪些文件、什么格式。最好配一个模板文件,让 agent 照着填。
第五段是常见错误,把你踩过的坑写进去。这一节是 skill 的灵魂,直接决定它比通用提示词强多少。
5.3 用 TDD 思路验证 skill
写完 SKILL.md 别急着用,先设计几个测试场景。我通常准备三类:标准场景(正常输入,看输出对不对)、边界场景(信息不全或格式奇怪,看 agent 会不会乱来)、干扰场景(相似但不该激活的任务,看会不会误触发)。
跑完这三类,基本能判断 skill 是否可用。如果标准场景通过、边界场景 agent 会主动询问、干扰场景不误触发,那这个 skill 就算合格了。任何一类出问题,回去改 SKILL.md 对应部分,再跑一遍。
这个过程听起来繁琐,但比"写完直接用、出问题再改"效率高得多。因为 skill 一旦被团队其他人用了,改起来成本就高了——你得通知所有人更新,还得解释为什么改。在发布前多测一轮,比发布后救火划算。
6. 那些文档里不会写的坑
6.1 skill 之间的冲突
当技能多起来之后,最容易出现的问题是多个 skill 同时匹配一个任务。比如你有一个"新增 API"的 skill,又有一个"写测试"的 skill,用户说"给新接口写测试",两个都可能激活,agent 就懵了。
解决办法是在触发条件里写清楚优先级和互斥关系。比如"新增 API"的 skill 里注明"本 skill 包含测试编写步骤,若已激活本 skill,不要再单独激活 write-tests"。这种协调逻辑,框架一般不会自动处理,得靠人工设计。
6.2 模型切换导致的行为漂移
现在很多人会用第三方模型接入方案,在不同模型之间切换。这里有个大坑:同一个 skill 在不同模型上的表现可能差很多。有的模型对结构化指令遵循得好,有的模型更依赖自然语言描述。
我的应对策略是:skill 的核心约束用最直白的祈使句写,别用委婉表达;同时在 skill 里留一个"模型适配说明"章节,记录在不同模型上验证过的注意事项。这样换模型时,至少知道哪些地方要重新测。
6.3 版本管理别偷懒
skills 目录一定要纳入 git 管理,而且 commit message 要写清楚"改了什么、为什么改"。因为 skill 的改动会直接影响 agent 行为,出问题时你得能快速定位是哪次改动引入的。
我还会给每个 skill 加一个版本号,写在 SKILL.md 顶部。当 skill 行为发生不兼容变化时,升大版本号,并在 changelog 里说明。这样团队里有人发现 agent 行为变了,能第一时间对上是 skill 更新导致的。
7. 把 skills 用出复利:一些进阶思路
7.1 让 skill 自己进化
skill 不是写完就固定的。我有个习惯:每次 agent 用某个 skill 出了偏差,就在 SKILL.md 的"常见错误"里补一条。时间长了,这个 skill 会越来越贴合实际项目,价值越来越高。
更进一步,可以定期回顾 agent 的执行日志,找出"反复出现的纠正",把它们固化成 skill 规则。这相当于让 skill 在实践中自我迭代,比一次性设计要靠谱得多。
7.2 团队协作中的 skill 治理
如果是团队使用,建议指定一个人负责 skill 的 review 和合并,避免每个人各写各的、风格混乱。同时建立一套命名规范,比如"动词-名词"格式(add-api-endpoint、update-docs),方便检索。
新人入职时,把 skills 目录作为必读材料之一,比口头讲规范有效得多。因为 skill 里写的是"具体怎么做",而不是"应该怎么做",新人照着跑一遍就上手了。
7.3 什么情况下该放弃 skill
最后说个反向经验:不是所有重复任务都适合做成 skill。如果某个任务虽然重复,但每次的上下文差异极大,skill 里的规则反而会束缚 agent。这种情况下,维护一份高质量的"提示词模板"可能更合适。
判断标准是:任务的"不变部分"是否大于"变化部分"。如果 80% 是固定的,做 skill 划算;如果 50% 都要根据情况调整,那 skill 的维护成本可能超过收益。这个度需要自己根据项目情况把握,没有标准答案。
我在实际项目里跑下来,一个中等规模的代码库,维护 10 到 15 个核心 skill 是比较舒服的区间。太少覆盖不全,太多管理成本陡增。从最高频的两三个任务开始,边用边加,是比较稳妥的节奏。