插件分发、Release 命名与更新策略
状态:产品规范(2026-09-06)
安装通道:官方插件社区 · GitHub(高级) · 本地 ZIP · 本地文件夹
实现跟踪:Serpent-u3nx(Release asset + 平台匹配)、Serpent-8r91(更新提示与自动更新)
官方目录:https://github.com/dolag233/Serpent-Plugin-Pool
1. 安装通道(产品面)
| 通道 | 用户操作 | Serpent 行为 |
|---|---|---|
| 插件社区 | 设置 → 插件 → 打开插件社区,选官方/已认证插件安装 | Main 拉 GitHub raw catalog.v1.json,按条目钉死的 Release ZIP + sha256 安装;禁止 zipball |
| 本地文件夹 | 高级安装:选择已构建的插件目录 | 校验清单与 runtime.entry 后拷贝进安装根 |
| 本地 ZIP | 高级安装:选择符合规范的 .zip | 解压后同上校验 |
| GitHub | 高级安装:粘贴 https://github.com/owner/repo 或 Release 页 URL | 优先取匹配当前平台的 Release asset ZIP;没有规范 asset 时才回退源码 zipball(仅此高级通道) |
Serpent 不预装任何插件。社区目录失败时使用上次缓存,并标明「未更新」。
认证 ≠ 信任:无限制插件仍走 ADR-0026 确认。社区安装钉死 releaseTag / fileName / sha256,不跟随 GitHub 最新 Release 自动更新。
三条成品包装入后的包形态必须相同:成品包(见 §3),不是未构建源码树。
本地「源码目录 + 现场 npm」不做:用户路径仅为成品包通道。
1.1 设置页安装流程
设置 → 插件:
- 打开插件社区:滑入整页目录(搜索、官方 badge、安装范围、返回)。点卡片进入详情:作者、版本、仓库、运行模式、平台和简 介在前,README 在后。
- 高级安装:本地文件夹/ZIP,或粘贴 GitHub URL(可 zipball 回退)。
用户侧步骤与截图见 插件使用。

社区通道下载失败、哈希不符、没有当前平台包或插件包校验失败时,保留可读失败原因;不会把本机绝对路径显示给 Renderer。
自动更新是「设置 → 插件」总览区的设备级开关,只作用于非社区钉死的 GitHub 插件。社区插件的新版本必须先改目录仓条目并合并。
1.2 安装目录与版本替换
每个安装范围内,一个插件 ID 只有一个活动目录:
userData/plugins/<pluginId>/
{library}/.serpent/plugins/<pluginId>/
当前版本、来源和包哈希只记录在插件清单与对应 lock 文件中,不再使用
<pluginId>/<version>/ 作为活动包路径。安装新版本时先完成 staging 与完整校验,再原子替换该插件 ID 的活动目录和 lock;失败时保留旧目录。
这意味着同一安装范围不保留多个可切换的本地版本,插件管理器的本地
rollback 在覆盖安装后会明确返回“没有上一份已安装包”。需要回退时,重新安装旧版本 ZIP/目录即可;如果当前设备的 Resolution 仍指向旧包哈希,Host 会要求用户显式选择新包,不会静默启用替换包。
2. 平台标识(判定与命名共用)
与 Electron / Node process.platform + process.arch 对齐(清单 nativeModules 已用同一套):
| 规范 token | 含义 | Node 对应 |
|---|---|---|
darwin-arm64 | macOS Apple Silicon | darwin + arm64 |
darwin-x64 | macOS Intel | darwin + x64 |
win32-x64 | Windows 64 位(常见) | win32 + x64 |
win32-arm64 | Windows on ARM | win32 + arm64 |
win32-ia32 | Windows 32 位(可选维护) | win32 + ia32 |
linux-x64 | Linux x86_64 | linux + x64 |
linux-arm64 | Linux aarch64 | linux + arm64 |
any | 无原生二进制、全平台同一 ZIP | — |
口语文案映射(UI 可用,文件名必须用规范 token):
| 口语文案 | 规范 token |
|---|---|
| Mac Apple Silicon / M 系列 | darwin-arm64 |
| Mac Intel | darwin-x64 |
| Windows x64 | win32-x64 |
| Windows ARM | win32-arm64 |
| Windows x86(32 位) | win32-ia32 |
安装与更新时:先匹配 platform-arch 精确 asset;若无则尝试 any;再无则失败并提示缺少本平台包(不得静默下载错误架构)。
无限制插件若声明 runtime.nativeModules,还须与当前 nodeAbi 兼容(既有兼容性校验保留)。
3. 成品包内容(ZIP 内 / 文件夹内)
根目录(或 ZIP 解压后唯一顶层目录)须含:
serpent-plugin.json
README.md
README.zh-CN.md # 可选;社区详情中文优先
README.en.md # 可选;社区详情英文优先
LICENSE
<entry 指向的已编译 JS> # 如 entry/main.js 或 dist/main.js
[可选 ui/ 等清单声明文件]
[可选:已捆绑的 node_modules 或原生 .node,按平台 ZIP 分流]
禁止依赖用户机器现场执行 npm install / npm run build 才能通过校验。
社区详情页按应用语言,从钉死的 Release tag 拉取 README(走 raw.githubusercontent.com,禁止 zipball):
- 中文:
README.zh-CN.md→README.zh.md→README.md - 英文:
README.en.md→README.md
图片不会嵌进 Serpent 窗口;相对路径会变成可在浏览器打开的 GitHub 链接。目录可选 author;缺省时详情作者显示 GitHub owner。
3.1 ZIP 条目路径
Host 用 adm-zip 读取 ZIP,不在 Windows 上提供 zip 命令。条目名必须是相对 POSIX 路径:
- 使用
/分隔目录,例如entry/main.js。 - 不要使用
\、盘符、前导/、..。 - 不要把当前目录写成路径段:
./serpent-plugin.json会被旧版 Host 拒绝(PLUGIN_ARCHIVE_INVALID:absolute or traversing path)。当前 Host 会去掉./并把\换成/,但发布包仍应写出不含这些前缀的路径。 - 允许 ZIP 内有且仅有一层包裹目录(
my-plugin/serpent-plugin.json);解压后会剥掉该前缀。 - 禁止符号链接。
Windows 上 tar -a -c -f out.zip -C dist . 会稳定写出 ./ 前缀;Compress-Archive 可能写出反斜杠。不要依赖这两条命令直接作为 Release 产物。打包方式见 最佳实践 §8。参考实现:纯 JS/通用包参考 Serpent-Plugin-MediaConverter 或 Serpent-Plugin-Renamer;平台原生二进制分流包参考 Serpent-Plugin-ImageUpscaler。
4. GitHub Release 结构与 asset 命名
4.1 Release
- 使用 GitHub Release(建议 tag = 清单
version,如1.2.0或v1.2.0,安装器应 接受可选v前缀)。 - 每个需要原生/平台分流的版本,为每个支持的平台上传一个 ZIP asset。
- 纯 JS、无原生依赖:可只上传一个
…-any.zip。
4.2 Asset 文件名(强制)
{pluginId}-{version}-{platformToken}.zip
规则:
pluginId:与清单id完全一致(小写、点分,如com.example.image-upscaler)version:SemVer,不含前导v(如1.2.0);Release tag 可为v1.2.0platformToken:§2 规范 token(darwin-arm64、win32-x64、any等)- 仅允许字符:
[a-z0-9._-];整名大小写敏感,发布时用小写
示例:
com.example.image-upscaler-1.2.0-darwin-arm64.zip
com.example.image-upscaler-1.2.0-darwin-x64.zip
com.example.image-upscaler-1.2.0-win32-x64.zip
com.example.image-upscaler-1.2.0-win32-arm64.zip
com.example.palette-tools-2.0.1-any.zip
推荐另附 SHA256SUMS(或每个 zip 旁 .sha256);实现阶段可先做文件名匹配,哈希校验作为增强。
4.3 仓库 URL 解析优先级
用户粘贴 GitHub 相关 URL 时,建议顺序:
- Release / tag 页 → 解析 owner/repo + tag → 列 assets → 选平台 ZIP
- 仓库根 URL → 取 最新稳定 Release(非 draft/prerelease,除非用户显式选预发布)→ 同上
- 兼容回退(过渡期):若 Release 无规范 asset,但 tag/默认分支 zipball 内已有成品包,可继续旧行为并提示作者迁移到 Release asset(过渡结束后可移除)
不默认执行:对源码归档跑 package manager。
5. 成为官方插件与官方认证插件
Serpent 内置的“插件社区”面向所有用户提供可发现、可一键安装的扩展中心。目录真相源托管在官方 GitHub 仓库 Serpent-Plugin-Pool。
5.1 插件分类与认证层级
- 官方插件(Official Plugins):由 Serpent 核心团队直接开发、维护与发布的插件,在社区目录中标记有官方徽章。
- 官方认证插件(Verified Community Plugins):由第三方开源作者或社区团队开发,经过 Serpent 官方安全审查、包结构规范验证和功能可用性检验后,正式收录入官方目录的插件。
- 未认证插件 / 高级安装:由用户直接通过本地 ZIP、本地目录或粘贴任意 GitHub URL 安装的插件。Serpent 允许用户自由安装,但在安装时会显示未认证警告。
5.2 认证插件准入标准
希望将插件收录进官方插件社区的开发者,其插件必须满足以下准入要求:
- 完全开源:插件源码必须公开发布于 GitHub 仓库,并使用宽松的开源许可证(如 MIT、Apache-2.0、BSD-3-Clause 等)。
- 制品不可变性与规范命 名:必须使用 GitHub Release 分发成品包,Asset 文件名必须严格遵循
{pluginId}-{version}-{platformToken}.zip规范(见 §4.2),且包内包含编译后的成品代码(严禁要求用户环境执行npm install或动态构建)。 - 最小权限原则:Manifest(
serpent-plugin.json)中仅声明插件实现功能所必须的权限,不得申请无关权限。 - 透明披露与沙箱安全:
- 优先推荐
restricted受限模式; - 若使用
unrestricted非受限模式,必须在 Manifest 及 README 中如实声明所有本地进程调用、网络请求目的、数据存储位置及原生模块依赖,严禁静默执行未经用户许可的外部行为; - 严禁包含任何恶意挖矿、私自收集并上传用户资产或元数据等侵犯隐私的代码。
- 优先推荐
- 多语言文档与展示:必须提供清晰的说明文档,推荐提供
README.md(英文)与README.zh-CN.md(中文优先);说明中应包含功能简介、配置参数说明及快捷操作。
5.3 申请收录流程(向 Serpent-Plugin-Pool 提交 PR)
收录为官方认证插件采用 GitHub Pull Request 的标准流程:
- 发布 Release:在你的插件 GitHub 仓库创建新 Release(例如
v1.0.0),上传所有支持平台的规范 ZIP 包。