一个 Claude Code 真正会遵守的 CLAUDE.md:Terraform 实战示例
Claude Code 每次启动会话,都会读取仓库根目录下的 CLAUDE.md。这是它的项目记忆:你写进去的东西,它都会记着,不用反复交代。问题是,我见过的大多数 CLAUDE.md 都只是一堆空话(“写干净的代码”“遵循最佳实践”),起不到任何实际作用。下面我们写一个真正管用的,而且挑一个出错代价高昂的场景:用 Terraform 管理基础设施。
一、给出确切的命令,而不是描述
Claude 是要执行命令的。把安全的命令交给它,并明确说明怎么用:
命令(安全,只读或本地执行)
- 格式化:terraform fmt -recursive
- 校验:terraform validate
- Lint:tflint --recursive
- 计划:terraform plan -out=tfplan,再用 terraform show tfplan 查看
“校验一下代码”是含糊的,terraform validate 则不含糊。如果团队用的是 OpenTofu,把 terraform 换成 tofu 即可,命令完全一样。
二、模型猜不到的团队约定
Terraform 本身 Claude 已经懂。它不知道的是你们团队怎么用它。只写这部分,规则不够显然时补上原因:
- 用
for_each配合稳定的键,而不是count(用count时,列表顺序一变,资源就会被重建)。 - 重命名资源时用
moved {}块,而不是先销毁再重建。 - 敏感变量要标
sensitive = true;密钥从密钥管理服务取,绝不写进.tfvars。
括号里的原因很重要:有了它,Claude 能把你没列出来的情况也按同一条思路处理。
三、带“停止点”的工作流程
基础设施即代码(IaC)的关键,是划清 Claude 的工作到哪结束、你的工作从哪开始:
流程
1. 阅读受影响的模块和环境。
2. 做最小的改动。
3. 跑 fmt + validate + tflint + plan。
4. 总结计划:哪些资源会创建、修改、销毁。
真正执行变更由人来完成。第 4 步把 300 行的计划变成一分钟就能看完的摘要,同时明确 apply 不归它管。
四、“不要做”这一节
这是最重要、也最容易被忽略的一节:
不要做
- 绝不在未经明确批准的情况下执行 terraform apply、terraform destroy、-auto-approve、terraform state rm/mv 或 terraform import。
- 不要手动编辑
.tfstate,也不要把它提交到仓库。 - 要提交
.terraform.lock.hcl。
有一点需要注意:CLAUDE.md 能引导 Claude 的行为,但它不是技术层面的强制约束。想真正拦住某条命令,得配合 .claude/settings.json 里的权限规则(deny)或者 PreToolUse 钩子。两层一起用才最稳妥。
5. 保持简短,持续维护
控制在 30 到 80 行,因为每次会话都会完整加载它。如果同一件事上纠正了 Claude 两次,就把这条纠正写进 CLAUDE.md。在 Claude Code 里用 /memory 就能直接编辑,不用退出会话。如果是 monorepo(多包仓库),给每个包放一个 CLAUDE.md(比如 infra/CLAUDE.md、api/CLAUDE.md):Claude 在那个目录下工作时会读到对应的文件。
快速验证
写完之后,开一个新会话,让它做这件事:
“在 dev 环境里加一个用来存日志的 S3 桶。”
如果 Claude 会格式化、做校验、生成 plan、给你摘要,然后停下来不执行 apply,说明你的 CLAUDE.md 起作用了。
觉得有用的话:这个示例出自《15 个按技术栈分类的 CLAUDE.md 模板(面向 Claude Code)》,西班牙语版,按需付费,1 美元起。更多免费资源在 GitHub 上。
Claude Code 每次启动会话时,都会读取仓库根目录下的 CLAUDE.md。这是它的项目记忆:你写在这里的内容,它会一直记着,不必反复交代。问题在于,我见过的大多数 CLAUDE.md 都只是一堆美好的愿望(“写干净的代码”“遵循最佳实践”),实际上什么也改变不了。下面我们就来写一份真正管用的,选的场景是那种一旦出错代价很高的:用 Terraform 管理基础设施。
1. 写精确的命令,而不是描述
Claude 会……