工具大全
开发者工具作者:Coocon2026年9月12日340 次阅读约 4 分钟阅读

CLAUDE.md 不是 README:给 Claude Code 写规则的 5 条硬规矩

Claude Code 启动时会读项目根目录的 CLAUDE.md,把内容塞进每一轮对话的上下文。很多人第一反应是:那我把 README 贴进去,再把架构文档贴进去,越全越好。

然后发现它该守的规矩不守,不该动的文件照动,跑测试时总用错命令。

问题不在 Claude Code,在于 CLAUDE.md 不是给人看的文档,是给模型的常驻指令。文档追求完整,指令追求命中。按写文档的思路写它,字越多命中率越低。下面五条规矩,是我在自己的项目里改了几十版之后留下来的。

规矩一:只写代码里推不出来的东西

模型能读代码。目录结构、函数签名、依赖列表,它自己 ls 和 grep 一下就知道,你写进 CLAUDE.md 只是浪费上下文,还会在代码变化后变成过期信息误导它。

该写的是从代码里推不出来的事实:

  • 构建、测试、类型检查用什么命令。npm test 还是 npm run test:unit,跑全量还是只跑单个文件,模型猜不到。
  • 环境的怪癖。比如「访问 GitHub 必须走本机代理 127.0.0.1:7897」「数据库迁移只能在容器里跑」。
  • 团队约定。ES 模块不用 CommonJS、接口统一返回 { code, msg, data }、分页排序由后端负责前端不翻转。
  • 红线。不动 .env、不 git push、不删文件。

一个判断方法:这句话删掉之后,模型靠读代码能不能得出同样的结论?能,就删。

规矩二:越短越管用

CLAUDE.md 的每一个字都在每一轮对话里重复出现。它不只是花钱,更重要的是稀释注意力。三百行的 CLAUDE.md 里藏一条「禁止修改 schema」,和三十行里放同一条,模型的遵守率差得很远。

Anthropic 自己的建议是:保持简洁、人类可读、像调提示词一样反复迭代。他们还提了一个实用技巧,对真正重要的规则加 IMPORTANT 或 YOU MUST 这类强调,能明显提高遵守率。反过来说,如果你每条都加强调,等于没加。

我的做法是给 CLAUDE.md 设一个预算:常驻部分不超过一屏。超出的内容要么删,要么用下一条规矩分出去。

规矩三:硬规则交给 hooks,不靠文字

「每次改完 TypeScript 文件自动跑类型检查」「提交前必须跑 lint」「禁止执行 rm -rf」,这类要求写在 CLAUDE.md 里是请求,模型大概率照做,但不保证。

Claude Code 有 hooks 机制,配置在 .claude/settings.json 里,在工具调用前后执行你指定的 shell 命令。写在这里的是规则,由运行环境执行,模型绕不过去。

{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Edit|Write",
        "hooks": [
          { "type": "command", "command": "npm run typecheck" }
        ]
      }
    ]
  }
}

区分标准:违反了会造成损失的,用 hooks;违反了只是不好看的,用文字。 我的项目里 CLAUDE.md 只剩风格约定,安全类的全在 hooks 里。

规矩四:按层级拆,别堆在一个文件里

Claude Code 会按层级读多个 CLAUDE.md,从外到内依次是:

位置 作用范围 适合放什么
~/.claude/CLAUDE.md 你所有项目 个人偏好:回复语言、回答长度、验证习惯
./CLAUDE.md 当前项目,提交到仓库 团队共享的命令、约定、红线
./子目录/CLAUDE.md 只在读取该目录文件时加载 某个模块的特殊规则

子目录那一层是按需加载的:模型读到 src/payments/ 下的文件时,才会把 src/payments/CLAUDE.md 拉进上下文。这意味着你可以把支付模块的二十条注意事项放进去,而不影响其他任务的上下文预算。

另外它支持 @路径 引用其他文件:

详细的 API 约定见 @docs/api-conventions.md

引用的文件在需要时才被读取,正文里只留一行指针。用这个代替整段复制粘贴。

规矩五:被纠正后当场回写

这是五条里最重要的一条,也是最少人做的。

你纠正了 Claude Code 一次,「不要用 CommonJS」,这次它改了。下次开新会话,它又用了。因为上下文没了,纠正也没了。

每一次纠正,都应该变成 CLAUDE.md 或旁边一个 lessons 文件里的一行。 我的项目里有个 tasks/lessons.md,格式固定为「现象、根因、解法」,CLAUDE.md 里写一句「会话开始时先读它」。三个月下来,同一个错误几乎不会犯第二次。

这一条的本质是:CLAUDE.md 不是写完就放着的配置,是一个随着你纠正次数增长的记忆。写它的最好时机不是项目开始,是每次你想说「我不是说过了吗」的时候。

一份可以直接抄的骨架

# 项目名

## 命令
- 构建:npm run build
- 类型检查:npm run typecheck(改完 TS 必跑)
- 测试:npm run test -- <文件>(只跑相关的,不跑全量)

## 约定
- ES 模块,不用 require
- 接口统一返回 { code, msg, data }
- 分页排序由后端负责,前端不做 reverse

## 环境
- 访问 GitHub / npm 官方源需要代理:HTTPS_PROXY=http://127.0.0.1:7897
- 数据库迁移只在容器内执行

## 红线
- 不改 .env,不 git push,不删文件
- 找根因,不打临时补丁

## 记忆
- 会话开始先读 tasks/lessons.md;被纠正后把模式写进去

三十行不到。剩下的内容,要么模型能从代码里读到,要么放到子目录和 @ 引用里,要么变成 hooks。

最后

写 CLAUDE.md 和写提示词是同一件事:你不是在描述项目,你是在纠正模型的默认行为。 它默认会做的事不用写,它默认做错的事才值得写。从这个角度看,一份好的 CLAUDE.md 应该越用越长,但每一行都对应一次你真实踩过的坑。

问一句:你的 CLAUDE.md 现在多少行?超过一百行的,评论区说一下里面最长的是哪一段,我猜是目录结构。

相关文章

Claude Code 禁止 rm -rf 怎么配:deny 规则两周拦下 14 次,实测还有 7 种写法照样能删,一个 hook 补齐

为了防 Claude Code 误删文件,我在全局 settings 里加了一条 deny 规则 Bash(rm -rf *)。翻本机 10 月 7 日到 21 日的会话记录:这条规则拦下 14 次删除,模型被拒后 8 次换新目录名、6 次直接放弃删除,一次都没换写法绕过。但在 Claude Code 2.1.285 上用 stub 逐字回放 22 种删除写法后发现:rm -fr、rm -r -f、rm -Rf、rm -r 在手动、auto、bypass 三种模式下都照删不误,/bin/rm、find -delete、bash -c 在手动和 bypass 模式下也能删。auto 模式下,工作目录内的 rm -fr 会被当成「acceptEdits 也会放行」的操作,连分类器都不过。另一道闸是内置的 dangerous-rm 检查,目标是 $D/* 这类变量展开时触发,bypass 模式也拦;多行命令里前面有 heredoc,它就跟不上同一条命令里的变量赋值。文末给出一个 PreToolUse hook,三种模式下补齐全部递归删除写法,并告诉模型被拒后该怎么做。

claude-codehooks+5
pitfalls2026年10月21日7 min
207

Claude Code 接 DeepSeek / GLM / Kimi 开 auto 模式:temporarily unavailable 括号里的原因怎么看,哪些重试没用(故障注入实测)

用第三方模型跑 Claude Code auto 模式,每个有副作用的动作都会用你的会话模型向同一个后端多发一次判定请求:系统提示词 132,470 字符,单次约 2.97 万输入 token,比主循环那一步还多。判定请求一失败,就出现「xxx is temporarily unavailable, so auto mode cannot determine the safety of Bash」。本文用故障注入代理把每种失败对应的报错原文测了一遍:500 → (server error)、429 → (rate-limited)、529 → (overloaded)、断连 → (connection failed),这几种会自动重试 5 次;超过 60 秒没回 → (timed out);**没有括号 = 后端拒收(4xx),只试 1 次,重试多少遍都一样**;后端回了但模型没给判定 → could not evaluate,连续 3 次就退回人工确认。另外实测 CLAUDE_CODE_AUTO_MODE_MODEL 不生效,判定器只能跟着会话模型换。Claude Code 2.1.285,真实后端 DeepSeek v4-pro 与小米 MiMo v2.5。

claude-codedeepseek+7
pitfalls2026年10月11日11 min
643

Claude Code 上下文太长怎么办:Prompt is too long 会自动压缩,中转站 / DeepSeek 的 maximum context length 却不会(实测)

Claude Code 靠报错文案判断「上下文太长」:后端说 prompt is too long 或 input is too long for requested model,它会自动压缩对话后重发,用户无感;DeepSeek 和 OpenAI 风格中转返回的 This model's maximum context length is …,它不认识,直接报 API Error: 400,每轮都失败。手动 /compact 有效;更好的办法是用 CLAUDE_CODE_MAX_CONTEXT_TOKENS(非 claude- 模型 ID)或 CLAUDE_CODE_AUTO_COMPACT_WINDOW(claude- 模型 ID)告诉它真实上限,让它提前压缩。Claude Code 2.1.285 + 本地 stub 实测。

claude-codedeepseek+6
pitfalls2026年10月5日8 min
726

Claude Code 一直卡住、转圈没反应怎么办:后端不回时它要等 6 分钟,重试满 10 次可能卡一个多小时(实测)

Claude Code 转圈不动、或者停在 Retrying in 0s,多半是后端没有回数据。实测 2.1.285(API key + ANTHROPIC_BASE_URL):后端不回响应头时每次等 6 分钟(360 秒)才判超时,把 API_TIMEOUT_MS 调到 60 万、90 万也不变,只能调小;默认重试 10 次,总共可能卡一个多小时。中转站如果把回复缓冲到生成完才返回,超过 6 分钟的回复永远拿不到。按 Esc 可以随时中断。全部在本地 stub 上实测。

claude-code中转站+6
pitfalls2026年10月5日10 min
649