Version Bump & Release Workflow
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.
Preparation
-
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.Zresolves from this)plugin/package.json— bundled plugin runtime deps.claude-plugin/marketplace.json— version insideplugins[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"key
Verify coverage before editing:
git grep -l "\"version\": \"<OLD>\""should list the fourteen JSON files above, andgit grep -n "version-<OLD>-green"the README badge. If a new manifest has been added since this doc was last updated, update this list.
Workflow
- Update: Increment the version string in every path above. Do NOT touch
CHANGELOG.md— it's regenerated. - Verify:
git grep -n "\"version\": \"<NEW>\""— confirm all fourteen JSON files match, and the README badge readsversion-<NEW>-green.git grep -n "\"version\": \"<OLD>\""— should return zero hits. - Build and sync:
npm run build-and-syncto regenerate artifacts, sync the local marketplace copy, restart the worker, and clear the queue. Do not use plainnpm run buildfor release validation because it can leave the local marketplace/worker out of sync. - Commit:
git add -A && git commit -m "chore: bump version to X.Y.Z". - Tag:
git tag -a vX.Y.Z -m "Version X.Y.Z". - Push:
git push origin main && git push origin vX.Y.Z. - GitHub release:
gh release create vX.Y.Z --title "vX.Y.Z" --notes "RELEASE_NOTES". - Changelog: Regenerate via the project's changelog script:
(Runsnpm run changelog:generatenode scripts/generate-changelog.js, which pulls releases from the GitHub API and rewritesCHANGELOG.md.) - Sync changelog: Commit and push the updated
CHANGELOG.md. - Pre-publish audit: Verify the release commit, tag, GitHub release, and
changelog are pushed; confirm the release worktree has no pending tracked
changes; and ensure its build dependencies are present because
prepublishOnlyrebuilds the package. Ifnpm view claude-mem@X.Y.Z versionalready resolves, skip the publish and continue with post-publish checks. - Publish to npm — the agent runs it. The old "human handoff" rule is
obsolete: the maintainer allows agents to publish. The token is a
30-day granular npm token (read/write on
claude-memonly, bypass 2FA) in the maintainer's Mac~/.npmrc; he issues a new one every month. It is deliberately NOT in any backup (grok-bot-backups excludes secrets), so do not go looking for it elsewhere. Publish from a clean worktree of the tag (inside the project's.scratch/) so uncommitted edits never ship:
Ifgit worktree add --detach .scratch/release-X.Y.Z vX.Y.Z cd .scratch/release-X.Y.Z && npm install --ignore-scripts npm whoami # must print thedotmack; 401 = token expired npm publish --access public # prepublishOnly rebuilds the packagenpm whoamifails, the monthly token has expired. Finish every other step, then: open https://www.npmjs.com/settings/thedotmack/tokens/granular-access-tokens/new for the maintainer (open <url>), replace the token value in~/.npmrcwithPASTE_NEW_TOKEN_HERE, andopen -e ~/.npmrcso he can paste the new token there. Never ask for the token in chat. Re-runnpm whoami, then publish. Do not wait on.github/workflows/npm-publish.yml— itsNPM_TOKENsecret has failed every tag since v13.26.1 (E404 ... PUT https://registry.npmjs.org/claude-mem). The publish rebuild rewritesplugin/scripts/*.cjswith minifier-name churn only; discard it with the worktree (git worktree remove --force). - Post-publish verification and notification: After publishing, verify
both the exact version and the latest dist-tag:
If the publish build touched tracked artifacts, runnpm view claude-mem@X.Y.Z version npm view claude-mem versionnpm run build-and-sync, review the result, and commit/push any legitimate changes. Then run the Discord notification from~/Scripts/claude-mem/, where the.envwith webhook details lives:
Do this only after npm verification, and even when the release worktree does not have a localcd ~/Scripts/claude-mem/ && npm run discord:notify vX.Y.Z.env. - Finalize:
git status— working tree must be clean and everything must be pushed.
Checklist
- All fifteen version files (fourteen JSON manifests and the README badge) have matching versions
-
git grepfor old version returns zero hits -
npm run build-and-syncsucceeded - Git tag created and pushed
- GitHub release created with notes
-
CHANGELOG.mdupdated and pushed - Pre-publish audit passed
-
npm whoamisucceeded and the agent rannpm publish --access public - Exact npm version and
latestboth verified after publishing - Discord notification run from
~/Scripts/claude-mem/only after npm verification -
git statusshows clean tree
