code-mower 0.5.0b20__tar.gz → 0.5.0b22__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 (270) hide show
  1. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/PKG-INFO +6 -6
  2. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/README.md +5 -5
  3. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/pyproject.toml +1 -1
  4. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/__init__.py +1 -1
  5. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/cli.py +1 -1
  6. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/cloud_client/export.py +9 -1
  7. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/provider_registry.py +12 -0
  8. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/providers/provenance.py +22 -2
  9. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/templates/code-mower.example.yml +21 -0
  10. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/templates/providers.yml +21 -0
  11. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower.egg-info/PKG-INFO +6 -6
  12. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/templates/providers.yml +21 -0
  13. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/tests/test_cloud_client.py +65 -0
  14. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/tests/test_provider_local_cli.py +108 -1
  15. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/tests/test_release_hygiene.py +34 -34
  16. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/CODE_OF_CONDUCT.md +0 -0
  17. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/LICENSE +0 -0
  18. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/MANIFEST.in +0 -0
  19. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/NOTICE +0 -0
  20. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/SUPPORT.md +0 -0
  21. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/requirements/requirements.txt +0 -0
  22. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/setup.cfg +0 -0
  23. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/adapters/__init__.py +0 -0
  24. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/adapters/_base.py +0 -0
  25. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/adapters/cursor_bugbot.py +0 -0
  26. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/adapters/gitar.py +0 -0
  27. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/adapters/greptile.py +0 -0
  28. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/adapters/qodo.py +0 -0
  29. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/antigravity_cli_audit_pr.py +0 -0
  30. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/audit_handoff_log.py +0 -0
  31. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/audit_labeler_lib.py +0 -0
  32. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/audit_progress.py +0 -0
  33. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/blind_review_artifacts.py +0 -0
  34. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/blind_review_coordinator.py +0 -0
  35. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/bootstrap.py +0 -0
  36. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/builder_experiment.py +0 -0
  37. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/calibration/__init__.py +0 -0
  38. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/calibration/arms.py +0 -0
  39. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/calibration/auto_discovery.py +0 -0
  40. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/calibration/commands.py +0 -0
  41. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/calibration/context_inputs.py +0 -0
  42. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/calibration/corpus.py +0 -0
  43. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/calibration/effect_report.py +0 -0
  44. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/calibration/evidence.py +0 -0
  45. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/calibration/evidence_report.py +0 -0
  46. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/calibration/identity.py +0 -0
  47. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/calibration/metrics.py +0 -0
  48. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/calibration/overlap.py +0 -0
  49. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/calibration/planning.py +0 -0
  50. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/calibration/policy.py +0 -0
  51. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/calibration/results.py +0 -0
  52. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/calibration/run_results.py +0 -0
  53. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/calibration/run_status.py +0 -0
  54. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/calibration/runner.py +0 -0
  55. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/calibration/truth.py +0 -0
  56. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/calibration/value_report.py +0 -0
  57. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/checks.py +0 -0
  58. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/claude_audit_pr.py +0 -0
  59. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/claude_cli_bounce.py +0 -0
  60. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/claude_cli_environment.py +0 -0
  61. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/clear_stale.py +0 -0
  62. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/cloud.py +0 -0
  63. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/cloud_client/__init__.py +0 -0
  64. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/cloud_client/bundle.py +0 -0
  65. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/cloud_client/doctor.py +0 -0
  66. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/cloud_client/dogfood.py +0 -0
  67. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/cloud_client/endpoints.py +0 -0
  68. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/cloud_client/errors.py +0 -0
  69. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/cloud_client/events.py +0 -0
  70. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/cloud_client/git_metadata.py +0 -0
  71. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/cloud_client/manifest.py +0 -0
  72. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/cloud_client/operations.py +0 -0
  73. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/cloud_client/reports.py +0 -0
  74. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/cloud_client/setup.py +0 -0
  75. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/cloud_client/upload.py +0 -0
  76. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/code_mower_calibration.py +0 -0
  77. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/code_mower_context_packs.py +0 -0
  78. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/code_mower_merge.py +0 -0
  79. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/code_mower_telemetry.py +0 -0
  80. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/coderabbit_cli_audit_pr.py +0 -0
  81. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/codex_audit_env_preflight.py +0 -0
  82. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/codex_audit_pr.py +0 -0
  83. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/codex_audit_schema_smoke.py +0 -0
  84. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/codex_audit_verdict.schema.json +0 -0
  85. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/config.py +0 -0
  86. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/doctor.py +0 -0
  87. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/doctor_checks/__init__.py +0 -0
  88. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/doctor_checks/cloud.py +0 -0
  89. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/doctor_checks/common.py +0 -0
  90. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/doctor_checks/github.py +0 -0
  91. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/doctor_checks/github_actions.py +0 -0
  92. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/doctor_checks/github_actions_cost.py +0 -0
  93. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/doctor_checks/github_actions_cost_summary.py +0 -0
  94. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/doctor_checks/github_actions_failure_annotations.py +0 -0
  95. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/doctor_checks/github_actions_failure_models.py +0 -0
  96. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/doctor_checks/github_actions_failure_scan.py +0 -0
  97. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/doctor_checks/github_actions_failure_selection.py +0 -0
  98. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/doctor_checks/github_actions_failures.py +0 -0
  99. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/doctor_checks/github_actions_permissions.py +0 -0
  100. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/doctor_checks/github_api.py +0 -0
  101. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/doctor_checks/github_branch.py +0 -0
  102. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/doctor_checks/github_config.py +0 -0
  103. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/doctor_checks/github_provider.py +0 -0
  104. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/doctor_checks/github_repo.py +0 -0
  105. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/doctor_checks/groups.py +0 -0
  106. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/doctor_checks/models.py +0 -0
  107. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/doctor_checks/output.py +0 -0
  108. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/doctor_checks/presets.py +0 -0
  109. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/doctor_checks/privacy.py +0 -0
  110. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/doctor_checks/provider_api_model.py +0 -0
  111. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/doctor_checks/provider_api_model_openai.py +0 -0
  112. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/doctor_checks/provider_api_model_profiles.py +0 -0
  113. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/doctor_checks/provider_env.py +0 -0
  114. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/doctor_checks/provider_env_required.py +0 -0
  115. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/doctor_checks/provider_env_tokens.py +0 -0
  116. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/doctor_checks/provider_local_cli.py +0 -0
  117. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/doctor_checks/provider_local_cli_commands.py +0 -0
  118. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/doctor_checks/provider_local_cli_probe_config.py +0 -0
  119. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/doctor_checks/provider_probe.py +0 -0
  120. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/doctor_checks/provider_probe_auth.py +0 -0
  121. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/doctor_checks/provider_probe_evaluation.py +0 -0
  122. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/doctor_checks/provider_probe_json.py +0 -0
  123. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/doctor_checks/provider_probe_remediation.py +0 -0
  124. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/doctor_checks/provider_review_hygiene.py +0 -0
  125. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/doctor_checks/providers.py +0 -0
  126. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/doctor_checks/registry.py +0 -0
  127. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/doctor_checks/runner.py +0 -0
  128. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/doctor_checks/runtime.py +0 -0
  129. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/doctor_checks/runtime_github_auth.py +0 -0
  130. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/gemini_cli_audit_pr.py +0 -0
  131. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/hermes_cli_audit_pr.py +0 -0
  132. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/init.py +0 -0
  133. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/lane_configs/__init__.py +0 -0
  134. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/lane_configs/aider.py +0 -0
  135. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/lane_configs/antigravity_cli.py +0 -0
  136. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/lane_configs/claude.py +0 -0
  137. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/lane_configs/codex.py +0 -0
  138. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/lane_configs/devin.py +0 -0
  139. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/lane_configs/gemini_cli.py +0 -0
  140. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/lane_configs/hermes_cli.py +0 -0
  141. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/lane_configs/local_llm.py +0 -0
  142. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/local_llm_audit_pr.py +0 -0
  143. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/local_llm_bakeoff.py +0 -0
  144. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/local_llm_calibration.py +0 -0
  145. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/local_llm_profiles.py +0 -0
  146. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/migration.py +0 -0
  147. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/migration_install.py +0 -0
  148. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/migration_mirror.py +0 -0
  149. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/migration_readiness.py +0 -0
  150. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/migration_rehearsal.py +0 -0
  151. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/next_steps.py +0 -0
  152. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/package.py +0 -0
  153. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/package_content.py +0 -0
  154. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/package_manifest.py +0 -0
  155. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/package_paths.py +0 -0
  156. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/package_rendering.py +0 -0
  157. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/package_static.py +0 -0
  158. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/prompts.py +0 -0
  159. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/provider_runners/__init__.py +0 -0
  160. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/provider_runners/comments.py +0 -0
  161. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/provider_runners/git.py +0 -0
  162. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/provider_runners/github_auth.py +0 -0
  163. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/provider_runners/github_pr.py +0 -0
  164. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/provider_runners/pr_worktree.py +0 -0
  165. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/provider_runners/process.py +0 -0
  166. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/provider_runners/repo_paths.py +0 -0
  167. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/provider_runners/text_schema.py +0 -0
  168. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/provider_runners/verdict_artifacts.py +0 -0
  169. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/provider_runners/workspace.py +0 -0
  170. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/providers/__init__.py +0 -0
  171. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/providers/local_cli.py +0 -0
  172. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/release_readiness.py +0 -0
  173. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/reviewer_metrics.py +0 -0
  174. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/saas_reviewer_labeler.py +0 -0
  175. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/secrets.py +0 -0
  176. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/templates/builder-experiment.example.json +0 -0
  177. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/templates/calibration-corpus.example.json +0 -0
  178. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/templates/calibration-corpus.json +0 -0
  179. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/templates/context-packs.example.json +0 -0
  180. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/templates/lane_prompts/base-audit.md +0 -0
  181. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/templates/lane_prompts/calibration-policy.md +0 -0
  182. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/templates/lane_prompts/context-driven-quality.md +0 -0
  183. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/templates/lane_prompts/docs-design.md +0 -0
  184. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/templates/lane_prompts/generic-programming.md +0 -0
  185. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/templates/lane_prompts/operability.md +0 -0
  186. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/templates/lane_prompts/package-runtime.md +0 -0
  187. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/templates/lane_prompts/security-threat-model.md +0 -0
  188. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/templates/product-support/code_mower +0 -0
  189. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/templates/product-support/code_mower_standalone_pin.env +0 -0
  190. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/templates/product-support/code_mower_standalone_shadow.sh +0 -0
  191. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/templates/product-support/run_claude_audit_pr.sh +0 -0
  192. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/templates/product-support/run_codex_audit_pr.sh +0 -0
  193. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/templates/product-support/safe_gh_comment.py +0 -0
  194. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/templates/reviewer-spend.example.json +0 -0
  195. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/templates/reviewer-value-report.example.md +0 -0
  196. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/templates/workflows/audit-label-cleanup.yml.j2 +0 -0
  197. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/templates/workflows/hosted-bridge.yml.j2 +0 -0
  198. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/templates/workflows/local-cli-audit.yml.j2 +0 -0
  199. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/templates/workflows/private-standalone-shadow.yml.j2 +0 -0
  200. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/templates/workflows/review-clear-stale.yml.j2 +0 -0
  201. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/templates/workflows/saas-reviewer-labeler.yml.j2 +0 -0
  202. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/templates/workflows/trailer-comment-labeler.yml.j2 +0 -0
  203. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/trailer_comment_labeler.py +0 -0
  204. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower/versioning.py +0 -0
  205. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower.egg-info/SOURCES.txt +0 -0
  206. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower.egg-info/dependency_links.txt +0 -0
  207. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower.egg-info/entry_points.txt +0 -0
  208. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower.egg-info/requires.txt +0 -0
  209. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/src/code_mower.egg-info/top_level.txt +0 -0
  210. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/templates/builder-experiment.example.json +0 -0
  211. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/templates/calibration-corpus.example.json +0 -0
  212. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/templates/calibration-corpus.json +0 -0
  213. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/templates/code-mower.yml.j2 +0 -0
  214. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/templates/context-packs.example.json +0 -0
  215. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/templates/cursor/BUGBOT.md +0 -0
  216. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/templates/providers/acp_bridge.yml +0 -0
  217. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/templates/providers/aider.yml +0 -0
  218. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/templates/providers/antigravity_cli.yml +0 -0
  219. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/templates/providers/claude_audit.yml +0 -0
  220. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/templates/providers/claude_review.yml +0 -0
  221. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/templates/providers/coderabbit_cli.yml +0 -0
  222. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/templates/providers/codex.yml +0 -0
  223. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/templates/providers/cursor_bugbot.yml +0 -0
  224. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/templates/providers/devin.yml +0 -0
  225. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/templates/providers/gemini_cli.yml +0 -0
  226. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/templates/providers/gitar.yml +0 -0
  227. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/templates/providers/greptile.yml +0 -0
  228. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/templates/providers/hermes_cli.yml +0 -0
  229. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/templates/providers/local_llm.yml +0 -0
  230. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/templates/providers/qodo.yml +0 -0
  231. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/templates/reviewer-spend.example.json +0 -0
  232. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/templates/reviewer-value-report.example.md +0 -0
  233. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/templates/workflows/audit-label-cleanup.yml.j2 +0 -0
  234. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/templates/workflows/blind-review-artifacts-dry-run.yml.j2 +0 -0
  235. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/templates/workflows/hosted-bridge.yml.j2 +0 -0
  236. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/templates/workflows/local-cli-audit.yml.j2 +0 -0
  237. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/templates/workflows/private-standalone-shadow.yml.j2 +0 -0
  238. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/templates/workflows/review-clear-stale.yml.j2 +0 -0
  239. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/templates/workflows/saas-reviewer-labeler.yml.j2 +0 -0
  240. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/templates/workflows/trailer-comment-labeler.yml.j2 +0 -0
  241. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/tests/test_calibration_effect_report.py +0 -0
  242. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/tests/test_calibration_truth.py +0 -0
  243. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/tests/test_checks.py +0 -0
  244. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/tests/test_claude_cli_bounce.py +0 -0
  245. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/tests/test_clear_stale.py +0 -0
  246. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/tests/test_cloud_git_metadata.py +0 -0
  247. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/tests/test_cloud_manifest.py +0 -0
  248. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/tests/test_cloud_reports.py +0 -0
  249. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/tests/test_coderabbit_cli_audit_pr.py +0 -0
  250. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/tests/test_doctor_actions_cost_summary.py +0 -0
  251. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/tests/test_doctor_actions_failure_selection.py +0 -0
  252. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/tests/test_doctor_boundaries.py +0 -0
  253. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/tests/test_doctor_github_checks.py +0 -0
  254. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/tests/test_doctor_output.py +0 -0
  255. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/tests/test_doctor_privacy.py +0 -0
  256. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/tests/test_doctor_provider_env_required.py +0 -0
  257. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/tests/test_doctor_provider_env_tokens.py +0 -0
  258. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/tests/test_doctor_provider_probe.py +0 -0
  259. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/tests/test_doctor_provider_review_hygiene.py +0 -0
  260. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/tests/test_doctor_registry.py +0 -0
  261. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/tests/test_local_llm_github_helpers.py +0 -0
  262. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/tests/test_provider_runners_comments.py +0 -0
  263. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/tests/test_provider_runners_git.py +0 -0
  264. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/tests/test_provider_runners_github_pr.py +0 -0
  265. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/tests/test_provider_runners_pr_worktree.py +0 -0
  266. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/tests/test_provider_runners_process.py +0 -0
  267. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/tests/test_provider_runners_repo_paths.py +0 -0
  268. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/tests/test_provider_runners_text_schema.py +0 -0
  269. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/tests/test_provider_runners_workspace.py +0 -0
  270. {code_mower-0.5.0b20 → code_mower-0.5.0b22}/tests/test_reviewer_metrics_core.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: code-mower
3
- Version: 0.5.0b20
3
+ Version: 0.5.0b22
4
4
  Summary: Multi-reviewer AI code audit orchestration
5
5
  License-Expression: Apache-2.0
6
6
  Requires-Python: >=3.11
@@ -101,11 +101,11 @@ Code Mower currently targets Python 3.11+; Python 3.12 is recommended.
101
101
 
102
102
  ```bash
103
103
  python3.12 --version
104
- pipx install --python python3.12 code-mower==0.5.0b20
104
+ pipx install --python python3.12 code-mower==0.5.0b22
105
105
  code-mower --version
106
106
  ```
107
107
 
108
- `0.5.0b20` is a beta release. Until Code Mower publishes a stable `1.0`
108
+ `0.5.0b22` is a beta release. Until Code Mower publishes a stable `1.0`
109
109
  line, use the explicit beta version above or allow prereleases with:
110
110
 
111
111
  ```bash
@@ -148,7 +148,7 @@ First-time command map: [docs/launch-command-surface.md](docs/launch-command-sur
148
148
 
149
149
  The current PyPI beta has been rehearsed end-to-end from a clean install:
150
150
  [First-User Install Rehearsal](docs/first-user-install-rehearsal.md) records
151
- the latest 10/10 public-package readiness proof for `code-mower==0.5.0b20`.
151
+ the latest 10/10 public-package readiness proof for `code-mower==0.5.0b22`.
152
152
 
153
153
  ## Why Not Just Run Codex Or Claude Yourself?
154
154
 
@@ -253,9 +253,9 @@ best?" to "which AI builder plus reviewer loop ships best on this product?" See
253
253
 
254
254
  ## Installation Status
255
255
 
256
- The current public beta is `v0.5.0-beta.20` from
256
+ The current public beta is `v0.5.0-beta.22` from
257
257
  [codemower-ai/code-mower](https://github.com/codemower-ai/code-mower), published
258
- as `code-mower==0.5.0b20` on [PyPI](https://pypi.org/project/code-mower/).
258
+ as `code-mower==0.5.0b22` on [PyPI](https://pypi.org/project/code-mower/).
259
259
  GitHub releases remain the auditable source for tags, build artifacts, and
260
260
  release notes.
261
261
 
@@ -86,11 +86,11 @@ Code Mower currently targets Python 3.11+; Python 3.12 is recommended.
86
86
 
87
87
  ```bash
88
88
  python3.12 --version
89
- pipx install --python python3.12 code-mower==0.5.0b20
89
+ pipx install --python python3.12 code-mower==0.5.0b22
90
90
  code-mower --version
91
91
  ```
92
92
 
93
- `0.5.0b20` is a beta release. Until Code Mower publishes a stable `1.0`
93
+ `0.5.0b22` is a beta release. Until Code Mower publishes a stable `1.0`
94
94
  line, use the explicit beta version above or allow prereleases with:
95
95
 
96
96
  ```bash
@@ -133,7 +133,7 @@ First-time command map: [docs/launch-command-surface.md](docs/launch-command-sur
133
133
 
134
134
  The current PyPI beta has been rehearsed end-to-end from a clean install:
135
135
  [First-User Install Rehearsal](docs/first-user-install-rehearsal.md) records
136
- the latest 10/10 public-package readiness proof for `code-mower==0.5.0b20`.
136
+ the latest 10/10 public-package readiness proof for `code-mower==0.5.0b22`.
137
137
 
138
138
  ## Why Not Just Run Codex Or Claude Yourself?
139
139
 
@@ -238,9 +238,9 @@ best?" to "which AI builder plus reviewer loop ships best on this product?" See
238
238
 
239
239
  ## Installation Status
240
240
 
241
- The current public beta is `v0.5.0-beta.20` from
241
+ The current public beta is `v0.5.0-beta.22` from
242
242
  [codemower-ai/code-mower](https://github.com/codemower-ai/code-mower), published
243
- as `code-mower==0.5.0b20` on [PyPI](https://pypi.org/project/code-mower/).
243
+ as `code-mower==0.5.0b22` on [PyPI](https://pypi.org/project/code-mower/).
244
244
  GitHub releases remain the auditable source for tags, build artifacts, and
245
245
  release notes.
246
246
 
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "code-mower"
7
- version = "0.5.0b20"
7
+ version = "0.5.0b22"
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.0b20"
3
+ __version__ = "0.5.0b22"
@@ -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.0b20`, or run source checkouts with "
17
+ "`pipx install code-mower==0.5.0b22`, or run source checkouts with "
18
18
  "`PYTHONPATH=src python -m code_mower.cli`."
19
19
  )
20
20
 
@@ -266,7 +266,9 @@ def build_provenance_summary(events: list[dict[str, Any]]) -> dict[str, Any]:
266
266
  if not model and not model_version_raw and model_source in {"", "missing"}:
267
267
  missing_model_events += 1
268
268
  if not tool_version:
269
- missing_tool_version_events += 1
269
+ version_source = str(tool.get("version_source") or "").strip()
270
+ if version_source in {"", "missing"}:
271
+ missing_tool_version_events += 1
270
272
  key = (tool_name or "unknown", provider or "unknown", model or "")
271
273
  row = tools.setdefault(
272
274
  key,
@@ -276,6 +278,8 @@ def build_provenance_summary(events: list[dict[str, Any]]) -> dict[str, Any]:
276
278
  "model": key[2],
277
279
  "events": 0,
278
280
  "versions": set(),
281
+ "model_sources": set(),
282
+ "version_sources": set(),
279
283
  "roles": set(),
280
284
  "lenses": set(),
281
285
  },
@@ -283,6 +287,8 @@ def build_provenance_summary(events: list[dict[str, Any]]) -> dict[str, Any]:
283
287
  row["events"] += 1
284
288
  for field, target in (
285
289
  ("tool_version", "versions"),
290
+ ("model_source", "model_sources"),
291
+ ("version_source", "version_sources"),
286
292
  ("role", "roles"),
287
293
  ("lens", "lenses"),
288
294
  ):
@@ -298,6 +304,8 @@ def build_provenance_summary(events: list[dict[str, Any]]) -> dict[str, Any]:
298
304
  "model": row["model"],
299
305
  "events": row["events"],
300
306
  "versions": sorted(row["versions"]),
307
+ "model_sources": sorted(row["model_sources"]),
308
+ "version_sources": sorted(row["version_sources"]),
301
309
  "roles": sorted(row["roles"]),
302
310
  "lenses": sorted(row["lenses"]),
303
311
  }
@@ -85,6 +85,11 @@ REFERENCE_PROVIDERS: dict[str, ProviderLane] = {
85
85
  merge_authority=True,
86
86
  provider_config={
87
87
  "command": "codex",
88
+ "model_env_any": (
89
+ "CODE_MOWER_CODEX_MODEL",
90
+ "CODEX_MODEL",
91
+ "OPENAI_MODEL",
92
+ ),
88
93
  "doctor_probe_args": ("--version",),
89
94
  },
90
95
  ),
@@ -273,6 +278,7 @@ REFERENCE_PROVIDERS: dict[str, ProviderLane] = {
273
278
  provider_config={
274
279
  "api_base_env": "LOCAL_LLM_API_BASE",
275
280
  "model_env": "LOCAL_LLM_MODEL",
281
+ "model_env_any": ("CODE_MOWER_LOCAL_LLM_MODEL",),
276
282
  "bot_authors_env": "LOCAL_LLM_BOT_AUTHORS",
277
283
  "default_api_base": "http://localhost:1234/v1",
278
284
  "profile_env": "LOCAL_LLM_PROFILE",
@@ -301,6 +307,7 @@ REFERENCE_PROVIDERS: dict[str, ProviderLane] = {
301
307
  "command": "aider",
302
308
  "mode": "review-only",
303
309
  "model_env": "AIDER_MODEL",
310
+ "model_env_any": ("CODE_MOWER_AIDER_MODEL", "AIDER_CHAT_MODEL"),
304
311
  "api_base_env": "AIDER_API_BASE",
305
312
  "status": "optional tool lane; provider-specific invocation belongs in an adapter",
306
313
  },
@@ -326,6 +333,7 @@ REFERENCE_PROVIDERS: dict[str, ProviderLane] = {
326
333
  "command": "gemini",
327
334
  "command_env": "GEMINI_CLI_COMMAND",
328
335
  "model_env": "GEMINI_MODEL",
336
+ "model_env_any": ("CODE_MOWER_GEMINI_MODEL", "GOOGLE_GENAI_MODEL"),
329
337
  "prompt_lenses": ("base-audit",),
330
338
  "doctor_probe_args": (
331
339
  "-p",
@@ -362,6 +370,7 @@ REFERENCE_PROVIDERS: dict[str, ProviderLane] = {
362
370
  "alternate_commands": ("antigravity",),
363
371
  "command_env": "ANTIGRAVITY_CLI_COMMAND",
364
372
  "model_env": "ANTIGRAVITY_MODEL",
373
+ "model_env_any": ("CODE_MOWER_ANTIGRAVITY_MODEL",),
365
374
  "prompt_lenses": ("base-audit",),
366
375
  "required_env_truthy": ("ANTIGRAVITY_CLI_USE_AMBIENT_HOME",),
367
376
  "doctor_probe_args": ("--version",),
@@ -396,6 +405,7 @@ REFERENCE_PROVIDERS: dict[str, ProviderLane] = {
396
405
  "command": "hermes",
397
406
  "command_env": "HERMES_CLI_COMMAND",
398
407
  "model_env": "HERMES_INFERENCE_MODEL",
408
+ "model_env_any": ("CODE_MOWER_HERMES_MODEL", "HERMES_MODEL"),
399
409
  "provider_env": "HERMES_PROVIDER",
400
410
  "prompt_lenses": ("base-audit",),
401
411
  "required_env_truthy": ("HERMES_CLI_USE_AMBIENT_HOME",),
@@ -430,6 +440,7 @@ REFERENCE_PROVIDERS: dict[str, ProviderLane] = {
430
440
  provider_config={
431
441
  "command": "coderabbit",
432
442
  "alternate_commands": ("cr",),
443
+ "model_env_any": ("CODE_MOWER_CODERABBIT_MODEL", "CODERABBIT_MODEL"),
433
444
  "status": "optional CLI lane for local/on-demand review capture",
434
445
  },
435
446
  ),
@@ -451,6 +462,7 @@ REFERENCE_PROVIDERS: dict[str, ProviderLane] = {
451
462
  spend_policy="none",
452
463
  provider_config={
453
464
  "command_env": "CODE_MOWER_ACP_COMMAND",
465
+ "model_env": "CODE_MOWER_ACP_MODEL",
454
466
  "protocol": "agent-client-protocol",
455
467
  "prompt_lenses": ("base-audit",),
456
468
  "status": "protocol research lane; no automatic merge authority",
@@ -119,6 +119,8 @@ def build_code_mower_tool_provenance(
119
119
  "tool_name": "code-mower",
120
120
  "tool_version": version,
121
121
  "provider": "code-mower",
122
+ "model_source": "not_applicable",
123
+ "version_source": "package_version",
122
124
  "integration": source,
123
125
  "source": source,
124
126
  }
@@ -166,6 +168,21 @@ def _env_value(config: Mapping[str, Any], key: str) -> str:
166
168
  return _safe_text(os.environ.get(env_name)) if env_name else ""
167
169
 
168
170
 
171
+ def _env_value_any(config: Mapping[str, Any], key: str, any_key: str) -> str:
172
+ env_names = []
173
+ primary = _safe_text(config.get(key))
174
+ if primary:
175
+ env_names.append(primary)
176
+ for env_name in _text_values(config.get(any_key)):
177
+ if env_name not in env_names:
178
+ env_names.append(env_name)
179
+ for env_name in env_names:
180
+ value = _safe_text(os.environ.get(env_name))
181
+ if value:
182
+ return value
183
+ return ""
184
+
185
+
169
186
  def _profile_model(config: Mapping[str, Any]) -> tuple[str, str]:
170
187
  profile_env = _safe_text(config.get("profile_env"))
171
188
  profile_id = _safe_text(os.environ.get(profile_env)) if profile_env else ""
@@ -182,7 +199,7 @@ _VENDOR_HIDDEN_MODEL_DRIVERS = frozenset({"hosted_bridge", "manual", "saas_event
182
199
 
183
200
 
184
201
  def _configured_model(config: Mapping[str, Any], driver: str) -> tuple[str, str]:
185
- env_model = _env_value(config, "model_env")
202
+ env_model = _env_value_any(config, "model_env", "model_env_any")
186
203
  if env_model:
187
204
  return env_model, "env"
188
205
  profile_model, profile_id = _profile_model(config)
@@ -256,6 +273,7 @@ def build_provider_lane_tool_provenance(
256
273
  if driver == "local_cli"
257
274
  else _safe_text(_lane_value(lane, "adapter")) or provider
258
275
  )
276
+ hidden_vendor_version = driver in _VENDOR_HIDDEN_MODEL_DRIVERS
259
277
  detail: dict[str, Any] = {
260
278
  "lane_id": lane_id,
261
279
  "driver": driver,
@@ -264,7 +282,9 @@ def build_provider_lane_tool_provenance(
264
282
  "model_known": bool(model),
265
283
  "model_source": model_source,
266
284
  "version_known": False,
267
- "version_source": "not_probed" if driver != "local_cli" else "missing",
285
+ "version_source": "vendor_hidden"
286
+ if hidden_vendor_version
287
+ else ("not_applicable" if driver == "api_model" else "missing"),
268
288
  }
269
289
  tool_version = ""
270
290
  if driver == "local_cli" and include_version_probe and command:
@@ -24,6 +24,10 @@ lanes:
24
24
  - GITHUB_TOKEN
25
25
  provider_config:
26
26
  command: codex
27
+ model_env_any:
28
+ - CODE_MOWER_CODEX_MODEL
29
+ - CODEX_MODEL
30
+ - OPENAI_MODEL
27
31
  doctor_probe_args:
28
32
  - --version
29
33
  review_hygiene:
@@ -207,6 +211,8 @@ lanes:
207
211
  provider_config:
208
212
  api_base_env: LOCAL_LLM_API_BASE
209
213
  model_env: LOCAL_LLM_MODEL
214
+ model_env_any:
215
+ - CODE_MOWER_LOCAL_LLM_MODEL
210
216
  bot_authors_env: LOCAL_LLM_BOT_AUTHORS
211
217
  default_api_base: http://localhost:1234/v1
212
218
  profile_env: LOCAL_LLM_PROFILE
@@ -242,6 +248,9 @@ lanes:
242
248
  command: aider
243
249
  mode: review-only
244
250
  model_env: AIDER_MODEL
251
+ model_env_any:
252
+ - CODE_MOWER_AIDER_MODEL
253
+ - AIDER_CHAT_MODEL
245
254
  api_base_env: AIDER_API_BASE
246
255
  status: optional tool lane; provider-specific invocation belongs in an adapter
247
256
 
@@ -264,6 +273,9 @@ lanes:
264
273
  command: gemini
265
274
  command_env: GEMINI_CLI_COMMAND
266
275
  model_env: GEMINI_MODEL
276
+ model_env_any:
277
+ - CODE_MOWER_GEMINI_MODEL
278
+ - GOOGLE_GENAI_MODEL
267
279
  prompt_lenses:
268
280
  - base-audit
269
281
  doctor_probe_args:
@@ -298,6 +310,8 @@ lanes:
298
310
  - antigravity
299
311
  command_env: ANTIGRAVITY_CLI_COMMAND
300
312
  model_env: ANTIGRAVITY_MODEL
313
+ model_env_any:
314
+ - CODE_MOWER_ANTIGRAVITY_MODEL
301
315
  prompt_lenses:
302
316
  - base-audit
303
317
  required_env_truthy:
@@ -325,6 +339,9 @@ lanes:
325
339
  command: hermes
326
340
  command_env: HERMES_CLI_COMMAND
327
341
  model_env: HERMES_INFERENCE_MODEL
342
+ model_env_any:
343
+ - CODE_MOWER_HERMES_MODEL
344
+ - HERMES_MODEL
328
345
  provider_env: HERMES_PROVIDER
329
346
  prompt_lenses:
330
347
  - base-audit
@@ -353,6 +370,9 @@ lanes:
353
370
  command: coderabbit
354
371
  alternate_commands:
355
372
  - cr
373
+ model_env_any:
374
+ - CODE_MOWER_CODERABBIT_MODEL
375
+ - CODERABBIT_MODEL
356
376
  status: optional CLI lane for local/on-demand review capture
357
377
 
358
378
  acp_bridge:
@@ -371,6 +391,7 @@ lanes:
371
391
  - GITHUB_TOKEN
372
392
  provider_config:
373
393
  command_env: CODE_MOWER_ACP_COMMAND
394
+ model_env: CODE_MOWER_ACP_MODEL
374
395
  protocol: agent-client-protocol
375
396
  prompt_lenses:
376
397
  - base-audit
@@ -17,6 +17,7 @@ provider_templates:
17
17
  trigger_policy: "manual"
18
18
  provider_config:
19
19
  command_env: "CODE_MOWER_ACP_COMMAND"
20
+ model_env: "CODE_MOWER_ACP_MODEL"
20
21
  protocol: "agent-client-protocol"
21
22
  prompt_lenses:
22
23
  - "base-audit"
@@ -42,6 +43,9 @@ provider_templates:
42
43
  command: "aider"
43
44
  mode: "review-only"
44
45
  model_env: "AIDER_MODEL"
46
+ model_env_any:
47
+ - "CODE_MOWER_AIDER_MODEL"
48
+ - "AIDER_CHAT_MODEL"
45
49
  api_base_env: "AIDER_API_BASE"
46
50
  status: "optional tool lane; provider-specific invocation belongs in an adapter"
47
51
  review_hygiene: {}
@@ -66,6 +70,8 @@ provider_templates:
66
70
  - "antigravity"
67
71
  command_env: "ANTIGRAVITY_CLI_COMMAND"
68
72
  model_env: "ANTIGRAVITY_MODEL"
73
+ model_env_any:
74
+ - "CODE_MOWER_ANTIGRAVITY_MODEL"
69
75
  prompt_lenses:
70
76
  - "base-audit"
71
77
  required_env_truthy:
@@ -161,6 +167,9 @@ provider_templates:
161
167
  command: "coderabbit"
162
168
  alternate_commands:
163
169
  - "cr"
170
+ model_env_any:
171
+ - "CODE_MOWER_CODERABBIT_MODEL"
172
+ - "CODERABBIT_MODEL"
164
173
  status: "optional CLI lane for local/on-demand review capture"
165
174
  review_hygiene: {}
166
175
  codex:
@@ -181,6 +190,10 @@ provider_templates:
181
190
  trigger_policy: "label"
182
191
  provider_config:
183
192
  command: "codex"
193
+ model_env_any:
194
+ - "CODE_MOWER_CODEX_MODEL"
195
+ - "CODEX_MODEL"
196
+ - "OPENAI_MODEL"
184
197
  doctor_probe_args:
185
198
  - "--version"
186
199
  review_hygiene:
@@ -253,6 +266,9 @@ provider_templates:
253
266
  command: "gemini"
254
267
  command_env: "GEMINI_CLI_COMMAND"
255
268
  model_env: "GEMINI_MODEL"
269
+ model_env_any:
270
+ - "CODE_MOWER_GEMINI_MODEL"
271
+ - "GOOGLE_GENAI_MODEL"
256
272
  prompt_lenses:
257
273
  - "base-audit"
258
274
  doctor_probe_args:
@@ -335,6 +351,9 @@ provider_templates:
335
351
  command: "hermes"
336
352
  command_env: "HERMES_CLI_COMMAND"
337
353
  model_env: "HERMES_INFERENCE_MODEL"
354
+ model_env_any:
355
+ - "CODE_MOWER_HERMES_MODEL"
356
+ - "HERMES_MODEL"
338
357
  provider_env: "HERMES_PROVIDER"
339
358
  prompt_lenses:
340
359
  - "base-audit"
@@ -365,6 +384,8 @@ provider_templates:
365
384
  provider_config:
366
385
  api_base_env: "LOCAL_LLM_API_BASE"
367
386
  model_env: "LOCAL_LLM_MODEL"
387
+ model_env_any:
388
+ - "CODE_MOWER_LOCAL_LLM_MODEL"
368
389
  bot_authors_env: "LOCAL_LLM_BOT_AUTHORS"
369
390
  default_api_base: "http://localhost:1234/v1"
370
391
  profile_env: "LOCAL_LLM_PROFILE"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: code-mower
3
- Version: 0.5.0b20
3
+ Version: 0.5.0b22
4
4
  Summary: Multi-reviewer AI code audit orchestration
5
5
  License-Expression: Apache-2.0
6
6
  Requires-Python: >=3.11
@@ -101,11 +101,11 @@ Code Mower currently targets Python 3.11+; Python 3.12 is recommended.
101
101
 
102
102
  ```bash
103
103
  python3.12 --version
104
- pipx install --python python3.12 code-mower==0.5.0b20
104
+ pipx install --python python3.12 code-mower==0.5.0b22
105
105
  code-mower --version
106
106
  ```
107
107
 
108
- `0.5.0b20` is a beta release. Until Code Mower publishes a stable `1.0`
108
+ `0.5.0b22` is a beta release. Until Code Mower publishes a stable `1.0`
109
109
  line, use the explicit beta version above or allow prereleases with:
110
110
 
111
111
  ```bash
@@ -148,7 +148,7 @@ First-time command map: [docs/launch-command-surface.md](docs/launch-command-sur
148
148
 
149
149
  The current PyPI beta has been rehearsed end-to-end from a clean install:
150
150
  [First-User Install Rehearsal](docs/first-user-install-rehearsal.md) records
151
- the latest 10/10 public-package readiness proof for `code-mower==0.5.0b20`.
151
+ the latest 10/10 public-package readiness proof for `code-mower==0.5.0b22`.
152
152
 
153
153
  ## Why Not Just Run Codex Or Claude Yourself?
154
154
 
@@ -253,9 +253,9 @@ best?" to "which AI builder plus reviewer loop ships best on this product?" See
253
253
 
254
254
  ## Installation Status
255
255
 
256
- The current public beta is `v0.5.0-beta.20` from
256
+ The current public beta is `v0.5.0-beta.22` from
257
257
  [codemower-ai/code-mower](https://github.com/codemower-ai/code-mower), published
258
- as `code-mower==0.5.0b20` on [PyPI](https://pypi.org/project/code-mower/).
258
+ as `code-mower==0.5.0b22` on [PyPI](https://pypi.org/project/code-mower/).
259
259
  GitHub releases remain the auditable source for tags, build artifacts, and
260
260
  release notes.
261
261
 
@@ -17,6 +17,7 @@ provider_templates:
17
17
  trigger_policy: "manual"
18
18
  provider_config:
19
19
  command_env: "CODE_MOWER_ACP_COMMAND"
20
+ model_env: "CODE_MOWER_ACP_MODEL"
20
21
  protocol: "agent-client-protocol"
21
22
  prompt_lenses:
22
23
  - "base-audit"
@@ -42,6 +43,9 @@ provider_templates:
42
43
  command: "aider"
43
44
  mode: "review-only"
44
45
  model_env: "AIDER_MODEL"
46
+ model_env_any:
47
+ - "CODE_MOWER_AIDER_MODEL"
48
+ - "AIDER_CHAT_MODEL"
45
49
  api_base_env: "AIDER_API_BASE"
46
50
  status: "optional tool lane; provider-specific invocation belongs in an adapter"
47
51
  review_hygiene: {}
@@ -66,6 +70,8 @@ provider_templates:
66
70
  - "antigravity"
67
71
  command_env: "ANTIGRAVITY_CLI_COMMAND"
68
72
  model_env: "ANTIGRAVITY_MODEL"
73
+ model_env_any:
74
+ - "CODE_MOWER_ANTIGRAVITY_MODEL"
69
75
  prompt_lenses:
70
76
  - "base-audit"
71
77
  required_env_truthy:
@@ -161,6 +167,9 @@ provider_templates:
161
167
  command: "coderabbit"
162
168
  alternate_commands:
163
169
  - "cr"
170
+ model_env_any:
171
+ - "CODE_MOWER_CODERABBIT_MODEL"
172
+ - "CODERABBIT_MODEL"
164
173
  status: "optional CLI lane for local/on-demand review capture"
165
174
  review_hygiene: {}
166
175
  codex:
@@ -181,6 +190,10 @@ provider_templates:
181
190
  trigger_policy: "label"
182
191
  provider_config:
183
192
  command: "codex"
193
+ model_env_any:
194
+ - "CODE_MOWER_CODEX_MODEL"
195
+ - "CODEX_MODEL"
196
+ - "OPENAI_MODEL"
184
197
  doctor_probe_args:
185
198
  - "--version"
186
199
  review_hygiene:
@@ -253,6 +266,9 @@ provider_templates:
253
266
  command: "gemini"
254
267
  command_env: "GEMINI_CLI_COMMAND"
255
268
  model_env: "GEMINI_MODEL"
269
+ model_env_any:
270
+ - "CODE_MOWER_GEMINI_MODEL"
271
+ - "GOOGLE_GENAI_MODEL"
256
272
  prompt_lenses:
257
273
  - "base-audit"
258
274
  doctor_probe_args:
@@ -335,6 +351,9 @@ provider_templates:
335
351
  command: "hermes"
336
352
  command_env: "HERMES_CLI_COMMAND"
337
353
  model_env: "HERMES_INFERENCE_MODEL"
354
+ model_env_any:
355
+ - "CODE_MOWER_HERMES_MODEL"
356
+ - "HERMES_MODEL"
338
357
  provider_env: "HERMES_PROVIDER"
339
358
  prompt_lenses:
340
359
  - "base-audit"
@@ -365,6 +384,8 @@ provider_templates:
365
384
  provider_config:
366
385
  api_base_env: "LOCAL_LLM_API_BASE"
367
386
  model_env: "LOCAL_LLM_MODEL"
387
+ model_env_any:
388
+ - "CODE_MOWER_LOCAL_LLM_MODEL"
368
389
  bot_authors_env: "LOCAL_LLM_BOT_AUTHORS"
369
390
  default_api_base: "http://localhost:1234/v1"
370
391
  profile_env: "LOCAL_LLM_PROFILE"
@@ -277,6 +277,71 @@ def test_provenance_summary_treats_vendor_hidden_model_as_known_source() -> None
277
277
 
278
278
  assert summary["events_with_model_provenance"] == 1
279
279
  assert summary["events_missing_model_provenance"] == 0
280
+ assert summary["events_with_tool_version_provenance"] == 1
281
+ assert summary["events_missing_tool_version_provenance"] == 0
282
+ assert summary["tools"][0]["model_sources"] == ["vendor_hidden"]
283
+ assert summary["tools"][0]["version_sources"] == ["not_probed"]
284
+
285
+
286
+ def test_provenance_summary_preserves_source_quality_fields() -> None:
287
+ summary = build_provenance_summary(
288
+ [
289
+ normalize_event(
290
+ {
291
+ "schema": EVENT_SCHEMA,
292
+ "event_id": "evt-code-mower",
293
+ "event_type": "dogfood_upload",
294
+ "created_at": "2026-01-01T00:00:00Z",
295
+ "repo_slug": "owner/repo",
296
+ "team_id": "team",
297
+ "install_id": "install",
298
+ "source": "unit-test",
299
+ "tool": {
300
+ "role": "reporter",
301
+ "tool_name": "code-mower",
302
+ "tool_version": "0.5.0b22",
303
+ "provider": "code-mower",
304
+ "model": "",
305
+ "model_source": "not_applicable",
306
+ "version_source": "package_version",
307
+ },
308
+ },
309
+ "dogfood_upload",
310
+ ),
311
+ normalize_event(
312
+ {
313
+ "schema": EVENT_SCHEMA,
314
+ "event_id": "evt-gemini",
315
+ "event_type": "provider_catalog_snapshot",
316
+ "created_at": "2026-01-01T00:00:00Z",
317
+ "repo_slug": "owner/repo",
318
+ "team_id": "team",
319
+ "install_id": "install",
320
+ "source": "unit-test",
321
+ "tool": {
322
+ "role": "reviewer",
323
+ "tool_name": "gemini",
324
+ "tool_version": "0.45.2",
325
+ "provider": "gemini",
326
+ "model": "",
327
+ "model_source": "missing",
328
+ "version_source": "cli_version_probe",
329
+ },
330
+ },
331
+ "provider_catalog_snapshot",
332
+ ),
333
+ ]
334
+ )
335
+
336
+ assert summary["events_with_model_provenance"] == 1
337
+ assert summary["events_missing_model_provenance"] == 1
338
+ assert summary["events_with_tool_version_provenance"] == 2
339
+ assert summary["events_missing_tool_version_provenance"] == 0
340
+ rows = {row["tool_name"]: row for row in summary["tools"]}
341
+ assert rows["code-mower"]["model_sources"] == ["not_applicable"]
342
+ assert rows["code-mower"]["version_sources"] == ["package_version"]
343
+ assert rows["gemini"]["model_sources"] == ["missing"]
344
+ assert rows["gemini"]["version_sources"] == ["cli_version_probe"]
280
345
 
281
346
 
282
347
  def test_dogfood_dry_run_preserves_version_probe(monkeypatch, tmp_path: Path) -> None: