Skip to main content
浏览文档目录
第 2 章

插件包格式与 manifest

.uniplugin 里有什么、plugin.json 每个字段、校验规则与上限

.uniplugin 文件

一个 zip,里面只允许这些文件(除 locales/ 外没有子目录):

文件 必需 说明 上限
manifest.json ✓ 完整的 manifest(由 uniflow-plugin build 从 plugin.json + 代码生成) 64 KB
main.js 有命令时 命令实现,单文件(在沙箱 Worker 里运行,不能再加载别的脚本) 4 MB
panel.html 有面板时 面板,单文件(脚本、样式都内联) 6 MB
locales/en.json ✓ 英文文案 256 KB
locales/<lang>.json 其他语言,文件名 zh.json、ja.json、pt-BR.json 这种 256 KB
icon.svg / icon.png 图标(建议 24×24 线性图标,浅色深色背景都清楚) 256 KB
README.md、CHANGELOG.md 插件库「详情」「更新记录」页签 256 KB
LICENSE、LICENSE.md、LICENSE.txt 许可证 256 KB

整包:zip ≤ 10 MB,解压后合计 ≤ 12 MB,最多 24 个文件。任何其他文件、路径穿越(../、绝对路径、反斜杠)都会让整个包被拒绝。

同一套校验在三处运行,结论一致:你本机的 uniflow-plugin build / validate、应用主进程安装时、渲染进程加载时 (源码:src/format.ts)。本地通过的包,装进应用不会被拒。

plugin.json(你手写的)与 manifest.json(生成的)

你只写 plugin.json;命令的标题、说明、参数 schema 写在代码里(紧挨着实现),build 时抽进 manifest.json。 这样说明与 schema 只有一处,而审核时一眼能看到的「这个插件能做什么」(权限、命令清单)集中在 plugin.json。

JSONC
{
  "$schema": "./node_modules/@uniflow/plugin-sdk/schema/plugin.schema.json",
  "id": "duesoon",                 // 3–24 个小写字母;命令命名空间与存储隔离键,发布后不要改
  "version": "1.2.0",              // semver x.y.z;每次发布都要升
  "nameKey": "name",               // 可选,默认 name:插件名在文案里的 key(≤ 40 字)
  "descriptionKey": "description", // 可选,默认 description
  "author": { "name": "Ada", "email": "ada@example.com", "url": "https://example.com" },
  "homepage": "https://example.com/duesoon",  // 可选,https
  "minAppVersion": "1.3.0",        // 可选:低于这个版本的 UniFlow 拒绝安装
  "icon": "Clock",                 // 可选:没有 icon.svg/png 时用的 lucide 图标名
  "categories": ["planning"],      // 可选,≤ 4 个小写标签
  "permissions": ["context.read:assignments", "storage", "ui.panel"],
  "networkHosts": ["api.example.com"],        // 只有声明了 network:user-granted 才能写
  "commands": [
    { "action": "list_due", "kind": "read" },
    { "action": "snooze", "kind": "write", "agentVisible": false },
    { "action": "open", "kind": "navigate" }
  ],
  "background": { "action": "refresh", "everyMinutes": 360 },  // 可选
  "panel": { "entry": "panel.html" },         // 有面板时;必须同时声明 ui.panel
  "defaultEnabled": true                      // 只对官方插件生效
}

生成的 manifest.json 多了 manifestVersion: 1,每个命令多了 title、description、parameters, 有 undo() 的写命令多了 undoable: true。

规则一览(违反任何一条都会被拒绝)

id:^[a-z]{3,24}$;不能是核心领域或保留字: assignment calendar note course workspace plugin plugins uniflow unimind system core app agent admin settings user server skill skills。 官方插件的 id(flashcard exam ics)只能由官方包使用(按包的 sha256 认定)。

命令:

  • 最多 40 个;action ^[a-z]+(_[a-z]+)*$、≤ 48 字符、不重复;
  • kind ∈ read | write | navigate;只有 write 能 undoable;
  • 给 UniMind 的命令(agentVisible 不为 false)最多 10 个:所有插件和应用自己的命令共用有限的工具名额,只把真正需要模型调用的给它;
  • description ≤ 900 字符;参数 schema 序列化后 ≤ 3500 字符;
  • 每个命令的 title 在 locales/en.json 里必须有文案;写命令必须实现 describe;
  • plugin.json 声明的命令与代码里 definePlugin 的命令必须一一对应。

参数 schema(命令执行器支持的子集):只能用 type(object / string / number / integer / boolean / array)、 description、properties、required、additionalProperties、enum、items、minItems / maxItems、minLength / maxLength、 minimum / maximum、format(date / date-time)、pattern; 每一层 object 都必须 additionalProperties: false;嵌套 ≤ 6 层;每个 object ≤ 30 个属性;数组必须写 items。

权限:只能用 权限 里列出的 12 项;calendar.write 需要 calendar.read,context.read:grades 需要 context.read:assignments;有面板 ⇔ 有 ui.panel。

background:必须指向声明过的 write 命令;间隔 30–10080 分钟的整数。

networkHosts:1–20 个小写主机名,支持 *.example.com(只匹配子域,不匹配 example.com 本身)。