Skip to content

[Feature] 扩展插件市场发现来源:可配置多目录源 + GitHub topic 实时发现 + 可信度分层 #46

Description

@yukitakasama

背景

当前 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 社区源相同,靠实时拉取 + 功能取胜

根因

  1. 源硬编码,且主源 dsh-plug.in 几乎为空(7 条),实际只靠 awesome 单源;
  2. 未接入任何实时/自建采集通道 → 新插件、未打 topic 的「沉默插件」、monorepo 子包大面积漏收;
  3. 粒度问题: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.jsonTTL 24h + 断点分页 + 磁盘 last-good 兜底;条目标记 Unverified,安装前二次确认(对齐 dsh-market 的安全立场)。

可信度分层

  • Confidence = Official | Curated | Aggregated | Unverified;同 id 去重取最高层,union stars/sources/category

需同步修复的既有缺陷

  • alpha_commitsrc-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,可选)。

验收标准

  • 市场可切换 ≥3 个目录源(dsh-plug.in / awesome / dshget),用户可增删自定义源
  • 开启实时通道后能发现不在任何静态目录中的 topic:dsh-plugin 插件,并正确过滤噪声
  • 某源不可达/离线时降级为 last-good 缓存,不阻塞其余源
  • 未验证来源有明确标识与安装确认;绝不误装 @deepseek-ai/* 核心包
  • 单测覆盖:适配器解析、降噪过滤、去重分层、TTL 缓存

风险 / 开放问题

  • GitHub search 限流(~30/min)与代理可达性(Launcher 全部 HTTP 走 proxy::apply
  • 代码搜索 API 需鉴权 token(故列为 Phase 3 可选)
  • 第三方目录的许可与归属:保留 sources 归属字段
  • plugin.dshx.dev 无公开 JSON API(Nuxt SSR),暂不接入

相关文件

src-tauri/src/plugins.rssrc-tauri/src/config.rssrc-tauri/src/lib.rs/commands.rssrc/api/types.tssrc/api/index.tssrc/views/plugins/Market.vuesrc/views/Settings.vuesrc/locales/{zh-CN,en-US}.json

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions