Agent skill

Qv SDK Changelog

by tetherto in tetherto/qvac

Generate changelogs for SDK pod packages using tag-based GitFlow.

Apache-2.0Auto-check: notesDevelopment

Install Qv SDK Changelog

skills CLI
$ npx skills add tetherto/qvac --skill qv-sdk-changelog -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install tetherto/qvac qv-sdk-changelog --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ 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-src

Use ~/.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/

Facts

Skill name
qv-sdk-changelog
GitHub stars
685
Token cost
~6.8k tokens
SKILL.md length
3,171 words
Files
2 (incl. references)
Skills in repo
50
Repo updated
First seen
Licence
Apache-2.0

At a glance

Generate changelogs for SDK pod packages using tag-based GitFlow.

  • Works in 8 steps: Identify Target Package → Fetch Tags and Resolve Base → Generate Raw Changelog → …
  • Preparing a release
  • SKILL.md covers When to use this skill, Workflow, CLI Parameters and Output, plus 4 more sections
  • Calls git, npm and node

What it does

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.

When your agent uses it

  • Preparing a release
  • Generating changelog
  • Creating CHANGELOGLLM.md

Example prompts

  • “/qv-sdk-changelog”

Workflow steps

8 steps, taken from the step headings in SKILL.md.

  1. Identify Target Package
  2. Fetch Tags and Resolve Base
  3. Generate Raw Changelog
  4. Generate CHANGELOG_LLM.md (mandatory)
  5. Generate announcement-post.txt (mandatory)
  6. Update NOTICE file for the target package
  7. Set the @qvac/inference version (only when --package=sdk)
  8. Generate site docs (only when --package=sdk)

What it can do on your machine

Read from SKILL.md and the folder at commit 673ea94. It shows what the files ask for, not the result of running them.

  • Tool permissions

    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.

  • Runs code

    Shell commands in SKILL.md call:

    • git
    • npm
    • node
    • bun
    • bunx
    • python3
    • prettier

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    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.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

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.

Always · name and description, kept in context so the agent knows when to use it
~41
When it runs · the whole SKILL.md, loaded when a task matches
~6.8k
With references · SKILL.md plus every file in references/, read only if the agent opens them
~7.9k

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.

Safety

Auto-check: notes

The automated check noted patterns worth knowing about, such as sudo or a known installer.

  • NoteMentions a .env fileSKILL.md:291
    source .env
  • NoteMentions a .env fileSKILL.md:370
    - `SDK_PATH` set in `docs/website/.env` pointing at the SDK package root
  • NoteMentions a .env fileSKILL.md:372
    Copy `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.

SKILL.md

The full file from tetherto/qvac at commit 673ea94, republished under its Apache-2.0 licence (© tetherto). 3,171 words, ~6,793 tokens.

Download SKILL.mdSave it as .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.
name
qv-sdk-changelog
description
Generate changelogs for SDK pod packages using tag-based GitFlow. Use when preparing a release, generating changelog, or creating CHANGELOG_LLM.md.

SDK Changelog Generation

Generate changelogs for SDK pod packages following the monorepo GitFlow.

When to use this skill

Applies to SDK pod packages whose paths are owned by .github/teams/sdk.json.

Use when:

  • Preparing a release for any SDK pod package
  • User asks to generate changelog
  • User asks to create human-readable/presentable changelog
  • User asks to generate CHANGELOG_LLM.md
  • User invokes /qv-sdk-changelog

Workflow

Every 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.

Step 1: Identify Target Package

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".

Step 2: Fetch Tags and Resolve Base

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:

  1. git rev-parse --is-shallow-repository must be false (else git fetch --unshallow / re-clone without --depth, then stop).
  2. Base must be an ancestor of 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.

  • Lockstep 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.
bash
git log --first-parent --format='%s' <prev-lockstep-.0-backmerge>..<patch-backmerge>
# keep subjects whose merge diff touches packages/inference or packages/sdk
  • Standalone (cli, plugins, anything not lockstep): omit the flags. The generator auto-detects (minor → previous .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.

Step 3: Generate Raw Changelog

Lockstep (sdk / inference) always passes the floor from Step 2:

bash
node scripts/sdk/generate-changelog-sdk-pod.cjs --package=<name> --base-commit=<sha> --base-version=<version>

Standalone packages can omit the flags (auto-detect):

bash
node scripts/sdk/generate-changelog-sdk-pod.cjs --package=<name>

The script automatically excludes:

  • PRs tagged [skiplog].
  • Backmerge PRs (subjects starting with 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.
  • PRs whose title fails the SDK PR-format validator (these are warned, not silently dropped — fix the title and re-run, or surface to the PR author).

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):

  1. Companion entries are dropped. Companions are auxiliary files that ship alongside a primary model but aren't independently usable — vocab files, lexicons, raw data shards, metadata blobs. The filter recognises constant suffixes (*_LEX, *_VOCAB, *_DATA, *_METADATA) and any free-form description containing the word "companion". Only first-class models reach the changelog.
  2. Entry-count suffixes are stripped. (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.

After generate: published-version audit (mandatory)

git log <base>..HEAD is the generate range. It is not the consumer delta.

For every SDK pod package, after the raw files exist:

bash
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.

Step 4: Generate CHANGELOG_LLM.md (mandatory)

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):

bash
node scripts/sdk/generate-changelog-sdk-pod.cjs --package=<name> --update-root-changelog

Do 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.

bash
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.

Step 5: Generate 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.

bash
node scripts/sdk/generate-changelog-sdk-pod.cjs --package=<name> --generate-announcement-post

The 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.
  • NPM, GitHub release, and full-changelog tree links.
  • :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.
  • Footer: 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.

Step 6: Update NOTICE file for the target package

After Step 5 completes, run notice-generate for the same --package to ensure its NOTICE file reflects any dependency changes in the release:

bash
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.

Step 7: Set the @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:

bash
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.

Show full SKILL.md (1,355 more words)Show less
Step 8: Generate site docs (only when --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.21

That 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:

bash
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:

bash
cd docs/website
bun run scripts/generate-release-notes.ts <version> --append-patch

Either 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.mdx

Nothing 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):

bash
cd docs/website
npm run build

A 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.ts
  • packages/sdk/dist/ (from the prebuild:examples build step)

See docs/website/docs-workflow.md for the full pipeline reference.

CLI Parameters

FlagRequiredDescription
--packageYesPackage name (e.g., sdk)
--base-commitLockstepGenerate-range start. Required for sdk/inference; overrides tag auto-detect
--base-versionLockstepDisplay label for that floor
--release-typeNominor or patch (auto-detected from package.json version)
--dry-runNoPreview output without writing files
--update-root-changelogNoRebuild only the root aggregate packages/<pkg>/CHANGELOG.md
--generate-announcement-postNoGenerate announcement-post.txt for the package's current version
--versionNoOverride version when used with --generate-announcement-post

Output

Generates changelog files in packages/<package>/changelog/<version>/:

  • CHANGELOG.md - Main changelog
  • breaking.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.md

When --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 only
  • docs/website/content/docs/sdk/(v<X.Y>)/reference/release-notes.mdx – Release notes MDX

Nothing else. The version manifest (src/lib/versions.ts) and the redirects (public/_redirects) belong to the line cut, which happens outside a release.

Tag Format

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.0

Repeated mistakes

These 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:

  • Prettier is holepunch, not stock. .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.
  • Lockstep: pass the floor. Never run the generator unflagged for 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.
  • Nested worktrees inherit GIT_DIR. unset GIT_DIR GIT_WORK_TREE before generate/commit/cherry-pick, or you operate on the parent repo.
  • Push the org remote (upstream when that is tetherto/qvac), not the contributor fork. git push with no remote follows origin.
  • Do not skip SDK Pod Checks. Workspace red vs published red is a real signal; [skip-sdk-pod-checks] is not the changelog fix.
  • Notes vs --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.
  • NOTICE JS wipe. A failed npm install must not replace the JS section with zero deps. Restore JS from HEAD; keep successful model-scan adds.

Quality Checklist

Before completing:

  • Correct package identified
  • Working head (if branched for the release PR) is chore/<pkg>-<x.y.z>-changelog, not release-*
  • Clone is not shallow (git rev-parse --is-shallow-repository → false)
  • Base reference resolved (tag or --base-commit) and is an ancestor of HEAD
  • For lockstep sdk + inference: both generated with the same --base-commit / --base-version (last lockstep display floor); never unflagged auto-detect; SDK changelog includes the engine slice
  • When that floor is a patch: main-only window unioned in on both changelogs
  • GIT_DIR / GIT_WORK_TREE unset (or pointed at this worktree) so generate/git did not run in a parent repo
  • PRs scoped to package path only
  • Changelog files written to correct version directory
  • CHANGELOG_LLM.md authored from changelog/<version>/ after the published-version audit (this package's name on the title/NPM line)
  • Generated markdown is prettier-clean with prettier-config-holepunch resolved (never --no-config; do not bun install against unpublished lockstep deps)
  • announcement-post.txt generated (mandatory, gitignored)
  • Published-version audit done: npm view "$PKG@<base-version>" gitHead vs HEAD under getPackageDir(<slug>) ($DIR, not package.json) matches api.md / breaking.md / models.md
  • models.md is the full added/removed set (inline CHANGELOG.md may still use (and N more)); catalog-as-API removals are in breaking.md
  • NOTICE updated; JS section not emptied by a failed install
  • When --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
  • When --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)
  • Root CHANGELOG.md rebuilt from all version folders (and picks up CHANGELOG_LLM.md)
  • Versions sorted in descending semver order
  • No duplicated versions
  • Root file is deterministic (fully regenerated)
  • Org remote (upstream when that is tetherto/qvac) is the push target, not the fork

References

  • SDK pod ownership: .github/teams/sdk.json
  • GitFlow and PR format: docs/gitflow.md
  • LLM changelog format: references/changelog-llm-format.md
  • NOTICE generation: .agents/skills/qv-notice-generate/SKILL.md
  • sdk @qvac/inference version: .agents/skills/qv-sdk-inference-version/SKILL.md
  • Docs site pipeline (Step 8): docs/website/docs-workflow.md
  • Release PR branch naming (org release-* 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

Files

SKILL.md and 1 other file (references) in .agents/skills/qv-sdk-changelog of tetherto/qvac.

  • SKILL.md
  • references/changelog-llm-format.md

Open the folder on GitHubat commit 673ea94

Compare with similar skills

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.

Qv SDK Changelog compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Qv SDK Changelog this skilltetherto/qvac685—~6.8kAutomated safety check: NotesApache-2.0
Release Bumpjamiepine/voicebox57k—~1.1kAutomated safety check: PassMIT
Git Workflow and Versioningaddyosmani/agent-skills104k2 repos~3.5kAutomated safety check: NotesMIT
Go-Redis Release Preparationredis/go-redis22k—~1.1kAutomated safety check: PassBSD-2-Clause
Hunk Release Workflowmodem-dev/hunk9.6k—~3.8kAutomated safety check: PassMIT
pybind11 Release Preparationpybind/pybind1118k—~1.7kAutomated safety check: PassCustom licence

Similar skills

  • 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.

    57k GitHub stars~1.1k tokensUpdated 3 days ago
    DevelopmentAuto-check passed
  • Git Workflow and Versioning

    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.

    104k GitHub starsUsed in 2 repos~3.5k tokens
    DevelopmentAuto-check: notes
  • Official

    Prepares a go-redis release locally: picks the next semver, gathers merged PRs, writes the RELEASE-NOTES entry and bumps versions, without publishing.

    22k GitHub stars~1.1k tokensUpdated yesterday
    DevelopmentAuto-check passed
  • Hunk Release Workflow

    modem-dev/hunk

    Maintainer workflow for preparing, publishing, verifying and curating Hunk releases, with confirmation gates before tags, publishes and public edits.

    9.6k GitHub stars~3.8k tokensUpdated 3 days ago
    DevelopmentAuto-check passed
  • 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.

    18k GitHub stars~1.7k tokensUpdated yesterday
    DevelopmentAuto-check passed
  • AionUi Version Bump

    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.

    33k GitHub stars~2.1k tokensUpdated 1 mo ago
    DevelopmentAuto-check passed

More from tetherto/qvac

All 50 skills in this repo
  • 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.

    685 GitHub stars~2.8k tokensUpdated today
    Auto-check passed
  • Qv Docs Update

    tetherto/qvac

    Updates the docs website after a change to the SDK or CLI. An agent skill from tetherto/qvac.

    685 GitHub stars~11k tokensUpdated today
    Auto-check passed
  • Qv Agent Stack Sync

    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.

    685 GitHub stars~2k tokensUpdated today
    Auto-check passed
  • 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…

    685 GitHub stars~1.6k tokensUpdated today
    Auto-check passed
  • Review C++ changes for string parameter and call-site efficiency conventions (std::stringview, std::string&&, const std::string&, const char, and TransparentStringMap lookup).

    685 GitHub stars~702 tokensUpdated today
    Auto-check passed
  • Qv Addon Changelog

    tetherto/qvac

    Generate changelog entries for a target add-on package. An agent skill from tetherto/qvac.

    685 GitHub stars~1.7k tokensUpdated today
    Auto-check passed

Categories

Questions about Qv SDK Changelog

What does Qv SDK Changelog do?

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.

When should I use Qv SDK Changelog?

Qv SDK Changelog fits situations like: preparing a release; generating changelog; creating CHANGELOGLLM.md.

How do I install Qv SDK Changelog in Claude Code?

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.

How do I install Qv SDK Changelog in Codex?

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.

Can I use Qv SDK Changelog in Cursor, Gemini CLI or GitHub Copilot?

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.

What does Qv SDK Changelog need to run?

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).

Does Qv SDK Changelog access the network?

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.

Is Qv SDK Changelog safe to install?

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.

What licence does Qv SDK Changelog use?

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.

How many tokens does Qv SDK Changelog use?

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.

What are the alternatives to Qv SDK Changelog?

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.

Who maintains Qv SDK Changelog?

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.