# CLAUDE.md:这不是写给人看的文档,而是写给 AI 的上下文 ![Claude Code 系列文章封面:CLAUDE.md:这不是写给人看的文档,而是写给 AI 的上下文](../../../assets/claude-code-engineering/04-claude-md-project-memory-cover.png) **TL;DR:** `CLAUDE.md` 不是给人读的文档,是给模型读的工程规格。它控制 Claude Code 的行为边界,每次会话都被全量加载到上下文。写得好,省掉反复提醒;写得差,浪费 Token 还不生效。 ## CLAUDE.md 是工程规格,不是文档 大多数团队第一次写 `CLAUDE.md`,会本能地抄一段 README 进去——项目介绍、技术栈、团队使命。这些信息对人有用,对模型几乎没用。模型不关心你们的愿景,它关心的是:跑什么命令、改哪些文件、遵守什么边界、不能碰什么东西。 ![图解:CLAUDE.md 是工程规格,不是文档](imgs/04-claude-md-project-memory/01-overview-knowledge-map.svg) `CLAUDE.md` 的本质是一份**机器可读的行为规格**。它有以下工程属性: - **每次会话全量加载**:无论任务大小,CLAUDE.md 的全部内容都会被注入上下文。这意味着每一行都在持续消耗 Token 预算。 - **层级覆盖**:用户级 `~/.claude/CLAUDE.md` → 项目级 `./CLAUDE.md` → 子目录级 `subdir/CLAUDE.md`,后者覆盖前者。跨项目通用的偏好放用户级,项目特定的放项目级。 - **支持文件导入**:`@other-file.md` 语法可以把外部文件内容内联进来。适合拆分长规则到独立文件。 - **不是强制策略**:CLAUDE.md 是上下文,不是策略引擎。模型可能会忽略其中的规则。真正需要强制的安全边界要用 Hooks 实现(见第 22 篇)。 理解这一点很关键:**CLAUDE.md 里的规则是建议,不是约束**。你在里面写"不要改 .env",模型多数时候会遵守,但不是 100%。如果某条规则违反了就必须中断操作,那它属于 Hooks 的管辖范围。 一个常见的误解是:CLAUDE.md 写得越详细,Claude Code 就越听话。实际上,CLAUDE.md 的效果遵循一个倒 U 型曲线——太少的信息让模型无从遵循,太多的信息让模型失去焦点。最佳区间在 60 到 120 行之间。低于 60 行,缺少关键约束;超过 120 行,规则之间互相干扰,遵循率开始下降。后文的 Token 预算分析和失败案例会展开这个论点。 另一个误解是:CLAUDE.md 可以替代 README。不能。README 是给人看的,描述项目是什么、为什么这么做;CLAUDE.md 是给模型看的,描述怎么操作、不能做什么。一个好的检验标准:如果删掉 CLAUDE.md 里某段话,模型的行为是否会改变?如果不会,那段话就不该在那里。 ## 三个真实的 CLAUDE.md 不是模板,是实际在用的配置。三个项目,三种技术栈,三种关注点。 ### A. TypeScript API 服务 这个项目的核心需求是分层架构约束——Claude Code 必须知道每一层该干什么、不能干什么,否则它会在 route handler 里写业务逻辑。 ```markdown # CLAUDE.md ## Commands - Install: pnpm install - Dev: pnpm dev - Test: pnpm test (unit), pnpm test:e2e (integration) - Lint: pnpm lint - Typecheck: pnpm typecheck - DB migrate: pnpm prisma migrate dev ## Architecture - src/routes/ — Express route handlers, thin layer, delegate to services - src/services/ — Business logic, no HTTP imports - src/repositories/ — Database access only, no business logic - src/models/ — Prisma-generated types only, never edit manually - src/utils/ — Shared helpers, no side effects ## Rules - Routes MUST NOT contain business logic - Services MUST NOT import from express - Repositories are the only layer that touches prisma client - All new endpoints need integration tests in tests/e2e/ - Use zod for request validation, never trust req.body directly ## Safety - Do not edit prisma/schema.prisma without explicit approval - Do not modify migrations after they've been applied - Do not touch .env files - Do not run pnpm prisma migrate reset ## Testing - Run relevant unit tests after editing service files - Run integration tests after adding endpoints - Test command for single file: pnpm vitest run src/services/user.test.ts ``` 关键设计:Architecture 段落用一句话定义每个目录的职责和限制。Rules 用 MUST NOT 做硬边界声明。Testing 段落不只说"要测试",而是明确给出什么操作触发什么测试。 ### B. React 前端(Next.js) 前端项目的关注点不一样:组件复用、样式约束、路由结构、SSR 边界。 ```markdown # CLAUDE.md ## Commands - Install: pnpm install - Dev: pnpm dev - Build: pnpm build - Lint: pnpm lint - Typecheck: pnpm typecheck - Test: pnpm test ## Architecture - app/ — Next.js App Router, page.tsx + layout.tsx only - components/ui/ — Primitive components (Button, Input, Dialog), no business logic - components/features/ — Feature-specific composite components - lib/ — Shared utilities and hooks, no React components - lib/api/ — API client functions, generated from OpenAPI spec - styles/ — Global styles and Tailwind config ## Rules - Use Tailwind classes only, no inline styles, no CSS modules - Import components from @/components/ui, never write raw