claude-code-conductor 0.2.4__tar.gz → 0.3.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. {claude_code_conductor-0.2.4 → claude_code_conductor-0.3.1}/.claude/agents/planner.md +36 -0
  2. claude_code_conductor-0.3.1/.claude/commands/develop.md +11 -0
  3. {claude_code_conductor-0.2.4 → claude_code_conductor-0.3.1}/.claude/docs/parallel-orchestra-manifest.md +40 -0
  4. {claude_code_conductor-0.2.4 → claude_code_conductor-0.3.1}/.claude/skills/dev-workflow.md +13 -23
  5. claude_code_conductor-0.3.1/.claude/skills/wave-execution.md +276 -0
  6. {claude_code_conductor-0.2.4 → claude_code_conductor-0.3.1}/CHANGELOG.md +77 -0
  7. {claude_code_conductor-0.2.4 → claude_code_conductor-0.3.1}/PKG-INFO +1 -1
  8. {claude_code_conductor-0.2.4 → claude_code_conductor-0.3.1}/src/c3/__init__.py +1 -1
  9. claude_code_conductor-0.3.1/src/c3/cli_po.py +208 -0
  10. {claude_code_conductor-0.2.4 → claude_code_conductor-0.3.1}/src/c3/po/manifest.py +146 -0
  11. claude_code_conductor-0.2.4/.claude/commands/develop.md +0 -10
  12. claude_code_conductor-0.2.4/.claude/skills/parallel-execution.md +0 -121
  13. claude_code_conductor-0.2.4/src/c3/cli_po.py +0 -102
  14. {claude_code_conductor-0.2.4 → claude_code_conductor-0.3.1}/.claude/CLAUDE.md +0 -0
  15. {claude_code_conductor-0.2.4 → claude_code_conductor-0.3.1}/.claude/agents/architect.md +0 -0
  16. {claude_code_conductor-0.2.4 → claude_code_conductor-0.3.1}/.claude/agents/code-reviewer.md +0 -0
  17. {claude_code_conductor-0.2.4 → claude_code_conductor-0.3.1}/.claude/agents/developer.md +0 -0
  18. {claude_code_conductor-0.2.4 → claude_code_conductor-0.3.1}/.claude/agents/doc-writer.md +0 -0
  19. {claude_code_conductor-0.2.4 → claude_code_conductor-0.3.1}/.claude/agents/interviewer.md +0 -0
  20. {claude_code_conductor-0.2.4 → claude_code_conductor-0.3.1}/.claude/agents/project-setup.md +0 -0
  21. {claude_code_conductor-0.2.4 → claude_code_conductor-0.3.1}/.claude/agents/security-reviewer.md +0 -0
  22. {claude_code_conductor-0.2.4 → claude_code_conductor-0.3.1}/.claude/agents/tdd-develop.md +0 -0
  23. {claude_code_conductor-0.2.4 → claude_code_conductor-0.3.1}/.claude/agents/tester.md +0 -0
  24. {claude_code_conductor-0.2.4 → claude_code_conductor-0.3.1}/.claude/commands/doc.md +0 -0
  25. {claude_code_conductor-0.2.4 → claude_code_conductor-0.3.1}/.claude/commands/extract-lib.md +0 -0
  26. {claude_code_conductor-0.2.4 → claude_code_conductor-0.3.1}/.claude/commands/init-session.md +0 -0
  27. {claude_code_conductor-0.2.4 → claude_code_conductor-0.3.1}/.claude/commands/mcp.md +0 -0
  28. {claude_code_conductor-0.2.4 → claude_code_conductor-0.3.1}/.claude/commands/promote-pattern.md +0 -0
  29. {claude_code_conductor-0.2.4 → claude_code_conductor-0.3.1}/.claude/commands/review.md +0 -0
  30. {claude_code_conductor-0.2.4 → claude_code_conductor-0.3.1}/.claude/commands/setup.md +0 -0
  31. {claude_code_conductor-0.2.4 → claude_code_conductor-0.3.1}/.claude/commands/start.md +0 -0
  32. {claude_code_conductor-0.2.4 → claude_code_conductor-0.3.1}/.claude/hooks/clear_file_history.py +0 -0
  33. {claude_code_conductor-0.2.4 → claude_code_conductor-0.3.1}/.claude/hooks/enable_sandbox.py +0 -0
  34. {claude_code_conductor-0.2.4 → claude_code_conductor-0.3.1}/.claude/hooks/pre_compact.py +0 -0
  35. {claude_code_conductor-0.2.4 → claude_code_conductor-0.3.1}/.claude/hooks/pre_tool.py +0 -0
  36. {claude_code_conductor-0.2.4 → claude_code_conductor-0.3.1}/.claude/hooks/statusline.py +0 -0
  37. {claude_code_conductor-0.2.4 → claude_code_conductor-0.3.1}/.claude/hooks/stop.py +0 -0
  38. {claude_code_conductor-0.2.4 → claude_code_conductor-0.3.1}/.claude/hooks/validate_skill_change.py +0 -0
  39. {claude_code_conductor-0.2.4 → claude_code_conductor-0.3.1}/.claude/hooks/worktree_guard.py +0 -0
  40. {claude_code_conductor-0.2.4 → claude_code_conductor-0.3.1}/.claude/memory/.gitkeep +0 -0
  41. {claude_code_conductor-0.2.4 → claude_code_conductor-0.3.1}/.claude/rules/code-review-checklist.md +0 -0
  42. {claude_code_conductor-0.2.4 → claude_code_conductor-0.3.1}/.claude/rules/promoted/index.md +0 -0
  43. {claude_code_conductor-0.2.4 → claude_code_conductor-0.3.1}/.claude/rules/security-review-checklist.md +0 -0
  44. {claude_code_conductor-0.2.4 → claude_code_conductor-0.3.1}/.claude/settings.json +0 -0
  45. {claude_code_conductor-0.2.4 → claude_code_conductor-0.3.1}/.claude/settings.local.json +0 -0
  46. {claude_code_conductor-0.2.4 → claude_code_conductor-0.3.1}/.claude/skills/promoted/index.md +0 -0
  47. {claude_code_conductor-0.2.4 → claude_code_conductor-0.3.1}/.claude/skills/worktree-tdd-workflow.md +0 -0
  48. {claude_code_conductor-0.2.4 → claude_code_conductor-0.3.1}/.gitignore +0 -0
  49. {claude_code_conductor-0.2.4 → claude_code_conductor-0.3.1}/LICENSE +0 -0
  50. {claude_code_conductor-0.2.4 → claude_code_conductor-0.3.1}/README.md +0 -0
  51. {claude_code_conductor-0.2.4 → claude_code_conductor-0.3.1}/hatch_build.py +0 -0
  52. {claude_code_conductor-0.2.4 → claude_code_conductor-0.3.1}/pyproject.toml +0 -0
  53. {claude_code_conductor-0.2.4 → claude_code_conductor-0.3.1}/src/c3/__main__.py +0 -0
  54. {claude_code_conductor-0.2.4 → claude_code_conductor-0.3.1}/src/c3/_excludes.py +0 -0
  55. {claude_code_conductor-0.2.4 → claude_code_conductor-0.3.1}/src/c3/cli.py +0 -0
  56. {claude_code_conductor-0.2.4 → claude_code_conductor-0.3.1}/src/c3/cli_doctor.py +0 -0
  57. {claude_code_conductor-0.2.4 → claude_code_conductor-0.3.1}/src/c3/cli_init.py +0 -0
  58. {claude_code_conductor-0.2.4 → claude_code_conductor-0.3.1}/src/c3/cli_list.py +0 -0
  59. {claude_code_conductor-0.2.4 → claude_code_conductor-0.3.1}/src/c3/cli_update.py +0 -0
  60. {claude_code_conductor-0.2.4 → claude_code_conductor-0.3.1}/src/c3/paths.py +0 -0
  61. {claude_code_conductor-0.2.4 → claude_code_conductor-0.3.1}/src/c3/po/__init__.py +0 -0
  62. {claude_code_conductor-0.2.4 → claude_code_conductor-0.3.1}/src/c3/po/detect.py +0 -0
  63. {claude_code_conductor-0.2.4 → claude_code_conductor-0.3.1}/src/c3/po/run.py +0 -0
@@ -79,6 +79,42 @@ plan-report の YAML フロントマターは `parallel-orchestra` (PO) で並
79
79
  - [ ] 同じファイルを書く複数タスクで衝突対策が取られているか
80
80
  - [ ] レビュータスク(read_only:true)が全 dev タスクに depends_on を持っているか
81
81
  - [ ] `tasks[].id` が一意で、`depends_on` の参照先が全て存在するか
82
+ - [ ] `depends_on` を空配列(`[]`)で書いていないか(無依存ならフィールド自体を省略)
83
+
84
+ ### タスクあたりの所要時間制約
85
+
86
+ PO は内部で **タスクごとのタイムアウトを 900 秒(15 分)でハードコード** している(`_INTERNAL_TIMEOUT_SEC = 900`、フロントマター側からは上書き不可)。1 タスクが 15 分を超えると PO 側で kill されて failure 扱いになる。
87
+
88
+ 11. **1 タスクは 15 分以内に終わる粒度で分解する** — `tdd-develop` の tester→developer→tester ループでも 15 分を上限の目安にする。長くなりそうな機能は (a) ファイル境界でタスク分割、(b) MVP と機能拡張で別タスク化、のいずれかで時間を切る
89
+ - 自己チェックリストに追加: `[ ] 想定実行時間が 15 分を超えるタスクがないか`
90
+
91
+ ### YAML フロントマターの落とし穴
92
+
93
+ 実装時に踏みやすい入力ミス。dry-run で検出できるが、出力前に planner 側で潰しておく:
94
+
95
+ 9. **`depends_on: []` を空配列で書かない** — `c3 po dry-run` が「`depends_on` must be a list of strings」で fail する(非空のときだけ list として扱われ、空配列は仕様違反扱い)。依存が無いタスクは `depends_on` フィールド**自体を省略**する
96
+ 10. **`writes` の重複は dry-run の `Write-path conflict` で検出される** — 同じファイルを書くタスクが複数あれば必ず (a) タスクをまとめる、(b) `depends_on` で順序付け、(c) `concurrency_group` で同時実行を 1 に制限、のいずれかで解消する(既存ルール 8 の補足。dry-run が落ちるので出力前に必ず確認する)
97
+
98
+ ### 直列・並列交互パターンの取り扱い
99
+
100
+ ユーザーが **stage 単位で順序を強制したい / 中間状態を確認したい** と要求した場合は、ルール 1(「真の依存だけに絞る」)から逸脱して順序付けの `depends_on` を許容してよい。典型構造:
101
+
102
+ ```
103
+ Stage 1: dev_a, dev_b, dev_c (並列)
104
+ └─ Stage 2: review_or_sync (依存: dev_a/b/c) ← 中間レビュー / 集約
105
+ └─ Stage 3: dev_d, dev_e (並列、依存: review_or_sync)
106
+ └─ Stage 4: review_or_sync_2 (依存: dev_d/e)
107
+ └─ ...
108
+ ```
109
+
110
+ 採用条件:
111
+
112
+ - ユーザーが明示的に要求している(自己判断で勝手にこの形にしない)
113
+ - 各 stage 内の並列度は **2 以上**を維持する(直列に潰してはいけない)
114
+ - ルール 2(直列化セルフチェック: チェーン長 ≦ タスク数 / 2)は依然として守る
115
+ - 「stage 区切り」自体は plan-report 本文で明文化し、`depends_on` だけに頼らない
116
+
117
+ 詳細な構造例は `.claude/docs/parallel-orchestra-manifest.md` の「並列・直列交互パターン」を参照。
82
118
 
83
119
  ## Tools & Constraints
84
120
  制限:
@@ -0,0 +1,11 @@
1
+ # /develop コマンド
2
+
3
+ plan-report に基づいて実装フェーズを実行する。
4
+
5
+ ## 必ず守ること
6
+
7
+ 1. **最初に必ず** `.claude/skills/dev-workflow.md` を Read する。記憶・推測で進めない
8
+ 2. **フェーズ D(実装)** から実行する
9
+ 3. dev-workflow.md の AskUserQuestion・Edit・セッションファイル更新の手順を省略しない
10
+ 4. D-0 で plan-report に YAML フロントマター(`po_plan_version`)が検出された場合は、続けて **必ず** `.claude/skills/wave-execution.md` を Read してその手順に従う(C3 メイン + PO スポット並列モード)
11
+ 5. フロントマターが無い場合は legacy の D-1〜D-5 ceremony(tester→developer→tester の TDD 逐次実行)にフォールバックする
@@ -115,6 +115,46 @@ on_failure:
115
115
 
116
116
  ---
117
117
 
118
+ ## 並列・直列交互パターン
119
+
120
+ 中間レビューや段階的な動作確認を挟みたい場合の plan-report 構造。stage 内では並列、stage 間は順序を強制する形を取る。C3 の wave-execution でも各 stage 完了後にユーザー承認が入るので、ヒューマン・イン・ザ・ループ前提の中規模実装で有効。
121
+
122
+ ### 用途
123
+
124
+ - 段階的にユーザー確認・中間レビューを挟みたい
125
+ - 実装ステージごとに動作確認が必要(例: 認証 → 認可 → 監査ログ、と段階的に積み上げる)
126
+ - 後続の dev タスクが前段のレビュー指摘を受けて方針調整する可能性がある
127
+
128
+ ### 構造
129
+
130
+ ```
131
+ Stage 1: dev_a, dev_b, dev_c (並列)
132
+ └─ Stage 2: review_or_sync (依存: dev_a / dev_b / dev_c) ← 中間レビュー / 集約
133
+ └─ Stage 3: dev_d, dev_e (並列、依存: review_or_sync)
134
+ └─ Stage 4: review_or_sync_2 (依存: dev_d / dev_e)
135
+ └─ ...
136
+ ```
137
+
138
+ 特徴:
139
+
140
+ - 各 stage 内は **2 件以上の独立タスク**で並列度を維持する
141
+ - stage を区切る `review_or_sync` タスクは `code-reviewer`(read_only: true)か、軽い同期目的のサマライズタスク
142
+ - 中間レビュータスクが次 stage の dev タスクに `depends_on` で繋がる → **stage 間は完全に直列**
143
+
144
+ ### 動作実績
145
+
146
+ 17 tasks / 7 stages 構成(3〜4 並列の dev stage と 1 件の review stage が交互)で動作確認済み。各 stage が wave 1 つに対応し、wave-execution.md の per-wave 承認フローに綺麗に乗る。
147
+
148
+ ### 採用条件(planner 側のルール)
149
+
150
+ - ユーザーが明示的に要求している(自動でこの形にしない)
151
+ - 各 stage 内の並列度は **2 以上**を維持する(直列に潰さない)
152
+ - 全体のチェーン長 ≦ タスク数 / 2 を依然として守る
153
+
154
+ 詳細は `.claude/agents/planner.md` の「直列・並列交互パターンの取り扱い」を参照。
155
+
156
+ ---
157
+
118
158
  ## アンチパターン(避けるべき書き方)
119
159
 
120
160
  ### A. 全部直列にしてしまう
@@ -217,39 +217,29 @@ AskUserQuestion ツール:
217
217
 
218
218
  ---
219
219
 
220
- ## フェーズ D: TDD
220
+ ## フェーズ D: 実装
221
221
 
222
222
  **フェーズ C から続いている場合:** plan-report はコンテキスト内にあるため読み直し不要。
223
223
  **直接開始の場合:** Glob で `.claude/reports/plan-report-*.md` の最新を Read する。存在しない場合はフェーズ C から始めるよう案内して終了する。
224
224
 
225
+ ### D-0: 実行モード自動判別
226
+
227
+ plan-report の冒頭を Read し、YAML フロントマター(`---` で始まり `po_plan_version: "0.1"` を含む)の有無を確認する。
228
+
229
+ **フロントマターありの場合:**
230
+ 1. **最初に必ず** `.claude/skills/wave-execution.md` を Read する(記憶・推測で進めない)
231
+ 2. `wave-execution.md` の手順に完全に従って wave 単位で実装を進める
232
+ 3. 全 wave 完了後はフェーズ E(レビュー)へ進む(wave に reviewer タスクが含まれていれば E をスキップ可能と案内する)
233
+
234
+ **フロントマターなしの場合(legacy フォールバック):**
235
+
225
236
  今日のセッションファイルに以下を追記する(未登録の場合のみ):
226
237
  - `- [ ] tester: Red フェーズ`
227
238
  - `- [ ] developer: Green フェーズ`
228
239
  - `- [ ] developer: Refactor フェーズ`
229
240
  - `- [ ] tester: 最終確認`
230
241
 
231
- ### D-0: 実行モード選択
232
-
233
- AskUserQuestion ツール:
234
- ```json
235
- {
236
- "questions": [{
237
- "question": "TDD サイクルの実行モードを選んでください",
238
- "options": [
239
- { "label": "TDD 逐次実行", "description": "従来の D-1〜D-5(tester→developer→tester)で1タスクずつ進める" },
240
- { "label": "PO 並列実行", "description": "parallel-orchestra で plan-report の独立タスクを git worktree 並列実行する(PO のインストールが必要)" }
241
- ]
242
- }]
243
- }
244
- ```
245
-
246
- **「TDD 逐次実行」の場合:** D-1 へ進む。
247
-
248
- **「PO 並列実行」の場合:**
249
- 1. **最初に必ず** `.claude/skills/parallel-execution.md` を Read する(記憶・推測で進めない)
250
- 2. セッションファイルに `- [ ] PO 並列実行` を追記する
251
- 3. `parallel-execution.md` の手順を完全に守る
252
- 4. 完了後はフェーズ E(レビュー)へ進む
242
+ D-1 へ進む。
253
243
 
254
244
  ### D-1: tester(Red フェーズ)
255
245
 
@@ -0,0 +1,276 @@
1
+ # Wave Execution
2
+
3
+ `/develop` のフェーズ D で plan-report に YAML フロントマター(`po_plan_version: "0.1"`)が含まれるときに Read される手順。
4
+
5
+ C3 の親 Claude が plan-report の DAG を **wave 単位**で歩く。
6
+ - 単独 wave(タスク 1 件) → C3 が直接実行(Agent ツール起動 or ペルソナ採用)
7
+ - 複数 wave(タスク 2 件以上) → parallel-orchestra(PO)にスポット並列委譲
8
+
9
+ 各 wave 完了後にユーザーの承認を取る。
10
+
11
+ ---
12
+
13
+ ## 前提条件
14
+
15
+ - `claude-code-conductor` がインストール済みで `c3` コマンドが PATH 上にあること
16
+ - plan-report が `.claude/reports/plan-report-*.md` の形式で配置され、YAML フロントマターを持つこと(フロントマターが無ければ `dev-workflow.md` の D-1〜D-5 ceremony へフォールバック)
17
+
18
+ ---
19
+
20
+ ## Step 0-pre: ワーキングツリーの事前確認
21
+
22
+ PO は worktree からの auto-merge で main に成果物を取り込む仕様で、**main 側に未コミット変更や untracked ファイルがあると、worktree が同名ファイルを再生成して必ず衝突する**。実行前に `git status` でクリーンであることを確認する。
23
+
24
+ 1. Bash で `git status --short` を実行する
25
+ 2. stdout が空(クリーン)→ Step 0 へ
26
+ 3. クリーンでない場合:
27
+ - 検出された変更ファイルをユーザーに提示する
28
+ - AskUserQuestion で次を確認する:
29
+
30
+ ```json
31
+ {
32
+ "questions": [{
33
+ "question": "PO 実行前に main がクリーンである必要があります。どうしますか?",
34
+ "options": [
35
+ { "label": "コミットしてから続行", "description": "親 Claude が変更内容を確認してコミットしてから wave 実行に進む" },
36
+ { "label": "stash してから続行", "description": "git stash で退避してから wave 実行に進む。完了後に stash pop するかは別途判断" },
37
+ { "label": "キャンセル", "description": "wave 実行を中止し、ユーザーが自分で整理してから /develop を再実行する" }
38
+ ]
39
+ }]
40
+ }
41
+ ```
42
+
43
+ - 「コミットしてから続行」→ 親 Claude が `git status` / `git diff` を見て妥当な単位でコミットしてから Step 0 へ
44
+ - 「stash してから続行」→ Bash で `git stash push -u -m "wave-execution pre-clean"` を実行してから Step 0 へ
45
+ - 「キャンセル」→ スキル終了
46
+
47
+ **特に注意すべきファイル:**
48
+
49
+ - `.claude/settings.local.json` — Claude Code が permission 自動追加で勝手に更新する。気付かないうちに dirty になっているケースが多い
50
+ - `package.json` / `vitest.config.js` 等の事前準備(W0)ファイル — 未コミットで PO に入ると worktree でも同ファイルが書き換わって必ず衝突する
51
+ - `.claude/reports/` 配下の中間生成物
52
+
53
+ ---
54
+
55
+ ## Step 0: 妥当性チェック
56
+
57
+ 1. Glob で `.claude/reports/plan-report-*.md` の最新ファイルパスを取得する
58
+ 2. Read で内容(フロントマター含む)を確認する
59
+ 3. Bash で以下を実行する:
60
+
61
+ ```
62
+ c3 po dry-run <plan-report-path>
63
+ ```
64
+
65
+ - 終了コード `0` = マニフェスト妥当 → Step 1 へ
66
+ - 終了コード `2` = マニフェストエラー(フィールド欠損・agent 不在等)→ stderr のメッセージを整形してユーザーに提示し、`/start` のフェーズ C(計画)を再実行するか手動で plan-report を編集するよう案内してこのスキルを終了する
67
+ - 終了コード `1` = PO 未インストール → 以下の案内文を**そのまま提示**してこのスキルを終了する:
68
+
69
+ > 並列実行を使うには `pip install parallel-orchestra` を実行してください。
70
+ > 詳細: https://pypi.org/project/parallel-orchestra/
71
+
72
+ 親 Claude は逐次実行(`dev-workflow.md` の D-1〜D-5)に切り替えるか、PO をインストールして `/develop` を再実行するかをユーザーに選んでもらう。
73
+
74
+ ---
75
+
76
+ ## Step 1: wave 分解
77
+
78
+ Bash で以下を実行する:
79
+
80
+ ```
81
+ c3 po waves <plan-report-path>
82
+ ```
83
+
84
+ stdout の JSON は以下の形式になる:
85
+
86
+ ```json
87
+ {
88
+ "waves": [
89
+ {
90
+ "index": 0,
91
+ "tasks": [
92
+ { "id": "tdd-login", "agent": "tdd-develop", "read_only": false, "writes": ["src/auth/login.py"], "prompt": "..." },
93
+ { "id": "tdd-logout", "agent": "tdd-develop", "read_only": false, "writes": ["src/auth/logout.py"], "prompt": "..." }
94
+ ]
95
+ },
96
+ {
97
+ "index": 1,
98
+ "tasks": [
99
+ { "id": "review-auth", "agent": "code-reviewer", "read_only": true, "writes": [], "prompt": "..." }
100
+ ]
101
+ }
102
+ ]
103
+ }
104
+ ```
105
+
106
+ - 終了コード `0` = 分解成功 → 親 Claude が JSON をパースして `waves` 配列を取得し Step 2 へ
107
+ - 終了コード `2` = フロントマター不正・循環依存等 → stderr メッセージを提示して終了
108
+
109
+ セッションファイル(`.claude/memory/sessions/YYYYMMDD.tmp`)に以下を追記する(未登録の場合のみ):
110
+ - 各 wave につき `- [ ] Wave {N} ({task_count} tasks)` を 1 行ずつ
111
+
112
+ ---
113
+
114
+ ## Step 2: wave ごとに実行する
115
+
116
+ `waves` 配列を index 順にループする。各 wave で以下を順に行う。
117
+
118
+ ### 2-A: wave 内容を提示する
119
+
120
+ 親 Claude が wave のタスク一覧を Markdown 表で提示する:
121
+
122
+ | id | agent | read_only | writes |
123
+ |---|---|---|---|
124
+ | tdd-login | tdd-develop | false | src/auth/login.py |
125
+ | tdd-logout | tdd-develop | false | src/auth/logout.py |
126
+
127
+ ### 2-B: 実行可否をユーザーに確認する
128
+
129
+ AskUserQuestion ツール:
130
+
131
+ ```json
132
+ {
133
+ "questions": [{
134
+ "question": "Wave {N} を実行してよいですか?",
135
+ "options": [
136
+ { "label": "承認・進む", "description": "この wave を実行する" },
137
+ { "label": "中断", "description": "ここで wave 実行を停止する。完了済みの wave はそのまま残る" }
138
+ ]
139
+ }]
140
+ }
141
+ ```
142
+
143
+ 「中断」の場合、セッションファイルの `## 試みたが失敗したアプローチ` に中断理由を追記してスキル終了。
144
+
145
+ ### 2-C: ランナーを選んで実行する
146
+
147
+ `len(wave.tasks)` で分岐する。
148
+
149
+ #### case A: 単独 wave(タスク 1 件)
150
+
151
+ タスクの `agent` フィールドで更に分岐する。
152
+
153
+ ##### A-1: `agent == "tdd-develop"` のとき
154
+
155
+ **ペルソナ採用パターン**で実行する。Agent ツールで起動するとサブエージェント depth 1 制限により内部の tester/developer サブエージェントが spawn できないため、親 Claude が直接 tdd-develop ペルソナで動く。
156
+
157
+ 1. `.claude/agents/tdd-develop.md` を Read してペルソナを採用する
158
+ 2. `.claude/skills/worktree-tdd-workflow.md` を Read して TDD ループ手順(tester→developer→tester)を取得する
159
+ 3. タスクの `prompt` を実装内容として、worktree-tdd-workflow.md の Step 1〜4 を **親 Claude が直接** 実行する。tester / developer は Agent ツールでスポーン可能(depth 1 で完結する)
160
+ 4. ループ完了後、結果を 2-D の集約に渡す
161
+
162
+ ##### A-2: `agent` がそれ以外(`code-reviewer` / `security-reviewer` / `developer` / `tester` 等)
163
+
164
+ **Agent ツール起動パターン**で実行する。これらの agent は内部で更に subagent を spawn しないため depth 1 制限に抵触しない。
165
+
166
+ 1. Agent ツールで `subagent_type` は指定せず(カスタム agent は subagent_type 不可)、プロンプトに以下を含める:
167
+ - 「`.claude/agents/{agent_name}.md` を Read してペルソナを採用すること」
168
+ - タスクの `prompt` 本文
169
+ - **「git add / git commit / git push を実行しないこと。コミットは親 Claude がユーザー承認後に行う」を明示**
170
+ 2. Agent の返答を 2-D の集約に渡す
171
+
172
+ **git 禁止ルールの根拠:** 動作確認で developer が独断コミットして Red テストや test-report が untracked のまま実装ファイルだけが main に入る事故が起きた。コミット粒度・承認タイミング・成果物の取りこぼしは親 Claude が一元管理する責務。
173
+
174
+ ##### 将来 agent を追加する場合
175
+
176
+ 「内部で更に subagent を呼ぶ agent」を新たに作る場合は、A-1 のペルソナ採用パターン側に追加する。判断基準: その agent の定義ファイルが「内部で Agent ツールを使う」前提になっているか。tdd-develop が現状の唯一の例。
177
+
178
+ #### case B: 複数 wave(タスク 2 件以上)
179
+
180
+ **PO スポット委譲**で実行する。
181
+
182
+ Bash で以下を実行する:
183
+
184
+ ```
185
+ c3 po run-wave <plan-report-path> --wave-index {N} --report .claude/reports/po-run-report-wave-{N}-{ts}.json
186
+ ```
187
+
188
+ - `{N}` は wave の index
189
+ - `{ts}` は `YYYYMMDD-HHMMSS` 形式。Bash で `python -c "from datetime import datetime; print(datetime.now().strftime('%Y%m%d-%H%M%S'))"` を実行して取得
190
+ - `c3 po run-wave` は `.claude/tmp/po-manifest-wave-{N}-{ts}.md` に ephemeral マニフェストを生成し、PO に subprocess 委譲する。各タスクは PO が `claude -p --agent <name>` を独立 Claude セッション(depth 0)として起動するため、tdd-develop も内部で tester/developer を spawn できる
191
+
192
+ 終了コードと意味:
193
+
194
+ | exit code | 意味 | 次のアクション |
195
+ |---|---|---|
196
+ | `0` | wave 内全タスク成功 | 2-D へ |
197
+ | `1` | 1件以上のタスクが失敗 | 2-D へ(失敗一覧を含めて提示)。**注:** PO は 1 タスクあたり 15 分(`_INTERNAL_TIMEOUT_SEC = 900`、ハードコード上書き不可)でタイムアウトする。15 分超で failure 扱いになっていれば planner の粒度を見直す |
198
+ | `2` | マニフェストエラー(Step 0 をすり抜けた)| エラー内容を提示しスキル終了 |
199
+ | `3` | auto-merge 衝突(worktree → main の取り込みに失敗)| 下記「auto-merge が衝突した場合」のリカバリ手順へ |
200
+
201
+ 実行完了後、生成された `po-run-report-wave-{N}-{ts}.json` を Read してタスクごとのステータスを取得する。
202
+
203
+ ##### auto-merge が衝突した場合(exit code 3)
204
+
205
+ PO は worktree でタスクを実行したあと main に auto-merge する。Step 0-pre をすり抜けて main にダーティな状態が残っていたり、複数 worktree が同じ周辺ファイル(CLAUDE.md / settings.local.json 等)を触っていると衝突する。selective checkout でコア成果物だけ救う:
206
+
207
+ 1. 残っている PO ブランチを列挙する: `git branch --list "parallel-orchestra/*"`
208
+ 2. 各ブランチを個別に確認する: `git log --stat parallel-orchestra/<task>-<hash>`
209
+ 3. **コア成果物のみ**を抽出する: `git checkout parallel-orchestra/<task>-<hash> -- <files>`
210
+ - 取り込むのはタスクの `writes` フィールドに列挙されたファイルのみ
211
+ - **取り込まない**: worktree が touch したが本タスクの責務でない周辺ファイル
212
+ - `CLAUDE.md` / `package.json` / `vitest.config.js` 等の事前準備系ファイル
213
+ - `.claude/settings.local.json`(permission 自動追加で worktree 側でも更新されている)
214
+ - `.claude/reports/` 配下の中間生成物
215
+ 4. PO ブランチを削除する: `git branch -D parallel-orchestra/<task>-<hash>` を全ブランチに対して実行
216
+ 5. 抽出した成果物 + 既存の main 変更分を親 Claude が確認のうえコミットする
217
+ 6. `git status --short` で main がクリーンになったことを確認してから次の wave に進む
218
+
219
+ ### 2-D: 結果を集約してユーザーに提示する
220
+
221
+ ランナー種別ごとに以下の形式で結果を提示する。
222
+
223
+ **case A(単独 wave):**
224
+ - A-1: 親 Claude の TDD ループ結果(tester/developer の Agent 返答の要約、最終 tester の合否)
225
+ - A-2: Agent の返答テキスト(必要なら要約)
226
+
227
+ **case B(複数 wave / PO 委譲):**
228
+ - `po-run-report-wave-{N}-*.json` を Markdown 表に整形:
229
+
230
+ | id | agent | status | worktree | duration | last_error_summary |
231
+ |---|---|---|---|---|---|
232
+ | tdd-login | tdd-develop | success | wt-tdd-login | 124s | - |
233
+ | tdd-logout | tdd-develop | failure | wt-tdd-logout | 89s | TestLogout::test_csrf failed |
234
+
235
+ ### 2-E: 失敗があったら方針を確認する
236
+
237
+ case A で TDD ループが不合格のまま終わった、または case B で 1 件以上失敗した場合、AskUserQuestion で次を確認する:
238
+
239
+ ```json
240
+ {
241
+ "questions": [{
242
+ "question": "Wave {N} に失敗があります。どうしますか?",
243
+ "options": [
244
+ { "label": "リトライ", "description": "同じ wave をもう一度実行する" },
245
+ { "label": "スキップして次の wave へ", "description": "失敗を残したまま次の wave に進む" },
246
+ { "label": "中断", "description": "ここで wave 実行を停止する。完了済みの wave はそのまま残る" }
247
+ ]
248
+ }]
249
+ }
250
+ ```
251
+
252
+ - 「リトライ」 → 2-A から同じ wave を再実行
253
+ - 「スキップして次の wave へ」 → 失敗内容をセッションファイルの `## 試みたが失敗したアプローチ` に追記して次の wave へ
254
+ - 「中断」 → セッションファイルの該当 wave 行は `- [ ]` のままにしてスキル終了
255
+
256
+ ### 2-F: wave 完了をセッションに記録する
257
+
258
+ 全タスク成功した wave のみ、セッションファイルの `- [ ] Wave {N} (M tasks)` を `- [x] Wave {N} (M tasks)` に Edit する。
259
+
260
+ **次の wave に進む前に main をコミットしてクリーンに保つ。** wave 成果物を未コミットのまま次の wave で PO に入ると、worktree が同名ファイルを再生成して必ず auto-merge 衝突が起きる(Step 0-pre と同じ理由)。親 Claude が wave の成果物を確認のうえ「Wave {N}: {要約}」のメッセージでコミットしてから 2-A の次のループに戻る。
261
+
262
+ ---
263
+
264
+ ## Step 3: フェーズ E への遷移
265
+
266
+ 全 wave 完了後、フェーズ E(レビュー)への遷移を案内する。
267
+
268
+ - plan-report に reviewer タスク(agent が `code-reviewer` / `security-reviewer`)が含まれている場合は wave で既に実行済みなので、二重レビューを避けるためにユーザーへ「wave 内で reviewer タスクが完了済みなので E をスキップしてもよい」と提示する
269
+ - reviewer タスクが含まれていない場合は通常通りフェーズ E へ進む
270
+
271
+ ---
272
+
273
+ ## 知識蓄積
274
+
275
+ - wave 実行で**特定パターンが詰まりがち**(例: tdd-develop の persona 起動で context が膨らみやすい)と気付いたら、セッションファイルの `## 試みたが失敗したアプローチ` に追記し `patterns` に登録する
276
+ - wave 分解の精度(planner の出力品質)に関する観察も同様に記録する。これは将来 planner 側のルール改善に繋がる
@@ -1,5 +1,82 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.3.1] - 2026-05-01
4
+
5
+ ### Docs
6
+ - Operational rules captured from a 17-tasks / 7-stages C3+PO verification
7
+ run in `c3_pip_test`:
8
+ - `.claude/skills/wave-execution.md`: new **Step 0-pre** that requires a
9
+ clean working tree before invoking PO (PO's auto-merge re-creates
10
+ same-named files in worktrees and conflicts on dirty main — most
11
+ commonly via `.claude/settings.local.json`, which Claude Code auto-edits
12
+ when granting permissions). Adds an explicit **"do not git
13
+ add/commit/push"** rule to case A-2 Agent-tool prompts (a developer
14
+ sub-agent was committing implementation files while leaving Red tests
15
+ and test-reports untracked). Adds an **auto-merge conflict (exit code
16
+ 3) recovery** sub-section under case B with a selective-checkout
17
+ procedure that rescues only declared `writes` and discards worktree-
18
+ side edits to surrounding files. Adds a per-wave commit reminder under
19
+ Step 2-F. Notes PO's hardcoded 15-minute per-task timeout
20
+ (`_INTERNAL_TIMEOUT_SEC = 900`, no manifest-level override) so the
21
+ parent Claude can route exit-code-1 timeouts back to planner sizing
22
+ rather than agent debugging.
23
+ - `.claude/agents/planner.md`: documents the `depends_on: []` pitfall
24
+ (`c3 po dry-run` rejects empty arrays — omit the field instead) and
25
+ the `writes` collision detection. Adds a per-task time budget rule
26
+ (≤15 min, matching PO's internal timeout) with a self-check item.
27
+ Adds an **"alternating parallel/serial pattern"** section that
28
+ authorises ordering `depends_on` between stages when the user
29
+ explicitly wants intermediate review/sync points, while preserving
30
+ in-stage parallelism ≥ 2.
31
+ - `.claude/docs/parallel-orchestra-manifest.md`: adds an "alternating
32
+ parallel/serial pattern" section describing the structure with a
33
+ pointer to the planner rule.
34
+
35
+ No code changes — `c3 update` after `pip install -U claude-code-conductor`
36
+ brings these into existing projects.
37
+
38
+ ## [0.3.0] - 2026-04-30
39
+
40
+ ### Changed (breaking)
41
+ - `/develop` now auto-detects YAML frontmatter on the latest plan-report and
42
+ switches between two modes:
43
+ - **frontmatter present** → new "C3 main + PO spot" workflow. C3 walks the
44
+ DAG wave-by-wave, asks for user approval before each wave, and dispatches
45
+ each wave to the right runner: solo waves run on the C3 host (Agent-tool
46
+ spawn for `code-reviewer` / `developer` / `tester`, parent-Claude persona
47
+ adoption for `tdd-develop` to avoid the depth-1 nested-spawn limit), and
48
+ multi-task waves are delegated to parallel-orchestra via an ephemeral
49
+ wave-only manifest under `.claude/tmp/`.
50
+ - **no frontmatter** → legacy D-1〜D-5 sequential TDD ceremony, unchanged.
51
+ - The previous "PO 全委譲" model (D-0 two-choice prompt) and
52
+ `.claude/skills/parallel-execution.md` are removed. The new flow is
53
+ documented in `.claude/skills/wave-execution.md`.
54
+
55
+ ### Added
56
+ - `c3 po waves <plan-report>` — prints the topological wave decomposition of
57
+ a manifest as JSON. Used by `wave-execution.md` to drive the per-wave loop.
58
+ - `c3 po run-wave <plan-report> --wave-index N` — generates a wave-only
59
+ ephemeral manifest under `.claude/tmp/po-manifest-wave-{N}-{ts}.md` and
60
+ hands it to parallel-orchestra.
61
+ - `c3.po.manifest.compute_waves(frontmatter)` — Kahn's-algorithm topological
62
+ wave decomposition. Detects cycles, unknown dependency ids, and duplicate
63
+ task ids.
64
+ - `c3.po.manifest.build_wave_manifest_text(frontmatter, wave_index)` —
65
+ emits a parseable plan-report Markdown for one wave, dropping `depends_on`
66
+ and webhook fields and decorating the manifest name with ` - wave N`.
67
+ - `tests/test_po_waves.py` (16 tests) and `tests/test_cli_po.py` (5 tests)
68
+ covering wave decomposition, ephemeral-manifest generation, CLI exit
69
+ codes, and frontmatter round-trip.
70
+
71
+ ### Notes
72
+ - The persona-adoption pattern for `tdd-develop` in solo waves is the direct
73
+ consequence of Claude Code's depth-1 nested-spawn limit (a sub-agent
74
+ spawned via the Agent tool cannot itself spawn another sub-agent). For
75
+ agents that internally spawn sub-agents (today: `tdd-develop`), the parent
76
+ Claude reads the agent definition and adopts its persona instead. Other
77
+ agents (`code-reviewer`, `security-reviewer`, `developer`, `tester`) keep
78
+ using the standard Agent-tool spawn path.
79
+
3
80
  ## [0.2.4] - 2026-05-01
4
81
 
5
82
  ### Changed
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: claude-code-conductor
3
- Version: 0.2.4
3
+ Version: 0.3.1
4
4
  Summary: Multi-agent orchestration framework for Claude Code (C3)
5
5
  Project-URL: Homepage, https://github.com/satoh-y-0323/claude-code-conductor
6
6
  Project-URL: Repository, https://github.com/satoh-y-0323/claude-code-conductor
@@ -1,3 +1,3 @@
1
1
  """Claude Code Conductor (C3) - multi-agent orchestration framework for Claude Code."""
2
2
 
3
- __version__ = "0.2.4"
3
+ __version__ = "0.3.1"