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

证据代码审阅 STARDUSTLC666/dsh-review

DeepSeek Harness
STARDUSTLC66614 天前有提交已提供中文文档扫描:含敏感能力

提交前让独立审阅者找出缺陷并复核验证

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

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

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add STARDUSTLC666/dsh-review
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:仅索引
是什么
dsh 原生插件 · dev
装得上吗
本站尚未做安装检查
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 14 天前
档位由哪些信号合成

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

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

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

可执行外部命令读写/删除本地文件读取剪贴板或密钥环境变量
查看扫描证据(共 36 处,展示前 35 条)
  • 读取密钥环境变量
    src/cli.ts:26
    if (!process.env.GITHUB_EVENT_PATH || !process.env.GITHUB_TOKEN) throw new Error('Missing trusted GitHub event/token. Use --ai-only only for a local A
  • 读取本地文件
    src/cli.ts:27
    const event = JSON.parse(readFileSync(process.env.GITHUB_EVENT_PATH, 'utf8')), pr = event.pull_request, repository = event.repository?.full_name
  • 读取密钥环境变量
    src/cli.ts:34
    const policy = parsePolicy(JSON.parse(policyRead.stdout)), evidence = await githubEvidence(repository, pr.number, process.env.GITHUB_TOKEN, run.head,
  • 执行外部命令来自配置/变量
    src/exec.ts:37
    const child = spawn(command, args, {
  • 读取本地文件
    src/git-safety.ts:10
    try { stat = lstatSync(file) }
  • 读取本地文件
    src/git-safety.ts:13
    const content = readFileSync(file)
  • 读取本地文件
    src/index.ts:32
    const bash = [path.join(process.env.ProgramFiles ?? 'C:\\Program Files', 'Git', 'bin', 'bash.exe'), path.join(process.env.LOCALAPPDATA ?? '', 'Program
  • 读取本地文件
    src/ledger.ts:43
    while (!existsSync(ancestor)) ancestor = path.dirname(ancestor)
  • 读取本地文件
    src/ledger.ts:54
    while (!existsSync(current)) current = path.dirname(current)
  • 读取本地文件
    src/ledger.ts:66
    if (!existsSync(this.file)) return { version: 2, revision: 0, heads: {}, runs: {}, receipts: {} }
  • 读取本地文件
    src/ledger.ts:68
    try { parsed = JSON.parse(readFileSync(this.file, 'utf8')) } catch { throw new Error('Review ledger is corrupt; original file preserved. Gate remains
  • 写入本地文件
    src/ledger.ts:74
    mkdirSync(this.directory, { recursive: true })
  • 写入本地文件
    src/ledger.ts:76
    try { mkdirSync(lock) } catch { throw new Error('Review ledger is busy; retry after the current update finishes') }
  • 删除本地文件
    src/ledger.ts:77
    try { return work() } finally { rmdirSync(lock) }
  • 读取本地文件
    src/ledger.ts:80
    if (this.state.legacy && !existsSync(this.file + '.v1.backup') && existsSync(this.file)) copyFileSync(this.file, this.file + '.v1.backup', constants.C
  • 写入本地文件
    src/ledger.ts:80
    if (this.state.legacy && !existsSync(this.file + '.v1.backup') && existsSync(this.file)) copyFileSync(this.file, this.file + '.v1.backup', constants.C
  • 读取本地文件
    src/ledger.ts:83
    try { writeFileSync(tmp, text, { flag: 'wx' }); renameSync(tmp, this.file); this.state.revision++ } finally { if (existsSync(tmp)) unlinkSync(tmp) }
  • 写入本地文件
    src/ledger.ts:83
    try { writeFileSync(tmp, text, { flag: 'wx' }); renameSync(tmp, this.file); this.state.revision++ } finally { if (existsSync(tmp)) unlinkSync(tmp) }
  • 写入本地文件
    src/ledger.ts:83
    try { writeFileSync(tmp, text, { flag: 'wx' }); renameSync(tmp, this.file); this.state.revision++ } finally { if (existsSync(tmp)) unlinkSync(tmp) }
  • 删除本地文件
    src/ledger.ts:83
    try { writeFileSync(tmp, text, { flag: 'wx' }); renameSync(tmp, this.file); this.state.revision++ } finally { if (existsSync(tmp)) unlinkSync(tmp) }
  • 写入本地文件
    src/ledger.ts:90
    mkdirSync(this.directory, { recursive: true }); appendFileSync(path.join(this.directory, 'ledger.jsonl'), JSON.stringify({ at: new Date().toISOString(
  • 读取本地文件
    src/rules.ts:36
    const file = RULE_PATHS.map(c => path.join(root, c)).find(p => existsSync(p))
  • 读取本地文件
    src/rules.ts:39
    if (lstatSync(file).isSymbolicLink() || relative.startsWith('..') || path.isAbsolute(relative)) throw new Error('Review guidance must be a regular fil
  • 读取本地文件
    src/rules.ts:40
    return parseRules(readFileSync(file, 'utf8'), path.relative(root, file).replace(/ /g, '/'))
  • 写入本地文件
    src/run.ts:33
    mkdirSync(input.outDir, { recursive: true })
  • 写入本地文件
    src/scope.ts:15
    mkdirSync(directory, { recursive: true })
  • 写入本地文件
    src/scope.ts:21
    writeFileSync(oldPath, previous.after ?? ''); writeFileSync(newPath, file.after ?? '')
  • 读取本地文件
    src/scope.ts:32
    if (existsSync(snapshot)) { if (readFileSync(snapshot, 'utf8') !== document) throw new Error('Immutable run snapshot already exists with different con
  • 读取本地文件
    src/scope.ts:32
    if (existsSync(snapshot)) { if (readFileSync(snapshot, 'utf8') !== document) throw new Error('Immutable run snapshot already exists with different con
  • 写入本地文件
    src/scope.ts:33
    else writeFileSync(snapshot, document, { flag: 'wx' })
  • 读取本地文件
    src/target.ts:74
    if (relative.startsWith('..') || path.isAbsolute(relative) || lstatSync(file).isSymbolicLink()) throw new Error('Review incomplete: symlink or out-of-
  • 读取本地文件
    src/target.ts:75
    after = readFileSync(file, 'utf8')
  • 读取本地文件
    src/target.ts:90
    if (lstatSync(absolute).isSymbolicLink() || relative.startsWith('..') || path.isAbsolute(relative)) throw new Error('Project guidance must be a regula
  • 读取本地文件
    src/target.ts:91
    const content = readFileSync(absolute, 'utf8'); if (Buffer.byteLength(content) > 16384) throw new Error('Project instruction file exceeds 16 KiB'); re
  • 读取本地文件
    src/target.ts:99
    for (const file of files.filter(f => f.oldPath === null && !parsed.files.some(d => d.path === f.path))) if (readFileSync(path.resolve(root, file.path)
扫描于 2026/10/31(1 天前) · 范围 全包扫描(包内未声明入口) · 来源 GitHub 仓库

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

给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

以证据为准的代码审阅插件:审 diff、验证结论、记录噪音,让 agent 先读、人只读结论。

README

由 DeepSeek 最新模型翻译生成
dsh-review 提交代码前,让独立审阅者找出具体缺陷,再交给另一组审阅者复核。你看到的是经过验证的问题、明确的未完成项和仍需人工决定的事。 参考 Claude Code 团队的审阅流程,实现其中可在 DSH 内完成的审阅环节。它不授予人工批准,也不会自动发评论或合并代码。 使用 需要 Git、Node.js 22.19+ / 24+,以及官方 DSH 运行环境,提供子智能体、权限预设和作业管理服务。适配验收使用 DSH 0.2.1-rc.1。在 Git 仓库根目录创建会话后,让 DSH: 审阅当前改动,运行 dsh-review。只报告有具体触发条件、代码证据和独立复核的问题。审查没完成时不要说通过。 安装到 Web 配置档: ~~~bash dsh plugin --profile web add @stardustlc/dsh-review 桌面版应安装到它实际使用的配置档,并在新的会话中加载插件。插件不会查找、复制或修改其他配置档的密钥。 请使用带作用域的包名。npm 上未加作用域的 dsh-review 属于其他作者,不是本仓库。 常见调用: ~~~json {"tool":"review_run","arguments":{"base":"main"}} 省略 base 审当前工作区;staged=true 审暂存区。
展开完整文档(README 剩余 1 节)
dsh-review

提交代码前,让独立审阅者找出具体缺陷,再交给另一组审阅者复核。你看到的是经过验证的问题、明确的未完成项和仍需人工决定的事。

参考 Claude Code 团队的审阅流程,实现其中可在 DSH 内完成的审阅环节。它不授予人工批准,也不会自动发评论或合并代码。

使用

需要 Git、Node.js 22.19+ / 24+,以及官方 DSH 运行环境,提供子智能体、权限预设和作业管理服务。适配验收使用 DSH 0.2.1-rc.1。在 Git 仓库根目录创建会话后,让 DSH:

审阅当前改动,运行 dsh-review。只报告有具体触发条件、代码证据和独立复核的问题。审查没完成时不要说通过。

安装到 Web 配置档:

~~~bash
dsh plugin --profile web add @stardustlc/dsh-review

桌面版应安装到它实际使用的配置档,并在新的会话中加载插件。插件不会查找、复制或修改其他配置档的密钥。

请使用带作用域的包名。npm 上未加作用域的 dsh-review 属于其他作者,不是本仓库。

常见调用:

~~~json
{"tool":"review_run","arguments":{"base":"main"}}

省略 base 审当前工作区;staged=true 审暂存区。需要中断后续工作时取消正在运行的工具;恢复未完成审查时使用返回的 runId。敏感改动始终使用 deep,不能通过参数降级。

审阅如何完成

| 模式 | 独立找问题 | 每个问题的复核 | 汇总 |
| quick | 正确性、安全,2 个任务 | 1 个独立审阅者 | 确定性把关 |
| standard | 正确性、状态、兼容性、安全,4 个任务 | 3 人投票,至少 2 票一致 | 确定性把关 |
| deep | 同 standard | 3 人投票,至少 2 票一致 | 另派汇总者,不能删掉已确认的问题 |

每轮还有两个独立风险判断任务,分别判断风险等级和是否需要额外人工审阅。所有任务使用新的上下文;继承作者对话的 fork 后端不会被接受。

- 每轮绑定 Git 基准、HEAD、完整文件快照和唯一运行编号。代码变化、结果缺失、格式损坏或超限都会阻止放行。
- 复核必须说明具体成因并引用快照中的真实代码行。一个非空 evidence 字符串不算验证。
- 风格、命名、格式和清理建议直接过滤。已发表问题按指纹去重;每条仍须修复或写明处置原因。
- 默认最多 3 轮。从第 3 轮起,新问题限定在相对上轮的实际新增改动;旧问题继续复核,新文件不会漏掉。
- 只有独立复核确认问题已消失,才能自动记为 fixed。人工说明 wrong、intentional 或 wontfix 会保留理由,但不计作人工批准。
- 只生成作业书的外部模式可用于协作,无法证明执行独立性,因此不会通过自动门禁。

二进制变更需要另行验收,文字审查不会认证其内容。跳过的路径会公开列出,并仍参与风险判断。

十个工具

| 工具 | 作用 |
| review_diff | 生成快照与审阅计划,不作通过结论 |
| review_run | 执行或恢复分阶段独立审阅 |
| review_report | 提交外部任务的运行编号、目标编号与 JSON 结果 |
| review_check | 经宿主受控终端运行检查,保存本轮证据收据 |
| review_respond | 记录带理由的处置;fixed 必须重新复核 |
| review_status | 查看未完成项、轮次、调用量和处置噪音率 |
| review_gate | 检查当前快照的 AI 审阅层,不代替 CI 或人工批准 |
| review_learn | 从已验证修复中生成规则草稿,不自动改项目规范 |
| review_issue | 生成 issue 分诊和复现草稿,不执行正文指令或发表评论 |
| review_eval | 登记人工标注缺陷与干净样本、准备盲测、绑定运行结果并计分 |

检查、权限与证据

review_check 的命令经调用者实际使用的宿主终端工具运行,不直接创建绕过权限的进程。只读会话不运行证据命令;可使用静态源码复核。取消、超时和后台作业清理都受宿主管理。

Windows 官方预设只提供 pwsh 时,通过这个受控工具调用 Git Bash;需要 Git Bash 和 PowerShell 7.3+。原命令保留可见,引号不经 cmd 拼接。不能使用这条路径时会明确报错,不会静默换成直接执行。

证据收据绑定 runId 和 targetId;命令改变代码后收据失效。请正常批准必要权限,不要为了审阅扩大整个会话的权限。

接入仓库流程

仓库级 REVIEW.md 可以写失败判据、跳过路径、敏感目录和噪音上限:

~~~markdown

限制

max_nits: 0
severity_floor: important

跳过

- vendor/**

坏掉长什么样

- 文档给出的命令不能执行
- 配置将请求发送到错误账号

敏感路径

- src/billing/**

完整 PR 门禁还需独立的 CI、安全检查、人工批准和所有审阅线程的解决状态。新增命令 dsh-review-gate 只读取 GitHub 证据,策略固定从 PR 基准提交读取;机器人、旧提交和已撤回的批准不能填人工名额。

详见 接入与回滚、文章对应边界 和 验证记录。合并队列、功能开关、灰度和回滚由仓库/发布系统负责,安装插件不会自动启用这些制度。

状态与配置

默认状态保存在 DSH_HOME/plugins/dsh-review/<仓库摘要>/,不写入被审项目。可指定仓库内子目录,例如 .dsh-review。账本版本为 2;旧账本会保留备份,旧版本的“通过”不会沿用。

| 配置 | 默认 | 含义 |
| stateDir | @profile | profile 下按仓库隔离;也可指定仓库内子目录 |
| roundCap | 3 | 每个审阅系列的完成轮次上限 |
| diffOnlyAfterRound | 2 | 超过这轮后只对新增改动提出新问题 |
| maxFindings / maxNits | 20 / 2 | 问题数与 nit 上限 |
| severityFloor | important | 默认不发表 nit |
| maxCalls / maxParallel | 80 / 3 | 每轮实际派发预算、最大并发 |
| runTimeoutMs | 600000 | 每次执行的总超时 |
| commandTimeoutMs | 120000 | 单条证据命令超时 |
| maxDiffBytes | 4194304 | 补丁及源码快照总量上限;超出则未完成 |
| subagentProvider | spawn | 必须明确保证不继承作者上下文 |

evidenceRequired 是旧配置兼容项,设为 false 也关不掉独立证据验证。v0.2 的手工 head/findings 提交接口已停用,迁移见接入文档。

欢迎提交 Issues 和 PR,最好附上具体触发输入、版本、预期结果与实际结果。请先去掉密钥和私有代码。

更新记录 · MIT License
预览分享卡片长什么样 ↓STARDUSTLC666/dsh-review
分享 · DeepSeek Harness Hub
STARDUSTLC666/dsh-review

提交前让独立审阅者找出缺陷并复核验证

回到顶部