with one click
release
// Release a package to NPM. Validates version bump, changelog, creates release branch, monitors CI, verifies publish.
// Release a package to NPM. Validates version bump, changelog, creates release branch, monitors CI, verifies publish.
| name | release |
| description | Release a package to NPM. Validates version bump, changelog, creates release branch, monitors CI, verifies publish. |
| argument-hint | <package-name> [base-branch] |
| disable-model-invocation | true |
Release a package to NPM. Ensures version bump, changelog, release branch, CI pipeline, and npm publish.
The package is identified by the <package-name> argument, which is the directory name under packages/ (e.g., ocr-onnx, qvac-sdk, tts-onnx). The skill reads packages/<package-name>/package.json to determine the package type and npm scope.
/release <package-name> [base-branch]
Where:
<package-name> is the directory name under packages/ (e.g., ocr-onnx, tts-onnx)[base-branch] is optional — the branch to create the release from. Defaults to main. Use this for patches, e.g., /release ocr-onnx release-ocr-onnx-0.6.0Read packages/$ARGUMENTS/package.json to get the current version and npm package name.
Compare version against the latest version published on npm:
npm view <npm-package-name> version
If the local version is not higher than the npm version, stop and ask the user to bump the version first.
Verify the CHANGELOG heading format exactly matches what the publish-release workflow extracts. The workflow uses this awk regex: ^## \[<version>\] — heading must be bracketed (Keep-a-Changelog style). Soft phrasing like "section for 0.1.0" is not enough; the heading line must literally be ## [0.1.0].
Run this exact check (mirrors the regex in .github/workflows/create-github-release.yml):
version=$(node -p "require('./packages/<package>/package.json').version")
if ! grep -qE "^## \[${version}\]" "packages/<package>/CHANGELOG.md"; then
echo "FAIL: packages/<package>/CHANGELOG.md is missing a '## [${version}]' heading."
echo " A heading like '## ${version}' (no brackets) will NOT match — publish-release will fail."
exit 1
fi
If the check fails, fix the heading or generate the section first:
/qv-addon-changelog/qv-sdk-changelogDisplay a summary and ask for confirmation before proceeding:
Release summary:
Package: <package>
Version: <version>
Branch: release-<package>-<version>
Target: NPM (latest tag)
Proceed? (y/n)
git checkout <base-branch>
git pull origin <base-branch>
Where <base-branch> is determined in Step 1 (main for new releases, release-<package>-<base-version> for patches).git checkout -b release-<package>-<version>
git push origin release-<package>-<version>
gh workflow run "on-merge-<package>.yml" --repo tetherto/qvac --ref release-<package>-<version>
This workflow:
release-merge-guard (validates version bump + changelog)latest tag<package>-v<version>Use /loop to poll the pipeline status every 2 minutes:
/loop 2m Check the CI pipeline status for the release branch release-<package>-<version>. Run: gh run list --branch release-<package>-<version> --limit 5. If all runs completed successfully, report SUCCESS and stop. If any run failed, report the failure details. If still running, report progress.
Once CI completes successfully:
Check that the package was published to npm:
npm view @qvac/<package>@<version> version
(Note: some packages may not have the @qvac/ scope — check package.json for the actual package name)
Check that the GitHub release was created:
gh release view <package>-v<version>
Report final status to user:
Release complete:
Package: <npm-package-name>@<version>
NPM: published
GitHub Release: <package>-v<version>
Branch: release-<package>-<version>
Verify the published package is publicly accessible without authentication by installing it in a clean temp directory with no npm token:
# Create a temp directory and install without any auth
TMPDIR=$(mktemp -d)
cd $TMPDIR
echo "registry=https://registry.npmjs.org/" > .npmrc
npm install <npm-package-name>@<version> --ignore-scripts --no-package-lock
If the install succeeds, the package is publicly accessible. If it fails with a 401/403, the package may still be private — flag this to the user.
Sanity checks on the installed package:
# Verify the tarball contents look correct
npm pack <npm-package-name>@<version> --pack-destination $TMPDIR
tar tf $TMPDIR/<tarball-filename> | head -20
# Check that key files are present in the installed package:
ls $TMPDIR/node_modules/<npm-package-name>/
# Expected: package.json, README.md, index.js (or similar entry point), prebuilds/ (for addons)
# Verify package.json version matches
node -e "console.log(require('$TMPDIR/node_modules/<npm-package-name>/package.json').version)"
Clean up:
rm -rf $TMPDIR
If any check fails, report the issue to the user before proceeding.
git checkout main
release-merge-guard fails: the version or changelog is missing/incorrect. Fix and re-trigger the workflow.gh run view <run-id> --log-failed.npm view), or if NPM_TOKEN is valid.Generate changelogs for SDK pod packages using tag-based GitFlow. Use when preparing a release, generating changelog, or creating CHANGELOG_LLM.md.
Plan and run local PR validation for tetherto/qvac PRs. Reuses the shared PR worktree, discovers touched packages and package.json scripts, recommends a test tier, and analyzes results. Use when testing a PR or invoking /qv-pr-test.
Plans and scaffolds e2e tests in packages/sdk/e2e for a new or changed public SDK API. Use when adding or modifying SDK functionality that is exposed to consumers. Enforces happy / sad / error coverage, deterministic model-output assertions, mobile/desktop placement, smoke-suite selection, and local validation with run:local.
Catalog of all repo qv-* custom skills with one-line purpose and when-to-use. Use when the user asks what skills exist, which skill to use, how to invoke a skill, or invokes /qv-skill-list.
Diagnose why CI checks are not running on a PR and/or why a PR cannot be merged, by cross-referencing the live PR state (via gh CLI) against the repo's labels, teams, CODEOWNERS, label-gate trust model, and tier-based approval rules. Read-only by default — proposes labels / re-review comments / unblock actions in plan-then-apply mode. Use when a developer asks "why aren't my checks running", "why can't I merge", "what's blocking my PR", or invokes /qv-devops-why-my-pr-not with a PR URL.
Generate changelog entries for a target add-on package. Use when preparing a new release.