ship-parallel
複数Issueを並列shipするオーケストレーションスキル。SMエージェントで並列判定し、TeamCreate + 手動worktree + Agentで同時実行する。「/ship-parallel」「並列シップ」「まとめてship」と言った時に使用。
SKILL.mdskills/ship-parallel/SKILL.md
GitHubultrathink
🚢 並列 ship オーケストレーション
[!IMPORTANT] このスキルは 複数 Issue を並列に
/vibecorp:ship実行する。SM エージェントが Issue 群の依存関係を分析し、スキル実行者が TeamCreate + 手動 worktree + Agent で同時進行する。 full プリセット専用。SM 並列判定が必要なため standard 以下では利用不可(install.shが minimal/standard で物理削除する)。 Agent 起動 mode はbypassPermissionsを採用する(隔離レイヤ #293 が FS / network を OS レベルで縛るため安全)。 介入ポイントではユーザーの指示を待つ(自動でスキップしない)。1 つの Issue の失敗で他の並列実行を中断しない。
複数の Issue を並列に /vibecorp:ship 実行する。SM エージェントが Issue 群の依存関係を分析し、その結果に基づいてスキル実行者が TeamCreate + 手動 worktree + Agent で同時進行する。
full プリセット専用。SM エージェントによる並列判定が必要なため、standard 以下では利用不可。
使用方法
/vibecorp:ship-parallel <Issue URL 1> <Issue URL 2> [...]
/vibecorp:ship-parallel --all
- Issue URL を複数指定: 指定された Issue のみ対象
--all: open な Issue を全て取得し、SM が選別
前提条件
- full プリセット であること(SM エージェントが必要)
- ベースブランチ(Issue 本文で指定されたブランチ、未指定時は現在のブランチ)を特定できること
- GitHub CLI (
gh) が認証済みであること - ベースブランチが最新であること
🏛️ アーキテクチャ
TeamCreate + 手動 worktree + Agent 方式を採用する。SM は分析専任、オーケストレーションはスキル実行者が直接実行する。
スキル実行者(オーケストレーター)
├─ 1. Agent(SM) で Issue 群の並列判定を取得
│ └─ SM が依存関係を分析し、並列グループ・直列チェーン・保留を返す
├─ 2. 実行計画をユーザーに提示・確認
├─ 3. 各 Issue の worktree を事前作成(git worktree add + rsync .claude/)
├─ 4. TeamCreate でチーム作成 + Agent で起動(各 Agent は /vibecorp:ship --worktree で実行)
│ └─ Agent は指定された worktree パス内で全操作を実行
├─ 5. 各 Agent の進捗を SendMessage で監視
│ ├─ エラー報告 → スキル実行者が判断(中断/リトライ/スキップ)
│ └─ 完了報告 → 結果を記録
├─ 6. 並列 PR 間のコンフリクト検知
└─ 7. 結果統合、レポート出力
方式選定理由
| 検証ポイント | 出典 |
|---|---|
Agent(isolation: "worktree") は TeamCreate 下で機能しない |
#127 検証 1 |
手動 worktree(git worktree add + rsync .claude/)で skills / hooks 同期が確実 |
#127 検証 2 |
| TeamCreate + Agent(isolation なし)で SendMessage 双方向通信が可能 | #127 検証 3 |
| 複数 Agent 同時起動で worktree 間の完全分離を確認 | #127 検証 4 |
/vibecorp:ship --worktree <path> でスキルチェーン全体が worktree 内で動作 |
#128 で実装済み |
SM は分析専任とし、/vibecorp:sync-check 等と同じ「分析エージェント → メイン実行」パターンに統一 |
— |
ワークフロー
1. プリセット確認
vibecorp.yml の preset を確認する。
awk '/^preset:[[:space:]]*/ { sub(/^preset:[[:space:]]*/, ""); print; exit }' .claude/vibecorp.yml
full 以外の場合は「/vibecorp:ship-parallel は full プリセット専用です」と報告して終了する。
2. Issue 一覧の取得
URL 直接指定の場合:
各 URL から Issue 情報を取得する。
gh issue view <Issue URL> --json number,title,body --jq '{number, title, body}'
--all の場合:
open な Issue を一括取得する。
gh issue list --state open --json number,title,body,labels --limit 500
Issue が 1 件以下の場合は「並列実行の対象がありません。単一 Issue には /vibecorp:ship を使用してください」と報告して終了する。
3. SM エージェントによる並列判定
SM エージェントを Agent ツールで起動し、Issue 群の並列実行可否を判定させる。SM は分析結果のみを返し、オーケストレーションには関与しない。
SM エージェントが Agent ツールの利用可能タイプにない場合は、general-purpose エージェントに SM エージェント定義(.claude/agents/sm.md)の内容を渡して代用する。
SM に渡すプロンプトは skills/ship-parallel/prompts/agent-call-sm-parallel-analysis.md を参照する。
4. 実行計画の提示・ユーザー確認
SM の分析結果に基づき、スキル実行者が実行計画をユーザーに提示し、承認を求める。
## 並列 ship 実行計画
### 並列グループ 1
| Issue | タイトル | 影響範囲 |
|-------|---------|---------|
| #10 | xxx | skills/foo/ |
| #11 | yyy | tests/test_bar.sh |
### 直列チェーン
| 順序 | Issue | タイトル | 依存理由 |
|------|-------|---------|---------|
| 1 | #12 | zzz | - |
| 2 | #13 | www | #12 と同一ファイル変更 |
### 保留(実行対象外)
| Issue | 理由 |
|-------|------|
| #14 | 影響範囲が不明 |
実行しますか? (y/n)
ユーザーが承認しない場合は終了する。
5. worktree 作成・チーム組成・Agent 起動
承認後、スキル実行者が worktree を事前作成し、TeamCreate でチームを組成し、各 Issue に対して Agent を起動する。
5a. チーム作成
TeamCreate(team_name: "ship-parallel-{timestamp}")
5b. ベースブランチの決定
Issue 本文にベースブランチの指定がある場合はそれを使用する。ない場合は現在のブランチを使用する。
5c. worktree の事前作成
各 Issue に対して、オーケストレーター自身が worktree を作成する。
# プロジェクト名を取得
project=$(basename "$(pwd)")
# worktree を作成(ブランチも同時に作成)
git worktree add "../${project}.worktrees/dev_${Issue番号}_${要約}" -b "dev/${Issue番号}_${要約}"
# .claude/ ディレクトリを同期(skills, hooks, settings.json 等)
# state/ は worktree ごとに独自に作成・管理されるため除外(main の state を持ち込まない)
# plans/ は XDG 準拠で ~/.cache/vibecorp/plans/<repo-id>/ に配置されるため除外(旧 .claude/plans/ の残置ファイルを worktree に持ち込むと子 Agent が誤認して permission prompt で stuck する: #372)
rsync -a --exclude=state/ --exclude=plans/ .claude/ "../${project}.worktrees/dev_${Issue番号}_${要約}/.claude/"
worktree 作成の確認:
git worktree list
- 期待する worktree 数(メイン + 各 Issue)と一致すること
- worktree 作成が失敗した場合は該当 Issue をスキップし、他の Issue の処理は継続する
5d. 並列グループの Agent 起動
並列グループ内の各 Issue に対して、Agent ツールを起動する。同一グループの全 Agent は 1 つのメッセージで同時に起動する(並列実行を最大化)。
Agent 起動時は mode: "bypassPermissions" を指定する。/vibecorp:ship-parallel は full プリセット専用配布であり、full プリセットは隔離レイヤ(#293: macOS sandbox-exec / Linux bwrap)が FS / network を縛る。隔離レイヤが最後の砦として機能している前提で、Agent 起動の承認ダイアログを bypassPermissions で完全に抑制する(隔離外への到達は OS 側で deny されるため安全)。これにより --dangerously-skip-permissions で起動した子 Claude と組み合わせて、並列実行時の承認介入を発生させない(参照: docs/design-philosophy.md の「承認フローへの非介入」、隔離レイヤ #293、#260)。
minimal / standard プリセットでは install.sh が /vibecorp:ship-parallel 自体を物理削除するため、bypassPermissions は配布されない(隔離レイヤ非提供環境で bypassPermissions を渡さないことを install.sh の skill 削除で担保している)。
各 Agent に渡すプロンプトは skills/ship-parallel/prompts/agent-call-child-agent-ship.md を参照する。
5e. 直列チェーンの順序実行
直列チェーンがある場合、前の Issue の Agent が完了してから次の Issue の Agent を起動する。SendMessage で前の Agent の完了を確認し、成功していれば次を起動する。
6. 進捗監視・結果収集
TeamCreate + SendMessage によるリアルタイム監視を行う。
- 各 Agent の完了報告を SendMessage で受け取る
- エラー発生時は即座に通知される
- 必要に応じて介入が可能(中断・優先度変更・方針変更)
7. 並列 PR コンフリクト検知
並列グループの全 Agent が完了した後、PR 間のコンフリクトを検知する。
# 各 PR のブランチを順にマージして衝突を検出(ドライラン)
git merge-tree $(git merge-base HEAD <branch_a>) HEAD <branch_a>
- コンフリクトが検出された場合、対象 PR とファイルをユーザーに報告する
- 解消方法の提案(どちらを先にマージすべきか等)を提示する
- 自動解消は行わない — ユーザーの判断を待つ
8. 結果報告
## /vibecorp:ship-parallel 完了
### 成功
| Issue | PR | ブランチ |
|-------|-----|---------|
| #10 | #20 | dev/10_xxx |
| #11 | #21 | dev/11_yyy |
### 失敗
| Issue | 理由 |
|-------|------|
| #12 | テスト失敗(詳細: ...) |
### 保留(未実行)
| Issue | 理由 |
|-------|------|
| #14 | 影響範囲が不明 |
### 後始末
完了した worktree は `/vibecorp:worktree clean` で自動削除できます。
介入ポイント
以下の状況ではユーザーに報告して判断を委ねる。
| 状況 | タイミング |
|---|---|
| full プリセットでない | ステップ 1 |
| Issue が 1 件以下 | ステップ 2 |
| SM が全 Issue を保留に分類 | ステップ 3 |
| ユーザーが実行計画を承認しない | ステップ 4 |
| 個別の /vibecorp:ship が介入ポイントに到達 | ステップ 5 |
| 並列 PR 間でコンフリクト検出 | ステップ 7 |
制約
- worktree 作成(
git worktree add)が失敗した場合は該当 Issue をスキップし、他の Issue の処理は継続する --force、--hard、--no-verifyは使用しない- ユーザーの明示的な指示なしに force push しない
- jq では string interpolation
\(...)を使わない — Bash 上で\がエスケープ文字、()がサブシェルとして解釈され、意図しない展開やパースエラーを引き起こすため。必ず+で結合する - コマンドをそのまま実行する —
2>/dev/null、|| echo、; echo等のリダイレクトやフォールバックを付加しない(根拠) - 介入ポイントではユーザーの指示を待つ(自動でスキップしない)
- 1つの Issue の失敗で他の並列実行を中断しない
🔗 関連ルール
- 単一 Issue 用:
/vibecorp:ship - 自律改善ループ:
/vibecorp:autopilot - worktree 管理:
/vibecorp:worktree - Agent プロンプト:
skills/ship-parallel/prompts/agent-call-child-agent-ship.md - SM 分析プロンプト:
skills/ship-parallel/prompts/agent-call-sm-parallel-analysis.md - 隔離レイヤ設計:
docs/design-philosophy.mdの「承認フローへの非介入」/ #293 / #260 - プロンプト作成基準:
.claude/rules/prompt-writing.md - マークダウン規約:
.claude/rules/markdown.md