release-notes について
release-notesは、最後のリリースタグ以降にマージされたPRと未分類のコミットをもとに、CHANGELOG.mdの[Unreleased]セクションを作成・更新するリポジトリ用スキルです。リリースノートを準備・確認するメンテナー向けです。
主な機能
- 01最後のリリースタグの検出
- 02ghによるマージ済みPRの収集
- 03変更内容のカテゴリ分類
- 04PRに関連付かないコミットの追加
- 05既存項目を置き換える前の確認
- 06草案の提示と承認依頼
活用シーン
- 01リリース前の変更ログ作成
- 02次回リリースに含む変更の確認
- 03既存の[Unreleased]セクションの再生成・更新
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ jackin-project/ jackin-dev --skill release-notesインストール後、Claude Code で/release-notesを入力して読み込まれたか確認します。
詳細
リリースノート
最後のリリースタグ以降にマージされた PR を基に、CHANGELOG.md の [Unreleased] セクションを生成または更新します。
使用するタイミング
- リリース前に、変更履歴を記入するとき
- 次回のリリースに含まれる内容をプレビューしたいとき
- 変更履歴の更新または再生成を依頼されたとき
手順
ステップ 1:最後のタグを検出する
LAST_TAG=$(git describe --tags --abbrev=0 2>/dev/null || echo "")
タグが存在しない場合は、これが最初のリリースです。開始点として最初のコミットを使用します。
FIRST_COMMIT=$(git rev-list --max-parents=0 HEAD)
ステップ 2:タグの日付を取得する
TAG_DATE=$(git log -1 --format=%aI "$LAST_TAG" 2>/dev/null || echo "")
ステップ 3:マージ済み PR を収集する
gh pr list --state merged --base main --search "merged:>$TAG_DATE" --json number,title,labels,mergedAt --jq '.[] | {number, title, labels: [.labels[].name], mergedAt}'
ステップ 4:各 PR を分類する
タイトルの接頭辞とラベルに基づいて、PR を Keep a Changelog のカテゴリに分類します。
| タイトルの接頭辞 | ラベル | カテゴリ |
|---|---|---|
feat:, feature: | feature, enhancement | 追加 |
fix: | bug, bugfix | 修正 |
security: | security | セキュリティ |
refactor:, chore:, docs:, ci:, build: | refactor, chore, docs | 変更 |
deprecate: | deprecated | 非推奨 |
remove: | removed | 削除 |
どの接頭辞やラベルにも一致しない PR は、デフォルトとして 変更 に分類します。
エントリを生成する際は、タイトルから Conventional Commits の接頭辞を取り除きます。たとえば次のようになります。
feat: add TUI launcherはAdd TUI launcherになりますfix: symlink escape in mountsはFix symlink escape in mountsになります
各エントリの最初の文字を大文字にします。
ステップ 5:グループ化されていないコミットを見つける
最後のタグ以降のコミットのうち、マージ済み PR に関連付けられていないものを見つけます。
git log "$LAST_TAG"..HEAD --oneline --no-merges
各コミットが PR の一部だったかどうかを確認します。
gh pr list --state merged --search "<commit-sha>" --json number --jq '.[0].number'
PR に関連付けられていないコミットは、グループ化されていないコミット セクションに追加します。
ステップ 6:変更履歴セクションを整形する
PR へのリンクを含め、Keep a Changelog の形式で整形します。
## [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))
エントリがあるセクションのみを含めます。空のセクションは含めないでください。
グループ化されていないコミットがある場合は、次を追加します。
### Ungrouped commits (not from PRs)
- `205875a` docs: fix resolve_agent_source references
- `efa41b8` docs: split TODO into individual files
ステップ 7:既存の Unreleased セクションを確認する
CHANGELOG.md を読み込み、[Unreleased] セクションにすでに内容があるか確認します。
内容がある場合は、ユーザーに尋ねます。
「CHANGELOG.md の [Unreleased] セクションには、すでにエントリがあります。次のどちらを行いますか? A) 最初から再生成する(既存のエントリを置き換える) B) 既存のエントリを残し、不足している PR を追加する」
ステップ 8:CHANGELOG.md に書き込む
CHANGELOG.md が存在しない場合は、標準のヘッダーを付けて作成します。
# 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/).
## [Unreleased]
[generated entries here]
CHANGELOG.md が存在する場合は、## [Unreleased] セクションの内容(## [Unreleased] と次の ## [ 見出し、またはファイル末尾までのすべて)を置き換えます。
ステップ 9:レビュー用に提示する
[Unreleased] セクション全体をユーザーに提示します。ユーザーは次の操作を行えます。
- 編集を依頼する(「PR #42 を Added に移動する」「このエントリを書き換える」「このコミットを削除する」など)
- そのまま承認する
ユーザーが変更履歴の内容を承認するまで、先に進まないでください。
冪等性
このスキルは複数回実行しても安全です。
- 書き込む前に、常に
CHANGELOG.mdの現在の状態を確認します - 既存のエントリを上書きする前に確認します
- PR データは実行のたびに GitHub から最新の情報を取得します