1. 从零认识 agent-skills:它到底解决什么问题
第一次看到agent-skills这个词,很多人会以为它又是一个新的 AI 编程工具,或者某个大模型的插件市场。其实不是。agent-skills本质上是一套面向 AI coding agents 的技能描述规范与配套 CLI 工具链,它要解决的核心问题是:如何让 Claude Code、Cursor 这类 AI 编程助手,在特定项目里表现得像一个“懂行的老员工”,而不是一个每次都要从头解释上下文的实习生。
你可以把它理解成给 AI 助手写的一份“岗位说明书 + 操作手册”。在没有这套东西之前,我们想让 AI 按照团队规范写代码,通常得在对话里反复粘贴规范文档,或者把规则塞进一个巨大的系统提示词里。项目一多、规则一杂,维护成本就爆炸了。agent-skills的思路是把这些规则拆成一个个独立的、可复用的“技能包”,每个技能包描述一件事——比如“如何在本项目里写数据库迁移脚本”“如何生成符合团队规范的 API 接口”“如何排查线上日志”。AI 助手在需要的时候自动加载对应技能,不需要的时候就不占用上下文。
这套东西适合谁?三类人最该关注。第一类是重度使用 Claude Code 或 Cursor 的独立开发者,你一个人维护多个项目,每个项目有自己的技术栈和约定,靠脑子记容易乱。第二类是小团队的技术负责人,你需要把团队规范固化下来,让新人和 AI 助手都能快速对齐。第三类是对 AI 编程工作流有研究兴趣的工程师,你想搞清楚 AI coding agent 的上下文管理到底怎么做才高效。
我最初接触agent-skills是因为一个很具体的痛点:我同时维护三个项目,一个用 Python + FastAPI,一个用 TypeScript + Next.js,还有一个是纯 Shell 脚本的工具集。每次切换项目,我都要重新给 Claude Code 解释“这个项目用什么测试框架”“日志格式是什么”“提交信息怎么写”。后来我把这些规则抽成技能文件,切换项目时 AI 助手自动读取对应技能,对话效率至少提升了一倍。这不是夸张,是上下文窗口省下来之后,AI 能记住更多实际代码细节带来的直接收益。
提示:
agent-skills不是某个厂商的专属产品,它更像是一种约定俗成的组织方式,配合skills CLI来管理和分发。不同 AI 编程工具对它的支持程度不一样,Claude Code 原生支持较好,Cursor 需要通过规则文件间接实现类似效果。
2. 核心设计思路拆解:为什么是“技能”而不是“提示词”
2.1 提示词膨胀问题与技能拆分逻辑
做过 AI 编程的人都有一个体会:系统提示词越写越长,效果反而越差。原因很简单,大模型的注意力是有限的,你塞进去一百条规则,它可能只记住前二十条,后面的要么忽略,要么互相干扰。这就是所谓的“提示词膨胀”。
agent-skills的拆分逻辑是按需加载。每个技能文件只描述一个相对独立的领域知识,比如:
database-migration.md:描述本项目数据库迁移的工具、命名规范、回滚策略api-convention.md:描述 API 路由命名、请求响应格式、错误码规范logging-format.md:描述日志级别、字段、输出目标
当 AI 助手处理一个数据库相关任务时,它只需要加载database-migration.md,不需要把 API 规范也读一遍。这样上下文利用率高,AI 的注意力集中在当前任务上,输出质量自然更好。
我实测过一个对比:同一个重构任务,用一份 3000 字的综合规范文档作为提示词,Claude Code 改了 5 个文件,其中 2 个文件的日志格式不符合规范。换成技能拆分方式后,只加载了refactor-guide.md和logging-format.md两个技能,改了 5 个文件全部符合规范。差别就在于,综合文档里日志规范被埋在第 1800 字的位置,AI 可能根本没注意到。
2.2 技能文件的组织结构与命名约定
一个典型的agent-skills目录结构是这样的:
.agent-skills/ skills/ database-migration.md api-convention.md logging-format.md testing-guide.md config.jsonconfig.json里定义技能的元信息,比如触发条件、优先级、依赖关系。技能文件本身是 Markdown 格式,内容通常包含:
- 适用场景:什么情况下该用这个技能
- 核心规则:必须遵守的硬性约定
- 示例代码:正确和错误的写法对比
- 常见陷阱:容易出错的地方
命名上我建议用“领域-动作”的格式,比如database-migration而不是db,api-convention而不是api。原因是 AI 在匹配技能时,语义越明确,匹配准确率越高。你写db,它可能不确定是数据库连接还是数据库迁移;你写database-migration,意图就非常清晰。
2.3 与 Claude Code、Cursor 的集成方式差异
Claude Code 对agent-skills的支持是原生的。你在项目根目录放一个.agent-skills文件夹,Claude Code 启动时会自动扫描,并在需要时加载对应技能。你可以在对话里用/skills命令查看当前加载了哪些技能,也可以用/skill load database-migration手动加载。
Cursor 的情况不太一样。Cursor 目前没有原生的agent-skills概念,但你可以通过.cursor/rules目录实现类似效果。具体做法是把技能文件拆成多个.mdc文件,放在.cursor/rules下,Cursor 会根据文件描述自动匹配。不过 Cursor 的规则匹配机制更偏向文件路径和关键词,不如 Claude Code 的技能加载那么精准。
如果你同时用两个工具,我的建议是维护一份技能源文件,用skills CLI同步到两个工具的目标目录。skills CLI提供了skills sync命令,可以读取.agent-skills/skills/下的文件,自动生成 Claude Code 需要的格式和 Cursor 需要的.mdc格式。这样你只需要维护一份内容,不用两边手动改。
注意:Cursor 的规则文件有数量限制,官方建议不超过 20 个。如果你的技能很多,需要合并一些低频技能,或者用
skills CLI的--merge参数把相关技能打包成一个文件。
3. 实操过程:从安装 skills CLI 到第一个技能生效
3.1 安装 skills CLI 与初始化项目
skills CLI是一个 Node.js 工具,安装方式很简单:
npm install -g @agent-skills/cli安装完成后,在项目根目录执行初始化:
skills init这个命令会做三件事:创建.agent-skills/目录,生成默认的config.json,以及创建一个示例技能文件example-skill.md。我建议你先把示例文件读一遍,了解技能文件的基本结构,然后删掉它,开始写自己的技能。
初始化完成后,目录结构如下:
.agent-skills/ skills/ example-skill.md config.jsonconfig.json的默认内容:
{ "version": "1.0", "skills": [ { "name": "example-skill", "path": "skills/example-skill.md", "triggers": ["example"], "priority": 10 } ] }triggers是触发关键词,当你的对话内容包含这些词时,AI 助手会考虑加载这个技能。priority是优先级,数字越小优先级越高。多个技能同时匹配时,优先级高的先加载。
3.2 编写第一个技能:以数据库迁移规范为例
假设你的项目用 Prisma 做数据库迁移,团队约定迁移文件必须包含回滚逻辑,命名格式是YYYYMMDD_description。你可以创建一个database-migration.md:
# 数据库迁移规范 ## 适用场景 当任务涉及创建、修改或删除数据库表结构时,加载本技能。 ## 核心规则 1. 迁移文件命名格式:`YYYYMMDD_description`,例如 `20250115_add_user_email` 2. 每个迁移文件必须包含 `up` 和 `down` 两个函数 3. `down` 函数必须能完整回滚 `up` 函数的操作 4. 禁止在迁移中直接删除列,必须先重命名并保留一个版本周期 ## 示例代码 正确写法: ```sql -- up ALTER TABLE users ADD COLUMN email VARCHAR(255); -- down ALTER TABLE users DROP COLUMN email;错误写法:
-- up ALTER TABLE users DROP COLUMN phone; -- 没有 down,无法回滚常见陷阱
- Prisma 的
migrate dev会自动生成迁移文件,但不会自动生成down函数,需要手动补充 - 如果迁移涉及数据填充,务必在
down中写清楚如何清理数据
写完后,在 `config.json` 里注册这个技能: ```json { "name": "database-migration", "path": "skills/database-migration.md", "triggers": ["迁移", "migration", "数据库表", "schema"], "priority": 5 }然后执行同步命令:
skills sync这个命令会把技能文件同步到 Claude Code 和 Cursor 的对应目录。如果你只用 Claude Code,可以加--target claude参数只同步到 Claude Code。
3.3 验证技能是否生效与调试技巧
验证方法很简单:在 Claude Code 里输入一个包含触发词的请求,比如“帮我写一个给 users 表加 email 字段的迁移”。如果技能生效,Claude Code 的输出应该包含down函数,并且命名符合YYYYMMDD_description格式。
如果没生效,按以下顺序排查:
- 检查
config.json里的triggers是否包含你输入的关键词 - 执行
skills list查看当前项目注册了哪些技能 - 执行
skills validate检查技能文件格式是否正确 - 在 Claude Code 里用
/skills命令查看当前加载的技能列表
我踩过的一个坑是:技能文件里的 Markdown 标题层级和config.json里的name不一致,导致skills validate报错但没提示具体原因。后来发现是name必须和文件里的# 标题完全一致,包括大小写。这个细节官方文档没写清楚,我是看源码才发现的。
提示:
skills sync默认会覆盖目标目录的同名文件。如果你在 Claude Code 里手动改过技能文件,同步前先备份,否则改动会丢失。建议所有修改都在.agent-skills/skills/下进行,目标目录只读。
4. 常见问题与排查技巧实录
4.1 技能不生效的六种典型原因
| 问题现象 | 可能原因 | 解决方法 |
|---|---|---|
| 触发词匹配但技能未加载 | config.json未注册或路径错误 | 执行skills validate检查 |
| 技能加载了但规则未遵守 | 技能内容太长,AI 注意力分散 | 拆分成更小的技能,每个不超过 500 字 |
| 多个技能冲突 | 优先级设置不合理 | 调整priority,冲突技能合并 |
| Cursor 里不生效 | 规则文件格式不对 | 用skills sync --target cursor重新生成 |
| 技能文件修改后不更新 | 未执行skills sync | 每次修改后执行同步 |
| Claude Code 报权限错误 | 技能目录权限不足 | 检查.agent-skills目录读写权限 |
这张表是我在实际使用中总结出来的,覆盖了 90% 以上的问题。其中“技能内容太长”是最容易被忽略的。很多人写技能文件像写文档,恨不得把所有细节都塞进去,结果 AI 反而记不住。我的经验是:一个技能文件只解决一个问题,超过 500 字就考虑拆分。
4.2 技能与项目实际代码不同步怎么办
这是另一个高频问题。项目代码更新了,但技能文件还是旧的,AI 按照旧技能写代码,结果编译报错。解决办法有两个:
方案一:把技能文件纳入代码审查流程。每次修改项目规范时,同步更新技能文件,并在 PR 里一起审查。我们团队的做法是在 PR 模板里加一条检查项:“如果本次修改涉及编码规范,是否已更新.agent-skills/下的对应技能?”
方案二:用skills CLI的--watch模式。这个模式会监听技能文件变化,自动同步到目标目录。但注意,它不会监听项目代码变化,所以方案一仍然是必要的。
我个人的习惯是每周五下午花 15 分钟过一遍本周的代码变更,看看有没有需要更新技能的地方。这个习惯坚持了三个月,技能文件和项目实际的偏差率从 30% 降到了 5% 以下。
4.3 多项目共用技能的复用策略
如果你有多个项目用同一套技术栈,可以把公共技能抽到一个共享目录,用skills link命令链接过来:
skills link ../shared-skills/database-migration.md这样共享技能只有一份,修改后所有链接的项目都会生效。但要注意,如果某个项目需要覆盖共享技能的某条规则,可以在项目本地创建一个同名技能,config.json里把本地技能的priority设得更高。skills CLI会优先加载高优先级技能,低优先级的同名技能会被忽略。
这个机制我用了半年,管理着 5 个项目的技能库,维护成本比每个项目单独维护低了至少 60%。唯一需要注意的是,共享技能的修改要谨慎,因为影响面大。我一般会在共享技能里加一个changelog段落,记录每次修改的内容和原因,方便回溯。
4.4 技能加载对 AI 响应速度的影响
有人担心加载技能会拖慢 AI 响应速度。实测下来,单个技能文件(500 字以内)的加载时间在 50 毫秒左右,对整体响应速度的影响可以忽略不计。但如果同时加载 10 个以上技能,上下文长度增加,AI 的推理时间会明显变长。
我的建议是控制同时加载的技能数量不超过 5 个。如果某个任务确实需要多个技能,考虑把它们合并成一个“任务专用技能”,只在这个任务期间加载。比如“发布新版本”这个任务需要数据库迁移、API 版本管理、日志规范三个技能,我就创建一个release-checklist.md,把三个技能的关键规则浓缩进去,任务结束后这个技能就不再加载。
注意:Claude Code 的上下文窗口是有限的,技能加载会占用窗口空间。如果你发现 AI 开始“忘记”之前的对话内容,很可能是技能加载太多导致的。用
/context命令可以查看当前上下文占用情况。
5. 进阶用法:让技能系统真正融入开发工作流
5.1 技能与 Git Hooks 的结合
把技能检查和 Git Hooks 结合,可以在提交代码前自动验证是否符合技能规范。比如在pre-commit钩子里加一段脚本,检查本次提交的代码是否违反了技能里的硬性规则:
#!/bin/bash # .git/hooks/pre-commit # 检查迁移文件命名 for file in $(git diff --cached --name-only | grep "migrations/"); do if [[ ! $file =~ ^migrations/[0-9]{8}_[a-z_]+\.sql$ ]]; then echo "迁移文件命名不符合规范:$file" echo "正确格式:YYYYMMDD_description.sql" exit 1 fi done这个脚本只检查了命名规范,更复杂的规则检查可以调用skills CLI的skills check命令。skills check会读取技能文件里的规则,尝试用正则或简单语法分析来验证代码。不过这个功能目前还比较基础,复杂规则还是需要自己写脚本。
我实际用下来,Git Hooks 加技能检查的组合,能把规范违规率降低 80% 以上。剩下的 20% 主要是 AI 生成的代码在语义层面不符合规范,比如虽然命名对了但逻辑不对,这种还是需要人工审查。
5.2 技能版本管理与团队协作
技能文件应该像代码一样做版本管理。我们团队的做法是:
- 技能文件放在项目仓库的
.agent-skills/目录下,和代码一起提交 - 每次修改技能文件,commit message 里注明
[skills]前缀 - 技能文件的修改需要至少一个团队成员 review
- 重大修改(比如删除某条规则)需要在团队群里同步
这样做的好处是,技能变更历史清晰可查,新人入职时看技能文件的 git log 就能了解团队规范的演变过程。我见过一些团队把技能文件放在共享网盘里,结果版本混乱,AI 加载的技能和实际代码规范对不上,反而添乱。
5.3 技能系统的边界与不适合的场景
agent-skills不是万能的。以下几种场景不适合用技能系统:
- 一次性任务:比如临时写个脚本处理数据,没必要为它创建技能
- 高度依赖上下文的决策:比如架构选型,需要综合考虑业务、团队、成本,技能文件写不清楚
- 频繁变化的规则:如果某条规则每周都改,维护技能文件的成本可能高于收益
我的判断标准是:如果一个规则在三个月内不会变,并且至少会在三个任务中用到,就值得写成技能。不满足这个标准的,放在对话里临时说明就行。
另外,技能系统对 AI 的约束是“软约束”,不是“硬约束”。AI 可能会忽略技能里的某条规则,尤其是当规则和它的训练数据冲突时。所以关键规范还是要有自动化检查兜底,不能完全依赖 AI 自觉。
5.4 从技能系统延伸出的工作流优化
用了半年agent-skills之后,我发现它带来的最大收益不是 AI 输出质量的提升,而是团队规范意识的增强。以前写规范文档,大家不看;现在写技能文件,因为 AI 会严格执行,大家反而会认真讨论每条规则是否合理。这个副作用是我没想到的。
另一个延伸用法是把技能文件作为新人培训材料。新人入职第一天,我让他先读.agent-skills/skills/下的所有技能文件,半天时间就能了解项目的核心规范。比读几十页的 Wiki 效率高得多,因为技能文件是结构化的、有示例的、直接可操作的。
如果你已经在用 Claude Code 或 Cursor,我建议从一个小技能开始试起,比如“提交信息规范”或“日志格式规范”。写一个 300 字的技能文件,同步后观察 AI 的输出变化。感受到效果之后,再逐步扩展。不要一上来就写十几个技能,那样维护成本太高,容易放弃。
最后分享一个我常用的调试技巧:在 Claude Code 里输入/skill debug,它会显示当前对话中技能加载的详细日志,包括哪些技能被触发、加载耗时、占用的 token 数。这个命令帮我定位过好几次“技能不生效”的问题,比看文档快多了。