.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。
{
"$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 本身)。