zefferry/dsh-plugin-manager-plus: Add a layer of management to the DSH plugin list

前言

DSH 的理念是「一切皆插件」,装插件是常态。但原生「插件」页做的是基础陈列:按内置 / 实验性 / 已安装三个分区展出,启用开关点了就生效。装得多了之后,几个问题会一直存在:找插件要靠滚动,插件名和简介是官方写的,卸载要逐个点,装了什么自己记不清,多个窗口编辑还会互相覆盖。

zefferry 维护的 zefferry/dsh-plugin-manager-plus 就是针对这一页做的第三方增强。它不是替换页面,而是在原生 DOM 之上叠加一层纯展示逻辑:标签筛选、搜索、排序与拖拽、批量操作、改名 / 改简介 / 换图标,以及用 DSH 当前默认模型做 AI 生成。下面介绍它的能力、安装方式和限制。

需要先说明:这是非官方第三方插件,与 DeepSeek 官方无关,也没有发布到 npm。

它是什么

一句话定位:给 DSH 原生插件列表页做 UI 增强的客户端插件,作者 zefferry,当前版本 v0.9.1,MIT 许可。

它的实现方式值得先看清楚:纯展示层叠加,不改原生 DOM 结构,不移动节点,只写文本与样式。这意味着禁用插件后原生页面立刻恢复原样,没有向后兼容的包袱。渲染在 DSH Web 客户端上完成,无第三方运行时依赖。

插件还引入了一层 Surface 契约 v1:任何页面只要按契约标注 data-plugin-surface / data-plugin-caps,就能复用筛选、改名、图标、排序、批量这些能力,并按 caps 裁剪。原生插件页是隐式 surface,无需适配。这对后续有多个插件列表页面(比如分身管理)的场景比较有用。

核心功能

筛选与搜索

插件栏从左到右是:标签 pills(全部 / 启用中 / 未启用 / 自定义标签 / +新建)→ 搜索框 → 批量操作 → 调整顺序 → 排序。

标签里有两类要区分。全部是全量,其余可以理解成两个系统标签加自定义标签:

  • 「启用中 / 未启用」是派生标签,读卡片上启用开关的 aria-checked 自动归类,不需要手动维护,也不能删除或改名。
  • 自定义标签需要手动添加,支持「+新建」。

需要注意一个取舍:v0.9 起移除了「内置 / 实验性 / 已安装」分组标签,因为原生页面本身已按这三个分区展示,再放一层只会造成重复。

搜索框的匹配规则是:名称按严格子串匹配,原生名与自定义名都参与;简介按模糊子序列匹配。搜索结果与当前标签筛选取交集。

排序与手动拖拽

「排序」下拉提供手动顺序 / 名称 A→Z / 名称 Z→A / 启用优先 / 版本高→低 / 最近出现。

手动排序走「调整顺序」按钮。进入后整张卡片可拖,落点会画一条插入指示线,松手才提交,卡片之间的空隙也能放置。顺序按分区保存(all / tag:<id>),也就是说不同标签视图各自记住一份手顺。拖动期间面板会抑制原生 hover 背景,避免结束后残留高亮。

批量操作

工具栏点「批量操作」后分裂成「全选」与「完成」两个按钮,点卡片即可多选。然后右键出批量菜单:批量添加标签、批量添加到分身、批量卸载(卸载带确认,失败项保留选中)。批量只作用于「仍选中且当前可见」的卡片,工具栏有 aria-live 的「已选择 N 项」计数,数量变化会被读出来。

「批量添加到分身」读取分身管理插件的实例列表:运行中或已安装的分身置灰并标注原因,其余点击即添加,添加后需要重启该分身才生效。

卡片编辑

右键菜单项是:重命名… / 更改图标… / 添加标签 ▸ / 添加到分身 ▸ / 卸载…。

重命名可以自定义显示名称与简介,原名保留为小字,改名后立即反映到卡片上。卸载调用原生卸载逻辑,只对可卸载插件出现。

图标通过「更改图标…」打开图标库,内置图标与已上传图标平铺在同一网格里,支持 png / jpeg / webp / gif / svg / ico 单图上传,或 zip 批量上传;内置图标和上传图标都可以多选删除。图标库上限 100 张,单图 ≤512KB,zip ≤8MB 且 ≤40 张。

菜单切键完全可用:↑/↓ 移动,→/Enter 展开子菜单,← 返回,Esc 关闭整个菜单,菜单打开时不预亮首项。点菜单外部第一次只关闭菜单,不会误触下层卡片;越界时菜单自动翻转。

AI 生成名称与简介

重命名弹窗底部是「一键生成」。默认直接使用 DSH 当前默认模型,不需要单独填 API Key。未配置 AI 时按钮会禁用并显示「AI 未配置」,默认模型不可用时状态行会说明原因。

提示词可编辑,是五段式结构:角色 / 原始信息 / 要求 / 输出格式 / 自审,支持 {name}、{description}、{existingNames} 占位符,并可以恢复默认。

生成过程在 host 侧有多轮自检:合法性(合法 JSON)、长度、名称不与其它插件重复,不合格会把问题反馈给模型重答,最多 3 轮。模型选择可以跟随默认模型,也可以指定 provider/model 并使用其最低推理档;deepseek-official 在凭证可用时优先走直连 API,失败静默回退到 DSH 原生调用。

生成中会提示「AI 正在后台生成…」,成功提示「插件「旧名」已重命名为「新名」」。生成长任务在后台跑,中途关弹窗不取消。

如果要接自建服务,可以显式配置 OpenAI 兼容端点,走 config.ai 配置或 PMP_AI_* 环境变量。具体配置项与多轮校验规则在仓库的 docs/REFERENCE.md 的「AI 代理配置」一节。

安装防自动启用

通过原生安装入口(含市场一键安装)装好的插件默认处于关闭状态,避免装完即激活。这条对于批量装插件的场景比较实用。

安装与启用

该插件未发布到 npm,安装方式是给 DSH profile 加一个本地 link: 依赖。下面以 Windows 默认 profile 为例。

先关闭 DSH,克隆仓库:

git clone https://github.com/zefferry/dsh-plugin-manager-plus.git

然后编辑 %USERPROFILE%\.dsh\profiles\desktop\package.json,在 dependencies 中加入:

"@local/dsh-plugin-manager-plus": "link:<克隆目录>"

路径用正斜杠,例如 link:E:/tools/dsh-plugin-manager-plus。同时把 "@local/dsh-plugin-manager-plus" 追加到 dsh.profile.bundles 数组。这一步是为了让 DSH 把插件插入 bundle。

接着创建 junction,让 profile 能解析到克隆目录:

mkdir "%USERPROFILE%\.dsh\profiles\desktop\node_modules\@local"
mklink /J "%USERPROFILE%\.dsh\profiles\desktop\node_modules\@local\dsh-plugin-manager-plus" "<克隆目录>"

最后重启 DSH。

如果使用非默认 DSH_HOME 或其它 profile,把上面的 .dsh/profiles/desktop 换成正在使用的 profile 目录即可。

卸载时关闭 DSH,移除上述依赖与 bundle 声明、删除 junction,重启就恢复原生页面。状态文件在 $DSH_HOME/plugin-manager-plus/state.json,可以手动删除。

典型用法

装好之后,日常操作基本都是从标签筛选条开始的。

先按状态过滤:点「启用中」看当前真正在跑的插件,点「未启用」看装了但关着的。插件多了之后这一步比滚动快得多。

再配合搜索缩小范围。名称按严格子串匹配,输入 plugin 能命中所有原名或自定义名包含该片段的条目;忘记名字只记得大概方向时,简介的模糊子序列匹配更合适。

排序如果固定看测试环境里的版本新旧,可以直接选「版本高→低」,不需要手动拖拽。

只有想要固定分区顺序时才进「调整顺序」拖拽模式,退出时点一下按钮即可,draggable 与把手会被清理。

批量场景:装了一批插件后,在批量模式下全选,右键批量卸载,卸载前有确认;也可以批量加上自定义标签做分组。

改插件名和图标适合在统一整理插件列表时做:右键重命名填自定义名与简介,重命名弹窗里点「一键生成」让模型出版本,不满意再手改。

状态与数据

插件的所有改动落在本地文件中:

数据 位置
标签、分区顺序、名称/简介/图标覆盖、AI 提示词、模型选择 $DSH_HOME/plugin-manager-plus/state.json
上传的图标 $DSH_HOME/plugin-manager-plus/icons/
AI 失败诊断(一行 JSON,权限 0600) $DSH_HOME/plugin-manager-plus/ai-error.log

状态写入使用原子替换加版本 CAS;文件损坏会备份为 state.json.bak-<时间戳> 并以空状态继续。跨窗口同步是 2.5 秒轮询,不是实时推送,多窗口同时编辑时以此为准。

兼容性与注意

项目 说明
DSH Desktop 在 0.2.2-rc.1 上验证,同时兼容 0.2.1-rc.5 的页面结构(v0.9.1 起自适应两种 DOM)
运行环境 DSH Web 客户端(platform: web),无第三方运行时依赖
浏览器 Chromium / Edge 内核(随 DSH 桌面端)
平台 主要验证 Windows

这条需要特别留意:插件使用了 DSH 未公开的插件加载与 DOM 结构。DSH 升级如果改动这些结构,插件可能需要跟进适配。维护者主要在 Windows 上验证过,其它平台可能失效。

插件以当前 DSH 进程的权限运行,并且安装方式是链接本地克隆目录。装之前建议先通读源码(client.js 是浏览器端 UI,host/index.js 是状态存储、HTTP 路由与 AI 代理),许可是 MIT。仓库里没有随附发布维护者的测试代码,只有运行时代码与文档,所以行为边界以 docs/REFERENCE.md 为准。

已知限制摘要:

  • 「配置条目卡」没有启用开关,只支持改名称,不参与状态筛选,也不能改图标。
  • 状态筛选下隐藏「调整顺序 / 排序」,因为状态视图跨三个分区,无法表达分区手顺。
  • 手动排序模式下卡片 :hover 背景会被抑制,这是为消除拖动残留高亮做的取舍。
  • 推理强度由模型元数据决定,无档位时不下发该参数。

代码体积方面,client.js 219,105 B,host/index.js 89,267 B,合计约 301 KiB。开发上没有构建步骤,client.js 由 DSH 的 window.__ModuleLoader__ 直接加载,host/index.js 由 Cordis 加载,改完重启 DSH 生效;提交前至少执行:

node --check client.js
node --check host/index.js

适用场景

适合 DSH Desktop 用户,尤其是插件数量多到需要筛选和搜索、需要统一整理插件列表、要给插件换名字和图标的人。

不太适合的场景:依赖 DSH 私有插件 API 与 DOM 结构,DSH 升级后需要等适配;插件列表本身就是按官方分区陈列、没有额外分组需求的用户,原生页面已经够用。

结尾

这插件的价值在于它没有重写插件页,而是在原生 DOM 上加了一层可控的界面能力:筛选、搜索、排序、批量、改名、换图标、AI 生成,并且在 Surface 契约下还可以迁移到其它插件列表页面。以 v0.9.1 的实际形态看,它是一个面向「插件多了之后怎么管」这个具体问题的开源方案。

目录页:https://www.skillhub.cn/plugins/zefferry/dsh-plugin-manager-plus

源码:https://github.com/zefferry/dsh-plugin-manager-plus

说明:DSH 社区目录是独立站点,与 DeepSeek、幻方无官方从属关系。本文介绍的插件是非官方第三方组件。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye