先说几个核心判断:Claude Code 并非那种“套个壳、调个 API”的玩具级工具。它的工程实现深度,放在整个 AI 编程助手赛道里,都称得上是教科书级别的架构范本。从意外流出的源码来看,这套系统把大语言模型当作计算核心,但真正撑起它的,是一套高度抽象、解耦、且具备极佳扩展性的现代软件架构。
本文会从技术栈选型、终端前端渲染、核心逻辑引擎、工具链协议、状态管理体系以及扩展通信桥接等几个维度,对这份源码进行彻底的拆解和分析。
代码仓库: https://github.com/sanmuny/claude-code-source-code
核心架构示意图
在深入具体代码之前,先通过一张模块交互全景视图,建立起对整个系统的直观认知:

1. 核心架构与技术栈概览
翻看 package.json 以及核心代码目录,能清晰感受到作者在技术选型上的激进与务实。这套技术栈的核心考量,是在启动性能与开发效率之间找到最佳的平衡点。
核心语言与运行时基座:整个系统用 TypeScript 严格类型约束编写,并且在部分执行环节强依赖 Bun 的运行时特性(bun:bundle、高性能 I/O 等)。这不仅保障了类型安全,更让 CLI 应用彻底摆脱了传统 Node.js 启动慢的痛点。
现代化 CLI UI 解决方案:比较有意思的是,控制台部分没有采用 inquirer 或原生 curses 这类成熟方案,而是直接用了 React 配合 Ink(src/main.tsx、src/ink.ts),实现复杂的状态驱动与声明式渲染。这背后是对前端工程化理念的极致复用。
分层安全隔离:作为一个能直接执行 bash 命令的 AI 助手,安全是头等大事。架构中存在细粒度的防脱逃策略与权限审查系统,比如隔离层设计的 permissionDenials 和 handleOrphanedPermission 回调。
总体来看,从视觉交互到底层协议通信,架构清晰地划分为四个层级:UI 层、控制引擎层(QueryEngine)、执行层(Tools & Tasks)、以及基础设施服务层(Bridge & MCP)。
2. 交互的起点:脱胎换骨的终端组件系统
终端即组件:基于 React & Ink
源码的入口流转文件定位在 src/main.tsx。借助 React 的虚拟 DOM 特性,开发者把复杂的 CLI 交互逻辑抽象成了一套生命周期完整的树状组件系统。这意味着,终端内的文字闪烁、进度条更新、历史记录滚动——全都由 React 的 useState 和 useEffect 来驱动。
src/interactiveHelpers.tsx数据劫持与重绘:该模块劫持终端标准输入(stdin),拦截用户特殊键位输入,并对外暴露基础渲染方法(如renderAndRun),让命令行界面也能像 Web 页面一样实现复杂的“双向绑定”。src/replLauncher.tsx与高度定制的键盘映射:结合src/keybindings/中的复杂配置,该模块构建了一个类似 Vim 但更友好的 REPL。用户不仅可以输入自然语言,还能通过快捷键触发不同的 Agent 技能集。- 富文本对话框
src/dialogLaunchers.tsx:传统纯文本 CLI 很难处理复杂的选项与表单。而基于 Ink,这里实现了“确认授权”、“隐私策略更新配置”等全功能的沉浸式对话框(Wizard UI)。
3. 大脑中枢系统:QueryEngine(迭代引擎)
一切复杂逻辑的心脏封装在 src/QueryEngine.ts 中。作为 Agent 的承载体,它实现了 LLM → 观察 → 思考 → 执行的大循环。
Agent 运转循环(The ReAct Loop)
每次调用 QueryEngine.submitMessage(),就开启了一个新的处理回合。在这个循环里,它的核心权责涵盖:
- 多维度上下文编排(Context Window Management):从
UserContext抓取用户环境变量及当前工作目录(CWD),混合SystemContext乃至动态的微调 Prompt 模板,在mutableMessages栈中合成最终的请求负载。 - 模型驱动执行通道:位于
src/services/api/claude.js的统一 LLM 客户端封装,接管了底层请求逻辑。为了容错与成本控制,架构支持多模型动态切换——比如高算力的 Main Loop Model 与速度优先的 Fallback Model 的降级策略。 - Tool Use 拦截器与生命周期:当大模型返回特定的
XML 或 JSON 标签时,引擎会停止对话输出,拦截此消息并交给权限网关(CanUseToolFn)审计。如果通过,则在本地运行时触发对应沙箱,抓取stdout / stderr,再通过Tool Result将物理世界的结果喂还给模型,进入自驱动的下一迭代。
针对大型工程优化的高级机制
- 历史片段裁剪(Snip History):在大规模连续修改文件的场景下,历史记录会迅速撑爆 Token 上限。借助
snipReplay与HISTORY_SNIP相关的标记方法,引擎能智能压缩、摘要化废弃的链式推理过程,把宝贵的上下文留给代码片段。 - 状态感知缓存(
FileStateCache):面对模型针对同一份代码的反复读写查询,通过建立内存级别的状态快照,避免灾难性的连续磁盘 I/O 锁现象。
4. 驱动现实引擎:工具与指令的深度设计
大模型本身只会说不会看,工具(Tools 与 Commands)就是它的手和眼。
一阶扩展:原生宿主工具集
src/Tool.ts 提供了一个符合标准化 Function Calling 接口协议和 JSON Schema(ToolInputJSONSchema)签名的基类和注册表:
- 微观型工具:如
TerminalCaptureTool,支持启动一个隔离的 bash shell,让 LLM 探查底层环境。 - 验证型工具:如
VerifyPlanExecutionTool,甚至在后续加入了静态 AST 分析模块。 - 工作流排版:包含
WorkflowTool在内的模块,允许 LLM 主动挂起当前任务,创建一个复杂的批处理任务流。当 LLM 确认操作时,QueryEngine将解析对应的执行体,并通过沙盒进行真正的副作用操作。
二阶扩展:全面拥抱 MCP 协议(Model Context Protocol)
纵观当前源码库,架构设计中最前沿且最精妙的设计,莫过于对 MCP 标准通信协议(src/services/mcp/)的内建支持:
CLI 本身主动承担起了 MCP Client 的角色。在启动流程(fetchBootstrapData、prefetchAllMcpResources)中,会嗅探本地是否存在其他支持 MCP 的服务器进程。这意味着,Claude Code 可以毫不费力地接入第三方构建的工具箱服务——未来它可以调用 Figma、GitHub Actions,甚至自制私有代码库搜索 API。这种设计赋予了产品无限的可扩展性与跨界复用的生命力。
5. 跨界桥接与指令总线:Bridge 层详解
如何让终端内的孤岛与广阔的 IDE 环境甚至云原生容器通信?答案藏在神秘的 src/bridge/ 目录中。通过 bridgeApi.ts、bridgeMessaging.ts 可以推测出,内部实现了一套强韧的 IPC(进程间通信)通道模型。
- 多态通讯
ReplBridge(replBridge.ts):连接基于 CLI 的运算进程和潜在的外部宿主应用(典型的如 VS Code 主干插件,或者系统托盘小程序),使得数据流能以异步非阻塞形式推送。 - 防线体系(
bridgePermissionCallbacks.ts/capacityWake.ts):提供远端唤醒和外置沙盒校验机制。比如当大引擎计划执行可能“删库”的操作时,不仅受本地 UI 提示,还要通过安全回调获取上层工作区的显式安全指令。
6. 与项目共同成长的核心理念:多级记忆机制(Memory)
真正聪明的助手是能够被“养成”的。这离不开其高度解耦的知识状态管理器。
- 智能目录库(
src/memdir/):不同于简单地存取对话日志,系统分层次保存记忆。会话级缓存(Session Memory)供单次任务连贯追踪,而代码库级缓存(Repo Memory)和用户级倾向则持久化留存在特定目录。 - 零配置项目向导(
src/projectOnboardingState.ts):初见一套新代码,该模块负责对项目进行诊断化画像收集,构建本地特有的认知——比如获悉哪些目录应当回避、编译执行指令是什么,直接跳过了传统的人类指导流程。 - 时序文件回滚(
src/utils/fileHistory.ts):考虑到模型有时会写出不可靠的 Bug 代码,源码通过记录本地操作快照栈,实现了类似 Git Checkout 的低成本文件还原追踪能力。
总结
透过源码管中窥豹,Claude Code 绝非那种拼凑出来的玩具 API 发送器。这是一个高度工程化的专业级 Agent 操作系统。
它通过激进采用 React Ink 重新定义了渲染性能与交互表现,依托 Bun 保障冷启动红利。真正的护城河则体现在 QueryEngine 的自驱动闭环设计、对本地终端环境深度的沙盒化掌控,以及前瞻性地接入 MCP 协议。再加上复杂的 Memory 构建机制与 Bridge 多端桥接理念——这份源码完美演示了一款商业级、平台化的下一代 AI 编程工具应该具备的发展路线图与架构基石。
