1. Claude Code 架构设计概述
Claude Code(代号Tengu)是Anthropic推出的AI编程CLI工具,它远不止是一个简单的LLM包装器,而是一个完整的AI Agent运行时框架。这个系统最令人印象深刻的是它将终端交互、多Agent协作和智能编程能力完美融合,为开发者提供了一个强大的AI辅助编程环境。
作为一个长期从事AI工具开发的工程师,我认为Claude Code的设计有三大突破性创新:
-
真正的多Agent协作:不同于简单的单Agent问答模式,它实现了Swarm模式的多Agent并行编排,支持tmux多进程协作,这在工程实现上是一个重大挑战。
-
完整的工具生态系统:内置40+可组合的Agent工具,从文件操作到代码执行,从网络请求到IDE集成,形成了一个完整的工具链。
-
分层记忆架构:工作记忆、会话记忆、持久记忆和Agent记忆的四层设计,解决了AI Agent长期记忆和知识整合的关键问题。
技术栈选择也体现了工程团队的深思熟虑:TypeScript提供了类型安全,Bun运行时带来了性能优势,React/Ink实现了终端UI的组件化,而Commander.js则构建了强大的CLI框架。
2. 整体架构分层解析
2.1 架构分层设计
Claude Code采用严格的分层架构设计,各层职责明确,依赖关系清晰。这种设计使得系统既保持了模块化,又能灵活扩展。以下是各层的核心功能:
code复制┌──────────────────────────────────────────────────────────────────┐
│ 接入层 (Access Layer) │
│ CLI终端 | Bridge IDE集成 | MCP Server模式 | Agent SDK | 远程会话 │
├──────────────────────────────────────────────────────────────────┤
│ 交互控制层 (Interaction Layer) │
│ REPL主循环 | 80+斜杠命令 | 快捷键系统 | 权限管理 | 状态管理 │
├──────────────────────────────────────────────────────────────────┤
│ 核心引擎层 (Core Engine Layer) │
│ QueryEngine(LLM调用) | Task调度 | 上下文管理 | 推测执行 | 费用追踪│
├──────────────────────────────────────────────────────────────────┤
│ 工具执行层 (Tool Layer) │
│ Bash | File | Web | LSP | Agent | MCP | REPL | ...40+ tools │
├──────────────────────────────────────────────────────────────────┤
│ Agent编排层 (Orchestration Layer) │
│ AgentTool | Swarm团队协作(tmux多进程) | Task生命周期管理 │
├──────────────────────────────────────────────────────────────────┤
│ 服务支撑层 (Service Layer) │
│ 记忆/Dream | MCP | OAuth | Analytics | LSP | 插件 | 语音STT │
├──────────────────────────────────────────────────────────────────┤
│ 基础设施层 (Infrastructure Layer) │
│ Bridge协议 | 传输层(WS/SSE/Hybrid) | 配置系统 | 安全沙箱 │
└──────────────────────────────────────────────────────────────────┘
2.2 分层依赖原则
各层之间的依赖关系遵循严格自上而下的原则,上层可以依赖下层,但下层不应感知上层。这种设计带来了几个显著优势:
-
清晰的模块边界:每个层只需关注自己的职责,不需要了解其他层的实现细节。
-
易于替换和升级:只要接口保持不变,可以独立替换某一层的实现而不影响其他层。
-
更好的可测试性:可以单独测试每一层的功能,通过Mock下层服务来隔离测试环境。
唯一的例外是Tool接口中的UI渲染方法(如renderToolUseMessage),这是一种控制反转设计——工具层定义渲染逻辑,但由UI层调用。这种设计使得工具可以自定义其UI表现,同时保持UI层的统一管理。
3. 核心模块深度解析
3.1 入口层设计
入口层(src/entrypoints/)是系统的大门,负责处理不同的运行模式。这种多入口设计使得Claude Code可以灵活适应各种使用场景:
| 入口文件 | 用途 | 运行模式 |
|---|---|---|
entrypoints/cli.tsx |
标准CLI交互模式 | 终端REPL |
entrypoints/mcp.ts |
作为MCP Server运行 | 被其他Agent调用 |
entrypoints/init.ts |
初始化与遥测启动 | 所有模式共用 |
entrypoints/agentSdkTypes.ts |
对外暴露的Agent SDK | 编程接入 |
main.tsx作为主入口,其启动流程体现了系统的初始化逻辑:
typescript复制main()
├── 1. initializeEntrypoint() → 环境检测、日志初始化
├── 2. eagerLoadSettings() → 加载配置
├── 3. runMigrations() → 执行数据迁移
├── 4. logStartupTelemetry() → 上报启动遥测
├── 5. prefetchSystemContextIfSafe() → 预加载系统上下文
├── 6. run() → Commander.js命令路由
└── 7. maybeActivateProactive() → 激活KAIROS主动模式
设计亮点:
- 配置加载采用优先级策略:CLI flags > 环境变量 > 项目级配置 > 用户级配置 > 远程托管配置 > Bootstrap默认配置
- 80+个斜杠命令分散在
src/commands/目录下,每个命令是独立模块,保持了代码的可维护性 - 启动时预加载系统上下文(如Git信息)可以加速后续操作
3.2 QueryEngine核心引擎
QueryEngine是整个系统的LLM调用核心,它不仅仅是API的简单封装,而是承担了多项关键职责:
typescript复制class QueryEngine {
// 核心:提交消息,返回异步流式响应
async *submitMessage(...): AsyncGenerator<Message>
// 中断当前执行
interrupt(): void
// 获取完整会话消息历史
getMessages(): readonly Message[]
// 动态切换模型
setModel(model: string): void
}
核心工作流程:
- 管理与Anthropic API的通信(流式响应)
- 维护完整的对话历史(
Message[]) - 协调工具调用循环(tool_use → tool_result → 继续对话)
- 支持运行时切换模型
- 实现消息选择器(
messageSelector)控制哪些消息发送给API
QueryEngine与ask()的关系体现了状态管理与无状态操作的分离:
QueryEngine是有状态的会话管理器ask()是无状态的单次API调用submitMessage()内部循环调用ask(),形成完整的工具调用链
3.3 工具系统设计
工具系统是Claude Code执行能力的核心,采用接口驱动的插件化设计。每个工具通过buildTool()工厂函数构建,输入使用Zod schema校验。
Tool基类接口的关键设计:
typescript复制interface Tool<Input, Output> {
// 核心执行
call(input: Input): Promise<Output>
// 权限与安全
checkPermissions(input: Input): PermissionResult
isReadOnly(input: Input): boolean
isDestructive?(input: Input): boolean
// 并发控制
isConcurrencySafe(input: Input): boolean
interruptBehavior?(): 'cancel' | 'block'
// UI渲染
renderToolUseMessage(input): ReactNode
renderToolResultMessage?(output): ReactNode
}
工具分类示例:
- 文件系统类:FileReadTool、FileWriteTool、FileEditTool
- 代码执行类:BashTool、PowerShellTool、REPLTool
- 网络类:WebFetchTool、WebSearchTool
- Agent编排类:AgentTool、TaskCreateTool、SendMessageTool
设计优势:
- 每个工具是自包含的单元,封装执行逻辑、权限策略、并发语义和UI渲染
- 新增工具只需实现接口,无需修改框架代码
- Zod schema确保输入类型安全
- 工具可以定义自己的并发行为和中断策略
3.4 多Agent编排系统
多Agent编排是Claude Code最复杂的子系统,实现了真正的Swarm模式并行协作。
架构模式:
code复制主Agent (Orchestrator)
│
├── AgentTool.call() → 启动子Agent(进程内)
├── TaskCreateTool → 创建异步后台任务
└── TeamCreateTool → 创建Swarm团队(tmux多进程)
│
├── Teammate 1 (独立进程)
├── Teammate 2 (独立进程)
└── SendMessageTool → Agent间消息传递
Swarm团队协作关键机制:
- 每个Teammate运行在独立的tmux pane中(真正的多进程隔离)
- 支持Git Worktree隔离(每个Teammate独立的工作树)
- Agent间通过
Inbox消息队列通信 agentNameRegistry实现名称到AgentId的映射- Worker沙箱权限控制网络访问等敏感操作
内置Agent类型:
generalPurposeAgent:通用任务执行planAgent:复杂任务规划(ULTRAPLAN底层)exploreAgent:代码库探索与理解claudeCodeGuideAgent:Claude Code使用指导
工程实现技巧:
- 使用
agentColorManager在终端中用颜色区分不同Agent的输出 filterToolsForAgent()为不同Agent提供不同的工具集(安全隔离)resolveAgentTools()动态解析可用工具- 子Agent拥有独立的
QueryEngine实例和消息历史 agentMemory支持快照与同步
4. 关键子系统设计
4.1 权限系统设计
权限系统采用多层级、多模式设计,是安全模型的核心。
权限模式对比:
| 模式 | 行为 | 适用场景 |
|---|---|---|
| 交互模式(default) | 每次写操作/Shell命令需用户确认 | 日常使用 |
| Auto模式 | 分类器自动判断安全性 | 信任度较高的场景 |
| Plan模式 | 只规划不执行 | 复杂任务预审 |
| Bypass模式 | 跳过所有权限检查 | 受控环境(有killswitch) |
权限检查链:
code复制LLM请求tool_use
│
├── isReadOnly? → 是则直接执行
├── isAutoModeActive? → 分类器判断
├── checkPermissions → 路径校验+沙箱检查
└── denialTracking → 连续拒绝追踪
安全机制亮点:
bypassPermissionsKillswitch:远程紧急禁用Bypass模式denialTracking:防止Agent反复尝试被拒绝的操作pathValidation:严格的路径校验,防御目录遍历攻击expandTilde():安全的~展开,避免路径注入
4.2 记忆系统架构
Claude Code实现了分层记忆架构,是其区别于普通LLM包装器的关键特性。
记忆层次:
code复制┌─────────────────────────────┐
│ 工作记忆 (Working Memory) │
│ 当前对话的消息历史 │
├─────────────────────────────┤
│ 会话记忆 (SessionMemory) │
│ 当前会话的结构化记忆 │
├─────────────────────────────┤
│ 持久记忆 (memdir/) │
│ MEMORY.md索引+主题文件 │
├─────────────────────────────┤
│ Agent记忆 (agentMemory) │
│ 每种Agent类型独立的记忆目录 │
└─────────────────────────────┘
自动整合记忆(autoDream)流程:
code复制1. Orient → 读取MEMORY.md索引
2. Gather → 扫描增量会话日志
3. Consolidate → 提炼新知识
4. Prune → 更新MEMORY.md索引
关键技术:
consolidationLock:文件锁防止并发整合冲突isGateOpen():基于时间间隔控制整合频率listSessionsTouchedSince():增量扫描优化性能- Dream与KAIROS解耦:独立于特性标志
4.3 上下文窗口管理
长对话场景下的上下文管理是AI Agent的核心挑战。Claude Code实现了多层级的上下文压缩策略。
压缩层次对比:
| 层级 | 触发条件 | 策略 |
|---|---|---|
| MicroCompact | 每轮对话后 | 增量压缩,保留prompt cache命中率 |
| AutoCompact | Token使用超过阈值 | 自动触发完整压缩 |
| 手动Compact | 用户执行/compact |
用户主动触发 |
| PTL Retry | API返回prompt_too_long | 紧急截断头部消息重试 |
压缩流程关键技术:
getEffectiveContextWindowSize(model):模型动态计算窗口大小getAutoCompactThreshold(model):不同模型的自动压缩阈值calculateTokenWarningState():Token使用量预警系统sessionMemoryCompact:保留会话记忆的关键信息cachedMicrocompact:MicroCompact结果缓存优化
4.4 状态管理系统
采用类Zustand的不可变状态+选择器订阅设计,基于React Context:
typescript复制type Store<T> = {
getState(): T
setState(f: (prev: T) => T): void
subscribe(listener: () => void): () => void
}
// React绑定
AppState → AppStateStore → AppStateProvider
// 访问方式
useAppState(selector) // 选择器模式订阅
useSetAppState() // 获取状态更新函数
useAppStore() // 获取完整store实例
状态域分类:
- 会话:settings, mainLoopModel, statusLineText
- Agent/Swarm:tasks, agentNameRegistry, teamContext
- Bridge:replBridgeEnabled/Connected/SessionActive
- MCP:mcp.clients, mcp.tools, mcp.commands
- 插件:plugins.enabled/disabled/errors
- UI:expandedView, footerSelection, activeOverlays
设计优势:
- 不可变状态确保可预测性
- 选择器模式避免不必要的重渲染
- 类型安全的状态定义(约400行类型定义)
- 细粒度的状态域划分
5. 高级特性解析
5.1 KAIROS — 主动式助手
KAIROS是一个"始终在线"的后台Agent,通过maybeActivateProactive()激活:
- 持续监控项目日志和变更
- 无需用户输入,主动发现问题并采取行动
- 与
setKairosActive()/getKairosActive()全局状态联动 - 可通过
kairosEnabled配置开关控制
实现技巧:
- 使用文件系统监视器检测变更
- 设置合理的轮询间隔避免性能问题
- 通过状态管理协调主动行为和用户交互
5.2 ULTRAPLAN — 深度规划
ULTRAPLAN通过planAgent实现,将复杂任务卸载到远程Opus 4.6会话:
- 最长运行30分钟,用于深度思考的复杂规划
- 结果返回给主Agent继续执行
- 状态机设计:
ultraplanLaunching→ultraplanSessionUrl→ultraplanPendingChoice - 用户可选择在当前会话实施计划或开启新会话
工程考量:
- 长时间运行任务的管理和监控
- 结果序列化和反序列化
- 用户交互界面设计
- 错误处理和恢复机制
5.3 推测执行 (Speculation)
预测用户下一步意图并提前执行,减少等待时间:
typescript复制type SpeculationState =
| { status: 'idle' }
| { status: 'active',
id: string,
abort: () => void,
messagesRef: { current: Message[] },
writtenPathsRef: { current: Set<string> },
boundary: CompletionBoundary | null,
isPipelined: boolean
}
关键技术点:
CompletionBoundary:定义推测执行的边界条件speculationSessionTimeSavedMs:统计节省的时间- overlay文件系统:推测结果写入临时区域,确认后才应用
- 预测算法:基于历史行为和当前上下文预测最可能的下一步操作
5.4 Swarm模式实现细节
Swarm模式实现了真正的多Agent并行协作,关键技术包括:
- 进程隔离:每个Teammate运行在独立的tmux pane中
- Worktree隔离:支持Git Worktree为每个Teammate提供独立环境
- 消息路由:通过
Inbox和SendMessageTool实现Agent间通信 - 权限控制:
workerSandboxPermissions管理子Agent权限 - 资源管理:
agentMemory实现记忆隔离和同步
性能优化技巧:
- 限制并行Agent数量
- 实现轻量级消息协议
- 使用共享内存优化大数据传输
- 实现优雅降级机制
6. 工程实践与设计模式
6.1 关键设计模式应用
| 模式 | 应用场景 | 具体实现 |
|---|---|---|
| 插件/策略模式 | Tool系统、传输层 | Tool接口 + buildTool()工厂 |
| 观察者模式 | 状态管理、Bridge事件 | Store.subscribe() |
| 命令模式 | CLI子命令、斜杠命令 | Commander.js注册 + Command类型 |
| 异步生成器模式 | LLM流式响应 | async function* ask() |
| 控制反转(IoC) | 工具UI渲染 | 工具定义渲染方法,UI层调用 |
| 不可变状态模式 | 全局状态管理 | DeepImmutable<AppState> |
| 文件锁模式 | 记忆整合并发控制 | tryAcquireConsolidationLock() |
| 断路器模式 | 权限系统 | denialTracking机制 |
6.2 性能优化实践
- Prompt缓存:
getPromptCachingEnabled(model)按模型控制缓存 - 增量压缩:MicroCompact实现缓存友好的增量压缩
- 懒加载:工具和插件按需加载
- 并行执行:支持并发安全的工具并行执行
- 推测执行:提前预测并执行可能的需求
- 选择性渲染:终端UI只更新变化的部分
- 内存管理:及时清理不再需要的缓存和状态
6.3 错误处理与容错
- 分级错误处理:从警告到严重错误分级处理
- 自动恢复:网络中断后自动重连
- 状态快照:关键操作前保存状态以便恢复
- 隔离设计:Swarm模式中单个Agent失败不影响整体
- 用户反馈:清晰的错误信息和解决建议
- 日志系统:详细的运行日志便于问题诊断
- 遥测数据:收集性能指标和错误报告用于改进
7. 架构设计经验总结
7.1 成功的设计决策
-
React/Ink终端UI:将组件化思想引入CLI,虽然引入React运行时开销,但通过
fpsMetrics监控保证了性能可控。 -
统一的Tool接口:每个Tool既负责执行逻辑,也负责UI渲染,高内聚设计使新增工具无需修改框架代码。
-
QueryEngine作为单一LLM网关:统一管理token计数、历史记录、模型切换和中断控制,架构清晰。
-
Bridge解耦IDE与CLI:通过标准协议实现IDE集成,使核心逻辑可以独立运行或被各种IDE接入。
-
分层记忆架构:工作记忆→会话记忆→持久记忆→Agent记忆的四层设计,覆盖了从即时到永久的完整记忆需求。
7.2 面临的挑战与解决方案
-
长对话上下文管理:通过MicroCompact→AutoCompact→PTL Retry三级策略平衡上下文利用率和API成本。
-
多Agent协作复杂性:采用tmux多进程实现真正的隔离,通过消息队列和命名服务简化通信。
-
权限管理粒度:多模式权限系统结合自动分类器和交互确认,在便利性和安全性间取得平衡。
-
性能优化:推测执行、Prompt缓存、增量压缩等多种技术综合应用,提升响应速度。
-
错误恢复:完善的状态管理和隔离设计,确保局部故障不影响整体系统运行。
7.3 对未来架构的启示
-
模块化设计:清晰的层次划分和接口定义是系统可扩展的基础。
-
渐进式复杂度:从简单核心开始,逐步添加高级功能,保持架构稳定。
-
可观测性:完善的日志、监控和诊断工具是维护复杂系统的关键。
-
安全第一:从设计初期就考虑安全因素,建立纵深防御体系。
-
用户体验:技术复杂性应该隐藏在简洁的接口之后,对用户保持友好。