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,37 @@
1
+ """Lane configuration package for trailer-comment audit labelers."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from importlib import import_module
6
+
7
+ if __package__ and __package__.startswith("code_mower."):
8
+ from ..audit_labeler_lib import LaneConfig
9
+ else:
10
+ try:
11
+ from tools.audit_labeler_lib import LaneConfig
12
+ except ImportError: # pragma: no cover - direct `python tools/foo.py` execution
13
+ from audit_labeler_lib import LaneConfig
14
+
15
+
16
+ def load_lane_config(name: str) -> "LaneConfig":
17
+ normalized = name.replace("-", "_")
18
+ module_roots = []
19
+ if __package__:
20
+ module_roots.append(__package__)
21
+ module_roots.extend(["tools.lane_configs", "lane_configs"])
22
+ seen_roots: set[str] = set()
23
+ last_missing: ModuleNotFoundError | None = None
24
+ for root in module_roots:
25
+ if root in seen_roots:
26
+ continue
27
+ seen_roots.add(root)
28
+ module_name = f"{root}.{normalized}"
29
+ try:
30
+ module = import_module(module_name)
31
+ return module.CONFIG
32
+ except ModuleNotFoundError as exc:
33
+ if exc.name == module_name or exc.name == root.split(".", 1)[0]:
34
+ last_missing = exc
35
+ continue
36
+ raise
37
+ raise ValueError(f"unknown trailer-comment audit lane: {name}") from last_missing
@@ -0,0 +1,32 @@
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="aider",
15
+ display_name="Aider",
16
+ needs_label="needs-aider-audit",
17
+ done_label="aider-audit-done",
18
+ blocked_label="aider-audit-blocked",
19
+ trailer_prefix="AIDER_AUDIT_STATE",
20
+ default_authors=("aider-audit-bot", "aider-audit-bot[bot]"),
21
+ authors_env_var="AIDER_BOT_AUTHORS",
22
+ pass_patterns=(
23
+ re.compile(r"Aider Audit(?:\s+Result)?\s*[\u2014\u2013:-]\s*PASS\b", flags=re.IGNORECASE),
24
+ ),
25
+ blocked_patterns=(
26
+ re.compile(
27
+ r"Aider Audit(?:\s+Result)?\s*[\u2014\u2013:-]\s*(BLOCKED|BLOCKER|INCOMPLETE)\b",
28
+ flags=re.IGNORECASE,
29
+ ),
30
+ ),
31
+ token_env_vars=("AIDER_AUDIT_LABEL_TOKEN", "GITHUB_TOKEN"),
32
+ )
@@ -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="antigravity_cli",
15
+ display_name="Antigravity CLI",
16
+ needs_label="needs-antigravity-cli-audit",
17
+ done_label="antigravity-cli-audit-done",
18
+ blocked_label="antigravity-cli-audit-blocked",
19
+ trailer_prefix="ANTIGRAVITY_CLI_AUDIT_STATE",
20
+ default_authors=("antigravity-cli-audit-bot", "antigravity-cli-audit-bot[bot]"),
21
+ authors_env_var="ANTIGRAVITY_CLI_BOT_AUTHORS",
22
+ pass_patterns=(
23
+ re.compile(
24
+ r"Antigravity(?: CLI)? Audit(?:\s+Result)?\s*[\u2014\u2013:-]\s*PASS\b",
25
+ flags=re.IGNORECASE,
26
+ ),
27
+ ),
28
+ blocked_patterns=(
29
+ re.compile(
30
+ r"Antigravity(?: CLI)? Audit(?:\s+Result)?\s*[\u2014\u2013:-]\s*(BLOCKED|BLOCKER|INCOMPLETE)\b",
31
+ flags=re.IGNORECASE,
32
+ ),
33
+ ),
34
+ token_env_vars=("ANTIGRAVITY_CLI_AUDIT_LABEL_TOKEN", "GITHUB_TOKEN"),
35
+ )
@@ -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="claude",
15
+ display_name="Claude",
16
+ needs_label="needs-claude-audit",
17
+ done_label="claude-audit-done",
18
+ blocked_label="claude-audit-blocked",
19
+ trailer_prefix="CLAUDE_AUDIT_STATE",
20
+ default_authors=("claude-audit-bot", "claude-audit-bot[bot]"),
21
+ authors_env_var="CLAUDE_AUDIT_BOT_AUTHORS",
22
+ pass_patterns=(
23
+ re.compile(
24
+ r"<!--\s*CLAUDE_AUDIT_STATE:\s*claude-audit-done\s*-->",
25
+ flags=re.IGNORECASE,
26
+ ),
27
+ ),
28
+ blocked_patterns=(
29
+ re.compile(
30
+ r"<!--\s*CLAUDE_AUDIT_STATE:\s*claude-audit-blocked\s*-->",
31
+ flags=re.IGNORECASE,
32
+ ),
33
+ ),
34
+ token_env_vars=("CLAUDE_AUDIT_LABEL_TOKEN", "GITHUB_TOKEN"),
35
+ )
@@ -0,0 +1,32 @@
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="codex",
15
+ display_name="Codex",
16
+ needs_label="needs-codex-audit",
17
+ done_label="codex-audit-done",
18
+ blocked_label="codex-audit-blocked",
19
+ trailer_prefix="CODEX_AUDIT_STATE",
20
+ default_authors=("codex-audit-bot", "codex-audit-bot[bot]"),
21
+ authors_env_var="CODEX_BOT_AUTHORS",
22
+ pass_patterns=(
23
+ re.compile(r"Codex Audit(?:\s+Result)?\s*[—–:-]\s*PASS\b", flags=re.IGNORECASE),
24
+ ),
25
+ blocked_patterns=(
26
+ re.compile(
27
+ r"Codex Audit(?:\s+Result)?\s*[—–:-]\s*(BLOCKED|BLOCKER|INCOMPLETE)\b",
28
+ flags=re.IGNORECASE,
29
+ ),
30
+ ),
31
+ token_env_vars=("CODEX_AUDIT_LABEL_TOKEN", "GITHUB_TOKEN"),
32
+ )
@@ -0,0 +1,33 @@
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="devin",
15
+ display_name="Devin",
16
+ needs_label="needs-devin-audit",
17
+ done_label="devin-audit-done",
18
+ blocked_label="devin-audit-blocked",
19
+ trailer_prefix="DEVIN_AUDIT_STATE",
20
+ default_authors=("devin-ai-integration", "devin-ai-integration[bot]"),
21
+ authors_env_var="DEVIN_BOT_AUTHORS",
22
+ pass_patterns=(
23
+ re.compile(r"Devin Audit(?:\s+Result)?\s*[—–:-]\s*PASS\b", flags=re.IGNORECASE),
24
+ ),
25
+ blocked_patterns=(
26
+ re.compile(
27
+ r"Devin Audit(?:\s+Result)?\s*[—–:-]\s*(BLOCKED|BLOCKER|INCOMPLETE)\b",
28
+ flags=re.IGNORECASE,
29
+ ),
30
+ ),
31
+ label_state_fallbacks=True,
32
+ token_env_vars=("DEVIN_AUDIT_LABEL_TOKEN", "GITHUB_TOKEN"),
33
+ )
@@ -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="gemini_cli",
15
+ display_name="Gemini CLI",
16
+ needs_label="needs-gemini-cli-audit",
17
+ done_label="gemini-cli-audit-done",
18
+ blocked_label="gemini-cli-audit-blocked",
19
+ trailer_prefix="GEMINI_CLI_AUDIT_STATE",
20
+ default_authors=("gemini-cli-audit-bot", "gemini-cli-audit-bot[bot]"),
21
+ authors_env_var="GEMINI_CLI_BOT_AUTHORS",
22
+ pass_patterns=(
23
+ re.compile(
24
+ r"Gemini(?: CLI)? Audit(?:\s+Result)?\s*[\u2014\u2013:-]\s*PASS\b",
25
+ flags=re.IGNORECASE,
26
+ ),
27
+ ),
28
+ blocked_patterns=(
29
+ re.compile(
30
+ r"Gemini(?: CLI)? Audit(?:\s+Result)?\s*[\u2014\u2013:-]\s*(BLOCKED|BLOCKER|INCOMPLETE)\b",
31
+ flags=re.IGNORECASE,
32
+ ),
33
+ ),
34
+ token_env_vars=("GEMINI_CLI_AUDIT_LABEL_TOKEN", "GITHUB_TOKEN"),
35
+ )
@@ -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="hermes_cli",
15
+ display_name="Hermes CLI",
16
+ needs_label="needs-hermes-cli-audit",
17
+ done_label="hermes-cli-audit-done",
18
+ blocked_label="hermes-cli-audit-blocked",
19
+ trailer_prefix="HERMES_CLI_AUDIT_STATE",
20
+ default_authors=("hermes-cli-audit-bot", "hermes-cli-audit-bot[bot]"),
21
+ authors_env_var="HERMES_CLI_BOT_AUTHORS",
22
+ pass_patterns=(
23
+ re.compile(
24
+ r"Hermes(?: CLI)? Audit(?:\s+Result)?\s*[\u2014\u2013:-]\s*PASS\b",
25
+ flags=re.IGNORECASE,
26
+ ),
27
+ ),
28
+ blocked_patterns=(
29
+ re.compile(
30
+ r"Hermes(?: CLI)? Audit(?:\s+Result)?\s*[\u2014\u2013:-]\s*(BLOCKED|BLOCKER|INCOMPLETE)\b",
31
+ flags=re.IGNORECASE,
32
+ ),
33
+ ),
34
+ token_env_vars=("HERMES_CLI_AUDIT_LABEL_TOKEN", "GITHUB_TOKEN"),
35
+ )
@@ -0,0 +1,31 @@
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="local_llm",
15
+ display_name="Local LLM",
16
+ needs_label="needs-local-llm-audit",
17
+ done_label="local-llm-audit-done",
18
+ blocked_label="local-llm-audit-blocked",
19
+ trailer_prefix="LOCAL_LLM_AUDIT_STATE",
20
+ default_authors=("local-llm-audit-bot", "local-llm-audit-bot[bot]"),
21
+ authors_env_var="LOCAL_LLM_BOT_AUTHORS",
22
+ pass_patterns=(
23
+ re.compile(r"Local LLM Audit(?:\s+Result)?\s*[—–:-]\s*PASS\b", flags=re.IGNORECASE),
24
+ ),
25
+ blocked_patterns=(
26
+ re.compile(
27
+ r"Local LLM Audit(?:\s+Result)?\s*[—–:-]\s*(BLOCKED|BLOCKER|INCOMPLETE)\b",
28
+ flags=re.IGNORECASE,
29
+ ),
30
+ ),
31
+ )