1. 项目概述:为什么你的 Claude Code 需要一个“专属记忆”
先交代一下背景。Claude Code 是目前我用过的 AI 编码工具里,对“项目上下文”依赖最深的一个。它不是一个简单的“问答式”编程助手,而是直接在终端里跑、能读写文件、能执行命令、能帮你在整个代码仓库里来回折腾的智能体。正因为它能做的事太多,它反而更需要一个“前提”——它得知道你手上这个项目到底在干什么、代码按什么风格组织、有哪些不能碰的坑、依赖什么外部服务。
这就引出了 CLAUDE.md 这个文件的价值。
CLAUDE.md 是 Claude Code 的项目级指令文件,你可以把它理解成“给 AI 同事的入职手册”。每次你开启一次新的 Claude Code 会话,它都会自动读取这个文件,把文件里的内容作为初始上下文加载进对话。换句话说,你在 CLAUDE.md 里写了什么,Claude Code 就“默认知道”什么,不需要你每次反复解释项目背景、目录结构、编码规范这些琐事。
这个文件能解决什么问题?最典型的一个场景:你接手一个老项目,代码几万行,目录几十个,你自己都记不清某个工具函数放在哪儿。假如没有 CLAUDE.md,你每次让 Claude Code 改东西,都得先花大量 token 去“喂”它项目背景,甚至喂完它还是理解偏了。有了 CLAUDE.md,你只需要把项目的核心信息沉淀成文档,它每次自动加载,上下文精准命中,效率完全是两个量级。
适合谁来读这篇内容?三类人:第一,正在用 Claude Code 但觉得每次对话“不聪明”或“答非所问”的开发者;第二,刚接触 Claude Code、想从第一天就把工程化习惯建立起来的新手;第三,带团队、想让 AI 协作标准化的人。这篇文章不会停留在“CLAUDE.md 是啥”的科普层面,而是会直接给你一套可以照抄的配置框架、我在真实项目里踩过的坑、以及为什么有些配置看着合理实际却适得其反的深层原因。
我先说一句总结性的判断:CLAUDE.md 不是什么“魔法开关”,而是一套工程化的上下文治理方案。你越早把它当成一等公民来对待,Claude Code 的稳定性和产出质量就越高。下面进入正题。
2. 配置底层的原理认知:CLAUDE.md 到底是在调什么
2.1 从上下文窗口说起,CLAUDE.md 其实是在“省 token”
要先理解配置的底层逻辑,得从 Claude 的上下文机制讲起。大语言模型的每一次对话,本质上都发生在有限的上下文窗口里——你可以近似地把它理解成“AI 短期记忆的容量上限”。Claude Code 做代码智能体时,既要装下你自己的指令,又要装下它读取的文件内容、命令执行结果、工具调用记录,这些全都要消耗上下文空间。
CLAUDE.md 的价值在于:它是一份“固定占位”的基础上下文。只要这个文件存在,每次新会话开始时 Claude Code 会主动加载它,并且默认把它当成最高优先级的“先验知识”。这样一来,你不需要在每次对话开始时临时输入大段大段的项目背景,那些背景说明占用的 token 就被一个稳定、精炼的文件替代了。
这带来的直接收益有两个。一是省钱——自定义指令不进入计费过程,它本质上属于系统提示的一部分,不会消耗你额外的上下文额度,也不会计入 API 费用,你可以在里面写到很长很细,比起每次对话都手动重复这些基础信息,成本优势非常明显。二是省心——你不必依赖“对话记忆”来维持信息一致。很多人在长对话里遇到过 Claude Code 越聊越“失忆”的情况,前面说的规则后面就忘了,就是因为初始上下文没有固化成文件,而是在对话流里被逐渐冲淡了。CLAUDE.md 相当于把最重要的信息“钉死”在对话的最前面。
不过这里有个很容易被误解的地方:CLAUDE.md 加载的上下文,和你在对话中临时说明的信息,两者权重不是完全一样的。原理上,位于上下文窗口前端的内容对输出的影响力更强。CLAUDE.md 恰好就位于这个“前端位置”,所以它的约束力会比你说一句“记住啊,这个项目测试必须用 pytest”要强得多。理解了这一点,你才会明白为什么我在后面反复强调“重要的事写进 CLAUDE.md,临时的事才在对话里说”。
2.2 它和项目根目录、嵌套记忆的关系
CLAUDE.md 不只是一根“独苗”。Claude Code 支持层级化的 CLAUDE.md 机制,这点很多教程都没讲透。
具体来说,Claude Code 会从当前工作目录逐级向上查找 CLAUDE.md 文件。假如你在~/projects/myapp/submodule/目录下启动 Claude Code,它会依次读取~/projects/myapp/submodule/CLAUDE.md、~/projects/myapp/CLAUDE.md甚至~/CLAUDE.md(当然,实际上它通常不会跑到用户主目录那么顶层,但在项目内多层目录结构下,这种嵌套机制是真实生效的)。此外,用户主目录下的~/.claude/CLAUDE.md也可以当作全局记忆,对所有项目生效。
这个嵌套机制的意义在于:你可以把“全局性规范”和“模块级特性”分离。全局文件写通用的编码偏好(比如“所有提交信息必须遵循 Conventional Commits 规范”),项目根目录的文件写这个仓库的整体架构和技术栈,子目录里的文件则描述某个模块特有的约束(比如“这个模块不允许引入外部 UI 库,必须用项目自研组件”)。Claude Code 在进入某个子目录处理任务时,会自动把相关层级的记忆都加载进来,层层叠加,形成一个完整的上下文体系。
我在实际项目中强烈推荐提前规划这种分层结构。很多人只会在项目根目录放一个 CLAUDE.md,平时够用,但一旦项目变大、模块变多,单一文件就会越来越臃肿,每次加载的记忆有一大半和当前任务无关。这时候你就需要拆分:根目录文件负责大框架,关键子目录放精简版说明,二者配合才是长期演进的正解。
2.3 为什么说它比“在对话里反复强调”更可靠
这个问题值得单独说。很多用过 Claude Code 的人都有一个直觉:“我直接在对话里说清楚不就行了吗?为什么还要专门维护一个文件?”第一次这么想非常正常,但用过一段时间后你会发现,对话里的指令和文件里的指令,在 Claude Code 的执行机制里根本不是一个量级。
一方面,对话内容是“临时态”,会随着上下文的滚动推进逐渐被稀释。Claude Code 在长任务中会频繁读取文件、执行命令,这些新产生的内容不断涌入上下文窗口,早期的对话内容会被压缩甚至丢弃。你开头说的“测试必须用 pytest”,可能到第 20 轮工具调用时就已经偏离了模型注意力的中心区域。
另一方面,CLAUDE.md 是每次会话都会重新加载的“恒定项”。它天然就具备“我不在乎你之前聊了什么,反正我每次都在”的属性。这意味着你可以依赖它做“规范性兜底”——即使某次对话跑偏了、Claude Code 自由发挥了,只要你把规则写进了 CLAUDE.md,它就很难彻底绕开这些约束。从工程可靠性的角度讲,这相当于给 AI 协作加了一层“静态审核”。
所以,正确的姿势是:能在 CLAUDE.md 里固化的,就不要再靠口头记忆;能在文件里沉淀的,就不要依赖聊天记录。这不仅是对 Claude Code 的使用技巧,其实也是对 AI 编码工具的一个通用认知模型——越是频繁使用的信息,越应该固化成可复用的配置,而不是每次动态生成。
3. 核心配置的最佳实践:让 CLAUDE.md 真正发挥作用的四个关键环节
3.1 写作原则:先给“骨架”,再补“血肉”
技术文档最容易犯的毛病是贪多求全,CLAUDE.md 也一样。我在看了很多公开仓库的 CLAUDE.md 之后发现一个通病:写的人恨不得把整个项目 Wiki 都塞进去,动辄几百行,结果模型加载是加载了,但真正执行任务时反而抓不住重点。
我的建议是遵循“金字塔原则”来组织内容。文件最前面放最核心的项目定位和技术栈,然后是代码规范和工作流约束,最后才是具体模块的细节。这样设计的原因很简单:Claude Code 处理任务时,第一优先需要的信息是“这是什么项目、用什么语言、核心目录在哪”,而不是“某个工具函数的具体实现”。把最重要的信息放在最前面,模型的注意力分配会合理得多。
具体到内容,一个合格的 CLAUDE.md 至少应该包含四块:
项目简介:两三句话讲清项目是干嘛的,目标用户是谁,核心业务逻辑是什么。不要写“这是一个基于微服务架构的电商后台系统”这种空话,要写“这是一个面向中小商户的订单管理后台,核心链路是商户创建订单、库存扣减、支付回调。系统里有两个端,管理端和商户端,代码分别在 admin/ 和 merchant/ 目录下”,越具体越好。
技术栈与命令:列出项目用的语言、框架、包管理器、构建工具、测试框架,以及最常用的几个命令。这里要特别注意写清楚“用哪个命令跑测试”“用哪个命令启动开发服务器”,因为 Claude Code 会真的去执行这些命令,如果你不告诉它,它可能会猜一个错的,然后卡在环境问题上。
编码规范与约束:这部分是“负面清单”和“正面清单”的组合。比如“不要修改 database/migrations 下的文件,这些是由迁移工具自动生成的”“新增 API 必须写在 routes/api 目录下,并遵循现有 RESTful 风格”“所有异步操作必须使用 async/await,不要用 .then() 链式调用”。
项目结构与关键路径:用简短的树状结构或列表标注出核心目录的作用。不需要列出所有文件,只列那些“AI 可能不知道但非常有用的位置”,比如“utils/ 下是共享工具库”“config/ 下是环境配置模板,不要直接改 .env”。
有人会问,这些内容项目本身可能已经有 README 了,为什么还要在 CLAUDE.md 里再写一遍?原因很简单:README 的读者是“人”,CLAUDE.md 的读者是“AI 同事”。前者的重点是吸引人、说清楚项目价值;后者的重点是高效驱动 AI 执行具体任务。两者有交集,但绝不是替代关系。我见过有人直接在 CLAUDE.md 里让 Claude Code 先读 README,这是一个可行但低效的做法——与其让它先花大量上下文去读文档,不如把关键信息提炼出来直接喂给它。
3.2 用“指令性语句”代替“描述性语句”
这是一个非常容易被忽视的细节。写 CLAUDE.md 时,很多人本能地会用描述性语言:“项目使用了 React 18 和 TypeScript。UI 组件放在 components 目录下。测试使用 Vitest 编写。”从语法上说没毛病,但实际效果不够好。
更好的写法是直接上祈使句:“使用 React 18 和 TypeScript 编写代码。所有 UI 组件必须放在 src/components 目录下。运行测试时使用pnpm test命令。”为什么要这样?因为 CLAUDE.md 最终驱动的是“行为”,而不是“知识”。它的首要目标是改变 Claude Code 接下来做什么、怎么做,所以指令性内容理应比描述性内容更明确。
一个我反复强调的句式是:当你要给 Claude Code 设定一条行为边界时,用“必须/禁止/不要/优先/仅在……时”这类强约束词,而不要用“项目一般会”“通常可以考虑”这类软性词汇。AI 模型本质上是一个概率预测器,如果你的规则里充满模棱两可的表达,它生成时就会倾向于“灵活发挥”,你的约束力就大打折扣。这不是玄学,这是提示工程的基本原理——越明确的指令,采样空间收得越窄,输出越稳定。
举一个我项目的实际例子。早期我的 CLAUDE.md 里写的是“数据库迁移文件需要小心处理”,结果 Claude Code 好几次直接修改了迁移文件,导致我挨个排查。后来改成“不要修改 migration 目录下的任何文件。如果迁移文件出现问题,请停下来向用户说明,由用户手动处理”,之后再也没有出过类似问题。这两版表达的区别,就是“描述意图”和“定义行为”的区别,效果天差地别。
3.3 善用 Memories 和 Skills,把静态配置升级为动态体系
CLAUDE.md 文件本身是静态的,但在 Claude Code 的生态里,它还有两个“搭档”值得纳入你的配置体系:Memories 和 Skills。
先讲 Memories。它是 Claude Code 用来存储“跨会话持久记忆”的机制,本质上是在项目运行过程中,AI 会把一些“值得记住的经验”写下来。你可以把它理解成 Claude Code 的“工作日志”。在 CLAUDE.md 里,完全可以主动引导 Claude Code 去使用 Memories,比如写一句“当你在本项目中完成了某个模块的架构调整,请在记忆文件中记录变更要点”,这样随着使用次数增加,这个项目的 Claude Code 会变得越来越“懂行”。
再讲 Skills。Skills 是 Claude Code 支持的一种可复用能力封装,可以把一个复杂的操作流程做成一个“技能包”,在需要时让 AI 按步骤执行。它的定位和 CLAUDE.md 不同:CLAUDE.md 更像是“资料库”,负责提供静态背景知识;Skills 更像是“操作手册”,负责定义一个标准化的执行流程。
对大多数中小项目来说,我的建议是:CLAUDE.md 先写好、写扎实,Skills 不必一上来就做。等你在项目中发现某些任务重复出现、每次都靠对话一点点引导时,再考虑把它固化成 skill。任何工程化机制都要避免“过度设计”,CLAUDE.md 的生态也一样——先让最简单的方案跑起来,再按需扩展。
3.4 版本管理与团队协作:CLAUDE.md 也是一份“会演化”的代码
CLAUDE.md 不是写一遍就完事的静态文件,它应该和代码一样被对待:进版本控制、做代码评审、随项目演进持续更新。我见过太多团队的 CLAUDE.md 是某个人入职第一周写的,项目重构了好几轮,文件却三年没动过——那它后面就纯粹是 AI 的噪音来源,不仅没价值,还会持续误导。
把 CLAUDE.md 放进 Git 仓库管理的好处有三个。第一,可回溯。某次 Claude Code 突然行为异常,你可以对比 CLAUDE.md 的变更历史,极大概率是某条配置改了之后引发的。第二,可协作。团队成员对 AI 协作方式有不同想法时,通过 PR 流程讨论修改,而不是某个人悄悄改了本地文件,鸡同鸭讲。第三,可沉淀。项目经验的载体不再只存在于老员工的脑子里,而是固化成了团队资产。
这里我要特别提醒一个团队协作时容易踩的坑:CLAUDE.md 是项目级配置,不是个人偏好收集器。你把自己喜欢的代码风格写进全局配置,没问题;但如果你把“我习惯用 double quotes,把默认编辑器设成 vim”这类纯私人偏好写进项目根目录的 CLAUDE.md,那对团队成员来说就是一种噪音污染。项目级 CLAUDE.md 应该聚焦于项目客观事实、团队统一规范、AI 执行边界;个人习惯请放到~/.claude/CLAUDE.md里,各归其位。
4. 实操演示:从零到一配置一份高质量的 CLAUDE.md
4.1 先给一个完整的配置模板
配置这种东西,光讲原则不给模板等于耍流氓。下面我提供一个我在多个实际项目中验证过的 CLAUDE.md 模板,你可以直接复制,然后按自己项目的实际情况替换内容。注意看整体结构,不要照抄具体的目录名。
# 项目:OrderFlow 订单管理后台 ## 项目定位 这是一个面向中小型电商团队的多租户订单管理后台。 核心业务链路:商户创建订单 → 库存扣减 → 支付回调 → 订单状态流转。 系统包含两个端:管理端(admin/)和商户端(merchant/)。 ## 技术栈与命令 - 前端:React 18 + TypeScript + Vite,UI 组件在 src/components - 后端:Node.js + Express + Prisma,路由在 src/routes - 数据库:PostgreSQL,通过 Prisma 管理 Schema - 测试:Vitest + Testing Library - 包管理:pnpm 常用命令: - `pnpm dev`:启动前端开发服务器 - `pnpm test`:运行全部单元测试 - `pnpm test -- <路径>`:运行指定测试文件 - `pnpm prisma:migrate`:执行数据库迁移(不要手动修改 migration 文件) ## 代码规范与约束 - 禁止修改 migration/ 目录下的任何文件,迁移流程统一通过 Prisma CLI 处理 - 新增 API 必须放到 src/routes/api 下,并使用现有的 createRouter 封装方式 - 所有异步代码必须使用 async/await,禁止 .then() 链式调用 - 项目统一使用单引号和分号,提交前必须运行 `pnpm lint` 和 `pnpm test` - 若任务涉及数据库 Schema 变更,先与用户确认再进行迁移操作 ## 项目结构速览 - src/components:通用 UI 组件,按业务模块分子目录 - src/services:所有 API 请求封装 - src/utils:无业务逻辑的纯函数工具集 - src/routes:后端路由定义 - prisma/:数据库 Schema 与迁移文件 - scripts/:存放项目辅助脚本 ## 注意事项 - OrderFlow 使用 mock 数据时,统一在 src/services/__mocks__ 下定义 - 涉及支付相关代码改动时,务必在测试中覆盖回调异常分支 - 本项目有 ESLint 规则自定义配置,新代码必须遵循4.2 每个模块为什么这么写
现在把模板拆开,逐块说明写作意图,这样你才能学会自己改。
第一块的“项目定位”,我用的是“业务链路 + 端 + 目录映射”的格式,而不是泛泛的“这是一个订单管理系统”。为什么要写业务链路?因为 Claude Code 改代码时,最怕只见树木不见森林。如果它只知道改的某个函数属于“订单模块”,但不知道订单创建和库存扣减之间有联动关系,它很可能会在改一个地方时不考虑对另一个地方的影响。把业务链路写清楚,AI 在改动代码时才会具备基本的“影响面分析”能力。同时我提到了 admin/ 和 merchant/ 的目录划分,等于告诉它“这两个端是平行的,改代码时注意区分”。
第二块的“技术栈与命令”,重点在命令的精确性。很多项目里,跑测试的命令可能是npm test、yarn test、pnpm test中的一个,不同人的本地环境也会有差异。Claude Code 默认会猜测,而猜错的结果是它在执行测试时失败,然后花大量时间去排查环境问题。把这些命令白纸黑字写清楚,等于把“环境变量”提前注入,省掉一大段无谓的试错。我特别强调写“不要手动修改 migration 文件”,是因为这是一个典型的“AI 不关心后果”的坑——它认为改一个迁移文件只是改一份普通代码,但对实际项目来说,这会造成数据库状态和代码状态的严重不一致。
第三块的“代码规范与约束”,全部用“禁止/必须/统一/不要”句式。这些句子没有一句是“仅供参考”的。这里其实体现了我前面说的核心原则:CLAUDE.md 不是知识库,是行为约束集。每一个条目都应该能直接对应到 Claude Code 在真实任务中的某个决策点。
第四块的“项目结构速览”,要的是“能帮 AI 定位文件”的信息,而不是完整目录树。举个例子,如果 Claude Code 要新增一个支付回调的 API,它看完这个速览就会知道路由放src/routes、请求封装放src/services、与数据库有关去看prisma/,基本不会迷路。完整的目录树动辄上百行,放进 CLAUDE.md 只会挤占上下文空间,收益很低。记住:CLAUDE.md 的价值密度,永远比完整性重要。
4.3 给不同项目场景的微调建议
上面的模板基于一个“前后端一体、单仓库”的典型项目。如果你的项目形态不一样,需要做相应的微调。
微服务/多仓库项目:每个仓库里放一份 CLAUDE.md,同时在根目录或编排层写一份“总索引”式的 CLAUDE.md,说明各个服务的边界和调用关系。关键约束是:服务 A 的改动不得直接影响服务 B 的数据表。跨服务的接口变更,必须先列契约再动手。
前端重、后端弱(纯静态站/文档站):技术栈和命令部分突出构建流程和静态资源处理,代码规范聚焦样式组织和组件复用。项目结构速览要重点标注路由配置文件和全局状态管理的目录,因为这是前端项目里 AI 最常迷路的两个地方。
数据密集型项目(数据分析/ETL 管道):除了常规技术栈,一定要写清楚数据流走向。哪张表是源表、哪张表是目标表、哪些中间表可以被删除重建、哪些表有生产数据不允许动。数据项目的风险往往不在代码逻辑,而在误操作导致的数据损坏,CLAUDE.md 里必须有强约束去兜底。
个人开源项目:个人维护的开源项目自由度最高,但建议在 CLAUDE.md 里写明“当前版本支持的目标 Node.js 版本”“主分支的提交规范”“对依赖升级的策略”(比如“依赖版本升级需要单独开 PR”)。这些看起来细碎的条目,能帮你避免 AI 在某次任务里顺手把一堆依赖全升了级,留下一堆需要手工修复的兼容性问题。
5. 常见问题与排查技巧实录
5.1 “我写了 CLAUDE.md,但 Claude Code 好像根本没读”
这是被问得最多的问题。修改完 CLAUDE.md 后,如果当前已经有一个正在进行的会话,它默认不会重新加载文件——所以你的第一反应应该是“新开一个会话再试试”,而不是怀疑配置没写对。
第二个常见原因:文件位置不对。Claude Code 从当前工作目录向上查找 CLAUDE.md,所以如果你在项目的子目录(比如src/views/)下启动 Claude Code,它加载的可能是这个子目录的 CLAUDE.md,或者只是部分继承了根目录的配置。建议启动前先确认当前目录是否符合预期,或者在项目根目录统一启动。
第三个可能容易忽略:你把内容写进了CLAUDE.md或CLAUDE.local.md,但拼写错了,比如写成了CLAUDE.MD或者CLAUDE.md.txt。文件后缀大小写和文件名必须完全匹配。这个错误很低级,但在多个操作系统之间同步文件时很容易出问题。
排查顺序我建议如下:先开新会话确认文件生效,再确认文件路径和命名,最后在对话里直接问 Claude Code“你的系统指令里包含哪些项目级指令”,让它自述加载了哪些内容。这一步可以直接暴露配置是否被读取。
5.2 “CLAUDE.md 太长了,感觉 AI 还是抓不住重点”
文件太长确实是问题,但核心不一定是长度,而是结构混乱。如果你的 CLAUDE.md 超过 200 行,AI 在加载后依然产生“信息过载”,大概率是组织结构出了问题,而不是行数本身。
解决办法有两个方向。第一是拆层级:把项目级的内容保留在根目录 CLAUDE.md,模块级的内容下沉到子目录的 CLAUDE.md;把执行细节从配置里挪走,放进具体的 task 指令或 Skill 中。第二是压缩表达:删除所有“描述了”“请注意”“这个目录是存放什么的”这类冗余修饰语,保留纯信息密度高的短句。上面模板里每条规范基本没有超过两行的,这个长度水平是参考方向。
另一个隐藏得很深的坑:内容顺序。模型对上下文前部和后部的信息注意力更高,中部相对容易丢失。这就是为什么我在模板里把“项目定位”和“技术栈命令”放在最前面,把“结构速览”和“注意事项”放在后面。如果你把最重要的安全红线埋在文件正中间,它反而最容易被忽略。
5.3 “CLAUDE.md 起了反作用,AI 的行为被约束得太死了”
我在项目中后期遇到过这个问题的变种:规则写太多太死,Claude Code 做任何事都畏手畏脚,遇到没覆盖到的边界情况就直接停下来问用户,导致自动化效率反而下降。
这种情况说明你把 CLAUDE.md 用成了“万能行为手册”,以为规则越全越好。但模型的判断机制不是这样的——过量的约束互相冲突时,模型为了避免违规可能选择“什么都不做”或“做最小操作”。真正的解决方案是:保留一部分开放性。区分“硬约束”和“软建议”。
硬约束只放那些“违反了会造成严重损失”的规则,比如不要动迁移文件、不要改用户表数据;软建议则采用更轻的表达,比如“这个项目的工具函数通常放在 src/utils,优先复用现有实现”。在撰写时我甚至会在部分条目后附一句“如果任务需要偏离此规则,请先向用户说明原因再执行”,这样既给了 AI 自主判断的空间,又保留了人类把关的入口。
5.4 实战速查:配置中几类高频错误的对照表
| 错误类型 | 错误写法实例 | 正确写法实例 |
|---|---|---|
| 描述代替指令 | 测试框架用的是 Vitest | 运行单元测试统一使用pnpm test |
| 边界模糊 | 数据库文件要小心处理 | 禁止修改 migration/ 下的任何文件 |
| 信息过时 | 项目使用 Vue 2(实际已升级 Vue 3) | 项目使用 Vue 3 + Vite,采用组合式 API 写法 |
| 私人偏好混入 | 我习惯用双引号,帮我切换 | 本仓库统一使用单引号 |
| 缺少优先级 | (无)新增 API 时注意风格一致 | 新增 API 遵循现有 RESTful 风格,与 routers/api 下已有实现保持一致 |
这张表值得你在写完 CLAUDE.md 后逐项自查一遍。不少配置问题其实在写的时候就能避免。
5.5 提高 CLAUDE.md 配置回报率的几个“土办法”
最后分享几个我用下来非常顺手、但与“官方配置指南”无关的小技巧。
第一,在 CLAUDE.md 里放一个“当前任务指针”区块。项目处于什么阶段、正在进行什么重构、最近一次变更把哪里改掉了,这些信息写在文件末尾。每次任务完成或方向调整时更新它。这能让新会话的 Claude Code 从来没聊过也知道你现在的工作重心,而不是从零探索一遍项目。
第二,用 CLAUDE.md 来固化“AI 犯过的错”。我在早期项目里吃过不少亏,后来养成了一个习惯:Claude Code 在某个任务里犯了一个值得警惕的错误,我就把对应的负面规则追加到 CLAUDE.md 里。比如它曾经把某个 mock 工具函数写进了生产代码,我就在配置里加了一条“禁止在 src/services 以外的目录引入 mock 数据”。CLAUDE.md 由此变成了团队与 AI 协作的“事故复盘台账”,每一条规则都是血的教训换来的,比网上抄来的模板有价值无数倍。
第三,配置完不要急着放一边,过几天做一次“配置审计”。拿几个真实任务测试 Claude Code 的表现,检查有没有规则没被执行到位、有没有规则明显过时。配置文件和代码一样会有技术债,不定时清理,债务会越滚越大。
关于 CLAUDE.md 的配置和最佳实践,我还能列出一堆细节,但核心方法其实归纳下来就是这几点:把它当成给 AI 同事的入职手册来写,用指令性语句定义行为边界,按层级结构组织信息,让它随项目一起演进,并在实践中持续更新。按照这个思路去配置你的 Claude Code,它的稳定性和产出效率会有非常直观的提升。