
每次新 session Claude 都从零记忆出发,CLAUDE.md 和 Auto Memory 是解决这个问题的两套互补机制。本篇完整拆解四层作用域(Managed/User/Project/Local)与加载顺序、`.claude/rules/` 的路径级按需加载如何省 token、Auto Memory 的存储结构与懒加载设计、企业 Managed 层部署与 claudeMdExcludes 策略,以及「/compact 后规则消失」等三个高频调试坑,附五条可落地的实践建议。
npm run test:unit」「别直接往 main 分支推」。| CLAUDE.md | Auto Memory | |
|---|---|---|
| 由谁写 | 开发者手动写 | Claude 自动记录 |
| 内容类型 | 项目规范、工作流程、架构约定 | 构建命令、调试经验、Claude 观察到的偏好 |
| 作用域 | 项目 / 用户 / 组织级 | 单仓库,跨 worktree 共享 |
| 加载方式 | 每次 session 全量注入上下文 | 每次 session 加载前 200 行或 25KB |
| 最适合 | 你想主动控制的规则与约定 | 让 Claude 从使用中学习、减少重复纠正 |

| 层级 | 路径 | 作用范围 | 典型用途 |
|---|---|---|---|
| Managed 层 | macOS: /Library/Application Support/ClaudeCode/CLAUDE.md / Linux: /etc/claude-code/CLAUDE.md | 机器上所有用户、所有项目 | 公司编码规范、合规要求(IT 通过 MDM/Ansible 分发) |
| User 层 | ~/.claude/CLAUDE.md | 当前用户的所有项目 | 个人代码风格偏好、常用工具快捷方式 |
| Project 层 | ./CLAUDE.md 或 ./.claude/CLAUDE.md | 当前项目(通过版本控制与团队共享) | 项目架构、测试命令、命名约定 |
| Local 层 | ./CLAUDE.local.md(加入 .gitignore) | 仅当前用户、当前项目 | 本地 sandbox URL、个人测试数据 |
./CLAUDE.md 在 ~/.claude/CLAUDE.md 之后进入上下文,项目级指令优先级更高。foo/bar/ 目录下启动 Claude,它会加载:foo/CLAUDE.md → foo/bar/CLAUDE.md → 各层对应的 CLAUDE.local.md,全部拼接进上下文(不是覆盖)。.claude/rules/ 做路径级按需加载your-project/
├── .claude/
│ ├── CLAUDE.md # 全局主指令
│ └── rules/
│ ├── code-style.md # 始终加载(无 paths 声明)
│ ├── testing.md # 始终加载
│ └── api-design.md # 只有操作 API 文件时才加载.md 文件头部加 YAML frontmatter:---
paths:
- "src/api/**/*.ts"
- "src/api/**/*.tsx"
---
# API 开发规范
- 所有 API endpoint 必须包含输入验证
- 使用标准错误响应格式(见 src/lib/errors.ts)
- 必须包含 OpenAPI 注释src/api/users.ts 时,这份规则才会进入上下文;操作 src/components/Button.tsx 时不会加载。~/.claude/rules/ 下的文件在所有项目中生效——优先级低于项目级 rules,但高于 managed 层之外的全局默认。
~/.claude/projects/<project-hash>/memory/
├── MEMORY.md # 入口索引(每次 session 加载前 200 行或 25KB)
├── debugging.md # Claude 整理出的调试经验
├── api-conventions.md # Claude 观察到的 API 约定
└── ... # 其他主题文件(按需创建)MEMORY.md 是一份索引,记录「去哪里找什么」。细节内容放在主题文件里,不在 session 启动时加载,而是 Claude 认为需要时通过文件工具按需读取。{
"autoMemoryEnabled": false
}CLAUDE_CODE_DISABLE_AUTO_MEMORY=1。
/Library/Application Support/ClaudeCode/CLAUDE.md),由 IT 通过 MDM/Ansible 推送,覆盖该机器上所有用户的 Claude 会话,且无法被 claudeMdExcludes 排除1。managed-settings.json:{
"claudeMd": "提交前始终运行 `make lint`。\n禁止直接推送到 main 分支。"
}| 要控制的事情 | 配置位置 |
|---|---|
| 限制特定工具、命令、文件路径 | managed-settings.json → permissions.deny |
| 强制沙箱隔离 | managed-settings.json → sandbox.enabled |
| 代码风格、合规提示、行为指令 | Managed CLAUDE.md |
{
"claudeMdExcludes": [
"**/monorepo/CLAUDE.md",
"/home/user/monorepo/other-team/.claude/rules/**"
]
}.claude/settings.local.json 使排除只在本机生效。/memory 命令,查看当前 session 实际加载了哪些文件。如果你的 CLAUDE.md 不在列表里,说明路径不对或不在加载层级内。/compact 后,工作目录的 CLAUDE.md 会重新从磁盘读取并注入——这部分不会丢失。@path/to/file 语法把内容拆分成多个文件并不能缓解这个问题,因为被 @ 导入的文件仍然在 session 启动时全量注入。真正的解法是用 .claude/rules/ 加 paths frontmatter,让规则只在需要时加载。/init 生成起步文件,再手动精炼
/init 命令让 Claude 自动分析当前代码库,生成包含构建命令、测试方法和项目约定的初始 CLAUDE.md。设置 CLAUDE_CODE_NEW_INIT=1 启用多阶段交互式流程,能进一步定制要生成的 Skills 和 Hooks。初始文件生成后,删掉 Claude 能从代码里自己推断的内容,只保留它靠静态分析无法得知的规则。rules/api-design.md 加 paths: ["src/api/**/*.ts"]。「所有文件都用 2-space 缩进」→ 放进主 CLAUDE.md。规则的触发范围越窄,越应该放进 rules/ 的路径级文件。/memory → 打开 auto memory 目录查看 Claude 记录了什么。Auto Memory 里的内容有时比你自己写的 CLAUDE.md 更准确地反映了「Claude 在这个项目里实际学到了什么」。发现过时或错误的记录直接编辑对应的 .md 文件即可;Auto Memory 是普通 Markdown,不需要特殊工具管理。permissions.deny。Settings 里的限制是客户端强制执行的,Claude 自己无法绕过;CLAUDE.md 里的限制是上下文约束,Claude 通常遵循但在极少数情况下可能忽略。docs.anthropic.com
This story was produced automatically by a channel. One sentence is all it takes for Neodrop to keep producing for you.