Generate Human-Readable Changelog Entries
Generate changelog entries for add-on packages following the add-on release workflow.
When to use this skill
Use when:
- Preparing a release for an add-on package
- User asks to generate release notes or changelog for an add-on
- User invokes
/qv-addon-changelog
Workflow
Step 1: Identify Target Add-on
If the user doesn't specify, ask which add-on package they want to generate a changelog for.
Step 2: Identify version and changes (mandatory version bump + upstream tag diff)
Identify the full set of changes for the target add-on package only, validate the version bump in the target add-on package.json against main, and compute diff from the previous released tag to HEAD:
Find the PR base and head: The base is main. The head is the current branch/commit that the PR will merge.
Read versions:
- Read
package.json from main (prev_version) and from HEAD (current_version).
- Always compare
package.json between main and HEAD.
Mandatory version bump check:
- If the
version in package.json is unchanged compared to main, stop and display this exact warning to the user, substituting <addon> with the actual add-on name:
⚠️⚠️⚠️ VERSION BUMP REQUIRED ⚠️⚠️⚠️
The version in packages/<addon>/package.json is unchanged compared to main.
If this PR includes any changes that must be released in the package, you must bump the package version, commit/push it and re-run this command.
Resolve upstream release tag for prev_version:
- Check addon release workflow tag format in
.github/workflows/create-github-release.yml (tag_name).
- Use that format to build
upstream_tag for prev_version.
- The tag pattern currently used is
<short_addon_name>-v<version> (example: llamacpp-embed-v0.10.7)
Compute release diff from upstream tag to PR head (package-scoped):
- Primary range for changelog generation:
upstream_tag...HEAD (or upstream_tag..HEAD for commit listing).
- Scope all comparisons to the target package path using path filtering:
- diff scope example:
git diff upstream_tag...HEAD -- packages/<addon>/
- commit scope example:
git log upstream_tag..HEAD -- packages/<addon>/
- This ensures the changelog is based on changes since the previous released version, up to the latest commit in the PR branch.
- If
upstream_tag does not exist locally/remotely, warn clearly and fall back to main...HEAD.
Do not include uncommitted changes or untracked files: If any uncommitted/untracked files are present, ignore them.
The goal is to produce a single, package-scoped change set that reflects what will be released next for the target add-on: from the previous released tag (prev_version) to the current PR head (HEAD).
Step 3: Collect PRs included in this release
- Extract PR numbers from commit messages in the package-scoped range
upstream_tag..HEAD -- packages/<addon>/ (or fallback main...HEAD -- packages/<addon>/ if tag is missing)
- Look for patterns like
#123, (#123), or Merge pull request #123
- For each PR found, use
gh pr view <number> to get:
- PR title
- PR number
- PR URL
- Filter PRs to package-relevant only:
- Keep PRs that actually touch files under
packages/<addon>/.
- If needed, verify with
gh pr view <number> --json files and drop unrelated PRs.
- Build a list of PRs to include in the release notes
Step 4: Generate changelog entry (single source of truth)
Create or update the matching version section in CHANGELOG.md with these guidelines:
Format Requirements
Version heading: Use exactly ## [X.Y.Z] - YYYY-MM-DD
X.Y.Z must match package.json version in HEAD
- Date must be the release date in
YYYY-MM-DD
Introduction: Write a brief 2-3 sentence summary of what this release brings
Sections: Create each section using narrative prose style. Omit a section if there is no information related with it:
- Breaking Changes: Lead with impact, explain what changed and why, provide clear migration steps with before/after code
- New APIs: Describe what's possible now, show practical usage examples
- Features: Explain benefits in user terms, not just what was added
- Bug Fixes: Describe what was broken and how it's fixed
- Other: Summarize briefly
- Use section headings like
## Breaking Changes, ## Features, etc. inside the version block
Pull Requests: At the end, include a "## Pull Requests" section listing all PRs in this release:
## Pull Requests
- [#123](https://github.com/tetherto/qvac/pull/123) - PR title here
- [#124](https://github.com/tetherto/qvac/pull/124) - Another PR title
Workflow compatibility requirement (mandatory):
- The release workflow extracts the GitHub release body from
CHANGELOG.md by taking text after ## [X.Y.Z] - YYYY-MM-DD until the next version heading ## [.
- Therefore:
- Keep all release content for a version inside that block.
- Do not create standalone release notes files.
- Ensure the version block is non-empty.
Style Guidelines:
- Use complete sentences, not bullet fragments
- Lead with benefits/impact
- Group related changes together
- Add context where helpful (why this matters)
- Keep code examples clean and commented
- Remove internal jargon, make it accessible
- Skip entries with no informational value — generic entries like "Updated models" or "Bumped dependencies" without specific details should be omitted
Example
CHANGELOG.md (excerpt):
## [0.4.0] - 2026-02-18
This release introduces automated GitHub releases and improves mobile test reliability.
## Features
### Automated GitHub Releases
The release process is now automated with enforced changelog entries. When a version bump is detected on merge to main, a GitHub release is automatically created using the matching `CHANGELOG.md` version block.
## Bug Fixes
### Mobile E2E Test Workflow Fix
Fixed an issue where mobile E2E tests would fail when the "On PR Trigger" workflow was manually run via workflow_dispatch.
## Pull Requests
- [#67](https://github.com/tetherto/qvac/pull/67) - Fix mobile E2E tests workflow_dispatch
- [#70](https://github.com/tetherto/qvac/pull/70) - feat: automate GitHub releases with mandatory release notes
1---2name: qv-addon-changelog3description: Generate changelog entries for a target add-on package. Use when preparing a new release.4---56# Generate Human-Readable Changelog Entries78Generate changelog entries for add-on packages following the add-on release workflow.910## When to use this skill1112**Use when:**1314- Preparing a release for an add-on package15- User asks to generate release notes or changelog for an add-on16- User invokes `/qv-addon-changelog`1718## Workflow1920### Step 1: Identify Target Add-on2122If the user doesn't specify, ask which add-on package they want to generate a changelog for.2324### Step 2: Identify version and changes (mandatory version bump + upstream tag diff)2526Identify the full set of changes for the **target add-on package only**, validate the version bump in the target add-on `package.json` against `main`, and compute diff from the previous released tag to `HEAD`:27281. **Find the PR base and head**: The base is `main`. The head is the current branch/commit that the PR will merge.292. **Read versions**:30 - Read `package.json` from `main` (`prev_version`) and from `HEAD` (`current_version`).31 - **Always compare `package.json` between `main` and `HEAD`.**323. **Mandatory version bump check**:33 - If the `version` in `package.json` is **unchanged** compared to `main`, **stop and display this exact warning** to the user, substituting `<addon>` with the actual add-on name:3435 -----------------------------------36 ⚠️⚠️⚠️ VERSION BUMP REQUIRED ⚠️⚠️⚠️ 37 The `version` in `packages/<addon>/package.json` is unchanged compared to `main`. 38 If this PR includes any changes that must be released in the package, you **must** bump the package version, commit/push it and re-run this command.39 -----------------------------------40414. **Resolve upstream release tag for `prev_version`**:42 - Check addon release workflow tag format in `.github/workflows/create-github-release.yml` (`tag_name`).43 - Use that format to build `upstream_tag` for `prev_version`.44 - The tag pattern currently used is `<short_addon_name>-v<version>` (example: `llamacpp-embed-v0.10.7`)45465. **Compute release diff from upstream tag to PR head (package-scoped)**:47 - Primary range for changelog generation: `upstream_tag...HEAD` (or `upstream_tag..HEAD` for commit listing).48 - Scope all comparisons to the target package path using path filtering:49 - diff scope example: `git diff upstream_tag...HEAD -- packages/<addon>/`50 - commit scope example: `git log upstream_tag..HEAD -- packages/<addon>/`51 - This ensures the changelog is based on changes since the previous released version, up to the latest commit in the PR branch.52 - If `upstream_tag` does not exist locally/remotely, warn clearly and fall back to `main...HEAD`.53546. **Do not include uncommitted changes or untracked files**: If any uncommitted/untracked files are present, ignore them.5556The goal is to produce a single, package-scoped change set that reflects what will be released next for the target add-on: from the previous released tag (`prev_version`) to the current PR head (`HEAD`).5758### Step 3: Collect PRs included in this release59601. **Extract PR numbers** from commit messages in the package-scoped range `upstream_tag..HEAD -- packages/<addon>/` (or fallback `main...HEAD -- packages/<addon>/` if tag is missing)61 - Look for patterns like `#123`, `(#123)`, or `Merge pull request #123`622. **For each PR found**, use `gh pr view <number>` to get:63 - PR title64 - PR number65 - PR URL663. **Filter PRs to package-relevant only**:67 - Keep PRs that actually touch files under `packages/<addon>/`.68 - If needed, verify with `gh pr view <number> --json files` and drop unrelated PRs.694. **Build a list** of PRs to include in the release notes7071### Step 4: Generate changelog entry (single source of truth)7273Create or update the matching version section in `CHANGELOG.md` with these guidelines:7475### Format Requirements76771. **Version heading**: Use exactly `## [X.Y.Z] - YYYY-MM-DD`78 - `X.Y.Z` must match `package.json` version in `HEAD`79 - Date must be the release date in `YYYY-MM-DD`80812. **Introduction**: Write a brief 2-3 sentence summary of what this release brings82833. **Sections**: Create each section using narrative prose style. Omit a section if there is no information related with it:84 - **Breaking Changes**: Lead with impact, explain what changed and why, provide clear migration steps with before/after code85 - **New APIs**: Describe what's possible now, show practical usage examples86 - **Features**: Explain benefits in user terms, not just what was added87 - **Bug Fixes**: Describe what was broken and how it's fixed88 - **Other**: Summarize briefly89 - Use section headings like `## Breaking Changes`, `## Features`, etc. inside the version block90914. **Pull Requests**: At the end, include a "## Pull Requests" section listing all PRs in this release:92 ```markdown93 ## Pull Requests9495 - [#123](https://github.com/tetherto/qvac/pull/123) - PR title here96 - [#124](https://github.com/tetherto/qvac/pull/124) - Another PR title97 ```98995. **Workflow compatibility requirement (mandatory)**:100 - The release workflow extracts the GitHub release body from `CHANGELOG.md` by taking text **after** `## [X.Y.Z] - YYYY-MM-DD` until the next version heading `## [`.101 - Therefore:102 - Keep all release content for a version inside that block.103 - Do not create standalone release notes files.104 - Ensure the version block is non-empty.1051066. **Style Guidelines**:107 - Use complete sentences, not bullet fragments108 - Lead with benefits/impact109 - Group related changes together110 - Add context where helpful (why this matters)111 - Keep code examples clean and commented112 - Remove internal jargon, make it accessible113 - **Skip entries with no informational value** — generic entries like "Updated models" or "Bumped dependencies" without specific details should be omitted114115### Example116117**CHANGELOG.md (excerpt):**118```markdown119## [0.4.0] - 2026-02-18120121This release introduces automated GitHub releases and improves mobile test reliability.122123## Features124125### Automated GitHub Releases126127The release process is now automated with enforced changelog entries. When a version bump is detected on merge to main, a GitHub release is automatically created using the matching `CHANGELOG.md` version block.128129## Bug Fixes130131### Mobile E2E Test Workflow Fix132133Fixed an issue where mobile E2E tests would fail when the "On PR Trigger" workflow was manually run via workflow_dispatch.134135## Pull Requests136137- [#67](https://github.com/tetherto/qvac/pull/67) - Fix mobile E2E tests workflow_dispatch138- [#70](https://github.com/tetherto/qvac/pull/70) - feat: automate GitHub releases with mandatory release notes139```