Claude Code的"记忆"远不止一个CLAUDE.md文件。它拥有六层分层记忆架构——从全局用户偏好到项目指令、从目录级规则到会话自动记忆,每一层都承载不同粒度的上下文。本教程将带你逐层拆解这套架构,通过一个真实项目实战,掌握从~/.claude/全局配置到.claude/项目目录、从CLAUDE.md到rules/、从settings.json权限到自动记忆的完整上下文工程链路。
适用人群:已安装Claude Code并完成至少一次对话的开发者,希望系统化理解和管理Claude Code的上下文行为。
| 条件 | 说明 |
|---|---|
| Claude Code | 已通过npm install -g @anthropic-ai/claude-code安装 |
| Node.js ≥ 18 | Claude Code运行环境 |
| 一个真实项目 | 任何有3个以上源文件的项目均可(本文用Node.js项目演示) |
| 基础命令行知识 | 能使用ls、cat、mkdir等命令 |
# 验证Claude Code已安装
claude --version
# 预期输出:claude-code/x.x.x (或类似版本号)
Claude Code的上下文不是"一坨文本",而是一个精心设计的分层系统。Anthropic官方将其描述为"naively dropped into context"(直接注入上下文窗口),但实际使用中,理解每一层的加载优先级和作用范围至关重要。
graph TB
subgraph "Claude Code 六层记忆架构"
L1["第1层: 全局 ~/.claude/CLAUDE.md<br/>跨项目用户偏好"]
L2["第2层: 项目根 ./CLAUDE.md<br/>项目级指令"]
L3["第3层: 目录级 ./src/CLAUDE.md<br/>子目录特定规则"]
L4["第4层: .claude/rules/*.md<br/>模块化规则文件"]
L5["第5层: 会话记忆<br/>auto-memory自动摘要"]
L6["第6层: 跨工具共享记忆<br/>AGENTS.md / GEMINI.md"]
end
L1 --> L2 --> L3
L2 --> L4
L3 --> L5
L4 --> L5
L5 --> L6
style L1 fill:#e8f5e9
style L2 fill:#e3f2fd
style L3 fill:#fff3e0
style L4 fill:#fce4ec
style L5 fill:#f3e5f5
style L6 fill:#e0f7fa
加载顺序:Claude Code在每次会话启动时,按全局 → 项目 → 目录的层级读取CLAUDE.md,同时加载.claude/rules/下的所有规则文件。会话记忆在对话过程中动态写入,跨工具记忆则兼容Cursor、Copilot等多AI工具。
~/.claude/
├── CLAUDE.md # 全局用户偏好(所有项目生效)
├── settings.json # 全局权限与MCP配置
├── credentials.json # 认证信息(不要手动编辑)
├── statsig/ # 遥测数据
├── projects/ # 每个项目的工作记忆
│ └── -home-user-myproject/
│ └── CLAUDE.md # 项目特定会话记忆
├── skills/ # 全局Skills
├── commands/ # 全局自定义命令
└── memory/ # 跨会话记忆存储
全局CLAUDE.md定义你的个人编码风格和跨项目通用偏好:
# 创建或编辑全局CLAUDE.md
cat > ~/.claude/CLAUDE.md << 'EOF'
# Global Preferences
## Language & Style
- 默认使用中文回复,代码注释可用英文
- 回复简洁明了,避免冗长解释
## Code Style
- 使用TypeScript strict模式
- 优先函数式编程,避免不必要的class
- 变量命名用camelCase,文件名用kebab-case
- 所有函数必须有返回类型注解
## Testing
- 新功能必须包含单元测试
- 使用vitest作为测试框架
- 测试文件命名: *.test.ts
## Git
- commit message使用conventional commits格式
- 不要自动commit,只在明确要求时执行
- 不要自动git add
EOF
关键原则:全局CLAUDE.md应该只放真正的跨项目偏好。项目特定的架构决策、依赖版本、API约定应该放在项目级CLAUDE.md中。
~/.claude/settings.json控制Claude Code的行为权限:
{
"permissions": {
"allow": [
"Bash(npm test)",
"Bash(npm run lint)",
"Bash(npx tsc --noEmit)",
"Read",
"Glob",
"Grep"
],
"deny": [
"Bash(rm -rf *)",
"Bash(curl * | bash)",
"Bash(npm publish)"
]
},
"autoCompact": true,
"compactThreshold": 80000
}
allow数组中的工具调用将自动执行,不再弹出确认;deny数组中的操作会被直接拒绝。autoCompact启用上下文自动压缩,compactThreshold设置触发压缩的token阈值。
# 进入你的项目目录
cd ~/my-project
# 使用Claude Code内置的/init命令生成CLAUDE.md
claude
# 在Claude Code交互界面中输入:
> /init
/init命令会自动扫描项目结构、读取package.json/tsconfig.json等配置文件,生成一份初始CLAUDE.md。这是起点而非终点——你需要根据实际需求持续迭代。
一份好的项目CLAUDE.md应该回答四个问题:这个项目是什么?怎么跑?怎么测?有什么约定?
# MyProject - E-Commerce API
## 项目概述
Node.js + Fastify + PostgreSQL的电商后端API服务。
使用TypeScript严格模式,遵循分层架构。
## 技术栈
- Runtime: Node.js 22
- Framework: Fastify 5.x
- ORM: Drizzle ORM
- Database: PostgreSQL 16
- Testing: Vitest + Supertest
## 项目结构
src/ ├── routes/ # API路由定义 ├── services/ # 业务逻辑层 ├── repositories/ # 数据访问层 ├── middleware/ # 中间件 ├── schemas/ # 请求/响应验证schema └── utils/ # 工具函数
## 常用命令
- `npm run dev` — 启动开发服务器(端口3000)
- `npm test` — 运行全部测试
- `npm run test:watch` — 监听模式运行测试
- `npm run db:migrate` — 执行数据库迁移
- `npm run db:seed` — 填充测试数据
## 编码约定
- 所有API路由必须有对应的schema验证
- Service层不直接依赖Fastify实例
- 错误处理使用AppError类,不要throw原生Error
- 数据库查询在repository层完成,service层不写SQL
- 日志使用Fastify内置logger,不用console.log
## 禁止事项
- 不要修改migrations目录中已有的迁移文件
- 不要在routes层写业务逻辑
- 不要引入新的ORM(统一使用Drizzle)
当一个项目足够复杂时,你可以在子目录放置CLAUDE.md,为该目录下的文件提供特定上下文:
# 为数据库层提供额外上下文
cat > src/repositories/CLAUDE.md << 'EOF'
## Repository层规则
- 所有查询使用Drizzle query builder
- 复杂查询(JOIN超过3张表)必须写注释说明
- 分页查询统一使用paginate()工具函数
- 不要使用raw SQL,除非性能要求极高且有注释说明
- 每个Repository类必须有对应的interface
EOF
# 为测试目录提供上下文
cat > src/__tests__/CLAUDE.md << 'EOF'
## 测试规则
- 使用describe/it结构组织测试
- 每个测试文件对应一个源文件
- 测试数据使用factory函数生成,不要硬编码
- 集成测试使用testcontainers启动PostgreSQL
- Mock只在外部服务边界使用,不要mock内部模块
EOF
加载机制:当Claude Code读取src/repositories/user.repo.ts时,会同时加载项目根CLAUDE.md和src/repositories/CLAUDE.md,两层指令合并生效。
当CLAUDE.md变得过长时,.claude/rules/目录提供了模块化拆分的方案:
# 创建rules目录
mkdir -p .claude/rules
# API设计规则
cat > .claude/rules/api-design.md << 'EOF'
---
description: Rules for API endpoint design
globs: ["src/routes/**"]
All API endpoints must:
1. Define request/response schemas using TypeBox
2. Use proper HTTP status codes (201 for creation, 204 for deletion)
3. Include authentication middleware for protected routes
4. Return consistent error format: { error: string, code: string, details?: any }
5. Support pagination for list endpoints with ?page&limit query params
EOF
# 数据库规则
cat > .claude/rules/database.md << 'EOF'
---
description: Database and migration rules
globs: ["src/repositories/**", "drizzle/**"]
Database conventions:
- All tables must have: id (uuid), created_at, updated_at columns
- Use UUID v7 for primary keys
- Soft delete using deleted_at column, never hard delete
- Index all foreign key columns
- Migration files are immutable once merged to main
EOF
# 安全规则
cat > .claude/rules/security.md << 'EOF'
---
description: Security best practices
globs: ["src/**"]
Security requirements:
- Never log sensitive data (passwords, tokens, PII)
- Use parameterized queries only (Drizzle handles this)
- Validate all input at route layer
- Hash passwords with bcrypt (cost factor 12)
- JWT tokens expire in 15 minutes, refresh tokens in 7 days
EOF
注意每个规则文件顶部的---区域:
---
description: 规则描述(必填)
globs: ["匹配的文件路径模式"]
---
这意味着当Claude Code编辑src/routes/users.ts时,只会加载api-design.md和security.md,而不会加载database.md——精确控制上下文窗口消耗。
Claude Code在对话过程中会自动写入会话记忆。当你完成一个复杂任务后,Claude Code会在后台生成摘要,存储到~/.claude/projects/目录下:
# 查看自动记忆存储位置
ls ~/.claude/projects/
# 典型路径结构:
# ~/.claude/projects/-home-user-myproject/CLAUDE.md
# 在Claude Code会话中,使用/memory命令管理记忆
> /memory
# 查看当前项目记忆内容
# 你可以编辑、删除或添加记忆条目
你也可以直接编辑记忆文件来添加长期生效的知识:
# 编辑项目记忆
vim ~/.claude/projects/-home-user-myproject/CLAUDE.md
## 项目记忆 (Auto-generated + Manual)
### 已解决的问题
- 2026-05-20: Drizzle ORM的joins语法在v0.38有变化,使用db.select().from(a).leftJoin(b, eq(a.id, b.aId))
- 2026-05-22: Fastify 5的schema验证必须在route options中定义,不能单独.register
### 架构决策
- 选择Drizzle而非Prisma,因为更好的类型推断和性能
- 使用plugin模式组织路由,每个domain一个plugin
### 已知的坑
- PostgreSQL的JSONB查询需要显式类型转换
- testcontainers启动慢,CI中需要30秒预热
Claude Code的上下文窗口是有限资源。当对话过长时,性能会下降。以下是管理策略:
graph LR
A[会话开始] --> B{上下文是否充足?}
B -->|是| C[正常对话]
B -->|否| D[自动压缩<br/>autoCompact]
D --> E[保留关键信息<br/>丢弃历史细节]
E --> C
C --> F{任务完成?}
F -->|否| B
F -->|是| G[重要知识写入<br/>项目记忆]
style D fill:#fff3e0
style G fill:#e8f5e9
实操建议:
| 策略 | 操作 | 效果 |
|---|---|---|
| 启用自动压缩 | settings.json中设autoCompact: true |
上下文过长时自动摘要 |
| 控制CLAUDE.md长度 | 项目CLAUDE.md控制在100行以内 | 减少每次加载的token |
| 使用rules分片 | 将规则拆到.claude/rules/ |
只加载相关规则 |
| 及时开新会话 | 复杂任务拆成多个会话 | 避免上下文污染 |
| 写入项目记忆 | 完成后总结关键知识 | 跨会话持久化 |
现代开发团队可能同时使用Claude Code、Cursor、GitHub Copilot等多个AI工具。通过在项目根目录放置多个配置文件,可以让所有工具共享核心上下文:
my-project/
├── CLAUDE.md # Claude Code专用(最丰富)
├── AGENTS.md # GitHub Copilot / Codex
├── .cursorrules # Cursor(或.cursor/rules/)
├── GEMINI.md # Gemini CLI
├── .windsurfrules # Windsurf
└── .github/copilot-instructions.md # GitHub Copilot另一种方式
维护多个文件容易不同步。推荐策略是以CLAUDE.md为主源,其他文件通过符号链接或引用指向它:
# 方案1:符号链接(最简单)
ln -s CLAUDE.md AGENTS.md
ln -s CLAUDE.md .cursorrules
# 方案2:精简版(推荐)
# AGENTS.md只保留跨工具通用的部分
cat > AGENTS.md << 'EOF'
# Shared AI Instructions
> Full project instructions in CLAUDE.md
## Code Style
- TypeScript strict mode
- Functional style preferred
- camelCase for variables, kebab-case for files
## Testing
- Vitest for unit tests
- All new features require tests
## Architecture
- Layered: routes → services → repositories
- See CLAUDE.md for complete details
EOF
现在让我们将六层记忆架构整合到一个完整的实战案例中。假设我们有一个电商API项目需要从零配置Claude Code的上下文系统。
mkdir ~/shop-api && cd ~/shop-api
npm init -y
npm install fastify drizzle-orm pg
npm install -D typescript vitest @types/pg drizzle-kit
# 创建.claude目录结构
mkdir -p .claude/rules
mkdir -p src/routes
mkdir -p src/services
mkdir -p src/repositories
mkdir -p src/__tests__
claude
# 在交互界面中输入:
> /init
# Claude Code会自动分析package.json和项目结构
将自动生成的CLAUDE.md优化为以下内容:
# ShopAPI - 电商后端服务
## 一句话概述
Fastify + Drizzle ORM + PostgreSQL的RESTful电商API。
## 开发命令
- `npm run dev` — 开发服务器 localhost:3000
- `npm test` — 运行所有测试
- `npm run db:push` — 推送schema到数据库
- `npm run db:studio` — 打开Drizzle Studio
## 架构
严格三层架构:Routes → Services → Repositories
- Routes:HTTP处理、请求验证、响应格式化
- Services:业务逻辑、事务编排
- Repositories:数据库CRUD、SQL查询
## 编码规范
- 所有async函数必须处理错误(try/catch或Result类型)
- Repository方法返回`Promise<T[]>`而非`Promise<any>`
- 禁止在Service层直接import数据库实例
- 路由使用Fastify plugin模式注册
## 禁止
- 不要生成mock数据文件到src/目录
- 不要引入class-validator(使用TypeBox)
- 不要在routes中写SQL
cat > .claude/routes-rules.md << 'RULES'
---
description: Route layer conventions
globs: ["src/routes/**"]
---
## Route Rules
- Every route file exports a FastifyPluginAsync
- Use shorthand methods: app.get(), app.post(), etc.
- Schema validation with TypeBox in route options
- Error responses use reply.code().send() pattern
- Group related routes in one file (e.g., users.ts has GET/POST/PUT/DELETE /users)
RULES
cat > .claude/testing-rules.md << 'RULES'
---
description: Testing conventions
globs: ["src/__tests__/**", "**/*.test.ts"]
---
## Test Rules
- Use describe/it structure with meaningful descriptions
- Integration tests start with "should" verbs
- Factory functions for test data in helpers/test-factories.ts
- Each test file is independent (no shared mutable state)
- Use beforeAll for database setup, afterAll for cleanup
RULES
注意:上面的规则文件也可以放在.claude/rules/目录下(推荐做法)。
# 启动Claude Code
claude
# 测试上下文加载
> 你知道这个项目的技术栈和架构吗?
# 预期:Claude Code会准确描述Fastify + Drizzle + PostgreSQL三层架构
# 测试规则生效
> 帮我在src/routes/products.ts创建一个GET /products路由
# 预期:生成的代码会遵循以下规则:
# 1. 使用FastifyPluginAsync导出
# 2. 包含TypeBox schema验证
# 3. 调用Service层而非直接查数据库
# 4. 使用app.get()简写形式
在使用过程中持续迭代:
graph TD
A[使用Claude Code开发] --> B{AI生成代码<br/>是否符合预期?}
B -->|是| C[继续开发]
B -->|否| D[分析偏差原因]
D --> E{是CLAUDE.md<br/>缺少信息吗?}
E -->|是| F[补充到CLAUDE.md<br/>或rules/]
E -->|否| G{是规则不够<br/>具体吗?}
G -->|是| H[细化规则描述<br/>添加示例]
G -->|否| I[考虑是否需要<br/>会话记忆补充]
F --> C
H --> C
I --> J[写入项目记忆<br/>~/.claude/projects/]
J --> C
style F fill:#e3f2fd
style H fill:#fff3e0
style J fill:#e8f5e9
实战完成后的完整目录结构:
.claude/
├── rules/ # 模块化规则
│ ├── api-design.md # API设计规则
│ ├── database.md # 数据库规则
│ ├── security.md # 安全规则
│ ├── routes-rules.md # 路由层规则
│ └── testing-rules.md # 测试规则
├── settings.json # 项目级权限配置
├── commands/ # 自定义斜杠命令
│ └── debug.md # /debug 命令
└── skills/ # 项目级Skills
~/.claude/
├── CLAUDE.md # 全局偏好
├── settings.json # 全局权限
├── projects/
│ └── -home-user-shop-api/
│ └── CLAUDE.md # 项目会话记忆
└── skills/ # 全局Skills
项目根目录:
shop-api/
├── CLAUDE.md # 项目主指令
├── AGENTS.md # 跨工具共享
├── .claude/ # Claude Code配置目录
├── src/
│ ├── CLAUDE.md # src级通用规则
│ ├── routes/
│ │ └── CLAUDE.md # 路由层特定规则
│ ├── services/
│ │ └── CLAUDE.md # 服务层特定规则
│ ├── repositories/
│ │ └── CLAUDE.md # 仓储层特定规则
│ └── __tests__/
│ └── CLAUDE.md # 测试规则
├── package.json
└── tsconfig.json
原因:通常是CLAUDE.md内容过于宽泛。例如"写好代码"这种指令没有可操作性。
解决:用具体的、可验证的规则替代抽象原则。
# ❌ 无效写法
写干净的代码,遵循最佳实践。
# ✅ 有效写法
- 所有函数必须有返回类型注解
- 函数体不超过30行,超过则拆分
- 错误使用AppError类,不要throw new Error()
- 禁止使用any类型
解决方案:
1. 启用autoCompact(在settings.json中)
2. 将CLAUDE.md精简到100行以内
3. 将详细规则移到.claude/rules/并设置globs,只在使用相关文件时加载
4. 复杂任务拆分成多个会话
优先级规则:项目级覆盖全局级。如果全局说"用jest",项目说"用vitest",Claude Code会遵循vitest。
建议:全局CLAUDE.md只放真正跨项目的偏好(语言、回复风格),项目特定的技术选型全部放在项目CLAUDE.md中。
检查项:
1. frontmatter格式正确(三个短横线包围)
2. globs模式使用相对于项目根的路径
3. 文件扩展名.md正确
# ✅ 正确格式
---
description: Route conventions
globs: ["src/routes/**"]
---
# ❌ 错误格式(缺少---)
description: Route conventions
globs: ["src/routes/**"]
推荐策略: - 单一源策略:以CLAUDE.md为唯一真实源,AGENTS.md等文件用符号链接 - 分层策略:CLAUDE.md包含完整指令,AGENTS.md包含精简版通用部分 - CI校验:在CI中添加检查,确保AGENTS.md的关键内容与CLAUDE.md一致
| 层级 | 文件位置 | 作用范围 | 最佳用途 |
|---|---|---|---|
| L1 全局 | ~/.claude/CLAUDE.md |
所有项目 | 个人编码风格、语言偏好 |
| L2 项目 | ./CLAUDE.md |
当前项目 | 技术栈、架构、命令、约定 |
| L3 目录 | ./src/**/CLAUDE.md |
子目录 | 层级特定规则(如测试约定) |
| L4 规则 | .claude/rules/*.md |
按globs匹配 | 模块化细粒度规则 |
| L5 会话 | ~/.claude/projects/ |
跨会话 | 已解决问题、架构决策 |
| L6 跨工具 | AGENTS.md / .cursorrules |
多AI工具 | 通用指令共享 |
| 维度 | 说明 |
|---|---|
| 适合训练营类型 | AI辅助开发训练营、DevOps效率训练营、团队工程规范训练营 |
| 预计教学时长 | 2-3小时(含动手练习) |
| 难度等级 | 中级(需要Claude Code基础使用经验) |
| 前置课程 | Claude Code入门安装教程 |
| 后续课程 | Skill开发实战、MCP服务器开发、自动化Hooks |
| 实操比例 | 70%实操 + 30%理论 |
| 团队适配性 | 高 — CLAUDE.md和rules可以作为团队代码规范的AI强制层 |
[!tip] 51学通信知识星球 星主:爱卫生(微信:gprshome201101)——公众号「51学通信」创办者,19 年通信行业运维与讲师经验,著有《GPRS网络信令实例详解》《EPC原理与实践》《5G核心网原理与实践》三本纸质书(各大电商平台有售)。 星球定位:深耕 5G 核心网、IMS、NFV/AI、云原生等 ICT 领域,主打运维岗位与信令分析。 当前规模:5200 篇主题 / 990 个回答,198 元/年。 加入福利:加入星球后请加爱卫生微信,拉您进知识星球年度陪伴与答疑群——不限量回复您的各种问题,另有群内分享。 AI 加持:51学通信知识星球已作为 skill 接入 WorkBuddy,使用 deepseek-4-flash 在海量星球帖子中精准找贴、找视频、找 FAQ 和案例,做总结、找文档和 PPT 等场景全覆盖。
