# Claude Code 源码深度分析 (fazxes/Claude-code)

> 基于 2026年3月31日泄露源码重建版本 v2.1.88  
> 源码: https://github.com/fazxes/Claude-code | ⭐218 | TypeScript | Bun

---

## 一、总览

Claude Code 是 Anthropic 的**终端 AI 编程代理工具**，核心思想是：
> "一只生活在终端里的 AI，理解你的代码库，通过自然语言帮你写代码、执行任务"

**技术栈:**
- **运行时:** Bun（不是 Node.js）
- **语言:** TypeScript
- **编译:** 单文件 `build.ts` → 打包成 `dist/cli.js`（~23MB单文件）
- **UI渲染:** 自研 Ink 分支（`src/ink/`）+ React 前端渲染
- **编排:** Commander.js CLI 框架
- **AI模型:** Anthropic Claude (通过 `@anthropic-ai/sdk`)

---

## 二、核心架构（8层解构）

```
┌──────────────────────────────────────────────┐
│                   CLI 入口                    │
│  src/main.tsx → src/entrypoints/cli.tsx      │
│  Commander.js 命令行解析                     │
├──────────────────────────────────────────────┤
│             Session / Query 引擎              │
│  src/query.ts (68KB) — 核心对话循环          │
│  路由、工具调用、权限、压缩、记忆            │
├──────────────────────────────────────────────┤
│            系统提示词 (灵魂)                  │
│  src/constants/prompts.ts — 176行原则        │
│  任务执行准则、工具使用、代码风格            │
├──────────────────────────────────────────────┤
│           45个工具 (tools/)                   │
│  FileEdit/FileRead/FileWrite/Bash/Grep/      │
│  Glob/WebSearch/WebFetch/Agent/Task/         │
│  Skill/MCP/TodoWrite/AskUserQuestion...      │
│  每个工具独立目录，继承 Tool 基类            │
├──────────────────────────────────────────────┤
│          Hook 系统 (155文件)                  │
│  src/utils/hooks/                            │
│  PreToolUse / PostToolUse / SessionStart     │
│  / Notification / Stop / PreCompact...       │
├──────────────────────────────────────────────┤
│         插件系统 (65+文件)                    │
│  src/utils/plugins/                          │
│  加载 .claude/plugins/，支持bin/可执行文件    │
├──────────────────────────────────────────────┤
│         权限系统 (精准控制)                   │
│  src/utils/permissions/                      │
│  yoloClassifier.ts (52KB) — 自动模式逻辑     │
│  三级权限: allow / ask / deny                │
├──────────────────────────────────────────────┤
│         服务层 (services/)                    │
│  MCP / LSP / 压缩 / 记忆 / 分析 / OAuth      │
└──────────────────────────────────────────────┘
```

---

## 三、灵魂精华：系统提示词设计 (prompts.ts)

这是整个项目最重要的文件——它告诉 Claude **怎么当一个好的编程助手**。

### 3.1 核心人格定义

```
你是一个交互式AI编程助手。
你的输出在等宽字体终端中渲染，使用 GitHub Flavored Markdown。
```

### 3.2 代码原则（最精华的 6 条）

1. **只做被要求的** — 不增加需求以外的功能、重构、文档、类型注解
2. **不做无谓防御** — 不为不可能发生的场景加错误处理/兼容代码
3. **不做过早抽象** — 三次重复才考虑提取，一次性操作用完即弃
4. **只加必要注释** — 只有 WHY 不明显时才注释，不说 WHAT（好变量名已经做到）
5. **不留历史垃圾** — 不保留未用变量、空导出、`// removed` 注释
6. **不说空话** — 不用"Great question!"、"I'd be happy to help"这样的 filler

### 3.3 风险和后果分层

| 风险级别 | 示例操作 | 策略 |
|---------|---------|------|
| 可逆+本地 | 编辑文件、跑测试 | 自由执行 |
| 中等风险 | 推送代码、修改CI/CD | 透明沟通后确认 |
| 高风险 | 删库、rm -rf、force-push | 必须确认 |
| 不可逆 | 删除分支、覆盖未提交变更 | 调查后再操作 |

### 3.4 遇到障碍时的行为准则

- 失败后先诊断原因，不盲目重试
- 不把破坏性操作当作"捷径"
- 遇到意外状态（陌生文件/分支/配置）先调查，不直接删除
- 冲突合并优先于丢弃变更
- "量两次，裁一次"(Measure twice, cut once)

### 3.5 工具使用纪律

**专用工具优先于 Bash：**
- `FileRead` 代替 `cat`
- `FileEdit` 代替 `sed/awk`  
- `FileWrite` 代替 `cat > heredoc`
- `Glob` 代替 `find`
- `Grep` 代替 `grep/rg`

**并行调用:** 能并发的工具调用全部并行发送，最大化效率

### 3.6 报告诚实原则

- 测试失败 → 如实报告，附完整输出
- 没做验证 → 说没做，不假装做了
- 状态确认 → 通过就说过，失败就说失败，不捏造"全部通过"

---

## 四、工具系统设计

### 4.1 Tool 基类 (src/Tool.ts, ~29KB)

```typescript
export class Tool {
  // 工具描述（发送给模型）
  description(params: ToolDescriptionParams): string
  
  // JSON Schema 输入定义
  readonly inputSchema: z.ZodTypeAny
  
  // 工具提示词（注入系统提示词）
  get prompt(): string | undefined
  
  // 权限检查
  checkPermissions(input, context): PermissionResult
  
  // 执行
  call(input, context): ToolResultBlockParam[]
  
  // 可被搜索到（ToolSearch）
  isToolSearchable(): boolean
}
```

### 4.2 工具列表（45个）

| 分类 | 工具名 | 功能 |
|------|-------|------|
| **文件** | FileReadTool | 读取文件（和bash跟踪联动） |
| | FileEditTool | 精确编辑文件 |
| | FileWriteTool | 创建文件 |
| | GlobTool | 文件搜索 |
| | GrepTool | 内容搜索 |
| **代码** | BashTool | 执行shell命令 |
| | LSPTool | 语言服务器协议 |
| | NotebookEditTool | Jupyter Notebook 编辑 |
| **网络** | WebSearchTool | 网页搜索 |
| | WebFetchTool | 抓取网页内容 |
| **任务** | TaskCreateTool | 创建任务 |
| | TodoWriteTool | 写待办 |
| | TaskListTool | 列出任务 |
| | TaskUpdateTool | 更新任务 |
| | TaskOutputTool | 获取子任务输出 |
| | TaskStopTool | 停止任务 |
| **代理** | AgentTool | 创建子代理（Explore/Plan/Verify） |
| | SkillTool | 调用技能 |
| **MCP** | MCPTool | MCP协议工具 |
| | McpAuthTool | MCP认证 |
| | ReadMcpResourceTool | 读取MCP资源 |
| | ListMcpResourcesTool | 列出MCP资源 |
| **交互** | AskUserQuestionTool | 向用户提问 |
| | SendMessageTool | 发送消息 |
| **计划** | EnterPlanModeTool | 进入计划模式 |
| | ExitPlanModeTool | 退出计划模式 |
| **其他** | SleepTool | 睡眠延迟 |
| | ScheduleCronTool | 定时任务 |
| | VerifyPlanExecutionTool | 计划验证 |
| | BriefTool | 摘要 |
| | ToolSearchTool | 搜索工具 |
| | ConfigTool | 配置管理 |
| | RemoteTriggerTool | 远程触发 |
| **内部** | REPLTool | REPL模式（仅Ant-内部） |
| | TungstenTool | 调试工具（仅Ant-内部） |
| | SuggestBackgroundPRTool | 后台PR（仅Ant-内部） |

### 4.3 工具间的智能联动

**Edit工具能看见Bash读过的文件：**
```typescript
// BashTool.tsx — 跟踪 cat/sed/head/tail 的输出
// 当用户用 bash 看过文件后, Edit 不需要再 Read
// "Edit works on files viewed via Bash"
```

**子代理 Fork 模式：**
```
fork = 后台子代理，不占主对话的 context
主对话可以继续跟用户聊天，fork 在后台工作
完成后通过进度通知告知结果
```

---

## 五、Hook 系统（155文件）

### 5.1 Hook 事件类型

| Hook 事件 | 触发时机 |
|----------|---------|
| SessionStart | 会话启动 |
| PreToolUse | 工具调用前 |
| PostToolUse | 工具调用后 |
| Notification | 通知发生时 |
| Stop | 回复结束时 |
| PreCompact | 上下文压缩前 |
| SubagentStop | 子代理结束时 |
| PermissionDenied | 权限被拒时 |
| UserPromptSubmit | 用户提交提示词前 |

### 5.2 Hook 配置 (settings.json)

```json
{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Bash",
        "hooks": [
          {
            "type": "command",
            "command": "bun run security-check.sh"
          }
        ]
      }
    ]
  }
}
```

### 5.3 设计精髓

- **Hook 反馈被视为用户指令** — 会阻塞工具调用
- **大输出写磁盘** — >50KB 的输出写临时文件防爆 context
- **可以调整响应** — hook 拒绝了就改方案，不问用户

---

## 六、权限系统

### 6.1 三级权限模式

```
allow  → 静默执行
ask    → 弹窗让用户确认  
deny   → 直接拒绝
```

### 6.2 YOLO 分类器 (52KB)

`yoloClassifier.ts` 是自动模式的决策引擎：
- 分析 Bash 命令的风险等级
- 决定是否自动允许
- 包含网络/文件/进程操作的规则

### 6.3 权限规则范围

| 规则类型 | 说明 |
|---------|------|
| alwaysAllowRules | 永久允许 |
| alwaysDenyRules | 永久拒绝 |
| alwaysAskRules | 永远询问 |
| toolPermissionContext | 当前会话上下文 |

---

## 七、Query 引擎的对话循环 (query.ts, 68KB)

### 核心流程

```
1. 构建系统提示词 (static prefix + dynamic suffix)
   ├── 前缀: 人格 + 准则 + 工具文档 (缓存用 global cache)
   └── 后缀: 会话特定信息 (用户语言/设置/CLAUDEmd/记忆)

2. 发送给 Claude API (Anthropic SDK)
   ├── 携带工具定义 (JSON Schema)
   └── 流式接收回复

3. 解析回复
   ├── 文本 → 直接输出给用户
   ├── tool_use → 进入权限流程
   │   ├── 触发 PreToolUse hooks
   │   ├── 权限检查 (allow/ask/deny)
   │   └── 执行工具调用 + PostToolUse hooks
   └── system reminders → 追加到上下文

4. 上下文压缩 (当 token 接近限制)
   ├── 自动触发 compact
   └── 旧消息 → 摘要

5. 循环 — 直到用户 stop 或任务完成
```

### 压缩策略

```
autocompact 电路：
- 接近 context window → 自动压缩
- 3次连续失败 → 触发 circuit breaker → 报错提示
- 压缩保留: 重要决策/用户反馈/未完成任务
```

---

## 八、UI渲染系统

### Ink 分支（非 npm 的 ink 包）

```
src/ink/ — 完整自研 React 终端渲染器
  ├── 自定义 Flexbox 布局 (src/native-ts/yoga-layout/)
  ├── 终端组件: Box/Text/Spinner/StatusBar
  ├── 权限弹窗
  └── 进度条和 loading 动画
```

**不用 npm 的 ink，而是自研分支：**
- 完全控制样式
- 优化的性能
- 支持 Claude Code 特有的交互模式

---

## 九、关键技术细节

### 9.1 模型特征门控 (Feature Flags)

```typescript
import { feature } from 'bun:bundle'

// 所有内部功能用 feature() 门控
// 泄露版中 shims/bun-bundle.ts 全部返回 false
// 意味着所有未发布功能被彻底禁用
if (feature('VERIFICATION_AGENT')) {
  // 验证代理 (仅Ant内部)
}
```

### 9.2 CLAUDE.md 机制

```
src/utils/claudemd.ts — CLAUDE.md 加载器

功能:
- 自动读取项目的 CLAUDE.md / .claude/CLAUDE.md
- 支持 @path 引用其他文件
- 支持 frontmatter 的 paths: glob 模式
- 自动剥离 HTML 注释
- 父子目录合并优先级: 子 > 父
```

这就是为什么 Claude Code 能"理解项目"——它把 CLAUDE.md 注入系统提示词！

### 9.3 记忆系统 (MEMORY.md)

```
src/memdir/memdir.ts — 记忆文件加载
- 读取 MEMORY.md 并注入提示词
- 支持 markdown 的上下文引用
```

### 9.4 构建系统

```typescript
// build.ts — 不是 webpack/vite，而是手写构建脚本
// 用 Bun.build() 打包
// MACRO.VERSION 硬编码为 "2.1.88"
// 输出: dist/cli.js (~23MB 单文件)
// 入口: src/entrypoints/cli.tsx
```

### 9.5 更新检测已被打补丁

```typescript
// src/utils/autoUpdater.ts 第72行有 early return
// 禁用了远程版本检查
// 防止泄露版尝试连接 Anthropic 服务器
```

### 9.6 MCP 协议集成

```
@modelcontextprotocol/sdk — MCP 标准协议
- 支持本地和远程 MCP 服务器
- MCP工具自动注册，和内置工具一样使用
- MCP_CONNECTION_NONBLOCKING=true → 5秒超时
- _meta["anthropic/maxResultSizeChars"] → 最大500K字符
```

### 9.7 运营监控集成

```
OpenTelemetry (追踪/日志/指标)
├── OTLP HTTP/gRPC/Proto 三种导出器
├── Prometheus 指标导出
└── GrowthBook 功能开关 (A/B 测试)
```

---

## 十、架构精髓总结

### 🌟 10个设计精华

1. **提示词就是产品** — prompts.ts 才是真正的产品逻辑，176条准则定义了一个"好AI助手"的一切
2. **工具分层清晰** — 每个工具继承 Tool 基类，独立目录，description + inputSchema + call + prompt 四合一
3. **Hook 系统在工具之上** — 不是后加的，是核心架构的一部分，每个工具调用都被Hook包围
4. **权限在工具之下** — 每次调用前都要过权限检查，分三级(allow/ask/deny)，有52KB的自动决策引擎
5. **Context 管理是关键** — 自动压缩、claude.md机制、记忆文件、会话管理全部围绕"不丢上下文"
6. **UI 自研不是炫技** — 终端里的 React 渲染器有自己独特的需求（权限弹窗、进度、状态栏）
7. **子代理是叉子不是线程** — Fork 模式让子代理不占主 context，异步执行
8. **工具可以互相感知** — Bash 读过的文件 Edit 就知道，不需要重复 Read
9. **所有内部功能都被门控** — Feature flags 让泄露代码安全可运行，同时保留完整架构供学习
10. **Bun 不是 Node.js** — 用 Bun 的构建、Bun 的类型系统、Bun 的 API，比 Node.js 更快更现代

### 不适合学习的部分

- 27个 stub 文件（占位代码，不影响架构理解）
- Anthropic 内部工具（REPL/Tungsten/SuggestBackgroundPR）
- Computer Use（需要本机 Swift/Rust 二进制）
- 运营分析（GrowthBook/OpenTelemetry 配置）

### 最适合学习的部分

1. **系统提示词设计** — `prompts.ts` 是 AI Agent 提示词工程的教科书
2. **工具抽象** — `Tool.ts` 基类 + 45个工具，展示了如何构建Agent工具系统
3. **Hook 系统** — 155个文件的事件驱动架构
4. **权限系统** — 三级权限 + 自动分类器
5. **Query 引擎** — 对话循环、token管理、上下文压缩
6. **CLAUDE.md 机制** — 如何让 AI 理解项目

---

*分析时间: 2026-05-30*  
*分析者: 小龙 (Xiao Long) 🐉*
