code-mower 0.5.0b5__tar.gz → 0.5.0b7__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 (255) hide show
  1. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/PKG-INFO +25 -12
  2. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/README.md +24 -11
  3. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/pyproject.toml +1 -1
  4. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/__init__.py +1 -1
  5. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/doctor_checks/models.py +25 -0
  6. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/doctor_checks/output.py +13 -0
  7. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/next_steps.py +3 -2
  8. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/release_readiness.py +17 -11
  9. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/versioning.py +8 -0
  10. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower.egg-info/PKG-INFO +25 -12
  11. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/tests/test_doctor_output.py +13 -0
  12. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/tests/test_doctor_registry.py +8 -0
  13. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/tests/test_release_hygiene.py +35 -39
  14. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/CODE_OF_CONDUCT.md +0 -0
  15. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/LICENSE +0 -0
  16. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/MANIFEST.in +0 -0
  17. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/NOTICE +0 -0
  18. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/SUPPORT.md +0 -0
  19. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/requirements/requirements.txt +0 -0
  20. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/setup.cfg +0 -0
  21. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/adapters/__init__.py +0 -0
  22. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/adapters/_base.py +0 -0
  23. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/adapters/cursor_bugbot.py +0 -0
  24. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/adapters/gitar.py +0 -0
  25. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/adapters/greptile.py +0 -0
  26. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/adapters/qodo.py +0 -0
  27. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/antigravity_cli_audit_pr.py +0 -0
  28. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/audit_handoff_log.py +0 -0
  29. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/audit_labeler_lib.py +0 -0
  30. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/audit_progress.py +0 -0
  31. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/blind_review_artifacts.py +0 -0
  32. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/blind_review_coordinator.py +0 -0
  33. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/bootstrap.py +0 -0
  34. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/builder_experiment.py +0 -0
  35. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/calibration/__init__.py +0 -0
  36. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/calibration/arms.py +0 -0
  37. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/calibration/auto_discovery.py +0 -0
  38. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/calibration/commands.py +0 -0
  39. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/calibration/context_inputs.py +0 -0
  40. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/calibration/corpus.py +0 -0
  41. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/calibration/evidence.py +0 -0
  42. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/calibration/evidence_report.py +0 -0
  43. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/calibration/identity.py +0 -0
  44. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/calibration/metrics.py +0 -0
  45. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/calibration/overlap.py +0 -0
  46. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/calibration/planning.py +0 -0
  47. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/calibration/policy.py +0 -0
  48. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/calibration/results.py +0 -0
  49. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/calibration/run_results.py +0 -0
  50. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/calibration/run_status.py +0 -0
  51. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/calibration/runner.py +0 -0
  52. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/calibration/truth.py +0 -0
  53. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/calibration/value_report.py +0 -0
  54. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/checks.py +0 -0
  55. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/claude_audit_pr.py +0 -0
  56. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/claude_cli_bounce.py +0 -0
  57. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/claude_cli_environment.py +0 -0
  58. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/clear_stale.py +0 -0
  59. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/cli.py +0 -0
  60. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/cloud.py +0 -0
  61. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/cloud_client/__init__.py +0 -0
  62. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/cloud_client/bundle.py +0 -0
  63. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/cloud_client/doctor.py +0 -0
  64. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/cloud_client/dogfood.py +0 -0
  65. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/cloud_client/endpoints.py +0 -0
  66. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/cloud_client/errors.py +0 -0
  67. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/cloud_client/events.py +0 -0
  68. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/cloud_client/export.py +0 -0
  69. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/cloud_client/git_metadata.py +0 -0
  70. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/cloud_client/manifest.py +0 -0
  71. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/cloud_client/operations.py +0 -0
  72. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/cloud_client/reports.py +0 -0
  73. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/cloud_client/setup.py +0 -0
  74. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/cloud_client/upload.py +0 -0
  75. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/code_mower_calibration.py +0 -0
  76. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/code_mower_context_packs.py +0 -0
  77. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/code_mower_merge.py +0 -0
  78. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/code_mower_telemetry.py +0 -0
  79. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/coderabbit_cli_audit_pr.py +0 -0
  80. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/codex_audit_env_preflight.py +0 -0
  81. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/codex_audit_pr.py +0 -0
  82. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/codex_audit_schema_smoke.py +0 -0
  83. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/codex_audit_verdict.schema.json +0 -0
  84. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/config.py +0 -0
  85. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/doctor.py +0 -0
  86. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/doctor_checks/__init__.py +0 -0
  87. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/doctor_checks/cloud.py +0 -0
  88. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/doctor_checks/common.py +0 -0
  89. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/doctor_checks/github.py +0 -0
  90. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/doctor_checks/github_actions.py +0 -0
  91. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/doctor_checks/github_actions_cost.py +0 -0
  92. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/doctor_checks/github_actions_cost_summary.py +0 -0
  93. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/doctor_checks/github_actions_failure_annotations.py +0 -0
  94. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/doctor_checks/github_actions_failure_models.py +0 -0
  95. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/doctor_checks/github_actions_failure_scan.py +0 -0
  96. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/doctor_checks/github_actions_failure_selection.py +0 -0
  97. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/doctor_checks/github_actions_failures.py +0 -0
  98. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/doctor_checks/github_actions_permissions.py +0 -0
  99. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/doctor_checks/github_api.py +0 -0
  100. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/doctor_checks/github_branch.py +0 -0
  101. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/doctor_checks/github_config.py +0 -0
  102. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/doctor_checks/github_provider.py +0 -0
  103. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/doctor_checks/github_repo.py +0 -0
  104. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/doctor_checks/groups.py +0 -0
  105. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/doctor_checks/presets.py +0 -0
  106. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/doctor_checks/privacy.py +0 -0
  107. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/doctor_checks/provider_api_model.py +0 -0
  108. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/doctor_checks/provider_api_model_openai.py +0 -0
  109. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/doctor_checks/provider_api_model_profiles.py +0 -0
  110. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/doctor_checks/provider_env.py +0 -0
  111. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/doctor_checks/provider_env_required.py +0 -0
  112. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/doctor_checks/provider_env_tokens.py +0 -0
  113. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/doctor_checks/provider_local_cli.py +0 -0
  114. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/doctor_checks/provider_local_cli_commands.py +0 -0
  115. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/doctor_checks/provider_local_cli_probe_config.py +0 -0
  116. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/doctor_checks/provider_probe.py +0 -0
  117. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/doctor_checks/provider_probe_auth.py +0 -0
  118. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/doctor_checks/provider_probe_evaluation.py +0 -0
  119. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/doctor_checks/provider_probe_json.py +0 -0
  120. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/doctor_checks/provider_probe_remediation.py +0 -0
  121. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/doctor_checks/providers.py +0 -0
  122. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/doctor_checks/registry.py +0 -0
  123. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/doctor_checks/runner.py +0 -0
  124. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/doctor_checks/runtime.py +0 -0
  125. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/doctor_checks/runtime_github_auth.py +0 -0
  126. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/gemini_cli_audit_pr.py +0 -0
  127. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/hermes_cli_audit_pr.py +0 -0
  128. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/init.py +0 -0
  129. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/lane_configs/__init__.py +0 -0
  130. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/lane_configs/aider.py +0 -0
  131. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/lane_configs/antigravity_cli.py +0 -0
  132. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/lane_configs/claude.py +0 -0
  133. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/lane_configs/codex.py +0 -0
  134. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/lane_configs/devin.py +0 -0
  135. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/lane_configs/gemini_cli.py +0 -0
  136. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/lane_configs/hermes_cli.py +0 -0
  137. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/lane_configs/local_llm.py +0 -0
  138. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/local_llm_audit_pr.py +0 -0
  139. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/local_llm_bakeoff.py +0 -0
  140. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/local_llm_calibration.py +0 -0
  141. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/local_llm_profiles.py +0 -0
  142. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/migration.py +0 -0
  143. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/migration_install.py +0 -0
  144. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/migration_mirror.py +0 -0
  145. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/migration_readiness.py +0 -0
  146. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/migration_rehearsal.py +0 -0
  147. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/package.py +0 -0
  148. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/package_content.py +0 -0
  149. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/package_manifest.py +0 -0
  150. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/package_paths.py +0 -0
  151. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/package_rendering.py +0 -0
  152. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/package_static.py +0 -0
  153. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/prompts.py +0 -0
  154. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/provider_registry.py +0 -0
  155. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/provider_runners/__init__.py +0 -0
  156. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/provider_runners/comments.py +0 -0
  157. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/provider_runners/git.py +0 -0
  158. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/provider_runners/github_auth.py +0 -0
  159. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/provider_runners/github_pr.py +0 -0
  160. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/provider_runners/process.py +0 -0
  161. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/provider_runners/repo_paths.py +0 -0
  162. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/provider_runners/text_schema.py +0 -0
  163. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/provider_runners/verdict_artifacts.py +0 -0
  164. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/provider_runners/workspace.py +0 -0
  165. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/reviewer_metrics.py +0 -0
  166. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/saas_reviewer_labeler.py +0 -0
  167. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/secrets.py +0 -0
  168. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/templates/builder-experiment.example.json +0 -0
  169. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/templates/calibration-corpus.example.json +0 -0
  170. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/templates/calibration-corpus.json +0 -0
  171. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/templates/code-mower.example.yml +0 -0
  172. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/templates/context-packs.example.json +0 -0
  173. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/templates/lane_prompts/base-audit.md +0 -0
  174. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/templates/lane_prompts/calibration-policy.md +0 -0
  175. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/templates/lane_prompts/context-driven-quality.md +0 -0
  176. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/templates/lane_prompts/docs-design.md +0 -0
  177. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/templates/lane_prompts/generic-programming.md +0 -0
  178. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/templates/lane_prompts/operability.md +0 -0
  179. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/templates/lane_prompts/package-runtime.md +0 -0
  180. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/templates/lane_prompts/security-threat-model.md +0 -0
  181. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/templates/product-support/code_mower +0 -0
  182. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/templates/product-support/code_mower_standalone_pin.env +0 -0
  183. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/templates/product-support/code_mower_standalone_shadow.sh +0 -0
  184. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/templates/product-support/run_claude_audit_pr.sh +0 -0
  185. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/templates/product-support/run_codex_audit_pr.sh +0 -0
  186. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/templates/product-support/safe_gh_comment.py +0 -0
  187. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/templates/providers.yml +0 -0
  188. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/templates/reviewer-spend.example.json +0 -0
  189. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/templates/reviewer-value-report.example.md +0 -0
  190. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/templates/workflows/private-standalone-shadow.yml.j2 +0 -0
  191. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/templates/workflows/review-clear-stale.yml.j2 +0 -0
  192. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/trailer_comment_labeler.py +0 -0
  193. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower.egg-info/SOURCES.txt +0 -0
  194. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower.egg-info/dependency_links.txt +0 -0
  195. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower.egg-info/entry_points.txt +0 -0
  196. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower.egg-info/requires.txt +0 -0
  197. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower.egg-info/top_level.txt +0 -0
  198. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/templates/builder-experiment.example.json +0 -0
  199. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/templates/calibration-corpus.example.json +0 -0
  200. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/templates/calibration-corpus.json +0 -0
  201. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/templates/code-mower.yml.j2 +0 -0
  202. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/templates/context-packs.example.json +0 -0
  203. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/templates/cursor/BUGBOT.md +0 -0
  204. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/templates/providers/acp_bridge.yml +0 -0
  205. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/templates/providers/aider.yml +0 -0
  206. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/templates/providers/antigravity_cli.yml +0 -0
  207. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/templates/providers/claude_audit.yml +0 -0
  208. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/templates/providers/claude_review.yml +0 -0
  209. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/templates/providers/coderabbit_cli.yml +0 -0
  210. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/templates/providers/codex.yml +0 -0
  211. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/templates/providers/cursor_bugbot.yml +0 -0
  212. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/templates/providers/devin.yml +0 -0
  213. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/templates/providers/gemini_cli.yml +0 -0
  214. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/templates/providers/gitar.yml +0 -0
  215. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/templates/providers/greptile.yml +0 -0
  216. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/templates/providers/hermes_cli.yml +0 -0
  217. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/templates/providers/local_llm.yml +0 -0
  218. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/templates/providers/qodo.yml +0 -0
  219. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/templates/providers.yml +0 -0
  220. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/templates/reviewer-spend.example.json +0 -0
  221. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/templates/reviewer-value-report.example.md +0 -0
  222. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/templates/workflows/audit-label-cleanup.yml.j2 +0 -0
  223. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/templates/workflows/blind-review-artifacts-dry-run.yml.j2 +0 -0
  224. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/templates/workflows/hosted-bridge.yml.j2 +0 -0
  225. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/templates/workflows/local-cli-audit.yml.j2 +0 -0
  226. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/templates/workflows/private-standalone-shadow.yml.j2 +0 -0
  227. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/templates/workflows/review-clear-stale.yml.j2 +0 -0
  228. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/templates/workflows/saas-reviewer-labeler.yml.j2 +0 -0
  229. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/templates/workflows/trailer-comment-labeler.yml.j2 +0 -0
  230. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/tests/test_calibration_truth.py +0 -0
  231. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/tests/test_checks.py +0 -0
  232. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/tests/test_claude_cli_bounce.py +0 -0
  233. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/tests/test_clear_stale.py +0 -0
  234. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/tests/test_cloud_client.py +0 -0
  235. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/tests/test_cloud_git_metadata.py +0 -0
  236. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/tests/test_cloud_manifest.py +0 -0
  237. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/tests/test_cloud_reports.py +0 -0
  238. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/tests/test_coderabbit_cli_audit_pr.py +0 -0
  239. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/tests/test_doctor_actions_cost_summary.py +0 -0
  240. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/tests/test_doctor_actions_failure_selection.py +0 -0
  241. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/tests/test_doctor_boundaries.py +0 -0
  242. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/tests/test_doctor_github_checks.py +0 -0
  243. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/tests/test_doctor_privacy.py +0 -0
  244. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/tests/test_doctor_provider_env_required.py +0 -0
  245. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/tests/test_doctor_provider_env_tokens.py +0 -0
  246. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/tests/test_doctor_provider_probe.py +0 -0
  247. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/tests/test_local_llm_github_helpers.py +0 -0
  248. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/tests/test_provider_runners_comments.py +0 -0
  249. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/tests/test_provider_runners_git.py +0 -0
  250. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/tests/test_provider_runners_github_pr.py +0 -0
  251. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/tests/test_provider_runners_process.py +0 -0
  252. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/tests/test_provider_runners_repo_paths.py +0 -0
  253. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/tests/test_provider_runners_text_schema.py +0 -0
  254. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/tests/test_provider_runners_workspace.py +0 -0
  255. {code_mower-0.5.0b5 → code_mower-0.5.0b7}/tests/test_reviewer_metrics_core.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: code-mower
3
- Version: 0.5.0b5
3
+ Version: 0.5.0b7
4
4
  Summary: Multi-reviewer AI code audit orchestration
5
5
  License-Expression: Apache-2.0
6
6
  Requires-Python: >=3.11
@@ -98,10 +98,17 @@ Code Mower currently targets Python 3.11+; Python 3.12 is recommended.
98
98
 
99
99
  ```bash
100
100
  python3.12 --version
101
- pipx install --python python3.12 "git+https://github.com/codemower-ai/code-mower.git@v0.5.0-beta.5"
101
+ pipx install --python python3.12 code-mower==0.5.0b7
102
102
  code-mower --version
103
103
  ```
104
104
 
105
+ `0.5.0b7` is a beta release. Until Code Mower publishes a stable `1.0`
106
+ line, use the explicit beta version above or allow prereleases with:
107
+
108
+ ```bash
109
+ pipx install --python python3.12 --pip-args="--pre" code-mower
110
+ ```
111
+
105
112
  From the repository you want to pilot:
106
113
 
107
114
  ```bash
@@ -167,7 +174,8 @@ The cloud value loop is:
167
174
  2. inspect the metadata-only bundle or dogfood preview;
168
175
  3. upload only with `--yes`; and
169
176
  4. use [CodeMower.com](https://codemower.com) to see repo rollups, provider/lens
170
- signal, cost/latency, noisy lanes, and next-lane recommendations over time.
177
+ signal, cost/latency, noisy lanes, next-lane recommendations, and
178
+ token-safe evidence/detail pages over time.
171
179
 
172
180
  Start with a dry run:
173
181
 
@@ -177,6 +185,12 @@ code-mower cloud dogfood --json
177
185
 
178
186
  Nothing uploads unless you pass `--yes`.
179
187
 
188
+ Current dogfood uploads, historical catch-up imports, and calibrated
189
+ reviewer/lens evidence are intentionally separate. Imported GitHub Actions
190
+ history can prove activity and upload health; it should not be treated as
191
+ reviewer-quality evidence until it is calibrated against known-clean and
192
+ known-blocked cases.
193
+
180
194
  To connect to [CodeMower.com](https://codemower.com), sign in at
181
195
  [https://codemower.com/login](https://codemower.com/login), create or receive a
182
196
  team token, then run:
@@ -232,11 +246,11 @@ best?" to "which AI builder plus reviewer loop ships best on this product?" See
232
246
 
233
247
  ## Installation Status
234
248
 
235
- The current public beta is `v0.5.0-beta.5` from
236
- [codemower-ai/code-mower](https://github.com/codemower-ai/code-mower). PyPI
237
- distribution builds now run from GitHub Releases. Publishing to PyPI remains
238
- off by default until trusted publishing is configured, so use the tagged GitHub
239
- install command above for this beta.
249
+ The current public beta is `v0.5.0-beta.7` from
250
+ [codemower-ai/code-mower](https://github.com/codemower-ai/code-mower), and it
251
+ is published as `code-mower==0.5.0b7` on
252
+ [PyPI](https://pypi.org/project/code-mower/). GitHub releases remain the
253
+ auditable source for tags, build artifacts, and release notes.
240
254
 
241
255
  For source checkout development and release rehearsal, use:
242
256
 
@@ -250,10 +264,9 @@ The wrapper resolves Python 3.12+ and refuses stale or old system Python shims.
250
264
 
251
265
  ## Known Limitations
252
266
 
253
- - PyPI distribution builds exist, but publishing is gated until trusted
254
- publishing is configured; use the tagged GitHub install command. See
255
- [docs/pypi-release.md](docs/pypi-release.md) for the TestPyPI/PyPI
256
- activation path.
267
+ - PyPI distribution publishing is active through trusted publishing; see
268
+ [docs/pypi-release.md](docs/pypi-release.md) for the release and
269
+ verification runbook.
257
270
  - GitHub is the primary supported forge. GitLab, Bitbucket, and ACP bridges are
258
271
  roadmap items.
259
272
  - Hosted/SaaS reviewers start informational or manual until calibration data
@@ -86,10 +86,17 @@ Code Mower currently targets Python 3.11+; Python 3.12 is recommended.
86
86
 
87
87
  ```bash
88
88
  python3.12 --version
89
- pipx install --python python3.12 "git+https://github.com/codemower-ai/code-mower.git@v0.5.0-beta.5"
89
+ pipx install --python python3.12 code-mower==0.5.0b7
90
90
  code-mower --version
91
91
  ```
92
92
 
93
+ `0.5.0b7` is a beta release. Until Code Mower publishes a stable `1.0`
94
+ line, use the explicit beta version above or allow prereleases with:
95
+
96
+ ```bash
97
+ pipx install --python python3.12 --pip-args="--pre" code-mower
98
+ ```
99
+
93
100
  From the repository you want to pilot:
94
101
 
95
102
  ```bash
@@ -155,7 +162,8 @@ The cloud value loop is:
155
162
  2. inspect the metadata-only bundle or dogfood preview;
156
163
  3. upload only with `--yes`; and
157
164
  4. use [CodeMower.com](https://codemower.com) to see repo rollups, provider/lens
158
- signal, cost/latency, noisy lanes, and next-lane recommendations over time.
165
+ signal, cost/latency, noisy lanes, next-lane recommendations, and
166
+ token-safe evidence/detail pages over time.
159
167
 
160
168
  Start with a dry run:
161
169
 
@@ -165,6 +173,12 @@ code-mower cloud dogfood --json
165
173
 
166
174
  Nothing uploads unless you pass `--yes`.
167
175
 
176
+ Current dogfood uploads, historical catch-up imports, and calibrated
177
+ reviewer/lens evidence are intentionally separate. Imported GitHub Actions
178
+ history can prove activity and upload health; it should not be treated as
179
+ reviewer-quality evidence until it is calibrated against known-clean and
180
+ known-blocked cases.
181
+
168
182
  To connect to [CodeMower.com](https://codemower.com), sign in at
169
183
  [https://codemower.com/login](https://codemower.com/login), create or receive a
170
184
  team token, then run:
@@ -220,11 +234,11 @@ best?" to "which AI builder plus reviewer loop ships best on this product?" See
220
234
 
221
235
  ## Installation Status
222
236
 
223
- The current public beta is `v0.5.0-beta.5` from
224
- [codemower-ai/code-mower](https://github.com/codemower-ai/code-mower). PyPI
225
- distribution builds now run from GitHub Releases. Publishing to PyPI remains
226
- off by default until trusted publishing is configured, so use the tagged GitHub
227
- install command above for this beta.
237
+ The current public beta is `v0.5.0-beta.7` from
238
+ [codemower-ai/code-mower](https://github.com/codemower-ai/code-mower), and it
239
+ is published as `code-mower==0.5.0b7` on
240
+ [PyPI](https://pypi.org/project/code-mower/). GitHub releases remain the
241
+ auditable source for tags, build artifacts, and release notes.
228
242
 
229
243
  For source checkout development and release rehearsal, use:
230
244
 
@@ -238,10 +252,9 @@ The wrapper resolves Python 3.12+ and refuses stale or old system Python shims.
238
252
 
239
253
  ## Known Limitations
240
254
 
241
- - PyPI distribution builds exist, but publishing is gated until trusted
242
- publishing is configured; use the tagged GitHub install command. See
243
- [docs/pypi-release.md](docs/pypi-release.md) for the TestPyPI/PyPI
244
- activation path.
255
+ - PyPI distribution publishing is active through trusted publishing; see
256
+ [docs/pypi-release.md](docs/pypi-release.md) for the release and
257
+ verification runbook.
245
258
  - GitHub is the primary supported forge. GitLab, Bitbucket, and ACP bridges are
246
259
  roadmap items.
247
260
  - Hosted/SaaS reviewers start informational or manual until calibration data
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "code-mower"
7
- version = "0.5.0b5"
7
+ version = "0.5.0b7"
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.5.0b5"
3
+ __version__ = "0.5.0b7"
@@ -57,6 +57,30 @@ class DoctorReport:
57
57
  return STATUS_WARN
58
58
  return STATUS_PASS
59
59
 
60
+ @property
61
+ def run_plan(self) -> tuple[dict[str, Any], ...]:
62
+ """Return the structured doctor run plan when a report contains one."""
63
+
64
+ for check in self.checks:
65
+ if check.name != "doctor.plan" or not isinstance(check.detail, Mapping):
66
+ continue
67
+ stages = check.detail.get("stages")
68
+ if not isinstance(stages, list):
69
+ return ()
70
+ plan: list[dict[str, Any]] = []
71
+ for stage in stages:
72
+ if not isinstance(stage, Mapping):
73
+ continue
74
+ plan.append(
75
+ {
76
+ "id": str(stage.get("id", "")),
77
+ "group": str(stage.get("group", "")),
78
+ "optional": bool(stage.get("optional", False)),
79
+ }
80
+ )
81
+ return tuple(plan)
82
+ return ()
83
+
60
84
  def group_summary(self) -> dict[str, dict[str, int | str]]:
61
85
  summary: dict[str, dict[str, int | str]] = {}
62
86
  for group_id, label in GROUP_LABELS.items():
@@ -91,6 +115,7 @@ class DoctorReport:
91
115
  "failures": self.failures,
92
116
  "warnings": self.warnings,
93
117
  },
118
+ "run_plan": list(self.run_plan),
94
119
  "groups": self.group_summary(),
95
120
  "checks": [check.as_dict() for check in self.checks],
96
121
  }
@@ -39,6 +39,16 @@ def _format_status_summary(report: DoctorReport) -> str:
39
39
  return ", ".join(parts)
40
40
 
41
41
 
42
+ def _format_run_plan(report: DoctorReport) -> str | None:
43
+ if not report.run_plan:
44
+ return None
45
+ stages = []
46
+ for stage in report.run_plan:
47
+ suffix = " optional" if stage.get("optional") else ""
48
+ stages.append(f"{stage.get('id', '')} ({stage.get('group', '')}{suffix})")
49
+ return ", ".join(stages)
50
+
51
+
42
52
  def _format_check(check: DoctorCheck) -> list[str]:
43
53
  lane = f" [{check.lane}]" if check.lane else ""
44
54
  lines = [f"- {check.status.upper()} {check.name}{lane}: {check.message}"]
@@ -57,6 +67,9 @@ def render_doctor_text(report: DoctorReport) -> str:
57
67
  ]
58
68
  if report.profile:
59
69
  lines.append(f"Profile: {report.profile}")
70
+ run_plan = _format_run_plan(report)
71
+ if run_plan:
72
+ lines.append(f"Run plan: {run_plan}")
60
73
  lines.append(f"Checks: {_format_status_summary(report)}")
61
74
  lines.append("")
62
75
 
@@ -206,8 +206,9 @@ def build_next_steps(
206
206
  "and cloud dry-run artifacts, emits `first_user_readiness`, and "
207
207
  "optionally checks a real repo when --repo-path is provided. "
208
208
  "Wrapper-bearing repos get parity checks; fresh external repos "
209
- "get installed-CLI readiness checks. The tagged release path uses the "
210
- "current GitHub tag until PyPI publishing is promoted."
209
+ "get installed-CLI readiness checks. The default beta path uses "
210
+ "the current published PyPI prerelease; GitHub tags remain a "
211
+ "release-debug fallback."
211
212
  ),
212
213
  "artifacts": [
213
214
  "outputs/package-install-rehearsal.json",
@@ -21,7 +21,7 @@ RELEASE_DOC_PATHS = (
21
21
  "docs/pypi-release.md",
22
22
  "docs/public-release-checklist.md",
23
23
  )
24
- REQUIRED_RELEASE_TAG_DOC_PATHS = (
24
+ REQUIRED_PUBLIC_PACKAGE_SPEC_DOC_PATHS = (
25
25
  "README.md",
26
26
  "docs/quickstart.md",
27
27
  "docs/try-in-10-minutes.md",
@@ -230,10 +230,15 @@ def render_release_readiness(repo_path: Path) -> dict[str, Any]:
230
230
  for relative_path, text in docs.items()
231
231
  if release_tag and release_tag in text
232
232
  ]
233
- missing_release_docs = [
233
+ package_spec_docs = [
234
234
  relative_path
235
- for relative_path in REQUIRED_RELEASE_TAG_DOC_PATHS
236
- if release_tag and release_tag not in docs.get(relative_path, "")
235
+ for relative_path, text in docs.items()
236
+ if package_index_spec and package_index_spec in text
237
+ ]
238
+ missing_package_spec_docs = [
239
+ relative_path
240
+ for relative_path in REQUIRED_PUBLIC_PACKAGE_SPEC_DOC_PATHS
241
+ if package_index_spec and package_index_spec not in docs.get(relative_path, "")
237
242
  ]
238
243
  package_index_docs = [
239
244
  relative_path
@@ -382,14 +387,15 @@ def render_release_readiness(repo_path: Path) -> dict[str, Any]:
382
387
  evidence=str(workflow_path),
383
388
  ),
384
389
  _release_check(
385
- check_id="release-tag-docs-current",
386
- title="Current release tag is present in public install docs",
387
- status="pass" if release_tag and not missing_release_docs else "fail",
388
- evidence=release_tag or "missing version",
390
+ check_id="public-package-spec-docs-current",
391
+ title="Current package-index spec is present in public install docs",
392
+ status="pass" if package_index_spec and not missing_package_spec_docs else "fail",
393
+ evidence=package_index_spec or "missing version",
389
394
  detail={
390
- "docs": version_docs,
391
- "required_docs": list(REQUIRED_RELEASE_TAG_DOC_PATHS),
392
- "missing_docs": missing_release_docs,
395
+ "release_tag_docs": version_docs,
396
+ "package_spec_docs": package_spec_docs,
397
+ "required_docs": list(REQUIRED_PUBLIC_PACKAGE_SPEC_DOC_PATHS),
398
+ "missing_docs": missing_package_spec_docs,
393
399
  },
394
400
  ),
395
401
  _release_check(
@@ -29,4 +29,12 @@ def release_tag_for_version(version: str) -> str:
29
29
 
30
30
 
31
31
  def public_package_spec(version: str, repo_url: str = PUBLIC_REPO_URL) -> str:
32
+ """Return the package-index install spec for public prerelease users."""
33
+
34
+ return f"code-mower=={version}"
35
+
36
+
37
+ def github_package_spec(version: str, repo_url: str = PUBLIC_REPO_URL) -> str:
38
+ """Return the GitHub-tag install spec used for release debugging."""
39
+
32
40
  return f"git+{repo_url}.git@{release_tag_for_version(version)}"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: code-mower
3
- Version: 0.5.0b5
3
+ Version: 0.5.0b7
4
4
  Summary: Multi-reviewer AI code audit orchestration
5
5
  License-Expression: Apache-2.0
6
6
  Requires-Python: >=3.11
@@ -98,10 +98,17 @@ Code Mower currently targets Python 3.11+; Python 3.12 is recommended.
98
98
 
99
99
  ```bash
100
100
  python3.12 --version
101
- pipx install --python python3.12 "git+https://github.com/codemower-ai/code-mower.git@v0.5.0-beta.5"
101
+ pipx install --python python3.12 code-mower==0.5.0b7
102
102
  code-mower --version
103
103
  ```
104
104
 
105
+ `0.5.0b7` is a beta release. Until Code Mower publishes a stable `1.0`
106
+ line, use the explicit beta version above or allow prereleases with:
107
+
108
+ ```bash
109
+ pipx install --python python3.12 --pip-args="--pre" code-mower
110
+ ```
111
+
105
112
  From the repository you want to pilot:
106
113
 
107
114
  ```bash
@@ -167,7 +174,8 @@ The cloud value loop is:
167
174
  2. inspect the metadata-only bundle or dogfood preview;
168
175
  3. upload only with `--yes`; and
169
176
  4. use [CodeMower.com](https://codemower.com) to see repo rollups, provider/lens
170
- signal, cost/latency, noisy lanes, and next-lane recommendations over time.
177
+ signal, cost/latency, noisy lanes, next-lane recommendations, and
178
+ token-safe evidence/detail pages over time.
171
179
 
172
180
  Start with a dry run:
173
181
 
@@ -177,6 +185,12 @@ code-mower cloud dogfood --json
177
185
 
178
186
  Nothing uploads unless you pass `--yes`.
179
187
 
188
+ Current dogfood uploads, historical catch-up imports, and calibrated
189
+ reviewer/lens evidence are intentionally separate. Imported GitHub Actions
190
+ history can prove activity and upload health; it should not be treated as
191
+ reviewer-quality evidence until it is calibrated against known-clean and
192
+ known-blocked cases.
193
+
180
194
  To connect to [CodeMower.com](https://codemower.com), sign in at
181
195
  [https://codemower.com/login](https://codemower.com/login), create or receive a
182
196
  team token, then run:
@@ -232,11 +246,11 @@ best?" to "which AI builder plus reviewer loop ships best on this product?" See
232
246
 
233
247
  ## Installation Status
234
248
 
235
- The current public beta is `v0.5.0-beta.5` from
236
- [codemower-ai/code-mower](https://github.com/codemower-ai/code-mower). PyPI
237
- distribution builds now run from GitHub Releases. Publishing to PyPI remains
238
- off by default until trusted publishing is configured, so use the tagged GitHub
239
- install command above for this beta.
249
+ The current public beta is `v0.5.0-beta.7` from
250
+ [codemower-ai/code-mower](https://github.com/codemower-ai/code-mower), and it
251
+ is published as `code-mower==0.5.0b7` on
252
+ [PyPI](https://pypi.org/project/code-mower/). GitHub releases remain the
253
+ auditable source for tags, build artifacts, and release notes.
240
254
 
241
255
  For source checkout development and release rehearsal, use:
242
256
 
@@ -250,10 +264,9 @@ The wrapper resolves Python 3.12+ and refuses stale or old system Python shims.
250
264
 
251
265
  ## Known Limitations
252
266
 
253
- - PyPI distribution builds exist, but publishing is gated until trusted
254
- publishing is configured; use the tagged GitHub install command. See
255
- [docs/pypi-release.md](docs/pypi-release.md) for the TestPyPI/PyPI
256
- activation path.
267
+ - PyPI distribution publishing is active through trusted publishing; see
268
+ [docs/pypi-release.md](docs/pypi-release.md) for the release and
269
+ verification runbook.
257
270
  - GitHub is the primary supported forge. GitLab, Bitbucket, and ACP bridges are
258
271
  roadmap items.
259
272
  - Hosted/SaaS reviewers start informational or manual until calibration data
@@ -26,6 +26,14 @@ class DoctorOutputTests(unittest.TestCase):
26
26
  name="doctor.plan",
27
27
  status=STATUS_PASS,
28
28
  message="doctor run plan: load-inputs, select-profile, runtime, providers",
29
+ detail={
30
+ "stages": [
31
+ {"id": "load-inputs", "group": "runtime", "optional": False},
32
+ {"id": "select-profile", "group": "runtime", "optional": False},
33
+ {"id": "runtime", "group": "runtime", "optional": False},
34
+ {"id": "providers", "group": "providers", "optional": False},
35
+ ]
36
+ },
29
37
  ),
30
38
  DoctorCheck(
31
39
  name="runtime.python",
@@ -59,6 +67,11 @@ class DoctorOutputTests(unittest.TestCase):
59
67
 
60
68
  rendered = output.render_doctor_text(report)
61
69
 
70
+ self.assertIn(
71
+ "Run plan: load-inputs (runtime), select-profile (runtime), "
72
+ "runtime (runtime), providers (providers)",
73
+ rendered,
74
+ )
62
75
  self.assertIn("Checks: 7 total, 2 warnings, 1 skipped", rendered)
63
76
  self.assertLess(rendered.index("Setup"), rendered.index("Runtime"))
64
77
  self.assertLess(rendered.index("Runtime"), rendered.index("Provider lanes"))
@@ -54,6 +54,14 @@ class DoctorRegistryTests(unittest.TestCase):
54
54
  tuple(stage["id"] for stage in plan_check.detail["stages"]),
55
55
  ("load-inputs", "select-profile", "runtime", "providers", "github", "cloud"),
56
56
  )
57
+ self.assertEqual(
58
+ tuple(stage["id"] for stage in report.run_plan),
59
+ ("load-inputs", "select-profile", "runtime", "providers", "github", "cloud"),
60
+ )
61
+ self.assertEqual(
62
+ tuple(stage["id"] for stage in report.as_dict()["run_plan"]),
63
+ ("load-inputs", "select-profile", "runtime", "providers", "github", "cloud"),
64
+ )
57
65
 
58
66
 
59
67
  if __name__ == "__main__":
@@ -47,7 +47,7 @@ from scripts import privacy_scan
47
47
 
48
48
  class ReleaseHygieneTests(unittest.TestCase):
49
49
  def test_version_is_current_v05_prerelease(self) -> None:
50
- self.assertEqual(__version__, "0.5.0b5")
50
+ self.assertEqual(__version__, "0.5.0b7")
51
51
 
52
52
  def test_release_workflow_verifies_downloaded_distributions_before_publish(self) -> None:
53
53
  workflow = (ROOT / ".github/workflows/release.yml").read_text(encoding="utf-8")
@@ -158,8 +158,7 @@ class ReleaseHygieneTests(unittest.TestCase):
158
158
  self.assertIn(
159
159
  (
160
160
  "code-mower migration package-install-rehearsal --package-spec "
161
- "git+https://github.com/codemower-ai/code-mower.git@v0.5.0-beta.5 "
162
- "--json"
161
+ "code-mower==0.5.0b7 --json"
163
162
  ),
164
163
  help_text,
165
164
  )
@@ -1368,8 +1367,8 @@ printf '%s\\n' "${lane}"
1368
1367
  fromlist=["current_alpha_package_spec"],
1369
1368
  )
1370
1369
  self.assertEqual(
1371
- legacy_module.current_alpha_package_spec("0.5.0b5"),
1372
- "git+https://github.com/codemower-ai/code-mower.git@v0.5.0-beta.5",
1370
+ legacy_module.current_alpha_package_spec("0.5.0b7"),
1371
+ "code-mower==0.5.0b7",
1373
1372
  )
1374
1373
  finally:
1375
1374
  sys.path[:] = original_path
@@ -1406,7 +1405,7 @@ printf '%s\\n' "${lane}"
1406
1405
  "-c",
1407
1406
  (
1408
1407
  "from tools import code_mower_package_content as c; "
1409
- "print(c.current_alpha_package_spec('0.5.0b5'))"
1408
+ "print(c.current_alpha_package_spec('0.5.0b7'))"
1410
1409
  ),
1411
1410
  ],
1412
1411
  cwd=tmp_path,
@@ -1419,7 +1418,7 @@ printf '%s\\n' "${lane}"
1419
1418
  self.assertEqual(completed.returncode, 0, completed.stderr)
1420
1419
  self.assertEqual(
1421
1420
  completed.stdout.strip(),
1422
- "git+https://github.com/codemower-ai/code-mower.git@v0.5.0-beta.5",
1421
+ "code-mower==0.5.0b7",
1423
1422
  )
1424
1423
 
1425
1424
  def test_package_rendering_legacy_fallback_stays_valid_yaml_subset(self) -> None:
@@ -1495,11 +1494,11 @@ printf '%s\\n' "${lane}"
1495
1494
  (output_dir / "src/code_mower/cloud_client/dogfood.py").is_file()
1496
1495
  )
1497
1496
  self.assertIn(
1498
- 'version = "0.5.0b5"',
1497
+ 'version = "0.5.0b7"',
1499
1498
  (output_dir / "pyproject.toml").read_text(encoding="utf-8"),
1500
1499
  )
1501
1500
  self.assertIn(
1502
- '__version__ = "0.5.0b5"',
1501
+ '__version__ = "0.5.0b7"',
1503
1502
  (output_dir / "src/code_mower/__init__.py").read_text(
1504
1503
  encoding="utf-8"
1505
1504
  ),
@@ -2968,7 +2967,7 @@ def main():
2968
2967
  {
2969
2968
  "status": "pass",
2970
2969
  "package_spec": "code-mower",
2971
- "version": "code-mower 0.5.0b5",
2970
+ "version": "code-mower 0.5.0b7",
2972
2971
  "work_dir": "/tmp/code-mower-rehearsal",
2973
2972
  "toy_repo": "/tmp/code-mower-rehearsal/toy-repo",
2974
2973
  "step_count": 1,
@@ -3080,7 +3079,7 @@ def main():
3080
3079
  scorecard = code_mower_migration._first_user_readiness_scorecard(
3081
3080
  toy_repo=toy_repo,
3082
3081
  outputs=outputs,
3083
- version="code-mower 0.5.0b5",
3082
+ version="code-mower 0.5.0b7",
3084
3083
  steps=[
3085
3084
  {
3086
3085
  "command": ["code-mower", "doctor", "--easy", "--json"],
@@ -3159,7 +3158,7 @@ def main():
3159
3158
  scorecard = code_mower_migration._first_user_readiness_scorecard(
3160
3159
  toy_repo=toy_repo,
3161
3160
  outputs=outputs,
3162
- version="code-mower 0.5.0b5",
3161
+ version="code-mower 0.5.0b7",
3163
3162
  steps=[
3164
3163
  {
3165
3164
  "command": ["code-mower", "doctor", "--easy", "--json"],
@@ -3221,7 +3220,7 @@ def main():
3221
3220
  scorecard = code_mower_migration._first_user_readiness_scorecard(
3222
3221
  toy_repo=toy_repo,
3223
3222
  outputs=outputs,
3224
- version="code-mower 0.5.0b5",
3223
+ version="code-mower 0.5.0b7",
3225
3224
  steps=[
3226
3225
  {
3227
3226
  "command": ["code-mower", "doctor", "--easy", "--json"],
@@ -3287,24 +3286,24 @@ def main():
3287
3286
  )
3288
3287
  self.assertEqual(
3289
3288
  code_mower_migration._resolve_install_package_spec(
3290
- "git+https://github.com/codemower-ai/code-mower.git@v0.5.0-beta.5",
3289
+ "git+https://github.com/codemower-ai/code-mower.git@v0.5.0-beta.7",
3291
3290
  base_dir=package,
3292
3291
  ),
3293
- "git+https://github.com/codemower-ai/code-mower.git@v0.5.0-beta.5",
3292
+ "git+https://github.com/codemower-ai/code-mower.git@v0.5.0-beta.7",
3294
3293
  )
3295
3294
  self.assertEqual(
3296
3295
  code_mower_migration._resolve_install_package_spec(
3297
- "code-mower==0.5.0b5",
3296
+ "code-mower==0.5.0b7",
3298
3297
  base_dir=package,
3299
3298
  ),
3300
- "code-mower==0.5.0b5",
3299
+ "code-mower==0.5.0b7",
3301
3300
  )
3302
3301
 
3303
3302
  def test_package_install_rehearsal_supports_index_aware_pip_install(self) -> None:
3304
3303
  self.assertEqual(
3305
3304
  code_mower_migration._pip_install_command(
3306
3305
  Path("/tmp/venv/bin/python"),
3307
- "code-mower==0.5.0b5",
3306
+ "code-mower==0.5.0b7",
3308
3307
  pip_index_url="https://test.pypi.org/simple/",
3309
3308
  pip_extra_index_urls=["https://pypi.org/simple/"],
3310
3309
  ),
@@ -3317,7 +3316,7 @@ def main():
3317
3316
  "https://test.pypi.org/simple/",
3318
3317
  "--extra-index-url",
3319
3318
  "https://pypi.org/simple/",
3320
- "code-mower==0.5.0b5",
3319
+ "code-mower==0.5.0b7",
3321
3320
  ],
3322
3321
  )
3323
3322
 
@@ -3337,10 +3336,10 @@ def main():
3337
3336
  payload = release_readiness.render_release_readiness(ROOT)
3338
3337
 
3339
3338
  self.assertEqual(payload["status"], "pass")
3340
- self.assertEqual(payload["version"], "0.5.0b5")
3341
- self.assertEqual(payload["release_tag"], "v0.5.0-beta.5")
3342
- self.assertEqual(payload["alpha_tag"], "v0.5.0-beta.5")
3343
- self.assertEqual(payload["package_index_spec"], "code-mower==0.5.0b5")
3339
+ self.assertEqual(payload["version"], "0.5.0b7")
3340
+ self.assertEqual(payload["release_tag"], "v0.5.0-beta.7")
3341
+ self.assertEqual(payload["alpha_tag"], "v0.5.0-beta.7")
3342
+ self.assertEqual(payload["package_index_spec"], "code-mower==0.5.0b7")
3344
3343
  check_ids = {check["id"]: check for check in payload["checks"]}
3345
3344
  self.assertEqual(check_ids["package-version-consistency"]["status"], "pass")
3346
3345
  self.assertEqual(
@@ -3389,7 +3388,7 @@ def main():
3389
3388
  check_ids = {check["id"]: check for check in payload["checks"]}
3390
3389
  check = check_ids["materialized-package-version-consistency"]
3391
3390
  self.assertEqual(check["status"], "fail")
3392
- self.assertEqual(check["detail"]["source_version"], "0.5.0b5")
3391
+ self.assertEqual(check["detail"]["source_version"], "0.5.0b7")
3393
3392
  self.assertEqual(check["detail"]["generated_init_version"], "0.0.0")
3394
3393
 
3395
3394
  def test_public_support_docs_are_packaged_and_privacy_forward(self) -> None:
@@ -3469,20 +3468,20 @@ def main():
3469
3468
 
3470
3469
  def test_release_readiness_tag_derivation_supports_release_stages(self) -> None:
3471
3470
  self.assertEqual(
3472
- release_readiness._release_tag_for_version("0.5.0b5"),
3473
- "v0.5.0-beta.5",
3471
+ release_readiness._release_tag_for_version("0.5.0b7"),
3472
+ "v0.5.0-beta.7",
3474
3473
  )
3475
3474
  self.assertEqual(
3476
- code_mower_versioning.release_tag_for_version("0.5.0b5"),
3477
- "v0.5.0-beta.5",
3475
+ code_mower_versioning.release_tag_for_version("0.5.0b7"),
3476
+ "v0.5.0-beta.7",
3478
3477
  )
3479
3478
  self.assertEqual(
3480
- release_readiness._release_tag_for_version("0.5.0b5"),
3481
- "v0.5.0-beta.5",
3479
+ release_readiness._release_tag_for_version("0.5.0b7"),
3480
+ "v0.5.0-beta.7",
3482
3481
  )
3483
3482
  self.assertEqual(
3484
- code_mower_versioning.release_tag_for_version("0.5.0b5"),
3485
- "v0.5.0-beta.5",
3483
+ code_mower_versioning.release_tag_for_version("0.5.0b7"),
3484
+ "v0.5.0-beta.7",
3486
3485
  )
3487
3486
  self.assertEqual(
3488
3487
  release_readiness._release_tag_for_version("1.0.0rc1"),
@@ -3511,8 +3510,8 @@ def main():
3511
3510
  next_steps.current_alpha_package_spec(),
3512
3511
  )
3513
3512
  self.assertEqual(
3514
- code_mower_package_content.current_alpha_package_spec("0.5.0b5"),
3515
- "git+https://github.com/codemower-ai/code-mower.git@v0.5.0-beta.5",
3513
+ code_mower_package_content.current_alpha_package_spec("0.5.0b7"),
3514
+ "code-mower==0.5.0b7",
3516
3515
  )
3517
3516
  self.assertNotIn(next_steps.current_public_tag(), package_content_text)
3518
3517
  self.assertNotIn("v0.0.0", package_content_text)
@@ -3684,11 +3683,8 @@ def main():
3684
3683
  step for step in plan["steps"] if step["id"] == "package-install-rehearsal"
3685
3684
  )
3686
3685
  self.assertIn("doctor --v05", doctor_step["command"])
3687
- self.assertIn(
3688
- "git+https://github.com/codemower-ai/code-mower.git@v0.5.0-beta.5",
3689
- package_step["command"],
3690
- )
3691
- self.assertIn("current GitHub tag", package_step["why"])
3686
+ self.assertIn("code-mower==0.5.0b7", package_step["command"])
3687
+ self.assertIn("current published PyPI prerelease", package_step["why"])
3692
3688
  self.assertIn("first_user_readiness", package_step["why"])
3693
3689
  self.assertEqual(
3694
3690
  package_step["artifacts"],
File without changes