Communityコーディング&開発github.com

land-renovate

現在のリポジトリでRenovateのPRを一括で処理します。Renovateが作成したPRを列挙し、GREEN/CONFLICTING/REAL_FAILURE/HOLDに分類し、安全なPRを昇順で承認・リベースマージし、競合するPRにはリベースチェックボックスを付け、実際の障害やHOLDの場合は適切に停止します。ユーザーが「/land-renovate」「Renovate PRをランド」「Renovateキューをクリア」などと指示した場合に使用します。

land-renovate とは?

land-renovateは、現在のリポジトリ内でRenovateが作成した依存関係更新PRのキューを効率的に処理するためのAIエージェントスキルです。このスキルは、`gh`(GitHub CLI)を使用してリモートPRに対してのみ動作し、ローカルコミットを作成したり、/create-commitや/create-prなどのツールを呼び出したりしません。主なワークフローは、RenovateのPRを列挙し、各PRをGREEN(安全)、CONFLICTING(競合)、REAL_FAILURE(実際の障害)、HOLD(手動判断が必要)の4つのバケットに分類し、GREENを承認してリベースマージし、CONFLICTINGにはリベースチェックボックスをチェックして監視し、REAL_FAILUREとHOLDはスキップまたはユーザーに通知します。このスキルは、/land-renovateや「Renovate PRをランドして」などの自然言語コマンドでトリガーでき、CIチェックの状態やマージ可能性の変更を監視するためのポーリングループ(monitor-renovate-pr.shスクリプト)を備えており、誤った早期成功判定を防ぎます。このスキルは特に、多数のRenovate PRを抱えるプロジェクトで、手動で1つずつ確認・マージする手間を省き、安全なものだけを効率的にランドするのに役立ちます。

対応~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/langri-sha/skills/tree/main/land-renovate

Installed? Explore more コーディング&開発 skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

お気に入りのAIに質問する

このエージェントスキルを事前に読み込んだ状態で新しいチャットを開きます。

ドキュメント

land-renovate は何をしますか?

現在のリポジトリ内のオープンなRenovate PRのキューを処理し、安全なものをランドします。 列挙、分類、承認 + リベースマージをPR番号の昇順で行い、残りのPRにはリベースチェックボックス、 実際の障害やHOLDケースでは適切に停止します。

このスキルは gh を介して既存のリモートPR上でのみ動作します。 /create-commit、/create-pr、/wrap は呼び出さず、ローカルコミットを作成しません。

引数

引数デフォルト説明
limit=N30処理するPR数の上限を設定します。
<pr-number>...すべてのRenovate作成オープンPRスペース区切りのPR番号。指定されたPRのみを処理します。

デフォルト: 現在のリポジトリ(gh repo view --json nameWithOwner から取得)、 Renovate作成のオープンPR、PR番号の昇順、ラベルフィルターなし。

ワークフロー

1. リポジトリを特定する

REPO=$(gh repo view --json nameWithOwner -q .nameWithOwner)

2. Renovate PRを列挙する

Renovateが作成したオープンPRを、古いもの(番号が小さいもの)から順にリストします:

gh pr list -R "$REPO" --author "app/renovate" --state open --limit 30 \
  --json number,title,mergeable,mergeStateStatus,statusCheckRollup

number で昇順にソートし、その順序で処理します。引数で特定のPR番号が渡された場合は、そのセットに制限します。

注意: gh pr list は、GitHubがマージ可能性を遅延評価するため、mergeable: UNKNOWN を返すことがよくあります。単一PRに対して gh pr view <n> --json mergeable を実行すると、計算が強制されます。PRの mergeable が UNKNOWN の場合は、分類前に gh pr view で再読み込みしてください。

3. 各PRを分類する

各PRを statusCheckRollup + mergeable + mergeStateStatus を使用してバケットに分類します:

バケットシグナルアクション
GREENロールアップに FAILURE/CANCELLED/TIMED_OUT なし、保留中なし、mergeable=MERGEABLE承認 + リベースマージ (ステップ4)
CONFLICTINGmergeable=CONFLICTING または mergeStateStatus=DIRTYリベースチェックボックスをオン (ステップ5)、監視
REAL_FAILUREロールアップに自動修正不可能な FAILURE を含むスキップ、人間のトリアージに委ねる
HOLDファイル間の調整が必要(手動チェックリスト — 下記参照)人間向けに表示、先に進まない

ロールアップ内のチェックは、CheckRun の status != COMPLETED または StatusContext の state が PENDING/EXPECTED の場合に保留中と見なされます。CheckRun.conclusion が FAILURE/CANCELLED/TIMED_OUT/ACTION_REQUIRED/STARTUP_FAILURE、または StatusContext.state が FAILURE/ERROR の場合は失敗です。

HOLD チェックリスト(手動 — ハードコードされていません)

HOLD検出はエージェントが行う判断であり、自動ルールではありません。単独でランドすると別のファイルに影響を及ぼす場合にPRをHOLD候補として扱います。例:

  • terraform-version ピンの不一致 — Terraformプロバイダー/CLIのバンプで、他の場所(例: .terraform-version、CIワークフロー、required_version 制約)のピンも更新が必要な場合。
  • スキーマバンプによるコード編集が必要 — 新しいメジャーバージョンでスキーマ/型が変更され、手書きコードがそれに依存している場合。ポストアップグレードフックではコード編集を生成できない。
  • アップグレードの変更ログで、ポストアップグレードジョブが実行しない調整編集が必要な場合。

PRがHOLDのように見える場合は、それを表示してユーザーに問い合わせてください — 自動マージせず、リベースチェックボックスもオンにしないでください。残りのキューは引き続き処理します。

4. 承認 + マージ (GREEN)

gh pr review "$PR" -R "$REPO" --approve \
  --body "LGTM — Renovate一括ランドの一環として自動承認されました。"
gh pr merge "$PR" -R "$REPO" --rebase --delete-branch

5. リベースチェックボックスをオンにする (CONFLICTING)

Renovateのリベースチェックボックスを反転させてブランチをリベースし、その後監視します:

body=$(gh pr view "$PR" -R "$REPO" --json body -q .body)
new=$(printf '%s' "$body" | sed 's|^\( *\)\- \[ \] <!-- rebase-check -->|\1- [x] <!-- rebase-check -->|')
printf '%s' "$new" | gh pr edit "$PR" -R "$REPO" --body-file - >/dev/null

チェックボックスをオンにする前に、現在のヘッドSHAをベースラインとしてキャプチャし、 その後モニター(ステップ6)を実行して、開始時の状態からのリベースを区別できるようにします:

BASELINE=$(gh pr view "$PR" -R "$REPO" --json headRefOid -q .headRefOid)

REAL_FAILURE に対してリベースチェックボックスをオンにしないでください — Renovateのサイクルを無駄にし、本当の問題を隠してしまいます。

6. 安定するまで監視する

バンドルされている scripts/monitor-renovate-pr.sh は、単一のPRをそのチェックが安定するまでポーリングし、エージェントがモニターツールを介して消費する判定を出力します。

scripts/monitor-renovate-pr.sh <pr-number> <repo> <baseline-head-sha-short>
  • 45秒ごと(POLL_INTERVAL で上書き可能)に gh pr view --json headRefOid,mergeable,mergeStateStatus,statusCheckRollup をポーリングし、シグネチャ ${head:0:9}|<mergeable>:<state>|ok=N pend=M fail=K が変更された場合にのみ行を出力します。
  • ヘッドがベースラインから移動し、保留中のチェックがなく、シグネチャが連続する2回のポーリングで安定した場合に判定を出力します。
  • 最終的なstdout行は次のいずれかです:
    • GREEN: #<n> ready to merge → ステップ4に戻り、承認してマージします。
    • NOT-GREEN: #<n> settled failures=X mergeable=Y state=Z → 再分類します。現在はREAL_FAILUREまたはHOLDです。
  • オプションの環境変数: POLL_INTERVAL(秒、デフォルト45)、MAX_POLLS(N回のポーリングで諦める、0 = 無制限。枯渇時に NOT-GREEN: #<n> timeout ... を出力)。

ポーループであり gh pr checks --watch ではない理由

gh pr checks <n> --watch は、すでにマージ可能でチェックが実行中のPRには適していますが、このスキルが存在するリベースパスでは積極的に誤解を招きます:

  • 古いヘッドでのグリーンで終了します。 リベースチェックボックスがオンにされた直後、PRの_現在の_チェックはすでに終了しています — リベース前(競合)のヘッドで合格しています。--watch は「保留中のチェックなし」と見なして、Renovateがリベースする前に成功を返します。head moved off baseline 条件こそが、この偽グリーンを防ぐためのものです。
  • チェックのみを認識し、マージ可能性は認識しません。 GREEN判定には mergeable=MERGEABLE + mergeStateStatus=CLEAN が必要であり、CONFLICTING はこれらのフィールドを介して_検出_されます — gh pr checks はこれらを報告しません。単一の gh pr view ポールは両方を一度にカバーします。
  • ヘッドは2回移動する可能性があります(Renovateプッシュ、次にアプリボットのポストアップグレードプッシュ)。それらの間には、既知のチェックが一時的に完了しているウィンドウがあります。--watch はそのギャップで終了する可能性があります。「保留中なしかつ2回のポーリングで安定」というガードがそれを乗り越えます。

7. リベース後の予想コミットチェーン

リベースチェックボックスがオンにされた後(またはRenovateが独自にリベースした後)、GREENランドは通常、次のチェーンを経由します — これを知っておくと、モニターの変動が障害ではなく期待されるものであることがわかります:

  1. Renovateが新しいヘッドをプッシュ(renovate[bot] として)。
  2. pull_request ワークフローが起動します。check.yml のポストアップグレードステップは、eslint --fix、prettier --write、vitest --update、projen、および beachball 変更エントリを実行します。
  3. ポストアップグレードステップで差分が発生した場合、commit-upgrade-changes ジョブは actions/create-github-app-token@v2 を介してアプリトークンを生成し、<app-slug>[bot] として修正をプッシュします。そのボットプッシュにより pull_request ワークフローが再トリガーされるため、ヘッドが2回目の移動をし、チェックが再実行されます。
  4. 最終準備完了状態: mergeable=MERGEABLE、mergeStateStatus=CLEAN、すべてのチェックが SUCCESS/SKIPPED。

ヘッドは2回移動する可能性があるため(Renovate、次にアプリボット)、モニターは「ヘッドがベースラインから移動 + 保留中なし + 2回の安定ポール」に基づいて判定を下し、最初に確認したプッシュには基づきません。

停止条件

  • GREEN PRが残っていない — 完了。
  • REAL_FAILURE — スキップ、次のPRに進む。REAL_FAILUREを自動リベースしない。
  • HOLD候補 — 人間の判断のために表示する。自動マージしない。
  • ユーザーがキャンセル。

制約

  • コミット件名にIssue/PR参照を含めないこと(プロジェクトルール)。ここではリモートPRのマージには適用されませんが、このスキルがローカルコミットを作成するように拡張された場合は、参照を件名から本文に移動してください。/create-commit を参照。
  • REAL_FAILUREに対してリベースチェックボックスをオンにしないこと。
  • HOLD候補を自動マージしないこと。
  • HOLD検出は手動チェックリストであり、ハードコードされたルールではありません。上記のカテゴリを認識し、候補を表示してください。判断を自動化しようとしないでください。

テスト注意事項

ドライランの分類

何にも触れずにバケットを列挙して確認する:

gh pr list -R "$REPO" --author "app/renovate" --state open \
  --json number,title,mergeable,mergeStateStatus,statusCheckRollup \
  | jq -r '.[] | "\(.number)\t\(.mergeable)\t\(.mergeStateStatus)\t\(.title)"'

保留中/失敗チェックを確認するために、PRごとにロールアップサマリーを追加する:

gh pr list -R "$REPO" --author "app/renovate" --state open \
  --json number,statusCheckRollup \
  | jq -r '.[] | "\(.number)\t" + ([.statusCheckRollup[] | .conclusion // .state] | join(","))'

モニターのスモークテスト

既知のPRに対して偽のベースラインSHA(ヘッドがすでに「移動した」とみなされるように)と短い間隔でモニターを実行し、状態行と最終判定を確認する:

POLL_INTERVAL=2 MAX_POLLS=4 \
  scripts/monitor-renovate-pr.sh <known-pr> "$REPO" deadbeef0

シグネチャ変更ごとに1行の状態行、次に GREEN: / NOT-GREEN: の判定が表示されるはずです。PRの実際のヘッドをベースラインとして渡すと、リベースなしのパスがテストされます: ヘッドが移動しないため、安定せず、MAX_POLLS タイムアウトで終了します。

対象外

  • ハードコードされたHOLD検出ルール(上記の手動チェックリストとして開始し、後で拡張)。
  • このスキルを任意のオーケストレーションレイヤーに配線すること。

関連スキル