每次和 Claude Code 的对话都从同一件事开始:Agent 读取 CLAUDE.md,把里面的指令吸收进去,然后这份上下文影响整个会话的每一个决策。
这让 CLAUDE.md 成为项目里影响力最高的单个文件。 写好了,Claude 就像一个真正了解你代码库的团队成员;写差了,每一次交互都在主动拖后腿。
核心约束:指令预算有限
Claude 的系统提示里已经内置了约 50 条指令。研究表明 LLM 能可靠遵守大约 150-200 条指令,超过后性能下降。你的 CLAUDE.md 在和系统提示竞争有限的指令预算。
结论:不是越详细越好,而是越精准越好。
三大支柱结构
支柱 1:WHAT——你的技术栈和架构
## 项目概览
电商平台,三个服务:
- `/api` — Node.js + Express REST API(TypeScript strict 模式)
- `/web` — Next.js 14 前端,使用 App Router
- `/shared` — 两个服务共用的类型和工具函数
数据库:PostgreSQL 16,通过 Prisma ORM
队列:BullMQ on Redis
认证:Clerk保持客观、结构性。Claude 能自己探索代码,但搞不清楚的是各部分的高层关系。
支柱 2:WHY——架构决策的原因
这是大多数人跳过的部分,也是最有价值的部分:
## 架构决策
- 默认使用 Server Components,只在需要交互时才用 Client Components
- 所有数据库查询走 `/api/src/repos/` 的 Repository 模式
(不直接在路由处理器里查询),保持业务逻辑可测试
- 选择 BullMQ 而不是 cron,因为多个工作流需要重试和死信处理没有这个背景,Claude 可能直接在路由里写数据库查询——技术上没错,但违反你的架构。有了它,Claude 知道去找现有 Repository 模式并遵循。
支柱 3:HOW——精确的命令和工作流
## 命令
- 安装:`pnpm install`(不是 npm,我们用 pnpm workspaces)
- 开发服务器:`pnpm dev`(同时启动 API 和 Web)
- 运行所有测试:`pnpm test`
- 运行单个测试:`pnpm test -- --grep "测试名称"`
- 类型检查:`pnpm typecheck`
- Lint + 修复:`pnpm lint:fix`
- 数据库迁移:`pnpm prisma migrate dev`
## 工作流
1. 从 `main` 创建功能分支
2. 实现改动
3. 运行 `pnpm typecheck && pnpm lint:fix && pnpm test`
4. 用 conventional commit 格式提交:`feat(scope): description`不写命令,Claude 会用默认命令,然后报错。精确的命令消灭了整整一类浪费 Token 的错误。
坚决不要放进去的内容
不要用 CLAUDE.md 当 Linter
代码风格——缩进、分号、import 排序——交给 ESLint、Prettier 这类确定性工具。它们更快、更便宜、更可靠。
# 错的写法(浪费指令预算)
## 风格规则
- 使用 2 空格缩进
- 始终用分号
- import 按字母排序
# 对的写法
## 格式化
代码格式由 Biome 处理。Git pre-commit hook 自动强制执行。不要放一次性任务的指令
CLAUDE.md 影响每次会话。如果加了某次迁移的特殊指令,它会污染后续每一次对话。一次性指令放在提示词里。
不要超过 100 行
超过 300 行的 CLAUDE.md 会让 Claude 开始把整个文件当作「可能不相关的背景知识」低优先级处理。精心剪裁,不是塞满。
渐进式披露策略:根目录保持精简
根目录 CLAUDE.md 保持 100 行以内,详细文档用「指针」指向独立文件:
## 文档
详细文档在 `/docs/agent/` 目录:
- `docs/agent/testing.md` — 测试模式和 fixtures
- `docs/agent/api-conventions.md` — API 接口规范
- `docs/agent/database.md` — 迁移和 Schema 模式
在相关目录工作前,请先读取对应文件。Claude Code 足够智能,需要时会自己读文件。用「指针」代替「复制粘贴」,还能保持文档同步——你只维护一份,不用同步两处。
CLAUDE.md vs AGENTS.md
新兴的 AGENTS.md 标准(Linux Foundation 支持)现在已被 Claude Code、Cursor、Copilot、Gemini CLI 等 10+ 工具支持:
| CLAUDE.md | AGENTS.md | |
|---|---|---|
| 适用工具 | Claude Code 专属 | 10+ AI 工具通用 |
| 支持 @imports | ✅ | ❌ |
| 适合场景 | 全团队用 Claude Code | 团队用多种 AI 工具 |
混合方案(推荐):项目根目录放 AGENTS.md 写通用指令,再加 CLAUDE.md 写 Claude 专属配置(@imports 等高级功能)。
可直接复用的模板
# 项目:[名称]
## 概览
[一句话描述项目做什么]
## 技术栈
- 语言:[e.g., TypeScript 5.4, strict 模式]
- 框架:[e.g., Next.js 14 with App Router]
- 数据库:[e.g., PostgreSQL 16 via Prisma]
- 包管理器:[e.g., pnpm 9]
## 架构
[2-3 句话描述代码库组织方式]
- 关键模式:[e.g., Repository 模式处理 DB 访问]
- 关键决策:[e.g., 默认 Server Components]
## 命令
- 安装:`[command]`
- 开发:`[command]`
- 测试:`[command]`
- 单测:`[command]`
- 类型检查:`[command]`
- Lint:`[command]`
- 构建:`[command]`
## 工作流
1. 从 `main` 创建分支
2. 实现改动
3. 运行 `[test + lint + typecheck 命令]`
4. 按 [提交格式] 提交
## 约定
- [约定 1]
- [约定 2]
- [约定 3]
## 文档
详细文档在 `[路径]`
## 领域术语
- [术语]:[定义]优化检查清单
提交前对照这份清单:
- 根目录 不超过 100 行(详细内容用渐进式披露)
- 没有风格规则(交给 linter 处理)
- 没有一次性任务指令
- 没有代码片段(用文件路径引用代替)
- 没有密钥或凭证
- 每条命令都精确(包含 flag、路径、包管理器)
- 架构决策包含原因(不只是做什么,还有为什么)
- 领域术语有定义
- 已提交到版本控制
- 定期回顾和更新
来源:dev.to - The Perfect CLAUDE.md | 整理:ClaudeEagle