code-mower 0.5.0b29__tar.gz → 0.5.0b30__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.0b29 → code_mower-0.5.0b30}/PKG-INFO +6 -6
  2. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/README.md +5 -5
  3. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/pyproject.toml +1 -1
  4. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/__init__.py +1 -1
  5. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/cli.py +1 -1
  6. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/cloud.py +29 -0
  7. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/cloud_client/operations.py +53 -0
  8. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower.egg-info/PKG-INFO +6 -6
  9. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/tests/test_cloud_client.py +32 -1
  10. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/tests/test_provider_local_cli.py +2 -2
  11. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/tests/test_release_hygiene.py +78 -34
  12. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/CODE_OF_CONDUCT.md +0 -0
  13. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/LICENSE +0 -0
  14. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/MANIFEST.in +0 -0
  15. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/NOTICE +0 -0
  16. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/SUPPORT.md +0 -0
  17. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/requirements/requirements.txt +0 -0
  18. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/setup.cfg +0 -0
  19. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/adapters/__init__.py +0 -0
  20. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/adapters/_base.py +0 -0
  21. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/adapters/cursor_bugbot.py +0 -0
  22. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/adapters/gitar.py +0 -0
  23. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/adapters/greptile.py +0 -0
  24. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/adapters/qodo.py +0 -0
  25. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/antigravity_cli_audit_pr.py +0 -0
  26. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/audit_handoff_log.py +0 -0
  27. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/audit_labeler_lib.py +0 -0
  28. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/audit_progress.py +0 -0
  29. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/blind_review_artifacts.py +0 -0
  30. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/blind_review_coordinator.py +0 -0
  31. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/bootstrap.py +0 -0
  32. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/builder_experiment.py +0 -0
  33. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/calibration/__init__.py +0 -0
  34. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/calibration/arms.py +0 -0
  35. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/calibration/auto_discovery.py +0 -0
  36. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/calibration/commands.py +0 -0
  37. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/calibration/context_inputs.py +0 -0
  38. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/calibration/corpus.py +0 -0
  39. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/calibration/effect_report.py +0 -0
  40. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/calibration/evidence.py +0 -0
  41. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/calibration/evidence_report.py +0 -0
  42. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/calibration/identity.py +0 -0
  43. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/calibration/metrics.py +0 -0
  44. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/calibration/overlap.py +0 -0
  45. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/calibration/planning.py +0 -0
  46. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/calibration/policy.py +0 -0
  47. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/calibration/results.py +0 -0
  48. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/calibration/run_results.py +0 -0
  49. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/calibration/run_status.py +0 -0
  50. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/calibration/runner.py +0 -0
  51. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/calibration/truth.py +0 -0
  52. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/calibration/value_report.py +0 -0
  53. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/checks.py +0 -0
  54. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/claude_audit_pr.py +0 -0
  55. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/claude_cli_bounce.py +0 -0
  56. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/claude_cli_environment.py +0 -0
  57. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/clear_stale.py +0 -0
  58. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/cloud_client/__init__.py +0 -0
  59. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/cloud_client/bundle.py +0 -0
  60. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/cloud_client/doctor.py +0 -0
  61. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/cloud_client/dogfood.py +0 -0
  62. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/cloud_client/endpoints.py +0 -0
  63. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/cloud_client/errors.py +0 -0
  64. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/cloud_client/events.py +0 -0
  65. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/cloud_client/export.py +0 -0
  66. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/cloud_client/git_metadata.py +0 -0
  67. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/cloud_client/manifest.py +0 -0
  68. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/cloud_client/reports.py +0 -0
  69. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/cloud_client/setup.py +0 -0
  70. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/cloud_client/upload.py +0 -0
  71. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/code_mower_calibration.py +0 -0
  72. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/code_mower_context_packs.py +0 -0
  73. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/code_mower_merge.py +0 -0
  74. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/code_mower_telemetry.py +0 -0
  75. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/coderabbit_cli_audit_pr.py +0 -0
  76. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/codex_audit_env_preflight.py +0 -0
  77. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/codex_audit_pr.py +0 -0
  78. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/codex_audit_schema_smoke.py +0 -0
  79. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/codex_audit_verdict.schema.json +0 -0
  80. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/config.py +0 -0
  81. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/doctor.py +0 -0
  82. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/doctor_checks/__init__.py +0 -0
  83. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/doctor_checks/cloud.py +0 -0
  84. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/doctor_checks/common.py +0 -0
  85. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/doctor_checks/github.py +0 -0
  86. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/doctor_checks/github_actions.py +0 -0
  87. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/doctor_checks/github_actions_cost.py +0 -0
  88. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/doctor_checks/github_actions_cost_summary.py +0 -0
  89. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/doctor_checks/github_actions_failure_annotations.py +0 -0
  90. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/doctor_checks/github_actions_failure_models.py +0 -0
  91. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/doctor_checks/github_actions_failure_scan.py +0 -0
  92. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/doctor_checks/github_actions_failure_selection.py +0 -0
  93. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/doctor_checks/github_actions_failures.py +0 -0
  94. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/doctor_checks/github_actions_permissions.py +0 -0
  95. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/doctor_checks/github_api.py +0 -0
  96. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/doctor_checks/github_branch.py +0 -0
  97. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/doctor_checks/github_config.py +0 -0
  98. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/doctor_checks/github_provider.py +0 -0
  99. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/doctor_checks/github_repo.py +0 -0
  100. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/doctor_checks/groups.py +0 -0
  101. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/doctor_checks/models.py +0 -0
  102. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/doctor_checks/output.py +0 -0
  103. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/doctor_checks/presets.py +0 -0
  104. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/doctor_checks/privacy.py +0 -0
  105. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/doctor_checks/provider_api_model.py +0 -0
  106. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/doctor_checks/provider_api_model_openai.py +0 -0
  107. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/doctor_checks/provider_api_model_profiles.py +0 -0
  108. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/doctor_checks/provider_env.py +0 -0
  109. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/doctor_checks/provider_env_required.py +0 -0
  110. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/doctor_checks/provider_env_tokens.py +0 -0
  111. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/doctor_checks/provider_local_cli.py +0 -0
  112. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/doctor_checks/provider_local_cli_commands.py +0 -0
  113. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/doctor_checks/provider_local_cli_probe_config.py +0 -0
  114. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/doctor_checks/provider_probe.py +0 -0
  115. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/doctor_checks/provider_probe_auth.py +0 -0
  116. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/doctor_checks/provider_probe_evaluation.py +0 -0
  117. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/doctor_checks/provider_probe_json.py +0 -0
  118. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/doctor_checks/provider_probe_remediation.py +0 -0
  119. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/doctor_checks/provider_review_hygiene.py +0 -0
  120. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/doctor_checks/providers.py +0 -0
  121. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/doctor_checks/registry.py +0 -0
  122. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/doctor_checks/runner.py +0 -0
  123. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/doctor_checks/runtime.py +0 -0
  124. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/doctor_checks/runtime_github_auth.py +0 -0
  125. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/gemini_cli_audit_pr.py +0 -0
  126. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/hermes_cli_audit_pr.py +0 -0
  127. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/init.py +0 -0
  128. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/lane_configs/__init__.py +0 -0
  129. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/lane_configs/aider.py +0 -0
  130. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/lane_configs/antigravity_cli.py +0 -0
  131. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/lane_configs/claude.py +0 -0
  132. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/lane_configs/codex.py +0 -0
  133. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/lane_configs/devin.py +0 -0
  134. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/lane_configs/gemini_cli.py +0 -0
  135. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/lane_configs/hermes_cli.py +0 -0
  136. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/lane_configs/local_llm.py +0 -0
  137. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/local_llm_audit_pr.py +0 -0
  138. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/local_llm_bakeoff.py +0 -0
  139. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/local_llm_calibration.py +0 -0
  140. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/local_llm_profiles.py +0 -0
  141. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/migration.py +0 -0
  142. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/migration_install.py +0 -0
  143. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/migration_mirror.py +0 -0
  144. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/migration_readiness.py +0 -0
  145. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/migration_rehearsal.py +0 -0
  146. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/next_steps.py +0 -0
  147. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/package.py +0 -0
  148. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/package_content.py +0 -0
  149. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/package_manifest.py +0 -0
  150. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/package_paths.py +0 -0
  151. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/package_rendering.py +0 -0
  152. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/package_static.py +0 -0
  153. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/prompts.py +0 -0
  154. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/provider_registry.py +0 -0
  155. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/provider_runners/__init__.py +0 -0
  156. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/provider_runners/comments.py +0 -0
  157. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/provider_runners/git.py +0 -0
  158. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/provider_runners/github_auth.py +0 -0
  159. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/provider_runners/github_pr.py +0 -0
  160. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/provider_runners/pr_worktree.py +0 -0
  161. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/provider_runners/process.py +0 -0
  162. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/provider_runners/repo_paths.py +0 -0
  163. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/provider_runners/text_schema.py +0 -0
  164. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/provider_runners/verdict_artifacts.py +0 -0
  165. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/provider_runners/workspace.py +0 -0
  166. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/providers/__init__.py +0 -0
  167. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/providers/local_cli.py +0 -0
  168. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/providers/provenance.py +0 -0
  169. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/release_readiness.py +0 -0
  170. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/reviewer_metrics.py +0 -0
  171. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/saas_reviewer_labeler.py +0 -0
  172. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/secrets.py +0 -0
  173. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/templates/builder-experiment.example.json +0 -0
  174. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/templates/calibration-corpus.example.json +0 -0
  175. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/templates/calibration-corpus.json +0 -0
  176. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/templates/code-mower.example.yml +0 -0
  177. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/templates/context-packs.example.json +0 -0
  178. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/templates/lane_prompts/base-audit.md +0 -0
  179. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/templates/lane_prompts/calibration-policy.md +0 -0
  180. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/templates/lane_prompts/context-driven-quality.md +0 -0
  181. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/templates/lane_prompts/docs-design.md +0 -0
  182. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/templates/lane_prompts/generic-programming.md +0 -0
  183. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/templates/lane_prompts/operability.md +0 -0
  184. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/templates/lane_prompts/package-runtime.md +0 -0
  185. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/templates/lane_prompts/security-threat-model.md +0 -0
  186. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/templates/product-support/code_mower +0 -0
  187. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/templates/product-support/code_mower_standalone_pin.env +0 -0
  188. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/templates/product-support/code_mower_standalone_shadow.sh +0 -0
  189. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/templates/product-support/run_claude_audit_pr.sh +0 -0
  190. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/templates/product-support/run_codex_audit_pr.sh +0 -0
  191. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/templates/product-support/safe_gh_comment.py +0 -0
  192. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/templates/providers.yml +0 -0
  193. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/templates/reviewer-spend.example.json +0 -0
  194. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/templates/reviewer-value-report.example.md +0 -0
  195. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/templates/workflows/audit-label-cleanup.yml.j2 +0 -0
  196. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/templates/workflows/hosted-bridge.yml.j2 +0 -0
  197. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/templates/workflows/local-cli-audit.yml.j2 +0 -0
  198. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/templates/workflows/private-standalone-shadow.yml.j2 +0 -0
  199. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/templates/workflows/review-clear-stale.yml.j2 +0 -0
  200. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/templates/workflows/saas-reviewer-labeler.yml.j2 +0 -0
  201. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/templates/workflows/trailer-comment-labeler.yml.j2 +0 -0
  202. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/trailer_comment_labeler.py +0 -0
  203. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/versioning.py +0 -0
  204. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower.egg-info/SOURCES.txt +0 -0
  205. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower.egg-info/dependency_links.txt +0 -0
  206. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower.egg-info/entry_points.txt +0 -0
  207. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower.egg-info/requires.txt +0 -0
  208. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower.egg-info/top_level.txt +0 -0
  209. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/templates/builder-experiment.example.json +0 -0
  210. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/templates/calibration-corpus.example.json +0 -0
  211. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/templates/calibration-corpus.json +0 -0
  212. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/templates/code-mower.yml.j2 +0 -0
  213. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/templates/context-packs.example.json +0 -0
  214. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/templates/cursor/BUGBOT.md +0 -0
  215. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/templates/providers/acp_bridge.yml +0 -0
  216. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/templates/providers/aider.yml +0 -0
  217. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/templates/providers/antigravity_cli.yml +0 -0
  218. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/templates/providers/claude_audit.yml +0 -0
  219. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/templates/providers/claude_review.yml +0 -0
  220. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/templates/providers/coderabbit_cli.yml +0 -0
  221. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/templates/providers/codex.yml +0 -0
  222. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/templates/providers/cursor_bugbot.yml +0 -0
  223. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/templates/providers/devin.yml +0 -0
  224. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/templates/providers/gemini_cli.yml +0 -0
  225. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/templates/providers/gitar.yml +0 -0
  226. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/templates/providers/greptile.yml +0 -0
  227. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/templates/providers/hermes_cli.yml +0 -0
  228. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/templates/providers/local_llm.yml +0 -0
  229. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/templates/providers/qodo.yml +0 -0
  230. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/templates/providers.yml +0 -0
  231. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/templates/reviewer-spend.example.json +0 -0
  232. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/templates/reviewer-value-report.example.md +0 -0
  233. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/templates/workflows/audit-label-cleanup.yml.j2 +0 -0
  234. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/templates/workflows/blind-review-artifacts-dry-run.yml.j2 +0 -0
  235. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/templates/workflows/hosted-bridge.yml.j2 +0 -0
  236. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/templates/workflows/local-cli-audit.yml.j2 +0 -0
  237. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/templates/workflows/private-standalone-shadow.yml.j2 +0 -0
  238. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/templates/workflows/review-clear-stale.yml.j2 +0 -0
  239. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/templates/workflows/saas-reviewer-labeler.yml.j2 +0 -0
  240. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/templates/workflows/trailer-comment-labeler.yml.j2 +0 -0
  241. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/tests/test_calibration_effect_report.py +0 -0
  242. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/tests/test_calibration_truth.py +0 -0
  243. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/tests/test_checks.py +0 -0
  244. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/tests/test_claude_cli_bounce.py +0 -0
  245. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/tests/test_clear_stale.py +0 -0
  246. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/tests/test_cloud_git_metadata.py +0 -0
  247. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/tests/test_cloud_manifest.py +0 -0
  248. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/tests/test_cloud_reports.py +0 -0
  249. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/tests/test_coderabbit_cli_audit_pr.py +0 -0
  250. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/tests/test_doctor_actions_cost_summary.py +0 -0
  251. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/tests/test_doctor_actions_failure_selection.py +0 -0
  252. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/tests/test_doctor_boundaries.py +0 -0
  253. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/tests/test_doctor_github_checks.py +0 -0
  254. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/tests/test_doctor_output.py +0 -0
  255. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/tests/test_doctor_privacy.py +0 -0
  256. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/tests/test_doctor_provider_env_required.py +0 -0
  257. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/tests/test_doctor_provider_env_tokens.py +0 -0
  258. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/tests/test_doctor_provider_probe.py +0 -0
  259. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/tests/test_doctor_provider_review_hygiene.py +0 -0
  260. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/tests/test_doctor_registry.py +0 -0
  261. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/tests/test_local_llm_github_helpers.py +0 -0
  262. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/tests/test_provider_runners_comments.py +0 -0
  263. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/tests/test_provider_runners_git.py +0 -0
  264. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/tests/test_provider_runners_github_pr.py +0 -0
  265. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/tests/test_provider_runners_pr_worktree.py +0 -0
  266. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/tests/test_provider_runners_process.py +0 -0
  267. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/tests/test_provider_runners_repo_paths.py +0 -0
  268. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/tests/test_provider_runners_text_schema.py +0 -0
  269. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/tests/test_provider_runners_workspace.py +0 -0
  270. {code_mower-0.5.0b29 → code_mower-0.5.0b30}/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.0b29
3
+ Version: 0.5.0b30
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.0b29
104
+ pipx install --python python3.12 code-mower==0.5.0b30
105
105
  code-mower --version
106
106
  ```
107
107
 
108
- `0.5.0b29` is a beta release. Until Code Mower publishes a stable `1.0`
108
+ `0.5.0b30` 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.0b29`.
151
+ the latest 10/10 public-package readiness proof for `code-mower==0.5.0b30`.
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.29` from
256
+ The current public beta is `v0.5.0-beta.30` from
257
257
  [codemower-ai/code-mower](https://github.com/codemower-ai/code-mower), published
258
- as `code-mower==0.5.0b29` on [PyPI](https://pypi.org/project/code-mower/).
258
+ as `code-mower==0.5.0b30` 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.0b29
89
+ pipx install --python python3.12 code-mower==0.5.0b30
90
90
  code-mower --version
91
91
  ```
92
92
 
93
- `0.5.0b29` is a beta release. Until Code Mower publishes a stable `1.0`
93
+ `0.5.0b30` 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.0b29`.
136
+ the latest 10/10 public-package readiness proof for `code-mower==0.5.0b30`.
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.29` from
241
+ The current public beta is `v0.5.0-beta.30` from
242
242
  [codemower-ai/code-mower](https://github.com/codemower-ai/code-mower), published
243
- as `code-mower==0.5.0b29` on [PyPI](https://pypi.org/project/code-mower/).
243
+ as `code-mower==0.5.0b30` 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.0b29"
7
+ version = "0.5.0b30"
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.0b29"
3
+ __version__ = "0.5.0b30"
@@ -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.0b29`, or run source checkouts with "
17
+ "`pipx install code-mower==0.5.0b30`, or run source checkouts with "
18
18
  "`PYTHONPATH=src python -m code_mower.cli`."
19
19
  )
20
20
 
@@ -669,6 +669,35 @@ def main(argv: list[str] | None = None) -> int:
669
669
  print(f"Repositories: {result['repo_count']}")
670
670
  print(f"Steps: {result['step_count']}")
671
671
  print(f"Errors: {result['error_count']}")
672
+ summary = result.get("data_class_summary", {})
673
+ if isinstance(summary, dict):
674
+ current = summary.get("current_dogfood", {})
675
+ history = summary.get("imported_history", {})
676
+ reviewer = summary.get("reviewer_evidence", {})
677
+ print(
678
+ "Current dogfood: "
679
+ f"{current.get('steps', 0)} steps, "
680
+ f"{current.get('events', 0)} events"
681
+ )
682
+ print(
683
+ "Imported history: "
684
+ f"{history.get('steps', 0)} steps, "
685
+ f"{history.get('events', 0)} events "
686
+ "(not calibration evidence)"
687
+ )
688
+ print(
689
+ "Reviewer evidence: "
690
+ f"{reviewer.get('steps', 0)} steps, "
691
+ f"{reviewer.get('events', 0)} events"
692
+ )
693
+ guidance = (
694
+ history.get("trust_guidance", {})
695
+ if isinstance(history, dict)
696
+ else {}
697
+ )
698
+ if guidance and history.get("events", 0):
699
+ print(f"History use: {guidance.get('use_for', '')}")
700
+ print(f"History next: {guidance.get('next_step', '')}")
672
701
  return 0 if result["error_count"] == 0 else 1
673
702
  except CloudBundleError as exc:
674
703
  print(f"error: {exc}", file=sys.stderr)
@@ -413,6 +413,58 @@ def repo_sync_output_name(repo_slug: str, repo_path: Path, index: int) -> str:
413
413
  return f"{cleaned or 'repo'}-{index + 1}"
414
414
 
415
415
 
416
+ def build_repo_sync_data_class_summary(
417
+ repos: list[dict[str, Any]],
418
+ ) -> dict[str, dict[str, Any]]:
419
+ """Summarize synced data by dashboard provenance class."""
420
+
421
+ summary: dict[str, dict[str, Any]] = {
422
+ "current_dogfood": {
423
+ "steps": 0,
424
+ "events": 0,
425
+ "description": "current repo metadata and provider inventory",
426
+ },
427
+ "imported_history": {
428
+ "steps": 0,
429
+ "events": 0,
430
+ "description": "sanitized GitHub Actions history",
431
+ "trust_guidance": CATCH_UP_TRUST_GUIDANCE,
432
+ },
433
+ "reviewer_evidence": {
434
+ "steps": 0,
435
+ "events": 0,
436
+ "description": "metadata-only reviewer verdict artifacts",
437
+ },
438
+ }
439
+ for repo in repos:
440
+ steps = repo.get("steps")
441
+ if not isinstance(steps, list):
442
+ continue
443
+ for step in steps:
444
+ if not isinstance(step, dict):
445
+ continue
446
+ mode = str(step.get("mode") or "")
447
+ if mode == "cloud-dogfood":
448
+ target = summary["current_dogfood"]
449
+ target["steps"] += 1
450
+ export = step.get("export")
451
+ if isinstance(export, dict):
452
+ target["events"] += int(export.get("event_count") or 0)
453
+ elif mode == "cloud-catch-up":
454
+ target = summary["imported_history"]
455
+ target["steps"] += 1
456
+ catch_up = step.get("catch_up")
457
+ if isinstance(catch_up, dict):
458
+ target["events"] += int(catch_up.get("event_count") or 0)
459
+ else:
460
+ target["events"] += int(step.get("run_count") or 0)
461
+ elif mode == "cloud-reviewer-runs":
462
+ target = summary["reviewer_evidence"]
463
+ target["steps"] += 1
464
+ target["events"] += int(step.get("event_count") or 0)
465
+ return summary
466
+
467
+
416
468
  def repo_sync_upload(
417
469
  *,
418
470
  repo_specs: list[str],
@@ -524,5 +576,6 @@ def repo_sync_upload(
524
576
  "step_count": sum(len(repo["steps"]) for repo in repos),
525
577
  "error_count": error_count,
526
578
  "modes": selected_modes,
579
+ "data_class_summary": build_repo_sync_data_class_summary(repos),
527
580
  "repos": repos,
528
581
  }
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: code-mower
3
- Version: 0.5.0b29
3
+ Version: 0.5.0b30
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.0b29
104
+ pipx install --python python3.12 code-mower==0.5.0b30
105
105
  code-mower --version
106
106
  ```
107
107
 
108
- `0.5.0b29` is a beta release. Until Code Mower publishes a stable `1.0`
108
+ `0.5.0b30` 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.0b29`.
151
+ the latest 10/10 public-package readiness proof for `code-mower==0.5.0b30`.
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.29` from
256
+ The current public beta is `v0.5.0-beta.30` from
257
257
  [codemower-ai/code-mower](https://github.com/codemower-ai/code-mower), published
258
- as `code-mower==0.5.0b29` on [PyPI](https://pypi.org/project/code-mower/).
258
+ as `code-mower==0.5.0b30` 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
 
@@ -304,7 +304,7 @@ def test_provenance_summary_preserves_source_quality_fields() -> None:
304
304
  "tool": {
305
305
  "role": "reporter",
306
306
  "tool_name": "code-mower",
307
- "tool_version": "0.5.0b29",
307
+ "tool_version": "0.5.0b30",
308
308
  "provider": "code-mower",
309
309
  "model": "",
310
310
  "model_source": "not_applicable",
@@ -622,6 +622,37 @@ def test_cloud_repo_sync_helpers_live_in_client_module() -> None:
622
622
  assert repo_sync_output_name("Owner/Repo", Path("/tmp/repo"), 2) == "owner--repo-3"
623
623
 
624
624
 
625
+ def test_cloud_repo_sync_data_class_summary_separates_sources() -> None:
626
+ summary = cloud_operations.build_repo_sync_data_class_summary(
627
+ [
628
+ {
629
+ "steps": [
630
+ {
631
+ "mode": "cloud-dogfood",
632
+ "export": {"event_count": 16},
633
+ },
634
+ {
635
+ "mode": "cloud-catch-up",
636
+ "catch_up": {"event_count": 50},
637
+ },
638
+ {
639
+ "mode": "cloud-reviewer-runs",
640
+ "event_count": 7,
641
+ },
642
+ ]
643
+ }
644
+ ]
645
+ )
646
+
647
+ assert summary["current_dogfood"]["steps"] == 1
648
+ assert summary["current_dogfood"]["events"] == 16
649
+ assert summary["imported_history"]["steps"] == 1
650
+ assert summary["imported_history"]["events"] == 50
651
+ assert summary["imported_history"]["trust_guidance"] == cloud_operations.CATCH_UP_TRUST_GUIDANCE
652
+ assert summary["reviewer_evidence"]["steps"] == 1
653
+ assert summary["reviewer_evidence"]["events"] == 7
654
+
655
+
625
656
  def test_cloud_py_keeps_legacy_operation_aliases() -> None:
626
657
  assert cloud_cli._dogfood_upload is dogfood_upload
627
658
  assert cloud_cli._repo_sync_output_name("owner/repo", Path("/tmp/repo"), 0) == "owner--repo-1"
@@ -436,11 +436,11 @@ def test_provider_lane_tool_provenance_reads_model_from_selected_profile(
436
436
  def test_code_mower_reporter_provenance_marks_model_not_applicable() -> None:
437
437
  tool = build_code_mower_tool_provenance(
438
438
  source="unit-test",
439
- version="0.5.0b29",
439
+ version="0.5.0b30",
440
440
  )
441
441
 
442
442
  assert tool["tool_name"] == "code-mower"
443
- assert tool["tool_version"] == "0.5.0b29"
443
+ assert tool["tool_version"] == "0.5.0b30"
444
444
  assert tool["provider"] == "code-mower"
445
445
  assert tool["model"] == ""
446
446
  assert tool["model_source"] == "not_applicable"
@@ -49,7 +49,7 @@ from scripts import privacy_scan
49
49
 
50
50
  class ReleaseHygieneTests(unittest.TestCase):
51
51
  def test_version_is_current_v05_prerelease(self) -> None:
52
- self.assertEqual(__version__, "0.5.0b29")
52
+ self.assertEqual(__version__, "0.5.0b30")
53
53
 
54
54
  def test_release_workflow_verifies_downloaded_distributions_before_publish(self) -> None:
55
55
  workflow = (ROOT / ".github/workflows/release.yml").read_text(encoding="utf-8")
@@ -199,7 +199,7 @@ class ReleaseHygieneTests(unittest.TestCase):
199
199
  self.assertIn(
200
200
  (
201
201
  "code-mower migration package-install-rehearsal --package-spec "
202
- "code-mower==0.5.0b29 --json"
202
+ "code-mower==0.5.0b30 --json"
203
203
  ),
204
204
  help_text,
205
205
  )
@@ -1614,8 +1614,8 @@ printf '%s\\n' "${lane}"
1614
1614
  fromlist=["current_alpha_package_spec"],
1615
1615
  )
1616
1616
  self.assertEqual(
1617
- legacy_module.current_alpha_package_spec("0.5.0b29"),
1618
- "code-mower==0.5.0b29",
1617
+ legacy_module.current_alpha_package_spec("0.5.0b30"),
1618
+ "code-mower==0.5.0b30",
1619
1619
  )
1620
1620
  finally:
1621
1621
  sys.path[:] = original_path
@@ -1652,7 +1652,7 @@ printf '%s\\n' "${lane}"
1652
1652
  "-c",
1653
1653
  (
1654
1654
  "from tools import code_mower_package_content as c; "
1655
- "print(c.current_alpha_package_spec('0.5.0b29'))"
1655
+ "print(c.current_alpha_package_spec('0.5.0b30'))"
1656
1656
  ),
1657
1657
  ],
1658
1658
  cwd=tmp_path,
@@ -1665,7 +1665,7 @@ printf '%s\\n' "${lane}"
1665
1665
  self.assertEqual(completed.returncode, 0, completed.stderr)
1666
1666
  self.assertEqual(
1667
1667
  completed.stdout.strip(),
1668
- "code-mower==0.5.0b29",
1668
+ "code-mower==0.5.0b30",
1669
1669
  )
1670
1670
 
1671
1671
  def test_package_rendering_legacy_fallback_stays_valid_yaml_subset(self) -> None:
@@ -1741,11 +1741,11 @@ printf '%s\\n' "${lane}"
1741
1741
  (output_dir / "src/code_mower/cloud_client/dogfood.py").is_file()
1742
1742
  )
1743
1743
  self.assertIn(
1744
- 'version = "0.5.0b29"',
1744
+ 'version = "0.5.0b30"',
1745
1745
  (output_dir / "pyproject.toml").read_text(encoding="utf-8"),
1746
1746
  )
1747
1747
  self.assertIn(
1748
- '__version__ = "0.5.0b29"',
1748
+ '__version__ = "0.5.0b30"',
1749
1749
  (output_dir / "src/code_mower/__init__.py").read_text(
1750
1750
  encoding="utf-8"
1751
1751
  ),
@@ -2779,6 +2779,50 @@ def main():
2779
2779
  )
2780
2780
  self.assertEqual(steps[1]["status"], "no_events")
2781
2781
 
2782
+ def test_cloud_repo_sync_cli_text_summarizes_data_classes(self) -> None:
2783
+ with tempfile.TemporaryDirectory() as tmp:
2784
+ root = Path(tmp)
2785
+ subprocess.run(["git", "init"], cwd=root, check=True, capture_output=True)
2786
+ subprocess.run(
2787
+ ["git", "config", "user.email", "test@example.com"],
2788
+ cwd=root,
2789
+ check=True,
2790
+ )
2791
+ subprocess.run(
2792
+ ["git", "config", "user.name", "Test"],
2793
+ cwd=root,
2794
+ check=True,
2795
+ )
2796
+ (root / "README.md").write_text("fixture\n", encoding="utf-8")
2797
+ subprocess.run(["git", "add", "README.md"], cwd=root, check=True)
2798
+ subprocess.run(
2799
+ ["git", "commit", "-m", "fixture"],
2800
+ cwd=root,
2801
+ check=True,
2802
+ capture_output=True,
2803
+ )
2804
+
2805
+ output = StringIO()
2806
+ with redirect_stdout(output):
2807
+ code = code_mower_cloud.main(
2808
+ [
2809
+ "repo-sync",
2810
+ "--repo",
2811
+ f"owner/repo={root}",
2812
+ "--output-dir",
2813
+ str(root / ".code-mower/cloud-repo-sync"),
2814
+ "--endpoint",
2815
+ "http://localhost:3000/api/ingest",
2816
+ ]
2817
+ )
2818
+
2819
+ self.assertEqual(code, 0)
2820
+ text = output.getvalue()
2821
+ self.assertIn("Code Mower cloud repo sync", text)
2822
+ self.assertIn("Current dogfood: 1 steps, ", text)
2823
+ self.assertIn("Imported history: 0 steps, 0 events (not calibration evidence)", text)
2824
+ self.assertIn("Reviewer evidence: 1 steps, 0 events", text)
2825
+
2782
2826
  def test_cloud_repo_sync_reviewer_only_no_events_is_not_uploaded(self) -> None:
2783
2827
  with tempfile.TemporaryDirectory() as tmp:
2784
2828
  root = Path(tmp)
@@ -3236,7 +3280,7 @@ def main():
3236
3280
  {
3237
3281
  "status": "pass",
3238
3282
  "package_spec": "code-mower",
3239
- "version": "code-mower 0.5.0b29",
3283
+ "version": "code-mower 0.5.0b30",
3240
3284
  "work_dir": "/tmp/code-mower-rehearsal",
3241
3285
  "toy_repo": "/tmp/code-mower-rehearsal/toy-repo",
3242
3286
  "step_count": 1,
@@ -3348,7 +3392,7 @@ def main():
3348
3392
  scorecard = code_mower_migration._first_user_readiness_scorecard(
3349
3393
  toy_repo=toy_repo,
3350
3394
  outputs=outputs,
3351
- version="code-mower 0.5.0b29",
3395
+ version="code-mower 0.5.0b30",
3352
3396
  steps=[
3353
3397
  {
3354
3398
  "command": ["code-mower", "doctor", "--easy", "--json"],
@@ -3427,7 +3471,7 @@ def main():
3427
3471
  scorecard = code_mower_migration._first_user_readiness_scorecard(
3428
3472
  toy_repo=toy_repo,
3429
3473
  outputs=outputs,
3430
- version="code-mower 0.5.0b29",
3474
+ version="code-mower 0.5.0b30",
3431
3475
  steps=[
3432
3476
  {
3433
3477
  "command": ["code-mower", "doctor", "--easy", "--json"],
@@ -3489,7 +3533,7 @@ def main():
3489
3533
  scorecard = code_mower_migration._first_user_readiness_scorecard(
3490
3534
  toy_repo=toy_repo,
3491
3535
  outputs=outputs,
3492
- version="code-mower 0.5.0b29",
3536
+ version="code-mower 0.5.0b30",
3493
3537
  steps=[
3494
3538
  {
3495
3539
  "command": ["code-mower", "doctor", "--easy", "--json"],
@@ -3555,24 +3599,24 @@ def main():
3555
3599
  )
3556
3600
  self.assertEqual(
3557
3601
  code_mower_migration._resolve_install_package_spec(
3558
- "git+https://github.com/codemower-ai/code-mower.git@v0.5.0-beta.29",
3602
+ "git+https://github.com/codemower-ai/code-mower.git@v0.5.0-beta.30",
3559
3603
  base_dir=package,
3560
3604
  ),
3561
- "git+https://github.com/codemower-ai/code-mower.git@v0.5.0-beta.29",
3605
+ "git+https://github.com/codemower-ai/code-mower.git@v0.5.0-beta.30",
3562
3606
  )
3563
3607
  self.assertEqual(
3564
3608
  code_mower_migration._resolve_install_package_spec(
3565
- "code-mower==0.5.0b29",
3609
+ "code-mower==0.5.0b30",
3566
3610
  base_dir=package,
3567
3611
  ),
3568
- "code-mower==0.5.0b29",
3612
+ "code-mower==0.5.0b30",
3569
3613
  )
3570
3614
 
3571
3615
  def test_package_install_rehearsal_supports_index_aware_pip_install(self) -> None:
3572
3616
  self.assertEqual(
3573
3617
  code_mower_migration._pip_install_command(
3574
3618
  Path("/tmp/venv/bin/python"),
3575
- "code-mower==0.5.0b29",
3619
+ "code-mower==0.5.0b30",
3576
3620
  pip_index_url="https://test.pypi.org/simple/",
3577
3621
  pip_extra_index_urls=["https://pypi.org/simple/"],
3578
3622
  ),
@@ -3585,7 +3629,7 @@ def main():
3585
3629
  "https://test.pypi.org/simple/",
3586
3630
  "--extra-index-url",
3587
3631
  "https://pypi.org/simple/",
3588
- "code-mower==0.5.0b29",
3632
+ "code-mower==0.5.0b30",
3589
3633
  ],
3590
3634
  )
3591
3635
 
@@ -3605,10 +3649,10 @@ def main():
3605
3649
  payload = release_readiness.render_release_readiness(ROOT)
3606
3650
 
3607
3651
  self.assertEqual(payload["status"], "pass")
3608
- self.assertEqual(payload["version"], "0.5.0b29")
3609
- self.assertEqual(payload["release_tag"], "v0.5.0-beta.29")
3610
- self.assertEqual(payload["alpha_tag"], "v0.5.0-beta.29")
3611
- self.assertEqual(payload["package_index_spec"], "code-mower==0.5.0b29")
3652
+ self.assertEqual(payload["version"], "0.5.0b30")
3653
+ self.assertEqual(payload["release_tag"], "v0.5.0-beta.30")
3654
+ self.assertEqual(payload["alpha_tag"], "v0.5.0-beta.30")
3655
+ self.assertEqual(payload["package_index_spec"], "code-mower==0.5.0b30")
3612
3656
  check_ids = {check["id"]: check for check in payload["checks"]}
3613
3657
  self.assertEqual(check_ids["package-version-consistency"]["status"], "pass")
3614
3658
  self.assertEqual(
@@ -3657,7 +3701,7 @@ def main():
3657
3701
  check_ids = {check["id"]: check for check in payload["checks"]}
3658
3702
  check = check_ids["materialized-package-version-consistency"]
3659
3703
  self.assertEqual(check["status"], "fail")
3660
- self.assertEqual(check["detail"]["source_version"], "0.5.0b29")
3704
+ self.assertEqual(check["detail"]["source_version"], "0.5.0b30")
3661
3705
  self.assertEqual(check["detail"]["generated_init_version"], "0.0.0")
3662
3706
 
3663
3707
  def test_public_support_docs_are_packaged_and_privacy_forward(self) -> None:
@@ -3737,20 +3781,20 @@ def main():
3737
3781
 
3738
3782
  def test_release_readiness_tag_derivation_supports_release_stages(self) -> None:
3739
3783
  self.assertEqual(
3740
- release_readiness._release_tag_for_version("0.5.0b29"),
3741
- "v0.5.0-beta.29",
3784
+ release_readiness._release_tag_for_version("0.5.0b30"),
3785
+ "v0.5.0-beta.30",
3742
3786
  )
3743
3787
  self.assertEqual(
3744
- code_mower_versioning.release_tag_for_version("0.5.0b29"),
3745
- "v0.5.0-beta.29",
3788
+ code_mower_versioning.release_tag_for_version("0.5.0b30"),
3789
+ "v0.5.0-beta.30",
3746
3790
  )
3747
3791
  self.assertEqual(
3748
- release_readiness._release_tag_for_version("0.5.0b29"),
3749
- "v0.5.0-beta.29",
3792
+ release_readiness._release_tag_for_version("0.5.0b30"),
3793
+ "v0.5.0-beta.30",
3750
3794
  )
3751
3795
  self.assertEqual(
3752
- code_mower_versioning.release_tag_for_version("0.5.0b29"),
3753
- "v0.5.0-beta.29",
3796
+ code_mower_versioning.release_tag_for_version("0.5.0b30"),
3797
+ "v0.5.0-beta.30",
3754
3798
  )
3755
3799
  self.assertEqual(
3756
3800
  release_readiness._release_tag_for_version("1.0.0rc1"),
@@ -3779,8 +3823,8 @@ def main():
3779
3823
  next_steps.current_alpha_package_spec(),
3780
3824
  )
3781
3825
  self.assertEqual(
3782
- code_mower_package_content.current_alpha_package_spec("0.5.0b29"),
3783
- "code-mower==0.5.0b29",
3826
+ code_mower_package_content.current_alpha_package_spec("0.5.0b30"),
3827
+ "code-mower==0.5.0b30",
3784
3828
  )
3785
3829
  self.assertNotIn(next_steps.current_public_tag(), package_content_text)
3786
3830
  self.assertNotIn("v0.0.0", package_content_text)
@@ -3952,7 +3996,7 @@ def main():
3952
3996
  step for step in plan["steps"] if step["id"] == "package-install-rehearsal"
3953
3997
  )
3954
3998
  self.assertIn("doctor --v05", doctor_step["command"])
3955
- self.assertIn("code-mower==0.5.0b29", package_step["command"])
3999
+ self.assertIn("code-mower==0.5.0b30", package_step["command"])
3956
4000
  self.assertIn("current published PyPI prerelease", package_step["why"])
3957
4001
  self.assertIn("first_user_readiness", package_step["why"])
3958
4002
  self.assertEqual(
File without changes
File without changes
File without changes
File without changes
File without changes