一键导入
qv-sdk-changelog
Generate changelogs for SDK pod packages using tag-based GitFlow. Use when preparing a release, generating changelog, or creating CHANGELOG_LLM.md.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Generate changelogs for SDK pod packages using tag-based GitFlow. Use when preparing a release, generating changelog, or creating CHANGELOG_LLM.md.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
Team-wide PR dashboard for the SDK pod. Shows open PRs touching SDK pod paths or authored by SDK roster members, sorted oldest-first, grouped by author tier (SDK Core / Platform / External) into needs-your-re-review / stale / needs-review / fully-approved, with merge-conflict and CI-red warnings. Use when checking team SDK pod PR status or invoking /qv-sdk-pr-status.
Generate NOTICE files with third-party attributions for all packages in the monorepo.
Inspect GitHub Actions self-hosted runner queues when a developer provides a run URL, job URL, runner label, or reports a blocked CI job, or invokes /qv-devops-runner-queue.
Benchmark an optimization (PR or branch) on a Device Farm device via the vlm-benchmark framework — baseline vs optimized, quality-regression-aware.
Generate PR descriptions for SDK pod packages following template and format rules. Use when creating an SDK pod PR or invoking /qv-sdk-pr-create.
Update and verify the QVAC coding-agent package stack across @qvac/sdk, @qvac/cli, @qvac/ai-sdk-provider, and @qvac/opencode-plugin. Use when syncing CLI to a newer SDK release, preparing agent-stack package releases, or checking OpenCode / AI SDK provider compatibility.
| 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. |
Generate changelogs for SDK pod packages following the monorepo GitFlow.
Applies to SDK pod packages as defined in .cursor/rules/sdk/sdk-pod-packages.mdc.
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.
Tags live on the upstream remote (tetherto/qvac), not the contributor's fork.
The script fetches from upstream first, falling back to origin.
Run git tag --list "<package>-v*" --sort=-v:refname to check for existing version tags.
package.json version:
.0, e.g. 0.9.0): uses the latest .0 tag as base (e.g. sdk-v0.8.0), skipping patch tags0.8.4): uses the absolute latest tag as base (e.g. sdk-v0.8.3)--base-commit and --base-version (migration scenario)Why this matters: patches ship on separate release branches and get backmerged into main.
Using the latest patch tag as base for a minor release would miss all PRs that landed on main
between the previous minor release and the last backmerge. The correct base for a minor release
is the previous minor's .0 tag.
All SDK pod packages use the same command:
node scripts/sdk/generate-changelog-sdk-pod.cjs --package=<name>
With migration flags:
node scripts/sdk/generate-changelog-sdk-pod.cjs --package=<name> --base-commit=<sha> --base-version=<version>
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). The same filtered lists are written to models.md.
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.
When writing the human-readable CHANGELOG_LLM.md (Step 4), apply the same
"no informational value" rule manually: skip backmerges, automated bumps, and any
entry whose subject would just repeat what a previous release already said. For
the Models section, mirror the script's policy — keep it concise in the body
(highlight the most notable adds/removes) and defer the full constant list to
the ### Added / ### Removed blocks at the bottom.
Always run this step. Do not ask the user — it's part of the skill.
After raw changelog files exist, generate the human-readable version at
packages/<package>/changelog/<version>/CHANGELOG_LLM.md.
See references/changelog-llm-format.md for the format guide.
After writing the file, re-run the raw generator (or rebuild the root aggregate) so
packages/<package>/CHANGELOG.md picks up the new CHANGELOG_LLM.md (the aggregator
prefers it over CHANGELOG.md). Easiest way: re-run the script from Step 3 — it's idempotent.
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 .). Run the check
scoped to the changelog output so any issue surfaces now:
cd packages/<package>
bunx prettier --check "changelog/**/*.md" "CHANGELOG.md"
If it reports problems, fix them — bunx prettier --write on the same paths, or hand-edit —
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
minor series page (one permanent v<X.Y>.x.mdx per minor 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-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.:warning: Breaking Changes section with link to breaking.md — emitted
only when breaking.md exists in the version folder (i.e. at least one PR
carries the [bc] tag). Detected by file presence, not by parsing
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 .cursor/skills/qv-notice-generate/scripts/generate-notice.js <package-name>
Do NOT commit the announcement post (gitignored) and let the user review the rest before committing.
See .cursor/skills/qv-notice-generate/SKILL.md for full details.
@qvac/bare-sdk (only when --package=sdk)@qvac/bare-sdk releases in lockstep with @qvac/sdk from the same source
tree, so every sdk release must also mirror version + shared dep ranges into
bare-sdk and regenerate bare-sdk's NOTICE. Skip this step for any other
--package value.
Two distinct steps — run them in order:
Mirror package.json via the sync skill (writes only to
packages/bare-sdk/package.json):
node .cursor/skills/qv-sdk-bare-sdk-sync/scripts/sync.mjs
cd packages/bare-sdk && bun run check:deps-vs-sdk && cd -
Regenerate packages/bare-sdk/NOTICE against the post-sync dep tree
(separate from the sync script; uses the existing qv-notice-generate
skill which requires env tokens):
source .env
node .cursor/skills/qv-notice-generate/scripts/generate-notice.js bare-sdk
After this, git status should additionally show modifications to
packages/bare-sdk/package.json and packages/bare-sdk/NOTICE. Include both
in the release commit. bare-sdk does not get its own changelog — its
release history lives in packages/sdk/CHANGELOG.md (see
packages/bare-sdk/README.md → "Release history").
See .cursor/skills/qv-sdk-bare-sdk-sync/SKILL.md for the full sync skill
spec, including the exclusion lists and what is intentionally NOT mirrored.
--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.
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 (auto-detects minor vs patch):
cd docs/website
bun run scripts/release-version.ts <version> --force-extract
This is the exact command the old workflow ran. The dispatcher reads the
version and forwards to the minor (X.Y.0: freeze outgoing series →
regenerate latest) or patch (X.Y.Z, Z >= 1: insert the ## vX.Y.Z section)
orchestrator. It writes only:
docs/website/content/docs/reference/api/** (API summary MDX)docs/website/content/docs/reference/release-notes/** (release notes MDX)docs/website/src/lib/versions.ts (version-switcher manifest)2. Verify the site still builds (mandatory):
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 three surfaces above are part of the release commit (same as Step 7's
bare-sdk 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 release-version.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 | No | Initial commit SHA for migration (overrides tag lookup) |
--base-version | No | Version label for base commit (display only) |
--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 detail (if [bc] PRs)api.md - API changes detail (if [api] PRs)models.md - Model changes (if [mod] PRs)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 surfaces
(commit these alongside the changelog):
docs/website/content/docs/reference/api/** – API reference MDXdocs/website/content/docs/reference/release-notes/** – Release notes MDXdocs/website/src/lib/versions.ts – Version-switcher manifestTags 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.0Before completing:
--base-commit)prettier --check on the changelog output passes)--package=sdk: qv-sdk-bare-sdk-sync run, check:deps-vs-sdk passing, bare-sdk NOTICE regenerated--package=sdk: site docs generated via release-version.ts, npm run build passed, and git status shows only reference/api/**, reference/release-notes/**, src/lib/versions.ts as committable docs changes (byproducts gitignored).cursor/rules/sdk/sdk-pod-packages.mdc/gitflow.md.cursor/rules/sdk/commit-and-pr-format.mdc.cursor/skills/qv-notice-generate/SKILL.md.cursor/skills/qv-sdk-bare-sdk-sync/SKILL.mddocs/website/docs-workflow.md