Claude Code 源码,我这里还有
前阵子有人把 Claude Code 的源码扒出来了。
说”扒出来”其实不太准确——npm 包发布的时候就是个 12MB 的 bundle,1884 个 TypeScript 文件,五十多万行代码。编译混淆了一层,但该看的还是能看。我这里打包了一份源码备份,有需要的直接翻到文末加我。
我花了几天时间把核心模块过了一遍,说实话,看完之后我对 Anthropic 工程团队的敬畏上了一个台阶。
不是因为什么黑科技,而是因为它把一个最朴素的 while-true 循环,一层一层包成了一个工业级的自主编码代理。这件事听起来简单,做到这个程度的,目前只此一家。
真正厉害的产品,不是在某一个点上做突破,而是在十二个点上都不掉链子。
核心循环:简单到让人怀疑
Claude Code 的心脏是什么?
一个 while-true 循环。发请求,拿响应,如果响应里有 tool_use 就执行工具、把结果塞回消息列表,然后继续循环。没了。
我第一反应是:就这?
后来想明白了,这种极简恰恰是刻意为之。所有的复杂性被推到了两个地方:工具层自己处理输入验证、权限检查、并发控制;外层包装机制叠加了十二层 production 级特性。核心循环本身从不改变——加一个新功能,要么加一个新工具,要么加一层新包装。
这就是开闭原则在 Agent 系统里的教科书实践。说白了,人家的核心代码三岁小孩都能看懂,但你要自己写一个同等水平的产品,没个一两年别想。
十二层包装:从玩具到产品的距离
这十二层机制是我看完源码后印象最深的部分。我把它们按依赖关系理了一遍:
第一层是 Agent Loop 本身,就是那个 while-true。第二层是工具分发,用 buildTool() 工厂函数统一创建,所有工具走同一套注册表。第三层是 Planning——先列步骤再执行。源码注释里提到,光加这一层,任务完成率就翻了一倍。这个数据跟学术界 Plan-and-Execute 的研究结论对得上。
第四层是子代理。每个子代理拿到全新的消息列表,主对话不会被污染。第五层是按需知识注入,技能通过 tool_result 动态加载,不是一股脑塞进 system prompt。第六层是上下文压缩,三种策略轮着来:自动摘要、僵尸消息清理、上下文重构。
第七到十二层,分别是持久化任务管理、后台任务、多代理团队、团队协议、自主调度、以及 Git Worktree 隔离。
关于这十二层,有一个细节值得单独说。大多数竞品到现在还停在”一个 prompt 文件走天下”的阶段。Claude Code 已经在做编译时死代码消除、分层 prompt 缓存、会话持久化、流式执行这些事了。这不是一两个聪明人能追上的差距,这是工程纵深。
一个 loop 和一个 bash 就是最小可行产品,但从最小可行到工业级,中间隔了十一层包装。
工具系统:默认安全的艺术
buildTool() 工厂函数有一组默认值,我觉得特别值得说。
并发安全默认 false——忘了声明?自动串行执行。只读默认 false——忘了声明?自动触发权限检查。所有跟安全相关的属性,都是”没声明就当成最严格的来处理”。
这叫 fail-closed 设计。大部分系统是 fail-open 的——忘了配权限?那就没权限检查。Claude Code 反过来。这种思路不是拍脑门能想到的,是被线上事故教会的。
另一个让我觉得快的原因:并行工具执行。模型一次返回多个 tool_use 请求时,Claude Code 的 StreamingToolExecutor 会先分区——标记了并发安全的工具走 Promise.all 并行跑,没标记的走串行。所以你在用 Claude Code 搜文件的时候会觉得特别快,因为多个 Glob 和 Grep 是同时在跑的。
Prompt 工程:比你想象的深
System prompt 被切成了两半:静态前缀和动态后缀,中间有一个明确的分界标记 __SYSTEM_PROMPT_DYNAMIC_BOUNDARY__。
为什么要这么切?因为 Anthropic 在 API 侧对 system prompt 做了基于哈希的前缀缓存。静态部分跨用户、跨会话共享,动态部分每次重新计算。这一刀切下去,每次 API 调用的 prompt token 成本直接降了一大截。
源码注释里有一句原话,大意是:别动这个分界标记,除非你同时更新了 api.ts 和 claude.ts 的缓存逻辑。能感觉到,这个优化是核心路径上的关键设计,不是随便写的。
从 prompts.ts 里还能捞出不少有意思的东西。比如 Anthropic 发现 LLM 天然倾向于过度工程化,所以专门用 prompt 来压制这个倾向:”三行类似的代码比一个过早抽象更好”。再比如,内部员工(USER_TYPE === ‘ant’)拿到的 prompt 比外部用户更严格——更少的注释、更强的验证要求、还有针对模型已知弱点的专门对策。
老实说,外部用户用的可能不是 Claude Code 最强的形态。
上下文管理:你以为的无限对话
System prompt 会告诉模型”对话没有长度限制”。但实际上,是三层压缩在背后透明地工作。
第一层 autoCompact,token 数超阈值就用 Claude API 对旧消息生成摘要。第二层 snipCompact,清理僵尸消息和过期标记。第三层 contextCollapse,重构上下文的组织方式。
还有一个叫 Function Result Clearing 的机制:只保留最近 N 个工具结果,更早的自动清除。但系统同时会提醒模型——”趁工具结果还在的时候,把重要信息写到回复里”。
这个设计太精妙了。相当于让模型自己做笔记,防止信息在压缩时丢失。
子代理:解决上下文污染的正确姿势
Agent 系统里最常见的问题是什么?上下文污染。主对话越来越长,越来越乱,模型开始犯迷糊。
Claude Code 的解法是 Fork 子代理。子代理拿到全新的消息列表,它产生的工具输出不会回到主代理的上下文窗口。主代理可以继续跟你聊天,Fork 在后台干活。
除了 Fork,还有 Worktree 模式——用 Git Worktree 给子代理分配独立的工作目录,真正做到文件级隔离。以及一个还在 feature gate 后面的 Swarm 模式:Lead Agent 分配任务到任务板,多个 Teammate 自主扫描、自动认领,通过统一的消息协议协商。
多数竞品到现在还是单层 Agent。Claude Code 已经在做多代理编排了。
Skills 系统:按需注入 vs 一股脑塞
大多数 AI 编码工具怎么处理技能和知识?全塞进 system prompt。每次 API 调用都带着全套家当,token 浪费得心疼。
Claude Code 的做法是:system prompt 只放基础指令和环境信息。技能?用的时候再通过 tool_result 注入。CLAUDE.md 记忆文件?按目录层级惰性加载,只加载跟当前工作目录相关的。
更有意思的是,源码里有一组被 feature gate 挡住的模块——远程技能加载器、技能预取、技能搜索遥测。这意味着 Anthropic 在做一个类似”Agent 技能市场”的东西。远程技能可以被动态发现、加载和执行。
知识应该在需要的时候出现,而不是一直占着上下文的位子。
编译时特征门控:你看到的只是冰山一角
这一部分是最让我感慨的。
Claude Code 用 Bun 的编译时 feature() 函数做死代码消除。内部构建时 feature('DAEMON') 返回 true,相关代码保留;发布到 npm 时返回 false,代码直接被 DCE 裁掉。
我在源码里数到了至少十几个 feature flag:多代理协调器、后台守护进程、推送通知、语音模式、浏览器自动化、技能发现、验证代理、Token 预算控制……
还有运行时门控。内部员工通过 USER_TYPE === 'ant' 解锁额外功能。A/B 实验用 GrowthBook,而且 flag 名称用的是随机词对组合——tengu_frond_boric、tengu_hive_evidence——故意让外部人员猜不出在测什么。
108 个缺失模块。我们看到的是精简版,Anthropic 内部跑的是完全体。
那些还没上线的功能
从源码里捞出来几个值得一提的:
KAIROS 模式——全自主代理。模型会收到 tick 信号保持活跃,根据终端是否被用户聚焦来决定行为倾向:用户在看就更协作,用户离开了就大幅倾向自主行动。还有 SleepTool 来控制唤醒频率,平衡 API 成本和 prompt cache 过期。
Voice Mode——语音输入输出,连接 Anthropic 的 voice_stream WebSocket。
Buddy System——虚拟宠物伙伴,18 个物种、5 档稀有度、7 种帽子。没错,你没看错,是宠物。
Dream Task——后台记忆整固子代理,AI 空闲的时候自动整理和处理记忆。
Undercover Mode——在公开仓库中隐藏 AI 身份。
说真的,看到 Buddy System 的时候我愣了一下。但仔细想想,一个需要长时间使用的 CLI 工具,加点情感设计未必是坏事。
几个值得记住的设计哲学
翻完源码,我总结了几条对自己有用的东西:
核心循环越简单越好。复杂性应该被推到外层,而不是塞进心脏。Claude Code 的 while-true 就是最好的证明。
Planning 是性价比最高的投入。加一层”先想再做”就能翻倍完成率,这几乎是免费午餐。
安全要 fail-closed。所有默认值都选最严格的那个,需要放开的时候再显式声明。
知识按需加载。预加载一切是偷懒,按需注入才是正确的工程选择。
上下文不是无限的,但可以假装是。三层压缩 + 让模型自己做笔记,用户无感知。
如果你正在做 AI Agent 相关的事情,Claude Code 的源码值得认真读一遍。不是为了抄,而是为了理解”工业级”三个字到底意味着什么。
一个 loop 和一个 bash 就能启动一个 Agent。但要让它能在真实环境下跑起来、不崩、不乱、不失控,中间差的那十一层,每一层都是真金白银的工程投入。
我这边打包了 Claude Code 源码备份,需要的直接加我发你。
另外我平时也在折腾 Claude、GPT、Gemini 这些工具的各种玩法,如果你也在用 AI 编码助手,欢迎加我交流。不管你主力是哪家的,能聊到一块去就行。
加我微信,备注「AI编程」,拉你进交流群:

夜雨聆风