mcpField
R
release-train-runner

release-train-runner

github.com/fellowship-dev開発3154 回インストール2 週間前に更新
リポジトリ

release-train-runner について

release-train-runner は、レビュー済みPRを指定順にリリースブランチへ統合するメンテナー向けスキルです。各PRを順番に検証、マージ、テストし、リリースPRとローカルレポートを作成します。

主な機能

  1. 01PRを順番に検証・統合
  2. 02マージごとの競合解決とテスト
  3. 03必要に応じた依存ロックファイルの再生成
  4. 04リリースブランチと統合リリースPRの作成
  5. 05ローカルレポートと結果マーカーの出力

活用シーン

  1. 01レビュー済みPRをリリースブランチに集約
  2. 02各統合をテストし、スキップしたPRを記録
  3. 03リリースPR用の統合手動テスト計画を作成
  4. 04リリース結果レポートを生成

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/fellowship-dev/dogfooded-skills --skill release-train-runner

インストール後、Claude Code で/release-train-runnerを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

CONTEXT.md
shared/
release-pr-template.md
report-template.md
test-commands.md
stages/00-claim-compute/
CONTEXT.md
stages/01-preflight/
CONTEXT.md
stages/02-release-branch/
CONTEXT.md
stages/03-validate-integrate/
CONTEXT.md
stages/04-lockfiles/
CONTEXT.md
stages/05-push-release-pr/
CONTEXT.md
stages/06-release-env/
CONTEXT.md
stages/07-report/
CONTEXT.md

詳細

目的

リモートコンピューティング環境(Ona または Codespaces)で、レビュー済みの N 個の PR を順番に 1 件ずつ、単一のリリースブランチにマージします。マージのたびにテストスイート全体を実行します。競合を記録し、統合された手動テスト計画を含むリリース PR を 1 件作成し、ローカルレポートも作成します。

このスキルは OPERATOR セッションで実行され、ワーカーのライフサイクルを管理します。ゲートウェイの worker API(pylot-cli スキルの § Workers を参照)を使ってリポジトリの worker devbox を起動し、ステージ 01〜06 をワーカー経由で実行します。ステージ 00(コンピューティング環境の確保)とステージ 07(レポートと結果マーカー)は、オペレーター内でインライン実行します。

この手順は完全に逐次実行します。 並列処理は一切ありません。PR ごとに、ほかのすべての PR に新たな競合が発生するため、ステージ 03 内の単一ループで、指定された順序に従って PR を 1 件ずつ検証し、統合する必要があります。PR ごとにサブエージェントを並列起動してはいけません。

ワーカーのセットアップ

ステージ 00(コンピューティング環境の確保後)で、ステージ 01〜06 用のワーカーを起動します。

REPO="${0:-$PYLOT_REPO}"
SPAWN_RESP=$(curl -s --max-time 90 -X POST \
  -H "Authorization: Bearer $PYLOT_DISPATCH_TOKEN" \
  -H "Content-Type: application/json" \
  -d "{\"repo\": \"$REPO\"}" \
  "${PYLOT_API}/missions/${PYLOT_JOB_ID}/workers")
WID=$(echo "$SPAWN_RESP" | python3 -c 'import sys,json; print(json.load(sys.stdin).get("worker_id",""))' 2>/dev/null)

各ステージは pylot-cli の drive loop(§ Workers → Drive)を使って個別のプロンプトとして実行します(上記の raw-curl 形式は、使用可能な CLI がない場合の § Workers → Fallback を参照)。ステージ間ではアイドル状態になるまでポーリングします。ステージ 06 の完了後、インラインのステージ 07 でレポートを作成し、結果マーカーを出力する前に、ワーカーを停止します。

curl -s --max-time 30 -X POST \
  -H "Authorization: Bearer $PYLOT_DISPATCH_TOKEN" \
  "${PYLOT_API}/missions/${PYLOT_JOB_ID}/workers/${WID}/stop" >/dev/null 2>&1 || true

引数

ParamRequiredDefaultNotes
repoはい—org/repo。例:Lexgo-cl/rails-backend($0 として解析)
pr_numbersはい—マージ順にスペース区切りで指定する PR 番号。例:1372 1375 1430($1 $2 $3 ...)
instructionsいいえ—末尾の括弧内に指定する補足ガイダンス。対象範囲を絞り込みます

$ARGUMENTS から解析します。最初のトークンはリポジトリ、残りの裸の整数は順番に PR 番号、末尾の (...) は任意の補足指示です。マージ順は、指定された順序です。

実行内容

8 ステージの完全逐次 ICM 手順です。

StageModeDescription
00-claim-computeインラインリモート環境(Ona または Codespaces)を確保し、REMOTE_EXEC と REPO_DIR を設定します
01-preflightサブエージェントデフォルトブランチと PR マニフェストの確認、PR の検証、環境のクリーンアップ
02-release-branchサブエージェントデフォルトブランチから release/YYYY-MM-DD を作成します
03-validate-integrateサブエージェント指定順の逐次ループ:PR ごとに、検証 → マージ → 競合解決 → テスト → 記録を実施し、次の PR に進みます
04-lockfilesサブエージェントマージした PR のいずれかが依存関係に変更を加えた場合、ロックファイルを再生成し、再テストします
05-push-release-prサブエージェントリリースブランチをプッシュし、統合テスト計画を含むリリース PR を 1 件作成します
06-release-envサブエージェント非同期トリガー通知を書き込み、リモートコンピューティング環境を解放または停止します
07-reportインラインローカルのレポートファイルを書き込み、結果マーカーを出力します

ステージ 03 は、重要な判断を行う独立したステージです。PR の検証、競合の解決、マージの判定をすべて 1 つのクリーンなコンテキスト内で行い、PR を順次ループ処理します。

引き継ぎ先

すべての引き継ぎファイルは、リポジトリの作業ディレクトリ内にあります。

.procedure-output/release-train-runner/{stage}/handoff.md

ステージ 00 で、コンピューティング環境の確保に関するコンテキストを書き込みます。各サブエージェントステージに渡すのは、CONTEXT.md に入力として記載された引き継ぎ情報のみです。オーケストレーターのコンテキスト全体を渡してはいけません。

実行

ステージ 00(インライン)

ステージ 00 は自分で(オーケレーターのコンテキストで)実行します。CONTEXT.md を読み込みます。

.claude/skills/release-train-runner/stages/00-claim-compute/CONTEXT.md

リモート環境を確保し、REMOTE_EXEC と REPO_DIR を解決して、引き継ぎ情報を .procedure-output/release-train-runner/00-claim-compute/handoff.md に書き込みます。

ステージ 01 → 06(順次実行するサブエージェント — 一度に 1 つ)

各ステージを順番に実行し、それぞれについて Task を正確に 1 つ起動してください。次のステージを起動する前に、現在のステージが完了するまで待機してください。同じ応答で 2 つのステージを起動してはいけません。並列ステージはありません。

各 Task のプロンプトは自己完結している必要があります。

  • ステージの CONTEXT.md に記載されている入力の引き継ぎパスのみを含めてください
  • ステージの CONTEXT.md へのパスを含めてください
  • オーケストレーターの履歴や、それまでの推論は渡さないでください

Task プロンプトのテンプレート:

You are running stage {NN}-{name} of the release-train-runner procedure.

Read your stage instructions:
  .claude/skills/release-train-runner/stages/{NN}-{name}/CONTEXT.md

Your inputs:
  .procedure-output/release-train-runner/{prior-stage}/handoff.md
  (...any other handoffs the CONTEXT.md lists)

Write your output to:
  .procedure-output/release-train-runner/{NN}-{name}/handoff.md

Execute all steps in CONTEXT.md. Write handoff.md before exiting.

いずれかのステージでハードブロッカー(例:00 でコンピュートがない、01 で有効な PR が 0 件)が発生した場合は、該当する結果マーカーを出力して停止してください。ステージ 03 で PR が 1 件スキップされても、チェーンは停止しません。

ステージ 07(インライン)

ステージ 07 は自分で(オーケストレーターのコンテキスト内で)実行してください。CONTEXT.md を読みます。

.claude/skills/release-train-runner/stages/07-report/CONTEXT.md

ローカルレポートファイルを書き込んだ後、オーケストレーターから [pylot] outcome=... マーカーを出力してください(サブエージェントからは出力しないでください)。

ステージの引き継ぎチェーン

00 ─► 01 ─► 02 ─► 03 ─► 04 ─► 05 ─► 06 ─► 07 (inline, reads all)
              (per-PR loop:
               validate → merge → resolve → test,
               one PR at a time, in order)

終了パス

  • 成功:ステージ 07 が次を出力します [pylot] outcome="release train ready: N PRs merged into release/YYYY-MM-DD" status=success
  • 失敗:失敗したステージが次を出力します [pylot] outcome="release-train failed at stage NN: {reason}" status=failed
  • ブロック:コンピュートを確保できない場合(00)、またはマージ対象となる有効な PR がない場合(01) → [pylot] outcome="release-train blocked: {reason}" status=blocked

結果マーカーは常にオーケストレーターが(インラインで)出力し、サブエージェントは出力しません。

厳守事項

  1. 完全な逐次実行 — 並列処理は禁止。 1 回の応答で Task 呼び出しを 2 つ起動してはいけません。並列ステージはありません。
  2. PR ごとの検証と統合は順番どおりに逐次実行します。 ステージ 03 は、指定された順序で PR を 1 件ずつ処理します。PR ごとにサブエージェントを並列起動してはいけません。マージのたびに、後続のすべての PR の競合範囲が変わるためです。
  3. PR のレビューは全体の整合性を保って行います — diff 全体と、すべての観点をまとめて確認します。PR のレビューをファイルや観点ごとに分割してはいけません。
  4. ステージ 00 はインラインで実行します — オーケストレーターのコンテキスト内でコンピュートを確保し、後続ステージで REMOTE_EXEC / REPO_DIR が安定して使えるようにします。
  5. ステージ 07 はインラインで実行します — [pylot] outcome=... マーカーは必ずオーケストレーターが出力してください。
  6. オーケストレーターのコンテキスト全体をサブエージェントの Task プロンプトに渡してはいけません — 入力のみを渡してください。
  7. 各ステージは、次のステージが読み取る前に handoff.md を書き込みます。
  8. ステージをスキップしてはいけません — 実行内容が「作業なし」の場合も、すべてのステージを実行してください(例:ステージ 04 で依存関係の変更がない場合も、実行して「ロックファイルの変更なし」と記録します)。
  9. 中断ではなくスキップしてください。 検証に失敗した PR、解消できない競合がある PR、またはテストを失敗させる PR はスキップまたは取り消して記録します。リリーストレイン自体は中断しません。
  10. リリース PR をマージせず、強制プッシュせず、常に --no-ff を使用し、マージのたびに必ずテストしてください。 Max がリリース PR を手動でレビューおよびマージします。
  11. Quest は使用禁止。 報告はローカルレポートファイル(ステージ 07)と非同期トリガー通知(ステージ 06)のみです。Quest POST、Quest トークン、Quest URL は一切使用しません。

参照ファイル

  • CONTEXT.md — アーキテクチャの概要
  • shared/release-pr-template.md — リリース PR 本文のテンプレート(ステージ 05 で使用)
  • shared/report-template.md — ローカルレポートのテンプレート(ステージ 07 で使用)
  • shared/test-commands.md — プロジェクトごとのテストコマンド一覧(ステージ 03 および 04 で使用)
  • stages/NN-name/CONTEXT.md — ステージごとの入力、タスク、出力仕様

コメント