Skip to content

来源:Claude Code 技术文档 - v2.1.88 源码分析

架构概览

1.1 项目定位

Claude Code 是 Anthropic 官方的 AI 编程助手命令行工具,允许用户通过终端与 Claude AI 模型进行交互式对话,执行代码编辑、文件操作、命令运行等编程任务。v2.1.88 是一个功能成熟的版本,包含完整的工具链、远程通信、多模型支持等企业级特性。

1.2 技术栈详情

运行时与构建

层级

技术

详情

运行时

Bun

高性能 JavaScript/TypeScript 运行时,直接执行 .ts/.tsx,原生支持 ESM

编译时

bun:bundle

编译时 Feature Flag (feature()) 实现死代码消除

运行时特性

GrowthBook

运行时 Feature Gate,通过远程配置动态控制功能

堆内存

8GB

CCR 模式下通过 --max-old-space-size=8192 配置

前端/UI

层级

技术

详情

框架

React 19

组件化 UI 开发

终端渲染

Ink

React → 终端 ANSI 输出的调和器

布局引擎

Yoga

Facebook 的跨平台 Flexbox 布局引擎

性能优化

React Compiler Runtime

react/compiler-runtime 自动记忆化,全局应用

渲染帧率

60 FPS

自定义 Ink 渲染器,含 FPS 计量

数据验证与通信

层级

技术

详情

Schema 验证

Zod v4

所有工具输入/输出的运行时类型验证

AI 协议

MCP (Model Context Protocol)

Stdio/SSE/WebSocket/HTTP 四种传输方式

LSP

Language Server Protocol

代码智能分析集成

API SDK

@anthropic-ai/sdk

官方 SDK 封装

状态管理

层级

技术

详情

Store

自研轻量 Store

类 Zustand 的 getState/setState/subscribe 模式

React 集成

useSyncExternalStore

React 18+ 外部 Store 订阅标准 API

不可变性

DeepImmutable<T>

编译期确保状态不可变

1.3 核心架构层次

┌──────────────────────────────────────────────────────────────────────┐
│                         入口层 (Entrypoints)                          │
│  cli.tsx │ mcp.ts │ agentSdkTypes.ts │ init.ts                       │
│  快速路径优化 │ MCP Server │ Agent SDK │ 初始化链                     │
└──────────────────────────┬───────────────────────────────────────────┘

┌──────────────────────────▼───────────────────────────────────────────┐
│                         屏幕层 (Screens)                             │
│  REPL.tsx │ Doctor.tsx │ ResumeConversation.tsx                      │
│  主交互循环 │ 环境诊断 │ 会话恢复                                    │
└──────────────────────────┬───────────────────────────────────────────┘

┌──────────────────────────▼───────────────────────────────────────────┐
│                       组件层 (Components)                            │
│  App.tsx(FpsMetrics→Stats→AppState Provider 组合)                    │
│  StatusLine.tsx │ VirtualMessageList.tsx │ ToolUseLoader.tsx          │
│  200+ 组件 │ 虚拟滚动 │ 动画加载器                                   │
└──────────────────────────┬───────────────────────────────────────────┘

┌──────────────────────────▼───────────────────────────────────────────┐
│                      引擎层 (Query Engine)                           │
│  QueryEngine.ts │ query/config.ts │ query/tokenBudget.ts             │
│  核心 AI 对话循环 │ 会话配置 │ Token 预算管理                        │
│  │                                                                   │
│  query() → processUserInput() → API Call → 消息流处理 → SDK 消息     │
│  成本跟踪 │ 历史记录 │ 中断支持 │ 结构化输出重试                     │
└──┬───────────────┬───────────────────┬──────────────────────────────┘
   │               │                   │
┌──▼──────┐  ┌─────▼──────┐  ┌────────▼──────────────────────────────┐
│工具系统 │  │ 命令系统   │  │         服务层 (Services)              │
│Tool.ts  │  │commands.ts │  │  claude.ts   │ 500+ 行模型查询         │
│tools.ts │  │60+命令目录 │  │  withRetry.ts│ 700+ 行重试逻辑         │
│45+工具  │  │120+命令    │  │  client.ts   │ 多提供商 API 工厂       │
│+MCP扩展 │  │+技能命令   │  │  mcp/        │ MCP 客户端/配置/类型    │
└──┬──────┘  └─────┬──────┘  └────────┬──────────────────────────────┘
   │               │                   │
┌──▼───────────────▼───────────────────▼──────────────────────────────┐
│                    状态管理层 (State)                                 │
│  Store<T>: getState/setState/subscribe                               │
│  AppState: 50+ DeepImmutable 字段                                    │
│  ToolPermissionContext: 权限模式 + 规则层                            │
│  selectors.ts: 派生计算 │ onChangeAppState.ts: 变更监听             │
└──┬──────────────────────────────────────────────────────────────────┘

┌──▼──────────────────────────────────────────────────────────────────┐
│                    基础设施层 (Infrastructure)                        │
│  bridge/   远程通信 │ hooks/   90+ React Hook                       │
│  plugins/  插件系统 │ skills/  技能加载                              │
│  utils/    150+ 工具 │ constants/ 提示词/系统/工具常量               │
│  types/    完整类型定义 │ tasks/ 任务执行框架                        │
└─────────────────────────────────────────────────────────────────────┘

1.4 核心设计理念

1.4.1 编译时死代码消除

// bun:bundle 编译时标志 — 未启用的路径在编译时被移除
import { feature } from 'bun:bundle'

if (feature('OVERLAP_TEST_TOOL')) {
  // 此代码块仅在 OVERLAP_TEST_TOOL 启用时编译到产物中
  tools.push(OverlapTestTool)
}

这种模式贯穿整个代码库,控制功能的条件编译:

  • CONTEXT_COLLAPSE — 上下文折叠功能
  • TERMINAL_PANEL — 终端面板功能
  • WORKFLOWS — 工作流引擎
  • REPL — REPL 工具
  • MONITOR_TOOL — 监控 MCP 任务

1.4.2 Memoization 策略

项目广泛使用 lodash.memoize 和自定义 memoize 函数:

// 单次计算缓存 — 避免重复初始化
const COMMANDS = memoize(() => { /* 120+ commands assembly */ })
const builtInCommandNames = memoize(() => { /* name set */ })
const loadAllCommands = memoize(async (cwd) => { /* skill+plugin+builtin */ })

关键 memoized 函数包括:

  • getSystemContext() — Git 状态(会话级缓存)
  • getUserContext() — CLAUDE.md + 日期
  • getGitStatus() — Git 分支/状态/日志
  • loadAllCommands(cwd) — 按 cwd memoized
  • getSkillToolCommands(cwd) — 技能命令缓存

1.4.3 DeepImmutable 类型安全

// 所有 AppState 字段使用 DeepImmutable 包装
type AppState = DeepImmutable<{
  mcp: MCPState
  plugins: PluginState
  fileHistory: FileHistoryState
  // ... 50+ 字段
}>

状态中有两种容器:

  • 不可变对象mcp, plugins, fileHistory 等业务状态
  • 可变容器tasks, agentNameRegistry 等需要频繁修改的引用

1.4.4 异步生成器消息流

// QueryEngine 核心是 AsyncGenerator
async *submitMessage(prompt): AsyncGenerator<SDKMessage, void, unknown> {
  // 1. processUserInput(prompt)
  // 2. yield* from query() generator
  // 3. yield SDK messages (assistant/user/progress/stream_event)
  // 4. check budget limits
}

整个消息处理链使用 AsyncGenerator 模式:

  • ask() — 顶级便利包装器
  • QueryEngine.submitMessage() — 核心查询循环
  • query() — API 调用与流式处理
  • 通过 yield 向上游传递 SDK 消息

1.4.5 工具排序保持 Prompt 缓存稳定

// assembleToolPool() 中按名称排序
// 确保工具列表在不同请求间保持相同顺序
// 从而最大化 Anthropic API 的 prompt 缓存命中率
const sorted = [...tools].sort((a, b) => a.name.localeCompare(b.name))
return uniqBy(sorted, t => t.name)

1.5 多 AI 提供商支持

提供商

协议

认证

Anthropic Direct

HTTPS

API Key

AWS Bedrock

Bedrock SDK

AWS Credentials

Azure Foundry

Azure OpenAI 协议

Azure AD Token

Google Vertex AI

Vertex SDK

GCP Credentials

通过 getAnthropicClient() 工厂统一创建,共享相同的查询/重试/成本跟踪逻辑。

1.6 安全架构概述

┌─────────────────────────────────────────────┐
│              权限决策链                       │
│                                             │
│  policySettings (企业策略,最高优先级)       │
│       ↓                                     │
│  alwaysDenyRules (拒绝规则)                 │
│       ↓                                     │
│  alwaysAllowRules (允许规则)                │
│       ↓                                     │
│  alwaysAskRules (询问规则)                  │
│       ↓                                     │
│  PermissionMode 默认行为                    │
│    - default (提示用户)                     │
│    - acceptEdits (接受编辑)                 │
│    - bypassPermissions (跳过权限)           │
│    - plan (规划模式,只读)                  │
│    - auto (自动分类器判断)                  │
│    - dontAsk (不询问)                       │
│    - bubble (冒泡到父级)                    │
└─────────────────────────────────────────────┘

规则来源优先级(从高到低):

  1. policySettings — 企业管理策略
  2. flagSettings — Feature Flag 控制
  3. cliArg — 命令行参数
  4. localSettings — 本地项目 .claude/settings.json
  5. projectSettings — 项目级 CLAUDE.md
  6. userSettings — 用户级 ~/.claude/settings.json
  7. session — 会话内交互
  8. command — 命令级覆盖

1.7 数据流总览

用户输入


processUserInput() ─── 解析斜杠命令/图片/URL


QueryEngine.submitMessage()

  ├─ fetchSystemPromptParts() ─── 组装系统提示词
  │    ├─ getSimpleIntroSection()      // 基本介绍
  │    ├─ getSimpleSystemSection()     // 系统信息
  │    ├─ getActionsSection()          // 行为指南
  │    ├─ getUsingYourToolsSection()   // 工具使用
  │    ├─ getSessionSpecificGuidance() // 会话特定
  │    ├─ getLanguageSection()         // 语言偏好
  │    └─ getOutputStyleSection()      // 输出样式


query() ─── 调用 claude.ts 的 API 查询

  ├─ 构造请求:model + messages + tools + system prompt
  ├─ 缓存策略:1h TTL (3600s),thinking config,effort params
  ├─ Zod schema → API schema 转换


API 流式响应

  ├─ message_start  → 重置 currentMessageUsage
  ├─ content_block  → 文本/工具调用/thinking
  ├─ message_delta  → 累加使用量
  ├─ message_stop   → 合并 totalUsage


工具调用分发

  ├─ checkPermissions(input, context) → allow/ask/deny
  ├─ validateInput(input, context) → ValidationResult
  ├─ tool.call(input, context, canUseTool, ...) → ToolResult


结果处理

  ├─ 成本跟踪:addToTotalSessionCost()
  ├─ 历史记录:recordTranscript()
  ├─ 预算检查:checkTokenBudget() (90% 阈值 + 递减检测)


yield SDKMessage → UI 渲染

MIT