code-mower 0.5.0b52__tar.gz → 0.5.0b53__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.5.0b52 → code_mower-0.5.0b53}/PKG-INFO +14 -9
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/README.md +13 -8
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/pyproject.toml +1 -1
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/__init__.py +1 -1
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/cli.py +1 -1
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/init.py +116 -32
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/package_manifest.py +2 -2
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/release_readiness.py +5 -2
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/templates/code-mower.example.yml +8 -5
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/templates/workflows/builder-provenance.yml.j2 +1 -1
- {code_mower-0.5.0b52 → code_mower-0.5.0b53/src/code_mower}/templates/workflows/code-mower-fix-round-dispatch.yml.j2 +5 -1
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/templates/workflows/dispatch-lanes.yml.j2 +124 -123
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/versioning.py +6 -2
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower.egg-info/PKG-INFO +14 -9
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower.egg-info/SOURCES.txt +2 -2
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/templates/workflows/builder-provenance.yml.j2 +1 -1
- {code_mower-0.5.0b52/src/code_mower → code_mower-0.5.0b53}/templates/workflows/code-mower-fix-round-dispatch.yml.j2 +5 -1
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/templates/workflows/dispatch-lanes.yml.j2 +124 -123
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/tests/test_builder_identity.py +25 -2
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/tests/test_init_build_loop.py +24 -7
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/tests/test_release_hygiene.py +162 -42
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/CODE_OF_CONDUCT.md +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/LICENSE +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/MANIFEST.in +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/NOTICE +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/SUPPORT.md +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/requirements/requirements.txt +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/setup.cfg +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/adapters/__init__.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/adapters/_base.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/adapters/cursor_bugbot.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/adapters/gitar.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/adapters/greptile.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/adapters/qodo.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/antigravity_cli_audit_pr.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/audit_handoff_log.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/audit_labeler_lib.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/audit_limits.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/audit_progress.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/blind_review_artifacts.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/blind_review_coordinator.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/bootstrap.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/builder_experiment.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/builder_runs.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/calibration/__init__.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/calibration/arms.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/calibration/auto_discovery.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/calibration/commands.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/calibration/context_inputs.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/calibration/corpus.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/calibration/effect_report.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/calibration/evidence.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/calibration/evidence_report.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/calibration/identity.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/calibration/metrics.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/calibration/overlap.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/calibration/planning.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/calibration/policy.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/calibration/results.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/calibration/run_results.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/calibration/run_status.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/calibration/runner.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/calibration/truth.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/calibration/value_report.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/checks.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/claude_audit_pr.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/claude_cli_bounce.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/claude_cli_environment.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/clear_stale.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/cloud.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/cloud_client/__init__.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/cloud_client/bundle.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/cloud_client/doctor.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/cloud_client/dogfood.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/cloud_client/endpoints.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/cloud_client/errors.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/cloud_client/events.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/cloud_client/export.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/cloud_client/git_metadata.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/cloud_client/manifest.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/cloud_client/operations.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/cloud_client/reports.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/cloud_client/setup.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/cloud_client/upload.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/code_mower_calibration.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/code_mower_context_packs.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/code_mower_merge.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/code_mower_telemetry.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/coderabbit_cli_audit_pr.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/codex_audit_env_preflight.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/codex_audit_pr.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/codex_audit_schema_smoke.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/codex_audit_verdict.schema.json +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/config.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/decisions.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/doctor.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/doctor_checks/__init__.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/doctor_checks/audit_limits.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/doctor_checks/cloud.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/doctor_checks/common.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/doctor_checks/github.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/doctor_checks/github_actions.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/doctor_checks/github_actions_cost.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/doctor_checks/github_actions_cost_summary.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/doctor_checks/github_actions_failure_annotations.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/doctor_checks/github_actions_failure_models.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/doctor_checks/github_actions_failure_scan.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/doctor_checks/github_actions_failure_selection.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/doctor_checks/github_actions_failures.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/doctor_checks/github_actions_permissions.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/doctor_checks/github_api.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/doctor_checks/github_branch.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/doctor_checks/github_config.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/doctor_checks/github_human_token.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/doctor_checks/github_provider.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/doctor_checks/github_repo.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/doctor_checks/groups.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/doctor_checks/models.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/doctor_checks/output.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/doctor_checks/presets.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/doctor_checks/privacy.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/doctor_checks/provider_api_model.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/doctor_checks/provider_api_model_openai.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/doctor_checks/provider_api_model_profiles.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/doctor_checks/provider_env.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/doctor_checks/provider_env_required.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/doctor_checks/provider_env_tokens.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/doctor_checks/provider_local_audit_setup.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/doctor_checks/provider_local_cli.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/doctor_checks/provider_local_cli_commands.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/doctor_checks/provider_local_cli_probe_config.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/doctor_checks/provider_probe.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/doctor_checks/provider_probe_auth.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/doctor_checks/provider_probe_evaluation.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/doctor_checks/provider_probe_json.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/doctor_checks/provider_probe_remediation.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/doctor_checks/provider_review_hygiene.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/doctor_checks/providers.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/doctor_checks/registry.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/doctor_checks/runner.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/doctor_checks/runtime.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/doctor_checks/runtime_github_auth.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/doctor_checks/self_hosted_runner.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/gate_health.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/gemini_cli_audit_pr.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/grok_build_audit_pr.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/hermes_cli_audit_pr.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/lane_configs/__init__.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/lane_configs/aider.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/lane_configs/antigravity_cli.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/lane_configs/claude.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/lane_configs/codex.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/lane_configs/devin.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/lane_configs/gemini_cli.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/lane_configs/grok_build.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/lane_configs/hermes_cli.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/lane_configs/local_llm.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/local_llm_audit_pr.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/local_llm_bakeoff.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/local_llm_calibration.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/local_llm_profiles.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/migration.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/migration_install.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/migration_mirror.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/migration_readiness.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/migration_rehearsal.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/next_steps.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/package.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/package_content.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/package_paths.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/package_rendering.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/package_static.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/plan_context.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/prompts.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/provider_registry.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/provider_runners/__init__.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/provider_runners/comments.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/provider_runners/git.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/provider_runners/github_auth.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/provider_runners/github_pr.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/provider_runners/pr_worktree.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/provider_runners/process.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/provider_runners/repo_paths.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/provider_runners/text_schema.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/provider_runners/verdict_artifacts.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/provider_runners/workspace.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/providers/__init__.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/providers/local_cli.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/providers/provenance.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/reviewer_metrics.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/reviewer_spend.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/saas_reviewer_labeler.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/secrets.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/templates/builder-experiment.example.json +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/templates/calibration-corpus.example.json +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/templates/calibration-corpus.json +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/templates/context-packs.example.json +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/templates/lane_prompts/base-audit.md +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/templates/lane_prompts/calibration-policy.md +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/templates/lane_prompts/context-driven-quality.md +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/templates/lane_prompts/docs-design.md +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/templates/lane_prompts/generic-programming.md +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/templates/lane_prompts/operability.md +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/templates/lane_prompts/package-runtime.md +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/templates/lane_prompts/plan-conformance.md +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/templates/lane_prompts/security-threat-model.md +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/templates/lanes/README.md +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/templates/lanes/claude.md +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/templates/lanes/codex.md +0 -0
- /code_mower-0.5.0b52/src/code_mower/templates/lanes/grok.md → /code_mower-0.5.0b53/src/code_mower/templates/lanes/cursor.md +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/templates/lanes/generic.md +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/templates/lanes/run_mac_lane.sh +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/templates/product-support/code_mower +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/templates/product-support/code_mower_standalone_pin.env +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/templates/product-support/code_mower_standalone_shadow.sh +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/templates/product-support/run_claude_audit_pr.sh +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/templates/product-support/run_codex_audit_pr.sh +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/templates/product-support/safe_gh_comment.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/templates/product-support/status_report.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/templates/providers.yml +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/templates/reviewer-spend.example.json +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/templates/reviewer-value-report.example.md +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/templates/workflows/audit-label-cleanup.yml.j2 +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/templates/workflows/code-mower-agent-pr-labeler.yml.j2 +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/templates/workflows/code-mower-gate-health.yml.j2 +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/templates/workflows/code-mower-gate.yml.j2 +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/templates/workflows/hosted-bridge.yml.j2 +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/templates/workflows/lane-mac-runner.yml.j2 +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/templates/workflows/local-cli-audit.yml.j2 +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/templates/workflows/needs-owner-notify.yml.j2 +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/templates/workflows/private-standalone-shadow.yml.j2 +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/templates/workflows/review-clear-stale.yml.j2 +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/templates/workflows/saas-reviewer-labeler.yml.j2 +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/templates/workflows/self-hosted-local-audit.yml.j2 +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/templates/workflows/trailer-comment-labeler.yml.j2 +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/templates/workflows/weekly-status.yml.j2 +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/trailer_comment_labeler.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/work_orders.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/workflow_actionlint.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower.egg-info/dependency_links.txt +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower.egg-info/entry_points.txt +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower.egg-info/requires.txt +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower.egg-info/top_level.txt +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/templates/builder-experiment.example.json +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/templates/calibration-corpus.example.json +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/templates/calibration-corpus.json +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/templates/code-mower.yml.j2 +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/templates/context-packs.example.json +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/templates/cursor/BUGBOT.md +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/templates/lanes/README.md +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/templates/lanes/claude.md +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/templates/lanes/codex.md +0 -0
- /code_mower-0.5.0b52/templates/lanes/grok.md → /code_mower-0.5.0b53/templates/lanes/cursor.md +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/templates/lanes/generic.md +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/templates/lanes/run_mac_lane.sh +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/templates/providers/acp_bridge.yml +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/templates/providers/aider.yml +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/templates/providers/antigravity_cli.yml +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/templates/providers/claude_audit.yml +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/templates/providers/claude_review.yml +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/templates/providers/coderabbit_cli.yml +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/templates/providers/codex.yml +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/templates/providers/cursor_bugbot.yml +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/templates/providers/devin.yml +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/templates/providers/gemini_cli.yml +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/templates/providers/gitar.yml +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/templates/providers/greptile.yml +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/templates/providers/hermes_cli.yml +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/templates/providers/local_llm.yml +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/templates/providers/qodo.yml +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/templates/providers.yml +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/templates/reviewer-spend.example.json +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/templates/reviewer-value-report.example.md +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/templates/workflows/audit-label-cleanup.yml.j2 +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/templates/workflows/blind-review-artifacts-dry-run.yml.j2 +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/templates/workflows/code-mower-agent-pr-labeler.yml.j2 +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/templates/workflows/code-mower-gate-health.yml.j2 +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/templates/workflows/code-mower-gate.yml.j2 +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/templates/workflows/hosted-bridge.yml.j2 +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/templates/workflows/lane-mac-runner.yml.j2 +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/templates/workflows/local-cli-audit.yml.j2 +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/templates/workflows/private-standalone-shadow.yml.j2 +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/templates/workflows/review-clear-stale.yml.j2 +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/templates/workflows/saas-reviewer-labeler.yml.j2 +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/templates/workflows/self-hosted-local-audit.yml.j2 +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/templates/workflows/trailer-comment-labeler.yml.j2 +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/tests/test_audit_comment_posture.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/tests/test_audit_limits.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/tests/test_builder_runs.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/tests/test_calibration_effect_report.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/tests/test_calibration_truth.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/tests/test_checks.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/tests/test_claude_audit_pr.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/tests/test_claude_cli_bounce.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/tests/test_clear_stale.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/tests/test_cloud_client.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/tests/test_cloud_git_metadata.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/tests/test_cloud_manifest.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/tests/test_cloud_reports.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/tests/test_coderabbit_cli_audit_pr.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/tests/test_codex_audit_env_preflight.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/tests/test_codex_audit_pr.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/tests/test_decision_audit_integration.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/tests/test_decisions.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/tests/test_doctor_actions_cost_summary.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/tests/test_doctor_actions_failure_selection.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/tests/test_doctor_boundaries.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/tests/test_doctor_github_checks.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/tests/test_doctor_output.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/tests/test_doctor_privacy.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/tests/test_doctor_provider_env_required.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/tests/test_doctor_provider_env_tokens.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/tests/test_doctor_provider_local_audit_setup.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/tests/test_doctor_provider_probe.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/tests/test_doctor_provider_review_hygiene.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/tests/test_doctor_registry.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/tests/test_doctor_runtime.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/tests/test_doctor_self_hosted_runner.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/tests/test_gate_health.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/tests/test_init_actionlint.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/tests/test_local_llm_github_helpers.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/tests/test_plan_context.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/tests/test_prompts.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/tests/test_provider_local_cli.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/tests/test_provider_runners_comments.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/tests/test_provider_runners_git.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/tests/test_provider_runners_github_pr.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/tests/test_provider_runners_pr_worktree.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/tests/test_provider_runners_process.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/tests/test_provider_runners_repo_paths.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/tests/test_provider_runners_text_schema.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/tests/test_provider_runners_workspace.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/tests/test_reviewer_metrics_core.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/tests/test_reviewer_spend.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/tests/test_trailer_comment_labeler.py +0 -0
- {code_mower-0.5.0b52 → code_mower-0.5.0b53}/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.5.
|
|
3
|
+
Version: 0.5.0b53
|
|
4
4
|
Summary: Multi-reviewer AI code audit orchestration
|
|
5
5
|
License-Expression: Apache-2.0
|
|
6
6
|
Requires-Python: >=3.11
|
|
@@ -109,8 +109,8 @@ Choose one path. Each path has one guide and gets to one visible outcome.
|
|
|
109
109
|
| A. Reviewer gate in 10 minutes | You want one audited PR before recurring workflows or builder dispatch. | Install, run `init --easy`, run `doctor --preflight`, open a small setup PR, run Codex and Claude audits, then merge manually when the audit evidence is clean. | [Try Code Mower In 10 Minutes](docs/try-in-10-minutes.md) |
|
|
110
110
|
| B. Build loop in 30 minutes | You want builders plus an orchestrator pattern after the reviewer gate works. | Complete path A, then add the automation token, require `code-mower/gate` from Any source, enable repository auto-merge, prove the self-hosted Mac lane runner with `doctor --runner`, run `init --builders`, and dispatch the first issue. | [Build Loop In 30 Minutes](docs/build-loop-in-30-minutes.md) |
|
|
111
111
|
|
|
112
|
-
The beta.
|
|
113
|
-
[Try Code Mower In 10 Minutes](https://github.com/codemower-ai/code-mower/blob/v0.5.0-beta.
|
|
112
|
+
The beta.53 announcement entry point is the tagged
|
|
113
|
+
[Try Code Mower In 10 Minutes](https://github.com/codemower-ai/code-mower/blob/v0.5.0-beta.53/docs/try-in-10-minutes.md)
|
|
114
114
|
guide.
|
|
115
115
|
|
|
116
116
|
## What Calibration Does And Does Not Prove
|
|
@@ -136,9 +136,12 @@ every disposition before using it for lane promotion or merge policy.
|
|
|
136
136
|
Full walkthrough: [docs/try-in-10-minutes.md](docs/try-in-10-minutes.md).
|
|
137
137
|
First-time command map: [docs/launch-command-surface.md](docs/launch-command-surface.md).
|
|
138
138
|
|
|
139
|
-
The
|
|
139
|
+
The beta.53 package-index release is prepared:
|
|
140
140
|
[First-User Install Rehearsal](docs/first-user-install-rehearsal.md) records
|
|
141
|
-
the
|
|
141
|
+
the release procedure. It is to be published and rehearsed as part of the
|
|
142
|
+
`v0.5.0-beta.53` release execution, with evidence recorded on the release after
|
|
143
|
+
the workflow runs complete. The latest completed public-package rehearsal
|
|
144
|
+
remains beta.52: 10/10 first-user readiness for `code-mower==0.5.0b52`.
|
|
142
145
|
|
|
143
146
|
## Optional: Plan Before Coding
|
|
144
147
|
|
|
@@ -302,9 +305,11 @@ measurement work.
|
|
|
302
305
|
|
|
303
306
|
## Installation Status
|
|
304
307
|
|
|
305
|
-
The
|
|
306
|
-
[codemower-ai/code-mower](https://github.com/codemower-ai/code-mower)
|
|
307
|
-
as `
|
|
308
|
+
The prepared public beta is `v0.5.0-beta.53` from
|
|
309
|
+
[codemower-ai/code-mower](https://github.com/codemower-ai/code-mower). It is to
|
|
310
|
+
be published and rehearsed as part of the `v0.5.0-beta.53` release execution,
|
|
311
|
+
with evidence recorded on the release after the workflow runs complete. The
|
|
312
|
+
pinned package-index install spec is `code-mower==0.5.0b53`.
|
|
308
313
|
GitHub releases remain the auditable source for tags, build artifacts, and
|
|
309
314
|
release notes.
|
|
310
315
|
|
|
@@ -351,7 +356,7 @@ The wrapper resolves Python 3.12+ and refuses stale or old system Python shims.
|
|
|
351
356
|
- [Lane Standing Instructions](docs/lanes/README.md)
|
|
352
357
|
- [Codex Lane Standing Instructions](docs/lanes/codex.md)
|
|
353
358
|
- [Claude Lane Standing Instructions](docs/lanes/claude.md)
|
|
354
|
-
- [Cursor Hosted Lane Standing Instructions](docs/lanes/
|
|
359
|
+
- [Cursor Hosted Lane Standing Instructions](docs/lanes/cursor.md)
|
|
355
360
|
- [Provider Matrix](docs/provider-matrix.md)
|
|
356
361
|
- [GitHub Setup](docs/github-setup.md)
|
|
357
362
|
- [First Run Transcript](docs/first-run-transcript.md)
|
|
@@ -94,8 +94,8 @@ Choose one path. Each path has one guide and gets to one visible outcome.
|
|
|
94
94
|
| A. Reviewer gate in 10 minutes | You want one audited PR before recurring workflows or builder dispatch. | Install, run `init --easy`, run `doctor --preflight`, open a small setup PR, run Codex and Claude audits, then merge manually when the audit evidence is clean. | [Try Code Mower In 10 Minutes](docs/try-in-10-minutes.md) |
|
|
95
95
|
| B. Build loop in 30 minutes | You want builders plus an orchestrator pattern after the reviewer gate works. | Complete path A, then add the automation token, require `code-mower/gate` from Any source, enable repository auto-merge, prove the self-hosted Mac lane runner with `doctor --runner`, run `init --builders`, and dispatch the first issue. | [Build Loop In 30 Minutes](docs/build-loop-in-30-minutes.md) |
|
|
96
96
|
|
|
97
|
-
The beta.
|
|
98
|
-
[Try Code Mower In 10 Minutes](https://github.com/codemower-ai/code-mower/blob/v0.5.0-beta.
|
|
97
|
+
The beta.53 announcement entry point is the tagged
|
|
98
|
+
[Try Code Mower In 10 Minutes](https://github.com/codemower-ai/code-mower/blob/v0.5.0-beta.53/docs/try-in-10-minutes.md)
|
|
99
99
|
guide.
|
|
100
100
|
|
|
101
101
|
## What Calibration Does And Does Not Prove
|
|
@@ -121,9 +121,12 @@ every disposition before using it for lane promotion or merge policy.
|
|
|
121
121
|
Full walkthrough: [docs/try-in-10-minutes.md](docs/try-in-10-minutes.md).
|
|
122
122
|
First-time command map: [docs/launch-command-surface.md](docs/launch-command-surface.md).
|
|
123
123
|
|
|
124
|
-
The
|
|
124
|
+
The beta.53 package-index release is prepared:
|
|
125
125
|
[First-User Install Rehearsal](docs/first-user-install-rehearsal.md) records
|
|
126
|
-
the
|
|
126
|
+
the release procedure. It is to be published and rehearsed as part of the
|
|
127
|
+
`v0.5.0-beta.53` release execution, with evidence recorded on the release after
|
|
128
|
+
the workflow runs complete. The latest completed public-package rehearsal
|
|
129
|
+
remains beta.52: 10/10 first-user readiness for `code-mower==0.5.0b52`.
|
|
127
130
|
|
|
128
131
|
## Optional: Plan Before Coding
|
|
129
132
|
|
|
@@ -287,9 +290,11 @@ measurement work.
|
|
|
287
290
|
|
|
288
291
|
## Installation Status
|
|
289
292
|
|
|
290
|
-
The
|
|
291
|
-
[codemower-ai/code-mower](https://github.com/codemower-ai/code-mower)
|
|
292
|
-
as `
|
|
293
|
+
The prepared public beta is `v0.5.0-beta.53` from
|
|
294
|
+
[codemower-ai/code-mower](https://github.com/codemower-ai/code-mower). It is to
|
|
295
|
+
be published and rehearsed as part of the `v0.5.0-beta.53` release execution,
|
|
296
|
+
with evidence recorded on the release after the workflow runs complete. The
|
|
297
|
+
pinned package-index install spec is `code-mower==0.5.0b53`.
|
|
293
298
|
GitHub releases remain the auditable source for tags, build artifacts, and
|
|
294
299
|
release notes.
|
|
295
300
|
|
|
@@ -336,7 +341,7 @@ The wrapper resolves Python 3.12+ and refuses stale or old system Python shims.
|
|
|
336
341
|
- [Lane Standing Instructions](docs/lanes/README.md)
|
|
337
342
|
- [Codex Lane Standing Instructions](docs/lanes/codex.md)
|
|
338
343
|
- [Claude Lane Standing Instructions](docs/lanes/claude.md)
|
|
339
|
-
- [Cursor Hosted Lane Standing Instructions](docs/lanes/
|
|
344
|
+
- [Cursor Hosted Lane Standing Instructions](docs/lanes/cursor.md)
|
|
340
345
|
- [Provider Matrix](docs/provider-matrix.md)
|
|
341
346
|
- [GitHub Setup](docs/github-setup.md)
|
|
342
347
|
- [First Run Transcript](docs/first-run-transcript.md)
|
|
@@ -14,7 +14,7 @@ from pathlib import Path
|
|
|
14
14
|
if __package__ in {None, ""}:
|
|
15
15
|
raise SystemExit(
|
|
16
16
|
"code_mower.cli is a packaged entrypoint. Install Code Mower with "
|
|
17
|
-
"`pipx install code-mower==0.5.
|
|
17
|
+
"`pipx install code-mower==0.5.0b53`, or run source checkouts with "
|
|
18
18
|
"`PYTHONPATH=src python -m code_mower.cli`."
|
|
19
19
|
)
|
|
20
20
|
|
|
@@ -102,19 +102,25 @@ LANE_STANDING_README_PATH = "docs/lanes/README.md"
|
|
|
102
102
|
LANE_STANDING_README_TEMPLATE = "templates/lanes/README.md"
|
|
103
103
|
BUILDER_LANE_NAME_RE = re.compile(r"^[A-Za-z0-9][A-Za-z0-9_-]*$")
|
|
104
104
|
BUILDER_ALIAS_TO_LANE = {
|
|
105
|
-
"cursor": "
|
|
106
|
-
"grok": "
|
|
107
|
-
"grok-bot": "
|
|
105
|
+
"cursor": "cursor",
|
|
106
|
+
"grok": "cursor",
|
|
107
|
+
"grok-bot": "cursor",
|
|
108
|
+
}
|
|
109
|
+
BUILDER_LEGACY_BUILDER_LABELS = {
|
|
110
|
+
"cursor": ("builder:grok-bot",),
|
|
111
|
+
}
|
|
112
|
+
BUILDER_LEGACY_DISPATCH_LABELS = {
|
|
113
|
+
"cursor": ("dispatched:grok-bot",),
|
|
108
114
|
}
|
|
109
115
|
BUILDER_DEFAULT_MENTIONS = {
|
|
110
116
|
"claude": "Claude lane -",
|
|
111
117
|
"codex": "@codex",
|
|
112
|
-
"
|
|
118
|
+
"cursor": "@cursor",
|
|
113
119
|
}
|
|
114
120
|
BUILDER_DEFAULT_DOC_SLUGS = {
|
|
115
121
|
"claude": "claude",
|
|
116
122
|
"codex": "codex",
|
|
117
|
-
"
|
|
123
|
+
"cursor": "cursor",
|
|
118
124
|
}
|
|
119
125
|
MAC_RUNNER_BUILDER_LANES = {"claude", "codex"}
|
|
120
126
|
|
|
@@ -895,7 +901,7 @@ def _builder_doc_slug(builder_lane: str) -> str:
|
|
|
895
901
|
return BUILDER_DEFAULT_DOC_SLUGS.get(builder_lane, builder_lane)
|
|
896
902
|
|
|
897
903
|
|
|
898
|
-
def _builder_mention(builder_lane: str, fix_round_rules: Sequence[Mapping[str,
|
|
904
|
+
def _builder_mention(builder_lane: str, fix_round_rules: Sequence[Mapping[str, Any]]) -> str:
|
|
899
905
|
for rule in fix_round_rules:
|
|
900
906
|
if str(rule.get("builder_lane") or "") == builder_lane:
|
|
901
907
|
mention = str(rule.get("mention") or "").strip()
|
|
@@ -924,22 +930,26 @@ def _builder_dispatch_lane_entries(
|
|
|
924
930
|
builder_lanes: Sequence[str],
|
|
925
931
|
audit_lanes: Sequence[Mapping[str, str]],
|
|
926
932
|
author_exclusion: Mapping[str, Any],
|
|
927
|
-
fix_round_rules: Sequence[Mapping[str,
|
|
928
|
-
) -> tuple[dict[str,
|
|
933
|
+
fix_round_rules: Sequence[Mapping[str, Any]],
|
|
934
|
+
) -> tuple[dict[str, Any], ...]:
|
|
929
935
|
labels_by_lane = _builder_labels_by_lane(author_exclusion)
|
|
930
|
-
entries: list[dict[str,
|
|
936
|
+
entries: list[dict[str, Any]] = []
|
|
931
937
|
for builder_lane in builder_lanes:
|
|
932
938
|
doc_slug = _builder_doc_slug(builder_lane)
|
|
933
939
|
audit_labels = _builder_audit_need_labels(builder_lane, audit_lanes)
|
|
934
940
|
doc_template_slug = (
|
|
935
941
|
doc_slug if builder_lane in BUILDER_DEFAULT_DOC_SLUGS else "generic"
|
|
936
942
|
)
|
|
943
|
+
builder_label = labels_by_lane.get(builder_lane) or f"builder:{builder_lane}"
|
|
944
|
+
dispatch_label = f"dispatched:{builder_lane}"
|
|
937
945
|
entries.append(
|
|
938
946
|
{
|
|
939
947
|
"lane": builder_lane,
|
|
940
948
|
"display_name": _display_name(builder_lane),
|
|
941
|
-
"builder_label":
|
|
942
|
-
"
|
|
949
|
+
"builder_label": builder_label,
|
|
950
|
+
"builder_labels": list(_builder_label_aliases(author_exclusion, builder_lane)),
|
|
951
|
+
"dispatch_label": dispatch_label,
|
|
952
|
+
"dispatch_labels": list(_builder_dispatch_label_aliases(builder_lane)),
|
|
943
953
|
"mention": _builder_mention(builder_lane, fix_round_rules),
|
|
944
954
|
"doc": f"lanes/{doc_slug}.md",
|
|
945
955
|
"doc_target": f"docs/lanes/{doc_slug}.md",
|
|
@@ -964,7 +974,7 @@ def _build_loop_trusted_authors(
|
|
|
964
974
|
|
|
965
975
|
|
|
966
976
|
def _dispatch_lanes_workflow_entry(
|
|
967
|
-
builder_entries: Sequence[Mapping[str,
|
|
977
|
+
builder_entries: Sequence[Mapping[str, Any]],
|
|
968
978
|
owner_surface: Mapping[str, str],
|
|
969
979
|
*,
|
|
970
980
|
decision_authorities: Sequence[str] = (),
|
|
@@ -1176,15 +1186,25 @@ def _gate_lane_entry(lane_id: str, lane: Mapping[str, Any]) -> dict[str, Any]:
|
|
|
1176
1186
|
}
|
|
1177
1187
|
|
|
1178
1188
|
|
|
1179
|
-
def _identity_section(
|
|
1189
|
+
def _identity_section(
|
|
1190
|
+
raw_identity: Mapping[str, Any],
|
|
1191
|
+
section: str,
|
|
1192
|
+
*,
|
|
1193
|
+
canonicalize_lanes: bool = False,
|
|
1194
|
+
) -> dict[str, str]:
|
|
1180
1195
|
raw_section = raw_identity.get(section)
|
|
1181
1196
|
if not isinstance(raw_section, Mapping):
|
|
1182
1197
|
return {}
|
|
1183
|
-
|
|
1184
|
-
|
|
1185
|
-
|
|
1186
|
-
|
|
1187
|
-
|
|
1198
|
+
out: dict[str, str] = {}
|
|
1199
|
+
for key, value in raw_section.items():
|
|
1200
|
+
key_text = str(key)
|
|
1201
|
+
lane = str(value)
|
|
1202
|
+
if not key_text or not lane:
|
|
1203
|
+
continue
|
|
1204
|
+
if canonicalize_lanes:
|
|
1205
|
+
lane = _canonical_builder_lane(lane)
|
|
1206
|
+
out[key_text] = lane
|
|
1207
|
+
return out
|
|
1188
1208
|
|
|
1189
1209
|
|
|
1190
1210
|
def _author_exclusion_payload(
|
|
@@ -1195,14 +1215,20 @@ def _author_exclusion_payload(
|
|
|
1195
1215
|
identity = raw_identity if isinstance(raw_identity, Mapping) else {}
|
|
1196
1216
|
payload = {
|
|
1197
1217
|
"enabled": bool(config.get("merge_authority_excludes_author", True)),
|
|
1198
|
-
"labels": _identity_section(identity, "labels"),
|
|
1199
|
-
"authors": _identity_section(identity, "authors"),
|
|
1200
|
-
"trailers": _identity_section(identity, "trailers"),
|
|
1218
|
+
"labels": _identity_section(identity, "labels", canonicalize_lanes=True),
|
|
1219
|
+
"authors": _identity_section(identity, "authors", canonicalize_lanes=True),
|
|
1220
|
+
"trailers": _identity_section(identity, "trailers", canonicalize_lanes=True),
|
|
1201
1221
|
}
|
|
1222
|
+
for label, lane in tuple(payload["labels"].items()):
|
|
1223
|
+
if label in BUILDER_LEGACY_BUILDER_LABELS.get(lane, ()):
|
|
1224
|
+
payload["labels"].setdefault(f"builder:{lane}", lane)
|
|
1202
1225
|
for lane_id, lane in selected_lanes.items():
|
|
1203
1226
|
if lane.get("type") == "audit":
|
|
1204
|
-
|
|
1227
|
+
raw_author_lane = _author_lane_name(lane_id, lane)
|
|
1228
|
+
author_lane = _canonical_builder_lane(raw_author_lane)
|
|
1205
1229
|
payload["labels"].setdefault(f"builder:{author_lane}", author_lane)
|
|
1230
|
+
if raw_author_lane != author_lane:
|
|
1231
|
+
payload["labels"].setdefault(f"builder:{raw_author_lane}", author_lane)
|
|
1206
1232
|
return payload
|
|
1207
1233
|
|
|
1208
1234
|
|
|
@@ -1240,12 +1266,53 @@ def _audit_rearm_entries(
|
|
|
1240
1266
|
def _builder_labels_by_lane(author_exclusion: Mapping[str, Any]) -> dict[str, str]:
|
|
1241
1267
|
labels = _identity_section(author_exclusion, "labels")
|
|
1242
1268
|
out: dict[str, str] = {}
|
|
1269
|
+
labels_by_lane: dict[str, list[str]] = {}
|
|
1243
1270
|
for label, lane in sorted(labels.items()):
|
|
1244
1271
|
if label.startswith("builder:"):
|
|
1245
|
-
|
|
1272
|
+
labels_by_lane.setdefault(lane, []).append(label)
|
|
1273
|
+
for lane, lane_labels in sorted(labels_by_lane.items()):
|
|
1274
|
+
default_label = f"builder:{lane}"
|
|
1275
|
+
legacy_labels = set(BUILDER_LEGACY_BUILDER_LABELS.get(lane, ()))
|
|
1276
|
+
if legacy_labels and default_label in lane_labels:
|
|
1277
|
+
out[lane] = default_label
|
|
1278
|
+
continue
|
|
1279
|
+
custom_labels = [label for label in lane_labels if label not in legacy_labels]
|
|
1280
|
+
out[lane] = custom_labels[0] if custom_labels else default_label
|
|
1246
1281
|
return out
|
|
1247
1282
|
|
|
1248
1283
|
|
|
1284
|
+
def _builder_label_aliases(
|
|
1285
|
+
author_exclusion: Mapping[str, Any],
|
|
1286
|
+
builder_lane: str,
|
|
1287
|
+
) -> tuple[str, ...]:
|
|
1288
|
+
labels = _identity_section(author_exclusion, "labels")
|
|
1289
|
+
primary_label = _builder_labels_by_lane(author_exclusion).get(
|
|
1290
|
+
builder_lane,
|
|
1291
|
+
f"builder:{builder_lane}",
|
|
1292
|
+
)
|
|
1293
|
+
aliases = [
|
|
1294
|
+
primary_label,
|
|
1295
|
+
*(
|
|
1296
|
+
label
|
|
1297
|
+
for label, lane in sorted(labels.items())
|
|
1298
|
+
if lane == builder_lane and label.startswith("builder:")
|
|
1299
|
+
),
|
|
1300
|
+
*BUILDER_LEGACY_BUILDER_LABELS.get(builder_lane, ()),
|
|
1301
|
+
]
|
|
1302
|
+
return tuple(dict.fromkeys(label for label in aliases if label))
|
|
1303
|
+
|
|
1304
|
+
|
|
1305
|
+
def _builder_dispatch_label_aliases(builder_lane: str) -> tuple[str, ...]:
|
|
1306
|
+
return tuple(
|
|
1307
|
+
dict.fromkeys(
|
|
1308
|
+
(
|
|
1309
|
+
f"dispatched:{builder_lane}",
|
|
1310
|
+
*BUILDER_LEGACY_DISPATCH_LABELS.get(builder_lane, ()),
|
|
1311
|
+
)
|
|
1312
|
+
)
|
|
1313
|
+
)
|
|
1314
|
+
|
|
1315
|
+
|
|
1249
1316
|
def _builder_identity_rule_warnings(
|
|
1250
1317
|
author_exclusion: Mapping[str, Any],
|
|
1251
1318
|
rules: Sequence[Mapping[str, Any]],
|
|
@@ -1258,10 +1325,20 @@ def _builder_identity_rule_warnings(
|
|
|
1258
1325
|
|
|
1259
1326
|
warnings: list[str] = []
|
|
1260
1327
|
for lane, lane_labels in sorted(labels_by_lane.items()):
|
|
1261
|
-
|
|
1328
|
+
primary_label = _builder_labels_by_lane(author_exclusion).get(lane)
|
|
1329
|
+
allowed_aliases = {
|
|
1330
|
+
label
|
|
1331
|
+
for label in (
|
|
1332
|
+
primary_label,
|
|
1333
|
+
*BUILDER_LEGACY_BUILDER_LABELS.get(lane, ()),
|
|
1334
|
+
)
|
|
1335
|
+
if label
|
|
1336
|
+
}
|
|
1337
|
+
unexpected_labels = [label for label in lane_labels if label not in allowed_aliases]
|
|
1338
|
+
if unexpected_labels:
|
|
1262
1339
|
warnings.append(
|
|
1263
1340
|
f"builder_identity: lane {lane!r} maps multiple builder labels; "
|
|
1264
|
-
f"generated automation uses {
|
|
1341
|
+
f"generated automation uses {primary_label!r}"
|
|
1265
1342
|
)
|
|
1266
1343
|
for lane in sorted({str(rule.get("builder_lane") or "") for rule in rules}):
|
|
1267
1344
|
if lane and lane not in labels_by_lane:
|
|
@@ -1278,14 +1355,19 @@ def _agent_pr_label_rules(
|
|
|
1278
1355
|
) -> tuple[dict[str, Any], ...]:
|
|
1279
1356
|
identity = config.get("builder_identity")
|
|
1280
1357
|
identity = identity if isinstance(identity, Mapping) else {}
|
|
1281
|
-
prefixes = _identity_section(identity, "branch_prefixes")
|
|
1358
|
+
prefixes = _identity_section(identity, "branch_prefixes", canonicalize_lanes=True)
|
|
1282
1359
|
labels_by_lane = _builder_labels_by_lane(author_exclusion)
|
|
1283
1360
|
rules_by_lane: dict[str, dict[str, Any]] = {}
|
|
1284
1361
|
for prefix, lane in sorted(prefixes.items()):
|
|
1285
1362
|
label = labels_by_lane.get(lane) or f"builder:{lane}"
|
|
1286
1363
|
rule = rules_by_lane.setdefault(
|
|
1287
1364
|
lane,
|
|
1288
|
-
{
|
|
1365
|
+
{
|
|
1366
|
+
"builder_lane": lane,
|
|
1367
|
+
"builder_label": label,
|
|
1368
|
+
"builder_labels": list(_builder_label_aliases(author_exclusion, lane)),
|
|
1369
|
+
"branch_prefixes": [],
|
|
1370
|
+
},
|
|
1289
1371
|
)
|
|
1290
1372
|
rule["branch_prefixes"].append(prefix)
|
|
1291
1373
|
return tuple(rules_by_lane[lane] for lane in sorted(rules_by_lane))
|
|
@@ -1294,22 +1376,24 @@ def _agent_pr_label_rules(
|
|
|
1294
1376
|
def _fix_round_rules(
|
|
1295
1377
|
config: Mapping[str, Any],
|
|
1296
1378
|
author_exclusion: Mapping[str, Any],
|
|
1297
|
-
) -> tuple[dict[str,
|
|
1379
|
+
) -> tuple[dict[str, Any], ...]:
|
|
1298
1380
|
identity = config.get("builder_identity")
|
|
1299
1381
|
identity = identity if isinstance(identity, Mapping) else {}
|
|
1300
1382
|
mentions = _identity_section(identity, "fix_round_mentions")
|
|
1301
1383
|
labels_by_lane = _builder_labels_by_lane(author_exclusion)
|
|
1302
|
-
|
|
1303
|
-
for
|
|
1384
|
+
rules_by_lane: dict[str, dict[str, Any]] = {}
|
|
1385
|
+
for raw_lane, mention in sorted(mentions.items()):
|
|
1386
|
+
lane = _canonical_builder_lane(raw_lane)
|
|
1304
1387
|
label = labels_by_lane.get(lane) or f"builder:{lane}"
|
|
1305
|
-
|
|
1388
|
+
rules_by_lane[lane] = (
|
|
1306
1389
|
{
|
|
1307
1390
|
"builder_lane": lane,
|
|
1308
1391
|
"builder_label": label,
|
|
1392
|
+
"builder_labels": list(_builder_label_aliases(author_exclusion, lane)),
|
|
1309
1393
|
"mention": mention,
|
|
1310
1394
|
}
|
|
1311
1395
|
)
|
|
1312
|
-
return tuple(
|
|
1396
|
+
return tuple(rules_by_lane[lane] for lane in sorted(rules_by_lane))
|
|
1313
1397
|
|
|
1314
1398
|
|
|
1315
1399
|
def _gate_workflow_entry(
|
|
@@ -527,13 +527,13 @@ TEMPLATE_FILES = (
|
|
|
527
527
|
("lane-template", "templates/lanes/claude.md"),
|
|
528
528
|
("lane-template", "templates/lanes/codex.md"),
|
|
529
529
|
("lane-template", "templates/lanes/generic.md"),
|
|
530
|
-
("lane-template", "templates/lanes/
|
|
530
|
+
("lane-template", "templates/lanes/cursor.md"),
|
|
531
531
|
("lane-template", "templates/lanes/run_mac_lane.sh"),
|
|
532
532
|
("lane-template", "src/code_mower/templates/lanes/README.md"),
|
|
533
533
|
("lane-template", "src/code_mower/templates/lanes/claude.md"),
|
|
534
534
|
("lane-template", "src/code_mower/templates/lanes/codex.md"),
|
|
535
535
|
("lane-template", "src/code_mower/templates/lanes/generic.md"),
|
|
536
|
-
("lane-template", "src/code_mower/templates/lanes/
|
|
536
|
+
("lane-template", "src/code_mower/templates/lanes/cursor.md"),
|
|
537
537
|
("lane-template", "src/code_mower/templates/lanes/run_mac_lane.sh"),
|
|
538
538
|
("config", "templates/code-mower.yml.j2"),
|
|
539
539
|
("provider-config", "templates/providers.yml"),
|
|
@@ -485,13 +485,15 @@ def render_release_readiness(repo_path: Path) -> dict[str, Any]:
|
|
|
485
485
|
warnings = sum(1 for check in checks if check["status"] == "warn")
|
|
486
486
|
passed = sum(1 for check in checks if check["status"] == "pass")
|
|
487
487
|
status = "pass" if failed == 0 else "fail"
|
|
488
|
+
release_workflow_ref = release_tag or "main"
|
|
488
489
|
next_actions = [
|
|
489
490
|
{
|
|
490
491
|
"id": "dry-run-release-workflow",
|
|
491
492
|
"title": "Run the release workflow without publishing",
|
|
492
493
|
"command": (
|
|
493
494
|
"gh workflow run release.yml --repo codemower-ai/code-mower "
|
|
494
|
-
"--ref
|
|
495
|
+
f"--ref {release_workflow_ref} "
|
|
496
|
+
"-f publish_testpypi=false -f publish_pypi=false"
|
|
495
497
|
),
|
|
496
498
|
"url": PACKAGE_INDEX_SETUP_URLS["release_workflow"],
|
|
497
499
|
},
|
|
@@ -500,7 +502,8 @@ def render_release_readiness(repo_path: Path) -> dict[str, Any]:
|
|
|
500
502
|
"title": "Publish the verified distribution to TestPyPI",
|
|
501
503
|
"command": (
|
|
502
504
|
"gh workflow run release.yml --repo codemower-ai/code-mower "
|
|
503
|
-
"--ref
|
|
505
|
+
f"--ref {release_workflow_ref} "
|
|
506
|
+
"-f publish_testpypi=true -f publish_pypi=false"
|
|
504
507
|
),
|
|
505
508
|
"url": PACKAGE_INDEX_SETUP_URLS["release_workflow"],
|
|
506
509
|
},
|
|
@@ -59,19 +59,22 @@ builder_identity:
|
|
|
59
59
|
labels:
|
|
60
60
|
builder:codex: codex
|
|
61
61
|
builder:claude: claude
|
|
62
|
-
builder:
|
|
62
|
+
builder:cursor: cursor
|
|
63
|
+
builder:grok-bot: cursor
|
|
63
64
|
authors:
|
|
64
65
|
chatgpt-codex-connector[bot]: codex
|
|
65
66
|
claude[bot]: claude
|
|
66
|
-
|
|
67
|
+
cursor[bot]: cursor
|
|
68
|
+
grok-bot[bot]: cursor
|
|
67
69
|
branch_prefixes:
|
|
68
|
-
cursor/:
|
|
70
|
+
cursor/: cursor
|
|
69
71
|
fix_round_mentions:
|
|
70
|
-
|
|
72
|
+
cursor: "@cursor"
|
|
71
73
|
trailers:
|
|
72
74
|
CODE_MOWER_BUILDER:codex: codex
|
|
73
75
|
CODE_MOWER_BUILDER:claude: claude
|
|
74
|
-
CODE_MOWER_BUILDER:
|
|
76
|
+
CODE_MOWER_BUILDER:cursor: cursor
|
|
77
|
+
CODE_MOWER_BUILDER:grok-bot: cursor
|
|
75
78
|
|
|
76
79
|
lanes:
|
|
77
80
|
codex:
|
|
@@ -46,6 +46,10 @@ jobs:
|
|
|
46
46
|
audit_lanes = json.loads(os.environ["CODE_MOWER_FIX_ROUND_AUDIT_LANES_JSON"])
|
|
47
47
|
rules = json.loads(os.environ["CODE_MOWER_FIX_ROUND_RULES_JSON"])
|
|
48
48
|
|
|
49
|
+
def builder_labels(rule):
|
|
50
|
+
labels = [rule.get("builder_label", ""), *(rule.get("builder_labels") or [])]
|
|
51
|
+
return set(dict.fromkeys(label for label in labels if label))
|
|
52
|
+
|
|
49
53
|
audit_lane = next(
|
|
50
54
|
(lane for lane in audit_lanes if lane.get("blocked") == event_label),
|
|
51
55
|
None,
|
|
@@ -54,7 +58,7 @@ jobs:
|
|
|
54
58
|
(
|
|
55
59
|
item
|
|
56
60
|
for item in rules
|
|
57
|
-
if item.
|
|
61
|
+
if builder_labels(item).intersection(pr_labels) and item.get("mention")
|
|
58
62
|
),
|
|
59
63
|
None,
|
|
60
64
|
)
|