开发与运行时
#dsh-plugin
dsh-diff-viewer
PiUI 风格 diff 查看器,替换默认 write/edit diff 渲染。
dsh-external
@dsh-external
⬇ 1
★ 27
master
安装
dsh plugin --profile web add github:dsh-external/dsh-diff-viewer
需要可复现安装时,可在仓库后追加 #commit 固定提交。
PiUI 风格 diff 查看器,替换默认 write/edit diff 渲染。
该插件未提供要点说明,请参考仓库 README。
dsh-plugin
- 安装并启动 DeepSeek Harness:
npx @deepseek-ai/dsh web - 在终端执行上面的安装命令(CLI 会解析插件并核验来源)
- 用 dsh plugins list 确认已安装,必要时重启 Harness 生效
插件以当前 dsh 进程的权限运行,安装时可能执行代码。请先通读仓库源码与许可证,确认无破坏性命令与越权访问;本站只做索引,不对第三方插件安全性作担保。
| 代码仓库 | github.com/dsh-external/dsh-diff-viewer |
| 许可证 | 未标注(见仓库) |
| 主要语言 | master |
| 下载量 | 1 |
| GitHub 星标 | 27 |
| 最近推送 | 2026-09-06 |
| 收录日期 | 2026-09-19 |
| 分类 | 开发与运行时 |
事实信息来自公开插件目录快照(2026-10-01),介绍文案由本站再加工。
以下为插件仓库 README 全文(原始内容,由公开目录抓取整理)。
[](https://dshfind.com/zh/plugins/lehhair/dsh-diff-viewer?ref=badge)
# dsh-diff-viewer
DSH Web GUI 的 PiUI 风格 diff 查看器插件:替换 write/edit 工具调用的 diff 渲染(原 DiffBlock)。
- **统一/并排行号**:unified 单栏默认(同一 gutter 并排显示旧/新行号),split 双栏可选(`viewMode`)
- **真实文件行号**:已完成的 edit/write 顶层调用,行号 gutter 显示**文件中的真实行号**(GitHub 式 `@@` 位置),不是片段内 1..N 重新计数;新建文件(create)显示 1..N
- **变更条**:新增实心绿条、删除条纹红条;行背景色带统一延伸到最宽行
- **词级高亮**:行内改动叠加绿/红标记,shiki 语法着色(`highlightLines`)
- **上下文折叠**:长段未变更行折叠为"`N 行未变更`",向上/向下/全部展开
- **窗口化渲染**:固定行高窗口化,大 diff 不挂载全部行;sticky 横向滚动条(hover 显现)
- **复制 + `└ +A -R · N file(s)` 页脚**
- **edit 结果默认展开**:settled 的 edit 结果卡展开即见替换 diff(write 保持默认收起)
- **PTC/Code 嵌套支持**:Code Dispatch 内的 write/edit 子卡片同样接管——嵌套子调用核心短路 meta(`exec.parent` 时不执行 `presentationMeta`),插件按工具参数推导调用时 diff(edit 的 old_string→new_string、write 的整文件新增),错误子调用保持通用错误路径
## 机制
插件通过 **keyed 接管**替换 write/edit 的工具行渲染:ui-tool 的 `tool.call.toolview` 槽是开放 key 域,同一 key 以**更低 priority 阴影**(最低优先渲染)。插件注册 `edit`/`write` 键(priority -1),接管后的行**完全复刻官方 FileMutationRow**(复用官方 ToolRow 样式 + DisclosureRow/StateDot 等平台组件),只把展开后的 diff 卡换成 PiUI 风格 DiffViewer——**不改任何核心,纯插件**,卸载即还原官方行。
- **真实行号机制**:核心的 `FileDiff` 契约只有 `{ path, oldText, newText }`,工具执行时 hunk 的真实起始行(`structuredPatch` 的 `oldStart`/`newStart`)被核心丢弃。插件的 host 半(`lib/index.js`)监听 `agent/created`,在每个 agent 自己的 layer 上 re-register 一份 `edit`/`write` **shadow 定义**(官方 schedule 插件同款模式):schema/render/execute 全部**原样复用原定义**(`...original`),只替换 `output.presentationMeta` 为带行号的版本——用与核心相同的 `structuredPatch`(context 3)复算 hunk,把 `oldStart`/`newStart` 镌进 meta 的 diffs。零额外 diff 计算(同一次 `structuredPatch` 多带两个字段),文件读写语义不变(execute 引用原闭包)。
- **行号透传**:`oldStart`/`newStart` 随 `tool/result` 的 meta 落盘,穿过核心 `diffsFromMeta` 的窄化(只校验三个固定字段、额外字段原样保留)与插件自身的 `narrowDiffs`(畸形值拒绝),到达 DiffViewer 渲染真实行号。
- **无锚点安全降级**:老会话日志(meta 无行号)与 PTC 嵌套子调用(核心在 `exec.parent` 存在时短路 `presentationMeta`,meta 恒缺失)没有锚点 → 行号 gutter 隐藏(回到无行号的 diff 块),绝不显示编造的假行号。create(`oldText: null`)的 newText 即整个新文件,1..N 真实 → 显示。
- **不限制高度**:展开的 diff 直接撑开显示完整内容(不套滚动容器),窗口化渲染保证超大 diff 依然高效
- **diff 数据(dsh 0.1.2+ 契约)**:Host 的 `presentCall`/`presentResult` 视图不再进入 Client,diff 卡完全从**原始事件字段**派生——running 用参数推导的调用时 diff(edit 的 old_string→new_string、write 的整文件内容),settled 用 `tool/result` 落盘的 `meta.diffs`(应用后的 hunks,即行号所在的通道);执行错误走官方行的错误摘要 + IN/OUT 卡
- **嵌套兜底**:Code Dispatch 子调用(PTC 模式)的 meta 恒缺失(同上),插件回退到参数的调用时 diff——与官方行渲染同一调用的 running 态一致
## 效果
[图片: image]
## 安装
### 方式一:GitHub 仓库直装(源码 + 构建产物)
`lib/` 构建产物**已提交进仓库**,因此 `github:` 直装可直接工作(market 的 Install 按钮即走此路径):
```sh
dsh plugin --profile web add "github:lehhair/dsh-diff-viewer"
```
> 直装装的是仓库当前 commit 的构建产物。想要跟随最新 commit 请用 Release 资产(见下),它永远指向最新**发版**。
### 方式二:GitHub Release 构建产物(推荐,跟随发版)
每次发版后,GitHub Actions 自动构建并把 tarball 附加到 [Releases](https://github.com/lehhair/dsh-diff-viewer/releases) 页。`releases/latest` 永远指向最新版本,安装链接不需要随版本改动:
```sh
# 直接用 latest 资产 URL(永远是最新版):
dsh plugin --profile web add "https://github.com/lehhair/dsh-diff-viewer/releases/latest/download/dsh-external-dsh-diff-viewer.tgz"
# 重启 dsh web 生效
dsh web
```
> ⚠️ 升级注意:pnpm 会按 URL 缓存 tarball——同一 `latest` 链接在出新版本后可能命中旧缓存。升级失败/装到旧版时,先 `dsh plugin --profile web remove @dsh-external/dsh-diff-viewer`,再 `pnpm store prune`(或删除 `pnpm store path` 输出目录中的对应缓存)后重新安装。
### 开发环境(从源码)
```sh
# devDependencies 用 link: 指向 ../dsh2026/deepseek-harness(本地 deepseek-harness checkout)
pnpm install && pnpm run check # typecheck + test + build
# 直接安装本地目录,或 npm pack 后装 tarball:
dsh plugin --profile web add E:\dev\dsh-diff-viewer
```
> Windows 注意:`dsh plugin add <本地目录>` 的 `link:` 绝对路径有 junction bug(pnpm 拼错目标)。用 **tarball**(`npm pack` 后 `dsh plugin add *.tgz`)可绕过。
> 发版注意:`lib/` 已提交,源码改动必须同时重建并提交 `lib/`(CI 的 `check` 后会校验 `lib/` 与源码一致,不一致即失败)。
## 卸载
```sh
dsh plugin --profile web remove @dsh-external/dsh-diff-viewer
```
## 开发
```sh
pnpm install && pnpm run check # typecheck + test + build
```
测试需要 workspace 内的 `@deepseek-ai/dsh-*` 包(devDependencies 用 `link:` 指向 `../dsh2026/deepseek-harness`,vitest alias 统一 react 单实例;接管行复用 ui-tool 的 `ToolRow.module.css`,经包导出的 src 子路径内联进 bundle)。
## 友情链接 / Friend Links
- [DSHFind](https://dshfind.com/) — DeepSeek Harness 插件市场与学习社区
数据来源:公开的 DeepSeek Harness 插件目录与各插件 GitHub 仓库。本站为独立第三方目录,与 DeepSeek、幻方(High-Flyer)及插件作者均无隶属或背书关系。