manifest.json 是插件包根目录中的清单文件。它同时用于插件身份识别、商店展示、入口加载、权限声明、搜索触发和版本更新记录。
上传时,服务端会读取并校验清单;校验失败会一次性返回全部问题。字段名区分大小写,必须使用下面的驼峰写法,例如 clipboardRules,不能写成 clipboard_rules。
下面示例包含当前支持的全部可声明字段:
必须提供的字段为 code、name、version、description 和 author。entry、runtime、category 虽然包含在模板中,但服务端分别默认为 index.js、vue、开发工具;建议始终显式填写,避免清单含义不清。其余字段可以省略;省略时按各字段说明中的默认值处理。
| 字段 | 类型 | 必填 | 默认值 | 说明与限制 |
|---|---|---|---|---|
code |
string |
是 | — | 插件唯一编码。必须是 2–50 位、以小写字母开头的 snake_case,匹配 /^[a-z][a-z0-9_]{1,49}$/。发布后不可修改,且不能与其他插件重复。 |
name |
string |
是 | — | 插件显示名称,1–50 个字符。用于商店卡片、标题栏和搜索结果。 |
version |
string |
是 | — | 三段式版本号,如 1.0.0。已发布版本不可覆盖;代码、资源或清单发生变化时必须递增版本号。 |
description |
string |
是 | — | 插件简介,1–500 个字符。应说明主要用途,不要放 HTML 或脚本。 |
author |
string |
是 | — | 作者或组织名称,1–50 个字符。 |
entry |
string |
否 | index.js |
构建包内的入口文件相对路径,只允许 .js 或 .mjs,不能包含 .. 或绝对路径;该文件必须实际存在于上传包中。 |
runtime |
string |
否 | vue |
当前仅支持 "vue"。插件使用 Vue 3 组件运行,Vue 由宿主提供,不要重复打包。 |
category |
string |
否 | 开发工具 |
商店分类,只能是 开发工具、效率办公、媒体处理、系统工具 之一。 |
icon |
string |
否 | ◆ |
字符或 emoji 图标最多 8 个字符;也可以填写最多 300 个字符的 http(s) 图片地址,或包内图片的相对路径。详见下文。 |
keywords |
string[] |
否 | [] |
搜索关键词,最多 10 项,每项最多 30 个字符。建议包含中英文同义词。 |
tags |
string[] |
否 | [] |
商店详情页展示标签,最多 10 项,每项最多 30 个字符。 |
permissions |
string[] |
否 | [] |
插件需要的受控能力,必须使用权限白名单:clipboard:read、clipboard:write、network:fetch、file:dialog、file:read、file:read-content、file:write、lan:discover、lan:scan、screen:capture。详见权限与能力矩阵。 |
minApiLevel |
number |
否 | — | 宿主 API 级别下限,≥ 1 的整数。不声明表示不挑宿主。可以不写,让宿主按 requires 推导;写了就必须 ≥ requires 隐含的级别,否则上传会被打回。详见版本与兼容性。 |
requires |
string[] |
否 | [] |
硬依赖的宿主能力,最多 12 项,取值同 permissions 白名单。缺任一项时宿主拒绝打开插件并显示升级提示页。只有整个插件在旧客户端上毫无意义时才用——能用降级解决的优先写 optional。 |
optional |
string[] |
否 | [] |
可选的宿主能力,最多 12 项。缺失时插件照常加载,宿主提示「有几项功能在当前客户端不可用」。 |
features |
Feature[] |
否 | [] |
插件功能点及其主搜索触发方式,最多 12 项。字段见下文。 |
clipboardRules |
ClipboardRule[] |
否 | [] |
全局快捷键唤出时的剪贴板识别规则,最多 8 条。字段见下文。 |
config |
object |
否 | {} |
插件默认配置。最多 20 个键,值只能是 string、number 或 boolean;运行时通过 config prop 读取。 |
homepage |
string |
否 | — | 插件主页、文档或代码仓库地址,必须是 http:// 或 https://,最多 300 个字符。 |
screenshots |
string[] |
否 | [] |
商店详情页截图,最多 6 张,每项最多 500 个字符。支持包内相对图片路径、以 / 开头的站内路径或 http(s) 外链。 |
changelog |
ChangelogEntry[] |
否 | [] |
版本更新记录,最多 30 条,按新版本到旧版本排列。字段见下文。 |
entry 与构建目录entry 是上传产物中的路径,不是源码入口。标准 Vue + Vite 模板通常使用:
因此清单一般写 "entry": "index.js",上传或调试时选择包含 manifest.json 和 index.js 的 dist 目录。
icon 的三种写法字符或 emoji 图标:
包内图片的相对路径(推荐,图片随插件包一起上传,不必自己找图床):
http(s) 外链图片:
包内相对路径的写法与 screenshots 一致:
entry 同一套写法,子目录也可以写(如 assets/logo.svg)。.png、.jpg、.jpeg、.webp、.gif、.svg、.ico。object-fit: cover,非正方形会被裁切。/store-packages/<code>/<version>/... 形式的站内地址,客户端拿到的则是补全了域名的绝对地址。◆,不会显示为裂图。version 即可。外链图片必须能被客户端直接访问,否则商店卡片与启动器磁贴都会裂图——那是所有用户都要去加载的地址,请确保图床长期稳定。
字符图标不参与包内路径解析:它最多 8 个字符,也不带图片扩展名,因此不会与相对路径混淆。
features 功能点features 描述插件能做什么,并可声明主搜索框的触发指令。每个功能对象包含以下字段:
| 字段 | 类型 | 必填 | 限制 | 作用 |
|---|---|---|---|---|
name |
string |
是 | 1–30 个字符 | 功能名称,显示在商店详情和搜索结果中。 |
description |
string |
否 | 最多 100 个字符 | 功能说明。 |
code |
string |
否 | 1–30 位,字母开头,可含字母、数字、_、- |
功能编码。命中后通过 enterAction.code 传给插件;省略时使用 main。 |
cmds |
FeatureCmd[] |
否 | 最多 12 条 | 主搜索触发指令。可以混合字符串和对象指令。 |
features[].cmds 指令类型| 写法 | 字段 | 匹配行为 | 进入动作类型 |
|---|---|---|---|
| 字符串 | "json" |
搜索输入与关键词匹配 | text |
| 正则 | { "type": "regex", "match": "^#[0-9a-f]{6}$", "flags": "i" } |
搜索输入整体匹配正则;match 最多 300 个字符且必须可编译 |
regex |
| 长文本 | { "type": "over", "minLength": 20, "maxLength": 5000 } |
输入长度在区间内;两个边界都可省略,默认最小 1、最大 10000 | over |
| 图片 | { "type": "img" } |
搜索框出现剪贴板或粘贴图片候选 | img |
| 文件 | { "type": "file" } |
搜索框出现剪贴板文件候选 | file |
字符串指令最多 30 个字符。over 的 minLength、maxLength 会转为正整数;不填或不是正数时使用运行时默认边界。主入口直接打开插件时,enterAction.type 为 open。
插件通过 api.getEnterAction() 或 api.onPluginEnter() 读取进入动作。动作中的 payload 是命中的文本,图片指令时通常是图片 data URL。
clipboardRules 剪贴板规则当用户通过全局快捷键唤出客户端时,宿主会检查剪贴板内容。命中规则后,内容会被填入搜索框并显示插件入口。剪贴板里是文件时走单独的「快捷识别」链路,见下文剪贴板文件与快捷识别。每条规则包含:
| 字段 | 类型 | 必填 | 限制 | 作用 |
|---|---|---|---|---|
name |
string |
否 | 最多 30 个字符,默认 规则 |
规则名称。 |
pattern |
string |
否 | 最多 200 个字符 | 面向用户的匹配条件说明。 |
example |
string |
否 | 最多 200 个字符 | 商店详情中展示的示例。 |
action |
string |
否 | 最多 200 个字符 | 命中后执行的动作说明。 |
matchType |
string |
否 | json / regex / url / timestamp / color / image / file |
剪贴板匹配类型。 |
regex |
string |
条件必填 | matchType 为 regex 时必填,最多 300 个字符且必须可编译 |
自定义正则表达式。 |
regexFlags |
string |
否 | JavaScript 正则标志;未填写时使用 i |
自定义正则标志。 |
内置匹配类型如下:
matchType |
判断规则 |
|---|---|
json |
内容以 { 或 [ 开头,并且可以解析为 JSON 对象或数组。 |
regex |
使用 regex 和 regexFlags 匹配完整文本。 |
url |
完整的 http:// 或 https:// URL。 |
timestamp |
10 位或 13 位数字时间戳。 |
color |
#RGB、#RRGGBB、#RRGGBBAA,或 rgb(a) / hsl(a) 颜色值。 |
image |
data:image/… 图片 data URL。 |
file |
剪贴板里是文件或文件夹列表(绝对路径)。 |
正则应尽量短小、范围明确,避免灾难性回溯或匹配所有文本,防止抢占其他插件的剪贴板入口。
剪贴板里是文件时走的是另一条链路,不需要写正则:宿主直接读剪贴板里的文件路径列表,把声明了文件能力的插件列成启动器中的「快捷识别」结果。完整链路是:
enterAction = { code, type: 'file', payload, files } 被打开:type 为 'file',payload 是绝对路径用 \n 连接的结果,files 是同一批绝对路径的数组。让插件进入这个候选列表有两种声明方式,任选其一:
进入动作里有文件不等于拿到文件读写权限。要读取信息或改名,需在 permissions 中声明 file:read / file:write;要读取文件内容(api.file.read),还需额外声明 file:read-content。细节见文件与事件、类型与错误。
config 默认配置config 是静态默认值对象,不是任意 JSON 数据。键名由插件自行定义,最多 20 个;值只能是字符串、数字或布尔值,不能放数组、对象、null 或函数。
组件中通过 config prop 读取。用户在客户端修改后的配置会覆盖同名默认值;新增配置项或修改默认值后,应递增 version 并重新构建上传。
homepage 与 screenshotshomepage 会在商店详情中显示为主页链接。它只能是 http(s) 地址。
screenshots 支持三种地址:
/store-packages/<code>/<version>/... 形式的站内地址。.png、.jpg、.jpeg、.webp、.gif、.svg、.ico。changelog 更新记录每条记录包含以下字段:
| 字段 | 类型 | 必填 | 限制 | 作用 |
|---|---|---|---|---|
version |
string |
是 | 三段式版本号,如 1.2.0 |
对应本次更新的插件版本。 |
date |
string |
否 | 最多 30 个字符 | 更新日期或日期时间,仅用于展示,不强制固定格式。 |
notes |
string |
是 | 最多 500 个字符 | 面向用户的更新内容。 |
记录应按新版本到旧版本排列,并在每次发布新版本时新增一条:
manifest.json 的字段以下字段会出现在商店接口返回或客户端内部数据中,但不能写入插件清单来控制:
| 字段 | 来源 | 说明 |
|---|---|---|
rating、ratingCount |
服务端 | 用户评分及评分人数。 |
downloadCount、downloads |
服务端 | 数值下载量及格式化后的展示值。 |
updatedAt、publishedAt |
服务端 | 上传和首次发布时间。 |
builtin、official、featured |
平台 | 内置、官方和推荐标记,由平台维护。 |
entryUrl、publishedEntryUrl |
服务端 | 上传或发布后生成的远程入口地址。 |
status、publishedVersion、reviewNote |
服务端 | 草稿、送审、发布、驳回及审核信息。 |
tone、packageHint |
客户端/服务端展示 | 商店卡片主题和包来源提示,不属于上传包 manifest 的公开字段。 |
不要把这些字段当作插件配置写入 manifest.json;它们会被忽略、覆盖或由服务端拒绝。
manifest.json 位于构建后 dist 根目录。entry 指向 dist 内真实存在的 .js 或 .mjs 文件。code 没有复用其他插件,version 已递增。permissions 与实际调用的能力一致。features 和 clipboardRules 的正则可以编译,且匹配范围克制。screenshots 的包内路径真实存在,changelog 已补充本版本更新内容。dist 目录,不上传源码目录、node_modules 或旧的构建产物。相关页面:动态指令、权限与能力矩阵、构建插件包、到开发者后台上传插件。