Claude Code 深度架构解析

Anthropic 官方 AI 编程 CLI 工具的完整架构分析 —— 从入口到渲染、从 Query 循环到工具系统的全链路拆解

注意:本分析基于 Claude Code 的编译构建产物反编译版本,非原始开发仓库源码。代码逻辑真实,但文件结构经过打包处理(如 main.tsx 为 803KB 的 Bundle 产物)。
50+核心模块
40+内置工具
100+斜杠命令
298工具函数
113UI 组件
83React Hooks

一、项目总览

Claude Code 是 Anthropic 官方出品的 AI 驱动的命令行编程助手,基于 TypeScript + React (Ink) 构建。本分析基于构建产物反编译版本。

项目定位

Claude Code 是一个在终端中运行的 AI 代理,能够读取/编辑文件、执行 Shell 命令、搜索代码、管理 Git、调用外部服务等。它不是简单的聊天机器人,而是一个拥有完整工具系统权限系统会话管理多代理协作能力的智能编程平台。

技术栈

技术用途说明
TypeScript核心语言全量 TypeScript 编写,类型安全
React + Ink终端 UI自定义 React 渲染器,将 JSX 渲染到终端
Yoga Layout布局引擎Facebook 的 Flexbox 布局引擎,用于终端排版
ZodSchema 验证运行时类型校验,用于工具输入/输出验证
Bun打包构建Feature Flag 门控 + Dead Code Elimination
Commander.jsCLI 解析命令行参数和选项解析
Anthropic SDKAPI 调用与 Claude 模型通信

源码结构

src/ ├── main.tsx — 主入口 (803KB),CLI 解析 + 初始化编排 ├── setup.ts — 预初始化(终端恢复、worktree、hooks 快照) ├── context.ts — 系统/用户上下文构建(git 状态、memory 文件) ├── commands.ts — 命令注册中心(内置 + 插件 + MCP + skills) ├── Tool.ts — 工具接口定义(Tool 类型 + ToolUseContext) ├── tools.ts — 工具注册表(50+ 工具 + Feature Gate) ├── query.ts — 核心 Query 循环(多轮对话 + 工具执行) ├── QueryEngine.ts — 高层 Query 编排(SDK 接口封装) ├── Task.ts — 任务类型定义与生命周期 ├── cost-tracker.ts — 成本追踪(Token 用量 + USD 计算) ├── history.ts — 命令历史 + 粘贴内容管理 ├── tools/ — 40 个工具实现(每个工具独立目录) ├── commands/ — 100+ 个斜杠命令 ├── components/ — 113 个 UI 组件文件 ├── hooks/ — 83 个 React Hooks ├── services/ — 服务层(API、MCP、OAuth、语音等) ├── ink/ — 自定义终端渲染引擎(43 个文件) ├── utils/ — 298 个工具函数 ├── bridge/ — 远程控制通信层(31 个文件) ├── state/ — 状态管理(AppState + Store) ├── keybindings/ — 快捷键系统 ├── skills/ — 技能系统 ├── plugins/ — 插件系统 ├── constants/ — 常量定义(prompt、限制、beta 等) ├── types/ — 类型定义(branded types、权限等) └── entrypoints/ — 多入口(CLI、MCP server、SDK)

二、架构分层

Claude Code 采用清晰的分层架构,从入口到渲染层层递进

入口层 Entrypoint main.tsx → cli.tsx → 参数解析、Feature Gate、初始化编排
命令层 Commands 130+ 斜杠命令(/commit、/review、/model 等),支持 JSX 交互式命令
Query 引擎层 QueryEngine.ts → query.ts,多轮对话循环 + 错误恢复 + 自动压缩
工具层 Tools 40 个工具(Bash、Read、Edit、Grep、Agent 等),统一接口 + 权限管控
服务层 Services API 通信、MCP 协议、OAuth、语音、压缩、Token 估算、LSP
UI 层 Components React + Ink 终端渲染、80+ 组件、虚拟滚动、Markdown 渲染
基础设施层 Infra 状态管理、快捷键、290+ Utils、常量、类型定义、Bridge 通信
核心设计理念:每一层只依赖其下层,不反向依赖。Query 引擎是核心中枢,工具系统是能力载体,UI 层负责终端呈现。

三、启动流程

从 CLI 输入到第一次渲染,Claude Code 执行了一系列精心编排的初始化步骤

启动时序图

main() ├─ profileCheckpoint("start") // 性能打点 ├─ startKeychainPrefetch() // 后台预取密钥 ├─ startMdmRawRead() // 后台读取 MDM 配置 ├─ Parse CLI args (Commander.js) // 解析命令行参数 │ ├─ --dry-run, --debug, --tools │ ├─ --model, --permission-mode │ └─ --worktree, --remote ├─ setup() // 预初始化 │ ├─ Terminal Restoration // 恢复被中断的终端设置 │ ├─ Worktree Creation (--worktree) // 创建 git worktree │ ├─ Tmux Session (if iTerm2) // tmux 会话 │ ├─ Hook Snapshot // 捕获 hooks 快照(防篡改) │ ├─ Permission Validation // 权限安全检查 │ ├─ Session Memory Init // 初始化会话记忆 │ └─ Background Jobs Registration // 注册后台任务 ├─ getCommands() + initBundledSkills() // 加载命令 + 技能 ├─ getAllBaseTools() // 组装工具集 ├─ Initialize Permission System // 初始化权限系统 ├─ Load Settings / Run Migrations // 加载设置,执行迁移 ├─ Trust Dialog (if needed) // 信任确认对话框 ├─ GrowthBook Init // Feature Flag 初始化 └─ launchRepl() // 启动 REPL 主界面 └─ <App><REPL /></App> // 渲染 React 组件树
性能优化亮点:大量使用后台预取(Keychain、MDM、API Key)和懒加载(动态 require()),确保首次渲染极速。非关键模块(遥测、插件)在后台异步加载。

四、核心文件详解

12 个核心文件共约 11,259 行代码,构成 Claude Code 的骨架

核心 main.tsx

4,683 行 — 整个应用的入口和 CLI 编排器

职责

  • CLI 参数解析(Commander.js)
  • 启动性能 Profiling(profileCheckpoint)
  • 密钥和 MDM 后台预取
  • 命令注册(内置 + 插件 + Skills)
  • 设置加载与 Feature Gate
  • 权限系统初始化
  • 工具配置与过滤
  • 错误处理与遥测
  • 远程会话(CCR)支持
  • 插件热重载

关键设计

Deferred Prefetches — 首次渲染后才启动 System Prompt 和 MCP 资源的加载。大量使用 feature() 门控,实现构建时 Dead Code Elimination。

核心 query.ts

1,729 行 — 核心对话循环,Claude Code 的「心脏」

核心能力

  • 多轮对话的 Agentic Loop
  • API 请求 + 流式响应
  • 并行工具执行(runTools)
  • max_output_tokens 恢复机制
  • Reactive / Auto Compact(自动压缩)
  • Stop Hooks(停止钩子)
  • Token Budget 追踪
  • Thinking Block 管理

AsyncGenerator 模式

export async function* query(
  params: QueryParams
): AsyncGenerator<StreamEvent | Message>

使用 Generator 实现流式输出,UI 层可逐步接收消息。

核心 QueryEngine.ts

1,295 行 — 高层 Query 编排,SDK/Headless 模式的封装

核心能力

  • 将 Generator 封装为 async/await 接口
  • 会话状态管理(跨多次 submitMessage)
  • System Prompt 组装
  • 权限拒绝追踪(SDK 报告用)
  • 文件状态缓存
  • Thinking Mode 配置
  • 附件处理(文件、图片、嵌套 memory)
  • Token 使用累计

核心 Tool.ts

792 行 — 工具接口定义,所有工具的基础类型

Tool 接口

type Tool = {
  name: string
  call(input, context, msg)     // 执行工具
  prompt()                       // 系统 Prompt 片段
  checkPermissions(input, ctx)   // 权限检查
  inputSchema / outputSchema     // Zod Schema 验证
  isConcurrencySafe()            // 是否可并行
  isReadOnly() / isDestructive() // 读写属性
  renderToolUseMessage()         // 渲染调用消息
  renderToolResultMessage()      // 渲染结果消息
  shouldDefer                    // 是否延迟加载
  ...
}

ToolUseContext

约 300 行的上下文对象,传递给所有工具调用,包含:会话状态、权限上下文、通知系统、文件缓存、归因追踪等。

核心 commands.ts

754 行 — 命令注册中心

命令来源

  • 内置命令:/commit、/review、/help 等(commands/ 目录下大量子目录)
  • 插件命令:从 Plugin 目录和 MCP server 加载
  • 技能命令:Skill 定义的斜杠命令包装
  • Feature Gate 命令:按条件加载的高级命令

命令类型

type Command = {
  type: 'local' | 'prompt' | 'jsx'
  name: string
  description: string
  source: 'builtin' | 'plugin' | 'skill' | 'mcp'
}

核心 tools.ts

389 行 — 工具注册表,组装 40 个核心工具 + Feature Gate 扩展工具

工具分类(42 个目录,40 个实际工具)

  • 核心工具:Bash、FileRead、FileEdit、FileWrite、Glob、PowerShell
  • 搜索工具:Grep、WebSearch、WebFetch、ToolSearch
  • 任务工具:TaskCreate/Get/Update/List/Stop/Output
  • 高级工具:Agent(子代理)、Skill(技能)、LSP、SendMessage
  • 模式工具:EnterPlanMode、ExitPlanMode、EnterWorktree、ExitWorktree
  • Feature Gate:REPL、Sleep、ScheduleCron、RemoteTrigger
  • MCP 工具:MCPTool、ListMcpResources、ReadMcpResource、McpAuth
  • 其他:Brief、Config、AskUserQuestion、TodoWrite、TeamCreate/Delete、NotebookEdit

核心 context.ts

189 行 — 构建每次对话的系统/用户上下文

  • System Context:Git 状态(分支、最近提交、用户名)
  • User Context:CLAUDE.md 记忆文件、当前日期
  • Git 状态截断到 2000 字符,避免 Prompt 膨胀
  • 使用 memoize 缓存上下文

核心 其他核心文件

setup.ts (477 行)

预初始化:终端恢复、Worktree 创建、Hooks 快照、安全校验、UDS 消息服务

cost-tracker.ts (323 行)

按模型追踪 Token 用量和 USD 成本,支持会话恢复时的成本还原

history.ts (464 行)

命令历史持久化到 ~/.claude/history.jsonl,大粘贴内容哈希存储

Task.ts (125 行)

任务类型定义:local_bash、local_agent、remote_agent、in_process_teammate 等 7 种

五、Query 循环 —— Claude Code 的心脏

理解 Query 循环是理解 Claude Code 工作原理的关键

完整 Query 执行流

submitMessage(prompt) // 用户输入 ├─ processUserInput() // 处理用户输入 │ ├─ 解析附件(文件、图片、嵌套 memory) │ ├─ 注入上下文(System Prompt、User Context) │ └─ 创建 UserMessage ├─ query() // 进入核心循环 │ ├─ getSystemContext() + getUserContext() // 获取上下文 │ ├─ buildQueryConfig() // 构建查询配置 │ └─ ── 主循环 ── // 多轮对话 │ ├─ API Request (generateMessage) // 调用 Claude API │ │ └─ 流式返回 Tokens │ ├─ runTools() // 执行工具 │ │ ├─ canUseTool() 权限检查 │ │ ├─ tool.call(input, context) // 执行工具逻辑 │ │ ├─ yield 工具结果 │ │ └─ 并行工具(isConcurrencySafe) │ ├─ Error Recovery // 错误恢复 │ │ ├─ max_output_tokens → 继续生成 │ │ ├─ Reactive Compact → 压缩后重试 │ │ └─ Auto Compact → 自动压缩 │ ├─ Stop Hooks // 用户定义的停止钩子 │ └─ 判断终止条件 │ ├─ 用户中断(Ctrl+C) │ ├─ 达到 max turns │ ├─ 无工具调用(自然结束) │ └─ 错误 ├─ Map to SDK Message // 转换为 SDK 格式 ├─ Track Permission Denials // 记录权限拒绝 └─ Yield SDKMessage // 返回结果

状态机

type State = {
  messages: Message[]
  toolUseContext: ToolUseContext
  autoCompactTracking: AutoCompactTrackingState
  maxOutputTokensRecoveryCount: number
  hasAttemptedReactiveCompact: boolean
  pendingToolUseSummary: Promise<...>
  stopHookActive: boolean
  turnCount: number
  transition: Continue | undefined
}

错误恢复机制

场景恢复策略
max_output_tokens保留部分响应,继续生成下一轮
Token 超限Reactive Compact(快速压缩)
上下文过长Auto Compact(自动摘要压缩)
API 错误Retry with backoff
工具失败返回错误结果,模型自行处理
关键设计:AsyncGenerator 流式架构 — query.ts 使用 async function* 实现,每个 Token、每个工具调用结果都通过 yield 逐步发送给 UI 层。这保证了实时的流式输出体验,不需要等待整个响应完成。

六、工具系统架构

工具是 Claude Code 的「手和脚」,每个工具都遵循统一的接口规范

工具生命周期

模型请求调用工具 │ ├─ 1. inputSchema 验证 → 检查输入参数合法性 ├─ 2. validateInput() → 预执行检查(文件是否存在等) ├─ 3. checkPermissions() → 工具级权限检查 ├─ 4. canUseTool() → 全局权限门控(Ask / Allow / Deny) │ ├─ 自动允许 → 继续 │ ├─ 需要询问 → 显示审批 UI → 用户确认 │ └─ 拒绝 → 返回 Rejected ├─ 5. tool.call(input, context) → 执行工具逻辑 │ ├─ onProgress() 报告进度 │ └─ 返回 ToolResult ├─ 6. mapToolResultToBlock() → 转换为 API 格式 ├─ 7. 大结果持久化到磁盘 → maxResultSizeChars 限制 └─ 8. renderToolResultMessage() → UI 渲染结果

工具框架特性

Schema 验证 (Zod)

inputSchema + outputSchema,运行时验证工具输入输出。支持 lazySchema 延迟求值。

权限系统

Ask / Allow / Deny 三级。规则支持路径通配符、命令前缀、域名匹配、正则表达式。

并发控制

isConcurrencySafe() 标记是否可并行。Bash 工具串行队列执行。

进度报告

标准化 onProgress 回调,UI 实时显示工具执行进度。

延迟加载

shouldDefer 标记的工具通过 ToolSearch 按需加载,减少初始 Prompt 大小。

UI 渲染

每个工具有独立的 JSX 渲染组件,显示调用中、结果、错误、拒绝四种状态。

权限系统架构

配置位置说明
.claude/settings.json用户设置:hooks、permissions、behaviors
global.json全局设置:theme、model、voice
Permission RulesBehavior: deny/ask/allow,Content: 路径通配符、命令前缀、域名
默认模式ask(用户控制默认行为)
特殊保护SSH/UNC 路径阻止(防止凭据泄露)、Secret 模式检测

七、内置工具一览

Claude Code 内置 40 个工具(42 个目录含 shared/testing),覆盖文件操作、搜索、执行、任务管理等领域

文件操作工具

工具功能关键特性
FileReadTool读取文件内容编码检测、PDF 提取、图片处理、Token 大小限制、设备文件阻止
FileEditTool字符串替换编辑陈旧检测(Staleness)、引号规范化、原子读写锁、LSP 通知、Git Diff
FileWriteTool创建/覆盖文件自动创建父目录、文件历史备份、行尾保留、VSCode 通知、Skill 发现
NotebookEditTool编辑 Jupyter NotebookCell 级修改、保留 Cell 结构、多类型 Cell 支持

搜索与发现工具

工具功能关键特性
GrepTool内容搜索(ripgrep 后端)正则、多行匹配、VCS 目录排除、分页、默认 250 行限制
GlobTool文件名模式搜索最多返回 100 文件、相对路径输出
WebSearchTool网络搜索API 提供商检测、每次最多 8 次搜索、流式进度
WebFetchTool网页内容提取HTML → Markdown、预批准域名缓存、LLM 内容提取
ToolSearchTool搜索可用工具帮助模型发现相关工具

Shell 执行工具

工具功能关键特性
BashTool 执行 Shell 命令 安全:AST 解析命令验证、UNC 路径保护、Sed 编辑预览
执行:沙箱支持、后台任务、15 秒自动后台化
语义:检测搜索/读取/列表命令、Git 操作追踪
输出:Stdout/Stderr 捕获、图片渲染、大输出持久化
PowerShellToolPowerShell 命令(Windows)Cmdlet 规范化、同 Bash 安全模型

任务管理工具

工具功能
TaskCreateTool创建任务(subject + description + activeForm 形式)
TaskListTool列出所有任务及状态和依赖关系
TaskGetTool获取单个任务详情(含 metadata)
TaskUpdateTool更新任务状态/所有者/依赖(pending → in_progress → completed)
TaskStopTool停止后台运行的任务
TaskOutputTool读取后台任务的输出文件

代理与技能工具

工具功能关键特性
AgentTool 生成子代理 隔离类型:Worktree / Remote(CCR) / CWD
模型选择:sonnet / opus / haiku
团队协作:多代理 Swarm 团队
后台运行:120 秒自动后台化
SkillTool执行技能本地/内置/市场 Skill、Frontmatter 元数据解析、隔离执行
SendMessageTool团队消息向 Teammate 发送消息、邮箱投递

其他专业工具

LSPTool

Language Server Protocol:goToDefinition、findReferences、hover、documentSymbol 等

EnterWorktreeTool

创建隔离的 git worktree 并切换会话

EnterPlanModeTool

进入计划模式(所有工具需审批)

CronCreateTool

定时调度:Cron 表达式 + 一次性/循环任务

ConfigTool

运行时配置 theme/model/voice 等

MCPTool

MCP 工具包装器:Slack、GitHub、Twitter 等外部服务

AskUserQuestionTool

向用户提问并等待回答

RemoteTriggerTool

管理远程代理触发器(CCR)

SleepTool

暂停执行(轮询间隔场景)

八、命令系统

100+ 个斜杠命令(内置 + 插件 + MCP + Skills),支持 local、prompt、jsx 三种类型

命令类型

类型说明示例
local同步/异步函数,返回 LocalCommandResult/compact、/branch
local-jsxReact 组件,交互式 UI 体验/model、/help、/config
prompt发送 Prompt 给 Claude 执行/commit、/review

开发 核心开发命令

/commit安全的 Git 提交(检查 secret、HEREDOC 格式)
/reviewPR 本地代码审查(正确性、规范、安全)
/diff显示会话中的代码变更
/branchGit 分支操作
/compact压缩对话历史
/rewind回退到之前的消息

计划 规划与推理

/plan启用计划模式或查看当前计划
/ultraplan高级扩展计划模式
/tasks管理任务列表
/init8 阶段项目初始化(CLAUDE.md + skills + hooks)

配置 配置与管理

/model选择/切换模型(Opus、Sonnet、Haiku)
/config打开设置配置界面
/theme切换终端主题
/permissions管理工具权限
/hooks配置事件钩子
/keybindings管理键盘快捷键
/memory编辑 CLAUDE.md 记忆文件

扩展 扩展与集成

/plugin管理插件(发现、安装、启用/禁用)
/skills管理自定义技能
/mcp管理 MCP 服务器连接
/agents管理代理配置
/install-github-app10 步安装 GitHub App 集成
/ideIDE 集成(VSCode/JetBrains)
/voice语音输入控制

信息 信息与会话

/help显示所有命令的帮助菜单
/context显示当前 Context 使用和 Token 统计
/cost显示成本信息
/stats会话统计
/login / /logout认证管理
/resume恢复之前的会话
/export导出对话记录
/doctor环境诊断

高级 高级功能

/ultrareview远程 Bug 查找与验证(10-20 分钟)
/session显示远程会话信息 + QR 码
/remote-setup配置远程模式
/sandbox-toggle切换沙箱模式
/upgrade检查/安装升级
/release-notes显示发行说明

九、UI 渲染引擎(Ink)

Claude Code 使用自定义的 React 终端渲染引擎,43 个文件实现了完整的终端 UI 框架

渲染管线

React 组件树 │ ├─ 1. React Reconciler (reconciler.ts) │ └─ 创建 Virtual DOM (DOMElement) │ ├─ 节点类型:Box、Text、Button、Link 等 │ └─ Dirty 追踪优化 │ ├─ 2. Yoga Layout Engine (layout/) │ └─ Flexbox 计算 │ ├─ flex/flexGrow/flexShrink │ ├─ width/height/padding/margin │ └─ 文本换行模式 │ ├─ 3. Renderer (renderer.ts) │ └─ DOM → Output Buffer │ ├─ render-node-to-output.ts │ └─ render-border.ts │ ├─ 4. Screen Buffer (screen.ts) │ └─ Cell-based Grid │ ├─ CellWidth 计算 │ ├─ CharPool / StylePool(内存池化) │ └─ Hyperlink 支持 │ └─ 5. Terminal Output (render-to-screen.ts) └─ ANSI 转义序列 → 终端

核心组件

组件说明
BoxFlex 容器(类似 HTML div)
Text文本渲染 + 样式
ScrollBox可滚动容器 + 滚动 API
Button按钮组件
Link超链接
RawAnsi原始 ANSI 直通
AlternateScreen备用屏幕模式

输入处理

  • 键盘:parse-keypress.ts 解析终端键序列
  • 鼠标:hit-test.ts 处理点击事件
  • 焦点:focus.ts 管理 Tab/Click 焦点
  • 选择:selection.ts 文本选择和复制
  • 事件:Event Dispatcher 分发事件到组件

ANSI 协议支持

  • CSI (Control Sequence Introducer)
  • SGR (Select Graphic Rendition) — 颜色
  • OSC (Operating System Command)
  • DEC 私有模式序列

Ink 框架 Hooks

use-input

键盘输入监听

use-stdin

访问 Stdin 流

use-animation-frame

动画帧计时

use-terminal-size

终端尺寸响应

use-selection

文本选择状态

use-declared-cursor

光标位置管理

十、UI 组件库

113 个 React 组件文件,从布局容器到消息渲染器,构建完整的终端交互界面

核心布局组件

App.tsx顶层包装器(FPS、Stats、AppState 提供者)
FullscreenLayout.tsx主布局(636 行):滚动区、底部固定、模态框、浮层、药丸通知
VirtualMessageList.tsx虚拟滚动消息列表(1081 行)
StatusLine.tsx状态栏:模型、权限、Context、Token、会话信息
MessageResponse.tsx助手回复包装(⎿ 缩进)
Markdown.tsxMarkdown 渲染器

输入组件

PromptInput/复杂输入子系统(8 个文件)
PromptInput.tsx主输入组件
PromptInputFooter.tsx底部栏(建议、模式指示器)
PromptInputHelpMenu.tsx帮助菜单
TextInput.tsx通用文本输入

消息渲染组件 (40+)

类别组件
用户消息UserPromptMessage、UserTextMessage、UserBashInputMessage
助手消息AssistantTextMessage、AssistantThinkingMessage、AssistantRedactedThinkingMessage
工具消息AssistantToolUseMessage
结果消息UserToolSuccessMessage、UserToolErrorMessage、UserToolRejectMessage、UserToolCanceledMessage
系统消息SystemTextMessage、HookProgressMessage、ShutdownMessage、RateLimitMessage
协作消息PlanApprovalMessage、TaskAssignmentMessage、UserAgentNotificationMessage

对话框与任务组件

QuickOpenDialog快速打开/搜索对话框
ExportDialog导出对话框
BackgroundTasksDialog后台任务管理
ShellDetailDialogShell 输出详情
MCPServerApprovalDialogMCP 服务器审批
Settings/设置界面(3 个文件)

组件架构模式

App (Provider 层) └─ FullscreenLayout ├─ VirtualMessageList │ ├─ UserPromptMessage │ ├─ AssistantTextMessage │ ├─ AssistantToolUseMessage │ │ └─ [各工具自定义渲染组件] │ ├─ UserToolSuccessMessage │ └─ CompactBoundaryMessage ├─ PromptInput │ ├─ TextInput │ ├─ PromptInputFooter │ └─ PromptInputHelpMenu ├─ StatusLine ├─ [Dialogs / Modals] └─ [Floating Overlays / Notifications]

十一、React Hooks

83 个自定义 Hook 文件,管理从状态订阅到远程连接的所有副作用

核心状态 Hooks

useAppState订阅 AppState 切片(Selector 模式)
useSettings只读访问设置
useCommandQueue命令排队与处理
useCanUseTool工具权限检查

输入与交互 Hooks

useInput原始终端输入处理
useTextInput文本输入状态管理
useVimInputVim 模式键绑定
usePasteHandler剪贴板粘贴处理
useArrowKeyHistory上下箭头历史导航
useDoublePress双击检测(Ctrl+C/D)
useGlobalKeybindings全局快捷键注册

连接与会话 Hooks

useRemoteSession远程执行会话
useDirectConnect直连配置
useSSHSessionSSH 会话管理
useReplBridgeREPL 协议桥接
useIDEIntegrationIDE 连接集成

任务与通知 Hooks

useTasksV2后台任务状态
useSwarmInitialization多代理 Swarm 初始化
useVoiceIntegration语音输入集成
notifs/12 个通知 Hook(启动、限速、插件更新等)

十二、服务层

20+ 个专业服务,处理 API 通信、Token 管理、MCP 协议、OAuth、语音等

API API 通信服务

services/api/ — 20 个文件

  • claude.ts — Anthropic API 核心通信层
  • client.ts — SDK 客户端初始化与配置
  • withRetry.ts — API 失败重试逻辑
  • errors.ts — 错误处理与转换
  • usage.ts — Token 使用追踪
  • grove.ts — Grove API 集成(Anthropic 内部服务)

压缩 上下文压缩服务

services/compact/ — 11 个文件

  • compact.ts — 主压缩算法
  • autoCompact.ts — 自动触发系统
  • microCompact.ts — 轻量内联压缩
  • sessionMemoryCompact.ts — 持久记忆压缩
  • prompt.ts — 压缩 Prompt 生成

MCP MCP 协议服务

services/mcp/ — 23 个文件

  • MCPConnectionManager.tsx — MCP 生命周期管理
  • client.ts — MCP 客户端实现
  • config.ts — 配置解析与验证
  • channelPermissions.ts — Telegram/Channel 访问控制
  • officialRegistry.ts — 官方 MCP 注册表

其他 其他关键服务

voice.tsPush-to-talk 录音(native + SoX)
voiceStreamSTT.ts流式语音转文字
tokenEstimation.tsToken 计数(多 Provider)
claudeAiLimits.ts限速追踪(5h/7d 窗口)
oauth/OAuth2 流程(GitHub、Google)
lsp/Language Server Protocol
analytics/GrowthBook Feature Flag + Datadog
SessionMemory/会话内记忆注入与检索

十三、状态管理

基于 Zustand 思想的轻量状态管理,单一数据源 + 不可变更新

架构

createStore(getDefaultAppState()) │ ├─ AppStateProvider (React Context) │ ├─ useAppState(selector) → 订阅状态切片 │ └─ useSetAppState() → 不可变更新 │ ├─ onChangeAppState (副作用监听) │ ├─ 同步 CCR/SDK 权限模式 │ ├─ 通知会话元数据变更 │ └─ 应用设置更新 │ └─ selectors (纯函数派生状态) ├─ getViewedTeammateTask() └─ getActiveAgentForInput()

AppState 核心字段

配置

settings, verbose, mainLoopModel, statusLineText

UI 状态

expandedView, isBriefOnly, focusedButtonInDialog

任务管理

tasks (索引), viewingAgentTaskId, selectedIPAgentIndex

消息状态

messages[], unreadCount, dividerIndex

输入状态

promptSuggestion, userInput, promptInputMode

权限

toolPermissionContext, denialTracking

十四、快捷键系统

分层设计:平台默认 → 用户自定义,支持 Chord(组合键序列)

快捷键处理流程

键盘输入 │ ├─ 1. defaultBindings.ts → 平台默认绑定加载 ├─ 2. loadUserBindings.ts → ~/.claude/keybindings.json 合并 ├─ 3. parser.ts → parseKeystroke("ctrl+shift+k") → ParsedKeystroke ├─ 4. KeybindingProviderSetup.tsx → 创建 React Context ├─ 5. 组件通过 useKeybinding 注册处理器 ├─ 6. resolver.ts → 匹配当前 Context 的绑定 └─ 7. 调用匹配的处理器

默认快捷键

Context快捷键功能
GlobalCtrl+C中断当前操作
GlobalCtrl+D退出
GlobalCtrl+L重绘终端
GlobalCtrl+T打开 Todos
GlobalCtrl+R历史搜索
ChatEnter提交输入
ChatEscape取消
ChatCtrl+Shift+K终止所有代理
ChatShift+Tab循环切换模式

支持 Chord 绑定,如 Ctrl+K Ctrl+S(两步组合)。Ctrl+CCtrl+D 为保留键,不可重新绑定。

十五、Bridge 远程模式

31 个文件实现远程控制通信层,支持 Claude Code 作为远程代理运行

Bridge 架构

claude.ai 网页端 │ (WebSocket / HTTP Polling) ▼ Bridge API (bridgeApi.ts) │ ├─ bridgeMain.ts → 主循环 + 会话编排 ├─ bridgeMessaging.ts → 消息序列化/反序列化 ├─ sessionRunner.ts → 子进程代理 Spawn ├─ bridgeUI.ts → 终端状态显示 ├─ jwtUtils.ts → JWT Token 自动刷新 ├─ inboundAttachments.ts → 文件附件处理 ├─ inboundMessages.ts → 入站消息处理 ├─ remotePermissionCallbacks.ts → 远程权限请求 └─ workSecret.ts → 工作分配解码

Spawn 模式

模式说明
single-session单会话模式
worktree隔离 Git Worktree
same-dir同目录模式

十六、MCP 协议集成

Model Context Protocol — 连接外部工具和服务的标准协议

MCP 系统架构

Claude Code │ ├─ MCPConnectionManager (React Context) │ ├─ 管理多个 MCP Server 连接 │ ├─ 重连逻辑 │ └─ 热重载 │ ├─ MCP Client (client.ts) │ ├─ 工具调用委托 │ ├─ 资源读取 │ └─ Prompt/Skill 发现 │ ├─ 权限层 (channelPermissions.ts) │ └─ 每服务器/每工具权限控制 │ └─ 工具集成 ├─ MCPTool → 通用 MCP 工具包装 ├─ ListMcpResources → 列出所有 MCP 资源 └─ ReadMcpResource → 读取特定资源
MCP 的价值:通过 MCP 协议,Claude Code 可以连接 Slack、GitHub、Telegram、Google Calendar、Gmail、数据库、自定义 API 等几乎任何外部服务,实现真正的「万能代理」。每个 MCP Server 可以提供任意数量的工具,动态注入到 Claude 的工具集中。

十七、Skills 与 Plugins

技能是原子化的 Prompt 扩展,插件是多能力集合体

Skills 技能系统

技能来源

  • 内置技能:update-config、keybindings-help 等
  • 本地技能~/.claude/skills/ 目录
  • 市场技能:通过 Plugin 市场安装
  • MCP 技能:从 MCP Server 动态生成

技能定义格式

// BundledSkillDefinition
{
  name: string
  description: string
  hooks?: HookDef[]
  files?: string[]
  // Frontmatter: model, triggers
}

Plugins 插件系统

插件 vs 技能

SkillPlugin
粒度单一 Prompt多能力集合
包含Prompt + 文件Skills + Hooks + MCP Servers
管理/skills/plugin(启用/禁用 UI)
来源本地/内置/MCP内置/市场

格式

{name}@builtin{name}@{marketplace}

十八、核心设计模式

Claude Code 中反复出现的架构设计模式总结

1. AsyncGenerator 流式架构

query.ts 和 QueryEngine.ts 使用 async function* 实现流式输出。每个 Token、每个工具结果都通过 yield 逐步发送给 UI 层,实现实时体验。

async function* query(params) {
  while (shouldContinue) {
    yield* streamAPIResponse()
    yield* executeTools()
  }
}

2. Feature Gate 门控

使用 Bun 的 feature() 系统实现构建时代码消除。不同的构建产物包含不同的功能集。

if (feature('KAIROS')) {
  tools.push(SleepTool, CronCreateTool)
}
if (feature('REPL_TOOL')) {
  tools.push(REPLTool)
}

3. Memoize 缓存模式

context.ts、commands.ts 等使用 memoize 缓存昂贵计算结果,一次计算,全程复用。支持手动失效。

4. Branded Types 品牌类型

SessionId 和 AgentId 使用 TypeScript 品牌类型,编译时防止 ID 混用。

type SessionId = string & { __brand: 'SessionId' }
type AgentId = string & { __brand: 'AgentId' }

5. Provider + Hook 模式

全局状态通过 React Context Provider 注入,组件通过 useXxx Hook 订阅。避免 Prop Drilling。

Provider 层级:AppState → Keybinding → Modal → Notifications → Theme

6. buildTool() 工厂模式

所有工具通过 buildTool() 工厂函数创建,自动补充安全默认值。工具只需实现关心的方法。

7. 懒加载 + 延迟预取

非关键模块使用动态 require() 延迟加载。系统 Prompt、MCP 资源在首次渲染后后台预取。

8. 文件锁并发控制

history.jsonl、config.json 等共享文件使用文件级锁防止竞态条件。

9. Forked Agent 隔离

记忆压缩、摘要生成等操作在子进程中运行,不阻塞主线程。使用 CacheSafeParams 共享 Prompt 缓存。

10. Reactor 错误恢复

query 循环实现多级错误恢复:max_output_tokens 继续 → Reactive Compact → Auto Compact → Stop Hook → 用户通知。

十九、Harness 哲学 —— Claude Code 的灵魂

Anthropic 近期力推的核心理念:Harness(编排层)与模型同等重要。Claude Code 的代码中处处体现了这一设计哲学。

什么是 Harness?

Harness(直译「线束/缰绳」)是包裹在 AI 模型外层的编排运行时。它不是模型本身,而是控制模型行为的一整套机制:

  • 定义模型行为 — System Prompt 就是 Harness 的「宪法」
  • 控制执行权限 — 模型想做什么不重要,Harness 决定它能做什么
  • 拦截和验证 — Hooks 系统在模型推理前后插入确定性检查
  • 管理上下文 — Token 预算、自动压缩、推测执行都是 Harness 职责
  • 隔离实验 — Feature Gate + 消融实验,可以独立衡量 Harness 的价值
源码中的直接证据:代码中 "harness" 一词出现 20+ 次,分布在权限系统、记忆系统、Hints 系统、消融基线、状态管理等核心模块中。这不是事后补充的概念,而是从设计之初就贯穿的架构原则。

Harness 能力全景图

┌─────────────────────────────────────────────────────────────────┐ │ HARNESS 编排层 │ │ │ │ ┌──────────────┐ ┌──────────────┐ ┌──────────────────────┐ │ │ │ System Prompt │ │ Hooks 系统 │ │ Permission 系统 │ │ │ │ 「宪法」 │ │ 10 种事件拦截 │ │ 路径/命令/域名管控 │ │ │ └──────┬───────┘ └──────┬───────┘ └──────────┬───────────┘ │ │ │ │ │ │ │ ┌──────▼───────┐ ┌──────▼───────┐ ┌──────────▼───────────┐ │ │ │ Context 管理 │ │ 工具编排 │ │ Speculation 推测 │ │ │ │ Token 预算 │ │ 并发控制 │ │ 安全沙箱执行 │ │ │ │ 自动压缩 │ │ 执行队列 │ │ Overlay 隔离写入 │ │ │ └──────┬───────┘ └──────┬───────┘ └──────────┬───────────┘ │ │ │ │ │ │ │ ┌──────▼───────┐ ┌──────▼───────┐ ┌──────────▼───────────┐ │ │ │ Memory 系统 │ │ Hints 侧信道 │ │ Feature Gate 门控 │ │ │ │ 目录保证存在 │ │ 工具→Harness │ │ 消融实验基线 │ │ │ │ 结构化验证 │ │ 不污染上下文 │ │ 构建时代码消除 │ │ │ └──────────────┘ └──────────────┘ └──────────────────────┘ │ │ │ │ ▲ │ │ │ 模型通过 API 调用工具 │ │ │ 但 Harness 决定是否执行 │ │ │ │ │ ┌─────────┴─────────┐ │ │ │ Claude 模型 │ │ │ │ (推理引擎) │ │ │ └───────────────────┘ │ └─────────────────────────────────────────────────────────────────┘

1. System Prompt —— Harness 的「宪法」

文件:constants/prompts.ts

System Prompt 不是简单的「你是一个 AI 助手」,而是一份精心编写的行为规范文档,包括:

  • 工具使用优先级(Read 优先于 cat,Edit 优先于 sed)
  • 安全规则(不要引入 XSS/SQL 注入等漏洞)
  • 行为约束(不要过度重构、不要添加多余注释)
  • Git 安全协议(永远不要 amend 除非明确要求)
  • 动态注入的输出风格、记忆文件、Hooks 配置说明
模型的「智能」来自 Claude,但模型的「行为准则」来自 Harness 注入的 System Prompt。同一个模型,不同的 System Prompt = 完全不同的产品行为。

2. Hooks 系统 —— 确定性行为拦截

文件:utils/hooks.ts, query/stopHooks.ts

Hooks 允许用户在模型行为的关键节点注入确定性 Shell 命令

Hook 事件触发时机用途示例
PreToolUse工具执行前阻止危险操作
PostToolUse工具执行后自动格式化代码
Stop轮次结束运行测试验证
PreCompact压缩前保存关键上下文
UserPromptSubmit用户提交输入预处理
SessionStart会话开始环境初始化
PermissionRequest权限检查时自动审批策略
Notification通知触发外部通知转发
关键洞察:Hooks 是确定性的,不依赖模型推理。一个 PostToolUse Hook 配置 prettier --write $FILE,每次文件修改后必然执行格式化,模型无法绕过。

3. Permission 系统 —— 模型能力的硬边界

文件:utils/permissions/filesystem.ts

权限系统定义了模型的硬能力边界,独立于模型的判断:

  • 路径保护.gitconfig.bashrc.ssh/.git/ 等敏感路径硬编码保护
  • Harness 内部路径:会话记忆、计划文件、工具结果目录标记为 harness-controlled,自动放行读取
  • 多级信任:default(逐一审批)→ plan(只读预览)→ acceptEdits(自动批准编辑)→ dontAsk(完全信任)
  • UNC/SSH 路径阻止:防止凭据泄露攻击
// filesystem.ts line 1153
// 7. Allow reads from internal harness paths
//    (session-memory, plans, tool-results)

// filesystem.ts line 1763
// this subtree is harness-controlled.

4. Speculation 推测执行 —— 安全沙箱

文件:services/PromptSuggestion/speculation.ts

Harness 可以在模型不知情的情况下,将执行切换到沙箱模式:

  • 安全工具:只有 Read、Glob、Grep、TaskGet 可执行
  • 写操作隔离:Edit/Write 写入 Overlay 目录(/tmp/speculation/{pid}/
  • 上限控制:最多 20 轮推测、100 条消息
  • 用户决策:接受 → Overlay 合并到真实文件系统;拒绝 → 丢弃
模型不知道自己在推测模式中。它以为在正常执行,但所有写操作都被 Harness 重定向到隔离目录。这就是 Harness 的力量 — 控制执行环境而非控制模型思维。

5. Claude Code Hints —— 带外侧信道

文件:utils/claudeCodeHints.ts

工具可以通过特殊 XML 标签与 Harness 直接通信,不经过模型

// 工具 Stderr 输出
<claude-code-hint v="1" type="plugin" value="name@marketplace" />

// Harness 处理:
// 1. 扫描工具输出中的 hint 标签
// 2. 从输出中剥离(模型看不到)
// 3. 以 UI 提示形式展示给用户

源码注释明确指出:"hints are a harness-only side channel"(hints 是仅 harness 可见的侧信道)

6. Memory 目录保证 —— Harness 基础设施

文件:memdir/memdir.ts

Harness 保证记忆目录始终存在,模型无需检查:

// memdir.ts line 114
// Harness guarantees the directory exists
// via ensureMemoryDirExists().
// The model can write directly without mkdir.

这意味着 System Prompt 可以告诉模型「直接写入,不要运行 mkdir」,因为 Harness 已经在启动时创建好了目录。这是一个微小但典型的 Harness-Model 协作模式:Harness 处理基础设施,模型专注推理

7. 消融实验基线 —— 衡量 Harness 的独立价值

文件:entrypoints/cli.tsx line 16

// Harness-science L0 ablation baseline.
if (feature('ABLATION_BASELINE') &&
    process.env.CLAUDE_CODE_ABLATION_BASELINE) {
  // 关闭所有 Harness 增强功能:
  // CLAUDE_CODE_SIMPLE       → 简化 System Prompt
  // DISABLE_THINKING         → 关闭 Extended Thinking
  // DISABLE_COMPACT          → 关闭自动压缩
  // DISABLE_INTERLEAVED_THINKING → 关闭交错思维
  // ...
}
这是 Harness 哲学的终极体现:Anthropic 通过消融实验独立衡量 Harness 各组件的贡献。关闭压缩、关闭思维模式、简化 Prompt — 观察性能下降多少。这证明了 Harness 不是附属品,而是与模型同等重要的性能来源。

8. 工具编排 —— 模型请求,Harness 决策

文件:services/tools/toolOrchestration.ts

模型通过 API 发出工具调用请求,但Harness 控制实际执行

  • 并发分区:只读工具可并行,写入工具串行
  • 权限拦截canUseTool() 在执行前检查,可阻止
  • 超时管理:Bash 命令 15 秒后自动后台化
  • 中止信号:AbortController 可以随时终止所有进行中的工具
  • 结果大小控制:超过 maxResultSizeChars 自动持久化到磁盘

Harness 价值对照表

Harness 能力代码实现没有它会怎样?
定义行为规范System Prompt 宪法模型行为不一致,违反安全策略
强制安全边界Permission Rules + 危险路径列表模型可能误写 .bashrc 或 SSH 密钥
确定性拦截10 种 Hook 事件无法在模型之外强制执行策略
上下文管理Token 预算 + 自动压缩 + 推测沙箱上下文爆炸、未验证的状态变更
验证输出Post-sampling hooks + Stop hooks无法拒绝或修改模型的不良输出
状态保证Memory 目录 + Temp 隔离 + Overlay文件系统混乱、状态损坏
工具安全并发工具编排 + 并发分区竞态条件、不安全的并行执行
独立评估Feature Gate + 消融基线无法区分模型改进 vs Harness 改进
用户可配置settings.json + Hooks + PermissionsHarness 是黑盒,团队无法定制策略
带外通信Claude Code Hints 侧信道工具无法直接与 Harness 通信
总结:Harness 是 Claude Code 的「第二个大脑」。

Claude 模型提供推理能力,而 Harness 提供执行纪律。一个没有 Harness 的 Claude 就像一个没有操作系统的 CPU — 能力强大但无法安全运行。 Claude Code 的源码证明了 Anthropic 的核心论点:构建优秀的 AI 代理,模型只是一半,Harness 是另一半。 消融实验的存在(ABLATION_BASELINE)更是直接证据 — Anthropic 把 Harness 的价值当作可量化的科学指标来追踪。

总结:Claude Code 全景图

一张图看懂 Claude Code 的完整架构

┌─────────────────────────────────────────────────────────────────────┐ │ 用户终端 (Terminal) │ │ ┌──────────┐ ┌──────────────┐ ┌──────────┐ ┌───────────────┐ │ │ │ 键盘输入 │ │ 快捷键系统 │ │ 鼠标事件 │ │ 语音输入 │ │ │ └────┬─────┘ └──────┬───────┘ └────┬─────┘ └──────┬────────┘ │ │ └───────────────┼───────────────┘ │ │ │ ▼ ▼ │ │ ┌─────────────────────────────────────────────────────────────┐ │ │ │ Ink 渲染引擎 (96 Files) │ │ │ │ React Reconciler → Yoga Layout → Screen Buffer → ANSI Out │ │ │ └─────────────────────────────┬───────────────────────────────┘ │ └────────────────────────────────┼──────────────────────────────────┘ │ ┌────────────────────────────────▼──────────────────────────────────┐ │ UI 组件层 (113) │ │ App → FullscreenLayout → VirtualMessageList + PromptInput │ │ Messages (40+) │ Dialogs │ Tasks │ Settings │ StatusLine │ └────────────────────────────────┬──────────────────────────────────┘ │ ┌────────────────────────────────▼──────────────────────────────────┐ │ Hooks 层 (83) │ │ useAppState │ useInput │ useKeybinding │ useCanUseTool │ │ useRemoteSession │ useTasksV2 │ useVoice │ notifs/ │ └────────────────────────────────┬──────────────────────────────────┘ │ ┌────────────────────────────────▼──────────────────────────────────┐ │ 状态管理 (AppState) │ │ Store (createStore) → Provider → Selectors → onChange Listeners │ └───────────┬────────────────────┬──────────────────┬───────────────┘ │ │ │ ┌───────────▼────────┐ ┌────────▼────────┐ ┌──────▼──────────────┐ │ 命令系统 (100+) │ │ Query 引擎 │ │ 工具系统 (40) │ │ /commit /review │ │ QueryEngine.ts │ │ Bash Read Edit Grep │ │ /model /help │ │ ↓ │ │ Agent Skill LSP │ │ /init /plugin │ │ query.ts │ │ WebSearch Cron MCP │ │ local|prompt|jsx │ │ 多轮 Agentic │ │ 权限 + Schema + UI │ └────────────────────┘ │ Loop │ └──────┬──────────────┘ └────────┬─────────┘ │ │ │ ┌───────────────────────────────▼──────────────────▼────────────────┐ │ 服务层 (20+) │ │ ┌─────────┐ ┌──────┐ ┌──────┐ ┌───────┐ ┌──────┐ ┌───────────┐ │ │ │ API 通信 │ │ 压缩 │ │ MCP │ │ OAuth │ │ 语音 │ │ Token 估算 │ │ │ └─────────┘ └──────┘ └──────┘ └───────┘ └──────┘ └───────────┘ │ │ ┌─────────┐ ┌──────┐ ┌──────┐ ┌───────┐ ┌──────┐ ┌───────────┐ │ │ │ LSP │ │ 分析 │ │ 限速 │ │ 记忆 │ │ 插件 │ │ Bridge │ │ │ └─────────┘ └──────┘ └──────┘ └───────┘ └──────┘ └───────────┘ │ └───────────────────────────────┬───────────────────────────────────┘ │ ┌───────────────────────────────▼───────────────────────────────────┐ │ 基础设施层 │ │ 298 Utils │ Constants │ Types │ Feature Flags │ Config │ History │ └───────────────────────────────────────────────────────────────────┘ │ ┌───────────────┼───────────────┐ ▼ ▼ ▼ ┌───────────┐ ┌───────────┐ ┌────────────┐ │ Claude API │ │ MCP Server│ │ 文件系统 │ │ (Anthropic)│ │(外部服务) │ │ (Git/Disk) │ └───────────┘ └───────────┘ └────────────┘
Claude Code 是一个令人印象深刻的工程作品: 它在终端环境下实现了完整的 React 渲染引擎、流式 AI 对话循环、45+ 工具的统一权限管控、多代理协作、MCP 外部服务集成、上下文自动压缩等企业级能力。 整个系统通过 Feature Gate 实现灵活的构建配置,通过 AsyncGenerator 实现流式体验,通过 Branded Types 保证类型安全,通过 Provider + Hook 模式管理复杂状态。 这不仅是一个 AI CLI 工具,更是一个完整的 AI 代理运行时平台。