目录
  1. 1. 一、项目是什么
    1. 1.1. 1.1 与同类工具的定位差异
    2. 1.2. 1.2 适用场景
  2. 2. 二、技术栈总览
  3. 3. 三、核心架构图(第一性原理)
  4. 4. 四、模块全景地图
  5. 5. 五、学习路线与时间预估
    1. 5.1. 🎯 推荐学习路径(由浅入深)
    2. 5.2. ⏰ 时间预估(对于有 2-3 年 TypeScript 经验的开发者)
  6. 6. 六、Agent 系统的学术演进
    1. 6.1. 6.1 从 ReAct 到 Tool Use
    2. 6.2. 6.2 Toolformer 与工具调用范式
    3. 6.3. 6.3 从单 Agent 到多 Agent 协作
    4. 6.4. 6.4 Coding Agent 的里程碑
  7. 7. 七、关键设计理念深度分析
    1. 7.1. 7.1 “一切皆工具” (Tool-First) 的架构哲学
    2. 7.2. 7.2 Agentic Loop 的控制论视角
    3. 7.3. 7.3 流式优先 (Streaming-First) 的工程意义
    4. 7.4. 7.4 权限分层的安全模型
  8. 8. 八、与主要 Agent 框架的架构对比
  9. 9. 九、为什么选择这样的架构 —— 设计决策回溯
    1. 9.1. 9.1 为什么用 TypeScript 而非 Python?
    2. 9.2. 9.2 为什么自研 Store 而非用 Redux/Zustand?
    3. 9.3. 9.3 为什么用 Bun 做构建工具?
    4. 9.4. 9.4 为什么引入 MCP?
  10. 10. 十、核心工程挑战与架构解法
    1. 10.1. 10.1 上下文窗口的稀缺性与管理策略
    2. 10.2. 10.2 终端环境中的不确定性处理
    3. 10.3. 10.3 Token 成本的经济学
    4. 10.4. 10.4 并发执行的架构挑战
    5. 10.5. 10.5 错误恢复与会话持久化
  11. 11. 十一、架构中的核心数据结构
  12. 12. 十二、全系列阅读指南
    1. 12.1. 核心必读(理解 Agent 系统的心脏)
    2. 12.2. 进阶深入(理解工程实现)
    3. 12.3. 专项研究(按需阅读)
  13. 13. 十三、Streaming 架构深度解析
    1. 13.1. 13.1 四层 Streaming 架构
    2. 13.2. 13.2 SSE 事件的处理状态机
    3. 13.3. 13.3 增量 Markdown 渲染
  14. 14. 十四、性能与可扩展性
    1. 14.1. 14.1 启动性能优化
    2. 14.2. 14.2 长会话的内存管理
    3. 14.3. 14.3 并发工具执行调度
  15. 15. 十五、安全架构的学术基础
    1. 15.1. 15.1 最小权限原则的工程化
    2. 15.2. 15.2 沙箱隔离的三个层次
  16. 16. 十六、文件数量统计
  17. 17. 十七、Prompt 工程架构概览
    1. 17.1. 17.1 System Prompt 的模块化架构
    2. 17.2. 17.2 Prompt 缓存的工程策略
    3. 17.3. 17.3 CLAUDE.md 的 RAG 本质
  18. 18. 十八、测试与质量保障
    1. 18.1. 18.1 VCR 模式:受 HTTP 测试启发
    2. 18.2. 18.2 测试金字塔
    3. 18.3. 18.3 Agent 测试的特殊挑战
    4. 18.4. 18.4 可观测性
  19. 19. 十九、文档目录
  20. 20. 二十、配套学习资源(三层闭环)
    1. 20.1. 层级 1 — LLM 技术深度系列(理解为什么)
    2. 20.2. 层级 3 — 技术栈实战层(会写代码)
    3. 20.3. 推荐完整学习顺序
  21. 21. 附录:术语表
  22. 22. 参考文献
  23. 23. 涉及源文件
【Claude Code源码剖析】00-Claude Code 2.1.88 源码完全解析

⚠️ 学习声明:本文档基于 Claude Code 2.1.88 源码分析整理,仅供个人学习研究使用,不做任何商业用途。

📖 本文档系列基于 Claude Code 2.1.88 源码(约 70 万行 TypeScript)逐模块深度分析整理,以第一性原理讲解核心架构与设计思想。


一、项目是什么

Claude Code 是 Anthropic 公司开发的 终端 AI 编程助手(CLI Agent)。用户在终端输入自然语言,Claude Code 会:

  1. 理解你的代码库(读文件、搜代码、查 git)
  2. 调用 LLM(Claude API)进行推理
  3. 执行工具(编辑文件、运行命令、搜索网页等)
  4. 在终端中以 React Ink 渲染交互式 UI

本质上它是一个 “LLM + Tool Use” 的 Agentic Loop,外面包了一层漂亮的终端 UI。

1.1 与同类工具的定位差异

工具 运行环境 交互方式 工具权限 多Agent
Claude Code 终端 (CLI) 自然语言对话 全文件系统 + Shell ✅ Swarm
GitHub Copilot IDE 插件 Tab 补全 + Chat 受限(IDE 内)
Cursor IDE (VS Code fork) Chat + 内联编辑 IDE 内
Devin Web Chat + Workspace 容器内隔离
Aider 终端 Chat Git 仓库内
SWE-Agent CLI 命令行参数 容器内

Claude Code 的核心区分优势:

  • 终端原生:可以和任何 CLI 工具交互(npm、docker、git、curl…),不局限于 IDE 的抽象层
  • 全文件系统访问:无 IDE 的沙箱限制,可以操作任意文件(在权限允许范围内)
  • 多 Agent 协作:通过 Swarm/Task 系统让多个 Claude 实例协同工作
  • MCP 扩展:通过 Model Context Protocol 将任何第三方服务变成 Agent 可用的工具

1.2 适用场景

Claude Code 特别适合以下场景:

  1. 大型代码库的跨文件重构:Agent 可以自行探索项目结构,找到所有需要修改的文件
  2. DevOps / 基础设施管理:直接在终端操作 Docker、Kubernetes、Terraform
  3. 开源项目贡献:clone 仓库 → 理解代码 → 修改 → 提交 PR
  4. 遗留系统迁移:理解旧代码 → 设计方案 → 执行迁移
  5. 代码审查辅助:读 PR diff → 理解上下文 → 提出 review 意见

二、技术栈总览

层级 技术 说明
运行时 Bun (打包) + Node.js ≥ 18 (运行) 用 Bun 的 bun:bundle 做条件编译/Dead Code Elimination
语言 TypeScript (严格模式) 全项目 TS,含 JSX/TSX
CLI 框架 Commander.js (@commander-js/extra-typings) 类型安全的参数解析
终端 UI React Ink (React → 终端) 组件化终端渲染,支持 Flexbox 布局
LLM SDK @anthropic-ai/sdk 官方 Anthropic SDK,Streaming API
MCP @modelcontextprotocol/sdk Model Context Protocol 客户端
状态管理 自研轻量 Store(类 Zustand) createStore<T>() — 发布/订阅模式
工具链 Zod v4(校验)、lodash-es、chalk、strip-ansi 等

三、核心架构图(第一性原理)

用户输入 (stdin/CLI args)


┌─────────────────────────────────────────────────┐
│ main.tsx (入口) │
│ ├─ Commander 解析 CLI 参数 │
│ ├─ init() → 配置/认证/遥测 初始化 │
│ └─ launchRepl() → 渲染 React Ink 应用 │
└─────────────────┬───────────────────────────────┘


┌─────────────────────────────────────────────────┐
│ REPL.tsx (主交互循环) │
│ ├─ PromptInput: 用户文本输入 │
│ ├─ handlePromptSubmit() → 发起一次 "Turn" │
│ │ ├─ processUserInput() → 解析斜杠命令/附件 │
│ │ └─ query() → **核心 Agentic Loop** │
│ │ ├─ 构建 System Prompt │
│ │ ├─ 调用 Claude API (Streaming) │
│ │ ├─ 解析 tool_use blocks │
│ │ ├─ runTools() → 并行/串行执行工具 │
│ │ ├─ 将 tool_result 送回 API │
│ │ └─ 循环直到 stop_reason=end_turn │
│ └─ Messages: 渲染对话历史 │
└─────────────────┬───────────────────────────────┘

┌────────────┼────────────┐
▼ ▼ ▼
┌────────┐ ┌─────────┐ ┌──────────┐
│ Tools │ │Commands │ │ Services │
│ 30+种 │ │ 60+种 │ │ MCP/API │
│ 内置 │ │ 斜杠 │ │ 分析/LSP │
└────────┘ └─────────┘ └──────────┘

四、模块全景地图

整个 src/ 目录分为以下核心模块(按重要性排序):

序号 模块 目录/文件 行数估算 文档章节
1 启动引导 main.tsx, entrypoints/, bootstrap/ ~6,800 01-启动流程
2 Agentic 查询循环 query.ts, QueryEngine.ts ~3,000 02-查询引擎
3 工具系统 Tool.ts, tools.ts, tools/ ~15,000+ 03-工具系统
4 命令系统 commands.ts, commands/ ~10,000+ 04-命令系统
5 权限与安全 utils/permissions/ ~5,000+ 05-权限系统
6 终端 UI components/, screens/, ink/ ~30,000+ 06-UI系统
7 状态管理 state/, bootstrap/state.ts, hooks/ ~8,000+ 07-状态管理
8 API 与 Streaming services/api/ ~5,000+ 08-API通信
9 MCP 协议 services/mcp/ ~5,000+ 09-MCP
10 上下文压缩 services/compact/ ~4,000+ 10-上下文管理
11 任务系统 Task.ts, tasks/ ~5,000+ 11-任务系统
12 远程桥接 bridge/ ~8,000+ 12-Bridge
13 插件与技能 plugins/, skills/ ~3,000+ 13-插件技能
14 成本追踪 cost-tracker.ts, utils/modelCost.ts ~1,000+ 14-成本追踪
15 辅助系统 utils/ (200+ 文件) ~100,000+ 15-工具函数库

五、学习路线与时间预估

🎯 推荐学习路径(由浅入深)

第 1 周:宏观理解
├─ 读本总览文档
├─ 读 01-启动流程:理解从 CLI 到 REPL 的完整链路
└─ 读 02-查询引擎:理解核心 Agentic Loop

第 2 周:核心系统
├─ 读 03-工具系统:理解 Tool 抽象和具体工具
├─ 读 08-API通信:理解如何与 Claude 交互
└─ 读 05-权限系统:理解安全模型

第 3 周:用户界面
├─ 读 06-UI系统:理解 React Ink 终端渲染
├─ 读 07-状态管理:理解数据流
└─ 读 04-命令系统:理解斜杠命令

第 4 周:高级系统
├─ 读 10-上下文管理:理解 Token 压缩算法
├─ 读 11-任务系统:理解多 Agent 架构
└─ 读 09-MCP:理解协议扩展

第 5-6 周:专项深入
├─ 读 12-Bridge:理解远程模式
├─ 读 13-插件技能:理解扩展机制
├─ 读 14-成本追踪
└─ 读 15-工具函数:按需查阅

⏰ 时间预估(对于有 2-3 年 TypeScript 经验的开发者)

阶段 目标 时间
能跑起来、能改配置 理解入口和配置 2-3 天
能读懂核心流程 理解 Agentic Loop 1-2 周
能修改/添加工具 理解工具系统 2-3 周
能独立改 UI/命令 理解 UI + 命令 3-4 周
基本掌握全部模块 通读所有模块 6-8 周
深度掌握(能重构核心) 理解每个算法和设计决策 3-6 月

⚠️ 70 万行不需要逐行读。大约 30% 是 UI 组件(可按需看),20% 是工具函数(当字典查),15% 是类型定义。核心逻辑链路约 5-8 万行,这是需要深读的。


六、Agent 系统的学术演进

理解 Claude Code 的架构设计,需要先了解 AI Agent 领域的学术脉络。这里的”Agent”指的不是传统强化学习中的 agent,而是以 LLM 为推理核心,通过工具调用与外部环境交互的智能体系统

6.1 从 ReAct 到 Tool Use

2023 年,Yao 等人提出的 ReAct(Reasoning + Acting)模式奠定了现代 Agent 系统的基础范式。论文 ReAct: Synergizing Reasoning and Acting in Language Models(Yao et al., ICLR 2023)的核心洞察是:

将推理(Reasoning)和行动(Acting)交织在一起,LLM 可以同时进行”思考接下来做什么”和”实际执行操作”,两者相互增强。

ReAct 的循环结构如下:

Thought → Action → Observation → Thought → Action → ... → Final Answer

这与 Claude Code 的 Agentic Loop 几乎一致:

  • Thought = LLM 在 System Prompt 引导下的推理过程
  • Action = tool_use block(读文件、运行命令等)
  • Observation = tool_result(命令输出、文件内容等)

6.2 Toolformer 与工具调用范式

在 ReAct 之前,Meta AI 的 Toolformer(Schick et al., NeurIPS 2023, Toolformer: Language Models Can Teach Themselves to Use Tools)首次证明了 LLM 可以通过自监督学习自主决定何时调用外部工具。其方法是通过在训练语料中插入 API 调用标记,让模型学会:

The weather in Paris is cloudy → The weather in Paris is [WeatherAPI(Paris)] → rainy

这一工作奠定了 工具调用作为 LLM 原生能力的理论基础。Claude Code 将这一思想发挥到极致:不仅支持 LLM 内置的工具调用,还通过 MCP(Model Context Protocol)将工具生态扩展到任意第三方服务。

6.3 从单 Agent 到多 Agent 协作

随着单个 Agent 能力的饱和,学术界开始探索多 Agent 协作。关键论文包括:

论文 核心贡献 与 CC 的关联
AutoGen (Wu et al., 2023) 多 Agent 对话框架,支持 Agent 间通信 CC 的 Swarm 系统灵感来源
ChatDev (Qian et al., 2024) 模拟软件公司角色(CEO、CTO、程序员)的 Agent 协作 CC 的 Task/Teammate 模式
MetaGPT (Hong et al., 2024) 引入 SOP(标准操作流程)的多 Agent 框架 CC 的子 Agent + Mailbox 通信

Claude Code 的多 Agent 系统(Swarm、Task InProcessTeammate)吸收了这些论文的核心思想:Agent 间通过消息传递协作,每个子 Agent 拥有独立的上下文窗口

6.4 Coding Agent 的里程碑

AI 编码助手从 2021 年 GitHub Copilot 起步,经历了快速迭代:

2021 Q2  GitHub Copilot 发布(基于 Codex,代码补全模式)
2022 Codex 论文 (Chen et al., arXiv:2107.03374)
2023 Q1 Copilot X(开始引入聊天 + 智能操作)
2023 Q3 SWE-bench 基准发布 (Jimenez et al., arXiv:2310.06770)
2024 Q1 Devin 发布(首个"AI 软件工程师"概念产品)
2024 Q2 SWE-Agent (Yang et al., arXiv:2405.15793)
2024 Q4 Claude Code 发布(终端原生 Agent,全文件操作)

Claude Code 与 SWE-Agent 在设计上有很多共鸣——两者都强调 Agent-Computer Interface(ACI) 的设计,即如何让 LLM 高效地与文件系统、终端、编辑器交互。SWE-Agent 论文提出的 ACI 设计原则(简洁的观察格式、最小化 token 消耗、防御性解析)在 Claude Code 的工具设计中都有体现。


七、关键设计理念深度分析

7.1 “一切皆工具” (Tool-First) 的架构哲学

Claude Code 的核心范式是 LLM 通过 tool_use 与外界交互。这一设计并非偶然——它直接来源于 Anthropic 对 Tool Use API 的深度理解和以下工程原则:

原则 1:最小化模型与环境的耦合

每个工具是一个自治的模块,拥有独立的:

  • Description(描述)— LLM 用来判断何时调用
  • Input Schema(输入 Schema)— Zod v4 校验
  • Execute 函数 — 实际的副作用执行
  • Permission Handler — 权限检查

这种设计可以追溯到 The Design of Everyday APIs 的核心理念:好的 API 让使用者(此处是 LLM)只需知道”做什么”而不是”怎么做”。

原则 2:工具的可组合性优于工具的复杂度

与其提供一个”修改整个项目”的超级工具,不如提供 30+ 个原子化工具(读文件、写文件、搜索、运行命令…),让 LLM 自行组合。这类似于 Unix 哲学中的”小工具组合”思想。

原则 3:工具即边界(Tool as Boundary)

每个工具执行都是一次权限边界穿越。在工具执行前后:

  • canUseTool → 权限规则检查
  • runTool → 实际执行(可能有 sandbox)
  • postToolUse → 副作用追踪、日志记录

7.2 Agentic Loop 的控制论视角

从控制论(Cybernetics)的角度看,Agentic Loop 是一个闭环反馈控制系统

         ┌──────────┐
Goal ──→│ LLM │──→ Action ──→ Environment
│ │ │
└──────────┘ │
↑ │
└── Observation ←────────┘

关键的工程挑战:

  1. 收敛性:如何确保 loop 不会无限循环?→ maxTurns 限制 + stop_reason 检测
  2. 稳定性:如何避免 LLM 在循环中”遗忘”目标?→ System Prompt 中的任务固守机制
  3. 效率:如何减少不必要的工具调用?→ Parallel Tool Calling(并行工具调用)

7.3 流式优先 (Streaming-First) 的工程意义

在 Claude Code 中,每一个 API 调用都是 Streaming 的。这不是性能优化,而是架构基础:

  • UX 层面:用户可以在 LLM “思考”时看到每一个 token,感知延迟从”等待完整响应”变为”实时跟随”,体验提升显著
  • 架构层面:Streaming 意味着 LLM 的 tool_use block 可以在完整响应结束前就开始执行。CC 利用这一特性实现了 Streaming Tool Execution——当 LLM 输出 tool_use 标记后立即开始准备工具执行,无需等待剩余 token 生成完毕
  • 可靠性层面:Streaming 允许客户端检测连接中断并自动重连(withRetry 机制在 Streaming 场景下的设计)

这一设计的理论基础可以追溯到人机交互领域的 渐进式反馈(Progressive Feedback)原则:Nielsen (1993) 在可用性启发式原则中指出的”系统状态的可见性”。

7.4 权限分层的安全模型

Claude Code 的权限系统采用多层防御

Layer 0: System Prompt 约束(软限制)
Layer 1: 权限规则引擎(基于模式匹配的规则)
Layer 2: 分类器判断(基于启发式的危险操作检测)
Layer 3: 用户确认(交互式弹窗)
Layer 4: Sandbox 隔离(操作系统级隔离)

这与 Saltzer & Schroeder (1975) 在 The Protection of Information in Computer Systems 中提出的最小权限原则(Principle of Least Privilege)完全一致:每个工具实例只应拥有完成其任务所需的最小权限集合。


八、与主要 Agent 框架的架构对比

维度 Claude Code LangChain AutoGPT SWE-Agent
定位 终端编程助手 通用 LLM 应用框架 自主任务执行 软件工程 Agent
架构模式 自研 Agentic Loop LCEL / Runnable 循环 + 记忆 ACI + ReAct
工具系统 30+ 内置,MCP 扩展 插件式 Tool 抽象 命令式 自定义 ACI 命令
多 Agent Swarm + Task 无原生支持
状态管理 自研 Zustand-like callbacks/memory 文件存储 Python dict
权限控制 4 层防御 用户确认
UI React Ink 终端 无 GUI Web CLI
流式支持 全链路 Streaming 部分支持

Claude Code 在架构上的核心区分点

  1. 终端原生而非 Web:省去跨进程通信的复杂性
  2. 自研而非依赖框架:每个组件都是为编程场景定制
  3. 安全优先:代码执行 = 必须在受控环境中

九、为什么选择这样的架构 —— 设计决策回溯

9.1 为什么用 TypeScript 而非 Python?

Python 是 AI 领域的主流语言,但 Claude Code 选择了 TypeScript:

  • 终端生态:Node.js 是 CLI 工具的主流运行时
  • 类型安全:70 万行代码如果没有类型系统,重构风险巨大
  • React 生态:Ink(React for terminal)直接在 Node 上运行
  • npm 生态:Commander.js、chalk、ora 等成熟 CLI 库

9.2 为什么自研 Store 而非用 Redux/Zustand?

  • 不需要 Redux 的 action/reducer 样板代码
  • 不需要 Zustand 的 React 绑定
  • 只需要一个发布/订阅模式:subscribe(key, callback) + set(key, value)
  • 类似 Zustand 的 API 设计但不到 200 行代码

9.3 为什么用 Bun 做构建工具?

  • Bun 的 bun:bundle 插件支持条件编译if (feature('INTERNAL')) { ... }
  • 可以 Dead-Code-Elimination 整个内部功能模块(如调试工具、内部遥测)
  • 对外发布的构建体不包含任何内部代码

9.4 为什么引入 MCP?

MCP(Model Context Protocol,规范链接)解决了 Agent 工具的 N × M 集成问题

  • N 个 Agent 框架 × M 个外部服务 = N × M 个集成
  • 通过标准化协议,变成 N + M

Claude Code 是 MCP 的首个完整实现参考,支持 mcpServers 配置动态加载外部工具。


十、核心工程挑战与架构解法

一个 70 万行的 Agent 系统在工程上需要解决哪些核心问题?以下是 Claude Code 架构中几个关键挑战及其解决方案。

10.1 上下文窗口的稀缺性与管理策略

问题:Claude 3 系列模型支持 200K token 的上下文窗口,但对于一个包含 70 万行代码的项目来说,这仍然严重不足。每次 API 调用只能携带有限的代码上下文。

解法:多层级上下文管理

Level 1: 直接读取 — 通过 Read/Grep/Glob 工具按需获取文件内容
Level 2: 记忆压缩 — Compact 系统将长对话压缩为结构化摘要
Level 3: 隐式上下文 — CLAUDE.md / .claude/ 目录存储项目级记忆
Level 4: 技能包 — 预加载的 Markdown 指令集(类似 RAG)

这一设计的理论基础来源于 RAG (Retrieval-Augmented Generation) 范式(Lewis et al., NeurIPS 2020, Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks)。Claude Code 不依赖向量数据库,而是利用 Grep/Glob 等传统搜索工具实现”即时检索”。

10.2 终端环境中的不确定性处理

问题:终端命令执行结果不可预测。一个 npm install 可能成功、失败、或进入交互式模式挂起。

解法:基于时间超时 + 输出缓冲的防御性执行模型

┌──────────────┐     ┌──────────────┐     ┌──────────────┐
│ 30s 超时 │ │ 输出截断 │ │ 交互式检测 │
│ kill + │ │ 前2000+后500│ │ stdin 检查 │
│ 返回 stdout │ │ 字符智能截取 │ │ 自动 fallback│
└──────────────┘ └──────────────┘ └──────────────┘

这一设计与生产环境中的 Bulkheading 模式一致(Nygard, 2007, Release It!):任何一个命令失败不应该影响整个 Agent 会话。

10.3 Token 成本的经济学

Claude Code 中每次 API 调用都是有成本的。对于一个典型的编程 session:

阶段 Token 消耗 占比 优化策略
System Prompt 2-8K tokens 固定开销 Prompt 缓存
对话历史 10-80K+ tokens 递增 上下文压缩
工具调用 2-20K tokens 变动 并行 vs 串行
积极响应 0.5-2K tokens 按需 end_turn 提前

成本优化的关键策略来自 Anthropic 的 Prompt Caching 机制:systemmessages 中可以标记需要缓存的 content block。Claude Code 将 System Prompt 和 CLAUDE.md 内容标记为可缓存,减少 90% 的重复处理成本

相关论文:Anthropic (2024), Prompt Caching with Claude

10.4 并发执行的架构挑战

Claude Code 支持并行工具调用(Parallel Tool Calling),多个独立的工具可以在同一回合中并发执行:

Turn N:
├─ tool_use: ReadFile("src/a.ts") ┐
├─ tool_use: ReadFile("src/b.ts") │ 并行执行
└─ tool_use: Grep("TODO", "./src") ┘

Turn N+1:
├─ tool_result: (内容 of a.ts)
├─ tool_result: (内容 of b.ts)
└─ tool_result: (TODO 搜索结果)

并行执行的关键前提是工具间的无依赖关系。Claude Code 在工具定义中标记每个工具的 isReadOnly 属性:只读工具可以安全并行,写入工具必须串行执行或加锁。

这一设计受启发于分布式系统中的 SAGA 模式(Garcia-Molina & Salem, 1987, Sagas):长事务拆分为可独立提交/补偿的子事务。

10.5 错误恢复与会话持久化

问题:编程会话可能持续数小时。如果进程崩溃,如何恢复?

解法:基于 JSONL 日志的会话恢复机制

每次 Turn 结束后:
Write JSONL record → ~/.claude/projects/<hash>/<session-id>.jsonl

恢复时:
Read JSONL → 重建 messages[] → 重新发送到 API

这个设计可以在学术界找到对应物:Write-Ahead Logging(Gray & Reuter, 1992, Transaction Processing),确保每个操作先记录日志再执行。


十一、架构中的核心数据结构

理解 Claude Code 的数据结构是理解其架构的关键。以下是贯穿全系统的核心类型(简化版):

// 一次对话的消息类型
interface Message {
role: 'user' | 'assistant';
content: ContentBlock[];
}

type ContentBlock =
| { type: 'text'; text: string }
| { type: 'tool_use'; id: string; name: string; input: Record<string, unknown> }
| { type: 'tool_result'; tool_use_id: string; content: string; is_error?: boolean };

// 一次 Agent 会话
interface Session {
id: string;
messages: Message[]; // 完整对话历史
systemPrompt: string[]; // System Prompt 分段
permissionMode: 'default' | 'acceptEdits' | 'bypassPermissions' | 'plan';
tools: Tool[]; // 可用工具集
abortController: AbortController;
}

// 工具抽象
interface Tool {
name: string;
description: string;
inputSchema: z.ZodSchema;
isReadOnly: boolean;
needsPermissions: boolean;
execute: (input: ToolInput, context: ToolContext) => Promise<ToolResult>;
}

// 状态管理(简化 Store API)
interface Store<T> {
get(): T;
set(partial: Partial<T>): void;
subscribe(listener: (state: T, prev: T) => void): () => void;
}

这些数据结构的核心设计原则来自 Parnas (1972, On the Criteria To Be Used in Decomposing Systems into Modules):将最可能变化的设计决策封装在模块内部。例如 Tool.execute 的签名稳定,但内部实现可以随版本任意变化。


十二、全系列阅读指南

核心必读(理解 Agent 系统的心脏)

序号 标题 核心问题 建议时间
00 总览与学习路线 这个系列在讲什么? 30 分钟
02 Agentic 查询循环 Agent 如何”思考”? 2 小时
03 工具系统 LLM 如何操作你的电脑? 3 小时
10 上下文管理 如何在 200K 窗口内处理 70 万行代码? 2 小时

进阶深入(理解工程实现)

序号 标题 核心问题 建议时间
05 权限与安全 如何防止 Agent 删库? 2 小时
08 API 通信 Streaming 如何工作? 1.5 小时
09 MCP 协议 如何无限扩展工具? 2 小时
11 多 Agent 系统 多个 Claude 如何协作? 2 小时

专项研究(按需阅读)

序号 标题 核心问题 建议时间
06 终端 UI React 如何渲染到终端? 1.5 小时
12 远程桥接 网页端如何控制本地? 2 小时
16 智能化机制 模型如何”更聪明”? 1.5 小时
21 Prompt 工程 System Prompt 如何构建? 1.5 小时
26 规划模式 Plan Mode 如何工作? 1 小时
29 用户钩子 如何注入自定义逻辑? 1.5 小时

十三、Streaming 架构深度解析

Claude Code 的 Streaming 不仅仅是”把 API 的 SSE 事件转发到终端”。它是一个完整的流式处理管道:

13.1 四层 Streaming 架构

Layer 1: API Streaming (Anthropic SSE)
├─ message_start — 消息开始
├─ content_block_start — text/tool_use 块开始
├─ content_block_delta — 增量 token/text
├─ content_block_stop — 块结束
└─ message_stop — 消息结束

Layer 2: Stream Multiplexer
├─ 解析 SSE events → ContentBlockDelta[]
├─ text delta → 终端渲染
└─ tool_use delta → 累积 JSON → 完整 input 后触发执行

Layer 3: Reactive Rendering (React Ink)
├─ useStreamingText() hook
├─ 逐 token 渲染 Markdown(支持语法高亮增量更新)
└─ 60fps 终端刷新

Layer 4: Tool Stream Manager
├─ 检测 tool_use 开始 → 预加载工具上下文
├─ 等待 input JSON 完整 → Zod 校验
└─ 启动并行/串行执行

13.2 SSE 事件的处理状态机

Streaming 在代码层面是一个有限状态机

        message_start


┌──────────────────┐
│ READING_BLOCK │◄──────────────┐
│ (等待块类型) │ │
└────┬─────────┬───┘ │
│ text │ tool_use │
▼ ▼ │
┌──────────┐ ┌──────────────┐ │
│ TEXT │ │ TOOL_USE │ │
│ (渲染) │ │ (累积 JSON) │ │
└────┬─────┘ └──────┬───────┘ │
│ │ │
▼ ▼ │
content_block_stop │ │
│ │ JSON 完整? │
│ ├─ 是 → 执行工具 │
│ └─ 否 → 继续累积 ─┘

message_stop


[End Turn]

这一设计的关键挑战在于过早工具执行问题:LLM 可能输出 tool_usename 和部分 input 字段,但完整的 input JSON 需要多个 delta 才能构建完毕。Claude Code 的策略是:

  • 等待策略:直到 content_block_stop 才触发工具执行
  • 预加载策略:在等待 input 完成的同时,预加载工具的 schema 和执行上下文
  • 超时保护:如果 SSE 流中断,已累积的部分 input 标记为 is_error

13.3 增量 Markdown 渲染

终端渲染的挑战在于:Markdown 是块级结构(一个 ``` 代码块需要成对出现),但 SSE 是字符级增量。Claude Code 的解法:

累积 buffer → 尝试解析 Markdown → 渲染可渲染的部分
└─ 未闭合的代码块暂不渲染
└─ 未闭合的列表继续累积

这与浏览器的增量 HTML 解析面临相同的问题(Garsiel & Irish, 2011, How Browsers Work),只是上下文从 DOM 树换成了 Markdown AST。


十四、性能与可扩展性

14.1 启动性能优化

Claude Code 的冷启动涉及大量 I/O 操作。优化策略:

阶段 耗时(典型) 优化策略
Node.js 启动 ~200ms 最小化 import,延迟加载
配置读取 ~100ms memoize + 文件 mtime 缓存
Git 状态检查 ~500ms 异步 + 增量检测
项目文件索引 ~2-5s .gitignore 过滤 + 并行扫描
首次 API 调用 ~1-3s 连接预建立 + Prompt 缓存命中

14.2 长会话的内存管理

一次编程 session 可能长达数小时,产生数百个 turn。如果不加管理,内存中保存的完整消息数组会导致 OOM:

// 示例:100 个 turn,每个 10K tokens
// tokens → JSON 序列化 → ~200KB/turn → 总计 ~20MB
// 加上 UI 状态、工具缓存、LSP 状态 → 轻松超过 50MB

Claude Code 的应对策略:

  • 惰性消息存储:非活跃 turn 的消息序列化到磁盘(JSONL)
  • UI 虚拟化:只渲染可见区域的 message(VirtualMessageList 组件)
  • 定期 GC:每 N 个 turn 触发一次 global.gc()(需要 --expose-gc

14.3 并发工具执行调度

当 LLM 在一次响应中请求多个工具时,CC 的调度器需要决定哪些可以并行、哪些必须串行:

// 伪代码:工具调度器
function scheduleTools(toolUses: ToolUse[]): ExecutionPlan {
const groups: ToolUse[][] = [];
let currentGroup: ToolUse[] = [];

for (const tu of toolUses) {
if (tu.tool.isReadOnly) {
currentGroup.push(tu); // 只读工具可以放在同一批次
} else {
if (currentGroup.length > 0) {
groups.push(currentGroup);
currentGroup = [];
}
groups.push([tu]); // 写入工具独占一个批次
}
}
if (currentGroup.length > 0) groups.push(currentGroup);

return {
groups, // [[并行批次1], [批次2], ...]
maxConcurrency: 4, // 每批次最多 4 个并行
};
}

这种批次执行策略借鉴了数据库事务的 2PL(Two-Phase Locking) 思想:只读锁可以共享,写锁必须独占(Bernstein et al., 1987, Concurrency Control and Recovery in Database Systems)。


十五、安全架构的学术基础

Claude Code 的权限系统不仅是工程实践,还有深厚的学术根基。

15.1 最小权限原则的工程化

Saltzer & Schroeder (1975) 提出的八大安全原则中,Claude Code 特别体现了以下几条:

  1. 最小权限(Least Privilege)— 每个工具只获得完成任务所需的最小权限
  2. 完全中介(Complete Mediation)— 每次工具调用都经过权限检查,无缓存绕过
  3. 开放设计(Open Design)— 权限规则对用户可见(CLAUDE.md / .claude/settings.json)
  4. 权限分离(Separation of Privilege)— 修改文件需要同时满足”工具允许 + 路径白名单 + 用户确认”

15.2 沙箱隔离的三个层次

Level 1: 进程级沙箱 (Node.js child_process)
└─ 独立进程,可限制 CPU/内存

Level 2: 容器级沙箱 (Docker/VM)
└─ 完全文件系统隔离,网络可控制

Level 3: 远程沙箱 (Bridge/Swarm)
└─ 代码在远端执行,本地零风险

这一多层沙箱设计与操作系统安全中的环保护(Ring Protection)模型异曲同工(Schroeder & Saltzer, 1972)。


十六、文件数量统计

src/
├── 顶层文件: ~20 个 (核心入口和类型)
├── tools/ ~40+ 个工具实现
├── commands/ ~60+ 个斜杠命令
├── components/ ~150+ 个 UI 组件
├── hooks/ ~90+ 个 React hooks
├── utils/ ~250+ 个工具函数
├── services/ ~60+ 个服务模块
├── bridge/ ~30 个桥接模块
├── state/ ~6 个状态模块
├── types/ ~10 个类型定义
└── 其他子目录 ~50+ 个辅助模块

总计约 700+ 个源文件,70 万行代码。

注:以上统计基于 Claude Code 2.1.88 源码反编译分析。实际文件分布可能因版本而异。核心逻辑链路(agentic loop + tool system + permissions + compact)约 5-8 万行,这是建议深度阅读的部分。


十七、Prompt 工程架构概览

System Prompt 是 Agent 系统的”操作系统”。它定义了 Claude 的个性、能力边界和行为规范。本节提供总览,详细分析见 21-SystemPrompt构建与Prompt工程

17.1 System Prompt 的模块化架构

Claude Code 的 System Prompt 不是一大段文本,而是由多个可组合的 section 构成:

System Prompt 结构
├── Fixed Sections(固定,每次都有)
│ ├── 角色定义:"You are Claude, an AI assistant..."
│ ├── 安全准则:拒绝有害请求、保护隐私
│ ├── 工具使用规范:何时/如何调用 tool_use
│ └── 输出格式要求:Markdown、代码块规范

├── Dynamic Sections(动态,根据上下文注入)
│ ├── CLAUDE.md 项目级指令
│ ├── 当前工作目录、Git 状态
│ ├── 已安装的技能(Skills)
│ ├── 活跃的提醒/定时器
│ └── MCP 工具列表

└── Conditional Sections(条件注入)
├── Plan Mode 激活 → 规划模式指令
├── 子 Agent 模式 → 子 Agent 约束
└── Compact 触发 → 历史摘要

17.2 Prompt 缓存的工程策略

Claude Code 充分利用 Anthropic 的 Prompt Caching 机制来降低延迟和成本:

// 伪代码:标记可缓存的 content block
const systemBlocks = [
{
type: 'text',
text: ROLE_DEFINITION + SAFETY_GUIDELINES + TOOL_SPEC,
cache_control: { type: 'ephemeral' }, // ← 标记为可缓存
},
{
type: 'text',
text: dynamicContext, // CLAUDE.md, git status, etc.
// 不缓存,因为每次都可能变化
},
];

缓存命中时(通常是 5 分钟内),System Prompt 的处理延迟从 ~2 秒降到 ~200ms,成本降低 90%。

相关机制分析参考:Anthropic (2024), Prompt Caching technical documentation;以及 Brown et al. (2020, Language Models are Few-Shot Learners) 中关于 few-shot prompting 中 prefix 稳定性的讨论。

17.3 CLAUDE.md 的 RAG 本质

CLAUDE.md(或 .claude/CLAUDE.md)本质上是一种简化的 RAG 实现

传统 RAG:
用户查询 → Embedding → 向量搜索 → 检索文档 → 拼接 Prompt

CLAUDE.md:
用户启动 Claude Code → 读取 CLAUDE.md → 拼接 System Prompt

区别在于:

  • 检索方式:RAG 用向量相似度,CLAUDE.md 用固定的文件路径
  • 更新方式:RAG 需要 re-index,CLAUDE.md 直接编辑文件
  • 粒度:RAG 返回相关片段,CLAUDE.md 是把整个文件放进上下文

这一设计的巧妙之处在于:对于编程场景,项目级的上下文信息是稀疏且稳定的——一个项目的编码规范、架构决策、技术栈选型不会频繁变化。将这类信息放在 CLAUDE.md 中,比构建向量数据库更简单、更可靠。

Lewis et al. (NeurIPS 2020, Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks) 提出了 RAG 的通用框架,Claude Code 的 CLAUDE.md 机制可以被看作该框架在编程 Agent 场景下的一个特化实例。


十八、测试与质量保障

Claude Code 质量保障体系的核心组件是 VCR(Record-Replay)测试框架(详见 27-VCR测试基础设施)。

18.1 VCR 模式:受 HTTP 测试启发

VCR 的概念来源于 Ruby 生态的 VCR gem,用于录制和重放 HTTP 交互。Claude Code 将其扩展到 Agent 系统:

录制模式 (Record):
Agent 执行 → 记录 { prompt, model_response, tool_calls, results }
→ 序列化为 JSON fixture

回放模式 (Replay):
加载 fixture → Mock API 调用 → 验证 Agent 行为一致性

18.2 测试金字塔

        /\
/ \ E2E: 完整任务执行测试
/ \ (慢但覆盖真实场景)
/------\
/ \ Integration: 工具链 + API mock
/ \ (中等速度,覆盖子系统交互)
/------------\
/ \ Unit: 纯函数测试
/________________\ (快,覆盖工具执行逻辑)

测试策略遵循传统的测试金字塔原则(Cohn, 2009, Succeeding with Agile),但增加了 Agent 特有的测试维度:行为一致性测试——同一 prompt 在不同模型版本下的行为是否可预测。

18.3 Agent 测试的特殊挑战

与传统软件测试相比,Agent 系统测试面临独有的挑战:

挑战 传统软件 Agent 系统
确定性 相同输入 → 相同输出 相同 prompt → 不同输出(温度 > 0)
可重复性 单元测试 100% 可重复 需要 mock API,但模型升级后行为变化
测试预言 明确的 expected output 输出正确性往往只能人工判断
边界条件 有限组合 Prompt 的排列组合几乎无限
耗时 毫秒级 秒到分钟级(需要等待 LLM 响应)

Claude Code 的应对策略:

  • Snapshot Testing:录制成功执行的 trace,对比新旧版本的行为差异
  • Golden Set:维护一组标准任务用例(”重构这个函数”、”修复这个 bug”),每次发布前验证
  • Canary 部署:先在内部版本测试新模型,确认行为稳定后再推给外部用户

18.4 可观测性

70 万行代码的系统需要强大的可观测性基础设施。Claude Code 的三大观测支柱:

  1. 日志系统:结构化 JSONL 日志,每个 Turn 的记录包含 prompt、response、tool calls、latency、token usage
  2. 成本追踪:实时追踪每个 API 调用的 token 消耗和美元成本(src/cost-tracker.ts
  3. 遥测系统:匿名使用统计(内部版本),用于发现性能退化和高频错误模式

这一设计的灵感来源于 Google SRE 的四大黄金信号(Beyer et al., 2016, Site Reliability Engineering):延迟、流量、错误、饱和度——在 Agent 系统中分别对应 API 延迟、token 消耗、工具执行失败率、并发会话数。


📌 以下为 01-15 章文档索引,完整系列包含 01-29 章(共 29 篇核心技术文档),涵盖工具系统、MCP 集成、多 Agent 协作、安全模型等全部子系统。

十九、文档目录

  1. 启动引导与初始化流程
  2. Agentic 查询循环与 QueryEngine
  3. 工具系统 (Tool System)
  4. 命令系统 (Command System)
  5. 权限与安全系统
  6. 终端 UI 与 React Ink
  7. 状态管理系统
  8. API 通信与 Streaming
  9. MCP 协议集成
  10. 上下文窗口管理与压缩
  11. 任务与多 Agent 系统
  12. 远程桥接 Bridge 系统
  13. 插件与技能系统
  14. 成本追踪与 Token 管理
  15. 核心工具函数库

二十、配套学习资源(三层闭环)

本系列文档(第 01–29 篇)是层级 2:源码精读层,需配合另外两层食用:

层级 1  LLM 理论层          docs/LLM技术深度系列/
层级 2 CC 源码精读层 docs/01-29.md ← 本系列
层级 3 技术栈实战层 docs/tech-stack/

层级 1 — LLM 技术深度系列(理解为什么)

不了解 LLM 原理就看源码,等于不懂 TCP 就看 Nginx 代码。建议先读 01 和 03。

文档 核心内容 建议时机
00-系列导航 全系列概览 开始前
01-Transformer架构 Attention/位置编码/KV Cache 第 1 周前
03-RLHF完整技术解析 为什么 Claude 听话 第 2 周
05-Reasoning模型训练 CoT/o1 类模型原理 第 3 周
07-长上下文技术 读完第 10 章后 第 4 周

层级 3 — 技术栈实战层(会写代码)

每个语言都有入门→进阶→高阶三级,按需取用。有语言基础可跳过 syntax/01。

语言 入口 适合场景
Python tech-stack/python/syntax/ DeepSeek 岗位主力语言
TypeScript tech-stack/typescript/syntax/ 读懂 CC 源码类型
Node.js tech-stack/nodejs/syntax/ 理解运行时和 CLI
React tech-stack/react/syntax/ 读懂 CC 的 Ink UI
LLM 接入 tech-stack/llm/ SDK/MCP/Prompt 工程
算法 tech-stack/algorithms/ 面试算法准备

推荐完整学习顺序

① 语法基础(tech-stack/*/syntax/01-基础入门)      ← 有基础可跳过
② LLM 理论(LLM技术深度系列/01 + 03) ← 半天
③ CC 源码精读(本系列 01→02→03→08→05 顺序) ← 2 周核心
④ 技术栈深入(tech-stack/ 对应语言 02-进阶特性) ← 按需
⑤ 面试冲刺(docs/两个月冲刺手册.md) ← 结合实战

附录:术语表

缩写 全称 说明
ACI Agent-Computer Interface Agent 与计算机交互的接口设计(Yang et al., 2024)
CC Claude Code Anthropic 的终端 AI 编程助手
CoT Chain of Thought 思维链推理(Wei et al., NeurIPS 2022)
DCE Dead Code Elimination 编译器优化技术,CC 通过 Bun 实现条件编译
JSONL JSON Lines 每行一个 JSON 对象的日志格式
LCEL LangChain Expression Language LangChain 的链式调用 DSL
MCP Model Context Protocol 模型上下文协议(Anthropic, 2024)
RAG Retrieval-Augmented Generation 检索增强生成(Lewis et al., NeurIPS 2020)
ReAct Reasoning + Acting 推理与行动交织的 Agent 模式(Yao et al., ICLR 2023)
RLHF Reinforcement Learning from Human Feedback 基于人类反馈的强化学习(Ouyang et al., NeurIPS 2022)
SOP Standard Operating Procedure 标准操作流程
SSE Server-Sent Events 服务器推送事件,Streaming API 的传输协议
SWE-bench Software Engineering Benchmark 软件工程任务基准(Jimenez et al., 2024)
VCR Record-Replay Test 录制-回放测试模式

参考文献

  1. Yao et al. (2023). “ReAct: Synergizing Reasoning and Acting in Language Models.” ICLR 2023. arXiv:2210.03629
  2. Schick et al. (2023). “Toolformer: Language Models Can Teach Themselves to Use Tools.” NeurIPS 2023. arXiv:2302.04761
  3. Lewis et al. (2020). “Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks.” NeurIPS 2020. arXiv:2005.11401
  4. Yang et al. (2024). “SWE-agent: Agent-Computer Interfaces Enable Automated Software Engineering.” arXiv:2405.15793
  5. Jimenez et al. (2024). “SWE-bench: Can Language Models Resolve Real-World GitHub Issues?” ICLR 2024. arXiv:2310.06770
  6. Wu et al. (2023). “AutoGen: Enabling Next-Gen LLM Applications via Multi-Agent Conversation.” arXiv:2308.08155
  7. Ouyang et al. (2022). “Training language models to follow instructions with human feedback.” NeurIPS 2022. arXiv:2203.02155
  8. Wei et al. (2022). “Chain-of-Thought Prompting Elicits Reasoning in Large Language Models.” NeurIPS 2022. arXiv:2201.11903
  9. Brown et al. (2020). “Language Models are Few-Shot Learners.” NeurIPS 2020. arXiv:2005.14165
  10. Vaswani et al. (2017). “Attention Is All You Need.” NeurIPS 2017. arXiv:1706.03762
  11. Anthropic (2024). “Prompt Caching with Claude.” docs.anthropic.com
  12. Saltzer & Schroeder (1975). “The Protection of Information in Computer Systems.” Proceedings of the IEEE.
  13. Beyer et al. (2016). “Site Reliability Engineering.” O’Reilly Media.
  14. Nygard (2007). “Release It! Design and Deploy Production-Ready Software.” Pragmatic Bookshelf.
  15. Hong et al. (2024). “MetaGPT: Meta Programming for A Multi-Agent Collaborative Framework.” ICLR 2024. arXiv:2308.00352
  16. Qian et al. (2024). “ChatDev: Communicative Agents for Software Development.” ACL 2024. arXiv:2307.07924
  17. Garcia-Molina & Salem (1987). “Sagas.” ACM SIGMOD.
  18. Gray & Reuter (1992). “Transaction Processing: Concepts and Techniques.” Morgan Kaufmann.
  19. Parnas (1972). “On the Criteria To Be Used in Decomposing Systems into Modules.” Communications of the ACM.
  20. Bernstein et al. (1987). “Concurrency Control and Recovery in Database Systems.” Addison-Wesley.
  21. Chen et al. (2021). “Evaluating Large Language Models Trained on Code.” arXiv:2107.03374. (Codex 论文)
  22. Anthropic (2024). “Model Context Protocol Specification.” modelcontextprotocol.io

💡 下一步:建议按 十二、全系列阅读指南 的推荐顺序,从核心必读章节开始,逐步深入各个子系统。每一章都是独立的知识模块,可以根据个人兴趣灵活跳转。如果你对某个模块特别感兴趣(比如多 Agent 的 Swarm 系统),可以直接跳到对应章节,再回头补充基础知识。


涉及源文件

  • bootstrap/state.ts
  • services/api/
  • services/compact/
  • services/mcp/
  • utils/modelCost.ts
  • utils/permissions/
打赏
  • 微信
  • 支付宝

评论