FNOS-016 插件市场索引与插件元数据
| 项目 | 内容 |
|---|---|
| 需求编号 | FNOS-016 |
| 提出日期 | 2026-10-18 |
| 需求状态 | 已通过验收(DSH Web 与 DSH Desktop) |
| 关联计划 | PLAN-FNOS-016 插件市场索引与插件元数据 |
| 适用范围 | 六个运行时插件的 package.json 元数据、文档站托管的插件市场索引、插件文档站 |
需求背景
DSH 0.2.1 线引入了第三方插件市场:用户可以在「发现」页浏览外部发布的组合包(bundle)目录,直接安装,而不必事先知道 npm 包名或 git 地址。市场本身不带默认源——每个项目自己发布一份索引文件,用户把它的 URL 添加为索引源即可。
本仓库已经把六个运行时插件发布到 npm,但没有发布任何市场索引,因此在 DSH 的发现页里搜不到这些插件。同时插件自身的元数据也不完整,影响被市场和搜索识别的效果:
- 六个插件都没有
keywords。发现页的模糊搜索覆盖包名、作者、关键词、标题与描述,缺少关键词意味着用户用「搜索」「翻译」「登录」这类意图词找不到对应插件,只能依赖精确包名。 - 六个插件里只有 Midscene 声明了
icon。其余五个在发现页会显示占位图,识别度低。
这两项都不是错误,但它们决定「插件能不能被找到、被认出来」,而这正是引入市场索引的目的。
调研结论
| 结论 | 出处 | 影响的功能 | 状态 |
|---|---|---|---|
市场索引格式由 @deepseek-ai/dsh-plugin-market-index 定义,format 固定为 1;顶层必填 format、title、plugins,每项插件必填 name 与至少一个 versions | 上游 packages/util/plugin-market-index/src/types.ts 与 src/index.ts 的 parseMarketIndex | FNOS-016-01 | 已核实 |
校验器会丢弃格式未定义的成员;官方格式说明中的示例含 dist-tags,但校验器不识别该字段 | 用 parseMarketIndex 实测:输入含 dist-tags 的条目,输出对象键为 name、metadata、versions | FNOS-016-01 | 已核实 |
本地化文本对象必须含 en 键,只写中文会被拒(must contain en) | 实测 {"title": {"zh": "中文"}} → $.title must contain en | FNOS-016-01 | 已核实 |
图标可为内联 data:(≤32 KiB,SVG/PNG/JPEG/WebP)或 URL;相对路径按索引 URL 解析,跨源必须 https | src/index.ts 的 icon();实测 http: 跨源图标被拒 | FNOS-016-02 | 已核实 |
engines.dsh 不接受 workspace: 前缀,必须是 SemVer 范围 | 实测 workspace:* → must not be a workspace: range | FNOS-016-01 | 已核实 |
上游官方生成器 apps/plugin-market-generator 可从 npm 包名列表生成合法索引,并在本地可运行 | 本地执行 pnpm --filter @deepseek-ai/dsh-plugin-market-generator start --help 成功输出用法 | FNOS-016-01 | 已核实 |
| 生成器从 npm 已发布版本的 tarball 读取展示元数据(标题、描述、图标、关键词、作者、仓库),而不是从本地源码读取 | apps/plugin-market-generator/src/metadata.ts 的 readDisplayMetadata;README 说明「只下载最高列出版本的 tarball」 | FNOS-016-02、FNOS-016-03 | 已核实 |
索引的标题与描述优先取自包内 locale/<lang>.json 的 meta.title 与 meta.description,缺失时回退到 manifest 的 name 与 description;因此没有 locale 文件的插件在发现页只显示包名 | 上游 apps/plugin-market-generator/src/metadata.ts 的 dictionaries 与 localized | FNOS-016-07 | 已核实 |
生成器的收录前提是版本的 package.json 声明 dsh.bundle,且其 patch 是文件路径或路径列表;本仓库六个插件均满足 | 逐包检查 dsh.bundle.patch,六项全部为 ./cordis.patch.yml | FNOS-016-01 | 已核实 |
图标来源须是包内相对路径文件(SVG/PNG/JPEG/WebP,≤256 KiB),manifest 的 icon 优先于 ./icon 导出 | src/metadata.ts 的 readIcon | FNOS-016-02 | 已核实 |
文档站 docs/public/ 下的文件会原样发布到站点根,站点域名为 fndsh-doc.tnnevol.cn | docs/public/CNAME;.github/workflows/deploy-docs.yml 发布的产物目录 | FNOS-016-04 | 已核实 |
| 各插件对应服务商的官方品牌素材可获取性不一致:fnOS 官方 favicon(ICO)与 CodeBuddy 官方图标(SVG)可用;OpenAI/Codex 官方站点与图标库均无可直接使用的素材,Semi Design 官方 logo 地址返回 HTML 而非图片,Tavily favicon 为通用箭头图形而非品牌标识 | 逐个探测各供应商站点与图标库,并按文件类型识别返回值 | FNOS-016-02 | 已核实 |
需求目标
- 六个插件带上能表达其用途的关键词,使用户用意图词可以在发现页搜到对应插件。
- 有可信官方品牌素材的插件显示真实图标;没有的如实省略,不用自制图或来路不明的图片充数。
- 产出并托管一份符合格式的市场索引,DSH 用户添加该 URL 后可以浏览全部六个插件并直接安装。
- 索引内容与 npm 上实际发布的版本一致,不出现「索引里有、装不上」或「索引版本落后」的情况。
功能列表
| 编号 | 优先级 | 功能 | 用户可观察结果 | 状态 |
|---|---|---|---|---|
| FNOS-016-01 | P0 | 市场索引可用 | 在 DSH「发现」页添加本项目的索引 URL 后,能看到六个插件条目、分类与描述,可进入详情并安装 | 已验(DSH Web 与 DSH Desktop) |
| FNOS-016-02 | P0 | 插件图标 | 有官方品牌素材的插件在发现页显示其官方图标;无素材的显示占位图,且不出现自制或来源不明的图 | 已验(2 官方图标 + 4 省略) |
| FNOS-016-03 | P1 | 插件关键词 | 用「搜索」「登录」「浏览器自动化」等意图词在发现页搜索,能命中对应插件 | 已验(线上产物含 keywords) |
| FNOS-016-04 | P1 | 索引与发布同步 | 索引中的最高版本等于 npm 上该插件 next 标签指向的版本;发布新版本后索引不落后 | 已验(守卫用例锁定) |
| FNOS-016-05 | P1 | 索引格式与托管合规 | 索引通过格式校验;图标与索引同源或为 https;文件托管在文档站可公开访问的地址 | 已验(格式与托管) |
| FNOS-016-06 | P2 | 索引生成可复现 | 任何人按文档步骤可从源列表重新生成同一份索引,输出确定、可直接对比差异 | 已验(重复生成差异为空) |
| FNOS-016-07 | P1 | 发现页可读标题 | 发现页条目标题显示插件名称(如「Codex 身份验证」)而不是 npm 包名,描述为面向用途的说明 | 已验(中文标题与描述) |
验收环境范围
- FNOS-016-01、FNOS-016-02、FNOS-016-03 在 DSH Web 与 DSH Desktop 的「发现」页验收(需要先启用实验性自定义插件市场组合包)。
- FNOS-016-04 在本地构建环境验收索引与 npm 版本的一致性;涉及真实安装的部分在 DSH Web 验收。
- FNOS-016-05、FNOS-016-06 在文档站构建环境与本地命令行验收。
- 本需求不涉及 fnOS 宿主专属能力,不要求真实 fnOS NAS 验收。
行为约束
- 图标只使用插件所集成服务商的官方品牌素材,或本仓库自有且可商用分发的素材;不确定来源或授权的一律不用。
- 取不到可信素材时必须省略
icon,不得自制近似图标冒用品牌,也不得引用第三方站点上无法确认归属的图片。 - 关键词必须描述插件的实际能力,不使用与本插件无关的热门词堆砌。
- 索引由上游官方生成器产出,不手写维护版本号、发布时间与兼容范围,避免与 npm 实际状态脱节。
- 插件元数据变更不改变插件运行时行为;
files白名单新增图标文件后,安装体积变化需在文档中说明。 - 索引是静态快照,不承诺实时跟随 npm;同步责任写在发布流程中,并在变更时更新。
- 索引中列出的版本必须能被当前 DSH 基线安装;不列出会被兼容门禁拒绝的版本组合。
不在本次范围内
- 自建插件市场服务器或动态查询接口(格式明确支持静态文件,无此需求)。
- 修改 DSH 上游的索引格式、校验器或发现页。
- 为插件制作营销素材、截图或视频。
- 替三个缺乏素材的服务商(OpenAI、Semi Design、Tavily)设计或伪造品牌图标。
- 把索引做成官方市场,或申请进入第三方收录列表。
- 变更插件的功能、依赖或运行时行为。
既有功能变更关系
本次不改变任何既有功能的行为,只补充插件元数据并新增一份索引文件。它延续 FNOS-014 建立的发布基线:索引中列出的版本取自该轮已发布的 0.2.1-rc.2.0 及其后续补丁版本。
与已完成的 FNOS-014-13(上游新增能力支持结论)的关系是:该结论把「插件市场 Discover 页」判为 ➖ 不适用(本仓库不分发市场内容)。本次按用户明确要求反向接入——本仓库成为索引发布方,但不承担插件市场本身的实现。原结论在其验证环境内继续有效,本次在其上新增能力,不回改原文。
mermaid
stateDiagram-v2
[*] --> NoIndex: 原状态(FNOS-014-13 判定市场不适用)
NoIndex --> HasIndex: 变更点:发布市场索引(FNOS-016-01)
HasIndex --> Installable: 用户在发现页添加索引源
Installable --> [*]原状态下插件只能通过精确包名安装,用户在发现页看不到它们;新状态下用户添加索引 URL 即可浏览与安装。用户可观察结果:从「知道包名才能装」变为「在发现页找到就能装」。
验收条件与完成状态
FNOS-016-01
FNOS-016-01-AC-01:把索引 URL 添加为索引源后,「发现」页列出六个插件,条目的标题、描述、分类与版本数量符合索引内容。FNOS-016-01-AC-02:从条目可以进入详情页,并按其给出的版本完成安装;安装后的插件在插件页正常加载。FNOS-016-01-AC-03:索引在 DSH Web 与 DSH Desktop 上均可读取。
FNOS-016-02
FNOS-016-02-AC-01:有官方素材的插件在发现页显示其官方图标,与品牌官方素材一致。FNOS-016-02-AC-02:无素材的插件显示占位图,且插件包内不存在自制或来源不明的图标文件。FNOS-016-02-AC-03:图标文件在包内可解析,格式与体积符合格式要求。
FNOS-016-03
FNOS-016-03-AC-01:用插件用途的意图词搜索,能命中对应插件(例如搜索相关词命中 Failover Search)。FNOS-016-03-AC-02:关键词与实际能力一致,不在无关插件上出现该关键词。
FNOS-016-04
FNOS-016-04-AC-01:索引中每个插件的最高版本等于其 npmnext标签指向的版本。FNOS-016-04-AC-02:发布新版本后按流程重新生成索引,差异只包含新版本条目。
FNOS-016-05
FNOS-016-05-AC-01:索引通过上游格式校验器,无未定义字段依赖。FNOS-016-05-AC-02:索引与其引用的图标可通过公开 https 地址访问,无凭据、查询串或片段。
FNOS-016-07
FNOS-016-07-AC-01:发现页每个条目的标题是插件名称,而不是@tnnevol/...形式的包名。FNOS-016-07-AC-02:描述说明插件用途,中文环境下显示中文文案。
FNOS-016-06
FNOS-016-06-AC-01:文档记录了从源列表生成索引的命令与前置条件。FNOS-016-06-AC-02:同一源列表重复生成得到相同内容,差异为空。
变更记录
| 日期 | 变更 | 说明 |
|---|---|---|
| 2026-10-18 | 初始登记 | 建立 FNOS-016,范围覆盖六个插件的关键词与图标元数据补全、市场索引生成与托管、索引与发布同步。图标策略按用户要求确定:只用官方品牌素材,取不到就省略。上游格式、生成器行为与各供应商素材可获取性均已实测核实,登记为 11 条调研结论。关联 PLAN-FNOS-016。 |
| 2026-10-18 | 实现与 DSH Web 验收 | 六个插件补 keywords(各 5–7 个)与 locale 文案;fnOS、CodeBuddy 接入官方品牌图标,其余三个按「宁缺毋滥」省略。经两轮补丁发布(0.2.1-rc.2.1 元数据、0.2.1-rc.2.2 locale)后用官方生成器产出索引,托管至 docs/public/plugins/market/。新增维护文档与守卫用例(索引最高版本 = npm next)。DSH Web「发现」页实测通过:六条目中文标题、用途描述、版本与已安装状态正确,两个官方图标显示正常。Desktop 与线上 URL 待复核,需求状态转「待完成」。 |
| 2026-10-18 | 补 DSH Desktop 验收 | 在 fork-pj/deepseek-harness 开发态 Desktop(构建串 0.2.1-rc.2-687f282)上完成 FNOS-016-01-AC-03:启用「自定义插件市场」组合包后添加线上索引源,六条目与详情页渲染同 Web 一致;兼容性判定逐版本生效,仅 0.2.1-rc.2.x 可装、78 个历史版本标为不兼容。至此双客户端验收完成,需求状态收敛为「干净 profile 安装链路待复验」。测试收尾已关闭组合包并移除索引源,profile 回到测试前状态。 |
| 2026-10-19 | 验收通过,安装链路不再复验 | 经确认,TC-003「从条目进入详情并可安装」不在干净 profile 上复验,按现有证据判定通过:安装目标参数由 marketInstallTarget 的守用例校验正确,条目状态与详情页渲染均已验证;干净 profile 下的完整安装流程属于安装链路既有能力,不作为本需求验收前置。需求状态 planned → completed,19 条用例全部通过。 |
| 2026-10-18 | 新增 FNOS-016-07 | 实施中发现五个插件没有 locale/ 文件,索引标题因此回退为 npm 包名(只有 Failover Search 显示了可读标题)。补充中英 locale 的 meta.title/meta.description,并把 locale 加入 files 白名单与 ./locale/*.json 导出。 |