Skip to content

Latest commit

 

History

History
845 lines (641 loc) · 27 KB

File metadata and controls

845 lines (641 loc) · 27 KB

Claude Code 项目全面架构分析

本文档是对 Claude Code 源代码的深度分析,涵盖架构设计、核心模块、数据流、组件关系等关键内容。


目录

  1. 项目概述
  2. 目录结构与组织方式
  3. 核心模块分析
  4. 入口文件分析
  5. 前端 UI 组件层
  6. 服务层分析
  7. 状态管理分析
  8. 数据流总览
  9. 关键架构特点
  10. 技术栈总结

一、项目概述

1.1 项目简介

Claude Code 是 Anthropic 开发的命令行 AI 编程助手,通过终端与 Claude 大模型交互,执行软件工程任务如文件编辑、命令执行、代码搜索和工作流协调。

1.2 核心特点

特性 说明
运行时 Bun (高性能 JavaScript 运行时)
语言 TypeScript (严格模式)
终端 UI React + Ink (React 命令行渲染库)
规模 ~1,900 个文件,512,000+ 行代码
架构 模块化、插件化、多代理协调

1.3 设计理念

  • Agentic Loop 驱动:基于生成器的可中断、可恢复 AI 交互循环
  • 工具优先:丰富的工具生态系统,支持文件操作、命令执行、代码搜索等
  • 权限安全:多层权限检查机制,确保工具执行安全
  • 上下文管理:多级上下文压缩策略,优化 token 使用
  • 插件化扩展:支持 MCP 协议、技能系统、插件系统

二、目录结构与组织方式

2.1 顶层目录结构

src/
├── main.tsx                    # 应用入口 - Commander.js CLI 解析 + 启动流程
├── QueryEngine.ts              # 查询引擎 - React Hook 封装的查询状态管理
├── query.ts                    # 查询循环实现 - Agentic Loop 核心逻辑
├── Tool.ts                     # 工具抽象 - 所有工具的基类接口和权限模型
├── tools.ts                    # 工具注册中心 - 工具过滤、合并、权限应用
├── commands.ts                 # 命令系统 - 斜杠命令注册与执行
├── Task.ts                     # 任务抽象 - 任务创建与管理
├── context.ts                  # 上下文类型定义
├── replLauncher.tsx            # REPL 启动器 - 交互式会话管理
│
├── state/                      # 状态管理层
│   ├── AppStateStore.ts        # 全局应用状态存储
│   └── ...
│
├── components/                 # UI 组件层 (~140 个组件)
│   ├── App.tsx                 # 主应用组件
│   ├── messages/               # 消息渲染组件
│   ├── mcp/                    # MCP 服务器管理 UI
│   ├── design-system/          # 设计系统组件
│   ├── agents/                 # Agent 管理 UI
│   ├── hooks/                  # Hooks 配置 UI
│   ├── wizard/                 # 向导对话框
│   ├── diff/                   # 差异查看器
│   └── ...
│
├── hooks/                      # React Hooks
│   ├── useCanUseTool.tsx       # 工具权限检查
│   ├── useCommandQueue.ts      # 命令队列管理
│   ├── useSettings.ts          # 设置管理
│   ├── useTasksV2.ts           # 任务状态管理
│   ├── notifs/                 # 通知 Hooks
│   ├── toolPermission/         # 工具权限处理
│   └── ...
│
├── services/                   # 外部服务集成
│   ├── api/                    # Anthropic API 客户端
│   │   └── claude.ts           # 核心 API 查询
│   ├── mcp/                    # MCP 协议客户端
│   │   └── client.ts           # MCP 客户端
│   ├── compact/                # 上下文压缩服务
│   ├── analytics/              # GrowthBook 特性开关
│   ├── lsp/                    # LSP 管理器
│   ├── tools/                  # 工具执行服务
│   └── ...
│
├── tools/                      # 具体工具实现 (~40 个工具)
│   ├── AgentTool/              # 子代理创建与管理
│   ├── BashTool/               # Shell 命令执行
│   ├── FileReadTool/           # 文件读取
│   ├── FileEditTool/           # 文件编辑
│   ├── FileWriteTool/          # 文件写入
│   ├── GlobTool/               # 文件模式匹配
│   ├── GrepTool/               # 代码搜索 (ripgrep)
│   ├── LSPTool/                # LSP 集成
│   ├── MCPTool/                # MCP 工具调用
│   ├── NotebookEditTool/       # Jupyter 笔记本编辑
│   ├── TaskCreateTool/         # 任务创建
│   ├── WebFetchTool/           # URL 内容获取
│   ├── WebSearchTool/          # 网络搜索
│   └── ...
│
├── ink/                        # Ink 终端渲染引擎
│   ├── ink.tsx                 # Ink 引擎核心
│   └── ...
│
├── screens/                    # 屏幕级组件
│   ├── REPL.tsx                # 交互式 REPL 界面
│   └── headless/               # 无头模式
│
├── types/                      # 类型定义
├── utils/                      # 工具函数
├── bootstrap/                  # 启动引导状态
├── constants/                  # 常量配置
├── skills/                     # 技能系统
├── plugins/                    # 插件系统
├── server/                     # 服务端组件 (WebSocket, 连接)
├── agent/                      # Agent 系统
└── context/                    # React Context 提供者

2.2 组织原则

  1. 按功能域分层services/ 按功能子域细分(api/, mcp/, compact/, analytics/, lsp/ 等)
  2. 按关注点分离components/ 按 UI 功能分组(messages/, mcp/, design-system/, agents/ 等)
  3. Hooks 按用途分类hooks/ 包含通知(notifs/)、权限处理(toolPermission/)等子目录
  4. 工具独立目录:每个工具在 tools/ 下有独立子目录(BashTool/, ReadTool/, EditTool/ 等)

三、核心模块分析

3.1 QueryEngine.ts 查询引擎

文件位置: src/QueryEngine.ts

功能定位

QueryEngine 是 Claude Code 的 核心 AI 交互引擎,负责管理用户输入到 AI 响应的完整生命周期。它是一个 React Hook(useQueryEngine),将底层的 query() 生成器函数封装为 React 状态管理。

关键数据结构

type QueryState = {
  status: 'idle' | 'loading' | 'done' | 'error' | 'aborted'
  messages: Message[]
  abortController: AbortController | null
  error: Error | null
  isStreaming: boolean
  isToolUse: boolean
  toolUseConfirmQueue: ToolUseConfirm[]
  toolPermissionContext: ToolPermissionContext
  // ... 更多状态字段
}

核心方法

方法 功能
queryFn(input) 主查询入口,接收用户输入,启动 agentic loop
abortQuery() 中止当前查询
retryQuery() 重试失败的查询
clearMessages() 清空消息历史
addMessage(message) 手动添加消息到历史
setToolPermissionContext() 更新工具权限上下文
setToolUseConfirmQueue() 管理工具确认队列

数据流

用户输入 -> queryFn() -> query() 生成器 -> 逐条 yield 事件
  -> StreamEvent (流式文本) -> 更新 messages
  -> ToolUseConfirm (工具确认) -> 加入 toolUseConfirmQueue
  -> AssistantMessage (完成) -> status = 'done'
  -> Error -> status = 'error'

依赖关系

  • 依赖 query() 函数作为底层生成器
  • 依赖 Tool.ts 的工具定义
  • 依赖 commands.ts 的命令处理
  • 依赖 canUseTool hook 进行权限检查
  • 依赖 AppStateStore 进行全局状态同步

3.2 Tool.ts 工具系统

文件位置: src/Tool.ts

功能定位

Tool.ts 定义了 Claude Code 的 工具抽象层,是所有工具(Bash、Read、Edit、MCP 等)的统一接口。

核心类型

type Tool<Input extends Record<string, unknown>> = {
  name: string                    // 工具唯一名称
  userFacingName: (input: Input) => string  // 用户友好名称
  description: (input: Input, ctx) => Promise<string>  // 动态描述
  inputSchema: JSONSchema         // JSON Schema 输入验证
  execute: (input: Input, ctx) => Promise<ToolResult>  // 执行函数
  isEnabled?: (ctx) => boolean    // 是否启用
  isMcp?: boolean                 // 是否 MCP 工具
  isLsp?: boolean                 // 是否 LSP 工具
  aliases?: string[]              // 向后兼容的别名
  // ... 更多属性
}

工具注册中心

tools.ts 中的 getTools() 函数负责:

  1. 根据 ToolPermissionContext 过滤工具
  2. 合并内置工具、MCP 工具、LSP 工具
  3. 应用权限策略(allowedTools / disallowedTools)
  4. 返回最终的工具列表

工具执行流程

模型返回 tool_use -> canUseTool 检查权限 -> 用户确认 (如需) -> tool.execute() -> ToolResult -> 返回给模型

工具分类

类别 示例
内置工具 Bash, Read, Edit, Write, NotebookEdit, Grep, Glob, LS
MCP 工具 通过 MCP 协议动态加载的外部工具
LSP 工具 语言服务器协议提供的工具
Agent 工具 子 Agent 调用工具
系统工具 ToolSearch, Advisor 等

3.3 commands.ts 命令系统

文件位置: src/commands.ts

功能定位

命令系统管理所有 斜杠命令/help, /compact, /clear, /model 等)和 内置命令

核心类型

type Command = {
  name: string                    // 命令名称
  description: string             // 描述
  handler: (args, context) => Promise<void | CommandResult>  // 处理函数
  argumentHint?: string           // 参数提示
  isHidden?: boolean              // 是否隐藏
  // ...
}

命令加载流程

  1. getCommands(cwd) 从文件系统加载命令
  2. 合并内置命令、技能命令(skills)、插件命令
  3. 返回命令列表供 REPL 使用

关键命令类别

类别 示例命令
会话管理 /clear, /compact, /resume, /continue
模型控制 /model, /effort
权限管理 /permissions, /permissions set
工具管理 /mcp, /hooks, /plugins
帮助信息 /help, /commands
Agent 管理 /agents, /agent
系统信息 /cost, /stats, /doctor

3.4 query.ts Agentic Loop

文件位置: src/query.ts

功能定位

query.ts 实现了 Claude Code 的 核心 Agentic Loop,是一个异步生成器函数,负责:

  1. 发送消息到 Anthropic API
  2. 处理流式响应
  3. 解析工具调用
  4. 执行工具并返回结果
  5. 循环直到完成

核心流程

async function* query(input: QueryInput): AsyncGenerator<QueryEvent> {
  // 1. 初始化消息历史
  // 2. 构建 API 请求参数
  // 3. 调用 API (流式)
  // 4. 处理响应:
  //    - 文本内容 -> yield StreamEvent
  //    - 工具调用 -> yield ToolUseConfirm
  //    - 思考内容 -> yield ThinkingEvent
  // 5. 执行工具 (如需)
  // 6. 循环直到 stop_reason !== 'tool_use'
  // 7. yield AssistantMessage (完成)
}

关键特性

  • 自动上下文压缩:当上下文长度接近限制时,自动触发压缩
  • 微压缩:增量式上下文优化
  • 预算跟踪:跟踪 token 使用和成本
  • 可中断:支持 AbortController 中断查询
  • 可重试:API 失败时自动重试

四、入口文件分析

4.1 main.tsx 启动流程

文件位置: src/main.tsx

功能定位

main.tsx 是整个应用的 启动入口,负责:

  1. CLI 参数解析(使用 Commander.js)
  2. 环境初始化(settings, config, telemetry)
  3. 模式检测(interactive vs non-interactive/print mode)
  4. 启动流程编排

启动流程

main() -> run() -> Commander 解析 -> preAction hook
  -> init() (初始化配置、遥测、认证)
  -> runMigrations() (数据迁移)
  -> setup() (工作目录、worktree、session 设置)
  -> getCommands() + getAgentDefinitions() (并行加载)
  -> 根据模式分支:
     - Interactive: launchREPL() -> Ink 渲染
     - Non-interactive: runHeadless() -> print.ts

关键启动阶段

阶段 功能
eagerLoadSettings() 早期加载 --settings 标志
initializeEntrypoint() 设置入口点类型 (cli, sdk, mcp 等)
init() 核心初始化 (配置、遥测、认证)
runMigrations() 运行数据迁移 (当前版本 11)
setup() 环境设置 (cwd, worktree, session)
startDeferredPrefetches() 延迟预取 (用户信息、模型能力等)

支持的入口点类型

入口点 说明
cli 标准交互式 CLI
sdk-cli SDK 非交互模式
sdk-typescript / sdk-python SDK 守护进程
mcp MCP 服务模式
claude-vscode VS Code 集成
claude-desktop Desktop 应用
remote 远程会话
local-agent 本地 Agent 模式

4.2 replLauncher.tsx REPL 启动器

文件位置: src/replLauncher.tsx

功能定位

REPL 启动器负责管理交互式会话的生命周期,包括:

  1. 创建 React 根节点
  2. 渲染 REPL 组件
  3. 处理会话恢复
  4. 管理会话状态

核心流程

launchREPL() -> createRoot() -> <App /> -> Ink 渲染
  -> REPL.tsx 处理用户输入
  -> QueryEngine 处理查询
  -> 消息列表实时更新

五、前端 UI 组件层

5.1 组件层次结构

文件位置: src/components/App.tsx

App.tsx (根组件)
  -> FullscreenLayout (全屏布局)
     -> Messages (消息列表)
        -> Message (单条消息)
           -> AssistantTextMessage (AI 文本)
           -> AssistantToolUseMessage (工具调用)
           -> AssistantThinkingMessage (思考过程)
           -> UserTextMessage (用户输入)
           -> UserToolResultMessage (工具结果)
           -> CompactBoundaryMessage (压缩边界)
           -> ... 更多消息类型
     -> TextInput (输入框)
     -> Footer (底部状态栏)
     -> DevBar (开发工具栏)

5.2 Ink 渲染引擎

文件位置: src/ink/ink.tsx

技术栈

使用 Ink(基于 React 的终端 UI 框架)进行终端渲染。

渲染机制

Ink 引擎使用 React Reconciler 自定义渲染到终端:

  • 双缓冲帧(frontFrame / backFrame):避免闪烁
  • 差异渲染:只输出变化的部分
  • 字符池/样式池优化:减少内存分配
  • 支持鼠标事件:点击、选择、滚动
  • 文本选择:支持终端文本选择
  • 搜索高亮:实时搜索匹配高亮

5.3 消息渲染系统

文件位置: src/components/messages/

消息类型

消息类型 组件 说明
用户文本 UserTextMessage 用户输入的文本消息
用户工具结果 UserToolResultMessage 工具执行结果
AI 文本 AssistantTextMessage AI 的文本回复
AI 工具调用 AssistantToolUseMessage AI 请求使用工具
AI 思考 AssistantThinkingMessage AI 的思考过程
压缩边界 CompactBoundaryMessage 上下文压缩标记
系统消息 SystemMessage 系统通知和状态

六、服务层分析

6.1 API 服务

文件位置: src/services/api/claude.ts

核心功能

与 Anthropic API 通信,处理请求和响应。

核心方法

方法 功能
queryModel() 核心 API 查询生成器(流式)
queryModelWithoutStreaming() 非流式查询
queryModelWithStreaming() 流式查询
executeNonStreamingRequest() 非流式请求执行(带重试)
verifyApiKey() API 密钥验证
getPromptCachingEnabled() 提示缓存检查
configureEffortParams() 配置 effort 参数
configureTaskBudgetParams() 配置任务预算

关键特性

  • 自动重试机制withRetry
  • 模型回退:streaming 失败时切换到非流式
  • 提示缓存(prompt caching)
  • Beta 功能管理
  • 流式 VCR 录制/回放

6.2 MCP 服务

文件位置: src/services/mcp/client.ts

核心功能

Model Context Protocol 客户端,支持外部工具动态加载。

关键特性

  • 多种传输方式:Stdio, SSE, Streamable HTTP, WebSocket
  • OAuth 认证支持
  • MCP 工具调用和资源读取
  • Elicitation(权限请求)处理

6.3 压缩服务

文件位置: src/services/compact/

文件 功能
autoCompact.ts 自动上下文压缩
microCompact.ts 微压缩(增量)
compact.ts 手动压缩
cachedMicrocompact.ts 缓存微压缩
sessionMemoryCompact.ts 会话记忆压缩

压缩策略

上下文接近限制 -> 触发压缩
  -> 微压缩:增量优化当前上下文
  -> 自动压缩:完整上下文重组
  -> 缓存压缩:利用缓存加速
  -> 会话记忆:保留关键信息

6.4 工具执行服务

文件位置: src/services/tools/

文件 功能
StreamingToolExecutor.ts 流式工具执行器
toolExecution.ts 工具执行逻辑
toolOrchestration.ts 工具编排
toolHooks.ts 工具生命周期钩子

6.5 LSP 服务

文件位置: src/services/lsp/

文件 功能
manager.ts LSP 管理器
LSPServerManager.ts LSP 服务器管理
LSPClient.ts LSP 客户端
LSPDiagnosticRegistry.ts 诊断注册

6.6 分析服务

文件位置: src/services/analytics/

文件 功能
index.ts 分析事件日志
growthbook.ts 功能标志 (A/B 测试)
datadog.ts Datadog 遥测
firstPartyEventLogger.ts 第一方事件日志

七、状态管理分析

7.1 Hooks 架构

文件位置: src/hooks/

Hooks 分类

类别 文件 功能
权限处理 toolPermission/ 工具权限决策流程
通知 notifs/ 各种系统通知
输入处理 useTextInput.ts, useVimInput.ts 文本输入管理
状态轮询 useInboxPoller.ts, useTaskListWatcher.ts 定时轮询
UI 状态 useVirtualScroll.ts, useBlink.ts UI 效果
集成 useIDEIntegration.tsx, useReplBridge.tsx 外部集成
模型 useMainLoopModel.ts 模型选择
命令 useCommandQueue.ts, useCommandKeybindings.tsx 命令管理

7.2 状态存储

文件位置: src/state/AppStateStore.ts

状态架构

AppStateStore (Zustand-like store)
  -> AppState (全局应用状态)
  -> ToolPermissionContext (工具权限上下文)
  -> ToolUseConfirmQueue (工具确认队列)
  
React Context
  -> AppStateProvider (状态提供者)
  -> MailboxProvider (消息邮箱)
  -> VoiceProvider (语音)
  -> WizardProvider (向导)

7.3 权限决策流程

文件位置: src/hooks/useCanUseTool.tsx

核心 Hook: useCanUseTool

工具权限决策的核心 Hook。

决策流程

工具调用 -> hasPermissionsToUseTool() -> 行为判断:
  - "allow" -> 直接允许
  - "deny" -> 直接拒绝
  - "ask" -> 显示确认对话框
     -> handleCoordinatorPermission() (协调器模式)
     -> handleSwarmWorkerPermission() (集群模式)
     -> handleInteractivePermission() (交互模式)

八、数据流总览

                    ┌─────────────────────────────────────────────────────┐
                    │                    main.tsx                          │
                    │  CLI 解析 -> init() -> setup() -> launchREPL()      │
                    └──────────────────────┬──────────────────────────────┘
                                           │
                    ┌──────────────────────▼──────────────────────────────┐
                    │                   REPL.tsx                           │
                    │  用户输入 -> QueryEngine.queryFn()                   │
                    └──────────────────────┬──────────────────────────────┘
                                           │
                    ┌──────────────────────▼──────────────────────────────┐
                    │                 QueryEngine.ts                       │
                    │  管理查询状态、消息流、工具确认队列                    │
                    └──────────────────────┬──────────────────────────────┘
                                           │
                    ┌──────────────────────▼──────────────────────────────┐
                    │                   query.ts                           │
                    │  Agentic Loop: 消息 -> API -> 工具执行 -> 循环        │
                    │  包含: 自动压缩、微压缩、上下文折叠、预算跟踪          │
                    └──────┬───────────────────────────┬──────────────────┘
                           │                           │
              ┌────────────▼──────┐      ┌─────────────▼──────────────┐
              │  services/api/    │      │   services/tools/          │
              │  claude.ts        │      │   StreamingToolExecutor    │
              │  (API 通信)       │      │   (工具执行)                │
              └───────────────────┘      └─────────────┬──────────────┘
                                                       │
                                        ┌──────────────▼──────────────┐
                                        │        Tool.ts / tools/     │
                                        │  Bash, Read, Edit, MCP...   │
                                        └─────────────────────────────┘

九、关键架构特点

9.1 生成器驱动的 Agentic Loop

使用 async generator 实现可中断、可恢复的 AI 交互循环。这种设计使得:

  • 查询可以随时被中止和恢复
  • 事件可以逐条 yield,支持实时 UI 更新
  • 工具调用可以暂停等待用户确认

9.2 React + Ink 终端 UI

使用 React 组件模型构建终端界面,支持:

  • 并发渲染
  • 组件复用
  • 状态管理
  • 差异更新

9.3 Feature Flag 系统

通过 feature() 函数控制功能开关,支持:

  • A/B 测试
  • 渐进式发布
  • 灰度发布
  • 功能回滚

9.4 MCP 协议集成

标准化的工具扩展协议,支持:

  • 外部工具动态加载
  • 多传输方式
  • OAuth 认证
  • 资源读取

9.5 多层上下文压缩

多级压缩策略优化 token 使用:

  • 自动压缩
  • 微压缩
  • 缓存压缩
  • 历史裁剪
  • 会话记忆

9.6 权限安全模型

多层权限检查确保安全:

  • 配置层权限
  • 分类器权限
  • 用户确认
  • 协调器模式
  • 集群模式

9.7 多入口点支持

支持多种运行模式:

  • CLI 交互式
  • SDK 非交互
  • MCP Server
  • VS Code 集成
  • Desktop 应用
  • 远程会话
  • 本地 Agent

9.8 流式 VCR

支持 API 请求/响应的录制和回放:

  • 测试用例录制
  • 调试回放
  • 离线开发
  • 性能分析

十、技术栈总结

10.1 核心技术

技术 用途
Bun 高性能 JavaScript 运行时
TypeScript 类型安全的开发语言
React UI 组件框架
Ink 终端 UI 渲染引擎
Commander.js CLI 命令解析
Zod 运行时类型验证

10.2 外部集成

服务 用途
Anthropic API AI 模型调用
MCP 工具扩展协议
LSP 语言服务器协议
GrowthBook 功能标志
Datadog 遥测监控

10.3 开发工具

工具 用途
ESLint 代码检查
Prettier 代码格式化
Vitest 单元测试
Playwright 端到端测试

附录:POC 项目说明

本项目是基于 claude-code-learning-pure 学习项目的 POC(Proof of Concept)版本,旨在提取和验证核心架构设计。

POC 项目特点

  • 精简架构:保留核心模块,去除复杂依赖
  • 快速验证:快速验证核心设计理念
  • 易于理解:代码简洁,便于学习和理解
  • 持续迭代:基于学习项目持续优化

核心模块映射

原始项目 POC 项目
QueryEngine.ts src/backend/queryEngine.ts
Tool.ts src/backend/toolSystem.ts
services/api/claude.ts src/backend/apiService.ts
commands.ts src/frontend/cli.ts
main.tsx src/index.ts
src/config/ src/config/config.ts

文档生成时间: 2026-04-01 分析版本: Claude Code Main 源码