CLAUDE.md:告诉 Claude 你的项目约定
Claude Code 启动时会自动读取几个位置的 CLAUDE.md 文件,把内容拼进上下文:
- 项目级 :当前工作目录下的
CLAUDE.md,团队共享,记录本项目的架构、命令、规范。 - 项目级本地版 :
CLAUDE.local.md,建议加到.gitignore里,用来放个人临时偏好,不进团队仓库。 - 用户级 :
~/.claude/CLAUDE.md,个人全局偏好,所有项目都生效。 - 子目录 :在 monorepo(多个子项目放在同一个仓库里)下,每个子目录也可以放自己的
CLAUDE.md,Claude 读到这个目录下的文件时才顺带加载对应的规则。
简单说,就是你提前把「每次跟 Claude 聊天都得重复交代一遍的话」写进文件里,它自动记住。
一个典型的项目 CLAUDE.md 长这样:
# 项目说明
这是一个 Next.js 全栈项目,前后端都在同一个仓库里。
## 开发命令
- `npm run dev` 启动本地开发服务器,端口 3002
- `npm run build` 生产构建
- `npm run typecheck` 类型检查,提交前必跑
## 代码约定
- 组件用 TypeScript + 函数式写法,禁用 class component
- 样式统一用 Tailwind CSS,不要写 inline style
- 不要在客户端组件里直接 import 服务器模块
这份文档相当于一份长期生效的系统提示词,不用每次会话重复解释「我这个项目是干嘛的」「什么能做什么不能做」,效率高很多。
懒得手写也没关系,在 Claude Code 会话里输入 /init 命令,它会自己扫一遍项目,总结架构和命令,生成一份初版 CLAUDE.md,你在这个基础上改就行。
官方给的经验是:CLAUDE.md 越短越好。Claude 每次会话都加载它,写得臃肿反而会让重要规则被淹没。
适合写进去的:
- Claude 猜不到的内部命令(比如自定义脚本、特殊的 build 流程)
- 和语言默认不同的代码风格
- 测试运行方式、提交规范
- 项目特有的环境变量、隐含约束
不适合写的:
- Claude 读代码就能看出来的内容(不用复述目录结构)
- 详细的 API 文档(链接到官方文档就行)
- 频繁变动的任务进度
- 「写干净的代码」这种显而易见的废话
我的一个实用习惯:每当发现 Claude 反复犯同一个错,就把「正确的做法」加一条到 CLAUDE.md,下次不用再重复纠正。久了它就像一份项目的用户手册,团队其他成员也能用。
Auto memory:Claude 自己写的记忆
CLAUDE.md 是你 写给 Claude 的指令。Claude Code 还有另一套记忆机制叫 auto memory ,是 Claude 自己写给自己的笔记,两者互补。
两者的关键差异:
| CLAUDE.md | Auto memory | |
|---|---|---|
| 谁写 | 你(当然也可以让 Claude Code 帮你更新) | Claude |
| 内容 | 规则、架构、约定 | Claude 观察到的经验、偏好、调试思路 |
| 触发时机 | 你手动编辑 | Claude 自动判断是否值得记。当然你也可以要求它记,比如「把 xxx 记到 memory 里」 |
比如你随口一句「这个项目以后用 pnpm 不用 npm」,或者告诉它「每次改完要跑 npm run typecheck」,Claude 觉得值得记住时,就会把这条笔记写进 memory 文件里,下次会话自动加载。你不用主动维护,它自己会维护这套 memory。
记忆文件按项目目录区分,每个项目有独立的目录:
~/.claude/projects/<项目路径>/memory/
├── MEMORY.md # 索引,每次会话启动时加载前 200 行
├── debugging.md # 按主题分的笔记文件
├── api-conventions.md
└── ...
其中 <项目路径> 是把项目绝对路径里的 / 替换成 - 得到的名字。比如 /Users/alice/code/myapp 对应的目录就是 ~/.claude/projects/-Users-alice-code-myapp/memory/。
MEMORY.md 是索引文件,启动时自动加载(上限前 200 行或 25KB)。其他 topic 文件不会一股脑塞进上下文,Claude 按需读取,保证启动成本可控。
所有文件都是普通 Markdown,你随时可以打开看、改、删。
日常管理用 /memory 命令:输入后会列出当前会话加载的所有 CLAUDE.md、CLAUDE.local.md、auto memory 文件,选中就能直接在编辑器里打开。这个面板里也能一键开关 auto memory。
auto memory 的文件是本地存储的,不会跨机器同步,换一台电脑或者在云端跑,memory 要重新积累。
另外 memory 目录是按项目路径存的,如果你把项目文件夹改了名或者挪了位置,Claude 会把它当成一个新项目,之前积累的 memory 就找不到了。
我个人觉得这套机制挺有用,它能帮你积累那些自己都没意识到的习惯,比如某个项目的特定测试命令、某个库的坑点等。隔一段时间 /memory 看看,你会发现 Claude 记下的东西比你想象的多。
常用斜杠命令
进入 Claude Code 之后,几个斜杠命令值得记一下。
/model 查看和切换当前使用的模型。上下方向键切换模型,默认会根据你的订阅计划自动选,一般是 Sonnet 4.6 或 Opus 4.7。
左右方向键调整推理强度 (reasoning effort),也就是模型在给答案前思考的深度,共 low / medium / high / xhigh / max 五档。强度越高效果越好,但速度更慢、token 消耗更多。
/clear 清除当前上下文,重新开始一轮新对话。做完一个任务换下一个时一定要 /clear,否则旧上下文堆着会干扰 Claude 的判断,还白白消耗 token。
/compact 手动压缩当前对话。上下文快满时 Claude 会自动压缩,你也可以主动触发。可以加参数指导它侧重保留什么,比如 /compact 侧重 API 改动相关的部分,但它只是影响摘要的侧重点,不能精确裁剪。
/status 打开设置面板,查看版本、模型、账号和连接状态,最常用的是确认 Anthropic base URL 是不是对的。
/init 生成项目的 CLAUDE.md,前面已经介绍过。
/simplify 让 Claude 审查你最近改动过的文件,从代码复用、质量和效率三个角度找问题并自动修复。可以加参数指定侧重方向,比如 /simplify 重点看内存效率。写完一段代码之后跑一下,相当于让 Claude 帮你做一轮 code review 加自动重构。
/insights 生成一份当前项目的使用报告,分析你和 Claude 的交互模式、常碰到的摩擦点、项目里哪些区域改动最多。适合隔一段时间跑一次,帮你发现自己没注意到的工作习惯。
在输入框里用 @ 可以引用具体文件,比如 @src/auth.ts 让 Claude 直接读这个文件的内容,比让它自己搜快得多,也更准。
要输入一段比较长的 prompt 时,按 Ctrl + G 可以把当前输入的内容丢到你的默认编辑器里打开,编辑完保存关闭,内容会回填到 Claude Code 的输入框。在终端里直接打字编辑比较别扭,长 prompt、粘贴大段日志、写复杂的计划时都用得上。
回溯与中断
Esc 打断
Claude 正在执行的时候,按一下 Esc 能立刻叫停它,上下文保留着,你可以马上纠正方向:
我:重构这个模块
Claude:<开始读一堆文件...>
我:<按 Esc>
我:先别动 tests/ 目录下的内容,只重构 src/
这个操作用得非常多。Claude 跑偏了千万别干等,直接打断改方向。
撤销到之前的对话
按两下 Esc(或者输入 /rewind)会打开撤销菜单,列出之前所有的检查点(checkpoint)。checkpoint 是 Claude Code 在本地自动保存的对话状态和文件快照 ,选中某个检查点,对话会退回到那个时刻,Claude 之前改过的代码文件也会一起自动撤销,不用你手动 git checkout。
每次你提交一条 prompt 都会自动存一个 checkpoint,相当于一张安全网,这几种场景特别好用:
- Claude 改了一半你觉得方向不对,直接回到改动前的代码。
- 对话上下文越来越乱,想退到某个还清爽的时刻重新开始。
- 尝试了一个风险较大的改法,效果不好想完全撤销。
有两个坑要注意:
- checkpoint 只追踪 Claude 通过 Edit / Write 工具直接改的文件 。如果 Claude 是执行
rm、mv这种 bash 命令改的,不在追踪范围内,也就没法 rewind 回来。 - checkpoint 不是 git 的替代品。默认保留 30 天左右就会清理,关键代码还是要靠版本控制。
恢复历史会话
关掉终端、电脑重启、第二天接着干活,会话不会丢。Claude Code 自动保存每个会话的记录:
# 继续当前目录下最近一次会话
claude --continue
# 从最近的会话列表里挑一个
claude --resume
注意 --continue 只认当前目录下最近的那次会话。如果你到了别的项目目录下跑这条命令,它不会把你带回「上次那个项目」。
多任务并行时,用 /rename 命令给会话起个描述性的名字,比如 oauth-migration 或 debug-memory-leak,之后 --resume 时就能一眼找到想要的那个。
我的习惯是把每个待办事项当成一个独立会话跑,像 git 分支一样管理,不同任务的上下文互不污染,切回来继续也没有额外心智成本