CLAUDE.md 写到 500 行还管不住 AI?Skills 分层食用指南 + AGENTS.md 跨工具吃遍天下
一个资深 Claude Code 用户的心路历程:从写 CLAUDE.md 写到手抽筋,到三层 Skills 按需拼装,再到一份规则走通 Codex、Cursor、Aider 全家桶。这篇把坑都给你踩平。
写在前面
场景还原一下:
你在项目 A 里精心写了一份 CLAUDE.md,叮嘱 AI “用中文输出、Java 内部方法调用加 this.、支付相关的 ini key 必须定义在枚举里”。AI 答应得很好,第二天老老实实。
然后你跳到项目 B,发现忘了带规则。AI 信马由缰地写出了你最讨厌的风格。你提桶跑路的念头第八次升起来了。
你拷贝了一份 CLAUDE.md 到项目 B,又拷贝到 C、D、E。几个月后你在项目 C 改了一条规则,忘了同步回去,AI 在不同项目里表现得像精分患者 —— 通用规则和项目专属规则在同一个文件里缠成一团麻,谁都不敢动。
这就是我最近遇到的问题。折腾一圈下来,总结出一套"分层 + 软链 + 跨工具兼容"的玩法,拿来和大家分享。
一、先搞清楚:Skills 到底是 CLAUDE.md 2.0 吗?
不是。
这俩是互补关系,职责分工完全不同。
1.1 CLAUDE.md 的定位
CLAUDE.md 是常驻 context 的"长期记忆"。只要进入这个项目,所有内容都自动塞进对话上下文里。好处是 AI 永远记得;坏处是占 token。
HumanLayer 那篇广为流传的文章给了一条经验法则:CLAUDE.md 最好控制在 200 行以内。超了就开始劣化 —— AI 会忽略后半部分,或者在不相关的上下文里过度应用某条规则。
1.2 Skills 的定位
Skills 是按需触发的"瞬时记忆"。Claude Code 不会一股脑加载所有 skill 正文,而是只把每个 skill 的 name + description 放进上下文当成"目录"。当 AI 判断某个任务和某个 skill 相关时,才会主动调用这个 skill,把正文加载进来。
一个典型的 SKILL.md 长这样:
---
name: java-this-prefix
description: Java 类内部方法调用必须使用 this. 前缀。TRIGGER when writing or editing Java code, especially when calling instance methods from within the same class.
---
# Java 内部方法调用规范
(正文略)
关键在那个 description 字段 —— 它决定了 AI 什么时候会"想起"这个 skill。所以写 description 的姿势很重要,要把触发场景说清楚,别整那种"这是一个很棒的 Java 规范"的废话。
1.3 一句话区分
| CLAUDE.md | Skills | |
|---|---|---|
| 加载时机 | 进入项目就塞入 context | 任务相关时才调用 |
| 占 token | 持续占用 | 只占目录,按需放正文 |
| 适合放 | 高频规则、项目背景、技术栈说明 | 中低频规则、专项知识、工具用法 |
| 规模 | < 200 行 | 没上限(但单个 skill 建议聚焦) |
二、两层组织:别把所有鸡蛋放一个篮子里
想通了 Skills 和 CLAUDE.md 的分工,下一个问题就来了:多个项目之间重复的规则怎么办?
答案是两层组织:
┌───────────────────────────────────────┐
│ 用户级 ~/.claude/skills/ │ 所有项目都加载
│ - 个人编码风格 │
│ - 通用输出偏好(中文、行尾不留空格等) │
│ - 跨语言的基本功(命名、注释等) │
├───────────────────────────────────────┤
│ 项目级 <project>/.claude/skills/ │ 仅当前项目加载
│ - 领域模型术语 │
│ - 特定框架/ORM 用法 │
│ - 项目专属的枚举类、基类约束 │
└───────────────────────────────────────┘
Claude Code 进入项目时,会把这两层合并加载到 skill 目录里,同名时项目级优先。规则很简单:通用的往上提,专属的下沉。
💡 这里容易和斜杠命令(slash command)混淆。斜杠命令是用户手动敲
/xxx触发的,Skills 是 AI 根据任务自动触发的,两者的机制和用途完全不同。别混为一谈。
2.1 一个真实的例子
前段时间我整理了 4 条 Java 规则:
- 所有交互提示、分析过程用中文
- 控制台输出每行末尾不要填充空格
- Java 类内部方法调用加
this.前缀 - 支付相关的 ini key 必须放到
com.example.pay.enums.PayConfEnum枚举中
按两层组织分一下:
| 规则 | 归属 | 理由 |
|---|---|---|
| ① 中文输出 | 用户级 | 个人语言偏好,跨所有项目一致 |
| ② 行尾不留空格 | 用户级 | 通用编码卫生习惯 |
③ Java this. 前缀 |
用户级或项目级 | 看是个人偏好还是团队约定 |
④ PayConfEnum 枚举 |
项目级 | 只对 order-svc 有意义,其他项目根本没这个类 |
分完之后突然就清爽了 —— ①② 永远有效,不管我切到哪个项目;③ 放用户级,对我所有 Java 项目默认生效;④ 只在支付服务里加载,其他项目的 AI 根本不会知道有这么个枚举,也就不会瞎套用。
2.2 再举一个数仓项目的例子
我另一个数仓项目 dw-platform,写的是 ClickHouse SQL,规则完全不一样:
- 中文别名用反引号包裹:
count(*) AS `订单数` ReplacingMergeTree表查询必须加FINAL(from dwd.fact_payment as a final)- 时间字段判空不能用
IS NULL(因为 CK 里 null 会变成1970-01-01 08:00:00),要用a.pay_time > '2000-01-01' - 字符串判空要同时判
''和NULL - SQL 语句之间不留空行
这些规则只对 ClickHouse 生效,放到其他项目会产生误导。所以它们应该躺在 dw-platform/.claude/skills/clickhouse-sql-conventions/ 里,别的项目看不见。
三、处理重叠:单一事实源 + 软链
三层分好之后,还会遇到一个现实问题:有些规则介于"通用"和"项目专属"之间。比如 Java this. 前缀规则,你有 5 个 Java 项目、3 个 Go 项目。放用户级吧,Go 项目白白加载一条没用的;放项目级吧,5 个 Java 项目各拷一份同样的东西。
我最后用了一个懒人方案:真相源放一个仓库里,各项目通过软链按需引用。
3.1 目录结构
我把所有 skills 源文件放在一个私有的文档仓库里:
~/docs/team-docs/skills/ ← 单一事实源
├── common/
│ ├── chinese-output/
│ └── trailing-whitespace/
├── java/
│ ├── this-prefix/
│ └── lombok-usage/
├── order-svc/ ← 项目专属
│ └── pay-ini-key/
└── dw-platform/
└── clickhouse-sql-conventions/
3.2 各项目按需软链
# 用户级(所有项目共享)
ln -s ~/docs/team-docs/skills/common ~/.claude/skills
# order-svc 项目:用 common + java + 项目专属
ln -s ~/docs/team-docs/skills/java /path/to/order-svc/.claude/skills/java
ln -s ~/docs/team-docs/skills/order-svc /path/to/order-svc/.claude/skills/order-svc
# dw-platform 项目:只用 common + 数仓专属
ln -s ~/docs/team-docs/skills/dw-platform /path/to/dw-platform/.claude/skills/dw-platform
3.3 这样做的好处
- ✅ 改一处全局生效:规则演进时只改真相源,所有项目自动跟进
- ✅ 版本化:真相源可以 git 管理,谁改的、什么时候改的、为什么改,全都有迹可循
- ✅ 按需拼装:Go 项目压根不会链接 Java 目录,描述都进不了 context;数仓项目同理
- ✅ 团队共享:如果是团队规则,真相源做成公司内部仓库,每个人都能拉
3.4 也有坑
- ⚠️ 符号链接在团队里只对自己生效:别人 checkout 项目时拿不到软链的目标路径,skills 就失效了。所以如果规则要团队共享,把
.claude/skills/目录 gitignore,然后让大家各自搭建软链,或者直接把规则实体化提交。 - ⚠️ 改完没提交就翻车:真相源没推到远端的情况下,切换机器就凉了。这事我干过。
四、最扎心的问题:换 AI 工具怎么办?
假设你哪天想试试 Codex CLI、Cursor、Aider 等等。问题来了:这些辛辛苦苦写的 Skills,在别的 AI 终端里能用吗?
很遗憾,不能直接用。Skills 的文件布局和加载机制是 Claude Code 专属的,别的工具有各自的约定:
| 工具 | 规则文件位置 | 格式 |
|---|---|---|
| Claude Code | CLAUDE.md + .claude/skills/*/SKILL.md |
YAML frontmatter + Markdown |
| Codex CLI | AGENTS.md(项目根)/ ~/.codex/AGENTS.md |
纯 Markdown |
| Cursor | .cursor/rules/*.mdc |
MDC 格式(frontmatter + MD) |
| Aider | CONVENTIONS.md(可自定义文件名) |
纯 Markdown |
| GitHub Copilot | .github/copilot-instructions.md |
纯 Markdown |
| Windsurf / Codeium | .windsurfrules |
纯 Markdown |
| Continue | .continue/rules/*.md |
Markdown |
| Zed AI | AGENTS.md |
纯 Markdown |
看得你脑袋嗡嗡响?先别慌,有个好消息:
4.1 AGENTS.md:20000+ 项目的共同选择
业界正在快速向一个"通用约定"汇聚 —— AGENTS.md。
这个文件现在已经是事实标准。根据 2026 年初公开的数据:
- 已有 20000+ 开源项目 采纳
AGENTS.md - GitHub 官方博客分析了 2500+ 个高质量样本,总结出最佳实践
- 支持
AGENTS.md的工具包括:Codex CLI、Cursor、Zed、Windsurf、Google Jules、Gemini CLI、Factory、Roo Code 等 20+ 个工具 - 它的设计思路就一个词:轻量。纯 Markdown、无额外依赖、支持 monorepo 嵌套
换句话说,只要你写一份 AGENTS.md 放在项目根,大半数 AI 工具都能直接读。
4.2 那 Claude Code 怎么用 AGENTS.md?
Claude Code 主要认 CLAUDE.md,但你可以在 CLAUDE.md 里直接引用其他文件:
# CLAUDE.md
本项目的通用编码规则见 @AGENTS.md
支付模块专项规则见 @.claude/skills/pay-ini-key/SKILL.md
这样 AGENTS.md 成为多工具共享的"主干",CLAUDE.md 只做薄薄一层转发 + Claude 专属补充。
4.3 我的实际做法
最终我的分层变成了这样:
1. 高频核心规则 → AGENTS.md (所有 AI 工具共享)
2. Claude 专属 → CLAUDE.md (引用 AGENTS.md + 几条 Claude 独有的)
3. 按需触发规则 → .claude/skills/*/ (Claude Code 的精细化控制)
4. Cursor 专属 → .cursor/rules/*.mdc (软链自 AGENTS.md 的分片)
日常 90% 的规则都放 AGENTS.md,真正需要按需触发的才做成 Skills。
五、几个避坑建议
工作了一段时间,总结几条经验:
5.1 别把 Skills 当成 CLAUDE.md 的替身
如果一条规则是"每次都必须遵守"(比如输出语言、基础命名规范),放 CLAUDE.md 或 AGENTS.md,不要放 Skills。Skills 是触发式的,有可能没被触发,你就看不到那条规则生效。
5.2 Skills 的 description 一定要写得"像广告词"
因为 AI 是靠 description 判断要不要加载这个 skill 的。写得模糊就不会触发。几个 pattern:
- ✅
TRIGGER when writing or editing Java code, especially when calling instance methods. - ✅
Use this skill when adding or using payment-related ini config keys. - ❌
Java 规范(废话) - ❌
一些有用的规则(到底有啥用?)
5.3 定期"体检" skills 目录
参考 ClaudeLog 的建议,每月审查一次 CLAUDE.md 和 Skills,删掉过时规则。否则 AI 会用两年前的过期约定来指导今天的代码,你还纳闷它怎么突然发神经。
5.4 别为了层级化而层级化
不是所有项目都需要 Skills。如果一个项目只有十几条规则,一份 200 行以内的 CLAUDE.md 就够了,搞 Skills 反而复杂。简单优先。
5.5 软链方案不适合团队共享
再强调一遍:软链只对搭建者本人生效。团队里别的成员 checkout 代码后,软链指向一个他机器上不存在的路径,skills 直接消失。团队场景要么直接提交规则实体文件,要么用 git submodule,要么用 CI 去把规则从中心仓库同步下来。
六、总结
| 问题 | 答案 |
|---|---|
| Skills 是 CLAUDE.md 2.0 吗? | 不是。CLAUDE.md 是常驻记忆,Skills 是按需触发 |
| 怎么避免规则重复? | 三层分 —— 用户级 / 项目级 / 按需调用 |
| 多个项目共享规则怎么玩? | 单一事实源 + 软链,真相源在中心仓库 |
| 换 AI 工具了怎么办? | 核心规则写 AGENTS.md,20+ 工具都认 |
| CLAUDE.md 能多长? | 建议 200 行以内,超了就拆到 Skills |
| Skills 怎么保证被触发? | description 写具体,别写废话 |
最后留一个问题给大家:
你现在的 CLAUDE.md 多少行了?有没有遇到过 AI 在不相关的上下文里生搬硬套某条规则的情况?
欢迎在评论区分享你的规则管理心得,咱们一起把 AI 调教得越来越顺手。
如果这篇对你有帮助,点个赞👍 + 收藏⭐ 再走,感谢支持!
规则管理这事,一次整理、长期受益,越早做越省心。
参考资料
更多推荐


所有评论(0)