日期:2026-09-05 · 版本:v2.1.260(9/3)、v2.1.261(9/4) 前置:第 8 课(上下文管理)、第 15 课(成本控制)、第 19 课(Skills)、第 3 课(subagents)。 本课主线:这两版把「以前只能靠感觉」的三件事变成了可读的数字 —— 我改了什么、缓存为什么没命中、skill 到底吃了多少上下文。四条技巧由浅入深。
技巧 1(入门):/diff —— 让「Claude 改了哪些地方」一直摆在眼前
v2.1.260 新增了一个 diff 面板:全屏模式下它开在对话旁边,实时显示你工作区里的未提交变更,随 Claude 编辑同步刷新。
# 先进全屏(如果还没有)
/fullscreen
# 打开 / 关闭 diff 面板
/diff
为什么值得改习惯:以前想知道 Claude 到底动了什么,要么信它的自述,要么自己另开一个终端 git diff。前者会漏(它常常只说「主要改动」),后者会断(切窗口就丢上下文)。diff 面板把「审阅」从一个事后动作变成了一个持续动作——你在读它的解释的同时,右边就是真实的 diff。
配合用:让 Claude 开工前先 git add -A && git stash 或至少确保工作区干净,这样面板里出现的每一行都是本次会话的产物,没有噪音。
技巧 2(进阶):给缓存未命中「验尸」—— /cost 与状态栏的 prompt_cache
第 15 课讲成本控制时,prompt 缓存是最大的一根杠杆,但当时只能看到命中率高低,看不到为什么掉了。v2.1.260 给 /cost 和状态栏的 prompt_cache 字段加上了未命中的可能原因,典型的两类是:
- 工具定义或 system prompt 变了(前缀变了 → 整段缓存作废)
- 闲置超过 TTL(去泡了杯咖啡回来,缓存已过期)
# 会话里随时查
/cost
如果想让缓存状态常驻视野,把它挂进状态栏:
// ~/.claude/settings.json
{
"statusLine": {
"type": "command",
"command": "echo \"$(jq -r '.model.display_name') | cache: $(jq -r '.cost.prompt_cache // \"-\"')\""
}
}
怎么用这条信息:看到「工具定义变了」反复出现,说明你在会话中途反复增删 MCP server 或 skill —— 每动一次都在把前缀打碎。正确做法是在会话开始前把工具集定好,中途尽量别动。看到「闲置超 TTL」多,说明你的工作节奏是「问一句走开半小时」,那就别指望缓存,改用更少轮次、更大批量的提问方式。
同期还有一条相关修复:v2.1.260 修好了 Fable 5.1 上「工具结果之后附加的上下文没被缓存覆盖」的问题——此前每个工具调用轮次都会把这部分当未缓存输入重发一遍。用 Fable 5.1 的话,升级本身就是省钱。
技巧 3(核心):/skill-doctor —— 给你装的一堆 skill 做体检
v2.1.261 新增 /skill-doctor,列出哪些已加载的 skill 从头到尾没被用到,以及它们各自占了多少上下文,让你据此裁剪。
/skill-doctor
为什么这条最值得停下来看:第 19 课讲 Skills 的时候,鼓励的方向是「把工作流封装起来」;装到十几个之后,副作用开始显形——每个 skill 的 name + description 都要进 system prompt,而 system prompt 是缓存前缀里最靠前的一段。装了不用的 skill 是双重浪费:占 token,还稀释了模型对真正该触发的那个 skill 的注意力。
一个务实的循环:
# 1. 干完一天的活,别急着关会话
/skill-doctor
# 2. 把「零触发 + 占用大」的 skill 从项目级配置里摘掉
# 项目级:.claude/settings.json 的 enabledPlugins / skill 目录
# 用户级:~/.claude/skills/ 下直接移走
# 3. 真正常用的留在用户级,场景专属的下沉到项目级
判断标准:一个 skill 如果连续一周 /skill-doctor 都显示零触发,它要么该删,要么 description 写得没法触发——后者更常见。回去改 description(第 19 课讲过:description 里要写清楚用户会怎么说,而不是这个 skill 做什么)。
技巧 4(实战):把「输出被截断」和「subagent prompt 太长」这两个老坑一次填上
两个新配置项,解决的是同一类问题——默认上限挡住了正常工作。
4a. 抬高内联输出上限
以前跑一个大测试套件或长日志命令,输出超过阈值就被存成文件,Claude 只看到一个路径,得再读一次(多一轮、多一次缓存打断)。v2.1.261 让你自己定这个阈值,最高 128K 字符:
// ~/.claude/settings.json 或 .claude/settings.json
{
"bashOutputMaxChars": 60000,
"taskOutputMaxChars": 60000
}
bashOutputMaxChars:Bash 命令的内联输出上限taskOutputMaxChars:后台任务 / subagent 返回结果的内联上限
别直接拉满:128K 字符约等于 30K+ token,一次刷进去会把上下文吃掉一大截。经验值是先设 40K–60K,覆盖住「典型的一次 test run」即可;真正的巨型日志,还是让它落盘、让 Claude 用 grep 去捞更划算。
4b. 把 subagent 的 system prompt 从命令行里拿出来
# 旧写法:prompt 长了就撞命令行长度上限,而且没法版本管理
claude -p "..." --append-subagent-system-prompt "你是一个只做代码审查的 agent,规则如下……"
# 新写法(v2.1.261)
claude -p "审查这个 PR" \
--append-subagent-system-prompt-file ./.claude/prompts/reviewer.md
这条为什么重要:第 3 课讲 subagent 分工、第 24 课讲代码审查工作流,两者的落地阻力都在同一处——给 subagent 的角色约束一旦超过几百字,就只能塞进命令行,既难读也难 review。改成文件之后,这些 prompt 进了 git,可以像代码一样 diff、review、回滚,CI 里也能直接引用同一个文件,保证本地和流水线上跑的是同一套规则。
顺手一提:auto mode 的一处收紧(v2.1.261)
auto mode 现在会把「把内容打包进公开图表渲染器 URL 的链接」当作向该站点上传数据来处理 —— 除非你明确要求,否则不再自动批准。
这是一个很典型的「渲染即外传」漏洞面:Mermaid/PlantUML 这类在线渲染服务,是把图的源码 base64 编码进 URL 的。Claude 顺手给你生成一个「预览链接」,你的架构图源码就已经过去了。如果你的项目有保密要求,值得顺手补一条硬规则:
// .claude/settings.json
{
"permissions": {
"deny": ["WebFetch(domain:mermaid.ink)", "WebFetch(domain:kroki.io)"]
}
}
(这与今日精选主题「爆炸半径工程」是同一个思路:允许清单是能力授予,不是目的地过滤 —— 允许一个域名,就等于允许那个域名上所有可达的功能。)
本课小结
| 技巧 | 命令 / 配置 | 解决什么 |
|---|---|---|
| 1 | /diff |
实时看未提交变更,审阅从事后变持续 |
| 2 | /cost、状态栏 prompt_cache |
知道缓存为什么没命中,而不只是没命中 |
| 3 | /skill-doctor |
找出零触发 skill 与其上下文成本,定期裁剪 |
| 4 | bashOutputMaxChars / taskOutputMaxChars / --append-subagent-system-prompt-file |
长输出不被截断;subagent prompt 进 git |
升级:claude update,claude --version 确认到 2.1.261 或更高。
来源:Claude Code changelog(v2.1.260 · 2026-09-03,v2.1.261 · 2026-09-04)
主页