|
|
# Claude Code 源码编译指南
|
|
|
|
|
|
> 本文档记录了为 Claude Code 源码快照补充缺失配置文件并成功编译运行的完整过程。
|
|
|
|
|
|
## 概述
|
|
|
|
|
|
Claude Code 的源码快照仅包含 `src/` 目录和 `README.md`,缺少所有构建配置文件。本指南涵盖了从零开始恢复构建环境的全部步骤。
|
|
|
|
|
|
---
|
|
|
|
|
|
## 补充的配置文件
|
|
|
|
|
|
### 1. `package.json`
|
|
|
|
|
|
项目的核心配置文件,定义了:
|
|
|
|
|
|
- **包名**: `@anthropic-ai/claude-code`
|
|
|
- **入口点**: `src/entrypoints/cli.tsx`
|
|
|
- **构建产物**: `dist/cli.js`
|
|
|
- **脚本命令**:
|
|
|
- `bun run build` — 执行构建脚本
|
|
|
- `bun run dev` — 直接运行源码(开发模式)
|
|
|
- `bun run typecheck` — TypeScript 类型检查
|
|
|
|
|
|
**依赖项分为三类:**
|
|
|
|
|
|
| 分类 | 数量 | 示例 |
|
|
|
|------|------|------|
|
|
|
| 公开 npm 包 | ~75 个 | `react`, `chalk`, `zod`, `@anthropic-ai/sdk` |
|
|
|
| Anthropic 内部包(需 stub) | ~10 个 | `@ant/*`, `@anthropic-ai/sandbox-runtime` |
|
|
|
| 开发依赖 | ~13 个 | `typescript`, `@types/react`, `@types/bun` |
|
|
|
|
|
|
### 2. `tsconfig.json`
|
|
|
|
|
|
TypeScript 编译配置,关键设置:
|
|
|
|
|
|
- **模块系统**: ESNext + bundler resolution
|
|
|
- **JSX**: `react-jsx`(React 19 的新 JSX 转换)
|
|
|
- **路径别名**: `src/*` → `./src/*`(项目中大量使用 `import from 'src/...'` 格式的导入)
|
|
|
- **目标**: ESNext(Bun 原生支持)
|
|
|
- **类型**: 同时包含 `bun-types` 和 `node` 类型定义
|
|
|
|
|
|
### 3. `globals.d.ts`
|
|
|
|
|
|
全局类型声明文件,定义了:
|
|
|
|
|
|
- **`MACRO` 常量**:构建时注入的宏定义
|
|
|
- `MACRO.VERSION` — 版本号
|
|
|
- `MACRO.BUILD_TIME` — 构建时间戳
|
|
|
- `MACRO.PACKAGE_URL` — npm 包地址
|
|
|
- `MACRO.NATIVE_PACKAGE_URL` — 原生包地址
|
|
|
- `MACRO.FEEDBACK_CHANNEL` — 反馈渠道
|
|
|
- `MACRO.ISSUES_EXPLAINER` — 问题报告说明
|
|
|
- `MACRO.VERSION_CHANGELOG` — 版本变更日志
|
|
|
|
|
|
- **`bun:bundle` 模块**:Bun 构建时特性标志(feature flags)模块的类型声明
|
|
|
- **内部包的类型 stub**:为不公开的 Anthropic 内部包提供类型定义
|
|
|
|
|
|
### 4. `scripts/build.ts`
|
|
|
|
|
|
核心构建脚本,使用 Bun 的 `Bun.build()` API,处理以下关键问题:
|
|
|
|
|
|
#### a) `bun:bundle` Feature Flags 处理
|
|
|
|
|
|
原始代码使用 `import { feature } from 'bun:bundle'` 进行编译时死代码消除。构建脚本通过自定义 Bun 插件为 `feature()` 函数提供 polyfill,所有特性标志在外部构建中默认返回 `false`:
|
|
|
|
|
|
```
|
|
|
PROACTIVE, KAIROS, BRIDGE_MODE, DAEMON, VOICE_MODE,
|
|
|
AGENT_TRIGGERS, MONITOR_TOOL, COORDINATOR_MODE,
|
|
|
ABLATION_BASELINE, DUMP_SYSTEM_PROMPT, CHICAGO_MCP
|
|
|
```
|
|
|
|
|
|
#### b) `MACRO.*` 构建时常量注入
|
|
|
|
|
|
通过 `Bun.build()` 的 `define` 选项在编译时替换所有 `MACRO.*` 引用为实际值。
|
|
|
|
|
|
#### c) 内部包 Stub 插件
|
|
|
|
|
|
为不公开的 Anthropic 内部包(`@ant/*`、`@anthropic-ai/sandbox-runtime` 等)提供内联 stub,确保编译时所有命名导出都能正确解析,同时不引入运行时依赖。
|
|
|
|
|
|
#### d) 缺失源文件自动 Stub 插件
|
|
|
|
|
|
源码快照中缺少部分文件(被 `feature()` 特性标志保护或属于内部模块)。构建脚本通过 `missingSourceStubPlugin` 插件**在构建时自动检测并 stub 这些缺失文件**,无需在源码树中手动创建 stub 文件:
|
|
|
|
|
|
- 通过 `onResolve` 钩子拦截所有源文件导入,检测目标文件是否存在于磁盘
|
|
|
- 不存在的文件自动重定向到虚拟 `missing-source` 命名空间
|
|
|
- 对需要特定 named exports 的模块(如 `connectorText`、`protectedNamespace` 等)提供精确 stub
|
|
|
- 其余缺失模块返回通用 `export default {}`
|
|
|
- `.md` 和 `.txt` 文件返回空字符串,`.d.ts` 文件返回 `export {}`
|
|
|
- 构建日志中以 `⚠️ Auto-stubbing missing module:` 标记自动 stub 的模块
|
|
|
|
|
|
#### e) 外部依赖处理
|
|
|
|
|
|
所有公开 npm 包标记为 `external`,不打包进产物,运行时从 `node_modules` 解析。
|
|
|
|
|
|
### 5. 源码修复
|
|
|
|
|
|
`src/main.tsx` 中的 `-d2e` 短标志格式与 Commander.js v13 不兼容(v13 要求短标志为单个字符),已修改为仅使用 `--debug-to-stderr` 长标志。
|
|
|
|
|
|
---
|
|
|
|
|
|
## 编译步骤
|
|
|
|
|
|
### 前提条件
|
|
|
|
|
|
- [Bun](https://bun.sh) ≥ 1.1(推荐 1.3+)
|
|
|
- Windows / macOS / Linux
|
|
|
|
|
|
### 步骤 1:安装依赖
|
|
|
|
|
|
```bash
|
|
|
bun install
|
|
|
```
|
|
|
|
|
|
这将安装约 600+ 个包(含传递依赖),耗时约 1-2 分钟。
|
|
|
|
|
|
### 步骤 2:执行构建
|
|
|
|
|
|
```bash
|
|
|
bun run build
|
|
|
```
|
|
|
|
|
|
构建脚本将:
|
|
|
1. 初始化 `bun:bundle` feature flag polyfill
|
|
|
2. 注入 `MACRO.*` 构建时常量
|
|
|
3. 为内部 Anthropic 包生成内联 stub
|
|
|
4. 自动检测并 stub 源码快照中缺失的源文件
|
|
|
5. 打包 `src/entrypoints/cli.tsx` 入口点
|
|
|
6. 输出到 `dist/cli.js`(约 11.7 MB)和 `dist/cli.js.map`
|
|
|
|
|
|
### 步骤 3:验证运行
|
|
|
|
|
|
```bash
|
|
|
# 检查版本
|
|
|
bun dist/cli.js --version
|
|
|
# 输出: 1.0.0-research (Claude Code)
|
|
|
|
|
|
# 查看帮助
|
|
|
bun dist/cli.js --help
|
|
|
|
|
|
# 启动交互式界面(需要 API Key)
|
|
|
bun dist/cli.js
|
|
|
```
|
|
|
|
|
|
### 自定义版本号
|
|
|
|
|
|
```bash
|
|
|
CLAUDE_CODE_VERSION=2.0.0 bun run build
|
|
|
```
|
|
|
|
|
|
---
|
|
|
|
|
|
## 构建产物
|
|
|
|
|
|
| 文件 | 大小 | 说明 |
|
|
|
|------|------|------|
|
|
|
| `dist/cli.js` | ~11.7 MB | 主程序包(ESM 格式) |
|
|
|
| `dist/cli.js.map` | ~38.6 MB | Source Map |
|
|
|
|
|
|
---
|
|
|
|
|
|
## 技术要点
|
|
|
|
|
|
### 架构概览
|
|
|
|
|
|
```
|
|
|
入口点: src/entrypoints/cli.tsx
|
|
|
↓ (动态导入)
|
|
|
主程序: src/main.tsx (Commander.js CLI)
|
|
|
↓
|
|
|
终端 UI: src/ink/ (自定义 Ink 实现 + React 19)
|
|
|
↓
|
|
|
核心系统:
|
|
|
├── src/tools/ (~40 个工具实现)
|
|
|
├── src/commands/ (~50 个斜杠命令)
|
|
|
├── src/services/ (API、MCP、OAuth、分析)
|
|
|
├── src/hooks/ (权限系统)
|
|
|
└── src/coordinator/ (多智能体协调)
|
|
|
```
|
|
|
|
|
|
### 关键技术栈
|
|
|
|
|
|
| 组件 | 技术 |
|
|
|
|------|------|
|
|
|
| 运行时 | Bun |
|
|
|
| 语言 | TypeScript (strict) |
|
|
|
| 终端 UI | React 19 + 自定义 Ink fork |
|
|
|
| CLI 框架 | Commander.js 13 |
|
|
|
| Schema 验证 | Zod v3 |
|
|
|
| 协议 | MCP SDK, LSP |
|
|
|
| API | Anthropic SDK |
|
|
|
| 遥测 | OpenTelemetry 2.x |
|
|
|
| 布局引擎 | 纯 TypeScript yoga-layout 实现 |
|
|
|
|
|
|
### 注意事项
|
|
|
|
|
|
1. **内部包不可用**:`@ant/*` 系列包和部分 `@anthropic-ai/*` 包不在公共 npm 上发布,相关功能(Chrome 集成、计算机使用、沙箱运行时等)在此构建中不可用。
|
|
|
|
|
|
2. **Feature Flags 全部禁用**:所有 `bun:bundle` 特性标志默认返回 `false`,这意味着实验性功能(语音、守护进程、协调器模式等)的代码路径已被消除。
|
|
|
|
|
|
3. **需要 API Key 才能实际使用**:虽然 CLI 可以编译和启动(完整的终端 UI、主题选择等均正常),但实际使用需要 Anthropic API Key 或 OAuth 登录。
|
|
|
|
|
|
4. **React Reconciler 版本**:项目使用了 `useEffectEvent` Hook,需要 `react-reconciler@0.33.0`(而非 0.31.0),该版本才实现了 `useEffectEvent` 调度器。
|
|
|
|
|
|
5. **内部包 Stub 需完整方法签名**:某些内部包(如 `@anthropic-ai/sandbox-runtime` 的 `SandboxManager`)的 stub 需要包含完整的静态方法(如 `isSupportedPlatform`、`checkDependencies`、`wrapWithSandbox` 等),否则运行时在访问未定义属性时会报错。构建脚本已为所有已知的内部类提供了完整方法签名。
|
|
|
|
|
|
6. **非官方构建**:此构建仅用于教育和安全研究目的,不代表 Anthropic 官方发布。
|
|
|
|