baosfeng/my-dsh-plugins--plugins-dsh-my-guardian5

dsh-my-guardian

DSH 插件治理守护:新装/更新插件先进候选区,启动后热挂载——成功转正、失败自动禁用、连续失败冻结,一键安全模式,侧边栏诊断面板。DSH web plugin: staged plugin loading with auto-disable on failure, freeze, safe mode and a sidebar panel.

包名
dsh-my-guardian
版本
0.4.1
最近更新
2026年9月12日

安装

$npx -p @deepseek-ai/dsh dsh plugin --profile web add github:baosfeng/my-dsh-plugins#cc837f22ecaa841de7d263346073dc44c55d50ee&path:plugins/dsh-my-guardian

使用

候选区文件

新建 ~/.dsh/profiles/web/cordis.staged.json(与 cordis.patch.yml 同目录):

[{ "id": "my-plugin", "name": "dsh-my-plugin", "config": { "option": 1 } }]
  • id:唯一标识(不能与现有插件行 id 冲突)
  • name:插件包名(profile node_modules 中可解析)
  • config:可选,插件的配置

写入文件后守护插件会自动挂载;挂载成功该条自动从候选文件移除(转正),失败则保留(状态记录在面板中可见)。

面板

侧边栏 → "插件守护"页签:

状态含义操作
运行中已挂载移除
待加载尚未处理(安全模式等)
失败 ×N挂载失败 N 次重试 / 移除
冻结连续失败 3 次重试(解除冻结)/ 移除

失败条目额外带失败类型徽标(依赖缺失 / 代码错误 / 其他),依赖缺失时并展示安装建议命令(如 dsh plugin add dsh-shared)。

启动名册静态预检(issue #144)

候选区只兜住"走候选区"的插件;直接写进启动名册(cordis.patch.yml / profile / bundles)的插件仍由 DSH 启动时 all-or-nothing 加载。守护在每次启动时对名册做静态预检(不实际加载插件):

  • 包可解析:名册中 dsh-* 插件的包必须在 profile node_modules 中存在
  • peerDependencies 满足:复用候选挂载的依赖预检
  • 无重复 entry id:名册中同一 id 出现多次(加载时 EntryGroup.update 会抛 duplicate loader entry id

发现的问题写入 $DSH_HOME/guardian/startup-issues.json(原子写,名册健康也写空报告 + 检查时间),面板「最近事件」顶部置顶展示启动区问题,每条给出修复命令(dsh plugin add ...)与移除提示。预检失败不阻断启动——只记录、只告警,最坏情况是为启动失败留下排查记录。

效果截图(真实 DSH 实例验证)

侧边栏"插件守护"诊断面板(独立 3081 端口隔离 DSH 实例实测):

插件守护面板:候选失败隔离 + 转正运行中 + 安全模式开关

失败自动隔离:错误详情可查

截图环境:隔离 DSH 验证实例(/tmp/dsh-3085,端口 3085)。候选区写入 fake-needy(peer 依赖 fake-never-installed-dep 缺失 → 依赖预检拦截,分类徽标「依赖缺失」+ 安装建议 dsh plugin add fake-never-installed-dep + 自动隔离冻结)与 fake-simple(无依赖 → 热挂载成功自动转正「运行中」)。

配置

无应用层配置项apply(ctx) 不接收 config 参数,设置页无可视化配置入口;插件激活即生效)。运行时状态与开关:

  • 状态文件$DSH_HOME/guardian/state.json~/.dsh/guardian/state.json)——持久化候选/转正清单、失败次数、安全模式、事件日志。损坏自动降级为空状态,不影响启动。
  • 安全模式:面板开关(或直接编辑 state.jsonsafeMode: true)。开启后所有候选/已转正插件不再加载;恢复环境后关闭开关即重新加载。