claude-code-conductor 2.34.0__tar.gz → 2.36.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.34.0 → claude_code_conductor-2.36.0}/.claude/hooks/pre_compact.py +5 -5
- claude_code_conductor-2.36.0/.claude/hooks/restore_session.py +198 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/.claude/hooks/session_utils.py +45 -5
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/.claude/skills/dev-workflow/SKILL.md +29 -17
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/.claude/skills/init-session/SKILL.md +17 -1
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/.claude/skills/parallel-agents/SKILL.md +17 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/.gitignore +1 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/CHANGELOG.md +41 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/PKG-INFO +1 -1
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/hatch_build.py +1 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/src/c3/__init__.py +1 -1
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/src/c3/_excludes.py +1 -0
- claude_code_conductor-2.36.0/tests/hooks/test_restore_session.py +1504 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/tests/hooks/test_session_utils.py +221 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/tests/test_pre_compact.py +89 -15
- claude_code_conductor-2.34.0/.claude/hooks/restore_session.py +0 -91
- claude_code_conductor-2.34.0/tests/hooks/test_restore_session.py +0 -410
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/.claude/CLAUDE.md +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/.claude/agents/architect.md +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/.claude/agents/code-reviewer.md +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/.claude/agents/design-critic.md +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/.claude/agents/developer.md +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/.claude/agents/doc-writer.md +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/.claude/agents/interviewer.md +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/.claude/agents/planner.md +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/.claude/agents/project-setup.md +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/.claude/agents/security-reviewer.md +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/.claude/agents/systematic-debugger.md +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/.claude/agents/tester.md +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/.claude/agents/wt_developer.md +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/.claude/agents/wt_systematic-debugger.md +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/.claude/agents/wt_tester.md +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/.claude/breaking-changes.txt +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/.claude/deletions.txt +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/.claude/docs/config-policy.md +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/.claude/docs/parallel-agents-setup.md +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/.claude/docs/platform-adapters.md +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/.claude/docs/settings.json.md +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/.claude/hooks/_hook_utils.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/.claude/hooks/check_agent_invocation.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/.claude/hooks/consolidate_memory.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/.claude/hooks/permission_handler.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/.claude/hooks/permission_handler_toast.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/.claude/hooks/planner_check.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/.claude/hooks/post_tool.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/.claude/hooks/pre_tool.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/.claude/hooks/recall_autorebuild.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/.claude/hooks/recall_inject.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/.claude/hooks/select_tier.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/.claude/hooks/session_start.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/.claude/hooks/session_stop.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/.claude/hooks/statusline.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/.claude/hooks/stop.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/.claude/hooks/worktree_guard.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/.claude/memory/.gitkeep +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/.claude/permission_rules.json +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/.claude/rules/promoted/index.md +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/.claude/settings.json +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/.claude/skills/brainstorm/SKILL.md +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/.claude/skills/codex-review/SKILL.md +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/.claude/skills/dev-workflow/references/code-review-checklist.md +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/.claude/skills/dev-workflow/references/design-critic-rubric.md +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/.claude/skills/dev-workflow/references/design-rubric.md +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/.claude/skills/dev-workflow/references/interview-rubric.md +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/.claude/skills/dev-workflow/references/plan-design-guidelines.md +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/.claude/skills/dev-workflow/references/security-review-checklist.md +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/.claude/skills/dev-workflow/scripts/record_review_decision.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/.claude/skills/dev-workflow/scripts/record_tier_outcome.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/.claude/skills/dev-workflow/scripts/review_hint_inject.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/.claude/skills/develop/SKILL.md +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/.claude/skills/doc/SKILL.md +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/.claude/skills/extract-lib/SKILL.md +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/.claude/skills/mcp-config/SKILL.md +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/.claude/skills/pattern-status/SKILL.md +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/.claude/skills/promote-pattern/SKILL.md +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/.claude/skills/recall/SKILL.md +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/.claude/skills/report-timestamp/SKILL.md +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/.claude/skills/report-timestamp/scripts/get_timestamp.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/.claude/skills/review-phase/SKILL.md +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/.claude/skills/setup/SKILL.md +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/.claude/skills/setup/reference.md +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/.claude/skills/setup/templates/coding-standards-template.md +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/.claude/skills/setup/templates/project-conventions-template.md +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/.claude/skills/start/SKILL.md +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/.claude/state/.gitkeep +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/ARCHITECTURE.md +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/LICENSE +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/LICENSES/chroma-hnswlib-LICENSE +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/LICENSES/chroma-hnswlib-NOTICE +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/LICENSES/fastembed-LICENSE +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/LICENSES/fastembed-NOTICE +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/LICENSES/onnxruntime-LICENSE +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/LICENSES/paraphrase-multilingual-MiniLM-L12-v2-LICENSE +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/README.md +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/pyproject.toml +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/src/c3/__main__.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/src/c3/_db_params.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/src/c3/_terminal.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/src/c3/adapters.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/src/c3/cli.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/src/c3/cli_ask.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/src/c3/cli_doctor.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/src/c3/cli_init.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/src/c3/cli_list.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/src/c3/cli_plan.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/src/c3/cli_recall.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/src/c3/cli_tier.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/src/c3/cli_update.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/src/c3/db.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/src/c3/embedding.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/src/c3/mcp_server.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/src/c3/migrate.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/src/c3/migrations/001_initial.sql +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/src/c3/migrations/002_agent_cost_runs.sql +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/src/c3/migrations/003_tier_cost.sql +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/src/c3/migrations/README.md +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/src/c3/migrations/__init__.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/src/c3/paths.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/src/c3/plan_validator.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/src/c3/platforms.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/src/c3/pricing.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/src/c3/question.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/src/c3/recall_chunker.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/src/c3/recall_index.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/src/c3/usage_ingester.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/tests/__init__.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/tests/conftest.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/tests/fixtures/usage/README.md +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/tests/fixtures/usage/mainline.jsonl +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/tests/fixtures/usage/subagents/agent-deadbeef.jsonl +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/tests/fixtures/usage/subagents/agent-deadbeef.meta.json +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/tests/hooks/__init__.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/tests/hooks/test_check_agent_invocation.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/tests/hooks/test_consolidate_memory.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/tests/hooks/test_hook_utils.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/tests/hooks/test_permission_handler.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/tests/hooks/test_permission_handler_toast.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/tests/hooks/test_pip_reinstall_reminder.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/tests/hooks/test_planner_check.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/tests/hooks/test_planner_check_dev.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/tests/hooks/test_post_tool.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/tests/hooks/test_pre_tool.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/tests/hooks/test_recall_autorebuild.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/tests/hooks/test_recall_inject.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/tests/hooks/test_record_review_decision.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/tests/hooks/test_record_tier_outcome.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/tests/hooks/test_review_hint_inject.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/tests/hooks/test_select_tier.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/tests/hooks/test_select_tier_escalation.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/tests/hooks/test_session_start.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/tests/hooks/test_session_stop.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/tests/hooks/test_settings_local_absolute_paths.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/tests/hooks/test_similarity_boost.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/tests/hooks/test_statusline.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/tests/hooks/test_statusline_template_sync.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/tests/hooks/test_sync_check.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/tests/hooks/test_template_guard.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/tests/skills/__init__.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/tests/skills/_skill_helpers.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/tests/skills/test_dev_workflow_no_task_type.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/tests/skills/test_init_session_no_task_type.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/tests/skills/test_planner_lightweight.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/tests/skills/test_recall_skill.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/tests/skills/test_session_backlog_reconciliation.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/tests/skills/test_setup_templates.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/tests/skills/test_start_skill_bugfix_flow.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/tests/skills/test_start_skill_new_flow.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/tests/skills/test_start_skill_security_audit_phase.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/tests/test_adapters.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/tests/test_check_deletions.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/tests/test_cli_ask.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/tests/test_cli_doctor.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/tests/test_cli_entry.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/tests/test_cli_init.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/tests/test_cli_list.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/tests/test_cli_plan.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/tests/test_cli_recall.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/tests/test_cli_tier.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/tests/test_cli_update_breaking_changes.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/tests/test_cli_update_deletions.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/tests/test_db.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/tests/test_docstring_consistency.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/tests/test_embedding.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/tests/test_excludes.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/tests/test_extract_breaking_changes.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/tests/test_mcp_server_elicit.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/tests/test_migrate.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/tests/test_paths.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/tests/test_plan_validator.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/tests/test_pre_tool_hook.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/tests/test_precompact_additional.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/tests/test_precompact_toctou_fixes.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/tests/test_pricing.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/tests/test_recall_chunker.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/tests/test_recall_index.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/tests/test_references_migration.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/tests/test_session_utils_additional.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/tests/test_skill_no_builtin_conflict.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/tests/test_statusline.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/tests/test_stop_additional.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/tests/test_stop_hook.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/tests/test_stop_precompact_fixes.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/tests/test_sync_template_stop.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/tests/test_template_pre_tool_hook.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/tests/test_usage_ingester.py +0 -0
- {claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/tests/test_worktree_guard.py +0 -0
|
@@ -13,11 +13,11 @@ from session_utils import SESSION_JSON_MARKER, append_checkpoint, is_worktree, S
|
|
|
13
13
|
|
|
14
14
|
|
|
15
15
|
SAVE_INSTRUCTION = (
|
|
16
|
-
"
|
|
17
|
-
"
|
|
18
|
-
"
|
|
19
|
-
"
|
|
20
|
-
"
|
|
16
|
+
"コンテキスト圧縮が間もなく発生します。詳細な文脈が失われる前に、"
|
|
17
|
+
"今日のセッションファイル(.claude/memory/sessions/YYYYMMDD.tmp)を以下のとおり「更新」してください(無制限の追記はしないこと)。\n"
|
|
18
|
+
"1. 「現在地:」行を現在のフェーズ名に更新する(例: 「現在地: フェーズD 実装中」「現在地: Wave 2 実装中」)。\n"
|
|
19
|
+
"2. 「## 残タスク」をチェックリストとして更新する(完了タスクは - [x] 化し、不要になった行は整理する)。\n"
|
|
20
|
+
"CLAUDE.md の Compact Instructions(KEEP/DISCARD)に従い、雑談・解決済みエラーログ・冗長なコード断片は書かないこと。\n"
|
|
21
21
|
)
|
|
22
22
|
|
|
23
23
|
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
restore_session.py: SessionStart(compact) hook.
|
|
4
|
+
コンテキスト圧縮後に現在のセッション状態を再注入する。
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import os
|
|
8
|
+
import re
|
|
9
|
+
import sys
|
|
10
|
+
|
|
11
|
+
try:
|
|
12
|
+
sys.stdin.reconfigure(encoding='utf-8')
|
|
13
|
+
sys.stdout.reconfigure(encoding='utf-8')
|
|
14
|
+
sys.stderr.reconfigure(encoding='utf-8')
|
|
15
|
+
except AttributeError:
|
|
16
|
+
pass
|
|
17
|
+
|
|
18
|
+
_HOOKS_DIR = os.path.dirname(os.path.abspath(__file__))
|
|
19
|
+
_CLAUDE_DIR = os.path.dirname(_HOOKS_DIR)
|
|
20
|
+
SESSIONS_DIR = os.path.join(_CLAUDE_DIR, 'memory', 'sessions')
|
|
21
|
+
|
|
22
|
+
# 定数(architecture §3.5 / plan T4)
|
|
23
|
+
# GENBA = 「現在地」(現場)の音写命名。architecture §2.3 で確定した用語(CR M-01)。
|
|
24
|
+
# 他 Python consumer(init-session 等)が生まれたら session_utils へ移動すること(CR L-06)。
|
|
25
|
+
APPROACH_TAIL_LINES = 15
|
|
26
|
+
# GENBA_DONE: 現在地値が「完了」状態を表す定数(GENBA = 現在地 の音写)(CR M-01)。
|
|
27
|
+
# 他 Python consumer が生まれたら session_utils へ移動すること(CR L-06)。
|
|
28
|
+
GENBA_DONE = '完了'
|
|
29
|
+
|
|
30
|
+
# 現在地フィールドの読み取り用 regex(architecture §2.3)
|
|
31
|
+
_GENBA_RE = re.compile(r'^現在地:[ \t]*(.*)$', re.MULTILINE)
|
|
32
|
+
|
|
33
|
+
# date_str(ファイル名由来)の YYYYMMDD 形式検証用(SR L-3 / CR M-03)
|
|
34
|
+
# ファイル名経由で任意文字列が混入するのを防ぐ。他の regex 定数と同じモジュールレベルに配置。
|
|
35
|
+
_DATE_STR_RE = re.compile(r'^\d{8}$')
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def _load_session_utils():
|
|
39
|
+
"""session_utils モジュールを動的にロードして返す(同階層)。"""
|
|
40
|
+
import importlib.util
|
|
41
|
+
|
|
42
|
+
util_path = os.path.join(_HOOKS_DIR, "session_utils.py")
|
|
43
|
+
spec = importlib.util.spec_from_file_location("session_utils", util_path)
|
|
44
|
+
if spec is None or spec.loader is None:
|
|
45
|
+
raise ImportError(f"session_utils が見つかりません: {util_path}")
|
|
46
|
+
module = importlib.util.module_from_spec(spec)
|
|
47
|
+
spec.loader.exec_module(module) # type: ignore[attr-defined]
|
|
48
|
+
return module
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def find_latest_session() -> str | None:
|
|
52
|
+
if not os.path.isdir(SESSIONS_DIR):
|
|
53
|
+
return None
|
|
54
|
+
files = [f for f in os.listdir(SESSIONS_DIR) if f.endswith('.tmp')]
|
|
55
|
+
if not files:
|
|
56
|
+
return None
|
|
57
|
+
return os.path.join(SESSIONS_DIR, max(files))
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
def extract_section(content: str, heading: str) -> str:
|
|
61
|
+
"""``session_utils.extract_section`` への薄いラッパー(後方互換用)。
|
|
62
|
+
|
|
63
|
+
過去にこのモジュール直下にあった ``extract_section`` を呼び出すテスト・スクリプトとの
|
|
64
|
+
互換維持のため、モジュールレベルで公開する。実体は :mod:`session_utils` 側にある。
|
|
65
|
+
"""
|
|
66
|
+
return _load_session_utils().extract_section(content, heading)
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
def extract_genba(content: str) -> str:
|
|
70
|
+
"""セッション本文から「現在地:」行の値を抽出する(architecture §2.3)。
|
|
71
|
+
|
|
72
|
+
行正規表現 ``^現在地:[ \\t]*(.*)$`` (MULTILINE) でマッチし、
|
|
73
|
+
トリム済みの値を返す。行が存在しない場合は空文字列(後方互換)。
|
|
74
|
+
|
|
75
|
+
Args:
|
|
76
|
+
content: セッションファイル全体のテキスト。
|
|
77
|
+
|
|
78
|
+
Returns:
|
|
79
|
+
現在地の値(trim 済み)、または空文字列(行なし・値なし)。
|
|
80
|
+
"""
|
|
81
|
+
m = _GENBA_RE.search(content)
|
|
82
|
+
return m.group(1).strip() if m else ''
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
def _tail(text: str, n: int) -> str:
|
|
86
|
+
"""テキストの末尾 n 行を返す(architecture §3.5)。
|
|
87
|
+
|
|
88
|
+
行数が n 以下の場合はテキストをそのまま返す(切り詰めない)。
|
|
89
|
+
|
|
90
|
+
Args:
|
|
91
|
+
text: 対象テキスト。
|
|
92
|
+
n: 末尾から取得する行数。
|
|
93
|
+
|
|
94
|
+
Returns:
|
|
95
|
+
末尾 n 行(n 以下の場合は全体)。
|
|
96
|
+
|
|
97
|
+
Note:
|
|
98
|
+
n=0 のとき ``lines[-0:]`` は ``lines[0:]``(全体)と等価なため、
|
|
99
|
+
全行を返す(切り詰めない)。Python の ``-0 == 0`` による反直感挙動(CR M-04)。
|
|
100
|
+
呼び出し元は ``APPROACH_TAIL_LINES=15``(固定定数)のため実害はないが、
|
|
101
|
+
仕様として明記・固定する。
|
|
102
|
+
"""
|
|
103
|
+
lines = text.splitlines()
|
|
104
|
+
return '\n'.join(lines[-n:]) if len(lines) > n else text
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
def _sanitize_genba(value: str) -> str:
|
|
108
|
+
"""現在地の値を出力に埋め込む前にサニタイズする(architecture §10 / SR 観点)。
|
|
109
|
+
|
|
110
|
+
``session_utils.sanitize_value`` への薄いラッパー。
|
|
111
|
+
サニタイズ範囲を ``stop.py::_INHERIT_SANITIZE_RE`` と同等以上に保つため、
|
|
112
|
+
共通関数に委譲する(SR M-1 / CR M-02):
|
|
113
|
+
- 改行文字(\\n / \\r)を除去する
|
|
114
|
+
- C0 制御文字・DEL(\\x7f)・C1 制御文字(\\x80-\\x9f)・U+2028/U+2029 を除去する
|
|
115
|
+
- ``-->`` を ``-- >`` に置換して HTML コメントブロックの破壊を防ぐ
|
|
116
|
+
- タブ(\\t)は保持する(SR L-1・session_utils.sanitize_value 参照)
|
|
117
|
+
"""
|
|
118
|
+
return _load_session_utils().sanitize_value(value)
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
def main():
|
|
122
|
+
path = find_latest_session()
|
|
123
|
+
if not path or not os.path.exists(path):
|
|
124
|
+
sys.exit(0)
|
|
125
|
+
|
|
126
|
+
with open(path, 'r', encoding='utf-8') as f:
|
|
127
|
+
content = f.read()
|
|
128
|
+
|
|
129
|
+
session_utils = _load_session_utils()
|
|
130
|
+
_extract_section = session_utils.extract_section
|
|
131
|
+
_sanitize = session_utils.sanitize_value
|
|
132
|
+
|
|
133
|
+
date_str = os.path.basename(path).replace('.tmp', '')
|
|
134
|
+
|
|
135
|
+
# date_str の YYYYMMDD 形式検証(SR L-3):
|
|
136
|
+
# ファイル名経由で任意文字列が date_str に混入するのを防ぐ。
|
|
137
|
+
# 8桁数字以外のファイル名はヘッダへの注入を避けるため exit 0 でスキップする。
|
|
138
|
+
if not _DATE_STR_RE.match(date_str):
|
|
139
|
+
sys.exit(0)
|
|
140
|
+
|
|
141
|
+
# 現在地フィールドを読み取る(architecture §3.2 step2)
|
|
142
|
+
genba = extract_genba(content)
|
|
143
|
+
genba_in_progress = genba != '' and genba != GENBA_DONE
|
|
144
|
+
|
|
145
|
+
todos = _extract_section(content, '残タスク')
|
|
146
|
+
successes = _extract_section(content, 'うまくいったアプローチ')
|
|
147
|
+
failures = _extract_section(content, '試みたが失敗したアプローチ')
|
|
148
|
+
|
|
149
|
+
# - [ ] 行のみにフィルタ(architecture §3.4)
|
|
150
|
+
# フィルタ判定は元行の lstrip() で行い(- [ ] プレフィックス保持)、
|
|
151
|
+
# 出力時に sanitize_value でサニタイズする(SR M-2)。
|
|
152
|
+
pending_todos = [
|
|
153
|
+
_sanitize(line) for line in todos.splitlines()
|
|
154
|
+
if line.lstrip().startswith('- [ ]')
|
|
155
|
+
]
|
|
156
|
+
|
|
157
|
+
# early-exit 判定(architecture §3.2 step4)
|
|
158
|
+
if not genba_in_progress and not pending_todos and not successes and not failures:
|
|
159
|
+
sys.exit(0)
|
|
160
|
+
|
|
161
|
+
lines = []
|
|
162
|
+
|
|
163
|
+
# ①ワークフロー復帰指示(現在地が進行中のときのみ・出力冒頭)
|
|
164
|
+
if genba_in_progress:
|
|
165
|
+
safe_genba = _sanitize_genba(genba)
|
|
166
|
+
lines.append(
|
|
167
|
+
f'⚠️ dev-workflow 進行中(現在地: {safe_genba})。\n'
|
|
168
|
+
f'残作業に直接着手せず、対応 skill(develop / review-phase / start)経由で再開し、\n'
|
|
169
|
+
f'各エージェント出力後の Approval Flow を守ること。'
|
|
170
|
+
)
|
|
171
|
+
|
|
172
|
+
# ②ヘッダ
|
|
173
|
+
lines.append(f'[C3 セッション復元: {date_str} / 圧縮後リマインダー]')
|
|
174
|
+
|
|
175
|
+
# ③残タスク(- [ ] 行のみ・0件ならセクション省略)
|
|
176
|
+
if pending_todos:
|
|
177
|
+
lines.append('\n## 残タスク')
|
|
178
|
+
lines.append('\n'.join(pending_todos))
|
|
179
|
+
|
|
180
|
+
# ④うまくいったアプローチ(末尾 N 行に切り詰め・行単位でサニタイズ)(SR M-2)
|
|
181
|
+
if successes:
|
|
182
|
+
lines.append('\n## うまくいったアプローチ')
|
|
183
|
+
tail_text = _tail(successes, APPROACH_TAIL_LINES)
|
|
184
|
+
sanitized_lines = [_sanitize(line) for line in tail_text.splitlines()]
|
|
185
|
+
lines.append('\n'.join(sanitized_lines))
|
|
186
|
+
|
|
187
|
+
# ⑤試みたが失敗したアプローチ(末尾 N 行に切り詰め・行単位でサニタイズ)(SR M-2)
|
|
188
|
+
if failures:
|
|
189
|
+
lines.append('\n## 試みたが失敗したアプローチ')
|
|
190
|
+
tail_text = _tail(failures, APPROACH_TAIL_LINES)
|
|
191
|
+
sanitized_lines = [_sanitize(line) for line in tail_text.splitlines()]
|
|
192
|
+
lines.append('\n'.join(sanitized_lines))
|
|
193
|
+
|
|
194
|
+
print('\n'.join(lines))
|
|
195
|
+
|
|
196
|
+
|
|
197
|
+
if __name__ == '__main__':
|
|
198
|
+
main()
|
{claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/.claude/hooks/session_utils.py
RENAMED
|
@@ -5,6 +5,45 @@ import os
|
|
|
5
5
|
import re
|
|
6
6
|
from datetime import datetime, timezone
|
|
7
7
|
|
|
8
|
+
# ---------------------------------------------------------------------------
|
|
9
|
+
# 共通サニタイズ(SR M-1 / CR M-02 / SR L-1)
|
|
10
|
+
# stop.py::_INHERIT_SANITIZE_RE と同一範囲。
|
|
11
|
+
# C0 制御文字(\t=\x09 除く)・DEL・C1 制御文字・U+2028/U+2029 を除去する。
|
|
12
|
+
# ---------------------------------------------------------------------------
|
|
13
|
+
|
|
14
|
+
_VALUE_SANITIZE_RE = re.compile(
|
|
15
|
+
r'[\x00-\x08\x0b-\x1f\x7f-\x9f' + chr(0x2028) + chr(0x2029) + r']'
|
|
16
|
+
)
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def sanitize_value(text: str) -> str:
|
|
20
|
+
"""セッションファイル由来の文字列を出力埋め込み前にサニタイズする(信頼境界)。
|
|
21
|
+
|
|
22
|
+
- 改行(\\n / \\r)を除去する
|
|
23
|
+
- C0 制御文字(\\x00-\\x08, \\x0b-\\x1f)・DEL(\\x7f)・
|
|
24
|
+
C1 制御文字(\\x80-\\x9f)・U+2028・U+2029 を除去する
|
|
25
|
+
- ``-->`` を ``-- >`` に置換して HTML コメントブロック破壊を防ぐ
|
|
26
|
+
|
|
27
|
+
タブ \\t (\\x09) を保持する意図:
|
|
28
|
+
既存の append_checkpoint と挙動を一致させるため。
|
|
29
|
+
現在地値・残タスク行にタブが含まれる正当ユースケースは設計上ないが、
|
|
30
|
+
除去しても保持しても害はなく、既存挙動(stop.py / append_checkpoint)との
|
|
31
|
+
一貫性を優先して保持する(SR L-1)。
|
|
32
|
+
|
|
33
|
+
単一行 / 行単位で扱う値(現在地・残タスク行・成功/失敗行・label)に適用する。
|
|
34
|
+
複数行ブロックを保持する body(append_checkpoint の summary)には適用しない。
|
|
35
|
+
|
|
36
|
+
Args:
|
|
37
|
+
text: サニタイズ対象の文字列。
|
|
38
|
+
|
|
39
|
+
Returns:
|
|
40
|
+
サニタイズ済みの文字列。
|
|
41
|
+
"""
|
|
42
|
+
sanitized = text.replace('\n', '').replace('\r', '')
|
|
43
|
+
sanitized = _VALUE_SANITIZE_RE.sub('', sanitized)
|
|
44
|
+
return sanitized.replace('-->', '-- >')
|
|
45
|
+
|
|
46
|
+
|
|
8
47
|
_HOOKS_DIR = os.path.dirname(os.path.abspath(__file__))
|
|
9
48
|
_CLAUDE_DIR = os.path.dirname(_HOOKS_DIR)
|
|
10
49
|
SESSIONS_DIR = os.path.join(_CLAUDE_DIR, 'memory', 'sessions')
|
|
@@ -22,6 +61,7 @@ def create_session_template(date_str: str) -> str:
|
|
|
22
61
|
f"SESSION: {date_str}\n"
|
|
23
62
|
f"AGENT: \n"
|
|
24
63
|
f"DURATION: \n"
|
|
64
|
+
f"現在地: \n"
|
|
25
65
|
f"\n"
|
|
26
66
|
f"## うまくいったアプローチ\n"
|
|
27
67
|
f"\n"
|
|
@@ -104,13 +144,13 @@ def append_checkpoint(session_file: str, label: str, summary: str) -> None:
|
|
|
104
144
|
ensure_session_initialized(session_file, date_str)
|
|
105
145
|
|
|
106
146
|
ts = datetime.now(timezone.utc).isoformat()
|
|
107
|
-
#
|
|
147
|
+
# body(summary)は複数行 Markdown を保持するため sanitize_value を適用しない(plan-report §3.2)。
|
|
148
|
+
# --> 置換 + 制御文字なし(summary は信頼済み内部生成 or ユーザー入力の短文のみ)。
|
|
108
149
|
body = summary.strip().replace('-->', '-- >')
|
|
109
150
|
# label のサニタイズ(ターミナルインジェクション対策 + HTML コメントブロック保護):
|
|
110
|
-
#
|
|
111
|
-
#
|
|
112
|
-
sanitized_label =
|
|
113
|
-
sanitized_label = sanitized_label.replace('-->', '-- >')
|
|
151
|
+
# sanitize_value() を共通関数として使用(SR M-1 / CR M-02)。
|
|
152
|
+
# DEL(\x7f) / C1(\x80-\x9f) / U+2028/U+2029 も除去する(旧 regex より範囲拡張)。
|
|
153
|
+
sanitized_label = sanitize_value(label)
|
|
114
154
|
block = (
|
|
115
155
|
f"\n"
|
|
116
156
|
f"## [Checkpoint: {sanitized_label} - {ts}]\n"
|
{claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/.claude/skills/dev-workflow/SKILL.md
RENAMED
|
@@ -12,6 +12,18 @@ user-invocable: false
|
|
|
12
12
|
|
|
13
13
|
---
|
|
14
14
|
|
|
15
|
+
## セッションファイル運用総則
|
|
16
|
+
|
|
17
|
+
各フェーズ承認後は、セッションファイルの `- [ ] {フェーズ名}` を `- [x]` に Edit すると同時に、`現在地:` 行を次フェーズ名へ Edit すること。
|
|
18
|
+
|
|
19
|
+
例: `現在地: フェーズC 計画中`、フェーズ E 完了時は `現在地: 完了`
|
|
20
|
+
|
|
21
|
+
`現在地:` は行フィールド形式(`現在地: {値}` 1行)で維持する。`## 現在地` 見出しにしない。
|
|
22
|
+
|
|
23
|
+
> 注: 「フェーズ承認後」が原則だが、フェーズ完了直後に更新するケースもある(D-1・D-4 等の tester 完了トリガーなど)。承認とタスク完了が同一ステップになる場合は完了時点で即 Edit する(CR L-02)。
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
15
27
|
## フェーズ A: ヒアリング
|
|
16
28
|
|
|
17
29
|
`.claude/agents/interviewer.md` を Read してペルソナを採用する。
|
|
@@ -52,7 +64,7 @@ user-invocable: false
|
|
|
52
64
|
}
|
|
53
65
|
```
|
|
54
66
|
|
|
55
|
-
承認後 → セッションファイルの `- [ ] ヒアリング` を `- [x] ヒアリング` に Edit して**フェーズ B** へ。
|
|
67
|
+
承認後 → セッションファイルの `- [ ] ヒアリング` を `- [x] ヒアリング` に Edit し、`現在地:` を `現在地: フェーズB 設計中` に Edit して**フェーズ B** へ。
|
|
56
68
|
|
|
57
69
|
**知識蓄積:**
|
|
58
70
|
- 「否認・修正を依頼する」: `## 試みたが失敗したアプローチ` に教訓をルール形式で追記し `patterns` に追加する
|
|
@@ -102,7 +114,7 @@ user-invocable: false
|
|
|
102
114
|
}
|
|
103
115
|
```
|
|
104
116
|
|
|
105
|
-
承認後 → セッションファイルの `- [ ] 設計` を `- [x] 設計` に Edit して**フェーズ C** へ。
|
|
117
|
+
承認後 → セッションファイルの `- [ ] 設計` を `- [x] 設計` に Edit し、`現在地:` を `現在地: フェーズC 計画中` に Edit して**フェーズ C** へ。
|
|
106
118
|
|
|
107
119
|
**知識蓄積:**
|
|
108
120
|
- 「否認・修正を依頼する」: `## 試みたが失敗したアプローチ` に教訓をルール形式で追記し `patterns` に追加する
|
|
@@ -167,7 +179,7 @@ plan-report の全タスクを走査し、以下の形式でテキスト出力
|
|
|
167
179
|
}
|
|
168
180
|
```
|
|
169
181
|
|
|
170
|
-
承認後 → セッションファイルの `- [ ] 計画` を `- [x] 計画` に Edit して**C-3(計画監査ゲート)** へ。
|
|
182
|
+
承認後 → セッションファイルの `- [ ] 計画` を `- [x] 計画` に Edit し、`現在地:` を `現在地: フェーズD 実装中` に Edit して**C-3(計画監査ゲート)** へ。
|
|
171
183
|
|
|
172
184
|
**知識蓄積:**
|
|
173
185
|
- 「否認・修正を依頼する」: `## 試みたが失敗したアプローチ` に教訓をルール形式で追記し `patterns` に追加する
|
|
@@ -350,7 +362,7 @@ bug-fix モードでは D-1(Red tester)と D-4(Refactor)をスキップ
|
|
|
350
362
|
以下の順で実行する: **D-2(bug-fix モード)→ D-2.5(Stuck チェック・bug-fix モード)→ D-3(bug-fix モード)→ フェーズ E**。
|
|
351
363
|
|
|
352
364
|
**D-2(bug-fix モード)**: Agent ツールで `developer` を起動する。プロンプトには debug-analysis の**ファイルパスのみ**を含め、内容は agent 側で Read させる(プロンプトに展開しない)。
|
|
353
|
-
完了後、セッションファイルの `- [ ] developer: 修正実装` を `- [x]` に Edit する。
|
|
365
|
+
完了後、セッションファイルの `- [ ] developer: 修正実装` を `- [x]` に Edit し、`現在地:` を `現在地: bug-fix 動作確認中` に Edit する。
|
|
354
366
|
|
|
355
367
|
**D-2.5(bug-fix モード)**: 通常の D-2.5 と同じ Stuck チェック手順(debug-needed-*.md 検出時の systematic-debugger 起動・developer 再実行)を実行する。
|
|
356
368
|
ただし末尾の AskUserQuestion 承認後の Edit 対象は `- [ ] developer: 修正実装` ではなく既に D-2 で `[x]` 化済みのため**スキップする**(bug-fix モードの修正実装承認は D-3 の動作確認で代替する)。
|
|
@@ -372,7 +384,7 @@ AskUserQuestion で確認する:
|
|
|
372
384
|
}
|
|
373
385
|
```
|
|
374
386
|
|
|
375
|
-
「全合格」承認後 → セッションファイルの `- [ ] tester: 動作確認` を `- [x]` に Edit して**フェーズ E** へ。
|
|
387
|
+
「全合格」承認後 → セッションファイルの `- [ ] tester: 動作確認` を `- [x]` に Edit し、`現在地:` を `現在地: フェーズE レビュー中` に Edit して**フェーズ E** へ。
|
|
376
388
|
「不合格あり」を選んだ場合 → D-2 に戻る。合格するまで繰り返す。
|
|
377
389
|
|
|
378
390
|
bug-fix モード固有の動作:
|
|
@@ -387,7 +399,7 @@ legacy TDD モードまたは parallel-agents モードで実装される。
|
|
|
387
399
|
|
|
388
400
|
Agent ツールで `tester` エージェントを起動する。→ 失敗するテストを先に作成する。**必ず `.claude/reports/test-report-YYYYMMDD-HHMMSS.md` を Write してから終了すること。**
|
|
389
401
|
|
|
390
|
-
完了後 → セッションファイルの `- [ ] tester: Red フェーズ` を `- [x]` に Edit する。
|
|
402
|
+
完了後 → セッションファイルの `- [ ] tester: Red フェーズ` を `- [x]` に Edit し、`現在地:` を `現在地: フェーズD 実装中 / 次: developer Green` に Edit する。
|
|
391
403
|
|
|
392
404
|
### D-2: developer(Green フェーズ)
|
|
393
405
|
|
|
@@ -419,7 +431,7 @@ AskUserQuestion で確認する:
|
|
|
419
431
|
}
|
|
420
432
|
```
|
|
421
433
|
|
|
422
|
-
承認後 → セッションファイルの `- [ ] developer: Green フェーズ` を `- [x]` に Edit する(**bug-fix モードではこの Edit をスキップする**。D-2 で `- [ ] developer: 修正実装` を既に `[x]` 化済みのため、Green フェーズ行自体がセッションファイルに存在しない)。
|
|
434
|
+
承認後 → セッションファイルの `- [ ] developer: Green フェーズ` を `- [x]` に Edit し、`現在地:` を `現在地: フェーズD 実装中 / 次: Refactor` に Edit する(**bug-fix モードではこの Edit をスキップする**。D-2 で `- [ ] developer: 修正実装` を既に `[x]` 化済みのため、Green フェーズ行自体がセッションファイルに存在しない)。
|
|
423
435
|
|
|
424
436
|
**知識蓄積:**
|
|
425
437
|
- 「否認・再実装を依頼する」: `## 試みたが失敗したアプローチ` に教訓をルール形式で追記し `patterns` に追加する
|
|
@@ -448,7 +460,7 @@ AskUserQuestion で確認する:
|
|
|
448
460
|
|
|
449
461
|
Agent ツールで `developer` エージェントを起動する。→ テストを壊さずにコードを整理する。
|
|
450
462
|
|
|
451
|
-
完了後 → セッションファイルの `- [ ] developer: Refactor フェーズ` を `- [x]` に Edit する。
|
|
463
|
+
完了後 → セッションファイルの `- [ ] developer: Refactor フェーズ` を `- [x]` に Edit し、`現在地:` を `現在地: フェーズD 実装中 / 次ゲート: tester 最終確認` に Edit する。
|
|
452
464
|
|
|
453
465
|
### D-5: tester(最終確認)
|
|
454
466
|
|
|
@@ -468,7 +480,7 @@ AskUserQuestion で確認する:
|
|
|
468
480
|
}
|
|
469
481
|
```
|
|
470
482
|
|
|
471
|
-
承認後 → セッションファイルの `- [ ] tester: 最終確認` を `- [x]` に Edit して**フェーズ E** へ。
|
|
483
|
+
承認後 → セッションファイルの `- [ ] tester: 最終確認` を `- [x]` に Edit し、`現在地:` を `現在地: フェーズE レビュー中` に Edit して**フェーズ E** へ。
|
|
472
484
|
|
|
473
485
|
**知識蓄積:**
|
|
474
486
|
- 「否認・修正を依頼する」: `## 試みたが失敗したアプローチ` に教訓をルール形式で追記し `patterns` に追加する
|
|
@@ -511,7 +523,7 @@ AskUserQuestion で確認する:
|
|
|
511
523
|
}
|
|
512
524
|
```
|
|
513
525
|
|
|
514
|
-
承認後 → セッションファイルの `- [ ] code-review` を `- [x]` に Edit して E-2 へ。
|
|
526
|
+
承認後 → セッションファイルの `- [ ] code-review` を `- [x]` に Edit し、`現在地:` を `現在地: フェーズE レビュー中 / 次: security-review` に Edit して E-2 へ。
|
|
515
527
|
|
|
516
528
|
**指摘がある場合:**
|
|
517
529
|
指摘一覧をテキストで提示してから AskUserQuestion で方針を確認する:
|
|
@@ -530,7 +542,7 @@ AskUserQuestion で確認する:
|
|
|
530
542
|
```
|
|
531
543
|
|
|
532
544
|
**「全て対応する」の場合:**
|
|
533
|
-
全指摘に `> **[対応予定]**` をマークし、セッションファイルの `- [ ] code-review` を `- [x]` に Edit してから**フェーズ C** へ(内部遷移・Step 0 なし)。
|
|
545
|
+
全指摘に `> **[対応予定]**` をマークし、セッションファイルの `- [ ] code-review` を `- [x]` に Edit し、`現在地:` を `現在地: フェーズC 計画中(レビュー差し戻し)` に Edit してから**フェーズ C** へ(内部遷移・Step 0 なし)。
|
|
534
546
|
|
|
535
547
|
**「対応する指摘を選ぶ」の場合:**
|
|
536
548
|
続けて AskUserQuestion で確認する:
|
|
@@ -553,7 +565,7 @@ AskUserQuestion で確認する:
|
|
|
553
565
|
--reviewer code-reviewer
|
|
554
566
|
```
|
|
555
567
|
4. セッションファイルの `## うまくいったアプローチ` に `[許容例外] {指摘内容} → {許容理由}` の形式で追記し `patterns` に記録する
|
|
556
|
-
5. セッションファイルの `- [ ] code-review` を `- [x]` に Edit してから**フェーズ C** へ(内部遷移・Step 0 なし)。
|
|
568
|
+
5. セッションファイルの `- [ ] code-review` を `- [x]` に Edit し、`現在地:` を `現在地: フェーズC 計画中(レビュー差し戻し)` に Edit してから**フェーズ C** へ(内部遷移・Step 0 なし)。
|
|
557
569
|
|
|
558
570
|
**「全て許容して進む」の場合:**
|
|
559
571
|
AskUserQuestion で許容理由を確認する:
|
|
@@ -567,7 +579,7 @@ AskUserQuestion で許容理由を確認する:
|
|
|
567
579
|
1. 全指摘の直下に `> **[許容]** {理由}` を Edit で追記する(検出記録は削除しない)
|
|
568
580
|
2. **review-hint 判断記録**: 全 `[CR-XX-NNN]` 指摘について `record_review_decision.py --decision accepted` で記録する
|
|
569
581
|
3. セッションファイルの `## うまくいったアプローチ` に `[許容例外] {指摘内容} → {許容理由}` の形式で追記し `patterns` に記録する
|
|
570
|
-
4. セッションファイルの `- [ ] code-review` を `- [x]` に Edit して E-2 へ。
|
|
582
|
+
4. セッションファイルの `- [ ] code-review` を `- [x]` に Edit し、`現在地:` を `現在地: フェーズE レビュー中 / 次: security-review` に Edit して E-2 へ。
|
|
571
583
|
|
|
572
584
|
**「否認・再レビューを依頼する」の場合:**
|
|
573
585
|
追加の AskUserQuestion でフィードバックを確認し再実行する。
|
|
@@ -607,7 +619,7 @@ AskUserQuestion で確認する:
|
|
|
607
619
|
}
|
|
608
620
|
```
|
|
609
621
|
|
|
610
|
-
承認後 → セッションファイルの `- [ ] security-review` を `- [x]` に Edit する。続けて **「引き継ぎバックログの照合」**(後述の共通ステップ)を実行してからコミットを提案する。
|
|
622
|
+
承認後 → セッションファイルの `- [ ] security-review` を `- [x]` に Edit し、`現在地:` を `現在地: 完了` に Edit する。続けて **「引き継ぎバックログの照合」**(後述の共通ステップ)を実行してからコミットを提案する。
|
|
611
623
|
**tier-routing 結果記録**: フェーズ E の最終承認時のみ Bash で記録する(多重カウント防止のため E-1 では記録しない):
|
|
612
624
|
```bash
|
|
613
625
|
python .claude/skills/dev-workflow/scripts/record_tier_outcome.py --outcome success
|
|
@@ -630,7 +642,7 @@ python .claude/skills/dev-workflow/scripts/record_tier_outcome.py --outcome succ
|
|
|
630
642
|
```
|
|
631
643
|
|
|
632
644
|
**「全て対応する」の場合:**
|
|
633
|
-
全指摘に `> **[対応予定]**` をマークし、セッションファイルの `- [ ] security-review` を `- [x]` に Edit してから**フェーズ C** へ(内部遷移・Step 0 なし)。
|
|
645
|
+
全指摘に `> **[対応予定]**` をマークし、セッションファイルの `- [ ] security-review` を `- [x]` に Edit し、`現在地:` を `現在地: フェーズC 計画中(レビュー差し戻し)` に Edit してから**フェーズ C** へ(内部遷移・Step 0 なし)。
|
|
634
646
|
|
|
635
647
|
**「対応する指摘を選ぶ」の場合:**
|
|
636
648
|
続けて AskUserQuestion で確認する:
|
|
@@ -653,7 +665,7 @@ python .claude/skills/dev-workflow/scripts/record_tier_outcome.py --outcome succ
|
|
|
653
665
|
--reviewer security-reviewer
|
|
654
666
|
```
|
|
655
667
|
4. セッションファイルの `## うまくいったアプローチ` に `[許容例外] {指摘内容} → {許容理由}` の形式で追記し `patterns` に記録する
|
|
656
|
-
5. セッションファイルの `- [ ] security-review` を `- [x]` に Edit してから**フェーズ C** へ(内部遷移・Step 0 なし)。
|
|
668
|
+
5. セッションファイルの `- [ ] security-review` を `- [x]` に Edit し、`現在地:` を `現在地: フェーズC 計画中(レビュー差し戻し)` に Edit してから**フェーズ C** へ(内部遷移・Step 0 なし)。
|
|
657
669
|
|
|
658
670
|
**「全て許容して完了」の場合:**
|
|
659
671
|
AskUserQuestion で許容理由を確認する:
|
|
@@ -667,7 +679,7 @@ AskUserQuestion で許容理由を確認する:
|
|
|
667
679
|
1. 全指摘の直下に `> **[許容]** {理由}` を Edit で追記する(検出記録は削除しない)
|
|
668
680
|
2. **review-hint 判断記録**: 全 `[SR-XX-NNN]` 指摘について `record_review_decision.py --decision accepted` で記録する
|
|
669
681
|
3. セッションファイルの `## うまくいったアプローチ` に `[許容例外] {指摘内容} → {許容理由}` の形式で追記し `patterns` に記録する
|
|
670
|
-
4. セッションファイルの `- [ ] security-review` を `- [x]` に Edit する。続けて **「引き継ぎバックログの照合」**(後述の共通ステップ)を実行してからコミットを提案する。
|
|
682
|
+
4. セッションファイルの `- [ ] security-review` を `- [x]` に Edit し、`現在地:` を `現在地: 完了` に Edit する。続けて **「引き継ぎバックログの照合」**(後述の共通ステップ)を実行してからコミットを提案する。
|
|
671
683
|
5. **tier-routing 結果記録**: 全許容で完了するのも「成功」としてカウント:
|
|
672
684
|
```bash
|
|
673
685
|
python .claude/skills/dev-workflow/scripts/record_tier_outcome.py --outcome success
|
{claude_code_conductor-2.34.0 → claude_code_conductor-2.36.0}/.claude/skills/init-session/SKILL.md
RENAMED
|
@@ -18,6 +18,11 @@ description: セッション開始時に前回の作業状態・残タスク・
|
|
|
18
18
|
Glob で `.claude/memory/sessions/*.tmp` を検索し、ファイル名(YYYYMMDD)が最大のものを Read する。
|
|
19
19
|
ファイルが存在しない場合は「前回セッションなし」として Step 3 へ進む。
|
|
20
20
|
|
|
21
|
+
> **セキュリティ注記(SR L-2)**: `現在地:` 行の値をユーザーへ表示する前に、
|
|
22
|
+
> 制御文字(C0/C1)・DEL・改行(`\n`/`\r`)・`-->`・U+2028/U+2029 を除去して表示すること。
|
|
23
|
+
> セッションファイルは外部編集が可能な信頼境界であり、悪意ある値が混入した場合の
|
|
24
|
+
> ターミナルインジェクションを防ぐ。
|
|
25
|
+
|
|
21
26
|
---
|
|
22
27
|
|
|
23
28
|
## Step 1.5: 残タスクと git log を照合する(陳腐化チェック)
|
|
@@ -54,6 +59,8 @@ Glob で `.claude/memory/sessions/*.tmp` を検索し、ファイル名(YYYYMM
|
|
|
54
59
|
|
|
55
60
|
### 前回セッション ({前回の日付})
|
|
56
61
|
|
|
62
|
+
**現在地:** {session.tmp の「現在地:」行の値。空なら「(未設定)」と表示。表示前に制御文字・改行・`-->`・U+2028/U+2029 を除去すること(SR L-2)}
|
|
63
|
+
|
|
57
64
|
**残タスク:**
|
|
58
65
|
{残タスクリスト。完了済み [x] は省略する}
|
|
59
66
|
|
|
@@ -111,7 +118,16 @@ AskUserQuestion ツールで以下を提示する:
|
|
|
111
118
|
## Step 5: 選択に応じて分岐する
|
|
112
119
|
|
|
113
120
|
**「続きから作業する」の場合:**
|
|
114
|
-
|
|
121
|
+
Step 1 で読んだ session.tmp の「現在地:」行の値を確認する。
|
|
122
|
+
|
|
123
|
+
- **「現在地:」が非空かつ「完了」でない場合**(dev-workflow フェーズ進行中):
|
|
124
|
+
残タスクに直接着手せず、対応 skill 経由で再開し、各エージェント出力後の Approval Flow を守ること。
|
|
125
|
+
- フェーズ D 実装中 → `develop` skill を使う
|
|
126
|
+
- フェーズ E レビュー中 → `review-phase` skill を使う
|
|
127
|
+
- それ以外 → `start` skill を使う
|
|
128
|
+
|
|
129
|
+
- **「現在地:」が空または「完了」の場合**:
|
|
130
|
+
従来どおり残タスク(引き継ぎバックログ)の内容を確認してそのまま作業に入る。
|
|
115
131
|
|
|
116
132
|
**「ワークフローで始める」の場合:**
|
|
117
133
|
Skill ツールで `start` スキルを呼び出す。
|
|
@@ -216,6 +216,19 @@ worktree path は Agent ツール返り値の `<worktree><worktreePath>...</work
|
|
|
216
216
|
|
|
217
217
|
全タスク成功した wave に対して以下を順に実行する。
|
|
218
218
|
|
|
219
|
+
#### 2-F-0: 親 cwd をプロジェクトルートへ復帰(無条件・必須)
|
|
220
|
+
|
|
221
|
+
worktree Agent 完了後、Claude Code の既知バグ([Issue #28017](https://github.com/anthropics/claude-code/issues/28017) "Task tool with isolation=worktree leaks CWD to parent session"・closed as duplicate)により、**親 Claude の Bash cwd が `.claude/worktrees/agent-*` 内へ移動したまま戻らない**ことがある(発生はバージョン・環境・タイミング依存)。この状態だと 2-F-1〜2-F-3 の取り込み・コミット・削除が worktree 内で走って正しく行われない(Issue でも "Subsequent Bash commands run in the wrong directory" と報告)。とくに cwd が worktree 内のままだと worktree ディレクトリの削除に失敗しやすい(OS によっては cwd 配下を削除できない)。
|
|
222
|
+
|
|
223
|
+
これを防ぐため、**2-F の最初に無条件でプロジェクトルートへ戻す**:
|
|
224
|
+
|
|
225
|
+
```bash
|
|
226
|
+
cd <ROOT>
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
- `<ROOT>` = プロジェクトルートの絶対パス。最初の worktree Agent を起動する前(cwd がまだルート)の `pwd` の値で、セッション開始時の作業ディレクトリと同じ。worktree 内から `git rev-parse --show-toplevel` を打つと worktree のルートが返るため、ルート判定には使わず **事前に控えた絶対パス** を使う。
|
|
230
|
+
- cwd が漏れていなくても `cd <ROOT>` は無害。判定せず毎 wave 無条件で実行する(Issue が挙げる公式ワークアラウンド "manually cd back" に準拠)。`cd` は C3 の pre_tool hook の検査対象外のためブロックされない。
|
|
231
|
+
|
|
219
232
|
#### 2-F-1: 成果物の取り込み
|
|
220
233
|
|
|
221
234
|
各 worktree の `writes` ファイルを main に取り込む。**親 Claude が一括で行う**:
|
|
@@ -269,6 +282,10 @@ git branch -D worktree-agent-{id}
|
|
|
269
282
|
#### 2-F-4: セッション記録
|
|
270
283
|
|
|
271
284
|
- `- [ ] Wave {N}` を `- [x] Wave {N}` に Edit
|
|
285
|
+
- `現在地:` を以下のルールで Edit(`dev-workflow/SKILL.md` の「セッションファイル運用総則」参照):
|
|
286
|
+
- Wave N 成功時: `現在地: Wave {N} 完了 / 次: Wave {N+1}`
|
|
287
|
+
- 最終 Wave 完了時: `現在地: 完了`(レビューへ遷移する場合は `現在地: フェーズE レビュー中`)
|
|
288
|
+
- Wave をスキップした時: `現在地: Wave {N} skipped / 次: Wave {N+1}`
|
|
272
289
|
- `session_utils.append_checkpoint()` を呼び出して checkpoint ブロックを追記:
|
|
273
290
|
|
|
274
291
|
```bash
|
|
@@ -63,6 +63,7 @@ site/
|
|
|
63
63
|
.claude/docs/C3_tier_routing_cost_integration_設計.md
|
|
64
64
|
.claude/docs/grill-me機能を実装する際の考慮点とC3との相性や超えるべき壁.md
|
|
65
65
|
.claude/docs/C3のconfig_policyとversion_upgradeの考慮点と超えるべき壁.md
|
|
66
|
+
.claude/docs/model_settings.md
|
|
66
67
|
|
|
67
68
|
# codex 対応調査メモ (個人作業ノート、配布・コミット対象外)
|
|
68
69
|
.claude/docs/codex対応/
|
|
@@ -1,5 +1,46 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [2.36.0] - 2026-06-14
|
|
4
|
+
|
|
5
|
+
**セッションファイルに「現在地」フィールドを新設し、コンテキスト圧縮(コンパクト)後の肥大ループとワークフロー無視を同時に解消(hook・skill 手順の変更/破壊的変更なし)**: 200K コンテキスト運用で、セッション復元(コンパクト後・`/init-session`)の経路が「構造のない丸投げ」になっていたことが 2 つの症状を生んでいた。(1) **コンパクト肥大ループ**: `pre_compact.py` がコンパクト直前に状態を無上限追記させ、`restore_session.py` がコンパクト後に `## 残タスク` / `## うまくいったアプローチ` / `## 試みたが失敗したアプローチ` の 3 セクションを完了済み `- [x]` 行も含め丸ごと再注入し続けるため、コンテキスト使用率が上がり→さらにコンパクトが早まる正のフィードバックになっていた。(2) **ワークフロー無視**: 復元時にフェーズ状態が単なる ToDo として注入されるだけで「dev-workflow 進行中・skill 経由で再開せよ・Approval Flow を守れ」の指示が無く、`/init-session` の「続きから作業する」も「そのまま作業に入る」となっていたため、復元後に dev-workflow を飛ばして直接着手しがちだった。両症状の根は同じ「復元時に構造化された現在地が無い」ことであり、`現在地:` の 1 行フィールドを新設して構造化することで、再注入を小さく保ちつつワークフロー復帰を確実化する。
|
|
6
|
+
|
|
7
|
+
### 追加
|
|
8
|
+
|
|
9
|
+
- **`.claude/hooks/session_utils.py`**: `create_session_template()` のテンプレートに `現在地:` 行(`DURATION:` 直後)を追加。デフォルト空=「ワークフロー外(自由作業)」。あわせて単一行値のサニタイズ共通関数 `sanitize_value()` を新設(C0 制御文字・DEL・C1・U+2028/U+2029 除去 + `-->`→`-- >`、タブは保持)。`append_checkpoint` の label サニタイズも本関数に統一(body は複数行 Markdown 保持のため非適用)。
|
|
10
|
+
|
|
11
|
+
### 変更
|
|
12
|
+
|
|
13
|
+
- **`.claude/hooks/restore_session.py`**: コンパクト後の再注入を構造化。(a) `現在地:` を最優先で読み、非空かつ `完了` でなければ「⚠️ dev-workflow 進行中(現在地: …)。残作業に直接着手せず、対応 skill(develop / review-phase / start)経由で再開し、各エージェント出力後の Approval Flow を守ること。」を出力冒頭に注入。(b) `## 残タスク` は `- [ ]` 未完了行のみ注入(`- [x]` 完了行を除外)。(c) `## うまくいったアプローチ` / `## 試みたが失敗したアプローチ` は末尾 15 行(`APPROACH_TAIL_LINES`)に上限化。(d) 3 セクションを行単位でサニタイズ。(e) セッションファイル名 `date_str` を `^\d{8}$` で検証。
|
|
14
|
+
- **`.claude/hooks/pre_compact.py`**: `SAVE_INSTRUCTION` を「無上限に書き出す」から「`現在地:` を現在のフェーズに更新し、`## 残タスク` をチェックリストとして更新(完了は `- [x]` 化・不要行は整理)」へ変更し、肥大を発生源で抑制。
|
|
15
|
+
- **`.claude/skills/dev-workflow/SKILL.md`**: 各フェーズ承認時に `- [x]` 化と同時に `現在地:` を次フェーズへ更新する手順を総則+各箇所に併記(フェーズ E 完了時は `現在地: 完了`)。
|
|
16
|
+
- **`.claude/skills/parallel-agents/SKILL.md`**: Wave 完了処理に `現在地:` 更新を併記。
|
|
17
|
+
- **`.claude/skills/init-session/SKILL.md`**: Step 5「続きから作業する」を、`現在地:` が進行中なら対応 skill 経由で該当フェーズから再開し Approval Flow を守る案内に変更(空または `完了` なら従来どおり直接着手)。
|
|
18
|
+
|
|
19
|
+
### 後方互換
|
|
20
|
+
|
|
21
|
+
- `現在地:` 行が無い既存フォーマットの `.tmp` ファイルでも `restore_session.py` / `stop.py` はクラッシュせず従来どおり動作する(regex 不一致時は空扱い)。公開 API・CLI・DB スキーマに変更なし。**破壊的変更なし**・migration 不要。
|
|
22
|
+
|
|
23
|
+
### 注意
|
|
24
|
+
|
|
25
|
+
- 本変更は hook(`session_utils` / `restore_session` / `pre_compact`)と skill 手順の変更。`c3 update` 適用後、次回のコンパクト・セッション復元から新挙動が反映される(新規 agent 定義の追加ではないためセッション再起動は不要)。
|
|
26
|
+
|
|
27
|
+
## [2.35.0] - 2026-06-10
|
|
28
|
+
|
|
29
|
+
**並列実行 worktree の cwd リーク(Claude Code [Issue #28017](https://github.com/anthropics/claude-code/issues/28017))への暫定ワークアラウンドを追加(手順追加・破壊的変更なし)**: `isolation: "worktree"` の Agent 完了後に親セッションの作業ディレクトリ(cwd)が worktree(`.claude/worktrees/agent-*`)内へ移動したまま戻らない Claude Code の既知バグ(「Task tool with isolation=worktree leaks CWD to parent session」・closed as duplicate・複数 OS で報告)により、wave 完了処理(成果物の取り込み・コミット・worktree 削除)が誤ったディレクトリで走り、特に worktree ディレクトリの削除に失敗する事象がある。公式修正までの暫定対応として、`parallel-agents` skill の wave 完了処理の先頭で **無条件に cwd をプロジェクトルートへ戻す手順 `2-F-0`** を追加した。
|
|
30
|
+
|
|
31
|
+
### 追加
|
|
32
|
+
|
|
33
|
+
- **`.claude/skills/parallel-agents/SKILL.md` 2-F-0(親 cwd をプロジェクトルートへ復帰・無条件・必須)**: 各 wave の完了処理(2-F)の最初で `cd <ROOT>`(`<ROOT>` = 最初の worktree Agent 起動前の cwd の絶対パス)を無条件で実行する。cwd が漏れていなくても無害。Issue が挙げる公式ワークアラウンド "manually cd back" に準拠。これにより後続の 2-F-1(取り込み)・2-F-2(コミット)・2-F-3(削除)が常にプロジェクトルートで実行され、worktree 削除失敗を回避する。
|
|
34
|
+
|
|
35
|
+
### 後方互換
|
|
36
|
+
|
|
37
|
+
- 手順を 1 ステップ追加しただけで、wave の成果物・コミット内容・削除結果は変わらない。公開 API・CLI・DB スキーマ・hook・コード挙動に変更なし。**破壊的変更なし**・migration 不要。
|
|
38
|
+
- 既存の 2-F-3(worktree クリーンアップ)はフォールバック型の手順を温存。本対応は公式修正までの暫定ワークアラウンドであり、ワークアラウンドが効かない場合も従来どおり残留チェック+手動削除で吸収できる。
|
|
39
|
+
|
|
40
|
+
### 注意
|
|
41
|
+
|
|
42
|
+
- 本変更は `parallel-agents` skill(`/develop` のフェーズ D で間接起動)の手順追記。`c3 update` 適用後、次回の並列実装 wave から新手順が読まれる(新規 agent 定義の追加ではないためセッション再起動は不要)。
|
|
43
|
+
|
|
3
44
|
## [2.34.0] - 2026-06-09
|
|
4
45
|
|
|
5
46
|
**設計・計画監査ゲート `design-critic` を追加(機能追加・opt-in・破壊的変更なし)**: 標準ワークフローのフェーズ C(計画)とフェーズ D(実装)の間に、実装前の設計・計画を第三者として敵対的に監査する opt-in ゲート **C-3** を新設した。ブログ記事「Automated Doubt Development Process」に着想を得た「自動化された疑念」を C3 に取り込み、**実装中に発覚していた手戻り(前提崩れ・曖昧さ・抜け漏れ)を実装前に検出**することを狙う。新規 read-only サブエージェント `design-critic` が requirements/architecture/plan を 3 レンズ(前提発掘 `[DC-AS]` / 曖昧さ `[DC-AM]` / 抜け漏れ `[DC-GP]`)で監査し、各 finding に**起因層(A要件 < B設計 < C計画)**を付与する。findings は起因層に応じて正しい上流フェーズへ戻す**層別ルーティング**で対応する(設計起因を計画フェーズに戻しても直らない問題を回避)。
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: claude-code-conductor
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.36.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
|
|
@@ -45,6 +45,7 @@ EXCLUDE_PATTERNS: tuple[str, ...] = (
|
|
|
45
45
|
"docs/C3_tier_routing_cost_integration_設計.md",
|
|
46
46
|
"docs/grill-me機能を実装する際の考慮点とC3との相性や超えるべき壁.md",
|
|
47
47
|
"docs/C3のconfig_policyとversion_upgradeの考慮点と超えるべき壁.md",
|
|
48
|
+
"docs/model_settings.md",
|
|
48
49
|
"docs/codex対応/*",
|
|
49
50
|
"hooks/subagent_log.py",
|
|
50
51
|
"settings.local.json",
|
|
@@ -42,6 +42,7 @@ EXCLUDE_PATTERNS: tuple[str, ...] = (
|
|
|
42
42
|
"docs/C3_tier_routing_cost_integration_設計.md",
|
|
43
43
|
"docs/grill-me機能を実装する際の考慮点とC3との相性や超えるべき壁.md",
|
|
44
44
|
"docs/C3のconfig_policyとversion_upgradeの考慮点と超えるべき壁.md",
|
|
45
|
+
"docs/model_settings.md",
|
|
45
46
|
"docs/codex対応/*",
|
|
46
47
|
"hooks/subagent_log.py",
|
|
47
48
|
"settings.local.json",
|