|
| 1 | +# Publishing to Cursor |
| 2 | + |
| 3 | +Cursor (as of 2.6, May 2026) has **three distinct publishing surfaces** for AI plugins. This repo is configured to use all three; the recommended primary path for this monorepo is the **Team Marketplace** because it supports all 15 plugins in one import without requiring Anysphere review. |
| 4 | + |
| 5 | +| Surface | Best for | Audience | Approval needed | |
| 6 | +|---------|----------|----------|-----------------| |
| 7 | +| **Team Marketplace** (Cursor 2.6) | Multi-plugin GitHub repos like this one | Teams/Enterprise plan members | None — admin imports a GitHub URL | |
| 8 | +| **Public Marketplace** (cursor.com/marketplace) | Single flagship plugin | Everyone | Anysphere review | |
| 9 | +| **cursor.directory** | Community discovery | Everyone | None — auto-detected | |
| 10 | + |
| 11 | +References: |
| 12 | +- Marketplace storefront: https://cursor.com/marketplace |
| 13 | +- Plugins overview: https://cursor.com/docs/plugins |
| 14 | +- Schema reference: https://cursor.com/docs/reference/plugins |
| 15 | +- Official plugins repo (spec + schemas): https://github.com/cursor/plugins |
| 16 | +- Plugin template: https://github.com/cursor/plugin-template |
| 17 | +- Team Marketplaces (2.6 forum post): https://forum.cursor.com/t/cursor-2-6-team-marketplaces-for-plugins/153484 |
| 18 | +- Cursor 2.5 launch (marketplace debut): https://cursor.com/changelog/2-5 |
| 19 | + |
| 20 | +## Repo layout |
| 21 | + |
| 22 | +The repo is wired for direct Cursor consumption: |
| 23 | + |
| 24 | +``` |
| 25 | +agentic-commerce-skills-plugins/ |
| 26 | +├── .cursor-plugin/ |
| 27 | +│ └── marketplace.json # Team Marketplace manifest — enumerates 15 plugins |
| 28 | +├── dist/cursor/<plugin>/ |
| 29 | +│ ├── .cursor-plugin/ |
| 30 | +│ │ └── plugin.json # Per-plugin manifest (schema-validated) |
| 31 | +│ ├── agents/<expert>.md |
| 32 | +│ ├── rules/<expert>.mdc |
| 33 | +│ ├── skills/<skill>/SKILL.md |
| 34 | +│ ├── hooks/hooks.json |
| 35 | +│ └── scripts/check_*.py |
| 36 | +└── scripts/ |
| 37 | + └── validate-cursor.mjs # Mirror of Cursor's CI validator (ajv) |
| 38 | +``` |
| 39 | + |
| 40 | +The root `.cursor-plugin/marketplace.json` is what Cursor's Team Marketplace import reads. The `source` field on each entry points at the converted plugin directory under `dist/cursor/`. |
| 41 | + |
| 42 | +## Path 1 — Team Marketplace (recommended for this repo) |
| 43 | + |
| 44 | +**No review, no submission form.** Admins of a Cursor Teams/Enterprise org import any GitHub repo URL. |
| 45 | + |
| 46 | +### What an admin does |
| 47 | + |
| 48 | +1. In Cursor: **Settings → Plugins → Team Marketplaces → Import** |
| 49 | +2. Paste `https://github.com/OrcaQubits/agentic-commerce-skills-plugins` |
| 50 | +3. Cursor parses the root `.cursor-plugin/marketplace.json` and surfaces all 15 plugins |
| 51 | +4. Admin assigns plugins to **Access Groups** (e.g., "Engineering", "Commerce-team") |
| 52 | +5. Members in those groups see the plugins in the Cursor Plugin browser and install with one click |
| 53 | + |
| 54 | +Teams plan = 1 marketplace per org; Enterprise = unlimited. |
| 55 | + |
| 56 | +### Updating the marketplace |
| 57 | + |
| 58 | +When you bump a plugin version or add a new plugin: |
| 59 | + |
| 60 | +```bash |
| 61 | +# 1. Update sources under <plugin>/.claude-plugin/ as usual |
| 62 | +# 2. Regenerate the Cursor output |
| 63 | +python scripts/convert.py --platform cursor |
| 64 | + |
| 65 | +# 3. (Only if you added a NEW plugin) regenerate root marketplace.json |
| 66 | +python -c " |
| 67 | +import json, pathlib |
| 68 | +src = json.load(open('.claude-plugin/marketplace.json')) |
| 69 | +plugins = [{'name': p['name'], 'source': f'dist/cursor/{p[\"name\"]}', 'description': p['description']} for p in src['plugins']] |
| 70 | +out = {'name': 'agentic-commerce', 'owner': {'name': 'Rohit Bajaj, Julekha Khatun'}, 'metadata': {'description': '...', 'version': '1.0.0'}, 'plugins': plugins} |
| 71 | +json.dump(out, open('.cursor-plugin/marketplace.json', 'w', encoding='utf-8', newline='\n'), indent=2, ensure_ascii=False) |
| 72 | +" |
| 73 | + |
| 74 | +# 4. Validate before committing |
| 75 | +node scripts/validate-cursor.mjs |
| 76 | + |
| 77 | +# 5. Commit and push |
| 78 | +git add .cursor-plugin/marketplace.json dist/cursor/ |
| 79 | +git commit -m "chore(cursor): bump plugin X to vY.Y.Z" |
| 80 | +git push |
| 81 | +``` |
| 82 | + |
| 83 | +Team Marketplaces refresh automatically — no tag required (unlike Gemini). |
| 84 | + |
| 85 | +## Path 2 — Public Cursor Marketplace |
| 86 | + |
| 87 | +Submit one plugin (e.g., the UCP flagship, matching what we did for Gemini) at **https://cursor.com/marketplace/publish**. Anysphere reviews each plugin before listing. |
| 88 | + |
| 89 | +### Submission checklist (per https://cursor.com/docs/reference/plugins) |
| 90 | + |
| 91 | +- [ ] Valid `.cursor-plugin/plugin.json` matching the JSON Schema (we validate via `node scripts/validate-cursor.mjs`) |
| 92 | +- [ ] Unique kebab-case `name` (pattern `^[a-z0-9]([a-z0-9.-]*[a-z0-9])?$`) |
| 93 | +- [ ] All paths in the manifest are relative; no `..` traversal |
| 94 | +- [ ] Every rule / skill / agent / command has frontmatter |
| 95 | +- [ ] `README.md` documents usage clearly |
| 96 | +- [ ] Optional `logo` is committed and referenced relatively |
| 97 | +- [ ] For multi-plugin: `.cursor-plugin/marketplace.json` at repo root (we have this) |
| 98 | + |
| 99 | +### Flow |
| 100 | + |
| 101 | +1. Polish the flagship plugin's README + logo |
| 102 | +2. Test locally by dropping it at `~/.cursor/plugins/local/<plugin-name>/` and reloading Cursor |
| 103 | +3. Submit via the web form at https://cursor.com/marketplace/publish OR email Cursor's plugin team at `kniparko@anysphere.com` (path documented in cursor/plugin-template) |
| 104 | +4. Wait for review |
| 105 | + |
| 106 | +**Don't submit PRs to https://github.com/cursor/plugins** — that repo is reserved for first-party Cursor-authored plugins (all 11 entries are by Anysphere staff). |
| 107 | + |
| 108 | +## Path 3 — cursor.directory community listing |
| 109 | + |
| 110 | +The lowest-friction discovery surface. |
| 111 | + |
| 112 | +1. Visit **https://cursor.directory/plugins/new** |
| 113 | +2. Paste the GitHub repo URL |
| 114 | +3. cursor.directory auto-detects components following the "Open Plugins" standard |
| 115 | +4. Listing appears in the community catalog |
| 116 | + |
| 117 | +cursor.directory is owned by the `cursor` GitHub org (https://github.com/cursor/community-plugins) but isn't gate-kept. Good for SEO and community visibility alongside whichever primary path you choose. |
| 118 | + |
| 119 | +## Local development install |
| 120 | + |
| 121 | +For a developer testing a plugin without going through any marketplace: |
| 122 | + |
| 123 | +```bash |
| 124 | +# Generate Cursor output |
| 125 | +python scripts/convert.py --platform cursor |
| 126 | + |
| 127 | +# Symlink (or copy) the plugin to Cursor's local plugins dir |
| 128 | +ln -s "$(pwd)/dist/cursor/spree-commerce" ~/.cursor/plugins/local/spree-commerce |
| 129 | + |
| 130 | +# Reload Cursor window |
| 131 | +# (Command Palette → "Developer: Reload Window") |
| 132 | +``` |
| 133 | + |
| 134 | +## Pre-commit validation |
| 135 | + |
| 136 | +This repo ships `scripts/validate-cursor.mjs` which mirrors Cursor's CI validator (`ajv` against the official schemas): |
| 137 | + |
| 138 | +```bash |
| 139 | +npm install --no-save ajv ajv-formats |
| 140 | +node scripts/validate-cursor.mjs |
| 141 | +``` |
| 142 | + |
| 143 | +It checks: |
| 144 | +- The root `.cursor-plugin/marketplace.json` validates against `marketplace.schema.json` |
| 145 | +- Every `dist/cursor/<plugin>/.cursor-plugin/plugin.json` validates against `plugin.schema.json` |
| 146 | +- Every `source` in `marketplace.json` resolves to a real `plugin.json` |
| 147 | + |
| 148 | +Run before tagging any release. Cursor's own CI runs the same checks during Team Marketplace import. |
| 149 | + |
| 150 | +## Schema notes (gotchas learned the hard way) |
| 151 | + |
| 152 | +- **`additionalProperties: false`** on the plugin schema — any unknown key (e.g., `author.url`, which was in our pre-fix output) fails validation. The converter has been patched to drop `url` and move it to top-level `homepage`. |
| 153 | +- **`author` object shape**: `{name, email}` only. `homepage` is a separate top-level field. |
| 154 | +- **Name pattern**: lowercase + digits + hyphens/periods, alphanumeric at start and end. |
| 155 | +- **`hooks` field**: accepts a string path (`"./hooks/hooks.json"`) or an inline object. The converter emits the path string when `hooks/hooks.json` exists. |
| 156 | +- **`.mdc` rule frontmatter**: only `description`, `alwaysApply`, `globs` are recognized. No `type`, `priority`, `attachAlways`, etc. |
| 157 | +- **MCP servers** go in a top-level `mcp.json` file (auto-discovered) OR via the `mcpServers` manifest field. Our current plugins don't ship MCP servers. |
| 158 | + |
| 159 | +## Troubleshooting |
| 160 | + |
| 161 | +| Symptom | Fix | |
| 162 | +|---------|-----| |
| 163 | +| Team Marketplace import fails with schema error | Run `node scripts/validate-cursor.mjs` to find the offending plugin. | |
| 164 | +| `additionalProperties NOT allowed` | The converter emitted an unknown key. Pull the latest converter from this repo or remove the key. | |
| 165 | +| Plugins list as "0 plugins" after import | The `source` paths in `marketplace.json` don't resolve. Confirm `dist/cursor/` is committed (not gitignored). | |
| 166 | +| Plugin installs but rules don't activate | Check `.mdc` frontmatter — `alwaysApply: true` for global rules, or set `globs` and `alwaysApply: false` for path-scoped. | |
| 167 | +| Hook script not found | The converter emits `${CURSOR_PLUGIN_ROOT}/scripts/check_*.py`. Confirm `scripts/` is committed at the plugin's root. | |
| 168 | +| Want to remove a plugin from the marketplace | Drop its entry from `.cursor-plugin/marketplace.json` and commit. Imported teams refresh automatically. | |
| 169 | + |
| 170 | +## Reference URLs |
| 171 | + |
| 172 | +- https://cursor.com/marketplace |
| 173 | +- https://cursor.com/marketplace/publish |
| 174 | +- https://cursor.com/docs/plugins |
| 175 | +- https://cursor.com/docs/reference/plugins |
| 176 | +- https://github.com/cursor/plugins (schemas + first-party plugins) |
| 177 | +- https://github.com/cursor/plugin-template |
| 178 | +- https://forum.cursor.com/t/cursor-2-6-team-marketplaces-for-plugins/153484 |
| 179 | +- https://cursor.directory/plugins |
| 180 | +- https://cursor.com/changelog/2-5 (marketplace launch) |
| 181 | +- https://cursor.com/blog/new-plugins (March 2026 plugin cohort) |
0 commit comments