@feng0531/dsh-code-review
Read-only Git and SVN code review using the current DSH agent model, with change previews, explicit context and approval-gated model requests.
Install
dsh plugin --profile web add @feng0531/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
在 DeepSeek Harness(DSH)的 Agent 对话里审查 Git / SVN 代码变更。插件先预览并核对审查范围,再在当前人类明确授权内,用当前 Agent 选择的模型生成中文问题报告;已明确要求审核且预览匹配时,不重复询问确认。
只读:不修改代码,不自动修复,不提交、回滚或更新你的业务工作副本。
快速开始:第一次怎么用
1. 安装并启用插件
在 DSH 插件管理器中安装并启用本项目,或在终端执行:
dsh plugin add https://github.com/f-e-n-g-0531/dsh-code-review.git
需要 Node.js 22+,以及已安装的 Git 或 SVN 命令行工具。插件依赖 DSH,不是独立命令行审查程序,不能用 npm test 或直接运行源码来发起审查。
安装或升级后,确认当前 DSH 已加载插件。仓库发布新版本不会自动升级正在运行的插件;如当前会话仍未获得新工具,按 DSH 的插件加载提示重新加载或新建会话。
2. 在目标代码仓库创建 Agent 会话
将会话的工作目录设为要审查的 Git 仓库根目录或 SVN 工作副本根目录,并在 DSH 中选好模型。不需要另给本插件配置 API Key。
例如,你的 SVN 工作副本是 D:/work/my-project,就以该目录作为会话工作目录。不要把网页地址或仓库远端 URL 当作本地工作目录。
如果会话工作区中有多个子仓库,见下方“多个仓库”示例。
3. 把这段话发给 Agent
使用 code_review_preview 预览当前仓库所有已跟踪文件的改动。 先告诉我:审查哪个仓库、哪些文件、额外读取哪些上下文、发送给哪个模型,以及哪些文件不能审查。 先不要调用 code_review_execute,等我确认。全程不要修改代码。
这是发在 DSH 对话输入框里的请求,不是终端命令。Git 默认比较 HEAD 与当前工作区的净变化;SVN 默认比较本地 BASE(工作副本记录的基础版本)与当前文件。
预览不调用审查模型,但 Agent 对话本身仍可能使用模型。工作副本模式默认不读 SVN 远端;SVN 历史模式会读取仓库版本,必须另行明确允许远端访问。
4. 检查预览,再确认执行
检查 Agent 展示的:
- 仓库和文件是否选对,有没有遗漏或意外包含的文件。
- 额外上下文是什么;上下文是辅助理解的文件,也可能随执行发送给模型。
- 模型提供方和模型名称是否符合你的数据使用要求。
- 阻断、排除和预算限制;不能审查的文件不能当作已通过。
确认无误后,在同一会话回复:
确认刚才展示的预览范围和模型,使用该 previewId 执行只读审查。
以上是“只预览,等我确认”的流程。若你已明确要求“审核 r7364”(SVN 远端访问仍须单独授权),Agent 应先内部预览,固定并核对范围、模型路由、预算与权限;预览符合当前明确授权时,直接执行,不再要求你重复确认。只要求预览或明确要求等待确认时不得执行;范围、模型或发送目的地超出授权,或授权边界不明确时,先询问。
插件使用预览返回的 ID 执行。默认预览有效期约 5 分钟,返回 expiresAt 与 validForMs;到期、文件、模型或会话目录变化后,需要新预览并重新核对当前授权,不能复用旧预览批准。confirmed:true 表示当前人类已明确授权且本次预览与授权一致,不是无授权绕过。计划最少调用只是初始下限,不是总调用数或耗时上限,后续取证、复核与综合会增加工作量。会话工具权限与宿主安全校验照旧,确认不能绕过限制。
后台执行如何等待
后台任务推荐调用 code_review_wait({jobId, waitFor:"terminal"}),一次最多等待 60 秒,中间检查点继续逐条保存但不会逐条唤醒等待方。任务仍在运行就继续等待;超时返回 changed:false 不代表结束。需要逐事件进度时使用 waitFor:"progress",把返回的 waitRevision 原样作为下一次 after,不要自行加一,也不必每次再查 status。code_review_status 用于主动分页取完整结果或检查点。等待调用取消只停止等待,不取消后台审核。
5. 查看结果
执行工具默认在对话中返回 一份人可读的中文 Markdown 报告,同时保留完整结构化 JSON。首屏先回答所选范围是否查完、记录了哪些候选和哪些结论尚不能下;问题卡按“本次新增(复核支持)”“当前源码问题(复核支持)”“待核实”“原有问题(复核支持)”“已反驳”分区,说明位置、触发条件、影响、依据及已有建议。分区仍遵循严格证据判定:仅 supported 或缺少有效旧新对照不能算本次新增,当前源码模式不作历史新增归因;复核支持和引用校验不等于事实、运行复现或因果证明。
主文聚合未完成原因并给出下一步;完整证据与判定、逐项覆盖、风险计划、执行诊断及聚合限制保留在单独的技术报告;后台任务可用 code_review_status({jobId,detail:"technical"}) 读取,不需要拼接批报告。通俗主文只是已有结果的呈现,不代做源码复审、不隐藏限制、不放宽证据门槛,也不会为改写报告额外调用模型或改变取证算法。执行诊断列出实际加载的插件版本、阶段调用和墙钟统计;累计调用耗时可能并发重叠,不代表纯提供方耗时或可相加的总耗时。
如需保存报告,可以另行告诉 Agent:“将本次报告保存到我指定的位置”。插件本身不会自动在业务仓库创建报告文件。
按场景直接使用
下面的自然语言可以直接发给 Agent。其中只要求预览或明确要求等待确认的示例,不得直接执行;若直接明确要求审核,则按上面的授权规则内部核对预览后执行,不重复询问。
只审查几个文件(Git / SVN 工作副本)
使用代码审查插件,只预览 src/api.ts 和 src/client.ts 的当前改动。 自动补充理解它们所需的依赖文件。先展示范围和模型,等我确认再执行,不修改代码。
对应 code_review_preview 参数(工具参数,不是 shell 命令):
{"selectedPaths":["src/api.ts","src/client.ts"],"autoContext":true}
文件名要替换成仓库中实际存在的变更路径。未跟踪文件不会默认纳入,必须用 selectedPaths 显式选择。省略该参数时,范围是整个仓库的变更,不限于当前子目录。
审查 Git 单个提交
使用代码审查插件预览 Git 提交 abc1234,先展示范围,等我确认后再执行。
{"commit":"abc1234"}
将 abc1234 换成实际提交号。与该提交的唯一父提交比较;根提交与空旧版本比较。合并提交请改用两个版本比较,明确选择旧、新端点。
审查 Git 两个版本之间的变化
预览 Git 的 v1.0.0 到 v1.1.0 之间的代码变化,自动读取必要依赖。先展示范围,不直接执行。
{"baseRevision":"v1.0.0","targetRevision":"v1.1.0","autoContext":true}
比较两个版本的文件树,不自动计算合并基点,也不会把工作区中的未提交正文当作历史正文。commit 不能与这两个参数混用。
只审查 Git 暂存区或未暂存改动
提交前只看已暂存内容,或只想确认工作区里还没暂存的修改:
{"changeScope":"staged"}
staged 比较 HEAD 与索引(相当于 git diff --cached):右侧是已暂存内容,工作区里尚未 git add 的修改不作为变更内容,也不会作为变更正文发送给模型。把值换成 "unstaged" 则比较索引与工作区(相当于 git diff):左侧是已暂存内容,仅作为旧侧基线,右侧是工作区文件。省略 changeScope 时默认仍是 HEAD 到工作区的净变化。
这两个范围只用于 Git 工作副本,不能与 commit、baseRevision、targetRevision、SVN 参数或 reviewMode:"project" 同时使用。未跟踪文件仍默认排除;worktree / unstaged 下用 selectedPaths 显式选择后才会纳入。预览和报告都会标明实际比较的是哪两个内容。
staged 下显式上下文、自动依赖、调用方候选和规则文件仍按工作区当前内容读取,可能包含尚未暂存的修改;预览会列出这些文件。
审查 SVN 单个 revision
例如审查 r7315 引入的净变化,即 r7314 → r7315:
使用代码审查插件预览 SVN r7315(与 r7314 比较)。 允许为这次预览读取当前工作副本对应的远端仓库固定版本。 先展示来源、范围和模型,不发送源码给审查模型,等我确认再执行。不要更新工作副本。
{"svnRevision":"7315","svnAllowNetwork":true}
必须在 SVN 工作副本根目录运行。插件从该工作副本对应的仓库 URL 读取固定版本,不要求先把工作副本更新到 r7315,也不会执行 update。远端认证不可用时会明确报错,不会改用本地文件冒充历史版本。
审查 SVN revision 区间
预览 SVN r7300 到 r7315 两个版本端点的净变化。 允许读取当前工作副本对应远端仓库的固定版本,自动补充同版本依赖。 先展示范围和来源,等我确认后执行,不修改或更新工作副本。
{"svnBaseRevision":"7300","svnTargetRevision":"7315","svnAllowNetwork":true,"autoContext":true}
这是两个版本端点的比较,不是逐一审查区间内的每个提交。revision 使用带引号的十进制数字,不写 r7315、HEAD 或日期;同一路径比较要求旧版本小于新版本;不同分支可使用相同 revision(见下一节)。svnRevision 与区间参数不能同时使用,也不能混用 Git 版本参数。
svnAllowNetwork:true 只允许读取本次工作副本对应仓库的固定版本,不授权更新、合并或任意远端 URL。本地 file: 仓库通常无需此参数。
比较 SVN 两个分支
跨分支、有效继承属性和独立基线替换从正式版 v0.80.1 提供。请先确认当前 DSH 加载的版本;仅更新仓库不会升级宿主插件。
{"svnBaseRevision":"7315","svnTargetRevision":"7315","svnBasePath":"branches/release","svnTargetPath":"trunk","svnAllowNetwork":true,"autoContext":true}
分支路径相对于当前SVN仓库根,不是本地目录或任意URL。旧、新两侧分别固定URL、peg与operative revision;同revision可以比较不同分支。只能在同仓库UUID内比较;嵌套重叠根和不明确来源拒绝,不能推断merge提交归属。
查看有效继承 mergeinfo
{"svnRevision":"7315","svnAllowNetwork":true,"svnEffectiveMergeinfo":true}
显式允许读取选中节点及最近祖先的合并属性,额外读取受共享预算限制;工作副本模式也可使用该开关并保持离线。空属性屏蔽继承,祖先证据不完整、混合BASE或不安全来源显示unknown;结果仅为属性导航,不证明相关revision已经审核。
审查未提交替换
{"selectedPaths":["src/module","src/module/old.cpp","src/module/new.cpp"],"svnReplacementBaseRevision":"7314","svnReplacementAllowNetwork":true}
替换比较的旧侧是你显式选择的目标URL固定历史节点,不是本地BASE,也不证明它就是被删除节点的原始revision。目录后代必须独立选入;只选父目录不能算后代均已批准。远端读取使用独立许可,默认不访问。没有可确认旧来源时明确拒绝,不读取复制源冒充旧节点。
加入业务要求、规则和调用方
只预览 src/api.ts 的改动;业务要求是“请求失败时必须释放连接”。 把 src/types.ts 作为辅助上下文,使用 review-rules.md 的项目规则, 并在 src/clients 目录中寻找引用该变更文件的代码。先展示读取范围,等我确认。
{
"selectedPaths": ["src/api.ts"],
"contextPaths": ["src/types.ts"],
"rulePaths": ["review-rules.md"],
"callerScopePaths": ["src/clients"],
"busine
…(truncated)Rendered from the README published on npm. Formatted only, not edited.
Versions
Published on npm::165,最后更新 2026-11-06