code-mower 0.5.0b29__tar.gz → 0.5.0b31__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 (272) hide show
  1. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/PKG-INFO +30 -6
  2. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/README.md +29 -5
  3. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/pyproject.toml +1 -1
  4. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/__init__.py +1 -1
  5. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/cli.py +13 -1
  6. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/cloud.py +29 -0
  7. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/cloud_client/operations.py +53 -0
  8. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/package_manifest.py +2 -0
  9. code_mower-0.5.0b31/src/code_mower/work_orders.py +992 -0
  10. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower.egg-info/PKG-INFO +30 -6
  11. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower.egg-info/SOURCES.txt +3 -1
  12. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/tests/test_cloud_client.py +32 -1
  13. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/tests/test_provider_local_cli.py +2 -2
  14. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/tests/test_release_hygiene.py +86 -34
  15. code_mower-0.5.0b31/tests/test_work_orders.py +320 -0
  16. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/CODE_OF_CONDUCT.md +0 -0
  17. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/LICENSE +0 -0
  18. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/MANIFEST.in +0 -0
  19. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/NOTICE +0 -0
  20. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/SUPPORT.md +0 -0
  21. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/requirements/requirements.txt +0 -0
  22. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/setup.cfg +0 -0
  23. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/adapters/__init__.py +0 -0
  24. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/adapters/_base.py +0 -0
  25. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/adapters/cursor_bugbot.py +0 -0
  26. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/adapters/gitar.py +0 -0
  27. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/adapters/greptile.py +0 -0
  28. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/adapters/qodo.py +0 -0
  29. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/antigravity_cli_audit_pr.py +0 -0
  30. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/audit_handoff_log.py +0 -0
  31. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/audit_labeler_lib.py +0 -0
  32. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/audit_progress.py +0 -0
  33. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/blind_review_artifacts.py +0 -0
  34. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/blind_review_coordinator.py +0 -0
  35. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/bootstrap.py +0 -0
  36. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/builder_experiment.py +0 -0
  37. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/calibration/__init__.py +0 -0
  38. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/calibration/arms.py +0 -0
  39. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/calibration/auto_discovery.py +0 -0
  40. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/calibration/commands.py +0 -0
  41. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/calibration/context_inputs.py +0 -0
  42. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/calibration/corpus.py +0 -0
  43. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/calibration/effect_report.py +0 -0
  44. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/calibration/evidence.py +0 -0
  45. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/calibration/evidence_report.py +0 -0
  46. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/calibration/identity.py +0 -0
  47. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/calibration/metrics.py +0 -0
  48. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/calibration/overlap.py +0 -0
  49. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/calibration/planning.py +0 -0
  50. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/calibration/policy.py +0 -0
  51. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/calibration/results.py +0 -0
  52. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/calibration/run_results.py +0 -0
  53. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/calibration/run_status.py +0 -0
  54. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/calibration/runner.py +0 -0
  55. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/calibration/truth.py +0 -0
  56. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/calibration/value_report.py +0 -0
  57. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/checks.py +0 -0
  58. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/claude_audit_pr.py +0 -0
  59. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/claude_cli_bounce.py +0 -0
  60. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/claude_cli_environment.py +0 -0
  61. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/clear_stale.py +0 -0
  62. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/cloud_client/__init__.py +0 -0
  63. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/cloud_client/bundle.py +0 -0
  64. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/cloud_client/doctor.py +0 -0
  65. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/cloud_client/dogfood.py +0 -0
  66. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/cloud_client/endpoints.py +0 -0
  67. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/cloud_client/errors.py +0 -0
  68. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/cloud_client/events.py +0 -0
  69. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/cloud_client/export.py +0 -0
  70. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/cloud_client/git_metadata.py +0 -0
  71. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/cloud_client/manifest.py +0 -0
  72. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/cloud_client/reports.py +0 -0
  73. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/cloud_client/setup.py +0 -0
  74. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/cloud_client/upload.py +0 -0
  75. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/code_mower_calibration.py +0 -0
  76. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/code_mower_context_packs.py +0 -0
  77. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/code_mower_merge.py +0 -0
  78. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/code_mower_telemetry.py +0 -0
  79. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/coderabbit_cli_audit_pr.py +0 -0
  80. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/codex_audit_env_preflight.py +0 -0
  81. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/codex_audit_pr.py +0 -0
  82. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/codex_audit_schema_smoke.py +0 -0
  83. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/codex_audit_verdict.schema.json +0 -0
  84. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/config.py +0 -0
  85. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/doctor.py +0 -0
  86. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/doctor_checks/__init__.py +0 -0
  87. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/doctor_checks/cloud.py +0 -0
  88. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/doctor_checks/common.py +0 -0
  89. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/doctor_checks/github.py +0 -0
  90. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/doctor_checks/github_actions.py +0 -0
  91. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/doctor_checks/github_actions_cost.py +0 -0
  92. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/doctor_checks/github_actions_cost_summary.py +0 -0
  93. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/doctor_checks/github_actions_failure_annotations.py +0 -0
  94. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/doctor_checks/github_actions_failure_models.py +0 -0
  95. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/doctor_checks/github_actions_failure_scan.py +0 -0
  96. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/doctor_checks/github_actions_failure_selection.py +0 -0
  97. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/doctor_checks/github_actions_failures.py +0 -0
  98. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/doctor_checks/github_actions_permissions.py +0 -0
  99. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/doctor_checks/github_api.py +0 -0
  100. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/doctor_checks/github_branch.py +0 -0
  101. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/doctor_checks/github_config.py +0 -0
  102. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/doctor_checks/github_provider.py +0 -0
  103. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/doctor_checks/github_repo.py +0 -0
  104. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/doctor_checks/groups.py +0 -0
  105. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/doctor_checks/models.py +0 -0
  106. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/doctor_checks/output.py +0 -0
  107. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/doctor_checks/presets.py +0 -0
  108. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/doctor_checks/privacy.py +0 -0
  109. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/doctor_checks/provider_api_model.py +0 -0
  110. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/doctor_checks/provider_api_model_openai.py +0 -0
  111. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/doctor_checks/provider_api_model_profiles.py +0 -0
  112. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/doctor_checks/provider_env.py +0 -0
  113. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/doctor_checks/provider_env_required.py +0 -0
  114. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/doctor_checks/provider_env_tokens.py +0 -0
  115. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/doctor_checks/provider_local_cli.py +0 -0
  116. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/doctor_checks/provider_local_cli_commands.py +0 -0
  117. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/doctor_checks/provider_local_cli_probe_config.py +0 -0
  118. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/doctor_checks/provider_probe.py +0 -0
  119. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/doctor_checks/provider_probe_auth.py +0 -0
  120. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/doctor_checks/provider_probe_evaluation.py +0 -0
  121. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/doctor_checks/provider_probe_json.py +0 -0
  122. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/doctor_checks/provider_probe_remediation.py +0 -0
  123. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/doctor_checks/provider_review_hygiene.py +0 -0
  124. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/doctor_checks/providers.py +0 -0
  125. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/doctor_checks/registry.py +0 -0
  126. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/doctor_checks/runner.py +0 -0
  127. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/doctor_checks/runtime.py +0 -0
  128. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/doctor_checks/runtime_github_auth.py +0 -0
  129. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/gemini_cli_audit_pr.py +0 -0
  130. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/hermes_cli_audit_pr.py +0 -0
  131. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/init.py +0 -0
  132. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/lane_configs/__init__.py +0 -0
  133. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/lane_configs/aider.py +0 -0
  134. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/lane_configs/antigravity_cli.py +0 -0
  135. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/lane_configs/claude.py +0 -0
  136. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/lane_configs/codex.py +0 -0
  137. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/lane_configs/devin.py +0 -0
  138. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/lane_configs/gemini_cli.py +0 -0
  139. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/lane_configs/hermes_cli.py +0 -0
  140. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/lane_configs/local_llm.py +0 -0
  141. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/local_llm_audit_pr.py +0 -0
  142. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/local_llm_bakeoff.py +0 -0
  143. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/local_llm_calibration.py +0 -0
  144. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/local_llm_profiles.py +0 -0
  145. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/migration.py +0 -0
  146. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/migration_install.py +0 -0
  147. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/migration_mirror.py +0 -0
  148. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/migration_readiness.py +0 -0
  149. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/migration_rehearsal.py +0 -0
  150. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/next_steps.py +0 -0
  151. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/package.py +0 -0
  152. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/package_content.py +0 -0
  153. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/package_paths.py +0 -0
  154. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/package_rendering.py +0 -0
  155. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/package_static.py +0 -0
  156. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/prompts.py +0 -0
  157. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/provider_registry.py +0 -0
  158. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/provider_runners/__init__.py +0 -0
  159. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/provider_runners/comments.py +0 -0
  160. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/provider_runners/git.py +0 -0
  161. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/provider_runners/github_auth.py +0 -0
  162. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/provider_runners/github_pr.py +0 -0
  163. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/provider_runners/pr_worktree.py +0 -0
  164. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/provider_runners/process.py +0 -0
  165. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/provider_runners/repo_paths.py +0 -0
  166. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/provider_runners/text_schema.py +0 -0
  167. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/provider_runners/verdict_artifacts.py +0 -0
  168. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/provider_runners/workspace.py +0 -0
  169. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/providers/__init__.py +0 -0
  170. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/providers/local_cli.py +0 -0
  171. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/providers/provenance.py +0 -0
  172. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/release_readiness.py +0 -0
  173. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/reviewer_metrics.py +0 -0
  174. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/saas_reviewer_labeler.py +0 -0
  175. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/secrets.py +0 -0
  176. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/templates/builder-experiment.example.json +0 -0
  177. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/templates/calibration-corpus.example.json +0 -0
  178. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/templates/calibration-corpus.json +0 -0
  179. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/templates/code-mower.example.yml +0 -0
  180. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/templates/context-packs.example.json +0 -0
  181. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/templates/lane_prompts/base-audit.md +0 -0
  182. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/templates/lane_prompts/calibration-policy.md +0 -0
  183. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/templates/lane_prompts/context-driven-quality.md +0 -0
  184. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/templates/lane_prompts/docs-design.md +0 -0
  185. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/templates/lane_prompts/generic-programming.md +0 -0
  186. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/templates/lane_prompts/operability.md +0 -0
  187. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/templates/lane_prompts/package-runtime.md +0 -0
  188. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/templates/lane_prompts/security-threat-model.md +0 -0
  189. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/templates/product-support/code_mower +0 -0
  190. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/templates/product-support/code_mower_standalone_pin.env +0 -0
  191. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/templates/product-support/code_mower_standalone_shadow.sh +0 -0
  192. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/templates/product-support/run_claude_audit_pr.sh +0 -0
  193. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/templates/product-support/run_codex_audit_pr.sh +0 -0
  194. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/templates/product-support/safe_gh_comment.py +0 -0
  195. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/templates/providers.yml +0 -0
  196. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/templates/reviewer-spend.example.json +0 -0
  197. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/templates/reviewer-value-report.example.md +0 -0
  198. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/templates/workflows/audit-label-cleanup.yml.j2 +0 -0
  199. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/templates/workflows/hosted-bridge.yml.j2 +0 -0
  200. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/templates/workflows/local-cli-audit.yml.j2 +0 -0
  201. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/templates/workflows/private-standalone-shadow.yml.j2 +0 -0
  202. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/templates/workflows/review-clear-stale.yml.j2 +0 -0
  203. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/templates/workflows/saas-reviewer-labeler.yml.j2 +0 -0
  204. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/templates/workflows/trailer-comment-labeler.yml.j2 +0 -0
  205. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/trailer_comment_labeler.py +0 -0
  206. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower/versioning.py +0 -0
  207. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower.egg-info/dependency_links.txt +0 -0
  208. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower.egg-info/entry_points.txt +0 -0
  209. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower.egg-info/requires.txt +0 -0
  210. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/src/code_mower.egg-info/top_level.txt +0 -0
  211. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/templates/builder-experiment.example.json +0 -0
  212. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/templates/calibration-corpus.example.json +0 -0
  213. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/templates/calibration-corpus.json +0 -0
  214. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/templates/code-mower.yml.j2 +0 -0
  215. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/templates/context-packs.example.json +0 -0
  216. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/templates/cursor/BUGBOT.md +0 -0
  217. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/templates/providers/acp_bridge.yml +0 -0
  218. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/templates/providers/aider.yml +0 -0
  219. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/templates/providers/antigravity_cli.yml +0 -0
  220. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/templates/providers/claude_audit.yml +0 -0
  221. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/templates/providers/claude_review.yml +0 -0
  222. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/templates/providers/coderabbit_cli.yml +0 -0
  223. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/templates/providers/codex.yml +0 -0
  224. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/templates/providers/cursor_bugbot.yml +0 -0
  225. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/templates/providers/devin.yml +0 -0
  226. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/templates/providers/gemini_cli.yml +0 -0
  227. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/templates/providers/gitar.yml +0 -0
  228. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/templates/providers/greptile.yml +0 -0
  229. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/templates/providers/hermes_cli.yml +0 -0
  230. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/templates/providers/local_llm.yml +0 -0
  231. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/templates/providers/qodo.yml +0 -0
  232. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/templates/providers.yml +0 -0
  233. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/templates/reviewer-spend.example.json +0 -0
  234. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/templates/reviewer-value-report.example.md +0 -0
  235. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/templates/workflows/audit-label-cleanup.yml.j2 +0 -0
  236. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/templates/workflows/blind-review-artifacts-dry-run.yml.j2 +0 -0
  237. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/templates/workflows/hosted-bridge.yml.j2 +0 -0
  238. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/templates/workflows/local-cli-audit.yml.j2 +0 -0
  239. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/templates/workflows/private-standalone-shadow.yml.j2 +0 -0
  240. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/templates/workflows/review-clear-stale.yml.j2 +0 -0
  241. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/templates/workflows/saas-reviewer-labeler.yml.j2 +0 -0
  242. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/templates/workflows/trailer-comment-labeler.yml.j2 +0 -0
  243. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/tests/test_calibration_effect_report.py +0 -0
  244. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/tests/test_calibration_truth.py +0 -0
  245. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/tests/test_checks.py +0 -0
  246. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/tests/test_claude_cli_bounce.py +0 -0
  247. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/tests/test_clear_stale.py +0 -0
  248. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/tests/test_cloud_git_metadata.py +0 -0
  249. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/tests/test_cloud_manifest.py +0 -0
  250. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/tests/test_cloud_reports.py +0 -0
  251. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/tests/test_coderabbit_cli_audit_pr.py +0 -0
  252. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/tests/test_doctor_actions_cost_summary.py +0 -0
  253. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/tests/test_doctor_actions_failure_selection.py +0 -0
  254. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/tests/test_doctor_boundaries.py +0 -0
  255. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/tests/test_doctor_github_checks.py +0 -0
  256. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/tests/test_doctor_output.py +0 -0
  257. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/tests/test_doctor_privacy.py +0 -0
  258. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/tests/test_doctor_provider_env_required.py +0 -0
  259. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/tests/test_doctor_provider_env_tokens.py +0 -0
  260. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/tests/test_doctor_provider_probe.py +0 -0
  261. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/tests/test_doctor_provider_review_hygiene.py +0 -0
  262. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/tests/test_doctor_registry.py +0 -0
  263. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/tests/test_local_llm_github_helpers.py +0 -0
  264. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/tests/test_provider_runners_comments.py +0 -0
  265. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/tests/test_provider_runners_git.py +0 -0
  266. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/tests/test_provider_runners_github_pr.py +0 -0
  267. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/tests/test_provider_runners_pr_worktree.py +0 -0
  268. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/tests/test_provider_runners_process.py +0 -0
  269. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/tests/test_provider_runners_repo_paths.py +0 -0
  270. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/tests/test_provider_runners_text_schema.py +0 -0
  271. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/tests/test_provider_runners_workspace.py +0 -0
  272. {code_mower-0.5.0b29 → code_mower-0.5.0b31}/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.0b31
4
4
  Summary: Multi-reviewer AI code audit orchestration
5
5
  License-Expression: Apache-2.0
6
6
  Requires-Python: >=3.11
@@ -25,6 +25,8 @@ The short version:
25
25
  AI review tools;
26
26
  - run setup diagnostics before a lane can surprise you with spend, source
27
27
  exposure, or GitHub Actions churn;
28
+ - turn issue text, external docs, and project doctrine into local work orders
29
+ before an agent starts coding;
28
30
  - generate local reviewer value reports from known-clean and known-blocked PRs;
29
31
  and
30
32
  - optionally share sanitized metadata with [CodeMower.com](https://codemower.com)
@@ -101,11 +103,11 @@ Code Mower currently targets Python 3.11+; Python 3.12 is recommended.
101
103
 
102
104
  ```bash
103
105
  python3.12 --version
104
- pipx install --python python3.12 code-mower==0.5.0b29
106
+ pipx install --python python3.12 code-mower==0.5.0b31
105
107
  code-mower --version
106
108
  ```
107
109
 
108
- `0.5.0b29` is a beta release. Until Code Mower publishes a stable `1.0`
110
+ `0.5.0b31` is a beta release. Until Code Mower publishes a stable `1.0`
109
111
  line, use the explicit beta version above or allow prereleases with:
110
112
 
111
113
  ```bash
@@ -148,7 +150,29 @@ First-time command map: [docs/launch-command-surface.md](docs/launch-command-sur
148
150
 
149
151
  The current PyPI beta has been rehearsed end-to-end from a clean install:
150
152
  [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`.
153
+ the latest 10/10 public-package readiness proof for `code-mower==0.5.0b31`.
154
+
155
+ ## Optional: Plan Before Coding
156
+
157
+ For larger changes, use GitHub Issues and local work orders as the planning
158
+ surface, then keep pull requests focused on code review and merge readiness:
159
+
160
+ ```bash
161
+ code-mower project-context init --project-name "My Product"
162
+ code-mower context add --external ~/Downloads/product-requirements.md
163
+ code-mower plan from-issue \
164
+ --repo OWNER/REPO \
165
+ --title "Add billing settings" \
166
+ --body-file issue-body.md \
167
+ --output .code-mower/work-orders/billing-settings-plan.md
168
+ code-mower work-order draft \
169
+ --issue-plan .code-mower/work-orders/billing-settings-plan.md \
170
+ --output .code-mower/work-orders/billing-settings.md
171
+ ```
172
+
173
+ The work-order path is local-only by default. External docs are recorded as
174
+ metadata manifests unless you explicitly ask for bounded previews. See
175
+ [docs/planning-work-orders.md](docs/planning-work-orders.md).
152
176
 
153
177
  ## Why Not Just Run Codex Or Claude Yourself?
154
178
 
@@ -253,9 +277,9 @@ best?" to "which AI builder plus reviewer loop ships best on this product?" See
253
277
 
254
278
  ## Installation Status
255
279
 
256
- The current public beta is `v0.5.0-beta.29` from
280
+ The current public beta is `v0.5.0-beta.31` from
257
281
  [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/).
282
+ as `code-mower==0.5.0b31` on [PyPI](https://pypi.org/project/code-mower/).
259
283
  GitHub releases remain the auditable source for tags, build artifacts, and
260
284
  release notes.
261
285
 
@@ -10,6 +10,8 @@ The short version:
10
10
  AI review tools;
11
11
  - run setup diagnostics before a lane can surprise you with spend, source
12
12
  exposure, or GitHub Actions churn;
13
+ - turn issue text, external docs, and project doctrine into local work orders
14
+ before an agent starts coding;
13
15
  - generate local reviewer value reports from known-clean and known-blocked PRs;
14
16
  and
15
17
  - optionally share sanitized metadata with [CodeMower.com](https://codemower.com)
@@ -86,11 +88,11 @@ Code Mower currently targets Python 3.11+; Python 3.12 is recommended.
86
88
 
87
89
  ```bash
88
90
  python3.12 --version
89
- pipx install --python python3.12 code-mower==0.5.0b29
91
+ pipx install --python python3.12 code-mower==0.5.0b31
90
92
  code-mower --version
91
93
  ```
92
94
 
93
- `0.5.0b29` is a beta release. Until Code Mower publishes a stable `1.0`
95
+ `0.5.0b31` is a beta release. Until Code Mower publishes a stable `1.0`
94
96
  line, use the explicit beta version above or allow prereleases with:
95
97
 
96
98
  ```bash
@@ -133,7 +135,29 @@ First-time command map: [docs/launch-command-surface.md](docs/launch-command-sur
133
135
 
134
136
  The current PyPI beta has been rehearsed end-to-end from a clean install:
135
137
  [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`.
138
+ the latest 10/10 public-package readiness proof for `code-mower==0.5.0b31`.
139
+
140
+ ## Optional: Plan Before Coding
141
+
142
+ For larger changes, use GitHub Issues and local work orders as the planning
143
+ surface, then keep pull requests focused on code review and merge readiness:
144
+
145
+ ```bash
146
+ code-mower project-context init --project-name "My Product"
147
+ code-mower context add --external ~/Downloads/product-requirements.md
148
+ code-mower plan from-issue \
149
+ --repo OWNER/REPO \
150
+ --title "Add billing settings" \
151
+ --body-file issue-body.md \
152
+ --output .code-mower/work-orders/billing-settings-plan.md
153
+ code-mower work-order draft \
154
+ --issue-plan .code-mower/work-orders/billing-settings-plan.md \
155
+ --output .code-mower/work-orders/billing-settings.md
156
+ ```
157
+
158
+ The work-order path is local-only by default. External docs are recorded as
159
+ metadata manifests unless you explicitly ask for bounded previews. See
160
+ [docs/planning-work-orders.md](docs/planning-work-orders.md).
137
161
 
138
162
  ## Why Not Just Run Codex Or Claude Yourself?
139
163
 
@@ -238,9 +262,9 @@ best?" to "which AI builder plus reviewer loop ships best on this product?" See
238
262
 
239
263
  ## Installation Status
240
264
 
241
- The current public beta is `v0.5.0-beta.29` from
265
+ The current public beta is `v0.5.0-beta.31` from
242
266
  [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/).
267
+ as `code-mower==0.5.0b31` on [PyPI](https://pypi.org/project/code-mower/).
244
268
  GitHub releases remain the auditable source for tags, build artifacts, and
245
269
  release notes.
246
270
 
@@ -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.0b31"
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.0b31"
@@ -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.0b31`, or run source checkouts with "
18
18
  "`PYTHONPATH=src python -m code_mower.cli`."
19
19
  )
20
20
 
@@ -52,6 +52,7 @@ from . import prompts as code_mower_prompts
52
52
  from . import reviewer_metrics
53
53
  from . import saas_reviewer_labeler
54
54
  from . import trailer_comment_labeler
55
+ from . import work_orders as code_mower_work_orders
55
56
  from .provider_registry import REFERENCE_PROVIDERS
56
57
  from .providers import build_provider_model_env_report
57
58
 
@@ -386,6 +387,7 @@ COMMAND_DESCRIPTIONS: dict[str, str] = {
386
387
  "checks": "Detect and run a repository's native lint/test/build surface.",
387
388
  "cloud": "Export or upload sanitized benchmark metadata.",
388
389
  "config": "Validate or inspect a Code Mower config.",
390
+ "context": "Record local external planning context manifests.",
389
391
  "context-packs": "Build selective surrounding-file context packs.",
390
392
  "coderabbit-cli": "Run a CodeRabbit CLI informational lane.",
391
393
  "codex-audit": "Run a Codex structured audit lane.",
@@ -400,12 +402,15 @@ COMMAND_DESCRIPTIONS: dict[str, str] = {
400
402
  "merge-plan": "Inspect merge-readiness signals and lane labels.",
401
403
  "next-steps": "Print the recommended next actions after setup.",
402
404
  "package": "Build or inspect package extraction artifacts.",
405
+ "plan": "Create local issue-derived planning artifacts.",
406
+ "project-context": "Create editable local project-context doctrine docs.",
403
407
  "prompts": "Inspect prompt/lens customization artifacts.",
404
408
  "providers": "List or inspect provider template definitions.",
405
409
  "reviewer-metrics": "Compute reviewer metrics and value reports.",
406
410
  "saas-reviewer-labeler": "Apply labels from hosted reviewer comments.",
407
411
  "telemetry": "Inspect benchmark telemetry/event helpers.",
408
412
  "trailer-comment-labeler": "Apply labels from structured audit trailers.",
413
+ "work-order": "Draft implementation work orders and builder experiment seeds.",
409
414
  }
410
415
 
411
416
 
@@ -418,10 +423,13 @@ FIRST_USER_COMMANDS = (
418
423
  "reviewer-metrics",
419
424
  "cloud",
420
425
  "config",
426
+ "project-context",
421
427
  )
422
428
 
423
429
 
424
430
  def _init_main(argv: list[str]) -> int:
431
+ if argv[:1] == ["project-context"]:
432
+ return code_mower_work_orders.project_context_main(["init", *argv[1:]])
425
433
  options_with_values = {"--profile", "--output-dir"}
426
434
  if (
427
435
  argv[:1] == ["auth"]
@@ -508,6 +516,7 @@ COMMAND_HANDLERS: dict[str, CommandHandler] = {
508
516
  "checks": code_mower_checks.main,
509
517
  "cloud": code_mower_cloud.main,
510
518
  "config": _config_main,
519
+ "context": code_mower_work_orders.context_main,
511
520
  "context-packs": code_mower_context_packs.main,
512
521
  "coderabbit-cli": coderabbit_cli_audit_pr.main,
513
522
  "codex-audit": codex_audit_pr.main,
@@ -522,12 +531,15 @@ COMMAND_HANDLERS: dict[str, CommandHandler] = {
522
531
  "merge-plan": code_mower_merge.main,
523
532
  "next-steps": code_mower_next_steps.main,
524
533
  "package": _package_main,
534
+ "plan": code_mower_work_orders.plan_main,
535
+ "project-context": code_mower_work_orders.project_context_main,
525
536
  "prompts": code_mower_prompts.main,
526
537
  "providers": _providers_main,
527
538
  "reviewer-metrics": reviewer_metrics.main,
528
539
  "saas-reviewer-labeler": saas_reviewer_labeler.main,
529
540
  "telemetry": code_mower_telemetry.main,
530
541
  "trailer-comment-labeler": trailer_comment_labeler.main,
542
+ "work-order": code_mower_work_orders.work_order_main,
531
543
  }
532
544
 
533
545
 
@@ -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
  }
@@ -14,6 +14,7 @@ PACKAGE_FILES = (
14
14
  ("tools/code_mower_cli.py", "src/code_mower/cli.py", "core"),
15
15
  ("tools/code_mower_bootstrap.py", "src/code_mower/bootstrap.py", "core"),
16
16
  ("tools/code_mower_builder_experiment.py", "src/code_mower/builder_experiment.py", "core"),
17
+ ("src/code_mower/work_orders.py", "src/code_mower/work_orders.py", "core"),
17
18
  ("tools/code_mower_requirements.txt", "requirements/requirements.txt", "tooling"),
18
19
  ("tools/code_mower_calibration.py", "src/code_mower/code_mower_calibration.py", "core"),
19
20
  ("src/code_mower/checks.py", "src/code_mower/checks.py", "core"),
@@ -415,6 +416,7 @@ PACKAGE_FILES = (
415
416
  ("tools/CODE_MOWER_PACKAGE_CUSTOMIZATION.md", "docs/package-customization.md", "doc"),
416
417
  ("tools/CODE_MOWER_AUTHORING_INTELLIGENCE.md", "docs/authoring-intelligence.md", "doc"),
417
418
  ("tools/CODE_MOWER_BUILDER_EXPERIMENTS.md", "docs/builder-experiments.md", "doc"),
419
+ ("docs/planning-work-orders.md", "docs/planning-work-orders.md", "doc"),
418
420
  ("tools/CODE_MOWER_CLOUD_BENCHMARKING.md", "docs/cloud-benchmarking.md", "doc"),
419
421
  ("tools/CODE_MOWER_REPO_STRATEGY.md", "docs/repo-strategy.md", "doc"),
420
422
  ("tools/CODE_MOWER_COMMERCIAL_BOUNDARY.md", "docs/commercial-boundary.md", "doc"),