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 Code | Cursor |
|---|---|---|
| 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,按这个顺序查最快:
- 确认 skill 文件路径在 CLI 扫描范围内,跑
skills list看得到吗。 - 确认头部
agents字段包含你正在用的工具。 - 确认注册命令执行成功,没有报错被忽略。
- 确认 agent 侧没有更高优先级的规则覆盖。
- 确认
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 的匹配准确率有实打实的帮助。