来源: 基于 2026-03-31 npm 包 source map 暴露的公开快照
规模: ~1,900 文件, 512,000+ 行 TypeScript 代码
运行时: Bun | 语言: TypeScript (strict) | 终端 UI: React + Ink
目录
-
-
-
-
-
-
-
-
-
1. 项目概述
Claude Code 是 Anthropic 官方 CLI 工具,用于从终端与 Claude 交互,执行软件工程任务(编辑文件、运行命令、搜索代码库、协调工作流等)。
关键元数据
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Vim Mode, Voice Mode, Plan Mode
|
2. 技术栈
运行时与语言
-
• Bun: 运行时 + bundler,使用
bun:bundle 实现条件编译和 dead code elimination
-
• TypeScript: strict mode,Zod v4 用于运行时 schema 验证
核心框架
|
|
|
|
|
React + Ink (vadimdemedes/ink)
|
|
|
@commander-js/extra-typings
|
|
|
|
|
|
|
|
|
ANSI/VT100 (CSI, OSC, DEC, SGR)
|
AI & API
|
|
|
|
|
Anthropic SDK (@anthropic-ai/sdk)
|
|
|
Claude 3.5/3.7, Opus, Sonnet, Haiku
|
|
|
|
|
|
|
协议集成
|
|
|
|
MCP (Model Context Protocol)
|
@modelcontextprotocol/sdk
|
|
LSP (Language Server Protocol)
|
|
|
|
|
|
|
|
代码搜索
可观测性
3. 架构设计
3.1 整体架构图
┌─────────────────────────────────────────────────────────────┐
│ main.tsx │
│ (Commander.js CLI 入口, ~4,683 行) │
└─────────────────────┬───────────────────────────────────────┘
│
┌───────────┼───────────┐
▼ ▼ ▼
┌──────────┐ ┌──────────┐ ┌──────────┐
│ MDM Prefetch │ │ Keychain │ │ Analytics │
│ (并行启动) │ │ Prefetch │ │ (GrowthBook)│
└──────────┘ └──────────┘ └──────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ launchRepl() → REPL.tsx │
│ (交互式 REPL, ~2,000+ 行) │
└─────────────────────┬───────────────────────────────────────┘
│
┌───────────┼───────────┐
▼ ▼ ▼
┌──────────┐ ┌──────────┐ ┌──────────┐
│AppState │ │ QueryEngine│ │ Tool Pool │
│Provider │ │ (查询引擎) │ │ (45+ 工具) │
└──────────┘ └──────────┘ └──────────┘
│ │ │
▼ ▼ ▼
┌─────────────────────────────────────────────────────────┐
│ 服务层 (Services) │
│ API │ MCP │ LSP │ OAuth │ Analytics │ Compact │ Voice │
└─────────────────────────────────────────────────────────┘
3.2 核心文件
|
|
|
|
main.tsx |
|
|
entrypoints/cli.tsx |
|
快速路径路由 (version, daemon, remote-control)
|
screens/REPL.tsx |
|
|
query.ts |
|
|
QueryEngine.ts |
|
|
Tool.ts |
|
|
commands.ts |
|
命令注册表 (100+ slash commands)
|
tools.ts |
|
|
context.ts |
|
|
3.3 依赖注入与初始化流程
// main.tsx 启动序列
1.profileCheckpoint('main_tsx_entry') // 性能剖析起点
2.startMdmRawRead() // MDM 子进程并行启动
3.startKeychainPrefetch() // Keychain 读取并行启动
4.enableConfigs() // 配置启用
5.initializeTelemetryAfterTrust() // 可观测性初始化
6.fetchBootstrapData() // API 引导数据
7.loadRemoteManagedSettings() // 远程托管设置
8.refreshPolicyLimits() // 组织策略限制
9.initializeLspServerManager() // LSP 服务初始化
10.launchRepl() → REPL.tsx// 启动 REPL
4. 核心模块详解
4.1 工具系统 (Tool System)
工具接口 (src/Tool.ts)
interfaceTool {
name: string
call(input: unknown): Promise<ToolResult>
description(): string
inputSchema: ZodSchema
outputSchema?: ZodSchema
// 安全元数据
isConcurrencySafe(): boolean
isReadOnly(): boolean
isDestructive(): boolean
checkPermissions(input: ToolInput): PermissionResult
// UI 渲染
renderToolUseMessage(): ReactNode
renderToolResultMessage(): ReactNode
// 权限
validateInput(input: unknown): ValidationResult
}
内置工具 (45+)
|
|
|
|
BashTool |
tools/BashTool/ |
|
FileReadTool |
tools/FileReadTool/ |
|
FileWriteTool |
tools/FileWriteTool/ |
|
FileEditTool |
tools/FileEditTool/ |
|
GlobTool |
tools/GlobTool/ |
|
GrepTool |
tools/GrepTool/ |
|
WebFetchTool |
tools/WebFetchTool/ |
|
WebSearchTool |
tools/WebSearchTool/ |
|
AgentTool |
tools/AgentTool/ |
|
SkillTool |
tools/SkillTool/ |
|
MCPTool |
tools/MCPTool/ |
|
LSPTool |
tools/LSPTool/ |
|
TaskCreateTool |
tools/TaskCreateTool/ |
|
TaskUpdateTool |
tools/TaskUpdateTool/ |
|
EnterPlanModeTool |
tools/EnterPlanModeTool/ |
|
CronCreateTool |
tools/CronCreateTool/ |
|
工具执行策略 (src/services/tools/toolOrchestration.ts)
// 工具调用分区执行
1. 只读工具: 并发执行 (max: 10)
2. 非只读工具: 串行执行
3. 可配置并发数: CLAUDE_CODE_MAX_TOOL_USE_CONCURRENCY
4.2 命令系统 (Command System)
命令注册 (src/commands.ts)
interfaceCommand {
type: 'prompt' | 'custom'
name: string
description: string
allowedTools?: Tool[]
getPromptForCommand?(context: CommandContext): string | Promise<string>
}
常用命令
|
|
|
/commit |
|
/review |
|
/compact |
|
/mcp |
|
/config |
|
/doctor |
|
/memory |
|
/skills |
|
/tasks |
|
/vim |
|
/diff |
|
/cost |
|
/resume |
|
4.3 查询引擎 (Query Engine)
查询循环 (src/query.ts)
用户输入
│
▼
processUserInput() ──────────────────────┐
│ │
▼ │
isSlashCommand()? ──Yes──► 执行 Slash Command
│ No
▼
QueryEngine.submitMessage()
│
├── fetchSystemPromptParts() ────► 上下文构建
│
├── API 调用 (流式)
│ │
│ ▼
│ 接收 streaming response
│ │
│ ▼
│ tool_calls? ──Yes──► runTools() ──► 递归
│ │ No
│ ▼
└── 返回最终响应
特性支持
-
• 流式响应: 支持 Server-Sent Events
-
-
• Token 计数: 内置 cost tracker
-
• Prompt 缓存: beta header 支持
-
4.4 状态管理 (State Management)
Store 模式 (src/state/store.ts)
exportfunction createStore<T>(
initialState: T,
onChange?: OnChange<T>
): Store<T>
AppState (src/state/AppStateStore.ts)
interfaceAppState {
settings: UserConfiguration
mainLoopModel: ModelConfig
toolPermissionContext: PermissionContext
mcp: McpConnections
tasks: TaskState
kairosEnabled: boolean
replBridgeState: BridgeState
fileHistory: FileHistory
}
Provider 层级
<AppStateProvider>
<MailboxProvider>
<VoiceProvider> {/* VOICE_MODE only */}
{children}
</VoiceProvider>
</MailboxProvider>
</AppStateProvider>
5. 功能模块
5.1 服务层 (Services)
API 服务 (src/services/api/)
|
|
|
claude.ts |
Anthropic API 客户端 (~944 行)
|
client.ts |
|
bootstrap.ts |
|
errors.ts |
|
filesApi.ts |
|
promptCacheBreakDetection.ts |
|
MCP 服务 (src/services/mcp/)
|
|
|
client.ts |
|
config.ts |
|
types.ts |
|
MCPConnectionManager.tsx |
|
LSP 服务 (src/services/lsp/)
|
|
|
manager.ts |
|
LSPServerManager.ts |
|
LSPClient.ts |
|
config.ts |
|
其他服务
|
|
|
compact/ |
|
oauth/ |
|
analytics/ |
|
plugins/ |
|
policyLimits/ |
|
voice.ts |
|
5.2 UI 层 (Ink/React)
Ink 核心 (src/ink/)
ink/
├── ink.tsx # 主组件
├── App.tsx # 根组件
├── reconciler.ts # React Reconciler 适配
├── renderer.ts # Yoga 布局引擎
├── termio/ # 终端协议解析
│ ├── ansi.ts # ANSI 转义序列
│ ├── parser.ts # 解析器
│ ├── csi.ts # Control Sequence Introducer
│ ├── osc.ts # Operating System Command
│ └── dec.ts # DEC 私有序列
├── events/ # 事件系统
│ ├── keyboard-event.ts
│ ├── mouse-event.ts
│ └── focus-event.ts
├── layout/ # 布局引擎
│ ├── engine.ts
│ ├── node.ts
│ └── yoga.ts
└── hooks/ # 自定义 hooks
├── use-input.ts
├── use-stdin.ts
├── use-app.ts
└── use-animation-frame.ts
UI 组件 (src/components/)
-
-
-
•
Messages.tsx (147KB) – 消息渲染
-
•
MessageSelector.tsx (115KB) – 消息选择
-
•
ScrollKeybindingHandler.tsx (148KB) – 键盘处理
-
•
Stats.tsx (152KB) – 统计显示
-
•
StatusLine.tsx (49KB) – 状态栏
5.3 插件系统 (src/plugins/)
// 插件加载流程
initBuiltinPlugins() // 加载内置插件
loadAllPluginsCacheOnly() // 加载缓存插件
cleanupOrphanedPluginVersionsInBackground() // 清理孤立版本
5.4 Skill 系统 (src/skills/)
-
• 内置 skills:
init/, review-pr/, pdf/, commit/, simplify/, security-review/, loop/
-
-
5.5 Vim 模式 (src/vim/)
|
|
|
motions.ts |
|
operators.ts |
|
transitions.ts |
|
textObjects.ts |
|
6. 部署方案
6.1 构建配置
Bundler: Bun (bun:bundle)
条件编译:
import { feature } from'bun:bundle'
constmodule = feature('FEATURE_FLAG')
? require('./module.js').default
: null
6.2 Feature Flags
|
|
|
COORDINATOR_MODE |
|
KAIROS |
|
BRIDGE_MODE |
|
DAEMON |
|
BG_SESSIONS |
|
VOICE_MODE |
|
WEB_BROWSER_TOOL |
|
MONITOR_TOOL |
|
AGENT_TRIGGERS |
|
CONTEXT_COLLAPSE |
|
6.3 启动优化 (main.tsx)
// 并行预取节省 ~65ms
startMdmRawRead() // macOS: plutil, Windows: reg query
startKeychainPrefetch() // OAuth + API key 读取并行化
6.4 发布配置
-
• 版本管理:
MACRO.VERSION (编译时内联)
-
• 发布目标:
ant (内部) vs external (公开)
-
• 平台支持: macOS, Windows, Linux
7. 关键技术实现
7.1 终端渲染 (Ink)
Ink 是 React 的终端渲染器,使用 Yoga 布局引擎:
// 渲染流程
JSX → InkComponents → Reconciler → Layout (Yoga) → ANSIOutput
关键文件:
-
•
ink/reconciler.ts – React Reconciler 适配
-
•
ink/renderer.ts – Yoga 布局执行
-
•
ink/termio/ – ANSI 协议解析
7.2 流式 API 处理
// query.ts 中的流式处理
const stream = await api.messages.create({
model: config.model,
messages: conversationHistory,
stream: true,
max_tokens: config.maxTokens,
})
forawait (const event of stream) {
if (event.type === 'content_block_delta') {
// 处理增量输出
} elseif (event.type === 'message_delta') {
// 处理 tool_calls
}
}
7.3 权限系统
// PermissionMode 类型
typePermissionMode =
| 'default'// 每次询问
| 'plan'// 计划模式跳过
| 'bypassPermissions'// 跳过所有
| 'auto'// 基于 AI 分类自动决定
// 检查流程
tool.checkPermissions(input)
→ PermissionContext.evaluate()
→ allow | deny | prompt
7.4 上下文压缩
// src/services/compact/
compact.ts// 主压缩逻辑
autoCompact.ts// 自动触发
timeBasedMCConfig.ts// 基于时间的配置
microCompact.ts// 微压缩
8. 安全与权限
8.1 权限模型
|
|
|
default |
|
plan |
|
bypassPermissions |
|
auto |
|
8.2 安全措施
-
• 输入验证: Zod schema 验证所有工具输入
-
• 权限回调:
bridgePermissionCallbacks.ts
-
• 敏感操作:
isDestructive() 标记危险工具
-
• Keychain: API key 存储在系统 Keychain
8.3 OAuth 流程
用户授权 → OAuth 服务器 → Authorization Code → Token 交换 → Keychain 存储
9. 性能优化
9.1 启动优化
-
1. 并行预取: MDM + Keychain 并行读取
-
2. 懒加载: Heavy 模块 (OpenTelemetry, gRPC) 延迟 import
-
3. 缓存: Feature flag 缓存, 工具缓存
9.2 运行时优化
-
-
2. Memoization: Selector 模式避免不必要渲染
-
9.3 内存优化
-
-
2. Session Memory: 自动提取记忆
-
附录: 目录结构
src/
├── main.tsx # CLI 入口 (~4,683 行)
├── entrypoints/ # 初始化逻辑
│ └── cli.tsx # 快速路径路由
├── commands.ts # 命令注册表 (~754 行)
├── tools.ts # 工具组装 (~389 行)
├── Tool.ts # 工具接口 (~792 行)
├── query.ts # 查询循环 (~1,729 行)
├── QueryEngine.ts # 查询引擎 (~1,295 行)
├── context.ts # 上下文构建
├── cost-tracker.ts # Token 成本追踪
│
├── commands/ # Slash 命令实现 (~50)
├── tools/ # 工具实现 (~45)
├── components/ # UI 组件 (~146)
│ ├── design-system/ # 设计系统
│ ├── messages/ # 消息渲染
│ ├── permissions/ # 权限对话框
│ └── PromptInput/ # 输入处理
│
├── screens/ # 全屏 UI
│ ├── REPL.tsx # 主 REPL
│ ├── Doctor.tsx # 诊断界面
│ └── Resume.tsx # 恢复界面
│
├── services/ # 服务层
│ ├── api/ # Anthropic API
│ ├── mcp/ # MCP 协议
│ ├── lsp/ # LSP 协议
│ ├── analytics/ # 分析和 Feature Flags
│ ├── compact/ # 上下文压缩
│ ├── plugins/ # 插件系统
│ └── oauth/ # OAuth 认证
│
├── state/ # 状态管理
│ ├── AppStateStore.ts # App 状态
│ ├── store.ts # Store 工厂
│ └── selectors.ts # 状态选择器
│
├── ink/ # Ink 渲染引擎
│ ├── reconciler.ts # React Reconciler
│ ├── renderer.ts # Yoga 布局
│ ├── termio/ # 终端协议
│ ├── events/ # 事件系统
│ └── hooks/ # 自定义 hooks
│
├── bridge/ # IDE 桥接
│ ├── bridgeMain.ts # 桥接主循环
│ ├── bridgeMessaging.ts # 消息协议
│ └── replBridge.ts # REPL 桥接
│
├── coordinator/ # 多 Agent 协调
├── plugins/ # 插件系统
├── skills/ # Skill 系统
├── vim/ # Vim 模式
├── voice/ # 语音输入
├── remote/ # 远程会话
├── server/ # 服务器模式
├── memdir/ # 持久内存
├── tasks/ # 任务管理
├── migrations/ # 配置迁移
├── schemas/ # Zod schemas
├── types/ # TypeScript 类型
├── utils/ # 工具函数
└── upstreamproxy/ # 代理配置
分析基于: Claude Code 公开源码快照 (2026-03-31)