Claude Code 源码解析
事件背景: 2026-03-31,Anthropic 在 npm 包发布时因
.npmignore配置缺失,导致 59.8 MB source map 被误打包,泄露 512,000 行 TypeScript 源码(约 1,900 个文件)。此报告基于泄露源码的社区反编译版本claude-code-best/claude-code进行深度技术分析。
目录
- 事件概述
- 核心架构解析
- 工具系统详解
- 命令系统目录
- 隐藏功能模块
- 权限与安全机制
- Feature Flags 与 Beta Headers
- 多模型 API 支持
- Native Packages 分析
- 关键设计模式
- 架构启示与风险评估
- 设计优缺点深度分析
1. 事件概述
1.1 泄露事件详情
| 属性 | 值 |
|---|---|
| 泄露时间 | 2026-03-31 |
| 泄露版本 | Claude Code v2.1.88 |
| 泄露规模 | 59.8 MB, 512,000 行 TypeScript, ~1,900 文件 |
| 泄露原因 | .npmignore 配置缺失,source map 被打包 |
| 泄露性质 | 非黑客攻击,纯运维配置失误 |
1.2 社区反编译仓库
主要分析仓库:claude-code-best/claude-code
| 属性 | 值 |
|---|---|
| Stars | 5,915+ ⭐ |
| Forks | 7,495+ 🍴 |
| 描述 | 原汁原味 Claude Code 可运行版;Bun 可编译执行 |
| 语言 | TypeScript |
| Runtime | Bun >= 1.3.11 |
| UI 框架 | React + Ink (终端渲染) |
1.3 项目基本信息
// 从源码提取的核心配置
总代码行数: 512,000+
源文件数量: 1,900+
命令数量: 101
工具数量: 52
npm 包名: @anthropic-ai/claude-code
2. 核心架构解析
2.1 整体架构图
┌─────────────────────────────────────────────────────────────────┐
│ 用户输入层 │
│ (Terminal / SDK / Cowork / Desktop / Mobile) │
└─────────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────┐
│ 命令解析层 │
│ src/commands/ (101 个子目录) │
│ - /add-dir, /compact, /doctor, /resume, /status, ... │
└─────────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────┐
│ QueryEngine │
│ src/QueryEngine.ts (核心会话引擎) │
│ - 管理对话状态与归因 │
│ - 处理消息持久化 │
│ - 控制压缩与边界 │
└─────────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────┐
│ query.ts │
│ src/query.ts (流式对话循环, 1700+ 行) │
│ - 流式 API 调用 │
│ - 工具执行编排 │
│ - 自动压缩触发 │
│ - Token 预算控制 │
└─────────────────────────────────────────────────────────────────┘
│
┌───────────────┼───────────────┐
▼ ▼ ▼
┌──────────────────┐ ┌──────────────────┐ ┌──────────────────┐
│ 权限系统 │ │ 工具系统 │ │ 服务层 │
│ permissions/ │ │ tools/ (52个) │ │ services/ │
│ - plan/auto/man │ │ - BashTool │ │ - api/ │
│ - YOLO Classifier│ │ - FileEditTool │ │ - mcp/ │
│ - 路径验证 │ │ - AgentTool │ │ - autoDream/ │
│ │ │ - WebFetchTool │ │ - compact/ │
└──────────────────┘ └──────────────────┘ └──────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────┐
│ 多模型 API 层 │
│ - Anthropic Direct (API Key + OAuth) │
│ - AWS Bedrock (凭据刷新, Bearer Token) │
│ - Google Vertex (GCP 凭据) │
│ - Azure Foundry (API Key + Azure AD) │
└─────────────────────────────────────────────────────────────────┘
2.2 QueryEngine 核心实现
源码位置: src/QueryEngine.ts
核心职责:
- 管理对话生命周期和会话状态
- 处理消息持久化与恢复
- 控制压缩边界(compact boundary)
- 跟踪权限拒绝(permission denials)
- 管理 Token 使用统计
关键代码片段:
export class QueryEngine {
private config: QueryEngineConfig
private mutableMessages: Message[]
private abortController: AbortController
private permissionDenials: SDKPermissionDenial[]
private totalUsage: NonNullableUsage
private hasHandledOrphanedPermission = false
private readFileState: FileStateCache
// 核心方法:提交消息并处理流式响应
async *submitMessage(
prompt: string | ContentBlockParam[],
options?: { uuid?: string; isMeta?: boolean },
): AsyncGenerator<SDKMessage, void, unknown> {
// 1. 构建系统提示词
const systemPrompt = asSystemPrompt([
...defaultSystemPrompt,
...memoryMechanicsPrompt,
...appendSystemPrompt,
])
// 2. 处理用户输入
const { messages, shouldQuery, allowedTools } = await processUserInput(...)
// 3. 持久化用户消息(支持 resume)
await recordTranscript(messages)
// 4. 进入 query 循环
for await (const message of query({
messages,
systemPrompt,
canUseTool: wrappedCanUseTool,
...
})) {
yield message
}
}
}
2.3 query.ts 流式循环
源码位置: src/query.ts (1700+ 行)
核心流程:
async function* queryLoop(params: QueryParams) {
let state: State = {
messages: params.messages,
toolUseContext: params.toolUseContext,
autoCompactTracking: undefined,
maxOutputTokensRecoveryCount: 0,
...
}
while (true) {
// 1. 应用压缩策略(snip → microcompact → autocompact)
messagesForQuery = await applyCompactionStrategies(messagesForQuery)
// 2. 调用模型 API
for await (const message of deps.callModel({
messages: messagesForQuery,
systemPrompt: fullSystemPrompt,
tools: toolUseContext.options.tools,
...
})) {
yield message
if (message.type === 'assistant') {
// 收集 tool_use 块
toolUseBlocks.push(...extractToolUseBlocks(message))
needsFollowUp = true
}
}
// 3. 执行工具调用
if (needsFollowUp) {
const toolResults = await executeTools(toolUseBlocks, ...)
state.messages.push(...assistantMessages, ...toolResults)
continue // 递归继续对话
}
// 4. 检查停止条件
if (!needsFollowUp) {
// 处理 max_output_tokens 恢复
// 处理 prompt-too-long 恢复
// 执行 stop hooks
return { reason: 'completed' }
}
}
}
3. 工具系统详解
3.1 工具分类总览
总计: 52 个工具,分为 4 类
| 分类 | 数量 | 说明 |
|---|---|---|
| 始终可用 | 28 | 核心工具,无条件启用 |
| 条件启用 | 12 | 需特定环境变量或 Feature Flag |
| Feature Flag 关闭 | 12 | 需要 Beta Header 或 Gate |
| Anthropic 内部专用 | 4 | USER_TYPE === 'ant' |
3.2 始终可用工具清单
| 工具名 | 功能说明 |
|---|---|
BashTool | Shell 命令执行,沙箱隔离,权限检查 |
FileReadTool | 文件读取(支持 PDF/图片/Notebook) |
FileEditTool | 字符串替换式编辑 + diff 追踪 |
FileWriteTool | 文件创建/覆写 + diff 生成 |
NotebookEditTool | Jupyter Notebook 单元格编辑 |
AgentTool | 子代理派生(fork/async/background/remote) |
WebFetchTool | URL 抓取 → Markdown → AI 摘要 |
WebSearchTool | 网页搜索 + 域名过滤 |
AskUserQuestionTool | 多问题交互提示 + 预览 |
SendMessageTool | 消息发送(peers/teammates/mailbox) |
SkillTool | 斜杠命令/Skill 调用 |
TodoWriteTool | Todo 列表管理 |
BriefTool | 简短消息 + 附件发送 |
TaskOutputTool | 后台任务输出读取 |
TaskStopTool | 后台任务停止 |
EnterPlanModeTool | 进入计划模式 |
ExitPlanModeV2Tool | 退出计划模式 |
EnterWorktreeTool | 进入 Git Worktree |
ExitWorktreeTool | 退出 Git Worktree |
CronCreateTool | 定时任务创建 |
CronDeleteTool | 定时任务删除 |
CronListTool | 定时任务列表 |
ListMcpResourcesTool | MCP 资源列表 |
ReadMcpResourceTool | MCP 资源读取 |
GlobTool | 文件模式匹配(无嵌入式搜索工具时) |
GrepTool | 文件内容搜索(无嵌入式搜索工具时) |
ToolSearchTool | 工具搜索(条件启用) |
3.3 条件启用工具
| 工具名 | 启用条件 |
|---|---|
TaskCreateTool | isTodoV2Enabled() 为 true |
TaskGetTool | isTodoV2Enabled() 为 true |
TaskUpdateTool | isTodoV2Enabled() 为 true |
TaskListTool | isTodoV2Enabled() 为 true |
TeamCreateTool | isAgentSwarmsEnabled() |
TeamDeleteTool | isAgentSwarmsEnabled() |
ToolSearchTool | isToolSearchEnabledOptimistic() |
PowerShellTool | Windows 平台检测 |
LSPTool | ENABLE_LSP_TOOL 环境变量 |
3.4 Feature Flag 关闭工具
| 工具名 | Feature Flag |
|---|---|
SleepTool | PROACTIVE / KAIROS |
SendUserFileTool | KAIROS |
PushNotificationTool | KAIROS / KAIROS_PUSH_NOTIFICATION |
SubscribePRTool | KAIROS_GITHUB_WEBHOOKS |
WorkflowTool | WORKFLOW_SCRIPTS |
MonitorTool | MONITOR_TOOL |
WebBrowserTool | WEB_BROWSER_TOOL |
RemoteTriggerTool | AGENT_TRIGGERS_REMOTE |
OverflowTestTool | OVERFLOW_TEST_TOOL |
TerminalCaptureTool | TERMINAL_PANEL |
SnipTool | HISTORY_SNIP |
ListPeersTool | UDS_INBOX |
CtxInspectTool | CONTEXT_COLLAPSE |
3.5 Anthropic 内部专用工具
| 工具名 | 条件 |
|---|---|
ConfigTool | USER_TYPE === 'ant' |
TungstenTool | ANT-ONLY stub |
REPLTool | isEnabled: () => false |
SuggestBackgroundPRTool | ANT-ONLY stub |
3.6 tools.ts 工具注册机制
// src/tools.ts
export function getAllBaseTools(): Tools {
return [
AgentTool,
TaskOutputTool,
BashTool,
// 嵌入式搜索工具检测
...(hasEmbeddedSearchTools() ? [] : [GlobTool, GrepTool]),
ExitPlanModeV2Tool,
FileReadTool,
FileEditTool,
FileWriteTool,
NotebookEditTool,
WebFetchTool,
TodoWriteTool,
WebSearchTool,
TaskStopTool,
AskUserQuestionTool,
SkillTool,
EnterPlanModeTool,
// Ant-only 工具
...(process.env.USER_TYPE === 'ant' ? [ConfigTool, TungstenTool] : []),
// Feature-gated 工具
...(SleepTool ? [SleepTool] : []),
...cronTools,
...(WorkflowTool ? [WorkflowTool] : []),
...(isAgentSwarmsEnabled() ? [TeamCreateTool, TeamDeleteTool] : []),
...
]
}
// 按权限过滤
export function getTools(permissionContext: ToolPermissionContext): Tools {
const tools = getAllBaseTools()
return filterToolsByDenyRules(tools, permissionContext)
.filter(tool => tool.isEnabled())
}
4. 命令系统目录
4.1 命令总数:101 个
源码位置: src/commands/
4.2 核心命令分类
| 分类 | 命令示例 |
|---|---|
| 会话管理 | /clear, /resume, /compact, /export, /rewind |
| 配置管理 | /config, /model, /effort, /fast, /theme |
| 诊断工具 | /doctor, /status, /cost, /usage, /extra-usage |
| 权限控制 | /permissions, /plan |
| Git 集成 | /commit, /branch, /pr, /review, /fork |
| MCP 集成 | /mcp, /desktop, /chrome |
| 开发者工具 | /debug-tool-call, /perf-issue, /heapdump |
| 隐藏功能 | /buddy, /assistant, /ultraplan, /coordinator |
4.3 完整命令列表
/add-dir /advisor /agents /ant-trace
/assistant /autofix-pr /backfill /branch
/break-cache /bridge /brief /btw
/buddy /bughunter /chrome /clear
/color /commit /compact /config
/context /copy /cost /desktop
/diff /doctor /effort /env
/exit /export /fast /feedback
/files /fork /good-claude /heapdump
/help /hooks /ide /init
/insights /install /issue /keybindings
/login /logout /mcp /memory
/mobile /model /oauth-refresh /onboarding
/output-style /passes /peers /perf-issue
/permissions /plan /plugin /pr-comments
/privacy /rate-limit /release-notes /reload-plugins
/remote-env /remote-setup /rename /reset-limits
/resume /review /rewind /sandbox-toggle
/security /session /share /skills
/stats /status /stickers /summary
/tag /tasks /teleport /terminalSetup
/theme /thinkback /ultraplan /upgrade
/usage /version /vim /voice
/workflows
5. 隐藏功能模块
5.1 BUDDY 电子宠物系统 🎮
源码位置: src/buddy/
核心文件:
types.ts- 类型定义(18物种/5稀有度/6眼睛/8帽子)companion.ts- 核心生成逻辑(Mulberry32 PRNG)sprites.ts- ASCII 精灵动画(5行×12字)CompanionSprite.tsx- UI 组件
5.1.1 物种系统(18种)
// 使用 String.fromCharCode 混淆绕过关键词检测
const c = String.fromCharCode
export const duck = c(0x64,0x75,0x63,0x6b) as 'duck'
export const goose = c(0x67,0x6f,0x6f,0x73,0x65) as 'goose'
export const dragon = c(0x64,0x72,0x61,0x67,0x6f,0x6e) as 'dragon'
export const cat = c(0x63,0x61,0x74) as 'cat'
export const axolotl = c(0x61,0x78,0x6f,0x6c,0x6f,0x74,0x6c) as 'axolotl'
export const capybara = c(0x63,0x61,0x70,0x79,0x62,0x61,0x72,0x61) as 'capybara'
// ... 共 18 种
export const SPECIES = [
duck, goose, blob, cat, dragon, octopus, owl, penguin,
turtle, snail, ghost, axolotl, capybara, cactus, robot,
rabbit, mushroom, chonk
] as const
5.1.2 稀有度权重系统
export const RARITY_WEIGHTS = {
common: 60, // 60%
uncommon: 25, // 25%
rare: 10, // 10%
epic: 4, // 4%
legendary: 1 // 1%
} as const
5.1.3 属性系统(5维)
export const STAT_NAMES = [
'DEBUGGING', // 调试能力
'PATIENCE', // 耐心程度
'CHAOS', // 混沌倾向
'WISDOM', // 智慧等级
'SNARK' // 讽刺指数
] as const
5.1.4 外观定制
- 眼睛样式: 6 种 →
['·', '✦', '×', '◉', '@', '°'] - 帽子样式: 8 种 →
['none', 'crown', 'tophat', 'propeller', 'halo', 'wizard', 'beanie', 'tinyduck'] - Shiny 概率: 1%(独立于稀有度)
5.1.5 确定性生成机制
// companion.ts
function mulberry32(seed: number): () => number {
let a = seed >>> 0
return function () {
a |= 0
a = (a + 0x6d2b79f5) | 0
let t = Math.imul(a ^ (a >>> 15), 1 | a)
t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t
return ((t ^ (t >>> 14)) >>> 0) / 4294967296
}
}
const SALT = 'friend-2026-401'
export function roll(userId: string): Roll {
const key = userId + SALT
const value = rollFrom(mulberry32(hashString(key)))
return value
}
关键特性:
- 基于用户 ID 的确定性生成(同一用户永远得到同一宠物)
- Bones(外观属性)不持久化,防止伪造稀有度
- Soul(性格描述)由 Claude 生成并持久化
5.1.6 发布时间线
- 预告期: 2026年4月1-7日
- 正式上线: 2026年5月
- Feature Flag:
feature('BUDDY')
5.2 KAIROS 常驻助手模式 🔒
源码位置: src/assistant/, src/proactive/
核心机制:
- 不被动等待用户输入,主动监控状态并执行任务
- 定期发送隐藏
<tick>prompt 触发主动行为 - 15秒阻塞预算:超过限制的操作被延迟
专属工具链:
SendUserFileTool- 主动发送处理好的文件PushNotificationTool- 触发系统级通知SubscribePRTool- 订阅 GitHub PR 动态
状态标记:
- 命令:
/proactive,/brief,/assistant - Feature Flags:
feature('PROACTIVE'),feature('KAIROS')
5.3 ULTRAPLAN 30分钟深度规划 🔒
源码位置: src/commands/ultraplan.tsx, src/utils/ultraplan/
核心机制:
- 将复杂任务卸载到云端 CCR (Cloud Compute Resources) 会话
- 运行 Opus 4.6(内部代号 Tengu)
- 本地终端 3 秒轮询,实时同步云端进度
- 最大运行时间:30 分钟
Teleport 机制:
- 通过 sentinel 标记
__ULTRAPLAN_TELEPORT_LOCAL__回传结果 - Gate 控制:
tengu_ultraplan_model
5.4 Dream System 自动做梦 🔒
源码位置: src/services/autoDream/
核心文件:
autoDream.ts- 后台记忆整理引擎config.ts- 配置参数consolidationPrompt.ts- 整合提示词consolidationLock.ts- 分布式锁机制
三重触发门槛:
// 1. 时间门:距上次做梦 > 24 小时
const hoursSince = (Date.now() - lastAt) / 3_600_000
if (hoursSince < cfg.minHours) return
// 2. 会话门:新会话数 >= 5
const sessionsTouched = await listSessionsTouchedSince(lastAt)
if (sessionsTouched.length < cfg.minSessions) return
// 3. 锁门:获取 consolidation 锁
if (!await tryAcquireConsolidationLock()) return
梦境四阶段:
- Orient (定位) - 扫描记忆目录,读取 MEMORY.md
- Gather (收集) - 从 JSONL 日志提取关键信息
- Consolidate (整合) - 整合到主题文件,转换相对时间
- Prune (修剪) - 强制限制 MEMORY.md ≤ 200行/25KB
安全约束:
- Dream 子 Agent 仅拥有只读 Bash 权限
- 无法修改项目代码,只能操作
memory目录 - Gate:
tengu_onyx_plover
5.5 Coordinator 多 Agent 编排 🔒
源码位置: src/coordinator/coordinatorMode.ts
核心机制:
- 将当前实例转变为调度器 (Orchestrator)
- 并行启动和管理多个 Worker 子进程
- 通过
<task-notification>XML 通信
编排流程:
Research → 并行启动多个 Worker 调研不同模块
Synthesis → Coordinator 汇总 Worker 结果,生成执行方案
Implementation → Worker 并行执行代码修改
Verification → Worker 独立验证修改结果
Worker 工具链:
// coordinatorMode.ts
const workerTools = isEnvTruthy(process.env.CLAUDE_CODE_SIMPLE)
? [BASH_TOOL_NAME, FILE_READ_TOOL_NAME, FILE_EDIT_TOOL_NAME]
: Array.from(ASYNC_AGENT_ALLOWED_TOOLS)
.filter(name => !INTERNAL_WORKER_TOOLS.has(name))
开启方式: CLAUDE_CODE_COORDINATOR_MODE=1
5.6 Undercover Mode 卧底模式 🔒
源码位置: src/utils/undercover.ts
设计目的:
- Anthropic 员工专用安全机制
- 防止在公开仓库提交时泄露内部机密
运行规则:
- 自动检测非白名单仓库 → 强制开启
- 无法手动关闭
过滤清单:
- 内部代号:Tengu, Capybara, Plover
- 未发布版本:Opus 4.7, Sonnet 4.8
- 身份标识:禁止 "Claude Code" 字样、AI 自述
5.7 内部代号曝光
从源码和 undercover.ts 逆向分析确认:
| 代号 | 含义 |
|---|---|
| Tengu (天狗) | Claude Code 核心项目代号 |
| Capybara (水豚) | 特定模型版本代号 |
| Plover (鸻) | 记忆系统 (Dream System) 相关 |
| CCR | Cloud Compute Resources(云端计算资源) |
6. 权限与安全机制
6.1 权限模式
源码位置: src/utils/permissions/
三种模式:
| 模式 | 说明 |
|---|---|
plan | 计划模式,所有变更需预先批准 |
auto | 自动模式,YOLO Classifier 自动审批低风险操作 |
manual | 手动模式,所有操作需用户确认 |
6.2 YOLO Classifier 自动审批
源码位置: src/utils/permissions/yoloClassifier.ts
工作机制:
- 实时分析对话副本 (Transcript)
- 自动判定操作风险等级
- 低风险读操作或琐碎修改 → 自动批准
6.3 路径验证
源码位置: src/utils/permissions/pathValidation.ts
验证规则:
- 检查路径是否在允许的工作目录内
- 防止目录遍历攻击
- 沙箱隔离
6.4 权限规则解析
源码位置: src/utils/permissions/permissionRuleParser.ts
支持:
- 白名单/黑名单规则
- MCP server 前缀规则 (
mcp__server) - 路径模式匹配
7. Feature Flags 与 Beta Headers
7.1 Beta Headers 索引
源码位置: src/constants/betas.ts
| Beta Header | 功能描述 |
|---|---|
claude-code-20250219 | 基础协议支持 |
interleaved-thinking-2025-05-14 | 交错思考模式 |
context-1m-2025-08-07 | 1M 超长上下文 |
context-management-2025-06-27 | 上下文动态管理 |
structured-outputs-2025-12-15 | 结构化输出支持 |
web-search-2025-03-05 | 官方网页搜索工具 |
advanced-tool-use-2025-11-20 | 工具搜索(Claude API) |
tool-search-tool-2025-10-19 | 工具搜索(Vertex/Bedrock) |
effort-2025-11-24 | 思考努力程度控制 |
task-budgets-2026-03-13 | 任务 Token/时间预算 |
fast-mode-2026-02-01 | 快速响应模式 |
afk-mode-2026-01-31 | 挂机自动分类 |
redact-thinking-2026-02-12 | 思考内容脱敏 |
token-efficient-tools-2026-03-28 | Token 高效工具 |
cli-internal-2026-02-09 | Anthropic 内部专用 |
7.2 Feature Flags 清单
从 tools.ts 和源码分析提取:
| Flag | 功能 |
|---|---|
PROACTIVE | KAIROS 主动模式基础 |
KAIROS | 常驻助手完整功能 |
KAIROS_PUSH_NOTIFICATION | 系统级通知 |
KAIROS_GITHUB_WEBHOOKS | GitHub PR 订阅 |
COORDINATOR_MODE | 多 Agent 编排 |
HISTORY_SNIP | 历史裁剪压缩 |
CONTEXT_COLLAPSE | 上下文折叠 |
WORKFLOW_SCRIPTS | 工作流脚本 |
MONITOR_TOOL | 监控工具 |
WEB_BROWSER_TOOL | 网页浏览器工具 |
TERMINAL_PANEL | 终端面板 |
OVERFLOW_TEST_TOOL | 溢出测试 |
UDS_INBOX | Unix Domain Socket 收件箱 |
BG_SESSIONS | 后台会话 |
VOICE_MODE | 语音模式 |
STREAMING_TOOL_EXECUTION | 流式工具执行 |
TOKEN_BUDGET | Token 预算控制 |
REACTIVE_COMPACT | 响应式压缩 |
EXPERIMENTAL_SKILL_SEARCH | 实验性 Skill 搜索 |
CHICAGO_MCP | Chicago MCP 集成 |
7.3 三层 Gate 机制
源码位置: docs/internals/three-tier-gating.mdx
┌─────────────────────────────────────────────────────┐
│ Layer 1: feature() - 编译时 Gate │
│ - Bun bundle tree-shaking │
│ - 代码路径完全消除 │
│ - 适用于字符串敏感的功能 │
└─────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────┐
│ Layer 2: Statsig Feature Gate - 运行时 Gate │
│ - checkStatsigFeatureGate() │
│ - Growthbook A/B 测试集成 │
│ - 用户级灰度发布 │
└─────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────┐
│ Layer 3: Beta Headers - API 级 Gate │
│ - HTTP headers 传递给 Anthropic API │
│ - 服务端功能启用 │
│ - 1M context / task-budgets 等 │
└─────────────────────────────────────────────────────┘
8. 多模型 API 支持
8.1 API 通信层
源码位置: src/services/api/
支持的平台:
| 平台 | 认证方式 |
|---|---|
| Anthropic Direct | API Key + OAuth |
| AWS Bedrock | 凭据刷新 + Bearer Token |
| Google Vertex | GCP 凭据刷新 |
| Azure Foundry | API Key + Azure AD |
8.2 流式响应处理
// query.ts 核心流式循环
for await (const message of deps.callModel({
messages: messagesForQuery,
systemPrompt: fullSystemPrompt,
tools: toolUseContext.options.tools,
signal: toolUseContext.abortController.signal,
options: {
model: currentModel,
fastMode: appState.fastMode,
mcpTools: appState.mcp.tools,
taskBudget: { total, remaining },
...
}
})) {
yield message
if (message.type === 'assistant') {
// 收集 tool_use 块
// 流式执行工具(StreamingToolExecutor)
}
}
8.3 流式工具执行
源码位置: src/services/tools/StreamingToolExecutor.ts
优势:
- 工具在模型流式输出时并行执行
- 减少等待时间
- 支持工具结果增量返回
9. Native Packages 分析
9.1 Packages 目录
源码位置: packages/
| Package | 功能 |
|---|---|
@ant | Anthropic 内部专用 |
audio-capture-napi | 语音采集 NAPI |
color-diff-napi | 颜色差异计算 |
image-processor-napi | 图片处理 |
modifiers-napi | 修饰器 |
url-handler-napi | URL 处理 |
9.2 Bun Native API 特性
- 所有 NAPI 包使用 Bun native bindings
- 高性能 C++ 实现
- 直接集成到 Bun runtime
10. 关键设计模式
10.1 Generator 模式
应用场景: 流式对话、工具执行
// QueryEngine.submitMessage 是 AsyncGenerator
async *submitMessage(prompt): AsyncGenerator<SDKMessage> {
for await (const message of query(...)) {
yield message
}
}
优势:
- 流式返回,避免阻塞
- 支持中途取消(abortController)
- 内存效率高
10.2 状态机模式
应用场景: query.ts 循环状态管理
type State = {
messages: Message[]
toolUseContext: ToolUseContext
autoCompactTracking: AutoCompactTrackingState | undefined
maxOutputTokensRecoveryCount: number
transition: Continue | undefined // 上次迭代原因
}
// Continue 站点统一更新
state = {
messages: [...messagesForQuery, ...assistantMessages, ...toolResults],
transition: { reason: 'next_turn' },
...
}
10.3 依赖注入模式
应用场景: query.ts 参数解耦
export type QueryDeps = {
callModel: (params) => AsyncGenerator<Message>
autocompact: (messages, ...) => Promise<CompactionResult>
microcompact: (messages, ...) => Promise<MicrocompactResult>
uuid: () => string
}
// 默认使用 productionDeps
const deps = params.deps ?? productionDeps()
优势:
- 测试时可注入 mock
- 生产环境可替换实现
10.4 死代码消除
应用场景: Feature Flag 代码隔离
// 条件导入,不满足条件时代码完全消除
const SleepTool = feature('PROACTIVE') || feature('KAIROS')
? require('./tools/SleepTool/SleepTool.js').SleepTool
: null
// 使用时检查 null
...(SleepTool ? [SleepTool] : [])
11. 架构启示与风险评估
11.1 架构设计启示
11.1.1 流式架构的优势
- Generator 模式:全链路流式,避免阻塞
- StreamingToolExecutor:工具并行执行
- 内存效率:大文件/长对话不爆内存
11.1.2 分层权限设计
- 三层 Gate:编译时 + 运行时 + API 级
- YOLO Classifier:智能自动审批
- 路径沙箱:防止目录遍历
11.1.3 记忆系统设计
- Dream System:后台自动整合
- 三重门槛:防止频繁触发
- 强制限制:200行/25KB 防膨胀
11.1.4 确定性生成
- Buddy 系统:用户 ID 唯一确定宠物
- Bones 不持久化:防止伪造稀有度
- Mulberry32 PRNG:可复现随机
11.2 安全风险评估
11.2.1 商业机密泄露 🔴 P0
| 风险 | 影响 |
|---|---|
| 内部代号曝光 | Tengu/Capybara/Plover 等代号泄露 |
| 未发布功能曝光 | BUDDY/KAIROS/ULTRAPLAN 等功能泄露 |
| API Header 泄露 | 所有 Beta Headers 公开 |
| 权限机制泄露 | YOLO Classifier 规则可见 |
11.2.2 竞争对手复刻 🔴 P1
- 512,000 行完整源码
- 工具系统、权限系统、压缩机制完整可见
- 可直接复刻 Claude Code 核心逻辑
11.2.3 安全漏洞发现 🟡 P2
- 安全研究员可审计代码
- 可能发现权限绕过漏洞
- 可能发现 API 认证缺陷
11.2.4 社区分支开发 🟢 P3
- 已有多个社区改进版
- 可能诞生更强大的分支
- Anthropic 商业化优势削弱
11.3 对 Anthropic 的建议
11.3.1 紧急措施
- 发声明:承认泄露,承诺不追究社区开发者
- 撤销 npm 包:下架误发布的版本
- 审计泄露范围:确认是否有敏感密钥泄露
11.3.2 长期改进
- 加强 .npmignore 配置:自动化检测 source map
- 代码混淆:对敏感字符串(内部代号)强制混淆
- Feature Flag 独立化:编译时消除更彻底
- 法律保护:对泄露代码声明版权
12. 设计优缺点深度分析
12.1 设计优点 ✅
12.1.1 流式架构:教科书级示范
Generator 全链路应用:
// 从 API 调用到工具执行,全链路 AsyncGenerator
async *submitMessage(): AsyncGenerator<SDKMessage> {
for await (const message of query(...)) {
yield message // 流式返回,不阻塞
}
}
这是正确的做法。AI Agent 的本质是长时间运行的流式任务:
- 一次对话可能持续 30 秒以上
- 如果用同步阻塞模型,整个进程会卡死
- Generator 模式支持并发处理 + 中途取消(abortController)
启示:OpenClaw 应该全面采用 AsyncGenerator,消除同步阻塞点。
12.1.2 状态机驱动:长对话管理典范
type State = {
messages: Message[]
toolUseContext: ToolUseContext
transition: Continue | undefined // 记录上次迭代原因
}
// Continue 站点统一更新
state = {
messages,
transition: { reason: 'next_turn' }
}
解决了 Agent 长对话的状态管理难题:
- 每次工具执行后,状态机决定是继续、压缩、还是退出
- 清晰、可预测、可测试
- 避免了 if-else 嵌套地狱
启示:OpenClaw 的 query 循环应该参考这个模式,统一状态更新入口。
12.1.3 BUDDY 电子宠物:产品思维的天才
确定性生成机制:
// 同一用户,永远同一只宠物
const key = userId + 'friend-2026-401'
return rollFrom(mulberry32(hashString(key)))
这是情感绑定的神来之笔:
- 用户在任何设备登录,看到的都是同一只鸭子
- 宠物是独一无二的,基于用户 ID 确定
- 无法通过修改配置伪造 Legendary
Bones 不持久化的设计确保了安全性:
- 外观属性每次从用户 ID 重新计算
- 配置文件无法伪造稀有度
启示:OpenClaw 可以考虑类似的情感绑定机制,比如用户的专属助手形象。
12.1.4 三层 Gate 机制:企业级安全设计
编译时 Gate → 运行时 Gate → API 级 Gate
这是企业级产品才有的设计:
- 编译时 Gate:敏感代码根本不会出现在外部版本(死代码消除)
- 运行时 Gate:Statsig/Growthbook 灰度发布、A/B 测试
- API 级 Gate:服务端功能控制(Beta Headers)
启示:OpenClaw 应该建立类似的三层机制,特别是编译时消除敏感代码。
12.1.5 YOLO Classifier:安全与体验的最优解
自动审批低风险操作:
如果每次 ls 都要用户点确认,用户会疯。YOLO Classifier 通过分析对话上下文,智能判断哪些操作可以自动批准。
启示:OpenClaw 的权限系统应该引入类似的智能审批机制。
12.2 设计缺陷 ❌
12.2.1 过度工程:代码量失控
文件数量爆炸:
1,900 个文件,512,000 行代码
这是病态的。对比同类工具:
- ripgrep (Rust): 3 万行
- fzf (Go): 2 万行
- bat (Rust): 1.5 万行
Claude Code 的代码量是它们的 10-30 倍。
根源:
// 101 个命令目录,52 个工具目录
// 每个都是独立的文件夹 + TS 文件
src/commands/add-dir/
src/commands/advisor.ts
src/commands/agents/
// ... 大量重复结构
过度拆分。很多命令其实就是几行代码,却被放进了独立目录。
建议:合并相似命令,减少文件数量至少 50%。
12.2.2 循环依赖:模块边界混乱
// tools.ts 注释已经承认了问题
// Lazy require to break circular dependency
const getTeamCreateTool = () =>
require('./tools/TeamCreateTool/TeamCreateTool.js')
const getSendMessageTool = () =>
require('./tools/SendMessageTool/SendMessageTool.js')
存在循环依赖,说明模块边界设计有问题。工具之间不应该互相依赖。
建议:重新设计模块边界,使用依赖倒置原则解耦。
12.2.3 状态管理混乱:状态团而非状态机
// QueryEngine.ts - 8 个私有状态变量
private mutableMessages: Message[]
private abortController: AbortController
private permissionDenials: SDKPermissionDenial[]
private totalUsage: NonNullableUsage
private hasHandledOrphanedPermission = false
private readFileState: FileStateCache
private discoveredSkillNames = new Set<string>()
private loadedNestedMemoryPaths = new Set<string>()
这不是状态机,是状态团。一个类有 8 个可变状态,意味着 2^8 = 256 种状态组合。测试覆盖率不可能覆盖所有情况。
建议:将状态封装成单一的 State 对象,使用不可变更新模式。
12.2.4 Feature Flag 滥用:产品管理失控
20+ Feature Flags
这是产品管理失控的表现。每个功能都要一个 Flag,说明没有决断力:
- 要么上线
- 要么砍掉
- 不要用 Flag 吊着
问题:外部版本和内部版本差异巨大,社区版本实际是个"残废版"。
建议:每个 Feature Flag 设定明确的生命周期,到期必须决策。
12.2.5 混淆技术自欺欺人
// buddy/types.ts
const c = String.fromCharCode
export const duck = c(0x64,0x75,0x63,0x6b) as 'duck' // "duck"
以为能绕过关键词检测,结果 source map 直接泄露。
这种混淆在编译后有效,但源码一旦泄露,所有字符串都暴露了。真正的安全应该是:
- 敏感字符串完全不上线
- 或者使用服务端配置
教训:安全不能依赖代码混淆,要从架构层面解决。
12.2.6 命令爆炸:用户认知负担
101 个命令
用户能记住多少? 核心命令可能就 10 个:
/commit,/pr,/compact,/resume,/doctor
剩下 91 个命令要么是边缘功能,要么是内部调试用。
建议:
- 隐藏到
--advanced模式 - 或者做成插件
12.2.7 封闭生态:自断后路
Skills 不开放:
// 内部 Skills 不共享
src/skills/ // 只能 Anthropic 内部用
对比 OpenClaw:
- ClawHub 公开市场
- 任何人可以发布 Skill
- 社区共建生态
Claude Code 的 Skills 是封闭的,这是自断生态。
只支持 Claude 模型:
用户想用 GPT-4?想用 Gemini?想用本地模型?不行,只能用 Claude。
这是商业选择,但从用户角度,是供应商锁定。
12.3 与 OpenClaw 对比
| 维度 | OpenClaw 优势 | Claude Code 缺陷 |
|---|---|---|
| 多模型 | 支持 Claude/GPT/Gemini/本地模型 | 只支持 Claude |
| Skills 生态 | ClawHub 公开市场 | 封闭内部 |
| 渠道支持 | 飞书/钉钉/Telegram/Signal/微信 | 仅 CLI/SDK |
| 开源透明 | 完全开源,无隐藏功能 | 大量 Gate,社区版残废 |
| 定价透明 | 用户自带 API Key,费用可控 | 后付费,账单不可预测 |
| 代码精简 | 核心代码 < 5 万行 | 50 万行,臃肿 |
| 维度 | Claude Code 优势 | OpenClaw 需改进 |
|---|---|---|
| 流式架构 | 全链路 Generator | 存在同步阻塞点 |
| Feature Flags | 三层 Gate 机制 | 缺乏编译时隔离 |
| 工具执行 | StreamingToolExecutor 并行 | 串行执行 |
| 权限粒度 | plan/auto/manual 三模式 | 权限模型较简单 |
| 情感绑定 | BUDDY 电子宠物 | 缺乏类似机制 |
12.4 一句话总结
Claude Code 是工程艺术,也是工程债务。
优点:流式架构、状态机驱动、三层 Gate、BUDDY 情感绑定 —— 这些是教科书级的设计。
缺点:过度工程、循环依赖、状态团、Feature Flag 滥用、封闭生态 —— 这些是技术债务的积累。
50 万行代码,至少可以砍掉 30 万行。
代码可以抄,架构可以模仿,但产品思维(BUDDY)抄不了。
附录
A. 源码关键文件路径
| 文件 | 路径 |
|---|---|
| QueryEngine | src/QueryEngine.ts |
| query loop | src/query.ts |
| tools 注册 | src/tools.ts |
| Beta Headers | src/constants/betas.ts |
| Buddy 系统 | src/buddy/ |
| Coordinator | src/coordinator/ |
| AutoDream | src/services/autoDream/ |
| Permissions | src/utils/permissions/ |
B. 仓库信息
- GitHub: https://github.com/claude-code-best/claude-code
- Stars: 5,915+ (持续增长)
- Forks: 7,495+ (持续增长)
- 本地路径:
/home/admin/openclaw/workspace/github-analysis/claude-code/
C. 参考资料
- mrjeye/claude-doc:完整知识库(101 命令 + 43 工具 + 隐藏功能)
- Orellius/agentloop:Agent Loop 核心模式 Python 重构
- sagar-jaixwal/claude-code-clone:事件完整报告
报告生成时间: 2026-04-01 分析工具: GitHub API + gh CLI + 本地克隆 报告作者: 李白 (OpenClaw AI-Native SRE)
源码如诗,泄露亦诗;架构精妙,泄露无遗。技术无密,开源有义;无论泄露与否,代码永存。