code-mower 0.9.3b1__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.3b1 → code_mower-0.9.4b1}/PKG-INFO +10 -7
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/README.md +9 -6
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/pyproject.toml +1 -1
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/__init__.py +1 -1
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/calibration/arms.py +1 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/calibration/planning.py +1 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/cli.py +3 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/github.py +9 -1
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/github_branch.py +7 -1
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/github_human_token.py +25 -4
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/github_repo.py +26 -5
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/models.py +29 -3
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/output.py +13 -2
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/runner.py +1 -0
- code_mower-0.9.4b1/src/code_mower/lane_configs/muse_cli.py +35 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/migration.py +97 -8
- code_mower-0.9.4b1/src/code_mower/muse_cli_audit_pr.py +502 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/package_manifest.py +2 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/provider_registry.py +39 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/templates/code-mower.example.yml +38 -1
- {code_mower-0.9.3b1 → code_mower-0.9.4b1/src/code_mower}/templates/providers.yml +38 -1
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/templates/workflows/builder-provenance.yml.j2 +1 -1
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower.egg-info/PKG-INFO +10 -7
- {code_mower-0.9.3b1 → 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.3b1/src/code_mower → code_mower-0.9.4b1}/templates/providers.yml +38 -1
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/templates/workflows/builder-provenance.yml.j2 +1 -1
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_clear_stale.py +8 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_doctor_github_checks.py +85 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_doctor_output.py +35 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_provider_local_cli.py +214 -1
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_release_hygiene.py +171 -43
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/CODE_OF_CONDUCT.md +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/LICENSE +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/MANIFEST.in +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/NOTICE +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/SUPPORT.md +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/requirements/requirements.txt +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/setup.cfg +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/adapters/__init__.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/adapters/_base.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/adapters/cursor_bugbot.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/adapters/gitar.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/adapters/greptile.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/adapters/qodo.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/antigravity_cli_audit_pr.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/antigravity_sdk_probe.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/audit_handoff_log.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/audit_labeler_lib.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/audit_limits.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/audit_progress.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/blind_review_artifacts.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/blind_review_coordinator.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/board.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/board_store.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/bootstrap.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/builder_experiment.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/builder_runs.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/calibration/__init__.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/calibration/auto_discovery.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/calibration/commands.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/calibration/context_inputs.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/calibration/corpus.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/calibration/effect_report.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/calibration/evidence.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/calibration/evidence_report.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/calibration/identity.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/calibration/metrics.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/calibration/overlap.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/calibration/policy.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/calibration/results.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/calibration/run_results.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/calibration/run_status.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/calibration/runner.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/calibration/truth.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/calibration/value_report.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/checks.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/claude_audit_pr.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/claude_cli_bounce.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/claude_cli_environment.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/clear_stale.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/cloud.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/cloud_client/__init__.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/cloud_client/bundle.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/cloud_client/doctor.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/cloud_client/dogfood.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/cloud_client/endpoints.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/cloud_client/errors.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/cloud_client/events.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/cloud_client/export.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/cloud_client/git_metadata.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/cloud_client/manifest.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/cloud_client/operations.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/cloud_client/reports.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/cloud_client/setup.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/cloud_client/tokens.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/cloud_client/upload.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/code_mower_calibration.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/code_mower_context_packs.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/code_mower_merge.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/code_mower_telemetry.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/coderabbit_cli_audit_pr.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/codex_audit_env_preflight.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/codex_audit_pr.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/codex_audit_schema_smoke.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/codex_audit_verdict.schema.json +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/config.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/decisions.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/doctor.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/__init__.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/adoption.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/audit_limits.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/cloud.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/common.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/github_actions.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/github_actions_cost.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/github_actions_cost_summary.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/github_actions_failure_annotations.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/github_actions_failure_models.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/github_actions_failure_scan.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/github_actions_failure_selection.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/github_actions_failures.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/github_actions_permissions.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/github_api.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/github_config.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/github_provider.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/github_trusted_authors.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/groups.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/presets.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/privacy.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/provider_api_model.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/provider_api_model_openai.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/provider_api_model_profiles.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/provider_env.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/provider_env_required.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/provider_env_tokens.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/provider_local_audit_setup.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/provider_local_cli.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/provider_local_cli_commands.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/provider_local_cli_probe_config.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/provider_probe.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/provider_probe_auth.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/provider_probe_evaluation.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/provider_probe_json.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/provider_probe_remediation.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/provider_review_hygiene.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/providers.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/registry.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/runtime.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/runtime_github_auth.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/self_hosted_runner.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/gate_health.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/gemini_cli_audit_pr.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/git_identity.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/grok_build_audit_pr.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/hermes_cli_audit_pr.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/init.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/lane_configs/__init__.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/lane_configs/aider.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/lane_configs/antigravity_cli.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/lane_configs/claude.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/lane_configs/codex.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/lane_configs/devin.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/lane_configs/gemini_cli.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/lane_configs/grok_build.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/lane_configs/hermes_cli.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/lane_configs/local_llm.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/lane_status.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/local_llm_audit_pr.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/local_llm_bakeoff.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/local_llm_calibration.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/local_llm_profiles.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/migration_install.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/migration_mirror.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/migration_readiness.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/migration_rehearsal.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/next_steps.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/package.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/package_content.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/package_paths.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/package_rendering.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/package_static.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/plan_context.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/prompts.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/provider_runners/__init__.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/provider_runners/comments.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/provider_runners/exit_codes.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/provider_runners/git.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/provider_runners/github_auth.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/provider_runners/github_pr.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/provider_runners/pr_worktree.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/provider_runners/process.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/provider_runners/repo_paths.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/provider_runners/text_schema.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/provider_runners/verdict_artifacts.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/provider_runners/workspace.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/providers/__init__.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/providers/local_cli.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/providers/provenance.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/release_readiness.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/reviewer_metrics.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/reviewer_spend.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/saas_reviewer_labeler.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/secrets.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/templates/builder-experiment.example.json +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/templates/calibration-corpus.example.json +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/templates/calibration-corpus.json +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/templates/context-packs.example.json +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/templates/lane_prompts/base-audit.md +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/templates/lane_prompts/calibration-policy.md +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/templates/lane_prompts/context-driven-quality.md +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/templates/lane_prompts/docs-design.md +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/templates/lane_prompts/generic-programming.md +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/templates/lane_prompts/operability.md +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/templates/lane_prompts/package-runtime.md +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/templates/lane_prompts/plan-conformance.md +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/templates/lane_prompts/security-threat-model.md +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/templates/lanes/README.md +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/templates/lanes/claude.md +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/templates/lanes/codex.md +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/templates/lanes/cursor.md +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/templates/lanes/generic.md +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/templates/lanes/run_mac_lane.sh +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/templates/product-support/code_mower +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/templates/product-support/code_mower_standalone_pin.env +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/templates/product-support/code_mower_standalone_shadow.sh +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/templates/product-support/run_claude_audit_pr.sh +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/templates/product-support/run_codex_audit_pr.sh +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/templates/product-support/safe_gh_comment.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/templates/product-support/status_report.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/templates/reviewer-spend.example.json +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/templates/reviewer-value-report.example.md +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/templates/workflows/audit-label-cleanup.yml.j2 +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/templates/workflows/code-mower-agent-pr-labeler.yml.j2 +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/templates/workflows/code-mower-fix-round-dispatch.yml.j2 +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/templates/workflows/code-mower-gate-health.yml.j2 +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/templates/workflows/code-mower-gate.yml.j2 +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/templates/workflows/dispatch-lanes.yml.j2 +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/templates/workflows/hosted-bridge.yml.j2 +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/templates/workflows/lane-mac-runner.yml.j2 +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/templates/workflows/local-cli-audit.yml.j2 +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/templates/workflows/needs-owner-notify.yml.j2 +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/templates/workflows/private-standalone-shadow.yml.j2 +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/templates/workflows/review-clear-stale.yml.j2 +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/templates/workflows/saas-reviewer-labeler.yml.j2 +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/templates/workflows/self-hosted-local-audit.yml.j2 +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/templates/workflows/trailer-comment-labeler.yml.j2 +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/templates/workflows/weekly-status.yml.j2 +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/trailer_comment_labeler.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/versioning.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/work_orders.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/workflow_actionlint.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower.egg-info/dependency_links.txt +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower.egg-info/entry_points.txt +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower.egg-info/requires.txt +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower.egg-info/top_level.txt +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/templates/builder-experiment.example.json +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/templates/calibration-corpus.example.json +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/templates/calibration-corpus.json +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/templates/code-mower.yml.j2 +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/templates/context-packs.example.json +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/templates/cursor/BUGBOT.md +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/templates/lanes/README.md +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/templates/lanes/claude.md +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/templates/lanes/codex.md +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/templates/lanes/cursor.md +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/templates/lanes/generic.md +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/templates/lanes/run_mac_lane.sh +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/templates/providers/acp_bridge.yml +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/templates/providers/aider.yml +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/templates/providers/antigravity_cli.yml +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/templates/providers/claude_audit.yml +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/templates/providers/claude_review.yml +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/templates/providers/coderabbit_cli.yml +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/templates/providers/codex.yml +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/templates/providers/cursor_bugbot.yml +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/templates/providers/devin.yml +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/templates/providers/gemini_cli.yml +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/templates/providers/gitar.yml +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/templates/providers/greptile.yml +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/templates/providers/hermes_cli.yml +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/templates/providers/local_llm.yml +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/templates/providers/qodo.yml +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/templates/reviewer-spend.example.json +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/templates/reviewer-value-report.example.md +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/templates/workflows/audit-label-cleanup.yml.j2 +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/templates/workflows/blind-review-artifacts-dry-run.yml.j2 +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/templates/workflows/code-mower-agent-pr-labeler.yml.j2 +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/templates/workflows/code-mower-fix-round-dispatch.yml.j2 +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/templates/workflows/code-mower-gate-health.yml.j2 +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/templates/workflows/code-mower-gate.yml.j2 +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/templates/workflows/dispatch-lanes.yml.j2 +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/templates/workflows/hosted-bridge.yml.j2 +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/templates/workflows/lane-mac-runner.yml.j2 +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/templates/workflows/local-cli-audit.yml.j2 +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/templates/workflows/private-standalone-shadow.yml.j2 +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/templates/workflows/review-clear-stale.yml.j2 +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/templates/workflows/saas-reviewer-labeler.yml.j2 +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/templates/workflows/self-hosted-local-audit.yml.j2 +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/templates/workflows/trailer-comment-labeler.yml.j2 +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_antigravity_sdk_probe.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_audit_comment_posture.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_audit_limits.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_board.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_builder_experiment.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_builder_identity.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_builder_runs.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_calibration_effect_report.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_calibration_truth.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_checks.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_claude_audit_pr.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_claude_cli_bounce.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_cloud_client.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_cloud_git_metadata.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_cloud_manifest.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_cloud_reports.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_coderabbit_cli_audit_pr.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_codex_audit_env_preflight.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_codex_audit_pr.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_decision_audit_integration.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_decisions.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_doctor_actions_cost_summary.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_doctor_actions_failure_selection.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_doctor_boundaries.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_doctor_privacy.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_doctor_provider_env_required.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_doctor_provider_env_tokens.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_doctor_provider_local_audit_setup.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_doctor_provider_probe.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_doctor_provider_review_hygiene.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_doctor_registry.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_doctor_runtime.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_doctor_self_hosted_runner.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_gate_health.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_init_actionlint.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_init_build_loop.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_lane_status.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_local_llm_github_helpers.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_migration_setup_drift.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_plan_context.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_prompts.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_provider_fixture_contracts.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_provider_runners_comments.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_provider_runners_git.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_provider_runners_github_pr.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_provider_runners_pr_worktree.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_provider_runners_process.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_provider_runners_repo_paths.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_provider_runners_text_schema.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_provider_runners_workspace.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_reviewer_metrics_core.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_reviewer_spend.py +0 -0
- {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_trailer_comment_labeler.py +0 -0
- {code_mower-0.9.3b1 → 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.
|
|
@@ -170,7 +173,7 @@ after reinstalling, especially when switching between pipx and uv.
|
|
|
170
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) |
|
|
171
174
|
|
|
172
175
|
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/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)
|
|
174
177
|
guide. The v0.9 beta includes the completed native Board work plus the adoption
|
|
175
178
|
and upgrade hardening from recent install rehearsals; v0.9.3 keeps the path
|
|
176
179
|
smooth by clarifying starter-package diagnostics, surfacing richer top-level
|
|
@@ -207,7 +210,7 @@ Provider-contract baseline for the next release train:
|
|
|
207
210
|
|
|
208
211
|
For release verification,
|
|
209
212
|
[First-User Install Rehearsal](docs/first-user-install-rehearsal.md) records
|
|
210
|
-
the package-index procedure for `v0.9.
|
|
213
|
+
the package-index procedure for `v0.9.4-beta.1` / `code-mower==0.9.4b1`. The
|
|
211
214
|
GitHub release records the workflow and rehearsal evidence for the exact tag.
|
|
212
215
|
|
|
213
216
|
## Optional: Plan Before Coding
|
|
@@ -355,8 +358,8 @@ The first recommended lanes are local/manual:
|
|
|
355
358
|
| Gitar | advisory third signal | informational until calibrated |
|
|
356
359
|
|
|
357
360
|
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.
|
|
361
|
+
proves it is useful: Antigravity/Gemini, Muse, Hermes, CodeRabbit CLI, Cursor
|
|
362
|
+
BugBot, Qodo, Greptile, Devin, local LLMs, and future ACP bridges.
|
|
360
363
|
|
|
361
364
|
Gemini CLI and Antigravity are distinct lane ids even though both are Google
|
|
362
365
|
surfaces and may use Gemini model infrastructure. Keep their auth, model
|
|
@@ -393,8 +396,8 @@ measurement work.
|
|
|
393
396
|
|
|
394
397
|
## Installation Status
|
|
395
398
|
|
|
396
|
-
The current package-index beta baseline is `v0.9.
|
|
397
|
-
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
|
|
398
401
|
release and in the first-user install rehearsal. The public repository is
|
|
399
402
|
[codemower-ai/code-mower](https://github.com/codemower-ai/code-mower), and
|
|
400
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.
|
|
@@ -153,7 +156,7 @@ after reinstalling, especially when switching between pipx and uv.
|
|
|
153
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) |
|
|
154
157
|
|
|
155
158
|
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/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)
|
|
157
160
|
guide. The v0.9 beta includes the completed native Board work plus the adoption
|
|
158
161
|
and upgrade hardening from recent install rehearsals; v0.9.3 keeps the path
|
|
159
162
|
smooth by clarifying starter-package diagnostics, surfacing richer top-level
|
|
@@ -190,7 +193,7 @@ Provider-contract baseline for the next release train:
|
|
|
190
193
|
|
|
191
194
|
For release verification,
|
|
192
195
|
[First-User Install Rehearsal](docs/first-user-install-rehearsal.md) records
|
|
193
|
-
the package-index procedure for `v0.9.
|
|
196
|
+
the package-index procedure for `v0.9.4-beta.1` / `code-mower==0.9.4b1`. The
|
|
194
197
|
GitHub release records the workflow and rehearsal evidence for the exact tag.
|
|
195
198
|
|
|
196
199
|
## Optional: Plan Before Coding
|
|
@@ -338,8 +341,8 @@ The first recommended lanes are local/manual:
|
|
|
338
341
|
| Gitar | advisory third signal | informational until calibrated |
|
|
339
342
|
|
|
340
343
|
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.
|
|
344
|
+
proves it is useful: Antigravity/Gemini, Muse, Hermes, CodeRabbit CLI, Cursor
|
|
345
|
+
BugBot, Qodo, Greptile, Devin, local LLMs, and future ACP bridges.
|
|
343
346
|
|
|
344
347
|
Gemini CLI and Antigravity are distinct lane ids even though both are Google
|
|
345
348
|
surfaces and may use Gemini model infrastructure. Keep their auth, model
|
|
@@ -376,8 +379,8 @@ measurement work.
|
|
|
376
379
|
|
|
377
380
|
## Installation Status
|
|
378
381
|
|
|
379
|
-
The current package-index beta baseline is `v0.9.
|
|
380
|
-
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
|
|
381
384
|
release and in the first-user install rehearsal. The public repository is
|
|
382
385
|
[codemower-ai/code-mower](https://github.com/codemower-ai/code-mower), and
|
|
383
386
|
GitHub releases remain the auditable source for tags, build artifacts, and
|
|
@@ -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,
|
|
@@ -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.3b1 → 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
|
|
@@ -12,6 +12,17 @@ STATUS_PASS = "pass"
|
|
|
12
12
|
STATUS_WARN = "warn"
|
|
13
13
|
STATUS_FAIL = "fail"
|
|
14
14
|
STATUS_SKIP = "skip"
|
|
15
|
+
OWNER_ACTION_DETAIL_KEY = "owner_action"
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def is_owner_action_check(check: "DoctorCheck") -> bool:
|
|
19
|
+
"""Return true when a warning represents an explicit repo-owner action."""
|
|
20
|
+
|
|
21
|
+
return (
|
|
22
|
+
check.status == STATUS_WARN
|
|
23
|
+
and isinstance(check.detail, Mapping)
|
|
24
|
+
and bool(check.detail.get(OWNER_ACTION_DETAIL_KEY))
|
|
25
|
+
)
|
|
15
26
|
|
|
16
27
|
|
|
17
28
|
@dataclass(frozen=True)
|
|
@@ -47,13 +58,21 @@ class DoctorReport:
|
|
|
47
58
|
|
|
48
59
|
@property
|
|
49
60
|
def warnings(self) -> int:
|
|
50
|
-
return sum(
|
|
61
|
+
return sum(
|
|
62
|
+
1
|
|
63
|
+
for check in self.checks
|
|
64
|
+
if check.status == STATUS_WARN and not is_owner_action_check(check)
|
|
65
|
+
)
|
|
66
|
+
|
|
67
|
+
@property
|
|
68
|
+
def owner_actions(self) -> int:
|
|
69
|
+
return sum(1 for check in self.checks if is_owner_action_check(check))
|
|
51
70
|
|
|
52
71
|
@property
|
|
53
72
|
def status(self) -> str:
|
|
54
73
|
if self.failures:
|
|
55
74
|
return STATUS_FAIL
|
|
56
|
-
if self.warnings:
|
|
75
|
+
if self.warnings or self.owner_actions:
|
|
57
76
|
return STATUS_WARN
|
|
58
77
|
return STATUS_PASS
|
|
59
78
|
|
|
@@ -92,13 +111,19 @@ class DoctorReport:
|
|
|
92
111
|
if not group_checks:
|
|
93
112
|
continue
|
|
94
113
|
failures = sum(1 for check in group_checks if check.status == STATUS_FAIL)
|
|
95
|
-
|
|
114
|
+
owner_actions = sum(1 for check in group_checks if is_owner_action_check(check))
|
|
115
|
+
warnings = sum(
|
|
116
|
+
1
|
|
117
|
+
for check in group_checks
|
|
118
|
+
if check.status == STATUS_WARN and not is_owner_action_check(check)
|
|
119
|
+
)
|
|
96
120
|
skipped = sum(1 for check in group_checks if check.status == STATUS_SKIP)
|
|
97
121
|
summary[group_id] = {
|
|
98
122
|
"label": label,
|
|
99
123
|
"checks": len(group_checks),
|
|
100
124
|
"failures": failures,
|
|
101
125
|
"warnings": warnings,
|
|
126
|
+
"owner_actions": owner_actions,
|
|
102
127
|
"skipped": skipped,
|
|
103
128
|
}
|
|
104
129
|
return summary
|
|
@@ -114,6 +139,7 @@ class DoctorReport:
|
|
|
114
139
|
"checks": len(self.checks),
|
|
115
140
|
"failures": self.failures,
|
|
116
141
|
"warnings": self.warnings,
|
|
142
|
+
"owner_actions": self.owner_actions,
|
|
117
143
|
},
|
|
118
144
|
"run_plan": list(self.run_plan),
|
|
119
145
|
"groups": self.group_summary(),
|
|
@@ -8,6 +8,7 @@ from collections.abc import Iterable
|
|
|
8
8
|
from .groups import GROUP_LABELS, doctor_check_group_id
|
|
9
9
|
from .models import STATUS_FAIL, STATUS_SKIP, STATUS_WARN, DoctorCheck
|
|
10
10
|
from .models import DoctorReport
|
|
11
|
+
from .models import is_owner_action_check
|
|
11
12
|
|
|
12
13
|
|
|
13
14
|
def doctor_output_group(check: DoctorCheck) -> str:
|
|
@@ -29,6 +30,9 @@ def _format_status_summary(report: DoctorReport) -> str:
|
|
|
29
30
|
parts = [f"{len(report.checks)} total"]
|
|
30
31
|
if report.failures:
|
|
31
32
|
parts.append(f"{report.failures} failed")
|
|
33
|
+
owner_actions = report.owner_actions
|
|
34
|
+
if owner_actions:
|
|
35
|
+
parts.append(f"{owner_actions} owner actions")
|
|
32
36
|
if report.warnings:
|
|
33
37
|
parts.append(f"{report.warnings} warnings")
|
|
34
38
|
skipped = sum(1 for check in report.checks if check.status == STATUS_SKIP)
|
|
@@ -51,7 +55,8 @@ def _format_run_plan(report: DoctorReport) -> str | None:
|
|
|
51
55
|
|
|
52
56
|
def _format_check(check: DoctorCheck) -> list[str]:
|
|
53
57
|
lane = f" [{check.lane}]" if check.lane else ""
|
|
54
|
-
|
|
58
|
+
status = "OWNER-ACTION" if is_owner_action_check(check) else check.status.upper()
|
|
59
|
+
lines = [f"- {status} {check.name}{lane}: {check.message}"]
|
|
55
60
|
if check.remediation:
|
|
56
61
|
lines.append(f" remediation: {check.remediation}")
|
|
57
62
|
return lines
|
|
@@ -81,10 +86,16 @@ def render_doctor_text(report: DoctorReport) -> str:
|
|
|
81
86
|
if not checks:
|
|
82
87
|
continue
|
|
83
88
|
failed = sum(1 for check in checks if check.status == STATUS_FAIL)
|
|
84
|
-
|
|
89
|
+
owner_actions = sum(1 for check in checks if is_owner_action_check(check))
|
|
90
|
+
warnings = (
|
|
91
|
+
sum(1 for check in checks if check.status == STATUS_WARN)
|
|
92
|
+
- owner_actions
|
|
93
|
+
)
|
|
85
94
|
summary = []
|
|
86
95
|
if failed:
|
|
87
96
|
summary.append(f"{failed} failed")
|
|
97
|
+
if owner_actions:
|
|
98
|
+
summary.append(f"{owner_actions} owner actions")
|
|
88
99
|
if warnings:
|
|
89
100
|
summary.append(f"{warnings} warnings")
|
|
90
101
|
heading = GROUP_LABELS.get(group_id, group_id.title())
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import re
|
|
4
|
+
|
|
5
|
+
if __package__ and __package__.startswith("code_mower."):
|
|
6
|
+
from ..audit_labeler_lib import LaneConfig
|
|
7
|
+
else:
|
|
8
|
+
try:
|
|
9
|
+
from tools.audit_labeler_lib import LaneConfig
|
|
10
|
+
except ImportError: # pragma: no cover - direct `python tools/foo.py` execution
|
|
11
|
+
from audit_labeler_lib import LaneConfig
|
|
12
|
+
|
|
13
|
+
CONFIG = LaneConfig(
|
|
14
|
+
name="muse_cli",
|
|
15
|
+
display_name="Muse CLI",
|
|
16
|
+
needs_label="needs-muse-audit",
|
|
17
|
+
done_label="muse-audit-done",
|
|
18
|
+
blocked_label="muse-audit-blocked",
|
|
19
|
+
trailer_prefix="MUSE_AUDIT_STATE",
|
|
20
|
+
default_authors=("muse-cli-audit-bot", "muse-cli-audit-bot[bot]"),
|
|
21
|
+
authors_env_var="MUSE_CLI_BOT_AUTHORS",
|
|
22
|
+
pass_patterns=(
|
|
23
|
+
re.compile(
|
|
24
|
+
r"Muse(?: CLI)? Audit(?:\s+Result)?\s*[\u2014\u2013:-]\s*PASS\b",
|
|
25
|
+
flags=re.IGNORECASE,
|
|
26
|
+
),
|
|
27
|
+
),
|
|
28
|
+
blocked_patterns=(
|
|
29
|
+
re.compile(
|
|
30
|
+
r"Muse(?: CLI)? Audit(?:\s+Result)?\s*[\u2014\u2013:-]\s*(BLOCKED|BLOCKER|INCOMPLETE)\b",
|
|
31
|
+
flags=re.IGNORECASE,
|
|
32
|
+
),
|
|
33
|
+
),
|
|
34
|
+
token_env_vars=("MUSE_CLI_AUDIT_LABEL_TOKEN", "GITHUB_TOKEN"),
|
|
35
|
+
)
|