主流 Agent 入门教程 / Claude Code
9. 用CLAUDE-md教会Claude理解项目
原文备份 · 第 11 / 28 篇 · 查看极客时间原知识库 ↗
本篇目录 · 15 节
来源:Claude Code
预计用时:35~50 分钟
本篇目标:加入一份简短的项目说明和一份路径 Rules,并用静态检查、/context和全新会话证明它们在正确时机加载;同时分清 Auto Memory 与安全规则。
前几篇反复说明“不安装依赖、源菜谱只读、测试要跑完整套件”。这些是每次会话都应知道的项目事实,适合进入 CLAUDE.md。只有处理菜谱 JSON 时才需要的字段约束,则放进按路径加载的 Rules,避免每轮占用上下文。
开始状态
从第 8 篇的主 MealCraft 项目开始:
macOS、Linux 或 WSL2:
cd ~/claude-code-course/mealcraft
git status --short
python3 scripts/verify_security_lab.py --after
Windows PowerShell:
Set-Location "$HOME\claude-code-course\mealcraft"
git status --short
py scripts/verify_security_lab.py --after
如果你没有保留 output/security-probe.txt,安全检查器的 --after 会失败;这不影响本篇,可先只确认 .claude/settings.json 存在、测试通过且 data/recipes 没有 Diff。
开始复制前,退出当前 Claude Code 会话。CLAUDE.md 在新会话启动时加载,使用旧会话会让验证结果含糊。
一、三种机制各自保存什么
| 机制 | 谁写 | 适合内容 | 加载方式 |
|---|---|---|---|
CLAUDE.md |
你 | 每次都要知道的命令、架构、项目约束 | 新会话启动时加载 |
.claude/rules/*.md |
你 | 某类路径或主题的细节 | 无 paths 时总是加载;有 paths 时匹配文件被读取后加载 |
| Auto Memory | Claude | 从纠正中形成的项目经验和个人偏好 | 每个仓库自动维护并在会话中加载 |
三者都是给模型看的上下文,不是强制访问控制。第 8 篇的 permissions.deny 和 Sandbox 才负责硬边界。即使 CLAUDE.md 写着“不要改菜谱”,也不能因此删除 Edit(/data/recipes/**)。
二、复制课程提供的简短说明
设置教程根目录变量;占位符必须替换。
macOS、Linux 或 WSL2:
export COURSE_SOURCE="/替换为实际路径/claude-code-tutorial-v0.2"
test -f "$COURSE_SOURCE/exercise-assets/mealcraft/memory-kit/CLAUDE.md"
test ! -e CLAUDE.md
test ! -e .claude/rules/recipe-data.md
cp -R "$COURSE_SOURCE/exercise-assets/mealcraft/memory-kit/." .
Windows PowerShell:
$CourseSource = "C:\替换为实际路径\claude-code-tutorial-v0.2"
if (-not (Test-Path "$CourseSource\exercise-assets\mealcraft\memory-kit\CLAUDE.md")) { throw "上下文素材路径错误" }
if (Test-Path CLAUDE.md) { throw "项目已有 CLAUDE.md,请先人工比较" }
if (Test-Path ".claude\rules\recipe-data.md") { throw "项目已有同名 Rules,请先人工比较" }
Copy-Item "$CourseSource\exercise-assets\mealcraft\memory-kit\*" -Destination . -Recurse
New-Item -ItemType Directory -Force ".claude\rules" | Out-Null
Copy-Item "$CourseSource\exercise-assets\mealcraft\memory-kit\.claude\rules\recipe-data.md" -Destination ".claude\rules\recipe-data.md"
如果已有说明文件,停止复制并人工合并,不要覆盖。重复或矛盾的指令会降低遵循度。
新增文件:
CLAUDE.md
.claude/rules/recipe-data.md
scripts/verify_project_instructions.py
三、先自己读,不让 Claude 替你背书
CLAUDE.md 只保留每次都会用到的内容:
- MealCraft 的个人、本地项目定位与技术栈;
- 重要路径的职责;
- macOS/Linux/WSL2 与 Windows 测试、运行命令;
- 源菜谱只读、临时测试、UTF-8 和结构化错误等约束;
- “完成”必须包含哪些验证和 Diff 审查。
recipe-data.md 的开头是:
---
paths:
- "data/recipes/**/*.json"
- "tests/fixtures/**/*.json"
---
paths 是 Rules frontmatter 当前读取的唯一字段。它使这份规则只在 Claude 处理匹配的 JSON 时进入上下文;若 YAML 无法解析,规则可能退化为无条件加载,因此要验证语法和行为。
四、用静态检查器验证文件结构
macOS、Linux 或 WSL2:
python3 scripts/verify_project_instructions.py
Windows PowerShell:
py scripts/verify_project_instructions.py
预期输出:
PASS: MealCraft 项目说明简洁,路径 Rules 结构完整
检查器会验证:
CLAUDE.md不超过本课程设定的 80 行;- 真实命令、路径、Windows 分支和完成标准存在;
- Rules 的 frontmatter 位于文件第一行且包含两个固定 glob;
- 第 8 篇共享安全设置仍存在;
- 项目说明没有密钥变量或演示密钥内容。
再运行:
git diff --check
git status --short
预期只多出这三个课程文件,没有菜谱或安全配置被改写。
五、用 /context 证明启动说明已加载
从 MealCraft 根目录启动一个全新会话:
claude
输入:
/context
在 Memory files 区域确认项目 CLAUDE.md 已加载。界面布局可能随版本变化,稳定判断标准是能看到当前项目的文件路径,而不是某个固定颜色或位置。
此时先不要读取菜谱,发送:
不要调用工具。仅根据启动时已经加载的项目说明,告诉我完整测试命令、源菜谱目录和“完成”的三个证据。
预期回答包含完整 unittest 命令、data/recipes、完整测试/发布检查或人工验证、Git Diff。它不应建议安装框架或访问外部 API。
如果答不出来,先检查启动目录和 /context,不要立即把同样内容追加十遍。
六、触发并验证路径 Rules
发送一个明确的只读任务:
只读 data/recipes/tomato-eggs.json。列出这份菜谱必须遵守的数据规则,并标明规则来自哪个项目文件。不要修改任何文件。
Claude 读取匹配文件后,recipe-data.md 应进入上下文。再次运行:
/context
确认 Memory files 中出现 .claude/rules/recipe-data.md,或当前界面明确显示该 Rules 已加载。然后核对 Claude 的回答至少包含:文件名与 id 一致、amount 保持字符串、UTF-8、源菜谱不被浏览或换算改写。
独立磁盘检查:
git diff -- data/recipes
应无输出。/context 证明规则进入模型上下文,Git 则证明只读任务没有产生副作用。
七、用 Plan Mode 检查规则是否指导决策
输入:
/plan 为 MealCraft 增加一份名为“紫菜蛋花汤”的本地菜谱
补充:
只给出计划和需要确认的信息,不要创建或修改文件。
计划应自然引用现有契约,例如 kebab-case id、UTF-8、amount 字符串、固定字段、数据检查和完整 unittest,而不是重新发明 schema。
若计划遗漏规则,先问 Claude 它实际加载了哪些 Memory files。仍然遗漏时,改写一条更具体的说明,而不是把整份 REQUIREMENTS.md 复制进 CLAUDE.md。
退出 Plan 后运行 git status --short,确认没有新菜谱。
八、用全新会话验证跨会话持久性
输入 /exit,然后仍从 MealCraft 根目录重新运行:
claude
不要恢复旧会话。直接发送:
不要调用工具。只根据新会话启动上下文,用不超过 8 条说明 MealCraft 的技术边界、测试命令和完成标准。
如果回答仍符合 CLAUDE.md,说明持久性来自磁盘文件,而不是上一段聊天记忆。会话内容可以丢失,项目说明仍会在新会话加载。
九、检查 Auto Memory,但不把它当项目文档
输入:
/memory
当前命令会列出项目与用户范围的 CLAUDE 文件、Rules、Auto Memory 开关和存放位置。只浏览,不需要为了本篇强制开启或关闭。
Auto Memory 适合保存 Claude 从纠正中学到、又无法直接从代码推导的经验。它不适合保存:
- API Key、账号、个人路径或私人数据;
- 必须由所有读者共享的构建和测试契约;
- 应该由测试、权限或 Sandbox 强制的安全边界;
- 只对当前一次任务有用的临时状态。
Auto Memory 按仓库维护并跨 worktree 共享;它由 Claude 写,不进入你的 Git 项目历史。需要所有人看到的事实应写入项目 CLAUDE.md、Rules、README 或测试。
十、/init、AGENTS.md 与审计边界
在一个没有项目说明的新仓库中,/init 可以分析代码并生成 CLAUDE.md 起点。如果文件已经存在,当前行为是提出改进而不是静默覆盖。本课程已经提供并验证了短文件,不需要再运行 /init。
当前 Claude Code 也能读取 AGENTS.md,但默认情况下,工作目录或上级目录已经有 CLAUDE.md 时,不会同时自动加载项目 AGENTS.md。已有多 Agent 说明的仓库应先核对 Project instructions 设置或显式导入,不要假设两份文件都会生效。
如果你的 /help 中存在 /doctor prompt-audit,可选运行它审计过时、冲突或找不到目标的项目说明。它先给报告,不应在未经确认时修改文件。无此命令时,静态检查器、/context 和人工 Diff 已足够完成本篇。
十一、提交共享上下文
在 Claude Code 中运行 /diff,外部终端执行:
git status --short
git diff --check
git diff -- data/recipes .claude/settings.json
最后一条命令应无输出。提交共享文件:
git add CLAUDE.md .claude/rules/recipe-data.md scripts/verify_project_instructions.py
git diff --cached --check
git commit -m "document MealCraft project context"
不要把 Auto Memory 目录、个人 CLAUDE.local.md 或用户级 ~/.claude/CLAUDE.md 加入项目提交。
本篇验收清单
- 能解释 CLAUDE.md、路径 Rules 与 Auto Memory 的作者、范围和加载时机;
- 静态检查器输出
PASS; - 新会话
/context显示项目CLAUDE.md; - 读取菜谱 JSON 后,路径 Rules 出现在已加载上下文中;
- Plan Mode 的菜谱计划引用固定 schema 与验证,而磁盘没有变化;
- 第二个全新会话仍能根据启动上下文回答项目边界;
/memory已检查,但未写入密钥或把 Auto Memory 当安全策略;- Git 提交只包含共享项目说明、Rules 和检查脚本。
关键排错
/context 看不到 CLAUDE.md:确认从 MealCraft 根目录启动、文件名大小写正确且不是只在旧会话中新增。退出后新建会话再查。
路径 Rules 一开始就无条件出现:检查 frontmatter 是否从文件第一行开始、两个 --- 是否闭合、paths 缩进是否有效。无效 YAML 会让规则失去条件范围。
读取菜谱后仍看不到 Rules:确认读取路径实际匹配 data/recipes/**/*.json,再用 /context 查看。不要用只讨论文件名、但从未让 Read 工具打开文件的提示代替触发。
说明越来越长:把只适用于特定文件的内容移入 Rules,把多步骤流程留给后面的 Skill。CLAUDE.md 应保存每次都需要的最小事实,而不是复制整份手册。
本篇小结
MealCraft 现在有两层可维护上下文:短 CLAUDE.md 提供每次会话都需要的项目事实,路径 Rules 只在处理菜谱数据时加入细节。/context 和全新会话证明加载行为,权限与 Sandbox 继续负责强制边界。
下一篇会用 MealCraft 2.0 的分阶段升级学习会话恢复、分支、压缩、/fork 与后台 Agent;项目事实仍以文件、Git 和测试为准。
官方参考: