# 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) 🐉*