claude-code-conductor 2.70.0__tar.gz → 2.71.1__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.70.0 → claude_code_conductor-2.71.1}/.claude/CLAUDE.md +1 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/.claude/docs/config-policy.md +1 -1
- claude_code_conductor-2.71.1/.claude/rules/judgment-principles.md +21 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/.claude/skills/dev-workflow/SKILL.md +5 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/.claude/skills/dev-workflow/references/reachability-map.md +2 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/CHANGELOG.md +66 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/PKG-INFO +1 -1
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/src/c3/__init__.py +1 -1
- claude_code_conductor-2.71.1/src/c3/_terminal.py +118 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/src/c3/cli_ask.py +11 -3
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/src/c3/question.py +22 -2
- claude_code_conductor-2.71.1/tests/test_cli_ask.py +793 -0
- claude_code_conductor-2.70.0/src/c3/_terminal.py +0 -64
- claude_code_conductor-2.70.0/tests/test_cli_ask.py +0 -349
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/.claude/.gitignore +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/.claude/agents/architect.md +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/.claude/agents/code-reviewer.md +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/.claude/agents/design-critic.md +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/.claude/agents/developer.md +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/.claude/agents/doc-writer.md +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/.claude/agents/interviewer.md +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/.claude/agents/planner.md +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/.claude/agents/project-setup.md +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/.claude/agents/security-reviewer.md +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/.claude/agents/systematic-debugger.md +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/.claude/agents/tester.md +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/.claude/agents/wt_developer.md +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/.claude/agents/wt_systematic-debugger.md +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/.claude/agents/wt_tester.md +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/.claude/breaking-changes.txt +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/.claude/deletions.txt +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/.claude/docs/autonomous-mode-onboarding.md +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/.claude/docs/nul-boundary.md +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/.claude/docs/parallel-agents-setup.md +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/.claude/docs/platform-adapters.md +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/.claude/docs/settings.json.md +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/.claude/hooks/_hook_utils.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/.claude/hooks/check_agent_invocation.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/.claude/hooks/consolidate_memory.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/.claude/hooks/patterns_guard.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/.claude/hooks/permission_handler.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/.claude/hooks/permission_handler_toast.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/.claude/hooks/planner_check.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/.claude/hooks/post_tool.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/.claude/hooks/pre_compact.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/.claude/hooks/pre_tool.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/.claude/hooks/recall_autorebuild.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/.claude/hooks/recall_inject.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/.claude/hooks/report_contract_check.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/.claude/hooks/report_path_guard.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/.claude/hooks/restore_session.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/.claude/hooks/select_tier.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/.claude/hooks/session_mode_watch.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/.claude/hooks/session_start.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/.claude/hooks/session_stop.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/.claude/hooks/session_utils.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/.claude/hooks/statusline.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/.claude/hooks/stop.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/.claude/hooks/tier_autoapply.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/.claude/hooks/tier_gap_check.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/.claude/hooks/worktree_guard.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/.claude/memory/.gitkeep +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/.claude/permission_rules.json +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/.claude/rules/promoted/index.md +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/.claude/settings.json +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/.claude/skills/autonomous-mode/SKILL.md +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/.claude/skills/autonomous-mode/scripts/mode_line.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/.claude/skills/brainstorm/SKILL.md +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/.claude/skills/codex-review/SKILL.md +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/.claude/skills/dev-workflow/references/c3-omission-declaration.md +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/.claude/skills/dev-workflow/references/code-review-checklist.md +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/.claude/skills/dev-workflow/references/design-critic-rubric.md +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/.claude/skills/dev-workflow/references/design-rubric.md +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/.claude/skills/dev-workflow/references/interview-rubric.md +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/.claude/skills/dev-workflow/references/plan-design-guidelines.md +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/.claude/skills/dev-workflow/references/record-protocol.md +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/.claude/skills/dev-workflow/references/security-review-checklist.md +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/.claude/skills/dev-workflow/scripts/detect_execution_verification.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/.claude/skills/dev-workflow/scripts/record_agent_outcome.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/.claude/skills/dev-workflow/scripts/record_review_decision.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/.claude/skills/dev-workflow/scripts/review_hint_inject.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/.claude/skills/develop/SKILL.md +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/.claude/skills/doc/SKILL.md +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/.claude/skills/extract-lib/SKILL.md +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/.claude/skills/init-session/SKILL.md +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/.claude/skills/init-session/scripts/session_guard.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/.claude/skills/mcp-config/SKILL.md +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/.claude/skills/parallel-agents/SKILL.md +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/.claude/skills/pattern-status/SKILL.md +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/.claude/skills/promote-pattern/SKILL.md +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/.claude/skills/recall/SKILL.md +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/.claude/skills/report-timestamp/SKILL.md +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/.claude/skills/report-timestamp/scripts/get_timestamp.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/.claude/skills/review-phase/SKILL.md +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/.claude/skills/setup/SKILL.md +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/.claude/skills/setup/reference.md +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/.claude/skills/setup/templates/coding-standards-template.md +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/.claude/skills/setup/templates/project-conventions-template.md +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/.claude/skills/start/SKILL.md +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/.claude/skills/start/scripts/archive_reports.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/.claude/state/.gitkeep +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/.gitignore +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/ARCHITECTURE.md +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/LICENSE +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/LICENSES/fastembed-LICENSE +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/LICENSES/fastembed-NOTICE +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/LICENSES/numpy-LICENSE +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/LICENSES/onnxruntime-LICENSE +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/LICENSES/paraphrase-multilingual-MiniLM-L12-v2-LICENSE +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/README.md +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/hatch_build.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/pyproject.toml +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/src/c3/__main__.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/src/c3/_db_params.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/src/c3/_excludes.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/src/c3/adapters.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/src/c3/cli.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/src/c3/cli_doctor.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/src/c3/cli_init.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/src/c3/cli_list.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/src/c3/cli_metrics.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/src/c3/cli_plan.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/src/c3/cli_recall.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/src/c3/cli_run.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/src/c3/cli_tier.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/src/c3/cli_update.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/src/c3/db.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/src/c3/embedding.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/src/c3/gitutil.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/src/c3/mcp_server.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/src/c3/migrate.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/src/c3/migrations/001_initial.sql +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/src/c3/migrations/002_agent_cost_runs.sql +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/src/c3/migrations/003_tier_cost.sql +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/src/c3/migrations/004_agent_outcomes.sql +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/src/c3/migrations/005_drop_agent_tier_bandit.sql +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/src/c3/migrations/006_review_decisions_severity.sql +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/src/c3/migrations/007_review_decisions_resolution.sql +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/src/c3/migrations/008_drop_agent_runs.sql +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/src/c3/migrations/README.md +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/src/c3/migrations/__init__.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/src/c3/paths.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/src/c3/plan_validator.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/src/c3/platforms.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/src/c3/pricing.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/src/c3/recall_chunker.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/src/c3/recall_index.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/src/c3/refgraph.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/src/c3/usage_ingester.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/__init__.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/_pre_compact_helpers.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/conftest.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/fixtures/usage/README.md +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/fixtures/usage/mainline.jsonl +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/fixtures/usage/subagents/agent-deadbeef.jsonl +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/fixtures/usage/subagents/agent-deadbeef.meta.json +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/hooks/__init__.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/hooks/test_check_agent_invocation.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/hooks/test_consolidate_memory.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/hooks/test_detect_execution_verification.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/hooks/test_hook_utils.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/hooks/test_permission_handler.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/hooks/test_permission_handler_toast.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/hooks/test_pip_reinstall_reminder.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/hooks/test_planner_check.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/hooks/test_planner_check_dev.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/hooks/test_post_tool.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/hooks/test_pre_tool.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/hooks/test_recall_autorebuild.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/hooks/test_recall_inject.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/hooks/test_record_agent_outcome.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/hooks/test_record_review_decision.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/hooks/test_report_path_guard.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/hooks/test_restore_session.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/hooks/test_review_hint_inject.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/hooks/test_select_tier.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/hooks/test_select_tier_escalation.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/hooks/test_session_start.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/hooks/test_session_stop.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/hooks/test_session_utils.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/hooks/test_settings_local_absolute_paths.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/hooks/test_settings_tier_autoapply_registration.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/hooks/test_similarity_boost.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/hooks/test_statusline.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/hooks/test_statusline_template_sync.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/hooks/test_sync_check.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/hooks/test_template_guard.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/hooks/test_tier_autoapply.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/hooks/test_tier_gap_check.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/hooks/test_tier_security_fixes.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/skills/__init__.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/skills/_skill_helpers.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/skills/test_c3_omission_declaration.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/skills/test_dev_workflow_no_task_type.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/skills/test_e0_verification_exit.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/skills/test_init_session_no_task_type.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/skills/test_marker_compliance.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/skills/test_parallel_agents_skill_tier.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/skills/test_planner_lightweight.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/skills/test_reachability_map.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/skills/test_recall_skill.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/skills/test_session_backlog_reconciliation.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/skills/test_session_guard.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/skills/test_setup_templates.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/skills/test_start_skill_bugfix_flow.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/skills/test_start_skill_new_flow.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/skills/test_start_skill_security_audit_phase.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/test_adapters.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/test_archive_reports.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/test_audit_review_decisions.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/test_check_deletions.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/test_ci_workflows.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/test_claude_gitignore.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/test_cli_doctor.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/test_cli_doctor_launcher.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/test_cli_entry.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/test_cli_init.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/test_cli_list.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/test_cli_metrics.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/test_cli_plan.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/test_cli_recall.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/test_cli_run.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/test_cli_tier.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/test_cli_update_breaking_changes.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/test_cli_update_deletions.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/test_db.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/test_db_connect_lint.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/test_docstring_consistency.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/test_embedding.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/test_excludes.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/test_extract_breaking_changes.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/test_gitutil.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/test_hooks_stdin_idiom.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/test_init_only_patterns.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/test_mcp_server_elicit.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/test_migrate.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/test_mode_line.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/test_no_bare_python_launcher.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/test_no_passonly_tests.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/test_nul_boundary_lint.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/test_paths.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/test_patterns_guard.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/test_plan_validator.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/test_pre_compact.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/test_pre_tool_hook.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/test_precompact_additional.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/test_precompact_toctou_fixes.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/test_pricing.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/test_recall_chunker.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/test_recall_index.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/test_references_migration.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/test_refgraph.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/test_refgraph_query.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/test_refgraph_structural.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/test_report_contract_check.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/test_scripts_src_bootstrap.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/test_scripts_stdout_encoding.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/test_session_mode_watch.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/test_session_utils_additional.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/test_settings_hooks_registration.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/test_skill_no_builtin_conflict.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/test_start_skill_archive_contract.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/test_statusline.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/test_stop_additional.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/test_stop_agent_memory_warn.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/test_stop_hook.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/test_stop_precompact_fixes.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/test_sync_template_stop.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/test_template_pre_tool_hook.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/test_usage_ingester.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/test_worktree_guard.py +0 -0
- {claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/tests/test_wt_agent_sync.py +0 -0
|
@@ -82,5 +82,6 @@ C3 は、業務アプリケーション開発で製品としての品質を保
|
|
|
82
82
|
- **`isolation: worktree`** / **`permissionMode`** / **`tools` 制限** など agent フロントマターの一部キーは Claude Code 仕様。adapter 側では読み替え不能なものは無視される(OpenCode adapter は全 agent に `bash/read/edit/write/websearch` を一律付与する)
|
|
83
83
|
|
|
84
84
|
- **自律モード**: autonomous-mode は Claude Code 専用。Codex / Cursor / OpenCode では自律宣言は常に無効=HITL で動作する(モード行の検証は `mode_line.py`・Bash 経由に依存し、他プラットフォームで安全に再現できないため。検証できない → HITL の fail-closed 原則がそのまま正しい挙動になる)。adapter 生成物にも autonomous-mode skill は写像されない。
|
|
85
|
+
- **`.claude/rules/` の自動ロード**は Claude Code の機能。OpenCode では adapter が `AGENTS.md` に rules を埋め込む。**Codex / Cursor の生成物には rules は写像されない**(規律を効かせたい場合は各プラットフォームの規約ファイルへ手動転記する)
|
|
85
86
|
|
|
86
87
|
レポート(`.claude/reports/`)・state(`.claude/state/`)・memory(`.claude/agent-memory/`)のファイル名と書き込み先は全プラットフォーム共通。adapter 生成物の詳細は `c3 init --platform codex|cursor|opencode` で出力される `AGENTS.md` / `.cursor/rules/c3-core.mdc` / `.opencode/agents/` を参照。
|
|
@@ -191,7 +191,7 @@ src/c3/migrations/ SQLite schema migration SQL ファイル
|
|
|
191
191
|
| 1 | `.claude/hooks/*.py` | ○ | ○ | Claude Code lifecycle hook の実体。配布先で動作する。v2.20.0 で `hooks/schema.sql` を削除し SQLite スキーマは `src/c3/migrations/` に移管 |
|
|
192
192
|
| 2 | `.claude/agents/*.md` | ○ | ○ | ペルソナ定義。配布先で読まれる |
|
|
193
193
|
| 3 | `.claude/skills/*/` | ○ | ○ | オーケストレーション/ユーティリティ skill 定義(`scripts/` / `templates/` 等サブディレクトリ含む)|
|
|
194
|
-
| 4 | `.claude/rules/*.md` | ○ | ○ | C3
|
|
194
|
+
| 4 | `.claude/rules/*.md` | ○ | ○ | C3 配布デフォルトルール(常時注入対象)。配布元は `judgment-principles.md` の 1 件(ほかは `promoted/` のみ)。利用先ではこれに `/setup` 生成の `coding-standards.md` 等が加わる |
|
|
195
195
|
| 5 | `.claude/rules/promoted/*` | ○ | ×(`index.md` は INIT_ONLY) | プロジェクト固有昇格ルール。配布元の `promoted/index.md` は空雛形のみ配布。利用先で `/promote-pattern` が追記する **ユーザー所有領域**。`index.md` は `INIT_ONLY_PATTERNS` で上書きから保護される。昇格ルール本体(`YYYYMMDD-{id}.md`)は template 側に存在しないため `_walk_diff` の走査対象にならず元から無事 |
|
|
196
196
|
| 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
197
|
| 7 | `.claude/CLAUDE.md` | ○ | ○ | 配布先で常時注入される共通ルール |
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# 判定・検証の判断原則
|
|
2
|
+
|
|
3
|
+
判定・検証を行う際に守る 3 つの規律。要素は原文の逐語を保持する。
|
|
4
|
+
|
|
5
|
+
## 1. 安全側に倒す
|
|
6
|
+
|
|
7
|
+
「現状 0 hit だから実装しない」判断はせず、安全側に倒す。
|
|
8
|
+
|
|
9
|
+
実例: 2026-08-06 のユーザー裁定で、根拠不足のまま省略した判断 2 件を是正し、件数を見ずに沈黙していた判断をさらに 2 件検出した。
|
|
10
|
+
|
|
11
|
+
## 2. 到達可能性の判定
|
|
12
|
+
|
|
13
|
+
到達可能性は「参照 0 件」でなく「発火しうる経路が無い」で判定する(削除・影響判定の規約)。当たるべき経路=動的ロード / subprocess / 名前写像 / 設定 JSON 登録・monkeypatch 対象の導出タイミング(呼び出し時か import 時か)・ローカル skip テストは「実行されていない」前提で判定・探索ツールの射程を明示する(gitignored 配下は rg で 0 件・grep -rn でヒットし、真偽が道具で反転する)。
|
|
14
|
+
|
|
15
|
+
実例: 2026-08-13 に同型の誤判定が実働で再演し、CI 5 構成全赤を招いた。
|
|
16
|
+
|
|
17
|
+
## 3. 機械走査の 3 点申告
|
|
18
|
+
|
|
19
|
+
機械走査を名乗るときは 3 点を申告する: (a) 走査対象の形式を全部数えて申告(表行・引用ブロック・見出し・本文) (b) 版順の根拠を明示(ファイル名順とは限らない) (c) 検証が測っている性質を書く(「バイト一致」は書き写しの正確さであって拾う版の正しさではない)。
|
|
20
|
+
|
|
21
|
+
実例: 2026-08-07 の集約・移設作業で「畳む」工程の取り落としを 3 回連続で実測した。
|
{claude_code_conductor-2.70.0 → claude_code_conductor-2.71.1}/.claude/skills/dev-workflow/SKILL.md
RENAMED
|
@@ -456,6 +456,8 @@ c3 run .claude/skills/dev-workflow/scripts/record_agent_outcome.py \
|
|
|
456
456
|
|
|
457
457
|
上流修正の連鎖を経て C-3 に戻ってきた場合、毎回自動再走はしない。AskUserQuestion で再監査の要否を確認する(このブロックに副作用ツールを混在させない):
|
|
458
458
|
|
|
459
|
+
是正起因の欠陥が連続している場合は E-3 の『是正ループの打切条件』を参照する(前提を疑う打切)。
|
|
460
|
+
|
|
459
461
|
```json
|
|
460
462
|
{
|
|
461
463
|
"questions": [{
|
|
@@ -1121,6 +1123,9 @@ AskUserQuestion でフィードバックを確認し、対象 reviewer(CR/SR
|
|
|
1121
1123
|
2. **保守性指摘の許容条件**: 保守性向上を理由に是正を許容する場合、将来の運用コスト(PR diff 量の増加・触る箇所数)を許容理由に明記する
|
|
1122
1124
|
3. **先送りルール**: トレードオフで先送りする場合は「トリガー付き起票」のみ許す。具体的な再対応条件を明示する
|
|
1123
1125
|
4. **機構コスト**: 共通化・新規機構の導入は、その機構自体の保守コストも天秤に載せて判定する
|
|
1126
|
+
5. **実行で確かめられる指摘は試作・実データで裏取りしてから翻訳する**: 指摘の真偽・方向が実行で確かめられる場合(組み合わせロジック・件数の主張・走査結果)、対応表や差し戻し指示へ翻訳する前に試作を実データに当てる。自分の是正案も裏取りの対象に含める。読解だけの裁定は「正しいものを欠陥と呼ぶ」「欠陥を正しいと呼ぶ」を同時に起こした実績がある(2026-08-06)
|
|
1127
|
+
|
|
1128
|
+
**是正ループの打切条件(E 周回・計画監査サイクル共通):** 是正が新たな欠陥を生む周回が同一スライス内の監査・レビュー周回で 3 連続したら、周回を重ねず前提そのものを疑う。打切の信号は周回数ではなく「**前提が一度も疑われていない**こと」。前提転換の例: 機械条件による自動判定をやめ、人間への 1 問確認に縮退する(低頻度イベントの例外処理は機械条件で厳密化するより人間の 1 問ゲートに寄せる方が欠陥面が小さい・2026-08-13 実測)。自律運転中に本信号が立った場合は「情報不足の質問」の関所としてユーザーへ停止確認する
|
|
1124
1129
|
|
|
1125
1130
|
---
|
|
1126
1131
|
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
## 到達経路一覧
|
|
6
6
|
|
|
7
7
|
表の列構成: 経路(配置方法)、実パス(ファイルパスまたは「—」)、届く role(対象読み手)、条件(前提・性質)
|
|
8
|
+
本表の到達可否は Claude Code を前提とする。OpenCode adapter は `.claude/rules/` **直下**の `.md` と `.claude/CLAUDE.md` を `AGENTS.md` に埋め込む(サブディレクトリと skills は別経路)。Codex / Cursor への到達は `.claude/CLAUDE.md` の Platform Compatibility を参照
|
|
8
9
|
|
|
9
10
|
| 経路 | 実パス | 届く role | 条件 |
|
|
10
11
|
|---|---|---|---|
|
|
@@ -22,6 +23,7 @@
|
|
|
22
23
|
| plan-design-guidelines.md | .claude/skills/dev-workflow/references/plan-design-guidelines.md | planner(C-2) | フェーズ C 計画作成時に参照・守るべき規約 |
|
|
23
24
|
| record-protocol.md | .claude/skills/dev-workflow/references/record-protocol.md | 親 Claude のみ(記録対象 role である developer/tester/architect/planner の agent 定義からは参照されない) | 各ゲートの record bash ブロック exec 時に Read 指示される。機械適用・帰属判定共通規定含む |
|
|
24
25
|
| c3-omission-declaration.md | .claude/skills/dev-workflow/references/c3-omission-declaration.md | C-2・C-3 担当者 | C-2・C-3 到達時に Read 指示される。C-2 で C-3省略宣言の生成ルール・C-3 ステップ 0 の帰属判定共通規定 |
|
|
26
|
+
| judgment-principles.md | .claude/rules/judgment-principles.md | 全 role | 判定・検証の規律 3 件(rules 再帰自動ロード) |
|
|
25
27
|
|
|
26
28
|
## 置き場所デシジョン(3 手順)
|
|
27
29
|
|
|
@@ -1,5 +1,71 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [2.71.1] - 2026-08-14
|
|
4
|
+
|
|
5
|
+
### 修正
|
|
6
|
+
|
|
7
|
+
- **`c3 ask` の Windows 非対話判定が機能せず無限ハングする欠陥を修正した**(v2.71.0
|
|
8
|
+
「既知の問題」の解消)。`sys.stdin.isatty()` が Windows で stdin を NUL / `/dev/null` へ
|
|
9
|
+
リダイレクトした場合にも True を誤返却し、`--response` 未指定で exit 1 にならず
|
|
10
|
+
`msvcrt.getwch()`(実コンソール直読み)で無限ハングしていた。判定を
|
|
11
|
+
`stdin_is_interactive_console()`(Windows は GetConsoleMode で実コンソール接続を判定・
|
|
12
|
+
POSIX は従来どおり `isatty()`)へ置換し、入口ゲートと対話パス直前の二重ゲートを
|
|
13
|
+
同一判定へ統一した
|
|
14
|
+
- 判定ヘルパーを共有モジュール `src/c3/_terminal.py` へ移設し、関数全体を一箇所集約で
|
|
15
|
+
fail-closed 化した(想定外例外でも非対話扱い=exit 1 契約を維持・KeyboardInterrupt /
|
|
16
|
+
SystemExit は伝播。`question.py` 側は re-export でシーム維持)
|
|
17
|
+
- `_read_key` の POSIX 分岐に空読み EOF ガードを追加した(EOF 時のビジーループを解消し
|
|
18
|
+
既存の exit 1 経路へ接続)
|
|
19
|
+
- `docs/cli-reference.md` の v2.71 既知問題注記を修正後の実挙動へ更新した
|
|
20
|
+
|
|
21
|
+
### 内部
|
|
22
|
+
|
|
23
|
+
- `tests/test_cli_ask.py` に回帰・凍結テスト計 17 件を追加した(修正前状態での赤化実証・
|
|
24
|
+
内部依存注入による fail-closed 凍結・Windows 限定 subprocess+timeout 統合テストを含む。
|
|
25
|
+
フルスイート 3322 緑・CI 全緑 run 31755508514)
|
|
26
|
+
|
|
27
|
+
## [2.71.0] - 2026-08-14
|
|
28
|
+
|
|
29
|
+
### 追加
|
|
30
|
+
|
|
31
|
+
- **判定・検証の判断原則を `.claude/rules/judgment-principles.md` として新設した**(配布物・
|
|
32
|
+
rules 再帰自動ロードで全 role のコンテキストへ常時注入)。3 規律: ①「現状 0 hit だから
|
|
33
|
+
実装しない」判断はせず安全側に倒す ②到達可能性は「参照 0 件」でなく「発火しうる経路が
|
|
34
|
+
無い」で判定する(当たるべき経路=動的ロード / subprocess / 名前写像 / 設定 JSON 登録・
|
|
35
|
+
monkeypatch 対象の導出タイミング・ローカル skip テスト・探索ツールの射程明示)
|
|
36
|
+
③機械走査を名乗るときの 3 点申告(走査対象形式の全数・版順の根拠・検証が測る性質)。
|
|
37
|
+
実在検査は reachability-map への行追加により既存テスト(`test_reachability_map.py`)が担保
|
|
38
|
+
- **dev-workflow フェーズ E-3「裁定の判断基準」に第 5 項を追加した**: 実行で確かめられる
|
|
39
|
+
指摘(組み合わせロジック・件数の主張・走査結果)は試作・実データで裏取りしてから
|
|
40
|
+
差し戻しへ翻訳する。自分の是正案も裏取りの対象に含める
|
|
41
|
+
- **E-3 に「是正ループの打切条件」を追加した**(E 周回・計画監査サイクル共通): 是正が
|
|
42
|
+
新たな欠陥を生む周回が同一スライス内で 3 連続したら、周回を重ねず前提そのものを疑う。
|
|
43
|
+
打切の信号は周回数ではなく「前提が一度も疑われていない」こと。自律運転中は「情報不足の
|
|
44
|
+
質問」の関所としてユーザーへ停止確認する。C-3 ステップ 5 からも参照
|
|
45
|
+
- **`docs/cli-reference.md` に未文書化だった CLI 仕様 14 件を追記した**: `c3 init --target` /
|
|
46
|
+
`--git` / `--no-git` と TTY 同意プロンプト、`c3 update --target` / `--yes` と付随処理 4 点
|
|
47
|
+
(breaking changes 表示・MAJOR 承認・deletions 削除・checkpoint 更新)、`c3 doctor --quiet`、
|
|
48
|
+
`c3 tier stats --role`、`c3 recall --target`、`c3 metrics` の入力検証と上限、`c3 ask` の
|
|
49
|
+
exit code 表、`c3 plan waves` の exit 2、環境変数 `C3_DB_PATH` / `NO_COLOR`、サブコマンド
|
|
50
|
+
未指定・不正名と argparse 引数検証の exit 2
|
|
51
|
+
|
|
52
|
+
### 修正
|
|
53
|
+
|
|
54
|
+
- reachability-map(到達可能性マップ)に表の前提注記を追加した(Claude Code 前提・
|
|
55
|
+
OpenCode adapter は `.claude/rules/` 直下と `.claude/CLAUDE.md` のみ埋め込む・Codex /
|
|
56
|
+
Cursor への到達は Platform Compatibility を参照)
|
|
57
|
+
- `.claude/CLAUDE.md` の Platform Compatibility に「Codex / Cursor の生成物には rules は
|
|
58
|
+
写像されない」の限界告知を追加した
|
|
59
|
+
- `.claude/docs/config-policy.md` の配布判断マトリクス カテゴリ #4(rules)の「配布元では
|
|
60
|
+
0 件」を実態(`judgment-principles.md` 1 件)へ更新した
|
|
61
|
+
|
|
62
|
+
### 既知の問題
|
|
63
|
+
|
|
64
|
+
- `c3 ask` は Windows で stdin を NUL / `/dev/null` へリダイレクトした場合に非対話判定
|
|
65
|
+
(`sys.stdin.isatty()`)が誤判定となり、`--response` 未指定だと exit 1 にならず対話待ちで
|
|
66
|
+
ハングする(E-0 実行検証の実測で発見・`docs/cli-reference.md` に注記済み)。非対話実行では
|
|
67
|
+
常に `--response` を指定すること。コード修正は別スライスで対応予定
|
|
68
|
+
|
|
3
69
|
## [2.70.0] - 2026-08-13
|
|
4
70
|
|
|
5
71
|
### 追加
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: claude-code-conductor
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.71.1
|
|
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
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
"""Shared terminal helpers for c3 CLI subcommands.
|
|
2
|
+
|
|
3
|
+
Used by cli_doctor.py, cli_tier.py, cli_ask.py, question.py, and future
|
|
4
|
+
cli_*.py to keep terminal-facing logic in one place:
|
|
5
|
+
|
|
6
|
+
- ``supports_color`` / ``strip_ansi`` / ``sanitize_terminal_text``: ANSI
|
|
7
|
+
color support detection, escape-sequence stripping, and sanitization of
|
|
8
|
+
untrusted text before printing.
|
|
9
|
+
- ``stdin_is_interactive_console``: console-attachment detection for stdin
|
|
10
|
+
(whether an interactive console is really attached, as opposed to a NUL /
|
|
11
|
+
pipe / file redirection).
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
from __future__ import annotations
|
|
15
|
+
|
|
16
|
+
import os
|
|
17
|
+
import re
|
|
18
|
+
import sys
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
# CSI sequences with final byte 'm' (color / SGR). Other escape sequences
|
|
22
|
+
# (e.g. \033c reset, OSC \033]0;...\007 title) are not handled by _strip_ansi
|
|
23
|
+
# and would skew column-width calculations if they appeared in cell text.
|
|
24
|
+
_CSI_M_RE = re.compile(r"\033\[[0-9;]*m")
|
|
25
|
+
|
|
26
|
+
# Control characters disallowed when printing untrusted text to the terminal.
|
|
27
|
+
# Allow newline (\n), tab (\t), carriage return (\r) but strip any other
|
|
28
|
+
# C0 control or escape character (\x1b) so that ANSI/title-injection cannot
|
|
29
|
+
# happen via DB-stored values such as ``current_step`` / ``error_message``.
|
|
30
|
+
# Also strip the Unicode line/paragraph separators U+2028 / U+2029 so they
|
|
31
|
+
# match the init-session SR L-2 sanitization spec (removes U+2028 / U+2029).
|
|
32
|
+
# NEL (U+0085) is intentionally NOT included per that spec.
|
|
33
|
+
_DISALLOWED_CONTROL_RE = re.compile("[\x00-\x08\x0b\x0c\x0e-\x1f\x7f" + chr(0x2028) + chr(0x2029) + "]")
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def supports_color() -> bool:
|
|
37
|
+
"""Return True if stdout supports ANSI color sequences.
|
|
38
|
+
|
|
39
|
+
Honors the NO_COLOR environment variable (https://no-color.org/) and
|
|
40
|
+
requires stdout to be a TTY.
|
|
41
|
+
"""
|
|
42
|
+
if os.environ.get("NO_COLOR"):
|
|
43
|
+
return False
|
|
44
|
+
if not sys.stdout.isatty():
|
|
45
|
+
return False
|
|
46
|
+
return True
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def strip_ansi(s: str) -> str:
|
|
50
|
+
"""Remove ANSI CSI 'm' (SGR / color) sequences for visible-width calc.
|
|
51
|
+
|
|
52
|
+
Note: handles only ``\\033[...m`` style sequences. Other escape sequences
|
|
53
|
+
such as cursor movement (``\\033[H``), screen clear (``\\033[2J``), or
|
|
54
|
+
OSC title-set are intentionally not stripped here because the cells we
|
|
55
|
+
measure should never contain them.
|
|
56
|
+
"""
|
|
57
|
+
return _CSI_M_RE.sub("", s)
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
def sanitize_terminal_text(s: str) -> str:
|
|
61
|
+
"""Strip control / escape characters from untrusted text before printing.
|
|
62
|
+
|
|
63
|
+
Used for DB-sourced strings (``current_step`` / ``error_message``) so
|
|
64
|
+
they cannot inject ANSI escape sequences (title, cursor, screen clear)
|
|
65
|
+
into the terminal. Newlines / tabs / carriage returns are preserved.
|
|
66
|
+
The Unicode line/paragraph separators U+2028 / U+2029 are also stripped
|
|
67
|
+
(init-session SR L-2 sanitization spec); NEL (U+0085) is out of scope.
|
|
68
|
+
"""
|
|
69
|
+
if not s:
|
|
70
|
+
return s
|
|
71
|
+
return _DISALLOWED_CONTROL_RE.sub("", s)
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
def stdin_is_interactive_console() -> bool:
|
|
75
|
+
"""Return True only when stdin is attached to a real interactive console.
|
|
76
|
+
|
|
77
|
+
Windows の CRT ``_isatty()``(``sys.stdin.isatty()`` の内部実装)は対象ハンドルが
|
|
78
|
+
``FILE_TYPE_CHAR`` かどうかしか見ておらず、NUL デバイス(``subprocess.DEVNULL`` /
|
|
79
|
+
``NUL`` リダイレクト)もコンソールと同じ ``FILE_TYPE_CHAR`` に分類されるため
|
|
80
|
+
誤って True を返す(実測: debug-analysis-20260814-011032.md)。
|
|
81
|
+
Windows では ``GetConsoleMode``(実コンソールハンドルに対してのみ成功する
|
|
82
|
+
Win32 API)で実際のコンソール接続を確認し、NUL・パイプ・ファイルいずれの
|
|
83
|
+
リダイレクトも False として扱う。POSIX は ``isatty()`` が ``/dev/null`` に
|
|
84
|
+
対して標準どおり正しく False を返すためそのまま使う。
|
|
85
|
+
|
|
86
|
+
関数全体を ``except Exception`` で包み、内部でどの分岐がどの例外型を投げても
|
|
87
|
+
送出せず False を返す (fail-closed)。POSIX 分岐の ``sys.stdin.isatty()`` は
|
|
88
|
+
``sys.stdin`` が None のケース (pythonw.exe / PyInstaller --windowed など) で
|
|
89
|
+
``AttributeError`` を投げうるが、これを呼び出し元へ伝播させると
|
|
90
|
+
``c3 ask`` の「exit 1」契約が破れる (SR-R-001 / CR-E-001)。呼び出し位置ごとに
|
|
91
|
+
try/except を足すのではなく、ここ一箇所へ集約して将来の呼び出し箇所追加にも
|
|
92
|
+
自動的に効かせる。``KeyboardInterrupt`` / ``SystemExit`` は ``BaseException``
|
|
93
|
+
直属で ``Exception`` を継承しないため握り潰さない (Ctrl-C は従来どおり伝播)。
|
|
94
|
+
"""
|
|
95
|
+
try:
|
|
96
|
+
if os.name == "nt":
|
|
97
|
+
return _windows_console_attached()
|
|
98
|
+
return sys.stdin.isatty()
|
|
99
|
+
except Exception:
|
|
100
|
+
return False
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
def _windows_console_attached() -> bool:
|
|
104
|
+
try:
|
|
105
|
+
import ctypes
|
|
106
|
+
import msvcrt
|
|
107
|
+
from ctypes import wintypes
|
|
108
|
+
|
|
109
|
+
handle = msvcrt.get_osfhandle(0)
|
|
110
|
+
kernel32 = ctypes.windll.kernel32
|
|
111
|
+
kernel32.GetConsoleMode.argtypes = [wintypes.HANDLE, ctypes.POINTER(wintypes.DWORD)]
|
|
112
|
+
kernel32.GetConsoleMode.restype = wintypes.BOOL
|
|
113
|
+
mode = wintypes.DWORD()
|
|
114
|
+
return bool(kernel32.GetConsoleMode(wintypes.HANDLE(handle), ctypes.byref(mode)))
|
|
115
|
+
except Exception:
|
|
116
|
+
# 判定不能ならすべて非対話扱いに倒す (fail-closed)。answer_questions() 経由の
|
|
117
|
+
# 呼び出し位置も含め、想定外の例外型で対話ゲートを突破させない。
|
|
118
|
+
return False
|
|
@@ -7,6 +7,7 @@ import json
|
|
|
7
7
|
import sys
|
|
8
8
|
from pathlib import Path
|
|
9
9
|
|
|
10
|
+
from c3._terminal import stdin_is_interactive_console
|
|
10
11
|
from c3.question import answer_questions, load_questions
|
|
11
12
|
|
|
12
13
|
|
|
@@ -47,9 +48,16 @@ def register(subparsers: argparse._SubParsersAction) -> None:
|
|
|
47
48
|
|
|
48
49
|
|
|
49
50
|
def handle(args: argparse.Namespace) -> int:
|
|
50
|
-
if args.response is None
|
|
51
|
-
|
|
52
|
-
|
|
51
|
+
if args.response is None:
|
|
52
|
+
# 判定関数が想定外の例外を出しても traceback で落とさず「非対話」へ倒す
|
|
53
|
+
# (fail-closed)。--response 未指定時の exit 1 契約を例外型に依存させない。
|
|
54
|
+
try:
|
|
55
|
+
interactive = stdin_is_interactive_console()
|
|
56
|
+
except Exception:
|
|
57
|
+
interactive = False
|
|
58
|
+
if not interactive:
|
|
59
|
+
print("c3 ask: --response is required in non-interactive mode", file=sys.stderr)
|
|
60
|
+
return 1
|
|
53
61
|
|
|
54
62
|
try:
|
|
55
63
|
if args.file is not None:
|
|
@@ -13,6 +13,12 @@ from dataclasses import dataclass
|
|
|
13
13
|
from pathlib import Path
|
|
14
14
|
from typing import Any
|
|
15
15
|
|
|
16
|
+
# stdin_is_interactive_console() は共有ターミナルヘルパー _terminal.py が正本
|
|
17
|
+
# (CR-R-003)。ここでの import は question.py 内部の呼び出し元 (answer_questions /
|
|
18
|
+
# _raw_keyboard_supported) が使うと同時に、``question.stdin_is_interactive_console``
|
|
19
|
+
# という従来の参照名を後方互換で維持する re-export を兼ねる。
|
|
20
|
+
from c3._terminal import stdin_is_interactive_console
|
|
21
|
+
|
|
16
22
|
|
|
17
23
|
@dataclass(frozen=True)
|
|
18
24
|
class Option:
|
|
@@ -63,7 +69,7 @@ def answer_questions(
|
|
|
63
69
|
if current_response is not None:
|
|
64
70
|
selected = _select_from_response(question, current_response)
|
|
65
71
|
else:
|
|
66
|
-
use_interactive =
|
|
72
|
+
use_interactive = stdin_is_interactive_console() if interactive is None else interactive
|
|
67
73
|
selected = _select_interactively(question) if use_interactive else _select_default(question)
|
|
68
74
|
answers.append(_answer_payload(question, selected))
|
|
69
75
|
return {"answers": answers}
|
|
@@ -383,7 +389,16 @@ def _clear_screen() -> None:
|
|
|
383
389
|
|
|
384
390
|
|
|
385
391
|
def _raw_keyboard_supported() -> bool:
|
|
386
|
-
|
|
392
|
+
# OS が raw keyboard API を持つかではなく、今この stdin に実コンソールが
|
|
393
|
+
# 接続されているかを見る。旧実装(os.name in ("nt", "posix"))は事実上
|
|
394
|
+
# 常に True を返し、NUL/パイプ/ファイルへのリダイレクト時でも
|
|
395
|
+
# _select_with_line_input() の安全網(input() → EOFError)を恒久的に
|
|
396
|
+
# 迂回させ msvcrt.getwch() の無限ブロックを招いていた
|
|
397
|
+
# (debug-analysis-20260814-011032.md 欠陥B)。
|
|
398
|
+
# answer_questions() の外側ゲートと同じ判定をここでも呼ぶのは、interactive=True を
|
|
399
|
+
# 明示指定して外側ゲートを迂回する呼び出し元にも安全網を効かせるための意図的な
|
|
400
|
+
# 再検証であり、単純な重複ではない(削除・簡略化しないこと)。
|
|
401
|
+
return stdin_is_interactive_console()
|
|
387
402
|
|
|
388
403
|
|
|
389
404
|
def _read_key() -> str:
|
|
@@ -410,6 +425,11 @@ def _read_key() -> str:
|
|
|
410
425
|
try:
|
|
411
426
|
tty.setraw(fd)
|
|
412
427
|
ch = sys.stdin.read(1)
|
|
428
|
+
if ch == "":
|
|
429
|
+
# EOF(read が空文字列)。空文字列を返すと _select_interactively() の
|
|
430
|
+
# ループが再描画しながら回り続け CPU ビジーループになるため、
|
|
431
|
+
# EOFError を送出して呼び出し元(cli_ask.handle の except EOFError)へ委ねる。
|
|
432
|
+
raise EOFError("stdin reached EOF while reading a key")
|
|
413
433
|
if ch == "\x1b":
|
|
414
434
|
nxt = sys.stdin.read(2)
|
|
415
435
|
return {"[A": "up", "[B": "down", "[C": "right", "[D": "left"}.get(nxt, "escape")
|