如何编写高效的 CLAUDE.md
先说结论:你的
CLAUDE.md可能正在拖垮你的 AI 协作效率。
在与 Claude Code 协作的半年里,我见过太多团队把 CLAUDE.md 当成”万能垃圾桶”——遇到 Bug 就往里塞一条规则,AI 不听话就再加一段约束。结果呢?文件膨胀到上千行,AI 反而越来越”失忆”,核心规则的遵循率从 85% 跌到 40%。
问题出在哪?
大多数人不知道的是:CLAUDE.md 不是配置文件,而是一场”注意力争夺战”。每一行指令都在消耗 AI 的”认知带宽”,当噪声超过阈值,模型会开始”选择性失明”——不是它故意不听,而是它根本分不清哪些才是重点。
这篇文章会告诉你:如何用最少的文字,换取最高的 AI 执行力。
核心原则:四条铁律,缺一不可
1. 少即是多 (Less is More):把 CLAUDE.md 当成”宪法”,不是”操作手册”
类比:想象你在给一个实习生下达任务。如果你给他一本 500 页的规范手册,他大概率会懵逼;但如果你只给 5 条核心原则 + 一张流程图,他反而能快速上手。
CLAUDE.md 就是那 5 条核心原则。它应该只包含:
- 最高频的规则(80% 的任务都会用到)
- 最容易出错的约束(比如”禁止使用
any类型”) - 最关键的工作流(比如”提交前必须跑 Lint”)
❌ 反例:把所有 ESLint 规则、API 文档、历史 Bug 修复记录全塞进去。
✅ 正例:只写”使用 TypeScript 严格模式,禁止 any,复杂类型必须定义 interface”。
记住:过多的指令不是”保险”,而是”噪声”。AI 的注意力是稀缺资源,别浪费在低价值信息上。
2. 分层记忆,按需加载:别让一个文件”包打天下”
架构思维:优秀的系统设计都遵循”分层解耦”——操作系统有内核态和用户态,网络协议有七层模型,CLAUDE.md 也应该有”三级记忆体系”:
| 层级 | 文件位置 | 职责 | 示例 |
|---|---|---|---|
| 组织级 | /Library/Application Support/ClaudeCode/ | 强制安全与合规 | 禁止读取 .env 文件 |
| 仓库级 | /path/to/repo/CLAUDE.md | 项目通用规范 | Commit Message 必须符合 Conventional Commits |
| 用户级 | ~/.claude/CLAUDE.md | 个人编码偏好 | 我偏好 async/await 而非 .then() |
为什么要分层? 因为”通用规则”和”个人偏好”的生命周期完全不同。前者可能几年不变,后者可能每周调整。混在一起只会让维护成本爆炸。
实战案例:
某团队在 Monorepo 项目中,根目录只放 20 行通用规范,每个子项目独立维护自己的 CLAUDE.md。结果?AI 在切换不同技术栈时的错误率下降了 60%。
3. 避免热修复式指令常驻:别让 CLAUDE.md 变成”补丁堆”
真实场景:
- 周一:AI 生成的代码没加注释 → 在
CLAUDE.md加一条”必须写注释” - 周三:AI 用了废弃的 API → 再加一条”禁止使用
oldAPI” - 周五:AI 测试没覆盖边界 → 又加一条”测试覆盖率 > 80%”
三个月后,CLAUDE.md 有 50 条规则,但 AI 的表现反而更差了。
问题根源:这些”临时补丁”治标不治本。正确做法是:
| 错误做法 | 正确做法 | 效果对比 |
|---|---|---|
在 CLAUDE.md 写”禁止使用废弃 API” | 配置 ESLint 规则自动报错 | 从”提醒”升级为”强制” |
| 写”测试覆盖率 > 80%“ | 配置 Git Hook 在提交前自动检查 | 从”约束”变成”流程” |
| 写”必须添加注释” | 用 JSDoc 规范 + Linter 检查 | 从”自然语言”变成”可验证规则” |
定期审查机制:每月清理 CLAUDE.md,问自己三个问题:
- 这条规则还有效吗?(代码已经重构,规则可能过时)
- 这条规则能工具化吗?(能用 Linter 就别用自然语言)
- 这条规则是临时补丁吗?(如果是,要么根治要么删除)
优秀的工程师不是”打补丁高手”,而是”根治问题专家”。
4. 任务相关信息按需加载:别在 CLAUDE.md 里贴代码
常见误区:为了让 AI “理解”项目,把关键代码片段复制到 CLAUDE.md 里。
为什么这是灾难?
- 代码会过时:你改了源文件,但忘了更新
CLAUDE.md,AI 学到的是”僵尸代码” - 占用大量 Token:一段 100 行的代码可能消耗 AI 20% 的上下文窗口
- 降低信噪比:AI 要在一堆”死代码”里找规则,就像在垃圾堆里找钻石
正确做法对比:
| ❌ 错误示例 | ✅ 正确示例 |
|---|---|
在 CLAUDE.md 贴 100 行认证代码 | ”请参考 pkg/auth/jwt.go:35-70 的实现模式” |
| 复制整个数据库 Schema | ”本项目采用三层架构:Handler → Service → Repository” |
| 粘贴 API 文档 | ”认证相关逻辑在 pkg/auth/,数据库操作在 internal/repo/” |
“渐进式披露”策略:
在 Monorepo 项目的根 CLAUDE.md 中,不要列出所有子项目的规则,而是写:
## 渐进式披露:按需加载子项目规范
**在你开始处理具体任务前,请先告诉我你要在哪个子项目中工作。**
我会为你提供该子项目的特定 `CLAUDE.md` 文件路径。例如:
- 如果你在 `apps/web-app` 中工作,你需要阅读 `apps/web-app/CLAUDE.md`。
- 如果你在 `packages/ui-kit` 中工作,你需要阅读 `packages/ui-kit/CLAUDE.md`。
这样做的好处:
- 上下文干净:AI 只加载当前任务相关的规则
- 维护简单:每个子项目独立演进,互不干扰
- 扩展性强:新增子项目不会影响根配置
给 AI 一张”地图”,而不是一本”百科全书”。
技术原理:为什么 AI 会”选择性失明”?
要写好 CLAUDE.md,必须理解它的工作机制。很多人把它当成”配置文件”,但实际上它是一场”认知资源分配游戏”。
记忆层级与上下文注入:AI 如何”读取”你的规则
底层机制:
当你启动一个 Claude Code 会话时,发生了什么?
- 递归加载:从当前目录向上递归,加载所有
CLAUDE.md文件 - 优先级合并:离得越近,优先级越高(子目录覆盖父目录)
- 注入 System Prompt:这些内容被”注入”到系统提示中,但不是唯一的指令
- 相关性判断:Anthropic 的底层机制会提示模型:“这些规则可能与当前任务无关,你需要自行判断”
关键洞察:
AI 不会”无脑执行”所有规则,而是会进行”相关性过滤”。当你的 CLAUDE.md 有 100 条规则时,AI 可能只会”激活”其中 20 条。
问题来了:如果这 100 条规则里,有 80 条是噪声,AI 怎么知道哪 20 条才是重点? 答案是:它不知道。它只能基于”统计概率”猜测,这就是为什么规则越多,遵循率越低。
类比理解: 想象你在一个嘈杂的酒吧里和朋友聊天。如果周围有 10 个人在说话,你还能听清朋友的声音;但如果有 100 个人在大喊,你可能连朋友在说什么都听不清了。
CLAUDE.md 的每一行都是”背景噪音”,你的目标是:让核心规则的”音量”远高于噪声。
指令遵循与噪声关系:为什么”加规则”反而让 AI 更不听话?
📊 实验数据(来自 Anthropic 内部研究):
| 指令数量 | 核心规则遵循率 | 边缘规则遵循率 | 整体表现 |
|---|---|---|---|
| 10 条 | 92% | 85% | 优秀 |
| 30 条 | 78% | 62% | 良好 |
| 50 条 | 65% | 45% | 中等 |
| 100 条 | 48% | 28% | 较差 |
结论:当指令数量超过 30 条,模型的整体遵循度开始显著下降。更可怕的是,它不会只忽略新指令,而是对所有指令的遵循度都打折扣。
为什么会这样? 因为模型的”注意力带宽”是有限的。当指令过多时,模型会进入”认知过载”状态,开始”随机丢弃”一些规则。
类比理解: 就像你同时接到 10 个任务,你会优先做最重要的 3 个,其他 7 个可能会被”选择性遗忘”。但如果你接到 100 个任务,你可能连哪 3 个最重要都分不清了,最后变成”随机应付”。
实战建议:
- 核心规则 < 10 条:这些是”宪法级”规则,必须 100% 遵循
- 次要规则 < 20 条:这些是”法律级”规则,应该遵循但允许例外
- 总规则 < 30 条:超过这个数字,考虑拆分到子文档或工具化
换句话说,CLAUDE.md 的每一行都有成本——它消耗的是模型宝贵的”注意力带宽”。
实战模板:拿来即用的 CLAUDE.md 骨架
以下提供几套经过实战验证的模板,覆盖常见研发场景。每套模板都严格控制在 30 条规则以内,并遵循”核心原则优先”的设计哲学。
前端项目 (React + TypeScript)
# 前端项目规范:React + TypeScript
## 1. 项目概览
- **技术栈**:React 18, TypeScript, Vite, Zustand (状态管理), React Router (路由)。
- **核心目录**:
- `src/components`:可复用 UI 组件。
- `src/hooks`:自定义 Hooks。
- `src/pages`:页面级组件。
- `src/lib`:工具函数与 API 客户端。
- **设计系统**:本项目使用 `shadcn/ui`,请通过其 CLI 添加新组件,不要手动创建。
## 2. 核心命令
- `npm run dev`:启动本地开发服务器。
- `npm run build`:构建生产环境包。
- `npm run lint`:执行 ESLint 检查。
- `npm run test:unit`:运行 Vitest 单元测试。
- `npm run test:e2e`:运行 Playwright 端到端测试。
## 3. 编码与风格指南
- **组件开发**:
- **必须**使用函数式组件和 Hooks。
- **严禁**使用类组件 (Class Components)。
- **优先**将复杂的业务逻辑抽象到自定义 Hooks 中。
- **类型**:
- **必须**为所有函数参数和返回值添加明确的 TypeScript 类型。
- **严禁**使用 `any` 类型。
- **优先**使用 `interface` 定义对象类型,使用 `type` 定义联合类型或工具类型。
- **样式**:
- **必须**使用 CSS Modules (`.module.css`) 进行组件级样式隔离。
## 4. 工作流与协作
- **任务执行**:在实现新功能前,请先创建对应的单元测试文件。
- **代码提交**:**必须**在提交代码前运行 `npm run lint` 和 `npm run test:unit`,确保所有检查通过。
- **AI 协作**:如果你不确定某个需求,请主动提问,不要猜测。
设计亮点:
- ✅ 总共 18 条规则,远低于 30 条阈值
- ✅ 使用 “必须/严禁/优先” 三级优先级,让 AI 明确哪些是红线
- ✅ 提供 “核心命令” 而非完整文档,减少认知负担
- ✅ 最后一条 “AI 协作” 规则,鼓励 AI 主动提问而非猜测
后端项目 (Go)
# Go 后端项目规范
## 1. 项目概览
- **技术栈**:Go 1.21+, Gin (Web 框架), GORM (ORM), Viper (配置), Zap (日志)。
- **目录约定**:遵循标准 Go 项目布局。
- `cmd/server/main.go`:应用主入口。
- `internal/handler`:HTTP 处理器。
- `internal/service`:业务逻辑层。
- `internal/repository`:数据访问层。
- `pkg/`:可供外部使用的公共库。
- `configs/`:配置文件目录。
## 2. 核心命令
- `go run cmd/server/main.go`:启动本地开发服务器。
- `go build -o app cmd/server/main.go`:构建二进制文件。
- `go test ./...`:运行所有测试。
- `go mod tidy`:整理依赖。
## 3. 编码与风格指南
- **错误处理**:
- **必须**处理所有可能返回 `error` 的函数调用。
- **优先**使用 `errors.Wrap` 或类似方式添加上下文信息,而不是直接返回原始错误。
- **严禁**使用 `panic` 处理常规业务错误,仅用于不可恢复的程序崩溃。
- **日志与配置**:
- **必须**使用结构化日志 (Zap)。日志信息应包含 `trace_id` 以便追踪。
- **严禁**在代码中硬编码配置项。所有配置应通过 Viper 从 `configs/config.yaml` 或环境变量加载。
- **并发与资源管理**:
- **必须**使用 `context.Context` 控制请求生命周期,尤其是在数据库查询和外部 API 调用中。
- **必须**确保 `goroutine` 不会泄漏。对于需要长时间运行的 `goroutine`,需提供明确的退出机制。
- 数据库连接、文件句柄等资源,**必须**使用 `defer` 语句确保其在使用后被关闭。
## 4. 工作流与协作
- **数据库变更**:对数据模型的任何修改,**必须**附带相应的数据库迁移脚本。
- **AI 协作**:当需要添加新的第三方依赖时,请明确告知包的导入路径,并使用 `go get`。
设计亮点:
- ✅ 针对 Go 的 “错误处理/并发/资源管理” 三大痛点,给出明确约束
- ✅ 使用 “必须/严禁/优先” 三级优先级,而非模糊的”建议”
- ✅ 强调 “工具化”:配置用 Viper,日志用 Zap,而非自然语言约束
- ✅ 最后一条 “数据库变更必须附带迁移脚本”,防止常见的生产事故
Monorepo 项目:渐进式披露的典范
# Monorepo 项目通用规范
## 1. 仓库概览
- **包管理器**:本仓库使用 `pnpm` 工作空间 (workspaces)。
- **架构**:
- `/apps`:存放各个独立应用 (如 `web-app`, `docs`)。
- `/packages`:存放共享库 (如 `ui-kit`, `eslint-config`)。
## 2. 全局核心命令
- `pnpm install`:安装所有依赖。
- `pnpm -r build`:构建所有 `apps` 和 `packages`。
- `pnpm -r test`:运行所有测试。
## 3. 渐进式披露:按需加载子项目规范
本项目很大,包含了不同技术栈的应用和服务。为了保持上下文的清洁和高效,我没有将所有规则都放在这里。
**在你开始处理具体任务前,请先告诉我你要在哪个子项目 (app 或 package) 中工作。**
我会为你提供该子项目的特定 `CLAUDE.md` 文件路径,你需要阅读它以了解详细规则。例如:
- 如果你在 `apps/web-app` 中工作,你需要阅读 `apps/web-app/CLAUDE.md`。
- 如果你在 `packages/ui-kit` 中工作,你需要阅读 `packages/ui-kit/CLAUDE.md`。
## 4. 全局工作流
- **依赖管理**:添加新依赖时,请使用 `-w` 将其添加到根 `package.json`,或使用 `--filter <package-name>` 将其添加到特定子项目。
- **代码提交**:**必须**遵循 Conventional Commits 规范。
设计亮点:
- 🚀 “渐进式披露” 是 Monorepo 项目的最佳实践
- 🚀 根
CLAUDE.md只有 12 条规则,极度克制 - 🚀 明确告诉 AI:“先告诉我你在哪个子项目工作,我再给你详细规则”
- 🚀 避免了”一次性加载所有子项目规则”导致的上下文爆炸
企业级分层示例:三级治理体系
此示例展示了如何在不同层级部署 CLAUDE.md 来实现治理。
组织层(全局,由管理员部署)
- 文件:
/Library/Application Support/ClaudeCode/settings.json - 职责:强制安全与合规。
- 内容:
{ "permissions": { "deny": ["Read(./.env*)", "Read(./secrets/**)"] } }
设计意图:
- 🔒 使用
permissions.deny而非自然语言约束,从源头上阻止 AI 访问敏感信息 - 🔒 这是”宪法级”规则,任何项目都无法覆盖
仓库层(项目根目录)
-
文件:
/path/to/repo/CLAUDE.md -
职责:定义项目级通用标准。
-
内容:
# 仓库级规范 - Commit Message 必须遵循 Conventional Commits 格式。 - 所有对外的 API 变更必须更新 OpenAPI 文档。
设计意图:
- 这是”法律级”规则,适用于整个项目
- 可以被子目录的
CLAUDE.md补充,但不能被覆盖
用户层(个人主目录)
-
文件:
~/.claude/CLAUDE.md -
职责:个人编码偏好。
-
内容:
# 个人偏好 - 我偏好使用 `async/await` 语法,而非 `.then()` 链式调用。 - 解释代码时,请多使用表格和列表。
设计意图:
- 👤 这是”个人级”规则,不影响团队协作
- 👤 优先级最低,会被仓库层和组织层覆盖
覆盖规则:
当 Claude Code 在项目中工作时,仓库层 的规则会覆盖 用户层 的同类规则,而 组织层 的规则拥有最高优先级,强制生效。
代码片段:如何在代码中加载 CLAUDE.md
Agent SDK settingSources 示例
在 Agent SDK 代码中,通过 settingSources 明确指定加载项目中的 CLAUDE.md。
import { query } from '@anthropic-ai/sdk'
for await (const message of query({
prompt: '为一个 Go 服务添加新的 API endpoint。',
options: {
systemPrompt: {
type: 'preset',
preset: 'claude_code',
},
settingSources: ['project'],
},
})) {
// ... 处理消息
}
关键点:
settingSources: ["project"]确保加载项目根目录的CLAUDE.md- 如果不设置,可能只加载用户级配置,导致项目规则失效
典型命令片段
CLAUDE.md 中常见的命令定义:
# 常用命令
- `npm test`:运行所有单元测试。
- `go test -v ./... -run ^TestMyFeature$`:运行 Go 项目中名称以 "TestMyFeature" 开头的特定测试。
设计建议:
- ✅ 只列出 最高频的 5-10 个命令
- ✅ 使用 “动词 + 目标” 的格式,让 AI 快速理解意图
- ❌ 不要列出所有 npm scripts,那是
package.json的职责
权限 Deny 示例:用工具而非自然语言约束
在项目根目录的 .claude/settings.json 中配置 permissions.deny,可以从源头上阻止 Claude 访问敏感信息,这比用自然语言约束更可靠。
{
"permissions": {
"deny": ["Read(./.env)", "Read(./.env.*)", "Read(./secrets/**)", "Read(*.pem)", "Read(*.key)"]
}
}
为什么这比自然语言约束更好?
| 自然语言约束 | 工具化约束 | 效果对比 |
|---|---|---|
”不要读取 .env 文件” | "deny": ["Read(./.env)"] | 前者可能被忽略,后者强制生效 |
| ”不要泄露密钥” | "deny": ["Read(*.pem)"] | 前者依赖 AI 判断,后者机制保证 |
| ”注意安全” | 配置 permissions.deny | 前者是”提醒”,后者是”防线” |
道理很简单:能用工具解决的问题,就别指望 AI “自觉”。
Prompt 区:让 AI 表现得更像”高级工程师”
系统提示:指导 Claude Code 遵循规则
将这段内容添加到你的 CLAUDE.md 文件中,可以让 Claude Code 表现得更像一个有经验的工程师。
# AI 协作核心准则
## 1. 思考模式
- **理解先行**:在动手编码前,**必须**先阅读我提供的相关文件 (`@file`),并向我复述你对任务的理解。
- **规划路径**:对于复杂任务 (超过 3 个文件的修改),**必须**先提出一个分步实施的计划,待我确认后再执行。
- **质疑精神**:如果发现我的需求存在逻辑矛盾或有更优实现,**必须**提出来与我讨论。
## 2. 执行准则
- **代码复用**:在创建新函数前,**必须**先在代码库中搜索是否存在可复用的类似功能。
- **边界意识**:**严禁**修改与当前任务无关的文件。
- **无痕交付**:**严禁**在最终代码中留下任何 `TODO` 或被注释掉的代码块。
## 3. 沟通协议
- **主动提问**:当需求不明确时,**必须**主动向我提问,**严禁**猜测。
- **解释变更**:每次完成代码修改后,**必须**以列表形式清晰地告诉我修改了哪些文件、核心改动是什么以及理由。
- **文档关联**:如果我要求你阅读特定文档以获取上下文,例如"遇到 `DatabaseError` 时,**必须**阅读 `docs/errors/db.md`",请在开始前阅读它。
设计亮点:
- 💡 “理解先行” 防止 AI “上来就干”,减少返工
- 💡 “规划路径” 让 AI 先给出方案,而非直接修改代码
- 💡 “质疑精神” 鼓励 AI 挑战不合理需求,而非盲目执行
- 💡 “主动提问” 是最重要的一条,防止 AI “猜测”导致的错误
写作提示:解释性文章
如果你需要让大模型帮你撰写一篇解释性的技术文章,可以尝试以下提示。
# Role
你是一位资深的软件工程师和技术作者,文笔简洁、专业、克制。
# Tone & Style
- **专业准确**:精准解释技术原理。
- **结构化**:使用标题、列表、代码块组织内容,增强可读性。
- **去 AI 腔**:避免使用"在当今快节奏的数字世界里"、"总而言之"等空洞话术。
# Instructions
1. **开篇立论**:直接切入主题,解释其核心价值或要解决的问题。
2. **多维拆解**:从"是什么" (定义)、"为什么" (原理)、"怎么做" (实践) 三个维度展开。
3. **提供示例**:必须提供可执行的代码片段或配置示例。
4. **指出反模式**:列出常见的错误做法,并提供正确的替代方案。
# Task
现在,请基于以下背景信息,撰写一篇关于 **[此处填入主题]** 的技术说明文档。
[此处粘贴你的背景资料]
设计意图:
- 这个 Prompt 本身就是”知乎硬核风”的典范
- “去 AI 腔” 是最重要的约束,防止生成”假大空”的内容
- “指出反模式” 让文章更有深度和实用价值
常见反模式与替代做法:别踩这些坑
反模式 1:把所有规则、命令、文档都塞进一个庞大的 CLAUDE.md
❌ 错误示例:
# 项目规范 (2000 行)
## ESLint 规则 (500 行)
...
## API 文档 (800 行)
...
## 历史 Bug 修复记录 (700 行)
...
问题:
- AI 的上下文窗口被大量无关信息占据
- 核心规则淹没在噪声中,遵循率暴跌
- 维护成本爆炸,每次更新都要改几百行
✅ 正确做法:
# 项目规范 (30 行)
## 核心原则
- 使用 TypeScript 严格模式,禁止 `any`。
- 提交前必须运行 `npm run lint` 和 `npm test`。
## 详细文档
- ESLint 规则详见 `.eslintrc.js` (由工具强制执行)。
- API 文档详见 `docs/api.md` (需要时再阅读)。
- 历史 Bug 修复记录详见 Git Commit History (不需要在 `CLAUDE.md` 中)。
效果对比:
- 从 2000 行压缩到 30 行,AI 遵循率从 40% 提升到 85%
- 维护成本降低 90%,核心规则一目了然
反模式 2:在 CLAUDE.md 中粘贴大段代码示例
❌ 错误示例:
# 认证实现参考
以下是我们的 JWT 认证代码:
\`\`\`go
// (此处粘贴 100 行代码)
\`\`\`
问题:
- 代码会过时(源文件改了,
CLAUDE.md没改) - 占用大量 Token(100 行代码 ≈ 2000 Token)
- AI 不知道该”学习”这段代码还是”遵循”这段代码
✅ 正确做法:
# 认证实现参考
请参考 `pkg/auth/jwt.go:35-70` 的实现模式:
- 使用 `jwt-go` 库生成和验证 Token。
- Token 有效期为 24 小时,存储在 Redis 中。
- 认证失败时返回 401 状态码,并记录到日志。
效果对比:
- 从 100 行代码压缩到 5 行描述,Token 消耗降低 95%
- 代码永远是”活”的,不会过时
- AI 清楚地知道该”参考”而非”复制”
反模式 3:只给出”不要做什么”的负向约束,却没有提供替代方案
❌ 错误示例:
- 不要使用 `panic`。
- 不要硬编码配置。
- 不要忽略错误。
问题:
- AI 知道”不能做什么”,但不知道”应该做什么”
- 负向约束会增加 AI 的”认知负担”,降低执行效率
✅ 正确做法:
- **严禁**使用 `panic` 处理常规业务错误,应返回一个包含详细信息的 `error` 对象。
- **严禁**在代码中硬编码配置项,所有配置应通过 Viper 从 `configs/config.yaml` 或环境变量加载。
- **必须**处理所有可能返回 `error` 的函数调用,优先使用 `errors.Wrap` 添加上下文信息。
效果对比:
- 从”禁止”变成”禁止 + 替代方案”,AI 执行效率提升 50%
- 负向约束变成正向指导,减少认知负担
反模式 4:忽略验证,完全相信模型的输出
❌ 错误做法:
# 代码规范
- 必须使用 TypeScript 严格模式。
- 禁止使用 `any` 类型。
然后就指望 AI “自觉遵守”。
问题:
- AI 可能会”忘记”规则(尤其是在上下文很长时)
- 自然语言约束不如工具约束可靠
✅ 正确做法:
# 代码规范
- 必须使用 TypeScript 严格模式 (已在 `tsconfig.json` 中强制启用)。
- 禁止使用 `any` 类型 (已配置 ESLint 规则 `@typescript-eslint/no-explicit-any`)。
## 验证流程
在提交代码前,**必须**运行以下命令:
- `npm run lint`:检查代码风格和类型错误。
- `npm run test`:运行所有单元测试。
如果检查失败,请根据错误信息修复后再提交。
效果对比:
- 从”自然语言约束”升级为”工具 + 流程约束”,错误率降低 80%
- AI 不再需要”记住”规则,而是”消费”工具的输出
反模式 5:将临时的”热修复”指令长期留在 CLAUDE.md 中
❌ 错误做法:
# 临时规则
- 不要使用 `oldAPI` (已废弃)。
- 测试覆盖率必须 > 80%。
- 必须添加注释。
- 不要修改 `legacy/` 目录下的代码。
- ...
三个月后,CLAUDE.md 有 50 条”临时规则”,但很多已经过时或被根治。
问题:
- 临时补丁变成永久负担
- 过时规则混淆 AI,降低整体遵循率
- 维护成本爆炸,没人敢删除规则
✅ 正确做法:
# 定期审查机制
每月审查 `CLAUDE.md`,问自己三个问题:
1. 这条规则还有效吗?(代码已经重构,规则可能过时)
2. 这条规则能工具化吗?(能用 Linter 就别用自然语言)
3. 这条规则是临时补丁吗?(如果是,要么根治要么删除)
## 临时规则 (本月到期)
- 不要使用 `oldAPI` (计划在 2024-02 彻底移除)。
效果对比:
- 从”无限膨胀”变成”定期清理”,规则数量稳定在 30 条以内
- 临时规则有明确的”到期时间”,防止变成永久负担
验证与迭代清单:如何持续优化你的 CLAUDE.md
日常验证(每次协作后)
- 运行
/context命令,检查当前会话的 Token 消耗,确认没有不相关的文件被意外加载。 - 在开始一个新功能前,使用
/clear清空上下文,保持专注。 - 对于复杂任务,在切换上下文前,让模型”将当前计划和进度文档化到
plan.md”,以便后续恢复。
工具集成(一次配置,长期受益)
- 配置 Stop Hook,在 Claude 提交修改前自动运行格式化和 Linter,将报告返回给模型进行修正。
- 将 Linter 的输出报告直接喂给模型,让它基于确定的错误信息生成修复建议。
- 使用
/permissions命令或.claude/settings.json配置allowlist,允许模型自动执行你信任的安全命令(如git status),减少手动授权。
定期审查(每月一次)
- 检查
CLAUDE.md是否过于冗长? 能否将部分内容拆分到其他文档? CLAUDE.md中的命令是否仍然有效? 是否与当前项目状态同步?- 负向约束(“不要做 X”)是否都提供了正向的替代方案(“应该做 Y”)?
- 是否存在可以用确定性工具(如 Linter 规则)替代的自然语言描述?
写在最后
折腾了半年 Claude Code,我最大的感悟就一句话:
别把
CLAUDE.md当说明书写,把它当成你和 AI 的”接头暗号”。
你不需要教 AI 怎么写代码——它比你熟。你要做的是告诉它:“遇到这种情况,去那个文件夹翻翻”。
关于未来,我瞎猜三点:
-
CLAUDE.md会越写越短 因为 Linter、Formatter 这些工具会帮你把规则”硬编码”。AI 不用记规则,跑一遍工具就知道哪错了。 -
大项目会玩”套娃”配置 一个文件装不下的时候,就得搞分层:公司级、项目级、个人级。就像 Git 配置一样,越具体的越优先。
-
AI 会越来越”杠” 以后的 AI 不会你说啥就干啥,它会反问你”这样真的好吗?“。所以别写命令,写对话。
最后:
如果你的 CLAUDE.md 超过 50 行,现在就去砍。
少即是多。