code-mower 0.9.2b1__tar.gz → 0.9.4b1__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.2b1 → code_mower-0.9.4b1}/PKG-INFO +18 -14
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/README.md +17 -13
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/pyproject.toml +1 -1
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/__init__.py +1 -1
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/board.py +27 -1
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/calibration/arms.py +1 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/calibration/planning.py +1 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/cli.py +3 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/__init__.py +5 -1
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/adoption.py +36 -5
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/github.py +9 -1
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/github_branch.py +7 -1
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/github_human_token.py +25 -4
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/github_repo.py +26 -5
- code_mower-0.9.4b1/src/code_mower/doctor_checks/github_trusted_authors.py +72 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/models.py +29 -3
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/output.py +13 -2
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/provider_review_hygiene.py +22 -10
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/providers.py +2 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/runner.py +20 -6
- code_mower-0.9.4b1/src/code_mower/lane_configs/muse_cli.py +35 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/lane_status.py +11 -6
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/migration.py +228 -6
- code_mower-0.9.4b1/src/code_mower/muse_cli_audit_pr.py +502 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/package_manifest.py +2 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/provider_registry.py +39 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/templates/code-mower.example.yml +38 -1
- {code_mower-0.9.2b1 → code_mower-0.9.4b1/src/code_mower}/templates/providers.yml +38 -1
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/templates/workflows/builder-provenance.yml.j2 +1 -1
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower.egg-info/PKG-INFO +18 -14
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower.egg-info/SOURCES.txt +3 -0
- code_mower-0.9.4b1/templates/providers/muse_cli.yml +35 -0
- {code_mower-0.9.2b1/src/code_mower → code_mower-0.9.4b1}/templates/providers.yml +38 -1
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/templates/workflows/builder-provenance.yml.j2 +1 -1
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/tests/test_board.py +13 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/tests/test_clear_stale.py +8 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/tests/test_doctor_github_checks.py +111 -1
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/tests/test_doctor_output.py +35 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/tests/test_doctor_provider_review_hygiene.py +22 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/tests/test_doctor_registry.py +84 -9
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/tests/test_lane_status.py +5 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/tests/test_provider_local_cli.py +214 -1
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/tests/test_release_hygiene.py +337 -35
- code_mower-0.9.2b1/src/code_mower/doctor_checks/github_trusted_authors.py +0 -38
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/CODE_OF_CONDUCT.md +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/LICENSE +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/MANIFEST.in +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/NOTICE +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/SUPPORT.md +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/requirements/requirements.txt +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/setup.cfg +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/adapters/__init__.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/adapters/_base.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/adapters/cursor_bugbot.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/adapters/gitar.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/adapters/greptile.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/adapters/qodo.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/antigravity_cli_audit_pr.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/antigravity_sdk_probe.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/audit_handoff_log.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/audit_labeler_lib.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/audit_limits.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/audit_progress.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/blind_review_artifacts.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/blind_review_coordinator.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/board_store.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/bootstrap.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/builder_experiment.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/builder_runs.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/calibration/__init__.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/calibration/auto_discovery.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/calibration/commands.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/calibration/context_inputs.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/calibration/corpus.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/calibration/effect_report.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/calibration/evidence.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/calibration/evidence_report.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/calibration/identity.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/calibration/metrics.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/calibration/overlap.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/calibration/policy.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/calibration/results.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/calibration/run_results.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/calibration/run_status.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/calibration/runner.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/calibration/truth.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/calibration/value_report.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/checks.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/claude_audit_pr.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/claude_cli_bounce.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/claude_cli_environment.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/clear_stale.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/cloud.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/cloud_client/__init__.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/cloud_client/bundle.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/cloud_client/doctor.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/cloud_client/dogfood.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/cloud_client/endpoints.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/cloud_client/errors.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/cloud_client/events.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/cloud_client/export.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/cloud_client/git_metadata.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/cloud_client/manifest.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/cloud_client/operations.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/cloud_client/reports.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/cloud_client/setup.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/cloud_client/tokens.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/cloud_client/upload.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/code_mower_calibration.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/code_mower_context_packs.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/code_mower_merge.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/code_mower_telemetry.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/coderabbit_cli_audit_pr.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/codex_audit_env_preflight.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/codex_audit_pr.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/codex_audit_schema_smoke.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/codex_audit_verdict.schema.json +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/config.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/decisions.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/doctor.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/audit_limits.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/cloud.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/common.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/github_actions.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/github_actions_cost.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/github_actions_cost_summary.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/github_actions_failure_annotations.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/github_actions_failure_models.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/github_actions_failure_scan.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/github_actions_failure_selection.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/github_actions_failures.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/github_actions_permissions.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/github_api.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/github_config.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/github_provider.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/groups.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/presets.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/privacy.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/provider_api_model.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/provider_api_model_openai.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/provider_api_model_profiles.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/provider_env.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/provider_env_required.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/provider_env_tokens.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/provider_local_audit_setup.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/provider_local_cli.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/provider_local_cli_commands.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/provider_local_cli_probe_config.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/provider_probe.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/provider_probe_auth.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/provider_probe_evaluation.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/provider_probe_json.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/provider_probe_remediation.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/registry.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/runtime.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/runtime_github_auth.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/self_hosted_runner.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/gate_health.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/gemini_cli_audit_pr.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/git_identity.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/grok_build_audit_pr.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/hermes_cli_audit_pr.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/init.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/lane_configs/__init__.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/lane_configs/aider.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/lane_configs/antigravity_cli.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/lane_configs/claude.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/lane_configs/codex.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/lane_configs/devin.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/lane_configs/gemini_cli.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/lane_configs/grok_build.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/lane_configs/hermes_cli.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/lane_configs/local_llm.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/local_llm_audit_pr.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/local_llm_bakeoff.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/local_llm_calibration.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/local_llm_profiles.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/migration_install.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/migration_mirror.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/migration_readiness.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/migration_rehearsal.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/next_steps.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/package.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/package_content.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/package_paths.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/package_rendering.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/package_static.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/plan_context.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/prompts.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/provider_runners/__init__.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/provider_runners/comments.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/provider_runners/exit_codes.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/provider_runners/git.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/provider_runners/github_auth.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/provider_runners/github_pr.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/provider_runners/pr_worktree.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/provider_runners/process.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/provider_runners/repo_paths.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/provider_runners/text_schema.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/provider_runners/verdict_artifacts.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/provider_runners/workspace.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/providers/__init__.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/providers/local_cli.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/providers/provenance.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/release_readiness.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/reviewer_metrics.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/reviewer_spend.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/saas_reviewer_labeler.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/secrets.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/templates/builder-experiment.example.json +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/templates/calibration-corpus.example.json +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/templates/calibration-corpus.json +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/templates/context-packs.example.json +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/templates/lane_prompts/base-audit.md +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/templates/lane_prompts/calibration-policy.md +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/templates/lane_prompts/context-driven-quality.md +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/templates/lane_prompts/docs-design.md +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/templates/lane_prompts/generic-programming.md +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/templates/lane_prompts/operability.md +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/templates/lane_prompts/package-runtime.md +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/templates/lane_prompts/plan-conformance.md +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/templates/lane_prompts/security-threat-model.md +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/templates/lanes/README.md +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/templates/lanes/claude.md +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/templates/lanes/codex.md +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/templates/lanes/cursor.md +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/templates/lanes/generic.md +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/templates/lanes/run_mac_lane.sh +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/templates/product-support/code_mower +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/templates/product-support/code_mower_standalone_pin.env +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/templates/product-support/code_mower_standalone_shadow.sh +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/templates/product-support/run_claude_audit_pr.sh +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/templates/product-support/run_codex_audit_pr.sh +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/templates/product-support/safe_gh_comment.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/templates/product-support/status_report.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/templates/reviewer-spend.example.json +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/templates/reviewer-value-report.example.md +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/templates/workflows/audit-label-cleanup.yml.j2 +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/templates/workflows/code-mower-agent-pr-labeler.yml.j2 +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/templates/workflows/code-mower-fix-round-dispatch.yml.j2 +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/templates/workflows/code-mower-gate-health.yml.j2 +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/templates/workflows/code-mower-gate.yml.j2 +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/templates/workflows/dispatch-lanes.yml.j2 +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/templates/workflows/hosted-bridge.yml.j2 +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/templates/workflows/lane-mac-runner.yml.j2 +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/templates/workflows/local-cli-audit.yml.j2 +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/templates/workflows/needs-owner-notify.yml.j2 +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/templates/workflows/private-standalone-shadow.yml.j2 +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/templates/workflows/review-clear-stale.yml.j2 +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/templates/workflows/saas-reviewer-labeler.yml.j2 +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/templates/workflows/self-hosted-local-audit.yml.j2 +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/templates/workflows/trailer-comment-labeler.yml.j2 +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/templates/workflows/weekly-status.yml.j2 +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/trailer_comment_labeler.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/versioning.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/work_orders.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/workflow_actionlint.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower.egg-info/dependency_links.txt +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower.egg-info/entry_points.txt +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower.egg-info/requires.txt +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower.egg-info/top_level.txt +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/templates/builder-experiment.example.json +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/templates/calibration-corpus.example.json +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/templates/calibration-corpus.json +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/templates/code-mower.yml.j2 +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/templates/context-packs.example.json +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/templates/cursor/BUGBOT.md +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/templates/lanes/README.md +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/templates/lanes/claude.md +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/templates/lanes/codex.md +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/templates/lanes/cursor.md +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/templates/lanes/generic.md +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/templates/lanes/run_mac_lane.sh +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/templates/providers/acp_bridge.yml +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/templates/providers/aider.yml +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/templates/providers/antigravity_cli.yml +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/templates/providers/claude_audit.yml +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/templates/providers/claude_review.yml +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/templates/providers/coderabbit_cli.yml +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/templates/providers/codex.yml +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/templates/providers/cursor_bugbot.yml +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/templates/providers/devin.yml +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/templates/providers/gemini_cli.yml +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/templates/providers/gitar.yml +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/templates/providers/greptile.yml +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/templates/providers/hermes_cli.yml +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/templates/providers/local_llm.yml +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/templates/providers/qodo.yml +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/templates/reviewer-spend.example.json +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/templates/reviewer-value-report.example.md +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/templates/workflows/audit-label-cleanup.yml.j2 +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/templates/workflows/blind-review-artifacts-dry-run.yml.j2 +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/templates/workflows/code-mower-agent-pr-labeler.yml.j2 +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/templates/workflows/code-mower-fix-round-dispatch.yml.j2 +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/templates/workflows/code-mower-gate-health.yml.j2 +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/templates/workflows/code-mower-gate.yml.j2 +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/templates/workflows/dispatch-lanes.yml.j2 +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/templates/workflows/hosted-bridge.yml.j2 +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/templates/workflows/lane-mac-runner.yml.j2 +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/templates/workflows/local-cli-audit.yml.j2 +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/templates/workflows/private-standalone-shadow.yml.j2 +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/templates/workflows/review-clear-stale.yml.j2 +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/templates/workflows/saas-reviewer-labeler.yml.j2 +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/templates/workflows/self-hosted-local-audit.yml.j2 +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/templates/workflows/trailer-comment-labeler.yml.j2 +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/tests/test_antigravity_sdk_probe.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/tests/test_audit_comment_posture.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/tests/test_audit_limits.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/tests/test_builder_experiment.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/tests/test_builder_identity.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/tests/test_builder_runs.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/tests/test_calibration_effect_report.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/tests/test_calibration_truth.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/tests/test_checks.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/tests/test_claude_audit_pr.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/tests/test_claude_cli_bounce.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/tests/test_cloud_client.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/tests/test_cloud_git_metadata.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/tests/test_cloud_manifest.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/tests/test_cloud_reports.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/tests/test_coderabbit_cli_audit_pr.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/tests/test_codex_audit_env_preflight.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/tests/test_codex_audit_pr.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/tests/test_decision_audit_integration.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/tests/test_decisions.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/tests/test_doctor_actions_cost_summary.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/tests/test_doctor_actions_failure_selection.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/tests/test_doctor_boundaries.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/tests/test_doctor_privacy.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/tests/test_doctor_provider_env_required.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/tests/test_doctor_provider_env_tokens.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/tests/test_doctor_provider_local_audit_setup.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/tests/test_doctor_provider_probe.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/tests/test_doctor_runtime.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/tests/test_doctor_self_hosted_runner.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/tests/test_gate_health.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/tests/test_init_actionlint.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/tests/test_init_build_loop.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/tests/test_local_llm_github_helpers.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/tests/test_migration_setup_drift.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/tests/test_plan_context.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/tests/test_prompts.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/tests/test_provider_fixture_contracts.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/tests/test_provider_runners_comments.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/tests/test_provider_runners_git.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/tests/test_provider_runners_github_pr.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/tests/test_provider_runners_pr_worktree.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/tests/test_provider_runners_process.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/tests/test_provider_runners_repo_paths.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/tests/test_provider_runners_text_schema.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/tests/test_provider_runners_workspace.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/tests/test_reviewer_metrics_core.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/tests/test_reviewer_spend.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/tests/test_trailer_comment_labeler.py +0 -0
- {code_mower-0.9.2b1 → code_mower-0.9.4b1}/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.9.
|
|
3
|
+
Version: 0.9.4b1
|
|
4
4
|
Summary: Multi-reviewer AI code audit orchestration
|
|
5
5
|
License-Expression: Apache-2.0
|
|
6
6
|
Requires-Python: >=3.12
|
|
@@ -95,6 +95,9 @@ wrappers, run `code-mower migration setup-drift --repo-path .` before copying a
|
|
|
95
95
|
fresh `.code-mower.generated` tree. It is read-only and reports path-level
|
|
96
96
|
classifications (`same`, `differs`, `new`, `repo-only`,
|
|
97
97
|
`missing-from-output`) without file contents or diffs.
|
|
98
|
+
If the repository already has builder or dispatch lanes, rerun setup drift with
|
|
99
|
+
the current builder set, for example `--builders codex,claude,cursor`, before
|
|
100
|
+
opening the reviewed upgrade PR.
|
|
98
101
|
Use [Upgrade An Existing Repository](docs/upgrade-existing-repo.md) for the
|
|
99
102
|
reviewed PR flow, repo-only file handling, builder identity checks, and
|
|
100
103
|
wrapper/pin drift checks.
|
|
@@ -113,8 +116,9 @@ Plain `board serve` is read-only. If the default Board port is busy, the CLI
|
|
|
113
116
|
uses a nearby free loopback port and prints the URL; an explicit `--port` stays
|
|
114
117
|
strict and reports a friendly conflict. To build local history while the browser
|
|
115
118
|
view is open, run `code-mower board serve --repo OWNER/REPO --record-events`; it
|
|
116
|
-
records at most one snapshot every 60 seconds by default.
|
|
117
|
-
|
|
119
|
+
records at most one snapshot every 60 seconds by default. The Board header shows
|
|
120
|
+
the Code Mower version serving the page and flags when a restart is needed after
|
|
121
|
+
an upgrade. To append one snapshot without serving the browser view, run
|
|
118
122
|
`code-mower board record --repo OWNER/REPO` from the repository checkout; it
|
|
119
123
|
writes metadata-only snapshots to `.code-mower/board/events.jsonl` with default
|
|
120
124
|
14-day and 500-event retention. `code-mower board events` prints recent stored
|
|
@@ -169,13 +173,13 @@ after reinstalling, especially when switching between pipx and uv.
|
|
|
169
173
|
| 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) |
|
|
170
174
|
|
|
171
175
|
The current package-index announcement entry point is the tagged
|
|
172
|
-
[Try Code Mower In 10 Minutes](https://github.com/codemower-ai/code-mower/blob/v0.9.
|
|
176
|
+
[Try Code Mower In 10 Minutes](https://github.com/codemower-ai/code-mower/blob/v0.9.4-beta.1/docs/try-in-10-minutes.md)
|
|
173
177
|
guide. The v0.9 beta includes the completed native Board work plus the adoption
|
|
174
|
-
and upgrade hardening from recent install rehearsals; v0.9.
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
178
|
+
and upgrade hardening from recent install rehearsals; v0.9.3 keeps the path
|
|
179
|
+
smooth by clarifying starter-package diagnostics, surfacing richer top-level
|
|
180
|
+
lane status detail, showing Board version drift, and reporting standalone pin
|
|
181
|
+
drift during existing-repo upgrades. Package-only users can start from the
|
|
182
|
+
public package rather than a source checkout.
|
|
179
183
|
|
|
180
184
|
## What Calibration Does And Does Not Prove
|
|
181
185
|
|
|
@@ -206,7 +210,7 @@ Provider-contract baseline for the next release train:
|
|
|
206
210
|
|
|
207
211
|
For release verification,
|
|
208
212
|
[First-User Install Rehearsal](docs/first-user-install-rehearsal.md) records
|
|
209
|
-
the package-index procedure for `v0.9.
|
|
213
|
+
the package-index procedure for `v0.9.4-beta.1` / `code-mower==0.9.4b1`. The
|
|
210
214
|
GitHub release records the workflow and rehearsal evidence for the exact tag.
|
|
211
215
|
|
|
212
216
|
## Optional: Plan Before Coding
|
|
@@ -354,8 +358,8 @@ The first recommended lanes are local/manual:
|
|
|
354
358
|
| Gitar | advisory third signal | informational until calibrated |
|
|
355
359
|
|
|
356
360
|
Everything else starts manual or informational until your own calibration data
|
|
357
|
-
proves it is useful: Antigravity/Gemini, Hermes, CodeRabbit CLI, Cursor
|
|
358
|
-
Qodo, Greptile, Devin, local LLMs, and future ACP bridges.
|
|
361
|
+
proves it is useful: Antigravity/Gemini, Muse, Hermes, CodeRabbit CLI, Cursor
|
|
362
|
+
BugBot, Qodo, Greptile, Devin, local LLMs, and future ACP bridges.
|
|
359
363
|
|
|
360
364
|
Gemini CLI and Antigravity are distinct lane ids even though both are Google
|
|
361
365
|
surfaces and may use Gemini model infrastructure. Keep their auth, model
|
|
@@ -392,8 +396,8 @@ measurement work.
|
|
|
392
396
|
|
|
393
397
|
## Installation Status
|
|
394
398
|
|
|
395
|
-
The current package-index beta baseline is `v0.9.
|
|
396
|
-
install spec `code-mower==0.9.
|
|
399
|
+
The current package-index beta baseline is `v0.9.4-beta.1`, with pinned package
|
|
400
|
+
install spec `code-mower==0.9.4b1`. Release evidence is recorded on the GitHub
|
|
397
401
|
release and in the first-user install rehearsal. The public repository is
|
|
398
402
|
[codemower-ai/code-mower](https://github.com/codemower-ai/code-mower), and
|
|
399
403
|
GitHub releases remain the auditable source for tags, build artifacts, and
|
|
@@ -78,6 +78,9 @@ wrappers, run `code-mower migration setup-drift --repo-path .` before copying a
|
|
|
78
78
|
fresh `.code-mower.generated` tree. It is read-only and reports path-level
|
|
79
79
|
classifications (`same`, `differs`, `new`, `repo-only`,
|
|
80
80
|
`missing-from-output`) without file contents or diffs.
|
|
81
|
+
If the repository already has builder or dispatch lanes, rerun setup drift with
|
|
82
|
+
the current builder set, for example `--builders codex,claude,cursor`, before
|
|
83
|
+
opening the reviewed upgrade PR.
|
|
81
84
|
Use [Upgrade An Existing Repository](docs/upgrade-existing-repo.md) for the
|
|
82
85
|
reviewed PR flow, repo-only file handling, builder identity checks, and
|
|
83
86
|
wrapper/pin drift checks.
|
|
@@ -96,8 +99,9 @@ Plain `board serve` is read-only. If the default Board port is busy, the CLI
|
|
|
96
99
|
uses a nearby free loopback port and prints the URL; an explicit `--port` stays
|
|
97
100
|
strict and reports a friendly conflict. To build local history while the browser
|
|
98
101
|
view is open, run `code-mower board serve --repo OWNER/REPO --record-events`; it
|
|
99
|
-
records at most one snapshot every 60 seconds by default.
|
|
100
|
-
|
|
102
|
+
records at most one snapshot every 60 seconds by default. The Board header shows
|
|
103
|
+
the Code Mower version serving the page and flags when a restart is needed after
|
|
104
|
+
an upgrade. To append one snapshot without serving the browser view, run
|
|
101
105
|
`code-mower board record --repo OWNER/REPO` from the repository checkout; it
|
|
102
106
|
writes metadata-only snapshots to `.code-mower/board/events.jsonl` with default
|
|
103
107
|
14-day and 500-event retention. `code-mower board events` prints recent stored
|
|
@@ -152,13 +156,13 @@ after reinstalling, especially when switching between pipx and uv.
|
|
|
152
156
|
| 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) |
|
|
153
157
|
|
|
154
158
|
The current package-index announcement entry point is the tagged
|
|
155
|
-
[Try Code Mower In 10 Minutes](https://github.com/codemower-ai/code-mower/blob/v0.9.
|
|
159
|
+
[Try Code Mower In 10 Minutes](https://github.com/codemower-ai/code-mower/blob/v0.9.4-beta.1/docs/try-in-10-minutes.md)
|
|
156
160
|
guide. The v0.9 beta includes the completed native Board work plus the adoption
|
|
157
|
-
and upgrade hardening from recent install rehearsals; v0.9.
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
161
|
+
and upgrade hardening from recent install rehearsals; v0.9.3 keeps the path
|
|
162
|
+
smooth by clarifying starter-package diagnostics, surfacing richer top-level
|
|
163
|
+
lane status detail, showing Board version drift, and reporting standalone pin
|
|
164
|
+
drift during existing-repo upgrades. Package-only users can start from the
|
|
165
|
+
public package rather than a source checkout.
|
|
162
166
|
|
|
163
167
|
## What Calibration Does And Does Not Prove
|
|
164
168
|
|
|
@@ -189,7 +193,7 @@ Provider-contract baseline for the next release train:
|
|
|
189
193
|
|
|
190
194
|
For release verification,
|
|
191
195
|
[First-User Install Rehearsal](docs/first-user-install-rehearsal.md) records
|
|
192
|
-
the package-index procedure for `v0.9.
|
|
196
|
+
the package-index procedure for `v0.9.4-beta.1` / `code-mower==0.9.4b1`. The
|
|
193
197
|
GitHub release records the workflow and rehearsal evidence for the exact tag.
|
|
194
198
|
|
|
195
199
|
## Optional: Plan Before Coding
|
|
@@ -337,8 +341,8 @@ The first recommended lanes are local/manual:
|
|
|
337
341
|
| Gitar | advisory third signal | informational until calibrated |
|
|
338
342
|
|
|
339
343
|
Everything else starts manual or informational until your own calibration data
|
|
340
|
-
proves it is useful: Antigravity/Gemini, Hermes, CodeRabbit CLI, Cursor
|
|
341
|
-
Qodo, Greptile, Devin, local LLMs, and future ACP bridges.
|
|
344
|
+
proves it is useful: Antigravity/Gemini, Muse, Hermes, CodeRabbit CLI, Cursor
|
|
345
|
+
BugBot, Qodo, Greptile, Devin, local LLMs, and future ACP bridges.
|
|
342
346
|
|
|
343
347
|
Gemini CLI and Antigravity are distinct lane ids even though both are Google
|
|
344
348
|
surfaces and may use Gemini model infrastructure. Keep their auth, model
|
|
@@ -375,8 +379,8 @@ measurement work.
|
|
|
375
379
|
|
|
376
380
|
## Installation Status
|
|
377
381
|
|
|
378
|
-
The current package-index beta baseline is `v0.9.
|
|
379
|
-
install spec `code-mower==0.9.
|
|
382
|
+
The current package-index beta baseline is `v0.9.4-beta.1`, with pinned package
|
|
383
|
+
install spec `code-mower==0.9.4b1`. Release evidence is recorded on the GitHub
|
|
380
384
|
release and in the first-user install rehearsal. The public repository is
|
|
381
385
|
[codemower-ai/code-mower](https://github.com/codemower-ai/code-mower), and
|
|
382
386
|
GitHub releases remain the auditable source for tags, build artifacts, and
|
|
@@ -15,11 +15,13 @@ from dataclasses import dataclass
|
|
|
15
15
|
from datetime import UTC, datetime
|
|
16
16
|
from http import HTTPStatus
|
|
17
17
|
from http.server import BaseHTTPRequestHandler, ThreadingHTTPServer
|
|
18
|
+
from importlib import metadata
|
|
18
19
|
from pathlib import Path
|
|
19
20
|
from threading import Lock
|
|
20
21
|
from typing import Any
|
|
21
22
|
from urllib.parse import urlparse
|
|
22
23
|
|
|
24
|
+
from . import __version__ as CODE_MOWER_VERSION
|
|
23
25
|
from . import board_store
|
|
24
26
|
from . import lane_status
|
|
25
27
|
from . import reviewer_spend
|
|
@@ -120,6 +122,22 @@ def _candidate_ports(config: BoardConfig) -> list[int]:
|
|
|
120
122
|
return list(range(config.port, last_port + 1))
|
|
121
123
|
|
|
122
124
|
|
|
125
|
+
def _installed_package_version() -> str:
|
|
126
|
+
try:
|
|
127
|
+
return metadata.version("code-mower")
|
|
128
|
+
except metadata.PackageNotFoundError:
|
|
129
|
+
return ""
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
def board_version_payload() -> dict[str, Any]:
|
|
133
|
+
installed_version = _installed_package_version()
|
|
134
|
+
return {
|
|
135
|
+
"serving_version": CODE_MOWER_VERSION,
|
|
136
|
+
"installed_version": installed_version,
|
|
137
|
+
"restart_recommended": bool(installed_version and installed_version != CODE_MOWER_VERSION),
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
|
|
123
141
|
def _explicit_port_conflict_message(host: str, port: int) -> str:
|
|
124
142
|
suggestions = list(range(port + 1, min(65535, port + 3) + 1))
|
|
125
143
|
suggestion_text = f" such as {', '.join(str(candidate) for candidate in suggestions)}" if suggestions else ""
|
|
@@ -171,6 +189,7 @@ def status_payload(
|
|
|
171
189
|
payload["board"] = {
|
|
172
190
|
"schema": "code_mower.board.v1",
|
|
173
191
|
"mode": "local_recording" if config.record_events else "local_read_only",
|
|
192
|
+
"version": board_version_payload(),
|
|
174
193
|
"refresh_seconds": config.refresh_seconds,
|
|
175
194
|
"local_paths": "shown" if config.show_local_paths else "redacted",
|
|
176
195
|
"recording": {
|
|
@@ -628,7 +647,7 @@ def render_board_html(config: BoardConfig) -> str:
|
|
|
628
647
|
</head>
|
|
629
648
|
<body>
|
|
630
649
|
<header>
|
|
631
|
-
<div><h1>Code Mower Board</h1><div class="muted" id="repo"></div></div>
|
|
650
|
+
<div><h1>Code Mower Board</h1><div class="muted" id="repo"></div><div class="muted" id="version"></div></div>
|
|
632
651
|
<div class="muted" id="generated">Loading...</div>
|
|
633
652
|
</header>
|
|
634
653
|
<main>
|
|
@@ -671,6 +690,12 @@ def render_board_html(config: BoardConfig) -> str:
|
|
|
671
690
|
}}
|
|
672
691
|
function render(data) {{
|
|
673
692
|
document.getElementById("repo").textContent = REPO;
|
|
693
|
+
const version = data.board?.version || {{}};
|
|
694
|
+
const servingVersion = version.serving_version || "unknown";
|
|
695
|
+
const installedVersion = version.installed_version || servingVersion;
|
|
696
|
+
document.getElementById("version").textContent = version.restart_recommended
|
|
697
|
+
? `serving ${{servingVersion}}; installed ${{installedVersion}} available after restart`
|
|
698
|
+
: `serving ${{servingVersion}}`;
|
|
674
699
|
document.getElementById("generated").innerHTML = data.generated_at ? `Generated ${{localTime(data.generated_at)}}` : "Loading...";
|
|
675
700
|
const prs = data.remote?.pull_requests || [];
|
|
676
701
|
const runs = data.remote?.workflow_runs || [];
|
|
@@ -683,6 +708,7 @@ def render_board_html(config: BoardConfig) -> str:
|
|
|
683
708
|
const spendGroups = spend.groups || [];
|
|
684
709
|
put("summary", [
|
|
685
710
|
`<div class="metric"><span class="muted">Next action</span><b>${{esc(data.next_action || "inspect")}}</b></div>`,
|
|
711
|
+
data.next_detail ? `<div class="metric"><span class="muted">Detail</span><b>${{esc(data.next_detail)}}</b></div>` : "",
|
|
686
712
|
`<div class="metric"><span class="muted">GitHub</span><b class="${{data.remote?.available ? "ok" : "warn"}}">${{data.remote?.available ? "available" : "unavailable"}}</b></div>`,
|
|
687
713
|
`<div class="metric"><span class="muted">Open PRs</span><b>${{prs.length}}</b></div>`,
|
|
688
714
|
`<div class="metric"><span class="muted">Owner queue</span><b class="${{ownerQueue.length ? "warn" : "ok"}}">${{ownerQueue.length}}</b></div>`,
|
|
@@ -70,6 +70,7 @@ from . import local_llm_bakeoff
|
|
|
70
70
|
from . import local_llm_calibration
|
|
71
71
|
from . import local_llm_profiles
|
|
72
72
|
from . import migration as code_mower_migration
|
|
73
|
+
from . import muse_cli_audit_pr
|
|
73
74
|
from . import next_steps as code_mower_next_steps
|
|
74
75
|
from . import package as code_mower_package
|
|
75
76
|
from . import prompts as code_mower_prompts
|
|
@@ -454,6 +455,7 @@ COMMAND_DESCRIPTIONS: dict[str, str] = {
|
|
|
454
455
|
"local-llm": "Probe and run local OpenAI-compatible model lanes.",
|
|
455
456
|
"migration": "Rehearse standalone package and wrapper migration paths.",
|
|
456
457
|
"merge-plan": "Inspect merge-readiness signals and lane labels.",
|
|
458
|
+
"muse-cli": "Run a Muse CLI structured audit lane.",
|
|
457
459
|
"next-steps": "Print the recommended next actions after setup.",
|
|
458
460
|
"package": "Build or inspect package extraction artifacts.",
|
|
459
461
|
"plan": "Create local issue-derived planning artifacts.",
|
|
@@ -593,6 +595,7 @@ COMMAND_HANDLERS: dict[str, CommandHandler] = {
|
|
|
593
595
|
"local-llm": _local_llm_main,
|
|
594
596
|
"migration": code_mower_migration.main,
|
|
595
597
|
"merge-plan": code_mower_merge.main,
|
|
598
|
+
"muse-cli": muse_cli_audit_pr.main,
|
|
596
599
|
"next-steps": code_mower_next_steps.main,
|
|
597
600
|
"package": _package_main,
|
|
598
601
|
"plan": code_mower_work_orders.plan_main,
|
|
@@ -32,7 +32,10 @@ from .github_human_token import (
|
|
|
32
32
|
human_automation_token_config,
|
|
33
33
|
human_automation_token_required,
|
|
34
34
|
)
|
|
35
|
-
from .github_trusted_authors import
|
|
35
|
+
from .github_trusted_authors import (
|
|
36
|
+
trusted_author_variable_probe,
|
|
37
|
+
trusted_author_variable_statuses,
|
|
38
|
+
)
|
|
36
39
|
from .groups import GROUP_LABELS, doctor_check_group_id
|
|
37
40
|
from .models import (
|
|
38
41
|
STATUS_FAIL,
|
|
@@ -113,6 +116,7 @@ __all__ = [
|
|
|
113
116
|
"check_macos_runner_launchagent",
|
|
114
117
|
"check_github_setup",
|
|
115
118
|
"check_human_automation_token",
|
|
119
|
+
"trusted_author_variable_probe",
|
|
116
120
|
"trusted_author_variable_statuses",
|
|
117
121
|
"check_repository_posture",
|
|
118
122
|
"check_lane_runtime",
|
|
@@ -170,7 +170,7 @@ def check_adoption_posture_guidance(
|
|
|
170
170
|
name="doctor.adoption.posture_hint",
|
|
171
171
|
status=STATUS_WARN,
|
|
172
172
|
message=(
|
|
173
|
-
"default reviewer-gate posture
|
|
173
|
+
"default reviewer-gate posture checks local reviewer CLIs on this host"
|
|
174
174
|
),
|
|
175
175
|
detail={
|
|
176
176
|
"adoption_posture": adoption_posture,
|
|
@@ -186,9 +186,12 @@ def check_adoption_posture_guidance(
|
|
|
186
186
|
],
|
|
187
187
|
},
|
|
188
188
|
remediation=(
|
|
189
|
-
"If this host only coordinates
|
|
190
|
-
"
|
|
191
|
-
"
|
|
189
|
+
"If this host only coordinates work, rerun "
|
|
190
|
+
"`code-mower doctor --adoption --orchestrator-only --repo OWNER/REPO`. "
|
|
191
|
+
"If it observes hosted builder lanes, rerun "
|
|
192
|
+
"`code-mower doctor --adoption --hosted-builders --repo OWNER/REPO`. "
|
|
193
|
+
"Only keep the default reviewer-gate posture on machines that "
|
|
194
|
+
"run local reviewer CLIs."
|
|
192
195
|
),
|
|
193
196
|
),
|
|
194
197
|
)
|
|
@@ -205,6 +208,7 @@ def check_adoption_setup(
|
|
|
205
208
|
config_source: str = "",
|
|
206
209
|
repo_root: Path | None = None,
|
|
207
210
|
trusted_author_variables: Mapping[str, str] | None = None,
|
|
211
|
+
trusted_author_variable_errors: Mapping[str, Any] | None = None,
|
|
208
212
|
) -> tuple[DoctorCheck, ...]:
|
|
209
213
|
"""Return first-run adoption posture checks."""
|
|
210
214
|
|
|
@@ -371,10 +375,16 @@ def check_adoption_setup(
|
|
|
371
375
|
}
|
|
372
376
|
if trusted_author_variables is not None:
|
|
373
377
|
variable_status = {
|
|
374
|
-
name: str(trusted_author_variables.get(name) or "
|
|
378
|
+
name: str(trusted_author_variables.get(name) or "not_confirmed")
|
|
375
379
|
for name in TRUSTED_AUDIT_AUTHOR_VARIABLES
|
|
376
380
|
}
|
|
377
381
|
trusted_detail["variable_status"] = variable_status
|
|
382
|
+
if trusted_author_variable_errors:
|
|
383
|
+
trusted_detail["variable_read_errors"] = {
|
|
384
|
+
name: trusted_author_variable_errors[name]
|
|
385
|
+
for name in sorted(trusted_author_variable_errors)
|
|
386
|
+
if name in TRUSTED_AUDIT_AUTHOR_VARIABLES
|
|
387
|
+
}
|
|
378
388
|
all_present = all(
|
|
379
389
|
variable_status[name] == "present" for name in TRUSTED_AUDIT_AUTHOR_VARIABLES
|
|
380
390
|
)
|
|
@@ -388,6 +398,27 @@ def check_adoption_setup(
|
|
|
388
398
|
)
|
|
389
399
|
)
|
|
390
400
|
return tuple(checks)
|
|
401
|
+
if any(
|
|
402
|
+
variable_status[name] == "not_confirmed"
|
|
403
|
+
for name in TRUSTED_AUDIT_AUTHOR_VARIABLES
|
|
404
|
+
):
|
|
405
|
+
checks.append(
|
|
406
|
+
DoctorCheck(
|
|
407
|
+
name="doctor.adoption.trusted_authors",
|
|
408
|
+
status=STATUS_WARN,
|
|
409
|
+
message=(
|
|
410
|
+
"trusted audit-comment author variables were not fully confirmed"
|
|
411
|
+
),
|
|
412
|
+
detail=trusted_detail,
|
|
413
|
+
remediation=(
|
|
414
|
+
"Ensure `gh auth status` can read repository Actions "
|
|
415
|
+
"variables for this repo, then set CLAUDE_AUDIT_BOT_AUTHORS "
|
|
416
|
+
"and CODEX_BOT_AUTHORS to the GitHub logins that may post "
|
|
417
|
+
"trusted audit verdicts."
|
|
418
|
+
),
|
|
419
|
+
)
|
|
420
|
+
)
|
|
421
|
+
return tuple(checks)
|
|
391
422
|
|
|
392
423
|
checks.append(
|
|
393
424
|
DoctorCheck(
|
|
@@ -36,6 +36,7 @@ def check_github_setup(
|
|
|
36
36
|
lanes: Sequence[tuple[str, Mapping[str, Any]]],
|
|
37
37
|
http_timeout: int,
|
|
38
38
|
actions_cost_sample: int = ACTIONS_COST_SAMPLE_DEFAULT,
|
|
39
|
+
adoption: bool = False,
|
|
39
40
|
adoption_posture: str = "reviewer-gate",
|
|
40
41
|
) -> list[DoctorCheck]:
|
|
41
42
|
checks: list[DoctorCheck] = []
|
|
@@ -127,6 +128,7 @@ def check_github_setup(
|
|
|
127
128
|
required_status_context=(
|
|
128
129
|
"code-mower/gate" if has_merge_authority else None
|
|
129
130
|
),
|
|
131
|
+
adoption=adoption,
|
|
130
132
|
),
|
|
131
133
|
check_recent_pr_diff_median(
|
|
132
134
|
gh_path=gh_path,
|
|
@@ -143,12 +145,18 @@ def check_github_setup(
|
|
|
143
145
|
config=config,
|
|
144
146
|
lanes=lanes,
|
|
145
147
|
http_timeout=http_timeout,
|
|
148
|
+
adoption=adoption,
|
|
146
149
|
adoption_posture=adoption_posture,
|
|
147
150
|
)
|
|
148
151
|
)
|
|
149
152
|
if has_merge_authority:
|
|
150
153
|
checks.append(
|
|
151
|
-
check_repo_auto_merge(
|
|
154
|
+
check_repo_auto_merge(
|
|
155
|
+
slug=slug,
|
|
156
|
+
repo_payload=metadata.payload,
|
|
157
|
+
adoption=adoption,
|
|
158
|
+
adoption_posture=adoption_posture,
|
|
159
|
+
)
|
|
152
160
|
)
|
|
153
161
|
|
|
154
162
|
provider_check = check_private_repo_provider_surface(
|
|
@@ -18,6 +18,7 @@ def check_branch_protection(
|
|
|
18
18
|
default_branch: str,
|
|
19
19
|
http_timeout: int,
|
|
20
20
|
required_status_context: str | None = None,
|
|
21
|
+
adoption: bool = False,
|
|
21
22
|
) -> DoctorCheck:
|
|
22
23
|
encoded_branch = urllib.parse.quote(default_branch, safe="")
|
|
23
24
|
protection_payload, protection_detail = _github_api_json(
|
|
@@ -77,9 +78,10 @@ def check_branch_protection(
|
|
|
77
78
|
if str(GITHUB_ACTIONS_APP_ID) in app_ids
|
|
78
79
|
else "a specific GitHub App"
|
|
79
80
|
)
|
|
81
|
+
status = STATUS_WARN if adoption else STATUS_FAIL
|
|
80
82
|
return DoctorCheck(
|
|
81
83
|
name="github.branch_protection",
|
|
82
|
-
status=
|
|
84
|
+
status=status,
|
|
83
85
|
message=(
|
|
84
86
|
f"{slug}@{default_branch} requires {required_status_context} "
|
|
85
87
|
f"from {source_description} instead of Any source"
|
|
@@ -87,6 +89,8 @@ def check_branch_protection(
|
|
|
87
89
|
detail={
|
|
88
90
|
"repo": slug,
|
|
89
91
|
"default_branch": default_branch,
|
|
92
|
+
"owner_action": adoption,
|
|
93
|
+
"owner_action_kind": "branch_protection_gate_binding",
|
|
90
94
|
"required_status_context": required_status_context,
|
|
91
95
|
"required_status_contexts": contexts,
|
|
92
96
|
"required_status_check_count": len(contexts),
|
|
@@ -110,6 +114,8 @@ def check_branch_protection(
|
|
|
110
114
|
detail={
|
|
111
115
|
"repo": slug,
|
|
112
116
|
"default_branch": default_branch,
|
|
117
|
+
"owner_action": adoption,
|
|
118
|
+
"owner_action_kind": "branch_protection_gate_requirement",
|
|
113
119
|
"required_status_context": required_status_context,
|
|
114
120
|
"required_status_check_count": len(contexts),
|
|
115
121
|
"required_status_contexts": contexts,
|
{code_mower-0.9.2b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/github_human_token.py
RENAMED
|
@@ -119,6 +119,7 @@ def check_human_automation_token(
|
|
|
119
119
|
config: Mapping[str, Any],
|
|
120
120
|
lanes: Sequence[tuple[str, Mapping[str, Any]]],
|
|
121
121
|
http_timeout: int,
|
|
122
|
+
adoption: bool = False,
|
|
122
123
|
adoption_posture: str = "reviewer-gate",
|
|
123
124
|
now: datetime | None = None,
|
|
124
125
|
) -> DoctorCheck:
|
|
@@ -146,7 +147,8 @@ def check_human_automation_token(
|
|
|
146
147
|
http_timeout=http_timeout,
|
|
147
148
|
)
|
|
148
149
|
if secret_payload is None:
|
|
149
|
-
status = _blocking_status_for_posture(adoption_posture)
|
|
150
|
+
status = STATUS_WARN if adoption else _blocking_status_for_posture(adoption_posture)
|
|
151
|
+
owner_action = status == STATUS_WARN
|
|
150
152
|
return DoctorCheck(
|
|
151
153
|
name="github.human_automation_token",
|
|
152
154
|
status=status,
|
|
@@ -158,7 +160,12 @@ def check_human_automation_token(
|
|
|
158
160
|
else ""
|
|
159
161
|
)
|
|
160
162
|
),
|
|
161
|
-
detail={
|
|
163
|
+
detail={
|
|
164
|
+
**detail,
|
|
165
|
+
"owner_action": owner_action,
|
|
166
|
+
"owner_action_kind": "human_automation_token",
|
|
167
|
+
"secret_check": secret_detail,
|
|
168
|
+
},
|
|
162
169
|
remediation=(
|
|
163
170
|
f"Create one human-owned fine-grained PAT secret with "
|
|
164
171
|
f"`gh secret set {secret_name}`. Grant repository Contents read, "
|
|
@@ -179,6 +186,8 @@ def check_human_automation_token(
|
|
|
179
186
|
message=f"{slug} is missing the {expires_var} human token expiry metadata",
|
|
180
187
|
detail={
|
|
181
188
|
**detail,
|
|
189
|
+
"owner_action": True,
|
|
190
|
+
"owner_action_kind": "human_automation_token_expiry",
|
|
182
191
|
"created_at": str(secret_payload.get("created_at") or ""),
|
|
183
192
|
"updated_at": str(secret_payload.get("updated_at") or ""),
|
|
184
193
|
"expiry_check": variable_detail,
|
|
@@ -210,7 +219,12 @@ def check_human_automation_token(
|
|
|
210
219
|
name="github.human_automation_token",
|
|
211
220
|
status=STATUS_WARN,
|
|
212
221
|
message=f"{slug} still has placeholder {expires_var} value",
|
|
213
|
-
detail={
|
|
222
|
+
detail={
|
|
223
|
+
**detail,
|
|
224
|
+
"owner_action": True,
|
|
225
|
+
"owner_action_kind": "human_automation_token_expiry",
|
|
226
|
+
"expires_at": expiry_text,
|
|
227
|
+
},
|
|
214
228
|
remediation=(
|
|
215
229
|
f"Set {expires_var} to the PAT expiry date in YYYY-MM-DD "
|
|
216
230
|
"format, or to `never` for a non-expiring PAT."
|
|
@@ -222,7 +236,12 @@ def check_human_automation_token(
|
|
|
222
236
|
name="github.human_automation_token",
|
|
223
237
|
status=STATUS_WARN,
|
|
224
238
|
message=f"{slug} has an invalid {expires_var} value",
|
|
225
|
-
detail={
|
|
239
|
+
detail={
|
|
240
|
+
**detail,
|
|
241
|
+
"owner_action": True,
|
|
242
|
+
"owner_action_kind": "human_automation_token_expiry",
|
|
243
|
+
"expires_at": expiry_text,
|
|
244
|
+
},
|
|
226
245
|
remediation=(
|
|
227
246
|
f"Set {expires_var} to the PAT expiry date in YYYY-MM-DD "
|
|
228
247
|
"format, or to `never` for a non-expiring PAT."
|
|
@@ -247,6 +266,8 @@ def check_human_automation_token(
|
|
|
247
266
|
),
|
|
248
267
|
detail={
|
|
249
268
|
**detail,
|
|
269
|
+
"owner_action": status != STATUS_PASS,
|
|
270
|
+
"owner_action_kind": "human_automation_token_expiry",
|
|
250
271
|
"created_at": str(secret_payload.get("created_at") or ""),
|
|
251
272
|
"updated_at": str(secret_payload.get("updated_at") or ""),
|
|
252
273
|
"expires_at": expiry.isoformat(),
|
|
@@ -5,7 +5,7 @@ from __future__ import annotations
|
|
|
5
5
|
from dataclasses import dataclass
|
|
6
6
|
from typing import Any, Mapping
|
|
7
7
|
|
|
8
|
-
from .common import DoctorCheck, STATUS_FAIL, STATUS_PASS, STATUS_WARN
|
|
8
|
+
from .common import DoctorCheck, OBSERVER_ADOPTION_POSTURES, STATUS_FAIL, STATUS_PASS, STATUS_WARN
|
|
9
9
|
from .github_api import _github_api_json
|
|
10
10
|
|
|
11
11
|
|
|
@@ -120,13 +120,23 @@ def check_repo_permissions(*, slug: str, repo_payload: Mapping[str, Any]) -> Doc
|
|
|
120
120
|
)
|
|
121
121
|
|
|
122
122
|
|
|
123
|
-
def check_repo_auto_merge(
|
|
123
|
+
def check_repo_auto_merge(
|
|
124
|
+
*,
|
|
125
|
+
slug: str,
|
|
126
|
+
repo_payload: Mapping[str, Any],
|
|
127
|
+
adoption: bool = False,
|
|
128
|
+
adoption_posture: str = "reviewer-gate",
|
|
129
|
+
) -> DoctorCheck:
|
|
124
130
|
if "allow_auto_merge" not in repo_payload:
|
|
125
131
|
return DoctorCheck(
|
|
126
132
|
name="github.repo.auto_merge",
|
|
127
133
|
status=STATUS_WARN,
|
|
128
134
|
message=f"{slug} metadata did not include auto-merge posture",
|
|
129
|
-
detail={
|
|
135
|
+
detail={
|
|
136
|
+
"repo": slug,
|
|
137
|
+
"owner_action": adoption,
|
|
138
|
+
"owner_action_kind": "repo_auto_merge_visibility",
|
|
139
|
+
},
|
|
130
140
|
remediation=(
|
|
131
141
|
"Verify repository auto-merge manually before relying on the "
|
|
132
142
|
"generated Code Mower gate to call enablePullRequestAutoMerge."
|
|
@@ -134,15 +144,26 @@ def check_repo_auto_merge(*, slug: str, repo_payload: Mapping[str, Any]) -> Doct
|
|
|
134
144
|
)
|
|
135
145
|
|
|
136
146
|
allow_auto_merge = bool(repo_payload.get("allow_auto_merge"))
|
|
147
|
+
blocked = (
|
|
148
|
+
not allow_auto_merge
|
|
149
|
+
and not adoption
|
|
150
|
+
and adoption_posture not in OBSERVER_ADOPTION_POSTURES
|
|
151
|
+
)
|
|
137
152
|
return DoctorCheck(
|
|
138
153
|
name="github.repo.auto_merge",
|
|
139
|
-
status=STATUS_PASS if allow_auto_merge else STATUS_FAIL,
|
|
154
|
+
status=STATUS_PASS if allow_auto_merge else (STATUS_FAIL if blocked else STATUS_WARN),
|
|
140
155
|
message=(
|
|
141
156
|
f"{slug} has auto-merge enabled"
|
|
142
157
|
if allow_auto_merge
|
|
143
158
|
else f"{slug} does not allow auto-merge"
|
|
144
159
|
),
|
|
145
|
-
detail={
|
|
160
|
+
detail={
|
|
161
|
+
"repo": slug,
|
|
162
|
+
"allow_auto_merge": allow_auto_merge,
|
|
163
|
+
"owner_action": not allow_auto_merge,
|
|
164
|
+
"owner_action_kind": "repo_auto_merge",
|
|
165
|
+
"adoption_posture": adoption_posture,
|
|
166
|
+
},
|
|
146
167
|
remediation=(
|
|
147
168
|
None
|
|
148
169
|
if allow_auto_merge
|