kira905/dsh-ecosystem-panel ↗★ 0
dsh-ecosystem-panel
Read-only ecosystem overview panel for a DSH instance: plugin bundles, cordis.patch inserts, patch health, skills, upgrade health and decoupling health. One tab per category. Zero runtime npm dependencies. 适合需要监控插件包、补丁健康度及升级状态的系统管理员。
설치
$
npx -p @deepseek-ai/dsh dsh plugin --profile web add github:kira905/dsh-ecosystem-panel终端里应打印六类结果 + 配置来源自证
> 本仓**只发 Release,不发 npm**:把目录放进 profile 即可,不需要 `npm install`(`dependencies` 为空)。
## 4. 配置
优先级(**每个键独立**):`显式传入(插件 config / 调用参数)` > `环境变量` > `配置文件` > `自动探测` > `内置默认`。
### 4.1 环境变量
| 变量 | 作用 | 默认 |
|---|---|---|
| `DSH_ECOSYSTEM_PANEL_HOME` | DSH 数据根 | `os.homedir()/.dsh`(`DSH_HOME` 同效、优先级更低) |
| `DSH_ECOSYSTEM_PANEL_PROFILE` | profile 名 | `web` |
| `DSH_ECOSYSTEM_PANEL_WEB_URL` | 本实例基址(抓 boot 清单用) | `DSH_WEB_URL`,否则 `http://127.0.0.1:3080` |
| `DSH_ECOSYSTEM_PANEL_TOOLS_DIR` | 外部工具目录(**不自动探测**) | 空 ⇒ 依赖它的类目降级 |
| `DSH_ECOSYSTEM_PANEL_MAIN_NM` | 宿主主包 node_modules | 按全局 npm 布局探测;探测不到即判不可用 |
| `DSH_ECOSYSTEM_PANEL_CONFIG` | 配置文件 JSON 路径 | 空 |
| `DSH_ECOSYSTEM_PANEL_CACHE_FILE` | 升级体检缓存文件 | `/ecosystem-panel-upgrade-cache.json` |
| `DSH_ECOSYSTEM_PANEL_DECOUPLING_SCRIPT` | 解耦检查脚本 | `/check-decoupling.mjs` |
| `DSH_ECOSYSTEM_PANEL_TRIAGE_CLI` | 升级档位只读 CLI | `/upgrade-triage-cli.mjs` |
| `DSH_ECOSYSTEM_PANEL_REGISTRY_AUDIT_LIB` | 跨表准入校验器 | `/registry-audit.mjs` |
| `DSH_ECOSYSTEM_PANEL_HOST_ADAPTER_SYNC` | 适配层一致性校验器(可选) | `/sync-host-adapter.mjs` |
| `DSH_ECOSYSTEM_PANEL_PATCH_MANIFEST_FILE` | 补丁清单 JSON | 空 ⇒ ③ 显示「未配置」 |
| `DSH_ECOSYSTEM_PANEL_UPGRADE_RULES_FILE` | 升级规则表 JSON | 空 |
| `DSH_ECOSYSTEM_PANEL_BREAKING_SYMBOLS_FILE` | 断裂符号表 JSON | 空 |
| `DSH_ECOSYSTEM_PANEL_LABELS_FILE` | 包名 → 一句话简介 JSON | 空(没登记的包只是没有简介) |
| `DSH_ECOSYSTEM_PANEL_DISABLED_GROUPS` | 整组停用的类目(逗号分隔) | 全开 |
| `DSH_ECOSYSTEM_PANEL_WEBSERVER_SERVICE` | 宿主 web server 服务名 | `webServer` |
### 4.2 配置文件与示例
`examples/` 下有五份可直接抄的示例:
| 文件 | 对应配置 |
|---|---|
| `ecosystem-panel.config.example.json` | 总览(各键的位置与形态) |
| `patch-manifest.example.json` | ③ 补丁清单(`checks` / `special` / `retired` 三种形态都有例子,字符串里可用 `${HOME}` 占位符) |
| `upgrade-rules.example.json` | ⑤ 规则表文案(`verdict` 只是文案分类,不决定颜色) |
| `breaking-symbols.example.json` | 宿主主包断裂符号参考底表 |
| `labels.example.json` | 包名 → 一句话简介 |
用法:
```bash
DSH_ECOSYSTEM_PANEL_CONFIG=/path/to/my.config.json # 指向你抄过去改的那份
4.3 降级语义(重要)
- 没配 ≠ 没有:③ 未配清单时显示「未配置 ⇒ 不可判定」,不会显示"0 个补丁全绿"; ⑥⑦ 与 ⑤ 同理(都带配置指引)。
- 抓不到:宿主首页抓不到 boot 清单时,① 只把"未知"标黄,并把抓取错误原文放进
meta.bootError。 - 停用:确实不需要某一类,就把它写进
disabledGroups—— 面板会显示一条「已按配置停用」的提示项 (比静默消失更清楚,且不计入汇总)。 - 配置解析失败(比如清单 JSON 坏了)不会让面板崩:
meta.configErrors里能看到原因,该键回落默认。
5. 界面
- 六类各占一张标签卡(Tab),Tab 上的小圆点 = 该类最差状态(红 > 黄 > 绿)
- 点「刷新」会重新取数;
GET /state?refresh=1强制重查 npm 最新版(否则 24h 缓存) - 颜色:🟢 正常 / 🟡 风险或不可判定 / 🔴 异常(比如 patch insert 的实体缺失)
- 面板底部说明与标题可由配置覆盖(
text.title/text.note/text.tabs,服务端经meta.ui下发)
6. 兼容性
| 宿主主包线 | 状态 | 依据 |
|---|---|---|
0.1.1-rc.2 | ✅ 已实测 | 同源代码在一个隔离实例(独立数据根 + 独立端口)上只读核对通过;另与带内嵌清单的旧版逐条比对判定一致(51 条零差异) |
≥ 0.1.2 | ⚠️ 未实测 | 本插件只用「web server 服务名 + 标准 route 注册」这一处宿主接口,且服务名可用环境变量覆盖;升级主包后请跑一次 scripts/verify-state.mjs 确认 |
| 其它 | ❓ 未知 | 需自测 |
7. 已知限制
- js-yaml 依赖宿主提供 —— 解析不到时 ②④ 两类显示「不可解析」(不假绿),但也就查不了了。
- boot 清单靠抓宿主首页的内联
__DSH_BOOT__段 —— 宿主若改了这个投影,① 的"加载状态"就变成未知(黄)。 - ③ 的判定完全取决于你给的清单:本仓不内嵌任何环境的补丁清单,清单写错就会报错。
- ⑤ 的颜色不来自本面板:它来自你配置的档位 CLI(唯一判定源)。本面板只渲染,绝不猜颜色。
- ⑥⑦ 依赖外部脚本,本仓不带这些脚本;未配置时对应类目只会显示降级提示。
- 升级体检会访问 npm registry(
registry.npmjs.org),结果缓存 24h;离线时显示"远端查询失败"并继续用缓存。 - 只读:面板没有任何写操作入口(唯一写文件的是升级体检自己的缓存)。
- 前端只支持 web platform(
dsh.client.inject为空,不依赖任何 client 包)。 - 界面文案为中文,可通过
text配置覆盖;没有内置多语言切换。 - 未做移动端专门优化(面板宽度自适应,但按钮/触摸交互没专门测过)。
8. 仓结构
lib/index.js 服务端:注册只读 route
lib/state.js 六类聚合逻辑(每个数据源都走配置层 + 显式降级)
lib/upgrade.js ⑤ 升级体检(本地事实 + npm 缓存 → 外部只读 CLI → 渲染)
lib/config.js 配置层(优先级解析 + 占位符展开 + 来源自证)
lib/host-protocol.js 宿主协议常量(本插件只用 webServer 一个服务名)
lib/client.js 浏览器端:侧边栏按钮 + 面板(零 import)
cordis.patch.yml bundle patch(把插件挂到宿主)
scripts/verify-source.mjs 发布前静态验证(语法 + 配置层行为 + 脱敏扫描)
scripts/test-fixture.mjs 干净临时路径上的端到端夹具(含缺数据降级断言)
scripts/verify-state.mjs 只读状态验证器(不依赖 GUI)
examples/ 五份配置示例
docs/RELEASING.md 发版规范与检查单
9. 自测
node scripts/verify-source.mjs . # 语法 + 配置层行为 + 脱敏扫描(发布前必跑)
node scripts/test-fixture.mjs # 端到端夹具:不需要任何真实安装,全在临时目录里造
node scripts/verify-state.mjs # 对当前实例只读体检(打印六类 + 配置来源)
test-fixture.mjs 会现场造一个最小数据根(假 profile / 假插件实体 / 假技能 / 四个外部工具 stub),
断言六类都能跑出结果,并专门验证「缺数据必显式降级」。
10. 许可
AGPL-3.0-only(见 LICENSE 全文;package.json 的 license 字段同值)。
以 AGPL 发布意味着:你可以自由使用、修改、再分发,但通过网络向他人提供本软件的修改版时,
必须按 AGPL 一并提供对应源码。
4. 配置
优先级(每个键独立):显式传入(插件 config / 调用参数) > 环境变量 > 配置文件 > 自动探测 > 内置默认。
4.1 环境变量
| 变量 | 作用 | 默认 |
|---|---|---|
DSH_ECOSYSTEM_PANEL_HOME | DSH 数据根 | os.homedir()/.dsh(DSH_HOME 同效、优先级更低) |
DSH_ECOSYSTEM_PANEL_PROFILE | profile 名 | web |
DSH_ECOSYSTEM_PANEL_WEB_URL | 本实例基址(抓 boot 清单用) | DSH_WEB_URL,否则 http://127.0.0.1:3080 |
DSH_ECOSYSTEM_PANEL_TOOLS_DIR | 外部工具目录(不自动探测) | 空 ⇒ 依赖它的类目降级 |
DSH_ECOSYSTEM_PANEL_MAIN_NM | 宿主主包 node_modules | 按全局 npm 布局探测;探测不到即判不可用 |
DSH_ECOSYSTEM_PANEL_CONFIG | 配置文件 JSON 路径 | 空 |
DSH_ECOSYSTEM_PANEL_CACHE_FILE | 升级体检缓存文件 | /ecosystem-panel-upgrade-cache.json |
DSH_ECOSYSTEM_PANEL_DECOUPLING_SCRIPT | 解耦检查脚本 | /check-decoupling.mjs |
DSH_ECOSYSTEM_PANEL_TRIAGE_CLI | 升级档位只读 CLI | /upgrade-triage-cli.mjs |
DSH_ECOSYSTEM_PANEL_REGISTRY_AUDIT_LIB | 跨表准入校验器 | /registry-audit.mjs |
DSH_ECOSYSTEM_PANEL_HOST_ADAPTER_SYNC | 适配层一致性校验器(可选) | /sync-host-adapter.mjs |
DSH_ECOSYSTEM_PANEL_PATCH_MANIFEST_FILE | 补丁清单 JSON | 空 ⇒ ③ 显示「未配置」 |
DSH_ECOSYSTEM_PANEL_UPGRADE_RULES_FILE | 升级规则表 JSON | 空 |
DSH_ECOSYSTEM_PANEL_BREAKING_SYMBOLS_FILE | 断裂符号表 JSON | 空 |
DSH_ECOSYSTEM_PANEL_LABELS_FILE | 包名 → 一句话简介 JSON | 空(没登记的包只是没有简介) |
DSH_ECOSYSTEM_PANEL_DISABLED_GROUPS | 整组停用的类目(逗号分隔) | 全开 |
DSH_ECOSYSTEM_PANEL_WEBSERVER_SERVICE | 宿主 web server 服务名 | webServer |
4.2 配置文件与示例
examples/ 下有五份可直接抄的示例:
| 文件 | 对应配置 |
|---|---|
ecosystem-panel.config.example.json | 总览(各键的位置与形态) |
patch-manifest.example.json | ③ 补丁清单(checks / special / retired 三种形态都有例子,字符串里可用 ${HOME} 占位符) |
upgrade-rules.example.json | ⑤ 规则表文案(verdict 只是文案分类,不决定颜色) |
breaking-symbols.example.json | 宿主主包断裂符号参考底表 |
labels.example.json | 包名 → 一句话简介 |
用法:
DSH_ECOSYSTEM_PANEL_CONFIG=/path/to/my.config.json # 指向你抄过去改的那份
4.3 降级语义(重要)
- 没配 ≠ 没有:③ 未配清单时显示「未配置 ⇒ 不可判定」,不会显示"0 个补丁全绿"; ⑥⑦ 与 ⑤ 同理(都带配置指引)。
- 抓不到:宿主首页抓不到 boot 清单时,① 只把"未知"标黄,并把抓取错误原文放进
meta.bootError。 - 停用:确实不需要某一类,就把它写进
disabledGroups—— 面板会显示一条「已按配置停用」的提示项 (比静默消失更清楚,且不计入汇总)。 - 配置解析失败(比如清单 JSON 坏了)不会让面板崩:
meta.configErrors里能看到原因,该键回落默认。
4.2 配置文件与示例
examples/ 下有五份可直接抄的示例:
| 文件 | 对应配置 |
|---|---|
ecosystem-panel.config.example.json | 总览(各键的位置与形态) |
patch-manifest.example.json | ③ 补丁清单(checks / special / retired 三种形态都有例子,字符串里可用 ${HOME} 占位符) |
upgrade-rules.example.json | ⑤ 规则表文案(verdict 只是文案分类,不决定颜色) |
breaking-symbols.example.json | 宿主主包断裂符号参考底表 |
labels.example.json | 包名 → 一句话简介 |
用法:
DSH_ECOSYSTEM_PANEL_CONFIG=/path/to/my.config.json # 指向你抄过去改的那份