civil-engineering-cloud-cla.../01-claude-code-source-crack/claude-code-source/README.md

211 lines
6.9 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 源码还原与构建
## 从源码重新构建
```bash
# 1. 安装 Bun构建工具
curl -LO https://github.com/oven-sh/bun/releases/latest/download/bun-darwin-aarch64.zip
unzip bun-darwin-aarch64.zip -d /tmp/bun && sudo cp /tmp/bun/bun-darwin-aarch64/bun /usr/local/bin/bun
# 2. 安装/更新依赖
pnpm install --registry https://registry.npmjs.org
# 3. 构建
bun run build.ts
# 4. 运行
bun dist/cli.js --version
```
`@anthropic-ai/claude-code` v2.1.88 npm 包中的 `cli.js.map` source map 文件还原出的完整源代码,并配置为可编译运行。
## 效果验证
```
$ bun dist/cli.js --version
2.1.88 (Claude Code)
$ bun dist/cli.js --help
Usage: claude [options] [command] [prompt]
Claude Code - starts an interactive session by default...
```
## 源码还原方法
```bash
# 1. 下载 npm 包
npm pack @anthropic-ai/claude-code --registry https://registry.npmjs.org
# 2. 解压
tar xzf anthropic-ai-claude-code-2.1.88.tgz
# 3. 解析 cli.js.map将 sourcesContent 按原始路径写出
node -e "
const fs = require('fs'), path = require('path');
const map = JSON.parse(fs.readFileSync('package/cli.js.map', 'utf8'));
const outDir = './claude-code-source';
for (let i = 0; i < map.sources.length; i++) {
const content = map.sourcesContent[i];
if (!content) continue;
let relPath = map.sources[i];
while (relPath.startsWith('../')) relPath = relPath.slice(3);
const outPath = path.join(outDir, relPath);
fs.mkdirSync(path.dirname(outPath), { recursive: true });
fs.writeFileSync(outPath, content);
}
"
```
source map 包含 **4756** 个源文件及完整 `sourcesContent`,可无损还原所有 TypeScript/TSX 原始代码。
## 构建环境搭建
### 依赖
| 工具 | 用途 |
|------|------|
| [Bun](https://bun.sh) v1.3.11 | 构建工具(源码使用 `bun:bundle` 特性) |
| [pnpm](https://pnpm.io) v10+ | 包管理 |
| Node.js v18+ | 运行时 |
### 安装步骤
```bash
# 1. 安装 BunmacOS arm64
curl -LO https://github.com/oven-sh/bun/releases/latest/download/bun-darwin-aarch64.zip
unzip bun-darwin-aarch64.zip
# 2. 安装依赖pnpm + npm registry
pnpm install --registry https://registry.npmjs.org
# 3. 构建
bun run build.ts
# 4. 运行
bun dist/cli.js --version
```
## 构建说明
### 为什么需要 Bun
源码中大量使用了 `bun:bundle``feature()` API
```typescript
import { feature } from 'bun:bundle'
// 编译期特性开关Bun 构建时进行死代码消除
const coordinatorModule = feature('COORDINATOR_MODE')
? require('./coordinator/coordinatorMode.js')
: null
```
这是 Bun bundler 的专有特性,等价于 webpack 的 `DefinePlugin`,在构建时静态替换为 `true`/`false` 并消除死分支。
### 特性开关配置
`build.ts` 中定义了 90+ 个特性开关,均已按**生产外部版本**的默认值设置:
```typescript
const featureFlags = {
BRIDGE_MODE: false, // IDE 桥接(生产关闭)
COORDINATOR_MODE: false, // 多代理协调(内部功能)
KAIROS: false, // 助手模式(内部功能)
BUILTIN_EXPLORE_PLAN_AGENTS: true, // 内置探索/计划代理(启用)
TOKEN_BUDGET: true, // Token 预算显示(启用)
// ...等 80+ 个开关
}
```
### MACRO 常量注入
源码使用 `MACRO.VERSION` 等编译期常量(类似 C 语言的宏):
```typescript
console.log(`${MACRO.VERSION} (Claude Code)`) // → "2.1.88 (Claude Code)"
```
`build.ts` 中通过 `define` 注入:
```typescript
define: {
'MACRO.VERSION': JSON.stringify('2.1.88'),
'MACRO.BUILD_TIME': JSON.stringify(new Date().toISOString()),
'MACRO.ISSUES_EXPLAINER': JSON.stringify('...'),
// ...
}
```
### 私有包处理
以下内部包不在公开 npm 中,已创建功能存根:
| 包名 | 说明 |
|------|------|
| `color-diff-napi` | 语法高亮 native 模块(存根:禁用高亮) |
| `modifiers-napi` | macOS 按键修饰符 native 模块(存根:返回空) |
| `@ant/claude-for-chrome-mcp` | Chrome 扩展 MCP 服务器(存根) |
| `@anthropic-ai/mcpb` | MCP bundle 处理器(存根) |
| `@anthropic-ai/sandbox-runtime` | 沙盒运行时(存根) |
### commander 兼容性补丁
源码使用 `-d2e` 作为调试标志的短选项(多字符短选项),但 commander v14 只允许单字符短选项。
已对 `node_modules/commander/lib/option.js` 做最小化补丁,将正则从 `/^-[^-]$/` 改为 `/^-[^-]+$/`
## 目录结构
```
.
├── src/ # 核心源码1902 个文件)
│ ├── entrypoints/
│ │ └── cli.tsx # ← 构建入口点
│ ├── main.tsx # 主 REPL 逻辑(由 cli.tsx 动态 import
│ ├── Tool.ts # 工具类型系统
│ ├── Task.ts # 任务管理
│ ├── QueryEngine.ts # 查询引擎
│ ├── assistant/ # 会话历史管理
│ ├── bridge/ # IDE 桥接层31
│ ├── buddy/ # 子代理系统6
│ ├── cli/ # CLI 参数解析19
│ ├── commands/ # 斜杠命令207
│ ├── components/ # 终端 UI 组件389
│ ├── constants/ # 全局常量21
│ ├── context/ # 上下文管理9
│ ├── entrypoints/ # 各类入口点8
│ ├── hooks/ # 生命周期钩子104
│ ├── ink/ # 自研终端渲染引擎96
│ ├── keybindings/ # 键盘快捷键14
│ ├── memdir/ # 记忆目录8
│ ├── migrations/ # 数据迁移11
│ ├── plugins/ # 插件系统2
│ ├── remote/ # 远程执行4
│ ├── services/ # 核心服务130
│ ├── skills/ # 技能系统20
│ ├── state/ # 状态管理6
│ ├── tasks/ # 任务执行12
│ ├── tools/ # 工具实现184
│ ├── types/ # 类型定义11
│ ├── utils/ # 工具函数564
│ ├── vim/ # Vim 模式5
│ └── voice/ # 语音输入1
├── vendor/ # 内部 vendor 代码4 文件)
├── node_modules/ # 依赖pnpm 安装 + 私有包存根)
├── dist/ # 构建产出
│ └── cli.js # 可执行文件22MB
├── build.ts # Bun 构建脚本(含特性开关配置)
├── tsconfig.json # TypeScript 配置
└── package.json # 项目配置
```
## 统计
| 指标 | 数值 |
|------|------|
| 源文件总数 | 4,756 |
| 核心源码src/ + vendor/ | 1,906 文件 |
| 第三方依赖node_modules/ | 2,850 + npm 安装 |
| Source Map 大小 | 57 MB |
| 构建产出大小 | 22 MB |
| 包版本 | 2.1.88 |
| 特性开关数量 | 90 个 |