青雲的博客

如何编写高效的 CLAUDE.md

· 36 分钟阅读

先说结论:你的 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,问自己三个问题:

  1. 这条规则还有效吗?(代码已经重构,规则可能过时)
  2. 这条规则能工具化吗?(能用 Linter 就别用自然语言)
  3. 这条规则是临时补丁吗?(如果是,要么根治要么删除)

优秀的工程师不是”打补丁高手”,而是”根治问题专家”。


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 会话时,发生了什么?

  1. 递归加载:从当前目录向上递归,加载所有 CLAUDE.md 文件
  2. 优先级合并:离得越近,优先级越高(子目录覆盖父目录)
  3. 注入 System Prompt:这些内容被”注入”到系统提示中,但不是唯一的指令
  4. 相关性判断: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

日常验证(每次协作后)

  1. 运行 /context 命令,检查当前会话的 Token 消耗,确认没有不相关的文件被意外加载。
  2. 在开始一个新功能前,使用 /clear 清空上下文,保持专注。
  3. 对于复杂任务,在切换上下文前,让模型”将当前计划和进度文档化到 plan.md”,以便后续恢复。

工具集成(一次配置,长期受益)

  1. 配置 Stop Hook,在 Claude 提交修改前自动运行格式化和 Linter,将报告返回给模型进行修正。
  2. 将 Linter 的输出报告直接喂给模型,让它基于确定的错误信息生成修复建议。
  3. 使用 /permissions 命令或 .claude/settings.json 配置 allowlist,允许模型自动执行你信任的安全命令(如 git status),减少手动授权。

定期审查(每月一次)

  1. 检查 CLAUDE.md 是否过于冗长? 能否将部分内容拆分到其他文档?
  2. CLAUDE.md 中的命令是否仍然有效? 是否与当前项目状态同步?
  3. 负向约束(“不要做 X”)是否都提供了正向的替代方案(“应该做 Y”)?
  4. 是否存在可以用确定性工具(如 Linter 规则)替代的自然语言描述?

写在最后

折腾了半年 Claude Code,我最大的感悟就一句话:

别把 CLAUDE.md 当说明书写,把它当成你和 AI 的”接头暗号”。

你不需要教 AI 怎么写代码——它比你熟。你要做的是告诉它:“遇到这种情况,去那个文件夹翻翻”。

关于未来,我瞎猜三点

  1. CLAUDE.md 会越写越短 因为 Linter、Formatter 这些工具会帮你把规则”硬编码”。AI 不用记规则,跑一遍工具就知道哪错了。

  2. 大项目会玩”套娃”配置 一个文件装不下的时候,就得搞分层:公司级、项目级、个人级。就像 Git 配置一样,越具体的越优先。

  3. AI 会越来越”杠” 以后的 AI 不会你说啥就干啥,它会反问你”这样真的好吗?“。所以别写命令,写对话。

最后

如果你的 CLAUDE.md 超过 50 行,现在就去砍。

少即是多。


相关文章

评论