npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@konnga/dsh-hud

v0.9.2

Published

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

Readme

dsh-hud

release node license

English | 中文

DeepSeek HUD 状态面板:分支、ahead/behind、改动清单与差异,外加「这个会话改过哪些文件、审到哪了、跑了什么工具」。

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

安装

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

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

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

功能总览

| 功能 | 一句话 | 在哪儿 | | ------------------------------ | ----------------------------------------------------------------------- | ------------------------------------ | | Git 胶囊 | 工作区名、分支、ahead/behind、改动计数、本会话改过几个文件 | 输入框上方那一行,最左(点它开面板) | | 工具胶囊 | 正在跑什么(实时秒数)、各工具调用次数、用过的技能 | 同一行,中间 | | 会话计时胶囊 | 本次会话已运行多久;悬停给模型 / 工具墙钟与轮次 | 同一行,最右 | | 面板 | 改动概览、改动清单、最近提交、标签;点任意一行看差异 | 点 Git 胶囊 | | 差异与提交明细 | 未暂存 / 已暂存、自动换行、复制差异;图片并排对比 + 缩放 | 面板右侧,可拖动 | | 轮尾「本轮图片改动」 | 这一轮动过的图:点开看单张,⇄ 看前后对比 | 内置「已编辑 N 个文件」卡片旁 | | 侧栏会话行 | 悬停或点 ⋯ 展开:git 摘要 + 本会话归因 | 侧栏每个会话行 | | 键盘 | 面板内 ↑↓ Enter [ ] n p Space v r Esc | 面板激活后 | | 输入框 ↑ 召回 | 空输入框按 ↑ 带回上一条 prompt | 输入框里 |

你会看到什么

胶囊(输入框上方那一行)

dsh-hud · git:(main*) ↑1 ↓2 M4 A1 ?1 │ ●3   │   ✓ bash ×16 │ …   │   ⏱ 2h 14m

三枚胶囊的悬停提示是插件自己画的气泡(不用浏览器原生 tooltip —— 它在真机上不出现,延迟与样式也控制不了)。

Git(最左)

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

工具(中间,运行过的工具才出现)

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

会话计时(最右)

⏱ 2h 14m
  • 本次会话已运行多久。口径与 codex-hud 的会话时长一致:现在 − 会话创建时刻(含等待与空闲)。格式 <1m / 45m / 2h 14m / 3d 2h。

  • 悬停补上这段时间真正在干什么:

    本次会话运行时长 · 创建于 2026-10-14 17:58 · 其中模型 1h 29m、工具 23m · 27 轮 / 380 步

    后两项来自内置 sessionStats 投影;那个投影没有时只显示挂钟时长,不编造。

  • 刚重启的头几秒可能还没有它:会话是异步恢复进宿主存储的(实测约 30 秒)。所以取数失败按 3 秒重问,拿到后改成 60 秒一次。会话已归档或宿主没有 sessions 服务时,整枚不画。

实机效果图:

悬停会话计时胶囊:上方弹出气泡写着「本次会话运行时长 · 创建于 2026-10-14 17:58 · 其中模型 2h 49m、工具 36m · 47 轮 / 607 步」,下方是胶囊本身「⏱ 4d 16h 31m」

同一套气泡也用在 Git 与工具胶囊上(Git 那颗是多行的:完整路径 / 上游 / 各类型计数)。

面板(点 Git 胶囊打开)

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

上图是「看某次提交」时的样子。标题栏可拖动,⟳ 刷新 · ⌖ 复位位置 · ✕ 收起。

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

时间一律是完整年月日 + 时分(本地时区)。

差异、提交明细与图片

  • 看差异:两栏,工具栏是 未暂存 / 已暂存 / 自动换行 / 复制差异;点 hunk 头可折叠那一段。
  • 看提交:三栏 —— 面板 │ 这次提交 │ 差异,并自动打开这次提交的第一个文件。
  • 两条抓握都能拖:右边缘那条调差异栏宽度(默认 470px),提交明细栏右边那条调它(默认 240px)。两条宽度都会记住。
  • 看图片改动:认得出是图片的文件(PNG / JPEG / GIF / WebP / BMP,按文件头认,不看扩展名)会画成两张并排,并给出尺寸与字节变化(1024×768 → 1024×512、2.0 KB → 1.0 KB)。画不出来时说明原因:超过单侧 4 MB、不是可预览的图片、或缺这一侧(新增 / 删除)。
  • 图片缩放:常显的 − / 档位 / +,默认「适应宽度」,档位 25% / 50% / 100% / 150% / 200%(按图片固有像素算宽度),点档位本身回到「适应宽度」。档位会记住。

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

轮尾的「本轮图片改动」

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

内置那张「已编辑 N 个文件」的卡片里看不到图片,所以本插件在同一处轮尾放了自己的门:

  • 点缩略图 → 在右侧内置文档预览里打开这张图;
  • 点 ⇄ → 打开本插件的面板,看这张图的前后对比(内置预览只有当前这一版);
  • 只列这一轮改过的图片,最近改的在前,最多 4 张 + 还有 N 个;这一轮没动过图片就整条不渲染;
  • 归因两档都收:工具改的算确定,从 shell 命令里认出来的标 ◐(悬停给出那条命令)—— 图基本是脚本产出的,只收确定档等于收不到。

侧栏会话行

侧栏那一行本身没有标记,信息在悬停或点行尾 ⋯ 展开处:

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

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

键盘

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

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

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

输入框里按 ↑ 召回上一条 prompt

输入框为空时按 ↑,带上一条 prompt;继续按往更早翻,↓ 往回翻,翻过最新一条就回到你原来的草稿。

  • 只处理纯文本:/命令、@文件 本来就是文本,照原样带回来仍然有效;附件、图片不会跟着回来。
  • 数据来自会话日志(内置 turnOutline 投影),不是插件自己记一份 —— 重启、分页、压实都不影响,在别的客户端发过的话也能召回。宿主的投影没有时,整个功能静默不启用。
  • 输入框非空时完全不接管,多行草稿里的 ↑ 永远只是移动光标,也不会跟 / 命令、@ 提及的弹窗打架。带修饰键、输入法组合中、有选区时同样让路。
  • 你一打字就退出历史模式,草稿不会被错还原。

实现说明:DSH 的输入框是 Lexical 的 contenteditable,插件碰不到它的内部模型,只能模拟一次粘贴(失败退到 execCommand、再退到直接改文本),每层都等落地后回读确认。这是全插件唯一贴着 DOM 走的地方,DSH 改结构时它可能失效 —— 失效即静默不启用。

开发

  • src/host/**:宿主半的源码(TypeScript;跑 git、提供 /dsh-hud-rpc),tsc 逐文件产出到 lib/host/**。
  • src/client/**:浏览器半的源码(TypeScript,只依赖种子模块 react);lib/client.js 是打包产物(rolldown),因为 DSH 只加载「一个经典脚本」。
  • 约定:src/ 全是源码,lib/ 全是产物 —— pnpm run build 一次重建两半(tsc -p tsconfig.host.json + rolldown),产物与源码一起提交(DSH 与本机 profile 直接读 lib/)。
  • pnpm test:类型检查(浏览器半与宿主半都是全量 strict)+ 全部用例。
  • pnpm run format:Prettier 统一源码格式(.prettierrc.json;lib/ 是产物、不格式化),pnpm run format:check 只检查。
  • 包管理器是 pnpm:pnpm-lock.yaml 入库;pnpm-workspace.yaml 关掉 autoInstallPeers —— DSH 的客户端服务由宿主提供,不随包安装。
  • docs/dock-slot-host.md:把输入框上方那一行做成「可注册行内宿主」的提案,给上游看的。
  • 发版:pnpm run tag && pnpm publish。prepublishOnly 先跑测试,再校验「版本号 ↔ git tag」(工作区要干净、v<版本> 要存在且指向 HEAD),对不上就发不出去。

许可

MIT