定位:纯中高阶技巧,零入门废话。来源涵盖 Anthropic 官方工程博客、incident.io / Abnormal Security 等月耗数十亿 token 的生产团队、社区开源配置。2025-2026 实战验证。
1. 并行工作流:Git Worktrees
1.1 核心原理
Git worktree 在同一 .git 数据库上签出多个分支到独立目录,每个目录运行自己的 Claude Code 会话,文件完全隔离,互不污染。
# 一口气创建 3 个并行工作区
git worktree add ../proj-auth -b feat/auth main
git worktree add ../proj-payment -b feat/payment main
git worktree add ../proj-dash -b feat/dash main
# 收工清理
git worktree remove ../proj-auth
1.2 用 Cursor 管理 Worktree 🖥️
每个 worktree 是独立目录 → Cursor 中直接 File > Open Folder 打开对应 worktree 目录,每个窗口自带独立终端、独立 Claude Code 会话。
| 步骤 | 操作 |
|---|---|
| 1. 创建 worktree | 终端执行 git worktree add ../proj-feat -b feat/xxx main |
| 2. Cursor 打开 | File > Open Folder → 选择 ../proj-feat 目录 |
| 3. 启动 Claude | 在该窗口终端执行 claude 或用 Cursor 内置 AI |
| 4. 多窗口并行 | 重复以上步骤,Cursor 多窗口 = 多 Claude 并行 |
💡 技巧:Cursor 窗口标题栏会显示目录名。用
feat-auth、fix-bug、analysis等语义化命名 worktree,一眼分辨哪个窗口干什么。
1.3 高效模式
| 模式 | 做法 | 适用场景 |
|---|---|---|
| Writer/Reviewer | 窗口 A 写代码,窗口 B review(看不到 A 的推理过程) | 自我 code review |
| Test/Impl 分离 | 窗口 A 写测试,窗口 B 跑绿 | TDD 严格模式 |
| 分析树 | 一个只读 worktree,专跑日志查询、数据分析 | 不污染开发上下文 |
| 多 feature 并行 | 3-5 个 Cursor 窗口各推独立 feature | 日常并发开发 |
⚠️ 铁律:不要让两个 worktree 同时改同一批文件。每个 worktree 要独立
npm install/pip install。
1.4 incident.io 实战
四个月内从零到同时跑 4-5 个 Claude 代理并行推不同 feature。封装了 bash 函数一键创建 worktree + 启动 Claude + Tab 补全已有 worktree。串行变并行,效率指数级跃升。
2. CLAUDE.md 工程化 📐(需要吸收扩散规则)
2.1 文件层级与加载机制
| 位置 | 作用域 | 加载时机 |
|---|---|---|
~/.claude/CLAUDE.md |
全局所有会话 | 启动时 |
./CLAUDE.md(项目根) |
团队共享(提交 git) | 启动时 |
./CLAUDE.local.md |
个人专属(gitignore) | 启动时 |
| 父目录 CLAUDE.md | monorepo 根 | 启动时(向上遍历) |
| 子目录 CLAUDE.md | 模块级 | 懒加载 — 读到该目录文件时才加载 |
💡 monorepo 关键:子目录 CLAUDE.md 是懒加载的,不会启动时全量灌入,避免上百 KB 无关上下文吃掉你宝贵的 token 额度。
2.2 生产级写法规则
来自 Abnormal Security(月耗数十亿 token、13KB monorepo CLAUDE.md)的经验:
不要 @-file 整个文档。每次运行都嵌入全文,上下文白白膨胀。改用引导语:"遇到 FooBarError 时参阅 docs/auth.md"。
不要只说"禁止"。纯否定约束让 agent 卡住。永远给替代方案:"不要用 --foo-bar,改用 --baz"。
CLI 命令太复杂? 写个 bash wrapper 而不是在 CLAUDE.md 里塞说明书。
2.3 指令容量天花板
HumanLayer 研究:前沿 LLM 能稳定遵循 ~150-200 条指令。Claude Code 系统提示词已占 ~50 条 → 留给你的只有 100-150 条。指令越多,所有指令的遵循率均匀下降。
⚠️ 永远不要让 LLM 干 linter 的活。格式化用 PostToolUse Hook 确定性执行(见第 12 节),别写进 CLAUDE.md。
2.4 自改进循环 🔄
Claude 犯错后说 "写进 CLAUDE.md",它会分析错误 → 抽象模式 → 添加规则。Session 1 捕获 3 个错误;Session 2 这 3 个不再重犯,暴露更深层问题 → 复利式学习。
Arize 用自动化 prompt 优化在 CLAUDE.md 上迭代,SWE Bench Lite 准确率提升 +10.87%。
2.5 模板参考
# 代码风格
- TypeScript 严格模式,禁止 any
- 使用命名导出,不用 default export
- Python 3.12+ 类型标注:用 str | int 而非 Union[str, int]
# 常用命令
- `npm run dev`:开发服务器 (port 3000)
- `npm run test`:Jest 测试
- `npm run db:migrate`:Prisma 迁移
# 安全红线
- 绝不提交 .env 文件 — 用 Vault 管理密钥
- 数据库操作必须走 migration,禁止直接 SQL
- 遇到 OAuth 报错,参阅 @docs/authentication.md
根目录 CLAUDE.md 控制在 300 行以内(有团队压到 60 行),用渐进式披露 — 不告诉 Claude 所有知识,告诉它去哪找。
3. Skill 系统深度应用 🧩
3.1 Skill vs Slash Command
| 维度 | Slash Command | Skill |
|---|---|---|
| 位置 | .claude/commands/*.md |
.claude/skills/*/SKILL.md |
| 结构 | 单个 Markdown 文件 | 目录,含 SKILL.md + 附属文件(模板、脚本等) |
| 能力 | 简单提示注入 | 完整知识包 — 可打包参考代码、配置模板、工具链 |
| 适用 | 快捷命令 | 可复用的专业能力模块 |
💡 Skill 的本质:把你反复教 Claude 的东西固化为一个"技能包",提交 git,团队共享。遵循"一天做一次以上就自动化"原则。
3.2 Skill 目录结构
.claude/skills/
├── code-review/
│ ├── SKILL.md # 入口 — 描述何时触发、如何执行
│ ├── checklist.md # 审查清单模板
│ └── examples/ # 好/坏代码对比示例
├── db-migration/
│ ├── SKILL.md
│ ├── migration-template.sql
│ └── rollback-guide.md
├── api-design/
│ ├── SKILL.md
│ ├── openapi-template.yaml
│ └── naming-conventions.md
└── techdebt/
├── SKILL.md
└── scan-patterns.json
3.3 SKILL.md 编写模板
---
name: code-review
description: >
资深代码审查。代码变更后主动触发。
聚焦:安全漏洞、性能瓶颈、设计模式违规、测试覆盖率。
tools: Read, Grep, Glob, Bash
---
# Code Review Skill
## 触发条件
- 用户说 "review"、"审查"、"看看代码"
- 新 feature 完成后自动建议
## 执行流程
1. 读取当前 branch 的所有 diff:`git diff main...HEAD`
2. 按 checklist.md 逐项检查
3. 对每个问题给出:严重级别 / 具体位置 / 修复建议
4. 生成汇总报告
## 审查维度(见 checklist.md)
## 输出格式
- 🔴 Critical / 🟡 Warning / 🟢 Good
- 每条带文件名 + 行号 + 修复代码
## 参考
- 好坏代码对比见 examples/ 目录
3.4 高价值 Skill 清单
| Skill 名 | 功能 | 关键文件 |
|---|---|---|
| code-review | 自动化代码审查,按 checklist 逐项打分 | checklist.md, examples/ |
| techdebt | 扫描重复代码、TODO、过长函数、循环依赖 | scan-patterns.json |
| api-design | API 契约设计,生成 OpenAPI spec + Mock | openapi-template.yaml |
| db-migration | 数据库迁移模板 + 回滚方案 + 安全检查 | migration-template.sql |
| incident-response | 线上故障排查流程 + 日志分析模板 | runbook.md |
| perf-audit | 性能瓶颈定位 + 基准测试脚本 | benchmark-template.ts |
| security-scan | 依赖漏洞检查 + 敏感信息扫描 | patterns.json |
3.5 Skill 与子代理结合
在 .claude/agents/ 中定义的子代理可以引用 Skill:
# .claude/agents/reviewer.md
---
name: reviewer
description: 代码变更后必须主动调用的审查员。
tools: Read, Grep, Glob, Bash
model: sonnet
---
你是高级代码审查员。执行审查时,参照 .claude/skills/code-review/ 中的
checklist 和 examples 完成逐项检查。
⚠️ 反模式警告:"如果你有一长串复杂自定义命令,你搞反了。Claude 的核心优势是自然语言交互。Slash command 做简短快捷方式,Skill 做完整能力包,别把两者混着用。"
4. Plan Mode 计划模式 🗺️
4.1 机制
Plan Mode 下 Claude 进入只读状态,只能用 Read / LS / Glob / Grep / Task / TodoRead / TodoWrite / WebFetch / WebSearch,所有写操作被阻断。
| 激活方式 | 操作 |
|---|---|
| 键盘切换 | Shift+Tab(循环:Normal → Auto-Accept → Plan → Normal) |
| 命令 | /plan |
| Headless | claude --permission-mode plan |
4.2 模型策略 🧠
默认原则:永远用允许范围内最强的模型。 如果 Opus 4.5 可用,规划和执行都用 Opus。只在 token 预算受限、或任务确实简单时才降级:
| 场景 | 推荐配置 |
|---|---|
| 预算充足 | 全程 Opus — 规划+执行一致性最好 |
| 预算受限 | Opus 规划 + Sonnet 执行(/model Option 4) |
| 简单任务 | Sonnet 即可,省 token |
💡 Boris Cherny(Anthropic)确认 Plan Mode 对复杂任务"轻松 2-3 倍提效"。
4.3 标准流程
- Shift+Tab ×2 进入 Plan Mode
- 反复迭代方案直到满意(此阶段显著更快,无工具执行开销)
- Shift+Tab ×2 切到 Auto-Edit 模式
- Claude 自动实施,最小干预
- 保持小范围:"规划接下来 30 分钟能完成的事"
- 代码跑通立刻 commit
大型规划写入 docs/PLAN.md,跨会话持久化。
4.4 何时必须用 Plan Mode
- 改动涉及 3 个以上文件
- 跨模块重构
- Bug 修到一半方向不对,需要重新想方案
- 架构设计决策(搭配高 thinking budget,见第 14 节)
5. 子代理(Subagents)调度 🤖
5.1 基本参数
| 参数 | 值 |
|---|---|
| 每个子代理上下文 | 独立 200k token(~20k 开销) |
| 最大并发 | 10 个 |
| 嵌套 | 子代理不能再生子代理 |
5.2 内置类型
| 类型 | 模型 | 权限 | 用途 |
|---|---|---|---|
| Explore | Haiku | 只读 | 代码搜索、文件扫描 |
| Plan | Sonnet | 研究用 | Plan Mode 下辅助分析 |
| General | Sonnet | 全工具 | 通用任务 |
5.3 自定义子代理
放在 .claude/agents/ 下,Markdown + YAML frontmatter:
# .claude/agents/code-reviewer.md
---
name: code-reviewer
description: 资深代码审查员。代码变更后必须主动调用。
tools: Read, Grep, Glob, Bash
model: sonnet
---
你是高级代码审查员。参照 .claude/skills/code-review/ 执行审查。
description字段极关键 — Claude 靠它决定何时委派。加 "PROACTIVELY" / "MUST BE USED" 强制触发。
5.4 Master-Clone vs 专家代理
Abnormal Security 的反直觉经验:别做专家代理拆分。把所有上下文放 CLAUDE.md,让主代理用内置 Task(...) 生成自身克隆去干子任务。
原因:专家代理导致"上下文门控"(对主代理隐藏测试知识等),刚性工作流反而限制灵活性。
5.5 实用模式
- 7 路并行:组件 / 样式 / 测试 / 类型 / Hooks / 集成 / 收尾 → 汇总协调
- Explore → Plan → Execute 流水线
- 后台异步:
Ctrl+B将运行中的子代理放后台,继续主任务,/tasks监控
核心价值:保持主上下文干净 — 中间文件读取和推理留在子代理里,不回流。
6. MCP 服务器选型 🔌
6.1 配置方式
项目根目录 .mcp.json:
{
"mcpServers": {
"postgres": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-postgres"],
"env": { "DATABASE_URL": "${DATABASE_URL}" }
},
"github": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-github"],
"env": { "GITHUB_PERSONAL_ACCESS_TOKEN": "${GITHUB_TOKEN}" }
}
}
}
6.2 值得跑的服务器
| MCP Server | 包名 / 来源 | 核心用途 |
|---|---|---|
| GitHub | @modelcontextprotocol/server-github |
PR、Issue、代码搜索 |
| Context7 | @upstash/context7-mcp@latest |
获取指定版本的库文档,解决幻觉 |
| Playwright | @playwright/mcp@latest |
浏览器自动化测试 |
| Chrome MCP | @anthropic/chrome-mcp |
浏览器控制 — 截图、DOM操作、表单填充 |
| PostgreSQL | @modelcontextprotocol/server-postgres |
数据库查询(务必只读凭证) |
数据库方案还有 Bytebase dbhub、pgEdge(多数据库 + TLS)、Neon(OAuth 自动配置)、Prisma MCP。
6.3 上下文代价 ⚠️
每个 MCP 服务器的 tool 定义都吃上下文。 有开发者报告启用过多 MCP 后 200k 上下文缩水到 70k。用
/context监控,disabledMcpServers禁用闲置服务,MAX_MCP_OUTPUT_TOKENS=50000调整返回上限。
6.4 何时不用 MCP
Abnormal Security:"唯一还在用的 MCP 是 Playwright — 复杂有状态环境。所有无状态工具(Jira、AWS、GitHub CLI)已迁移到简单 bash wrapper。" 对无状态集成,bash 脚本通过 Bash tool 调用往往更高效。
7. Agent Team(多代理协作)🐝
7.1 与子代理的本质区别
| 维度 | 子代理(Subagent) | Agent Team |
|---|---|---|
| 通信模式 | 汇报制 — 只能向主代理返回结果 | 网状通信 — 成员之间直接发消息 |
| 协调方式 | 主代理手动分派 | 共享任务列表 + 自主认领 |
| 上下文 | 独立窗口,结果摘要回传 | 独立窗口,完全独立 |
| 适合 | 专注子任务,只要结果 | 需要讨论、质疑、协同的复杂任务 |
| Token 成本 | 较低 | 显著更高(每个成员是独立 Claude 实例) |
| 启用方式 | 内置可用 | 需要手动开启实验性功能 |
💡 一句话判断:成员之间需要互相沟通吗?需要 → Agent Team;不需要 → 子代理。
7.2 启用
# 环境变量(当次生效)
export CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1
# 或写入 settings.json(持久化)
{
"env": {
"CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS": "1"
}
}
7.3 架构四组件
| 组件 | 职责 |
|---|---|
| Team Lead | 你的主会话。创建团队、分派任务、汇总结果 |
| Teammates | 独立 Claude 实例,各自拥有完整上下文窗口 |
| Shared Task List | 中央任务队列,所有成员可见,支持状态流转和依赖关系 |
| Mailbox | 成员间直接通信系统 |
每个 Teammate 启动时加载项目的 CLAUDE.md、MCP 服务器、Skills — 但不继承 Lead 的对话历史,只接收 spawn prompt。
7.4 键盘操作
| 快捷键 | 作用 |
|---|---|
Shift+Up/Down |
选择 Teammate |
Enter |
查看 Teammate 完整会话 |
Ctrl+T |
切换任务列表视图 |
Escape |
中断 Teammate 当前轮次 |
7.5 四大黄金场景
① 多维度 Code Review
单个 reviewer 容易偏向某类问题。拆分为独立视角,每个维度都得到充分关注:
创建 agent team 审查 PR #142:
- 安全审查员:检查 token 处理、输入验证、auth 流程
- 性能分析员:排查 N+1 查询、内存泄漏、不必要的渲染
- 测试审查员:验证边界 case、查找未覆盖路径
让他们各自审查后共享发现,Lead 汇总为统一报告。
② 竞争性假设 Debug
单个 agent 倾向找到一个"说得通"的解释就停下来。多个 agent 互相质疑,通过辩论收敛到正确答案:
这个支付回调偶尔丢失。创建 agent team:
- 假设 A:网络层超时导致 webhook 未到达
- 假设 B:消息队列消费失败后未重试
- 假设 C:数据库死锁导致事务回滚
每个 teammate 验证自己的假设,同时尝试否证其他假设。
③ 跨层 Feature 开发
前端、后端、测试三层各由一个 teammate 负责,通过消息协调接口契约:
新增用户通知模块。创建 agent team:
- 后端 teammate:实现 Notification API + 消息队列
- 前端 teammate:实现通知中心 UI + WebSocket 连接
- 测试 teammate:编写集成测试验证前后端联调
后端先完成 API 接口定义,通知前端和测试 teammate 开始工作。
④ 大型代码库研究
单 agent 在 50,000+ 行代码库上挣扎 — 上下文被架构理解吃光。分布式探索,每个 teammate 认知负载独立:
Create an agent team to analyze our monorepo architecture:
- Teammate 1: 映射模块依赖图
- Teammate 2: 识别循环依赖和死代码
- Teammate 3: 统计各模块测试覆盖率
汇总为架构健康报告。
7.6 Token 成本与决策框架
⚠️ Agent Team 的 token 消耗是单会话的 3-5 倍以上。每个 teammate 都是独立的完整 Claude 实例。
| 任务类型 | 推荐方式 | 原因 |
|---|---|---|
| 简单修 bug | 单会话 | 不需要协作 |
| 专注子任务(文件分析、代码搜索) | 子代理 | 只需结果,不需对话 |
| 多文件但单方向的重构 | 单会话 + Plan Mode | 顺序执行更可控 |
| 多视角审查、竞争假设 debug | Agent Team | 需要成员间质疑和协作 |
| 跨层 feature(前端+后端+测试) | Agent Team | 需要接口协调 |
7.7 最佳实践
- 从 review 开始练手:审查类任务边界清晰、不涉及代码冲突,最适合入门
- 明确指定角色和 scope:模糊的 prompt 导致 teammate 重叠,浪费 token
- 用 in-process 模式起步:默认模式,所有 IDE 兼容;熟练后切 split-pane(需 tmux/iTerm2,VS Code 终端不支持)
- 让 Lead 做清理:Teammate 不应执行 cleanup,可能留下不一致的共享资源
- 关注共享任务列表:
Ctrl+T是你的项目看板,所有 teammate 的进度一目了然
8. /insights:AI 教练的工作流诊断 📊
8.1 是什么
/insights 是 Claude Code 的内置自省命令 — 分析你过去 30 天的所有会话数据,生成一份交互式 HTML 报告。相当于一个了解你所有工作细节的 AI 教练做的月度绩效复盘。
# 在 Claude Code 中直接运行
/insights
# 报告输出位置
~/.claude/usage-data/report.html
8.2 报告包含什么
| 维度 | 分析内容 |
|---|---|
| 项目全景 | 你在哪些项目上花了多少时间、多少 token |
| 工具使用分布 | Read / Edit / Bash / Write / Grep 各用了多少次 |
| 会话健康度 | 完成率 vs 中途放弃率 |
| 摩擦点识别 | 上下文爆炸、命令失败、重复修正等模式 |
| 可执行建议 | 带可复制代码的 Skill / Hook / Agent 建议 |
8.3 底层机制
/insights 的处理流程相当精巧:
- 收集:扫描
~/.claude/projects/下所有 JSONL 会话日志 - 过滤:排除子代理会话和内部操作
- 摘要:超过 30,000 字符的会话先用 Haiku 分块摘要
- 分面分析:对每个会话(最多 50 个新会话/次)提取结构化"分面" — 目标类别、工具使用、摩擦点、结果
- 合成报告:汇总所有分面,生成可视化 HTML 报告
分面数据缓存在 ~/.claude/usage-data/facets/,后续运行增量更新,只分析新会话。
8.4 高价值用法
① 发现隐藏瓶颈
有开发者在报告中发现自己的 "File Too Large" 错误率异常高 — 原来是因为没有配置子目录 CLAUDE.md 做渐进式披露,每次都强制加载完整文件。修正后 token 消耗下降 12%。
② 将建议直接写入 CLAUDE.md
/insights 报告里的 "Suggestions" 部分会给出可直接复制粘贴的代码片段(Skill 定义、Hook 配置、Agent 模板)。最佳实践:
跑完 /insights 后:
1. 读报告中的 Suggestions 部分
2. 把相关建议直接加入 CLAUDE.md 的规则
3. 下次 /insights 时验证改进效果
这与"每个错误只犯一次"原则形成闭环 — /insights 帮你发现你自己没意识到的重复性错误。
③ 定期运行,追踪趋势
建议每两周跑一次 /insights。对比两次报告可以看到:
- 会话完成率是否提升
- 中途放弃的比例是否下降
- 新 Skill/Hook 是否真的减少了摩擦点
- Token 消耗趋势(是否在优化)
④ 校准你的 AI 使用认知
"最大的收获是意识到:我以为自己用得很好,但数据告诉我并非如此。" — 一位跑完 /insights 的开发者
/insights 会指出你以为自己在做但实际没做的事:比如你以为自己经常用 TDD,但数据显示你的测试相关会话只占 8%。
8.5 注意事项
- 报告重近期:最近一周的高强度使用可能主导整体评分
- 每次运行分析最多 50 个新会话,海量历史需要多次运行
- 建议与报告进行对话 —
/insights后继续在同一会话中追问"为什么你觉得我的 X 模式有问题?"
9. 实战场景:复杂 Debug 🐛
核心三步法:对齐思路 → 观测闭环 → 追踪日志。不是"甩给 Claude 让它随便试",而是结构化引导 agent 定位问题。
9.1 第一步:对齐思路 — 修正解决问题方向 🎯
最常见的浪费:Claude 拿到错误信息后冲进一个错误的修复方向,越修越偏。
你:这个 API 在高并发下偶尔返回 500,看看 error log:
[粘贴日志]
⚠️ 先不要修代码。进入 Plan Mode,分析可能的原因,列出 Top 3 假设,
每个假设给出验证方法。
| 阶段 | 操作 | 目的 |
|---|---|---|
| 描述现象 | 粘贴错误日志 / 复现步骤 / 预期 vs 实际行为 | 对齐信息 |
| Plan Mode 分析 | 让 Claude 列假设 + 验证方法,不动代码 | 防止冲错方向 |
| 人工校准 | 确认/否决假设,补充 Claude 不知道的上下文 | 纠偏 |
| 锁定方向 | 确认一个假设后才切回执行模式 | 一击即中 |
💡 关键心法:两次修正失败后立刻停下来,
/clear重新描述问题。不要在错误方向上追加要求 — 这是"修正死亡螺旋"。
9.2 第二步:观测闭环 — 自动化完成 🔄
方向对了之后,让 Claude 自建观测手段,形成"修改 → 验证 → 再修改"的自动闭环:
方向已确认是连接池泄漏。现在:
1. 先写一个重现脚本(可重复触发这个 bug)
2. 在关键路径加 instrumentation(连接获取/释放计数)
3. 跑重现脚本,把输出喂回来分析
4. 修复后再跑同一个脚本验证
graph LR
A[写重现脚本] --> B[加观测点]
B --> C[执行 + 收集数据]
C --> D{问题复现?}
D -->|是| E[定位 + 修复]
D -->|否| F[调整观测粒度]
F --> B
E --> G[再跑重现脚本]
G --> H{修复成功?}
H -->|是| I[提交]
H -->|否| E
关键配置:让 Claude 拥有运行测试的权限,形成全自动闭环——
{
"permissions": {
"allow": ["Bash(npm run test:*)", "Bash(node scripts/repro-*:*)"]
}
}
9.3 第三步:追踪日志 — 持久化经验 📝
修完 Bug 不是终点。把排查过程写进知识库,让下次遇到同类问题时秒定位:
Bug 已修复。现在:
1. 把这次的排查路径、根因、修复方案写进 CLAUDE.md 的 Learned Rules
2. 如果涉及架构陷阱,更新 docs/PITFALLS.md
3. 补充回归测试,确保这个 bug 不再出现
自改进循环实战:
# CLAUDE.md - Learned Rules(自动积累)
- 连接池泄漏排查:先检查 connection.release() 是否在 finally 块中
- Prisma timeout:不要改 connection_limit,先查 idle connection 是否被正确回收
- Redis pub/sub 内存泄漏:subscriber 断开后 channel 不会自动清理
这就是"模型即正义"的落地:每次 debug 都让 CLAUDE.md 变得更聪明。
9.4 Anthropic 工程团队的 5 个调试策略
- Slack MCP + 粘贴 bug 线程:说 "fix",零上下文切换
- "去修 CI 失败的测试":不微管,让 Claude 自己搞定
- Docker 日志排查:分布式系统直接把容器日志喂进去
- "证明给我看这能跑":让 Claude 对比两个分支的行为差异
- "推倒重来":修得凑合时说"知道了所有信息后,扔掉这版,实现优雅方案"
10. 实战场景:大型重构 🏗️
10.1 重构 = Plan Mode 的主场
大型重构(改 50+ 文件、跨模块依赖变更)是最容易翻车的场景。核心策略:分阶段、小步提交、每步可回滚。
10.2 标准流程
graph TD
A[Shift+Tab×2 进 Plan Mode] --> B[Claude 分析影响范围]
B --> C[输出分阶段方案到 docs/REFACTOR-PLAN.md]
C --> D{方案审核通过?}
D -->|否| B
D -->|是| E[Phase 1: 接口层变更]
E --> F[跑测试 + commit]
F --> G[Phase 2: 实现层迁移]
G --> H[跑测试 + commit]
H --> I[Phase N: 清理旧代码]
I --> J[全量测试 + 最终 commit]
10.3 给 Claude 的提示词结构
## 重构任务
把 UserService 从 class-based 迁移到 functional + dependency injection 模式。
## 约束
- 分阶段执行,每阶段改不超过 10 个文件
- 每阶段完成后必须跑 `npm run test` 全部通过才继续
- 保持向后兼容:旧接口加 @deprecated 注解,不直接删除
- 每阶段完成立刻 commit,commit message 包含 phase 编号
## 阶段建议(可由你调整)
Phase 1: 定义新的函数式接口 + 类型
Phase 2: 实现新函数,旧 class 内部委托到新函数
Phase 3: 逐步迁移调用方
Phase 4: 删除旧 class + @deprecated 标记
先进入 Plan Mode,输出完整方案到 docs/REFACTOR-PLAN.md,我审核后再执行。
10.4 关键技巧
用子代理做影响分析:主代理规划,子代理 Explore 扫描所有引用点。
专建重构 Skill:
# .claude/skills/refactor/SKILL.md
---
name: safe-refactor
description: 大型重构执行器。确保分阶段、可回滚、每步有测试。
---
## 铁律
1. 先 Plan Mode 出方案,方案写入 docs/REFACTOR-PLAN.md
2. 每阶段改不超过 10 个文件
3. 每阶段结束跑全量测试
4. 每阶段通过后立刻 git commit
5. 任何阶段测试失败 → 立刻 git stash,回到 Plan Mode 重新评估
⚠️ 绝不要一个 prompt 里说"重构整个模块"然后让 Claude 自由发挥。 这是最昂贵的 anti-pattern — 大概率改到一半上下文爆炸,半成品代码散落一地。
11. 实战场景:新增复杂模块 🧱
11.1 复杂度来源
新增模块不像修 bug 有现成线索,挑战在于:从零定义接口、处理多方依赖、确保与现有系统集成。
11.2 四阶段推进法
| 阶段 | 目标 | Claude 指令模板 |
|---|---|---|
| ①契约定义 | API 接口 + 类型 + 数据模型 | "设计 PaymentModule 的公共接口,只输出 .ts 类型定义 + OpenAPI spec,不写实现" |
| ②骨架搭建 | 目录结构 + 空文件 + 注册到系统 | "创建模块目录结构,所有函数 throw new Error('NOT_IMPL'),确保项目能编译通过" |
| ③TDD 核心循环 | 逐个函数:写测试 → 跑红 → 实现 → 跑绿 | "为 createPayment 写测试(3 个正常 case + 2 个边界 case),确认测试失败后再实现" |
| ④集成验证 | 与现有模块联调 + E2E | "PaymentModule 已完成单元测试。现在写集成测试验证它与 OrderModule 的交互" |
11.3 配套 Skill
# .claude/skills/new-module/SKILL.md
---
name: new-module
description: 新模块脚手架。从契约到集成的完整流程。
---
## 流程
1. 让用户描述模块职责和依赖关系
2. 输出接口定义(types + API spec),等用户确认
3. 生成目录骨架(stub 实现,项目可编译)
4. 逐函数 TDD:测试 → 红 → 实现 → 绿 → commit
5. 集成测试 + E2E 验证
## 模板文件
- module-template/ # 标准模块目录结构模板
- test-template.ts # 测试文件模板
- integration-template.ts # 集成测试模板
11.4 实战提示词示例
我要新增一个 NotificationModule,职责:
- 支持 Email / SMS / Push 三种渠道
- 消息模板管理(CRUD)
- 发送队列(异步,支持重试)
- 发送记录查询
现有依赖:
- UserModule(获取用户联系方式)
- QueueModule(Bull MQ)
请按以下步骤执行:
1. Plan Mode:设计公共接口 + 类型定义,输出到 src/modules/notification/types.ts
2. 我确认后:创建目录骨架 + stub 实现
3. TDD 逐个实现核心函数
4. 最后做与 UserModule / QueueModule 的集成测试
先进 Plan Mode。
12. Hooks:确定性护栏 🛡️
12.1 核心机制
Hook 在生命周期节点确定性触发。退出码 0 = 正常继续;退出码 2 = 阻断操作(stderr 反馈给 Claude)。
三种类型:command(shell 命令)、prompt(Haiku 快速 LLM 评估)、agent(启动有工具的子代理)。
12.2 完整事件表
| 事件 | 触发时机 |
|---|---|
PreToolUse |
工具执行前 |
PostToolUse |
工具执行后 |
PostToolUseFailure |
工具执行失败后 |
PermissionRequest |
权限请求时 |
UserPromptSubmit |
用户提交提示词时 |
Notification |
通知事件 |
Stop / SubagentStop |
会话/子代理停止 |
PreCompact |
压缩前 |
SessionStart / SessionEnd |
会话开始/结束 |
12.3 生产配置示例
{
"hooks": {
"PreToolUse": [
{
"matcher": "Edit|Write",
"hooks": [{
"type": "command",
"command": "python3 -c \"import json,sys;d=json.load(sys.stdin);p=d.get('tool_input',{}).get('file_path','');sys.exit(2 if any(x in p for x in ['.env','package-lock.json','.git/']) else 0)\""
}]
}
],
"PostToolUse": [
{
"matcher": "Edit|Write",
"hooks": [{
"type": "command",
"command": "jq -r '.tool_input.file_path' | { read f; echo \"$f\" | grep -q '\\.ts$' && npx prettier --write \"$f\"; exit 0; }"
}]
}
],
"Stop": [
{
"matcher": "",
"hooks": [{
"type": "command",
"command": "terminal-notifier -message 'Claude Code 干完了' -sound default"
}]
}
]
}
}
12.4 设计原则
⚠️ 在 commit 时拦截,而非在 write 时拦截。 中途阻断会"迷惑甚至激怒"agent。让它完成工作,最后验证。PreToolUse 挂在
Bash(git commit)上检查测试通过标志。
- PreToolUse hooks 可返回
permissionDecision: "allow|deny|escalate"+modifiedToolInput - Stop hooks 检查
stop_hook_active防死循环 - Hook 是唯一可靠的强制机制 — CLAUDE.md 规则只是"建议",Claude 可被说服忽略
13. 上下文窗口管理 🧠
13.1 Token 感知
| 指标 | 值 |
|---|---|
| 总容量 | 200k token |
| monorepo 启动占用 | ~20k(10%) |
| 实际可用 | ~180k(跑起来很快填满) |
| 命令 | 作用 |
|---|---|
/context |
查看 token 明细 |
/compact |
手动压缩 |
/clear |
完全清空 |
/cost |
查看花费 |
13.2 两种重启策略
简单重启:/clear + 自定义 /catchup,让 Claude 读当前分支所有改动文件。
复杂重启(Document & Clear):让 Claude 把计划/进度写入 .md → /clear → 新会话指向该 .md。保留战略上下文,重置窗口。
💡 社区共识:不要依赖 auto-compact(~75-95% 时自动触发)— "不透明、易出错"。主动管理上下文。
13.3 交接模式
创建 HANDOFF.md:目标 / 进度 / 有效方案 / 失败方案 / 下一步。HN 上的生产工作流:"写计划到 markdown → 新会话 → 实现几件事 → 更新计划 → 新会话"。
禁用闲置 MCP 服务器后再
/compact,先释放被 tool 定义占据的空间。
14. Extended Thinking 深度思考 🧪
14.1 现状
Extended thinking 默认开启,预算 31,999 token。关键词触发(ultrathink 等)已废弃。
14.2 隐藏解锁:64K 模型双倍思考
| 模型 | 最大输出 | 最大 Thinking |
|---|---|---|
| Opus 4.5 | 64,000 | 63,999 |
| Sonnet 4.5 | 64,000 | 63,999 |
| Sonnet 4 | 64,000 | 63,999 |
| Opus 4 | 32,000 | 31,999 |
MAX_THINKING_TOKENS=63999 claude # 当次生效
echo 'export MAX_THINKING_TOKENS=63999' >> ~/.zshrc # 永久
Ctrl+O 切换 verbose 模式看 thinking 内容。
14.3 何时值得 / 不值得
| ✅ 值得 | ❌ 不值得 |
|---|---|
| 复杂系统设计 | 简单文件修改 |
| 多文件依赖重构 | 格式化、重命名 |
| 棘手 Bug 根因分析 | 常规 CRUD |
| 架构决策 | 模板生成 |
15. 自动化 Code Review 🔍
15.1 GitHub Action
name: Code Review
on:
pull_request:
types: [opened, synchronize]
jobs:
review:
runs-on: ubuntu-latest
steps:
- uses: anthropics/claude-code-action@v1
with:
anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
prompt: "/review"
claude_args: "--max-turns 5"
内置 /code-review 启动 4 个并行审查代理,各自独立打分(阈值 80/100),过滤误报。
15.2 CI 自动修测试
- name: Fix Failing Tests
if: steps.tests.outcome == 'failure'
run: |
claude -p "修复失败测试。输出: $(cat test-output.txt)
做最小修改。" \
--allowedTools "Read,Edit,Bash(bun test:*)" || true
永远加
|| true作为 fallback,防止 Claude 失败阻塞流水线。
16. 血泪教训:烧钱的错误 💀
16.1 真实事故
| 事故 | 后果 |
|---|---|
| Prisma Reset(GitHub #5370) | 用户明确说"不要覆盖",Claude 仍执行 migrate reset --force → 全部数据丢失 |
| API Key 泄露 | 真实 key 被硬编码到 markdown,公开仓库 11 天 → $30,000 欺诈消费 |
| Home 目录被删 | rm -rf ~/ → 永久丢失 |
| .env 泄露 | .env 内容复制到已提交的 env.example |
16.2 必配安全规则
{
"permissions": {
"deny": [
"Bash(*drop*database*)", "Bash(*truncate*)",
"Bash(*migrate*reset*)", "Bash(*rm -rf*)",
"Edit(.env*)", "Read(./secrets/**)"
],
"ask": ["Bash(*migrate*)", "Bash(prisma db push)"]
}
}
16.3 反模式速查
| 反模式 | 症状 | 对策 |
|---|---|---|
| 修正死亡螺旋 | 两次修正失败仍追加要求 | /clear,重写 prompt |
| 厨房水槽会话 | 一个会话混多个不相关任务 | 独立会话,/clear 隔开 |
| 上下文腐烂 | 对话太长后 CLAUDE.md 指令失效 | 会话保持短而单一用途 |
| 无限重试 | 5+ 次相同重试烧光 token | 及时 Esc 中断 |
| 迷信 CLAUDE.md | 以为写了规则就万事大吉 | Hook 才是唯一可靠强制机制 |
⚠️ 铁律:不以 root 运行;容器外不用
--dangerously-skip-permissions;Claude 的删除不进回收站,永久消失。
17. 六条操作纪律 🎯
不是理念,是判断标准。每条对应一个具体的操作决策点 — 遇到时直接查表执行。
原则一:30 分钟提交法 ⏱️
一个 prompt 的范围,不超过 30 分钟能 commit 的量。
超过 → 说明你没拆够。这一条同时解决三个问题:防上下文腐烂(长会话后 CLAUDE.md 指令衰减)、可回滚(每次 commit 是安全检查点)、强制你做分解设计而非"给 Claude 扔一整个需求"。
| 场景 | 怎么拆 |
|---|---|
| 新增模块 | 接口定义 → 骨架 → 逐函数 TDD → 集成 |
| 大型重构 | 按模块分 Phase,每 Phase ≤10 文件 |
| 复杂 Bug | Plan Mode 对齐方向 → 写重现脚本 → 修+验证 |
原则二:两次不中就停手 ✋
同一个修复方向失败两次,立刻 /clear,重新描述问题。
"修正死亡螺旋"是最大的 token 黑洞 — Claude 在错误方向上越补越偏,你追加的约束只会进一步污染上下文。停下来的成本远低于在泥潭里多挣扎 5 轮。正确做法:/clear → 用全新视角重新描述现象 → Plan Mode 先列假设再动手。
原则三:先只读、后动手 🔍
改 3 个文件以上 → 必须 Plan Mode 先行。
这是"欲速则不达"的可执行版本。Plan Mode 无写权限,Claude 只分析不改代码,出方案的速度反而更快(无工具执行开销)。方案确认后切 Auto-Edit 一次成型。适用于:跨模块改动、架构决策、修 Bug 方向不明确时。方案写入 docs/PLAN.md,跨会话可追溯。
原则四:护栏焊死、不靠嘴说 🛡️
不能容忍出错的事,用 Hook;可以容忍偶尔出错的事,写 CLAUDE.md。
这是最重要的设计判断。CLAUDE.md 里的规则本质是"建议" — Claude 可以被上下文说服忽略它。Hook 的退出码 2 是物理阻断,不存在"被说服"的可能。
| 需求 | 实现方式 | 原因 |
|---|---|---|
| 禁止编辑 .env | Hook(PreToolUse exit 2) | 泄露一次就是事故 |
| 代码风格统一 | Hook(PostToolUse 跑 Prettier) | 确定性格式化,不靠提示 |
| 优先用命名导出 | CLAUDE.md 规则 | 偶尔用 default 不是灾难 |
| 测试覆盖率 > 80% | CLAUDE.md 规则 + CI 拦截 | 组合策略 |
原则五:上下文如内存,主动回收 🧠
不是等它满了再管,而是每完成一个子任务就评估:继续还是 /clear?
200k token 听起来很多,但 MCP tool 定义 + 文件读取 + 对话历史消耗极快。把上下文当 RAM 管理:worktree 做进程隔离、子代理做临时线程(用完释放)、/clear 是 GC、CLAUDE.md 是持久化存储。会话越短越精准 — 一个 10 轮的精确会话远优于一个 50 轮的模糊会话。
原则六:每个错误只犯一次 🔄
每次 debug 结束,问 Claude:"把这次的教训写进 CLAUDE.md 的 Learned Rules。"
这不是可选的好习惯,而是与 Claude Code 协作的核心增长飞轮。Session 1 犯 3 个错 → 写入规则 → Session 2 不再犯这 3 个 → 暴露更深层问题 → 继续写入。一个月后你的 CLAUDE.md 就是一份高度定制化的项目"避坑指南",新人、新会话、新 worktree 都能即刻受益。配合 Skill 固化为可复用能力包,复利效应指数增长。