plugins/ed3d-extending-claude/skills/maintaining-a-marketplace/SKILL.md
Use when creating, releasing, or maintaining a Claude Code Plugin Marketplace - covers marketplace.json schema, version management, release checklists, changelog conventions, and validation to prevent sync drift between plugin.json and marketplace.json
npx skillsauth add ed3dai/ed3d-plugins-testing maintaining-a-marketplaceInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
A Claude Code Plugin Marketplace is a git repository containing .claude-plugin/marketplace.json that catalogs plugins for discovery and installation. The primary maintenance challenge is sync drift — keeping versions, descriptions, and metadata consistent across plugin.json, marketplace.json, and CHANGELOG.md.
my-marketplace/
.claude-plugin/
marketplace.json # Required: marketplace catalog
plugins/
plugin-a/
.claude-plugin/
plugin.json # Required: plugin manifest
skills/
commands/
agents/
plugin-b/
.claude-plugin/
plugin.json
{
"$schema": "https://anthropic.com/claude-code/marketplace.schema.json",
"name": "my-marketplace",
"owner": {
"name": "Your Name",
"email": "[email protected]"
},
"metadata": {
"description": "Brief marketplace description",
"version": "1.0.0",
"pluginRoot": "./plugins"
},
"plugins": [
{
"name": "my-plugin",
"source": "./plugins/my-plugin",
"description": "What this plugin does",
"version": "1.0.0",
"author": {
"name": "Your Name",
"email": "[email protected]"
},
"license": "MIT",
"keywords": ["category1", "category2"],
"category": "development"
}
]
}
Required fields:
name — Kebab-case marketplace identifier. Users see this: /plugin install my-tool@marketplace-nameowner.name — Maintainer name (string, not bare string for owner)plugins — Array of plugin entriesEach plugin entry requires:
name — Kebab-case plugin identifiersource — Where to fetch the plugin (see Source Formats below)Common optional fields: description, version, author, license, keywords, category, tags, homepage, repository
Fields that DO NOT exist (do not invent these): displayName, installUrl, path, marketplace (as wrapper object)
// Relative path (monorepo — only works with git-based marketplace add)
"source": "./plugins/my-plugin"
// GitHub repository
"source": { "source": "github", "repo": "owner/repo" }
// GitHub with pinned version
"source": { "source": "github", "repo": "owner/repo", "ref": "v2.0.0", "sha": "a1b2c3..." }
// Git URL (GitLab, Bitbucket, self-hosted)
"source": { "source": "url", "url": "https://gitlab.com/team/plugin.git" }
When releasing a new plugin version, update these files in this order:
plugins/<name>/.claude-plugin/plugin.json — Bump version.claude-plugin/marketplace.json — Update matching plugin entry's version to the same valueCHANGELOG.md — Add entry at the top (after # Changelog heading)claude plugin validate . or /plugin validate . from the marketplace root## plugin-name X.Y.Z
Brief description of the release (1-2 sentences).
**New:**
- Specific new features or additions
**Changed:**
- Modifications to existing behavior
**Fixed:**
- Bug fixes
Only include sections that apply. Be specific — "Added code-review-checklist skill for systematic code review" not "Added new skill."
After editing, verify these match:
plugins/<name>/.claude-plugin/plugin.json → version.claude-plugin/marketplace.json → plugin entry's versionCHANGELOG.md → entry header ## plugin-name X.Y.ZAll three MUST show the same version string.
.claude-plugin/marketplace.jsonname and source at minimum$schema field for validationclaude plugin validate ./plugin marketplace add ./my-marketplaceplugin.json to extract metadataplugins array in marketplace.json with fields matching plugin.jsonclaude plugin validate .Users add your marketplace by its git location:
# GitHub
/plugin marketplace add owner/repo
# Other git hosts
/plugin marketplace add https://gitlab.com/company/plugins.git
# Specific branch/tag
/plugin marketplace add https://gitlab.com/company/plugins.git#v1.0.0
# Local (development)
/plugin marketplace add ./my-marketplace
Users install plugins from your marketplace:
/plugin install plugin-name@marketplace-name
/plugin → Marketplaces tabAdd to .claude/settings.json in a project repo to prompt team members to install:
{
"extraKnownMarketplaces": {
"company-tools": {
"source": { "source": "github", "repo": "your-org/claude-plugins" }
}
},
"enabledPlugins": {
"formatter@company-tools": true
}
}
Manual install uses existing git credential helpers. For background auto-updates, set environment tokens:
| Provider | Variables |
|----------|-----------|
| GitHub | GITHUB_TOKEN or GH_TOKEN |
| GitLab | GITLAB_TOKEN or GL_TOKEN |
| Bitbucket | BITBUCKET_TOKEN |
| Mistake | Symptom | Fix |
|---------|---------|-----|
| Version drift between plugin.json and marketplace.json | Old version installed despite push | Verify both files show same version |
| Skipping validation | JSON syntax errors, missing fields | Run claude plugin validate . before every push |
| Generic changelog entries | Users can't evaluate upgrade value | Describe specific changes, name affected skills/agents |
| Inventing schema fields | Validation errors, plugins not found | Only use fields from the schema above |
| Using owner as string | Validation error | owner must be object: {"name": "...", "email": "..."} |
| Missing source in plugin entry | Plugin can't be installed | Every plugin entry needs source |
| Relative paths in URL-based marketplace | "path not found" errors | Only use relative paths with git-based marketplace add |
| Not committing all sync files together | Partial release, version mismatch | Single commit for plugin.json + marketplace.json + CHANGELOG.md |
| Forgetting to push | Local changes, users see old version | Commit AND push after release |
| Task | Files to Touch |
|------|---------------|
| New plugin version | plugin.json + marketplace.json + CHANGELOG.md |
| New plugin added | marketplace.json + CHANGELOG.md |
| New marketplace | .claude-plugin/marketplace.json only |
| Description update | plugin.json + marketplace.json (keep in sync) |
| Validate | claude plugin validate . or /plugin validate . |
development
Use when the user wants to review a Claude Code session for quality — analyzes the current session (or a specified transcript path) for prompting effectiveness, agent performance, and environment gaps, producing actionable recommendations
development
Use when the user wants to review their recent Claude Code sessions for patterns — analyzes the last N sessions (default 5) in the current project, dispatching parallel reviewers per session, then synthesizing cross-session findings
tools
Use when the user wants to export a Claude Code session transcript as a readable Markdown file — converts the current session (or a specified transcript path) into GitHub-flavored Markdown with metadata header, collapsible tool results, and thinking blocks
development
Use when planning features and need current API docs, library patterns, or external knowledge; when testing hypotheses about technology choices or claims; when verifying assumptions before design decisions - gathers well-sourced, current information from the internet to inform technical decisions