claude-code-conductor 2.18.0__tar.gz → 2.20.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.20.0/.claude/breaking-changes.txt +8 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/.claude/deletions.txt +3 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/.claude/docs/config-policy.md +20 -20
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/.claude/docs/settings.json.md +3 -2
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/.claude/hooks/session_start.py +49 -39
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/CHANGELOG.md +138 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/PKG-INFO +1 -1
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/hatch_build.py +1 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/src/c3/__init__.py +1 -1
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/src/c3/_excludes.py +1 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/src/c3/cli_update.py +426 -2
- claude_code_conductor-2.20.0/src/c3/migrate.py +260 -0
- claude_code_conductor-2.18.0/.claude/hooks/schema.sql → claude_code_conductor-2.20.0/src/c3/migrations/001_initial.sql +30 -12
- claude_code_conductor-2.20.0/src/c3/migrations/README.md +90 -0
- claude_code_conductor-2.20.0/src/c3/migrations/__init__.py +1 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/tests/hooks/test_record_tier_outcome.py +2 -6
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/tests/hooks/test_review_hint_inject.py +2 -7
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/tests/hooks/test_select_tier.py +2 -6
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/tests/hooks/test_select_tier_escalation.py +2 -6
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/tests/hooks/test_session_start.py +178 -46
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/tests/test_cli_tier.py +2 -6
- claude_code_conductor-2.20.0/tests/test_cli_update_breaking_changes.py +531 -0
- claude_code_conductor-2.20.0/tests/test_extract_breaking_changes.py +190 -0
- claude_code_conductor-2.20.0/tests/test_migrate.py +457 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/.claude/CLAUDE.md +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/.claude/agents/architect.md +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/.claude/agents/code-reviewer.md +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/.claude/agents/developer.md +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/.claude/agents/doc-writer.md +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/.claude/agents/interviewer.md +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/.claude/agents/planner.md +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/.claude/agents/project-setup.md +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/.claude/agents/security-reviewer.md +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/.claude/agents/systematic-debugger.md +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/.claude/agents/tester.md +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/.claude/agents/wt_developer.md +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/.claude/agents/wt_systematic-debugger.md +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/.claude/agents/wt_tester.md +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/.claude/docs/parallel-agents-setup.md +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/.claude/docs/platform-adapters.md +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/.claude/hooks/_hook_utils.py +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/.claude/hooks/check_agent_invocation.py +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/.claude/hooks/consolidate_memory.py +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/.claude/hooks/permission_handler.py +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/.claude/hooks/permission_handler_toast.py +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/.claude/hooks/planner_check.py +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/.claude/hooks/post_tool.py +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/.claude/hooks/pre_compact.py +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/.claude/hooks/pre_tool.py +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/.claude/hooks/recall_inject.py +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/.claude/hooks/restore_session.py +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/.claude/hooks/select_tier.py +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/.claude/hooks/session_stop.py +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/.claude/hooks/session_utils.py +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/.claude/hooks/statusline.py +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/.claude/hooks/stop.py +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/.claude/hooks/worktree_guard.py +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/.claude/memory/.gitkeep +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/.claude/permission_rules.json +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/.claude/rules/promoted/index.md +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/.claude/settings.json +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/.claude/skills/codex-review/SKILL.md +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/.claude/skills/dev-workflow/SKILL.md +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/.claude/skills/dev-workflow/references/code-review-checklist.md +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/.claude/skills/dev-workflow/references/plan-design-guidelines.md +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/.claude/skills/dev-workflow/references/security-review-checklist.md +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/.claude/skills/dev-workflow/scripts/record_review_decision.py +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/.claude/skills/dev-workflow/scripts/record_tier_outcome.py +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/.claude/skills/dev-workflow/scripts/review_hint_inject.py +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/.claude/skills/develop/SKILL.md +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/.claude/skills/doc/SKILL.md +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/.claude/skills/extract-lib/SKILL.md +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/.claude/skills/init-session/SKILL.md +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/.claude/skills/mcp-config/SKILL.md +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/.claude/skills/parallel-agents/SKILL.md +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/.claude/skills/pattern-status/SKILL.md +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/.claude/skills/promote-pattern/SKILL.md +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/.claude/skills/recall/SKILL.md +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/.claude/skills/report-timestamp/SKILL.md +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/.claude/skills/report-timestamp/scripts/get_timestamp.py +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/.claude/skills/review-phase/SKILL.md +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/.claude/skills/setup/SKILL.md +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/.claude/skills/setup/reference.md +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/.claude/skills/setup/templates/coding-standards-template.md +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/.claude/skills/setup/templates/project-conventions-template.md +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/.claude/skills/start/SKILL.md +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/.claude/state/.gitkeep +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/.gitignore +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/LICENSE +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/LICENSES/chroma-hnswlib-LICENSE +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/LICENSES/chroma-hnswlib-NOTICE +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/LICENSES/fastembed-LICENSE +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/LICENSES/fastembed-NOTICE +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/LICENSES/onnxruntime-LICENSE +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/LICENSES/paraphrase-multilingual-MiniLM-L12-v2-LICENSE +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/README.md +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/pyproject.toml +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/src/c3/__main__.py +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/src/c3/_terminal.py +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/src/c3/adapters.py +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/src/c3/cli.py +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/src/c3/cli_ask.py +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/src/c3/cli_doctor.py +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/src/c3/cli_init.py +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/src/c3/cli_list.py +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/src/c3/cli_plan.py +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/src/c3/cli_recall.py +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/src/c3/cli_tier.py +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/src/c3/db.py +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/src/c3/embedding.py +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/src/c3/mcp_server.py +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/src/c3/paths.py +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/src/c3/plan_validator.py +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/src/c3/platforms.py +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/src/c3/question.py +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/src/c3/recall_chunker.py +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/src/c3/recall_index.py +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/tests/__init__.py +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/tests/conftest.py +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/tests/hooks/__init__.py +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/tests/hooks/test_check_agent_invocation.py +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/tests/hooks/test_consolidate_memory.py +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/tests/hooks/test_hook_utils.py +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/tests/hooks/test_permission_handler.py +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/tests/hooks/test_permission_handler_toast.py +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/tests/hooks/test_pip_reinstall_reminder.py +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/tests/hooks/test_planner_check.py +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/tests/hooks/test_planner_check_dev.py +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/tests/hooks/test_post_tool.py +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/tests/hooks/test_pre_tool.py +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/tests/hooks/test_recall_inject.py +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/tests/hooks/test_record_review_decision.py +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/tests/hooks/test_restore_session.py +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/tests/hooks/test_session_stop.py +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/tests/hooks/test_session_utils.py +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/tests/hooks/test_settings_local_absolute_paths.py +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/tests/hooks/test_similarity_boost.py +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/tests/hooks/test_statusline.py +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/tests/hooks/test_statusline_template_sync.py +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/tests/hooks/test_sync_check.py +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/tests/hooks/test_template_guard.py +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/tests/skills/__init__.py +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/tests/skills/_skill_helpers.py +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/tests/skills/test_dev_workflow_no_task_type.py +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/tests/skills/test_init_session_no_task_type.py +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/tests/skills/test_planner_lightweight.py +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/tests/skills/test_recall_skill.py +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/tests/skills/test_session_backlog_reconciliation.py +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/tests/skills/test_setup_templates.py +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/tests/skills/test_start_skill_bugfix_flow.py +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/tests/skills/test_start_skill_new_flow.py +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/tests/skills/test_start_skill_security_audit_phase.py +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/tests/test_adapters.py +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/tests/test_cli_ask.py +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/tests/test_cli_entry.py +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/tests/test_cli_init.py +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/tests/test_cli_list.py +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/tests/test_cli_plan.py +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/tests/test_cli_recall.py +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/tests/test_cli_update_deletions.py +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/tests/test_db.py +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/tests/test_docstring_consistency.py +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/tests/test_embedding.py +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/tests/test_excludes.py +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/tests/test_mcp_server_elicit.py +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/tests/test_paths.py +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/tests/test_plan_validator.py +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/tests/test_pre_compact.py +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/tests/test_pre_tool_hook.py +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/tests/test_precompact_additional.py +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/tests/test_precompact_toctou_fixes.py +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/tests/test_recall_chunker.py +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/tests/test_recall_index.py +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/tests/test_references_migration.py +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/tests/test_session_utils_additional.py +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/tests/test_skill_no_builtin_conflict.py +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/tests/test_statusline.py +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/tests/test_stop_additional.py +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/tests/test_stop_hook.py +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/tests/test_stop_precompact_fixes.py +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/tests/test_sync_template_stop.py +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/tests/test_template_pre_tool_hook.py +0 -0
- {claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/tests/test_worktree_guard.py +0 -0
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
# C3 breaking changes log
|
|
2
|
+
# Format: vX.Y.Z|<English summary>|<Japanese summary>
|
|
3
|
+
# Note: extra '|' characters in the Japanese field are allowed (parser uses maxsplit=2).
|
|
4
|
+
# Note: English field must not contain '|' (validated by scripts/extract_breaking_changes.py).
|
|
5
|
+
# Lines starting with '#' are comments. Blank lines ignored.
|
|
6
|
+
|
|
7
|
+
v2.11.0|summarize-memory agent + skill removed; replaced by `c3 recall`|summarize-memory エージェント / skill を完全廃止。代替は `c3 recall` の意味検索。
|
|
8
|
+
v2.20.0|hooks/schema.sql removed; SQLite schema is now managed by c3/migrations/ (auto-applied at session_start)|hooks/schema.sql を削除しました。SQLite スキーマは c3/migrations/ (wheel 内) で管理され session_start で自動適用されます。
|
|
@@ -24,6 +24,7 @@
|
|
|
24
24
|
.dev/hooks/ 配布元専用 hook(配布されない)
|
|
25
25
|
src/c3/_excludes.py wheel 除外パターン(配布元のビルド制御)
|
|
26
26
|
hatch_build.py _excludes.py の重複定義(ビルド時専用)
|
|
27
|
+
src/c3/migrations/ SQLite schema migration SQL ファイル群(Python package・wheel 同梱・.claude/ 配下ではないため 3 ファイル同期対象外)
|
|
27
28
|
```
|
|
28
29
|
|
|
29
30
|
### 1-2. 利用先プロジェクト(C3 ユーザー向け)
|
|
@@ -64,8 +65,8 @@ hatch_build.py _excludes.py の重複定義(ビルド
|
|
|
64
65
|
2. `.claude/settings.json` — プロジェクト共通設定(git 管理)
|
|
65
66
|
3. `~/.claude/settings.json` — グローバル個人設定(マシンローカル)
|
|
66
67
|
|
|
67
|
-
>
|
|
68
|
-
>
|
|
68
|
+
> **補足**: `hooks` は両ファイルの内容がマージされる(本配布元リポで `settings.json` の lifecycle hooks と `settings.local.json` の `.dev/hooks/*` が並走している実機事実)。
|
|
69
|
+
> ただし Claude Code 公式 docs では hooks のマージ挙動が明記されていないため、チーム全体で必要な hook は `settings.json` 側に集約するのが安全。
|
|
69
70
|
> 詳細は §7「既知の落とし穴」を参照。
|
|
70
71
|
> キー仕様の詳細は `.claude/docs/settings.json.md` を参照。
|
|
71
72
|
|
|
@@ -84,7 +85,7 @@ hatch_build.py _excludes.py の重複定義(ビルド
|
|
|
84
85
|
### レイヤー C: LLM 指示・知識(CLAUDE.md / rules)
|
|
85
86
|
|
|
86
87
|
- `.claude/CLAUDE.md` — 常時注入されるプロジェクト指示
|
|
87
|
-
- `.claude/rules/*.md` —
|
|
88
|
+
- `.claude/rules/*.md` — 常時全文注入(`paths:` フロントマターは「適用範囲のドキュメント」であり、注入タイミングは変わらない)
|
|
88
89
|
- `.claude/rules/promoted/index.md` — `@rules/promoted/index.md` で CLAUDE.md から include される
|
|
89
90
|
(`/promote-pattern` skill が追記する **ユーザー所有領域**)
|
|
90
91
|
|
|
@@ -104,14 +105,14 @@ hatch_build.py _excludes.py の重複定義(ビルド
|
|
|
104
105
|
|
|
105
106
|
---
|
|
106
107
|
|
|
107
|
-
## 3. 配布判断マトリクス(
|
|
108
|
+
## 3. 配布判断マトリクス(14 カテゴリ)
|
|
108
109
|
|
|
109
110
|
`_excludes.py` の `EXCLUDE_PATTERNS` / `KEEP_PATTERNS` を実装照合した結果。
|
|
110
111
|
各カテゴリに配布有無・c3 update の更新有無・理由を明示する。
|
|
111
112
|
|
|
112
113
|
| # | カテゴリ | 配布 | c3 update が更新 | 理由 |
|
|
113
114
|
|---|---|---|---|---|
|
|
114
|
-
| 1 | `.claude/hooks/*.py` | ○ | ○ | Claude Code lifecycle hook の実体。配布先で動作する。例外: `subagent_log.py`
|
|
115
|
+
| 1 | `.claude/hooks/*.py` | ○ | ○ | Claude Code lifecycle hook の実体。配布先で動作する。例外: `subagent_log.py` のみ除外(個人デバッグ用)。v2.20.0 で `hooks/schema.sql` を削除し SQLite スキーマは `src/c3/migrations/` に移管 |
|
|
115
116
|
| 2 | `.claude/agents/*.md` | ○ | ○ | ペルソナ定義。配布先で読まれる。例外: `tdd-develop.md` のみ除外(v2.1.0 廃止) |
|
|
116
117
|
| 3 | `.claude/skills/*/` | ○ | ○ | オーケストレーション/ユーティリティ skill 定義(`scripts/` / `templates/` 等サブディレクトリ含む)。例外: `worktree-tdd-workflow/*` のみ除外(v2.1.0 廃止) |
|
|
117
118
|
| 4 | `.claude/rules/*.md` | ○ | ○ | C3 配布デフォルトルール(常時注入対象) |
|
|
@@ -121,9 +122,10 @@ hatch_build.py _excludes.py の重複定義(ビルド
|
|
|
121
122
|
| 8 | `.claude/settings.json` | ○ | ○ | プロジェクト共通設定(hooks 登録・permissions など) |
|
|
122
123
|
| 9 | `.claude/permission_rules.json` | ○ | ○ | C3 独自の自動承認パターン(PermissionRequest hook が参照) |
|
|
123
124
|
| 10 | `.claude/settings.local.json` | × | — | 個人 override・秘匿情報。`_excludes.py` でも除外、`.gitignore` でも除外、c3 update も触らない |
|
|
124
|
-
| 11 | `.claude/reports/*` / `memory/*` / `agent-memory/*` / `state/*` / `tmp/*` / `worktrees/*` / `logs/*` | × (`.gitkeep` のみ ○) | — | 実行時生成領域。空ディレクトリのみ `KEEP_PATTERNS` の `.gitkeep`
|
|
125
|
+
| 11 | `.claude/reports/*` / `memory/*` / `agent-memory/*` / `state/*` / `tmp/*` / `worktrees/*` / `logs/*` | × (`.gitkeep` のみ ○) | — | 実行時生成領域。空ディレクトリのみ `KEEP_PATTERNS` の `.gitkeep` で配布。データ本体は除外。v2.19.0 で `.claude/state/c3_version.txt`(バージョン checkpoint)を追加(`state/*` 一括除外により自動非配布) |
|
|
125
126
|
| 12 | `.dev/*` / `/CLAUDE.md` / `/AGENTS.md` / `/.codex/` / `/.cursor/` / `/.agents/` | × | — | 配布元専用または adapter 生成物。wheel には構造的に含まれない(`src/c3/_template/.claude/` 配下のみ同梱)が、配布元 `.gitignore` で commit 混入も防ぐ |
|
|
126
127
|
| 13 | `.claude/deletions.txt` | ○ | ○ | `c3 update` が読み込み、利用先 `.claude/` から該当ファイルを削除候補として扱う。配布元の `.claude/deletions.txt` に追記したエントリは次回 pip install → `c3 update` で利用先に伝播。`KEEP_PATTERNS` で明示配布。`c3 update` 自体は本ファイルを削除しない(§7 落とし穴 5 参照) |
|
|
128
|
+
| 14 | `.claude/breaking-changes.txt` | ○ | ○ | `c3 update` が読み込み、利用先の `.claude/state/c3_version.txt`(バージョン checkpoint)と diff を計算して破壊的変更を表示する。MAJOR bump 時は y/N 承認プロンプトを発火。`KEEP_PATTERNS` で明示配布。配布元 `.claude/breaking-changes.txt` を更新すれば次回 pip install → `c3 update` で利用先に伝播。利用先 git 管理は tracked(上書きされる) |
|
|
127
129
|
|
|
128
130
|
> **注意 (カテゴリ #6)**: `taxonomy.md` は `_excludes.py` の EXCLUDE 対象だが、`.gitignore` では tracked 状態(GitHub に公開済み)。
|
|
129
131
|
> **wheel には含まれない**点に注意。gitignore と wheel 配布は別レイヤーであり、
|
|
@@ -152,13 +154,13 @@ hatch_build.py _excludes.py の重複定義(ビルド
|
|
|
152
154
|
`settings.local.json` は `c3 init` も `c3 update` も作成・上書きしない。
|
|
153
155
|
個人設定を安全に保ちつつ、C3 のアップデートを受け取れる設計。
|
|
154
156
|
|
|
155
|
-
### 原則 3: `hooks`
|
|
157
|
+
### 原則 3: `hooks` は「個人専用・配布元専用」のみに留める
|
|
156
158
|
|
|
157
|
-
|
|
158
|
-
`settings.json` の `hooks` エントリが **すべて無効化** される(マージではなく完全上書き)。
|
|
159
|
+
`settings.local.json` の `hooks` は `settings.json` の `hooks` とマージされる(本配布元リポで `.dev/hooks/*` を `settings.local.json` に登録して `.claude/hooks/*` と並走させている実例あり)。
|
|
159
160
|
|
|
160
|
-
|
|
161
|
-
|
|
161
|
+
ただし以下の理由から、`settings.local.json` には「個人 / 配布元専用 hook」のみを書く:
|
|
162
|
+
- Claude Code 公式 docs では hooks のマージ挙動が明記されておらず、将来仕様が変わるリスクがある
|
|
163
|
+
- チーム全体で必要な hook は `settings.json` 側に置いてチーム合意を経るべき
|
|
162
164
|
|
|
163
165
|
詳細は §7「既知の落とし穴」の項目 1 を参照。
|
|
164
166
|
|
|
@@ -204,6 +206,8 @@ C3 の wheel 配布除外パターンは **3 つのファイルに分散して
|
|
|
204
206
|
| `src/c3/_excludes.py` | `c3 init` / `c3 update` 時の除外判断(Python 実装) | 配布先への配布/非配布を変更する時 |
|
|
205
207
|
| `hatch_build.py` | wheel ビルド時の除外判断(`_excludes.py` の重複定義) | `_excludes.py` を変更した時(必ず同期) |
|
|
206
208
|
|
|
209
|
+
**`breaking-changes.txt` の同期義務(v2.19.0 追加)**: 新たな破壊的変更をリリースする際は、必ず `_excludes.py` / `hatch_build.py` の `KEEP_PATTERNS` に `"breaking-changes.txt"` が含まれていることを確認した上で、配布元 `.claude/breaking-changes.txt` にエントリを追記する。`scripts/extract_breaking_changes.py --check` で CHANGELOG との整合性を確認し、未記載があれば追記してから wheel を再ビルドする(詳細は配布元 `/CLAUDE.md` §6 参照)。
|
|
210
|
+
|
|
207
211
|
`hatch_build.py` の重複が必要な理由: hatch build hook はパッケージ import 前に走るため、
|
|
208
212
|
`_excludes.py` を import できない。2 ファイルの完全一致が必須。
|
|
209
213
|
|
|
@@ -234,17 +238,13 @@ C3 の wheel 配布除外パターンは **3 つのファイルに分散して
|
|
|
234
238
|
|
|
235
239
|
**ここを読まないと事故る**ポイントを集約。症状が出たらまず確認すること。
|
|
236
240
|
|
|
237
|
-
### 落とし穴 1: `hooks`
|
|
238
|
-
|
|
239
|
-
**症状**: `permission_handler.py` 等の C3 hook が突然動かなくなる。
|
|
241
|
+
### 落とし穴 1: `hooks` のマージ挙動は公式 docs 未明記
|
|
240
242
|
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
`settings.local.json` に `hooks: []` や任意の hook 定義を書くと、
|
|
244
|
-
`settings.json` の `hooks` エントリが全て無効化される。
|
|
243
|
+
**現状**: 実機では `settings.local.json` の `hooks` と `settings.json` の `hooks` はマージされる(本配布元リポの `.dev/hooks/*` 登録が実例)。
|
|
244
|
+
ただし Claude Code 公式 docs では hooks のマージ挙動が明記されていないため、将来の Claude Code バージョンで挙動が変わるリスクがある。
|
|
245
245
|
|
|
246
|
-
**対処**: `settings.
|
|
247
|
-
|
|
246
|
+
**対処**: チーム全体で必要な hook は `settings.json` 側に置く(git 管理 / チーム合意)。`settings.local.json` には個人 / 配布元専用 hook のみを書く(本リポでは `.dev/hooks/*` 配下のみ)。
|
|
247
|
+
万が一 lifecycle hook が動かなくなった場合は、`settings.local.json` を一時退避して `settings.json` 単独で動作するか切り分ける。
|
|
248
248
|
|
|
249
249
|
### 落とし穴 2: `taxonomy.md` は tracked だが wheel 配布されない
|
|
250
250
|
|
|
@@ -4,7 +4,8 @@ Claude Code の設定ファイル。プロジェクトルートの `.claude/sett
|
|
|
4
4
|
ユーザーローカルの上書きは `.claude/settings.local.json`(`.gitignore` 推奨)。
|
|
5
5
|
|
|
6
6
|
> 設定の優先順位: `settings.local.json` > `settings.json` > グローバル設定(`~/.claude/settings.json`)
|
|
7
|
-
>
|
|
7
|
+
> `hooks` セクションは両ファイルの内容がマージされる(本配布元リポで `.dev/hooks/*` を `settings.local.json` に登録して `.claude/hooks/*` と並走させている実機事実)。
|
|
8
|
+
> ただし Claude Code 公式 docs では hooks のマージ挙動が明記されていないため、チーム全体で必要な hook は `settings.json` 側に集約するのが安全。
|
|
8
9
|
|
|
9
10
|
---
|
|
10
11
|
|
|
@@ -508,4 +509,4 @@ MCP(Model Context Protocol)サーバーを登録する。登録されたサ
|
|
|
508
509
|
| `.claude/settings.json` | プロジェクト共通設定。git 管理する |
|
|
509
510
|
| `.claude/settings.local.json` | 開発者個人の設定(追加 `allow` 等)。`.gitignore` に追加して git 管理しない |
|
|
510
511
|
|
|
511
|
-
> `hooks`
|
|
512
|
+
> `hooks` は `settings.local.json` と `settings.json` の内容がマージされる(実機検証済み)。ただし Claude Code 公式 docs ではこの挙動が明記されていないため、チーム全体で必要なフックは `settings.json` 側に集約する。`settings.local.json` は個人・配布元専用フック(例: 本リポの `.dev/hooks/*`)に留める。
|
{claude_code_conductor-2.18.0 → claude_code_conductor-2.20.0}/.claude/hooks/session_start.py
RENAMED
|
@@ -12,22 +12,23 @@
|
|
|
12
12
|
設計判断:
|
|
13
13
|
- 旧 3 ファイルを統合することで SessionStart hook は本ファイル 1 本のみで完結
|
|
14
14
|
- init-session SKILL.md からの手動 2 回呼び出しが不要になる
|
|
15
|
-
-
|
|
16
|
-
|
|
15
|
+
- v2.20.0 で apply_schema() を c3.migrate.apply_pending_migrations() に委譲。
|
|
16
|
+
SCHEMA_VERSION / SCHEMA_PATH 定数および schema.sql は廃止。
|
|
17
17
|
"""
|
|
18
18
|
|
|
19
19
|
from __future__ import annotations
|
|
20
20
|
|
|
21
21
|
import json
|
|
22
|
+
import logging
|
|
22
23
|
import os
|
|
23
24
|
import shutil
|
|
24
|
-
import sqlite3
|
|
25
25
|
import sys
|
|
26
26
|
import tempfile
|
|
27
|
-
from datetime import datetime, timezone
|
|
28
27
|
|
|
29
28
|
from session_utils import is_worktree
|
|
30
29
|
|
|
30
|
+
logger = logging.getLogger(__name__)
|
|
31
|
+
|
|
31
32
|
try:
|
|
32
33
|
sys.stdin.reconfigure(encoding="utf-8")
|
|
33
34
|
sys.stdout.reconfigure(encoding="utf-8")
|
|
@@ -71,7 +72,11 @@ def _run_clear_file_history() -> None:
|
|
|
71
72
|
except FileNotFoundError:
|
|
72
73
|
pass # already deleted by another process between listdir and unlink/rmtree
|
|
73
74
|
except Exception as e:
|
|
74
|
-
|
|
75
|
+
# [SR-R-001] shutil.rmtree / os.unlink のエラーメッセージには失敗したパス
|
|
76
|
+
# (FILE_HISTORY_DIR はホームディレクトリ配下のためユーザー名を含む)が
|
|
77
|
+
# 含まれる可能性がある。main() の SR M-1 修正と一貫して例外型名のみ出力する。
|
|
78
|
+
logger.debug('[clear-file-history] delete failed: %s', name, exc_info=True)
|
|
79
|
+
print(f'[clear-file-history] 削除に失敗: {name} ({type(e).__name__})', file=sys.stderr)
|
|
75
80
|
|
|
76
81
|
print(f'[clear-file-history] {deleted} 件削除しました。')
|
|
77
82
|
|
|
@@ -113,7 +118,9 @@ def _run_enable_sandbox() -> None:
|
|
|
113
118
|
try:
|
|
114
119
|
settings = json.load(f)
|
|
115
120
|
except json.JSONDecodeError as e:
|
|
116
|
-
|
|
121
|
+
# [SR-R-001] 一貫性のため例外型名のみ出力(JSONDecodeError 自体はパスを含まない
|
|
122
|
+
# が、SR M-1 / _run_clear_file_history と方針を統一する)。
|
|
123
|
+
print(f'[enable-sandbox] settings.json の JSON 解析に失敗しました: {type(e).__name__}')
|
|
117
124
|
return
|
|
118
125
|
|
|
119
126
|
if settings.get('sandbox', {}).get('enabled') is True:
|
|
@@ -132,7 +139,14 @@ def _run_enable_sandbox() -> None:
|
|
|
132
139
|
json.dump(settings, tmp_f, ensure_ascii=False, indent=2)
|
|
133
140
|
tmp_f.write('\n')
|
|
134
141
|
except Exception:
|
|
135
|
-
os.
|
|
142
|
+
# [CR-E-001] os.fdopen 成功後の書き込み例外では with __exit__ が既に
|
|
143
|
+
# fd を閉じているため、ここでの os.close(fd) は OSError(Bad file
|
|
144
|
+
# descriptor) を raise し元の例外を上書きしてしまう。os.fdopen 自体が
|
|
145
|
+
# 失敗して with に入らなかった場合のみ fd 解放が必要なので OSError を無視する。
|
|
146
|
+
try:
|
|
147
|
+
os.close(fd)
|
|
148
|
+
except OSError:
|
|
149
|
+
pass
|
|
136
150
|
raise
|
|
137
151
|
os.replace(tmp_path, settings_path)
|
|
138
152
|
tmp_path = None # os.replace が成功したので finally でのクリーンアップ不要
|
|
@@ -147,19 +161,10 @@ def _run_enable_sandbox() -> None:
|
|
|
147
161
|
# 3. C3 SQLite DB 初期化(旧 init_c3_db.py)
|
|
148
162
|
# =============================================================================
|
|
149
163
|
|
|
150
|
-
# 現行スキーマバージョン。schema.sql に破壊的変更を入れたら +1 して
|
|
151
|
-
# マイグレーションロジックを apply_schema() に追加する。
|
|
152
|
-
SCHEMA_VERSION = 3 # v2.0.0 で PO 廃止に伴い po_results / po_status を削除
|
|
153
|
-
|
|
154
164
|
_HOOKS_DIR = os.path.dirname(os.path.abspath(__file__))
|
|
155
165
|
_CLAUDE_DIR = os.path.dirname(_HOOKS_DIR)
|
|
156
166
|
STATE_DIR = os.path.join(_CLAUDE_DIR, 'state')
|
|
157
167
|
DB_PATH = os.path.join(STATE_DIR, 'c3.db')
|
|
158
|
-
SCHEMA_PATH = os.path.join(_HOOKS_DIR, 'schema.sql')
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
def _now_iso() -> str:
|
|
162
|
-
return datetime.now(timezone.utc).astimezone().isoformat(timespec='seconds')
|
|
163
168
|
|
|
164
169
|
|
|
165
170
|
def _ensure_state_dir() -> None:
|
|
@@ -167,38 +172,36 @@ def _ensure_state_dir() -> None:
|
|
|
167
172
|
os.makedirs(STATE_DIR, exist_ok=True)
|
|
168
173
|
|
|
169
174
|
|
|
170
|
-
def apply_schema(db_path: str = DB_PATH
|
|
171
|
-
"""
|
|
175
|
+
def apply_schema(db_path: str = DB_PATH) -> list[str]:
|
|
176
|
+
"""SQLite DB にスキーマ migration を適用する。
|
|
172
177
|
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
- schema_version テーブルに現行バージョンを INSERT OR IGNORE
|
|
178
|
+
v2.20.0+: 実体は c3.migrate.apply_pending_migrations() に委譲。
|
|
179
|
+
schema.sql は廃止され、src/c3/migrations/ の連番 SQL ファイルで管理される。
|
|
176
180
|
|
|
177
|
-
|
|
181
|
+
戻り値: 今回新たに適用した migration version のリスト(例: ['001'])
|
|
178
182
|
"""
|
|
179
|
-
|
|
180
|
-
ddl = f.read()
|
|
181
|
-
|
|
182
|
-
conn = sqlite3.connect(db_path, timeout=30)
|
|
183
|
+
from c3.migrate import apply_pending_migrations
|
|
183
184
|
try:
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
#
|
|
187
|
-
|
|
188
|
-
#
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
(
|
|
185
|
+
return apply_pending_migrations(db_path)
|
|
186
|
+
except FileNotFoundError:
|
|
187
|
+
# migrations ディレクトリ不在(wheel が壊れている等)でもセッションは続行。
|
|
188
|
+
# [SR-R-001] 例外 e にはインストールパス(ユーザー名含む)が含まれるため
|
|
189
|
+
# stderr には固定文言のみ出力する。詳細は内部 logger(DEBUG)に残す。
|
|
190
|
+
logger.debug('apply_schema: migrations directory not found', exc_info=True)
|
|
191
|
+
print(
|
|
192
|
+
'warning: c3 migrations directory not found (wheel may be corrupted)',
|
|
193
|
+
file=sys.stderr,
|
|
192
194
|
)
|
|
193
|
-
|
|
194
|
-
finally:
|
|
195
|
-
conn.close()
|
|
195
|
+
return []
|
|
196
196
|
|
|
197
197
|
|
|
198
198
|
def _run_init_c3_db() -> None:
|
|
199
199
|
"""C3 SQLite DB を初期化する."""
|
|
200
200
|
_ensure_state_dir()
|
|
201
|
-
apply_schema()
|
|
201
|
+
# [CR-M-003] apply_schema() の戻り値(適用した migration version の list[str])は
|
|
202
|
+
# 現状ログ・利用しない。セッション開始を妨げないことを最優先し、適用結果の通知は
|
|
203
|
+
# 行わない設計(将来 welcome メッセージ等で利用する場合はここで受ける)。
|
|
204
|
+
_ = apply_schema()
|
|
202
205
|
|
|
203
206
|
|
|
204
207
|
# =============================================================================
|
|
@@ -222,7 +225,14 @@ def main() -> int:
|
|
|
222
225
|
handler()
|
|
223
226
|
except Exception as e:
|
|
224
227
|
# 各ハンドラ失敗時は警告のみ(次のハンドラを継続)
|
|
225
|
-
|
|
228
|
+
# [SR-R-001] 例外メッセージには db_path 等のプロジェクトパスが含まれる
|
|
229
|
+
# 可能性がある(例: sqlite3.OperationalError)。stderr には例外型名のみ
|
|
230
|
+
# 出力し、詳細は内部 logger(DEBUG)に残す。
|
|
231
|
+
# NOTE(SR Info-2): exc_info=True は現状ハンドラ未設定で出力されないが、
|
|
232
|
+
# 将来 logging ハンドラを追加する場合はスタックトレースにインストールパスが
|
|
233
|
+
# 含まれる点に留意する。
|
|
234
|
+
logger.debug('[session_start:%s] handler failed', label, exc_info=True)
|
|
235
|
+
print(f'[session_start:{label}] failed: {type(e).__name__}', file=sys.stderr)
|
|
226
236
|
return 0
|
|
227
237
|
|
|
228
238
|
|
|
@@ -1,5 +1,143 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [2.20.0] - 2026-05-25
|
|
4
|
+
|
|
5
|
+
**SQLite schema migration 枠組み導入**: `.claude/hooks/schema.sql` の「冪等 DDL 一発実行」から、`src/c3/migrations/` の「連番 NNN_xxx.sql migration runner」へ移行する基盤を整備する。
|
|
6
|
+
v2.18.0 の `deletions.txt` 機構・v2.19.0 の `breaking-changes.txt` 機構の初の実運用ドッグフーディングでもある。
|
|
7
|
+
|
|
8
|
+
### 機能追加
|
|
9
|
+
|
|
10
|
+
- **`src/c3/migrate.py`(新規)**: SQLite migration runner。
|
|
11
|
+
公開 API `apply_pending_migrations(db_path, migrations_dir=None) -> list[str]` および例外クラス `MigrationError(RuntimeError)` を提供。
|
|
12
|
+
`src/c3/migrations/` 配下の連番 SQL ファイルを昇順に適用し、適用済み migration を `schema_migrations` テーブルで管理する。
|
|
13
|
+
WAL モード / busy_timeout=5000ms を冒頭で設定(既存 `c3.db.BUSY_TIMEOUT_MS` を SSOT として参照)。
|
|
14
|
+
|
|
15
|
+
- **`src/c3/migrations/001_initial.sql`(新規)**: 既存 `hooks/schema.sql` の DDL を逐語移植 + bootstrap。
|
|
16
|
+
`schema_migrations` テーブル新設、旧 `schema_version` テーブル DROP、`BEGIN;` / `COMMIT;` 明示記述による transaction 境界保証を含む。
|
|
17
|
+
|
|
18
|
+
- **`src/c3/migrations/__init__.py`(新規)**: Python package marker(wheel 自動同梱のため)。
|
|
19
|
+
|
|
20
|
+
- **`src/c3/migrations/README.md`(新規)**: 命名規約(`NNN_xxx.sql`)・`BEGIN;`/`COMMIT;` 必須運用ルール・002 以降の追加手順を記載。
|
|
21
|
+
|
|
22
|
+
- **`schema_migrations` テーブル(新規)**: 適用済み migration の一覧を保持(`version TEXT PK`, `applied_at TIMESTAMP`)。
|
|
23
|
+
旧 `schema_version (version INTEGER PK, applied_at TEXT)` を置換。
|
|
24
|
+
|
|
25
|
+
### 変更
|
|
26
|
+
|
|
27
|
+
- **`.claude/hooks/session_start.py`**: `apply_schema(db_path)` の実体を `c3.migrate.apply_pending_migrations()` に委譲。
|
|
28
|
+
戻り値が `None` → `list[str]`(適用した migration version のリスト)に変更。
|
|
29
|
+
migrations_dir 不在時は `FileNotFoundError` を warning として stderr に出力し、セッションは続行する(exit 0 維持の既存方針踏襲)。
|
|
30
|
+
|
|
31
|
+
- **`src/c3/__init__.py`**: `__version__` を `"2.19.0"` から `"2.20.0"` に更新。
|
|
32
|
+
|
|
33
|
+
### 破壊的変更
|
|
34
|
+
|
|
35
|
+
- **`hooks/schema.sql` 削除**: `.claude/hooks/schema.sql` をリポジトリから削除。
|
|
36
|
+
SQLite スキーマは `src/c3/migrations/` (wheel 内) で管理され、`session_start` で自動適用される。
|
|
37
|
+
利用先からの削除は `deletions.txt` 機構(v2.18.0)によって `c3 update` 実行時に処理される。
|
|
38
|
+
|
|
39
|
+
- **`apply_schema` の `schema_path` 引数削除**: `session_start.py::apply_schema()` から `schema_path` 引数を完全削除(deprecation 期間なし)。
|
|
40
|
+
呼び出し側で `schema_path=` を渡している場合は削除が必要(`c3 update` 実行後のテストコード等)。
|
|
41
|
+
|
|
42
|
+
### ドキュメント
|
|
43
|
+
|
|
44
|
+
- **`.claude/docs/config-policy.md`**:
|
|
45
|
+
- §1-1 配布元ディレクトリ表に `src/c3/migrations/` を追加(Python package・wheel 同梱・3 ファイル同期対象外)
|
|
46
|
+
- §3 カテゴリ #1 hooks 備考に「v2.20.0 で `hooks/schema.sql` を削除、SQLite スキーマは `src/c3/migrations/` に移管」を追記
|
|
47
|
+
|
|
48
|
+
- **`.claude/breaking-changes.txt`**: v2.20.0 エントリ追記(`hooks/schema.sql` 削除)
|
|
49
|
+
|
|
50
|
+
- **`.claude/deletions.txt`**: `hooks/schema.sql` 追記(利用先からの自動削除を `c3 update` 経由で実現)
|
|
51
|
+
|
|
52
|
+
### ドッグフーディング
|
|
53
|
+
|
|
54
|
+
- **v2.18.0 `deletions.txt` 機構**: `hooks/` 配下の非テスト SQL ファイル削除の初の実運用事例(過去は `agents/` / `skills/` の `.md` のみ)。
|
|
55
|
+
- **v2.19.0 `breaking-changes.txt` 機構**: v2.20.0 エントリを新規追加して MINOR bump 表示路を初通過させる。
|
|
56
|
+
- **`scripts/extract_breaking_changes.py`**: `--dry-run` / 通常実行 / `--check` のフルライフサイクル運用。
|
|
57
|
+
|
|
58
|
+
### 影響
|
|
59
|
+
|
|
60
|
+
- **既存利用先**: `c3 update` 実行時に v2.20.0 breaking change が表示される(v2.19.0 以降の利用先)。
|
|
61
|
+
`.claude/hooks/schema.sql` は `c3 update` 実行時に自動削除される。
|
|
62
|
+
次回セッション開始時に `apply_pending_migrations` が `schema_migrations` テーブルを新設し 001 を適用する。
|
|
63
|
+
既存データ(`review_decisions` 等)は保持される。`schema_version` テーブルは削除される。
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
## [2.19.0] - 2026-05-24
|
|
68
|
+
|
|
69
|
+
**基盤整備リリース第 3 弾**: `c3 update` 実行時に breaking changes 表示 + MAJOR 承認プロンプトを導入する。
|
|
70
|
+
v2.11.0 の `summarize-memory` 廃止のように利用先設定の手動修正が必要なケースで、
|
|
71
|
+
利用者が破壊的変更を見逃すリスクを構造的に防ぐ。
|
|
72
|
+
|
|
73
|
+
### 機能追加
|
|
74
|
+
|
|
75
|
+
- **`c3 update` 実行時の breaking changes 表示 + MAJOR 承認プロンプト**:
|
|
76
|
+
利用先 `.claude/state/c3_version.txt`(バージョン checkpoint)と配布元バージョン
|
|
77
|
+
(`c3.__version__`) を比較し、その区間にある breaking changes を
|
|
78
|
+
`.claude/breaking-changes.txt` から抽出して表示する。
|
|
79
|
+
- **initial(初回)**: 全件表示。プロンプト非発火。
|
|
80
|
+
- **minor / patch**: 区間内 breaking changes を表示。プロンプト非発火。
|
|
81
|
+
- **MAJOR**: 区間内 breaking changes を表示後、`Proceed with major version update? [y/N]:` プロンプトを発火。
|
|
82
|
+
N または非対話環境(EOF)で `exit 0`(add/update / deletions / checkpoint 更新のいずれも実行されない)。
|
|
83
|
+
- **downgrade**: stderr に 1 行 warning のみ。checkpoint 不変。プロンプト非発火。
|
|
84
|
+
- `--yes` フラグで MAJOR プロンプトをスキップ可(CI / 自動化用)。
|
|
85
|
+
- `--dry-run` では MAJOR プロンプト非発火(`(dry-run: confirmation would be required)` 表示)。
|
|
86
|
+
- `--platform codex` 等 claude 以外単独実行時は発火しない。
|
|
87
|
+
|
|
88
|
+
- **`.claude/breaking-changes.txt`(新規)**: breaking changes ログファイル。
|
|
89
|
+
フォーマット: `vX.Y.Z|<English summary>|<Japanese summary>` の pipe 区切り 1 行 1 エントリ。
|
|
90
|
+
v2.11.0(`summarize-memory` 廃止)を初期エントリとして同梱。
|
|
91
|
+
`KEEP_PATTERNS` で明示配布。`c3 update` で利用先に伝播。
|
|
92
|
+
|
|
93
|
+
- **`.claude/state/c3_version.txt`(新規、利用先生成)**: バージョン checkpoint ファイル。
|
|
94
|
+
`c3 update` の claude block 成功時(non-dry-run / non-downgrade)に自動更新。
|
|
95
|
+
`state/*` 一括除外により配布対象外(利用先で生成、git 管理は推奨しない)。
|
|
96
|
+
|
|
97
|
+
- **`scripts/extract_breaking_changes.py`(新規)**: CHANGELOG.md の `### 破壊的変更` セクションを抽出し、
|
|
98
|
+
`.claude/breaking-changes.txt` に未記載のエントリを追記するリリースワークフロースクリプト。
|
|
99
|
+
- `--check`: 未記載があれば `exit 1` + stderr に未記載 version 列挙(CI 用)
|
|
100
|
+
- `--dry-run`: 候補表示のみ、書き込まない
|
|
101
|
+
- 対話モード: en サマリ必須入力(空入力はエラー)
|
|
102
|
+
- atomic write (tmp + `os.replace`) で安全に追記
|
|
103
|
+
|
|
104
|
+
- **`KEEP_PATTERNS` への `breaking-changes.txt` 追加**: `src/c3/_excludes.py` / `hatch_build.py` の
|
|
105
|
+
`KEEP_PATTERNS` に `"breaking-changes.txt"` を追加(3 ファイル同期ルール準拠)。
|
|
106
|
+
|
|
107
|
+
### 変更
|
|
108
|
+
|
|
109
|
+
- **`src/c3/__init__.py`**: `__version__` を `"2.18.0"` から `"2.19.0"` に更新。
|
|
110
|
+
|
|
111
|
+
### ドキュメント
|
|
112
|
+
|
|
113
|
+
- **`.claude/docs/config-policy.md`**:
|
|
114
|
+
- §3 配布判断マトリクス 13 → 14 カテゴリ(`breaking-changes.txt` 追加)
|
|
115
|
+
- §11(`state/*`)に「v2.19.0 で `c3_version.txt` を追加」と注記
|
|
116
|
+
- §6 3 ファイル同期ルールに `breaking-changes.txt` のメンテ責任を追記
|
|
117
|
+
- **`/CLAUDE.md`**(配布元 gitignored):
|
|
118
|
+
- §6「リリース前 breaking changes チェック」を新規追加
|
|
119
|
+
- `scripts/extract_breaking_changes.py --check` 手順 / wheel 検証コマンドを含む
|
|
120
|
+
|
|
121
|
+
### ドキュメント訂正(v2.17.0 / v2.18.0 で配布した記述の誤りを訂正)
|
|
122
|
+
|
|
123
|
+
- **`hooks` のマージ挙動**: v2.17.0 / v2.18.0 で配布した `.claude/docs/config-policy.md` §2 / §4 / §7 と
|
|
124
|
+
`.claude/docs/settings.json.md` 冒頭・末尾の「`settings.local.json` の hooks が `settings.json` の
|
|
125
|
+
hooks を完全上書きする」記述は **誤り**。実機検証で両ファイルの hooks は **マージされる** ことを確認
|
|
126
|
+
(本配布元リポでも `settings.json` の lifecycle hooks と `settings.local.json` の `.dev/hooks/*` が並走)。
|
|
127
|
+
Claude Code 公式 docs では hooks のマージ挙動が明記されていないため、チーム全体で必要な hook は
|
|
128
|
+
`settings.json` 側に集約するのが安全、という方針に変更。
|
|
129
|
+
- **`.claude/rules/*.md` の注入挙動**: v2.17.0 で配布した `.claude/docs/config-policy.md` §2 の
|
|
130
|
+
「`paths:` フロントマターがあればパスマッチ時のみ、なければ常時注入」記述は誤り。実機では `rules/*.md`
|
|
131
|
+
は常時全文注入され、`paths:` は「適用範囲のドキュメント」であって注入タイミングは変わらない。
|
|
132
|
+
|
|
133
|
+
### 影響
|
|
134
|
+
|
|
135
|
+
- **既存利用先**: `c3 update` 実行時に「初回 checkpoint 作成」ヘッダ + v2.11.0 の breaking change が表示される。
|
|
136
|
+
MAJOR バンプ確認プロンプトは発火しない(v2.11.0 → v2.19.0 は minor bump)。
|
|
137
|
+
`.claude/state/c3_version.txt` が自動生成されるが、`state/*` は gitignore 推奨。
|
|
138
|
+
|
|
139
|
+
---
|
|
140
|
+
|
|
3
141
|
## v2.18.0 (2026-05-24)
|
|
4
142
|
|
|
5
143
|
**基盤整備リリース第 2 弾**: `c3 update` の削除検出を `deletions.txt` 方式で導入する。
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: claude-code-conductor
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.20.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
|