← 返回列表
⚠ 装前注意
一个为 DeepSeek Harness Web GUI 右侧边栏打造的 opencode 风格 Review…
基本兼容但装前注意:npm 同名包「dsh-review」归属 viger1/dsh-review,装到的可能不是本插件 · 最近上游提交 2026/9/25 · 已提供中文文档
为 DeepSeek Harness 添加审查标签页,模仿传统编码代理以进行变更追踪
综合分
32.2
GitHub 分
32.2
用户评分
—
★ Stars
3
周下载量
—
安装插件(需先安装 dsh CLI 引擎:npm install -g @deepseek-ai/dsh)
dsh plugin --profile web add plae-tljg/dsh-reviewnpm 同名包「dsh-review」归属 viger1/dsh-review,装到的可能不是本插件,改用 GitHub 源安装
信任档位:已验证本站已于 3 天前真实安装成功(L4 · 真实安装)
- 是什么
- dsh 原生插件 · chat
- 装得上吗
- 本站已真实安装成功(L4 · 真实安装,非静态推断)
- 安全吗
- 本站尚未对该插件做风险分级(暂未覆盖,不等同于无风险)
- 还在维护吗
- 活跃:最近一次提交在 0 天前
档位由下列信号合成:本站实装验证(真实安装,当前最高到 L4)· 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。下方各区块是它的证据明细。 验证判据与等级说明 →
🟢实装验证通过· 2026/9/23
由本站实装验证器在真实 dsh 环境安装成功,非静态推断。
数据截至 2026/9/25(元数据每日更新 · 实装验证按队列轮转,单条结论的验证时间见上方)
安装兼容性检查⚠ 装前注意
以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。
✓npm 包dsh-review @ 0.1.1
✓Node 引擎要求 >=22 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明
npm 同名包「dsh-review」归属 viger1/dsh-review,装到的可能不是本插件
验证方式:npm registry 存在性 + package.json 静态校验 · 最后验证 2026/9/21 23:35:44
依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/dsh-typert-protocol用户评分
还没有人投票,来当第一个
订阅周报,不错过优质插件更新
每周一封 · 高评分插件 + 新用户活动
README
由 DeepSeek 最新模型翻译生成dsh-review
一个为 DeepSeek Harness Web GUI 右侧边栏打造的 opencode 风格 Review 面板。一个插件同时掌管其数据路径的两端——Host 上的 git 服务和浏览器中的 review 标签页——并以四种方式展示会话工作区:
- 未提交 — 工作树相对于 HEAD 的差异,以目录树形式展示每个已更改文件,附带每个文件的 +added/-removed、分支的总计,以及所选文件的红/绿统一 diff。
- 按轮次 — 智能体在每一轮对话中所做的更改,源自实时对话快照,以相同的树和相同的 diff 主体展示。
- 按提交 — 最近的提交历史,最新的在前;展开某个提交会显示它所触及文件的树,并带有各自的计数,选择某个文件会显示该路径在该提交内部的 diff。提交文件是惰性读取的,仅在打开某个提交时才读取。
- 文件 — 一个普通的工作区浏览器:工作区文件的树,包括被 git 忽略的文件,例如 .env(git ls-files --cached --others 加上 --ignored),同时排除体积庞大的生成目录(node_modules、__pycache__、虚拟环境);右侧显示所选文件的内容,并提供一个可选启用的编辑器(默认关闭)用于直接编辑。文件夹初始为折叠状态,并带有全部展开/全部折叠控件,文件栏可拖拽以加宽或收窄。
┌ 审阅 ────────────────────────────────────────────────────────┐
│ [ 文件 | 未提交 | 按轮次 | 按提交 ] main ↑1 +42 -7 ⟳ │
├──────────────────────┬───────────────────────────────────────┤
│ ▾ src/ +42 -5 │ @@ -14,7 +14,9 @@ export function r… │
│ ▾ api/ +8 -2 │ 14 14 const rows = parse(input) │
│ M api.ts +8 -2 │ 15 - return rows.map(r=>r.id) │
│ ▸ new/ +30 -0 │ 15 + return rows.map(r=>r.key)│
│ ▾ old/legacy/ +0 -5 │ 16 16 } │
│ M renamed.ts +4 -0 │ │
│ U notes.md +30 -0 │ │
└──────────────────────┴───────────────────────────────────────┘
其外观是对 opencode 右侧审阅面板的刻意移植(参见 docs/REFERENCES.md):28px 的树行,6px 圆角,整行悬停/选中效果,旋转的折叠箭头,12px 的文件名,感知语言的文件类型图标(Python、JS/TS、JSON、Markdown 等,通过 harness 自带的 FileTypeIcon),使用主题状态色的全大写更改字母,等宽数字计数,以及分段式来源切换器。
它的功能
- 是目录树,不是扁平列表。 文件按文件夹分组,每个文件夹行携带其下所有内容的总计,单子目录链会折叠为一行(src/client/)——与 opencode 的审阅窗格所用的形态相同。根级文件位于树旁。当只关心文件时,可通过标题栏开关隐藏每个文件夹的聚合信息。
- 查看器逃生通道。 每个已更改文件的 diff 头部都有一个 Open in a tab 操作,它会在侧边栏自带的文件查看器(原生文档预览,或 dsh-better-sidebar 的编辑器)中打开该文件,这样无需 diff 装饰即可阅读。
- 自动换行与水平滚动。 长行默认横向滚动;头部开关可开启自动换行。Uncommitted 和 Rounds 的 diff 主体都遵循此设置。
- 过滤并记住。 每个侧栏都带有一个固定的过滤框,用于缩小树、轮次或提交的范围(提交按主题/短哈希或其触及的文件匹配)。所选来源、侧栏宽度、换行/折叠开关、过滤条件和打开的文件都会按会话保存在 localStorage 中,因此重新打开时会回到你离开时的位置。
- 可折叠的 diff。 Hunk 上下文可调(3/10/30 行,或 All 以拉取整个文件),并从 Git 重新读取;超过六行的连续未更改行会折叠在一行 N unchanged lines 之后,还有一个全部展开控件可一次性打开所有折叠。
- 原地重新加载。 Uncommitted、Files 和 Commits 各自带有一个重新加载控件(⟳);Rounds 来自对话快照,是实时的,无需重新加载。
- 每个未提交的更改,包括已暂存、未暂存和未跟踪的更改,来自 git status --porcelain=v1 -z。
- 每个文件的计数来自 git diff --numstat -z,二进制更改标记为 bin 而不是 +0 -0,外加整个报告的总计。
- 真正的统一 diff,在 Host 上解析为 hunk:上下文行只出现一次,新增和删除各自带有自己的行号槽,每个 hunk 以其 @@ -a,b +c,d @@ 坐标开头。
- 每轮更改,在客户端从对话快照推导:每轮的工具调用(write / edit / str_replace_editor,以及 Code Mode 的 run_code 子调用)被归并到它们触及的文件中,rm 系列删除保留为仅显示的行。
- 每次提交的更改,从 git log 和 git show 读取:提交的文件列表来自 --name-status + --numstat,其按路径的 diff 来自 git show -- ,因此同一棵树和红/绿主体可渲染历史更改。
- 重命名按重命名解析。 状态列表会读取源路径,并对两个名称进行 diff;纯重命名会报告“no text”,而不是整个文件的新增。
- 未跟踪文件通过 git diff --no-index 与空设备进行渲染,因此由 Git 本身决定编码、二进制情况和 hunk 头。
- 路径安全。 路径以裸仓库相对路径规范形式在 --literal-pathspecs 下传给 Git,并为 shell 加上单引号,因此包含空格、、引号或换行符的名称都能精确往返。
- 一个只读的工作区浏览器,外加一个可选启用的编辑器。 Files 视图会列出项目内容(已跟踪、未跟踪以及被 git 忽略的文件,但排除体积庞大的生成目录),以文本形式读取文件,并且——只有在打开编辑开关之后——才会将其写回。写入操作被限制在会话工作区根目录内,拒绝符号链接,并且是原子性的(通过同级临时文件重命名到位)。
- 其他任何操作都不会写入。 Uncommitted、Rounds 和 Commits 只读取;GIT_OPTIONAL_LOCKS=0 可防止刷新时获取索引锁,以免与并发的 Agent 操作产生冲突。
安装
dsh plugin --profile web add dsh-review
或者,从本地检出安装:
dsh plugin --profile web add /path/to/dsh-review
或者直接从本仓库安装:
dsh plugin --profile web add github:plae-tljg/dsh-review
构建产物已提交到 lib/ 下,因此通过 git 安装无需构建步骤。重启 harness(dsweb),然后打开右侧面板的 + 菜单 → 审阅。该标签页会同时注册到原生右侧边栏,以及(当该插件存在时)dsh-better-sidebar 中。
若要在本地检出上进行开发,可将该包符号链接到某个 profile 的 node_modules 中(这样重建可以即时生效),并只重建浏览器端部分:
ln -sfn /path/to/dsh-review ~/.dsh/profiles/web/node_modules/dsh-review
node build/build.mjs
刷新页面即可让客户端重建生效;Host 端部分则需要重启。
构建
node build/build.mjs
构建过程会从 harness 检出中解析 esbuild 和 zod,而不是从本包中解析,因为用于生成浏览器格式的 clientBundle tsdown 预设位于该仓库内部,并未发布。可通过 DSH_CHECKOUT=/path/to/deepseek-harness 覆盖检出路径。
会生成两个产物:
| 产物 | 平面 | 格式 |
|---|---|---|
| lib/index.js | Host(Node) | ESM;所有 @deepseek-ai/ 说明符均为外部依赖,zod 被打包 |
| lib/client.js | 浏览器 | shell 的惰性 CJS 工厂,window.__ModuleLoader__.load({ id, factory }),编译后的 CSS 被内联并在物化时注入 |
| lib/typert.host.js | Host | 手工维护的 Typert 通信清单 |
测试
npm test
tests/parse.test.mjs 在录制的 git 输出上运行 Host 解析器;tests/rounds.test.mjs 针对手工构建的快照驱动轮次推导;tests/face.test.mjs 覆盖带截止时间保护的读取;tests/client-wiring.test.mjs 在 VM 中加载 lib/client.js 并断言每一项注册;tests/render.test.mjs 通过 react-dom/server 渲染树以及两个来源。
架构
src/index.js Host 插件入口:重新导出该服务
src/host/review.js WorkspaceReview —— workspaceReview Remote 服务(git 读取)
src/host/unified.js unified-diff、--numstat、状态和树解析器
src/client/index.js 浏览器入口:挂载、原生和面板子项
src/client/remote.js 客户端 Remote 贡献:编解码器 + 命名空间合并
src/client/definition.js review 标签页类型
src/client/face.js 异步读取;受截止时间保护、受代际保护
src/client/store.js 每个标签页的视图状态(报告、差异、源代码、选择)
src/client/ReviewBody.jsx 源代码切换、树,以及两个差异渲染器
src/client/rounds.js 从 dsh-file-review-tab 移植的每轮推导
src/client/panel.jsx dsh-better-sidebar 桥接(store 订阅 + hooks)
lib/typert.host.js 手工维护的 Typert 宿主清单
types/ 手写声明和仅类型增强
docs/ 参考资料及构建所依据的设计研究
三个客户端子项,而非一个。 Cordis 会守护命名空间访问,而一个缺失的可选服务不应拖住其余部分:mount 子项挂载 Remote 贡献并注册字典,ui 子项注册原生 sidebar.right.pane.tab,panel 子项注册到 dsh-better-sidebar 中——注入 betterSidebar,使其等待该服务,而不是用 ctx.get 与之竞争。
不触碰任何核心装配。 Remote 命名空间通常必须由 packages/api/remotes 进行值导入并挂载;而本插件改为自行调用 ctx.remote.$mount(),这是针对不使用生成产物的贡献的官方逃生通道。
配置
部署上限即该服务的 Cordis 配置:
yaml
- id: review
name: 'dsh-review'
config:
maxDiffBytes: 2097152 # 跨网络传输的最大补丁;更大的会以截断形式到达
maxStatusEntries: 5000 # 上报文件数的上限;其余以截断形式上报
已知限制
- 未提交列表仅存于内存且不会刷新。 它在标签页挂载时以及你按下 ⟳ 时读取;没有文件系统监视。Rounds 视图会实时跟随对话。
- Code Mode(run_code)嵌套编辑 从快照推导;参考插件中宿主侧的 before/after 记录器未移植,因此无法在快照中存活的边缘情况不会被恢复。
- 仅支持桌面分栏。 在 520px 以上,列表与差异并排显示,低于该宽度则堆叠;没有可拖拽的分隔条。
- 无单词级高亮,也无行内评论(opencode 的行内评论功能未移植)。
- Files 编辑器是纯文本区域(无语法高亮;使用浏览器自带的撤销)。二进制文件和被截断上限限制的文件为只读。
- 视图状态按浏览器配置文件存储。 它位于 localStorage 中,以会话 id 为键;清除站点数据(或使用隐私窗口)会重置源代码、宽度、过滤器和选择。
- 仅模式变更不携带正文——权限变更会显示其计数,并显示“无文本”。
参考资料
本文档的开发所基于和针对的环境,以及它所借鉴的每一个项目,都编目在 docs/REFERENCES.md 中,完整的合约研究位于 docs/research/ 下。
许可证
MIT。部分内容移植自 MIT 许可的项目;有关署名信息,请参见 LICENSE。