dsh-review-checkout
Codex 风格的会话文件修改审查:每轮变更卡片(可接管 shell 的 edited 卡片),统计口径为本轮净差异;审查 tab 的 diff 不自动换行、真实行号、按行打开、可拖拽分栏;悬停预览显示整文件差异(每处改动前后 3 行上下文);按轮一键撤回;工具条显示记录占用并可一键清空。记录按会话分片存储,快照用内容寻址 blob 去重并自动 GC。深浅两套配色跟随 DSH 主题,字体跟随 DSH 与已装皮肤(也可选机器上的任意字体并微调字号);设置里可把「用简体中文思考」规则注入全局 AGENTS.md。
安装
dsh plugin --profile web add dsh-review-checkout
沙箱测试结果
| 阶段 | 结果 |
|---|---|
| 1 安装 | ✓ |
| 2 列装 | ✓ |
| 3 挂载 | ✓ |
| 4 启动 | — |
四阶段在隔离沙箱里跑:安装(有网)→ 列装 → 挂载 → 启动(后三步断网)。
README
dsh-review-checkout
DeepSeek Harness(DSH)的会话文件修改审查插件:把每一轮 write / edit 的结果变成一张像官方卡片一样的「已编辑」卡片,配一个能定位到行、能按轮撤回的审查视图。
起点是 cirelir/dsh-change-review,本仓库是其加固 + 与官方 UI 对齐后的重构版,Web(dsh web)与 Desktop 均可用。
亮点
- 每轮一张「已编辑」卡片 —— 与官方
dsh-client-ui-deliverables的卡片同款皮肤(同 token、同 16px 圆角、同图标块、同折叠行),但自带撤销/审核两个官方没有的动作;默认接管官方那张卡片,避免一轮出现两张。 - 审查 tab —— 按轮查看:左文件列表 + 右 diff(分割线可拖动改宽度,双击复位),或「列表」模式每文件一张可展开卡片;语法高亮、真实行号、每文件
+N −M、单文件还原。 - 三级打开链 —— ① 你选的编辑器(定位到行)→ ② 系统默认应用(与官方卡片同一条路)→ ③ 右侧内置预览;每一级失败都会说明原因,不会静默。
- 运行中小胶囊 —— 输入框上方
N 个文件已更改 +X −X,与卡片同一套主题样式。 - 主题跟随 —— 卡片、胶囊、图标全部使用 DSH 主题 token,深浅自动切换;只有 diff 配色保留插件自己的两套预设。
安装
dsh plugin add dsh-review-checkout # 或从 DSH 插件市场安装
确认 profile 注册了 bundle patch(~/.dsh/profiles/<profile>/cordis.patch.yml):
- insert:
- id: diff-review
name: 'dsh-review-checkout'
Host 端(lib/index.js)改动需重启 dsh web / Desktop;纯客户端(lib/client.js)改动刷新页面即可。
功能
每轮卡片(对话流)
项 · 说明
外观 · 复刻官方 ChangedFiles 卡片:.5px 边框 + 16px 圆角、36px 图标块(官方那枚尖括号)、+N −M 统计、折叠行;颜色全部来自 DSH 主题 token
内容 · 标题「已编辑 N 个文件」(单文件时直接显示路径)、每行「相对路径 + +N −M」、时间戳;超过 3 行折叠为「全部 N 个文件 ⌄」
动作 · 撤销(按该轮生成倒序 diff_review_revert op 序列并填入输入框)、审核(跳审查 tab)、点某行 → 跳审查 tab 并只展开该文件
悬停预览 · 鼠标停在某一行上约 350ms,就在该行上方/下方弹出该文件本轮的 diff(浮层行为与官方一致:高度上限 420px、贴近视口自动翻转、跟随滚动重定位)。内容是整文件差异 + 每处改动前后 3 行上下文,远处不连续的部分用 ⋯ 折叠——与官方预览同一观感,单行改动也能看到上下文(不是只显示工具片段)。容器用官方原语 HoverCard(variant:"preview"),diff 行仍由插件自己的渲染器绘制,所以插件色板(设置 → 修改审查 里那套可自定义的 diff 颜色)与语法高亮和审查 tab 完全一致;拿不到精确差异时(旧记录 / 超出 diff 预算)自动退回按 op 片段渲染,最多 400 行并提示去审查 tab 看完整对比
空轮 · 该轮无修改时显示「本轮无文件修改」
持久 · 每个已结束轮次都会渲染,数据按轮向宿主查询,刷新 / 重开对话后仍在
接管 · 默认隐藏官方在同一插槽(conversation.chat.turnTail)的「已编辑」卡片([data-changed-files]);可在 设置 → 修改审查 里关掉接管、两套并存。官方那张交付文件卡片不受影响,仍由官方显示
审查 tab(会话视图)
- 范围:任意一轮 / 「全部修改」(会话累计)。
- 双视图:左侧文件列表 + 右侧该文件 diff;中间分割线可左右拖动调整比例,双击恢复响应式默认宽度(左栏最小 140px、diff 至少 260px),宽度写入
localStorage;面板过窄(<520px)时自动只留 diff。 - 列表模式:每文件一张可展开卡片,同时只展开一个,文件标题吸顶。
- diff:按扩展名高亮 JS/TS/JSON/CSS/C++/C#/Java/Go/Rust/Python/YAML/Shell/CMake 等;行号是真实文件行号:改动发生时即从未截断的快照恢复(
lineHint),其次用存档快照,再次用磁盘上的当前文件定位,只有三者都不可得时才标注为相对行号;每行左侧有「在编辑器中打开该行」按钮。快照被存储上限截断的记录不再允许还原(否则会把文件截断)。 - 不换行:diff 行永远保持一行(
white-space:pre),超宽就由 diff 区自己出横向滚动条——换行会让续行看起来像新行、和行号列错位;两个视图(双视图详情 + 列表模式卡片)与悬停预览一律如此。行本身宽max-content(底色铺满可滚动区域),行尾的「打开该行」按钮position:sticky停在视口右缘,横向滚动时不会跟着跑掉。 - 字体:默认跟随 DSH 与皮肤——插件里每处字体栈都走官方 token(
var(--dsw-font-family)/var(--ds-font-family-code),字号用calc(var(--dsh-content-font-size, 14px) ± Npx)),所以皮肤插件(如@pakiknowledge/dsh-client-ui-skin-claude,它只改写--dsw-*变量)和「设置 → 常规 → 字号大小」都会作用到本插件。工具条右侧的字体:跟随可改为任意系统已安装字体:列表由 host 读取(Windows 字体注册表/ Linux·macOS fontconfig),支持搜索(输入即过滤,回车应用)与直接输入字体名,选择存在localStorage,随时可切回「跟随」。 - 工具条:轮次选择、双视图/列表切换、
+N -M · N 文件、字号步进 + 字体选择器、编辑器选择器。 - 记录占用 + 清空(工具条右侧):显示本会话在磁盘上的记录占用(分片文件 + 它引用的快照 blob,每 10 秒刷新),悬停可见明细:
分片 X + 快照 Y(N 个 blob,按内容共享,可能与其它会话共用)· M 文件 / K 次修改。旁边的「清空」会先确认,然后删除该会话的分片、清空内存记录与视图,并让宿主顺手 GC 掉因此变成孤儿的 blob(按钮旁回显"已清空,回收 N 个快照")。不可恢复;其它会话的记录不受影响(共享 blob 只在不被任何会话引用时才删)。 - 字号:字体选择器左边的
A− 跟随 A+只调本插件的字号(步进 1px,范围 −4…+8px);中间显示跟随表示在 DSH「字号大小」之上不做偏移,点它即恢复跟随。选择存localStorage,字号与行高共用--drv-font-delta一起缩放。 - 文件类型图标:直接复用官方
@deepseek-ai/dsh-client-ui-primitives的FileTypeIcon(代码文件是彩色品牌图标,其它按分类着色);该模块缺失时回退为字母角标。
打开文件:三级链路
顺序 · 方式 · 说明
① · 选中的编辑器 · 宿主 open-with-editor,带 line/col:VS Code / Insiders / Cursor / Windsurf / VSCodium 走 --goto file:line:col,JetBrains 系走 --line N file
② · 系统默认应用 · 官方远端 remote.session.openWorkspacePath({path}) —— 与官方卡片「用默认应用打开」是同一条路(文件关联到 VS Code 时直接拉起它),代价是无法定位到行
③ · 右侧内置预览 · shell 自带的 preview opener,能定位到行
- 编辑器选择器的图标取自宿主图标路由
/open-in-app/icon/<id>,与官方「打开方式」菜单用的是同一枚真实应用图标(未收录的编辑器回退字母块)。 - ② 以前调的是
workspaces.openPath:任何官方客户端组合都没有workspaces服务(客户端 workspace controller 只有 create / rename / pin / archive,没有 openPath),那一步在 web 与桌面都静默返回 false。现已改走官方远端;同理删掉了dsh.client.inject里并不存在的@deepseek-ai/dsh-client-runtime(它的resolveWorkspacePath因此永久不可用)。 - 检测范围(Windows):VS Code / VS Code Insiders / Cursor / Windsurf / VSCodium / Sublime Text / Notepad++ / IntelliJ IDEA / PyCharm / WebStorm;判据是 PATH 上的命令或已知安装路径存在。
- 探测只跑一次:结果按会话缓存 10 分钟,进入审查 tab 不会重复探测;装了新编辑器可在下拉里点「重新检测编辑器」。
运行中小胶囊
会话进行中显示:N 个文件已更改 +X −X,与每轮卡片同一套 token;空闲自动隐藏;窄行下不会把自己压成竖排(flex:none + nowrap)。
注册在 conversation.composer.dock 槽,但不留在槽里:当前桌面版的 dock 落在输入框下方的状态行(紧挨上下文用量),所以 chip 会脱离文档流、浮到最上层(position:fixed + z-index:60),以输入框自身的水平中心为中线、停在其上沿 10px 处——和官方那个"滑到最底"按钮同一层同一带。位置来自 DOM 实测:从 chip 往上找到最近的、真的含输入框的祖先(textarea / contenteditable),窗口 resize 与输入框尺寸变化时重测。找不到可测的祖先(我们没见过的宿主)时不加这个类,chip 保持原样待在槽里,不会消失也不会报错。
设置 → 修改审查
- diff 与角标颜色:深浅两套预设(各 8 色)+ 一键预设,
localStorage持久化。 - 「隐藏官方『已编辑 N 个文件』卡片」开关(默认开)。
- 「往全局 AGENTS.md 注入『用简体中文思考』规则」开关(默认开):宿主把一段规则写进
~/.dsh/AGENTS.md(不存在则创建)。生效时机:无需重启——DSH 每次请求都会重新读取该文件,当前会话也会收到"指令已更新"(设置页也写了这句提示);只有插件自身宿主代码的更新才需要重启 DSH。段落用<!-- dsh-review-checkout:zh-thinking:start/end -->标记:重复注入幂等、关掉开关只移除这一段、你自己写的内容一个字节都不动;若文件里已经有等价规则(例如手写的"始终使用简体中文进行思考"),则只报告"未重复写入"。开关状态存在宿主侧(diff-review-state/settings.json),所以重启后依然一致。 - 记录占用与「清空本会话的修改记录」不在设置页:它们都搬到了审核 tab 的工具条上(见「审查 tab」一节)。
工作原理
tools/result 事件 ──► lib/index.js(Host)
│ 记录 write/edit 的 op(含改动前后快照,单条上限 120k 字符、每文件 100 条)
│ 按 root session 聚合(子代理的改动折进父会话)
│ 追加一行到 ~/.dsh/profiles/<profile>/diff-review-state/<session>.jsonl
▼
session/follow + session/page(官方 RPC;Desktop 走 IPC 桥)
▼
lib/client.js(客户端)──► 每 5s 轮询重建 ──► 卡片 / 审查 t
…(truncated)以上内容来自 npm 上的 README,我们只做格式化,不改内容。
版本
npm 上共发布:21,最后更新 2026-11-02