claude-code-conductor 2.71.1__tar.gz → 2.72.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.71.1 → claude_code_conductor-2.72.0}/.claude/breaking-changes.txt +1 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/.claude/deletions.txt +6 -1
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/.claude/docs/config-policy.md +9 -22
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/.claude/settings.json +0 -13
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/ARCHITECTURE.md +0 -1
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/CHANGELOG.md +26 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/PKG-INFO +1 -3
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/pyproject.toml +0 -4
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/src/c3/__init__.py +1 -1
- claude_code_conductor-2.72.0/tests/test_permission_handler_removal.py +154 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/test_refgraph.py +6 -6
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/test_refgraph_query.py +1 -1
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/test_refgraph_structural.py +22 -15
- claude_code_conductor-2.71.1/.claude/hooks/permission_handler.py +0 -402
- claude_code_conductor-2.71.1/.claude/hooks/permission_handler_toast.py +0 -208
- claude_code_conductor-2.71.1/.claude/permission_rules.json +0 -41
- claude_code_conductor-2.71.1/tests/hooks/test_permission_handler.py +0 -1495
- claude_code_conductor-2.71.1/tests/hooks/test_permission_handler_toast.py +0 -199
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/.claude/.gitignore +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/.claude/CLAUDE.md +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/.claude/agents/architect.md +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/.claude/agents/code-reviewer.md +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/.claude/agents/design-critic.md +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/.claude/agents/developer.md +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/.claude/agents/doc-writer.md +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/.claude/agents/interviewer.md +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/.claude/agents/planner.md +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/.claude/agents/project-setup.md +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/.claude/agents/security-reviewer.md +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/.claude/agents/systematic-debugger.md +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/.claude/agents/tester.md +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/.claude/agents/wt_developer.md +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/.claude/agents/wt_systematic-debugger.md +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/.claude/agents/wt_tester.md +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/.claude/docs/autonomous-mode-onboarding.md +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/.claude/docs/nul-boundary.md +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/.claude/docs/parallel-agents-setup.md +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/.claude/docs/platform-adapters.md +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/.claude/docs/settings.json.md +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/.claude/hooks/_hook_utils.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/.claude/hooks/check_agent_invocation.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/.claude/hooks/consolidate_memory.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/.claude/hooks/patterns_guard.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/.claude/hooks/planner_check.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/.claude/hooks/post_tool.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/.claude/hooks/pre_compact.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/.claude/hooks/pre_tool.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/.claude/hooks/recall_autorebuild.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/.claude/hooks/recall_inject.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/.claude/hooks/report_contract_check.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/.claude/hooks/report_path_guard.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/.claude/hooks/restore_session.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/.claude/hooks/select_tier.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/.claude/hooks/session_mode_watch.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/.claude/hooks/session_start.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/.claude/hooks/session_stop.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/.claude/hooks/session_utils.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/.claude/hooks/statusline.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/.claude/hooks/stop.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/.claude/hooks/tier_autoapply.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/.claude/hooks/tier_gap_check.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/.claude/hooks/worktree_guard.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/.claude/memory/.gitkeep +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/.claude/rules/judgment-principles.md +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/.claude/rules/promoted/index.md +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/.claude/skills/autonomous-mode/SKILL.md +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/.claude/skills/autonomous-mode/scripts/mode_line.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/.claude/skills/brainstorm/SKILL.md +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/.claude/skills/codex-review/SKILL.md +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/.claude/skills/dev-workflow/SKILL.md +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/.claude/skills/dev-workflow/references/c3-omission-declaration.md +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/.claude/skills/dev-workflow/references/code-review-checklist.md +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/.claude/skills/dev-workflow/references/design-critic-rubric.md +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/.claude/skills/dev-workflow/references/design-rubric.md +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/.claude/skills/dev-workflow/references/interview-rubric.md +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/.claude/skills/dev-workflow/references/plan-design-guidelines.md +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/.claude/skills/dev-workflow/references/reachability-map.md +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/.claude/skills/dev-workflow/references/record-protocol.md +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/.claude/skills/dev-workflow/references/security-review-checklist.md +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/.claude/skills/dev-workflow/scripts/detect_execution_verification.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/.claude/skills/dev-workflow/scripts/record_agent_outcome.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/.claude/skills/dev-workflow/scripts/record_review_decision.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/.claude/skills/dev-workflow/scripts/review_hint_inject.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/.claude/skills/develop/SKILL.md +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/.claude/skills/doc/SKILL.md +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/.claude/skills/extract-lib/SKILL.md +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/.claude/skills/init-session/SKILL.md +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/.claude/skills/init-session/scripts/session_guard.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/.claude/skills/mcp-config/SKILL.md +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/.claude/skills/parallel-agents/SKILL.md +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/.claude/skills/pattern-status/SKILL.md +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/.claude/skills/promote-pattern/SKILL.md +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/.claude/skills/recall/SKILL.md +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/.claude/skills/report-timestamp/SKILL.md +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/.claude/skills/report-timestamp/scripts/get_timestamp.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/.claude/skills/review-phase/SKILL.md +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/.claude/skills/setup/SKILL.md +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/.claude/skills/setup/reference.md +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/.claude/skills/setup/templates/coding-standards-template.md +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/.claude/skills/setup/templates/project-conventions-template.md +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/.claude/skills/start/SKILL.md +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/.claude/skills/start/scripts/archive_reports.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/.claude/state/.gitkeep +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/.gitignore +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/LICENSE +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/LICENSES/fastembed-LICENSE +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/LICENSES/fastembed-NOTICE +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/LICENSES/numpy-LICENSE +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/LICENSES/onnxruntime-LICENSE +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/LICENSES/paraphrase-multilingual-MiniLM-L12-v2-LICENSE +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/README.md +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/hatch_build.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/src/c3/__main__.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/src/c3/_db_params.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/src/c3/_excludes.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/src/c3/_terminal.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/src/c3/adapters.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/src/c3/cli.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/src/c3/cli_ask.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/src/c3/cli_doctor.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/src/c3/cli_init.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/src/c3/cli_list.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/src/c3/cli_metrics.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/src/c3/cli_plan.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/src/c3/cli_recall.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/src/c3/cli_run.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/src/c3/cli_tier.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/src/c3/cli_update.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/src/c3/db.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/src/c3/embedding.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/src/c3/gitutil.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/src/c3/mcp_server.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/src/c3/migrate.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/src/c3/migrations/001_initial.sql +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/src/c3/migrations/002_agent_cost_runs.sql +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/src/c3/migrations/003_tier_cost.sql +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/src/c3/migrations/004_agent_outcomes.sql +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/src/c3/migrations/005_drop_agent_tier_bandit.sql +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/src/c3/migrations/006_review_decisions_severity.sql +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/src/c3/migrations/007_review_decisions_resolution.sql +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/src/c3/migrations/008_drop_agent_runs.sql +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/src/c3/migrations/README.md +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/src/c3/migrations/__init__.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/src/c3/paths.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/src/c3/plan_validator.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/src/c3/platforms.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/src/c3/pricing.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/src/c3/question.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/src/c3/recall_chunker.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/src/c3/recall_index.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/src/c3/refgraph.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/src/c3/usage_ingester.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/__init__.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/_pre_compact_helpers.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/conftest.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/fixtures/usage/README.md +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/fixtures/usage/mainline.jsonl +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/fixtures/usage/subagents/agent-deadbeef.jsonl +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/fixtures/usage/subagents/agent-deadbeef.meta.json +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/hooks/__init__.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/hooks/test_check_agent_invocation.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/hooks/test_consolidate_memory.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/hooks/test_detect_execution_verification.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/hooks/test_hook_utils.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/hooks/test_pip_reinstall_reminder.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/hooks/test_planner_check.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/hooks/test_planner_check_dev.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/hooks/test_post_tool.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/hooks/test_pre_tool.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/hooks/test_recall_autorebuild.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/hooks/test_recall_inject.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/hooks/test_record_agent_outcome.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/hooks/test_record_review_decision.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/hooks/test_report_path_guard.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/hooks/test_restore_session.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/hooks/test_review_hint_inject.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/hooks/test_select_tier.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/hooks/test_select_tier_escalation.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/hooks/test_session_start.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/hooks/test_session_stop.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/hooks/test_session_utils.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/hooks/test_settings_local_absolute_paths.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/hooks/test_settings_tier_autoapply_registration.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/hooks/test_similarity_boost.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/hooks/test_statusline.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/hooks/test_statusline_template_sync.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/hooks/test_sync_check.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/hooks/test_template_guard.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/hooks/test_tier_autoapply.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/hooks/test_tier_gap_check.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/hooks/test_tier_security_fixes.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/skills/__init__.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/skills/_skill_helpers.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/skills/test_c3_omission_declaration.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/skills/test_dev_workflow_no_task_type.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/skills/test_e0_verification_exit.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/skills/test_init_session_no_task_type.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/skills/test_marker_compliance.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/skills/test_parallel_agents_skill_tier.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/skills/test_planner_lightweight.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/skills/test_reachability_map.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/skills/test_recall_skill.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/skills/test_session_backlog_reconciliation.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/skills/test_session_guard.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/skills/test_setup_templates.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/skills/test_start_skill_bugfix_flow.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/skills/test_start_skill_new_flow.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/skills/test_start_skill_security_audit_phase.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/test_adapters.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/test_archive_reports.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/test_audit_review_decisions.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/test_check_deletions.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/test_ci_workflows.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/test_claude_gitignore.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/test_cli_ask.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/test_cli_doctor.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/test_cli_doctor_launcher.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/test_cli_entry.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/test_cli_init.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/test_cli_list.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/test_cli_metrics.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/test_cli_plan.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/test_cli_recall.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/test_cli_run.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/test_cli_tier.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/test_cli_update_breaking_changes.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/test_cli_update_deletions.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/test_db.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/test_db_connect_lint.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/test_docstring_consistency.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/test_embedding.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/test_excludes.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/test_extract_breaking_changes.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/test_gitutil.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/test_hooks_stdin_idiom.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/test_init_only_patterns.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/test_mcp_server_elicit.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/test_migrate.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/test_mode_line.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/test_no_bare_python_launcher.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/test_no_passonly_tests.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/test_nul_boundary_lint.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/test_paths.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/test_patterns_guard.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/test_plan_validator.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/test_pre_compact.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/test_pre_tool_hook.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/test_precompact_additional.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/test_precompact_toctou_fixes.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/test_pricing.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/test_recall_chunker.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/test_recall_index.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/test_references_migration.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/test_report_contract_check.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/test_scripts_src_bootstrap.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/test_scripts_stdout_encoding.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/test_session_mode_watch.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/test_session_utils_additional.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/test_settings_hooks_registration.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/test_skill_no_builtin_conflict.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/test_start_skill_archive_contract.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/test_statusline.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/test_stop_additional.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/test_stop_agent_memory_warn.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/test_stop_hook.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/test_stop_precompact_fixes.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/test_sync_template_stop.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/test_template_pre_tool_hook.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/test_usage_ingester.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/test_worktree_guard.py +0 -0
- {claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/test_wt_agent_sync.py +0 -0
|
@@ -13,3 +13,4 @@ v2.58.0|c3 init and c3 update now place .claude/.gitignore in the target project
|
|
|
13
13
|
v2.60.0|c3 plan validate/waves now strictly validate po_plan_version: only "0.1" (parallel) or "sequential" (sequential TDD) quoted strings are accepted; unknown or non-string values fail with exit 2. Migrate existing plan-reports by setting po_plan_version: "0.1" or "sequential" (quoted).|po_plan_version の値を厳格検査("0.1"/"sequential" のみ受理・他は exit 2)。既存 plan-report は引用符付きの正値へ修正する。
|
|
14
14
|
v2.66.0|record_review_decision.py: --severity is now a required argument (omitting it exits 2 and records nothing; out-of-vocabulary values still fail-safe to NULL with a warning). --finding now rejects empty or whitespace-only values (exit 2). Update any custom invocations to pass --severity with one of critical/high/medium/low. Shipped SKILL.md call sites and docstrings are already updated.|
|
|
15
15
|
v2.68.0|New PreToolUse Write hook report_path_guard.py is registered in the distributed settings.json. It blocks (exit 2) writes of report-prefixed filenames (requirements-report-, architecture-report-, plan-report-, design-review-report-, code-review-report-, security-review-report-, test-report-, debug-analysis-, debug-needed-) outside .claude/reports/, overwrites of existing timestamp-named reports, and non-timestamp naming for the strict 4 report types. Ordinary files whose names start with those prefixes can no longer be written outside .claude/reports/. Set C3_REPORT_GUARD_DISABLE=1 to bypass, or remove the hook registration from settings.json.|レポート 9 prefix 名ファイルの .claude/reports/ 外への Write・タイムスタンプ形式既存レポートの上書き・strict-4 の非タイムスタンプ命名を exit 2 で block する report_path_guard hook を配布 settings.json に登録。対象 prefix 名の一般ファイルも block されうる。回避は C3_REPORT_GUARD_DISABLE=1 または settings.json から登録を外す。
|
|
16
|
+
v2.72.0|Removed the C3 PermissionRequest hook suite (permission_handler.py, permission_handler_toast.py, permission_rules.json) and the [notify] extra, superseded by upstream auto mode and permissions.allow. If you have not yet copied your auto_allow patterns from .claude/permission_rules.json, answer N (default) at the upcoming deletion prompt, copy them into permissions.allow in .claude/settings.local.json (personal, not the shared settings.json; same syntax; upstream checks each separator-delimited subcommand of compound commands independently, but command substitution handling is unverified -- narrow broad Bash wildcards to the minimum prefix; copying is a must where auto mode is unavailable), then rerun c3 update. windows-toasts can be uninstalled.|C3 の PermissionRequest hook 一式(permission_handler.py・permission_handler_toast.py・permission_rules.json)と [notify] extra を削除しました(上流 auto mode / permissions.allow へ委譲)。auto_allow パターンを未転記の場合は、この後の削除プロンプトで N(既定)を選び、.claude/permission_rules.json の内容を .claude/settings.local.json(個人設定・共有の settings.json ではない)の permissions.allow へ転記してから c3 update を再実行してください(書式は同一。上流は複合コマンドをセパレータ単位で独立照合しますが、コマンド置換〔$() 等〕の扱いは未確認のため、広い Bash ワイルドカードは必要最小のプレフィックスへ狭めること。auto mode が使えない環境では転記必須)。windows-toasts はアンインストール可。
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
# - 絶対パス / ../ を含むパス / シンボリックリンク は無視
|
|
9
9
|
# - ディレクトリは削除しない(ファイルのみ)
|
|
10
10
|
#
|
|
11
|
-
# 詳細は .claude/docs/config-policy.md §3 #13 と §7 落とし穴
|
|
11
|
+
# 詳細は .claude/docs/config-policy.md §3 #13 と §7 落とし穴 4 を参照。
|
|
12
12
|
|
|
13
13
|
# ---- v2.1.0: tdd-develop / worktree-tdd-workflow 廃止 ----
|
|
14
14
|
agents/tdd-develop.md
|
|
@@ -87,3 +87,8 @@ hooks/po_heartbeat.py
|
|
|
87
87
|
|
|
88
88
|
# ---- v2.41.0: tier-routing 学習シグナル再設計(record_agent_outcome.py へ置換) ----
|
|
89
89
|
skills/dev-workflow/scripts/record_tier_outcome.py
|
|
90
|
+
|
|
91
|
+
# ---- v2.72.0: permission_handler 一式廃止(上流 permissions.allow へ委譲) ----
|
|
92
|
+
hooks/permission_handler.py
|
|
93
|
+
hooks/permission_handler_toast.py
|
|
94
|
+
permission_rules.json
|
|
@@ -20,7 +20,6 @@
|
|
|
20
20
|
.claude/CLAUDE.md 配布元・配布先共通(常時注入)
|
|
21
21
|
.claude/settings.json プロジェクト共通設定(配布される)
|
|
22
22
|
.claude/settings.local.json 個人 override(配布されない)
|
|
23
|
-
.claude/permission_rules.json C3 独自の自動承認パターン(配布される)
|
|
24
23
|
.claude/rules/ C3 配布デフォルトルール(配布される)
|
|
25
24
|
.claude/rules/promoted/ プロジェクト固有昇格ルール(配布される、update は触らない)
|
|
26
25
|
.claude/hooks/ Claude Code lifecycle hooks(配布される)
|
|
@@ -36,7 +35,6 @@ src/c3/migrations/ SQLite schema migration SQL ファイル
|
|
|
36
35
|
.claude/CLAUDE.md c3 init で配置・c3 update で更新
|
|
37
36
|
.claude/settings.json c3 init で配置・c3 update で更新
|
|
38
37
|
.claude/settings.local.json ユーザーが個別作成(c3 は触らない)
|
|
39
|
-
.claude/permission_rules.json c3 init で配置・c3 update で更新
|
|
40
38
|
.claude/rules/ c3 init で配置・c3 update で更新
|
|
41
39
|
.claude/rules/promoted/index.md c3 init で空雛形のみ配置(c3 update は触らない)
|
|
42
40
|
.claude/hooks/ c3 init で配置・c3 update で更新
|
|
@@ -128,7 +126,7 @@ src/c3/migrations/ SQLite schema migration SQL ファイル
|
|
|
128
126
|
|
|
129
127
|
## 2. 設定優先順位と書き込み権限
|
|
130
128
|
|
|
131
|
-
設定は性質の異なる **3
|
|
129
|
+
設定は性質の異なる **3 つのレイヤー**(レイヤー B は v2.72.0 で削除済み)に分かれる。1 列に並べると誤解を生むため分離して記述する。
|
|
132
130
|
|
|
133
131
|
### レイヤー A: ツール権限(Claude Code 公式)
|
|
134
132
|
|
|
@@ -146,15 +144,10 @@ src/c3/migrations/ SQLite schema migration SQL ファイル
|
|
|
146
144
|
|
|
147
145
|
### レイヤー B: 自動承認パターン(C3 独自拡張)
|
|
148
146
|
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
> **注意**: `permission_rules.json` は Claude Code 公式の `permissions.allow` とは **独立した別レイヤー**。
|
|
155
|
-
> 同列に並べると「どちらが優先されるか」で誤解が生じる。レイヤー A と B は並立している。
|
|
156
|
-
|
|
157
|
-
> **注意**: `auto_allow` パターンは最小限に留めること。広範なパターン(例: `Bash(*)`)は C3 の意図する動作範囲を超えた危険コマンドも自動承認する可能性がある。
|
|
147
|
+
(削除済み・v2.72.0)C3 独自の自動承認パターン(`.claude/permission_rules.json` の `auto_allow` 配列と
|
|
148
|
+
`permission_handler.py` hook)は v2.72.0 で削除された。自動承認は上流 Claude Code の
|
|
149
|
+
`permissions.allow`(レイヤー A)へ委譲する。移行手順は `.claude/breaking-changes.txt` の
|
|
150
|
+
v2.72.0 行を参照。
|
|
158
151
|
|
|
159
152
|
### レイヤー C: LLM 指示・知識(CLAUDE.md / rules)
|
|
160
153
|
|
|
@@ -173,7 +166,6 @@ src/c3/migrations/ SQLite schema migration SQL ファイル
|
|
|
173
166
|
|---|---|---|---|
|
|
174
167
|
| `.claude/settings.json` | ○ | ○ | △(チーム合意のもと) |
|
|
175
168
|
| `.claude/settings.local.json` | × | × | ○(個人 override / 秘匿情報) |
|
|
176
|
-
| `.claude/permission_rules.json` | ○ | ○ | △(ファイル全体を上書き編集する場合は注意) |
|
|
177
169
|
| `.claude/CLAUDE.md` | ○ | ○ | △(c3 update で上書きされる前提で) |
|
|
178
170
|
| `.claude/rules/*.md` | ○ | ○ | △(同上) |
|
|
179
171
|
| `.claude/rules/promoted/index.md` | ○(空雛形のみ) | × | ○(`/promote-pattern` が追記、手動編集も可) |
|
|
@@ -196,11 +188,11 @@ src/c3/migrations/ SQLite schema migration SQL ファイル
|
|
|
196
188
|
| 6 | `.claude/docs/*.md` | △(一部のみ) | ○ | 利用先向けリファレンス。配布対象は `autonomous-mode-onboarding.md` / `config-policy.md`(本ドキュメント)/ `nul-boundary.md` / `parallel-agents-setup.md` / `platform-adapters.md` / `settings.json.md` の 6 ファイル。配布元固有の設計メモ等は `_excludes.py` で個別除外。`taxonomy.md` は tracked(GitHub 公開)だが EXCLUDE 対象のため wheel 非配布(詳細は §7 落とし穴 2 参照)。 |
|
|
197
189
|
| 7 | `.claude/CLAUDE.md` | ○ | ○ | 配布先で常時注入される共通ルール |
|
|
198
190
|
| 8 | `.claude/settings.json` | ○ | ○ | プロジェクト共通設定(hooks 登録・permissions など) |
|
|
199
|
-
| 9 | `.claude/permission_rules.json` |
|
|
191
|
+
| 9 | `.claude/permission_rules.json` | ×(削除済み・v2.72.0) | — | C3 独自の自動承認パターンは v2.72.0 で削除された。上流 `permissions.allow` へ委譲(移行手順は `.claude/breaking-changes.txt` の v2.72.0 行を参照) |
|
|
200
192
|
| 10 | `.claude/settings.local.json` | × | — | 個人 override・秘匿情報。`_excludes.py` でも除外、`.gitignore` でも除外、c3 update も触らない |
|
|
201
193
|
| 11 | `.claude/reports/*` / `memory/*` / `agent-memory/*` / `state/*` / `tmp/*` / `worktrees/*` / `logs/*` | × (`.gitkeep` のみ ○) | — | 実行時生成領域。空ディレクトリのみ `KEEP_PATTERNS` の `.gitkeep` で配布。データ本体は除外。v2.19.0 で `.claude/state/c3_version.txt`(バージョン checkpoint)を追加(`state/*` 一括除外により自動非配布) |
|
|
202
194
|
| 12 | `.dev/*` / `/CLAUDE.md` / `/AGENTS.md` / `/.codex/` / `/.cursor/` / `/.agents/` | × | — | 配布元専用または adapter 生成物。wheel には構造的に含まれない(`src/c3/_template/.claude/` 配下のみ同梱)が、配布元 `.gitignore` で commit 混入も防ぐ |
|
|
203
|
-
| 13 | `.claude/deletions.txt` | ○ | ○ | `c3 update` が読み込み、利用先 `.claude/` から該当ファイルを削除候補として扱う。配布元の `.claude/deletions.txt` に追記したエントリは次回 pip install → `c3 update` で利用先に伝播。`KEEP_PATTERNS` で明示配布。`c3 update` 自体は本ファイルを削除しない(§7 落とし穴
|
|
195
|
+
| 13 | `.claude/deletions.txt` | ○ | ○ | `c3 update` が読み込み、利用先 `.claude/` から該当ファイルを削除候補として扱う。配布元の `.claude/deletions.txt` に追記したエントリは次回 pip install → `c3 update` で利用先に伝播。`KEEP_PATTERNS` で明示配布。`c3 update` 自体は本ファイルを削除しない(§7 落とし穴 4 参照) |
|
|
204
196
|
| 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(上書きされる) |
|
|
205
197
|
| 15 | `.claude/.gitignore` | ○ | ×(INIT_ONLY) | 利用先の実行時生成領域のうち「再生成可能」「セッション一時」だけを除外する配布 `.gitignore`(§1-2 の方針の実装)。プロジェクトルートの `.gitignore` は編集しないため既存設定と衝突しない。`INIT_ONLY_PATTERNS` により初回配置のみで **c3 update は上書きしない**(利用先の追記を守る)。C3 側で分類を更新した場合はリリースノートで手動マージを案内する |
|
|
206
198
|
|
|
@@ -391,11 +383,8 @@ C3 side で `promoted/` の雛形を更新した場合は、リリースノー
|
|
|
391
383
|
|
|
392
384
|
### 落とし穴 5: `permission_rules.json` は `settings.json.permissions.deny` を覆せない(要検証)
|
|
393
385
|
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
`deny` を覆すことはできないはず。ただし Claude Code 公式仕様に明記なし。
|
|
397
|
-
|
|
398
|
-
**残課題**: v2.18.0 以降の検証タスクとして記録。現時点では「覆せない前提で設計する」ことを推奨。
|
|
386
|
+
対象機能は v2.72.0 で削除済み(C3 独自の自動承認パターン一式)。上流 `permissions.allow` へ委譲した。
|
|
387
|
+
移行手順は `.claude/breaking-changes.txt` の v2.72.0 行を参照。
|
|
399
388
|
|
|
400
389
|
### 落とし穴 6: `permissions.allow` のワイルドカードはプレフィックス一致のため `../` パストラバーサルに対応していない
|
|
401
390
|
|
|
@@ -471,11 +460,9 @@ CI のジョブ環境変数として設定する・親プロセスから子プ
|
|
|
471
460
|
| 除外パターン定義 | `src/c3/_excludes.py` | `EXCLUDE_PATTERNS` / `KEEP_PATTERNS` 定数 + `should_skip()` |
|
|
472
461
|
| ビルド時除外 | `hatch_build.py` | `_excludes.py` の重複定義(ビルドフック用) |
|
|
473
462
|
| 同期確認 hook | `.dev/hooks/_sync_check.py` | 3 ファイル変更時の警告(配布元専用) |
|
|
474
|
-
| 自動承認 hook | `.claude/hooks/permission_handler.py` | `permission_rules.json` を読んで自動承認 |
|
|
475
463
|
|
|
476
464
|
### 残課題リンク(v2.18.0 以降)
|
|
477
465
|
|
|
478
|
-
- `permission_rules.json` の `auto_allow` が `settings.json.permissions.deny` を覆せるか検証
|
|
479
466
|
- `~/.claude/settings.json` のグローバル設定と `.claude/settings.json` の同キー競合時のマージ範囲確認
|
|
480
467
|
- ~~`c3 update` の削除検出(`deletions.txt` 方式、v2.18.0 予定)~~ → v2.18.0 で実装
|
|
481
468
|
- `c3 update` 時の Breaking changes 警告(v2.19.0 予定)
|
|
@@ -5,7 +5,6 @@
|
|
|
5
5
|
"Bash(c3 run .claude/hooks/pre_tool.py*)",
|
|
6
6
|
"Bash(c3 run .claude/hooks/pre_compact.py*)",
|
|
7
7
|
"Bash(c3 run .claude/hooks/restore_session.py*)",
|
|
8
|
-
"Bash(c3 run .claude/hooks/permission_handler.py*)",
|
|
9
8
|
"Bash(c3 run .claude/hooks/statusline.py*)",
|
|
10
9
|
"Bash(c3 run .claude/hooks/recall_autorebuild.py*)",
|
|
11
10
|
"Bash(c3 run .claude/skills/dev-workflow/scripts/detect_execution_verification.py*)",
|
|
@@ -168,18 +167,6 @@
|
|
|
168
167
|
]
|
|
169
168
|
}
|
|
170
169
|
],
|
|
171
|
-
"PermissionRequest": [
|
|
172
|
-
{
|
|
173
|
-
"matcher": "",
|
|
174
|
-
"hooks": [
|
|
175
|
-
{
|
|
176
|
-
"type": "command",
|
|
177
|
-
"command": "c3",
|
|
178
|
-
"args": ["run", "${CLAUDE_PROJECT_DIR}/.claude/hooks/permission_handler.py"]
|
|
179
|
-
}
|
|
180
|
-
]
|
|
181
|
-
}
|
|
182
|
-
],
|
|
183
170
|
"UserPromptSubmit": [
|
|
184
171
|
{
|
|
185
172
|
"matcher": "",
|
|
@@ -122,7 +122,6 @@ A ヒアリング → B 設計 → C 計画 → D 実装(TDD) → E レビュー
|
|
|
122
122
|
| `PostToolUse` | `Write` / `Edit` | `planner_check.py` | plan-report の YAML/タイムスタンプ/reviewer 規約検査 |
|
|
123
123
|
| `PostToolUse` | `Write` | `report_contract_check.py` | reports 直下の命名契約逸脱を warn(strict-4〔requirements/architecture/plan/design-review〕はタイムスタンプ形式の厳密検査、loose-3〔code-review/security-review/test〕はタイムスタンプ形式または task_id 形式のどちらかを許容する緩検査。stderr + additionalContext) |
|
|
124
124
|
| `PostToolUse` | `Edit` | `session_mode_watch.py` | session.tmp のモード行挿入・plan= 差し替えを warn(stderr + additionalContext) |
|
|
125
|
-
| `PermissionRequest` | (全て) | `permission_handler.py` | `permission_rules.json` の `auto_allow` で自動承認([config-policy §2 レイヤー B](.claude/docs/config-policy.md)) |
|
|
126
125
|
| `PreCompact` | (全て) | `pre_compact.py` | compact 前にチェックポイントマーカー注入 |
|
|
127
126
|
| `Stop` | (全て) | `session_stop.py` | セッション終了処理のオーケストレータ |
|
|
128
127
|
|
|
@@ -1,5 +1,31 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [2.72.0] - 2026-08-14
|
|
4
|
+
|
|
5
|
+
### 破壊的変更
|
|
6
|
+
|
|
7
|
+
- **C3 独自の `PermissionRequest` hook 一式を削除した**: `.claude/hooks/permission_handler.py` /
|
|
8
|
+
`.claude/hooks/permission_handler_toast.py` / `.claude/permission_rules.json`、および
|
|
9
|
+
`pyproject.toml` の `[notify]` extra(`windows-toasts` 依存)。失うものは auto_allow による
|
|
10
|
+
自動承認・承認待ちの OS 通知(Windows トースト承認 UX)・`[notify]` extra。代替は上流
|
|
11
|
+
Claude Code の auto mode(Pro/Max/Team の新規セッション既定。**Enterprise/API/cloud の展開前・
|
|
12
|
+
既存セッションは対象外**)と `permissions.allow`(書式互換)、上流の通知設定。
|
|
13
|
+
移行手順(`c3 update` 実行中の視点で記述):
|
|
14
|
+
1. `c3 update` 実行中にこの案内を見た時点では `settings.json` は新版へ更新済みだが、
|
|
15
|
+
旧ファイルの削除はまだ確定していない(直後の削除プロンプトは `[y/N]`・既定 N)
|
|
16
|
+
2. まだ転記していない場合: 削除プロンプトで N(既定)を選び、
|
|
17
|
+
`.claude/permission_rules.json` の `auto_allow` を `.claude/settings.local.json`
|
|
18
|
+
(個人設定・共有の `settings.json` ではない)の `permissions.allow` へ転記してから
|
|
19
|
+
`c3 update` を再実行して y で削除する。書式は同一のためそのまま転記できる
|
|
20
|
+
3. 但し書き: 上流はコマンドセパレータ(`&&` `||` `;` `|` `|&` `&` 改行)で分割した
|
|
21
|
+
各サブコマンドを独立に照合する(公式ドキュメント確認済み(2026-08-14))。
|
|
22
|
+
ただしコマンド置換(`$()` やバッククォート)の扱いは未確認のため、
|
|
23
|
+
`Bash(git *)` 等の広いワイルドカードはそのまま転記せず、必要最小のプレフィックスへ狭めること
|
|
24
|
+
4. auto mode が既定でない・使わない環境(Enterprise/API/cloud の展開前・既存セッション・
|
|
25
|
+
手動運用)では `permissions.allow` への転記が実質必須
|
|
26
|
+
5. `pip uninstall windows-toasts` 可。転記漏れは git 履歴から回収可能
|
|
27
|
+
詳細は `.claude/docs/config-policy.md` を参照。
|
|
28
|
+
|
|
3
29
|
## [2.71.1] - 2026-08-14
|
|
4
30
|
|
|
5
31
|
### 修正
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: claude-code-conductor
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.72.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
|
|
@@ -41,8 +41,6 @@ Requires-Dist: duckdb>=0.10
|
|
|
41
41
|
Requires-Dist: fastembed>=0.8.0
|
|
42
42
|
Requires-Dist: numpy>=1.22
|
|
43
43
|
Requires-Dist: pyyaml>=6.0
|
|
44
|
-
Provides-Extra: notify
|
|
45
|
-
Requires-Dist: windows-toasts>=1.0; (sys_platform == 'win32') and extra == 'notify'
|
|
46
44
|
Description-Content-Type: text/markdown
|
|
47
45
|
|
|
48
46
|
# Claude Code Conductor (C3)
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
"""tests/test_permission_handler_removal.py
|
|
2
|
+
|
|
3
|
+
permission_handler 一式(PermissionRequest hook 本体 / Windows トーストワーカー /
|
|
4
|
+
auto_allow ルール定義)の削除完了を凍結する検証テスト。
|
|
5
|
+
|
|
6
|
+
測る性質(architecture-report-20260814-123008.md §0-A / 改訂 2 §A-7 /
|
|
7
|
+
改訂 3 §3 / 改訂 4 §2 に対応):
|
|
8
|
+
|
|
9
|
+
1. 削除対象 3 ファイルがリポジトリに存在しないこと(A-1 / A-2 / A-3)
|
|
10
|
+
2. `.claude/settings.json` に `PermissionRequest` キーが無く、
|
|
11
|
+
permissions.allow に permission_handler を含む行が無いこと(A-4 / A-5)
|
|
12
|
+
3. `pyproject.toml` に `[project.optional-dependencies]` セクションと
|
|
13
|
+
windows-toasts が無いこと(A-7)
|
|
14
|
+
4. `.claude/deletions.txt` に削除 3 行が記載されていること(B-12)
|
|
15
|
+
5. `.claude/breaking-changes.txt` の `v` で始まる非コメント行のいずれかが
|
|
16
|
+
`permission_handler` を含むこと(B-16・存在断言・順序非依存・版番号非依存)
|
|
17
|
+
|
|
18
|
+
本ファイルは削除スライスの実施前は**赤であることが正常**(Red フェーズ)。
|
|
19
|
+
削除完了後に緑へ反転することで削除が凍結される。
|
|
20
|
+
|
|
21
|
+
なお本ファイルは不在検証の性質上、対象名 `permission_handler` /
|
|
22
|
+
`permission_rules` を必然的に含む(architecture 改訂 3 §0-B 補記 2 の
|
|
23
|
+
「§6 ヒットしてよい対象」(a) に該当)。
|
|
24
|
+
"""
|
|
25
|
+
from __future__ import annotations
|
|
26
|
+
|
|
27
|
+
import json
|
|
28
|
+
from pathlib import Path
|
|
29
|
+
|
|
30
|
+
import pytest
|
|
31
|
+
|
|
32
|
+
REPO_ROOT = Path(__file__).resolve().parent.parent
|
|
33
|
+
|
|
34
|
+
# 削除対象ファイル(リポジトリルート相対・POSIX 表記)
|
|
35
|
+
REMOVED_FILES = (
|
|
36
|
+
".claude/hooks/permission_handler.py",
|
|
37
|
+
".claude/hooks/permission_handler_toast.py",
|
|
38
|
+
".claude/permission_rules.json",
|
|
39
|
+
)
|
|
40
|
+
|
|
41
|
+
# deletions.txt に記載されるべきパス(.claude/ 相対表記)
|
|
42
|
+
DELETION_ENTRIES = (
|
|
43
|
+
"hooks/permission_handler.py",
|
|
44
|
+
"hooks/permission_handler_toast.py",
|
|
45
|
+
"permission_rules.json",
|
|
46
|
+
)
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def _read(relative: str) -> str:
|
|
50
|
+
return (REPO_ROOT / relative).read_text(encoding="utf-8")
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
# ===========================================================================
|
|
54
|
+
# 1. 削除対象ファイルの不在(A-1 / A-2 / A-3)
|
|
55
|
+
# ===========================================================================
|
|
56
|
+
class TestRemovedFilesAreGone:
|
|
57
|
+
@pytest.mark.parametrize("relative", REMOVED_FILES)
|
|
58
|
+
def test_file_does_not_exist(self, relative: str) -> None:
|
|
59
|
+
"""削除対象ファイルがリポジトリに存在しないこと."""
|
|
60
|
+
target = REPO_ROOT / relative
|
|
61
|
+
assert not target.exists(), f"deleted file still exists: {relative}"
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
# ===========================================================================
|
|
65
|
+
# 2. settings.json の登録消滅(A-4 / A-5)
|
|
66
|
+
# ===========================================================================
|
|
67
|
+
class TestSettingsJsonHasNoPermissionRequest:
|
|
68
|
+
@pytest.fixture()
|
|
69
|
+
def settings(self) -> dict:
|
|
70
|
+
"""`.claude/settings.json` を JSON としてパースして返す(valid JSON 前提)."""
|
|
71
|
+
return json.loads(_read(".claude/settings.json"))
|
|
72
|
+
|
|
73
|
+
def test_hooks_section_has_no_permission_request_key(self, settings: dict) -> None:
|
|
74
|
+
"""hooks 節に `PermissionRequest` キーが存在しないこと(キーごと削除)."""
|
|
75
|
+
hooks = settings.get("hooks", {})
|
|
76
|
+
assert isinstance(hooks, dict), "settings.json の hooks 節が dict ではない"
|
|
77
|
+
assert "PermissionRequest" not in hooks, (
|
|
78
|
+
"settings.json の hooks 節に PermissionRequest キーが残っている"
|
|
79
|
+
)
|
|
80
|
+
|
|
81
|
+
def test_permissions_allow_has_no_permission_handler_entry(self, settings: dict) -> None:
|
|
82
|
+
"""permissions.allow に permission_handler を含むエントリが無いこと."""
|
|
83
|
+
allow = settings.get("permissions", {}).get("allow", [])
|
|
84
|
+
assert isinstance(allow, list), "settings.json の permissions.allow が list ではない"
|
|
85
|
+
assert len(allow) > 0, "positive control: permissions.allow が空(読み取り経路が壊れている)"
|
|
86
|
+
|
|
87
|
+
leftovers = [entry for entry in allow if "permission_handler" in str(entry)]
|
|
88
|
+
assert leftovers == [], f"permissions.allow に残存エントリがある: {leftovers}"
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
# ===========================================================================
|
|
92
|
+
# 3. pyproject.toml の extra 削除(A-7)
|
|
93
|
+
# ===========================================================================
|
|
94
|
+
class TestPyprojectHasNoNotifyExtra:
|
|
95
|
+
def test_optional_dependencies_section_is_absent(self) -> None:
|
|
96
|
+
"""`[project.optional-dependencies]` セクションが存在しないこと(空テーブルも残さない)."""
|
|
97
|
+
lines = [line.strip() for line in _read("pyproject.toml").splitlines()]
|
|
98
|
+
assert "[project]" in lines, "positive control: pyproject.toml の読み取り経路が壊れている"
|
|
99
|
+
assert "[project.optional-dependencies]" not in lines, (
|
|
100
|
+
"pyproject.toml に [project.optional-dependencies] セクションが残っている"
|
|
101
|
+
)
|
|
102
|
+
|
|
103
|
+
def test_windows_toasts_is_absent(self) -> None:
|
|
104
|
+
"""windows-toasts への依存記述が残っていないこと."""
|
|
105
|
+
text = _read("pyproject.toml")
|
|
106
|
+
assert "windows-toasts" not in text, (
|
|
107
|
+
"pyproject.toml に windows-toasts への依存が残っている"
|
|
108
|
+
)
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
# ===========================================================================
|
|
112
|
+
# 4. deletions.txt への追記(B-12)
|
|
113
|
+
# ===========================================================================
|
|
114
|
+
class TestDeletionsTxtListsRemovedFiles:
|
|
115
|
+
@pytest.fixture()
|
|
116
|
+
def entries(self) -> list[str]:
|
|
117
|
+
"""`.claude/deletions.txt` の実エントリ行(コメント・空行を除く)."""
|
|
118
|
+
out = []
|
|
119
|
+
for raw in _read(".claude/deletions.txt").splitlines():
|
|
120
|
+
line = raw.strip()
|
|
121
|
+
if not line or line.startswith("#"):
|
|
122
|
+
continue
|
|
123
|
+
out.append(line)
|
|
124
|
+
return out
|
|
125
|
+
|
|
126
|
+
@pytest.mark.parametrize("entry", DELETION_ENTRIES)
|
|
127
|
+
def test_entry_is_listed(self, entries: list[str], entry: str) -> None:
|
|
128
|
+
"""削除 3 行が deletions.txt に記載されていること."""
|
|
129
|
+
assert len(entries) > 0, "positive control: deletions.txt に実エントリが 1 行も無い"
|
|
130
|
+
assert entry in entries, f"deletions.txt に未記載: {entry}"
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
# ===========================================================================
|
|
134
|
+
# 5. breaking-changes.txt への追記(B-16・版番号非依存)
|
|
135
|
+
# ===========================================================================
|
|
136
|
+
class TestBreakingChangesTxtAnnouncesRemoval:
|
|
137
|
+
def test_some_version_line_mentions_permission_handler(self) -> None:
|
|
138
|
+
"""`v` で始まる非コメント行のいずれかが `permission_handler` を含むこと.
|
|
139
|
+
|
|
140
|
+
存在断言のみ。順序(末尾かどうか)にも版番号リテラルにも依存させない。
|
|
141
|
+
"""
|
|
142
|
+
version_lines = [
|
|
143
|
+
line
|
|
144
|
+
for line in (raw.strip() for raw in _read(".claude/breaking-changes.txt").splitlines())
|
|
145
|
+
if line.startswith("v")
|
|
146
|
+
]
|
|
147
|
+
assert len(version_lines) > 0, (
|
|
148
|
+
"positive control: breaking-changes.txt に v で始まる行が 1 行も無い"
|
|
149
|
+
)
|
|
150
|
+
|
|
151
|
+
hits = [line for line in version_lines if "permission_handler" in line]
|
|
152
|
+
assert len(hits) >= 1, (
|
|
153
|
+
"breaking-changes.txt に permission_handler の削除を告知する行が無い"
|
|
154
|
+
)
|
|
@@ -294,7 +294,7 @@ class TestKnownRelations:
|
|
|
294
294
|
assert bad_sources == [], f"settings_hook must originate from settings*.json: {bad_sources}"
|
|
295
295
|
|
|
296
296
|
targets = {link.target for link in hook_links}
|
|
297
|
-
assert ".claude/hooks/
|
|
297
|
+
assert ".claude/hooks/session_start.py" in targets
|
|
298
298
|
|
|
299
299
|
def test_session_stop_importlib_loads_produce_py_importlib_edges(self, repo_graph):
|
|
300
300
|
"""行 2: `session_stop.py` の importlib → 4 モジュール(`py_importlib`).
|
|
@@ -312,15 +312,15 @@ class TestKnownRelations:
|
|
|
312
312
|
missing = sorted(expected - got)
|
|
313
313
|
assert missing == [], f"py_importlib edges missing from session_stop.py: {missing}"
|
|
314
314
|
|
|
315
|
-
def
|
|
316
|
-
"""行 3: `
|
|
315
|
+
def test_session_guard_test_subprocess_produces_py_subprocess_path_edge(self, repo_graph):
|
|
316
|
+
"""行 3: `test_session_guard.py` の subprocess → `session_guard.py`(`py_subprocess_path`)."""
|
|
317
317
|
hits = _links(
|
|
318
318
|
repo_graph,
|
|
319
319
|
relation="py_subprocess_path",
|
|
320
|
-
source="
|
|
321
|
-
target=".claude/
|
|
320
|
+
source="tests/skills/test_session_guard.py",
|
|
321
|
+
target=".claude/skills/init-session/scripts/session_guard.py",
|
|
322
322
|
)
|
|
323
|
-
assert len(hits) >= 1, "py_subprocess_path edge to
|
|
323
|
+
assert len(hits) >= 1, "py_subprocess_path edge to session_guard.py is missing"
|
|
324
324
|
|
|
325
325
|
def test_parallel_agents_variant_table_produces_md_agent_variant_map_edges(self, repo_graph):
|
|
326
326
|
"""行 4: `parallel-agents/SKILL.md` の写像表 → `wt_*.md`(`md_agent_variant_map`)."""
|
|
@@ -822,7 +822,7 @@ class TestFilterLinksNarrowsBySourceCategory:
|
|
|
822
822
|
link
|
|
823
823
|
for link in live
|
|
824
824
|
if link.relation == "settings_hook"
|
|
825
|
-
and link.target == ".claude/hooks/
|
|
825
|
+
and link.target == ".claude/hooks/session_start.py"
|
|
826
826
|
]
|
|
827
827
|
assert len(kept) >= 1, "a live hook registration disappeared from the live view"
|
|
828
828
|
|
{claude_code_conductor-2.71.1 → claude_code_conductor-2.72.0}/tests/test_refgraph_structural.py
RENAMED
|
@@ -210,22 +210,22 @@ class TestKnownRelationsWithPremiseChecks:
|
|
|
210
210
|
題材が消えた場合の代替: 各テストの docstring に、同じ形の代替 source 候補を書く。
|
|
211
211
|
"""
|
|
212
212
|
|
|
213
|
-
def
|
|
214
|
-
"""行 1: `settings.json` の hooks 登録 → `
|
|
213
|
+
def test_row1_settings_hooks_section_to_session_start(self, repo_root, repo_graph):
|
|
214
|
+
"""行 1: `settings.json` の hooks 登録 → `session_start.py`(`settings_hook`).
|
|
215
215
|
|
|
216
|
-
代替題材: hooks 節に登録されている他の hook(例: `session_stop.py
|
|
216
|
+
代替題材: hooks 節に登録されている他の hook(例: `session_stop.py`〔Stop 登録〕)でもよい。
|
|
217
217
|
"""
|
|
218
218
|
settings_text = (repo_root / ".claude" / "settings.json").read_text(encoding="utf-8")
|
|
219
|
-
assert '"${CLAUDE_PROJECT_DIR}/.claude/hooks/
|
|
220
|
-
"premise gone: settings.json の hooks 節から
|
|
219
|
+
assert '"${CLAUDE_PROJECT_DIR}/.claude/hooks/session_start.py"' in settings_text, (
|
|
220
|
+
"premise gone: settings.json の hooks 節から session_start.py の登録が消えた"
|
|
221
221
|
)
|
|
222
222
|
|
|
223
223
|
hits = _links(
|
|
224
224
|
repo_graph,
|
|
225
225
|
relation="settings_hook",
|
|
226
|
-
target=".claude/hooks/
|
|
226
|
+
target=".claude/hooks/session_start.py",
|
|
227
227
|
)
|
|
228
|
-
assert len(hits) >= 1, "settings_hook edge to
|
|
228
|
+
assert len(hits) >= 1, "settings_hook edge to session_start.py is missing"
|
|
229
229
|
|
|
230
230
|
def test_row2_session_stop_importlib_to_four_modules(self, repo_root, repo_graph):
|
|
231
231
|
"""行 2: `session_stop.py` の importlib → 4 モジュール(`py_importlib`)."""
|
|
@@ -254,22 +254,29 @@ class TestKnownRelationsWithPremiseChecks:
|
|
|
254
254
|
missing = sorted(expected - got)
|
|
255
255
|
assert missing == [], f"py_importlib edges missing from session_stop.py: {missing}"
|
|
256
256
|
|
|
257
|
-
def
|
|
258
|
-
"""行 3: `
|
|
259
|
-
|
|
257
|
+
def test_row3_session_guard_test_subprocess_to_script(self, repo_root, repo_graph):
|
|
258
|
+
"""行 3: `tests/skills/test_session_guard.py` の subprocess → `session_guard.py`.
|
|
259
|
+
|
|
260
|
+
代替題材: `tests/hooks/test_session_start.py` → `.claude/hooks/session_start.py` のように、
|
|
261
|
+
`.claude/` 配下のスクリプトをパス組み立てして subprocess 起動する別ペアでもよい。
|
|
262
|
+
"""
|
|
263
|
+
text = (repo_root / "tests" / "skills" / "test_session_guard.py").read_text(
|
|
260
264
|
encoding="utf-8"
|
|
261
265
|
)
|
|
262
|
-
assert
|
|
263
|
-
|
|
266
|
+
assert (
|
|
267
|
+
'SCRIPT = WORKTREE_ROOT / ".claude" / "skills" / "init-session" / "scripts" '
|
|
268
|
+
'/ "session_guard.py"'
|
|
269
|
+
) in text, (
|
|
270
|
+
"premise gone: test_session_guard.py から session_guard.py のパス組み立てが消えた"
|
|
264
271
|
)
|
|
265
272
|
|
|
266
273
|
hits = _links(
|
|
267
274
|
repo_graph,
|
|
268
275
|
relation="py_subprocess_path",
|
|
269
|
-
source="
|
|
270
|
-
target=".claude/
|
|
276
|
+
source="tests/skills/test_session_guard.py",
|
|
277
|
+
target=".claude/skills/init-session/scripts/session_guard.py",
|
|
271
278
|
)
|
|
272
|
-
assert len(hits) >= 1, "py_subprocess_path edge to
|
|
279
|
+
assert len(hits) >= 1, "py_subprocess_path edge to session_guard.py is missing"
|
|
273
280
|
|
|
274
281
|
def test_row4_parallel_agents_variant_table_to_wt_systematic_debugger(
|
|
275
282
|
self, repo_root, repo_graph
|