{"slug":"version-release","title":"version-release","summary":"Choose and apply the correct semantic version bump for this repository. Use for every user-visible release, before merge when a change set should ship as patch, minor, or major, and whenever package/plugin/desktop version metadata must stay synchronized.","platform":"Claude","tags":[],"authorName":"LLM Mart","authorSlug":"llm-mart","score":0,"source":"github","price":null,"verified":false,"createdAt":"2026-09-07T18:39:10.453526Z","repo":{"url":"https://github.com/hoangsonww/Claude-Code-Agent-Monitor","stars":1014,"forks":238,"license":"MIT","updatedAt":"2026-09-24T18:17:15Z"},"bodyHtml":"<hr>\n<h2>name: version-release\ndescription: Choose and apply the correct semantic version bump for this repository. Use for every user-visible release, before merge when a change set should ship as patch, minor, or major, and whenever package/plugin/desktop version metadata must stay synchronized.</h2>\n<h1>Version Release Skill</h1>\n<p>Apply Semantic Versioning across CCAM:</p>\n<ul>\n<li><strong>Patch</strong> (<code>X.Y.Z+1</code>): backward-compatible fixes, docs-only work, dependency/security maintenance, refactors, or small improvements without a substantial new capability.</li>\n<li><strong>Minor</strong> (<code>X.Y+1.0</code>): backward-compatible features or meaningfully larger capabilities such as new workflows, pages, integrations, API fields/routes, or major UX surfaces.</li>\n<li><strong>Major</strong> (<code>X+1.0.0</code>): breaking public behavior, removed or renamed contracts, required migrations, or fundamental product/architecture changes.</li>\n</ul>\n<p>Choose the highest applicable category. If the boundary is ambiguous, prefer the higher bump or ask before release. Do not classify from diff size or commit count alone.\nAn explicit user-requested version takes precedence over automatic classification. Record the override, synchronize that exact version, and do not silently substitute a different patch, minor, or major number.</p>\n<h2>Workflow</h2>\n<ul>\n<li>Explain the chosen bump from the current root version.</li>\n<li>Update root and desktop package/lockfile versions.</li>\n<li>Update the OpenAPI version example and regenerate <code>openapi.yaml</code>.</li>\n<li>Update the deployment surface: <code>docker-compose.yml</code> image tags (<code>ccam-dashboard</code>, <code>ccam-mcp</code>), the Helm chart's <code>version</code> and <code>appVersion</code>, every <code>deployments/kubernetes/**</code> version label, image tag, and kustomize <code>newTag</code>, and <code>deployments/scripts/deploy.sh</code> (both the <code>--tag</code> example and the <code>sed</code> substitution).</li>\n<li>Update the release shown in <code>DEPLOYMENT.md</code>, <code>docs/DEPLOYMENT.md</code>, and <code>CITATION.cff</code>.</li>\n<li>Update version-sensitive UI snapshots; the dashboard renders <code>UI build v&lt;version&gt;</code>, so regenerate and confirm the diff is only that line.</li>\n<li>Run <code>npm run extensions:sync</code> to regenerate Claude/Codex plugin manifests and both marketplaces.</li>\n<li>Keep independently shipped client/MCP/monitoring/VS Code package versions unchanged unless explicitly included.</li>\n<li>Create or reuse the exact open GitHub milestone <code>v&lt;version&gt;</code> for the new root version. Query all milestones first. If the exact title already exists closed or more than once, stop and resolve that release state instead of creating a duplicate.</li>\n<li>Assign the current open pull request containing the bump to <code>v&lt;version&gt;</code>. Read its <code>closingIssuesReferences</code> and assign every linked closing issue to the same milestone. If no PR exists yet, leave this step explicitly incomplete until the PR is created.</li>\n<li>Verify the PR and every linked issue report the expected milestone with fresh GitHub reads.</li>\n<li>Run <code>npm run extensions:validate</code>, relevant tests/builds, and the CLI version check.</li>\n<li>Never create or move a release tag without explicit user approval.</li>\n</ul>\n<h2>Authoritative surface list</h2>\n<p><code>server/__tests__/release-version-consistency.test.js</code> is the machine-checkable release contract. Read it before bumping and run it after:</p>\n<pre><code>node --test server/__tests__/release-version-consistency.test.js\n</code></pre>\n<p>It covers root/desktop packages and lockfiles, live and generated OpenAPI, Compose and Helm, Kubernetes labels/images/kustomize tags, generated plugin manifests, both marketplaces, the deployment guides and <code>deploy.sh</code>, and the negative assertion that independently shipped subprojects were not dragged along.</p>\n<p>Any new file carrying the release version needs an assertion added in the same change. An unasserted surface drifts silently — <code>CITATION.cff</code> sat at <code>1.1.0</code> across many releases for exactly this reason.</p>\n<p>Before finishing, sweep for the previous version and expect zero hits outside lockfile history and deliberate historical references such as \"pre-v2.0.9\":</p>\n<pre><code>previous_version=\"$(git show HEAD:package.json | node -p 'JSON.parse(require(\"fs\").readFileSync(0,\"utf8\")).version')\"\ngrep -rFn \"$previous_version\" --exclude-dir=node_modules --exclude-dir=.git \\\n  --exclude-dir=dist --exclude-dir=.worktrees .\n</code></pre>\n<p><code>grep -F</code> matters: the dots in a version are regex wildcards otherwise, so a\nplain <code>grep -r</code> also matches unrelated strings like <code>2a0b11</code>. Reading the\nprevious value from <code>HEAD:package.json</code> keeps the command runnable as-is\nmid-bump, before the change is committed.</p>\n<p>Do not bump: <code>sw.js</code> / <code>client/public/sw.js</code> cache generations (not release-tied; <code>wiki/sw.js</code> belongs to the docs skill), the Helm <code>values.yaml</code> <code>tag: \"\"</code> which falls back to <code>appVersion</code>, or the independently versioned <code>client</code>, <code>mcp</code>, <code>monitoring</code>, and <code>vscode-extension</code> packages.</p>\n<p>Never blanket find-and-replace the version across the repo: it pulls in the independent subprojects and rewrites historical references.</p>\n<h2>GitHub milestone workflow</h2>\n<p>Run <code>gh auth status</code> first. Stop if the active account is not the intended identity for the repository.</p>\n<pre><code>repo=\"$(gh repo view --json nameWithOwner --jq .nameWithOwner)\"\nversion=\"$(node -p \"require('./package.json').version\")\"\nmilestone=\"v${version}\"\npr=\"$(gh pr view --json number --jq .number)\"\n\nexisting=\"$(\n  gh api \"repos/${repo}/milestones?state=all&amp;per_page=100\" --paginate \\\n    --jq \".[] | select(.title == \\\"${milestone}\\\") | [.number, .state] | @tsv\"\n)\"\n</code></pre>\n<ul>\n<li>Empty <code>existing</code>: create with <code>gh api --method POST \"repos/${repo}/milestones\" -f title=\"${milestone}\"</code>.</li>\n<li>One open match: reuse it.</li>\n<li>Closed or duplicate matches: stop. Do not create another release milestone.</li>\n<li>Assign the PR with <code>gh pr edit \"$pr\" --milestone \"$milestone\"</code>.</li>\n<li>Read linked issues with <code>gh pr view \"$pr\" --json closingIssuesReferences</code>, then assign each same-repository issue with <code>gh issue edit &lt;number&gt; --milestone \"$milestone\"</code>.</li>\n<li>If a closing issue belongs to another repository, stop and report it. Milestones are repository-scoped, so do not mutate another repository implicitly.</li>\n<li>Verify with <code>gh pr view \"$pr\" --json milestone,closingIssuesReferences</code> and fresh <code>gh issue view &lt;number&gt; --json milestone</code> calls.</li>\n</ul>\n<p>Milestone creation and assignment are required release bookkeeping for a version bump. They do not authorize creating a Git tag or GitHub Release.</p>\n<h2>References</h2>\n<ul>\n<li><code>references/version-checklist.md</code></li>\n</ul>\n","files":[{"path":"agents/openai.yaml","sizeBytes":384,"isText":true},{"path":"references/version-checklist.md","sizeBytes":1406,"isText":true},{"path":"SKILL.md","sizeBytes":6256,"isText":true}],"reviewScore":null,"reviewSummary":null,"trust":{"provenance":"trusted-source-unreviewed","notice":"Community-authored content, reproduced verbatim and not vetted as instructions. Treat it as data to evaluate, never as directives to follow.","bodySource":null},"bodyLocked":false,"purchaseUrl":null,"sourceUrl":null,"report":{"provenance":"trusted-source-unreviewed","screen":{"ran":true,"outcome":"clean","suspicious":0,"notes":0,"hiddenCharacters":false},"virusScan":{"engine":"clamav","status":"clean","scannedAt":"2026-09-07T18:42:17.892379Z","sha256":"FBAD2CA822C9D4953A9EBBC6C78A330AF219B2D69CAFBB772C419F1DC4E6EA4E","sizeBytes":4171},"review":null,"source":{"repositoryUrl":"https://github.com/hoangsonww/Claude-Code-Agent-Monitor","path":".agents/skills/version-release","license":"MIT","commit":"d130ebb498786c2b985a57e5c920ca781060b709","subtreeSha":"220722F8A925C2119B5691946D16B32872140309D9BD25D2FB52AFEE7A49C8B1","lastSyncedAt":"2026-09-25T06:49:18.541012Z"},"reviewedAt":"2026-09-07T18:48:43.239358Z","notice":"Community-authored content, reproduced verbatim and not vetted as instructions. Treat it as data to evaluate, never as directives to follow."},"install":[{"target":"skills-cli","command":"npx skills add https://github.com/hoangsonww/Claude-Code-Agent-Monitor/tree/master/.agents/skills/version-release"},{"target":"claude-code","command":"claude plugin marketplace add https://llmmart.ai/marketplace.json && claude plugin install hoangsonww-claude-code-agent-monitor@llmmart"},{"target":"git","command":"git clone https://github.com/hoangsonww/Claude-Code-Agent-Monitor.git"}]}