Skip to content

feat(plugins): 插件中心 - 提示新版本,精选插件自动更新,上架只写包名 - #409

Open
enderzcx wants to merge 1 commit into
feat/plugin-provider-modelsfrom
feat/plugin-update-notice
Open

enderzcx wants to merge 1 commit into
feat/plugin-provider-modelsfrom
feat/plugin-update-notice

Conversation

@enderzcx

@enderzcx enderzcx commented Nov 5, 2026 •

Copy link
Copy Markdown
Collaborator

接在 #408 后面(base 是 feat/plugin-provider-models)。

为什么

  • 从 npm 装的插件上,「更新」按钮一直显示,界面不比较版本,看不出有没有新版本。
  • 精选列表里我们自己维护的插件不会自动更新。
  • 上架精选列表要打 GitHub Release 包、配镜像、算 sha256,门槛太高。Magpie 和 DSH 都只要提 PR 加一行。

改了什么

新版本提示

  • 新增 GET /api/plugins/updates。它查从 npm 或精选列表装的插件,返回两份名单:有新版本的(updates),和确认已是最新的(upToDate)。
  • 精选列表里固定了版本的插件,按列表登记的版本比较;其它插件读 npm 上的最新版本。先查用户选的源,失败再查另一个。
  • 插件中心的按钮:
    • 有新版本:显示「更新到 vX」,用主按钮样式。
    • 确认已是最新:不显示按钮。
    • 没法比较版本(从 GitHub、网址安装,或这次没查到):照旧显示「更新」。
    • 从文件夹安装:仍是「重新加载」。
  • 版本只比较 x.y.z 三段数字,读不懂的版本号不提示更新。

精选插件自动更新

  • 精选列表 plugins 里带 tarball 和 sha256 的条目由我们维护。
  • 后端启动一分钟后检查一次,之后每 6 小时检查一次。有新登记的版本,就用原来的安装流程更新,同样校验 sha256。
  • 失败只记日志,下一轮再试;HTTP 服务关闭时停止。

上架只写包名

  • registry.json 新增 packages 数组,只写 npm 包名。卡片上的名称、说明、版本、作者和仓库都从 npm 读,结果缓存 10 分钟。
  • npm 上查不到的包不显示;和 plugins 里重复的包只显示一次。
  • 已发布的 BeefTV 不认识 packages,会直接忽略,不会显示缺信息的卡片。
  • 安装走 npm,和社区搜索里装的插件一样。

其它

  • pages/plugins/index.tsx 原来有 856 行,近两周改了 9 次。按 AGENTS.md 第 10 节,把插件设置表单拆到 plugin-fields-config-form.tsx,更新按钮单独成 plugin-update-button.tsx。拆完是 771 行。
  • npm 源的查询顺序原来在三处各写一遍,合成一个函数 npmRegistryOrder。
  • 插件开发文档「发布到 npm 与上架推荐列表」改成提 PR 加一行包名,并写明新版本提示和自动更新。

验证

  • 后端新测试,用本地服务冒充 npm:
    • 落后的 npm 插件进 updates;
    • 精选列表固定版本的插件进 updates,并标为 official;
    • 已是最新的进 upToDate;
    • 从文件夹装的、npm 上查不到的,两份名单都不进;
    • packages 里的包名会从 npm 补全成卡片,查不到的和空行会跳过,搜索词能过滤;
    • 版本号比较的边界情况。
  • 前端新测试:按钮四种状态(更新到 vX、隐藏、照旧「更新」、重新加载)。
  • 后端全量 go test ./...:68 个包里 67 个通过。internal/bootstrap 的 TestRuntimeOpenStartClose 偶尔在关闭时超时,原因是测试客户端留下一条还没发请求的空连接,Go 要等满 5 秒才把它当空闲连接关掉,而测试的关闭时限正好是 5 秒。没有本 PR 的提交也会出现,修法在 test(bootstrap): 运行时测试 - 关闭前清掉客户端空闲连接,修偶发超时 #411。
  • 前端 bun run test:3343 个通过;2 个失败是「公开发布导出」测试,它调用的脚本要用 rsync,这台机器没装(退出码 127),和本 PR 无关。脚本在这组失败后就退出了,单独运行的 123 个测试文件另外补跑,全部通过。
  • go vet、tsc --noEmit、bun run lint、bun run build 通过。

还没验证:

  • 自动更新的定时循环没有单独测试。哪些插件会被自动更新,已经在上面的测试里覆盖;循环本身只是按时调用它,再走原有的更新流程。
  • 没有在浏览器里实际看过按钮。
  • 没有对真实的 npm 源跑过。

合并前

  • 插件中心按钮有改动,需要交叉 review。
  • beeftv-plugins 仓库的 registry.json 要加上 packages 数组,才能用一行上架。这是对外改动,等确认后再提 PR。

🤖 Generated with Claude Code

- 新增 GET /api/plugins/updates:从 npm 或精选列表装的插件,返回有新版本的
  和确认已是最新的两份名单。插件中心有新版本时显示「更新到 vX」,已是最新时
  不显示按钮;从 GitHub、网址装的或查询失败的照旧显示「更新」,文件夹装的仍是
  「重新加载」。
- 精选列表里带 tarball 和 sha256 的插件,启动一分钟后和之后每 6 小时检查一次,
  有新登记的版本就自动更新;失败只记日志,下一轮再试。
- 精选列表新增 packages 数组,只写 npm 包名,名称、说明、版本从 npm 读;
  旧版 BeefTV 不认这个键,会直接忽略。
- 插件页的设置表单拆到单独文件(页面原有 856 行,近两周改了 9 次)。
- 插件开发文档「发布与上架」改成提 PR 加一行包名。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant