Claude Code 源码解读

src/query.ts
,通过一个包含预处理、API 调用、工具执行的 while(true) 循环实现了完整的 Agentic 逻辑。
src/query.ts
,1729 行,实现了完整的 agentic 循环。注意不是
QueryEngine.ts
——那个是外层的会话管理。真正的”大脑”在
query.ts
里。
cache_deleted_input_tokens
能力,在缓存层面做编辑。这个比较黑科技——它不改消息内容,而是告诉 API”这些 token 你缓存里有但别用了”。
isConcurrencySafe
标记——读文件、grep 这种只读操作可以并行,写文件、bash 这种需要独占。结果按接收顺序缓冲,不会乱序。 const MAX_OUTPUT_TOKENS_RECOVERY_LIMIT = 3
max_output_tokens
?循环不报错,”扣留”这个错误消息,悄悄重试,最多 3 次。对用户来说是无感的。
buildTool()
工厂函数,每个工具自包含所有逻辑,支持动态组装。
BaseTool
基类然后继承。Claude Code 完全没有继承,全是纯函数式的
buildTool()
:
exec(command)
:自动分类命令类型(search/read/write),macOS 上走 sandbox-exec 沙箱,超过 15 秒的阻塞命令自动转后台,大输出存磁盘只给模型一个文件路径引用,还内置了一个 sed 命令专用解析器。constvoiceModule=feature('VOICE_MODE')?require('./voice/index.js'):null
feature()
是 Bun 的编译时宏。构建时会被替换成
true
或
false
,
false
的分支直接被删除——不是”不执行”,是从二进制文件里物理消失,连字符串字面量都不剩。
VOICE_MODE
、
BRIDGE_MODE
、
DAEMON
、
KAIROS
、
COORDINATOR_MODE
、
PROACTIVE
、
ABLATION_BASELINE
、
HISTORY_SNIP
、
REACTIVE_COMPACT
、
CONTEXT_COLLAPSE
、
CACHED_MICROCOMPACT
、
CHICAGO_MCP
……每一个都对应一个未发布或正在灰度的功能。constenabled=checkStatsigFeatureGate_CACHED_MAY_BE_STALE('tengu_streaming_tool_execution2')
tengu_
前缀——tengu(天狗)大概是 Claude Code 的内部代号。从磁盘缓存读取,接受脏读,不阻塞启动。
ABLATION_BASELINE
,启用后会一次性关掉思考模式、上下文压缩、自动记忆、后台任务:if(feature('ABLATION_BASELINE')&&process.env.CLAUDE_CODE_ABLATION_BASELINE){for(constkof['CLAUDE_CODE_DISABLE_THINKING','DISABLE_COMPACT','DISABLE_AUTO_COMPACT','CLAUDE_CODE_DISABLE_AUTO_MEMORY','CLAUDE_CODE_DISABLE_BACKGROUND_TASKS',]){process.env[k]??='1';}}
src/voice/
目录确认了语音模式的存在。从
voiceModeEnabled.ts
看:
voice_stream
端点
tengu_amber_quartz_disabled
src/bridge/
有 31 个文件,是一个完整的远程控制系统。运行
claude remote-control
之后,你的本地环境就变成一个被 claude.ai 远程操控的”桥接环境”。// 18 种宠物export const SPECIES = [ duck, goose, blob, cat, dragon, octopus, owl, penguin, turtle, snail, ghost, axolotl, capybara, cactus, robot, rabbit, mushroom, chonk] as const// 5 级稀有度:普通(60%) / 罕见(25%) / 稀有(10%) / 史诗(4%) / 传说(1%)export const RARITY_WEIGHTS = { common: 60, uncommon: 25, rare: 10, epic: 4, legendary: 1,}// RPG 式属性export const STAT_NAMES = ['DEBUGGING','PATIENCE','CHAOS','WISDOM','SNARK'] as const
·
、
✦
、
×
、
◉
、
@
、
°
)、1% 概率的闪光变体。宠物属性用 Mulberry32 伪随机数生成器从你的用户 ID 确定性计算——所以每个用户的宠物是固定的,不能刷。// 所有物种名用 hex 编码,因为有一个名字和内部模型代号撞了const c = String.fromCharCodeexport const duck = c(0x64,0x75,0x63,0x6b) as 'duck'export const goose = c(0x67,0x6f,0x6f,0x73,0x65) as 'goose'export const capybara = c(0x63,0x61,0x70,0x79,0x62,0x61,0x72,0x61) as 'capybara'// ... 全部 18 个都这样
.claude/skills/
目录下放
.md
文件,YAML frontmatter 里写描述、触发条件、允许的工具、用哪个模型。Claude Code 读文件时如果发现目录下有 skills,会自动加载——你甚至不用显式注册。这种”约定优于配置”的风格很 Rails。
AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS
。用类型名本身来提醒开发者”你确认过这不是代码或文件路径了吗”。简单粗暴但有效。
AppState
里有
speculationState
,追踪每一轮的结束方式(bash 命令 / 文件编辑 / 正常结束 / 权限拒绝),用来预判下一步操作并提前执行。这解释了为什么 Claude Code 有时候”想”完就瞬间开始干活。
--version
路径做到了零 import——直接读编译时内联的版本号,一个模块都不加载就退出。其他子命令走独立的
import()
路径。只有最终进主循环才加载完整的 React 应用。
.map
文件,map 里引用了 R2 上的源码 zip 包,那个 URL 没有访问控制。
package.json
的
files
字段要白名单制,只包含你想发布的东西
.map
文件引用链接
[1] https://github.com/instructkr/claude-code: https://github.com/instructkr/claude-code
夜雨聆风