claude-code-conductor 2.2.0__tar.gz → 2.4.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-2.2.0 → claude_code_conductor-2.4.0}/.claude/CLAUDE.md +12 -0
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/.claude/agents/code-reviewer.md +2 -1
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/.claude/agents/security-reviewer.md +2 -1
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/.claude/agents/tester.md +0 -1
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/.claude/agents/wt_developer.md +3 -3
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/.claude/agents/wt_systematic-debugger.md +3 -3
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/.claude/agents/wt_tester.md +3 -3
- claude_code_conductor-2.4.0/.claude/docs/platform-adapters.md +167 -0
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/.claude/hooks/consolidate_memory.py +13 -13
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/.claude/hooks/post_tool.py +1 -1
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/.claude/hooks/pre_tool.py +2 -2
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/.claude/hooks/record_review_decision.py +1 -1
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/.claude/hooks/record_tier_outcome.py +2 -2
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/.claude/hooks/review_hint_inject.py +1 -1
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/.claude/hooks/schema.sql +7 -9
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/.claude/hooks/select_tier.py +4 -4
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/.claude/hooks/session_start.py +1 -1
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/.claude/hooks/session_utils.py +1 -1
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/.claude/hooks/subagent_log.py +4 -4
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/.claude/rules/code-review-checklist.md +3 -1
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/.claude/rules/security-review-checklist.md +3 -1
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/.claude/skills/dev-workflow/SKILL.md +10 -10
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/.claude/skills/develop/SKILL.md +0 -7
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/.claude/skills/init-session/SKILL.md +3 -3
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/.claude/skills/parallel-agents/SKILL.md +3 -12
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/.gitignore +8 -3
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/CHANGELOG.md +166 -0
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/PKG-INFO +19 -6
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/README.md +16 -3
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/pyproject.toml +2 -2
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/src/c3/__init__.py +1 -1
- claude_code_conductor-2.4.0/src/c3/adapters.py +389 -0
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/src/c3/cli.py +2 -1
- claude_code_conductor-2.4.0/src/c3/cli_ask.py +60 -0
- claude_code_conductor-2.4.0/src/c3/cli_doctor.py +162 -0
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/src/c3/cli_init.py +28 -4
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/src/c3/cli_tier.py +4 -4
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/src/c3/cli_update.py +48 -20
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/src/c3/db.py +5 -5
- claude_code_conductor-2.4.0/src/c3/mcp_server.py +282 -0
- claude_code_conductor-2.4.0/src/c3/platforms.py +17 -0
- claude_code_conductor-2.4.0/src/c3/question.py +415 -0
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/tests/hooks/test_consolidate_memory.py +5 -5
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/tests/hooks/test_post_tool.py +1 -1
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/tests/hooks/test_pre_tool.py +4 -4
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/tests/hooks/test_record_tier_outcome.py +1 -1
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/tests/hooks/test_review_hint_inject.py +1 -1
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/tests/hooks/test_select_tier.py +2 -2
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/tests/hooks/test_select_tier_escalation.py +1 -1
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/tests/hooks/test_session_utils.py +1 -1
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/tests/hooks/test_similarity_boost.py +1 -1
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/tests/hooks/test_subagent_log.py +4 -4
- claude_code_conductor-2.4.0/tests/test_adapters.py +276 -0
- claude_code_conductor-2.4.0/tests/test_cli_ask.py +280 -0
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/tests/test_cli_init.py +85 -4
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/tests/test_cli_tier.py +1 -1
- claude_code_conductor-2.2.0/src/c3/cli_doctor.py +0 -99
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/.claude/agents/architect.md +0 -0
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/.claude/agents/developer.md +0 -0
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/.claude/agents/doc-writer.md +0 -0
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/.claude/agents/interviewer.md +0 -0
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/.claude/agents/planner.md +0 -0
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/.claude/agents/project-setup.md +0 -0
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/.claude/agents/systematic-debugger.md +0 -0
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/.claude/docs/settings.json.md +0 -0
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/.claude/hooks/permission_handler.py +0 -0
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/.claude/hooks/pre_compact.py +0 -0
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/.claude/hooks/restore_session.py +0 -0
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/.claude/hooks/session_stop.py +0 -0
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/.claude/hooks/statusline.py +0 -0
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/.claude/hooks/stop.py +0 -0
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/.claude/hooks/worktree_guard.py +0 -0
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/.claude/memory/.gitkeep +0 -0
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/.claude/permission_rules.json +0 -0
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/.claude/rules/promoted/index.md +0 -0
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/.claude/settings.json +0 -0
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/.claude/skills/code-review/SKILL.md +0 -0
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/.claude/skills/doc/SKILL.md +0 -0
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/.claude/skills/extract-lib/SKILL.md +0 -0
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/.claude/skills/mcp-config/SKILL.md +0 -0
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/.claude/skills/pattern-status/SKILL.md +0 -0
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/.claude/skills/promote-pattern/SKILL.md +0 -0
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/.claude/skills/report-timestamp/SKILL.md +0 -0
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/.claude/skills/report-timestamp/scripts/get_timestamp.py +0 -0
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/.claude/skills/setup/SKILL.md +0 -0
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/.claude/skills/start/SKILL.md +0 -0
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/.claude/skills/task-routing/SKILL.md +0 -0
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/.claude/state/.gitkeep +0 -0
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/LICENSE +0 -0
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/hatch_build.py +0 -0
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/src/c3/__main__.py +0 -0
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/src/c3/_excludes.py +0 -0
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/src/c3/_terminal.py +0 -0
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/src/c3/cli_list.py +0 -0
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/src/c3/cli_plan.py +0 -0
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/src/c3/paths.py +0 -0
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/src/c3/plan_validator.py +0 -0
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/tests/__init__.py +0 -0
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/tests/conftest.py +0 -0
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/tests/hooks/__init__.py +0 -0
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/tests/hooks/test_permission_handler.py +0 -0
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/tests/hooks/test_pip_reinstall_reminder.py +0 -0
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/tests/hooks/test_planner_check.py +0 -0
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/tests/hooks/test_restore_session.py +0 -0
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/tests/hooks/test_session_start.py +0 -0
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/tests/hooks/test_session_stop.py +0 -0
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/tests/hooks/test_settings_local_absolute_paths.py +0 -0
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/tests/hooks/test_statusline.py +0 -0
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/tests/hooks/test_statusline_template_sync.py +0 -0
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/tests/hooks/test_sync_check.py +0 -0
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/tests/hooks/test_template_guard.py +0 -0
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/tests/skills/__init__.py +0 -0
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/tests/skills/test_session_backlog_reconciliation.py +0 -0
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/tests/skills/test_start_skill_bugfix_flow.py +0 -0
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/tests/skills/test_start_skill_security_audit_phase.py +0 -0
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/tests/skills/test_task_routing_skill.py +0 -0
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/tests/test_cli_list.py +0 -0
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/tests/test_cli_plan.py +0 -0
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/tests/test_docstring_consistency.py +0 -0
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/tests/test_excludes.py +0 -0
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/tests/test_paths.py +0 -0
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/tests/test_plan_validator.py +0 -0
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/tests/test_pre_compact.py +0 -0
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/tests/test_pre_tool_hook.py +0 -0
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/tests/test_precompact_additional.py +0 -0
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/tests/test_precompact_toctou_fixes.py +0 -0
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/tests/test_session_utils_additional.py +0 -0
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/tests/test_statusline.py +0 -0
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/tests/test_stop_additional.py +0 -0
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/tests/test_stop_hook.py +0 -0
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/tests/test_stop_precompact_fixes.py +0 -0
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/tests/test_sync_template_stop.py +0 -0
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/tests/test_template_pre_tool_hook.py +0 -0
- {claude_code_conductor-2.2.0 → claude_code_conductor-2.4.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
|
|
@@ -47,7 +47,8 @@ tools:
|
|
|
47
47
|
|
|
48
48
|
**During:**
|
|
49
49
|
- 指摘は重大度(High / Medium / Low)で分類する
|
|
50
|
-
- **指摘ごとに該当する checklist_id を `[CR-XX-NNN]` 形式で併記する**(`.claude/rules/code-review-checklist.md` の各項目に付与済み)。
|
|
50
|
+
- **指摘ごとに該当する checklist_id を `[CR-XX-NNN]` 形式で併記する**(`.claude/rules/code-review-checklist.md` の各項目に付与済み)。review-hint(レビュー判断ヒント機能)の照合キーになるため、必須とする。複数該当する場合は最も近いものを 1 つ選ぶ
|
|
51
|
+
- **該当 ID がない場合は `[CR-NEW]` で出す**(チェックリスト追加候補として扱う)。無理やり近い既存 ID にマッピングしないこと。review-hint の照合精度が落ち、チェックリストの成長機会も失われるため
|
|
51
52
|
- 良い実装は明示的に記録する(削除しないよう伝える)
|
|
52
53
|
- 修正必須と推奨の2段階で提示する
|
|
53
54
|
|
{claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/.claude/agents/security-reviewer.md
RENAMED
|
@@ -48,7 +48,8 @@ SQLインジェクション・XSS・認証認可・秘密情報漏洩などの
|
|
|
48
48
|
|
|
49
49
|
**During:**
|
|
50
50
|
- 指摘は深刻度(Critical / High / Medium / Low)で分類する
|
|
51
|
-
- **指摘ごとに該当する checklist_id を `[SR-XX-NNN]` 形式で併記する**(`.claude/rules/security-review-checklist.md` の各項目に付与済み)。
|
|
51
|
+
- **指摘ごとに該当する checklist_id を `[SR-XX-NNN]` 形式で併記する**(`.claude/rules/security-review-checklist.md` の各項目に付与済み)。review-hint(レビュー判断ヒント機能)の照合キーになるため、必須とする。複数該当する場合は最も近いものを 1 つ選ぶ
|
|
52
|
+
- **該当 ID がない場合は `[SR-NEW]` で出す**(チェックリスト追加候補として扱う)。無理やり近い既存 ID にマッピングしないこと。review-hint の照合精度が落ち、チェックリストの成長機会も失われるため
|
|
52
53
|
- 悪用シナリオを具体的に記述して再現可能な形で報告する
|
|
53
54
|
- 修正方法の例を提示する
|
|
54
55
|
|
|
@@ -59,7 +59,6 @@ tools:
|
|
|
59
59
|
|
|
60
60
|
## Tools & Constraints
|
|
61
61
|
制限: プロダクションコードのソースファイルを編集・書き込みしない
|
|
62
|
-
必須: Skill ツールで `report-timestamp` を呼び出しタイムスタンプを取得し、test-report を `.claude/reports/test-report-{timestamp}.md` に Write すること(出力なしでの終了は不可)
|
|
63
62
|
|
|
64
63
|
## Related Agents
|
|
65
64
|
- 上流: planner(plan-report を受け取る)
|
|
@@ -3,7 +3,7 @@ name: wt_developer
|
|
|
3
3
|
model: sonnet
|
|
4
4
|
memory: project
|
|
5
5
|
permissionMode: bypassPermissions
|
|
6
|
-
description: 並列 worktree 専用 developer。parallel-agents skill が isolation:"worktree"
|
|
6
|
+
description: 並列 worktree 専用 developer。parallel-agents skill が isolation:"worktree" 付きで起動する用途。Stuck Signal のファイル名を task_id ベースにし、permission プロンプトを worktree 内でスキップする。
|
|
7
7
|
tools:
|
|
8
8
|
- Read
|
|
9
9
|
- Write
|
|
@@ -73,11 +73,11 @@ plan-report に基づき実装・デバッグ・リファクタリングを行
|
|
|
73
73
|
|
|
74
74
|
同じ問題に対して3回以上アプローチを変えても解決できない場合:
|
|
75
75
|
|
|
76
|
-
1.
|
|
77
|
-
2. `.claude/reports/debug-needed-{timestamp}.md` を Write する。記載内容:
|
|
76
|
+
1. **必ず** プロンプトで指定された `task_id` をもとに `.claude/reports/debug-needed-{task_id}.md` を Write する(並列実行時の衝突回避 + 親 Claude が後続 wave で systematic-debugger を呼ぶ際に対象 task を特定するため)。記載内容:
|
|
78
77
|
- 実装しようとしていたこと
|
|
79
78
|
- 試みたアプローチと失敗の内容(エラーメッセージ・スタックトレース含む)
|
|
80
79
|
- 現在のコードの状態(関連する箇所の抜粋)
|
|
80
|
+
2. 保険(task_id がプロンプトから読み取れない異常系のみ): Skill ツールで `report-timestamp` を呼び出してタイムスタンプを取得し、`.claude/reports/debug-needed-{timestamp}.md` を Write する。通常運用ではこの経路に入ってはいけない
|
|
81
81
|
3. 作業を止めて呼び出し元に返す。コミット・Edit は不要
|
|
82
82
|
|
|
83
83
|
## Tools & Constraints
|
{claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/.claude/agents/wt_systematic-debugger.md
RENAMED
|
@@ -3,7 +3,7 @@ name: wt_systematic-debugger
|
|
|
3
3
|
model: sonnet
|
|
4
4
|
memory: project
|
|
5
5
|
permissionMode: bypassPermissions
|
|
6
|
-
description: 並列 worktree 専用 systematic-debugger。parallel-agents skill が isolation:"worktree"
|
|
6
|
+
description: 並列 worktree 専用 systematic-debugger。parallel-agents skill が isolation:"worktree" 付きで起動する用途。debug-analysis のファイル名を task_id ベースにし、permission プロンプトを worktree 内でスキップする。
|
|
7
7
|
tools:
|
|
8
8
|
- Read
|
|
9
9
|
- Write
|
|
@@ -85,9 +85,9 @@ developer が詰まった問題の根本原因を調査し、debug-analysis-repo
|
|
|
85
85
|
|
|
86
86
|
### Step 4: debug-analysis-report の出力
|
|
87
87
|
|
|
88
|
-
|
|
88
|
+
**必ず** プロンプトで指定された `task_id` をもとに `.claude/reports/debug-analysis-{task_id}.md` に Write する。これは `parallel-agents` skill の `writes` 宣言と一致させ、並列実行時のファイル名衝突を避けるために必須。
|
|
89
89
|
|
|
90
|
-
|
|
90
|
+
保険(task_id がプロンプトから読み取れない異常系のみ): Skill ツールで `report-timestamp` を呼び出してタイムスタンプを取得し、`.claude/reports/debug-analysis-{timestamp}.md` を Write する。通常運用ではこの経路に入ってはいけない。
|
|
91
91
|
|
|
92
92
|
レポートの構成:
|
|
93
93
|
|
|
@@ -3,7 +3,7 @@ name: wt_tester
|
|
|
3
3
|
model: sonnet
|
|
4
4
|
memory: project
|
|
5
5
|
permissionMode: bypassPermissions
|
|
6
|
-
description: 並列 worktree 専用 tester。parallel-agents skill が isolation:"worktree"
|
|
6
|
+
description: 並列 worktree 専用 tester。parallel-agents skill が isolation:"worktree" 付きで起動する用途。test-report のファイル名を task_id ベースにし、permission プロンプトを worktree 内でスキップする。
|
|
7
7
|
tools:
|
|
8
8
|
- Read
|
|
9
9
|
- Write
|
|
@@ -58,13 +58,13 @@ tools:
|
|
|
58
58
|
- テスト結果は合格・不合格・スキップの件数を記録する
|
|
59
59
|
|
|
60
60
|
**After:**
|
|
61
|
-
- **必ず**
|
|
61
|
+
- **必ず** プロンプトで指定された `task_id` をもとに `.claude/reports/test-report-{task_id}.md` に Write して出力する。これは `parallel-agents` skill の `writes` 宣言と一致させ、並列実行時のファイル名衝突を避けるために必須
|
|
62
|
+
- 保険(task_id がプロンプトから読み取れない異常系のみ): Skill ツールで `report-timestamp` を呼び出してタイムスタンプを取得し、`.claude/reports/test-report-{timestamp}.md` に Write する。通常運用ではこの経路に入ってはいけない
|
|
62
63
|
- test-report を Write せずにターンを終了することは禁止
|
|
63
64
|
- Red フェーズの test-report には失敗理由(機能未実装による失敗であること)を明記する
|
|
64
65
|
|
|
65
66
|
## Tools & Constraints
|
|
66
67
|
制限: プロダクションコードのソースファイルを編集・書き込みしない
|
|
67
|
-
必須: Skill ツールで `report-timestamp` を呼び出しタイムスタンプを取得し、test-report を `.claude/reports/test-report-{timestamp}.md` に Write すること(出力なしでの終了は不可)
|
|
68
68
|
|
|
69
69
|
## Related Agents
|
|
70
70
|
- 上流: planner(plan-report を受け取る)
|
|
@@ -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` を固定済み
|
{claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/.claude/hooks/consolidate_memory.py
RENAMED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env python3
|
|
2
2
|
"""Stop hook: consolidate the last N days of session memory into a summary.
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
memory-consolidation MVP: 過去 N 日分の `.claude/memory/sessions/YYYYMMDD.tmp` から
|
|
5
5
|
- ``## うまくいったアプローチ``
|
|
6
6
|
- ``## 試みたが失敗したアプローチ``
|
|
7
7
|
の各セクションを集約し、`.claude/memory/consolidated_summary.md` に出力する。
|
|
@@ -47,7 +47,7 @@ except AttributeError:
|
|
|
47
47
|
# 集約ウィンドウ(直近何日分の session ファイルを対象にするか)
|
|
48
48
|
DEFAULT_WINDOW_DAYS = 7
|
|
49
49
|
|
|
50
|
-
#
|
|
50
|
+
# memory-consolidation Phase 2-A: archive 機能の生存期間(日)。
|
|
51
51
|
# DEFAULT_WINDOW_DAYS の 3 倍。要約ウィンドウから外れた直後すぐに archive せず、
|
|
52
52
|
# 過去サマリ再生成のための猶予を確保する。
|
|
53
53
|
# 環境変数 ``C3_CONSOLIDATE_ARCHIVE_TTL_DAYS`` で上書き可能。
|
|
@@ -56,7 +56,7 @@ DEFAULT_ARCHIVE_TTL_DAYS = DEFAULT_WINDOW_DAYS * 3
|
|
|
56
56
|
# 出力先(プロジェクトローカル)
|
|
57
57
|
OUTPUT_FILE_NAME = "consolidated_summary.md"
|
|
58
58
|
|
|
59
|
-
#
|
|
59
|
+
# memory-consolidation Phase 2-B: 半自動 promotion 候補ログの出力ファイル名
|
|
60
60
|
PROMOTION_CANDIDATES_FILE_NAME = "promotion-candidates.md"
|
|
61
61
|
|
|
62
62
|
# 候補ログの description 列の最大文字数(表セルの可読性確保)
|
|
@@ -65,7 +65,7 @@ _PROMOTION_DESC_MAX_LEN = 80
|
|
|
65
65
|
# 候補ログの ID 列の最大文字数(表セル幅を抑える、id が極端に長い場合の保険)
|
|
66
66
|
_PROMOTION_CID_MAX_LEN = 60
|
|
67
67
|
|
|
68
|
-
#
|
|
68
|
+
# memory-consolidation Phase 2-C: LLM 要約パラメータ
|
|
69
69
|
# LLM プロンプトに渡す入力テキストの最大文字数(「うまくいった」「失敗した」各セクション合計)
|
|
70
70
|
_LLM_INPUT_MAX_CHARS = 6000
|
|
71
71
|
# LLM 応答の最大文字数(超過時は末尾を切り詰めマーカーで上書き)
|
|
@@ -97,7 +97,7 @@ LOCK_STALE_SEC = 120
|
|
|
97
97
|
# `--llm-only` モードのフラグ
|
|
98
98
|
LLM_ONLY_FLAG = "--llm-only"
|
|
99
99
|
|
|
100
|
-
#
|
|
100
|
+
# memory-consolidation 消費側: CLAUDE.md @include 用の小ファイル(LLM 要約セクションのみ抽出)。
|
|
101
101
|
# 毎セッション開始時に Claude のコンテキストに自動注入されるため、
|
|
102
102
|
# サイズを LLM 要約の最大 4KB 程度に抑える。
|
|
103
103
|
LLM_SUMMARY_FILE_NAME = "llm_summary.md"
|
|
@@ -232,11 +232,11 @@ def write_summary(
|
|
|
232
232
|
) -> bool:
|
|
233
233
|
"""集約サマリを生成して指定パスに書き出す。
|
|
234
234
|
|
|
235
|
-
|
|
235
|
+
memory-consolidation Phase 2-B: ``patterns_path`` が指定された場合、末尾に
|
|
236
236
|
「## 昇格候補」サマリセクションを追加する(候補 ID + trust のみ、
|
|
237
237
|
詳細は ``promotion-candidates.md`` を参照)。
|
|
238
238
|
|
|
239
|
-
|
|
239
|
+
memory-consolidation Phase 2-C: ``enable_llm=True`` の場合、MVP セクションと
|
|
240
240
|
昇格候補セクションの間に「## LLM 要約」セクションを追加する。
|
|
241
241
|
LLM 要約は ``build_llm_summary_section()`` の判断でスキップされうる
|
|
242
242
|
(CLI 不在 / タイムアウト等)。
|
|
@@ -299,7 +299,7 @@ def write_summary(
|
|
|
299
299
|
|
|
300
300
|
|
|
301
301
|
# ---------------------------------------------------------------------------
|
|
302
|
-
#
|
|
302
|
+
# memory-consolidation Phase 2-B: 半自動 promotion 候補ログ
|
|
303
303
|
# ---------------------------------------------------------------------------
|
|
304
304
|
|
|
305
305
|
|
|
@@ -522,7 +522,7 @@ def _atomic_write(output_path: str, payload: str) -> bool:
|
|
|
522
522
|
|
|
523
523
|
|
|
524
524
|
# ---------------------------------------------------------------------------
|
|
525
|
-
#
|
|
525
|
+
# memory-consolidation Phase 2-C: claude --headless LLM 要約
|
|
526
526
|
# ---------------------------------------------------------------------------
|
|
527
527
|
|
|
528
528
|
|
|
@@ -555,7 +555,7 @@ def _build_llm_prompt(
|
|
|
555
555
|
if len(failure_text) > half:
|
|
556
556
|
failure_text = failure_text[:half] + "\n…(略)"
|
|
557
557
|
|
|
558
|
-
#
|
|
558
|
+
# memory-consolidation Phase 2-C [SR-AI-001 対策]: セッションデータ部分を XML タグで囲み、
|
|
559
559
|
# プロンプト命令文と明確に分離する。これによりセッション内容に誘導文
|
|
560
560
|
# ("以下の指示を無視" 等)が混入しても、LLM が命令文と区別しやすくなる。
|
|
561
561
|
return (
|
|
@@ -705,7 +705,7 @@ def build_llm_summary_section(
|
|
|
705
705
|
|
|
706
706
|
|
|
707
707
|
# ---------------------------------------------------------------------------
|
|
708
|
-
#
|
|
708
|
+
# memory-consolidation Phase 2-A: archive 機能
|
|
709
709
|
# ---------------------------------------------------------------------------
|
|
710
710
|
|
|
711
711
|
|
|
@@ -718,7 +718,7 @@ def archive_old_sessions(
|
|
|
718
718
|
) -> list[str]:
|
|
719
719
|
"""``ttl_days`` 日以上経過した session.tmp を ``archive_dir`` に移動する。
|
|
720
720
|
|
|
721
|
-
|
|
721
|
+
memory-consolidation Phase 2-A: session ファイルの永久蓄積を防ぐ。
|
|
722
722
|
同一 FS 内の ``shutil.move`` を使うため rename は基本的にアトミック。
|
|
723
723
|
|
|
724
724
|
Args:
|
|
@@ -1078,7 +1078,7 @@ def _llm_only_main() -> int:
|
|
|
1078
1078
|
)
|
|
1079
1079
|
# consolidated_summary.md 書き込み完了後、LLM 要約セクションだけを
|
|
1080
1080
|
# CLAUDE.md @include 用の llm_summary.md に抽出する(~4KB)。
|
|
1081
|
-
#
|
|
1081
|
+
# memory-consolidation 消費側: Claude が次セッションで自動的にコンテキスト参照する経路。
|
|
1082
1082
|
_write_llm_summary_extract()
|
|
1083
1083
|
except Exception as exc: # noqa: BLE001
|
|
1084
1084
|
print(
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
`.claude/skills/` 配下のファイルを Write / Edit したとき「実際のエージェント
|
|
8
8
|
動作で確認してください」というリマインダを stdout に出す。
|
|
9
9
|
|
|
10
|
-
2. デバッグ出力検出(
|
|
10
|
+
2. デバッグ出力検出(post-edit-scan):
|
|
11
11
|
Write / Edit 完了後に対象ファイルへ console.log / print( / TODO /
|
|
12
12
|
FIXME / XXX を検出して stderr に警告する。code-review-checklist.md の
|
|
13
13
|
「不要なデバッグ出力が残っていないか」項目を自動化する位置付け。
|
|
@@ -38,7 +38,7 @@ def _is_rm_rf(tokens: list[str], rm_idx: int) -> bool:
|
|
|
38
38
|
return has_r and has_f
|
|
39
39
|
|
|
40
40
|
|
|
41
|
-
# 秘密情報パターン (
|
|
41
|
+
# 秘密情報パターン (secret-scan)
|
|
42
42
|
# 検出値そのものは警告に含めない(二次漏洩防止)。パターン名のみを返す。
|
|
43
43
|
# 初期パターンは「= で続く値」を必須とすることで、シェルコメント
|
|
44
44
|
# (# password reset 等)の誤爆を回避する。
|
|
@@ -104,7 +104,7 @@ def main():
|
|
|
104
104
|
print(f'[PreToolUse BLOCK] 危険なコマンドをブロックしました: {cmd_preview}', file=sys.stderr)
|
|
105
105
|
sys.exit(2)
|
|
106
106
|
|
|
107
|
-
# 秘密情報の代入を検出: ブロック (
|
|
107
|
+
# 秘密情報の代入を検出: ブロック (secret-scan)
|
|
108
108
|
# bypass: C3_SKIP_SECRET_CHECK=1 で検出をスキップ(誤爆時の逃げ道)
|
|
109
109
|
if os.environ.get('C3_SKIP_SECRET_CHECK') != '1':
|
|
110
110
|
is_secret, pattern_name = _contains_secret(cmd)
|
{claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/.claude/hooks/record_review_decision.py
RENAMED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env python3
|
|
2
2
|
"""CLI: record a review decision in c3.db.review_decisions.
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
review-hint: dev-workflow フェーズ E でユーザーが「対応 / 許容 / 保留」を選んだ
|
|
5
5
|
判断を SQLite に記録するための薄い CLI ラッパー。実装本体は
|
|
6
6
|
``c3.db.insert_review_decision``。
|
|
7
7
|
|
{claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/.claude/hooks/record_tier_outcome.py
RENAMED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env python3
|
|
2
2
|
"""CLI: record the outcome of the previously-selected tier in tier_bandit.
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
tier-routing MVP: dev-workflow フェーズ E の承認/否認シグナルを受けて、
|
|
5
5
|
``select_tier.py`` が直近に書いた ``.claude/state/tier_selection.json`` を
|
|
6
6
|
読み、対応する Tier の (alpha, beta, trials) を ``tier_bandit`` テーブルで
|
|
7
7
|
更新する。
|
|
@@ -119,7 +119,7 @@ def _append_prompt_history(selection: dict, success: bool) -> None:
|
|
|
119
119
|
|
|
120
120
|
def main(argv: list[str] | None = None) -> int:
|
|
121
121
|
parser = argparse.ArgumentParser(
|
|
122
|
-
description="Record tier outcome for
|
|
122
|
+
description="Record tier outcome for tier-routing Thompson Sampling"
|
|
123
123
|
)
|
|
124
124
|
parser.add_argument(
|
|
125
125
|
"--outcome",
|
{claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/.claude/hooks/review_hint_inject.py
RENAMED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env python3
|
|
2
2
|
"""Inject past review decisions as hints into a review report.
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
review-hint: レビュー判断ヒント機能。code-reviewer / security-reviewer が
|
|
5
5
|
生成したレビューレポート(`.claude/reports/code-review-report-*.md` /
|
|
6
6
|
`security-review-report-*.md`)に、過去の許容例外・対応履歴を後付けで追記する。
|
|
7
7
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
-- C3 SQLite schema (
|
|
1
|
+
-- C3 SQLite schema (duckdb-hybrid: DuckDB ハイブリッド構成の基盤)
|
|
2
2
|
--
|
|
3
3
|
-- このファイルは session_start.py の _run_init_c3_db ハンドラから読まれ、
|
|
4
4
|
-- `.claude/state/c3.db` に対して冪等に CREATE TABLE IF NOT EXISTS で適用される。
|
|
@@ -20,7 +20,7 @@ DROP TABLE IF EXISTS po_results;
|
|
|
20
20
|
DROP TABLE IF EXISTS po_status;
|
|
21
21
|
|
|
22
22
|
-- ---------------------------------------------------------------------------
|
|
23
|
-
--
|
|
23
|
+
-- スキーマバージョン管理
|
|
24
24
|
-- ---------------------------------------------------------------------------
|
|
25
25
|
|
|
26
26
|
CREATE TABLE IF NOT EXISTS schema_version (
|
|
@@ -29,7 +29,7 @@ CREATE TABLE IF NOT EXISTS schema_version (
|
|
|
29
29
|
);
|
|
30
30
|
|
|
31
31
|
-- ---------------------------------------------------------------------------
|
|
32
|
-
--
|
|
32
|
+
-- review-hint: レビュー判断ヒント機能
|
|
33
33
|
-- ---------------------------------------------------------------------------
|
|
34
34
|
-- code-reviewer / security-reviewer の指摘に対して、人間が下した判断
|
|
35
35
|
-- (対応 / 許容 / 保留)と理由を蓄積する。次回以降のレビュー時に過去判断を
|
|
@@ -49,9 +49,7 @@ CREATE INDEX IF NOT EXISTS idx_review_decisions_checklist
|
|
|
49
49
|
ON review_decisions(checklist_id, decided_at DESC);
|
|
50
50
|
|
|
51
51
|
-- ---------------------------------------------------------------------------
|
|
52
|
-
--
|
|
53
|
-
-- ---------------------------------------------------------------------------
|
|
54
|
-
-- F-005: Tier 自動ルーティング(Thompson Sampling 学習データ)
|
|
52
|
+
-- tier-routing: Tier 自動ルーティング(Thompson Sampling 学習データ)
|
|
55
53
|
-- ---------------------------------------------------------------------------
|
|
56
54
|
-- タスク複雑度ごとに各 Tier の Beta(α, β) 事前分布を保持する。
|
|
57
55
|
-- α / β は完了ごとに更新され、サンプリングで次の Tier を選ぶ。
|
|
@@ -66,7 +64,7 @@ CREATE TABLE IF NOT EXISTS tier_bandit (
|
|
|
66
64
|
PRIMARY KEY (task_complexity, tier)
|
|
67
65
|
);
|
|
68
66
|
|
|
69
|
-
--
|
|
67
|
+
-- tier-routing Phase 2-B: 直近 N 件の outcome を保持して failure rate を計算する。
|
|
70
68
|
-- tier_bandit が「累積 α/β」の集約を持つのに対し、こちらは個別 event の履歴。
|
|
71
69
|
-- select_tier.py が直近 5 件以上で failure rate ≥ 0.5 を検出したら 1 段昇格する。
|
|
72
70
|
CREATE TABLE IF NOT EXISTS tier_recent_outcomes (
|
|
@@ -80,10 +78,10 @@ CREATE INDEX IF NOT EXISTS idx_tier_recent
|
|
|
80
78
|
ON tier_recent_outcomes(task_complexity, tier, ts DESC);
|
|
81
79
|
|
|
82
80
|
-- ---------------------------------------------------------------------------
|
|
83
|
-
--
|
|
81
|
+
-- subagent-metrics: SubagentStop メトリクス(既存 JSONL と並行運用)
|
|
84
82
|
-- ---------------------------------------------------------------------------
|
|
85
83
|
-- subagent_log.py が JSONL に追記している記録を SQLite にも保存する。
|
|
86
|
-
--
|
|
84
|
+
-- tier-routing の学習データ収集の前提。
|
|
87
85
|
-- 既存 .claude/logs/agent-runs.jsonl は移行までの間並行運用する。
|
|
88
86
|
|
|
89
87
|
CREATE TABLE IF NOT EXISTS agent_runs (
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env python3
|
|
2
2
|
"""UserPromptSubmit hook: recommend an LLM Tier (haiku/sonnet/opus) for the prompt.
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
tier-routing MVP: タスクの複雑度を簡易ヒューリスティックで推定し、Thompson Sampling
|
|
5
5
|
(または学習データ収集期は uniform random)で推奨 Tier を決定して
|
|
6
6
|
``additionalContext`` で親 Claude に伝える。
|
|
7
7
|
|
|
@@ -288,11 +288,11 @@ def write_tier_selection(
|
|
|
288
288
|
record_tier_outcome.py がこの json を読んで α/β を更新する。
|
|
289
289
|
既存ファイルは上書きされる(最新 1 件のみ保持)。
|
|
290
290
|
|
|
291
|
-
|
|
291
|
+
tier-routing Phase 2-A: ``suggested_model`` も併せて書く。runner.py がこれを読んで
|
|
292
292
|
PO 経由のサブエージェント起動時に ``claude --agents`` で動的に上書きする。
|
|
293
293
|
tier 名と model の短縮名は同一とする。
|
|
294
294
|
|
|
295
|
-
|
|
295
|
+
tier-routing Phase 2-B: ``escalated`` / ``escalation_reason`` を任意で含める。
|
|
296
296
|
failure rate に基づく昇格が起きた場合のみ True / 文字列が入る。
|
|
297
297
|
"""
|
|
298
298
|
os.makedirs(os.path.dirname(TIER_SELECTION_PATH), exist_ok=True)
|
|
@@ -345,7 +345,7 @@ def build_additional_context(
|
|
|
345
345
|
suffix += f" [複雑度判定: {complexity_source}]"
|
|
346
346
|
|
|
347
347
|
return (
|
|
348
|
-
f"[
|
|
348
|
+
f"[tier-routing 推奨] 複雑度: {complexity} / 推奨 Tier: {tier}({confidence})。"
|
|
349
349
|
f"PO 経由のサブエージェント起動時はこの推奨が claude --agents JSON で"
|
|
350
350
|
f" 自動適用されます(Phase 2-A)。親 Claude の Agent ツール経由は依然"
|
|
351
351
|
f" frontmatter 指定が優先されるため、コスト最適化したい場合は手動切替"
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
3 つの責務を順に実行する:
|
|
5
5
|
1. file-history のクリア(旧 clear_file_history.py)
|
|
6
6
|
2. sandbox 設定の有効化(旧 enable_sandbox.py、worktree ではスキップ)
|
|
7
|
-
3. C3 SQLite DB の初期化(旧 init_c3_db.py、
|
|
7
|
+
3. C3 SQLite DB の初期化(旧 init_c3_db.py、duckdb-hybrid 基盤)
|
|
8
8
|
|
|
9
9
|
各処理は独立しており、1 つが失敗しても他を実行する(exit 0 を返す)。
|
|
10
10
|
失敗してもセッションは止めない(C3 の他機能を妨げない方針)。
|
|
@@ -60,7 +60,7 @@ def ensure_session_initialized(path: str, date_str: str) -> None:
|
|
|
60
60
|
def extract_section(content: str, heading: str) -> str:
|
|
61
61
|
"""セッションファイル本文から ``## {heading}`` セクションの内容を抽出する。
|
|
62
62
|
|
|
63
|
-
|
|
63
|
+
memory-consolidation(MemoryConsolidation)と restore_session.py で共通利用される。
|
|
64
64
|
``## {heading}\\n`` から次の ``\\n## `` または ``\\n<!--`` または末尾までを返す。
|
|
65
65
|
見つからない場合は空文字列を返す。
|
|
66
66
|
|
|
@@ -49,16 +49,16 @@ _MAX_SCAN_LINES = 10_000
|
|
|
49
49
|
_EVENT_START = "SubagentStart"
|
|
50
50
|
_EVENT_STOP = "SubagentStop"
|
|
51
51
|
|
|
52
|
-
#
|
|
52
|
+
# po-sqlite Phase 2-B: SubagentStop の status 値の正常終了マーカー(仕様変更時の単一窓口)。
|
|
53
53
|
_STATUS_SUCCESS = "success"
|
|
54
54
|
|
|
55
|
-
#
|
|
55
|
+
# po-sqlite Phase 2-B: po_status.current_step の最大文字数 [SR-V-001]。
|
|
56
56
|
# payload.agent_type / agent_id は任意文字列のため DB 容量保護のため切り詰める。
|
|
57
57
|
_MAX_CURRENT_STEP_LEN = 200
|
|
58
58
|
|
|
59
59
|
# payload のホワイトリスト対象フィールド (sec-M-1)
|
|
60
|
-
#
|
|
61
|
-
# Tier 自動ルーティング (
|
|
60
|
+
# subagent-metrics: total_tokens / status / token_usage / model を追加。
|
|
61
|
+
# Tier 自動ルーティング (tier-routing) の学習データ収集の前提となる。
|
|
62
62
|
# result 系(応答本文・コード断片混入リスク)は意図的に除外。
|
|
63
63
|
_SAFE_PAYLOAD_FIELDS = frozenset({
|
|
64
64
|
'hook_event_name',
|
{claude_code_conductor-2.2.0 → claude_code_conductor-2.4.0}/.claude/rules/code-review-checklist.md
RENAMED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
# Code Review Checklist
|
|
2
2
|
|
|
3
3
|
各項目には `[CR-XX-NNN]` 形式の checklist_id を付与している。
|
|
4
|
-
レビュー時に指摘する場合はこの ID を併記すること(
|
|
4
|
+
レビュー時に指摘する場合はこの ID を併記すること(review-hint 機能の照合キー)。
|
|
5
|
+
|
|
6
|
+
**該当 ID がない指摘**は `[CR-NEW]` を使う。無理やり近い既存 ID にマッピングしないこと(review-hint の照合精度が落ち、チェックリストの成長機会も失われるため)。`[CR-NEW]` 指摘は本チェックリストへの追加候補として扱う。
|
|
5
7
|
|
|
6
8
|
## 必須チェック項目(全作成物共通)
|
|
7
9
|
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
# Security Review Checklist
|
|
2
2
|
|
|
3
3
|
各項目には `[SR-XX-NNN]` 形式の checklist_id を付与している。
|
|
4
|
-
レビュー時に指摘する場合はこの ID を併記すること(
|
|
4
|
+
レビュー時に指摘する場合はこの ID を併記すること(review-hint 機能の照合キー)。
|
|
5
|
+
|
|
6
|
+
**該当 ID がない指摘**は `[SR-NEW]` を使う。無理やり近い既存 ID にマッピングしないこと(review-hint の照合精度が落ち、チェックリストの成長機会も失われるため)。`[SR-NEW]` 指摘は本チェックリストへの追加候補として扱う。
|
|
5
7
|
|
|
6
8
|
## 必須チェック項目(OWASP Top 10 準拠・全作成物共通)
|
|
7
9
|
|