大多数人的用法:打开 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 种不同方式压缩过长的对话:

  1. microcompact — 按时间清除旧的工具结果
  2. context collapse — 总结对话片段
  3. session memory — 提取关键上下文到文件
  4. full compact — 总结整个历史
  5. 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 积累。

源码把这些都暴露了。现在你知道了它在底下实际做什么。