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

安装安全网 lxzy-7/dsh-plugin-guard

DeepSeek Harnessv0.1.1
lxzy-777 天前有提交已提供中文文档扫描:含敏感能力

给 DeepSeek Harness 装上安全网:安装前自动快照、一键或自动回退、守护启动,事故报告自动触发智能体分析。

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

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

自动兼容检查有告警:npm 同名包「dsh-plugin-guard」归属 wuwei6666/dsh-pluginguard,装到的可能不是本插件。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add lxzy-7/dsh-plugin-guard
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么[目录]—
dsh 原生插件 · market
暂无时间戳·判据 →
装得上吗[实装验证]✓
本站已真实安装成功
非静态推断
L4 · 真实安装等级说明 →
数据截至 2026/09/27·判据 →
安全吗[自动扫描]—
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
数据截至 2026/11/03·判据 →
还在维护吗[仓库]—
更新放缓:最近一次提交在 77 天前
暂无时间戳·判据 →
图例:✓ 通过! 需注意— 未判定 / 无数据· 「未判定」= 本站尚无数据,不代表插件有问题
档位由哪些信号合成

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

验证判据与等级说明 →

可信度证据

安装兼容性检查⚠ 装前注意

npm 同名包「dsh-plugin-guard」归属 wuwei6666/dsh-pluginguard,装到的可能不是本插件

展开查看检查明细 ↓

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

✓npm 包dsh-plugin-guard @ 0.1.1
✓Node 引擎要求 >=18 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/30 11:47:30

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

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

可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 56 处,展示前 42 条)
  • 发起网络请求
    lib/client.js:80
    const r = await fetch(base, {
  • 发起网络请求
    lib/client.js:89
    const r = await fetch(base + (q.toString() ? '?' + q.toString() : ''))
  • 发起网络请求
    lib/client.js:292
    try { fetch('/guard/api/booted', { method: 'POST' }).catch(() => {}) } catch { }
  • 发起网络请求
    lib/client.js:310
    fetch('/guard/api/render-error', {
  • 读取本地文件
    src/engine.js:31
    const pkg = JSON.parse(readFileSync(join(root, 'node_modules', '@deepseek-ai', 'dsh', 'package.json'), 'utf8'))
  • 读取本地文件
    src/engine.js:35
    const rootPkg = JSON.parse(readFileSync(join(root, 'package.json'), 'utf8'))
  • 读取本地文件
    src/engine.js:47
    cfg = JSON.parse(readFileSync(guardConfigPath(), 'utf8'))
  • 读取本地文件
    src/engine.js:74
    const y = yaml.load(readFileSync(join(dir, 'cordis.patch.yml'), 'utf8'))
  • 读取本地文件
    src/engine.js:86
    const pkg = JSON.parse(readFileSync(join(dir, 'package.json'), 'utf8'))
  • 读取本地文件
    src/engine.js:121
    const files = readdirSync(dir).filter((f) => re.test(f)).sort()
  • 写入本地文件
    src/engine.js:159
    writeFileSync(patchPath, text + sep + block, 'utf8')
  • 写入本地文件
    src/engine.js:161
    mkdirSync(guardDir(), { recursive: true })
  • 写入本地文件
    src/engine.js:167
    writeFileSync(qPath, `${JSON.stringify(list, null, 2)}\n`, 'utf8')
  • 写入本地文件
    src/engine.js:180
    if (next !== text) writeFileSync(patchPath, next, 'utf8')
  • 写入本地文件
    src/engine.js:185
    writeFileSync(qPath, `${JSON.stringify(kept, null, 2)}\n`, 'utf8')
  • 写入本地文件
    src/engine.js:210
    mkdirSync(dirname(guardConfigPath()), { recursive: true })
  • 执行外部命令固定命令
    src/engine.js:262
    ? spawnSync('cmd.exe', ['/d', '/s', '/c', 'pnpm --version'], { encoding: 'utf8' })
  • 执行外部命令固定命令
    src/engine.js:263
    : spawnSync('pnpm', ['--version'], { encoding: 'utf8' })
  • 读取本地文件
    src/incident.js:52
    return decodeTextRobust(readFileSync(path))
  • 读取本地文件
    src/incident.js:62
    if (!existsSync(path)) return null
  • 读取本地文件
    src/incident.js:63
    let raw = readFileSync(path, 'utf8')
  • 写入本地文件
    src/incident.js:72
    mkdirSync(guardDir(), { recursive: true })
  • 写入本地文件
    src/incident.js:74
    writeFileSync(pendingMarkerPath(), `${JSON.stringify(marker, null, 2)}\n`, 'utf8')
  • 写入本地文件
    src/incident.js:82
    mkdirSync(guardDir(), { recursive: true })
  • 写入本地文件
    src/incident.js:84
    writeFileSync(pendingMarkerPath(), `${JSON.stringify(marker, null, 2)}\n`, 'utf8')
  • 读取本地文件
    src/incident.js:89
    if (!existsSync(pendingMarkerPath())) return { result: '没有待处理的事故' }
  • 写入本地文件
    src/incident.js:92
    renameSync(pendingMarkerPath(), resolved)
  • 读取本地文件
    src/incident.js:126
    const files = readdirSync(dir).filter((f) => f.includes(pattern)).sort()
  • 发起网络请求
    src/incident.js:145
    const req = http.get({ host: '127.0.0.1', port, path: '/', timeout: 3000 }, (res) => {
  • 写入本地文件
    src/incident.js:160
    mkdirSync(logsDir, { recursive: true })
  • 读取本地文件
    src/incident.js:194
    if (!existsSync(cur)) continue
  • 读取本地文件
    src/tools.js:214
    if (existsSync(p)) lastBoot = readFileSync(p, 'utf8').trim()
  • 读取本地文件
    src/tools.js:214
    if (existsSync(p)) lastBoot = readFileSync(p, 'utf8').trim()
  • 写入本地文件
    scripts/smoke-test.js:24
    mkdirSync(web, { recursive: true })
  • 写入本地文件
    scripts/smoke-test.js:26
    writeFileSync(join(web, 'package.json'), originalPkg)
  • 写入本地文件
    scripts/smoke-test.js:27
    writeFileSync(join(web, 'pnpm-workspace.yaml'), 'packages:\n - .\n')
  • 写入本地文件
    scripts/smoke-test.js:28
    writeFileSync(join(web, 'cordis.patch.yml'), '- insert: []\n')
  • 写入本地文件
    scripts/smoke-test.js:35
    writeFileSync(join(web, 'package.json'), JSON.stringify({ name: 'test-profile', broken: true }))
  • 读取本地文件
    scripts/smoke-test.js:38
    check('restore brings back the original content', readFileSync(join(web, 'package.json'), 'utf8') === originalPkg)
  • 读取本地文件
    scripts/smoke-test.js:49
    const bom = Buffer.concat([Buffer.from([0xef, 0xbb, 0xbf]), readFileSync(pendingMarkerPath())])
  • 写入本地文件
    scripts/smoke-test.js:50
    writeFileSync(pendingMarkerPath(), bom)
  • 删除本地文件递归
    scripts/smoke-test.js:61
    rmSync(tmp, { recursive: true, force: true })
扫描于 2026/11/3(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

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

社区实装还没有人打卡 · 装过的第一个就是你
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 安装前自动快照
  • 一键自动回退
  • 事故报告触发分析

README

由 DeepSeek 最新模型翻译生成
dsh-plugin-guard 为 DeepSeek Harness 打造的安装安全网:安装前自动快照、一键/自动回退、守护启动,事故报告还会自动触发智能体分析。 DeepSeek Harness 的插件安装安全网:安装前自动快照、一键/自动回退、守护启动、事故报告自动触发 Agent 分析。 它能做什么 插件装坏了,应用可能直接起不来,手动修通常得翻配置文件。这个插件把整条链路自动化: 安装插件(任何方式) │ tools.guard 钩子:安装之前自动快照(进程内完成) ▼ 守护启动(boot-guard 脚本) │ 启动前快照 → 拉起 dsh web → 健康检查 ├─ 健康 ─────────────────────────────► 原样放行 └─ 不健康 ─► 自动回退到上一个可用快照 → 重试一次 → 写一份事故报告 + 打上待处理标记 → 下个会话的提示词会告诉智能体去分析它 → 修好之后,调用 incident_resolved 清除标记 它怎么发现问题(这点很重要) 守护机制不会静态检查插件代码,也不会把插件单独拎出来「测试」。检测分三层: 1. 快照就是纯文件复制。
展开完整文档(README 剩余 1 节)
dsh-plugin-guard

为 DeepSeek Harness 打造的安装安全网:安装前自动快照、一键/自动回退、守护启动,事故报告还会自动触发智能体分析。

DeepSeek Harness 的插件安装安全网:安装前自动快照、一键/自动回退、守护启动、事故报告自动触发 Agent 分析。

它能做什么

插件装坏了,应用可能直接起不来,手动修通常得翻配置文件。这个插件把整条链路自动化:

安装插件(任何方式) │ tools.guard 钩子:安装之前自动快照(进程内完成) ▼ 守护启动(boot-guard 脚本) │ 启动前快照 → 拉起 dsh web → 健康检查 ├─ 健康 ─────────────────────────────► 原样放行 └─ 不健康 ─► 自动回退到上一个可用快照 → 重试一次 → 写一份事故报告 + 打上待处理标记 → 下个会话的提示词会告诉智能体去分析它 → 修好之后,调用 incident_resolved 清除标记

它怎么发现问题(这点很重要)

守护机制不会静态检查插件代码,也不会把插件单独拎出来「测试」。检测分三层:

1. 快照就是纯文件复制。 打快照只是复制 5 个配置文件(package.json、pnpm-lock.yaml、pnpm-workspace.yaml、cordis.yml、cordis.patch.yml)。不运行任何插件,也不评估任何行为。

2. 启动级检测确实会运行 harness —— 而且带着你的插件一起跑。 boot-guard 脚本会拉起整个 dsh web 进程(它会加载所有已安装插件,包括你刚加的那个),然后在超时时间内对 HTTP / 做健康检查。如果某个插件把启动搞挂了 —— 加载报错、启动崩溃、服务器无响应 —— 检查就会失败,守护机制随即杀掉整个进程树,回退到上一个可用快照,再重试一次。所以是的:要抓出搞挂启动的插件,harness(以及那个插件)必须真的启动起来。这是检测过程中唯一会「运行插件」的时刻。从 v0.3.1 起,检查还会确认 web 客户端确实渲染出来了(插件崩溃导致页面黑屏报错时,HTTP 200 依然在 —— 守护机制的客户端会上报渲染崩溃,boot-guard 会回退,而不是把黑屏当成「健康」);事故报告还会记录每个快照对应的 dsh 版本,并在启动失败发生在 harness 更新之后、而配置档回退又救不回来时给出提示。从 v0.3.2 起,当回退和重试都失败时(DSH 更新导致插件不兼容),boot-guard 会从启动日志里诊断出问题插件,把它隔离(往 cordis.patch.yml 追加 disabled: true),不带它启动,并清楚报告摘掉了哪个插件、以及怎么恢复(dsh-guard quarantine --undo <id>)。
3. 只在运行时才会暴露的问题,安装时查不出来。 插件装得上、启动也正常,但之后才出问题(执行某个操作时崩溃、弄坏状态等),这种情况没有通用防护能提前预判,除非跑你真实的工作负载。真出了事故,dsh_rollback action=incident 会生成一份问题定位报告(最近的启动日志、服务器 stderr,以及配置档配置与上一个正常快照的 diff),并打上待处理标记,让下一个会话自动聚焦诊断。而且任何变更之前都会先拍快照,所以事后你随时可以手动回滚。

一句话:防护从不评判插件好不好。它只保证三件事:(a) 每次变更都可回滚,(b) 启动失败自动回滚,(c) 出事故会被分析,而不是悄悄弄坏你的环境。

安装

From GitHub source (current):
dsh plugin --profile web add github:lxzy-7/dsh-plugin-guard

From the tarball stored in the repo:
dsh plugin --profile web add https://raw.githubusercontent.com/lxzy-7/dsh-plugin-guard/main/dist/dsh-plugin-guard-0.3.2.tgz

重启 dsh web。这是标准 bundle 插件:加入配置档层栈后自动生效。(发布到 npm 之后,dsh plugin --profile web add dsh-plugin-guard 也能用。)

启用带防护的启动(强烈推荐): 通过 scripts/boot-guard.ps1(Windows)或 scripts/boot-guard.sh(macOS/Linux)启动,不要直接跑 dsh web。Windows 示例,写在你的启动器里:

@echo off
set DSH_HOME=%~dp0.dsh-home
cd /d %~dp0
powershell -NoProfile -ExecutionPolicy Bypass -File node_modules\dsh-plugin-guard\scripts\boot-guard.ps1

可选的命令行垫片(覆盖手动终端安装): 包里带一个 dsh-guard bin(scripts/guard-cli.js)。把它放进 PATH,在终端里执行 dsh plugin add <pkg> 之前先跑 dsh-guard snapshot,或者用它包一层你自己的 dsh 包装脚本。这样能覆盖不走进程内 tools.guard 钩子的安装。

一键手动回滚(Windows): 包里还带 scripts/rollback.cmd。安装后它位于 $DSH_HOME/profiles/<profile>/node_modules/dsh-plugin-guard/scripts/rollback.cmd —— 右键 → 创建快捷方式(或把文件复制到任意位置),双击即可恢复每个配置档的上一个正常快照,并重新执行 pnpm install --frozen-lockfile。回滚还会删掉 node_modules 里残留的孤立 bundle 插件符号链接(pnpm 从不移除过期的 link: 条目 —— 只说 "Already up to date" —— 所以防护直接对着恢复后的 package.json 动手)。应用起不来时它照样能用,环境没设 DSH_HOME 时它会自己推导出来。

用法

设置面板 — 备份管理 (Backup Manager)。 在 Web UI 里打开 设置 (Settings) → 备份管理:按环境列出快照列表、加载指定备份、手动创建快照,以及设置每个环境保留多少快照(最少 2 个)。从 v0.3.0 起,插件还会注册一张 设置 → 插件 → 插件配置 设置卡片(rc.7 插件自有设置界面):它通过 harness 的 settings 服务编辑同一个保留数量(schema 校验、revision 围栏),备份管理面板与命令行则通过 config.json 保持同步。

智能体工具(为配置档中的每个会话注册):

| 工具 | 用途 |
| dsh_snapshot | 手动为某个配置档或全部配置档创建快照 |
| dsh_rollback | list / rollback / status / incident(基于 Node,跨平台) |
| incident_resolved | 分析或修复完成后,把待处理事件标记为已解决 |

命令行(dsh-guard,应用起不来时也能用):

snapshot [--profile X] [--tag T] [--reason R] [--force]
list [--profile X]
rollback [--profile X] [--id I | --good] [--skip-install]
keep [N] # show or set the per-profile cap (min 2)
health [--port N]
incident [--kind K] [--no-marker]
resolve
profiles

配置

$DSH_HOME/guard/config.json(首次写入时自动创建;字段全部可选):

{
"keepSnapshots": 10,
"port": 3080
}

- keepSnapshots — 每个配置档保留多少快照(限制在 2–100,默认 10)。清理时删掉较旧的快照。
- port — 健康检查 / 事件报告使用的 Web 端口(默认 3080)。如果你的 dsh web 跑在别的端口,就设置它。也可以给命令行传 --port。

所有路径都以 $DSH_HOME 为根(环境变量未设置时默认 ~/.dsh):

$DSH_HOME/rollbacks/<profile>/<stamp>/ snapshots (5 config files + manifest.json)
$DSH_HOME/guard/logs/ boot/server logs, incident reports, last-boot.txt
$DSH_HOME/guard/pending-incident.json pending incident marker
$DSH_HOME/guard/config.json guard settings (keepSnapshots, port)

回滚语义

- 回滚 = 还原 4 个配置文件 + pnpm install --frozen-lockfile,精确复现 node_modules。
- pnpm 解析顺序:快照清单里记录的绝对路径(与安装时同一环境,不依赖当前 PATH)→ DSH_GUARD_PNPM 环境变量 → 当前 PATH → harness 本地的 node_modules/.bin。
- 每次回滚前先写一份 pre-rollback 快照,所以回滚本身也可回滚。
- 「最后一个可用版本」= 最新一份未打 pre-boot/pre-rollback 标签的快照。

平台支持

| 组件 | Windows | macOS / Linux |
| 插件(工具 / 钩子 / 提示词注入) | ✅ | ✅ |
| dsh-guard 命令行 | ✅ | ✅ |
| 受守护的启动脚本 | PowerShell | bash |

安全说明

- 插件只读写配置档配置文件和快照,绝不执行第三方代码。pnpm install --frozen-lockfile 只还原快照里记录的锁定依赖。
- 快照和事故报告都是本地文件,不含凭据(凭据存放在 $DSH_HOME 下的其他位置,不在这套目录结构里)。
- 只有启动健康检查失败时才会自动回滚;正常运行期间,guard 绝不会悄悄改动配置。

已知限制

- 事故自动分析覆盖启动失败类事故;会话中途出错时,手动运行 dsh_rollback action=incident 可生成同样的报告。
- 改动 bundle 插件后需要重启 web 才能生效。
- 会话日志损坏属于数据问题,不在回滚范围内。

开发

node scripts/smoke-test.js # engine smoke test (throwaway DSH_HOME, no side effects)
node scripts/guard-cli.js help

发布

本包采用 MIT 协议,已可发布到 npm(包名:dsh-plugin-guard)。它不带任何运行时依赖,每次发布前都会自动跑一遍引擎冒烟测试(prepublishOnly),所以坏掉的构建永远发不出去。发布步骤:

npm login # once, on your machine
npm publish # runs npm test first, then publishes with public access

repository / homepage 是可选字段——等你有了 GitHub 仓库再加上(这两个字段只是让 npm 页面更好看)。

用户可以从线上仓库安装:dsh plugin --profile web add github:lxzy-7/dsh-plugin-guard(或用 dist/ 里的 tarball);等它上了 npm,dsh plugin --profile web add dsh-plugin-guard 也能用。

许可证

MIT

这是什么

一次坏的插件安装可能让应用起不来、对话崩溃,修复常常要手动翻配置。本插件把整条链路自动化:

安装插件(任何途径)
│ tools.guard 钩子:安装前自动快照(进程内) ▼
守护启动(boot-guard 脚本)
│ 启动前快照 → 启动 dsh web → 健康检查 ├─ 正常 ────────────────────────────────► 无感放行 └─ 异常 ─► 自动回退到最后良好快照 → 重试一次 → 生成事故定位报告 + 待处理标记 → 下一次会话的提示词自动告诉 Agent 去分析 → 修复后调用 incident_resolved 标记已处理

它如何检测问题(重要,请理解)

Guard 不会静态分析插件代码,也不会单独"测试"某个插件。检测分三层:

1. 快照只是纯文件复制。 备份只是复制 5 个配置文件(含 cordis.yml——MCP 服务器实例就配在这里,坏掉的 MCP 配置可随回滚一并撤销),不会运行任何插件,也不评估任何行为。

2. 启动级检测确实会运行 harness——连同你装的插件一起。 boot-guard 会启动整个 dsh web 进程(会加载所有已装插件,包括你刚加的),然后在超时内对 HTTP / 做健康检查。如果插件导致启动失败(加载报错、启动崩溃、服务无响应),检查即失败,guard 会自动杀掉进程树、回退到最后良好快照并重试一次。所以是的:要抓住"搞坏启动"的插件,harness(连同该插件)必须真正启动一次——这是检测中唯一需要"运行插件"的时刻。v0.3.1 起还会确认 web 客户端真正渲染成功(插件崩溃导致页面黑屏报错时 HTTP 仍是 200——guard 客户端会上报渲染崩溃,守护脚本会回滚而不是把黑屏当成"健康");事故报告会记录每个快照对应的 dsh 版本,并在启动失败紧跟 harness 更新时明确标注(profile 回滚无法撤销 DSH 根目录更新)。v0.3.2 起,当回滚与重试都失败(DSH 更新导致插件不适配)时,boot-guard 会从启动日志诊断出问题插件并隔离(在 cordis.patch.yml 追加 disabled: true),不带它启动,并明确显示被拔出的插件及恢复方法(dsh-guard quarantine --undo <id>)。
3. 只在运行期才出问题的插件,安装时检测不到。 如果一个插件装得上、启动也正常,只是后来才出错(在某个操作下崩溃、弄坏状态等),任何通用 guard 都无法在不运行你的真实工作负载的情况下预判。这类事故发生后,dsh_rollback action=incident 会生成事故定位报告(最近启动日志、服务端 stderr、profile 配置与最近良好快照的差异),并设置待处理标记,让下一次会话自动聚焦于诊断它。而且任何变更前都会先快照,所以你事后也随时能手动回退。

一句话总结:guard 从不评判一个插件"好不好"。它保证:(a) 任何变更都可回退;(b) 启动失败自动回退;(c) 事故会被分析,而不是悄悄搞坏你的环境。

安装

从 GitHub 源码安装(当前方式):
dsh plugin --profile web add github:lxzy-7/dsh-plugin-guard

或从仓库里的安装包:
dsh plugin --profile web add https://raw.githubusercontent.com/lxzy-7/dsh-plugin-guard/main/dist/dsh-plugin-guard-0.3.2.tgz

重启 dsh web。这是标准 bundle 插件:加入 profile 层栈自动生效。(发布到 npm 后 dsh plugin --profile web add dsh-plugin-guard 也可用。)

启用守护启动(强烈推荐): 把启动命令改为经过 scripts/boot-guard.ps1(Windows) 或 scripts/boot-guard.sh(macOS/Linux),而不是直接跑 dsh web。Windows 启动器示例:

@echo off
set DSH_HOME=%~dp0.dsh-home
cd /d %~dp0
powershell -NoProfile -ExecutionPolicy Bypass -File node_modules\dsh-plugin-guard\scripts\boot-guard.ps1

可选 CLI 垫片(覆盖终端手动安装): 包内带 dsh-guard 命令(scripts/guard-cli.js)。加入 PATH 后,在终端执行 dsh plugin add <pkg> 前先 dsh-guard snapshot(或自己包一层包装),覆盖不走进程内 tools.guard 钩子的安装途径。

一键手动回退(Windows): 包内还带 scripts/rollback.cmd。安装后位于 $DSH_HOME\profiles\<profile>\node_modules\dsh-plugin-guard\scripts\rollback.cmd——右键 → 创建快捷方式放到桌面(或把该文件复制到任意位置)后双击,即可把所有 profile 还原到最近一份「良好」快照并重跑 pnpm install --frozen-lockfile。应用完全启动不了时也能用;环境未设置 DSH_HOME 时它会从自身位置自动推导。

使用

设置面板 — 备份管理。 网页界面里打开 设置 → 备份管理:按环境列出快照、加载指定备份、手动存档、设置每个环境保留的快照数量(最少 2)。v0.3.0 起插件还会注册 设置 → 插件 → 插件配置 设置卡片(rc.7 插件自有设置表面):通过 harness 的 settings 服务编辑同一保留数量(schema 校验 + revision 冲突保护),与备份管理面板、CLI 通过 config.json 保持同步。

Agent 工具(profile 内每个会话都会注册):

| 工具 | 作用 |
| dsh_snapshot | 手动快照一个或全部环境 |
| dsh_rollback | list / rollback / status / incident(跨平台 Node 实现) |
| incident_resolved | 分析并修复后标记事故已处理 |

CLI(dsh-guard,应用起不来时也能用):

snapshot [--profile X] [--tag T] [--reason R] [--force]
list [--profile X]
rollback [--profile X] [--id I | --good] [--skip-install]
keep [N] # 查看或设置保留快照数(最少 2)
health [--port N]
incident [--kind K] [--no-marker]
resolve
profiles

配置

$DSH_HOME/guard/config.json(首次写入时自动创建;全部可选):

{
"keepSnapshots": 10,
"port": 3080
}

- keepSnapshots — 每个环境保留多少份快照(钳制 2–100,默认 10),超出的旧快照会被清理。
- port — 健康检查/事故报告用的 web 端口(默认 3080)。如果你的 dsh web 跑在其他端口,改成实际值即可;CLI 也可用 --port 覆盖。

所有路径都锚定 $DSH_HOME(未设置时默认 ~/.dsh):

$DSH_HOME/rollbacks/<profile>/<stamp>/ 快照(5 个配置文件 + manifest.json) $DSH_HOME/guard/logs/ 启动/服务器日志、事故报告、last-boot.txt $DSH_HOME/guard/pending-incident.json 待处理事故标记 $DSH_HOME/guard/config.json 备份设置(keepSnapshots, port)

回退语义

- 回退 = 恢复 4 个配置文件 + pnpm install --frozen-lockfile 精确还原 node_modules。
- pnpm 定位顺序:快照 manifest 记录的绝对路径(与当初安装同环境,不依赖回退时的 PATH) → DSH_GUARD_PNPM 环境变量 → 当前 PATH → harness 本地 node_modules/.bin。
- 每次回退前自动先存一份 pre-rollback 快照:回退本身可逆。
- 「最后良好」= 最新的非 pre-boot/pre-rollback 标签快照。

平台支持

| 组件 | Windows | macOS/Linux |
| 插件(工具/钩子/提示注入) | ✅ | ✅ |
| dsh-guard CLI | ✅ | ✅ |
| 守护启动脚本 | PowerShell | bash |

安全说明

- 本插件只读写 profile 配置文件与快照,不执行第三方代码;pnpm install --frozen-lockfile 只按快照锁文件还原。
- 快照与事故报告是本地文件,不含凭据(凭据在 $DSH_HOME 其他位置,不在此目录约定内)。
- 自动回退只发生在「启动健康检查失败」时,运行期不会随意改动配置。

已知边界

- 事故自动分析覆盖启动失败类事故;对话中途报错可用 dsh_rollback action=incident 手动生成同款报告。
- bundle 插件的加载变化需要重启 web 生效。
- 会话日志损坏属于数据问题,不在回退范围。

开发

node scripts/smoke-test.js # 引擎冒烟测试(临时 DSH_HOME,无副作用)
node scripts/guard-cli.js help

发布

MIT 许可,可直接发布到 npm(包名 dsh-plugin-guard)。包零运行时依赖,且 prepublishOnly 会在每次发布前自动跑引擎冒烟测试,坏包永远发不出去:

npm login # 在本机登录一次
npm publish # 先跑 npm test,再以 public 权限发布

repository / homepage 已指向 GitHub 仓库(仅影响 npm 页面的展示)。

用户可从在线仓库安装:dsh plugin --profile web add github:lxzy-7/dsh-plugin-guard(或下载 dist/ 里的 tgz 按路径安装);发布到 npm 后 dsh plugin --profile web add dsh-plugin-guard 也可用。

License

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

给 DeepSeek Harness 装上安全网:安装前自动快照、一键或自动回退、守护启动,事故报告自动触发智能体分析。

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