Cache Clock:随时看清 Claude Code 提示缓存何时过期
在 Claude Code 状态栏下方显示提示缓存:热缓存的剩余时间、命中率,以及缓存变冷后需重新缓存的 token 数。
权限
- 读取文件可以读取你电脑上的文件并列出目录($.fs.read / list / stat / exists)。
- 写入文件可以在你的电脑上创建或覆盖文件($.fs.write)。
- 执行命令可以在你的电脑上运行 shell 程序($.process.run / spawn)。具体运行哪些程序请查看源码。
- 添加命令/工具注册新的斜杠命令或工具,供你或 Claude 调用($.command.register / $.tool.register)。
- 实测版本
- v2.1.296
- 最近实测
- 需要
- Claude Code ≥ 2.1.287
- 显示位置
- 状态栏
这个插件能做什么?
Cache Clock 是一款显示 Claude Code 提示缓存状态的社区插件,作者是 Hamza Zafar(hamzafer),属于他的 claude-code-mods 合集。它在状态栏下方多显示一行。缓存处于热状态时这一行为绿色,形如 cache ● 1h ██████████ 59m left · hit 48% · misses 0:缓存有效期(5m 或 1h)、一条十格的剩余时间条、剩余时间、命中率和未命中次数。
当剩余时间不足有效期的 20% 时,这一行变黄。缓存过期后变红:cache ○ cold · next message re-caches 82k tokens,如果 Claude Code 报告了上一次未命中的原因,也会一并附上。意义在于:发送消息之前就能知道,这条消息会命中缓存,还是要花钱重建整个前缀。
这些数字不是插件算出来的。Claude Code 从 2.1.251 起会向状态栏命令发送一个 prompt_cache 对象,插件只负责格式化。插件无法注册状态栏,所以它添加了 /cache-clock 命令:setup 把 statusLine 指向插件的脚本,remove 把一切恢复原状。如果你已经有状态栏,它会保留,缓存这一行放在它下面。
演示
录屏中,我们在小型演示项目里启动加载了该插件的 Claude Code,状态栏已预先指向插件的脚本;我们有意跳过了 /cache-clock setup 这一步,以免演示改写录制者自己的 ~/.claude。随后让 Claude 读取 README.md,用一句话描述这个项目。这一轮运行期间,输入框下方有一行绿色的 cache ● 1h,条是满的,显示 59m left 和 hit 0% · misses 0。这一轮结束后,同一行更新为 hit 48% · misses 0。
安装
使用安装区块中的任意一种方式;它们都直接从作者自己的插件市场安装。然后在会话中运行 /cache-clock setup。这一行会在 Claude 下一次回复后出现,单独运行 /cache-clock 可以查看它是否已开启。
$ install cache-clock
需要 Claude Code ≥ 2.1.287
从作者自己的 marketplace 安装: hamzafer/claude-code-mods
1.在 Claude Code 中一行安装
/plugin install cache-clock --marketplace hamzafer/claude-code-mods粘贴到正在运行的会话中(v2.1.275+)。Claude Code 会先询问是否添加该插件市场。
2.从终端安装
claude plugin marketplace add hamzafer/claude-code-mods claude plugin install cache-clock@claude-code-mods然后在所有已打开的会话中运行 /reload-plugins。
3.免安装试用
git clone https://github.com/hamzafer/claude-code-mods claude --plugin-dir ./claude-code-mods/mods/cache-clock仅在当前会话中加载该插件,不会写入你的设置。
工作原理
hooks/register.ts 注册命令并完成设置。随插件发布的 statusline/cache-clock.mjs 是 Claude Code 在每次状态栏刷新时运行的脚本。它从 stdin 读取 JSON,如果保存了你原来的命令就先运行它,然后输出缓存这一行。纯函数格式化器位于 statusline/render.mjs:
export function render(input, nowSeconds) {
const cache = input?.prompt_cache
if (!cache || typeof cache !== 'object') return ''
if (cache.caching_observed === false) return ''
const left = typeof cache.expires_at === 'number' ? cache.expires_at - nowSeconds : null
const isWarm = cache.warm !== false && left !== null && left > 0
return isWarm ? warmLine(cache, left) : coldLine(cache)
}只要 expires_at 已过,这一行就视为冷缓存,即使输入在生成时标记为热。setup 把两个脚本写到 <config dir>/cache-clock/,而不是插件目录,因为插件目录会随每个版本变化。下次会话开始时,如果状态栏是该插件的,refreshScripts 会用新版本覆盖这些副本。setup 会把 refreshInterval 设为 30 秒(除非你原来的值更短),这样倒计时在两次回复之间也会走动。
自定义
没有任何选项。/cache-clock setup 和 /cache-clock remove 是仅有的开关。若要改变外观,请编辑 render.mjs:BAR_CELLS 控制条的宽度,WARN_SHARE 控制变黄的临界点(默认 20%),文件顶部是颜色转义码。请编辑 <config dir>/cache-clock/ 下的副本;在已设置的状态下,插件会在下次会话开始时用发布版本覆盖它。
权限与安全
在运行之前,我们读过了插件会执行的每一个文件:.claude-plugin/plugin.json、hooks/hooks.json、hooks/register.ts、两个状态栏脚本以及测试。没有 package.json、安装脚本、打包或压缩代码,也没有二进制文件。仓库带有 MIT 的 LICENSE。
- 仅在你要求时修改设置。 安装和会话开始时除了刷新自己的脚本外不会写入任何内容。
/cache-clock setup会写入 Claude 配置目录(或CLAUDE_CONFIG_DIR)下的settings.json;当状态栏来自项目设置时,则写入<project>/.claude/settings.local.json。它还会在<config dir>/cache-clock/下写入脚本和备份文件setup-<hash>.json。/cache-clock remove会恢复之前的statusLine,除非你在设置后又改过它。它拒绝改动受管理(policy)设置或--settings提供的状态栏,遇到无效的设置 JSON 也不会去动。 - 每次刷新都会运行一条命令。 设置之后,Claude Code 会运行
node "<config dir>/cache-clock/cache-clock.mjs"。该脚本用相同的输入通过 shell 运行你之前的状态栏命令(spawnSync(..., { shell: true }),超时 5 秒)。setup本身会运行node --version来检查 Node 是否存在。 - 没有网络、没有遥测、不调用模型、没有守护进程。 它读取
HOME和CLAUDE_CONFIG_DIR只是为了找到配置目录,不读取任何令牌或凭据。 - 没有提示注入,也没有拦截类钩子。 它只注册了
session.start和自己的命令,不向提示词或工具结果中添加任何内容。 - 要求: PATH 中有 Node,Claude Code 为 2.1.251 或更高。
claude plugin validate 没有报告任何错误或警告,作者的 25 个测试在 Claude Code 2.1.296 上全部通过。
- 读取文件
- 可以读取你电脑上的文件并列出目录($.fs.read / list / stat / exists)。
- 写入文件
- 可以在你的电脑上创建或覆盖文件($.fs.write)。
- 执行命令
- 可以在你的电脑上运行 shell 程序($.process.run / spawn)。具体运行哪些程序请查看源码。
- 添加命令/工具
- 注册新的斜杠命令或工具,供你或 Claude 调用($.command.register / $.tool.register)。
兼容性与故障排除
已在 macOS 上使用 Claude Code 2.1.296 检查(validate、测试和演示)。如果这一行没有出现:
- 运行
/cache-clock,应当显示 “cache-clock is on”。 - 先发送一条消息。在
prompt_cache到达之前这一行是空的;服务商报告没有缓存时也是空的。 claude --version为 2.1.251 或更高,并且在同一个终端中node --version可以运行。- 你的状态栏不是由受管理设置或
--settings指定的;setup 会拒绝改动这些。 - 在已经运行的会话中执行 setup 后,等待下一次回复或 30 秒的刷新。
常见问题
- Cache Clock 会调用 API 或消耗 token 吗?
- 不会。它只是把 Claude Code 已经传给状态栏命令的 prompt_cache 数据格式化显示出来。脚本不发出网络请求,也不调用模型。
- /cache-clock setup 会改动我机器上的什么?
- 它会把两个脚本复制到 Claude 配置目录下的 cache-clock/,在那里保存你原来的状态栏设置,并修改一个设置文件,让 statusLine 指向该脚本。项目共享的状态栏会得到一个本地覆盖,而不是被直接修改。/cache-clock remove 会恢复保存的原设置。
- 我现有的状态栏会怎样?
- 它会继续运行。插件的脚本先用相同的输入执行你原来的命令,输出其结果,再在下面加上缓存这一行。原命令通过 shell 运行,超时为 5 秒。
- 缓存变冷后这一行显示什么?
- 显示红色的 “cache ○ cold”、下一条消息需要重新缓存的 token 数(例如 82k),以及 Claude Code 报告的上一次未命中的原因(例如 tools changed)。
- 需要哪个版本的 Claude Code?
- 2.1.251 或更高,这是最早向状态栏发送 prompt_cache 的版本。更旧的版本中这一行始终为空。PATH 中还需要有 Node。
# 相关插件
精选
精选Context Bar
在 Claude Code 输入框上方用一条堆叠横条显示上下文窗口,每个类别一种颜色,并附带 token 数。
- 输入框上方
- 修改界面
- 添加命令/工具
- 存储数据
已在 v2.1.291 实测
精选Compact Adviser
在一段工作告一段落时告诉你该运行 /compact 了:由 TypeSafe 的 Jev 判断这是不是合适的检查点。
- 状态栏
- 面板
- 弹出通知
- 读取文件
- 写入文件
- 网络访问
- 读取你的提示词
- 修改界面
- 添加命令/工具
- 存储数据
已在 v2.1.291 实测