code-mower 0.5.0b53__tar.gz → 0.6.0b1__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.0b53 → code_mower-0.6.0b1}/PKG-INFO +40 -20
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/README.md +39 -19
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/pyproject.toml +8 -3
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/__init__.py +1 -1
- code_mower-0.6.0b1/src/code_mower/antigravity_sdk_probe.py +129 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/bootstrap.py +1 -1
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/builder_experiment.py +165 -3
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/calibration/auto_discovery.py +11 -4
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/claude_audit_pr.py +20 -20
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/cli.py +51 -2
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/cloud.py +9 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/cloud_client/__init__.py +2 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/cloud_client/events.py +146 -4
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/cloud_client/operations.py +14 -1
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/code_mower_telemetry.py +27 -10
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/codex_audit_pr.py +21 -26
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/config.py +1 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/gemini_cli_audit_pr.py +10 -6
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/init.py +11 -0
- code_mower-0.6.0b1/src/code_mower/lane_status.py +457 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/next_steps.py +1 -1
- code_mower-0.6.0b1/src/code_mower/observe.py +324 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/package_content.py +1 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/package_manifest.py +8 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/provider_registry.py +1 -4
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/provider_runners/__init__.py +16 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/provider_runners/comments.py +36 -0
- code_mower-0.6.0b1/src/code_mower/provider_runners/exit_codes.py +13 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/provider_runners/verdict_artifacts.py +81 -10
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/templates/code-mower.example.yml +1 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/templates/lanes/run_mac_lane.sh +4 -1
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/templates/workflows/builder-provenance.yml.j2 +1 -1
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/templates/workflows/code-mower-fix-round-dispatch.yml.j2 +3 -1
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/templates/workflows/code-mower-gate.yml.j2 +5 -3
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/templates/workflows/self-hosted-local-audit.yml.j2 +1 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/trailer_comment_labeler.py +15 -1
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/versioning.py +4 -5
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower.egg-info/PKG-INFO +40 -20
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower.egg-info/SOURCES.txt +9 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/templates/lanes/run_mac_lane.sh +4 -1
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/templates/workflows/builder-provenance.yml.j2 +1 -1
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/templates/workflows/code-mower-fix-round-dispatch.yml.j2 +3 -1
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/templates/workflows/code-mower-gate.yml.j2 +5 -3
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/templates/workflows/self-hosted-local-audit.yml.j2 +1 -0
- code_mower-0.6.0b1/tests/test_antigravity_sdk_probe.py +120 -0
- code_mower-0.6.0b1/tests/test_builder_experiment.py +131 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/tests/test_builder_identity.py +7 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/tests/test_cloud_client.py +37 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/tests/test_gate_health.py +1 -1
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/tests/test_init_build_loop.py +4 -0
- code_mower-0.6.0b1/tests/test_lane_status.py +128 -0
- code_mower-0.6.0b1/tests/test_observe.py +111 -0
- code_mower-0.6.0b1/tests/test_provider_fixture_contracts.py +134 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/tests/test_provider_local_cli.py +104 -0
- code_mower-0.6.0b1/tests/test_provider_runners_comments.py +77 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/tests/test_release_hygiene.py +270 -82
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/tests/test_reviewer_metrics_core.py +120 -2
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/tests/test_trailer_comment_labeler.py +35 -0
- code_mower-0.5.0b53/tests/test_provider_runners_comments.py +0 -42
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/CODE_OF_CONDUCT.md +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/LICENSE +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/MANIFEST.in +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/NOTICE +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/SUPPORT.md +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/requirements/requirements.txt +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/setup.cfg +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/adapters/__init__.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/adapters/_base.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/adapters/cursor_bugbot.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/adapters/gitar.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/adapters/greptile.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/adapters/qodo.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/antigravity_cli_audit_pr.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/audit_handoff_log.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/audit_labeler_lib.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/audit_limits.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/audit_progress.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/blind_review_artifacts.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/blind_review_coordinator.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/builder_runs.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/calibration/__init__.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/calibration/arms.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/calibration/commands.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/calibration/context_inputs.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/calibration/corpus.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/calibration/effect_report.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/calibration/evidence.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/calibration/evidence_report.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/calibration/identity.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/calibration/metrics.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/calibration/overlap.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/calibration/planning.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/calibration/policy.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/calibration/results.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/calibration/run_results.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/calibration/run_status.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/calibration/runner.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/calibration/truth.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/calibration/value_report.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/checks.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/claude_cli_bounce.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/claude_cli_environment.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/clear_stale.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/cloud_client/bundle.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/cloud_client/doctor.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/cloud_client/dogfood.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/cloud_client/endpoints.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/cloud_client/errors.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/cloud_client/export.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/cloud_client/git_metadata.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/cloud_client/manifest.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/cloud_client/reports.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/cloud_client/setup.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/cloud_client/upload.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/code_mower_calibration.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/code_mower_context_packs.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/code_mower_merge.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/coderabbit_cli_audit_pr.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/codex_audit_env_preflight.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/codex_audit_schema_smoke.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/codex_audit_verdict.schema.json +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/decisions.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/doctor.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/doctor_checks/__init__.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/doctor_checks/audit_limits.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/doctor_checks/cloud.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/doctor_checks/common.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/doctor_checks/github.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/doctor_checks/github_actions.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/doctor_checks/github_actions_cost.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/doctor_checks/github_actions_cost_summary.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/doctor_checks/github_actions_failure_annotations.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/doctor_checks/github_actions_failure_models.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/doctor_checks/github_actions_failure_scan.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/doctor_checks/github_actions_failure_selection.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/doctor_checks/github_actions_failures.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/doctor_checks/github_actions_permissions.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/doctor_checks/github_api.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/doctor_checks/github_branch.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/doctor_checks/github_config.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/doctor_checks/github_human_token.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/doctor_checks/github_provider.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/doctor_checks/github_repo.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/doctor_checks/groups.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/doctor_checks/models.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/doctor_checks/output.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/doctor_checks/presets.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/doctor_checks/privacy.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/doctor_checks/provider_api_model.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/doctor_checks/provider_api_model_openai.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/doctor_checks/provider_api_model_profiles.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/doctor_checks/provider_env.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/doctor_checks/provider_env_required.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/doctor_checks/provider_env_tokens.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/doctor_checks/provider_local_audit_setup.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/doctor_checks/provider_local_cli.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/doctor_checks/provider_local_cli_commands.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/doctor_checks/provider_local_cli_probe_config.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/doctor_checks/provider_probe.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/doctor_checks/provider_probe_auth.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/doctor_checks/provider_probe_evaluation.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/doctor_checks/provider_probe_json.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/doctor_checks/provider_probe_remediation.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/doctor_checks/provider_review_hygiene.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/doctor_checks/providers.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/doctor_checks/registry.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/doctor_checks/runner.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/doctor_checks/runtime.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/doctor_checks/runtime_github_auth.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/doctor_checks/self_hosted_runner.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/gate_health.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/grok_build_audit_pr.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/hermes_cli_audit_pr.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/lane_configs/__init__.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/lane_configs/aider.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/lane_configs/antigravity_cli.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/lane_configs/claude.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/lane_configs/codex.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/lane_configs/devin.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/lane_configs/gemini_cli.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/lane_configs/grok_build.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/lane_configs/hermes_cli.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/lane_configs/local_llm.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/local_llm_audit_pr.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/local_llm_bakeoff.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/local_llm_calibration.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/local_llm_profiles.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/migration.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/migration_install.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/migration_mirror.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/migration_readiness.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/migration_rehearsal.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/package.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/package_paths.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/package_rendering.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/package_static.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/plan_context.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/prompts.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/provider_runners/git.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/provider_runners/github_auth.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/provider_runners/github_pr.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/provider_runners/pr_worktree.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/provider_runners/process.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/provider_runners/repo_paths.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/provider_runners/text_schema.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/provider_runners/workspace.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/providers/__init__.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/providers/local_cli.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/providers/provenance.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/release_readiness.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/reviewer_metrics.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/reviewer_spend.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/saas_reviewer_labeler.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/secrets.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/templates/builder-experiment.example.json +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/templates/calibration-corpus.example.json +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/templates/calibration-corpus.json +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/templates/context-packs.example.json +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/templates/lane_prompts/base-audit.md +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/templates/lane_prompts/calibration-policy.md +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/templates/lane_prompts/context-driven-quality.md +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/templates/lane_prompts/docs-design.md +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/templates/lane_prompts/generic-programming.md +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/templates/lane_prompts/operability.md +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/templates/lane_prompts/package-runtime.md +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/templates/lane_prompts/plan-conformance.md +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/templates/lane_prompts/security-threat-model.md +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/templates/lanes/README.md +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/templates/lanes/claude.md +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/templates/lanes/codex.md +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/templates/lanes/cursor.md +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/templates/lanes/generic.md +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/templates/product-support/code_mower +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/templates/product-support/code_mower_standalone_pin.env +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/templates/product-support/code_mower_standalone_shadow.sh +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/templates/product-support/run_claude_audit_pr.sh +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/templates/product-support/run_codex_audit_pr.sh +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/templates/product-support/safe_gh_comment.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/templates/product-support/status_report.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/templates/providers.yml +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/templates/reviewer-spend.example.json +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/templates/reviewer-value-report.example.md +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/templates/workflows/audit-label-cleanup.yml.j2 +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/templates/workflows/code-mower-agent-pr-labeler.yml.j2 +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/templates/workflows/code-mower-gate-health.yml.j2 +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/templates/workflows/dispatch-lanes.yml.j2 +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/templates/workflows/hosted-bridge.yml.j2 +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/templates/workflows/lane-mac-runner.yml.j2 +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/templates/workflows/local-cli-audit.yml.j2 +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/templates/workflows/needs-owner-notify.yml.j2 +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/templates/workflows/private-standalone-shadow.yml.j2 +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/templates/workflows/review-clear-stale.yml.j2 +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/templates/workflows/saas-reviewer-labeler.yml.j2 +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/templates/workflows/trailer-comment-labeler.yml.j2 +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/templates/workflows/weekly-status.yml.j2 +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/work_orders.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower/workflow_actionlint.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower.egg-info/dependency_links.txt +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower.egg-info/entry_points.txt +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower.egg-info/requires.txt +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/src/code_mower.egg-info/top_level.txt +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/templates/builder-experiment.example.json +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/templates/calibration-corpus.example.json +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/templates/calibration-corpus.json +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/templates/code-mower.yml.j2 +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/templates/context-packs.example.json +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/templates/cursor/BUGBOT.md +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/templates/lanes/README.md +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/templates/lanes/claude.md +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/templates/lanes/codex.md +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/templates/lanes/cursor.md +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/templates/lanes/generic.md +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/templates/providers/acp_bridge.yml +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/templates/providers/aider.yml +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/templates/providers/antigravity_cli.yml +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/templates/providers/claude_audit.yml +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/templates/providers/claude_review.yml +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/templates/providers/coderabbit_cli.yml +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/templates/providers/codex.yml +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/templates/providers/cursor_bugbot.yml +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/templates/providers/devin.yml +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/templates/providers/gemini_cli.yml +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/templates/providers/gitar.yml +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/templates/providers/greptile.yml +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/templates/providers/hermes_cli.yml +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/templates/providers/local_llm.yml +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/templates/providers/qodo.yml +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/templates/providers.yml +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/templates/reviewer-spend.example.json +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/templates/reviewer-value-report.example.md +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/templates/workflows/audit-label-cleanup.yml.j2 +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/templates/workflows/blind-review-artifacts-dry-run.yml.j2 +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/templates/workflows/code-mower-agent-pr-labeler.yml.j2 +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/templates/workflows/code-mower-gate-health.yml.j2 +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/templates/workflows/dispatch-lanes.yml.j2 +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/templates/workflows/hosted-bridge.yml.j2 +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/templates/workflows/lane-mac-runner.yml.j2 +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/templates/workflows/local-cli-audit.yml.j2 +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/templates/workflows/private-standalone-shadow.yml.j2 +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/templates/workflows/review-clear-stale.yml.j2 +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/templates/workflows/saas-reviewer-labeler.yml.j2 +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/templates/workflows/trailer-comment-labeler.yml.j2 +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/tests/test_audit_comment_posture.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/tests/test_audit_limits.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/tests/test_builder_runs.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/tests/test_calibration_effect_report.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/tests/test_calibration_truth.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/tests/test_checks.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/tests/test_claude_audit_pr.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/tests/test_claude_cli_bounce.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/tests/test_clear_stale.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/tests/test_cloud_git_metadata.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/tests/test_cloud_manifest.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/tests/test_cloud_reports.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/tests/test_coderabbit_cli_audit_pr.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/tests/test_codex_audit_env_preflight.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/tests/test_codex_audit_pr.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/tests/test_decision_audit_integration.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/tests/test_decisions.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/tests/test_doctor_actions_cost_summary.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/tests/test_doctor_actions_failure_selection.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/tests/test_doctor_boundaries.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/tests/test_doctor_github_checks.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/tests/test_doctor_output.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/tests/test_doctor_privacy.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/tests/test_doctor_provider_env_required.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/tests/test_doctor_provider_env_tokens.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/tests/test_doctor_provider_local_audit_setup.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/tests/test_doctor_provider_probe.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/tests/test_doctor_provider_review_hygiene.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/tests/test_doctor_registry.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/tests/test_doctor_runtime.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/tests/test_doctor_self_hosted_runner.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/tests/test_init_actionlint.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/tests/test_local_llm_github_helpers.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/tests/test_plan_context.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/tests/test_prompts.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/tests/test_provider_runners_git.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/tests/test_provider_runners_github_pr.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/tests/test_provider_runners_pr_worktree.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/tests/test_provider_runners_process.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/tests/test_provider_runners_repo_paths.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/tests/test_provider_runners_text_schema.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/tests/test_provider_runners_workspace.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/tests/test_reviewer_spend.py +0 -0
- {code_mower-0.5.0b53 → code_mower-0.6.0b1}/tests/test_work_orders.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: code-mower
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.6.0b1
|
|
4
4
|
Summary: Multi-reviewer AI code audit orchestration
|
|
5
5
|
License-Expression: Apache-2.0
|
|
6
6
|
Requires-Python: >=3.11
|
|
@@ -59,9 +59,8 @@ Code Mower should feel like an engineering tool, not a demo harness:
|
|
|
59
59
|
|
|
60
60
|
`code-mower doctor --preflight` is the first useful command. It checks your
|
|
61
61
|
runtime, GitHub setup, provider CLIs, token posture, optional cloud setup, and
|
|
62
|
-
private-repo Actions cost traps. `--preflight` is the friendly
|
|
63
|
-
|
|
64
|
-
scripts.
|
|
62
|
+
private-repo Actions cost traps. `--preflight` is the friendly first-run preset;
|
|
63
|
+
`doctor --v05` remains an equivalent compatibility alias for older scripts.
|
|
65
64
|
|
|
66
65
|
Example, shortened:
|
|
67
66
|
|
|
@@ -86,6 +85,10 @@ boundaries visible before you promote any reviewer lane.
|
|
|
86
85
|
|
|
87
86
|
See a fuller static transcript: [docs/first-run-transcript.md](docs/first-run-transcript.md).
|
|
88
87
|
|
|
88
|
+
After `init` and `doctor`, use `code-mower lanes status --repo OWNER/REPO` to
|
|
89
|
+
see active builder/reviewer lanes, gate/check state, recent Code Mower
|
|
90
|
+
workflows, local AgentTrail boards when present, and the next operator action.
|
|
91
|
+
|
|
89
92
|
## See The Value Shape First
|
|
90
93
|
|
|
91
94
|
If you want to understand the product before installing anything, start with
|
|
@@ -103,14 +106,18 @@ fast, or eligible for stronger merge policy on your actual codebase.
|
|
|
103
106
|
## Start Here
|
|
104
107
|
|
|
105
108
|
Choose one path. Each path has one guide and gets to one visible outcome.
|
|
109
|
+
Cold adopters should start with the reviewer gate, then add builders, then
|
|
110
|
+
measure builder experiments; provider experiments come after that base loop is
|
|
111
|
+
observable.
|
|
106
112
|
|
|
107
113
|
| Path | Use When | Route | Guide |
|
|
108
114
|
| --- | --- | --- | --- |
|
|
109
115
|
| 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
116
|
| 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) |
|
|
117
|
+
| 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) |
|
|
111
118
|
|
|
112
|
-
The
|
|
113
|
-
[Try Code Mower In 10 Minutes](https://github.com/codemower-ai/code-mower/blob/v0.
|
|
119
|
+
The v0.6 beta announcement entry point is the tagged
|
|
120
|
+
[Try Code Mower In 10 Minutes](https://github.com/codemower-ai/code-mower/blob/v0.6.0-beta.1/docs/try-in-10-minutes.md)
|
|
114
121
|
guide.
|
|
115
122
|
|
|
116
123
|
## What Calibration Does And Does Not Prove
|
|
@@ -135,13 +142,13 @@ every disposition before using it for lane promotion or merge policy.
|
|
|
135
142
|
|
|
136
143
|
Full walkthrough: [docs/try-in-10-minutes.md](docs/try-in-10-minutes.md).
|
|
137
144
|
First-time command map: [docs/launch-command-surface.md](docs/launch-command-surface.md).
|
|
145
|
+
Provider-contract baseline for the next release train:
|
|
146
|
+
[docs/v06-truth-baseline.md](docs/v06-truth-baseline.md).
|
|
138
147
|
|
|
139
|
-
|
|
148
|
+
For release verification,
|
|
140
149
|
[First-User Install Rehearsal](docs/first-user-install-rehearsal.md) records
|
|
141
|
-
the
|
|
142
|
-
|
|
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`.
|
|
150
|
+
the package-index procedure for `v0.6.0-beta.1` / `code-mower==0.6.0b1`. The
|
|
151
|
+
GitHub release records the workflow and rehearsal evidence for the exact tag.
|
|
145
152
|
|
|
146
153
|
## Optional: Plan Before Coding
|
|
147
154
|
|
|
@@ -200,6 +207,11 @@ optional work order, single-writer branch, reviewer lanes, and fix rounds. Code
|
|
|
200
207
|
Mower's templates now support that loop end to end; humans still own
|
|
201
208
|
credentials, branch protection, calibration, and owner decisions.
|
|
202
209
|
|
|
210
|
+
The reference adoption shape is Claude Code as orchestrator; Claude Code,
|
|
211
|
+
Codex, and Cursor as builder lanes; Claude Code and Codex as reviewer lanes;
|
|
212
|
+
and Gitar or Antigravity as informational reviewer signal until local
|
|
213
|
+
calibration says otherwise.
|
|
214
|
+
|
|
203
215
|
## Why Not Just Run Codex Or Claude Yourself?
|
|
204
216
|
|
|
205
217
|
You should, at first. Code Mower is not a replacement for a good local agent or
|
|
@@ -277,6 +289,10 @@ Everything else starts manual or informational until your own calibration data
|
|
|
277
289
|
proves it is useful: Antigravity/Gemini, Hermes, CodeRabbit CLI, Cursor BugBot,
|
|
278
290
|
Qodo, Greptile, Devin, local LLMs, and future ACP bridges.
|
|
279
291
|
|
|
292
|
+
Gemini CLI and Antigravity are distinct lane ids even though both are Google
|
|
293
|
+
surfaces and may use Gemini model infrastructure. Keep their auth, model
|
|
294
|
+
provenance, calibration evidence, and release notes separate.
|
|
295
|
+
|
|
280
296
|
Provider details: [docs/provider-matrix.md](docs/provider-matrix.md).
|
|
281
297
|
Setup/auth fixes: [docs/troubleshooting.md](docs/troubleshooting.md).
|
|
282
298
|
|
|
@@ -288,12 +304,13 @@ engineer can:
|
|
|
288
304
|
1. install Code Mower in a clean repo;
|
|
289
305
|
2. understand the local/cloud trust boundary;
|
|
290
306
|
3. run `init --easy` and `doctor --preflight`;
|
|
291
|
-
4.
|
|
307
|
+
4. run `lanes status --repo OWNER/REPO` to see active lanes and gate state;
|
|
308
|
+
5. detect and run the repo's native lint/test/build surface instead of assuming
|
|
292
309
|
every project uses the same tools;
|
|
293
|
-
|
|
294
|
-
|
|
310
|
+
6. produce a local value report from known PR outcomes;
|
|
311
|
+
7. decide which lanes should stay informational, selective, or merge-gating;
|
|
295
312
|
and
|
|
296
|
-
|
|
313
|
+
8. optionally upload sanitized metadata to CodeMower.com and see useful team
|
|
297
314
|
dashboard signal.
|
|
298
315
|
|
|
299
316
|
Build-loop templates extend the same loop from "who reviews best?" to "which AI
|
|
@@ -305,11 +322,10 @@ measurement work.
|
|
|
305
322
|
|
|
306
323
|
## Installation Status
|
|
307
324
|
|
|
308
|
-
The
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
pinned package-index install spec is `code-mower==0.5.0b53`.
|
|
325
|
+
The current public beta baseline is `v0.6.0-beta.1`, with pinned package-index
|
|
326
|
+
install spec `code-mower==0.6.0b1`. Release evidence is recorded on the GitHub
|
|
327
|
+
release and in the first-user install rehearsal. The public repository is
|
|
328
|
+
[codemower-ai/code-mower](https://github.com/codemower-ai/code-mower), and
|
|
313
329
|
GitHub releases remain the auditable source for tags, build artifacts, and
|
|
314
330
|
release notes.
|
|
315
331
|
|
|
@@ -322,6 +338,8 @@ scripts/dev-python -m venv .venv
|
|
|
322
338
|
```
|
|
323
339
|
|
|
324
340
|
The wrapper resolves Python 3.12+ and refuses stale or old system Python shims.
|
|
341
|
+
Do not run the CLI by hand-wiring source import paths; install the editable venv
|
|
342
|
+
first so local work exercises the same package entrypoint users install.
|
|
325
343
|
|
|
326
344
|
## Known Limitations
|
|
327
345
|
|
|
@@ -363,6 +381,8 @@ The wrapper resolves Python 3.12+ and refuses stale or old system Python shims.
|
|
|
363
381
|
- [First-User Demo Transcript](docs/first-user-demo-transcript.md)
|
|
364
382
|
- [First-User Install Rehearsal](docs/first-user-install-rehearsal.md)
|
|
365
383
|
- [Launch Command Surface](docs/launch-command-surface.md)
|
|
384
|
+
- [v0.6 Truth Baseline](docs/v06-truth-baseline.md)
|
|
385
|
+
- [v0.6 Release Notes](docs/v06-release-notes.md)
|
|
366
386
|
- [Demo Calibration Example](examples/demo-calibration/README.md)
|
|
367
387
|
- [PyPI Release Runbook](docs/pypi-release.md)
|
|
368
388
|
- [Sample Doctor Output](docs/sample-doctor-output.md)
|
|
@@ -44,9 +44,8 @@ Code Mower should feel like an engineering tool, not a demo harness:
|
|
|
44
44
|
|
|
45
45
|
`code-mower doctor --preflight` is the first useful command. It checks your
|
|
46
46
|
runtime, GitHub setup, provider CLIs, token posture, optional cloud setup, and
|
|
47
|
-
private-repo Actions cost traps. `--preflight` is the friendly
|
|
48
|
-
|
|
49
|
-
scripts.
|
|
47
|
+
private-repo Actions cost traps. `--preflight` is the friendly first-run preset;
|
|
48
|
+
`doctor --v05` remains an equivalent compatibility alias for older scripts.
|
|
50
49
|
|
|
51
50
|
Example, shortened:
|
|
52
51
|
|
|
@@ -71,6 +70,10 @@ boundaries visible before you promote any reviewer lane.
|
|
|
71
70
|
|
|
72
71
|
See a fuller static transcript: [docs/first-run-transcript.md](docs/first-run-transcript.md).
|
|
73
72
|
|
|
73
|
+
After `init` and `doctor`, use `code-mower lanes status --repo OWNER/REPO` to
|
|
74
|
+
see active builder/reviewer lanes, gate/check state, recent Code Mower
|
|
75
|
+
workflows, local AgentTrail boards when present, and the next operator action.
|
|
76
|
+
|
|
74
77
|
## See The Value Shape First
|
|
75
78
|
|
|
76
79
|
If you want to understand the product before installing anything, start with
|
|
@@ -88,14 +91,18 @@ fast, or eligible for stronger merge policy on your actual codebase.
|
|
|
88
91
|
## Start Here
|
|
89
92
|
|
|
90
93
|
Choose one path. Each path has one guide and gets to one visible outcome.
|
|
94
|
+
Cold adopters should start with the reviewer gate, then add builders, then
|
|
95
|
+
measure builder experiments; provider experiments come after that base loop is
|
|
96
|
+
observable.
|
|
91
97
|
|
|
92
98
|
| Path | Use When | Route | Guide |
|
|
93
99
|
| --- | --- | --- | --- |
|
|
94
100
|
| 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
101
|
| 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) |
|
|
102
|
+
| 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) |
|
|
96
103
|
|
|
97
|
-
The
|
|
98
|
-
[Try Code Mower In 10 Minutes](https://github.com/codemower-ai/code-mower/blob/v0.
|
|
104
|
+
The v0.6 beta announcement entry point is the tagged
|
|
105
|
+
[Try Code Mower In 10 Minutes](https://github.com/codemower-ai/code-mower/blob/v0.6.0-beta.1/docs/try-in-10-minutes.md)
|
|
99
106
|
guide.
|
|
100
107
|
|
|
101
108
|
## What Calibration Does And Does Not Prove
|
|
@@ -120,13 +127,13 @@ every disposition before using it for lane promotion or merge policy.
|
|
|
120
127
|
|
|
121
128
|
Full walkthrough: [docs/try-in-10-minutes.md](docs/try-in-10-minutes.md).
|
|
122
129
|
First-time command map: [docs/launch-command-surface.md](docs/launch-command-surface.md).
|
|
130
|
+
Provider-contract baseline for the next release train:
|
|
131
|
+
[docs/v06-truth-baseline.md](docs/v06-truth-baseline.md).
|
|
123
132
|
|
|
124
|
-
|
|
133
|
+
For release verification,
|
|
125
134
|
[First-User Install Rehearsal](docs/first-user-install-rehearsal.md) records
|
|
126
|
-
the
|
|
127
|
-
|
|
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`.
|
|
135
|
+
the package-index procedure for `v0.6.0-beta.1` / `code-mower==0.6.0b1`. The
|
|
136
|
+
GitHub release records the workflow and rehearsal evidence for the exact tag.
|
|
130
137
|
|
|
131
138
|
## Optional: Plan Before Coding
|
|
132
139
|
|
|
@@ -185,6 +192,11 @@ optional work order, single-writer branch, reviewer lanes, and fix rounds. Code
|
|
|
185
192
|
Mower's templates now support that loop end to end; humans still own
|
|
186
193
|
credentials, branch protection, calibration, and owner decisions.
|
|
187
194
|
|
|
195
|
+
The reference adoption shape is Claude Code as orchestrator; Claude Code,
|
|
196
|
+
Codex, and Cursor as builder lanes; Claude Code and Codex as reviewer lanes;
|
|
197
|
+
and Gitar or Antigravity as informational reviewer signal until local
|
|
198
|
+
calibration says otherwise.
|
|
199
|
+
|
|
188
200
|
## Why Not Just Run Codex Or Claude Yourself?
|
|
189
201
|
|
|
190
202
|
You should, at first. Code Mower is not a replacement for a good local agent or
|
|
@@ -262,6 +274,10 @@ Everything else starts manual or informational until your own calibration data
|
|
|
262
274
|
proves it is useful: Antigravity/Gemini, Hermes, CodeRabbit CLI, Cursor BugBot,
|
|
263
275
|
Qodo, Greptile, Devin, local LLMs, and future ACP bridges.
|
|
264
276
|
|
|
277
|
+
Gemini CLI and Antigravity are distinct lane ids even though both are Google
|
|
278
|
+
surfaces and may use Gemini model infrastructure. Keep their auth, model
|
|
279
|
+
provenance, calibration evidence, and release notes separate.
|
|
280
|
+
|
|
265
281
|
Provider details: [docs/provider-matrix.md](docs/provider-matrix.md).
|
|
266
282
|
Setup/auth fixes: [docs/troubleshooting.md](docs/troubleshooting.md).
|
|
267
283
|
|
|
@@ -273,12 +289,13 @@ engineer can:
|
|
|
273
289
|
1. install Code Mower in a clean repo;
|
|
274
290
|
2. understand the local/cloud trust boundary;
|
|
275
291
|
3. run `init --easy` and `doctor --preflight`;
|
|
276
|
-
4.
|
|
292
|
+
4. run `lanes status --repo OWNER/REPO` to see active lanes and gate state;
|
|
293
|
+
5. detect and run the repo's native lint/test/build surface instead of assuming
|
|
277
294
|
every project uses the same tools;
|
|
278
|
-
|
|
279
|
-
|
|
295
|
+
6. produce a local value report from known PR outcomes;
|
|
296
|
+
7. decide which lanes should stay informational, selective, or merge-gating;
|
|
280
297
|
and
|
|
281
|
-
|
|
298
|
+
8. optionally upload sanitized metadata to CodeMower.com and see useful team
|
|
282
299
|
dashboard signal.
|
|
283
300
|
|
|
284
301
|
Build-loop templates extend the same loop from "who reviews best?" to "which AI
|
|
@@ -290,11 +307,10 @@ measurement work.
|
|
|
290
307
|
|
|
291
308
|
## Installation Status
|
|
292
309
|
|
|
293
|
-
The
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
pinned package-index install spec is `code-mower==0.5.0b53`.
|
|
310
|
+
The current public beta baseline is `v0.6.0-beta.1`, with pinned package-index
|
|
311
|
+
install spec `code-mower==0.6.0b1`. Release evidence is recorded on the GitHub
|
|
312
|
+
release and in the first-user install rehearsal. The public repository is
|
|
313
|
+
[codemower-ai/code-mower](https://github.com/codemower-ai/code-mower), and
|
|
298
314
|
GitHub releases remain the auditable source for tags, build artifacts, and
|
|
299
315
|
release notes.
|
|
300
316
|
|
|
@@ -307,6 +323,8 @@ scripts/dev-python -m venv .venv
|
|
|
307
323
|
```
|
|
308
324
|
|
|
309
325
|
The wrapper resolves Python 3.12+ and refuses stale or old system Python shims.
|
|
326
|
+
Do not run the CLI by hand-wiring source import paths; install the editable venv
|
|
327
|
+
first so local work exercises the same package entrypoint users install.
|
|
310
328
|
|
|
311
329
|
## Known Limitations
|
|
312
330
|
|
|
@@ -348,6 +366,8 @@ The wrapper resolves Python 3.12+ and refuses stale or old system Python shims.
|
|
|
348
366
|
- [First-User Demo Transcript](docs/first-user-demo-transcript.md)
|
|
349
367
|
- [First-User Install Rehearsal](docs/first-user-install-rehearsal.md)
|
|
350
368
|
- [Launch Command Surface](docs/launch-command-surface.md)
|
|
369
|
+
- [v0.6 Truth Baseline](docs/v06-truth-baseline.md)
|
|
370
|
+
- [v0.6 Release Notes](docs/v06-release-notes.md)
|
|
351
371
|
- [Demo Calibration Example](examples/demo-calibration/README.md)
|
|
352
372
|
- [PyPI Release Runbook](docs/pypi-release.md)
|
|
353
373
|
- [Sample Doctor Output](docs/sample-doctor-output.md)
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "code-mower"
|
|
7
|
-
version = "0.
|
|
7
|
+
version = "0.6.0b1"
|
|
8
8
|
description = "Multi-reviewer AI code audit orchestration"
|
|
9
9
|
requires-python = ">=3.11"
|
|
10
10
|
readme = "README.md"
|
|
@@ -47,8 +47,13 @@ target-version = "py311"
|
|
|
47
47
|
line-length = 100
|
|
48
48
|
|
|
49
49
|
[tool.ruff.lint]
|
|
50
|
-
select = ["E", "F"]
|
|
51
|
-
ignore = [
|
|
50
|
+
select = ["E", "F", "W", "B"]
|
|
51
|
+
ignore = [
|
|
52
|
+
"E501",
|
|
53
|
+
# LaneConfig instances are finite config objects; keep the callable helper
|
|
54
|
+
# shape stable instead of churning call sites for cached_property.
|
|
55
|
+
"B019",
|
|
56
|
+
]
|
|
52
57
|
|
|
53
58
|
[tool.ruff.lint.per-file-ignores]
|
|
54
59
|
"tests/*.py" = ["E402"]
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
"""Optional Antigravity SDK probe helpers."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import importlib
|
|
6
|
+
import importlib.util
|
|
7
|
+
from importlib import metadata
|
|
8
|
+
from typing import Any
|
|
9
|
+
|
|
10
|
+
PACKAGE_NAME = "google-antigravity"
|
|
11
|
+
IMPORT_NAME = "google.antigravity"
|
|
12
|
+
EXPECTED_EXPORTS = (
|
|
13
|
+
"Agent",
|
|
14
|
+
"LocalAgentConfig",
|
|
15
|
+
"CapabilitiesConfig",
|
|
16
|
+
"UsageMetadata",
|
|
17
|
+
"GeminiAPIEndpoint",
|
|
18
|
+
"VertexEndpoint",
|
|
19
|
+
)
|
|
20
|
+
LOCAL_HARNESS_PATH = "google/antigravity/bin/localharness"
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def _dependency_name(requirement: str) -> str:
|
|
24
|
+
text = requirement.split(";", 1)[0].strip()
|
|
25
|
+
for separator in ("<", ">", "=", "!", "~", " "):
|
|
26
|
+
if separator in text:
|
|
27
|
+
text = text.split(separator, 1)[0].strip()
|
|
28
|
+
return text
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def _dependency_names(requirements: list[str] | None) -> tuple[list[str], list[str]]:
|
|
32
|
+
required: set[str] = set()
|
|
33
|
+
optional: set[str] = set()
|
|
34
|
+
for requirement in requirements or []:
|
|
35
|
+
name = _dependency_name(requirement)
|
|
36
|
+
if not name:
|
|
37
|
+
continue
|
|
38
|
+
if "extra ==" in requirement:
|
|
39
|
+
optional.add(name)
|
|
40
|
+
else:
|
|
41
|
+
required.add(name)
|
|
42
|
+
return sorted(required), sorted(optional)
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def _distribution_details(package_name: str) -> dict[str, Any]:
|
|
46
|
+
try:
|
|
47
|
+
distribution = metadata.distribution(package_name)
|
|
48
|
+
except metadata.PackageNotFoundError:
|
|
49
|
+
return {
|
|
50
|
+
"installed": False,
|
|
51
|
+
"package_version": "",
|
|
52
|
+
"dependencies": [],
|
|
53
|
+
"optional_dependencies": [],
|
|
54
|
+
"has_local_harness_binary": False,
|
|
55
|
+
}
|
|
56
|
+
files = distribution.files or []
|
|
57
|
+
dependencies, optional_dependencies = _dependency_names(distribution.requires)
|
|
58
|
+
return {
|
|
59
|
+
"installed": True,
|
|
60
|
+
"package_version": metadata.version(package_name),
|
|
61
|
+
"dependencies": dependencies,
|
|
62
|
+
"optional_dependencies": optional_dependencies,
|
|
63
|
+
"has_local_harness_binary": any(
|
|
64
|
+
str(path).replace("\\", "/") == LOCAL_HARNESS_PATH for path in files
|
|
65
|
+
),
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
def _is_importable(import_name: str) -> bool:
|
|
70
|
+
try:
|
|
71
|
+
return importlib.util.find_spec(import_name) is not None
|
|
72
|
+
except (ImportError, ValueError):
|
|
73
|
+
return False
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
def probe_antigravity_sdk(*, import_api: bool = False) -> dict[str, Any]:
|
|
77
|
+
"""Return metadata-only facts about the optional Antigravity SDK surface."""
|
|
78
|
+
|
|
79
|
+
details = _distribution_details(PACKAGE_NAME)
|
|
80
|
+
importable = _is_importable(IMPORT_NAME)
|
|
81
|
+
report: dict[str, Any] = {
|
|
82
|
+
"mode": "antigravity-sdk-probe",
|
|
83
|
+
"package": PACKAGE_NAME,
|
|
84
|
+
"import_name": IMPORT_NAME,
|
|
85
|
+
"installed": details["installed"],
|
|
86
|
+
"package_version": details["package_version"],
|
|
87
|
+
"dependencies": details["dependencies"],
|
|
88
|
+
"optional_dependencies": details["optional_dependencies"],
|
|
89
|
+
"has_local_harness_binary": details["has_local_harness_binary"],
|
|
90
|
+
"importable": importable,
|
|
91
|
+
"import_api": import_api,
|
|
92
|
+
"api_exports": {},
|
|
93
|
+
"research_posture": "optional_research",
|
|
94
|
+
"privacy": {
|
|
95
|
+
"model_call": False,
|
|
96
|
+
"auth_probe": False,
|
|
97
|
+
"source_or_diff": False,
|
|
98
|
+
"raw_output": False,
|
|
99
|
+
},
|
|
100
|
+
}
|
|
101
|
+
if import_api and importable:
|
|
102
|
+
module = importlib.import_module(IMPORT_NAME)
|
|
103
|
+
report["api_exports"] = {
|
|
104
|
+
name: hasattr(module, name) for name in EXPECTED_EXPORTS
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
missing_exports = [
|
|
108
|
+
name for name, present in report["api_exports"].items() if not present
|
|
109
|
+
]
|
|
110
|
+
if not report["installed"]:
|
|
111
|
+
report["status"] = "warn"
|
|
112
|
+
report["message"] = (
|
|
113
|
+
"optional Antigravity SDK package is not installed; install "
|
|
114
|
+
"google-antigravity in a disposable venv before SDK lane research"
|
|
115
|
+
)
|
|
116
|
+
elif not report["importable"]:
|
|
117
|
+
report["status"] = "warn"
|
|
118
|
+
report["message"] = "optional Antigravity SDK package is installed but not importable"
|
|
119
|
+
elif import_api and missing_exports:
|
|
120
|
+
report["status"] = "warn"
|
|
121
|
+
report["message"] = (
|
|
122
|
+
"optional Antigravity SDK import succeeded but expected API exports "
|
|
123
|
+
"are missing"
|
|
124
|
+
)
|
|
125
|
+
report["missing_exports"] = missing_exports
|
|
126
|
+
else:
|
|
127
|
+
report["status"] = "pass"
|
|
128
|
+
report["message"] = "optional Antigravity SDK probe completed without model calls"
|
|
129
|
+
return report
|
|
@@ -7,8 +7,11 @@ import argparse
|
|
|
7
7
|
import hashlib
|
|
8
8
|
import json
|
|
9
9
|
import re
|
|
10
|
+
import subprocess
|
|
10
11
|
import sys
|
|
12
|
+
import time
|
|
11
13
|
import uuid
|
|
14
|
+
from datetime import datetime, timezone
|
|
12
15
|
from pathlib import Path
|
|
13
16
|
from typing import Any, Iterable, Mapping, Sequence
|
|
14
17
|
|
|
@@ -16,6 +19,7 @@ BUILDER_PLAN_MODE = "code-mower-builder-experiment-plan"
|
|
|
16
19
|
BUILDER_PLAN_SCHEMA = "code_mower.builderExperimentPlan.v1"
|
|
17
20
|
BUILDER_REPORT_MODE = "code-mower-builder-experiment-report"
|
|
18
21
|
BUILDER_REPORT_SCHEMA = "code_mower.builderExperimentReport.v1"
|
|
22
|
+
AUTHORING_RUN_SCHEMA = "code_mower.authoringRun.v1"
|
|
19
23
|
SAFE_SLUG_RE = re.compile(r"[^A-Za-z0-9_.-]+")
|
|
20
24
|
DEFAULT_METRICS = (
|
|
21
25
|
"elapsed_seconds",
|
|
@@ -39,6 +43,16 @@ def _stable_suffix(value: Any, length: int = 8) -> str:
|
|
|
39
43
|
return hashlib.sha256(str(value or "").encode("utf-8")).hexdigest()[:length]
|
|
40
44
|
|
|
41
45
|
|
|
46
|
+
def _sha256_text(value: Any) -> str:
|
|
47
|
+
return "sha256:" + hashlib.sha256(
|
|
48
|
+
json.dumps(value, sort_keys=True).encode("utf-8")
|
|
49
|
+
).hexdigest()
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
def _utc_now() -> str:
|
|
53
|
+
return datetime.now(timezone.utc).replace(microsecond=0).isoformat().replace("+00:00", "Z")
|
|
54
|
+
|
|
55
|
+
|
|
42
56
|
def _identity_slug(value: Any, fallback: str) -> str:
|
|
43
57
|
return f"{_safe_slug(value, fallback)}-{_stable_suffix(value)}"
|
|
44
58
|
|
|
@@ -494,6 +508,111 @@ def render_report_text(report: Mapping[str, Any]) -> str:
|
|
|
494
508
|
return "\n".join(lines) + "\n"
|
|
495
509
|
|
|
496
510
|
|
|
511
|
+
def _load_plan_or_spec(
|
|
512
|
+
path: Path,
|
|
513
|
+
*,
|
|
514
|
+
output_dir: Path = Path(".code-mower/builder-experiments"),
|
|
515
|
+
replicates: int = 1,
|
|
516
|
+
) -> dict[str, Any]:
|
|
517
|
+
payload = dict(_load_json(path))
|
|
518
|
+
if payload.get("schema") == BUILDER_PLAN_SCHEMA or payload.get("runs"):
|
|
519
|
+
return payload
|
|
520
|
+
return build_plan(normalize_spec(payload), output_dir=output_dir, replicates=replicates)
|
|
521
|
+
|
|
522
|
+
|
|
523
|
+
def _planned_run(plan: Mapping[str, Any], run_id: str) -> Mapping[str, Any]:
|
|
524
|
+
for run in plan.get("runs", []) or []:
|
|
525
|
+
if isinstance(run, Mapping) and str(run.get("run_id") or "") == run_id:
|
|
526
|
+
return run
|
|
527
|
+
raise ValueError(f"run_id not found in builder experiment plan: {run_id}")
|
|
528
|
+
|
|
529
|
+
|
|
530
|
+
def _safe_command_metadata(command: Sequence[str]) -> dict[str, Any]:
|
|
531
|
+
executable = Path(str(command[0])).name if command else ""
|
|
532
|
+
return {
|
|
533
|
+
"executable": executable,
|
|
534
|
+
"arg_count": len(command),
|
|
535
|
+
"argv_sha256": _sha256_text(list(command)),
|
|
536
|
+
"stdout_stderr": "not_captured",
|
|
537
|
+
}
|
|
538
|
+
|
|
539
|
+
|
|
540
|
+
def run_authoring_subprocess(
|
|
541
|
+
planned_run: Mapping[str, Any],
|
|
542
|
+
*,
|
|
543
|
+
command: Sequence[str],
|
|
544
|
+
dry_run: bool = False,
|
|
545
|
+
cwd: Path | None = None,
|
|
546
|
+
timeout: float | None = None,
|
|
547
|
+
branch: str = "",
|
|
548
|
+
pull_request: str = "",
|
|
549
|
+
) -> dict[str, Any]:
|
|
550
|
+
if not command:
|
|
551
|
+
raise ValueError("builder-experiment run requires an explicit command after --")
|
|
552
|
+
if cwd is not None and not cwd.is_dir():
|
|
553
|
+
raise ValueError(f"--cwd must be an existing directory: {cwd}")
|
|
554
|
+
started_at = _utc_now()
|
|
555
|
+
ended_at = started_at
|
|
556
|
+
elapsed_seconds = 0.0
|
|
557
|
+
status = "planned"
|
|
558
|
+
exit_code: int | None = None
|
|
559
|
+
if not dry_run:
|
|
560
|
+
started = time.monotonic()
|
|
561
|
+
try:
|
|
562
|
+
result = subprocess.run(
|
|
563
|
+
list(command),
|
|
564
|
+
cwd=str(cwd) if cwd is not None else None,
|
|
565
|
+
stdout=subprocess.DEVNULL,
|
|
566
|
+
stderr=subprocess.DEVNULL,
|
|
567
|
+
timeout=timeout,
|
|
568
|
+
check=False,
|
|
569
|
+
)
|
|
570
|
+
exit_code = result.returncode
|
|
571
|
+
status = "completed" if exit_code == 0 else "failed"
|
|
572
|
+
except subprocess.TimeoutExpired:
|
|
573
|
+
status = "timeout"
|
|
574
|
+
except OSError as exc:
|
|
575
|
+
raise ValueError(
|
|
576
|
+
f"unable to start builder command {Path(str(command[0])).name!r}: "
|
|
577
|
+
f"{getattr(exc, 'strerror', '') or exc}"
|
|
578
|
+
) from None
|
|
579
|
+
elapsed_seconds = round(time.monotonic() - started, 3)
|
|
580
|
+
ended_at = _utc_now()
|
|
581
|
+
|
|
582
|
+
return {
|
|
583
|
+
"schema": AUTHORING_RUN_SCHEMA,
|
|
584
|
+
"run_id": str(planned_run.get("run_id") or ""),
|
|
585
|
+
"experiment_id": str(planned_run.get("experiment_id") or ""),
|
|
586
|
+
"repo": str(planned_run.get("repo") or ""),
|
|
587
|
+
"task_id": str(planned_run.get("task_id") or ""),
|
|
588
|
+
"task_class": str(planned_run.get("task_class") or ""),
|
|
589
|
+
"builder": {
|
|
590
|
+
"provider": str(planned_run.get("provider") or ""),
|
|
591
|
+
"tool": str(planned_run.get("tool") or ""),
|
|
592
|
+
"model": str(planned_run.get("model") or ""),
|
|
593
|
+
},
|
|
594
|
+
"started_at": started_at,
|
|
595
|
+
"ended_at": ended_at,
|
|
596
|
+
"elapsed_seconds": elapsed_seconds,
|
|
597
|
+
"status": status,
|
|
598
|
+
"branch": branch,
|
|
599
|
+
"pull_request": pull_request,
|
|
600
|
+
"executor": {
|
|
601
|
+
"type": "subprocess",
|
|
602
|
+
"dry_run": dry_run,
|
|
603
|
+
"exit_code": exit_code,
|
|
604
|
+
"command": _safe_command_metadata(command),
|
|
605
|
+
},
|
|
606
|
+
"privacy": {
|
|
607
|
+
"source_or_diff": False,
|
|
608
|
+
"transcript": False,
|
|
609
|
+
"raw_stdout_stderr": False,
|
|
610
|
+
"auth_output": False,
|
|
611
|
+
"secrets": False,
|
|
612
|
+
},
|
|
613
|
+
}
|
|
614
|
+
|
|
615
|
+
|
|
497
616
|
def main(argv: list[str] | None = None) -> int:
|
|
498
617
|
parser = argparse.ArgumentParser(prog="code-mower builder-experiment")
|
|
499
618
|
subparsers = parser.add_subparsers(dest="command", required=True)
|
|
@@ -510,16 +629,59 @@ def main(argv: list[str] | None = None) -> int:
|
|
|
510
629
|
report_parser.add_argument("--replicates", type=int, default=1)
|
|
511
630
|
report_parser.add_argument("--output", type=Path)
|
|
512
631
|
report_parser.add_argument("--json", action="store_true")
|
|
513
|
-
|
|
632
|
+
run_parser = subparsers.add_parser("run")
|
|
633
|
+
run_parser.add_argument("spec", type=Path)
|
|
634
|
+
run_parser.add_argument("--run-id", required=True)
|
|
635
|
+
run_parser.add_argument("--output-dir", type=Path, default=Path(".code-mower/builder-experiments"))
|
|
636
|
+
run_parser.add_argument("--replicates", type=int, default=1)
|
|
637
|
+
run_parser.add_argument("--output", type=Path)
|
|
638
|
+
run_parser.add_argument("--cwd", type=Path)
|
|
639
|
+
run_parser.add_argument("--timeout", type=float)
|
|
640
|
+
run_parser.add_argument("--dry-run", action="store_true")
|
|
641
|
+
run_parser.add_argument("--branch", default="")
|
|
642
|
+
run_parser.add_argument("--pull-request", default="")
|
|
643
|
+
run_parser.add_argument("--json", action="store_true")
|
|
644
|
+
raw_argv = list(sys.argv[1:] if argv is None else argv)
|
|
645
|
+
builder_command: list[str] = []
|
|
646
|
+
parse_argv = raw_argv
|
|
647
|
+
if raw_argv[:1] == ["run"] and "--" in raw_argv:
|
|
648
|
+
command_index = raw_argv.index("--")
|
|
649
|
+
builder_command = raw_argv[command_index + 1 :]
|
|
650
|
+
parse_argv = raw_argv[:command_index]
|
|
651
|
+
args = parser.parse_args(parse_argv)
|
|
514
652
|
|
|
515
653
|
try:
|
|
516
|
-
spec = load_spec(args.spec)
|
|
517
|
-
plan = build_plan(spec, output_dir=args.output_dir, replicates=args.replicates)
|
|
518
654
|
if args.command == "plan":
|
|
655
|
+
spec = load_spec(args.spec)
|
|
656
|
+
plan = build_plan(spec, output_dir=args.output_dir, replicates=args.replicates)
|
|
519
657
|
if args.output:
|
|
520
658
|
_write_json(args.output, plan)
|
|
521
659
|
print(json.dumps(plan, indent=2, sort_keys=True) if args.json else render_plan_text(plan))
|
|
522
660
|
return 0
|
|
661
|
+
if args.command == "run":
|
|
662
|
+
plan = _load_plan_or_spec(
|
|
663
|
+
args.spec,
|
|
664
|
+
output_dir=args.output_dir,
|
|
665
|
+
replicates=args.replicates,
|
|
666
|
+
)
|
|
667
|
+
command = builder_command
|
|
668
|
+
planned = _planned_run(plan, args.run_id)
|
|
669
|
+
artifact = run_authoring_subprocess(
|
|
670
|
+
planned,
|
|
671
|
+
command=command,
|
|
672
|
+
dry_run=args.dry_run,
|
|
673
|
+
cwd=args.cwd,
|
|
674
|
+
timeout=args.timeout,
|
|
675
|
+
branch=args.branch,
|
|
676
|
+
pull_request=args.pull_request,
|
|
677
|
+
)
|
|
678
|
+
run_dir = Path(str(planned.get("output_dir") or ".code-mower/authoring-runs"))
|
|
679
|
+
output = args.output or run_dir / f"{_safe_slug(args.run_id)}.json"
|
|
680
|
+
_write_json(output, artifact)
|
|
681
|
+
print(json.dumps(artifact, indent=2, sort_keys=True) if args.json else f"wrote {output}")
|
|
682
|
+
return 0
|
|
683
|
+
spec = load_spec(args.spec)
|
|
684
|
+
plan = build_plan(spec, output_dir=args.output_dir, replicates=args.replicates)
|
|
523
685
|
run_results = load_run_results(args.runs)
|
|
524
686
|
report = build_report(plan, run_results)
|
|
525
687
|
if args.output:
|