code-mower 0.6.0b1__tar.gz → 0.6.0b2__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 (346) hide show
  1. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/PKG-INFO +11 -5
  2. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/README.md +10 -4
  3. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/pyproject.toml +1 -1
  4. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/__init__.py +1 -1
  5. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/cloud.py +117 -7
  6. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/cloud_client/__init__.py +24 -0
  7. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/cloud_client/doctor.py +25 -15
  8. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/cloud_client/operations.py +116 -32
  9. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/cloud_client/setup.py +6 -0
  10. code_mower-0.6.0b2/src/code_mower/cloud_client/tokens.py +404 -0
  11. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/package_manifest.py +1 -0
  12. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/templates/workflows/builder-provenance.yml.j2 +1 -1
  13. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower.egg-info/PKG-INFO +11 -5
  14. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower.egg-info/SOURCES.txt +1 -0
  15. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/templates/workflows/builder-provenance.yml.j2 +1 -1
  16. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/tests/test_cloud_client.py +360 -0
  17. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/tests/test_release_hygiene.py +53 -53
  18. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/CODE_OF_CONDUCT.md +0 -0
  19. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/LICENSE +0 -0
  20. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/MANIFEST.in +0 -0
  21. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/NOTICE +0 -0
  22. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/SUPPORT.md +0 -0
  23. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/requirements/requirements.txt +0 -0
  24. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/setup.cfg +0 -0
  25. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/adapters/__init__.py +0 -0
  26. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/adapters/_base.py +0 -0
  27. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/adapters/cursor_bugbot.py +0 -0
  28. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/adapters/gitar.py +0 -0
  29. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/adapters/greptile.py +0 -0
  30. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/adapters/qodo.py +0 -0
  31. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/antigravity_cli_audit_pr.py +0 -0
  32. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/antigravity_sdk_probe.py +0 -0
  33. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/audit_handoff_log.py +0 -0
  34. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/audit_labeler_lib.py +0 -0
  35. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/audit_limits.py +0 -0
  36. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/audit_progress.py +0 -0
  37. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/blind_review_artifacts.py +0 -0
  38. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/blind_review_coordinator.py +0 -0
  39. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/bootstrap.py +0 -0
  40. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/builder_experiment.py +0 -0
  41. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/builder_runs.py +0 -0
  42. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/calibration/__init__.py +0 -0
  43. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/calibration/arms.py +0 -0
  44. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/calibration/auto_discovery.py +0 -0
  45. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/calibration/commands.py +0 -0
  46. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/calibration/context_inputs.py +0 -0
  47. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/calibration/corpus.py +0 -0
  48. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/calibration/effect_report.py +0 -0
  49. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/calibration/evidence.py +0 -0
  50. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/calibration/evidence_report.py +0 -0
  51. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/calibration/identity.py +0 -0
  52. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/calibration/metrics.py +0 -0
  53. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/calibration/overlap.py +0 -0
  54. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/calibration/planning.py +0 -0
  55. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/calibration/policy.py +0 -0
  56. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/calibration/results.py +0 -0
  57. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/calibration/run_results.py +0 -0
  58. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/calibration/run_status.py +0 -0
  59. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/calibration/runner.py +0 -0
  60. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/calibration/truth.py +0 -0
  61. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/calibration/value_report.py +0 -0
  62. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/checks.py +0 -0
  63. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/claude_audit_pr.py +0 -0
  64. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/claude_cli_bounce.py +0 -0
  65. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/claude_cli_environment.py +0 -0
  66. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/clear_stale.py +0 -0
  67. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/cli.py +0 -0
  68. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/cloud_client/bundle.py +0 -0
  69. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/cloud_client/dogfood.py +0 -0
  70. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/cloud_client/endpoints.py +0 -0
  71. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/cloud_client/errors.py +0 -0
  72. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/cloud_client/events.py +0 -0
  73. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/cloud_client/export.py +0 -0
  74. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/cloud_client/git_metadata.py +0 -0
  75. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/cloud_client/manifest.py +0 -0
  76. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/cloud_client/reports.py +0 -0
  77. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/cloud_client/upload.py +0 -0
  78. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/code_mower_calibration.py +0 -0
  79. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/code_mower_context_packs.py +0 -0
  80. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/code_mower_merge.py +0 -0
  81. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/code_mower_telemetry.py +0 -0
  82. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/coderabbit_cli_audit_pr.py +0 -0
  83. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/codex_audit_env_preflight.py +0 -0
  84. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/codex_audit_pr.py +0 -0
  85. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/codex_audit_schema_smoke.py +0 -0
  86. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/codex_audit_verdict.schema.json +0 -0
  87. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/config.py +0 -0
  88. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/decisions.py +0 -0
  89. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/doctor.py +0 -0
  90. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/doctor_checks/__init__.py +0 -0
  91. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/doctor_checks/audit_limits.py +0 -0
  92. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/doctor_checks/cloud.py +0 -0
  93. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/doctor_checks/common.py +0 -0
  94. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/doctor_checks/github.py +0 -0
  95. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/doctor_checks/github_actions.py +0 -0
  96. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/doctor_checks/github_actions_cost.py +0 -0
  97. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/doctor_checks/github_actions_cost_summary.py +0 -0
  98. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/doctor_checks/github_actions_failure_annotations.py +0 -0
  99. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/doctor_checks/github_actions_failure_models.py +0 -0
  100. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/doctor_checks/github_actions_failure_scan.py +0 -0
  101. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/doctor_checks/github_actions_failure_selection.py +0 -0
  102. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/doctor_checks/github_actions_failures.py +0 -0
  103. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/doctor_checks/github_actions_permissions.py +0 -0
  104. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/doctor_checks/github_api.py +0 -0
  105. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/doctor_checks/github_branch.py +0 -0
  106. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/doctor_checks/github_config.py +0 -0
  107. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/doctor_checks/github_human_token.py +0 -0
  108. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/doctor_checks/github_provider.py +0 -0
  109. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/doctor_checks/github_repo.py +0 -0
  110. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/doctor_checks/groups.py +0 -0
  111. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/doctor_checks/models.py +0 -0
  112. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/doctor_checks/output.py +0 -0
  113. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/doctor_checks/presets.py +0 -0
  114. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/doctor_checks/privacy.py +0 -0
  115. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/doctor_checks/provider_api_model.py +0 -0
  116. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/doctor_checks/provider_api_model_openai.py +0 -0
  117. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/doctor_checks/provider_api_model_profiles.py +0 -0
  118. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/doctor_checks/provider_env.py +0 -0
  119. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/doctor_checks/provider_env_required.py +0 -0
  120. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/doctor_checks/provider_env_tokens.py +0 -0
  121. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/doctor_checks/provider_local_audit_setup.py +0 -0
  122. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/doctor_checks/provider_local_cli.py +0 -0
  123. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/doctor_checks/provider_local_cli_commands.py +0 -0
  124. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/doctor_checks/provider_local_cli_probe_config.py +0 -0
  125. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/doctor_checks/provider_probe.py +0 -0
  126. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/doctor_checks/provider_probe_auth.py +0 -0
  127. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/doctor_checks/provider_probe_evaluation.py +0 -0
  128. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/doctor_checks/provider_probe_json.py +0 -0
  129. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/doctor_checks/provider_probe_remediation.py +0 -0
  130. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/doctor_checks/provider_review_hygiene.py +0 -0
  131. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/doctor_checks/providers.py +0 -0
  132. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/doctor_checks/registry.py +0 -0
  133. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/doctor_checks/runner.py +0 -0
  134. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/doctor_checks/runtime.py +0 -0
  135. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/doctor_checks/runtime_github_auth.py +0 -0
  136. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/doctor_checks/self_hosted_runner.py +0 -0
  137. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/gate_health.py +0 -0
  138. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/gemini_cli_audit_pr.py +0 -0
  139. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/grok_build_audit_pr.py +0 -0
  140. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/hermes_cli_audit_pr.py +0 -0
  141. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/init.py +0 -0
  142. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/lane_configs/__init__.py +0 -0
  143. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/lane_configs/aider.py +0 -0
  144. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/lane_configs/antigravity_cli.py +0 -0
  145. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/lane_configs/claude.py +0 -0
  146. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/lane_configs/codex.py +0 -0
  147. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/lane_configs/devin.py +0 -0
  148. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/lane_configs/gemini_cli.py +0 -0
  149. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/lane_configs/grok_build.py +0 -0
  150. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/lane_configs/hermes_cli.py +0 -0
  151. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/lane_configs/local_llm.py +0 -0
  152. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/lane_status.py +0 -0
  153. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/local_llm_audit_pr.py +0 -0
  154. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/local_llm_bakeoff.py +0 -0
  155. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/local_llm_calibration.py +0 -0
  156. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/local_llm_profiles.py +0 -0
  157. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/migration.py +0 -0
  158. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/migration_install.py +0 -0
  159. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/migration_mirror.py +0 -0
  160. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/migration_readiness.py +0 -0
  161. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/migration_rehearsal.py +0 -0
  162. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/next_steps.py +0 -0
  163. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/observe.py +0 -0
  164. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/package.py +0 -0
  165. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/package_content.py +0 -0
  166. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/package_paths.py +0 -0
  167. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/package_rendering.py +0 -0
  168. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/package_static.py +0 -0
  169. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/plan_context.py +0 -0
  170. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/prompts.py +0 -0
  171. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/provider_registry.py +0 -0
  172. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/provider_runners/__init__.py +0 -0
  173. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/provider_runners/comments.py +0 -0
  174. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/provider_runners/exit_codes.py +0 -0
  175. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/provider_runners/git.py +0 -0
  176. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/provider_runners/github_auth.py +0 -0
  177. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/provider_runners/github_pr.py +0 -0
  178. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/provider_runners/pr_worktree.py +0 -0
  179. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/provider_runners/process.py +0 -0
  180. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/provider_runners/repo_paths.py +0 -0
  181. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/provider_runners/text_schema.py +0 -0
  182. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/provider_runners/verdict_artifacts.py +0 -0
  183. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/provider_runners/workspace.py +0 -0
  184. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/providers/__init__.py +0 -0
  185. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/providers/local_cli.py +0 -0
  186. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/providers/provenance.py +0 -0
  187. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/release_readiness.py +0 -0
  188. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/reviewer_metrics.py +0 -0
  189. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/reviewer_spend.py +0 -0
  190. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/saas_reviewer_labeler.py +0 -0
  191. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/secrets.py +0 -0
  192. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/templates/builder-experiment.example.json +0 -0
  193. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/templates/calibration-corpus.example.json +0 -0
  194. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/templates/calibration-corpus.json +0 -0
  195. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/templates/code-mower.example.yml +0 -0
  196. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/templates/context-packs.example.json +0 -0
  197. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/templates/lane_prompts/base-audit.md +0 -0
  198. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/templates/lane_prompts/calibration-policy.md +0 -0
  199. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/templates/lane_prompts/context-driven-quality.md +0 -0
  200. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/templates/lane_prompts/docs-design.md +0 -0
  201. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/templates/lane_prompts/generic-programming.md +0 -0
  202. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/templates/lane_prompts/operability.md +0 -0
  203. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/templates/lane_prompts/package-runtime.md +0 -0
  204. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/templates/lane_prompts/plan-conformance.md +0 -0
  205. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/templates/lane_prompts/security-threat-model.md +0 -0
  206. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/templates/lanes/README.md +0 -0
  207. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/templates/lanes/claude.md +0 -0
  208. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/templates/lanes/codex.md +0 -0
  209. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/templates/lanes/cursor.md +0 -0
  210. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/templates/lanes/generic.md +0 -0
  211. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/templates/lanes/run_mac_lane.sh +0 -0
  212. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/templates/product-support/code_mower +0 -0
  213. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/templates/product-support/code_mower_standalone_pin.env +0 -0
  214. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/templates/product-support/code_mower_standalone_shadow.sh +0 -0
  215. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/templates/product-support/run_claude_audit_pr.sh +0 -0
  216. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/templates/product-support/run_codex_audit_pr.sh +0 -0
  217. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/templates/product-support/safe_gh_comment.py +0 -0
  218. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/templates/product-support/status_report.py +0 -0
  219. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/templates/providers.yml +0 -0
  220. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/templates/reviewer-spend.example.json +0 -0
  221. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/templates/reviewer-value-report.example.md +0 -0
  222. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/templates/workflows/audit-label-cleanup.yml.j2 +0 -0
  223. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/templates/workflows/code-mower-agent-pr-labeler.yml.j2 +0 -0
  224. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/templates/workflows/code-mower-fix-round-dispatch.yml.j2 +0 -0
  225. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/templates/workflows/code-mower-gate-health.yml.j2 +0 -0
  226. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/templates/workflows/code-mower-gate.yml.j2 +0 -0
  227. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/templates/workflows/dispatch-lanes.yml.j2 +0 -0
  228. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/templates/workflows/hosted-bridge.yml.j2 +0 -0
  229. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/templates/workflows/lane-mac-runner.yml.j2 +0 -0
  230. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/templates/workflows/local-cli-audit.yml.j2 +0 -0
  231. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/templates/workflows/needs-owner-notify.yml.j2 +0 -0
  232. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/templates/workflows/private-standalone-shadow.yml.j2 +0 -0
  233. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/templates/workflows/review-clear-stale.yml.j2 +0 -0
  234. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/templates/workflows/saas-reviewer-labeler.yml.j2 +0 -0
  235. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/templates/workflows/self-hosted-local-audit.yml.j2 +0 -0
  236. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/templates/workflows/trailer-comment-labeler.yml.j2 +0 -0
  237. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/templates/workflows/weekly-status.yml.j2 +0 -0
  238. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/trailer_comment_labeler.py +0 -0
  239. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/versioning.py +0 -0
  240. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/work_orders.py +0 -0
  241. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower/workflow_actionlint.py +0 -0
  242. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower.egg-info/dependency_links.txt +0 -0
  243. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower.egg-info/entry_points.txt +0 -0
  244. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower.egg-info/requires.txt +0 -0
  245. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/src/code_mower.egg-info/top_level.txt +0 -0
  246. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/templates/builder-experiment.example.json +0 -0
  247. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/templates/calibration-corpus.example.json +0 -0
  248. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/templates/calibration-corpus.json +0 -0
  249. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/templates/code-mower.yml.j2 +0 -0
  250. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/templates/context-packs.example.json +0 -0
  251. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/templates/cursor/BUGBOT.md +0 -0
  252. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/templates/lanes/README.md +0 -0
  253. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/templates/lanes/claude.md +0 -0
  254. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/templates/lanes/codex.md +0 -0
  255. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/templates/lanes/cursor.md +0 -0
  256. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/templates/lanes/generic.md +0 -0
  257. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/templates/lanes/run_mac_lane.sh +0 -0
  258. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/templates/providers/acp_bridge.yml +0 -0
  259. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/templates/providers/aider.yml +0 -0
  260. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/templates/providers/antigravity_cli.yml +0 -0
  261. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/templates/providers/claude_audit.yml +0 -0
  262. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/templates/providers/claude_review.yml +0 -0
  263. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/templates/providers/coderabbit_cli.yml +0 -0
  264. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/templates/providers/codex.yml +0 -0
  265. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/templates/providers/cursor_bugbot.yml +0 -0
  266. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/templates/providers/devin.yml +0 -0
  267. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/templates/providers/gemini_cli.yml +0 -0
  268. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/templates/providers/gitar.yml +0 -0
  269. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/templates/providers/greptile.yml +0 -0
  270. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/templates/providers/hermes_cli.yml +0 -0
  271. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/templates/providers/local_llm.yml +0 -0
  272. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/templates/providers/qodo.yml +0 -0
  273. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/templates/providers.yml +0 -0
  274. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/templates/reviewer-spend.example.json +0 -0
  275. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/templates/reviewer-value-report.example.md +0 -0
  276. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/templates/workflows/audit-label-cleanup.yml.j2 +0 -0
  277. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/templates/workflows/blind-review-artifacts-dry-run.yml.j2 +0 -0
  278. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/templates/workflows/code-mower-agent-pr-labeler.yml.j2 +0 -0
  279. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/templates/workflows/code-mower-fix-round-dispatch.yml.j2 +0 -0
  280. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/templates/workflows/code-mower-gate-health.yml.j2 +0 -0
  281. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/templates/workflows/code-mower-gate.yml.j2 +0 -0
  282. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/templates/workflows/dispatch-lanes.yml.j2 +0 -0
  283. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/templates/workflows/hosted-bridge.yml.j2 +0 -0
  284. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/templates/workflows/lane-mac-runner.yml.j2 +0 -0
  285. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/templates/workflows/local-cli-audit.yml.j2 +0 -0
  286. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/templates/workflows/private-standalone-shadow.yml.j2 +0 -0
  287. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/templates/workflows/review-clear-stale.yml.j2 +0 -0
  288. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/templates/workflows/saas-reviewer-labeler.yml.j2 +0 -0
  289. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/templates/workflows/self-hosted-local-audit.yml.j2 +0 -0
  290. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/templates/workflows/trailer-comment-labeler.yml.j2 +0 -0
  291. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/tests/test_antigravity_sdk_probe.py +0 -0
  292. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/tests/test_audit_comment_posture.py +0 -0
  293. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/tests/test_audit_limits.py +0 -0
  294. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/tests/test_builder_experiment.py +0 -0
  295. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/tests/test_builder_identity.py +0 -0
  296. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/tests/test_builder_runs.py +0 -0
  297. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/tests/test_calibration_effect_report.py +0 -0
  298. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/tests/test_calibration_truth.py +0 -0
  299. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/tests/test_checks.py +0 -0
  300. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/tests/test_claude_audit_pr.py +0 -0
  301. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/tests/test_claude_cli_bounce.py +0 -0
  302. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/tests/test_clear_stale.py +0 -0
  303. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/tests/test_cloud_git_metadata.py +0 -0
  304. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/tests/test_cloud_manifest.py +0 -0
  305. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/tests/test_cloud_reports.py +0 -0
  306. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/tests/test_coderabbit_cli_audit_pr.py +0 -0
  307. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/tests/test_codex_audit_env_preflight.py +0 -0
  308. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/tests/test_codex_audit_pr.py +0 -0
  309. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/tests/test_decision_audit_integration.py +0 -0
  310. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/tests/test_decisions.py +0 -0
  311. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/tests/test_doctor_actions_cost_summary.py +0 -0
  312. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/tests/test_doctor_actions_failure_selection.py +0 -0
  313. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/tests/test_doctor_boundaries.py +0 -0
  314. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/tests/test_doctor_github_checks.py +0 -0
  315. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/tests/test_doctor_output.py +0 -0
  316. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/tests/test_doctor_privacy.py +0 -0
  317. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/tests/test_doctor_provider_env_required.py +0 -0
  318. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/tests/test_doctor_provider_env_tokens.py +0 -0
  319. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/tests/test_doctor_provider_local_audit_setup.py +0 -0
  320. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/tests/test_doctor_provider_probe.py +0 -0
  321. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/tests/test_doctor_provider_review_hygiene.py +0 -0
  322. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/tests/test_doctor_registry.py +0 -0
  323. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/tests/test_doctor_runtime.py +0 -0
  324. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/tests/test_doctor_self_hosted_runner.py +0 -0
  325. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/tests/test_gate_health.py +0 -0
  326. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/tests/test_init_actionlint.py +0 -0
  327. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/tests/test_init_build_loop.py +0 -0
  328. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/tests/test_lane_status.py +0 -0
  329. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/tests/test_local_llm_github_helpers.py +0 -0
  330. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/tests/test_observe.py +0 -0
  331. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/tests/test_plan_context.py +0 -0
  332. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/tests/test_prompts.py +0 -0
  333. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/tests/test_provider_fixture_contracts.py +0 -0
  334. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/tests/test_provider_local_cli.py +0 -0
  335. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/tests/test_provider_runners_comments.py +0 -0
  336. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/tests/test_provider_runners_git.py +0 -0
  337. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/tests/test_provider_runners_github_pr.py +0 -0
  338. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/tests/test_provider_runners_pr_worktree.py +0 -0
  339. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/tests/test_provider_runners_process.py +0 -0
  340. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/tests/test_provider_runners_repo_paths.py +0 -0
  341. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/tests/test_provider_runners_text_schema.py +0 -0
  342. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/tests/test_provider_runners_workspace.py +0 -0
  343. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/tests/test_reviewer_metrics_core.py +0 -0
  344. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/tests/test_reviewer_spend.py +0 -0
  345. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/tests/test_trailer_comment_labeler.py +0 -0
  346. {code_mower-0.6.0b1 → code_mower-0.6.0b2}/tests/test_work_orders.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: code-mower
3
- Version: 0.6.0b1
3
+ Version: 0.6.0b2
4
4
  Summary: Multi-reviewer AI code audit orchestration
5
5
  License-Expression: Apache-2.0
6
6
  Requires-Python: >=3.11
@@ -117,7 +117,7 @@ observable.
117
117
  | C. Builder experiment | You want to compare authoring loops before trusting them broadly. | Use a work order or experiment spec, run `code-mower builder-experiment run` around an explicit command, then review the source-free `authoringRun` artifact and normal audit evidence. | [Builder Experiments](docs/builder-experiments.md) |
118
118
 
119
119
  The v0.6 beta announcement entry point is the tagged
120
- [Try Code Mower In 10 Minutes](https://github.com/codemower-ai/code-mower/blob/v0.6.0-beta.1/docs/try-in-10-minutes.md)
120
+ [Try Code Mower In 10 Minutes](https://github.com/codemower-ai/code-mower/blob/v0.6.0-beta.2/docs/try-in-10-minutes.md)
121
121
  guide.
122
122
 
123
123
  ## What Calibration Does And Does Not Prove
@@ -147,7 +147,7 @@ Provider-contract baseline for the next release train:
147
147
 
148
148
  For release verification,
149
149
  [First-User Install Rehearsal](docs/first-user-install-rehearsal.md) records
150
- the package-index procedure for `v0.6.0-beta.1` / `code-mower==0.6.0b1`. The
150
+ the package-index procedure for `v0.6.0-beta.2` / `code-mower==0.6.0b2`. The
151
151
  GitHub release records the workflow and rehearsal evidence for the exact tag.
152
152
 
153
153
  ## Optional: Plan Before Coding
@@ -272,6 +272,12 @@ code-mower cloud setup \
272
272
  --out ~/.config/code-mower/tokens/your-laptop.env
273
273
  ```
274
274
 
275
+ `cloud setup` stores a private `0600` token env file and records it as the
276
+ current local cloud profile. Future `cloud doctor`, `cloud upload`, `cloud
277
+ dogfood`, `cloud reviewer-runs`, and `cloud repo-sync` commands can load that
278
+ profile automatically; pass `--install-id` or `--token-file` when a machine has
279
+ multiple stored profiles.
280
+
275
281
  Cloud sharing details, historical catch-up, and repo-sync commands live in
276
282
  [docs/cloud-sharing.md](docs/cloud-sharing.md).
277
283
 
@@ -322,8 +328,8 @@ measurement work.
322
328
 
323
329
  ## Installation Status
324
330
 
325
- The current public beta baseline is `v0.6.0-beta.1`, with pinned package-index
326
- install spec `code-mower==0.6.0b1`. Release evidence is recorded on the GitHub
331
+ The current public beta baseline is `v0.6.0-beta.2`, with pinned package-index
332
+ install spec `code-mower==0.6.0b2`. Release evidence is recorded on the GitHub
327
333
  release and in the first-user install rehearsal. The public repository is
328
334
  [codemower-ai/code-mower](https://github.com/codemower-ai/code-mower), and
329
335
  GitHub releases remain the auditable source for tags, build artifacts, and
@@ -102,7 +102,7 @@ observable.
102
102
  | C. Builder experiment | You want to compare authoring loops before trusting them broadly. | Use a work order or experiment spec, run `code-mower builder-experiment run` around an explicit command, then review the source-free `authoringRun` artifact and normal audit evidence. | [Builder Experiments](docs/builder-experiments.md) |
103
103
 
104
104
  The v0.6 beta announcement entry point is the tagged
105
- [Try Code Mower In 10 Minutes](https://github.com/codemower-ai/code-mower/blob/v0.6.0-beta.1/docs/try-in-10-minutes.md)
105
+ [Try Code Mower In 10 Minutes](https://github.com/codemower-ai/code-mower/blob/v0.6.0-beta.2/docs/try-in-10-minutes.md)
106
106
  guide.
107
107
 
108
108
  ## What Calibration Does And Does Not Prove
@@ -132,7 +132,7 @@ Provider-contract baseline for the next release train:
132
132
 
133
133
  For release verification,
134
134
  [First-User Install Rehearsal](docs/first-user-install-rehearsal.md) records
135
- the package-index procedure for `v0.6.0-beta.1` / `code-mower==0.6.0b1`. The
135
+ the package-index procedure for `v0.6.0-beta.2` / `code-mower==0.6.0b2`. The
136
136
  GitHub release records the workflow and rehearsal evidence for the exact tag.
137
137
 
138
138
  ## Optional: Plan Before Coding
@@ -257,6 +257,12 @@ code-mower cloud setup \
257
257
  --out ~/.config/code-mower/tokens/your-laptop.env
258
258
  ```
259
259
 
260
+ `cloud setup` stores a private `0600` token env file and records it as the
261
+ current local cloud profile. Future `cloud doctor`, `cloud upload`, `cloud
262
+ dogfood`, `cloud reviewer-runs`, and `cloud repo-sync` commands can load that
263
+ profile automatically; pass `--install-id` or `--token-file` when a machine has
264
+ multiple stored profiles.
265
+
260
266
  Cloud sharing details, historical catch-up, and repo-sync commands live in
261
267
  [docs/cloud-sharing.md](docs/cloud-sharing.md).
262
268
 
@@ -307,8 +313,8 @@ measurement work.
307
313
 
308
314
  ## Installation Status
309
315
 
310
- The current public beta baseline is `v0.6.0-beta.1`, with pinned package-index
311
- install spec `code-mower==0.6.0b1`. Release evidence is recorded on the GitHub
316
+ The current public beta baseline is `v0.6.0-beta.2`, with pinned package-index
317
+ install spec `code-mower==0.6.0b2`. Release evidence is recorded on the GitHub
312
318
  release and in the first-user install rehearsal. The public repository is
313
319
  [codemower-ai/code-mower](https://github.com/codemower-ai/code-mower), and
314
320
  GitHub releases remain the auditable source for tags, build artifacts, and
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "code-mower"
7
- version = "0.6.0b1"
7
+ version = "0.6.0b2"
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.6.0b1"
3
+ __version__ = "0.6.0b2"
@@ -42,6 +42,9 @@ if __package__ in {None, ""}:
42
42
  read_token_file as _read_token_file,
43
43
  render_bundle_readme,
44
44
  render_cloud_doctor_text,
45
+ require_upload_token,
46
+ resolve_cloud_endpoint,
47
+ resolve_cloud_token,
45
48
  render_setup_env,
46
49
  repo_slug_from_remote as _repo_slug_from_remote,
47
50
  repo_sync_output_name as _repo_sync_output_name,
@@ -92,6 +95,9 @@ else: # pragma: no cover - exercised after package extraction.
92
95
  read_token_file as _read_token_file,
93
96
  render_bundle_readme,
94
97
  render_cloud_doctor_text,
98
+ require_upload_token,
99
+ resolve_cloud_endpoint,
100
+ resolve_cloud_token,
95
101
  render_setup_env,
96
102
  repo_slug_from_remote as _repo_slug_from_remote,
97
103
  repo_sync_output_name as _repo_sync_output_name,
@@ -137,8 +143,11 @@ __all__ = [
137
143
  "build_cloud_bundle",
138
144
  "build_upload_payload",
139
145
  "post_upload_payload",
146
+ "require_upload_token",
140
147
  "render_bundle_readme",
141
148
  "render_setup_env",
149
+ "resolve_cloud_endpoint",
150
+ "resolve_cloud_token",
142
151
  "run_cloud_doctor",
143
152
  "run_cloud_setup",
144
153
  "validate_metadata_payload",
@@ -290,6 +299,23 @@ def main(argv: list[str] | None = None) -> int:
290
299
  default=os.environ.get("CODE_MOWER_CLOUD_ENDPOINT", DEFAULT_UPLOAD_ENDPOINT),
291
300
  )
292
301
  upload.add_argument("--token-env", default=DEFAULT_TOKEN_ENV)
302
+ upload.add_argument(
303
+ "--token-file",
304
+ type=Path,
305
+ default=None,
306
+ help="token env file or raw token file to use when token env is not set",
307
+ )
308
+ upload.add_argument(
309
+ "--token-dir",
310
+ type=Path,
311
+ default=None,
312
+ help="directory with Code Mower Cloud token profiles",
313
+ )
314
+ upload.add_argument(
315
+ "--install-id",
316
+ default="",
317
+ help="stored token profile name to use when token env is not set",
318
+ )
293
319
  upload.add_argument("--include-reports", action="store_true")
294
320
  upload.add_argument("--dry-run", action="store_true")
295
321
  upload.add_argument(
@@ -312,6 +338,23 @@ def main(argv: list[str] | None = None) -> int:
312
338
  default=os.environ.get("CODE_MOWER_CLOUD_ENDPOINT", DEFAULT_UPLOAD_ENDPOINT),
313
339
  )
314
340
  doctor.add_argument("--token-env", default=DEFAULT_TOKEN_ENV)
341
+ doctor.add_argument(
342
+ "--token-file",
343
+ type=Path,
344
+ default=None,
345
+ help="token env file or raw token file to check when token env is not set",
346
+ )
347
+ doctor.add_argument(
348
+ "--token-dir",
349
+ type=Path,
350
+ default=None,
351
+ help="directory with Code Mower Cloud token profiles",
352
+ )
353
+ doctor.add_argument(
354
+ "--install-id",
355
+ default="",
356
+ help="stored token profile name to check when token env is not set",
357
+ )
315
358
  doctor.add_argument(
316
359
  "--probe-service",
317
360
  action="store_true",
@@ -354,6 +397,18 @@ def main(argv: list[str] | None = None) -> int:
354
397
  default=os.environ.get("CODE_MOWER_CLOUD_ENDPOINT", DEFAULT_UPLOAD_ENDPOINT),
355
398
  )
356
399
  dogfood.add_argument("--token-env", default=DEFAULT_TOKEN_ENV)
400
+ dogfood.add_argument(
401
+ "--token-file",
402
+ type=Path,
403
+ default=None,
404
+ help="token env file or raw token file to use when token env is not set",
405
+ )
406
+ dogfood.add_argument(
407
+ "--token-dir",
408
+ type=Path,
409
+ default=None,
410
+ help="directory with Code Mower Cloud token profiles",
411
+ )
357
412
  dogfood.add_argument("--include-reports", action="store_true")
358
413
  dogfood.add_argument(
359
414
  "--yes",
@@ -389,6 +444,18 @@ def main(argv: list[str] | None = None) -> int:
389
444
  default=os.environ.get("CODE_MOWER_CLOUD_ENDPOINT", DEFAULT_UPLOAD_ENDPOINT),
390
445
  )
391
446
  catch_up.add_argument("--token-env", default=DEFAULT_TOKEN_ENV)
447
+ catch_up.add_argument(
448
+ "--token-file",
449
+ type=Path,
450
+ default=None,
451
+ help="token env file or raw token file to use when token env is not set",
452
+ )
453
+ catch_up.add_argument(
454
+ "--token-dir",
455
+ type=Path,
456
+ default=None,
457
+ help="directory with Code Mower Cloud token profiles",
458
+ )
392
459
  catch_up.add_argument(
393
460
  "--yes",
394
461
  action="store_true",
@@ -451,6 +518,18 @@ def main(argv: list[str] | None = None) -> int:
451
518
  default=os.environ.get("CODE_MOWER_CLOUD_ENDPOINT", DEFAULT_UPLOAD_ENDPOINT),
452
519
  )
453
520
  reviewer_runs.add_argument("--token-env", default=DEFAULT_TOKEN_ENV)
521
+ reviewer_runs.add_argument(
522
+ "--token-file",
523
+ type=Path,
524
+ default=None,
525
+ help="token env file or raw token file to use when token env is not set",
526
+ )
527
+ reviewer_runs.add_argument(
528
+ "--token-dir",
529
+ type=Path,
530
+ default=None,
531
+ help="directory with Code Mower Cloud token profiles",
532
+ )
454
533
  reviewer_runs.add_argument(
455
534
  "--yes",
456
535
  action="store_true",
@@ -498,6 +577,18 @@ def main(argv: list[str] | None = None) -> int:
498
577
  default=os.environ.get("CODE_MOWER_CLOUD_ENDPOINT", DEFAULT_UPLOAD_ENDPOINT),
499
578
  )
500
579
  repo_sync.add_argument("--token-env", default=DEFAULT_TOKEN_ENV)
580
+ repo_sync.add_argument(
581
+ "--token-file",
582
+ type=Path,
583
+ default=None,
584
+ help="token env file or raw token file to use when token env is not set",
585
+ )
586
+ repo_sync.add_argument(
587
+ "--token-dir",
588
+ type=Path,
589
+ default=None,
590
+ help="directory with Code Mower Cloud token profiles",
591
+ )
501
592
  repo_sync.add_argument("--include-reports", action="store_true")
502
593
  repo_sync.add_argument(
503
594
  "--yes",
@@ -535,6 +626,7 @@ def main(argv: list[str] | None = None) -> int:
535
626
  print(f"Token: {result['token_prefix']}")
536
627
  if result["status"] == "written":
537
628
  print(f"Load it with: {result['shell']}")
629
+ print(f"Current profile: {result['current_profile']}")
538
630
  return 0
539
631
  if args.command == "export":
540
632
  events = [
@@ -569,11 +661,18 @@ def main(argv: list[str] | None = None) -> int:
569
661
  bundle_dir=args.bundle_dir,
570
662
  include_reports=args.include_reports,
571
663
  )
664
+ token_resolution = resolve_cloud_token(
665
+ token_env=args.token_env,
666
+ token_file=args.token_file,
667
+ token_dir=args.token_dir,
668
+ install_id=args.install_id,
669
+ )
670
+ resolved_endpoint = resolve_cloud_endpoint(args.endpoint, token_resolution)
572
671
  dry_run = args.dry_run or not args.yes
573
672
  if dry_run:
574
673
  preview = {
575
674
  "mode": "cloud-upload-dry-run",
576
- "endpoint": args.endpoint,
675
+ "endpoint": resolved_endpoint,
577
676
  "would_upload": False,
578
677
  "requires_yes": not args.yes,
579
678
  "upload_mode": payload["upload_mode"],
@@ -592,14 +691,14 @@ def main(argv: list[str] | None = None) -> int:
592
691
  print(f"Events: {preview['event_count']}")
593
692
  print("Network: skipped (pass --yes to upload)")
594
693
  return 0
595
- token = os.environ.get(args.token_env, "")
596
- if not token and not _is_local_http_endpoint(args.endpoint):
597
- raise CloudBundleError(
598
- f"{args.token_env} is not set; refusing non-local upload without a token"
599
- )
694
+ token = require_upload_token(
695
+ endpoint=resolved_endpoint,
696
+ resolution=token_resolution,
697
+ local_endpoint=_is_local_http_endpoint(resolved_endpoint),
698
+ )
600
699
  result = post_upload_payload(
601
700
  payload=payload,
602
- endpoint=args.endpoint,
701
+ endpoint=resolved_endpoint,
603
702
  token=token,
604
703
  timeout=args.timeout,
605
704
  )
@@ -615,6 +714,9 @@ def main(argv: list[str] | None = None) -> int:
615
714
  bundle_dir=args.bundle_dir,
616
715
  endpoint=args.endpoint,
617
716
  token_env=args.token_env,
717
+ token_file=args.token_file,
718
+ token_dir=args.token_dir,
719
+ install_id=args.install_id,
618
720
  probe_service=args.probe_service,
619
721
  timeout=args.timeout,
620
722
  )
@@ -636,6 +738,8 @@ def main(argv: list[str] | None = None) -> int:
636
738
  source=args.source,
637
739
  endpoint=args.endpoint,
638
740
  token_env=args.token_env,
741
+ token_file=args.token_file,
742
+ token_dir=args.token_dir,
639
743
  include_reports=args.include_reports,
640
744
  yes=args.yes,
641
745
  timeout=args.timeout,
@@ -664,6 +768,8 @@ def main(argv: list[str] | None = None) -> int:
664
768
  limit=args.limit,
665
769
  endpoint=args.endpoint,
666
770
  token_env=args.token_env,
771
+ token_file=args.token_file,
772
+ token_dir=args.token_dir,
667
773
  yes=args.yes,
668
774
  timeout=args.timeout,
669
775
  include_git_ref=args.include_git_ref,
@@ -700,6 +806,8 @@ def main(argv: list[str] | None = None) -> int:
700
806
  offset=args.offset,
701
807
  endpoint=args.endpoint,
702
808
  token_env=args.token_env,
809
+ token_file=args.token_file,
810
+ token_dir=args.token_dir,
703
811
  yes=args.yes,
704
812
  timeout=args.timeout,
705
813
  include_git_ref=args.include_git_ref,
@@ -733,6 +841,8 @@ def main(argv: list[str] | None = None) -> int:
733
841
  limit=args.limit,
734
842
  endpoint=args.endpoint,
735
843
  token_env=args.token_env,
844
+ token_file=args.token_file,
845
+ token_dir=args.token_dir,
736
846
  include_reports=args.include_reports,
737
847
  include_git_ref=args.include_git_ref,
738
848
  yes=args.yes,
@@ -93,6 +93,19 @@ from .setup import (
93
93
  token_prefix,
94
94
  write_setup_env_file,
95
95
  )
96
+ from .tokens import (
97
+ CURRENT_PROFILE_FILENAME,
98
+ DEFAULT_TOKEN_DIR,
99
+ CloudTokenResolution,
100
+ default_token_dir,
101
+ display_token_path,
102
+ read_token_profile,
103
+ require_upload_token,
104
+ resolve_cloud_endpoint,
105
+ resolve_cloud_identity,
106
+ resolve_cloud_token,
107
+ write_current_token_profile,
108
+ )
96
109
  from .upload import (
97
110
  UPLOAD_SCHEMA,
98
111
  build_upload_payload,
@@ -113,10 +126,13 @@ __all__ = [
113
126
  "SAFE_REPORT_KINDS",
114
127
  "UPLOAD_SCHEMA",
115
128
  "CloudBundleError",
129
+ "CloudTokenResolution",
130
+ "CURRENT_PROFILE_FILENAME",
116
131
  "DEFAULT_INSTALL_ID_ENV",
117
132
  "DEFAULT_SETUP_INSTALL_ID",
118
133
  "DEFAULT_TEAM_ID_ENV",
119
134
  "DEFAULT_TOKEN_ENV",
135
+ "DEFAULT_TOKEN_DIR",
120
136
  "DEFAULT_UPLOAD_ENDPOINT",
121
137
  "DogfoodPlan",
122
138
  "EVENT_SCHEMA",
@@ -132,7 +148,9 @@ __all__ = [
132
148
  "catch_up_upload",
133
149
  "dashboard_url_for_endpoint",
134
150
  "default_setup_path",
151
+ "default_token_dir",
135
152
  "detect_repo_slug",
153
+ "display_token_path",
136
154
  "default_dogfood_reports",
137
155
  "dogfood_upload",
138
156
  "event_id_from_github_run",
@@ -150,6 +168,7 @@ __all__ = [
150
168
  "post_upload_payload",
151
169
  "probe_cloud_service",
152
170
  "read_token_file",
171
+ "read_token_profile",
153
172
  "render_bundle_readme",
154
173
  "render_cloud_doctor_text",
155
174
  "render_setup_env",
@@ -157,6 +176,10 @@ __all__ = [
157
176
  "repo_sync_output_name",
158
177
  "repo_sync_upload",
159
178
  "report_path_from_manifest",
179
+ "require_upload_token",
180
+ "resolve_cloud_endpoint",
181
+ "resolve_cloud_identity",
182
+ "resolve_cloud_token",
160
183
  "resolve_setup_token",
161
184
  "reviewer_runs_upload",
162
185
  "run_cloud_doctor",
@@ -176,4 +199,5 @@ __all__ = [
176
199
  "validate_metadata_payload",
177
200
  "validate_upload_endpoint",
178
201
  "write_setup_env_file",
202
+ "write_current_token_profile",
179
203
  ]
@@ -2,7 +2,6 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
- import os
6
5
  import shlex
7
6
  from pathlib import Path
8
7
  from typing import Any
@@ -18,6 +17,10 @@ from .endpoints import (
18
17
  validate_upload_endpoint,
19
18
  )
20
19
  from .errors import CloudBundleError
20
+ from .tokens import (
21
+ resolve_cloud_endpoint,
22
+ resolve_cloud_token,
23
+ )
21
24
  from .upload import build_upload_payload
22
25
 
23
26
 
@@ -84,12 +87,22 @@ def run_cloud_doctor(
84
87
  bundle_dir: Path,
85
88
  endpoint: str,
86
89
  token_env: str,
90
+ token_file: Path | None = None,
91
+ token_dir: Path | None = None,
92
+ install_id: str = "",
87
93
  require_token: bool = True,
88
94
  probe_service: bool = False,
89
95
  timeout: float = 5.0,
90
96
  ) -> dict[str, Any]:
91
97
  checks: list[dict[str, Any]] = []
92
98
  endpoint_is_valid = False
99
+ token_resolution = resolve_cloud_token(
100
+ token_env=token_env,
101
+ token_file=token_file,
102
+ token_dir=token_dir,
103
+ install_id=install_id,
104
+ )
105
+ endpoint = resolve_cloud_endpoint(endpoint, token_resolution)
93
106
 
94
107
  try:
95
108
  _validate_upload_endpoint(endpoint)
@@ -122,13 +135,13 @@ def run_cloud_doctor(
122
135
  }
123
136
  )
124
137
 
125
- token_present = bool(os.environ.get(token_env, ""))
126
- if token_present:
138
+ if token_resolution.has_token:
127
139
  checks.append(
128
140
  {
129
141
  "name": "token",
130
142
  "status": "pass",
131
- "message": f"{token_env} is set",
143
+ "message": token_resolution.message,
144
+ "detail": token_resolution.safe_detail(),
132
145
  }
133
146
  )
134
147
  elif is_local_http_endpoint(endpoint):
@@ -137,8 +150,9 @@ def run_cloud_doctor(
137
150
  "name": "token",
138
151
  "status": "warn",
139
152
  "message": (
140
- f"{token_env} is not set; local configless ingest may still work"
153
+ f"{token_resolution.message}; local configless ingest may still work"
141
154
  ),
155
+ "detail": token_resolution.safe_detail(),
142
156
  }
143
157
  )
144
158
  elif not require_token:
@@ -146,11 +160,9 @@ def run_cloud_doctor(
146
160
  {
147
161
  "name": "token",
148
162
  "status": "warn",
149
- "message": f"{token_env} is not set; upload will remain disabled",
150
- "remediation": (
151
- "Run `code-mower cloud setup --token-stdin` or export "
152
- f"{token_env} before using --yes."
153
- ),
163
+ "message": f"{token_resolution.message}; upload will remain disabled",
164
+ "detail": token_resolution.safe_detail(),
165
+ "remediation": token_resolution.remediation,
154
166
  }
155
167
  )
156
168
  else:
@@ -158,11 +170,9 @@ def run_cloud_doctor(
158
170
  {
159
171
  "name": "token",
160
172
  "status": "fail",
161
- "message": f"{token_env} is not set",
162
- "remediation": (
163
- "Set CODE_MOWER_CLOUD_TOKEN to a team ingest token before "
164
- "running cloud upload --yes."
165
- ),
173
+ "message": token_resolution.message,
174
+ "detail": token_resolution.safe_detail(),
175
+ "remediation": token_resolution.remediation,
166
176
  }
167
177
  )
168
178