code-mower 0.9.3b1__tar.gz → 0.9.4b1__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 (354) hide show
  1. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/PKG-INFO +10 -7
  2. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/README.md +9 -6
  3. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/pyproject.toml +1 -1
  4. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/__init__.py +1 -1
  5. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/calibration/arms.py +1 -0
  6. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/calibration/planning.py +1 -0
  7. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/cli.py +3 -0
  8. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/github.py +9 -1
  9. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/github_branch.py +7 -1
  10. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/github_human_token.py +25 -4
  11. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/github_repo.py +26 -5
  12. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/models.py +29 -3
  13. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/output.py +13 -2
  14. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/runner.py +1 -0
  15. code_mower-0.9.4b1/src/code_mower/lane_configs/muse_cli.py +35 -0
  16. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/migration.py +97 -8
  17. code_mower-0.9.4b1/src/code_mower/muse_cli_audit_pr.py +502 -0
  18. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/package_manifest.py +2 -0
  19. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/provider_registry.py +39 -0
  20. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/templates/code-mower.example.yml +38 -1
  21. {code_mower-0.9.3b1 → code_mower-0.9.4b1/src/code_mower}/templates/providers.yml +38 -1
  22. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/templates/workflows/builder-provenance.yml.j2 +1 -1
  23. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower.egg-info/PKG-INFO +10 -7
  24. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower.egg-info/SOURCES.txt +3 -0
  25. code_mower-0.9.4b1/templates/providers/muse_cli.yml +35 -0
  26. {code_mower-0.9.3b1/src/code_mower → code_mower-0.9.4b1}/templates/providers.yml +38 -1
  27. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/templates/workflows/builder-provenance.yml.j2 +1 -1
  28. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_clear_stale.py +8 -0
  29. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_doctor_github_checks.py +85 -0
  30. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_doctor_output.py +35 -0
  31. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_provider_local_cli.py +214 -1
  32. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_release_hygiene.py +171 -43
  33. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/CODE_OF_CONDUCT.md +0 -0
  34. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/LICENSE +0 -0
  35. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/MANIFEST.in +0 -0
  36. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/NOTICE +0 -0
  37. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/SUPPORT.md +0 -0
  38. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/requirements/requirements.txt +0 -0
  39. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/setup.cfg +0 -0
  40. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/adapters/__init__.py +0 -0
  41. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/adapters/_base.py +0 -0
  42. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/adapters/cursor_bugbot.py +0 -0
  43. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/adapters/gitar.py +0 -0
  44. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/adapters/greptile.py +0 -0
  45. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/adapters/qodo.py +0 -0
  46. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/antigravity_cli_audit_pr.py +0 -0
  47. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/antigravity_sdk_probe.py +0 -0
  48. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/audit_handoff_log.py +0 -0
  49. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/audit_labeler_lib.py +0 -0
  50. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/audit_limits.py +0 -0
  51. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/audit_progress.py +0 -0
  52. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/blind_review_artifacts.py +0 -0
  53. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/blind_review_coordinator.py +0 -0
  54. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/board.py +0 -0
  55. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/board_store.py +0 -0
  56. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/bootstrap.py +0 -0
  57. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/builder_experiment.py +0 -0
  58. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/builder_runs.py +0 -0
  59. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/calibration/__init__.py +0 -0
  60. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/calibration/auto_discovery.py +0 -0
  61. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/calibration/commands.py +0 -0
  62. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/calibration/context_inputs.py +0 -0
  63. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/calibration/corpus.py +0 -0
  64. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/calibration/effect_report.py +0 -0
  65. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/calibration/evidence.py +0 -0
  66. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/calibration/evidence_report.py +0 -0
  67. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/calibration/identity.py +0 -0
  68. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/calibration/metrics.py +0 -0
  69. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/calibration/overlap.py +0 -0
  70. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/calibration/policy.py +0 -0
  71. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/calibration/results.py +0 -0
  72. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/calibration/run_results.py +0 -0
  73. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/calibration/run_status.py +0 -0
  74. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/calibration/runner.py +0 -0
  75. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/calibration/truth.py +0 -0
  76. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/calibration/value_report.py +0 -0
  77. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/checks.py +0 -0
  78. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/claude_audit_pr.py +0 -0
  79. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/claude_cli_bounce.py +0 -0
  80. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/claude_cli_environment.py +0 -0
  81. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/clear_stale.py +0 -0
  82. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/cloud.py +0 -0
  83. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/cloud_client/__init__.py +0 -0
  84. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/cloud_client/bundle.py +0 -0
  85. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/cloud_client/doctor.py +0 -0
  86. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/cloud_client/dogfood.py +0 -0
  87. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/cloud_client/endpoints.py +0 -0
  88. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/cloud_client/errors.py +0 -0
  89. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/cloud_client/events.py +0 -0
  90. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/cloud_client/export.py +0 -0
  91. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/cloud_client/git_metadata.py +0 -0
  92. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/cloud_client/manifest.py +0 -0
  93. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/cloud_client/operations.py +0 -0
  94. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/cloud_client/reports.py +0 -0
  95. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/cloud_client/setup.py +0 -0
  96. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/cloud_client/tokens.py +0 -0
  97. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/cloud_client/upload.py +0 -0
  98. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/code_mower_calibration.py +0 -0
  99. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/code_mower_context_packs.py +0 -0
  100. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/code_mower_merge.py +0 -0
  101. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/code_mower_telemetry.py +0 -0
  102. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/coderabbit_cli_audit_pr.py +0 -0
  103. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/codex_audit_env_preflight.py +0 -0
  104. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/codex_audit_pr.py +0 -0
  105. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/codex_audit_schema_smoke.py +0 -0
  106. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/codex_audit_verdict.schema.json +0 -0
  107. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/config.py +0 -0
  108. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/decisions.py +0 -0
  109. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/doctor.py +0 -0
  110. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/__init__.py +0 -0
  111. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/adoption.py +0 -0
  112. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/audit_limits.py +0 -0
  113. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/cloud.py +0 -0
  114. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/common.py +0 -0
  115. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/github_actions.py +0 -0
  116. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/github_actions_cost.py +0 -0
  117. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/github_actions_cost_summary.py +0 -0
  118. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/github_actions_failure_annotations.py +0 -0
  119. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/github_actions_failure_models.py +0 -0
  120. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/github_actions_failure_scan.py +0 -0
  121. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/github_actions_failure_selection.py +0 -0
  122. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/github_actions_failures.py +0 -0
  123. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/github_actions_permissions.py +0 -0
  124. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/github_api.py +0 -0
  125. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/github_config.py +0 -0
  126. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/github_provider.py +0 -0
  127. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/github_trusted_authors.py +0 -0
  128. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/groups.py +0 -0
  129. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/presets.py +0 -0
  130. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/privacy.py +0 -0
  131. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/provider_api_model.py +0 -0
  132. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/provider_api_model_openai.py +0 -0
  133. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/provider_api_model_profiles.py +0 -0
  134. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/provider_env.py +0 -0
  135. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/provider_env_required.py +0 -0
  136. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/provider_env_tokens.py +0 -0
  137. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/provider_local_audit_setup.py +0 -0
  138. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/provider_local_cli.py +0 -0
  139. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/provider_local_cli_commands.py +0 -0
  140. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/provider_local_cli_probe_config.py +0 -0
  141. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/provider_probe.py +0 -0
  142. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/provider_probe_auth.py +0 -0
  143. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/provider_probe_evaluation.py +0 -0
  144. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/provider_probe_json.py +0 -0
  145. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/provider_probe_remediation.py +0 -0
  146. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/provider_review_hygiene.py +0 -0
  147. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/providers.py +0 -0
  148. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/registry.py +0 -0
  149. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/runtime.py +0 -0
  150. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/runtime_github_auth.py +0 -0
  151. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/doctor_checks/self_hosted_runner.py +0 -0
  152. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/gate_health.py +0 -0
  153. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/gemini_cli_audit_pr.py +0 -0
  154. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/git_identity.py +0 -0
  155. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/grok_build_audit_pr.py +0 -0
  156. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/hermes_cli_audit_pr.py +0 -0
  157. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/init.py +0 -0
  158. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/lane_configs/__init__.py +0 -0
  159. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/lane_configs/aider.py +0 -0
  160. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/lane_configs/antigravity_cli.py +0 -0
  161. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/lane_configs/claude.py +0 -0
  162. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/lane_configs/codex.py +0 -0
  163. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/lane_configs/devin.py +0 -0
  164. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/lane_configs/gemini_cli.py +0 -0
  165. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/lane_configs/grok_build.py +0 -0
  166. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/lane_configs/hermes_cli.py +0 -0
  167. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/lane_configs/local_llm.py +0 -0
  168. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/lane_status.py +0 -0
  169. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/local_llm_audit_pr.py +0 -0
  170. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/local_llm_bakeoff.py +0 -0
  171. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/local_llm_calibration.py +0 -0
  172. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/local_llm_profiles.py +0 -0
  173. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/migration_install.py +0 -0
  174. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/migration_mirror.py +0 -0
  175. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/migration_readiness.py +0 -0
  176. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/migration_rehearsal.py +0 -0
  177. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/next_steps.py +0 -0
  178. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/package.py +0 -0
  179. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/package_content.py +0 -0
  180. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/package_paths.py +0 -0
  181. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/package_rendering.py +0 -0
  182. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/package_static.py +0 -0
  183. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/plan_context.py +0 -0
  184. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/prompts.py +0 -0
  185. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/provider_runners/__init__.py +0 -0
  186. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/provider_runners/comments.py +0 -0
  187. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/provider_runners/exit_codes.py +0 -0
  188. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/provider_runners/git.py +0 -0
  189. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/provider_runners/github_auth.py +0 -0
  190. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/provider_runners/github_pr.py +0 -0
  191. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/provider_runners/pr_worktree.py +0 -0
  192. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/provider_runners/process.py +0 -0
  193. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/provider_runners/repo_paths.py +0 -0
  194. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/provider_runners/text_schema.py +0 -0
  195. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/provider_runners/verdict_artifacts.py +0 -0
  196. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/provider_runners/workspace.py +0 -0
  197. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/providers/__init__.py +0 -0
  198. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/providers/local_cli.py +0 -0
  199. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/providers/provenance.py +0 -0
  200. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/release_readiness.py +0 -0
  201. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/reviewer_metrics.py +0 -0
  202. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/reviewer_spend.py +0 -0
  203. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/saas_reviewer_labeler.py +0 -0
  204. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/secrets.py +0 -0
  205. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/templates/builder-experiment.example.json +0 -0
  206. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/templates/calibration-corpus.example.json +0 -0
  207. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/templates/calibration-corpus.json +0 -0
  208. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/templates/context-packs.example.json +0 -0
  209. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/templates/lane_prompts/base-audit.md +0 -0
  210. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/templates/lane_prompts/calibration-policy.md +0 -0
  211. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/templates/lane_prompts/context-driven-quality.md +0 -0
  212. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/templates/lane_prompts/docs-design.md +0 -0
  213. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/templates/lane_prompts/generic-programming.md +0 -0
  214. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/templates/lane_prompts/operability.md +0 -0
  215. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/templates/lane_prompts/package-runtime.md +0 -0
  216. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/templates/lane_prompts/plan-conformance.md +0 -0
  217. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/templates/lane_prompts/security-threat-model.md +0 -0
  218. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/templates/lanes/README.md +0 -0
  219. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/templates/lanes/claude.md +0 -0
  220. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/templates/lanes/codex.md +0 -0
  221. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/templates/lanes/cursor.md +0 -0
  222. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/templates/lanes/generic.md +0 -0
  223. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/templates/lanes/run_mac_lane.sh +0 -0
  224. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/templates/product-support/code_mower +0 -0
  225. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/templates/product-support/code_mower_standalone_pin.env +0 -0
  226. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/templates/product-support/code_mower_standalone_shadow.sh +0 -0
  227. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/templates/product-support/run_claude_audit_pr.sh +0 -0
  228. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/templates/product-support/run_codex_audit_pr.sh +0 -0
  229. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/templates/product-support/safe_gh_comment.py +0 -0
  230. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/templates/product-support/status_report.py +0 -0
  231. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/templates/reviewer-spend.example.json +0 -0
  232. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/templates/reviewer-value-report.example.md +0 -0
  233. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/templates/workflows/audit-label-cleanup.yml.j2 +0 -0
  234. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/templates/workflows/code-mower-agent-pr-labeler.yml.j2 +0 -0
  235. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/templates/workflows/code-mower-fix-round-dispatch.yml.j2 +0 -0
  236. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/templates/workflows/code-mower-gate-health.yml.j2 +0 -0
  237. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/templates/workflows/code-mower-gate.yml.j2 +0 -0
  238. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/templates/workflows/dispatch-lanes.yml.j2 +0 -0
  239. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/templates/workflows/hosted-bridge.yml.j2 +0 -0
  240. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/templates/workflows/lane-mac-runner.yml.j2 +0 -0
  241. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/templates/workflows/local-cli-audit.yml.j2 +0 -0
  242. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/templates/workflows/needs-owner-notify.yml.j2 +0 -0
  243. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/templates/workflows/private-standalone-shadow.yml.j2 +0 -0
  244. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/templates/workflows/review-clear-stale.yml.j2 +0 -0
  245. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/templates/workflows/saas-reviewer-labeler.yml.j2 +0 -0
  246. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/templates/workflows/self-hosted-local-audit.yml.j2 +0 -0
  247. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/templates/workflows/trailer-comment-labeler.yml.j2 +0 -0
  248. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/templates/workflows/weekly-status.yml.j2 +0 -0
  249. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/trailer_comment_labeler.py +0 -0
  250. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/versioning.py +0 -0
  251. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/work_orders.py +0 -0
  252. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower/workflow_actionlint.py +0 -0
  253. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower.egg-info/dependency_links.txt +0 -0
  254. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower.egg-info/entry_points.txt +0 -0
  255. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower.egg-info/requires.txt +0 -0
  256. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/src/code_mower.egg-info/top_level.txt +0 -0
  257. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/templates/builder-experiment.example.json +0 -0
  258. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/templates/calibration-corpus.example.json +0 -0
  259. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/templates/calibration-corpus.json +0 -0
  260. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/templates/code-mower.yml.j2 +0 -0
  261. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/templates/context-packs.example.json +0 -0
  262. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/templates/cursor/BUGBOT.md +0 -0
  263. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/templates/lanes/README.md +0 -0
  264. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/templates/lanes/claude.md +0 -0
  265. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/templates/lanes/codex.md +0 -0
  266. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/templates/lanes/cursor.md +0 -0
  267. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/templates/lanes/generic.md +0 -0
  268. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/templates/lanes/run_mac_lane.sh +0 -0
  269. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/templates/providers/acp_bridge.yml +0 -0
  270. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/templates/providers/aider.yml +0 -0
  271. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/templates/providers/antigravity_cli.yml +0 -0
  272. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/templates/providers/claude_audit.yml +0 -0
  273. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/templates/providers/claude_review.yml +0 -0
  274. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/templates/providers/coderabbit_cli.yml +0 -0
  275. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/templates/providers/codex.yml +0 -0
  276. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/templates/providers/cursor_bugbot.yml +0 -0
  277. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/templates/providers/devin.yml +0 -0
  278. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/templates/providers/gemini_cli.yml +0 -0
  279. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/templates/providers/gitar.yml +0 -0
  280. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/templates/providers/greptile.yml +0 -0
  281. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/templates/providers/hermes_cli.yml +0 -0
  282. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/templates/providers/local_llm.yml +0 -0
  283. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/templates/providers/qodo.yml +0 -0
  284. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/templates/reviewer-spend.example.json +0 -0
  285. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/templates/reviewer-value-report.example.md +0 -0
  286. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/templates/workflows/audit-label-cleanup.yml.j2 +0 -0
  287. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/templates/workflows/blind-review-artifacts-dry-run.yml.j2 +0 -0
  288. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/templates/workflows/code-mower-agent-pr-labeler.yml.j2 +0 -0
  289. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/templates/workflows/code-mower-fix-round-dispatch.yml.j2 +0 -0
  290. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/templates/workflows/code-mower-gate-health.yml.j2 +0 -0
  291. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/templates/workflows/code-mower-gate.yml.j2 +0 -0
  292. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/templates/workflows/dispatch-lanes.yml.j2 +0 -0
  293. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/templates/workflows/hosted-bridge.yml.j2 +0 -0
  294. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/templates/workflows/lane-mac-runner.yml.j2 +0 -0
  295. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/templates/workflows/local-cli-audit.yml.j2 +0 -0
  296. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/templates/workflows/private-standalone-shadow.yml.j2 +0 -0
  297. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/templates/workflows/review-clear-stale.yml.j2 +0 -0
  298. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/templates/workflows/saas-reviewer-labeler.yml.j2 +0 -0
  299. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/templates/workflows/self-hosted-local-audit.yml.j2 +0 -0
  300. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/templates/workflows/trailer-comment-labeler.yml.j2 +0 -0
  301. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_antigravity_sdk_probe.py +0 -0
  302. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_audit_comment_posture.py +0 -0
  303. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_audit_limits.py +0 -0
  304. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_board.py +0 -0
  305. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_builder_experiment.py +0 -0
  306. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_builder_identity.py +0 -0
  307. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_builder_runs.py +0 -0
  308. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_calibration_effect_report.py +0 -0
  309. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_calibration_truth.py +0 -0
  310. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_checks.py +0 -0
  311. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_claude_audit_pr.py +0 -0
  312. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_claude_cli_bounce.py +0 -0
  313. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_cloud_client.py +0 -0
  314. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_cloud_git_metadata.py +0 -0
  315. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_cloud_manifest.py +0 -0
  316. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_cloud_reports.py +0 -0
  317. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_coderabbit_cli_audit_pr.py +0 -0
  318. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_codex_audit_env_preflight.py +0 -0
  319. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_codex_audit_pr.py +0 -0
  320. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_decision_audit_integration.py +0 -0
  321. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_decisions.py +0 -0
  322. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_doctor_actions_cost_summary.py +0 -0
  323. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_doctor_actions_failure_selection.py +0 -0
  324. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_doctor_boundaries.py +0 -0
  325. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_doctor_privacy.py +0 -0
  326. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_doctor_provider_env_required.py +0 -0
  327. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_doctor_provider_env_tokens.py +0 -0
  328. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_doctor_provider_local_audit_setup.py +0 -0
  329. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_doctor_provider_probe.py +0 -0
  330. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_doctor_provider_review_hygiene.py +0 -0
  331. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_doctor_registry.py +0 -0
  332. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_doctor_runtime.py +0 -0
  333. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_doctor_self_hosted_runner.py +0 -0
  334. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_gate_health.py +0 -0
  335. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_init_actionlint.py +0 -0
  336. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_init_build_loop.py +0 -0
  337. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_lane_status.py +0 -0
  338. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_local_llm_github_helpers.py +0 -0
  339. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_migration_setup_drift.py +0 -0
  340. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_plan_context.py +0 -0
  341. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_prompts.py +0 -0
  342. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_provider_fixture_contracts.py +0 -0
  343. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_provider_runners_comments.py +0 -0
  344. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_provider_runners_git.py +0 -0
  345. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_provider_runners_github_pr.py +0 -0
  346. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_provider_runners_pr_worktree.py +0 -0
  347. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_provider_runners_process.py +0 -0
  348. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_provider_runners_repo_paths.py +0 -0
  349. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_provider_runners_text_schema.py +0 -0
  350. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_provider_runners_workspace.py +0 -0
  351. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_reviewer_metrics_core.py +0 -0
  352. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_reviewer_spend.py +0 -0
  353. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/tests/test_trailer_comment_labeler.py +0 -0
  354. {code_mower-0.9.3b1 → code_mower-0.9.4b1}/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.9.3b1
3
+ Version: 0.9.4b1
4
4
  Summary: Multi-reviewer AI code audit orchestration
5
5
  License-Expression: Apache-2.0
6
6
  Requires-Python: >=3.12
@@ -95,6 +95,9 @@ wrappers, run `code-mower migration setup-drift --repo-path .` before copying a
95
95
  fresh `.code-mower.generated` tree. It is read-only and reports path-level
96
96
  classifications (`same`, `differs`, `new`, `repo-only`,
97
97
  `missing-from-output`) without file contents or diffs.
98
+ If the repository already has builder or dispatch lanes, rerun setup drift with
99
+ the current builder set, for example `--builders codex,claude,cursor`, before
100
+ opening the reviewed upgrade PR.
98
101
  Use [Upgrade An Existing Repository](docs/upgrade-existing-repo.md) for the
99
102
  reviewed PR flow, repo-only file handling, builder identity checks, and
100
103
  wrapper/pin drift checks.
@@ -170,7 +173,7 @@ after reinstalling, especially when switching between pipx and uv.
170
173
  | 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) |
171
174
 
172
175
  The current package-index announcement entry point is the tagged
173
- [Try Code Mower In 10 Minutes](https://github.com/codemower-ai/code-mower/blob/v0.9.3-beta.1/docs/try-in-10-minutes.md)
176
+ [Try Code Mower In 10 Minutes](https://github.com/codemower-ai/code-mower/blob/v0.9.4-beta.1/docs/try-in-10-minutes.md)
174
177
  guide. The v0.9 beta includes the completed native Board work plus the adoption
175
178
  and upgrade hardening from recent install rehearsals; v0.9.3 keeps the path
176
179
  smooth by clarifying starter-package diagnostics, surfacing richer top-level
@@ -207,7 +210,7 @@ Provider-contract baseline for the next release train:
207
210
 
208
211
  For release verification,
209
212
  [First-User Install Rehearsal](docs/first-user-install-rehearsal.md) records
210
- the package-index procedure for `v0.9.3-beta.1` / `code-mower==0.9.3b1`. The
213
+ the package-index procedure for `v0.9.4-beta.1` / `code-mower==0.9.4b1`. The
211
214
  GitHub release records the workflow and rehearsal evidence for the exact tag.
212
215
 
213
216
  ## Optional: Plan Before Coding
@@ -355,8 +358,8 @@ The first recommended lanes are local/manual:
355
358
  | Gitar | advisory third signal | informational until calibrated |
356
359
 
357
360
  Everything else starts manual or informational until your own calibration data
358
- proves it is useful: Antigravity/Gemini, Hermes, CodeRabbit CLI, Cursor BugBot,
359
- Qodo, Greptile, Devin, local LLMs, and future ACP bridges.
361
+ proves it is useful: Antigravity/Gemini, Muse, Hermes, CodeRabbit CLI, Cursor
362
+ BugBot, Qodo, Greptile, Devin, local LLMs, and future ACP bridges.
360
363
 
361
364
  Gemini CLI and Antigravity are distinct lane ids even though both are Google
362
365
  surfaces and may use Gemini model infrastructure. Keep their auth, model
@@ -393,8 +396,8 @@ measurement work.
393
396
 
394
397
  ## Installation Status
395
398
 
396
- The current package-index beta baseline is `v0.9.3-beta.1`, with pinned package
397
- install spec `code-mower==0.9.3b1`. Release evidence is recorded on the GitHub
399
+ The current package-index beta baseline is `v0.9.4-beta.1`, with pinned package
400
+ install spec `code-mower==0.9.4b1`. Release evidence is recorded on the GitHub
398
401
  release and in the first-user install rehearsal. The public repository is
399
402
  [codemower-ai/code-mower](https://github.com/codemower-ai/code-mower), and
400
403
  GitHub releases remain the auditable source for tags, build artifacts, and
@@ -78,6 +78,9 @@ wrappers, run `code-mower migration setup-drift --repo-path .` before copying a
78
78
  fresh `.code-mower.generated` tree. It is read-only and reports path-level
79
79
  classifications (`same`, `differs`, `new`, `repo-only`,
80
80
  `missing-from-output`) without file contents or diffs.
81
+ If the repository already has builder or dispatch lanes, rerun setup drift with
82
+ the current builder set, for example `--builders codex,claude,cursor`, before
83
+ opening the reviewed upgrade PR.
81
84
  Use [Upgrade An Existing Repository](docs/upgrade-existing-repo.md) for the
82
85
  reviewed PR flow, repo-only file handling, builder identity checks, and
83
86
  wrapper/pin drift checks.
@@ -153,7 +156,7 @@ after reinstalling, especially when switching between pipx and uv.
153
156
  | 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) |
154
157
 
155
158
  The current package-index announcement entry point is the tagged
156
- [Try Code Mower In 10 Minutes](https://github.com/codemower-ai/code-mower/blob/v0.9.3-beta.1/docs/try-in-10-minutes.md)
159
+ [Try Code Mower In 10 Minutes](https://github.com/codemower-ai/code-mower/blob/v0.9.4-beta.1/docs/try-in-10-minutes.md)
157
160
  guide. The v0.9 beta includes the completed native Board work plus the adoption
158
161
  and upgrade hardening from recent install rehearsals; v0.9.3 keeps the path
159
162
  smooth by clarifying starter-package diagnostics, surfacing richer top-level
@@ -190,7 +193,7 @@ Provider-contract baseline for the next release train:
190
193
 
191
194
  For release verification,
192
195
  [First-User Install Rehearsal](docs/first-user-install-rehearsal.md) records
193
- the package-index procedure for `v0.9.3-beta.1` / `code-mower==0.9.3b1`. The
196
+ the package-index procedure for `v0.9.4-beta.1` / `code-mower==0.9.4b1`. The
194
197
  GitHub release records the workflow and rehearsal evidence for the exact tag.
195
198
 
196
199
  ## Optional: Plan Before Coding
@@ -338,8 +341,8 @@ The first recommended lanes are local/manual:
338
341
  | Gitar | advisory third signal | informational until calibrated |
339
342
 
340
343
  Everything else starts manual or informational until your own calibration data
341
- proves it is useful: Antigravity/Gemini, Hermes, CodeRabbit CLI, Cursor BugBot,
342
- Qodo, Greptile, Devin, local LLMs, and future ACP bridges.
344
+ proves it is useful: Antigravity/Gemini, Muse, Hermes, CodeRabbit CLI, Cursor
345
+ BugBot, Qodo, Greptile, Devin, local LLMs, and future ACP bridges.
343
346
 
344
347
  Gemini CLI and Antigravity are distinct lane ids even though both are Google
345
348
  surfaces and may use Gemini model infrastructure. Keep their auth, model
@@ -376,8 +379,8 @@ measurement work.
376
379
 
377
380
  ## Installation Status
378
381
 
379
- The current package-index beta baseline is `v0.9.3-beta.1`, with pinned package
380
- install spec `code-mower==0.9.3b1`. Release evidence is recorded on the GitHub
382
+ The current package-index beta baseline is `v0.9.4-beta.1`, with pinned package
383
+ install spec `code-mower==0.9.4b1`. Release evidence is recorded on the GitHub
381
384
  release and in the first-user install rehearsal. The public repository is
382
385
  [codemower-ai/code-mower](https://github.com/codemower-ai/code-mower), and
383
386
  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.9.3b1"
7
+ version = "0.9.4b1"
8
8
  description = "Multi-reviewer AI code audit orchestration"
9
9
  requires-python = ">=3.12"
10
10
  readme = "README.md"
@@ -1,3 +1,3 @@
1
1
  """Code Mower package."""
2
2
 
3
- __version__ = "0.9.3b1"
3
+ __version__ = "0.9.4b1"
@@ -15,6 +15,7 @@ DEFAULT_CLI_LANES = (
15
15
  "hermes_cli",
16
16
  "coderabbit_cli",
17
17
  "grok_build",
18
+ "muse_cli",
18
19
  )
19
20
 
20
21
 
@@ -232,6 +232,7 @@ def build_pilot_plan(
232
232
  "gemini_cli",
233
233
  "grok_build",
234
234
  "hermes_cli",
235
+ "muse_cli",
235
236
  }:
236
237
  output_leaf = _local_cli_output_leaf(
237
238
  lane_slug=lane_slug,
@@ -70,6 +70,7 @@ from . import local_llm_bakeoff
70
70
  from . import local_llm_calibration
71
71
  from . import local_llm_profiles
72
72
  from . import migration as code_mower_migration
73
+ from . import muse_cli_audit_pr
73
74
  from . import next_steps as code_mower_next_steps
74
75
  from . import package as code_mower_package
75
76
  from . import prompts as code_mower_prompts
@@ -454,6 +455,7 @@ COMMAND_DESCRIPTIONS: dict[str, str] = {
454
455
  "local-llm": "Probe and run local OpenAI-compatible model lanes.",
455
456
  "migration": "Rehearse standalone package and wrapper migration paths.",
456
457
  "merge-plan": "Inspect merge-readiness signals and lane labels.",
458
+ "muse-cli": "Run a Muse CLI structured audit lane.",
457
459
  "next-steps": "Print the recommended next actions after setup.",
458
460
  "package": "Build or inspect package extraction artifacts.",
459
461
  "plan": "Create local issue-derived planning artifacts.",
@@ -593,6 +595,7 @@ COMMAND_HANDLERS: dict[str, CommandHandler] = {
593
595
  "local-llm": _local_llm_main,
594
596
  "migration": code_mower_migration.main,
595
597
  "merge-plan": code_mower_merge.main,
598
+ "muse-cli": muse_cli_audit_pr.main,
596
599
  "next-steps": code_mower_next_steps.main,
597
600
  "package": _package_main,
598
601
  "plan": code_mower_work_orders.plan_main,
@@ -36,6 +36,7 @@ def check_github_setup(
36
36
  lanes: Sequence[tuple[str, Mapping[str, Any]]],
37
37
  http_timeout: int,
38
38
  actions_cost_sample: int = ACTIONS_COST_SAMPLE_DEFAULT,
39
+ adoption: bool = False,
39
40
  adoption_posture: str = "reviewer-gate",
40
41
  ) -> list[DoctorCheck]:
41
42
  checks: list[DoctorCheck] = []
@@ -127,6 +128,7 @@ def check_github_setup(
127
128
  required_status_context=(
128
129
  "code-mower/gate" if has_merge_authority else None
129
130
  ),
131
+ adoption=adoption,
130
132
  ),
131
133
  check_recent_pr_diff_median(
132
134
  gh_path=gh_path,
@@ -143,12 +145,18 @@ def check_github_setup(
143
145
  config=config,
144
146
  lanes=lanes,
145
147
  http_timeout=http_timeout,
148
+ adoption=adoption,
146
149
  adoption_posture=adoption_posture,
147
150
  )
148
151
  )
149
152
  if has_merge_authority:
150
153
  checks.append(
151
- check_repo_auto_merge(slug=slug, repo_payload=metadata.payload)
154
+ check_repo_auto_merge(
155
+ slug=slug,
156
+ repo_payload=metadata.payload,
157
+ adoption=adoption,
158
+ adoption_posture=adoption_posture,
159
+ )
152
160
  )
153
161
 
154
162
  provider_check = check_private_repo_provider_surface(
@@ -18,6 +18,7 @@ def check_branch_protection(
18
18
  default_branch: str,
19
19
  http_timeout: int,
20
20
  required_status_context: str | None = None,
21
+ adoption: bool = False,
21
22
  ) -> DoctorCheck:
22
23
  encoded_branch = urllib.parse.quote(default_branch, safe="")
23
24
  protection_payload, protection_detail = _github_api_json(
@@ -77,9 +78,10 @@ def check_branch_protection(
77
78
  if str(GITHUB_ACTIONS_APP_ID) in app_ids
78
79
  else "a specific GitHub App"
79
80
  )
81
+ status = STATUS_WARN if adoption else STATUS_FAIL
80
82
  return DoctorCheck(
81
83
  name="github.branch_protection",
82
- status=STATUS_FAIL,
84
+ status=status,
83
85
  message=(
84
86
  f"{slug}@{default_branch} requires {required_status_context} "
85
87
  f"from {source_description} instead of Any source"
@@ -87,6 +89,8 @@ def check_branch_protection(
87
89
  detail={
88
90
  "repo": slug,
89
91
  "default_branch": default_branch,
92
+ "owner_action": adoption,
93
+ "owner_action_kind": "branch_protection_gate_binding",
90
94
  "required_status_context": required_status_context,
91
95
  "required_status_contexts": contexts,
92
96
  "required_status_check_count": len(contexts),
@@ -110,6 +114,8 @@ def check_branch_protection(
110
114
  detail={
111
115
  "repo": slug,
112
116
  "default_branch": default_branch,
117
+ "owner_action": adoption,
118
+ "owner_action_kind": "branch_protection_gate_requirement",
113
119
  "required_status_context": required_status_context,
114
120
  "required_status_check_count": len(contexts),
115
121
  "required_status_contexts": contexts,
@@ -119,6 +119,7 @@ def check_human_automation_token(
119
119
  config: Mapping[str, Any],
120
120
  lanes: Sequence[tuple[str, Mapping[str, Any]]],
121
121
  http_timeout: int,
122
+ adoption: bool = False,
122
123
  adoption_posture: str = "reviewer-gate",
123
124
  now: datetime | None = None,
124
125
  ) -> DoctorCheck:
@@ -146,7 +147,8 @@ def check_human_automation_token(
146
147
  http_timeout=http_timeout,
147
148
  )
148
149
  if secret_payload is None:
149
- status = _blocking_status_for_posture(adoption_posture)
150
+ status = STATUS_WARN if adoption else _blocking_status_for_posture(adoption_posture)
151
+ owner_action = status == STATUS_WARN
150
152
  return DoctorCheck(
151
153
  name="github.human_automation_token",
152
154
  status=status,
@@ -158,7 +160,12 @@ def check_human_automation_token(
158
160
  else ""
159
161
  )
160
162
  ),
161
- detail={**detail, "secret_check": secret_detail},
163
+ detail={
164
+ **detail,
165
+ "owner_action": owner_action,
166
+ "owner_action_kind": "human_automation_token",
167
+ "secret_check": secret_detail,
168
+ },
162
169
  remediation=(
163
170
  f"Create one human-owned fine-grained PAT secret with "
164
171
  f"`gh secret set {secret_name}`. Grant repository Contents read, "
@@ -179,6 +186,8 @@ def check_human_automation_token(
179
186
  message=f"{slug} is missing the {expires_var} human token expiry metadata",
180
187
  detail={
181
188
  **detail,
189
+ "owner_action": True,
190
+ "owner_action_kind": "human_automation_token_expiry",
182
191
  "created_at": str(secret_payload.get("created_at") or ""),
183
192
  "updated_at": str(secret_payload.get("updated_at") or ""),
184
193
  "expiry_check": variable_detail,
@@ -210,7 +219,12 @@ def check_human_automation_token(
210
219
  name="github.human_automation_token",
211
220
  status=STATUS_WARN,
212
221
  message=f"{slug} still has placeholder {expires_var} value",
213
- detail={**detail, "expires_at": expiry_text},
222
+ detail={
223
+ **detail,
224
+ "owner_action": True,
225
+ "owner_action_kind": "human_automation_token_expiry",
226
+ "expires_at": expiry_text,
227
+ },
214
228
  remediation=(
215
229
  f"Set {expires_var} to the PAT expiry date in YYYY-MM-DD "
216
230
  "format, or to `never` for a non-expiring PAT."
@@ -222,7 +236,12 @@ def check_human_automation_token(
222
236
  name="github.human_automation_token",
223
237
  status=STATUS_WARN,
224
238
  message=f"{slug} has an invalid {expires_var} value",
225
- detail={**detail, "expires_at": expiry_text},
239
+ detail={
240
+ **detail,
241
+ "owner_action": True,
242
+ "owner_action_kind": "human_automation_token_expiry",
243
+ "expires_at": expiry_text,
244
+ },
226
245
  remediation=(
227
246
  f"Set {expires_var} to the PAT expiry date in YYYY-MM-DD "
228
247
  "format, or to `never` for a non-expiring PAT."
@@ -247,6 +266,8 @@ def check_human_automation_token(
247
266
  ),
248
267
  detail={
249
268
  **detail,
269
+ "owner_action": status != STATUS_PASS,
270
+ "owner_action_kind": "human_automation_token_expiry",
250
271
  "created_at": str(secret_payload.get("created_at") or ""),
251
272
  "updated_at": str(secret_payload.get("updated_at") or ""),
252
273
  "expires_at": expiry.isoformat(),
@@ -5,7 +5,7 @@ from __future__ import annotations
5
5
  from dataclasses import dataclass
6
6
  from typing import Any, Mapping
7
7
 
8
- from .common import DoctorCheck, STATUS_FAIL, STATUS_PASS, STATUS_WARN
8
+ from .common import DoctorCheck, OBSERVER_ADOPTION_POSTURES, STATUS_FAIL, STATUS_PASS, STATUS_WARN
9
9
  from .github_api import _github_api_json
10
10
 
11
11
 
@@ -120,13 +120,23 @@ def check_repo_permissions(*, slug: str, repo_payload: Mapping[str, Any]) -> Doc
120
120
  )
121
121
 
122
122
 
123
- def check_repo_auto_merge(*, slug: str, repo_payload: Mapping[str, Any]) -> DoctorCheck:
123
+ def check_repo_auto_merge(
124
+ *,
125
+ slug: str,
126
+ repo_payload: Mapping[str, Any],
127
+ adoption: bool = False,
128
+ adoption_posture: str = "reviewer-gate",
129
+ ) -> DoctorCheck:
124
130
  if "allow_auto_merge" not in repo_payload:
125
131
  return DoctorCheck(
126
132
  name="github.repo.auto_merge",
127
133
  status=STATUS_WARN,
128
134
  message=f"{slug} metadata did not include auto-merge posture",
129
- detail={"repo": slug},
135
+ detail={
136
+ "repo": slug,
137
+ "owner_action": adoption,
138
+ "owner_action_kind": "repo_auto_merge_visibility",
139
+ },
130
140
  remediation=(
131
141
  "Verify repository auto-merge manually before relying on the "
132
142
  "generated Code Mower gate to call enablePullRequestAutoMerge."
@@ -134,15 +144,26 @@ def check_repo_auto_merge(*, slug: str, repo_payload: Mapping[str, Any]) -> Doct
134
144
  )
135
145
 
136
146
  allow_auto_merge = bool(repo_payload.get("allow_auto_merge"))
147
+ blocked = (
148
+ not allow_auto_merge
149
+ and not adoption
150
+ and adoption_posture not in OBSERVER_ADOPTION_POSTURES
151
+ )
137
152
  return DoctorCheck(
138
153
  name="github.repo.auto_merge",
139
- status=STATUS_PASS if allow_auto_merge else STATUS_FAIL,
154
+ status=STATUS_PASS if allow_auto_merge else (STATUS_FAIL if blocked else STATUS_WARN),
140
155
  message=(
141
156
  f"{slug} has auto-merge enabled"
142
157
  if allow_auto_merge
143
158
  else f"{slug} does not allow auto-merge"
144
159
  ),
145
- detail={"repo": slug, "allow_auto_merge": allow_auto_merge},
160
+ detail={
161
+ "repo": slug,
162
+ "allow_auto_merge": allow_auto_merge,
163
+ "owner_action": not allow_auto_merge,
164
+ "owner_action_kind": "repo_auto_merge",
165
+ "adoption_posture": adoption_posture,
166
+ },
146
167
  remediation=(
147
168
  None
148
169
  if allow_auto_merge
@@ -12,6 +12,17 @@ STATUS_PASS = "pass"
12
12
  STATUS_WARN = "warn"
13
13
  STATUS_FAIL = "fail"
14
14
  STATUS_SKIP = "skip"
15
+ OWNER_ACTION_DETAIL_KEY = "owner_action"
16
+
17
+
18
+ def is_owner_action_check(check: "DoctorCheck") -> bool:
19
+ """Return true when a warning represents an explicit repo-owner action."""
20
+
21
+ return (
22
+ check.status == STATUS_WARN
23
+ and isinstance(check.detail, Mapping)
24
+ and bool(check.detail.get(OWNER_ACTION_DETAIL_KEY))
25
+ )
15
26
 
16
27
 
17
28
  @dataclass(frozen=True)
@@ -47,13 +58,21 @@ class DoctorReport:
47
58
 
48
59
  @property
49
60
  def warnings(self) -> int:
50
- return sum(1 for check in self.checks if check.status == STATUS_WARN)
61
+ return sum(
62
+ 1
63
+ for check in self.checks
64
+ if check.status == STATUS_WARN and not is_owner_action_check(check)
65
+ )
66
+
67
+ @property
68
+ def owner_actions(self) -> int:
69
+ return sum(1 for check in self.checks if is_owner_action_check(check))
51
70
 
52
71
  @property
53
72
  def status(self) -> str:
54
73
  if self.failures:
55
74
  return STATUS_FAIL
56
- if self.warnings:
75
+ if self.warnings or self.owner_actions:
57
76
  return STATUS_WARN
58
77
  return STATUS_PASS
59
78
 
@@ -92,13 +111,19 @@ class DoctorReport:
92
111
  if not group_checks:
93
112
  continue
94
113
  failures = sum(1 for check in group_checks if check.status == STATUS_FAIL)
95
- warnings = sum(1 for check in group_checks if check.status == STATUS_WARN)
114
+ owner_actions = sum(1 for check in group_checks if is_owner_action_check(check))
115
+ warnings = sum(
116
+ 1
117
+ for check in group_checks
118
+ if check.status == STATUS_WARN and not is_owner_action_check(check)
119
+ )
96
120
  skipped = sum(1 for check in group_checks if check.status == STATUS_SKIP)
97
121
  summary[group_id] = {
98
122
  "label": label,
99
123
  "checks": len(group_checks),
100
124
  "failures": failures,
101
125
  "warnings": warnings,
126
+ "owner_actions": owner_actions,
102
127
  "skipped": skipped,
103
128
  }
104
129
  return summary
@@ -114,6 +139,7 @@ class DoctorReport:
114
139
  "checks": len(self.checks),
115
140
  "failures": self.failures,
116
141
  "warnings": self.warnings,
142
+ "owner_actions": self.owner_actions,
117
143
  },
118
144
  "run_plan": list(self.run_plan),
119
145
  "groups": self.group_summary(),
@@ -8,6 +8,7 @@ from collections.abc import Iterable
8
8
  from .groups import GROUP_LABELS, doctor_check_group_id
9
9
  from .models import STATUS_FAIL, STATUS_SKIP, STATUS_WARN, DoctorCheck
10
10
  from .models import DoctorReport
11
+ from .models import is_owner_action_check
11
12
 
12
13
 
13
14
  def doctor_output_group(check: DoctorCheck) -> str:
@@ -29,6 +30,9 @@ def _format_status_summary(report: DoctorReport) -> str:
29
30
  parts = [f"{len(report.checks)} total"]
30
31
  if report.failures:
31
32
  parts.append(f"{report.failures} failed")
33
+ owner_actions = report.owner_actions
34
+ if owner_actions:
35
+ parts.append(f"{owner_actions} owner actions")
32
36
  if report.warnings:
33
37
  parts.append(f"{report.warnings} warnings")
34
38
  skipped = sum(1 for check in report.checks if check.status == STATUS_SKIP)
@@ -51,7 +55,8 @@ def _format_run_plan(report: DoctorReport) -> str | None:
51
55
 
52
56
  def _format_check(check: DoctorCheck) -> list[str]:
53
57
  lane = f" [{check.lane}]" if check.lane else ""
54
- lines = [f"- {check.status.upper()} {check.name}{lane}: {check.message}"]
58
+ status = "OWNER-ACTION" if is_owner_action_check(check) else check.status.upper()
59
+ lines = [f"- {status} {check.name}{lane}: {check.message}"]
55
60
  if check.remediation:
56
61
  lines.append(f" remediation: {check.remediation}")
57
62
  return lines
@@ -81,10 +86,16 @@ def render_doctor_text(report: DoctorReport) -> str:
81
86
  if not checks:
82
87
  continue
83
88
  failed = sum(1 for check in checks if check.status == STATUS_FAIL)
84
- warnings = sum(1 for check in checks if check.status == STATUS_WARN)
89
+ owner_actions = sum(1 for check in checks if is_owner_action_check(check))
90
+ warnings = (
91
+ sum(1 for check in checks if check.status == STATUS_WARN)
92
+ - owner_actions
93
+ )
85
94
  summary = []
86
95
  if failed:
87
96
  summary.append(f"{failed} failed")
97
+ if owner_actions:
98
+ summary.append(f"{owner_actions} owner actions")
88
99
  if warnings:
89
100
  summary.append(f"{warnings} warnings")
90
101
  heading = GROUP_LABELS.get(group_id, group_id.title())
@@ -270,6 +270,7 @@ def run_doctor(
270
270
  lanes=effective_lanes,
271
271
  http_timeout=http_timeout,
272
272
  actions_cost_sample=actions_cost_sample,
273
+ adoption=adoption,
273
274
  adoption_posture=adoption_posture,
274
275
  )
275
276
  )
@@ -0,0 +1,35 @@
1
+ from __future__ import annotations
2
+
3
+ import re
4
+
5
+ if __package__ and __package__.startswith("code_mower."):
6
+ from ..audit_labeler_lib import LaneConfig
7
+ else:
8
+ try:
9
+ from tools.audit_labeler_lib import LaneConfig
10
+ except ImportError: # pragma: no cover - direct `python tools/foo.py` execution
11
+ from audit_labeler_lib import LaneConfig
12
+
13
+ CONFIG = LaneConfig(
14
+ name="muse_cli",
15
+ display_name="Muse CLI",
16
+ needs_label="needs-muse-audit",
17
+ done_label="muse-audit-done",
18
+ blocked_label="muse-audit-blocked",
19
+ trailer_prefix="MUSE_AUDIT_STATE",
20
+ default_authors=("muse-cli-audit-bot", "muse-cli-audit-bot[bot]"),
21
+ authors_env_var="MUSE_CLI_BOT_AUTHORS",
22
+ pass_patterns=(
23
+ re.compile(
24
+ r"Muse(?: CLI)? Audit(?:\s+Result)?\s*[\u2014\u2013:-]\s*PASS\b",
25
+ flags=re.IGNORECASE,
26
+ ),
27
+ ),
28
+ blocked_patterns=(
29
+ re.compile(
30
+ r"Muse(?: CLI)? Audit(?:\s+Result)?\s*[\u2014\u2013:-]\s*(BLOCKED|BLOCKER|INCOMPLETE)\b",
31
+ flags=re.IGNORECASE,
32
+ ),
33
+ ),
34
+ token_env_vars=("MUSE_CLI_AUDIT_LABEL_TOKEN", "GITHUB_TOKEN"),
35
+ )