职责概述

本页呈现 Claude Code 的完整模块依赖关系。通过对顶层 .ts/.tsx 文件的 import 语句和各子目录的交叉引用分析,构建出从入口到底层的全栈依赖图。系统按六层架构组织:入口层(main.tsx / setup.ts)、编排层(QueryEngine.ts / query.ts)、工具层(tools/)、服务层(services/)、工具库层(utils/)、原生层(native-ts/)。依赖方向严格自上而下,跨层调用通过明确接口解耦。

分层依赖架构

L1 入口层 (entrypoints/)
main.tsx
cli.tsx
init.ts
mcp.ts
sdk/coreTypes.ts
L2 编排层
QueryEngine.ts
query.ts
setup.ts
cost-tracker.ts
L3 工具 + 命令层
tools.ts → Tool.ts
Task.ts → tasks.ts
commands.ts
context.ts
L4 服务层 (services/)
services/api/ — API 客户端
services/mcp/ — MCP 协议
services/compact/ — 上下文压缩
services/analytics/ — 分析上报
services/SessionMemory/
L5 工具库层 (utils/)
utils/telemetry/
utils/git/ · utils/shell/ · utils/bash/
utils/hooks/ · utils/swarm/
utils/computerUse/ · utils/claudeInChrome/
utils/deepLink/ · utils/secureStorage/
utils/model/ · utils/task/ · utils/background/
L6 原生与桥接层
native-ts/ (yoga-layout · color-diff · file-index)
upstreamproxy/ · bridge/
bootstrap/state.ts — 全局状态单例

模块依赖网格

以下网格展示了主要模块之间的直接依赖关系。每行是一个模块,deps 列出其直接依赖。

main.tsx
setup.ts commands.ts bootstrap/state.ts utils/startupProfiler utils/secureStorage utils/settings/mdm utils/auth
setup.ts
QueryEngine.ts utils/cwd utils/releaseNotes utils/Shell utils/sinks services/SessionMemory utils/auth
QueryEngine.ts
query.ts tools.ts context.ts services/api/claude services/compact services/contextCollapse utils/systemPromptType Tool.ts
query.ts
tools.ts Tool.ts services/api services/compact utils/telemetry/sessionTracing utils/hooks commands.ts context.ts cost-tracker.ts
tools.ts
Tool.ts tools/AgentTool tools/BashTool tools/FileEditTool tools/FileReadTool tools/FileWriteTool tools/GlobTool tools/WebFetchTool tools/SkillTool tools/REPLTool (ant)
Tool.ts
services/mcp/types hooks/useCanUseTool services/api/withRetry
Task.ts / tasks.ts
tasks/LocalAgentTask tasks/LocalShellTask tasks/RemoteAgentTask tasks/DreamTask utils/task/diskOutput tasks/LocalWorkflowTask (feature)
commands.ts
commands/commit commands/compact commands/config commands/doctor commands/login commands/memory commands/init ~30+ 命令模块
context.ts
utils/claudemd bootstrap/state utils/git utils/envUtils
utils/telemetry/
services/analytics utils/envUtils bootstrap/state utils/teammate @opentelemetry/* (6 个包)
utils/computerUse/
@ant/computer-use-mcp @ant/computer-use-input @ant/computer-use-swift services/mcp/normalization services/analytics
utils/swarm/
bootstrap/state utils/bash/shellQuote utils/bundledMode utils/permissions utils/swarm/backends/
bridge/
utils/auth utils/config bootstrap/state axios

跨层依赖关系图

L1 入口
L2 编排
L3 工具
L4 服务
L5 工具库
L6 原生
跨层调用说明:
L1 → L3: main.tsx 直接 import tools.ts(工具注册)
L2 → L4: QueryEngine 调用 services/api(API 客户端)
L3 → L5: 工具实现使用 utils/bash、utils/shell、utils/git 等
L4 → L6: services/compact 使用 native-ts/yoga-layout;services/api 使用 upstreamproxy
L5 → L6: utils/shell 使用 native-ts/color-diff;UI 使用 native-ts/file-index
bootstrap/state.ts 是全局状态单例,被 L2-L5 所有层依赖(依赖方向标记为垂直贯穿)

循环依赖

已知的循环依赖路径:
query.tscommands.tsquery.ts(query 调用 slash command,slash command 可能触发新 query)
缓解策略: 通过动态 import 和 getAllTasks() / getCommands() 工厂函数延迟求值,避免模块加载时循环。TypeScript 的 import type 也用于打断循环——只导入类型不导入值。

关键类型与接口

全局状态单例 (bootstrap/state.ts)

// bootstrap/state.ts 被所有层依赖的核心状态
// 以下是被广泛 import 的函数签名:
export function getSessionId(): string
export function getCwd(): string
export function setCwd(cwd: string): void
export function getProjectRoot(): string | undefined
export function getModelUsage(): ModelUsage
export function getTokenCounter(): number
export function getCostCounter(): number
export function getMainLoopModelOverride(): string | undefined
export function getInlinePlugins(): string[]
export function getSessionBypassPermissionsMode(): boolean
export function isSessionPersistenceDisabled(): boolean
// ... 40+ getter/setter 函数

Feature Gate 模式 (bun:bundle)

// 死代码消除模式 — 外部构建时 feature() 返回 false,整个代码块被移除
import { feature } from 'bun:bundle'

const REPLTool = process.env.USER_TYPE === 'ant'
  ? require('./tools/REPLTool/REPLTool.js').REPLTool
  : null

// 或使用 feature() gate:
const reactiveCompact = feature('REACTIVE_COMPACT')
  ? require('./services/compact/reactiveCompact.js')
  : null

设计模式与亮点

1. 工厂函数打破循环

tools.ts 导出的 getAllTools()tasks.tsgetAllTasks()commands.tsgetCommands() 都使用函数而非顶层常量。这避免了模块加载时的循环求值问题——调用者只在需要时才调用工厂函数获取列表。

2. Feature Gate 二进制剔除

通过 bun:bundlefeature() 函数和 process.env.USER_TYPE === 'ant' 条件,外部构建可以从二进制中完全移除 Ant 专用代码(REPLTool、Perfetto、reactiveCompact 等)。这是一种编译时多态——同一份源码产出不同功能的二进制。

3. 懒加载重模块

OTLP 导出器(@opentelemetry/exporter-*-otlp-*)、@grpc/grpc-js、highlight.js 等重型依赖都使用动态 import() 按需加载。instrumentation.ts 中的注释明确指出:"静态导入会加载全部 6 个导出器 (~1.2MB) 到每次启动"。

4. bootstrap/state.ts 作为依赖注入容器

全局状态不使用 class 单例或全局变量,而是通过 bootstrap/state.ts 导出的 40+ getter/setter 函数。这个文件充当轻量级 DI 容器——所有层都通过这些函数访问共享状态,而非直接引用变量。这使得测试时可以通过 setter 替换状态。

开发者实践指南

添加新工具的依赖路径

  1. tools/ 下创建新工具文件(如 tools/MyTool/MyTool.ts
  2. 实现 Tool 接口(Tool.ts 中的 type)
  3. tools.tsgetAllTools() 中添加 import 和注册
  4. 如果工具依赖 utils/ 中的模块,确保依赖方向向下(L3 → L5)
  5. 如果工具是 Ant 专用,使用 feature()USER_TYPE 门控

添加新命令的依赖路径

  1. commands/ 下创建命令文件
  2. commands.ts 中 import 并注册
  3. 命令可直接调用 L2(query.ts)或 L4(services/)的函数
依赖方向检查规则: 确保 import 箭头始终指向更低的层。L1 可以依赖 L2-L6,L2 可以依赖 L3-L6,以此类推。向上依赖(如 L5 直接 import L2)是架构违规的信号。

架构师决策指南

依赖管理策略

Claude Code 采用扁平模块结构(无深层嵌套的 namespace),依赖方向通过约定而非编译器强制。关键保障机制:

包体积优化

通过 Bun 的 feature() 死代码消除 + 动态 import() 懒加载,外部构建的二进制体积显著小于 Ant 构建。最重的依赖链路是 OTel(@opentelemetry/* 6 个包),仅在 CLAUDE_CODE_ENABLE_TELEMETRY=1 时激活导出器。

可扩展性评估

代码索引

文件/目录说明
main.tsxL1CLI 入口:参数解析、命令注册、启动初始化
entrypoints/cli.tsxL1CLI 入口点配置
entrypoints/init.tsL1运行时初始化:遥测、配置、MDM
entrypoints/mcp.tsL1MCP 子进程入口
setup.tsL2会话设置:CWD、项目根、内存初始化
QueryEngine.tsL2查询编排:API 调用、工具调度、上下文压缩
query.tsL2查询核心循环:消息构建、API 请求、工具调用
tools.tsL3工具注册表:getAllTools() 工厂
Tool.tsL3Tool 接口定义与 findToolByName
Task.ts / tasks.tsL3任务类型与注册表
commands.tsL3斜杠命令注册表(30+ 命令)
context.tsL3系统提示词构建:claudemd、git 状态
cost-tracker.tsL2成本追踪与统计
services/L4API 客户端、MCP、压缩、分析、会话记忆
utils/L520+ 工具库模块(见外部集成页)
native-ts/L6yoga-layout、color-diff、file-index
upstreamproxy/L6CCR 代理中继
bridge/L6远程会话桥接(20+ 文件)
bootstrap/state.tsL6全局状态单例(40+ getter/setter)
vim/L5Vim 模式状态机(5 文件)
buddy/L5Companion 陪伴角色
assistant/L5助手会话历史
memdir/L5内存文件目录管理
moreright/L5useMoreRight hook