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

合并请求审查流水线 ddtcorex/maestro-reviewer

DeepSeek Harnessv0.12.0
ddtcorex16 天前有提交已提供中文文档扫描:含敏感能力

为 DeepSeek Harness 提供可插拔的合并请求审查流水线(webhook → 编排器 → 发现项),支持 GitLab 和 GitHub 服务商。

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

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

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add @ddtcorex/dsh-maestro-review
npm 源 · @ddtcorex/dsh-maestro-review 的发布者账号已校验与本仓库一致

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么[目录]—
dsh 原生插件 · market
暂无时间戳·判据 →
装得上吗[实装验证]✓
本站已在 dsh 0.2.1-rc.2 下真实安装成功(非静态推断);本次验证针对插件 v0.15.0,当前版本为 v0.12.0
L5 · 运行时冒烟等级说明 →
数据截至 2026/10/28·判据 →
安全吗[自动扫描]—
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
数据截至 2026/11/04·判据 →
还在维护吗[仓库]✓
活跃:最近一次提交在 16 天前
暂无时间戳·判据 →
图例:✓ 通过! 需注意— 未判定 / 无数据· 「未判定」= 本站尚无数据,不代表插件有问题
档位由哪些信号合成

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

验证判据与等级说明 →

可信度证据

安装兼容性检查✓ 自动检查通过
展开查看检查明细 ↓

以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。

✓npm 包@ddtcorex/dsh-maestro-review @ 0.12.0
✓Node 引擎要求 ^22.19.0 || >=24.0.0 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/13 09:40:48

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

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

读写/删除本地文件
查看扫描证据(共 32 处,展示前 32 条)
  • 读取本地文件
    lib/config-store.js:36
    return JSON.parse(await readFile(runtimeStatePath(dshHome), 'utf8'));
  • 写入本地文件
    lib/config-store.js:45
    await mkdir(dirname(path), { recursive: true, mode: 0o700 });
  • 写入本地文件
    lib/config-store.js:46
    await writeFile(path, JSON.stringify(merged, null, 2), { encoding: 'utf-8', mode: 0o600 });
  • 写入本地文件
    lib/config-store.js:47
    await chmod(path, 0o600);
  • 读取本地文件
    lib/host-orchestrator.js:89
    await stat(path);
  • 写入本地文件
    lib/host-orchestrator.js:122
    await writeFile(join(worktreePath, '.govard.local.yml'), govardWorktreeOverride(projectId, mrIid, keySuffix), 'utf-8');
  • 读取本地文件
    lib/host-orchestrator.js:135
    return (await stat(join(dir, 'vendor', 'autoload.php'))).isFile();
  • 读取本地文件
    lib/host-orchestrator.js:161
    isDir = (await stat(source)).isDirectory();
  • 读取本地文件
    lib/host-orchestrator.js:170
    if ((await lstat(target).catch(() => undefined)) !== undefined) {
  • 写入本地文件
    lib/host-orchestrator.js:182
    await mkdir(join(worktreePath, 'app', 'etc'), { recursive: true });
  • 读取本地文件
    lib/host-orchestrator.js:235
    const wtLink = await lstat(join(worktreePath, 'vendor')).catch(() => undefined);
  • 写入本地文件
    lib/host-orchestrator.js:239
    await mkdir(join(worktreePath, '.govard'), { recursive: true });
  • 读取本地文件
    lib/host-orchestrator.js:245
    if ((await stat(envHostPath)).isFile())
  • 写入本地文件
    lib/host-orchestrator.js:251
    await writeFile(overridePath, buildVendorOverrideYaml(vendorHostPath, envBind), 'utf-8');
  • 读取本地文件
    lib/settings-rpc.js:103
    if (!existsSync(localRepoPath) || !statSync(localRepoPath).isDirectory() || !existsSync(`${localRepoPath}/.git`)) {
  • 读取本地文件
    lib/settings-rpc.js:103
    if (!existsSync(localRepoPath) || !statSync(localRepoPath).isDirectory() || !existsSync(`${localRepoPath}/.git`)) {
  • 读取本地文件
    src/host/config-store.ts:102
    return JSON.parse(await readFile(runtimeStatePath(dshHome), 'utf8')) as Record<string, unknown>
  • 写入本地文件
    src/host/config-store.ts:114
    await mkdir(dirname(path), { recursive: true, mode: 0o700 })
  • 写入本地文件
    src/host/config-store.ts:115
    await writeFile(path, JSON.stringify(merged, null, 2), { encoding: 'utf-8', mode: 0o600 })
  • 写入本地文件
    src/host/config-store.ts:116
    await chmod(path, 0o600)
  • 读取本地文件
    src/host/host-orchestrator.ts:141
    await stat(path)
  • 写入本地文件
    src/host/host-orchestrator.ts:172
    await writeFile(join(worktreePath, '.govard.local.yml'), govardWorktreeOverride(projectId, mrIid, keySuffix), 'utf-8')
  • 读取本地文件
    src/host/host-orchestrator.ts:186
    return (await stat(join(dir, 'vendor', 'autoload.php'))).isFile()
  • 读取本地文件
    src/host/host-orchestrator.ts:212
    isDir = (await stat(source)).isDirectory()
  • 读取本地文件
    src/host/host-orchestrator.ts:218
    if ((await lstat(target).catch(() => undefined)) !== undefined) {
  • 写入本地文件
    src/host/host-orchestrator.ts:229
    if (!dir) await mkdir(join(worktreePath, 'app', 'etc'), { recursive: true })
  • 读取本地文件
    src/host/host-orchestrator.ts:283
    const wtLink = await lstat(join(worktreePath, 'vendor')).catch(() => undefined)
  • 写入本地文件
    src/host/host-orchestrator.ts:286
    await mkdir(join(worktreePath, '.govard'), { recursive: true })
  • 读取本地文件
    src/host/host-orchestrator.ts:292
    if ((await stat(envHostPath)).isFile()) envBind = envHostPath
  • 写入本地文件
    src/host/host-orchestrator.ts:296
    await writeFile(overridePath, buildVendorOverrideYaml(vendorHostPath, envBind), 'utf-8')
  • 读取本地文件
    src/host/settings-rpc.ts:103
    if (!existsSync(localRepoPath) || !statSync(localRepoPath).isDirectory() || !existsSync(`${localRepoPath}/.git`)) {
  • 读取本地文件
    src/host/settings-rpc.ts:103
    if (!existsSync(localRepoPath) || !statSync(localRepoPath).isDirectory() || !existsSync(`${localRepoPath}/.git`)) {
扫描于 2026/11/4(0 天前) · 范围 入口闭包 + 全包扫描 · 来源 npm 发布包

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

社区实装还没有人打卡 · 装过的第一个就是你
依赖的 DSH / Cordis 模块
@deepseek-ai/schemastery@deepseek-ai/cordis@deepseek-ai/dsh-agent@deepseek-ai/dsh-agent-default-model@deepseek-ai/dsh-agent-preset-registry@deepseek-ai/dsh-client-connection@deepseek-ai/dsh-llm@deepseek-ai/dsh-session@deepseek-ai/dsh-session-title@deepseek-ai/dsh-subagent@deepseek-ai/dsh-tools
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 可插拔审查流水线
  • webhook触发编排
v0.19.42026-10-22
· 已修复 · MR 未改动的文件上的发现现在会发布(#207)。以前会报错「file is not in the current MR diff」,文字丢了,摘要却还算上它。现在作为顶层评论发布,标题是「is outside the files this MR changes」。MR 头部不存在的路径仍报为失败。新增一条提示词规则,让这类发现紧扣 MR 目标:修复不完整,或改动破坏了调用方。 · 变更内容 · chore(ci):把 reviewer-ci 固定到 maestro-reviewer 0.19.3 · docs(review):每次发版都更新 maestro-skills 的固定版本 · fix(review):diff 之外文件上的发现以评论形式发布 · chore(release):0.19.4 完整变更日志:
v0.19.32026-10-22
· 变更 · CI 镜像现在自带 @ddtcorex/maestro-skills 2.18.2(原来是 2.15.0)。配置档现在声明 ^2.18.2;旧的 ^2.13.0 范围一直没能把锁定的版本往前推。2.18.2 引入了 Hyvä 评审关卡:Alpine 作用域遵循 DOM 祖先链。 · 修复 · 评审器不再在仓库其他地方同样写法能跑通的情况下报告代码无法工作(#202)。新增一条提示词规则,用于 MR 评审和讨论评审:先检查用同样写法的代码,那段代码能跑通就删掉或降级该发现,这类阻断级或重要级发现还要引用所在作用域。 · 评审器能看到长 MR 上的每个讨论串(#203)。讨论串列表只读一页 20 条讨论,更新的讨论串及其回复因此缺失。 · 自己的每个讨论串现在都带上开头的发现和每条人工回复,没有位置的兜底讨论串也会列出。以前只显示最后一条评论,已答复的发现会作为新讨论串回来,有时严重级别还更高。 · 三条提示词规则防范作者最常驳回的误报:结账环境看不到的厂商行为说法最多算次要疑问;文档块或文档说明是预期行为,算设计问题而非缺陷;已答复的讨论串保持已解决,除非出现新证据(此时作为回复,绝不用更高严重级别)。 · 一致性或风格类发现必须遵循大多数同类代码的做法,并写明数量;代码写法混杂且没有配置的 linter 规则要求时,直接删掉(#203)。 · 新增文件末尾之外的行,兜底说明会如实指出,不再声称该行不在 MR diff 里。 · 报告里有新发现却没带代码时,先临时记录,退回评审器一次补上代码;重发会替换它。讨论评审不要求补,因为它们的发现会变成回复。 · 讨论串列表跳过 GitLab 系统备注(「changed this line in version N of the diff」),最多保留最近三条人工回复、每条最多 1000 字符,讨论超过 20 页就停止。 · 变更内容 · chore(pin):reviewer-ci 配置档安装 maestro-reviewer 0.19.2 · fix(review):报告无法工作前先检查同样写法能跑通的代码 · fix(review):防范作者最常驳回的误报 · chore(release):0.19.3 完整变更日志:
v0.19.22026-10-21
· 已修复 · 某个 /maestro 命令的回答一直失败时,不再阻塞更新的命令(#199)。回答失败会发一条重试提示;失败次数更少的命令优先处理,第三次失败时用错误信息回复该命令。 · 讨论页读不出来时,不再让每个引擎发现都重新发一遍(#199)。读取失败后,引擎只发它的阻塞性发现。 · 变更内容 · chore(pin):reviewer-ci 配置档安装 maestro-reviewer 0.19.1 · fix(review):限制命令重试次数,读取出错时保留阻塞性发现 · chore(release):0.19.2 完整变更日志:
数据来自仓库的 GitHub Release,可能与插件实际版本不一致。

README

由 DeepSeek 最新模型翻译生成
@ddtcorex/maestro-reviewer 0.13.0 起由 @ddtcorex/dsh-maestro-review 改名而来。配置档所有者:把依赖换成 @ddtcorex/maestro-reviewer。Cordis 行 id、数据目录和设置键都没变,所以已有的配置档补丁照常生效。 为 DeepSeek Harness 提供自动化的合并请求审查:一条 GitLab 合并请求流水线、一个编排器(在全新工作树上拉起审查者/审计者子代理)、GitLab 事件的 webhook 接收端,以及注入 DSH Web 插槽的设置/隧道客户端 UI。 属于 Maestro Harness 套件(dsh-maestro-*)。Cordis 补丁行: maestro-review-host(包根目录,内置技能)、maestro-review-webhook(接收端)、 maestro-review-orchestrator(流水线)、maestro-review-settings-rpc(设置 UI),全部由这个 npm 包提供。 提供什么 - GitLab 流水线:webhook 与 CI 接收、MR diff/thread 工具,以及向 GitLab 发布审查发现。
展开完整文档(README 剩余 1 节)
@ddtcorex/maestro-reviewer

0.13.0 起由 @ddtcorex/dsh-maestro-review 改名而来。配置档所有者:把依赖换成 @ddtcorex/maestro-reviewer。Cordis 行 id、数据目录和设置键都没变,所以已有的配置档补丁照常生效。

为 DeepSeek Harness 提供自动化的合并请求审查:一条 GitLab 合并请求流水线、一个编排器(在全新工作树上拉起审查者/审计者子代理)、GitLab 事件的 webhook 接收端,以及注入 DSH Web 插槽的设置/隧道客户端 UI。

属于 Maestro Harness 套件(dsh-maestro-*)。Cordis 补丁行: maestro-review-host(包根目录,内置技能)、maestro-review-webhook(接收端)、 maestro-review-orchestrator(流水线)、maestro-review-settings-rpc(设置 UI),全部由这个 npm 包提供。

提供什么

- GitLab 流水线:webhook 与 CI 接收、MR diff/thread 工具,以及向 GitLab 发布审查发现。
- 编排器 —— 审查者 + 审计者代理针对 MR 的一次性工作树运行,模型选择可全局覆盖(reviewModel),也可按项目映射覆盖。
- Webhook 接收端 —— 接收 GitLab MR 事件,把审查任务入队(去重 + 保留策略)。
- 审查发现/历史/信号:审查发现由纯工具型审查子代理通过 report_review_findings 工具写入(绝不写自由文本);历史与信号按 MR 跟踪。
- 审查工具(工作区搜索、Magento/Hyva 扫描、查询日志统计、GitLab diff 工具)挂载进审查运行。
- 客户端部分 —— 设置区渲染进 DSH Web 插槽;通知文案留在这里,投递走可选的 maestroNotifier 服务。

CI 审查者(无需本地检出)

同一条流水线也能从 GitLab CI 无头运行:一个共享审查者项目(存放密钥 + 镜像)通过一个小型桥接任务服务任意数量的源项目 —— 不需要 DSH 主机,也不需要项目映射。快速运行只做 diff(设置了 REVIEW_PROFILE 时在真实检出上运行 —— 仅审查者,不含审计者);按需深度运行会克隆 MR head,仅审查者审查,外加静态审计(容器内没有 govard 运行时)。

完整配置、各场景触发工作流(quick/deep × CI/webhook)、模型选择与故障排查:docs/ci-reviewer-setup.md。
模板在 templates/,镜像在 docker/。

设置

通过共享命名空间设置存储 (~/.dsh/dsh-maestro-config/settings.json)读取配置,走 src/host/config-store.ts 里的扁平适配器,底层是内嵌的存储副本 src/host/vendor/store.ts (由 dsh-maestro-core 生成,无运行时依赖);机器运行时状态留在包内的 sidecar 里。

安装

dsh plugin --profile web add @ddtcorex/maestro-reviewer

开发

pnpm install
pnpm verify # tsc --noEmit
pnpm test # vitest run
pnpm build # tsc -> lib/, plus the browser bundle lib/client.js

约定见 AGENTS.md(宿主/客户端拆分、密钥处理、实时验证规则)。

发布

一次发布要交付两个必须同步的产物:npm 包和 ddtcorex/maestro-reviewer Docker 镜像。镜像从 registry 安装 npm 包,不复制源码,所以只打 tag 还不够,CI 用户拿不到。简单说:先改 package.json + CHANGELOG.md + 三处镜像 tag 引用 → 打 tag vX.Y.Z(触发 npm publish + GitHub Release)→ 把 profiles/reviewer-ci/package.json 自己的 pin 改成同一版本 → 重新构建并推送 Docker 镜像。完整的分步清单见 AGENTS.md 里的 Release checklist,其中包括 pnpm 供应链年龄门槛的绕行办法,以及正式发布前如何在镜像里实测修复。

License

MIT
预览分享卡片长什么样 ↓ddtcorex/maestro-reviewer
分享 · DeepSeek Harness Hub
ddtcorex/maestro-reviewer

为 DeepSeek Harness 提供可插拔的合并请求审查流水线(webhook → 编排器 → 发现项),支持 GitLab 和 GitHub 服务商。

这个插件是你维护的吗?
作者本人可认领并核对本条目;认领通过后,详情页会显示「作者已认领」标记。
认领条目 →
回到顶部