
If you've ever hand-edited version strings across package.json, marketplace.json, and three different plugin manifests only to realize you missed one and broke your npm publish, this automates all of it. It handles semantic versioning bumps, syncs seven different config files (yes, seven), runs build verification, publishes to npm so npx resolves correctly, creates git tags, pushes GitHub releases, and regenerates your changelog from the API. The workflow is opinionated and thorough, right down to requiring a clean git status at the end and running Discord notifications from a specific directory. Built for Claude Code plugins but the pattern works for any multi-manifest project where version drift causes real pain.
$ npx -y skills add thedotmack/claude-mem --skill claude-code-plugin-release --agent claude-codeInstalls into .claude/skills of the current project.
IMPORTANT: Plan and write detailed release notes before starting.
CRITICAL: Commit EVERYTHING (including build artifacts). At the end of this workflow, NOTHING should be left uncommitted or unpushed. Run git status at the end to verify.
Analyze: Determine if the change is PATCH (bug fixes), MINOR (features), or MAJOR (breaking).
Environment: Identify repository owner/name from git remote -v.
Paths — every file that carries the version string:
package.json — the npm/npx-published version (npx claude-mem@X.Y.Z resolves from this)plugin/package.json — bundled plugin runtime deps.claude-plugin/marketplace.json — version inside plugins[0].version.claude-plugin/plugin.json — top-level Claude-plugin manifestplugin/.claude-plugin/plugin.json — bundled Claude-plugin manifest.codex-plugin/plugin.json — Codex-plugin manifestplugin/.codex-plugin/plugin.json — bundled Codex-plugin manifest.qoder-plugin/plugin.json — Qoder plugin manifestplugin/.qoder-plugin/plugin.json — bundled Qoder plugin manifestopenclaw/openclaw.plugin.json — OpenClaw plugin manifest.grok-plugin/plugin.json — Grok plugin manifestclaude-mem-cursor/.cursor-plugin/plugin.json — Cursor plugin manifestclaude-mem-grok-bot/.cursor-plugin/plugin.json — Grok Bot Cursor plugin manifestdsh/package.json — bundled DSH plugin packageREADME.md — the version badge (version-X.Y.Z-green), not a "version" keyVerify coverage before editing: git grep -l "\"version\": \"<OLD>\"" should list the fourteen JSON files above, and git grep -n "version-<OLD>-green" the README badge. If a new manifest has been added since this doc was last updated, update this list.
docs/CHANGELOG.md — it's regenerated.git grep -n "\"version\": \"<NEW>\"" — confirm all fourteen JSON files match, and the README badge reads version-<NEW>-green. git grep -n "\"version\": \"<OLD>\"" — should return zero hits.npm run build-and-sync to regenerate artifacts, sync the local marketplace copy, restart the worker, and clear the queue. Do not use plain npm run build for release validation because it can leave the local marketplace/worker out of sync.git add -A && git commit -m "chore: bump version to X.Y.Z".git tag -a vX.Y.Z -m "Version X.Y.Z".git push origin main && git push origin vX.Y.Z.gh release create vX.Y.Z --title "vX.Y.Z" --notes "RELEASE_NOTES".npm run changelog:generate
(Runs node scripts/generate-changelog.js, which pulls releases from the GitHub API and rewrites docs/CHANGELOG.md.)docs/CHANGELOG.md.vX.Y.Z tag triggers
.github/workflows/npm-publish.yml, which builds, runs the clean-room smoke
and publishes through npm trusted publishing (GitHub OIDC), so it needs no
npm token. Watch the run:
gh run list --workflow npm-publish.yml --branch vX.Y.Z # tag runs report the tag as their branch
gh run watch <run-id> --exit-status
Do not run npm publish locally, even if a local npm login works: the
workflow is the only publish path, and only it attaches provenance.
If the run fails, read the failing step with gh run view <run-id> --log-failed.
A transient failure (network, registry outage) is re-run with
gh run rerun <run-id>; a re-run builds the same tagged commit, so a fix in
the code or workflow ships through a PR and the next patch release instead.
Never move or recreate a pushed tag.
The trusted publisher lives on npmjs.com → claude-mem → Settings →
Trusted Publisher (GitHub Actions, thedotmack/claude-mem, npm-publish.yml,
npm publish allowed). Renaming the workflow file breaks publishing until
that entry is updated; changing it requires the maintainer's security key.npm view claude-mem@X.Y.Z version
npm view claude-mem dist-tags.latest
npm view claude-mem@X.Y.Z dist.attestations --json # provenance from the workflow
Then post the release to X, only after npm verification:
@Claude_Memory.
If no browser is logged in, or the account is a different one, skip the
post and say so in the release report. Never sign in or switch accounts.git status — working tree must be clean and everything must
be pushed.git grep for old version returns zero hitsnpm run build-and-sync succeededdocs/CHANGELOG.md updated and pushedPublish to npm workflow run for the tag succeeded (no local npm publish)latest both verified after publishing@Claude_Memory with a generated image after npm verification (or skipped because no browser was logged in as that account)git status shows clean treeSponsors