Claude Code -3 记忆系统完全指南: CLAUDE.md 从入门到实战

174 阅读13分钟

Claude Code 记忆系统完全指南: CLAUDE.md 从入门到实战

为什么你的 Claude Code 总是"失忆"?因为你没用好 CLAUDE.md。4 层记忆体系 + 实战创建流程,一篇文章讲透。

前言

用 Claude Code 最头疼的事是什么?每次开新会话都要重新解释项目。

"我们用的是 Monorepo 架构"、"后端用 NestJS 11"、"前端状态管理用 MobX 双轨架构"……这些话你说了多少遍?

CLAUDE.md 就是解决这个问题的。它是 Claude Code 的项目记忆文件,每次会话启动时自动读取,一次编写、永久生效。

这篇文章会讲清楚三件事:记忆体系的 4 层架构、好的 vs 差的 CLAUDE.md、如何从零创建一个 CLAUDE.md。

一、记忆系统全景图

Claude Code 的记忆不是"一个文件",而是 4 层由远及近的记忆栈。每一层解决不同维度的问题,叠加生效。

核心规则:

  • 加载顺序:从第 1 层到第 4 层依次叠加
  • 冲突时:越具体的层级优先级越高
  • 所有层级同时生效,不是覆盖关系

自动读取机制

触发时机:

  • 会话开始时:每次启动 Claude Code,自动加载第 1-3 层
  • 持续积累:Claude 在工作过程中自动维护第 4 层

企业级记忆(第 0 层):

部分企业环境还有更高优先级的企业级记忆,由 IT 管理员统一管控:

表格

系统文件位置
macOS/Library/Application Support/ClaudeCode/CLAUDE.md
Linux/WSL/etc/claude-code/CLAUDE.md
WindowsC:\ProgramData\ClaudeCode\CLAUDE.md

用于企业标准、安全策略、合规要求,优先级最高。

二、4 层记忆逐层详解

第 1 层:全局 CLAUDE.md

位置:~/.claude/CLAUDE.md

适合放"不管在哪个项目,我都希望 Claude 这样做"的规则:

# 全局开发偏好

## 语言设置
- 默认使用中文回答
- 代码注释使用英文

## 编码风格
- 使用 2 空格缩进
- 优先使用 const,let 只在需要重新赋值时使用
- 字符串优先使用单引号

第 2 层:项目 CLAUDE.md

位置:项目根目录 ./CLAUDE.md

这是 4 层中最重要的一个,也是日常维护的重点。项目专属信息、团队共享、提交到 Git。后面会用完整案例详细讲。

第 3 层:CLAUDE.local.md

位置:项目根目录 ./CLAUDE.local.md

和项目 CLAUDE.md 同步加载,但 只在你本地生效,绝不提交 Git。

和第 1 层全局 CLAUDE.md 的关键区别:

表格

全局 CLAUDE.md(第 1 层)CLAUDE.local.md(第 3 层)
位置~/.claude/CLAUDE.md项目根目录 ./CLAUDE.local.md
作用范围所有项目仅当前项目
跟随关系跟人走跟项目走(但只在你本地)
典型场景"我所有项目都用中文回答""这个项目用中文,那个项目用英文"

典型用法:

# Local Preferences

## 环境
- Node 版本:v22.x(nvm use 22)
- 本地 Redis 端口:6380(非默认的 6379)
- 调试时连 dev 分支数据库

## 偏好
- 先给我方案再写代码
- 这个项目我不关心测试覆盖率,别提醒我
- 遇到 TypeScript 类型报错优先用 as 断言,别重构

什么时候用 CLAUDE.local.md 而不是改 CLAUDE.md?

  • 你的偏好和团队规范冲突(比如团队要求英文注释,你想用中文)
  • 你有本地环境特有的配置(比如你的数据库端口和别人不一样)
  • 你想让 Claude 在这个项目里改变行为,但不想影响团队其他人

⚠️ 确保 .gitignore 中包含 CLAUDE.local.md,避免个人偏好提交到仓库。

第 4 层:Auto Memory

位置:~/.claude/projects/<项目名>/memory/

Claude 自己记的笔记,自动维护,你不需要管:

~/.claude/projects/your-project/memory/
├── MEMORY.md              ← 索引文件,启动时加载前 200 行
├── debugging.md           ← Claude 记录的调试经验
├── patterns.md            ← Claude 发现的代码模式
└── api-conventions.md     ← Claude 总结的 API 约定

CLAUDE.md vs Auto Memory 的分工:

表格

CLAUDE.md(第 1-3 层)Auto Memory(第 4 层)
谁写的你写的Claude 自己写的
内容性质指令和规范经验和发现
提交 Git✅❌
共享范围团队共享个人专属
加载方式启动时全量加载启动时加载前 200 行
该写/记什么技术栈、规范、命令调试经验、踩过的坑、发现的特殊模式

你可以主动让 Claude 记住某件事:

记住:Prisma 的 BigInt 时间戳字段在 JSON 序列化时要用 .toString(),
否则前端拿到的会是科学计数法,数字精度丢失

Claude 会把这条信息写入 MEMORY.md,下次遇到类似问题自动回忆起来。

三、好的 vs 差的 CLAUDE.md

同样一个项目,CLAUDE.md 写成什么样,Claude 的表现天差地别。

❌ 差的 CLAUDE.md

# Blog Project
This is a full-stack blog. Use React and NestJS.
Write clean code and follow best practices.

问题在哪?

  • "full-stack blog"——Monorepo?多微服务?前端是 H5 还是 PC?
  • "Use React and NestJS"——React 18 还是 19?NestJS 10 还是 11?状态管理用什么?
  • "clean code"——你的 clean 和我的 clean 可能完全不同
  • "best practices"——Claude 自己就知道最佳实践,不需要你说这句废话

结果就是:Claude 只能靠猜,猜错了你再纠正,一来一回浪费大量时间。

✅ 好的 CLAUDE.md

CLAUDE.md 放的是 通用规则 + 高频规则——每次会话都用得到的信息。低频的、特定场景的规则拆到 rules/。

# Blog - 全栈博客平台

## 项目描述
Monorepo 单代码仓库多系统架构,前端 H5 移动端 + 后端多微服务 + 跨系统共享包。

## 核心技术栈
- 前端:React 19 + Vite + TypeScript + MobX + Ant Design Mobile
- 后端:NestJS 11 + Prisma ORM + Redis
- 构建工具:Turborepo

## 系统架构
- apps/web/ — 前端 H5 移动端
- services/auth-service/ — 认证授权服务
- services/backend/ — 主业务服务(文章、评论、用户)
- services/log-service/ — 日志服务
- packages/shared-logging/ — 跨系统共享包

## 常用命令
- 全项目开发:npm run dev(根目录)
- 前端单独开发:cd apps/web && npm run dev
- 单个后端服务:cd services/auth-service && npm run start:dev
- 全项目构建:npm run build

## 通用编码规范(前后端高频规则)
- 前端页面 5 文件拆分:index / useStore / handle / constant / types
- 状态管理用 MobX 双轨架构 + useObserver Hook
- 后端接口统一响应格式
- 共享包禁止包含业务逻辑
- 导入排序:第三方库 → @/ 别名 → 相对路径
- 禁止使用 any,用 unknown 替代
- 异步操作必须处理错误,禁止空 catch

## 验证流程
1. 在修改的子项目目录执行 npm run lint
2. 前端目录:npx tsc --noEmit
3. 参照 .claude/commands/review.md 自我审计

## 规范入口
- 通用规则:.claude/rules/typescript-common.md、security-common.md
- 前端特有:.claude/rules/frontend-components.md
- 后端特有:.claude/skills/nestjs-backend-developer/

关键点:CLAUDE.md 里只放"每次会话都需要的信息"。  具体来说:

表格

放进 CLAUDE.md ✅不放进 CLAUDE.md ❌
技术栈和版本号具体某个 API 的字段设计
项目结构和职责边界某个模块的详细实现逻辑
高频编码规范(每次写代码都会用到的)低频规范(只在特定场景用到的)
常用命令(dev/build/test/lint)一次性操作命令(数据库迁移、部署)
验证流程详细的 debug 步骤
规范文件的入口引用规范文件的完整内容

低频规则不是不重要,而是应该放在 rules/ 里按需加载,避免每次会话都占上下文。

CLAUDE.md 不是越多越好。  它的内容会占用每次会话的上下文窗口,写太多反而降低 Claude 对每条规则的遵循度。一条规则如果连续三次会话都没被触发,大概率不该放在这里——移到 rules/ 按需加载更合适。

对比总结

表格

维度❌ 差的✅ 好的
项目描述"全栈博客""Monorepo 多系统架构,H5 + 微服务 + 共享包"
技术栈"React + NestJS""React 19 + MobX + NestJS 11 + Prisma"
架构信息没有5 个系统目录和职责边界
编码规范"写干净的代码"通用高频规则 + 规范入口引用
常用命令没有全项目 / 前端 / 后端分开列出
验证流程没有lint → tsc → self-review
内容策略不知道该写什么不该写什么只放通用+高频,低频拆到 rules/
效果Claude 不断追问Claude 上手就能干活

四、进阶用法

进阶一:.claude/rules/ 模块化规则

当 CLAUDE.md 开始变臃肿,可以按文件类型或关注点拆分规则:

.claude/rules/
├── typescript-common.md        ← TypeScript 通用规范(前后端共用)
├── security-common.md          ← 安全规范(前后端共用)
├── code-format-common.md       ← 代码格式规范
├── project-behavior.md         ← 全局行为规范
└── frontend-components.md      ← 前端组件开发规范

每个规则文件可以通过 frontmatter 指定作用范围:

---
globs: ["apps/web/src/ **/*.tsx", "apps/web/src/** /*.ts"]
---
# 前端组件开发规范
- 页面 5 文件拆分:index / useStore / handle / constant / types
- 公共组件放在 src/components/,用 PascalCase 命名
- 样式使用 SCSS + CSS Modules,禁止全局样式污染

这份规则只在 Claude 操作匹配 apps/web/src/ **/*.tsx 的文件时才加载。

进阶二:项目记忆标准化

踩坑记录不要散落在各处,统一维护在一个文件中:

## 项目记忆规则

当用户说"添加到项目记忆",将踩坑教训写入 `.claude/project-memory.md`:

---
## 问题标题(一句话概括)

### 错误场景
什么场景下遇到这个错误

### 错误现象
具体遇到了什么问题

### 原因分析
分析错误原因

### 正确解决方法
正确的代码/配置/操作步骤

### 记录信息
**记录日期 **: YYYY-MM-DD
**错误原因 **: 一句话概括根本原因
---

这比 Auto Memory 更可控——你来决定什么值得记,格式统一方便回溯。

五、如何创建 CLAUDE.md——AI 扫描 + 人工调优

核心思路

不要从零手写。** 让 AI 先扫描项目生成初版,再人工精调。** 这样既能快速起步,又能确保内容准确。

第一步:用 /init 自动生成初版

cd your-project
claude
> /init

Claude Code 会自动读取项目结构、package.json、配置文件等,生成一份 CLAUDE.md 初版。

第二步:用 AI 深度扫描补充

/init 生成的初版通常比较粗略。用以下提示词让 Claude 做更深入的扫描:

请深度分析这个项目,帮我完善 CLAUDE.md。具体需要:

1. 扫描项目结构,列出核心目录及其作用
2. 从 package.json 提取技术栈和关键依赖版本
3. 从 tsconfig/eslint/prettier 配置提取编码规范
4. 从现有代码中总结项目特有的编码模式(如 API 返回格式、组件声明方式)
5. 提取所有可用的 npm scripts 及其用途

注意:
- 只写"每次会话都需要的信息"
- 不要写太细的实现细节
- 控制在 100-150 行以内

第三步:人工精调(和 AI 反复调试)

初版生成后,** 不是改完就完事了,而是要和 AI 反复调试 **——在实际使用中发现 CLAUDE.md 哪里没写清楚、哪里写了废话、哪里 Claude 还是会犯错,然后持续修正。

典型的调试循环:

使用 Claude Code 做开发
    ↓
Claude 犯错或反复追问同一个问题
    ↓
反思:CLAUDE.md 里缺了什么?或者写了什么没用的?
    ↓
修改 CLAUDE.md
    ↓
重新验证,看 Claude 是否还会犯同样的错
    ↓
重复以上过程

经过几轮调试后,你会发现这些常见问题:

表格

常见问题修正方式
技术栈描述过于笼统补充具体版本号(如 "React 19" 而非 "React")
编码规范写了 "遵循最佳实践"替换为具体规则(如 "5 文件拆分模式")
遗漏了非 obvious 的项目约定手动补充(如 "共享包禁止包含业务逻辑")
Claude 反复追问同一个问题说明 CLAUDE.md 里缺了这条信息,补上
Claude 总是做某件你不想它做的事加一条明确的禁止规则
包含了频繁变动的内容删除,这些在会话中说就行
行数超过 150 行拆分到 rules/

CLAUDE.md 是用出来的,不是写出来的。  每次你和 Claude "磨合"后发现的问题,都是完善它的机会。

完整案例:从零到成品

以一个 Monorepo 全栈博客项目 为例,看完整创建过程。

Step 1:/init 生成的初版

# Blog Project

## Commands
- `npm run dev` - Start development
- `npm run build` - Build for production
- `npm run lint` - Run linting

## Structure
- apps/ - Applications
- services/ - Backend services
- packages/ - Shared packages

典型的"有总比没有好"但远远不够的初版。

Step 2:AI 深度扫描后

# Blog - 全栈博客平台

## 项目描述
Monorepo 单代码仓库多系统架构,前端 H5 移动端 + 后端多微服务 + 跨系统共享包。

## 核心技术栈
- 前端:React 19.2.3 + TypeScript 5.5.3 + Vite 7.3.1 + MobX 6.13.5 + Ant Design Mobile 5.42.3
- 后端:NestJS 11.0.1 + TypeScript 5.7.3 + Prisma ORM 6.4.1
- 共享包:纯 TypeScript 库
- 构建工具:Turborepo 2.4.2

## 系统架构与职责边界
| 系统 | 目录 | 职责范围 | 技术栈 |
|------|------|---------|--------|
| web | apps/web/ | H5 移动端应用 | React 19 + MobX |
| auth-service | services/auth-service/ | 认证授权服务 | NestJS 11 |
| backend | services/backend/ | 主业务服务 | NestJS 11 + Prisma |
| log-service | services/log-service/ | 日志服务 | NestJS 11 |
| shared-logging | packages/shared-logging/ | 统一日志格式 | TypeScript |

## 服务间依赖
web → auth-service ←→ backend ←→ log-service
                              ↓
                    shared-logging(共享包)

## 常用命令
### 根项目
- 全项目构建:npm run build
- 并行开发所有服务:npm run dev
- 全项目检查:npm run lint

### 前端(apps/web/ 目录下)
- 开发:npm run dev
- 构建:npm run build
- 类型检查:npx tsc --noEmit
- 各环境:npm run test-dev / sit-dev / prd-dev

### 后端(进入对应服务目录执行)
- auth-service:npm run start:dev
- backend:npm run start:dev
- log-service:npm run start:dev

## 编码规范
- 前端页面 5 文件拆分:index / useStore / handle / constant / types
- MobX 双轨架构 + useObserver Hook
- 导入规范:@/ 别名 + 统一导入排序
- 共享包纯技术库,不包含业务逻辑
- 跨系统修改提交:feat(auth+web): 描述

## 验证流程
1. 在修改的子项目目录执行 npm run lint
2. 前端目录:npx tsc --noEmit
3. 参照 .claude/commands/review.md 自我审计

Step 3:人工精调后的最终版

在 AI 扫描版基础上,你需要手动补充的内容:

## 踩坑记录(AI 不可能知道,必须你写)
- Prisma BigInt 时间戳在 JSON 序列化时要用 .toString(),
  否则前端拿到的会是科学计数法,数字精度丢失
- auth-service 的 Token 刷新接口走的是 /auth/refresh 不是 /auth/token/refresh,
  别搞混
- shared-logging 修改后必须同步重新构建所有依赖它的服务,
  否则运行时拿到的还是旧版本

关键点:AI 扫描能覆盖"项目长什么样",但"哪里有坑"只有你知道。

六、.claude/ 内部访问逻辑速查

了解各目录的访问时机,才知道该把规则放哪里:

表格

目录访问时机作用
settings.json / settings.local.json启动时权限控制、环境变量、默认模型
rules/任务执行过程中,相关操作触发时编码规范按需注入上下文
skills/显式调用或满足触发条件时复杂自动化流程的 SOP
agents/使用 @agent-name 切换身份时定义特定角色的 Persona
commands/输入 /命令名 时快捷操作触发

七、本篇小结

三个核心收获:

**第一 **,CLAUDE.md 是 Claude Code 的"项目交接文档"。每次会话自动加载,让 Claude 打开项目就知道该怎么干活。一次编写、永久生效。

**第二 **,记忆系统有四个层级——全局、项目、本地、自动记忆——它们叠加生效,冲突时越具体的层级优先级越高。日常重点维护项目 CLAUDE.md 和 CLAUDE.local.md,其他按需使用。

**第三 **,控制在 100-150 行以内,只写"每次会话都需要的信息"。太模糊的不写("写干净的代码"),太详细的不写(拆到 rules/ 用引用),频繁变动的不写(在会话中说就行)。

创建方法:/init 生成初版 → AI 深度扫描补充 → 人工精调踩坑记录。AI 能覆盖"项目长什么样",但"哪里有坑"只有你知道。

如果这篇文章对你有帮助,欢迎点赞收藏 ❤️ 有问题评论区见~