1. 项目总览与架构地图
所属分组:架构总览
概述
本系列文章聚焦于对 Claude Code 源码的解读。Claude Code 是 Anthropic 推出的一款基于终端的 AI 编程助手 CLI 工具,它将大语言模型能力深度嵌入到开发者的命令行工作流中,支持交互式 REPL、非交互式 -p 打印模式、子命令(mcp/plugin/auth 等)以及远程控制(bridge)等多种运行形态。
理解它的整体架构,是深入后续启动流程、模块依赖、CLI 集成与构建特性开关等主题的基础。本篇将从顶层目录划分、技术栈选型、核心抽象(Tool/Command/Context)以及模块关系总览四个维度,绘制一份"架构地图",帮助读者建立全局心智模型。
本篇文章的代码引用基于 restored-src/src/ 目录下的真实源码,所有链接均为本地文件绝对路径。
源码位置
- 入口主文件:main.tsx(file:///e:/2026plan/AI_Lab/claude-code-sourcemap-main/restored-src/src/main.tsx)
- CLI 引导入口:entrypoints/cli.tsx(file:///e:/2026plan/AI_Lab/claude-code-sourcemap-main/restored-src/src/entrypoints/cli.tsx)
- 初始化逻辑:entrypoints/init.ts(file:///e:/2026plan/AI_Lab/claude-code-sourcemap-main/restored-src/src/entrypoints/init.ts)
- 工具抽象:Tool.ts(file:///e:/2026plan/AI_Lab/claude-code-sourcemap-main/restored-src/src/Tool.ts)
- 工具集合:tools.ts(file:///e:/2026plan/AI_Lab/claude-code-sourcemap-main/restored-src/src/tools.ts)
- 命令集合:commands.ts(file:///e:/2026plan/AI_Lab/claude-code-sourcemap-main/restored-src/src/commands.ts)
- 上下文构建:context.ts(file:///e:/2026plan/AI_Lab/claude-code-sourcemap-main/restored-src/src/context.ts)
- 全局状态:bootstrap/state.ts(file:///e:/2026plan/AI_Lab/claude-code-sourcemap-main/restored-src/src/bootstrap/state.ts)
核心实现分析
顶层目录划分
src/ 目录按职责清晰分层。通过目录列表可以归纳出几个核心域:
- 入口层 :
entrypoints/(cli.tsx、init.ts、mcp.ts)负责引导与快速路径分发;main.tsx是完整 CLI 主程序。 - 核心抽象层 :根目录下的
Tool.ts、tools.ts、commands.ts、context.ts、query.ts、QueryEngine.ts、Task.ts定义了工具、命令、对话上下文与查询引擎等核心抽象。 - 工具实现层 :
tools/目录按每个工具一个子目录(如BashTool/、FileEditTool/、AgentTool/)组织,每个工具包含UI.tsx(Ink 渲染)与prompt.ts(模型提示)。 - 命令实现层 :
commands/目录按每个斜杠命令一个子目录组织(如clear/、config/、mcp/、resume/),每个命令通过index.ts导出注册元数据。 - 服务层 :
services/聚合外部能力适配,包括api/、mcp/、oauth/、lsp/、analytics/、compact/等。 - UI/渲染层 :
components/、screens/、ink/提供 React + Ink 的终端渲染能力,其中ink/是一份自带的 Ink 渲染器实现(含 yoga 布局、ANSI 解析等)。 - 基础设施层 :
utils/(极其庞大,含 bash 解析、权限、配置、git、settings、plugins 等)、bootstrap/、state/、hooks/、constants/、types/、schemas/。 - 可选/实验性域 :
coordinator/(COORDINATOR_MODE)、assistant/(KAIROS)、bridge/(远程控制)、buddy/、daemon/等,均通过 feature flag 条件加载。
技术栈选型
从 main.tsx 的导入可以看出技术栈组合:
ts
import { feature } from 'bun:bundle';
import { Command as CommanderCommand, InvalidArgumentError, Option } from '@commander-js/extra-typings';
import chalk from 'chalk';
import React from 'react';
- 语言 :TypeScript,大量使用
import type与zod做类型与 schema 校验。 - 运行时 :Bun(通过
bun:bundle的feature()做构建期 dead code elimination),同时兼容 Node.js(isRunningWithBun()检测)。 - CLI 框架 :
@commander-js/extra-typings,提供类型安全的命令解析。 - 终端 UI :React + Ink(项目内嵌一份
ink/实现以支持自定义布局、命中测试、ANSI 解析等)。 - 样式 :
chalk用于颜色输出。 - 工具库 :
lodash-es(memoize、uniqBy、pickBy 等)。
核心抽象:Tool 与 Tools
Tool.ts 定义了工具系统的核心类型抽象。它从 Anthropic SDK、MCP SDK、zod 等引入类型,并将权限、进度、消息等类型集中再导出,专门用于"打破循环依赖"------注释中明确写道:
ts
// Import permission types from centralized location to break import cycles
// Import PermissionResult from centralized location to break import cycles
import type {
AdditionalWorkingDirectory,
PermissionMode,
PermissionResult,
} from './types/permissions.js'
ToolInputJSONSchema 是工具输入参数的 JSON Schema 类型,ValidationResult、QueryChainTracking 等则描述了工具校验与链式调用追踪。tools.ts 在此基础上聚合所有具体工具实现:
ts
export const getTools = (permissionContext: ToolPermissionContext): Tools => {
// Simple mode: only Bash, Read, and Edit tools
if (isEnvTruthy(process.env.CLAUDE_CODE_SIMPLE)) {
...
return filterToolsByDenyRules(simpleTools, permissionContext)
}
...
}
getTools 是工具池的单一组装入口,会根据 CLAUDE_CODE_SIMPLE(--bare 模式)、REPL 模式、coordinator 模式、权限拒绝规则等条件动态拼装出可用工具集合。大量工具通过 feature() 条件 require 引入,实现按构建产物裁剪。
核心抽象:Command 与 Context
commands.ts 聚合了所有斜杠命令(/clear、/config、/mcp、/resume 等),同样大量使用 feature flag 条件加载:
ts
const bridge = feature('BRIDGE_MODE')
? require('./commands/bridge/index.js').default
: null
const assistantCommand = feature('KAIROS')
? require('./commands/assistant/index.js').default
: null
context.ts 负责构建发送给模型的系统上下文。getSystemContext 与 getGitStatus 都用 memoize 缓存,避免重复执行 git 子进程。值得注意的是 getGitStatus 在执行前会显式判断 NODE_ENV === 'test' 跳过,避免测试环境下的循环:
ts
export const getGitStatus = memoize(async (): Promise<string | null> => {
if (process.env.NODE_ENV === 'test') {
return null
}
...
})
全局状态与启动检查点
bootstrap/state.ts 是全局可变状态的集中存放点,文件顶部明确警告 DO NOT ADD MORE STATE HERE - BE JUDICIOUS WITH GLOBAL STATE。State 类型包含 cwd、projectRoot、模型覆盖、会话 ID、telemetry 计数器、agent 颜色映射等几十个字段,是跨模块共享运行时状态的中枢。
main.tsx 顶部还有一段精心设计的"启动副作用"序列,用于将耗时子进程与后续 import 重叠:
ts
// 1. profileCheckpoint marks entry before heavy module evaluation begins
// 2. startMdmRawRead fires MDM subprocesses (plutil/reg query)
// 3. startKeychainPrefetch fires both macOS keychain reads in parallel
profileCheckpoint('main_tsx_entry');
startMdmRawRead();
startKeychainPrefetch();
这些副作用必须在所有其他 import 之前执行,以便在 ~135ms 的 import 加载期间并行完成 MDM 与 keychain 读取。
关键设计要点
- 分层清晰:入口层、核心抽象层、实现层、服务层、基础设施层职责分明,便于按域阅读。
- 类型集中化以破环 :
Tool.ts与types/目录把跨模块共享类型集中再导出,主动打破循环依赖。 - 工具/命令同构 :每个工具、每个命令都是一个独立子目录,包含
index.ts注册元数据 + 业务实现,扩展一致。 - 构建期裁剪 :通过
bun:bundle的feature()+ 条件require,让未启用的特性在打包阶段就被 dead code elimination 移除。 - 启动性能优先 :顶层副作用、
profileCheckpoint、memoize缓存、并行 prefetch 等手段贯穿始终,体现 CLI 工具对冷启动延迟的敏感。
与其他模块的关系
本篇是全局视角,几乎所有后续模块都从 main.tsx 这个汇聚点辐射出去:entrypoints/ 触发 main();tools.ts/commands.ts 为 REPL 与 QueryEngine 提供能力;context.ts 为模型请求提供系统上下文;bootstrap/state.ts 为全模块提供共享状态;services/、utils/ 是被各层调用的能力底座。后续四篇将分别从启动流程、模块依赖、CLI 集成、构建特性四个角度深入这些关系。
小结
Claude Code 是一个以 TypeScript + React + Ink + Commander + Bun 构建的终端 AI 编程 CLI,架构上以 main.tsx 为核心枢纽,向下分层组织工具、命令、服务与基础设施,通过类型集中化与构建期 feature flag 双重手段管理复杂度与产物体积。掌握这张架构地图后,即可带着清晰的坐标系进入后续各篇的细节解读。