什么是 Claude Code 规则
Anthropic 的记忆文档是这样介绍它们的:“对于较大的项目,你可以使用 .claude/rules/ 目录将指令组织到多个文件中。这可以保持指令的模块化,并使团队更易于维护。”
规则是一个 markdown 文件。你将其放在项目的 .claude/rules/ 目录中,每个文件一个主题,文件名说明其涵盖的内容,例如 testing.md 或 api-design.md。“所有 .md 文件都会被递归发现,因此你可以将规则组织到子目录中,如 frontend/ 或 backend/”。
规则分为两种:
- 没有
paths前置内容的规则。 这些规则在每次会话开始时加载。 - 路径范围规则。 这些规则带有
paths字段,仅在 Claude 处理匹配的文件时加载。
文档在注释中总结了这种权衡:“规则在每次会话或打开匹配文件时加载到上下文中。对于不需要一直存在于上下文中的特定任务指令,请改用 skills,它们仅在你调用它们或 Claude 确定它们与你的提示词相关时才会加载。”
无 paths 规则何时加载
没有 paths 字段的规则表现得就像项目指令的一部分。“没有 paths 前置内容的规则在启动时加载,优先级与 .claude/CLAUDE.md 相同。”
这使得无范围规则成为拆分冗长 CLAUDE.md 而不改变 Claude 所见内容的一种方式。内容仍然在每次会话中加载;只是在独立文件中更容易维护。
路径范围规则何时加载
路径范围规则以列出 glob 模式的 YAML 前置内容开头:
---
paths:
- "src/api/**/*.ts"
---
- 所有 API 端点必须包含输入验证
- 使用标准错误响应格式文档明确说明了触发条件:“当 Claude 对匹配的文件使用 Read、Write 或 Edit 工具时,路径范围规则就会加载。”当 Claude 通过算作读取的 Bash 命令(如对单个文件执行 cat 或 head)查看匹配文件时,它也会加载,并且它可以通过指向项目目录的符号链接路径工作。
由此产生两个后果:
- 仅提及文件是不够的。 规则在 Claude 读取、写入或编辑匹配文件时加载,而不是在你提示词中提到文件名时加载。
- 规则在开始时并不存在。 在 Claude 接触到匹配文件之前,该规则不在其上下文中。
模式如何匹配
模式是相对于规则基目录的。对于项目规则,即包含规则 .claude 文件夹的目录。对于用户级规则,则是会话的主要工作目录。
你可以列出多个模式并使用花括号扩展,例如 src/**/*.{ts,tsx}。花括号扩展有配额限制:规则的整个 paths 列表共享“1,000 个扩展模式和 4 MiB 的配额”,超过该配额的模式将以未扩展的形式使用,因此其花括号将无法匹配任何文件。
方括号是 glob 语法。带有 [ 但无法被读取为括号表达式的模式是无效的,且不匹配任何内容,尽管规则的其他模式仍会继续工作。要匹配字面意义上的 [,请对其进行转义。
工作树(Worktrees)是一个常见的陷阱。文档指出,要为同级 git 工作树中的文件加载路径范围规则,你需要在该工作树中启动 Claude Code,或使用 /cd 将会话移动到那里。
前置内容可以包含什么
只有一个字段起作用。“paths 是 Claude Code 从规则中读取的唯一字段;任何其他字段都会被忽略且不报错。”Claude Code 在加载规则之前会剥离前置内容,因此它不会占用上下文。
如果 YAML 无法解析,规则并不会悄无声息地失效。Claude Code 会“忽略前置内容,并像没有 paths 一样加载规则”。前置内容中的拼写错误会将范围规则变成每次会话都加载的规则。运行 claude --debug 可以查看解析错误。
用户级规则
规则不仅限于每个项目。“~/.claude/rules/ 中的个人规则适用于你机器上的每个项目。”它们适用于不与特定代码库绑定的偏好设置。
当用户规则和项目规则不一致时,顺序很重要。“Claude Code 在项目规则之前加载用户级规则,因此项目规则在 Claude 上下文中出现的位置比用户规则靠后。两组规则都不会覆盖另一组:如果用户规则和项目规则冲突,Claude 可能会遵循其中任何一个,因此请保持两者一致。”我们的协调冲突 CLAUDE.md 层级指南介绍了如何发现这些冲突。
通过符号链接共享规则
.claude/rules/ 目录支持符号链接,因此团队可以维护一套规则并将其链接到多个项目中。如果符号链接指向工作目录之外,Claude Code 会将其视为外部导入:在为你为项目批准外部导入之前,链接的规则不会加载,之后也只有没有 paths 字段的规则会加载。指向网络路径的符号链接完全不会加载。
规则 vs. CLAUDE.md
两者都是你编写的指令。它们在被发现的方式和加载时机上有所不同。
| CLAUDE.md | .claude/rules/ 中的规则 | |
|---|---|---|
| 位置 | 工作目录、其上级目录及子目录 | 项目中的 .claude/rules/ 以及 ~/.claude/rules/ |
| 结构 | 每个位置一个文件 | 任意数量的主题文件,可放在子文件夹中 |
| 加载时机 | 启动时加载工作目录及上级目录的文件;当 Claude 接触子目录文件时加载该处文件 | 无 paths 时启动加载;有 paths 且 Claude 接触匹配文件时加载 |
| 范围限定 | 按目录 | 按 glob 模式 |
子目录中的 CLAUDE.md 文件也是按需加载的,因此通过目录限定范围对两者都可行。规则增加了按模式限定范围的功能,这可以跨越目录,例如匹配所有测试文件,无论它们位于何处。
按需加载的文件共享一个限制。路径范围规则和子目录 CLAUDE.md 文件都有单文件大小限制,Claude 仅接收超过限制文件的开头部分。我们的 Claude Code 子目录 CLAUDE.md 限制指南涵盖了具体数值以及如何检查你的限制。
如果你与其他编程工具共享指令,我们的在 Cursor 和 Claude Code 之间共享一个记忆的指南涵盖了每个工具读取的文件。
压缩后规则会发生什么
压缩(Compaction)对这两类规则的处理方式不同。上下文窗口文档将项目根目录 CLAUDE.md 和无范围规则列为压缩后“从磁盘重新注入”,而将带有 paths: 前置内容的规则列为按需重新加载。
文档解释了原因:“路径范围规则和嵌套的 CLAUDE.md 文件在 Claude 读取、写入或编辑其触发文件时加载到消息历史记录中,因此压缩会将它们与其他所有内容一起总结掉。”在压缩之后,只有当 Claude 再次接触匹配文件时,路径范围规则才会重新出现。
文档为绝不能丢失的规则提供了直接指令:“如果规则必须在压缩后保持持久,请删除 paths: 前置内容或将其移动到项目根目录的 CLAUDE.md 中。”我们的引导 Claude Code 自动压缩指南涵盖了压缩保留的其他内容。
人们首先尝试的做法
限定规则范围并期望它在开始时就存在。 路径范围规则在 Claude 接触匹配文件时加载,而不是在会话开始时。
在前置内容中添加 description 等字段。 只有 paths 会被读取;其他字段会被忽略且不报错。
编写无效的 YAML。 规则随后会像没有 paths 一样在每次会话中加载。
将必须遵循的规则放在 paths 之后。 压缩后它就会消失,直到再次接触匹配文件。
保留不一致的用户规则和项目规则。 两者都不会覆盖另一个;Claude 可能会遵循其中任何一个。
在同级工作树中运行。 除非你在该处启动会话或使用 /cd 移动会话,否则来自另一个工作树的路径范围规则不会加载。
解决方法:按主题拆分,仅对条件性内容设置范围,并检查加载情况
第 1 步:将 CLAUDE.md 拆分为主题文件
将冗长 CLAUDE.md 的每个独立部分移动到 .claude/rules/ 中各自的文件中,文件名说明其涵盖的内容。起初保持这些规则无范围。Claude 所看到的内容尚未发生变化;这些文件只是变得更容易阅读和审查。
第 2 步:为仅有时相关的规则设置范围
为仅对某些文件重要的规则添加 paths:支付模块、测试框架、前端目录。对于 Claude 在每个任务中都必须遵循的内容(包括你需要经受住压缩考验的规则),保持无范围。根据代码库中的真实文件路径检查每个模式,并保持每个范围文件在单文件大小限制内。
第 3 步:检查哪些规则实际已加载
运行 /context 查看启动时加载了哪些 CLAUDE.md 和规则文件。路径范围规则在触发之前不会出现在那里。为了观察触发过程,文档建议使用 InstructionsLoaded 钩子,它会记录加载了哪些 CLAUDE.md 和规则文件、何时加载以及原因。如果规则应该加载但没有加载,请检查模式、基目录、前置内容,以及 --setting-sources 是否排除了项目设置(这会跳过项目规则)。
当规则已加载但 Claude 仍不遵循它时,我们的关于 AI 代理为何忽略指令文件的指南涵盖了其他原因。如果你给 Claude 的更正没有生效,我们的关于 Claude Code 忘记你的更正的指南解释了更正的去向。
在 MemoryLake 中设置
规则是存放关于代码库中代码应如何编写的指令的正确位置。它们不太适合存放背后的推理:为什么存在某种规范、尝试过哪些替代方案,以及哪些决策来自会议而非代码。这种上下文对多个代码库和多个工具都很重要。
MemoryLake 是一个记忆层,用于将此类上下文保存在你维护的一个列表中,供 Claude Code 和你连接的其他助手(如 Codex 和 ChatGPT)使用。
你自己用自己的语言编写条目。不会从你的 .claude/rules/ 文件、CLAUDE.md 文件、自动记忆或任何供应商的存储中读取、写入或删除任何内容。Claude Code 继续按照 Anthropic 描述的方式加载规则。
第 1 步:创建 API 密钥
登录并从控制面板生成密钥。该密钥属于你的 MemoryLake 工作区,与你的 Claude 账户分开。

第 2 步:上传你的第一条记忆
从规则背后的原因开始:为什么存在某种规范、它取代了什么,以及在此之前出了什么问题。每个条目一个要点,注明日期,并标记它所解释的代码库或规则文件。

第 3 步:连接你的 AI 和代理
连接 Claude Code 和你使用的其他助手。规则保留在代码库中,而推理在任何开展工作的地方都可用。

实践中的变化
第一个区别是 CLAUDE.md 变短了,且没有丢失任何内容。主题文件承载相同的指令,而范围规则在不需要它们的会话中停止占用上下文。
第二个区别是你清楚规则何时生效。无范围规则从一开始就在那里,并在压缩后返回。范围规则随第一个匹配文件到达,并可能在压缩后消失。
第三个区别是,缺失的规则是你可以通过 /context 和 InstructionsLoaded 钩子检查的东西,而不是你猜测的东西。
Claude Code 规则的最佳实践
每个文件一个主题。 根据涵盖的内容命名文件。
保持核心规则无范围。 它们在每次会话中加载并在压缩后存续。
仅对条件性内容设置范围。 并针对真实路径测试模式。
在前置内容中仅使用 paths。 其他字段会被忽略。
验证 YAML。 无效的前置内容会使范围规则在所有地方加载。
保持用户规则和项目规则一致。 两者都不会覆盖另一个。
使用 /context 检查。 并使用 InstructionsLoaded 钩子调试触发器。
结论
Claude Code 规则是 .claude/rules/ 中的 markdown 文件,按主题拆分你的指令。没有 paths 的规则在启动时加载,优先级与 .claude/CLAUDE.md 相同,并在压缩后重新注入。带有 paths 的规则在 Claude 读取、写入或编辑匹配文件时加载,压缩会将它们总结掉,直到它们再次被触发。~/.claude/rules/ 中的用户级规则在项目规则之前加载,且两者都不会覆盖另一个。
将冗长的指令拆分为主题文件,仅对真正具有条件性的指令设置范围,保持必须遵循的规则无范围,并使用 /context 检查加载的内容。