泄露代码里看到的 Claude Code:模块怎么分、数据怎么走

52 阅读5分钟

Claude Code意外泄漏51.2万行TS核心代码

来源:github.com/instructkr/…

备份:github.com/GuiminChen/…

本文档描述本仓库的主要模块划分模块间依赖关系典型数据流。仓库由两部分组成: leak 的 TypeScript / Bun 主程序src/)与 Rust 兼容脚手架rust/),二者在“概念分层”上对齐,但运行时不耦合——Rust 侧通过解析上游 TS 源码完成 harness 验证。


1. 仓库顶层视图

区域角色技术栈
src/可运行的 Claude Code CLI 实现主体TypeScript、Bun、React + Ink
rust/兼容优先的移植地基:注册表/启动阶段与上游事实抽取Rust Cargo workspace

图片


2. TypeScript 主程序:模块划分

根目录 README.md 已给出 src/ 目录树;从架构角度可归纳为下列逻辑分层

2.1 入口与启动

  • src/entrypoints/cli.tsx:轻量 bootstrap。尽量用动态 import() 走「快路径」(如 --version、专用 MCP/守护进程入口),减少冷启动模块加载。
  • src/main.tsx:完整 CLI 与主运行时。顶层即有 并行预热startMdmRawReadstartKeychainPrefetch 等),随后拉取配置、遥测、GrowthBook、策略与远程托管设置等。

两者关系:cli 快路径 → 否则加载完整 main 路径(与 compat-harness 对 cli.tsx 中字符串模式的探测一致)。

2.2 命令与工具(用户意图 vs 模型能力)

模块职责
commands.ts + commands/以 / 开头的斜杠命令:面向用户的交互面(commit、doctor、mcp、compact 等)。
tools.ts + tools/Agent 可调用的工具:Bash、读写文件、Grep/Glob、MCP、子 Agent、Skill 等;带 schema 与权限模型。
Tool.ts工具相关的类型与契约(输入 schema、权限、进度状态等)。

2.3 查询与上下文核心

模块职责
QueryEngine.ts与 LLM API 交互的核心:流式响应工具调用循环、thinking、重试、token 统计等。
context.ts系统/用户上下文拼装
query/查询管线相关逻辑。
cost-tracker.ts费用/token 追踪。

2.4 服务与集成

services/  集中对外部世界与横切能力:

  • api/:Anthropic API、文件 API、bootstrap 等。
  • mcp/:MCP 服务连接与配置。
  • oauth/:OAuth 2.0。
  • lsp/:语言服务。
  • analytics/compact/policyLimits/ 等:遥测、压缩、组织策略等。

2.5 终端 UI 与状态

  • components/hooks/screens/ink/:Ink/React 渲染与全屏界面(如 Doctor、REPL、Resume)。
  • state/:会话与应用状态。

2.6 横切子系统

  • bridge/:与 VS Code / JetBrains 等 IDE 扩展的双向通道(消息、权限回调、REPL bridge、JWT 等)。
  • coordinator/:多 Agent 编排(与 Agent 工具、Team* 工具等配合)。
  • plugins/skills/:插件与 Skill 加载与执行路径。
  • hooks/toolPermission/ 每次工具调用前的权限判定与用户提示(或按模式自动放行)。
  • schemas/migrations/:配置与迁移。
  • memdir/tasks/  等:持久记忆与任务。

2.7 构建期特性

通过 bun:bundle 的 feature()  做死代码剔除,按产品形态裁剪 voice、bridge、daemon、coordinator 等代码路径。


3. TypeScript:模块依赖与数据流(概念)

3.1 依赖关系(由外向内)

图片

  • 命令层可直接触发查询或副作用;工具层主要由 QueryEngine 在模型回合中调度。
  • 权限插在工具执行链上,与 配置/策略(如 policyLimits、托管设置)共同影响是否可执行。

3.2 典型对话数据流(简化)

  1. 输入:用户在 TUI 输入或 IDE 经 bridge 注入消息。
  2. 上下文context、历史、system prompt、services 拉取的策略与特性开关参与拼装。
  3. 模型调用QueryEngine 发起流式请求;可能多轮 tool use
  4. 工具循环:模型返回 tool_call → 经 permission → 执行 tools/* → 结果作为 tool_result 再进入下一轮。
  5. 输出:流式文本与工具结果驱动 Ink 更新;部分能力经 compact 等减负。

3.3 启动数据流(简化)

  1. cli.tsx 判断是否为 version / 专用模式 / daemon worker 等快路径 → 可能直接退出。
  2. 否则进入 main.tsx :并行 MDM / Keychain 等预取, init/initializeTelemetryAfterTrust,加载全局与远程配置。
  3. 构建 工具列表(如 getTools)、模型与 advisor 相关选项,进入 REPL 或子命令路径

4. Rust 工作空间:模块划分

Rust 侧目标在 rust/README.md 中说明:harness-first,先证明能从上游 TS 抽取出可观测事实,再逐步对齐运行时。

4.1 Crate 列表与职责

Crate职责
runtime定义 BootstrapPhase 与 BootstrapPlan(与上游 CLI 启动阶段概念对齐,无 I/O)。
commandsCommandRegistryCommandManifestEntryCommandSource(builtin / internal / feature-gated)。
toolsToolRegistryToolManifestEntryToolSource(base / conditional)。
compat-harness读 src/commands.tssrc/tools.tssrc/entrypoints/cli.tsx解析出上述 manifest 与 bootstrap 阶段;含集成测试。
rusty-claude-cli薄二进制:dump-manifestsbootstrap-plan--help

4.2 Cargo 依赖图

图片

  • commands 与 tools crate 互不依赖(仅共享“清单”形状)。
  • runtime 独立,被 harness 与 CLI 引用。
  • compat-harness 是唯一直接依赖上游文件路径与解析逻辑的 crate。

4.3 Harness 数据流

  1. UpstreamPaths:由 workspace 目录推导 repo 根,定位
    src/commands.tssrc/tools.tssrc/entrypoints/cli.tsx
  2. extract_manifest:读入三份源码字符串。
  3. 命令:扫描 importINTERNAL_ONLY_COMMANDSfeature('...') 条件加载等模式 → CommandRegistry
  4. 工具:扫描 ./tools/ 导入与 feature 门控 → ToolRegistry
  5. Bootstrap:在 cli.tsx 文本中匹配子串(如 --versionstartupProfiler--daemon-worker)→ 构造 BootstrapPlan
  6. rusty-claude-cli dump-manifests :打印条目数量等; bootstrap-plan 打印默认/推断的 phase 列表。

该数据流是 只读、静态 的,用于兼容性与回归验证,不在运行时替代 TypeScript CLI


5. TS 与 Rust 的对应关系(概念映射)

TypeScriptRust(当前里程碑)
commands.ts 注册的命令集合CommandRegistry + harness 解析
tools.ts 注册的工具集合ToolRegistry + harness 解析
entrypoints/cli.tsx 启动分支BootstrapPhase / BootstrapPlan
QueryEngine、完整 REPL尚未在 Rust 中实现

6. 小结

  • 主产品架构是「CLI/Ink UI + QueryEngine + src/tools + services + bridge + 权限」的闭环;数据主线是 用户/IDE 输入 → 上下文 → LLM → 工具调用(带权限)→ 结果回注
  • Rust 子工程是 对齐上游接缝的脚手架:用独立 crate 划清 runtime / commands / tools,由 compat-harness 从 TS 源码抽取清单与启动阶段事实,rusty-claude-cli 暴露开发期命令。
  • 两者通过 目录与命名约定对齐,而非进程内链接;后续若扩展 Rust 运行时,可沿同一 crate 边界生长。

文档基于仓库内 README.mdrust/README.md 与 rust/crates/*/src 源码整理。