Claude Code 架构分析文档

目录


概述

Claude Code 是 Anthropic 官方推出的命令行 AI 编程助手工具。本文档基于 Claude Code v2.1.88 源代码进行架构分析。

架构总览

用户界面

服务层

状态管理

核心层

入口层

CLI 入口 main.tsx

SDK 入口 QueryEngine

查询循环 query.ts

工具系统 Tool.ts

命令系统 commands.ts

权限系统 permissions.ts

应用状态 AppState

状态存储 Store

API 服务 claude.ts

MCP 客户端 client.ts

分析服务 analytics

上下文压缩 compact

REPL 界面

Ink 组件系统

目录结构

源代码目录

main.tsx
入口点

bootstrap/
启动状态

commands/
命令实现

tools/
工具实现

services/
核心服务

state/
状态管理

cli/
CLI相关

utils/
工具函数

types/
类型定义

components/
UI组件

screens/
屏幕界面

主要目录说明

目录 说明
bootstrap/ 启动时的状态初始化和全局配置
cli/ 命令行解析、传输层、IO处理
commands/ 各种斜杠命令的实现(/help, /commit 等)
tools/ 工具实现(Bash, Read, Edit, Agent 等)
services/ 核心服务(API、MCP、分析、压缩等)
state/ React 状态管理(AppState)
utils/ 通用工具函数
types/ TypeScript 类型定义
components/ 可复用的 UI 组件
screens/ 主要屏幕界面(REPL 等)

核心组件详解

1. 入口与初始化流程

REPL界面 GrowthBook 配置系统 bootstrap/state init.ts main.tsx REPL界面 GrowthBook 配置系统 bootstrap/state init.ts main.tsx 启动性能分析 MDM/Keychain 预读取 init() enableConfigs() applySafeConfigEnvironmentVariables() setupGracefulShutdown() 初始化 Feature Flags 初始化全局状态 launchRepl() 渲染 Ink UI

关键代码路径

  • main.tsx:1-500 - CLI 解析和入口
  • entrypoints/init.ts - 初始化逻辑
  • bootstrap/state.ts - 全局状态管理

初始化顺序

  1. 启动性能分析(profileCheckpoint
  2. MDM 配置和 Keychain 预读取
  3. 配置系统启用(enableConfigs
  4. 安全环境变量应用
  5. 优雅关闭设置
  6. GrowthBook Feature Flags 初始化
  7. REPL 界面渲染

2. 命令系统

CommandBase

+name: string

+description: string

+aliases: string[]

+isHidden: boolean

+availability: CommandAvailability[]

+isEnabled() : : boolean

PromptCommand

+type: "prompt"

+progressMessage: string

+contentLength: number

+source: SettingSource

+getPromptForCommand()

LocalCommand

+type: "local"

+supportsNonInteractive: boolean

+load() : : Promise<LocalCommandModule>

LocalJSXCommand

+type: "local-jsx"

+load() : : Promise<LocalJSXCommandModule>

Commands

+getCommands(cwd) : : Promise<Command[]>

+findCommand(name, commands) : : Command

+getSkillToolCommands(cwd) : : Promise<Command[]>

命令类型

类型 说明 示例
prompt 展开为提示词发送给模型 /commit, /review
local 执行本地代码,返回文本结果 /clear, /cost
local-jsx 渲染 React UI 组件 /config, /mcp

命令加载流程

getCommands

loadAllCommands

getSkills

getPluginCommands

getWorkflowCommands

skillDirCommands

pluginSkills

bundledSkills

COMMANDS 内置命令

过滤可用性

过滤启用状态

返回命令列表

3. 工具系统

Tool

+name: string

+aliases: string[]

+inputSchema: ZodSchema

+call() : : Promise<ToolResult>

+description() : : Promise<string>

+checkPermissions() : : Promise<PermissionResult>

+isEnabled() : : boolean

+isReadOnly() : : boolean

+isDestructive() : : boolean

+prompt() : : Promise<string>

+renderToolUseMessage()

+renderToolResultMessage()

BashTool

+name: "Bash"

FileReadTool

+name: "Read"

FileEditTool

+name: "Edit"

FileWriteTool

+name: "Write"

AgentTool

+name: "Agent"

GlobTool

+name: "Glob"

GrepTool

+name: "Grep"

WebFetchTool

+name: "WebFetch"

WebSearchTool

+name: "WebSearch"

MCPTool

+name: "mcp__*"

SkillTool

+name: "Skill"

工具生命周期

API/本地 权限系统 工具实例 ToolExecutor 查询循环 API/本地 权限系统 工具实例 ToolExecutor 查询循环 alt [验证失败] alt [需要用户确- 认] alt [拒绝] 执行 tool_use validateInput() 返回错误 checkPermissions() 显示权限对话框 用户决策 返回拒绝结果 call() 执行操作 返回结果 ToolResult 返回结果

工具组装流程

// tools.ts 中的工具组装
export function assembleToolPool(
  permissionContext: ToolPermissionContext,
  mcpTools: Tools,
): Tools {
  const builtInTools = getTools(permissionContext)
  const allowedMcpTools = filterToolsByDenyRules(mcpTools, permissionContext)
  return uniqBy(
    [...builtInTools].sort(byName).concat(allowedMcpTools.sort(byName)),
    'name',
  )
}

4. 查询引擎

submitMessage()

构建上下文

获取系统提示

处理用户输入

上下文过长

完成/停止

API 流式请求

检查是否继续

有工具调用

Start

BuildContext

SystemPrompt

ProcessInput

APIStream

tool_use 块

文本增量

思考块

Streaming

ToolUse

TextDelta

Thinking

ExecuteTool

CheckContinue

Compact

核心查询循环 (query.ts):

export async function* query(
  params: QueryParams,
): AsyncGenerator<StreamEvent | Message, Terminal> {
  // 1. 初始化状态
  let state: State = {
    messages: params.messages,
    toolUseContext: params.toolUseContext,
    // ...
  }

  // 2. 主循环
  while (true) {
    // 2.1 构建请求消息
    let messagesForQuery = [...getMessagesAfterCompactBoundary(messages)]

    // 2.2 应用工具结果预算
    messagesForQuery = await applyToolResultBudget(...)

    // 2.3 发送 API 请求
    yield { type: 'stream_request_start' }

    // 2.4 流式处理响应
    for await (const event of streamAPIResponse(...)) {
      yield event
    }

    // 2.5 检查是否继续
    const transition = checkContinueCondition(...)
    if (transition.type === 'terminal') {
      return transition
    }

    // 2.6 更新状态继续循环
    state = { ...state, ...transition.updates }
  }
}

QueryEngine 类 (QueryEngine.ts):

QueryEngine

-config: QueryEngineConfig

-mutableMessages: Message[]

-abortController: AbortController

-permissionDenials: SDKPermissionDenial[]

-totalUsage: NonNullableUsage

+submitMessage(prompt) : : AsyncGenerator<SDKMessage>

+getMessages() : : Message[]

+getUsage() : : NonNullableUsage

QueryEngineConfig

+cwd: string

+tools: Tools

+commands: Command[]

+mcpClients: MCPServerConnection[]

+canUseTool: CanUseToolFn

+getAppState:() : => AppState

+setAppState:(f) : => void

5. 状态管理

React Hooks

状态存储

React Context

AppState 内容

消息列表

工具列表

MCP 状态

权限上下文

UI 状态

AppStoreContext

HasAppStateContext

AppState

订阅者列表

setState 函数

useAppState

useSetAppState

useAppStateStore

AppState 结构

interface AppState {
  // 消息
  messages: Message[]

  // 工具和命令
  tools: Tools
  commands: Command[]

  // MCP
  mcp: {
    tools: Tool[]
    commands: Command[]
    resources: Record<string, ServerResource[]>
    clients: MCPServerConnection[]
  }

  // 权限
  toolPermissionContext: ToolPermissionContext

  // UI 状态
  verbose: boolean
  mainLoopModel: string
  theme: ThemeName

  // 思考配置
  thinkingConfig: ThinkingConfig

  // 文件历史
  fileHistory: FileHistoryState

  // ...更多状态
}

6. MCP (Model Context Protocol) 集成

工具层

客户端层

配置层

MCP 配置文件

Claude AI MCP 配置

企业 MCP 配置

传输层
Stdio/SSE/HTTP

认证处理

MCP SDK Client

MCP 工具

MCP 资源

MCP 技能

MCP 连接流程

MCP Server 传输层 client.ts main.tsx MCP Server 传输层 client.ts main.tsx alt [Stdio] [SSE/HTTP] loop [每个服务器] getAllMcpConfigs() 过滤禁用服务器 创建传输 启动子进程 HTTP 连接 initialize capabilities tools/list 工具列表 resources/list 资源列表 MCPServerConnection[]

MCP 工具包装

// MCP 工具被包装为标准 Tool 接口
class MCPTool implements Tool {
  name = `mcp__${serverName}__${toolName}`
  mcpInfo = { serverName, toolName }

  async call(input, context, ...): Promise<ToolResult> {
    const client = getConnection(this.serverName)
    const result = await client.callTool({
      name: this.toolName,
      arguments: input
    })
    return processMCPResult(result)
  }
}

7. 权限系统

结果

允许

拒绝

询问用户

决策流程

检查规则

检查 Hooks

检查分类器

用户提示

权限模式

default

auto

bypass

权限规则

允许规则
alwaysAllowRules

拒绝规则
alwaysDenyRules

询问规则
alwaysAskRules

权限检查流程

用户 Hook 系统 规则系统 permissions.ts 工具调用 用户 Hook 系统 规则系统 permissions.ts 工具调用 alt [匹配允许规则] alt [匹配拒绝规则] alt [Hook 决策] alt [需要 Classifier] checkPermissions() 检查 alwaysAllowRules 允许 检查 alwaysDenyRules 拒绝 executePermissionRequestHooks() 返回决策 runClassifier() 显示权限对话框 用户决策 返回结果

8. 上下文压缩

处理流程

识别边界

生成摘要

替换消息

持久化

压缩方法

Snip 压缩

微压缩

摘要压缩

响应式压缩

触发条件

Token 限制

自动压缩

用户命令 /compact

压缩策略

策略 说明 触发条件
Snip 删除旧的对话历史 超过上下文限制
MicroCompact 缓存编辑优化 频繁修改相同文件
Summary 生成对话摘要 用户手动压缩
ReactiveCompact 响应式压缩 API 返回 prompt_too_long

9. API 服务层

响应处理

流式处理

使用量统计

缓存信息

重试逻辑

重试包装

模型降级

客户端

Anthropic SDK

AWS Bedrock

GCP Vertex

Anthropic Foundry

请求构建

消息规范化

系统提示

工具 Schema

Beta 功能

API 请求流程

// claude.ts 核心请求逻辑
async function* streamAPIResponse(params) {
  const client = getAnthropicClient()
  const betas = getMergedBetas(model, features)

  const stream = await client.beta.messages.stream({
    model: normalizeModelStringForAPI(model),
    messages: normalizeMessagesForAPI(messages),
    system: systemPrompt,
    tools: tools.map(toolToAPISchema),
    max_tokens: getMaxOutputTokens(model),
    betas,
    // ...更多参数
  })

  for await (const event of stream) {
    yield normalizeStreamEvent(event)
  }
}

数据流分析

用户输入到 AI 响应的完整流程

权限系统 工具执行 API 服务 查询循环 消息队列 REPL 界面 用户 权限系统 工具执行 API 服务 查询循环 消息队列 REPL 界面 用户 alt [需要确认] loop [工具执行] alt [需要压缩] loop [查询循环] 输入消息 添加到队列 提交消息 构建请求 发送请求 流式响应 执行工具 检查权限 显示对话框 用户决策 返回结果 执行压缩 返回最终结果 显示响应

工具调用详细流程

进度回调 工具实例 权限系统 useCanUseTool StreamingToolExecutor API 响应 进度回调 工具实例 权限系统 useCanUseTool StreamingToolExecutor API 响应 alt [需要用户确认] alt [允许] [拒绝] tool_use 块 解析输入 调用权限检查 checkPermissions() 显示对话框 用户决策 PermissionResult call(input, context) 进度更新 ToolResult 拒绝结果 构建 tool_result 返回结果

关键设计模式

1. 工厂模式

工具创建使用 buildTool 工厂函数:

export function buildTool<D extends AnyToolDef>(def: D): BuiltTool<D> {
  return {
    ...TOOL_DEFAULTS,
    userFacingName: () => def.name,
    ...def,
  }
}

2. 策略模式

权限检查使用策略模式,根据不同的权限模式应用不同的策略。

3. 观察者模式

状态管理使用订阅模式,组件通过 useAppState 订阅状态变化。

4. 命令模式

命令系统将操作封装为对象,支持不同的执行策略(prompt/local/local-jsx)。

5. 生成器模式

查询循环使用 AsyncGenerator 实现流式输出:

async function* query(params): AsyncGenerator<StreamEvent | Message, Terminal> {
  while (true) {
    yield event
    if (shouldStop) return terminal
  }
}

扩展点

添加新工具

  1. tools/ 目录创建新工具目录
  2. 实现 Tool 接口
  3. tools.tsgetAllBaseTools() 中注册

添加新命令

  1. commands/ 目录创建命令文件
  2. 定义 Command 对象
  3. commands.ts 中导入并添加到 COMMANDS 数组

添加 MCP 服务器

  1. 在 MCP 配置文件中添加服务器定义
  2. 客户端会自动发现并加载工具

添加权限规则

  1. 在设置文件中添加规则
  2. 或通过 CLI 参数指定

性能优化

启动优化

  1. 延迟加载:命令和工具使用动态导入
  2. 预取:MDM 配置和 Keychain 预读取
  3. 并行初始化:多个初始化任务并行执行

运行时优化

  1. 流式处理:API 响应使用流式处理
  2. 缓存:工具结果缓存、文件状态缓存
  3. 压缩:上下文压缩减少 Token 使用

内存优化

  1. 工具结果持久化:大结果保存到文件
  2. LRU 缓存:文件读取状态使用 LRU 缓存
  3. 消息裁剪:自动压缩旧消息

安全考虑

权限控制

  1. 细粒度权限:支持工具级别、命令级别的权限控制
  2. 沙箱执行:Bash 命令可在沙箱中执行
  3. 敏感命令保护:危险命令需要额外确认

数据安全

  1. API Key 保护:支持多种认证方式
  2. 敏感信息过滤:日志中过滤敏感信息
  3. 审计日志:记录关键操作

总结

Claude Code 是一个架构清晰、模块化设计的 AI 编程助手工具。主要特点:

  1. 模块化设计:核心组件(工具、命令、权限)独立且可扩展
  2. 类型安全:使用 TypeScript 和 Zod 确保类型安全
  3. 流式处理:API 响应和工具执行都支持流式处理
  4. 权限控制:细粒度的权限系统确保操作安全
  5. MCP 集成:通过 MCP 协议支持外部工具扩展
  6. 上下文管理:智能压缩策略管理长对话

这种架构使得 Claude Code 既是一个强大的编程助手,也是一个可扩展的 AI Agent 平台。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐