Generates polished GitHub release notes for a ToolHive release by analyzing every merged PR, cross-referencing linked issues, dispatching expert agents to assess breaking changes, and producing a formatted release body. Use when the user provides a GitHub release URL, tag name, or says "release notes".
76
96%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Low
Low-risk findings worth noting
Produces publication-ready GitHub release notes by deeply analyzing every PR merged between two version tags.
/release-notes https://github.com/stacklok/toolhive/releases/tag/v0.18.0
/release-notes v0.18.0Input: $ARGUMENTS — a GitHub release URL or a tag name.
# If given a URL, extract the tag from the path
# Then find the immediately preceding release tag
gh release view <tag> --json tagName,name,body,publishedAt
git tag --sort=-v:refname | grep -A1 "^<tag>$" | tail -1Store:
CURRENT_TAG (e.g., v0.18.0)PREVIOUS_TAG (e.g., v0.17.0)PUBLISHED_AT dateFetch the existing release body. GitHub's auto-generated "What's Changed" block
(PR title by @author with links) will be preserved verbatim as the commit log
at the bottom of the final output. Save it as AUTO_CHANGELOG.
gh api repos/stacklok/toolhive/compare/{PREVIOUS_TAG}...{CURRENT_TAG} \
--jq '.commits[] | "\(.sha[0:8]) \(.commit.message | split("\n")[0])"'Extract every PR number from commit messages (look for (#NNNN) suffixes).
Exclude the release PR itself (e.g., "Release vX.Y.Z").
Filter out PRs authored by renovate[bot], dependabot[bot], or with labels
containing dependencies. These go directly into the Dependencies section —
they do not need expert review or further classification. Record them separately.
For each PR, fetch:
Closes #N, Fixes #N, Part of #N, Resolves #N)gh pr view <number> --json title,labels,bodyFor each unique linked issue number, fetch title and labels:
gh issue view <number> --json title,labelsCheck the auto-generated changelog for the "New Contributors" section. Extract author handles.
Dependency PRs (from Step 3b) are already separated — skip them here.
Categorize each remaining PR into one of the categories below. Check the signals in this priority order — earlier signals are more reliable:
breaking-change label,
classify as Breaking regardless of whether the PR checkbox is checked.breaking, enhancement, bug, etc.| Category | Criteria |
|---|---|
| Breaking | Old behavior/field/API no longer works — linked issue labeled breaking-change, OR "Breaking change" checkbox checked, OR PR labels contain breaking, OR PR removes fields/endpoints/flags without backwards compatibility |
| Deprecation | PR introduces new deprecation warnings or marks fields as deprecated |
| New Feature | Labels contain enhancement/feature, OR PR adds new user-facing capability |
| Bug Fix | Labels contain bug, OR PR title/body indicates a fix |
| Misc | Everything else — refactors, test improvements, CI, docs, internal cleanup |
Overlap rule: If a PR belongs to multiple categories (e.g., both a new feature AND a breaking change), always classify it in the most urgent category. The priority order is: Breaking > Deprecation > Bug Fix > New Feature > Misc. The PR can still be mentioned in a secondary section (e.g., a breaking API change can also appear under New Features for its positive user impact), but its primary home is always the most urgent category.
Any PR that touches CRD types, API surfaces, wire formats, authentication flows, or MCP protocol behavior but is NOT already classified as breaking needs expert review. Flag these for Phase 3.
Heuristics for flagging:
cmd/thv-operator/api/ or CRD manifestsFor flagged PRs, always fetch the diff summary so agents have concrete data:
gh pr diff <number> --statFor flagged PRs and confirmed breaking PRs, dispatch the appropriate expert agent to assess impact and write migration guidance.
| Change Area | Agent | What to ask |
|---|---|---|
| CRD types, operator, Helm | kubernetes-expert | Is this a breaking CRD change? What manifests break? What's the migration path? |
| MCP transport, protocol messages | mcp-protocol-expert | Does this break MCP clients or change wire behavior? |
| Auth flows, OIDC, tokens, Cedar | oauth-expert | Does this break existing auth configurations? |
| API endpoints, CLI commands | toolhive-expert | Does this break CLI users or API consumers? |
| Observability, metrics, tracing | site-reliability-engineer | Does this change metric names, trace attributes, or dashboard contracts? |
For each flagged PR, include in the agent prompt:
gh pr diff <number> --stat)When a PR has no labels, no checkbox, no migration guide, and no issue references — the agent MUST read the actual code changes to make a determination. Tell the agent to examine the PR diff and the affected source files directly rather than relying on metadata. This is the fallback for under-documented PRs.
Launch all agents in a single message so they run in parallel.
Each agent returns one of:
Update the classification from Phase 2 with agent verdicts. If an agent overrides the initial classification (e.g., flags something as breaking that wasn't initially caught), trust the domain expert.
Read the template at TEMPLATE.md and use it to assemble the final release body. Omit any section that has zero entries — do not include empty headers.
Show the complete release notes to the user. Highlight:
Ask:
"Ready to publish these release notes?
- Publish — update the GitHub release with these notes
- Revise — tell me what to change
- Export — save to a file instead of publishing"
Always write the final release notes to release-notes-<tag>.md in the repo
root (e.g., release-notes-v0.19.0.md). This gives the user a reviewable
artifact before anything is published.
If the user chose "Publish", push the notes to the GitHub release:
gh release edit <CURRENT_TAG> --notes-file release-notes-<tag>.mdbreaking when the PR
isn't)./release-notes https://github.com/stacklok/toolhive/releases/tag/v0.18.0
/release-notes v0.18.0
/release-notes v0.15.0cd373ec
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.