Claude Code 源码架构深度分析

16 min read

最近花时间深入分析了 Claude Code 的源码架构,这是一个基于终端的 AI 编程助手,通过自然语言交互帮助用户完成代码编写、文件操作、命令执行等任务。

作为一个技术含量很高的开源项目,它的设计思路和实现细节非常值得学习。本文将从整体架构、核心模块、数据流、权限系统等维度进行深入分析。

项目概述

核心能力

能力描述
代码理解读取、分析、搜索代码库
文件操作读取、编辑、创建文件
命令执行执行 Shell/PowerShell 命令
多 Agent 协作支持多个 Agent 并行工作
MCP 集成通过 Model Context Protocol 连接外部服务
插件系统可扩展的插件架构
技能系统预定义和自定义技能

运行模式

Claude Code 支持三种运行模式:

  • REPL 模式:交互式终端 UI,实时反馈,权限对话框
  • SDK/Headless 模式:JSON 输入输出,脚本集成,无 UI 交互
  • 远程模式:WebSocket 连接,云端会话,多端同步

技术栈

核心技术

类别技术用途
运行时Bun / Node.jsJavaScript 运行时
语言TypeScript类型安全的 JavaScript 超集
UI 框架React + Ink终端 UI 渲染
AI SDK@anthropic-ai/sdkClaude API 客户端
协议MCP (Model Context Protocol)外部服务集成

关键依赖

// 核心库
@anthropic-ai/sdk        // Claude API
@modelcontextprotocol/sdk // MCP 协议
@commander-js/extra-typings // CLI 命令解析
react                    // UI 框架
ink                      // 终端 UI 组件库

// 工具库
lodash-es                // 工具函数
zod/v4                   // Schema 验证
strip-ansi               // ANSI 转义处理
chalk                    // 终端颜色

整体架构

分层架构图

┌─────────────────────────────────────────────────────────────────────┐
│                           用户交互层                                 │
│  ┌─────────────────┐  ┌─────────────────┐  ┌─────────────────────┐  │
│  │   CLI 命令系统   │  │   REPL 交互界面  │  │   SDK/Headless API  │  │
│  │   (commands/)   │  │   (screens/)    │  │   (entrypoints/sdk) │  │
│  └─────────────────┘  └─────────────────┘  └─────────────────────┘  │
├─────────────────────────────────────────────────────────────────────┤
│                           UI 组件层                                  │
│  ┌─────────────────────────────────────────────────────────────────┐│
│  │  Ink 渲染引擎 + React 组件 (components/, ink/)                   ││
│  │  • Messages: 消息渲染    • Permissions: 权限对话框              ││
│  │  • PromptInput: 输入框   • Spinner: 加载动画                    ││
│  │  • Tasks: 任务面板       • Agents: Agent 状态                   ││
│  └─────────────────────────────────────────────────────────────────┘│
├─────────────────────────────────────────────────────────────────────┤
│                           核心引擎层                                 │
│  ┌─────────────────┐  ┌─────────────────┐  ┌─────────────────────┐  │
│  │   QueryEngine   │  │   Tool System   │  │    Task System      │  │
│  │   (query.ts)    │  │   (tools/)      │  │    (tasks/)         │  │
│  │   • 对话管理    │  │   • 工具定义    │  │    • 任务生命周期   │  │
│  │   • API 调用    │  │   • 权限检查    │  │    • 输出管理       │  │
│  │   • 工具编排    │  │   • 结果渲染    │  │    • 状态跟踪       │  │
│  └─────────────────┘  └─────────────────┘  └─────────────────────┘  │
├─────────────────────────────────────────────────────────────────────┤
│                           服务层                                     │
│  ┌─────────────────┐  ┌─────────────────┐  ┌─────────────────────┐  │
│  │   MCP Client    │  │   API Client    │  │   Plugin System     │  │
│  │   (services/mcp)│  │   (services/api)│  │   (plugins/)        │  │
│  │   • 连接管理    │  │   • Claude API  │  │   • 加载机制        │  │
│  │   • 资源发现    │  │   • 日志记录    │  │   • 版本管理        │  │
│  │   • 权限控制    │  │   • 错误处理    │  │   • 依赖解析        │  │
│  └─────────────────┘  └─────────────────┘  └─────────────────────┘  │
├─────────────────────────────────────────────────────────────────────┤
│                           基础设施层                                 │
│  ┌─────────────────┐  ┌─────────────────┐  ┌─────────────────────┐  │
│  │   State Mgmt    │  │   Permissions   │  │   Utilities         │  │
│  │   (state/)      │  │   (permissions) │  │   (utils/)          │  │
│  │   • AppState    │  │   • 规则引擎    │  │   • 文件操作        │  │
│  │   • Store       │  │   • 分类器      │  │   • Git 集成        │  │
│  │   • Selectors   │  │   • 钩子系统    │  │   • Shell 封装      │  │
│  └─────────────────┘  └─────────────────┘  └─────────────────────┘  │
└─────────────────────────────────────────────────────────────────────┘

核心模块详解

1. 启动流程模块

启动序列经过精心设计,包含四个阶段:

1. 侧效应预处理 (模块加载前)
   • profileCheckpoint: 性能分析标记
   • startMdmRawRead: MDM 配置读取 (macOS)
   • startKeychainPrefetch: 钥匙串预取 (OAuth/API Key)

2. 初始化阶段 (init())
   • enableConfigs(): 加载配置文件
   • applySafeConfigEnvironmentVariables(): 应用安全环境变量
   • setupGracefulShutdown(): 注册优雅退出处理
   • configureGlobalMTLS(): mTLS 配置
   • preconnectAnthropicApi(): API 连接预热

3. 信任检查后初始化
   • initializeTelemetryAfterTrust(): 遥测初始化
   • waitForRemoteManagedSettingsToLoad(): 远程设置加载

4. REPL 启动 (launchRepl)
   • 渲染 App → REPL 组件
   • 启动 Ink 渲染引擎
   • 注册键盘输入处理

性能优化策略

优化项实现方式效果
并行预取MDM、钥匙串、OAuth 并行启动减少 ~100ms 启动时间
懒加载动态 import() + feature() 门控减少初始 bundle 大小
API 预连接preconnectAnthropicApi()重叠 TCP+TLS 握手 (~100-200ms)
缓存预热插件、技能、Git 状态异步加载不阻塞首屏渲染

2. 查询引擎模块

QueryEngine 是整个系统的核心引擎,负责管理对话生命周期和会话状态。

查询循环流程

┌─────────────────────────────────────────────────────────────────┐
│                    query() 循环流程                              │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│  ┌─────────────┐                                               │
│  │ 准备请求    │                                               │
│  │ • 构建消息  │                                               │
│  │ • 应用预算  │                                               │
│  └──────┬──────┘                                               │
│         │                                                       │
│         ▼                                                       │
│  ┌─────────────┐                                               │
│  │ callClaude  │ ◄────────────────────────────────────┐        │
│  │ • 流式请求  │                                      │        │
│  │ • Token 计数 │                                      │        │
│  └──────┬──────┘                                      │        │
│         │                                             │        │
│         ▼                                             │        │
│  ┌─────────────┐     是     ┌─────────────┐          │        │
│  │ 有 tool_use?│───────────►│ runTools()  │          │        │
│  └──────┬──────┘           └──────┬──────┘          │        │
│         │否                       │                  │        │
│         │                        ▼                  │        │
│         │                 ┌─────────────┐           │        │
│         │                 │ 执行工具    │           │        │
│         │                 │ • 权限检查  │           │        │
│         │                 │ • 调用工具  │           │        │
│         │                 │ • 收集结果  │           │        │
│         │                 └──────┬──────┘           │        │
│         │                        │                  │        │
│         │                        ▼                  │        │
│         │                 ┌─────────────┐           │        │
│         └────────────────►│ 构建结果消息 │           │        │
│                           └──────┬──────┘           │        │
│                                  │                  │        │
│                                  ▼                  │        │
│                           ┌─────────────┐           │        │
│                           │ 检查继续?  │───────────┘        │
│                           │ • max_turns │                    │
│                           │ • 预算      │                    │
│                           └─────────────┘                    │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘

3. 工具系统模块

工具系统是 Claude Code 的「手脚」,让 AI 能够执行实际操作。

Tool 接口定义

export type Tool<Input extends AnyObject = AnyObject, Output = unknown> = {
  // 元数据
  readonly name: string
  readonly description: string
  readonly inputSchema: Input
  readonly outputSchema?: z.ZodType<unknown>

  // 核心方法
  call(
    args: z.infer<Input>,
    context: ToolUseContext,
    canUseTool: CanUseToolFn,
    parentMessage: AssistantMessage,
    onProgress?: ToolCallProgress
  ): Promise<ToolResult<Output>>

  // 权限相关
  checkPermissions(
    input: z.infer<Input>,
    context: ToolUseContext
  ): Promise<PermissionResult>
  validateInput?(
    input: z.infer<Input>,
    context: ToolUseContext
  ): Promise<ValidationResult>

  // UI 渲染
  renderToolUseMessage(
    input: Partial<z.infer<Input>>,
    options: { theme: ThemeName; verbose: boolean }
  ): React.ReactNode
  renderToolResultMessage(
    content: Output,
    progressMessagesForMessage: ProgressMessage[],
    options: { /* ... */ }
  ): React.ReactNode

  // 其他特性
  isConcurrencySafe(input: z.infer<Input>): boolean
  isReadOnly(input: z.infer<Input>): boolean
  isDestructive?(input: z.infer<Input>): boolean
  interruptBehavior?(): 'cancel' | 'block'
}

工具分类

类别工具
文件操作FileReadTool, FileEditTool, FileWriteTool, NotebookEditTool
搜索工具GrepTool, GlobTool, WebSearchTool, ToolSearchTool
执行工具BashTool, PowerShellTool, REPLTool, SleepTool
Agent 工具AgentTool, TaskCreateTool, TaskOutputTool, TeamCreateTool
MCP 工具MCPTool, ListMcpResourceTool, ReadMcpResourceTool
辅助工具TodoWriteTool, AskUserQuestionTool, EnterPlanModeTool

4. Agent 系统模块

Agent 系统支持多 Agent 协作,是 Claude Code 的高级特性。

Agent 架构

┌─────────────────────────────────────────────────────────────────┐
│                      Agent 系统架构                              │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│  AgentTool (tools/AgentTool/)                                  │
│  ┌───────────────────────────────────────────────────────────┐ │
│  │ 内置 Agents (built-in/)                                   │ │
│  │ ├── general: 通用助手                                      │ │
│  │ ├── test: 测试专家                                         │ │
│  │ ├── review: 代码审查                                       │ │
│  │ └── refactor: 重构专家                                     │ │
│  ├───────────────────────────────────────────────────────────┤ │
│  │ 自定义 Agents (agents.json)                               │ │
│  │ • 用户定义的 Agent 配置                                    │ │
│  │ • 工具白名单/黑名单                                        │ │
│  │ • 系统提示词定制                                           │ │
│  ├───────────────────────────────────────────────────────────┤ │
│  │ 运行模式                                                  │ │
│  │ • local_agent: 本地子进程                                  │ │
│  │ • remote_agent: 远程 daemon                                │ │
│  │ • in_process_teammate: 进程内队友                          │ │
│  └───────────────────────────────────────────────────────────┘ │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘

Agent 通信模式

  • 本地模式:进程间管道通信
  • 远程模式:WebSocket + 会话 ingress
  • 进程内模式:共享状态 + 事件总线

5. MCP 集成模块

MCP (Model Context Protocol) 是 Anthropic 推出的模型上下文协议,用于连接外部服务。

MCP 配置示例

{
  "mcpServers": {
    "github": {
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-github"],
      "env": {
        "GITHUB_PERSONAL_ACCESS_TOKEN": "${GITHUB_TOKEN}"
      }
    },
    "filesystem": {
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-filesystem", "/path/to/allow"],
      "disabled": false
    }
  }
}

安全机制

  • channelPermissions.ts: 通道权限控制
  • channelAllowlist.ts: 服务器白名单
  • elicitationHandler.ts: URL 确认处理
  • auth.ts: OAuth 认证

6. 权限系统模块

权限系统是 Claude Code 的安全核心,确保 AI 操作在可控范围内。

权限决策流程

canUseTool(tool, input, context)

Step 1: 检查 Deny 规则
  • 遍历 alwaysDenyRules[source]
  • 匹配工具名或 MCP 服务器前缀
  • 匹配 → 直接拒绝

Step 2: 检查 Allow 规则
  • 遍历 alwaysAllowRules[source]
  • 匹配工具名或模式 (如 "bash(git *)")
  • 匹配 → 直接允许

Step 3: 检查 Classifier (如果启用)
  • TRANSCRIPT_CLASSIFIER / BASH_CLASSIFIER
  • 自动分类工具调用
  • 安全 → 允许,危险 → 拒绝/确认

Step 4: 检查 Hooks
  • PreToolUse hooks
  • 钩子可以批准/拒绝/修改

Step 5: 显示权限对话框
  • PermissionDialog 组件
  • 用户选择:允许/拒绝/总是允许/总是拒绝

权限模式

模式描述使用场景
default默认模式,需要确认危险操作日常使用
auto自动模式,使用 classifier 自动决策批量任务
bypass绕过模式,危险操作仍需确认信任环境
yolo完全自动,无确认CI/CD

数据流设计

完整数据流

用户输入


processUserInput (解析 slash 命令、处理附件)


QueryEngine.submitMessage()


query() 循环

    ├──────┬────────────┬──────────┐
    │      │            │          │
    ▼      ▼            ▼          ▼
Claude  runTools     auto-      yield
API               compact    message


                canUseTool


                permission
                dialog


                tool.call

    └─────────────────┘


        SDKMessage (流式输出)

    ┌─────────┼──────────┐
    │         │          │
    ▼         ▼          ▼
  REPL      SDK       Remote
  UI      Output    Session

目录结构

src/
├── entrypoints/              # 入口点
│   ├── sdk/                  # SDK 入口
│   ├── init.ts               # 初始化
│   ├── cli.tsx               # CLI 入口
│   └── agentSdkTypes.ts      # SDK 类型

├── screens/                  # 主界面
│   ├── REPL.tsx              # REPL 主界面
│   └── ...

├── components/               # React 组件 (144+)
│   ├── messages/             # 消息组件
│   ├── permissions/          # 权限对话框
│   ├── agents/               # Agent 组件
│   ├── tasks/                # 任务组件
│   └── ...

├── tools/                    # 工具实现 (43 目录)
│   ├── AgentTool/            # Agent 工具
│   ├── BashTool/             # Bash 工具
│   ├── FileEditTool/         # 文件编辑
│   ├── MCPTool/              # MCP 工具
│   └── ...

├── services/                 # 服务层 (36 目录)
│   ├── mcp/                  # MCP 服务
│   ├── api/                  # API 客户端
│   ├── analytics/            # 分析服务
│   ├── lsp/                  # LSP 服务
│   └── ...

├── commands/                 # CLI 命令 (50+)
├── state/                    # 状态管理
├── query/                    # 查询相关
├── tasks/                    # 任务系统
├── utils/                    # 工具函数 (50+ 目录)
├── ink/                      # Ink 渲染引擎
├── types/                    # TypeScript 类型
├── plugins/                  # 内置插件
├── skills/                   # 技能系统

├── main.tsx                  # 主入口 (4684 行)
├── QueryEngine.ts            # 查询引擎 (1296 行)
├── query.ts                  # 查询实现 (1730 行)
├── Tool.ts                   # 工具定义 (793 行)
└── commands.ts               # 命令注册 (755 行)

设计模式与最佳实践

使用的设计模式

模式应用场景实现位置
工厂模式Tool 创建tools.ts
策略模式权限决策permissions.ts
观察者模式状态变更store.ts
责任链模式工具执行runTools()
生成器模式流式输出AsyncGenerator
依赖注入查询依赖query/deps.ts
单例模式StorecreateStore()
适配器模式MCP 传输InProcessTransport

代码规范

// 1. 类型安全 - 使用 Zod schema 验证运行时数据
const inputSchema = z.object({
  command: z.string(),
  path: z.string().optional(),
})

// 2. 错误处理 - 使用类型化的错误处理
try {
  await tool.call(args, context)
} catch (error) {
  if (error instanceof APIError) {
    // 处理 API 错误
  }
}

// 3. 性能优化 - 使用 memoization 避免重复计算
const getSystemPrompt = memoize(async () => {
  // ...
})

// 4. 特性门控 - 使用 feature() 进行编译时优化
if (feature('COORDINATOR_MODE')) {
  // 仅在该特性启用时包含代码
}

安全架构

安全层次

┌─────────────────────────────────────────────────────────────────┐
│                        安全架构层次                              │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│  Layer 1: 权限控制                                              │
│  • 工具级权限:每个工具都有权限检查                             │
│  • 规则引擎:allow/deny/ask 规则                                │
│  • 分类器:自动识别危险操作                                     │
│                                                                 │
│  Layer 2: 沙箱隔离                                              │
│  • 命令沙箱:限制命令执行范围                                   │
│  • 文件系统沙箱:限制文件访问路径                               │
│  • 网络沙箱:限制网络访问                                       │
│                                                                 │
│  Layer 3: 审计日志                                              │
│  • 工具调用日志                                                 │
│  • 权限决策日志                                                 │
│  • 会话转录                                                     │
│                                                                 │
│  Layer 4: 数据保护                                              │
│  • 密钥加密存储 (钥匙串)                                        │
│  • 敏感信息脱敏                                                 │
│  • 会话数据加密                                                 │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘

关键指标

项目规模

指标数值
代码文件数~1900
核心代码行数~100,000+
组件数量144+
CLI 命令数50+
工具数量40+
服务模块数36+

性能基准

操作目标时间
启动时间< 300ms
模块加载< 135ms
首屏渲染< 300ms
API 响应< 2s
工具执行< 5s

总结

通过对 Claude Code 源码的深入分析,我学到了以下几点:

  1. 分层架构清晰:从用户交互层到基础设施层,每层职责明确,便于维护和扩展。

  2. 类型安全优先:全面使用 TypeScript 和 Zod schema,确保编译时和运行时的类型安全。

  3. 性能优化到位:从启动预加载、懒加载、API 预连接到缓存预热,每个细节都经过精心设计。

  4. 权限系统严谨:多层权限检查、规则引擎、分类器、沙箱隔离,构建了完整的安全体系。

  5. 可扩展性强:插件系统、技能系统、自定义 Agent、MCP 集成,提供了丰富的扩展能力。

  6. 设计模式运用:工厂、策略、观察者、责任链、生成器等模式的灵活运用,代码质量很高。

这个项目不仅是一个实用的 AI 编程助手,更是一个学习现代 TypeScript 应用架构的绝佳案例。


参考链接: