我的 CLAUDE.md 里都放了什么
最讽刺的事情是什么? 你一边抱怨"每次新会话都要重新跟 Claude 解释项目背景", 一边项目根目录里根本没有 CLAUDE.md。
别笑, 我之前就是这个状态。
后来发现有个偷懒的办法——直接跑 /init。Claude 会自动分析你的项目结构、检测构建工具和测试框架, 生成一份初始的 CLAUDE.md。如果已经有 CLAUDE.md 了, /init 不会覆盖, 而是建议改进。
CLAUDE.md 的本质
Claude Code 启动的时候会自动读这个文件, 把它当作用来理解项目的起点。你项目怎么跑测试、目录结构是什么、有哪些不能碰的约定——写进去, 它自己就知道了。
第一类: 命令
最常见的用法——把命令写进去, 省得每次说:
## Commands
- 测试: npm test
- 构建: npm run build
- 单文件测试: npx jest src/xxx.test.ts
- Lint: npx eslint src/
有了这些, Claude 自己知道该跑什么, 不用你再说"跑一下测试"。
第二类: 架构约定
有些东西 Claude 看代码看不出来:
## Architecture
- 状态管理用 Zustand, 不用 Redux
- API 请求统一走 src/api/ 下的封装
- 不要直接改 src/core/ 里的文件, 只能通过扩展接口
第三类: 团队规范
Linter 管不了, 但 review 的时候一定会被说的:
## 规范
- 组件文件用 PascalCase 命名
- 每个组件都要有单元测试
- 不许硬编码字符串, 所有文案走 i18n
不该放什么
CLAUDE.md 最常见的毛病就是太长。当真正有用的指令被大量废话淹没, 模型会把它们一视同仁, 约等于没有。
- 个性设定——“你是一个资深软件工程师"这种东西系统 prompt 已经覆盖了
- 所有人都知道的通用规范
- 猜测性的规则——等 Claude 真犯错了再加, 不要预判
我的做法是: 刚开始只写最必要的几行, 用一段时间, 等 Claude 在某个地方犯了错, 加一条规则进去。犯错一次加一条, 这样 CLAUDE.md 里全是"有用的"规则, 没有一条是废话。
另外我自己的经验是, CLAUDE.md 不要超过 200 行。太长的话 Claude 会忽略其中一半。如果你确实有大量规则要写, 拆分方案:
.claude/rules/目录: 按路径范围拆。比如rules/api-design.md设定paths: ["src/api/**/*.ts"]。Claude 只有读到对应路径的文件时才会加载这个规则, 不占用全局上下文- Skill 文件: 不常用的参考材料放到 skill 里, 按需加载, 不在每次会话里都占用上下文
@导入: CLAUDE.md 可以引用其他文件, 用@README.md或@docs/guide.md的方式导入
还有两个文件也是 CLAUDE.md
CLAUDE.local.md
项目根目录下还可以放一个 CLAUDE.local.md, 这是你个人的项目配置, 不提交到 git。适合放你自己的沙箱地址、测试账号这类东西。
用户级 CLAUDE.md
~/.claude/CLAUDE.md 是对所有项目生效的个人偏好。适合放你个人的代码风格偏好、通用工作流规则。
再进一步: 权限管理
除了 CLAUDE.md, Claude Code 还有 settings.json 来控制 agent 能做什么。
三种权限规则:
- allow: 直接做, 不用问我
- ask: 每次要我做主
- deny: 禁止
我自己的配置是 deny 一切, 然后慢慢放开:
{
"permissions": {
"default": "deny",
"allow": ["read", "edit", "search"],
"deny": ["run:curl", "run:wget"]
}
}
默认禁止网络请求推荐大家都做——你不会希望 Claude 自己去下载不明来路的包来装。
Hook 是更细粒度的控制, 可以在 agent 的每个操作前后触发: 允许、警告、或者直接拦。适合对安全性要求高的场景。
Auto Memory: Claude 自己记笔记
CLAUDE.md 是你手写的规则。Claude Code 还有一个叫 Auto Memory 的功能——Claude 自己会记笔记。
你纠正它的东西、你项目里的构建命令、调试经验——Claude 会自己写到 ~/.claude/projects/<项目>/memory/ 里, 下次会话自动读回来。你什么都不用写。
运行 /memory 可以查看它记了什么, 也可以手动编辑或删除。文件就是普通的 markdown, 随便改。