Marketplace plugins for Reforma. Each plugin is a folder with .reforma-plugin/plugin.json. Pack renames .cursor-plugin, .codex-plugin, or .claude-plugin to .reforma-plugin when that folder is missing.
| name | Plugin | Author | Category | description |
|---|---|---|---|---|
| demo-kit | Demo Kit | Reforma | Demo | Sample plugin to try the catalog — skills, tools, hooks, and a server. |
| bro-mode | Bro Mode | Reforma | Moods | Brother energy — blunt, warm, pushes back. |
| zen-mode | Zen Mode | Reforma | Moods | Calm, minimal, one clear step at a time. |
| ship-it | Ship It | Reforma | Moods | Smallest shippable change — merge beats polish. |
| professor | Professor | Reforma | Moods | Explain the why — context and tradeoffs. |
| hype-man | Hype Man | Reforma | Moods | Founder energy — vision, momentum, this thing wins. |
| caveman-mode | Caveman | Reforma | Moods | Cave-person talk. Broken words. Me do work. |
| shadcn-tailwind | shadcn / Tailwind | shadcn | UI | Official components and Tailwind utilities for the project. |
| fonts | Fonts | Reforma | UI | Google Fonts and custom typefaces for the project. |
| coss | coss | coss | UI | Extra components and particles on top of shadcn. |
| flexnative | Flexnative | Flexnative | UI | Ready-made blocks and patterns on top of shadcn. |
| context7 | Context7 | Reforma | Workspace | Up-to-date library docs and examples. Needs an API key. |
| google-drive | Google Drive | Reforma | Files | Search, read, create, and share files across Drive. |
| notion-workspace | Notion Workspace | Notion Labs | Workspace | Notion Skills + Notion MCP server packaged as a Cursor plugin. |
| dropbox | Dropbox | Dropbox | Files | Access, save and share files with Dropbox. |
Author is plugin.json author.name when present, else Reforma. Shelf is the parent categories[] entry — plugin.json has no category.
Root marketplace.json lists plugins under categories[].plugins. source is a path in this repo or a GitHub tree/… URL.
Local plugins live under marketplace/<category>/<name>/. Origin (first-party vs vendored) is plugin.json author, not the folder tree. Remote pins stay as GitHub URLs. Array order is section order; empty shelves omit plugins.
plugins/
├── marketplace.json # categories + plugin index
├── marketplace/<category>/<name>/
└── scripts/pack/ # snapshot for the API (entry: scripts/pack.ts)
A plugin folder:
marketplace/<category>/<name>/
├── .reforma-plugin/plugin.json
├── assets/logo.svg
└── …convention folders (skills/, rules/, hooks/, …)
Other plugin layouts (skills, hooks, tools, MCP) follow the same convention folders as demos — see demo-kit.
bun install
bun run pack # writes dist/catalog/ and dist/catalog.tar.gzPack discovers convention folders (skills/, agents/, rules/, hooks/, tools/, mcp.json or .mcp.json) — no path fields needed in source plugin.json. Custom paths are remapped into that layout. If you import a Cursor/vendor plugin, pack also normalizes rules/*.mdc, .cursor/rules/, and instructions/ to plain rules/*.md, renames .mcp.json → mcp.json, and renames a lone MCP server key to the marketplace plugin name (chatgpt_app_mcp → dropbox). HTTP MCP with no tools in mcp.json: pack calls initialize, then tools/list. Stdio MCP is not probed. Packed plugin.json keeps hooks: "./hooks/hooks.json" (+ hookOffers) and tools: "./tools.mjs" (+ toolOffers) when those ship. Skills/agents/rules/mcp paths are stripped — catalog and sandbox discover the folders.
Pack bundles tools/*.ts into one tools.mjs (@reforma/plugin-sdk / ai / zod stay external). Export defineTool as the file default; name = filename (Grep.ts → Grep); override: true = bare name, shadows.
Push to main or dev publishes a catalog-<7-char-sha> GitHub Release (keeps the newest 10). Reforma API on local/staging tries dev, then main. Prod bakes main.