code-mower 0.6.0b1__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.0b1 → code_mower-0.6.0b3}/PKG-INFO +20 -12
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/README.md +19 -11
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/pyproject.toml +1 -1
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/__init__.py +1 -1
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/cloud.py +117 -7
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/cloud_client/__init__.py +24 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/cloud_client/doctor.py +25 -15
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/cloud_client/operations.py +116 -32
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/cloud_client/setup.py +6 -0
- code_mower-0.6.0b3/src/code_mower/cloud_client/tokens.py +404 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/doctor.py +32 -1
- {code_mower-0.6.0b1 → 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.0b1 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/github_repo.py +6 -1
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/registry.py +14 -1
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/runner.py +23 -1
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/init.py +73 -5
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/lane_status.py +36 -5
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/next_steps.py +1 -1
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/package_content.py +3 -3
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/package_manifest.py +2 -0
- {code_mower-0.6.0b1 → 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.0b1 → code_mower-0.6.0b3}/src/code_mower/templates/workflows/builder-provenance.yml.j2 +1 -1
- {code_mower-0.6.0b1 → code_mower-0.6.0b3/src/code_mower}/templates/workflows/code-mower-gate-health.yml.j2 +1 -1
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/templates/workflows/code-mower-gate.yml.j2 +1 -1
- {code_mower-0.6.0b1 → code_mower-0.6.0b3/src/code_mower}/templates/workflows/lane-mac-runner.yml.j2 +1 -1
- {code_mower-0.6.0b1 → code_mower-0.6.0b3/src/code_mower}/templates/workflows/private-standalone-shadow.yml.j2 +1 -1
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/templates/workflows/review-clear-stale.yml.j2 +1 -1
- {code_mower-0.6.0b1 → code_mower-0.6.0b3/src/code_mower}/templates/workflows/saas-reviewer-labeler.yml.j2 +1 -1
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/templates/workflows/self-hosted-local-audit.yml.j2 +2 -2
- {code_mower-0.6.0b1 → code_mower-0.6.0b3/src/code_mower}/templates/workflows/trailer-comment-labeler.yml.j2 +1 -1
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/templates/workflows/weekly-status.yml.j2 +1 -1
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower.egg-info/PKG-INFO +20 -12
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower.egg-info/SOURCES.txt +2 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/templates/workflows/blind-review-artifacts-dry-run.yml.j2 +1 -1
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/templates/workflows/builder-provenance.yml.j2 +1 -1
- {code_mower-0.6.0b1/src/code_mower → code_mower-0.6.0b3}/templates/workflows/code-mower-gate-health.yml.j2 +1 -1
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/templates/workflows/code-mower-gate.yml.j2 +1 -1
- {code_mower-0.6.0b1/src/code_mower → code_mower-0.6.0b3}/templates/workflows/lane-mac-runner.yml.j2 +1 -1
- {code_mower-0.6.0b1/src/code_mower → code_mower-0.6.0b3}/templates/workflows/private-standalone-shadow.yml.j2 +1 -1
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/templates/workflows/review-clear-stale.yml.j2 +1 -1
- {code_mower-0.6.0b1/src/code_mower → code_mower-0.6.0b3}/templates/workflows/saas-reviewer-labeler.yml.j2 +1 -1
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/templates/workflows/self-hosted-local-audit.yml.j2 +2 -2
- {code_mower-0.6.0b1/src/code_mower → code_mower-0.6.0b3}/templates/workflows/trailer-comment-labeler.yml.j2 +1 -1
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/tests/test_cloud_client.py +360 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/tests/test_doctor_boundaries.py +1 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/tests/test_doctor_github_checks.py +1 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/tests/test_doctor_registry.py +149 -1
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/tests/test_lane_status.py +42 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/tests/test_release_hygiene.py +319 -57
- code_mower-0.6.0b1/src/code_mower/templates/product-support/run_claude_audit_pr.sh +0 -32
- code_mower-0.6.0b1/src/code_mower/templates/product-support/run_codex_audit_pr.sh +0 -32
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/CODE_OF_CONDUCT.md +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/LICENSE +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/MANIFEST.in +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/NOTICE +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/SUPPORT.md +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/requirements/requirements.txt +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/setup.cfg +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/adapters/__init__.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/adapters/_base.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/adapters/cursor_bugbot.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/adapters/gitar.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/adapters/greptile.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/adapters/qodo.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/antigravity_cli_audit_pr.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/antigravity_sdk_probe.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/audit_handoff_log.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/audit_labeler_lib.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/audit_limits.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/audit_progress.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/blind_review_artifacts.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/blind_review_coordinator.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/bootstrap.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/builder_experiment.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/builder_runs.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/calibration/__init__.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/calibration/arms.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/calibration/auto_discovery.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/calibration/commands.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/calibration/context_inputs.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/calibration/corpus.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/calibration/effect_report.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/calibration/evidence.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/calibration/evidence_report.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/calibration/identity.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/calibration/metrics.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/calibration/overlap.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/calibration/planning.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/calibration/policy.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/calibration/results.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/calibration/run_results.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/calibration/run_status.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/calibration/runner.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/calibration/truth.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/calibration/value_report.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/checks.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/claude_audit_pr.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/claude_cli_bounce.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/claude_cli_environment.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/clear_stale.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/cli.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/cloud_client/bundle.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/cloud_client/dogfood.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/cloud_client/endpoints.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/cloud_client/errors.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/cloud_client/events.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/cloud_client/export.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/cloud_client/git_metadata.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/cloud_client/manifest.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/cloud_client/reports.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/cloud_client/upload.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/code_mower_calibration.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/code_mower_context_packs.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/code_mower_merge.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/code_mower_telemetry.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/coderabbit_cli_audit_pr.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/codex_audit_env_preflight.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/codex_audit_pr.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/codex_audit_schema_smoke.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/codex_audit_verdict.schema.json +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/config.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/decisions.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/audit_limits.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/cloud.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/common.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/github.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/github_actions.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/github_actions_cost.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/github_actions_cost_summary.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/github_actions_failure_annotations.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/github_actions_failure_models.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/github_actions_failure_scan.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/github_actions_failure_selection.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/github_actions_failures.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/github_actions_permissions.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/github_api.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/github_branch.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/github_config.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/github_human_token.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/github_provider.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/groups.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/models.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/output.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/presets.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/privacy.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/provider_api_model.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/provider_api_model_openai.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/provider_api_model_profiles.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/provider_env.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/provider_env_required.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/provider_env_tokens.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/provider_local_audit_setup.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/provider_local_cli.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/provider_local_cli_commands.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/provider_local_cli_probe_config.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/provider_probe.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/provider_probe_auth.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/provider_probe_evaluation.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/provider_probe_json.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/provider_probe_remediation.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/provider_review_hygiene.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/providers.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/runtime.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/runtime_github_auth.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/self_hosted_runner.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/gate_health.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/gemini_cli_audit_pr.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/grok_build_audit_pr.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/hermes_cli_audit_pr.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/lane_configs/__init__.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/lane_configs/aider.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/lane_configs/antigravity_cli.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/lane_configs/claude.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/lane_configs/codex.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/lane_configs/devin.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/lane_configs/gemini_cli.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/lane_configs/grok_build.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/lane_configs/hermes_cli.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/lane_configs/local_llm.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/local_llm_audit_pr.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/local_llm_bakeoff.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/local_llm_calibration.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/local_llm_profiles.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/migration.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/migration_install.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/migration_mirror.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/migration_readiness.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/migration_rehearsal.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/observe.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/package.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/package_paths.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/package_rendering.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/plan_context.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/prompts.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/provider_registry.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/provider_runners/__init__.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/provider_runners/comments.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/provider_runners/exit_codes.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/provider_runners/git.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/provider_runners/github_auth.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/provider_runners/github_pr.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/provider_runners/pr_worktree.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/provider_runners/process.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/provider_runners/repo_paths.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/provider_runners/text_schema.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/provider_runners/verdict_artifacts.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/provider_runners/workspace.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/providers/__init__.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/providers/local_cli.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/providers/provenance.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/release_readiness.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/reviewer_metrics.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/reviewer_spend.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/saas_reviewer_labeler.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/secrets.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/templates/builder-experiment.example.json +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/templates/calibration-corpus.example.json +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/templates/calibration-corpus.json +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/templates/code-mower.example.yml +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/templates/context-packs.example.json +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/templates/lane_prompts/base-audit.md +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/templates/lane_prompts/calibration-policy.md +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/templates/lane_prompts/context-driven-quality.md +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/templates/lane_prompts/docs-design.md +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/templates/lane_prompts/generic-programming.md +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/templates/lane_prompts/operability.md +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/templates/lane_prompts/package-runtime.md +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/templates/lane_prompts/plan-conformance.md +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/templates/lane_prompts/security-threat-model.md +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/templates/lanes/README.md +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/templates/lanes/claude.md +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/templates/lanes/codex.md +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/templates/lanes/cursor.md +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/templates/lanes/generic.md +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/templates/lanes/run_mac_lane.sh +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/templates/product-support/code_mower +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/templates/product-support/code_mower_standalone_pin.env +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/templates/product-support/code_mower_standalone_shadow.sh +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/templates/product-support/safe_gh_comment.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/templates/product-support/status_report.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/templates/providers.yml +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/templates/reviewer-spend.example.json +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/templates/reviewer-value-report.example.md +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/templates/workflows/audit-label-cleanup.yml.j2 +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/templates/workflows/code-mower-agent-pr-labeler.yml.j2 +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/templates/workflows/code-mower-fix-round-dispatch.yml.j2 +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/templates/workflows/dispatch-lanes.yml.j2 +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/templates/workflows/hosted-bridge.yml.j2 +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/templates/workflows/local-cli-audit.yml.j2 +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/templates/workflows/needs-owner-notify.yml.j2 +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/trailer_comment_labeler.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/versioning.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/work_orders.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower/workflow_actionlint.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower.egg-info/dependency_links.txt +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower.egg-info/entry_points.txt +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower.egg-info/requires.txt +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/src/code_mower.egg-info/top_level.txt +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/templates/builder-experiment.example.json +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/templates/calibration-corpus.example.json +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/templates/calibration-corpus.json +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/templates/code-mower.yml.j2 +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/templates/context-packs.example.json +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/templates/cursor/BUGBOT.md +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/templates/lanes/README.md +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/templates/lanes/claude.md +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/templates/lanes/codex.md +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/templates/lanes/cursor.md +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/templates/lanes/generic.md +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/templates/lanes/run_mac_lane.sh +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/templates/providers/acp_bridge.yml +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/templates/providers/aider.yml +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/templates/providers/antigravity_cli.yml +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/templates/providers/claude_audit.yml +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/templates/providers/claude_review.yml +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/templates/providers/coderabbit_cli.yml +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/templates/providers/codex.yml +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/templates/providers/cursor_bugbot.yml +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/templates/providers/devin.yml +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/templates/providers/gemini_cli.yml +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/templates/providers/gitar.yml +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/templates/providers/greptile.yml +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/templates/providers/hermes_cli.yml +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/templates/providers/local_llm.yml +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/templates/providers/qodo.yml +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/templates/providers.yml +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/templates/reviewer-spend.example.json +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/templates/reviewer-value-report.example.md +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/templates/workflows/audit-label-cleanup.yml.j2 +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/templates/workflows/code-mower-agent-pr-labeler.yml.j2 +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/templates/workflows/code-mower-fix-round-dispatch.yml.j2 +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/templates/workflows/dispatch-lanes.yml.j2 +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/templates/workflows/hosted-bridge.yml.j2 +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/templates/workflows/local-cli-audit.yml.j2 +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/tests/test_antigravity_sdk_probe.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/tests/test_audit_comment_posture.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/tests/test_audit_limits.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/tests/test_builder_experiment.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/tests/test_builder_identity.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/tests/test_builder_runs.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/tests/test_calibration_effect_report.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/tests/test_calibration_truth.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/tests/test_checks.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/tests/test_claude_audit_pr.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/tests/test_claude_cli_bounce.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/tests/test_clear_stale.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/tests/test_cloud_git_metadata.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/tests/test_cloud_manifest.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/tests/test_cloud_reports.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/tests/test_coderabbit_cli_audit_pr.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/tests/test_codex_audit_env_preflight.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/tests/test_codex_audit_pr.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/tests/test_decision_audit_integration.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/tests/test_decisions.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/tests/test_doctor_actions_cost_summary.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/tests/test_doctor_actions_failure_selection.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/tests/test_doctor_output.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/tests/test_doctor_privacy.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/tests/test_doctor_provider_env_required.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/tests/test_doctor_provider_env_tokens.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/tests/test_doctor_provider_local_audit_setup.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/tests/test_doctor_provider_probe.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/tests/test_doctor_provider_review_hygiene.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/tests/test_doctor_runtime.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/tests/test_doctor_self_hosted_runner.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/tests/test_gate_health.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/tests/test_init_actionlint.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/tests/test_init_build_loop.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/tests/test_local_llm_github_helpers.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/tests/test_observe.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/tests/test_plan_context.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/tests/test_prompts.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/tests/test_provider_fixture_contracts.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/tests/test_provider_local_cli.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/tests/test_provider_runners_comments.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/tests/test_provider_runners_git.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/tests/test_provider_runners_github_pr.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/tests/test_provider_runners_pr_worktree.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/tests/test_provider_runners_process.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/tests/test_provider_runners_repo_paths.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/tests/test_provider_runners_text_schema.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/tests/test_provider_runners_workspace.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/tests/test_reviewer_metrics_core.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/tests/test_reviewer_spend.py +0 -0
- {code_mower-0.6.0b1 → code_mower-0.6.0b3}/tests/test_trailer_comment_labeler.py +0 -0
- {code_mower-0.6.0b1 → 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
|
|
@@ -272,6 +273,12 @@ code-mower cloud setup \
|
|
|
272
273
|
--out ~/.config/code-mower/tokens/your-laptop.env
|
|
273
274
|
```
|
|
274
275
|
|
|
276
|
+
`cloud setup` stores a private `0600` token env file and records it as the
|
|
277
|
+
current local cloud profile. Future `cloud doctor`, `cloud upload`, `cloud
|
|
278
|
+
dogfood`, `cloud reviewer-runs`, and `cloud repo-sync` commands can load that
|
|
279
|
+
profile automatically; pass `--install-id` or `--token-file` when a machine has
|
|
280
|
+
multiple stored profiles.
|
|
281
|
+
|
|
275
282
|
Cloud sharing details, historical catch-up, and repo-sync commands live in
|
|
276
283
|
[docs/cloud-sharing.md](docs/cloud-sharing.md).
|
|
277
284
|
|
|
@@ -303,7 +310,7 @@ engineer can:
|
|
|
303
310
|
|
|
304
311
|
1. install Code Mower in a clean repo;
|
|
305
312
|
2. understand the local/cloud trust boundary;
|
|
306
|
-
3. run `init --easy` and `doctor --
|
|
313
|
+
3. run `init --easy` and `doctor --adoption --repo OWNER/REPO`;
|
|
307
314
|
4. run `lanes status --repo OWNER/REPO` to see active lanes and gate state;
|
|
308
315
|
5. detect and run the repo's native lint/test/build surface instead of assuming
|
|
309
316
|
every project uses the same tools;
|
|
@@ -322,8 +329,8 @@ measurement work.
|
|
|
322
329
|
|
|
323
330
|
## Installation Status
|
|
324
331
|
|
|
325
|
-
The current public beta baseline is `v0.6.0-beta.
|
|
326
|
-
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
|
|
327
334
|
release and in the first-user install rehearsal. The public repository is
|
|
328
335
|
[codemower-ai/code-mower](https://github.com/codemower-ai/code-mower), and
|
|
329
336
|
GitHub releases remain the auditable source for tags, build artifacts, and
|
|
@@ -366,6 +373,7 @@ first so local work exercises the same package entrypoint users install.
|
|
|
366
373
|
- [Try Code Mower In 10 Minutes](docs/try-in-10-minutes.md)
|
|
367
374
|
- [Build Loop In 30 Minutes](docs/build-loop-in-30-minutes.md)
|
|
368
375
|
- [Quickstart Reference](docs/quickstart.md)
|
|
376
|
+
- [Orchestrator Prompt Pack](docs/orchestrator-prompt-pack.md)
|
|
369
377
|
- [Planning And Work Orders](docs/planning-work-orders.md)
|
|
370
378
|
- [Builder Providers: Grok And Cursor](docs/builders-grok-cursor.md)
|
|
371
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
|
|
@@ -257,6 +258,12 @@ code-mower cloud setup \
|
|
|
257
258
|
--out ~/.config/code-mower/tokens/your-laptop.env
|
|
258
259
|
```
|
|
259
260
|
|
|
261
|
+
`cloud setup` stores a private `0600` token env file and records it as the
|
|
262
|
+
current local cloud profile. Future `cloud doctor`, `cloud upload`, `cloud
|
|
263
|
+
dogfood`, `cloud reviewer-runs`, and `cloud repo-sync` commands can load that
|
|
264
|
+
profile automatically; pass `--install-id` or `--token-file` when a machine has
|
|
265
|
+
multiple stored profiles.
|
|
266
|
+
|
|
260
267
|
Cloud sharing details, historical catch-up, and repo-sync commands live in
|
|
261
268
|
[docs/cloud-sharing.md](docs/cloud-sharing.md).
|
|
262
269
|
|
|
@@ -288,7 +295,7 @@ engineer can:
|
|
|
288
295
|
|
|
289
296
|
1. install Code Mower in a clean repo;
|
|
290
297
|
2. understand the local/cloud trust boundary;
|
|
291
|
-
3. run `init --easy` and `doctor --
|
|
298
|
+
3. run `init --easy` and `doctor --adoption --repo OWNER/REPO`;
|
|
292
299
|
4. run `lanes status --repo OWNER/REPO` to see active lanes and gate state;
|
|
293
300
|
5. detect and run the repo's native lint/test/build surface instead of assuming
|
|
294
301
|
every project uses the same tools;
|
|
@@ -307,8 +314,8 @@ measurement work.
|
|
|
307
314
|
|
|
308
315
|
## Installation Status
|
|
309
316
|
|
|
310
|
-
The current public beta baseline is `v0.6.0-beta.
|
|
311
|
-
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
|
|
312
319
|
release and in the first-user install rehearsal. The public repository is
|
|
313
320
|
[codemower-ai/code-mower](https://github.com/codemower-ai/code-mower), and
|
|
314
321
|
GitHub releases remain the auditable source for tags, build artifacts, and
|
|
@@ -351,6 +358,7 @@ first so local work exercises the same package entrypoint users install.
|
|
|
351
358
|
- [Try Code Mower In 10 Minutes](docs/try-in-10-minutes.md)
|
|
352
359
|
- [Build Loop In 30 Minutes](docs/build-loop-in-30-minutes.md)
|
|
353
360
|
- [Quickstart Reference](docs/quickstart.md)
|
|
361
|
+
- [Orchestrator Prompt Pack](docs/orchestrator-prompt-pack.md)
|
|
354
362
|
- [Planning And Work Orders](docs/planning-work-orders.md)
|
|
355
363
|
- [Builder Providers: Grok And Cursor](docs/builders-grok-cursor.md)
|
|
356
364
|
- [Build Loop Operations](docs/build-loop.md)
|
|
@@ -42,6 +42,9 @@ if __package__ in {None, ""}:
|
|
|
42
42
|
read_token_file as _read_token_file,
|
|
43
43
|
render_bundle_readme,
|
|
44
44
|
render_cloud_doctor_text,
|
|
45
|
+
require_upload_token,
|
|
46
|
+
resolve_cloud_endpoint,
|
|
47
|
+
resolve_cloud_token,
|
|
45
48
|
render_setup_env,
|
|
46
49
|
repo_slug_from_remote as _repo_slug_from_remote,
|
|
47
50
|
repo_sync_output_name as _repo_sync_output_name,
|
|
@@ -92,6 +95,9 @@ else: # pragma: no cover - exercised after package extraction.
|
|
|
92
95
|
read_token_file as _read_token_file,
|
|
93
96
|
render_bundle_readme,
|
|
94
97
|
render_cloud_doctor_text,
|
|
98
|
+
require_upload_token,
|
|
99
|
+
resolve_cloud_endpoint,
|
|
100
|
+
resolve_cloud_token,
|
|
95
101
|
render_setup_env,
|
|
96
102
|
repo_slug_from_remote as _repo_slug_from_remote,
|
|
97
103
|
repo_sync_output_name as _repo_sync_output_name,
|
|
@@ -137,8 +143,11 @@ __all__ = [
|
|
|
137
143
|
"build_cloud_bundle",
|
|
138
144
|
"build_upload_payload",
|
|
139
145
|
"post_upload_payload",
|
|
146
|
+
"require_upload_token",
|
|
140
147
|
"render_bundle_readme",
|
|
141
148
|
"render_setup_env",
|
|
149
|
+
"resolve_cloud_endpoint",
|
|
150
|
+
"resolve_cloud_token",
|
|
142
151
|
"run_cloud_doctor",
|
|
143
152
|
"run_cloud_setup",
|
|
144
153
|
"validate_metadata_payload",
|
|
@@ -290,6 +299,23 @@ def main(argv: list[str] | None = None) -> int:
|
|
|
290
299
|
default=os.environ.get("CODE_MOWER_CLOUD_ENDPOINT", DEFAULT_UPLOAD_ENDPOINT),
|
|
291
300
|
)
|
|
292
301
|
upload.add_argument("--token-env", default=DEFAULT_TOKEN_ENV)
|
|
302
|
+
upload.add_argument(
|
|
303
|
+
"--token-file",
|
|
304
|
+
type=Path,
|
|
305
|
+
default=None,
|
|
306
|
+
help="token env file or raw token file to use when token env is not set",
|
|
307
|
+
)
|
|
308
|
+
upload.add_argument(
|
|
309
|
+
"--token-dir",
|
|
310
|
+
type=Path,
|
|
311
|
+
default=None,
|
|
312
|
+
help="directory with Code Mower Cloud token profiles",
|
|
313
|
+
)
|
|
314
|
+
upload.add_argument(
|
|
315
|
+
"--install-id",
|
|
316
|
+
default="",
|
|
317
|
+
help="stored token profile name to use when token env is not set",
|
|
318
|
+
)
|
|
293
319
|
upload.add_argument("--include-reports", action="store_true")
|
|
294
320
|
upload.add_argument("--dry-run", action="store_true")
|
|
295
321
|
upload.add_argument(
|
|
@@ -312,6 +338,23 @@ def main(argv: list[str] | None = None) -> int:
|
|
|
312
338
|
default=os.environ.get("CODE_MOWER_CLOUD_ENDPOINT", DEFAULT_UPLOAD_ENDPOINT),
|
|
313
339
|
)
|
|
314
340
|
doctor.add_argument("--token-env", default=DEFAULT_TOKEN_ENV)
|
|
341
|
+
doctor.add_argument(
|
|
342
|
+
"--token-file",
|
|
343
|
+
type=Path,
|
|
344
|
+
default=None,
|
|
345
|
+
help="token env file or raw token file to check when token env is not set",
|
|
346
|
+
)
|
|
347
|
+
doctor.add_argument(
|
|
348
|
+
"--token-dir",
|
|
349
|
+
type=Path,
|
|
350
|
+
default=None,
|
|
351
|
+
help="directory with Code Mower Cloud token profiles",
|
|
352
|
+
)
|
|
353
|
+
doctor.add_argument(
|
|
354
|
+
"--install-id",
|
|
355
|
+
default="",
|
|
356
|
+
help="stored token profile name to check when token env is not set",
|
|
357
|
+
)
|
|
315
358
|
doctor.add_argument(
|
|
316
359
|
"--probe-service",
|
|
317
360
|
action="store_true",
|
|
@@ -354,6 +397,18 @@ def main(argv: list[str] | None = None) -> int:
|
|
|
354
397
|
default=os.environ.get("CODE_MOWER_CLOUD_ENDPOINT", DEFAULT_UPLOAD_ENDPOINT),
|
|
355
398
|
)
|
|
356
399
|
dogfood.add_argument("--token-env", default=DEFAULT_TOKEN_ENV)
|
|
400
|
+
dogfood.add_argument(
|
|
401
|
+
"--token-file",
|
|
402
|
+
type=Path,
|
|
403
|
+
default=None,
|
|
404
|
+
help="token env file or raw token file to use when token env is not set",
|
|
405
|
+
)
|
|
406
|
+
dogfood.add_argument(
|
|
407
|
+
"--token-dir",
|
|
408
|
+
type=Path,
|
|
409
|
+
default=None,
|
|
410
|
+
help="directory with Code Mower Cloud token profiles",
|
|
411
|
+
)
|
|
357
412
|
dogfood.add_argument("--include-reports", action="store_true")
|
|
358
413
|
dogfood.add_argument(
|
|
359
414
|
"--yes",
|
|
@@ -389,6 +444,18 @@ def main(argv: list[str] | None = None) -> int:
|
|
|
389
444
|
default=os.environ.get("CODE_MOWER_CLOUD_ENDPOINT", DEFAULT_UPLOAD_ENDPOINT),
|
|
390
445
|
)
|
|
391
446
|
catch_up.add_argument("--token-env", default=DEFAULT_TOKEN_ENV)
|
|
447
|
+
catch_up.add_argument(
|
|
448
|
+
"--token-file",
|
|
449
|
+
type=Path,
|
|
450
|
+
default=None,
|
|
451
|
+
help="token env file or raw token file to use when token env is not set",
|
|
452
|
+
)
|
|
453
|
+
catch_up.add_argument(
|
|
454
|
+
"--token-dir",
|
|
455
|
+
type=Path,
|
|
456
|
+
default=None,
|
|
457
|
+
help="directory with Code Mower Cloud token profiles",
|
|
458
|
+
)
|
|
392
459
|
catch_up.add_argument(
|
|
393
460
|
"--yes",
|
|
394
461
|
action="store_true",
|
|
@@ -451,6 +518,18 @@ def main(argv: list[str] | None = None) -> int:
|
|
|
451
518
|
default=os.environ.get("CODE_MOWER_CLOUD_ENDPOINT", DEFAULT_UPLOAD_ENDPOINT),
|
|
452
519
|
)
|
|
453
520
|
reviewer_runs.add_argument("--token-env", default=DEFAULT_TOKEN_ENV)
|
|
521
|
+
reviewer_runs.add_argument(
|
|
522
|
+
"--token-file",
|
|
523
|
+
type=Path,
|
|
524
|
+
default=None,
|
|
525
|
+
help="token env file or raw token file to use when token env is not set",
|
|
526
|
+
)
|
|
527
|
+
reviewer_runs.add_argument(
|
|
528
|
+
"--token-dir",
|
|
529
|
+
type=Path,
|
|
530
|
+
default=None,
|
|
531
|
+
help="directory with Code Mower Cloud token profiles",
|
|
532
|
+
)
|
|
454
533
|
reviewer_runs.add_argument(
|
|
455
534
|
"--yes",
|
|
456
535
|
action="store_true",
|
|
@@ -498,6 +577,18 @@ def main(argv: list[str] | None = None) -> int:
|
|
|
498
577
|
default=os.environ.get("CODE_MOWER_CLOUD_ENDPOINT", DEFAULT_UPLOAD_ENDPOINT),
|
|
499
578
|
)
|
|
500
579
|
repo_sync.add_argument("--token-env", default=DEFAULT_TOKEN_ENV)
|
|
580
|
+
repo_sync.add_argument(
|
|
581
|
+
"--token-file",
|
|
582
|
+
type=Path,
|
|
583
|
+
default=None,
|
|
584
|
+
help="token env file or raw token file to use when token env is not set",
|
|
585
|
+
)
|
|
586
|
+
repo_sync.add_argument(
|
|
587
|
+
"--token-dir",
|
|
588
|
+
type=Path,
|
|
589
|
+
default=None,
|
|
590
|
+
help="directory with Code Mower Cloud token profiles",
|
|
591
|
+
)
|
|
501
592
|
repo_sync.add_argument("--include-reports", action="store_true")
|
|
502
593
|
repo_sync.add_argument(
|
|
503
594
|
"--yes",
|
|
@@ -535,6 +626,7 @@ def main(argv: list[str] | None = None) -> int:
|
|
|
535
626
|
print(f"Token: {result['token_prefix']}")
|
|
536
627
|
if result["status"] == "written":
|
|
537
628
|
print(f"Load it with: {result['shell']}")
|
|
629
|
+
print(f"Current profile: {result['current_profile']}")
|
|
538
630
|
return 0
|
|
539
631
|
if args.command == "export":
|
|
540
632
|
events = [
|
|
@@ -569,11 +661,18 @@ def main(argv: list[str] | None = None) -> int:
|
|
|
569
661
|
bundle_dir=args.bundle_dir,
|
|
570
662
|
include_reports=args.include_reports,
|
|
571
663
|
)
|
|
664
|
+
token_resolution = resolve_cloud_token(
|
|
665
|
+
token_env=args.token_env,
|
|
666
|
+
token_file=args.token_file,
|
|
667
|
+
token_dir=args.token_dir,
|
|
668
|
+
install_id=args.install_id,
|
|
669
|
+
)
|
|
670
|
+
resolved_endpoint = resolve_cloud_endpoint(args.endpoint, token_resolution)
|
|
572
671
|
dry_run = args.dry_run or not args.yes
|
|
573
672
|
if dry_run:
|
|
574
673
|
preview = {
|
|
575
674
|
"mode": "cloud-upload-dry-run",
|
|
576
|
-
"endpoint":
|
|
675
|
+
"endpoint": resolved_endpoint,
|
|
577
676
|
"would_upload": False,
|
|
578
677
|
"requires_yes": not args.yes,
|
|
579
678
|
"upload_mode": payload["upload_mode"],
|
|
@@ -592,14 +691,14 @@ def main(argv: list[str] | None = None) -> int:
|
|
|
592
691
|
print(f"Events: {preview['event_count']}")
|
|
593
692
|
print("Network: skipped (pass --yes to upload)")
|
|
594
693
|
return 0
|
|
595
|
-
token =
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
694
|
+
token = require_upload_token(
|
|
695
|
+
endpoint=resolved_endpoint,
|
|
696
|
+
resolution=token_resolution,
|
|
697
|
+
local_endpoint=_is_local_http_endpoint(resolved_endpoint),
|
|
698
|
+
)
|
|
600
699
|
result = post_upload_payload(
|
|
601
700
|
payload=payload,
|
|
602
|
-
endpoint=
|
|
701
|
+
endpoint=resolved_endpoint,
|
|
603
702
|
token=token,
|
|
604
703
|
timeout=args.timeout,
|
|
605
704
|
)
|
|
@@ -615,6 +714,9 @@ def main(argv: list[str] | None = None) -> int:
|
|
|
615
714
|
bundle_dir=args.bundle_dir,
|
|
616
715
|
endpoint=args.endpoint,
|
|
617
716
|
token_env=args.token_env,
|
|
717
|
+
token_file=args.token_file,
|
|
718
|
+
token_dir=args.token_dir,
|
|
719
|
+
install_id=args.install_id,
|
|
618
720
|
probe_service=args.probe_service,
|
|
619
721
|
timeout=args.timeout,
|
|
620
722
|
)
|
|
@@ -636,6 +738,8 @@ def main(argv: list[str] | None = None) -> int:
|
|
|
636
738
|
source=args.source,
|
|
637
739
|
endpoint=args.endpoint,
|
|
638
740
|
token_env=args.token_env,
|
|
741
|
+
token_file=args.token_file,
|
|
742
|
+
token_dir=args.token_dir,
|
|
639
743
|
include_reports=args.include_reports,
|
|
640
744
|
yes=args.yes,
|
|
641
745
|
timeout=args.timeout,
|
|
@@ -664,6 +768,8 @@ def main(argv: list[str] | None = None) -> int:
|
|
|
664
768
|
limit=args.limit,
|
|
665
769
|
endpoint=args.endpoint,
|
|
666
770
|
token_env=args.token_env,
|
|
771
|
+
token_file=args.token_file,
|
|
772
|
+
token_dir=args.token_dir,
|
|
667
773
|
yes=args.yes,
|
|
668
774
|
timeout=args.timeout,
|
|
669
775
|
include_git_ref=args.include_git_ref,
|
|
@@ -700,6 +806,8 @@ def main(argv: list[str] | None = None) -> int:
|
|
|
700
806
|
offset=args.offset,
|
|
701
807
|
endpoint=args.endpoint,
|
|
702
808
|
token_env=args.token_env,
|
|
809
|
+
token_file=args.token_file,
|
|
810
|
+
token_dir=args.token_dir,
|
|
703
811
|
yes=args.yes,
|
|
704
812
|
timeout=args.timeout,
|
|
705
813
|
include_git_ref=args.include_git_ref,
|
|
@@ -733,6 +841,8 @@ def main(argv: list[str] | None = None) -> int:
|
|
|
733
841
|
limit=args.limit,
|
|
734
842
|
endpoint=args.endpoint,
|
|
735
843
|
token_env=args.token_env,
|
|
844
|
+
token_file=args.token_file,
|
|
845
|
+
token_dir=args.token_dir,
|
|
736
846
|
include_reports=args.include_reports,
|
|
737
847
|
include_git_ref=args.include_git_ref,
|
|
738
848
|
yes=args.yes,
|
|
@@ -93,6 +93,19 @@ from .setup import (
|
|
|
93
93
|
token_prefix,
|
|
94
94
|
write_setup_env_file,
|
|
95
95
|
)
|
|
96
|
+
from .tokens import (
|
|
97
|
+
CURRENT_PROFILE_FILENAME,
|
|
98
|
+
DEFAULT_TOKEN_DIR,
|
|
99
|
+
CloudTokenResolution,
|
|
100
|
+
default_token_dir,
|
|
101
|
+
display_token_path,
|
|
102
|
+
read_token_profile,
|
|
103
|
+
require_upload_token,
|
|
104
|
+
resolve_cloud_endpoint,
|
|
105
|
+
resolve_cloud_identity,
|
|
106
|
+
resolve_cloud_token,
|
|
107
|
+
write_current_token_profile,
|
|
108
|
+
)
|
|
96
109
|
from .upload import (
|
|
97
110
|
UPLOAD_SCHEMA,
|
|
98
111
|
build_upload_payload,
|
|
@@ -113,10 +126,13 @@ __all__ = [
|
|
|
113
126
|
"SAFE_REPORT_KINDS",
|
|
114
127
|
"UPLOAD_SCHEMA",
|
|
115
128
|
"CloudBundleError",
|
|
129
|
+
"CloudTokenResolution",
|
|
130
|
+
"CURRENT_PROFILE_FILENAME",
|
|
116
131
|
"DEFAULT_INSTALL_ID_ENV",
|
|
117
132
|
"DEFAULT_SETUP_INSTALL_ID",
|
|
118
133
|
"DEFAULT_TEAM_ID_ENV",
|
|
119
134
|
"DEFAULT_TOKEN_ENV",
|
|
135
|
+
"DEFAULT_TOKEN_DIR",
|
|
120
136
|
"DEFAULT_UPLOAD_ENDPOINT",
|
|
121
137
|
"DogfoodPlan",
|
|
122
138
|
"EVENT_SCHEMA",
|
|
@@ -132,7 +148,9 @@ __all__ = [
|
|
|
132
148
|
"catch_up_upload",
|
|
133
149
|
"dashboard_url_for_endpoint",
|
|
134
150
|
"default_setup_path",
|
|
151
|
+
"default_token_dir",
|
|
135
152
|
"detect_repo_slug",
|
|
153
|
+
"display_token_path",
|
|
136
154
|
"default_dogfood_reports",
|
|
137
155
|
"dogfood_upload",
|
|
138
156
|
"event_id_from_github_run",
|
|
@@ -150,6 +168,7 @@ __all__ = [
|
|
|
150
168
|
"post_upload_payload",
|
|
151
169
|
"probe_cloud_service",
|
|
152
170
|
"read_token_file",
|
|
171
|
+
"read_token_profile",
|
|
153
172
|
"render_bundle_readme",
|
|
154
173
|
"render_cloud_doctor_text",
|
|
155
174
|
"render_setup_env",
|
|
@@ -157,6 +176,10 @@ __all__ = [
|
|
|
157
176
|
"repo_sync_output_name",
|
|
158
177
|
"repo_sync_upload",
|
|
159
178
|
"report_path_from_manifest",
|
|
179
|
+
"require_upload_token",
|
|
180
|
+
"resolve_cloud_endpoint",
|
|
181
|
+
"resolve_cloud_identity",
|
|
182
|
+
"resolve_cloud_token",
|
|
160
183
|
"resolve_setup_token",
|
|
161
184
|
"reviewer_runs_upload",
|
|
162
185
|
"run_cloud_doctor",
|
|
@@ -176,4 +199,5 @@ __all__ = [
|
|
|
176
199
|
"validate_metadata_payload",
|
|
177
200
|
"validate_upload_endpoint",
|
|
178
201
|
"write_setup_env_file",
|
|
202
|
+
"write_current_token_profile",
|
|
179
203
|
]
|
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
|
-
import os
|
|
6
5
|
import shlex
|
|
7
6
|
from pathlib import Path
|
|
8
7
|
from typing import Any
|
|
@@ -18,6 +17,10 @@ from .endpoints import (
|
|
|
18
17
|
validate_upload_endpoint,
|
|
19
18
|
)
|
|
20
19
|
from .errors import CloudBundleError
|
|
20
|
+
from .tokens import (
|
|
21
|
+
resolve_cloud_endpoint,
|
|
22
|
+
resolve_cloud_token,
|
|
23
|
+
)
|
|
21
24
|
from .upload import build_upload_payload
|
|
22
25
|
|
|
23
26
|
|
|
@@ -84,12 +87,22 @@ def run_cloud_doctor(
|
|
|
84
87
|
bundle_dir: Path,
|
|
85
88
|
endpoint: str,
|
|
86
89
|
token_env: str,
|
|
90
|
+
token_file: Path | None = None,
|
|
91
|
+
token_dir: Path | None = None,
|
|
92
|
+
install_id: str = "",
|
|
87
93
|
require_token: bool = True,
|
|
88
94
|
probe_service: bool = False,
|
|
89
95
|
timeout: float = 5.0,
|
|
90
96
|
) -> dict[str, Any]:
|
|
91
97
|
checks: list[dict[str, Any]] = []
|
|
92
98
|
endpoint_is_valid = False
|
|
99
|
+
token_resolution = resolve_cloud_token(
|
|
100
|
+
token_env=token_env,
|
|
101
|
+
token_file=token_file,
|
|
102
|
+
token_dir=token_dir,
|
|
103
|
+
install_id=install_id,
|
|
104
|
+
)
|
|
105
|
+
endpoint = resolve_cloud_endpoint(endpoint, token_resolution)
|
|
93
106
|
|
|
94
107
|
try:
|
|
95
108
|
_validate_upload_endpoint(endpoint)
|
|
@@ -122,13 +135,13 @@ def run_cloud_doctor(
|
|
|
122
135
|
}
|
|
123
136
|
)
|
|
124
137
|
|
|
125
|
-
|
|
126
|
-
if token_present:
|
|
138
|
+
if token_resolution.has_token:
|
|
127
139
|
checks.append(
|
|
128
140
|
{
|
|
129
141
|
"name": "token",
|
|
130
142
|
"status": "pass",
|
|
131
|
-
"message":
|
|
143
|
+
"message": token_resolution.message,
|
|
144
|
+
"detail": token_resolution.safe_detail(),
|
|
132
145
|
}
|
|
133
146
|
)
|
|
134
147
|
elif is_local_http_endpoint(endpoint):
|
|
@@ -137,8 +150,9 @@ def run_cloud_doctor(
|
|
|
137
150
|
"name": "token",
|
|
138
151
|
"status": "warn",
|
|
139
152
|
"message": (
|
|
140
|
-
f"{
|
|
153
|
+
f"{token_resolution.message}; local configless ingest may still work"
|
|
141
154
|
),
|
|
155
|
+
"detail": token_resolution.safe_detail(),
|
|
142
156
|
}
|
|
143
157
|
)
|
|
144
158
|
elif not require_token:
|
|
@@ -146,11 +160,9 @@ def run_cloud_doctor(
|
|
|
146
160
|
{
|
|
147
161
|
"name": "token",
|
|
148
162
|
"status": "warn",
|
|
149
|
-
"message": f"{
|
|
150
|
-
"
|
|
151
|
-
|
|
152
|
-
f"{token_env} before using --yes."
|
|
153
|
-
),
|
|
163
|
+
"message": f"{token_resolution.message}; upload will remain disabled",
|
|
164
|
+
"detail": token_resolution.safe_detail(),
|
|
165
|
+
"remediation": token_resolution.remediation,
|
|
154
166
|
}
|
|
155
167
|
)
|
|
156
168
|
else:
|
|
@@ -158,11 +170,9 @@ def run_cloud_doctor(
|
|
|
158
170
|
{
|
|
159
171
|
"name": "token",
|
|
160
172
|
"status": "fail",
|
|
161
|
-
"message":
|
|
162
|
-
"
|
|
163
|
-
|
|
164
|
-
"running cloud upload --yes."
|
|
165
|
-
),
|
|
173
|
+
"message": token_resolution.message,
|
|
174
|
+
"detail": token_resolution.safe_detail(),
|
|
175
|
+
"remediation": token_resolution.remediation,
|
|
166
176
|
}
|
|
167
177
|
)
|
|
168
178
|
|