乐于分享
好东西不私藏

读了Claude Code泄露的源码,发现我们都用错了

读了Claude Code泄露的源码,发现我们都用错了

它不是聊天工具,是一个被伪装成终端的 Agent 编排平台

整个下午AI圈震动了,原来是Claude居然把自己亲儿子的源码泄露了。

今天这篇文章,我把源代码里藏着的 9 个核心秘密整理出来,告诉你那些高手到底是怎么用的。


01 CLAUDE.md:每一轮对话都会加载,别浪费了

这是你能做的最具杠杆效应的一件事,但几乎没人做对。

源代码显示,Claude Code 在每一次查询迭代时都会读取你的 CLAUDE.md 文件。不是在会话开始时读一次,而是每一轮。也就是说,你每次发消息,它都会重新读一遍你的指令。

这里有完整的层级结构:

  • ~/.claude/CLAUDE.md — 全局配置(你的编码风格、偏好)

  • ./CLAUDE.md — 项目级配置(架构决策、规范)

  • .claude/rules/*.md — 模块化规则文件

  • CLAUDE.local.md — 私有笔记(会被 git 忽略)

更离谱的是,你有 40,000 个字符的空间。这是什么概念?一篇硕士论文也就这个长度。但大多数人只用不到 200 个字符。

那么,该往里面写什么?

你的架构决策、文件规范、测试模式、还有那些“永远不要这样做”的规则。模型在每一轮都会读取它们。

这就是 Claude Code 究竟只是一个泛泛的通用助手,还是成为那个了解你代码库的专属助手的根本区别。

看完这篇文章,如果你只想做一件事,那就是:把你的 CLAUDE.md 写完整。


02 子 Agent 共享缓存:5 个 Agent 的成本 ≈ 1 个 Agent

这一点让我彻底震惊了。

当 Claude Code 创建一个子 Agent 时,它会生成一个与父级上下文完全相同的字节拷贝。API 会缓存这个上下文。

这意味着什么?

启动 5 个 Agent 来处理你代码库的不同部分,其成本并不比用 1 个 Agent 顺序处理高多少

再读一遍这句话。

5 个 Agent,成本 ≈ 1 个 Agent。因为它们都命中了提示缓存。

大多数人把 Claude Code 当成一个单线程工人:一次只做一个任务,等它做完,再给它下一个。

但源代码中明确展示了子 Agent 的三种执行模式

  • fork — 继承父级上下文,针对缓存优化

  • teammate — 在 tmux 或 iTerm 中打开独立面板,通过文件邮箱通信

  • worktree — 拥有独立的 git worktree,每个 Agent 在隔离分支上工作

你可以告诉 Claude Code 同时启动 5 个 Agent:一个做安全审计,一个重构认证模块,一个写测试,一个更新文档,一个修复 Bug。它们同时工作,共享同一个缓存。

这个架构天生就是为了并行而设计的。把它当单线程用,真的是暴殄天物。


03 权限系统:配置一次,从此告别反复点“允许”

每次 Claude Code 弹出一个“允许此操作?”的对话框,然后你点击“是”——这都说明你的配置没做好,而不是功能设计得好。

源代码揭示了一个 5 层级的设置规则:

策略 (policy) > 标志 (flag) > 本地 (local) > 项目 (project) > 用户 (user)

在 ~/.claude/settings.json 中,你可以设置哪些操作总是被允许的:

{"permissions":{"allow":["Bash(npm *)","Bash(git *)","Edit(src/**)","Write(src/**)"]}}
这里有三种权限模式:
  • bypass — 完全不做权限检查(危险,但速度快)

  • allowEdits — 自动允许工作目录下的文件编辑

  • auto — 对每个操作运行 LLM 分类器判断是否允许。这是最理想的模式

auto 模式有自己的允许/拒绝列表,可以配置。源代码显示,它会并行运行多个决策器:用户点击、钩子分类器、桥接器,哪个先响应就用哪个的结果。

每次你停下来点击“允许”,都是在浪费时间。配置好一次,从此告别点击疲劳。


04 5 种压缩策略:上下文压力是真实存在的

源代码中有五种不同的方法来压缩过长的对话:

  1. 微压缩 (microcompact) — 基于时间清除旧的工具执行结果

  2. 上下文折叠 (context collapse) — 对连续对话进行摘要

  3. 会话记忆 (session memory) — 将关键上下文提取到文件

  4. 完全压缩 (full compact) — 对整个对话历史进行摘要

  5. PTL 截断 (PTL truncation) — 删除最旧的消息组

这告诉我们:上下文溢出是工程师们花了大精力解决的核心问题。

对你有用的信息:

  • 主动使用 /compact 命令。别等系统自动压缩,那时你关心的上下文可能已经丢了。

  • 默认窗口是 200K tokens,但你可以用 [1m] 后缀启用 1M tokens 的上下文。涉及多文件的大型重构时,这点至关重要。

  • 长时间会话会积累“会话记忆”——任务规格、文件列表、工作流状态、错误和经验的摘要。这就是为什么恢复会话比开启新会话更好。

  • 大的工具结果会被存到磁盘,模型只能看到 8KB 预览。粘贴巨大文件进去,模型可能只看到一小部分。保持输入聚焦。

那些把 Claude Code 用得风生水起的人,用 /compact 就像在游戏里手动存盘:保留重要的,清除无用的,继续前进。


05 钩子系统:真正的扩展 API

这是一个几乎没人知道的高级功能。

源代码揭示了 25 个以上的生命周期事件,都可以设置钩子:

  • PreToolUse — 工具执行之前

  • PostToolUse — 工具执行之后

  • UserPromptSubmit — 你发送消息时

  • SessionStart / SessionEnd — 会话生命周期

  • 以及 20 多个其他事件

支持 5 种类型的钩子:

  • command — 运行 Shell 命令

  • prompt — 通过 LLM 注入上下文

  • agent — 运行完整的 Agent 验证循环

  • HTTP — 调用 Webhook

  • function — 运行 JavaScript

真实应用场景:

  • 每次文件写入前自动运行 linter

  • 每次编辑后自动运行测试

  • 自动为每个提示词注入相关文档

  • 任务完成时发送 Slack 通知

  • 代码提交前验证安全模式

最强大的是 UserPromptSubmit 钩子——你可以在每条消息中注入 additionalContext。测试输出、最近的 git diff、项目状态,全部自动附加,无需手动输入。

这才是如何在 Claude Code 之上构建你自己的开发环境。不是靠写更好的提示词,而是靠直接接入系统内部。


06 会话持久化:别再每次都从头开始了

每一次对话都会以 JSONL 格式保存在:~/.claude/projects/{hash}/{sessionId}.jsonl

源代码支持以下启动参数:

  • --continue — 恢复最后一次会话

  • --resume — 选择并恢复一个过去的特定会话

  • --fork-session — 从一个过去的对话中分支出新会话(我个人非常喜欢这个)

会话记忆功能可以在压缩过程中保留关键上下文:任务规格、文件列表、工作流状态、错误和经验。

大多数人每次打开 Claude Code 都开启新会话。这就像每过一小时就把 IDE 关掉重开——所有之前做的事、失败的经历、学到的经验,全丢了。

请使用 --continue。让上下文累积,让会话记忆不断沉淀经验。源代码为此提供了完整的基础设施,别浪费了。


07 工具系统:60+ 工具 + 智能批处理

Claude Code 内置了 60 多个工具。但最有趣的是它如何运行它们。

源代码将工具调用分为两类:

  • 并发 (concurrent) — 只读操作(读文件、搜索、glob)并行运行

  • 串行 (serial) — 修改状态的操作(编辑、写入、Bash)逐个运行

这意味着,当 Claude Code 需要读取 10 个文件来理解你的代码库时,它同时读取这 10 个文件。但当它需要编辑 3 个文件时,会一个一个地编辑,避免冲突。

除了内置工具,你还可以连接 MCP 服务器添加更多工具。源代码使用延迟加载,MCP 工具只在需要时才加载。连接 5 个 MCP 服务器,并不会拖慢每次请求的速度。

还有一个 ToolSearch 功能,用于延迟发现 Agent 还不了解的工具。

实践建议:如果你的工作流涉及外部系统(数据库、云服务商、CI/CD),为它们连接 MCP 服务器。架构会帮你处理复杂性,你只管享受更强大的能力。


08 流式架构:中断几乎没有代价

整个流水线使用异步生成器 (async generators),每个事件单独产出。按下 Escape 键可以干净地中断当前流,而不会丢失之前的任何上下文。

这看起来是个小细节,但它会改变你的使用方式。

别等着一个已经走偏的响应完成。立即中断它,然后给出新指示。 源代码的设计就是为了应对这种情况:之前的上下文会保留,被中断的响应会被干净地丢弃。没有任何代价。

这就像结对编程。如果你的搭档走错方向,你不会等他做完。你会说:“等等,换个方向,走这边。”


09 重试系统:比你想象的更精密

源代码显示:

  • 最多 10 次重试,指数退避 + 随机抖动(基础间隔 500ms)

  • 遇到 401/403 自动刷新 OAuth Token

  • 模型降级:Opus 因 529 错误连续失败 3 次,自动降级到 Sonnet

  • 流式连接有 90 秒空闲看门狗,卡住时自动降级为非流式

  • 持久化模式支持无限重试,最长退避 5 分钟

这意味着 Claude Code 的设计初衷就是让它一直运行。它能优雅处理 API 故障、速率限制和中断。你不需要时刻盯着它。让它在后台跑,回来收获结果就行。


写在最后

总结一下,从源代码里挖出的 9 个最具影响力的操作:

  1. 写一份真正有用的 CLAUDE.md → 每轮加载,40K 空间,投入产出比最高

  2. 用子 Agent 并行处理 → fork 模式共享缓存,5 个 Agent ≈ 1 个 Agent 的成本

  3. 在 settings.json 配置权限 → 告别点击疲劳

  4. 主动用 /compact → 5 种压缩策略说明上下文压力真实存在

  5. 配置钩子 → 25+ 事件,5 种类型,这是真正的扩展 API

  6. 始终用 --continue 恢复会话 → JSONL 持久化 + 会话记忆 = 积累的上下文

  7. 连接 MCP 服务器 → 延迟加载,不用就没有成本

  8. 随时中断 → 异步生成器机制,重新定向几乎没有代价

  9. 让它跑着别管 → 重试系统会处理各种故障

核心结论

Claude Code 本质上是一个 Agent 编排平台,只不过套了个终端的壳。

那些用它产出十倍成果的人,并不是更擅长写提示词。他们懂得配置它,并行使用它,接入它的内部机制,并让上下文在会话之间不断积累

源代码已经把这一切都明明白白地展示出来了。

现在,你也知道它表面之下究竟是如何工作的了,赶紧把你的龙虾换成Claude Code试试看吧。

当然,我还看到网上流传的信息,说是假的,只不过真真假假已经无所谓了,因为它整体的框架和结构看起来不像是假的,而且有很多可以学习借鉴的。

我是黄啊码,码字的码,如果觉得受用,欢迎一键三连,另外如果想进入私人交流群一起交流学习,也可以扫码V我,想要源码可以留言或者私我。
黄啊码

微信号:ama_huangama