Claude Code 源码深度研究报告
1. 研究范围与结论总览
1.1 这次到底研究了什么
这次研究不是只看某一个 prompt 文件,也不是只做目录级扫一眼,而是把 cli.js.map 中的 sourcesContent 还原成可读源码后,沿着实际 runtime 主线做系统性拆解。
重点覆盖了:
- Claude Code 的整体源码结构
- 主系统提示词如何动态拼装
AgentTool/SkillTool的模型侧协议- built-in agents 的角色分工
- agent 调度链路如何跑通
- plugins、skills、hooks、MCP 如何接入并影响运行时
- permissions、tool execution、hook decisions 如何协同
- 为什么 Claude Code 的体验明显强于普通的“LLM + 工具调用器”
1.2 关键确认事实
从还原结果里已经可以确认:
- npm 包中的
cli.js.map确实包含完整的sourcesContent - 从 map 中至少恢复出了 4756 个源码文件
- 主系统提示词核心文件是
src/constants/prompts.ts - Agent Tool Prompt 核心文件是
src/tools/AgentTool/prompt.ts - Skill Tool Prompt 核心文件是
src/tools/SkillTool/prompt.ts - Agent 调度核心至少包括
src/tools/AgentTool/AgentTool.tsx与src/tools/AgentTool/runAgent.ts - 工具执行链核心至少包括
src/services/tools/toolExecution.ts与src/services/tools/toolHooks.ts
1.3 最重要的总判断
Claude Code 的强,不来自某个神秘的 system prompt,而来自一个完整的软件工程系统。
它的优势来自这些能力被同时做到了工程化:
- 模块化 prompt assembly
- 可治理的工具执行链
- 权限模型
- 专业化 agent 分工
- skill 工作流打包
- plugin 元数据与运行时约束
- hook 策略控制层
- MCP 既注入能力又注入行为说明
- cache-aware 的 prompt 构建
- 异步与后台任务的生命周期管理
最短的一句话总结是:
Claude Code 的价值不是一段 prompt,而是一整套把 prompt、tool、permission、agent、skill、plugin、hook、MCP、cache 与产品化 runtime 统一起来的 Agent Operating System。
2. 源码结构全景:它为什么更像 Agent Operating System
2.1 顶层结构暴露出的系统复杂度
还原出的 src/ 顶层已经说明这不是一个薄薄的 CLI 包装层。重要模块包括:
src/entrypoints/src/constants/src/tools/src/services/src/utils/src/commands/src/components/src/coordinator/src/memdir/src/plugins/src/hooks/src/bootstrap/src/tasks/
这种结构更像一个完整的运行平台,而不是单一命令行程序。
2.2 入口层说明它是平台,而不是单一界面
可见入口包括:
src/entrypoints/cli.tsxsrc/entrypoints/init.tssrc/entrypoints/mcp.tssrc/entrypoints/sdk/
这意味着它从设计上就考虑了:
- 本地 CLI
- 初始化流程
- MCP 模式
- SDK 消费者
这是一种平台化思维:同一个 agent runtime,为多个入口和交互表面服务。
2.3 命令系统是整个产品的控制面板
命令层暴露出大量系统级命令,例如:
/mcp/memory/permissions/hooks/plugin/reload-plugins/skills/tasks/plan/review/status/model/output-style/agents/sandbox-toggle
这说明命令系统不是点缀,而是 runtime control plane 的一部分。更重要的是,它还统一加载 plugin commands、skill commands、bundled skills、dynamic skills 和经过可用性过滤后的命令,因此 command system 本身 就是生态入口。
2.4 Tools 层才是模型真正“能做事”的根
从 prompt 和工具定义中能确认的重要工具包括:
FileReadFileEditFileWriteBashGlobGrepTodoWriteTaskCreateAskUserQuestionSkillAgentMCPToolSleep
这层的本质,是把模型从“回答器”变成“执行体”。
3. 系统提示词总装:prompts.ts 的真实地位
3.1 src/constants/prompts.ts 是总控制点
这个文件重要,不是因为里面有一大段神奇文案,而是因为它承担了主线程 runtime instruction assembly。
它负责:
- 主系统提示词总装
- 环境信息注入
- 工具使用规范注入
- 安全与风险动作规范
- session-specific guidance
- language / output style 注入
- MCP instructions 注入
- memory prompt 注入
- scratchpad 说明注入
- function result clearing 提示注入
- brief、proactive、token budget 等 feature gate section 注入
也就是说,Claude Code 的 prompt 不是静态字符串,而是 prompt assembly architecture。
3.2 getSystemPrompt() 不是文本,而是编排器
其核心设计是把 prompt 拆成静态前缀和动态后缀。
静态前缀包括:
getSimpleIntroSection()getSimpleSystemSection()getSimpleDoingTasksSection()getActionsSection()getUsingYourToolsSection()getSimpleToneAndStyleSection()getOutputEfficiencySection()
动态后缀包括:
- session guidance
- memory
- model override
- env info
- language
- output style
- MCP instructions
- scratchpad
- function result clearing
- summarize tool results
- numeric anchors
- token budget
- brief mode
这个设计值钱的地方在于:Claude Code 把 prompt 当作可编排的 runtime resource 来管理,而不是一段越写越长的 system prompt。