code-mower 0.5.0b5__py3-none-any.whl

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 (185) hide show
  1. code_mower/__init__.py +3 -0
  2. code_mower/adapters/__init__.py +39 -0
  3. code_mower/adapters/_base.py +148 -0
  4. code_mower/adapters/cursor_bugbot.py +97 -0
  5. code_mower/adapters/gitar.py +111 -0
  6. code_mower/adapters/greptile.py +191 -0
  7. code_mower/adapters/qodo.py +140 -0
  8. code_mower/antigravity_cli_audit_pr.py +241 -0
  9. code_mower/audit_handoff_log.py +345 -0
  10. code_mower/audit_labeler_lib.py +311 -0
  11. code_mower/audit_progress.py +203 -0
  12. code_mower/blind_review_artifacts.py +562 -0
  13. code_mower/blind_review_coordinator.py +276 -0
  14. code_mower/bootstrap.py +524 -0
  15. code_mower/builder_experiment.py +539 -0
  16. code_mower/calibration/__init__.py +181 -0
  17. code_mower/calibration/arms.py +267 -0
  18. code_mower/calibration/auto_discovery.py +348 -0
  19. code_mower/calibration/commands.py +192 -0
  20. code_mower/calibration/context_inputs.py +199 -0
  21. code_mower/calibration/corpus.py +91 -0
  22. code_mower/calibration/evidence.py +20 -0
  23. code_mower/calibration/evidence_report.py +360 -0
  24. code_mower/calibration/identity.py +27 -0
  25. code_mower/calibration/metrics.py +18 -0
  26. code_mower/calibration/overlap.py +103 -0
  27. code_mower/calibration/planning.py +309 -0
  28. code_mower/calibration/policy.py +207 -0
  29. code_mower/calibration/results.py +315 -0
  30. code_mower/calibration/run_results.py +147 -0
  31. code_mower/calibration/run_status.py +64 -0
  32. code_mower/calibration/runner.py +360 -0
  33. code_mower/calibration/truth.py +188 -0
  34. code_mower/calibration/value_report.py +142 -0
  35. code_mower/checks.py +402 -0
  36. code_mower/claude_audit_pr.py +1126 -0
  37. code_mower/claude_cli_bounce.py +303 -0
  38. code_mower/claude_cli_environment.py +73 -0
  39. code_mower/clear_stale.py +374 -0
  40. code_mower/cli.py +537 -0
  41. code_mower/cloud.py +674 -0
  42. code_mower/cloud_client/__init__.py +173 -0
  43. code_mower/cloud_client/bundle.py +155 -0
  44. code_mower/cloud_client/doctor.py +206 -0
  45. code_mower/cloud_client/dogfood.py +78 -0
  46. code_mower/cloud_client/endpoints.py +114 -0
  47. code_mower/cloud_client/errors.py +7 -0
  48. code_mower/cloud_client/events.py +278 -0
  49. code_mower/cloud_client/export.py +272 -0
  50. code_mower/cloud_client/git_metadata.py +46 -0
  51. code_mower/cloud_client/manifest.py +39 -0
  52. code_mower/cloud_client/operations.py +448 -0
  53. code_mower/cloud_client/reports.py +45 -0
  54. code_mower/cloud_client/setup.py +205 -0
  55. code_mower/cloud_client/upload.py +97 -0
  56. code_mower/code_mower_calibration.py +598 -0
  57. code_mower/code_mower_context_packs.py +591 -0
  58. code_mower/code_mower_merge.py +227 -0
  59. code_mower/code_mower_telemetry.py +561 -0
  60. code_mower/coderabbit_cli_audit_pr.py +526 -0
  61. code_mower/codex_audit_env_preflight.py +220 -0
  62. code_mower/codex_audit_pr.py +1738 -0
  63. code_mower/codex_audit_schema_smoke.py +160 -0
  64. code_mower/codex_audit_verdict.schema.json +44 -0
  65. code_mower/config.py +655 -0
  66. code_mower/doctor.py +161 -0
  67. code_mower/doctor_checks/__init__.py +104 -0
  68. code_mower/doctor_checks/cloud.py +129 -0
  69. code_mower/doctor_checks/common.py +215 -0
  70. code_mower/doctor_checks/github.py +128 -0
  71. code_mower/doctor_checks/github_actions.py +11 -0
  72. code_mower/doctor_checks/github_actions_cost.py +99 -0
  73. code_mower/doctor_checks/github_actions_cost_summary.py +111 -0
  74. code_mower/doctor_checks/github_actions_failure_annotations.py +27 -0
  75. code_mower/doctor_checks/github_actions_failure_models.py +47 -0
  76. code_mower/doctor_checks/github_actions_failure_scan.py +200 -0
  77. code_mower/doctor_checks/github_actions_failure_selection.py +63 -0
  78. code_mower/doctor_checks/github_actions_failures.py +103 -0
  79. code_mower/doctor_checks/github_actions_permissions.py +55 -0
  80. code_mower/doctor_checks/github_api.py +79 -0
  81. code_mower/doctor_checks/github_branch.py +56 -0
  82. code_mower/doctor_checks/github_config.py +25 -0
  83. code_mower/doctor_checks/github_provider.py +61 -0
  84. code_mower/doctor_checks/github_repo.py +120 -0
  85. code_mower/doctor_checks/groups.py +36 -0
  86. code_mower/doctor_checks/models.py +96 -0
  87. code_mower/doctor_checks/output.py +86 -0
  88. code_mower/doctor_checks/presets.py +64 -0
  89. code_mower/doctor_checks/privacy.py +20 -0
  90. code_mower/doctor_checks/provider_api_model.py +138 -0
  91. code_mower/doctor_checks/provider_api_model_openai.py +29 -0
  92. code_mower/doctor_checks/provider_api_model_profiles.py +137 -0
  93. code_mower/doctor_checks/provider_env.py +113 -0
  94. code_mower/doctor_checks/provider_env_required.py +56 -0
  95. code_mower/doctor_checks/provider_env_tokens.py +100 -0
  96. code_mower/doctor_checks/provider_local_cli.py +162 -0
  97. code_mower/doctor_checks/provider_local_cli_commands.py +47 -0
  98. code_mower/doctor_checks/provider_local_cli_probe_config.py +70 -0
  99. code_mower/doctor_checks/provider_probe.py +20 -0
  100. code_mower/doctor_checks/provider_probe_auth.py +52 -0
  101. code_mower/doctor_checks/provider_probe_evaluation.py +109 -0
  102. code_mower/doctor_checks/provider_probe_json.py +45 -0
  103. code_mower/doctor_checks/provider_probe_remediation.py +39 -0
  104. code_mower/doctor_checks/providers.py +159 -0
  105. code_mower/doctor_checks/registry.py +69 -0
  106. code_mower/doctor_checks/runner.py +188 -0
  107. code_mower/doctor_checks/runtime.py +89 -0
  108. code_mower/doctor_checks/runtime_github_auth.py +148 -0
  109. code_mower/gemini_cli_audit_pr.py +897 -0
  110. code_mower/hermes_cli_audit_pr.py +436 -0
  111. code_mower/init.py +888 -0
  112. code_mower/lane_configs/__init__.py +37 -0
  113. code_mower/lane_configs/aider.py +32 -0
  114. code_mower/lane_configs/antigravity_cli.py +35 -0
  115. code_mower/lane_configs/claude.py +35 -0
  116. code_mower/lane_configs/codex.py +32 -0
  117. code_mower/lane_configs/devin.py +33 -0
  118. code_mower/lane_configs/gemini_cli.py +35 -0
  119. code_mower/lane_configs/hermes_cli.py +35 -0
  120. code_mower/lane_configs/local_llm.py +31 -0
  121. code_mower/local_llm_audit_pr.py +1364 -0
  122. code_mower/local_llm_bakeoff.py +458 -0
  123. code_mower/local_llm_calibration.py +441 -0
  124. code_mower/local_llm_profiles.py +66 -0
  125. code_mower/migration.py +508 -0
  126. code_mower/migration_install.py +292 -0
  127. code_mower/migration_mirror.py +392 -0
  128. code_mower/migration_readiness.py +237 -0
  129. code_mower/migration_rehearsal.py +718 -0
  130. code_mower/next_steps.py +441 -0
  131. code_mower/package.py +673 -0
  132. code_mower/package_content.py +444 -0
  133. code_mower/package_manifest.py +452 -0
  134. code_mower/package_paths.py +53 -0
  135. code_mower/package_rendering.py +90 -0
  136. code_mower/package_static.py +585 -0
  137. code_mower/prompts.py +267 -0
  138. code_mower/provider_registry.py +469 -0
  139. code_mower/provider_runners/__init__.py +60 -0
  140. code_mower/provider_runners/comments.py +31 -0
  141. code_mower/provider_runners/git.py +46 -0
  142. code_mower/provider_runners/github_auth.py +61 -0
  143. code_mower/provider_runners/github_pr.py +120 -0
  144. code_mower/provider_runners/process.py +58 -0
  145. code_mower/provider_runners/repo_paths.py +23 -0
  146. code_mower/provider_runners/text_schema.py +41 -0
  147. code_mower/provider_runners/verdict_artifacts.py +103 -0
  148. code_mower/provider_runners/workspace.py +57 -0
  149. code_mower/release_readiness.py +549 -0
  150. code_mower/reviewer_metrics.py +389 -0
  151. code_mower/saas_reviewer_labeler.py +809 -0
  152. code_mower/secrets.py +89 -0
  153. code_mower/templates/builder-experiment.example.json +55 -0
  154. code_mower/templates/calibration-corpus.example.json +129 -0
  155. code_mower/templates/calibration-corpus.json +129 -0
  156. code_mower/templates/code-mower.example.yml +423 -0
  157. code_mower/templates/context-packs.example.json +150 -0
  158. code_mower/templates/lane_prompts/base-audit.md +22 -0
  159. code_mower/templates/lane_prompts/calibration-policy.md +21 -0
  160. code_mower/templates/lane_prompts/context-driven-quality.md +21 -0
  161. code_mower/templates/lane_prompts/docs-design.md +12 -0
  162. code_mower/templates/lane_prompts/generic-programming.md +21 -0
  163. code_mower/templates/lane_prompts/operability.md +22 -0
  164. code_mower/templates/lane_prompts/package-runtime.md +12 -0
  165. code_mower/templates/lane_prompts/security-threat-model.md +22 -0
  166. code_mower/templates/product-support/code_mower +216 -0
  167. code_mower/templates/product-support/code_mower_standalone_pin.env +7 -0
  168. code_mower/templates/product-support/code_mower_standalone_shadow.sh +151 -0
  169. code_mower/templates/product-support/run_claude_audit_pr.sh +32 -0
  170. code_mower/templates/product-support/run_codex_audit_pr.sh +32 -0
  171. code_mower/templates/product-support/safe_gh_comment.py +96 -0
  172. code_mower/templates/providers.yml +454 -0
  173. code_mower/templates/reviewer-spend.example.json +28 -0
  174. code_mower/templates/reviewer-value-report.example.md +20 -0
  175. code_mower/templates/workflows/private-standalone-shadow.yml.j2 +106 -0
  176. code_mower/templates/workflows/review-clear-stale.yml.j2 +83 -0
  177. code_mower/trailer_comment_labeler.py +207 -0
  178. code_mower/versioning.py +32 -0
  179. code_mower-0.5.0b5.dist-info/METADATA +302 -0
  180. code_mower-0.5.0b5.dist-info/RECORD +185 -0
  181. code_mower-0.5.0b5.dist-info/WHEEL +5 -0
  182. code_mower-0.5.0b5.dist-info/entry_points.txt +2 -0
  183. code_mower-0.5.0b5.dist-info/licenses/LICENSE +202 -0
  184. code_mower-0.5.0b5.dist-info/licenses/NOTICE +10 -0
  185. code_mower-0.5.0b5.dist-info/top_level.txt +1 -0
@@ -0,0 +1,454 @@
1
+ version: 1
2
+ provider_templates:
3
+ acp_bridge:
4
+ provider: "acp"
5
+ driver: "local_cli"
6
+ type: "audit"
7
+ adapter: null
8
+ trailer_lane: null
9
+ spend_policy: "none"
10
+ merge_authority: false
11
+ informational: true
12
+ enabled_by_default: false
13
+ events: []
14
+ token_env:
15
+ - "GITHUB_TOKEN"
16
+ token_env_any: []
17
+ trigger_policy: "manual"
18
+ provider_config:
19
+ command_env: "CODE_MOWER_ACP_COMMAND"
20
+ protocol: "agent-client-protocol"
21
+ prompt_lenses:
22
+ - "base-audit"
23
+ status: "protocol research lane; no automatic merge authority"
24
+ review_hygiene: {}
25
+ aider:
26
+ provider: "aider"
27
+ driver: "local_cli"
28
+ type: "audit"
29
+ adapter: null
30
+ trailer_lane: null
31
+ spend_policy: "local"
32
+ merge_authority: false
33
+ informational: true
34
+ enabled_by_default: false
35
+ events: []
36
+ token_env:
37
+ - "AIDER_AUDIT_LABEL_TOKEN"
38
+ - "GITHUB_TOKEN"
39
+ token_env_any: []
40
+ trigger_policy: "manual"
41
+ provider_config:
42
+ command: "aider"
43
+ mode: "review-only"
44
+ model_env: "AIDER_MODEL"
45
+ api_base_env: "AIDER_API_BASE"
46
+ status: "optional tool lane; provider-specific invocation belongs in an adapter"
47
+ review_hygiene: {}
48
+ antigravity_cli:
49
+ provider: "antigravity"
50
+ driver: "local_cli"
51
+ type: "audit"
52
+ adapter: null
53
+ trailer_lane: null
54
+ spend_policy: "included"
55
+ merge_authority: false
56
+ informational: true
57
+ enabled_by_default: false
58
+ events: []
59
+ token_env:
60
+ - "GITHUB_TOKEN"
61
+ token_env_any: []
62
+ trigger_policy: "manual"
63
+ provider_config:
64
+ command: "agy"
65
+ alternate_commands:
66
+ - "antigravity"
67
+ command_env: "ANTIGRAVITY_CLI_COMMAND"
68
+ model_env: "ANTIGRAVITY_MODEL"
69
+ prompt_lenses:
70
+ - "base-audit"
71
+ required_env_truthy:
72
+ - "ANTIGRAVITY_CLI_USE_AMBIENT_HOME"
73
+ doctor_probe_args:
74
+ - "--version"
75
+ auth: "run `agy` login/install locally; set ANTIGRAVITY_CLI_USE_AMBIENT_HOME=1 to opt into local OAuth state in trusted environments"
76
+ status: "forward Google CLI research lane; not merge authority until calibrated"
77
+ review_hygiene: {}
78
+ claude_audit:
79
+ provider: "claude"
80
+ driver: "local_cli"
81
+ type: "audit"
82
+ adapter: null
83
+ trailer_lane: "claude"
84
+ spend_policy: "included"
85
+ merge_authority: true
86
+ informational: false
87
+ enabled_by_default: true
88
+ events: []
89
+ token_env:
90
+ - "CLAUDE_AUDIT_LABEL_TOKEN"
91
+ - "GITHUB_TOKEN"
92
+ token_env_any: []
93
+ trigger_policy: "label"
94
+ provider_config:
95
+ command: "claude"
96
+ doctor_probe_args:
97
+ - "--print"
98
+ - "--output-format"
99
+ - "json"
100
+ - "--no-session-persistence"
101
+ - "--setting-sources"
102
+ - "local"
103
+ - "--strict-mcp-config"
104
+ - "--mcp-config"
105
+ - '{"mcpServers":{}}'
106
+ - "--disable-slash-commands"
107
+ - "--tools"
108
+ - ""
109
+ - "--model"
110
+ - "sonnet"
111
+ - "--max-budget-usd"
112
+ - "0.25"
113
+ - "Reply with exactly: ok"
114
+ doctor_probe_timeout_seconds: 30
115
+ doctor_probe_expect_json: true
116
+ doctor_probe_expect_json_field: "result"
117
+ doctor_probe_expect_json_value: "ok"
118
+ doctor_probe_error_fields:
119
+ - "is_error"
120
+ - "api_error_status"
121
+ doctor_probe_auth_status_fields:
122
+ - "api_error_status"
123
+ review_hygiene: {}
124
+ claude_review:
125
+ provider: "claude"
126
+ driver: "manual"
127
+ type: "review"
128
+ adapter: null
129
+ trailer_lane: null
130
+ spend_policy: "none"
131
+ merge_authority: false
132
+ informational: true
133
+ enabled_by_default: true
134
+ events: []
135
+ token_env:
136
+ - "CLAUDE_REVIEW_LABEL_TOKEN"
137
+ token_env_any: []
138
+ trigger_policy: "manual"
139
+ provider_config: {}
140
+ review_hygiene: {}
141
+ coderabbit_cli:
142
+ provider: "coderabbit"
143
+ driver: "local_cli"
144
+ type: "audit"
145
+ adapter: null
146
+ trailer_lane: null
147
+ spend_policy: "included"
148
+ merge_authority: false
149
+ informational: true
150
+ enabled_by_default: false
151
+ events: []
152
+ token_env:
153
+ - "GITHUB_TOKEN"
154
+ token_env_any: []
155
+ trigger_policy: "manual"
156
+ provider_config:
157
+ command: "coderabbit"
158
+ alternate_commands:
159
+ - "cr"
160
+ status: "optional CLI lane for local/on-demand review capture"
161
+ review_hygiene: {}
162
+ codex:
163
+ provider: "codex"
164
+ driver: "local_cli"
165
+ type: "audit"
166
+ adapter: null
167
+ trailer_lane: null
168
+ spend_policy: "included"
169
+ merge_authority: true
170
+ informational: false
171
+ enabled_by_default: true
172
+ events: []
173
+ token_env:
174
+ - "CODEX_AUDIT_LABEL_TOKEN"
175
+ - "GITHUB_TOKEN"
176
+ token_env_any: []
177
+ trigger_policy: "label"
178
+ provider_config:
179
+ command: "codex"
180
+ doctor_probe_args:
181
+ - "--version"
182
+ review_hygiene: {}
183
+ cursor_bugbot:
184
+ provider: "cursor_bugbot"
185
+ driver: "saas_event"
186
+ type: "audit"
187
+ adapter: "cursor_bugbot"
188
+ trailer_lane: null
189
+ spend_policy: "paid"
190
+ merge_authority: false
191
+ informational: true
192
+ enabled_by_default: false
193
+ events:
194
+ - "issue_comment"
195
+ token_env:
196
+ - "CURSOR_BUGBOT_AUDIT_LABEL_TOKEN"
197
+ - "GITHUB_TOKEN"
198
+ token_env_any: []
199
+ trigger_policy: "manual"
200
+ provider_config:
201
+ bot_authors:
202
+ - "cursor[bot]"
203
+ - "cursor"
204
+ trigger_comments:
205
+ - "bugbot run"
206
+ - "@cursor review"
207
+ rules_file: ".cursor/BUGBOT.md"
208
+ status: "manual informational lane; keep calibration-only until enabled BugBot output shape is captured and adjudicated"
209
+ review_hygiene: {}
210
+ devin:
211
+ provider: "devin"
212
+ driver: "hosted_bridge"
213
+ type: "audit"
214
+ adapter: null
215
+ trailer_lane: null
216
+ spend_policy: "paid"
217
+ merge_authority: true
218
+ informational: false
219
+ enabled_by_default: false
220
+ events: []
221
+ token_env:
222
+ - "DEVIN_AUDIT_LABEL_TOKEN"
223
+ - "GITHUB_TOKEN"
224
+ token_env_any: []
225
+ trigger_policy: "manual"
226
+ provider_config: {}
227
+ review_hygiene:
228
+ workflow: ".github/workflows/devin-clear-stale.yml"
229
+ token_env: "GITHUB_TOKEN"
230
+ gemini_cli:
231
+ provider: "gemini"
232
+ driver: "local_cli"
233
+ type: "audit"
234
+ adapter: null
235
+ trailer_lane: null
236
+ spend_policy: "included"
237
+ merge_authority: false
238
+ informational: true
239
+ enabled_by_default: false
240
+ events: []
241
+ token_env:
242
+ - "GITHUB_TOKEN"
243
+ token_env_any:
244
+ - ["GEMINI_API_KEY", "GOOGLE_API_KEY"]
245
+ trigger_policy: "manual"
246
+ provider_config:
247
+ command: "gemini"
248
+ command_env: "GEMINI_CLI_COMMAND"
249
+ model_env: "GEMINI_MODEL"
250
+ prompt_lenses:
251
+ - "base-audit"
252
+ doctor_probe_args:
253
+ - "-p"
254
+ - "Reply with exactly: ok"
255
+ - "--output-format"
256
+ - "json"
257
+ - "--skip-trust"
258
+ doctor_probe_timeout_seconds: 45
259
+ doctor_probe_expect_json: true
260
+ doctor_probe_expect_json_field: "response"
261
+ doctor_probe_expect_json_value: "ok"
262
+ status: "optional third-peer CLI lane; not merge authority until calibrated"
263
+ review_hygiene: {}
264
+ gitar:
265
+ provider: "gitar"
266
+ driver: "saas_event"
267
+ type: "audit"
268
+ adapter: "gitar"
269
+ trailer_lane: null
270
+ spend_policy: "included"
271
+ merge_authority: false
272
+ informational: true
273
+ enabled_by_default: true
274
+ events:
275
+ - "issue_comment"
276
+ token_env:
277
+ - "GITAR_AUDIT_LABEL_TOKEN"
278
+ - "GITHUB_TOKEN"
279
+ token_env_any: []
280
+ trigger_policy: "label"
281
+ provider_config:
282
+ bot_authors:
283
+ - "gitar-ai[bot]"
284
+ - "gitar-bot"
285
+ - "gitar-bot[bot]"
286
+ review_hygiene: {}
287
+ greptile:
288
+ provider: "greptile"
289
+ driver: "saas_event"
290
+ type: "audit"
291
+ adapter: "greptile"
292
+ trailer_lane: null
293
+ spend_policy: "paid"
294
+ merge_authority: false
295
+ informational: true
296
+ enabled_by_default: true
297
+ events:
298
+ - "pull_request_review"
299
+ - "check_run"
300
+ token_env:
301
+ - "GREPTILE_AUDIT_LABEL_TOKEN"
302
+ - "GITHUB_TOKEN"
303
+ token_env_any: []
304
+ trigger_policy: "label"
305
+ provider_config:
306
+ bot_authors:
307
+ - "greptile-apps[bot]"
308
+ - "greptile-apps"
309
+ check_runs:
310
+ - app_slug: "greptile-apps"
311
+ name: "Greptile Review"
312
+ review_hygiene: {}
313
+ hermes_cli:
314
+ provider: "hermes"
315
+ driver: "local_cli"
316
+ type: "audit"
317
+ adapter: null
318
+ trailer_lane: null
319
+ spend_policy: "included"
320
+ merge_authority: false
321
+ informational: true
322
+ enabled_by_default: false
323
+ events: []
324
+ token_env:
325
+ - "GITHUB_TOKEN"
326
+ token_env_any: []
327
+ trigger_policy: "manual"
328
+ provider_config:
329
+ command: "hermes"
330
+ command_env: "HERMES_CLI_COMMAND"
331
+ model_env: "HERMES_INFERENCE_MODEL"
332
+ provider_env: "HERMES_PROVIDER"
333
+ prompt_lenses:
334
+ - "base-audit"
335
+ required_env_truthy:
336
+ - "HERMES_CLI_USE_AMBIENT_HOME"
337
+ doctor_probe_args:
338
+ - "--version"
339
+ auth: "run `hermes setup` or provider login locally; set HERMES_CLI_USE_AMBIENT_HOME=1 to opt into local Hermes auth/session state in trusted environments"
340
+ status: "informational Hermes Agent one-shot lane; not merge authority until calibrated"
341
+ review_hygiene: {}
342
+ local_llm:
343
+ provider: "openai_compatible"
344
+ driver: "api_model"
345
+ type: "audit"
346
+ adapter: null
347
+ trailer_lane: null
348
+ spend_policy: "local"
349
+ merge_authority: false
350
+ informational: true
351
+ enabled_by_default: false
352
+ events: []
353
+ token_env:
354
+ - "LOCAL_LLM_AUDIT_LABEL_TOKEN"
355
+ - "LOCAL_LLM_API_KEY"
356
+ - "GITHUB_TOKEN"
357
+ token_env_any: []
358
+ trigger_policy: "manual"
359
+ provider_config:
360
+ api_base_env: "LOCAL_LLM_API_BASE"
361
+ model_env: "LOCAL_LLM_MODEL"
362
+ bot_authors_env: "LOCAL_LLM_BOT_AUTHORS"
363
+ default_api_base: "http://localhost:1234/v1"
364
+ profile_env: "LOCAL_LLM_PROFILE"
365
+ profiles:
366
+ qwen3-coder-next-lmstudio:
367
+ api_base: "http://localhost:1234/v1"
368
+ model: "qwen/qwen3-coder-next"
369
+ context_window: "128000"
370
+ endpoint: "lmstudio"
371
+ gemma4-ollama:
372
+ api_base: "http://localhost:11434/v1"
373
+ model: "gemma4:e4b-mlx"
374
+ context_window: "128000"
375
+ endpoint: "ollama"
376
+ status: "informational calibration lane, not merge authority"
377
+ review_hygiene: {}
378
+ qodo:
379
+ provider: "qodo"
380
+ driver: "saas_event"
381
+ type: "audit"
382
+ adapter: "qodo"
383
+ trailer_lane: null
384
+ spend_policy: "paid"
385
+ merge_authority: false
386
+ informational: true
387
+ enabled_by_default: false
388
+ events:
389
+ - "issue_comment"
390
+ token_env:
391
+ - "QODO_AUDIT_LABEL_TOKEN"
392
+ - "GITHUB_TOKEN"
393
+ token_env_any: []
394
+ trigger_policy: "manual"
395
+ provider_config:
396
+ bot_authors:
397
+ - "qodo-code-review[bot]"
398
+ - "qodo-code-review"
399
+ spend_policy: "never trigger automatically from generated workflows"
400
+ review_hygiene: {}
401
+ profiles:
402
+ recommended:
403
+ description: "Fast path for most teams; two local CLI peers plus an always-on advisory SaaS reviewer."
404
+ lanes:
405
+ - "codex"
406
+ - "claude_audit"
407
+ - "gitar"
408
+ source: "repo"
409
+ public_oss:
410
+ description: "Public repository starter; use recommended today, swap Gitar for CodeRabbit once the CodeRabbit adapter lands."
411
+ lanes:
412
+ - "codex"
413
+ - "claude_audit"
414
+ - "gitar"
415
+ source: "repo"
416
+ deep_review:
417
+ description: "Higher-scrutiny private repository profile; Greptile remains opt-in and informational to avoid surprise spend."
418
+ lanes:
419
+ - "codex"
420
+ - "claude_audit"
421
+ - "greptile"
422
+ source: "repo"
423
+ privacy:
424
+ description: "Experimental low-cost/private calibration floor; local LLM is informational only until false-positive rates are measured."
425
+ lanes:
426
+ - "local_llm"
427
+ source: "repo"
428
+ tool_lane:
429
+ description: "Optional local tool-lane proof; Aider stays manual and informational until its review adapter is calibrated."
430
+ lanes:
431
+ - "aider"
432
+ source: "repo"
433
+ third_peer:
434
+ description: "Optional third local CLI reviewer calibration profile; Google and Hermes CLI lanes stay informational until catch rate and false positives are measured."
435
+ lanes:
436
+ - "antigravity_cli"
437
+ - "gemini_cli"
438
+ - "hermes_cli"
439
+ source: "repo"
440
+ cli_research:
441
+ description: "Optional local CLI and protocol research profile; use for on-demand review capture, not routine merge gates."
442
+ lanes:
443
+ - "antigravity_cli"
444
+ - "gemini_cli"
445
+ - "hermes_cli"
446
+ - "coderabbit_cli"
447
+ - "acp_bridge"
448
+ source: "repo"
449
+ saas_research:
450
+ description: "Optional manually triggered SaaS reviewer calibration profile; use for capture and value reports, not merge gates."
451
+ lanes:
452
+ - "cursor_bugbot"
453
+ - "qodo"
454
+ source: "repo"
@@ -0,0 +1,28 @@
1
+ {
2
+ "profiles": {
3
+ "codex-audit": {
4
+ "cost_usd": 0.0,
5
+ "notes": "Set to the incremental cost you want attributed to this calibration batch."
6
+ },
7
+ "claude-audit": {
8
+ "cost_usd": 0.0,
9
+ "notes": "Use your team's billing export or a conservative estimate."
10
+ },
11
+ "gemini-cli": {
12
+ "cost_usd": 0.42,
13
+ "notes": "Example value only. Replace with the cost of the run-results batch."
14
+ },
15
+ "coderabbit-cli": {
16
+ "cost_usd": 0.0,
17
+ "notes": "Often a wrapper around account-level billing; record incremental cost if known."
18
+ },
19
+ "qwen3-coder-next-lmstudio": {
20
+ "cost_usd": 0.0,
21
+ "notes": "Local model run; track hardware or opportunity cost separately if useful."
22
+ },
23
+ "gemma4-ollama": {
24
+ "cost_usd": 0.0,
25
+ "notes": "Local model run; track hardware or opportunity cost separately if useful."
26
+ }
27
+ }
28
+ }
@@ -0,0 +1,20 @@
1
+ # Code Mower Reviewer Value Report
2
+
3
+ Corpus: `small-known-pr-pilot`
4
+ Items: 5
5
+ Adjudicated evidence: 0
6
+ Finding evidence: 0
7
+ Run dispositions: 0
8
+ Reviewer runs: 1
9
+
10
+ | Reviewer | Runs | Useful | Negative | Useful rate | Known-clean pass | Known-blocked caught/missed | Infra errors | Input gaps | Cost | Sec/run | Cost/useful | Policy | Recommended role |
11
+ | --- | ---: | ---: | ---: | ---: | ---: | --- | ---: | ---: | ---: | ---: | ---: | --- | --- |
12
+ | `codex-audit` | 1 | 0 | 0 | | 1 | 0/0 | 0 | 0 | 0.0 | 120.0 | | `informational` | `informational` |
13
+
14
+ ## Recommendations
15
+ - codex-audit: collect human dispositions before comparing reviewer accuracy.
16
+
17
+ ## Policy Reasons
18
+ - `codex-audit`: `informational` / `informational` / `manual_or_calibration_only` - needs at least 10 adjudicated findings; needs at least 2 known-clean zero-blocker runs; useful-rate below selective-trigger threshold
19
+
20
+ _Caveat: This is a policy recommendation from calibration evidence, not an automatic repository merge-rule change._
@@ -0,0 +1,106 @@
1
+ name: Code Mower standalone shadow
2
+
3
+ on:
4
+ pull_request:
5
+ paths:
6
+ - "tools/code_mower"
7
+ - "tools/code_mower_standalone_shadow.sh"
8
+ - "tools/code_mower_standalone_pin.env"
9
+ - "tools/code_mower_*.py"
10
+ - "tools/CODE_MOWER*.md"
11
+ - "code-mower*.yml"
12
+ - ".github/workflows/code-mower-standalone-shadow.yml"
13
+ workflow_dispatch:
14
+
15
+ permissions:
16
+ contents: read
17
+
18
+ env:
19
+ FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: "true"
20
+ CODE_MOWER_STANDALONE_REPO_URL: {{ code_mower_standalone_repo_url | default('https://github.com/OWNER/code-mower.git', true) }}
21
+ CODE_MOWER_STANDALONE_PACKAGE_REPO_URL: {{ code_mower_standalone_package_repo_url | default('git+ssh://git@github.com/OWNER/code-mower.git', true) }}
22
+ CODE_MOWER_STANDALONE_REINSTALL: "1"
23
+ CODE_MOWER_BOOTSTRAP_PYTHON: python3
24
+
25
+ jobs:
26
+ shadow:
27
+ if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository
28
+ runs-on: ubuntu-latest
29
+ timeout-minutes: 10
30
+ steps:
31
+ - name: Check out product repo
32
+ uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10
33
+ with:
34
+ persist-credentials: false
35
+
36
+ - name: Configure Code Mower deploy key
37
+ shell: bash
38
+ env:
39
+ CODE_MOWER_STANDALONE_DEPLOY_KEY: {% raw %}${{ secrets.CODE_MOWER_STANDALONE_DEPLOY_KEY }}{% endraw %}
40
+ run: |
41
+ set -euo pipefail
42
+ if [ -z "${CODE_MOWER_STANDALONE_DEPLOY_KEY}" ]; then
43
+ echo "::error::Missing CODE_MOWER_STANDALONE_DEPLOY_KEY. Add a read-only deploy key for the configured Code Mower standalone repository to this repository's Actions secrets."
44
+ exit 1
45
+ fi
46
+ install -m 700 -d ~/.ssh
47
+ printf '%s\n' "${CODE_MOWER_STANDALONE_DEPLOY_KEY}" > ~/.ssh/code_mower_standalone
48
+ chmod 600 ~/.ssh/code_mower_standalone
49
+ ssh-keyscan github.com > ~/.ssh/known_hosts
50
+ cat > ~/.ssh/config <<'EOF'
51
+ Host github.com
52
+ IdentityFile ~/.ssh/code_mower_standalone
53
+ IdentitiesOnly yes
54
+ StrictHostKeyChecking yes
55
+ EOF
56
+ chmod 600 ~/.ssh/config
57
+
58
+ - name: Run standalone wrapper shadow proof
59
+ shell: bash
60
+ run: |
61
+ set -euo pipefail
62
+ mkdir -p .code-mower
63
+ tools/code_mower --version
64
+ tools/code_mower doctor --easy --json | tee .code-mower/standalone-doctor.json
65
+ tools/code_mower migration wrapper-rehearsal \
66
+ --repo-path "$GITHUB_WORKSPACE" \
67
+ --local-command "env CODE_MOWER_USE_LOCAL=1 tools/code_mower" \
68
+ --package-command "tools/code_mower" \
69
+ --timeout 120 \
70
+ --json | tee .code-mower/standalone-wrapper-rehearsal.json
71
+ code_mower_ref="${CODE_MOWER_STANDALONE_REF:-}"
72
+ if [ -z "${code_mower_ref}" ]; then
73
+ code_mower_ref="$(sed -n 's/^CODE_MOWER_STANDALONE_REF="\([^"]*\)"/\1/p' tools/code_mower_standalone_pin.env)"
74
+ fi
75
+ if [ -z "${code_mower_ref}" ]; then
76
+ echo "::error::tools/code_mower_standalone_pin.env does not define CODE_MOWER_STANDALONE_REF"
77
+ exit 1
78
+ fi
79
+ if [ "${code_mower_ref}" = "<pin-a-reviewed-code-mower-commit-or-tag>" ]; then
80
+ echo "::error::replace the placeholder CODE_MOWER_STANDALONE_REF before package-install rehearsal"
81
+ exit 1
82
+ fi
83
+ if [ "${CODE_MOWER_STANDALONE_PACKAGE_REPO_URL:-}" = "" ] || [ "${CODE_MOWER_STANDALONE_PACKAGE_REPO_URL}" = "git+ssh://git@github.com/OWNER/code-mower.git" ]; then
84
+ echo "::error::replace CODE_MOWER_STANDALONE_PACKAGE_REPO_URL with a pip-installable Code Mower package source"
85
+ exit 1
86
+ fi
87
+ package_spec="${CODE_MOWER_STANDALONE_PACKAGE_REPO_URL}@${code_mower_ref}"
88
+ tools/code_mower migration package-install-rehearsal \
89
+ --package-spec "$package_spec" \
90
+ --repo-path "$GITHUB_WORKSPACE" \
91
+ --local-command "env CODE_MOWER_USE_LOCAL=1 tools/code_mower" \
92
+ --work-dir "$GITHUB_WORKSPACE/.code-mower/package-install-rehearsal" \
93
+ --timeout 180 \
94
+ --json | tee .code-mower/package-install-rehearsal.json
95
+
96
+ - name: Upload shadow proof artifacts
97
+ if: always()
98
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a
99
+ with:
100
+ name: code-mower-standalone-shadow
101
+ path: |
102
+ .code-mower/standalone-doctor.json
103
+ .code-mower/standalone-wrapper-rehearsal.json
104
+ .code-mower/package-install-rehearsal.json
105
+ if-no-files-found: ignore
106
+ retention-days: 7
@@ -0,0 +1,83 @@
1
+ # Code Mower workflow template: clear stale terminal audit labels on new commits.
2
+ #
3
+ # Defaults to the Devin lane because hosted/paid lanes are the most likely to
4
+ # need explicit re-dispatch. Change CLEAR_STALE_LANE or generate one workflow
5
+ # per merge-authority lane.
6
+ name: Code Mower Clear Stale Audits
7
+
8
+ on:
9
+ pull_request_target:
10
+ types: [synchronize]
11
+ workflow_dispatch:
12
+ inputs:
13
+ lane:
14
+ description: "Code Mower trailer lane, for example devin"
15
+ required: false
16
+ default: "devin"
17
+ pr:
18
+ description: "Pull request number for manual runs"
19
+ required: false
20
+ head_sha:
21
+ description: "Current PR head SHA for manual runs"
22
+ required: false
23
+
24
+ permissions:
25
+ actions: write
26
+ contents: read
27
+ issues: write
28
+ pull-requests: read
29
+
30
+ concurrency:
31
+ group: {% raw %}code-mower-clear-stale-${{ github.event.pull_request.number || github.event.inputs.pr || github.run_id }}{% endraw %}
32
+ cancel-in-progress: true
33
+
34
+ jobs:
35
+ clear-stale:
36
+ runs-on: ubuntu-latest
37
+ env:
38
+ CLEAR_STALE_LANE: {% raw %}${{ github.event.inputs.lane || 'devin' }}{% endraw %}
39
+ CLEAR_STALE_PR: {% raw %}${{ github.event.pull_request.number || github.event.inputs.pr }}{% endraw %}
40
+ CLEAR_STALE_HEAD_SHA: {% raw %}${{ github.event.pull_request.head.sha || github.event.inputs.head_sha }}{% endraw %}
41
+ # Optional: dispatch the paid/hosted audit bridge directly when this
42
+ # command adds a fresh needs-* label. Keep unset for label-only requeue.
43
+ # CLEAR_STALE_DISPATCH_WORKFLOW: devin-audit-bridge.yml
44
+ # CLEAR_STALE_DISPATCH_REF: main
45
+ # CLEAR_STALE_DISPATCH_INPUTS: |
46
+ # pr_number={pr}
47
+ steps:
48
+ - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10
49
+ with:
50
+ persist-credentials: false
51
+
52
+ - name: Clear stale Code Mower audit labels
53
+ env:
54
+ GITHUB_TOKEN: {% raw %}${{ secrets.GITHUB_TOKEN }}{% endraw %}
55
+ run: |
56
+ set -euo pipefail
57
+
58
+ if [ -z "${CLEAR_STALE_PR:-}" ] || [ -z "${CLEAR_STALE_HEAD_SHA:-}" ]; then
59
+ echo "::notice::No PR/head SHA available for stale-label cleanup; skipping."
60
+ exit 0
61
+ fi
62
+
63
+ extra_args=()
64
+ if [ -n "${CLEAR_STALE_DISPATCH_WORKFLOW:-}" ]; then
65
+ extra_args+=(--dispatch-workflow "${CLEAR_STALE_DISPATCH_WORKFLOW}")
66
+ fi
67
+ if [ -n "${CLEAR_STALE_DISPATCH_REF:-}" ]; then
68
+ extra_args+=(--dispatch-ref "${CLEAR_STALE_DISPATCH_REF}")
69
+ fi
70
+ if [ -n "${CLEAR_STALE_DISPATCH_INPUTS:-}" ]; then
71
+ while IFS= read -r dispatch_input; do
72
+ [ -n "${dispatch_input}" ] || continue
73
+ extra_args+=(--dispatch-input "${dispatch_input}")
74
+ done <<< "${CLEAR_STALE_DISPATCH_INPUTS}"
75
+ fi
76
+
77
+ tools/code_mower clear-stale \
78
+ --lane "${CLEAR_STALE_LANE}" \
79
+ --repo "${GITHUB_REPOSITORY}" \
80
+ --pr "${CLEAR_STALE_PR}" \
81
+ --head-sha "${CLEAR_STALE_HEAD_SHA}" \
82
+ --json \
83
+ "${extra_args[@]}"