Skip to content

manifest 清单详解

manifest.json 是插件的身份文件,位于 .qplugin 包根目录。它描述插件的元信息、权限、入口和扩展点。

完整结构

json
{
  "id": "top.qomicex.assistant",
  "name": "AI 助手",
  "version": "1.2.0",
  "minLauncherVersion": "0.1.0",
  "layers": ["l3"],
  "permissions": ["ui:toast", "config:read", "config:write", "network:cors_proxy"],
  "dependencies": [
    { "id": "top.qomicex.markdown", "version": ">=1.0.0" }
  ],
  "entry": {
    "frontend": "dist/index.html",
    "theme": "dist/theme.css"
  },
  "contributes": {
    "menuItems": [
      { "path": "/plugins/p/top.qomicex.assistant", "label": "AI 助手", "icon": "A", "action": "overlay" }
    ],
    "overlay": {
      "file": "dist/overlay.html",
      "title": "AI 助手",
      "width": 380,
      "height": 500,
      "minimizable": false,
      "resizable": true
    }
  }
}

字段总表

字段类型必填默认值说明
idstring插件唯一 ID,用作安装目录名 plugins/{id}/。一经发布不要更改
namestring插件显示名
versionstring插件版本(用于依赖匹配)。见 版本语法
minLauncherVersionstring""最低启动器版本。⚠️ 当前版本仅存储、未实际校验
layersstring[][]图层声明。值:l0/l1/l2/l3,可多个。详见 layers 图层定义
permissionsstring[][]权限声明。⚠️ 后端仅存储,由前端运行时校验(缺失则 API 调用报错)
dependenciesPluginDependency[][]前置插件依赖。见 插件依赖与互调用
entryobject{}入口声明
contributesobjectnull扩展点

entry 对象

字段类型说明
frontendstring插件页面入口(.qplugin 内相对路径)。声明了 frontend 的插件才会被激活并渲染到 /plugins/p/:id
themestring主题 CSS 文件路径,激活时注入 <style data-plugin-theme>
backendstring保留字段,当前未使用

重要

若省略 entry.frontend,插件不会被激活activatePlugin 只在 entry.frontend 存在时渲染并标记 active),因此无法注册方法或提供 UI。即使纯功能插件也建议提供一个空页面入口。

contributes 对象

字段类型说明
menuItemsPluginMenuItem[]侧边栏底部入口列表
overlayPluginOverlayConfig悬浮窗配置
downloadSourcesstring[]保留,当前未使用
commandsstring[]保留,当前未使用
settingsPagesstring[]保留,当前未使用
字段类型说明
pathstring入口目标路径(页面路由,如 /plugins/p/:id
labelstring入口显示文字
iconstring入口图标(首个字符或文本)
actionstring"page"(默认,跳转页面)或 "overlay"(打开悬浮窗,需配合 overlay 配置)

overlay 对象

字段类型默认值说明
filestring悬浮窗 HTML 文件路径(.qplugin 内相对路径)
titlestringmenuItem.label悬浮窗标题
widthnumber380宽度(px)
heightnumber500高度(px)
minimizablebooltrue是否显示最小化按钮
resizableboolfalse是否允许右下角拖拽缩放(最小 200×120)

layers 图层定义

layers复杂度分层,从纯声明到可执行逻辑,决定插件的能力与运行方式:

层级技术适用场景说明
L0 静态theme.json + CSS主题、颜色方案纯声明,无执行能力
L1 声明式配置文件声明新增下载源、新增镜像、API 端点纯声明,无执行能力
L2 脚本JS(前端沙箱内运行)UI 扩展、菜单注入、面板经 postMessage 网关权限检查
L3 WASMWASM(后端 Wasmtime 沙箱)Agent、协议解析器、复杂逻辑Host API 权限门控

声明方式: layers 是一个数组,可同时声明多个层级:

json
{ "layers": ["l2", "l3"] }

当前实现状态(重要):

  • L2 脚本层已实现:声明 l2 的插件走 iframe 沙箱<iframe sandbox="allow-scripts"> + postMessage 桥),与主界面隔离;不声明 l2 的插件走内联渲染(与主界面同上下文)
    • L2 沙箱内同样支持全部 __PLUGIN_API__ 方法、.p-* 组件样式、registerMethod/callPlugin(跨窗口中转)
    • 沙箱插件脚本随 srcdoc 解析自动执行,无需进入页面
  • 纯 L3 的插件不自动激活:若 layers 全部为 l3,插件处于 installed 状态时不会自动启用(需用户手动打开开关),而含 L2 等其它层级的插件会随启动自动激活
  • L2 沙箱与内联的差异
    维度L2 iframe 沙箱内联渲染
    隔离性与主界面完全隔离(独立 window)与主界面同 window
    脚本执行srcdoc 解析即执行激活加载时立即执行
    依赖注入registerMethod 通知主窗口中转直接调用主窗口注册表
    适用需要隔离、独立的插件轻量 UI、主题类
  • L0/L1 当前为声明性预留层级,暂无独立运行机制;L3 WASM 已实现:声明 l3 且包内含 plugin.wasm 的插件,由启动器 Rust 层(wasmtime)加载并执行(见 WASM 插件

建议

  • 需要隔离环境或常驻脚本的插件(如 AI 助手、工具面板)→ 声明 ["l2"],走沙箱
  • 纯 UI/主题类或依赖主界面 DOM 的轻量插件 → 不声明 l2,走内联
  • 若插件后续要接入 WASM 后端逻辑,可再叠加 "l3"

版本范围语法

dependencies[].version 支持以下写法:

写法含义示例
空 / 缺省任意版本
>=X≥ X>=1.0.0
<=X≤ X<=2.0.0
>X> X>1.0
<X< X<2.0
=X精确等于=1.2.0
X精确等于(裸版本)1.2.0
空格分隔多个约束同时满足">=1.0 <2.0"

比较规则:

  • . 分段、逐段数值比较;忽略 -(预发布)和 +(构建号)后缀
  • 缺段视为 0(如 1.0 等于 1.0.0
  • 不支持 ^~*、通配 x||、逗号

TIP

minLauncherVersion 字段当前未校验,但建议填写以兼容未来版本。若后续启动器启用校验,低于该版本的启动器将拒绝安装。