claude-code-conductor 1.13.0__tar.gz → 2.0.0__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.
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/.claude/agents/planner.md +15 -13
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/.claude/hooks/record_review_decision.py +1 -1
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/.claude/hooks/record_tier_outcome.py +0 -1
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/.claude/hooks/review_hint_inject.py +0 -1
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/.claude/hooks/schema.sql +8 -35
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/.claude/hooks/select_tier.py +1 -3
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/.claude/hooks/session_start.py +1 -1
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/.claude/hooks/subagent_log.py +0 -55
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/.claude/hooks/worktree_guard.py +2 -1
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/.claude/skills/parallel-agents/SKILL.md +10 -10
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/CHANGELOG.md +169 -0
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/PKG-INFO +1 -1
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/pyproject.toml +1 -3
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/src/c3/__init__.py +1 -1
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/src/c3/cli.py +2 -2
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/src/c3/cli_doctor.py +4 -23
- claude_code_conductor-2.0.0/src/c3/cli_plan.py +82 -0
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/src/c3/db.py +26 -337
- claude_code_conductor-2.0.0/src/c3/plan_validator.py +213 -0
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/tests/hooks/test_pip_reinstall_reminder.py +2 -2
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/tests/hooks/test_select_tier_escalation.py +1 -1
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/tests/hooks/test_session_start.py +5 -2
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/tests/test_cli_init.py +2 -2
- claude_code_conductor-2.0.0/tests/test_cli_plan.py +169 -0
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/tests/test_excludes.py +1 -1
- claude_code_conductor-2.0.0/tests/test_plan_validator.py +281 -0
- claude_code_conductor-1.13.0/.claude/docs/parallel-orchestra-manifest.md +0 -214
- claude_code_conductor-1.13.0/.claude/docs/po-worktree-writes.md +0 -153
- claude_code_conductor-1.13.0/.claude/hooks/po_heartbeat.py +0 -90
- claude_code_conductor-1.13.0/.claude/skills/wave-execution/SKILL.md +0 -306
- claude_code_conductor-1.13.0/src/c3/cli_po.py +0 -184
- claude_code_conductor-1.13.0/src/c3/po/__init__.py +0 -11
- claude_code_conductor-1.13.0/src/c3/po/manifest.py +0 -270
- claude_code_conductor-1.13.0/src/c3/po/run.py +0 -133
- claude_code_conductor-1.13.0/src/parallel_orchestra/__init__.py +0 -33
- claude_code_conductor-1.13.0/src/parallel_orchestra/_exceptions.py +0 -5
- claude_code_conductor-1.13.0/src/parallel_orchestra/c3_db.py +0 -26
- claude_code_conductor-1.13.0/src/parallel_orchestra/cli.py +0 -198
- claude_code_conductor-1.13.0/src/parallel_orchestra/manifest.py +0 -658
- claude_code_conductor-1.13.0/src/parallel_orchestra/report.py +0 -206
- claude_code_conductor-1.13.0/src/parallel_orchestra/runner.py +0 -1890
- claude_code_conductor-1.13.0/tests/parallel_orchestra/conftest.py +0 -97
- claude_code_conductor-1.13.0/tests/parallel_orchestra/test_cli.py +0 -262
- claude_code_conductor-1.13.0/tests/parallel_orchestra/test_manifest.py +0 -896
- claude_code_conductor-1.13.0/tests/parallel_orchestra/test_po_results_recording.py +0 -351
- claude_code_conductor-1.13.0/tests/parallel_orchestra/test_po_status_visibility.py +0 -513
- claude_code_conductor-1.13.0/tests/parallel_orchestra/test_po_worktree_writes.py +0 -635
- claude_code_conductor-1.13.0/tests/parallel_orchestra/test_report.py +0 -236
- claude_code_conductor-1.13.0/tests/parallel_orchestra/test_retry_backoff.py +0 -253
- claude_code_conductor-1.13.0/tests/parallel_orchestra/test_review_fixes.py +0 -286
- claude_code_conductor-1.13.0/tests/parallel_orchestra/test_review_fixes2.py +0 -96
- claude_code_conductor-1.13.0/tests/parallel_orchestra/test_review_fixes3.py +0 -62
- claude_code_conductor-1.13.0/tests/parallel_orchestra/test_review_fixes4.py +0 -96
- claude_code_conductor-1.13.0/tests/parallel_orchestra/test_review_fixes5.py +0 -88
- claude_code_conductor-1.13.0/tests/parallel_orchestra/test_runner_model_override.py +0 -335
- claude_code_conductor-1.13.0/tests/parallel_orchestra/test_runner_t7.py +0 -416
- claude_code_conductor-1.13.0/tests/parallel_orchestra/test_runner_v04_fix.py +0 -145
- claude_code_conductor-1.13.0/tests/parallel_orchestra/test_runner_v04_m1.py +0 -226
- claude_code_conductor-1.13.0/tests/parallel_orchestra/test_runner_v04_m2.py +0 -317
- claude_code_conductor-1.13.0/tests/parallel_orchestra/test_summary_loop.py +0 -215
- claude_code_conductor-1.13.0/tests/skills/__init__.py +0 -0
- claude_code_conductor-1.13.0/tests/test_cli_po.py +0 -159
- claude_code_conductor-1.13.0/tests/test_cli_po_tempfile.py +0 -165
- claude_code_conductor-1.13.0/tests/test_manifest_fixes.py +0 -395
- claude_code_conductor-1.13.0/tests/test_manifest_yaml_escape.py +0 -227
- claude_code_conductor-1.13.0/tests/test_po_manifest.py +0 -137
- claude_code_conductor-1.13.0/tests/test_po_run.py +0 -178
- claude_code_conductor-1.13.0/tests/test_po_waves.py +0 -212
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/.claude/CLAUDE.md +0 -0
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/.claude/agents/architect.md +0 -0
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/.claude/agents/code-reviewer.md +0 -0
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/.claude/agents/developer.md +0 -0
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/.claude/agents/doc-writer.md +0 -0
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/.claude/agents/interviewer.md +0 -0
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/.claude/agents/project-setup.md +0 -0
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/.claude/agents/security-reviewer.md +0 -0
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/.claude/agents/systematic-debugger.md +0 -0
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/.claude/agents/tdd-develop.md +0 -0
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/.claude/agents/tester.md +0 -0
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/.claude/docs/settings.json.md +0 -0
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/.claude/hooks/consolidate_memory.py +0 -0
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/.claude/hooks/permission_handler.py +0 -0
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/.claude/hooks/post_tool.py +0 -0
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/.claude/hooks/pre_compact.py +0 -0
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/.claude/hooks/pre_tool.py +0 -0
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/.claude/hooks/restore_session.py +0 -0
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/.claude/hooks/session_stop.py +0 -0
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/.claude/hooks/session_utils.py +0 -0
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/.claude/hooks/statusline.py +0 -0
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/.claude/hooks/stop.py +0 -0
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/.claude/memory/.gitkeep +0 -0
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/.claude/permission_rules.json +0 -0
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/.claude/rules/code-review-checklist.md +0 -0
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/.claude/rules/promoted/index.md +0 -0
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/.claude/rules/security-review-checklist.md +0 -0
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/.claude/settings.json +0 -0
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/.claude/skills/code-review/SKILL.md +0 -0
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/.claude/skills/dev-workflow/SKILL.md +0 -0
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/.claude/skills/develop/SKILL.md +0 -0
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/.claude/skills/doc/SKILL.md +0 -0
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/.claude/skills/extract-lib/SKILL.md +0 -0
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/.claude/skills/init-session/SKILL.md +0 -0
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/.claude/skills/mcp-config/SKILL.md +0 -0
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/.claude/skills/pattern-status/SKILL.md +0 -0
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/.claude/skills/promote-pattern/SKILL.md +0 -0
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/.claude/skills/report-timestamp/SKILL.md +0 -0
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/.claude/skills/report-timestamp/scripts/get_timestamp.py +0 -0
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/.claude/skills/setup/SKILL.md +0 -0
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/.claude/skills/start/SKILL.md +0 -0
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/.claude/skills/task-routing/SKILL.md +0 -0
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/.claude/skills/worktree-tdd-workflow/SKILL.md +0 -0
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/.claude/state/.gitkeep +0 -0
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/.gitignore +0 -0
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/LICENSE +0 -0
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/README.md +0 -0
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/hatch_build.py +0 -0
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/src/c3/__main__.py +0 -0
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/src/c3/_excludes.py +0 -0
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/src/c3/_terminal.py +0 -0
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/src/c3/cli_init.py +0 -0
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/src/c3/cli_list.py +0 -0
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/src/c3/cli_tier.py +0 -0
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/src/c3/cli_update.py +0 -0
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/src/c3/paths.py +0 -0
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/tests/__init__.py +0 -0
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/tests/conftest.py +0 -0
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/tests/hooks/__init__.py +0 -0
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/tests/hooks/test_consolidate_memory.py +0 -0
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/tests/hooks/test_permission_handler.py +0 -0
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/tests/hooks/test_planner_check.py +0 -0
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/tests/hooks/test_post_tool.py +0 -0
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/tests/hooks/test_pre_tool.py +0 -0
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/tests/hooks/test_record_tier_outcome.py +0 -0
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/tests/hooks/test_restore_session.py +0 -0
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/tests/hooks/test_review_hint_inject.py +0 -0
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/tests/hooks/test_select_tier.py +0 -0
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/tests/hooks/test_session_stop.py +0 -0
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/tests/hooks/test_session_utils.py +0 -0
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/tests/hooks/test_settings_local_absolute_paths.py +0 -0
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/tests/hooks/test_similarity_boost.py +0 -0
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/tests/hooks/test_statusline.py +0 -0
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/tests/hooks/test_statusline_template_sync.py +0 -0
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/tests/hooks/test_subagent_log.py +0 -0
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/tests/hooks/test_sync_check.py +0 -0
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/tests/hooks/test_template_guard.py +0 -0
- {claude_code_conductor-1.13.0/tests/parallel_orchestra → claude_code_conductor-2.0.0/tests/skills}/__init__.py +0 -0
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/tests/skills/test_session_backlog_reconciliation.py +0 -0
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/tests/skills/test_start_skill_bugfix_flow.py +0 -0
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/tests/skills/test_start_skill_security_audit_phase.py +0 -0
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/tests/skills/test_task_routing_skill.py +0 -0
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/tests/test_cli_list.py +0 -0
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/tests/test_cli_tier.py +0 -0
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/tests/test_docstring_consistency.py +0 -0
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/tests/test_paths.py +0 -0
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/tests/test_pre_compact.py +0 -0
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/tests/test_pre_tool_hook.py +0 -0
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/tests/test_precompact_additional.py +0 -0
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/tests/test_precompact_toctou_fixes.py +0 -0
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/tests/test_session_utils_additional.py +0 -0
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/tests/test_statusline.py +0 -0
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/tests/test_stop_additional.py +0 -0
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/tests/test_stop_hook.py +0 -0
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/tests/test_stop_precompact_fixes.py +0 -0
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/tests/test_sync_template_stop.py +0 -0
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/tests/test_template_pre_tool_hook.py +0 -0
- {claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/tests/test_worktree_guard.py +0 -0
|
@@ -41,7 +41,7 @@ requirements-report・architecture-report・各種レビューレポートを統
|
|
|
41
41
|
|
|
42
42
|
**After:**
|
|
43
43
|
- Skill ツールで `report-timestamp` を呼び出してタイムスタンプを取得し、Write ツールで `.claude/reports/plan-report-{timestamp}.md` に出力する
|
|
44
|
-
- plan-report の**先頭に YAML
|
|
44
|
+
- plan-report の**先頭に YAML フロントマターを必ず付与する**。最低限以下を出力すること:
|
|
45
45
|
- `po_plan_version: "0.1"`
|
|
46
46
|
- `name`(プランの表示名・文字列)
|
|
47
47
|
- `cwd: "../.."`(plan-report からプロジェクトルートへの相対パス)
|
|
@@ -51,12 +51,14 @@ requirements-report・architecture-report・各種レビューレポートを統
|
|
|
51
51
|
|
|
52
52
|
## 並列実行のための設計指針
|
|
53
53
|
|
|
54
|
-
plan-report の YAML フロントマターは `parallel-
|
|
54
|
+
plan-report の YAML フロントマターは `parallel-agents` skill(親 Claude の Agent ツール並列起動 + 公式 `isolation: "worktree"`)で並列実行されることを前提に設計する。直列の依存チェーンを書いてしまうと並列実行の意味が消えるので、以下のルールを守る。
|
|
55
|
+
|
|
56
|
+
**depth 1 制限の注意**: Claude Code のサブエージェントは更にサブエージェントを spawn できない。これにより `tdd-develop`(内部で tester / developer を Agent ツールで呼ぶ設計)は **`parallel-agents` skill の並列起動の対象外** で、親 Claude のペルソナ採用パターンで逐次実行される。よって **`tdd-develop` を含む wave は 1 タスクのみ** が望ましい(複数 tdd-develop を 1 wave に入れても並列度 1 で消化されるだけで意味が薄い)。
|
|
55
57
|
|
|
56
58
|
### depends_on の付け方
|
|
57
59
|
|
|
58
60
|
1. **真の依存だけに絞る** — タスク B がタスク A の出力(コードのシグネチャ・型・関数名・ファイルそのもの)に**実際に依存している**ときのみ `B.depends_on: [A]` とする。「順序を守りたい」「念のため」「同じ機能だから」レベルの依存は書かない
|
|
59
|
-
2. **直列化の自己チェック** — 出力直前に「`depends_on` チェーンの最大長が `タスク数 / 2` を超えていないか」を確認する。N 個のタスクが N-1 段の依存チェーンになっていたら **並列度 1**
|
|
61
|
+
2. **直列化の自己チェック** — 出力直前に「`depends_on` チェーンの最大長が `タスク数 / 2` を超えていないか」を確認する。N 個のタスクが N-1 段の依存チェーンになっていたら **並列度 1** で並列実行を使う意味がない
|
|
60
62
|
3. **レビュー系タスクは末尾に集約** — `code-reviewer` / `security-reviewer` は `read_only: true` で全 dev タスクに `depends_on` を付ける(すべての実装が終わった後に走る)
|
|
61
63
|
|
|
62
64
|
### タスクの粒度(基本: ファイル/モジュール単位)
|
|
@@ -69,11 +71,11 @@ plan-report の YAML フロントマターは `parallel-orchestra` (PO) で並
|
|
|
69
71
|
|
|
70
72
|
### writes フィールドの埋め方
|
|
71
73
|
|
|
72
|
-
7. **`writes` を必ず列挙(`read_only: true` タスクは除く)** — 各タスクが書き込むファイルパスを `tasks[].writes`
|
|
73
|
-
8. **同一ファイルへの書き込みは 1 タスクに集約する** — 複数タスクの `writes`
|
|
74
|
+
7. **`writes` を必ず列挙(`read_only: true` タスクは除く)** — 各タスクが書き込むファイルパスを `tasks[].writes` に書く。`parallel-agents` skill が並列起動後に各 worktree から `writes` のファイルを取り込むため、欠落していると成果物が main に届かない。ただし `read_only: true`(レビュー系)タスクはファイルを書かないため `writes` フィールド自体を省略すること
|
|
75
|
+
8. **同一ファイルへの書き込みは 1 タスクに集約する** — 複数タスクの `writes` で同じファイルを宣言すると、`parallel-agents` skill が各 worktree から取り込むときにどちらの版を採用すべきか決定不能になる。解消手段は実質的に以下の 2 つに限られる:
|
|
74
76
|
- **(a) タスクをまとめる** — 同一ファイルを書く処理を 1 タスクに統合する
|
|
75
|
-
- **(b) そのファイルを書く権限を 1 タスク専属にする** — 他のタスクの `writes` リストから除外する。先行タスクが stub / placeholder を作って後発タスクが上書きする設計は
|
|
76
|
-
9. **統合ファイル(エントリポイント等)は最後の wave 専属にする** — `main.js` のような「各機能を結線する統合ファイル」は、全機能 wave が出揃った後の最終 wave に専属で書かせる。先行 wave で stub
|
|
77
|
+
- **(b) そのファイルを書く権限を 1 タスク専属にする** — 他のタスクの `writes` リストから除外する。先行タスクが stub / placeholder を作って後発タスクが上書きする設計は **採用しない**(取り込み時に衝突するため)
|
|
78
|
+
9. **統合ファイル(エントリポイント等)は最後の wave 専属にする** — `main.js` のような「各機能を結線する統合ファイル」は、全機能 wave が出揃った後の最終 wave に専属で書かせる。先行 wave で stub を作る設計は採用しない。代わりに先行 wave は各機能ファイル(例: `calc.js` / `currency.js`)のみを書き、最終 wave がそれらを import して統合する
|
|
77
79
|
|
|
78
80
|
### 出力直前の自己チェックリスト
|
|
79
81
|
|
|
@@ -86,7 +88,7 @@ plan-report の YAML フロントマターは `parallel-orchestra` (PO) で並
|
|
|
86
88
|
|
|
87
89
|
### タスクあたりの所要時間制約
|
|
88
90
|
|
|
89
|
-
|
|
91
|
+
`parallel-agents` skill は **親 Claude が Agent ツールで子 Agent の返却を待つ**間ブロックされる。長時間タスクが含まれると全 wave の完了が遅延し、ユーザー体験が著しく悪化する。
|
|
90
92
|
|
|
91
93
|
10. **1 タスクは 15 分以内に終わる粒度で分解する** — `tdd-develop` の tester→developer→tester ループでも 15 分を上限の目安にする。長くなりそうな機能は (a) ファイル境界でタスク分割、(b) MVP と機能拡張で別タスク化、のいずれかで時間を切る
|
|
92
94
|
- 自己チェックリストに追加: `[ ] 想定実行時間が 15 分を超えるタスクがないか`
|
|
@@ -95,7 +97,7 @@ PO は内部で **タスクごとのタイムアウトを 900 秒(15 分)で
|
|
|
95
97
|
|
|
96
98
|
実装時に踏みやすい入力ミス。dry-run で検出できるが、出力前に planner 側で潰しておく:
|
|
97
99
|
|
|
98
|
-
11. **`depends_on: []` を空配列で書かない** — `c3
|
|
100
|
+
11. **`depends_on: []` を空配列で書かない** — `c3 plan validate` の構造チェックで lint されるリスクがある(依存が無いタスクは `depends_on` フィールド**自体を省略**する慣習)
|
|
99
101
|
|
|
100
102
|
### 直列・並列交互パターンの取り扱い
|
|
101
103
|
|
|
@@ -116,16 +118,16 @@ Stage 1: dev_a, dev_b, dev_c (並列)
|
|
|
116
118
|
- ルール 2(直列化セルフチェック: チェーン長 ≦ タスク数 / 2)は依然として守る
|
|
117
119
|
- 「stage 区切り」自体は plan-report 本文で明文化し、`depends_on` だけに頼らない
|
|
118
120
|
|
|
119
|
-
|
|
121
|
+
並列・直列交互パターンの構造は、各 stage を 1 つの wave、stage 間の遷移を `depends_on` で表現する。`parallel-agents` skill は各 wave を順に並列実行する。
|
|
120
122
|
|
|
121
123
|
## 自動検査対象(PostToolUse hook)
|
|
122
124
|
|
|
123
125
|
配布元では `.dev/hooks/_planner_check.py`(PostToolUse Write/Edit)が `.claude/reports/plan-report-*.md` の YAML frontmatter を機械検査する。以下 4 ルールに違反すると stderr に `[PlannerCheck WARN]` または `[PlannerCheck BLOCK]` が出る。planner は出力前に自己点検でこれらを潰すこと。
|
|
124
126
|
|
|
125
127
|
- **R1 (tdd-develop writes 完備)** — `agent: tdd-develop` の task の `writes` に、(a) `tests/` で始まるテストファイルの具体的パス、(b) `.claude/reports/test-report-{任意}.md` の具体的パス、の両方を列挙する。glob (`*`) 入りは不可
|
|
126
|
-
- **R2 (reviewer ファイル名は task_id ベース)** — `agent: code-reviewer` / `security-reviewer` の `writes` ファイル名は `task_id` を含む固定名にし、タイムスタンプ(`YYYYMMDD` / `YYYYMMDD-HHMMSS` 形式)を含めない。例: `.claude/reports/code-review-report-review1.md` ✓ / `.claude/reports/code-review-report-20260510.md` ✗。タイムスタンプを動的取得すると writes と実ファイル名が乖離して
|
|
128
|
+
- **R2 (reviewer ファイル名は task_id ベース)** — `agent: code-reviewer` / `security-reviewer` の `writes` ファイル名は `task_id` を含む固定名にし、タイムスタンプ(`YYYYMMDD` / `YYYYMMDD-HHMMSS` 形式)を含めない。例: `.claude/reports/code-review-report-review1.md` ✓ / `.claude/reports/code-review-report-20260510.md` ✗。タイムスタンプを動的取得すると writes と実ファイル名が乖離して `parallel-agents` skill の成果物取り込みが破綻する
|
|
127
129
|
- **R3 (`src/c3/_template/` 直接 writes 禁止)** — どの task も `writes` に `src/c3/_template/` パスを含めない(hook が exit 2 でブロック)。`_template/` は `hatch_build.py` がビルド時に `.claude/` から再生成する配布物実体で、直接編集してもビルド時に消失する
|
|
128
|
-
- **R4 (同一 writes パスの順序付け)** — 同じ `writes` パスを複数 task が宣言する場合は、後発 task の `depends_on` で先発 task を参照して順序付けする。順序付けがないと
|
|
130
|
+
- **R4 (同一 writes パスの順序付け)** — 同じ `writes` パスを複数 task が宣言する場合は、後発 task の `depends_on` で先発 task を参照して順序付けする。順序付けがないと `parallel-agents` skill の成果物取り込みでどちらの版を採用すべきか決定不能になる
|
|
129
131
|
|
|
130
132
|
これらは hook により自動検出されるが、出力前の自己チェックリストにも追加して事前に潰すこと:
|
|
131
133
|
- [ ] R1: tdd-develop の全 task で writes に test ファイルと test-report が両方含まれているか
|
|
@@ -136,7 +138,7 @@ Stage 1: dev_a, dev_b, dev_c (並列)
|
|
|
136
138
|
## Tools & Constraints
|
|
137
139
|
制限:
|
|
138
140
|
- ソースファイルの編集・書き込みは行わない
|
|
139
|
-
- plan-report の YAML フロントマター内で `tasks[].id` の重複・未定義の `depends_on` 参照・エージェント名の typo を出力しない(`c3
|
|
141
|
+
- plan-report の YAML フロントマター内で `tasks[].id` の重複・未定義の `depends_on` 参照・エージェント名の typo を出力しない(`c3 plan validate` で検証可能)
|
|
140
142
|
- 上記「並列実行のための設計指針」のルール 1〜11 と自己チェックリストに違反した plan-report を出力しない
|
|
141
143
|
- 自動検査対象 R1〜R4 に違反する plan-report を出力しない(`.dev/hooks/_planner_check.py` が PostToolUse で検出する)
|
|
142
144
|
|
{claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/.claude/hooks/record_review_decision.py
RENAMED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
|
|
4
4
|
F-001: dev-workflow フェーズ E でユーザーが「対応 / 許容 / 保留」を選んだ
|
|
5
5
|
判断を SQLite に記録するための薄い CLI ラッパー。実装本体は
|
|
6
|
-
``c3.db.insert_review_decision
|
|
6
|
+
``c3.db.insert_review_decision``。
|
|
7
7
|
|
|
8
8
|
Usage:
|
|
9
9
|
python .claude/hooks/record_review_decision.py \
|
{claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/.claude/hooks/review_hint_inject.py
RENAMED
|
@@ -50,7 +50,6 @@ CHECKLIST_ID_RE = re.compile(r"\[((?:CR|SR)-[A-Z]+-\d{3,})\]")
|
|
|
50
50
|
def _ensure_c3_db_path_in_sys_path() -> None:
|
|
51
51
|
"""c3.db を import 可能にする。
|
|
52
52
|
|
|
53
|
-
v1.11.0 で parallel_orchestra.c3_db から c3.db に物理移動した。
|
|
54
53
|
c3 パッケージは pip install 済みのため sys.path 操作は不要。
|
|
55
54
|
関数自体は後方互換のため残置(呼び出し側のテストが参照する場合がある)。
|
|
56
55
|
"""
|
|
@@ -11,6 +11,14 @@
|
|
|
11
11
|
-- にマイグレーション処理を追加すること(CREATE TABLE IF NOT EXISTS だけで
|
|
12
12
|
-- 表現できない変更が必要になった場合の備え)。
|
|
13
13
|
|
|
14
|
+
-- ---------------------------------------------------------------------------
|
|
15
|
+
-- v2.0.0 マイグレーション: PO(Parallel Orchestra)廃止に伴うテーブル削除
|
|
16
|
+
-- ---------------------------------------------------------------------------
|
|
17
|
+
-- v1.x で作成された po_results / po_status テーブルは v2.0.0 で不要になった。
|
|
18
|
+
-- 利用先 DB から削除する。テーブル不在でもエラーにしない。
|
|
19
|
+
DROP TABLE IF EXISTS po_results;
|
|
20
|
+
DROP TABLE IF EXISTS po_status;
|
|
21
|
+
|
|
14
22
|
-- ---------------------------------------------------------------------------
|
|
15
23
|
-- F-009 自身: スキーマバージョン管理
|
|
16
24
|
-- ---------------------------------------------------------------------------
|
|
@@ -42,41 +50,6 @@ CREATE INDEX IF NOT EXISTS idx_review_decisions_checklist
|
|
|
42
50
|
|
|
43
51
|
-- ---------------------------------------------------------------------------
|
|
44
52
|
-- F-002: PO 集約レイヤ
|
|
45
|
-
-- ---------------------------------------------------------------------------
|
|
46
|
-
-- Parallel Orchestra の各 worktree の完了結果を集約する。
|
|
47
|
-
-- 親 Claude が SELECT で結果を集約できるようにする。
|
|
48
|
-
|
|
49
|
-
CREATE TABLE IF NOT EXISTS po_results (
|
|
50
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
51
|
-
session_id TEXT NOT NULL,
|
|
52
|
-
worktree_id TEXT NOT NULL,
|
|
53
|
-
task_id TEXT NOT NULL,
|
|
54
|
-
status TEXT NOT NULL, -- 'success' | 'failure' | 'cancelled'
|
|
55
|
-
started_at TEXT, -- ISO8601
|
|
56
|
-
completed_at TEXT, -- ISO8601
|
|
57
|
-
output_summary TEXT,
|
|
58
|
-
error_message TEXT,
|
|
59
|
-
UNIQUE(session_id, worktree_id, task_id)
|
|
60
|
-
);
|
|
61
|
-
CREATE INDEX IF NOT EXISTS idx_po_results_session
|
|
62
|
-
ON po_results(session_id, completed_at DESC);
|
|
63
|
-
|
|
64
|
-
-- ---------------------------------------------------------------------------
|
|
65
|
-
-- F-003: PO 並列処理の状況可視化
|
|
66
|
-
-- ---------------------------------------------------------------------------
|
|
67
|
-
-- 各 worktree の現在状況を heartbeat で記録する。親 Claude は SELECT で
|
|
68
|
-
-- 並列処理の進捗を確認できる。
|
|
69
|
-
|
|
70
|
-
CREATE TABLE IF NOT EXISTS po_status (
|
|
71
|
-
session_id TEXT NOT NULL,
|
|
72
|
-
worktree_id TEXT NOT NULL,
|
|
73
|
-
state TEXT NOT NULL, -- 'starting' | 'running' | 'completed' | 'failed'
|
|
74
|
-
current_step TEXT,
|
|
75
|
-
progress_pct INTEGER,
|
|
76
|
-
last_heartbeat TEXT NOT NULL, -- ISO8601
|
|
77
|
-
PRIMARY KEY (session_id, worktree_id)
|
|
78
|
-
);
|
|
79
|
-
|
|
80
53
|
-- ---------------------------------------------------------------------------
|
|
81
54
|
-- F-005: Tier 自動ルーティング(Thompson Sampling 学習データ)
|
|
82
55
|
-- ---------------------------------------------------------------------------
|
|
@@ -252,8 +252,7 @@ def maybe_escalate(
|
|
|
252
252
|
return chosen_tier, None
|
|
253
253
|
|
|
254
254
|
if failure_rate_fn is None:
|
|
255
|
-
# 既定の DB
|
|
256
|
-
# parallel_orchestra.c3_db、いずれも shim で透過的に解決される)。
|
|
255
|
+
# 既定の DB ヘルパーを呼ぶ。
|
|
257
256
|
c3_db = _load_c3_db_module()
|
|
258
257
|
if c3_db is None:
|
|
259
258
|
return chosen_tier, None
|
|
@@ -357,7 +356,6 @@ def build_additional_context(
|
|
|
357
356
|
def _load_c3_db_module():
|
|
358
357
|
"""c3.db helper モジュールを返す。
|
|
359
358
|
|
|
360
|
-
v1.11.0 で parallel_orchestra.c3_db から c3.db に物理移動した。
|
|
361
359
|
c3 パッケージは pip install 済みのため sys.path 操作は不要。
|
|
362
360
|
"""
|
|
363
361
|
try:
|
|
@@ -149,7 +149,7 @@ def _run_enable_sandbox() -> None:
|
|
|
149
149
|
|
|
150
150
|
# 現行スキーマバージョン。schema.sql に破壊的変更を入れたら +1 して
|
|
151
151
|
# マイグレーションロジックを apply_schema() に追加する。
|
|
152
|
-
SCHEMA_VERSION =
|
|
152
|
+
SCHEMA_VERSION = 3 # v2.0.0 で PO 廃止に伴い po_results / po_status を削除
|
|
153
153
|
|
|
154
154
|
_HOOKS_DIR = os.path.dirname(os.path.abspath(__file__))
|
|
155
155
|
_CLAUDE_DIR = os.path.dirname(_HOOKS_DIR)
|
|
@@ -174,64 +174,12 @@ def _append_log(record: dict) -> None:
|
|
|
174
174
|
print(f'[subagent_log] ログ追記に失敗しました: {e}', file=sys.stderr)
|
|
175
175
|
|
|
176
176
|
|
|
177
|
-
def _maybe_upsert_po_status(payload: dict) -> None:
|
|
178
|
-
"""F-002 Phase 2-B: worktree 内 Claude のサブエージェント停止時に po_status を更新。
|
|
179
|
-
|
|
180
|
-
``C3_PO_WORKTREE_ID`` 環境変数が設定されているとき(= 親 runner が
|
|
181
|
-
PO の worktree として spawn した子 Claude プロセス内の subagent 実行)
|
|
182
|
-
のみ動作し、SubagentStop の status を見て completed / failed を UPSERT する。
|
|
183
|
-
親 Claude セッション(環境変数なし)では完全に no-op で副作用ゼロ。
|
|
184
|
-
|
|
185
|
-
全例外は内部で catch する(subagent_log の本体機能を止めないため)。
|
|
186
|
-
"""
|
|
187
|
-
worktree_id = os.environ.get('C3_PO_WORKTREE_ID')
|
|
188
|
-
session_id = os.environ.get('C3_PO_SESSION_ID')
|
|
189
|
-
if not worktree_id or not session_id:
|
|
190
|
-
return
|
|
191
|
-
|
|
192
|
-
event_name = payload.get('hook_event_name', '')
|
|
193
|
-
if event_name not in (_EVENT_START, _EVENT_STOP):
|
|
194
|
-
return
|
|
195
|
-
|
|
196
|
-
if event_name == _EVENT_START:
|
|
197
|
-
state = 'running'
|
|
198
|
-
else: # SubagentStop
|
|
199
|
-
# status='success' なら completed、それ以外('error' / 'failure' 等)は failed
|
|
200
|
-
status = (payload.get('status') or '').lower()
|
|
201
|
-
state = 'completed' if status == _STATUS_SUCCESS else 'failed'
|
|
202
|
-
|
|
203
|
-
# current_step は payload 由来の任意文字列なので長さを制限する [SR-V-001]。
|
|
204
|
-
# stdin の 1MB 制限と組み合わせて DB 容量保護。
|
|
205
|
-
raw_step = payload.get('agent_type') or payload.get('agent_id') or ''
|
|
206
|
-
current_step = raw_step[:_MAX_CURRENT_STEP_LEN] if raw_step else None
|
|
207
|
-
|
|
208
|
-
try:
|
|
209
|
-
# v1.11.0 で parallel_orchestra.c3_db から c3.db に物理移動した。
|
|
210
|
-
# c3 パッケージは pip install 済みのため sys.path 操作は不要。
|
|
211
|
-
from c3.db import upsert_po_status # noqa: PLC0415
|
|
212
|
-
|
|
213
|
-
upsert_po_status(
|
|
214
|
-
session_id=session_id,
|
|
215
|
-
worktree_id=worktree_id,
|
|
216
|
-
state=state,
|
|
217
|
-
current_step=current_step,
|
|
218
|
-
)
|
|
219
|
-
except Exception as e: # noqa: BLE001
|
|
220
|
-
print(
|
|
221
|
-
f'[subagent_log] po_status UPSERT skipped: {e}',
|
|
222
|
-
file=sys.stderr,
|
|
223
|
-
)
|
|
224
|
-
|
|
225
|
-
|
|
226
177
|
def main() -> int:
|
|
227
178
|
"""stdin から JSON を読み込み、サニタイズして LOG_FILE に追記する。
|
|
228
179
|
|
|
229
180
|
SubagentStop イベントの場合は同 session_id + agent_id の最古未消費 Start を
|
|
230
181
|
検索して duration_seconds / matched_start_ts を付加する。
|
|
231
182
|
stdin の IOError・JSON パースエラーを含む全例外を catch して 0 を返す。
|
|
232
|
-
|
|
233
|
-
F-002 Phase 2-B: ``C3_PO_WORKTREE_ID`` 環境変数があるときのみ追加で
|
|
234
|
-
c3.db.po_status に状態を UPSERT する(親 Claude セッションでは no-op)。
|
|
235
183
|
"""
|
|
236
184
|
try:
|
|
237
185
|
raw = sys.stdin.read(_MAX_STDIN_BYTES + 1)
|
|
@@ -272,9 +220,6 @@ def main() -> int:
|
|
|
272
220
|
|
|
273
221
|
_append_log(record)
|
|
274
222
|
|
|
275
|
-
# F-002 Phase 2-B: worktree 内 spawn の場合のみ po_status を UPSERT。
|
|
276
|
-
_maybe_upsert_po_status(payload)
|
|
277
|
-
|
|
278
223
|
return 0
|
|
279
224
|
|
|
280
225
|
|
{claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/.claude/hooks/worktree_guard.py
RENAMED
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
"""PreToolUse hook: worktree boundary guardrail.
|
|
3
3
|
|
|
4
4
|
PO_WORKTREE_GUARD=1 が設定されている場合のみ動作する。
|
|
5
|
-
|
|
5
|
+
worktree 内で実装タスクを実行するワークフロー(tdd-develop など)が
|
|
6
|
+
事前にこの env を設定して有効化する。
|
|
6
7
|
Write / Edit ツールの対象パスが CWD(worktree ルート)外であればブロックする。
|
|
7
8
|
"""
|
|
8
9
|
|
{claude_code_conductor-1.13.0 → claude_code_conductor-2.0.0}/.claude/skills/parallel-agents/SKILL.md
RENAMED
|
@@ -47,26 +47,25 @@ planner エージェントが plan-report を生成する時点で「tdd-develop
|
|
|
47
47
|
|
|
48
48
|
1. Glob で `.claude/reports/plan-report-*.md` の最新ファイルパスを取得
|
|
49
49
|
2. Read で内容(フロントマター含む)を確認
|
|
50
|
-
3. Bash
|
|
50
|
+
3. Bash で以下を実行する:
|
|
51
51
|
|
|
52
52
|
```
|
|
53
|
-
c3
|
|
53
|
+
c3 plan validate <plan-report-path>
|
|
54
54
|
```
|
|
55
55
|
|
|
56
56
|
| exit | 意味 | 次のアクション |
|
|
57
57
|
|---|---|---|
|
|
58
58
|
| `0` | マニフェスト妥当 | Step 1 へ |
|
|
59
|
-
| `2` |
|
|
60
|
-
| `3` | 環境エラー | stderr を提示してスキル終了 |
|
|
59
|
+
| `2` | フロントマター不正・agent ファイル不在・循環依存等 | stderr を整形して提示、`/start` フェーズ C 再実行を案内、スキル終了 |
|
|
61
60
|
|
|
62
61
|
---
|
|
63
62
|
|
|
64
63
|
## Step 1: wave 分解
|
|
65
64
|
|
|
66
|
-
Bash
|
|
65
|
+
Bash で以下を実行する:
|
|
67
66
|
|
|
68
67
|
```
|
|
69
|
-
c3
|
|
68
|
+
c3 plan waves <plan-report-path>
|
|
70
69
|
```
|
|
71
70
|
|
|
72
71
|
stdout の JSON 形式:
|
|
@@ -282,9 +281,10 @@ checkpoint の summary には KEEP ルール(設計判断・決定事項・解
|
|
|
282
281
|
|
|
283
282
|
---
|
|
284
283
|
|
|
285
|
-
## PO 廃止移行期の注意(v1.12.0〜
|
|
284
|
+
## PO 廃止移行期の注意(v1.12.0〜v2.0.0)
|
|
286
285
|
|
|
287
|
-
- 本 skill は v1.12.0
|
|
288
|
-
- v1.
|
|
289
|
-
-
|
|
286
|
+
- 本 skill は v1.12.0 で導入された
|
|
287
|
+
- v1.13.0 で `po-status` skill / `c3 status` CLI を削除
|
|
288
|
+
- **v1.14.0 で `c3 po` CLI と `wave-execution` skill を削除し、Step 0/1 で `c3 plan validate` / `c3 plan waves`(純粋な YAML 検証 + DAG 分解、PO 非依存)に切り替えた**
|
|
289
|
+
- v2.0.0 で `parallel_orchestra` パッケージ本体を削除(互換破壊)
|
|
290
290
|
- 詳細計画: `~/.claude/plans/atomic-foraging-sprout.md`
|
|
@@ -1,5 +1,174 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [2.0.0] - 2026-05-12
|
|
4
|
+
|
|
5
|
+
### 概要(互換破壊リリース)
|
|
6
|
+
|
|
7
|
+
PO(Parallel Orchestra)段階的廃止計画の **Step 5(最終)**。`parallel_orchestra` パッケージ本体を削除し、PO 関連の全アセット(hook / docs / DB テーブル定義 / console script / planner ドキュメント言及)を取り除いた。
|
|
8
|
+
|
|
9
|
+
**本リリースは v1.x との互換性を保証しない**。v1.x で `parallel-orchestra` console script や `from parallel_orchestra import ...` を直接使っていた外部コードは動作しなくなる。利用先テンプレートからも PO 関連スキル・hook が消える。
|
|
10
|
+
|
|
11
|
+
### 廃止計画 全体サマリ
|
|
12
|
+
|
|
13
|
+
| Step | Version | 内容 |
|
|
14
|
+
|---|---|---|
|
|
15
|
+
| 1 | v1.11.0 | `parallel_orchestra.c3_db` を `c3.db` に物理移動(非破壊) |
|
|
16
|
+
| 1.5 | v1.11.1 | `docs/codex対応/` 配布除外 hotfix |
|
|
17
|
+
| 2 | v1.12.0 | 新 skill `parallel-agents` 追加、`develop` 参照先切替、`wave-execution` deprecated 化 |
|
|
18
|
+
| 3 | v1.13.0 | `po-status` skill / `c3 status` CLI 削除 |
|
|
19
|
+
| 4 | v1.14.0 | `c3 po` CLI / `src/c3/po/` / `wave-execution` skill 削除、`c3 plan` 新設 |
|
|
20
|
+
| **5** | **v2.0.0** | **`parallel_orchestra` パッケージ削除、関連アセット全削除** |
|
|
21
|
+
|
|
22
|
+
廃止の根拠は 2026-05-11 の PoC で「並列 subagent 起動時の permission チェッカー race」(前身 Clade v1.19.0 で発見、PO 導入の主因)が Claude Code 本体で構造的に修正されたことを確認したこと(15 並列・101 tool 呼び出しで失敗 0 件)。詳細は `feedback_parallel_subagent_race_resolved.md` を参照。
|
|
23
|
+
|
|
24
|
+
### 削除(互換破壊)
|
|
25
|
+
|
|
26
|
+
#### Python パッケージ
|
|
27
|
+
| パス | LOC | 用途 |
|
|
28
|
+
|---|---|---|
|
|
29
|
+
| `src/parallel_orchestra/__init__.py` / `_exceptions.py` / `cli.py` / `manifest.py` / `report.py` / `runner.py` | ~3,000 | PO 本体(runner / heartbeat / auto-merge / dashboard 含む) |
|
|
30
|
+
| `tests/parallel_orchestra/` (16 ファイル) | ~2,000 | PO 単体テスト |
|
|
31
|
+
|
|
32
|
+
#### console script
|
|
33
|
+
- `parallel-orchestra = "parallel_orchestra.cli:main"` を `pyproject.toml` から削除
|
|
34
|
+
|
|
35
|
+
#### Hook / Docs
|
|
36
|
+
| パス | 理由 |
|
|
37
|
+
|---|---|
|
|
38
|
+
| `.claude/hooks/po_heartbeat.py` | PO 進捗 heartbeat hook(PO 廃止により呼び出し元消失) |
|
|
39
|
+
| `.claude/docs/parallel-orchestra-manifest.md` / `po-worktree-writes.md` | PO 仕様ドキュメント |
|
|
40
|
+
|
|
41
|
+
#### DB スキーマ
|
|
42
|
+
| 対象 | 変更 |
|
|
43
|
+
|---|---|
|
|
44
|
+
| `po_results` / `po_status` テーブル | `schema.sql` から CREATE 文を削除し、`DROP TABLE IF EXISTS` マイグレーションを追加。利用先で次回 session-start hook 実行時に自動 DROP |
|
|
45
|
+
| `SCHEMA_VERSION` | 2 → 3 にバンプ |
|
|
46
|
+
|
|
47
|
+
#### コード内 PO 連動コード
|
|
48
|
+
| ファイル | 削除内容 |
|
|
49
|
+
|---|---|
|
|
50
|
+
| `src/c3/db.py` | `_task_status_str` / `record_task_results` / `_PO_STATUS_VALID_STATES` / `upsert_po_status` / `fetch_po_status` / `fetch_po_results` を削除(PO 専用ヘルパー)。`TYPE_CHECKING` の `from parallel_orchestra.runner import TaskResult` も削除 |
|
|
51
|
+
| `src/c3/cli_doctor.py` | `_check_po()` 関数および `c3 doctor --check po-only` オプション削除。`parallel-orchestra` チェック行が doctor 出力から消える |
|
|
52
|
+
| `.claude/hooks/subagent_log.py` | `_maybe_upsert_po_status()` 関数および main() からの呼び出し削除。`C3_PO_WORKTREE_ID` / `C3_PO_SESSION_ID` の env 連動を削除 |
|
|
53
|
+
|
|
54
|
+
#### ドキュメント / hook の文言整理
|
|
55
|
+
- `.claude/agents/planner.md`: PO 言及を `parallel-agents` skill 向けに全面書き換え、`c3 po dry-run` → `c3 plan validate`、`_check_writes_conflicts` 言及を除去、**depth 1 制限の注意(tdd-develop を含む wave は 1 タスク推奨)を追記**
|
|
56
|
+
- `.claude/hooks/worktree_guard.py`: docstring から PO 言及削除(hook 自体は TDD ワークフロー用に残置)
|
|
57
|
+
- `.claude/hooks/select_tier.py` / `record_tier_outcome.py` / `record_review_decision.py` / `review_hint_inject.py`: docstring の旧 import 移行履歴コメントを整理
|
|
58
|
+
|
|
59
|
+
### 環境変数の rename
|
|
60
|
+
|
|
61
|
+
`locate_c3_db()` の探索順序が変更:
|
|
62
|
+
1. `C3_DB_PATH` (新規、v2.0.0 で導入)
|
|
63
|
+
2. `C3_PO_DB_PATH` (旧名、deprecated 警告付きで継続サポート)
|
|
64
|
+
3. cwd 上方向探索
|
|
65
|
+
|
|
66
|
+
`C3_PO_DB_PATH` は次の major バージョンで削除予定。新規利用は `C3_DB_PATH` を使うこと。
|
|
67
|
+
|
|
68
|
+
### 移行ガイド
|
|
69
|
+
|
|
70
|
+
#### v1.x 利用者向け
|
|
71
|
+
|
|
72
|
+
1. **pip パッケージ**: `pip install --upgrade claude-code-conductor` で v2.0.0 に上げると `parallel-orchestra` console script が site-packages から消える。`parallel-orchestra` を直接呼んでいたシェルスクリプト・CI ジョブは廃止か `claude` 直叩きに書き換え
|
|
73
|
+
2. **Python import**: `from parallel_orchestra import ...` / `from parallel_orchestra.c3_db import ...` を使っていれば `from c3.db import ...` に書き換え(v1.11.0 で shim 化、v2.0.0 で shim も削除)
|
|
74
|
+
3. **C3 利用先テンプレート**: `c3 update` で利用先環境のスキル・hook が v2.0.0 ベースに更新される。`po-status` / `wave-execution` skill は消え、`parallel-agents` が並列実装の単一窓口になる
|
|
75
|
+
4. **DB**: `c3.db` の `po_results` / `po_status` テーブルは次回セッション開始時に自動 DROP される(`session_start.py` の `apply_schema` 経由)。データ参照が必要なら事前にエクスポートしておくこと
|
|
76
|
+
5. **env 変数**: `C3_PO_DB_PATH` は使い続けられるが、v3.0.0 で削除予定。`C3_DB_PATH` への移行を推奨
|
|
77
|
+
|
|
78
|
+
### 検証
|
|
79
|
+
|
|
80
|
+
- `pytest tests/` 全体: **581 passed / 2 skipped**(v1.14.0 の 830 から `tests/parallel_orchestra/` 削除分の純減)
|
|
81
|
+
- `c3 doctor` exit 0、出力から `parallel-orchestra` 行が消滅
|
|
82
|
+
- `c3 plan validate` / `c3 plan waves` 正常動作(v1.14.0 で新設、PO 非依存)
|
|
83
|
+
- `c3 po` → `invalid choice` で失敗(v1.14.0 と同じ)
|
|
84
|
+
- wheel **74 entries**(v1.14.0 の 84 から -10)
|
|
85
|
+
- wheel 内に `parallel_orchestra` / `wave-execution` / `po-status` / `cli_po` のエントリ 0 件
|
|
86
|
+
- wheel の console scripts は `c3` のみ
|
|
87
|
+
|
|
88
|
+
### LTS について
|
|
89
|
+
|
|
90
|
+
v1.14.x は v2.0.0 リリース後も **最低 1 ヶ月の LTS 期間** を設定する。v1.x からの移行に時間が必要な利用者は `pip install "claude-code-conductor>=1.14,<2"` で固定可能。
|
|
91
|
+
|
|
92
|
+
### 参考
|
|
93
|
+
|
|
94
|
+
- 廃止計画: `~/.claude/plans/atomic-foraging-sprout.md`
|
|
95
|
+
- PoC 結果メモリ: `feedback_parallel_subagent_race_resolved.md`
|
|
96
|
+
- セマンティックバージョニング: 互換破壊リリースのため MAJOR 版(v1.x → v2.0.0)
|
|
97
|
+
|
|
98
|
+
---
|
|
99
|
+
|
|
100
|
+
## [1.14.0] - 2026-05-12
|
|
101
|
+
|
|
102
|
+
### 概要
|
|
103
|
+
|
|
104
|
+
PO(Parallel Orchestra)段階的廃止計画の **Step 4**。`c3 po` CLI と `wave-execution` skill を削除し、`parallel-agents` skill から PO への依存を断ち切った。新 CLI `c3 plan validate` / `c3 plan waves` を導入し、`parallel-agents` skill の Step 0/1 を `c3 po dry-run` / `c3 po waves` から `c3 plan validate` / `c3 plan waves` へ切り替えた。
|
|
105
|
+
|
|
106
|
+
これにより並列実装機能は **PO の Python パッケージに一切依存しない** 状態になった。`parallel_orchestra` パッケージ本体は v2.0.0 まで残置されるが、`develop` / `parallel-agents` skill の実行経路からは完全に外れた。
|
|
107
|
+
|
|
108
|
+
### 追加
|
|
109
|
+
|
|
110
|
+
| パス | 役割 |
|
|
111
|
+
|---|---|
|
|
112
|
+
| `src/c3/plan_validator.py` | plan-report YAML 検証 + DAG 分解の純粋関数(`extract_frontmatter` / `compute_waves` / `validate_plan_report` / `split_waves`)。`parallel_orchestra` 非依存 |
|
|
113
|
+
| `src/c3/cli_plan.py` | `c3 plan validate <path>` / `c3 plan waves <path>` サブコマンド |
|
|
114
|
+
| `tests/test_plan_validator.py` | 上記モジュールの単体テスト(20 ケース) |
|
|
115
|
+
| `tests/test_cli_plan.py` | 新 CLI の動作テスト(6 ケース) |
|
|
116
|
+
|
|
117
|
+
### 削除
|
|
118
|
+
|
|
119
|
+
| パス | 理由 |
|
|
120
|
+
|---|---|
|
|
121
|
+
| `src/c3/po/__init__.py` / `manifest.py` / `run.py` (合計 414 LOC) | C3 → PO の薄いラッパー層。`plan_validator.py` が機能を引き継ぐ |
|
|
122
|
+
| `src/c3/cli_po.py` (184 LOC) | `c3 po` サブコマンド。`cli_plan.py` で置換 |
|
|
123
|
+
| `.claude/skills/wave-execution/SKILL.md` | v1.12.0 で deprecated 化されていた旧並列実行 skill。`parallel-agents` skill で完全置換 |
|
|
124
|
+
| `tests/test_cli_po*.py` / `test_po_*.py` / `test_manifest_fixes.py` / `test_manifest_yaml_escape.py` (7 ファイル) | 削除されたモジュールのテスト |
|
|
125
|
+
|
|
126
|
+
### 変更
|
|
127
|
+
|
|
128
|
+
| パス | 内容 |
|
|
129
|
+
|---|---|
|
|
130
|
+
| `src/c3/cli.py` | `cli_po` の import / `register(sub)` を解除、代わりに `cli_plan` を追加。サブコマンド `po` が消え `plan` が追加 |
|
|
131
|
+
| `.claude/skills/parallel-agents/SKILL.md` | Step 0/1 を `c3 po dry-run` / `c3 po waves` から `c3 plan validate` / `c3 plan waves` に切り替え。移行期注意セクションも v1.14.0 完了状態に更新 |
|
|
132
|
+
|
|
133
|
+
### 移行ガイド
|
|
134
|
+
|
|
135
|
+
**旧コマンドからの移行:**
|
|
136
|
+
| 旧 (v1.13.x まで) | 新 (v1.14.0+) |
|
|
137
|
+
|---|---|
|
|
138
|
+
| `c3 po dry-run <plan-report>` | `c3 plan validate <plan-report>` |
|
|
139
|
+
| `c3 po waves <plan-report>` | `c3 plan waves <plan-report>` |
|
|
140
|
+
| `c3 po run <manifest>` | (直接代替なし。`parallel-agents` skill 経由で親 Claude が並列起動) |
|
|
141
|
+
| `c3 po run-wave <manifest> --wave-index N` | (同上) |
|
|
142
|
+
|
|
143
|
+
`c3 po` を呼び出していたスクリプト / hook / skill がある場合は `c3 plan` に書き換えること。本 リリースから `c3 po` は `invalid choice` で失敗する。
|
|
144
|
+
|
|
145
|
+
### 影響範囲
|
|
146
|
+
|
|
147
|
+
- `parallel-agents` skill: PO 非依存になり、`c3 plan` 経由で動作(並列起動・worktree 隔離・一括コミットの中核ロジックは変更なし)
|
|
148
|
+
- 利用先テンプレート (`c3 init` / `c3 update`): `wave-execution/SKILL.md` が消え、`c3 po` サブコマンドが廃止
|
|
149
|
+
- `parallel_orchestra` パッケージ本体: 影響なし。`c3.db` 経由で読み書きは継続動作(v2.0.0 で削除)
|
|
150
|
+
- F-001 (review_decisions) / F-005 (tier_bandit) / F-008 (agent_runs): 影響なし
|
|
151
|
+
|
|
152
|
+
### 検証
|
|
153
|
+
|
|
154
|
+
- `pytest tests/` 全体: **830 passed / 3 skipped**(v1.13.0 の 880 - 旧 PO テスト 76 件 + 新規 plan_validator/cli_plan テスト 26 件)
|
|
155
|
+
- `c3 plan validate` 動作確認: 正常 → exit 0、agent file 不在 → exit 2 で `task 't1': agent ... not found` エラー
|
|
156
|
+
- `c3 plan waves` 動作確認: 2-task plan-report で 2-wave JSON 出力
|
|
157
|
+
- `c3 po` 動作確認: `invalid choice: 'po' (choose from 'init', 'update', 'list-agents', 'list-skills', 'list-commands', 'doctor', 'plan', 'tier')`
|
|
158
|
+
- `c3 doctor` exit 0
|
|
159
|
+
|
|
160
|
+
### 次のステップ
|
|
161
|
+
|
|
162
|
+
- **Step 5 (v2.0.0)**: `parallel_orchestra` パッケージ本体の削除(互換破壊)。`pyproject.toml` の `parallel-orchestra` console script・wheel package 解除、`po_results` / `po_status` テーブル DROP、`.claude/docs/parallel-orchestra-manifest.md` / `po-worktree-writes.md` 削除、`planner.md` の PO 言及を `parallel-agents` 向けに最終調整
|
|
163
|
+
- v1.14.x を最低 1 ヶ月 LTS として維持してから v2.0.0 へ移行
|
|
164
|
+
|
|
165
|
+
### 参考
|
|
166
|
+
|
|
167
|
+
- 廃止計画: `~/.claude/plans/atomic-foraging-sprout.md`
|
|
168
|
+
- PoC 結果: `~/.claude/projects/.../memory/feedback_parallel_subagent_race_resolved.md`
|
|
169
|
+
|
|
170
|
+
---
|
|
171
|
+
|
|
3
172
|
## [1.13.0] - 2026-05-11
|
|
4
173
|
|
|
5
174
|
### 概要
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: claude-code-conductor
|
|
3
|
-
Version:
|
|
3
|
+
Version: 2.0.0
|
|
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
|
|
@@ -30,7 +30,6 @@ dependencies = [
|
|
|
30
30
|
|
|
31
31
|
[project.scripts]
|
|
32
32
|
c3 = "c3.cli:main"
|
|
33
|
-
parallel-orchestra = "parallel_orchestra.cli:main"
|
|
34
33
|
|
|
35
34
|
[project.urls]
|
|
36
35
|
Homepage = "https://github.com/satoh-y-0323/claude-code-conductor"
|
|
@@ -43,7 +42,7 @@ path = "src/c3/__init__.py"
|
|
|
43
42
|
path = "hatch_build.py"
|
|
44
43
|
|
|
45
44
|
[tool.hatch.build.targets.wheel]
|
|
46
|
-
packages = ["src/c3"
|
|
45
|
+
packages = ["src/c3"]
|
|
47
46
|
|
|
48
47
|
[tool.hatch.build.targets.wheel.force-include]
|
|
49
48
|
"src/c3/_template" = "c3/_template"
|
|
@@ -51,7 +50,6 @@ packages = ["src/c3", "src/parallel_orchestra"]
|
|
|
51
50
|
[tool.hatch.build.targets.sdist]
|
|
52
51
|
include = [
|
|
53
52
|
"src/c3",
|
|
54
|
-
"src/parallel_orchestra",
|
|
55
53
|
"tests",
|
|
56
54
|
"hatch_build.py",
|
|
57
55
|
".claude",
|
|
@@ -12,7 +12,7 @@ import argparse
|
|
|
12
12
|
import sys
|
|
13
13
|
|
|
14
14
|
from c3 import __version__
|
|
15
|
-
from c3 import cli_doctor, cli_init, cli_list,
|
|
15
|
+
from c3 import cli_doctor, cli_init, cli_list, cli_plan, cli_tier, cli_update
|
|
16
16
|
|
|
17
17
|
|
|
18
18
|
def build_parser() -> argparse.ArgumentParser:
|
|
@@ -32,7 +32,7 @@ def build_parser() -> argparse.ArgumentParser:
|
|
|
32
32
|
cli_update.register(sub)
|
|
33
33
|
cli_list.register(sub)
|
|
34
34
|
cli_doctor.register(sub)
|
|
35
|
-
|
|
35
|
+
cli_plan.register(sub)
|
|
36
36
|
cli_tier.register(sub)
|
|
37
37
|
|
|
38
38
|
return parser
|
|
@@ -20,12 +20,6 @@ def register(subparsers: argparse._SubParsersAction) -> None:
|
|
|
20
20
|
"doctor",
|
|
21
21
|
help="Run diagnostics on the local C3 setup",
|
|
22
22
|
)
|
|
23
|
-
parser.add_argument(
|
|
24
|
-
"--check",
|
|
25
|
-
choices=["all", "po-only"],
|
|
26
|
-
default="all",
|
|
27
|
-
help="Limit checks to a subset (default: all)",
|
|
28
|
-
)
|
|
29
23
|
parser.add_argument(
|
|
30
24
|
"--quiet",
|
|
31
25
|
action="store_true",
|
|
@@ -38,13 +32,9 @@ def handle(args: argparse.Namespace) -> int:
|
|
|
38
32
|
color = _supports_color()
|
|
39
33
|
findings: list[tuple[str, str, str]] = [] # (status, label, detail)
|
|
40
34
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
findings.append(_check_claude_dir())
|
|
45
|
-
findings.append(_check_settings_json())
|
|
46
|
-
findings.append(_check_claude_binary())
|
|
47
|
-
findings.append(_check_po())
|
|
35
|
+
findings.append(_check_claude_dir())
|
|
36
|
+
findings.append(_check_settings_json())
|
|
37
|
+
findings.append(_check_claude_binary())
|
|
48
38
|
|
|
49
39
|
exit_code = 0
|
|
50
40
|
for status, label, detail in findings:
|
|
@@ -88,20 +78,11 @@ def _check_claude_binary() -> tuple[str, str, str]:
|
|
|
88
78
|
return (
|
|
89
79
|
_WARN,
|
|
90
80
|
"claude binary",
|
|
91
|
-
"not on PATH; install Claude Code CLI before
|
|
81
|
+
"not on PATH; install Claude Code CLI before invoking c3 skills",
|
|
92
82
|
)
|
|
93
83
|
return _OK, "claude binary", path
|
|
94
84
|
|
|
95
85
|
|
|
96
|
-
def _check_po() -> tuple[str, str, str]:
|
|
97
|
-
try:
|
|
98
|
-
import parallel_orchestra # type: ignore[import-not-found]
|
|
99
|
-
except ImportError as exc:
|
|
100
|
-
return _ERR, "parallel-orchestra", f"bundled package failed to import: {exc}"
|
|
101
|
-
ver = getattr(parallel_orchestra, "__version__", "unknown")
|
|
102
|
-
return _OK, "parallel-orchestra", f"{ver} (bundled)"
|
|
103
|
-
|
|
104
|
-
|
|
105
86
|
def _format(status: str, label: str, detail: str, *, color: bool) -> str:
|
|
106
87
|
icon = {
|
|
107
88
|
_OK: "[OK]",
|