☰
agent-skills:为AI编码代理构建可测试的技能系统
2026/10/28 15:56:03 网站建设 项目流程

1. 从“agent-skills”说起:为什么我们需要给AI编码代理装上一套技能系统

第一次看到agent-skills这个项目名的时候,我脑子里冒出来的第一个念头是:这不就是给 AI coding agents 做的一套“技能包”吗?后来翻了一圈资料、自己动手跑了一遍,发现它比我想象的要更底层一些——它本质上是一套围绕skills CLI构建的规范与工具链,用来把“一个 AI 编码代理应该会做什么、怎么做、做到什么程度算合格”这件事,从模糊的提示词工程,变成可复用、可测试、可版本管理的工程资产。

说白了,过去我们用 Claude Code 这类工具,习惯是把一堆要求塞进CLAUDE.md或者系统提示里,写个几百行,然后祈祷模型每次都记得住。问题是,提示词这东西没有类型检查、没有单元测试、没有依赖管理,改一处可能崩三处。agent-skills想解决的就是这个痛点:把“技能”抽出来,变成一个个独立单元,每个单元有自己的触发条件、执行步骤、验收标准,甚至能跑test-driven-development那套流程来验证技能是否真的生效。

这套东西适合谁?如果你只是偶尔用 Claude Code 改改小脚本,可能感受不深。但如果你正在做下面这几类事,那它值得你花时间研究:

  • 团队里多人共用一套 AI 编码代理配置,需要统一行为;
  • 把 AI 代理接入 CI/CD,希望它的输出可预测、可回归;
  • 想让代理在不同项目、不同语言栈下自动切换工作方式;
  • 正在折腾claude code与第三方模型(比如通过 cc switch 接入 deepseek v4、qwen、glm 等)的混合使用场景。

我自己的使用场景比较典型:本地 Ubuntu 上装 Claude Code,VS Code 里配插件,同时还要在几台 Mac 上保持一致的技能配置。以前靠手动同步提示词,现在用 skills CLI 管理,省了不少事。下面我把这套东西拆开讲,从设计思路到实操细节,再到踩过的坑,尽量说透。

2. agent-skills 的整体设计与核心思路拆解

2.1 为什么不是“一个大提示词”,而是“技能集合”

先讲一个我踩过的坑。早期我给 Claude Code 写了一个大概 800 行的CLAUDE.md,里面塞了代码风格、测试要求、提交规范、目录结构约定等等。刚开始挺好用,但项目一多就出问题:A 项目用 React,B 项目用 Vue,C 项目是纯 Node 脚本,同一套提示词在不同项目里互相干扰。更麻烦的是,我想改“测试要求”这一块,结果不小心动了“提交规范”的措辞,导致代理行为整体漂移。

agent-skills的设计思路正好相反:一个技能只做一件事,技能之间通过明确的触发条件隔离。比如:

  • write-unit-test技能:只在用户要求写测试或修改测试文件时触发;
  • refactor-function技能:只在明确要求重构时触发;
  • commit-message技能:只在准备提交时触发。

这样做的好处是,每个技能可以独立迭代、独立测试。你改write-unit-test不会影响commit-message。而且技能可以按项目启用或禁用,A 项目启用 React 相关技能,B 项目启用 Vue 相关技能,互不干扰。

从工程角度看,这其实就是把“提示词”从单体架构拆成了微服务架构。每个技能是一个服务,有明确的输入输出契约。这个类比我觉得挺贴切的,理解了这个,后面很多设计选择就顺了。

2.2 skills CLI 在整条链路里扮演什么角色

skills CLI是这套体系的操作入口。你可以把它理解成npm之于 Node 包,或者git之于版本控制。它负责:

  • 初始化技能目录结构;
  • 安装、卸载、列出技能;
  • 校验技能定义是否符合规范;
  • 把技能同步到 Claude Code 或其他 AI coding agents 能读取的位置;
  • 运行技能自带的测试用例。

我实测下来,最常用的命令是skills list和skills validate。前者让你一眼看清当前项目启用了哪些技能,后者在你改完技能定义后快速检查有没有语法或逻辑错误。这两个命令配合使用,基本能覆盖日常 80% 的操作。

提示:skills CLI 的版本要和 Claude Code 的版本大致匹配。我遇到过 CLI 太新、Claude Code 太旧导致技能加载失败的情况,升级一下就好了。

2.3 与 test-driven-development 的结合点在哪里

这是我觉得agent-skills最有意思的地方。传统 TDD 是“先写测试,再写实现”,而这里把 TDD 的思想用在了技能本身上:每个技能定义里可以包含一组验收用例,用来验证代理在执行该技能时是否达标。

举个例子,write-unit-test技能可以定义这样的验收标准:

  • 给定一个没有测试的函数,代理应该生成至少一个测试用例;
  • 生成的测试应该覆盖正常路径和至少一个边界条件;
  • 测试文件命名应符合项目约定;
  • 测试应该能独立运行,不依赖外部网络。

然后你可以用 skills CLI 跑这些用例,看代理的实际输出是否满足。这相当于给 AI 代理的行为加了一层回归测试。以前我们只能靠“感觉”判断代理是不是变笨了,现在有了可量化的标准。

当然,这套东西不是银弹。验收用例本身也是人写的,写得好不好直接决定效果。但至少它提供了一个框架,让“代理行为质量”这件事变得可讨论、可迭代。

3. 核心细节解析与实操要点

3.1 技能目录结构:一个技能到底包含哪些文件

我拿自己写的一个write-unit-test技能举例,目录结构大概是这样:

skills/ write-unit-test/ skill.yaml # 技能元定义:名称、触发条件、依赖 prompt.md # 技能主体提示词 examples/ # 示例输入输出 input-01.md output-01.md tests/ # 验收用例 case-01.yaml case-02.yaml README.md # 技能说明

几个关键文件的作用:

  • skill.yaml:定义技能的“身份证”。里面要写清楚技能名、版本、适用场景、触发关键词、依赖的其他技能。这个文件是 skills CLI 校验的重点。
  • prompt.md:技能的核心逻辑。这里写代理在执行该技能时应该遵循的步骤、注意事项、输出格式。
  • examples/:给代理看的“范例”。实测发现,给一两个高质量示例,比写一大段抽象描述有效得多。
  • tests/:验收用例。可以理解为这个技能的“单元测试”。

注意:skill.yaml里的触发条件不要写得太宽泛。我一开始把write-unit-test的触发词写成“测试”,结果代理在讨论测试策略时也去写测试文件,很烦。后来改成“写测试”“生成测试”“补充测试用例”这类更具体的短语,误触发就少多了。

3.2 触发条件的设计:让技能在该出现的时候出现

触发条件是整套体系里最需要反复调优的部分。写得太松,技能乱触发;写得太紧,该用的时候用不上。我的经验是分三层来设计:

第一层是关键词匹配。比如refactor-function技能可以匹配“重构”“提取函数”“拆分方法”这类词。这一层负责快速筛选。

第二层是上下文判断。比如当前打开的文件是.test.js还是.js,决定是否启用测试相关技能。这一层需要代理有一定的环境感知能力。

第三层是显式调用。用户直接说“用 write-unit-test 技能”,强制触发。这一层作为兜底,保证在自动判断失效时还能手动控制。

三层配合下来,实际体验比较稳。我建议新手先从第一层和第三层做起,等熟悉了再加第二层。

3.3 技能之间的依赖与冲突处理

技能多了之后,依赖和冲突是绕不开的问题。比如write-unit-test可能依赖read-project-structure技能来了解项目布局,而refactor-function可能和write-unit-test同时被触发,导致代理不知道该先做哪个。

agent-skills的处理方式是:

  • 在skill.yaml里声明depends_on,skills CLI 会自动按依赖顺序加载;
  • 对于可能冲突的技能,声明priority,数值高的优先执行;
  • 如果两个技能优先级相同且都被触发,CLI 会给出警告,让你手动调整。

我踩过的坑是:两个技能都声明了priority: 10,结果代理行为随机漂移。后来把write-unit-test的优先级调到 20,refactor-function保持 10,问题就解决了。逻辑是:先重构再写测试,还是先写测试再重构,取决于你的工作流。我习惯先重构,所以让重构技能优先。

4. 实操过程与核心环节实现

4.1 环境准备:在 Ubuntu 和 Mac 上装好基础工具

我主要在 Ubuntu 22.04 和 macOS 上折腾这套东西。基础环境准备步骤如下,两个平台大同小异:

第一步,确认 Node.js 版本。skills CLI 一般要求 Node 18 以上。用node -v检查,如果版本太低,用 nvm 或官方安装包升级。

第二步,安装 Claude Code。官方文档里有详细的安装说明,Ubuntu 上可以用 npm 全局安装,Mac 上也可以用 Homebrew。安装完成后用claude --version验证。

第三步,安装 skills CLI。通常也是通过 npm 全局安装,命令类似npm install -g @agent-skills/cli。安装完用skills --version确认。

第四步,在 VS Code 里配置 Claude Code 插件。这一步主要是让插件能找到 Claude Code 的可执行文件路径。如果遇到“command not found”之类的报错,多半是 PATH 没配好,在插件设置里手动指定路径即可。

提示:如果你在 Ubuntu 上用的是 snap 安装的 Node,有时候会出现权限问题导致全局包装不上。换成 nvm 管理的 Node 通常能解决。

4.2 初始化技能目录并跑通第一个技能

环境准备好之后,在项目根目录执行:

skills init

这个命令会创建一个skills/目录,里面有一个示例技能。你可以直接拿这个示例练手,也可以删掉自己写。

我建议第一个技能写个简单的,比如explain-code,功能是让代理解释当前选中的代码。skill.yaml大概这样写:

name: explain-code version: 1.0.0 description: 解释选中代码的功能和实现思路 triggers: - "解释这段代码" - "这段代码是做什么的" - "explain this code" priority: 10 depends_on: []

prompt.md里写清楚输出格式,比如“先用一句话概括功能,再分点说明关键逻辑,最后指出可能的边界情况”。

写完执行:

skills validate explain-code

如果没有报错,再执行:

skills install explain-code

然后在 Claude Code 里选中一段代码,输入“解释这段代码”,看代理是否按预期输出。我第一次跑的时候,代理输出了一大段废话,后来在prompt.md里加了“不要重复代码内容,直接说逻辑”这条约束,输出就干净多了。

4.3 用验收用例验证技能效果

技能跑通之后,下一步是写验收用例。以explain-code为例,我写了一个tests/case-01.yaml:

input: | 选中代码: function add(a, b) { return a + b; } expected: - 输出应包含“加法”或“求和”相关描述 - 输出应说明该函数接收两个参数并返回其和 - 输出不应超过 200 字

然后执行:

skills test explain-code

CLI 会把用例喂给代理,拿实际输出和expected对比。这里要注意,验收标准尽量写成可判断的条件,不要写“输出应该很好”这种模糊描述。我一开始写得太主观,导致测试结果没法自动判断,后来改成关键词匹配和长度限制,就靠谱多了。

4.4 把技能同步到多个项目和多个代理

我同时在三个项目里用 Claude Code,每个项目的技能配置略有不同。agent-skills支持把技能目录做成一个独立的 Git 仓库,然后在各个项目里通过skills link引用。这样改一处,所有项目都能同步更新。

具体做法:

  1. 建一个my-skills仓库,把所有通用技能放进去;
  2. 在项目里执行skills link /path/to/my-skills;
  3. 项目特有的技能放在项目自己的skills/目录里,优先级高于链接的技能。

这样通用技能和项目技能就分开了。通用技能升级不影响项目技能,项目技能也不会污染通用库。

注意:skills link默认是软链接,如果你在 Windows 上开发,可能会遇到权限问题。这种情况下可以用skills sync做复制同步,代价是改一处要手动同步一次。

5. 常见问题与排查技巧实录

5.1 技能不触发或误触发怎么办

这是最高频的问题。排查思路按顺序来:

先看skill.yaml里的triggers是否包含你实际输入的短语。Claude Code 的匹配有时候比较严格,你输入“帮我写个测试”,但触发词是“写测试”,可能就匹配不上。解决办法是把触发词写得更宽松一些,或者用多个近义短语。

再看priority和depends_on有没有冲突。如果两个技能同时被触发且优先级相同,代理可能随机选一个。用skills list --verbose可以看到当前所有技能的优先级和依赖关系。

最后看技能是否真的被安装到了 Claude Code 能读取的位置。执行skills status可以查看安装状态。我遇到过技能写好了但忘了skills install,结果代理完全没反应的情况。

5.2 代理输出不符合技能定义怎么办

有时候技能触发了,但代理输出和prompt.md里写的不一样。常见原因有三个:

一是prompt.md写得太抽象。比如“输出应该清晰”,代理不知道什么叫清晰。改成“输出分三点,每点不超过两句话”,效果立刻不一样。

二是示例太少或质量不高。examples/目录里的示例是代理的重要参考。如果示例本身写得含糊,代理也会跟着含糊。我建议每个技能至少放两个示例,一个简单场景,一个复杂场景。

三是技能之间互相干扰。比如write-unit-test和refactor-function同时触发,代理可能把重构和写测试混在一起。这时候要么调整优先级,要么在prompt.md里明确写“本技能只负责写测试,不负责重构”。

5.3 在 VS Code 里用 Claude Code 插件的几个坑

VS Code 插件用起来方便,但有几个坑我踩过:

第一个是路径问题。插件有时候找不到全局安装的 Claude Code,需要在设置里手动指定claude.code.path。Ubuntu 上通常是/usr/local/bin/claude或~/.nvm/versions/node/vXX/bin/claude。

第二个是终端命令执行权限。Claude Code 默认可能不允许直接执行终端命令,需要在设置里开启。开启之后,代理就能跑skills命令了,但也要注意安全,别让它跑危险命令。

第三个是版本升级。Claude Code 在线升级最新版本之后,有时候插件需要重启 VS Code 才能识别新版本。我一般升级完就重启一次,省得后面出怪问题。

5.4 常见问题速查表

问题现象可能原因排查方法解决办法
技能完全不触发未安装或触发词不匹配skills status、检查triggers重新安装、放宽触发词
技能误触发触发词太宽泛查看触发日志收窄触发词、加优先级
输出不符合预期prompt 太抽象、示例不足对比examples/细化 prompt、补充示例
多技能冲突优先级相同skills list --verbose调整 priority
CLI 报版本错误CLI 与 Claude Code 版本不匹配查看两者版本号升级到兼容版本
VS Code 找不到 Claude CodePATH 未配置检查插件设置手动指定可执行文件路径

5.5 几个我踩过的坑和独家技巧

第一个坑是技能命名冲突。我一开始给两个技能都起名test-helper,结果 CLI 加载时互相覆盖。后来养成习惯,技能名加前缀,比如js-write-test、py-write-test,清晰多了。

第二个坑是验收用例写得太死。比如我要求输出必须包含某个具体词,结果代理换了个同义词,测试就失败了。后来改成匹配多个近义词,或者用正则,通过率就正常了。

第三个技巧是用 Git 管理技能版本。每个技能目录就是一个 Git 仓库,改完提交,出问题可以回滚。这比手动备份靠谱得多。

第四个技巧是定期跑全量验收测试。我每周跑一次skills test --all,看看有没有技能因为 Claude Code 升级而失效。早发现早修,别等到用的时候才发现坏了。

6. 技能体系的扩展与多模型适配实践

6.1 把技能复用到第三方模型接入场景

现在很多人不只用 Claude Code 官方模型,还会通过 cc switch 接入 deepseek v4、qwen、glm 等模型。这时候技能体系还能不能用?我实测下来,大部分技能是可以复用的,但要注意两点:

一是不同模型对提示词的敏感度不同。同一个prompt.md,Claude 可能执行得很好,qwen 可能需要更明确的步骤拆解。我的做法是为每个模型维护一个prompt.variant.md,在skill.yaml里根据模型名选择加载哪个变体。

二是验收用例要重新跑一遍。换模型之后,原来的验收标准可能不再适用。比如某个模型输出更长,长度限制就要放宽。我一般换模型后先跑一遍全量测试,看哪些技能需要调整。

6.2 技能体系的长期维护建议

技能多了之后,维护成本会上升。我的建议是:

  • 每个技能保持单一职责,不要写“万能技能”;
  • 定期清理不再使用的技能,别让技能库变成垃圾场;
  • 给每个技能写清楚的 README,说明适用场景和已知限制;
  • 用 CI 自动跑验收测试,每次提交都验证一遍。

这套东西说到底,是把 AI 编码代理的使用从“手工艺”变成“工程化”。手工艺阶段靠个人经验,工程化阶段靠流程和工具。agent-skills提供的就是这套流程和工具的骨架,具体怎么填肉,还得看你的实际需求。

我个人在实际操作中的体会是:不要一上来就写几十个技能,先从两三个高频场景做起,跑通了再扩展。技能质量比数量重要得多。一个写得好的write-unit-test,比十个半成品技能有用。另外,验收用例一定要写,哪怕只写一两个,也比没有强。没有验收用例的技能,就像没有测试的代码,改起来心里没底。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询