Claude 如何记住你的项目
通过 CLAUDE.md 文件为 Claude 提供持久指令,并让 Claude 通过自动记忆积累学习。
每个 Claude Code 会话都从一个全新的上下文窗口开始。两种机制在会话之间传递知识:
- CLAUDE.md 文件:你编写的指令,为 Claude 提供持久上下文
- 自动记忆:Claude 根据你的纠正和偏好自行编写的笔记
本页介绍如何:
- 编写和组织 CLAUDE.md 文件
- 将规则限定到特定文件类型,使用
.claude/rules/ - 配置自动记忆,让 Claude 自动记录笔记
- 故障排除,当指令未被遵循时
CLAUDE.md vs 自动记忆
Claude Code 有两个互补的记忆系统。两者都在每次对话开始时加载。Claude 将它们视为上下文,而非强制配置。你的指令越具体、越简洁,Claude 越一致地遵循它们。
| CLAUDE.md 文件 | 自动记忆 | |
|---|---|---|
| 谁编写 | 你 | Claude |
| 包含什么 | 指令和规则 | 学习和模式 |
| 范围 | 项目、用户或组织 | 每个仓库,跨 worktree 共享 |
| 加载到 | 每个会话 | 每个会话(前 200 行或 25KB) |
| 用于 | 编码标准、工作流、项目架构 | 构建命令、调试洞察、Claude 发现的偏好 |
当你想引导 Claude 的行为时使用 CLAUDE.md 文件。自动记忆让 Claude 从你的纠正中学习,无需手动操作。
子 Agent 也可以维护自己的自动记忆。详见子 Agent 配置。
CLAUDE.md 文件
CLAUDE.md 文件是 markdown 文件,为 Claude 提供项目、个人工作流或整个组织的持久指令。你用纯文本编写这些文件;Claude 在每个会话开始时读取它们。
何时添加到 CLAUDE.md
把 CLAUDE.md 当作你写下否则需要反复解释的内容的地方。在以下情况添加:
- Claude 第二次犯同样的错误
- 代码审查发现 Claude 应该知道的关于这个代码库的事情
- 你在聊天中输入了与上次会话相同的纠正或澄清
- 新队友需要相同的上下文才能高效工作
保持为 Claude 应在每个会话中持有的事实:构建命令、约定、项目布局、"始终做 X"规则。如果条目是多步骤过程或仅对代码库的一部分重要,将其移到技能或路径限定规则。扩展概述介绍了何时使用每种机制。
选择放置 CLAUDE.md 文件的位置
CLAUDE.md 文件可以存在于多个位置,每个有不同的范围。下表按加载顺序列出,从最广范围到最具体,因此项目指令在用户指令之后出现在上下文中。
| 范围 | 位置 | 目的 | 使用案例示例 | 与谁共享 |
|---|---|---|---|---|
| 托管策略 | macOS: /Library/Application Support/ClaudeCode/CLAUDE.md;Linux 和 WSL: /etc/claude-code/CLAUDE.md;Windows: C:\Program Files\ClaudeCode\CLAUDE.md | IT/DevOps 管理的组织级指令 | 公司编码标准、安全策略、合规要求 | 组织中的所有用户 |
| 用户指令 | ~/.claude/CLAUDE.md | 所有项目的个人偏好 | 代码风格偏好、个人工具快捷方式 | 仅你(所有项目) |
| 项目指令 | ./CLAUDE.md 或 ./.claude/CLAUDE.md | 团队共享的项目指令 | 项目架构、编码标准、常见工作流 | 通过源代码管理共享给团队成员 |
| 本地指令 | ./CLAUDE.local.md | 个人项目特定偏好;添加到 .gitignore | 你的沙箱 URL、首选测试数据 | 仅你(当前项目) |
工作目录上方目录层次结构中的 CLAUDE.md 和 CLAUDE.local.md 文件在启动时完整加载。子目录中的文件在 Claude 读取这些目录中的文件时按需加载。查看 CLAUDE.md 文件如何加载了解完整的解析顺序。
对于大型项目,你可以使用项目规则将指令拆分为特定主题的文件。规则让你将指令限定到特定文件类型或子目录。
设置项目 CLAUDE.md
项目 CLAUDE.md 可以存储在 ./CLAUDE.md 或 ./.claude/CLAUDE.md。创建此文件并添加适用于任何参与项目的指令:构建和测试命令、编码标准、架构决策、命名约定和常见工作流。这些指令通过版本控制与团队共享,因此专注于项目级标准而非个人偏好。
运行
/init自动生成初始 CLAUDE.md。Claude 分析你的代码库,创建包含它发现的构建命令、测试指令和项目约定的文件。如果 CLAUDE.md 已存在,/init会建议改进而非覆盖。从那里开始完善 Claude 无法自行发现的指令。设置CLAUDE_CODE_NEW_INIT=1启用交互式多阶段流程。/init询问要设置哪些构件:CLAUDE.md 文件、技能和 Hook。然后用子 Agent 探索你的代码库,通过后续问题填补空白,并在写入任何文件前呈现可审查的提案。
编写有效指令
CLAUDE.md 文件在每个会话开始时加载到上下文窗口,与对话一起消耗 Token。上下文窗口可视化显示 CLAUDE.md 相对于其他启动上下文的加载位置。因为它们是上下文而非强制配置,你编写指令的方式影响 Claude 遵循它们的可靠性。具体、简洁、结构良好的指令效果最好。
大小:目标每个 CLAUDE.md 文件不超过 200 行。更长的文件消耗更多上下文并降低遵循度。如果指令在增长,使用路径限定规则,这样指令仅在 Claude 处理匹配文件时加载。你也可以将内容拆分为导入以便组织,但导入的文件仍然在启动时加载并进入上下文窗口。
结构:使用 markdown 标题和项目符号对相关指令分组。Claude 扫描结构的方式与读者相同:有组织的部分比密集段落更容易遵循。
具体性:编写足够具体可以验证的指令。例如:
- "使用 2 空格缩进"而非"正确格式化代码"
- "提交前运行
npm test"而非"测试你的更改" - "API handler 位于
src/api/handlers/"而非"保持文件有序"
一致性:如果两条规则相互矛盾,Claude 可能会任意选择一条。定期审查你的 CLAUDE.md 文件、子目录中的嵌套 CLAUDE.md 文件和 .claude/rules/,删除过时或冲突的指令。在 monorepo 中,使用 claudeMdExcludes 跳过与你工作无关的其他团队的 CLAUDE.md 文件。
导入额外文件
CLAUDE.md 文件可以使用 @path/to/import 语法导入额外文件。导入的文件在启动时与引用它们的 CLAUDE.md 一起展开并加载到上下文中。
相对路径和绝对路径都允许。相对路径相对于包含导入的文件解析,而非工作目录。导入的文件可以递归导入其他文件,最大深度为五跳。
要引入 README、package.json 和工作流指南,在 CLAUDE.md 中的任何位置用 @ 语法引用它们:
See @README for project overview and @package.json for available npm commands for this project.
# Additional Instructions
- git workflow @docs/git-instructions.md对于不应提交到版本控制的私有项目偏好,在项目根目录创建 CLAUDE.local.md。它与 CLAUDE.md 一起加载,以相同方式对待。将 CLAUDE.local.md 添加到 .gitignore 以便不提交;运行 /init 并选择个人选项会为你完成此操作。
如果你在同一仓库的多个 git worktree 中工作,gitignored 的 CLAUDE.local.md 只存在于你创建它的工作树中。要在 worktree 之间共享个人指令,改为从主目录导入文件:
# Individual Preferences
- @~/.claude/my-project-instructions.mdClaude Code 首次遇到项目中的外部导入时,会显示一个列出文件的批准对话框。如果你拒绝,导入保持禁用,对话框不再出现。
有关组织指令的更结构化方法,请参阅 .claude/rules/。
AGENTS.md
Claude Code 读取 CLAUDE.md,不读取 AGENTS.md。如果你的仓库已经为其他编码 Agent 使用 AGENTS.md,创建一个导入它的 CLAUDE.md,这样两个工具读取相同的指令而不重复。你也可以在导入下方添加 Claude 特定的指令。Claude 在会话开始时加载导入的文件,然后追加其余部分:
@AGENTS.md
## Claude Code
Use plan mode for changes under `src/billing/`.如果你不需要添加 Claude 特定的内容,符号链接也可以:
ln -s AGENTS.md CLAUDE.md在 Windows 上,创建符号链接需要管理员权限或开发者模式,因此改用 @AGENTS.md 导入。
在已有 AGENTS.md 的仓库中运行 /init 会读取它并将相关部分纳入生成的 CLAUDE.md。它也会读取其他工具配置如 .cursorrules 和 .windsurfrules。
CLAUDE.md 文件如何加载
Claude Code 通过从当前工作目录向上遍历目录树来读取 CLAUDE.md 文件,检查每个目录中的 CLAUDE.md 和 CLAUDE.local.md 文件。这意味着如果你在 foo/bar/ 中运行 Claude Code,它会从 foo/bar/CLAUDE.md、foo/CLAUDE.md 以及它们旁边的任何 CLAUDE.local.md 文件加载指令。
所有发现的文件被连接到上下文中,而不是相互覆盖。跨目录树,内容从文件系统根目录向下排序到你的工作目录。对于 foo/bar/ 示例,foo/CLAUDE.md 出现在 foo/bar/CLAUDE.md 之前,因此更靠近你启动 Claude 的位置的指令最后读取。在每个目录中,CLAUDE.local.md 追加在 CLAUDE.md 之后,因此你的个人笔记是该级别 Claude 最后读取的内容。
Claude 也会发现当前工作目录下子目录中的 CLAUDE.md 和 CLAUDE.local.md 文件。不在启动时加载,而是在 Claude 读取这些子目录中的文件时包含。
如果你在大型 monorepo 中工作,其他团队的 CLAUDE.md 文件被拾取,使用 claudeMdExcludes 跳过它们。
CLAUDE.md 文件中的块级 HTML 注释(<!-- maintainer notes -->)在内容注入 Claude 上下文之前被剥离。用它们为人类维护者留下笔记,而不花费上下文 Token。代码块内的注释被保留。当你直接用 Read 工具打开 CLAUDE.md 文件时,注释仍然可见。
从额外目录加载
--add-dir 标志让 Claude 访问主工作目录之外的额外目录。默认情况下,不加载这些目录的 CLAUDE.md 文件。
要同时从额外目录加载记忆文件,设置 CLAUDE_CODE_ADDITIONAL_DIRECTORIES_CLAUDE_MD 环境变量:
CLAUDE_CODE_ADDITIONAL_DIRECTORIES_CLAUDE_MD=1 claude --add-dir ../shared-config这会从额外目录加载 CLAUDE.md、.claude/CLAUDE.md、.claude/rules/*.md 和 CLAUDE.local.md。如果你从 --setting-sources 中排除 local,则跳过 CLAUDE.local.md。
使用 .claude/rules/ 组织规则
对于大型项目,你可以使用 .claude/rules/ 目录将指令组织到多个文件中。这使指令模块化,更容易维护。规则也可以限定到特定文件路径,因此它们仅在 Claude 处理匹配文件时加载到上下文中,减少噪音并节省上下文空间。
规则在每个会话或打开匹配文件时加载到上下文中。对于不需要始终在上下文中的任务特定指令,改用技能,仅在你调用或 Claude 确定它们与你的提示相关时加载。
设置规则
将 markdown 文件放在项目的 .claude/rules/ 目录中。每个文件应涵盖一个主题,使用描述性文件名如 testing.md 或 api-design.md。所有 .md 文件被递归发现,因此你可以将规则组织到子目录如 frontend/ 或 backend/ 中:
your-project/
├── .claude/
│ ├── CLAUDE.md # Main project instructions
│ └── rules/
│ ├── code-style.md # Code style guidelines
│ ├── testing.md # Testing conventions
│ └── security.md # Security requirements没有 paths frontmatter 的规则在启动时加载,优先级与 .claude/CLAUDE.md 相同。
路径特定规则
规则可以使用带有 paths 字段的 YAML frontmatter 限定到特定文件。这些条件规则仅在 Claude 处理匹配指定模式的文件时适用。
---
paths:
- "src/api/**/*.ts"
---
# API Development Rules
- All API endpoints must include input validation
- Use the standard error response format
- Include OpenAPI documentation comments没有 paths 字段的规则无条件加载,适用于所有文件。路径限定规则在 Claude 读取匹配模式的文件时触发,而非每次工具使用时。
在 paths 字段中使用 glob 模式按扩展名、目录或任何组合匹配文件:
| 模式 | 匹配 |
|---|---|
**/*.ts | 任何目录中的所有 TypeScript 文件 |
src/**/* | src/ 目录下的所有文件 |
*.md | 项目根目录中的 Markdown 文件 |
src/components/*.tsx | 特定目录中的 React 组件 |
你可以指定多个模式并使用花括号扩展在一个模式中匹配多个扩展名:
---
paths:
- "src/**/*.{ts,tsx}"
- "lib/**/*.ts"
- "tests/**/*.test.ts"
---使用符号链接跨项目共享规则
.claude/rules/ 目录支持符号链接,因此你可以维护共享规则集并将它们链接到多个项目。符号链接正常解析和加载,循环符号链接被检测并优雅处理。
此示例链接了共享目录和单个文件:
ln -s ~/shared-claude-rules .claude/rules/shared
ln -s ~/company-standards/security.md .claude/rules/security.md用户级规则
~/.claude/rules/ 中的个人规则适用于你机器上的每个项目。将它们用于非项目特定的偏好:
~/.claude/rules/
├── preferences.md # Your personal coding preferences
└── workflows.md # Your preferred workflows用户级规则在项目规则之前加载,给予项目规则更高的优先级。
为大型团队管理 CLAUDE.md
对于跨团队部署 Claude Code 的组织,你可以集中管理指令并控制加载哪些 CLAUDE.md 文件。
部署组织级 CLAUDE.md
组织可以部署一个集中管理的 CLAUDE.md,适用于机器上的所有用户。此文件不能被个人设置排除。
在托管策略位置创建文件:
- macOS:
/Library/Application Support/ClaudeCode/CLAUDE.md - Linux 和 WSL:
/etc/claude-code/CLAUDE.md - Windows:
C:\Program Files\ClaudeCode\CLAUDE.md
- macOS:
用配置管理系统部署:使用 MDM、组策略、Ansible 或类似工具将文件分发到开发者机器。查看托管设置了解其他组织级配置选项。
claudeMd 键让你将托管 CLAUDE.md 内容直接放在 managed-settings.json 中,而不是部署单独的文件。
范围:机器上的每个 Claude Code 会话,在每个仓库中。对于仓库特定的指导,改为提交项目 CLAUDE.md。
优先级:与托管 CLAUDE.md 文件相同。在用户和项目 CLAUDE.md 之前加载。
在哪里生效:仅在托管和策略设置中。在用户、项目或本地设置中设置 claudeMd 无效。
以下示例在托管设置文件中直接添加行为指令:
{
"claudeMd": "Always run `make lint` before committing.\nNever push directly to main."
}托管 CLAUDE.md 和托管设置服务于不同目的。使用设置进行技术强制,使用 CLAUDE.md 进行行为指导:
| 关注点 | 在哪里配置 |
|---|---|
| 阻止特定工具、命令或文件路径 | 托管设置:permissions.deny |
| 强制沙箱隔离 | 托管设置:sandbox.enabled |
| 环境变量和 API 提供商路由 | 托管设置:env |
| 认证方法和组织锁定 | 托管设置:forceLoginMethod、forceLoginOrgUUID |
| 代码风格和质量指南 | 托管 CLAUDE.md |
| 数据处理和合规提醒 | 托管 CLAUDE.md |
| Claude 的行为指令 | 托管 CLAUDE.md |
设置规则由客户端强制执行,无论 Claude 决定做什么。CLAUDE.md 指令塑造 Claude 的行为,但不是硬性强制层。
排除特定 CLAUDE.md 文件
在大型 monorepo 中,祖先 CLAUDE.md 文件可能包含与你工作无关的指令。claudeMdExcludes 设置让你按路径或 glob 模式跳过特定文件。
此示例排除了父文件夹中的顶级 CLAUDE.md 和规则目录。将其添加到 .claude/settings.local.json 使排除仅限于你的机器:
{
"claudeMdExcludes": [
"**/monorepo/CLAUDE.md",
"/home/user/monorepo/other-team/.claude/rules/**"
]
}模式使用 glob 语法与绝对文件路径匹配。你可以在任何设置层配置 claudeMdExcludes:用户、项目、本地或托管策略。数组跨层合并。
托管策略 CLAUDE.md 文件不能被排除。这确保组织级指令始终适用,无论个人设置如何。
自动记忆
自动记忆让 Claude 无需你编写任何内容即可跨会话积累知识。Claude 在工作时为自己保存笔记:构建命令、调试洞察、架构笔记、代码风格偏好和工作流习惯。Claude 不是每个会话都保存内容。它根据信息是否在未来对话中有用来决定是否值得记住。
自动记忆需要 Claude Code v2.1.59 或更高版本。使用
claude --version检查你的版本。
启用或禁用自动记忆
自动记忆默认开启。要切换,在会话中打开 /memory 使用自动记忆开关,或在项目设置中设置 autoMemoryEnabled:
{
"autoMemoryEnabled": false
}要通过环境变量禁用自动记忆,设置 CLAUDE_CODE_DISABLE_AUTO_MEMORY=1。
存储位置
每个项目在 ~/.claude/projects/<project>/memory/ 有自己的记忆目录。<project> 路径从 git 仓库派生,因此同一仓库中的所有 worktree 和子目录共享一个自动记忆目录。在 git 仓库外,使用项目根目录。
要将自动记忆存储在不同位置,在用户设置 ~/.claude/settings.json 中设置 autoMemoryDirectory:
{
"autoMemoryDirectory": "~/my-custom-memory-dir"
}值必须是绝对路径或以 ~/ 开头。此设置从策略和用户设置以及 --settings 标志接受。不从项目或本地设置接受,因为两个文件都在项目目录内,克隆的仓库可以提供任一文件将自动记忆写入重定向到敏感位置。
目录包含一个 MEMORY.md 入口点和可选的主题文件:
~/.claude/projects/<project>/memory/
├── MEMORY.md # Concise index, loaded into every session
├── debugging.md # Detailed notes on debugging patterns
├── api-conventions.md # API design decisions
└── ... # Any other topic files Claude createsMEMORY.md 充当记忆目录的索引。Claude 在整个会话中读取和写入此目录中的文件,使用 MEMORY.md 跟踪存储位置。
自动记忆是机器本地的。同一 git 仓库中的所有 worktree 和子目录共享一个自动记忆目录。文件不跨机器或云环境共享。
工作原理
MEMORY.md 的前 200 行或前 25KB(以先到者为准)在每个对话开始时加载。超过该阈值的内容不会在会话开始时加载。Claude 通过将详细笔记移入单独的主题文件来保持 MEMORY.md 简洁。
此限制仅适用于 MEMORY.md。CLAUDE.md 文件无论长度都完整加载,尽管较短的文件产生更好的遵循度。
主题文件如 debugging.md 或 patterns.md 不在启动时加载。Claude 在需要信息时使用标准文件工具按需读取它们。
Claude 在你的会话中读取和写入记忆文件。当你在 Claude Code 界面中看到 "Writing memory" 或 "Recalled memory" 时,Claude 正在主动更新或读取 ~/.claude/projects/<project>/memory/。
审计和编辑你的记忆
自动记忆文件是纯 markdown,你可以随时编辑或删除。运行 /memory 从会话中浏览和打开记忆文件。
使用 /memory 查看和编辑
/memory 命令列出当前会话中加载的所有 CLAUDE.md、CLAUDE.local.md 和规则文件,让你切换自动记忆的开关,并提供打开自动记忆文件夹的链接。选择任何文件在编辑器中打开。
当你让 Claude 记住某些事情,如 "always use pnpm, not npm" 或 "remember that the API tests require a local Redis instance",Claude 将其保存到自动记忆。要将指令添加到 CLAUDE.md,直接告诉 Claude,如 "add this to CLAUDE.md",或通过 /memory 自己编辑文件。
故障排除记忆问题
这些是 CLAUDE.md 和自动记忆最常见的问题,以及调试步骤。
Claude 没有遵循我的 CLAUDE.md
CLAUDE.md 内容作为用户消息在系统提示之后传递,而非系统提示本身。Claude 读取它并尝试遵循,但不保证严格遵守,特别是对于模糊或冲突的指令。
调试:
- 运行
/memory验证你的 CLAUDE.md 和 CLAUDE.local.md 文件是否被加载。如果文件未列出,Claude 看不到它。 - 检查相关 CLAUDE.md 是否在会话加载的位置(参见选择放置 CLAUDE.md 文件的位置)。
- 使指令更具体。"使用 2 空格缩进"比"正确格式化代码"效果更好。
- 检查 CLAUDE.md 文件之间是否有冲突指令。如果两个文件对同一行为给出不同指导,Claude 可能会任意选择一个。
如果指令是必须在特定点运行的内容,如每次提交前或每次文件编辑后,改为将其编写为 Hook。Hook 作为 shell 命令在固定生命周期事件执行,无论 Claude 决定做什么都适用。
对于你希望在系统提示级别的指令,使用 --append-system-prompt。这必须在每次调用时传递,因此更适合脚本和自动化而非交互使用。
使用
InstructionsLoadedHook 记录哪些指令文件被加载、何时加载以及为什么。这对调试路径特定规则或子目录中延迟加载的文件很有用。
我不知道自动记忆保存了什么
运行 /memory 选择自动记忆文件夹浏览 Claude 保存的内容。一切都是纯 markdown,你可以阅读、编辑或删除。
我的 CLAUDE.md 太大了
超过 200 行的文件消耗更多上下文并可能降低遵循度。使用路径限定规则仅在 Claude 处理匹配文件时加载指令,或裁剪每个会话不需要的内容。拆分为 @path 导入有助于组织但不减少上下文,因为导入的文件在启动时加载。
/compact 后指令似乎丢失了
项目根目录的 CLAUDE.md 在压缩后存活:/compact 后,Claude 从磁盘重新读取并重新注入到会话中。子目录中的嵌套 CLAUDE.md 文件不会自动重新注入;它们在 Claude 下次读取该子目录中的文件时重新加载。
如果指令在压缩后消失,它要么只在对话中给出,要么位于尚未重新加载的嵌套 CLAUDE.md 中。将仅对话的指令添加到 CLAUDE.md 使其持久。查看什么在压缩后存活了解完整分解。
查看编写有效指令了解大小、结构和具体性的指导。
相关资源
- 调试你的配置:诊断 CLAUDE.md 或设置未生效的原因
- 技能:打包按需加载的可重复工作流
- 设置:使用设置文件配置 Claude Code 行为
- 子 Agent 记忆:让子 Agent 维护自己的自动记忆