Claude Code 源码解密:它不只是个”会写代码的 AI”
你以为它只是一个 AI + 工具调用器?错了,它是一个完整的 Agent Operating System。
导语
如果你用过 Claude Code,你可能觉得它只是”一个很会写代码的 AI”。
但最近有人从 npm 包里还原了它的完整源码,4756 个源码文件,拆解出了一套完全不同的真相。
Claude Code 的强大,核心不在某个”神秘 system prompt”,而是一整套把 prompt、tool、permission、agent、skill、plugin、hook、MCP 统一起来的 Agent 操作系统。
今天这篇文章,带你从源码视角看懂它的真正护城河。
01 它不是单一工具,而是平台
从顶层源码结构看,Claude Code 至少有这些重要模块:
| 模块 | 职责 |
|---|---|
src/entrypoints/ | 入口层(CLI、MCP、SDK) |
src/constants/ | 提示词、系统常量、风险提示 |
src/tools/ | 工具定义与实现 |
src/services/ | 运行时服务 |
src/commands/ | 命令系统 |
src/plugins/ | 插件生态 |
src/hooks/ | Hook 系统 |
src/tasks/ | 本地/远程任务管理 |
这说明什么?它从设计上就是一个完整的运行平台,而不是简单的 CLI 包装器。
同一个 agent runtime,可以服务多个入口:
- 本地 CLI
- MCP 模式(作为其他 AI 的工具)
- SDK 消费者
这种平台化思维,让它可以灵活地嵌入不同的工作流。
02 System Prompt 不是文本,而是编排器
很多人以为 Claude Code 的强大在于”写了一段很棒的 system prompt”。
但源码显示,src/constants/prompts.ts 不是静态文本,而是一套 system prompt assembly architecture:
静态前缀(可 cache):
├── 身份与基础定位
├── 基础系统规范
├── 做任务哲学
├── 风险动作规范
├── 工具使用规范
├── 语气风格
└── 输出效率规范
动态后缀(按会话注入):
├── session guidance
├── memory prompt
├── env info
├── language / output style
├── MCP instructions
└── feature-gated sections
更关键的是,源码中存在 SYSTEM_PROMPT_DYNAMIC_BOUNDARY,明确区分:
- 边界前:尽量可 cache
- 边界后:用户/会话特定内容
这就是产品级思维 — 连 system prompt 的 token 成本与缓存命中都做了工程化优化。
03 Agent 专业化分工,而不是万能 Worker
很多 AI 编程工具的问题:一个 agent 既研究、又规划、又实现、又验收,最终哪件事都不够稳定。
Claude Code 的做法是 明确的职责分工:
| Agent | 职责 | 约束 |
|---|---|---|
| Explore | 代码探索 | 绝对只读,不能创建/修改/删除文件 |
| Plan | 实现规划 | 只读,输出 step-by-step plan |
| Verification | 质量验收 | try to break it,必须跑命令验证 |
| General Purpose | 通用任务 | 完整工具集,执行具体任务 |
为什么要这样分工?
- 研究任务 不会污染主线程上下文
- 规划和实现分离,降低混乱
- 验证独立出来,对抗”实现者 bias”
Verification Agent 的 prompt 尤其强 — 它的核心不是”确认实现看起来没问题”,而是:
“你的工作是 try to break it“
它会强制要求:
- build / test suite / linter / type-check
- 根据变更类型做专项验证
- 必须做 adversarial probes
- 输出 VERDICT: PASS / FAIL / PARTIAL
这直接用 prompt 反制了 LLM 常见的”差不多就算了”问题。
04 Fork 语义:并行但不污染上下文
源码中有一个非常高级的设计:fork 语义。
当开启 fork 时:
- 继承主线程完整 conversation context
- 工具集尽量与父线程一致,保证 prompt cache 命中
- 不要给 fork 单独设 model(否则 cache 命中会变差)
- 不要偷窥 fork 输出文件
- 不要预言 fork 结果
这解决了一个核心问题:怎么让复杂子任务并行运行,但不污染主上下文?
普通人只想”子任务能跑”,Claude Code 想的是”子任务能跑,而且尽量复用主线程 cache,不白烧 token”。
05 工具执行不是直接调用,而是 Pipeline
Claude Code 的工具执行链路是这样的:
1. 找 tool
2. 解析 MCP metadata
3. Zod schema 校验
4. validateInput
5. speculative classifier check(Bash)
6. PreToolUse hooks ← 最关键拦截点
7. permission 决策
8. 执行 tool.call()
9. 记录 analytics / tracing
10. PostToolUse hooks
11. 处理 structured output
12. 失败则走 PostToolUseFailure hooks
Hook 可以产出:
updatedInput— 改写输入permissionBehavior— allow/ask/denypreventContinuation— 阻止流程继续additionalContext— 注入额外上下文
这使得 Hook 真正参与控制流,而不仅仅是”记日志”。
06 安全默认:Fail-Closed 哲学
源码中最震撼的细节之一,是工具系统的默认配置:
// 默认配置 — 直到证明安全,否则默认不安全
concurrencyUnsafe: true // 默认不安全,需证明
readOnly: false // 默认需要权限
destructive: false // 默认非破坏性
这不是简单的”谨慎”,而是 fail-closed 安全哲学 的制度化表达。
以 Bash 工具为例,源码中实现了 23 层安全检查:
- 命令黑名单
- 参数验证
- 路径遍历防护
- 危险命令检测
- 超时限制
- 输出过滤
- …
这种设计理念的价值:安全性不是事后补丁,而是从第一行代码就开始的默认假设。
07 Skills 不是文档,而是 Workflow Package
很多人以为 Skill 就是”一些使用文档”。
但源码显示,Skill 更接近 prompt-native workflow package:
- markdown prompt bundle
- 带 frontmatter metadata
- 可声明
allowed-tools - 可按需注入当前上下文
- 可把重复工作流压缩成可复用能力包
为什么这很重要?
因为这意味着你可以把”某个任务的完整工作流”打包成一个 Skill,然后模型会在匹配时自动加载并执行。
比如 TDD 工作流、代码审查流程、某个框架的最佳实践 — 都可以被封装成 Skill。
08 为什么它比”普通 LLM + 工具调用器”强很多
如果只复刻:
- 一个 system prompt
- 一个文件编辑工具
- 一个 bash 工具
- 一个 CLI 壳
你会错过真正的护城河:
| 维度 | Claude Code 的做法 |
|---|---|
| Prompt | 模块化 runtime assembly,带 cache 优化 |
| Tool | 完整的 permission / hook / analytics pipeline |
| Agent | built-in / fork / subagent 分工结构 |
| Skill | prompt-native workflow package |
| Plugin | prompt + metadata + runtime constraint |
| MCP | 工具桥 + 行为说明注入通道 |
| Context | 动静边界、function result clearing、summarize |
一句话总结:
Claude Code 的价值,不在某一段 prompt,本质上是一整套把 prompt、tool、permission、agent、skill、plugin、hook、MCP、cache 和产品体验统一起来的 Agent Operating System。
09 它把”好行为”制度化
Claude Code 最大的优势之一,是把好习惯写进 prompt 和 runtime 规则里,而不是交给模型即兴发挥:
- ❌ 不要乱加功能
- ❌ 不要过度抽象
- ❌ 不要瞎重试被拒绝的工具
- ❌ 不要未验证就说成功
- ❌ 不要随便做风险操作
- ❌ verification 不能只看代码,必须跑命令
这种制度化,会极大提高系统一致性。
10 它特别懂”上下文是稀缺资源”
源码中大量设计都在围绕上下文做优化:
- system prompt 动静边界
- prompt cache boundary
- fork path 共享 cache
- skill 按需注入
- MCP instructions 按连接状态注入
- function result clearing
- summarize tool results
这说明他们不是把 token 当免费空气,而是把它视为 runtime 预算来管理。
11 启动性能:500ms 的极致追求
除了运行时上下文优化,源码中对启动时间也有极致要求 — 目标 <500ms。
为了达成这个目标,工程团队做了这些优化:
| 优化项 | 节省时间 |
|---|---|
| Keychain 并行预取 | ~65ms |
| MDM 重叠读取 | ~135ms |
| 懒加载工具 | ~100ms |
| preAction guards | ~50ms |
这说明什么?
Claude Code 的产品哲学不是”能用就行”,而是”每个可优化的细节都要优化到极致”。
500ms 可能只是一个数字,但它背后反映的是对用户体验的极致追求 — 从你敲下命令到看到响应,这半秒的时间内,整个系统已经完成了初始化、配置加载、环境检查等一系列复杂操作。
12 核心结论
如果只给一句话总结这份源码研究报告:
Claude Code 的真正秘密,不是一段 system prompt,而是一个把 prompt architecture、tool runtime、permission model、agent orchestration、skill packaging、plugin system、hooks governance、MCP integration、context hygiene 和 product engineering 全部统一起来的系统。
这就是为什么它不像一个”会调工具的聊天机器人”,而更像一个真正可扩展、可治理、可产品化的 Agent Operating System。
参考资料
[1] Claude Code 源码深度研究报告 – 作者 Xiao Tan
[2] Claude Code 官方 GitHub – Anthropic 官方 AI 编程助手仓库
[3] Claude Code 官网 – Anthropic 官方 AI 编程助手
[4] MarkItDown – Microsoft – 用于 PDF 转 Markdown 的工具
常见问题 Q&A
Q: 我可以自己复刻 Claude Code 吗?
A: 可以复刻部分功能,但真正的护城河是整个系统的协同效应。单个模块好做,但把它们整合成产品级的体验很难。
Q: 源码里有什么惊喜发现吗?
A: 最大的惊喜是 Verification Agent — 它的 prompt 核心是”try to break it”,而不是”check if it works”。这种对抗性思维非常强。
Q: Skill 和 Plugin 有什么区别?
A: Skill 更像 workflow package(可复用的工作流),Plugin 更像 extension(带运行时约束的扩展)。两者都会被模型”感知”并在合适时调用。
Q: 为什么 fork 语义这么重要?
A: 因为它解决了多 agent 系统的一个核心难题:怎么让子任务并行运行,既共享上下文,又不污染主线程?Claude Code 用 cache-aware fork 做到了。
Q: 普通开发者能从中学到什么?
A: 最重要的启示是:好产品不是靠某一个大招,而是靠无数细节的系统性优化。prompt engineering、cache 优化、权限治理、agent 分工 — 每一项都很重要。