背景
当前 Launcher 的插件市场只消费两个硬编码静态目录(src-tauri/src/plugins.rs:11-15):
| 源 |
数量 |
性质 |
https://dsh-plug.in/api/plugins.json(主源) |
7 |
官方精选 |
https://awesome-dsh-plugin.com/plugins.json(社区源) |
3561 |
PR 门禁 + CI 校验(要求 dsh.bundle、仓库满 1 天、带 dsh-plugin topic) |
| 合计(市场实际可见) |
≈3568 |
|
而生态侧的发现面明显更广:
| 发现面 |
规模 |
说明 |
GitHub topic:dsh-plugin |
≈14,783 个公开仓库 |
生态主动脉;噪声大(无关大仓也会挂 topic) |
plugin.dshx.dev |
5,178(子包粒度) |
全量自动采集,无公开 JSON API |
dshget-data/catalog.json |
2,460 |
聚合去重 4 个公开源,带 sources 归属 |
dsh-market(内置市场) |
同 awesome 源 |
数据源与 Launcher 社区源相同,靠实时拉取 + 功能取胜 |
根因:
- 源硬编码,且主源
dsh-plug.in 几乎为空(7 条),实际只靠 awesome 单源;
- 未接入任何实时/自建采集通道 → 新插件、未打 topic 的「沉默插件」、monorepo 子包大面积漏收;
- 粒度问题:
awesome 按仓库收录,dshx 按子包,monorepo 子插件被合并丢失。
方案(A 多源 adapter + D 源可配置 + C 实时 topic)
A. 多目录源 adapter 化
- 用源描述符表替换
MARKET_URL / AWESOME_URL 两个常量,fetch_catalog(src) 按 kind 分派到各适配器。
- 首批适配器:
PrimaryDshPlugins(现有)、Awesome(现有)、DshGet(新增:解析 catalog.json,install 行复用现成 parse_awesome_install)、GithubTopic(见 C)。
D. 源可配置化
- 新增
plugin_sources: Vec<PluginSourceConfig{id,url,kind,enabled,confidence,order}> 纳入 launcher settings,带默认值并持久化。
- 新增命令
list_plugin_sources;前端源过滤从写死的两项(src/views/plugins/Market.vue:109-113)改为动态渲染;Settings 支持增删/排序/自定义 URL(含镜像,环境变量 DSHLAUNCHER_PLUGIN_SOURCES 可覆盖),对齐 dsh-market 的 DSHM_REGISTRY_URL 思路。
C. GitHub topic 实时发现通道
GET /search/repositories?q=topic:dsh-plugin&sort=updated&per_page=100&page=N,复用 github_api_url 的 client_id 提额;注意 search 子限流(~30/min),做页级预算与退避。
- 降噪过滤(14.8k → 可用):repo 带 topic 且(
package.json 声明 dsh.bundle / 存在 cordis.patch.yml / 名匹配 dsh-*),排除 DSH 核心仓与已知无关大仓(可维护 denylist)。
- 结果落
data_dir/plugin-cache/github-topic.json,TTL 24h + 断点分页 + 磁盘 last-good 兜底;条目标记 Unverified,安装前二次确认(对齐 dsh-market 的安全立场)。
可信度分层
Confidence = Official | Curated | Aggregated | Unverified;同 id 去重取最高层,union stars/sources/category。
需同步修复的既有缺陷
alpha_commit(src-tauri/src/plugins.rs:709)依赖回查静态市场定位 repo,实时条目会查不到;版本解析需接受条目携带的 repo 提示。
分期
- Phase 1(A+D):源注册表 + 配置 +
DshGet 适配 + 动态 UI → 立即 +2.4k,低风险。
- Phase 2(C):GitHub topic 通道 + 降噪 + 缓存 + 可信度 UI。
- Phase 3:npm 反链通道(
registry.npmjs.org/-/v1/search + 仓库双向校验);代码搜索 dsh.bundle(需用户自备 token,可选)。
验收标准
风险 / 开放问题
- GitHub search 限流(~30/min)与代理可达性(Launcher 全部 HTTP 走
proxy::apply)
- 代码搜索 API 需鉴权 token(故列为 Phase 3 可选)
- 第三方目录的许可与归属:保留
sources 归属字段
plugin.dshx.dev 无公开 JSON API(Nuxt SSR),暂不接入
相关文件
src-tauri/src/plugins.rs、src-tauri/src/config.rs、src-tauri/src/lib.rs/commands.rs、src/api/types.ts、src/api/index.ts、src/views/plugins/Market.vue、src/views/Settings.vue、src/locales/{zh-CN,en-US}.json
背景
当前 Launcher 的插件市场只消费两个硬编码静态目录(
src-tauri/src/plugins.rs:11-15):https://dsh-plug.in/api/plugins.json(主源)https://awesome-dsh-plugin.com/plugins.json(社区源)dsh.bundle、仓库满 1 天、带dsh-plugintopic)而生态侧的发现面明显更广:
topic:dsh-pluginplugin.dshx.devdshget-data/catalog.jsonsources归属dsh-market(内置市场)awesome源根因:
dsh-plug.in几乎为空(7 条),实际只靠awesome单源;awesome按仓库收录,dshx 按子包,monorepo 子插件被合并丢失。方案(A 多源 adapter + D 源可配置 + C 实时 topic)
A. 多目录源 adapter 化
MARKET_URL/AWESOME_URL两个常量,fetch_catalog(src)按kind分派到各适配器。PrimaryDshPlugins(现有)、Awesome(现有)、DshGet(新增:解析catalog.json,install 行复用现成parse_awesome_install)、GithubTopic(见 C)。D. 源可配置化
plugin_sources: Vec<PluginSourceConfig{id,url,kind,enabled,confidence,order}>纳入 launcher settings,带默认值并持久化。list_plugin_sources;前端源过滤从写死的两项(src/views/plugins/Market.vue:109-113)改为动态渲染;Settings支持增删/排序/自定义 URL(含镜像,环境变量DSHLAUNCHER_PLUGIN_SOURCES可覆盖),对齐 dsh-market 的DSHM_REGISTRY_URL思路。C. GitHub topic 实时发现通道
GET /search/repositories?q=topic:dsh-plugin&sort=updated&per_page=100&page=N,复用github_api_url的 client_id 提额;注意 search 子限流(~30/min),做页级预算与退避。package.json声明dsh.bundle/ 存在cordis.patch.yml/ 名匹配dsh-*),排除 DSH 核心仓与已知无关大仓(可维护 denylist)。data_dir/plugin-cache/github-topic.json,TTL 24h + 断点分页 + 磁盘 last-good 兜底;条目标记Unverified,安装前二次确认(对齐 dsh-market 的安全立场)。可信度分层
Confidence = Official | Curated | Aggregated | Unverified;同 id 去重取最高层,unionstars/sources/category。需同步修复的既有缺陷
alpha_commit(src-tauri/src/plugins.rs:709)依赖回查静态市场定位 repo,实时条目会查不到;版本解析需接受条目携带的repo提示。分期
DshGet适配 + 动态 UI → 立即 +2.4k,低风险。registry.npmjs.org/-/v1/search+ 仓库双向校验);代码搜索dsh.bundle(需用户自备 token,可选)。验收标准
topic:dsh-plugin插件,并正确过滤噪声@deepseek-ai/*核心包风险 / 开放问题
proxy::apply)sources归属字段plugin.dshx.dev无公开 JSON API(Nuxt SSR),暂不接入相关文件
src-tauri/src/plugins.rs、src-tauri/src/config.rs、src-tauri/src/lib.rs/commands.rs、src/api/types.ts、src/api/index.ts、src/views/plugins/Market.vue、src/views/Settings.vue、src/locales/{zh-CN,en-US}.json