架构总览

理解一个系统最快的方式,是跟着一个具体操作走一遍,看它在系统里经历了什么。

一次文件编辑发生了什么

假设你让 Claude Code 修改一个文件。从你按下回车,到 diff 出现在界面上,中间经过了这些:

首先,你的输入被判断为自然语言任务,送给模型处理。模型决定要调用 FileEditTool。

调用之前,FileEditTool 先问一句:这次编辑,用户允许吗?它检查你的权限规则,如果这个路径在允许范围内,直接继续;如果没有匹配规则,弹出确认框等你决定。

权限通过后,工具执行编辑:校验 old_string 唯一存在、路径安全、文件没被外部改动,然后写入。

写入之后,工具把结果打包成消息,包括 diff、成功状态、LSP 诊断信息。消息进入消息流,经过排序和分组,最终显示在你面前。

如果这次编辑很耗时,或者是子 agent 做的,整个过程被包装成一个 task,有自己的 id 和状态,你可以随时查看进度。

这一次操作,就触碰了系统里几乎所有的层。

从这个例子看到的结构

把上面的流程抽象出来,就得到了系统的基本分层:

  • 入口层:判断你说的是什么、当前是什么运行模式
  • 命令层:slash command 的注册和执行
  • 工具层:实际干活——FileEditTool、BashTool、WebFetchTool 等
  • 权限层:横切所有工具,每次操作前的决策
  • 消息层:把工具输出变成统一的消息,进入会话流
  • 任务层:长时间执行的统一容器
  • 状态层:memory、session、context、config

这些层不是严格的调用栈,真实代码里会交织。但每层的职责是清楚的,出了问题一般能定位到哪一层在负责。

一个贯穿始终的设计选择

读完这本书,你会发现 Claude Code 一遍一遍地做同一件事:把某种能力从"让模型用 shell 命令临时解决"变成"专门的工具,带权限检查和展示协议"。

读文件可以跑 cat,但有 FileReadTool。搜索可以跑 grep,但有 GrepTool。联网可以跑 curl,但有 WebFetchTool。

每次这样做,系统就多了一层,但也多了对这件事的感知和控制:知道花了多少 token、知道用户允不允许、知道怎么展示给用户看。

理解了这个模式,后面每一章都会变得更好读。

各章导航

  • 第 1-3 章:输入和命令——用户怎么和系统交互
  • 第 4-6 章:核心工具——读、改、执行
  • 第 7-9 章:控制层——plan mode、权限、任务
  • 第 10-12 章:记忆——memory、session、context
  • 第 13-15 章:向外延伸——web、MCP、plugins/skills
  • 第 16-17 章:运行环境——config、后台模式