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

升级守卫 wqx11235/dsh-upgrade-guard

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

DSH 升级守卫:升级前兼容盘点 / 升级后契约扫描 / 启动冒烟DeepSeek Harness 插件

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

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

自动兼容检查有告警:未发布到 npm registry,仅可从源码安装。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add wqx11235/dsh-upgrade-guard
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

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

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

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查⚠ 装前注意

未发布到 npm registry,仅可从源码安装

展开查看检查明细 ↓

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

✗npm 包dsh-upgrade-guard(未发布到 npm,仅可源码安装)
✓Node 引擎要求 >=18 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

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

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

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

可执行外部命令读写/删除本地文件写入剪贴板(不计风险)发起外部网络请求
查看扫描证据(共 12 处,展示前 12 条)
  • 读取本地文件
    lib/index.js:38
    return JSON.parse(readFileSync(file, 'utf8').replace(/^ FEFF/, ''))
  • 读取本地文件
    lib/index.js:63
    if (cfg.profile && existsSync(cfg.profile)) return { dir: cfg.profile, source: 'config' }
  • 读取本地文件
    lib/index.js:64
    if (process.env.DSH_PROFILE && existsSync(process.env.DSH_PROFILE)) return { dir: process.env.DSH_PROFILE, source: 'env' }
  • 读取本地文件
    lib/index.js:98
    if (existsSync(prim)) info.primitives = prim
  • 读取本地文件
    lib/index.js:137
    if (!existsSync(dir)) continue
  • 执行外部命令来自配置/变量
    lib/index.js:163
    child = spawn(process.execPath, [CLI, ...args], {
  • 发起网络请求
    lib/client.js:28
    return fetch('/api/dsh-upgrade-guard', {
  • 写入剪贴板
    lib/client.js:105
    navigator.clipboard.writeText(text)
  • 发起网络请求
    lib/guard.mjs:493
    const res = await fetch(url, { signal: ctl.signal })
  • 发起网络请求
    lib/guard.mjs:656
    const res = await fetch(url, { redirect: 'manual' })
  • 发起网络请求
    lib/guard.mjs:660
    const pageRes = await fetch(base + '/', { headers: cookie ? { cookie } : {} })
  • 发起网络请求
    lib/guard.mjs:671
    const r = await fetch(new URL(u, base + '/').href, { headers: cookie ? { cookie } : {} })
扫描于 2026/11/3(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

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

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

功能亮点

  • 升级前兼容盘点
  • 升级后契约扫描
  • 启动冒烟验证

README

由 DeepSeek 最新模型翻译生成
dsh-upgrade-guard · DSH 升级守卫 让「更新 DeepSeek Harness 本体」不再变成「更新一次崩一次」。 升级前盘点插件兼容性 → 升级后扫描已知破坏性契约 → 切换端口前先启动冒烟,不通过就别切。 English: README.md DeepSeek Harness(dsh) 的插件生态很活跃,但宿主每次升级都可能改契约,跟在后面的插件就容易崩。真实案例(同一个坑反复出现): | 事故 | 根因 | 症状 | | 0.1.1 → 0.1.2 | client-modules 模块表变严 | 页面 Failed to load plugins | | 0.1.2 → 0.1.5 | 服务访问契约变严(缺 inject 即崩) | 31 个插件连锁 pending | | 0.1.6 → 0.1.7 | 服务 settingsScope 被移除/改名 | 26 个插件 pending | | 0.1.7-alpha.1 | ui-primitives 图标改名(IconXxx14 → IconXxxRegular,无别名) | Minified React error #130 |
展开完整文档(README 剩余 1 节)
dsh-upgrade-guard · DSH 升级守卫

让「更新 DeepSeek Harness 本体」不再变成「更新一次崩一次」。
升级前盘点插件兼容性 → 升级后扫描已知破坏性契约 → 切换端口前先启动冒烟,不通过就别切。
English: README.md

DeepSeek Harness(dsh) 的插件生态很活跃,但宿主每次升级都可能改契约,跟在后面的插件就容易崩。真实案例(同一个坑反复出现):

| 事故 | 根因 | 症状 |
| 0.1.1 → 0.1.2 | client-modules 模块表变严 | 页面 Failed to load plugins |
| 0.1.2 → 0.1.5 | 服务访问契约变严(缺 inject 即崩) | 31 个插件连锁 pending |
| 0.1.6 → 0.1.7 | 服务 settingsScope 被移除/改名 | 26 个插件 pending |
| 0.1.7-alpha.1 | ui-primitives 图标改名(IconXxx14 → IconXxxRegular,无别名) | Minified React error #130 |
| 0.1.7 | 会话消息 v4 source 契约 | 某轮跑完后失败:format v4 message requires a producer-owned source kind |

本插件把每次排障得到的判据固化成可复用检查。

三个动作

| 动作 | 什么时候用 | 做什么 |
| 契约扫描(离线,秒级) | 平时 / 升级后 | 按「已知破坏性契约」目录扫已装插件:被移除的服务名、会话消息旧 source 写法、引用了 ui-primitives 导出表里不存在的成员 |
| 联网盘点(10–40 秒) | 升级前 | 逐个插件看:声明了什么兼容范围、npm 上有没有新版、新版是否声明支持目标版本 → 产出「能不能升 + 哪些要一起升 + 停用清单」 |
| 启动冒烟(30–90 秒) | 切换端口前 | 在测试端口起一次被检查的宿主 → 抓「被 peer 门跳过的插件 / 功能降级 / pending / 插件树真凶」+ 逐个探 client bundle 可达性 → PASS 才建议切换;结束必杀测试宿主 |

适配性(为什么网页端和桌面端都能用)

这版是照着「跨 0.1.x / 0.2.x、跨网页端 / 官方桌面端」重写的:

- 不 import 任何 @deepseek-ai/ 包。宿主半只用 node 内置模块 + webServer 服务。历史崩因里最大的一类就是「宿主改了包/服务契约,插件还在 import 旧东西」,本插件从结构上避开了它。
- 不写死任何本机路径。profile 从插件自身位置向上找,宿主 bin / 安装根从 process.argv[1] 推导,ui-primitives 多候选探测。同一份文件在 profiles/web 与 profiles/desktop 上原样可跑。
- peerDependencies 全部声明为 且 optional。dsh 0.1.7+ 有 peer 兼容门,会把声明了窄范围的插件静默跳过(实例:browser-skill-dsh-plugin@0.3.1 要求 ^0.1.5-rc.3,在 0.2.0-rc.2 上直接被跳过)。* + optional 是能过这道门的声明形态。
- 客户端半遵循 0.1.2+ 契约:声明 exports.inject = ['slots'],并用 ctx.slots 取值(保留 ctx.get('slots') 回退),新旧两代受限代理都能跑;只 require('react')(平台内置词),所以模块表收紧打不到它。
- Electron 感知:桌面端 process.execPath 是 App 可执行文件,冒烟会带 ELECTRON_RUN_AS_NODE=1 启动,避免再开一个 App 窗口;打包进 app.asar 时冒烟明确回 UNSUPPORTED 并给替代方案,而不是神秘失败。
- 对导出表保持诚实:磁盘上找到的 ui-primitives 版本与在跑的宿主不一致时,界面会直接标出来——因为「某导出不存在」这个结论只跟那份副本一样可靠。

安装

① 从 GitHub 装(会被装进 profile)
cd $env:USERPROFILE\.dsh\profiles\web
pnpm add github:wqx11235/dsh-upgrade-guard
再把 "dsh-upgrade-guard" 加进该 profile package.json 的 dsh.profile.bundles

② 手动放置(无网络依赖)把本仓库复制到 %USERPROFILE%\.dsh\profiles\web\node_modules\dsh-upgrade-guard 同样加进 dsh.profile.bundles

③ 桌面端:同上,但 profile 换 %USERPROFILE%\.dsh\profiles\desktop

装完重启宿主,硬刷新页面,然后进 设置 → 通用 → 升级守卫。

使用

在界面里

设置 → 通用 → 升级守卫,三个按钮,底部会标出这份结果来自哪个宿主 / 运行时 / primitives:

- 契约扫描 → ⚠ critical N / warn N(扫了 M 个插件) + 明细
- 联网盘点 → 📋 目标 x.y.z:N 个插件,K 个有新版 + 清单
- 启动冒烟 → ✅ PASS / ❌ FAIL + 关键输出行(ROOT? / PENDING / SKIPPED / DEGRADED / BADBUNDLE)

命令行(同一份引擎)

node lib/guard.mjs scan --json --report scan.md [--profile <dir>] [--primitives <dir>]
node lib/guard.mjs preflight --json --report preflight.md --target 0.1.8-rc.1 [--no-network]
node lib/guard.mjs smoke --bin <.../dsh/lib/bin.js> --cwd <dir> --port 3099 --timeout 120 [--keep]

环境变量兜底:DSH_HOME(默认 ~/.dsh)、DSH_PROFILE、DSH_PRIMITIVES、DSH_SMOKE_BIN、DSH_SMOKE_PORT、DSH_SMOKE_CWD、DSH_SMOKE_TIMEOUT、DSH_SMOKE_KEEP=1。

控制台输出刻意用英文/ASCII(Windows cmd 默认代码页 936 会把中文 UTF-8 显示成乱码);中文报告写进 --report 指定的文件(默认 $DSH_HOME/upgrade-guard/)。

判据从哪来

lib/guard.mjs 里的 KNOWN_RULES 就是「已知破坏性契约」目录:

1. removed-service —— 宿主已移除/改名的服务(settingsScope、conversationEvents…)。硬引用记 critical,可选注入 inject([...]) 记 warn(服务缺失时插件优雅跳过),注释里的提及直接跳过(避免误报)。
2. session-source-v4 —— 会话消息 source: { kind: 'plugin', plugin: 'x' } 旧写法(0.1.7 起被拒收)。
3. missing-host-export —— 插件客户端引用了宿主 ui-primitives 导出表里不存在的成员(如 0.1.7-alpha.1 改掉的 IconXxx14/16)。渲染到才会抛 React #130,所以它是静态提前预警。
4. pinned-exact —— profile 里对插件用精确版本("x": "1.2.3")→ 它永远不会随宿主更新(真实案例:某插件被锁死,落后 19 个版本)。

每排一次新坑,就往 KNOWN_RULES 加一条 —— 这是本插件唯一的"增长"方式,也是它越用越准的原因。

局限(重要,别当成万能)

- 冒烟只覆盖启动期:插件树加载、服务依赖、client bundle 可达性。渲染期错误(例如 primitives 改名导致的 React #130、订阅者风暴)不会在冒烟里暴露,需要真开页面点开对应面板 —— 这类风险靠契约扫描提前兜住。
- 契约扫描只覆盖"已知"目录:没进 KNOWN_RULES 的新式破坏它看不见。
- 联网盘点依赖 npm registry 可达;git/url 源(github:...)的插件查不到"最新版",会标注为 git/url 需人工。
- 被宿主 peer 兼容门主动跳过的插件(日志里的 dsh: skipping profile bundle "X")不算崩溃,是宿主在保护你;冒烟会把它列成 SKIPPED 供你决策,要装回来需按提示用 dsh plugin allow-version 显式豁免。
- 打包桌面运行时(入口在 app.asar 内)无法起测试宿主,冒烟返回 UNSUPPORTED。

宿主路由

POST /api/dsh-upgrade-guard

{ "action": "status" } // → { ok, paths: {...}, host: { version, runtime, primitivesSource, ... } }
{ "action": "scan" } // → { ok, result: { criticalCount, warnCount, scanned, topFindings, reportPath } }
{ "action": "preflight", "target": "latest"} // → { ok, result: { target, rows, stale, reportPath } }
{ "action": "smoke", "port": 3099 } // → { ok, result: { verdict, summary, tail, reportPath } }

文件结构

package.json dsh.bundle.patch + dsh.client 声明 dsh.plugin.json 插件清单(name / entry / client) cordis.patch.yml 把它挂载进 profile 的那条 insert lib/index.js 宿主半:profile/宿主探测、webServer 路由、调引擎 lib/client.js 客户端半:设置 → 通用 里的那一行 lib/guard.mjs 引擎:scan / preflight / smoke(也能当独立 CLI 用)

许可

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

DSH 升级守卫:升级前兼容盘点 / 升级后契约扫描 / 启动冒烟DeepSeek Harness 插件

这是你的仓库?认领条目

回到顶部