code-mower 1.1.1__tar.gz → 1.1.2__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 (431) hide show
  1. {code_mower-1.1.1 → code_mower-1.1.2}/PKG-INFO +6 -5
  2. {code_mower-1.1.1 → code_mower-1.1.2}/README.md +5 -4
  3. {code_mower-1.1.1 → code_mower-1.1.2}/pyproject.toml +1 -1
  4. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/__init__.py +1 -1
  5. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/jira_cloud.py +41 -15
  6. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/templates/workflows/builder-provenance.yml.j2 +1 -1
  7. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/tracker_queue.py +11 -4
  8. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower.egg-info/PKG-INFO +6 -5
  9. {code_mower-1.1.1 → code_mower-1.1.2}/templates/workflows/builder-provenance.yml.j2 +1 -1
  10. {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_jira_cloud.py +38 -0
  11. {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_release_hygiene.py +44 -44
  12. {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_tracker_queue.py +10 -5
  13. {code_mower-1.1.1 → code_mower-1.1.2}/CODE_OF_CONDUCT.md +0 -0
  14. {code_mower-1.1.1 → code_mower-1.1.2}/LICENSE +0 -0
  15. {code_mower-1.1.1 → code_mower-1.1.2}/MANIFEST.in +0 -0
  16. {code_mower-1.1.1 → code_mower-1.1.2}/NOTICE +0 -0
  17. {code_mower-1.1.1 → code_mower-1.1.2}/SUPPORT.md +0 -0
  18. {code_mower-1.1.1 → code_mower-1.1.2}/requirements/requirements.txt +0 -0
  19. {code_mower-1.1.1 → code_mower-1.1.2}/setup.cfg +0 -0
  20. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/adapters/__init__.py +0 -0
  21. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/adapters/_base.py +0 -0
  22. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/adapters/cursor_bugbot.py +0 -0
  23. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/adapters/gitar.py +0 -0
  24. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/adapters/greptile.py +0 -0
  25. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/adapters/qodo.py +0 -0
  26. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/antigravity_cli_audit_pr.py +0 -0
  27. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/antigravity_sdk_probe.py +0 -0
  28. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/audit_handoff_log.py +0 -0
  29. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/audit_labeler_lib.py +0 -0
  30. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/audit_limits.py +0 -0
  31. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/audit_progress.py +0 -0
  32. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/blind_review_artifacts.py +0 -0
  33. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/blind_review_coordinator.py +0 -0
  34. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/board.py +0 -0
  35. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/board_store.py +0 -0
  36. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/bootstrap.py +0 -0
  37. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/builder_experiment.py +0 -0
  38. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/builder_runs.py +0 -0
  39. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/calibration/__init__.py +0 -0
  40. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/calibration/arms.py +0 -0
  41. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/calibration/auto_discovery.py +0 -0
  42. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/calibration/commands.py +0 -0
  43. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/calibration/context_inputs.py +0 -0
  44. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/calibration/corpus.py +0 -0
  45. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/calibration/effect_report.py +0 -0
  46. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/calibration/evidence.py +0 -0
  47. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/calibration/evidence_report.py +0 -0
  48. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/calibration/identity.py +0 -0
  49. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/calibration/metrics.py +0 -0
  50. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/calibration/overlap.py +0 -0
  51. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/calibration/planning.py +0 -0
  52. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/calibration/policy.py +0 -0
  53. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/calibration/results.py +0 -0
  54. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/calibration/run_results.py +0 -0
  55. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/calibration/run_status.py +0 -0
  56. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/calibration/runner.py +0 -0
  57. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/calibration/truth.py +0 -0
  58. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/calibration/value_report.py +0 -0
  59. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/campaign_adapters.py +0 -0
  60. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/campaign_discovery.py +0 -0
  61. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/checks.py +0 -0
  62. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/claude_audit_pr.py +0 -0
  63. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/claude_cli_bounce.py +0 -0
  64. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/claude_cli_environment.py +0 -0
  65. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/clear_stale.py +0 -0
  66. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/cli.py +0 -0
  67. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/cloud.py +0 -0
  68. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/cloud_client/__init__.py +0 -0
  69. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/cloud_client/adoption_runs.py +0 -0
  70. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/cloud_client/bundle.py +0 -0
  71. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/cloud_client/doctor.py +0 -0
  72. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/cloud_client/dogfood.py +0 -0
  73. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/cloud_client/endpoints.py +0 -0
  74. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/cloud_client/errors.py +0 -0
  75. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/cloud_client/events.py +0 -0
  76. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/cloud_client/export.py +0 -0
  77. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/cloud_client/finding_outcomes.py +0 -0
  78. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/cloud_client/git_metadata.py +0 -0
  79. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/cloud_client/manifest.py +0 -0
  80. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/cloud_client/operations.py +0 -0
  81. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/cloud_client/pr_outcomes.py +0 -0
  82. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/cloud_client/productivity.py +0 -0
  83. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/cloud_client/productivity_windows.py +0 -0
  84. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/cloud_client/reports.py +0 -0
  85. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/cloud_client/setup.py +0 -0
  86. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/cloud_client/tokens.py +0 -0
  87. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/cloud_client/upload.py +0 -0
  88. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/cloud_client/work_types.py +0 -0
  89. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/code_mower_calibration.py +0 -0
  90. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/code_mower_context_packs.py +0 -0
  91. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/code_mower_merge.py +0 -0
  92. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/code_mower_telemetry.py +0 -0
  93. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/coderabbit_cli_audit_pr.py +0 -0
  94. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/codex_audit_env_preflight.py +0 -0
  95. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/codex_audit_pr.py +0 -0
  96. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/codex_audit_schema_smoke.py +0 -0
  97. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/codex_audit_verdict.schema.json +0 -0
  98. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/config.py +0 -0
  99. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/controller.py +0 -0
  100. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/decisions.py +0 -0
  101. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/devin_api.py +0 -0
  102. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/devin_cli_audit_pr.py +0 -0
  103. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/doctor.py +0 -0
  104. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/doctor_checks/__init__.py +0 -0
  105. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/doctor_checks/adoption.py +0 -0
  106. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/doctor_checks/audit_limits.py +0 -0
  107. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/doctor_checks/campaign_auth.py +0 -0
  108. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/doctor_checks/cloud.py +0 -0
  109. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/doctor_checks/common.py +0 -0
  110. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/doctor_checks/github.py +0 -0
  111. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/doctor_checks/github_actions.py +0 -0
  112. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/doctor_checks/github_actions_cost.py +0 -0
  113. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/doctor_checks/github_actions_cost_summary.py +0 -0
  114. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/doctor_checks/github_actions_failure_annotations.py +0 -0
  115. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/doctor_checks/github_actions_failure_models.py +0 -0
  116. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/doctor_checks/github_actions_failure_scan.py +0 -0
  117. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/doctor_checks/github_actions_failure_selection.py +0 -0
  118. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/doctor_checks/github_actions_failures.py +0 -0
  119. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/doctor_checks/github_actions_permissions.py +0 -0
  120. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/doctor_checks/github_api.py +0 -0
  121. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/doctor_checks/github_branch.py +0 -0
  122. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/doctor_checks/github_config.py +0 -0
  123. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/doctor_checks/github_human_token.py +0 -0
  124. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/doctor_checks/github_provider.py +0 -0
  125. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/doctor_checks/github_repo.py +0 -0
  126. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/doctor_checks/github_trusted_authors.py +0 -0
  127. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/doctor_checks/groups.py +0 -0
  128. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/doctor_checks/jira.py +0 -0
  129. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/doctor_checks/models.py +0 -0
  130. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/doctor_checks/output.py +0 -0
  131. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/doctor_checks/presets.py +0 -0
  132. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/doctor_checks/privacy.py +0 -0
  133. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/doctor_checks/provider_api_model.py +0 -0
  134. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/doctor_checks/provider_api_model_openai.py +0 -0
  135. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/doctor_checks/provider_api_model_profiles.py +0 -0
  136. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/doctor_checks/provider_env.py +0 -0
  137. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/doctor_checks/provider_env_required.py +0 -0
  138. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/doctor_checks/provider_env_tokens.py +0 -0
  139. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/doctor_checks/provider_local_audit_setup.py +0 -0
  140. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/doctor_checks/provider_local_cli.py +0 -0
  141. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/doctor_checks/provider_local_cli_commands.py +0 -0
  142. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/doctor_checks/provider_local_cli_probe_config.py +0 -0
  143. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/doctor_checks/provider_probe.py +0 -0
  144. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/doctor_checks/provider_probe_auth.py +0 -0
  145. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/doctor_checks/provider_probe_evaluation.py +0 -0
  146. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/doctor_checks/provider_probe_json.py +0 -0
  147. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/doctor_checks/provider_probe_remediation.py +0 -0
  148. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/doctor_checks/provider_review_hygiene.py +0 -0
  149. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/doctor_checks/providers.py +0 -0
  150. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/doctor_checks/registry.py +0 -0
  151. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/doctor_checks/runner.py +0 -0
  152. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/doctor_checks/runtime.py +0 -0
  153. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/doctor_checks/runtime_github_auth.py +0 -0
  154. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/doctor_checks/self_hosted_runner.py +0 -0
  155. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/doctor_checks/supervised_pilot.py +0 -0
  156. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/file_locks.py +0 -0
  157. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/gate_health.py +0 -0
  158. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/gemini_cli_audit_pr.py +0 -0
  159. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/git_identity.py +0 -0
  160. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/grok_build_audit_pr.py +0 -0
  161. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/hermes_cli_audit_pr.py +0 -0
  162. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/init.py +0 -0
  163. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/jira_mutations.py +0 -0
  164. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/jira_pr_sync.py +0 -0
  165. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/lane_configs/__init__.py +0 -0
  166. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/lane_configs/aider.py +0 -0
  167. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/lane_configs/antigravity_cli.py +0 -0
  168. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/lane_configs/claude.py +0 -0
  169. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/lane_configs/codex.py +0 -0
  170. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/lane_configs/devin.py +0 -0
  171. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/lane_configs/devin_cli.py +0 -0
  172. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/lane_configs/gemini_cli.py +0 -0
  173. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/lane_configs/grok_build.py +0 -0
  174. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/lane_configs/hermes_cli.py +0 -0
  175. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/lane_configs/local_llm.py +0 -0
  176. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/lane_configs/muse_cli.py +0 -0
  177. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/lane_delivery.py +0 -0
  178. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/lane_status.py +0 -0
  179. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/local_llm_audit_pr.py +0 -0
  180. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/local_llm_bakeoff.py +0 -0
  181. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/local_llm_calibration.py +0 -0
  182. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/local_llm_profiles.py +0 -0
  183. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/migration.py +0 -0
  184. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/migration_install.py +0 -0
  185. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/migration_mirror.py +0 -0
  186. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/migration_readiness.py +0 -0
  187. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/migration_rehearsal.py +0 -0
  188. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/muse_cli_audit_pr.py +0 -0
  189. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/next_steps.py +0 -0
  190. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/package.py +0 -0
  191. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/package_content.py +0 -0
  192. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/package_manifest.py +0 -0
  193. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/package_paths.py +0 -0
  194. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/package_rendering.py +0 -0
  195. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/package_static.py +0 -0
  196. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/participants.py +0 -0
  197. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/plan_context.py +0 -0
  198. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/productivity_report.py +0 -0
  199. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/prompts.py +0 -0
  200. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/provider_credentials.py +0 -0
  201. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/provider_registry.py +0 -0
  202. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/provider_runners/__init__.py +0 -0
  203. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/provider_runners/comments.py +0 -0
  204. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/provider_runners/exit_codes.py +0 -0
  205. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/provider_runners/git.py +0 -0
  206. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/provider_runners/github_auth.py +0 -0
  207. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/provider_runners/github_pr.py +0 -0
  208. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/provider_runners/pr_worktree.py +0 -0
  209. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/provider_runners/process.py +0 -0
  210. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/provider_runners/repo_paths.py +0 -0
  211. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/provider_runners/text_schema.py +0 -0
  212. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/provider_runners/verdict_artifacts.py +0 -0
  213. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/provider_runners/workspace.py +0 -0
  214. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/providers/__init__.py +0 -0
  215. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/providers/local_cli.py +0 -0
  216. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/providers/provenance.py +0 -0
  217. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/release_campaigns.py +0 -0
  218. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/release_qualify.py +0 -0
  219. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/release_readiness.py +0 -0
  220. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/reviewer_metrics.py +0 -0
  221. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/reviewer_spend.py +0 -0
  222. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/saas_reviewer_labeler.py +0 -0
  223. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/secrets.py +0 -0
  224. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/session.py +0 -0
  225. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/templates/builder-experiment.example.json +0 -0
  226. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/templates/calibration-corpus.example.json +0 -0
  227. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/templates/calibration-corpus.json +0 -0
  228. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/templates/code-mower.example.yml +0 -0
  229. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/templates/context-packs.example.json +0 -0
  230. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/templates/lane_prompts/base-audit.md +0 -0
  231. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/templates/lane_prompts/calibration-policy.md +0 -0
  232. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/templates/lane_prompts/context-driven-quality.md +0 -0
  233. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/templates/lane_prompts/docs-design.md +0 -0
  234. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/templates/lane_prompts/generic-programming.md +0 -0
  235. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/templates/lane_prompts/operability.md +0 -0
  236. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/templates/lane_prompts/package-runtime.md +0 -0
  237. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/templates/lane_prompts/plan-conformance.md +0 -0
  238. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/templates/lane_prompts/security-threat-model.md +0 -0
  239. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/templates/lanes/README.md +0 -0
  240. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/templates/lanes/claude.md +0 -0
  241. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/templates/lanes/codex.md +0 -0
  242. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/templates/lanes/cursor.md +0 -0
  243. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/templates/lanes/devin.md +0 -0
  244. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/templates/lanes/generic.md +0 -0
  245. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/templates/lanes/run_mac_lane.sh +0 -0
  246. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/templates/product-support/code_mower +0 -0
  247. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/templates/product-support/code_mower_standalone_pin.env +0 -0
  248. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/templates/product-support/code_mower_standalone_shadow.sh +0 -0
  249. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/templates/product-support/run_claude_audit_pr.sh +0 -0
  250. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/templates/product-support/run_codex_audit_pr.sh +0 -0
  251. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/templates/product-support/run_devin_cli_audit_pr.sh +0 -0
  252. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/templates/product-support/safe_gh_comment.py +0 -0
  253. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/templates/product-support/status_report.py +0 -0
  254. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/templates/providers.yml +0 -0
  255. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/templates/reviewer-spend.example.json +0 -0
  256. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/templates/reviewer-value-report.example.md +0 -0
  257. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/templates/workflows/audit-label-cleanup.yml.j2 +0 -0
  258. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/templates/workflows/code-mower-agent-pr-labeler.yml.j2 +0 -0
  259. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/templates/workflows/code-mower-fix-round-dispatch.yml.j2 +0 -0
  260. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/templates/workflows/code-mower-gate-health.yml.j2 +0 -0
  261. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/templates/workflows/code-mower-gate.yml.j2 +0 -0
  262. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/templates/workflows/dispatch-lanes.yml.j2 +0 -0
  263. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/templates/workflows/hosted-bridge.yml.j2 +0 -0
  264. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/templates/workflows/lane-mac-runner.yml.j2 +0 -0
  265. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/templates/workflows/local-cli-audit.yml.j2 +0 -0
  266. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/templates/workflows/needs-owner-notify.yml.j2 +0 -0
  267. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/templates/workflows/private-standalone-shadow.yml.j2 +0 -0
  268. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/templates/workflows/review-clear-stale.yml.j2 +0 -0
  269. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/templates/workflows/saas-reviewer-labeler.yml.j2 +0 -0
  270. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/templates/workflows/self-hosted-local-audit.yml.j2 +0 -0
  271. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/templates/workflows/trailer-comment-labeler.yml.j2 +0 -0
  272. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/templates/workflows/weekly-status.yml.j2 +0 -0
  273. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/tracker_contract.py +0 -0
  274. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/trailer_comment_labeler.py +0 -0
  275. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/versioning.py +0 -0
  276. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/work_orders.py +0 -0
  277. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/workflow_actionlint.py +0 -0
  278. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower.egg-info/SOURCES.txt +0 -0
  279. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower.egg-info/dependency_links.txt +0 -0
  280. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower.egg-info/entry_points.txt +0 -0
  281. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower.egg-info/requires.txt +0 -0
  282. {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower.egg-info/top_level.txt +0 -0
  283. {code_mower-1.1.1 → code_mower-1.1.2}/templates/builder-experiment.example.json +0 -0
  284. {code_mower-1.1.1 → code_mower-1.1.2}/templates/calibration-corpus.example.json +0 -0
  285. {code_mower-1.1.1 → code_mower-1.1.2}/templates/calibration-corpus.json +0 -0
  286. {code_mower-1.1.1 → code_mower-1.1.2}/templates/code-mower.yml.j2 +0 -0
  287. {code_mower-1.1.1 → code_mower-1.1.2}/templates/context-packs.example.json +0 -0
  288. {code_mower-1.1.1 → code_mower-1.1.2}/templates/cursor/BUGBOT.md +0 -0
  289. {code_mower-1.1.1 → code_mower-1.1.2}/templates/lanes/README.md +0 -0
  290. {code_mower-1.1.1 → code_mower-1.1.2}/templates/lanes/claude.md +0 -0
  291. {code_mower-1.1.1 → code_mower-1.1.2}/templates/lanes/codex.md +0 -0
  292. {code_mower-1.1.1 → code_mower-1.1.2}/templates/lanes/cursor.md +0 -0
  293. {code_mower-1.1.1 → code_mower-1.1.2}/templates/lanes/devin.md +0 -0
  294. {code_mower-1.1.1 → code_mower-1.1.2}/templates/lanes/generic.md +0 -0
  295. {code_mower-1.1.1 → code_mower-1.1.2}/templates/lanes/run_mac_lane.sh +0 -0
  296. {code_mower-1.1.1 → code_mower-1.1.2}/templates/providers/acp_bridge.yml +0 -0
  297. {code_mower-1.1.1 → code_mower-1.1.2}/templates/providers/aider.yml +0 -0
  298. {code_mower-1.1.1 → code_mower-1.1.2}/templates/providers/antigravity_cli.yml +0 -0
  299. {code_mower-1.1.1 → code_mower-1.1.2}/templates/providers/claude_audit.yml +0 -0
  300. {code_mower-1.1.1 → code_mower-1.1.2}/templates/providers/claude_review.yml +0 -0
  301. {code_mower-1.1.1 → code_mower-1.1.2}/templates/providers/coderabbit_cli.yml +0 -0
  302. {code_mower-1.1.1 → code_mower-1.1.2}/templates/providers/codex.yml +0 -0
  303. {code_mower-1.1.1 → code_mower-1.1.2}/templates/providers/cursor_bugbot.yml +0 -0
  304. {code_mower-1.1.1 → code_mower-1.1.2}/templates/providers/cursor_cloud_agent.yml +0 -0
  305. {code_mower-1.1.1 → code_mower-1.1.2}/templates/providers/devin.yml +0 -0
  306. {code_mower-1.1.1 → code_mower-1.1.2}/templates/providers/devin_cli.yml +0 -0
  307. {code_mower-1.1.1 → code_mower-1.1.2}/templates/providers/gemini_cli.yml +0 -0
  308. {code_mower-1.1.1 → code_mower-1.1.2}/templates/providers/gitar.yml +0 -0
  309. {code_mower-1.1.1 → code_mower-1.1.2}/templates/providers/greptile.yml +0 -0
  310. {code_mower-1.1.1 → code_mower-1.1.2}/templates/providers/hermes_cli.yml +0 -0
  311. {code_mower-1.1.1 → code_mower-1.1.2}/templates/providers/local_llm.yml +0 -0
  312. {code_mower-1.1.1 → code_mower-1.1.2}/templates/providers/muse_cli.yml +0 -0
  313. {code_mower-1.1.1 → code_mower-1.1.2}/templates/providers/qodo.yml +0 -0
  314. {code_mower-1.1.1 → code_mower-1.1.2}/templates/providers.yml +0 -0
  315. {code_mower-1.1.1 → code_mower-1.1.2}/templates/reviewer-spend.example.json +0 -0
  316. {code_mower-1.1.1 → code_mower-1.1.2}/templates/reviewer-value-report.example.md +0 -0
  317. {code_mower-1.1.1 → code_mower-1.1.2}/templates/workflows/audit-label-cleanup.yml.j2 +0 -0
  318. {code_mower-1.1.1 → code_mower-1.1.2}/templates/workflows/blind-review-artifacts-dry-run.yml.j2 +0 -0
  319. {code_mower-1.1.1 → code_mower-1.1.2}/templates/workflows/code-mower-agent-pr-labeler.yml.j2 +0 -0
  320. {code_mower-1.1.1 → code_mower-1.1.2}/templates/workflows/code-mower-fix-round-dispatch.yml.j2 +0 -0
  321. {code_mower-1.1.1 → code_mower-1.1.2}/templates/workflows/code-mower-gate-health.yml.j2 +0 -0
  322. {code_mower-1.1.1 → code_mower-1.1.2}/templates/workflows/code-mower-gate.yml.j2 +0 -0
  323. {code_mower-1.1.1 → code_mower-1.1.2}/templates/workflows/dispatch-lanes.yml.j2 +0 -0
  324. {code_mower-1.1.1 → code_mower-1.1.2}/templates/workflows/hosted-bridge.yml.j2 +0 -0
  325. {code_mower-1.1.1 → code_mower-1.1.2}/templates/workflows/lane-mac-runner.yml.j2 +0 -0
  326. {code_mower-1.1.1 → code_mower-1.1.2}/templates/workflows/local-cli-audit.yml.j2 +0 -0
  327. {code_mower-1.1.1 → code_mower-1.1.2}/templates/workflows/private-standalone-shadow.yml.j2 +0 -0
  328. {code_mower-1.1.1 → code_mower-1.1.2}/templates/workflows/review-clear-stale.yml.j2 +0 -0
  329. {code_mower-1.1.1 → code_mower-1.1.2}/templates/workflows/saas-reviewer-labeler.yml.j2 +0 -0
  330. {code_mower-1.1.1 → code_mower-1.1.2}/templates/workflows/self-hosted-local-audit.yml.j2 +0 -0
  331. {code_mower-1.1.1 → code_mower-1.1.2}/templates/workflows/trailer-comment-labeler.yml.j2 +0 -0
  332. {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_adoption_diagnostics.py +0 -0
  333. {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_adoption_result_semantics.py +0 -0
  334. {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_adoption_run_contract.py +0 -0
  335. {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_antigravity_cli_audit_pr.py +0 -0
  336. {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_antigravity_sdk_probe.py +0 -0
  337. {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_audit_comment_posture.py +0 -0
  338. {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_audit_limits.py +0 -0
  339. {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_board.py +0 -0
  340. {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_builder_experiment.py +0 -0
  341. {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_builder_identity.py +0 -0
  342. {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_builder_runs.py +0 -0
  343. {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_calibration_effect_report.py +0 -0
  344. {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_calibration_truth.py +0 -0
  345. {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_campaign_adapters.py +0 -0
  346. {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_campaign_discovery.py +0 -0
  347. {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_campaign_gh_auth_and_issue_binding_817.py +0 -0
  348. {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_campaign_retry_evidence_711.py +0 -0
  349. {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_checks.py +0 -0
  350. {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_claude_audit_pr.py +0 -0
  351. {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_claude_cli_bounce.py +0 -0
  352. {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_clear_stale.py +0 -0
  353. {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_cloud_client.py +0 -0
  354. {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_cloud_git_metadata.py +0 -0
  355. {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_cloud_manifest.py +0 -0
  356. {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_cloud_reports.py +0 -0
  357. {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_coderabbit_cli_audit_pr.py +0 -0
  358. {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_codex_audit_env_preflight.py +0 -0
  359. {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_codex_audit_pr.py +0 -0
  360. {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_controller.py +0 -0
  361. {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_decision_audit_integration.py +0 -0
  362. {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_decisions.py +0 -0
  363. {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_devin_api.py +0 -0
  364. {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_devin_builder_lane.py +0 -0
  365. {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_devin_cli_audit_pr.py +0 -0
  366. {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_devin_provider_contract.py +0 -0
  367. {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_doctor_actions_cost_summary.py +0 -0
  368. {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_doctor_actions_failure_selection.py +0 -0
  369. {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_doctor_boundaries.py +0 -0
  370. {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_doctor_campaign_auth.py +0 -0
  371. {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_doctor_campaign_readiness.py +0 -0
  372. {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_doctor_github_checks.py +0 -0
  373. {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_doctor_output.py +0 -0
  374. {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_doctor_privacy.py +0 -0
  375. {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_doctor_provider_env_required.py +0 -0
  376. {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_doctor_provider_env_tokens.py +0 -0
  377. {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_doctor_provider_local_audit_setup.py +0 -0
  378. {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_doctor_provider_probe.py +0 -0
  379. {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_doctor_provider_review_hygiene.py +0 -0
  380. {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_doctor_registry.py +0 -0
  381. {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_doctor_runtime.py +0 -0
  382. {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_doctor_self_hosted_runner.py +0 -0
  383. {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_doctor_supervised_pilot.py +0 -0
  384. {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_file_locks.py +0 -0
  385. {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_fork_pr_guard.py +0 -0
  386. {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_gate_automerge.py +0 -0
  387. {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_gate_health.py +0 -0
  388. {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_hosted_dispatch_profile.py +0 -0
  389. {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_init_actionlint.py +0 -0
  390. {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_init_build_loop.py +0 -0
  391. {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_jira_adoption.py +0 -0
  392. {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_jira_mutations.py +0 -0
  393. {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_jira_pr_sync.py +0 -0
  394. {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_lane_delivery_contract.py +0 -0
  395. {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_lane_status.py +0 -0
  396. {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_local_llm_github_helpers.py +0 -0
  397. {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_migration_rehearsal.py +0 -0
  398. {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_migration_setup_drift.py +0 -0
  399. {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_next_steps.py +0 -0
  400. {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_package_install_failure_taxonomy.py +0 -0
  401. {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_participant_sessions.py +0 -0
  402. {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_plan_context.py +0 -0
  403. {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_pr_outcome_contract.py +0 -0
  404. {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_pr_outcome_coverage.py +0 -0
  405. {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_productivity_metrics_contract.py +0 -0
  406. {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_productivity_report.py +0 -0
  407. {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_productivity_windows.py +0 -0
  408. {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_prompts.py +0 -0
  409. {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_provider_credentials.py +0 -0
  410. {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_provider_fixture_contracts.py +0 -0
  411. {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_provider_local_cli.py +0 -0
  412. {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_provider_runners_comments.py +0 -0
  413. {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_provider_runners_git.py +0 -0
  414. {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_provider_runners_github_pr.py +0 -0
  415. {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_provider_runners_pr_worktree.py +0 -0
  416. {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_provider_runners_process.py +0 -0
  417. {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_provider_runners_repo_paths.py +0 -0
  418. {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_provider_runners_text_schema.py +0 -0
  419. {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_provider_runners_workspace.py +0 -0
  420. {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_release_campaigns.py +0 -0
  421. {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_release_qualify.py +0 -0
  422. {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_remote_qualification_failure_reason_819.py +0 -0
  423. {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_reviewer_finding_outcome_contract.py +0 -0
  424. {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_reviewer_metrics_core.py +0 -0
  425. {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_reviewer_spend.py +0 -0
  426. {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_supervised_pilot_contract.py +0 -0
  427. {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_tracker_config.py +0 -0
  428. {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_tracker_contract.py +0 -0
  429. {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_trailer_comment_labeler.py +0 -0
  430. {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_work_orders.py +0 -0
  431. {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_work_type_contract.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: code-mower
3
- Version: 1.1.1
3
+ Version: 1.1.2
4
4
  Summary: Multi-reviewer AI code audit orchestration
5
5
  License-Expression: Apache-2.0
6
6
  Project-URL: Homepage, https://github.com/codemower-ai/code-mower
@@ -245,7 +245,7 @@ agent report its actual host posture, exact installed version, doctor result,
245
245
  Board URL, and any owner-only click-list before it mutates the repo.
246
246
 
247
247
  The current package-index announcement entry point is the tagged
248
- [Try Code Mower In 10 Minutes](https://github.com/codemower-ai/code-mower/blob/v1.1.1/docs/try-in-10-minutes.md)
248
+ [Try Code Mower In 10 Minutes](https://github.com/codemower-ai/code-mower/blob/v1.1.2/docs/try-in-10-minutes.md)
249
249
  guide. The v1.0 supervised-pilot release includes the native Board, the
250
250
  controller dry-run and policy contract, adoption and upgrade hardening from
251
251
  recent install rehearsals, package-index release checks, provider-diversity
@@ -348,7 +348,7 @@ Provider-contract baseline for the next release train:
348
348
 
349
349
  For release verification,
350
350
  [First-User Install Rehearsal](docs/first-user-install-rehearsal.md) records
351
- the package-index procedure for `v1.1.1` / `code-mower==1.1.1`. The
351
+ the package-index procedure for `v1.1.2` / `code-mower==1.1.2`. The
352
352
  GitHub release records the workflow and rehearsal evidence for the exact tag.
353
353
  After publication, [Release Qualification](docs/release-qualification.md)
354
354
  coordinates provider-specific install and operational checks without treating
@@ -542,8 +542,8 @@ measurement work.
542
542
 
543
543
  ## Installation Status
544
544
 
545
- The current package-index release baseline is `v1.1.1`, with pinned package
546
- install spec `code-mower==1.1.1`. Release evidence is recorded on the GitHub
545
+ The current package-index release baseline is `v1.1.2`, with pinned package
546
+ install spec `code-mower==1.1.2`. Release evidence is recorded on the GitHub
547
547
  release and in the first-user install rehearsal. The public repository is
548
548
  [codemower-ai/code-mower](https://github.com/codemower-ai/code-mower), and
549
549
  GitHub releases remain the auditable source for tags, build artifacts, and
@@ -630,6 +630,7 @@ first so local work exercises the same package entrypoint users install.
630
630
  - [v1.0.14 Release Notes](docs/v1014-release-notes.md)
631
631
  - [v1.0.15 Release Notes](docs/v1015-release-notes.md)
632
632
  - [v1.1.1 Release Notes](docs/v111-release-notes.md)
633
+ - [v1.1.2 Release Notes](docs/v112-release-notes.md)
633
634
  - [v1.1 Release Notes](docs/v11-release-notes.md)
634
635
  - [Post-v0.8 Effectiveness Assessment](docs/post-v08-effectiveness-assessment.md)
635
636
  - [v1.0.1 Effectiveness Assessment](docs/v101-effectiveness-assessment.md)
@@ -215,7 +215,7 @@ agent report its actual host posture, exact installed version, doctor result,
215
215
  Board URL, and any owner-only click-list before it mutates the repo.
216
216
 
217
217
  The current package-index announcement entry point is the tagged
218
- [Try Code Mower In 10 Minutes](https://github.com/codemower-ai/code-mower/blob/v1.1.1/docs/try-in-10-minutes.md)
218
+ [Try Code Mower In 10 Minutes](https://github.com/codemower-ai/code-mower/blob/v1.1.2/docs/try-in-10-minutes.md)
219
219
  guide. The v1.0 supervised-pilot release includes the native Board, the
220
220
  controller dry-run and policy contract, adoption and upgrade hardening from
221
221
  recent install rehearsals, package-index release checks, provider-diversity
@@ -318,7 +318,7 @@ Provider-contract baseline for the next release train:
318
318
 
319
319
  For release verification,
320
320
  [First-User Install Rehearsal](docs/first-user-install-rehearsal.md) records
321
- the package-index procedure for `v1.1.1` / `code-mower==1.1.1`. The
321
+ the package-index procedure for `v1.1.2` / `code-mower==1.1.2`. The
322
322
  GitHub release records the workflow and rehearsal evidence for the exact tag.
323
323
  After publication, [Release Qualification](docs/release-qualification.md)
324
324
  coordinates provider-specific install and operational checks without treating
@@ -512,8 +512,8 @@ measurement work.
512
512
 
513
513
  ## Installation Status
514
514
 
515
- The current package-index release baseline is `v1.1.1`, with pinned package
516
- install spec `code-mower==1.1.1`. Release evidence is recorded on the GitHub
515
+ The current package-index release baseline is `v1.1.2`, with pinned package
516
+ install spec `code-mower==1.1.2`. Release evidence is recorded on the GitHub
517
517
  release and in the first-user install rehearsal. The public repository is
518
518
  [codemower-ai/code-mower](https://github.com/codemower-ai/code-mower), and
519
519
  GitHub releases remain the auditable source for tags, build artifacts, and
@@ -600,6 +600,7 @@ first so local work exercises the same package entrypoint users install.
600
600
  - [v1.0.14 Release Notes](docs/v1014-release-notes.md)
601
601
  - [v1.0.15 Release Notes](docs/v1015-release-notes.md)
602
602
  - [v1.1.1 Release Notes](docs/v111-release-notes.md)
603
+ - [v1.1.2 Release Notes](docs/v112-release-notes.md)
603
604
  - [v1.1 Release Notes](docs/v11-release-notes.md)
604
605
  - [Post-v0.8 Effectiveness Assessment](docs/post-v08-effectiveness-assessment.md)
605
606
  - [v1.0.1 Effectiveness Assessment](docs/v101-effectiveness-assessment.md)
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "code-mower"
7
- version = "1.1.1"
7
+ version = "1.1.2"
8
8
  description = "Multi-reviewer AI code audit orchestration"
9
9
  requires-python = ">=3.12"
10
10
  readme = "README.md"
@@ -1,3 +1,3 @@
1
1
  """Code Mower package."""
2
2
 
3
- __version__ = "1.1.1"
3
+ __version__ = "1.1.2"
@@ -83,16 +83,17 @@ MAX_ATTEMPTS = 4
83
83
  BACKOFF_BASE_SECONDS = 0.5
84
84
  BACKOFF_CAP_SECONDS = 8.0
85
85
  RETRY_AFTER_CAP_SECONDS = 60
86
- SEARCH_PAGE_SIZE = 100
86
+ SEARCH_PAGE_SIZE = 25
87
87
  SEARCH_MAX_ISSUES = 200
88
88
  #: Maximum enhanced-JQL page fetches per search call. This bound is
89
89
  #: independent of the count of collected usable issues so that empty or
90
90
  #: unusable pages with fresh continuation tokens cannot loop forever.
91
- SEARCH_MAX_PAGES = 20
91
+ SEARCH_MAX_PAGES = 40
92
92
  #: Create-metadata page size and maximum page fetches per discovery call.
93
93
  CREATEMETA_PAGE_SIZE = 50
94
94
  CREATEMETA_MAX_PAGES = 8
95
95
  MAX_REQUIRED_CREATE_FIELDS = 64
96
+ MAX_ISSUE_TYPES = 256
96
97
  KEYCHAIN_TIMEOUT_SECONDS = 10
97
98
  MAX_METADATA_VALUE_LENGTH = 128
98
99
  MAX_LABEL_LENGTH = 128
@@ -261,6 +262,21 @@ def _bounded_labels(value: Any) -> list[str]:
261
262
  return sorted(set(names))[:MAX_LABELS]
262
263
 
263
264
 
265
+ def _bounded_issue_types(value: Any) -> list[dict[str, str]]:
266
+ issue_types: list[dict[str, str]] = []
267
+ seen_ids: set[str] = set()
268
+ entries = value if isinstance(value, list) else []
269
+ for entry in entries:
270
+ if not isinstance(entry, Mapping):
271
+ continue
272
+ type_id = _bounded_str(entry.get("id"), 32)
273
+ if not type_id or not _TOKEN_ID_RE.fullmatch(type_id) or type_id in seen_ids:
274
+ continue
275
+ seen_ids.add(type_id)
276
+ issue_types.append({"id": type_id, "name": _bounded_str(entry.get("name"))})
277
+ return issue_types
278
+
279
+
264
280
  def default_keychain_runner(argv: Sequence[str], env: Mapping[str, str]) -> str:
265
281
  """Read one generic-password entry through the macOS ``security`` CLI.
266
282
 
@@ -1059,12 +1075,30 @@ class JiraReadClient:
1059
1075
  Follows bounded create-metadata pagination. Repeated or malformed
1060
1076
  pagination state fails closed instead of presenting a partial page
1061
1077
  as the exhaustive set. A response with no pagination keys is one
1062
- exhaustive page.
1078
+ exhaustive page. Jira sites that return 404 for create metadata fall
1079
+ back to the project issue-type endpoint; other failures remain visible.
1063
1080
  """
1064
1081
  if not _PROJECT_ID_RE.fullmatch(project_id):
1065
1082
  raise ValueError("project_id must be a bounded numeric id")
1066
1083
  quoted = urllib.parse.quote(project_id, safe="")
1067
1084
  path = f"/rest/api/3/issue/createmeta/{quoted}/issuetypes"
1085
+ try:
1086
+ return self._get_createmeta_issue_types(path)
1087
+ except JiraApiError as exc:
1088
+ if exc.code != "jira_not_found":
1089
+ raise
1090
+ raw_types = self.request_list(
1091
+ "GET",
1092
+ "/rest/api/3/issuetype/project",
1093
+ query={"projectId": project_id},
1094
+ endpoint="issueTypeProject",
1095
+ )
1096
+ if len(raw_types) > MAX_ISSUE_TYPES:
1097
+ raise JiraApiError("jira_unavailable", endpoint="issueTypeProject")
1098
+ return _bounded_issue_types(raw_types)
1099
+
1100
+ def _get_createmeta_issue_types(self, path: str) -> list[dict[str, str]]:
1101
+ """Read bounded create-metadata pages from one validated path."""
1068
1102
  issue_types: list[dict[str, str]] = []
1069
1103
  seen_ids: set[str] = set()
1070
1104
  start_at = 0
@@ -1082,18 +1116,10 @@ class JiraReadClient:
1082
1116
  raw_types = data.get("issueTypes")
1083
1117
  if not isinstance(raw_types, list):
1084
1118
  raise JiraApiError("jira_unavailable", endpoint="createMeta")
1085
- for entry in raw_types:
1086
- if not isinstance(entry, Mapping):
1087
- continue
1088
- type_id = _bounded_str(entry.get("id"), 32)
1089
- if not type_id or not _TOKEN_ID_RE.fullmatch(type_id):
1090
- continue
1091
- if type_id in seen_ids:
1092
- continue
1093
- seen_ids.add(type_id)
1094
- issue_types.append(
1095
- {"id": type_id, "name": _bounded_str(entry.get("name"))}
1096
- )
1119
+ for entry in _bounded_issue_types(raw_types):
1120
+ if entry["id"] not in seen_ids:
1121
+ seen_ids.add(entry["id"])
1122
+ issue_types.append(entry)
1097
1123
  if "total" not in data and "startAt" not in data:
1098
1124
  break
1099
1125
  total = _parse_createmeta_total(data, endpoint="createMeta")
@@ -8,7 +8,7 @@ permissions:
8
8
  contents: read
9
9
 
10
10
  env:
11
- CODE_MOWER_PACKAGE_SPEC: code-mower==1.1.1
11
+ CODE_MOWER_PACKAGE_SPEC: code-mower==1.1.2
12
12
 
13
13
  jobs:
14
14
  auto-record:
@@ -16,6 +16,11 @@ from urllib.parse import urlsplit
16
16
  from .tracker_contract import TRACKER_WORK_ITEM_SCHEMA, validate_tracker_work_item
17
17
 
18
18
 
19
+ QUEUE_PAGE_SIZE = 25
20
+ QUEUE_DEFAULT_MAX_PAGES = 10
21
+ QUEUE_MAX_PAGES = 40
22
+
23
+
19
24
  class JiraQueueReader(Protocol):
20
25
  """Minimal enhanced-search seam for #800; no transport implementation here."""
21
26
 
@@ -203,7 +208,8 @@ def normalize_jira_work_item(raw: Mapping[str, Any], config: Mapping[str, Any])
203
208
 
204
209
  def collect_queue(
205
210
  config: Mapping[str, Any], *, reader: JiraQueueReader | None = None,
206
- now: datetime | None = None, max_pages: int = 5, page_size: int = 50,
211
+ now: datetime | None = None, max_pages: int = QUEUE_DEFAULT_MAX_PAGES,
212
+ page_size: int = QUEUE_PAGE_SIZE,
207
213
  ) -> dict[str, Any]:
208
214
  """Bounded enhanced JQL reads. Partial/error results never become eligible."""
209
215
  observed = now or datetime.now(UTC)
@@ -227,12 +233,13 @@ def collect_queue(
227
233
  seen_tokens: set[str] = set()
228
234
  items = {}
229
235
  token = None
230
- for _ in range(min(10, max(1, max_pages))):
231
- page = reader.search_page(jql=query, fields=sorted(fields), max_results=min(100, max(1, page_size)), next_page_token=token)
236
+ bounded_page_size = min(QUEUE_PAGE_SIZE, max(1, page_size))
237
+ for _ in range(min(QUEUE_MAX_PAGES, max(1, max_pages))):
238
+ page = reader.search_page(jql=query, fields=sorted(fields), max_results=bounded_page_size, next_page_token=token)
232
239
  if "isLast" in page and not isinstance(page["isLast"], bool):
233
240
  raise ValueError("invalid completion marker")
234
241
  raw_items = page["issues"]
235
- if not isinstance(raw_items, list) or len(raw_items) > min(100, max(1, page_size)):
242
+ if not isinstance(raw_items, list) or len(raw_items) > bounded_page_size:
236
243
  raise ValueError("invalid page")
237
244
  for raw in raw_items:
238
245
  item = normalize_jira_work_item(raw, jira)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: code-mower
3
- Version: 1.1.1
3
+ Version: 1.1.2
4
4
  Summary: Multi-reviewer AI code audit orchestration
5
5
  License-Expression: Apache-2.0
6
6
  Project-URL: Homepage, https://github.com/codemower-ai/code-mower
@@ -245,7 +245,7 @@ agent report its actual host posture, exact installed version, doctor result,
245
245
  Board URL, and any owner-only click-list before it mutates the repo.
246
246
 
247
247
  The current package-index announcement entry point is the tagged
248
- [Try Code Mower In 10 Minutes](https://github.com/codemower-ai/code-mower/blob/v1.1.1/docs/try-in-10-minutes.md)
248
+ [Try Code Mower In 10 Minutes](https://github.com/codemower-ai/code-mower/blob/v1.1.2/docs/try-in-10-minutes.md)
249
249
  guide. The v1.0 supervised-pilot release includes the native Board, the
250
250
  controller dry-run and policy contract, adoption and upgrade hardening from
251
251
  recent install rehearsals, package-index release checks, provider-diversity
@@ -348,7 +348,7 @@ Provider-contract baseline for the next release train:
348
348
 
349
349
  For release verification,
350
350
  [First-User Install Rehearsal](docs/first-user-install-rehearsal.md) records
351
- the package-index procedure for `v1.1.1` / `code-mower==1.1.1`. The
351
+ the package-index procedure for `v1.1.2` / `code-mower==1.1.2`. The
352
352
  GitHub release records the workflow and rehearsal evidence for the exact tag.
353
353
  After publication, [Release Qualification](docs/release-qualification.md)
354
354
  coordinates provider-specific install and operational checks without treating
@@ -542,8 +542,8 @@ measurement work.
542
542
 
543
543
  ## Installation Status
544
544
 
545
- The current package-index release baseline is `v1.1.1`, with pinned package
546
- install spec `code-mower==1.1.1`. Release evidence is recorded on the GitHub
545
+ The current package-index release baseline is `v1.1.2`, with pinned package
546
+ install spec `code-mower==1.1.2`. Release evidence is recorded on the GitHub
547
547
  release and in the first-user install rehearsal. The public repository is
548
548
  [codemower-ai/code-mower](https://github.com/codemower-ai/code-mower), and
549
549
  GitHub releases remain the auditable source for tags, build artifacts, and
@@ -630,6 +630,7 @@ first so local work exercises the same package entrypoint users install.
630
630
  - [v1.0.14 Release Notes](docs/v1014-release-notes.md)
631
631
  - [v1.0.15 Release Notes](docs/v1015-release-notes.md)
632
632
  - [v1.1.1 Release Notes](docs/v111-release-notes.md)
633
+ - [v1.1.2 Release Notes](docs/v112-release-notes.md)
633
634
  - [v1.1 Release Notes](docs/v11-release-notes.md)
634
635
  - [Post-v0.8 Effectiveness Assessment](docs/post-v08-effectiveness-assessment.md)
635
636
  - [v1.0.1 Effectiveness Assessment](docs/v101-effectiveness-assessment.md)
@@ -8,7 +8,7 @@ permissions:
8
8
  contents: read
9
9
 
10
10
  env:
11
- CODE_MOWER_PACKAGE_SPEC: code-mower==1.1.1
11
+ CODE_MOWER_PACKAGE_SPEC: code-mower==1.1.2
12
12
 
13
13
  jobs:
14
14
  auto-record:
@@ -898,6 +898,7 @@ class ReadPrimitiveTests(unittest.TestCase):
898
898
  # Only bounded metadata fields are requested and returned.
899
899
  for body in bodies:
900
900
  self.assertLessEqual(set(body["fields"]), jira_cloud.SAFE_SEARCH_FIELDS)
901
+ self.assertEqual(body["maxResults"], jira_cloud.SEARCH_PAGE_SIZE)
901
902
  first = result["issues"][0]
902
903
  self.assertEqual(first["id"], "20001")
903
904
  self.assertEqual(first["fields"]["status_id"], "10000")
@@ -1737,6 +1738,43 @@ class IssueTypePaginationTests(unittest.TestCase):
1737
1738
  self.assertIn("startAt=0", runner.calls[0]["url"])
1738
1739
  self.assertIn("startAt=2", runner.calls[1]["url"])
1739
1740
 
1741
+ def test_not_found_falls_back_to_project_issue_types(self) -> None:
1742
+ runner = FakeHttp(
1743
+ [
1744
+ http_error(404),
1745
+ http_response(load_fixture("project_issue_types.json")),
1746
+ ]
1747
+ )
1748
+ client = make_client(runner)
1749
+ types = client.get_issue_types(PROJECT_ID)
1750
+ self.assertEqual(
1751
+ types,
1752
+ [{"id": "10001", "name": "Task"}, {"id": "10002", "name": "Bug"}],
1753
+ )
1754
+ self.assertIn("/issue/createmeta/", runner.calls[0]["url"])
1755
+ self.assertIn("/issuetype/project?projectId=10001", runner.calls[1]["url"])
1756
+ self.assertNotIn("fixture prose", json.dumps(types))
1757
+
1758
+ def test_non_not_found_failure_does_not_fall_back(self) -> None:
1759
+ runner = FakeHttp([http_error(403)])
1760
+ client = make_client(runner)
1761
+ with self.assertRaises(jira_cloud.JiraApiError) as ctx:
1762
+ client.get_issue_types(PROJECT_ID)
1763
+ self.assertEqual(ctx.exception.code, "jira_forbidden")
1764
+ self.assertEqual(len(runner.calls), 1)
1765
+
1766
+ def test_fallback_issue_type_inventory_is_bounded(self) -> None:
1767
+ raw = [
1768
+ {"id": str(index), "name": f"Type {index}"}
1769
+ for index in range(jira_cloud.MAX_ISSUE_TYPES + 1)
1770
+ ]
1771
+ runner = FakeHttp([http_error(404), http_response(raw)])
1772
+ client = make_client(runner)
1773
+ with self.assertRaises(jira_cloud.JiraApiError) as ctx:
1774
+ client.get_issue_types(PROJECT_ID)
1775
+ self.assertEqual(ctx.exception.code, "jira_unavailable")
1776
+ self.assertEqual(ctx.exception.endpoint, "issueTypeProject")
1777
+
1740
1778
  def test_page_bound_fails_closed(self) -> None:
1741
1779
  script = [
1742
1780
  self.page([(f"1000{index}", f"Type{index}")], index, 10000)
@@ -65,7 +65,7 @@ from scripts import guard_package_workflows, privacy_scan
65
65
 
66
66
  class ReleaseHygieneTests(unittest.TestCase):
67
67
  def test_version_is_current_supervised_pilot_release(self) -> None:
68
- self.assertEqual(__version__, "1.1.1")
68
+ self.assertEqual(__version__, "1.1.2")
69
69
 
70
70
  def test_dogfood_repo_has_real_root_config(self) -> None:
71
71
  config_path = ROOT / "code-mower.yml"
@@ -216,7 +216,7 @@ class ReleaseHygieneTests(unittest.TestCase):
216
216
  self.assertIn("Cold Install Vs Upgrade", install)
217
217
  self.assertIn("Switching Between pipx And uv", install)
218
218
  self.assertIn("uv tool install --python 3.12 --reinstall --refresh-package", install)
219
- self.assertIn("code-mower==1.1.1", troubleshooting)
219
+ self.assertIn("code-mower==1.1.2", troubleshooting)
220
220
  self.assertNotIn("code-mower==0.8.0b1", troubleshooting)
221
221
  self.assertIn("pipx uninstall code-mower", install)
222
222
  for env_name in ("PIPX_HOME", "PIPX_BIN_DIR", "PIPX_LOG_DIR"):
@@ -1100,7 +1100,7 @@ exit 1
1100
1100
  )
1101
1101
 
1102
1102
  self.assertNotEqual(completed.returncode, 0)
1103
- self.assertIn("pipx install code-mower==1.1.1", completed.stderr)
1103
+ self.assertIn("pipx install code-mower==1.1.2", completed.stderr)
1104
1104
  self.assertIn("scripts/dev-python -m venv .venv", completed.stderr)
1105
1105
  self.assertIn(".venv/bin/code-mower", completed.stderr)
1106
1106
  self.assertNotIn("PYTHONPATH=src", completed.stderr)
@@ -3238,10 +3238,10 @@ jobs:
3238
3238
 
3239
3239
  cases = (
3240
3240
  (
3241
- 'CODE_MOWER_STANDALONE_REF="v1.1.1"\n',
3241
+ 'CODE_MOWER_STANDALONE_REF="v1.1.2"\n',
3242
3242
  "pass",
3243
3243
  "matches_running_package",
3244
- "v1.1.1",
3244
+ "v1.1.2",
3245
3245
  ),
3246
3246
  (
3247
3247
  'CODE_MOWER_STANDALONE_REF="v0.9.1-beta.1"\n',
@@ -3272,12 +3272,12 @@ jobs:
3272
3272
 
3273
3273
  payload = migration._standalone_pin_drift_summary(
3274
3274
  repo,
3275
- package_version="1.1.1",
3275
+ package_version="1.1.2",
3276
3276
  )
3277
3277
 
3278
3278
  self.assertEqual(payload["status"], status)
3279
3279
  self.assertEqual(payload["reason"], reason)
3280
- self.assertEqual(payload["expected_ref"], "v1.1.1")
3280
+ self.assertEqual(payload["expected_ref"], "v1.1.2")
3281
3281
  if current_ref is None:
3282
3282
  self.assertNotIn("current_ref", payload)
3283
3283
  else:
@@ -3298,7 +3298,7 @@ jobs:
3298
3298
 
3299
3299
  payload = migration._standalone_pin_drift_summary(
3300
3300
  repo,
3301
- package_version="1.1.1",
3301
+ package_version="1.1.2",
3302
3302
  )
3303
3303
 
3304
3304
  self.assertEqual(payload["status"], "warn")
@@ -3361,7 +3361,7 @@ jobs:
3361
3361
  "standalone_pin": {
3362
3362
  "status": "skip",
3363
3363
  "reason": "pin_file_absent",
3364
- "expected_ref": "v1.1.1",
3364
+ "expected_ref": "v1.1.2",
3365
3365
  },
3366
3366
  "builder_hint": {
3367
3367
  "status": "skip",
@@ -3373,7 +3373,7 @@ jobs:
3373
3373
 
3374
3374
  rendered = migration.render_setup_drift_text(payload)
3375
3375
 
3376
- self.assertIn("Standalone pin: SKIP pin_file_absent expected=v1.1.1", rendered)
3376
+ self.assertIn("Standalone pin: SKIP pin_file_absent expected=v1.1.2", rendered)
3377
3377
 
3378
3378
  def test_setup_drift_reports_builder_hint_when_builders_omitted(self) -> None:
3379
3379
  from code_mower import migration
@@ -5553,11 +5553,11 @@ printf 'repo:%s:%s:%s\\n' "${lane}" "${stdin_flag}" "${token}"
5553
5553
  (output_dir / "src/code_mower/cloud_client/dogfood.py").is_file()
5554
5554
  )
5555
5555
  self.assertIn(
5556
- 'version = "1.1.1"',
5556
+ 'version = "1.1.2"',
5557
5557
  (output_dir / "pyproject.toml").read_text(encoding="utf-8"),
5558
5558
  )
5559
5559
  self.assertIn(
5560
- '__version__ = "1.1.1"',
5560
+ '__version__ = "1.1.2"',
5561
5561
  (output_dir / "src/code_mower/__init__.py").read_text(
5562
5562
  encoding="utf-8"
5563
5563
  ),
@@ -7562,7 +7562,7 @@ def main():
7562
7562
  "pip",
7563
7563
  "install",
7564
7564
  "--no-cache-dir",
7565
- "code-mower==1.1.1",
7565
+ "code-mower==1.1.2",
7566
7566
  ]
7567
7567
 
7568
7568
  def fake_run_step(*args: object, **kwargs: object) -> subprocess.CompletedProcess[str]:
@@ -7629,7 +7629,7 @@ def main():
7629
7629
  self.assertTrue(code_mower_migration._package_spec_uses_package_index("code-mower"))
7630
7630
  self.assertTrue(
7631
7631
  code_mower_migration._package_spec_uses_package_index(
7632
- "code-mower==1.1.1"
7632
+ "code-mower==1.1.2"
7633
7633
  )
7634
7634
  )
7635
7635
  self.assertFalse(code_mower_migration._package_spec_uses_package_index("."))
@@ -7638,7 +7638,7 @@ def main():
7638
7638
  )
7639
7639
  self.assertFalse(
7640
7640
  code_mower_migration._package_spec_uses_package_index(
7641
- "git+https://github.com/codemower-ai/code-mower.git@v1.1.1"
7641
+ "git+https://github.com/codemower-ai/code-mower.git@v1.1.2"
7642
7642
  )
7643
7643
  )
7644
7644
 
@@ -7648,7 +7648,7 @@ def main():
7648
7648
 
7649
7649
  with self.assertRaisesRegex(ValueError, "--allow-package-index"):
7650
7650
  code_mower_migration.run_package_install_rehearsal(
7651
- package_spec="code-mower==1.1.1",
7651
+ package_spec="code-mower==1.1.2",
7652
7652
  work_dir=work_dir,
7653
7653
  )
7654
7654
 
@@ -7676,7 +7676,7 @@ def main():
7676
7676
  [
7677
7677
  "package-install-rehearsal",
7678
7678
  "--package-spec",
7679
- "code-mower==1.1.1",
7679
+ "code-mower==1.1.2",
7680
7680
  "--allow-package-index",
7681
7681
  "--upgrade-pip",
7682
7682
  "--pip-no-cache",
@@ -7732,10 +7732,10 @@ def main():
7732
7732
  payload = release_readiness.render_release_readiness(ROOT)
7733
7733
 
7734
7734
  self.assertEqual(payload["status"], "pass")
7735
- self.assertEqual(payload["version"], "1.1.1")
7736
- self.assertEqual(payload["release_tag"], "v1.1.1")
7737
- self.assertEqual(payload["alpha_tag"], "v1.1.1")
7738
- self.assertEqual(payload["package_index_spec"], "code-mower==1.1.1")
7735
+ self.assertEqual(payload["version"], "1.1.2")
7736
+ self.assertEqual(payload["release_tag"], "v1.1.2")
7737
+ self.assertEqual(payload["alpha_tag"], "v1.1.2")
7738
+ self.assertEqual(payload["package_index_spec"], "code-mower==1.1.2")
7739
7739
  check_ids = {check["id"]: check for check in payload["checks"]}
7740
7740
  self.assertEqual(check_ids["package-version-consistency"]["status"], "pass")
7741
7741
  self.assertEqual(
@@ -7751,9 +7751,9 @@ def main():
7751
7751
  self.assertEqual(check_ids["public-support-redaction-guidance"]["status"], "pass")
7752
7752
  commands = {action["id"]: action["command"] for action in payload["next_actions"]}
7753
7753
  urls = {action["id"]: action.get("url", "") for action in payload["next_actions"]}
7754
- self.assertIn("--ref v1.1.1", commands["dry-run-release-workflow"])
7754
+ self.assertIn("--ref v1.1.2", commands["dry-run-release-workflow"])
7755
7755
  self.assertNotIn("--ref main", commands["dry-run-release-workflow"])
7756
- self.assertIn("--ref v1.1.1", commands["publish-testpypi-candidate"])
7756
+ self.assertIn("--ref v1.1.2", commands["publish-testpypi-candidate"])
7757
7757
  self.assertNotIn("--ref main", commands["publish-testpypi-candidate"])
7758
7758
  self.assertIn("publish_testpypi=true", commands["publish-testpypi-candidate"])
7759
7759
  self.assertIn("publish_pypi=false", commands["publish-testpypi-candidate"])
@@ -7790,7 +7790,7 @@ def main():
7790
7790
  check_ids = {check["id"]: check for check in payload["checks"]}
7791
7791
  check = check_ids["materialized-package-version-consistency"]
7792
7792
  self.assertEqual(check["status"], "fail")
7793
- self.assertEqual(check["detail"]["source_version"], "1.1.1")
7793
+ self.assertEqual(check["detail"]["source_version"], "1.1.2")
7794
7794
  self.assertEqual(check["detail"]["generated_init_version"], "0.0.0")
7795
7795
 
7796
7796
  def test_public_support_docs_are_packaged_and_privacy_forward(self) -> None:
@@ -7894,20 +7894,20 @@ def main():
7894
7894
  "v1.0.0-rc.1",
7895
7895
  )
7896
7896
  self.assertEqual(
7897
- release_readiness._release_tag_for_version("1.1.1"),
7898
- "v1.1.1",
7897
+ release_readiness._release_tag_for_version("1.1.2"),
7898
+ "v1.1.2",
7899
7899
  )
7900
7900
  self.assertEqual(
7901
- code_mower_versioning.release_tag_for_version("1.1.1"),
7902
- "v1.1.1",
7901
+ code_mower_versioning.release_tag_for_version("1.1.2"),
7902
+ "v1.1.2",
7903
7903
  )
7904
7904
 
7905
7905
  def test_public_release_baseline_helpers_derive_announcement_links(self) -> None:
7906
7906
  self.assertEqual(
7907
7907
  code_mower_versioning.public_baseline_sentence(__version__),
7908
7908
  (
7909
- "The current package-index release baseline is `v1.1.1`, "
7910
- "with pinned package install spec `code-mower==1.1.1`. "
7909
+ "The current package-index release baseline is `v1.1.2`, "
7910
+ "with pinned package install spec `code-mower==1.1.2`. "
7911
7911
  "Release evidence is recorded on the GitHub release and in the "
7912
7912
  "first-user install rehearsal."
7913
7913
  ),
@@ -7916,7 +7916,7 @@ def main():
7916
7916
  code_mower_versioning.tagged_doc_url(__version__),
7917
7917
  (
7918
7918
  "https://github.com/codemower-ai/code-mower/blob/"
7919
- "v1.1.1/docs/try-in-10-minutes.md"
7919
+ "v1.1.2/docs/try-in-10-minutes.md"
7920
7920
  ),
7921
7921
  )
7922
7922
 
@@ -7969,15 +7969,15 @@ def main():
7969
7969
  )
7970
7970
 
7971
7971
  current_status = (
7972
- "The current package-index release baseline is `v1.1.1`, with "
7973
- "pinned package install spec `code-mower==1.1.1`. Release "
7972
+ "The current package-index release baseline is `v1.1.2`, with "
7973
+ "pinned package install spec `code-mower==1.1.2`. Release "
7974
7974
  "evidence is recorded on the GitHub release and in the first-user "
7975
7975
  "install rehearsal."
7976
7976
  )
7977
7977
  for text in (readme, current_state, rollout):
7978
7978
  self.assertIn(current_status, " ".join(text.split()))
7979
7979
  self.assertIn(
7980
- "The current package-index release entrypoint is `code-mower==1.1.1`",
7980
+ "The current package-index release entrypoint is `code-mower==1.1.2`",
7981
7981
  public_release,
7982
7982
  )
7983
7983
  self.assertIn("The v1.0 supervised-pilot release includes", public_release)
@@ -7987,7 +7987,7 @@ def main():
7987
7987
  )
7988
7988
 
7989
7989
  self.assertIn(
7990
- "The current public-release baseline is `v1.1.1`",
7990
+ "The current public-release baseline is `v1.1.2`",
7991
7991
  oss_checklist,
7992
7992
  )
7993
7993
  self.assertIn(
@@ -8018,7 +8018,7 @@ def main():
8018
8018
  " ".join(first_user.split()),
8019
8019
  )
8020
8020
  self.assertIn("never substitute mutable `main`", first_user)
8021
- self.assertEqual(first_user.count(" --ref v1.1.1 \\"), 2)
8021
+ self.assertEqual(first_user.count(" --ref v1.1.2 \\"), 2)
8022
8022
  self.assertNotIn(" --ref main \\", first_user)
8023
8023
  self.assertIn("-f publish_testpypi=true", first_user)
8024
8024
  self.assertIn("-f publish_pypi=false", first_user)
@@ -8030,23 +8030,23 @@ def main():
8030
8030
  first_user,
8031
8031
  )
8032
8032
  self.assertNotIn(
8033
- "The latest public-package rehearsal for `v1.1.1` was run",
8033
+ "The latest public-package rehearsal for `v1.1.2` was run",
8034
8034
  first_user,
8035
8035
  )
8036
- self.assertNotIn("TestPyPI is not\npublished for `1.1.1`", first_user)
8036
+ self.assertNotIn("TestPyPI is not\npublished for `1.1.2`", first_user)
8037
8037
  for text in (readme, current_state, rollout):
8038
8038
  self.assertNotIn(
8039
- "published on PyPI as `code-mower==1.1.1`",
8039
+ "published on PyPI as `code-mower==1.1.2`",
8040
8040
  text,
8041
8041
  )
8042
8042
  self.assertNotIn(
8043
8043
  "latest 10/10 public-package readiness proof for "
8044
- "`code-mower==1.1.1`",
8044
+ "`code-mower==1.1.2`",
8045
8045
  text,
8046
8046
  )
8047
8047
  self.assertNotIn(
8048
8048
  "public PyPI package-install rehearsal from "
8049
- "`code-mower==1.1.1`",
8049
+ "`code-mower==1.1.2`",
8050
8050
  text,
8051
8051
  )
8052
8052
  self.assertNotIn("beta.52: 10/10 first-user readiness", text)
@@ -8346,7 +8346,7 @@ def main():
8346
8346
 
8347
8347
  self.assertIn("Python 3.12 or newer", install)
8348
8348
  self.assertIn('pipx install --python "$CODE_MOWER_PYTHON"', install)
8349
- self.assertIn("uv tool install --python 3.12 code-mower==1.1.1", install)
8349
+ self.assertIn("uv tool install --python 3.12 code-mower==1.1.2", install)
8350
8350
  self.assertIn(
8351
8351
  'PIP_NO_CACHE_DIR=1 pipx install --force --python "$CODE_MOWER_PYTHON"',
8352
8352
  install,
@@ -8440,7 +8440,7 @@ def main():
8440
8440
  / "v101-effectiveness-assessment.md",
8441
8441
  }
8442
8442
  stale_phrases = (
8443
- "pipx install --python python3.12 code-mower==1.1.1",
8443
+ "pipx install --python python3.12 code-mower==1.1.2",
8444
8444
  "Use only after TestPyPI passes.",
8445
8445
  "future newest betas until 1.0",
8446
8446
  "during v0.7 adoption",
@@ -8736,7 +8736,7 @@ def main():
8736
8736
  "doctor --adoption --repo codemower-ai/code-mower",
8737
8737
  doctor_step["command"],
8738
8738
  )
8739
- self.assertIn("code-mower==1.1.1", package_step["command"])
8739
+ self.assertIn("code-mower==1.1.2", package_step["command"])
8740
8740
  self.assertIn("--allow-package-index", package_step["command"])
8741
8741
  self.assertIn("current published PyPI package", package_step["why"])
8742
8742
  self.assertIn("first_user_readiness", package_step["why"])