mcpField
R
release-notes

release-notes

github.com/jackin-projectDevelopment3164 installsUpdated 5w ago
Repository

About release-notes

release-notes is a repository skill that creates or refreshes the [Unreleased] section of CHANGELOG.md from merged pull requests and ungrouped commits since the last release tag. It is intended for maintainers preparing and reviewing release notes.

Key features

  1. 01Detect the last release tag
  2. 02Collect merged pull requests with gh
  3. 03Classify changes into changelog categories
  4. 04Include commits not linked to pull requests
  5. 05Ask before replacing existing entries
  6. 06Present the draft for approval

Use cases

  1. 01Prepare a changelog before a release
  2. 02Preview the next release's changes
  3. 03Regenerate or update an existing [Unreleased] section

Install

Copy the command and run it in a terminal.

$npx skills add https://github.com/jackin-project/jackin-dev --skill release-notes

After installing, type/release-notesin Claude Code to confirm it loaded.

Details

From the project README

Release Notes

Generates or updates the [Unreleased] section of CHANGELOG.md from merged PRs since the last release tag.

When to Use

  • Before a release, to populate the changelog
  • When you want to preview what would go into the next release
  • When asked to update or regenerate the changelog

Process

Step 1: Detect Last Tag
LAST_TAG=$(git describe --tags --abbrev=0 2>/dev/null || echo "")

If no tags exist, this is the first release. Use the initial commit as the starting point:

FIRST_COMMIT=$(git rev-list --max-parents=0 HEAD)
Step 2: Get the Tag Date
TAG_DATE=$(git log -1 --format=%aI "$LAST_TAG" 2>/dev/null || echo "")
Step 3: Gather Merged PRs
gh pr list --state merged --base main --search "merged:>$TAG_DATE" --json number,title,labels,mergedAt --jq '.[] | {number, title, labels: [.labels[].name], mergedAt}'
Step 4: Classify Each PR

Classify PRs into Keep a Changelog categories based on title prefix and labels:

Title prefixLabelCategory
feat:, feature:feature, enhancementAdded
fix:bug, bugfixFixed
security:securitySecurity
refactor:, chore:, docs:, ci:, build:refactor, chore, docsChanged
deprecate:deprecatedDeprecated
remove:removedRemoved

If a PR doesn't match any prefix or label, place it in Changed as the default.

Strip the conventional commit prefix from the title when generating the entry. For example:

  • feat: add TUI launcher becomes Add TUI launcher
  • fix: symlink escape in mounts becomes Fix symlink escape in mounts

Capitalize the first letter of each entry.

Step 5: Find Ungrouped Commits

Find commits since the last tag that are not associated with any merged PR:

git log "$LAST_TAG"..HEAD --oneline --no-merges

For each commit, check if it was part of a PR:

gh pr list --state merged --search "<commit-sha>" --json number --jq '.[0].number'

Commits not associated with a PR go into the Ungrouped commits section.

Step 6: Format the Changelog Section

Format as Keep a Changelog with PR links:

## [Unreleased]

### Added
- Add TUI launcher for interactive agent selection ([#12](https://github.com/jackin-project/jackin/pull/12))

### Fixed
- Fix symlink escape in container mounts ([#15](https://github.com/jackin-project/jackin/pull/15))

### Changed
- Extract testing instructions into TESTING.md ([#18](https://github.com/jackin-project/jackin/pull/18))

Only include sections that have entries. Do not include empty sections.

If there are ungrouped commits, add:

### Ungrouped commits (not from PRs)
- `205875a` docs: fix resolve_agent_source references
- `efa41b8` docs: split TODO into individual files
Step 7: Check for Existing Unreleased Section

Read CHANGELOG.md and check if an [Unreleased] section already has content.

If it does, ask the user:

"CHANGELOG.md already has entries in the [Unreleased] section. Do you want to: A) Regenerate from scratch (replace existing entries) B) Keep existing entries and add any missing PRs"

Step 8: Write to CHANGELOG.md

If CHANGELOG.md does not exist, create it with the standard header:

# Changelog

All notable changes to this project will be documented in this file.

The format is based on [Keep a Changelog](https://keepachangelog.com/),
and this project adheres to [Semantic Versioning](https://semver.org/).

<!-- next-header -->

## [Unreleased]

[generated entries here]

If CHANGELOG.md exists, replace the ## [Unreleased] section content (everything between ## [Unreleased] and the next ## [ heading or end of file).

Step 9: Present for Review

Show the complete [Unreleased] section to the user. Allow them to:

  • Request edits ("move PR #42 to Added", "reword this entry", "remove this commit")
  • Approve as-is

Do not proceed until the user approves the changelog content.

Idempotency

This skill is safe to run multiple times:

  • It always checks the current state of CHANGELOG.md before writing
  • It asks before overwriting existing entries
  • PR data is fetched fresh from GitHub each time

Comments

Markdown supported