CLAUDE.md
1. 什么是 CLAUDE.md
1.1 定义与核心作用
CLAUDE.md 是 Claude Code 的原生项目记忆机制,一个纯 Markdown 文件,在每次会话启动时自动注入 Claude 的上下文窗口。它充当"AI 新成员的入职文档"——你写一次,Claude 在每个会话中都知道你的项目上下文,无需重复解释。
与对话历史(每次会话重置)或代码库(Claude 按需探索)不同,CLAUDE.md 是始终存在的。它是唯一一个保证在 Claude 上下文窗口中的文件,每次会话开始前就被加载。
Claude Code 官方文档将其定位为"上下文注入文件"(context injection file)——内容作为用户消息加载到系统提示之后,Claude 读取并尽力遵循,而非严格解析的配置。
1.2 与 .cursorrules 的对比
| 维度 | CLAUDE.md (Claude Code) | .cursorrules (Cursor) |
|---|---|---|
| 层级体系 | 5 层:组织/用户/项目/子目录/本地 | 单层文件,无继承 |
| 全局配置 | 支持 ~/.claude/CLAUDE.md | 无全局配置 |
| 模块化 | .claude/rules/ + @import 语法 | .cursor/rules/ 目录 |
| 路径作用域 | paths frontmatter 条件加载 | globs frontmatter 条件加载 |
| 自动记忆 | Auto Memory 系统自动学习 | 无原生自动记忆 |
| 文件导入 | @path 递归导入(最深 5 层) | 不支持 |
| 个人覆盖 | CLAUDE.local.md | 不支持 |
| Token 可见性 | 可见上下文消耗 | 不可见 |
| 团队共享 | 通过 Git 共享项目级文件 | 通过 Git 共享 |
CLAUDE.md 拥有目前所有 AI 编程助手配置中最复杂的层级体系。如果你的团队使用多种 AI 工具,建议维护一个跨工具的 AGENTS.md 作为单一事实来源,然后在各工具的专属配置中导入它。
1.3 CLAUDE.md 与 Auto Memory 的关系
Claude Code 有两套互补的记忆系统:
| CLAUDE.md 文件 | Auto Memory | |
|---|---|---|
| 谁编写 | 你(开发者) | Claude(自动) |
| 内容 | 指令和规则 | 学习到的模式和事实 |
| 作用域 | 项目、用户或组织 | 每个工作树 |
| 加载方式 | 每次会话完整加载 | 每次会话加载前 200 行或 25KB |
| 适用场景 | 编码标准、工作流、项目架构 | 构建命令、调试洞察、偏好 |
使用 CLAUDE.md 来指导 Claude 的行为;让 Auto Memory 自动处理 Claude 从你的纠正中学到的东西。
2. 文件位置与加载机制
2.1 五层作用域体系
Claude Code 从多个位置读取 CLAUDE.md,按从宽泛到具体的层级叠加:
| 作用域 | 位置 | 用途 | 共享方式 |
|---|---|---|---|
| 托管策略 | macOS: /Library/Application Support/ClaudeCode/CLAUDE.mdLinux/WSL: /etc/claude-code/CLAUDE.mdWindows: C:\Program Files\ClaudeCode\CLAUDE.md | 组织级指令,IT/DevOps 管理 | 机器上所有用户 |
| 用户全局 | ~/.claude/CLAUDE.md | 个人跨项目偏好 | 仅你(所有项目) |
| 项目级 | ./CLAUDE.md 或 ./.claude/CLAUDE.md | 团队共享的项目指令 | 通过源码控制共享 |
| 本地覆盖 | ./CLAUDE.local.md | 个人项目专属偏好 | 仅你(当前项目) |
| 子目录 | ./subdir/CLAUDE.md | 目录专属规则 | 按需懒加载 |
更具体的文件优先于更宽泛的文件。当指令冲突时,Claude 优先使用最本地化的文件。
2.2 加载顺序与解析规则
祖先文件(向上遍历):Claude 从当前工作目录向上遍历到 Git 根目录,沿途加载每个目录中的 CLAUDE.md 和 CLAUDE.local.md。所有发现的文件拼接到上下文中,而非相互覆盖。
在每个目录内,CLAUDE.local.md 追加在 CLAUDE.md 之后,因此当指令冲突时,个人笔记是该层级最后读取的内容。
后代文件(子目录懒加载):子目录中的 CLAUDE.md 不在启动时加载,而是在 Claude 读取该子目录中的文件时按需加载。这避免了无关上下文膨胀会话。
# 示例:在 foo/bar/ 中运行 Claude Code
加载顺序:
1. ~/.claude/CLAUDE.md (用户全局)
2. foo/CLAUDE.md (祖先)
3. foo/CLAUDE.local.md (祖先本地覆盖)
4. foo/bar/CLAUDE.md (当前目录)
5. foo/bar/CLAUDE.local.md (当前目录本地覆盖)
# 子目录 foo/bar/baz/CLAUDE.md 仅在读取 baz/ 内文件时加载
2.3 排除特定文件
在大型 monorepo 中,祖先 CLAUDE.md 可能包含与你工作无关的指令。使用 claudeMdExcludes 设置跳过特定文件:
// .claude/settings.local.json
{
"claudeMdExcludes": [
"**/monorepo/CLAUDE.md",
"/home/user/monorepo/other-team/.claude/rules/**"
]
}
模式使用 glob 语法匹配绝对路径。托管策略 CLAUDE.md 不可被排除,确保组织级指令始终生效。
3. 内容结构与编写规范
3.1 核心内容层次
有效的 CLAUDE.md 回答一个问题:没有这条指令,Claude 会犯什么错误? 如果 Claude 已经能正确做到,这条指令就是噪音。
应包含的内容:
- 构建、测试和 lint 命令(尤其是不明显的)
- 与惯例不同的代码风格规则
- 仓库工作流(分支命名、PR 流程、提交格式)
- 代码中不明显的架构决策
- 开发环境怪癖(必需的环境变量、必须运行的服务)
- 常见陷阱(容易犯且难调试的错误)
不应包含的内容:
- Claude 已知的标准语言惯例
- linter/formatter 已覆盖的代码风格规则
- 详细的 API 文档(链接即可)
- 逐文件的代码库描述
- 频繁变化的信息
3.2 推荐文件结构
# Project: [项目名称]
[一两句话描述项目用途和技术栈]
## Tech Stack
- [框架] [版本], [语言] [版本]
- [数据库] via [ORM]
- [测试框架]
## Directory Structure
- `src/app/` — 页面和路由
- `src/lib/` — 共享工具和服务
- `src/components/` — React 组件
## Essential Commands
- `npm run dev` — 启动开发服务器
- `npm run test` — 运行测试套件
- `npm run build` — 生产构建
## Conventions
- [Claude 默认不会遵循的惯例]
- [Claude 默认不会遵循的惯例]
## Architecture Decisions
- [防止错误假设的关键决策]
- [防止错误假设的关键决策]
## Do Not
- [明确的禁止事项]
- [明确的禁止事项]
## Verification
After changes, always run:
1. `npm run lint`
2. `npm run test`
3. `npm run build`
3.3 指令编写原则
具体性优于意图:
# 差
- 格式化代码要规范
- 测试你的改动
- 保持文件组织
# 好
- 使用 2 空格缩进
- 提交前运行 `npm test`
- API handlers 放在 `src/api/handlers/`
使用 RFC 2119 语言标记关键规则:
- MUST run tests before committing
- MUST NOT modify migration files
- NEVER force push to main
- ALWAYS validate input with Zod
包含触发条件:
# 差
- 写测试
# 好
- 添加新 API endpoint 时,MUST 在 tests/api/ 中添加对应测试
文件大小控制:
| 指标 | 建议 |
|---|---|
| 目标行数 | 少于 100 行 |
| 实际上限 | 200 行 |
| 理想 Token 数 | 少于 500 tokens |
| 实际上限 | 3000-4000 tokens |
研究表明,指令遵循率在约 150-200 条总指令后开始下降。Claude Code 的系统提示已占用约 50 条,因此你大约有 100-150 个指令槽位。
4. 编写最佳实践
4.1 如何写出有效的 CLAUDE.md
从 /init 开始,然后精修:
cd your-project
claude
/init
/init 分析你的代码库,检测构建系统、测试框架和代码模式,生成一个入门 CLAUDE.md。把它当作起点——自动生成的内容应该经过人工审查,删除 Claude 自己能推断的内容,添加项目特有的陷阱。
用真实错误驱动添加:
每次 Claude 犯错时问自己:一条 CLAUDE.md 规则能否预防这个错误?如果可以,添加一条具体的规则。不要为假设性的错误添加规则。
定期审查和修剪:
# 每几周运行一次
Review my CLAUDE.md file. Identify any instructions that are redundant,
conflicting, or that you would follow correctly without being told.
Suggest what to remove.
如果 Claude 已经能在没有指令的情况下遵循某个惯例,这条规则就是死重——删除它,释放指令预算。
4.2 常见反模式
1. 厨房水槽文件(The Kitchen Sink)
500 行的 CLAUDE.md 试图记录一切。社区分析显示,指令遵循率从短文件的 95% 下降到长文件的 60% 以下。修复:无情地修剪到 Claude 无法从代码推断的规则。
2. 在 CLAUDE.md 中重复 linter 规则
告诉 Claude "使用单引号"或"用 tab 缩进",当你已有 ESLint/Prettier/Ruff 配置时。这浪费了上下文 token。修复:使用 pre-commit hooks,让 linter 做它的工作。
3. 自动生成后从不审查
运行 /init 后从不审查输出。自动生成的文件通常包含显而易见的信息,遗漏项目特有的陷阱,可能弊大于利。修复:始终手动精修。
4. 幽灵指令
假设 Claude 记得前一次对话中的指令。对话指令在 /compact 或新会话后不保留——只有 CLAUDE.md 和 Auto Memory 持久化。修复:重要的规则放入 CLAUDE.md。
5. 过时规则
引用已不存在的目录结构、构建系统或惯例。过时规则浪费 token 并导致错误假设。修复:在重大重构后定期审查。
6. 矛盾规则
两个 CLAUDE.md 文件(或 CLAUDE.md 与 rules 文件)给出冲突指令。Claude 会任意选择其一。修复:定期跨所有指令文件审计冲突。
7. 否定-only 约束
"永远不要使用 --legacy-peer-deps" 让 Claude 在依赖冲突时束手无策。修复:每条禁止都配一个方向:"永远不要使用 --legacy-peer-deps;通过更新包到兼容版本来解决冲突。"
5. 模块化与进阶组织
5.1 使用 @import 拆分文件
当项目增长时,单个 CLAUDE.md 变得难以维护。@path 语法允许你拆分指令并选择性加载:
# CLAUDE.md (根)
See @README.md for project overview.
## Commands
npm run test
## Detailed guides
- Architecture: @docs/architecture.md
- Database patterns: @docs/database-conventions.md
导入解析相对于包含导入的文件,而非工作目录。支持绝对路径和家目录引用(@~/...)。递归导入最深 5 层。
何时使用导入 vs 内联:
- 内联:Claude 每次会话都需要的规则(命令、关键约束)
- 导入:Claude 仅在特定区域工作时需要的详细指南
- 子目录 CLAUDE.md:自动加载的区域专属规则
5.2 使用 .claude/rules/ 组织规则
对于大型项目,将指令拆分为 .claude/rules/ 目录中的多个文件:
.claude/
├── CLAUDE.md # 主项目指令
└── rules/
├── code-style.md # 代码风格指南
├── testing.md # 测试约定
├── api-design.md # API 设计规则
└── frontend/ # 子目录组织
└── react-patterns.md
所有 .md 文件被递归发现。无 paths frontmatter 的规则在启动时无条件加载。
路径作用域规则——添加 YAML frontmatter 限制规则加载时机:
---
paths:
- "src/api/**/*.ts"
- "src/middleware/**/*.ts"
---
# API Development Rules
- All endpoints must include input validation
- Use the standard error response format
- Include OpenAPI documentation comments
路径作用域规则在 Claude 读取匹配模式的文件时触发,而非每次工具使用都触发。支持的 glob 模式:
| 模式 | 匹配 |
|---|---|
**/*.ts | 任何目录中的所有 TypeScript 文件 |
src/**/* | src/ 目录下的所有文件 |
*.md | 项目根目录的 Markdown 文件 |
src/components/*.tsx | 特定目录中的 React 组件 |
**/*.{ts,tsx} | 多种扩展名 |
5.3 Monorepo 配置示例
my-monorepo/
├── CLAUDE.md # 共享规则(lint、git、CI)
├── .claude/
│ └── rules/
│ ├── testing.md
│ └── security.md
└── packages/
├── web/
│ ├── CLAUDE.md # Next.js 专属约定
│ └── src/
├── api/
│ ├── CLAUDE.md # Express/Fastify 专属约定
│ └── src/
└── shared/
├── CLAUDE.md # 共享库约定
└── src/
根 CLAUDE.md:
# Monorepo
pnpm workspaces monorepo. Packages in `packages/`.
## Commands
- `pnpm install` — install all dependencies
- `pnpm -r build` — build all packages
- `pnpm -r test` — test all packages
## Rules
- Changes to `packages/shared` require running tests in all consuming packages
- Use workspace protocol for internal dependencies
- Never install dependencies at the root unless they're dev tools
当 Claude 在 packages/web/ 中工作时,它同时加载根 CLAUDE.md 和包级 CLAUDE.md。根规则处处适用;包规则仅在相关上下文中适用。
6. 团队协作与知识沉淀
6.1 版本控制策略
项目级 CLAUDE.md 和 .claude/rules/ 应该提交到 Git。这是团队共享的文档,随着团队成员从自己的错误中贡献规则而变得更好。
将 CLAUDE.md 的变更视为代码 PR 一样审查:质疑每条新行是否值得它的位置。
应提交到 Git 的文件:
CLAUDE.md(项目根).claude/CLAUDE.md.claude/rules/*.md.claude/commands/*.md.claude/agents/*.md
不应提交的文件(加入 .gitignore):
CLAUDE.local.md.claude/settings.local.json.claude/memory/
# .gitignore
CLAUDE.local.md
.claude/settings.local.json
.claude/memory/
6.2 审查流程
为 CLAUDE.md 修改建立审查流程:
- 变更触发:当 Claude 重复犯错或团队做出重大架构决策时
- PR 审查:像审查关键配置文件一样审查
CLAUDE.md修改 - 定期审计:每月审查一次,删除过时规则
- 团队共识:决定哪些规则进入共享配置,哪些属于个人
CLAUDE.local.md
6.3 跨工具同步
如果团队使用多种 AI 工具,维护一个跨工具的 AGENTS.md 作为单一事实来源:
# CLAUDE.md
@AGENTS.md
## Claude-specific additions
- Use the MCP server at localhost:3000 for database queries
- Run /compact after long refactoring sessions
AGENTS.md 被至少 7 个主要 AI 编码工具支持(截至 2026 年初),是目前最接近跨工具标准的格式。
7. Auto Memory 自动记忆系统
7.1 工作原理
Auto Memory 让 Claude 在会话中自动积累知识。Claude 根据信息对未来对话的有用性来决定是否保存。
存储位置:~/.claude/projects/<project>/memory/
~/.claude/projects/<project>/memory/
├── MEMORY.md # 主索引,每次会话加载
├── debugging.md # 调试模式笔记
├── api-conventions.md # API 设计决策
└── ... # Claude 创建的其他主题文件
MEMORY.md 的前 200 行或前 25KB(以先到者为准)在每次会话开始时加载。超出此阈值的内容不会在会话启动时加载。主题文件按需读取。
7.2 启用与管理
Auto Memory 默认开启。通过以下方式切换:
# 在会话中
/memory
# 或设置
{
"autoMemoryEnabled": false
}
# 或环境变量
CLAUDE_CODE_DISABLE_AUTO_MEMORY=1
显式保存到 Auto Memory:
> Remember that we always use pnpm and never npm
显式保存到 CLAUDE.md:
> Add this to CLAUDE.md: always use named exports
7.3 与 CLAUDE.md 的分工
| 使用 Auto Memory | 使用 CLAUDE.md |
|---|---|
| 个人偏好和习惯 | 团队共享的标准 |
| 构建怪癖和调试洞察 | 编码标准和架构决策 |
| 频繁变化的信息 | 相对稳定的工作流 |
| Claude 自己发现的模式 | 你明确想要执行的规则 |
8. 进阶技巧
8.1 动态更新与条件规则
在 CLAUDE.md 中嵌入自我改进指令:
## Self-Improvement
When you encounter a bad assumption during a session, suggest a CLAUDE.md correction.
这创建一个反馈循环,文件通过正常使用而改进。
使用 HTML 注释添加维护者笔记(不消耗 token):
<!-- maintainer: 这条规则在 v3 迁移后需要更新 -->
- Use the new API client for all HTTP calls
块级 HTML 注释在注入 Claude 上下文前被剥离。代码块内的注释被保留。
8.2 多项目共享配置
使用符号链接维护跨项目共享的规则集:
# 维护一套共享规则
ln -s ~/shared-claude-rules .claude/rules/shared
ln -s ~/company-standards/security.md .claude/rules/security.md
.claude/rules/ 支持符号链接,循环符号链接会被检测并优雅处理。
8.3 使用 Hooks 替代部分规则
对于确定性操作(如格式化),使用 hooks 而非 CLAUDE.md 指令:
// .claude/settings.json
{
"hooks": {
"PostToolUse": [
{
"matcher": "Edit|Write",
"command": "npx prettier --write \"$TOOL_INPUT_FILE_PATH\""
}
]
}
}
Hooks 是确定性的;CLAUDE.md 指令是概率性的。让合适的工具做合适的工作。
8.4 /compact 后的持久化
项目根 CLAUDE.md 在 /compact 后存活:Claude 从磁盘重新读取并重新注入。子目录 CLAUDE.md 不会自动重新注入;它们在 Claude 下次读取该子目录文件时重新加载。
如果指令在 /compact 后消失,它要么是仅在对话中给出的,要么存在于尚未重新加载的嵌套 CLAUDE.md 中。
9. 完整示例模板
9.1 小型项目模板(< 60 行)
# Project: invoice-api
FastAPI REST API for invoice management. Python 3.12, PostgreSQL 16.
## Commands
uv run pytest tests/ -x # run tests (stop on first failure)
uv run pytest tests/integration/ -x -k db # integration tests (needs local PG)
uv run ruff check --fix . # lint and auto-fix
uv run mypy src/ # type check
## Architecture
- src/api/ -> route handlers (one file per resource)
- src/models/ -> SQLAlchemy models (alembic for migrations)
- src/services/ -> business logic (handlers call services, never query DB directly)
- src/core/ -> config, security, dependencies
## Rules
- MUST run `uv run pytest tests/ -x` and confirm all pass before committing
- MUST NOT modify migration files -- generate new ones with `alembic revision --autogenerate`
- All endpoints require authentication except those in src/api/public.py
- Use `Annotated[T, Depends(...)]` for dependency injection, not default arguments
## Gotchas
- The `invoice_number` field is generated server-side. Never accept it from client input.
- PostgreSQL BIGINT IDs -- do not use `int` in Python models with upper bound check
9.2 中型团队项目模板
# TaskFlow SaaS
Multi-tenant project management SaaS. Users: SMBs (5-200 employees).
Billing: per-seat subscription via Stripe. Data isolation: separate schema per tenant.
## Tech Stack
Frontend: Next.js 14 (App Router only), React 18, Tailwind CSS + shadcn/ui, Zustand
Backend: Next.js API Routes, Prisma ORM + PostgreSQL (Neon), NextAuth.js v5
## Architecture Rules
- All API routes MUST validate input with Zod schemas
- Always check tenant ownership before DB operations
- Use Server Actions for form mutations, not client-side fetch
- Data fetching happens in Server Components, never in useEffect
## Security Constraints
- Never expose tenant IDs in client-side code or URLs
- All user input must be sanitized before database insertion
- Secrets must use environment variables -- never hardcoded
## Coding Conventions
- TypeScript strict mode -- no `any` types allowed
- File names: kebab-case. Component names: PascalCase
- Custom hooks prefixed with "use" (e.g., useTaskList)
- Error handling: always use try/catch in async functions
## Do Not
- Do not use the Pages Router or getServerSideProps
- Do not use Redux -- we use Zustand
- Do not write raw SQL -- always use Prisma
- Do not create client components unnecessarily
## Testing
- Unit tests: Vitest. Integration tests: Playwright
- All utility functions must have tests before merging
- Test files live next to the file they test (*.test.ts)
## Commands
- `pnpm dev` -- start dev server (port 3000)
- `pnpm test` -- run Vitest
- `pnpm build` -- production build
9.3 大型 Monorepo 模板
# Monorepo: DataPulse Platform
pnpm workspaces monorepo. Packages in `packages/`.
## Global Commands
- `pnpm install` -- install all dependencies
- `pnpm -r build` -- build all packages
- `pnpm -r test` -- test all packages
## Global Rules
- Changes to `packages/shared` require running tests in all consuming packages
- Use workspace protocol for internal dependencies: `"@company/shared": "workspace:*"`
- Never install dependencies at the root unless they're dev tools
## Verification
After changes, always run:
1. `pnpm lint`
2. `pnpm -r test`
3. `pnpm -r build`
@packages/web/CLAUDE.md
@packages/api/CLAUDE.md
@packages/shared/CLAUDE.md
10. 故障排查
10.1 Claude 不遵循 CLAUDE.md
- 运行
/memory验证文件是否被加载。如果文件未列出,Claude 看不到它。 - 检查文件位置 是否在会话的加载路径上。
- 使指令更具体。"使用 2 空格缩进"比"格式化代码要规范"更有效。
- 查找冲突指令。如果两个文件对同一行为给出不同指导,Claude 可能任意选择其一。
10.2 CLAUDE.md 太大
超过 200 行的文件消耗更多上下文并可能降低遵循率。使用路径作用域规则仅在 Claude 处理匹配文件时加载指令,或修剪非每次会话必需的内容。
10.3 指令在 /compact 后丢失
项目根 CLAUDE.md 在 /compact 后重新加载。子目录 CLAUDE.md 不会自动重新注入;它们在 Claude 下次读取该子目录文件时重新加载。
11. 参考来源
- Claude Code 官方文档 - Memory
- Claude Code 官方文档 - .claude Directory
- Anthropic 博客 - Using CLAUDE.md files
- SFEIR Institute - CLAUDE.md Memory System Tutorial
- Alex Rusin Blog - Claude Code Instructions and Memory Setup Guide
- DataCamp - Writing the Best CLAUDE.md
- Supalaunch - How to Write the Perfect Config File
- ChatForest - Writing Effective CLAUDE.md Files
- CodingNomads - Writing CLAUDE.md Files That Claude Actually Follows
- Amit Ray - Best Practices for CLAUDE.md
- AI Org - Claude Code Best Practices
- TokenCentric - AI Coding Config Files Compared
- AgentRuleGen - Cursor Rules vs CLAUDE.md
- Awesome CLAUDE.md (GitHub)
- Ian Paterson - Claude Code Memory Architecture
- CallMePhilip - Notes on CLAUDE.md Structure