code-mower 0.5.0b38__tar.gz → 0.5.0b39__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 (275) hide show
  1. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/PKG-INFO +6 -6
  2. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/README.md +5 -5
  3. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/pyproject.toml +1 -1
  4. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/__init__.py +1 -1
  5. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/cli.py +1 -1
  6. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/grok_build_audit_pr.py +14 -1
  7. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower.egg-info/PKG-INFO +6 -6
  8. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/tests/test_provider_local_cli.py +74 -0
  9. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/tests/test_release_hygiene.py +34 -34
  10. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/CODE_OF_CONDUCT.md +0 -0
  11. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/LICENSE +0 -0
  12. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/MANIFEST.in +0 -0
  13. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/NOTICE +0 -0
  14. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/SUPPORT.md +0 -0
  15. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/requirements/requirements.txt +0 -0
  16. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/setup.cfg +0 -0
  17. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/adapters/__init__.py +0 -0
  18. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/adapters/_base.py +0 -0
  19. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/adapters/cursor_bugbot.py +0 -0
  20. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/adapters/gitar.py +0 -0
  21. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/adapters/greptile.py +0 -0
  22. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/adapters/qodo.py +0 -0
  23. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/antigravity_cli_audit_pr.py +0 -0
  24. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/audit_handoff_log.py +0 -0
  25. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/audit_labeler_lib.py +0 -0
  26. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/audit_progress.py +0 -0
  27. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/blind_review_artifacts.py +0 -0
  28. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/blind_review_coordinator.py +0 -0
  29. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/bootstrap.py +0 -0
  30. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/builder_experiment.py +0 -0
  31. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/calibration/__init__.py +0 -0
  32. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/calibration/arms.py +0 -0
  33. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/calibration/auto_discovery.py +0 -0
  34. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/calibration/commands.py +0 -0
  35. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/calibration/context_inputs.py +0 -0
  36. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/calibration/corpus.py +0 -0
  37. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/calibration/effect_report.py +0 -0
  38. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/calibration/evidence.py +0 -0
  39. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/calibration/evidence_report.py +0 -0
  40. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/calibration/identity.py +0 -0
  41. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/calibration/metrics.py +0 -0
  42. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/calibration/overlap.py +0 -0
  43. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/calibration/planning.py +0 -0
  44. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/calibration/policy.py +0 -0
  45. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/calibration/results.py +0 -0
  46. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/calibration/run_results.py +0 -0
  47. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/calibration/run_status.py +0 -0
  48. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/calibration/runner.py +0 -0
  49. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/calibration/truth.py +0 -0
  50. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/calibration/value_report.py +0 -0
  51. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/checks.py +0 -0
  52. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/claude_audit_pr.py +0 -0
  53. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/claude_cli_bounce.py +0 -0
  54. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/claude_cli_environment.py +0 -0
  55. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/clear_stale.py +0 -0
  56. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/cloud.py +0 -0
  57. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/cloud_client/__init__.py +0 -0
  58. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/cloud_client/bundle.py +0 -0
  59. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/cloud_client/doctor.py +0 -0
  60. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/cloud_client/dogfood.py +0 -0
  61. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/cloud_client/endpoints.py +0 -0
  62. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/cloud_client/errors.py +0 -0
  63. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/cloud_client/events.py +0 -0
  64. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/cloud_client/export.py +0 -0
  65. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/cloud_client/git_metadata.py +0 -0
  66. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/cloud_client/manifest.py +0 -0
  67. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/cloud_client/operations.py +0 -0
  68. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/cloud_client/reports.py +0 -0
  69. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/cloud_client/setup.py +0 -0
  70. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/cloud_client/upload.py +0 -0
  71. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/code_mower_calibration.py +0 -0
  72. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/code_mower_context_packs.py +0 -0
  73. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/code_mower_merge.py +0 -0
  74. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/code_mower_telemetry.py +0 -0
  75. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/coderabbit_cli_audit_pr.py +0 -0
  76. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/codex_audit_env_preflight.py +0 -0
  77. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/codex_audit_pr.py +0 -0
  78. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/codex_audit_schema_smoke.py +0 -0
  79. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/codex_audit_verdict.schema.json +0 -0
  80. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/config.py +0 -0
  81. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/doctor.py +0 -0
  82. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/doctor_checks/__init__.py +0 -0
  83. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/doctor_checks/cloud.py +0 -0
  84. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/doctor_checks/common.py +0 -0
  85. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/doctor_checks/github.py +0 -0
  86. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/doctor_checks/github_actions.py +0 -0
  87. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/doctor_checks/github_actions_cost.py +0 -0
  88. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/doctor_checks/github_actions_cost_summary.py +0 -0
  89. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/doctor_checks/github_actions_failure_annotations.py +0 -0
  90. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/doctor_checks/github_actions_failure_models.py +0 -0
  91. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/doctor_checks/github_actions_failure_scan.py +0 -0
  92. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/doctor_checks/github_actions_failure_selection.py +0 -0
  93. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/doctor_checks/github_actions_failures.py +0 -0
  94. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/doctor_checks/github_actions_permissions.py +0 -0
  95. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/doctor_checks/github_api.py +0 -0
  96. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/doctor_checks/github_branch.py +0 -0
  97. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/doctor_checks/github_config.py +0 -0
  98. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/doctor_checks/github_provider.py +0 -0
  99. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/doctor_checks/github_repo.py +0 -0
  100. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/doctor_checks/groups.py +0 -0
  101. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/doctor_checks/models.py +0 -0
  102. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/doctor_checks/output.py +0 -0
  103. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/doctor_checks/presets.py +0 -0
  104. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/doctor_checks/privacy.py +0 -0
  105. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/doctor_checks/provider_api_model.py +0 -0
  106. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/doctor_checks/provider_api_model_openai.py +0 -0
  107. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/doctor_checks/provider_api_model_profiles.py +0 -0
  108. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/doctor_checks/provider_env.py +0 -0
  109. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/doctor_checks/provider_env_required.py +0 -0
  110. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/doctor_checks/provider_env_tokens.py +0 -0
  111. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/doctor_checks/provider_local_cli.py +0 -0
  112. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/doctor_checks/provider_local_cli_commands.py +0 -0
  113. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/doctor_checks/provider_local_cli_probe_config.py +0 -0
  114. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/doctor_checks/provider_probe.py +0 -0
  115. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/doctor_checks/provider_probe_auth.py +0 -0
  116. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/doctor_checks/provider_probe_evaluation.py +0 -0
  117. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/doctor_checks/provider_probe_json.py +0 -0
  118. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/doctor_checks/provider_probe_remediation.py +0 -0
  119. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/doctor_checks/provider_review_hygiene.py +0 -0
  120. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/doctor_checks/providers.py +0 -0
  121. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/doctor_checks/registry.py +0 -0
  122. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/doctor_checks/runner.py +0 -0
  123. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/doctor_checks/runtime.py +0 -0
  124. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/doctor_checks/runtime_github_auth.py +0 -0
  125. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/gemini_cli_audit_pr.py +0 -0
  126. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/hermes_cli_audit_pr.py +0 -0
  127. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/init.py +0 -0
  128. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/lane_configs/__init__.py +0 -0
  129. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/lane_configs/aider.py +0 -0
  130. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/lane_configs/antigravity_cli.py +0 -0
  131. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/lane_configs/claude.py +0 -0
  132. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/lane_configs/codex.py +0 -0
  133. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/lane_configs/devin.py +0 -0
  134. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/lane_configs/gemini_cli.py +0 -0
  135. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/lane_configs/grok_build.py +0 -0
  136. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/lane_configs/hermes_cli.py +0 -0
  137. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/lane_configs/local_llm.py +0 -0
  138. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/local_llm_audit_pr.py +0 -0
  139. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/local_llm_bakeoff.py +0 -0
  140. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/local_llm_calibration.py +0 -0
  141. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/local_llm_profiles.py +0 -0
  142. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/migration.py +0 -0
  143. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/migration_install.py +0 -0
  144. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/migration_mirror.py +0 -0
  145. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/migration_readiness.py +0 -0
  146. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/migration_rehearsal.py +0 -0
  147. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/next_steps.py +0 -0
  148. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/package.py +0 -0
  149. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/package_content.py +0 -0
  150. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/package_manifest.py +0 -0
  151. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/package_paths.py +0 -0
  152. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/package_rendering.py +0 -0
  153. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/package_static.py +0 -0
  154. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/prompts.py +0 -0
  155. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/provider_registry.py +0 -0
  156. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/provider_runners/__init__.py +0 -0
  157. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/provider_runners/comments.py +0 -0
  158. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/provider_runners/git.py +0 -0
  159. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/provider_runners/github_auth.py +0 -0
  160. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/provider_runners/github_pr.py +0 -0
  161. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/provider_runners/pr_worktree.py +0 -0
  162. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/provider_runners/process.py +0 -0
  163. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/provider_runners/repo_paths.py +0 -0
  164. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/provider_runners/text_schema.py +0 -0
  165. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/provider_runners/verdict_artifacts.py +0 -0
  166. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/provider_runners/workspace.py +0 -0
  167. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/providers/__init__.py +0 -0
  168. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/providers/local_cli.py +0 -0
  169. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/providers/provenance.py +0 -0
  170. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/release_readiness.py +0 -0
  171. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/reviewer_metrics.py +0 -0
  172. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/saas_reviewer_labeler.py +0 -0
  173. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/secrets.py +0 -0
  174. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/templates/builder-experiment.example.json +0 -0
  175. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/templates/calibration-corpus.example.json +0 -0
  176. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/templates/calibration-corpus.json +0 -0
  177. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/templates/code-mower.example.yml +0 -0
  178. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/templates/context-packs.example.json +0 -0
  179. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/templates/lane_prompts/base-audit.md +0 -0
  180. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/templates/lane_prompts/calibration-policy.md +0 -0
  181. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/templates/lane_prompts/context-driven-quality.md +0 -0
  182. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/templates/lane_prompts/docs-design.md +0 -0
  183. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/templates/lane_prompts/generic-programming.md +0 -0
  184. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/templates/lane_prompts/operability.md +0 -0
  185. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/templates/lane_prompts/package-runtime.md +0 -0
  186. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/templates/lane_prompts/security-threat-model.md +0 -0
  187. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/templates/product-support/code_mower +0 -0
  188. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/templates/product-support/code_mower_standalone_pin.env +0 -0
  189. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/templates/product-support/code_mower_standalone_shadow.sh +0 -0
  190. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/templates/product-support/run_claude_audit_pr.sh +0 -0
  191. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/templates/product-support/run_codex_audit_pr.sh +0 -0
  192. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/templates/product-support/safe_gh_comment.py +0 -0
  193. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/templates/providers.yml +0 -0
  194. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/templates/reviewer-spend.example.json +0 -0
  195. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/templates/reviewer-value-report.example.md +0 -0
  196. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/templates/workflows/audit-label-cleanup.yml.j2 +0 -0
  197. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/templates/workflows/hosted-bridge.yml.j2 +0 -0
  198. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/templates/workflows/local-cli-audit.yml.j2 +0 -0
  199. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/templates/workflows/private-standalone-shadow.yml.j2 +0 -0
  200. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/templates/workflows/review-clear-stale.yml.j2 +0 -0
  201. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/templates/workflows/saas-reviewer-labeler.yml.j2 +0 -0
  202. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/templates/workflows/trailer-comment-labeler.yml.j2 +0 -0
  203. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/trailer_comment_labeler.py +0 -0
  204. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/versioning.py +0 -0
  205. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower/work_orders.py +0 -0
  206. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower.egg-info/SOURCES.txt +0 -0
  207. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower.egg-info/dependency_links.txt +0 -0
  208. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower.egg-info/entry_points.txt +0 -0
  209. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower.egg-info/requires.txt +0 -0
  210. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/src/code_mower.egg-info/top_level.txt +0 -0
  211. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/templates/builder-experiment.example.json +0 -0
  212. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/templates/calibration-corpus.example.json +0 -0
  213. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/templates/calibration-corpus.json +0 -0
  214. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/templates/code-mower.yml.j2 +0 -0
  215. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/templates/context-packs.example.json +0 -0
  216. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/templates/cursor/BUGBOT.md +0 -0
  217. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/templates/providers/acp_bridge.yml +0 -0
  218. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/templates/providers/aider.yml +0 -0
  219. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/templates/providers/antigravity_cli.yml +0 -0
  220. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/templates/providers/claude_audit.yml +0 -0
  221. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/templates/providers/claude_review.yml +0 -0
  222. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/templates/providers/coderabbit_cli.yml +0 -0
  223. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/templates/providers/codex.yml +0 -0
  224. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/templates/providers/cursor_bugbot.yml +0 -0
  225. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/templates/providers/devin.yml +0 -0
  226. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/templates/providers/gemini_cli.yml +0 -0
  227. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/templates/providers/gitar.yml +0 -0
  228. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/templates/providers/greptile.yml +0 -0
  229. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/templates/providers/hermes_cli.yml +0 -0
  230. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/templates/providers/local_llm.yml +0 -0
  231. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/templates/providers/qodo.yml +0 -0
  232. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/templates/providers.yml +0 -0
  233. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/templates/reviewer-spend.example.json +0 -0
  234. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/templates/reviewer-value-report.example.md +0 -0
  235. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/templates/workflows/audit-label-cleanup.yml.j2 +0 -0
  236. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/templates/workflows/blind-review-artifacts-dry-run.yml.j2 +0 -0
  237. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/templates/workflows/hosted-bridge.yml.j2 +0 -0
  238. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/templates/workflows/local-cli-audit.yml.j2 +0 -0
  239. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/templates/workflows/private-standalone-shadow.yml.j2 +0 -0
  240. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/templates/workflows/review-clear-stale.yml.j2 +0 -0
  241. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/templates/workflows/saas-reviewer-labeler.yml.j2 +0 -0
  242. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/templates/workflows/trailer-comment-labeler.yml.j2 +0 -0
  243. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/tests/test_calibration_effect_report.py +0 -0
  244. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/tests/test_calibration_truth.py +0 -0
  245. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/tests/test_checks.py +0 -0
  246. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/tests/test_claude_cli_bounce.py +0 -0
  247. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/tests/test_clear_stale.py +0 -0
  248. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/tests/test_cloud_client.py +0 -0
  249. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/tests/test_cloud_git_metadata.py +0 -0
  250. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/tests/test_cloud_manifest.py +0 -0
  251. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/tests/test_cloud_reports.py +0 -0
  252. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/tests/test_coderabbit_cli_audit_pr.py +0 -0
  253. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/tests/test_codex_audit_env_preflight.py +0 -0
  254. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/tests/test_doctor_actions_cost_summary.py +0 -0
  255. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/tests/test_doctor_actions_failure_selection.py +0 -0
  256. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/tests/test_doctor_boundaries.py +0 -0
  257. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/tests/test_doctor_github_checks.py +0 -0
  258. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/tests/test_doctor_output.py +0 -0
  259. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/tests/test_doctor_privacy.py +0 -0
  260. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/tests/test_doctor_provider_env_required.py +0 -0
  261. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/tests/test_doctor_provider_env_tokens.py +0 -0
  262. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/tests/test_doctor_provider_probe.py +0 -0
  263. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/tests/test_doctor_provider_review_hygiene.py +0 -0
  264. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/tests/test_doctor_registry.py +0 -0
  265. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/tests/test_local_llm_github_helpers.py +0 -0
  266. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/tests/test_provider_runners_comments.py +0 -0
  267. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/tests/test_provider_runners_git.py +0 -0
  268. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/tests/test_provider_runners_github_pr.py +0 -0
  269. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/tests/test_provider_runners_pr_worktree.py +0 -0
  270. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/tests/test_provider_runners_process.py +0 -0
  271. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/tests/test_provider_runners_repo_paths.py +0 -0
  272. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/tests/test_provider_runners_text_schema.py +0 -0
  273. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/tests/test_provider_runners_workspace.py +0 -0
  274. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/tests/test_reviewer_metrics_core.py +0 -0
  275. {code_mower-0.5.0b38 → code_mower-0.5.0b39}/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.0b38
3
+ Version: 0.5.0b39
4
4
  Summary: Multi-reviewer AI code audit orchestration
5
5
  License-Expression: Apache-2.0
6
6
  Requires-Python: >=3.11
@@ -103,11 +103,11 @@ Code Mower currently targets Python 3.11+; Python 3.12 is recommended.
103
103
 
104
104
  ```bash
105
105
  python3.12 --version
106
- pipx install --python python3.12 code-mower==0.5.0b38
106
+ pipx install --python python3.12 code-mower==0.5.0b39
107
107
  code-mower --version
108
108
  ```
109
109
 
110
- `0.5.0b38` is a beta release. Until Code Mower publishes a stable `1.0`
110
+ `0.5.0b39` is a beta release. Until Code Mower publishes a stable `1.0`
111
111
  line, use the explicit beta version above or allow prereleases with:
112
112
 
113
113
  ```bash
@@ -150,7 +150,7 @@ First-time command map: [docs/launch-command-surface.md](docs/launch-command-sur
150
150
 
151
151
  The current PyPI beta has been rehearsed end-to-end from a clean install:
152
152
  [First-User Install Rehearsal](docs/first-user-install-rehearsal.md) records
153
- the latest 10/10 public-package readiness proof for `code-mower==0.5.0b38`.
153
+ the latest 10/10 public-package readiness proof for `code-mower==0.5.0b39`.
154
154
 
155
155
  ## Optional: Plan Before Coding
156
156
 
@@ -291,9 +291,9 @@ best?" to "which AI builder plus reviewer loop ships best on this product?" See
291
291
 
292
292
  ## Installation Status
293
293
 
294
- The current public beta is `v0.5.0-beta.38` from
294
+ The current public beta is `v0.5.0-beta.39` from
295
295
  [codemower-ai/code-mower](https://github.com/codemower-ai/code-mower), published
296
- as `code-mower==0.5.0b38` on [PyPI](https://pypi.org/project/code-mower/).
296
+ as `code-mower==0.5.0b39` on [PyPI](https://pypi.org/project/code-mower/).
297
297
  GitHub releases remain the auditable source for tags, build artifacts, and
298
298
  release notes.
299
299
 
@@ -88,11 +88,11 @@ Code Mower currently targets Python 3.11+; Python 3.12 is recommended.
88
88
 
89
89
  ```bash
90
90
  python3.12 --version
91
- pipx install --python python3.12 code-mower==0.5.0b38
91
+ pipx install --python python3.12 code-mower==0.5.0b39
92
92
  code-mower --version
93
93
  ```
94
94
 
95
- `0.5.0b38` is a beta release. Until Code Mower publishes a stable `1.0`
95
+ `0.5.0b39` is a beta release. Until Code Mower publishes a stable `1.0`
96
96
  line, use the explicit beta version above or allow prereleases with:
97
97
 
98
98
  ```bash
@@ -135,7 +135,7 @@ First-time command map: [docs/launch-command-surface.md](docs/launch-command-sur
135
135
 
136
136
  The current PyPI beta has been rehearsed end-to-end from a clean install:
137
137
  [First-User Install Rehearsal](docs/first-user-install-rehearsal.md) records
138
- the latest 10/10 public-package readiness proof for `code-mower==0.5.0b38`.
138
+ the latest 10/10 public-package readiness proof for `code-mower==0.5.0b39`.
139
139
 
140
140
  ## Optional: Plan Before Coding
141
141
 
@@ -276,9 +276,9 @@ best?" to "which AI builder plus reviewer loop ships best on this product?" See
276
276
 
277
277
  ## Installation Status
278
278
 
279
- The current public beta is `v0.5.0-beta.38` from
279
+ The current public beta is `v0.5.0-beta.39` from
280
280
  [codemower-ai/code-mower](https://github.com/codemower-ai/code-mower), published
281
- as `code-mower==0.5.0b38` on [PyPI](https://pypi.org/project/code-mower/).
281
+ as `code-mower==0.5.0b39` on [PyPI](https://pypi.org/project/code-mower/).
282
282
  GitHub releases remain the auditable source for tags, build artifacts, and
283
283
  release notes.
284
284
 
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "code-mower"
7
- version = "0.5.0b38"
7
+ version = "0.5.0b39"
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.0b38"
3
+ __version__ = "0.5.0b39"
@@ -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.0b38`, or run source checkouts with "
17
+ "`pipx install code-mower==0.5.0b39`, or run source checkouts with "
18
18
  "`PYTHONPATH=src python -m code_mower.cli`."
19
19
  )
20
20
 
@@ -39,6 +39,7 @@ DEFAULT_GROK_COMMAND = "grok"
39
39
  DEFAULT_GROK_MODE = "grok-build-audit"
40
40
  DEFAULT_GROK_OUTPUT_STEM = "grok-build"
41
41
  DEFAULT_GROK_DISPLAY_NAME = "Grok Build"
42
+ DEFAULT_GROK_MAX_TURNS = 4
42
43
  DEFAULT_GROK_MODEL_ENV = "GROK_MODEL"
43
44
  CODE_MOWER_GROK_MODEL_ENV = "CODE_MOWER_GROK_MODEL"
44
45
  GROK_AMBIENT_HOME_ENV = "GROK_BUILD_USE_AMBIENT_HOME"
@@ -161,6 +162,7 @@ def run_grok_build_audit(
161
162
  prompt_dir: Path | None = None,
162
163
  max_diff_bytes: int = gemini_cli_audit_pr.DEFAULT_MAX_DIFF_BYTES,
163
164
  timeout_seconds: int = gemini_cli_audit_pr.DEFAULT_TIMEOUT_SECONDS,
165
+ grok_max_turns: int = DEFAULT_GROK_MAX_TURNS,
164
166
  output_dir: Path | None = None,
165
167
  grok_api_key: str | None = None,
166
168
  repo_path: Path | None = None,
@@ -234,6 +236,7 @@ def run_grok_build_audit(
234
236
  diagnostics["base_ref"] = base_ref if repo_path is not None else None
235
237
  diagnostics["cli_transport"] = "prompt_file"
236
238
  diagnostics["preserve_ambient_home"] = allow_ambient_home
239
+ diagnostics["grok_max_turns"] = max(1, grok_max_turns)
237
240
 
238
241
  started = time.monotonic()
239
242
  grok_model = resolve_grok_model()
@@ -263,7 +266,7 @@ def run_grok_build_audit(
263
266
  "--disable-web-search",
264
267
  "--no-memory",
265
268
  "--max-turns",
266
- "1",
269
+ str(max(1, grok_max_turns)),
267
270
  ]
268
271
  if grok_model:
269
272
  grok_args.extend(["--model", grok_model])
@@ -381,6 +384,15 @@ def main(argv: list[str] | None = None) -> int:
381
384
  default=gemini_cli_audit_pr.DEFAULT_MAX_DIFF_BYTES,
382
385
  )
383
386
  parser.add_argument("--timeout", type=int, default=gemini_cli_audit_pr.DEFAULT_TIMEOUT_SECONDS)
387
+ parser.add_argument(
388
+ "--grok-max-turns",
389
+ type=int,
390
+ default=DEFAULT_GROK_MAX_TURNS,
391
+ help=(
392
+ "Maximum Grok Build agent turns for a PR audit. The smoke probe can "
393
+ "use one turn, but real audits need enough room to return verdict JSON."
394
+ ),
395
+ )
384
396
  parser.add_argument("--output-dir", type=Path, default=None)
385
397
  parser.add_argument("--json", action="store_true")
386
398
  parser.add_argument(
@@ -416,6 +428,7 @@ def main(argv: list[str] | None = None) -> int:
416
428
  prompt_dir=args.prompt_dir,
417
429
  max_diff_bytes=args.max_diff_bytes,
418
430
  timeout_seconds=args.timeout,
431
+ grok_max_turns=args.grok_max_turns,
419
432
  output_dir=args.output_dir,
420
433
  grok_api_key=grok_api_key,
421
434
  repo_path=args.repo_path,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: code-mower
3
- Version: 0.5.0b38
3
+ Version: 0.5.0b39
4
4
  Summary: Multi-reviewer AI code audit orchestration
5
5
  License-Expression: Apache-2.0
6
6
  Requires-Python: >=3.11
@@ -103,11 +103,11 @@ Code Mower currently targets Python 3.11+; Python 3.12 is recommended.
103
103
 
104
104
  ```bash
105
105
  python3.12 --version
106
- pipx install --python python3.12 code-mower==0.5.0b38
106
+ pipx install --python python3.12 code-mower==0.5.0b39
107
107
  code-mower --version
108
108
  ```
109
109
 
110
- `0.5.0b38` is a beta release. Until Code Mower publishes a stable `1.0`
110
+ `0.5.0b39` is a beta release. Until Code Mower publishes a stable `1.0`
111
111
  line, use the explicit beta version above or allow prereleases with:
112
112
 
113
113
  ```bash
@@ -150,7 +150,7 @@ First-time command map: [docs/launch-command-surface.md](docs/launch-command-sur
150
150
 
151
151
  The current PyPI beta has been rehearsed end-to-end from a clean install:
152
152
  [First-User Install Rehearsal](docs/first-user-install-rehearsal.md) records
153
- the latest 10/10 public-package readiness proof for `code-mower==0.5.0b38`.
153
+ the latest 10/10 public-package readiness proof for `code-mower==0.5.0b39`.
154
154
 
155
155
  ## Optional: Plan Before Coding
156
156
 
@@ -291,9 +291,9 @@ best?" to "which AI builder plus reviewer loop ships best on this product?" See
291
291
 
292
292
  ## Installation Status
293
293
 
294
- The current public beta is `v0.5.0-beta.38` from
294
+ The current public beta is `v0.5.0-beta.39` from
295
295
  [codemower-ai/code-mower](https://github.com/codemower-ai/code-mower), published
296
- as `code-mower==0.5.0b38` on [PyPI](https://pypi.org/project/code-mower/).
296
+ as `code-mower==0.5.0b39` on [PyPI](https://pypi.org/project/code-mower/).
297
297
  GitHub releases remain the auditable source for tags, build artifacts, and
298
298
  release notes.
299
299
 
@@ -1,6 +1,8 @@
1
1
  from __future__ import annotations
2
2
 
3
+ import json
3
4
  import os
5
+ import subprocess
4
6
  from pathlib import Path
5
7
 
6
8
  from code_mower.provider_registry import REFERENCE_PROVIDERS
@@ -403,6 +405,78 @@ def test_grok_build_runner_prefers_code_mower_model_env(monkeypatch) -> None:
403
405
  assert grok_build_audit_pr.resolve_grok_model() == "grok-4.6-build"
404
406
 
405
407
 
408
+ def test_grok_build_runner_uses_configurable_audit_turn_budget(
409
+ monkeypatch,
410
+ tmp_path: Path,
411
+ ) -> None:
412
+ calls: list[list[str]] = []
413
+
414
+ monkeypatch.setattr(
415
+ grok_build_audit_pr.gemini_cli_audit_pr,
416
+ "fetch_pull_request",
417
+ lambda repo, pr_number, *, token: {"head": {"sha": "abc123"}},
418
+ )
419
+ monkeypatch.setattr(
420
+ grok_build_audit_pr.gemini_cli_audit_pr,
421
+ "fetch_local_checkout_diff",
422
+ lambda repo_path, *, base_ref: ("abc123", "diff --git a/a b/a\n"),
423
+ )
424
+ monkeypatch.setattr(
425
+ grok_build_audit_pr.gemini_cli_audit_pr,
426
+ "_local_head_sha",
427
+ lambda repo_path: "abc123",
428
+ )
429
+ monkeypatch.setattr(
430
+ grok_build_audit_pr.gemini_cli_audit_pr,
431
+ "build_prompt",
432
+ lambda **kwargs: ("review prompt", {}),
433
+ )
434
+
435
+ def fake_run(args, **kwargs):
436
+ calls.append(list(args))
437
+ return subprocess.CompletedProcess(
438
+ args,
439
+ 0,
440
+ stdout=json.dumps(
441
+ {
442
+ "text": json.dumps(
443
+ {
444
+ "verdict": "pass",
445
+ "summary": "No findings.",
446
+ "findings": [],
447
+ }
448
+ )
449
+ }
450
+ ),
451
+ stderr="",
452
+ )
453
+
454
+ monkeypatch.setattr(grok_build_audit_pr.subprocess, "run", fake_run)
455
+
456
+ default_payload = grok_build_audit_pr.run_grok_build_audit(
457
+ repo="owner/repo",
458
+ pr_number=7,
459
+ github_token="token",
460
+ command="grok",
461
+ repo_path=tmp_path,
462
+ allow_ambient_home=True,
463
+ )
464
+ custom_payload = grok_build_audit_pr.run_grok_build_audit(
465
+ repo="owner/repo",
466
+ pr_number=7,
467
+ github_token="token",
468
+ command="grok",
469
+ repo_path=tmp_path,
470
+ allow_ambient_home=True,
471
+ grok_max_turns=8,
472
+ )
473
+
474
+ assert default_payload["diagnostics"]["grok_max_turns"] == 4
475
+ assert custom_payload["diagnostics"]["grok_max_turns"] == 8
476
+ assert calls[0][calls[0].index("--max-turns") + 1] == "4"
477
+ assert calls[1][calls[1].index("--max-turns") + 1] == "8"
478
+
479
+
406
480
  def test_provider_lane_tool_provenance_marks_hosted_model_as_vendor_hidden() -> None:
407
481
  lane = {
408
482
  "driver": "saas_event",
@@ -49,7 +49,7 @@ from scripts import privacy_scan
49
49
 
50
50
  class ReleaseHygieneTests(unittest.TestCase):
51
51
  def test_version_is_current_v05_prerelease(self) -> None:
52
- self.assertEqual(__version__, "0.5.0b38")
52
+ self.assertEqual(__version__, "0.5.0b39")
53
53
 
54
54
  def test_release_workflow_verifies_downloaded_distributions_before_publish(self) -> None:
55
55
  workflow = (ROOT / ".github/workflows/release.yml").read_text(encoding="utf-8")
@@ -204,7 +204,7 @@ class ReleaseHygieneTests(unittest.TestCase):
204
204
  self.assertIn(
205
205
  (
206
206
  "code-mower migration package-install-rehearsal --package-spec "
207
- "code-mower==0.5.0b38 --json"
207
+ "code-mower==0.5.0b39 --json"
208
208
  ),
209
209
  help_text,
210
210
  )
@@ -1629,8 +1629,8 @@ printf '%s\\n' "${lane}"
1629
1629
  fromlist=["current_alpha_package_spec"],
1630
1630
  )
1631
1631
  self.assertEqual(
1632
- legacy_module.current_alpha_package_spec("0.5.0b38"),
1633
- "code-mower==0.5.0b38",
1632
+ legacy_module.current_alpha_package_spec("0.5.0b39"),
1633
+ "code-mower==0.5.0b39",
1634
1634
  )
1635
1635
  finally:
1636
1636
  sys.path[:] = original_path
@@ -1667,7 +1667,7 @@ printf '%s\\n' "${lane}"
1667
1667
  "-c",
1668
1668
  (
1669
1669
  "from tools import code_mower_package_content as c; "
1670
- "print(c.current_alpha_package_spec('0.5.0b38'))"
1670
+ "print(c.current_alpha_package_spec('0.5.0b39'))"
1671
1671
  ),
1672
1672
  ],
1673
1673
  cwd=tmp_path,
@@ -1680,7 +1680,7 @@ printf '%s\\n' "${lane}"
1680
1680
  self.assertEqual(completed.returncode, 0, completed.stderr)
1681
1681
  self.assertEqual(
1682
1682
  completed.stdout.strip(),
1683
- "code-mower==0.5.0b38",
1683
+ "code-mower==0.5.0b39",
1684
1684
  )
1685
1685
 
1686
1686
  def test_package_rendering_legacy_fallback_stays_valid_yaml_subset(self) -> None:
@@ -1756,11 +1756,11 @@ printf '%s\\n' "${lane}"
1756
1756
  (output_dir / "src/code_mower/cloud_client/dogfood.py").is_file()
1757
1757
  )
1758
1758
  self.assertIn(
1759
- 'version = "0.5.0b38"',
1759
+ 'version = "0.5.0b39"',
1760
1760
  (output_dir / "pyproject.toml").read_text(encoding="utf-8"),
1761
1761
  )
1762
1762
  self.assertIn(
1763
- '__version__ = "0.5.0b38"',
1763
+ '__version__ = "0.5.0b39"',
1764
1764
  (output_dir / "src/code_mower/__init__.py").read_text(
1765
1765
  encoding="utf-8"
1766
1766
  ),
@@ -3295,7 +3295,7 @@ def main():
3295
3295
  {
3296
3296
  "status": "pass",
3297
3297
  "package_spec": "code-mower",
3298
- "version": "code-mower 0.5.0b38",
3298
+ "version": "code-mower 0.5.0b39",
3299
3299
  "work_dir": "/tmp/code-mower-rehearsal",
3300
3300
  "toy_repo": "/tmp/code-mower-rehearsal/toy-repo",
3301
3301
  "step_count": 1,
@@ -3407,7 +3407,7 @@ def main():
3407
3407
  scorecard = code_mower_migration._first_user_readiness_scorecard(
3408
3408
  toy_repo=toy_repo,
3409
3409
  outputs=outputs,
3410
- version="code-mower 0.5.0b38",
3410
+ version="code-mower 0.5.0b39",
3411
3411
  steps=[
3412
3412
  {
3413
3413
  "command": ["code-mower", "doctor", "--easy", "--json"],
@@ -3486,7 +3486,7 @@ def main():
3486
3486
  scorecard = code_mower_migration._first_user_readiness_scorecard(
3487
3487
  toy_repo=toy_repo,
3488
3488
  outputs=outputs,
3489
- version="code-mower 0.5.0b38",
3489
+ version="code-mower 0.5.0b39",
3490
3490
  steps=[
3491
3491
  {
3492
3492
  "command": ["code-mower", "doctor", "--easy", "--json"],
@@ -3548,7 +3548,7 @@ def main():
3548
3548
  scorecard = code_mower_migration._first_user_readiness_scorecard(
3549
3549
  toy_repo=toy_repo,
3550
3550
  outputs=outputs,
3551
- version="code-mower 0.5.0b38",
3551
+ version="code-mower 0.5.0b39",
3552
3552
  steps=[
3553
3553
  {
3554
3554
  "command": ["code-mower", "doctor", "--easy", "--json"],
@@ -3614,24 +3614,24 @@ def main():
3614
3614
  )
3615
3615
  self.assertEqual(
3616
3616
  code_mower_migration._resolve_install_package_spec(
3617
- "git+https://github.com/codemower-ai/code-mower.git@v0.5.0-beta.38",
3617
+ "git+https://github.com/codemower-ai/code-mower.git@v0.5.0-beta.39",
3618
3618
  base_dir=package,
3619
3619
  ),
3620
- "git+https://github.com/codemower-ai/code-mower.git@v0.5.0-beta.38",
3620
+ "git+https://github.com/codemower-ai/code-mower.git@v0.5.0-beta.39",
3621
3621
  )
3622
3622
  self.assertEqual(
3623
3623
  code_mower_migration._resolve_install_package_spec(
3624
- "code-mower==0.5.0b38",
3624
+ "code-mower==0.5.0b39",
3625
3625
  base_dir=package,
3626
3626
  ),
3627
- "code-mower==0.5.0b38",
3627
+ "code-mower==0.5.0b39",
3628
3628
  )
3629
3629
 
3630
3630
  def test_package_install_rehearsal_supports_index_aware_pip_install(self) -> None:
3631
3631
  self.assertEqual(
3632
3632
  code_mower_migration._pip_install_command(
3633
3633
  Path("/tmp/venv/bin/python"),
3634
- "code-mower==0.5.0b38",
3634
+ "code-mower==0.5.0b39",
3635
3635
  pip_index_url="https://test.pypi.org/simple/",
3636
3636
  pip_extra_index_urls=["https://pypi.org/simple/"],
3637
3637
  ),
@@ -3644,7 +3644,7 @@ def main():
3644
3644
  "https://test.pypi.org/simple/",
3645
3645
  "--extra-index-url",
3646
3646
  "https://pypi.org/simple/",
3647
- "code-mower==0.5.0b38",
3647
+ "code-mower==0.5.0b39",
3648
3648
  ],
3649
3649
  )
3650
3650
 
@@ -3664,10 +3664,10 @@ def main():
3664
3664
  payload = release_readiness.render_release_readiness(ROOT)
3665
3665
 
3666
3666
  self.assertEqual(payload["status"], "pass")
3667
- self.assertEqual(payload["version"], "0.5.0b38")
3668
- self.assertEqual(payload["release_tag"], "v0.5.0-beta.38")
3669
- self.assertEqual(payload["alpha_tag"], "v0.5.0-beta.38")
3670
- self.assertEqual(payload["package_index_spec"], "code-mower==0.5.0b38")
3667
+ self.assertEqual(payload["version"], "0.5.0b39")
3668
+ self.assertEqual(payload["release_tag"], "v0.5.0-beta.39")
3669
+ self.assertEqual(payload["alpha_tag"], "v0.5.0-beta.39")
3670
+ self.assertEqual(payload["package_index_spec"], "code-mower==0.5.0b39")
3671
3671
  check_ids = {check["id"]: check for check in payload["checks"]}
3672
3672
  self.assertEqual(check_ids["package-version-consistency"]["status"], "pass")
3673
3673
  self.assertEqual(
@@ -3716,7 +3716,7 @@ def main():
3716
3716
  check_ids = {check["id"]: check for check in payload["checks"]}
3717
3717
  check = check_ids["materialized-package-version-consistency"]
3718
3718
  self.assertEqual(check["status"], "fail")
3719
- self.assertEqual(check["detail"]["source_version"], "0.5.0b38")
3719
+ self.assertEqual(check["detail"]["source_version"], "0.5.0b39")
3720
3720
  self.assertEqual(check["detail"]["generated_init_version"], "0.0.0")
3721
3721
 
3722
3722
  def test_public_support_docs_are_packaged_and_privacy_forward(self) -> None:
@@ -3796,20 +3796,20 @@ def main():
3796
3796
 
3797
3797
  def test_release_readiness_tag_derivation_supports_release_stages(self) -> None:
3798
3798
  self.assertEqual(
3799
- release_readiness._release_tag_for_version("0.5.0b38"),
3800
- "v0.5.0-beta.38",
3799
+ release_readiness._release_tag_for_version("0.5.0b39"),
3800
+ "v0.5.0-beta.39",
3801
3801
  )
3802
3802
  self.assertEqual(
3803
- code_mower_versioning.release_tag_for_version("0.5.0b38"),
3804
- "v0.5.0-beta.38",
3803
+ code_mower_versioning.release_tag_for_version("0.5.0b39"),
3804
+ "v0.5.0-beta.39",
3805
3805
  )
3806
3806
  self.assertEqual(
3807
- release_readiness._release_tag_for_version("0.5.0b38"),
3808
- "v0.5.0-beta.38",
3807
+ release_readiness._release_tag_for_version("0.5.0b39"),
3808
+ "v0.5.0-beta.39",
3809
3809
  )
3810
3810
  self.assertEqual(
3811
- code_mower_versioning.release_tag_for_version("0.5.0b38"),
3812
- "v0.5.0-beta.38",
3811
+ code_mower_versioning.release_tag_for_version("0.5.0b39"),
3812
+ "v0.5.0-beta.39",
3813
3813
  )
3814
3814
  self.assertEqual(
3815
3815
  release_readiness._release_tag_for_version("1.0.0rc1"),
@@ -3838,8 +3838,8 @@ def main():
3838
3838
  next_steps.current_alpha_package_spec(),
3839
3839
  )
3840
3840
  self.assertEqual(
3841
- code_mower_package_content.current_alpha_package_spec("0.5.0b38"),
3842
- "code-mower==0.5.0b38",
3841
+ code_mower_package_content.current_alpha_package_spec("0.5.0b39"),
3842
+ "code-mower==0.5.0b39",
3843
3843
  )
3844
3844
  self.assertNotIn(next_steps.current_public_tag(), package_content_text)
3845
3845
  self.assertNotIn("v0.0.0", package_content_text)
@@ -4011,7 +4011,7 @@ def main():
4011
4011
  step for step in plan["steps"] if step["id"] == "package-install-rehearsal"
4012
4012
  )
4013
4013
  self.assertIn("doctor --v05", doctor_step["command"])
4014
- self.assertIn("code-mower==0.5.0b38", package_step["command"])
4014
+ self.assertIn("code-mower==0.5.0b39", package_step["command"])
4015
4015
  self.assertIn("current published PyPI prerelease", package_step["why"])
4016
4016
  self.assertIn("first_user_readiness", package_step["why"])
4017
4017
  self.assertEqual(
File without changes
File without changes
File without changes
File without changes
File without changes