Files
Claude-Code-Compiled/docs/ARCHITECTURE.md
Roger e627a9388d restructure: move docs to docs/, rewrite README in English
- Move all .md documentation into docs/ directory
- Rewrite README.md with English documentation covering:
  - All 22 missing source stubs added
  - Source code fixes (useEffectEvent, version check, auth, sandbox-runtime)
  - Bun compatibility shims (macro, bun-bundle)
  - 28 missing npm dependencies
  - Build and run instructions
- Remove dist/ from tracking (users compile themselves)
2026-04-01 07:41:38 +08:00

494 lines
17 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Claude Code — 架构全景
> 项目规模:~1,900 源文件512,000+ 行 TypeScript/TSX
> 运行时Bun | 终端 UIReact + Ink (自定义渲染器) | CLICommander.js
---
## 1. 整体架构分层
```
┌─────────────────────────────────────────────────────────┐
│ CLI 入口 (main.tsx) │
│ Commander.js 参数解析 → 会话初始化 → 渲染上下文 │
├─────────────────────────────────────────────────────────┤
│ REPL 屏幕 (REPL.tsx) │
│ 主交互循环:用户输入 → LLM 查询 → 工具执行 → UI 渲染 │
├──────────┬──────────┬──────────┬────────────────────────┤
│ Commands │ Tools │ Services │ Bridge/Remote │
│ (斜杠命令)│ (工具系统)│ (服务层) │ (IDE/远程集成) │
├──────────┴──────────┴──────────┴────────────────────────┤
│ State Management │
│ Zustand store + onChangeAppState + hooks │
├─────────────────────────────────────────────────────────┤
│ Ink 渲染器 (ink/) │
│ 自定义 React 渲染器 → 终端 ANSI 输出 │
├─────────────────────────────────────────────────────────┤
│ 组件层 (components/) │
│ 346 个 React 组件:消息渲染、权限对话框、导航等 │
├─────────────────────────────────────────────────────────┤
│ Hooks 层 (hooks/) │
│ 104 个自定义 hooks输入处理、权限、IDE集成、通知等 │
├─────────────────────────────────────────────────────────┤
│ 工具函数层 (utils/) │
│ ~300 个工具文件git、shell、权限、插件、模型等 │
└─────────────────────────────────────────────────────────┘
```
---
## 2. 入口与初始化流程
### main.tsx (4,683 行)
程序的唯一入口。初始化顺序:
```
1. 启动优化profileCheckpoint + MDM 子进程 + Keychain 预取 (并行)
2. 导入权重模块 (~135ms)
3. 检测调试模式 → 拦截调试器
4. main() 函数:
├─ 安全设置 (Windows PATH 安全)
├─ URL 处理 (cc://, deep link, SSH, assistant)
├─ 检测 -p/--print (非交互模式) vs 交互模式
├─ Commander.js 程序定义 (~100 个 CLI 选项)
├─ preAction hook:
│ ├─ init() - 配置、认证、特性开关初始化
│ ├─ 运行迁移 (11 个版本迁移)
│ ├─ 加载远程管理设置
│ └─ 加载策略限制
└─ 主命令 action:
├─ initializeToolPermissionContext()
├─ setup() - 工作目录、工作树
├─ getCommands() + getAgentDefinitions() (并行)
├─ showSetupScreens() - 信任对话框、OAuth、引导
├─ MCP 配置加载和连接
├─ 构建初始 AppState
└─ 分支:
├─ --continue → 加载最近对话 → launchRepl()
├─ --resume <id> → 恢复指定会话 → launchRepl()
├─ --teleport → 远程恢复 → launchRepl()
├─ --remote → 远程会话 → launchRepl()
├─ -p/--print → runHeadless() (非交互)
└─ 默认 → launchRepl() (新会话)
```
### 初始化优化策略
- **并行预取**MDM 读取、Keychain 读取、API 预连接在导入前并行启动
- **延迟加载**OpenTelemetry (~400KB)、gRPC (~700KB) 等通过 `import()` 延迟
- **Feature Flag 死码消除**`bun:bundle``feature()` 在构建时裁剪未启用的功能
- **Memoize 缓存**`getCommands()``getTools()` 等昂贵操作通过 lodash memoize 缓存
### Feature Flags (关键)
| Flag | 功能 |
|------|------|
| `PROACTIVE` / `KAIROS` | 主动模式 / 助手模式 |
| `BRIDGE_MODE` | 远程控制 (Remote Control) |
| `DIRECT_CONNECT` | cc:// URL 直连 |
| `SSH_REMOTE` | SSH 远程会话 |
| `COORDINATOR_MODE` | 多 Agent 协调模式 |
| `TRANSCRIPT_CLASSIFIER` | 自动模式 (auto-mode) |
| `VOICE_MODE` | 语音输入 |
| `AGENT_TRIGGERS` | Cron 定时触发 |
| `WORKFLOW_SCRIPTS` | 工作流脚本 |
| `TERMINAL_PANEL` | 终端面板捕获 |
| `WEB_BROWSER_TOOL` | 内嵌浏览器 |
---
## 3. REPL 交互循环 (REPL.tsx, 5,005 行)
核心交互界面。数据流:
```
用户输入 (PromptInput)
├─ /命令 → processSlashCommand() → 命令处理
└─ 普通文本 → processUserInput()
├─ fetchSystemPromptParts() → 系统提示
├─ loadMemoryPrompt() → 记忆
├─ buildEffectiveSystemPrompt() → 合成最终系统提示
└─ query() [QueryEngine.ts, 1,295 行]
├─ API 调用 (Anthropic SDK, 流式)
├─ 思考模式 (thinking config)
├─ Token 预算管理
└─ 工具调用循环:
├─ 工具使用块 → 权限检查
│ ├─ 通过 → 执行工具
│ └─ 拒绝 → 提示用户批准/拒绝
└─ 继续 API 调用直到完成
```
### QueryEngine.ts 核心职责
1. 构建 API 请求(消息、系统提示、工具定义)
2. 处理流式响应thinking、工具使用、文本
3. Token 计数和预算管理
4. 重试逻辑和错误处理
5. 紧凑/压缩触发
6. 副本记录 (transcript recording)
---
## 4. 状态管理
### AppStateStore.ts (569 行)
使用自定义的 `createStore()` 实现(非 Redux非 Zustand类型安全。
核心状态字段:
```typescript
AppState {
// 核心
verbose: boolean
mainLoopModel: ModelSetting
toolPermissionContext: ToolPermissionContext
isBriefOnly: boolean
// MCP
mcp: { clients, tools, commands, resources }
// 插件
plugins: { enabled, disabled, commands, errors }
// 远程控制
replBridgeEnabled: boolean
replBridgeConnected: boolean
// 任务
tasks: Record<string, TaskState>
todos: Record<string, TodoList>
// 团队
teamContext: TeamContext
// 通知
notifications: { current, queue }
// 会话
inbox: { messages }
speculation: SpeculationState
attribution: AttributionState
sessionHooks: Map
}
```
### onChangeAppState
状态变更时触发的副作用集合。`store.setState()` 后会执行 `onChangeAppState` 中注册的所有回调。
---
## 5. 工具系统 (tools/, 42 个工具)
### 工具接口 (Tool.ts, 792 行)
每个工具实现 `Tool` 接口:
```typescript
Tool {
name: string // 工具名称
description: string // 描述 (用于系统提示)
inputSchema: JSONSchema // 输入 JSON Schema
userFacingName(): string // 用户显示名
isEnabled(): boolean // 是否启用
needsPermissions(input): boolean // 是否需要权限
call(input, context): Result // 执行函数
renderToolUseMessage(input): UI // UI 渲染
renderToolResultMessage(): UI // 结果渲染
}
```
### 核心工具分类
**文件操作**: FileReadTool, FileEditTool, FileWriteTool, GlobTool, GrepTool
**执行**: BashTool, PowerShellTool (Windows)
**AI**: AgentTool (子 Agent), SkillTool (技能执行)
**外部**: WebFetchTool, WebSearchTool
**MCP**: MCPTool, ListMcpResourcesTool, ReadMcpResourceTool
**规划**: EnterPlanModeTool, ExitPlanModeV2Tool
**任务**: TaskCreateTool, TaskGetTool, TaskUpdateTool, TaskListTool, TaskStopTool
**团队**: TeamCreateTool, TeamDeleteTool, SendMessageTool
**其他**: TodoWriteTool, BriefTool, AskUserQuestionTool, ConfigTool
### 工具执行流程
```
1. QueryEngine 产出 ToolUseBlock
2. useCanUseTool hook → 权限检查
3. 工具 handler 执行
4. 结果 → ToolResultBlock → 回到 QueryEngine
```
### 权限系统
`ToolPermissionContext` 定义权限模式:
- `default` — 每次询问用户
- `plan` — 只读,编辑需批准
- `bypassPermissions` — 跳过所有检查(危险)
- `auto` — 基于分类器自动决策
权限规则通过 `PermissionRule` 配置,支持 allow/deny 规则匹配。
---
## 6. 命令系统 (commands/, 80+ 命令)
### 命令类型
- **`prompt` 型** — 扩展为文本发送给 LLM`/commit`
- **`local` 型** — 本地执行并显示结果(如 `/cost`
- **`local-jsx` 型** — 渲染 JSX UI`/config`
### 命令来源
1. **内置命令**`commands.ts` 中的 `COMMANDS()` (memoize)
2. **技能命令**`skills/` 目录中的 `.md` 文件
3. **插件命令** — 插件注册的命令
4. **Bundled 技能**`skills/bundled/` 中的内置技能
5. **MCP 命令** — MCP 服务器提供的 prompt 资源
### 加载优先级
```
Bundled Skills → Plugin Skills → Skill Dir → Workflows → Plugin Commands → Built-in
```
---
## 7. 服务层 (services/)
### 核心服务
| 服务 | 职责 |
|------|------|
| `api/` | Anthropic API 客户端、使用量跟踪、bootstrap |
| `mcp/` | MCP 协议:服务器连接、工具发现、认证 |
| `oauth/` | OAuth 2.0 认证流程 |
| `lsp/` | LSP 语言服务器管理 |
| `analytics/` | GrowthBook 特性开关 + 遥测 |
| `compact/` | 上下文压缩microcompact、auto-compact |
| `plugins/` | 插件安装、加载、版本管理 |
| `extractMemories/` | 自动记忆提取 |
| `tokenEstimation.ts` | Token 计数估算 |
| `teamMemorySync/` | 团队记忆同步 |
| `tips/` | 提示系统 |
| `policyLimits/` | 组织策略限制 |
---
## 8. Bridge / 远程系统 (bridge/, remote/, server/)
### Bridge (IDE 集成)
双向通信层,连接 VS Code / JetBrains 扩展与 CLI。
```
IDE Extension ←── JSON-RPC ──→ Bridge Manager ←── Session ──→ REPL
(ws/stdio) (权限桥接)
```
关键组件:
- `bridgeMain.ts` — 桥接主循环
- `bridgeMessaging.ts` — 消息协议
- `bridgePermissionCallbacks.ts` — 权限回调代理
- `replBridge.ts` — REPL 会话桥接
- `sessionRunner.ts` — 会话执行管理
- `trustedDevice.ts` — 可信设备认证
### Remote Control
用户从 claude.ai/web/mobile 控制本地会话:
- `bridge/bridgeMain.ts` — 服务器连接
- `remote/RemoteSessionManager.ts` — 远程会话管理
- `remote/SessionsWebSocket.ts` — WebSocket 连接
### Server 模式
独立的 HTTP 服务器模式(`server/`),支持多会话并发。
---
## 9. Ink 渲染器 (ink/, 96 个文件)
**自定义的 React 终端渲染器**,不是直接使用 npm ink 包,而是 fork 并深度定制。
核心模块:
- `reconciler.ts` — React reconciler 实现
- `renderer.ts` — 终端 ANSI 输出渲染
- `layout/` — Yoga 布局引擎集成
- `events/` — 键盘/鼠标/终端事件系统
- `screen.ts` — 屏幕管理
- `selection.ts` — 文本选择
- `searchHighlight.ts` — 搜索高亮
- `termio/` — 终端 I/O 解析ANSI/CSI/OSC/SGR
---
## 10. 钩子系统 (hooks/)
### 工具权限钩子
```
toolPermission/
├── PermissionContext.ts — 权限上下文
├── handlers/
│ ├── interactiveHandler.ts — 交互模式处理器
│ ├── coordinatorHandler.ts — 协调器模式处理器
│ └── swarmWorkerHandler.ts — Swarm 工作器处理器
└── permissionLogging.ts — 权限日志
```
### 通知钩子
`hooks/notifs/` — 16 个通知钩子处理各种状态通知模型迁移、速率限制、IDE 状态等)。
### 关键 hooks
| Hook | 职责 |
|------|------|
| `useReplBridge.tsx` | 远程控制桥接 |
| `useCanUseTool.tsx` | 工具权限检查 |
| `useGlobalKeybindings.tsx` | 全局键盘快捷键 |
| `useVoice.ts` / `useVoiceIntegration.tsx` | 语音输入 |
| `useTasksV2.ts` | 任务管理 |
| `useSwarmInitialization.ts` | Swarm 团队初始化 |
| `useMergedTools.ts` | 工具池合并 (内置 + MCP) |
| `useMergedCommands.ts` | 命令池合并 |
| `useSettings.ts` | 设置管理 |
---
## 11. 插件系统 (plugins/)
### 架构
```
plugins/
├── builtinPlugins.ts — 内置插件列表
├── bundled/
│ └── index.ts — 捆绑插件初始化
utils/plugins/
├── pluginLoader.ts — 插件加载器
├── installedPluginsManager.ts — 已安装插件管理
├── marketplaceManager.ts — 市场管理
├── validatePlugin.ts — 插件验证
├── loadPluginCommands.ts — 加载插件命令
├── loadPluginHooks.ts — 加载插件钩子
├── loadPluginAgents.ts — 加载插件 Agent
└── loadPluginOutputStyles.ts — 加载输出样式
```
插件可以提供命令、工具、钩子、Agent 定义、输出样式。
---
## 12. 配置系统
### 多层级配置
```
1. 远程管理设置 (enterprise MDM)
2. 策略设置 (organization policy)
3. 用户设置 (~/.claude/settings.json)
4. 项目设置 (.claude/settings.json)
5. 本地设置 (.claude/settings.local.json)
6. CLI 标志 (--model, --permission-mode 等)
7. 环境变量 (ANTHROPIC_API_KEY, CLAUDE_CODE_* 等)
```
### 设置验证
`utils/settings/validation.ts` — Zod schema 验证,支持类型检查和错误报告。
### 迁移系统
`migrations/` — 11 个版本迁移脚本,按序号执行(模型名称迁移、配置迁移等)。
---
## 13. 记忆系统 (memdir/)
```
memdir/
├── memdir.ts — 记忆目录操作
├── paths.ts — 路径解析
├── memoryScan.ts — 记忆扫描
├── memoryAge.ts — 记忆年龄管理
├── memoryTypes.ts — 类型定义
├── findRelevantMemories.ts — 相关记忆查找
├── teamMemPaths.ts — 团队记忆路径
└── teamMemPrompts.ts — 团队记忆提示
```
记忆存储在 `~/.claude/memory/` 目录,自动从对话中提取。
---
## 14. 性能优化
### 启动优化
1. **并行子进程**MDM 读取 + Keychain 预取 + 导入并行 (~135ms)
2. **延迟加载**重型模块动态导入OpenTelemetry, gRPC, print.ts
3. **Feature Flag DCE**:未启用的功能在构建时完全裁剪
4. **Memoize**`getCommands()`, `getTools()`, `getSkills()` 等结果缓存
5. **预连接**API 预连接在用户输入前完成
### 运行时优化
1. **Token 预算**:上下文压缩触发管理
2. **文件历史快照**:高效的文件变更追踪
3. **虚拟滚动**`VirtualMessageList` 支持大量消息
4. **流式渲染**:增量 ANSI 输出
---
## 15. 关键数据流总结
```
用户输入
├→ /command → processSlashCommand → 命令执行 → 可能触发 query()
└→ 文本输入 → processUserInput
├→ processBashCommand (以 ! 开头)
└→ processTextPrompt
└→ QueryEngine.query()
├→ 构建 system prompt (fetchSystemPromptParts + buildEffectiveSystemPrompt)
├→ 构建 messages (对话历史)
├→ 构建 tools (getTools + MCP tools)
├→ API 调用 (Anthropic SDK, streaming)
└→ 循环处理响应:
├→ text block → 显示消息
├→ thinking block → 显示思考过程
└→ tool_use block → 权限检查 → 执行 → 结果回传 API
```
---
## 附录:详细模块文档
- [Tools 详细分析](./ARCHITECTURE-TOOLS.md)
- [Services 详细分析](./ARCHITECTURE-SERVICES.md)
- [Components 详细分析](./ARCHITECTURE-COMPONENTS.md)
- [Bridge/Remote 详细分析](./ARCHITECTURE-BRIDGE-REMOTE.md)
- [Utils 详细分析](./ARCHITECTURE-UTILS.md)
- [Commands/Skills/Plugins 详细分析](./ARCHITECTURE-COMMANDS.md)