🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

多智能体评审 yutingzhao1991/dsh-review

DeepSeek 客户端
yutingzhao199116 天前有提交已提供中文文档扫描:含敏感能力兼容 / 相关生态

并行调用多个编码智能体评审代码改动并合并结论

30.8/100
综合分
1
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/10/16 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

相关生态插件(非 dsh 原生,按其对应运行时安装)
git clone https://github.com/yutingzhao1991/dsh-review.git

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么
生态应用
桌面端 / Web 外壳,不以 dsh plugin add 安装
装得上吗
本站已在 dsh 0.2.1-rc.5 下真实安装成功
非静态推断
L5 · 运行时冒烟等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 16 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

可执行外部命令读写/删除本地文件
查看扫描证据(共 64 处,展示前 32 条)
  • 读取本地文件
    index.js:99
    return statSync(executable).isFile() ? '' : '(⚠️ 不是普通文件,调用会失败)';
  • 读取本地文件
    index.js:410
    if (statSync(path).isDirectory()) return;
  • 删除本地文件递归
    index.js:606
    await rm(workdir, { recursive: true, force: true }).catch(() => undefined);
  • 删除本地文件递归
    index.js:716
    await rm(workdir, { recursive: true, force: true }).catch(() => undefined);
  • 删除本地文件递归
    index.js:720
    await rm(workdir, { recursive: true, force: true }).catch(() => undefined);
  • 删除本地文件递归
    index.js:729
    await rm(workdir, { recursive: true, force: true }).catch(() => undefined);
  • 读取本地文件
    lib/changes.js:228
    const info = await lstat(absolute);
  • 读取本地文件
    lib/changes.js:270
    const stat = lstatSync(absolute);
  • 读取本地文件
    lib/changes.js:281
    buffer = readFileSync(absolute);
  • 读取本地文件
    lib/reviewers.js:324
    text = await readFile(task.reportPath, 'utf8');
  • 读取本地文件
    lib/schema.js:56
    for (const entry of readdirSync(join(home, 'profiles'))) push(join(home, 'profiles', entry));
  • 读取本地文件
    selftest.mjs:28
    return readdirSync(tmpdir()).filter((name) => name.startsWith('dsh-review-') && !name.startsWith('dsh-review-selftest-')).length;
  • 写入本地文件
    selftest.mjs:86
    if (reportPath !== undefined && options.report !== undefined && options.skipReportFile !== true) writeFileSync(reportPath, options.report);
  • 写入本地文件
    selftest.mjs:233
    mkdirSync(join(WORK, 'src'), { recursive: true });
  • 写入本地文件
    selftest.mjs:234
    writeFileSync(join(WORK, 'src', 'b.js'), 'export const b = 2;\n');
  • 删除本地文件递归
    selftest.mjs:235
    process.on('exit', () => rmSync(WORK, { recursive: true, force: true }));
  • 读取本地文件
    selftest.mjs:658
    return match !== null && readFileSync(match[1], 'utf8').length > 500;
  • 删除本地文件递归
    selftest.mjs:662
    if (kept !== null) rmSync(join(kept[1], '..'), { recursive: true, force: true });
  • 读取本地文件
    selftest.mjs:933
    if (!existsSync(command)) throw new Error('not an executable file');
  • 写入本地文件
    selftest.mjs:1039
    writeFileSync(huge, 'x\n'.repeat(HUGE_LINES));
  • 删除本地文件
    selftest.mjs:1051
    rmSync(huge, { force: true });
  • 写入本地文件
    selftest.mjs:1058
    mkdirSync(binDir, { recursive: true });
  • 写入本地文件
    selftest.mjs:1062
    writeFileSync(join(binDir, `blob-${index}.bin`), blob);
  • 删除本地文件递归
    selftest.mjs:1077
    rmSync(binDir, { recursive: true, force: true });
  • 读取本地文件
    selftest.mjs:1096
    if (!existsSync(command)) throw new Error('not an executable file');
  • 读取本地文件
    selftest.mjs:1120
    if (!existsSync(command)) throw new Error('not an executable file');
  • 读取本地文件
    selftest.mjs:1142
    if (!existsSync(command)) throw new Error('not an executable file');
  • 删除本地文件递归
    selftest.mjs:1413
    if (match !== null) rmSync(join(match[1], '..'), { recursive: true, force: true });
  • 执行外部命令来自配置/变量
    selftest.mjs:2416
    const result = spawnSync(process.execPath, ['--input-type=module', '-e', script], { encoding: 'utf8' });
  • 删除本地文件递归
    selftest.mjs:2419
    rmSync(root, { recursive: true, force: true });
  • 执行外部命令来自配置/变量
    selftest.mjs:2663
    const out = spawnSync(spec.argv[0], spec.argv.slice(1), { cwd: spec.cwd, encoding: 'utf8', stdio: ['ignore', 'pipe', 'pipe'] });
  • 执行外部命令固定命令
    selftest.mjs:2676
    const out = spawnSync('git', args, { cwd, encoding: 'utf8', stdio: ['ignore', 'pipe', 'pipe'] });
扫描于 2026/11/2(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

依赖的 DSH / Cordis 模块
@deepseek-ai/schemastery
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

让你的 dsh 自由调用任意智能体或模型来审查。

README

由 DeepSeek 最新模型翻译生成
dsh-review 代码评审不该绑死在一家身上。把改动交给一个 CLI 编码智能体,或交给一个跑 DSH 配置里模型的子智能体——最后读一份合并好的结论。 配置页 它能做什么 - 两种评审者,都是真智能体。 codex / claude / gemini / opencode / cursor,或你自己拼命令行的任意 CLI;或者一个跑 DSH 配置里模型的子智能体。 - 多个评审者,一份报告。 并行跑;每个评审者一节,按你勾选的顺序排列。 - 评审模式。 强度与提示词起个名字(quick、balanced、deep……)配一次就能复用,不必每次重写评审要求。 - 在 GUI 里配置,而且自动保存。 勾选要用的评审者,其余都收在「高级配置」里;停止输入约半秒后自动落盘,顶部会显示保存状态,最下面仍留一个「立即保存」按钮作手动重试。 - 不碰密钥、不碰端点。 provider 与凭据都留在你的 DSH 配置里,插件只用已经有的。
展开完整文档(README 剩余 1 节)
dsh-review

代码评审不该绑死在一家身上。把改动交给一个 CLI 编码智能体,或交给一个跑 DSH 配置里模型的子智能体——最后读一份合并好的结论。

配置页

它能做什么

- 两种评审者,都是真智能体。 codex / claude / gemini / opencode / cursor,或你自己拼命令行的任意 CLI;或者一个跑 DSH 配置里模型的子智能体。
- 多个评审者,一份报告。 并行跑;每个评审者一节,按你勾选的顺序排列。
- 评审模式。 强度与提示词起个名字(quick、balanced、deep……)配一次就能复用,不必每次重写评审要求。
- 在 GUI 里配置,而且自动保存。 勾选要用的评审者,其余都收在「高级配置」里;停止输入约半秒后自动落盘,顶部会显示保存状态,最下面仍留一个「立即保存」按钮作手动重试。
- 不碰密钥、不碰端点。 provider 与凭据都留在你的 DSH 配置里,插件只用已经有的。

安装

clone 到一个长期保留的位置,然后装进 profile:

git clone git@github.com:yutingzhao1991/dsh-review.git ~/code/github/dsh-review
dsh plugin --profile web add ~/code/github/dsh-review # web 换成你的 profile 名

也可以让智能体调 plugin_manager 的 install_bundle,target 传上面的绝对路径。

装完重启宿主。升级同理:git pull 之后重启。

怎么用

review() // 用你启用的评审者,评审未提交的改动
review({ reviewers: ["codex", "deep-dive"] }) // 这次指定评审者
review({ mode: "deep" }) // 深度模式:多个评审者
review({ base: "main" }) // 工作区相对某个分支的改动
review({ commit: "abc1234" }) // 某个提交引入的改动
review({ instructions: "只看并发与错误处理" })

评审要跑几分钟,所以调用默认立即把 job id 交回(不等):用 job_output 读结论、 job_kill 终止,或者就等着——跑完会自动通知。

评审者是显式启用的:一个都没启用时,不带 reviewers 的调用会直接报错,而不是悄悄把能用的都跑一遍。

评审者

| 类型 | 跑什么 | 自己会读代码吗 | 依赖 |
| cli | 你已经信得过的编码智能体 | 看预设(codex 会自己读仓库) | 本机装了那个 CLI |
| subagent | DSH 子智能体 | 会,它有工具 | 一个 subagent provider |

CLI 预设:codex、claude、gemini、opencode、cursor,或 custom 自定义命令模板。

有一点值得知道:subagent 不写 agentModel 就会继承父会话的模型,所以它不自动等于「第二意见」——想要独立意见就显式指定模型。

子智能体默认带两道保险:不给它 review 工具(免得评审者再起评审者),以及 30 分钟墙钟上限 (timeoutMs 按评审者覆盖;hardTimeoutMs 仍然限制整次调用)。运行期间会报进度,跑得久也不像卡住。

这里刻意没有「把 diff 丢给一个裸模型」这种类型:能自己打开仓库的评审者,比只看到手头材料的更有价值。

- id: review
name: dsh-review
config:
agents:
- preset: codex
model: gpt-5.6-sol
- preset: claude
reviewers:
- id: deep-dive
kind: subagent
provider: spawn
agentProvider: bailian # 你 DSH 配置里的任意 provider agentModel: deepseek-v4.1-flash

子智能体的模型同样来自你的 DSH 配置(provider、密钥、上下文窗口),GUI 里直接列出已注册的那些,插件里不复制任何一份。

评审模式

一个模式就是一束「盯多严、额外说什么、用谁」。

| 字段 | 含义 |
| strength | light / standard / deep——内置的评审措辞 |
| prompt | 这个模式自己的评审指令 |
| reviewers | 这个模式用哪些评审者 |
| when | always / complex / never——给智能体看的评审策略 |

config:
defaultMode: balanced
modes:
balanced:
strength: standard
reviewers: [ codex ]
deep:
strength: deep
reviewers: [ codex, deep-dive ]

一个模式都不配时,插件不追加任何约束——你继续用自己的提示词管智能体就行。when 只有在同时打开 injectPolicy: true 时才生效,而且它只是写进系统提示词的要求,不是强制闸门。

配置项

所有配置都能在 GUI 里改;下面是同一批键在 YAML 里的样子,只列值得知道的:

| 键 | 默认 | 说明 |
| defaultReviewers | 一个都没有 | 调用没给 reviewers 时用哪些;空 = 不启用任何评审者 |
| defaultMode | 不设 | 调用没给 mode 时套用的模式 |
| language | auto | zh / en / auto 报告语言(auto 跟随你的指令) |
| injectPolicy | false | 把各模式的 when 规则写进系统提示词 |
| agents / reviewers | [] | 定义 CLI 与子智能体评审者(agents 是预设简写,reviewers 是完整写法) |
| modes | {} | 命名评审模式 |
| waitMs | 0 | 调用阻塞多久后交回 job id。0 = 立即交回(评审要跑几分钟,等着基本是白等) |
| hardTimeoutMs | 0 | 墙钟上限;0 = 不限制——什么时候停由你决定 |
| maxResultChars | 80000 | 报告上限;超出会截断并给出完整报告路径 |
| maxDiffChars | 160000 | 需要 diff 的评审者能看到的变更正文上限 |

已知限制

- 评审始终在会话工作目录里跑,不能指向别的仓库。
- 一次调用只评一种范围(未提交 / 某个分支 / 某个提交),与底层 CLI 一致;base 与 commit 互斥。范围 + instructions 对子智能体可用,但 codex 这类 CLI 不行(范围开关与 PROMPT 互斥):选中的评审者全都是这种 CLI 时调用会被直接拒绝,否则在报告脚注里点名没收到关注点的那几个。
- 模式的提示词只在没给范围时才能到达 codex(它的 CLI 不允许两者同时出现);范围永远生效,提示词被跳过时报告里会写明。
- codex 只在它信任的目录里能跑(~/.codex/config.toml)。
- base/commit 写了不存在的分支/提交会在起评审者之前直接报错,而不是跑几分钟再报一个「什么都没评」的批次。
- 报告骨架(标题、脚注、错误信息)目前固定中文;language 只影响评审者自己的指令。
- 被截断的报告留在 $TMPDIR/dsh-review-*/report.md;未截断的运行会自己清理。

开发

node selftest.mjs # 用假宿主驱动插件:不需要 DSH、不跑 codex、不调模型

License

MIT
预览分享卡片长什么样 ↓yutingzhao1991/dsh-review
分享 · DeepSeek Harness Hub
yutingzhao1991/dsh-review

并行调用多个编码智能体评审代码改动并合并结论

回到顶部