跳到正文
claudemods

Claude Code git 分支插件:在输入框上方显示分支与改动

在 Claude Code 输入框上方用一行横条显示当前 git 分支、已修改文件数和领先/落后状态。

权限

  • 执行命令可以在你的电脑上运行 shell 程序($.process.run / spawn)。具体运行哪些程序请查看源码。
  • 拦截工具调用能看到 Claude 发起的每一次工具调用(tool.call / tool.check),并可以阻止或修改它。
  • 修改界面在 Claude Code 界面中绘制内容:横条、面板、状态文字、弹出通知(ui.render / $.ui.*)。
实测版本
v2.1.291
最近实测
需要
Claude Code ≥ 2.1.287
显示位置
输入框上方

在 Claude Code 中安装:

/plugin install cm-git-branch --marketplace rotbit/claudemods-marketplace
全部安装方式 ↓

这个插件能做什么?

这款 Claude Code git 分支插件会在输入框上方放一行信息,告诉你当前在 git 中所处的位置:⎇ main · 3 changed · ↑1 ↓0。你可以看到分支名、git status 报告有改动的路径数量,以及当前分支相对上游领先和落后了多少。当 HEAD 处于分离状态时,它会改为显示简短的提交哈希。在 git 仓库之外,这一行根本不会出现。

当 Claude 替你编辑代码时,它最能派上用场。如果会话是在 main 而不是功能分支上开始的,你一眼就能发现;随着 Claude 不断编辑,改动计数也会逐渐上升,让你知道什么时候该去审查并提交了。需要 Claude Code 2.1.287 或更高版本。

演示

录屏中,我们在一个小型演示项目里启动加载了该插件的 Claude Code。在第一次输入提示之前,输入框上方的横条就已经显示出分支和已修改文件数。接着让 Claude 列出 src 中的文件;这一轮运行期间横条保持不动,并在这一轮完成时刷新。

安装

使用安装区块中三种方式里的任意一种。单行安装方式可以在正在运行的会话中直接使用;通过 shell 安装时,已经打开的会话需要运行 /reload-plugins。

$ install cm-git-branch

需要 Claude Code ≥ 2.1.287

  1. 1.在 Claude Code 中一行安装

    /plugin install cm-git-branch --marketplace rotbit/claudemods-marketplace

    粘贴到正在运行的会话中(v2.1.275+)。Claude Code 会先询问是否添加该插件市场。

  2. 2.从终端安装

    claude plugin marketplace add rotbit/claudemods-marketplace
    claude plugin install cm-git-branch@claudemods

    然后在所有已打开的会话中运行 /reload-plugins。

  3. 3.免安装试用

    git clone https://github.com/rotbit/claudemods-marketplace
    claude --plugin-dir ./claudemods-marketplace/cm-git-branch

    仅在当前会话中加载该插件,不会写入你的设置。

工作原理

插件把最新的 git 状态保存在一个 $.state 原子中,并在 AbovePrompt 渲染位置上绘制出来。以下是 hooks/register.tsx 中的钩子:

on('session.start', async ($, e, next) => {
  const started = await next(e)
  await refresh($)
  $.clock.every(intervalMs, () => {
    refresh($).catch(() => undefined)
  })
  return started
})

on('turn.complete', async ($, e, next) => {
  const result = await next(e)
  if (e.agentId === undefined) await refresh($)
  return result
})

on('tool.call', { tool: 'Bash' }, async ($, e, next) => {
  const ran = await next(e)
  if (mentionsGit(e.command)) await refresh($)
  return ran
}).catch(($, e, next) => next(e))

共有三个刷新时机。session.start 读取第一次状态,并启动一个定时器来捕捉在 Claude Code 之外发生的变化。turn.complete 在每轮主循环对话之后刷新;子代理的轮次(带有 agentId)会被跳过。针对 Bash 的 tool.call 钩子先通过 await next(e) 让命令运行,然后只有当命令中提到 git 或 gh pr checkout/merge 时才刷新。它的 .catch 会让调用照常通过,所以插件出错也绝不会阻塞你的命令。

refresh 会在 $.session.cwd() 中运行一次 git status --porcelain=v1 -b。这一条命令就能给出分支、上游、领先/落后情况和改动列表,因此无需再分别调用 rev-parse 和 rev-list。hooks/git.ts 中的纯函数 parseStatus 能处理还没有任何提交的新仓库以及分离的 HEAD。如果 git 不存在或响应太慢,横条会隐藏起来,而不是显示过时的数据。

自定义

在 /config 中该插件名称下修改这些选项;插件会使用新值重新加载。定时器的默认值设置在 register 顶部的 Math.max(2_000, ... 15_000) 中,它同时也强制了 2 秒的下限。若要改变横条的外观,请编辑 ui.render 钩子中的 Text 元素:分支名以 cyan 色 bold 绘制,详情部分则使用 dimColor。

设置项类型默认值作用
intervalMsnumber15000Refresh interval (ms). How often to re-read git status between turns, in milliseconds (at least 2000).
showAheadBehindbooleantrueShow ahead/behind. Show commits ahead of and behind the upstream branch (↑1 ↓0).
hideWhenCleanbooleanfalseHide when clean. Hide the band while the work tree is clean and in sync with its upstream.

在 Claude Code 中通过 /config 修改这些设置,插件会热重载。

权限与安全

之所以会出现执行命令,是因为插件调用了 $.process.run。它只运行两个程序:git status --porcelain=v1 -b,以及仅在 HEAD 分离时运行的 git rev-parse --short HEAD。两者都是只读的,使用 argv 数组且不经过 shell,并设有 10 秒超时。

之所以会出现拦截工具调用,是因为它挂接了 Bash 的 tool.call。它只做观察:从不修改或拒绝命令,并且在命令执行完之后才刷新。修改界面对应的是这条横条。

它不读取文件内容、不使用网络,也不调用模型。要永久关闭它,运行 /plugin disable cm-git-branch;要在某个会话中关闭所有插件,使用 claude --safe-mode。

执行命令
可以在你的电脑上运行 shell 程序($.process.run / spawn)。具体运行哪些程序请查看源码。
拦截工具调用
能看到 Claude 发起的每一次工具调用(tool.call / tool.check),并可以阻止或修改它。
修改界面
在 Claude Code 界面中绘制内容:横条、面板、状态文字、弹出通知(ui.render / $.ui.*)。

兼容性与故障排除

已在 macOS 终端中使用 Claude Code 2.1.291 测试。如果横条没有出现,请按顺序检查以下几项:

  • claude --version 为 2.1.287 或更高版本。
  • 会话是在 git 仓库内启动的;在同一文件夹中运行 git status 应该能正常工作。
  • 插件已启用:/plugin 菜单的 Installed 标签页中能看到它,并带有一行 "mod active"。
  • 如果你是通过 shell 安装到已打开的会话中:运行 /reload-plugins。
  • 输入框上方正打开着问卷或其他提示。它显示期间横条会暂时让位,之后再回来。

在非常大的仓库中,可以调高 intervalMs,让 git status 运行得不那么频繁。

常见问题

Claude Code git 分支插件会修改我的仓库吗?
不会。它只运行 git status --porcelain=v1 -b,在 HEAD 处于分离状态时再运行 git rev-parse --short HEAD。两者都是只读命令,不经过 shell 运行,并在 10 秒后超时。
为什么横条没有出现?
最常见的原因是:会话所在的文件夹不是 git 仓库、Claude Code 版本低于 2.1.287、插件在 /plugin 中被停用,或者有问卷正占用输入框上方的空间。通过 shell 安装后,请运行 /reload-plugins。
我在另一个终端里切换分支,它能察觉到吗?
能,会在一个刷新周期内更新(默认 15 秒)。如果想更快,可以在 /config 中调低 intervalMs,最低 2 秒。
它能在桌面应用中使用吗?
可以。AbovePrompt 横条会在终端和桌面应用的 Code 标签页中绘制。在 claude -p 和 VS Code 扩展的聊天面板中,插件会运行但不绘制任何内容,因此看不到横条。
没有需要提示的内容时,可以隐藏横条吗?
开启 hideWhenClean。之后只要工作区是干净的并且与上游同步,横条就会隐藏。
上下文仪表 在 Claude Code 中运行

上下文仪表

在状态栏显示上下文窗口占用、5 小时与 7 天套餐用量和会话花费,并在接近上限时发出提醒。

  • 状态栏
  • 弹出通知
  • 修改界面

已在 v2.1.291 实测

危险命令拦截 在 Claude Code 中运行

危险命令拦截

在 rm -rf /、强推 main、DROP TABLE、curl | sh 等破坏性 Bash 命令执行前将其拒绝。

  • 弹出通知
  • 拦截工具调用
  • 修改界面

已在 v2.1.291 实测

工具调用计数器 在 Claude Code 中运行

工具调用计数器

统计 Claude 每轮和每个会话的工具调用次数,在加载指示器旁显示计数,并新增 /tally 查看明细。

  • 加载动画
  • 对话记录
  • 状态栏
  • 拦截工具调用
  • 修改界面
  • 添加命令/工具

已在 v2.1.291 实测

更多 Git 与 GitHub、状态栏与提示栏。