Claude Code 架构全解

51.2 万行 TypeScript · 1,902 个文件 · 单系统深潜 · 不做任何对比

这篇文章的定位

这一篇只讲 Claude Code 一个系统。不和任何其他项目对比,不讨论「别人怎么做」,只回答一个问题:这个系统是怎么造出来的?

从进程启动的第一行代码,到最后一条消息落盘,逐层拆开每一个子系统 —— 包括那些在对照式文章里通常被跳过的部分:终端界面层怎么渲染、会话怎么恢复、埋点体系怎么组织、单文件可执行程序怎么构建出来。

阅读门槛:不需要人工智能背景。所有概念在首次出现时都会解释。如果你完全没接触过大语言模型,建议先读《合刊》那一篇的第 1 章(零基础前置知识),大约 20 分钟,之后再回来。

0 · 项目全景与代码地图

0.1 这个软件是什么

Claude Code 是一个在终端里运行的编程助手。你在命令行里敲 claude,进入一个可以持续对话的界面,然后用自然语言让它帮你读代码、改代码、跑测试、提交 git。

它和普通聊天机器人的区别是:它会真的动手操作你的电脑 —— 读文件、写文件、执行 shell 命令。这个能力也正是它全部工程复杂度的来源。

属性
开发方Anthropic
编程语言TypeScript
运行环境Bun —— 一个比 Node.js 更快的 JavaScript 运行时,而且能把整个程序打包成单个可执行文件
界面框架React + Ink —— Ink 是「用 React 写终端界面」的框架,把 React 组件渲染成终端里的文字
代码规模1,902 个 .ts / .tsx 文件,51.2 万行
源码来源2026 年 3 月 31 日因 npm 包附带的 source map(源码映射文件)配置失误而泄露。它不是开源项目。

为什么文件后缀有 .ts.tsx 两种?.tsx 是包含 JSX 语法(也就是在代码里直接写 HTML 式标签)的 TypeScript 文件,用于写界面组件。.ts 是纯逻辑文件。

0.2 源码目录逐个解释

下面是 src/ 目录下的全部内容。括号里是文件数量,可以直观看出各部分的体量分布:

src/ │ ├── main.tsx (804 KB) 程序主入口。命令行参数解析(用 Commander.js 库) │ 光是 --xxx 选项就定义了 60 多个 ├── QueryEngine.ts (46 KB) 会话层。一场对话一个实例 → 第 2 章 ├── query.ts (68 KB) ★ 智能体主循环。整个系统的心脏 → 第 3 章 ├── Tool.ts (29 KB) 工具接口契约定义 → 第 4 章 ├── tools.ts (17 KB) 工具注册表与装配逻辑 → 第 4 章 ├── commands.ts (25 KB) 斜杠命令注册表 ├── context.ts (6 KB) 系统提示词的上下文收集 ├── cost-tracker.ts(10 KB) 花费统计 │ ├── tools/ (40 个) ★ 模型可以调用的工具 → 第 4、5 章 ├── commands/ (100 个) 用户敲的斜杠命令(模型看不到) ├── components/ (146 个) 终端界面组件 → 第 10 章 ├── hooks/ (87 个) React 状态管理单元 → 第 10 章 ├── screens/ (3 个) 整屏界面:REPL 主界面 / 诊断 / 恢复选择器 ├── ink/ (50 个) Ink 框架的定制版(他们自己 fork 了一份) │ ├── services/ (38 个) 对外服务层 │ ├── api/ 调用模型接口、重试、缓存标记 → 第 3 章 │ ├── compact/ 上下文压缩的五级实现 → 第 6 章 │ ├── mcp/ MCP 外部工具协议客户端 → 第 9 章 │ ├── tools/ 工具执行编排 → 第 5 章 │ └── analytics/ 埋点上报 → 第 12 章 │ ├── utils/ (331 个) ★ 最大的目录,所有共享逻辑 │ ├── permissions/ 权限判定(21 个文件) → 第 7 章 │ ├── bash/ shell 命令的语法解析器 │ ├── plugins/ 插件加载与市场 → 第 9 章 │ ├── hooks/ 用户钩子的执行引擎 → 第 9 章 │ ├── shell/ 只读命令判定、沙箱 │ └── messages.ts (189 KB) 消息的构造、规范化、序列化 │ ├── entrypoints/ (6 个) 四种启动形态的入口 → 第 1 章 ├── state/ (7 个) 全局应用状态容器 ├── types/ (10 个) TypeScript 类型定义 ├── constants/ (23 个) 常量 ├── bootstrap/ (3 个) 进程启动引导 ├── skills/ (4 个) 技能系统 → 第 9 章 ├── plugins/ (4 个) 插件系统 → 第 9 章 ├── coordinator/ (1 个) 协调者模式 ├── tasks/ (11 个) 后台任务的几种形态 ├── bridge/ (33 个) 编程软件(VS Code / JetBrains)对接 ├── remote/ (6 个) 远程会话 ├── server/ (5 个) 内嵌 HTTP 服务 ├── memdir/ (10 个) 长期记忆目录 ├── migrations/ (13 个) 配置文件版本迁移 ├── keybindings/ (16 个) 快捷键配置 ├── vim/ (7 个) Vim 编辑模式 ├── voice/ (1 个) 语音输入 └── native-ts/ (5 个) 原生模块绑定

0.3 从这张地图能读出的三件事

第一:核心极小,外围极大

核心逻辑(刻意保持很小)外围模块(放任臃肿)
query.ts 主循环 —— 1,730 行
Tool.ts 工具契约 —— 793 行
toolOrchestration.ts —— 189 行
tools.ts 注册表 —— 390 行
screens/REPL.tsx —— 875 KB
main.tsx —— 804 KB
components/PromptInput.tsx —— 347 KB
utils/messages.ts —— 189 KB

这不是疏忽,是有意识的取舍:核心抽象要小到能被一个人完整读懂并测试;边缘代码可以脏,因为它们改动频繁、逻辑分支多、而且出错的后果有限。

第二:utils/ 有 331 个文件,说明什么

utils(工具函数)目录通常是一个项目的「杂物间」。331 个文件是个惊人的数字 —— 但翻开看会发现它并不是真的杂乱,里面有清晰的二级分组:

这些本可以是独立的顶级目录。它们被塞进 utils/,更可能是历史原因(先写成小工具函数,后来长大了但没搬家)。这是一个真实项目的正常样貌 —— 值得注意的是它们内部依然是分组清晰的。

第三:tools/commands/ 是最关键的一条切分线

tools/(40 个)commands/(约 100 个)
谁能触发模型。模型输出一个「工具调用」请求,程序执行它只有人。用户在终端敲 /compact/resume 这样的命令
进不进上下文进。每个工具的说明文字都要放进系统提示词,每一轮都要重新发给模型、重新付费不进。模型完全不知道这些命令的存在
走不走权限判定走。每次调用都要过一条 10 步的判定链不走。用户自己敲的,视为已授权
典型例子Read(读文件)、Bash(执行命令)、Edit(改文件)/model 换模型、/cost 看花费、/doctor 诊断

这条线解释了「技能」(Skill)这个功能存在的意义:技能是一座把命令变成工具的桥。

有些能力,用户希望模型能自己判断何时使用(所以应该是工具),但内容又像命令一样是「一段固定的操作流程」。技能系统让这类内容以工具的形式暴露给模型 —— 第 9 章会详细讲。

0.4 一次完整请求的旅程(全文导航)

Claude Code 分层架构总览
Claude Code 分层架构总览 — 从终端入口向下穿过会话层、主循环、工具模型与执行、上下文治理、权限级联,最终抵达模型接口。左侧标注的是每一层对应的章节点击放大

下面这条路径把 14 章串起来。建议先扫一遍,建立整体印象,再逐章深入。

用户在终端敲下一句话,按回车 │ ▼ 【第 1 章】入口层 main.tsx 解析命令行 → 判断是交互模式还是无头模式 → 加载配置、插件、技能、MCP 服务 → 启动 React Ink 渲染循环 │ ▼ 【第 10 章】界面层接收输入 PromptInput 组件 → 处理 @文件提及、图片粘贴、斜杠命令补全 │ ▼ 【第 2 章】会话层 QueryEngine.submitMessage() 被调用 → 组装系统提示词、附件、用户上下文 → 把用户消息先落盘(防止进程被杀掉后丢失) │ ▼ 【第 3 章】主循环开始 ← ★ 整个系统的心脏 │ ├─【第 6 章】上下文治理五级流水线 │ 落盘超大结果 → 删僵尸消息 → 微压缩 → 折叠 → 摘要 │ ├─ 调用模型接口(流式返回) │ └─【第 5 章】流式工具执行器:便条一到手就开始执行 │ ├─【第 4 章】解析模型返回的工具调用 │ ├─【第 5 章】工具执行编排 │ 并发分区 → 【第 7 章】权限判定 → 实际执行 → 【第 9 章】钩子 │ └─【第 8 章】如果调用的是 Agent 工具 → 创建子智能体 │ ├─【第 3 章】错误恢复状态机 │ 上下文超长?输出被截断?模型过载?用户中断? │ └─ 有工具调用 → 回到循环开头 没有工具调用 → 结束 │ ▼ 【第 11 章】持久化 对话记录写成 JSONL 文件 → 支持 --resume 恢复 │ ▼ 【第 12 章】埋点上报(贯穿全程,几乎每条决策分支都有) 【第 13 章】这一切被 Bun 打包成一个 300 MB 的单文件可执行程序

0.5 全文章节索引

标题核心内容
1入口层与启动流程四种启动形态、60 多个命令行选项、启动时序、--bare 极简模式
2会话层:QueryEngine一场对话的完整生命周期、状态所有权、消息落盘时机
3智能体主循环★ 状态机、7 条恢复路径、错误扣留、中断处理、模型降级
4工具模型Tool 接口的七组能力、失败保守默认值、工具清单装配与缓存
5工具执行并发分区、流式执行器、两级中止作用域、单次执行的完整流程
6上下文治理★ 五级阶梯、缓存编辑、时间触发、摘要提示词工程
7权限系统10 步判定链、bypass 免疫层、自动模式分类器、权限规则语法、沙箱
8子智能体三种形态、分叉的字节级缓存复用、工具限制、后台任务
9扩展体系技能、插件、MCP 客户端、15 类钩子事件
10终端界面层React Ink 架构、146 个组件、虚拟消息列表、输入框的复杂度
11持久化与恢复JSONL 对话记录、写入队列、--resume、文件历史与回滚
12可观测体系埋点密度、事件命名、缓存断裂检测、性能剖析检查点
13构建与分发Bun 单文件打包、编译期特性开关、死代码消除、版本管理