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

兼容守护 Han-1413141/dsh-compat-guardian

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

检查插件兼容性,冲突时自动隔离并支持离线修复

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

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

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

状态速览

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

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

验证判据与等级说明 →

可信度证据

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

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

读写/删除本地文件发起外部网络请求
查看扫描证据(共 37 处,展示前 32 条)
  • 读取本地文件
    lib/index.js:230
    return await readFile(path, "utf8");
  • 写入本地文件
    lib/index.js:237
    await mkdir(dirname(path), { recursive: true });
  • 写入本地文件
    lib/index.js:244
    await rename(temporary, path);
  • 删除本地文件
    lib/index.js:248
    await rm(temporary, { force: true });
  • 写入本地文件
    lib/index.js:260
    await mkdir(dirname(path), { recursive: true });
  • 读取本地文件
    lib/index.js:290
    return { manifest, directory: dirname2(await realpath2(direct)) };
  • 读取本地文件
    lib/index.js:308
    if (manifest.name === name2) return { manifest, directory: await realpath2(dir) };
  • 读取本地文件
    lib/index.js:324
    within(await realpath2(directory), await realpath2(path));
  • 读取本地文件
    lib/index.js:325
    const document = parseDocument(await readFile2(path, "utf8"), { customTags: [{ tag: "tag:yaml.org,2002:js", resolve: (text) => text }] });
  • 读取本地文件
    lib/index.js:347
    within(await realpath2(directory), await realpath2(file));
  • 发起网络请求
    lib/index.js:682
    return this.controller.request(payload);
  • 读取本地文件
    lib/core.js:166
    return JSON.parse(await readFile(path, "utf8"));
  • 读取本地文件
    lib/core.js:170
    return await readFile(path, "utf8");
  • 写入本地文件
    lib/core.js:177
    await mkdir(dirname(path), { recursive: true });
  • 写入本地文件
    lib/core.js:184
    await rename(temporary, path);
  • 删除本地文件
    lib/core.js:188
    await rm(temporary, { force: true });
  • 写入本地文件
    lib/core.js:200
    await mkdir(dirname(path), { recursive: true });
  • 读取本地文件
    lib/core.js:230
    return { manifest, directory: dirname2(await realpath2(direct)) };
  • 读取本地文件
    lib/core.js:248
    if (manifest.name === name) return { manifest, directory: await realpath2(dir) };
  • 读取本地文件
    lib/core.js:264
    within(await realpath2(directory), await realpath2(path));
  • 读取本地文件
    lib/core.js:265
    const document = parseDocument(await readFile2(path, "utf8"), { customTags: [{ tag: "tag:yaml.org,2002:js", resolve: (text) => text }] });
  • 发起网络请求
    lib/client.js:60
    `;var T=require("react/jsx-runtime"),it=class extends q.Component{state={error:""};static getDerivedStateFromError(t){return{error:String(t)}}render()
  • 读取本地文件
    lib/cli.js:173
    return JSON.parse(await readFile(path, "utf8"));
  • 读取本地文件
    lib/cli.js:177
    return await readFile(path, "utf8");
  • 写入本地文件
    lib/cli.js:184
    await mkdir(dirname(path), { recursive: true });
  • 写入本地文件
    lib/cli.js:191
    await rename(temporary, path);
  • 删除本地文件
    lib/cli.js:195
    await rm(temporary, { force: true });
  • 写入本地文件
    lib/cli.js:207
    await mkdir(dirname(path), { recursive: true });
  • 读取本地文件
    lib/cli.js:234
    return { manifest, directory: dirname2(await realpath2(direct)) };
  • 读取本地文件
    lib/cli.js:252
    if (manifest.name === name) return { manifest, directory: await realpath2(dir) };
  • 读取本地文件
    lib/cli.js:268
    within(await realpath2(directory), await realpath2(path));
  • 读取本地文件
    lib/cli.js:269
    const document = parseDocument(await readFile2(path, "utf8"), { customTags: [{ tag: "tag:yaml.org,2002:js", resolve: (text) => text }] });
扫描于 2026/11/5(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

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

社区实装还没有人打卡 · 装过的第一个就是你
依赖的 DSH / Cordis 模块
@deepseek-ai/dsh-atomic-write@deepseek-ai/dsh@deepseek-ai/dsh-plugin-manager@deepseek-ai/dsh-tools@deepseek-ai/dsh-app-boot@deepseek-ai/dsh-sandbox@deepseek-ai/dsh-sandbox-policy@deepseek-ai/cordis@deepseek-ai/dsh-typert-protocol@deepseek-ai/dsh-api-remotes@deepseek-ai/dsh-client-locale@deepseek-ai/dsh-client-ui-layout
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 插件兼容性检查
  • 冲突自动隔离
  • 离线修复与恢复

插件兼容性检查、隔离、恢复,以及 DeepSeek Harness 离线启动救援

README

由 DeepSeek 最新模型翻译生成
dsh-compat-guardian 为 DeepSeek Harness 插件提供兼容性检查、隔离与恢复。 检查 DSH 版本要求、Node.js 与系统要求、声明的插件依赖和互斥关系、重复顶层条目、全局独占工具与服务,以及真实 Loader 的连续加载失败。 当前实测宿主为 DSH 0.2.0-rc.2。宿主 peer 声明允许 >=0.2.0-rc.2 <0.3.0-0,避免每次同系列升级都先被自身的精确版本门禁拦住;该声明不代表后续版本已经验证。独立检查与离线修复命令不加载 DSH 宿主或第三方插件,可以在宿主无法启动时使用。 安装 在 DSH 插件管理页的安装框中输入以下包名: dsh-compat-guardian@0.2.1 Desktop 命令行安装: dsh plugin --profile desktop add dsh-compat-guardian@0.2.1 --save-exact --ignore-scripts Web 用户将 desktop 改成 web。也可在安装框中粘贴仓库地址 https://github.com/Han-1413141/dsh-compat-guardian;从 0.2.1 起,仓库已包含编译后的 lib/,安装时无需构建,也无需添加 allowBuilds。
展开完整文档(README 剩余 1 节)
dsh-compat-guardian

为 DeepSeek Harness 插件提供兼容性检查、隔离与恢复。

检查 DSH 版本要求、Node.js 与系统要求、声明的插件依赖和互斥关系、重复顶层条目、全局独占工具与服务,以及真实 Loader 的连续加载失败。

当前实测宿主为 DSH 0.2.0-rc.2。宿主 peer 声明允许 >=0.2.0-rc.2 <0.3.0-0,避免每次同系列升级都先被自身的精确版本门禁拦住;该声明不代表后续版本已经验证。独立检查与离线修复命令不加载 DSH 宿主或第三方插件,可以在宿主无法启动时使用。

安装

在 DSH 插件管理页的安装框中输入以下包名:

dsh-compat-guardian@0.2.1

Desktop 命令行安装:

dsh plugin --profile desktop add dsh-compat-guardian@0.2.1 --save-exact --ignore-scripts

Web 用户将 desktop 改成 web。也可在安装框中粘贴仓库地址 https://github.com/Han-1413141/dsh-compat-guardian;从 0.2.1 起,仓库已包含编译后的 lib/,安装时无需构建,也无需添加 allowBuilds。

如果仍出现 ERR_PNPM_GIT_DEP_PREPARE_NOT_ALLOWED,检查安装目标是否固定到了 0.2.0 的旧提交;改用上面的 npm 包名,或重新粘贴仓库地址。Failed to replace env in config: ${NPM_TOKEN} 是 npm 配置变量提示,与 Git 构建被拦截是两个问题;安装这两个公开包不需要 npm Token。

安装后打开侧边栏“兼容守护”。默认自动隔离,卸载需选择对应策略。独立 CLI 可通过 npx --yes --package=dsh-compat-guardian@0.2.1 dsh-compat-guardian --help 查看用法,DSH 无法启动时也可使用。

源码 · 问题反馈 · 故障覆盖表

Web 页面

侧边栏“兼容守护”提供检查结果、插件列表、恢复记录和名称筛选。隔离或卸载前弹窗列出受影响的插件;提交时再次核对插件状态,检查后已发生变化则要求刷新。恢复前重新检查,冲突仍存在时保留隔离并显示原因。

升级预检只计算输入版本下的兼容声明,不下载或升级 DSH。预检假设官方 profile 基础组件随 DSH 一起升级;附加插件继续使用已安装版本的约束。没有将未知未来版本当成已运行验证。

页面上的自动策略在确认后立即保存到目标 profile 的 .compat-guardian/preferences.json,优先于下面的 YAML 默认值。要恢复由 YAML 决定策略,关闭该 profile 后移走这个偏好文件。检查结果按“重新检查”刷新;后台监控按配置周期执行。

自动策略

默认每 30 秒检查一次,加载失败连续观察 2 次才处理;明确的版本或声明冲突直接进入处理。

| policy | 行为 |
| report | 保存检查状态;不改插件选择,不卸载 |
| quarantine | 默认值。备份后停用冲突 bundle,保留包文件 |
| remove | 先停用,确认成功后调用官方管理接口卸载可移除包 |

通过 profile 的 cordis.patch.yml 设置:

- id: compat-guardian
config:
policy: quarantine
intervalMs: 30000
failureThreshold: 2

改为 policy: remove 即启用自动卸载。不删除用户工作文件、历史会话或独立配置备份;官方组件和这两个管理插件受到保护。启动型 profile 要求重启才能完成停用时,保留 restart-required 结果。在线卸载被宿主拒绝时保留隔离与待卸载记录,在下一次启动后重试;同一进程不会反复卸载失败目标。

Guardian 对 bundle 操作,因为 bundle 可能包含需要一起启停的多个条目。依赖已隔离插件的其他 bundle 会一起进入停用计划。同名服务并行注册时,优先保留实际已正常运行的一方;没有运行状态可供选择时,按 dshCompat.priority 与 profile 选择顺序决定。

插件在外部被重新启用时,旧隔离记录转为已恢复;换成其他版本时,旧记录标记为已替换,不再按旧版本执行卸载。连续失败按插件版本和 DSH 版本分别计数。

DSH 工具

工具 compat_guardian 提供:

- check:检查当前已安装和运行中的插件。
- repair:按配置策略执行处理,通过 DSH 批准服务确认会话发起的修改。
- history:查看隔离、卸载和恢复记录;不返回配置备份原文。
- restore:提供 recordId,重新检查后恢复已隔离、仍安装且版本未改变的插件。

已卸载插件需要先重新安装原版本或修复后的版本。恢复不会通过强制版本豁免绕过冲突。

升级前检查与启动修复

在仓库根目录执行,替换路径和目标 DSH 版本:

只读检查;存在错误时退出码为 2。
node lib/cli.js check --profile-dir "C:/Users/you/.dsh/profiles/web" --dsh-version 0.2.0-rc.2

先查看离线修复计划。
node lib/cli.js rescue --profile-dir "C:/Users/you/.dsh/profiles/web" --dsh-version 0.2.0-rc.2

关闭目标 DSH 后执行停用,备份原配置。
node lib/cli.js rescue --profile-dir "C:/Users/you/.dsh/profiles/web" --dsh-version 0.2.0-rc.2 --yes

明确知道故障包,但它没有声明版本范围时,可以按包名停用。

node lib/cli.js rescue --profile-dir "C:/Users/you/.dsh/profiles/web" --dsh-version 0.2.0-rc.2 --plugins bad-plugin --yes

修复冲突或回退 DSH 后恢复,只合并本次停用项。

node lib/cli.js restore --profile-dir "C:/Users/you/.dsh/profiles/web" --dsh-version 0.2.0-rc.2 --id <recoveryId> --yes

源码版或 Desktop 的安装位置不同,可通过 --install-anchor <DSH安装包/package.json> 指定查找官方 bundle 的位置。目标 DSH 版本由 --dsh-version 明确指定;不要用其他安装的版本冒充实际宿主。

离线修复保留原始 package.json 文本及校验值,备份 cordis.patch.yml、锁文件和兼容配置;实际只删除 dsh.profile.bundles 中被隔离的选择,不卸载依赖。修改使用与官方写入器一致的跨进程锁及原子文件替换。恢复时检查版本与冲突,只合并相应 bundle,保留此后其他编辑。

插件作者如何声明互斥关系

在插件的 package.json 顶层增加 dshCompat。这是本项目定义的可选元数据,不是 DSH 官方标准。
json
{
"dshCompat": {
"dsh": ">=0.2.0-rc.2 <0.3.0",
"capabilities": ["pdf"],
"requires": { "your-parser-plugin": "^1.0.0" },
"conflicts": { "another-pdf-plugin": "<2.0.0" },
"services": ["globalPdfParser"],
"tools": ["read_pdf"],
"permissions": ["workspace-read"],
"platforms": ["win32", "linux", "darwin"],
"priority": 10
}
}

services 和 tools 只列出会争用同一全局名称的独占提供项,不要把不同 Cordis scope 中可共存的项目填进来。检测顶层 insert 的重复 id 时,不会把正常的 id 定向覆盖当作重复声明。!!js 配置只作为文本读取,不执行。

没有声明的冲突不能靠静态扫描全部识别。Guardian 观察明确的 failed 状态,不把依赖尚未就绪的 pending 状态当作崩溃。其代码与其他 Host 插件仍在同一进程;无法拦住 process.exit()、原生崩溃或在启动早期退出的宿主。此类情况使用独立 CLI 进行停用与恢复。

开发与验证

本仓库可独立构建和测试,无需检出另一个插件: powershell
npm ci --ignore-scripts
npm run typecheck
npm test
npm run build
npm run test:conflicts
npm run test:startup
npm run preview

发布前运行 npm run pack:release。提交源码修改时同时提交重新生成的 lib/;CI 会核对产物与源码,并用禁止构建脚本的全新 profile 测试 Git 安装。

配套插件:dsh-autocompose。两者可分别安装。

故障覆盖表 · 验证记录 · 版本记录

界面

dsh-compat-guardian 原生 Web 界面
预览分享卡片长什么样 ↓Han-1413141/dsh-compat-guardian
分享 · DeepSeek Harness Hub
Han-1413141/dsh-compat-guardian

检查插件兼容性,冲突时自动隔离并支持离线修复

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