PR-based release notes generator. Release-drafter compatible CLI using release-drafter internals.
npm install @actionutils/gh-release-notes
PR-based release notes generator with strong compatibility with GitHub’s Generate Release Notes and release-drafter. Zero-config works out of the box, and you can keep using your existing .github/release.yml or .github/release-drafter.yml.
Quick install (latest)
- Install the binary
``shell`
curl -sSfL https://github.com/actionutils/gh-release-notes/releases/latest/download/install.sh | sh`
- Or run directly without installationshell`
curl -sSfL https://github.com/actionutils/gh-release-notes/releases/latest/download/run.sh | sh
Verify latest with cosign
`shellChoose the script to execute
SCRIPT="install.sh" # or "run.sh"
DOWNLOAD_URL="https://github.com/actionutils/gh-release-notes/releases/latest/download"
curl -sL "${DOWNLOAD_URL}/${SCRIPT}" | \
(tmpfile=$(mktemp); cat > "$tmpfile"; \
cosign verify-blob \
--certificate-identity-regexp '^https://github.com/actionutils/trusted-go-releaser/.github/workflows/trusted-release-workflow.yml@.*$' \
--certificate-oidc-issuer 'https://token.actions.githubusercontent.com' \
--certificate "${DOWNLOAD_URL}/${SCRIPT}.pem" \
--signature "${DOWNLOAD_URL}/${SCRIPT}.sig" \
"$tmpfile" && \
sh "$tmpfile"; rm -f "$tmpfile")
`
Install a specific version (with optional signature verification)
Specific version (simple)
Install
`shell`
VERSION="
curl -sSfL "https://github.com/actionutils/gh-release-notes/releases/download/${VERSION}/install.sh" | sh
Run without installation
`shell`
VERSION="
curl -sSfL "https://github.com/actionutils/gh-release-notes/releases/download/${VERSION}/run.sh" | sh
Specific version (verified with cosign)
Install (verified)
`shell`
VERSION="
BASE="https://github.com/actionutils/gh-release-notes/releases/download/${VERSION}"
curl -sL "${BASE}/install.sh" | \
(tmpfile=$(mktemp); cat > "$tmpfile"; \
cosign verify-blob \
--certificate-identity-regexp '^https://github.com/actionutils/trusted-go-releaser/.github/workflows/trusted-release-workflow.yml@.*$' \
--certificate-oidc-issuer 'https://token.actions.githubusercontent.com' \
--certificate "${BASE}/install.sh.pem" \
--signature "${BASE}/install.sh.sig" \
"$tmpfile" && \
sh "$tmpfile"; rm -f "$tmpfile")
Run without installation (verified)
`shell`
VERSION="
BASE="https://github.com/actionutils/gh-release-notes/releases/download/${VERSION}"
curl -sL "${BASE}/run.sh" | \
(tmpfile=$(mktemp); cat > "$tmpfile"; \
cosign verify-blob \
--certificate-identity-regexp '^https://github.com/actionutils/trusted-go-releaser/.github/workflows/trusted-release-workflow.yml@.*$' \
--certificate-oidc-issuer 'https://token.actions.githubusercontent.com' \
--certificate "${BASE}/run.sh.pem" \
--signature "${BASE}/run.sh.sig" \
"$tmpfile" && \
sh "$tmpfile"; rm -f "$tmpfile")
Install
`shell`
gh extension install actionutils/gh-release-notes
Upgrade
`shell`
gh extension upgrade actionutils/gh-release-notes
`shell`
npx @actionutils/gh-release-notes
pnpx @actionutils/gh-release-notes
bunx @actionutils/gh-release-notes
- Generate from latest changes (auto-detects previous release):
`shell`
gh-release-notes
`
As gh extension:
shell`
gh release-notes
`
- Specify previous and next tags:
shell`
gh-release-notes --prev-tag v1.0.0 --tag v1.1.0
`
- Target a branch/revision:
shell`
gh-release-notes --target main
`
- Use a MiniJinja template:
shell`
gh-release-notes --template ./templates/github.md.jinja
gh-release-notes --template pkg:github/actionutils/gh-release-notes@main#templates/table.md.jinja
`
- JSON output (for scripting or custom rendering):
shell`
gh-release-notes --json > release.json
Tip: You can read the resolved version fields from the output (e.g., release.resolvedVersion) to decide tagging and releasing logic in your pipeline.
without any config and get a sensible, GitHub-like changelog.
Use existing configs
- .github/release.yml (GitHub Generate Release Notes)
- .github/release-drafter.yml (release-drafter)$3
- Start from a minimal, compatible config via gh-release-notes init (writes .github/release-drafter.yml, use -o - to print, --force to overwrite)
- Already on GitHub’s .github/release.yml? Convert it with gh-release-notes migrate (supports --source/--output and -o -)$3
- Prefer GitHub purl: pkg:github/OWNER/REPO@REF#path/to/config.yaml
- Recommended over raw.githubusercontent.com due to rate limits
- Great for shared organization-wide config and templates
- HTTPS URLs and local files are also supported`shell
gh-release-notes --config pkg:github/actionutils/gh-release-notes@main#.github/release-drafter.yml
`Templates and Output
$3
- Uses release-drafter–style templates from your release-drafter config
- Adds two extra placeholders: $FULL_CHANGELOG_LINK, $NEW_CONTRIBUTORS
- Fetches only fields required by your template to keep API calls minimal$3
- --template renders with the same data as --json
- Bring your own structure and style (or use community-maintained templates)$3
- release: name, tag, body, targetCommitish, resolvedVersion, majorVersion, minorVersion, patchVersion
- pullRequests{ : map of PR number to PR object containing number, title, url, mergedAt, author{ login, type, url, avatarUrl, sponsorsListing? }, labels[]
- mergedPullRequests[]: array of PR numbers in display order
- categorizedPullRequests:
- uncategorized[]: array of PR numbers
- categories[]: title, labels[], collapse_after?, pullRequests[] (array of PR numbers)
- pullRequestsByLabel: PR numbers grouped by label
- labels{