Architecture Map
Claude Code 遵循分层架构,每一层都有明确的职责。理解这张架构图,是高效导航 512K+ 行代码库的关键。
graph TB
subgraph "CLI Layer"
CLI["cli.tsx — Bootstrap Entrypoint"]
MAIN["main.tsx — Commander.js CLI"]
end
subgraph "Command Layer"
CMDS["commands.ts — Command Registry"]
SLASH["60+ Slash Commands"]
SKILLS["Skills & Plugins"]
end
subgraph "Agentic Loop"
QE["QueryEngine — Session Manager"]
QUERY["query.ts — Turn Orchestrator"]
CLAUDE["claude.ts — API Streaming"]
end
subgraph "Tool System"
TOOLS["tools.ts — Tool Pool Assembly"]
TOOL_DEF["Tool.ts — Tool Interface"]
STE["StreamingToolExecutor"]
BUILTIN["30+ Built-in Tools"]
MCP["MCP Tools"]
end
subgraph "Infrastructure"
RETRY["withRetry.ts — Retry Logic"]
SETTINGS["settings.ts — Configuration"]
PERMS["permissions.ts — Security"]
COMPACT["compact.ts — Context Management"]
end
CLI --> MAIN
MAIN --> CMDS
CMDS --> SLASH
CMDS --> SKILLS
MAIN --> QE
QE --> QUERY
QUERY --> CLAUDE
CLAUDE --> RETRY
QUERY --> STE
STE --> BUILTIN
STE --> MCP
TOOLS --> BUILTIN
TOOLS --> MCP
QUERY --> COMPACT
STE --> PERMS
MAIN --> SETTINGS
第 1 层:CLI 入口(src/entrypoints/)
Section titled “第 1 层:CLI 入口(src/entrypoints/)”最外层负责进程引导和快速路由。
关键文件:
src/entrypoints/cli.tsx— Bootstrap 入口,快速路由src/entrypoints/init.ts— 配置、遥测和代理初始化src/entrypoints/mcp.ts— MCP 服务器模式入口
CLI 层实现了快速路径模式 — 在加载任何重型模块之前,先处理 --version 等特殊标志:
async function main(): Promise<void> { const args = process.argv.slice(2)
// Fast-path for --version: zero module loading needed if (args.length === 1 && (args[0] === '--version' || args[0] === '-v')) { console.log(`${MACRO.VERSION} (Claude Code)`) return }
// For all other paths, load the startup profiler const { profileCheckpoint } = await import('../utils/startupProfiler.js') profileCheckpoint('cli_entry')
// Route to specialized entrypoints...}init() 函数(已 memoize,只运行一次)负责:
- 配置校验与启用
- 环境变量应用(信任前的安全子集,信任后的完整集合)
- 优雅关闭注册
- OAuth 账户信息填充
- mTLS 和代理配置
- 遥测初始化
第 2 层:CLI 框架(src/main.tsx)
Section titled “第 2 层:CLI 框架(src/main.tsx)”主模块是代码库中最大的文件(约 785KB)。它将 commander.js 参数解析、配置加载和 REPL 启动器整合在一起。
核心职责:
- commander.js 命令注册,配合类型安全选项
- API 密钥校验和认证流程
- MCP 服务器初始化
- Tool pool 组装
- REPL/打印模式启动
// src/main.tsx — Side effects run at import timeimport { profileCheckpoint } from './utils/startupProfiler.js'profileCheckpoint('main_tsx_entry')
import { startMdmRawRead } from './utils/settings/mdm/rawRead.js'startMdmRawRead() // Fire MDM subprocess in parallel with imports
import { startKeychainPrefetch } from './utils/secureStorage/keychainPrefetch.js'startKeychainPrefetch() // Fire keychain reads in parallel第 3 层:命令系统(src/commands.ts)
Section titled “第 3 层:命令系统(src/commands.ts)”命令注册表通过复杂的加载系统管理 60+ 个 slash command:
export async function getCommands(cwd: string): Promise<Command[]> { const allCommands = await loadAllCommands(cwd) const dynamicSkills = getDynamicSkills()
const baseCommands = allCommands.filter( _ => meetsAvailabilityRequirement(_) && isCommandEnabled(_), ) // ... dedupe dynamic skills}命令来自多个来源:
- 内置命令 — 硬编码在
COMMANDS()中(已 memoize) - 打包 skill — 随二进制文件发布
- Skill 目录命令 — 用户在
.claude/skills/中自定义 - Plugin 命令 — 来自已安装的 plugin
- 工作流命令 — 来自工作流脚本
- MCP 命令 — 来自已连接的 MCP 服务器
第 4 层:Query Engine(src/QueryEngine.ts)
Section titled “第 4 层:Query Engine(src/QueryEngine.ts)”QueryEngine 类负责对话生命周期:
sequenceDiagram
participant User
participant QE as QueryEngine
participant PUI as processUserInput
participant Q as query()
participant C as claude.ts
User->>QE: submitMessage(prompt)
QE->>PUI: Process slash commands, attachments
PUI-->>QE: messages, shouldQuery, allowedTools
QE->>Q: query({ messages, systemPrompt, ... })
Q->>C: createStreamedResponse()
C-->>Q: Stream events (text, tool_use, ...)
Q->>Q: Execute tools via StreamingToolExecutor
Q-->>QE: Yield messages (assistant, user, system)
QE-->>User: SDKMessage stream
关键设计:submitMessage() 返回 AsyncGenerator<SDKMessage>,让调用方能够增量消费消息:
export class QueryEngine { async *submitMessage( prompt: string | ContentBlockParam[], options?: { uuid?: string; isMeta?: boolean }, ): AsyncGenerator<SDKMessage, void, unknown> { // 1. Process user input (slash commands, attachments) // 2. Build system prompt // 3. Enter query loop for await (const message of query({ messages, systemPrompt, ... })) { // 4. Process each message (record, track usage, yield) } // 5. Yield final result }}第 5 层:Agentic Loop(src/query.ts)
Section titled “第 5 层:Agentic Loop(src/query.ts)”query() 函数实现了核心 agentic loop — 循环包括:
- 向 API 发送消息
- 接收 streaming 响应
- 执行 tool 调用
- 将结果反馈回去
// src/query.ts — Imports reveal the orchestration scopeimport { StreamingToolExecutor } from './services/tools/StreamingToolExecutor.js'import { runTools } from './services/tools/toolOrchestration.js'import { isAutoCompactEnabled } from './services/compact/autoCompact.js'import { FallbackTriggeredError } from './services/api/withRetry.js'该循环负责处理:
- 自动 compaction:接近 context 上限时自动压缩
- 响应式 compaction:遇到 prompt 过长错误时,使用压缩后的 context 重试
- 模型降级:在连续 529 错误时从 Opus 降级到 Sonnet
- Tool 执行:通过
StreamingToolExecutor并行执行并发安全的 tool
第 6 层:API Streaming(src/services/api/claude.ts)
Section titled “第 6 层:API Streaming(src/services/api/claude.ts)”最底层负责原始 API 通信:
// src/services/api/claude.ts — Types reveal the protocolimport type { BetaRawMessageStreamEvent, BetaMessageStreamParams,} from '@anthropic-ai/sdk/resources/beta/messages/messages.mjs'import type { Stream } from '@anthropic-ai/sdk/streaming.mjs'该层负责:
- 带 cache 断点的 system prompt 构建
- 消息规范化为 API 格式
- Streaming 事件处理(message_start、content_block_start、content_block_delta 等)
- Beta 功能头部(thinking、effort、fast mode、tool search)
- 多提供商支持(Anthropic 直连、Bedrock、Vertex)
第 7 层:Tool 系统(src/Tool.ts、src/tools.ts)
Section titled “第 7 层:Tool 系统(src/Tool.ts、src/tools.ts)”Tool 系统是 Claude 与外界交互的主要机制:
// src/Tool.ts — Core tool interface (simplified)export type Tool<Input, Output, P> = { name: string inputSchema: Input // Zod schema call(args, context, canUseTool, parentMessage, onProgress?): Promise<ToolResult<Output>> checkPermissions(input, context): Promise<PermissionResult> isReadOnly(input): boolean isDestructive?(input): boolean isConcurrencySafe(input): boolean prompt(options): Promise<string> // ... rendering, validation, progress tracking}Tool 通过 getTools() 配合权限感知过滤来组装:
export const getTools = (permissionContext: ToolPermissionContext): Tools => { if (isEnvTruthy(process.env.CLAUDE_CODE_SIMPLE)) { return filterToolsByDenyRules([BashTool, FileReadTool, FileEditTool], permissionContext) } // Full tool pool with deny-rule filtering and REPL mode handling}graph LR
CLI["cli.tsx"] --> INIT["init.ts"]
CLI --> MAIN["main.tsx"]
MAIN --> SETUP["setup.ts"]
MAIN --> QE["QueryEngine.ts"]
MAIN --> CMDS["commands.ts"]
MAIN --> TOOLS_TS["tools.ts"]
QE --> QUERY["query.ts"]
QE --> PUI["processUserInput.ts"]
QUERY --> CLAUDE["claude.ts"]
QUERY --> STE["StreamingToolExecutor.ts"]
QUERY --> COMPACT["compact.ts"]
CLAUDE --> RETRY["withRetry.ts"]
CLAUDE --> ERRORS["errors.ts"]
STE --> EXEC["toolExecution.ts"]
EXEC --> PERMS["permissions.ts"]
EXEC --> HOOKS["hooks.ts"]
TOOLS_TS --> TOOL["Tool.ts"]
TOOL --> BUILTIN["30+ Tool implementations"]
QueryEngine
Section titled “QueryEngine”会话级编排器。每个对话对应一个实例。管理消息历史、文件状态 cache、用量追踪和 permission 拒绝追踪。
src/QueryEngine.ts (1296 行)├── submitMessage() — 主入口,yield SDKMessage stream├── interrupt() — 中止当前操作├── getMessages() — 读取对话历史└── setModel() — 会话中途切换模型所有能力的通用接口 — 从读取文件到派生 sub-agent。每个 tool 都实现相同的接口,buildTool() 提供默认值:
src/Tool.ts (793 行)├── Tool<Input, Output, P> — 完整 tool 接口├── ToolDef<Input, Output, P> — 部分定义(用于 buildTool)├── buildTool() — 填充默认值,返回完整 Tool├── ToolUseContext — 传递给每次 tool 调用的运行时 context└── ToolPermissionContext — 用于 tool 过滤的 permission 状态Command
Section titled “Command”slash command 接口,支持三种类型:
type Command = | { type: 'local'; ... } // Synchronous, local execution | { type: 'local-jsx'; ... } // Renders Ink UI | { type: 'prompt'; ... } // Expands to text for the modelPermission
Section titled “Permission”多来源 permission 规则,支持模式匹配:
src/types/permissions.ts├── PermissionMode — 'default' | 'plan' | 'auto' | 'bypassPermissions'├── PermissionResult — 'allow' | 'deny' | 'ask' with updatedInput├── ToolPermissionRulesBySource — Rules keyed by setting source└── AdditionalWorkingDirectory — Extra allowed directories数据流:从用户输入到响应
Section titled “数据流:从用户输入到响应”sequenceDiagram
participant U as User
participant M as main.tsx
participant QE as QueryEngine
participant Q as query.ts
participant C as claude.ts
participant R as withRetry
participant API as Anthropic API
participant STE as StreamingToolExecutor
participant T as Tool.call()
U->>M: Type message + Enter
M->>QE: submitMessage(prompt)
QE->>QE: processUserInput() → messages
QE->>Q: query({ messages, systemPrompt })
Q->>C: createStreamedResponse()
C->>R: withRetry(operation)
R->>API: POST /v1/messages (streaming)
API-->>R: SSE stream events
R-->>C: Stream events
C-->>Q: Parsed messages
alt Tool use requested
Q->>STE: addTool(block, assistantMessage)
STE->>T: call(args, context, canUseTool)
T-->>STE: ToolResult
STE-->>Q: User message with tool_result
Q->>C: Next turn with tool results
end
Q-->>QE: yield messages
QE-->>M: SDKMessage stream
M-->>U: Rendered output
src/├── entrypoints/ # 进程入口(cli.tsx, init.ts, mcp.ts)├── bootstrap/ # 早期状态初始化├── commands/ # 60+ slash command(/help, /config, /model, ...)├── components/ # Ink React 组件(UI)├── constants/ # system prompt、beta 功能、限制├── context/ # React context provider├── hooks/ # React hook(permission、tool、state)├── services/│ ├── api/ # claude.ts, withRetry.ts, errors.ts│ ├── analytics/ # GrowthBook, 遥测│ ├── compact/ # 自动 compaction, 响应式 compaction│ ├── mcp/ # MCP 客户端, 配置, 服务器管理│ ├── tools/ # StreamingToolExecutor, toolOrchestration│ └── ...├── tools/ # 30+ tool 实现│ ├── AgentTool/│ ├── BashTool/│ ├── FileEditTool/│ ├── FileReadTool/│ ├── GlobTool/│ ├── GrepTool/│ └── ...├── types/ # TypeScript 类型定义├── utils/ # 工具模块│ ├── settings/ # 配置系统│ ├── permissions/ # Permission 引擎│ ├── model/ # 模型选择与路由│ ├── plugins/ # Plugin 加载│ └── ...├── main.tsx # Commander.js CLI 框架├── commands.ts # 命令注册表├── query.ts # Agentic loop├── QueryEngine.ts # 会话生命周期├── Tool.ts # Tool 接口└── tools.ts # Tool pool 组装