第 02 章

Memory 与 CLAUDE.md

把团队规则和项目约束沉淀为稳定的"长期上下文"

不再每次重复说明 — 让 Claude 记住你的规则

重复的说明

你有没有发现,每次打开 Claude Code 都要从头解释一遍项目规则?

昨天说过的规则

你明确告诉过 Claude:"这个项目用 TypeScript 严格模式,API 响应统一用 { code, data, message } 格式"。今天新开一个会话,它全忘了。

团队成员的困扰

每个人跟 Claude 解释的项目规则版本不同。A 说的命名规范是 camelCase,B 说是 snake_case。Claude 听谁的?

散落各处的约定

编码规范在 Slack 里,Git 工作流在 Notion 里,API 标准在某个人的脑子里。Claude 哪个都看不到。

Memory 就是为这个设计的:把"长期约束"写进 CLAUDE.md,Claude 在每次会话中自动加载。一次写好,全团队共享,随代码一起版本化管理。

三种写入方式

往 Memory 里写规则,你有三个入口

1. /init — 初始化项目规则

Claude 根据当前项目自动生成 CLAUDE.md,包含项目概览、开发规范、常用命令等骨架。

$ /init

2. # 快速追加

在输入框前加 #,一句话追加规则。适合在开发过程中随时记录发现。

# 这个项目始终使用 TypeScript 严格模式
# 提交前必须运行 npm test

3. /memory — 分层编辑

打开记忆编辑器,在项目级、用户级、目录级之间切换管理。适合整理和维护规则。

$ /memory
推荐节奏:先用 /init 生成骨架,开发中用 # 随时追加,定期用 /memory 整理。

用 /init 起步

30 秒生成你的第一个 CLAUDE.md

在项目根目录打开 Claude Code,输入:

$ /init

Claude 会扫描项目结构,生成类似这样的文件:

# 项目配置

## 项目概览
- **名称**:电商平台
- **技术栈**:Node.js、PostgreSQL、React 18、Docker
- **团队规模**:5 名开发者

## 开发规范
### 代码风格
- 使用 Prettier 格式化
- 使用带 airbnb 配置的 ESLint
- 最大行长度:100 字符
- 使用 2 空格缩进

### 命名规范
- **文件**:kebab-case(`user-controller.js`)
- **类**:PascalCase(`UserService`)
- **函数/变量**:camelCase(`getUserById`)
- **数据库表**:snake_case(`user_accounts`)

## 常用命令
| 命令 | 作用 |
|------|------|
| `npm run dev` | 启动开发服务器 |
| `npm test` | 运行测试套件 |
| `npm run lint` | 检查代码风格 |
生成之后别直接用。Claude 生成的骨架只是起点——你需要根据团队实际情况修改和完善。接下来我们学怎么写好规则。

好规则与坏规则

写得太模糊

# 项目配置
写好代码,注意质量。
前后端都要测试。
API 要设计好。

"写好代码"——什么叫好?Claude 没法执行。

具体可验证

# 编码规范
- 使用 TypeScript 严格模式(noImplicitAny: true)
- 每次提交前运行 npm test,全部通过才能提交
- API 响应统一使用 { code, data, message } 格式
- 数据库字段使用 snake_case,代码使用 camelCase

每条都能用命令检查,没有歧义。

写法四原则:具体(有技术名词和数值)、可验证(能用命令检查)、可执行(Claude 知道怎么做)、无矛盾(规则之间不冲突)。

七层作用域

规则写在哪,决定它影响谁、优先级多高

层级文件位置影响范围典型内容
组织策略 企业管理员配置 整个组织 合规要求、安全红线、统一流程
项目记忆 ./CLAUDE.md 单个项目 架构、编码标准、Git 工作流
项目规则 .claude/rules/*.md 单个项目 模块化的项目约定(可拆分多文件)
用户记忆 ~/.claude/CLAUDE.md 单个用户 个人偏好、默认设置
用户规则 ~/.claude/rules/*.md 单个用户 个人规则模块(跨项目通用)
本地记忆 .claude/local/CLAUDE.md 本机 机器相关设置(不进 Git)
Auto Memory 自动生成 会话级 Claude 自动捕获的偏好与模式
优先级从高到低:组织策略 > 项目记忆/规则 > 用户记忆/规则 > 本地记忆 > Auto Memory。子目录中的 CLAUDE.md 会覆盖项目根目录的规则。

举个例子:项目规则说"用 Jest 测试",但你个人偏好 Vitest。在项目目录下工作时,Claude 会遵循项目规则用 Jest——这才是正确的行为。

项目级记忆

放在 ./CLAUDE.md,随代码一起版本管理

项目级记忆是最常用的层级。它解决的核心问题是:让所有人在同一个项目上获得一致的 Claude 行为。

# 项目配置

## 开发规范
### Git 工作流
- 分支命名:`feature/description` 或 `fix/description`
- 提交信息:遵循 conventional commits
- 合并前必须有 PR
- 所有 CI/CD 检查都必须通过
- 至少需要 1 个 approval

### 测试要求
- 最低 80% 代码覆盖率
- 所有关键路径都必须有测试
- 单元测试使用 Jest
- E2E 测试使用 Cypress

### API 规范
- 只允许 RESTful 端点
- API 版本路径:`/api/v1/`
- 请求/响应都使用 JSON
- 正确使用 HTTP 状态码
最佳实践:把 CLAUDE.md 纳入 Git 仓库。这样团队规则随代码一起演进,PR review 时也能看到规则的变更。可以用 @docs/architecture.md 引用外部文档,避免把所有内容堆进一个文件。

模块化规则

用 .claude/rules/*.md 把规则拆成多个文件

当项目规则越来越多,一个 CLAUDE.md 会变得臃肿。Claude Code 支持把规则拆成独立的 Markdown 文件,放在 .claude/rules/ 目录下。

.claude/
├── rules/
│   ├── typescript.md      ← TypeScript 编码规范
│   ├── testing.md         ← 测试策略和要求
│   ├── api-design.md      ← API 设计标准
│   └── git-workflow.md    ← Git 工作流规则

每个规则文件可以用 YAML frontmatter 加上描述,帮助 Claude 判断何时加载:

---
description: TypeScript 编码规范
---

# TypeScript 规范
- 使用严格模式(noImplicitAny: true)
- 优先使用 interface 而非 type
- 所有公共函数必须有返回类型标注
同样的机制也适用于个人规则:把跨项目通用的个人规则放在 ~/.claude/rules/*.md。比如"始终使用中文回复"、"优先使用函数式写法"等。

目录级覆盖

子目录里的 CLAUDE.md 可以覆盖上级规则

project/
├── CLAUDE.md                ← 项目级:通用编码规范
├── src/
│   ├── CLAUDE.md            ← 源码级:组件结构规范
│   └── api/
│       └── CLAUDE.md        ← API 模块:接口专属规范

当你在 src/api/ 目录下工作时,Claude 会同时加载三层规则,API 模块的局部规则优先于项目通用规则:

# 文件:src/api/CLAUDE.md

## API 专属规范
### 请求校验
- 使用 Zod 做 schema 校验
- 校验失败时返回 400
- 提供字段级别的错误详情

### 认证
- 所有端点都需要 JWT token
- token 放在 Authorization header 中
- token 24 小时后过期

### 响应格式
所有响应必须遵循:
{ "success": true, "data": {...}, "timestamp": "...", "version": "1.0" }

### 分页
- 使用基于 cursor 的分页,而不是 offset
- 单页最大数量限制为 100

个人偏好

写在 ~/.claude/CLAUDE.md,只影响你自己

用户级记忆适合放那些不影响团队、只和你的工作习惯有关的规则:

# 我的开发偏好

## 关于我
- **经验水平**:8 年全栈开发经验
- **偏好语言**:TypeScript、Python
- **沟通风格**:直接,最好带例子
- **学习风格**:配合代码的可视化图示

## 代码偏好
### 错误处理
我偏好显式的错误处理,使用 try-catch 和有意义的错误消息。

### 注释
注释应解释"为什么",而不是"是什么"。
代码本身应该尽量能自解释。

### 测试
我偏好 TDD(测试驱动开发)。
先写测试,再写实现。

## 调试偏好
- 使用带前缀的 console.log:[DEBUG]
- 日志里始终带时间戳
安装方式:把模板复制到 ~/.claude/CLAUDE.md 即可。之后你在任何项目里打开 Claude Code,它都会读取你的个人偏好。

安装与验证

三种安装方式与三步验证流程

手动安装命令

# 设置项目记忆
cp project-CLAUDE.md CLAUDE.md

# 设置个人记忆
cp personal-CLAUDE.md ~/.claude/CLAUDE.md

# 设置目录级记忆
cp directory-api-CLAUDE.md src/api/CLAUDE.md

三步验证安装

  1. 重新打开 Claude Code 会话,确保配置被重新加载
  2. 检查加载:观察会话启动时 CLAUDE.md 是否被自动加载(Claude 会提示)
  3. 测试规则:用一条明显会受 memory 影响的提示词测试,验证规则是否生效

CLAUDE.md 模板文件 (点击文件名查看内容)

02-memory/
├── directory-api-CLAUDE.md
├── personal-CLAUDE.md
└── project-CLAUDE.md
推荐:优先使用 /init 自动生成,手动 cp 适合模板化部署到多个项目。用 # 快速追加适合开发中随时记录。

本地记忆

写在 .claude/local/CLAUDE.md,只在这台机器上生效

有些规则和具体机器有关,但不应进入 Git——比如你的本地数据库端口、调试用的特殊路径、临时的工作笔记。本地记忆就是为这些场景设计的。

# 本地开发环境配置

## 数据库
- 本地 PostgreSQL 端口:5433(非默认)
- 调试数据库:debug_local

## 临时配置
- 当前正在重构 auth 模块,允许跳过类型检查
- 本地测试时使用 mock 数据,不要连接真实 API
这个文件不会被提交到 Git。.claude/local/ 目录应该在 .gitignore 中排除。它的内容只影响你自己在这台机器上的工作。

Auto Memory

Claude 在对话中自动捕获你的偏好和行为模式

Auto Memory 和前面那些"你手动写规则"的记忆层级不同——它是Claude 主动学习你习惯的机制。在对话过程中,Claude 会注意到:

Claude 会记住什么

  • 你反复做的纠正("别用 var,用 const")
  • 你的代码风格偏好(函数式 vs 面向对象)
  • 你的框架选择(React 而不是 Vue)
  • 你的沟通方式偏好(简洁 vs 详细)

工作方式

  1. 你在对话中表达了偏好或做了纠正
  2. Claude 识别到这是一个值得记住的模式
  3. 自动保存到对应的记忆文件中
  4. 后续会话中自动生效,无需重复说明
不需要手动配置。Auto Memory 在后台工作,你只管正常对话和纠正 Claude 的行为。它会逐渐学会你的习惯。

Auto 进阶

Auto Memory 的目录查找、自定义路径与启停控制

Claude 会根据当前工作目录、父目录和已配置路径,逐层查找相关记忆文件:

project/
├── CLAUDE.md                  ← 项目级:通用编码规范
├── src/
│   ├── CLAUDE.md              ← 源码级:组件结构规范
│   └── api/
│       └── CLAUDE.md          ← API 模块:接口专属规范

自定义 auto memory 目录

如果默认目录不适合你的项目结构,可以在设置中指定新的 memory 路径,让 Claude 从自定义位置加载规则。

启用 / 禁用 auto memory

你可以在当前会话中禁用 auto memory(临时关闭自动加载),也可以显式开启它。适合调试或需要干净上下文的场景。

协作与隔离

worktree 共享、Subagent 隔离与 symlink 复用

worktree 与仓库共享

在 worktree、monorepo 或多人协作场景中,auto memory 帮助保持规则一致。所有工作树共享同一套项目记忆,不会因为分支切换丢失约束。

Subagent 记忆隔离

Subagents 拥有独立的记忆范围。主 agent 的项目规则不会自动泄漏给 subagent,确保各执行者只在各自职责内保持一致性。

symlink 复用:你可以用子目录和符号链接(symlink)把局部规则复用到多个项目区域。例如把 rules/api-standards.md 软链接到 src/api/CLAUDE.md,一次维护、多处生效。

规则加载机制

所有记忆文件在会话开始时自动查找并加载

你不需要手动告诉 Claude 去读哪个 CLAUDE.md。Claude Code 会在会话启动时自动完成以下查找:

查找过程

  1. 从当前目录开始,检查有没有 CLAUDE.md
  2. 向上逐层查找父目录的 CLAUDE.md
  3. 同时检查用户级 ~/.claude/CLAUDE.md
  4. 加载 .claude/rules/*.md 和 ~/.claude/rules/*.md
  5. 加载所有找到的规则,按优先级合并

排除不需要的规则

如果某些 CLAUDE.md 不应该被自动加载,可以在设置中通过 claudeMdExcludes 排除特定路径:

{
  "claudeMdExcludes": [
    "legacy/CLAUDE.md",
    "vendor/**/CLAUDE.md"
  ]
}
也可以用 --add-dir 把额外目录加入 Claude 的可见范围,适合 monorepo 或跨项目协作场景。

作为底座

Memory 为 Slash Commands、Skills、Subagents 提供统一约束

Memory

底座约束
定义"应该怎样"

Commands

流程入口
定义"做什么"

Skills

能力包
定义"怎么做"

Subagents

执行者
定义"谁来做"

当你执行一条 Slash Command 或调用一个 Skill 时,Memory 中定义的编码规范、测试要求、API 格式等规则会自动被继承。

举个例子:你在 CLAUDE.md 里写了"使用 TypeScript 严格模式"。之后无论你用哪个命令生成代码,Claude 都会遵循这个约束——不需要在每个命令里重复声明。

定位:Memory 不替代流程。它是为所有流程提供统一约束的"底座"。

常见错误

写得太宽

"写好代码" — 无法验证,等于没写。

修复:改成"使用 TypeScript 严格模式,noImplicitAny: true"。

写得太细

把整个 README 复制进去 — 浪费 token,噪声太大,Claude 反而更难找到关键规则。

修复:只保留影响 Claude 行为的约束。在 CLAUDE.md 中用 @docs/api-standards.md 引用外部文档,Claude 需要时会去读原文,而不是全文粘贴。

规则冲突

项目级写"用 Jest",目录级写"用 Vitest",Claude 不知道听谁的。

修复:确保目录级规则是项目级的补充而非矛盾。如果确实要覆盖,在目录级规则中明确说明"替代项目级中的 XXX 规则"。

写入密钥

把 API key 或数据库密码写进 CLAUDE.md — 这个文件会进 Git!

修复:绝对不要写密钥。用环境变量和 .env 文件管理敏感信息。

过期规则

项目已经迁移到 Vite,规则还在说 Webpack。

修复:把 CLAUDE.md 当代码一样维护。技术栈变更时同步更新规则。

记忆维护

把 CLAUDE.md 当代码一样维护——它也需要重构

何时更新

  • 技术栈变更时(如 Webpack → Vite)同步更新规则
  • 团队编码规范调整时,更新项目记忆
  • 发现 Claude 反复犯同一类错误时,追加约束
  • 规则过期或矛盾时,立即清理

会话中更新

你可以在对话中直接要求 Claude 更新记忆:

记住:所有新组件优先使用 React hooks,
不用 class components。

→ Claude:我会把它加入记忆。
        写入哪个文件?
        1. 项目记忆(./CLAUDE.md)
        2. 个人记忆(~/.claude/CLAUDE.md)
定期整理:每月花 10 分钟检查一遍 CLAUDE.md。删掉过期的规则,合并重复的条目,确保每条规则仍然有效。

最佳实践

用好 Memory 的核心原则与常见陷阱

应该做的

  • 用项目记忆保存团队标准,确保所有人获得一致行为
  • 用目录记忆保存局部差异,不同模块可以有不同约束
  • 先写简洁规则,再根据实际需要逐步补充
  • 把可重复内容写进 CLAUDE.md,随代码一起版本管理

不应该做的

  • 不要把 README 整份复制进 CLAUDE.md
  • 不要把明显属于代码的实现细节硬塞进 memory
  • 不要让 memory 变成垃圾桶——过期、重复、矛盾的内容要及时清理
记忆管理建议:优先引用已有文档(用 @docs/xxx.md)而不是重复粘贴;只保留真正影响 Claude 行为的信息;定期整理过期或冲突的规则。

动手练习

为你当前正在做的项目,编写 5 条"可验证"的 CLAUDE.md 规则

任务:选择你正在做的项目,为它编写 5 条规则。写完后用下面的标准逐条检查。

评估标准

  • 每条规则是否具体——有没有具体的技术名词或数值
  • 每条规则是否可验证——能不能用命令检查
  • 规则之间是否无矛盾
  • 是否放在正确的作用域——项目记忆 vs 项目规则 vs 目录级 vs 用户级 vs 本地记忆
  • 是否需要拆成独立文件放入 .claude/rules/
提示:从"编码风格"、"Git 工作流"、"API 规范"、"测试要求"、"安全"五个维度各选一条。

参考答案

# 文件:CLAUDE.md

## 编码风格
- 使用 Java 21 record 类定义不可变 DTO
- 所有 public 方法必须添加 Javadoc 注释

## Git 工作流
- Commit 格式: type(scope): description(遵循 Conventional Commits)
- 提交前运行: mvn test,全部通过才能提交

## API 规范
- REST 端点路径使用复数名词:/api/users(不是 /api/user)
- 统一响应包装: ResponseEntity<Result<T>>

## 测试要求
- 新增代码的单元测试覆盖率不低于 80%
- 使用 @ParameterizedTest 测试边界条件

## 安全
- 禁止在代码和配置文件中硬编码任何密钥
- 所有外部输入必须校验后才能使用
对比检查:每条规则都含具体技术名词(Java 21、mvn test、80%),都可以用命令验证,彼此不矛盾。

本章结束

下一章:在 Memory 之上构建可复用的能力包

Slash Commands → Skills → Subagents → Hooks → Advanced →
核心理念:好的 Memory = 更稳定的输出 + 更少的重复解释 + 更一致的团队协作。它是所有高级功能的"底座"。

加载中…