Plugin Authoring — Multi-Runtime
This marketplace ships the same plugin directory across four runtimes. You author once in Claude Code format (the source of truth) and generate the rest. Never hand-write the Codex, Antigravity, or Cursor manifests.
.claude-plugin/plugin.json ← author here, source of truth
│ bun scripts/cli.ts multi-format
▼
.codex-plugin/plugin.json + .mcp.json ← generated
plugin.json (root) + mcp_config.json + hooks.json ← generated (Antigravity)
.cursor-plugin/plugin.json ← generated
.agents/plugins/marketplace.json ← generated (Codex marketplace)
.cursor-plugin/marketplace.json ← generated (Cursor marketplace)
Workflow
- Scaffold / edit the plugin in Claude Code format. Components go at the plugin root, never
inside
.claude-plugin/:
Author the manifest fromplugins/<name>/ ├── .claude-plugin/plugin.json # manifest only (source of truth) ├── commands/ agents/ skills/ # at root, auto-discovered └── hooks/hooks.json # at rootreferences/plugin-json-spec.md— start with valid defaults, no[TODO: ...]placeholders. Prefer skills over SessionStart hooks (they load only when relevant). Full quality checklist:references/best-practices.md. - Register in
.claude-plugin/marketplace.json(source: "./plugins/<name>"). Claude-only fields likerelevancelive only here. For a new plugin, wire the companion files (release-please, README) too — seereferences/multi-runtime-manifests.md. - Generate the other runtimes:
The generator is bundled in this plugin (bun scripts/cli.ts multi-formatscripts/run.ts+scripts/multi-format.ts). Details, the per-runtime mapping table, and the$schemaeach manifest carries:references/multi-runtime-manifests.md. - Scope the diff — the generator rewrites all local plugins;
git restoreany unrelated churn so the commit stays atomic. - Validate —
claude plugin validate plugins/<name>; deeper audit via thevalidating-pluginsskill.
Manifest location
Every local plugin's Claude source is .claude-plugin/plugin.json; the root plugin.json is the
generated Antigravity manifest. Edit the .claude-plugin/ file — never the root one — then
re-run multi-format.
References (load on demand)
references/plugin-json-spec.md— manifest + marketplace field guide with canonical samples.references/multi-runtime-manifests.md— per-runtime mapping, the generator, diff scoping.references/best-practices.md— quality checklist, pitfalls, testing.
Related
validating-plugins— audit a plugin's manifest and structure before release.migrating-gemini-extensions— port a Gemini CLI extension to Claude Code.- Cross-runtime creation skills:
claude-code-plugin-builder(Claude Code component deep-dive),plugin-creator(Codex-native),create-plugin-scaffold(Cursor-native).
What NOT to do
- ❌ Hand-edit
.codex-plugin/,.cursor-plugin/, the generated root Antigravityplugin.json, or the Codex/Cursormarketplace.json— re-runmulti-format. - ❌ Put
relevance(or other Claude-only fields) in the Codex/Cursor marketplaces. - ❌ Nest
commands//agents//skills/inside.claude-plugin/— they won't load.