skills/pr-fix-loop/SKILL.md
PR上の指摘(コメント+CI失敗)をマージまで修正し続ける。「/pr-fix-loop」「レビュー対応して」「PRレビュー修正して」と言った時に使用。
npx skillsauth add hirokimry/vibecorp pr-fix-loopInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
[!IMPORTANT] このスキルは PR を MERGED / CLOSED に到達するか escalation 条件に当たるまで teammate のターン内で同期完遂する。
CHANGES_REQUESTEDを検知したら/vibecorp:pr-fixを 同期呼び出し して指摘を消化する。/loopやScheduleWakeupのような非同期スケジューラには依存しない(メッセージ駆動 teammate での放置を防ぐ)。 予算ガード:/vibecorp:pr-fix呼び出しは 最大 20 回 / loop、総時間 60 分 / loop で機械的に上限化する。
PR の状態を gh pr view でポーリングし、MERGED / CLOSED に到達するか escalation 条件に当たるまで、teammate のターン内で完遂する。CHANGES_REQUESTED を検知したら /vibecorp:pr-fix を同期呼び出しして指摘を消化する。
/loop や ScheduleWakeup のような非同期スケジューラには依存しない。teammate(/vibecorp:ship-parallel 配下の Agent)はメッセージ駆動で idle 化すると wakeup が届かないため、そこで PR が放置される構造欠陥を回避する。
/vibecorp:pr-fix-loop # 現在のブランチの PR を対象に開始
/vibecorp:pr-fix-loop <PR URL> # PR URL を直接指定
/vibecorp:pr-fix-loop --worktree <path> # worktree 内で実行
--worktree <path> が指定された場合、全操作を指定パス内で実行する。
cd <path> && command で実行する。<path>/ を基準とした絶対パスを使用する。--worktree <path> を引き継いで /vibecorp:pr-fix を呼ぶ。| 値 | 設定 | 理由 |
|-----|-----|------|
| polling 間隔 | 30 秒 | CodeRabbit / CI 遷移頻度に対して充分 |
| max iterations | 20 | 30 秒 × 20 = 約 10 分。/vibecorp:pr-fix 呼び出しが最大 20 回に制限される |
| timeout | 60 分 | fail-safe |
このループは CHANGES_REQUESTED を検知するたびに /vibecorp:pr-fix を同期呼び出しし、各回が Claude API のトークンを消費する。暴走を防ぐため、iterations と timeout の二重ガード で API 呼び出し回数と総時間を機械的に上限化する。
| 上限軸 | 値 | 何を抑える |
|--------|-----|-----------|
| /vibecorp:pr-fix 同期呼び出し回数 | 20 回 / loop(max iterations と同値) | LLM 呼び出しコスト |
| 総経過時間 | 60 分 / loop(timeout と同値) | スタック時の暴走時間 |
docs/cost-analysis.md の「自律改善ループの予算ガード」原則(/vibecorp:diagnose の max_issues_per_run 等が SOT)と同じ思想で、本スキルでも pr-fix 呼び出し回数に独立した上限を設ける。両ガード値を変更する場合は本テーブルと「4. 同期ポーリングループ」「5. escalation」の記述を同時に更新する。
PR URL が指定されていればそこから owner/repo/PR 番号を抽出する。未指定なら現在のブランチから自動検出する。
gh pr view --json number,url,headRefName,baseRefName --jq '{number, url, headRefName, baseRefName}'
PR が見つからなければ「PR 未作成のため /vibecorp:pr を先に実行してください」と報告して終了する。
awk '/^coderabbit:/{found=1; next} found && /^[^ ]/{exit} found && /enabled:/{print $2}' \
"$CLAUDE_PROJECT_DIR"/.claude/vibecorp.yml
false の場合は CodeRabbit レビュー待ちをスキップし、ステップ 4(auto-merge 設定)から実行して終了する。true または未定義(空)の場合はステップ 3 へ進む。autoMergeRequest が未設定なら設定する。既設定ならスキップする。
gh pr view <pr_number> --json autoMergeRequest --jq '.autoMergeRequest'
gh pr merge <pr_number> --squash --auto
MERGED / CLOSED か escalation 条件に到達するまで、以下を最大 20 反復・60 分以内で繰り返す。
各反復の先頭で PR 状態を一括取得する。
gh pr view <pr_number> \
--json state,mergeStateStatus,reviewDecision,autoMergeRequest \
--jq '{state, mergeStateStatus, reviewDecision, autoMergeRequest}'
| state | reviewDecision | mergeStateStatus | 行動 |
|-------|----------------|-------------------|------|
| MERGED | – | – | 成功終了 |
| CLOSED | – | – | 「PR がクローズされました」と報告して正常終了 |
| OPEN | CHANGES_REQUESTED | – | /vibecorp:pr-fix を同期呼び出し → sleep 30 → 次反復 |
| OPEN | – | CLEAN | auto-merge 発動待ち(sleep 30 → 次反復) |
| OPEN | – | BLOCKED / BEHIND / UNSTABLE / UNKNOWN / HAS_HOOKS | CI / approve 待ち(sleep 30 → 次反復) |
| OPEN | – | DIRTY | escalate(マージコンフリクト発生) |
| OPEN | – | DRAFT | escalate(Draft PR は対象外) |
/vibecorp:pr-fix(worktree モードでは --worktree <path> を引き継ぐ)を Skill ツールで同期呼び出しする。/vibecorp:pr-fix が rate limit 停止を返した場合は escalate する。sleep 30 で CodeRabbit 再レビューを待つ。gh pr view を行う。各反復の先頭で経過時間と反復回数を確認する。
以下のいずれかが満たされたら escalation する。
mergeStateStatus == DIRTY。mergeStateStatus == DRAFT。/vibecorp:pr-fix が rate limit 停止を返した。/vibecorp:pr-fix が外部要因 CI 失敗を検知した。SendMessage ツールが使える場合は teammate と判断し、team-lead に escalation を送る。
to: team-lead
message: "PR #<番号> で /vibecorp:pr-fix-loop が <理由> により escalation。状態: <state/mergeStateStatus/reviewDecision> 反復: <n>"
標準出力に escalation 内容を表示して終了する。
## /vibecorp:pr-fix-loop 完了
- PR: #<pr_number>
- 結果: MERGED / CLOSED / escalated(理由)
- 反復回数: <n>
- 経過時間: <分>
- /vibecorp:pr-fix 呼び出し回数: <n>
--force、--hard、--no-verify は使用しない。\(...) を使わない — 必ず + で結合する(根拠)。2>/dev/null、|| echo、; echo 等のリダイレクトやフォールバックを付加しない(根拠)。cd ... && cmd | head 2>/dev/null のように cd + パイプ + リダイレクトを含む compound command は Claude Code 本体の built-in security check で止められる(参照: #258)。/loop や ScheduleWakeup を使わない — このスキルは teammate のターン内で同期完遂することが要件(根拠)。/vibecorp:pr-fix/vibecorp:pr.claude/rules/review-observations.md.claude/rules/review-handling.md.claude/rules/prompt-writing.md.claude/rules/markdown.md.claude/rules/shell.mddata-ai
skills/**/SKILL.md 内に embed された 5 行以上のエージェント呼出プロンプトテンプレ・長文ブロックを .claude/rules/notification-prompt-extraction.md 基準で skills/<skill>/prompts/<name>.md に切り出す migration skill。「/prompts-extract-all」「プロンプト切り出し」「プロンプト extract」「SKILL.md プロンプト migration」と言った時に使用。検出は awk でフェンスコードブロックを抽出して行数カウント、要否判定は LLM が閾値・用途軸・命名規約と照合。diff 提案 → CEO 承認 → 書換の 2 段階で挙動を壊さず適用する。自動マージ禁止、自律ループ対象外。
documentation
.github/workflows/**/*.{yml,yaml} の --body 通知文と hooks/**/*.sh の長文 echo/printf/heredoc を .claude/rules/notification-prompt-extraction.md 基準で個別 .md ファイルに切り出す migration skill。「/notifications-extract-all」「通知文切り出し」「通知文 extract」「workflow 通知 migration」と言った時に使用。検出は grep で機械絞り込み、要否判定は LLM が閾値・命名規約と照合。diff 提案 → CEO 承認 → 書換の 2 段階で挙動を壊さず適用する。自動マージ禁止、自律ループ対象外。
development
`**/*.sh` / `**/*.js` / `**/*.ts` / `**/*.py` / `**/*.rb` / `**/*.go` / 設定ファイル等のコード内コメントを一括棚卸しし、 `.claude/rules/code-comments.md` と機械的に照合する。 diff 提案 → CEO 承認 → 書換の 2 段階で自動マージを禁じる。 生成コード・`node_modules`・`vendor`・`dist`・`build` 等は除外する。 「/vibecorp:comments-rewrite-all」「コメント全書き直し」「コード内コメント棚卸し」 と言った時に使用。
development
skills/**/SKILL.md・agents/*.md・.claude/rules/*.md を .claude/rules/prompt-writing.md 基準で一括書き直し提案するスキル。「/prompts-rewrite-all」「プロンプト書き直し」「スキル一括書き直し」「エージェント書き直し」と言った時に使用。claude-code-guide サブエージェントで Claude Code 公式仕様(docs.claude.com)を確認し、prompt-writing.md の指針 MUST / 禁止パターンと照合する。diff 提案 → CEO 承認 → 書き換えの 2 段階で挙動を壊さず適用する。自動マージ禁止。