本页目录5
这个考点是什么
Claude Code 里“规则怎么进入 context”其实分好几层加载时机,本考点要辨析的核心就是这几层的边界,尤其是路径条件加载(paths glob)这一层。
先澄清一个容易搞混的事实:CLAUDE.md 的“启动时整体加载”只覆盖从当前工作目录开始、沿目录树往上走的那一条链路——比如在 foo/bar/ 启动,会在启动时加载 foo/bar/CLAUDE.md、foo/CLAUDE.md 以及对应的 CLAUDE.local.md。
但当前工作目录之下的子目录里如果还有嵌套的 CLAUDE.md,它不在这份“启动时加载”名单里——只有当 Claude 实际读取该子目录下的文件时,这个嵌套 CLAUDE.md 才会被拉入 context。
也就是说,嵌套 CLAUDE.md 本身就是一种目录级的按需加载,而不是“只要会话启动就无条件进场”。
真正意义上的路径条件加载,是 .claude/rules/ 目录下的 markdown 文件:
-
如果 frontmatter 没有
paths字段,这条规则等价于启动时加载,优先级与.claude/CLAUDE.md相同; -
如果声明了
paths(一组 glob 模式),这条规则就变成条件加载——只有当 Claude 实际读取或操作了匹配该 glob 的文件时,规则正文才进入 context,其余会话中完全不占位。
这个机制额外支持递归发现 .md 文件(可分 frontend/、backend/ 等子目录组织)、符号链接(含循环检测,便于跨项目共享同一份规则),以及用户级 ~/.claude/rules/ 先于项目级加载(因此项目级同域规则优先级更高)。
为什么考
命题角度集中在“这条规则到底什么时候进入 context”:常见考法是给一段带 paths frontmatter 的规则文件,让考生判断触发条件是“文件路径命中 glob 时”而不是“每次工具调用时”,或反过来考“无 paths 字段”时是否等价于启动时加载。
另一类考法是给出“约定分散在代码库各处、按目录管不了、必须按文件类型区分”的场景,在嵌套 CLAUDE.md、@import、skills、path-scoped rules 之间选出真正能做到“按文件类型精确触发且不常驻 context”的方案,重点考察 @import 仍在启动时整体展开、skills 依赖模型判断相关性这两个常见误区,以及嵌套 CLAUDE.md 到底是不是“启动时无条件加载”。
核心辨析
- 1
“启动时加载”只覆盖从当前工作目录沿目录树向上的那条链路上的
CLAUDE.md/CLAUDE.local.md;当前工作目录之下子目录里的嵌套CLAUDE.md不在此列——它是当 Claude 实际读取该子目录下的文件时才按需加载,本身就是一种目录级条件加载,不能笼统归为“只要目录命中就在启动时进场”。 - 2
.claude/rules/里的文件有没有pathsfrontmatter,决定两种不同加载时机:-
无
paths等价于启动时加载,优先级与.claude/CLAUDE.md相同; -
有
paths(glob 列表)则是路径条件加载,官方文档明确说明是“Claude 读取匹配文件时触发,而不是每次工具调用都触发”,不匹配的会话里完全不进 context。
-
- 3
路径作用域规则(glob)和嵌套
CLAUDE.md(目录级)是两种不同粒度嵌套
CLAUDE.md按文件所在目录生效,管不到同一目录里不同类型的文件;pathsglob 按路径模式匹配,既能跨目录统一命中所有同类文件(如所有*.test.tsx),也能在同一目录内把不同扩展名的文件区分开。判断场景题先看约定是“与目录强绑定”还是“与文件类型/命名模式强绑定”。 - 4
@import(如 CLAUDE.md 里的@path/to/file)不是条件加载被导入的文件在启动时就整体加载进 context,只是把内容拆成多个文件方便组织,并不会减少常驻 context 的体积;真正做到“不匹配就不占 context”的只有带
paths字段的 rules。 - 5
rules 与 skills 的加载机制不能混用
rules 命中路径是确定性触发,文件一旦匹配就一定进 context;skills 是否加载取决于 Claude 对任务相关性的判断,或者用户显式调用。如果目标是“编辑某类文件时必须强制应用某种约定”,应该用 path-scoped rules,而不是指望 skill 每次命中都会自动触发。
- 6
.claude/rules/目录支持递归发现.md文件(可分子目录组织)、支持符号链接且能检测并妥善处理循环链接;用户级~/.claude/rules/先于项目级加载,所以项目级同域规则优先级更高——这一点常被反向出题(误说项目级先加载、或误说不支持符号链接)。
反模式对照
以为子目录里的嵌套 CLAUDE.md 会像沿目录树向上的 CLAUDE.md 一样,在会话启动时就整体加载进 context
认识到嵌套 CLAUDE.md 只有当 Claude 实际读取该子目录下的文件时才按需加载,本质上和 paths glob 一样属于条件加载而非启动时加载
官方文档明确说明只有当前工作目录沿目录树向上的 CLAUDE.md 才在启动时整体加载,子目录里的嵌套 CLAUDE.md 是“Claude 读取该目录下文件时才被包含进来”。
把大量约定拆到多个文件再用 @import 整体导入,以为这样能像 paths glob 一样减少常驻 context
把按主题划分的约定放进 .claude/rules/ 下的独立文件,并用 paths glob 声明只在命中文件时才加载
@import 只解决了组织问题,被导入的内容仍在启动时整体进入 context;只有带 paths 字段的规则才能做到不匹配就不占位。
试图用嵌套 CLAUDE.md 对同一目录下的 Button.tsx 和 Button.test.tsx 分别套用不同约定
用一条 paths: ["**/*.test.tsx"] 的规则跨目录统一匹配所有测试文件,另建一条规则匹配对应的实现文件
嵌套 CLAUDE.md 是目录级作用域,管不到同目录内不同文件类型;glob 模式按路径/扩展名匹配,与目录位置无关。
指望用 skill 强制某类文件必须遵循的编码规范,以为它会像规则一样每次编辑都自动生效
用 .claude/rules/ 的 paths 字段做确定性的路径触发,skill 留给需要模型判断“是否相关”后再决定是否调用的场景
skill 是否加载取决于任务相关性判断或显式调用,不保证在编辑匹配文件时必定触发;rules 的路径匹配是确定性的。