update-release-notes について
tldraw/tldraw リポジトリのリリースノートを管理するスキルです。SDK のリリースを担当する開発者向けに、PR の収集、ノートの更新とアーカイブ、GitHub のドラフトリリースとの同期を案内します。
主な機能
- 01リリース段階と対象ブランチの判定
- 02main または production から PR を収集
- 03項目の追加と古いノートの整理
- 04公開済みノートのアーカイブ
- 05GitHub ドラフトリリースとの同期
活用シーン
- 01開発中の next.mdx の更新
- 02production を基にしたリリース週のノート作成
- 03リリース公開後のノートのアーカイブ
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ tldraw/ tldraw --skill update-release-notesインストール後、Claude Code で/update-release-notesを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
scripts/fetch-pr-batch.shget-changelog-status.shget-new-prs-from-main.shget-new-prs.shupdate-draft-release.sh詳細
リリースノートの更新
このスキルは、tldraw/tldraw リポジトリでリリースノートを維持するための運用タスクを処理します。next.mdx に新しい PR エントリを追加し、新しいバージョンが公開されたときにリリースをアーカイブします。
このスキルは tldraw-internal リポジトリから実行されますが、tldraw/tldraw のローカルクローンに対して操作を行います。
セットアップ
開始する前に、tldraw リポジトリをクローンします:
git clone https://github.com/tldraw/tldraw.git /tmp/tldraw
すべてのスクリプトは、リポジトリのパスを最初の引数として受け取ります。この SKILL.md を含むディレクトリを <skill-dir> に置き換えて、リポジトリのルートからスクリプトコマンドを実行します。すべてのファイル編集はこのクローン内で行われます。最後に、クローンからコミットしてプッシュします。
リリースサイクル
SDK は 4 週間ごとにリリースされます。ローンチの 1 週間前に SDK はフリーズされ、main から production ブランチが切られます。リリース週の間は、ホットフィックスのみが production にチェリーピックされます。
next.mdx のリリースノートは、最終的に production ブランチで出荷される内容を反映している必要があります。ただし、フリーズ前の約 3 週間の開発期間中は、リリースノートが空にならないように main からリリースノートを積み上げていきます。ステータススクリプトは、最後のマイナーリリースの日付に基づいて、どのフェーズにいるかを検出します:
- 開発週 (
source: "main"、最後のマイナーリリースから 3 週間未満): PR は最後のリリースタグ以降のmainから収集されます。これらは暫定的なものであり、リバートされたり、production のチェリーピックが異なったりすると、出荷されないものもあります。 - フリーズ週 (
source: "production"、最後のマイナーリリースから 3 週間以上): PR は、前回のリリースブランチに対してgit cherryを使用してproductionブランチから収集されます。フリーズ前にランディングした PR、または production にホットフィックスされた PR のみが含まれます。mainから蓄積されたエントリのうち、production にないものは削除されます。
next.mdx 自体も、リリースが公開される前に production 上にある 必要があり、単にそれを記述するだけではいけません。prepack.ts は、公開されるチェックアウトから tldraw npm パッケージ内に同梱される RELEASE_NOTES.md を生成し、リリースされるバージョンのエントリとして next.mdx を使用します。production はフリーズ中はホットフィックスによってのみ移動するため、main にマージされたリリースノートの PR は、dotcom-hotfix-please ラベルも付けられている場合にのみそこに到達します (ステップ 10 を参照)。公開前のチェックは、空の差分です:
git diff --stat origin/production origin/main -- apps/docs/content/releases/next.mdx
プロセス
1. ステータスを確認する
ステータススクリプトを実行して、バージョンと diff ブランチを判定します:
<skill-dir>/scripts/get-changelog-status.sh /tmp/tldraw
これは次を返します:
source-"main"(開発週) または"production"(リリース週) のいずれかdiff_branch(例:v4.3.x) - diff の対象となるブランチ (sourceが"production"の場合に使用)last_tag(例:v4.4.0) - 最後のリリースタグ (sourceが"main"の場合に使用)latest_release- 最も最近公開されたリリース- アーカイブが必要かどうか
2. アーカイブを処理する (必要な場合)
next.mdx の last_version 以降に新しいリリースが公開された場合:
next.mdxの内容をvX.Y.0.mdx(例:v4.3.0.mdx) にコピーします- 新しいファイルのフロントマターを更新します:
titleをバージョンに設定します- 日付を更新します
- フロントマターの後に GitHub リリースへのリンクを追加します
apps/docs/content/getting-started/releases.mdxのリリースインデックスに新しいバージョンを追加します:- 該当する
## v{major}.xセクションの先頭に行を追加します - 形式:
- [vX.Y](/releases/vX.Y.0) - Brief description - 説明は、導入段落からのリリースハイライトの短い要約である必要があります (3〜5 個の主要機能をカンマ区切りで)
- 新しいメジャーバージョンのセクションが必要な場合は、前のセクションの上に作成します
- 該当する
next.mdxをリセットします:last_versionフィールドを新しいリリースに更新します- コンテンツセクションをクリアします
- 新しい変更を蓄積するためにファイル構造を維持します
3. 新しい PR を見つける
アプローチは、ステップ 1 の source フィールドによって異なります。
source が "production" の場合(リリース週):
前回のリリース以降の本番ブランチ上の PR 番号を取得します:
<skill-dir>/scripts/get-new-prs.sh /tmp/tldraw <diff_branch>
これは git cherry(extract-draft-changelog.tsx と同じアプローチ)を使用して、origin/production と origin/<diff_branch> の間のパッチを比較します。git log とは異なり、git cherry はコミットハッシュではなくパッチの内容を比較することで、チェリーピックされたホットフィックスコミットを正しく処理します。
source が "main" の場合(開発週):
最後のリリースタグ以降の main 上の PR 番号を取得します:
<skill-dir>/scripts/get-new-prs-from-main.sh /tmp/tldraw <last_tag>
これは git cherry を使用して、origin/main とリリースタグの間のパッチを比較し、production にチェリーピックされてすでにリリースで出荷されたコミットを除外します。
両方のスクリプトの出力:
- stdout: コミットメッセージから抽出された PR 番号(1 行に 1 つ)
- stderr: PR 番号のないコミット(通常はホットフィックスまたは直接コミット)
4. ホットフィックスコミットを解決する
ステップ 3 の stderr で、PR 番号のない [HOTFIX] コミットがないか確認します。SDK に関連するものごとに(dotcom のみのものはスキップ)、対応する PR を見つけます:
gh pr list -R tldraw/tldraw --state merged --search "<hotfix title keywords>" --json number,title --jq '.[]'
また、sdk-hotfix-please ラベルが付いた PR も確認しますが、それらが実際に production に反映されたことを検証してください。このラベルは前回のリリースブランチ(例: v4.3.x)のパッチリリースにも使用されます:
gh pr list -R tldraw/tldraw --label "sdk-hotfix-please" --state merged --limit 20 --json number,title,mergedAt
一致した PR 番号があれば、ステップ 3 の production PR リストに追加します。
5. PR の詳細を取得する
すべての PR 情報を一括取得します:
<skill-dir>/scripts/fetch-pr-batch.sh <pr1> <pr2> ...
6. 古いエントリを削除する
完全な PR リスト(ステップ 3 + 4 から)を、next.mdx ですでに参照されている PR 番号と比較します。next.mdx から、PR が現在のセットに含まれていないエントリを削除します。
sourceが"production"の場合: これは、開発中にmainから蓄積されたものの、production に反映されなかったエントリを削除します。これらは、production ブランチが切られた後にmainに反映された PR であり、今回のリリースでは出荷されません。sourceが"main"の場合: これは、リバートされた、またはその他の理由で main 上にもはや存在しない PR のエントリを削除します。production が切られるまで完全なセットが確定しないため、削除はそれほど積極的ではありません。
エントリを削除するときは、それが特集の「What's new」セクションで参照されていないかも確認し、そのセクションも削除します。削除された機能について言及している場合は、イントロ段落も更新します。
7. 新しいエントリを追加する
next.mdx にまだ含まれていない各 PR について:
- PR のラベルと本文をスタイルガイドの分類ルールと照らし合わせて確認する
- 省略すべき PR をスキップする(スタイルガイドを参照)
- 同じリリースサイクルで導入されたバグを修正する PR をスキップする(つまり、前回のリリースには含まれていなかった、
next.mdxにすでにある他の PR によって引き起こされたバグ) - PR がリバートである場合、元のリバートされた PR のエントリが
next.mdxにあればそれも削除する - 適切なセクションにエントリを追加する
- 必要に応じて、重要な変更を特集セクションに昇格させる
8. 検証
以下を確認します:
next.mdxで参照されているすべての PR が、現在の PR セット(sourceに応じてmainまたはproductionから)に含まれている- PR リンクが正しい
- コミュニティのコントリビューターがクレジットされている
- セクションが正しい順序になっている
- 破壊的変更が 💥 でマークされている
- 非推奨が 🔜 でマークされている
注: source が "main" の場合、エントリは暫定的なものです。production ブランチが切られて source が "production" に切り替わると、一部は後で削除される可能性があります。
9. ドラフトの GitHub リリースを更新する
次のマイナーリリース用のドラフト GitHub リリースを next.mdx と同期させておきます。publish-new.ts はドラフトを名前(vX.Y.0)で検索し、リリース時にその本文をそのまま公開するため、ここで next.mdx を反映しておけば、GitHub リリースとドキュメントのリリースページは常に一致します。
<skill-dir>/scripts/update-draft-release.sh /tmp/tldraw
このスクリプトは次のことを行います。
next.mdxのlast_versionから対象バージョンを導出します(マイナーをバンプし、パッチを0にします — 例:v5.2.0→v5.3.0)。next.mdxの本文(frontmatter を除去したもの)をリリース本文として使用します。- ドラフトが存在しない場合は作成し、
vX.Y.0という名前の既存のドラフトがある場合は編集します。すでに公開済みのリリースには手を付けず、空の本文も書き込みません。
メジャーリリース / バージョンの上書き: 上記のマイナーバンプがデフォルトである理由は、ほぼすべてのリリースがマイナーだからです。publish-new.ts は、自身が解決したバージョンでドラフトを検索します — --bump major(または上書き)の場合、そのバージョンはマイナーバンプではなく NPM から取得されるため、マイナーをハードコードしているとドラフトの名前が一致せず、getDraftRelease が失敗します。次のリリースがメジャーである場合、または次のマイナーでない場合は、ドラフト名が一致するように対象を明示的に指定してください。
<skill-dir>/scripts/update-draft-release.sh /tmp/tldraw v6.0.0
next.mdx を更新するたびに、リリース週の実行も含めてこれを実行してください。2 回目(公開後)の実行では、前のマイナーのドラフトはすでに公開されているため、リセットされた last_version から導出された新しい次のマイナー用のドラフトが新規に作成されます。
10. 変更をプッシュする
next.mdx (および任意のアーカイブファイル) を編集したら、tldraw のクローンからコミットしてプッシュします。ブランチのコミットに [skip ci] を追加しないでください。このマーカーが存在すると、必須のプルリクエストチェックが開始されなくなります。以下の PR タイトルは、代わりに最終的なスクアッシュマージコミットにマーカーを追加します。
cd /tmp/tldraw
BRANCH="update-release-notes-$(date -u +%Y%m%d-%H%M)"
git checkout -b "$BRANCH"
git add apps/docs/content/releases/
git commit -m "docs(releases): update release notes"
git push -u origin "$BRANCH"
次に、../pr/SKILL.md のワークフローと ../write-pr/SKILL.md の標準に従って PR を作成します。
- ラベル:
docs-hotfix-pleaseを追加します (gh pr edit <number> --add-label docs-hotfix-please、またはgh pr createで--label docs-hotfix-please)。これがないと、mainへのマージでリリースノートが現在のリリースブランチ (vX.Y.x) にチェリーピックされず、更新が tldraw.dev に到達しません。これはこの実行の本来の目的です。 - フリーズ週ラベル:
sourceが"production"の場合、dotcom-hotfix-pleaseも追加します。これにより、マージされた PR がhotfixesにチェリーピックされ、そこからproductionに反映されます。リリース公開時にprepack.tsがnext.mdxを読み取るのはこのproductionです (「リリースサイクル」を参照)。docs-hotfix-pleaseだけではproductionには一切触れません。マージ後、「リリースサイクル」の diff コマンドでホットフィックスが反映されたことを確認します。dotcom ホットフィックスボットが失敗した場合は、hotfixesからブランチを作成してスクアッシュコミットを手動でチェリーピックし、コミットメッセージから[skip ci]マーカーを削除して、hotfixesに対して[HOTFIX]PR を作成します。 - タイトル:
docs(releases): update release notes [skip ci]—[skip ci]は PR タイトルに含める必要があります。GitHub のスクアッシュマージは PR タイトルをマージコミットのサブジェクトとして使用し、CI をスキップする必要があるのはこのマージコミットだからです。PR を スクアッシュマージ します (リベースやマージコミットの作成は行わないでください)。これにより、ベースブランチに[skip ci]コミットがちょうど 1 つだけ着地します。 - 変更タイプ:
other - テストプラン: 番号付きリストを削除します (手動テスト手順はありません)。単体テストとエンドツーエンドテストの両方のチェックを外します。
- リリースノート: このセクションは省略します (ユーザーに影響しない内部ドキュメント作業)
- 説明の段落: 「In order to...」で始め、
source(mainまたはproduction) と、何が更新されたか (新しいエントリの追加、古いエントリの削除、アーカイブの実行、GitHub ドラフトリリースの同期など) に言及します。 Documentation行を含む コード変更 テーブルを含めます
[skip ci] が PR タイトルにのみ含まれる理由: ブランチのコミットでは、必須のプルリクエストチェックを実行する必要があります。GitHub のスクアッシュマージはマージコミットに PR タイトルを使用するため、リリースノートのみの変更が main に着地したときに、このマーカーがプッシュワークフローをスキップします。
[skip ci] は docs-hotfix-please ラベルを妨げません。trigger-sdk-hotfix.yml は pull_request_target で実行され、GitHub の skip-ci マーカーはこれに影響しません。また、ホットフィックススクリプトはチェリーピックしたコミットから skip-ci マーカーを削除するため、リリースブランチへのプッシュでもパブリッシュワークフローがトリガーされます。このトリガーはラベル付きの PR がマージされたときに発生します。後で再トリガーするには、マージされた PR でラベルを削除して再度追加します。dotcom-hotfix-please についても、#10629 が修正されれば同じことが当てはまります。それまでは、そのボットはマーカーを保持し、開かれるホットフィックス PR のチェックが実行されません。
PR 本文の他の場所に [skip ci] という文字列をそのまま書かないでください。GitHub はスクアッシュマージコミットメッセージ全体からマーカーを読み取り、PR 本文はそのコミットの本文になります。
last_version フィールド
next.mdx のフロントマターには、直近に公開されたリリースを追跡する last_version フィールドが含まれています。これはどの PR が「新規」で追加が必要かを判断します。
SDK リリースワークフロー
SDK リリース時には、ドキュメントサイトをリリース後の状態にするために、このスキルが 2 回 実行されます。
- 1 回目の実行 — リリースで出荷されるすべての PR を
next.mdxに反映します(フリーズ週のソースは"production")。これにより、公開前にリリースノートが完全な状態になります。ドラフトリリースのステップ(ステップ 9)は、このnext.mdxからドラフトのvX.Y.0GitHub リリースを同期するため、publish-new.tsは完成したノートを公開できる状態で保持します。PR はdocs-hotfix-pleaseとdotcom-hotfix-pleaseの両方(ステップ 10)を持つため、ファイルはサイト用のv(X.Y-1).xとパッケージ用のproductionに届きます。 - ゲート — 誰かが公開する前に、
next.mdxはproductionとmainで同一でなければならず(「リリースサイクル」の diff コマンドが何も出力しないこと)、ドラフトのvX.Y.0リリースはnext.mdxと一致している必要があります。その後next.mdxへの編集が dotcom ホットフィックスなしでmainに入った場合、または最後のドラフト同期の後に入った場合は、まずそれを修正してください。 - リリースを NPM に公開 — これはこのスキルの範囲外で行われます。
publish-new.tsはステップ 1 で作成されたドラフトリリースを公開し、prepack.tsはproductionのnext.mdxをそのバージョンのRELEASE_NOTES.mdエントリとしてtldrawパッケージに焼き込みます。公開はバージョンバンプをproductionではなくmainにプッシュします。 - 2 回目の実行 — リリースが公開されたので、ステータススクリプトは
needs_archive: trueを検出します。このワークフローはproductionへのプッシュで実行されますが、公開はプッシュを行わないため、2 回目の実行は次のproductionプッシュ時(通常はmainからのローンチ後の dotcom リリース)、または誰かがupdate-release-notes.ymlを手動でディスパッチしたときに発生します。この実行では:next.mdxをバージョン付きファイル(例:v4.5.0.mdx)にアーカイブします- 新しいバージョンをリリースインデックス(
releases.mdx)に追加します - 新しい
last_versionでnext.mdxをリセットします - フリーズ中(リリースタグ以降)に
mainに入った PR を検出し、新しいnext.mdxに追加します - 前回のドラフトが公開されたため、新しい次のマイナーバージョン用の新しいドラフトを同期します(ステップ 9)
- 新しい
vX.Y.xブランチに入りサイトを再公開するために、docs-hotfix-please(dotcom-hotfix-pleaseではない: パッケージが出た後はノートにproductionはもう関係ありません)が必要です
2 回目の実行後、ドキュメントサイトには公開されたリリースが反映され、next.mdx には次のサイクルの変更に対する先行スタートがすでにあります。
参考資料
- スタイルガイド: リリースノートの記事に何を含めるべきか、どのようにフォーマットするかについては
../shared/release-notes-guide.mdを参照してください。 - 執筆ガイド: ボイスとスタイルの規約については
../../VOICE.mdを参照してください。 - スクリプト: ドラフト GitHub リリースを同期するための
update-draft-release.shを含む自動化ヘルパーについてはscripts/を参照してください