跳转到内容

记忆系统 Memory

如果说上下文窗口是 Claude 的「短期记忆」,那 CLAUDE.md 就是它的「长期记忆」。

打个比方:你招了个实习生,每天换一个工位。他记不住昨天你们约定了什么,除非你把规矩写在一张便签上、贴在他每天必看的墙上。CLAUDE.md 就是那张便签——每次会话开始,Claude 都会自动读它,不用你每次重复说。

Claude Code 的记忆不是一个大杂烩文件,而是四层金字塔,从全局到局部层层覆盖。理解这四层,才能把规矩放对地方。

层级 文件位置 作用域 谁来维护
企业级 /Library/Application Support/ClaudeCode/CLAUDE.md(macOS) 全公司所有项目 IT / 安全团队
用户级 ~/.claude/CLAUDE.md 当前用户的所有项目 你自己
项目级 ./CLAUDE.md./.claude/CLAUDE.md 当前项目(随仓库走) 团队共享
本地级 ./CLAUDE.local.md 当前项目、当前机器 ⚠️ 已弃用

讲个小故事说明它们的用处:

  • 企业级写「所有提交必须走内部安全扫描」——全公司通用,谁也别想绕。
  • 用户级写「我偏好中文回复、回答要简洁」——你自己的习惯,跨项目生效。
  • 项目级写「本项目用 pnpm 而非 npm、测试跑 vitest」——团队共享,提交进 git 一起走。
  • 本地级曾经用来写「我自己机器上的特殊路径」,但官方已标记为弃用(deprecated),现在推荐用 .claude/settings.local.json 来放本地私有配置。

会话启动时,Claude 会从上到下依次读取这四层,全部内容拼起来塞进上下文。所以企业级 + 用户级 + 项目级的内容会一起生效。

当 CLAUDE.md 写得越来越长,一个问题出现了:它每次都进上下文,吃 token。而且团队规矩和个人习惯混在一个文件里,乱。

@import 语法解决这个问题。你可以在 CLAUDE.md 里引用其它文件:

# 项目规范
@docs/conventions/coding-style.md
@docs/conventions/testing.md
@~/.claude/personal-preferences.md

Claude 读到 @ 开头的路径时,会把那个文件的内容也读进来。好处是:

  • 拆分管理:把大文件拆成多个小文件,各管各的。
  • 跨项目复用:用户级习惯写一次,多个项目 @import 进来。
  • 按需精简:不常用的内容拆出去,主文件保持精炼。

写 CLAUDE.md 不用每次打开编辑器。在对话里,以 # 开头打一句话,Claude 会问你「这条规矩存到哪个文件」,然后自动追加进去。

> # 永远不要直接修改 migrations 目录下已发布的迁移文件
存到哪个文件?
> 项目(./CLAUDE.md)
已添加。

这个快捷方式让「边干边立规矩」变得很顺手。你不用停下来去编辑文件,说完一句话它就记下了。

接手一个新项目,不知道该往 CLAUDE.md 里写什么?用 /init

/init

Claude 会自动扫描项目——读 package.json、看目录结构、读关键配置文件——然后生成一份初始的 CLAUDE.md,包含:

  • 项目用什么技术栈、什么包管理器
  • 怎么跑测试、怎么构建
  • 代码风格的初步判断

这不是终点,而是起点。生成的文件你可以再手动润色。新项目的第一天,/init 跑一遍,规矩就有了雏形。

/memory 命令会用你的默认编辑器打开 CLAUDE.md(通常按层级打开多个文件让你选)。比 # 快捷方式适合做大改动——比如重写整个「代码规范」段落。

/memory

除了你手写的 CLAUDE.md,Claude Code 还有「自动记忆」能力。在交互过程中,Claude 会判断哪些信息值得长期记住,并询问你是否要存进记忆文件。

比如你纠正它两次「这个项目用 tab 不用空格」,它可能主动提议:「要不要把『用 tab 缩进』加进项目记忆?」你说好,它就写进去。下次开新会话,这条规矩就在了。

这是从「你手写规章」进化到「Claude 帮你沉淀规章」的一步。

CLAUDE.md 是「贴在墙上的规章」,但不是什么都该往上贴。一个原则:写稳定的、反复出现的规矩,不写一次性的需求

✅ 该写 ❌ 不该写
代码风格、技术栈约定 「这次帮我修一下 login 页的 bug」
测试 / 构建命令 具体的 API 密钥、密码
不可碰的目录 临时的偏好(比如「今天先不写测试」)
提交信息规范 大段的具体业务逻辑(拆到文档里 @import

还有一个关键认知:CLAUDE.md 是建议性的,不是强制性的。Claude 会参考它,但不保证 100% 照做——就像墙上的规章,员工可能违反。如果你有绝对不能违反的规则(比如「永远不能 force push」),那不该写 CLAUDE.md,而该写 Hooks。Hooks 是「不可贿赂的门卫」,100% 执行。

# 项目:电商后台
## 技术栈
- 前端:React 18 + TypeScript + Vite
- 后端:NestJS + Prisma
- 测试:Vitest
- 包管理:pnpm(不要用 npm)
## 命令
- 测试:pnpm test
- 单文件测试:pnpm test path/to/file
- 构建:pnpm build
- 代码检查:pnpm lint
## 规则
- TypeScript strict 模式,禁止 any
- 新函数必须带测试
- 不修改已发布的 Prisma migration
- 提交信息走 conventional commits
## 结构
- /src/modules 按业务模块组织
- /generated 是自动生成,不要手改

CLAUDE.md 是贴在墙上的规章——四级分层管好作用域,@import 拆分复用,#随手加,/init 一键生成。但记住它是建议性的,硬规则要交给 Hooks。


下一站,去 斜杠命令 Commands 看看怎么把反复打的指令变成一键快捷。🚀