Claude Code 学习站

CLAUDE.md 记忆层级

考点 3.1 · CLAUDE.md hierarchy · 所属域权重 20% · Claude Code 配置与工作流

本页目录5

这个考点是什么

CLAUDE.md 是 Claude Code 面向会话的“记忆”机制,用自然语言告诉 Claude 项目背景、代码规范、常用命令等,供其在开始工作前读到。

它和 settings.json 系列文件管的东西不同:

  • 后者管行为参数(权限规则、modelenv 等),走的是 scope precedence(同一标量项由最高优先级作用域的值单独胜出);

  • CLAUDE.md 管的是给模型看的上下文说明,走的是层级叠加——多个文件的内容会被完整拼接进上下文,而不是由更贴近的文件覆盖更上层的文件。

CLAUDE.md 存在多个可被自动发现的层级:企业级 managed-policy(如 Linux/WSL 上的 /etc/claude-code/CLAUDE.md)、用户级 ~/.claude/CLAUDE.md、项目级(项目根目录 ./CLAUDE.md./.claude/CLAUDE.md)、以及不入库的本地个人层 CLAUDE.local.md

Claude Code 启动时从当前工作目录向上遍历目录树,把沿途找到的每一份 CLAUDE.md 全部读入,顺序从最外层(managed → user)到最贴近工作目录的项目文件,也就是越靠近你启动位置的文件读得越晚,而不是覆盖前面的内容。

此外 CLAUDE.md 支持 @path/to/file 导入语法,可递归导入其他文件(最大深度四跳),相对路径以“被导入文件所在位置”为基准解析,而非当前工作目录;写在代码块或行内反引号里的路径不会触发导入,只作为字面文本展示。

为什么考

这个考点常见考法是制造“多层定义同一设置项,最终生效值是谁”的场景,诱使人把 settings.json 的 scope precedence(单值胜出)和 CLAUDE.md 的层级拼接(内容叠加,仅顺序不同)混为一谈;也会针对 @import 语法的递归深度、相对路径基准、代码块转义等细节出题,以及 managed-policy CLAUDE.md 的部署路径与“不可被排除”特性,考察对加载顺序和机制边界的精确记忆,而不是模糊印象。

核心辨析

  1. 1

    CLAUDE.md 是层级拼接,不是就近覆盖

    Claude Code 会把 managed → user → project(从仓库根到工作目录)沿途发现的每份 CLAUDE.md 全部读入上下文,顺序上离工作目录越近的文件读得越晚,但内容是叠加而非替换;这与 settings.json 里标量配置(如 model)“最高优先级单值胜出”的机制是两套不同规则,题目常故意混用二者的措辞来设陷阱。

  2. 2

    @path/to/file 导入语法

    相对路径以“被导入文件所在目录”为基准解析,而不是当前工作目录;导入可以递归,最大深度四跳;导入内容在会话启动时就已展开进上下文,因此把内容拆成多个导入文件只是方便组织,并不能节省 token。

  3. 3

    反引号或代码块中出现的 @path 视为字面文本,不会触发导入——这是用来“在文档里提及某个导入路径而不实际导入”的转义手段,容易被误判为导入失效。

  4. 4

    managed-policy CLAUDE.md(企业策略层)位于系统级路径(如 Linux/WSL 的 /etc/claude-code/CLAUDE.md),加载顺序最靠前,且不能通过 claudeMdExcludes 排除;其内容也可以用 claudeMd 键直接内嵌进 managed-settings.json,但这个键只在 managed/policy 设置里生效,写进项目或用户级 settings.json 不起作用。

  5. 5

    已有 AGENTS.md 想让 Claude Code 也遵循,正确做法是新建一个 CLAUDE.md@AGENTS.md 导入它(或做符号链接),因为 Claude Code 启动时只自动发现 CLAUDE.md/CLAUDE.local.md,不会主动读取 AGENTS.md

  6. 6

    CLAUDE.md 只是以普通消息形式注入上下文的建议性说明,不保证被严格遵守,也起不到强制拦截的作用;真正需要强制执行的规则(比如禁止某些命令)应该写进 settings.json 的 permission 规则或 PreToolUse hook。

反模式对照

常见做法

以为离工作目录最近的 CLAUDE.md 会覆盖上级目录里的 CLAUDE.md

正确做法

所有层级的 CLAUDE.md 都会被完整拼接进上下文,只是顺序上从外到内、越近的越靠后读到

Claude Code 走的是目录树遍历加拼接的加载模型,而不是“唯一生效值”的覆盖模型,这一点和 settings.json 的标量配置刚好相反。

常见做法

把需要强制执行的规则写进 CLAUDE.md,以为这样就能拦住 Claude 不去做某件事

正确做法

真正的强制护栏写在 settings.json 的 permission allow/deny 规则或 PreToolUse hook 里

CLAUDE.md 是以消息形式注入的建议性上下文,没有强制执行力;hooks 是由 harness 本身执行的代码级拦截,才具备强制性。

常见做法

认为 Claude Code 会像其他一些编码助手一样自动读取仓库里现成的 AGENTS.md

正确做法

新建一个 CLAUDE.md@AGENTS.md 把它导入进来,或者直接把 CLAUDE.md 符号链接到 AGENTS.md

Claude Code 只自动发现 CLAUDE.md/CLAUDE.local.md;两份独立维护的文件很容易在后续修改中彼此漂移出现内容不一致。

常见做法

遇到“多层同名设置项谁生效”的题目时,不区分问的是 CLAUDE.md 的拼接场景还是 settings.json 的标量配置场景,统一套用“企业策略优先”的结论作答

正确做法

先判断问的是标量配置(走 scope precedence,单值胜出,permission 规则是唯一按合并处理的例外)还是 CLAUDE.md 内容(走层级拼接,全部叠加)

两套机制虽然都是 managed/企业层级最优先,但一个是“挑一个值生效”,一个是“全部读入”,混用会在选项设计成“哪个值生效”与“加载顺序”对照时翻车。

练这个考点