@yangzhe1991/dsh-code-review
One-click standalone two-column code review page for Git diffs in the conversation: line numbers, add/delete coloring, character-level highlight, hunk-aware per-file sections, a file nav sidebar and a stats bar; line comments submit back to the DSH composer, and the UI follows the DSH locale.
Install
dsh plugin --profile web add @yangzhe1991/dsh-code-review
Sandbox test results
| Stage | Result |
|---|---|
| 1 install | ✓ |
| 2 list | ✓ |
| 3 mount | ✓ |
| 4 boot | — |
Four stages run in an isolated sandbox: install (network on) → list → mount → boot (last three with no network).
README
dsh-code-review
[English](README.md) | [中文](README.zh.md)




dsh-code-review 是 DSH (DeepSeek Harness) Web UI 的浏览器插件:把对话里的 git diff 输出变成一键打开的独立标签页 Code Review 页面 —— 双列、对人类友好的视图(左侧旧文件、右侧新文件,两侧都带行号),完全不受聊天窗口宽度/高度限制。
自 0.3.0 起还能把审查这件事本身也委派出去:一键 AI 审查按钮创建一个干净上下文的 sub agent,独立审查这段变更,并与主 agent 往返讨论直到达成一致 —— 一双从未见过产出这段代码的对话历史的「第二双眼睛」。
聊天窗口本身保持原样:只要出现 git diff,对应块(markdown diff 代码块、或产生 diff 的 bash 工具行——折叠状态也显示)上就自动出现一个「在新标签页打开」小按钮,点一下即打开审查页。
对话里提到本地 .diff / .patch 文件路径时,路径会自动变成查看链接按钮——反引号里的路径原地变成小胶囊按钮,纯文本路径在消息下方补一行按钮;点击直接打开该文件的 Code Review 审查页(浏览器读不了本地文件,由插件宿主侧代读,只读绝对路径、仅限 .diff/.patch 后缀、≤5MB)。
兼容性
- dsh ≥ 0.1.2-alpha.4 — 自 0.1.5 起完整支持。Web UI 重构(聊天快照从
useSession((s) => s.chat)迁移到会话标准的useChathook;markdown 代码块 DOM 包了一层bannerWrap层)在两条检测路径上均已适配:markdown diff 块与折叠的 bash 工具行。自 0.2.1 起在 dsh 0.1.3-alpha.2 上验证通过,自 0.2.2 起在 dsh 0.2.0-rc.1 上验证通过,自 0.3.0 起在 dsh 0.2.1-rc.2 上验证通过(含 AI 审查暂存路由与 composer 自动发送)。 - AI 审查对工具的要求 —— 指令要求主 agent 用
spawn_teammate(context: "fresh")(Agent Teams profile)或subagent工具加send_message(普通委派装配)。宿主上没有任何委派工具时,agent 会被要求明确说明并自行以干净视角审查。自动发送依赖 composer 的submitaction(dsh 0.2.x);旧版宿主上指令只填入草稿,由你自己按回车发送。 - 0.2.2 为什么存在 —— dsh 0.2.0-rc.1 会把每个声明的
@deepseek-ai/dsh-*peer 范围与运行时版本比对,不匹配就跳过整个插件(^0.1.3-alpha.2不含0.2.0-rc.1)。本版没有代码改动,只是把这些范围放宽为^0.1.3-alpha.2 || ^0.2.0-rc.1。在 0.2.0-rc.1 上,已装好的 0.2.1 也可以不升级直接放行:授予精确版本豁免即可(dsh plugin --profile <profile> allow-version @yangzhe1991/dsh-code-review@0.2.1 --dsh-version 0.2.0-rc.1 --accept-risk)。 - dsh 0.1.0-rc.x — 仍通过旧版快照路径支持。
- 0.3.0 顺带修复 —— 独立审查页「复制原始 diff」的成功反馈引用了脚本作用域变量,静默抛
ReferenceError(复制本身仍成功);现改为全局定义在前再使用。
功能
- ⬅️➡️ 双列并排视图 —— 旧文件在左、新文件在右,两侧各自带行号,类似 GitHub 的 split review。
- 🟥🟩 增删配色 —— 删除行红底、新增行绿底;连续「删除块 + 新增块」逐行配对成同一行的「变更」(GitHub 对齐方式)。
- 🔎 行内字符级高亮 —— 同一行只改几个字符时,精确高亮那几个字符(更深一档的红/绿背景,公共前后缀剥离)。
- 💡 基础语法高亮 —— 关键字、字符串、注释、数字着色,颜色复用官方 shiki 主题变量(按文件扩展名推断语言,未知语言自动跳过)。
- 🧷 hunk 感知 —— 每个
@@hunk 头保留为分隔行(含 section 名);一个 diff 里的多个文件拆成独立文件段,带状态徽章(修改 / 新增文件 / 删除文件 / 重命名 / 二进制)。 - 🗂️ 文件导航侧栏 —— 左侧列出所有文件,点击跳转。
- 📊 统计条 —— 顶部吸顶显示
+N −M · F 个文件,带「复制原始 diff」按钮,页面底部有可折叠的原始文本区。 - 🎨 主题一致 —— 打开时继承 DSH 当前主题色,深浅色模式自动跟随。
- 📜 整页滚动 —— 无高度限制,几千行自然滚动,超长行折行显示。
- 💬 行内评论 —— 悬停任意行号点击即可在该行提评论(类似 GitHub review),行号旁显示评论数徽章;攒齐后一次性提交 —— 可选 Looks Good To Me ✓ 或纯评论,提交后自动写入 DSH 对话框(
文件名:行号 — 评论逐条列出),直接发给 agent。 - 🤖 一键 AI 审查(0.3.0 起;0.3.1 起修改直达) —— 所有带「在新标签页打开」按钮的地方(markdown diff 块、bash 工具行、终端卡片、独立审查页)都多一个 AI 审查按钮。一键完成:diff 由宿主侧暂存为临时文件,指令自动写入对话框并发送,主 agent 随即 ① 创建全新干净上下文的 sub agent(
spawn_teammate传context: "fresh",或subagent工具;禁止 fork);② 让它以独立审查员身份审查 diff(可读源码、跑测试验证怀疑点);③ 对每条有分歧的发现用send_message往返讨论,直到双方对每一条结论达成一致;④ 双方一致认为必须修改的条目无需审批直接改,改完让 sub agent 复查修改本身并跑构建/测试,全部改好才汇报:修改清单(附修改后 diff)、排除的怀疑点、最终结论 —— 用户只 review 最终修改结果。 - 🔗 本地路径一键查看 —— 对话里出现
…/xxx.diff/…/xxx.patch绝对路径时自动变成链接按钮:反引号内的路径原地变成小胶囊按钮,纯文本路径在消息下方补一行右对齐按钮;bash 工具输出里列出的路径也会出现在工具行按钮排上。点击后打开该文件的 Code Review 页,读取失败(文件不存在/非 diff/超 5MB)时按钮短暂变红提示。 - 🌐 中英双语 —— 跟随 DSH 界面语言(官方 locale 服务):中文界面显示中文按钮与审查页,其他语言一律英文。
截图
按钮出现的位置
1. assistant 消息里的 markdown 代码块 —— ``` `diff `` / `` `patch `` 语言标签,或内容形似 git diff 的任意代码块(比如贴在 text` 围栏里)。代码块默认折叠(只留标题行 + 按钮),带「展开/收起」开关,想看原始文本就内联展开。
2. bash 工具行 —— agent 在 bash 工具里跑 git diff 后,按钮加在工具行上(折叠状态也可见;折叠行 DOM 里没有输出内容,从会话数据层检测)。详情面板里的终端卡片同样支持。
3. 本地 diff 路径(0.2.0 起) —— assistant / 用户消息里出现绝对路径的 .diff/.patch 文件时:
- 反引号内的路径(如 `
/Users/me/proj/patch.diff`)原地变成内联胶囊按钮,跟在路径后面; - 纯文本路径在消息下方补一行右对齐按钮(多条路径逐个列出);思考块与代码块内的路径不捕获(前者默认折叠、后者已有自身机制);
- bash 工具输出里列出的路径加在工具行按钮排上。
4. AI 审查(0.3.0 起) —— 🤖 按钮随上述所有入口出现,独立审查页顶栏也有一个。
流式输出有专门处理:内容稳定约 1 秒后按钮才出现,半截 diff 不会产生残缺页面。
点击路径按钮时:插件宿主侧(webServer 注册的路由)读取本地文件内容(仅绝对路径、支持 ~ 展开、仅 .diff/.patch 后缀、≤5MB、不设 CORS),浏览器侧再把内容渲染成独立审查页;读取失败时按钮短暂变红提示。读取需重启 dsh web 才生效(node 半在宿主启动时注册路由),浏览器半改动硬刷新即可。
AI 审查的工作方式
浏览器端没有创建 sub agent 的官方 API —— 委派工具(spawn_teammate / subagent)在主 agent 手里。所以按钮通过对话框驱动主 agent:diff 文本 POST 到宿主侧第二个路由(/dsh-code-review/ai-review),暂存为临时文件(服务端命名、0600 权限、≤5MB、内容必须形似 git diff、24 小时自动过期清理、目录内上限 1000 个文件)—— 指令保持简短,大 diff 不进主对话上下文。随后浏览器半把结构化指令写入对话框并自动发送(旧版宿主没有自动发送 action 时只填草稿,按钮如实反馈「已填入草稿」)。指令要求主 agent:创建全新上下文的 sub agent(禁止 fork),把暂存文件路径交给它,让它对着真实源码/测试验证怀疑点,用 send_message 对每条分歧往返讨论直到达成一致;讨论后双方一致认为必须修改的条目无需用户审批、直接修改,改完再让 sub agent 复查修改本身、跑能跑的构建/测试,全部改好才汇报(修改清单 + 修改后 diff + 排除条目 + 最终结论)—— 用户是修改结果的最终 reviewer。若暂存路由不可用(升级后宿主未重启)且 diff 较小,则把 diff 内联进指令降级发送;过大则按钮短暂报错提示。写路由带同源守卫:要求 Content-Type: application/json 且拒绝 Sec-Fetch-Site: cross-site(头缺失放行,兼容 curl 调试);独立页 AI 按钮点击 10 秒无回执自动恢复并提示失败。
安装(30 秒)
dsh plugin --profile web add @yangzhe1991/dsh-code-review
重启 Web GUI(Ctrl+C 停掉 dsh web 再重新运行)并刷新浏览器标签页。(dsh plugin 会执行 pnpm add 并自动把 bundle 追加进 dsh.profile.bundles。)
本地开发用路径安装 —— link: 规范保持实时软链,改完代码重新构建 + 重启即可生效:
dsh plugin --profile web add link:/path/to/@yangzhe1991/dsh-code-review
工作原理
插件注册一个 root 作用域的
…(truncated)
Rendered from the README published on npm. Formatted only, not edited.
Versions
Published on npm::11,最后更新 2026-10-25