{
  "markdown": "# AI Plugin Marketplace Template\n\nAuthor AI assistant plugins once and ship them to multiple host platforms —\n**Claude Code, Cursor, Gemini CLI, Kiro, and Vercel Skills CLI** — at the\nhighest fidelity each one accepts.\n\nThis repository is a **thin consumer** of the\n[`@ai-plugin-marketplace`](https://www.npmjs.com/package/@ai-plugin-marketplace/cli)\ntoolkit. It contains your plugin sources and a dependency on the toolkit —\nnothing else. All validation, scaffolding, and build logic lives in the\nversioned `@ai-plugin-marketplace/*` npm packages, so you upgrade your tooling\nwith a single `pnpm up` and never get stranded on a forked copy of the build\nscripts.\n\n## Getting started\n\nThis repo is a GitHub template. Click **\"Use this template\"** (or run\n`aipm init` in an empty directory to generate the same layout from scratch),\nthen:\n\n```bash\npnpm install\n```\n\nThe `@ai-plugin-marketplace/*` packages are published to npm, so a fresh\n`pnpm install` resolves them directly. See [CONTRIBUTING.md](CONTRIBUTING.md).\n\n> [!IMPORTANT]\n> **Rename your marketplace first.** Open `aipm.workspace.ts` and change\n> `marketplace.name` (and `owner`) from the placeholder `my-ai-plugins` to a\n> **unique** name — convention `\"<your-handle>-ai-plugins\"`, e.g. `mnorth-ai-plugins`.\n> The `name` is what hosts register your marketplace under; if it collides with another\n> marketplace (such as the upstream `ai-plugin-marketplace`), the second one installed\n> shadows or strands the first's plugins. `aipm validate` warns while the name is still a\n> default. (Scaffolding from scratch with `aipm init --name <name>` sets this for you.)\n\n## Authoring plugins\n\n### Add a new plugin\n\n```bash\naipm scaffold my-plugin\n```\n\nThis creates `plugins/my-plugin/` with an `aipm.config.ts` support envelope and\nskeleton manifests for each declared target, and registers the plugin in the\nrepo-root marketplace registries.\n\n### Build generated artifacts\n\n```bash\naipm build\n```\n\n`aipm build` regenerates every toolkit-owned artifact:\n\n- per-plugin hook JSON (`hooks/claude.json`, `hooks/hooks.json`);\n- the standalone bundles under `dist/gemini/` and `dist/kiro/`;\n- the marketplace registries (`.claude-plugin/marketplace.json`,\n  `.cursor-plugin/marketplace.json`) — generated from `aipm.workspace.ts` plus\n  each plugin's `aipm.config.ts` (see [Marketplace metadata](#marketplace-metadata-and-generated-registries));\n- for a single-plugin marketplace, the **repo-root Gemini extension and Kiro\n  power** (`gemini-extension.json`, `GEMINI.md`, `POWER.md`, `commands/`,\n  `skills/`, `steering/`, `.kiro/`, …) so the repo installs natively into hosts\n  that have no marketplace concept.\n\nBoth authored sources and generated outputs are committed, so plugins stay\nbrowsable on GitHub and pull-request diffs stay honest.\n\n### Validate\n\n```bash\naipm validate\n```\n\nValidation checks the support envelope, every target manifest's schema,\ncross-target name consistency, MCP server-key sync, marketplace registration,\nand freshness — that the committed generated artifacts (registries, bundles,\nand the repo-root Gemini/Kiro emission) match what `aipm build` would produce.\n\n`package.json` exposes these as `pnpm build`, `pnpm check`, and\n`pnpm scaffold` if you prefer the npm-script entry points.\n\n## The support envelope\n\nEach plugin declares the targets it supports in `plugins/<name>/aipm.config.ts`:\n\n```ts\nimport { defineConfig } from '@ai-plugin-marketplace/core';\n\nexport default defineConfig({\n  version: '0.1.0',\n  targets: ['claude', 'cursor', 'gemini', 'kiro', 'vercel'],\n});\n```\n\nThe toolkit emits artifacts only for declared targets and refuses to validate a\nplugin that carries files for a target outside its envelope. To expand a\nplugin's envelope, run `aipm add-target <plugin> <target>` to scaffold the\nskeleton files for a new target, then fill in the manifest fields.\n\n## Marketplace metadata and generated registries\n\nRepo-level marketplace metadata lives in `aipm.workspace.ts` at the repo root:\n\n```ts\nimport { defineWorkspace } from '@ai-plugin-marketplace/core';\n\nexport default defineWorkspace({\n  marketplace: {\n    name: 'ai-plugin-marketplace',\n    owner: { name: 'AI Plugin Marketplace Template' },\n    description: 'Universal AI Plugin Marketplace — author once, distribute to all platforms',\n  },\n});\n```\n\nThe **presence of this file opts the repo into generated registries.** Instead\nof hand-maintaining `.claude-plugin/marketplace.json` and\n`.cursor-plugin/marketplace.json`, `aipm build` generates them from the\nworkspace metadata plus each plugin's `aipm.config.ts` (its `description` and\n`keywords` become the registry entry's `description` and `tags`). The generated\nregistries are committed and freshness-checked like every other artifact.\n\n### Gemini and Kiro: the single-plugin marketplace\n\nGemini CLI and Kiro have **no marketplace concept** — a repo is installed as one\nextension (Gemini) or one power (Kiro) from its root. So when a marketplace\nexposes **exactly one plugin**, `aipm build` additionally emits that plugin's\nGemini/Kiro artifacts at the **repo root** (`gemini-extension.json`, `GEMINI.md`,\n`POWER.md`, `commands/`, `skills/`, `steering/`, `.kiro/`), letting the repo\ninstall natively into those hosts. A sidecar at `.aipm/generated-root.json`\nrecords exactly which root paths the toolkit owns.\n\nIf you add a **second plugin**, the repo can no longer be a single Gemini/Kiro\nartifact: `aipm validate` reports a `single-artifact-host` finding, and you keep\nfull Claude/Cursor marketplace support (which can host many plugins) while\nchoosing one plugin to expose to Gemini/Kiro. Because the repo root is the\nsingle Gemini/Kiro artifact, the plugin does **not** carry its own `LICENSE` or\n`README.md` — the repo-root `LICENSE`/`README.md` are canonical and are never\noverwritten by generation.\n\n## Repository structure\n\n```\n.\n├── aipm.workspace.ts        # Marketplace metadata (opts into generated registries)\n├── .claude-plugin/\n│   └── marketplace.json     # Claude Code registry (GENERATED)\n├── .cursor-plugin/\n│   └── marketplace.json     # Cursor registry (GENERATED)\n├── plugins/\n│   └── <plugin-name>/       # One directory per plugin (authored sources)\n│       ├── aipm.config.ts   # Support envelope + version + description/keywords\n│       └── ...              # Manifests, agents, skills, commands, hooks, rules\n├── dist/                    # Generated standalone bundles (committed)\n│   ├── gemini/\n│   └── kiro/\n│\n│   # Repo-root Gemini/Kiro artifacts — emitted for a single-plugin marketplace\n│   # (GENERATED; tracked in .aipm/generated-root.json):\n├── gemini-extension.json\n├── GEMINI.md\n├── POWER.md\n├── commands/  skills/  steering/  agents/  hooks/  mcp.json  .kiro/\n├── .aipm/\n│   └── generated-root.json  # Records which repo-root paths the toolkit owns\n│\n├── package.json             # Depends on @ai-plugin-marketplace/cli + core\n├── LICENSE                  # Canonical — also serves the Gemini/Kiro artifact\n└── README.md                # Canonical — also serves the Gemini/Kiro artifact\n```\n\n## Upgrading the toolkit\n\nBecause the build logic lives in npm packages, upgrading is a routine\ndependency bump — no copied scripts to reconcile:\n\n```bash\npnpm up @ai-plugin-marketplace/cli @ai-plugin-marketplace/core\naipm build\ngit commit -am \"chore: upgrade @ai-plugin-marketplace\"\n```\n\nA minor or patch toolkit upgrade never requires you to change your plugin\nmanifests. Major upgrades may ask you to run `aipm migrate`; the CLI tells you\nwhen.\n\n## Example plugin: skill-evaluator\n\nThe included `skill-evaluator` plugin demonstrates the full multi-platform\npattern end-to-end. Given a skill (`SKILL.md`) and a set of test cases, it:\n\n1. runs the skill with blind test-subject agents at different model tiers\n   (opus → sonnet → haiku);\n2. compares outputs against expected outcomes;\n3. identifies where skill clarity degrades at lower tiers;\n4. generates actionable refinement recommendations.\n\nInvoke it in any host with `/evaluate path/to/SKILL.md path/to/test-cases.json`,\nwhere each test case is `{ \"input\": \"...\", \"expectedOutcome\": \"...\" }`. The skill\ndefinition lives at\n[plugins/skill-evaluator/skills/evaluate-skill/SKILL.md](plugins/skill-evaluator/skills/evaluate-skill/SKILL.md).\n\n## License\n\nMIT — see [LICENSE](LICENSE).\n",
  "bytes": 8277,
  "sha": "2c55920c019dff0e3043feb2af85315fc62fb7d47e94e01dbf1bfa32c00dfbef",
  "repo_slug": "ai-plugin-marketplace/template",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/plg_ai_plugin_marketplace_template_48c03e17/readme"
}