插件市场索引
DSH 0.2.1 起支持第三方插件市场:在「发现」页添加一个索引 URL,就能浏览该市场列出的插件并直接安装。本仓库发布一份这样的索引,列出仓库内已发布的运行时插件。
本文说明如何添加本项目的索引源、索引里有什么,以及维护者如何重新生成它。
通过市场安装
1. 启用自定义插件市场
插件市场是实验性的可选能力,默认关闭。在插件页启用「自定义插件市场」并重启 DSH,插件页会出现「发现」页签。
2. 添加索引源
在「发现」页添加以下 URL 作为索引源:
https://fndsh-doc.tnnevol.cn/plugins/market/index.json索引源属于用户自己的配置,保存在 profile 中,不被任何插件改写。添加索引源会引入新的代码来源,界面会给出信任提示。
3. 浏览与安装
每个条目显示插件的名称、用途说明、图标、作者与可用版本。进入条目可以查看全部版本与来源信息,选择一个版本即可安装。安装沿用 DSH 既有的安装流程:兼容性检查、构建脚本批准与版本拒绝规则照常生效。
索引是按插件分别浏览的,不是所有市场合并成一个列表——不同市场的分类 id 含义可能不同。
索引内容
索引由上游官方生成器 @deepseek-ai/dsh-plugin-market-generator 从 npm 直接读取生成,不是手写维护。
| 字段 | 来源 |
|---|---|
| 名称、描述 | 插件包内 locale/en.json 与 locale/zh.json 的 meta.title、meta.description |
| 图标 | 插件 package.json 的 icon(包内相对路径文件) |
| 版本与发布时间 | npm registry 上该包未弃用、声明了 dsh.bundle 的版本 |
| 兼容范围 | 插件 package.json 的 engines.dsh 或 DSH 同行依赖范围 |
| 作者、主页、仓库 | 插件 package.json 的同名字段 |
| 关键词 | 插件 package.json 的 keywords |
关于图标
图标来源必须清晰:官方品牌素材优先;维护者或用户明确提供的自定义图像也可作为插件自身视觉标识,但不得冒充搜索服务商或其他第三方官方品牌。
| 插件 | 图标来源 |
|---|---|
@tnnevol/dsh-fnos | 飞牛 fnOS 官方品牌标识 |
@tnnevol/dsh-midscene | 本插件自有图标 |
@tnnevol/dsh-codex-auth | 无(未取到可确认归属的官方素材,省略) |
@tnnevol/dsh-failover-search | 用户提供的玻璃质感蓝色地球浪潮图(512×512 PNG,253,051 B;自定义图标,非搜索服务商官方标识) |
@tnnevol/dsh-semi-ui-showcase | 无(同上) |
@tnnevol/dsh-zcode | 本插件自有图标 |
无可信来源的图标仍有意省略;自定义图标只表达插件自身,不暗示任何第三方服务商背书。缺少图标只影响识别度,不影响安装与使用。
维护索引
前置条件
生成器是上游 DSH 仓库里的独立 Node 程序,不在本仓库内。需要在 fork-pj/deepseek-harness 检出中运行。
重新生成
在仓库根执行:
# 以本仓库根目录为准
REPO=$(git rev-parse --show-toplevel)
cd "$DSH_DESKTOP_APP_DIR/apps/plugin-market-generator"
npx tsx src/bin.ts \
--input "$REPO/docs/public/plugins/market/plugins.txt" \
--output "$REPO/docs/public/plugins/market/index.json" \
--cache "$REPO/tmp/plugin-market-cache" \
--title "飞牛 fnOS DSH 插件" \
--description "为飞牛 fnOS 维护的 DSH 插件:模型提供方、搜索故障转移、浏览器自动化与系统集成。"源列表 plugins.txt 与本文件同目录,每行一个 npm 包名,# 开头为注释。
什么时候必须重新生成
每次发布插件新版本之后。 生成器读取的是 npm 上已发布版本的 tarball,不是本地源码:
- 改了
keywords或icon但没发版,索引里不会有它们。 - 发了新版本但没重新生成,发现页显示的就是旧版本。
索引是随文档站一起发布的静态文件,不会自动更新。
自动同步
pnpm run publish 已在发布收尾自动执行这一步,不需要手动记:
pnpm run publish -- --all # 发完全部插件后自动重新生成索引
pnpm run publish -- --all --skip-market-index # 显式跳过(例如离线)需要单独重跑时用独立入口——发布时生成器不可用(未配置 DSH_DESKTOP_APP_DIR、网络不通)事后补跑,或只改了已发布版本的元数据后刷新:
pnpm exec fnos-dsh-cli market:index两处都不只看退出码:pnpm 在没有任何项目匹配 filter 时也以 0 退出,那种情况下索引根本没被重写。命令以「索引文件是否真被改动」为成功判据,未变化时给出警告。
version 命令不触发同步,这是刻意的:索引跟随的是 npm 上已发布的版本,本地改版本号时 npm 还没变,此时生成只会得到相同内容。
发版前先验证产物,别指望生成器报错
元数据缺失时生成器不报错,它只是安静地少字段或回退到包名。因此发布前必须 在本地确认产物内容,而不是发完再生成索引回看:
cd plugins/dsh-<插件>-plugin
pnpm pack
tar -tzf tnnevol-dsh-<插件>-<版本>.tgz要看到的是:package.json 里的 keywords 与 icon、icon 指向的图片文件本 身、locale/ 目录,以及 exports 里有没有 ./locale/*.json。文件不在 files 白名单里就不会进 tarball,本地工作区看起来正常但线上消费者拿不到。
历史上漏过一次:只补了 keywords 与图标就发版,生成索引后才发现五个插件的标题 全是包名——它们缺 locale/。补发的中间版本无法撤回,成为无人使用的残次品。完 整规则见发布流程。
校验
仓库的测试会守住两件最容易忘的事:
- 索引里每个插件的最高版本必须等于 npm 上该插件的
next标签——落后会直接失败,并提示重新生成。 - 每个插件都必须有
keywords。
离线时版本一致性用例会跳过而不是失败。
pnpm --filter @tnnevol/fnos-dsh-cli test已知的生成器输出
- 生成器会列出插件在 npm 上的全部历史版本(从
0.2.0-rc.2.x起)。安装时由用户选择版本,兼容性由 DSH 的兼容门禁判定。 - 生成器对个别历史版本会报
DSH range "catalog:dsh" is not a valid SemVer range并跳过该版本——那是历史上误把 catalog 协议写进 peer 的产物,属预期的兼容性过滤。 - 同一份源列表重复生成得到完全相同的内容,可以直接用
git diff对比。