CLAUDE.md 是提升 Claude Code 输出质量成本最低的单一操作。但大多数人只知道"在项目根目录建一个文件",不知道它背后有完整的层级系统——5 种存储位置、不同的加载时机、独立的 Auto Memory 机制、以及 .claude/rules/ 路径限定规则。本文是官方文档 + morphllm 深度分析的完整整理。
CLAUDE.md vs Auto Memory:两种记忆机制
Claude Code 有两套互补的记忆机制,每次会话开始时都加载:
| CLAUDE.md | Auto Memory(MEMORY.md) | |
|---|---|---|
| 谁写 | 你 | Claude 自动写 |
| 写什么 | 规则和指令 | Claude 发现的模式和偏好 |
| 作用范围 | 项目/用户/组织 | 每个 Repository,跨 Worktree 共享 |
| 加载方式 | 每次会话全量加载 | 每次会话只加载前 200 行(或 25KB) |
| 版本控制 | 提交到 Git,团队共享 | 机器本地,不共享 |
| 适合 | 编码规范、工作流、项目架构 | 构建命令、调试心得、Claude 发现的偏好 |
原则:CLAUDE.md 放你想让整个团队知道的事,Auto Memory 放 Claude 自己学到的东西。
5 种存储位置(从高到低优先级)
1. Managed Policy(组织级,最高优先级)
macOS: /Library/Application Support/ClaudeCode/CLAUDE.md
Linux: /etc/claude-code/CLAUDE.md
Windows: C:\Program Files\ClaudeCode\CLAUDE.md
由 IT/DevOps 管理,所有用户强制加载,无法排除。适合:公司编码规范、安全策略、合规要求。
2. User Global(个人全局)
~/.claude/CLAUDE.md
适用于你的所有项目。放个人偏好:
# 个人偏好(~/.claude/CLAUDE.md)
- 使用 TypeScript strict 模式
- 优先 const over let
- 用 early return 代替嵌套 if/else
- commit 消息使用 Conventional Commits 格式
- 公共函数必须有 JSDoc 注释3. Project Instructions(项目级)
./CLAUDE.md 或 ./.claude/CLAUDE.md
提交到版本控制,团队共享。放项目规则(不是个人偏好):
# 项目:电商 API(./CLAUDE.md)
## 构建命令
- 开发:`npm run dev`
- 测试:`npm test`
- 构建:`npm run build`
## 技术栈
- Node.js 20 + TypeScript 5.4
- Express + Zod 验证
- PostgreSQL + Prisma ORM
## 代码规范
- API 响应格式:`{ data, error, meta }`
- 错误处理通过 `src/utils/errors.ts` 的 AppError 类
- 所有 SQL 查询通过 `src/repositories/` 的 Repository 模式
## 目录结构
- src/routes/ — Express 路由
- src/services/ — 业务逻辑
- src/repositories/ — 数据库访问4. Local Instructions(个人项目级)
./CLAUDE.local.md
不提交到 Git(自动加入 .gitignore),只影响你自己。放个人专属配置:
# 我的本地配置(CLAUDE.local.md,不提交)
- 本地测试数据库:postgresql://localhost:5432/myapp_dev
- 测试账户:test@example.com / password123
- 跳过 Stripe 支付测试(本地没有 API Key)
- 我的个人 staging URL:https://myapp-staging.ngrok.io5. Subdirectory CLAUDE.md(按需加载)
src/components/CLAUDE.md
src/api/CLAUDE.md
与上面几种的关键区别:不在启动时加载,在 Claude 读取该目录的文件时才按需加载。
适合:只在特定模块工作时才需要的详细规范。
加载顺序详解
Claude Code 从当前工作目录向上遍历目录树,加载所有 CLAUDE.md 和 CLAUDE.local.md 文件。所有文件拼接(不是覆盖),按从文件系统根到工作目录的顺序排列。
你在 ~/projects/myapp/src/api/ 里运行 claude
加载顺序(从早到晚):
1. /Library/.../CLAUDE.md(Managed Policy)
2. ~/.claude/CLAUDE.md(User Global)
3. ~/projects/CLAUDE.md(如果存在)
4. ~/projects/myapp/CLAUDE.md
5. ~/projects/myapp/.claude/CLAUDE.md
6. ~/projects/myapp/CLAUDE.local.md
7. ~/projects/myapp/src/CLAUDE.md(如果存在)
8. ~/projects/myapp/src/api/CLAUDE.md(启动时加载)
按需加载(当 Claude 读取对应目录文件时):
- ~/projects/myapp/src/components/CLAUDE.md
- ~/projects/myapp/src/services/CLAUDE.md
更靠近工作目录的文件后读取,意味着更具体的规则可以覆盖上层规则(有冲突时,下层读取更晚,优先级更高)。
@import 语法:模块化组织
CLAUDE.md 可以引用其他文件(启动时内联展开,不是懒加载):
# CLAUDE.md
参考 @README.md 了解项目概述,@package.json 了解可用命令。
## 额外指令
- Git 工作流规范:@docs/git-workflow.md
- 安全规范:@docs/security-rules.md
- API 设计规范:@docs/api-design.md规则:
- 相对路径相对于包含
@import的 CLAUDE.md 文件(不是工作目录) - 最多 5 层递归
- 首次遇到外部导入时,显示批准对话框
跨 Worktree 共享个人配置(CLAUDE.local.md 只在创建它的 Worktree 里存在):
# CLAUDE.local.md
@~/.claude/my-project-personal-notes.md.claude/rules/:路径限定规则
更大的项目用 .claude/rules/ 目录把规则模块化,每个文件一个主题:
your-project/
├── CLAUDE.md # 主要项目指令(保持精简)
└── .claude/
└── rules/
├── code-style.md # 代码风格(全局)
├── testing.md # 测试规范(全局)
├── security.md # 安全要求(全局)
├── api/
│ └── api-design.md # API 设计(路径限定)
└── frontend/
└── react.md # React 规范(路径限定)
无 paths 字段的 Rule:启动时加载,和 .claude/CLAUDE.md 优先级相同。
有 paths 字段的 Rule(路径限定):
---
paths:
- "src/api/**/*.ts"
---
# API 开发规范
- 所有 API 端点必须包含输入验证
- 使用标准错误响应格式 `{ code, message, details }`
- 包含 OpenAPI 文档注释
- 认证中间件必须在路由处理器之前运行---
paths:
- "src/components/**/*.tsx"
- "src/pages/**/*.tsx"
---
# React 组件规范
- 使用函数式组件和 Hooks(不用 Class 组件)
- Props 用 interface 而非 type
- 纯展示组件用 React.memo
- 回调传给子组件时用 useCallback触发时机:当 Claude 读取匹配路径的文件时(不是每次工具调用)。这样 TypeScript 规范只在 Claude 处理 .ts 文件时加载,不会总占着上下文空间。
与 Skills 的区别:
.claude/rules/ | Skills | |
|---|---|---|
| 触发 | 读取匹配文件时自动 | 手动调用或 Claude 判断相关时 |
| 内容类型 | 持续有效的规范 | 可复用的工作流步骤 |
| 适合 | "写这类文件时始终遵守" | "执行这个操作时按步骤做" |
Token 预算和遵从度
核心原则:不是 Token 用多了不行,而是指令太多会被忽略。
- Claude Code 上下文窗口:约 200K Token(标准),1M Token(Beta)
- 100 行 CLAUDE.md ≈ 500–2000 Token(取决于内容密度)
- Token 成本本身不是问题
真正的问题:指令密度
研究表明,前沿 LLM 可以可靠遵循约 150–200 条独立指令。Claude Code 内置系统 Prompt 已包含约 50 条。这意味着你的有效指令预算约为 100–150 条。超过这个数量,Claude 开始"丢失"规则——不是 Token 溢出,而是注意力降级。
Prompt 缓存的影响:
CLAUDE.md 内容是缓存系统 Prompt 前缀的一部分。多轮会话中:
- 第一次调用:全量 Token 费用(如 1500 Token)
- 后续调用:从缓存读取,约便宜 90%
所以更长的 CLAUDE.md 只增加第一次调用的成本,后续调用几乎没有额外开销。
精简测试:对每一行问"删掉这行,Claude 会犯什么具体的错?"如果答不上来,删掉它。
Auto Memory(自动记忆)详解
存储位置
~/.claude/projects/<repo-hash>/memory/
├── MEMORY.md # 主索引文件(每次会话加载前 200 行)
├── debugging.md # 调试相关(按需加载)
├── api-conventions.md # API 约定(按需加载)
└── patterns.md # 代码模式(按需加载)
<repo-hash> 是 Repository 路径的哈希。同一 Repository 的所有 Worktree 共享同一个 Auto Memory 目录。
不可用的情况:
- 云端会话(Routines、Web)没有你的本地 Auto Memory
- 跨机器不共享(在服务器上运行的 Claude 看不到你笔记本的 Auto Memory)
Auto Memory 如何工作
- 你告诉 Claude "记住这个"(或 Claude 从你的纠正中自动学习)
- Claude 把信息存入
~/.claude/projects/<hash>/memory/MEMORY.md - 下次会话开始时,Claude 加载 MEMORY.md 的前 200 行
- 需要时,Claude 主动读取具体话题文件(
debugging.md等)
启用/禁用
// settings.json
{
"autoMemory": true // 默认启用
}或在会话内:/memory enable / /memory disable
查看和编辑
# 在会话内查看
/memory
# 直接编辑文件
cat ~/.claude/projects/$(ls ~/.claude/projects/)/memory/MEMORY.md
# 告诉 Claude 记住某件事
> 记住:我们的项目不使用 Jest,用的是 VitestCLAUDE.md 与 Hooks 的分工
一个常见错误:在 CLAUDE.md 里写"每次修改文件后运行 ESLint",同时在 Hooks 里也配置了 PostToolUse 自动运行 ESLint。
这会产生冲突:Hook 自动运行后,Claude 又手动运行一次,产生重复执行。
正确的分工:
| 用途 | 用哪个 |
|---|---|
| 需要判断的规则("如果是 React 组件,用 memo") | CLAUDE.md |
| 每次必须执行,无例外(lint 检查、危险命令拦截) | Hooks |
| 步骤化流程("如何部署到生产") | Skills |
原则:CLAUDE.md 是建议性的(Claude 读了会尽量遵守),Hooks 是确定性的(一定执行)。不要用 CLAUDE.md 来表达"每次都必须做某件事",用 Hook。
Compaction(上下文压缩)后怎么办
好消息:CLAUDE.md 完全在压缩后保留。
运行 /compact 后,Claude Code 从磁盘重新读取 CLAUDE.md 并重新注入。你的指令不会被摘要、截断或丢失。
坏消息:只在对话中说过的指令(没有写入文件的)会被压缩丢失。
结论:任何你希望在整个会话里持续有效的规则,必须写入 CLAUDE.md(或 Auto Memory),不要只在对话里说一遍。
Monorepo 配置模式
my-monorepo/
├── CLAUDE.md # 组织级规则,精简
├── .claude/
│ └── rules/
│ ├── code-style.md # 全局代码风格
│ └── git-workflow.md # 全局 Git 规范
├── packages/
│ ├── frontend/
│ │ ├── CLAUDE.md # Frontend 专属规则
│ │ └── .claude/rules/
│ │ └── react.md # React 组件规范(路径限定)
│ ├── backend/
│ │ ├── CLAUDE.md # Backend 专属规则
│ │ └── .claude/rules/
│ │ └── api.md # API 规范(路径限定)
│ └── shared/
│ └── CLAUDE.md # 共享包规则
└── tools/
└── CLAUDE.md # 构建工具规则
使用 claudeMdExcludes(当其他团队的 CLAUDE.md 被意外加载时):
// settings.json
{
"claudeMdExcludes": [
"packages/legacy-app/**"
]
}CLAUDE.md vs AGENTS.md vs .cursorrules
| 特性 | CLAUDE.md | AGENTS.md | .cursorrules/.mdc |
|---|---|---|---|
| 工具 | Claude Code | 多工具(Codex/Cursor/Copilot/Gemini/Windsurf) | Cursor IDE |
| 发现方式 | 从工作目录向上遍历 | 从 Git 根向下到工作目录 | 项目根 |
| 全局范围 | ~/.claude/CLAUDE.md | ~/.codex/AGENTS.md | 不支持 |
| 路径限定规则 | ✅ .claude/rules/(paths 字段) | ❌ | ✅(.mdc globs) |
| @import 语法 | ✅(最多 5 层) | ❌ | ❌ |
| 组织级 Policy | ✅ | ❌ | ❌ |
| 个人覆盖文件 | CLAUDE.local.md | AGENTS.override.md | 无 |
团队用多个工具时:创建 CLAUDE.md 并 @AGENTS.md 导入,再追加 Claude Code 专属指令:
# CLAUDE.md
@AGENTS.md
## Claude Code 专属
- 在 `src/billing/` 里的变更使用 Plan Mode
- 部署操作必须通过 /deploy Skill,不要直接运行部署命令来源:Claude Code 官方文档 - Memory | morphllm - CLAUDE.md 深度分析 | 整理:ClaudeEagle