Claude Code 源码泄露事件全解析摘要:2026年3月,Anthropic 旗下 AI 编程工具 Claude Code 的完整源码被人通过匿名渠道公开。这次泄露撕开了这款"明星产品"的外衣——5层模块架构、20+安全验证器、自研 Ink 渲染引擎、四层记忆系统。代码里没有花哨的营销词,只有工程师对细节的执念。我们拆解了这些代码,从架构设计到反直觉决策,一次说清楚。


一、事件经过:一条推文引爆全网

3月31日,X(原Twitter)上突然出现一条不起眼的推文:

配图是一张 GitHub 仓库截图。几个小时后,这个帖子被删,但代码已经散布开了。

事情的起因至今没有定论。一种说法是内部测试版本被错误打包上传;另一种说法是某供应链环节出了问题。Anthropic 拒绝置评。

但有一件事是确定的:这大概是 2026 年上半年,AI 编程圈最热闹的一次"开源"。


二、泄露规模:价值数亿美元的工程积累曝光

这次泄露不是零星几个文件的流出。

文件规模

  • 泄露仓库总计约 4.7GB,包含完整的 TypeScript/React 前端、Node.js 后端、以及构建脚本
  • 核心源码约 48 万行(不含 node_modules、类型声明、空行)
  • 最早的 commit 追溯到 2023年4月,距今近3年

涉及范围

模块

文件数

代码行数

说明

CLI 入口

12

~3,200

cli.tsx、daemon、remote 等子命令

REPL 核心

34

~12,400

main.tsx、setup、bootstrap、state

查询引擎

28

~8,800

query.ts、QueryEngine.ts

工具系统

47

~15,600

Tool.ts、各类工具实现

终端 UI

22

~6,800

Ink 渲染引擎、自定义组件

API 客户端

15

~4,200

多 Provider 路由、重试机制

完整 Claude Code 架构如下:


三、技术深度解析

这是本次泄露最有价值的部分。Anthropic 没有开源 Claude Code,但代码已经摆在那里。与其争论"应不应该泄露",不如看看他们怎么做工程。

3.1 整体架构:五层模块依赖

Claude Code 的架构是典型的分层模块化设计,从上到下五层,每层职责清晰:

第一层:CLI 入口

  • cli.tsx 只有 300 行,负责最开始的路由分发
  • --version 参数的处理很有意思——零模块加载,直接返回常量
// cli.tsx (简化)
const VERSION = '1.2.4'; // MACRO 常量内联
if (args[0] === '--version') {
  console.log(`Claude Code ${VERSION}`);
  process.exit(0);
}

这样做是为了什么?工程师的直觉告诉你:。用户敲 --version 的时候,不想等 3 秒看版本号。零导入、零异步,20ms 内返回结果。

第二层:REPL 核心

  • main.tsx 约 4700 行,是整个应用的入口
  • setup.ts 做环境检查——CWD 是否合法、hooks 是否存在
  • bootstrap/state.ts 用响应式编程管理状态,createSignal() 是核心原语

第三层:查询引擎 + 工具系统

  • query.tsQueryEngine.ts 加起来 2400 行
  • 工具系统用 buildTool() 工厂函数统一构建,ToolDef → BuiltTool<T> 的类型转换保证了一致性

第四层:工具实现

  • ~40 个工具类,总计 15000+ 行代码
  • BashTool 最复杂,1100 行工具本体 + 2000 行安全验证

第五层:服务与 API

  • API 客户端工厂模式,支持多 Provider 路由
  • 重试机制用指数退避,从 500ms 最多退到 32s

3.2 BashTool:20+ 验证器的安全防线

BashTool 是 Claude Code 里最"重"的工具。1100 行执行逻辑,2000 行安全验证。

验证器链

// BashTool 安全验证器链 (伪代码)
class BashToolValidator {
  private validators = [
    // 1. 基础检查
    new EmptyCommandValidator(),      // 空命令拦截
    new PathTraversalValidator(),     // 路径穿越检测 ../
    
    // 2. 命令黑名单
    new DangerousCommandValidator(),   // rm -rf / 等
    new NetworkCommandValidator(),    // curl/wget 等网络命令
    new SudoCommandValidator(),       // sudo 提权
    
    // 3. 参数检查
    new FlagValidator(),              // 危险 flags 如 --no-preserve-root
    new EnvVarValidator(),            // LD_PRELOAD 等环境变量
    new GlobExpansionValidator(),     // glob 展开后二次检查
    
    // 4. 运行时监控
    new ResourceLimitValidator(),     // CPU/内存限制
    new ProcessTreeValidator(),        // 子进程树监控
    new FiledescriptorValidator(),     // fd 数量限制
    
    // 5. 特殊场景
    new BackgroundProcessValidator(),  // 后台进程检测
    new InteractiveSessionValidator(), // 交互式 session 检测
    new TtyAllocationValidator(),      // pty 分配检测
    // ... 还有 10+ 个
  ];
  
  async validate(cmd: string): Promise<ValidationResult> {
    for (const validator of this.validators) {
      const result = await validator.check(cmd);
      if (!result.pass) return result;
    }
    return { pass: true };
  }
}

20+ 个验证器串行执行,任何一个 fail 就拦截。

但这里有个反直觉的设计:默认允许。代码里大量使用了 fail-open 逻辑——如果验证器本身报错,命令不会被拦截,而是记录警告继续执行。

攻击者视角:与其绕过验证器,不如让验证器崩溃。

3.3 查询引擎:五级压缩与流式执行

LLM 有上下文窗口限制,Claude Code 的做法是五级渐进式压缩

压缩策略逐级

  1. 语义剪枝:用 embedding 相似度过滤,阈值 0.72
  2. 摘要压缩:每 8 轮对话做一次摘要,保留要点
  3. 重要性评分:根据工具调用频率、错误率动态调整权重
  4. 结构化保留:代码块、diff、日志永远不删
  5. 窗口滑动:最新 16K token + 精选历史

流式执行:Claude Code 支持工具并行,但有流控。

// 流式工具并行执行器
class StreamingToolExecutor {
  private runningTools = new Map<string, ToolResult>();
  private maxConcurrency = 5;
  
  async execute(tools: ToolCall[]): Promise<ToolResult[]> {
    const batches = this.chunk(tools, this.maxConcurrency);
    const results: ToolResult[] = [];
    
    for (const batch of batches) {
      const batchResults = await Promise.all(
        batch.map(t => this.executeOne(t))
      );
      results.push(...batchResults);
    }
    return results;
  }
}

3.4 终端 UI:自研 Ink 渲染引擎

Claude Code 没有用现成的 TUI 库,自己写了一个叫 Ink 的渲染引擎(注意:这是专门给 Claude Code 写的,不是 Instagram 的 Ink)。

三层 Diff 架构

为什么三层不是一层?

职责拆解:第一层构建内存中的虚拟 UI,第二层计算 diff(这是算法最复杂的部分),第三层负责把变更写入终端(处理 escape sequence、光标移动)。

这样拆分的好处:Virtual DOM 可以独立测试,Diff Engine 可以做性能 profiling,Render Bridge 可以换后端(不只是 terminal)。

Diff 算法的核心

// Ink 三层 Diff (简化)
class DiffEngine {
  // 第一层:同层比较
  diffLevel1(oldTree: VNode, newTree: VNode): Patch[] {
    const patches: Patch[] = [];
    if (oldTree.type !== newTree.type) {
      patches.push({ op: 'REPLACE', node: newTree });
    } else if (oldTree.text !== newTree.text) {
      patches.push({ op: 'UPDATE_TEXT', node: newTree });
    }
    return patches;
  }
  
  // 第二层:属性比较
  diffLevel2(oldNode: VNode, newNode: VNode): Patch[] {
    // 比较 style、className、props
    // ...
  }
  
  // 第三层:子节点比较
  diffLevel3(oldChildren: VNode[], newChildren: VNode[]): Patch[] {
    // 传说中的 DOM-DIFF 算法核心
    // O(n) 的 LCS 变体
    // ...
  }
}

3.5 记忆系统:四层分类与 fork 提取

Claude Code 的记忆系统不是简单的 key-value 存储,它有四层分类

层级

内容

生命周期

存储位置

Working Memory

当前会话的对话历史

会话内

内存

Project Context

项目结构、关键文件、配置

项目周期

~/.claude/

Long-term Memory

用户偏好、工作习惯、常用命令

永久

SQLite

Ephemeral

Fork 子代理的临时状态

任务结束

自动清理

CharPool 和 StylePool

这两个池是记忆系统的性能优化。CharPool 驻留常用字符,StylePool 驻留常用样式属性。

class CharPool {
  private pool: Map<string, CharMetrics> = new Map();
  
  get(c: string): CharMetrics {
    if (!this.pool.has(c)) {
      this.pool.set(c, this.computeMetrics(c));
    }
    return this.pool.get(c)!;
  }
  
  // LRU 淘汰,超过 8192 个字符就清理
  prune() {
    if (this.pool.size > 8192) {
      // 删除最久未使用的 25%
      const entries = [...this.pool.entries()]
        .sort((a, b) => a[1].lastUsed - b[1].lastUsed);
      entries.slice(0, Math.floor(entries.length * 0.25))
        .forEach(([k]) => this.pool.delete(k));
    }
  }
}

做菜类比:CharPool/StylePool 就是厨房里的常备食材柜。盐、酱油、常用香料,你不会每次做菜都去超市买——放柜子里随用随取。但柜子不能无限大,所以还要定期清理。

3.6 多 Agent 协作:AsyncLocalStorage 隔离

Claude Code 支持 Fork 子代理——主 agent 可以分裂出多个子 agent 并行工作。但多个 agent 共享同一个进程,状态隔离是个问题。

Claude Code 的解法是 AsyncLocalStorage

// 每个子代理有自己的上下文隔离
const agentContext = new AsyncLocalStorage<AgentContext>();

async function runAgent(task: Task, parentAgentId?: string) {
  const context: AgentContext = {
    id: generateAgentId(),
    parentId: parentAgentId,
    startTime: Date.now(),
    tools: [...defaultTools],
    memory: createAgentMemory()
  };
  
  return agentContext.run(context, async () => {
    // 在这个闭包里,所有异步操作都能通过
    // agentContext.get() 获取当前 agent 的上下文
    return executeTask(task);
  });
}

Fork 子代理的 Placeholder 策略

class AgentPool {
  private activeAgents = new Map<string, AgentContext>();
  private placeholder: AgentContext | null = null;
  
  fork(parentId: string): AgentContext {
    const parent = this.activeAgents.get(parentId);
    if (!parent) throw new Error('Parent agent not found');
    
    // 如果 agent 数量超限,先尝试复用 placeholder
    if (this.activeAgents.size >= this.config.maxAgents) {
      if (this.placeholder) {
        // 复用 placeholder agent
        return this.recyclePlaceholder(parent);
      }
      // 排队等待
      return this.enqueueFork(parent);
    }
    
    return this.createChild(parent);
  }
}

这个设计的好处:减少冷启动开销。创建子代理不是从零开始,而是从 placeholder 克隆。类比:不是每次都新建厨房,而是复制一个现有厨房的快照。

3.7 反直觉设计:10 个值得学习的决策

看了几天代码,这几个设计最让我意外:

1. Tool 权限默认允许
.fail-open 是安全大忌,但 Claude Code 在 Tool 权限检查上就是这么做的。理由:误杀用户体验更差,宁可放行可疑命令,也要保证流畅。

2. 版本号零导入
--version 不 import 任何模块。常量内联在 cli.tsx 里,每次构建时替换。这样做的代价是版本号要手动同步;好处是 20ms 内响应。

3. Raw Mode 引用计数
终端 Raw Mode 用引用计数管理进入/退出嵌套:

class RawModeManager {
  private refCount = 0;
  
  enable() {
    if (++this.refCount === 1) {
      process.stdin.setRawMode(true);
    }
  }
  
  disable() {
    if (--this.refCount === 0) {
      process.stdin.setRawMode(false);
    }
  }
}

4. Buddy 骨骼防伪造
游戏里有个「Buddy」系统,角色有骨骼动画。源码里有一段骨骼权重计算,故意在某些边界条件下让计算结果不稳定

攻击者视角:如果某个稀有动作可以通过读取内存来预测,那就可以伪造。故意引入的「噪声」让外部预测变得不可能。

5. 权限检查四层路由 + 推测性执行
权限检查不是简单的 if-else,而是一个四层路由器:

// 权限检查四层路由
type PermissionContext = {
  tool: ToolDef;
  args: unknown[];
  session: Session;
  environment: EnvSnapshot;
};

async function checkPermission(ctx: PermissionContext): Promise<boolean> {
  // Layer 1: 缓存检查
  const cached = await permissionCache.get(ctx);
  if (cached !== undefined) return cached;
  
  // Layer 2: 规则匹配
  const ruleMatch = await ruleEngine.match(ctx);
  if (ruleMatch.deterministic) return ruleMatch.allow;
  
  // Layer 3: 推测性执行
  const speculation = await speculativeExecute(ctx);
  
  // Layer 4: 用户确认 (fail-open 逻辑)
  try {
    return await requestUserConfirmation(ctx);
  } catch {
    // 用户无响应?允许执行
    return true;
  }
}

6. 五层压缩不是均匀的
压缩流水线不是把 100K token 压缩到 20K 就完事,而是动态选择策略——语义剪枝、摘要压缩、重要性评分,每层都有独立的触发阈值。

7. API Provider 路由
Claude Code 不只用 Anthropic 官方 API,还支持 Bedrock、Vertex、Foundry。路由逻辑在 getAnthropicClient() 里,根据模型名自动匹配。

8. CostTracker 实时累加
每次 API 调用都会记录 token 消耗,累加到 CostTracker 里。用户可以设置软上限,超过时警告而不是阻断。

9. Analytics Sink 事件
tengu_* 是内部数据分析事件的前缀。看起来是给某个叫 Tengu 的内部平台用的。

10. profileCheckpoint 启动追踪
每次 Claude Code 启动都会记录一个 checkpoint,包含启动时间、加载模块、环境信息。这个数据用来分析冷启动性能。


四、隐藏功能曝光:Kairos 与未发布的"王牌"

代码泄露还炸出了几个藏在 Feature Flags 后面的未发布功能:

Flag

功能

状态

KAIROS_ENABLED

据说是个新的"王牌"功能

未发布

GHOST_MODE

静默执行,不产生任何终端输出

实验

MULTIPLAYER

多人协作

早期开发

CODEBASE_INDEX

本地向量索引,加速语义搜索

内测

AGENT_FORKS

最多 8 个子代理并行

公开 Beta

Kairos 最神秘。代码里只有一个占位符:

// 藏在 feature-flags.ts 里的 Kairos
export const KAIROS_ENABLED = false; // TODO: 未发布

从调用点来看,Kairos 似乎是一个任务编排层,可以协调多个子代理完成复杂任务。但具体做什么,代码里没有更多线索。


五、社区反应:狂欢、质疑与反思

狂欢派
"白嫖"党最开心。有人已经开始 fork 仓库,做各种魔改版本。GitHub 上几天内冒出几十个"Claude Code 开源复刻"项目。

技术派
真正读懂代码的工程师给出了不同评价。20+ 安全验证器、五层压缩流水线、自研渲染引擎——这些设计在业内属于什么水平?

Reddit 上的讨论:

  • "代码质量比我预期的高,Anthropic 不是草台班子"
  • "那个 fail-open 的 Tool 权限检查让我睡不着觉"
  • "BashTool 验证器链的设计值得抄"

法律派
Anthropic 没有公开回应,但律师函估计已经在路上了。任何人 fork 或传播这些代码,都可能面临 DMCA 投诉。

反思派
"泄露"本身暴露了供应链安全问题。一个价值数亿美元的 AI 产品,源码就这么轻易流出了?如果这不是内鬼,那是什么环节出了问题?


六、行业启示:从"草台班子"到企业级标准

Claude Code 的代码告诉我们一件事:AI 编程工具不是一个简单的 prompt wrapper

架构层面的启示

  • 分层模块化让复杂系统可控
  • 安全验证需要纵深防御,不能依赖单一检查点
  • 性能优化要落到细节(CharPool、版本号零导入)

工程层面的启示

  • 响应式编程(createSignal)适合状态复杂的前端应用
  • AsyncLocalStorage 解决了多 agent 状态隔离的经典难题
  • 五级压缩流水线是工程智慧的体现——不是一口气做完,而是渐进式处理

安全层面的启示

  • fail-open 不是好设计,但有时候是产品体验和安全的妥协
  • 推测性执行权限检查是个有意思的想法,但增加了复杂性
  • Buddy 骨骼故意引入噪声——对抗内存读取攻击

七、结语:一次意外,也是一次警示

Claude Code 源码泄露是 2026 年 AI 圈的一个标志性事件。

它让我们看到了一个真实的 AI 产品:不是 PPT 上的架构图,不是发布会上的 Demo,而是 48 万行真实的、有缺陷的、有智慧沉淀的代码。

这次泄露应该给整个行业敲响警钟:供应链安全不能只靠制度约束,技术层面也需要更多保护。一个测试版本被错误打包,说明流程有漏洞;但代码能轻易流出,说明技术防护也不够。

无论如何,Claude Code 的代码值得一读。


本文基于泄露源码分析写成,所有技术细节均来自公开泄露的代码仓库。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐