code-mower 0.9.3b1__tar.gz → 1.0.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.
- {code_mower-0.9.3b1 → code_mower-1.0.0}/PKG-INFO +43 -14
- {code_mower-0.9.3b1 → code_mower-1.0.0}/README.md +42 -13
- {code_mower-0.9.3b1 → code_mower-1.0.0}/pyproject.toml +1 -1
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/__init__.py +1 -1
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/board.py +203 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/calibration/arms.py +1 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/calibration/planning.py +1 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/cli.py +8 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/cloud_client/bundle.py +4 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/cloud_client/events.py +113 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/code_mower_telemetry.py +19 -3
- code_mower-1.0.0/src/code_mower/controller.py +816 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/doctor.py +30 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/doctor_checks/__init__.py +18 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/doctor_checks/github.py +20 -2
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/doctor_checks/github_branch.py +9 -1
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/doctor_checks/github_human_token.py +123 -4
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/doctor_checks/github_repo.py +31 -5
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/doctor_checks/groups.py +3 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/doctor_checks/models.py +67 -3
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/doctor_checks/output.py +25 -2
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/doctor_checks/registry.py +12 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/doctor_checks/runner.py +16 -0
- code_mower-1.0.0/src/code_mower/doctor_checks/supervised_pilot.py +434 -0
- code_mower-1.0.0/src/code_mower/lane_configs/muse_cli.py +35 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/migration.py +207 -8
- code_mower-1.0.0/src/code_mower/muse_cli_audit_pr.py +502 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/package_content.py +1 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/package_manifest.py +8 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/provider_registry.py +39 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/templates/code-mower.example.yml +38 -1
- {code_mower-0.9.3b1 → code_mower-1.0.0/src/code_mower}/templates/providers.yml +38 -1
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/templates/workflows/builder-provenance.yml.j2 +1 -1
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/versioning.py +7 -1
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower.egg-info/PKG-INFO +43 -14
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower.egg-info/SOURCES.txt +8 -0
- code_mower-1.0.0/templates/providers/muse_cli.yml +35 -0
- {code_mower-0.9.3b1/src/code_mower → code_mower-1.0.0}/templates/providers.yml +38 -1
- {code_mower-0.9.3b1 → code_mower-1.0.0}/templates/workflows/builder-provenance.yml.j2 +1 -1
- {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_board.py +93 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_clear_stale.py +8 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_cloud_client.py +75 -0
- code_mower-1.0.0/tests/test_controller.py +466 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_doctor_boundaries.py +1 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_doctor_github_checks.py +108 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_doctor_output.py +89 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_doctor_registry.py +78 -1
- code_mower-1.0.0/tests/test_doctor_supervised_pilot.py +338 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_init_build_loop.py +23 -0
- code_mower-1.0.0/tests/test_migration_setup_drift.py +162 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_provider_fixture_contracts.py +38 -2
- {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_provider_local_cli.py +214 -1
- {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_release_hygiene.py +208 -61
- code_mower-1.0.0/tests/test_supervised_pilot_contract.py +61 -0
- code_mower-0.9.3b1/tests/test_migration_setup_drift.py +0 -82
- {code_mower-0.9.3b1 → code_mower-1.0.0}/CODE_OF_CONDUCT.md +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/LICENSE +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/MANIFEST.in +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/NOTICE +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/SUPPORT.md +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/requirements/requirements.txt +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/setup.cfg +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/adapters/__init__.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/adapters/_base.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/adapters/cursor_bugbot.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/adapters/gitar.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/adapters/greptile.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/adapters/qodo.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/antigravity_cli_audit_pr.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/antigravity_sdk_probe.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/audit_handoff_log.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/audit_labeler_lib.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/audit_limits.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/audit_progress.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/blind_review_artifacts.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/blind_review_coordinator.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/board_store.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/bootstrap.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/builder_experiment.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/builder_runs.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/calibration/__init__.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/calibration/auto_discovery.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/calibration/commands.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/calibration/context_inputs.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/calibration/corpus.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/calibration/effect_report.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/calibration/evidence.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/calibration/evidence_report.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/calibration/identity.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/calibration/metrics.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/calibration/overlap.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/calibration/policy.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/calibration/results.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/calibration/run_results.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/calibration/run_status.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/calibration/runner.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/calibration/truth.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/calibration/value_report.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/checks.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/claude_audit_pr.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/claude_cli_bounce.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/claude_cli_environment.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/clear_stale.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/cloud.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/cloud_client/__init__.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/cloud_client/doctor.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/cloud_client/dogfood.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/cloud_client/endpoints.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/cloud_client/errors.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/cloud_client/export.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/cloud_client/git_metadata.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/cloud_client/manifest.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/cloud_client/operations.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/cloud_client/reports.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/cloud_client/setup.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/cloud_client/tokens.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/cloud_client/upload.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/code_mower_calibration.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/code_mower_context_packs.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/code_mower_merge.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/coderabbit_cli_audit_pr.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/codex_audit_env_preflight.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/codex_audit_pr.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/codex_audit_schema_smoke.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/codex_audit_verdict.schema.json +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/config.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/decisions.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/doctor_checks/adoption.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/doctor_checks/audit_limits.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/doctor_checks/cloud.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/doctor_checks/common.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/doctor_checks/github_actions.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/doctor_checks/github_actions_cost.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/doctor_checks/github_actions_cost_summary.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/doctor_checks/github_actions_failure_annotations.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/doctor_checks/github_actions_failure_models.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/doctor_checks/github_actions_failure_scan.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/doctor_checks/github_actions_failure_selection.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/doctor_checks/github_actions_failures.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/doctor_checks/github_actions_permissions.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/doctor_checks/github_api.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/doctor_checks/github_config.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/doctor_checks/github_provider.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/doctor_checks/github_trusted_authors.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/doctor_checks/presets.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/doctor_checks/privacy.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/doctor_checks/provider_api_model.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/doctor_checks/provider_api_model_openai.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/doctor_checks/provider_api_model_profiles.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/doctor_checks/provider_env.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/doctor_checks/provider_env_required.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/doctor_checks/provider_env_tokens.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/doctor_checks/provider_local_audit_setup.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/doctor_checks/provider_local_cli.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/doctor_checks/provider_local_cli_commands.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/doctor_checks/provider_local_cli_probe_config.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/doctor_checks/provider_probe.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/doctor_checks/provider_probe_auth.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/doctor_checks/provider_probe_evaluation.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/doctor_checks/provider_probe_json.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/doctor_checks/provider_probe_remediation.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/doctor_checks/provider_review_hygiene.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/doctor_checks/providers.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/doctor_checks/runtime.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/doctor_checks/runtime_github_auth.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/doctor_checks/self_hosted_runner.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/gate_health.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/gemini_cli_audit_pr.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/git_identity.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/grok_build_audit_pr.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/hermes_cli_audit_pr.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/init.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/lane_configs/__init__.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/lane_configs/aider.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/lane_configs/antigravity_cli.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/lane_configs/claude.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/lane_configs/codex.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/lane_configs/devin.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/lane_configs/gemini_cli.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/lane_configs/grok_build.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/lane_configs/hermes_cli.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/lane_configs/local_llm.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/lane_status.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/local_llm_audit_pr.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/local_llm_bakeoff.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/local_llm_calibration.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/local_llm_profiles.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/migration_install.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/migration_mirror.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/migration_readiness.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/migration_rehearsal.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/next_steps.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/package.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/package_paths.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/package_rendering.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/package_static.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/plan_context.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/prompts.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/provider_runners/__init__.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/provider_runners/comments.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/provider_runners/exit_codes.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/provider_runners/git.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/provider_runners/github_auth.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/provider_runners/github_pr.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/provider_runners/pr_worktree.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/provider_runners/process.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/provider_runners/repo_paths.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/provider_runners/text_schema.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/provider_runners/verdict_artifacts.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/provider_runners/workspace.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/providers/__init__.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/providers/local_cli.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/providers/provenance.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/release_readiness.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/reviewer_metrics.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/reviewer_spend.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/saas_reviewer_labeler.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/secrets.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/templates/builder-experiment.example.json +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/templates/calibration-corpus.example.json +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/templates/calibration-corpus.json +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/templates/context-packs.example.json +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/templates/lane_prompts/base-audit.md +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/templates/lane_prompts/calibration-policy.md +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/templates/lane_prompts/context-driven-quality.md +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/templates/lane_prompts/docs-design.md +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/templates/lane_prompts/generic-programming.md +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/templates/lane_prompts/operability.md +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/templates/lane_prompts/package-runtime.md +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/templates/lane_prompts/plan-conformance.md +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/templates/lane_prompts/security-threat-model.md +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/templates/lanes/README.md +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/templates/lanes/claude.md +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/templates/lanes/codex.md +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/templates/lanes/cursor.md +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/templates/lanes/generic.md +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/templates/lanes/run_mac_lane.sh +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/templates/product-support/code_mower +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/templates/product-support/code_mower_standalone_pin.env +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/templates/product-support/code_mower_standalone_shadow.sh +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/templates/product-support/run_claude_audit_pr.sh +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/templates/product-support/run_codex_audit_pr.sh +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/templates/product-support/safe_gh_comment.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/templates/product-support/status_report.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/templates/reviewer-spend.example.json +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/templates/reviewer-value-report.example.md +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/templates/workflows/audit-label-cleanup.yml.j2 +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/templates/workflows/code-mower-agent-pr-labeler.yml.j2 +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/templates/workflows/code-mower-fix-round-dispatch.yml.j2 +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/templates/workflows/code-mower-gate-health.yml.j2 +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/templates/workflows/code-mower-gate.yml.j2 +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/templates/workflows/dispatch-lanes.yml.j2 +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/templates/workflows/hosted-bridge.yml.j2 +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/templates/workflows/lane-mac-runner.yml.j2 +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/templates/workflows/local-cli-audit.yml.j2 +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/templates/workflows/needs-owner-notify.yml.j2 +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/templates/workflows/private-standalone-shadow.yml.j2 +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/templates/workflows/review-clear-stale.yml.j2 +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/templates/workflows/saas-reviewer-labeler.yml.j2 +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/templates/workflows/self-hosted-local-audit.yml.j2 +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/templates/workflows/trailer-comment-labeler.yml.j2 +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/templates/workflows/weekly-status.yml.j2 +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/trailer_comment_labeler.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/work_orders.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower/workflow_actionlint.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower.egg-info/dependency_links.txt +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower.egg-info/entry_points.txt +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower.egg-info/requires.txt +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/src/code_mower.egg-info/top_level.txt +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/templates/builder-experiment.example.json +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/templates/calibration-corpus.example.json +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/templates/calibration-corpus.json +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/templates/code-mower.yml.j2 +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/templates/context-packs.example.json +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/templates/cursor/BUGBOT.md +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/templates/lanes/README.md +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/templates/lanes/claude.md +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/templates/lanes/codex.md +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/templates/lanes/cursor.md +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/templates/lanes/generic.md +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/templates/lanes/run_mac_lane.sh +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/templates/providers/acp_bridge.yml +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/templates/providers/aider.yml +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/templates/providers/antigravity_cli.yml +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/templates/providers/claude_audit.yml +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/templates/providers/claude_review.yml +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/templates/providers/coderabbit_cli.yml +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/templates/providers/codex.yml +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/templates/providers/cursor_bugbot.yml +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/templates/providers/devin.yml +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/templates/providers/gemini_cli.yml +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/templates/providers/gitar.yml +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/templates/providers/greptile.yml +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/templates/providers/hermes_cli.yml +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/templates/providers/local_llm.yml +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/templates/providers/qodo.yml +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/templates/reviewer-spend.example.json +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/templates/reviewer-value-report.example.md +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/templates/workflows/audit-label-cleanup.yml.j2 +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/templates/workflows/blind-review-artifacts-dry-run.yml.j2 +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/templates/workflows/code-mower-agent-pr-labeler.yml.j2 +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/templates/workflows/code-mower-fix-round-dispatch.yml.j2 +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/templates/workflows/code-mower-gate-health.yml.j2 +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/templates/workflows/code-mower-gate.yml.j2 +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/templates/workflows/dispatch-lanes.yml.j2 +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/templates/workflows/hosted-bridge.yml.j2 +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/templates/workflows/lane-mac-runner.yml.j2 +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/templates/workflows/local-cli-audit.yml.j2 +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/templates/workflows/private-standalone-shadow.yml.j2 +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/templates/workflows/review-clear-stale.yml.j2 +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/templates/workflows/saas-reviewer-labeler.yml.j2 +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/templates/workflows/self-hosted-local-audit.yml.j2 +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/templates/workflows/trailer-comment-labeler.yml.j2 +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_antigravity_sdk_probe.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_audit_comment_posture.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_audit_limits.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_builder_experiment.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_builder_identity.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_builder_runs.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_calibration_effect_report.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_calibration_truth.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_checks.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_claude_audit_pr.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_claude_cli_bounce.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_cloud_git_metadata.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_cloud_manifest.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_cloud_reports.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_coderabbit_cli_audit_pr.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_codex_audit_env_preflight.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_codex_audit_pr.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_decision_audit_integration.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_decisions.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_doctor_actions_cost_summary.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_doctor_actions_failure_selection.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_doctor_privacy.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_doctor_provider_env_required.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_doctor_provider_env_tokens.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_doctor_provider_local_audit_setup.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_doctor_provider_probe.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_doctor_provider_review_hygiene.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_doctor_runtime.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_doctor_self_hosted_runner.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_gate_health.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_init_actionlint.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_lane_status.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_local_llm_github_helpers.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_plan_context.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_prompts.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_provider_runners_comments.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_provider_runners_git.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_provider_runners_github_pr.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_provider_runners_pr_worktree.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_provider_runners_process.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_provider_runners_repo_paths.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_provider_runners_text_schema.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_provider_runners_workspace.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_reviewer_metrics_core.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_reviewer_spend.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_trailer_comment_labeler.py +0 -0
- {code_mower-0.9.3b1 → code_mower-1.0.0}/tests/test_work_orders.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: code-mower
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 1.0.0
|
|
4
4
|
Summary: Multi-reviewer AI code audit orchestration
|
|
5
5
|
License-Expression: Apache-2.0
|
|
6
6
|
Requires-Python: >=3.12
|
|
@@ -66,6 +66,12 @@ first-run adoption gaps. `--preflight` remains the compatibility preset for
|
|
|
66
66
|
older scripts; `--adoption` adds explicit repo targeting and setup guidance.
|
|
67
67
|
Use `--hosted-builders` or `--orchestrator-only` when the current machine is
|
|
68
68
|
observing/coordinating lanes and will not run local Codex or Claude wrappers.
|
|
69
|
+
For the v1.0 supervised pilot posture, run
|
|
70
|
+
`code-mower doctor --supervised-pilot --repo OWNER/REPO`; use
|
|
71
|
+
`--promoted-pilot` only when `code-mower/gate`, repository auto-merge, and a
|
|
72
|
+
merge-capable gate credential are ready to let green audits drive merge.
|
|
73
|
+
On a self-hosted Mac audit host, add `--runner` to include runner launch and
|
|
74
|
+
wrapper checks in the same proof.
|
|
69
75
|
|
|
70
76
|
Example, shortened:
|
|
71
77
|
|
|
@@ -95,6 +101,13 @@ wrappers, run `code-mower migration setup-drift --repo-path .` before copying a
|
|
|
95
101
|
fresh `.code-mower.generated` tree. It is read-only and reports path-level
|
|
96
102
|
classifications (`same`, `differs`, `new`, `repo-only`,
|
|
97
103
|
`missing-from-output`) without file contents or diffs.
|
|
104
|
+
If the repository already has builder or dispatch lanes, rerun setup drift with
|
|
105
|
+
the current builder set, for example `--builders codex,claude,cursor`, before
|
|
106
|
+
opening the reviewed upgrade PR.
|
|
107
|
+
If the report warns that the repo path may be incomplete, rerun it from the
|
|
108
|
+
full repository checkout before treating every generated file as new. If it
|
|
109
|
+
detects reviewer-lane files but no builder-dispatch files, pass `--builders`
|
|
110
|
+
only for repos that actually use builder lanes.
|
|
98
111
|
Use [Upgrade An Existing Repository](docs/upgrade-existing-repo.md) for the
|
|
99
112
|
reviewed PR flow, repo-only file handling, builder identity checks, and
|
|
100
113
|
wrapper/pin drift checks.
|
|
@@ -124,7 +137,11 @@ checks Board inputs and local history without exposing local paths by default.
|
|
|
124
137
|
`code-mower board reset --repo OWNER/REPO --yes` clears only the local Board
|
|
125
138
|
history file. The Board also shows an owner queue, and it
|
|
126
139
|
summarizes reviewer verdict history and spend/latency from local board events
|
|
127
|
-
plus `.code-mower/reviewer-spend.json` when those files exist.
|
|
140
|
+
plus `.code-mower/reviewer-spend.json` when those files exist. When
|
|
141
|
+
`code-mower.yml` is present, the Board also embeds a supervised-pilot controller
|
|
142
|
+
summary so the browser view shows the current decision, queue counts, reviewer
|
|
143
|
+
evidence, selected PR or issue, and next action from the same metadata-only
|
|
144
|
+
policy engine as `code-mower controller run`. Local agents can
|
|
128
145
|
publish opt-in status cards by writing metadata-only JSON files to
|
|
129
146
|
`.code-mower/board/agents/*.json`; the Board redacts local paths by default and
|
|
130
147
|
does not upload those cards.
|
|
@@ -133,6 +150,12 @@ The local JSON contracts are documented in
|
|
|
133
150
|
When a team wants the same operator picture on CodeMower.com, run
|
|
134
151
|
`code-mower cloud board-snapshot --repo-slug OWNER/REPO --json` to inspect a
|
|
135
152
|
zero-report, metadata-only mirror event, then add `--yes` only after review.
|
|
153
|
+
The v1.0 supervised-pilot automation and event boundary is defined in
|
|
154
|
+
[Supervised Pilot Contract](docs/supervised-pilot-contract.md).
|
|
155
|
+
As that controller lands, `code-mower controller run --repo OWNER/REPO` is the
|
|
156
|
+
dry-run-first policy check: it selects the current dispatch/merge/owner-action
|
|
157
|
+
decision from metadata, can write a sanitized event with `--event-file`, and
|
|
158
|
+
does not mutate GitHub state.
|
|
136
159
|
|
|
137
160
|
## See The Value Shape First
|
|
138
161
|
|
|
@@ -169,14 +192,19 @@ after reinstalling, especially when switching between pipx and uv.
|
|
|
169
192
|
| B. Build loop in 30 minutes | You want builders plus an orchestrator pattern after the reviewer gate works. | Complete path A, then add the automation token, require `code-mower/gate` from Any source, enable repository auto-merge, prove the self-hosted Mac lane runner with `doctor --runner`, run `init --builders`, and dispatch the first issue. | [Build Loop In 30 Minutes](docs/build-loop-in-30-minutes.md) |
|
|
170
193
|
| C. Builder experiment | You want to compare authoring loops before trusting them broadly. | Use a work order or experiment spec, run `code-mower builder-experiment run` around an explicit command, then review the source-free `authoringRun` artifact and normal audit evidence. | [Builder Experiments](docs/builder-experiments.md) |
|
|
171
194
|
|
|
195
|
+
When you ask another agent to install, upgrade, orchestrate, build, or review,
|
|
196
|
+
start from the universal prompt in
|
|
197
|
+
[Orchestrator Prompt Pack](docs/orchestrator-prompt-pack.md). It makes the
|
|
198
|
+
agent report its actual host posture, exact installed version, doctor result,
|
|
199
|
+
Board URL, and any owner-only click-list before it mutates the repo.
|
|
200
|
+
|
|
172
201
|
The current package-index announcement entry point is the tagged
|
|
173
|
-
[Try Code Mower In 10 Minutes](https://github.com/codemower-ai/code-mower/blob/
|
|
174
|
-
guide. The
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
public package rather than a source checkout.
|
|
202
|
+
[Try Code Mower In 10 Minutes](https://github.com/codemower-ai/code-mower/blob/v1.0.0/docs/try-in-10-minutes.md)
|
|
203
|
+
guide. The v1.0 supervised-pilot release includes the native Board, the
|
|
204
|
+
controller dry-run and policy contract, adoption and upgrade hardening from
|
|
205
|
+
recent install rehearsals, package-index release checks, provider-diversity
|
|
206
|
+
fixtures, and the universal orchestrator prompt pack. Package-only users can
|
|
207
|
+
start from the public package rather than a source checkout.
|
|
180
208
|
|
|
181
209
|
## What Calibration Does And Does Not Prove
|
|
182
210
|
|
|
@@ -207,7 +235,7 @@ Provider-contract baseline for the next release train:
|
|
|
207
235
|
|
|
208
236
|
For release verification,
|
|
209
237
|
[First-User Install Rehearsal](docs/first-user-install-rehearsal.md) records
|
|
210
|
-
the package-index procedure for `
|
|
238
|
+
the package-index procedure for `v1.0.0` / `code-mower==1.0.0`. The
|
|
211
239
|
GitHub release records the workflow and rehearsal evidence for the exact tag.
|
|
212
240
|
|
|
213
241
|
## Optional: Plan Before Coding
|
|
@@ -355,8 +383,8 @@ The first recommended lanes are local/manual:
|
|
|
355
383
|
| Gitar | advisory third signal | informational until calibrated |
|
|
356
384
|
|
|
357
385
|
Everything else starts manual or informational until your own calibration data
|
|
358
|
-
proves it is useful: Antigravity/Gemini, Hermes, CodeRabbit CLI, Cursor
|
|
359
|
-
Qodo, Greptile, Devin, local LLMs, and future ACP bridges.
|
|
386
|
+
proves it is useful: Antigravity/Gemini, Muse, Hermes, CodeRabbit CLI, Cursor
|
|
387
|
+
BugBot, Qodo, Greptile, Devin, local LLMs, and future ACP bridges.
|
|
360
388
|
|
|
361
389
|
Gemini CLI and Antigravity are distinct lane ids even though both are Google
|
|
362
390
|
surfaces and may use Gemini model infrastructure. Keep their auth, model
|
|
@@ -393,8 +421,8 @@ measurement work.
|
|
|
393
421
|
|
|
394
422
|
## Installation Status
|
|
395
423
|
|
|
396
|
-
The current package-index
|
|
397
|
-
install spec `code-mower==0.
|
|
424
|
+
The current package-index release baseline is `v1.0.0`, with pinned package
|
|
425
|
+
install spec `code-mower==1.0.0`. Release evidence is recorded on the GitHub
|
|
398
426
|
release and in the first-user install rehearsal. The public repository is
|
|
399
427
|
[codemower-ai/code-mower](https://github.com/codemower-ai/code-mower), and
|
|
400
428
|
GitHub releases remain the auditable source for tags, build artifacts, and
|
|
@@ -459,6 +487,7 @@ first so local work exercises the same package entrypoint users install.
|
|
|
459
487
|
- [v0.6 Release Notes](docs/v06-release-notes.md)
|
|
460
488
|
- [v0.8 Release Notes](docs/v08-release-notes.md)
|
|
461
489
|
- [v0.9 Release Notes](docs/v09-release-notes.md)
|
|
490
|
+
- [v1.0 Release Notes](docs/v10-release-notes.md)
|
|
462
491
|
- [Post-v0.8 Effectiveness Assessment](docs/post-v08-effectiveness-assessment.md)
|
|
463
492
|
- [Demo Calibration Example](examples/demo-calibration/README.md)
|
|
464
493
|
- [Board Demo Rehearsal](examples/board-demo/README.md)
|
|
@@ -49,6 +49,12 @@ first-run adoption gaps. `--preflight` remains the compatibility preset for
|
|
|
49
49
|
older scripts; `--adoption` adds explicit repo targeting and setup guidance.
|
|
50
50
|
Use `--hosted-builders` or `--orchestrator-only` when the current machine is
|
|
51
51
|
observing/coordinating lanes and will not run local Codex or Claude wrappers.
|
|
52
|
+
For the v1.0 supervised pilot posture, run
|
|
53
|
+
`code-mower doctor --supervised-pilot --repo OWNER/REPO`; use
|
|
54
|
+
`--promoted-pilot` only when `code-mower/gate`, repository auto-merge, and a
|
|
55
|
+
merge-capable gate credential are ready to let green audits drive merge.
|
|
56
|
+
On a self-hosted Mac audit host, add `--runner` to include runner launch and
|
|
57
|
+
wrapper checks in the same proof.
|
|
52
58
|
|
|
53
59
|
Example, shortened:
|
|
54
60
|
|
|
@@ -78,6 +84,13 @@ wrappers, run `code-mower migration setup-drift --repo-path .` before copying a
|
|
|
78
84
|
fresh `.code-mower.generated` tree. It is read-only and reports path-level
|
|
79
85
|
classifications (`same`, `differs`, `new`, `repo-only`,
|
|
80
86
|
`missing-from-output`) without file contents or diffs.
|
|
87
|
+
If the repository already has builder or dispatch lanes, rerun setup drift with
|
|
88
|
+
the current builder set, for example `--builders codex,claude,cursor`, before
|
|
89
|
+
opening the reviewed upgrade PR.
|
|
90
|
+
If the report warns that the repo path may be incomplete, rerun it from the
|
|
91
|
+
full repository checkout before treating every generated file as new. If it
|
|
92
|
+
detects reviewer-lane files but no builder-dispatch files, pass `--builders`
|
|
93
|
+
only for repos that actually use builder lanes.
|
|
81
94
|
Use [Upgrade An Existing Repository](docs/upgrade-existing-repo.md) for the
|
|
82
95
|
reviewed PR flow, repo-only file handling, builder identity checks, and
|
|
83
96
|
wrapper/pin drift checks.
|
|
@@ -107,7 +120,11 @@ checks Board inputs and local history without exposing local paths by default.
|
|
|
107
120
|
`code-mower board reset --repo OWNER/REPO --yes` clears only the local Board
|
|
108
121
|
history file. The Board also shows an owner queue, and it
|
|
109
122
|
summarizes reviewer verdict history and spend/latency from local board events
|
|
110
|
-
plus `.code-mower/reviewer-spend.json` when those files exist.
|
|
123
|
+
plus `.code-mower/reviewer-spend.json` when those files exist. When
|
|
124
|
+
`code-mower.yml` is present, the Board also embeds a supervised-pilot controller
|
|
125
|
+
summary so the browser view shows the current decision, queue counts, reviewer
|
|
126
|
+
evidence, selected PR or issue, and next action from the same metadata-only
|
|
127
|
+
policy engine as `code-mower controller run`. Local agents can
|
|
111
128
|
publish opt-in status cards by writing metadata-only JSON files to
|
|
112
129
|
`.code-mower/board/agents/*.json`; the Board redacts local paths by default and
|
|
113
130
|
does not upload those cards.
|
|
@@ -116,6 +133,12 @@ The local JSON contracts are documented in
|
|
|
116
133
|
When a team wants the same operator picture on CodeMower.com, run
|
|
117
134
|
`code-mower cloud board-snapshot --repo-slug OWNER/REPO --json` to inspect a
|
|
118
135
|
zero-report, metadata-only mirror event, then add `--yes` only after review.
|
|
136
|
+
The v1.0 supervised-pilot automation and event boundary is defined in
|
|
137
|
+
[Supervised Pilot Contract](docs/supervised-pilot-contract.md).
|
|
138
|
+
As that controller lands, `code-mower controller run --repo OWNER/REPO` is the
|
|
139
|
+
dry-run-first policy check: it selects the current dispatch/merge/owner-action
|
|
140
|
+
decision from metadata, can write a sanitized event with `--event-file`, and
|
|
141
|
+
does not mutate GitHub state.
|
|
119
142
|
|
|
120
143
|
## See The Value Shape First
|
|
121
144
|
|
|
@@ -152,14 +175,19 @@ after reinstalling, especially when switching between pipx and uv.
|
|
|
152
175
|
| B. Build loop in 30 minutes | You want builders plus an orchestrator pattern after the reviewer gate works. | Complete path A, then add the automation token, require `code-mower/gate` from Any source, enable repository auto-merge, prove the self-hosted Mac lane runner with `doctor --runner`, run `init --builders`, and dispatch the first issue. | [Build Loop In 30 Minutes](docs/build-loop-in-30-minutes.md) |
|
|
153
176
|
| C. Builder experiment | You want to compare authoring loops before trusting them broadly. | Use a work order or experiment spec, run `code-mower builder-experiment run` around an explicit command, then review the source-free `authoringRun` artifact and normal audit evidence. | [Builder Experiments](docs/builder-experiments.md) |
|
|
154
177
|
|
|
178
|
+
When you ask another agent to install, upgrade, orchestrate, build, or review,
|
|
179
|
+
start from the universal prompt in
|
|
180
|
+
[Orchestrator Prompt Pack](docs/orchestrator-prompt-pack.md). It makes the
|
|
181
|
+
agent report its actual host posture, exact installed version, doctor result,
|
|
182
|
+
Board URL, and any owner-only click-list before it mutates the repo.
|
|
183
|
+
|
|
155
184
|
The current package-index announcement entry point is the tagged
|
|
156
|
-
[Try Code Mower In 10 Minutes](https://github.com/codemower-ai/code-mower/blob/
|
|
157
|
-
guide. The
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
public package rather than a source checkout.
|
|
185
|
+
[Try Code Mower In 10 Minutes](https://github.com/codemower-ai/code-mower/blob/v1.0.0/docs/try-in-10-minutes.md)
|
|
186
|
+
guide. The v1.0 supervised-pilot release includes the native Board, the
|
|
187
|
+
controller dry-run and policy contract, adoption and upgrade hardening from
|
|
188
|
+
recent install rehearsals, package-index release checks, provider-diversity
|
|
189
|
+
fixtures, and the universal orchestrator prompt pack. Package-only users can
|
|
190
|
+
start from the public package rather than a source checkout.
|
|
163
191
|
|
|
164
192
|
## What Calibration Does And Does Not Prove
|
|
165
193
|
|
|
@@ -190,7 +218,7 @@ Provider-contract baseline for the next release train:
|
|
|
190
218
|
|
|
191
219
|
For release verification,
|
|
192
220
|
[First-User Install Rehearsal](docs/first-user-install-rehearsal.md) records
|
|
193
|
-
the package-index procedure for `
|
|
221
|
+
the package-index procedure for `v1.0.0` / `code-mower==1.0.0`. The
|
|
194
222
|
GitHub release records the workflow and rehearsal evidence for the exact tag.
|
|
195
223
|
|
|
196
224
|
## Optional: Plan Before Coding
|
|
@@ -338,8 +366,8 @@ The first recommended lanes are local/manual:
|
|
|
338
366
|
| Gitar | advisory third signal | informational until calibrated |
|
|
339
367
|
|
|
340
368
|
Everything else starts manual or informational until your own calibration data
|
|
341
|
-
proves it is useful: Antigravity/Gemini, Hermes, CodeRabbit CLI, Cursor
|
|
342
|
-
Qodo, Greptile, Devin, local LLMs, and future ACP bridges.
|
|
369
|
+
proves it is useful: Antigravity/Gemini, Muse, Hermes, CodeRabbit CLI, Cursor
|
|
370
|
+
BugBot, Qodo, Greptile, Devin, local LLMs, and future ACP bridges.
|
|
343
371
|
|
|
344
372
|
Gemini CLI and Antigravity are distinct lane ids even though both are Google
|
|
345
373
|
surfaces and may use Gemini model infrastructure. Keep their auth, model
|
|
@@ -376,8 +404,8 @@ measurement work.
|
|
|
376
404
|
|
|
377
405
|
## Installation Status
|
|
378
406
|
|
|
379
|
-
The current package-index
|
|
380
|
-
install spec `code-mower==0.
|
|
407
|
+
The current package-index release baseline is `v1.0.0`, with pinned package
|
|
408
|
+
install spec `code-mower==1.0.0`. Release evidence is recorded on the GitHub
|
|
381
409
|
release and in the first-user install rehearsal. The public repository is
|
|
382
410
|
[codemower-ai/code-mower](https://github.com/codemower-ai/code-mower), and
|
|
383
411
|
GitHub releases remain the auditable source for tags, build artifacts, and
|
|
@@ -442,6 +470,7 @@ first so local work exercises the same package entrypoint users install.
|
|
|
442
470
|
- [v0.6 Release Notes](docs/v06-release-notes.md)
|
|
443
471
|
- [v0.8 Release Notes](docs/v08-release-notes.md)
|
|
444
472
|
- [v0.9 Release Notes](docs/v09-release-notes.md)
|
|
473
|
+
- [v1.0 Release Notes](docs/v10-release-notes.md)
|
|
445
474
|
- [Post-v0.8 Effectiveness Assessment](docs/post-v08-effectiveness-assessment.md)
|
|
446
475
|
- [Demo Calibration Example](examples/demo-calibration/README.md)
|
|
447
476
|
- [Board Demo Rehearsal](examples/board-demo/README.md)
|
|
@@ -23,6 +23,8 @@ from urllib.parse import urlparse
|
|
|
23
23
|
|
|
24
24
|
from . import __version__ as CODE_MOWER_VERSION
|
|
25
25
|
from . import board_store
|
|
26
|
+
from . import config as code_mower_config
|
|
27
|
+
from . import controller
|
|
26
28
|
from . import lane_status
|
|
27
29
|
from . import reviewer_spend
|
|
28
30
|
|
|
@@ -199,6 +201,11 @@ def status_payload(
|
|
|
199
201
|
}
|
|
200
202
|
payload["agent_adapters"] = agent_adapters_payload(config)
|
|
201
203
|
payload["owner_queue"] = owner_queue_payload(payload)
|
|
204
|
+
payload["supervised_pilot"] = supervised_pilot_payload(
|
|
205
|
+
config,
|
|
206
|
+
payload,
|
|
207
|
+
gh_json_runner=gh_json_runner,
|
|
208
|
+
)
|
|
202
209
|
return payload
|
|
203
210
|
|
|
204
211
|
|
|
@@ -328,6 +335,183 @@ def owner_queue_payload(status: dict[str, Any]) -> dict[str, Any]:
|
|
|
328
335
|
}
|
|
329
336
|
|
|
330
337
|
|
|
338
|
+
def _supervised_disabled(message: str, *, cycle_state: str = "unavailable") -> dict[str, Any]:
|
|
339
|
+
return {
|
|
340
|
+
"schema": controller.SUPERVISED_PILOT_SCHEMA,
|
|
341
|
+
"enabled": False,
|
|
342
|
+
"cycle_state": cycle_state,
|
|
343
|
+
"controller_mode": "dry_run",
|
|
344
|
+
"decision": {},
|
|
345
|
+
"queue": {"active_lanes": {}, "metrics": {}, "ready_issue_errors": []},
|
|
346
|
+
"active_issues": [],
|
|
347
|
+
"active_prs": [],
|
|
348
|
+
"message": message,
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
|
|
352
|
+
def _supervised_cycle_state(decision_state: object) -> str:
|
|
353
|
+
state = str(decision_state or "")
|
|
354
|
+
if state == "no_work":
|
|
355
|
+
return "idle"
|
|
356
|
+
if state == "dispatch_builder":
|
|
357
|
+
return "dispatch"
|
|
358
|
+
if state == "ready_to_merge":
|
|
359
|
+
return "ready"
|
|
360
|
+
if state == "owner_action":
|
|
361
|
+
return "owner_action"
|
|
362
|
+
if state in {"blocked_audit", "failing_check", "not_mergeable"}:
|
|
363
|
+
return "blocked"
|
|
364
|
+
if state in {"stale_evidence", "draft_pr", "waiting_for_evidence"}:
|
|
365
|
+
return "waiting"
|
|
366
|
+
return "unknown"
|
|
367
|
+
|
|
368
|
+
|
|
369
|
+
def _safe_bool(value: object) -> bool:
|
|
370
|
+
return bool(value)
|
|
371
|
+
|
|
372
|
+
|
|
373
|
+
def _safe_reviewer_outcomes(value: object) -> list[dict[str, Any]]:
|
|
374
|
+
if not isinstance(value, list):
|
|
375
|
+
return []
|
|
376
|
+
outcomes = []
|
|
377
|
+
for item in value:
|
|
378
|
+
if not isinstance(item, Mapping):
|
|
379
|
+
continue
|
|
380
|
+
outcomes.append(
|
|
381
|
+
{
|
|
382
|
+
"lane_id": _safe_text(item.get("lane_id"), limit=60),
|
|
383
|
+
"config_lane_id": _safe_text(item.get("config_lane_id"), limit=80),
|
|
384
|
+
"verdict": _safe_text(item.get("verdict"), limit=20),
|
|
385
|
+
"promoted": _safe_bool(item.get("promoted")),
|
|
386
|
+
}
|
|
387
|
+
)
|
|
388
|
+
return outcomes
|
|
389
|
+
|
|
390
|
+
|
|
391
|
+
def _supervised_decision_payload(decision: Mapping[str, Any]) -> dict[str, Any]:
|
|
392
|
+
payload: dict[str, Any] = {
|
|
393
|
+
"decision_state": _safe_text(decision.get("decision_state"), limit=80),
|
|
394
|
+
"next_action": _safe_text(decision.get("next_action"), limit=160),
|
|
395
|
+
"next_detail": _safe_text(decision.get("next_detail"), limit=220),
|
|
396
|
+
"stop_condition": _safe_text(decision.get("stop_condition"), limit=80),
|
|
397
|
+
"owner_action_kind": _safe_text(decision.get("owner_action_kind"), limit=80),
|
|
398
|
+
"lane_id": _safe_text(decision.get("lane_id"), limit=60),
|
|
399
|
+
"gate_status": _safe_text(decision.get("gate_status"), limit=40),
|
|
400
|
+
"branch": _safe_text(decision.get("branch"), limit=160),
|
|
401
|
+
"author": _safe_text(decision.get("author"), limit=80),
|
|
402
|
+
"head_sha_prefix": _head_prefix(decision.get("head_sha_prefix")),
|
|
403
|
+
"merge_method": _safe_text(decision.get("merge_method"), limit=40),
|
|
404
|
+
"author_lane_excluded": _safe_bool(decision.get("author_lane_excluded")),
|
|
405
|
+
"promoted_reviewers_passed": _safe_bool(decision.get("promoted_reviewers_passed")),
|
|
406
|
+
"would_mutate": _safe_bool(decision.get("would_mutate")),
|
|
407
|
+
"reviewer_outcomes": _safe_reviewer_outcomes(decision.get("reviewer_outcomes")),
|
|
408
|
+
}
|
|
409
|
+
if pr_number := _int(decision.get("pr_number")):
|
|
410
|
+
payload["pr_number"] = pr_number
|
|
411
|
+
if issue_number := _int(decision.get("issue_number")):
|
|
412
|
+
payload["issue_number"] = issue_number
|
|
413
|
+
if pr_url := _http_url(decision.get("pr_url")):
|
|
414
|
+
payload["pr_url"] = pr_url
|
|
415
|
+
if issue_url := _http_url(decision.get("issue_url")):
|
|
416
|
+
payload["issue_url"] = issue_url
|
|
417
|
+
return {key: value for key, value in payload.items() if value not in (None, "", [])}
|
|
418
|
+
|
|
419
|
+
|
|
420
|
+
def _supervised_pr_payload(pr: Mapping[str, Any]) -> dict[str, Any]:
|
|
421
|
+
labels = pr.get("labels") if isinstance(pr.get("labels"), Mapping) else {}
|
|
422
|
+
payload: dict[str, Any] = {
|
|
423
|
+
"number": _int(pr.get("number")) or 0,
|
|
424
|
+
"title": _safe_text(pr.get("title"), limit=180),
|
|
425
|
+
"url": _http_url(pr.get("url")),
|
|
426
|
+
"branch": _safe_text(pr.get("branch"), limit=160),
|
|
427
|
+
"author": _safe_text(pr.get("author"), limit=80),
|
|
428
|
+
"updated_at": _safe_text(pr.get("updated_at"), limit=80),
|
|
429
|
+
"head_sha_prefix": _head_prefix(pr.get("head_sha")),
|
|
430
|
+
"merge_state": _safe_text(pr.get("merge_state"), limit=40),
|
|
431
|
+
"is_draft": _safe_bool(pr.get("is_draft")),
|
|
432
|
+
"stale": _safe_bool(pr.get("stale")),
|
|
433
|
+
"next_action": _safe_text(pr.get("next_action"), limit=160),
|
|
434
|
+
"next_detail": _safe_text(pr.get("next_detail"), limit=220),
|
|
435
|
+
"labels": labels,
|
|
436
|
+
}
|
|
437
|
+
return {key: value for key, value in payload.items() if value not in (None, "", [])}
|
|
438
|
+
|
|
439
|
+
|
|
440
|
+
def _supervised_issue_payload(issue: Mapping[str, Any]) -> dict[str, Any]:
|
|
441
|
+
payload: dict[str, Any] = {
|
|
442
|
+
"number": _int(issue.get("number")) or 0,
|
|
443
|
+
"url": _http_url(issue.get("url")),
|
|
444
|
+
"author": _safe_text(issue.get("author"), limit=80),
|
|
445
|
+
"updated_at": _safe_text(issue.get("updated_at"), limit=80),
|
|
446
|
+
"builder_lane": _safe_text(issue.get("builder_lane"), limit=60),
|
|
447
|
+
"assigned": _safe_bool(issue.get("assigned")),
|
|
448
|
+
"dispatched": _safe_bool(issue.get("dispatched")),
|
|
449
|
+
"owner_action": _safe_bool(issue.get("owner_action")),
|
|
450
|
+
"labels": [label for label in issue.get("labels") or [] if isinstance(label, str)][:20],
|
|
451
|
+
}
|
|
452
|
+
return {key: value for key, value in payload.items() if value not in (None, "", [])}
|
|
453
|
+
|
|
454
|
+
|
|
455
|
+
def supervised_pilot_payload(
|
|
456
|
+
config: BoardConfig,
|
|
457
|
+
status: dict[str, Any],
|
|
458
|
+
*,
|
|
459
|
+
gh_json_runner: lane_status.GitHubJsonRunner = lane_status.run_gh_json,
|
|
460
|
+
) -> dict[str, Any]:
|
|
461
|
+
config_path = Path(config.repo_path) / "code-mower.yml"
|
|
462
|
+
if not config_path.is_file():
|
|
463
|
+
return _supervised_disabled("code-mower.yml not found; supervised pilot state is unavailable")
|
|
464
|
+
try:
|
|
465
|
+
raw_config = code_mower_config.load_config(config_path)
|
|
466
|
+
issues = code_mower_config.validate_config(raw_config)
|
|
467
|
+
except (OSError, code_mower_config.ConfigError, ValueError):
|
|
468
|
+
return _supervised_disabled("could not read Code Mower config; run code-mower config validate")
|
|
469
|
+
if issues:
|
|
470
|
+
return _supervised_disabled("Code Mower config is invalid; run code-mower config validate")
|
|
471
|
+
|
|
472
|
+
remote = status.get("remote") if isinstance(status.get("remote"), Mapping) else {}
|
|
473
|
+
if remote.get("available"):
|
|
474
|
+
ready_issues = controller._collect_ready_issues( # noqa: SLF001 - shared package policy surface for Board.
|
|
475
|
+
repo=config.repo,
|
|
476
|
+
config=raw_config,
|
|
477
|
+
gh_json_runner=gh_json_runner,
|
|
478
|
+
issue_limit=min(config.pr_limit, 50),
|
|
479
|
+
)
|
|
480
|
+
else:
|
|
481
|
+
ready_issues = {"available": False, "errors": ["remote unavailable"], "issues": []}
|
|
482
|
+
|
|
483
|
+
report = controller.evaluate_controller_report(
|
|
484
|
+
status_report=status,
|
|
485
|
+
ready_issues=ready_issues,
|
|
486
|
+
config=raw_config,
|
|
487
|
+
options=controller.ControllerOptions(repo=config.repo, mode="dry_run", issue_limit=min(config.pr_limit, 50)),
|
|
488
|
+
)
|
|
489
|
+
decision = report.get("decision") if isinstance(report.get("decision"), Mapping) else {}
|
|
490
|
+
queue = report.get("queue") if isinstance(report.get("queue"), Mapping) else {}
|
|
491
|
+
raw_prs = remote.get("pull_requests") if isinstance(remote.get("pull_requests"), list) else []
|
|
492
|
+
issue_payload = ready_issues.get("issues") if isinstance(ready_issues.get("issues"), list) else []
|
|
493
|
+
return {
|
|
494
|
+
"schema": controller.SUPERVISED_PILOT_SCHEMA,
|
|
495
|
+
"enabled": True,
|
|
496
|
+
"cycle_state": _supervised_cycle_state(decision.get("decision_state")),
|
|
497
|
+
"controller_mode": report.get("mode") or "dry_run",
|
|
498
|
+
"generated_at": report.get("generated_at") or "",
|
|
499
|
+
"decision": _supervised_decision_payload(decision),
|
|
500
|
+
"queue": queue,
|
|
501
|
+
"active_issues": [
|
|
502
|
+
_supervised_issue_payload(issue)
|
|
503
|
+
for issue in issue_payload
|
|
504
|
+
if isinstance(issue, Mapping)
|
|
505
|
+
],
|
|
506
|
+
"active_prs": [
|
|
507
|
+
_supervised_pr_payload(pr)
|
|
508
|
+
for pr in raw_prs
|
|
509
|
+
if isinstance(pr, Mapping)
|
|
510
|
+
],
|
|
511
|
+
"message": "",
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
|
|
331
515
|
def _verdict_from_done_label(label: str) -> tuple[str, str] | None:
|
|
332
516
|
if label.endswith("-done"):
|
|
333
517
|
return label[: -len("-done")], "PASS"
|
|
@@ -652,6 +836,7 @@ def render_board_html(config: BoardConfig) -> str:
|
|
|
652
836
|
</header>
|
|
653
837
|
<main>
|
|
654
838
|
<div class="summary" id="summary"></div>
|
|
839
|
+
<section><h2>Supervised Pilot</h2><div class="rows" id="supervised"></div></section>
|
|
655
840
|
<section><h2>Owner Queue</h2><div class="rows" id="owner"></div></section>
|
|
656
841
|
<section><h2>Agent Cards</h2><div class="rows" id="agents"></div></section>
|
|
657
842
|
<section><h2>Open PRs</h2><div class="rows" id="prs"></div></section>
|
|
@@ -702,6 +887,12 @@ def render_board_html(config: BoardConfig) -> str:
|
|
|
702
887
|
const alerts = data.remote?.gate_health?.alerts || [];
|
|
703
888
|
const ownerQueue = data.owner_queue?.entries || [];
|
|
704
889
|
const agentCards = data.agent_adapters?.agents || [];
|
|
890
|
+
const supervised = data.supervised_pilot || {{}};
|
|
891
|
+
const supervisedDecision = supervised.decision || {{}};
|
|
892
|
+
const supervisedQueue = supervised.queue || {{}};
|
|
893
|
+
const supervisedMetrics = supervisedQueue.metrics || {{}};
|
|
894
|
+
const supervisedPRs = supervised.active_prs || [];
|
|
895
|
+
const supervisedIssues = supervised.active_issues || [];
|
|
705
896
|
const timelines = data.timelines || {{}};
|
|
706
897
|
const verdicts = timelines.verdicts?.entries || [];
|
|
707
898
|
const spend = timelines.spend || {{}};
|
|
@@ -711,10 +902,22 @@ def render_board_html(config: BoardConfig) -> str:
|
|
|
711
902
|
data.next_detail ? `<div class="metric"><span class="muted">Detail</span><b>${{esc(data.next_detail)}}</b></div>` : "",
|
|
712
903
|
`<div class="metric"><span class="muted">GitHub</span><b class="${{data.remote?.available ? "ok" : "warn"}}">${{data.remote?.available ? "available" : "unavailable"}}</b></div>`,
|
|
713
904
|
`<div class="metric"><span class="muted">Open PRs</span><b>${{prs.length}}</b></div>`,
|
|
905
|
+
`<div class="metric"><span class="muted">Pilot</span><b class="${{stateClass(supervised.cycle_state || "")}}">${{esc(supervised.cycle_state || "off")}}</b></div>`,
|
|
714
906
|
`<div class="metric"><span class="muted">Owner queue</span><b class="${{ownerQueue.length ? "warn" : "ok"}}">${{ownerQueue.length}}</b></div>`,
|
|
715
907
|
`<div class="metric"><span class="muted">Agent cards</span><b>${{agentCards.length}}</b></div>`,
|
|
716
908
|
`<div class="metric"><span class="muted">Gate alerts</span><b class="${{alerts.length ? "warn" : "ok"}}">${{alerts.length}}</b></div>`
|
|
717
909
|
].join(""));
|
|
910
|
+
const reviewerOutcomes = supervisedDecision.reviewer_outcomes || [];
|
|
911
|
+
const supervisedRows = supervised.enabled ? [
|
|
912
|
+
`<div class="row"><div class="line"><b class="${{stateClass(supervised.cycle_state)}}">${{esc(supervised.cycle_state || "unknown")}}</b>${{pill(supervised.controller_mode || "dry_run")}}${{supervisedDecision.decision_state ? pill(supervisedDecision.decision_state) : ""}}</div><div>next: <b>${{esc(supervisedDecision.next_action || "inspect")}}</b></div>${{supervisedDecision.next_detail ? `<div class="muted">${{esc(supervisedDecision.next_detail)}}</div>` : ""}}</div>`,
|
|
913
|
+
`<div class="row"><div class="line">${{pill(`open PRs ${{supervisedMetrics.open_pr_count ?? supervisedPRs.length}}`)}}${{pill(`ready issues ${{supervisedMetrics.ready_issue_count ?? supervisedIssues.length}}`)}}${{pill(`active lanes ${{supervisedMetrics.active_lane_count ?? 0}}`)}}${{pill(`stale ${{supervisedMetrics.stale_evidence_count ?? 0}}`)}}</div></div>`,
|
|
914
|
+
supervisedDecision.pr_number ? `<div class="row"><div class="line"><a href="${{esc(href(supervisedDecision.pr_url))}}">Selected PR #${{esc(supervisedDecision.pr_number)}}</a>${{supervisedDecision.lane_id ? pill(supervisedDecision.lane_id) : ""}}${{supervisedDecision.gate_status ? pill(`gate ${{supervisedDecision.gate_status}}`) : ""}}${{supervisedDecision.author_lane_excluded ? pill("author excluded") : ""}}</div><div class="muted">${{esc(supervisedDecision.branch || "")}}${{supervisedDecision.head_sha_prefix ? ` @ ${{esc(supervisedDecision.head_sha_prefix)}}` : ""}}</div></div>` : "",
|
|
915
|
+
supervisedDecision.issue_number ? `<div class="row"><div class="line"><a href="${{esc(href(supervisedDecision.issue_url))}}">Selected issue #${{esc(supervisedDecision.issue_number)}}</a>${{supervisedDecision.lane_id ? pill(supervisedDecision.lane_id) : ""}}</div></div>` : "",
|
|
916
|
+
reviewerOutcomes.length ? `<div class="row"><b>Reviewer Evidence</b><div class="muted">${{reviewerOutcomes.map(outcome => `${{esc(outcome.lane_id || outcome.config_lane_id)}}=${{esc(outcome.verdict)}}`).join(", ")}}</div></div>` : "",
|
|
917
|
+
supervisedIssues.length ? `<div class="row"><b>Ready Issues</b><div class="muted">${{supervisedIssues.slice(0, 5).map(issue => `#${{esc(issue.number)}} ${{esc(issue.builder_lane || "")}}`).join(", ")}}</div></div>` : "",
|
|
918
|
+
supervisedPRs.length ? `<div class="row"><b>Active PRs</b><div class="muted">${{supervisedPRs.slice(0, 5).map(pr => `#${{esc(pr.number)}} ${{esc(pr.merge_state || "")}}${{pr.stale ? " stale" : ""}}${{pr.is_draft ? " draft" : ""}}`).join(", ")}}</div></div>` : ""
|
|
919
|
+
].filter(Boolean).join("") : empty(supervised.message || "Supervised pilot state unavailable.");
|
|
920
|
+
put("supervised", supervisedRows || empty(supervised.message || "No supervised pilot activity."));
|
|
718
921
|
put("owner", ownerQueue.length ? ownerQueue.map(item => `<div class="row"><div class="line"><a href="${{esc(href(item.url))}}">#${{esc(item.pr_number)}} ${{esc(item.kind)}}</a>${{pill(item.next_action)}}${{pill(item.head_sha_prefix)}}</div><div class="muted">${{esc(item.branch)}} by ${{esc(item.author)}}${{item.updated_at ? ` updated ${{localTime(item.updated_at)}}` : ""}}</div></div>`).join("") : empty(data.owner_queue?.message || "No owner queue items."));
|
|
719
922
|
put("agents", agentCards.length ? agentCards.map(agent => `<div class="row"><div class="line"><b>${{esc(agent.provider)}}</b>${{pill(agent.role)}}${{pill(agent.status)}}${{agent.lane ? pill(agent.lane) : ""}}${{agent.pr_number ? pill(`#${{agent.pr_number}}`) : ""}}</div><div>${{esc(agent.title || agent.next_action || "local agent")}}</div><div class="muted">${{esc(agent.branch || agent.repo || "")}}${{agent.pid ? ` pid=${{esc(agent.pid)}}` : ""}}${{agent.cwd ? ` cwd=${{esc(agent.cwd)}}` : ""}}${{agent.updated_at ? ` updated ${{localTime(agent.updated_at)}}` : ""}}</div></div>`).join("") : empty(data.agent_adapters?.message || "No local agent adapter cards."));
|
|
720
923
|
put("prs", prs.length ? prs.map(pr => `<div class="row">
|
|
@@ -52,6 +52,7 @@ from . import coderabbit_cli_audit_pr
|
|
|
52
52
|
from . import codex_audit_env_preflight
|
|
53
53
|
from . import codex_audit_pr
|
|
54
54
|
from . import codex_audit_schema_smoke
|
|
55
|
+
from . import controller as code_mower_controller
|
|
55
56
|
from . import code_mower_calibration
|
|
56
57
|
from . import code_mower_context_packs
|
|
57
58
|
from . import code_mower_merge
|
|
@@ -70,6 +71,7 @@ from . import local_llm_bakeoff
|
|
|
70
71
|
from . import local_llm_calibration
|
|
71
72
|
from . import local_llm_profiles
|
|
72
73
|
from . import migration as code_mower_migration
|
|
74
|
+
from . import muse_cli_audit_pr
|
|
73
75
|
from . import next_steps as code_mower_next_steps
|
|
74
76
|
from . import package as code_mower_package
|
|
75
77
|
from . import prompts as code_mower_prompts
|
|
@@ -439,6 +441,7 @@ COMMAND_DESCRIPTIONS: dict[str, str] = {
|
|
|
439
441
|
"config": "Validate or inspect a Code Mower config.",
|
|
440
442
|
"context": "Record local external planning context manifests.",
|
|
441
443
|
"context-packs": "Build selective surrounding-file context packs.",
|
|
444
|
+
"controller": "Compute supervised-pilot dispatch and merge-policy decisions.",
|
|
442
445
|
"coderabbit-cli": "Run a CodeRabbit CLI informational lane.",
|
|
443
446
|
"codex-audit": "Run a Codex structured audit lane.",
|
|
444
447
|
"codex-audit-env-preflight": "Probe Codex audit environment setup.",
|
|
@@ -454,6 +457,7 @@ COMMAND_DESCRIPTIONS: dict[str, str] = {
|
|
|
454
457
|
"local-llm": "Probe and run local OpenAI-compatible model lanes.",
|
|
455
458
|
"migration": "Rehearse standalone package and wrapper migration paths.",
|
|
456
459
|
"merge-plan": "Inspect merge-readiness signals and lane labels.",
|
|
460
|
+
"muse-cli": "Run a Muse CLI structured audit lane.",
|
|
457
461
|
"next-steps": "Print the recommended next actions after setup.",
|
|
458
462
|
"package": "Build or inspect package extraction artifacts.",
|
|
459
463
|
"plan": "Create local issue-derived planning artifacts.",
|
|
@@ -478,6 +482,7 @@ FIRST_USER_COMMANDS = (
|
|
|
478
482
|
"reviewer-metrics",
|
|
479
483
|
"cloud",
|
|
480
484
|
"config",
|
|
485
|
+
"controller",
|
|
481
486
|
"lanes",
|
|
482
487
|
"project-context",
|
|
483
488
|
)
|
|
@@ -550,6 +555,7 @@ def _top_level_help(show_all: bool) -> str:
|
|
|
550
555
|
"Common first run:",
|
|
551
556
|
" code-mower init --easy",
|
|
552
557
|
" code-mower doctor --adoption --repo OWNER/REPO",
|
|
558
|
+
" code-mower doctor --supervised-pilot --repo OWNER/REPO",
|
|
553
559
|
" code-mower lanes status --repo OWNER/REPO",
|
|
554
560
|
" code-mower board serve --repo OWNER/REPO",
|
|
555
561
|
(
|
|
@@ -578,6 +584,7 @@ COMMAND_HANDLERS: dict[str, CommandHandler] = {
|
|
|
578
584
|
"config": _config_main,
|
|
579
585
|
"context": code_mower_work_orders.context_main,
|
|
580
586
|
"context-packs": code_mower_context_packs.main,
|
|
587
|
+
"controller": code_mower_controller.main,
|
|
581
588
|
"coderabbit-cli": coderabbit_cli_audit_pr.main,
|
|
582
589
|
"codex-audit": codex_audit_pr.main,
|
|
583
590
|
"codex-audit-env-preflight": codex_audit_env_preflight.main,
|
|
@@ -593,6 +600,7 @@ COMMAND_HANDLERS: dict[str, CommandHandler] = {
|
|
|
593
600
|
"local-llm": _local_llm_main,
|
|
594
601
|
"migration": code_mower_migration.main,
|
|
595
602
|
"merge-plan": code_mower_merge.main,
|
|
603
|
+
"muse-cli": muse_cli_audit_pr.main,
|
|
596
604
|
"next-steps": code_mower_next_steps.main,
|
|
597
605
|
"package": _package_main,
|
|
598
606
|
"plan": code_mower_work_orders.plan_main,
|
|
@@ -25,9 +25,13 @@ SAFE_EVENT_TYPES = {
|
|
|
25
25
|
"board_snapshot",
|
|
26
26
|
"builder_run",
|
|
27
27
|
"calibration_run",
|
|
28
|
+
"controller_decision",
|
|
28
29
|
"dogfood_upload",
|
|
29
30
|
"lane_policy_snapshot",
|
|
31
|
+
"merge_decision",
|
|
32
|
+
"owner_intervention",
|
|
30
33
|
"provider_catalog_snapshot",
|
|
34
|
+
"queue_state_snapshot",
|
|
31
35
|
"reviewer_run",
|
|
32
36
|
"value_report_snapshot",
|
|
33
37
|
"work_order",
|