This document describes the correct process for releasing a new version of a plugin in the MAG Claude Plugins marketplace.
Claude Code plugin discovery works through TWO configuration files:
plugins/{plugin-name}/plugin.json- The plugin's own version metadata.claude-plugin/marketplace.json- The marketplace catalog (what users see when browsing)
BOTH must be updated for a version bump to be visible to users!
Files to update:
-
plugins/{plugin-name}/plugin.json- Updateversionfield -
plugins/{plugin-name}/agents/*.md- Add new agents (if any) -
plugins/{plugin-name}/commands/*.md- Update commands (if any) - Any other plugin-specific files
Files to update:
-
CHANGELOG.md- Add new version entry -
RELEASES.md- Add detailed release notes -
CLAUDE.md- Update version references- Current version number
- Latest changes section
- Git tag reference
- Last updated date
- Any new agents/commands in the list
File to update:
-
.claude-plugin/marketplace.json- Update
plugins[].versionfor the specific plugin (e.g.,"version": "3.3.0") - Update
metadata.versionfor the marketplace itself (optional, but recommended) - Update
plugins[].descriptionif the description changed
- Update
This is the most commonly forgotten step!
Without this update:
/plugin marketplace updatewon't see the new version- Users will still see the old version when browsing
- The actual plugin.json will be correct, but discovery will fail
# Commit feature changes
git add -A
git commit -m "feat({plugin-name}): v{X.Y.Z} - {Feature summary}
{Detailed description of changes}
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>"
# If you forgot marketplace.json, commit it separately
git add .claude-plugin/marketplace.json
git commit -m "fix(marketplace): Update {plugin-name} version to v{X.Y.Z}
The marketplace.json file needs to be updated alongside plugin.json
for Claude Code to discover the correct version.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>"# Tag format: plugins/{plugin-name}/v{X.Y.Z}
git tag -a plugins/{plugin-name}/v{X.Y.Z} -m "{Plugin Name} v{X.Y.Z} - {Feature Summary}
{Detailed tag message with:
- Key features
- Benefits
- New agents/commands
- Updated files
- Repository link
- License}"Examples:
plugins/frontend/v3.3.0plugins/code-analysis/v1.1.0plugins/bun/v1.2.0
# Push commits
git push origin main
# Push tag
git push origin plugins/{plugin-name}/v{X.Y.Z}Test that the update works:
# As a user, run:
/plugin marketplace update mag-claude-plugins
# Should show the new version
# If it still shows old version, you forgot to update marketplace.json!Restart Claude Code:
- The new version should be visible
- Installing/updating the plugin should use the new version
Symptom:
plugin.jsonshows v3.3.0- Users still see v3.2.0 after
/plugin marketplace update
Fix:
# Update .claude-plugin/marketplace.json
# Find the plugin entry and update "version" field
git add .claude-plugin/marketplace.json
git commit -m "fix(marketplace): Update {plugin} version to v{X.Y.Z}"
git push origin mainWrong:
frontend-v3.3.0❌v3.3.0❌frontend/v3.3.0❌
Correct:
plugins/frontend/v3.3.0✅
Problem: plugin.json says v3.3.0 but marketplace.json says v3.2.0
Fix: Always update both files in the same commit (or immediately after)
Symptom: Commit is on GitHub but no release tag
Fix:
git push origin plugins/{plugin-name}/v{X.Y.Z}Follow Semantic Versioning:
-
MAJOR (X.0.0): Breaking changes, incompatible API changes
- Example: v3.0.0 - Removed deprecated agents
-
MINOR (x.Y.0): New features, backward-compatible
- Example: v3.3.0 - Added multi-model plan review
-
PATCH (x.y.Z): Bug fixes, backward-compatible
- Example: v3.3.1 - Fixed PROXY_MODE error handling
Minimal release checklist:
- ✅ Update
plugins/{plugin}/plugin.jsonversion - ✅ Update
.claude-plugin/marketplace.jsonplugin version⚠️ CRITICAL - ✅ Update
CHANGELOG.md - ✅ Update
RELEASES.md - ✅ Update
CLAUDE.md - ✅ Commit changes
- ✅ Create git tag:
plugins/{plugin}/v{X.Y.Z} - ✅ Push commit and tag
- ✅ Verify with
/plugin marketplace update
# 1. Update files
# - plugins/frontend/plugin.json → "version": "3.3.0"
# - .claude-plugin/marketplace.json → plugins[0].version: "3.3.0"
# - CHANGELOG.md, RELEASES.md, CLAUDE.md
# 2. Commit
git add -A
git commit -m "feat(frontend): v3.3.0 - Multi-Model Plan Review (PHASE 1.5)"
# 3. Tag
git tag -a plugins/frontend/v3.3.0 -m "Frontend Plugin v3.3.0 - Multi-Model Plan Review"
# 4. Push
git push origin main
git push origin plugins/frontend/v3.3.0
# 5. Verify
# Run: /plugin marketplace update mag-claude-plugins
# Should show: frontend v3.3.0 ✅Q: Users still see old version after release
A: Check .claude-plugin/marketplace.json - the version there must match plugin.json
Q: Tag already exists error
A: Delete the old tag and recreate:
git tag -d plugins/{plugin}/v{X.Y.Z}
git push origin :refs/tags/plugins/{plugin}/v{X.Y.Z}
git tag -a plugins/{plugin}/v{X.Y.Z} -m "..."
git push origin plugins/{plugin}/v{X.Y.Z}Q: How to test locally before release?
A: Use local marketplace:
/plugin marketplace add /path/to/claude-code
/plugin install {plugin}@mag-claude-plugins- Pre-commit hook to verify marketplace.json matches plugin.json
- Release script that updates both files atomically
- GitHub Action to validate version consistency
- Automated CHANGELOG generation from commits
Maintained by: Jack Rudenko @ MadAppGang Last Updated: November 13, 2025