--- name: marketplace-author description: > Use when the user wants to add a plugin to the marketplace ("register my plugin", "add to marketplace", "list plugin X"), remove an entry ("unlist plugin X", "remove from marketplace"), or update an existing entry ("bump the marketplace version", "update the description for Y"). Always updates both .claude-plugin/marketplace.json and .github/plugin/marketplace.json in the same pass. Out of scope: plugin scaffold and configuration — use /plugin-author for that. Does not run `claude plugin marketplace add` or equivalent CLI registration commands — only manages `marketplace.json` entries. allowed-tools: Bash Read Write Edit metadata: category: factory source_keys: - context7-websites-code-claude - claude-code-plugins-docs - context7-github-en-copilot - github-cli-plugin-reference - github-plugins-marketplace - github-plugins-finding-installing --- ## Gotchas - Both marketplace files must be identical after every operation — never update one without the other in the same edit pass. - Every catalog mutation (ADD, REMOVE, UPDATE) requires a catalog `version` bump in both files in the same edit pass. Clients cache the catalog and use the version to detect changes — skipping the bump means the new state is invisible until a forced refresh. Convention: ADD and REMOVE → minor bump (e.g. `0.1.1` → `0.2.0`); UPDATE → patch bump (e.g. `0.2.0` → `0.2.1`). The `version` field may be at the top level or nested inside `metadata` — bump whichever form is present. - `source` for local plugins is a relative path from the marketplace root, not the plugin directory name alone (e.g. `"./plugins/kyberforge"`, not `"kyberforge"`). - The `{ "source": "github", ... }` object form is only for GitHub. For GitLab, Gitea, or any other git host, use `{ "source": "git", "url": "https://..." }` with a full URL. ## Route Determine which operation applies before touching any file: - **Neither `.claude-plugin/marketplace.json` nor `.github/plugin/marketplace.json` exist** → follow **CREATE** - **Only one file exists** → stop and note the mirror is missing; ask the user whether to create the missing mirror from the existing file, or whether this is an error. Do not proceed until both files are present or the user has explicitly directed you to create the missing one. - **Both files exist + plugin name NOT in `plugins[]` + add/register/list intent** → follow **ADD** - **Both files exist + plugin name IS in `plugins[]` + remove/unlist/delete intent** → follow **REMOVE** - **Both files exist + plugin name IS in `plugins[]` + change/update/bump intent** → follow **UPDATE** - **User asks to validate without any add/remove/update intent** → follow **VALIDATE** - **Ambiguous** → ask: "Did you mean to add a new plugin entry, update an existing one, or remove one?" --- ## CREATE Run this flow only when no marketplace.json exists anywhere in the repo. ### Prerequisites Confirm you have: - [ ] Marketplace name (kebab-case, e.g. `my-marketplace`) - [ ] Owner name (and optionally email) - [ ] Marketplace description (optional but recommended) - [ ] At least one initial plugin entry (name, source, description) If prerequisites are missing, ask before writing. ### Step 1 — Write `.claude-plugin/marketplace.json` Create the file with the following structure (fill in the values from prerequisites): ```json { "name": "", "owner": { "name": "", "email": "" }, "metadata": { "description": "", "version": "0.1.0" }, "plugins": [ { "name": "", "description": "", "source": "" } ] } ``` Omit `"email"` if not provided. Omit `"metadata.version"` if the user does not want a pinned catalog version. The `metadata` object is the Copilot CLI canonical location for top-level description and version — Claude Code accepts both `metadata`-nested and top-level forms; use `metadata` for dual-tool repos. ### Step 2 — Write `.github/plugin/marketplace.json` Write identical content to `.github/plugin/marketplace.json`. These two files must always be identical. ### Step 3 — Validate Follow the **VALIDATE** flow. --- ## ADD Run this flow when a plugin name does not yet exist in `plugins[]` and the intent is to add it. ### Prerequisites Confirm you have: - [ ] Plugin name (kebab-case; reserved prefixes `anthropic-*`, `claude-*`, `agent-skills`, `official-claude-plugins` are rejected by the validator) - [ ] Plugin description - [ ] Source type and source value (see source type branching below) - [ ] Version (optional; omit for git-sourced plugins) If you need details on a specific source type shape or per-entry optional fields, read `references/manifest-fields.md`. ### Source type branching If the user has not specified a source type, assume local path (the most common case for in-repo plugins). Only ask if the user's intent is unclear: "I'll treat this as a local path plugin — is that right, or does it live on GitHub, a git URL, or npm?" Source shapes per type: **Local path:** ```json "source": "./plugins/" ``` **GitHub:** ```json "source": { "source": "github", "repo": "owner/repo" } ``` Add `"ref": ""` inside the object if the user specifies a branch or tag. Add `"sha": ""` if pinning to an exact commit — `sha` takes precedence over `ref` when both are present. **Git URL:** ```json "source": { "source": "git", "url": "https://..." } ``` Add `"ref": ""` inside the object if specified. **npm:** ```json "source": { "source": "npm", "package": "@scope/pkg", "version": "1.0.0" } ``` `version` is required for npm source. ### Entry shape The full entry added to `plugins[]`: ```json { "name": "", "description": "", "source": } ``` Include `"version": ""` at the entry level only when the source is npm or when the user explicitly requests a pinned version in the catalog. Include `"strict": false` when the plugin is a dual Claude Code / Copilot CLI plugin — this prevents Copilot from rejecting CC-specific fields in the plugin directory. ### Step 1 — Read both files Read `.claude-plugin/marketplace.json` and `.github/plugin/marketplace.json`. Verify they are identical. If they differ, stop and report the divergence — do not proceed until the user resolves it. ### Step 2 — Add the entry Append the new entry to the end of the `plugins[]` array in `.claude-plugin/marketplace.json`. Array order is not semantically significant, but always add at the end for consistency. ### Step 3 — Mirror Apply the identical addition to `.github/plugin/marketplace.json` in the same edit pass. ### Step 4 — Bump catalog version Apply a **minor bump** to the `version` field in both files in the same edit pass (e.g. `0.1.1` → `0.2.0`). Find the field at the top level or inside `metadata` — bump whichever form is present. ### Step 5 — Validate Follow the **VALIDATE** flow. --- ## REMOVE Run this flow when an entry exists in `plugins[]` and the intent is to remove it. ### Step 1 — Confirm the target Read `.claude-plugin/marketplace.json`. Identify the entry to remove. State the full entry as it currently appears. ### Step 2 — HITL gate State the following before proceeding: > "I will remove the `` entry from both `.claude-plugin/marketplace.json` and `.github/plugin/marketplace.json`. This does not delete the plugin files. Confirm?" Do not proceed until the user confirms. If the user says "yes" or equivalent, continue to Step 3. ### Step 3 — Remove from both files Remove the entry from `plugins[]` in `.claude-plugin/marketplace.json`. Apply the identical removal to `.github/plugin/marketplace.json` in the same edit pass. ### Step 4 — Bump catalog version Apply a **minor bump** to the `version` field in both files in the same edit pass (e.g. `0.1.1` → `0.2.0`). Find the field at the top level or inside `metadata` — bump whichever form is present. ### Step 5 — Validate Follow the **VALIDATE** flow. --- ## UPDATE Run this flow when an entry exists in `plugins[]` and the intent is to change one or more fields. If you need to verify a field name or source type shape, read `references/manifest-fields.md`. ### Step 1 — Read the current entry Read `.claude-plugin/marketplace.json`. Show the current state of the target entry so the user can confirm the fields to change. ### Step 2 — Apply changes State which fields will change and to what values, then edit `.claude-plugin/marketplace.json`. Apply the identical change to `.github/plugin/marketplace.json` in the same edit pass. ### Step 3 — Bump catalog version Apply a **patch bump** to the `version` field in both files in the same edit pass (e.g. `0.2.0` → `0.2.1`). Find the field at the top level or inside `metadata` — bump whichever form is present. ### Step 4 — Validate Follow the **VALIDATE** flow. --- ## VALIDATE Run from the repo root (not from the plugin directory or `.claude-plugin/`): ```bash claude plugin validate . ``` Add `--strict` to promote warnings to errors — recommended in CI. Report the output. If validation fails, describe the specific error and what needs to be fixed. Do not attempt to auto-fix validation errors unless the fix is unambiguous (e.g. a trailing comma that violates JSON syntax); otherwise, describe the fix and ask the user to confirm.