---
name: create-pr
description: 「PR を作って」「pull request を出して」要求で発動。 push → 構造化 PR 本文 (pull_request_template.md 準拠) で PR 作成 → CI 監視ループ → review thread 返信+resolve まで 1 skill で完結。 skill 間 handoff を排除し工程の取りこぼしを防ぐ。 マイルストーン非付与、 auto-merge 非使用。
argument-hint: "[base-branch] [--title
] [--no-watch]"
disable-model-invocation: false
allowed-tools: Bash(git *) Bash(gh *) Bash(sleep *) Bash(python *) Bash(cat *) Read Write ScheduleWakeup TaskList TaskStop
---
# PR 作成 + CI 監視 + レビュー対応 (end-to-end)
`/create-pr` 1 コマンドで PR ライフサイクル全体を完結する skill:
**push → PR 作成 → CI 監視ループ → review thread 返信 + resolve → 報告**
過去 `/create-pr` → `/watch-pr` → `/reply-review` を別々の skill 呼び出しで連鎖していたが、 「次の skill を Skill ツールで呼べ」 という散文 handoff は LLM が実行を飛ばすと工程が抜ける (PR #496 / #505 で発生)。 本 skill は全工程を **inline フェーズ** として持ち、 skill 間 handoff をゼロにする。
> 単体利用: CI 監視のみ → `/watch-pr `、 review 対応のみ → `/reply-review `、 backlog 集計 → `/check-review-backlog`。 これらは本 skill のフェーズ 5 / 6 と同一手順の standalone 版。
## 自動発動条件
- 「PR を作って / 出して」「pull request を作って」「この変更で PR にして」「branch を push して PR にして」
明示呼び出し: `/create-pr` / `/create-pr ` / `/create-pr --no-watch` (PR 作成のみ、 監視ループに入らない)
## 引数
- `$ARGUMENTS` 空: base = `dev` (memory `feedback_merge_caution`: 通常 dev を base)
- ``: 明示指定 (例: `main`)
- `--title `: title 上書き (デフォルトは最新コミット message から抽出)
- `--no-watch`: フェーズ 5/6 (CI 監視・review 対応) を skip し PR 作成で終了
## 制約 (memory 参照)
- **マイルストーン非付与** (`feedback_pr_no_milestones`): `--milestone` を付けない。 本文に「M1」等も書かない
- **auto-merge 禁止** (`feedback_merge_caution`): `gh pr merge --auto` 等を使わない。 マージはユーザー判断
- **本文書き換えは body-file** (`feedback_pr_body_over_comments`): 既存 PR 更新は `gh pr edit --body-file`。 新規コメント追記しない。 review thread への reply はこの制約の対象外
- **--no-verify 禁止** (CLAUDE.md): hook bypass 系を使わない
- **review thread の自動 reply は SAFE 系のみ**: stale / Copilot style noise のみ自動 reply+resolve。 人間 reviewer・logic/security 指摘は user 判断 (フェーズ 6)
## PR 本文フォーマット (重要 — テンプレート準拠必須)
**PR 本文は `.github/pull_request_template.md` の必須セクションをすべて含むこと。** `validate-pr-body` CI ゲートが以下を検査し、 欠けると PR が必ず red になる (PR #505 で発生した既知バグ — 旧フォーマットはこのゲートを通らなかった):
- `## Test Plan` セクションが存在し非空 (**大文字 P**。 `## Test plan` は grep `^## Test Plan` に不一致で fail)
- `## Risk Level` セクションでチェックボックスがちょうど **1 個** `- [x]`
- `## Affected Components` セクションでチェックボックス最低 1 個 `- [x]`
PR title は **70 文字以内**、 `type(scope):` prefix (例 `fix(g2p):` `ci:` `feat(workflow):`)。
PR 本文は以下を **この順** で含める (1-8 は template 準拠の必須セクション、 9-10 は create-pr 独自の value-add):
1. `## Summary` — 解決する問題 / 動機 (1-3 文)。 時系列表現 (Phase 1/2) は使わない
2. `## Affected Components` — 該当を `- [x]`: Python / Rust / C# / C++ / Go / WASM-npm / Docker / CI-CD / Documentation
3. `## Type` — Bug fix / New feature / Refactoring / Documentation / CI/CD / Dependencies
4. `## Risk Level` — patch / minor / major の **ちょうど 1 個**を `- [x]` (patch=bugfix/内部, minor=新機能/非破壊, major=破壊的変更)
5. `## Contract Impact` — `docs/spec/*.toml` 影響。 無ければ `- [x] None`
6. `## 変更内容` — 機能カテゴリ別の表 `機能名 / 動作 / これがないと起こること` の 3 列
7. `## 設計判断` — 意思決定の根拠 bullet (conservative/aggressive 判断・誤検出回避・bypass 経路・既存整合)
8. `## Test Plan` — `- [ ]` で reviewer がそのまま使える具体的手順 (抽象表現禁止)
9. `## Checklist` — Tests pass locally / No GPL-LGPL deps / Documentation updated
10. `## Related Issues` — `Closes #N` 等、 無ければ「なし」
禁止: 時系列 (Phase/開発過程)、 マイルストーン番号、 「LLM が生成」 等の co-authored note。
## 実行手順
### フェーズ 1: ブランチ状態確認
```bash
git status --short
git log --oneline ..HEAD
git diff --stat ..HEAD
git rev-parse --abbrev-ref HEAD
git rev-parse --abbrev-ref @{u} 2>/dev/null || echo "no-upstream"
```
確認: working tree、 commit が 1 つ以上 ahead か、 upstream 設定済みか。 ブランチが `dev`/`main` なら停止 (feature ブランチ必須)。
### フェーズ 2: PR 本文 draft 作成
`git log ..HEAD --pretty=format:"%h %s%n%b"` で全 commit を読み、 機能カテゴリ・規模・トレードオフを抽出。 上記 10 セクションを埋めて `/tmp/pr-body-.md` に書き出す。
### フェーズ 2.5: PR 本文 self-check (validate-pr-body 先取り)
push 前に必須セクションを検証する。 1 つでも欠けたら修正してからフェーズ 3 へ:
```bash
B=/tmp/pr-body-.md
for s in "## Summary" "## Affected Components" "## Type" "## Risk Level" "## Contract Impact" "## Test Plan" "## Checklist" "## Related Issues"; do
grep -qF "$s" "$B" || echo "MISSING: $s"
done
# Risk Level は [x] ちょうど 1 個であること (出力が 1 でなければ fail)
awk '/^## Risk Level/{f=1;next}/^## /{f=0}f' "$B" | grep -cE '^- \[x\] '
# Affected Components は [x] 1 個以上
awk '/^## Affected Components/{f=1;next}/^## /{f=0}f' "$B" | grep -cE '^- \[x\] '
```
### フェーズ 3: push
```bash
git push -u origin # upstream 未設定時。 設定済みなら git push
```
### フェーズ 4: PR 作成 / 既存 PR 更新
`gh pr list --head --json number` で既存 PR を判定:
```bash
# 新規
gh pr create --base --title "" --body-file /tmp/pr-body-.md
# 既存 (本ブランチに PR があれば本文置換)
gh pr edit --body-file /tmp/pr-body-.md
```
`--milestone` は付けない。 PR URL / 番号を控える。
`--no-watch` 指定時はここで終了 (PR URL を報告)。 それ以外はフェーズ 5 へ自動継続 (確認を挟まない)。
### フェーズ 5: CI 監視ループ (inline — skill handoff なし)
PR 作成後、 CI を完了まで監視する。 **`/watch-pr` skill は呼ばず以下を本 skill 内で実行する。**
**5.1 ポーリング** — `gh pr checks --json name,bucket` を取得し bucket (pass/fail/pending/skipping/cancel) を集計。
**5.2 判定**:
- **pending ≥ 1** → 5.3 (継続監視)
- **fail = 0 かつ pending = 0** → all green。 フェーズ 6 を実行し all-resolved ならフェーズ 7 で完了報告
- **fail ≥ 1** → 5.4 (失敗分析) を実行後、 フェーズ 6 → フェーズ 7
**5.3 継続監視 (self-pace)**:
- background watcher が未 arm なら arm する (`Bash` を `run_in_background: true` で):
`gh pr checks --json name,bucket` を ~120s 間隔でポーリングし、 pending=0 になったら集計行を出力して exit するループ。 完了通知でループに再入する。
- fallback として `ScheduleWakeup(delaySeconds=1800, prompt="/create-pr ...<元の引数>")` を設定。
- watcher 完了通知 か wakeup で 5.1 に再入。 各再入でフェーズ 6 (review) も実行する。
- 4 時間以上 pending が続く場合はループを終了し user に報告。
**5.4 失敗分析** — 失敗 job のログを `gh run view --log-failed` で fetch し分類:
| 分類 | signature | 推奨アクション |
|------|-----------|---------------|
| format drift | `ruff` `cargo fmt` `gofmt` `clippy` 系 | `pre-commit run --all-files` で修復 |
| test fail | `FAILED` `assert` `panicked` | テスト名を抽出して提示 |
| build error | `error[E` `cannot find` | ログ提示、 user 方針確認 |
| flake | `timeout` `network` `rate limit` | `gh run rerun --failed` 提案 |
| contract drift | `MISMATCH` `OUT OF SYNC` | 該当 `/check-*` skill 案内 |
| validate-pr-body | `Missing required section` | フェーズ 2 に戻り本文修正 → `gh pr edit --body-file` |
分類結果と推奨アクションを user に提示。 format drift / validate-pr-body は本 skill で修正→push まで実施してよい。 test/build error は user 判断。
### フェーズ 6: review thread 返信 + resolve (inline — skill handoff なし)
CI 監視の各 iteration および all-green 時に **必ず実行する。** `/reply-review` skill は呼ばず以下を実行:
**6.1 未解決 thread 取得**:
```bash
gh api graphql -f query='
query($pr: Int!) {
repository(owner: "ayutaz", name: "piper-plus") {
pullRequest(number: $pr) {
reviewThreads(first: 50) { nodes {
id isResolved
comments(first: 1) { nodes {
databaseId path body author { login } originalCommit { oid }
} }
} }
}
}
}' -F pr= --jq '.data.repository.pullRequest.reviewThreads.nodes[] | select(.isResolved==false)'
```
**6.2 各 thread を分類**:
- **SAFE-stale**: コメント以降に該当ファイル更新済 (`git log ..HEAD -- ` が非空)
- **SAFE-copilot-style**: Copilot bot (`author.login` = `copilot-pull-request-reviewer` or `*[bot]`) + style noise (`^Consider (using|renaming)\b` `^Optional:` `\bnit:` 等)
- **REVIEW-human**: author が人間 reviewer
- **REVIEW-blocker**: Copilot/CodeQL の logic / security / API 指摘 (style noise でない)
**6.3 SAFE 系の自動対応** — 各 SAFE thread に REST API で reply → GraphQL で resolve:
```bash
# reply (in_reply_to は REST の comment databaseId)
gh api repos/ayutaz/piper-plus/pulls//comments --method POST \
-F in_reply_to= -f body="対応しました (commit )。<要約>"
# resolve (threadId は GraphQL node ID)
gh api graphql -f query='mutation($id:ID!){resolveReviewThread(input:{threadId:$id}){thread{isResolved}}}' -f id=
```
**6.4 REVIEW 系** — 自動 reply / resolve せず、 表形式で user に提示し判断を促す。 user が修正を指示したら: 修正 → commit → push → 該当 thread に reply (commit hash 付き) → resolve。 修正コミット後の reply+resolve を忘れないこと (PR #505 で抜けた工程)。
> 詳細な分類 regex と API の注意点 (node ID と databaseId の取り違え等) は `reply-review/SKILL.md` を参照。 手順自体は上記で完結している。
### フェーズ 7: 最終報告
```text
PR #: https://github.com/ayutaz/piper-plus/pull/
CI:
Review:
次のアクション:
- 失敗分類と推奨アクション
- user 判断が必要な thread
- merge 判断は user に委ねる (auto-merge 禁止)
```
## guard hook 回避
PR body 内に `--no-verify` 等の禁止文字列があると pre-commit / GitHub hook が誤検出することがある:
- 実行コマンドは抽象表記にする (「auto-merge」「hook bypass フラグ」等)
- 禁止文字列を含めたい場合は `--body-file` 経由で渡す (引数で渡さない)
## 使用例
```text
/create-pr # dev base に PR 作成 → CI 監視 → review 対応まで自動
/create-pr main # main base
/create-pr --title "fix(g2p): ..." # title 上書き
/create-pr --no-watch # PR 作成のみ (監視ループに入らない)
```
## 関連 skill
- `/watch-pr `: 本 skill フェーズ 5 の standalone 版 (既存 PR の CI 監視のみ)
- `/reply-review `: 本 skill フェーズ 6 の standalone 版 (既存 PR の review 対応のみ)
- `/check-review-backlog`: 全 open PR の未解決 review 集計
- `/loop /watch-pr `: CI を長時間継続監視 (本 skill フェーズ 5 を loop 化)
- `/sync-docs`: PR 作成前のドキュメント整合性監査 (推奨フロー: `/sync-docs` → `/create-pr`)
## 期待効果
- **skill 間 handoff ゼロ** — push / PR 作成 / CI 監視 / review 対応が 1 skill の連続フェーズ。 「次の skill を呼び忘れて工程が抜ける」 (PR #496 / #505) を構造的に防止
- PR 本文が `pull_request_template.md` 準拠で `validate-pr-body` を必ず通る
- PR body の構造標準化、 フェーズ/マイルストーン表記の排除
- review thread の reply+resolve 漏れ防止