ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

agent-skills 实战:为 Claude Code 与 Cursor 构建可复用技能库

agent-skills 实战:为 Claude Code 与 Cursor 构建可复用技能库

1. 从“装完就吃灰”说起:agent-skills 到底解决了什么问题

如果你最近半年一直在折腾 AI coding agents,大概率经历过这个循环:兴冲冲装好 Claude Code 或者 Cursor,敲了几个 prompt,觉得“也就那样”,然后它就安静地躺在终端里吃灰了。问题往往不在于模型不够聪明,而在于你给它的“技能包”太薄——它不知道你的项目规范、不知道你的提交习惯、不知道你团队那套祖传的目录结构。每次对话都像带一个刚入职的实习生,什么都要从头讲一遍。

agent-skills这个项目,本质上就是给 AI coding agents 装上一套可复用、可版本管理的“技能库”。你可以把它理解成给 agent 写的“岗位操作手册”:把重复性的上下文、规范、流程固化成 skill 文件,agent 在需要的时候自动加载,而不是每次靠你手动喂 prompt。它配合 skills CLI 使用,目前主流适配 Claude Code 和 Cursor 这两类工具,解决的核心痛点就三个字——别重复。

这篇文章适合谁看?如果你已经在用 Claude Code 或 Cursor,但感觉效率没提上来;如果你团队里多人共用一套 agent 配置却总是各写各的;如果你想把“怎么让 agent 按我的规矩干活”这件事工程化,那这篇就是写给你的。我会从设计思路讲到落地实操,包括 skills CLI 的安装、skill 文件的组织方式、在 Claude Code 和 Cursor 里的接入差异,以及我自己踩过的那些坑。

先说结论:agent-skills 不是让你少写几行 prompt 的小玩具,它是把 agent 从“通用聊天框”变成“懂你项目的专属助手”的那层关键抽象。理解了这个定位,后面的操作才有意义。

2. agent-skills 的整体设计与选型逻辑

2.1 为什么是“技能”而不是“更长的 prompt”

很多人第一反应是:我直接把项目规范写进 system prompt 不就行了?我一开始也这么干,结果 prompt 越写越长,最后变成一个两千行的怪物文件,改一处要翻半天,而且 Claude Code 和 Cursor 的 prompt 注入机制还不一样,维护成本直接爆炸。

agent-skills 的思路是把“一大坨 prompt”拆成一个个独立的 skill 单元。每个 skill 只负责一件事,比如“如何写这个项目的单元测试”“如何生成符合规范的 commit message”“如何处理数据库迁移”。这样做的好处很直接:

  • 按需加载:agent 只在相关任务触发时才读取对应 skill,不占用无关对话的上下文窗口。
  • 可独立演进:改测试规范不会影响提交规范,diff 清晰,code review 也方便。
  • 跨工具复用:同一套 skill 文件,Claude Code 和 Cursor 都能读,不用维护两份。

这背后其实是一个很朴素的工程原则:关注点分离。prompt 工程走到一定规模,就必须像代码一样做模块化,否则必然失控。

2.2 skills CLI 在架构里扮演什么角色

skills CLI 是这套体系的“包管理器 + 脚手架”。它干的事包括:初始化 skill 目录结构、从远端拉取社区 skill、校验 skill 文件格式、把 skill 注册到对应 agent 的配置里。你可以把它类比成 npm 之于 Node 项目——没有它你也能手动建文件,但有了它,安装、更新、共享这一整套流程才顺畅。

我实测下来,skills CLI 最大的价值在于统一了 skill 的元数据格式。每个 skill 都有一个头部声明,标明名称、触发条件、适用 agent 类型。CLI 读取这些元数据后,自动决定往哪个配置文件里写、写成什么格式。这就把“Claude Code 要放这里、Cursor 要放那里”的琐碎差异给屏蔽掉了。

2.3 Claude Code 与 Cursor 的适配差异

这两个工具虽然都支持 skill 概念,但加载机制差别不小,选型时必须心里有数:

维度Claude CodeCursor
skill 存放位置项目根目录下的约定目录依赖 rules 与配置文件
触发方式基于任务语义自动匹配主要靠规则匹配与手动引用
配置粒度项目级为主项目级 + 用户级
更新同步跟随仓库走需要留意本地缓存

Claude Code 更偏向“项目自带技能”,你把 skill 提交到仓库,团队所有人 clone 下来就自动生效,这点非常香。Cursor 则更灵活但也更分散,用户级配置和项目级配置容易打架,后面实操部分我会专门讲怎么理顺。

提示:如果你的团队同时用这两个工具,建议以 Claude Code 的目录结构为主干,Cursor 侧通过软链接或同步脚本对接,避免两套 skill 内容漂移。

3. 核心细节解析:skill 文件到底长什么样

3.1 skill 的目录组织与命名约定

一个健康的 skill 库,目录结构应该一眼能看懂。我自己的习惯是按“领域/动作”两级来分,比如:

skills/ testing/ write-unit-test/ SKILL.md mock-external-api/ SKILL.md git/ commit-message/ SKILL.md pr-description/ SKILL.md database/ migration/ SKILL.md

每个 skill 一个独立目录,核心内容放在SKILL.md里。为什么用目录而不是单文件?因为复杂 skill 往往需要附带示例文件、模板、脚本,目录结构给这些附属资源留了位置。命名上我强烈建议用动词开头的短横线命名,比如write-unit-test而不是unitTestSkill,原因是 agent 在做语义匹配时,动词开头的名字更容易和用户的任务描述对上。

3.2 SKILL.md 的头部元数据怎么写

头部元数据是 skill 能被正确加载的关键,写错了 CLI 直接报错。一个典型的头部大概是这样:

--- name: write-unit-test description: 为当前项目的业务逻辑生成符合团队规范的单元测试 triggers: - 写测试 - 单元测试 - unit test agents: - claude-code - cursor version: 1.2.0 ---

这里有几个细节值得展开。description不是写给人看的装饰,它是 agent 判断“这个 skill 该不该用”的主要依据,所以要写得具体,把适用场景和产出物都点出来。triggers是关键词兜底,当语义匹配不确定时,命中关键词也能触发。agents字段决定了 CLI 会把这个 skill 注册到哪些工具,如果你只用 Claude Code,就别写 cursor,省得配置里多出一堆无用条目。

我踩过的一个坑是:description写得太泛,比如“帮助写代码”,结果 agent 在任何任务上都试图加载它,反而干扰了正常判断。后来我把描述改得足够窄,误触发率立刻降下来了。

3.3 正文部分的写法:给 agent 看的“操作手册”

头部之后就是正文,这部分是真正指导 agent 干活的内容。我的经验是,正文要遵循“先规则、后示例、再边界”的三段式。

规则部分用简洁的祈使句,告诉 agent 必须做什么、禁止做什么。比如“所有测试文件放在__tests__目录下”“禁止在测试里访问真实网络”。示例部分给一两个正例和反例,agent 对示例的模仿能力远强于对抽象规则的理解。边界部分说明什么情况下不该用这个 skill,防止误用。

这里有个反直觉的点:正文不要写太长。我见过有人把整个团队的测试规范文档几千字全塞进去,结果 agent 加载后反而抓不住重点。正确做法是把核心规则提炼到几百字,详细文档用链接或引用方式放在附属文件里,需要时再读。

3.4 版本管理与团队协作

skill 是要进版本库的,所以版本号、变更记录这些工程习惯一个都不能少。我在每个SKILL.md头部都保留version字段,配合 git 的 commit 历史,能清楚看到某个 skill 什么时候改了什么。团队协作时,skill 的修改应该走和代码一样的 PR 流程,因为一个写错的 skill 会影响所有用它的人。

注意:skill 里不要硬编码个人路径、密钥、内网地址。这些一旦提交,轻则别人用不了,重则泄露敏感信息。需要环境相关的内容,用占位符加说明的方式处理。

4. 实操过程:从零把 agent-skills 跑起来

4.1 环境准备与 skills CLI 安装

先确认基础环境。Claude Code 和 Cursor 的安装这里不展开,假设你已经能正常跑起来。skills CLI 通常通过包管理器安装,以常见的 Node 生态为例:

npm install -g skills-cli skills --version

装完先跑一次skills --version确认可用。如果提示命令找不到,八成是全局 bin 目录没进 PATH,检查一下 npm 的 global prefix 配置。这一步看着简单,但我见过不少人卡在这里,以为是 CLI 本身的问题,其实是环境变量没配好。

4.2 初始化项目级 skill 目录

进入你的项目根目录,执行初始化:

cd your-project skills init

这个命令会创建skills/目录和一个基础的配置文件。初始化完成后,先别急着写自己的 skill,跑一下skills list看看默认带了什么。有些版本会预置几个通用 skill,比如 commit message 生成,可以直接拿来改。

初始化时有个选择要注意:是项目级还是用户级。项目级的 skill 跟着仓库走,团队共享;用户级的只对你本机生效。我的建议是团队规范一律项目级,个人习惯才放用户级。混着放是后期混乱的主要来源。

4.3 编写第一个 skill 并注册

我们拿“生成规范 commit message”这个高频需求练手。先建目录和文件:

mkdir -p skills/git/commit-message touch skills/git/commit-message/SKILL.md

然后写入内容,头部按前面讲的格式填好,正文写清楚提交信息的格式要求,比如 type 有哪些取值、subject 多少字以内、body 怎么换行。写完执行注册:

skills register skills/git/commit-message

注册成功后,CLI 会把这个 skill 同步到 Claude Code 和 Cursor 的配置里。这时候你可以验证一下:

skills list --agent claude-code

能看到刚注册的 skill 就说明通了。如果没出现,检查头部agents字段有没有写对,以及 skill 路径是不是在 CLI 扫描范围内。

4.4 在 Claude Code 中验证效果

打开 Claude Code,随便改点代码,然后说“帮我提交”。如果 skill 生效,它生成的 commit message 应该严格符合你定义的格式,而不是它默认那种随意的风格。第一次验证时建议故意给一个模糊的指令,看它会不会主动加载 skill,这能检验触发条件写得够不够好。

我实测下来,Claude Code 对项目级 skill 的加载相当积极,只要描述匹配度高,基本不用手动点名。这也是为什么前面强调description要写准——写准了,体验就是“它自己就懂了”。

4.5 在 Cursor 中对接同一套 skill

Cursor 这边稍微绕一点。因为 Cursor 的规则体系有自己的目录约定,直接让 skills CLI 写进去有时会被覆盖。我的做法是让 CLI 生成配置片段,然后手动或脚本合并到 Cursor 的规则文件里。具体来说,先跑:

skills export --agent cursor --output ./cursor-skills.md

导出一个汇总文件,再在 Cursor 的项目规则里引用它。这样做的代价是多一步同步,但好处是 Cursor 侧的规则来源清晰,不会被 CLI 反复改写搞乱。如果你嫌麻烦,也可以写个 pre-commit 钩子,每次提交前自动导出一次。

提示:Cursor 的用户级规则优先级有时会盖过项目级,如果发现 skill 不生效,先去设置里检查有没有冲突的用户级规则。

4.6 参数与触发条件的调优过程

skill 跑起来只是开始,真正花时间的是调优。我一般会记录两类数据:一是误触发,即不该用的时候用了;二是漏触发,即该用的时候没用。前者通常是description太宽,后者通常是triggers覆盖不够。

调优时不要凭感觉改,而是拿真实对话记录做样本。我习惯把一周内 agent 的相关交互导出,逐条标注“应该触发/不应该触发”,然后对照 skill 定义找偏差。这个过程有点像调推荐算法,样本量上来了,规则自然就收敛了。一般迭代两三轮,触发准确率就能到一个可用的水平。

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

5.1 skill 不生效的排查顺序

遇到 skill 不生效,别急着怀疑 CLI,按这个顺序查最快:

  1. 确认 skill 文件路径在 CLI 扫描范围内,跑skills list看得到吗。
  2. 确认头部agents字段包含你正在用的工具。
  3. 确认注册命令执行成功,没有报错被忽略。
  4. 确认 agent 侧没有更高优先级的规则覆盖。
  5. 确认description和当前任务语义确实匹配。

这五步能解决九成以上的“不生效”问题。剩下那一成,往往是 agent 版本和 CLI 版本不兼容,升级一下通常就好。

5.2 常见问题速查表

现象可能原因处理方式
CLI 命令找不到全局 bin 未进 PATH检查 npm global prefix
注册报格式错误头部 YAML 缩进或字段名错用 CLI 的校验命令先验一遍
skill 频繁误触发description 过宽收窄描述,补充边界说明
Cursor 侧不生效用户级规则冲突检查并清理用户级规则
团队拉取后行为不一致skill 未提交或版本不同步确认 skill 进仓库并统一版本

5.3 我踩过的几个真实坑

第一个坑是把 skill 写成了文档。早期我恨不得把每个细节都写进去,结果 agent 加载后反而抓不住重点,输出质量下降。后来我强迫自己每个 skill 正文控制在合理长度,把细节挪到附属文件,效果立刻好转。

第二个坑是忽略 Cursor 的缓存。有次改了 skill,Claude Code 侧立刻生效,Cursor 侧死活不变,折腾半天才发现是 Cursor 缓存了旧规则,重启后才刷新。所以改完 skill 记得让 Cursor 重新加载一次。

第三个坑是团队里有人用用户级 skill 覆盖了项目级。这种问题最隐蔽,因为在他本机一切正常,别人却复现不了。解决办法是把“禁止用用户级 skill 覆盖项目规范”写进团队约定,并在 code review 时留意。

5.4 让 skill 库长期健康的几个习惯

skill 库和代码库一样,会随着时间腐化。我的习惯是每个月做一次“skill 体检”:删掉三个月没触发过的、合并功能重叠的、更新描述已经过时的。另外,每个 skill 的变更都写清楚原因,方便后来人理解为什么这么定。

还有一点,skill 的粒度要控制好。太粗,一个 skill 管太多事,触发时加载一堆无关内容;太细,skill 数量爆炸,维护成本高。我的经验是,一个 skill 对应一个明确的、可独立描述的产出物,这个粒度通常最舒服。

6. 把 agent-skills 用出复利的关键认知

说到底,agent-skills 的价值不在于它本身多复杂,而在于它把“让 agent 按规矩干活”这件事从一次性劳动变成了可积累的资产。你每写一个 skill,都是在给未来的自己省一次重复解释。用得越久,这个库越值钱,这就是复利。

我个人在实际操作中的体会是:先别追求 skill 库的完备,先解决你最高频的那一个痛点。比如你每天都要写 commit message,那就先把这一个 skill 打磨到顺手,体验到效率提升后,再逐步扩展。一上来就想搭一套大而全的体系,往往半途而废。

最后分享一个小技巧:把你最满意的几个 skill 的description单独摘出来,贴在自己随时能看到的地方。写新 skill 时对照一下,能帮你保持描述风格的一致性,这对 agent 的匹配准确率有实打实的帮助。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进