plan-epic
CEO が指定したテーマを複数の子タスクに分解し、親 Issue(エピック)と子 Issue を一括起票して GitHub 公式の sub-issue API で親子関係を構築する。full プリセット専用。 「/plan-epic」「エピック化」「Issue を分解して」と言った時に使用。
SKILL.mdskills/plan-epic/SKILL.md
GitHub🎯 エピック化スキル
[!IMPORTANT] full プリセット専用。CEO が指定したテーマを子タスクに分解し、親 Issue(エピック)+ 子 Issue 群を一括起票して GitHub 公式 sub-issue API で親子関係を構築する。 コード変更は一切行わない(起票と紐付けのみ)。子 Issue 実装は
/vibecorp:shipで別途実行する。 結果のみを簡潔に返す。途中経過は出力しない。
CEO が「このテーマをエピック化して」と依頼した時、plan mode で子タスク分解を提示し、承認後に親 Issue + 子 Issue 群を一括起票する。子 Issue は GitHub 公式 sub-issue API で親に紐付ける。
📝 本文の書き方
親 Issue・子 Issue のタイトル・本文は CEO が読むため .claude/rules/communication.md に従って 動作主語 で書く(「〜になった/〜できるようになった」)。関数名・ファイルパスを並べるのではなく、ソフトウェアのふるまいの変化を 30 秒で掴める形にする。
🛠️ 使用方法
/vibecorp:plan-epic <テーマ> # plan mode で分解 → 親+子 Issue 起票 → sub-issue 紐付け
/vibecorp:plan-epic <テーマ> --dry-run # 分解と起票プレビューのみ(実際には起票しない)
<テーマ> が省略された場合は CEO にヒアリングする。
🧱 前提条件
- full プリセット専用(CISO/CPO/SM の 3 者承認ゲートを子 Issue 起票時に通すため、
/vibecorp:issueが full プリセットの判定機能を要求する) - GitHub CLI (
gh) が認証済みであること - リポジトリが GitHub 上にあり、sub-issue API が利用可能であること
📋 ワークフロー
1. プリセット確認
vibecorp.yml の preset を確認する。full 以外の場合は以下を出力して終了する:
/vibecorp:plan-epic は full プリセット専用です。現在のプリセット: <preset>
awk '/^preset:/ { print $2 }' "$CLAUDE_PROJECT_DIR/.claude/vibecorp.yml"
2. テーマのヒアリング
引数でテーマが渡されていない場合は CEO に確認する。
- テーマ: エピックとして括る上位の目的(例: 「Issue 親子関係導入」「課金構造の総点検」)
- 背景: なぜこのエピックが必要か(任意)
- 完了基準: エピックの達成条件(任意)
3. plan mode で子タスクへの分解を提示
EnterPlanMode でプラン mode に入り、テーマを以下の観点で子タスクへ分解する。
- 独立性: 子タスクは可能な限り並行実装できる粒度に分ける
- テスト込み: 各子タスクにテスト方針を含める
- 段階性: 基盤 → 実装 → 統合 の流れを意識する
- スコープ: 1 子タスクは 1 PR で完結するサイズに収める
分解結果を以下のフォーマットで CEO に提示する。
## 🎯 エピック: <テーマ>
### 📦 子タスク
| # | タイトル | 概要 | 依存 |
|---|---------|------|------|
| 1 | <子1> | <概要> | — |
| 2 | <子2> | <概要> | #1 |
| 3 | <子3> | <概要> | — |
### 🗺️ 実装順序
- 並行実装可能: <子1>, <子3>
- 直列: <子2>(<子1> 完了後)
ExitPlanMode で承認待ちにする。CEO が承認しなかった場合は終了する。
4. 親 Issue(エピック)の起票
承認後、親 Issue を gh issue create で直接起票する。
- タイトル:
🎯 epic: <テーマ> - ラベル:
epic(リポジトリに存在する場合のみ付与) - 本文: 以下のテンプレート
## 🎯 エピック概要
<テーマと背景>
## 📦 子 Issue(実装は /vibecorp:ship で別途)
- [ ] #<子1番号>
- [ ] #<子2番号>
- [ ] #<子3番号>
## ✅ 完了基準
<エピック全体の完了条件>
## 📍 関連ファイル
<!-- エピック全体で触れるファイル・モジュールのパス一覧(relevant file locations)。 -->
<!-- Anthropic 公式推奨の初回プロンプト 4 要素のうち relevant file locations を起票時点で揃える。 -->
- `<対象ファイル 1>`
- `<対象ファイル 2>`
---
この Issue は /vibecorp:plan-epic により起票されました。
子 Issue 番号は次のステップで決まるため、起票時点では空のチェックリスト(後段で更新)にしてもよい。実装上は「子 Issue 起票完了 → 親 Issue 本文を gh issue edit で更新」の順で構わない。
gh issue create --title "🎯 epic: <テーマ>" --body "<本文>" --label "epic"
epic ラベルがリポジトリに存在しない場合は --label を省略する(gh label list で確認)。
5. 親 feature ブランチの作成
親エピックの feature ブランチを作成し、origin に push する。/ship が git ls-remote で自動検出するために必要。
5-1. default branch を取得:
gh repo view --json defaultBranchRef --jq '.defaultBranchRef.name'
5-2. ブランチを作成して push:
git switch -c "feature/epic-<親番号>_<要約>" "origin/<default_branch>"
git push -u origin "feature/epic-<親番号>_<要約>"
- ブランチ名は
feature/epic-{親Issue番号}_{要約}形式(docs/specification.mdのブランチ命名規約に準拠) <要約>は親 Issue タイトルからスラッシュ・スペースを_に置換し、英数字・アンダースコア・ハイフンのみにサニタイズする- push まで完了させることで
/shipのgit ls-remote --heads origin "feature/epic-<親番号>_*"で確実に検出される
6. 子 Issue の起票(/vibecorp:issue 経由)
ステップ 3 で分解した子タスクを 1 件ずつ /vibecorp:issue スキル経由で起票する。
子タスクの本文末尾に親エピックへの参照として Refs #<親番号> を必ず含める。Closes ではなく Refs を使うことで、子 PR がマージされても親エピックは auto-close されず、/vibecorp:release-epic のリリース PR で最終的に close される(Refs #<親エピック番号> 形式も等価)。
/vibecorp:issue を使って以下の子 Issue を起票してください:
タイトル: <子タスクのタイトル>
本文: <子タスクの本文>
---
## 📍 関連
Refs #<親エピック番号>
/vibecorp:issueの 3 者承認ゲート(CISO + CPO + SM)が自動で走る- いずれかの子 Issue が「除外」判定された場合は、その子 Issue だけスキップして CEO に報告する(親 Issue は残し、後から手動で追加可能とする)
Closes #N/Refs #Nの運用は.claude/rules/workflow.md「PR 本文の Issue リンク(auto-close キーワード)」を参照
7. sub-issue API で親に紐付け
各子 Issue を GitHub 公式の sub-issue API で親 Issue に紐付ける。
gh api \
--method POST \
-H "Accept: application/vnd.github+json" \
"/repos/<owner>/<repo>/issues/<親番号>/sub_issues" \
-f sub_issue_id=<子の数値ID>
<owner>/<repo>はgh repo view --json owner,name --jq '.owner.login + "/" + .name'で取得<子の数値ID>はgh issue view <子番号> --json id --jq '.id'で取得(issue 番号ではなく内部 ID が必要)- API エラー時はその子のみ紐付け失敗として記録し、最終レポートに明記する(処理は継続)
公式仕様: https://docs.github.com/en/rest/issues/sub-issues
8. 親 Issue 本文の更新
親 Issue の本文のチェックリストを実際の子 Issue 番号に書き換える。
gh issue edit <親番号> --body "<更新後の本文>"
9. 結果報告
## /vibecorp:plan-epic 完了
### 🎯 親 Issue(エピック)
- <親 URL>: <タイトル>
### 📦 子 Issue
| # | タイトル | URL | sub-issue 紐付け |
|---|---------|-----|------------------|
| 1 | <子1> | <URL> | ✅ |
| 2 | <子2> | <URL> | ✅ |
| 3 | <子3> | <URL> | ⚠️ 失敗(要手動紐付け) |
### サマリ
- 起票: <親1 + 子N> 件
- スキップ(3 者承認ゲートで除外): <n> 件
- sub-issue 紐付け失敗: <n> 件
🚦 介入ポイント
以下の状況では CEO に報告して判断を委ねる(自動でスキップしない)。
| 状況 | タイミング |
|---|---|
| full プリセットでない | ステップ 1 |
| CEO が plan を承認しない | ステップ 3 |
| 子 Issue 起票で 3 者承認ゲートが「除外」と判定 | ステップ 6 |
| sub-issue API がエラーを返した | ステップ 7 |
| gh CLI が認証されていない | 全ステップ共通 |
🪶 --dry-run モード
--dry-run が指定された場合は以下のみ実行する。
- プリセット確認
- テーマヒアリング
- plan mode で子タスク分解を提示
- 起票プレビュー(親 Issue 本文と子 Issue タイトル一覧をレポート出力)
ステップ 4 以降の起票・ブランチ作成・API 呼び出しは行わない。
⚠️ 制約
- コード変更は一切行わない — Issue 起票と sub-issue 紐付けのみ。
- 子 Issue 実装は CEO が
/vibecorp:shipで別途起動する(本スキルでは ship を呼ばない)。 --force/--hard/--no-verifyは使用しない。- jq では string interpolation
\(...)を使わない — Bash 上で\がエスケープ文字、()がサブシェルとして解釈されパースエラーを引き起こす。必ず+で結合する。 - コマンドをそのまま実行する —
2>/dev/null/|| echo/; echo等のリダイレクトやフォールバックを付加しない(根拠)。 - 介入ポイントでは CEO の指示を待つ(自動でスキップしない)。
- 親 Issue 自体は不可領域変更を直接含まないため 3 者承認ゲートを通さない(メタ情報)。子 Issue 側で個別に走る
/vibecorp:issueのゲートに依存する。
🔗 関連
| 種別 | 参照先 |
|---|---|
| 設計判断 | .claude/knowledge/cpo/decisions/2026-Q2.md 2026-04-18 「Issue 親子関係: 条件付き Go」 |
| GitHub sub-issue API | https://docs.github.com/en/rest/issues/sub-issues |
| 自律実行不可領域 | .claude/rules/autonomous-restrictions.md |
| CEO 向け文面規約 | .claude/rules/communication.md |
| プロンプト作成基準 | .claude/rules/prompt-writing.md |
| マークダウン規約 | .claude/rules/markdown.md |
| 関連スキル | /vibecorp:issue(子 Issue 起票)/ /vibecorp:ship(子 Issue 実装)/ /vibecorp:release-epic(親エピック close) |