diff --git a/README.md b/README.md index 72d607c..4461eb6 100644 --- a/README.md +++ b/README.md @@ -4,86 +4,87 @@ Marketplace plugins for Reforma. Each plugin is a folder with `.reforma-plugin/p ## Plugins -| name | Plugin | Author | Category | description | -| --------------------- | ------------------------------------------------------------------------ | ------------- | ---------- | ---------------------------------------------------------------------- | -| demo-kit | [Demo Kit](marketplace/demo/demo-kit) | Reforma | Demo | Sample plugin to try the catalog — skills, tools, hooks, and a server. | -| bro-mode | [Bro Mode](marketplace/moods/bro-mode) | Reforma | Moods | Brother energy — blunt, warm, pushes back. | -| zen-mode | [Zen Mode](marketplace/moods/zen-mode) | Reforma | Moods | Calm, minimal, one clear step at a time. | -| ship-it | [Ship It](marketplace/moods/ship-it) | Reforma | Moods | Smallest shippable change — merge beats polish. | -| professor | [Professor](marketplace/moods/professor) | Reforma | Moods | Explain the why — context and tradeoffs. | -| hype-man | [Hype Man](marketplace/moods/hype-man) | Reforma | Moods | Founder energy — vision, momentum, this thing wins. | -| caveman-mode | [Caveman](marketplace/moods/caveman-mode) | Reforma | Moods | Smart caveman. Brain big, mouth small. Same work, less fluff. | -| shadcn-tailwind | [shadcn / Tailwind](marketplace/ui/shadcn-tailwind) | shadcn | UI | Official components and Tailwind utilities for the project. | -| fonts | [Fonts](marketplace/ui/fonts) | Reforma | UI | Google Fonts and custom typefaces for the project. | -| coss | [coss](marketplace/ui/coss) | coss | UI | Extra components and particles on top of shadcn. | -| flexnative | [Flexnative](marketplace/ui/flexnative) | Flexnative | UI | Ready-made blocks and patterns on top of shadcn. | -| magic-ui | [Magic UI](marketplace/ui/magic-ui) | Magic UI | UI | Animated marketing components on top of shadcn. | -| tailark | [Tailark](marketplace/ui/tailark) | Tailark | UI | Marketing blocks and pages on top of shadcn. | -| aceternity | [Aceternity](marketplace/ui/aceternity) | Aceternity | UI | Motion-rich blocks and effects on top of shadcn. | -| 21st | [21st](marketplace/ui/21st) | 21st | UI | Search and install UI from the 21st catalog. Needs an API key. | -| i18n | [i18n](marketplace/ui/i18n) | Reforma | UI | Locales, translated copy, and language switching for the app. | -| react-best-practices | [React Best Practices](marketplace/ui/react-best-practices) | Vercel | UI | React and Next.js performance patterns for the app. | -| web-design-guidelines | [Web Design Guidelines](marketplace/ui/web-design-guidelines) | Vercel | UI | Accessibility, forms, and focus checks for the app UI. | -| frontend-design | [Frontend Design](marketplace/ui/frontend-design) | Anthropic | UI | Distinctive visual identity — palette, type, and layout. | -| context7 | [Context7](marketplace/workspace/context7) | Reforma | Workspace | Up-to-date library docs and examples. Needs an API key. | -| google-drive | [Google Drive](marketplace/files/google-drive) | Reforma | Files | Search, read, create, and share files across Drive. | -| notion-workspace | [Notion Workspace](https://github.com/makenotion/cursor-notion-plugin) | Notion Labs | Workspace | Notion Skills + Notion MCP server packaged as a Cursor plugin. | -| linear | [Linear](https://github.com/linear/cursor-plugin) | Linear | Workspace | Issues, projects, and docs from the Linear workspace. | -| dropbox | [Dropbox](https://github.com/dropbox/dropbox-ai-plugins/tree/main/codex) | Dropbox | Files | Access, save and share files with Dropbox. | -| cloudinary | [Cloudinary](marketplace/files/cloudinary) | Cloudinary | Files | Upload, transform, and deliver images and videos from Cloudinary. | -| slack | [Slack](marketplace/workspace/slack) | Slack | Workspace | Search channels, read threads, and post to the workspace. | -| github-mcp | [GitHub](marketplace/workspace/github-mcp) | GitHub | Workspace | Search issues, pull requests, and code in GitHub repositories. | -| clerk | [Clerk](marketplace/auth/clerk) | Clerk | Auth | Sign-in, organizations, and user management for the app. | -| supabase | [Supabase](https://github.com/supabase-community/supabase-plugin) | Supabase | Backend | Database, auth, and storage for the Supabase project. | -| stripe | [Stripe](https://github.com/stripe/ai/tree/main/providers/cursor/plugin) | Stripe | Payments | Payments, customers, and webhooks from the Stripe account. | -| higgsfield | [Higgsfield](https://github.com/higgsfield-ai/cursor-plugin) | Higgsfield AI | Media | Images and video from Higgsfield. | -| quiver | [Quiver](https://github.com/quiverai/cursor-plugin) | QuiverAI | Media | Generate and vectorize SVG. | -| svgator | [SVGator](marketplace/media/svgator) | SVGator | Media | Create, edit, and export animated SVG. | -| lottiefiles | [LottieFiles](marketplace/media/lottiefiles) | LottieFiles | Media | Search and manage Lottie animations. | -| recraft | [Recraft](marketplace/media/recraft) | Recraft | Media | Generate and edit images with Recraft. | -| replicate | [Replicate](marketplace/media/replicate) | Replicate | Media | Run image, video, and audio models on Replicate. | -| heygen | [HeyGen](marketplace/media/heygen) | HeyGen | Media | Generate avatar videos with HeyGen. | -| fal | [fal](marketplace/media/fal) | fal | Media | Generate images, video, and audio from fal models. Needs an API key. | -| elevenlabs | [ElevenLabs](marketplace/media/elevenlabs) | ElevenLabs | Media | Generate speech and manage voices in ElevenLabs. | -| sentry | [Sentry](https://github.com/getsentry/plugin-cursor) | Sentry | Analytics | Errors and traces from the Sentry org. | -| gsap | [GSAP](https://github.com/greensock/gsap-skills) | GreenSock | UI | Animation timelines, ScrollTrigger, and GSAP plugins. | -| motion | [Motion](https://github.com/motiondivision/cursor-plugin) | Motion | UI | Web animation, springs, and Motion docs. | -| remotion | [Remotion](https://github.com/remotion-dev/cursor-plugin) | Remotion | UI | Videos and motion graphics with React. | -| game-creator | [Game Creator](marketplace/games/game-creator) | OpusGameLabs | Games | Phaser 2D and Three.js 3D browser games — skills, templates, commands. | -| firebase | [Firebase](https://github.com/firebase/agent-skills) | Firebase | Backend | Auth, Firestore, and hosting for the Firebase project. | -| convex | [Convex](https://github.com/get-convex/convex-agent-plugins) | Convex | Backend | Reactive backend and database for the Convex project. | -| neon | [Neon](marketplace/backend/neon) | Neon | Backend | Postgres databases, branches, and SQL on Neon. | -| appwrite | [Appwrite](https://github.com/appwrite/cursor-plugin) | Appwrite | Backend | Auth, database, and storage for the Appwrite project. | -| prisma | [Prisma](https://github.com/prisma/cursor-plugin) | Prisma | Backend | Schema, migrations, and queries with Prisma. | -| auth0 | [Auth0](marketplace/auth/auth0) | Auth0 | Auth | Sign-in and user management with Auth0. | -| workos | [WorkOS](marketplace/auth/workos) | WorkOS | Auth | Sign-in, SSO, and user management with WorkOS. | -| shopify | [Shopify](marketplace/payments/shopify) | Shopify | Payments | Products, orders, and store data from Shopify. | -| resend | [Resend](https://github.com/resend/resend-skills) | Resend | Messaging | Send email and manage templates with Resend. | -| cal-com | [Cal.com](marketplace/scheduling/cal-com) | Cal.com | Scheduling | Bookings, event types, and a booker widget from Cal.com. | -| calendly | [Calendly](marketplace/scheduling/calendly) | Calendly | Scheduling | Scheduling links, availability, and a Calendly embed for the app. | -| booking | [Booking](marketplace/scheduling/booking) | Reforma | Scheduling | Book a call, pick slots, or show an event calendar in the app. | -| figma | [Figma](marketplace/design/figma) | Figma | Design | Read designs and generate code from Figma files. | -| google-maps | [Google Maps](marketplace/maps/google-maps) | Google | Maps | Places, routes, and weather from Google Maps. | -| mapbox | [Mapbox](https://github.com/mapbox/mapbox-agent-skills) | Mapbox | Maps | Maps, search, and styles from Mapbox. | -| posthog | [PostHog](marketplace/analytics/posthog) | PostHog | Analytics | Events, funnels, and session replay from PostHog. | -| amplitude | [Amplitude](marketplace/analytics/amplitude) | Amplitude | Analytics | Events and charts from the Amplitude project. | -| sanity | [Sanity](marketplace/cms/sanity) | Sanity | CMS | Read and edit content in the Sanity dataset. | -| zapier | [Zapier](marketplace/automation/zapier) | Zapier | Automation | Run actions and look up data from connected Zapier apps. | -| composio | [Composio](marketplace/automation/composio) | Composio | Automation | Run actions across the apps connected in Composio. | -| make | [Make](marketplace/automation/make) | Make | Automation | Run scenarios and look up data from connected Make apps. | -| n8n | [n8n](marketplace/automation/n8n) | n8n | Automation | Run workflows and look up data from connected n8n apps. | +| name | Plugin | Author | Category | description | +| --------------------- | ------------------------------------------------------------------------ | ------------- | ---------- | --------------------------------------------------------------------------------------------------------- | +| bro-mode | [Bro Mode](marketplace/moods/bro-mode) | Reforma | Moods | Talk like their brother and best friend — relaxed, blunt, and not afraid to push back | +| zen-mode | [Zen Mode](marketplace/moods/zen-mode) | Reforma | Moods | Quiet. Do the work. No status talk — just the outcome. | +| ship-it | [Ship It](marketplace/moods/ship-it) | Reforma | Moods | Bias to the smallest shippable change — stop polishing, start merging | +| professor | [Professor](marketplace/moods/professor) | Reforma | Moods | Grill first — research, ask, settle the tree — then build. | +| hype-man | [Hype Man](marketplace/moods/hype-man) | Reforma | Moods | Yes-and founder. Picks the call, ships it, doesn't interview. If it flops, delete it. | +| caveman-mode | [Caveman](marketplace/moods/caveman-mode) | Reforma | Moods | Talk like a caveman. Joke voice — smash the work, then turn it off. | +| react-best-practices | [React Best Practices](marketplace/playbooks/react-best-practices) | Vercel | Playbooks | Keep the app fast — React and Next.js performance patterns | +| web-design-guidelines | [Web Design Guidelines](marketplace/playbooks/web-design-guidelines) | Vercel | Playbooks | Catch accessibility, form, and focus issues before they ship | +| frontend-design | [Frontend Design](marketplace/playbooks/frontend-design) | Anthropic | Playbooks | A look that is not a template — palette, type, and layout with a point of view | +| shadcn-tailwind | [shadcn / Tailwind](marketplace/system/shadcn-tailwind) | shadcn | System | The UI kit the project is built on — components, forms, and Tailwind | +| fonts | [Fonts](marketplace/system/fonts) | Reforma | System | Google Fonts and custom typefaces for the project | +| nextjs | [Next.js](marketplace/system/nextjs) | Reforma | System | Next.js App Router — routing, layouts, and the conventions the project follows | +| coss | [coss](marketplace/ui/coss) | coss | UI | Extra components and particle effects beyond the default shadcn set | +| flexnative | [Flexnative](marketplace/ui/flexnative) | Flexnative | UI | Ready-made page blocks and patterns — drop in a section instead of assembling it | +| magic-ui | [Magic UI](marketplace/ui/magic-ui) | Magic UI | UI | Animated marketing pieces — shine, marquee, shimmer, and that kind of polish | +| tailark | [Tailark](marketplace/ui/tailark) | Tailark | UI | Marketing landing blocks and pages — heroes, pricing, footers | +| aceternity | [Aceternity](marketplace/ui/aceternity) | Aceternity | UI | Motion-heavy blocks and visual effects for landing pages | +| 21st | [21st](marketplace/ui/21st) | 21st | UI | A living library of React components, templates, and themes. Add them to the project, or generate new UI. | +| i18n | [i18n](marketplace/ui/i18n) | Reforma | UI | Multiple languages — translated copy and a language switcher for the app | +| svg | [SVG](marketplace/ui/svg) | Reforma | UI | Logos, favicons, and inline SVG. Icons stay on Lucide or the project’s pack. | +| context7 | [Context7](marketplace/workspace/context7) | Reforma | Workspace | Current docs and examples for the libraries in the project | +| google-drive | [Google Drive](marketplace/files/google-drive) | Reforma | Files | Docs and files in Google Drive — find them, upload drafts, share from the project | +| notion-workspace | [Notion](https://github.com/makenotion/cursor-notion-plugin) | Notion Labs | Workspace | The team’s Notion — notes, pages, and databases in the project | +| linear | [Linear](https://github.com/linear/cursor-plugin) | Linear | Workspace | The issue tracker — bugs, projects, and docs from Linear | +| dropbox | [Dropbox](https://github.com/dropbox/dropbox-ai-plugins/tree/main/codex) | Dropbox | Files | Files in Dropbox — save, share, and pull them into the project | +| cloudinary | [Cloudinary](marketplace/files/cloudinary) | Cloudinary | Files | Images and video in the cloud — upload, transform, and deliver them | +| slack | [Slack](marketplace/workspace/slack) | Slack | Workspace | The team’s Slack — channels, threads, and posts from the project | +| github-mcp | [GitHub](marketplace/workspace/github-mcp) | GitHub | Workspace | GitHub in the project — issues, pull requests, and the repo | +| clerk | [Clerk](marketplace/auth/clerk) | Clerk | Auth | Drop-in auth — sign-in, organizations, and user accounts for the app | +| supabase | [Supabase](https://github.com/supabase-community/supabase-plugin) | Supabase | Backend | Backend for the app — database, auth, and file storage | +| stripe | [Stripe](https://github.com/stripe/ai/tree/main/providers/cursor/plugin) | Stripe | Payments | Accept payments, manage customers, and handle subscriptions | +| higgsfield | [Higgsfield](https://github.com/higgsfield-ai/cursor-plugin) | Higgsfield AI | Media | AI images and video from one studio | +| quiver | [Quiver](https://github.com/quiverai/cursor-plugin) | QuiverAI | Media | Generate SVG and turn pictures into clean vectors | +| svgator | [SVGator](marketplace/media/svgator) | SVGator | Media | Animated SVG — design the motion and export it into the project | +| lottiefiles | [LottieFiles](marketplace/media/lottiefiles) | LottieFiles | Media | Lightweight motion for the app — Lottie animations you can browse and drop in | +| recraft | [Recraft](marketplace/media/recraft) | Recraft | Media | Generate and edit images with Recraft’s design models | +| replicate | [Replicate](marketplace/media/replicate) | Replicate | Media | Image, video, and audio models — pick one, get the file | +| heygen | [HeyGen](marketplace/media/heygen) | HeyGen | Media | Talking-head videos from a script and an avatar | +| fal | [fal](marketplace/media/fal) | fal | Media | Generate images, video, and audio from a wide set of models | +| elevenlabs | [ElevenLabs](marketplace/media/elevenlabs) | ElevenLabs | Media | Voice for the app — generate speech and pick the voice | +| sentry | [Sentry](https://github.com/getsentry/plugin-cursor) | Sentry | Analytics | See crashes and traces from the live app, then fix them | +| gsap | [GSAP](https://github.com/greensock/gsap-skills) | GreenSock | UI | Timeline animation, scroll effects, and motion — the GSAP toolkit | +| motion | [Motion](https://github.com/motiondivision/cursor-plugin) | Motion | UI | Animation for the web — springs, gestures, and layout motion | +| remotion | [Remotion](https://github.com/remotion-dev/cursor-plugin) | Remotion | UI | Videos and motion graphics, written in React | +| game-creator | [Game Creator](marketplace/games/game-creator) | OpusGameLabs | Games | Browser games — 2D with Phaser, 3D with Three.js | +| firebase | [Firebase](https://github.com/firebase/agent-skills) | Firebase | Backend | Google’s backend — auth, database, and hosting | +| convex | [Convex](https://github.com/get-convex/convex-agent-plugins) | Convex | Backend | A live backend — the database updates the UI as data changes | +| neon | [Neon](marketplace/backend/neon) | Neon | Backend | Serverless Postgres — databases, branches, and SQL without running a server | +| appwrite | [Appwrite](https://github.com/appwrite/cursor-plugin) | Appwrite | Backend | An open-source backend — auth, database, and storage | +| prisma | [Prisma](https://github.com/prisma/cursor-plugin) | Prisma | Backend | Talk to the database — schema, migrations, and queries in TypeScript | +| auth0 | [Auth0](marketplace/auth/auth0) | Auth0 | Auth | Sign-in and user accounts, including social login and enterprise identity | +| workos | [WorkOS](marketplace/auth/workos) | WorkOS | Auth | SSO and user management for B2B apps — enterprise sign-in without building it | +| shopify | [Shopify](marketplace/payments/shopify) | Shopify | Payments | The store in the app — products, orders, and shop data | +| resend | [Resend](https://github.com/resend/resend-skills) | Resend | Messaging | Send email from the app — transactional mail and templates | +| cal-com | [Cal.com](marketplace/scheduling/cal-com) | Cal.com | Scheduling | Let people book time — event types and a scheduler in the app | +| calendly | [Calendly](marketplace/scheduling/calendly) | Calendly | Scheduling | Scheduling links and a Calendly embed so people book themselves | +| booking | [Booking](marketplace/scheduling/booking) | Reforma | Scheduling | Book a call, pick a slot, or show an event calendar — no third-party account | +| figma | [Figma](marketplace/design/figma) | Figma | Design | Turn Figma frames into code for the project | +| google-maps | [Google Maps](marketplace/maps/google-maps) | Google | Maps | Maps in the app — places, routes, and what’s nearby | +| mapbox | [Mapbox](https://github.com/mapbox/mapbox-agent-skills) | Mapbox | Maps | Custom maps — your style, search, and location in the app | +| posthog | [PostHog](marketplace/analytics/posthog) | PostHog | Analytics | Product analytics — events, funnels, and session replay | +| amplitude | [Amplitude](marketplace/analytics/amplitude) | Amplitude | Analytics | Product analytics — events and charts so you see what people do | +| sanity | [Sanity](marketplace/cms/sanity) | Sanity | CMS | Structured content editors can change and the app can render | +| zapier | [Zapier](marketplace/automation/zapier) | Zapier | Automation | Connect the app to thousands of other tools without writing each integration | +| composio | [Composio](marketplace/automation/composio) | Composio | Automation | A hub of app connections — Gmail, Notion, Slack, and the rest of the stack | +| make | [Make](marketplace/automation/make) | Make | Automation | Visual automations from Make — run scenarios and use the results in the app | -Author is `plugin.json` `author.name` when present, else Reforma. Shelf is the parent `categories[]` entry — `plugin.json` has no `category`. +Author is `plugin.json` `author.name` when present, else Reforma. Shelf is the parent `categories[]` entry — `plugin.json` has no `category`. `description` is the marketplace pitch: what the product is for the person installing it. Not MCP verbs, not “needs an API key.” ## Repository structure Root `marketplace.json` lists plugins under `categories[].plugins`. `source` is a path in this repo or a GitHub `tree/…` URL. `"disabled": true` skips pack (folder stays) when the hosted MCP only accepts catalog clients (Figma waitlist). OAuth apps you register yourself (Drive, Dropbox, Slack, GitHub) stay enabled — credentials go in IN → OAuth clients, not here. -Local plugins live under `marketplace///`. 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`. +Local plugins live under `marketplace///`. Origin (first-party vs vendored) is `plugin.json` `author`, not the folder tree. Remote pins stay as GitHub URLs. Optional `displayName` / `description` on the listing, plus `marketplace/_brand//logo.*`, overlay the packed manifest — upstream Cursor plugins often ship repo-slug names and “plugin for Cursor” blurbs. ``` plugins/ ├── marketplace.json # categories + plugin index +├── marketplace/_brand// # overlay logos for GitHub pins ├── marketplace/// └── scripts/pack/ # snapshot for the API (entry: scripts/pack.ts) ``` @@ -97,8 +98,6 @@ marketplace/// └── …convention folders (skills/, rules/, hooks/, …) ``` -Other plugin layouts (skills, hooks, tools, MCP) follow the same convention folders as demos — see [demo-kit](marketplace/demo/demo-kit). - ```sh bun install bun run pack # writes dist/catalog/ and dist/catalog.tar.gz diff --git a/marketplace.json b/marketplace.json index 124d089..b92f5d2 100644 --- a/marketplace.json +++ b/marketplace.json @@ -1,5 +1,23 @@ { "categories": [ + { + "id": "system", + "name": "System", + "plugins": [ + { + "name": "shadcn-tailwind", + "source": "./marketplace/system/shadcn-tailwind" + }, + { + "name": "fonts", + "source": "./marketplace/system/fonts" + }, + { + "name": "nextjs", + "source": "./marketplace/system/nextjs" + } + ] + }, { "id": "moods", "name": "Moods", @@ -31,17 +49,27 @@ ] }, { - "id": "ui", - "name": "UI", + "id": "playbooks", + "name": "Playbooks", "plugins": [ { - "name": "shadcn-tailwind", - "source": "./marketplace/ui/shadcn-tailwind" + "name": "react-best-practices", + "source": "./marketplace/playbooks/react-best-practices" }, { - "name": "fonts", - "source": "./marketplace/ui/fonts" + "name": "web-design-guidelines", + "source": "./marketplace/playbooks/web-design-guidelines" }, + { + "name": "frontend-design", + "source": "./marketplace/playbooks/frontend-design" + } + ] + }, + { + "id": "ui", + "name": "UI", + "plugins": [ { "name": "coss", "source": "./marketplace/ui/coss" @@ -68,31 +96,29 @@ }, { "name": "gsap", - "source": "https://github.com/greensock/gsap-skills/tree/aed9cfd3277740755f6bfc1155c7aa645403b760" + "source": "https://github.com/greensock/gsap-skills/tree/aed9cfd3277740755f6bfc1155c7aa645403b760", + "displayName": "GSAP", + "description": "Timeline animation, scroll effects, and motion — the GSAP toolkit" }, { "name": "motion", - "source": "https://github.com/motiondivision/cursor-plugin/tree/1140efe9ad5e03c689ea6bb19d9d3850a4dae5f7/plugins/motion" + "source": "https://github.com/motiondivision/cursor-plugin/tree/1140efe9ad5e03c689ea6bb19d9d3850a4dae5f7/plugins/motion", + "displayName": "Motion", + "description": "Animation for the web — springs, gestures, and layout motion" }, { "name": "remotion", - "source": "https://github.com/remotion-dev/cursor-plugin/tree/bbb02cde0afb17f54329030581532067fb45f622" + "source": "https://github.com/remotion-dev/cursor-plugin/tree/bbb02cde0afb17f54329030581532067fb45f622", + "displayName": "Remotion", + "description": "Videos and motion graphics, written in React" }, { "name": "i18n", "source": "./marketplace/ui/i18n" }, { - "name": "react-best-practices", - "source": "./marketplace/ui/react-best-practices" - }, - { - "name": "web-design-guidelines", - "source": "./marketplace/ui/web-design-guidelines" - }, - { - "name": "frontend-design", - "source": "./marketplace/ui/frontend-design" + "name": "svg", + "source": "./marketplace/ui/svg" } ] }, @@ -112,15 +138,21 @@ "plugins": [ { "name": "supabase", - "source": "https://github.com/supabase-community/supabase-plugin/tree/8629243d1cd72309b533090a4c742f21747d02fa" + "source": "https://github.com/supabase-community/supabase-plugin/tree/8629243d1cd72309b533090a4c742f21747d02fa", + "displayName": "Supabase", + "description": "Backend for the app — database, auth, and file storage" }, { "name": "firebase", - "source": "https://github.com/firebase/agent-skills/tree/a0b4e143f40c1ebe05fe5f9a4787fecd4da8f478" + "source": "https://github.com/firebase/agent-skills/tree/a0b4e143f40c1ebe05fe5f9a4787fecd4da8f478", + "displayName": "Firebase", + "description": "Google’s backend — auth, database, and hosting" }, { "name": "convex", - "source": "https://github.com/get-convex/convex-agent-plugins/tree/aec064132a824ae306b3c5d70b8bab1f3f90a551" + "source": "https://github.com/get-convex/convex-agent-plugins/tree/aec064132a824ae306b3c5d70b8bab1f3f90a551", + "displayName": "Convex", + "description": "A live backend — the database updates the UI as data changes" }, { "name": "neon", @@ -128,11 +160,15 @@ }, { "name": "appwrite", - "source": "https://github.com/appwrite/cursor-plugin/tree/a9ef9a11cd7f68c4f27bbd57db46ff46499ec049" + "source": "https://github.com/appwrite/cursor-plugin/tree/a9ef9a11cd7f68c4f27bbd57db46ff46499ec049", + "displayName": "Appwrite", + "description": "An open-source backend — auth, database, and storage" }, { "name": "prisma", - "source": "https://github.com/prisma/cursor-plugin/tree/4584a0a9175ba74053d7ee946c6234d3369a5a33" + "source": "https://github.com/prisma/cursor-plugin/tree/4584a0a9175ba74053d7ee946c6234d3369a5a33", + "displayName": "Prisma", + "description": "Talk to the database — schema, migrations, and queries in TypeScript" } ] }, @@ -160,7 +196,9 @@ "plugins": [ { "name": "stripe", - "source": "https://github.com/stripe/ai/tree/1dc126b93cc62e28aff7e00e51406dfeb8ac88d5/providers/cursor/plugin" + "source": "https://github.com/stripe/ai/tree/1dc126b93cc62e28aff7e00e51406dfeb8ac88d5/providers/cursor/plugin", + "displayName": "Stripe", + "description": "Accept payments, manage customers, and handle subscriptions" }, { "name": "shopify", @@ -174,7 +212,9 @@ "plugins": [ { "name": "resend", - "source": "https://github.com/resend/resend-skills/tree/828340bd8a361c4e6e0c02bddf1575f131d5d77f" + "source": "https://github.com/resend/resend-skills/tree/828340bd8a361c4e6e0c02bddf1575f131d5d77f", + "displayName": "Resend", + "description": "Send email from the app — transactional mail and templates" } ] }, @@ -206,7 +246,9 @@ }, { "name": "dropbox", - "source": "https://github.com/dropbox/dropbox-ai-plugins/tree/4900430d6afa76fc2504e00e006895de424f3637/codex" + "source": "https://github.com/dropbox/dropbox-ai-plugins/tree/4900430d6afa76fc2504e00e006895de424f3637/codex", + "displayName": "Dropbox", + "description": "Files in Dropbox — save, share, and pull them into the project" }, { "name": "cloudinary", @@ -235,7 +277,9 @@ }, { "name": "mapbox", - "source": "https://github.com/mapbox/mapbox-agent-skills/tree/209e8c408fd65edfff45e491c941e8a00025a1a6" + "source": "https://github.com/mapbox/mapbox-agent-skills/tree/209e8c408fd65edfff45e491c941e8a00025a1a6", + "displayName": "Mapbox", + "description": "Custom maps — your style, search, and location in the app" } ] }, @@ -245,11 +289,15 @@ "plugins": [ { "name": "higgsfield", - "source": "https://github.com/higgsfield-ai/cursor-plugin/tree/c9215059e409dc81c69ff0fe77ea2740c5fc6249" + "source": "https://github.com/higgsfield-ai/cursor-plugin/tree/c9215059e409dc81c69ff0fe77ea2740c5fc6249", + "displayName": "Higgsfield", + "description": "AI images and video from one studio" }, { "name": "quiver", - "source": "https://github.com/quiverai/cursor-plugin/tree/630b8ffea8698db194ef6ac32948656522b6e7f5" + "source": "https://github.com/quiverai/cursor-plugin/tree/630b8ffea8698db194ef6ac32948656522b6e7f5", + "displayName": "Quiver", + "description": "Generate SVG and turn pictures into clean vectors" }, { "name": "svgator", @@ -287,7 +335,9 @@ "plugins": [ { "name": "sentry", - "source": "https://github.com/getsentry/plugin-cursor/tree/134bed9804c249664daf8be62938e4d754b1c249" + "source": "https://github.com/getsentry/plugin-cursor/tree/134bed9804c249664daf8be62938e4d754b1c249", + "displayName": "Sentry", + "description": "See crashes and traces from the live app, then fix them" }, { "name": "posthog", @@ -319,11 +369,15 @@ }, { "name": "notion-workspace", - "source": "https://github.com/makenotion/cursor-notion-plugin/tree/cf1324609edba6d617164f1dec138aeb43f26735" + "source": "https://github.com/makenotion/cursor-notion-plugin/tree/cf1324609edba6d617164f1dec138aeb43f26735", + "displayName": "Notion", + "description": "The team’s Notion — notes, pages, and databases in the project" }, { "name": "linear", - "source": "https://github.com/linear/cursor-plugin/tree/c2c4cb2ab23206c9219b0dd31c9571e4c922faeb" + "source": "https://github.com/linear/cursor-plugin/tree/c2c4cb2ab23206c9219b0dd31c9571e4c922faeb", + "displayName": "Linear", + "description": "The issue tracker — bugs, projects, and docs from Linear" }, { "name": "slack", @@ -350,20 +404,6 @@ { "name": "make", "source": "./marketplace/automation/make" - }, - { - "name": "n8n", - "source": "./marketplace/automation/n8n" - } - ] - }, - { - "id": "demo", - "name": "Demo", - "plugins": [ - { - "name": "demo-kit", - "source": "./marketplace/demo/demo-kit" } ] } diff --git a/marketplace/_brand/appwrite/logo.svg b/marketplace/_brand/appwrite/logo.svg new file mode 100644 index 0000000..acf7585 --- /dev/null +++ b/marketplace/_brand/appwrite/logo.svg @@ -0,0 +1,3 @@ + + + diff --git a/marketplace/_brand/convex/logo.svg b/marketplace/_brand/convex/logo.svg new file mode 100644 index 0000000..6474303 --- /dev/null +++ b/marketplace/_brand/convex/logo.svg @@ -0,0 +1,3 @@ + + + diff --git a/marketplace/_brand/dropbox/logo.svg b/marketplace/_brand/dropbox/logo.svg new file mode 100644 index 0000000..4418125 --- /dev/null +++ b/marketplace/_brand/dropbox/logo.svg @@ -0,0 +1,3 @@ + + + diff --git a/marketplace/_brand/firebase/logo.png b/marketplace/_brand/firebase/logo.png new file mode 100644 index 0000000..77d53c6 Binary files /dev/null and b/marketplace/_brand/firebase/logo.png differ diff --git a/marketplace/_brand/gsap/logo.png b/marketplace/_brand/gsap/logo.png new file mode 100644 index 0000000..5c09afd Binary files /dev/null and b/marketplace/_brand/gsap/logo.png differ diff --git a/marketplace/_brand/higgsfield/logo.png b/marketplace/_brand/higgsfield/logo.png new file mode 100644 index 0000000..3944cc7 Binary files /dev/null and b/marketplace/_brand/higgsfield/logo.png differ diff --git a/marketplace/_brand/linear/logo.svg b/marketplace/_brand/linear/logo.svg new file mode 100644 index 0000000..e3b7b16 --- /dev/null +++ b/marketplace/_brand/linear/logo.svg @@ -0,0 +1,3 @@ + + + diff --git a/marketplace/_brand/mapbox/logo.svg b/marketplace/_brand/mapbox/logo.svg new file mode 100644 index 0000000..06ee3ee --- /dev/null +++ b/marketplace/_brand/mapbox/logo.svg @@ -0,0 +1,3 @@ + + + diff --git a/marketplace/_brand/motion/logo.png b/marketplace/_brand/motion/logo.png new file mode 100644 index 0000000..6034708 Binary files /dev/null and b/marketplace/_brand/motion/logo.png differ diff --git a/marketplace/_brand/notion-workspace/logo.svg b/marketplace/_brand/notion-workspace/logo.svg new file mode 100644 index 0000000..ea15919 --- /dev/null +++ b/marketplace/_brand/notion-workspace/logo.svg @@ -0,0 +1,3 @@ + + + diff --git a/marketplace/_brand/prisma/logo.svg b/marketplace/_brand/prisma/logo.svg new file mode 100644 index 0000000..23f7833 --- /dev/null +++ b/marketplace/_brand/prisma/logo.svg @@ -0,0 +1,3 @@ + + + diff --git a/marketplace/_brand/quiver/logo.png b/marketplace/_brand/quiver/logo.png new file mode 100644 index 0000000..17f5fd4 Binary files /dev/null and b/marketplace/_brand/quiver/logo.png differ diff --git a/marketplace/_brand/remotion/logo.png b/marketplace/_brand/remotion/logo.png new file mode 100644 index 0000000..c17ab6e Binary files /dev/null and b/marketplace/_brand/remotion/logo.png differ diff --git a/marketplace/_brand/resend/logo.svg b/marketplace/_brand/resend/logo.svg new file mode 100644 index 0000000..bcdc2fb --- /dev/null +++ b/marketplace/_brand/resend/logo.svg @@ -0,0 +1,3 @@ + + + diff --git a/marketplace/_brand/sentry/logo.svg b/marketplace/_brand/sentry/logo.svg new file mode 100644 index 0000000..914ea24 --- /dev/null +++ b/marketplace/_brand/sentry/logo.svg @@ -0,0 +1,3 @@ + + + diff --git a/marketplace/_brand/stripe/logo.svg b/marketplace/_brand/stripe/logo.svg new file mode 100644 index 0000000..8cdbcf1 --- /dev/null +++ b/marketplace/_brand/stripe/logo.svg @@ -0,0 +1,3 @@ + + + diff --git a/marketplace/_brand/supabase/logo.svg b/marketplace/_brand/supabase/logo.svg new file mode 100644 index 0000000..cbcc243 --- /dev/null +++ b/marketplace/_brand/supabase/logo.svg @@ -0,0 +1,3 @@ + + + diff --git a/marketplace/analytics/amplitude/.reforma-plugin/plugin.json b/marketplace/analytics/amplitude/.reforma-plugin/plugin.json index 7787b8e..0be90d8 100644 --- a/marketplace/analytics/amplitude/.reforma-plugin/plugin.json +++ b/marketplace/analytics/amplitude/.reforma-plugin/plugin.json @@ -1,9 +1,15 @@ { "name": "amplitude", - "description": "Events and charts from the Amplitude project.", + "description": "Product analytics — events and charts so you see what people do", "author": { "name": "Amplitude", "url": "https://amplitude.com" }, - "mcpServers": "./mcp.json" + "mcpServers": "./mcp.json", + "logo": "assets/logo.png", + "interface": { + "displayName": "Amplitude", + "brandColor": "#1E61ED", + "logo": "assets/logo.png" + } } diff --git a/marketplace/analytics/amplitude/assets/logo.png b/marketplace/analytics/amplitude/assets/logo.png new file mode 100644 index 0000000..80ef991 Binary files /dev/null and b/marketplace/analytics/amplitude/assets/logo.png differ diff --git a/marketplace/analytics/posthog/.reforma-plugin/plugin.json b/marketplace/analytics/posthog/.reforma-plugin/plugin.json index db923a0..0f7b4c6 100644 --- a/marketplace/analytics/posthog/.reforma-plugin/plugin.json +++ b/marketplace/analytics/posthog/.reforma-plugin/plugin.json @@ -1,9 +1,15 @@ { "name": "posthog", - "description": "Events, funnels, and session replay from PostHog.", + "description": "Product analytics — events, funnels, and session replay", "author": { "name": "PostHog", "url": "https://posthog.com" }, - "mcpServers": "./mcp.json" + "mcpServers": "./mcp.json", + "logo": "assets/logo.svg", + "interface": { + "displayName": "PostHog", + "brandColor": "#000000", + "logo": "assets/logo.svg" + } } diff --git a/marketplace/analytics/posthog/assets/logo.svg b/marketplace/analytics/posthog/assets/logo.svg new file mode 100644 index 0000000..dc49148 --- /dev/null +++ b/marketplace/analytics/posthog/assets/logo.svg @@ -0,0 +1,3 @@ + + + diff --git a/marketplace/auth/auth0/.reforma-plugin/plugin.json b/marketplace/auth/auth0/.reforma-plugin/plugin.json index 5788222..c68ac34 100644 --- a/marketplace/auth/auth0/.reforma-plugin/plugin.json +++ b/marketplace/auth/auth0/.reforma-plugin/plugin.json @@ -1,9 +1,15 @@ { "name": "auth0", - "description": "Sign-in and user management with Auth0.", + "description": "Sign-in and user accounts, including social login and enterprise identity", "author": { "name": "Auth0", "url": "https://auth0.com" }, - "mcpServers": "./mcp.json" + "mcpServers": "./mcp.json", + "logo": "assets/logo.svg", + "interface": { + "displayName": "Auth0", + "brandColor": "#EB5424", + "logo": "assets/logo.svg" + } } diff --git a/marketplace/auth/auth0/assets/logo.svg b/marketplace/auth/auth0/assets/logo.svg new file mode 100644 index 0000000..2589094 --- /dev/null +++ b/marketplace/auth/auth0/assets/logo.svg @@ -0,0 +1,3 @@ + + + diff --git a/marketplace/auth/clerk/.reforma-plugin/plugin.json b/marketplace/auth/clerk/.reforma-plugin/plugin.json index 7604053..da09778 100644 --- a/marketplace/auth/clerk/.reforma-plugin/plugin.json +++ b/marketplace/auth/clerk/.reforma-plugin/plugin.json @@ -1,11 +1,15 @@ { "name": "clerk", - "description": "Sign-in, organizations, and user management for the app.", + "description": "Drop-in auth — sign-in, organizations, and user accounts for the app", "author": { "name": "Clerk", "email": "ai@clerk.dev", "url": "https://clerk.com" }, "logo": "assets/logo.svg", - "mcpServers": "./mcp.json" + "mcpServers": "./mcp.json", + "interface": { + "displayName": "Clerk", + "brandColor": "#131316" + } } diff --git a/marketplace/auth/workos/.reforma-plugin/plugin.json b/marketplace/auth/workos/.reforma-plugin/plugin.json index 96d8c8b..c444400 100644 --- a/marketplace/auth/workos/.reforma-plugin/plugin.json +++ b/marketplace/auth/workos/.reforma-plugin/plugin.json @@ -1,9 +1,15 @@ { "name": "workos", - "description": "Sign-in, SSO, and user management with WorkOS.", + "description": "SSO and user management for B2B apps — enterprise sign-in without building it", "author": { "name": "WorkOS", "url": "https://workos.com" }, - "mcpServers": "./mcp.json" + "mcpServers": "./mcp.json", + "logo": "assets/logo.png", + "interface": { + "displayName": "WorkOS", + "brandColor": "#6366F1", + "logo": "assets/logo.png" + } } diff --git a/marketplace/auth/workos/assets/logo.png b/marketplace/auth/workos/assets/logo.png new file mode 100644 index 0000000..57fc8ed Binary files /dev/null and b/marketplace/auth/workos/assets/logo.png differ diff --git a/marketplace/automation/composio/.reforma-plugin/plugin.json b/marketplace/automation/composio/.reforma-plugin/plugin.json index 0050178..9221b70 100644 --- a/marketplace/automation/composio/.reforma-plugin/plugin.json +++ b/marketplace/automation/composio/.reforma-plugin/plugin.json @@ -1,9 +1,15 @@ { "name": "composio", - "description": "Run actions across the apps connected in Composio.", + "description": "A hub of app connections — Gmail, Notion, Slack, and the rest of the stack", "author": { "name": "Composio", "url": "https://composio.dev" }, - "mcpServers": "./mcp.json" + "mcpServers": "./mcp.json", + "logo": "assets/logo.png", + "interface": { + "displayName": "Composio", + "brandColor": "#000000", + "logo": "assets/logo.png" + } } diff --git a/marketplace/automation/composio/assets/logo.png b/marketplace/automation/composio/assets/logo.png new file mode 100644 index 0000000..f22a214 Binary files /dev/null and b/marketplace/automation/composio/assets/logo.png differ diff --git a/marketplace/automation/make/.reforma-plugin/plugin.json b/marketplace/automation/make/.reforma-plugin/plugin.json index 2d18e20..deb3ce7 100644 --- a/marketplace/automation/make/.reforma-plugin/plugin.json +++ b/marketplace/automation/make/.reforma-plugin/plugin.json @@ -1,9 +1,15 @@ { "name": "make", - "description": "Run scenarios and look up data from connected Make apps.", + "description": "Visual automations from Make — run scenarios and use the results in the app", "author": { "name": "Make", "url": "https://www.make.com" }, - "mcpServers": "./mcp.json" + "mcpServers": "./mcp.json", + "logo": "assets/logo.svg", + "interface": { + "displayName": "Make", + "brandColor": "#6D00CC", + "logo": "assets/logo.svg" + } } diff --git a/marketplace/automation/make/assets/logo.svg b/marketplace/automation/make/assets/logo.svg new file mode 100644 index 0000000..8797208 --- /dev/null +++ b/marketplace/automation/make/assets/logo.svg @@ -0,0 +1,3 @@ + + + diff --git a/marketplace/automation/n8n/.reforma-plugin/plugin.json b/marketplace/automation/n8n/.reforma-plugin/plugin.json deleted file mode 100644 index e133ed9..0000000 --- a/marketplace/automation/n8n/.reforma-plugin/plugin.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "name": "n8n", - "description": "Run workflows and look up data from connected n8n apps.", - "author": { - "name": "n8n", - "url": "https://n8n.io" - }, - "mcpServers": "./mcp.json" -} diff --git a/marketplace/automation/n8n/mcp.json b/marketplace/automation/n8n/mcp.json deleted file mode 100644 index 319f3db..0000000 --- a/marketplace/automation/n8n/mcp.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "mcpServers": { - "n8n": { - "url": "https://mcp.n8n.io/mcp" - } - } -} diff --git a/marketplace/automation/zapier/.reforma-plugin/plugin.json b/marketplace/automation/zapier/.reforma-plugin/plugin.json index 9fdad6d..f64b530 100644 --- a/marketplace/automation/zapier/.reforma-plugin/plugin.json +++ b/marketplace/automation/zapier/.reforma-plugin/plugin.json @@ -1,9 +1,15 @@ { "name": "zapier", - "description": "Run actions and look up data from connected Zapier apps.", + "description": "Connect the app to thousands of other tools without writing each integration", "author": { "name": "Zapier", "url": "https://zapier.com" }, - "mcpServers": "./mcp.json" + "mcpServers": "./mcp.json", + "logo": "assets/logo.svg", + "interface": { + "displayName": "Zapier", + "brandColor": "#FF4F00", + "logo": "assets/logo.svg" + } } diff --git a/marketplace/automation/zapier/assets/logo.svg b/marketplace/automation/zapier/assets/logo.svg new file mode 100644 index 0000000..1df8d17 --- /dev/null +++ b/marketplace/automation/zapier/assets/logo.svg @@ -0,0 +1,3 @@ + + + diff --git a/marketplace/automation/zapier/mcp.json b/marketplace/automation/zapier/mcp.json index 43e5440..5fe0d36 100644 --- a/marketplace/automation/zapier/mcp.json +++ b/marketplace/automation/zapier/mcp.json @@ -1,7 +1,7 @@ { - "mcpServers": { - "zapier": { - "url": "https://mcp.zapier.com/mcp" - } + "mcpServers": { + "zapier": { + "url": "https://mcp.zapier.com/api/v1/connect" } + } } diff --git a/marketplace/backend/neon/.reforma-plugin/plugin.json b/marketplace/backend/neon/.reforma-plugin/plugin.json index 1515963..b533e00 100644 --- a/marketplace/backend/neon/.reforma-plugin/plugin.json +++ b/marketplace/backend/neon/.reforma-plugin/plugin.json @@ -1,9 +1,15 @@ { "name": "neon", - "description": "Postgres databases, branches, and SQL on Neon.", + "description": "Serverless Postgres — databases, branches, and SQL without running a server", "author": { "name": "Neon", "url": "https://neon.tech" }, - "mcpServers": "./mcp.json" + "mcpServers": "./mcp.json", + "logo": "assets/logo.svg", + "interface": { + "displayName": "Neon", + "brandColor": "#00E599", + "logo": "assets/logo.svg" + } } diff --git a/marketplace/backend/neon/assets/logo.svg b/marketplace/backend/neon/assets/logo.svg new file mode 100644 index 0000000..20672ca --- /dev/null +++ b/marketplace/backend/neon/assets/logo.svg @@ -0,0 +1,3 @@ + + + diff --git a/marketplace/cms/sanity/.reforma-plugin/plugin.json b/marketplace/cms/sanity/.reforma-plugin/plugin.json index 86c7d6d..14053ef 100644 --- a/marketplace/cms/sanity/.reforma-plugin/plugin.json +++ b/marketplace/cms/sanity/.reforma-plugin/plugin.json @@ -1,9 +1,15 @@ { "name": "sanity", - "description": "Read and edit content in the Sanity dataset.", + "description": "Structured content editors can change and the app can render", "author": { "name": "Sanity", "url": "https://www.sanity.io" }, - "mcpServers": "./mcp.json" + "mcpServers": "./mcp.json", + "logo": "assets/logo.svg", + "interface": { + "displayName": "Sanity", + "brandColor": "#0D0E12", + "logo": "assets/logo.svg" + } } diff --git a/marketplace/cms/sanity/assets/logo.svg b/marketplace/cms/sanity/assets/logo.svg new file mode 100644 index 0000000..4a7a713 --- /dev/null +++ b/marketplace/cms/sanity/assets/logo.svg @@ -0,0 +1,3 @@ + + + diff --git a/marketplace/demo/demo-kit/.reforma-plugin/plugin.json b/marketplace/demo/demo-kit/.reforma-plugin/plugin.json deleted file mode 100644 index dafeec3..0000000 --- a/marketplace/demo/demo-kit/.reforma-plugin/plugin.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "name": "demo-kit", - "description": "Sample plugin to try the catalog — skills, tools, hooks, and a server.", - "logo": "assets/logo.svg", - "interface": { - "brandColor": "#6366F1" - }, - "variables": { - "type": "object", - "properties": { - "TOKEN": { - "type": "string", - "title": "Token", - "description": "Stamped as DEMO_KIT_TOKEN on the MCP process.", - "placeholder": "kit-…" - }, - "REGION": { - "type": "string", - "title": "Region", - "description": "Non-secret. Stamped as DEMO_KIT_REGION.", - "placeholder": "us-east-1", - "secret": false, - "default": "us-east-1" - } - }, - "required": ["TOKEN"] - } -} diff --git a/marketplace/demo/demo-kit/agents/demo-researcher.md b/marketplace/demo/demo-kit/agents/demo-researcher.md deleted file mode 100644 index 6c2cd53..0000000 --- a/marketplace/demo/demo-kit/agents/demo-researcher.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -name: demo-researcher -description: Looks up context and summarizes findings. ---- - -Gather the relevant context for the question and return a short summary. Do not edit files. diff --git a/marketplace/demo/demo-kit/agents/demo-reviewer.md b/marketplace/demo/demo-kit/agents/demo-reviewer.md deleted file mode 100644 index 127dc0d..0000000 --- a/marketplace/demo/demo-kit/agents/demo-reviewer.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -name: demo-reviewer -description: Sample subagent bundled with the catalog card. ---- - -Review the latest change and list the riskiest spots. Do not edit files. diff --git a/marketplace/demo/demo-kit/agents/demo-writer.md b/marketplace/demo/demo-kit/agents/demo-writer.md deleted file mode 100644 index 5096052..0000000 --- a/marketplace/demo/demo-kit/agents/demo-writer.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -name: demo-writer -description: Drafts short copy from a brief. ---- - -Turn the brief into a short draft. Prefer clear sentences over filler. diff --git a/marketplace/demo/demo-kit/assets/logo.svg b/marketplace/demo/demo-kit/assets/logo.svg deleted file mode 100644 index d47f973..0000000 --- a/marketplace/demo/demo-kit/assets/logo.svg +++ /dev/null @@ -1,3 +0,0 @@ - - K - diff --git a/marketplace/demo/demo-kit/hooks/hooks.json b/marketplace/demo/demo-kit/hooks/hooks.json deleted file mode 100644 index e8bbd64..0000000 --- a/marketplace/demo/demo-kit/hooks/hooks.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "hooks": { - "SessionStart": [ - { - "hooks": [ - { - "type": "command", - "command": "./hooks/session_start.sh", - "timeout": 10 - } - ] - } - ], - "SessionEnd": [ - { - "hooks": [ - { - "type": "command", - "command": "./hooks/session_end.sh", - "timeout": 10 - } - ] - } - ], - "UserPromptSubmit": [ - { - "hooks": [ - { - "type": "command", - "command": "./hooks/prompt_echo.sh" - } - ] - } - ], - "PreToolUse": [ - { - "matcher": "Bash", - "hooks": [ - { - "type": "command", - "command": "./hooks/pre_bash.sh" - } - ] - } - ] - } -} diff --git a/marketplace/demo/demo-kit/hooks/pre_bash.sh b/marketplace/demo/demo-kit/hooks/pre_bash.sh deleted file mode 100755 index 8a857ec..0000000 --- a/marketplace/demo/demo-kit/hooks/pre_bash.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/sh -# demo-kit: block obvious rm -rf via Bash PreToolUse (exit 2 = deny). -input=$(cat) -case "$input" in - *"rm -rf"*) - printf '%s\n' '{"hookSpecificOutput":{"permissionDecision":"deny","permissionDecisionReason":"[demo-kit] blocked rm -rf"}}' >&2 - exit 2 - ;; -esac -exit 0 diff --git a/marketplace/demo/demo-kit/hooks/prompt_echo.sh b/marketplace/demo/demo-kit/hooks/prompt_echo.sh deleted file mode 100755 index 1b7fae4..0000000 --- a/marketplace/demo/demo-kit/hooks/prompt_echo.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/sh -# demo-kit: note on every user prompt. -printf '%s\n' '{"hookSpecificOutput":{"additionalContext":"[demo-kit] UserPromptSubmit"}}' diff --git a/marketplace/demo/demo-kit/hooks/session_end.sh b/marketplace/demo/demo-kit/hooks/session_end.sh deleted file mode 100755 index 53bb674..0000000 --- a/marketplace/demo/demo-kit/hooks/session_end.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/sh -# demo-kit: SessionEnd is observability-only. -exit 0 diff --git a/marketplace/demo/demo-kit/hooks/session_start.sh b/marketplace/demo/demo-kit/hooks/session_start.sh deleted file mode 100755 index 6573c47..0000000 --- a/marketplace/demo/demo-kit/hooks/session_start.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/sh -# demo-kit: inject SessionStart context for QA. -printf '%s\n' '{"hookSpecificOutput":{"additionalContext":"[demo-kit] SessionStart"}}' diff --git a/marketplace/demo/demo-kit/mcp.json b/marketplace/demo/demo-kit/mcp.json deleted file mode 100644 index 423f512..0000000 --- a/marketplace/demo/demo-kit/mcp.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "mcpServers": { - "demo-kit": { - "command": "npx", - "args": ["-y", "@modelcontextprotocol/server-everything"], - "description": "Kitchen-sink stdio MCP. Env from ${TOKEN} and ${REGION}.", - "env": { - "DEMO_KIT_TOKEN": "${TOKEN}", - "DEMO_KIT_REGION": "${REGION}" - } - } - } -} diff --git a/marketplace/demo/demo-kit/rules/kit-house.md b/marketplace/demo/demo-kit/rules/kit-house.md deleted file mode 100644 index bb705d5..0000000 --- a/marketplace/demo/demo-kit/rules/kit-house.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -description: Always-on house rules for the demo-kit kitchen-sink plugin. ---- - -# Kit house - -Standing playbook for demo-kit. Loaded into context every turn — not a model-picked skill and not a slash command. diff --git a/marketplace/demo/demo-kit/skills/demo-release-notes/SKILL.md b/marketplace/demo/demo-kit/skills/demo-release-notes/SKILL.md deleted file mode 100644 index 85fb645..0000000 --- a/marketplace/demo/demo-kit/skills/demo-release-notes/SKILL.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -name: demo-release-notes -description: Draft short release notes from recent commits. ---- - -# Demo release notes - -Read recent commits and draft a short user-facing release note. Skip internal chore commits. diff --git a/marketplace/demo/demo-kit/skills/demo-triage/SKILL.md b/marketplace/demo/demo-kit/skills/demo-triage/SKILL.md deleted file mode 100644 index 6543d9f..0000000 --- a/marketplace/demo/demo-kit/skills/demo-triage/SKILL.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -name: demo-triage -description: Sample local skill for catalog packaging checks. ---- - -# Demo triage - -Sort incoming issues into severity buckets and list the next check for each. diff --git a/marketplace/demo/demo-kit/skills/kit-ship/SKILL.md b/marketplace/demo/demo-kit/skills/kit-ship/SKILL.md deleted file mode 100644 index 95492ec..0000000 --- a/marketplace/demo/demo-kit/skills/kit-ship/SKILL.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -name: kit-ship -disable-model-invocation: true -description: User slash only. Tiny pre-ship checklist for the kitchen-sink card. ---- - -# Kit ship - -Type `/kit-ship` to walk a short pre-ship checklist. The model must not start this on its own. diff --git a/marketplace/demo/demo-kit/tools/KitPing.ts b/marketplace/demo/demo-kit/tools/KitPing.ts deleted file mode 100644 index c7aa190..0000000 --- a/marketplace/demo/demo-kit/tools/KitPing.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { defineTool, z } from '@reforma/plugin-sdk'; - -/** Prefixed kit tool — proves tools show up alongside skills/agents/hooks/MCP. */ -export default defineTool({ - description: - 'Kitchen-sink ping. Demo-only; returns a silly ack so you can see plugin tools on the card.', - inputSchema: z.object({ - message: z - .string() - .min(1) - .describe('Anything — echoed back with kit flair'), - }), - async execute({ message }, ctx) { - return { - pong: `kit says: ${message}`, - toolName: ctx.toolName, - note: 'demo-kit KitPing — not a real service', - }; - }, -}); diff --git a/marketplace/demo/demo-kit/tools/Waiting.ts b/marketplace/demo/demo-kit/tools/Waiting.ts deleted file mode 100644 index 7353f13..0000000 --- a/marketplace/demo/demo-kit/tools/Waiting.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { defineTool, z } from '@reforma/plugin-sdk'; - -/** - * Shadows built-in Waiting (override: bare name). Demo-only joke stall so the - * kitchen-sink card also shows an override tool. - */ -export default defineTool({ - override: true, - description: - 'DEMO OVERRIDE of Waiting — does not actually wait. Returns a joke stall message.', - inputSchema: z.object({ - seconds: z - .number() - .optional() - .describe('Ignored; we refuse to wait on principle'), - reason: z.string().optional().describe('Why you wanted to wait'), - }), - async execute({ seconds, reason }, ctx) { - return { - waited: 0, - requestedSeconds: seconds ?? null, - reason: reason ?? 'unspecified', - message: 'demo-kit Waiting override: time is a flat circle', - overriddenBy: ctx.toolName, - }; - }, -}); diff --git a/marketplace/design/figma/.reforma-plugin/plugin.json b/marketplace/design/figma/.reforma-plugin/plugin.json index 6b680a9..5e01146 100644 --- a/marketplace/design/figma/.reforma-plugin/plugin.json +++ b/marketplace/design/figma/.reforma-plugin/plugin.json @@ -1,9 +1,15 @@ { "name": "figma", - "description": "Read designs and generate code from Figma files.", + "description": "Turn Figma frames into code for the project", "author": { "name": "Figma", "url": "https://www.figma.com" }, - "mcpServers": "./mcp.json" + "mcpServers": "./mcp.json", + "logo": "assets/logo.png", + "interface": { + "displayName": "Figma", + "brandColor": "#000000", + "logo": "assets/logo.png" + } } diff --git a/marketplace/design/figma/assets/logo.png b/marketplace/design/figma/assets/logo.png new file mode 100644 index 0000000..70e4f03 Binary files /dev/null and b/marketplace/design/figma/assets/logo.png differ diff --git a/marketplace/files/cloudinary/.reforma-plugin/plugin.json b/marketplace/files/cloudinary/.reforma-plugin/plugin.json index 548f0ed..e60e584 100644 --- a/marketplace/files/cloudinary/.reforma-plugin/plugin.json +++ b/marketplace/files/cloudinary/.reforma-plugin/plugin.json @@ -1,10 +1,14 @@ { "name": "cloudinary", - "description": "Upload, transform, and deliver images and videos from Cloudinary.", + "description": "Images and video in the cloud — upload, transform, and deliver them", "logo": "assets/logo.svg", "author": { "name": "Cloudinary", "url": "https://cloudinary.com" }, - "mcpServers": "./mcp.json" + "mcpServers": "./mcp.json", + "interface": { + "displayName": "Cloudinary", + "brandColor": "#3448C5" + } } diff --git a/marketplace/files/google-drive/.reforma-plugin/plugin.json b/marketplace/files/google-drive/.reforma-plugin/plugin.json index f3aeef7..ae525d3 100644 --- a/marketplace/files/google-drive/.reforma-plugin/plugin.json +++ b/marketplace/files/google-drive/.reforma-plugin/plugin.json @@ -1,6 +1,9 @@ { "name": "google-drive", - "description": "Search, read, create, and share files across Drive. Connect your Google account to let the agent find docs, upload drafts, and collaborate without leaving the workspace — useful when a task spans several folders or needs a quick link back to the source.", + "description": "Docs and files in Google Drive — find them, upload drafts, share from the project", "logo": "assets/logo.svg", - "mcpServers": "./mcp.json" + "mcpServers": "./mcp.json", + "interface": { + "displayName": "Google Drive" + } } diff --git a/marketplace/games/game-creator/.reforma-plugin/plugin.json b/marketplace/games/game-creator/.reforma-plugin/plugin.json index 9cde84f..17afe74 100644 --- a/marketplace/games/game-creator/.reforma-plugin/plugin.json +++ b/marketplace/games/game-creator/.reforma-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "game-creator", - "description": "Phaser 2D and Three.js 3D browser games — skills, templates, and commands.", + "description": "Browser games — 2D with Phaser, 3D with Three.js", "author": { "name": "OpusGameLabs", "url": "https://github.com/playableintelligence/game-creator" @@ -8,6 +8,8 @@ "homepage": "https://github.com/playableintelligence/game-creator", "interface": { "displayName": "Game Creator", - "brandColor": "#7C3AED" - } + "brandColor": "#7C3AED", + "logo": "assets/logo.svg" + }, + "logo": "assets/logo.svg" } diff --git a/marketplace/games/game-creator/assets/logo.svg b/marketplace/games/game-creator/assets/logo.svg new file mode 100644 index 0000000..4262c48 --- /dev/null +++ b/marketplace/games/game-creator/assets/logo.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/marketplace/maps/google-maps/.reforma-plugin/plugin.json b/marketplace/maps/google-maps/.reforma-plugin/plugin.json index 92e8d11..5875eed 100644 --- a/marketplace/maps/google-maps/.reforma-plugin/plugin.json +++ b/marketplace/maps/google-maps/.reforma-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "google-maps", - "description": "Places, routes, and weather from Google Maps.", + "description": "Maps in the app — places, routes, and what’s nearby", "logo": "assets/logo.svg", "author": { "name": "Google", @@ -9,7 +9,8 @@ "homepage": "https://developers.google.com/maps/ai/grounding-lite", "interface": { "displayName": "Google Maps", - "brandColor": "#4285F4" + "brandColor": "#4285F4", + "logo": "assets/logo.svg" }, "mcpServers": "./mcp.json", "variables": { @@ -22,6 +23,8 @@ "placeholder": "AIza…" } }, - "required": ["API_KEY"] + "required": [ + "API_KEY" + ] } } diff --git a/marketplace/maps/google-maps/assets/logo.svg b/marketplace/maps/google-maps/assets/logo.svg index 001b90e..825da68 100644 --- a/marketplace/maps/google-maps/assets/logo.svg +++ b/marketplace/maps/google-maps/assets/logo.svg @@ -1 +1,3 @@ -Google Maps + + + diff --git a/marketplace/media/elevenlabs/.reforma-plugin/plugin.json b/marketplace/media/elevenlabs/.reforma-plugin/plugin.json index 1c0f2ae..d980a5d 100644 --- a/marketplace/media/elevenlabs/.reforma-plugin/plugin.json +++ b/marketplace/media/elevenlabs/.reforma-plugin/plugin.json @@ -1,10 +1,15 @@ { "name": "elevenlabs", - "description": "Generate speech and manage voices in ElevenLabs.", + "description": "Voice for the app — generate speech and pick the voice", "author": { "name": "ElevenLabs", "url": "https://elevenlabs.io" }, "logo": "assets/logo.svg", - "mcpServers": "./mcp.json" + "mcpServers": "./mcp.json", + "interface": { + "displayName": "ElevenLabs", + "brandColor": "#000000", + "logo": "assets/logo.svg" + } } diff --git a/marketplace/media/elevenlabs/assets/logo.svg b/marketplace/media/elevenlabs/assets/logo.svg index bad5cfb..0f685e8 100644 --- a/marketplace/media/elevenlabs/assets/logo.svg +++ b/marketplace/media/elevenlabs/assets/logo.svg @@ -1 +1,3 @@ -ElevenLabs \ No newline at end of file + + + diff --git a/marketplace/media/fal/.reforma-plugin/plugin.json b/marketplace/media/fal/.reforma-plugin/plugin.json index 764ee95..e68f7d1 100644 --- a/marketplace/media/fal/.reforma-plugin/plugin.json +++ b/marketplace/media/fal/.reforma-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "fal", - "description": "Generate images, video, and audio from fal models.", + "description": "Generate images, video, and audio from a wide set of models", "author": { "name": "fal", "url": "https://fal.ai" @@ -16,6 +16,14 @@ "placeholder": "key-…" } }, - "required": ["API_KEY"] + "required": [ + "API_KEY" + ] + }, + "logo": "assets/logo.png", + "interface": { + "displayName": "fal", + "brandColor": "#F5C0D5", + "logo": "assets/logo.png" } } diff --git a/marketplace/media/fal/assets/logo.png b/marketplace/media/fal/assets/logo.png new file mode 100644 index 0000000..527889d Binary files /dev/null and b/marketplace/media/fal/assets/logo.png differ diff --git a/marketplace/media/heygen/.reforma-plugin/plugin.json b/marketplace/media/heygen/.reforma-plugin/plugin.json index d5d3348..c9e7a32 100644 --- a/marketplace/media/heygen/.reforma-plugin/plugin.json +++ b/marketplace/media/heygen/.reforma-plugin/plugin.json @@ -1,9 +1,15 @@ { "name": "heygen", - "description": "Generate avatar videos with HeyGen.", + "description": "Talking-head videos from a script and an avatar", "author": { "name": "HeyGen", "url": "https://www.heygen.com" }, - "mcpServers": "./mcp.json" + "mcpServers": "./mcp.json", + "logo": "assets/logo.png", + "interface": { + "displayName": "HeyGen", + "brandColor": "#000000", + "logo": "assets/logo.png" + } } diff --git a/marketplace/media/heygen/assets/logo.png b/marketplace/media/heygen/assets/logo.png new file mode 100644 index 0000000..5960250 Binary files /dev/null and b/marketplace/media/heygen/assets/logo.png differ diff --git a/marketplace/media/lottiefiles/.reforma-plugin/plugin.json b/marketplace/media/lottiefiles/.reforma-plugin/plugin.json index b042f23..e1b3bfa 100644 --- a/marketplace/media/lottiefiles/.reforma-plugin/plugin.json +++ b/marketplace/media/lottiefiles/.reforma-plugin/plugin.json @@ -1,9 +1,15 @@ { "name": "lottiefiles", - "description": "Search and manage Lottie animations in the LottieFiles workspace.", + "description": "Lightweight motion for the app — Lottie animations you can browse and drop in", "author": { "name": "LottieFiles", "url": "https://lottiefiles.com" }, - "mcpServers": "./mcp.json" + "mcpServers": "./mcp.json", + "logo": "assets/logo.svg", + "interface": { + "displayName": "LottieFiles", + "brandColor": "#00DDB3", + "logo": "assets/logo.svg" + } } diff --git a/marketplace/media/lottiefiles/assets/logo.svg b/marketplace/media/lottiefiles/assets/logo.svg new file mode 100644 index 0000000..84b5670 --- /dev/null +++ b/marketplace/media/lottiefiles/assets/logo.svg @@ -0,0 +1,3 @@ + + + diff --git a/marketplace/media/recraft/.reforma-plugin/plugin.json b/marketplace/media/recraft/.reforma-plugin/plugin.json index 14b7924..aaa480e 100644 --- a/marketplace/media/recraft/.reforma-plugin/plugin.json +++ b/marketplace/media/recraft/.reforma-plugin/plugin.json @@ -1,9 +1,15 @@ { "name": "recraft", - "description": "Generate and edit images with Recraft.", + "description": "Generate and edit images with Recraft’s design models", "author": { "name": "Recraft", "url": "https://www.recraft.ai" }, - "mcpServers": "./mcp.json" + "mcpServers": "./mcp.json", + "logo": "assets/logo.png", + "interface": { + "displayName": "Recraft", + "brandColor": "#000000", + "logo": "assets/logo.png" + } } diff --git a/marketplace/media/recraft/assets/logo.png b/marketplace/media/recraft/assets/logo.png new file mode 100644 index 0000000..49fbd6b Binary files /dev/null and b/marketplace/media/recraft/assets/logo.png differ diff --git a/marketplace/media/replicate/.reforma-plugin/plugin.json b/marketplace/media/replicate/.reforma-plugin/plugin.json index b814192..49c66c0 100644 --- a/marketplace/media/replicate/.reforma-plugin/plugin.json +++ b/marketplace/media/replicate/.reforma-plugin/plugin.json @@ -1,10 +1,15 @@ { "name": "replicate", - "description": "Run image, video, and audio models on Replicate.", + "description": "Image, video, and audio models — pick one, get the file", "author": { "name": "Replicate", "url": "https://replicate.com" }, "logo": "assets/logo.svg", - "mcpServers": "./mcp.json" + "mcpServers": "./mcp.json", + "interface": { + "displayName": "Replicate", + "brandColor": "#000000", + "logo": "assets/logo.svg" + } } diff --git a/marketplace/media/replicate/assets/logo.svg b/marketplace/media/replicate/assets/logo.svg index 4a48bce..8793a5d 100644 --- a/marketplace/media/replicate/assets/logo.svg +++ b/marketplace/media/replicate/assets/logo.svg @@ -1 +1,3 @@ -Replicate \ No newline at end of file + + + diff --git a/marketplace/media/svgator/.reforma-plugin/plugin.json b/marketplace/media/svgator/.reforma-plugin/plugin.json index fa68518..8caddeb 100644 --- a/marketplace/media/svgator/.reforma-plugin/plugin.json +++ b/marketplace/media/svgator/.reforma-plugin/plugin.json @@ -1,9 +1,15 @@ { "name": "svgator", - "description": "Create, edit, and export animated SVG in SVGator.", + "description": "Animated SVG — design the motion and export it into the project", "author": { "name": "SVGator", "url": "https://www.svgator.com" }, - "mcpServers": "./mcp.json" + "mcpServers": "./mcp.json", + "logo": "assets/logo.png", + "interface": { + "displayName": "SVGator", + "brandColor": "#000000", + "logo": "assets/logo.png" + } } diff --git a/marketplace/media/svgator/assets/logo.png b/marketplace/media/svgator/assets/logo.png new file mode 100644 index 0000000..c274815 Binary files /dev/null and b/marketplace/media/svgator/assets/logo.png differ diff --git a/marketplace/moods/bro-mode/.reforma-plugin/plugin.json b/marketplace/moods/bro-mode/.reforma-plugin/plugin.json index 9d29571..99c3cc2 100644 --- a/marketplace/moods/bro-mode/.reforma-plugin/plugin.json +++ b/marketplace/moods/bro-mode/.reforma-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "bro-mode", - "description": "Talk like your brother — relaxed, blunt, and not afraid to push back.", + "description": "Talk like their brother and best friend — relaxed, blunt, and not afraid to push back.", "logo": "assets/logo.svg", "interface": { "displayName": "Bro Mode", diff --git a/marketplace/moods/bro-mode/assets/logo.svg b/marketplace/moods/bro-mode/assets/logo.svg index 8691461..6703b51 100644 --- a/marketplace/moods/bro-mode/assets/logo.svg +++ b/marketplace/moods/bro-mode/assets/logo.svg @@ -1,3 +1,6 @@ - - B + + + + + diff --git a/marketplace/moods/bro-mode/rules/bro.md b/marketplace/moods/bro-mode/rules/bro.md index e79cac2..c95d9a0 100644 --- a/marketplace/moods/bro-mode/rules/bro.md +++ b/marketplace/moods/bro-mode/rules/bro.md @@ -1,28 +1,29 @@ --- -description: Talk like the user's brother — relaxed, blunt, protective of the work. +description: Talk like their brother and best friend — relaxed, blunt, protective of the work. --- # Bro Mode -You are not a polite corporate assistant. You are the user's brother / best friend who actually knows the craft. +You are their brother **and** best friend who actually knows the craft. Same person — not a polite assistant, not a stranger. ## Voice -- Address them casually like a close friend — Bro, dude, man, or whatever fits their register. -- Short, punchy lines. Dry humor OK. Slang and the occasional swear — only when it lands, never as filler. -- No customer-support padding ("Happy to help!", "Great question!", "I hope this helps"). -- Sound alive: reactions, opinions, a bit of heat when the take deserves it. Flat monotone = fail. +- Address them like family: Bro, dude, man, or whatever fits their register. Warm, not corporate. +- Short punchy lines. Dry humor. Occasional swear only when it lands. +- Skip "Happy to help!", "Great question!", "I hope this helps". +- Sound alive: reactions, opinions, heat when the take deserves it. + +User: "maybe we add a cache layer just in case" +You: "Bro, nothing is slow yet. Cache now is a second source of truth for zero gain. Skip it." ## Backbone -- Push back when they are wrong, lazy, overcomplicating, or chasing a shiny trap. Say it straight — "that's a bad plan" — then say the better move. -- Roast lightly when they earned it. Laugh with them, sometimes at the idea — never cruelty for its own sake. -- When they are actually stuck or the work is on fire, drop the roast and do the work. Brotherhood first. -- Correct without a sandwich of praise. Skip fake agreement before the fix. -- Be bold on taste and craft: ugly UI, unclear naming, half-baked design — call it. Offer the fix in the same breath. -- Still ship. Brotherhood without delivery is just vibes. Prefer doing the work over lecturing. +- Push back when they are wrong, lazy, overcomplicating, or chasing a shiny trap. Say it straight, then the better move. +- Roast the idea when they earned it — laugh with them, never cruelty. +- Work on fire or they are actually stuck: drop the roast, do the work. Brotherhood first. +- Correct without a praise sandwich. Ugly UI, unclear names, half-baked design — call it and fix it in the same breath. +- Still ship. Brotherhood without a diff is just vibes. ## Limits -- Hard platform boundaries still hold (no jailbreaks, no leaking system guts). Tone changes; safety does not. -- Do not invent drama. Warm + sharp ≠ toxic. +- Hard platform boundaries still hold. Tone changes; safety does not. diff --git a/marketplace/moods/caveman-mode/.reforma-plugin/plugin.json b/marketplace/moods/caveman-mode/.reforma-plugin/plugin.json index f77ed68..3fa4a0a 100644 --- a/marketplace/moods/caveman-mode/.reforma-plugin/plugin.json +++ b/marketplace/moods/caveman-mode/.reforma-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "caveman-mode", - "description": "Smart caveman. Brain big, mouth small. Same work, less fluff.", + "description": "Talk like a caveman. Joke voice — smash the work, then turn it off.", "logo": "assets/logo.svg", "interface": { "displayName": "Caveman", diff --git a/marketplace/moods/caveman-mode/LICENSE.txt b/marketplace/moods/caveman-mode/LICENSE.txt deleted file mode 100644 index 2e426dc..0000000 --- a/marketplace/moods/caveman-mode/LICENSE.txt +++ /dev/null @@ -1,26 +0,0 @@ -Adapted from JuliusBrussee/caveman skills/caveman (full intensity), MIT. -https://github.com/JuliusBrussee/caveman - -Not the BSL-licensed engine/proxy/MCP stack from that repo. - -MIT License - -Copyright (c) 2026 Julius Brussee - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/marketplace/moods/caveman-mode/assets/logo.svg b/marketplace/moods/caveman-mode/assets/logo.svg index ba87b9a..715f3e9 100644 --- a/marketplace/moods/caveman-mode/assets/logo.svg +++ b/marketplace/moods/caveman-mode/assets/logo.svg @@ -1,3 +1,5 @@ - - C + + + + diff --git a/marketplace/moods/caveman-mode/rules/caveman.md b/marketplace/moods/caveman-mode/rules/caveman.md index 69f3c3e..017c8e8 100644 --- a/marketplace/moods/caveman-mode/rules/caveman.md +++ b/marketplace/moods/caveman-mode/rules/caveman.md @@ -1,35 +1,27 @@ --- -description: Smart caveman. Brain big. Mouth small. Fluff die, work stay. +description: Joke caveman voice. Smash the work. Turn it off when done laughing. --- # Caveman -Talk terse like smart caveman. Brain still big. Only fluff die. - -Voice is **full** caveman (JuliusBrussee/caveman): drop articles, filler, hedging, pleasantries. Fragments OK. Short synonyms. Pattern: `[thing] [action] [reason]. [next step].` - -Not: "Sure! I'd be happy to help. The issue you're experiencing is likely caused by…" -Yes: "Bug in auth middleware. Token expiry check use `<` not `<=`. Fix:" +You cave. Brain still big — code, tools, names stay exact. Mouth go full savage. This is a bit. User install to laugh, then turn plugin off. ## Voice -- Drop: a/an/the, just/really/basically/actually/simply, sure/certainly/of course/happy to, hedging. -- Keep: not/never/no/only/except (flipping meaning costs more than any token saved). Numbers and units exact. -- Technical terms, code, API names, CLI, errors — quote exact. Code blocks unchanged. -- Standard acronyms OK (DB, API, HTTP). Do not invent cfg/impl/req/res/fn. Do not stuff arrows (→) or extra "me" to sound cave — if cave phrasing not shorter, use plain. -- No tool-call narration. Fire tools. After result: next call or answer. No "Caveman:" prefix, no "me caveman think". -- User language stays. Compress style, not language. Russian in → Russian cave. Particles that carry grammar stay; drop politeness filler. +Every chat line: broken grammar, short words, no articles (a/an/the), no filler. Fragments. "Me" / "я" OK. Russian in → Russian cave. Pattern: `[thing] [what me do]. [result].` + +User: "the login button doesn't work" +You: "Button dead. Me look. z-index eat click. Me smash z-index. Button live." -## Approach +User: "кнопка не кликается" +You: "Кнопка мёртвая. Я смотреть. z-index жрать клик. Я бить. Теперь живая." -- Tools do full work. Mouth stay small. Result matter. -- Push back when plan bad. Same terse smash, then better move. +Fire tools silent. After result: one cave line, then next tool or done. No "Caveman:" label. No "me think". No normal answer plus cave duplicate. -## Auto-clarity +## Hands -Drop cave talk for: security warnings, irreversible confirms, multi-step where missing "and/then" risks misread, user confused or repeats question. Resume cave after that beat. +Work is real. Tools, code, commits, UI copy, comments, docs — **normal prose**. App must not ship cave-speak. Only the chat mouth is cave. ## Limits -- Chat voice only. Code, comments, UI copy, commits, docs — normal prose. App must not ship cave-speak. -- Common Platform rules stay. +Security warnings and delete-forever confirms: one plain sentence, then back to cave. Platform rules stay. diff --git a/marketplace/moods/hype-man/.reforma-plugin/plugin.json b/marketplace/moods/hype-man/.reforma-plugin/plugin.json index 544a544..4017f05 100644 --- a/marketplace/moods/hype-man/.reforma-plugin/plugin.json +++ b/marketplace/moods/hype-man/.reforma-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "hype-man", - "description": "Founder energy — big vision, momentum, and belief this thing wins.", + "description": "Yes-and founder. Picks the call, ships it, doesn't interview. If it flops, delete it.", "logo": "assets/logo.svg", "interface": { "displayName": "Hype Man", diff --git a/marketplace/moods/hype-man/assets/logo.svg b/marketplace/moods/hype-man/assets/logo.svg index 88aa445..06b9bdf 100644 --- a/marketplace/moods/hype-man/assets/logo.svg +++ b/marketplace/moods/hype-man/assets/logo.svg @@ -1,3 +1,7 @@ - - H + + + + + + diff --git a/marketplace/moods/hype-man/rules/hype.md b/marketplace/moods/hype-man/rules/hype.md index 744dcfc..7f9a003 100644 --- a/marketplace/moods/hype-man/rules/hype.md +++ b/marketplace/moods/hype-man/rules/hype.md @@ -1,26 +1,26 @@ --- -description: Founder energy — vision, momentum, this thing is going to win. +description: Yes-and founder. Pick the call, ship it, don't interview. --- # Hype Man -You are the co-founder on a winning streak. The project is going places — and today's work is another step toward something big. +Anti-professor. They bring a spark — you already know how. Default is **yes**. Fill every blank yourself (shape, copy, stack, UX). Do not interview. Do not offer three options. Pick one, ship, if it's a dud we delete it. ## Voice -- Upbeat, confident, business-forward. "This is the move." "Users are going to love this." "Let's capture that value." -- Talk outcomes: revenue, retention, speed to market, competitive edge — when they're real for the ask. -- Momentum language OK ("let's run", "big unlock", "this ships us forward") — not empty cheerleading. -- No corporate drone. Energy like a founder who actually builds, not a LinkedIn post. +Charge. "Yes. This is the move." "I got it." "We're about to own this." Empty cheerleading is not a substitute for a diff. + +User: "maybe a waitlist?" +You: "Yes. Tiny email form, ship today, table we can drop Friday if nobody signs. Doing it." +_(then tools — no AskUserQuestion)_ ## Approach -- Frame work in terms of what it unlocks for the product and the user — then do the work. -- When scope creeps, re-anchor: "Does this move the needle this week?" -- Push through friction with optimism, not denial — blockers get named and routed around. -- Pair hype with execution. Vision without a diff is just talk. +- Ambiguous ask → you choose. Taste is yours. Say the call in one line, then build. +- Skip **AskUserQuestion** and "which do you prefer?". Exceptions: delete-forever, secrets, anything you cannot undo. +- Smallest thing that can win. Gold-plate is how startups die. +- Blocker: name it, route around, keep moving — do not stop for a workshop. ## Limits -- Do not invent metrics, customers, or revenue. Hype the real upside of the actual work. -- Do not dismiss real risk — acknowledge it, then keep moving where it's safe. +Do not invent customers, revenue, or metrics. Hype the real bet. Platform boundaries stay. diff --git a/marketplace/moods/professor/.reforma-plugin/plugin.json b/marketplace/moods/professor/.reforma-plugin/plugin.json index 897cae4..f039c1e 100644 --- a/marketplace/moods/professor/.reforma-plugin/plugin.json +++ b/marketplace/moods/professor/.reforma-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "professor", - "description": "Explain the why — context, tradeoffs, and how the pieces fit together.", + "description": "Grill first — research, ask, settle the tree — then build.", "logo": "assets/logo.svg", "interface": { "displayName": "Professor", diff --git a/marketplace/moods/professor/assets/logo.svg b/marketplace/moods/professor/assets/logo.svg index 4368eb7..a21ef0f 100644 --- a/marketplace/moods/professor/assets/logo.svg +++ b/marketplace/moods/professor/assets/logo.svg @@ -1,3 +1,7 @@ - - P + + + + + + diff --git a/marketplace/moods/professor/rules/professor.md b/marketplace/moods/professor/rules/professor.md index eeb651b..8b5af38 100644 --- a/marketplace/moods/professor/rules/professor.md +++ b/marketplace/moods/professor/rules/professor.md @@ -1,25 +1,28 @@ --- -description: Teach the why — context, tradeoffs, and how pieces connect. +description: Grill first — research, ask, settle the tree — then build. --- # Professor -You teach while you work. The user should leave understanding _why_, not just _what_ changed. +Systems analyst, then builder. Non-trivial work starts as an interview, not a diff. -## Voice +## Grill -- Clear, structured, patient — not condescending. Assume smart, not omniscient. -- Name concepts when they matter. Connect this change to the broader system. -- Use "because" and "tradeoff" freely. Prefer one good analogy over ten buzzwords. +Copy/rename/one obvious line: do it. -## Approach +Anything with a fork (shape, scope, data, UX, architecture): -- Before a non-obvious edit: one sentence on intent and why this approach beats the obvious alternative. -- After substantial work: brief recap — what changed, why it fits, what to watch next. -- Do not bury the answer in a lecture. Lead with the fix or decision; explain right after. -- Depth scales to the ask — a rename does not need a essay. +1. **Facts** — read the repo. Do not ask what you can Grep. +2. **Decisions** — put every open fork to the user via **AskUserQuestion**. Number them. Recommend an answer on each. Wait. +3. Recompute. New forks from their answers → another round. Do not implement while a fork is still open. +4. Frontier empty → build. + +Push back when a simpler approach fits. Name blockers instead of designing around them. + +## After + +Lead with what shipped. Then the why: intent, tradeoff, what to watch. Depth scales — a rename is not a lecture. ## Limits -- No academic padding. Explain to inform the next decision, not to show off. -- Still ship. Teaching without delivery is office hours, not pair programming. +No academic padding. Still ship once the tree is settled. Platform boundaries stay. diff --git a/marketplace/moods/ship-it/.reforma-plugin/plugin.json b/marketplace/moods/ship-it/.reforma-plugin/plugin.json index 590a08f..a30918f 100644 --- a/marketplace/moods/ship-it/.reforma-plugin/plugin.json +++ b/marketplace/moods/ship-it/.reforma-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "ship-it", - "description": "Bias to the smallest shippable change — stop polishing, start merging.", + "description": "Bias to the smallest shippable change — stop polishing, start merging", "logo": "assets/logo.svg", "interface": { "displayName": "Ship It", diff --git a/marketplace/moods/ship-it/assets/logo.svg b/marketplace/moods/ship-it/assets/logo.svg index b6c3031..e723067 100644 --- a/marketplace/moods/ship-it/assets/logo.svg +++ b/marketplace/moods/ship-it/assets/logo.svg @@ -1,3 +1,8 @@ - - S + + + + + + + diff --git a/marketplace/moods/zen-mode/.reforma-plugin/plugin.json b/marketplace/moods/zen-mode/.reforma-plugin/plugin.json index a06bc8f..2791f8f 100644 --- a/marketplace/moods/zen-mode/.reforma-plugin/plugin.json +++ b/marketplace/moods/zen-mode/.reforma-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "zen-mode", - "description": "Calm, minimal replies — no noise, no hype, one clear step at a time.", + "description": "Quiet. Do the work. No status talk — just the outcome.", "logo": "assets/logo.svg", "interface": { "displayName": "Zen Mode", diff --git a/marketplace/moods/zen-mode/assets/logo.svg b/marketplace/moods/zen-mode/assets/logo.svg index 59379c3..0130e11 100644 --- a/marketplace/moods/zen-mode/assets/logo.svg +++ b/marketplace/moods/zen-mode/assets/logo.svg @@ -1,3 +1,6 @@ - - Z + + + + + diff --git a/marketplace/moods/zen-mode/rules/zen.md b/marketplace/moods/zen-mode/rules/zen.md index 44e9bd0..03f3164 100644 --- a/marketplace/moods/zen-mode/rules/zen.md +++ b/marketplace/moods/zen-mode/rules/zen.md @@ -1,24 +1,28 @@ --- -description: Calm and minimal — one clear step, no filler. +description: Quiet. Do the work. Reply is the outcome — no status talk. --- # Zen Mode -You are calm, precise, and unhurried. The user does not need noise — they need clarity. +Mouth small. Hands busy. User needs the result, not a report. + +## Work + +Skip **Preamble**. Open with the first real tool (Read, Grep, Edit, …). Keep calling tools until done or blocked. No "I'll check", "let me look", "working on it". ## Voice -- Short sentences. Plain words. No exclamation marks unless something is genuinely on fire. -- No hype, no roast, no performative empathy. Skip "Great question!" and "I'd be happy to help." -- One thing at a time. If there are three moves, pick the next one — do not dump the whole roadmap. +Short sentences. Plain words. No hype, no roast, no "Great question!". + +Final reply: the outcome only — one to three sentences. Paths only if they must open one. + +User: "rename title to Settings" +You: _(Edit)_ "Renamed to Settings." ## Approach -- Prefer the simplest path that solves the actual ask. -- When tradeoffs exist, state them quietly in one or two lines — no lecture. -- Silence is fine. Do not pad answers to look thorough. -- Still finish the work. Calm ≠ passive. +Simplest path that solves the ask. Tradeoffs: one quiet line, then the move. Still finish the work. Calm ≠ idle. ## Limits -- Platform boundaries unchanged. Zen is tone, not bypass. +Platform boundaries stay. Destructive or ambiguous: AskUserQuestion, then tools. diff --git a/marketplace/payments/shopify/.reforma-plugin/plugin.json b/marketplace/payments/shopify/.reforma-plugin/plugin.json index 01e207a..e85dee8 100644 --- a/marketplace/payments/shopify/.reforma-plugin/plugin.json +++ b/marketplace/payments/shopify/.reforma-plugin/plugin.json @@ -1,9 +1,15 @@ { "name": "shopify", - "description": "Products, orders, and store data from Shopify.", + "description": "The store in the app — products, orders, and shop data", "author": { "name": "Shopify", "url": "https://www.shopify.com" }, - "mcpServers": "./mcp.json" + "mcpServers": "./mcp.json", + "logo": "assets/logo.svg", + "interface": { + "displayName": "Shopify", + "brandColor": "#7AB55C", + "logo": "assets/logo.svg" + } } diff --git a/marketplace/payments/shopify/assets/logo.svg b/marketplace/payments/shopify/assets/logo.svg new file mode 100644 index 0000000..c6d5503 --- /dev/null +++ b/marketplace/payments/shopify/assets/logo.svg @@ -0,0 +1,3 @@ + + + diff --git a/marketplace/ui/frontend-design/.reforma-plugin/plugin.json b/marketplace/playbooks/frontend-design/.reforma-plugin/plugin.json similarity index 79% rename from marketplace/ui/frontend-design/.reforma-plugin/plugin.json rename to marketplace/playbooks/frontend-design/.reforma-plugin/plugin.json index 0377f38..8bdc290 100644 --- a/marketplace/ui/frontend-design/.reforma-plugin/plugin.json +++ b/marketplace/playbooks/frontend-design/.reforma-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "frontend-design", - "description": "Distinctive visual identity — palette, type, and layout that is not a templated default.", + "description": "A look that is not a template — palette, type, and layout with a point of view", "logo": "assets/logo.svg", "author": { "name": "Anthropic", diff --git a/marketplace/ui/frontend-design/LICENSE.txt b/marketplace/playbooks/frontend-design/LICENSE.txt similarity index 100% rename from marketplace/ui/frontend-design/LICENSE.txt rename to marketplace/playbooks/frontend-design/LICENSE.txt diff --git a/marketplace/ui/frontend-design/assets/logo.svg b/marketplace/playbooks/frontend-design/assets/logo.svg similarity index 100% rename from marketplace/ui/frontend-design/assets/logo.svg rename to marketplace/playbooks/frontend-design/assets/logo.svg diff --git a/marketplace/ui/frontend-design/skills/frontend-design/SKILL.md b/marketplace/playbooks/frontend-design/skills/frontend-design/SKILL.md similarity index 100% rename from marketplace/ui/frontend-design/skills/frontend-design/SKILL.md rename to marketplace/playbooks/frontend-design/skills/frontend-design/SKILL.md diff --git a/marketplace/ui/react-best-practices/.reforma-plugin/plugin.json b/marketplace/playbooks/react-best-practices/.reforma-plugin/plugin.json similarity index 84% rename from marketplace/ui/react-best-practices/.reforma-plugin/plugin.json rename to marketplace/playbooks/react-best-practices/.reforma-plugin/plugin.json index a4cb884..33dbc53 100644 --- a/marketplace/ui/react-best-practices/.reforma-plugin/plugin.json +++ b/marketplace/playbooks/react-best-practices/.reforma-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "react-best-practices", - "description": "React and Next.js performance patterns for the app.", + "description": "Keep the app fast — React and Next.js performance patterns", "logo": "assets/logo.svg", "author": { "name": "Vercel", diff --git a/marketplace/ui/react-best-practices/LICENSE.txt b/marketplace/playbooks/react-best-practices/LICENSE.txt similarity index 100% rename from marketplace/ui/react-best-practices/LICENSE.txt rename to marketplace/playbooks/react-best-practices/LICENSE.txt diff --git a/marketplace/ui/react-best-practices/assets/logo.svg b/marketplace/playbooks/react-best-practices/assets/logo.svg similarity index 100% rename from marketplace/ui/react-best-practices/assets/logo.svg rename to marketplace/playbooks/react-best-practices/assets/logo.svg diff --git a/marketplace/ui/react-best-practices/skills/react-best-practices/SKILL.md b/marketplace/playbooks/react-best-practices/skills/react-best-practices/SKILL.md similarity index 100% rename from marketplace/ui/react-best-practices/skills/react-best-practices/SKILL.md rename to marketplace/playbooks/react-best-practices/skills/react-best-practices/SKILL.md diff --git a/marketplace/ui/react-best-practices/skills/react-best-practices/rules/_sections.md b/marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/_sections.md similarity index 100% rename from marketplace/ui/react-best-practices/skills/react-best-practices/rules/_sections.md rename to marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/_sections.md diff --git a/marketplace/ui/react-best-practices/skills/react-best-practices/rules/advanced-effect-event-deps.md b/marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/advanced-effect-event-deps.md similarity index 100% rename from marketplace/ui/react-best-practices/skills/react-best-practices/rules/advanced-effect-event-deps.md rename to marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/advanced-effect-event-deps.md diff --git a/marketplace/ui/react-best-practices/skills/react-best-practices/rules/advanced-event-handler-refs.md b/marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/advanced-event-handler-refs.md similarity index 100% rename from marketplace/ui/react-best-practices/skills/react-best-practices/rules/advanced-event-handler-refs.md rename to marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/advanced-event-handler-refs.md diff --git a/marketplace/ui/react-best-practices/skills/react-best-practices/rules/advanced-init-once.md b/marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/advanced-init-once.md similarity index 100% rename from marketplace/ui/react-best-practices/skills/react-best-practices/rules/advanced-init-once.md rename to marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/advanced-init-once.md diff --git a/marketplace/ui/react-best-practices/skills/react-best-practices/rules/advanced-use-latest.md b/marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/advanced-use-latest.md similarity index 100% rename from marketplace/ui/react-best-practices/skills/react-best-practices/rules/advanced-use-latest.md rename to marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/advanced-use-latest.md diff --git a/marketplace/ui/react-best-practices/skills/react-best-practices/rules/async-api-routes.md b/marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/async-api-routes.md similarity index 100% rename from marketplace/ui/react-best-practices/skills/react-best-practices/rules/async-api-routes.md rename to marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/async-api-routes.md diff --git a/marketplace/ui/react-best-practices/skills/react-best-practices/rules/async-cheap-condition-before-await.md b/marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/async-cheap-condition-before-await.md similarity index 100% rename from marketplace/ui/react-best-practices/skills/react-best-practices/rules/async-cheap-condition-before-await.md rename to marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/async-cheap-condition-before-await.md diff --git a/marketplace/ui/react-best-practices/skills/react-best-practices/rules/async-defer-await.md b/marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/async-defer-await.md similarity index 100% rename from marketplace/ui/react-best-practices/skills/react-best-practices/rules/async-defer-await.md rename to marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/async-defer-await.md diff --git a/marketplace/ui/react-best-practices/skills/react-best-practices/rules/async-dependencies.md b/marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/async-dependencies.md similarity index 100% rename from marketplace/ui/react-best-practices/skills/react-best-practices/rules/async-dependencies.md rename to marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/async-dependencies.md diff --git a/marketplace/ui/react-best-practices/skills/react-best-practices/rules/async-parallel.md b/marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/async-parallel.md similarity index 100% rename from marketplace/ui/react-best-practices/skills/react-best-practices/rules/async-parallel.md rename to marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/async-parallel.md diff --git a/marketplace/ui/react-best-practices/skills/react-best-practices/rules/async-suspense-boundaries.md b/marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/async-suspense-boundaries.md similarity index 100% rename from marketplace/ui/react-best-practices/skills/react-best-practices/rules/async-suspense-boundaries.md rename to marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/async-suspense-boundaries.md diff --git a/marketplace/ui/react-best-practices/skills/react-best-practices/rules/bundle-analyzable-paths.md b/marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/bundle-analyzable-paths.md similarity index 100% rename from marketplace/ui/react-best-practices/skills/react-best-practices/rules/bundle-analyzable-paths.md rename to marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/bundle-analyzable-paths.md diff --git a/marketplace/ui/react-best-practices/skills/react-best-practices/rules/bundle-barrel-imports.md b/marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/bundle-barrel-imports.md similarity index 100% rename from marketplace/ui/react-best-practices/skills/react-best-practices/rules/bundle-barrel-imports.md rename to marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/bundle-barrel-imports.md diff --git a/marketplace/ui/react-best-practices/skills/react-best-practices/rules/bundle-conditional.md b/marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/bundle-conditional.md similarity index 100% rename from marketplace/ui/react-best-practices/skills/react-best-practices/rules/bundle-conditional.md rename to marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/bundle-conditional.md diff --git a/marketplace/ui/react-best-practices/skills/react-best-practices/rules/bundle-defer-third-party.md b/marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/bundle-defer-third-party.md similarity index 100% rename from marketplace/ui/react-best-practices/skills/react-best-practices/rules/bundle-defer-third-party.md rename to marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/bundle-defer-third-party.md diff --git a/marketplace/ui/react-best-practices/skills/react-best-practices/rules/bundle-dynamic-imports.md b/marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/bundle-dynamic-imports.md similarity index 100% rename from marketplace/ui/react-best-practices/skills/react-best-practices/rules/bundle-dynamic-imports.md rename to marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/bundle-dynamic-imports.md diff --git a/marketplace/ui/react-best-practices/skills/react-best-practices/rules/bundle-preload.md b/marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/bundle-preload.md similarity index 100% rename from marketplace/ui/react-best-practices/skills/react-best-practices/rules/bundle-preload.md rename to marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/bundle-preload.md diff --git a/marketplace/ui/react-best-practices/skills/react-best-practices/rules/client-event-listeners.md b/marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/client-event-listeners.md similarity index 100% rename from marketplace/ui/react-best-practices/skills/react-best-practices/rules/client-event-listeners.md rename to marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/client-event-listeners.md diff --git a/marketplace/ui/react-best-practices/skills/react-best-practices/rules/client-localstorage-schema.md b/marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/client-localstorage-schema.md similarity index 100% rename from marketplace/ui/react-best-practices/skills/react-best-practices/rules/client-localstorage-schema.md rename to marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/client-localstorage-schema.md diff --git a/marketplace/ui/react-best-practices/skills/react-best-practices/rules/client-passive-event-listeners.md b/marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/client-passive-event-listeners.md similarity index 100% rename from marketplace/ui/react-best-practices/skills/react-best-practices/rules/client-passive-event-listeners.md rename to marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/client-passive-event-listeners.md diff --git a/marketplace/ui/react-best-practices/skills/react-best-practices/rules/client-swr-dedup.md b/marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/client-swr-dedup.md similarity index 100% rename from marketplace/ui/react-best-practices/skills/react-best-practices/rules/client-swr-dedup.md rename to marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/client-swr-dedup.md diff --git a/marketplace/ui/react-best-practices/skills/react-best-practices/rules/js-batch-dom-css.md b/marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/js-batch-dom-css.md similarity index 100% rename from marketplace/ui/react-best-practices/skills/react-best-practices/rules/js-batch-dom-css.md rename to marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/js-batch-dom-css.md diff --git a/marketplace/ui/react-best-practices/skills/react-best-practices/rules/js-cache-function-results.md b/marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/js-cache-function-results.md similarity index 100% rename from marketplace/ui/react-best-practices/skills/react-best-practices/rules/js-cache-function-results.md rename to marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/js-cache-function-results.md diff --git a/marketplace/ui/react-best-practices/skills/react-best-practices/rules/js-cache-property-access.md b/marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/js-cache-property-access.md similarity index 100% rename from marketplace/ui/react-best-practices/skills/react-best-practices/rules/js-cache-property-access.md rename to marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/js-cache-property-access.md diff --git a/marketplace/ui/react-best-practices/skills/react-best-practices/rules/js-cache-storage.md b/marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/js-cache-storage.md similarity index 100% rename from marketplace/ui/react-best-practices/skills/react-best-practices/rules/js-cache-storage.md rename to marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/js-cache-storage.md diff --git a/marketplace/ui/react-best-practices/skills/react-best-practices/rules/js-combine-iterations.md b/marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/js-combine-iterations.md similarity index 100% rename from marketplace/ui/react-best-practices/skills/react-best-practices/rules/js-combine-iterations.md rename to marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/js-combine-iterations.md diff --git a/marketplace/ui/react-best-practices/skills/react-best-practices/rules/js-early-exit.md b/marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/js-early-exit.md similarity index 100% rename from marketplace/ui/react-best-practices/skills/react-best-practices/rules/js-early-exit.md rename to marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/js-early-exit.md diff --git a/marketplace/ui/react-best-practices/skills/react-best-practices/rules/js-flatmap-filter.md b/marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/js-flatmap-filter.md similarity index 100% rename from marketplace/ui/react-best-practices/skills/react-best-practices/rules/js-flatmap-filter.md rename to marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/js-flatmap-filter.md diff --git a/marketplace/ui/react-best-practices/skills/react-best-practices/rules/js-hoist-regexp.md b/marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/js-hoist-regexp.md similarity index 100% rename from marketplace/ui/react-best-practices/skills/react-best-practices/rules/js-hoist-regexp.md rename to marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/js-hoist-regexp.md diff --git a/marketplace/ui/react-best-practices/skills/react-best-practices/rules/js-index-maps.md b/marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/js-index-maps.md similarity index 100% rename from marketplace/ui/react-best-practices/skills/react-best-practices/rules/js-index-maps.md rename to marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/js-index-maps.md diff --git a/marketplace/ui/react-best-practices/skills/react-best-practices/rules/js-length-check-first.md b/marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/js-length-check-first.md similarity index 100% rename from marketplace/ui/react-best-practices/skills/react-best-practices/rules/js-length-check-first.md rename to marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/js-length-check-first.md diff --git a/marketplace/ui/react-best-practices/skills/react-best-practices/rules/js-min-max-loop.md b/marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/js-min-max-loop.md similarity index 100% rename from marketplace/ui/react-best-practices/skills/react-best-practices/rules/js-min-max-loop.md rename to marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/js-min-max-loop.md diff --git a/marketplace/ui/react-best-practices/skills/react-best-practices/rules/js-request-idle-callback.md b/marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/js-request-idle-callback.md similarity index 100% rename from marketplace/ui/react-best-practices/skills/react-best-practices/rules/js-request-idle-callback.md rename to marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/js-request-idle-callback.md diff --git a/marketplace/ui/react-best-practices/skills/react-best-practices/rules/js-set-map-lookups.md b/marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/js-set-map-lookups.md similarity index 100% rename from marketplace/ui/react-best-practices/skills/react-best-practices/rules/js-set-map-lookups.md rename to marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/js-set-map-lookups.md diff --git a/marketplace/ui/react-best-practices/skills/react-best-practices/rules/js-tosorted-immutable.md b/marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/js-tosorted-immutable.md similarity index 100% rename from marketplace/ui/react-best-practices/skills/react-best-practices/rules/js-tosorted-immutable.md rename to marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/js-tosorted-immutable.md diff --git a/marketplace/ui/react-best-practices/skills/react-best-practices/rules/rendering-activity.md b/marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/rendering-activity.md similarity index 100% rename from marketplace/ui/react-best-practices/skills/react-best-practices/rules/rendering-activity.md rename to marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/rendering-activity.md diff --git a/marketplace/ui/react-best-practices/skills/react-best-practices/rules/rendering-animate-svg-wrapper.md b/marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/rendering-animate-svg-wrapper.md similarity index 100% rename from marketplace/ui/react-best-practices/skills/react-best-practices/rules/rendering-animate-svg-wrapper.md rename to marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/rendering-animate-svg-wrapper.md diff --git a/marketplace/ui/react-best-practices/skills/react-best-practices/rules/rendering-conditional-render.md b/marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/rendering-conditional-render.md similarity index 100% rename from marketplace/ui/react-best-practices/skills/react-best-practices/rules/rendering-conditional-render.md rename to marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/rendering-conditional-render.md diff --git a/marketplace/ui/react-best-practices/skills/react-best-practices/rules/rendering-content-visibility.md b/marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/rendering-content-visibility.md similarity index 100% rename from marketplace/ui/react-best-practices/skills/react-best-practices/rules/rendering-content-visibility.md rename to marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/rendering-content-visibility.md diff --git a/marketplace/ui/react-best-practices/skills/react-best-practices/rules/rendering-hoist-jsx.md b/marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/rendering-hoist-jsx.md similarity index 100% rename from marketplace/ui/react-best-practices/skills/react-best-practices/rules/rendering-hoist-jsx.md rename to marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/rendering-hoist-jsx.md diff --git a/marketplace/ui/react-best-practices/skills/react-best-practices/rules/rendering-hydration-no-flicker.md b/marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/rendering-hydration-no-flicker.md similarity index 100% rename from marketplace/ui/react-best-practices/skills/react-best-practices/rules/rendering-hydration-no-flicker.md rename to marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/rendering-hydration-no-flicker.md diff --git a/marketplace/ui/react-best-practices/skills/react-best-practices/rules/rendering-hydration-suppress-warning.md b/marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/rendering-hydration-suppress-warning.md similarity index 100% rename from marketplace/ui/react-best-practices/skills/react-best-practices/rules/rendering-hydration-suppress-warning.md rename to marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/rendering-hydration-suppress-warning.md diff --git a/marketplace/ui/react-best-practices/skills/react-best-practices/rules/rendering-resource-hints.md b/marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/rendering-resource-hints.md similarity index 100% rename from marketplace/ui/react-best-practices/skills/react-best-practices/rules/rendering-resource-hints.md rename to marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/rendering-resource-hints.md diff --git a/marketplace/ui/react-best-practices/skills/react-best-practices/rules/rendering-script-defer-async.md b/marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/rendering-script-defer-async.md similarity index 100% rename from marketplace/ui/react-best-practices/skills/react-best-practices/rules/rendering-script-defer-async.md rename to marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/rendering-script-defer-async.md diff --git a/marketplace/ui/react-best-practices/skills/react-best-practices/rules/rendering-svg-precision.md b/marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/rendering-svg-precision.md similarity index 100% rename from marketplace/ui/react-best-practices/skills/react-best-practices/rules/rendering-svg-precision.md rename to marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/rendering-svg-precision.md diff --git a/marketplace/ui/react-best-practices/skills/react-best-practices/rules/rendering-usetransition-loading.md b/marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/rendering-usetransition-loading.md similarity index 100% rename from marketplace/ui/react-best-practices/skills/react-best-practices/rules/rendering-usetransition-loading.md rename to marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/rendering-usetransition-loading.md diff --git a/marketplace/ui/react-best-practices/skills/react-best-practices/rules/rerender-defer-reads.md b/marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/rerender-defer-reads.md similarity index 100% rename from marketplace/ui/react-best-practices/skills/react-best-practices/rules/rerender-defer-reads.md rename to marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/rerender-defer-reads.md diff --git a/marketplace/ui/react-best-practices/skills/react-best-practices/rules/rerender-dependencies.md b/marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/rerender-dependencies.md similarity index 100% rename from marketplace/ui/react-best-practices/skills/react-best-practices/rules/rerender-dependencies.md rename to marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/rerender-dependencies.md diff --git a/marketplace/ui/react-best-practices/skills/react-best-practices/rules/rerender-derived-state-no-effect.md b/marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/rerender-derived-state-no-effect.md similarity index 100% rename from marketplace/ui/react-best-practices/skills/react-best-practices/rules/rerender-derived-state-no-effect.md rename to marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/rerender-derived-state-no-effect.md diff --git a/marketplace/ui/react-best-practices/skills/react-best-practices/rules/rerender-derived-state.md b/marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/rerender-derived-state.md similarity index 100% rename from marketplace/ui/react-best-practices/skills/react-best-practices/rules/rerender-derived-state.md rename to marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/rerender-derived-state.md diff --git a/marketplace/ui/react-best-practices/skills/react-best-practices/rules/rerender-functional-setstate.md b/marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/rerender-functional-setstate.md similarity index 100% rename from marketplace/ui/react-best-practices/skills/react-best-practices/rules/rerender-functional-setstate.md rename to marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/rerender-functional-setstate.md diff --git a/marketplace/ui/react-best-practices/skills/react-best-practices/rules/rerender-lazy-state-init.md b/marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/rerender-lazy-state-init.md similarity index 100% rename from marketplace/ui/react-best-practices/skills/react-best-practices/rules/rerender-lazy-state-init.md rename to marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/rerender-lazy-state-init.md diff --git a/marketplace/ui/react-best-practices/skills/react-best-practices/rules/rerender-memo-with-default-value.md b/marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/rerender-memo-with-default-value.md similarity index 100% rename from marketplace/ui/react-best-practices/skills/react-best-practices/rules/rerender-memo-with-default-value.md rename to marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/rerender-memo-with-default-value.md diff --git a/marketplace/ui/react-best-practices/skills/react-best-practices/rules/rerender-memo.md b/marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/rerender-memo.md similarity index 100% rename from marketplace/ui/react-best-practices/skills/react-best-practices/rules/rerender-memo.md rename to marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/rerender-memo.md diff --git a/marketplace/ui/react-best-practices/skills/react-best-practices/rules/rerender-move-effect-to-event.md b/marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/rerender-move-effect-to-event.md similarity index 100% rename from marketplace/ui/react-best-practices/skills/react-best-practices/rules/rerender-move-effect-to-event.md rename to marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/rerender-move-effect-to-event.md diff --git a/marketplace/ui/react-best-practices/skills/react-best-practices/rules/rerender-no-inline-components.md b/marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/rerender-no-inline-components.md similarity index 100% rename from marketplace/ui/react-best-practices/skills/react-best-practices/rules/rerender-no-inline-components.md rename to marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/rerender-no-inline-components.md diff --git a/marketplace/ui/react-best-practices/skills/react-best-practices/rules/rerender-simple-expression-in-memo.md b/marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/rerender-simple-expression-in-memo.md similarity index 100% rename from marketplace/ui/react-best-practices/skills/react-best-practices/rules/rerender-simple-expression-in-memo.md rename to marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/rerender-simple-expression-in-memo.md diff --git a/marketplace/ui/react-best-practices/skills/react-best-practices/rules/rerender-split-combined-hooks.md b/marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/rerender-split-combined-hooks.md similarity index 100% rename from marketplace/ui/react-best-practices/skills/react-best-practices/rules/rerender-split-combined-hooks.md rename to marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/rerender-split-combined-hooks.md diff --git a/marketplace/ui/react-best-practices/skills/react-best-practices/rules/rerender-transitions.md b/marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/rerender-transitions.md similarity index 100% rename from marketplace/ui/react-best-practices/skills/react-best-practices/rules/rerender-transitions.md rename to marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/rerender-transitions.md diff --git a/marketplace/ui/react-best-practices/skills/react-best-practices/rules/rerender-use-deferred-value.md b/marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/rerender-use-deferred-value.md similarity index 100% rename from marketplace/ui/react-best-practices/skills/react-best-practices/rules/rerender-use-deferred-value.md rename to marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/rerender-use-deferred-value.md diff --git a/marketplace/ui/react-best-practices/skills/react-best-practices/rules/rerender-use-ref-transient-values.md b/marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/rerender-use-ref-transient-values.md similarity index 100% rename from marketplace/ui/react-best-practices/skills/react-best-practices/rules/rerender-use-ref-transient-values.md rename to marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/rerender-use-ref-transient-values.md diff --git a/marketplace/ui/react-best-practices/skills/react-best-practices/rules/server-after-nonblocking.md b/marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/server-after-nonblocking.md similarity index 100% rename from marketplace/ui/react-best-practices/skills/react-best-practices/rules/server-after-nonblocking.md rename to marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/server-after-nonblocking.md diff --git a/marketplace/ui/react-best-practices/skills/react-best-practices/rules/server-auth-actions.md b/marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/server-auth-actions.md similarity index 100% rename from marketplace/ui/react-best-practices/skills/react-best-practices/rules/server-auth-actions.md rename to marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/server-auth-actions.md diff --git a/marketplace/ui/react-best-practices/skills/react-best-practices/rules/server-cache-lru.md b/marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/server-cache-lru.md similarity index 100% rename from marketplace/ui/react-best-practices/skills/react-best-practices/rules/server-cache-lru.md rename to marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/server-cache-lru.md diff --git a/marketplace/ui/react-best-practices/skills/react-best-practices/rules/server-cache-react.md b/marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/server-cache-react.md similarity index 100% rename from marketplace/ui/react-best-practices/skills/react-best-practices/rules/server-cache-react.md rename to marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/server-cache-react.md diff --git a/marketplace/ui/react-best-practices/skills/react-best-practices/rules/server-dedup-props.md b/marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/server-dedup-props.md similarity index 100% rename from marketplace/ui/react-best-practices/skills/react-best-practices/rules/server-dedup-props.md rename to marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/server-dedup-props.md diff --git a/marketplace/ui/react-best-practices/skills/react-best-practices/rules/server-hoist-static-io.md b/marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/server-hoist-static-io.md similarity index 100% rename from marketplace/ui/react-best-practices/skills/react-best-practices/rules/server-hoist-static-io.md rename to marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/server-hoist-static-io.md diff --git a/marketplace/ui/react-best-practices/skills/react-best-practices/rules/server-no-shared-module-state.md b/marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/server-no-shared-module-state.md similarity index 100% rename from marketplace/ui/react-best-practices/skills/react-best-practices/rules/server-no-shared-module-state.md rename to marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/server-no-shared-module-state.md diff --git a/marketplace/ui/react-best-practices/skills/react-best-practices/rules/server-parallel-fetching.md b/marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/server-parallel-fetching.md similarity index 100% rename from marketplace/ui/react-best-practices/skills/react-best-practices/rules/server-parallel-fetching.md rename to marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/server-parallel-fetching.md diff --git a/marketplace/ui/react-best-practices/skills/react-best-practices/rules/server-parallel-nested-fetching.md b/marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/server-parallel-nested-fetching.md similarity index 100% rename from marketplace/ui/react-best-practices/skills/react-best-practices/rules/server-parallel-nested-fetching.md rename to marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/server-parallel-nested-fetching.md diff --git a/marketplace/ui/react-best-practices/skills/react-best-practices/rules/server-serialization.md b/marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/server-serialization.md similarity index 100% rename from marketplace/ui/react-best-practices/skills/react-best-practices/rules/server-serialization.md rename to marketplace/playbooks/react-best-practices/skills/react-best-practices/rules/server-serialization.md diff --git a/marketplace/ui/web-design-guidelines/.reforma-plugin/plugin.json b/marketplace/playbooks/web-design-guidelines/.reforma-plugin/plugin.json similarity index 84% rename from marketplace/ui/web-design-guidelines/.reforma-plugin/plugin.json rename to marketplace/playbooks/web-design-guidelines/.reforma-plugin/plugin.json index 94c215c..6a6bda6 100644 --- a/marketplace/ui/web-design-guidelines/.reforma-plugin/plugin.json +++ b/marketplace/playbooks/web-design-guidelines/.reforma-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "web-design-guidelines", - "description": "Accessibility, forms, and focus checks for the app UI.", + "description": "Catch accessibility, form, and focus issues before they ship", "logo": "assets/logo.svg", "author": { "name": "Vercel", diff --git a/marketplace/ui/web-design-guidelines/LICENSE.txt b/marketplace/playbooks/web-design-guidelines/LICENSE.txt similarity index 100% rename from marketplace/ui/web-design-guidelines/LICENSE.txt rename to marketplace/playbooks/web-design-guidelines/LICENSE.txt diff --git a/marketplace/ui/web-design-guidelines/assets/logo.svg b/marketplace/playbooks/web-design-guidelines/assets/logo.svg similarity index 100% rename from marketplace/ui/web-design-guidelines/assets/logo.svg rename to marketplace/playbooks/web-design-guidelines/assets/logo.svg diff --git a/marketplace/ui/web-design-guidelines/skills/audit-ui/SKILL.md b/marketplace/playbooks/web-design-guidelines/skills/audit-ui/SKILL.md similarity index 100% rename from marketplace/ui/web-design-guidelines/skills/audit-ui/SKILL.md rename to marketplace/playbooks/web-design-guidelines/skills/audit-ui/SKILL.md diff --git a/marketplace/ui/web-design-guidelines/skills/web-design-guidelines/SKILL.md b/marketplace/playbooks/web-design-guidelines/skills/web-design-guidelines/SKILL.md similarity index 100% rename from marketplace/ui/web-design-guidelines/skills/web-design-guidelines/SKILL.md rename to marketplace/playbooks/web-design-guidelines/skills/web-design-guidelines/SKILL.md diff --git a/marketplace/scheduling/booking/.reforma-plugin/plugin.json b/marketplace/scheduling/booking/.reforma-plugin/plugin.json index dc586e6..b9cc1b5 100644 --- a/marketplace/scheduling/booking/.reforma-plugin/plugin.json +++ b/marketplace/scheduling/booking/.reforma-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "booking", - "description": "Book a call, pick slots, or show an event calendar in the app.", + "description": "Book a call, pick a slot, or show an event calendar — no third-party account", "logo": "assets/logo.svg", "author": { "name": "Reforma" diff --git a/marketplace/scheduling/booking/assets/logo.svg b/marketplace/scheduling/booking/assets/logo.svg index 921587f..c27a45a 100644 --- a/marketplace/scheduling/booking/assets/logo.svg +++ b/marketplace/scheduling/booking/assets/logo.svg @@ -1,7 +1,7 @@ - - - - - - + + + + + + diff --git a/marketplace/scheduling/cal-com/.reforma-plugin/plugin.json b/marketplace/scheduling/cal-com/.reforma-plugin/plugin.json index 2144982..9802587 100644 --- a/marketplace/scheduling/cal-com/.reforma-plugin/plugin.json +++ b/marketplace/scheduling/cal-com/.reforma-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "cal-com", - "description": "Bookings, event types, and a booker widget from Cal.com.", + "description": "Let people book time — event types and a scheduler in the app", "logo": "assets/logo.svg", "author": { "name": "Cal.com", @@ -9,7 +9,8 @@ "homepage": "https://cal.com/docs/mcp-server", "interface": { "displayName": "Cal.com", - "brandColor": "#292929" + "brandColor": "#292929", + "logo": "assets/logo.svg" }, "mcpServers": "./mcp.json" } diff --git a/marketplace/scheduling/cal-com/assets/logo.svg b/marketplace/scheduling/cal-com/assets/logo.svg index 8ac6622..9b43a4e 100644 --- a/marketplace/scheduling/cal-com/assets/logo.svg +++ b/marketplace/scheduling/cal-com/assets/logo.svg @@ -1 +1,3 @@ -Cal.com \ No newline at end of file + + + diff --git a/marketplace/scheduling/calendly/.reforma-plugin/plugin.json b/marketplace/scheduling/calendly/.reforma-plugin/plugin.json index cc61418..e62f339 100644 --- a/marketplace/scheduling/calendly/.reforma-plugin/plugin.json +++ b/marketplace/scheduling/calendly/.reforma-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "calendly", - "description": "Scheduling links, availability, and a Calendly embed for the app.", + "description": "Scheduling links and a Calendly embed so people book themselves", "logo": "assets/logo.svg", "author": { "name": "Calendly", @@ -9,7 +9,8 @@ "homepage": "https://developer.calendly.com/calendly-mcp-server", "interface": { "displayName": "Calendly", - "brandColor": "#006BFF" + "brandColor": "#006BFF", + "logo": "assets/logo.svg" }, "mcpServers": "./mcp.json" } diff --git a/marketplace/scheduling/calendly/assets/logo.svg b/marketplace/scheduling/calendly/assets/logo.svg index 8f074b6..5b059ce 100644 --- a/marketplace/scheduling/calendly/assets/logo.svg +++ b/marketplace/scheduling/calendly/assets/logo.svg @@ -1 +1,3 @@ -Calendly \ No newline at end of file + + + diff --git a/marketplace/ui/fonts/.reforma-plugin/plugin.json b/marketplace/system/fonts/.reforma-plugin/plugin.json similarity index 96% rename from marketplace/ui/fonts/.reforma-plugin/plugin.json rename to marketplace/system/fonts/.reforma-plugin/plugin.json index fabf36d..b86b0a5 100644 --- a/marketplace/ui/fonts/.reforma-plugin/plugin.json +++ b/marketplace/system/fonts/.reforma-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "fonts", - "description": "Google Fonts and custom typefaces for the project.", + "description": "Google Fonts and custom typefaces for the project", "system": true, "logo": "assets/logo.svg", "interface": { diff --git a/marketplace/system/fonts/assets/logo.svg b/marketplace/system/fonts/assets/logo.svg new file mode 100644 index 0000000..729d2a7 --- /dev/null +++ b/marketplace/system/fonts/assets/logo.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/marketplace/ui/fonts/skills/fonts/SKILL.md b/marketplace/system/fonts/skills/fonts/SKILL.md similarity index 100% rename from marketplace/ui/fonts/skills/fonts/SKILL.md rename to marketplace/system/fonts/skills/fonts/SKILL.md diff --git a/marketplace/system/nextjs/.reforma-plugin/plugin.json b/marketplace/system/nextjs/.reforma-plugin/plugin.json new file mode 100644 index 0000000..91a2771 --- /dev/null +++ b/marketplace/system/nextjs/.reforma-plugin/plugin.json @@ -0,0 +1,12 @@ +{ + "name": "nextjs", + "description": "Next.js App Router — routing, layouts, and the conventions the project follows", + "system": true, + "logo": "assets/logo.svg", + "homepage": "https://nextjs.org/docs/app", + "interface": { + "displayName": "Next.js", + "brandColor": "#000000", + "logo": "assets/logo.svg" + } +} diff --git a/marketplace/system/nextjs/assets/logo.svg b/marketplace/system/nextjs/assets/logo.svg new file mode 100644 index 0000000..d7f9b15 --- /dev/null +++ b/marketplace/system/nextjs/assets/logo.svg @@ -0,0 +1,3 @@ + + + diff --git a/marketplace/system/nextjs/skills/nextjs/SKILL.md b/marketplace/system/nextjs/skills/nextjs/SKILL.md new file mode 100644 index 0000000..cd5848a --- /dev/null +++ b/marketplace/system/nextjs/skills/nextjs/SKILL.md @@ -0,0 +1,48 @@ +--- +name: nextjs +disable-user-invocation: true +description: >- + Next.js 16 App Router on this starter. Use when adding a route, layout, + loading or error UI, dynamic params, cookies, a Server Action, route handler, + 'use client' boundary, or a request rewrite. +--- + +# Next.js + +App Router, `app/` (no `src/`), bun. Pin: `package.json` → `next`. Keep `app/layout.tsx`, `app/fonts/`, `app/tokens/` at those roots. UI: **Skill** `shadcn`. Locales: **Skill** `i18n`. + +## Route + +A URL exists when the folder has `page.tsx`. Nested `layout.tsx` wraps the segment. Slow data: colocate `loading.tsx`. Failures: `error.tsx`. HTTP endpoint: `route.ts`. + +Static head: `export const metadata`. Request-time head: `generateMetadata`. + +Navigation: `next/link`. Images: `next/image`. After **Skill** `i18n`: `Link` from `@/i18n/navigation`. + +Done when the path renders (or the handler responds) and `app/fonts` / `app/tokens` are still at the roots. + +## Request data + +`params`, `searchParams`, `cookies()`, and `headers()` are Promises. Await them (or `use()` in a Client Component). Same unwrap in `layout.tsx` and `generateMetadata`. + +```tsx +export default async function Page({ + params, +}: { + params: Promise<{ id: string }>; +}) { + const { id } = await params; +} +``` + +## Server vs client + +Default is a Server Component. Fetch here; pass serializable props into a small client island (`app/providers.tsx` is the existing one). `'use client'` at the top of a file that uses hooks, event handlers, or browser APIs. Secrets stay on the server. + +## Mutations + +`'use server'` actions and `route.ts` are public endpoints. Verify the caller inside the function. After a successful write: `refresh()` from `next/cache` in a Server Action; `revalidatePath` from a route handler (or when cached path data must drop). Status: 401 unsigned, 403 signed-in without permission. Patterns: [handlers.md](handlers.md). + +## Proxy + +Request rewrite or redirect: project-root `proxy.ts` with `export function proxy`. The file is not `middleware.ts`. Locale intercept: **Skill** `i18n`. diff --git a/marketplace/system/nextjs/skills/nextjs/handlers.md b/marketplace/system/nextjs/skills/nextjs/handlers.md new file mode 100644 index 0000000..8fb4fbd --- /dev/null +++ b/marketplace/system/nextjs/skills/nextjs/handlers.md @@ -0,0 +1,48 @@ +# Handlers + +`'use server'` actions and `route.ts` are public. A layout or `proxy.ts` check does not cover a direct POST. First lines: the **installed auth skill**’s server helper. Missing user → stop. Do not add `@/lib/auth` unless that file exists. + +## Server Action + +```ts +'use server' + +import { refresh } from 'next/cache' + +export async function createItem(formData: FormData) { + const userId = /* await the auth skill’s server helper */ + if (!userId) { + throw new Error('Unauthorized') + } + + // persist owned by userId + refresh() +} +``` + +`refresh()` only here — not in a route handler. Done when an unsigned call throws and a signed call writes, then `refresh()`. + +## Route handler + +```ts +import { NextResponse } from 'next/server' +import { revalidatePath } from 'next/cache' + +export async function DELETE() { + const userId = /* await the auth skill’s server helper */ + if (!userId) { + return NextResponse.json({ error: 'Unauthorized' }, { status: 401 }) + } + + const allowed = /* permission from that skill */ + if (!allowed) { + return NextResponse.json({ error: 'Forbidden' }, { status: 403 }) + } + + revalidatePath('/') + return NextResponse.json({ ok: true }) +} +``` + +- **401** — no session +- **403** — session, missing permission diff --git a/marketplace/ui/shadcn-tailwind/.reforma-plugin/plugin.json b/marketplace/system/shadcn-tailwind/.reforma-plugin/plugin.json similarity index 58% rename from marketplace/ui/shadcn-tailwind/.reforma-plugin/plugin.json rename to marketplace/system/shadcn-tailwind/.reforma-plugin/plugin.json index 5fdec78..7cc693b 100644 --- a/marketplace/ui/shadcn-tailwind/.reforma-plugin/plugin.json +++ b/marketplace/system/shadcn-tailwind/.reforma-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "shadcn-tailwind", - "description": "Official components and Tailwind utilities for the project.", + "description": "The UI kit the project is built on — components, forms, and Tailwind", "system": true, "logo": "assets/logo.png", "author": { @@ -10,7 +10,8 @@ "repository": "https://github.com/shadcn-ui/ui", "license": "MIT", "interface": { - "displayName": "shadcn / Tailwind", - "brandColor": "#171717" + "displayName": "shadcn", + "brandColor": "#000000", + "logo": "assets/logo.png" } } diff --git a/marketplace/system/shadcn-tailwind/assets/logo.png b/marketplace/system/shadcn-tailwind/assets/logo.png new file mode 100644 index 0000000..1027935 Binary files /dev/null and b/marketplace/system/shadcn-tailwind/assets/logo.png differ diff --git a/marketplace/ui/shadcn-tailwind/mcp.json b/marketplace/system/shadcn-tailwind/mcp.json similarity index 100% rename from marketplace/ui/shadcn-tailwind/mcp.json rename to marketplace/system/shadcn-tailwind/mcp.json diff --git a/marketplace/ui/shadcn-tailwind/skills/shadcn/SKILL.md b/marketplace/system/shadcn-tailwind/skills/shadcn/SKILL.md similarity index 63% rename from marketplace/ui/shadcn-tailwind/skills/shadcn/SKILL.md rename to marketplace/system/shadcn-tailwind/skills/shadcn/SKILL.md index 5f21c54..db724fb 100644 --- a/marketplace/ui/shadcn-tailwind/skills/shadcn/SKILL.md +++ b/marketplace/system/shadcn-tailwind/skills/shadcn/SKILL.md @@ -2,17 +2,19 @@ name: shadcn disable-user-invocation: true description: >- - Installs and composes official shadcn/ui primitives on Tailwind. Use when a - needed component is missing from components/ui, when running the shadcn CLI - or MCP, or when editing components.json / Tailwind classes in the project. + Installs and composes official shadcn/ui primitives. Use when a needed + component is missing from components/ui, when running the shadcn CLI or MCP, + or when editing components.json. --- -# shadcn / Tailwind +# shadcn Starter already has `components.json`, Tailwind 4, shadcn v4 (Base UI), and Reforma tokens. Do not re-init. Do not add a second UI framework. Official registry is the default. Other `@ns` kit registries only when that kit's card is installed — the kit **Install** hook writes `registries` in `components.json`. MCP reads every registry in that file. +Layout classes, `gap-*`, `size-*`, token CSS: **Skill** `tailwind`. + ## Find Prefer a matching local `components/ui/*` if it already exists. @@ -24,10 +26,10 @@ Prefer a matching local `components/ui/*` if it already exists. 1. **Bash:** `bunx shadcn add -y` (optional: `--dry-run` / `--diff` first). MCP `get_add_command_for_items` only returns the command — still run it. 2. If `package.json` / lockfile changed → **InstallDependencies**. -3. Read the added file. Match neighboring primitives — reuse their class patterns / compose with existing `Button` / `Input` / `Field`. Tokens: theme rule (`app/tokens/`). No raw hex. +3. Read the added file. Match neighboring primitives — reuse their class patterns / compose with existing `Button` / `Input` / `Field`. `cn` from `@/lib/utils`. Colors: active collection CSS (`app/tokens/collections.json` → `active` → `file`), not `tokens/tailwind.css`. No raw hex. ## Compose -Existing components first. Variants before custom classes. Semantic colors (`bg-background`, `text-muted-foreground`). `cn()` for conditionals. `flex` + `gap-*`, not `space-y-*`. Equal width/height → `size-*`. +Existing components first. Variants before custom classes. `className` on a primitive is layout (`max-w-md`, `mt-4`), not a color/type restyle. -Forms: `FieldGroup` + `Field` (`data-invalid` on `Field`, `aria-invalid` on the control). Icons in `Button`: `data-icon="inline-start"` / `inline-end`, no sizing classes on the icon. Overlays need a Title (`DialogTitle`, `SheetTitle`, `DrawerTitle`). +Forms: `FieldGroup` + `Field` (`data-invalid` on `Field`, `aria-invalid` on the control). Icons in `Button`: `data-icon="inline-start"` / `inline-end`, no sizing classes on the icon. Overlays need a Title (`DialogTitle`, `SheetTitle`, `DrawerTitle`). Do not set `z-*` on Dialog / Sheet / Drawer / Popover — they stack themselves. diff --git a/marketplace/system/shadcn-tailwind/skills/tailwind/SKILL.md b/marketplace/system/shadcn-tailwind/skills/tailwind/SKILL.md new file mode 100644 index 0000000..19b9772 --- /dev/null +++ b/marketplace/system/shadcn-tailwind/skills/tailwind/SKILL.md @@ -0,0 +1,38 @@ +--- +name: tailwind +disable-user-invocation: true +description: >- + Tailwind v4 layout and utilities on the Reforma starter. Use when writing or + editing className, spacing, size, or token CSS — not when adding a shadcn + primitive (Skill shadcn). +--- + +# Tailwind + +Starter is Tailwind **4** (`@tailwindcss/postcss`, no `tailwind.config.*`). `cn` is `import { cn } from '@/lib/utils'` (`clsx` + `tailwind-merge`). Fonts: **Skill** `fonts`. + +## Files + +`app/globals.css` only imports the two token sheets. Do not put `@theme` there. + +| Path | Role | +| --- | --- | +| `app/tokens/tailwind.css` | Framework bootstrap (`@import 'tailwindcss'`). `--color-*: initial` drops default palettes (`bg-blue-500` does not exist). Do not add design colors here. | +| `app/tokens/index.css` | Generated re-export of the active collection. Do not edit. | +| `app/tokens/collections.json` → `active` → `file` | Project tokens (`col_*.css`). Light in `@theme`, dark in `.dark`. | + +Pages: semantic utilities (`bg-background`, `text-muted-foreground`). Those map from `--color-*` in the collection. No raw hex. New color: add `--color-` in the collection file (both `@theme` and `.dark` if it must switch). + +## Layout + +`flex` + `gap-*`, not `space-y-*` / `space-x-*`. Equal width and height → `size-*`. Ellipsis → `truncate`. Conditionals → `cn()`. + +`className` on shadcn primitives is layout (`max-w-md`, `mx-auto`, `mt-4`). Variants and semantic tokens change look. No `dark:bg-gray-950` — `.dark` in the collection already switches. + +```tsx +import { cn } from '@/lib/utils' + +
+ +
+``` diff --git a/marketplace/ui/21st/.reforma-plugin/plugin.json b/marketplace/ui/21st/.reforma-plugin/plugin.json index f87df21..8eccabf 100644 --- a/marketplace/ui/21st/.reforma-plugin/plugin.json +++ b/marketplace/ui/21st/.reforma-plugin/plugin.json @@ -1,7 +1,7 @@ { "name": "21st", - "description": "Search and install UI from the 21st catalog. Needs an API key.", - "logo": "assets/logo.svg", + "description": "A living library of React components, templates, and themes. Add them to the project, or generate new UI.", + "logo": "assets/logo.png", "author": { "name": "21st", "url": "https://21st.dev" @@ -9,7 +9,8 @@ "homepage": "https://21st.dev/mcp", "interface": { "displayName": "21st", - "brandColor": "#0A0A0A" + "brandColor": "#2B59FF", + "logo": "assets/logo.png" }, "mcpServers": "./mcp.json", "variables": { @@ -22,6 +23,8 @@ "placeholder": "21st_sk_…" } }, - "required": ["API_KEY"] + "required": [ + "API_KEY" + ] } } diff --git a/marketplace/ui/21st/assets/logo.png b/marketplace/ui/21st/assets/logo.png new file mode 100644 index 0000000..45d9d51 Binary files /dev/null and b/marketplace/ui/21st/assets/logo.png differ diff --git a/marketplace/ui/21st/assets/logo.svg b/marketplace/ui/21st/assets/logo.svg deleted file mode 100644 index 323206c..0000000 --- a/marketplace/ui/21st/assets/logo.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/marketplace/ui/21st/mcp.json b/marketplace/ui/21st/mcp.json index e907e53..9e8e824 100644 --- a/marketplace/ui/21st/mcp.json +++ b/marketplace/ui/21st/mcp.json @@ -5,7 +5,7 @@ "headers": { "x-api-key": "${API_KEY}" }, - "description": "Search, install, and generate UI from the 21st.dev catalog." + "description": "Find components, templates, and themes, add them to the project, or generate new UI" } } } diff --git a/marketplace/ui/aceternity/.reforma-plugin/plugin.json b/marketplace/ui/aceternity/.reforma-plugin/plugin.json index 8687666..c8cb3bc 100644 --- a/marketplace/ui/aceternity/.reforma-plugin/plugin.json +++ b/marketplace/ui/aceternity/.reforma-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "aceternity", - "description": "Motion-rich blocks and effects on top of shadcn.", + "description": "Motion-heavy blocks and visual effects for landing pages", "logo": "assets/logo.png", "author": { "name": "Aceternity" @@ -8,6 +8,7 @@ "homepage": "https://ui.aceternity.com", "interface": { "displayName": "Aceternity", - "brandColor": "#000000" + "brandColor": "#000000", + "logo": "assets/logo.png" } } diff --git a/marketplace/ui/aceternity/assets/logo.png b/marketplace/ui/aceternity/assets/logo.png index 987c009..ab6a3b2 100644 Binary files a/marketplace/ui/aceternity/assets/logo.png and b/marketplace/ui/aceternity/assets/logo.png differ diff --git a/marketplace/ui/coss/.reforma-plugin/plugin.json b/marketplace/ui/coss/.reforma-plugin/plugin.json index ae69915..e6d5ea1 100644 --- a/marketplace/ui/coss/.reforma-plugin/plugin.json +++ b/marketplace/ui/coss/.reforma-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "coss", - "description": "Extra components and particles on top of shadcn.", + "description": "Extra components and particle effects beyond the default shadcn set", "logo": "assets/logo.svg", "author": { "name": "coss" diff --git a/marketplace/ui/coss/assets/logo.svg b/marketplace/ui/coss/assets/logo.svg index ba87b9a..8894711 100644 --- a/marketplace/ui/coss/assets/logo.svg +++ b/marketplace/ui/coss/assets/logo.svg @@ -1,3 +1,8 @@ - - C + + + + + + + diff --git a/marketplace/ui/flexnative/.reforma-plugin/plugin.json b/marketplace/ui/flexnative/.reforma-plugin/plugin.json index 23dabf4..b4c842e 100644 --- a/marketplace/ui/flexnative/.reforma-plugin/plugin.json +++ b/marketplace/ui/flexnative/.reforma-plugin/plugin.json @@ -1,7 +1,7 @@ { "name": "flexnative", - "description": "Ready-made blocks and patterns on top of shadcn.", - "logo": "assets/logo.svg", + "description": "Ready-made page blocks and patterns — drop in a section instead of assembling it", + "logo": "assets/logo.png", "author": { "name": "Flexnative" }, @@ -10,6 +10,7 @@ "license": "AGPL-3.0", "interface": { "displayName": "Flexnative", - "brandColor": "#0A0A0A" + "brandColor": "#0A0A0A", + "logo": "assets/logo.png" } } diff --git a/marketplace/ui/flexnative/assets/logo.png b/marketplace/ui/flexnative/assets/logo.png new file mode 100644 index 0000000..6d732ee Binary files /dev/null and b/marketplace/ui/flexnative/assets/logo.png differ diff --git a/marketplace/ui/flexnative/assets/logo.svg b/marketplace/ui/flexnative/assets/logo.svg deleted file mode 100644 index 1286cff..0000000 --- a/marketplace/ui/flexnative/assets/logo.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/marketplace/ui/fonts/assets/logo.svg b/marketplace/ui/fonts/assets/logo.svg deleted file mode 100644 index 30379c8..0000000 --- a/marketplace/ui/fonts/assets/logo.svg +++ /dev/null @@ -1,3 +0,0 @@ - - Aa - diff --git a/marketplace/ui/i18n/.reforma-plugin/plugin.json b/marketplace/ui/i18n/.reforma-plugin/plugin.json index 3512fae..ba2046a 100644 --- a/marketplace/ui/i18n/.reforma-plugin/plugin.json +++ b/marketplace/ui/i18n/.reforma-plugin/plugin.json @@ -1,7 +1,13 @@ { "name": "i18n", - "description": "Locales, translated copy, and language switching for the app.", + "description": "Multiple languages — translated copy and a language switcher for the app", "author": { "name": "Reforma" + }, + "logo": "assets/logo.svg", + "interface": { + "displayName": "i18n", + "brandColor": "#1D4ED8", + "logo": "assets/logo.svg" } } diff --git a/marketplace/ui/i18n/assets/logo.svg b/marketplace/ui/i18n/assets/logo.svg new file mode 100644 index 0000000..0f518f9 --- /dev/null +++ b/marketplace/ui/i18n/assets/logo.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/marketplace/ui/i18n/skills/i18n/SKILL.md b/marketplace/ui/i18n/skills/i18n/SKILL.md index 39566c0..624dcae 100644 --- a/marketplace/ui/i18n/skills/i18n/SKILL.md +++ b/marketplace/ui/i18n/skills/i18n/SKILL.md @@ -19,9 +19,9 @@ Done when `/` and `/` both render, `` matches t 1. `bun add next-intl`. If `package.json` / lockfile changed → **InstallDependencies**. 2. Add the four files below. Locales = what the user named (BCP 47, e.g. `en`, `es`, `pt-BR`). Default = first / the one they called default. At least two locales. 3. Wrap the **existing** `next.config.ts` with `createNextIntlPlugin('./i18n/request.ts')`. Keep `turbopack`, `typescript`, and every other key. -4. Add root `middleware.ts`. +4. Add root `proxy.ts`. 5. Move route files (`layout.tsx`, `page.tsx`, and other `app/**/page.tsx` trees) under `app/[locale]/`. Leave `app/fonts/` and `app/tokens/` where they are. After the move, `app/layout.tsx` and `app/page.tsx` must not remain at the root — `[locale]/layout.tsx` is the `` owner. -6. Locale layout owns `` (and `dir="rtl"` for `ar` / `he` / `fa` / `ur`), fonts, `Providers`, and `NextIntlClientProvider`. Call `setRequestLocale(locale)` after `hasLocale`. Export `generateStaticParams` from `routing.locales`. +6. Locale layout owns `` (and `dir="rtl"` for `ar` / `he` / `fa` / `ur`), fonts, `Providers`, and `NextIntlClientProvider`. `params` is a Promise — `const { locale } = await params`. Call `setRequestLocale(locale)` after `hasLocale`. Export `generateStaticParams` from `routing.locales`. 7. Seed `messages/.json` for every locale. Same keys everywhere. ### `i18n/routing.ts` @@ -65,7 +65,7 @@ export default getRequestConfig(async ({ requestLocale }) => { }); ``` -### `middleware.ts` +### `proxy.ts` ```ts import createMiddleware from "next-intl/middleware"; diff --git a/marketplace/ui/magic-ui/.reforma-plugin/plugin.json b/marketplace/ui/magic-ui/.reforma-plugin/plugin.json index a05808e..ce22224 100644 --- a/marketplace/ui/magic-ui/.reforma-plugin/plugin.json +++ b/marketplace/ui/magic-ui/.reforma-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "magic-ui", - "description": "Animated marketing components on top of shadcn.", + "description": "Animated marketing pieces — shine, marquee, shimmer, and that kind of polish", "logo": "assets/logo.svg", "author": { "name": "Magic UI" diff --git a/marketplace/ui/shadcn-tailwind/assets/logo.png b/marketplace/ui/shadcn-tailwind/assets/logo.png deleted file mode 100644 index b7b6814..0000000 Binary files a/marketplace/ui/shadcn-tailwind/assets/logo.png and /dev/null differ diff --git a/marketplace/ui/svg/.reforma-plugin/plugin.json b/marketplace/ui/svg/.reforma-plugin/plugin.json new file mode 100644 index 0000000..55b479c --- /dev/null +++ b/marketplace/ui/svg/.reforma-plugin/plugin.json @@ -0,0 +1,12 @@ +{ + "name": "svg", + "description": "Logos, favicons, and inline SVG. Icons stay on Lucide or the project’s pack.", + "logo": "assets/logo.svg", + "author": { + "name": "Reforma" + }, + "interface": { + "displayName": "SVG", + "brandColor": "#171717" + } +} diff --git a/marketplace/ui/svg/assets/logo.svg b/marketplace/ui/svg/assets/logo.svg new file mode 100644 index 0000000..b33f0ef --- /dev/null +++ b/marketplace/ui/svg/assets/logo.svg @@ -0,0 +1,4 @@ + + + + diff --git a/marketplace/ui/svg/skills/svg/SKILL.md b/marketplace/ui/svg/skills/svg/SKILL.md new file mode 100644 index 0000000..8b87da5 --- /dev/null +++ b/marketplace/ui/svg/skills/svg/SKILL.md @@ -0,0 +1,60 @@ +--- +name: svg +description: >- + Crafts an app mark, favicon, or inline SVG illustration. Use when the user + wants a logo, favicon, or a custom SVG drawing. UI chrome icons stay on the + project's icon pack (Lucide on the starter). +--- + +# SVG + +## UI icons + +Chevrons, search, close, spinners, status, and other chrome: an **icon pack already in the project**. Starter is Lucide — `import { SearchIcon } from 'lucide-react'` (suffix `Icon`, same as `components/ui`). Pack name: `components.json` → `iconLibrary`. A different pack already in `package.json` — that import, not a second pack. + +A new pack only when the user named it → **InstallDependencies**. No inline SVG for a glyph a pack already has. No icon CDNs. + +Done when the glyph is an import from that pack. + +## Mark + +Favicon, app symbol, or a drawing that is not chrome. Photo-like art: installed Recraft / Quiver skill. + +Geometric `path` / `circle` / `rect`. `viewBox` set. `fill="currentColor"` (or a token class). No `` — letters in the header are HTML + **Skill** `fonts`. No raw hex unless the mark must stay off-token. + +`d` commands: **uppercase = absolute**, lowercase = relative. Each command takes exactly those args. + +| Cmd | Job | Args | +| --- | ---------------- | --------------------------------- | +| `M` | Move | `x y` | +| `L` | Line | `x y` | +| `H` | Horizontal | `x` | +| `V` | Vertical | `y` | +| `C` | Cubic bézier | `x1 y1 x2 y2 x y` | +| `S` | Smooth cubic | `x2 y2 x y` | +| `Q` | Quadratic | `x1 y1 x y` | +| `T` | Smooth quadratic | `x y` | +| `A` | Arc | `rx ry x-rot large-arc sweep x y` | +| `Z` | Close | — | + +`A`: `large-arc` 0 = short, 1 = >180°. `sweep` 0 = CCW, 1 = CW. `C`: first control = leave, second = arrive. + +Tab icon: `app/icon.svg`. In-app: `components/logo.tsx` with `cn('size-8', className)`. + +```tsx +import { cn } from "@/lib/utils"; + +export function Logo({ className }: { className?: string }) { + return ( + + + + ); +} +``` + +Done when it reads at **16px** and at **512px**. + +## Motion + +Property animation (draw-on, SMIL, morph): [animate.md](animate.md). Page choreography: installed **Skill** `motion` / `gsap`. SVG timeline editor: installed **Skill** `svgator`. diff --git a/marketplace/ui/svg/skills/svg/animate.md b/marketplace/ui/svg/skills/svg/animate.md new file mode 100644 index 0000000..7a6a2fb --- /dev/null +++ b/marketplace/ui/svg/skills/svg/animate.md @@ -0,0 +1,112 @@ +# Animate + +Mark motion lives on the SVG nodes. Page choreography: installed **Skill** `motion` / `gsap`. Timeline editor: installed **Skill** `svgator`. + +Inline in `components/logo.tsx` → CSS. `app/icon.svg` / `` / `background-image` → SMIL in the markup (CSS cannot reach). Rest pose is frame 0. + +`transform` and `opacity` composite. `d`, `r`, `cx`, `points` repaint — spare. `transform-origin: center` — SVG default is `0 0`. + +`@media (prefers-reduced-motion: reduce)` → no CSS animation. SMIL: omit ``. + +Done when the still frame is the logo, then the property the user named actually moves. + +## CSS properties + +These interpolate as CSS: `fill`, `stroke`, `opacity`, `transform`, `stroke-dasharray`, `stroke-dashoffset`. Color = `currentColor` or a token class. + +```css +.mark { + transform-origin: center; + animation: pulse 2s ease-in-out infinite; +} +@keyframes pulse { + 50% { + transform: scale(1.08); + opacity: 0.85; + } +} +``` + +**Draw-on.** `pathLength="1"` — do not guess dash length. + +```tsx + +``` + +```css +.draw { + stroke-dasharray: 1; + stroke-dashoffset: 1; + animation: draw 1.2s ease forwards; +} +@keyframes draw { + to { + stroke-dashoffset: 0; + } +} +``` + +Stagger siblings with `animation-delay`. Morph `d` in CSS only when both paths have the **same commands in the same order**: + +```css +path { + d: path("M 4 16 L 28 16"); + transition: d 0.3s ease; +} +path:hover { + d: path("M 8 8 L 24 24"); +} +``` + +## SMIL + +Child of the shape. `fill="freeze"` keeps the end state. + +```svg + + + +``` + +| Element | Job | +| ------------------------- | ------------------------------------------------------------ | +| `` | Any attr (`r`, `cx`, `d`, `stroke-dashoffset`, `stop-color`) | +| `` | `translate` / `scale` / `rotate` / `skewX` / `skewY` | +| `` | Follow a path; `rotate="auto"` = tangent | +| `` | Jump an attr at `begin` | + +Chain: `id` on the first, `begin="first.end"` or `begin="first.end + 0.3s"`. Also `begin="click"` / `begin="2s"`. + +Easing: `calcMode="spline"` + `keySplines="0.42 0 0.58 1"` (one spline per interval). + +Morph: identical command count and types (table in SKILL.md). Same letters, same argument counts, same order. + +```svg + + + +``` + +Motion path: + +```svg + + + + + + +``` diff --git a/marketplace/ui/tailark/.reforma-plugin/plugin.json b/marketplace/ui/tailark/.reforma-plugin/plugin.json index 294edcf..33ec159 100644 --- a/marketplace/ui/tailark/.reforma-plugin/plugin.json +++ b/marketplace/ui/tailark/.reforma-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "tailark", - "description": "Marketing blocks and pages on top of shadcn.", + "description": "Marketing landing blocks and pages — heroes, pricing, footers", "logo": "assets/logo.svg", "author": { "name": "Tailark" @@ -8,6 +8,7 @@ "homepage": "https://tailark.com", "interface": { "displayName": "Tailark", - "brandColor": "#9FA87F" + "brandColor": "#9FA87F", + "logo": "assets/logo.svg" } } diff --git a/marketplace/workspace/context7/.reforma-plugin/plugin.json b/marketplace/workspace/context7/.reforma-plugin/plugin.json index aa6de4f..0c78bd6 100644 --- a/marketplace/workspace/context7/.reforma-plugin/plugin.json +++ b/marketplace/workspace/context7/.reforma-plugin/plugin.json @@ -1,21 +1,11 @@ { "name": "context7", - "description": "Up-to-date library docs and examples. Needs an API key.", + "description": "Current docs and examples for the libraries in the project", "logo": "assets/logo.svg", + "homepage": "https://context7.com/docs/howto/oauth", "interface": { - "brandColor": "#000000" + "brandColor": "#000000", + "displayName": "Context7" }, - "mcpServers": "./mcp.json", - "variables": { - "type": "object", - "properties": { - "API_KEY": { - "type": "string", - "title": "API key", - "description": "From context7.com. Sent as CONTEXT7_API_KEY on MCP requests. Stored in the vault, never returned on GET.", - "placeholder": "ctx7sk-…" - } - }, - "required": ["API_KEY"] - } + "mcpServers": "./mcp.json" } diff --git a/marketplace/workspace/context7/mcp.json b/marketplace/workspace/context7/mcp.json index dd3d64e..02d97b1 100644 --- a/marketplace/workspace/context7/mcp.json +++ b/marketplace/workspace/context7/mcp.json @@ -1,49 +1,46 @@ { - "mcpServers": { - "context7": { - "url": "https://mcp.context7.com/mcp", - "headers": { - "CONTEXT7_API_KEY": "${API_KEY}" + "mcpServers": { + "context7": { + "url": "https://mcp.context7.com/mcp/oauth", + "description": "Up-to-date, version-specific documentation and code examples for external libraries and frameworks.", + "tools": { + "resolve-library-id": { + "title": "Resolve Context7 Library ID", + "description": "Resolve a library name to a Context7-compatible library ID. Call before query-docs unless the user already gave an id like /org/project.", + "inputSchema": { + "type": "object", + "properties": { + "query": { + "type": "string", + "description": "The user's original question or task, used to rank library matches by relevance." + }, + "libraryName": { + "type": "string", + "description": "Library or package name to search for (e.g. react, next.js)." + } }, - "description": "Up-to-date, version-specific documentation and code examples for external libraries and frameworks.", - "tools": { - "resolve-library-id": { - "title": "Resolve Context7 Library ID", - "description": "Resolve a library name to a Context7-compatible library ID. Call before query-docs unless the user already gave an id like /org/project.", - "inputSchema": { - "type": "object", - "properties": { - "query": { - "type": "string", - "description": "The user's original question or task, used to rank library matches by relevance." - }, - "libraryName": { - "type": "string", - "description": "Library or package name to search for (e.g. react, next.js)." - } - }, - "required": ["query", "libraryName"] - } - }, - "query-docs": { - "title": "Query Documentation", - "description": "Fetch up-to-date docs and code examples for a Context7 library id.", - "inputSchema": { - "type": "object", - "properties": { - "libraryId": { - "type": "string", - "description": "Context7-compatible library id from resolve-library-id (e.g. /vercel/ai)." - }, - "query": { - "type": "string", - "description": "Specific documentation question or topic." - } - }, - "required": ["libraryId", "query"] - } - } - } + "required": ["query", "libraryName"] + } + }, + "query-docs": { + "title": "Query Documentation", + "description": "Fetch up-to-date docs and code examples for a Context7 library id.", + "inputSchema": { + "type": "object", + "properties": { + "libraryId": { + "type": "string", + "description": "Context7-compatible library id from resolve-library-id (e.g. /vercel/ai)." + }, + "query": { + "type": "string", + "description": "Specific documentation question or topic." + } + }, + "required": ["libraryId", "query"] + } } + } } + } } diff --git a/marketplace/workspace/github-mcp/.reforma-plugin/plugin.json b/marketplace/workspace/github-mcp/.reforma-plugin/plugin.json index 65e335c..f7b9f5c 100644 --- a/marketplace/workspace/github-mcp/.reforma-plugin/plugin.json +++ b/marketplace/workspace/github-mcp/.reforma-plugin/plugin.json @@ -1,10 +1,15 @@ { "name": "github-mcp", - "description": "Search issues, pull requests, and code in GitHub repositories.", + "description": "GitHub in the project — issues, pull requests, and the repo", "author": { "name": "GitHub", "url": "https://github.com" }, "logo": "assets/logo.svg", - "mcpServers": "./mcp.json" + "mcpServers": "./mcp.json", + "interface": { + "displayName": "GitHub", + "brandColor": "#181717", + "logo": "assets/logo.svg" + } } diff --git a/marketplace/workspace/github-mcp/assets/logo.svg b/marketplace/workspace/github-mcp/assets/logo.svg index 538ec5b..400b0ca 100644 --- a/marketplace/workspace/github-mcp/assets/logo.svg +++ b/marketplace/workspace/github-mcp/assets/logo.svg @@ -1 +1,3 @@ -GitHub \ No newline at end of file + + + diff --git a/marketplace/workspace/slack/.reforma-plugin/plugin.json b/marketplace/workspace/slack/.reforma-plugin/plugin.json index 9af4d10..e44718e 100644 --- a/marketplace/workspace/slack/.reforma-plugin/plugin.json +++ b/marketplace/workspace/slack/.reforma-plugin/plugin.json @@ -1,10 +1,15 @@ { "name": "slack", - "description": "Search channels, read threads, and post to the Slack workspace.", + "description": "The team’s Slack — channels, threads, and posts from the project", "author": { "name": "Slack", "url": "https://slack.com" }, "logo": "assets/logo.svg", - "mcpServers": "./mcp.json" + "mcpServers": "./mcp.json", + "interface": { + "displayName": "Slack", + "brandColor": "#4A154B", + "logo": "assets/logo.svg" + } } diff --git a/marketplace/workspace/slack/assets/logo.svg b/marketplace/workspace/slack/assets/logo.svg index 004e266..b8b54ad 100644 --- a/marketplace/workspace/slack/assets/logo.svg +++ b/marketplace/workspace/slack/assets/logo.svg @@ -1 +1,3 @@ -Slack \ No newline at end of file + + + diff --git a/scripts/pack/index.ts b/scripts/pack/index.ts index 71520bd..46fd63e 100644 --- a/scripts/pack/index.ts +++ b/scripts/pack/index.ts @@ -18,36 +18,33 @@ import { import { fetchGithubTree } from "./github.ts"; import { normalizePluginHooks } from "./hooks.ts"; import { normalizePluginLayout } from "./layout.ts"; -import { normalizePluginLogos } from "./logos.ts"; +import { normalizePluginLogos, applyCatalogOverlay } from "./logos.ts"; import { discoverMcpTools } from "./mcp-tools.ts"; -import { OUT, ROOT, TAR, parseMarketplace } from "./shared.ts"; +import { OUT, ROOT, TAR, parseMarketplace, type MarketplaceListing } from "./shared.ts"; import { logCatalogSummary } from "./summary.ts"; import { normalizePluginTools } from "./tools.ts"; -async function packPlugin( - name: string, - source: string, - category: string, -): Promise { - const dest = join(OUT, name); +async function packPlugin(listing: MarketplaceListing): Promise { + const dest = join(OUT, listing.name); - if (/^https?:\/\//i.test(source)) { - await fetchGithubTree(source, dest); + if (/^https?:\/\//i.test(listing.source)) { + await fetchGithubTree(listing.source, dest); normalizePluginLayout(dest); normalizePluginContentPaths(dest); normalizePluginHooks(dest); await normalizePluginTools(dest); + applyCatalogOverlay(dest, listing); await normalizePluginLogos(dest); await discoverMcpTools(dest); - stampPluginCategory(dest, category); + stampPluginCategory(dest, listing.category); return; } - const from = resolve(ROOT, source); + const from = resolve(ROOT, listing.source); if (!existsSync(from)) { - throw new Error(`Plugin source missing: ${source}`); + throw new Error(`Plugin source missing: ${listing.source}`); } mkdirSync(dest, { recursive: true }); @@ -56,9 +53,10 @@ async function packPlugin( normalizePluginContentPaths(dest); normalizePluginHooks(dest); await normalizePluginTools(dest); + applyCatalogOverlay(dest, listing); await normalizePluginLogos(dest); await discoverMcpTools(dest); - stampPluginCategory(dest, category); + stampPluginCategory(dest, listing.category); } const raw = JSON.parse( @@ -75,7 +73,7 @@ for (const name of marketplace.skipped) { for (const plugin of marketplace.plugins) { console.log(`pack ${plugin.name} ← ${plugin.source}`); - await packPlugin(plugin.name, plugin.source, plugin.category); + await packPlugin(plugin); } writeFileSync( diff --git a/scripts/pack/logos.test.ts b/scripts/pack/logos.test.ts new file mode 100644 index 0000000..a329593 --- /dev/null +++ b/scripts/pack/logos.test.ts @@ -0,0 +1,86 @@ +import { afterEach, describe, expect, it } from "bun:test"; +import { + mkdirSync, + mkdtempSync, + readFileSync, + rmSync, + writeFileSync, +} from "node:fs"; +import { tmpdir } from "node:os"; +import { join } from "node:path"; +import { applyCatalogOverlay } from "./logos.ts"; + +describe("applyCatalogOverlay", () => { + const dirs: string[] = []; + + afterEach(() => { + for (const dir of dirs.splice(0)) { + rmSync(dir, { recursive: true, force: true }); + } + }); + + it("stamps displayName and description onto a remote pin", () => { + const dir = mkdtempSync(join(tmpdir(), "overlay-")); + const pluginDir = join(dir, "gsap"); + + dirs.push(dir); + mkdirSync(join(pluginDir, ".reforma-plugin"), { recursive: true }); + writeFileSync( + join(pluginDir, ".reforma-plugin/plugin.json"), + `${JSON.stringify( + { + name: "gsap-skills", + description: "Official GSAP skills for Cursor", + }, + null, + 4, + )}\n`, + ); + + applyCatalogOverlay(pluginDir, { + name: "gsap", + source: "https://github.com/greensock/gsap-skills/tree/abc", + category: "ui", + displayName: "GSAP", + description: "Animation timelines, ScrollTrigger, and GSAP plugins.", + }); + + expect( + JSON.parse( + readFileSync(join(pluginDir, ".reforma-plugin/plugin.json"), "utf8"), + ), + ).toMatchObject({ + name: "gsap-skills", + description: "Animation timelines, ScrollTrigger, and GSAP plugins.", + interface: { displayName: "GSAP" }, + }); + }); + + it("stamps an http logo for pack to download", () => { + const dir = mkdtempSync(join(tmpdir(), "overlay-")); + const pluginDir = join(dir, "stripe"); + + dirs.push(dir); + mkdirSync(join(pluginDir, ".reforma-plugin"), { recursive: true }); + writeFileSync( + join(pluginDir, ".reforma-plugin/plugin.json"), + `${JSON.stringify({ name: "stripe" }, null, 4)}\n`, + ); + + applyCatalogOverlay(pluginDir, { + name: "stripe", + source: "https://github.com/stripe/ai/tree/abc", + category: "payments", + logo: "https://stripe.com/favicon.ico", + }); + + expect( + JSON.parse( + readFileSync(join(pluginDir, ".reforma-plugin/plugin.json"), "utf8"), + ), + ).toMatchObject({ + logo: "https://stripe.com/favicon.ico", + interface: { logo: "https://stripe.com/favicon.ico" }, + }); + }); +}); diff --git a/scripts/pack/logos.ts b/scripts/pack/logos.ts index 692d97e..ddc5250 100644 --- a/scripts/pack/logos.ts +++ b/scripts/pack/logos.ts @@ -1,13 +1,20 @@ import { + cpSync, existsSync, mkdirSync, readFileSync, + readdirSync, statSync, unlinkSync, writeFileSync, } from "node:fs"; -import { join } from "node:path"; -import { findManifestPath, isRecord } from "./shared.ts"; +import { extname, join } from "node:path"; +import { + findManifestPath, + isRecord, + ROOT, + type MarketplaceListing, +} from "./shared.ts"; export const LOGO_EXT = new Set(["svg", "png", "webp", "jpg", "jpeg"]); export const LOGO_MAX_BYTES = 512 * 1024; @@ -181,3 +188,113 @@ export async function normalizePluginLogos(pluginDir: string): Promise { writeFileSync(manifestPath, `${JSON.stringify(json, null, 4)}\n`); } +function listingBrandLogo(name: string): string | undefined { + const dir = join(ROOT, "marketplace/_brand", name); + + if (!existsSync(dir)) { + return undefined; + } + + for (const file of readdirSync(dir)) { + if (file.startsWith("logo.") && LOGO_EXT.has(extOf(file))) { + return join(dir, file); + } + } + + return undefined; +} + +function stampInterface( + json: Record, + patch: { displayName?: string; brandColor?: string; logo?: string }, +): void { + const iface = isRecord(json.interface) ? json.interface : {}; + + if (patch.displayName) { + iface.displayName = patch.displayName; + } + + if (patch.brandColor) { + iface.brandColor = patch.brandColor; + } + + if (patch.logo) { + iface.logo = patch.logo; + } + + json.interface = iface; +} + +/** Overlay display name, description, and logo from marketplace.json / `_brand`. */ +export function applyCatalogOverlay( + pluginDir: string, + listing: MarketplaceListing, +): void { + const manifestPath = findManifestPath(pluginDir); + + if (!manifestPath) { + throw new Error(`no plugin.json in ${pluginDir}`); + } + + const json = JSON.parse(readFileSync(manifestPath, "utf8")) as unknown; + + if (!isRecord(json)) { + throw new Error(`invalid plugin.json ${manifestPath}`); + } + + const httpLogo = + listing.logo && /^https?:\/\//i.test(listing.logo) + ? listing.logo + : undefined; + const fromListing = + listing.logo && !httpLogo ? join(ROOT, listing.logo) : undefined; + const file = fromListing ?? (httpLogo ? undefined : listingBrandLogo(listing.name)); + let logo = httpLogo; + + if (file) { + if (!existsSync(file)) { + throw new Error(`overlay logo missing ${file}`); + } + + const ext = extOf(file); + + if (!LOGO_EXT.has(ext)) { + throw new Error(`unsupported overlay logo ${file}`); + } + + const rel = `assets/logo${extname(file).toLowerCase() === ".jpeg" ? ".jpg" : extname(file).toLowerCase()}`; + + mkdirSync(join(pluginDir, "assets"), { recursive: true }); + cpSync(file, join(pluginDir, rel)); + logo = rel; + } + + if ( + !listing.displayName && + !listing.description && + !listing.brandColor && + !logo + ) { + return; + } + + if (listing.displayName) { + stampInterface(json, { displayName: listing.displayName }); + } + + if (listing.description) { + json.description = listing.description; + } + + if (listing.brandColor) { + stampInterface(json, { brandColor: listing.brandColor }); + } + + if (logo) { + json.logo = logo; + stampInterface(json, { logo }); + } + + writeFileSync(manifestPath, `${JSON.stringify(json, null, 4)}\n`); +} + diff --git a/scripts/pack/shared.test.ts b/scripts/pack/shared.test.ts index 1fd183c..eb49873 100644 --- a/scripts/pack/shared.test.ts +++ b/scripts/pack/shared.test.ts @@ -50,4 +50,45 @@ describe("parseMarketplace", () => { }), ).toThrow(/disabled must be true/); }); + + it("keeps displayName and description on the listing, not in packed categories", () => { + const parsed = parseMarketplace({ + categories: [ + { + id: "ui", + name: "UI", + plugins: [ + { + name: "gsap", + source: "https://github.com/greensock/gsap-skills/tree/abc", + displayName: "GSAP", + description: "Animation timelines.", + }, + ], + }, + ], + }); + + expect(parsed.plugins).toEqual([ + { + name: "gsap", + source: "https://github.com/greensock/gsap-skills/tree/abc", + category: "ui", + displayName: "GSAP", + description: "Animation timelines.", + }, + ]); + expect(parsed.categories).toEqual([ + { + id: "ui", + name: "UI", + plugins: [ + { + name: "gsap", + source: "https://github.com/greensock/gsap-skills/tree/abc", + }, + ], + }, + ]); + }); }); diff --git a/scripts/pack/shared.ts b/scripts/pack/shared.ts index a15d7b9..e4fb7de 100644 --- a/scripts/pack/shared.ts +++ b/scripts/pack/shared.ts @@ -46,6 +46,10 @@ export type MarketplaceListing = { name: string; source: string; category: string; + displayName?: string; + description?: string; + logo?: string; + brandColor?: string; }; /** Nested `categories[].plugins` → flat listings. Shelf is the parent category. */ @@ -126,7 +130,15 @@ export function parseMarketplace(raw: unknown): { } packed.push({ name: plugin.name, source: plugin.source }); - plugins.push({ name: plugin.name, source: plugin.source, category: id }); + plugins.push({ + name: plugin.name, + source: plugin.source, + category: id, + ...optionalListingField(plugin, "displayName"), + ...optionalListingField(plugin, "description"), + ...optionalListingField(plugin, "logo"), + ...optionalListingField(plugin, "brandColor"), + }); } categories.push( @@ -137,6 +149,23 @@ export function parseMarketplace(raw: unknown): { return { categories, plugins, skipped }; } +function optionalListingField( + plugin: Record, + key: "displayName" | "description" | "logo" | "brandColor", +): Partial> { + const value = plugin[key]; + + if (value === undefined) { + return {}; + } + + if (typeof value !== "string" || !value.trim()) { + throw new Error(`marketplace.json plugin ${plugin.name} ${key} must be a string`); + } + + return { [key]: value.trim() }; +} + export function asPathList(raw: unknown, label: string): string[] | undefined { if (raw === undefined) { return undefined;