Passer au contenu principal
J

dsh-unified-market

jing-hy/dsh-unified-market

Place de marché unifiée de plugins conçue pour le shell DSH Desktop (EAC), regroupant le catalogue organisé, l'écosystème de plugins dsh sur GitHub et le registre npm en une seule vitrine, avec listes blanches de sources, vérifications préalables de conflits, vérification d'installation en démarrage d'essai, mises à jour manuelles/par lots/automatiques et gestion de packs de fonctionnalités .dshpack.

Installer

dsh plugin --profile web add github:jing-hy/dsh-unified-market

README

dsh-unified-market — 统一插件市场(Unified Plugin Market for DeepSeek Harness)

version license node ≥18.18

一个市场,三个数据源:精选目录 + GitHub dsh-plugin 生态 + npm registry。 对 DSH Desktop(EAC)针对性适配,开箱即用的插件安装 / 更新 / 自动更新 / 管理。

在设置页 设置 → 插件 → 🛒 统一市场 提供一站式体验:三源切换、分类下拉筛选、 已下载插件更新面板(一键全部更新 / 逐个更新 / 自动更新三档开关)、更新进度窗口、 市场自身自更新。

English: A unified plugin marketplace for DeepSeek Harness. It merges three sources — the curated awesome-dsh-plugin catalog, the GitHub dsh-plugin ecosystem and the npm registry — into one storefront inside DSH Desktop (EAC), with source whitelisting, conflict pre-checks, trial-boot install verification, update management (manual / batch / auto) and .dshpack feature-pack management.

v0.3.0 起新增「📦 功能包」tab:EAC 功能包(.dshpack)的安装 / 卸载 / 更新 / 导出 / 回滚与管理(本包承担交互编排层,核心逻辑在 L2 功能包 CLI,见下)。


整合自哪三个插件

本项目把三个社区插件市场的能力合并为单一市场,三者分别是:

来源插件定位本市场吸收的能力
dsh-webui-market(精选目录市场)awesome-dsh-plugin.com 精选目录🎯 精选目录 + 离线快照兜底(data/catalog-snapshot.json)、来源白名单 + 试装验证(trial boot):安装前在临时环境实际启动一次、只认 dsh web: 就绪行才放行、真实 profile 从未被写过、安装前快照可回滚、简单插件热挂载免重启、安装前冲突预检、allowBuilds 自动放行、第三方本地构建产物保留
zat-dsh-engine(GitHub 生态市场)GitHub dsh-plugin topic 检索 + 中文简介 + 国内镜像🐙 GitHub 生态实时检索(按星排序、分页)、中文简介(README.zh.md 摘要)、gh-proxy / ghfast 双镜像抓取兜底(无 VPN 也能访问 GitHub)
dsh-plugin-marketplace(npm 市场,DSH Desktop 配套)npm registry 检索 dsh 插件📦 npm registry 检索(keywords:dsh-plugin)、更新检测(版本对照、TTL 缓存)、更新失败回滚、全部更新

三方定位与 “对 EAC 特化” 的联系: 旧三个市场在 DSH Desktop(EAC)桌面壳里交错存在,各有失效面(profile 解析错误、 重复注册、更新链路不完整),本项目把它们整合为一个对桌面壳正确的统一入口。


对 EAC 的针对性适配

版本适配基线:当前版本对 DSH Desktop(EAC)5.1 与 dsh 0.1.1-rc.2 进行过专项适配测试,为推荐的运行组合;其余官方版本的兼容性以桌面壳内置的兼容扫描结果为准。

EAC(DeepSeek Harness Desktop)的 Web UI 跑在桌面专属 profile web-desktop (由主进程通过 DSH_DESKTOP_PROFILE 注入)。旧市场中:

  • zat-dsh-engine 只认 DSH_PROFILE、否则回落选 web;
  • dsh-plugin-marketplace 写死 web;

→ 它们在桌面壳里检测/修复/安装的实际对象是另一套 profile(这就是“在 EAC 里是摆设”的根因)。 本市场所有读写统一解析为:

DSH_DESKTOP_PROFILE → DSH_PROFILE → web(独立安装时回退)

另针对桌面壳做了这批适配:

  • profile / 同步层
    • 全部读写走桌面壳真实 profile(desktopProfile() + resolveProfile() 归一化)。
    • 内置插件清单(.dsh-builtin-plugins.json)识别:内置插件不进入市场检测/更新, 由官方「内置插件更新」统一维护,避免与 syncCompanionPlugins 冲突。
    • 市场自身作为内置插件(COMPANION_PLUGINS 注册 unified-market), 上游发布后走官方 PLUGIN_UPDATE_SOURCES 自更新。
  • 安装 / 更新链路
    • 试装验证、冲突预检、来源白名单、安装前快照、热挂载(源自 dsh-webui-market)。
    • Windows 文件锁(服务运行中 pnpm 写 node_modules):任务自动排队 (.dsh-market-pending.json),并在「Web 服务启动早期」由本市场 host 自动消费; 同时修复主进程排队消费对 kind:"update" 任务的遗漏。
    • 本地链接(link:/file: 指向开发目录)插件也能更新:从上游接管安装, 更新前先删除 junction/符号链接(Windows pnpm 替换 symlink 会 EPERM), 失败自动回滚恢复原链接;本地开发目录原样保留。
    • 24h 发布保护期:上游新版本发布不足 24h(pnpm minimumReleaseAge)时不显示 “可更新”,避免“可见不可装”。
    • pnpm allowBuilds 拦截自动放行并重试。
  • 自动更新 / 自更新
    • 后台自动检测(启动 20s 后首检 + 每 6 小时),三档:关闭 / 仅提示 / 自动升级; 状态持久化在 <profile>/.dsh-unified-market.json。
    • 市场自身自更新接口(selfUpdate)+ 官方内置插件更新引擎对接。
  • 功能包 CLI 定位(v0.3.0):桌面壳经 DSH_DESKTOP_RESOURCE_ROOT 注入 dsh-desktop 资源根,本市场据此定位 scripts/feature-pack-cli.js 并 spawn (与现有 dsh plugin 子进程同构);缺该环境变量时功能包页明确降级提示, 不影响插件市场其余功能。

功能包(Feature Pack · .dshpack)支持

v0.3.0 引入。借鉴 HMCL 整合包体系:把「插件组合 + 预设 + 技能」打包为 .dshpack, 可一键安装 / 卸载 / 更新 / 导出 / 回滚;包声明对官方内核(@deepseek-ai/dsh)的 semver 兼容范围,官方版本升级后由 EAC 桌面壳启动兼容扫描自动检出 (state: incompatible),本市场「📦 功能包」页给出「迁移(安装新版)」/ 「回滚(保护中心快照)」入口。

分工:本包只做交互编排(UI、op 轮询、上传中转、市场索引浏览);解析 / 校验 / semver / 注册表 / 装配 / 兼容扫描等核心逻辑在 dsheac 主体 L2 (dsh-desktop/lib/desktop/feature-pack.ts + scripts/feature-pack-cli.ts), 经 DSH_DESKTOP_RESOURCE_ROOT 定位 spawn,不重复实现(避免双实现漂移)。

  • host 新增 pack.* 方法:pack.list / pack.inspect / pack.install / pack.uninstall / pack.update / pack.export / pack.rollback / pack.scan / pack.market;安装类走现有 op 串行/轮询/超时模型,上传文件在 op 结束后自动清理。
  • pack.market 索引走 live → 5 分钟缓存 → data/packs-snapshot.json 内置离线快照 三级降级(对齐 catalog-snapshot.json 模式);下载校验 SHA-256(--sha256)。
  • 功能包 CLI 退出码约定:0 成功|1 一般失败|2 用法|3 文件锁待排队(自动写入 feature-packs/.ops/pending.json,服务重启前的无锁窗口自动续跑)|4 兼容失配| 5 冲突阻断。

功能一览

  • 三源切换:🎯 精选目录 / 🐙 GitHub dsh-plugin 生态 / 📦 npm,各自搜索、排序、分页; 精选目录分类用下拉框筛选(含“全部 / 已安装”)。
  • 安装:内置标记拦截 → 冲突预检(refuse 拒装)→ 来源白名单 → 试装验证 → 安装前快照 → pnpm allowBuilds 放行 → 本地构建产物保留 → 简单插件热挂载免重启。
  • 已下载插件更新面板:只列可更新的插件;每项 当前版本 → 最新版本 + 单个「更新」按钮;顶部「⬆ 全部更新 (N)」一键批量;「检查更新」强制重查。
  • 更新进度窗口:后台批量更新实时进度(第 x/y 个、成功/排队/失败计数、 最近输出);失败或排队时窗口保留显示原因(✕ 手动关闭),不再自动消失。
  • 自动更新三档:关闭 / 仅提示(默认)/ 自动升级。
  • 本地链接插件:也检测上游更新(GitHub repo / npm 名推断 → 市场按名匹配, 可从上游接管安装或保留链接在本地更新。
  • 市场自更新:上游发布后由官方「内置插件更新」自动/手动升级。
  • 功能包管理(v0.3.0):「📦 功能包」tab —— 已安装列表(版本/兼容性徽标/更新/导出/ 卸载)、本地导入 .dshpack(文件选择 → base64 → 安装)、功能包市场浏览一键安装 (SHA-256 校验)、官方内核升级后不兼容提示条 + 一键迁移(选新版)/ 回滚。

安装

方式一:DSH Desktop(EAC)内置分发(推荐)

把本包放入 assets/plugins/dsh-unified-market/,并在桌面壳 main.js:

  • COMPANION_PLUGINS 增加:
    { id: 'unified-market', name: 'dsh-unified-market', dir: 'dsh-unified-market' }
    
  • (可选)移除旧 dsh-market-plugin(dsh-webui-market)与 zat-market(zat-dsh-engine)条目。
  • 重新启动应用,syncCompanionPlugins 会把包同步进 web-desktop profile 并挂载。

方式二:独立安装(非内置、脱壳)

dsh plugin --profile web-desktop add dsh-unified-market
# 或 GitHub 源:
dsh plugin --profile web-desktop add github:jing-hy/dsh-unified-market

安装后 重启 Web 服务,在 设置 → 插件 → 🛒 统一市场 使用。


市场自更新(内置分发时启用)

在 main.js 的 PLUGIN_UPDATE_SOURCES 启用:

'unified-market': { npm: 'dsh-unified-market' },

之后由官方「内置插件更新」(启动 20s 后 + 每 6 小时检测、可开自动更新)负责 更新到覆盖层并重启服务生效;独立安装时市场的 selfUpdate 接口同样对比 npm 版本。


目录结构

dsh-unified-market/
├── package.json            # dsh.bundle.patch / dsh.client 声明 + 发布元信息
├── cordis.patch.yml        # host 半边挂载声明
├── lib/
│   ├── host.js             # host 半边(ESM):HTTP 路由 /api/dsh-unified-market
│   ├── client.js           # 浏览器半边:设置页「统一市场」tab
│   ├── allow-builds.mjs    # pnpm allowBuilds 拦截自动放行
│   ├── artifact-keep.mjs   # 第三方本地构建产物保留
│   ├── profile-sync.mjs    # profile 配置的「双边同步」写层(v0.4.0 起)
│   └── plugin-conflict-scan.mjs  # 安装前冲突预检
├── data/catalog-snapshot.json    # 精选目录离线快照(官网不可达时兜底)
├── data/packs-snapshot.json      # 功能包市场索引离线快照(v0.3.0 起)
├── README.md
└── LICENSE

通信:client 通过 POST /api/dsh-unified-market(兼容 /api/dsh-market)调用 host。 host 半边运行在 dsh web 进程(Cordis plugin,注入 webServer)。


profile 配置:双边同步(v0.4.0 起)

市场对 profile 配置(package.json 的 dsh.profile.bundles 与 cordis.patch.yml)的写入不再是单向复写。

旧行为的问题:市场原先只经 dsh plugin add/remove 间接改配置,由 dsh 内核 reconcilePlugins 按 dependencies 整文件重写 package.json。整文件重写 = 「以内存状态覆盖磁盘」——读取之后、写入之前发生的任何外部改动(用户手编、 其他插件、壳侧 heal、并发会话)都会被丢掉。

新行为:所有配置写盘收敛到 lib/profile-sync.mjs 一个入口,规则如下:

规则说明
每次重读磁盘无模块级缓存;绝不用操作开始前的快照覆盖当前状态
并集合并以 id 为键,只增删本层管理的条目;外部行/未知行/注释/空行原样保留
CAS 校验写前比对 SHA256 + size + mtime,冲突则重读重合并(最多 3 次)
原子写同目录临时文件 + rename(patch 被截断 = 启动死循环)
写前校验空 - insert: 块、duplicate loader entry、JSON 可解析 —— 非法产出拒绝落盘
写后复核不一致自动回滚到操作前快照
快照同时备 package.json 与 cordis.patch.yml,并提供 profile.restore 还原

新增 host 方法:

方法作用
profile.state读实时状态(bundles / 禁用 id / patch 合法性 / revision / 快照列表)
profile.toggle启用或禁用某个插件包,双边同步落盘
profile.snapshots列出配置快照
profile.restore从指定快照还原配置

禁用插件的正确写法

禁用必须写顶层编辑型行:

# 插件市场(dsh-unified-market):关闭 <id>
- id: <id>
  name: '<pkg>'
  disabled: true

不要写成 - insert: 块。桌面壳 boot 期的 removeBundledRowDuplicates (dsh-desktop/patch-row-heal.js)会删除与 bundle 包内 patch 同 id 的 insert 块, 即使该块带 disabled: true —— 表现为"手写的禁用行凭空消失、插件又启用了"。 顶层编辑型行不受该去重影响。市场写禁用时会自动把 insert 块内的同 id 内层条目 一并移除,并清理因此产生的孤立空 - insert: 块。


版本记录

  • 0.2.0(2026):三源合一 + EAC 适配(web-desktop profile、文件锁排队与启动消费、 link→上游接管、24h 保护期、更新进度窗口)。
  • 0.2.1(2026):修复 README 编码(去除 BOM / 修正 mojibake)。
  • 0.3.0(2026):新增「📦 功能包」tab 与 pack.* host 方法 —— EAC 功能包 (.dshpack)的交互编排层(安装/卸载/更新/导出/回滚/市场浏览 + 官方内核兼容扫描 联动),SELF_VERSION 与 package.json 同步 0.3.0。
  • 0.3.1(2026):修复功能包 CLI 定位失败的误导性报错 —— 0.3.0 及之前, 「桌面壳未注入 DSH_DESKTOP_RESOURCE_ROOT」与「CLI 文件不存在(客户端安装 不完整/版本过旧)」两种失败统一误报"缺少 DSH_DESKTOP_RESOURCE_ROOT",用户 明明在桌面端却被提示去桌面端,排障困难;现 packCliStatus() 区分两种原因 并给出可行动提示(升级/重装桌面客户端)。
  • 0.4.0(2026):profile 配置写入改为双边同步(新增 lib/profile-sync.mjs 唯一写层:每次重读磁盘 / 并集合并 / CAS / 原子写 / 写前校验 / 写后复核回滚 / 双文件快照 + 还原);新增 profile.state / profile.toggle / profile.snapshots / profile.restore 四个 host 方法;CLI 操作成功后新增后置增量同步;禁用插件 改为主写顶层编辑型行,避免被桌面壳 boot 期 removeBundledRowDuplicates 删除。

发布

  • npm:npm publish(包名 dsh-unified-market;最新版本 0.4.0)。
  • GitHub:github.com/jing-hy/dsh-unified-market(main 分支)。

License

MIT(见 LICENSE)。离线目录快照数据来自 awesome-dsh-plugin.com 社区目录,版权归各自作者;三方整合能力分别源自对应插件的 MIT/开源许可。

Plugins associés