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.
Files changed (349) hide show
  1. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/PKG-INFO +14 -12
  2. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/README.md +13 -11
  3. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/pyproject.toml +1 -1
  4. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/__init__.py +1 -1
  5. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/doctor.py +32 -1
  6. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/__init__.py +12 -0
  7. code_mower-0.6.0b3/src/code_mower/doctor_checks/adoption.py +249 -0
  8. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/github_repo.py +6 -1
  9. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/registry.py +14 -1
  10. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/runner.py +23 -1
  11. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/init.py +73 -5
  12. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/lane_status.py +36 -5
  13. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/next_steps.py +1 -1
  14. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/package_content.py +3 -3
  15. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/package_manifest.py +1 -0
  16. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/package_static.py +1 -1
  17. code_mower-0.6.0b3/src/code_mower/templates/product-support/run_claude_audit_pr.sh +63 -0
  18. code_mower-0.6.0b3/src/code_mower/templates/product-support/run_codex_audit_pr.sh +63 -0
  19. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/templates/workflows/builder-provenance.yml.j2 +1 -1
  20. {code_mower-0.6.0b2 → code_mower-0.6.0b3/src/code_mower}/templates/workflows/code-mower-gate-health.yml.j2 +1 -1
  21. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/templates/workflows/code-mower-gate.yml.j2 +1 -1
  22. {code_mower-0.6.0b2 → code_mower-0.6.0b3/src/code_mower}/templates/workflows/lane-mac-runner.yml.j2 +1 -1
  23. {code_mower-0.6.0b2 → code_mower-0.6.0b3/src/code_mower}/templates/workflows/private-standalone-shadow.yml.j2 +1 -1
  24. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/templates/workflows/review-clear-stale.yml.j2 +1 -1
  25. {code_mower-0.6.0b2 → code_mower-0.6.0b3/src/code_mower}/templates/workflows/saas-reviewer-labeler.yml.j2 +1 -1
  26. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/templates/workflows/self-hosted-local-audit.yml.j2 +2 -2
  27. {code_mower-0.6.0b2 → code_mower-0.6.0b3/src/code_mower}/templates/workflows/trailer-comment-labeler.yml.j2 +1 -1
  28. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/templates/workflows/weekly-status.yml.j2 +1 -1
  29. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower.egg-info/PKG-INFO +14 -12
  30. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower.egg-info/SOURCES.txt +1 -0
  31. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/templates/workflows/blind-review-artifacts-dry-run.yml.j2 +1 -1
  32. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/templates/workflows/builder-provenance.yml.j2 +1 -1
  33. {code_mower-0.6.0b2/src/code_mower → code_mower-0.6.0b3}/templates/workflows/code-mower-gate-health.yml.j2 +1 -1
  34. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/templates/workflows/code-mower-gate.yml.j2 +1 -1
  35. {code_mower-0.6.0b2/src/code_mower → code_mower-0.6.0b3}/templates/workflows/lane-mac-runner.yml.j2 +1 -1
  36. {code_mower-0.6.0b2/src/code_mower → code_mower-0.6.0b3}/templates/workflows/private-standalone-shadow.yml.j2 +1 -1
  37. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/templates/workflows/review-clear-stale.yml.j2 +1 -1
  38. {code_mower-0.6.0b2/src/code_mower → code_mower-0.6.0b3}/templates/workflows/saas-reviewer-labeler.yml.j2 +1 -1
  39. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/templates/workflows/self-hosted-local-audit.yml.j2 +2 -2
  40. {code_mower-0.6.0b2/src/code_mower → code_mower-0.6.0b3}/templates/workflows/trailer-comment-labeler.yml.j2 +1 -1
  41. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/tests/test_doctor_boundaries.py +1 -0
  42. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/tests/test_doctor_github_checks.py +1 -0
  43. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/tests/test_doctor_registry.py +149 -1
  44. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/tests/test_lane_status.py +42 -0
  45. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/tests/test_release_hygiene.py +319 -57
  46. code_mower-0.6.0b2/src/code_mower/templates/product-support/run_claude_audit_pr.sh +0 -32
  47. code_mower-0.6.0b2/src/code_mower/templates/product-support/run_codex_audit_pr.sh +0 -32
  48. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/CODE_OF_CONDUCT.md +0 -0
  49. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/LICENSE +0 -0
  50. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/MANIFEST.in +0 -0
  51. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/NOTICE +0 -0
  52. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/SUPPORT.md +0 -0
  53. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/requirements/requirements.txt +0 -0
  54. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/setup.cfg +0 -0
  55. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/adapters/__init__.py +0 -0
  56. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/adapters/_base.py +0 -0
  57. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/adapters/cursor_bugbot.py +0 -0
  58. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/adapters/gitar.py +0 -0
  59. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/adapters/greptile.py +0 -0
  60. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/adapters/qodo.py +0 -0
  61. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/antigravity_cli_audit_pr.py +0 -0
  62. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/antigravity_sdk_probe.py +0 -0
  63. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/audit_handoff_log.py +0 -0
  64. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/audit_labeler_lib.py +0 -0
  65. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/audit_limits.py +0 -0
  66. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/audit_progress.py +0 -0
  67. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/blind_review_artifacts.py +0 -0
  68. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/blind_review_coordinator.py +0 -0
  69. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/bootstrap.py +0 -0
  70. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/builder_experiment.py +0 -0
  71. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/builder_runs.py +0 -0
  72. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/calibration/__init__.py +0 -0
  73. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/calibration/arms.py +0 -0
  74. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/calibration/auto_discovery.py +0 -0
  75. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/calibration/commands.py +0 -0
  76. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/calibration/context_inputs.py +0 -0
  77. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/calibration/corpus.py +0 -0
  78. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/calibration/effect_report.py +0 -0
  79. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/calibration/evidence.py +0 -0
  80. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/calibration/evidence_report.py +0 -0
  81. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/calibration/identity.py +0 -0
  82. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/calibration/metrics.py +0 -0
  83. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/calibration/overlap.py +0 -0
  84. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/calibration/planning.py +0 -0
  85. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/calibration/policy.py +0 -0
  86. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/calibration/results.py +0 -0
  87. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/calibration/run_results.py +0 -0
  88. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/calibration/run_status.py +0 -0
  89. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/calibration/runner.py +0 -0
  90. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/calibration/truth.py +0 -0
  91. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/calibration/value_report.py +0 -0
  92. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/checks.py +0 -0
  93. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/claude_audit_pr.py +0 -0
  94. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/claude_cli_bounce.py +0 -0
  95. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/claude_cli_environment.py +0 -0
  96. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/clear_stale.py +0 -0
  97. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/cli.py +0 -0
  98. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/cloud.py +0 -0
  99. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/cloud_client/__init__.py +0 -0
  100. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/cloud_client/bundle.py +0 -0
  101. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/cloud_client/doctor.py +0 -0
  102. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/cloud_client/dogfood.py +0 -0
  103. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/cloud_client/endpoints.py +0 -0
  104. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/cloud_client/errors.py +0 -0
  105. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/cloud_client/events.py +0 -0
  106. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/cloud_client/export.py +0 -0
  107. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/cloud_client/git_metadata.py +0 -0
  108. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/cloud_client/manifest.py +0 -0
  109. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/cloud_client/operations.py +0 -0
  110. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/cloud_client/reports.py +0 -0
  111. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/cloud_client/setup.py +0 -0
  112. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/cloud_client/tokens.py +0 -0
  113. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/cloud_client/upload.py +0 -0
  114. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/code_mower_calibration.py +0 -0
  115. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/code_mower_context_packs.py +0 -0
  116. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/code_mower_merge.py +0 -0
  117. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/code_mower_telemetry.py +0 -0
  118. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/coderabbit_cli_audit_pr.py +0 -0
  119. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/codex_audit_env_preflight.py +0 -0
  120. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/codex_audit_pr.py +0 -0
  121. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/codex_audit_schema_smoke.py +0 -0
  122. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/codex_audit_verdict.schema.json +0 -0
  123. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/config.py +0 -0
  124. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/decisions.py +0 -0
  125. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/audit_limits.py +0 -0
  126. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/cloud.py +0 -0
  127. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/common.py +0 -0
  128. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/github.py +0 -0
  129. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/github_actions.py +0 -0
  130. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/github_actions_cost.py +0 -0
  131. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/github_actions_cost_summary.py +0 -0
  132. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/github_actions_failure_annotations.py +0 -0
  133. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/github_actions_failure_models.py +0 -0
  134. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/github_actions_failure_scan.py +0 -0
  135. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/github_actions_failure_selection.py +0 -0
  136. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/github_actions_failures.py +0 -0
  137. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/github_actions_permissions.py +0 -0
  138. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/github_api.py +0 -0
  139. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/github_branch.py +0 -0
  140. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/github_config.py +0 -0
  141. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/github_human_token.py +0 -0
  142. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/github_provider.py +0 -0
  143. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/groups.py +0 -0
  144. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/models.py +0 -0
  145. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/output.py +0 -0
  146. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/presets.py +0 -0
  147. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/privacy.py +0 -0
  148. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/provider_api_model.py +0 -0
  149. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/provider_api_model_openai.py +0 -0
  150. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/provider_api_model_profiles.py +0 -0
  151. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/provider_env.py +0 -0
  152. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/provider_env_required.py +0 -0
  153. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/provider_env_tokens.py +0 -0
  154. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/provider_local_audit_setup.py +0 -0
  155. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/provider_local_cli.py +0 -0
  156. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/provider_local_cli_commands.py +0 -0
  157. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/provider_local_cli_probe_config.py +0 -0
  158. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/provider_probe.py +0 -0
  159. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/provider_probe_auth.py +0 -0
  160. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/provider_probe_evaluation.py +0 -0
  161. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/provider_probe_json.py +0 -0
  162. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/provider_probe_remediation.py +0 -0
  163. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/provider_review_hygiene.py +0 -0
  164. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/providers.py +0 -0
  165. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/runtime.py +0 -0
  166. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/runtime_github_auth.py +0 -0
  167. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/doctor_checks/self_hosted_runner.py +0 -0
  168. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/gate_health.py +0 -0
  169. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/gemini_cli_audit_pr.py +0 -0
  170. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/grok_build_audit_pr.py +0 -0
  171. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/hermes_cli_audit_pr.py +0 -0
  172. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/lane_configs/__init__.py +0 -0
  173. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/lane_configs/aider.py +0 -0
  174. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/lane_configs/antigravity_cli.py +0 -0
  175. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/lane_configs/claude.py +0 -0
  176. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/lane_configs/codex.py +0 -0
  177. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/lane_configs/devin.py +0 -0
  178. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/lane_configs/gemini_cli.py +0 -0
  179. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/lane_configs/grok_build.py +0 -0
  180. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/lane_configs/hermes_cli.py +0 -0
  181. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/lane_configs/local_llm.py +0 -0
  182. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/local_llm_audit_pr.py +0 -0
  183. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/local_llm_bakeoff.py +0 -0
  184. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/local_llm_calibration.py +0 -0
  185. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/local_llm_profiles.py +0 -0
  186. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/migration.py +0 -0
  187. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/migration_install.py +0 -0
  188. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/migration_mirror.py +0 -0
  189. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/migration_readiness.py +0 -0
  190. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/migration_rehearsal.py +0 -0
  191. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/observe.py +0 -0
  192. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/package.py +0 -0
  193. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/package_paths.py +0 -0
  194. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/package_rendering.py +0 -0
  195. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/plan_context.py +0 -0
  196. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/prompts.py +0 -0
  197. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/provider_registry.py +0 -0
  198. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/provider_runners/__init__.py +0 -0
  199. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/provider_runners/comments.py +0 -0
  200. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/provider_runners/exit_codes.py +0 -0
  201. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/provider_runners/git.py +0 -0
  202. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/provider_runners/github_auth.py +0 -0
  203. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/provider_runners/github_pr.py +0 -0
  204. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/provider_runners/pr_worktree.py +0 -0
  205. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/provider_runners/process.py +0 -0
  206. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/provider_runners/repo_paths.py +0 -0
  207. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/provider_runners/text_schema.py +0 -0
  208. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/provider_runners/verdict_artifacts.py +0 -0
  209. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/provider_runners/workspace.py +0 -0
  210. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/providers/__init__.py +0 -0
  211. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/providers/local_cli.py +0 -0
  212. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/providers/provenance.py +0 -0
  213. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/release_readiness.py +0 -0
  214. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/reviewer_metrics.py +0 -0
  215. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/reviewer_spend.py +0 -0
  216. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/saas_reviewer_labeler.py +0 -0
  217. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/secrets.py +0 -0
  218. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/templates/builder-experiment.example.json +0 -0
  219. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/templates/calibration-corpus.example.json +0 -0
  220. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/templates/calibration-corpus.json +0 -0
  221. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/templates/code-mower.example.yml +0 -0
  222. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/templates/context-packs.example.json +0 -0
  223. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/templates/lane_prompts/base-audit.md +0 -0
  224. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/templates/lane_prompts/calibration-policy.md +0 -0
  225. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/templates/lane_prompts/context-driven-quality.md +0 -0
  226. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/templates/lane_prompts/docs-design.md +0 -0
  227. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/templates/lane_prompts/generic-programming.md +0 -0
  228. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/templates/lane_prompts/operability.md +0 -0
  229. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/templates/lane_prompts/package-runtime.md +0 -0
  230. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/templates/lane_prompts/plan-conformance.md +0 -0
  231. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/templates/lane_prompts/security-threat-model.md +0 -0
  232. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/templates/lanes/README.md +0 -0
  233. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/templates/lanes/claude.md +0 -0
  234. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/templates/lanes/codex.md +0 -0
  235. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/templates/lanes/cursor.md +0 -0
  236. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/templates/lanes/generic.md +0 -0
  237. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/templates/lanes/run_mac_lane.sh +0 -0
  238. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/templates/product-support/code_mower +0 -0
  239. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/templates/product-support/code_mower_standalone_pin.env +0 -0
  240. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/templates/product-support/code_mower_standalone_shadow.sh +0 -0
  241. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/templates/product-support/safe_gh_comment.py +0 -0
  242. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/templates/product-support/status_report.py +0 -0
  243. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/templates/providers.yml +0 -0
  244. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/templates/reviewer-spend.example.json +0 -0
  245. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/templates/reviewer-value-report.example.md +0 -0
  246. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/templates/workflows/audit-label-cleanup.yml.j2 +0 -0
  247. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/templates/workflows/code-mower-agent-pr-labeler.yml.j2 +0 -0
  248. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/templates/workflows/code-mower-fix-round-dispatch.yml.j2 +0 -0
  249. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/templates/workflows/dispatch-lanes.yml.j2 +0 -0
  250. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/templates/workflows/hosted-bridge.yml.j2 +0 -0
  251. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/templates/workflows/local-cli-audit.yml.j2 +0 -0
  252. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/templates/workflows/needs-owner-notify.yml.j2 +0 -0
  253. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/trailer_comment_labeler.py +0 -0
  254. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/versioning.py +0 -0
  255. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/work_orders.py +0 -0
  256. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower/workflow_actionlint.py +0 -0
  257. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower.egg-info/dependency_links.txt +0 -0
  258. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower.egg-info/entry_points.txt +0 -0
  259. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower.egg-info/requires.txt +0 -0
  260. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/src/code_mower.egg-info/top_level.txt +0 -0
  261. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/templates/builder-experiment.example.json +0 -0
  262. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/templates/calibration-corpus.example.json +0 -0
  263. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/templates/calibration-corpus.json +0 -0
  264. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/templates/code-mower.yml.j2 +0 -0
  265. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/templates/context-packs.example.json +0 -0
  266. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/templates/cursor/BUGBOT.md +0 -0
  267. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/templates/lanes/README.md +0 -0
  268. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/templates/lanes/claude.md +0 -0
  269. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/templates/lanes/codex.md +0 -0
  270. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/templates/lanes/cursor.md +0 -0
  271. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/templates/lanes/generic.md +0 -0
  272. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/templates/lanes/run_mac_lane.sh +0 -0
  273. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/templates/providers/acp_bridge.yml +0 -0
  274. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/templates/providers/aider.yml +0 -0
  275. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/templates/providers/antigravity_cli.yml +0 -0
  276. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/templates/providers/claude_audit.yml +0 -0
  277. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/templates/providers/claude_review.yml +0 -0
  278. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/templates/providers/coderabbit_cli.yml +0 -0
  279. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/templates/providers/codex.yml +0 -0
  280. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/templates/providers/cursor_bugbot.yml +0 -0
  281. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/templates/providers/devin.yml +0 -0
  282. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/templates/providers/gemini_cli.yml +0 -0
  283. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/templates/providers/gitar.yml +0 -0
  284. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/templates/providers/greptile.yml +0 -0
  285. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/templates/providers/hermes_cli.yml +0 -0
  286. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/templates/providers/local_llm.yml +0 -0
  287. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/templates/providers/qodo.yml +0 -0
  288. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/templates/providers.yml +0 -0
  289. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/templates/reviewer-spend.example.json +0 -0
  290. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/templates/reviewer-value-report.example.md +0 -0
  291. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/templates/workflows/audit-label-cleanup.yml.j2 +0 -0
  292. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/templates/workflows/code-mower-agent-pr-labeler.yml.j2 +0 -0
  293. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/templates/workflows/code-mower-fix-round-dispatch.yml.j2 +0 -0
  294. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/templates/workflows/dispatch-lanes.yml.j2 +0 -0
  295. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/templates/workflows/hosted-bridge.yml.j2 +0 -0
  296. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/templates/workflows/local-cli-audit.yml.j2 +0 -0
  297. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/tests/test_antigravity_sdk_probe.py +0 -0
  298. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/tests/test_audit_comment_posture.py +0 -0
  299. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/tests/test_audit_limits.py +0 -0
  300. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/tests/test_builder_experiment.py +0 -0
  301. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/tests/test_builder_identity.py +0 -0
  302. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/tests/test_builder_runs.py +0 -0
  303. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/tests/test_calibration_effect_report.py +0 -0
  304. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/tests/test_calibration_truth.py +0 -0
  305. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/tests/test_checks.py +0 -0
  306. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/tests/test_claude_audit_pr.py +0 -0
  307. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/tests/test_claude_cli_bounce.py +0 -0
  308. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/tests/test_clear_stale.py +0 -0
  309. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/tests/test_cloud_client.py +0 -0
  310. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/tests/test_cloud_git_metadata.py +0 -0
  311. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/tests/test_cloud_manifest.py +0 -0
  312. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/tests/test_cloud_reports.py +0 -0
  313. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/tests/test_coderabbit_cli_audit_pr.py +0 -0
  314. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/tests/test_codex_audit_env_preflight.py +0 -0
  315. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/tests/test_codex_audit_pr.py +0 -0
  316. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/tests/test_decision_audit_integration.py +0 -0
  317. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/tests/test_decisions.py +0 -0
  318. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/tests/test_doctor_actions_cost_summary.py +0 -0
  319. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/tests/test_doctor_actions_failure_selection.py +0 -0
  320. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/tests/test_doctor_output.py +0 -0
  321. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/tests/test_doctor_privacy.py +0 -0
  322. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/tests/test_doctor_provider_env_required.py +0 -0
  323. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/tests/test_doctor_provider_env_tokens.py +0 -0
  324. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/tests/test_doctor_provider_local_audit_setup.py +0 -0
  325. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/tests/test_doctor_provider_probe.py +0 -0
  326. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/tests/test_doctor_provider_review_hygiene.py +0 -0
  327. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/tests/test_doctor_runtime.py +0 -0
  328. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/tests/test_doctor_self_hosted_runner.py +0 -0
  329. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/tests/test_gate_health.py +0 -0
  330. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/tests/test_init_actionlint.py +0 -0
  331. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/tests/test_init_build_loop.py +0 -0
  332. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/tests/test_local_llm_github_helpers.py +0 -0
  333. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/tests/test_observe.py +0 -0
  334. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/tests/test_plan_context.py +0 -0
  335. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/tests/test_prompts.py +0 -0
  336. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/tests/test_provider_fixture_contracts.py +0 -0
  337. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/tests/test_provider_local_cli.py +0 -0
  338. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/tests/test_provider_runners_comments.py +0 -0
  339. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/tests/test_provider_runners_git.py +0 -0
  340. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/tests/test_provider_runners_github_pr.py +0 -0
  341. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/tests/test_provider_runners_pr_worktree.py +0 -0
  342. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/tests/test_provider_runners_process.py +0 -0
  343. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/tests/test_provider_runners_repo_paths.py +0 -0
  344. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/tests/test_provider_runners_text_schema.py +0 -0
  345. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/tests/test_provider_runners_workspace.py +0 -0
  346. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/tests/test_reviewer_metrics_core.py +0 -0
  347. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/tests/test_reviewer_spend.py +0 -0
  348. {code_mower-0.6.0b2 → code_mower-0.6.0b3}/tests/test_trailer_comment_labeler.py +0 -0
  349. {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.0b2
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 --preflight` is the first useful command. It checks your
61
- runtime, GitHub setup, provider CLIs, token posture, optional cloud setup, and
62
- private-repo Actions cost traps. `--preflight` is the friendly first-run preset;
63
- `doctor --v05` remains an equivalent compatibility alias for older scripts.
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 --preflight
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 --preflight`, open a small setup PR, run Codex and Claude audits, then merge manually when the audit evidence is clean. | [Try Code Mower In 10 Minutes](docs/try-in-10-minutes.md) |
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.2/docs/try-in-10-minutes.md)
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.2` / `code-mower==0.6.0b2`. The
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 --preflight`;
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.2`, with pinned package-index
332
- install spec `code-mower==0.6.0b2`. Release evidence is recorded on the GitHub
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 --preflight` is the first useful command. It checks your
46
- runtime, GitHub setup, provider CLIs, token posture, optional cloud setup, and
47
- private-repo Actions cost traps. `--preflight` is the friendly first-run preset;
48
- `doctor --v05` remains an equivalent compatibility alias for older scripts.
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 --preflight
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 --preflight`, open a small setup PR, run Codex and Claude audits, then merge manually when the audit evidence is clean. | [Try Code Mower In 10 Minutes](docs/try-in-10-minutes.md) |
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.2/docs/try-in-10-minutes.md)
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.2` / `code-mower==0.6.0b2`. The
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 --preflight`;
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.2`, with pinned package-index
317
- install spec `code-mower==0.6.0b2`. Release evidence is recorded on the GitHub
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)
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "code-mower"
7
- version = "0.6.0b2"
7
+ version = "0.6.0b3"
8
8
  description = "Multi-reviewer AI code audit orchestration"
9
9
  requires-python = ">=3.11"
10
10
  readme = "README.md"
@@ -1,3 +1,3 @@
1
1
  """Code Mower package."""
2
2
 
3
- __version__ = "0.6.0b2"
3
+ __version__ = "0.6.0b3"
@@ -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 f"Enable repository auto-merge with `gh api -X PATCH repos/{slug} -f allow_auto_merge=true`."
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 = {"github": github, "cloud": cloud, "runner": runner}
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(github=github, cloud=cloud, runner=runner)
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,