code-mower 0.5.0b52__tar.gz → 0.5.0b53__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 (336) hide show
  1. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/PKG-INFO +14 -9
  2. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/README.md +13 -8
  3. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/pyproject.toml +1 -1
  4. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/__init__.py +1 -1
  5. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/cli.py +1 -1
  6. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/init.py +116 -32
  7. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/package_manifest.py +2 -2
  8. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/release_readiness.py +5 -2
  9. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/templates/code-mower.example.yml +8 -5
  10. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/templates/workflows/builder-provenance.yml.j2 +1 -1
  11. {code_mower-0.5.0b52 → code_mower-0.5.0b53/src/code_mower}/templates/workflows/code-mower-fix-round-dispatch.yml.j2 +5 -1
  12. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/templates/workflows/dispatch-lanes.yml.j2 +124 -123
  13. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/versioning.py +6 -2
  14. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower.egg-info/PKG-INFO +14 -9
  15. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower.egg-info/SOURCES.txt +2 -2
  16. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/templates/workflows/builder-provenance.yml.j2 +1 -1
  17. {code_mower-0.5.0b52/src/code_mower → code_mower-0.5.0b53}/templates/workflows/code-mower-fix-round-dispatch.yml.j2 +5 -1
  18. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/templates/workflows/dispatch-lanes.yml.j2 +124 -123
  19. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/tests/test_builder_identity.py +25 -2
  20. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/tests/test_init_build_loop.py +24 -7
  21. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/tests/test_release_hygiene.py +162 -42
  22. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/CODE_OF_CONDUCT.md +0 -0
  23. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/LICENSE +0 -0
  24. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/MANIFEST.in +0 -0
  25. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/NOTICE +0 -0
  26. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/SUPPORT.md +0 -0
  27. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/requirements/requirements.txt +0 -0
  28. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/setup.cfg +0 -0
  29. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/adapters/__init__.py +0 -0
  30. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/adapters/_base.py +0 -0
  31. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/adapters/cursor_bugbot.py +0 -0
  32. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/adapters/gitar.py +0 -0
  33. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/adapters/greptile.py +0 -0
  34. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/adapters/qodo.py +0 -0
  35. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/antigravity_cli_audit_pr.py +0 -0
  36. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/audit_handoff_log.py +0 -0
  37. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/audit_labeler_lib.py +0 -0
  38. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/audit_limits.py +0 -0
  39. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/audit_progress.py +0 -0
  40. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/blind_review_artifacts.py +0 -0
  41. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/blind_review_coordinator.py +0 -0
  42. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/bootstrap.py +0 -0
  43. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/builder_experiment.py +0 -0
  44. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/builder_runs.py +0 -0
  45. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/calibration/__init__.py +0 -0
  46. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/calibration/arms.py +0 -0
  47. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/calibration/auto_discovery.py +0 -0
  48. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/calibration/commands.py +0 -0
  49. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/calibration/context_inputs.py +0 -0
  50. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/calibration/corpus.py +0 -0
  51. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/calibration/effect_report.py +0 -0
  52. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/calibration/evidence.py +0 -0
  53. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/calibration/evidence_report.py +0 -0
  54. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/calibration/identity.py +0 -0
  55. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/calibration/metrics.py +0 -0
  56. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/calibration/overlap.py +0 -0
  57. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/calibration/planning.py +0 -0
  58. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/calibration/policy.py +0 -0
  59. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/calibration/results.py +0 -0
  60. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/calibration/run_results.py +0 -0
  61. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/calibration/run_status.py +0 -0
  62. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/calibration/runner.py +0 -0
  63. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/calibration/truth.py +0 -0
  64. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/calibration/value_report.py +0 -0
  65. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/checks.py +0 -0
  66. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/claude_audit_pr.py +0 -0
  67. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/claude_cli_bounce.py +0 -0
  68. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/claude_cli_environment.py +0 -0
  69. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/clear_stale.py +0 -0
  70. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/cloud.py +0 -0
  71. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/cloud_client/__init__.py +0 -0
  72. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/cloud_client/bundle.py +0 -0
  73. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/cloud_client/doctor.py +0 -0
  74. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/cloud_client/dogfood.py +0 -0
  75. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/cloud_client/endpoints.py +0 -0
  76. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/cloud_client/errors.py +0 -0
  77. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/cloud_client/events.py +0 -0
  78. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/cloud_client/export.py +0 -0
  79. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/cloud_client/git_metadata.py +0 -0
  80. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/cloud_client/manifest.py +0 -0
  81. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/cloud_client/operations.py +0 -0
  82. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/cloud_client/reports.py +0 -0
  83. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/cloud_client/setup.py +0 -0
  84. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/cloud_client/upload.py +0 -0
  85. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/code_mower_calibration.py +0 -0
  86. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/code_mower_context_packs.py +0 -0
  87. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/code_mower_merge.py +0 -0
  88. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/code_mower_telemetry.py +0 -0
  89. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/coderabbit_cli_audit_pr.py +0 -0
  90. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/codex_audit_env_preflight.py +0 -0
  91. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/codex_audit_pr.py +0 -0
  92. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/codex_audit_schema_smoke.py +0 -0
  93. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/codex_audit_verdict.schema.json +0 -0
  94. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/config.py +0 -0
  95. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/decisions.py +0 -0
  96. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/doctor.py +0 -0
  97. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/doctor_checks/__init__.py +0 -0
  98. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/doctor_checks/audit_limits.py +0 -0
  99. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/doctor_checks/cloud.py +0 -0
  100. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/doctor_checks/common.py +0 -0
  101. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/doctor_checks/github.py +0 -0
  102. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/doctor_checks/github_actions.py +0 -0
  103. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/doctor_checks/github_actions_cost.py +0 -0
  104. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/doctor_checks/github_actions_cost_summary.py +0 -0
  105. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/doctor_checks/github_actions_failure_annotations.py +0 -0
  106. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/doctor_checks/github_actions_failure_models.py +0 -0
  107. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/doctor_checks/github_actions_failure_scan.py +0 -0
  108. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/doctor_checks/github_actions_failure_selection.py +0 -0
  109. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/doctor_checks/github_actions_failures.py +0 -0
  110. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/doctor_checks/github_actions_permissions.py +0 -0
  111. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/doctor_checks/github_api.py +0 -0
  112. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/doctor_checks/github_branch.py +0 -0
  113. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/doctor_checks/github_config.py +0 -0
  114. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/doctor_checks/github_human_token.py +0 -0
  115. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/doctor_checks/github_provider.py +0 -0
  116. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/doctor_checks/github_repo.py +0 -0
  117. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/doctor_checks/groups.py +0 -0
  118. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/doctor_checks/models.py +0 -0
  119. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/doctor_checks/output.py +0 -0
  120. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/doctor_checks/presets.py +0 -0
  121. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/doctor_checks/privacy.py +0 -0
  122. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/doctor_checks/provider_api_model.py +0 -0
  123. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/doctor_checks/provider_api_model_openai.py +0 -0
  124. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/doctor_checks/provider_api_model_profiles.py +0 -0
  125. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/doctor_checks/provider_env.py +0 -0
  126. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/doctor_checks/provider_env_required.py +0 -0
  127. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/doctor_checks/provider_env_tokens.py +0 -0
  128. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/doctor_checks/provider_local_audit_setup.py +0 -0
  129. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/doctor_checks/provider_local_cli.py +0 -0
  130. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/doctor_checks/provider_local_cli_commands.py +0 -0
  131. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/doctor_checks/provider_local_cli_probe_config.py +0 -0
  132. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/doctor_checks/provider_probe.py +0 -0
  133. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/doctor_checks/provider_probe_auth.py +0 -0
  134. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/doctor_checks/provider_probe_evaluation.py +0 -0
  135. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/doctor_checks/provider_probe_json.py +0 -0
  136. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/doctor_checks/provider_probe_remediation.py +0 -0
  137. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/doctor_checks/provider_review_hygiene.py +0 -0
  138. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/doctor_checks/providers.py +0 -0
  139. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/doctor_checks/registry.py +0 -0
  140. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/doctor_checks/runner.py +0 -0
  141. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/doctor_checks/runtime.py +0 -0
  142. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/doctor_checks/runtime_github_auth.py +0 -0
  143. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/doctor_checks/self_hosted_runner.py +0 -0
  144. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/gate_health.py +0 -0
  145. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/gemini_cli_audit_pr.py +0 -0
  146. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/grok_build_audit_pr.py +0 -0
  147. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/hermes_cli_audit_pr.py +0 -0
  148. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/lane_configs/__init__.py +0 -0
  149. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/lane_configs/aider.py +0 -0
  150. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/lane_configs/antigravity_cli.py +0 -0
  151. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/lane_configs/claude.py +0 -0
  152. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/lane_configs/codex.py +0 -0
  153. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/lane_configs/devin.py +0 -0
  154. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/lane_configs/gemini_cli.py +0 -0
  155. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/lane_configs/grok_build.py +0 -0
  156. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/lane_configs/hermes_cli.py +0 -0
  157. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/lane_configs/local_llm.py +0 -0
  158. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/local_llm_audit_pr.py +0 -0
  159. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/local_llm_bakeoff.py +0 -0
  160. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/local_llm_calibration.py +0 -0
  161. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/local_llm_profiles.py +0 -0
  162. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/migration.py +0 -0
  163. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/migration_install.py +0 -0
  164. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/migration_mirror.py +0 -0
  165. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/migration_readiness.py +0 -0
  166. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/migration_rehearsal.py +0 -0
  167. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/next_steps.py +0 -0
  168. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/package.py +0 -0
  169. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/package_content.py +0 -0
  170. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/package_paths.py +0 -0
  171. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/package_rendering.py +0 -0
  172. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/package_static.py +0 -0
  173. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/plan_context.py +0 -0
  174. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/prompts.py +0 -0
  175. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/provider_registry.py +0 -0
  176. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/provider_runners/__init__.py +0 -0
  177. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/provider_runners/comments.py +0 -0
  178. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/provider_runners/git.py +0 -0
  179. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/provider_runners/github_auth.py +0 -0
  180. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/provider_runners/github_pr.py +0 -0
  181. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/provider_runners/pr_worktree.py +0 -0
  182. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/provider_runners/process.py +0 -0
  183. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/provider_runners/repo_paths.py +0 -0
  184. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/provider_runners/text_schema.py +0 -0
  185. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/provider_runners/verdict_artifacts.py +0 -0
  186. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/provider_runners/workspace.py +0 -0
  187. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/providers/__init__.py +0 -0
  188. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/providers/local_cli.py +0 -0
  189. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/providers/provenance.py +0 -0
  190. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/reviewer_metrics.py +0 -0
  191. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/reviewer_spend.py +0 -0
  192. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/saas_reviewer_labeler.py +0 -0
  193. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/secrets.py +0 -0
  194. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/templates/builder-experiment.example.json +0 -0
  195. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/templates/calibration-corpus.example.json +0 -0
  196. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/templates/calibration-corpus.json +0 -0
  197. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/templates/context-packs.example.json +0 -0
  198. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/templates/lane_prompts/base-audit.md +0 -0
  199. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/templates/lane_prompts/calibration-policy.md +0 -0
  200. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/templates/lane_prompts/context-driven-quality.md +0 -0
  201. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/templates/lane_prompts/docs-design.md +0 -0
  202. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/templates/lane_prompts/generic-programming.md +0 -0
  203. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/templates/lane_prompts/operability.md +0 -0
  204. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/templates/lane_prompts/package-runtime.md +0 -0
  205. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/templates/lane_prompts/plan-conformance.md +0 -0
  206. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/templates/lane_prompts/security-threat-model.md +0 -0
  207. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/templates/lanes/README.md +0 -0
  208. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/templates/lanes/claude.md +0 -0
  209. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/templates/lanes/codex.md +0 -0
  210. /code_mower-0.5.0b52/src/code_mower/templates/lanes/grok.md → /code_mower-0.5.0b53/src/code_mower/templates/lanes/cursor.md +0 -0
  211. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/templates/lanes/generic.md +0 -0
  212. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/templates/lanes/run_mac_lane.sh +0 -0
  213. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/templates/product-support/code_mower +0 -0
  214. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/templates/product-support/code_mower_standalone_pin.env +0 -0
  215. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/templates/product-support/code_mower_standalone_shadow.sh +0 -0
  216. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/templates/product-support/run_claude_audit_pr.sh +0 -0
  217. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/templates/product-support/run_codex_audit_pr.sh +0 -0
  218. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/templates/product-support/safe_gh_comment.py +0 -0
  219. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/templates/product-support/status_report.py +0 -0
  220. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/templates/providers.yml +0 -0
  221. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/templates/reviewer-spend.example.json +0 -0
  222. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/templates/reviewer-value-report.example.md +0 -0
  223. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/templates/workflows/audit-label-cleanup.yml.j2 +0 -0
  224. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/templates/workflows/code-mower-agent-pr-labeler.yml.j2 +0 -0
  225. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/templates/workflows/code-mower-gate-health.yml.j2 +0 -0
  226. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/templates/workflows/code-mower-gate.yml.j2 +0 -0
  227. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/templates/workflows/hosted-bridge.yml.j2 +0 -0
  228. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/templates/workflows/lane-mac-runner.yml.j2 +0 -0
  229. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/templates/workflows/local-cli-audit.yml.j2 +0 -0
  230. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/templates/workflows/needs-owner-notify.yml.j2 +0 -0
  231. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/templates/workflows/private-standalone-shadow.yml.j2 +0 -0
  232. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/templates/workflows/review-clear-stale.yml.j2 +0 -0
  233. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/templates/workflows/saas-reviewer-labeler.yml.j2 +0 -0
  234. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/templates/workflows/self-hosted-local-audit.yml.j2 +0 -0
  235. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/templates/workflows/trailer-comment-labeler.yml.j2 +0 -0
  236. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/templates/workflows/weekly-status.yml.j2 +0 -0
  237. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/trailer_comment_labeler.py +0 -0
  238. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/work_orders.py +0 -0
  239. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower/workflow_actionlint.py +0 -0
  240. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower.egg-info/dependency_links.txt +0 -0
  241. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower.egg-info/entry_points.txt +0 -0
  242. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower.egg-info/requires.txt +0 -0
  243. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/src/code_mower.egg-info/top_level.txt +0 -0
  244. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/templates/builder-experiment.example.json +0 -0
  245. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/templates/calibration-corpus.example.json +0 -0
  246. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/templates/calibration-corpus.json +0 -0
  247. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/templates/code-mower.yml.j2 +0 -0
  248. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/templates/context-packs.example.json +0 -0
  249. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/templates/cursor/BUGBOT.md +0 -0
  250. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/templates/lanes/README.md +0 -0
  251. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/templates/lanes/claude.md +0 -0
  252. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/templates/lanes/codex.md +0 -0
  253. /code_mower-0.5.0b52/templates/lanes/grok.md → /code_mower-0.5.0b53/templates/lanes/cursor.md +0 -0
  254. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/templates/lanes/generic.md +0 -0
  255. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/templates/lanes/run_mac_lane.sh +0 -0
  256. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/templates/providers/acp_bridge.yml +0 -0
  257. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/templates/providers/aider.yml +0 -0
  258. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/templates/providers/antigravity_cli.yml +0 -0
  259. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/templates/providers/claude_audit.yml +0 -0
  260. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/templates/providers/claude_review.yml +0 -0
  261. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/templates/providers/coderabbit_cli.yml +0 -0
  262. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/templates/providers/codex.yml +0 -0
  263. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/templates/providers/cursor_bugbot.yml +0 -0
  264. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/templates/providers/devin.yml +0 -0
  265. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/templates/providers/gemini_cli.yml +0 -0
  266. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/templates/providers/gitar.yml +0 -0
  267. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/templates/providers/greptile.yml +0 -0
  268. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/templates/providers/hermes_cli.yml +0 -0
  269. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/templates/providers/local_llm.yml +0 -0
  270. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/templates/providers/qodo.yml +0 -0
  271. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/templates/providers.yml +0 -0
  272. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/templates/reviewer-spend.example.json +0 -0
  273. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/templates/reviewer-value-report.example.md +0 -0
  274. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/templates/workflows/audit-label-cleanup.yml.j2 +0 -0
  275. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/templates/workflows/blind-review-artifacts-dry-run.yml.j2 +0 -0
  276. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/templates/workflows/code-mower-agent-pr-labeler.yml.j2 +0 -0
  277. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/templates/workflows/code-mower-gate-health.yml.j2 +0 -0
  278. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/templates/workflows/code-mower-gate.yml.j2 +0 -0
  279. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/templates/workflows/hosted-bridge.yml.j2 +0 -0
  280. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/templates/workflows/lane-mac-runner.yml.j2 +0 -0
  281. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/templates/workflows/local-cli-audit.yml.j2 +0 -0
  282. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/templates/workflows/private-standalone-shadow.yml.j2 +0 -0
  283. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/templates/workflows/review-clear-stale.yml.j2 +0 -0
  284. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/templates/workflows/saas-reviewer-labeler.yml.j2 +0 -0
  285. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/templates/workflows/self-hosted-local-audit.yml.j2 +0 -0
  286. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/templates/workflows/trailer-comment-labeler.yml.j2 +0 -0
  287. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/tests/test_audit_comment_posture.py +0 -0
  288. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/tests/test_audit_limits.py +0 -0
  289. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/tests/test_builder_runs.py +0 -0
  290. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/tests/test_calibration_effect_report.py +0 -0
  291. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/tests/test_calibration_truth.py +0 -0
  292. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/tests/test_checks.py +0 -0
  293. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/tests/test_claude_audit_pr.py +0 -0
  294. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/tests/test_claude_cli_bounce.py +0 -0
  295. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/tests/test_clear_stale.py +0 -0
  296. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/tests/test_cloud_client.py +0 -0
  297. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/tests/test_cloud_git_metadata.py +0 -0
  298. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/tests/test_cloud_manifest.py +0 -0
  299. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/tests/test_cloud_reports.py +0 -0
  300. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/tests/test_coderabbit_cli_audit_pr.py +0 -0
  301. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/tests/test_codex_audit_env_preflight.py +0 -0
  302. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/tests/test_codex_audit_pr.py +0 -0
  303. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/tests/test_decision_audit_integration.py +0 -0
  304. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/tests/test_decisions.py +0 -0
  305. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/tests/test_doctor_actions_cost_summary.py +0 -0
  306. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/tests/test_doctor_actions_failure_selection.py +0 -0
  307. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/tests/test_doctor_boundaries.py +0 -0
  308. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/tests/test_doctor_github_checks.py +0 -0
  309. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/tests/test_doctor_output.py +0 -0
  310. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/tests/test_doctor_privacy.py +0 -0
  311. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/tests/test_doctor_provider_env_required.py +0 -0
  312. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/tests/test_doctor_provider_env_tokens.py +0 -0
  313. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/tests/test_doctor_provider_local_audit_setup.py +0 -0
  314. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/tests/test_doctor_provider_probe.py +0 -0
  315. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/tests/test_doctor_provider_review_hygiene.py +0 -0
  316. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/tests/test_doctor_registry.py +0 -0
  317. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/tests/test_doctor_runtime.py +0 -0
  318. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/tests/test_doctor_self_hosted_runner.py +0 -0
  319. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/tests/test_gate_health.py +0 -0
  320. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/tests/test_init_actionlint.py +0 -0
  321. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/tests/test_local_llm_github_helpers.py +0 -0
  322. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/tests/test_plan_context.py +0 -0
  323. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/tests/test_prompts.py +0 -0
  324. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/tests/test_provider_local_cli.py +0 -0
  325. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/tests/test_provider_runners_comments.py +0 -0
  326. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/tests/test_provider_runners_git.py +0 -0
  327. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/tests/test_provider_runners_github_pr.py +0 -0
  328. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/tests/test_provider_runners_pr_worktree.py +0 -0
  329. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/tests/test_provider_runners_process.py +0 -0
  330. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/tests/test_provider_runners_repo_paths.py +0 -0
  331. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/tests/test_provider_runners_text_schema.py +0 -0
  332. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/tests/test_provider_runners_workspace.py +0 -0
  333. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/tests/test_reviewer_metrics_core.py +0 -0
  334. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/tests/test_reviewer_spend.py +0 -0
  335. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/tests/test_trailer_comment_labeler.py +0 -0
  336. {code_mower-0.5.0b52 → code_mower-0.5.0b53}/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.5.0b52
3
+ Version: 0.5.0b53
4
4
  Summary: Multi-reviewer AI code audit orchestration
5
5
  License-Expression: Apache-2.0
6
6
  Requires-Python: >=3.11
@@ -109,8 +109,8 @@ Choose one path. Each path has one guide and gets to one visible outcome.
109
109
  | A. Reviewer gate in 10 minutes | You want one audited PR before recurring workflows or builder dispatch. | Install, run `init --easy`, run `doctor --preflight`, open a small setup PR, run Codex and Claude audits, then merge manually when the audit evidence is clean. | [Try Code Mower In 10 Minutes](docs/try-in-10-minutes.md) |
110
110
  | 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) |
111
111
 
112
- The beta.52 announcement entry point remains the tagged
113
- [Try Code Mower In 10 Minutes](https://github.com/codemower-ai/code-mower/blob/v0.5.0-beta.52/docs/try-in-10-minutes.md)
112
+ The beta.53 announcement entry point is the tagged
113
+ [Try Code Mower In 10 Minutes](https://github.com/codemower-ai/code-mower/blob/v0.5.0-beta.53/docs/try-in-10-minutes.md)
114
114
  guide.
115
115
 
116
116
  ## What Calibration Does And Does Not Prove
@@ -136,9 +136,12 @@ every disposition before using it for lane promotion or merge policy.
136
136
  Full walkthrough: [docs/try-in-10-minutes.md](docs/try-in-10-minutes.md).
137
137
  First-time command map: [docs/launch-command-surface.md](docs/launch-command-surface.md).
138
138
 
139
- The current PyPI beta has been rehearsed end-to-end from a clean install:
139
+ The beta.53 package-index release is prepared:
140
140
  [First-User Install Rehearsal](docs/first-user-install-rehearsal.md) records
141
- the latest 10/10 public-package readiness proof for `code-mower==0.5.0b52`.
141
+ the release procedure. It is to be published and rehearsed as part of the
142
+ `v0.5.0-beta.53` release execution, with evidence recorded on the release after
143
+ the workflow runs complete. The latest completed public-package rehearsal
144
+ remains beta.52: 10/10 first-user readiness for `code-mower==0.5.0b52`.
142
145
 
143
146
  ## Optional: Plan Before Coding
144
147
 
@@ -302,9 +305,11 @@ measurement work.
302
305
 
303
306
  ## Installation Status
304
307
 
305
- The current public beta is `v0.5.0-beta.52` from
306
- [codemower-ai/code-mower](https://github.com/codemower-ai/code-mower), published
307
- as `code-mower==0.5.0b52` on [PyPI](https://pypi.org/project/code-mower/).
308
+ The prepared public beta is `v0.5.0-beta.53` from
309
+ [codemower-ai/code-mower](https://github.com/codemower-ai/code-mower). It is to
310
+ be published and rehearsed as part of the `v0.5.0-beta.53` release execution,
311
+ with evidence recorded on the release after the workflow runs complete. The
312
+ pinned package-index install spec is `code-mower==0.5.0b53`.
308
313
  GitHub releases remain the auditable source for tags, build artifacts, and
309
314
  release notes.
310
315
 
@@ -351,7 +356,7 @@ The wrapper resolves Python 3.12+ and refuses stale or old system Python shims.
351
356
  - [Lane Standing Instructions](docs/lanes/README.md)
352
357
  - [Codex Lane Standing Instructions](docs/lanes/codex.md)
353
358
  - [Claude Lane Standing Instructions](docs/lanes/claude.md)
354
- - [Cursor Hosted Lane Standing Instructions](docs/lanes/grok.md)
359
+ - [Cursor Hosted Lane Standing Instructions](docs/lanes/cursor.md)
355
360
  - [Provider Matrix](docs/provider-matrix.md)
356
361
  - [GitHub Setup](docs/github-setup.md)
357
362
  - [First Run Transcript](docs/first-run-transcript.md)
@@ -94,8 +94,8 @@ Choose one path. Each path has one guide and gets to one visible outcome.
94
94
  | A. Reviewer gate in 10 minutes | You want one audited PR before recurring workflows or builder dispatch. | Install, run `init --easy`, run `doctor --preflight`, open a small setup PR, run Codex and Claude audits, then merge manually when the audit evidence is clean. | [Try Code Mower In 10 Minutes](docs/try-in-10-minutes.md) |
95
95
  | 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) |
96
96
 
97
- The beta.52 announcement entry point remains the tagged
98
- [Try Code Mower In 10 Minutes](https://github.com/codemower-ai/code-mower/blob/v0.5.0-beta.52/docs/try-in-10-minutes.md)
97
+ The beta.53 announcement entry point is the tagged
98
+ [Try Code Mower In 10 Minutes](https://github.com/codemower-ai/code-mower/blob/v0.5.0-beta.53/docs/try-in-10-minutes.md)
99
99
  guide.
100
100
 
101
101
  ## What Calibration Does And Does Not Prove
@@ -121,9 +121,12 @@ every disposition before using it for lane promotion or merge policy.
121
121
  Full walkthrough: [docs/try-in-10-minutes.md](docs/try-in-10-minutes.md).
122
122
  First-time command map: [docs/launch-command-surface.md](docs/launch-command-surface.md).
123
123
 
124
- The current PyPI beta has been rehearsed end-to-end from a clean install:
124
+ The beta.53 package-index release is prepared:
125
125
  [First-User Install Rehearsal](docs/first-user-install-rehearsal.md) records
126
- the latest 10/10 public-package readiness proof for `code-mower==0.5.0b52`.
126
+ the release procedure. It is to be published and rehearsed as part of the
127
+ `v0.5.0-beta.53` release execution, with evidence recorded on the release after
128
+ the workflow runs complete. The latest completed public-package rehearsal
129
+ remains beta.52: 10/10 first-user readiness for `code-mower==0.5.0b52`.
127
130
 
128
131
  ## Optional: Plan Before Coding
129
132
 
@@ -287,9 +290,11 @@ measurement work.
287
290
 
288
291
  ## Installation Status
289
292
 
290
- The current public beta is `v0.5.0-beta.52` from
291
- [codemower-ai/code-mower](https://github.com/codemower-ai/code-mower), published
292
- as `code-mower==0.5.0b52` on [PyPI](https://pypi.org/project/code-mower/).
293
+ The prepared public beta is `v0.5.0-beta.53` from
294
+ [codemower-ai/code-mower](https://github.com/codemower-ai/code-mower). It is to
295
+ be published and rehearsed as part of the `v0.5.0-beta.53` release execution,
296
+ with evidence recorded on the release after the workflow runs complete. The
297
+ pinned package-index install spec is `code-mower==0.5.0b53`.
293
298
  GitHub releases remain the auditable source for tags, build artifacts, and
294
299
  release notes.
295
300
 
@@ -336,7 +341,7 @@ The wrapper resolves Python 3.12+ and refuses stale or old system Python shims.
336
341
  - [Lane Standing Instructions](docs/lanes/README.md)
337
342
  - [Codex Lane Standing Instructions](docs/lanes/codex.md)
338
343
  - [Claude Lane Standing Instructions](docs/lanes/claude.md)
339
- - [Cursor Hosted Lane Standing Instructions](docs/lanes/grok.md)
344
+ - [Cursor Hosted Lane Standing Instructions](docs/lanes/cursor.md)
340
345
  - [Provider Matrix](docs/provider-matrix.md)
341
346
  - [GitHub Setup](docs/github-setup.md)
342
347
  - [First Run Transcript](docs/first-run-transcript.md)
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "code-mower"
7
- version = "0.5.0b52"
7
+ version = "0.5.0b53"
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.0b52"
3
+ __version__ = "0.5.0b53"
@@ -14,7 +14,7 @@ from pathlib import Path
14
14
  if __package__ in {None, ""}:
15
15
  raise SystemExit(
16
16
  "code_mower.cli is a packaged entrypoint. Install Code Mower with "
17
- "`pipx install code-mower==0.5.0b52`, or run source checkouts with "
17
+ "`pipx install code-mower==0.5.0b53`, or run source checkouts with "
18
18
  "`PYTHONPATH=src python -m code_mower.cli`."
19
19
  )
20
20
 
@@ -102,19 +102,25 @@ LANE_STANDING_README_PATH = "docs/lanes/README.md"
102
102
  LANE_STANDING_README_TEMPLATE = "templates/lanes/README.md"
103
103
  BUILDER_LANE_NAME_RE = re.compile(r"^[A-Za-z0-9][A-Za-z0-9_-]*$")
104
104
  BUILDER_ALIAS_TO_LANE = {
105
- "cursor": "grok-bot",
106
- "grok": "grok-bot",
107
- "grok-bot": "grok-bot",
105
+ "cursor": "cursor",
106
+ "grok": "cursor",
107
+ "grok-bot": "cursor",
108
+ }
109
+ BUILDER_LEGACY_BUILDER_LABELS = {
110
+ "cursor": ("builder:grok-bot",),
111
+ }
112
+ BUILDER_LEGACY_DISPATCH_LABELS = {
113
+ "cursor": ("dispatched:grok-bot",),
108
114
  }
109
115
  BUILDER_DEFAULT_MENTIONS = {
110
116
  "claude": "Claude lane -",
111
117
  "codex": "@codex",
112
- "grok-bot": "@cursor",
118
+ "cursor": "@cursor",
113
119
  }
114
120
  BUILDER_DEFAULT_DOC_SLUGS = {
115
121
  "claude": "claude",
116
122
  "codex": "codex",
117
- "grok-bot": "grok",
123
+ "cursor": "cursor",
118
124
  }
119
125
  MAC_RUNNER_BUILDER_LANES = {"claude", "codex"}
120
126
 
@@ -895,7 +901,7 @@ def _builder_doc_slug(builder_lane: str) -> str:
895
901
  return BUILDER_DEFAULT_DOC_SLUGS.get(builder_lane, builder_lane)
896
902
 
897
903
 
898
- def _builder_mention(builder_lane: str, fix_round_rules: Sequence[Mapping[str, str]]) -> str:
904
+ def _builder_mention(builder_lane: str, fix_round_rules: Sequence[Mapping[str, Any]]) -> str:
899
905
  for rule in fix_round_rules:
900
906
  if str(rule.get("builder_lane") or "") == builder_lane:
901
907
  mention = str(rule.get("mention") or "").strip()
@@ -924,22 +930,26 @@ def _builder_dispatch_lane_entries(
924
930
  builder_lanes: Sequence[str],
925
931
  audit_lanes: Sequence[Mapping[str, str]],
926
932
  author_exclusion: Mapping[str, Any],
927
- fix_round_rules: Sequence[Mapping[str, str]],
928
- ) -> tuple[dict[str, str], ...]:
933
+ fix_round_rules: Sequence[Mapping[str, Any]],
934
+ ) -> tuple[dict[str, Any], ...]:
929
935
  labels_by_lane = _builder_labels_by_lane(author_exclusion)
930
- entries: list[dict[str, str]] = []
936
+ entries: list[dict[str, Any]] = []
931
937
  for builder_lane in builder_lanes:
932
938
  doc_slug = _builder_doc_slug(builder_lane)
933
939
  audit_labels = _builder_audit_need_labels(builder_lane, audit_lanes)
934
940
  doc_template_slug = (
935
941
  doc_slug if builder_lane in BUILDER_DEFAULT_DOC_SLUGS else "generic"
936
942
  )
943
+ builder_label = labels_by_lane.get(builder_lane) or f"builder:{builder_lane}"
944
+ dispatch_label = f"dispatched:{builder_lane}"
937
945
  entries.append(
938
946
  {
939
947
  "lane": builder_lane,
940
948
  "display_name": _display_name(builder_lane),
941
- "builder_label": labels_by_lane.get(builder_lane) or f"builder:{builder_lane}",
942
- "dispatch_label": f"dispatched:{builder_lane}",
949
+ "builder_label": builder_label,
950
+ "builder_labels": list(_builder_label_aliases(author_exclusion, builder_lane)),
951
+ "dispatch_label": dispatch_label,
952
+ "dispatch_labels": list(_builder_dispatch_label_aliases(builder_lane)),
943
953
  "mention": _builder_mention(builder_lane, fix_round_rules),
944
954
  "doc": f"lanes/{doc_slug}.md",
945
955
  "doc_target": f"docs/lanes/{doc_slug}.md",
@@ -964,7 +974,7 @@ def _build_loop_trusted_authors(
964
974
 
965
975
 
966
976
  def _dispatch_lanes_workflow_entry(
967
- builder_entries: Sequence[Mapping[str, str]],
977
+ builder_entries: Sequence[Mapping[str, Any]],
968
978
  owner_surface: Mapping[str, str],
969
979
  *,
970
980
  decision_authorities: Sequence[str] = (),
@@ -1176,15 +1186,25 @@ def _gate_lane_entry(lane_id: str, lane: Mapping[str, Any]) -> dict[str, Any]:
1176
1186
  }
1177
1187
 
1178
1188
 
1179
- def _identity_section(raw_identity: Mapping[str, Any], section: str) -> dict[str, str]:
1189
+ def _identity_section(
1190
+ raw_identity: Mapping[str, Any],
1191
+ section: str,
1192
+ *,
1193
+ canonicalize_lanes: bool = False,
1194
+ ) -> dict[str, str]:
1180
1195
  raw_section = raw_identity.get(section)
1181
1196
  if not isinstance(raw_section, Mapping):
1182
1197
  return {}
1183
- return {
1184
- str(key): str(value)
1185
- for key, value in raw_section.items()
1186
- if str(key) and str(value)
1187
- }
1198
+ out: dict[str, str] = {}
1199
+ for key, value in raw_section.items():
1200
+ key_text = str(key)
1201
+ lane = str(value)
1202
+ if not key_text or not lane:
1203
+ continue
1204
+ if canonicalize_lanes:
1205
+ lane = _canonical_builder_lane(lane)
1206
+ out[key_text] = lane
1207
+ return out
1188
1208
 
1189
1209
 
1190
1210
  def _author_exclusion_payload(
@@ -1195,14 +1215,20 @@ def _author_exclusion_payload(
1195
1215
  identity = raw_identity if isinstance(raw_identity, Mapping) else {}
1196
1216
  payload = {
1197
1217
  "enabled": bool(config.get("merge_authority_excludes_author", True)),
1198
- "labels": _identity_section(identity, "labels"),
1199
- "authors": _identity_section(identity, "authors"),
1200
- "trailers": _identity_section(identity, "trailers"),
1218
+ "labels": _identity_section(identity, "labels", canonicalize_lanes=True),
1219
+ "authors": _identity_section(identity, "authors", canonicalize_lanes=True),
1220
+ "trailers": _identity_section(identity, "trailers", canonicalize_lanes=True),
1201
1221
  }
1222
+ for label, lane in tuple(payload["labels"].items()):
1223
+ if label in BUILDER_LEGACY_BUILDER_LABELS.get(lane, ()):
1224
+ payload["labels"].setdefault(f"builder:{lane}", lane)
1202
1225
  for lane_id, lane in selected_lanes.items():
1203
1226
  if lane.get("type") == "audit":
1204
- author_lane = _author_lane_name(lane_id, lane)
1227
+ raw_author_lane = _author_lane_name(lane_id, lane)
1228
+ author_lane = _canonical_builder_lane(raw_author_lane)
1205
1229
  payload["labels"].setdefault(f"builder:{author_lane}", author_lane)
1230
+ if raw_author_lane != author_lane:
1231
+ payload["labels"].setdefault(f"builder:{raw_author_lane}", author_lane)
1206
1232
  return payload
1207
1233
 
1208
1234
 
@@ -1240,12 +1266,53 @@ def _audit_rearm_entries(
1240
1266
  def _builder_labels_by_lane(author_exclusion: Mapping[str, Any]) -> dict[str, str]:
1241
1267
  labels = _identity_section(author_exclusion, "labels")
1242
1268
  out: dict[str, str] = {}
1269
+ labels_by_lane: dict[str, list[str]] = {}
1243
1270
  for label, lane in sorted(labels.items()):
1244
1271
  if label.startswith("builder:"):
1245
- out.setdefault(lane, label)
1272
+ labels_by_lane.setdefault(lane, []).append(label)
1273
+ for lane, lane_labels in sorted(labels_by_lane.items()):
1274
+ default_label = f"builder:{lane}"
1275
+ legacy_labels = set(BUILDER_LEGACY_BUILDER_LABELS.get(lane, ()))
1276
+ if legacy_labels and default_label in lane_labels:
1277
+ out[lane] = default_label
1278
+ continue
1279
+ custom_labels = [label for label in lane_labels if label not in legacy_labels]
1280
+ out[lane] = custom_labels[0] if custom_labels else default_label
1246
1281
  return out
1247
1282
 
1248
1283
 
1284
+ def _builder_label_aliases(
1285
+ author_exclusion: Mapping[str, Any],
1286
+ builder_lane: str,
1287
+ ) -> tuple[str, ...]:
1288
+ labels = _identity_section(author_exclusion, "labels")
1289
+ primary_label = _builder_labels_by_lane(author_exclusion).get(
1290
+ builder_lane,
1291
+ f"builder:{builder_lane}",
1292
+ )
1293
+ aliases = [
1294
+ primary_label,
1295
+ *(
1296
+ label
1297
+ for label, lane in sorted(labels.items())
1298
+ if lane == builder_lane and label.startswith("builder:")
1299
+ ),
1300
+ *BUILDER_LEGACY_BUILDER_LABELS.get(builder_lane, ()),
1301
+ ]
1302
+ return tuple(dict.fromkeys(label for label in aliases if label))
1303
+
1304
+
1305
+ def _builder_dispatch_label_aliases(builder_lane: str) -> tuple[str, ...]:
1306
+ return tuple(
1307
+ dict.fromkeys(
1308
+ (
1309
+ f"dispatched:{builder_lane}",
1310
+ *BUILDER_LEGACY_DISPATCH_LABELS.get(builder_lane, ()),
1311
+ )
1312
+ )
1313
+ )
1314
+
1315
+
1249
1316
  def _builder_identity_rule_warnings(
1250
1317
  author_exclusion: Mapping[str, Any],
1251
1318
  rules: Sequence[Mapping[str, Any]],
@@ -1258,10 +1325,20 @@ def _builder_identity_rule_warnings(
1258
1325
 
1259
1326
  warnings: list[str] = []
1260
1327
  for lane, lane_labels in sorted(labels_by_lane.items()):
1261
- if len(lane_labels) > 1:
1328
+ primary_label = _builder_labels_by_lane(author_exclusion).get(lane)
1329
+ allowed_aliases = {
1330
+ label
1331
+ for label in (
1332
+ primary_label,
1333
+ *BUILDER_LEGACY_BUILDER_LABELS.get(lane, ()),
1334
+ )
1335
+ if label
1336
+ }
1337
+ unexpected_labels = [label for label in lane_labels if label not in allowed_aliases]
1338
+ if unexpected_labels:
1262
1339
  warnings.append(
1263
1340
  f"builder_identity: lane {lane!r} maps multiple builder labels; "
1264
- f"generated automation uses {lane_labels[0]!r}"
1341
+ f"generated automation uses {primary_label!r}"
1265
1342
  )
1266
1343
  for lane in sorted({str(rule.get("builder_lane") or "") for rule in rules}):
1267
1344
  if lane and lane not in labels_by_lane:
@@ -1278,14 +1355,19 @@ def _agent_pr_label_rules(
1278
1355
  ) -> tuple[dict[str, Any], ...]:
1279
1356
  identity = config.get("builder_identity")
1280
1357
  identity = identity if isinstance(identity, Mapping) else {}
1281
- prefixes = _identity_section(identity, "branch_prefixes")
1358
+ prefixes = _identity_section(identity, "branch_prefixes", canonicalize_lanes=True)
1282
1359
  labels_by_lane = _builder_labels_by_lane(author_exclusion)
1283
1360
  rules_by_lane: dict[str, dict[str, Any]] = {}
1284
1361
  for prefix, lane in sorted(prefixes.items()):
1285
1362
  label = labels_by_lane.get(lane) or f"builder:{lane}"
1286
1363
  rule = rules_by_lane.setdefault(
1287
1364
  lane,
1288
- {"builder_lane": lane, "builder_label": label, "branch_prefixes": []},
1365
+ {
1366
+ "builder_lane": lane,
1367
+ "builder_label": label,
1368
+ "builder_labels": list(_builder_label_aliases(author_exclusion, lane)),
1369
+ "branch_prefixes": [],
1370
+ },
1289
1371
  )
1290
1372
  rule["branch_prefixes"].append(prefix)
1291
1373
  return tuple(rules_by_lane[lane] for lane in sorted(rules_by_lane))
@@ -1294,22 +1376,24 @@ def _agent_pr_label_rules(
1294
1376
  def _fix_round_rules(
1295
1377
  config: Mapping[str, Any],
1296
1378
  author_exclusion: Mapping[str, Any],
1297
- ) -> tuple[dict[str, str], ...]:
1379
+ ) -> tuple[dict[str, Any], ...]:
1298
1380
  identity = config.get("builder_identity")
1299
1381
  identity = identity if isinstance(identity, Mapping) else {}
1300
1382
  mentions = _identity_section(identity, "fix_round_mentions")
1301
1383
  labels_by_lane = _builder_labels_by_lane(author_exclusion)
1302
- rules: list[dict[str, str]] = []
1303
- for lane, mention in sorted(mentions.items()):
1384
+ rules_by_lane: dict[str, dict[str, Any]] = {}
1385
+ for raw_lane, mention in sorted(mentions.items()):
1386
+ lane = _canonical_builder_lane(raw_lane)
1304
1387
  label = labels_by_lane.get(lane) or f"builder:{lane}"
1305
- rules.append(
1388
+ rules_by_lane[lane] = (
1306
1389
  {
1307
1390
  "builder_lane": lane,
1308
1391
  "builder_label": label,
1392
+ "builder_labels": list(_builder_label_aliases(author_exclusion, lane)),
1309
1393
  "mention": mention,
1310
1394
  }
1311
1395
  )
1312
- return tuple(rules)
1396
+ return tuple(rules_by_lane[lane] for lane in sorted(rules_by_lane))
1313
1397
 
1314
1398
 
1315
1399
  def _gate_workflow_entry(
@@ -527,13 +527,13 @@ TEMPLATE_FILES = (
527
527
  ("lane-template", "templates/lanes/claude.md"),
528
528
  ("lane-template", "templates/lanes/codex.md"),
529
529
  ("lane-template", "templates/lanes/generic.md"),
530
- ("lane-template", "templates/lanes/grok.md"),
530
+ ("lane-template", "templates/lanes/cursor.md"),
531
531
  ("lane-template", "templates/lanes/run_mac_lane.sh"),
532
532
  ("lane-template", "src/code_mower/templates/lanes/README.md"),
533
533
  ("lane-template", "src/code_mower/templates/lanes/claude.md"),
534
534
  ("lane-template", "src/code_mower/templates/lanes/codex.md"),
535
535
  ("lane-template", "src/code_mower/templates/lanes/generic.md"),
536
- ("lane-template", "src/code_mower/templates/lanes/grok.md"),
536
+ ("lane-template", "src/code_mower/templates/lanes/cursor.md"),
537
537
  ("lane-template", "src/code_mower/templates/lanes/run_mac_lane.sh"),
538
538
  ("config", "templates/code-mower.yml.j2"),
539
539
  ("provider-config", "templates/providers.yml"),
@@ -485,13 +485,15 @@ def render_release_readiness(repo_path: Path) -> dict[str, Any]:
485
485
  warnings = sum(1 for check in checks if check["status"] == "warn")
486
486
  passed = sum(1 for check in checks if check["status"] == "pass")
487
487
  status = "pass" if failed == 0 else "fail"
488
+ release_workflow_ref = release_tag or "main"
488
489
  next_actions = [
489
490
  {
490
491
  "id": "dry-run-release-workflow",
491
492
  "title": "Run the release workflow without publishing",
492
493
  "command": (
493
494
  "gh workflow run release.yml --repo codemower-ai/code-mower "
494
- "--ref main -f publish_testpypi=false -f publish_pypi=false"
495
+ f"--ref {release_workflow_ref} "
496
+ "-f publish_testpypi=false -f publish_pypi=false"
495
497
  ),
496
498
  "url": PACKAGE_INDEX_SETUP_URLS["release_workflow"],
497
499
  },
@@ -500,7 +502,8 @@ def render_release_readiness(repo_path: Path) -> dict[str, Any]:
500
502
  "title": "Publish the verified distribution to TestPyPI",
501
503
  "command": (
502
504
  "gh workflow run release.yml --repo codemower-ai/code-mower "
503
- "--ref main -f publish_testpypi=true -f publish_pypi=false"
505
+ f"--ref {release_workflow_ref} "
506
+ "-f publish_testpypi=true -f publish_pypi=false"
504
507
  ),
505
508
  "url": PACKAGE_INDEX_SETUP_URLS["release_workflow"],
506
509
  },
@@ -59,19 +59,22 @@ builder_identity:
59
59
  labels:
60
60
  builder:codex: codex
61
61
  builder:claude: claude
62
- builder:grok-bot: grok-bot
62
+ builder:cursor: cursor
63
+ builder:grok-bot: cursor
63
64
  authors:
64
65
  chatgpt-codex-connector[bot]: codex
65
66
  claude[bot]: claude
66
- grok-bot[bot]: grok-bot
67
+ cursor[bot]: cursor
68
+ grok-bot[bot]: cursor
67
69
  branch_prefixes:
68
- cursor/: grok-bot
70
+ cursor/: cursor
69
71
  fix_round_mentions:
70
- grok-bot: "@cursor"
72
+ cursor: "@cursor"
71
73
  trailers:
72
74
  CODE_MOWER_BUILDER:codex: codex
73
75
  CODE_MOWER_BUILDER:claude: claude
74
- CODE_MOWER_BUILDER:grok-bot: grok-bot
76
+ CODE_MOWER_BUILDER:cursor: cursor
77
+ CODE_MOWER_BUILDER:grok-bot: cursor
75
78
 
76
79
  lanes:
77
80
  codex:
@@ -8,7 +8,7 @@ permissions:
8
8
  contents: read
9
9
 
10
10
  env:
11
- CODE_MOWER_PACKAGE_SPEC: code-mower==0.5.0b52
11
+ CODE_MOWER_PACKAGE_SPEC: code-mower==0.5.0b53
12
12
 
13
13
  jobs:
14
14
  auto-record:
@@ -46,6 +46,10 @@ jobs:
46
46
  audit_lanes = json.loads(os.environ["CODE_MOWER_FIX_ROUND_AUDIT_LANES_JSON"])
47
47
  rules = json.loads(os.environ["CODE_MOWER_FIX_ROUND_RULES_JSON"])
48
48
 
49
+ def builder_labels(rule):
50
+ labels = [rule.get("builder_label", ""), *(rule.get("builder_labels") or [])]
51
+ return set(dict.fromkeys(label for label in labels if label))
52
+
49
53
  audit_lane = next(
50
54
  (lane for lane in audit_lanes if lane.get("blocked") == event_label),
51
55
  None,
@@ -54,7 +58,7 @@ jobs:
54
58
  (
55
59
  item
56
60
  for item in rules
57
- if item.get("builder_label") in pr_labels and item.get("mention")
61
+ if builder_labels(item).intersection(pr_labels) and item.get("mention")
58
62
  ),
59
63
  None,
60
64
  )