Skip to main content
Browse the docs

The developer docs are currently available in Chinese only. The SDK, the CLI and every code sample work the same in any language.

Chapter 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 本身)。