baosfeng/my-dsh-plugins--plugins-dsh-my-guardian ↗★ 5
dsh-my-guardian
DSH 插件治理守护:新装/更新插件先进候选区,启动后热挂载——成功转正、失败自动禁用、连续失败冻结,一键安全模式,侧边栏诊断面板。DSH web plugin: staged plugin loading with auto-disable on failure, freeze, safe mode and a sidebar panel.
安装
npx -p @deepseek-ai/dsh dsh plugin --profile web add github:baosfeng/my-dsh-plugins#cc837f22ecaa841de7d263346073dc44c55d50ee&path:plugins/dsh-my-guardian说明文档
阅读完整 README ↗使用
候选区文件
新建 ~/.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.json的safeMode: true)。开启后所有候选/已转正插件不再加载;恢复环境后关闭开关即重新加载。