前言¶
DeepSeek Harness(DSH)把能力拆成可组合的插件 bundle,profile 用 pnpm 管理依赖。日常装插件时,命令行 dsh plugin add … 在官方桌面端有一个硬限制:应用运行时 desktop profile 由进程独占,pnpm 锁和加载器配置都在 app 手里,CLI 往往改不动正在用的 profile。设置里的官方「插件」页又主要管已安装列表和官方来源,社区包、GitHub 仓库、本地目录并不都在同一条路径里完成。
下面介绍社区插件 dsh-plugin-installer(维护者 DogEgg-alR,GitHub:DogEgg-alR/dsh-plugin-installer)。它在客户端设置 → 插件里增加 「安装与更新」 标签页,通过进程内的 pluginManager 服务安装与卸载,和官方插件页同一条实现;更新则转发 dshmarket 的公开更新接口,不在界面里重写版本策略。
这是什么¶
一句话:在 DeepSeek Harness 客户端界面里直接安装、更新、卸载 DSH 插件,并处理卸载后的 node_modules 残留。
分类属于 客户端 插件:宿主半提供 HTTP 桥并调用 pluginManager,客户端半在 plugins.tab 里渲染 UI。许可证 MIT,当前 package 版本为 1.4.3(以仓库 package.json 为准)。
核心功能¶
安装¶
输入任意 pnpm 认可的 spec,走 profile 自己的 pluginManager.installBundle,应用运行中也可安装,不会和 desktop profile 的文件锁对撞。
| 写法 | 例子 |
|---|---|
| npm 包名 | dsh-whale-widget |
| 指定版本 | dsh-better-sidebar@0.28.2 |
| GitHub 仓库 | github:DogEgg-alR/dsh-plugin-installer、owner/repo |
| 本地目录 | C:\Users\me\dsh-plugins\my-plugin |
装完会说明结果是「已生效」还是「重启后生效」;失败时给出可操作原因(已安装、不是插件包、依赖歧义已回滚、版本不兼容、pnpm 输出等)。
更新¶
点「检查更新」后逐行对比 当前版本 → 最新版本,可单行更新,带进度、失败说明,以及在市场提供恢复点时的「回滚到更新前」。进度展示跟随市场报告的 phase / percent / downloaded / detail;阶段文案来自 pnpm 的 pnpm:stage(解析依赖 → 下载 → 链接 → 构建)。轮询间隔 400ms。
依赖:更新区需要已安装 dshmarket,且市场需支持 update-api/v1(README 写明兼容 dshmarket 1.66+,beta)。未装市场时只显示提示,不影响安装。
特殊行为(资料原文):agent 正在跑时市场可能返回 AGENTS_RUNNING,插件会改走 busyPolicy: "drain" 排队,等对话结束再自动执行;RELEASE_TOO_FRESH / VERSION_UNCHANGED 时界面额外提供「强制更新」。
卸载与残留清理¶
列表每行可卸载(两步确认)。若 pluginManager.removeBundle() 因 bundle 正在使用而拒绝(桌面端常见 bundle-in-use),界面会逐级尝试:直接移除 → 停用后再移除 → 只从 profile 的 dependencies 与 dsh.profile.bundles 摘除并提示重启。第 3 步不碰正在运行的进程。
摘除的包会写入 <profile>/.dsh-plugin-installer/pending-cleanup.json;宿主启动约 10 秒后自动清理 node_modules 残留,也可在界面触发 POST /dsh-plugin-installer/api/cleanup 立即清理。
安装与启用¶
方式一:普通 profile(dsh web / CLI)¶
dsh plugin --profile web add github:DogEgg-alR/dsh-plugin-installer
桌面端把 web 换成 desktop 即可,但 须在完全退出官方桌面应用后 在外部终端执行,否则 CLI 仍可能等锁。
方式二:手动写进 profile¶
cd ~/.dsh/profiles/web
pnpm add github:DogEgg-alR/dsh-plugin-installer
还须在 package.json 的 dsh.profile.bundles 里追加 "dsh-plugin-installer",或在 profile 的 cordis.patch.yml 里插入挂载行;两种方式不要同时用。
官方桌面端在应用运行时¶
- 让 DSH 对话用
plugin_manager的install_bundle安装(见下一节),或 - 完全退出应用 → 外部终端执行方式一(profile 用
desktop)→ 再打开。
装上后 重启一次(新 bundle 只在启动时读加载器配置)。之后在 设置 → 插件 → 安装与更新 里装其它插件通常不必再为 installer 本身重启。
让 DeepSeek Harness 代为安装¶
把下面整段粘到 DSH 对话窗口:
帮我装插件 github:DogEgg-alR/dsh-plugin-installer 。
用 plugin_manager 工具的 install_bundle,target 填绝对路径或 spec;
装完把 application 字段告诉我,如果是 restart-required 就提醒我重启客户端。
不要自己改 profile 的 package.json,也不要手跑 pnpm。
典型用法¶
- 完成上述安装并重启(若提示需要)。
- 打开 设置 → 插件 → 安装与更新。
- 在输入框填入 spec(例如
github:DogEgg-alR/dsh-plugin-installer或 npm 包名),点「安装」。 - 需要批量看版本时点「检查更新」;确认 dshmarket 已就绪后再点某一行的「更新」。
- 卸载时按界面引导;若提示 bundle 在用,按结果说明停用或「从 profile 配置摘除」,必要时重启或点「立即清理」处理队列。
安装请求在后台是 POST /dsh-plugin-installer/api/install,立即返回 202 { jobId },客户端轮询 GET /dsh-plugin-installer/api/job?id= 取结果,避免长连接被掐断——因此界面会有一段时间处于进行中状态,pnpm 在整个 profile 里解析并落盘,几十秒在 README 中被描述为常态。
适用场景与注意¶
适合谁:经常在桌面端或 dsh web 里试社区插件、GitHub 开发版、本地目录 bundle,又不想在 app 运行时和 profile 锁搏斗的 DSH 用户。
安全与权限:插件以当前 DSH 进程权限执行 pnpm 与 pluginManager 操作,等同于你在该 profile 里手动装包。安装前应查看目标仓库源码与许可证,不要安装来源不明的 spec。
生态说明:DSH 社区插件目录(如 SkillHub 上的条目)是独立站点,与 DeepSeek / 幻方无官方从属关系;本插件是社区维护的客户端工具,不是官方应用商店。
兼容性(README):DeepSeek Harness 桌面端 / dsh web,profile 名任意;更新功能依赖 dshmarket 1.66+;客户端半仅依赖加载器注入的 react。
结尾¶
dsh-plugin-installer 把「装包 spec → pluginManager」和「更新 → dsh-market/update-api/v1」搬进 Harness UI,并补全卸载与 pending-cleanup 流程,针对的是 desktop profile 运行时 CLI 改不动、官方插件页入口单一的问题。