Memory:
让 Claude 记住你的项目
每段新对话,Claude 都从零开始。"装依赖用 pnpm""测试前先起 Redis"这些话,你不想每次都重说一遍。写进记忆,它每次开工前都会先读。
时间紧就先看"入门"和"实战";"原理"讲清楚文件怎么加载,决定你的规则能不能真正生效。
为什么需要记忆?
把 Claude 想成一位能力很强、刚来你们团队的新同事。麻烦的是,他每天早上都会失忆。
每段对话开始时,Claude 的上下文都是空的:昨天聊过什么、你纠正过它什么,它都不记得。同一个请求,有没有记忆,结果差别很大:
两套记忆,分工不同
| CLAUDE.md | 自动记忆 | |
|---|---|---|
| 谁来写 | 你 | Claude 自己 |
| 写什么 | 指令和规则 | 它从你的纠正和偏好里学到的东西 |
| 范围 | 项目、个人或整个组织 | 每个代码仓库一份 |
| 什么时候读 | 每段对话开始时 | 每段对话开始时(只读前 200 行或 25KB) |
| 适合 | 代码规范、常用命令、项目架构 | 你的偏好、你纠正过的事、从代码里看不出来的背景 |
两套记忆对 Claude 来说都是上下文:它会读、会努力遵守,但不保证百分之百照做。规则写得越具体、越简短,它越听话。必须每次都执行的事(比如提交前一定跑 lint),要交给 Hook(第 6 课)。
写出第一个 CLAUDE.md
不用从空白文件开始。一条 /init,Claude 会先读一遍项目,替你起个草稿。
在项目目录里启动 Claude Code,输入 /init。Claude 会分析代码库,生成一份包含构建命令、测试方法、项目约定的 CLAUDE.md。如果已经有 CLAUDE.md,它不会覆盖,而是给出改进建议。下面是草稿补完之后的样子,最后"注意"那一节是你自己加的:
草稿只是起点。接下来补上Claude 从代码里看不出来的东西:团队约定、踩过的坑、为什么这么做。它能自己从代码里读出来的内容(比如目录结构、依赖列表),反而可以删掉。
在对话里输入 /context,看 Memory files 下面的列表。列表里没有的文件,Claude 就看不到。
启动前设置环境变量 CLAUDE_CODE_NEW_INIT=1,/init 会变成多步引导:先问你要生成哪些东西(CLAUDE.md、skill、hook),再派子代理探索代码库、追问细节,最后给你一份方案确认后才写文件。
该写什么,不该写什么
把 CLAUDE.md 当成"不想再解释第二遍"的清单。
什么时候该往里加一条
- Claude 第二次犯同一个错误
- 代码审查时发现,有件事 Claude 本该知道
- 你在对话里打了一句纠正,而这句话上次也打过
- 新同事入职也需要知道这件事
写法:具体到能检验
| ✗ 太笼统 | ✓ 具体 |
|---|---|
| 代码格式要规范 | 用 2 个空格缩进 |
| 改完要测试 | 提交前运行 npm test |
| 文件放整齐 | 接口处理函数放在 src/api/handlers/ |
- 短:每个 CLAUDE.md 控制在 200 行以内。越长越占上下文,Claude 也越不容易全部遵守。
- 有结构:用 Markdown 标题和列表分组,Claude 和人一样,扫读结构清楚的文档更快。
- 不矛盾:两条规则打架时,Claude 可能随便挑一条。定期检查,删掉过时的。
练一练:这条该放哪?
不是所有"要记住的事"都该进 CLAUDE.md。每条选一个最合适的去处。
放在哪里:四个位置
同样叫 CLAUDE.md,放的位置不同,给谁用就不同。
| 范围 | 位置 | 给谁用 | 放什么 |
|---|---|---|---|
| 组织策略 | | 公司里所有人 | 公司规范、安全要求。由 IT 统一下发,个人不能排除 |
| 个人 | ~/.claude/CLAUDE.md | 只有你,所有项目 | 你的习惯,比如"回复用中文" |
| 项目 | ./CLAUDE.md 或./.claude/CLAUDE.md | 整个团队(提交到 git) | 项目架构、代码规范、常用命令 |
| 本地 | ./CLAUDE.local.md | 只有你,当前项目 | 你本机的测试地址、个人测试数据。记得加进 .gitignore |
练一练:这条放哪个位置?
输入 /memory,会列出个人和项目范围里的记忆文件,选一个就在编辑器里打开。个人和项目的 CLAUDE.md 就算还没创建也会列出来,选中就会新建。自动记忆的开关和文件夹也在这里。
加载顺序:拼在一起,不是覆盖
多个 CLAUDE.md 同时存在时,Claude Code 会把它们全部拼接进上下文,而不是只用"优先级最高"的那个。
Claude Code 从你启动的目录开始,往上找每一层目录里的 CLAUDE.md 和 CLAUDE.local.md,启动时全部读进来;往下的子目录里的,要等 Claude 读到那个子目录里的文件时才加载。换个启动目录、让 Claude 读几个文件,看看"上下文里的顺序"怎么变:
文件
上下文里的顺序(从先到后)
- 越靠后,越晚被读到。离启动目录越近的文件越靠后;同一目录里,
CLAUDE.local.md排在CLAUDE.md后面。 - 没有谁覆盖谁。个人规则和项目规则互相矛盾时,Claude 照哪条做都有可能。发现冲突就改掉一条。
- "组织策略"最先加载,而且个人没法把它排除。
项目根目录的 CLAUDE.md、没写 paths 的规则和自动记忆,都会在 /compact 后从磁盘重新读取,不会丢。子目录的 CLAUDE.md 和带 paths 的规则会暂时跟着对话一起被压缩掉,等 Claude 下次读到相关文件时再加载回来。真正会丢的,是只在对话里说过、没写进文件的要求,所以重要的话要写进文件。
@ 导入与 .claude/rules/
CLAUDE.md 越写越长时,有两种拆法。一种只是"整理",另一种才真正"省空间"。
@ 导入:引用已有的文档
项目概况见 @README.md 可用的 npm 命令见 @package.json # Git 流程 - 分支和提交规范见 @docs/git-instructions.md
- 相对路径相对于写这行的文件,不是相对于启动目录;也可以用绝对路径或
@~/…。 - 被导入的文件还能继续导入,最多 4 层。
- 写在反引号或代码块里的
@路径不会被导入,只是文字,所以可以放心地在文档里举例。 - 项目文件第一次导入工作目录以外的文件时,会弹窗请你确认。这是为了防止别人提交的文件偷偷引入你电脑上的内容。
被导入的文件启动时就会全部加载,和直接写在 CLAUDE.md 里占的空间一样。它的好处是避免重复、方便维护,不是瘦身。
.claude/rules/:按主题拆,还能按文件生效
--- paths: - "src/api/**/*.ts" --- # 接口开发规则 - 所有接口都要校验输入参数 - 错误统一用标准的响应格式
- 每个文件讲一个主题,比如
testing.md、security.md;子目录也会被扫描到。 - 没写
paths:启动时加载,地位和.claude/CLAUDE.md一样。 - 写了
paths:只有 Claude 读到匹配的文件时才加载。这才是真正省上下文的拆法。paths也是规则文件唯一会被读取的字段。 - 放在
~/.claude/rules/的是个人规则,对你所有项目生效,加载顺序在项目规则之前。
试一试:这个文件会触发哪些规则?
| 写法 | 匹配 |
|---|---|
**/*.ts | 任意目录下的所有 .ts 文件 |
src/**/* | src/ 下的所有文件 |
*.md | 项目根目录下的 Markdown 文件(不含子目录) |
src/**/*.{ts,tsx} | 用花括号同时匹配多种扩展名 |
自动记忆:Claude 自己记的笔记
你纠正过它的事、你的偏好,Claude 会自己记下来,下次对话开始时再读。默认就是开着的。
Claude 会把笔记分成四类,记在每个文件开头的 type 字段里:
user你是谁:角色、擅长什么、工作习惯feedback你纠正过它的、你确认过的做法project进行中的工作、截止日期,以及代码里看不出来的决定reference项目外的信息在哪:工单系统、监控看板能从代码里看出来的东西(架构、文件路径、改过的 bug),以及 CLAUDE.md 里已经写了的,它都不会重复记。也不是每次对话都会记:它只记下以后可能用得上的。
打开文件夹看看
自动记忆存在 ~/.claude/projects/<项目>/memory/,全是普通的 Markdown,你可以随时查看、修改、删除。下面是一个示例文件夹:
~/.claude/projects/my-app/memory
MEMORY.md是索引,一条一行。每段对话开始时只读它的前 200 行或前 25KB(先到哪个算哪个),超出的部分读不到,所以 Claude 会把细节挪进单独的主题文件。- 主题文件按需读取:启动时不加载,Claude 需要时才打开。
- 只在本机:同一个 git 仓库的各个 worktree、子目录共用一份;不会同步到别的电脑或云端。
- 界面里看到 "Saved 2 memories"、"Recalled 2 memories",就是它在写入或读取这个文件夹。
你说的话,决定记到哪里
| 你怎么说 | 记到哪里 |
|---|---|
| "记住:我们一律用 pnpm" | 自动记忆 |
| "把『用 pnpm』加到 CLAUDE.md 里" | CLAUDE.md |
输入 /memory,自己打开文件改 | 你选的那个文件 |
在 /memory 里切换自动记忆开关,会写进 ~/.claude/settings.json 的 autoMemoryEnabled。只想对某个项目关掉,就在那个项目的 .claude/settings.local.json 里写 "autoMemoryEnabled": false(写在 .claude/settings.json 会提交到 git,整个团队都关掉);也可以用环境变量 CLAUDE_CODE_DISABLE_AUTO_MEMORY=1。
终端演练:让 Claude 记住规矩
从 /init 开始,看记忆怎样跨过一次新对话。点"下一步"回放,放完可以自己输入。
终端画面为教学示意,与真实 Claude Code 的界面细节可能略有不同,但记忆的工作方式一致。
给你的 CLAUDE.md 做个体检
把你的 CLAUDE.md 贴进来,对照这节课讲的原则逐条检查。
这是按本课原则做的简单规则比对,方便自查,不代表 Claude 实际怎么读。Claude Code 自带的 /doctor 也会检查 CLAUDE.md,并建议删掉能从代码里推断出来的内容。
三份模板
原教程仓库提供的三份 CLAUDE.md 示例,保留英文原文。里面的具体数字、人名是示例,拿去用时换成你项目的实际情况。
进阶与避坑
团队协作、大仓库、和其他 AI 工具共存时会遇到的问题。
Claude 不照 CLAUDE.md 做
- 先
/context看 Memory files 列表里有没有这个文件。没有就是没加载,检查位置对不对。 - 把要求写得更具体:"用 2 个空格缩进"比"格式整齐"有效得多。
- 找找有没有互相矛盾的规则,包括子目录的 CLAUDE.md 和
.claude/rules/。 - CLAUDE.md 是作为一条用户消息放在系统提示之后的,本来就不保证严格执行。必须执行的动作写成 hook(第 6 课)。
项目里已经有 AGENTS.md
AGENTS.md(很多 AI 编程工具通用的项目说明文件)。默认规则是:找不到任何项目级 CLAUDE.md 时才读 AGENTS.md;两者都有时只读 CLAUDE.md。想两个都读,在 /config 里把 Project instructions 设成 claude-md-and-agents-md。也可以在 CLAUDE.md 里写一行 @AGENTS.md 导入它,不会被读两遍。加了 CLAUDE.local.md 之后,AGENTS.md 不生效了
CLAUDE.local.md 也算"有 CLAUDE.md",默认规则下 AGENTS.md 就不再读了。解决办法同上:改 Project instructions 设置,或在 CLAUDE.md 里导入 @AGENTS.md。大仓库里总加载别的团队的 CLAUDE.md
claudeMdExcludes 跳过它们。这些写法是拿去和文件的绝对路径比对的,所以要么写完整路径,要么用 **/ 开头:"claudeMdExcludes": ["**/packages/legacy-app/CLAUDE.md", "**/vendors/**/CLAUDE.md"]。只想对自己生效,就写在 .claude/settings.local.json 里。组织策略的 CLAUDE.md 不能被排除。想在 CLAUDE.md 里写给人看的备注,又不想占上下文
<!-- 备注 -->。块级 HTML 注释在交给 Claude 之前会被去掉,不占 token;代码块里的注释会保留。用 --add-dir 加了别的目录,那边的 CLAUDE.md 没加载
CLAUDE_CODE_ADDITIONAL_DIRECTORIES_CLAUDE_MD=1 才会一起读那个目录的 CLAUDE.md、.claude/rules/ 和 CLAUDE.local.md。CLAUDE.md 太长了怎么办
paths 的 rules;@ 导入只能整理,不能瘦身。也可以跑一次 /doctor,它会建议删掉能从代码里推断出来的内容。老教程里的 # 快捷记忆不能用了
# 可以快速加一条记忆,这个快捷方式已经取消。现在直接对 Claude 说"记住……"(存到自动记忆),或"把……加到 CLAUDE.md",或用 /memory 自己改。小测验
8 道题,每题选完会立刻看到解析。
