There are two kinds of plugin entry in marketplace.json, and they release very
differently. Check which kind you are touching before doing anything.
Each remote plugin lives in its own repo and cuts its own releases (semantic-release →
vX.Y.Z tag + GitHub Release). On release, that repo's CI opens a PR here bumping the
plugin entry's pinned source.ref to the new tag. Merging the PR publishes the new
version to everyone tracking this marketplace. main of each plugin repo is free for
work-in-progress — only tagged commits are ever served, because every entry pins a ref.
Each plugin entry uses a git-subdir source so only the plugin's subdirectory is fetched.
Some plugins live in this repo, under plugins/<name>/, and their entry uses a relative
path as its source instead of a git-subdir object. These have no separate repo, no
tag, and no pinned ref.
The consequence: there is nothing between a commit and the users. Merging to main
publishes immediately — anyone who runs /plugin marketplace update pingvinen picks up
whatever main says. So main is not a scratch area for local plugins the way it is for
remote plugin repos. Do the work on a branch and merge it when it is actually ready.
To release a change to a local plugin:
- Edit the plugin's files under
plugins/<name>/on a branch. - Bump
versionon the plugin's entry in.claude-plugin/marketplace.json. Semver by hand; nothing automates this. - Update the plugin table in
README.mdif the description or the plugin list changed. - Merge to
main. That is the release.
Users on an older copy only see the change after /plugin marketplace update pingvinen
followed by /plugin update <name>@pingvinen.