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

文件审计与审批 KouzakiUmi/dsh-guard

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

捕获文件改动并回滚,自动审查审批请求

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

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

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

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:待复验
是什么
dsh 原生插件 · security
装得上吗
曾在 dsh 0.2.0-rc.2 下真实安装成功,但当前 dsh 已更新至 0.2.1-rc.5,本站尚未在新版下复验
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 26 天前
档位由哪些信号合成

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

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

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

可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 70 处,展示前 43 条)
  • 写入本地文件
    packages/dsh-audit-rollback/lib/boundary-exec.js:97
    renameSync(action.path, trashFile)
  • 写入本地文件
    packages/dsh-audit-rollback/lib/boundary-exec.js:99
    copyFileSync(action.path, trashFile, constants.COPYFILE_EXCL)
  • 删除本地文件
    packages/dsh-audit-rollback/lib/boundary-exec.js:100
    unlinkSync(action.path)
  • 写入本地文件
    packages/dsh-audit-rollback/lib/boundary-exec.js:112
    writeFileSync(action.path, buffer, { flag: 'wx', mode })
  • 写入本地文件
    packages/dsh-audit-rollback/lib/boundary-exec.js:128
    renameSync(movedTo, action.path)
  • 写入本地文件
    packages/dsh-audit-rollback/lib/boundary-exec.js:132
    copyFileSync(movedTo, action.path, constants.COPYFILE_EXCL)
  • 读取本地文件
    packages/dsh-audit-rollback/lib/index.js:257
    if (!existsSync(dir)) return 0
  • 读取本地文件
    packages/dsh-audit-rollback/lib/index.js:259
    return readdirSync(dir).filter((name) => /^\d{4}-\d{2}-\d{2}\.jsonl$/.test(name)).length
  • 读取本地文件
    packages/dsh-audit-rollback/lib/index.js:267
    if (!existsSync(file)) return { readable: false, version: null, createdAt: null, error: null }
  • 读取本地文件
    packages/dsh-audit-rollback/lib/index.js:269
    const parsed = JSON.parse(readFileSync(file, 'utf8'))
  • 读取本地文件
    packages/dsh-audit-rollback/lib/index.js:288
    if (!existsSync(root)) return { count: 0, totalBytes: 0, error: null }
  • 读取本地文件
    packages/dsh-audit-rollback/lib/index.js:295
    for (const name of readdirSync(dir)) {
  • 读取本地文件
    packages/dsh-audit-rollback/lib/ledger.js:104
    try { info = lstatSync(dir) } catch (e) { if (e.code !== 'ENOENT') throw e }
  • 写入本地文件
    packages/dsh-audit-rollback/lib/ledger.js:110
    try { mkdirSync(dir) } catch (e) { if (e.code !== 'EEXIST') throw e }
  • 读取本地文件
    packages/dsh-audit-rollback/lib/ledger.js:111
    info = lstatSync(dir)
  • 读取本地文件
    packages/dsh-audit-rollback/lib/ledger.js:119
    try { info = lstatSync(file) } catch (e) { if (e.code === 'ENOENT') return null; throw e }
  • 删除本地文件
    packages/dsh-audit-rollback/lib/ledger.js:181
    try { unlinkSync(path) } catch (error) { if (error.code !== 'ENOENT') throw error }
  • 读取本地文件
    packages/dsh-audit-rollback/lib/ledger.js:192
    const raw = JSON.parse(readFileSync(pluginPrefsPath(stateDir), 'utf8'))
  • 读取本地文件
    packages/dsh-audit-rollback/lib/ledger.js:229
    return existsSync(objectPath(stateDir, hash))
  • 读取本地文件
    packages/dsh-audit-rollback/lib/ledger.js:248
    if (!existsSync(dir)) return []
  • 写入本地文件
    packages/dsh-audit-rollback/lib/ledger.js:713
    renameSync(action.path, trashFile)
  • 写入本地文件
    packages/dsh-audit-rollback/lib/ledger.js:715
    copyFileSync(action.path, trashFile, constants.COPYFILE_EXCL)
  • 删除本地文件
    packages/dsh-audit-rollback/lib/ledger.js:716
    unlinkSync(action.path)
  • 写入本地文件
    packages/dsh-audit-rollback/lib/ledger.js:724
    writeFileSync(action.path, buffer, { flag: 'wx', mode: 0o600 })
  • 写入本地文件
    packages/dsh-audit-rollback/lib/ledger.js:737
    renameSync(movedTo, action.path)
  • 写入本地文件
    packages/dsh-audit-rollback/lib/ledger.js:741
    copyFileSync(movedTo, action.path, constants.COPYFILE_EXCL)
  • 删除本地文件
    packages/dsh-audit-rollback/lib/recovered-prompts.js:87
    try { unlinkSync(path) } catch (error) { if (error.code !== 'ENOENT') throw error }
  • 读取本地文件
    packages/dsh-audit-rollback/lib/recovered-prompts.js:98
    const raw = readFileSync(recoveredPromptPath(stateDir, sessionId, turn), 'utf8')
  • 写入本地文件
    packages/dsh-audit-rollback/lib/rollback-preview.js:267
    writeFileSync(backup, view.current.buffer, { flag: 'wx' })
  • 写入本地文件
    packages/dsh-audit-rollback/lib/rollback-preview.js:277
    renameSync(view.row.path, quarantine)
  • 删除本地文件
    packages/dsh-audit-rollback/lib/rollback-preview.js:318
    unlinkSync(quarantine)
  • 读取本地文件
    packages/dsh-audit-rollback/lib/rollback-preview.js:334
    const leaf = lstatSync(view.row.path)
  • 删除本地文件
    packages/dsh-audit-rollback/lib/rollback-preview.js:336
    if (String(leaf.ino) === createdIdentity.ino && String(leaf.dev) === createdIdentity.dev && same(existingPathGuards(view.row.path), ticket.guards)) un
  • 读取本地文件
    packages/dsh-audit-rollback/lib/snapshot.js:118
    entries = readdirSync(canonicalRoot(root), { withFileTypes: true })
  • 读取本地文件
    packages/dsh-audit-rollback/lib/snapshot.js:137
    try { acc.bytes = lstatSync(full).size } catch { acc.unreadable = true }
  • 读取本地文件
    packages/dsh-audit-rollback/lib/snapshot.js:163
    try { entries = readdirSync(dir, { withFileTypes: true }) } catch { acc.unreadable = true; return }
  • 读取本地文件
    packages/dsh-audit-rollback/lib/snapshot.js:181
    try { acc.bytes += lstatSync(full).size } catch { acc.unreadable = true }
  • 读取本地文件
    packages/dsh-audit-rollback/lib/snapshot.js:273
    try { info = lstatSync(file) } catch (error) { if (error.code !== 'ENOENT') throw error }
  • 读取本地文件
    packages/dsh-audit-rollback/lib/snapshot.js:288
    try { info = lstatSync(path) } catch (error) { if (error.code === 'ENOENT') continue; throw error }
  • 执行外部命令来自配置/变量
    packages/dsh-audit-rollback/lib/snapshot.js:371
    child = spawn(gitPath, [...prefix, ...args], {
  • 读取本地文件
    packages/dsh-auto-review-router/lib/grant-store.js:109
    try { info = lstatSync(dir) }
  • 读取本地文件
    packages/dsh-auto-review-router/lib/grant-store.js:330
    try { info = lstatSync(targetPath) }
  • 发起网络请求
    packages/dsh-auto-review-router/lib/index.js:603
    const response = await history.invokeManual(entry, () => ctx.approval.request({
扫描于 2026/11/1(0 天前) · 范围 全包扫描 · 来源 GitHub 仓库

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

依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/cosmokit@deepseek-ai/cordis-plugin-loader@deepseek-ai/cordis-plugin-include@deepseek-ai/dsh@deepseek-ai/dsh-app-boot@deepseek-ai/dsh-config-editor@deepseek-ai/dsh-settings@deepseek-ai/dsh-tools@deepseek-ai/dsh-sandbox-policy@deepseek-ai/dsh-permission-presets@deepseek-ai/schemastery
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 捕获文件改动
  • 文件回滚
  • 自动审查审批请求

DSH 沙箱加固工具集:持久审计与文件回滚(dsh-audit-rollback)、可指定模型的自动审批(dsh-auto-review-router)。

README

由 DeepSeek 最新模型翻译生成
dsh-guard DeepSeek Harness 的文件审计、回滚和自动审批工具集。两个插件可独立使用,通过宿主 Settings / ConfigEditor 保存配置,不另建设置文件,也不捆绑另一套核心。 插件 | 插件 | 功能 | 包版本 | | dsh-audit-rollback | 文件前后像捕获、持久审计、会话内恢复、离线 CLI 回滚 | 0.3.2 | | dsh-auto-review-router | 可配置审查模型、人工审批回退、目录授权记忆、审批历史 | 0.3.2 | 验证基线为 DSH 0.2.1-alpha.1,Node.js 要求为 ^22.19.0 || >=24.0.0。依赖兼容范围以各包 manifest 为准,声明兼容范围不代表所有版本均经过运行验证。 安装 从 npm 安装对应插件包,再通过目标 profile 的官方插件管理入口添加该包。也可从 GitHub Releases 获取 tarball 离线安装。 npm pack dsh-audit-rollback@0.3.2 npm pack dsh-auto-review-router@0.3.2 npm pack 会把包下载到当前目录,随后把 tarball 路径传给 DSH 插件管理命令。桌面与非桌面 profile 的安装边界见下文。
展开完整文档(README 剩余 1 节)
dsh-guard

DeepSeek Harness 的文件审计、回滚和自动审批工具集。两个插件可独立使用,通过宿主 Settings / ConfigEditor 保存配置,不另建设置文件,也不捆绑另一套核心。

插件

| 插件 | 功能 | 包版本 |
| dsh-audit-rollback | 文件前后像捕获、持久审计、会话内恢复、离线 CLI 回滚 | 0.3.2 |
| dsh-auto-review-router | 可配置审查模型、人工审批回退、目录授权记忆、审批历史 | 0.3.2 |

验证基线为 DSH 0.2.1-alpha.1,Node.js 要求为 ^22.19.0 || >=24.0.0。依赖兼容范围以各包 manifest 为准,声明兼容范围不代表所有版本均经过运行验证。

安装

从 npm 安装对应插件包,再通过目标 profile 的官方插件管理入口添加该包。也可从 GitHub Releases 获取 tarball 离线安装。

npm pack dsh-audit-rollback@0.3.2
npm pack dsh-auto-review-router@0.3.2

npm pack 会把包下载到当前目录,随后把 tarball 路径传给 DSH 插件管理命令。桌面与非桌面 profile 的安装边界见下文。

非桌面 profile 可使用:

dsh plugin --profile <profile-name> add <tarball-path>

桌面 profile 使用 GUI 插件管理器,或目标版本明确支持的官方桌面 CLI。不要在真实 profile 中直接运行包管理器,也不要手工修改依赖清单。建议使用单包 tarball;monorepo Git 子目录依赖可能连带解析其他 workspace 包及核心依赖。

源码、发布包、磁盘安装副本和运行中的 Host/Client 是不同状态。安装更新后,按宿主加载机制确认新版本生效。

使用

文件审计与回滚

在「设置 → 内置插件 → 审计与回滚」配置捕获工具、大小上限和排除规则。会话「已修改文件」页签提供差异预览和二次确认恢复。CLI 按会话与轮次回滚,默认生成计划,指定 --apply 才修改目标文件。

捕获仅覆盖文件工具显式目标路径,不覆盖 shell、其他插件和人工编辑,不能作为完整工作区备份。GUI 与 CLI 的恢复条件不同,详见包文档。

自动审批

在「设置 → 内置插件 → Auto 审查路由」启用插件并选择模型,再在所需会话中选择 Auto。启用不会自动切换会话权限或审批策略。

每次模型审查会额外消耗一次请求。明确拒绝可在下游与审批策略允许时转人工;模型错误、超时及非法结果直接拒绝。中风险文件操作经人工放行后可记住目录与操作类别,高危操作每次询问。设置页可查看及撤销目录授权。

本插件不能与官方 dsh-experimental-auto-review 同时注册 Auto,也应避免与 dsh-codex-connect.enableAutoReview 同时启用。

数据与限制

- 文件审计默认存放于 $DSH_HOME/audit-rollback,未设置时使用 ~/.dsh/audit-rollback,可配置独立状态目录。
- 审批历史存放于当前 profile 的 dsh-auto-review-router/approval-history;目录授权仅保存在当前插件实例内存。
- 捕获及框架报告结果不证明工具体执行或实际副作用成功。
- CLI 的 --force 可覆盖轮后修改,不能绕过快照完整性校验。
- 对象库与账本没有自动清理或轮转;删除快照会失去关联历史的恢复能力。
- 离线和 SDK 集成测试不能替代目标安装版本的 GUI 验收。

开发与验证

在仓库根目录执行:

npm install --ignore-scripts
node tools/verify.mjs --quiet
node scripts/check-manifest.mjs

verify 检查语法、自动发现并运行测试、核查依赖声明和包清单。测试使用临时数据及合成模型响应。缺少 workspace peer 时,可将 DSH_APP_ROOT 指向官方 DSH 安装目录作为只读依赖回退。

发布流程见 release.md。验证命令不执行发布或安装。

文档

- 审计与回滚说明
- 自动审批说明
- 审计设计
- 自动审批设计
- 审批可观测性设计

设计文档保留设计阶段约定;实际字段、行为和限制以当前源码及包说明为准。

许可证

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

捕获文件改动并回滚,自动审查审批请求

回到顶部