claude-code-conductor 2.31.1__tar.gz → 2.32.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 (202) hide show
  1. claude_code_conductor-2.32.0/.claude/hooks/recall_autorebuild.py +437 -0
  2. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/.claude/settings.json +6 -0
  3. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/CHANGELOG.md +13 -0
  4. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/PKG-INFO +1 -1
  5. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/src/c3/__init__.py +1 -1
  6. claude_code_conductor-2.32.0/tests/hooks/test_recall_autorebuild.py +1278 -0
  7. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/.claude/CLAUDE.md +0 -0
  8. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/.claude/agents/architect.md +0 -0
  9. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/.claude/agents/code-reviewer.md +0 -0
  10. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/.claude/agents/developer.md +0 -0
  11. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/.claude/agents/doc-writer.md +0 -0
  12. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/.claude/agents/interviewer.md +0 -0
  13. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/.claude/agents/planner.md +0 -0
  14. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/.claude/agents/project-setup.md +0 -0
  15. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/.claude/agents/security-reviewer.md +0 -0
  16. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/.claude/agents/systematic-debugger.md +0 -0
  17. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/.claude/agents/tester.md +0 -0
  18. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/.claude/agents/wt_developer.md +0 -0
  19. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/.claude/agents/wt_systematic-debugger.md +0 -0
  20. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/.claude/agents/wt_tester.md +0 -0
  21. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/.claude/breaking-changes.txt +0 -0
  22. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/.claude/deletions.txt +0 -0
  23. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/.claude/docs/config-policy.md +0 -0
  24. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/.claude/docs/parallel-agents-setup.md +0 -0
  25. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/.claude/docs/platform-adapters.md +0 -0
  26. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/.claude/docs/settings.json.md +0 -0
  27. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/.claude/hooks/_hook_utils.py +0 -0
  28. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/.claude/hooks/check_agent_invocation.py +0 -0
  29. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/.claude/hooks/consolidate_memory.py +0 -0
  30. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/.claude/hooks/permission_handler.py +0 -0
  31. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/.claude/hooks/permission_handler_toast.py +0 -0
  32. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/.claude/hooks/planner_check.py +0 -0
  33. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/.claude/hooks/post_tool.py +0 -0
  34. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/.claude/hooks/pre_compact.py +0 -0
  35. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/.claude/hooks/pre_tool.py +0 -0
  36. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/.claude/hooks/recall_inject.py +0 -0
  37. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/.claude/hooks/restore_session.py +0 -0
  38. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/.claude/hooks/select_tier.py +0 -0
  39. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/.claude/hooks/session_start.py +0 -0
  40. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/.claude/hooks/session_stop.py +0 -0
  41. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/.claude/hooks/session_utils.py +0 -0
  42. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/.claude/hooks/statusline.py +0 -0
  43. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/.claude/hooks/stop.py +0 -0
  44. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/.claude/hooks/worktree_guard.py +0 -0
  45. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/.claude/memory/.gitkeep +0 -0
  46. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/.claude/permission_rules.json +0 -0
  47. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/.claude/rules/promoted/index.md +0 -0
  48. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/.claude/skills/brainstorm/SKILL.md +0 -0
  49. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/.claude/skills/codex-review/SKILL.md +0 -0
  50. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/.claude/skills/dev-workflow/SKILL.md +0 -0
  51. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/.claude/skills/dev-workflow/references/code-review-checklist.md +0 -0
  52. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/.claude/skills/dev-workflow/references/design-rubric.md +0 -0
  53. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/.claude/skills/dev-workflow/references/interview-rubric.md +0 -0
  54. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/.claude/skills/dev-workflow/references/plan-design-guidelines.md +0 -0
  55. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/.claude/skills/dev-workflow/references/security-review-checklist.md +0 -0
  56. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/.claude/skills/dev-workflow/scripts/record_review_decision.py +0 -0
  57. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/.claude/skills/dev-workflow/scripts/record_tier_outcome.py +0 -0
  58. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/.claude/skills/dev-workflow/scripts/review_hint_inject.py +0 -0
  59. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/.claude/skills/develop/SKILL.md +0 -0
  60. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/.claude/skills/doc/SKILL.md +0 -0
  61. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/.claude/skills/extract-lib/SKILL.md +0 -0
  62. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/.claude/skills/init-session/SKILL.md +0 -0
  63. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/.claude/skills/mcp-config/SKILL.md +0 -0
  64. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/.claude/skills/parallel-agents/SKILL.md +0 -0
  65. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/.claude/skills/pattern-status/SKILL.md +0 -0
  66. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/.claude/skills/promote-pattern/SKILL.md +0 -0
  67. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/.claude/skills/recall/SKILL.md +0 -0
  68. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/.claude/skills/report-timestamp/SKILL.md +0 -0
  69. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/.claude/skills/report-timestamp/scripts/get_timestamp.py +0 -0
  70. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/.claude/skills/review-phase/SKILL.md +0 -0
  71. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/.claude/skills/setup/SKILL.md +0 -0
  72. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/.claude/skills/setup/reference.md +0 -0
  73. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/.claude/skills/setup/templates/coding-standards-template.md +0 -0
  74. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/.claude/skills/setup/templates/project-conventions-template.md +0 -0
  75. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/.claude/skills/start/SKILL.md +0 -0
  76. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/.claude/state/.gitkeep +0 -0
  77. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/.gitignore +0 -0
  78. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/ARCHITECTURE.md +0 -0
  79. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/LICENSE +0 -0
  80. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/LICENSES/chroma-hnswlib-LICENSE +0 -0
  81. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/LICENSES/chroma-hnswlib-NOTICE +0 -0
  82. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/LICENSES/fastembed-LICENSE +0 -0
  83. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/LICENSES/fastembed-NOTICE +0 -0
  84. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/LICENSES/onnxruntime-LICENSE +0 -0
  85. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/LICENSES/paraphrase-multilingual-MiniLM-L12-v2-LICENSE +0 -0
  86. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/README.md +0 -0
  87. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/hatch_build.py +0 -0
  88. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/pyproject.toml +0 -0
  89. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/src/c3/__main__.py +0 -0
  90. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/src/c3/_db_params.py +0 -0
  91. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/src/c3/_excludes.py +0 -0
  92. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/src/c3/_terminal.py +0 -0
  93. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/src/c3/adapters.py +0 -0
  94. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/src/c3/cli.py +0 -0
  95. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/src/c3/cli_ask.py +0 -0
  96. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/src/c3/cli_doctor.py +0 -0
  97. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/src/c3/cli_init.py +0 -0
  98. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/src/c3/cli_list.py +0 -0
  99. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/src/c3/cli_plan.py +0 -0
  100. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/src/c3/cli_recall.py +0 -0
  101. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/src/c3/cli_tier.py +0 -0
  102. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/src/c3/cli_update.py +0 -0
  103. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/src/c3/db.py +0 -0
  104. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/src/c3/embedding.py +0 -0
  105. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/src/c3/mcp_server.py +0 -0
  106. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/src/c3/migrate.py +0 -0
  107. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/src/c3/migrations/001_initial.sql +0 -0
  108. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/src/c3/migrations/002_agent_cost_runs.sql +0 -0
  109. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/src/c3/migrations/003_tier_cost.sql +0 -0
  110. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/src/c3/migrations/README.md +0 -0
  111. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/src/c3/migrations/__init__.py +0 -0
  112. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/src/c3/paths.py +0 -0
  113. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/src/c3/plan_validator.py +0 -0
  114. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/src/c3/platforms.py +0 -0
  115. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/src/c3/pricing.py +0 -0
  116. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/src/c3/question.py +0 -0
  117. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/src/c3/recall_chunker.py +0 -0
  118. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/src/c3/recall_index.py +0 -0
  119. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/src/c3/usage_ingester.py +0 -0
  120. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/tests/__init__.py +0 -0
  121. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/tests/conftest.py +0 -0
  122. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/tests/fixtures/usage/README.md +0 -0
  123. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/tests/fixtures/usage/mainline.jsonl +0 -0
  124. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/tests/fixtures/usage/subagents/agent-deadbeef.jsonl +0 -0
  125. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/tests/fixtures/usage/subagents/agent-deadbeef.meta.json +0 -0
  126. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/tests/hooks/__init__.py +0 -0
  127. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/tests/hooks/test_check_agent_invocation.py +0 -0
  128. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/tests/hooks/test_consolidate_memory.py +0 -0
  129. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/tests/hooks/test_hook_utils.py +0 -0
  130. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/tests/hooks/test_permission_handler.py +0 -0
  131. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/tests/hooks/test_permission_handler_toast.py +0 -0
  132. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/tests/hooks/test_pip_reinstall_reminder.py +0 -0
  133. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/tests/hooks/test_planner_check.py +0 -0
  134. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/tests/hooks/test_planner_check_dev.py +0 -0
  135. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/tests/hooks/test_post_tool.py +0 -0
  136. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/tests/hooks/test_pre_tool.py +0 -0
  137. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/tests/hooks/test_recall_inject.py +0 -0
  138. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/tests/hooks/test_record_review_decision.py +0 -0
  139. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/tests/hooks/test_record_tier_outcome.py +0 -0
  140. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/tests/hooks/test_restore_session.py +0 -0
  141. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/tests/hooks/test_review_hint_inject.py +0 -0
  142. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/tests/hooks/test_select_tier.py +0 -0
  143. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/tests/hooks/test_select_tier_escalation.py +0 -0
  144. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/tests/hooks/test_session_start.py +0 -0
  145. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/tests/hooks/test_session_stop.py +0 -0
  146. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/tests/hooks/test_session_utils.py +0 -0
  147. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/tests/hooks/test_settings_local_absolute_paths.py +0 -0
  148. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/tests/hooks/test_similarity_boost.py +0 -0
  149. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/tests/hooks/test_statusline.py +0 -0
  150. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/tests/hooks/test_statusline_template_sync.py +0 -0
  151. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/tests/hooks/test_sync_check.py +0 -0
  152. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/tests/hooks/test_template_guard.py +0 -0
  153. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/tests/skills/__init__.py +0 -0
  154. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/tests/skills/_skill_helpers.py +0 -0
  155. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/tests/skills/test_dev_workflow_no_task_type.py +0 -0
  156. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/tests/skills/test_init_session_no_task_type.py +0 -0
  157. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/tests/skills/test_planner_lightweight.py +0 -0
  158. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/tests/skills/test_recall_skill.py +0 -0
  159. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/tests/skills/test_session_backlog_reconciliation.py +0 -0
  160. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/tests/skills/test_setup_templates.py +0 -0
  161. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/tests/skills/test_start_skill_bugfix_flow.py +0 -0
  162. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/tests/skills/test_start_skill_new_flow.py +0 -0
  163. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/tests/skills/test_start_skill_security_audit_phase.py +0 -0
  164. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/tests/test_adapters.py +0 -0
  165. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/tests/test_check_deletions.py +0 -0
  166. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/tests/test_cli_ask.py +0 -0
  167. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/tests/test_cli_doctor.py +0 -0
  168. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/tests/test_cli_entry.py +0 -0
  169. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/tests/test_cli_init.py +0 -0
  170. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/tests/test_cli_list.py +0 -0
  171. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/tests/test_cli_plan.py +0 -0
  172. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/tests/test_cli_recall.py +0 -0
  173. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/tests/test_cli_tier.py +0 -0
  174. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/tests/test_cli_update_breaking_changes.py +0 -0
  175. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/tests/test_cli_update_deletions.py +0 -0
  176. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/tests/test_db.py +0 -0
  177. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/tests/test_docstring_consistency.py +0 -0
  178. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/tests/test_embedding.py +0 -0
  179. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/tests/test_excludes.py +0 -0
  180. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/tests/test_extract_breaking_changes.py +0 -0
  181. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/tests/test_mcp_server_elicit.py +0 -0
  182. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/tests/test_migrate.py +0 -0
  183. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/tests/test_paths.py +0 -0
  184. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/tests/test_plan_validator.py +0 -0
  185. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/tests/test_pre_compact.py +0 -0
  186. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/tests/test_pre_tool_hook.py +0 -0
  187. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/tests/test_precompact_additional.py +0 -0
  188. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/tests/test_precompact_toctou_fixes.py +0 -0
  189. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/tests/test_pricing.py +0 -0
  190. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/tests/test_recall_chunker.py +0 -0
  191. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/tests/test_recall_index.py +0 -0
  192. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/tests/test_references_migration.py +0 -0
  193. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/tests/test_session_utils_additional.py +0 -0
  194. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/tests/test_skill_no_builtin_conflict.py +0 -0
  195. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/tests/test_statusline.py +0 -0
  196. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/tests/test_stop_additional.py +0 -0
  197. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/tests/test_stop_hook.py +0 -0
  198. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/tests/test_stop_precompact_fixes.py +0 -0
  199. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/tests/test_sync_template_stop.py +0 -0
  200. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/tests/test_template_pre_tool_hook.py +0 -0
  201. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/tests/test_usage_ingester.py +0 -0
  202. {claude_code_conductor-2.31.1 → claude_code_conductor-2.32.0}/tests/test_worktree_guard.py +0 -0
@@ -0,0 +1,437 @@
1
+ #!/usr/bin/env python3
2
+ """Stop hook: automatically rebuild the recall index when it is stale.
3
+
4
+ Mode 1 (default / Stop hook):
5
+ Checks if the recall index exists and is stale, then spawns this same
6
+ script as a detached background worker (Mode 2) and exits immediately
7
+ (exit 0, no blocking).
8
+
9
+ Mode 2 (--rebuild-worker):
10
+ Invoked by Mode 1. Runs ``c3 recall rebuild --target <repo_root>``
11
+ via subprocess, then releases the lock in a finally block.
12
+
13
+ The hook never outputs ``{"decision": "block"}`` and never blocks the
14
+ Claude turn from completing (ADR-5).
15
+ """
16
+
17
+ from __future__ import annotations
18
+
19
+ import json
20
+ import os
21
+ import subprocess
22
+ import sys
23
+ import time
24
+ from pathlib import Path
25
+
26
+ # CLAUDE.md §9-3: reconfigure stdout/stderr to UTF-8 on Windows.
27
+ try:
28
+ if sys.stdout and hasattr(sys.stdout, "reconfigure"):
29
+ sys.stdout.reconfigure(encoding="utf-8")
30
+ if sys.stderr and hasattr(sys.stderr, "reconfigure"):
31
+ sys.stderr.reconfigure(encoding="utf-8")
32
+ except AttributeError:
33
+ pass
34
+
35
+ # ---------------------------------------------------------------------------
36
+ # Constants
37
+ # ---------------------------------------------------------------------------
38
+
39
+ _DISABLE_ENV_VAR = "C3_RECALL_AUTOREBUILD_DISABLE"
40
+
41
+ # Lock TTL in seconds. rebuild normally finishes in tens of seconds;
42
+ # 600 s gives a generous safety margin (ADR-3).
43
+ _LOCK_TTL = 600
44
+
45
+ # Worker subprocess timeout (seconds).
46
+ # Intentionally equal to _LOCK_TTL: the lock becomes reclaimable as stale
47
+ # immediately after the worker timeout fires, preventing a stuck lock state.
48
+ _WORKER_TIMEOUT = 600
49
+
50
+ # Stale source globs — keep in sync with recall_inject._STALE_SOURCE_GLOBS.
51
+ # CR-L-02: these must mirror c3.recall_index.collect_sources source kinds.
52
+ _STALE_SOURCE_GLOBS = (
53
+ (Path(".claude") / "memory" / "sessions", "*.tmp"),
54
+ (Path(".claude") / "agent-memory", "*.md"),
55
+ (Path(".claude") / "reports" / "archive", "*.md"),
56
+ )
57
+ _STALE_PATTERNS_JSON = Path(".claude") / "memory" / "patterns.json"
58
+
59
+
60
+ # ---------------------------------------------------------------------------
61
+ # Pure helper functions (testable without side effects)
62
+ # ---------------------------------------------------------------------------
63
+
64
+
65
+ def find_repo_root() -> Path | None:
66
+ """Return the directory containing ``.claude/``, or None.
67
+
68
+ When CLAUDE_PROJECT_DIR is set, only that exact directory is checked
69
+ (no ancestor traversal). This prevents false positives when running
70
+ inside a temp directory whose parent happens to contain ``.claude``.
71
+
72
+ When CLAUDE_PROJECT_DIR is not set, searches from cwd upward.
73
+
74
+ Note: this intentionally differs from ``recall_inject.find_repo_root``.
75
+ ``recall_inject`` always walks upward from cwd regardless of
76
+ CLAUDE_PROJECT_DIR; this hook skips ancestor traversal when the env var
77
+ is set to avoid false positives in hook context (temp-dir invocations).
78
+ Cross-reference: .claude/hooks/recall_inject.py ``find_repo_root``.
79
+ """
80
+ env_dir = os.getenv("CLAUDE_PROJECT_DIR")
81
+ if env_dir:
82
+ try:
83
+ candidate = Path(env_dir).resolve()
84
+ except (OSError, ValueError):
85
+ # L-04 [SR-V-001]: null バイト等の不正パスで resolve() が ValueError を投げる場合
86
+ # 例外を伝播させず None を返す(ADR-6)。
87
+ return None
88
+ if (candidate / ".claude").is_dir():
89
+ return candidate
90
+ return None
91
+ # No env override: walk upward from cwd.
92
+ here = Path.cwd().resolve()
93
+ for candidate in [here, *here.parents]:
94
+ if (candidate / ".claude").is_dir():
95
+ return candidate
96
+ return None
97
+
98
+
99
+ def index_exists(repo_root: Path) -> bool:
100
+ """Return True if the recall HNSW index file exists.
101
+
102
+ Only ``recall.hnsw`` is checked — not ``recall_meta.json`` — because
103
+ this hook's purpose is to trigger a rebuild when the index is stale.
104
+ If the binary index is present (even without a metadata sidecar),
105
+ the stale check in ``index_is_stale_fast`` is meaningful and we should
106
+ proceed. ``recall_inject`` checks both files because it needs a valid
107
+ meta to run a search; we do not run a search here.
108
+ """
109
+ index = repo_root / ".claude" / "state" / "recall.hnsw"
110
+ return index.exists()
111
+
112
+
113
+ def index_is_stale_fast(repo_root: Path) -> bool:
114
+ """Return True if any recall source file is newer than the index.
115
+
116
+ Uses only stat() calls — never reads file contents — to stay fast
117
+ enough for every-Stop invocation (ADR-1).
118
+
119
+ Stale source globs are kept in sync with recall_inject._STALE_SOURCE_GLOBS
120
+ (CR-L-02: mirror c3.recall_index.collect_sources when adding/removing
121
+ source kinds).
122
+
123
+ Symlinks are skipped to avoid reading mtime of files outside the
124
+ C3 source tree.
125
+ """
126
+ index_path = repo_root / ".claude" / "state" / "recall.hnsw"
127
+ if not index_path.exists():
128
+ # Defensive guard for independent callers: main() already checks
129
+ # index_exists() before calling this function, but callers outside
130
+ # main() benefit from this early return rather than silently
131
+ # returning False with no indication of the missing index.
132
+ return False
133
+ try:
134
+ index_mtime = index_path.stat().st_mtime
135
+ except OSError:
136
+ return False
137
+
138
+ for rel_dir, pattern in _STALE_SOURCE_GLOBS:
139
+ absolute = repo_root / rel_dir
140
+ if not absolute.is_dir():
141
+ continue
142
+ for path in absolute.rglob(pattern):
143
+ # Skip symlinks (Cycle2-L-1 guard), non-files, and .gitkeep
144
+ # (parity with recall_inject.index_is_stale: .gitkeep files are
145
+ # placeholder markers, not actual recall source content).
146
+ if path.is_symlink() or not path.is_file() or path.name == ".gitkeep":
147
+ continue
148
+ try:
149
+ if path.stat().st_mtime > index_mtime:
150
+ return True
151
+ except OSError:
152
+ continue
153
+
154
+ patterns_path = repo_root / _STALE_PATTERNS_JSON
155
+ if patterns_path.is_file() and not patterns_path.is_symlink():
156
+ try:
157
+ if patterns_path.stat().st_mtime > index_mtime:
158
+ return True
159
+ except OSError:
160
+ pass
161
+
162
+ return False
163
+
164
+
165
+ def is_worktree(repo_root: Path) -> bool:
166
+ """Return True if repo_root is a git worktree (i.e. .git is a file).
167
+
168
+ In a normal repository, .git is a directory.
169
+ In a git worktree, .git is a file containing a ``gitdir:`` pointer.
170
+ We skip rebuild in worktrees to avoid spurious multi-index rebuilds
171
+ during parallel-agents runs (ADR-4).
172
+ """
173
+ dot_git = repo_root / ".git"
174
+ return dot_git.is_file()
175
+
176
+
177
+ def _lock_path_for(repo_root: Path) -> Path:
178
+ """Return the canonical lock file path for the given repo root."""
179
+ return repo_root / ".claude" / "state" / "recall_rebuild.lock"
180
+
181
+
182
+ def acquire_lock(lock_path: Path, ttl: int, now: float | None = None) -> Path | None:
183
+ """Attempt to acquire the rebuild lock atomically.
184
+
185
+ Uses os.open(O_CREAT|O_EXCL) for cross-platform atomic creation.
186
+
187
+ - If the lock does not exist: create it and return a truthy token.
188
+ - If the lock exists and mtime + ttl > now (fresh): return None (failed).
189
+ - If the lock exists and mtime + ttl <= now (stale): remove it,
190
+ then create a new lock and return a truthy token (ADR-3).
191
+
192
+ TOCTOU note: between the stale-lock deletion and the O_EXCL creation,
193
+ another process may race to create the lock first. In that case
194
+ ``os.open`` raises ``FileExistsError`` and this function returns ``None``.
195
+ Returning ``None`` here is correct and expected behaviour — the other
196
+ process won the race and will perform the rebuild.
197
+
198
+ ``now`` is injectable for deterministic testing.
199
+ """
200
+ if now is None:
201
+ now = time.time()
202
+
203
+ # Check for existing lock.
204
+ if lock_path.exists():
205
+ try:
206
+ mtime = lock_path.stat().st_mtime
207
+ except OSError:
208
+ mtime = 0.0
209
+ if mtime + ttl > now:
210
+ # Fresh lock held by another process — refuse acquisition.
211
+ return None
212
+ # Stale lock — remove and fall through to create a new one.
213
+ try:
214
+ lock_path.unlink()
215
+ except OSError:
216
+ pass
217
+
218
+ # Atomic create via O_CREAT|O_EXCL.
219
+ # L-01 [SR-NEW]: 0o600 を明示してロックファイルを所有者のみ読み書き可能に制限する。
220
+ # Windows は mode 引数を無視するが、指定しても無害。
221
+ try:
222
+ fd = os.open(
223
+ str(lock_path),
224
+ os.O_CREAT | os.O_EXCL | os.O_WRONLY,
225
+ 0o600,
226
+ )
227
+ except FileExistsError:
228
+ # Another process won the race.
229
+ return None
230
+ except OSError:
231
+ return None
232
+
233
+ try:
234
+ content = json.dumps({"pid": os.getpid(), "started": now}).encode()
235
+ os.write(fd, content)
236
+ finally:
237
+ os.close(fd)
238
+
239
+ return lock_path # Truthy token.
240
+
241
+
242
+ def release_lock(lock_path: Path) -> None:
243
+ """Remove the lock file. Safe to call even if the file does not exist."""
244
+ try:
245
+ lock_path.unlink()
246
+ except FileNotFoundError:
247
+ pass
248
+ except OSError:
249
+ pass
250
+
251
+
252
+ def build_worker_argv(self_path: Path, repo_root: Path) -> list[str]:
253
+ """Return the argv list to launch this script as a rebuild worker.
254
+
255
+ The resulting command is:
256
+ python <self_path> --rebuild-worker --target <repo_root>
257
+ """
258
+ return [
259
+ sys.executable,
260
+ str(self_path),
261
+ "--rebuild-worker",
262
+ "--target",
263
+ str(repo_root),
264
+ ]
265
+
266
+
267
+ def spawn_detached(repo_root: Path) -> None:
268
+ """Launch this script in worker mode as a detached background process.
269
+
270
+ Platform specifics (ADR-2):
271
+ - Windows: DETACHED_PROCESS | CREATE_NEW_PROCESS_GROUP | CREATE_NO_WINDOW
272
+ - POSIX: start_new_session=True
273
+ - Common: close_fds=True, stdin/stdout/stderr=DEVNULL
274
+ """
275
+ self_path = Path(__file__).resolve()
276
+ argv = build_worker_argv(self_path, repo_root)
277
+ devnull = subprocess.DEVNULL
278
+
279
+ # L-02 [SR-K-003]: ANTHROPIC_/CLAUDE_/OPENAI_ プレフィックスの変数を除外した最小 env を構成する。
280
+ # Note: CLAUDE_PROJECT_DIR も CLAUDE_ プレフィックスで除外されるが、worker は
281
+ # --target 引数で repo_root を受け取るため CLAUDE_PROJECT_DIR 除外の影響を受けない。
282
+ _EXCLUDED_PREFIXES = ("ANTHROPIC_", "CLAUDE_", "OPENAI_")
283
+ env = {
284
+ k: v
285
+ for k, v in os.environ.items()
286
+ if not any(k.upper().startswith(p) for p in _EXCLUDED_PREFIXES)
287
+ }
288
+
289
+ kwargs: dict = {
290
+ "close_fds": True,
291
+ "stdin": devnull,
292
+ "stdout": devnull,
293
+ "stderr": devnull,
294
+ "env": env,
295
+ }
296
+ if sys.platform == "win32":
297
+ kwargs["creationflags"] = (
298
+ subprocess.DETACHED_PROCESS
299
+ | subprocess.CREATE_NEW_PROCESS_GROUP
300
+ | subprocess.CREATE_NO_WINDOW
301
+ )
302
+ else:
303
+ kwargs["start_new_session"] = True
304
+
305
+ subprocess.Popen(argv, **kwargs)
306
+
307
+
308
+ def run_rebuild_worker(repo_root: Path) -> None:
309
+ """Mode 2: run ``c3 recall rebuild --target <repo_root>`` synchronously.
310
+
311
+ Releases the lock in a finally block regardless of success or failure
312
+ (ADR-3).
313
+ """
314
+ # M-01 [SR-V-002]: --target パスの .claude/ 存在を検証し、なければ rebuild しない。
315
+ # 不正なターゲット(シンボリックアタック等)による意図しない rebuild を防止する。
316
+ if not (repo_root / ".claude").is_dir():
317
+ return
318
+
319
+ # L-03 [SR-R-004]: C3_RECALL_AUTOREBUILD_DEBUG=1 のとき子プロセスの stderr を親に継承させる。
320
+ # None を渡すと subprocess.run のデフォルト(親 stderr 継承)になる。
321
+ debug = os.environ.get("C3_RECALL_AUTOREBUILD_DEBUG") == "1"
322
+ stderr_target = None if debug else subprocess.DEVNULL
323
+
324
+ # Windows: 孫プロセス(c3 recall rebuild = console app の python.exe)が
325
+ # 新しいコンソールウィンドウを確保して一瞬表示されるのを防ぐ。worker 自身は
326
+ # DETACHED_PROCESS でコンソールを持たないため、明示しないと孫が新規確保する。
327
+ run_kwargs: dict = {
328
+ "stdin": subprocess.DEVNULL,
329
+ "stdout": subprocess.DEVNULL,
330
+ "stderr": stderr_target,
331
+ "timeout": _WORKER_TIMEOUT,
332
+ }
333
+ if sys.platform == "win32":
334
+ run_kwargs["creationflags"] = subprocess.CREATE_NO_WINDOW
335
+
336
+ lock_path = _lock_path_for(repo_root)
337
+ try:
338
+ subprocess.run(
339
+ [
340
+ sys.executable,
341
+ "-m",
342
+ "c3.cli",
343
+ "recall",
344
+ "rebuild",
345
+ "--target",
346
+ str(repo_root),
347
+ ],
348
+ **run_kwargs,
349
+ )
350
+ except Exception as e:
351
+ sys.stderr.write(f"[recall_autorebuild] worker error: {type(e).__name__}\n")
352
+ finally:
353
+ release_lock(lock_path)
354
+
355
+
356
+ # ---------------------------------------------------------------------------
357
+ # Main entry point
358
+ # ---------------------------------------------------------------------------
359
+
360
+
361
+ def main() -> int:
362
+ """Stop hook entry point. Always returns 0 (never blocks Claude turn).
363
+
364
+ Flow (ADR-5, ADR-6):
365
+ 1. Check disable env var.
366
+ 2. Read Stop payload from stdin (errors are swallowed).
367
+ 3. Resolve repo root; skip if unknown.
368
+ 4. Skip if inside a git worktree (ADR-4).
369
+ 5. Skip if recall index does not exist.
370
+ 6. Skip if index is not stale (ADR-1).
371
+ 7. Acquire rebuild lock (skip on contention / ADR-3).
372
+ 8. Spawn worker; release lock on spawn failure.
373
+ """
374
+ # 1. Disable env var.
375
+ if os.environ.get(_DISABLE_ENV_VAR) == "1":
376
+ return 0
377
+
378
+ # 2. Read stdin (Stop payload). Errors are harmless — we don't use
379
+ # the payload for anything meaningful here, just consume it.
380
+ try:
381
+ sys.stdin.read()
382
+ except Exception:
383
+ pass
384
+
385
+ try:
386
+ # 3. Repo root.
387
+ repo_root = find_repo_root()
388
+ if repo_root is None:
389
+ return 0
390
+
391
+ # 4. Worktree guard.
392
+ if is_worktree(repo_root):
393
+ return 0
394
+
395
+ # 5. Index existence.
396
+ if not index_exists(repo_root):
397
+ return 0
398
+
399
+ # 6. Stale check (stat only — ADR-1).
400
+ if not index_is_stale_fast(repo_root):
401
+ return 0
402
+
403
+ # 7. Acquire lock.
404
+ lock_path = _lock_path_for(repo_root)
405
+ token = acquire_lock(lock_path, _LOCK_TTL)
406
+ if token is None:
407
+ return 0
408
+
409
+ # 8. Spawn detached worker.
410
+ try:
411
+ spawn_detached(repo_root)
412
+ except Exception:
413
+ release_lock(lock_path)
414
+
415
+ except Exception:
416
+ pass
417
+
418
+ return 0
419
+
420
+
421
+ # ---------------------------------------------------------------------------
422
+ # Worker mode dispatch
423
+ # ---------------------------------------------------------------------------
424
+
425
+ if __name__ == "__main__":
426
+ if "--rebuild-worker" in sys.argv:
427
+ # Mode 2: resolve --target and run rebuild worker.
428
+ try:
429
+ idx = sys.argv.index("--target")
430
+ repo_root = Path(sys.argv[idx + 1]).resolve()
431
+ except (ValueError, IndexError):
432
+ sys.exit(0)
433
+ run_rebuild_worker(repo_root)
434
+ sys.exit(0)
435
+ else:
436
+ # Mode 1: Stop hook.
437
+ sys.exit(main())
@@ -7,6 +7,7 @@
7
7
  "Bash(python .claude/hooks/restore_session.py*)",
8
8
  "Bash(python .claude/hooks/permission_handler.py*)",
9
9
  "Bash(python .claude/hooks/statusline.py*)",
10
+ "Bash(python .claude/hooks/recall_autorebuild.py*)",
10
11
  "Bash(python .claude/skills/dev-workflow/scripts/review_hint_inject.py*)",
11
12
  "Bash(python .claude/skills/dev-workflow/scripts/record_review_decision.py*)",
12
13
  "Bash(python .claude/skills/dev-workflow/scripts/record_tier_outcome.py*)",
@@ -214,6 +215,11 @@
214
215
  "type": "command",
215
216
  "command": "python",
216
217
  "args": ["${CLAUDE_PROJECT_DIR}/.claude/hooks/session_stop.py"]
218
+ },
219
+ {
220
+ "type": "command",
221
+ "command": "python",
222
+ "args": ["${CLAUDE_PROJECT_DIR}/.claude/hooks/recall_autorebuild.py"]
217
223
  }
218
224
  ]
219
225
  }
@@ -1,5 +1,18 @@
1
1
  # Changelog
2
2
 
3
+ ## [2.32.0] - 2026-06-07
4
+
5
+ **recall 索引の自動リビルドを配布物に追加(機能追加・破壊的変更なし)**: 配布元で試作・運用していた Stop hook `recall_autorebuild.py` を配布物(`.claude/hooks/`)へ昇格し、全利用先で**既定有効**にした。セッション終了(Stop)ごとに recall 索引(`.claude/state/recall.hnsw`)が stale かを stat のみで軽量判定し、stale なら `c3 recall rebuild` を detached background プロセスで起動して索引を自動で新鮮化する。LLM 非関与の決定論的 CLI を呼ぶだけなので、過去に `llm_summary.md`(summarize-memory)廃止の真因となった LLM 出力汚染・Stop 自己再トリガーループは原理的に発生しない。
6
+
7
+ ### 追加
8
+
9
+ - **`.claude/hooks/recall_autorebuild.py`(新規・配布 hook)**: Stop hook。Mode1=判定して detached spawn、Mode2(`--rebuild-worker`)=`python -m c3.cli recall rebuild --target <root>` を実行しロックを finally で解放。多重ガード: 索引未構築なら no-op(`index_exists`)/stale でなければ skip/git worktree では skip(parallel-agents 中の多重リビルド回避)/ロック(`O_CREAT|O_EXCL` + TTL 600s・stale 回収)で多重起動防止/常に exit 0(Claude のターンをブロックしない・`decision:block` を出さない)/spawn 子 env から `ANTHROPIC_`/`CLAUDE_`/`OPENAI_` を除外/Windows は `CREATE_NO_WINDOW`/3 OS 対応。`C3_RECALL_AUTOREBUILD_DISABLE=1` で無効化、`C3_RECALL_AUTOREBUILD_DEBUG=1` で worker stderr 継承。
10
+ - **`.claude/settings.json` の Stop に登録**(`session_stop.py` と並列)し、`Bash(python .claude/hooks/recall_autorebuild.py*)` を allow に追加。
11
+
12
+ ### 後方互換
13
+
14
+ - 追加 hook のみで公開 API・CLI・DB スキーマ・他 hook に変更なし。recall 索引を構築していない利用先では `index_exists` で no-op となり無影響。既定有効だが `C3_RECALL_AUTOREBUILD_DISABLE=1` でオプトアウト可能。**破壊的変更なし**・migration 不要。
15
+
3
16
  ## [2.31.1] - 2026-06-06
4
17
 
5
18
  **ドキュメント PATCH(コード変更・破壊的変更・migration なし)**: v2.31.0 で導入した動的ヒアリング/設計ルーブリックの Step 1(既知情報の取り込み)に、**資料ドリブンの壁打ち**を明文化した。ユーザーが提示した資料(PDF / 画像 / 既存の要件定義書・ドキュメント等)を Read で読み込み、床観点の判明マークに反映する。ユーザーに指示書の事前執筆を求めず、既に持っている資料を土台に未知だけを動的に掘る方針。
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: claude-code-conductor
3
- Version: 2.31.1
3
+ Version: 2.32.0
4
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
@@ -1,3 +1,3 @@
1
1
  """Claude Code Conductor (C3) - multi-agent orchestration framework for Claude Code."""
2
2
 
3
- __version__ = "2.31.1"
3
+ __version__ = "2.32.0"