Files
claude-code/BUILD_GUIDE.md
83fb08926d feat: 补充构建配置,实现 Claude Code 源码编译
添加缺失的项目配置文件,使源码快照可以成功编译和运行:
- package.json: 85+ 依赖项 + 构建脚本
- tsconfig.json: TypeScript + JSX + src/ 路径别名
- globals.d.ts: MACRO 构建常量 + bun:bundle 类型声明
- scripts/build.ts: Bun 构建脚本(feature flag polyfill + MACRO 注入 + 内部包 stub + 缺失源文件自动 stub)
- BUILD_GUIDE.md: 中文编译文档
- 修 Commander.js v13 的 -d2e 短标志兼容问题

构建脚本通过 missingSourceStubPlugin 插件自动检测并 stub 缺失的源文件,
无需在源码树中手动创建 stub 文件。

构建结果:dist/cli.js (11.7 MB),CLI 可正常启动并显示交互式终端 UI。

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-04-01 12:01:06 +08:00

208 lines
7.1 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 源码编译指南
> 本文档记录了为 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/...'` 格式的导入)
- **目标**: ESNextBun 原生支持)
- **类型**: 同时包含 `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 官方发布。