斜杠命令完全参考:内置命令 + Bundled Skills 的全部用法
第四十一章:CLAUDE.md 工程化:项目规范、记忆系统与 Agent 指令设计
41.1 CLAUDE.md 的本质:不只是说明文档
每次你在终端输入 claude 启动 Claude Code,它做的第一件事不是等待你的输入,而是寻找并读取 CLAUDE.md 文件。这个文件决定了 Claude 在这个项目中的行为方式、技术偏好、禁止操作和工作风格。
CLAUDE.md 不是给人类读者准备的 README,而是专门为 AI Agent 设计的运行时指令文档。它的内容直接注入到每次会话的系统提示中,影响 Claude 的每一个决策。
这种设计产生了一个非常重要的结果:你可以把团队对代码质量、架构风格和工作流程的所有共识,编码进这个文件,让 Claude 的行为自动符合团队规范。
CLAUDE.md 的加载机制
Claude Code 按照以下优先级查找和加载 CLAUDE.md:
加载顺序(从高到低优先级):
1. ~/.claude/CLAUDE.md —— 用户全局配置(个人偏好)
2. <项目根目录>/CLAUDE.md —— 项目根级配置(主要配置)
3. <当前子目录>/CLAUDE.md —— 子目录局部配置(模块专属规则)
当你在 src/backend/ 目录下工作时,Claude 会同时读取根目录和 src/backend/ 下的 CLAUDE.md,并将两者合并。这让你可以在 monorepo 中为每个子包设置独立规则,同时保持全局规范。
全局配置 ~/.claude/CLAUDE.md 适合放个人工作偏好,例如代码风格倾向、常用工具链、个人 API 密钥规则。项目级 CLAUDE.md 适合放团队共享的项目规范,应该提交到版本控制。
文件大小与性能的权衡
CLAUDE.md 的内容被加载到上下文窗口中。过长的 CLAUDE.md 会占用宝贵的 token 空间,在长对话中可能导致重要信息被截断。
实践经验表明,项目级 CLAUDE.md 的合理长度是 200-500 行。超过这个范围,考虑使用 @import 机制将内容拆分到专项文件中(详见 41.3 节)。
41.2 CLAUDE.md 的结构化设计
一个高质量的 CLAUDE.md 不是随意堆砌的笔记,而是有清晰结构的工程文档。以下是一个经过实践验证的结构模板:
# 项目名称 —— Claude 工作指南
## 项目概述
[项目一句话描述、技术栈、架构风格]
## 快速上下文
[让 Claude 快速理解项目状态的关键信息]
## 技术规范
### 语言与框架
### 代码风格
### 测试要求
## 工作流程
### 开发流程
### 提交规范
### Review 标准
## 关键约束
### 禁止操作
### 安全规则
## 常用命令
[项目特定的 npm/make/cargo 命令]
## 架构指南
[核心模块说明、重要数据流]
下面用一个真实的 TypeScript 全栈项目展示完整填充后的效果:
# YiteAI Tools —— Claude 工作指南
## 项目概述
基于 Next.js 14 App Router 的 SaaS 工具集合平台。
技术栈:TypeScript + Next.js + Prisma + PostgreSQL + Tailwind CSS
架构:monorepo(pnpm workspaces),apps/web + packages/ui + packages/db
## 快速上下文
- 主要业务逻辑在 apps/web/src/app/(App Router)
- 数据库模型在 packages/db/schema.prisma
- 共享 UI 组件在 packages/ui/src/components/
- 环境变量模板在 .env.example,实际值在 .env.local(不提交)
## 技术规范
### 代码风格
- TypeScript strict mode,所有函数必须有明确返回类型
- 使用 Zod 做运行时类型验证,尤其是 API 输入
- Server Actions 优先于 API Routes(减少网络往返)
- 组件文件名用 PascalCase,工具函数文件名用 camelCase
### 错误处理
- 服务端使用 Result<T, E> 模式,不抛裸 Error
- 客户端使用 React Error Boundary + toast 通知用户
- 所有数据库操作必须在 try/catch 中,记录 structured log
### 测试要求
- 纯函数必须有单元测试(Vitest)
- API Routes 必须有集成测试
- 覆盖率目标:语句 80%,分支 70%
## 工作流程
### 提交规范
遵循 Conventional Commits:
- feat: 新功能
- fix: 修复 bug
- refactor: 重构(无功能变化)
- test: 测试相关
- docs: 文档
禁止 `git commit -m "update"` 等无意义提交信息
### 禁止操作
- 不得直接修改 packages/db/migrations/(只通过 prisma migrate dev)
- 不得在组件中直接调用 fetch,必须通过 Server Actions 或 hooks
- 不得在 .env.local 中硬编码生产密钥
- 不得使用 any 类型,除非有注释说明原因
## 常用命令
\`\`\`bash
pnpm dev # 启动开发服务器
pnpm build # 生产构建
pnpm test # 运行测试
pnpm db:push # 推送 schema 变更(开发环境)
pnpm db:migrate # 生成迁移文件
pnpm lint # ESLint + Prettier 检查
\`\`\`
## 架构注意事项
- 认证使用 NextAuth v5,session 在 middleware 中验证
- 文件上传使用 UploadThing,大文件分片
- 邮件发送使用 Resend,模板在 packages/emails/
- 支付走 Stripe Webhooks,事件处理在 app/api/webhooks/stripe/
这个示例展示了 CLAUDE.md 的几个关键要素:它告诉 Claude 在哪里找东西、用什么模式做事、什么是被禁止的。有了这些信息,Claude 在修改代码时能主动遵守规范,而不需要你每次都重复说明。
41.3 @import 语法:模块化管理记忆
当项目复杂度增加,单一 CLAUDE.md 文件会变得难以维护。Claude Code 提供了 @import 语法,允许你将不同主题的内容拆分到独立文件中:
# 主 CLAUDE.md
## 核心规范
@import docs/claude/tech-stack.md
@import docs/claude/code-style.md
## 工作流程
@import docs/claude/workflow.md
## 架构文档
@import docs/claude/architecture.md
@import 的路径是相对于当前 CLAUDE.md 文件的位置。被导入的文件内容会在加载时展开,对 Claude 来说和直接写在 CLAUDE.md 里效果相同。
@import 的设计哲学
@import 的核心价值不只是拆分文件,而是按需加载。你可以这样设计:
项目根目录/
├── CLAUDE.md # 主入口,只导入核心内容
└── docs/
└── claude/
├── tech-stack.md # 技术栈详解(始终导入)
├── api-design.md # API 设计规范(API 工作时导入)
├── db-patterns.md # 数据库模式(数据库工作时导入)
├── frontend-rules.md # 前端规范(前端工作时导入)
└── security.md # 安全规则(始终导入)
主 CLAUDE.md 始终导入核心必要内容,子目录的 CLAUDE.md 导入模块专属内容:
# src/api/CLAUDE.md
(此目录的 API 开发规范)
@import ../../docs/claude/api-design.md
@import ../../docs/claude/security.md
## 本目录专属规则
- 所有端点必须在 openapi.yaml 中记录
- 响应格式统一使用 { data, error, meta } 结构
动态上下文注入
@import 最强大的用法之一是导入自动生成的文件。例如,你可以在 CI 中生成一个列出当前 API 端点的文档,然后在 CLAUDE.md 中导入它:
## 当前 API 状态
@import .claude/generated/api-endpoints.md
配合一个小脚本,每次构建后自动更新这个文件,就实现了"Claude 始终了解当前 API 全貌"的效果。
41.4 记忆系统的三种类型
在使用 Claude Code 的过程中,"记忆"这个概念有三个完全不同的含义,混淆它们会导致很多困惑:
类型一:上下文记忆(Context Memory)
这是 Claude 在单次会话中能看到的所有内容:CLAUDE.md 的内容、当前对话历史、你读入的文件内容。这种记忆随会话结束而消失。
上下文记忆的容量是有限的(Claude 3.5 Sonnet 的上下文窗口约 200K tokens),但在窗口内它是完全可靠的——Claude 能精确引用任何位置的内容。
工程含义:CLAUDE.md 是把持久知识注入上下文记忆的主要机制。
类型二:文件记忆(File Memory)
当你让 Claude 把某个决策或发现写入文件时,这个信息就持久化了。下次会话中,你或 Claude 可以重新读取这个文件,把信息带回上下文。
Claude Code 的 Read, Write, Edit 工具赋予了 Claude 直接操作文件系统的能力,使得"写入文件 = 创建持久记忆"成为可能。
工程实践:在项目中创建 .claude/memory/ 目录,专门存放 Claude 生成的记忆文件:
.claude/
├── memory/
│ ├── architecture-decisions.md # 架构决策记录
│ ├── known-issues.md # 已知问题和临时解决方案
│ ├── session-notes.md # 跨会话的工作笔记
│ └── investigation-log.md # 调查过的问题记录
└── settings.json # Claude Code 配置
在 CLAUDE.md 中导入这些记忆文件,确保每次会话都能读取历史信息:
## 项目记忆
@import .claude/memory/architecture-decisions.md
@import .claude/memory/known-issues.md
类型三:训练记忆(Training Memory)
这是 Claude 模型在预训练阶段获得的知识——关于编程语言、框架、算法、最佳实践的通用知识。这种记忆不受 CLAUDE.md 影响,是恒定的背景知识。
工程含义:不需要在 CLAUDE.md 中解释 Python 的语法或 React 的工作原理,Claude 已经知道了。CLAUDE.md 应该专注于项目特有的信息,训练记忆中没有的内容。
三种记忆的协同
训练记忆(模型权重)
↓ 提供通用技术知识
上下文记忆(CLAUDE.md + 对话)
↓ 提供项目规范和当前任务
文件记忆(.claude/memory/)
↓ 提供历史决策和积累知识
─────────────────────────────
Claude 的实际行为 = 三层记忆的综合
41.5 Agent 指令设计原则
CLAUDE.md 的核心是"Agent 指令"——你希望 Claude 遵循的行为规范。写好这些指令需要理解 AI Agent 的工作方式。
原则一:具体优于抽象
差的指令:
写高质量的代码。
好的指令:
每个函数不超过 40 行;提取超过 3 次的重复代码为工具函数;
复杂逻辑必须有行内注释说明 "为什么"(不是 "是什么")。
抽象指令对 Claude 来说信息量接近零。Claude 对"高质量"的理解可能和你完全不同。具体指令消除了歧义,直接约束了行为。
原则二:禁止操作比允许操作更重要
Claude 会尽力完成任务,有时它认为合理的做法恰好是你不想要的。明确列出禁止操作,可以防止 Claude 在不理解业务背景的情况下做出错误决策:
## 禁止操作(Claude 不得执行以下行为)
- 不得删除或重命名现有数据库列(只能添加新列)
- 不得修改 packages/contracts/ 中的接口定义(这是外部 API 契约)
- 不得在未运行测试的情况下提交代码
- 不得使用 console.log 做生产日志(必须用 logger 模块)
- 不得向外部 URL 发送用户数据,包括日志服务
原则三:提供判断标准,而非仅列规则
规则无法覆盖所有情况。更好的方式是给 Claude 提供做判断的框架:
## 变更影响评估
在做任何代码变更前,评估以下维度:
1. 是否影响数据库 Schema?如果是,需要迁移文件
2. 是否影响外部 API 接口?如果是,需要版本协商
3. 是否影响认证流程?如果是,需要安全审查
4. 是否影响性能关键路径?如果是,需要性能测试
如果对以上任何一点不确定,先询问,不要假设。
原则四:写明 Claude 应该主动做什么
CLAUDE.md 不只是约束,也可以是赋能——告诉 Claude 它有权主动执行哪些操作:
## Claude 的主动权限
Claude 可以在以下情况下主动执行,无需询问:
- 修复 ESLint/TypeScript 报错
- 添加 JSDoc 注释到缺少文档的导出函数
- 将重复代码提取为工具函数(如果被使用超过 3 次)
- 更新快照测试(运行 `pnpm test --updateSnapshot`)
Claude 必须在以下情况下先询问,不得主动执行:
- 修改数据库 Schema
- 更改 API 端点路径或请求格式
- 升级主要依赖版本
- 删除文件或大段代码
这种区分让 Claude 能够高效自主地处理低风险操作,同时在高风险操作上保持谨慎。
41.6 多 CLAUDE.md 的 Monorepo 策略
在包含多个子项目的 Monorepo 中,CLAUDE.md 的层级设计尤为重要:
monorepo/
├── CLAUDE.md # 全局规范:git 工作流、提交规范、全局禁止操作
├── apps/
│ ├── web/
│ │ └── CLAUDE.md # Next.js 前端规范:组件风格、状态管理
│ └── api/
│ └── CLAUDE.md # FastAPI 后端规范:端点设计、错误处理
└── packages/
├── ui/
│ └── CLAUDE.md # 组件库规范:设计系统、无障碍要求
└── shared/
└── CLAUDE.md # 共享工具库规范:纯函数要求、无副作用
全局 CLAUDE.md 应包含:
- Monorepo 整体架构概述
- 跨包的依赖规则(不允许循环依赖)
- 统一的提交和 PR 规范
- 全局安全规则
子目录 CLAUDE.md 应包含:
- 该子项目的技术栈特定规范
- 该目录的架构模式
- 该模块的测试策略
41.7 CLAUDE.md 的版本控制最佳实践
CLAUDE.md 应该像代码一样被认真对待:
提交规范
# 使用专门的 commit 类型标识 CLAUDE.md 变更
git commit -m "claude: add API versioning guidelines to CLAUDE.md"
git commit -m "claude: update forbidden operations list"
git commit -m "claude: import new architecture decision record"
Code Review
CLAUDE.md 的变更应该经过团队 Review,因为它直接影响所有成员使用 Claude Code 的体验。特别注意:
- 新增禁止操作是否有充分理由
- 新增的规范是否足够具体可执行
- 导入的文件是否存在且内容正确
迭代改进
CLAUDE.md 不是一次写完的,而是在使用中持续迭代的:
发现问题 → 分析根因(是 Claude 不知道规则,还是规则本身不够清晰)
↓
更新 CLAUDE.md → 在下次会话中验证效果
↓
观察 Claude 是否自动遵守 → 如果没有,继续细化规则
保持一个 CLAUDE.md.changelog 或在文件头部记录变更历史,有助于理解规则演变:
<!-- CHANGELOG
2024-03-15: 添加 Zod 验证要求(因为 Claude 生成了未验证的 API 输入处理代码)
2024-03-22: 细化禁止操作列表(增加数据库迁移规则)
2024-04-01: 导入架构决策文档
-->
小结
CLAUDE.md 是 Claude Code 工程化使用的核心杠杆点。一个精心设计的 CLAUDE.md 能将 Claude 从一个"聪明的通用助手"变成"深度了解你项目的专业队友"。
关键要点:
- CLAUDE.md 是 Agent 的运行时指令,应该包含项目特有的、训练记忆中没有的信息
@import语法支持模块化管理,适合复杂项目- 三种记忆类型(上下文、文件、训练)需要协同设计
- 指令设计要具体、要列明禁止操作、要给出判断框架、要赋予主动权限
- Monorepo 中使用层级 CLAUDE.md 管理全局和局部规范
- CLAUDE.md 应纳入版本控制,像代码一样认真对待和迭代