Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

isboyjc/claude-code

Folders and files

NameName
Last commit message
Last commit date

Latest commit

History

2 Commits

Repository files navigation

Claude Code Source (v2.1.88)

@anthropic-ai/claude-code npm 包的 cli.js.map 中还原出的完整 TypeScript 源码,可编译运行。

快速开始

三步即可运行:

# 1. 安装依赖(自动创建私有包存根 + 补丁 commander)
bun install
# 2. 构建
bun run build
# 3. 运行
bun dist/cli.js

验证:

$ 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...

环境要求

工具 版本 用途
Bun >= 1.3.5 依赖安装 + 构建打包(源码使用 bun:bundle 特性)
Node.js >= 18 运行时

安装 Bun

# macOS / Linux
curl -fsSL https://bun.sh/install | bash
# 或通过 Homebrew
brew install oven-sh/bun/bun

如何使用

与正式版共存

如果你已安装正式版 claude,可以通过别名区分:

# 在 ~/.zshrc 或 ~/.bashrc 中添加
alias claude-dev="bun /path/to/claude-code-source/dist/cli.js"

之后 claude 是正式版,claude-dev 是源码构建版。两者共享 ~/.claude/ 下的认证信息和配置,无需重新登录。

认证

源码版与正式版共享认证,如果正式版已登录则无需额外操作。否则:

# 方式一:环境变量
export ANTHROPIC_API_KEY="sk-ant-..."
# 方式二:OAuth 登录
bun dist/cli.js auth

构建原理

bun install 做了什么

除了安装公开 npm 依赖外,postinstall 脚本(scripts/postinstall.js)会自动完成两件事:

1. 创建私有包存根

源码中引用了 5 个 Anthropic 内部包,公开 npm 上不存在。postinstall 会在 node_modules/ 中创建功能存根(stub),使构建通过并在运行时安全降级:

包名 实际用途 存根行为
color-diff-napi 原生语法高亮 + 彩色 diff 高亮不可用,回退纯文本 diff
modifiers-napi macOS 键盘修饰键检测 始终返回 false
@ant/claude-for-chrome-mcp Chrome 浏览器扩展 MCP 服务 功能不可用(正常使用不涉及)
@anthropic-ai/mcpb MCP bundle / DXT 插件处理 插件安装功能受限
@anthropic-ai/sandbox-runtime Linux 沙箱(bubblewrap) 返回不支持,跳过沙箱

2. 补丁 commander

源码使用 -d2e 作为多字符短选项,但 commander v14 只允许单字符短选项。postinstall 将正则 /^-[^-]$/ 改为 /^-[^-]+$/

bun run build 做了什么

build.ts 使用 Bun bundler 将 TypeScript 源码编译为单文件 dist/cli.js(~21MB),过程中处理:

  • 特性开关:通过 Bun plugin 拦截 import { feature } from 'bun:bundle',将 90+ 个 feature flag 替换为编译期常量,实现死代码消除
  • MACRO 常量:通过 define 注入 MACRO.VERSIONMACRO.BUILD_TIME 等编译期常量
  • 文本文件:.md/.txt 文件作为字符串导入
  • External 排除:.node 原生模块和可选云 SDK(Bedrock/Vertex/Foundry)标记为 external,不打包

vendor/ 目录

包含 Anthropic 自研原生模块(.node)的 TypeScript 加载层:

模块 功能
modifiers-napi-src macOS 键盘修饰键检测
url-handler-src macOS URL scheme 事件监听(OAuth 回调)
audio-capture-src 麦克风录音 / 音频播放(语音模式)
image-processor-src 图片处理(替代 sharp)

这些加载器编译进产物,但因缺少对应的 .node 二进制文件而自动降级(代码自带 try/catch 容错)。不影响核心功能。

源码还原方法

# 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 还原源码
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);
}
"

目录结构

.
├── src/ # 核心源码(1902 个文件)
│ ├── entrypoints/
│ │ └── cli.tsx # ← 构建入口点
│ ├── main.tsx # 主 REPL 逻辑
│ ├── Tool.ts # 工具类型系统
│ ├── Task.ts # 任务管理
│ ├── QueryEngine.ts # 查询引擎
│ ├── assistant/ # 会话历史管理
│ ├── bridge/ # IDE 桥接层
│ ├── buddy/ # 子代理系统
│ ├── cli/ # CLI 参数解析
│ ├── commands/ # 斜杠命令
│ ├── components/ # 终端 UI 组件
│ ├── constants/ # 全局常量
│ ├── context/ # 上下文管理
│ ├── hooks/ # 生命周期钩子
│ ├── ink/ # 自研终端渲染引擎
│ ├── keybindings/ # 键盘快捷键
│ ├── services/ # 核心服务
│ ├── skills/ # 技能系统
│ ├── state/ # 状态管理
│ ├── tools/ # 工具实现(Bash, Edit, Read 等)
│ ├── utils/ # 工具函数
│ └── vim/ # Vim 模式
├── vendor/ # 原生模块加载层(4 文件)
├── scripts/
│ └── postinstall.js # 自动创建私有包存根 + 补丁
├── dist/ # 构建产出
│ └── cli.js # 可执行文件(~21MB)
├── build.ts # Bun 构建脚本
├── bunfig.toml # Bun 配置(自动信任 postinstall)
├── tsconfig.json # TypeScript 配置
├── package.json # 项目配置
└── bun.lock # 依赖锁定

常见问题

构建报错 Could not resolve "xxx"

如果出现新的无法解析的内部包,在 build.tsexternal 数组中添加该包名,或在 scripts/postinstall.js 中添加对应存根。

运行时报 xxx is not a function

私有包存根缺少某个方法。查看报错堆栈找到调用的方法名,在 scripts/postinstall.js 对应存根中补充。

重新安装依赖后存根丢失

bun install 可能清除手动创建的 node_modules 内容。再次运行 bun installnode scripts/postinstall.js 即可重建。

统计

指标 数值
源文件总数 4,756
核心源码(src/ + vendor/) 1,906 文件
构建产出大小 ~21 MB
包版本 2.1.88
特性开关数量 90 个

About

从 @anthropic-ai/claude-code npm 包的 cli.js.map 中还原出的完整 TypeScript 源码,可一键本地编译运行。

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

Contributors

AltStyle によって変換されたページ (->オリジナル) /