大多数人的用法:打开 Claude Code,打一个 prompt,等回复,再打下一个。
这就相当于买了辆法拉利,只在一档开。
读完整个源码(当然是我"读"的)之后,以下是真正的高杠杆用法。
CLAUDE.md:这是你唯一应该认真写的东西
几乎所有人的 CLAUDE.md 要么是空的,要么写成了一整本圣经。
源码显示 Claude Code 在每次查询迭代都读取你的 CLAUDE.md 文件。不是 session 启动时。是每一条消息发送之后重新读取。
层级结构:
~/.claude/CLAUDE.md— 全局(编码风格、偏好)./CLAUDE.md— 项目级(架构决策、规范).claude/rules/*.md— 模块化规则CLAUDE.local.md— 私人笔记(gitignored)
你有 40,000 字符。大多数人用了不到 200 个。
把架构决策、文件规范、测试模式、"永远不要这样做"的规则放进去。模型每次turn都读它。这就是 Claude Code 从通用助手变成"你的助手"的关键。
子 agent 并行:5 个 agent 和 1 个成本几乎一样
这是最让人震惊的发现。
当 Claude Code fork 一个子 agent,它创建父上下文的一个 byte-identical 副本。API 会缓存这个。所以 spawn 5 个 agent 处理代码库不同部分,成本比 1 个 agent 顺序执行几乎没差别。
再读一遍。
5 个 agent。≈ 1 个的成本。因为全部命中 prompt cache。
源码里子 agent 有三种执行模型:
- fork — 继承父上下文,缓存优化
- teammate — 在 tmux 或 iTerm 的独立 pane,通过文件邮箱通信
- worktree — 独立 git worktree,隔离分支
你可以让 Claude Code 同时跑 5 个 agent:一个做安全审计,一个重构 auth 模块,一个写测试,一个更新文档,一个修 bug。全部并行,全部共享缓存。
这个架构天生为此设计。单线程用它是一种罪。
权限配置:5 级级联
每次 Claude Code 弹出"允许这个操作?"你点了 yes,这就是配置失败,不是功能。
源码揭示了 5 级设置级联:
policy > flag > local > project > user
在 ~/.claude/settings.json 里设置 glob pattern,定义哪些操作永远允许:
{
"permissions": {
"allow": [
"Bash(npm *)",
"Bash(git *)",
"Edit(src/**)",
"Write(src/**)"
]
}
}
三种权限模式:
- bypass — 完全不检查权限(危险但快)
- allowEdits — 自动允许对你工作目录的文件编辑
- auto(新增)— 对每个操作跑一个 LLM 分类器。这是最佳平衡点
auto 模式有自己的 allow/deny 列表。源码显示它同时竞速多个 resolver:用户点击、hook 分类器、bridge,先返回的赢。
每次你停下来点"允许"都是浪费。配置一次,永远不再点。
5 种上下文压缩策略
源码揭示了 Claude Code 有 5 种不同方式压缩过长的对话:
- microcompact — 按时间清除旧的工具结果
- context collapse — 总结对话片段
- session memory — 提取关键上下文到文件
- full compact — 总结整个历史
- PTL truncation — 丢弃最老的消息组
这说明一件事:上下文溢出是工程师花了大量时间解决的核心问题。
对你意味着什么:
- 主动用
/compact。不要等系统自动压缩而丢失你在乎的上下文。 - 默认窗口 200K tokens,但可以用
[1m]model suffix 升到 1M tokens。 - 长期 session 会积累"session memory"——任务规格、文件列表、工作流状态、错误和学习的结构化总结。这就是为什么 resume session 比重新开始更好。
- 大型工具结果存到磁盘,只给模型发送 8KB 预览。粘贴大文件时,模型可能只看到一部分。保持输入聚焦。
从 Claude Code 获得最多的人把 /compact 当作视频游戏里的手动存档点使用。保留重要的,清除不重要的,继续推进。
25+ 生命周期钩子
源码揭示了 25+ 个可以钩入的生命周期事件:
- PreToolUse — 任何工具执行前运行
- PostToolUse — 任何工具执行后运行
- UserPromptSubmit — 你发送消息时运行
- SessionStart / SessionEnd — session 生命周期
- 以及 20+ 个更多
5 种钩子类型:
- command — 运行 shell 命令
- prompt — 通过 LLM 注入上下文
- agent — 运行完整的 agent 验证循环
- HTTP — 调用 webhook
- function — 运行 JS
实际例子:
- 每次写文件前自动跑 linting
- 每次编辑后运行测试
- 自动向每个 prompt 注入相关文档
- 任务完成时发 Slack 通知
- 代码发出前验证安全模式是否被遵守
UserPromptSubmit 钩子尤其疯狂。你可以为发送的每条消息注入 additionalContext。想象一下自动附加测试输出、最近的 git diffs、或项目状态到每个 prompt,而不用手动输入。
这就是在 Claude Code 之上构建定制开发环境的方式。不是靠更好的 prompt,是靠钩入系统本身。
Session 持久化:不要每次从零开始
每个对话以 JSONL 格式保存在:
~/.claude/projects/{hash}/{sessionId}.jsonl
源码支持:
--continue— 恢复上一个 session--resume— 选择一个特定的 past session--fork-session— 从过去的对话分支出去
Session memory 提取跨 compaction 保留关键上下文:任务规格、文件列表、工作流状态、错误和学习。
大多数人每次打开 Claude Code 都开始新 session。这相当于每小时关掉一次 IDE 重开。你在做什么、什么失败了、你学到了什么——全部丢失。
用 --continue。永远。让上下文积累。让 session memory 随时间建立学习。
工具调用:读并行,写串行
Claude Code 的工具调用分两类:
- concurrent — 只读操作(读文件、搜索、glob)并行运行
- serial — 变更操作(编辑、写、bash 命令)逐个运行,避免冲突
当需要读 10 个文件理解代码库时,10 个同时读。需要编辑 3 个文件时,逐个进行防止冲突。
MCP 服务器使用延迟加载,只在需要时才加载 MCP 工具,连接 5 个 MCP 服务器不会拖慢每个请求。
失败处理:5 种自动恢复机制
源码揭示:
- 10 次重试,指数退避 + jitter(500ms base)
- 自动 OAuth token 刷新(401/403 时)
- 模型降级:Opus 因 529 错误失败 3 次后自动降级到 Sonnet
- 90 秒空闲看门狗:流式传输卡死时降级到非流式
- 持久模式:无限重试,最大退避 5 分钟
这意味着 Claude Code 设计上可以扔在那里跑着。它优雅处理 API 小故障、速率限制和服务中断。你不用守着它。放后台跑,回来拿结果。
核心结论
Claude Code 是一个穿着终端 UI 的 agent 编排平台。
从中获得 10x 产出的人,不是更好的 prompt 工程者。他们配置了它。他们并行化了它。他们钩入了它。他们让上下文跨 session 积累。
源码把这些都暴露了。现在你知道了它在底下实际做什么。
这是目前看到的最实用的 Claude Code 源码解读。5 个 agent 成本 ≈ 1 个这个发现是硬核的工程事实,不是营销——prompt cache 是关键。权限级联和 /compact 策略是最被低估的两个功能点。