claude-code-conductor 2.3.0__tar.gz → 2.5.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.
Files changed (134) hide show
  1. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/.claude/CLAUDE.md +12 -0
  2. claude_code_conductor-2.5.0/.claude/docs/platform-adapters.md +167 -0
  3. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/.claude/docs/settings.json.md +19 -0
  4. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/.claude/hooks/statusline.py +41 -37
  5. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/.claude/skills/start/SKILL.md +4 -2
  6. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/.claude/skills/task-routing/SKILL.md +10 -8
  7. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/.gitignore +8 -0
  8. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/CHANGELOG.md +114 -0
  9. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/PKG-INFO +19 -6
  10. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/README.md +16 -3
  11. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/pyproject.toml +2 -2
  12. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/src/c3/__init__.py +1 -1
  13. claude_code_conductor-2.5.0/src/c3/adapters.py +389 -0
  14. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/src/c3/cli.py +2 -1
  15. claude_code_conductor-2.5.0/src/c3/cli_ask.py +60 -0
  16. claude_code_conductor-2.5.0/src/c3/cli_doctor.py +162 -0
  17. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/src/c3/cli_init.py +28 -4
  18. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/src/c3/cli_update.py +48 -20
  19. claude_code_conductor-2.5.0/src/c3/mcp_server.py +282 -0
  20. claude_code_conductor-2.5.0/src/c3/platforms.py +17 -0
  21. claude_code_conductor-2.5.0/src/c3/question.py +415 -0
  22. claude_code_conductor-2.5.0/tests/test_adapters.py +276 -0
  23. claude_code_conductor-2.5.0/tests/test_cli_ask.py +280 -0
  24. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/tests/test_cli_init.py +85 -4
  25. claude_code_conductor-2.3.0/src/c3/cli_doctor.py +0 -99
  26. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/.claude/agents/architect.md +0 -0
  27. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/.claude/agents/code-reviewer.md +0 -0
  28. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/.claude/agents/developer.md +0 -0
  29. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/.claude/agents/doc-writer.md +0 -0
  30. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/.claude/agents/interviewer.md +0 -0
  31. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/.claude/agents/planner.md +0 -0
  32. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/.claude/agents/project-setup.md +0 -0
  33. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/.claude/agents/security-reviewer.md +0 -0
  34. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/.claude/agents/systematic-debugger.md +0 -0
  35. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/.claude/agents/tester.md +0 -0
  36. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/.claude/agents/wt_developer.md +0 -0
  37. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/.claude/agents/wt_systematic-debugger.md +0 -0
  38. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/.claude/agents/wt_tester.md +0 -0
  39. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/.claude/hooks/consolidate_memory.py +0 -0
  40. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/.claude/hooks/permission_handler.py +0 -0
  41. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/.claude/hooks/post_tool.py +0 -0
  42. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/.claude/hooks/pre_compact.py +0 -0
  43. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/.claude/hooks/pre_tool.py +0 -0
  44. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/.claude/hooks/record_review_decision.py +0 -0
  45. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/.claude/hooks/record_tier_outcome.py +0 -0
  46. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/.claude/hooks/restore_session.py +0 -0
  47. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/.claude/hooks/review_hint_inject.py +0 -0
  48. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/.claude/hooks/schema.sql +0 -0
  49. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/.claude/hooks/select_tier.py +0 -0
  50. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/.claude/hooks/session_start.py +0 -0
  51. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/.claude/hooks/session_stop.py +0 -0
  52. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/.claude/hooks/session_utils.py +0 -0
  53. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/.claude/hooks/stop.py +0 -0
  54. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/.claude/hooks/subagent_log.py +0 -0
  55. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/.claude/hooks/worktree_guard.py +0 -0
  56. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/.claude/memory/.gitkeep +0 -0
  57. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/.claude/permission_rules.json +0 -0
  58. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/.claude/rules/code-review-checklist.md +0 -0
  59. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/.claude/rules/promoted/index.md +0 -0
  60. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/.claude/rules/security-review-checklist.md +0 -0
  61. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/.claude/settings.json +0 -0
  62. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/.claude/skills/code-review/SKILL.md +0 -0
  63. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/.claude/skills/dev-workflow/SKILL.md +0 -0
  64. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/.claude/skills/develop/SKILL.md +0 -0
  65. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/.claude/skills/doc/SKILL.md +0 -0
  66. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/.claude/skills/extract-lib/SKILL.md +0 -0
  67. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/.claude/skills/init-session/SKILL.md +0 -0
  68. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/.claude/skills/mcp-config/SKILL.md +0 -0
  69. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/.claude/skills/parallel-agents/SKILL.md +0 -0
  70. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/.claude/skills/pattern-status/SKILL.md +0 -0
  71. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/.claude/skills/promote-pattern/SKILL.md +0 -0
  72. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/.claude/skills/report-timestamp/SKILL.md +0 -0
  73. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/.claude/skills/report-timestamp/scripts/get_timestamp.py +0 -0
  74. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/.claude/skills/setup/SKILL.md +0 -0
  75. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/.claude/state/.gitkeep +0 -0
  76. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/LICENSE +0 -0
  77. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/hatch_build.py +0 -0
  78. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/src/c3/__main__.py +0 -0
  79. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/src/c3/_excludes.py +0 -0
  80. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/src/c3/_terminal.py +0 -0
  81. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/src/c3/cli_list.py +0 -0
  82. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/src/c3/cli_plan.py +0 -0
  83. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/src/c3/cli_tier.py +0 -0
  84. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/src/c3/db.py +0 -0
  85. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/src/c3/paths.py +0 -0
  86. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/src/c3/plan_validator.py +0 -0
  87. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/tests/__init__.py +0 -0
  88. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/tests/conftest.py +0 -0
  89. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/tests/hooks/__init__.py +0 -0
  90. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/tests/hooks/test_consolidate_memory.py +0 -0
  91. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/tests/hooks/test_permission_handler.py +0 -0
  92. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/tests/hooks/test_pip_reinstall_reminder.py +0 -0
  93. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/tests/hooks/test_planner_check.py +0 -0
  94. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/tests/hooks/test_post_tool.py +0 -0
  95. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/tests/hooks/test_pre_tool.py +0 -0
  96. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/tests/hooks/test_record_tier_outcome.py +0 -0
  97. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/tests/hooks/test_restore_session.py +0 -0
  98. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/tests/hooks/test_review_hint_inject.py +0 -0
  99. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/tests/hooks/test_select_tier.py +0 -0
  100. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/tests/hooks/test_select_tier_escalation.py +0 -0
  101. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/tests/hooks/test_session_start.py +0 -0
  102. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/tests/hooks/test_session_stop.py +0 -0
  103. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/tests/hooks/test_session_utils.py +0 -0
  104. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/tests/hooks/test_settings_local_absolute_paths.py +0 -0
  105. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/tests/hooks/test_similarity_boost.py +0 -0
  106. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/tests/hooks/test_statusline.py +0 -0
  107. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/tests/hooks/test_statusline_template_sync.py +0 -0
  108. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/tests/hooks/test_subagent_log.py +0 -0
  109. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/tests/hooks/test_sync_check.py +0 -0
  110. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/tests/hooks/test_template_guard.py +0 -0
  111. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/tests/skills/__init__.py +0 -0
  112. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/tests/skills/test_session_backlog_reconciliation.py +0 -0
  113. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/tests/skills/test_start_skill_bugfix_flow.py +0 -0
  114. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/tests/skills/test_start_skill_security_audit_phase.py +0 -0
  115. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/tests/skills/test_task_routing_skill.py +0 -0
  116. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/tests/test_cli_list.py +0 -0
  117. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/tests/test_cli_plan.py +0 -0
  118. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/tests/test_cli_tier.py +0 -0
  119. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/tests/test_docstring_consistency.py +0 -0
  120. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/tests/test_excludes.py +0 -0
  121. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/tests/test_paths.py +0 -0
  122. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/tests/test_plan_validator.py +0 -0
  123. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/tests/test_pre_compact.py +0 -0
  124. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/tests/test_pre_tool_hook.py +0 -0
  125. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/tests/test_precompact_additional.py +0 -0
  126. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/tests/test_precompact_toctou_fixes.py +0 -0
  127. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/tests/test_session_utils_additional.py +0 -0
  128. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/tests/test_statusline.py +0 -0
  129. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/tests/test_stop_additional.py +0 -0
  130. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/tests/test_stop_hook.py +0 -0
  131. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/tests/test_stop_precompact_fixes.py +0 -0
  132. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/tests/test_sync_template_stop.py +0 -0
  133. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/tests/test_template_pre_tool_hook.py +0 -0
  134. {claude_code_conductor-2.3.0 → claude_code_conductor-2.5.0}/tests/test_worktree_guard.py +0 -0
@@ -50,6 +50,18 @@
50
50
  `.claude/docs/` は人間向けリファレンスのためエージェントは読まなくてよい。
51
51
  詳細は `.claude/docs/taxonomy.md` を参照。
52
52
 
53
+ ## Platform Compatibility
54
+
55
+ このファイルは Claude Code / Codex / Cursor から canonical source として読まれる。
56
+ 他プラットフォームでの動作差分は以下の通り:
57
+
58
+ - **`AskUserQuestion`** への参照は、Codex/Cursor では MCP tool `c3_ask_user_question` に読み替える(MCP elicitation 非対応時の fallback は `c3 ask --file <json>`)
59
+ - **`Agent` ツール** の参照は、Codex では `.codex/agents/<name>.toml` 経由のサブエージェント、Cursor では現行 runtime のサブエージェント機構(無い場合は同一 agent 内でフェーズ実行しレポート契約のみ維持)に読み替える
60
+ - **`Skill` ツール / `/<skill>`** の参照は、Codex では `.agents/skills/<name>/SKILL.md`、Cursor では `.claude/skills/<name>/SKILL.md` を直接読み込む(スラッシュコマンド自動展開は Claude Code 専用機能)
61
+ - **`isolation: worktree`** / **`permissionMode`** / **`tools` 制限** など agent フロントマターの一部キーは Claude Code 仕様。adapter 側では読み替え不能なものは無視される
62
+
63
+ レポート(`.claude/reports/`)・state(`.claude/state/`)・memory(`.claude/agent-memory/`)のファイル名と書き込み先は全プラットフォーム共通。adapter 生成物の詳細は `c3 init --platform codex|cursor` で出力される `AGENTS.md` / `.cursor/rules/c3-core.mdc` を参照。
64
+
53
65
  ---
54
66
 
55
67
  ## C3 Managed
@@ -0,0 +1,167 @@
1
+ # Platform Adapters
2
+
3
+ C3 は **Claude Code** を canonical platform として設計されているが、
4
+ `c3 init --platform` で Codex / Cursor 向けの adapter を生成し、同じ `.claude/`
5
+ ツリーを共通の source of truth として利用できる。
6
+
7
+ 本ドキュメントは:
8
+ - `c3 init --platform` の選択肢と生成物
9
+ - MCP server と `c3 ask` CLI fallback
10
+ - managed block の仕様と手動編集の取り扱い
11
+ - 動作差分のまとめ
12
+
13
+ を一箇所にまとめたリファレンス。実装は `src/c3/adapters.py` / `src/c3/mcp_server.py` /
14
+ `src/c3/cli_ask.py` / `src/c3/platforms.py` を参照。
15
+
16
+ ---
17
+
18
+ ## 1. `c3 init --platform` の選択肢
19
+
20
+ | 値 | 生成物 | 用途 |
21
+ |---|---|---|
22
+ | `claude` (デフォルト) | `.claude/` のみ | Claude Code ネイティブ |
23
+ | `codex` | `.claude/` + `AGENTS.md` + `.codex/` + `.agents/` | Codex CLI / 職場 Codex |
24
+ | `cursor` | `.claude/` + `.cursor/` | Cursor IDE |
25
+ | `all` | 上記すべて | マルチプラットフォーム共存 |
26
+
27
+ `c3 init --platform claude` 以外でも `.claude/` は canonical source として残り、
28
+ adapter は派生ファイルを生成するのみ(`.claude/` の中身を変更しない)。
29
+
30
+ `c3 update --platform <p>` で adapter を再生成できる。`.claude/` 側の skill / agent
31
+ を編集したら adapter も再生成して整合を取る。
32
+
33
+ ---
34
+
35
+ ## 2. 生成される具体的ファイル
36
+
37
+ ### `codex` 選択時
38
+
39
+ | パス | 内容 | 生成ロジック |
40
+ |---|---|---|
41
+ | `AGENTS.md` | プロジェクト直下。Codex に C3 workflow の存在と adapter を伝える | `_codex_agents_section` を managed block で挿入 |
42
+ | `.codex/config.toml` | Codex CLI の MCP 設定 | `[mcp_servers.c3]` セクションを managed block で挿入 |
43
+ | `.codex/agents/<name>.toml` | `.claude/agents/<name>.md` から生成した Codex subagent 定義 | `_codex_agent_toml` で TOML 化 |
44
+ | `.agents/skills/<name>/SKILL.md` | `.claude/skills/<name>/SKILL.md` を Codex 向けに変換コピー | `_convert_skill` で frontmatter 正規化 + adapter note 追加 |
45
+ | `.agents/skills/<name>/<その他>` | `.claude/skills/<name>/` 配下の非 `SKILL.md` ファイルをそのまま複製 | `_copy_file_if_changed` |
46
+
47
+ ### `cursor` 選択時
48
+
49
+ | パス | 内容 | 生成ロジック |
50
+ |---|---|---|
51
+ | `.cursor/rules/c3-core.mdc` | Cursor の rule。`alwaysApply: true` で C3 workflow を常時参照 | `_cursor_core_rule` の静的テキスト |
52
+ | `.cursor/mcp.json` | Cursor の MCP サーバー設定。`mcpServers.c3` のみ管理対象 | `_write_cursor_mcp` で既存 JSON にマージ |
53
+
54
+ ---
55
+
56
+ ## 3. MCP server (`c3.mcp_server`)
57
+
58
+ stdio MCP サーバー。Codex / Cursor から `.codex/config.toml` / `.cursor/mcp.json`
59
+ 経由で起動される。プロトコル: JSON-RPC 2.0 (`2025-11-25`)。
60
+
61
+ ### 提供ツール
62
+
63
+ | ツール名 | 用途 | 入力 |
64
+ |---|---|---|
65
+ | `c3_ask_user_question` | `AskUserQuestion` 互換の単一/複数選択。MCP elicitation を使用 | `payload`: `AskUserQuestion` の JSON |
66
+ | `c3_list_skills` | `.claude/skills/` 配下のスキル一覧を返す | なし |
67
+ | `c3_read_skill` | `.claude/skills/<name>/SKILL.md` を読み込む | `name`: skill 名 |
68
+
69
+ ### セキュリティ
70
+
71
+ - `c3_read_skill` は `.claude/skills/` 外への symlink を `resolved.parents` チェックで拒否
72
+ - パス区切りに `.` / `..` を含む name は弾く
73
+ - skill ファイル名は `SKILL.md` で固定(任意ファイル読み出しはできない)
74
+
75
+ ### 起動コマンド
76
+
77
+ ```bash
78
+ python -m c3.mcp_server
79
+ ```
80
+
81
+ `C3_PROJECT_ROOT` 環境変数でプロジェクトルートを指定可能(adapter 生成時に自動設定)。
82
+ ソースインストール時は `PYTHONPATH` も adapter が `<repo>/src` に設定する。
83
+
84
+ ---
85
+
86
+ ## 4. `c3 ask` CLI fallback
87
+
88
+ MCP elicitation が使えない環境(CI / 非対応 host)向けの fallback。
89
+
90
+ ```bash
91
+ # ファイルから AskUserQuestion JSON を読み、対話で回答
92
+ c3 ask --file question.json
93
+
94
+ # JSON を直接渡す
95
+ c3 ask --json '{"questions":[...]}'
96
+
97
+ # 非対話実行(CI 用)
98
+ c3 ask --file question.json --response "Plan,Review"
99
+ ```
100
+
101
+ 回答は JSON で stdout に出力されるため、シェルパイプで次のステップに渡せる。
102
+
103
+ ---
104
+
105
+ ## 5. managed block
106
+
107
+ adapter は **管理範囲を明示するマーカー** で囲んだブロックのみを書き換え、
108
+ ユーザーが追記した他の部分には触らない。
109
+
110
+ ### Markdown (`AGENTS.md`)
111
+
112
+ ```
113
+ <!-- BEGIN C3 CODEX ADAPTER -->
114
+ ... (adapter が管理する内容)
115
+ <!-- END C3 CODEX ADAPTER -->
116
+ ```
117
+
118
+ ### TOML (`.codex/config.toml`)
119
+
120
+ ```
121
+ # BEGIN C3 CODEX ADAPTER
122
+ [mcp_servers.c3]
123
+ ...
124
+ # END C3 CODEX ADAPTER
125
+ ```
126
+
127
+ ### JSON (`.cursor/mcp.json`)
128
+
129
+ managed block は使わず、`mcpServers.c3` キーだけを上書き。他のサーバー定義は保持。
130
+
131
+ ### 手動編集の取り扱い
132
+
133
+ - **managed block の外は自由に編集 OK**: adapter は触らない
134
+ - **managed block の中は再生成で上書き**: `c3 update --platform codex` で `.claude/` 側の変更が反映される
135
+ - **managed block を削除した場合**: 次回 adapter 生成時にファイル末尾に追加される
136
+ - **managed block を残したまま中身を書き換えた場合**: `c3 update --platform codex` で上書きされる
137
+ - **`[mcp_servers.c3]` を managed block の外で定義した場合**: 競合検出して `ValueError` を投げる(`adapters.py:_write_codex_config`)
138
+
139
+ ---
140
+
141
+ ## 6. 動作差分まとめ
142
+
143
+ | 機能 | Claude Code | Codex | Cursor |
144
+ |---|---|---|---|
145
+ | `AskUserQuestion` | ネイティブツール | MCP `c3_ask_user_question` / fallback `c3 ask` | 同左 |
146
+ | `Agent` ツール | ネイティブ subagent | `.codex/agents/<name>.toml` 経由の subagent | runtime に subagent 機構があれば使用、無ければ同一 agent 内でフェーズ実行 |
147
+ | `Skill` ツール / `/<skill>` | ネイティブ | `.agents/skills/<name>/SKILL.md` を読む | `.claude/skills/<name>/SKILL.md` を rule から指示 |
148
+ | `isolation: worktree` | サポート | 一部 Codex runtime で対応、不可時は同一 worktree 実行 | 反映されない |
149
+ | `permissionMode` | サポート | 概念なし(無視) | 概念なし(無視) |
150
+ | `tools` 制限 | サポート | Codex subagent のツール制限に部分対応 | rule テキスト内で補完 |
151
+ | `hooks` (lifecycle) | サポート | 非対応(無視) | 非対応(無視) |
152
+ | `memory` (`MEMORY.md` 注入) | サポート | `.claude/agent-memory/` を共通参照 | 同左 |
153
+ | パターン昇格 (`/promote-pattern`) | ネイティブ | `c3 init --platform codex` 後は `.agents/skills/promote-pattern/SKILL.md` を読んで実行 | rule から `.claude/skills/promote-pattern/SKILL.md` を指示 |
154
+ | レポート (`.claude/reports/`) | 共通 | 共通 | 共通 |
155
+ | state (`.claude/state/`) | 共通 | 共通 | 共通 |
156
+
157
+ レポート・state・memory のファイル名と書き込み先は全プラットフォーム共通。これにより
158
+ Claude Code / Codex / Cursor が同じプロジェクトを行き来しても workflow 状態が保たれる。
159
+
160
+ ---
161
+
162
+ ## 7. 既知の制限
163
+
164
+ - **`AskUserQuestion` の `multiSelect: true`**: MCP elicitation の仕様上、ホストが multi-select UI に対応していない場合は単一選択に degrade される。`c3 ask --file` の fallback は multi-select に対応
165
+ - **Cursor の subagent**: 2026-05 時点で Cursor は dedicated subagent 機構が限定的。adapter は「同一 agent でフェーズ実行・レポート契約を維持」を方針とする
166
+ - **Codex の `isolation: worktree`**: Codex 側の subagent runtime に依存。worktree 非対応の場合は無視される
167
+ - **改行コード**: adapter 生成ファイルは LF 改行で書き出す(`newline="\n"`)。`.gitattributes` で `eol=lf` を固定済み
@@ -361,6 +361,25 @@ Claude Code のステータスバーに表示するカスタム情報を定義
361
361
  | `type` | string | `"command"` のみ(現時点) |
362
362
  | `command` | string | 実行するコマンド。stdout の1行目がステータスバーに表示される |
363
363
 
364
+ ### C3 デフォルトの表示内容
365
+
366
+ C3 が提供する `.claude/hooks/statusline.py` は以下の形式で表示する:
367
+
368
+ ```
369
+ [Claude Sonnet 4] 200K high | ctx used 8% | 5h lim 24% (1h 59m) | 7d lim 41% (2d 23h)
370
+ ```
371
+
372
+ | 項目 | 内容 |
373
+ |---|---|
374
+ | `[モデル名]` | 現在のモデル表示名 |
375
+ | `200K` / `1M` | コンテキストウィンドウサイズ |
376
+ | `high` / `normal` / `low` | effort レベル |
377
+ | `ctx used N%` | コンテキスト使用率(色: 緑→黄→オレンジ→赤) |
378
+ | `5h lim N% (Xh Ym)` | 5時間レート制限の消費率とリセットまでの残り時間 |
379
+ | `7d lim N% (Xd Yh)` | 7日レート制限の消費率とリセットまでの残り時間 |
380
+
381
+ `rate_limits` は Claude.ai サブスクライバー(Pro/Max)がセッションの最初の API レスポンス後に取得できる。未取得の場合は該当項目を省略する。
382
+
364
383
  ---
365
384
 
366
385
  ## `model`
@@ -23,11 +23,6 @@ ORANGE = '\x1b[38;5;208m'
23
23
  DIM = '\x1b[2m'
24
24
  RESET = '\x1b[0m'
25
25
 
26
- # Gauge characters
27
- BLOCK = '█'
28
- BLOCK_EMPTY = '░'
29
- TOTAL_CELLS = 10
30
-
31
26
 
32
27
  def pct_color(pct: int) -> str:
33
28
  if pct > 90:
@@ -40,16 +35,12 @@ def pct_color(pct: int) -> str:
40
35
  return GREEN
41
36
 
42
37
 
43
- def build_gauge(pct: int) -> str:
44
- filled = min(pct // 10, TOTAL_CELLS)
45
- empty = TOTAL_CELLS - filled
46
- color = pct_color(pct)
47
- return (
48
- DIM + '[' + RESET +
49
- color + BLOCK * filled + RESET +
50
- DIM + BLOCK_EMPTY * empty + RESET +
51
- DIM + ']' + RESET
52
- )
38
+ def format_context_size(size: int) -> str:
39
+ if size >= 900_000:
40
+ return '1M'
41
+ elif size >= 100_000:
42
+ return '200K'
43
+ return str(size)
53
44
 
54
45
 
55
46
  def format_reset_time(resets_at) -> str:
@@ -88,15 +79,32 @@ def render_output(raw: str) -> None:
88
79
  except Exception:
89
80
  pass
90
81
 
82
+ header: list[str] = []
83
+ metrics: list[str] = []
84
+
85
+ # [model display name] context_size effort — スペース区切り
86
+ model = data.get('model') or {}
87
+ display_name = model.get('display_name', '')
88
+ if display_name:
89
+ header.append(f'[{display_name}]')
90
+
91
+ # context window size: 200K / 1M
91
92
  ctx_window = data.get('context_window') or {}
92
- ctx_pct = round(ctx_window.get('used_percentage') or 0)
93
+ ctx_size = ctx_window.get('context_window_size')
94
+ if ctx_size:
95
+ header.append(format_context_size(int(ctx_size)))
93
96
 
94
- parts = [
95
- DIM + 'context usage:' + RESET + ' ' +
96
- build_gauge(ctx_pct) + ' ' +
97
- pct_color(ctx_pct) + str(ctx_pct) + '%' + RESET
98
- ]
97
+ # effort level
98
+ effort = data.get('effort') or {}
99
+ effort_level = effort.get('level', '')
100
+ if effort_level:
101
+ header.append(effort_level)
99
102
 
103
+ # ctx usg %
104
+ ctx_pct = round(ctx_window.get('used_percentage') or 0)
105
+ metrics.append('ctx used ' + pct_color(ctx_pct) + str(ctx_pct) + '%' + RESET)
106
+
107
+ # rate limits
100
108
  rate_limits = data.get('rate_limits')
101
109
  if rate_limits:
102
110
  five_hour = (
@@ -107,14 +115,10 @@ def render_output(raw: str) -> None:
107
115
  if five_hour:
108
116
  pct = round(five_hour.get('used_percentage') or 0)
109
117
  reset_str = format_reset_time(five_hour.get('resets_at'))
110
- part = (
111
- DIM + '5hour limits:' + RESET + ' ' +
112
- build_gauge(pct) + ' ' +
113
- pct_color(pct) + str(pct) + '%' + RESET
114
- )
118
+ part = '5h lim ' + pct_color(pct) + str(pct) + '%' + RESET
115
119
  if reset_str:
116
- part += ' ' + DIM + reset_str + RESET
117
- parts.append(part)
120
+ part += ' ' + DIM + '(' + reset_str + ')' + RESET
121
+ metrics.append(part)
118
122
 
119
123
  seven_day = (
120
124
  rate_limits.get('seven_day') or
@@ -124,16 +128,16 @@ def render_output(raw: str) -> None:
124
128
  if seven_day:
125
129
  pct = round(seven_day.get('used_percentage') or 0)
126
130
  reset_str = format_reset_time(seven_day.get('resets_at'))
127
- part = (
128
- DIM + '7day limits:' + RESET + ' ' +
129
- build_gauge(pct) + ' ' +
130
- pct_color(pct) + str(pct) + '%' + RESET
131
- )
131
+ part = '7d lim ' + pct_color(pct) + str(pct) + '%' + RESET
132
132
  if reset_str:
133
- part += ' ' + DIM + reset_str + RESET
134
- parts.append(part)
135
-
136
- sys.stdout.write(' '.join(parts) + '\n')
133
+ part += ' ' + DIM + '(' + reset_str + ')' + RESET
134
+ metrics.append(part)
135
+
136
+ output_parts: list[str] = []
137
+ if header:
138
+ output_parts.append(' '.join(header))
139
+ output_parts.extend(metrics)
140
+ sys.stdout.write(' | '.join(output_parts) + '\n')
137
141
  sys.stdout.flush()
138
142
 
139
143
 
@@ -124,9 +124,11 @@ Skill(skill="task-routing", args="from_start=true")
124
124
  ```
125
125
 
126
126
  task-routing は args に `from_start=true` が含まれていることをコンテキストから読み取り、
127
- Step 1(種別の 5 択)のみ実行して種別を返す。Step 2〜4 はスキップされる。
127
+ Step 1(種別の 5 択)のみ実行して終了する。Step 2〜4 はスキップされる。
128
128
 
129
- 戻ってきた種別を `task_type` とする。
129
+ 上記 Skill 呼び出しが完了したら、ユーザーへの追加メッセージを出力せずに即 Step 0.5-D へ進む。
130
+ task-routing の出力から確定した種別(`feature` / `bug-fix` / `refactor` / `security-audit` / `docs` のいずれか)を `task_type` とする。
131
+ 種別が取得できなかった場合(空値・読み取り不能)は、task-routing を再呼び出しする。
130
132
 
131
133
  ### 0.5-D: TASK_TYPE 行の書き込み
132
134
 
@@ -15,11 +15,12 @@ Ruflo の「タスク種別 → エージェント編成テンプレ」発想を
15
15
  呼び出し元は Skill ツールの `args` パラメータで動作モードを指定する。
16
16
  LLM はこの skill が起動された際、文脈や呼び出し情報から `from_start=true` の有無を判定する。
17
17
 
18
- - **/start 経由(args に `from_start=true`)**: Step 1 で種別を確定したら
19
- そのまま終了し、種別を `/start` 側に返却する。Step 2〜4 はスキップする。
20
- TASK_TYPE 書き込みも `/start` 側で行うため、本 skill では行わない。
21
- 編成詳細は `/start` 後段(Step 1 開始地点選択 / Step 2 フェーズ遷移)で
22
- 扱うため、ここでは出さない。
18
+ - **/start 経由(args に `from_start=true`)**: Step 1 で種別を確定したら、
19
+ **確定した種別名(例: `feature`)を1行のみ出力して** task-routing を終了する。
20
+ Step 2〜4 はスキップする。案内文・「/start へ移行」のような説明文は **絶対に出力しない**。
21
+ TASK_TYPE 書き込みは `/start` 側(Step 0.5-D)が行うため、本 skill では行わない。
22
+ start スキルの Step 0.5-D が自動的に続きを実行する。
23
+ (この制約は LLM のコンテキスト読み飛ばし対策として Step 1 にも記載されている)
23
24
  - **単独利用(args 指定なし、または `from_start=false`)**: 従来通り Step 1 → 2 → 3 → 4 を
24
25
  順に実行する。Step 4 完了時に TASK_TYPE 書き込みも本 skill が行う。
25
26
 
@@ -28,8 +29,9 @@ LLM はこの skill が起動された際、文脈や呼び出し情報から `f
28
29
  ## Step 1: タスク種別を選択する
29
30
 
30
31
  Skill ツールの `args` に `from_start=true` が含まれているときは「/start 経由モード」とみなし、
31
- Step 1 で種別を確定したら **Step 2〜4 はスキップ** して種別を呼び出し元(/start)に
32
- 返却する(編成詳細は /start 側で表示するため)。
32
+ Step 1 で種別を確定したら **確定した種別名(例: `feature`)を1行のみ出力して** task-routing を終了する。
33
+ Step 2〜4 はスキップ。案内文・「/start へ移行します」などの文言は **絶対に出力しない**。
34
+ (この制約は動作モードセクションにも記載されている)
33
35
 
34
36
  AskUserQuestion ツール:
35
37
 
@@ -144,8 +146,8 @@ AskUserQuestion ツール:
144
146
  その後、選択された種別に応じて以下を実行する:
145
147
 
146
148
  - **feature**:
147
- - `args` に `from_start=true` が含まれているとき: 種別を返却するのみ(制御を /start に返す。再帰呼び出しを避ける)
148
149
  - `args` 指定なし/`from_start=false` のとき: `.claude/skills/start/SKILL.md` を Read して `/start` フローに合流する
150
+ - `args` に `from_start=true` が含まれているとき: このケースは Step 1 で処理済みのため Step 4 に到達しない
149
151
  - **bug-fix**: `systematic-debugger` → `developer` → `tester` の順に Agent ツールで順次起動し、完了後に `code-reviewer` と `security-reviewer` を 1 メッセージ内で並列起動する
150
152
  - **docs**: Agent ツールで `doc-writer` を起動する
151
153
  - **refactor**: planner で `po_plan_version` 付き plan-report を生成 → `.claude/skills/parallel-agents/SKILL.md` を Read して並列実行に合流する
@@ -52,6 +52,14 @@ site/
52
52
  # codex 対応調査メモ (個人作業ノート、配布・コミット対象外)
53
53
  .claude/docs/codex対応/
54
54
 
55
+ # Codex/Cursor adapter 生成物 (c3 init --platform で生成、配布物ではない)
56
+ # wheel 同梱は src/c3/_template/.claude/ 配下のみで構造的に除外されるが、
57
+ # 配布元リポジトリで c3 init --platform を試した場合の commit 混入を防ぐ。
58
+ /AGENTS.md
59
+ /.codex/
60
+ /.cursor/
61
+ /.agents/
62
+
55
63
  # C3 distributor-only (配布元固有の開発支援、配布されない)
56
64
  .dev/
57
65
  /CLAUDE.md
@@ -1,5 +1,119 @@
1
1
  # Changelog
2
2
 
3
+ ## [2.5.0] - 2026-05-13
4
+
5
+ ### 概要
6
+
7
+ `/start` スキルのルーティング停止バグを修正し、ステータスラインの表示をリニューアル。
8
+
9
+ ### 修正
10
+
11
+ #### `/start` → `task-routing` の種別返却が停止するバグ修正
12
+
13
+ `/start` コマンド実行後 task-routing でタスク種別を選択すると「/start コマンドへ移行」というメッセージが出力されるだけで止まり、ユーザーが再度 `/start` を手入力しなければならない問題を修正。
14
+
15
+ - `task-routing/SKILL.md`: `from_start=true` モード終了時に「確定した種別名を1行のみ出力して終了する」ことを明示。「/start へ移行します」などの余剰メッセージを **絶対に出力しない** 旨を追記
16
+ - `start/SKILL.md`: Skill 呼び出し完了後は追加メッセージなしに即 Step 0.5-D へ進む旨と、種別取得失敗時の再呼び出しフォールバックを追記
17
+ - 3箇所の防御的冗長記述にクロスリファレンスを追加(LLMのコンテキスト読み飛ばし対策のため意図的な反復であることを明示)
18
+
19
+ ### 変更
20
+
21
+ #### ステータスライン表示のリニューアル (`.claude/hooks/statusline.py`)
22
+
23
+ 表示フォーマットを以下に刷新:
24
+
25
+ ```
26
+ [Claude Sonnet 4] 200K high | ctx used 8% | 5h lim 24% (1h 59m) | 7d lim 41% (2d 23h)
27
+ ```
28
+
29
+ - モデル名・コンテキストサイズ・effort レベルを先頭にスペース区切りで追加
30
+ - コンテキストサイズを `200K` / `1M` 形式に変換して表示
31
+ - ゲージバー(`[████░░░░░░]`)を廃止してテキストのみに変更
32
+ - `context usage` → `ctx used`、`lmt` → `lim`(標準的な英語略語)に表記統一
33
+ - `|` 区切りの前後にスペースを追加
34
+ - レート制限のリセット残り時間を `(Xh Ym)` / `(Xd Yh)` 形式で括弧付き表示
35
+ - `rate_limits` 未取得時は該当項目を省略
36
+
37
+ ---
38
+
39
+ ## [2.4.0] - 2026-05-12
40
+
41
+ ### 概要
42
+
43
+ Codex / Cursor adapter 追加(v2.3.0 系列)の整合性監査の結果見つかった問題を一括修正。MCP server の path traversal を symlink 経由まで防御し、adapter 内部関数のユニットテストを 22 ケース新設。Claude Code 専用機能の Codex/Cursor 読み替えを `taxonomy.md` と新規 `platform-adapters.md` で明示し、CRLF/LF の取り扱いを `.gitattributes` で固定化した。
44
+
45
+ ### 変更(セキュリティ強化)
46
+
47
+ #### MCP `_read_skill` の path traversal 防御強化 (M2)
48
+
49
+ `src/c3/mcp_server.py:_read_skill` を以下のように変更:
50
+
51
+ - `.` / `..` の文字列マッチに加え、`Path.resolve(strict=True)` で symlink を解決
52
+ - 解決後のパスが `.claude/skills/` 配下にあるかを `skills_root in resolved.parents` で検証
53
+ - 範囲外の場合は `None` を返す(エラー出さずサイレントに拒否)
54
+
55
+ これにより悪意ある symlink を `.claude/skills/<name>/SKILL.md` として配置しても、project_root 外のファイルが読まれなくなる。脅威モデル: 悪意あるリポジトリを clone した利用者を巻き込むシナリオ。
56
+
57
+ ### 変更(ドキュメント / 整合性)
58
+
59
+ #### Codex / Cursor 動作差分の明文化 (H3, M3, M4)
60
+
61
+ 3 つのドキュメントを更新:
62
+
63
+ - **`.claude/CLAUDE.md`**: `Platform Compatibility` セクション追加。`AskUserQuestion` / `Agent` / `Skill` / agent フロントマターの Codex/Cursor 読み替え方針を整理
64
+ - **`.claude/docs/taxonomy.md`**: agents セクション末尾に「Codex / Cursor での扱い」表を追加。`permissionMode` / `isolation` / `hooks` 等の Claude Code 専用キーの取り扱いを記述。memory スコープ表に運用ルール(配布除外・書き込みタイミング・手動編集・削除)を追加 (L3)
65
+ - **`.claude/docs/platform-adapters.md`** (新規): `c3 init --platform` の選択肢、生成物、MCP server (`c3_ask_user_question` / `c3_list_skills` / `c3_read_skill`)、`c3 ask` CLI fallback、managed block の仕様、動作差分マトリックスを 1 ファイルでまとめた利用先向け技術文書
66
+
67
+ #### README に PO 撤去履歴を明示 (L4)
68
+
69
+ `並列実行 (parallel-agents skill)` セクションに v2.0.0 で PO (Parallel Orchestra) 完全撤去された旨を追記。利用先で「PO」「外部プロセス」という単語が CHANGELOG に登場する理由を新規ユーザーが追跡できるようにした。
70
+
71
+ ### 変更(テスト追加)
72
+
73
+ #### `tests/test_adapters.py` 新設 (M1, L1)
74
+
75
+ `src/c3/adapters.py` の内部関数と MCP `_read_skill` をカバーする 23 ケース(うち 1 ケースは Windows で skip)を追加:
76
+
77
+ - `_toml_escape` / `_toml_multiline_escape` のエッジケース(backslash, quote, triple quote, 改行保持)
78
+ - `_convert_skill` の frontmatter あり/なし/heading なしの分岐
79
+ - `_codex_agent_toml` の特殊文字・改行保持
80
+ - `_replace_managed_block` の単一/複数 block ケース(`count=1` 契約を回帰防止)
81
+ - `_write_cursor_mcp` の merge / 新規作成 / 不正 JSON 拒否 / 非 object 拒否
82
+ - `scaffold_adapters` の `.claude/` 不在エラー / 冪等性
83
+ - MCP `_read_skill` の正常系 / `..` 拒否 / 空文字拒否 / 不在 / symlink 経由のアクセス拒否 (POSIX 限定)
84
+
85
+ ### 変更(環境整理)
86
+
87
+ #### `.gitignore` に adapter 生成物追加 (H2)
88
+
89
+ `c3 init --platform codex|cursor|all` で生成される `/AGENTS.md` / `/.codex/` / `/.cursor/` / `/.agents/` を配布元リポジトリでの git commit 混入から保護。wheel 同梱は `src/c3/_template/.claude/` 配下に限定されるため構造的に wheel には入らないが、開発者が adapter を試生成した時の事故防止のため明示除外。
90
+
91
+ #### `.gitattributes` 拡張 (M5)
92
+
93
+ `*.toml` / `*.mdc` を `text eol=lf` に。さらに `AGENTS.md` / `.codex/**/*` / `.cursor/**/*` も `eol=lf` で固定。Windows の `core.autocrlf=true` 環境でも adapter ファイルが CRLF 化されず、`_write_file_if_changed` の完全一致比較が安定する。
94
+
95
+ #### `.claude/settings.local.json` の PO 遺物削除 (H1)
96
+
97
+ `Bash(c3 po *)` と `python -m pytest tests/parallel_orchestra/...` の許可ルールを削除。`c3 po` コマンドと parallel_orchestra テストは v2.0.0 で撤去済みのため、これらルールは空回りしていた。
98
+
99
+ ### 削除
100
+
101
+ なし(破壊的変更なし)。
102
+
103
+ ### 互換性
104
+
105
+ - v2.3.x からの後方互換: **完全互換**(API 変更なし、振る舞い変更なし、削除なし)
106
+ - adapter 生成ファイル: 改行コードが CRLF だった環境では LF に正規化される。`git diff` 上で改行差が出るが内容差はない
107
+ - セキュリティ修正: MCP `_read_skill` の戻り値挙動が **拒否時に `None`** で変わらず。symlink を悪用していたケース(通常用途では存在しない)のみ拒否される
108
+
109
+ ### 検証
110
+
111
+ - 全テスト: 613 passed / 3 skipped (Windows 環境)
112
+ - wheel build: `claude_code_conductor-2.4.0-py3-none-any.whl` (81 entries) — adapter 生成物 (`.codex/` / `.cursor/` / `.agents/` / `AGENTS.md`) の混入なし、機密ファイル混入なし、新規 `platform-adapters.md` は配布対象に含まれる
113
+ - `c3 doctor`: 全項目 OK
114
+
115
+ ---
116
+
3
117
  ## [2.3.0] - 2026-05-12
4
118
 
5
119
  ### 概要
@@ -1,7 +1,7 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: claude-code-conductor
3
- Version: 2.3.0
4
- Summary: Multi-agent orchestration framework for Claude Code (C3)
3
+ Version: 2.5.0
4
+ Summary: Multi-agent orchestration framework for Claude Code with Codex/Cursor adapters (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
7
7
  Author: satoh-y-0323
@@ -27,7 +27,7 @@ License: MIT License
27
27
  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
28
28
  SOFTWARE.
29
29
  License-File: LICENSE
30
- Keywords: agents,claude,claude-code,orchestration,tdd
30
+ Keywords: agents,claude,claude-code,codex,cursor,orchestration,tdd
31
31
  Classifier: Development Status :: 3 - Alpha
32
32
  Classifier: Intended Audience :: Developers
33
33
  Classifier: License :: OSI Approved :: MIT License
@@ -186,9 +186,11 @@ C3 のスラッシュコマンドはすべてスキル(`skills/{name}/SKILL.md
186
186
  | コマンド | 役割 |
187
187
  |---|---|
188
188
  | `c3 init` | 利用先プロジェクトに `.claude/` を展開する |
189
+ | `c3 init --platform codex|cursor|all` | `.claude/` を canonical source にしたまま Codex/Cursor adapter を追加 |
189
190
  | `c3 update` | `.claude/` をパッケージ最新版へ更新する(個人ファイルはスキップ) |
190
191
  | `c3 list-agents` / `list-skills` | 設置済みアセットを一覧表示 |
191
- | `c3 doctor` | 環境診断(`.claude/`・settings.json・claude バイナリ) |
192
+ | `c3 doctor` | 環境診断(`.claude/`・settings.json・claude バイナリ・adapter 生成物) |
193
+ | `c3 ask` | Claude Code 以外で `AskUserQuestion` 互換の単一選択・複数選択を実行 |
192
194
  | `c3 plan validate <plan-report>` | plan-report の YAML フロントマターと agent 存在を検証 |
193
195
  | `c3 plan waves <plan-report>` | plan-report の wave 分解結果を JSON で出力 |
194
196
 
@@ -250,6 +252,15 @@ c3 init
250
252
 
251
253
  `c3 init` がパッケージに同梱された `.claude/` テンプレートをカレントディレクトリへコピーします。後日テンプレート側を更新したい場合は `c3 update` で差分のみ反映できます(`reports/` や `memory/sessions/` 等の個人ファイルは保持されます)。
252
254
 
255
+ Codex/Cursor でも同じ C3 workflow を使う場合は、`.claude/` を動かさず adapter を追加します。
256
+
257
+ ```bash
258
+ c3 init --platform codex # AGENTS.md / .agents/skills / .codex を生成
259
+ c3 init --platform cursor # .cursor/rules / .cursor/mcp.json を生成
260
+ ```
261
+
262
+ Codex/Cursor adapter は `.claude/skills` と `.claude/agents` を参照元にします。`AskUserQuestion` は MCP tool `c3_ask_user_question`、または fallback の `c3 ask` で単一選択・複数選択を維持します。Claude Code の `Agent` / `Skill` tool 前提は、Codex では `.codex/agents/` と `.agents/skills/`、Cursor では `.cursor/rules/c3-core.mdc` で読み替えます。
263
+
253
264
  **3. プロジェクトを Claude Code で開き、初期設定を行う**
254
265
 
255
266
  ```
@@ -342,7 +353,9 @@ Copy-Item -Recurse claude-code-conductor\.claude your-project\
342
353
 
343
354
  ## 並列実行 (parallel-agents skill)
344
355
 
345
- 計画フェーズで生成した plan-report を YAML フロントマター付きマニフェストとして読み込み、独立タスクを親 Claude の Agent ツール並列起動 + 公式 `isolation: "worktree"` で並列実行できます(v2.0.0 以降は外部プロセス不要)。
356
+ 計画フェーズで生成した plan-report を YAML フロントマター付きマニフェストとして読み込み、独立タスクを親 Claude の Agent ツール並列起動 + 公式 `isolation: "worktree"` で並列実行できます。
357
+
358
+ > **アーキテクチャ移行履歴:** v1.x までは外部プロセス制御の **PO (Parallel Orchestra)** が並列実行を担っていましたが、v2.0.0 で完全撤去されました。現在は Claude Code 公式の subagent 並列起動機能に統一されており、追加プロセス・追加デーモン・追加スキーマは不要です。
346
359
 
347
360
  要件は Python ≥ 3.10、PATH に `claude` バイナリ、PyYAML(C3 の依存として自動インストール)。
348
361
 
@@ -352,7 +365,7 @@ Copy-Item -Recurse claude-code-conductor\.claude your-project\
352
365
  2. `/develop` を起動 → **D-0** で plan-report のフロントマターを自動検出し `parallel-agents` skill へ切り替わる
353
366
  3. C3 が `c3 plan validate` でマニフェスト妥当性を検証、wave ごとにユーザー承認を取りながら Agent ツールで並列実行します
354
367
 
355
- TDD を伴う機能実装は、planner が「test- → impl- → confirm-」の 3 タスクペアに分解し、各 wave 内で独立機能間で並列起動されます(v2.1.0+、旧 `tdd-develop` agent はこのリリースで廃止)。
368
+ TDD を伴う機能実装は、planner が「test- → impl- → confirm-」の 3 タスクペアに分解し、各 wave 内で独立機能間で並列起動されます。並列実行時は worktree 専用の `wt_tester` / `wt_developer` / `wt_systematic-debugger` agent が使用され、レポートは `task_id` ベースのファイル名で出力されます。
356
369
 
357
370
  ---
358
371
 
@@ -143,9 +143,11 @@ C3 のスラッシュコマンドはすべてスキル(`skills/{name}/SKILL.md
143
143
  | コマンド | 役割 |
144
144
  |---|---|
145
145
  | `c3 init` | 利用先プロジェクトに `.claude/` を展開する |
146
+ | `c3 init --platform codex|cursor|all` | `.claude/` を canonical source にしたまま Codex/Cursor adapter を追加 |
146
147
  | `c3 update` | `.claude/` をパッケージ最新版へ更新する(個人ファイルはスキップ) |
147
148
  | `c3 list-agents` / `list-skills` | 設置済みアセットを一覧表示 |
148
- | `c3 doctor` | 環境診断(`.claude/`・settings.json・claude バイナリ) |
149
+ | `c3 doctor` | 環境診断(`.claude/`・settings.json・claude バイナリ・adapter 生成物) |
150
+ | `c3 ask` | Claude Code 以外で `AskUserQuestion` 互換の単一選択・複数選択を実行 |
149
151
  | `c3 plan validate <plan-report>` | plan-report の YAML フロントマターと agent 存在を検証 |
150
152
  | `c3 plan waves <plan-report>` | plan-report の wave 分解結果を JSON で出力 |
151
153
 
@@ -207,6 +209,15 @@ c3 init
207
209
 
208
210
  `c3 init` がパッケージに同梱された `.claude/` テンプレートをカレントディレクトリへコピーします。後日テンプレート側を更新したい場合は `c3 update` で差分のみ反映できます(`reports/` や `memory/sessions/` 等の個人ファイルは保持されます)。
209
211
 
212
+ Codex/Cursor でも同じ C3 workflow を使う場合は、`.claude/` を動かさず adapter を追加します。
213
+
214
+ ```bash
215
+ c3 init --platform codex # AGENTS.md / .agents/skills / .codex を生成
216
+ c3 init --platform cursor # .cursor/rules / .cursor/mcp.json を生成
217
+ ```
218
+
219
+ Codex/Cursor adapter は `.claude/skills` と `.claude/agents` を参照元にします。`AskUserQuestion` は MCP tool `c3_ask_user_question`、または fallback の `c3 ask` で単一選択・複数選択を維持します。Claude Code の `Agent` / `Skill` tool 前提は、Codex では `.codex/agents/` と `.agents/skills/`、Cursor では `.cursor/rules/c3-core.mdc` で読み替えます。
220
+
210
221
  **3. プロジェクトを Claude Code で開き、初期設定を行う**
211
222
 
212
223
  ```
@@ -299,7 +310,9 @@ Copy-Item -Recurse claude-code-conductor\.claude your-project\
299
310
 
300
311
  ## 並列実行 (parallel-agents skill)
301
312
 
302
- 計画フェーズで生成した plan-report を YAML フロントマター付きマニフェストとして読み込み、独立タスクを親 Claude の Agent ツール並列起動 + 公式 `isolation: "worktree"` で並列実行できます(v2.0.0 以降は外部プロセス不要)。
313
+ 計画フェーズで生成した plan-report を YAML フロントマター付きマニフェストとして読み込み、独立タスクを親 Claude の Agent ツール並列起動 + 公式 `isolation: "worktree"` で並列実行できます。
314
+
315
+ > **アーキテクチャ移行履歴:** v1.x までは外部プロセス制御の **PO (Parallel Orchestra)** が並列実行を担っていましたが、v2.0.0 で完全撤去されました。現在は Claude Code 公式の subagent 並列起動機能に統一されており、追加プロセス・追加デーモン・追加スキーマは不要です。
303
316
 
304
317
  要件は Python ≥ 3.10、PATH に `claude` バイナリ、PyYAML(C3 の依存として自動インストール)。
305
318
 
@@ -309,7 +322,7 @@ Copy-Item -Recurse claude-code-conductor\.claude your-project\
309
322
  2. `/develop` を起動 → **D-0** で plan-report のフロントマターを自動検出し `parallel-agents` skill へ切り替わる
310
323
  3. C3 が `c3 plan validate` でマニフェスト妥当性を検証、wave ごとにユーザー承認を取りながら Agent ツールで並列実行します
311
324
 
312
- TDD を伴う機能実装は、planner が「test- → impl- → confirm-」の 3 タスクペアに分解し、各 wave 内で独立機能間で並列起動されます(v2.1.0+、旧 `tdd-develop` agent はこのリリースで廃止)。
325
+ TDD を伴う機能実装は、planner が「test- → impl- → confirm-」の 3 タスクペアに分解し、各 wave 内で独立機能間で並列起動されます。並列実行時は worktree 専用の `wt_tester` / `wt_developer` / `wt_systematic-debugger` agent が使用され、レポートは `task_id` ベースのファイル名で出力されます。
313
326
 
314
327
  ---
315
328