本文档是对 Claude Code 源代码的深度分析,涵盖架构设计、核心模块、数据流、组件关系等关键内容。
Claude Code 是 Anthropic 开发的命令行 AI 编程助手,通过终端与 Claude 大模型交互,执行软件工程任务如文件编辑、命令执行、代码搜索和工作流协调。
| 特性 | 说明 |
|---|---|
| 运行时 | Bun (高性能 JavaScript 运行时) |
| 语言 | TypeScript (严格模式) |
| 终端 UI | React + Ink (React 命令行渲染库) |
| 规模 | ~1,900 个文件,512,000+ 行代码 |
| 架构 | 模块化、插件化、多代理协调 |
- Agentic Loop 驱动:基于生成器的可中断、可恢复 AI 交互循环
- 工具优先:丰富的工具生态系统,支持文件操作、命令执行、代码搜索等
- 权限安全:多层权限检查机制,确保工具执行安全
- 上下文管理:多级上下文压缩策略,优化 token 使用
- 插件化扩展:支持 MCP 协议、技能系统、插件系统
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 提供者
- 按功能域分层:
services/按功能子域细分(api/,mcp/,compact/,analytics/,lsp/等) - 按关注点分离:
components/按 UI 功能分组(messages/,mcp/,design-system/,agents/等) - Hooks 按用途分类:
hooks/包含通知(notifs/)、权限处理(toolPermission/)等子目录 - 工具独立目录:每个工具在
tools/下有独立子目录(BashTool/,ReadTool/,EditTool/等)
文件位置: 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的命令处理 - 依赖
canUseToolhook 进行权限检查 - 依赖
AppStateStore进行全局状态同步
文件位置: 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() 函数负责:
- 根据
ToolPermissionContext过滤工具 - 合并内置工具、MCP 工具、LSP 工具
- 应用权限策略(allowedTools / disallowedTools)
- 返回最终的工具列表
模型返回 tool_use -> canUseTool 检查权限 -> 用户确认 (如需) -> tool.execute() -> ToolResult -> 返回给模型
| 类别 | 示例 |
|---|---|
| 内置工具 | Bash, Read, Edit, Write, NotebookEdit, Grep, Glob, LS |
| MCP 工具 | 通过 MCP 协议动态加载的外部工具 |
| LSP 工具 | 语言服务器协议提供的工具 |
| Agent 工具 | 子 Agent 调用工具 |
| 系统工具 | ToolSearch, Advisor 等 |
文件位置: src/commands.ts
命令系统管理所有 斜杠命令(/help, /compact, /clear, /model 等)和 内置命令。
type Command = {
name: string // 命令名称
description: string // 描述
handler: (args, context) => Promise<void | CommandResult> // 处理函数
argumentHint?: string // 参数提示
isHidden?: boolean // 是否隐藏
// ...
}getCommands(cwd)从文件系统加载命令- 合并内置命令、技能命令(skills)、插件命令
- 返回命令列表供 REPL 使用
| 类别 | 示例命令 |
|---|---|
| 会话管理 | /clear, /compact, /resume, /continue |
| 模型控制 | /model, /effort |
| 权限管理 | /permissions, /permissions set |
| 工具管理 | /mcp, /hooks, /plugins |
| 帮助信息 | /help, /commands |
| Agent 管理 | /agents, /agent |
| 系统信息 | /cost, /stats, /doctor |
文件位置: src/query.ts
query.ts 实现了 Claude Code 的 核心 Agentic Loop,是一个异步生成器函数,负责:
- 发送消息到 Anthropic API
- 处理流式响应
- 解析工具调用
- 执行工具并返回结果
- 循环直到完成
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 失败时自动重试
文件位置: src/main.tsx
main.tsx 是整个应用的 启动入口,负责:
- CLI 参数解析(使用 Commander.js)
- 环境初始化(settings, config, telemetry)
- 模式检测(interactive vs non-interactive/print mode)
- 启动流程编排
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 模式 |
文件位置: src/replLauncher.tsx
REPL 启动器负责管理交互式会话的生命周期,包括:
- 创建 React 根节点
- 渲染 REPL 组件
- 处理会话恢复
- 管理会话状态
launchREPL() -> createRoot() -> <App /> -> Ink 渲染
-> REPL.tsx 处理用户输入
-> QueryEngine 处理查询
-> 消息列表实时更新
文件位置: src/components/App.tsx
App.tsx (根组件)
-> FullscreenLayout (全屏布局)
-> Messages (消息列表)
-> Message (单条消息)
-> AssistantTextMessage (AI 文本)
-> AssistantToolUseMessage (工具调用)
-> AssistantThinkingMessage (思考过程)
-> UserTextMessage (用户输入)
-> UserToolResultMessage (工具结果)
-> CompactBoundaryMessage (压缩边界)
-> ... 更多消息类型
-> TextInput (输入框)
-> Footer (底部状态栏)
-> DevBar (开发工具栏)
文件位置: src/ink/ink.tsx
使用 Ink(基于 React 的终端 UI 框架)进行终端渲染。
Ink 引擎使用 React Reconciler 自定义渲染到终端:
- 双缓冲帧(frontFrame / backFrame):避免闪烁
- 差异渲染:只输出变化的部分
- 字符池/样式池优化:减少内存分配
- 支持鼠标事件:点击、选择、滚动
- 文本选择:支持终端文本选择
- 搜索高亮:实时搜索匹配高亮
文件位置: src/components/messages/
| 消息类型 | 组件 | 说明 |
|---|---|---|
| 用户文本 | UserTextMessage |
用户输入的文本消息 |
| 用户工具结果 | UserToolResultMessage |
工具执行结果 |
| AI 文本 | AssistantTextMessage |
AI 的文本回复 |
| AI 工具调用 | AssistantToolUseMessage |
AI 请求使用工具 |
| AI 思考 | AssistantThinkingMessage |
AI 的思考过程 |
| 压缩边界 | CompactBoundaryMessage |
上下文压缩标记 |
| 系统消息 | SystemMessage |
系统通知和状态 |
文件位置: src/services/api/claude.ts
与 Anthropic API 通信,处理请求和响应。
| 方法 | 功能 |
|---|---|
queryModel() |
核心 API 查询生成器(流式) |
queryModelWithoutStreaming() |
非流式查询 |
queryModelWithStreaming() |
流式查询 |
executeNonStreamingRequest() |
非流式请求执行(带重试) |
verifyApiKey() |
API 密钥验证 |
getPromptCachingEnabled() |
提示缓存检查 |
configureEffortParams() |
配置 effort 参数 |
configureTaskBudgetParams() |
配置任务预算 |
- 自动重试机制(
withRetry) - 模型回退:streaming 失败时切换到非流式
- 提示缓存(prompt caching)
- Beta 功能管理
- 流式 VCR 录制/回放
文件位置: src/services/mcp/client.ts
Model Context Protocol 客户端,支持外部工具动态加载。
- 多种传输方式:Stdio, SSE, Streamable HTTP, WebSocket
- OAuth 认证支持
- MCP 工具调用和资源读取
- Elicitation(权限请求)处理
文件位置: src/services/compact/
| 文件 | 功能 |
|---|---|
autoCompact.ts |
自动上下文压缩 |
microCompact.ts |
微压缩(增量) |
compact.ts |
手动压缩 |
cachedMicrocompact.ts |
缓存微压缩 |
sessionMemoryCompact.ts |
会话记忆压缩 |
上下文接近限制 -> 触发压缩
-> 微压缩:增量优化当前上下文
-> 自动压缩:完整上下文重组
-> 缓存压缩:利用缓存加速
-> 会话记忆:保留关键信息
文件位置: src/services/tools/
| 文件 | 功能 |
|---|---|
StreamingToolExecutor.ts |
流式工具执行器 |
toolExecution.ts |
工具执行逻辑 |
toolOrchestration.ts |
工具编排 |
toolHooks.ts |
工具生命周期钩子 |
文件位置: src/services/lsp/
| 文件 | 功能 |
|---|---|
manager.ts |
LSP 管理器 |
LSPServerManager.ts |
LSP 服务器管理 |
LSPClient.ts |
LSP 客户端 |
LSPDiagnosticRegistry.ts |
诊断注册 |
文件位置: src/services/analytics/
| 文件 | 功能 |
|---|---|
index.ts |
分析事件日志 |
growthbook.ts |
功能标志 (A/B 测试) |
datadog.ts |
Datadog 遥测 |
firstPartyEventLogger.ts |
第一方事件日志 |
文件位置: src/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 |
命令管理 |
文件位置: src/state/AppStateStore.ts
AppStateStore (Zustand-like store)
-> AppState (全局应用状态)
-> ToolPermissionContext (工具权限上下文)
-> ToolUseConfirmQueue (工具确认队列)
React Context
-> AppStateProvider (状态提供者)
-> MailboxProvider (消息邮箱)
-> VoiceProvider (语音)
-> WizardProvider (向导)
文件位置: src/hooks/useCanUseTool.tsx
工具权限决策的核心 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... │
└─────────────────────────────┘
使用 async generator 实现可中断、可恢复的 AI 交互循环。这种设计使得:
- 查询可以随时被中止和恢复
- 事件可以逐条 yield,支持实时 UI 更新
- 工具调用可以暂停等待用户确认
使用 React 组件模型构建终端界面,支持:
- 并发渲染
- 组件复用
- 状态管理
- 差异更新
通过 feature() 函数控制功能开关,支持:
- A/B 测试
- 渐进式发布
- 灰度发布
- 功能回滚
标准化的工具扩展协议,支持:
- 外部工具动态加载
- 多传输方式
- OAuth 认证
- 资源读取
多级压缩策略优化 token 使用:
- 自动压缩
- 微压缩
- 缓存压缩
- 历史裁剪
- 会话记忆
多层权限检查确保安全:
- 配置层权限
- 分类器权限
- 用户确认
- 协调器模式
- 集群模式
支持多种运行模式:
- CLI 交互式
- SDK 非交互
- MCP Server
- VS Code 集成
- Desktop 应用
- 远程会话
- 本地 Agent
支持 API 请求/响应的录制和回放:
- 测试用例录制
- 调试回放
- 离线开发
- 性能分析
| 技术 | 用途 |
|---|---|
| Bun | 高性能 JavaScript 运行时 |
| TypeScript | 类型安全的开发语言 |
| React | UI 组件框架 |
| Ink | 终端 UI 渲染引擎 |
| Commander.js | CLI 命令解析 |
| Zod | 运行时类型验证 |
| 服务 | 用途 |
|---|---|
| Anthropic API | AI 模型调用 |
| MCP | 工具扩展协议 |
| LSP | 语言服务器协议 |
| GrowthBook | 功能标志 |
| Datadog | 遥测监控 |
| 工具 | 用途 |
|---|---|
| ESLint | 代码检查 |
| Prettier | 代码格式化 |
| Vitest | 单元测试 |
| Playwright | 端到端测试 |
本项目是基于 claude-code-learning-pure 学习项目的 POC(Proof of Concept)版本,旨在提取和验证核心架构设计。
- 精简架构:保留核心模块,去除复杂依赖
- 快速验证:快速验证核心设计理念
- 易于理解:代码简洁,便于学习和理解
- 持续迭代:基于学习项目持续优化
| 原始项目 | 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 源码