每个插件都有一份清单,位于 .ohmygame-plugin/plugin.json。把 $schema 指向 https://ohmygame.dev/schema/plugin-2.json,编辑器里就有自动补全和校验。

必填字段

字段 说明
id publisher/name。publisher 就是你的 npm scope,不带 @。
version 插件版本,和 package.json 保持一致。
engines { "ohmygame-api": "^2.3.0" }:插件适用的插件 API 版本。
displayName 软件里显示的名字。
description 一句话说明它做什么。

ohmygame-api 可以写确切版本,也可以写 ^x.y.z、~x.y.z 或 >=x.y.z。插件 API 每新增一项能力,次版本号就加一,所以用到新字段的插件需要申请对应的版本。软件版本太旧时会提示,桌面版还会提供更新。

可选字段

字段 说明
icon 包内一个 SVG 或 PNG 文件的路径。
categories 可选 engine、art、audio、publishing、provider、theme、workflow、integration。
longDescription 显示在插件详情页的介绍。
examples 最多五条 试一试 提示词。
beta 把插件标记为 Beta。
links homepage 和 sponsor 链接。
projectFiles 插件会留在项目里的文件或文件夹,最多 20 个,例如 ./.maker/。卸载时会列出来,但不会删除。
entrypoints.native 插件原生代码所在的文件。
capabilities 插件申请的权限,见下文。
configuration 显示在插件详情页的设置项。
ui major 是插件面板使用的页面组件主版本;preview 允许使用仍在预览中的组件。
contributes 插件添加的功能,见下文。

权限

字段 申请
native 运行 entrypoints.native
project.files 插件面板对项目文件的 "read"(读)或 "write"(写)权限
project.selection 查看选中的内容
composer 往输入框里填内容
secrets 读取机密设置
network 插件的 HTTP MCP 服务可以访问的地址列表
processes 插件的本地 MCP 服务可以启动的命令列表
game 像智能体试玩那样打开并操作项目里的游戏

插件能添加什么

所有功能都写在 contributes 里:

字段 添加
skills 一个技能文件夹,每个技能是一个带 SKILL.md 的子文件夹
tools 给智能体用的工具,由原生代码注册。每个工具有 name、description 和 input 参数结构
commands 软件里的命令,包含 id、title、run,以及显示位置 slots
panels 对话旁边的面板,包含 id、title、area 和一个 HTML 入口 entry
mcpServers 本地或 HTTP 的 MCP 服务,包含 id、title、command 和它提供的 tools
projectTypes 新的项目类型,包含模板文件夹 template 和预览方式 preview(web、web-build 或 native)
themes 设置 → 外观 里的配色主题
providers 设置 → 服务商 里的对话模型服务商
agents 编程智能体
hooks 响应事件的代码,例如一轮对话结束时
canvasNodes、canvasPresets 画布上新的节点和预设
previewDevices、previewFilters、inputMaps 游戏预览的扩展

命令

命令的 run 可以是下面任意一种:

run 作用
{ "prompt": "…" } 发送一条提示词;加上 "insert": true 则只填进输入框
{ "tool": "…" } 调用一个工具
{ "openPanel": "…" } 打开插件的某个面板
{ "openSettings": true } 打开插件详情页
{ "url": "…" } 打开一个链接
{ "native": "…" } 运行原生代码注册的命令

slots 决定命令出现在哪里,包括 project.menu、project.toolbar、project.publish、composer.add、composer.slash、home.starters、canvas.add、canvas.node 和 game.more。

原生代码

原生入口导出一个 activate(context)。它在每个项目单独的 Node 进程里运行,不在软件本身里运行,并且只能注册清单里声明过的工具和命令:

js
export function activate(context) {
  context.registerTool("hello", async (input, options) => {
    options.progress("Saying hello…");
    return { text: `Hello, ${input.name ?? "there"}` };
  });
}

context.project.folder 是当前项目,context.dataFolder 是插件自己的数据文件夹。

本地 MCP 服务

.ohmygame-plugin/plugin.json
"capabilities": { "processes": ["node"] },
"contributes": {
  "mcpServers": [
    { "id": "server", "title": "%mcp.title%", "command": "node", "args": ["./mcp/server.mjs"], "tools": ["echo"] }
  ]
}

用到的命令必须同时写进 capabilities.processes,这样在它运行之前你会先确认一次。