feat: add Cursor runtime support (multi-format manifests + scaffold skill)#240
Conversation
…d create-plugin-scaffold - Rename .claude/skills/plugin-builder/ to .claude/skills/claude-code-plugin-builder/ to disambiguate from the Codex plugin-creator and Cursor create-plugin-scaffold skills - Cross-reference both sibling skills added to SKILL.md description - Vendor create-plugin-scaffold skill from cursor/plugins via skills.sh (skills-lock.json) - Add .agents/skills/create-plugin-scaffold/ (vendor, read-only) and .claude/skills/create-plugin-scaffold symlink (mirrors plugin-creator precedent)
…rketplace - Extend scripts/multi-format.ts with toCursorManifest, toCursorSource, toCursorMarketplace functions (+ types); wire Cursor into generateForPlugin using schema grounded from cursor/plugins schemas - scripts/cli.ts now also writes .cursor-plugin/marketplace.json - Add 12 tests in scripts/multi-format.test.ts (72/72 pass) - Generate .cursor-plugin/marketplace.json (root) and plugins/<name>/.cursor-plugin/plugin.json for 70 local plugins - Docs: CLAUDE.md and .claude/rules/marketplace-sync.md add Cursor runtime - release-please-config.json: add .cursor-plugin/plugin.json extra-files to the 26 entries already tracking .codex-plugin/plugin.json
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
Up to standards ✅🟢 Issues
|
| Metric | Results |
|---|---|
| Complexity | 35 |
| Duplication | 6 |
NEW Get contextual insights on your PRs based on Codacy's metrics, along with PR and Jira context, without leaving GitHub. Enable AI reviewer
TIP This summary will be updated as you push new changes.
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Plus Run ID: 📒 Files selected for processing (12)
✅ Files skipped from review due to trivial changes (8)
🚧 Files skipped from review as they are similar to previous changes (2)
📝 WalkthroughWalkthroughAdds Cursor as a third runtime target for the multi-format manifest pipeline. The CLI now writes Cursor manifests and a Cursor marketplace catalog, release tracking points to ChangesCursor Runtime Manifest Generation
Estimated code review effort🎯 4 (Complex) | ⏱️ ~45 minutes Possibly related PRs
Poem
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Comment |
Greptile SummaryThis PR adds full Cursor runtime support by extending the multi-format manifest generator (
Confidence Score: 4/5Safe to merge with a follow-up to complete release-please tracking for the 36 missing plugins. The core generator logic and tests are solid. The one concrete gap is that 36 plugins now have release-please-config.json — the 36 plugins that track only .claude-plugin/plugin.json need .cursor-plugin/plugin.json added to their extra-files entries. Important Files Changed
Flowchart%%{init: {'theme': 'neutral'}}%%
flowchart TD
A[".claude-plugin/plugin.json\n(source of truth)"] --> B["generateForPlugin()"]
B --> C[".codex-plugin/plugin.json\n+ .mcp.json"]
B --> D["plugin.json\n+ mcp_config.json\n(Antigravity)"]
B --> E[".cursor-plugin/plugin.json\n(NEW)"]
F["Claude marketplace.json"] --> G["generateMultiFormat()"]
G --> H[".codex-plugin/marketplace.json"]
G --> I[".cursor-plugin/marketplace.json\n(NEW)"]
J["toCursorManifest()"] --> K["name, displayName, description,\nversion, author, category"]
J --> L["mcpServers: inline object OR\nstring path passed through"]
J --> M["skills/commands/agents/rules\nomitted — auto-discovered"]
%%{init: {'theme': 'base', 'themeVariables': {"darkMode": true, "background": "#0d1117", "primaryColor": "#21262d", "primaryTextColor": "#e6edf3", "primaryBorderColor": "#8b949e", "lineColor": "#8b949e", "textColor": "#e6edf3", "edgeLabelBackground": "#161b22", "actorBkg": "#21262d", "actorBorder": "#8b949e", "actorTextColor": "#e6edf3", "actorLineColor": "#8b949e", "signalColor": "#8b949e", "signalTextColor": "#e6edf3", "noteBkgColor": "#373320", "noteBorderColor": "#d4a72c", "noteTextColor": "#f0e6c0", "labelBoxBkgColor": "#21262d", "labelBoxBorderColor": "#8b949e", "labelTextColor": "#e6edf3", "loopTextColor": "#e6edf3", "activationBkgColor": "#30363d", "activationBorderColor": "#8b949e"}}}%%
flowchart TD
A[".claude-plugin/plugin.json\n(source of truth)"] --> B["generateForPlugin()"]
B --> C[".codex-plugin/plugin.json\n+ .mcp.json"]
B --> D["plugin.json\n+ mcp_config.json\n(Antigravity)"]
B --> E[".cursor-plugin/plugin.json\n(NEW)"]
F["Claude marketplace.json"] --> G["generateMultiFormat()"]
G --> H[".codex-plugin/marketplace.json"]
G --> I[".cursor-plugin/marketplace.json\n(NEW)"]
J["toCursorManifest()"] --> K["name, displayName, description,\nversion, author, category"]
J --> L["mcpServers: inline object OR\nstring path passed through"]
J --> M["skills/commands/agents/rules\nomitted — auto-discovered"]
Reviews (2): Last reviewed commit: "chore: apply review suggestions for plug..." | Re-trigger Greptile |
There was a problem hiding this comment.
Code Review
This pull request adds support for generating Cursor plugin manifests (.cursor-plugin/plugin.json) and a Cursor marketplace manifest (.cursor-plugin/marketplace.json) from the Claude Code source of truth. The multi-format script, release configuration, and documentation have been updated accordingly, and a new create-plugin-scaffold skill has been introduced. One medium-severity issue was identified in scripts/multi-format.ts regarding a missing defensive null check on claudeMarketplace.plugins which could cause a runtime TypeError if the field is undefined.
There was a problem hiding this comment.
Actionable comments posted: 11
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In @.agents/skills/create-plugin-scaffold/SKILL.md:
- Around line 41-44: Update the `plugin.json` guidance in the scaffold so it
matches the repo’s Cursor manifest contract used by `multi-format`: make
`displayName`, `description`, `version`, `author`, and `category` explicit
required fields alongside `name`, and keep `license` and `keywords` as
optional/recommended metadata. Adjust the `plugin.json` step in
`create-plugin-scaffold` to reflect the actual manifest shape expected by the
generator, and only mention explicit component paths when non-default discovery
is needed.
- Around line 64-70: Add an explicit validation step to the scaffold workflow
before the readiness/summary output: after generating the plugin scaffold and
final plugin.json, run claude plugin validate and include the validation results
in the report. Update the create-plugin-scaffold instructions in SKILL.md so the
required validation is part of the process, and make sure the final checklist
references the validation report alongside the existing output items.
- Around line 19-27: The output location in the create-plugin-scaffold guidance
is hardcoded to the local Cursor plugins directory, which breaks repo-based
scaffolds like multi-plugin marketplace. Update the default target-directory
logic in the create-plugin-scaffold instructions so it derives from the
repository style or current repo context instead of always using
~/.cursor/plugins/local/<plugin-name>/. Keep the existing override behavior for
explicit user-specified paths, and adjust the wording around the output location
section to match that behavior.
In @.cursor-plugin/marketplace.json:
- Around line 7-10: The marketplace metadata still uses stale Claude Code
branding; update the description in the metadata object so it clearly references
Cursor instead. Locate the change in the marketplace.json metadata block and
replace the current bundled-plugins text with Cursor-specific wording, keeping
the rest of the structure unchanged.
In `@plugins/markitdown/.cursor-plugin/plugin.json`:
- Line 3: The plugin display name uses incorrect brand casing, which will appear
as a typo in the UI. Update the displayName value in the plugin.json manifest
for the Markitdown plugin to use the canonical casing “MarkItDown” instead of
“Markitdown”. Keep the change localized to the manifest field that controls the
plugin’s visible name.
In `@plugins/mastra/.cursor-plugin/plugin.json`:
- Line 9: The plugin metadata is using an inconsistent category label, so update
the category field in the plugin manifest to use the standard AI label instead
of Ai. Make this change in the plugin JSON entry that defines the category so it
matches other AI-oriented plugins and sorts correctly in the Cursor UI.
In `@plugins/mcp-dev/.cursor-plugin/plugin.json`:
- Line 3: The display name in plugin.json is using inconsistent branding; update
the displayName field from the current Mcp Dev value to preserve the MCP acronym
as MCP Dev. Make this change in the plugin manifest entry so the UI shows the
corrected brand consistently.
In `@plugins/neo4j/.cursor-plugin/plugin.json`:
- Line 3: The plugin display name has a branding typo: update the `displayName`
field in the Neo4j plugin manifest to preserve the `MCP` acronym and show `MCP
Neo4j` instead of `Mcp Neo4j`. Keep the change localized to the manifest entry
so the UI label is corrected wherever this plugin name is rendered.
In `@plugins/vueuse/.cursor-plugin/plugin.json`:
- Line 3: The generated manifest currently uses the incorrect branding casing in
the plugin metadata. Update the displayName field in the plugin.json manifest
for the VueUse plugin so it preserves the canonical `VueUse` casing, and verify
any related manifest generation code that writes this value keeps the same
capitalization.
In `@plugins/web-design/.cursor-plugin/plugin.json`:
- Line 9: The plugin metadata in the `plugin.json` category field uses `Ui`
instead of the standard `UI` label, which creates inconsistent catalog naming.
Update the `category` value in `plugin.json` to `UI` so it matches the expected
normalization used by the Cursor catalog.
In `@release-please-config.json`:
- Around line 42-45: The release-managed package entries in
release-please-config.json only track .claude-plugin/plugin.json, so Cursor
manifests can drift from the published version after the next bump. Update each
affected package block in the config to include the corresponding
.cursor-plugin/plugin.json in extra-files alongside the existing Claude
manifest, matching the same version jsonpath used by the other tracked
artifacts. Use the repeated package definitions in this file as the place to add
the new Cursor manifest entries for all plugins covered by the PR.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro Plus
Run ID: f92ee320-6e5b-437a-a835-8931d8d0011f
📒 Files selected for processing (85)
.agents/skills/create-plugin-scaffold/SKILL.md.claude/rules/marketplace-sync.md.claude/skills/claude-code-plugin-builder/CHANGELOG.md.claude/skills/claude-code-plugin-builder/README.md.claude/skills/claude-code-plugin-builder/SKILL.md.claude/skills/claude-code-plugin-builder/examples.md.claude/skills/claude-code-plugin-builder/templates.md.claude/skills/create-plugin-scaffold.cursor-plugin/marketplace.jsonCLAUDE.mdplugins/agent-browser/.cursor-plugin/plugin.jsonplugins/ai-sdk/.cursor-plugin/plugin.jsonplugins/antfu/.cursor-plugin/plugin.jsonplugins/ast-grep/.cursor-plugin/plugin.jsonplugins/astro/.cursor-plugin/plugin.jsonplugins/axi/.cursor-plugin/plugin.jsonplugins/better-auth/.cursor-plugin/plugin.jsonplugins/bun/.cursor-plugin/plugin.jsonplugins/chat-sdk/.cursor-plugin/plugin.jsonplugins/claude-md-management/.cursor-plugin/plugin.jsonplugins/codegraph/.cursor-plugin/plugin.jsonplugins/cubic/.cursor-plugin/plugin.jsonplugins/dev3000/.cursor-plugin/plugin.jsonplugins/docus/.cursor-plugin/plugin.jsonplugins/edgeparse/.cursor-plugin/plugin.jsonplugins/emulate/.cursor-plugin/plugin.jsonplugins/eve/.cursor-plugin/plugin.jsonplugins/fetch/.cursor-plugin/plugin.jsonplugins/gatekeeper/.cursor-plugin/plugin.jsonplugins/git-ai/.cursor-plugin/plugin.jsonplugins/google-workspace/.cursor-plugin/plugin.jsonplugins/graphify/.cursor-plugin/plugin.jsonplugins/graphite/.cursor-plugin/plugin.jsonplugins/java-development/.cursor-plugin/plugin.jsonplugins/lavish/.cursor-plugin/plugin.jsonplugins/markitdown/.cursor-plugin/plugin.jsonplugins/mastra/.cursor-plugin/plugin.jsonplugins/mcp-dev/.cursor-plugin/plugin.jsonplugins/neo4j/.cursor-plugin/plugin.jsonplugins/next/.cursor-plugin/plugin.jsonplugins/nostics/.cursor-plugin/plugin.jsonplugins/nuxt-i18n/.cursor-plugin/plugin.jsonplugins/nuxt-seo/.cursor-plugin/plugin.jsonplugins/nuxt-ui/.cursor-plugin/plugin.jsonplugins/nuxt/.cursor-plugin/plugin.jsonplugins/pinia/.cursor-plugin/plugin.jsonplugins/playwright-cli/.cursor-plugin/plugin.jsonplugins/please-plugins/.cursor-plugin/plugin.jsonplugins/plugin-dev/.cursor-plugin/plugin.jsonplugins/pnpm/.cursor-plugin/plugin.jsonplugins/port/.cursor-plugin/plugin.jsonplugins/portless/.cursor-plugin/plugin.jsonplugins/portone/.cursor-plugin/plugin.jsonplugins/prisma/.cursor-plugin/plugin.jsonplugins/react-native/.cursor-plugin/plugin.jsonplugins/react/.cursor-plugin/plugin.jsonplugins/rtk/.cursor-plugin/plugin.jsonplugins/semble/.cursor-plugin/plugin.jsonplugins/skill-optimizer/.cursor-plugin/plugin.jsonplugins/skillopt-sleep/.cursor-plugin/plugin.jsonplugins/slack-agent/.cursor-plugin/plugin.jsonplugins/slidev/.cursor-plugin/plugin.jsonplugins/supabase/.cursor-plugin/plugin.jsonplugins/tiptap/.cursor-plugin/plugin.jsonplugins/tosspayments/.cursor-plugin/plugin.jsonplugins/tsdown/.cursor-plugin/plugin.jsonplugins/turborepo/.cursor-plugin/plugin.jsonplugins/unocss/.cursor-plugin/plugin.jsonplugins/vercel-sandbox/.cursor-plugin/plugin.jsonplugins/vinext/.cursor-plugin/plugin.jsonplugins/vite/.cursor-plugin/plugin.jsonplugins/vitepress/.cursor-plugin/plugin.jsonplugins/vitest/.cursor-plugin/plugin.jsonplugins/vue/.cursor-plugin/plugin.jsonplugins/vueuse/.cursor-plugin/plugin.jsonplugins/web-design/.cursor-plugin/plugin.jsonplugins/wordpress/.cursor-plugin/plugin.jsonplugins/workflow-sdk/.cursor-plugin/plugin.jsonplugins/worktree/.cursor-plugin/plugin.jsonplugins/zod/.cursor-plugin/plugin.jsonrelease-please-config.jsonscripts/cli.tsscripts/multi-format.test.tsscripts/multi-format.tsskills-lock.json
There was a problem hiding this comment.
4 issues found across 85 files
Confidence score: 3/5
- In
release-please-config.json, only some release-managed plugin blocks include.cursor-plugin/plugin.json, so release bumps can update.claude-plugin/plugin.jsonwhile leaving Cursor manifests stale; this can ship inconsistent plugin versions across clients — add.cursor-plugin/plugin.jsonto every managed plugin block before merging. - In
scripts/multi-format.ts, string-valuedmcpServersare not handled and can be silently dropped during Cursor manifest generation, which risks broken MCP behavior for plugins that reference external config files — add explicit handling for string paths and regenerate manifests. plugins/pnpm/.cursor-plugin/plugin.jsonis out of sync with the sourceplugin.json(1.1.1 vs 1.0.0), so publishing as-is can expose a version drift in generated artifacts — regenerate withbun scripts/cli.ts multi-formatand commit the synced output.- In
.agents/skills/create-plugin-scaffold/SKILL.md, Step 5 omits scaffold instructions forhooksandmcpServersdespite accepting them as inputs, so generated scaffolds may be incomplete or misleading for users selecting those types — document the missing creation/config patterns before merge.
Reply with feedback, questions, or to request a fix.
Re-trigger cubic
- skills-lock.json: pin create-plugin-scaffold to ref main (consistency) - multi-format: pass through string mcpServers to Cursor instead of dropping - multi-format: rebrand Cursor marketplace metadata description (Claude Code -> Cursor)
- add canonical displayName overrides (MarkItDown, MCP Dev, MCP Neo4j, VueUse) - pickCategory: map acronym categories to canonical casing (ai->AI, ui->UI) - regenerate affected Cursor manifests + Codex marketplace
|



Summary
Adds full Cursor runtime support across three logical areas: skill renaming for disambiguation, vendoring of the Cursor scaffold skill, and multi-format manifest generation for all local plugins.
Changes
Group 1+2 — Skills: rename plugin-builder and vendor create-plugin-scaffold
.claude/skills/plugin-builder/→.claude/skills/claude-code-plugin-builder/(5 files: SKILL.md, README.md, CHANGELOG.md, examples.md, templates.md) to disambiguate from the Codexplugin-creatorand Cursorcreate-plugin-scaffoldsibling skillsclaude-code-plugin-builder/SKILL.mdcreate-plugin-scaffoldskill fromcursor/pluginsvia skills.sh (bunx skills add), tracked in rootskills-lock.json.agents/skills/create-plugin-scaffold/(vendor, read-only) and.claude/skills/create-plugin-scaffoldsymlink (mirrors theplugin-creatorprecedent) to expose it to Claude CodeGroup 3 — Multi-format: generate Cursor (.cursor-plugin) manifests and marketplace
scripts/multi-format.tswithtoCursorManifest,toCursorSource,toCursorMarketplace(+ types) and wires Cursor intogenerateForPlugin; schema-grounded from cursor/plugins schemasscripts/cli.tsnow also writes.cursor-plugin/marketplace.jsonscripts/multi-format.test.ts— 72/72 tests pass.cursor-plugin/marketplace.json(root) andplugins/<name>/.cursor-plugin/plugin.jsonfor 70 local pluginsCLAUDE.mdand.claude/rules/marketplace-sync.mdto include Cursor runtime in the marketplace sync table.cursor-plugin/plugin.jsontoextra-filesinrelease-please-config.jsonfor the 26 entries already tracking.codex-plugin/plugin.json(version parity)Test Plan
scripts/multi-format.test.ts).cursor-plugin/marketplace.jsongenerated at repo rootplugins/<name>/.cursor-plugin/plugin.jsongenerated for all 70 local pluginsbun scripts/cli.ts multi-formatruns cleanlySummary by cubic
Adds full Cursor runtime support with per-plugin
.cursor-plugin/plugin.jsongeneration and a root.cursor-plugin/marketplace.json. Also normalizes branding (display names and AI/UI categories) and vendors a scaffold skill for creating new Cursor plugins.New Features
toCursorManifest,toCursorSource, andtoCursorMarketplace; wired intogenerateForPlugin.scripts/cli.tsnow writes.cursor-plugin/marketplace.json..cursor-plugin/plugin.jsonfor all local plugins (70) and the root marketplace; add 12 tests for Cursor converters..claude/skills/plugin-builderto.claude/skills/claude-code-plugin-builder; vendor Cursorcreate-plugin-scaffoldinto.agents/skills/create-plugin-scaffoldand expose via.claude/skills/create-plugin-scaffold; pinref: maininskills-lock.json.displayNameoverrides for MarkItDown, MCP Dev, MCP Neo4j, and VueUse; mapai/uicategories toAI/UI; rebrand marketplace metadata description from “Claude Code” to “Cursor”; regenerate affected Cursor and Codex marketplaces.mcpServerspaths in Cursor manifests.CLAUDE.mdand.claude/rules/marketplace-sync.mdto include Cursor..cursor-plugin/plugin.jsoninrelease-please-config.jsonfor packages already tracking Codex manifests.Migration
bun scripts/cli.ts multi-formatafter changing a plugin’s Claude manifest. Do not hand-edit generated Cursor files (.cursor-plugin/plugin.json,.cursor-plugin/marketplace.json).Written for commit 0ea1ee7. Summary will update on new commits.
Summary by CodeRabbit