From 224173723ff315dca8099c2f0aef2c927bf4b76d Mon Sep 17 00:00:00 2001 From: Maksim Kachurin Date: Fri, 28 Aug 2026 00:04:51 -0300 Subject: [PATCH 1/2] chore: Cleanup --- README.md | 144 +++++++++--------- marketplace.json | 108 ++++++++----- marketplace/_brand/appwrite/logo.svg | 3 + marketplace/_brand/convex/logo.svg | 3 + marketplace/_brand/dropbox/logo.svg | 3 + marketplace/_brand/firebase/logo.png | Bin 0 -> 2763 bytes marketplace/_brand/gsap/logo.png | Bin 0 -> 13780 bytes marketplace/_brand/higgsfield/logo.png | Bin 0 -> 8365 bytes marketplace/_brand/linear/logo.svg | 3 + marketplace/_brand/mapbox/logo.svg | 3 + marketplace/_brand/motion/logo.png | Bin 0 -> 3942 bytes marketplace/_brand/notion-workspace/logo.svg | 3 + marketplace/_brand/prisma/logo.svg | 3 + marketplace/_brand/quiver/logo.png | Bin 0 -> 4483 bytes marketplace/_brand/remotion/logo.png | Bin 0 -> 1286 bytes marketplace/_brand/resend/logo.svg | 3 + marketplace/_brand/sentry/logo.svg | 3 + marketplace/_brand/stripe/logo.svg | 3 + marketplace/_brand/supabase/logo.svg | 3 + .../amplitude/.reforma-plugin/plugin.json | 10 +- .../analytics/amplitude/assets/logo.png | Bin 0 -> 11789 bytes .../posthog/.reforma-plugin/plugin.json | 10 +- marketplace/analytics/posthog/assets/logo.svg | 3 + .../auth/auth0/.reforma-plugin/plugin.json | 10 +- marketplace/auth/auth0/assets/logo.svg | 3 + .../auth/clerk/.reforma-plugin/plugin.json | 8 +- .../auth/workos/.reforma-plugin/plugin.json | 10 +- marketplace/auth/workos/assets/logo.png | Bin 0 -> 6343 bytes .../composio/.reforma-plugin/plugin.json | 10 +- .../automation/composio/assets/logo.png | Bin 0 -> 8828 bytes .../make/.reforma-plugin/plugin.json | 10 +- marketplace/automation/make/assets/logo.svg | 3 + .../n8n/.reforma-plugin/plugin.json | 10 +- marketplace/automation/n8n/assets/logo.svg | 3 + .../zapier/.reforma-plugin/plugin.json | 10 +- marketplace/automation/zapier/assets/logo.svg | 3 + .../backend/neon/.reforma-plugin/plugin.json | 10 +- marketplace/backend/neon/assets/logo.svg | 3 + .../cms/sanity/.reforma-plugin/plugin.json | 10 +- marketplace/cms/sanity/assets/logo.svg | 3 + .../demo/demo-kit/.reforma-plugin/plugin.json | 28 ---- .../demo/demo-kit/agents/demo-researcher.md | 6 - .../demo/demo-kit/agents/demo-reviewer.md | 6 - .../demo/demo-kit/agents/demo-writer.md | 6 - marketplace/demo/demo-kit/assets/logo.svg | 3 - marketplace/demo/demo-kit/hooks/hooks.json | 47 ------ marketplace/demo/demo-kit/hooks/pre_bash.sh | 10 -- .../demo/demo-kit/hooks/prompt_echo.sh | 3 - .../demo/demo-kit/hooks/session_end.sh | 3 - .../demo/demo-kit/hooks/session_start.sh | 3 - marketplace/demo/demo-kit/mcp.json | 13 -- marketplace/demo/demo-kit/rules/kit-house.md | 7 - .../skills/demo-release-notes/SKILL.md | 8 - .../demo/demo-kit/skills/demo-triage/SKILL.md | 8 - .../demo/demo-kit/skills/kit-ship/SKILL.md | 9 -- marketplace/demo/demo-kit/tools/KitPing.ts | 20 --- marketplace/demo/demo-kit/tools/Waiting.ts | 27 ---- .../design/figma/.reforma-plugin/plugin.json | 10 +- marketplace/design/figma/assets/logo.png | Bin 0 -> 2667 bytes .../cloudinary/.reforma-plugin/plugin.json | 8 +- .../google-drive/.reforma-plugin/plugin.json | 7 +- .../game-creator/.reforma-plugin/plugin.json | 8 +- .../games/game-creator/assets/logo.svg | 10 ++ .../google-maps/.reforma-plugin/plugin.json | 9 +- marketplace/maps/google-maps/assets/logo.svg | 4 +- .../elevenlabs/.reforma-plugin/plugin.json | 9 +- marketplace/media/elevenlabs/assets/logo.svg | 4 +- .../media/fal/.reforma-plugin/plugin.json | 12 +- marketplace/media/fal/assets/logo.png | Bin 0 -> 3845 bytes .../media/heygen/.reforma-plugin/plugin.json | 10 +- marketplace/media/heygen/assets/logo.png | Bin 0 -> 3868 bytes .../lottiefiles/.reforma-plugin/plugin.json | 10 +- marketplace/media/lottiefiles/assets/logo.svg | 3 + .../media/recraft/.reforma-plugin/plugin.json | 10 +- marketplace/media/recraft/assets/logo.png | Bin 0 -> 858 bytes .../replicate/.reforma-plugin/plugin.json | 9 +- marketplace/media/replicate/assets/logo.svg | 4 +- .../media/svgator/.reforma-plugin/plugin.json | 10 +- marketplace/media/svgator/assets/logo.png | Bin 0 -> 4866 bytes .../bro-mode/.reforma-plugin/plugin.json | 2 +- marketplace/moods/bro-mode/assets/logo.svg | 7 +- .../moods/caveman-mode/assets/logo.svg | 6 +- .../hype-man/.reforma-plugin/plugin.json | 2 +- marketplace/moods/hype-man/assets/logo.svg | 8 +- .../professor/.reforma-plugin/plugin.json | 2 +- marketplace/moods/professor/assets/logo.svg | 8 +- .../moods/ship-it/.reforma-plugin/plugin.json | 2 +- marketplace/moods/ship-it/assets/logo.svg | 9 +- .../zen-mode/.reforma-plugin/plugin.json | 2 +- marketplace/moods/zen-mode/assets/logo.svg | 7 +- .../shopify/.reforma-plugin/plugin.json | 10 +- marketplace/payments/shopify/assets/logo.svg | 3 + .../booking/.reforma-plugin/plugin.json | 2 +- .../scheduling/booking/assets/logo.svg | 12 +- .../cal-com/.reforma-plugin/plugin.json | 5 +- .../scheduling/cal-com/assets/logo.svg | 4 +- .../calendly/.reforma-plugin/plugin.json | 5 +- .../scheduling/calendly/assets/logo.svg | 4 +- .../fonts/.reforma-plugin/plugin.json | 2 +- marketplace/system/fonts/assets/logo.svg | 7 + .../fonts/skills/fonts/SKILL.md | 0 .../system/nextjs/.reforma-plugin/plugin.json | 12 ++ marketplace/system/nextjs/assets/logo.svg | 3 + .../system/nextjs/skills/nextjs/SKILL.md | 48 ++++++ .../system/nextjs/skills/nextjs/handlers.md | 48 ++++++ .../.reforma-plugin/plugin.json | 7 +- .../system/shadcn-tailwind/assets/logo.png | Bin 0 -> 3630 bytes .../{ui => system}/shadcn-tailwind/mcp.json | 0 .../shadcn-tailwind/skills/shadcn/SKILL.md | 16 +- .../shadcn-tailwind/skills/tailwind/SKILL.md | 38 +++++ .../ui/21st/.reforma-plugin/plugin.json | 11 +- marketplace/ui/21st/assets/logo.png | Bin 0 -> 3359 bytes marketplace/ui/21st/assets/logo.svg | 4 - marketplace/ui/21st/mcp.json | 2 +- .../ui/aceternity/.reforma-plugin/plugin.json | 5 +- marketplace/ui/aceternity/assets/logo.png | Bin 9484 -> 2938 bytes .../ui/coss/.reforma-plugin/plugin.json | 2 +- marketplace/ui/coss/assets/logo.svg | 9 +- .../ui/flexnative/.reforma-plugin/plugin.json | 7 +- marketplace/ui/flexnative/assets/logo.png | Bin 0 -> 17204 bytes marketplace/ui/flexnative/assets/logo.svg | 8 - marketplace/ui/fonts/assets/logo.svg | 3 - .../.reforma-plugin/plugin.json | 2 +- .../ui/i18n/.reforma-plugin/plugin.json | 8 +- marketplace/ui/i18n/assets/logo.svg | 5 + marketplace/ui/i18n/skills/i18n/SKILL.md | 6 +- .../ui/magic-ui/.reforma-plugin/plugin.json | 2 +- .../.reforma-plugin/plugin.json | 2 +- .../ui/shadcn-tailwind/assets/logo.png | Bin 3852 -> 0 bytes .../ui/svg/.reforma-plugin/plugin.json | 12 ++ marketplace/ui/svg/assets/logo.svg | 4 + marketplace/ui/svg/skills/svg/SKILL.md | 60 ++++++++ marketplace/ui/svg/skills/svg/animate.md | 112 ++++++++++++++ .../ui/tailark/.reforma-plugin/plugin.json | 5 +- .../.reforma-plugin/plugin.json | 2 +- .../context7/.reforma-plugin/plugin.json | 9 +- .../github-mcp/.reforma-plugin/plugin.json | 9 +- .../workspace/github-mcp/assets/logo.svg | 4 +- .../slack/.reforma-plugin/plugin.json | 9 +- marketplace/workspace/slack/assets/logo.svg | 4 +- scripts/pack/index.ts | 28 ++-- scripts/pack/logos.test.ts | 86 +++++++++++ scripts/pack/logos.ts | 121 ++++++++++++++- scripts/pack/shared.test.ts | 41 +++++ scripts/pack/shared.ts | 31 +++- 145 files changed, 1179 insertions(+), 473 deletions(-) create mode 100644 marketplace/_brand/appwrite/logo.svg create mode 100644 marketplace/_brand/convex/logo.svg create mode 100644 marketplace/_brand/dropbox/logo.svg create mode 100644 marketplace/_brand/firebase/logo.png create mode 100644 marketplace/_brand/gsap/logo.png create mode 100644 marketplace/_brand/higgsfield/logo.png create mode 100644 marketplace/_brand/linear/logo.svg create mode 100644 marketplace/_brand/mapbox/logo.svg create mode 100644 marketplace/_brand/motion/logo.png create mode 100644 marketplace/_brand/notion-workspace/logo.svg create mode 100644 marketplace/_brand/prisma/logo.svg create mode 100644 marketplace/_brand/quiver/logo.png create mode 100644 marketplace/_brand/remotion/logo.png create mode 100644 marketplace/_brand/resend/logo.svg create mode 100644 marketplace/_brand/sentry/logo.svg create mode 100644 marketplace/_brand/stripe/logo.svg create mode 100644 marketplace/_brand/supabase/logo.svg create mode 100644 marketplace/analytics/amplitude/assets/logo.png create mode 100644 marketplace/analytics/posthog/assets/logo.svg create mode 100644 marketplace/auth/auth0/assets/logo.svg create mode 100644 marketplace/auth/workos/assets/logo.png create mode 100644 marketplace/automation/composio/assets/logo.png create mode 100644 marketplace/automation/make/assets/logo.svg create mode 100644 marketplace/automation/n8n/assets/logo.svg create mode 100644 marketplace/automation/zapier/assets/logo.svg create mode 100644 marketplace/backend/neon/assets/logo.svg create mode 100644 marketplace/cms/sanity/assets/logo.svg delete mode 100644 marketplace/demo/demo-kit/.reforma-plugin/plugin.json delete mode 100644 marketplace/demo/demo-kit/agents/demo-researcher.md delete mode 100644 marketplace/demo/demo-kit/agents/demo-reviewer.md delete mode 100644 marketplace/demo/demo-kit/agents/demo-writer.md delete mode 100644 marketplace/demo/demo-kit/assets/logo.svg delete mode 100644 marketplace/demo/demo-kit/hooks/hooks.json delete mode 100755 marketplace/demo/demo-kit/hooks/pre_bash.sh delete mode 100755 marketplace/demo/demo-kit/hooks/prompt_echo.sh delete mode 100755 marketplace/demo/demo-kit/hooks/session_end.sh delete mode 100755 marketplace/demo/demo-kit/hooks/session_start.sh delete mode 100644 marketplace/demo/demo-kit/mcp.json delete mode 100644 marketplace/demo/demo-kit/rules/kit-house.md delete mode 100644 marketplace/demo/demo-kit/skills/demo-release-notes/SKILL.md delete mode 100644 marketplace/demo/demo-kit/skills/demo-triage/SKILL.md delete mode 100644 marketplace/demo/demo-kit/skills/kit-ship/SKILL.md delete mode 100644 marketplace/demo/demo-kit/tools/KitPing.ts delete mode 100644 marketplace/demo/demo-kit/tools/Waiting.ts create mode 100644 marketplace/design/figma/assets/logo.png create mode 100644 marketplace/games/game-creator/assets/logo.svg create mode 100644 marketplace/media/fal/assets/logo.png create mode 100644 marketplace/media/heygen/assets/logo.png create mode 100644 marketplace/media/lottiefiles/assets/logo.svg create mode 100644 marketplace/media/recraft/assets/logo.png create mode 100644 marketplace/media/svgator/assets/logo.png create mode 100644 marketplace/payments/shopify/assets/logo.svg rename marketplace/{ui => system}/fonts/.reforma-plugin/plugin.json (96%) create mode 100644 marketplace/system/fonts/assets/logo.svg rename marketplace/{ui => system}/fonts/skills/fonts/SKILL.md (100%) create mode 100644 marketplace/system/nextjs/.reforma-plugin/plugin.json create mode 100644 marketplace/system/nextjs/assets/logo.svg create mode 100644 marketplace/system/nextjs/skills/nextjs/SKILL.md create mode 100644 marketplace/system/nextjs/skills/nextjs/handlers.md rename marketplace/{ui => system}/shadcn-tailwind/.reforma-plugin/plugin.json (58%) create mode 100644 marketplace/system/shadcn-tailwind/assets/logo.png rename marketplace/{ui => system}/shadcn-tailwind/mcp.json (100%) rename marketplace/{ui => system}/shadcn-tailwind/skills/shadcn/SKILL.md (63%) create mode 100644 marketplace/system/shadcn-tailwind/skills/tailwind/SKILL.md create mode 100644 marketplace/ui/21st/assets/logo.png delete mode 100644 marketplace/ui/21st/assets/logo.svg create mode 100644 marketplace/ui/flexnative/assets/logo.png delete mode 100644 marketplace/ui/flexnative/assets/logo.svg delete mode 100644 marketplace/ui/fonts/assets/logo.svg create mode 100644 marketplace/ui/i18n/assets/logo.svg delete mode 100644 marketplace/ui/shadcn-tailwind/assets/logo.png create mode 100644 marketplace/ui/svg/.reforma-plugin/plugin.json create mode 100644 marketplace/ui/svg/assets/logo.svg create mode 100644 marketplace/ui/svg/skills/svg/SKILL.md create mode 100644 marketplace/ui/svg/skills/svg/animate.md create mode 100644 scripts/pack/logos.test.ts diff --git a/README.md b/README.md index 72d607c..23761f2 100644 --- a/README.md +++ b/README.md @@ -4,86 +4,88 @@ 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 your brother — relaxed, blunt, and not afraid to push back | +| zen-mode | [Zen Mode](marketplace/moods/zen-mode) | Reforma | Moods | Calm, minimal replies — no noise, no hype, one clear step at a time | +| 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 | Explain the why — context, tradeoffs, and how the pieces fit together | +| hype-man | [Hype Man](marketplace/moods/hype-man) | Reforma | Moods | Founder energy — big vision, momentum, and belief 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/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 | +| react-best-practices | [React Best Practices](marketplace/ui/react-best-practices) | Vercel | UI | Keep the app fast — React and Next.js performance patterns | +| web-design-guidelines | [Web Design Guidelines](marketplace/ui/web-design-guidelines) | Vercel | UI | Catch accessibility, form, and focus issues before they ship | +| frontend-design | [Frontend Design](marketplace/ui/frontend-design) | Anthropic | UI | A look that is not a template — palette, type, and layout with a point of view | +| 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 | +| n8n | [n8n](marketplace/automation/n8n) | n8n | Automation | Workflows you host yourself — run them 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 +99,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..8628daf 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", @@ -34,14 +52,6 @@ "id": "ui", "name": "UI", "plugins": [ - { - "name": "shadcn-tailwind", - "source": "./marketplace/ui/shadcn-tailwind" - }, - { - "name": "fonts", - "source": "./marketplace/ui/fonts" - }, { "name": "coss", "source": "./marketplace/ui/coss" @@ -68,15 +78,21 @@ }, { "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", @@ -93,6 +109,10 @@ { "name": "frontend-design", "source": "./marketplace/ui/frontend-design" + }, + { + "name": "svg", + "source": "./marketplace/ui/svg" } ] }, @@ -112,15 +132,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 +154,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 +190,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 +206,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 +240,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 +271,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 +283,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 +329,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 +363,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", @@ -356,16 +404,6 @@ "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 0000000000000000000000000000000000000000..77d53c67532f9550109f0ffc4ea9ec604b310648 GIT binary patch literal 2763 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 R6D0ru002ovPDHLkV1m3q5D5SP literal 0 HcmV?d00001 diff --git a/marketplace/_brand/gsap/logo.png b/marketplace/_brand/gsap/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..5c09afd038fe8f7da01202cfa520f6f35ec4a925 GIT binary patch literal 13780 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 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..6034708986072f57da13d41b1347bcd4f5db51e1 GIT binary patch literal 3942 zcmd6q_d6Tj7so@Qu^OAIm~ByNM$HKmW$Kk@nD-19u=-gBP!bMAfa^Ey#R2AWr?uTuj6fUDYCY9=IKb7_=UNUP%a zE0QEf<*8-m4FD)WE{$xUE(Z+&&|TA3gPR4s+j`>cX=cufG(U~>c4ySOiABi^Re7LH zw;zO(m*<)a(SwXN)uF7za7|)6U|m*}$Eo)-_8*2T_Quf4JN{Ce=8{!W3w?`yiP-q~ z*`m>Qy;ePeHG|f(?X8LVqEqBY9Af@tJ8&hdv6HYlHLRZ@wWh5$AwjU?vu-Q3kRV9& z)n;OJ(^Ia@{tCtD-qK(cj*S zIv?I1Yk!^idwF@8sVFllKn|3gm4v~_&=>8g;Ya$H-1PDsU?tQu;pBZR5Fre{G^TG_ z4Ii7%CRw5brUXrDLxiG^S@_o18(abd1NEcuW)8lSWF3G(O32MMmX)O?<^WN47@PUa zgNFi?3o%Q!Y%sb*Xa)bkc?>WdFuZ{M97tI1i%!h15HPuT5enkD52fE*9&&Yc*hVW= z5f?Ps9&4xpI~WPJ4(9F`Ibj%YBX}}wwkAzevP1~X#o7ab2&I_Rrw(f&Wxj-~|TbTPDuuhTR9*PSrDUl_23Bew2U$#Zs2}S?3t+iV%qh|(nG03S2D{OjREeEy(%;=$;$%(%JJ>ghc zK7W4<_Jw8E|HEccSUA7zknv9d%8!RK6ous_*8^!pL{Q2uLa|Gp|H+V@e(&%HbzQ{w zyA!M3+}R)IUtS=Zok#hJ#H0BQ#o)u6uU6g%&m9FjzS|2X5^%}_#G~HDNN(g1r-EPU zUQ$w0iLQFVL^F;n*CzOR(ceF#h6n!hh=O{L`EupI$IlcI zr#_0dZC&y*GPt0SYKotS&d{X*q4#ci(Tl==q;&oKk_XkkIw>vhSHP8*ua$t2p00iXV;s9>lre9SX+t zBGZCX=B!= zJ>#B?U5~G}{qHZOd3l}1g*Q@ia0)x;lO5HNbD#JVWD09v@Pu0L~qn4snrwunbIYD#t$a%?@ZU~ zW>)anYcBj9jSi;im}6HNO89`CPmNQ0KUE%Z5~XrGu#sc|cX$X3|mS(3qA0Y;e> zcU{Mw^1VVhnVE2=*4E{Xz8ml3zcSp=0Ij=jjF(w_;bs?ea^}!x<8wM&&5a8|PS?nZ zlo@Cv{C>V-do==}Ya&?IJN51Zak-Xs1 z4}Y7idwrT8sDf9r{CQUGxjVte4U6|_Z`&sAtqBjR;nuF^ZZ1y9fUVgNycHr2nb{hVW7noulFyyzE z{}w)UwRSDN`;w#<7S4=jGu*InkAc-@1Fst#VNMYr(9mI{!KKU(s8R|8(b{+b+2o)VRlQ7kI_f{%+y4TT1XY1dpuImF}Rm^N~6kPh<|Et zvl_Q|l1Loocl+7#D#zF8VXaG+WcNs1>hC?Dt%He+9}AIA<1|5gi(S*<-`^|FXl^&G zym!n46(Y2F#6CH1;`Od^G8>RpWr}CfbslU?bhjwG-BJ=WmEOoarhZ$NxHVmSbdqS1 zM3pINAB~HHx>Dz&J7Pma3^(UnmF?#}T24MHZGZk%=F$}i?=Nv3D<0E8T@0zdBqhNj z`AZLZ$$D+Qq;cUaELW+*kIJ7kcFjfi-c0mpB}%7GZOBUj;N1!0Zj%QZGi^+qbP40=A~BSJ*3)U{xF*D}z~;qjwUU?X4cQ+_fVg^Ot5oL7W-X z5A{3GuFGs2+(6o$??a{K1*a$rbRlxj96N3{_GnIdAoI4*_PV)akBbpnDv-pC3JMz5 z2XSv{JS~Q*{4Ec6Gb)73kI}fdvttb3_@ZmT`XV2E*6~w81CK+iQK<+3zh1dC=4doW zHF7d_SR6u?wvO!yui+H)0~t_19Bif-UNCfEP`4iAcbjVpR8j_lAySK)?j9}!eAJrE zq$39WnHA|Uo86POu@XzcNRXcBho0`zt$<2ZPlF+^ijnYMPPT$~Ud1E@IM#2xVHNU% zw4ZM|orFGY^eanPFwBtZUC}))_y@`;J_T<$oOUhij^RX`qEgSs_0sN8GPAOdA19Qu zE)7hLhFv)6?fR)KGb}~WJ)!? z1xVyfsNW%n~nfzLiJ88GPh*$_b1mhw8E3ZGHW5PewmJ+Po0l#(3Fkew0?2;VGq4dW7 zI6_lyR6zE>bU4Zg+c~(mBgjyLAJ*j+q>P4T0Ii`+1O|9qwK5L?TId5({Gu_WQv~5* zVv2^P0rSloufr`JoofdVu>jAu*k86Oh69>?Zz?Zok-eAfLM{PIlWzWs*iN>flHUPu zaGKDyQ*)8-=?q^SSj5Waq{W3m>l`goAhe7Cusjt+D80cn3spWia!!4DhIS!Ti&$bU zVM&wmMY7~;9hinh+u3MphwWJ`HV!{B%0m*#xg4sczn55het!Pgq4w(`mdvv)N^Uac z?b`{wZkL@f7l;C0nFQT!OYS^ZHZEb?y5xEx>j7Bvw?{Pmi?KY+Nzt5gphreV@ktTb zXZf0r4x-gWaTPyrmCpQuSqTw|?x-(x)$&efIiaP$vF|Xa6nx9F#&n%R9}e0aZWLpj z3LQI=P3qzJao{`sLNlG%UA^f9zd2sgc!H4zN2UeF8()@?Vc79s$O+T(YO`0v&(nwPSCFI6?V&5QLrV-QOub&YoTysF0i%y{1 zKFGBTvOcoroACa + + 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 0000000000000000000000000000000000000000..17f5fd4eb110232abe7a342f3a1a425ff0dd804c GIT binary patch literal 4483 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 S*@*U61<=(t)GEL2@Zx`XWuJfm literal 0 HcmV?d00001 diff --git a/marketplace/_brand/remotion/logo.png b/marketplace/_brand/remotion/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..c17ab6e83836bca80f06b247060b929156305f74 GIT binary patch literal 1286 zcmV+h1^N1kP)c^o}h4oWlvCgf~9{}P;H_H^-tOp6iz@n0qF^FPk?&@vV^Eo z9s6}Ag#J(^3iiCQJ$|1*3RP7=eDmhbOfnMyA%qY@2qAXkFKuYxI2?E9h*(W3whgmnC3~&OTt0WK;#Fyy$UnJNye|^AzjR7$R z$Uj6X8c$w4O29MD1L+)GZ|DyvK-7owVqHaJ{k2Z7U#^b915N{3gh6x$537p%K}__Y zW6bHe$>BH)WaaheevoHpmMY_J%WxtU44XErISZsSnx5+q8{pnp5xt$hTzd}<;3SaF z!PSnQHNAr>EvhCT&i2-hpvDxqK=>4@W`;`rpwNBnV(|c}DfSBK4KDRsBfNyVscFTq zS4bKK+fYZ}E9PBKPdK0^91L0N3DgZ2o zW!4H=E(H6~6#8eax>|ULEP_pFAic*n(CenNDtZfRAc$1&{&Ba>RPQV-_uiag4TKt6 zA>S-!Vs!p!^#3k6!WPKNO}X3OM67@Ub?BA?qhP6po(45{T=$dsR$Nu{|Yb2}D1y z?ZtHWKFpN3`)axgmaqguszLi#77)UTt!);j3c)_KOHXe~o`3~B6@u-mkfn{z==u;! z;;9hCKcSUqw`@P*sSxsG532~>PfAUNc`C${O~ryX%Tx(h4{38CM&TEB@T}AcTO9}? z7Jg!mYwM)t6;gbb>E@M-?Nj&xDS_0C1j53c@+w9G;ea54)QQUTQz$3|VHaXD-Cr$y zIEbf0%(3Ry%7;*bRESN8N3*@vBPc<7h%Jj(&ZniS!{FLFNuYJoei zjS|MuJlz5YEPj_nj~XEY`74jpq0Q$OOHWqG!JqGwZYxx+9x zk0X2lZ{Tx1n{sl_kZ~QNeCQ(+T^U<8*BQUV7Koxefd)f!0a`GB?D}>(w%y(!%f@-w z%*|xeFI){#zkF|C)H%4i_;&Sc6X+dV%;{N`cQ$fgtvp9q`+Zs6(e%7dCvxi=#4Y}5 z5W%VbEmR&z-GjKr9!QwY-=tCWw5p5Dni9k>;M1& literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..80ef991e0ac3ede519b26980deae12f084b1572b GIT binary patch literal 11789 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 + + 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 0000000000000000000000000000000000000000..57fc8edd961c99f88bcf8ea72b16e4fda3e5197a GIT binary patch literal 6343 zcmV;&7&zyNP)GlZe?^SnVDAM000<5Nkl{(^qXJO z4}Bb`j~|rDj2#C}vS&AhHVPs_Eef_)#8PcRd})C~BZ`16FSS^uA}aEds6{BPq9Csk zByYQ$m)-2x3kmdz0)r=f2kan)y41>~7Az=YOvIdcPyC>qh*9l1rPKj$D4% zU9Hzmo7Qq;U0wIh_4VBgqtWi>Xf*L&eSO!7XtXP(es(QHgL`;X-P0Dw>26l{b$)$) z`~TL|?45e&od>SH_14xa;DW*>I?hZ6+80a|RaI3};_>s>*VdlAS1oX@<0ST}1-B`r z6$TWt3OR+r622@885q0(?(Kk5TxrMYIv0y2cPpi}uD-r)uH&4!0dDw3Z0!rigGgl2 zrPb9dz7>zBz88yiZcrpnsKpGF@I_dB4WRgtQ_3yjI2|uEHfE;YbkmY=D+ZR8*xDDA z0-m)OTYGkTZSAouF-LSfD+SsY=ulm~ z=&~6zlGTorY*pxwS`)&ebPOtTr{GRJ-u7i?is60-4l@}T3i z*Wozocvu!f$K&o*YI|6uv~qt57ieKIZp31#zWVyMg}2?d@4GraPKwY?P43l7E3e0( z*Ikr_#bkiOY-mWm+|-o3TF1)?5qj3Fo@*4DTcXzKvj`BeSkL}=yyqGnKgUIA$gDni zOEjMd(O!gwMH!KUd!>?E`vT02Sgdz{)RNgEJmegwr==A0W6WP-lq&=MdAV33b~ zwAU3&zKlxfAOHABl_K*&-G^IPgaNooMzJJ9S65eGMhY^TF9FnkxP?XVNMs$S<9X_c z#w0WqPZWu$H+1Sh)WRY>P(MUb-0-^UiwI2_AC*tK53{fcABjP@O4;(Lgr?9s8a+Fm zaz6csSy+URe9)q8CXFQ{2u=5ZvYod@ZED*>4&dq*x}+{5biU)HXR0kavXBPH=}yw} zH;m9#QyizW*|tqt$OC&^YBsX6&y%uLX|$-=^9)Yo^fz2%l8mq%{D{lK+~;k$Kju&^*0%Iw%z zQ`34~WZJZMzps8cr+b5ig~?DHZoA`-mK!6?AB*P4b7|jXVPP&3=~%4$=7{5T&5!11 z&6V&b3kx%$G&HmH7Dl4p6wu1AtW%5i!2heoyXt8+7L#2I{|1J?w!#62nwqb7$IJv!>U5{PC1Kdv>Cv2Sqq? z(P-CRWpXgnxAF)LAsQMI?ur$?iohAStu5yc47hGC=emP~u5r@e@2ZEb-@WIa#Hi~* zeV%4AQ4C!vxxg88*$N4nxP zb;S^xZB!DOkxxF!DlI(H0bIB+=^iFk zdaC!LbwKPzi&9?1!f!Gc1XAzYH*%Md3h{&{B)4Tt|D+tIpoLxJwb%MbtOfi3@Zo{L z$XpPLwceK zO-PF*NzfW?G6G>=dZ};3T2`*?4Skn6b0+8BdvEcijs%D%^z!9Bo@S9GkcM#F&~=c> z!wC#qc-XdYPiwz-lOdMSvt}jSj*gJ_=Lt$WJ?KR+hHJo$8_n?n(rMRSy0k~EmKI59 zJo3N%rC*$>fsH(TEySBm^8s30GhRK3?mn0ZafC*5ELf0q&!3m2ozI^ibRT^*b&=*H zs<3~5#<&NQ6#0`+_Gs^gi4aFtgK;v8mDM?lyBFr%vTWYH4wV zMsxJ_nMs0Ta_m^vojdnpM-a2=(4pWGDB~4Oq^(;=#>!2HC_*&`7L#-5a$fDVBnMFpq4`pY)neaC5{m7K$P8V}Lk}h0FTOC}2gqkM zWrguX5E?RLJEJiqNxoj=V&@9&Od)?*8Nu;NZ?CH!z?2v*ErQV0Yi!$=7DECA+xVaV z92imbgV{uKMUs&8q0U5ipG<)9ghn&a7iU_mRwt15fd@v~pF|GmK9M9;F|JwDC!!+H zctWF{-+C*p`_7FLoIM&?M_UgBr#Dbqq=vpk`W;O-J&Y&xZ+~lUthSgGv~#gFp`~#a zO%2(NCTQsm8_W;m8BJ)3jvzPwx##p{nDgc(y}n0Df|I*&VM=@7!i2GehRo~Nn;)wk zDrnsI-yi7+7Q?n}<`gBBD%7Kx>>wIRXtWz+2uQz55{AVrUR-*JYySMC*MTib=s;h( zwDdIw4I>E+Hf@pEJv^yh)e(LU-BG86pn6fVZb;-qv2>2l_cEY_3I~ggW0-&`O8#UhsgvXj3dLb z)vYgR7)R*mpO+V-{m*~0UN4?*ZN)%c^zPjPW|j>R9%8!fb!!V6#t<4!MReffk7aGY z*uUlImZn~U7A;9a*wM76T4M+enw$GX4T~u_NaZSomsqdD`p4@C`w3$RO~AgVNB0$) zC1|Mo?=O#r;xjNkm|HDL*rERLhhFXaf`So*re5RCH|5o9{Qd9ctrdpUt5^4mGd<|M z`RPx~vrA1Dp%a>$_{bwEFDW5O@bXEF=+-x0PyoabM@d3TeBHW{!*jww=!9na5mV`< zIf9!v`*#Bg<4M!fi9~KhXHFOhozUyn$;*^cDMvy?x3-CbXwN_Xkrwy8y!mD(^ns6| z5}JX9M~@0}>)rhHqu>0-|H(oeawM&@g>31seid$=N2rAU^Pl_0h3WS09SFn$qT2AU zf0Z>ID*ydtJSShbKEDtep_#ZZ%@OSH&(EgQt*uzR|f_4$Fo3C&G<`sp68JzkQK@VM{3;D@g8 z@N>APBnh(`FK|L*UlApcBO6MuP6zHF21;luv%0zj-4)mMjv)TUFT!mM&DVK!ix?j^RLCGQTr)^5 z9T=f`QqeM!1dT|IiEeE{08()JYg*P<=zjR2ze%X!2!znw3=#$H?Q%>FgzF^@ty^DE zAhj&58jlC?nP(jRF1=_VFC8-e3Irq~+^o`Jj>7a=&MQes;jdWXpMT;TpwhiPHF$68DAB z)E-Ey5Nm78d3LF8ZKi>iCuuSM!oQ|hzagzzf}{Cn z&lW^zijX=xWqiSCw$Toimj;HzOG#d#K$a}==PYqw2+h+cr47HMW6*uqVBxR)=}-Rbh`te8ingFtdXjGPpo1z{)gYp%2}ghpdXE1uy()0>_(o`eZ6~c7?ELv$piP|<1>GOJcFC(|^tN71}AExmK6x%C~KKF&{vB%7F5UH$_ zHVB=EkB3mVwsIg4LW8wy`$Pr*k&i!~+zGMe296*nZ%K0mgKTRHjL;B+BZMUh5gLX| z>edzn^5YAV?w4N*VzUy$iVr;$oIes6p#fn$X(J72R4}E^W6vHr^%@A*x_x`FB?W;J zx}hNm8(vCg@52ff5=}drY=SlHedNUhGeGSSg@-QA+WC zL2v|@Eb%`~HynWz8j#DEbOs;t&O2!@1gTq_A9(RaS<|Q3f!}}Mzs~Nl5DKA5T99Iv zBvj))`lx?32&19U{Uc2~lSq5&sc=G`p%9u74q-e=S_h$Bi*rMC>nj)do}`88(9Zk! zX95e;4M!-125jFSeI(0khgcjQq+46LfFmfSm8~Eo(B{nx))5?v&=Row5@U5t1bAxWw)K{%*!XXoLn#{n@uqRu~UwcJpTc3e*9F;3zj~MO{aZWW5?~ z-TM4QsDuVMh|+4NIW*MIvsXxQOKYn_JOA;I;b&DtCp2K{kF+q}M;~Q6he?_Hx^c4?mm|*H*=8VSbGz7%z+}hz?;w&UmUbQu5A@2F!NuiEfl-78ufHxYGe#%#WafFWU9Vm( z%j9C+v{i+b5iADd2+bLM?d^gX?dIz|CVIM4pjvzzIB?&u;pR?&E3nK{)(9#@HEJ+GS!|B#m01vH{ zA>{?(p*8u$17isda1b*YSvQ=5A|A%EoF#robl}h-dF8X~){Wn+3KB*W8ocp_yfEJW z{R7%Y00yr}YH(m(_%(hWYg`T(PiT%Rrc*?c>~=J(?ZyV44guga%}%&Yw45y>Ye-vyg{gJ7&|r|1HZA;NkP5 ziNQ~ZA~cz`9Xre}fG5I1ZN|{+h7eTKVOL8LzGKdsq;N`iUrd51LIaW(r%vUJBsJHx zXHRCt8GMjJnj=W#vY(B>enA|eAqv}|iJjtP2|06nD4E$+q}6y6BIRUV-Mugo;s_1U z(!_a9l0u>X(2`1s&GaK_^%{go7c4M8i82~Q5*jR9X4bK0XlJsTL$9$AnK98k8cSY% zRZf_0IK&c~tQFZS6Uf4YHCin+>2GNzu%CaP9ajmgX%I{3LhI6(UxrT@#u;!eL$_#R zx6+P==E1~7l4xoaAePVtG&lE!T4IU=HT+;9Obw<%NlT(|>TeiB%F7Aygr=O4e!ehF z56Fy-JhW)1uyaV8euU$?c=5>E6KN1nXb1$UvHgN1HGiwMbzsEAAbuv~B`HkD@X6Jy z!ymL*4u~go0ZbjD?jQ((%%6YG`FkT14;)=*VvM|)U^km^%2&BiF@y$l<|MtX-cL=< zXCFJ3bMLw5;z$5H1*M^q%3Sjal#F-Wp6_ptRd_a60FrU@MM?+`JZB_{52< z`|7J{FWJCn4%f`2;i&-hV@D{Luogyl;W%&F)aN;_l4H$9FsL5TqY?F=J?e*C32zV! zno@DrcJI!3TP>Y05D*)3DEK#i#{;lySH@kotar>A6blz7-NT0myoUwNX9|X{<@D*S zyK`sSn?uL>Cl#obJ*Wp1rQCwa(X5cwy+Jw(voO$3L?=i~ldj&nwcp*gt>63q<;#2B z*|U>hh2qB2V%VOXwaBpV*IqLR3{2m+vEP06*Ftm=md*J<-u_hImhW}jzp@az-5onARbSBPyI5X`v40IvykX(Y|KnW zJ6}ZT>gpBWQZLvNt-!hti;4yH8{2NWY00+>JpPK%k;o$D9Jb9=26lf5A7o(>I+R6` zs;xacU9tF*5rhVfjmN*^IH?w;#;umNFdjJI9-Kb?@c)d)-BAf$Q?ub4j?-Re9YhP$04Hb6=&XgKB@^2FMWkj*EY|r5 zaX#H2v9JgN%D3yUuRpzrL|{?g7W)N=#}ik@9Nte$IhJS~~f1yWzo z)Vd3>uqYP>;asU?9v7iO-uy^zz&J1AVk|5sfkdCIB7zIs;ZhP7vj_;Uu;IvqD)9+l~z93(9m92sBa!Gv@a+I0^4L1 zNkNiV*I%rKMKL4>sULEjuIJ%Yv7|{U(7r&2NTm9*c)a^Z%C>H$oG)r)))u8>kjx)d zbMbiR52j9ye^bXd9keef1^GtXV^>C_XQ#(viEVj<-nMgDjE;QUR3f2v_bt@mQ?^{_ zIGHT8FBlIfw5EH&aWYfs^P+i?j$GXWExsO5yZ8Xj*vjGCK+7LpQZ$z6cr_kqUoa8y zwB;Lb&)iT~clrTE>~(5E?LMQ7>&YxWM|Ii@3A*xu8l!P%zj~9 z2Hn|X)nZH*+80a)UR${`N8<6;E0}7-sHTR7t{EJ^ z%oBQ~TFZ@h-PL+sQ`3>lFU-v-i)m2|{|^)hKEt)nfWH6$002ov JPDHLkV1jIqBVYgk literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..f22a21408141a95b4c1c4b723500762478d8c2fa GIT binary patch literal 8828 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 BulWD~ literal 0 HcmV?d00001 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 index e133ed9..451596b 100644 --- a/marketplace/automation/n8n/.reforma-plugin/plugin.json +++ b/marketplace/automation/n8n/.reforma-plugin/plugin.json @@ -1,9 +1,15 @@ { "name": "n8n", - "description": "Run workflows and look up data from connected n8n apps.", + "description": "Workflows you host yourself — run them and use the results in the app", "author": { "name": "n8n", "url": "https://n8n.io" }, - "mcpServers": "./mcp.json" + "mcpServers": "./mcp.json", + "logo": "assets/logo.svg", + "interface": { + "displayName": "n8n", + "brandColor": "#EA4B71", + "logo": "assets/logo.svg" + } } diff --git a/marketplace/automation/n8n/assets/logo.svg b/marketplace/automation/n8n/assets/logo.svg new file mode 100644 index 0000000..3385271 --- /dev/null +++ b/marketplace/automation/n8n/assets/logo.svg @@ -0,0 +1,3 @@ + + + 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/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 0000000000000000000000000000000000000000..70e4f03bf625a7ee68787bf57bf3cff12b909bf4 GIT binary patch literal 2667 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 + + + + + + + + + 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 0000000000000000000000000000000000000000..527889d6b6ba87995c7df07458a09a7d44fd6860 GIT binary patch literal 3845 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

^Z$Fd zn-Fq_g+~}RZZh9Y%PVTWlMRyok;DCR^z_&?3?u?J@1 zXs#e)88Bo=*pt}&_!>X;3&jnd9{R0j{`Yi<=J!LUrmh^89$eB&*j$eLkmzE=n;lm<7Mnck-q>3k2Fc=#AR1|DY683 pO^KPJ@_%b>|4jmovKam_j;wx9$?=oWyz*MWU43)CDhTw&e*mqDMTYPx#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91FrWhf1ONa40RR91FaQ7m0NXcg3;+NQhDk(0RA>dQS_zOA#T9-%*MIE4 zmmIs|f?Sq(5HHX|#9N~XD4`_LM8&c+8cS30ibpE7mW7E?%i9=(ibr{Dj3`(d#RXK* zpeS-ED(HfsEXN-IJ$L85p1)^jmw(}3O&7DTyQin;d+&Ykbx;2=_$h^R2J4pBfzOUq z9CxCxsI9Q5bu~0M`{ym@vxg+%{-g?T=^P$QHNu+aQOx`)uPgVgQm(V&zE$r}R2_ew z>N{_$ig%X|*4;4U)Is!ow*_Bp$$^vQFeeM}TDBejcF!t4uHv~X9QdOZP(NNWLsRTm zRc6oB!H(&Q1%_fxjxl#4y?aOjHgsg*wSohH{~GcfuHI$Bg1bN9Gh14?S|PrD4rBWq z(RV;|v!b0h<#f&Wo>RaZ!k7;z@j}Tw@VLG*qnjtf;j``AR`3It?1stfTMr18oo31F>nxjxxZ$U1!!1joDy;1v*M>19}1yEO*>~wmO4= z%$>}(=srBwSp>jn0UIxqK`QUV+_VW#Km9&G;ir0IU<$OfsG7>}H^4lWKpO~}lpyd1 zNd@~96OwA~#`;w)wWNgQz>}E*eD9<6ostq30JAtuHC=eYYk)a4?#GtO71;PjtZHm> zZj2SDp`{gJ@sbh*UMM2GVL^=L53bhJX8;FwL;^OW0&f&-;69=xFVJNvs02Wh<-)vI zmhdOvSjwB4n|bAUN*Y)80Ox9b-Z?+1pB8)-)vSKXTaRg zwt|Vg7r>?U1*LF|P=>=G&xRY48UEa=Mb@}Vys=jW>Q^nUO)A-Ys+8;rA^0%sAm|e3 zr6)o!AVJ6*b)Gq0TJgwDuoP41y-XV} z{uSUYYE^98988NB;sPb;B9y>P6Q<1wjlw`iDq#!=kMLYqn^d5=nfW8?;Vvr;kFMPg zHhDl=pTJX0gi2uD_2DpX`uD>Q|K8OLc%7W5uk2TWk!$l46D)sIOfeH$i7o?bJ{LC?79onG4Nek}UJh3B&DU#GyIYO`?HyWc_wuFL|o2xuHgQYzx0mpmV; z9UHDtP2RfZMf>RWE!>FCNA?z^#Ic+XPnHDu^vZuR3lca0{VO(ihT$_Kj`3 zaAWc7&ptlBm3F4R-w?Do?qp}Y0E223nBMNdt>}!gqhlP#YgoZ2s$C9A)F6)a2*^S# z1}`4Mlq=Y5d>NL=J%B^kw-^fBax135TU79jV1Gk<9a4aR26d@e&mM^SJ@C=ryT04D zGoQ6C|6=xvh2?;k>uXuhjqTsS5+iwRjSnLeK0m)E<UC_6_3z=PAJfF^eY8bIcyl(f+)#oqUv2VzGju_LP9qKcq z5h?LCOkuQY)AcEhHQ#p~E3>miwf!cJb_oN{#QPMw=qqILBk zAOlVla1p!++_g+F^TnKP+RKaS+&hXEYyEiY(G>t~3%csmZ0b1Ab{h-83y$V} z(REUf?2)PQ~5k4};5wc4)0K^@-aXRt_4? zwm;vH^3DWB4MCD35;y@4+6-mj5lq&?JJfGNqC-RQr_#m@BNEJP&UY+#qiI_26uNS) z^#=}rf907k>|O)!0bk1FPA42`+i*JO=2MVelkiGJu$HaXbFInA@dvt_;6fa*S`OL| z%!A_wo9rvP04IQNJeVmHBM?^jv3ll@?Dtn(xfKTUR%- z{li)Facx0|;PPEmVWztsE>m3?k6nZD=`edqK;e`;(YrfE(esR6tt0hc>-qgW`h5 zINVq+(kM+x#ahJ2@f@6n!FV$A`b4D2(BMwxf1|+tk^&^@L#9{_*A1J&?xWfE|FU&M zLp6*GtVvex;dWm|WK8t*qX)QxJKESRL522L_|Q5BZdW_u9GqteX4!boBV=JZIw8skz*NVJ`sIZm@{MwG1m+?L0V?W+kTy6O_4imkh=ri7W^pq=FV`@1 zmzH;--r#UNjvVl5+1}_vpoKDM`LIp~Diy9(qoSphDJ)y!d7qf*s{kqGGX3?8G5A$l zku?^>r;B2fC+Dt6hWy6SqE42kIsry0Ku4@Eybzh$ckK=jQo_O_+mrzw&?dSDCW2ss1K*}i2qnOHQpd+ zcYP1P?~y_xqey=D$ux$kOb=q$6h~HVm-8rtXF$$2U?Ea2BRk7U!E?MJ0g^=t zBwci(;2=mLOLckAMbc26zJC!wxPEXgMdzrfAYGccNFiA#>6Y$^evYTH%y_w&NWC4! zr!eGEw-1ZV7?k}05j@8y1O*Ue2&_~m(5~z!iI?mnrNoCj_0c^XD+~8|CJI*81JFH6 z2?bG6RAPtAwTEF4>t$$Rk>Pl5)7HkX7`zI!L=mQA8Wjgidka$O2?EuZDv~zROGF{s zlG<9&y5d^-oQF-B7JE`>B-;pji8fkad)RG?t&|3k5~mKzDE###Uxdr^akvFvv`qq( z0V%=sOO=v^C7q<@=@?PgQHhX3zJU~q&_sH`<47aC+>l+_$c?mkSJ^?Bz74~5}3e?8nm7pE0 zQyV>@Kev(B&>Oj3=)#o@y?_=LR+qe&68D*0bMSY!$DuC8L-0ACBU*SX+z_}I&Ms>G|Y`uL>3C@A~TW9LOxO}ScP%> z&0s#DQ6;XvvR?&g;J6c5_Nle-L?!{VatT<1;J5%z)+b-* z=oImYpb#mdf@bGIPzcwt?ewcn!1tc7tr8jp@81I>^!N6TuAigDau4Ch`R)%I;CJa1 zTx;s^IRfX>xLt^GhZ!HNR89kr`SsLIbWmZe<7|sSPn}HM)^2#VPz@Ip67Vj8ll18;MbP5?P*OemHl23Xf+~Fhq>)Dt<9AV6e@XzC`6k)ESl>8o)lu?Rwwp~YVSY% zZT$XwB{(_jeWzS&zzWDon&~)j7~EV;!qt`m8$wGHXuOCvq!?u?TG2~|DYV6;qWVQV zOf7YXViO)f-Gt!jl%b;XqZOdp>8RZO0baD@_>*Z87FrTGN@4Y~43W6-|4rbDM5NGB z;x#ZTu{qMW&+1Q7fMzF3T`-Al=1I8FOu%0eco%Iu`Y9ZLq6p0HtD8YF*5Eii{ovnW zXx{`)u(+S+`t9!jRsBBF|Ba{Gcs$<;GZY7|M|w}dO<^wsc?SI3ZiI`j8_tUOA)vzd zFcHTcg|Ykzg8u}mLtC!_mH(>(;?4N6``}tQK*1mCP=QN1{$_zeko7fqL0939tBznh e2ZV4RgZ~G=x2)249sY6v0000 + + 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 0000000000000000000000000000000000000000..49fbd6b5350cf22abc26bc8f5024315d20840cdd GIT binary patch literal 858 zcmV-g1Eu_lP)=p6=000SaNLh0L01FcU01FcV0GgZ_0000E zbVXQnQ*UN;cVTj607hwNZDF3VmSX?_0?SE6K~#9!?VC|=!!QVhYYZm;{}(UPCT;7Q z#@J~&Pxn3d;Y2Z$eWa)&gB4zm7H z{KMikK(W%5wl^S1G56Vrf3g<~s~2*jhT-bUn>G4JDtqfaoH1l`{yZx|On= zYAt0s)zRdDP~FN1xizGgF?78^?_H*@7wEmCFI7776GR?b{{6xQoFIPWa!0qP?YUv*$KRB$C#B`^e@RT~-zv`Yqasx4 z7W5^GAlidHz9AHk8gx^F&=2o^aNZOFDxP%MsqB+zXD!YEMa$W_YJffQ0@0c;TK|J+ zWu%$YYgLa6>a?>X4tbAz(Ho%mn0I-GAlgqyIq81dPb!!qUdQXn-;HSU9vrkSb`Aw& zgy5l+R*d;$Y*6{zr)nH*R=Ew<8jfUvuK&)QW?Fxd*Vf0M!&$d#Br(Ia6;{4mp)7FFghmM zQ#*_eUawnbhuH>2hsvI2JzL1k%(5npOJ!zgX-VT!nVM;P&bU;jo*olFf+vI!LI@#* k5JCtcgb+dqA%uML0m5J)nAYgRMF0Q*07*qoM6N<$f?=79^#A|> literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..c274815e84bef26773960e58e2b33986bef5accb GIT binary patch literal 4866 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 literal 0 HcmV?d00001 diff --git a/marketplace/moods/bro-mode/.reforma-plugin/plugin.json b/marketplace/moods/bro-mode/.reforma-plugin/plugin.json index 9d29571..8c6fb56 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 your brother — 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/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/hype-man/.reforma-plugin/plugin.json b/marketplace/moods/hype-man/.reforma-plugin/plugin.json index 544a544..815b21d 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": "Founder energy — big vision, momentum, and belief this thing wins", "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/professor/.reforma-plugin/plugin.json b/marketplace/moods/professor/.reforma-plugin/plugin.json index 897cae4..8e570c6 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": "Explain the why — context, tradeoffs, and how the pieces fit together", "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/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..c636f71 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": "Calm, minimal replies — no noise, no hype, one clear step at a time", "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/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/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 0000000000000000000000000000000000000000..10279359cb02867f3103e7cf74360a08a618bad5 GIT binary patch literal 3630 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 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..45d9d51d7cb18e9d079e2cb4d20eb5b30f8795a6 GIT binary patch literal 3359 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 - - - 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 987c009d356591d9c5c499aa7ad757251b2a87de..ab6a3b2e14408e146ddfea6dc440f0da7cfc32db 100644 GIT binary patch literal 2938 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 R0pR+hsj90|@xUhZ{{am^KqUYG 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 0000000000000000000000000000000000000000..6d732eed2ada6003cd1cec728bac64bb4b711348 GIT binary patch literal 17204 zcmeHvcRbbc_pntFvXUK{rMM(}W|x)hQe-&A4zn|Yf&+GAud%Mo(ywCf*&pz)X@{YC|x73yI5)cpx6A%!h zNl$}MzWG69!3&A)O|6>*1m$t$M~_Z{|8rQX-_;@@@Z}{S2z*LFfCV1~ej^}wB1Ay2 zW==pLl|n$k;F3|ND+7MvZEbwZMoWu;AG{|eAR%NXz+)f;-*SX3|K6(-UM3*^^*Ip% zLAV_O$sZVP@QVLZ2jBQ-e!mjGBK!jlK6^#<7n(@;74hHqglPO@Uv{1&zzdm+x`{gh z0XZH1n~)$agArgevC}v9FxJwPvUG+DKC*JQuom=&y5OH8knxrRZ=u#6k2t)cj!y1U z-m;v(Af&*1{KpVZj$a@i4ziraT6Z{sfUBcF-gjORE5jQ^; z+uTEv{^r1Y{vc@_g5A-tX0)dCip9f;S2HM2D;CN>{0R~xo0@n(GwJDYe*mMSvj1~G zvk2>Ejhc0ou82APcRTeYv5t>FAAUYoxxae5Cw}kZ*4^Q!>#V8SLTmWNl0)7xb&&iv(Vm9|0@%sKhophg?3iCR@evZ#=TK+DRXbx@>^aM%t+p`d0=dGw^}W=dID;+kM5hTGYS0N6FJ#Y6zpf?IHqxB z!*+G`9UabMw7Dmzf90>hr8LOd6hs_4uE)(${S!eO+SbZ7q+0Y_(J*q0jNdBLYD43H4`QhFd3S(2Jmmg+&*w4DWI2QOw^H0Vp z= z&rM#+pv{H7M-(B1XoGXvp)9MM{hzW6 zDb77!s-87VyBm49y|1%H{+Aonm(}LX+&yC=KD}=HhuAn#!EoN{Gta2$!-m|$1HnHs z&`7cY{r0K5m`3wa*3jQDRf+^OL(h1a z&ioNm5u%8cK8ikaCg98!2@x^TmEsDF zSnZjkVEE0uFJ}prHLt$3V*Smqp#Q%#FqHqZ3=e9ox=#J;v|f<}K^l+TygWRrq~+vh zre|m6ooZ@oc#zLvz+9aolNm=&mHw++uQrx$p^D(WMrfzG9eVyoa7x6@rcOnd=Nl) zh5flVQ&F8v(Zh2;FV81p&pqs<+6ww4XWn(hoOs?K8h~gWHr?HFdu4esze`j5j@Ds9 z&b^MsevSh3hupJUapGMHzntPc+2it!daq5-yu7?pOP^!xUaU%EsrrP;EJ*@0&tVub zJR*gd@#rieX&V>EmIb+|*UHL@^zp_tw>h^JFjs-(LGM&=A?IJQ{Db2(&x`f+R2f+O zI>_UvEt<py=e`ve3?2jD zW{Y~pu6N`1b^~KZTLj?NC4U7Ywkx{O5$;#&52F&sIOHL&&z@hgWVdb9Ih%OJnbCuP zMSDk<`!*mg>>cxJdx3ulgq>|(&{Rh*%&uHqKoBUgDQdu-RH2FVGR>6_ zSD3C$3`}yqD*7x3KQh+Lus^9=%DRw9z{#6C{Y{jF!<@vUpMgh$=S^Cg0B>o5^d;Qg zLhLpxMZEOQ1y8^exMI1So$h?^V57(9s^6(iJNi{>JCC#!8HU^kv4zJD=Or{uup)5fm1 zQ6g-F!2;vKa>44QzJb0)LWDOl3CDZ-ppv-0yjWZ~JA7_JhVIp>q?+gh0~<~ouYdsg zMFxK}XD*~!UmpcErlZ_3VMGwG6(@p4!l zlCXKu$zo-ScU?hmNZuHjkt`17=}5~qq`f_;au_y*Nv>~2G3ec0nCClepbmO>v$m~{ z+Q*ZekW`cF)m?aGeTDY-_FXS7^X-&RNJE&<)UF>?%ky13FuIYpBEA$s%cS|(yW6G3 zIf1LUx%q|c>guk%zDV|(U$cagMz6^F2;2UlrLK?Of@+;+<_u>kYy$G-JqtQ?#d-Dh zH^!D?6XH@IqsxcpkT20*`sBYtkY#WI@NMzer3I z*Z0KtX3Uy~)Jx^6vQdiye)VEaRLxyg_}Sb+!i5ZOSATO$_6T1O!L2vd5Ph=_I#Yd| z{Z=VfdxN>g`Kv#*a1u)d8N!vQL;mHd+6c83T8NZl9yS4S+}+3waj6%J_yDAR)qk{;_mvl73%@h~-h=M3LKqA^MkO`u3`euXC5w8udE4Iz07)a%6 zEVLu!5HY@H)P)c`oF43!2xqK*FDXq(h#~q_L@K3DjV{d2&*=`#4u#BI5>wXX3sa?V zynOo2VM=UY0kSH6E+1LtfO=fs@wyQ~-l+P9TX%uD8OE_TAn9PXP3x|YbF&xfN51Uy zi)sd^uH@YyNxle`P*9eW;%m;KOI|O+(NHlEFMKgtd1Wrwi& zC#H9hY-4GOd&zpMV)N@)9@l3QqRYe)DOZ}a_H&7OqZfppJ%s7Hb=iEsJ`u4$k?U0UP11ZYJk^NN3Tf0`Y9<%{HIbA^1snP5Ai zTz#{tkjDn@9NWKP(nD_$apqEw7ZR~pa!Yib!9RBfoG1d~dSrrQzR;+;aL!ZTDYw&x zO(?9opf!2=W(Rqr#!H<<3-b81!x<-<{HfLnj18MGuS(5*T zU~r@smhfeWoq53d4v3nWS}F1y5@PBzj0h-AF`^N^+Oi=S-{P6Bpt5Jpvf*&(H@rqJ z&f|!JjBTIr&03!9IdHEA=CSk~jhE1z#>?7Qppkpo-b08uCv!9TQx@a#VvCV(8bnw|FE)jYGB%dODs!b8sY3D z%BPAPd${euZ9bYmM;r>oV3L%_3akyZ5kkWxI~gtjF}h80^9~~!R(9gD?_Q|wLNs4Z*9gOOoH|i)-eH$<=kW(3xzSUNVeW|$ zTS2Gf6!vnkfs&|3AodRTHC|U92lorwtmK&sby!#m(MVCA24)EO4s?BgrO&SEB<| z0DxW#Q2D#?6rUFZM)Ic;x2y$%EU!Veo*JM(iMXbneG~A5tq_8qe93B*1Emp`ut|zN z3~&4LEXJEx8--Ne%Yot$wBgJw;gp?aqN&~#RExpQ7VLAW66iiI12d09*S3zyWY6P@ z#Hp`&=2CW~_tZ7UlMcb&c&!K!uU&qu(GkF}` z*&N|bcwPKSeOTc=3Un%+t$S|AU^gc*$-gCK zdHd-H&2frqPtss1o`U(9kuhS0)H8rZEKOBYPGvw9o1{%mrmYQ4-G} zgE|cIH=^M&R(|heTi&;DF%koDz!qPy(SzBIA=^++(C>NXE^nMNFMl+S`Y0A$4O#VJ zILv)2^IQaK=B6_iO)ab$Sjwj`{?=VUbtLIZq0n4wKh9-0oi-~w+Y%KzV#@YPz3sYA zRyG%9+c{-TVpZ-hy`&yz9d*Z4^Jh&{uU~vofQ;U;lim3AQ>RR3=tM_HCo)-N!Mgot za74klgeHP0QDA%E5Qz=$Kgaj23v;|TX2zb6q(F&vZn|qzem{TB!iH&u^?vd0MI3XZ z>Y%`Lk6syPip>tQ8kmPArK_eIFA zu`%_Kxl~UP#Jt_vHEjay7U+DDV?>V(IQdCP$TS)b%tUwM)AGz-0-rv=L57Hs9XC-r1^jeNg|abIA< zh?B$OE%v$-O5gNBCD!emneSQuLg$aj9z^VsqY<346(TVyB+}%}83JruY~RpNZQus- zM`~Y(KXEef!Tp#gF88*$HuHt*_^Gq?}Wmc2|L5)#nsnr8U<^C+jH^A!sz0)wxn;5xeyY*a4WC; zp7r!xt)n_1-iz~ckF{a7=t%MtpE9UfAq0x@>dCe*K(an#JeC`^eOUC_td|u4mSs%! zdT5E@<2D#D(9qfPgLlMm5f8gCH(DIXSs^q7~H%OqjT>yFd42P-ND{Y!Sg3y-@jdrX%Js z=R3wJe&=f(s_^jGg22v7!w%R}VAQfjm&XlfX||e_f7a1MkY3xS!dCcQJ^#^bs^uEX zxWxU?gNe7__!iEh#3;Kfte^vCHi%(+rlw1!+1J;X_N+_^WA|-S>^xow=@^%p+Z~xj zyRK{%U|R+zYn_KZH{)KIOZsQxu+b-qgyMV4q5m3Fmzxqq(in~y0@2-%2D&c ze3;9Hj4{$)o2w^ISQlDGOqaziKf96imFHIulcxT2Ahi(tW=Lp&nOu5^P;i^3_9z}$ z)efaCz6!LYfXwWM($Du>v*_=j8ga>W*gn7h(fMj@i*>afdyFp$$U?YP_jsU-uZ`&^ zFd1@b&ij`F^5-@|2r#M@EM^t`B#>|<*%QXKO(S9SQedaM3z1h**Mmt~kp}A@D$uYI zziAzElIkzEqAAgZ-8%E3OKmPgQ61%V?VK_~*4-}^-FfsTVXT-1PWk$M@Esv{gHFjc zUFPJGT-cRDD9^hB5Tr?8(0PN(YOn8JmtSU~Z?Ji=C~<5Y9V0jxy(2@aUCH z5B+pY!^X-kF`tb*Eut&x_+&5M5T|C(T~l?Up0c(Kr(q!y1scZ~j85KSvFvtepJ29V zG}L-ieQ6+>h~f1;KVNhSY)O|EY+#eJ_1hrl}lf%g_z5 zf;Yz|Mo0JP$;QHzMw45*nu6eW3D87MU5*jII$rqz1L2TpxR%F40=Sj7uu(gF2y0^Y?Zby!b1R0hp* zfnMHiPHldfmw0~4d(tCIN9{vgzq^4fzoU=X#b?g?W-qr`7Cz4^xrmDV2eCf+)tbjI zUhX(T;+a;pKZhfg0o5H!u7QAzU$S$#)JCuo;nPz6`b#(w#S6z#dqDF3qe94G@x3TY zeKTw|%mMk)MF!*A7#4V$gQG_#-QD0rKum{SsLXwb%)zvl!6D4A-QCzMKweuEZ%b+n z|7xGR6^gI?y1t|ub}4Mjy)b+pRYkkkc>7_CG3k!0(myZ%11 z+-4%_W?W?S)YLXv{I$0qdyALe?y3dSwR`Ch})1Hs*H3~L&{W1hlfG+%~8^w{0|;^XUEcbk38 zLU+wCA6dNEowHu!(HLJQ^%gr=vnjZD%#>XdcOXhTd|Rj zZhtXOeq&>EQ~I4StZQNa=P@pmtaX)r=76qZZ+|wRvA&^Ux|UD4QLX|l+Bl1Z)q}u7 zN%LU0?i3NI@Vb30G9WDG^Jk!F!37pVeC^$bJKRf_J70fG63-Hoo5d_aj682Wy8e}N zKJjed*EQ3F)`%}Ml9FV8tHoI(@Ag=Fl6`h~w(IyZd0%c?;Cv9_>C)m#Yhy0!@$alt z=7~c(PxS#g${-&of_Q#TJcVt0Ke?Tf9enB5K2u7$A9DKbtXS5X2C^i(FA79KrBdn6 z`+4xDlW7y?yN!nFif`pvMfK;2>k>5f`y<9{T_-ADu{2;?GOLp(W(OVUh4bg(2Uk+U zF3msHY@3jyZoqO9c1&d@N8sb~u*PO+FxB||W9H^qt2nBoWl*}oQnum6x*umDj&%T|~dIZ-=R zTh^Fa9HD&C(qo$~2kwm|ZQGPj<_)yOJVJnQ?0t}zCDp)>5pP-NL8=)X7HE7+!4a(& z&)~d9YD(tq5T@H`mN)&T6!v;M%sWzQ(`FYXw=hPUlF9Amo|+3~J03LQF^hTqL^_F? z-6*qKwo&7d5;xuEOi^#f^;j%xs@EW`MtCF{1C?3ooZ87V1BQ46u-%{jt+xxn+(my2z5AuGE9bC!a8x^pwAcBQW z;8u@fO=0tel}Olr0c7VyEkK9@4i$18H~PU$A+}Elmh5WGL!nM#;GEYf%Jy6kdbHKcp_0^WA{#_|6K`9g5P5j=Wq0H52Hf39jN=AgDc? zpBZx?{uvPfOJaMA{Q!bDY!az zdA=HbZ3HFmMx^)UE2+N;QS4Ebt7En;ZgFw(jBKXg?V+IN)m6K_t?s+Ru#CPYon~_a zRu>KSSJ=U_lPl%0qXXC54~v!?^k=q@4D(_=o;|+xmOru6w_8GPu^!C@r=*vBpwi-a zNu&^>bvk$5=jL7x4Cg1jOJcQnc~)^<{r$#44<4>_%Uy$~`V((O1K1GK)553D;|@(9jl zG3a^rIXjIoVe}1YCS_LCsG6;$+N9FvBXoDgD@I`0RwJv9tKUCREDH;ZxP`i^aPB5( zRNWQl%nf^6`Jp+9>xVUAJl=a(ca}4s;^)jI%T{U|mOJ$O#y*nF8~o{7`2$P0Zu$!R zF(M3uKG)^Q;0&@t@a6i)h87VwazPa(J)LDkRCuSt?(lKRCjqs#J3bnGO_QhA(#4(A z;>zOPntPCwogm6D=XjOQRJXv;fPK@g=vSFK=Ix;4WXTDtj}J2@*D6+pQL->C__wb^ z>wNu?vn~}6u%fJQL@rsBigYi7dK*x~tloX3B0iXu?YtMDDk-7MQ(_pl>oCYFYzn8$ zOGzE>C3)~ZigqsRV)^Qc@8b+w7YJheVqUE86RZHpoD&$bIoUEYva+rxqq?NwXFH_7 zl{bEDq6yV|N3efm065jm`6nd-xzC&jQ^D7nez$aCs%+O)8#yYfm)V=mERFG`Bo z-kz$3Z4c@cLOu~(U%LwYP_f@_lstefw10N%C1!lm9Iu#XdE52aBQDIHJ4FFB`zI@? z?i<+Jp}yxn@fFj5$4lt$=^5s2r}S|h9TDM^=6x6-6_~@Q3p42xYOfs~<3c^W6}#45 zyIEN02@12f>SZtn1_oqh_f{y6nfL2yf|L`v$#bHfIvl%px8ArW=wp zoI26$d!Mh5ipHQuxSNWN%|5Mw3JDMKGsoyJusDB`QjSjD$s>ge6Bs<@4;D7o*7!~L zRM?iAxS_LiA6RJUrUDH}v-8#FOr`2&npCPAXj#8!4PxT%!ER>cLQ(1)N^LhRy0kzg ztVrjwFofI-tQeuB^XVgSC4P1a0^t+D%5q@$TOCFmB3 zti)sor%n(mcTmLZCOjGDP}{RM2^?aJda`HO#@pP>mJANG0qX{bYnSFR`AnDa$3FR7a^e(KKka(k%i|7!N3qwD>{D%jhLDP0{?7cN0(GbCqz;OpqE&l7HO zV8^SyjaJgQME8i2PWL)qrvHaT%G{I)y2FEmcF)@+j>HoK@N&N%Jn;fYPQ|P?!y|(PdsA1wNTk> z8fi2i3a_X}q&#Gkx_2rJEcQbg`RLMuXg@x@m)K+8VPOMCNVhfC@Y(tGH#c~MrfD10 zq7A}gQ<~pM`|s}y6~sl*fi$Y{j20sp1I+Mw>n|DC>LAi*rdlS)t5AyIzN)M!1?9T3&fXu>z0@sP%?K#ywYsuEM6}T1dE@-}pUriMsrECmS zC^&fB*K>5I`^`hV^4teS=k;tvfE8{{;g>S^l?P1zj7N7Th1%inedaO33jfd(V$6kif)lQ>C#m`R^EDTW`RO-S_Jv`^$)CV} znVO^^gnb4xX*hHF@&+@VYaRnAIwM3Pb;LNR{ru`C<>wjq8dn|@(hMb5ep7euRn8Bs zKielOjJa6k$V)?AjxT~(;A?v`?$3@z+oyU~$J7nsD~Hd@O&2|$CL{~4h>cm?Z{l#< z3thWExerPjOf*X7FMbe$p2q=a!bGsu@+ZTfN-K~Lf4#}KO?+&Odw~d8T1&Gy0}2k7 z{VBajRUej%jbV2Rl=D+=sXhy`b zs@A$Xrb?FwqbxIOQBVucs)6wN2<$@vJDEmVEq^s1(qLs<$cZ0E%$zy2@fN&VlZv9ofkSNanVK}m}pqoWSKRO7EWr$=u${!W#zz-Muyb(77D;-+*8LXSm8jytKOIH z?T}}fu4pt!HB?JF@}q*E3pS6&Bb1{OUc$4ovIHmjkXv4}5&j;aq9EJIg)$mRUR<6yml;!e1+CeBbp_Pp7imO=mUY{ z5id!#h^6R{@4^@)84yw6&Y>8@Mk?{)DQ`%tZhb0oETs@ws;?k)mvy*+Au=!`rigq9 z!*eeD5l|l?U&gmw31_3;MMXs!uve|7s!LWs&+4pj9>&++%-l>a3BwxcV!|RLHXAXmq4zFZ(i44Vylr7rrZ0LvGfuXP(of;S9ecOuMW@YH zegqnsE;H}@?uR~)1iNpM7Ev$038qsS8u)<MW{@OY^Tb=PstcO7vg&^vPq*065 zFG7*ggbbBzc#QC%K+K(a;nAa&TB?BkY0ybgCAlcCyyY;I z-lzw+IS#3Db3=h3fn*l47*L+&&+anHy#u?&$BwrMC4JD2ktB5Q6lh}I{)F&lkMOrX z3o4-@A|uH+xX2Gj`t`68G1p-rhp>WQN(?8cNTmXi#QXOmY{OheX5d2B!K-SMwt=e5 zMbh}d@KD-YcATyf_;IJWi)8+>X{o$iO$E^|LskOST1!hd?<38M814k7|FAn zV}BptzkX2ty8bLFumF4QUCHf5R&63BlY3fjbG!(ZwmI)~iH9`0pvJ;>UrrqIt0A%C z*f;y$r{&DLb)zA-u*v>7gdzc-q)q!M?&Ul{(ax5m71@DRCYMgoyt~eB8_@Ub-T?zx z0kP@sp4RwihfK~Kcz9A8e%>OmiM1%fB7@N8Ty~TQNO9*FdMN!lTF(Hl-jPgGoJ}_B zk}jtUSmhy4Cs@Q*-Ke^78>dG!xck_$~04Y$8q-=PGNT~N~>le`VBlBRAvPA zhdV?{exUQ+Auf$2-{CQHn!)_b#PJ}~9=?`2#Tlh%VCMbCd$QxD{j>Hnm}!CgAS0uD z@?E)|IC0~1p)yU0tNkTeJ^**ff8!Q(XafP(T+s(OQGd?@ARjYRp-;52d z=g&it|ZqTDh%5$03kVpw>_#CUQRF5;)1PPo9KT5p%DZf}Tv2-X+YTD6p#!R5mxuVUfu{3VP0f zWQggV9Sxmiv#ZA8)*PEj#_f+kG>cquw0!e=1$YFantB$zc;pG^W(u|K2p!vafiYKP zRYx(Y3Kf1iQ>+1xQE+i-k9iatE(~s&%)i`Tl)L82d>9l{3}vo?2vf)r`UCYKVZ8Rn zLgf)Xi1@9mSLfIcbDvC&@j=ZNB%^~5z+J_N*NSAI7K1+B^ev78Wa6dHwB7Yp0-UEi z_uY@W@)+=q9MF|dquC-+J!mQfENh_gDo1elhB3oA zb>~;G?0Eueln9u^zC1SkgvY<>A;#hLD0KY&>ZT&TyS8`f*A<2Fa45?*aOgwS=i9Ut zr+^NB%eA@Z9o=~DjGOFx;kAOBr83Njt8!H7r(sQDOJnL3kxS0`ts)5o5ovRPwY4XB zWuEyUwou2rms-yshpGuZXk~oAMaTaB1Y7-sZ1Rp!7~$#oP28Jq`=nRpo9_dPu(Z{; z^mjCi9-$WY-`kC!0rlJ%Zeb1r3fISCx|_I`g3zj2kdM27##P6_BGqwc2bY{V(Akyfb!M;9@8)KV*Q)K*2dHsb(8~NQ+7XH(=bKl9BCs)h*t7J zXj+d<-G1<}6Qkqb^z-{z3$LS+!Ymb|>4OKMJQevzeb%-H?_GE)NI`Gpe#-!TockxAIq!Z)Q@Hy6roO!KDFLxt@T7 zIpWtaaFe~B`0A&IfD?E?6U%a*wt$NX+WQB%-q)A6|Dpe2EABL)c5W<7wxwozXa6?S zx9xk8L62kf$X6xl4?lBl6lQ?CO!VNq-%b&)AYk`i8{eANBq`6CV*!-)gg8)8j ztTrF%L7$RJb!Nn>OtKB0mZ4;0*x1olWVNt*eT`JSd?+(`#K`?7g77r(ZKV4C>4z~? z=XZfb>%C9pt_>m)Z~KVJyW>7o_wiM3C%TCyY^u7YXw_+iNQwSoMj$EN5ip2WbktzNy|XJ!#E z>E8L;MFmxUwLFnhdz#O`srO96*=76{;IKl{aV>P=TL1C!@dmiMJ3bNfy>QJaCbN94 zd*kTnV@GKWW_4r3X&-||O{3B1Z#ZxKXiC#07-VpubN+^VG5lic#nR(e634BLzR~CF z_H?gWWq)>F^$X%Jzm1<1xx*3^P*|e0Yn!1!8GMrrjoWOTZGay$6N)&MWRrnZ$t(9MnjZW4!E;F?Nb>ypJngD z5Q0lYq)s9v;qzWAo}Qivd-zh9%xoAf;lRf6o1dRMc>I%K%eZsJ=Al$apUzN3nsIf} zQ*+y7nV62LzbHI#vC4AJj-Y4EvP*KF{otO|-^|FKf+h~@E9#5)j{aF)3!| z3VL^JS#O8*gTWs3@XkngbPPFmn+7t-y^o|~^lVhUdzC}AN2cU;bIT z99>wd?II6A+QN#zmLAqy)~k&eJtcQPFlYr!eqlp!XMogz5%^8>#p}{^-E-ko#cRay zv!`22>}wqdYCPi0Xj!79l2L}N4o>>xFHtFsq)PtgPkw2HhkJJCTRxiaH`J-3Z^!D= zm)~QdM~s9B?i47Dd{{cNo;B#F5s5RibTgEZkd0`tT^K`O38;`cTH(JA~WV$xv zBWC66L>n(|7;7Y!>=~0@95;?q`35Fugc23*zU7{E`O*G+)F4Qf@P2Ytr6?cn#0itg z_slsg3lc^^@|jxQ{(P3jgVQp8p-qJ(-fs>HYY(rJD!ig4l4-A_Rr(TBOX7jGDFR_? z4QKy87}F4?R)1-KPU_R@JN%?WkP?w+ZMB>bAzml$> z3hxwW&5}}V@}{It$LI~xa{~(mT<9-Vmh&Cn*0dU)228^9-aQg5hFlejI zP2d8vv~t2B+IBKSXHO<@RPtM=fXxc|rsx4(BgU*3o-we#YjJu@v4!)|Jn=zOrJT8O z$9=bfp61RZYA^}XL_y?xdF8*mcivMW8@o8ry>lx|W|BE1CE@sT>i4t=0UhTu!Rf}o z6Mc7H;OT#ISNG@N5ki8XyTDfDbXAy<{+W7uMyt?vzP-Ee&&U+@WfcM%y=T{OeiCpYQ3{FE& zxd*+Oy}#1mBV%?>iaQ~TQBn+ZD(-`+tYR@A#>tP1l+fB9MgCYS3UqH?nnQSv%J+t}q_Iea+DhMr(L<#*)&0&zU&c5&J~ zkUT6662C?-Jc&LjN9RC0u~dJ@F9}JlsK3Bge%f~6PR~~CdJMulr83_Q-B!cN|JUv* zzz!M%EYthG^*CuRaWvrT-0wdMnQL{e<+sS8sZp{V<6UtpNs^r+fc< z5_j%-Q|7T6k*Yj{xHHY$b8Hh~&uPg1@!yZg3lo(dIH0W&!HC}P5_=l0{^jq9*NTvo z5~->;jJ7>C3rF|;T%4I`h0J;V-K8S+fmOq`H)OXX8Fd>f!3OJ|KKsjJg#eOwgdX&R z4_>*2#<|pE_K8_RsC4yzX1!TRoS=*W)mrjKcK0Jvj+^x3C2J^! zEBRVR)u6rm;=oHzo7r$K+}9W=?G0?^KWe8*oJ#!UQJ6l2A4<$lG$N%n zh#eJxtVXwq9skUM{u)FqT=a7Qe^sFx|F;0}ldK3H7iTjtDVZx;>V<&L*wYE?1g(em zjA2^9Y`}Z1mea15c(3zIQ*DX78qu5b=oMQOyd0ef^+F8%W%B>j%>RGzqUjD!>gyj8 Vt&lus#s6K1TPoVhrHbak{|otFuF3!a literal 0 HcmV?d00001 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/frontend-design/.reforma-plugin/plugin.json b/marketplace/ui/frontend-design/.reforma-plugin/plugin.json index 0377f38..8bdc290 100644 --- a/marketplace/ui/frontend-design/.reforma-plugin/plugin.json +++ b/marketplace/ui/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/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/react-best-practices/.reforma-plugin/plugin.json b/marketplace/ui/react-best-practices/.reforma-plugin/plugin.json index a4cb884..33dbc53 100644 --- a/marketplace/ui/react-best-practices/.reforma-plugin/plugin.json +++ b/marketplace/ui/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/shadcn-tailwind/assets/logo.png b/marketplace/ui/shadcn-tailwind/assets/logo.png deleted file mode 100644 index b7b6814acc25073e5f48099b1fd3f70c47bfb1c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3852 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 + + + 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/ui/web-design-guidelines/.reforma-plugin/plugin.json b/marketplace/ui/web-design-guidelines/.reforma-plugin/plugin.json index 94c215c..6a6bda6 100644 --- a/marketplace/ui/web-design-guidelines/.reforma-plugin/plugin.json +++ b/marketplace/ui/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/workspace/context7/.reforma-plugin/plugin.json b/marketplace/workspace/context7/.reforma-plugin/plugin.json index aa6de4f..cd1eb45 100644 --- a/marketplace/workspace/context7/.reforma-plugin/plugin.json +++ b/marketplace/workspace/context7/.reforma-plugin/plugin.json @@ -1,9 +1,10 @@ { "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", "interface": { - "brandColor": "#000000" + "brandColor": "#000000", + "displayName": "Context7" }, "mcpServers": "./mcp.json", "variables": { @@ -16,6 +17,8 @@ "placeholder": "ctx7sk-…" } }, - "required": ["API_KEY"] + "required": [ + "API_KEY" + ] } } 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; From 4a2b61b2922f343a9b4ca1e5d1956fc478371140 Mon Sep 17 00:00:00 2001 From: Maksim Kachurin Date: Fri, 28 Aug 2026 01:01:09 -0300 Subject: [PATCH 2/2] feat: Context7 OAuth, playbooks shelf, drop n8n Move design playbooks out of UI, switch Context7 to /mcp/oauth, refresh mood rules, and remove the n8n card. --- README.md | 17 ++-- marketplace.json | 34 ++++---- .../n8n/.reforma-plugin/plugin.json | 15 ---- marketplace/automation/n8n/assets/logo.svg | 3 - marketplace/automation/n8n/mcp.json | 7 -- marketplace/automation/zapier/mcp.json | 8 +- .../bro-mode/.reforma-plugin/plugin.json | 2 +- marketplace/moods/bro-mode/rules/bro.md | 29 ++++--- .../caveman-mode/.reforma-plugin/plugin.json | 2 +- marketplace/moods/caveman-mode/LICENSE.txt | 26 ------ .../moods/caveman-mode/rules/caveman.md | 32 +++---- .../hype-man/.reforma-plugin/plugin.json | 2 +- marketplace/moods/hype-man/rules/hype.md | 24 +++--- .../professor/.reforma-plugin/plugin.json | 2 +- .../moods/professor/rules/professor.md | 29 ++++--- .../zen-mode/.reforma-plugin/plugin.json | 2 +- marketplace/moods/zen-mode/rules/zen.md | 24 +++--- .../.reforma-plugin/plugin.json | 0 .../frontend-design/LICENSE.txt | 0 .../frontend-design/assets/logo.svg | 0 .../skills/frontend-design/SKILL.md | 0 .../.reforma-plugin/plugin.json | 0 .../react-best-practices/LICENSE.txt | 0 .../react-best-practices/assets/logo.svg | 0 .../skills/react-best-practices/SKILL.md | 0 .../react-best-practices/rules/_sections.md | 0 .../rules/advanced-effect-event-deps.md | 0 .../rules/advanced-event-handler-refs.md | 0 .../rules/advanced-init-once.md | 0 .../rules/advanced-use-latest.md | 0 .../rules/async-api-routes.md | 0 .../async-cheap-condition-before-await.md | 0 .../rules/async-defer-await.md | 0 .../rules/async-dependencies.md | 0 .../rules/async-parallel.md | 0 .../rules/async-suspense-boundaries.md | 0 .../rules/bundle-analyzable-paths.md | 0 .../rules/bundle-barrel-imports.md | 0 .../rules/bundle-conditional.md | 0 .../rules/bundle-defer-third-party.md | 0 .../rules/bundle-dynamic-imports.md | 0 .../rules/bundle-preload.md | 0 .../rules/client-event-listeners.md | 0 .../rules/client-localstorage-schema.md | 0 .../rules/client-passive-event-listeners.md | 0 .../rules/client-swr-dedup.md | 0 .../rules/js-batch-dom-css.md | 0 .../rules/js-cache-function-results.md | 0 .../rules/js-cache-property-access.md | 0 .../rules/js-cache-storage.md | 0 .../rules/js-combine-iterations.md | 0 .../rules/js-early-exit.md | 0 .../rules/js-flatmap-filter.md | 0 .../rules/js-hoist-regexp.md | 0 .../rules/js-index-maps.md | 0 .../rules/js-length-check-first.md | 0 .../rules/js-min-max-loop.md | 0 .../rules/js-request-idle-callback.md | 0 .../rules/js-set-map-lookups.md | 0 .../rules/js-tosorted-immutable.md | 0 .../rules/rendering-activity.md | 0 .../rules/rendering-animate-svg-wrapper.md | 0 .../rules/rendering-conditional-render.md | 0 .../rules/rendering-content-visibility.md | 0 .../rules/rendering-hoist-jsx.md | 0 .../rules/rendering-hydration-no-flicker.md | 0 .../rendering-hydration-suppress-warning.md | 0 .../rules/rendering-resource-hints.md | 0 .../rules/rendering-script-defer-async.md | 0 .../rules/rendering-svg-precision.md | 0 .../rules/rendering-usetransition-loading.md | 0 .../rules/rerender-defer-reads.md | 0 .../rules/rerender-dependencies.md | 0 .../rules/rerender-derived-state-no-effect.md | 0 .../rules/rerender-derived-state.md | 0 .../rules/rerender-functional-setstate.md | 0 .../rules/rerender-lazy-state-init.md | 0 .../rules/rerender-memo-with-default-value.md | 0 .../rules/rerender-memo.md | 0 .../rules/rerender-move-effect-to-event.md | 0 .../rules/rerender-no-inline-components.md | 0 .../rerender-simple-expression-in-memo.md | 0 .../rules/rerender-split-combined-hooks.md | 0 .../rules/rerender-transitions.md | 0 .../rules/rerender-use-deferred-value.md | 0 .../rerender-use-ref-transient-values.md | 0 .../rules/server-after-nonblocking.md | 0 .../rules/server-auth-actions.md | 0 .../rules/server-cache-lru.md | 0 .../rules/server-cache-react.md | 0 .../rules/server-dedup-props.md | 0 .../rules/server-hoist-static-io.md | 0 .../rules/server-no-shared-module-state.md | 0 .../rules/server-parallel-fetching.md | 0 .../rules/server-parallel-nested-fetching.md | 0 .../rules/server-serialization.md | 0 .../.reforma-plugin/plugin.json | 0 .../web-design-guidelines/LICENSE.txt | 0 .../web-design-guidelines/assets/logo.svg | 0 .../skills/audit-ui/SKILL.md | 0 .../skills/web-design-guidelines/SKILL.md | 0 .../context7/.reforma-plugin/plugin.json | 17 +--- marketplace/workspace/context7/mcp.json | 85 +++++++++---------- 103 files changed, 147 insertions(+), 213 deletions(-) delete mode 100644 marketplace/automation/n8n/.reforma-plugin/plugin.json delete mode 100644 marketplace/automation/n8n/assets/logo.svg delete mode 100644 marketplace/automation/n8n/mcp.json delete mode 100644 marketplace/moods/caveman-mode/LICENSE.txt rename marketplace/{ui => playbooks}/frontend-design/.reforma-plugin/plugin.json (100%) rename marketplace/{ui => playbooks}/frontend-design/LICENSE.txt (100%) rename marketplace/{ui => playbooks}/frontend-design/assets/logo.svg (100%) rename marketplace/{ui => playbooks}/frontend-design/skills/frontend-design/SKILL.md (100%) rename marketplace/{ui => playbooks}/react-best-practices/.reforma-plugin/plugin.json (100%) rename marketplace/{ui => playbooks}/react-best-practices/LICENSE.txt (100%) rename marketplace/{ui => playbooks}/react-best-practices/assets/logo.svg (100%) rename marketplace/{ui => playbooks}/react-best-practices/skills/react-best-practices/SKILL.md (100%) rename marketplace/{ui => playbooks}/react-best-practices/skills/react-best-practices/rules/_sections.md (100%) rename marketplace/{ui => playbooks}/react-best-practices/skills/react-best-practices/rules/advanced-effect-event-deps.md (100%) rename marketplace/{ui => playbooks}/react-best-practices/skills/react-best-practices/rules/advanced-event-handler-refs.md (100%) rename marketplace/{ui => playbooks}/react-best-practices/skills/react-best-practices/rules/advanced-init-once.md (100%) rename marketplace/{ui => playbooks}/react-best-practices/skills/react-best-practices/rules/advanced-use-latest.md (100%) rename marketplace/{ui => playbooks}/react-best-practices/skills/react-best-practices/rules/async-api-routes.md (100%) rename marketplace/{ui => playbooks}/react-best-practices/skills/react-best-practices/rules/async-cheap-condition-before-await.md (100%) rename marketplace/{ui => playbooks}/react-best-practices/skills/react-best-practices/rules/async-defer-await.md (100%) rename marketplace/{ui => playbooks}/react-best-practices/skills/react-best-practices/rules/async-dependencies.md (100%) rename marketplace/{ui => playbooks}/react-best-practices/skills/react-best-practices/rules/async-parallel.md (100%) rename marketplace/{ui => playbooks}/react-best-practices/skills/react-best-practices/rules/async-suspense-boundaries.md (100%) rename marketplace/{ui => playbooks}/react-best-practices/skills/react-best-practices/rules/bundle-analyzable-paths.md (100%) rename marketplace/{ui => playbooks}/react-best-practices/skills/react-best-practices/rules/bundle-barrel-imports.md (100%) rename marketplace/{ui => playbooks}/react-best-practices/skills/react-best-practices/rules/bundle-conditional.md (100%) rename marketplace/{ui => playbooks}/react-best-practices/skills/react-best-practices/rules/bundle-defer-third-party.md (100%) rename marketplace/{ui => playbooks}/react-best-practices/skills/react-best-practices/rules/bundle-dynamic-imports.md (100%) rename marketplace/{ui => playbooks}/react-best-practices/skills/react-best-practices/rules/bundle-preload.md (100%) rename marketplace/{ui => playbooks}/react-best-practices/skills/react-best-practices/rules/client-event-listeners.md (100%) rename marketplace/{ui => playbooks}/react-best-practices/skills/react-best-practices/rules/client-localstorage-schema.md (100%) rename marketplace/{ui => playbooks}/react-best-practices/skills/react-best-practices/rules/client-passive-event-listeners.md (100%) rename marketplace/{ui => playbooks}/react-best-practices/skills/react-best-practices/rules/client-swr-dedup.md (100%) rename marketplace/{ui => playbooks}/react-best-practices/skills/react-best-practices/rules/js-batch-dom-css.md (100%) rename marketplace/{ui => playbooks}/react-best-practices/skills/react-best-practices/rules/js-cache-function-results.md (100%) rename marketplace/{ui => playbooks}/react-best-practices/skills/react-best-practices/rules/js-cache-property-access.md (100%) rename marketplace/{ui => playbooks}/react-best-practices/skills/react-best-practices/rules/js-cache-storage.md (100%) rename marketplace/{ui => playbooks}/react-best-practices/skills/react-best-practices/rules/js-combine-iterations.md (100%) rename marketplace/{ui => playbooks}/react-best-practices/skills/react-best-practices/rules/js-early-exit.md (100%) rename marketplace/{ui => playbooks}/react-best-practices/skills/react-best-practices/rules/js-flatmap-filter.md (100%) rename marketplace/{ui => playbooks}/react-best-practices/skills/react-best-practices/rules/js-hoist-regexp.md (100%) rename marketplace/{ui => playbooks}/react-best-practices/skills/react-best-practices/rules/js-index-maps.md (100%) rename marketplace/{ui => playbooks}/react-best-practices/skills/react-best-practices/rules/js-length-check-first.md (100%) rename marketplace/{ui => playbooks}/react-best-practices/skills/react-best-practices/rules/js-min-max-loop.md (100%) rename marketplace/{ui => playbooks}/react-best-practices/skills/react-best-practices/rules/js-request-idle-callback.md (100%) rename marketplace/{ui => playbooks}/react-best-practices/skills/react-best-practices/rules/js-set-map-lookups.md (100%) rename marketplace/{ui => playbooks}/react-best-practices/skills/react-best-practices/rules/js-tosorted-immutable.md (100%) rename marketplace/{ui => playbooks}/react-best-practices/skills/react-best-practices/rules/rendering-activity.md (100%) rename marketplace/{ui => playbooks}/react-best-practices/skills/react-best-practices/rules/rendering-animate-svg-wrapper.md (100%) rename marketplace/{ui => playbooks}/react-best-practices/skills/react-best-practices/rules/rendering-conditional-render.md (100%) rename marketplace/{ui => playbooks}/react-best-practices/skills/react-best-practices/rules/rendering-content-visibility.md (100%) rename marketplace/{ui => playbooks}/react-best-practices/skills/react-best-practices/rules/rendering-hoist-jsx.md (100%) rename marketplace/{ui => playbooks}/react-best-practices/skills/react-best-practices/rules/rendering-hydration-no-flicker.md (100%) rename marketplace/{ui => playbooks}/react-best-practices/skills/react-best-practices/rules/rendering-hydration-suppress-warning.md (100%) rename marketplace/{ui => playbooks}/react-best-practices/skills/react-best-practices/rules/rendering-resource-hints.md (100%) rename marketplace/{ui => playbooks}/react-best-practices/skills/react-best-practices/rules/rendering-script-defer-async.md (100%) rename marketplace/{ui => playbooks}/react-best-practices/skills/react-best-practices/rules/rendering-svg-precision.md (100%) rename marketplace/{ui => playbooks}/react-best-practices/skills/react-best-practices/rules/rendering-usetransition-loading.md (100%) rename marketplace/{ui => playbooks}/react-best-practices/skills/react-best-practices/rules/rerender-defer-reads.md (100%) rename marketplace/{ui => playbooks}/react-best-practices/skills/react-best-practices/rules/rerender-dependencies.md (100%) rename marketplace/{ui => playbooks}/react-best-practices/skills/react-best-practices/rules/rerender-derived-state-no-effect.md (100%) rename marketplace/{ui => playbooks}/react-best-practices/skills/react-best-practices/rules/rerender-derived-state.md (100%) rename marketplace/{ui => playbooks}/react-best-practices/skills/react-best-practices/rules/rerender-functional-setstate.md (100%) rename marketplace/{ui => playbooks}/react-best-practices/skills/react-best-practices/rules/rerender-lazy-state-init.md (100%) rename marketplace/{ui => playbooks}/react-best-practices/skills/react-best-practices/rules/rerender-memo-with-default-value.md (100%) rename marketplace/{ui => playbooks}/react-best-practices/skills/react-best-practices/rules/rerender-memo.md (100%) rename marketplace/{ui => playbooks}/react-best-practices/skills/react-best-practices/rules/rerender-move-effect-to-event.md (100%) rename marketplace/{ui => playbooks}/react-best-practices/skills/react-best-practices/rules/rerender-no-inline-components.md (100%) rename marketplace/{ui => playbooks}/react-best-practices/skills/react-best-practices/rules/rerender-simple-expression-in-memo.md (100%) rename marketplace/{ui => playbooks}/react-best-practices/skills/react-best-practices/rules/rerender-split-combined-hooks.md (100%) rename marketplace/{ui => playbooks}/react-best-practices/skills/react-best-practices/rules/rerender-transitions.md (100%) rename marketplace/{ui => playbooks}/react-best-practices/skills/react-best-practices/rules/rerender-use-deferred-value.md (100%) rename marketplace/{ui => playbooks}/react-best-practices/skills/react-best-practices/rules/rerender-use-ref-transient-values.md (100%) rename marketplace/{ui => playbooks}/react-best-practices/skills/react-best-practices/rules/server-after-nonblocking.md (100%) rename marketplace/{ui => playbooks}/react-best-practices/skills/react-best-practices/rules/server-auth-actions.md (100%) rename marketplace/{ui => playbooks}/react-best-practices/skills/react-best-practices/rules/server-cache-lru.md (100%) rename marketplace/{ui => playbooks}/react-best-practices/skills/react-best-practices/rules/server-cache-react.md (100%) rename marketplace/{ui => playbooks}/react-best-practices/skills/react-best-practices/rules/server-dedup-props.md (100%) rename marketplace/{ui => playbooks}/react-best-practices/skills/react-best-practices/rules/server-hoist-static-io.md (100%) rename marketplace/{ui => playbooks}/react-best-practices/skills/react-best-practices/rules/server-no-shared-module-state.md (100%) rename marketplace/{ui => playbooks}/react-best-practices/skills/react-best-practices/rules/server-parallel-fetching.md (100%) rename marketplace/{ui => playbooks}/react-best-practices/skills/react-best-practices/rules/server-parallel-nested-fetching.md (100%) rename marketplace/{ui => playbooks}/react-best-practices/skills/react-best-practices/rules/server-serialization.md (100%) rename marketplace/{ui => playbooks}/web-design-guidelines/.reforma-plugin/plugin.json (100%) rename marketplace/{ui => playbooks}/web-design-guidelines/LICENSE.txt (100%) rename marketplace/{ui => playbooks}/web-design-guidelines/assets/logo.svg (100%) rename marketplace/{ui => playbooks}/web-design-guidelines/skills/audit-ui/SKILL.md (100%) rename marketplace/{ui => playbooks}/web-design-guidelines/skills/web-design-guidelines/SKILL.md (100%) diff --git a/README.md b/README.md index 23761f2..4461eb6 100644 --- a/README.md +++ b/README.md @@ -6,12 +6,15 @@ Marketplace plugins for Reforma. Each plugin is a folder with `.reforma-plugin/p | name | Plugin | Author | Category | description | | --------------------- | ------------------------------------------------------------------------ | ------------- | ---------- | --------------------------------------------------------------------------------------------------------- | -| bro-mode | [Bro Mode](marketplace/moods/bro-mode) | Reforma | Moods | Talk like your brother — relaxed, blunt, and not afraid to push back | -| zen-mode | [Zen Mode](marketplace/moods/zen-mode) | Reforma | Moods | Calm, minimal replies — no noise, no hype, one clear step at a time | +| 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 | Explain the why — context, tradeoffs, and how the pieces fit together | -| hype-man | [Hype Man](marketplace/moods/hype-man) | Reforma | Moods | Founder energy — big vision, momentum, and belief this thing wins | -| caveman-mode | [Caveman](marketplace/moods/caveman-mode) | Reforma | Moods | Smart caveman. Brain big, mouth small. Same work, less fluff. | +| 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 | @@ -22,9 +25,6 @@ Marketplace plugins for Reforma. Each plugin is a folder with `.reforma-plugin/p | 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 | -| react-best-practices | [React Best Practices](marketplace/ui/react-best-practices) | Vercel | UI | Keep the app fast — React and Next.js performance patterns | -| web-design-guidelines | [Web Design Guidelines](marketplace/ui/web-design-guidelines) | Vercel | UI | Catch accessibility, form, and focus issues before they ship | -| frontend-design | [Frontend Design](marketplace/ui/frontend-design) | Anthropic | UI | A look that is not a template — palette, type, and layout with a point of view | | 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 | @@ -72,7 +72,6 @@ Marketplace plugins for Reforma. Each plugin is a folder with `.reforma-plugin/p | 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 | -| n8n | [n8n](marketplace/automation/n8n) | n8n | Automation | Workflows you host yourself — run them 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`. `description` is the marketplace pitch: what the product is for the person installing it. Not MCP verbs, not “needs an API key.” diff --git a/marketplace.json b/marketplace.json index 8628daf..b92f5d2 100644 --- a/marketplace.json +++ b/marketplace.json @@ -48,6 +48,24 @@ } ] }, + { + "id": "playbooks", + "name": "Playbooks", + "plugins": [ + { + "name": "react-best-practices", + "source": "./marketplace/playbooks/react-best-practices" + }, + { + "name": "web-design-guidelines", + "source": "./marketplace/playbooks/web-design-guidelines" + }, + { + "name": "frontend-design", + "source": "./marketplace/playbooks/frontend-design" + } + ] + }, { "id": "ui", "name": "UI", @@ -98,18 +116,6 @@ "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" @@ -398,10 +404,6 @@ { "name": "make", "source": "./marketplace/automation/make" - }, - { - "name": "n8n", - "source": "./marketplace/automation/n8n" } ] } diff --git a/marketplace/automation/n8n/.reforma-plugin/plugin.json b/marketplace/automation/n8n/.reforma-plugin/plugin.json deleted file mode 100644 index 451596b..0000000 --- a/marketplace/automation/n8n/.reforma-plugin/plugin.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "name": "n8n", - "description": "Workflows you host yourself — run them and use the results in the app", - "author": { - "name": "n8n", - "url": "https://n8n.io" - }, - "mcpServers": "./mcp.json", - "logo": "assets/logo.svg", - "interface": { - "displayName": "n8n", - "brandColor": "#EA4B71", - "logo": "assets/logo.svg" - } -} diff --git a/marketplace/automation/n8n/assets/logo.svg b/marketplace/automation/n8n/assets/logo.svg deleted file mode 100644 index 3385271..0000000 --- a/marketplace/automation/n8n/assets/logo.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - 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/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/moods/bro-mode/.reforma-plugin/plugin.json b/marketplace/moods/bro-mode/.reforma-plugin/plugin.json index 8c6fb56..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/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/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 815b21d..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/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 8e570c6..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/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/zen-mode/.reforma-plugin/plugin.json b/marketplace/moods/zen-mode/.reforma-plugin/plugin.json index c636f71..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/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/ui/frontend-design/.reforma-plugin/plugin.json b/marketplace/playbooks/frontend-design/.reforma-plugin/plugin.json similarity index 100% rename from marketplace/ui/frontend-design/.reforma-plugin/plugin.json rename to marketplace/playbooks/frontend-design/.reforma-plugin/plugin.json 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 100% rename from marketplace/ui/react-best-practices/.reforma-plugin/plugin.json rename to marketplace/playbooks/react-best-practices/.reforma-plugin/plugin.json 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 100% rename from marketplace/ui/web-design-guidelines/.reforma-plugin/plugin.json rename to marketplace/playbooks/web-design-guidelines/.reforma-plugin/plugin.json 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/workspace/context7/.reforma-plugin/plugin.json b/marketplace/workspace/context7/.reforma-plugin/plugin.json index cd1eb45..0c78bd6 100644 --- a/marketplace/workspace/context7/.reforma-plugin/plugin.json +++ b/marketplace/workspace/context7/.reforma-plugin/plugin.json @@ -2,23 +2,10 @@ "name": "context7", "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", "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"] + } } + } } + } }