Generate release notes between two git tags with categorized PR summaries and author attribution
83
Does it follow best practices?
If you maintain this skill, you can automatically optimize it using the tessl CLI to improve its score:
npx tessl skill review --optimize ./path/to/skillValidation for skill structure
Parse $ARGUMENTS to extract:
-- is the release tag (e.g. 1.22.0). Referred to as TAG below.-- is an optional previous tag override. If absent, auto-detect the previous tag.Check that TAG exists as a git tag:
git tag -l TAGIf the tag does not exist, stop with an error: "Tag TAG not found. Please create the tag first and re-run."
If a previous tag was provided in $ARGUMENTS, validate it exists and use it as LOWER.
Otherwise, find the previous tag automatically:
git tag --sort=-v:refnameWalk the sorted list to find the tag immediately before TAG (by version order). Set that as LOWER.
Validate LOWER exists. Stop with an error if no previous tag can be determined.
Get all commits between the two tags:
git log --oneline LOWER..TAGFilter out:
Extract PR numbers from the remaining commit messages (pattern #NNNN). Every PR number must appear in the final release notes — none may be silently dropped.
For each PR number, fetch metadata using gh. Use Task agents to run in parallel batches for efficiency:
gh pr view NUMBER --repo dlt-hub/dlt --json number,title,labels,body,authorCollect for each PR:
author.loginIf a PR title is vague (e.g. just an issue number, single word) or the body is empty/unhelpful:
fixes #NNN, closes #NNN, #NNN in body). If so, fetch the issue:
gh issue view NNN --repo dlt-hub/dlt --json title,bodygh pr diff NUMBER --repo dlt-hub/dltAssign each PR to exactly one category using these rules (evaluated in order). Every PR must be classified — verify the total count matches.
Collect separately (appears at the top, not a standalone category — the PR also appears in its main category). A PR has breaking changes if:
breaking label, ORExtract the specific breaking change description from the PR body.
A PR is a highlight if:
highlight label, ORfeat or (feat)) AND the change is impactful — meaning it introduces a new user-facing capability, enables a major use case, or represents substantial effortHighlighted PRs also appear in their main category (Core Library, etc.) but with a brief entry pointing to the Highlights section.
docs/documentation labelci full, tech-debt, cichore, repo:, ci:, or the change only affects tests/toolingEverything else — features, bug fixes, enhancements to the library itself.
For each release author, find their first ever merged PR:
gh search prs --repo dlt-hub/dlt --author AUTHOR --merged --sort created --order asc --limit 1 --json number,createdAtA contributor is new if their first merged PR number falls within the LOWER..TAG commit range.
Write the notes in this exact structure:
## dlt TAG Release Notes
## Breaking Changes
(Only if there are breaking changes. Numbered list.)
1. **Short description** (#NUMBER @author) — Explanation of what broke and how it affects users.
## Highlights
- **Feature name** (#NUMBER @author) — Description of the feature and why it matters.
## Core Library
- **Feature/fix name** (#NUMBER @author) — Brief description.
- **Fix: short description** (#NUMBER @author)
## Docs
- Description (#NUMBER @author)
## Chores
- **Title** (#NUMBER @author) — Brief description if non-obvious.
## New Contributors
- @author made their first contribution in #NUMBER#NUMBER format (GitHub auto-links them)@login format (GitHub auto-links them)Display the formatted release notes to the user for review. Include a summary:
Ask the user to approve or request changes before writing.
Only after user approval, write the release notes to /tmp/release-notes-TAG.md.
Report the file path to the user.
e3e58fe
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.