Passer au contenu principal
K

dsh-hud

konnga/dsh-hud

Read-only Git panel for the current workspace: branch, changed files and diffs, plus which files this session changed, what has been reviewed, and which tools and skills it ran.

Installer

dsh plugin --profile web add github:konnga/dsh-hud

README

dsh-hud

一个只读的工作区 Git 面板:分支、ahead/behind、改动清单与差异,外加「这个会话改过哪些文件、审到哪了、跑了什么工具」。 A read-only workspace Git panel for DeepSeek Harness, with per-session change attribution.

输入框上方的三枚胶囊:最左边是本次会话运行时长,中间是 Git 状态,右边是工具与技能

左:工作区名 · git:(分支*) · ahead/behind · 改动计数 · 本会话改过几个文件。右:每个工具的调用次数、正在跑什么、以及会话调用过哪些技能 —— 图中 aihot ×1 是红的,因为那次调用失败了。

安装

桌面端「设置 → 插件 → 添加插件」里填 @konnga/dsh-hud。

本地开发时把 profile 的依赖指向仓库(改动即时可见;客户端代码要重启应用才重读):

"@konnga/dsh-hud": "link:/path/to/dsh-hud"

你会看到什么

会话计时胶囊(同一行的最左边,单独一枚)

⏱ 2h 14m

本次会话已经运行了多久 —— 口径与 codex-hud 的会话时长完全一致:挂钟时间 = 现在 − 会话创建时刻(含等待与空闲),格式也是同一套(<1m / 45m / 2h 14m / 3d 2h,不足一分钟写 <1m,只列非零项)。

悬停补齐"这段时间里真正在干什么":

本次会话运行时长 · 创建于 2026-10-14 17:58 · 其中模型 1h 29m、工具 23m · 27 轮 / 380 步
  • 模型 / 工具墙钟与轮次、步数来自内置 sessionStats 投影(它从完整持久日志折叠,分页与压实都不会让数字跳变);那个投影没注册(插件被组合掉 / 旧宿主)时只显示挂钟时长,不编造后两项。
  • 数字一分钟取一次(宿主侧同样带 60 秒缓存),显示每 4 秒自跳一次 —— 跨分钟不用等下一次请求。
  • 会话不在(归档、子会话已回收)或宿主没有 sessions 服务时,整枚不渲染,不留空壳。
  • 只读读数,指针不是"可点";数字用等宽数字,跳动时宽度不抖。

胶囊(输入框上方)

dsh-hud · git:(main*) ↑1 ↓2 M4 A1 ?1 │ ●3
  • dsh-hud —— 工作区名(当前会话的目录名)。太长从中间省略,完整路径看悬停。
  • git:(main*) —— 分支。* 表示工作区不干净;detached 时是 git:(detached abc1234)。
  • ↑1 ↓2 —— 与上游的领先 / 落后(为 0 不显示)。
  • M4 A1 ?1 —— 改动计数,只列非零项:M 修改 · A 新增 · D 删除 · R 重命名 · C 复制 · T 类型改变 · ? 未跟踪 · ! 冲突。
  • ●3 —— 本会话改过 3 个文件(没有就不显示)。

点它开面板;悬停给出完整路径、上游与各类计数。不在 git 仓库里也会显示(只有工作区名 + git:(非 git 仓库))。

工具胶囊(同一行的右边,只在跑过工具后出现)

◐ bash: pnpm test 1.2s                                     ← 正在跑(秒数实时跳)
✓ bash ×16 │ ✓ apply_patch ×6 │ skills: office-xlsx ×2 +2   ← 空闲
  • 每个工具一个计数;前面的 ✓ / ✗ 是它自己最近一次调用的结果。
  • skills: 后面是会话调用过的技能名(不是"技能调了几次"—— 看得出是哪一个)。
  • 最多铺 3 个工具、2 个技能,其余收成 +k;悬停里有完整清单与最近几条的执行结果。

面板(点胶囊打开)

面板:左边是改动概览与本会话改了哪些、改动清单、最近提交、标签;中间是这次提交的明细;右边是差异

上图是「看某次提交」时的样子:左边是面板本身,中间是这次提交改了哪个文件,右边是差异。标题栏可拖动,⟳ 刷新 · ⌖ 复位位置 · ✕ 收起。

  1. 仓库路径 · 上游 · 短 oid
  2. 改动概览 —— 按类型分组的彩色计数;干净时写「工作区干净」。
  3. 本会话改了哪些 —— 一行计数(本会话改过 3 个文件 · 另有 2 个可能相关 · 1 个已不在 git 现状里)加开关:只看本会话改的、只看最近一轮(拿得到回合信息时才出现);有已审标记时还有 已审 3/8 与 清空已审。
  4. 改动清单 —— 每行 标记 状态字母 路径,重命名读作 旧 → 新。
    • 行首:● 确定改过 · ◐ 可能相关(从命令里看出来的,悬停给出那条命令)· ○ 与本会话无关。
    • 行尾:○ / ✓ 是审阅标记 —— 点一下或按 v 切换;✓ 变黄表示改动又变了,需要重看。
    • 点任意一行看这个文件的差异。
  5. 最近提交 —— 短sha 标题 [HEAD] 2026-10-16 14:18;点一行看这次提交,再点一次收起。
  6. 标签 —— tag 名 短sha [HEAD] 时间,新的在前;点一行看它指向的提交。仓库没有标签时会写一行「这个仓库还没有标签」。

时间一律是完整年月日 + 时分(本地时区),提交与标签两处一样。

差异与提交明细

  • 看差异:两栏 —— 左边还是面板,右边是差异。工具栏有 未暂存 / 已暂存 页签、自动换行、复制差异。点 hunk 头可折叠那一段。
  • 看提交:三栏 —— 面板 │ 这次提交 │ 差异,并自动打开这次提交的第一个文件。Esc 或 ✕ 收起。
  • 两条抓握可以拖:右边缘那条调差异栏宽度(默认 470px);提交明细栏右边那条调提交明细栏(默认 240px)—— 路径被截断就往左拖。两条宽度都会记住。
  • 看图片改动:二进制文件里认得出是图片时(PNG / JPEG / GIF / WebP / BMP,按文件头认,不看扩展名),差异栏画成两张图并排 —— 也可以切成单张来回看 —— 并给出尺寸变化与字节变化(1024×768 → 1024×512、2.0 KB → 1.0 KB)。两侧各自说明"为什么画不出来":超过单侧 4 MB 预览上限、不是可预览的图片、或缺这一侧(新增 / 删除)。未暂存看「索引 → 工作区」,已暂存看「HEAD → 索引」,提交明细看「父提交 → 这次提交」—— 与文本 diff 的页签语义完全一致。
  • 图片缩放:工具条上是常显的 − / 档位 / +:默认「适应宽度」,档位走 25% / 50% / 100% / 150% / 200%(200% 封顶),点档位本身回到「适应宽度」。固定档位按图片固有像素算宽度(宽高由宿主一并给出,第一帧就算对,不用等图片加载),超出部分由差异栏横向滚动。档位会记住(与「自动换行」一样落盘)。
    内置的右侧文档预览也有缩放,但它的控件是藏在"预览区底部 72px 的悬停感应带"里的浮层(CSS 默认 opacity:0,指针离开 420ms 收起),滚轮缩放还必须按 Ctrl/⌘ —— 看不见按钮是正常的;这一排按钮就是为了不依赖它。

差异栏里的图片改动:工具栏是未暂存/已暂存/自动换行/复制差异,下面是「并排」与 − 100% + 缩放按钮,橙色高亮写着「尺寸 190×140 → 230×160」和「8.8 KB → 11.4 KB」,两张图左右并排,左标「索引」右标「工作区」

上图:定了 100% 档位的两张图(左=索引里的旧版,右=工作区的新版),尺寸与字节的变化在标题行上一眼可见。

轮尾的「本轮图片改动」(在内置改动卡片旁边)

内置那张「已编辑 N 个文件」的卡片,点一行是打开本轮的 review tab —— 图片在那里看不见(内置正文对二进制只给一句文案,而且没有给插件留正文槽位)。所以本插件在同一处轮尾放了一条自己的门:

轮尾的「本轮图片改动」:三张缩略图,命令行旁听来的两张带 ◐ 标记,每张后面跟着一个 ⇄,末尾写「还有 3 个」

  • 点缩略图 → 在右侧内置文档预览里打开这张图(图片原生渲染、可缩放);
  • 右边那个 ⇄ → 打开本插件的面板,看这张图的前后对比(内置预览只有当前这一版);
  • 只列这一轮改过的图片(按会话归因里的回合号收窄),最近改的在前,最多 4 张 + 还有 N 个;这一轮没动过图片时整条不渲染;
  • 归因两档都收:写文件/编辑工具改的算确定(不标符号),从 shell 命令里认出来的标 ◐、悬停给出那条命令 —— 图基本是脚本产出的(python gen.py、cp、curl -o),只收确定档等于收不到东西。

侧栏会话行(悬停或点行尾 ⋯)

侧栏那一行本身没有标记;信息在按需展开处,都是文字:

main* ↑0 ↓0 · 已修改 7 未跟踪 2
本会话改过 3 个文件 · 命令旁听到 4 个可能改动的路径(1 个现在有差异)

干净时写明「工作区干净」「本会话没有改动记录」。

键盘

先在面板里点一下(或 Tab 进去)才接管按键;点到面板外就交还。Cmd/Ctrl/Alt 组合键与输入框里的按键一律不碰。

键作用
↑ ↓上下移动选中行(只移动,不打开)
Enter打开选中的那条
[ ]上一个 / 下一个文件,并直接打开
n p下一个 / 上一个 hunk(折叠着的会展开)
Space折叠 / 展开当前 hunk
v把当前行标成「这一版我审过了」(再按取消)
r重新读取
Esc退一层:先收右栏(差异 / 提交明细),再按才收面板

看提交明细时,↑ ↓ Enter [ ] 作用于明细那一栏的清单。

它不做什么

  • 只读:不写 index、不动工作区与 git 配置,不执行 add / commit / checkout / fetch;不显示凭证。读文件内容只有一种情形:看图片改动时读那两侧的字节 —— 只读、只在内存里、走数据 URL 画出来,不落盘、不外链。
  • 归因是两档估计:经写文件 / 编辑工具的算「确定改过」;从 shell 命令里认出来的算「可能相关」(> >> tee、sed -i / perl -i、mv / cp / rm / touch / dd of=、git checkout|restore <路径>)。会漏也会多报,所以永远标 ◐,不冒充 ●;其余命令只记进命令历史,不猜路径。
  • 记录不落盘:会话改动与工具活动都活在宿主进程里,重启归零;每个会话会写明「自 … 起记录」。
  • 上限:改动清单 200 条、单会话归因 500 个文件、标签 100 个、最近提交 10 条 —— 超出只计数并标 truncated。
  • 图片预览的边界:只认 PNG / JPEG / GIF / WebP / BMP(按文件头,不认 SVG);单侧超过 4 MB 只报大小不画图;只在本插件的差异栏里生效 —— DSH 自带的改动对比页(内置 deliverables 的 changes-review 页签)没有给"文件正文"留槽位,插件改不了那一页。
  • 审阅签名用 size + mtimeMs:touch 一下(内容没变)也会让「已审」失效 —— 宁可让你多看一眼。
  • 计数按文件算:未跟踪不折叠目录(与编辑器一致);同一个文件「既暂存又改动」算 1 条。

存在浏览器里的东西

键内容
dsh-hud.ui.v1面板展开状态、拖动位置、两条拖出来的宽度、开关
dsh-hud.reviewed.v1「已审」标记(按工作区 + 文件记签名,最多 200 条)
dsh-hud.debug最近 24 行自诊断 —— 排查「界面没反应」用,可随手删

开发

  • lib/index.js:宿主半(跑 git、提供 /dsh-hud-rpc)。
  • lib/client.js:浏览器半(无构建步骤,手写 JS,只依赖种子模块 react)。
  • npm test:全部用例(node --test test/*.test.mjs)。
  • docs/dock-slot-host.md:把输入框上方那一行做成「可注册行内宿主」的提案,给上游看的。
  • 发版:npm run tag && npm publish。prepublishOnly 先跑测试,再校验「版本号 ↔ git tag」(工作区要干净、v<版本> 要存在且指向 HEAD),对不上就发不出去。

许可

MIT

Plugins associés