code-mower 0.6.0b2__tar.gz → 0.6.0b3__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.6.0b2 → code_mower-0.6.0b3}/PKG-INFO +14 -12
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/README.md +13 -11
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/pyproject.toml +1 -1
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/__init__.py +1 -1
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/doctor.py +32 -1
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/__init__.py +12 -0
- code_mower-0.6.0b3/src/code_mower/doctor_checks/adoption.py +249 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/github_repo.py +6 -1
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/registry.py +14 -1
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/runner.py +23 -1
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/init.py +73 -5
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/lane_status.py +36 -5
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/next_steps.py +1 -1
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/package_content.py +3 -3
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/package_manifest.py +1 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/package_static.py +1 -1
- code_mower-0.6.0b3/src/code_mower/templates/product-support/run_claude_audit_pr.sh +63 -0
- code_mower-0.6.0b3/src/code_mower/templates/product-support/run_codex_audit_pr.sh +63 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/templates/workflows/builder-provenance.yml.j2 +1 -1
- {code_mower-0.6.0b2 → code_mower-0.6.0b3/src/code_mower}/templates/workflows/code-mower-gate-health.yml.j2 +1 -1
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/templates/workflows/code-mower-gate.yml.j2 +1 -1
- {code_mower-0.6.0b2 → code_mower-0.6.0b3/src/code_mower}/templates/workflows/lane-mac-runner.yml.j2 +1 -1
- {code_mower-0.6.0b2 → code_mower-0.6.0b3/src/code_mower}/templates/workflows/private-standalone-shadow.yml.j2 +1 -1
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/templates/workflows/review-clear-stale.yml.j2 +1 -1
- {code_mower-0.6.0b2 → code_mower-0.6.0b3/src/code_mower}/templates/workflows/saas-reviewer-labeler.yml.j2 +1 -1
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/templates/workflows/self-hosted-local-audit.yml.j2 +2 -2
- {code_mower-0.6.0b2 → code_mower-0.6.0b3/src/code_mower}/templates/workflows/trailer-comment-labeler.yml.j2 +1 -1
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/templates/workflows/weekly-status.yml.j2 +1 -1
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower.egg-info/PKG-INFO +14 -12
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower.egg-info/SOURCES.txt +1 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/templates/workflows/blind-review-artifacts-dry-run.yml.j2 +1 -1
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/templates/workflows/builder-provenance.yml.j2 +1 -1
- {code_mower-0.6.0b2/src/code_mower → code_mower-0.6.0b3}/templates/workflows/code-mower-gate-health.yml.j2 +1 -1
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/templates/workflows/code-mower-gate.yml.j2 +1 -1
- {code_mower-0.6.0b2/src/code_mower → code_mower-0.6.0b3}/templates/workflows/lane-mac-runner.yml.j2 +1 -1
- {code_mower-0.6.0b2/src/code_mower → code_mower-0.6.0b3}/templates/workflows/private-standalone-shadow.yml.j2 +1 -1
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/templates/workflows/review-clear-stale.yml.j2 +1 -1
- {code_mower-0.6.0b2/src/code_mower → code_mower-0.6.0b3}/templates/workflows/saas-reviewer-labeler.yml.j2 +1 -1
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/templates/workflows/self-hosted-local-audit.yml.j2 +2 -2
- {code_mower-0.6.0b2/src/code_mower → code_mower-0.6.0b3}/templates/workflows/trailer-comment-labeler.yml.j2 +1 -1
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/tests/test_doctor_boundaries.py +1 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/tests/test_doctor_github_checks.py +1 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/tests/test_doctor_registry.py +149 -1
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/tests/test_lane_status.py +42 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/tests/test_release_hygiene.py +319 -57
- code_mower-0.6.0b2/src/code_mower/templates/product-support/run_claude_audit_pr.sh +0 -32
- code_mower-0.6.0b2/src/code_mower/templates/product-support/run_codex_audit_pr.sh +0 -32
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/CODE_OF_CONDUCT.md +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/LICENSE +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/MANIFEST.in +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/NOTICE +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/SUPPORT.md +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/requirements/requirements.txt +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/setup.cfg +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/adapters/__init__.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/adapters/_base.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/adapters/cursor_bugbot.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/adapters/gitar.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/adapters/greptile.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/adapters/qodo.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/antigravity_cli_audit_pr.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/antigravity_sdk_probe.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/audit_handoff_log.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/audit_labeler_lib.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/audit_limits.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/audit_progress.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/blind_review_artifacts.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/blind_review_coordinator.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/bootstrap.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/builder_experiment.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/builder_runs.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/calibration/__init__.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/calibration/arms.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/calibration/auto_discovery.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/calibration/commands.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/calibration/context_inputs.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/calibration/corpus.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/calibration/effect_report.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/calibration/evidence.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/calibration/evidence_report.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/calibration/identity.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/calibration/metrics.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/calibration/overlap.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/calibration/planning.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/calibration/policy.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/calibration/results.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/calibration/run_results.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/calibration/run_status.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/calibration/runner.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/calibration/truth.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/calibration/value_report.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/checks.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/claude_audit_pr.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/claude_cli_bounce.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/claude_cli_environment.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/clear_stale.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/cli.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/cloud.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/cloud_client/__init__.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/cloud_client/bundle.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/cloud_client/doctor.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/cloud_client/dogfood.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/cloud_client/endpoints.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/cloud_client/errors.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/cloud_client/events.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/cloud_client/export.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/cloud_client/git_metadata.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/cloud_client/manifest.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/cloud_client/operations.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/cloud_client/reports.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/cloud_client/setup.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/cloud_client/tokens.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/cloud_client/upload.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/code_mower_calibration.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/code_mower_context_packs.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/code_mower_merge.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/code_mower_telemetry.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/coderabbit_cli_audit_pr.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/codex_audit_env_preflight.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/codex_audit_pr.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/codex_audit_schema_smoke.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/codex_audit_verdict.schema.json +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/config.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/decisions.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/audit_limits.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/cloud.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/common.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/github.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/github_actions.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/github_actions_cost.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/github_actions_cost_summary.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/github_actions_failure_annotations.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/github_actions_failure_models.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/github_actions_failure_scan.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/github_actions_failure_selection.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/github_actions_failures.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/github_actions_permissions.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/github_api.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/github_branch.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/github_config.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/github_human_token.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/github_provider.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/groups.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/models.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/output.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/presets.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/privacy.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/provider_api_model.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/provider_api_model_openai.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/provider_api_model_profiles.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/provider_env.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/provider_env_required.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/provider_env_tokens.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/provider_local_audit_setup.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/provider_local_cli.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/provider_local_cli_commands.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/provider_local_cli_probe_config.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/provider_probe.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/provider_probe_auth.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/provider_probe_evaluation.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/provider_probe_json.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/provider_probe_remediation.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/provider_review_hygiene.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/providers.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/runtime.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/runtime_github_auth.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/self_hosted_runner.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/gate_health.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/gemini_cli_audit_pr.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/grok_build_audit_pr.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/hermes_cli_audit_pr.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/lane_configs/__init__.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/lane_configs/aider.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/lane_configs/antigravity_cli.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/lane_configs/claude.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/lane_configs/codex.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/lane_configs/devin.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/lane_configs/gemini_cli.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/lane_configs/grok_build.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/lane_configs/hermes_cli.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/lane_configs/local_llm.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/local_llm_audit_pr.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/local_llm_bakeoff.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/local_llm_calibration.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/local_llm_profiles.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/migration.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/migration_install.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/migration_mirror.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/migration_readiness.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/migration_rehearsal.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/observe.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/package.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/package_paths.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/package_rendering.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/plan_context.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/prompts.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/provider_registry.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/provider_runners/__init__.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/provider_runners/comments.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/provider_runners/exit_codes.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/provider_runners/git.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/provider_runners/github_auth.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/provider_runners/github_pr.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/provider_runners/pr_worktree.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/provider_runners/process.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/provider_runners/repo_paths.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/provider_runners/text_schema.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/provider_runners/verdict_artifacts.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/provider_runners/workspace.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/providers/__init__.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/providers/local_cli.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/providers/provenance.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/release_readiness.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/reviewer_metrics.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/reviewer_spend.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/saas_reviewer_labeler.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/secrets.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/templates/builder-experiment.example.json +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/templates/calibration-corpus.example.json +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/templates/calibration-corpus.json +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/templates/code-mower.example.yml +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/templates/context-packs.example.json +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/templates/lane_prompts/base-audit.md +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/templates/lane_prompts/calibration-policy.md +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/templates/lane_prompts/context-driven-quality.md +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/templates/lane_prompts/docs-design.md +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/templates/lane_prompts/generic-programming.md +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/templates/lane_prompts/operability.md +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/templates/lane_prompts/package-runtime.md +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/templates/lane_prompts/plan-conformance.md +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/templates/lane_prompts/security-threat-model.md +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/templates/lanes/README.md +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/templates/lanes/claude.md +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/templates/lanes/codex.md +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/templates/lanes/cursor.md +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/templates/lanes/generic.md +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/templates/lanes/run_mac_lane.sh +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/templates/product-support/code_mower +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/templates/product-support/code_mower_standalone_pin.env +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/templates/product-support/code_mower_standalone_shadow.sh +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/templates/product-support/safe_gh_comment.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/templates/product-support/status_report.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/templates/providers.yml +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/templates/reviewer-spend.example.json +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/templates/reviewer-value-report.example.md +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/templates/workflows/audit-label-cleanup.yml.j2 +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/templates/workflows/code-mower-agent-pr-labeler.yml.j2 +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/templates/workflows/code-mower-fix-round-dispatch.yml.j2 +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/templates/workflows/dispatch-lanes.yml.j2 +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/templates/workflows/hosted-bridge.yml.j2 +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/templates/workflows/local-cli-audit.yml.j2 +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/templates/workflows/needs-owner-notify.yml.j2 +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/trailer_comment_labeler.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/versioning.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/work_orders.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/workflow_actionlint.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower.egg-info/dependency_links.txt +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower.egg-info/entry_points.txt +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower.egg-info/requires.txt +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower.egg-info/top_level.txt +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/templates/builder-experiment.example.json +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/templates/calibration-corpus.example.json +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/templates/calibration-corpus.json +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/templates/code-mower.yml.j2 +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/templates/context-packs.example.json +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/templates/cursor/BUGBOT.md +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/templates/lanes/README.md +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/templates/lanes/claude.md +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/templates/lanes/codex.md +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/templates/lanes/cursor.md +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/templates/lanes/generic.md +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/templates/lanes/run_mac_lane.sh +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/templates/providers/acp_bridge.yml +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/templates/providers/aider.yml +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/templates/providers/antigravity_cli.yml +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/templates/providers/claude_audit.yml +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/templates/providers/claude_review.yml +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/templates/providers/coderabbit_cli.yml +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/templates/providers/codex.yml +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/templates/providers/cursor_bugbot.yml +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/templates/providers/devin.yml +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/templates/providers/gemini_cli.yml +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/templates/providers/gitar.yml +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/templates/providers/greptile.yml +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/templates/providers/hermes_cli.yml +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/templates/providers/local_llm.yml +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/templates/providers/qodo.yml +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/templates/providers.yml +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/templates/reviewer-spend.example.json +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/templates/reviewer-value-report.example.md +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/templates/workflows/audit-label-cleanup.yml.j2 +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/templates/workflows/code-mower-agent-pr-labeler.yml.j2 +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/templates/workflows/code-mower-fix-round-dispatch.yml.j2 +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/templates/workflows/dispatch-lanes.yml.j2 +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/templates/workflows/hosted-bridge.yml.j2 +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/templates/workflows/local-cli-audit.yml.j2 +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/tests/test_antigravity_sdk_probe.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/tests/test_audit_comment_posture.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/tests/test_audit_limits.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/tests/test_builder_experiment.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/tests/test_builder_identity.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/tests/test_builder_runs.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/tests/test_calibration_effect_report.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/tests/test_calibration_truth.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/tests/test_checks.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/tests/test_claude_audit_pr.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/tests/test_claude_cli_bounce.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/tests/test_clear_stale.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/tests/test_cloud_client.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/tests/test_cloud_git_metadata.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/tests/test_cloud_manifest.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/tests/test_cloud_reports.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/tests/test_coderabbit_cli_audit_pr.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/tests/test_codex_audit_env_preflight.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/tests/test_codex_audit_pr.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/tests/test_decision_audit_integration.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/tests/test_decisions.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/tests/test_doctor_actions_cost_summary.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/tests/test_doctor_actions_failure_selection.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/tests/test_doctor_output.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/tests/test_doctor_privacy.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/tests/test_doctor_provider_env_required.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/tests/test_doctor_provider_env_tokens.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/tests/test_doctor_provider_local_audit_setup.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/tests/test_doctor_provider_probe.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/tests/test_doctor_provider_review_hygiene.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/tests/test_doctor_runtime.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/tests/test_doctor_self_hosted_runner.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/tests/test_gate_health.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/tests/test_init_actionlint.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/tests/test_init_build_loop.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/tests/test_local_llm_github_helpers.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/tests/test_observe.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/tests/test_plan_context.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/tests/test_prompts.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/tests/test_provider_fixture_contracts.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/tests/test_provider_local_cli.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/tests/test_provider_runners_comments.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/tests/test_provider_runners_git.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/tests/test_provider_runners_github_pr.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/tests/test_provider_runners_pr_worktree.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/tests/test_provider_runners_process.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/tests/test_provider_runners_repo_paths.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/tests/test_provider_runners_text_schema.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/tests/test_provider_runners_workspace.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/tests/test_reviewer_metrics_core.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/tests/test_reviewer_spend.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/tests/test_trailer_comment_labeler.py +0 -0
- {code_mower-0.6.0b2 → code_mower-0.6.0b3}/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.6.
|
|
3
|
+
Version: 0.6.0b3
|
|
4
4
|
Summary: Multi-reviewer AI code audit orchestration
|
|
5
5
|
License-Expression: Apache-2.0
|
|
6
6
|
Requires-Python: >=3.11
|
|
@@ -57,15 +57,16 @@ Code Mower should feel like an engineering tool, not a demo harness:
|
|
|
57
57
|
|
|
58
58
|
## What It Looks Like
|
|
59
59
|
|
|
60
|
-
`code-mower doctor --
|
|
61
|
-
runtime, GitHub setup, provider CLIs,
|
|
62
|
-
private-repo Actions cost traps
|
|
63
|
-
|
|
60
|
+
`code-mower doctor --adoption --repo OWNER/REPO` is the first useful command
|
|
61
|
+
for a real repository. It checks your runtime, GitHub setup, provider CLIs,
|
|
62
|
+
token posture, optional cloud setup, private-repo Actions cost traps, and
|
|
63
|
+
first-run adoption gaps. `--preflight` remains the compatibility preset for
|
|
64
|
+
older scripts; `--adoption` adds explicit repo targeting and setup guidance.
|
|
64
65
|
|
|
65
66
|
Example, shortened:
|
|
66
67
|
|
|
67
68
|
```text
|
|
68
|
-
$ code-mower doctor --
|
|
69
|
+
$ code-mower doctor --adoption --repo OWNER/REPO
|
|
69
70
|
PASS config.validate config validates
|
|
70
71
|
PASS profile.select selected profile: codex, claude_audit, gitar
|
|
71
72
|
PASS runtime.python Python 3.12 satisfies Code Mower requirements
|
|
@@ -112,12 +113,12 @@ observable.
|
|
|
112
113
|
|
|
113
114
|
| Path | Use When | Route | Guide |
|
|
114
115
|
| --- | --- | --- | --- |
|
|
115
|
-
| A. Reviewer gate in 10 minutes | You want one audited PR before recurring workflows or builder dispatch. | Install, run `init --easy`, run `doctor --
|
|
116
|
+
| A. Reviewer gate in 10 minutes | You want one audited PR before recurring workflows or builder dispatch. | Install, run `init --easy`, run `doctor --adoption --repo OWNER/REPO`, 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) |
|
|
116
117
|
| 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
118
|
| 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) |
|
|
118
119
|
|
|
119
120
|
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.
|
|
121
|
+
[Try Code Mower In 10 Minutes](https://github.com/codemower-ai/code-mower/blob/v0.6.0-beta.3/docs/try-in-10-minutes.md)
|
|
121
122
|
guide.
|
|
122
123
|
|
|
123
124
|
## What Calibration Does And Does Not Prove
|
|
@@ -147,7 +148,7 @@ Provider-contract baseline for the next release train:
|
|
|
147
148
|
|
|
148
149
|
For release verification,
|
|
149
150
|
[First-User Install Rehearsal](docs/first-user-install-rehearsal.md) records
|
|
150
|
-
the package-index procedure for `v0.6.0-beta.
|
|
151
|
+
the package-index procedure for `v0.6.0-beta.3` / `code-mower==0.6.0b3`. The
|
|
151
152
|
GitHub release records the workflow and rehearsal evidence for the exact tag.
|
|
152
153
|
|
|
153
154
|
## Optional: Plan Before Coding
|
|
@@ -309,7 +310,7 @@ engineer can:
|
|
|
309
310
|
|
|
310
311
|
1. install Code Mower in a clean repo;
|
|
311
312
|
2. understand the local/cloud trust boundary;
|
|
312
|
-
3. run `init --easy` and `doctor --
|
|
313
|
+
3. run `init --easy` and `doctor --adoption --repo OWNER/REPO`;
|
|
313
314
|
4. run `lanes status --repo OWNER/REPO` to see active lanes and gate state;
|
|
314
315
|
5. detect and run the repo's native lint/test/build surface instead of assuming
|
|
315
316
|
every project uses the same tools;
|
|
@@ -328,8 +329,8 @@ measurement work.
|
|
|
328
329
|
|
|
329
330
|
## Installation Status
|
|
330
331
|
|
|
331
|
-
The current public beta baseline is `v0.6.0-beta.
|
|
332
|
-
install spec `code-mower==0.6.
|
|
332
|
+
The current public beta baseline is `v0.6.0-beta.3`, with pinned package-index
|
|
333
|
+
install spec `code-mower==0.6.0b3`. Release evidence is recorded on the GitHub
|
|
333
334
|
release and in the first-user install rehearsal. The public repository is
|
|
334
335
|
[codemower-ai/code-mower](https://github.com/codemower-ai/code-mower), and
|
|
335
336
|
GitHub releases remain the auditable source for tags, build artifacts, and
|
|
@@ -372,6 +373,7 @@ first so local work exercises the same package entrypoint users install.
|
|
|
372
373
|
- [Try Code Mower In 10 Minutes](docs/try-in-10-minutes.md)
|
|
373
374
|
- [Build Loop In 30 Minutes](docs/build-loop-in-30-minutes.md)
|
|
374
375
|
- [Quickstart Reference](docs/quickstart.md)
|
|
376
|
+
- [Orchestrator Prompt Pack](docs/orchestrator-prompt-pack.md)
|
|
375
377
|
- [Planning And Work Orders](docs/planning-work-orders.md)
|
|
376
378
|
- [Builder Providers: Grok And Cursor](docs/builders-grok-cursor.md)
|
|
377
379
|
- [Build Loop Operations](docs/build-loop.md)
|
|
@@ -42,15 +42,16 @@ Code Mower should feel like an engineering tool, not a demo harness:
|
|
|
42
42
|
|
|
43
43
|
## What It Looks Like
|
|
44
44
|
|
|
45
|
-
`code-mower doctor --
|
|
46
|
-
runtime, GitHub setup, provider CLIs,
|
|
47
|
-
private-repo Actions cost traps
|
|
48
|
-
|
|
45
|
+
`code-mower doctor --adoption --repo OWNER/REPO` is the first useful command
|
|
46
|
+
for a real repository. It checks your runtime, GitHub setup, provider CLIs,
|
|
47
|
+
token posture, optional cloud setup, private-repo Actions cost traps, and
|
|
48
|
+
first-run adoption gaps. `--preflight` remains the compatibility preset for
|
|
49
|
+
older scripts; `--adoption` adds explicit repo targeting and setup guidance.
|
|
49
50
|
|
|
50
51
|
Example, shortened:
|
|
51
52
|
|
|
52
53
|
```text
|
|
53
|
-
$ code-mower doctor --
|
|
54
|
+
$ code-mower doctor --adoption --repo OWNER/REPO
|
|
54
55
|
PASS config.validate config validates
|
|
55
56
|
PASS profile.select selected profile: codex, claude_audit, gitar
|
|
56
57
|
PASS runtime.python Python 3.12 satisfies Code Mower requirements
|
|
@@ -97,12 +98,12 @@ observable.
|
|
|
97
98
|
|
|
98
99
|
| Path | Use When | Route | Guide |
|
|
99
100
|
| --- | --- | --- | --- |
|
|
100
|
-
| A. Reviewer gate in 10 minutes | You want one audited PR before recurring workflows or builder dispatch. | Install, run `init --easy`, run `doctor --
|
|
101
|
+
| A. Reviewer gate in 10 minutes | You want one audited PR before recurring workflows or builder dispatch. | Install, run `init --easy`, run `doctor --adoption --repo OWNER/REPO`, 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) |
|
|
101
102
|
| 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
103
|
| 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) |
|
|
103
104
|
|
|
104
105
|
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.
|
|
106
|
+
[Try Code Mower In 10 Minutes](https://github.com/codemower-ai/code-mower/blob/v0.6.0-beta.3/docs/try-in-10-minutes.md)
|
|
106
107
|
guide.
|
|
107
108
|
|
|
108
109
|
## What Calibration Does And Does Not Prove
|
|
@@ -132,7 +133,7 @@ Provider-contract baseline for the next release train:
|
|
|
132
133
|
|
|
133
134
|
For release verification,
|
|
134
135
|
[First-User Install Rehearsal](docs/first-user-install-rehearsal.md) records
|
|
135
|
-
the package-index procedure for `v0.6.0-beta.
|
|
136
|
+
the package-index procedure for `v0.6.0-beta.3` / `code-mower==0.6.0b3`. The
|
|
136
137
|
GitHub release records the workflow and rehearsal evidence for the exact tag.
|
|
137
138
|
|
|
138
139
|
## Optional: Plan Before Coding
|
|
@@ -294,7 +295,7 @@ engineer can:
|
|
|
294
295
|
|
|
295
296
|
1. install Code Mower in a clean repo;
|
|
296
297
|
2. understand the local/cloud trust boundary;
|
|
297
|
-
3. run `init --easy` and `doctor --
|
|
298
|
+
3. run `init --easy` and `doctor --adoption --repo OWNER/REPO`;
|
|
298
299
|
4. run `lanes status --repo OWNER/REPO` to see active lanes and gate state;
|
|
299
300
|
5. detect and run the repo's native lint/test/build surface instead of assuming
|
|
300
301
|
every project uses the same tools;
|
|
@@ -313,8 +314,8 @@ measurement work.
|
|
|
313
314
|
|
|
314
315
|
## Installation Status
|
|
315
316
|
|
|
316
|
-
The current public beta baseline is `v0.6.0-beta.
|
|
317
|
-
install spec `code-mower==0.6.
|
|
317
|
+
The current public beta baseline is `v0.6.0-beta.3`, with pinned package-index
|
|
318
|
+
install spec `code-mower==0.6.0b3`. Release evidence is recorded on the GitHub
|
|
318
319
|
release and in the first-user install rehearsal. The public repository is
|
|
319
320
|
[codemower-ai/code-mower](https://github.com/codemower-ai/code-mower), and
|
|
320
321
|
GitHub releases remain the auditable source for tags, build artifacts, and
|
|
@@ -357,6 +358,7 @@ first so local work exercises the same package entrypoint users install.
|
|
|
357
358
|
- [Try Code Mower In 10 Minutes](docs/try-in-10-minutes.md)
|
|
358
359
|
- [Build Loop In 30 Minutes](docs/build-loop-in-30-minutes.md)
|
|
359
360
|
- [Quickstart Reference](docs/quickstart.md)
|
|
361
|
+
- [Orchestrator Prompt Pack](docs/orchestrator-prompt-pack.md)
|
|
360
362
|
- [Planning And Work Orders](docs/planning-work-orders.md)
|
|
361
363
|
- [Builder Providers: Grok And Cursor](docs/builders-grok-cursor.md)
|
|
362
364
|
- [Build Loop Operations](docs/build-loop.md)
|
|
@@ -47,6 +47,8 @@ resolve_doctor_provider_templates_path = _doctor_checks.resolve_doctor_provider_
|
|
|
47
47
|
run_doctor = _doctor_checks.run_doctor
|
|
48
48
|
_token_file_mentions_cloud_token = _doctor_checks.token_file_mentions_cloud_token
|
|
49
49
|
_apply_first_run_defaults = _doctor_checks.apply_first_run_defaults
|
|
50
|
+
detect_repo_slug = _doctor_checks.detect_repo_slug
|
|
51
|
+
normalize_repo_slug = _doctor_checks.normalize_repo_slug
|
|
50
52
|
|
|
51
53
|
|
|
52
54
|
_DOCTOR_COMPAT_EXPORTS = (
|
|
@@ -101,6 +103,22 @@ def main(argv: Sequence[str] | None = None) -> int:
|
|
|
101
103
|
"--profile recommended --probe-runtime --github --cloud"
|
|
102
104
|
),
|
|
103
105
|
)
|
|
106
|
+
parser.add_argument(
|
|
107
|
+
"--adoption",
|
|
108
|
+
action="store_true",
|
|
109
|
+
help=(
|
|
110
|
+
"first-run adoption preset: run preflight checks against the "
|
|
111
|
+
"explicit or inferred GitHub repository and surface setup gaps"
|
|
112
|
+
),
|
|
113
|
+
)
|
|
114
|
+
parser.add_argument(
|
|
115
|
+
"--repo",
|
|
116
|
+
metavar="OWNER/REPO",
|
|
117
|
+
help=(
|
|
118
|
+
"GitHub repository to inspect; adoption mode infers remote.origin "
|
|
119
|
+
"when omitted"
|
|
120
|
+
),
|
|
121
|
+
)
|
|
104
122
|
parser.add_argument("--probe-runtime", action="store_true")
|
|
105
123
|
parser.add_argument(
|
|
106
124
|
"--github",
|
|
@@ -136,16 +154,29 @@ def main(argv: Sequence[str] | None = None) -> int:
|
|
|
136
154
|
parser.add_argument("--json", action="store_true")
|
|
137
155
|
args = parser.parse_args(argv)
|
|
138
156
|
|
|
157
|
+
if args.adoption:
|
|
158
|
+
args.preflight = True
|
|
139
159
|
_apply_first_run_defaults(args)
|
|
140
160
|
if args.easy and args.profile is None:
|
|
141
161
|
args.profile = "recommended"
|
|
142
162
|
|
|
143
163
|
try:
|
|
164
|
+
repo_slug = ""
|
|
165
|
+
repo_source = ""
|
|
166
|
+
if args.repo:
|
|
167
|
+
repo_slug = normalize_repo_slug(args.repo, option="--repo")
|
|
168
|
+
repo_source = "explicit"
|
|
169
|
+
elif args.adoption:
|
|
170
|
+
repo_slug = detect_repo_slug(Path.cwd())
|
|
171
|
+
repo_source = "git_remote" if repo_slug else ""
|
|
144
172
|
provider_templates_path = resolve_doctor_provider_templates_path(args.provider_templates)
|
|
145
173
|
report = run_doctor(
|
|
146
174
|
config_path=resolve_doctor_config_path(args.config, easy=args.easy),
|
|
147
175
|
provider_templates_path=provider_templates_path,
|
|
148
176
|
profile=args.profile,
|
|
177
|
+
repo_slug=repo_slug,
|
|
178
|
+
repo_source=repo_source,
|
|
179
|
+
adoption=args.adoption,
|
|
149
180
|
probe_runtime=args.probe_runtime,
|
|
150
181
|
github=args.github,
|
|
151
182
|
cloud=args.cloud,
|
|
@@ -154,7 +185,7 @@ def main(argv: Sequence[str] | None = None) -> int:
|
|
|
154
185
|
actions_cost_sample=args.actions_cost_sample,
|
|
155
186
|
actionlint_bin=args.actionlint_bin,
|
|
156
187
|
)
|
|
157
|
-
except code_mower_config.ConfigError as exc:
|
|
188
|
+
except (code_mower_config.ConfigError, ValueError) as exc:
|
|
158
189
|
print(f"error: {exc}", file=sys.stderr)
|
|
159
190
|
return 1
|
|
160
191
|
|
|
@@ -12,6 +12,13 @@ from .cloud import (
|
|
|
12
12
|
check_cloud_token_surface,
|
|
13
13
|
token_file_mentions_cloud_token,
|
|
14
14
|
)
|
|
15
|
+
from .adoption import (
|
|
16
|
+
check_adoption_setup,
|
|
17
|
+
config_with_repository_target,
|
|
18
|
+
detect_repo_slug,
|
|
19
|
+
normalize_repo_slug,
|
|
20
|
+
repo_slug_from_remote,
|
|
21
|
+
)
|
|
15
22
|
from .common import (
|
|
16
23
|
ACTIONS_COST_SAMPLE_DEFAULT,
|
|
17
24
|
ACTIONS_COST_SAMPLE_MAX,
|
|
@@ -98,6 +105,7 @@ __all__ = [
|
|
|
98
105
|
"auth_probe_output_detail",
|
|
99
106
|
"build_doctor_run_plan",
|
|
100
107
|
"check_cloud_token_surface",
|
|
108
|
+
"check_adoption_setup",
|
|
101
109
|
"check_github_auth_surface",
|
|
102
110
|
"check_macos_runner_launchagent",
|
|
103
111
|
"check_github_setup",
|
|
@@ -116,7 +124,9 @@ __all__ = [
|
|
|
116
124
|
"check_pytest",
|
|
117
125
|
"check_python_runtime",
|
|
118
126
|
"check_ripgrep",
|
|
127
|
+
"config_with_repository_target",
|
|
119
128
|
"default_check_group_ids",
|
|
129
|
+
"detect_repo_slug",
|
|
120
130
|
"doctor_check_group_id",
|
|
121
131
|
"doctor_output_group",
|
|
122
132
|
"effective_lane",
|
|
@@ -125,11 +135,13 @@ __all__ = [
|
|
|
125
135
|
"human_automation_token_required",
|
|
126
136
|
"load_inputs",
|
|
127
137
|
"local_cli_probe_remediation",
|
|
138
|
+
"normalize_repo_slug",
|
|
128
139
|
"provider_template_coverage",
|
|
129
140
|
"render_doctor_text",
|
|
130
141
|
"resolve_doctor_config_path",
|
|
131
142
|
"resolve_doctor_config_path_for_script",
|
|
132
143
|
"resolve_doctor_provider_templates_path",
|
|
144
|
+
"repo_slug_from_remote",
|
|
133
145
|
"run_doctor",
|
|
134
146
|
"selected_lanes",
|
|
135
147
|
"token_file_mentions_cloud_token",
|
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
"""First-run adoption checks for doctor."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import re
|
|
6
|
+
import subprocess
|
|
7
|
+
from pathlib import Path
|
|
8
|
+
from typing import Any, Mapping
|
|
9
|
+
|
|
10
|
+
from .models import STATUS_PASS, STATUS_WARN, DoctorCheck
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
OWNER_REPO_RE = re.compile(r"^[A-Za-z0-9_.-]+/[A-Za-z0-9_.-]+$")
|
|
14
|
+
OWNER_LOGIN_PLACEHOLDER = "TODO_OWNER_LOGIN"
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def normalize_repo_slug(value: str, *, option: str = "--repo") -> str:
|
|
18
|
+
"""Return a validated GitHub owner/repo slug."""
|
|
19
|
+
|
|
20
|
+
slug = value.strip().strip("/")
|
|
21
|
+
if not OWNER_REPO_RE.fullmatch(slug):
|
|
22
|
+
raise ValueError(f"{option} expects an OWNER/REPO slug")
|
|
23
|
+
return slug
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def repo_slug_from_remote(remote_url: str) -> str:
|
|
27
|
+
"""Extract owner/repo from common GitHub remote URL forms."""
|
|
28
|
+
|
|
29
|
+
remote = remote_url.strip()
|
|
30
|
+
if remote.startswith("git@github.com:"):
|
|
31
|
+
remote = remote.removeprefix("git@github.com:")
|
|
32
|
+
elif remote.startswith("https://github.com/"):
|
|
33
|
+
remote = remote.removeprefix("https://github.com/")
|
|
34
|
+
elif remote.startswith("http://github.com/"):
|
|
35
|
+
remote = remote.removeprefix("http://github.com/")
|
|
36
|
+
elif remote.startswith("ssh://git@github.com/"):
|
|
37
|
+
remote = remote.removeprefix("ssh://git@github.com/")
|
|
38
|
+
else:
|
|
39
|
+
return ""
|
|
40
|
+
remote = remote.removesuffix(".git").strip("/")
|
|
41
|
+
parts = remote.split("/")
|
|
42
|
+
if len(parts) < 2:
|
|
43
|
+
return ""
|
|
44
|
+
slug = f"{parts[0]}/{parts[1]}"
|
|
45
|
+
return slug if OWNER_REPO_RE.fullmatch(slug) else ""
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def detect_repo_slug(repo_path: Path, *, git_bin: str = "git") -> str:
|
|
49
|
+
"""Detect the current checkout's GitHub owner/repo slug."""
|
|
50
|
+
|
|
51
|
+
try:
|
|
52
|
+
completed = subprocess.run(
|
|
53
|
+
[git_bin, "-C", str(repo_path), "config", "--get", "remote.origin.url"],
|
|
54
|
+
text=True,
|
|
55
|
+
stdout=subprocess.PIPE,
|
|
56
|
+
stderr=subprocess.PIPE,
|
|
57
|
+
check=False,
|
|
58
|
+
)
|
|
59
|
+
except OSError:
|
|
60
|
+
return ""
|
|
61
|
+
if completed.returncode != 0:
|
|
62
|
+
return ""
|
|
63
|
+
return repo_slug_from_remote(completed.stdout)
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
def config_with_repository_target(
|
|
67
|
+
config: Mapping[str, Any],
|
|
68
|
+
repo_slug: str,
|
|
69
|
+
) -> Mapping[str, Any]:
|
|
70
|
+
"""Return a config copy whose GitHub checks target repo_slug."""
|
|
71
|
+
|
|
72
|
+
repositories = [
|
|
73
|
+
repo for repo in config.get("repositories") or [] if isinstance(repo, Mapping)
|
|
74
|
+
]
|
|
75
|
+
source_repo = next(
|
|
76
|
+
(repo for repo in repositories if str(repo.get("slug") or "") == repo_slug),
|
|
77
|
+
repositories[0] if repositories else {},
|
|
78
|
+
)
|
|
79
|
+
default_branch = str(source_repo.get("default_branch") or "main")
|
|
80
|
+
local_path_env = str(source_repo.get("local_path_env") or "")
|
|
81
|
+
target: dict[str, str] = {"slug": repo_slug, "default_branch": default_branch}
|
|
82
|
+
if local_path_env:
|
|
83
|
+
target["local_path_env"] = local_path_env
|
|
84
|
+
return {**dict(config), "repositories": [target]}
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
def _configured_owner_login(config: Mapping[str, Any] | None) -> str:
|
|
88
|
+
if not isinstance(config, Mapping):
|
|
89
|
+
return ""
|
|
90
|
+
owner_surface = config.get("owner_surface")
|
|
91
|
+
if not isinstance(owner_surface, Mapping):
|
|
92
|
+
return ""
|
|
93
|
+
return str(owner_surface.get("owner_login") or "").strip()
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
def _configured_repositories(config: Mapping[str, Any] | None) -> list[str]:
|
|
97
|
+
if not isinstance(config, Mapping):
|
|
98
|
+
return []
|
|
99
|
+
slugs: list[str] = []
|
|
100
|
+
for repo in config.get("repositories") or []:
|
|
101
|
+
if isinstance(repo, Mapping) and repo.get("slug"):
|
|
102
|
+
slugs.append(str(repo.get("slug")))
|
|
103
|
+
return slugs
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
def check_adoption_setup(
|
|
107
|
+
*,
|
|
108
|
+
config: Mapping[str, Any] | None,
|
|
109
|
+
config_path: Path,
|
|
110
|
+
adoption: bool,
|
|
111
|
+
repo_slug: str,
|
|
112
|
+
repo_source: str,
|
|
113
|
+
using_packaged_example: bool,
|
|
114
|
+
) -> tuple[DoctorCheck, ...]:
|
|
115
|
+
"""Return first-run adoption posture checks."""
|
|
116
|
+
|
|
117
|
+
if not adoption and not repo_slug and not using_packaged_example:
|
|
118
|
+
return ()
|
|
119
|
+
|
|
120
|
+
checks: list[DoctorCheck] = []
|
|
121
|
+
if repo_slug:
|
|
122
|
+
checks.append(
|
|
123
|
+
DoctorCheck(
|
|
124
|
+
name="doctor.repo",
|
|
125
|
+
status=STATUS_PASS,
|
|
126
|
+
message=f"GitHub target repository: {repo_slug}",
|
|
127
|
+
detail={"repo": repo_slug, "source": repo_source or "explicit"},
|
|
128
|
+
)
|
|
129
|
+
)
|
|
130
|
+
elif not adoption:
|
|
131
|
+
pass
|
|
132
|
+
else:
|
|
133
|
+
checks.append(
|
|
134
|
+
DoctorCheck(
|
|
135
|
+
name="doctor.repo",
|
|
136
|
+
status=STATUS_WARN,
|
|
137
|
+
message="adoption checks could not infer the GitHub repository",
|
|
138
|
+
detail={"repo": "", "source": ""},
|
|
139
|
+
remediation=(
|
|
140
|
+
"Run from a GitHub checkout or pass "
|
|
141
|
+
"`code-mower doctor --adoption --repo OWNER/REPO`."
|
|
142
|
+
),
|
|
143
|
+
)
|
|
144
|
+
)
|
|
145
|
+
|
|
146
|
+
repositories = _configured_repositories(config)
|
|
147
|
+
if using_packaged_example:
|
|
148
|
+
checks.append(
|
|
149
|
+
DoctorCheck(
|
|
150
|
+
name="doctor.adoption.config_source",
|
|
151
|
+
status=STATUS_WARN,
|
|
152
|
+
message="using packaged starter config for adoption checks",
|
|
153
|
+
detail={
|
|
154
|
+
"config_path": str(config_path),
|
|
155
|
+
"configured_repositories": repositories,
|
|
156
|
+
"effective_repository": repo_slug,
|
|
157
|
+
},
|
|
158
|
+
remediation=(
|
|
159
|
+
"Run `code-mower init --easy --apply`, review the generated "
|
|
160
|
+
"setup, and commit an edited code-mower.yml before relying "
|
|
161
|
+
"on recurring workflows."
|
|
162
|
+
),
|
|
163
|
+
)
|
|
164
|
+
)
|
|
165
|
+
else:
|
|
166
|
+
checks.append(
|
|
167
|
+
DoctorCheck(
|
|
168
|
+
name="doctor.adoption.config_source",
|
|
169
|
+
status=STATUS_PASS,
|
|
170
|
+
message="using repository Code Mower config",
|
|
171
|
+
detail={
|
|
172
|
+
"config_path": str(config_path),
|
|
173
|
+
"configured_repositories": repositories,
|
|
174
|
+
"effective_repository": repo_slug,
|
|
175
|
+
},
|
|
176
|
+
)
|
|
177
|
+
)
|
|
178
|
+
|
|
179
|
+
if (
|
|
180
|
+
repo_slug
|
|
181
|
+
and repo_source == "git_remote"
|
|
182
|
+
and repositories
|
|
183
|
+
and repo_slug not in repositories
|
|
184
|
+
and not using_packaged_example
|
|
185
|
+
):
|
|
186
|
+
checks.append(
|
|
187
|
+
DoctorCheck(
|
|
188
|
+
name="doctor.adoption.repo_mismatch",
|
|
189
|
+
status=STATUS_WARN,
|
|
190
|
+
message="remote origin does not match code-mower.yml repositories",
|
|
191
|
+
detail={
|
|
192
|
+
"inferred_repository": repo_slug,
|
|
193
|
+
"configured_repositories": repositories,
|
|
194
|
+
},
|
|
195
|
+
remediation=(
|
|
196
|
+
"Pass `--repo OWNER/REPO` to choose an explicit target, or "
|
|
197
|
+
"update code-mower.yml or remote.origin.url so doctor and "
|
|
198
|
+
"the committed config agree."
|
|
199
|
+
),
|
|
200
|
+
)
|
|
201
|
+
)
|
|
202
|
+
|
|
203
|
+
if not adoption and not repo_slug:
|
|
204
|
+
return tuple(checks)
|
|
205
|
+
|
|
206
|
+
owner_login = _configured_owner_login(config)
|
|
207
|
+
if not owner_login or owner_login.lower() == OWNER_LOGIN_PLACEHOLDER.lower():
|
|
208
|
+
checks.append(
|
|
209
|
+
DoctorCheck(
|
|
210
|
+
name="doctor.adoption.owner_login",
|
|
211
|
+
status=STATUS_WARN,
|
|
212
|
+
message="owner_surface.owner_login is not configured",
|
|
213
|
+
detail={"owner_login": owner_login},
|
|
214
|
+
remediation=(
|
|
215
|
+
"Set owner_surface.owner_login to the decision owner's "
|
|
216
|
+
"GitHub login before trusting manual decisions or owner "
|
|
217
|
+
"notifications."
|
|
218
|
+
),
|
|
219
|
+
)
|
|
220
|
+
)
|
|
221
|
+
else:
|
|
222
|
+
checks.append(
|
|
223
|
+
DoctorCheck(
|
|
224
|
+
name="doctor.adoption.owner_login",
|
|
225
|
+
status=STATUS_PASS,
|
|
226
|
+
message=f"owner decision login configured: {owner_login}",
|
|
227
|
+
detail={"owner_login": owner_login},
|
|
228
|
+
)
|
|
229
|
+
)
|
|
230
|
+
|
|
231
|
+
checks.append(
|
|
232
|
+
DoctorCheck(
|
|
233
|
+
name="doctor.adoption.trusted_authors",
|
|
234
|
+
status=STATUS_WARN,
|
|
235
|
+
message="human-run audit comments must be listed as trusted lane authors",
|
|
236
|
+
detail={
|
|
237
|
+
"variables": [
|
|
238
|
+
"CLAUDE_AUDIT_BOT_AUTHORS",
|
|
239
|
+
"CODEX_BOT_AUTHORS",
|
|
240
|
+
]
|
|
241
|
+
},
|
|
242
|
+
remediation=(
|
|
243
|
+
"For manual pilot audits, set repository variables such as "
|
|
244
|
+
"CLAUDE_AUDIT_BOT_AUTHORS and CODEX_BOT_AUTHORS to the "
|
|
245
|
+
"GitHub logins that may post trusted audit verdicts."
|
|
246
|
+
),
|
|
247
|
+
)
|
|
248
|
+
)
|
|
249
|
+
return tuple(checks)
|
|
@@ -146,6 +146,11 @@ def check_repo_auto_merge(*, slug: str, repo_payload: Mapping[str, Any]) -> Doct
|
|
|
146
146
|
remediation=(
|
|
147
147
|
None
|
|
148
148
|
if allow_auto_merge
|
|
149
|
-
else
|
|
149
|
+
else (
|
|
150
|
+
"During an informational pilot this is expected; enable "
|
|
151
|
+
"repository auto-merge only when a reviewer lane meets "
|
|
152
|
+
"docs/lane-promotion-policy.md and code-mower/gate is required. "
|
|
153
|
+
f"Promotion command: `gh api -X PATCH repos/{slug} -f allow_auto_merge=true`."
|
|
154
|
+
)
|
|
150
155
|
),
|
|
151
156
|
)
|
|
@@ -27,6 +27,7 @@ class DoctorCheckStage:
|
|
|
27
27
|
|
|
28
28
|
DEFAULT_CHECK_GROUPS = (
|
|
29
29
|
DoctorCheckGroup("runtime", "Python, package, and local toolchain checks"),
|
|
30
|
+
DoctorCheckGroup("setup", "First-run adoption and repository targeting checks"),
|
|
30
31
|
DoctorCheckGroup("github", "GitHub auth, workflow, and private-repo cost checks"),
|
|
31
32
|
DoctorCheckGroup("providers", "Reviewer provider CLI and secret checks"),
|
|
32
33
|
DoctorCheckGroup("cloud", "Optional CodeMower.com token and service checks"),
|
|
@@ -59,6 +60,12 @@ OPTIONAL_DOCTOR_STAGES = (
|
|
|
59
60
|
"Inspect a self-hosted macOS local audit runner",
|
|
60
61
|
optional=True,
|
|
61
62
|
),
|
|
63
|
+
DoctorCheckStage(
|
|
64
|
+
"adoption",
|
|
65
|
+
"setup",
|
|
66
|
+
"Inspect first-run adoption posture and selected repository target",
|
|
67
|
+
optional=True,
|
|
68
|
+
),
|
|
62
69
|
)
|
|
63
70
|
|
|
64
71
|
|
|
@@ -71,10 +78,16 @@ def build_doctor_run_plan(
|
|
|
71
78
|
github: bool = False,
|
|
72
79
|
cloud: bool = False,
|
|
73
80
|
runner: bool = False,
|
|
81
|
+
adoption: bool = False,
|
|
74
82
|
) -> tuple[DoctorCheckStage, ...]:
|
|
75
83
|
"""Return the named stages that a doctor run will execute."""
|
|
76
84
|
|
|
77
85
|
stages = list(BASE_DOCTOR_STAGES)
|
|
78
|
-
optional_flags = {
|
|
86
|
+
optional_flags = {
|
|
87
|
+
"github": github,
|
|
88
|
+
"cloud": cloud,
|
|
89
|
+
"runner": runner,
|
|
90
|
+
"adoption": adoption,
|
|
91
|
+
}
|
|
79
92
|
stages.extend(stage for stage in OPTIONAL_DOCTOR_STAGES if optional_flags.get(stage.id, False))
|
|
80
93
|
return tuple(stages)
|
|
@@ -7,6 +7,7 @@ from typing import Any, Mapping
|
|
|
7
7
|
|
|
8
8
|
from code_mower import config as code_mower_config
|
|
9
9
|
|
|
10
|
+
from .adoption import check_adoption_setup, config_with_repository_target
|
|
10
11
|
from .audit_limits import check_effective_audit_limits
|
|
11
12
|
from .cloud import check_cloud_token_surface
|
|
12
13
|
from .common import ACTIONS_COST_SAMPLE_DEFAULT, load_inputs
|
|
@@ -79,6 +80,9 @@ def run_doctor(
|
|
|
79
80
|
config_path: Path,
|
|
80
81
|
provider_templates_path: Path,
|
|
81
82
|
profile: str | None,
|
|
83
|
+
repo_slug: str = "",
|
|
84
|
+
repo_source: str = "",
|
|
85
|
+
adoption: bool = False,
|
|
82
86
|
probe_runtime: bool = False,
|
|
83
87
|
github: bool = False,
|
|
84
88
|
cloud: bool = False,
|
|
@@ -87,13 +91,31 @@ def run_doctor(
|
|
|
87
91
|
actions_cost_sample: int = ACTIONS_COST_SAMPLE_DEFAULT,
|
|
88
92
|
actionlint_bin: str = "actionlint",
|
|
89
93
|
) -> DoctorReport:
|
|
90
|
-
plan = build_doctor_run_plan(
|
|
94
|
+
plan = build_doctor_run_plan(
|
|
95
|
+
github=github,
|
|
96
|
+
cloud=cloud,
|
|
97
|
+
runner=runner,
|
|
98
|
+
adoption=adoption or bool(repo_slug),
|
|
99
|
+
)
|
|
91
100
|
enabled_stages = {stage.id for stage in plan}
|
|
92
101
|
# `doctor --easy` can inspect the packaged example before a repo has written
|
|
93
102
|
# code-mower.yml. In that mode the example should teach the user about stale
|
|
94
103
|
# guards without failing because product workflow files are not installed yet.
|
|
95
104
|
repo_root = None if config_path.name == "code-mower.example.yml" else config_path.parent
|
|
96
105
|
config, templates, checks = load_inputs(config_path, provider_templates_path)
|
|
106
|
+
using_packaged_example = config_path.name == "code-mower.example.yml"
|
|
107
|
+
checks.extend(
|
|
108
|
+
check_adoption_setup(
|
|
109
|
+
config=config,
|
|
110
|
+
config_path=config_path,
|
|
111
|
+
adoption=adoption,
|
|
112
|
+
repo_slug=repo_slug,
|
|
113
|
+
repo_source=repo_source,
|
|
114
|
+
using_packaged_example=using_packaged_example,
|
|
115
|
+
)
|
|
116
|
+
)
|
|
117
|
+
if config is not None and repo_slug:
|
|
118
|
+
config = config_with_repository_target(config, repo_slug)
|
|
97
119
|
checks.append(
|
|
98
120
|
_run_plan_check(
|
|
99
121
|
plan,
|