diff --git a/.agents/plugins/marketplace.json b/.agents/plugins/marketplace.json index 8a5a5c41..772eb61b 100644 --- a/.agents/plugins/marketplace.json +++ b/.agents/plugins/marketplace.json @@ -14,7 +14,7 @@ "installation": "AVAILABLE", "authentication": "ON_INSTALL" }, - "category": "Ai" + "category": "AI" }, { "name": "flutter", @@ -146,7 +146,7 @@ "installation": "AVAILABLE", "authentication": "ON_INSTALL" }, - "category": "Ui" + "category": "UI" }, { "name": "plugin-dev", @@ -326,7 +326,7 @@ "installation": "AVAILABLE", "authentication": "ON_INSTALL" }, - "category": "Ui" + "category": "UI" }, { "name": "gatekeeper", @@ -386,7 +386,7 @@ "installation": "AVAILABLE", "authentication": "ON_INSTALL" }, - "category": "Ai" + "category": "AI" }, { "name": "supabase", @@ -446,7 +446,7 @@ "installation": "AVAILABLE", "authentication": "ON_INSTALL" }, - "category": "Ai" + "category": "AI" }, { "name": "slack-agent", @@ -858,7 +858,7 @@ "installation": "AVAILABLE", "authentication": "ON_INSTALL" }, - "category": "Ai" + "category": "AI" }, { "name": "edgeparse", diff --git a/.agents/skills/create-plugin-scaffold/SKILL.md b/.agents/skills/create-plugin-scaffold/SKILL.md new file mode 100644 index 00000000..f3986e8f --- /dev/null +++ b/.agents/skills/create-plugin-scaffold/SKILL.md @@ -0,0 +1,70 @@ +--- +name: create-plugin-scaffold +description: Create a new Cursor plugin scaffold with a valid manifest, component directories, and marketplace wiring. Use when starting a new plugin or adding a plugin to a multi-plugin repository. +--- + +# Create plugin scaffold + +## Trigger + +You need to create a new Cursor plugin from scratch and make it ready for local use or marketplace submission. + +## Required Inputs + +- Plugin name (lowercase kebab-case) +- Plugin purpose and target users +- Component set to include (`rules`, `skills`, `agents`, `commands`, `hooks`, `mcpServers`) +- Repository style (`single-plugin` or `multi-plugin marketplace`) + +## Output Location + +By default, create the plugin inside the user's local plugin directory: + +``` +~/.cursor/plugins/local// +``` + +This path makes the plugin immediately available to Cursor without any install step. If the user explicitly asks to create the plugin elsewhere (e.g. inside an existing repo or a specific directory), respect that choice instead. + +## Workflow + +1. Validate plugin name format: lowercase kebab-case, starts and ends with an alphanumeric character. +2. Determine the target directory: + - Default: `~/.cursor/plugins/local//` + - Override: use the path the user specifies, if any. + - Create the directory (and parents) if it does not exist. +3. Create base files inside the target directory: + - `.cursor-plugin/plugin.json` + - `README.md` + - `LICENSE` + - optional `CHANGELOG.md` +4. Populate `plugin.json`: + - Required: `name` + - Recommended: `version`, `description`, `author`, `license`, `keywords` + - Add explicit component paths only when non-default discovery is needed. +5. Create component files with valid frontmatter: + - Rules: `.mdc` with `description`, `alwaysApply`, optional `globs` + - Skills: `skills//SKILL.md` with `name`, `description` + - Agents: `agents/*.md` with `name`, `description` + - Commands: `commands/*.(md|txt)` with `name`, `description` +6. If repository uses `.cursor-plugin/marketplace.json`, add plugin entry: + - `name` + - `source` + - optional metadata (`description`, `keywords`, `category`, `tags`) +7. Ensure all manifest paths are relative, valid, and do not use absolute paths or parent traversal. + +## Guardrails + +- Keep the plugin focused on one use case. +- Prefer concise, actionable skill and rule text over long prose. +- Do not reference files that do not exist. +- Use folder discovery defaults unless custom paths are required. +- Always save to `~/.cursor/plugins/local//` unless the user provides a different path. + +## Output + +- Created file tree for the plugin (with full path to the output directory) +- Final `plugin.json` +- Marketplace entry (if applicable) +- Short validation report of required fields and component metadata +- Confirmation that the plugin is saved under `~/.cursor/plugins/local/` and ready for use diff --git a/.claude-plugin/marketplace.json b/.claude-plugin/marketplace.json index b7cba0d8..9a009866 100644 --- a/.claude-plugin/marketplace.json +++ b/.claude-plugin/marketplace.json @@ -92,6 +92,7 @@ }, { "name": "mcp-neo4j", + "displayName": "MCP Neo4j", "description": "Neo4j MCP servers for graph database operations, memory management, Aura cloud management, and data modeling", "category": "database", "keywords": ["neo4j", "graph-database", "cypher"], @@ -242,6 +243,7 @@ }, { "name": "vueuse", + "displayName": "VueUse", "description": "VueUse composables for building concise, maintainable Vue.js / Nuxt features", "category": "framework", "keywords": ["vueuse", "vue", "composables", "utilities"], @@ -266,6 +268,7 @@ }, { "name": "mcp-dev", + "displayName": "MCP Dev", "description": "Guide for creating high-quality MCP servers with best practices, TypeScript/Python patterns, and evaluation tools", "category": "tooling", "keywords": ["mcp", "server", "development", "best-practices"], @@ -391,6 +394,7 @@ }, { "name": "markitdown", + "displayName": "MarkItDown", "description": "Convert documents (PDF, DOCX, PPTX, images, etc.) to Markdown using MarkItDown MCP server", "category": "tooling", "keywords": ["markitdown", "pdf", "docx", "pptx", "markdown", "conversion", "images"], diff --git a/.claude/rules/marketplace-sync.md b/.claude/rules/marketplace-sync.md index b8838538..112807b6 100644 --- a/.claude/rules/marketplace-sync.md +++ b/.claude/rules/marketplace-sync.md @@ -3,6 +3,7 @@ description: Keep all marketplace manifests in sync — editing one requires upd globs: - ".claude-plugin/marketplace.json" - ".agents/plugins/marketplace.json" + - ".cursor-plugin/marketplace.json" - "plugins/*/.claude-plugin/plugin.json" alwaysApply: false --- @@ -17,6 +18,7 @@ others are **generated** and must never be hand-edited in isolation. |-------------|---------------------------------------|-------------------------| | Claude Code | `.claude-plugin/marketplace.json` | **source of truth** (edit here) | | Codex | `.agents/plugins/marketplace.json` | generated — do not hand-edit | +| Cursor | `.cursor-plugin/marketplace.json` | generated — do not hand-edit | ## Principle: edit one → sync all @@ -31,16 +33,18 @@ bun scripts/cli.ts multi-format This regenerates, for every local plugin (`source: "./plugins/..."`): - `.agents/plugins/marketplace.json` (Codex marketplace, filtered to local plugins) +- `.cursor-plugin/marketplace.json` (Cursor marketplace, filtered to local plugins) - `plugins//.codex-plugin/plugin.json` (Codex manifest) - `plugins//plugin.json` (Antigravity manifest) - `plugins//mcp_config.json` (Antigravity, when MCP present) +- `plugins//.cursor-plugin/plugin.json` (Cursor manifest) ## Companion files that must move together - **`release-please-config.json`** — add a `plugins/` package entry whose `extra-files` cover **every** version-bearing manifest the plugin ships (`.claude-plugin/plugin.json`, and `.codex-plugin/plugin.json` + root `plugin.json` - when multi-format generates them). + + `.cursor-plugin/plugin.json` when multi-format generates them). - **`.release-please-manifest.json`** — add the matching `plugins/` version. - **`README.md`** — add/remove the plugin entry under **Built-in Plugins**. diff --git a/.claude/skills/plugin-builder/CHANGELOG.md b/.claude/skills/claude-code-plugin-builder/CHANGELOG.md similarity index 100% rename from .claude/skills/plugin-builder/CHANGELOG.md rename to .claude/skills/claude-code-plugin-builder/CHANGELOG.md diff --git a/.claude/skills/plugin-builder/README.md b/.claude/skills/claude-code-plugin-builder/README.md similarity index 100% rename from .claude/skills/plugin-builder/README.md rename to .claude/skills/claude-code-plugin-builder/README.md diff --git a/.claude/skills/plugin-builder/SKILL.md b/.claude/skills/claude-code-plugin-builder/SKILL.md similarity index 94% rename from .claude/skills/plugin-builder/SKILL.md rename to .claude/skills/claude-code-plugin-builder/SKILL.md index 9d600ea1..3ae7f41e 100644 --- a/.claude/skills/plugin-builder/SKILL.md +++ b/.claude/skills/claude-code-plugin-builder/SKILL.md @@ -1,6 +1,6 @@ --- name: Claude Code Plugin Builder -description: Creates Claude Code plugins with proper manifest structure, directory layout, and components (commands, agents, skills, hooks, MCP servers). Use when user requests creating plugins, adding slash commands, integrating MCP servers, setting up hooks, migrating Gemini extensions, or mentions "plugin.json", ".claude-plugin", or "marketplace.json". Handles plugin testing, debugging, and marketplace distribution. +description: Creates Claude Code plugins with proper manifest structure, directory layout, and components (commands, agents, skills, hooks, MCP servers). This is for Claude Code plugins (`.claude-plugin/plugin.json`) — for Codex plugins (`.codex-plugin/plugin.json`) use the `plugin-creator` skill, and for Cursor plugins (`.cursor-plugin/plugin.json`) use the `create-plugin-scaffold` skill instead. Use when user requests creating plugins, adding slash commands, integrating MCP servers, setting up hooks, migrating Gemini extensions, or mentions "plugin.json", ".claude-plugin", or "marketplace.json". Handles plugin testing, debugging, and marketplace distribution. --- # Claude Code Plugin Builder diff --git a/.claude/skills/plugin-builder/examples.md b/.claude/skills/claude-code-plugin-builder/examples.md similarity index 100% rename from .claude/skills/plugin-builder/examples.md rename to .claude/skills/claude-code-plugin-builder/examples.md diff --git a/.claude/skills/plugin-builder/templates.md b/.claude/skills/claude-code-plugin-builder/templates.md similarity index 100% rename from .claude/skills/plugin-builder/templates.md rename to .claude/skills/claude-code-plugin-builder/templates.md diff --git a/.claude/skills/create-plugin-scaffold b/.claude/skills/create-plugin-scaffold new file mode 120000 index 00000000..df5c35d2 --- /dev/null +++ b/.claude/skills/create-plugin-scaffold @@ -0,0 +1 @@ +../../.agents/skills/create-plugin-scaffold \ No newline at end of file diff --git a/.cursor-plugin/marketplace.json b/.cursor-plugin/marketplace.json new file mode 100644 index 00000000..f95d382e --- /dev/null +++ b/.cursor-plugin/marketplace.json @@ -0,0 +1,363 @@ +{ + "name": "pleaseai", + "owner": { + "name": "Passion Factory", + "email": "support@passionfactory.ai" + }, + "metadata": { + "version": "0.2.0", + "description": "Bundled plugins for Cursor" + }, + "plugins": [ + { + "name": "mcp-neo4j", + "source": "./plugins/neo4j", + "description": "Neo4j MCP servers for graph database operations, memory management, Aura cloud management, and data modeling" + }, + { + "name": "codegraph", + "source": "./plugins/codegraph", + "description": "Local-first code intelligence for AI agents (MCP) - query a pre-indexed knowledge graph of symbols, call graphs, and code structure instead of scanning files" + }, + { + "name": "nuxt-ui", + "source": "./plugins/nuxt-ui", + "description": "The Intuitive Vue UI Library powered by Reka UI & Tailwind CSS." + }, + { + "name": "plugin-dev", + "source": "./plugins/plugin-dev", + "description": "Best practices, guidelines, and validation tools for Claude Code plugin development" + }, + { + "name": "antfu", + "source": "./plugins/antfu", + "description": "Anthony Fu's opinionated tooling and conventions for JavaScript/TypeScript projects" + }, + { + "name": "nuxt", + "source": "./plugins/nuxt", + "description": "Nuxt full-stack Vue framework with SSR, auto-imports, and file-based routing" + }, + { + "name": "pinia", + "source": "./plugins/pinia", + "description": "Pinia official Vue state management library, type-safe and extensible" + }, + { + "name": "pnpm", + "source": "./plugins/pnpm", + "description": "Node.js package manager with strict dependency resolution and workspace support" + }, + { + "name": "slidev", + "source": "./plugins/slidev", + "description": "Create and present web-based slides for developers using Markdown and Vue components" + }, + { + "name": "tsdown", + "source": "./plugins/tsdown", + "description": "Bundle TypeScript and JavaScript libraries with blazing-fast speed powered by Rolldown" + }, + { + "name": "turborepo", + "source": "./plugins/turborepo", + "description": "Turborepo monorepo build system guidance for task pipelines, caching, and CI optimization" + }, + { + "name": "unocss", + "source": "./plugins/unocss", + "description": "UnoCSS instant atomic CSS engine, superset of Tailwind CSS" + }, + { + "name": "vite", + "source": "./plugins/vite", + "description": "Vite build tool configuration, plugin API, SSR, and Rolldown migration" + }, + { + "name": "vitepress", + "source": "./plugins/vitepress", + "description": "VitePress static site generator powered by Vite and Vue" + }, + { + "name": "vitest", + "source": "./plugins/vitest", + "description": "Vitest fast unit testing framework powered by Vite with Jest-compatible API" + }, + { + "name": "vue", + "source": "./plugins/vue", + "description": "Vue 3 core, best practices, router patterns, and testing" + }, + { + "name": "vueuse", + "source": "./plugins/vueuse", + "description": "VueUse composables for building concise, maintainable Vue.js / Nuxt features" + }, + { + "name": "web-design", + "source": "./plugins/web-design", + "description": "Review UI code for Web Interface Guidelines compliance" + }, + { + "name": "gatekeeper", + "source": "./plugins/gatekeeper", + "description": "Auto-approve safe commands, AI-assisted review for the rest" + }, + { + "name": "mcp-dev", + "source": "./plugins/mcp-dev", + "description": "Guide for creating high-quality MCP servers with best practices, TypeScript/Python patterns, and evaluation tools" + }, + { + "name": "cubic", + "source": "./plugins/cubic", + "description": "AI-powered code review using Cubic CLI to detect bugs, security vulnerabilities, and style issues" + }, + { + "name": "playwright-cli", + "source": "./plugins/playwright-cli", + "description": "Token-efficient browser automation CLI for coding agents - navigate, interact, screenshot, and test web apps" + }, + { + "name": "mastra", + "source": "./plugins/mastra", + "description": "Official agent skills for coding agents working with the Mastra AI framework" + }, + { + "name": "supabase", + "source": "./plugins/supabase", + "description": "Agent Skills to help developers using AI agents with Supabase" + }, + { + "name": "prisma", + "source": "./plugins/prisma", + "description": "Official agent skills for Prisma ORM - schema design, migrations, queries, and database workflows" + }, + { + "name": "better-auth", + "source": "./plugins/better-auth", + "description": "Better Auth authentication framework skills for JavaScript/TypeScript projects" + }, + { + "name": "agent-browser", + "source": "./plugins/agent-browser", + "description": "Browser and desktop app automation for AI agents — web browsing, Electron app control, Slack automation, and QA testing workflows" + }, + { + "name": "ai-sdk", + "source": "./plugins/ai-sdk", + "description": "The AI Toolkit for TypeScript - official agent skills for building AI-powered applications and agents with Vercel AI SDK" + }, + { + "name": "slack-agent", + "source": "./plugins/slack-agent", + "description": "Use when working on Slack agent/bot code, Chat SDK applications, Bolt for JavaScript projects, or projects using @chat-adapter/slack or @slack/bolt." + }, + { + "name": "claude-md-management", + "source": "./plugins/claude-md-management", + "description": "Tools to maintain and improve CLAUDE.md files - audit quality, capture session learnings, and keep project memory current" + }, + { + "name": "google-workspace", + "source": "./plugins/google-workspace", + "description": "CLI tool for managing Google Workspace resources dynamically using Discovery APIs." + }, + { + "name": "nuxt-i18n", + "source": "./plugins/nuxt-i18n", + "description": "Nuxt i18n internationalization module for locale routing, lazy-loaded translations, SEO, browser detection, and multi-domain setups" + }, + { + "name": "nuxt-seo", + "source": "./plugins/nuxt-seo", + "description": "Nuxt SEO meta-module with robots, sitemap, og-image, schema-org. Use when configuring SEO, generating sitemaps, creating OG images, or adding structured data." + }, + { + "name": "worktree", + "source": "./plugins/worktree", + "description": "Git worktree isolation: context injection and parent project access prevention" + }, + { + "name": "rtk", + "source": "./plugins/rtk", + "description": "Reduce LLM token consumption by 60-90% using RTK to filter and compress command outputs" + }, + { + "name": "markitdown", + "source": "./plugins/markitdown", + "description": "Convert documents (PDF, DOCX, PPTX, images, etc.) to Markdown using MarkItDown MCP server" + }, + { + "name": "fetch", + "source": "./plugins/fetch", + "description": "Fetch web content in multiple formats - HTML, JSON, plain text, Markdown, readable articles, and YouTube transcripts" + }, + { + "name": "semble", + "source": "./plugins/semble", + "description": "Semantic code search - find code by description or symbol name instead of grep, powered by the Semble MCP server" + }, + { + "name": "ast-grep", + "source": "./plugins/ast-grep", + "description": "Guide for writing ast-grep rules to perform structural code search and analysis. Use when users need to search codebases using Abstract Syntax Tree (AST) patterns, find specific code structures, or perform complex code queries that go beyond simple text search." + }, + { + "name": "chat-sdk", + "source": "./plugins/chat-sdk", + "description": "Build multi-platform chat bots with Chat SDK — unified TypeScript SDK for Slack, Teams, Google Chat, Discord, GitHub, and Linear" + }, + { + "name": "docus", + "source": "./plugins/docus", + "description": "Write beautiful documentations with Nuxt and Markdown." + }, + { + "name": "astro", + "source": "./plugins/astro", + "description": "Access Astro's official documentation through the Astro Docs MCP server." + }, + { + "name": "tosspayments", + "source": "./plugins/tosspayments", + "description": "TossPayments payment integration guide - access official documentation for payment widget, checkout, and API integration" + }, + { + "name": "port", + "source": "./plugins/port", + "description": "Port.io Internal Developer Portal integration. Manage your entire SDLC — blueprints, entities, scorecards, self-service actions, incidents, and DevOps requests — via the Port MCP server. Supports US and EU regions." + }, + { + "name": "portone", + "source": "./plugins/portone", + "description": "포트원(PortOne) 결제 연동 코드 생성 및 검토 플러그인. V1/V2 API를 지원하며, MCP 서버를 통해 최신 문서와 예시 코드를 활용합니다." + }, + { + "name": "please-plugins", + "source": "./plugins/please-plugins", + "description": "Auto-detect project dependencies and recommend matching Claude Code plugins from the pleaseai marketplace" + }, + { + "name": "wordpress", + "source": "./plugins/wordpress", + "description": "Expert-level WordPress knowledge for AI coding assistants — blocks, themes, plugins, and best practices" + }, + { + "name": "vinext", + "source": "./plugins/vinext", + "description": "Migrates Next.js projects to vinext (Vite-based Next.js reimplementation) — compatibility scanning, package replacement, Vite config generation, ESM conversion, and deployment setup" + }, + { + "name": "next", + "source": "./plugins/next", + "description": "Next.js best practices, caching patterns, and upgrade guidance" + }, + { + "name": "react", + "source": "./plugins/react", + "description": "React and Next.js best practices, view transitions, and composition patterns from Vercel Engineering" + }, + { + "name": "react-native", + "source": "./plugins/react-native", + "description": "React Native and Expo best practices for building performant mobile apps" + }, + { + "name": "tiptap", + "source": "./plugins/tiptap", + "description": "Helps coding agents integrate and work with the Tiptap rich text editor — extensions, collaboration, comments, AI, and document conversion" + }, + { + "name": "emulate", + "source": "./plugins/emulate", + "description": "Local drop-in API emulator for Vercel, GitHub, Google, Slack, Apple, Microsoft, AWS, Linear, Stripe, Resend, and Next.js" + }, + { + "name": "edgeparse", + "source": "./plugins/edgeparse", + "description": "Extract structured content from any PDF — headings, tables, paragraphs, lists, bounding boxes — deterministically, without ML dependencies or GPU requirements" + }, + { + "name": "git-ai", + "source": "./plugins/git-ai", + "description": "A Git extension for tracking the AI-generated code in your repos" + }, + { + "name": "graphite", + "source": "./plugins/graphite", + "description": "Stacked PR workflow with the Graphite CLI (gt) — create stacks, submit, sync, restack, split/squash/fold, track branches, and collaborate on shared stacks" + }, + { + "name": "workflow-sdk", + "source": "./plugins/workflow-sdk", + "description": "Workflow SDK: Build durable, reliable, and observable apps and AI Agents in TypeScript" + }, + { + "name": "portless", + "source": "./plugins/portless", + "description": "Replace port numbers with stable, named local URLs. For humans and agents." + }, + { + "name": "zod", + "source": "./plugins/zod", + "description": "TypeScript-first schema validation with static type inference - version-aware skill for Zod v3 and v4" + }, + { + "name": "bun", + "source": "./plugins/bun", + "description": "All-in-one JavaScript/TypeScript toolkit: fast runtime, package manager, test runner, and bundler - version-aware skill backed by the ask CLI" + }, + { + "name": "java-development", + "source": "./plugins/java-development", + "description": "Comprehensive collection of skills for Java development including Spring Boot, Quarkus, testing, documentation, and best practices - imported from github/awesome-copilot" + }, + { + "name": "skillopt-sleep", + "source": "./plugins/skillopt-sleep", + "description": "Nightly offline self-evolution for your local Claude agent: review past sessions, replay recurring tasks on your own budget, and consolidate validated CLAUDE.md memory + SKILL.md skills behind a held-out gate. Self-contained (vendored, zero third-party deps)." + }, + { + "name": "graphify", + "source": "./plugins/graphify", + "description": "Turn any folder of code, docs, papers, images, or videos into a queryable knowledge graph with community detection, query/path/explain tools, and an honest audit trail" + }, + { + "name": "vercel-sandbox", + "source": "./plugins/vercel-sandbox", + "description": "Creates isolated Linux MicroVMs using Vercel Sandbox SDK. Use when building code execution environments, running untrusted code, spinning up dev servers, or testing in isolation." + }, + { + "name": "eve", + "source": "./plugins/eve", + "description": "Build durable backend AI agents with the eve framework. Use when creating, editing, or debugging an eve project — agent instructions, skills, tools, connections, channels, sandboxes, subagents, schedules, or evals." + }, + { + "name": "skill-optimizer", + "source": "./plugins/skill-optimizer", + "description": "Measure and improve how well a plugin's skills help agents solve real tasks. Runs activation and content evals, diagnoses gaps, fixes instructions, and re-runs until scores improve." + }, + { + "name": "nostics", + "source": "./plugins/nostics", + "description": "Structured diagnostic code library for JavaScript/TypeScript. Turns errors into typed, machine-readable Diagnostic instances with stable codes, docs URLs, and actionable fixes. Covers defineDiagnostics, reporters, formatters, Vite plugins, and adding new diagnostic codes." + }, + { + "name": "dev3000", + "source": "./plugins/dev3000", + "description": "dev3000 (d3k) debugging assistant — captures server logs, browser events, console messages, network requests, and screenshots into a unified, timestamped timeline for AI debugging." + }, + { + "name": "lavish", + "source": "./plugins/lavish", + "description": "Turn complex or visual agent responses into rich, reviewable HTML artifacts the user can annotate and send feedback on, using the lavish-axi CLI. Use when about to give a plan, comparison, diagram, table, code diff, report, or anything easier to grasp visually than as prose." + }, + { + "name": "axi", + "source": "./plugins/axi", + "description": "Agent eXperience Interface (AXI) — ergonomic standards for building CLI tools that agents use via shell execution. Use when building, modifying, or reviewing any agent-facing CLI." + } + ] +} diff --git a/CLAUDE.md b/CLAUDE.md index 69eac812..e6a3fd61 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -70,20 +70,21 @@ external-plugins// - Kept for backwards compatibility with Gemini CLI - Not used by Claude Code -**2a. Multi-runtime manifests (Codex + Antigravity)** +**2a. Multi-runtime manifests (Codex + Antigravity + Cursor)** -Each local plugin in `plugins//` ships three runtime manifests so the same -directory installs in Claude Code, Codex, and Google Antigravity: +Each local plugin in `plugins//` ships runtime manifests so the same +directory installs in Claude Code, Codex, Google Antigravity, and Cursor: | Runtime | Manifest path | Companion files | |--------------|----------------------------------------|---------------------------------------| | Claude Code | `.claude-plugin/plugin.json` (source) | `hooks/hooks.json`, inline mcpServers | | Codex | `.codex-plugin/plugin.json` | `.mcp.json` (when MCP present) | | Antigravity | `plugin.json` (root) | `mcp_config.json`, root `hooks.json` | +| Cursor | `.cursor-plugin/plugin.json` | none — components auto-discovered, mcpServers inline | -The Claude manifest is the source of truth — author plugins there. Codex and -Antigravity artifacts are generated by `bun scripts/cli.ts multi-format` and -should not be hand-edited. See `scripts/multi-format.ts` for the conversion rules. +The Claude manifest is the source of truth — author plugins there. Codex, +Antigravity, and Cursor artifacts are generated by `bun scripts/cli.ts multi-format` +and should not be hand-edited. See `scripts/multi-format.ts` for the conversion rules. After modifying a plugin's Claude manifest or adding a new local plugin, run: @@ -91,9 +92,9 @@ After modifying a plugin's Claude manifest or adding a new local plugin, run: bun scripts/cli.ts multi-format ``` -Codex marketplace is auto-generated at `.agents/plugins/marketplace.json` from -the Claude marketplace; only the local plugins (`source: "./plugins/..."`) are -included. +Codex marketplace is auto-generated at `.agents/plugins/marketplace.json` and the +Cursor marketplace at `.cursor-plugin/marketplace.json`, both from the Claude +marketplace; only the local plugins (`source: "./plugins/..."`) are included. **3. MCP Servers** - Node.js-based servers using `@modelcontextprotocol/sdk` diff --git a/plugins/agent-browser/.cursor-plugin/plugin.json b/plugins/agent-browser/.cursor-plugin/plugin.json new file mode 100644 index 00000000..749d204b --- /dev/null +++ b/plugins/agent-browser/.cursor-plugin/plugin.json @@ -0,0 +1,22 @@ +{ + "name": "agent-browser", + "displayName": "Agent Browser", + "description": "Browser and desktop app automation for AI agents — web browsing, Electron app control, Slack automation, and QA testing workflows", + "version": "1.2.2", + "author": { + "name": "Vercel Labs" + }, + "category": "Browser", + "repository": "https://github.com/vercel-labs/agent-browser", + "license": "Apache-2.0", + "keywords": [ + "agent-browser", + "browser", + "automation", + "agents" + ], + "tags": [ + "browser", + "automation" + ] +} diff --git a/plugins/ai-sdk/.cursor-plugin/plugin.json b/plugins/ai-sdk/.cursor-plugin/plugin.json new file mode 100644 index 00000000..7b12e042 --- /dev/null +++ b/plugins/ai-sdk/.cursor-plugin/plugin.json @@ -0,0 +1,23 @@ +{ + "name": "ai-sdk", + "displayName": "Ai Sdk", + "description": "The AI Toolkit for TypeScript - official agent skills for building AI-powered applications and agents with Vercel AI SDK", + "version": "1.2.2", + "author": { + "name": "Vercel" + }, + "category": "AI", + "repository": "https://github.com/vercel/ai", + "license": "Apache-2.0", + "keywords": [ + "ai-sdk", + "vercel", + "ai", + "typescript", + "llm" + ], + "tags": [ + "framework", + "ai" + ] +} diff --git a/plugins/antfu/.cursor-plugin/plugin.json b/plugins/antfu/.cursor-plugin/plugin.json new file mode 100644 index 00000000..d1581953 --- /dev/null +++ b/plugins/antfu/.cursor-plugin/plugin.json @@ -0,0 +1,23 @@ +{ + "name": "antfu", + "displayName": "Antfu", + "description": "Anthony Fu's opinionated tooling and conventions for JavaScript/TypeScript projects", + "version": "1.1.2", + "author": { + "name": "Anthony Fu" + }, + "category": "Framework", + "homepage": "https://github.com/antfu/skills/tree/main/skills/antfu", + "repository": "https://github.com/antfu/skills", + "license": "MIT", + "keywords": [ + "antfu", + "conventions", + "eslint", + "typescript" + ], + "tags": [ + "tooling", + "conventions" + ] +} diff --git a/plugins/ast-grep/.cursor-plugin/plugin.json b/plugins/ast-grep/.cursor-plugin/plugin.json new file mode 100644 index 00000000..5ba89d61 --- /dev/null +++ b/plugins/ast-grep/.cursor-plugin/plugin.json @@ -0,0 +1,25 @@ +{ + "name": "ast-grep", + "displayName": "Ast Grep", + "description": "Guide for writing ast-grep rules to perform structural code search and analysis. Use when users need to search codebases using Abstract Syntax Tree (AST) patterns, find specific code structures, or perform complex code queries that go beyond simple text search.", + "version": "1.2.1", + "author": { + "name": "Herrington Darkholme" + }, + "category": "Development", + "homepage": "https://github.com/ast-grep/agent-skill", + "repository": "https://github.com/ast-grep/agent-skill", + "license": "MIT", + "keywords": [ + "ast-grep", + "code-search", + "ast", + "structural-search", + "pattern-matching", + "refactoring" + ], + "tags": [ + "tooling", + "search" + ] +} diff --git a/plugins/astro/.cursor-plugin/plugin.json b/plugins/astro/.cursor-plugin/plugin.json new file mode 100644 index 00000000..aead47b2 --- /dev/null +++ b/plugins/astro/.cursor-plugin/plugin.json @@ -0,0 +1,30 @@ +{ + "name": "astro", + "displayName": "Astro", + "description": "Access Astro's official documentation through the Astro Docs MCP server.", + "version": "1.1.0", + "author": { + "name": "Astro" + }, + "category": "Framework", + "homepage": "https://astro.build", + "repository": "https://github.com/withastro/docs", + "license": "MIT", + "keywords": [ + "astro", + "docs", + "documentation", + "ssg", + "web-framework" + ], + "tags": [ + "mcp", + "docs" + ], + "mcpServers": { + "astro-docs": { + "type": "http", + "url": "https://mcp.docs.astro.build/mcp" + } + } +} diff --git a/plugins/axi/.cursor-plugin/plugin.json b/plugins/axi/.cursor-plugin/plugin.json new file mode 100644 index 00000000..bc1c003a --- /dev/null +++ b/plugins/axi/.cursor-plugin/plugin.json @@ -0,0 +1,14 @@ +{ + "name": "axi", + "displayName": "Axi", + "description": "Agent eXperience Interface (AXI) — ergonomic standards for building CLI tools that agents use via shell execution. Use when building, modifying, or reviewing any agent-facing CLI.", + "version": "1.1.0", + "author": { + "name": "Community" + }, + "category": "Productivity", + "license": "MIT", + "keywords": [ + "axi" + ] +} diff --git a/plugins/better-auth/.cursor-plugin/plugin.json b/plugins/better-auth/.cursor-plugin/plugin.json new file mode 100644 index 00000000..8b36d1da --- /dev/null +++ b/plugins/better-auth/.cursor-plugin/plugin.json @@ -0,0 +1,22 @@ +{ + "name": "better-auth", + "displayName": "Better Auth", + "description": "Better Auth authentication framework skills for JavaScript/TypeScript projects", + "version": "1.5.3", + "author": { + "name": "Better Auth" + }, + "category": "Development", + "repository": "https://github.com/better-auth/skills", + "license": "MIT", + "keywords": [ + "better-auth", + "authentication", + "auth", + "typescript" + ], + "tags": [ + "framework", + "auth" + ] +} diff --git a/plugins/bun/.cursor-plugin/plugin.json b/plugins/bun/.cursor-plugin/plugin.json new file mode 100644 index 00000000..7004258d --- /dev/null +++ b/plugins/bun/.cursor-plugin/plugin.json @@ -0,0 +1,26 @@ +{ + "name": "bun", + "displayName": "Bun", + "description": "All-in-one JavaScript/TypeScript toolkit: fast runtime, package manager, test runner, and bundler. Use when running bun commands, calling Bun.* APIs, or working with bun.lock projects.", + "version": "1.3.0", + "author": { + "name": "Bun" + }, + "category": "Development", + "homepage": "https://bun.com", + "repository": "https://github.com/oven-sh/bun", + "license": "MIT", + "keywords": [ + "bun", + "runtime", + "package-manager", + "test-runner", + "bundler", + "javascript", + "typescript" + ], + "tags": [ + "runtime", + "tooling" + ] +} diff --git a/plugins/chat-sdk/.cursor-plugin/plugin.json b/plugins/chat-sdk/.cursor-plugin/plugin.json new file mode 100644 index 00000000..a630b323 --- /dev/null +++ b/plugins/chat-sdk/.cursor-plugin/plugin.json @@ -0,0 +1,22 @@ +{ + "name": "chat-sdk", + "displayName": "Chat Sdk", + "description": "Build multi-platform chat bots with Chat SDK — unified TypeScript SDK for Slack, Teams, Google Chat, Discord, GitHub, and Linear", + "version": "1.1.3", + "author": { + "name": "Vercel" + }, + "category": "Development", + "license": "MIT", + "keywords": [ + "chat-sdk", + "chatbot", + "slack", + "teams", + "discord" + ], + "tags": [ + "framework", + "chatbot" + ] +} diff --git a/plugins/claude-md-management/.cursor-plugin/plugin.json b/plugins/claude-md-management/.cursor-plugin/plugin.json new file mode 100644 index 00000000..8894ee50 --- /dev/null +++ b/plugins/claude-md-management/.cursor-plugin/plugin.json @@ -0,0 +1,14 @@ +{ + "name": "claude-md-management", + "displayName": "Claude Md Management", + "description": "Tools to maintain and improve CLAUDE.md files - audit quality, capture session learnings, and keep project memory current.", + "version": "1.0.0", + "author": { + "name": "Anthropic" + }, + "category": "Tooling", + "tags": [ + "tooling", + "maintenance" + ] +} diff --git a/plugins/codegraph/.cursor-plugin/plugin.json b/plugins/codegraph/.cursor-plugin/plugin.json new file mode 100644 index 00000000..a3526be8 --- /dev/null +++ b/plugins/codegraph/.cursor-plugin/plugin.json @@ -0,0 +1,36 @@ +{ + "name": "codegraph", + "displayName": "Codegraph", + "description": "Local-first code intelligence for AI agents (MCP) - query a pre-indexed knowledge graph of symbols, call graphs, and code structure instead of scanning files", + "version": "1.0.1", + "author": { + "name": "Colby McHenry" + }, + "category": "Development", + "homepage": "https://github.com/colbymchenry/codegraph", + "repository": "https://github.com/colbymchenry/codegraph", + "license": "MIT", + "keywords": [ + "code-intelligence", + "knowledge-graph", + "code-navigation", + "semantic-search", + "local-first" + ], + "tags": [ + "mcp", + "code-intelligence" + ], + "mcpServers": { + "codegraph": { + "type": "stdio", + "command": "npx", + "args": [ + "-y", + "@colbymchenry/codegraph", + "serve", + "--mcp" + ] + } + } +} diff --git a/plugins/cubic/.cursor-plugin/plugin.json b/plugins/cubic/.cursor-plugin/plugin.json new file mode 100644 index 00000000..3c418b75 --- /dev/null +++ b/plugins/cubic/.cursor-plugin/plugin.json @@ -0,0 +1,25 @@ +{ + "name": "cubic", + "displayName": "Cubic", + "description": "AI-powered code review using Cubic CLI. Detects bugs, security vulnerabilities, and style issues before commits.", + "version": "1.0.0", + "author": { + "name": "Minsu Lee" + }, + "category": "Development", + "homepage": "https://cubic.dev", + "repository": "https://github.com/pleaseai/claude-code-plugins", + "license": "MIT", + "keywords": [ + "code-review", + "ai-review", + "cubic", + "linting", + "security", + "bugs" + ], + "tags": [ + "review", + "analysis" + ] +} diff --git a/plugins/dev3000/.cursor-plugin/plugin.json b/plugins/dev3000/.cursor-plugin/plugin.json new file mode 100644 index 00000000..bd2c9e9f --- /dev/null +++ b/plugins/dev3000/.cursor-plugin/plugin.json @@ -0,0 +1,25 @@ +{ + "name": "dev3000", + "displayName": "Dev3000", + "description": "dev3000 (d3k) debugging assistant — captures server logs, browser events, console messages, network requests, and screenshots into a unified, timestamped timeline for AI debugging. Bootstraps d3k as the dev runtime and drives its monitored browser instead of running npm/bun dev directly.", + "version": "1.1.0", + "author": { + "name": "Vercel Labs" + }, + "category": "Tooling", + "homepage": "https://github.com/vercel-labs/dev3000", + "repository": "https://github.com/vercel-labs/dev3000", + "license": "MIT", + "keywords": [ + "dev3000", + "d3k", + "debugging", + "web", + "logs", + "screenshots" + ], + "tags": [ + "skills", + "vercel" + ] +} diff --git a/plugins/docus/.cursor-plugin/plugin.json b/plugins/docus/.cursor-plugin/plugin.json new file mode 100644 index 00000000..ce1bdd1f --- /dev/null +++ b/plugins/docus/.cursor-plugin/plugin.json @@ -0,0 +1,30 @@ +{ + "name": "docus", + "displayName": "Docus", + "description": "Write beautiful documentations with Nuxt and Markdown.", + "version": "1.1.2", + "author": { + "name": "Nuxt" + }, + "category": "Framework", + "homepage": "https://docus.dev", + "repository": "https://github.com/nuxt-content/docus", + "license": "MIT", + "keywords": [ + "docus", + "nuxt", + "documentation", + "markdown", + "nuxt-content" + ], + "tags": [ + "framework", + "docs" + ], + "mcpServers": { + "docus": { + "type": "http", + "url": "https://docus.dev/mcp" + } + } +} diff --git a/plugins/edgeparse/.cursor-plugin/plugin.json b/plugins/edgeparse/.cursor-plugin/plugin.json new file mode 100644 index 00000000..8ce01999 --- /dev/null +++ b/plugins/edgeparse/.cursor-plugin/plugin.json @@ -0,0 +1,24 @@ +{ + "name": "edgeparse", + "displayName": "Edgeparse", + "description": "Extract structured content from any PDF — headings, tables, paragraphs, lists, bounding boxes — deterministically, without ML dependencies or GPU requirements", + "version": "1.1.0", + "author": { + "name": "Raphael Mansuy" + }, + "category": "Document", + "homepage": "https://github.com/raphaelmansuy/edgeparse", + "repository": "https://github.com/raphaelmansuy/edgeparse", + "license": "Apache-2.0", + "keywords": [ + "pdf", + "extraction", + "parsing", + "markdown", + "rag" + ], + "tags": [ + "skill", + "document" + ] +} diff --git a/plugins/emulate/.cursor-plugin/plugin.json b/plugins/emulate/.cursor-plugin/plugin.json new file mode 100644 index 00000000..3099e41d --- /dev/null +++ b/plugins/emulate/.cursor-plugin/plugin.json @@ -0,0 +1,21 @@ +{ + "name": "emulate", + "displayName": "Emulate", + "description": "Local drop-in API emulator for Vercel, GitHub, Google, Slack, Apple, Microsoft, AWS, Linear, Stripe, Resend, and Next.js", + "version": "1.2.0", + "author": { + "name": "Community" + }, + "category": "Development", + "license": "Apache-2.0", + "keywords": [ + "emulate", + "api-emulation", + "local-development", + "testing" + ], + "tags": [ + "tooling", + "testing" + ] +} diff --git a/plugins/eve/.cursor-plugin/plugin.json b/plugins/eve/.cursor-plugin/plugin.json new file mode 100644 index 00000000..55d660f2 --- /dev/null +++ b/plugins/eve/.cursor-plugin/plugin.json @@ -0,0 +1,25 @@ +{ + "name": "eve", + "displayName": "Eve", + "description": "Build durable backend AI agents with the eve framework. Use when creating, editing, or debugging an eve project — agent instructions, skills, tools, connections, channels, sandboxes, subagents, schedules, or evals.", + "version": "1.1.1", + "author": { + "name": "Vercel Inc." + }, + "category": "Tooling", + "homepage": "https://github.com/vercel/eve", + "repository": "https://github.com/vercel/eve", + "license": "Apache-2.0", + "keywords": [ + "eve", + "agents", + "ai-agents", + "backend", + "vercel", + "framework" + ], + "tags": [ + "skills", + "vercel" + ] +} diff --git a/plugins/fetch/.cursor-plugin/plugin.json b/plugins/fetch/.cursor-plugin/plugin.json new file mode 100644 index 00000000..ad0844b7 --- /dev/null +++ b/plugins/fetch/.cursor-plugin/plugin.json @@ -0,0 +1,33 @@ +{ + "name": "fetch", + "displayName": "Fetch", + "description": "Fetch web content in multiple formats - HTML, JSON, plain text, Markdown, readable articles, and YouTube transcripts", + "version": "1.1.0", + "author": { + "name": "fetch-mcp project" + }, + "category": "Tooling", + "homepage": "https://github.com/zcaceres/fetch-mcp", + "license": "MIT", + "keywords": [ + "fetch", + "web", + "html", + "markdown", + "youtube", + "mcp" + ], + "tags": [ + "mcp", + "web" + ], + "mcpServers": { + "fetch": { + "command": "npx", + "args": [ + "-y", + "mcp-fetch-server" + ] + } + } +} diff --git a/plugins/gatekeeper/.cursor-plugin/plugin.json b/plugins/gatekeeper/.cursor-plugin/plugin.json new file mode 100644 index 00000000..1dde82de --- /dev/null +++ b/plugins/gatekeeper/.cursor-plugin/plugin.json @@ -0,0 +1,22 @@ +{ + "name": "gatekeeper", + "displayName": "Gatekeeper", + "description": "Two-layer security for Claude Code: auto-approve safe commands, AI-assisted review for the rest", + "version": "1.5.0", + "author": { + "name": "Minsu Lee" + }, + "category": "Tooling", + "repository": "https://github.com/pleaseai/claude-code-plugins", + "license": "MIT", + "keywords": [ + "security", + "permissions", + "gatekeeper", + "hook" + ], + "tags": [ + "tooling", + "safety" + ] +} diff --git a/plugins/git-ai/.cursor-plugin/plugin.json b/plugins/git-ai/.cursor-plugin/plugin.json new file mode 100644 index 00000000..4fd15318 --- /dev/null +++ b/plugins/git-ai/.cursor-plugin/plugin.json @@ -0,0 +1,21 @@ +{ + "name": "git-ai", + "displayName": "Git Ai", + "description": "A Git extension for tracking the AI-generated code in your repos", + "version": "1.1.1", + "author": { + "name": "Community" + }, + "category": "Development", + "license": "Apache-2.0", + "keywords": [ + "git-ai", + "git", + "ai", + "code-tracking" + ], + "tags": [ + "tooling", + "git" + ] +} diff --git a/plugins/google-workspace/.cursor-plugin/plugin.json b/plugins/google-workspace/.cursor-plugin/plugin.json new file mode 100644 index 00000000..b3ede39b --- /dev/null +++ b/plugins/google-workspace/.cursor-plugin/plugin.json @@ -0,0 +1,25 @@ +{ + "name": "google-workspace", + "displayName": "Google Workspace", + "description": "CLI tool for managing Google Workspace resources dynamically using Discovery APIs.", + "version": "1.3.0", + "author": { + "name": "googleworkspace" + }, + "category": "Productivity", + "homepage": "https://github.com/googleworkspace/cli", + "repository": "https://github.com/googleworkspace/cli", + "license": "Apache-2.0", + "keywords": [ + "google-workspace", + "gmail", + "drive", + "calendar", + "docs", + "sheets" + ], + "tags": [ + "google", + "workspace" + ] +} diff --git a/plugins/graphify/.cursor-plugin/plugin.json b/plugins/graphify/.cursor-plugin/plugin.json new file mode 100644 index 00000000..ab4e0fc8 --- /dev/null +++ b/plugins/graphify/.cursor-plugin/plugin.json @@ -0,0 +1,28 @@ +{ + "name": "graphify", + "displayName": "Graphify", + "description": "Turn any folder of code, docs, papers, images, or videos into a queryable knowledge graph with community detection, query/path/explain tools, and an honest audit trail", + "version": "1.0.0", + "author": { + "name": "Safi Shamsi" + }, + "category": "Tooling", + "homepage": "https://github.com/safishamsi/graphify", + "repository": "https://github.com/safishamsi/graphify", + "license": "MIT", + "keywords": [ + "graphify", + "knowledge-graph", + "graphrag", + "codebase", + "code-understanding", + "ast", + "community-detection", + "obsidian", + "neo4j" + ], + "tags": [ + "skills", + "knowledge-graph" + ] +} diff --git a/plugins/graphite/.cursor-plugin/plugin.json b/plugins/graphite/.cursor-plugin/plugin.json new file mode 100644 index 00000000..2da3942d --- /dev/null +++ b/plugins/graphite/.cursor-plugin/plugin.json @@ -0,0 +1,28 @@ +{ + "name": "graphite", + "displayName": "Graphite", + "description": "Stacked PR workflow with the Graphite CLI (gt) — create stacks, submit, sync, restack, split/squash/fold, track existing branches, and collaborate on shared stacks", + "version": "2.2.0", + "author": { + "name": "Graphite" + }, + "category": "Development", + "homepage": "https://graphite.com/docs", + "repository": "https://github.com/pleaseai/claude-code-plugins", + "license": "MIT", + "keywords": [ + "graphite", + "gt", + "stacked-prs", + "stacking", + "git", + "github", + "pull-request", + "code-review" + ], + "tags": [ + "tooling", + "git", + "github" + ] +} diff --git a/plugins/java-development/.cursor-plugin/plugin.json b/plugins/java-development/.cursor-plugin/plugin.json new file mode 100644 index 00000000..a2ab1e42 --- /dev/null +++ b/plugins/java-development/.cursor-plugin/plugin.json @@ -0,0 +1,25 @@ +{ + "name": "java-development", + "displayName": "Java Development", + "description": "Comprehensive collection of prompts and instructions for Java development including Spring Boot, Quarkus, testing, documentation, and best practices.", + "version": "1.0.0", + "author": { + "name": "Awesome Copilot Community" + }, + "category": "Language", + "homepage": "https://github.com/github/awesome-copilot/tree/main/plugins/java-development", + "repository": "https://github.com/github/awesome-copilot", + "license": "MIT", + "keywords": [ + "java", + "springboot", + "quarkus", + "jpa", + "junit", + "javadoc" + ], + "tags": [ + "language", + "skills" + ] +} diff --git a/plugins/lavish/.cursor-plugin/plugin.json b/plugins/lavish/.cursor-plugin/plugin.json new file mode 100644 index 00000000..62bd6c18 --- /dev/null +++ b/plugins/lavish/.cursor-plugin/plugin.json @@ -0,0 +1,23 @@ +{ + "name": "lavish", + "displayName": "Lavish", + "description": "Turn complex or visual agent responses into rich, reviewable HTML artifacts the user can annotate and send feedback on, using the lavish-axi CLI. Use when about to give a plan, comparison, diagram, table, code diff, report, or anything easier to grasp visually than as prose.", + "version": "1.1.0", + "author": { + "name": "Kun Chen" + }, + "category": "Tooling", + "homepage": "https://github.com/kunchenguid/lavish-axi", + "repository": "https://github.com/kunchenguid/lavish-axi", + "license": "MIT", + "keywords": [ + "lavish", + "html", + "artifacts", + "review", + "visualization" + ], + "tags": [ + "skills" + ] +} diff --git a/plugins/markitdown/.cursor-plugin/plugin.json b/plugins/markitdown/.cursor-plugin/plugin.json new file mode 100644 index 00000000..834a87f3 --- /dev/null +++ b/plugins/markitdown/.cursor-plugin/plugin.json @@ -0,0 +1,34 @@ +{ + "name": "markitdown", + "displayName": "MarkItDown", + "description": "Convert documents (PDF, DOCX, PPTX, images, etc.) to Markdown using MarkItDown MCP server", + "version": "1.5.0", + "author": { + "name": "Microsoft" + }, + "category": "Tooling", + "homepage": "https://github.com/microsoft/markitdown", + "repository": "https://github.com/microsoft/markitdown", + "license": "MIT", + "keywords": [ + "markitdown", + "pdf", + "docx", + "pptx", + "images", + "markdown", + "conversion" + ], + "tags": [ + "mcp", + "conversion" + ], + "mcpServers": { + "markitdown": { + "command": "uvx", + "args": [ + "markitdown-mcp" + ] + } + } +} diff --git a/plugins/mastra/.cursor-plugin/plugin.json b/plugins/mastra/.cursor-plugin/plugin.json new file mode 100644 index 00000000..0d9a4753 --- /dev/null +++ b/plugins/mastra/.cursor-plugin/plugin.json @@ -0,0 +1,32 @@ +{ + "name": "mastra", + "displayName": "Mastra", + "description": "Official agent skills for coding agents working with the Mastra AI framework", + "version": "1.6.2", + "author": { + "name": "Mastra AI" + }, + "category": "AI", + "repository": "https://github.com/mastra-ai/skills", + "license": "Apache-2.0", + "keywords": [ + "mastra", + "ai", + "framework", + "agent" + ], + "tags": [ + "framework", + "ai" + ], + "mcpServers": { + "mastra": { + "type": "stdio", + "command": "npx", + "args": [ + "-y", + "@mastra/mcp-docs-server@latest" + ] + } + } +} diff --git a/plugins/mcp-dev/.cursor-plugin/plugin.json b/plugins/mcp-dev/.cursor-plugin/plugin.json new file mode 100644 index 00000000..41477b83 --- /dev/null +++ b/plugins/mcp-dev/.cursor-plugin/plugin.json @@ -0,0 +1,25 @@ +{ + "name": "mcp-dev", + "displayName": "MCP Dev", + "description": "Guide for creating high-quality MCP servers with best practices, TypeScript/Python patterns, and evaluation tools", + "version": "1.0.0", + "author": { + "name": "Anthropic" + }, + "category": "Tooling", + "homepage": "https://github.com/anthropics/skills/tree/main/skills/mcp-builder", + "repository": "https://github.com/anthropics/skills", + "license": "Apache-2.0", + "keywords": [ + "mcp", + "model-context-protocol", + "mcp-server", + "typescript", + "python", + "fastmcp" + ], + "tags": [ + "tooling", + "mcp" + ] +} diff --git a/plugins/neo4j/.cursor-plugin/plugin.json b/plugins/neo4j/.cursor-plugin/plugin.json new file mode 100644 index 00000000..f4392f8a --- /dev/null +++ b/plugins/neo4j/.cursor-plugin/plugin.json @@ -0,0 +1,40 @@ +{ + "name": "mcp-neo4j", + "displayName": "MCP Neo4j", + "description": "Neo4j MCP servers for graph database operations, memory management, Aura cloud management, and data modeling", + "version": "1.1.0", + "author": { + "name": "Community" + }, + "category": "Database", + "tags": [ + "mcp", + "database" + ], + "mcpServers": { + "mcp-neo4j-cloud-aura-api": { + "command": "uvx", + "args": [ + "mcp-neo4j-aura-manager" + ] + }, + "mcp-neo4j-cypher": { + "command": "uvx", + "args": [ + "mcp-neo4j-cypher" + ] + }, + "mcp-neo4j-data-modeling": { + "command": "uvx", + "args": [ + "mcp-neo4j-data-modeling" + ] + }, + "mcp-neo4j-memory": { + "command": "uvx", + "args": [ + "mcp-neo4j-memory" + ] + } + } +} diff --git a/plugins/next/.cursor-plugin/plugin.json b/plugins/next/.cursor-plugin/plugin.json new file mode 100644 index 00000000..5feb83db --- /dev/null +++ b/plugins/next/.cursor-plugin/plugin.json @@ -0,0 +1,22 @@ +{ + "name": "next", + "displayName": "Next", + "description": "Next.js best practices, caching patterns, and upgrade guidance", + "version": "1.1.1", + "author": { + "name": "Vercel" + }, + "category": "Framework", + "license": "NOASSERTION", + "keywords": [ + "next", + "nextjs", + "react", + "ssr", + "rsc" + ], + "tags": [ + "framework", + "react" + ] +} diff --git a/plugins/nostics/.cursor-plugin/plugin.json b/plugins/nostics/.cursor-plugin/plugin.json new file mode 100644 index 00000000..bdbc3e14 --- /dev/null +++ b/plugins/nostics/.cursor-plugin/plugin.json @@ -0,0 +1,23 @@ +{ + "name": "nostics", + "displayName": "Nostics", + "description": "Structured diagnostic code library for JavaScript/TypeScript. Turns errors into typed, machine-readable Diagnostic instances with stable codes, docs URLs, and actionable fixes. Covers defineDiagnostics, reporters, formatters, Vite plugins, and adding new diagnostic codes.", + "version": "1.1.0", + "author": { + "name": "vercel-labs" + }, + "category": "Tooling", + "repository": "https://github.com/vercel-labs/nostics", + "license": "MIT", + "keywords": [ + "nostics", + "diagnostics", + "error-handling", + "typescript", + "javascript" + ], + "tags": [ + "skills", + "vercel" + ] +} diff --git a/plugins/nuxt-i18n/.cursor-plugin/plugin.json b/plugins/nuxt-i18n/.cursor-plugin/plugin.json new file mode 100644 index 00000000..82de4d32 --- /dev/null +++ b/plugins/nuxt-i18n/.cursor-plugin/plugin.json @@ -0,0 +1,24 @@ +{ + "name": "nuxt-i18n", + "displayName": "Nuxt I18n", + "description": "Nuxt i18n internationalization module for locale routing, lazy-loaded translations, SEO, browser detection, and multi-domain setups. Use when working with @nuxtjs/i18n, locale switching, translated routes, or i18n composables.", + "version": "1.3.0", + "author": { + "name": "Nuxt Community" + }, + "category": "Framework", + "homepage": "https://i18n.nuxtjs.org", + "repository": "https://github.com/nuxt-modules/i18n", + "license": "MIT", + "keywords": [ + "nuxt", + "i18n", + "internationalization", + "vue-i18n", + "localization" + ], + "tags": [ + "framework", + "vue" + ] +} diff --git a/plugins/nuxt-seo/.cursor-plugin/plugin.json b/plugins/nuxt-seo/.cursor-plugin/plugin.json new file mode 100644 index 00000000..83e1f562 --- /dev/null +++ b/plugins/nuxt-seo/.cursor-plugin/plugin.json @@ -0,0 +1,24 @@ +{ + "name": "nuxt-seo", + "displayName": "Nuxt Seo", + "description": "Nuxt SEO meta-module with robots, sitemap, og-image, schema-org. Use when configuring SEO, generating sitemaps, creating OG images, or adding structured data.", + "version": "1.1.1", + "author": { + "name": "Community" + }, + "category": "Framework", + "license": "MIT", + "keywords": [ + "nuxt-seo", + "nuxt", + "seo", + "sitemap", + "og-image", + "schema-org" + ], + "tags": [ + "framework", + "vue", + "seo" + ] +} diff --git a/plugins/nuxt-ui/.cursor-plugin/plugin.json b/plugins/nuxt-ui/.cursor-plugin/plugin.json new file mode 100644 index 00000000..8b428522 --- /dev/null +++ b/plugins/nuxt-ui/.cursor-plugin/plugin.json @@ -0,0 +1,28 @@ +{ + "name": "nuxt-ui", + "displayName": "Nuxt Ui", + "description": "The Intuitive Vue UI Library powered by Reka UI & Tailwind CSS.", + "version": "1.5.0", + "author": { + "name": "Nuxt" + }, + "category": "UI", + "repository": "https://github.com/nuxt/ui", + "license": "MIT", + "keywords": [ + "nuxt-ui", + "vue", + "ui", + "tailwind", + "reka-ui" + ], + "tags": [ + "ui" + ], + "mcpServers": { + "nuxt-ui": { + "type": "http", + "url": "https://ui.nuxt.com/mcp" + } + } +} diff --git a/plugins/nuxt/.cursor-plugin/plugin.json b/plugins/nuxt/.cursor-plugin/plugin.json new file mode 100644 index 00000000..de882121 --- /dev/null +++ b/plugins/nuxt/.cursor-plugin/plugin.json @@ -0,0 +1,29 @@ +{ + "name": "nuxt", + "displayName": "Nuxt", + "description": "Nuxt full-stack Vue framework with SSR, auto-imports, and file-based routing. Use when working with Nuxt apps, server routes, useFetch, middleware, or hybrid rendering.", + "version": "1.2.1", + "author": { + "name": "Anthony Fu" + }, + "category": "Framework", + "homepage": "https://github.com/antfu/skills/tree/main/skills/nuxt", + "repository": "https://github.com/antfu/skills", + "license": "MIT", + "keywords": [ + "nuxt", + "vue", + "ssr", + "antfu" + ], + "tags": [ + "framework", + "vue" + ], + "mcpServers": { + "nuxt-remote": { + "type": "http", + "url": "https://nuxt.com/mcp" + } + } +} diff --git a/plugins/pinia/.cursor-plugin/plugin.json b/plugins/pinia/.cursor-plugin/plugin.json new file mode 100644 index 00000000..8f2a4232 --- /dev/null +++ b/plugins/pinia/.cursor-plugin/plugin.json @@ -0,0 +1,23 @@ +{ + "name": "pinia", + "displayName": "Pinia", + "description": "Pinia official Vue state management library, type-safe and extensible. Use when defining stores, working with state/getters/actions, or implementing store patterns in Vue apps.", + "version": "1.1.1", + "author": { + "name": "Anthony Fu" + }, + "category": "Framework", + "homepage": "https://github.com/antfu/skills/tree/main/skills/pinia", + "repository": "https://github.com/antfu/skills", + "license": "MIT", + "keywords": [ + "pinia", + "vue", + "state-management", + "antfu" + ], + "tags": [ + "framework", + "vue" + ] +} diff --git a/plugins/playwright-cli/.cursor-plugin/plugin.json b/plugins/playwright-cli/.cursor-plugin/plugin.json new file mode 100644 index 00000000..dda65f3d --- /dev/null +++ b/plugins/playwright-cli/.cursor-plugin/plugin.json @@ -0,0 +1,26 @@ +{ + "name": "playwright-cli", + "displayName": "Playwright Cli", + "description": "Token-efficient browser automation CLI for coding agents - navigate, interact, screenshot, and test web apps", + "version": "0.1.1", + "author": { + "name": "Microsoft" + }, + "category": "Development", + "homepage": "https://github.com/microsoft/playwright-cli", + "repository": "https://github.com/pleaseai/playwright-cli", + "license": "Apache-2.0", + "keywords": [ + "playwright", + "browser", + "automation", + "testing", + "e2e", + "screenshot", + "web" + ], + "tags": [ + "tooling", + "testing" + ] +} diff --git a/plugins/please-plugins/.cursor-plugin/plugin.json b/plugins/please-plugins/.cursor-plugin/plugin.json new file mode 100644 index 00000000..f9604c13 --- /dev/null +++ b/plugins/please-plugins/.cursor-plugin/plugin.json @@ -0,0 +1,24 @@ +{ + "name": "please-plugins", + "displayName": "Please Plugins", + "description": "Auto-detect project dependencies and recommend matching Claude Code plugins from the pleaseai marketplace", + "version": "1.6.0", + "author": { + "name": "Passion Factory" + }, + "category": "Tooling", + "homepage": "https://github.com/pleaseai/claude-code-plugins", + "repository": "https://github.com/pleaseai/claude-code-plugins", + "license": "MIT", + "keywords": [ + "please-plugins", + "discovery", + "marketplace", + "auto-detect", + "setup" + ], + "tags": [ + "tooling", + "discovery" + ] +} diff --git a/plugins/plugin-dev/.cursor-plugin/plugin.json b/plugins/plugin-dev/.cursor-plugin/plugin.json new file mode 100644 index 00000000..b79fc33e --- /dev/null +++ b/plugins/plugin-dev/.cursor-plugin/plugin.json @@ -0,0 +1,25 @@ +{ + "name": "plugin-dev", + "displayName": "Plugin Dev", + "description": "Best practices, guidelines, and validation tools for Claude Code plugin development", + "version": "1.0.0", + "author": { + "name": "Passion Factory" + }, + "category": "Tooling", + "homepage": "https://github.com/pleaseai/claude-code-plugins/tree/main/plugins/plugin-dev", + "repository": "https://github.com/pleaseai/claude-code-plugins", + "license": "MIT", + "keywords": [ + "plugin", + "development", + "best-practices", + "validation", + "guidelines", + "scaffold" + ], + "tags": [ + "tooling", + "plugin" + ] +} diff --git a/plugins/pnpm/.cursor-plugin/plugin.json b/plugins/pnpm/.cursor-plugin/plugin.json new file mode 100644 index 00000000..78feb42e --- /dev/null +++ b/plugins/pnpm/.cursor-plugin/plugin.json @@ -0,0 +1,23 @@ +{ + "name": "pnpm", + "displayName": "Pnpm", + "description": "Node.js package manager with strict dependency resolution. Use when running pnpm specific commands, configuring workspaces, or managing dependencies with catalogs, patches, or overrides.", + "version": "1.1.1", + "author": { + "name": "Anthony Fu" + }, + "category": "Tooling", + "homepage": "https://github.com/antfu/skills/tree/main/skills/pnpm", + "repository": "https://github.com/antfu/skills", + "license": "MIT", + "keywords": [ + "pnpm", + "package-manager", + "monorepo", + "antfu" + ], + "tags": [ + "tooling", + "node" + ] +} diff --git a/plugins/port/.cursor-plugin/plugin.json b/plugins/port/.cursor-plugin/plugin.json new file mode 100644 index 00000000..b8d765c2 --- /dev/null +++ b/plugins/port/.cursor-plugin/plugin.json @@ -0,0 +1,38 @@ +{ + "name": "port", + "displayName": "Port", + "description": "Port.io Internal Developer Portal integration. Manage your entire SDLC — blueprints, entities, scorecards, self-service actions, incidents, and DevOps requests — via the Port MCP server. Supports both US and EU regions.", + "version": "1.0.0", + "author": { + "name": "Port" + }, + "category": "Tooling", + "homepage": "https://www.port.io", + "repository": "https://github.com/port-labs/port-mcp-server", + "license": "MIT", + "keywords": [ + "port", + "port.io", + "idp", + "internal-developer-portal", + "platform-engineering", + "sdlc", + "devops", + "scorecards", + "mcp" + ], + "tags": [ + "mcp", + "platform" + ], + "mcpServers": { + "port-us": { + "type": "http", + "url": "https://mcp.us.port.io/v1" + }, + "port-eu": { + "type": "http", + "url": "https://mcp.port.io/v1" + } + } +} diff --git a/plugins/portless/.cursor-plugin/plugin.json b/plugins/portless/.cursor-plugin/plugin.json new file mode 100644 index 00000000..f8d2ae88 --- /dev/null +++ b/plugins/portless/.cursor-plugin/plugin.json @@ -0,0 +1,21 @@ +{ + "name": "portless", + "displayName": "Portless", + "description": "Replace port numbers with stable, named local URLs. For humans and agents.", + "version": "1.1.2", + "author": { + "name": "Community" + }, + "category": "Development", + "license": "Apache-2.0", + "keywords": [ + "portless", + "localhost", + "dev-server", + "proxy" + ], + "tags": [ + "tooling", + "dev-server" + ] +} diff --git a/plugins/portone/.cursor-plugin/plugin.json b/plugins/portone/.cursor-plugin/plugin.json new file mode 100644 index 00000000..bbcfeb99 --- /dev/null +++ b/plugins/portone/.cursor-plugin/plugin.json @@ -0,0 +1,36 @@ +{ + "name": "portone", + "displayName": "Portone", + "description": "포트원(PortOne) 결제 연동 코드 생성 및 검토 플러그인. V1/V2 API를 지원하며, MCP 서버를 통해 최신 문서와 예시 코드를 활용합니다.", + "version": "1.2.0", + "author": { + "name": "PortOne" + }, + "category": "Development", + "homepage": "https://portone.io", + "repository": "https://github.com/portone-io/portone-cli", + "license": "MIT", + "keywords": [ + "portone", + "payment", + "pg", + "billing", + "결제", + "포트원", + "mcp" + ], + "tags": [ + "mcp", + "payment" + ], + "mcpServers": { + "portone": { + "type": "stdio", + "command": "npx", + "args": [ + "-y", + "@portone/mcp-server@latest" + ] + } + } +} diff --git a/plugins/prisma/.cursor-plugin/plugin.json b/plugins/prisma/.cursor-plugin/plugin.json new file mode 100644 index 00000000..eebe35d5 --- /dev/null +++ b/plugins/prisma/.cursor-plugin/plugin.json @@ -0,0 +1,33 @@ +{ + "name": "prisma", + "displayName": "Prisma", + "description": "Official agent skills for Prisma ORM - schema design, migrations, queries, and database workflows", + "version": "1.2.2", + "author": { + "name": "Prisma" + }, + "category": "Database", + "repository": "https://github.com/prisma/skills", + "license": "MIT", + "keywords": [ + "prisma", + "orm", + "database", + "typescript", + "migrations" + ], + "tags": [ + "database", + "orm" + ], + "mcpServers": { + "prisma": { + "command": "npx", + "args": [ + "-y", + "prisma", + "mcp" + ] + } + } +} diff --git a/plugins/react-native/.cursor-plugin/plugin.json b/plugins/react-native/.cursor-plugin/plugin.json new file mode 100644 index 00000000..8a903dc3 --- /dev/null +++ b/plugins/react-native/.cursor-plugin/plugin.json @@ -0,0 +1,21 @@ +{ + "name": "react-native", + "displayName": "React Native", + "description": "React Native and Expo best practices for building performant mobile apps", + "version": "1.1.1", + "author": { + "name": "Community" + }, + "category": "Mobile", + "license": "MIT", + "keywords": [ + "react-native", + "expo", + "mobile", + "performance" + ], + "tags": [ + "framework", + "mobile" + ] +} diff --git a/plugins/react/.cursor-plugin/plugin.json b/plugins/react/.cursor-plugin/plugin.json new file mode 100644 index 00000000..08a57fe3 --- /dev/null +++ b/plugins/react/.cursor-plugin/plugin.json @@ -0,0 +1,22 @@ +{ + "name": "react", + "displayName": "React", + "description": "React and Next.js best practices, view transitions, and composition patterns from Vercel Engineering", + "version": "1.1.1", + "author": { + "name": "Community" + }, + "category": "Framework", + "license": "MIT", + "keywords": [ + "react", + "nextjs", + "vercel", + "performance", + "view-transitions" + ], + "tags": [ + "framework", + "frontend" + ] +} diff --git a/plugins/rtk/.cursor-plugin/plugin.json b/plugins/rtk/.cursor-plugin/plugin.json new file mode 100644 index 00000000..ab5cc9c1 --- /dev/null +++ b/plugins/rtk/.cursor-plugin/plugin.json @@ -0,0 +1,23 @@ +{ + "name": "rtk", + "displayName": "Rtk", + "description": "Reduce LLM token consumption by 60-90% using RTK (Rust Token Killer) to filter and compress command outputs", + "version": "1.0.0", + "author": { + "name": "rtk-ai" + }, + "category": "Tooling", + "homepage": "https://github.com/rtk-ai/rtk", + "license": "MIT", + "keywords": [ + "rtk", + "token-optimization", + "performance", + "cli-proxy", + "compression" + ], + "tags": [ + "tooling", + "performance" + ] +} diff --git a/plugins/semble/.cursor-plugin/plugin.json b/plugins/semble/.cursor-plugin/plugin.json new file mode 100644 index 00000000..723b76b5 --- /dev/null +++ b/plugins/semble/.cursor-plugin/plugin.json @@ -0,0 +1,36 @@ +{ + "name": "semble", + "displayName": "Semble", + "description": "Semantic code search - find code by description or symbol name instead of grep, powered by the Semble MCP server", + "version": "0.1.0", + "author": { + "name": "Minish Lab" + }, + "category": "Development", + "homepage": "https://github.com/MinishLab/semble", + "repository": "https://github.com/MinishLab/semble", + "license": "MIT", + "keywords": [ + "semble", + "code-search", + "semantic-search", + "embeddings", + "grep", + "codebase" + ], + "tags": [ + "mcp", + "skill", + "search" + ], + "mcpServers": { + "semble": { + "command": "uvx", + "args": [ + "--from", + "semble[mcp]", + "semble" + ] + } + } +} diff --git a/plugins/skill-optimizer/.cursor-plugin/plugin.json b/plugins/skill-optimizer/.cursor-plugin/plugin.json new file mode 100644 index 00000000..478fdcc3 --- /dev/null +++ b/plugins/skill-optimizer/.cursor-plugin/plugin.json @@ -0,0 +1,22 @@ +{ + "name": "skill-optimizer", + "displayName": "Skill Optimizer", + "description": "Measure and improve how well a plugin's skills help agents solve real tasks. Runs activation evals (does the skill self-activate?) and content evals (does it help solve the task?), diagnoses gaps, fixes instructions, and re-runs until scores improve.", + "version": "1.1.0", + "author": { + "name": "tesslio" + }, + "category": "Tooling", + "repository": "https://github.com/tesslio/product-plugins", + "license": "NOASSERTION", + "keywords": [ + "skill-optimizer", + "skills", + "evals", + "optimization", + "benchmark" + ], + "tags": [ + "skills" + ] +} diff --git a/plugins/skillopt-sleep/.cursor-plugin/plugin.json b/plugins/skillopt-sleep/.cursor-plugin/plugin.json new file mode 100644 index 00000000..ee303fa6 --- /dev/null +++ b/plugins/skillopt-sleep/.cursor-plugin/plugin.json @@ -0,0 +1,28 @@ +{ + "name": "skillopt-sleep", + "displayName": "Skillopt Sleep", + "description": "Give your local Claude agent a nightly 'sleep cycle': it reviews your past sessions offline, replays recurring tasks on your own API budget, and consolidates what it learns into validated memory (CLAUDE.md) and skills (SKILL.md) behind a held-out gate, staged for your review. Self-improvement with no model-weight training.", + "version": "0.3.0", + "author": { + "name": "SkillOpt (Microsoft)" + }, + "category": "Productivity", + "homepage": "https://github.com/microsoft/SkillOpt/tree/main/plugins/claude-code", + "repository": "https://github.com/pleaseai/claude-code-plugins", + "license": "MIT", + "keywords": [ + "skillopt", + "sleep", + "self-improvement", + "memory-consolidation", + "dreams", + "skills", + "continual-learning", + "offline-optimization" + ], + "tags": [ + "productivity", + "skills", + "hooks" + ] +} diff --git a/plugins/slack-agent/.cursor-plugin/plugin.json b/plugins/slack-agent/.cursor-plugin/plugin.json new file mode 100644 index 00000000..e586b143 --- /dev/null +++ b/plugins/slack-agent/.cursor-plugin/plugin.json @@ -0,0 +1,15 @@ +{ + "name": "slack-agent", + "displayName": "Slack Agent", + "description": "Use when working on Slack agent/bot code, Chat SDK applications, Bolt for JavaScript projects, or projects using @chat-adapter/slack or @slack/bolt. Provides development patterns, testing requirements, and quality standards.", + "version": "1.1.1", + "author": { + "name": "vercel-labs" + }, + "category": "Productivity", + "repository": "https://github.com/vercel-labs/slack-agent-skill", + "license": "Apache-2.0", + "keywords": [ + "slack-agent" + ] +} diff --git a/plugins/slidev/.cursor-plugin/plugin.json b/plugins/slidev/.cursor-plugin/plugin.json new file mode 100644 index 00000000..f41e649c --- /dev/null +++ b/plugins/slidev/.cursor-plugin/plugin.json @@ -0,0 +1,23 @@ +{ + "name": "slidev", + "displayName": "Slidev", + "description": "Create and present web-based slides for developers using Markdown, Vue components, code highlighting, and animations", + "version": "1.2.1", + "author": { + "name": "Anthony Fu" + }, + "category": "Framework", + "homepage": "https://github.com/antfu/skills/tree/main/skills/slidev", + "repository": "https://github.com/antfu/skills", + "license": "MIT", + "keywords": [ + "slidev", + "slides", + "presentation", + "antfu" + ], + "tags": [ + "framework", + "presentation" + ] +} diff --git a/plugins/supabase/.cursor-plugin/plugin.json b/plugins/supabase/.cursor-plugin/plugin.json new file mode 100644 index 00000000..fd0543c6 --- /dev/null +++ b/plugins/supabase/.cursor-plugin/plugin.json @@ -0,0 +1,28 @@ +{ + "name": "supabase", + "displayName": "Supabase", + "description": "Agent Skills to help developers using AI agents with Supabase", + "version": "1.2.1", + "author": { + "name": "Supabase" + }, + "category": "Database", + "repository": "https://github.com/supabase/agent-skills", + "license": "MIT", + "keywords": [ + "supabase", + "postgres", + "database", + "backend" + ], + "tags": [ + "database", + "backend" + ], + "mcpServers": { + "supabase": { + "type": "http", + "url": "https://mcp.supabase.com/mcp?read_only=true" + } + } +} diff --git a/plugins/tiptap/.cursor-plugin/plugin.json b/plugins/tiptap/.cursor-plugin/plugin.json new file mode 100644 index 00000000..d0a50178 --- /dev/null +++ b/plugins/tiptap/.cursor-plugin/plugin.json @@ -0,0 +1,20 @@ +{ + "name": "tiptap", + "displayName": "Tiptap", + "description": "Helps coding agents integrate and work with the Tiptap rich text editor. Use when building or modifying a rich text editor with Tiptap, installing Tiptap extensions, or implementing features like collaboration, comments, AI, or document conversion.", + "version": "1.1.1", + "author": { + "name": "Community" + }, + "category": "Framework", + "license": "MIT", + "keywords": [ + "tiptap", + "rich-text-editor", + "prosemirror" + ], + "tags": [ + "framework", + "editor" + ] +} diff --git a/plugins/tosspayments/.cursor-plugin/plugin.json b/plugins/tosspayments/.cursor-plugin/plugin.json new file mode 100644 index 00000000..05840ff8 --- /dev/null +++ b/plugins/tosspayments/.cursor-plugin/plugin.json @@ -0,0 +1,33 @@ +{ + "name": "tosspayments", + "displayName": "Tosspayments", + "description": "TossPayments payment integration guide - access official documentation for payment widget, checkout, and API integration", + "version": "1.0.0", + "author": { + "name": "Toss Payments" + }, + "category": "Development", + "homepage": "https://docs.tosspayments.com/guides/v2/get-started/llms-guide", + "repository": "https://github.com/tosspayments/integration-guide-mcp", + "license": "MIT", + "keywords": [ + "tosspayments", + "payment", + "checkout", + "korea", + "mcp" + ], + "tags": [ + "mcp", + "payment" + ], + "mcpServers": { + "tosspayments-integration-guide": { + "command": "npx", + "args": [ + "-y", + "@tosspayments/integration-guide-mcp@latest" + ] + } + } +} diff --git a/plugins/tsdown/.cursor-plugin/plugin.json b/plugins/tsdown/.cursor-plugin/plugin.json new file mode 100644 index 00000000..435f14ac --- /dev/null +++ b/plugins/tsdown/.cursor-plugin/plugin.json @@ -0,0 +1,23 @@ +{ + "name": "tsdown", + "displayName": "Tsdown", + "description": "Bundle TypeScript and JavaScript libraries with blazing-fast speed powered by Rolldown", + "version": "1.4.0", + "author": { + "name": "Rolldown Contributors" + }, + "category": "Tooling", + "homepage": "https://github.com/rolldown/tsdown", + "repository": "https://github.com/rolldown/tsdown", + "license": "MIT", + "keywords": [ + "tsdown", + "bundler", + "typescript", + "rolldown" + ], + "tags": [ + "tooling", + "build" + ] +} diff --git a/plugins/turborepo/.cursor-plugin/plugin.json b/plugins/turborepo/.cursor-plugin/plugin.json new file mode 100644 index 00000000..913a182e --- /dev/null +++ b/plugins/turborepo/.cursor-plugin/plugin.json @@ -0,0 +1,23 @@ +{ + "name": "turborepo", + "displayName": "Turborepo", + "description": "Turborepo monorepo build system guidance for task pipelines, caching, CI optimization, and the turbo CLI", + "version": "1.2.1", + "author": { + "name": "Vercel" + }, + "category": "Tooling", + "homepage": "https://github.com/vercel/turborepo", + "repository": "https://github.com/vercel/turborepo", + "license": "MIT", + "keywords": [ + "turborepo", + "monorepo", + "build-system", + "vercel" + ], + "tags": [ + "tooling", + "monorepo" + ] +} diff --git a/plugins/unocss/.cursor-plugin/plugin.json b/plugins/unocss/.cursor-plugin/plugin.json new file mode 100644 index 00000000..f0b81790 --- /dev/null +++ b/plugins/unocss/.cursor-plugin/plugin.json @@ -0,0 +1,23 @@ +{ + "name": "unocss", + "displayName": "Unocss", + "description": "UnoCSS instant atomic CSS engine, superset of Tailwind CSS. Use when configuring UnoCSS, writing utility rules, shortcuts, or working with presets like Wind, Icons, Attributify.", + "version": "1.1.1", + "author": { + "name": "Anthony Fu" + }, + "category": "Framework", + "homepage": "https://github.com/antfu/skills/tree/main/skills/unocss", + "repository": "https://github.com/antfu/skills", + "license": "MIT", + "keywords": [ + "unocss", + "css", + "atomic-css", + "antfu" + ], + "tags": [ + "framework", + "css" + ] +} diff --git a/plugins/vercel-sandbox/.cursor-plugin/plugin.json b/plugins/vercel-sandbox/.cursor-plugin/plugin.json new file mode 100644 index 00000000..211420bc --- /dev/null +++ b/plugins/vercel-sandbox/.cursor-plugin/plugin.json @@ -0,0 +1,24 @@ +{ + "name": "vercel-sandbox", + "displayName": "Vercel Sandbox", + "description": "Creates isolated Linux MicroVMs using Vercel Sandbox SDK. Use when building code execution environments, running untrusted code, spinning up dev servers, or testing in isolation.", + "version": "1.1.0", + "author": { + "name": "Vercel Inc." + }, + "category": "Tooling", + "homepage": "https://vercel.com/docs/vercel-sandbox", + "repository": "https://github.com/vercel/sandbox", + "license": "Apache-2.0", + "keywords": [ + "vercel-sandbox", + "sandbox", + "microvm", + "vercel", + "isolated-execution" + ], + "tags": [ + "skills", + "vercel" + ] +} diff --git a/plugins/vinext/.cursor-plugin/plugin.json b/plugins/vinext/.cursor-plugin/plugin.json new file mode 100644 index 00000000..057b4d12 --- /dev/null +++ b/plugins/vinext/.cursor-plugin/plugin.json @@ -0,0 +1,22 @@ +{ + "name": "vinext", + "displayName": "Vinext", + "description": "Migrates Next.js projects to vinext (Vite-based Next.js reimplementation) — compatibility scanning, package replacement, Vite config generation, ESM conversion, and deployment setup", + "version": "1.1.1", + "author": { + "name": "Cloudflare" + }, + "category": "Framework", + "license": "MIT", + "keywords": [ + "vinext", + "nextjs", + "vite", + "migration", + "cloudflare" + ], + "tags": [ + "framework", + "migration" + ] +} diff --git a/plugins/vite/.cursor-plugin/plugin.json b/plugins/vite/.cursor-plugin/plugin.json new file mode 100644 index 00000000..f8cfd6cd --- /dev/null +++ b/plugins/vite/.cursor-plugin/plugin.json @@ -0,0 +1,23 @@ +{ + "name": "vite", + "displayName": "Vite", + "description": "Vite build tool configuration, plugin API, SSR, and Vite 8 Rolldown migration. Use when working with Vite projects, vite.config.ts, Vite plugins, or building libraries/SSR apps with Vite.", + "version": "1.1.1", + "author": { + "name": "Anthony Fu" + }, + "category": "Tooling", + "homepage": "https://github.com/antfu/skills/tree/main/skills/vite", + "repository": "https://github.com/antfu/skills", + "license": "MIT", + "keywords": [ + "vite", + "build-tool", + "bundler", + "antfu" + ], + "tags": [ + "tooling", + "build" + ] +} diff --git a/plugins/vitepress/.cursor-plugin/plugin.json b/plugins/vitepress/.cursor-plugin/plugin.json new file mode 100644 index 00000000..8379b4d5 --- /dev/null +++ b/plugins/vitepress/.cursor-plugin/plugin.json @@ -0,0 +1,23 @@ +{ + "name": "vitepress", + "displayName": "Vitepress", + "description": "VitePress static site generator powered by Vite and Vue. Use when building documentation sites, configuring themes, or writing Markdown with Vue components.", + "version": "1.1.1", + "author": { + "name": "Anthony Fu" + }, + "category": "Framework", + "homepage": "https://github.com/antfu/skills/tree/main/skills/vitepress", + "repository": "https://github.com/antfu/skills", + "license": "MIT", + "keywords": [ + "vitepress", + "documentation", + "static-site", + "antfu" + ], + "tags": [ + "framework", + "docs" + ] +} diff --git a/plugins/vitest/.cursor-plugin/plugin.json b/plugins/vitest/.cursor-plugin/plugin.json new file mode 100644 index 00000000..2ebcf0dd --- /dev/null +++ b/plugins/vitest/.cursor-plugin/plugin.json @@ -0,0 +1,23 @@ +{ + "name": "vitest", + "displayName": "Vitest", + "description": "Vitest fast unit testing framework powered by Vite with Jest-compatible API. Use when writing tests, mocking, configuring coverage, or working with test filtering and fixtures.", + "version": "1.1.1", + "author": { + "name": "Anthony Fu" + }, + "category": "Development", + "homepage": "https://github.com/antfu/skills/tree/main/skills/vitest", + "repository": "https://github.com/antfu/skills", + "license": "MIT", + "keywords": [ + "vitest", + "testing", + "unit-test", + "antfu" + ], + "tags": [ + "tooling", + "testing" + ] +} diff --git a/plugins/vue/.cursor-plugin/plugin.json b/plugins/vue/.cursor-plugin/plugin.json new file mode 100644 index 00000000..16d3a62f --- /dev/null +++ b/plugins/vue/.cursor-plugin/plugin.json @@ -0,0 +1,23 @@ +{ + "name": "vue", + "displayName": "Vue", + "description": "Vue 3 core, best practices, router patterns, and testing", + "version": "1.2.1", + "author": { + "name": "Anthony Fu" + }, + "category": "Framework", + "homepage": "https://github.com/antfu/skills/tree/main/skills/vue", + "repository": "https://github.com/antfu/skills", + "license": "MIT", + "keywords": [ + "vue", + "vue3", + "composition-api", + "antfu" + ], + "tags": [ + "framework", + "frontend" + ] +} diff --git a/plugins/vueuse/.cursor-plugin/plugin.json b/plugins/vueuse/.cursor-plugin/plugin.json new file mode 100644 index 00000000..fa9262b5 --- /dev/null +++ b/plugins/vueuse/.cursor-plugin/plugin.json @@ -0,0 +1,23 @@ +{ + "name": "vueuse", + "displayName": "VueUse", + "description": "Apply VueUse composables where appropriate to build concise, maintainable Vue.js / Nuxt features", + "version": "1.2.1", + "author": { + "name": "Anthony Fu" + }, + "category": "Framework", + "homepage": "https://github.com/antfu/skills/tree/main/skills/vueuse-functions", + "repository": "https://github.com/antfu/skills", + "license": "MIT", + "keywords": [ + "vueuse", + "vue", + "composables", + "antfu" + ], + "tags": [ + "framework", + "vue" + ] +} diff --git a/plugins/web-design/.cursor-plugin/plugin.json b/plugins/web-design/.cursor-plugin/plugin.json new file mode 100644 index 00000000..979aa7ee --- /dev/null +++ b/plugins/web-design/.cursor-plugin/plugin.json @@ -0,0 +1,23 @@ +{ + "name": "web-design", + "displayName": "Web Design", + "description": "Review UI code for Web Interface Guidelines compliance", + "version": "1.3.0", + "author": { + "name": "Anthony Fu" + }, + "category": "UI", + "homepage": "https://github.com/antfu/skills/tree/main/skills/web-design-guidelines", + "repository": "https://github.com/antfu/skills", + "license": "MIT", + "keywords": [ + "web-design", + "ui", + "accessibility", + "antfu" + ], + "tags": [ + "review", + "ui" + ] +} diff --git a/plugins/wordpress/.cursor-plugin/plugin.json b/plugins/wordpress/.cursor-plugin/plugin.json new file mode 100644 index 00000000..7819960f --- /dev/null +++ b/plugins/wordpress/.cursor-plugin/plugin.json @@ -0,0 +1,23 @@ +{ + "name": "wordpress", + "displayName": "Wordpress", + "description": "Expert-level WordPress knowledge for AI coding assistants — blocks, themes, plugins, and best practices", + "version": "1.1.1", + "author": { + "name": "Community" + }, + "category": "Framework", + "license": "NOASSERTION", + "keywords": [ + "wordpress", + "blocks", + "themes", + "plugins", + "gutenberg", + "php" + ], + "tags": [ + "framework", + "cms" + ] +} diff --git a/plugins/workflow-sdk/.cursor-plugin/plugin.json b/plugins/workflow-sdk/.cursor-plugin/plugin.json new file mode 100644 index 00000000..9591e29d --- /dev/null +++ b/plugins/workflow-sdk/.cursor-plugin/plugin.json @@ -0,0 +1,24 @@ +{ + "name": "workflow-sdk", + "displayName": "Workflow SDK", + "description": "Workflow SDK: Build durable, reliable, and observable apps and AI Agents in TypeScript", + "version": "1.2.0", + "author": { + "name": "Vercel Inc." + }, + "category": "Development", + "homepage": "https://github.com/vercel/workflow", + "repository": "https://github.com/vercel/workflow", + "license": "Apache-2.0", + "keywords": [ + "workflow", + "durable", + "vercel", + "typescript", + "ai-agents" + ], + "tags": [ + "framework", + "workflow" + ] +} diff --git a/plugins/worktree/.cursor-plugin/plugin.json b/plugins/worktree/.cursor-plugin/plugin.json new file mode 100644 index 00000000..cbb56224 --- /dev/null +++ b/plugins/worktree/.cursor-plugin/plugin.json @@ -0,0 +1,20 @@ +{ + "name": "worktree", + "displayName": "Worktree", + "description": "Git worktree isolation: context injection and parent project access prevention", + "version": "1.0.0", + "author": { + "name": "PassionFactory" + }, + "category": "Tooling", + "keywords": [ + "worktree", + "git", + "isolation", + "safety" + ], + "tags": [ + "tooling", + "safety" + ] +} diff --git a/plugins/zod/.cursor-plugin/plugin.json b/plugins/zod/.cursor-plugin/plugin.json new file mode 100644 index 00000000..9cefde24 --- /dev/null +++ b/plugins/zod/.cursor-plugin/plugin.json @@ -0,0 +1,23 @@ +{ + "name": "zod", + "displayName": "Zod", + "description": "TypeScript-first schema validation with static type inference - version-aware skill for Zod v3 and v4", + "version": "1.2.0", + "author": { + "name": "Zod" + }, + "category": "Development", + "homepage": "https://zod.dev", + "repository": "https://github.com/colinhacks/zod", + "license": "MIT", + "keywords": [ + "zod", + "validation", + "schema", + "typescript" + ], + "tags": [ + "validation", + "typescript" + ] +} diff --git a/release-please-config.json b/release-please-config.json index f885298e..4a88d289 100644 --- a/release-please-config.json +++ b/release-please-config.json @@ -38,6 +38,11 @@ "type": "json", "path": "plugin.json", "jsonpath": "$.version" + }, + { + "type": "json", + "path": ".cursor-plugin/plugin.json", + "jsonpath": "$.version" } ] }, @@ -219,6 +224,11 @@ "type": "json", "path": ".tessl-plugin/plugin.json", "jsonpath": "$.version" + }, + { + "type": "json", + "path": ".cursor-plugin/plugin.json", + "jsonpath": "$.version" } ] }, @@ -245,6 +255,11 @@ "type": "json", "path": ".tessl-plugin/plugin.json", "jsonpath": "$.version" + }, + { + "type": "json", + "path": ".cursor-plugin/plugin.json", + "jsonpath": "$.version" } ] }, @@ -304,6 +319,11 @@ "type": "json", "path": ".tessl-plugin/plugin.json", "jsonpath": "$.version" + }, + { + "type": "json", + "path": ".cursor-plugin/plugin.json", + "jsonpath": "$.version" } ] }, @@ -369,6 +389,11 @@ "type": "json", "path": "plugin.json", "jsonpath": "$.version" + }, + { + "type": "json", + "path": ".cursor-plugin/plugin.json", + "jsonpath": "$.version" } ] }, @@ -395,6 +420,11 @@ "type": "json", "path": ".tessl-plugin/plugin.json", "jsonpath": "$.version" + }, + { + "type": "json", + "path": ".cursor-plugin/plugin.json", + "jsonpath": "$.version" } ] }, @@ -432,6 +462,11 @@ "type": "json", "path": ".tessl-plugin/plugin.json", "jsonpath": "$.version" + }, + { + "type": "json", + "path": ".cursor-plugin/plugin.json", + "jsonpath": "$.version" } ] }, @@ -486,6 +521,11 @@ "type": "json", "path": "plugin.json", "jsonpath": "$.version" + }, + { + "type": "json", + "path": ".cursor-plugin/plugin.json", + "jsonpath": "$.version" } ] }, @@ -512,6 +552,11 @@ "type": "json", "path": ".tessl-plugin/plugin.json", "jsonpath": "$.version" + }, + { + "type": "json", + "path": ".cursor-plugin/plugin.json", + "jsonpath": "$.version" } ] }, @@ -659,6 +704,11 @@ "type": "json", "path": ".tessl-plugin/plugin.json", "jsonpath": "$.version" + }, + { + "type": "json", + "path": ".cursor-plugin/plugin.json", + "jsonpath": "$.version" } ] }, @@ -685,6 +735,11 @@ "type": "json", "path": ".tessl-plugin/plugin.json", "jsonpath": "$.version" + }, + { + "type": "json", + "path": ".cursor-plugin/plugin.json", + "jsonpath": "$.version" } ] }, @@ -711,6 +766,11 @@ "type": "json", "path": ".tessl-plugin/plugin.json", "jsonpath": "$.version" + }, + { + "type": "json", + "path": ".cursor-plugin/plugin.json", + "jsonpath": "$.version" } ] }, @@ -737,6 +797,11 @@ "type": "json", "path": ".tessl-plugin/plugin.json", "jsonpath": "$.version" + }, + { + "type": "json", + "path": ".cursor-plugin/plugin.json", + "jsonpath": "$.version" } ] }, @@ -763,6 +828,11 @@ "type": "json", "path": ".tessl-plugin/plugin.json", "jsonpath": "$.version" + }, + { + "type": "json", + "path": ".cursor-plugin/plugin.json", + "jsonpath": "$.version" } ] }, @@ -789,6 +859,11 @@ "type": "json", "path": ".tessl-plugin/plugin.json", "jsonpath": "$.version" + }, + { + "type": "json", + "path": ".cursor-plugin/plugin.json", + "jsonpath": "$.version" } ] }, @@ -815,6 +890,11 @@ "type": "json", "path": ".tessl-plugin/plugin.json", "jsonpath": "$.version" + }, + { + "type": "json", + "path": ".cursor-plugin/plugin.json", + "jsonpath": "$.version" } ] }, @@ -841,6 +921,11 @@ "type": "json", "path": ".tessl-plugin/plugin.json", "jsonpath": "$.version" + }, + { + "type": "json", + "path": ".cursor-plugin/plugin.json", + "jsonpath": "$.version" } ] }, @@ -867,6 +952,11 @@ "type": "json", "path": ".tessl-plugin/plugin.json", "jsonpath": "$.version" + }, + { + "type": "json", + "path": ".cursor-plugin/plugin.json", + "jsonpath": "$.version" } ] }, @@ -888,6 +978,11 @@ "type": "json", "path": "plugin.json", "jsonpath": "$.version" + }, + { + "type": "json", + "path": ".cursor-plugin/plugin.json", + "jsonpath": "$.version" } ] }, @@ -909,6 +1004,11 @@ "type": "json", "path": "plugin.json", "jsonpath": "$.version" + }, + { + "type": "json", + "path": ".cursor-plugin/plugin.json", + "jsonpath": "$.version" } ] }, @@ -930,6 +1030,11 @@ "type": "json", "path": "plugin.json", "jsonpath": "$.version" + }, + { + "type": "json", + "path": ".cursor-plugin/plugin.json", + "jsonpath": "$.version" } ] }, @@ -951,6 +1056,11 @@ "type": "json", "path": "plugin.json", "jsonpath": "$.version" + }, + { + "type": "json", + "path": ".cursor-plugin/plugin.json", + "jsonpath": "$.version" } ] }, @@ -972,6 +1082,11 @@ "type": "json", "path": "plugin.json", "jsonpath": "$.version" + }, + { + "type": "json", + "path": ".cursor-plugin/plugin.json", + "jsonpath": "$.version" } ] }, @@ -993,6 +1108,11 @@ "type": "json", "path": "plugin.json", "jsonpath": "$.version" + }, + { + "type": "json", + "path": ".cursor-plugin/plugin.json", + "jsonpath": "$.version" } ] }, @@ -1014,6 +1134,11 @@ "type": "json", "path": "plugin.json", "jsonpath": "$.version" + }, + { + "type": "json", + "path": ".cursor-plugin/plugin.json", + "jsonpath": "$.version" } ] }, @@ -1035,6 +1160,11 @@ "type": "json", "path": "plugin.json", "jsonpath": "$.version" + }, + { + "type": "json", + "path": ".cursor-plugin/plugin.json", + "jsonpath": "$.version" } ] } diff --git a/scripts/cli.ts b/scripts/cli.ts index c4e87162..119ea65b 100644 --- a/scripts/cli.ts +++ b/scripts/cli.ts @@ -15,7 +15,7 @@ import { dirname, join, resolve } from "node:path" import type { SubmoduleMeta } from "./meta.ts" import { extensions, submodules, vendors } from "./meta.ts" import { convertMcpServerPaths, parseToml } from "./extension-helpers.ts" -import { generateForPlugin, toCodexMarketplace, writeIfChanged, type ClaudeMarketplace, type MarketplaceEntry } from "./multi-format.ts" +import { generateForPlugin, toCodexMarketplace, toCursorMarketplace, writeIfChanged, type ClaudeMarketplace, type MarketplaceEntry } from "./multi-format.ts" const ROOT = resolve(import.meta.dirname!, "..") const PLUGINS_DIR = join(ROOT, "plugins") @@ -692,8 +692,8 @@ export async function cleanup() { // multi-format // --------------------------------------------------------------------------- /** - * Generate Codex and Antigravity manifests for every local plugin so the - * same plugin directory loads in all three runtimes. See scripts/multi-format.ts + * Generate Codex, Antigravity, and Cursor manifests for every local plugin so + * the same plugin directory loads across runtimes. See scripts/multi-format.ts * for the format mapping rules. */ export async function generateMultiFormat() { @@ -712,7 +712,7 @@ export async function generateMultiFormat() { } } - console.log("Generating Codex + Antigravity manifests for local plugins...\n") + console.log("Generating Codex + Antigravity + Cursor manifests for local plugins...\n") let pluginsProcessed = 0 let filesWritten = 0 const benignSkipped: string[] = [] @@ -758,6 +758,17 @@ export async function generateMultiFormat() { console.log(`Codex marketplace up to date: ${codexMarketplacePath}`) } + // Generate Cursor marketplace.json from the Claude one (local plugins only). + const cursorMarketplace = toCursorMarketplace(marketplaceJson) + const cursorMarketplacePath = join(ROOT, ".cursor-plugin", "marketplace.json") + const cursorWritten = writeIfChanged(cursorMarketplacePath, JSON.stringify(cursorMarketplace, null, 2) + "\n") + if (cursorWritten) { + console.log(`Cursor marketplace written: ${cursorMarketplacePath}`) + filesWritten++ + } else { + console.log(`Cursor marketplace up to date: ${cursorMarketplacePath}`) + } + console.log(`\nProcessed ${pluginsProcessed} plugins, wrote ${filesWritten} file(s).`) if (benignSkipped.length > 0) console.log(`Skipped (no manifest): ${benignSkipped.join(", ")}`) if (failed.length > 0) { @@ -798,7 +809,7 @@ if (import.meta.main) { console.log(" sync Update submodules and sync skills directly to plugins/") console.log(" check Check for available upstream updates") console.log(" cleanup Remove stale submodules and plugin skills") - console.log(" multi-format Generate Codex + Antigravity manifests for local plugins") + console.log(" multi-format Generate Codex + Antigravity + Cursor manifests for local plugins") process.exit(1) } } diff --git a/scripts/multi-format.test.ts b/scripts/multi-format.test.ts index d9413309..13724b1e 100644 --- a/scripts/multi-format.test.ts +++ b/scripts/multi-format.test.ts @@ -11,6 +11,9 @@ import { toCodexMarketplace, toCodexMarketplaceEntry, toCodexSource, + toCursorManifest, + toCursorMarketplace, + toCursorSource, type ClaudeMarketplace, type ClaudePluginManifest, type MarketplaceEntry, @@ -371,11 +374,15 @@ describe("generateForPlugin", () => { expect(result.written).toEqual([]) }) - test("writes Codex and Antigravity manifests when only nested manifest exists", () => { + test("writes Codex, Antigravity, and Cursor manifests when only nested manifest exists", () => { writeNestedClaude({ name: "x", version: "1.0.0", description: "d", author: { name: "A" } }) const result = generateForPlugin(tempDir, undefined) expect(result.written.some(p => p.endsWith(".codex-plugin/plugin.json"))).toBe(true) - expect(result.written.some(p => p.endsWith("plugin.json") && !p.includes(".codex-plugin"))).toBe(true) + expect(result.written.some(p => p.endsWith(".cursor-plugin/plugin.json"))).toBe(true) + expect(result.written.some(p => p.endsWith("plugin.json") && !p.includes(".codex-plugin") && !p.includes(".cursor-plugin"))).toBe(true) + const cursor = JSON.parse(readFileSync(join(tempDir, ".cursor-plugin", "plugin.json"), "utf-8")) + expect(cursor.name).toBe("x") + expect(cursor.author).toEqual({ name: "A" }) }) test("preserves existing root plugin.json when Claude manifest lives at root (no .claude-plugin/)", () => { @@ -465,3 +472,150 @@ describe("toCodexMarketplaceEntry", () => { expect(result.category).toBe("Productivity") }) }) + +describe("toCursorManifest", () => { + test("maps core metadata and derives displayName/version", () => { + const result = toCursorManifest(baseClaude, undefined) + expect(result.name).toBe("demo-plugin") + expect(result.displayName).toBe("Demo Plugin") + expect(result.version).toBe("1.2.3") + expect(result.description).toBe("Demo plugin for tests. Multiple sentences here.") + expect(result.category).toBe("Productivity") + }) + + test("author carries only name; email and url are dropped (privacy + schema)", () => { + const claude: ClaudePluginManifest = { name: "x", author: { name: "Alice", email: "a@b.com", url: "https://example.com" } } + const result = toCursorManifest(claude, undefined) + expect(result.author).toEqual({ name: "Alice" }) + }) + + test("falls back to Community author when none provided", () => { + const result = toCursorManifest({ name: "x" }, undefined) + expect(result.author).toEqual({ name: "Community" }) + }) + + test("omits component fields (skills/commands/agents/rules) — Cursor auto-discovers them", () => { + const claude: ClaudePluginManifest = { name: "x", skills: "skills", commands: "commands", agents: "agents" } + const result = toCursorManifest(claude, undefined) as unknown as Record + expect(result.skills).toBeUndefined() + expect(result.commands).toBeUndefined() + expect(result.agents).toBeUndefined() + expect(result.rules).toBeUndefined() + }) + + test("keeps inline mcpServers in the manifest (no companion file)", () => { + const claude: ClaudePluginManifest = { name: "x", mcpServers: { foo: { command: "node" } } } + const result = toCursorManifest(claude, undefined) + expect(result.mcpServers).toEqual({ foo: { command: "node" } }) + }) + + test("omits mcpServers when empty", () => { + const claude: ClaudePluginManifest = { name: "x", mcpServers: {} } + const result = toCursorManifest(claude, undefined) + expect(result.mcpServers).toBeUndefined() + }) + + test("passes through a string mcpServers path instead of silently dropping it", () => { + const result = toCursorManifest({ name: "x", mcpServers: "./.mcp.json" }, undefined) + expect(result.mcpServers).toBe("./.mcp.json") + }) + + test("coerces a non-semver version to 1.0.0", () => { + const result = toCursorManifest({ name: "x", version: "2024-01-01" }, undefined) + expect(result.version).toBe("1.0.0") + }) + + test("maps acronym categories to canonical casing (ai -> AI, ui -> UI)", () => { + expect(toCursorManifest({ name: "x" }, { name: "x", category: "ai" }).category).toBe("AI") + expect(toCursorManifest({ name: "x" }, { name: "x", category: "ui" }).category).toBe("UI") + expect(toCursorManifest({ name: "x" }, { name: "x", category: "tooling" }).category).toBe("Tooling") + }) + + test("prefers marketplace displayName/tags when present", () => { + const entry: MarketplaceEntry = { name: "demo-plugin", displayName: "Fancy Name", tags: ["a", "b"] } + const result = toCursorManifest(baseClaude, entry) + expect(result.displayName).toBe("Fancy Name") + expect(result.tags).toEqual(["a", "b"]) + }) + + test("falls back to entry description when manifest lacks one", () => { + const result = toCursorManifest({ name: "x" }, { name: "x", description: "from entry" }) + expect(result.description).toBe("from entry") + }) +}) + +describe("toCursorSource", () => { + test("maps a local ./plugins/ string to itself", () => { + expect(toCursorSource("./plugins/foo")).toBe("./plugins/foo") + }) + + test("returns null for a non-local string source", () => { + expect(toCursorSource("./something-else")).toBeNull() + }) + + test("returns null for object (remote) sources Cursor's string form cannot express", () => { + expect(toCursorSource({ source: "github", repo: "org/repo" })).toBeNull() + expect(toCursorSource({ source: "git-subdir", url: "u", path: "p" })).toBeNull() + expect(toCursorSource(undefined)).toBeNull() + }) +}) + +describe("toCursorMarketplace", () => { + test("includes only local plugins, with name + source + description", () => { + const input: ClaudeMarketplace = { + name: "test-market", + plugins: [ + { name: "local-one", description: "d1", source: "./plugins/local-one" as unknown as object }, + { name: "from-github", source: { source: "github", repo: "org/repo" } as unknown as object }, + { name: "local-two", source: "./plugins/local-two" as unknown as object }, + ], + } + const result = toCursorMarketplace(input) + expect(result.plugins).toEqual([ + { name: "local-one", source: "./plugins/local-one", description: "d1" }, + { name: "local-two", source: "./plugins/local-two" }, + ]) + }) + + test("passes through owner and metadata when present", () => { + const input: ClaudeMarketplace = { + name: "m", + owner: { name: "Org", email: "o@x.com" }, + metadata: { version: "0.2.0" }, + plugins: [], + } + const result = toCursorMarketplace(input) + expect(result.owner).toEqual({ name: "Org", email: "o@x.com" }) + expect(result.metadata).toEqual({ version: "0.2.0" }) + }) + + test("rebrands a 'Claude Code' metadata description for the Cursor catalog", () => { + const input: ClaudeMarketplace = { + name: "m", + metadata: { version: "0.2.0", description: "Bundled plugins for Claude Code" }, + plugins: [], + } + const result = toCursorMarketplace(input) + expect(result.metadata).toEqual({ version: "0.2.0", description: "Bundled plugins for Cursor" }) + }) + + test("defaults name to 'personal' and omits owner/metadata when absent", () => { + const result = toCursorMarketplace({ plugins: [] }) + expect(result.name).toBe("personal") + expect(result.owner).toBeUndefined() + expect(result.metadata).toBeUndefined() + }) + + test("deduplicates plugin entries by name (keeps first occurrence)", () => { + const input: ClaudeMarketplace = { + name: "m", + plugins: [ + { name: "dup", source: "./plugins/dir-a" as unknown as object }, + { name: "dup", source: "./plugins/dir-b" as unknown as object }, + ], + } + const result = toCursorMarketplace(input) + expect(result.plugins).toHaveLength(1) + expect(result.plugins[0]!.source).toBe("./plugins/dir-a") + }) +}) diff --git a/scripts/multi-format.ts b/scripts/multi-format.ts index 8a3ab916..5b002d25 100644 --- a/scripts/multi-format.ts +++ b/scripts/multi-format.ts @@ -5,12 +5,13 @@ import { dirname, join } from "node:path" * Multi-format plugin manifest generator. * * Reads the Claude Code plugin manifest (`.claude-plugin/plugin.json`) and a - * marketplace entry, then emits equivalent manifests for two additional - * runtimes so the same plugin directory loads in all three: + * marketplace entry, then emits equivalent manifests for three additional + * runtimes so the same plugin directory loads in all of them: * * - Claude Code (source of truth): plugins//.claude-plugin/plugin.json * - Codex: plugins//.codex-plugin/plugin.json + .mcp.json * - Antigravity: plugins//plugin.json + mcp_config.json + hooks.json + * - Cursor: plugins//.cursor-plugin/plugin.json * * Shared assets (`skills/`, `commands/`, `hooks/`) live once and are referenced * by each manifest. Only manifest-level fields differ across runtimes. @@ -29,6 +30,13 @@ import { dirname, join } from "node:path" * - `hooks/hooks.json` (if present) → mirrored to root `hooks.json` * - skills/ reused as-is (same SKILL.md format) * + * Claude → Cursor + * - `.cursor-plugin/plugin.json`: only `name` is required; rich metadata + * (displayName/category/tags) preserved when available + * - components (`skills`/`commands`/`agents`/`rules`) are omitted — Cursor + * auto-discovers them from default folders at the plugin root + * - `mcpServers` inline → kept inline in the manifest (Cursor accepts an object) + * * Antigravity collision: plugins that already use a root-level `plugin.json` * (currently `bun`, `plugin-dev`) are treated as Antigravity-compatible * already — generator only writes the file when content actually changes, @@ -120,9 +128,16 @@ function pickDisplayName(claude: ClaudePluginManifest, entry: MarketplaceEntry | return fromName || claude.name } +// Categories are stored lower-case in the Claude marketplace by convention, but +// surface capitalised in Codex/Cursor manifests. Acronyms must not be naively +// title-cased ("ai" → "Ai"); map the known ones to their canonical form. +const CATEGORY_ACRONYMS: Record = { ai: "AI", ui: "UI" } + function pickCategory(entry: MarketplaceEntry | undefined): string { const raw = entry?.category if (!raw) return DEFAULT_CATEGORY + const canonical = CATEGORY_ACRONYMS[raw.toLowerCase()] + if (canonical) return canonical return raw[0]!.toUpperCase() + raw.slice(1) } @@ -283,6 +298,78 @@ export function toAntigravityManifest(claude: ClaudePluginManifest): Antigravity return manifest } +/** + * Cursor plugin manifest (`.cursor-plugin/plugin.json`). Only `name` is required + * by the schema; we additionally emit metadata that helps marketplace discovery. + * Component fields (`skills`/`commands`/`agents`/`rules`) are intentionally + * omitted — Cursor auto-discovers them from default folders at the plugin root, + * which keeps the manifest format-agnostic (same `skills/` dir as Claude Code). + * `author` carries only `name`: emails are stripped for the same privacy reason + * as {@link sanitiseAuthor}, and the Cursor author schema has no `url` field. + */ +export interface CursorAuthor { + name: string +} + +export interface CursorManifest { + name: string + displayName: string + description: string + version: string + author: CursorAuthor + homepage?: string + repository?: string + license?: string + keywords?: string[] + category: string + tags?: string[] + mcpServers?: Record | string +} + +function pickCursorAuthor(claude: ClaudePluginManifest): CursorAuthor { + const name = claude.author?.name + return { name: name && name.trim() ? name : "Community" } +} + +/** + * Convert a Claude Code plugin manifest into a Cursor manifest. + * + * Caller writes the returned manifest to `.cursor-plugin/plugin.json`. Unlike + * Codex/Antigravity, inline `mcpServers` stay in the manifest (Cursor accepts an + * object), so no companion file is produced. + */ +export function toCursorManifest( + claude: ClaudePluginManifest, + entry: MarketplaceEntry | undefined, +): CursorManifest { + const description = claude.description ?? entry?.description ?? claude.name + const manifest: CursorManifest = { + name: claude.name, + displayName: pickDisplayName(claude, entry), + description, + version: normalizeVersion(claude.version), + author: pickCursorAuthor(claude), + category: pickCategory(entry), + } + if (claude.homepage) manifest.homepage = claude.homepage + if (claude.repository) manifest.repository = claude.repository + if (claude.license) manifest.license = claude.license + if (claude.keywords && claude.keywords.length > 0) manifest.keywords = claude.keywords + const tags = entry?.tags + if (tags && tags.length > 0) manifest.tags = tags + // MCP servers: inline objects are kept inline; a string form (external config + // path, e.g. "./.mcp.json") is passed through rather than dropped — Cursor's + // schema accepts a string path, and silently omitting it would lose MCP + // support for plugins that externalise their config. + if (typeof claude.mcpServers === "string") { + manifest.mcpServers = claude.mcpServers + } else { + const mcp = extractMcpServersFile(claude) + if (mcp) manifest.mcpServers = mcp.mcpServers + } + return manifest +} + /** * Pull inline `mcpServers` out of a Claude manifest so it can be written to * an external file (`.mcp.json` for Codex, `mcp_config.json` for Antigravity). @@ -469,6 +556,15 @@ export function generateForPlugin( result.written.push(`${staleCodexHooks} (removed: Codex uses default hooks/hooks.json)`) } + // 1b. Cursor manifest (.cursor-plugin/plugin.json). + // Components (skills/commands/agents/rules) are auto-discovered from default + // folders by Cursor, so we omit those fields. Inline mcpServers (if any) stay + // in the manifest — Cursor accepts an object, so no companion file is written. + const cursor = toCursorManifest(claude, marketplaceEntry) + const cursorPath = join(pluginDir, ".cursor-plugin", "plugin.json") + if (writeIfChanged(cursorPath, stringify(cursor))) result.written.push(cursorPath) + else result.skipped.push(cursorPath) + // 2. Antigravity manifest (root-level plugin.json) // If the Claude manifest already lives at root, skip — that file IS the manifest // and both runtimes can read it. @@ -528,6 +624,8 @@ export function generateForPlugin( */ export interface ClaudeMarketplace { name?: string + owner?: { name: string; email?: string } + metadata?: Record plugins: Array } @@ -557,3 +655,66 @@ export function toCodexMarketplace(claudeMarketplace: ClaudeMarketplace): { } } +/** + * Convert a Claude marketplace `source` into a Cursor marketplace `source`. + * Cursor entries use a single string source ("relative path or remote URL"), + * so only local plugins (`./plugins/...`) are expressible here — git-subdir + * sources have no path field in Cursor's string form, and whole-repo URL + * shapes are left out rather than emitting an unverifiable URL. Returns null + * for anything that is not a local plugin so the caller skips it. + */ +export function toCursorSource(source: unknown): string | null { + if (typeof source === "string") { + return source.startsWith("./plugins/") ? source : null + } + return null +} + +export interface CursorMarketplaceEntry { + name: string + source: string + description?: string +} + +export interface CursorMarketplace { + name: string + owner?: { name: string; email?: string } + metadata?: Record + plugins: CursorMarketplaceEntry[] +} + +/** + * Build a Cursor marketplace document (`.cursor-plugin/marketplace.json`) from a + * Claude Code marketplace.json. Only local plugins are included (see + * {@link toCursorSource}); `owner`/`metadata` are passed through when present. + */ +export function toCursorMarketplace(claudeMarketplace: ClaudeMarketplace): CursorMarketplace { + const seen = new Set() + const plugins: CursorMarketplaceEntry[] = [] + for (const p of claudeMarketplace.plugins) { + if (seen.has(p.name)) continue + const source = toCursorSource(p.source) + if (!source) continue + seen.add(p.name) + const entry: CursorMarketplaceEntry = { name: p.name, source } + if (p.description) entry.description = p.description + plugins.push(entry) + } + // Re-brand the metadata description for the Cursor catalog: the shared Claude + // marketplace metadata says "…for Claude Code", which is stale on the Cursor + // surface. Rewrite the runtime mention while leaving other metadata intact. + let metadata = claudeMarketplace.metadata + if (metadata && typeof metadata.description === "string") { + metadata = { ...metadata, description: metadata.description.replace(/Claude Code/g, "Cursor") } + } + // Field order matches Cursor's marketplace convention: name, owner, metadata, + // then plugins. Build via spreads so optional fields land before the plugins + // array rather than after it (JSON key order follows insertion order). + return { + name: claudeMarketplace.name ?? "personal", + ...(claudeMarketplace.owner ? { owner: claudeMarketplace.owner } : {}), + ...(metadata ? { metadata } : {}), + plugins, + } +} + diff --git a/skills-lock.json b/skills-lock.json index 7a80acfe..957bfbdc 100644 --- a/skills-lock.json +++ b/skills-lock.json @@ -1,6 +1,13 @@ { "version": 1, "skills": { + "create-plugin-scaffold": { + "source": "cursor/plugins", + "ref": "main", + "sourceType": "github", + "skillPath": "create-plugin/skills/create-plugin-scaffold/SKILL.md", + "computedHash": "d1261673ee442e808d5238ea3fcf9c53cc71ffca9ddd8bc8eed4038afa8cf923" + }, "plugin-creator": { "source": "openai/codex", "ref": "main",