claude-code-source-recovery

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

Claude Code 2.1.88 Source Recovery

Claude Code 2.1.88 源代码恢复

Skill by ara.so — Daily 2026 Skills collection.
Skill 由 ara.so 出品 — 2026每日Skill合集。

What This Project Is

项目介绍

This repository contains the recovered TypeScript source code of
@anthropic-ai/claude-code
version 2.1.88. On 2026-03-31, Anthropic accidentally published a
cli.js.map
(57MB) source map to npm that contained the full
sourcesContent
of the bundled CLI. After extraction and reconstruction, the result is ~700,000 lines of TypeScript source code organized into a readable directory structure.
The project is useful for:
  • Studying production CLI architecture patterns (Ink/React in terminal)
  • Understanding how MCP (Model Context Protocol) is implemented in a real CLI
  • Learning how Claude Code manages sessions, commands, authentication, and tool execution

本仓库包含恢复后的
@anthropic-ai/claude-code
2.1.88版本的TypeScript源代码。2026年3月31日,Anthropic意外将包含完整打包CLI的
sourcesContent
的57MB大小的
cli.js.map
源映射文件发布到了npm。经过提取和重构后,得到了约70万行TypeScript源代码,整理为易读的目录结构。
该项目适用于:
  • 学习生产级CLI架构模式(终端中使用Ink/React)
  • 理解MCP(模型上下文协议)在真实CLI中的实现方式
  • 了解Claude Code如何管理会话、命令、身份验证和工具执行

Repository Structure

仓库结构

src/
├── entrypoints/        # CLI bootstrap and initialization
├── commands/           # Command definitions (login, mcp, review, tasks, etc.)
├── components/         # Ink/React terminal UI components
├── services/           # Core business logic (sync, remote capabilities, policies)
├── hooks/              # Terminal state management hooks
├── utils/              # Auth, file ops, process management helpers
└── ink/                # Custom terminal rendering infrastructure

src/
├── entrypoints/        # CLI引导与初始化
├── commands/           # 命令定义(login、mcp、review、tasks等)
├── components/         # Ink/React终端UI组件
├── services/           # 核心业务逻辑(同步、远程能力、策略)
├── hooks/              # 终端状态管理hooks
├── utils/              # 身份验证、文件操作、进程管理工具
└── ink/                # 自定义终端渲染基础设施

Installing the Original 2.1.88 Package (Tencent Mirror Cache)

安装原始2.1.88版本包(腾讯镜像缓存)

The official npm version was pulled. Use the Tencent mirror cache while available:
bash
npm install -g https://mirrors.cloud.tencent.com/npm/@anthropic-ai/claude-code/-/claude-code-2.1.88.tgz

官方npm版本已被下架,可在缓存有效期内使用腾讯镜像:
bash
npm install -g https://mirrors.cloud.tencent.com/npm/@anthropic-ai/claude-code/-/claude-code-2.1.88.tgz

Extracting Source from the Source Map

从源映射文件提取源代码

If you have the original
cli.js.map
, you can recover sources programmatically:
typescript
import fs from "fs";
import path from "path";
import zlib from "zlib";

interface SourceMap {
  version: number;
  sources: string[];
  sourcesContent: (string | null)[];
  mappings: string;
}

async function extractSourceMap(mapPath: string, outDir: string) {
  const raw = fs.readFileSync(mapPath, "utf-8");
  const sourceMap: SourceMap = JSON.parse(raw);

  for (let i = 0; i < sourceMap.sources.length; i++) {
    const sourcePath = sourceMap.sources[i];
    const content = sourceMap.sourcesContent[i];

    if (!content) continue;

    // Normalize path: strip webpack/bundle prefixes
    const normalized = sourcePath
      .replace(/^webpack:\/\/\//, "")
      .replace(/^\.\//, "");

    const outPath = path.join(outDir, normalized);
    fs.mkdirSync(path.dirname(outPath), { recursive: true });
    fs.writeFileSync(outPath, content, "utf-8");
  }

  console.log(`Extracted ${sourceMap.sources.length} source files to ${outDir}`);
}

extractSourceMap("cli.js.map", "./recovered-src");

如果你持有原始的
cli.js.map
文件,可以通过代码自动恢复源码:
typescript
import fs from "fs";
import path from "path";
import zlib from "zlib";

interface SourceMap {
  version: number;
  sources: string[];
  sourcesContent: (string | null)[];
  mappings: string;
}

async function extractSourceMap(mapPath: string, outDir: string) {
  const raw = fs.readFileSync(mapPath, "utf-8");
  const sourceMap: SourceMap = JSON.parse(raw);

  for (let i = 0; i < sourceMap.sources.length; i++) {
    const sourcePath = sourceMap.sources[i];
    const content = sourceMap.sourcesContent[i];

    if (!content) continue;

    // 标准化路径:移除webpack/打包前缀
    const normalized = sourcePath
      .replace(/^webpack:\/\/\//, "")
      .replace(/^\.\//, "");

    const outPath = path.join(outDir, normalized);
    fs.mkdirSync(path.dirname(outPath), { recursive: true });
    fs.writeFileSync(outPath, content, "utf-8");
  }

  console.log(`已提取${sourceMap.sources.length}个源文件到${outDir}`);
}

extractSourceMap("cli.js.map", "./recovered-src");

Key Architectural Patterns

核心架构模式

1. CLI Entrypoint Bootstrap

1. CLI入口引导

typescript
// src/entrypoints/cli.ts (representative pattern)
import { render } from "ink";
import React from "react";
import { App } from "../components/App";
import { parseArgs } from "../utils/args";

async function main() {
  const args = parseArgs(process.argv.slice(2));

  if (args.command) {
    // Dispatch to named command handler
    const handler = await loadCommand(args.command);
    await handler.run(args);
  } else {
    // Default: launch interactive REPL via Ink
    render(React.createElement(App, { initialArgs: args }));
  }
}

main().catch((err) => {
  console.error(err);
  process.exit(1);
});
typescript
// src/entrypoints/cli.ts (典型模式)
import { render } from "ink";
import React from "react";
import { App } from "../components/App";
import { parseArgs } from "../utils/args";

async function main() {
  const args = parseArgs(process.argv.slice(2));

  if (args.command) {
    // 分发到对应命令处理器
    const handler = await loadCommand(args.command);
    await handler.run(args);
  } else {
    // 默认:通过Ink启动交互式REPL
    render(React.createElement(App, { initialArgs: args }));
  }
}

main().catch((err) => {
  console.error(err);
  process.exit(1);
});

2. Command Loading System

2. 命令加载系统

Commands support built-in, dynamic skills, plugins, and MCP sources:
typescript
// src/commands/loader.ts (representative pattern)
type CommandSource = "builtin" | "skill" | "plugin" | "mcp";

interface Command {
  name: string;
  source: CommandSource;
  description: string;
  run(args: ParsedArgs): Promise<void>;
}

async function loadCommand(name: string): Promise<Command> {
  // 1. Check built-in commands first
  const builtin = builtinCommands.get(name);
  if (builtin) return builtin;

  // 2. Check MCP-registered commands
  const mcpCmd = await mcpRegistry.resolve(name);
  if (mcpCmd) return mcpCmd;

  // 3. Dynamic skill loading
  const skill = await loadSkillCommand(name);
  if (skill) return skill;

  throw new Error(`Unknown command: ${name}`);
}
命令支持内置、动态Skill、插件和MCP源:
typescript
// src/commands/loader.ts (典型模式)
type CommandSource = "builtin" | "skill" | "plugin" | "mcp";

interface Command {
  name: string;
  source: CommandSource;
  description: string;
  run(args: ParsedArgs): Promise<void>;
}

async function loadCommand(name: string): Promise<Command> {
  // 1. 优先检查内置命令
  const builtin = builtinCommands.get(name);
  if (builtin) return builtin;

  // 2. 检查MCP注册的命令
  const mcpCmd = await mcpRegistry.resolve(name);
  if (mcpCmd) return mcpCmd;

  // 3. 动态加载Skill
  const skill = await loadSkillCommand(name);
  if (skill) return skill;

  throw new Error(`未知命令:${name}`);
}

3. Ink/React Terminal UI Component Pattern

3. Ink/React终端UI组件模式

typescript
// src/components/ChatView.tsx (representative pattern)
import React, { useState, useEffect } from "react";
import { Box, Text, useInput } from "ink";
import { useConversation } from "../hooks/useConversation";

interface ChatViewProps {
  sessionId: string;
}

export function ChatView({ sessionId }: ChatViewProps) {
  const { messages, sendMessage, isStreaming } = useConversation(sessionId);
  const [input, setInput] = useState("");

  useInput((char, key) => {
    if (key.return) {
      sendMessage(input);
      setInput("");
    } else if (key.backspace) {
      setInput((prev) => prev.slice(0, -1));
    } else {
      setInput((prev) => prev + char);
    }
  });

  return (
    <Box flexDirection="column" height="100%">
      <Box flexDirection="column" flexGrow={1} overflowY="hidden">
        {messages.map((msg, i) => (
          <Box key={i} marginBottom={1}>
            <Text color={msg.role === "assistant" ? "cyan" : "white"}>
              {msg.role === "assistant" ? "Claude: " : "You: "}
            </Text>
            <Text>{msg.content}</Text>
          </Box>
        ))}
        {isStreaming && <Text color="gray"></Text>}
      </Box>
      <Box borderStyle="single" paddingX={1}>
        <Text>{">"} </Text>
        <Text>{input}</Text>
      </Box>
    </Box>
  );
}
typescript
// src/components/ChatView.tsx (典型模式)
import React, { useState, useEffect } from "react";
import { Box, Text, useInput } from "ink";
import { useConversation } from "../hooks/useConversation";

interface ChatViewProps {
  sessionId: string;
}

export function ChatView({ sessionId }: ChatViewProps) {
  const { messages, sendMessage, isStreaming } = useConversation(sessionId);
  const [input, setInput] = useState("");

  useInput((char, key) => {
    if (key.return) {
      sendMessage(input);
      setInput("");
    } else if (key.backspace) {
      setInput((prev) => prev.slice(0, -1));
    } else {
      setInput((prev) => prev + char);
    }
  });

  return (
    <Box flexDirection="column" height="100%">
      <Box flexDirection="column" flexGrow={1} overflowY="hidden">
        {messages.map((msg, i) => (
          <Box key={i} marginBottom={1}>
            <Text color={msg.role === "assistant" ? "cyan" : "white"}>
              {msg.role === "assistant" ? "Claude: " : "You: "}
            </Text>
            <Text>{msg.content}</Text>
          </Box>
        ))}
        {isStreaming && <Text color="gray"></Text>}
      </Box>
      <Box borderStyle="single" paddingX={1}>
        <Text>{">"} </Text>
        <Text>{input}</Text>
      </Box>
    </Box>
  );
}

4. MCP (Model Context Protocol) Integration

4. MCP(模型上下文协议)集成

typescript
// src/services/mcpClient.ts (representative pattern)
import { McpClient, Transport } from "@anthropic-ai/mcp";

interface McpServerConfig {
  name: string;
  command: string;
  args: string[];
  env?: Record<string, string>;
}

class McpRegistry {
  private clients = new Map<string, McpClient>();

  async connect(config: McpServerConfig): Promise<void> {
    const transport = new StdioTransport({
      command: config.command,
      args: config.args,
      env: { ...process.env, ...config.env },
    });

    const client = new McpClient({ name: "claude-code", version: "2.1.88" });
    await client.connect(transport);

    // Discover tools exposed by this MCP server
    const { tools } = await client.listTools();
    for (const tool of tools) {
      this.registerTool(config.name, tool);
    }

    this.clients.set(config.name, client);
  }

  async callTool(serverName: string, toolName: string, args: unknown) {
    const client = this.clients.get(serverName);
    if (!client) throw new Error(`MCP server not connected: ${serverName}`);
    return client.callTool({ name: toolName, arguments: args as Record<string, unknown> });
  }

  async resolve(commandName: string): Promise<Command | null> {
    // Map MCP tool names to CLI commands
    for (const [server, tools] of this.toolRegistry) {
      const tool = tools.find((t) => t.name === commandName);
      if (tool) {
        return {
          name: commandName,
          source: "mcp",
          description: tool.description ?? "",
          run: async (args) => {
            const result = await this.callTool(server, commandName, args);
            console.log(result.content);
          },
        };
      }
    }
    return null;
  }

  private toolRegistry = new Map<string, Array<{ name: string; description?: string }>>();

  private registerTool(server: string, tool: { name: string; description?: string }) {
    const existing = this.toolRegistry.get(server) ?? [];
    this.toolRegistry.set(server, [...existing, tool]);
  }
}

export const mcpRegistry = new McpRegistry();
typescript
// src/services/mcpClient.ts (典型模式)
import { McpClient, Transport } from "@anthropic-ai/mcp";

interface McpServerConfig {
  name: string;
  command: string;
  args: string[];
  env?: Record<string, string>;
}

class McpRegistry {
  private clients = new Map<string, McpClient>();

  async connect(config: McpServerConfig): Promise<void> {
    const transport = new StdioTransport({
      command: config.command,
      args: config.args,
      env: { ...process.env, ...config.env },
    });

    const client = new McpClient({ name: "claude-code", version: "2.1.88" });
    await client.connect(transport);

    // 发现该MCP服务器暴露的工具
    const { tools } = await client.listTools();
    for (const tool of tools) {
      this.registerTool(config.name, tool);
    }

    this.clients.set(config.name, client);
  }

  async callTool(serverName: string, toolName: string, args: unknown) {
    const client = this.clients.get(serverName);
    if (!client) throw new Error(`MCP服务器未连接:${serverName}`);
    return client.callTool({ name: toolName, arguments: args as Record<string, unknown> });
  }

  async resolve(commandName: string): Promise<Command | null> {
    // 将MCP工具名映射为CLI命令
    for (const [server, tools] of this.toolRegistry) {
      const tool = tools.find((t) => t.name === commandName);
      if (tool) {
        return {
          name: commandName,
          source: "mcp",
          description: tool.description ?? "",
          run: async (args) => {
            const result = await this.callTool(server, commandName, args);
            console.log(result.content);
          },
        };
      }
    }
    return null;
  }

  private toolRegistry = new Map<string, Array<{ name: string; description?: string }>>();

  private registerTool(server: string, tool: { name: string; description?: string }) {
    const existing = this.toolRegistry.get(server) ?? [];
    this.toolRegistry.set(server, [...existing, tool]);
  }
}

export const mcpRegistry = new McpRegistry();

5. Authentication Utilities

5. 身份验证工具

typescript
// src/utils/auth.ts (representative pattern)
import fs from "fs";
import path from "path";
import os from "os";

const CONFIG_DIR = path.join(os.homedir(), ".claude");
const CREDENTIALS_FILE = path.join(CONFIG_DIR, "credentials.json");

interface Credentials {
  apiKey?: string;
  sessionToken?: string;
  expiresAt?: string;
}

export function loadCredentials(): Credentials {
  if (!fs.existsSync(CREDENTIALS_FILE)) return {};
  return JSON.parse(fs.readFileSync(CREDENTIALS_FILE, "utf-8"));
}

export function saveCredentials(creds: Credentials): void {
  fs.mkdirSync(CONFIG_DIR, { recursive: true });
  fs.writeFileSync(CREDENTIALS_FILE, JSON.stringify(creds, null, 2), {
    mode: 0o600, // owner read/write only
  });
}

export function getApiKey(): string {
  // Priority: env var > credentials file
  if (process.env.ANTHROPIC_API_KEY) {
    return process.env.ANTHROPIC_API_KEY;
  }
  const creds = loadCredentials();
  if (creds.apiKey) return creds.apiKey;
  throw new Error("No API key found. Run `claude login` or set ANTHROPIC_API_KEY.");
}
typescript
// src/utils/auth.ts (典型模式)
import fs from "fs";
import path from "path";
import os from "os";

const CONFIG_DIR = path.join(os.homedir(), ".claude");
const CREDENTIALS_FILE = path.join(CONFIG_DIR, "credentials.json");

interface Credentials {
  apiKey?: string;
  sessionToken?: string;
  expiresAt?: string;
}

export function loadCredentials(): Credentials {
  if (!fs.existsSync(CREDENTIALS_FILE)) return {};
  return JSON.parse(fs.readFileSync(CREDENTIALS_FILE, "utf-8"));
}

export function saveCredentials(creds: Credentials): void {
  fs.mkdirSync(CONFIG_DIR, { recursive: true });
  fs.writeFileSync(CREDENTIALS_FILE, JSON.stringify(creds, null, 2), {
    mode: 0o600, // 仅所有者可读写
  });
}

export function getApiKey(): string {
  // 优先级:环境变量 > 凭证文件
  if (process.env.ANTHROPIC_API_KEY) {
    return process.env.ANTHROPIC_API_KEY;
  }
  const creds = loadCredentials();
  if (creds.apiKey) return creds.apiKey;
  throw new Error("未找到API密钥,请执行`claude login`或设置ANTHROPIC_API_KEY环境变量。");
}

6. Feature Flags Pattern

6. 功能开关模式

typescript
// src/utils/featureFlags.ts (representative pattern)
// Feature flags are resolved at build time via bun:bundle macros
// and at runtime via environment variables

type FeatureFlag =
  | "ENABLE_MCP_STREAMING"
  | "ENABLE_TASKS_COMMAND"
  | "ENABLE_REVIEW_COMMAND"
  | "ENABLE_REMOTE_CAPABILITIES";

const RUNTIME_FLAGS: Record<FeatureFlag, boolean> = {
  ENABLE_MCP_STREAMING: process.env.CLAUDE_FF_MCP_STREAMING === "1",
  ENABLE_TASKS_COMMAND: process.env.CLAUDE_FF_TASKS === "1",
  ENABLE_REVIEW_COMMAND: process.env.CLAUDE_FF_REVIEW === "1",
  ENABLE_REMOTE_CAPABILITIES: process.env.CLAUDE_FF_REMOTE === "1",
};

export function isEnabled(flag: FeatureFlag): boolean {
  return RUNTIME_FLAGS[flag] ?? false;
}

// Usage in command loader:
// if (isEnabled("ENABLE_TASKS_COMMAND")) {
//   registerCommand(tasksCommand);
// }

typescript
// src/utils/featureFlags.ts (典型模式)
// 功能开关在构建时通过bun:bundle宏解析,运行时通过环境变量解析

type FeatureFlag =
  | "ENABLE_MCP_STREAMING"
  | "ENABLE_TASKS_COMMAND"
  | "ENABLE_REVIEW_COMMAND"
  | "ENABLE_REMOTE_CAPABILITIES";

const RUNTIME_FLAGS: Record<FeatureFlag, boolean> = {
  ENABLE_MCP_STREAMING: process.env.CLAUDE_FF_MCP_STREAMING === "1",
  ENABLE_TASKS_COMMAND: process.env.CLAUDE_FF_TASKS === "1",
  ENABLE_REVIEW_COMMAND: process.env.CLAUDE_FF_REVIEW === "1",
  ENABLE_REMOTE_CAPABILITIES: process.env.CLAUDE_FF_REMOTE === "1",
};

export function isEnabled(flag: FeatureFlag): boolean {
  return RUNTIME_FLAGS[flag] ?? false;
}

// 在命令加载器中的用法:
// if (isEnabled("ENABLE_TASKS_COMMAND")) {
//   registerCommand(tasksCommand);
// }

Commands Documented in Source

源码中记录的命令

CommandDescription
claude login
OAuth/API key authentication flow
claude mcp
Manage MCP server connections
claude review
Code review workflow
claude tasks
Task/todo management
claude config
View and edit configuration

命令描述
claude login
OAuth/API密钥身份验证流程
claude mcp
管理MCP服务器连接
claude review
代码审查工作流
claude tasks
任务/待办事项管理
claude config
查看和编辑配置

Hooks: Terminal State Management

Hooks:终端状态管理

typescript
// src/hooks/useConversation.ts (representative pattern)
import { useState, useCallback, useRef } from "react";
import Anthropic from "@anthropic-ai/sdk";

export function useConversation(sessionId: string) {
  const [messages, setMessages] = useState<Message[]>([]);
  const [isStreaming, setIsStreaming] = useState(false);
  const clientRef = useRef(new Anthropic({ apiKey: process.env.ANTHROPIC_API_KEY }));

  const sendMessage = useCallback(async (content: string) => {
    const userMessage: Message = { role: "user", content };
    setMessages((prev) => [...prev, userMessage]);
    setIsStreaming(true);

    let assistantContent = "";

    try {
      const stream = await clientRef.current.messages.stream({
        model: "claude-opus-4-5",
        max_tokens: 8096,
        messages: [...messages, userMessage].map((m) => ({
          role: m.role,
          content: m.content,
        })),
      });

      for await (const chunk of stream) {
        if (
          chunk.type === "content_block_delta" &&
          chunk.delta.type === "text_delta"
        ) {
          assistantContent += chunk.delta.text;
          setMessages((prev) => {
            const next = [...prev];
            const last = next[next.length - 1];
            if (last?.role === "assistant") {
              next[next.length - 1] = { ...last, content: assistantContent };
            } else {
              next.push({ role: "assistant", content: assistantContent });
            }
            return next;
          });
        }
      }
    } finally {
      setIsStreaming(false);
    }
  }, [messages]);

  return { messages, sendMessage, isStreaming };
}

typescript
// src/hooks/useConversation.ts (典型模式)
import { useState, useCallback, useRef } from "react";
import Anthropic from "@anthropic-ai/sdk";

export function useConversation(sessionId: string) {
  const [messages, setMessages] = useState<Message[]>([]);
  const [isStreaming, setIsStreaming] = useState(false);
  const clientRef = useRef(new Anthropic({ apiKey: process.env.ANTHROPIC_API_KEY }));

  const sendMessage = useCallback(async (content: string) => {
    const userMessage: Message = { role: "user", content };
    setMessages((prev) => [...prev, userMessage]);
    setIsStreaming(true);

    let assistantContent = "";

    try {
      const stream = await clientRef.current.messages.stream({
        model: "claude-opus-4-5",
        max_tokens: 8096,
        messages: [...messages, userMessage].map((m) => ({
          role: m.role,
          content: m.content,
        })),
      });

      for await (const chunk of stream) {
        if (
          chunk.type === "content_block_delta" &&
          chunk.delta.type === "text_delta"
        ) {
          assistantContent += chunk.delta.text;
          setMessages((prev) => {
            const next = [...prev];
            const last = next[next.length - 1];
            if (last?.role === "assistant") {
              next[next.length - 1] = { ...last, content: assistantContent };
            } else {
              next.push({ role: "assistant", content: assistantContent });
            }
            return next;
          });
        }
      }
    } finally {
      setIsStreaming(false);
    }
  }, [messages]);

  return { messages, sendMessage, isStreaming };
}

Environment Variables

环境变量

VariablePurpose
ANTHROPIC_API_KEY
Primary API key for Claude API calls
CLAUDE_FF_MCP_STREAMING
Enable MCP streaming feature flag (
1
/
0
)
CLAUDE_FF_TASKS
Enable tasks command feature flag
CLAUDE_FF_REVIEW
Enable review command feature flag
CLAUDE_FF_REMOTE
Enable remote capabilities feature flag
CLAUDE_CONFIG_DIR
Override default
~/.claude
config directory

变量用途
ANTHROPIC_API_KEY
调用Claude API的主密钥
CLAUDE_FF_MCP_STREAMING
启用MCP流式传输功能开关(
1
/
0
CLAUDE_FF_TASKS
启用tasks命令功能开关
CLAUDE_FF_REVIEW
启用review命令功能开关
CLAUDE_FF_REMOTE
启用远程能力功能开关
CLAUDE_CONFIG_DIR
覆盖默认的
~/.claude
配置目录

Attempting to Run the Recovered Source

尝试运行恢复后的源代码

bash
undefined
bash
undefined

1. Clone the repo

1. 克隆仓库

git clone https://github.com/ponponon/claude_code_src cd claude_code_src
git clone https://github.com/ponponon/claude_code_src cd claude_code_src

2. Add a package.json (not included — must be reconstructed)

2. 新增package.json(仓库未提供,需自行重构)

cat > package.json << 'EOF' { "name": "claude-code-recovered", "version": "2.1.88", "type": "module", "dependencies": { "@anthropic-ai/sdk": "^0.51.0", "ink": "^5.0.0", "react": "^18.0.0", "commander": "^12.0.0" }, "devDependencies": { "typescript": "^5.0.0", "@types/react": "^18.0.0", "@types/node": "^22.0.0" } } EOF
cat > package.json << 'EOF' { "name": "claude-code-recovered", "version": "2.1.88", "type": "module", "dependencies": { "@anthropic-ai/sdk": "^0.51.0", "ink": "^5.0.0", "react": "^18.0.0", "commander": "^12.0.0" }, "devDependencies": { "typescript": "^5.0.0", "@types/react": "^18.0.0", "@types/node": "^22.0.0" } } EOF

3. Install deps

3. 安装依赖

npm install
npm install

4. Set your API key

4. 设置你的API密钥

export ANTHROPIC_API_KEY=your_key_here
export ANTHROPIC_API_KEY=your_key_here

5. Compile (bun:bundle macros will need stubs)

5. 编译(bun:bundle宏需要存根实现)

npx tsc --noEmit # type-check only

> **Note**: The source uses `bun:bundle` macros for feature flag tree-shaking. You'll need to stub these or use Bun to build.

---
npx tsc --noEmit # 仅执行类型检查

> **注意**:源码使用`bun:bundle`宏实现功能开关的tree-shaking,你需要为这些宏编写存根或者使用Bun进行构建。

---

Troubleshooting

问题排查

ProblemSolution
bun:bundle
import errors
Replace with runtime flag checks or use Bun as the build tool
Missing
package.json
Reconstruct from
node_modules
references in source imports
cli.js.map
too large to parse in-memory
Stream-parse with
stream-json
npm package
Tencent mirror link brokenCheck archive.org or other npm mirror caches
TypeScript path aliases unresolvedAdd
paths
to
tsconfig.json
matching the original bundle's alias structure

问题解决方案
bun:bundle
导入错误
替换为运行时开关检查,或使用Bun作为构建工具
缺失
package.json
根据源码导入中的
node_modules
引用重构
cli.js.map
文件过大无法在内存中解析
使用
stream-json
npm包进行流式解析
腾讯镜像链接失效查看archive.org或其他npm镜像缓存
TypeScript路径别名未解析
tsconfig.json
中添加
paths
配置,匹配原始打包的别名结构

Legal Notes

法律说明

  • This repository is not affiliated with Anthropic.
  • Original code copyright belongs to Anthropic.
  • This project is for archival and research purposes only.
  • Do not use recovered code in production or commercial products without proper licensing.
  • 本仓库与Anthropic无任何关联
  • 原始代码版权归Anthropic所有。
  • 本项目仅用于存档和研究目的
  • 未经官方许可,请勿将恢复的代码用于生产或商业产品。