我读完了 Claude Code 源码!

以下是源代码揭示的关于如何真正使用这个工具的内容。
1. CLAUDE.md 每一轮都会被加载。每一轮。每一次。
-
~/.claude/CLAUDE.md— 全局级(你的编码风格、偏好) -
./CLAUDE.md— 项目级(架构决策、约定) -
.claude/rules/*.md— 模块化规则 -
CLAUDE.local.md— 私人笔记(被 gitignore 忽略)
2. 子 Agent 共享提示缓存(并行基本上是免费的)
-
fork — 继承父上下文,缓存优化 -
teammate — 在 tmux 或 iTerm 中独立面板运行,通过基于文件的邮箱通信 -
worktree — 获得自己的 git worktree,每个 Agent 一个独立分支
3. 权限系统是设计来被配置的,不是用来点击的
-
bypass — 完全不做权限检查(危险但快速) -
allowEdits — 自动允许在工作目录中编辑文件 -
auto(这是新的) — 对每个操作运行一个 LLM 分类器。这是最佳平衡点。
4. 有 5 种压缩策略。上下文压力是一个真实的问题
-
**microcompact** — 基于时间清除旧的工具结果 -
**context collapse** — 总结对话片段 -
**session memory** — 将关键上下文提取到文件中 -
**full compact** — 总结整个历史记录 -
**PTL truncation** — 丢弃最旧的消息组
-
主动使用 /compact。不要等系统自动压缩然后丢失你关心的上下文。 -
默认窗口是 200K token。但你可以通过使用 [1m]模型后缀来选择 1M token。对于跨多个文件的大型重构,这很重要。 -
长会话会积累”session memory”——任务规格、文件列表、工作流状态、错误和经验教训的结构化摘要。这就是为什么恢复会话比重新开始要好。 -
大型工具结果会被存储到磁盘,只发送 8KB 预览给模型。如果你粘贴一个巨大的文件,模型可能只看到其中一小部分。保持输入聚焦。
5. Hook 系统才是真正的扩展 API(25+ 个生命周期事件)
-
PreToolUse — 在任何工具执行前运行 -
PostToolUse — 在任何工具执行后运行 -
UserPromptSubmit — 在你发送消息时运行 -
SessionStart / SessionEnd — 会话生命周期 -
以及20+ 个更多事件
-
command — 运行 shell 命令 -
prompt — 通过 LLM 注入上下文 -
agent — 运行完整的 Agent 验证循环 -
HTTP — 调用 webhook -
function — 运行 JS
-
在每次文件写入前自动运行 lint 检查 -
在每次编辑后运行测试 -
自动将相关文档注入到每个提示中 -
任务完成时发送 Slack 通知 -
在代码发布前验证安全模式是否被遵循
6. 会话是持久化和可恢复的(别再从头开始了)
-
--continue— 恢复你上一次的会话 -
--resume— 选择一个特定的过去会话 -
--fork-session— 从过去的对话分支出来(我个人很喜欢这个)
7. 工具系统运行 60+ 个工具,并支持智能批处理
-
并发 — 只读操作(读取文件、搜索、glob 匹配)并行运行 -
串行 — 变更操作(编辑、写入、bash 命令)逐个运行
8. 流式架构意味着中断的代价极低
9. 重试系统比你想象的更复杂
-
10 次重试,指数退避加抖动(500ms 基础值) -
在 401/403 时自动刷新 OAuth token -
模型降级:如果 Opus 连续 3 次返回 529 错误,会自动降级到 Sonnet -
90 秒空闲看门狗——如果流式传输停滞,会降级到非流式传输 -
持久模式有无限重试,最大退避 5 分钟
TL;DR:源代码揭示的最高杠杆操作
-
写一个真正的 CLAUDE.md → 每轮都会加载。40K 字符。最高杠杆的配置。 -
用子 Agent 并行化 → fork 模型共享提示缓存。5 个 Agent ≈ 1 个的成本。 -
在 settings.json 中配置权限 → 永远消除点击疲劳。 -
主动使用 /compact → 存在 5 种压缩策略,因为上下文压力是真实的。 -
设置 hooks → 25+ 个事件,5 种类型。这才是真正的扩展 API。 -
始终用 –continue 恢复会话 → JSONL 持久化 + session memory = 积累的上下文。 -
连接 MCP 服务器 → 延迟加载意味着不使用时零成本。 -
放心中断 → 异步生成器意味着重新引导零惩罚。
夜雨聆风