开放插件平台 · API v1.5

把你的工作流,
放进 Finder 右键菜单。

使用 JavaScript 或 TypeScript 构建独立插件。无需 Xcode 工程、Apple Developer 账号,也无需修改 RightMenu 源码。

01

开放,但不交出宿主权限。

RightMenu 插件是独立维护的 JavaScript 包。宿主负责验证、安装、授权和执行边界;插件只获得当前动作已声明且由用户授予的能力。

安全边界

插件没有环境权限,也不能加载原生代码。文件访问、修改、AI 披露和系统授权仍由宿主控制并单独确认。

独立生命周期

宿主与每个插件拥有独立仓库、版本和发布节奏。插件业务逻辑、文案、图标、资产及发布说明应留在插件仓库。

当前范围仅包括开放开发、本地导入和用户信任;不包含插件市场、社区索引或自动更新服务。

02

快速开始

安装 RightMenu 后,直接使用 App 内置的已签名命令行工具生成项目并运行 doctor。

内置 CLI 路径

/Applications/RightMenu.app/Contents/Helpers/rightmenu-pluginctl

生成一个可运行项目

init 不会覆盖已有目录。生成结果已经包含可运行插件、API v1.5 Schema 和匹配的 TypeScript 声明。

CLI="/Applications/RightMenu.app/Contents/Helpers/rightmenu-pluginctl"
"$CLI" init ./MyPlugin \
  --id dev.example.my-plugin \
  --name "My Plugin"
"$CLI" doctor ./MyPlugin
可选方式 交给 AI Agent 开发

复制下面的标准指令,粘贴到 Codex、Claude Code、Cursor 等 Agent。它会先读取生成项目中的本地规范,再以 doctor 通过作为完成条件。

请在当前目录开发一个 RightMenu Plugin API v1.5 插件。

插件需求:[在这里描述插件功能]

要求:
- 先阅读 README.md、schema/rightmenu-plugin-manifest-v1.5.schema.json 和 types/rightmenu-plugin-api-v1.5.d.ts。
- 只修改当前插件项目,不修改 RightMenu 宿主源码。
- 输出必须兼容 JavaScriptCore;打包全部 import,不使用 Node.js require 或原生代码。
- 为每个 action 和 uiContribution 声明 requiredCapabilities,并保持 permissions 最小化。
- 修改载荷文件后,更新 manifest.json 中 files 的 byteCount 与 SHA-256。
- 完成后运行 "/Applications/RightMenu.app/Contents/Helpers/rightmenu-pluginctl" doctor .。
- 只有 doctor 退出状态为 0 且输出 validation.ok 才算完成。
- 未经明确要求,不生成私钥、不签名、不打包。

03

生成后的包结构

插件包以 .rightmenuplugin 结尾。manifest.json 描述入口、动作、权限和所有载荷文件;发布时只提交打包后的普通 JavaScript。

MyPlugin/
├── README.md
├── plugin/
│   └── my-plugin.rightmenuplugin/
│       ├── manifest.json
│       └── main.js
├── schema/
│   └── rightmenu-plugin-manifest-v1.5.schema.json
└── types/
    └── rightmenu-plugin-api-v1.5.d.ts

04

Manifest 与 API v1.5

每个 Finder 动作和 UI contribution 都必须声明 requiredCapabilities;不需要能力时明确写空数组。每项能力必须出现在 permissions 中,未被动作使用的宽泛权限会被拒绝。

{
  "apiVersion": "1.5",
  "permissions": [{
    "capability": "selection.read",
    "reason": "Reads metadata for selected Finder items."
  }],
  "actions": [
    { "id": "about", "title": "About", "requiredCapabilities": [] },
    { "id": "inspect", "title": "Inspect", "requiredCapabilities": ["selection.read"] }
  ],
  "uiContributions": []
}
globalThis.rightMenuPlugin = Object.freeze({
  run(actionID, input) {
    if (actionID !== "inspect") return { handled: false };
    return RightMenu.call("selection.read", {});
  }
});

JSON Schema 提供编辑器提示;文件安全、摘要、跨数组关系、兼容性与签名仍以 rightmenu-pluginctl doctor 为准。

05

开发与 doctor 校验

修改 JavaScript 后,更新 manifest 中每个变更文件的 byteCount 与 SHA-256,再运行 doctor。它最多输出 32 条有界诊断,并在存在错误时以非零状态退出。

  1. 1

    编辑 JavaScriptCore 兼容的输出;打包所有 import,不要留下 Node.js require。

  2. 2

    同步更新 files 中的字节数与 SHA-256;不要把 manifest.json 自身列入 files。

  3. 3

    运行 doctor,直到 validation.ok,并处理 API、能力、签名或包结构诊断。

"$CLI" doctor ./MyPlugin
"$CLI" doctor ./MyPlugin/plugin/my-plugin.rightmenuplugin

06

本地导入与开发者模式

打开 RightMenu → 设置 → 插件。签名包使用“导入签名插件”;未签名目录必须显式启用开发者模式,再使用“导入未签名开发插件”。两类插件位于物理隔离的目录。

验证包 → 确认发布者 → 安装 → 审查插件访问 → 启用 → Finder 显示可运行动作

安装不等于授权。宿主在复制前后都会验证,最终移动成功后才完成安装;开发者模式关闭时,未签名插件不能运行。

07

动作级权限

API v1.5 按动作计算能力集合。缺少某项授权时,只隐藏依赖它的动作;其他已授权动作仍可用。用户随时可以撤销访问。

selection.read选择项信息 · 显式授权
vision.recognizeText本地文本识别 · 显式授权
files.rename.*文件重命名 · 显式授权,并保留修改确认
ai.generateStructured结构化 AI · 显式授权,并按插件/提供商确认披露
ui.flashScreen / desktopItems.toggleVisibility屏幕效果与桌面可见性 · 自动授予、可撤销
diagnostics.log诊断日志 · 显式授权

08

发布者签名与指纹

生产分发使用 Ed25519。首次导入未知自签名发布者时,用户必须核对完整 SHA-256 公钥指纹,再选择“信任并安装”。签名身份不会授予任何运行能力。

"$CLI" keygen ./publisher.private.json "Example Publisher"
"$CLI" sign \
  ./MyPlugin/plugin/my-plugin.rightmenuplugin \
  ./publisher.private.json
"$CLI" inspect-signature \
  ./MyPlugin/plugin/my-plugin.rightmenuplugin
"$CLI" pack \
  ./MyPlugin/plugin/my-plugin.rightmenuplugin \
  ./my-plugin.rightmenuplugin.zip

私钥文件必须保存在项目外,安全备份,绝不能提交或分发。私钥丢失后,现有安装无法接受同一发布者身份下的更新。

同一插件 ID 的更新必须使用与已安装版本完全相同的签名密钥;另一个已信任密钥也不能接管。当前版本不提供自动更新或密钥轮换。

09

常见诊断代码

自动化应读取稳定的 code 和进程退出状态,不要解析说明文字。

validation.okManifest、文件大小与摘要通过。
api.current / api.legacy当前 API 或兼容旧 API。
capability.unsupported宿主不支持已声明能力。
signature.missing未签名,仅能用于开发者模式。
signature.self-issued-valid自签名发布者身份和签名有效。
manifest.*Manifest 合约校验失败。
package.*包布局、完整性或限制校验失败。
invocation.*宿主或 Runner 生命周期结果。

10

兼容性与运行约束

新项目使用 API v1.5,并要求 RightMenu 0.1.41 或更高版本。v1.5 向后兼容 v1.0–v1.4;旧包仍采用插件级全量权限行为。目标代码必须兼容 JavaScriptCore,并限制循环、递归、内存与输出。

Finder 动作仅面向 1–20 个本地普通文件的受支持选择;宿主会在调用前重新扫描并校验动作及其精确授权集合。

11

固定版本参考文件

以下文件逐字复制自 RightMenu 0.1.41(提交 9a25a54)的 Documentation 目录。官网提供校验脚本,确保公开副本与宿主真源没有漂移。