Release Bump
jamiepine/voicebox
Ends a release cycle by moving the Unreleased changelog notes under a dated version heading, bumping version files with bumpversion and tagging the commit.
Generate changelogs for SDK pod packages using tag-based GitFlow.
$ npx skills add tetherto/qvac --skill qv-sdk-changelog -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install tetherto/qvac qv-sdk-changelog --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/tetherto/qvac.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/qv-sdk-changelog .claude/skills/qv-sdk-changelog && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "qv-sdk-changelog" agent skill from https://github.com/tetherto/qvac/tree/main/.agents/skills/qv-sdk-changelog into .claude/skills/qv-sdk-changelog/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "qv-sdk-changelog", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/tetherto/qvac/tree/main/.agents/skills/qv-sdk-changelogType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add tetherto/qvac --skill qv-sdk-changelog -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install tetherto/qvac qv-sdk-changelog --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/tetherto/qvac.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.agents/skills/qv-sdk-changelog .agents/skills/qv-sdk-changelog && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "qv-sdk-changelog" agent skill from https://github.com/tetherto/qvac/tree/main/.agents/skills/qv-sdk-changelog into .agents/skills/qv-sdk-changelog/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "qv-sdk-changelog", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add tetherto/qvac --skill qv-sdk-changelog -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install tetherto/qvac qv-sdk-changelog --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/tetherto/qvac.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.agents/skills/qv-sdk-changelog .cursor/skills/qv-sdk-changelog && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "qv-sdk-changelog" agent skill from https://github.com/tetherto/qvac/tree/main/.agents/skills/qv-sdk-changelog into .cursor/skills/qv-sdk-changelog/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "qv-sdk-changelog", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/tetherto/qvac.git --path .agents/skills/qv-sdk-changelog--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add tetherto/qvac --skill qv-sdk-changelog -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install tetherto/qvac qv-sdk-changelog --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/tetherto/qvac.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.agents/skills/qv-sdk-changelog .gemini/skills/qv-sdk-changelog && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "qv-sdk-changelog" agent skill from https://github.com/tetherto/qvac/tree/main/.agents/skills/qv-sdk-changelog into .gemini/skills/qv-sdk-changelog/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "qv-sdk-changelog", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install tetherto/qvac qv-sdk-changelogInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add tetherto/qvac --skill qv-sdk-changelog -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/tetherto/qvac.git skills-src && mkdir -p .github/skills && cp -r skills-src/.agents/skills/qv-sdk-changelog .github/skills/qv-sdk-changelog && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "qv-sdk-changelog" agent skill from https://github.com/tetherto/qvac/tree/main/.agents/skills/qv-sdk-changelog into .github/skills/qv-sdk-changelog/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "qv-sdk-changelog", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add tetherto/qvac --skill qv-sdk-changelog -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install tetherto/qvac qv-sdk-changelog --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/tetherto/qvac.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.agents/skills/qv-sdk-changelog .opencode/skills/qv-sdk-changelog && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "qv-sdk-changelog" agent skill from https://github.com/tetherto/qvac/tree/main/.agents/skills/qv-sdk-changelog into .opencode/skills/qv-sdk-changelog/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "qv-sdk-changelog", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
qv-sdk-changelogGenerate changelogs for SDK pod packages using tag-based GitFlow.
Qv SDK Changelog is an agent skill from tetherto/qvac. Generate changelogs for SDK pod packages using tag-based GitFlow. Use when preparing a release, generating changelog, or creating CHANGELOGLLM.md.
Its SKILL.md is about 6.8k tokens, which your agent loads only when the skill is triggered. The skill folder holds 2 other files, including reference files (for example `references/changelog-llm-format.md`).
It sits in Development, covering Changelog and release notes and Git workflow. The repository describes itself as: Open-source local AI SDK - run AI on-device with no cloud, no API keys. Supports GGUF, RAG, image, music, and video generation, speech-to-text, P2P inference, and more… The licence is Apache-2.0.
8 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 673ea94. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
gitnpmnodebunbunxpython3prettierFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use git, npm and bunx, which can reach the network depending on how they are called.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Qv SDK Changelog loads about 6.8k tokens when it runs, and up to ~7.9k if it reads all its reference files. Until then it costs about 41 tokens; SKILL.md has 3,171 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check noted patterns worth knowing about, such as sudo or a known installer.
source .env- `SDK_PATH` set in `docs/website/.env` pointing at the SDK package rootCopy `docs/website/.env.example` to `.env` if it doesn't exist yet.Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from tetherto/qvac at commit 673ea94, republished under its Apache-2.0 licence (© tetherto). 3,171 words, ~6,793 tokens.
.claude/skills/qv-sdk-changelog/SKILL.md (or your agent's skills folder). This skill also uses 1 other file; get the full folder from GitHub.Generate changelogs for SDK pod packages following the monorepo GitFlow.
Applies to SDK pod packages whose paths are owned by .github/teams/sdk.json.
Use when:
/qv-sdk-changelogEvery step is mandatory. Do not ask the user whether to do CHANGELOG_LLM.md or
NOTICE — they are part of this skill and always run.
If the user doesn't specify, ask which SDK pod package they want to generate a changelog for.
Package slugs match git tags (sdk, inference, cli, ai-sdk-provider, opencode-plugin, openclaw-plugin, …). Directory resolution (including plugins/*) is in scripts/sdk/package-paths.cjs.
sdk and inference are lockstep on major.minor. Two changelogs, two
releases, engine first: --package=inference for release-inference-<x.y.z>,
then --package=sdk for release-sdk-<x.y.z>. Both notes for the same x.y.z
share one display floor: the last lockstep version already shipped (patch or
.0). --base-commit is that version's backmerge on main so the new notes do
not repeat it. Use the same floor on both packages; splitting them (inference
from the previous .0, SDK from a later patch) duplicates patch notes and
makes the files disagree.
--base-commit is only the generate range, not the full set of notes. See
Step 2 when that floor is a patch.
The SDK is the consumer-facing full notes. --package=sdk also scans
packages/inference (CHANGELOG_EXTRA_SCAN_DIRS in
scripts/sdk/package-paths.cjs). The inference changelog is the engine-only
slice of that same set. A patch on either side is one release of its own.
Working branch (when cutting from a release line): use
chore/<pkg>-<x.y.z>-changelog (e.g. chore/sdk-0.17.0-changelog). Do not
name the head release-*: the cli / ai-sdk-provider / plugin publish
workflows trigger on push to release-* and publish to npm. The release cut itself must be
three-part release-<pkg>-x.y.z. Full rules live in
qv-sdk-pr-create → "Release PR branch naming".
Tags live on the upstream remote (tetherto/qvac), not the contributor's fork.
The script fetches from upstream first, falling back to origin.
Full-history requirement (fail-stop): discovery is
git log <base>..HEAD -- <packagePath>. Before generating:
git rev-parse --is-shallow-repository must be false (else
git fetch --unshallow / re-clone without --depth, then stop).HEAD
(git merge-base --is-ancestor <base> HEAD); otherwise check out the
release tip / package tag first.The generator enforces both checks and exits non-zero on failure.
Nested worktrees: unset GIT_DIR GIT_WORK_TREE before any git or changelog
command, or the generator runs against the parent repo.
Pick --base-commit, then pass it. Do not run the generator unflagged and
hope auto-detect is right.
sdk + inference: always pass --base-commit / --base-version
— the last lockstep ship's backmerge on main, same floor on both packages.
Never tag auto-detect: inference-v* is often not an ancestor of main, and
a minor auto-detects the previous .0 (repeats already-shipped patch notes).
When that floor is a .0, generate is enough. When it is a patch, generate
from the patch backmerge, then union main-only work from the previous lockstep
.0 backmerge → that patch backmerge: first-parent merges touching
packages/inference or packages/sdk, minus [skiplog], minus PR numbers
already in packages/sdk/changelog/<patch>/CHANGELOG.md. Hand-add to both
changelogs (CHANGELOG.md and breaking.md / models.md / api.md when the
PR tag requires them). --update-root-changelog only after that.git log --first-parent --format='%s' <prev-lockstep-.0-backmerge>..<patch-backmerge>
# keep subjects whose merge diff touches packages/inference or packages/sdk.0, patch → highest tag).
Cutting a patch behind current needs --base-version passed explicitly. A
previous .0 still includes main-only work in the patch window; drop PR
numbers already in changelog/<patch>/ if they re-list. If no tags exist,
ask for --base-commit and --base-version.--base-commit is only the generate range. The published-version audit after
generate is the consumer delta, for every package.
Lockstep (sdk / inference) always passes the floor from Step 2:
node scripts/sdk/generate-changelog-sdk-pod.cjs --package=<name> --base-commit=<sha> --base-version=<version>Standalone packages can omit the flags (auto-detect):
node scripts/sdk/generate-changelog-sdk-pod.cjs --package=<name>The script automatically excludes:
[skiplog].Backmerge or Merge release …).
Backmerges merge a release branch back into main; their content is already
documented in the release branch's own changelog, so listing them here is noise.For [mod] PRs, the script extracts the Added/Updated/Removed model lists
from the PR body and renders them as indented continuation lines beneath the
bullet in CHANGELOG.md (each section on its own line — never inline as one
giant row). It also writes models.md.
CHANGELOG.md inline lines may stay at MAX_INLINE_MODELS (5) plus
(and N more). models.md is the full added/removed set — never truncated.
PR bodies are often incomplete; if the published-version audit disagrees, replace
models.md from the export/constant diff, not from the PR body.
If this package's public API is those exported constants, removed names are
breaking: they go in breaking.md even when the PR was only [mod].
The extractor applies two policies (in this order):
*_LEX, *_VOCAB, *_DATA, *_METADATA) and any free-form
description containing the word "companion". Only first-class models reach
the changelog.(N entries) /
(N entries — short note) decorations are removed from the displayed
text — readers can follow the models.md link for exact counts.After both filters, each section is trimmed to MAX_INLINE_MODELS (currently
5) entries, with (and N more) for the remainder. Example:
- Regenerate model registry. (see PR [#123](...)) - See [model changes](./models.md)
Added: NMT_Q0F16, NMT_Q4_0 (and 12 more)
Removed: MARIAN_OPUS_*If after filtering a section is empty, it's omitted. If all sections are empty the bullet emits with no continuation lines.
git log <base>..HEAD is the generate range. It is not the consumer delta.
For every SDK pod package, after the raw files exist:
DIR=$(node -e "console.log(require('./scripts/sdk/package-paths.cjs').getPackageDir('<slug>'))")
PKG=$(node -e "console.log(require('./${DIR}/package.json').name)")
LAST=$(npm view "$PKG@<base-version>" gitHead)
git diff "$LAST" HEAD -- "$DIR"<base-version> is Step 2's --base-version (the version this cut supersedes).
Do not npm view "$PKG" version: that is dist-tag latest, which is a
different line when you cut a patch behind current.
sdk-v* tags are not the published commit (create-github-release.yml omits
target_commitish, so the tag lands on main). gitHead is packed with the
tarball. Fail-stop if npm view cannot resolve. Diff $DIR, not
package.json: exports, serve/HTTP routes, and exported constants live in
source. Every user-facing add, remove, or rename in that diff must appear in
api.md, breaking.md, and/or models.md. Hand-add.
--update-root-changelog only — do not re-run a full generate. New public
exports under an older umbrella PR still get their own api.md example.
Fail-stop until the notes match the tree. Then write CHANGELOG_LLM.md.
Always run this step. Do not ask the user — it's part of the skill.
Author CHANGELOG_LLM.md from changelog/<version>/ after the published-version
audit, not from git log. Title and NPM line are this package (@qvac/<pkg>),
not always sdk.
See references/changelog-llm-format.md.
Skip backmerges, automated bumps, and entries that only repeat a previous
release. Models body stays concise; the full constant lists live in models.md
and in the LLM ### Added / ### Removed blocks.
After writing the file, rebuild the root aggregate so
packages/<package>/CHANGELOG.md picks up CHANGELOG_LLM.md (the aggregator
prefers it over CHANGELOG.md):
node scripts/sdk/generate-changelog-sdk-pod.cjs --package=<name> --update-root-changelogDo not re-run a full generate after the published-version hand edits — that
overwrites api.md / breaking.md / models.md.
Format the generated markdown (mandatory). CHANGELOG_LLM.md is authored by
hand here, so it is the file most likely to carry markdown formatting issues that a
committed-file format check would later reject. Every SDK pod package uses prettier
(format = prettier --check ., format:fix = prettier --write .) with
.prettierrc set to "prettier-config-holepunch". Never --no-config. CI
([inference] format, [sdk] format, …) loads holepunch; --no-config or a
different parser (quote style, trailing commas) is the usual red we hit.
bunx prettier fails with Cannot find package 'prettier-config-holepunch'
when that package is not resolvable, then either skips or formats with a
fallback CI rejects. Never --no-config. Do not bun install in a package
whose range names an unpublished lockstep dep (e.g. sdk waiting on inference) —
run bunx from a sibling that already has node_modules.
DIR=$(node -e "console.log(require('./scripts/sdk/package-paths.cjs').getPackageDir('<name>'))")
bunx prettier --check "$DIR/changelog/<version>/**/*.md" "$DIR/CHANGELOG.md"Scope those globs to this package. Do not run changelog/**/*.md from the
repo root or another package cwd — that walks every historical version folder.
If it reports problems, fix them — bunx prettier --write on the same paths, or
bun run format:fix — and re-run the check until it passes clean. Do this before
moving on so the release commit carries only prettier-clean markdown.
Downstream rendering note: the docs site reads CHANGELOG_LLM.md
verbatim and inlines it under a ### @qvac/<pkg> subsection of the
release-notes page of the SDK's current documentation line (one
reference/release-notes.mdx per line — see
docs/website/docs-workflow.md). Each headline you write becomes a
section header on the public docs site (with two levels of demotion to
fit the nesting), so phrase them as standalone reader-facing prose, not
internal categories. Keep headings emoji-free (e.g. ## Breaking Changes, not ## 💥 Breaking Changes) — emoji prefixes leak verbatim
into the public headers; the only allowed emoji is the 📦 **NPM:**
line. See the format guide for the full rule.
announcement-post.txt (mandatory)Always run this step after Step 4. It produces a Slack-ready copy-paste post at
packages/<package>/changelog/<version>/announcement-post.txt.
The file is gitignored (packages/*/changelog/*/announcement-post.txt) — it's a
local working artifact, not a committed deliverable. Never git add it.
node scripts/sdk/generate-changelog-sdk-pod.cjs --package=<name> --generate-announcement-postThe script emits the short Slack template — header + three links + optional breaking-changes block + footer. Per-section bullet lists are intentionally omitted; readers follow the full-changelog link for the detail.
Layout:
:qvac: SDK <version> :rocket: NPM Public release header.:warning: Breaking Changes section with link to breaking.md — emitted
when breaking.md exists (including hand-added catalog-as-API removals).
File presence, not [bc] tags and not CHANGELOG.md.Thanks to everyone on QVAC team :green_heart: :qvac: :green_heart:.If the post needs hand-tuning (e.g. a custom note for a specific release), edit the file directly. It's gitignored, so changes won't pollute the diff.
After Step 5 completes, run notice-generate for the same --package to ensure
its NOTICE file reflects any dependency changes in the release:
source .env
node .agents/skills/qv-notice-generate/scripts/generate-notice.js <package-name>If JS npm install fails (unpublished lockstep dep, registry miss), do not
commit a NOTICE whose JS section is empty. Restore the JS block from HEAD
and keep any successful model-scan additions. Models-only packages still update
model attributions against the last published NOTICE.
Do NOT commit the announcement post (gitignored) and let the user review the rest before committing.
See .agents/skills/qv-notice-generate/SKILL.md for full details.
@qvac/inference version (only when --package=sdk)@qvac/sdk shares a major.minor with the @qvac/inference range it depends on,
and tetherto-qvac-sdk is generated from @qvac/sdk at the same version. An sdk
release sets both and regenerates the Python client (SDK_VERSION and the other
_generated/ outputs). Skip this step for any other --package value — an
--package=inference release does not touch the SDK.
Read and follow .agents/skills/qv-sdk-inference-version/SKILL.md (Steps 1–4).
Short form:
npm view @qvac/inference@<x.y.z> version
node .agents/skills/qv-sdk-inference-version/scripts/set-inference-version.mjs --engine-version=<x.y.z>
cd packages/sdk-python
.venv/bin/python3 scripts/generate.py
.venv/bin/python3 scripts/generate.py --check<x.y.z> is the @qvac/inference version this release ships against, already
published. Include sdk-python generated updates in the release commit. The Python
client does not get its own changelog — history lives in packages/sdk/CHANGELOG.md.
--package=sdk)Generate the documentation-site API reference and release notes for the new
version in the same working tree, so the changelog PR also carries the docs
update. This replaces the old standalone docs-release.yml workflow (which
opened a second, separate docs PR). Skip this step entirely for any other
--package value — only the SDK release drives the versioned docs site.
Generation is deterministic: it runs the existing docs/website scripts
(TypeDoc + Nunjucks render + verbatim CHANGELOG_LLM.md inlining). No LLM is
involved in producing the API reference or release notes here — Step 4 already
authored CHANGELOG_LLM.md, and this step only renders it into the site.
Precondition — the line is already cut (fail-stop):
The site publishes one documentation line per SDK minor: a folder under
content/docs/sdk/ holding a complete page tree. The current line's folder is
parenthesised — (v0.21) — and answers the version-less paths; every older
line's is plain. The line for the version you are releasing was cut by the
documentation engineer right after the previous release deployed, so it
already exists when you reach this step.
The generators write into the current line, read from
docs/website/src/lib/versions.ts. They refuse a version that is not that
line's, before writing anything:
Refusing to write v0.21 pages into v0.20, the current line of /sdk.
v0.21 has no line yet. Cut it before documenting the release:
bun run scripts/cut-line.ts sdk v0.21That message means the cut has not happened. STOP and ask the documentation engineer to cut the line. Do not run the cut inside a release PR, and do not work around the refusal — without it, the release notes of the version that already shipped are overwritten, and the build and the test suite both still pass.
Prerequisites:
docs/website dependencies installed (cd docs/website && npm install).SDK_PATH set in docs/website/.env pointing at the SDK package root
(packages/sdk, the directory containing index.ts and tsconfig.json).
Copy docs/website/.env.example to .env if it doesn't exist yet.
CHANGELOG_REPO_ROOT defaults to the repo root, so no override is needed
when running inside the monorepo.1. Generate the API reference + release notes. Which commands depends on whether this is a minor or a patch.
Minor (X.Y.0) — render both pages:
cd docs/website
bun run scripts/generate-api-docs.ts <version> --force-extract
bun run scripts/generate-release-notes.ts <version>Patch (X.Y.Z, Z >= 1) — append the ## vX.Y.Z section and leave the API
summary alone, because the public API is frozen at the minor boundary:
cd docs/website
bun run scripts/generate-release-notes.ts <version> --append-patchEither way it writes only, with (v<X.Y>) the current line's folder:
docs/website/content/docs/sdk/(v<X.Y>)/reference/api.mdx (minor only)docs/website/content/docs/sdk/(v<X.Y>)/reference/release-notes.mdxNothing else. src/lib/versions.ts and public/_redirects belong to the cut,
not to a release — a release must leave both untouched.
Those paths are generated here on release. Capability/CLI/config/runtime prose
is /qv-docs-update on the feature PR. Do not hand-edit reference/**.
2. Verify the site still builds (mandatory):
cd docs/website
npm run buildA clean build confirms nothing on the website broke. Treat a build failure as fail-stop: surface the error and do NOT proceed to commit until it's fixed.
Staging follows the same convention as the other steps. Like every other
step, this one only generates files — it never runs git add or git commit.
The pages above are part of the release commit (same as Step 7's
version files: "Include … in the release commit"), and every
generation/build byproduct is gitignored — exactly like Step 5's
announcement-post.txt — so a normal git status review shows only the
committable files. Let the user review before committing. Generated + gitignored
byproducts (do not git add them):
docs/website/scripts/api-docs/api-data.json (written by generate-api-docs.ts)docs/website/.next/, .source/, out/, dist/ (from npm run build)docs/website/next-env.d.tspackages/sdk/dist/ (from the prebuild:examples build step)See docs/website/docs-workflow.md for the full pipeline reference.
| Flag | Required | Description |
|---|---|---|
--package | Yes | Package name (e.g., sdk) |
--base-commit | Lockstep | Generate-range start. Required for sdk/inference; overrides tag auto-detect |
--base-version | Lockstep | Display label for that floor |
--release-type | No | minor or patch (auto-detected from package.json version) |
--dry-run | No | Preview output without writing files |
--update-root-changelog | No | Rebuild only the root aggregate packages/<pkg>/CHANGELOG.md |
--generate-announcement-post | No | Generate announcement-post.txt for the package's current version |
--version | No | Override version when used with --generate-announcement-post |
Generates changelog files in packages/<package>/changelog/<version>/:
CHANGELOG.md - Main changelogbreaking.md - Breaking changes ([bc] PRs and catalog-as-API removals)api.md - API changes ([api] PRs and published-version export/route diffs)models.md - Model changes (full set; [mod] PRs and constant diffs)CHANGELOG_LLM.md - Human-readable version (always generated, see Step 4)announcement-post.txt - Slack copy-paste post (always generated, see Step 5,
gitignored — never commit)Additionally:
packages/<package>/CHANGELOG.md – Aggregated changelog containing all versions (newest → oldest), preferring CHANGELOG_LLM.md (human-readable) from each version folder when available, falling back to CHANGELOG.mdWhen --package=sdk, Step 8 also generates the documentation-site pages of the
SDK's current documentation line (commit these alongside the changelog), with
(v<X.Y>) its folder:
docs/website/content/docs/sdk/(v<X.Y>)/reference/api.mdx – API reference
MDX, minor releases onlydocs/website/content/docs/sdk/(v<X.Y>)/reference/release-notes.mdx –
Release notes MDXNothing else. The version manifest (src/lib/versions.ts) and the redirects
(public/_redirects) belong to the line cut, which happens outside a release.
Tags follow the pattern: <package>-v<x.y.z> and are created on upstream (not the fork).
Examples:
sdk-v0.8.0 (minor — used as base for next minor release)sdk-v0.8.1 (patch — used as base for next patch release)rag-v2.0.0These have gone red on more than one SDK-pod changelog PR. Fix them before push, and keep this list to things that are cheap to prevent:
.prettierrc is "prettier-config-holepunch".
Never --no-config. Resolve holepunch from a package that can install; do not
bun install against an unpublished lockstep dep. Quote style and trailing
commas on CHANGELOG_LLM.md are the usual fail.sdk /
inference. Same --base-commit on both. When that floor is a patch, union
the Step 2 main-only window. SDK is the consumer set; inference is the engine
slice.inference-v* is often not on main. Use the backmerge SHA, not the tag.GIT_DIR. unset GIT_DIR GIT_WORK_TREE before
generate/commit/cherry-pick, or you operate on the parent repo.upstream when that is tetherto/qvac), not the
contributor fork. git push with no remote follows origin.[skip-sdk-pod-checks] is not the changelog fix.--base-version gitHead, not only git log. After generate,
audit exports / routes / constants against
npm view "$PKG@<base-version>" gitHead. Do not use sdk-v* or npm latest.
git log <base>..HEAD misses work that is already an ancestor of
--base-commit.npm install must not replace the JS section
with zero deps. Restore JS from HEAD; keep successful model-scan adds.Before completing:
chore/<pkg>-<x.y.z>-changelog, not release-*git rev-parse --is-shallow-repository → false)--base-commit) and is an ancestor of HEADsdk + inference: both generated with the same --base-commit / --base-version (last lockstep display floor); never unflagged auto-detect; SDK changelog includes the engine sliceGIT_DIR / GIT_WORK_TREE unset (or pointed at this worktree) so generate/git did not run in a parent repochangelog/<version>/ after the published-version audit (this package's name on the title/NPM line)--no-config; do not bun install against unpublished lockstep deps)npm view "$PKG@<base-version>" gitHead vs HEAD under getPackageDir(<slug>) ($DIR, not package.json) matches api.md / breaking.md / models.mdmodels.md is the full added/removed set (inline CHANGELOG.md may still use (and N more)); catalog-as-API removals are in breaking.md--package=sdk: qv-sdk-inference-version run (engine version published, sdk version and @qvac/inference range sharing a major.minor, sdk-python regenerated), python generate.py --check passing--package=sdk: the line for this version was already cut (no generator refusal), site docs generated via generate-api-docs.ts + generate-release-notes.ts, npm run build passed, and git status shows only that line's reference/api.mdx (minor) and reference/release-notes.mdx as committable docs changes — never src/lib/versions.ts or public/_redirects (byproducts gitignored)upstream when that is tetherto/qvac) is the push target, not the fork.github/teams/sdk.jsondocs/gitflow.md.agents/skills/qv-notice-generate/SKILL.md.agents/skills/qv-sdk-inference-version/SKILL.mddocs/website/docs-workflow.mdrelease-* push / Merge Guard): .agents/skills/qv-sdk-pr-create/SKILL.md© tetherto, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 1 other file (references) in .agents/skills/qv-sdk-changelog of tetherto/qvac.
Open the folder on GitHubat commit 673ea94
Qv SDK Changelog next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Qv SDK Changelog this skilltetherto/qvac | 685 | — | ~6.8k | Automated safety check: Notes | Apache-2.0 | |
| Release Bumpjamiepine/voicebox | 57k | — | ~1.1k | Automated safety check: Pass | MIT | |
| Git Workflow and Versioningaddyosmani/agent-skills | 104k | 2 repos | ~3.5k | Automated safety check: Notes | MIT | |
| Go-Redis Release Preparationredis/go-redis | 22k | — | ~1.1k | Automated safety check: Pass | BSD-2-Clause | |
| Hunk Release Workflowmodem-dev/hunk | 9.6k | — | ~3.8k | Automated safety check: Pass | MIT | |
| pybind11 Release Preparationpybind/pybind11 | 18k | — | ~1.7k | Automated safety check: Pass | Custom licence |
jamiepine/voicebox
Ends a release cycle by moving the Unreleased changelog notes under a dated version heading, bumping version files with bumpversion and tagging the commit.
addyosmani/agent-skills
Sets git habits for every change: short-lived branches, atomic commits with descriptive messages, clean pull requests, plus versioning, tagging and changelogs for releases.
redis/go-redis
Prepares a go-redis release locally: picks the next semver, gathers merged PRs, writes the RELEASE-NOTES entry and bumps versions, without publishing.
modem-dev/hunk
Maintainer workflow for preparing, publishing, verifying and curating Hunk releases, with confirmation gates before tags, publishes and public edits.
pybind/pybind11
Opens the pybind11 release-preparation pull request: picking the release base, bumping the version in common.h and integrating the changelog, following docs/release.rst.
iOfficeAI/AionUi
Automates an AionUi release: checks the latest AionCore release and its artifacts, updates package.json, writes the changelog, opens a PR and tags the release.
tetherto/qvac
Creates a Solutions page in the QVAC documentation website from a real use case, generalizing the case into reusable guidance and registering the page in the site navigation.
tetherto/qvac
Updates the docs website after a change to the SDK or CLI. An agent skill from tetherto/qvac.
tetherto/qvac
Plan and prepare the QVAC agent-stack release cascade across @qvac/inference, @qvac/sdk, @qvac/cli, @qvac/ai-sdk-provider, @qvac/opencode-plugin, and @qvac/openclaw-plugin.
tetherto/qvac
Run the deterministic code-quality audit, turn related findings into contextual remediation groups, prepare approval-gated Asana proposals, reconcile recurring runs, or configure twice-monthly…
tetherto/qvac
Review C++ changes for string parameter and call-site efficiency conventions (std::stringview, std::string&&, const std::string&, const char, and TransparentStringMap lookup).
tetherto/qvac
Generate changelog entries for a target add-on package. An agent skill from tetherto/qvac.
Categories
Generate changelogs for SDK pod packages using tag-based GitFlow. Qv SDK Changelog is an agent skill from tetherto/qvac. Generate changelogs for SDK pod packages using tag-based GitFlow.
Qv SDK Changelog fits situations like: preparing a release; generating changelog; creating CHANGELOGLLM.md.
Run `npx skills add tetherto/qvac --skill qv-sdk-changelog -a claude-code`. Or copy the skill folder (.agents/skills/qv-sdk-changelog in tetherto/qvac) into .claude/skills/qv-sdk-changelog in your project. Claude Code loads it when a task matches its description.
Run `npx skills add tetherto/qvac --skill qv-sdk-changelog -a codex`. Or copy the skill folder (.agents/skills/qv-sdk-changelog in tetherto/qvac) into .agents/skills/qv-sdk-changelog in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add tetherto/qvac --skill qv-sdk-changelog -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/qv-sdk-changelog, .gemini/skills/qv-sdk-changelog, .github/skills/qv-sdk-changelog and .opencode/skills/qv-sdk-changelog in your project.
Going by SKILL.md and its folder, Qv SDK Changelog needs the command-line tools its instructions call (git, npm, node, bun, bunx and python3).
SKILL.md contains no URLs. Its commands use git and npm, which can reach the network depending on how they are called. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found notes only (mentions a .env file), nothing it rates as a warning. It is not a guarantee. Review the folder before installing.
Qv SDK Changelog is published under the Apache-2.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 6.8k tokens (SKILL.md is roughly 27k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 1.1k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Qv SDK Changelog: Release Bump (jamiepine/voicebox, 57k stars), Git Workflow and Versioning (addyosmani/agent-skills, 104k stars), Go-Redis Release Preparation (redis/go-redis, 22k stars) and Hunk Release Workflow (modem-dev/hunk, 9.6k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
tetherto (a GitHub organization) maintains it in tetherto/qvac, which has 685 GitHub stars. The repository holds 50 skills in this directory. The repository was last updated on October 10, 2026.
Source: tetherto/qvac on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.