读了Claude Code泄露的源码,发现我们都用错了
它不是聊天工具,是一个被伪装成终端的 Agent 编排平台
它不是聊天工具,是一个被伪装成终端的 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 种压缩策略:上下文压力是真实存在的
源代码中有五种不同的方法来压缩过长的对话:
-
微压缩 (microcompact) — 基于时间清除旧的工具执行结果
-
上下文折叠 (context collapse) — 对连续对话进行摘要
-
会话记忆 (session memory) — 将关键上下文提取到文件
-
完全压缩 (full compact) — 对整个对话历史进行摘要
-
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 个最具影响力的操作:
-
写一份真正有用的 CLAUDE.md → 每轮加载,40K 空间,投入产出比最高
-
用子 Agent 并行处理 → fork 模式共享缓存,5 个 Agent ≈ 1 个 Agent 的成本
-
在 settings.json 配置权限 → 告别点击疲劳
-
主动用
/compact→ 5 种压缩策略说明上下文压力真实存在 -
配置钩子 → 25+ 事件,5 种类型,这是真正的扩展 API
-
始终用
--continue恢复会话 → JSONL 持久化 + 会话记忆 = 积累的上下文 -
连接 MCP 服务器 → 延迟加载,不用就没有成本
-
随时中断 → 异步生成器机制,重新定向几乎没有代价
-
让它跑着别管 → 重试系统会处理各种故障
核心结论:
Claude Code 本质上是一个 Agent 编排平台,只不过套了个终端的壳。
那些用它产出十倍成果的人,并不是更擅长写提示词。他们懂得配置它,并行使用它,接入它的内部机制,并让上下文在会话之间不断积累。
源代码已经把这一切都明明白白地展示出来了。
现在,你也知道它表面之下究竟是如何工作的了,赶紧把你的龙虾换成Claude Code试试看吧。
当然,我还看到网上流传的信息,说是假的,只不过真真假假已经无所谓了,因为它整体的框架和结构看起来不像是假的,而且有很多可以学习借鉴的。


微信号:ama_huangama
夜雨聆风