claude-dev-env 1.94.0 → 2.0.0

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 (280) hide show
  1. package/_shared/advisor/CLAUDE.md +2 -2
  2. package/_shared/advisor/advisor-protocol.md +41 -33
  3. package/_shared/advisor/scripts/config/advisor_scripts_constants/model_tier_run_validator_constants.py +17 -13
  4. package/_shared/advisor/scripts/model_tier_run_validator.py +27 -18
  5. package/_shared/advisor/scripts/tests/test_model_tier_run_validator.py +95 -25
  6. package/_shared/advisor/scripts/tests/test_tier_model_ids.py +17 -17
  7. package/_shared/advisor/scripts/tier_model_ids.py +18 -18
  8. package/_shared/pr-loop/CLAUDE.md +1 -0
  9. package/_shared/pr-loop/scripts/CLAUDE.md +2 -1
  10. package/_shared/pr-loop/scripts/README.md +1 -0
  11. package/_shared/pr-loop/scripts/code_rules_gate.py +253 -1980
  12. package/_shared/pr-loop/scripts/code_rules_gate_parts/CLAUDE.md +32 -0
  13. package/_shared/pr-loop/scripts/code_rules_gate_parts/__init__.py +7 -0
  14. package/_shared/pr-loop/scripts/code_rules_gate_parts/added_line_maps.py +268 -0
  15. package/_shared/pr-loop/scripts/code_rules_gate_parts/enforcer_loading.py +172 -0
  16. package/_shared/pr-loop/scripts/code_rules_gate_parts/gate_arguments.py +70 -0
  17. package/_shared/pr-loop/scripts/code_rules_gate_parts/gate_running.py +326 -0
  18. package/_shared/pr-loop/scripts/code_rules_gate_parts/git_blob_readers.py +85 -0
  19. package/_shared/pr-loop/scripts/code_rules_gate_parts/git_file_sets.py +331 -0
  20. package/_shared/pr-loop/scripts/code_rules_gate_parts/staged_test_running.py +369 -0
  21. package/_shared/pr-loop/scripts/code_rules_gate_parts/tests/conftest.py +14 -0
  22. package/_shared/pr-loop/scripts/code_rules_gate_parts/tests/test_added_line_maps.py +118 -0
  23. package/_shared/pr-loop/scripts/code_rules_gate_parts/tests/test_enforcer_loading.py +17 -0
  24. package/_shared/pr-loop/scripts/code_rules_gate_parts/tests/test_gate_arguments.py +29 -0
  25. package/_shared/pr-loop/scripts/code_rules_gate_parts/tests/test_gate_running.py +99 -0
  26. package/_shared/pr-loop/scripts/code_rules_gate_parts/tests/test_git_blob_readers.py +69 -0
  27. package/_shared/pr-loop/scripts/code_rules_gate_parts/tests/test_git_file_sets.py +137 -0
  28. package/_shared/pr-loop/scripts/code_rules_gate_parts/tests/test_staged_test_running.py +116 -0
  29. package/_shared/pr-loop/scripts/code_rules_gate_parts/tests/test_violation_scoping.py +75 -0
  30. package/_shared/pr-loop/scripts/code_rules_gate_parts/tests/test_wrapper_plumb_check.py +49 -0
  31. package/_shared/pr-loop/scripts/code_rules_gate_parts/violation_scoping.py +328 -0
  32. package/_shared/pr-loop/scripts/code_rules_gate_parts/wrapper_plumb_check.py +206 -0
  33. package/_shared/pr-loop/scripts/pr_loop_shared_constants/code_rules_gate_constants.py +24 -17
  34. package/_shared/pr-loop/scripts/pr_loop_shared_constants/reviews_disabled_constants.py +1 -0
  35. package/_shared/pr-loop/scripts/reviews_disabled.py +19 -2
  36. package/_shared/pr-loop/scripts/test_code_rules_gate.py +278 -0
  37. package/_shared/pr-loop/scripts/tests/test_code_rules_gate_constants.py +6 -39
  38. package/_shared/pr-loop/scripts/tests/test_reviews_disabled.py +43 -0
  39. package/_shared/pr-loop/worker-spawn.md +186 -0
  40. package/agents/code-verifier.md +1 -1
  41. package/bin/CLAUDE.md +10 -1
  42. package/bin/ever-shipped-skills.mjs +73 -0
  43. package/bin/expand_home_directory_tokens.mjs +1 -1
  44. package/bin/install.mjs +140 -7
  45. package/bin/install.prune.test.mjs +457 -0
  46. package/docs/CODE_RULES.md +1 -1
  47. package/hooks/advisory/refactor_guard.py +3 -4
  48. package/hooks/blocking/CLAUDE.md +7 -1
  49. package/hooks/blocking/block_main_commit.py +2 -2
  50. package/hooks/blocking/claude_md_orphan_file_blocker.py +75 -699
  51. package/hooks/blocking/claude_md_orphan_file_blocker_parts/CLAUDE.md +28 -0
  52. package/hooks/blocking/claude_md_orphan_file_blocker_parts/__init__.py +1 -0
  53. package/hooks/blocking/claude_md_orphan_file_blocker_parts/config/__init__.py +1 -0
  54. package/hooks/blocking/claude_md_orphan_file_blocker_parts/config/orphan_blocker_constants.py +18 -0
  55. package/hooks/blocking/claude_md_orphan_file_blocker_parts/decision.py +81 -0
  56. package/hooks/blocking/claude_md_orphan_file_blocker_parts/references.py +307 -0
  57. package/hooks/blocking/claude_md_orphan_file_blocker_parts/scan_plan.py +124 -0
  58. package/hooks/blocking/claude_md_orphan_file_blocker_parts/subtree_scan.py +179 -0
  59. package/hooks/blocking/claude_md_orphan_file_blocker_parts/tests/conftest.py +10 -0
  60. package/hooks/blocking/claude_md_orphan_file_blocker_parts/tests/test_decision.py +34 -0
  61. package/hooks/blocking/claude_md_orphan_file_blocker_parts/tests/test_references.py +42 -0
  62. package/hooks/blocking/claude_md_orphan_file_blocker_parts/tests/test_scan_plan.py +27 -0
  63. package/hooks/blocking/claude_md_orphan_file_blocker_parts/tests/test_subtree_scan.py +30 -0
  64. package/hooks/blocking/code_rules_boolean_mustcheck.py +1 -1
  65. package/hooks/blocking/code_rules_enforcer.py +4 -0
  66. package/hooks/blocking/code_rules_mock_completeness.py +1 -1
  67. package/hooks/blocking/code_rules_optional_params.py +2 -2
  68. package/hooks/blocking/code_rules_shared.py +83 -1
  69. package/hooks/blocking/code_rules_test_assertions.py +1 -1
  70. package/hooks/blocking/code_rules_test_layout.py +9 -3
  71. package/hooks/blocking/code_rules_typeddict_stub.py +1 -1
  72. package/hooks/blocking/gh_pr_author_enforcer.py +1 -1
  73. package/hooks/blocking/inventory_intent_records/CLAUDE.md +26 -0
  74. package/hooks/blocking/inventory_intent_records/__init__.py +1 -0
  75. package/hooks/blocking/inventory_intent_records/config/__init__.py +1 -0
  76. package/hooks/blocking/inventory_intent_records/config/intent_records_constants.py +20 -0
  77. package/hooks/blocking/inventory_intent_records/records.py +271 -0
  78. package/hooks/blocking/inventory_intent_records/tests/conftest.py +10 -0
  79. package/hooks/blocking/inventory_intent_records/tests/test_records.py +80 -0
  80. package/hooks/blocking/package_inventory_stale_blocker.py +54 -384
  81. package/hooks/blocking/package_inventory_stale_blocker_parts/CLAUDE.md +26 -0
  82. package/hooks/blocking/package_inventory_stale_blocker_parts/__init__.py +1 -0
  83. package/hooks/blocking/package_inventory_stale_blocker_parts/config/__init__.py +1 -0
  84. package/hooks/blocking/package_inventory_stale_blocker_parts/config/inventory_blocker_constants.py +16 -0
  85. package/hooks/blocking/package_inventory_stale_blocker_parts/decision.py +84 -0
  86. package/hooks/blocking/package_inventory_stale_blocker_parts/inventory_detection.py +307 -0
  87. package/hooks/blocking/package_inventory_stale_blocker_parts/tests/conftest.py +10 -0
  88. package/hooks/blocking/package_inventory_stale_blocker_parts/tests/test_decision.py +38 -0
  89. package/hooks/blocking/package_inventory_stale_blocker_parts/tests/test_inventory_detection.py +61 -0
  90. package/hooks/blocking/pii_payload_scan.py +138 -42
  91. package/hooks/blocking/pii_prevention_blocker.py +185 -291
  92. package/hooks/blocking/pii_prevention_blocker_parts/CLAUDE.md +24 -0
  93. package/hooks/blocking/pii_prevention_blocker_parts/__init__.py +1 -0
  94. package/hooks/blocking/pii_prevention_blocker_parts/config/__init__.py +1 -0
  95. package/hooks/blocking/pii_prevention_blocker_parts/config/repository_resolution_constants.py +28 -0
  96. package/hooks/blocking/pii_prevention_blocker_parts/repository_exemption.py +214 -0
  97. package/hooks/blocking/pii_prevention_blocker_parts/repository_resolution.py +208 -0
  98. package/hooks/blocking/plain_language_blocker.py +138 -4
  99. package/hooks/blocking/pr_description_command_parser.py +8 -4
  100. package/hooks/blocking/precommit_code_rules_gate.py +3 -3
  101. package/hooks/blocking/sensitive_file_protector.py +114 -48
  102. package/hooks/blocking/tdd_enforcer.py +97 -601
  103. package/hooks/blocking/tdd_enforcer_parts/CLAUDE.md +30 -0
  104. package/hooks/blocking/tdd_enforcer_parts/__init__.py +1 -0
  105. package/hooks/blocking/tdd_enforcer_parts/candidate_paths.py +142 -0
  106. package/hooks/blocking/tdd_enforcer_parts/config/__init__.py +1 -0
  107. package/hooks/blocking/tdd_enforcer_parts/config/tdd_enforcer_constants.py +32 -0
  108. package/hooks/blocking/tdd_enforcer_parts/content_analysis.py +268 -0
  109. package/hooks/blocking/tdd_enforcer_parts/decisions.py +92 -0
  110. package/hooks/blocking/tdd_enforcer_parts/freshness.py +80 -0
  111. package/hooks/blocking/tdd_enforcer_parts/git_tracking.py +63 -0
  112. package/hooks/blocking/tdd_enforcer_parts/path_classification.py +119 -0
  113. package/hooks/blocking/tdd_enforcer_parts/tests/conftest.py +10 -0
  114. package/hooks/blocking/tdd_enforcer_parts/tests/test_candidate_paths.py +31 -0
  115. package/hooks/blocking/tdd_enforcer_parts/tests/test_content_analysis.py +30 -0
  116. package/hooks/blocking/tdd_enforcer_parts/tests/test_decisions.py +34 -0
  117. package/hooks/blocking/tdd_enforcer_parts/tests/test_freshness.py +28 -0
  118. package/hooks/blocking/tdd_enforcer_parts/tests/test_git_tracking.py +48 -0
  119. package/hooks/blocking/tdd_enforcer_parts/tests/test_path_classification.py +36 -0
  120. package/hooks/blocking/test_code_rules_enforcer_scratchpad.py +105 -0
  121. package/hooks/blocking/test_code_rules_shared.py +181 -0
  122. package/hooks/blocking/test_inventory_deadlock_resolution.py +154 -0
  123. package/hooks/blocking/test_pii_payload_scan.py +168 -0
  124. package/hooks/blocking/test_plain_language_blocker_allowlist.py +184 -0
  125. package/hooks/blocking/test_sensitive_file_protector.py +185 -0
  126. package/hooks/blocking/test_tdd_enforcer_restore.py +108 -0
  127. package/hooks/blocking/test_tdd_enforcer_scratchpad.py +105 -0
  128. package/hooks/blocking/tests/conftest.py +10 -0
  129. package/hooks/blocking/tests/test_pii_prevention_blocker.py +260 -0
  130. package/hooks/blocking/tests/test_repository_exemption.py +105 -0
  131. package/hooks/blocking/tests/test_repository_resolution.py +108 -0
  132. package/hooks/diagnostic/hook_log_extractor.py +12 -10
  133. package/hooks/git-hooks/post_commit.py +3 -4
  134. package/hooks/hooks_constants/CLAUDE.md +4 -2
  135. package/hooks/hooks_constants/banned_identifiers_constants.py +0 -1
  136. package/hooks/hooks_constants/code_rules_path_utils_constants.py +1 -1
  137. package/hooks/hooks_constants/harness_scratchpad_constants.py +17 -0
  138. package/hooks/hooks_constants/local_identity.py +59 -8
  139. package/hooks/hooks_constants/pii_prevention_constants.py +0 -6
  140. package/hooks/hooks_constants/plain_language_blocker_constants.py +5 -0
  141. package/hooks/hooks_constants/sensitive_file_protector_constants.py +42 -0
  142. package/hooks/hooks_constants/test_local_identity.py +105 -3
  143. package/hooks/pyproject.toml +52 -4
  144. package/hooks/session/plugin_data_dir_cleanup.py +0 -1
  145. package/hooks/validation/mypy_validator.py +2 -2
  146. package/hooks/validators/CLAUDE.md +1 -1
  147. package/hooks/validators/README.md +2 -0
  148. package/hooks/validators/health_check.py +1 -0
  149. package/hooks/validators/mypy_integration.py +2 -0
  150. package/hooks/validators/python_style_checks.py +114 -136
  151. package/hooks/validators/python_style_helpers.py +95 -0
  152. package/hooks/validators/ruff_integration.py +3 -0
  153. package/hooks/validators/test_python_style_checks.py +0 -164
  154. package/hooks/validators/test_python_style_checks_decorator_gap.py +119 -0
  155. package/hooks/validators/test_python_style_fixes.py +251 -0
  156. package/hooks/validators/test_python_style_helpers.py +125 -0
  157. package/hooks/workflow/auto_formatter.py +5 -4
  158. package/package.json +1 -1
  159. package/rules/CLAUDE.md +1 -0
  160. package/rules/anti-corollary-tests.md +69 -0
  161. package/rules/bdd.md +1 -3
  162. package/rules/code-reviews.md +1 -1
  163. package/rules/gh-paginate.md +1 -1
  164. package/rules/plain-language.md +2 -0
  165. package/scripts/CLAUDE.md +4 -0
  166. package/scripts/dev_env_scripts_constants/CLAUDE.md +6 -4
  167. package/scripts/dev_env_scripts_constants/code_review_constants.py +71 -0
  168. package/scripts/dev_env_scripts_constants/grok_worker_constants.py +435 -0
  169. package/scripts/dev_env_scripts_constants/timing.py +7 -1
  170. package/scripts/grok_headless_runner.py +294 -0
  171. package/scripts/grok_worker_preflight.py +410 -0
  172. package/scripts/invoke_code_review.py +463 -0
  173. package/scripts/resolve_worker_spawn.py +619 -0
  174. package/scripts/spawn_grok_batch.py +672 -0
  175. package/scripts/test_grok_headless_runner.py +626 -0
  176. package/scripts/test_grok_worker_preflight.py +1054 -0
  177. package/scripts/test_invoke_code_review.py +672 -0
  178. package/scripts/test_resolve_worker_spawn.py +1014 -0
  179. package/scripts/test_spawn_grok_batch.py +1017 -0
  180. package/skills/CLAUDE.md +6 -3
  181. package/skills/_shared/pr-loop/scripts/build_audit_prompt.py +72 -13
  182. package/skills/_shared/pr-loop/scripts/build_fix_prompt.py +121 -14
  183. package/skills/_shared/pr-loop/scripts/skills_pr_loop_constants/path_resolver_constants.py +78 -0
  184. package/skills/_shared/pr-loop/scripts/test_build_audit_prompt.py +121 -0
  185. package/skills/_shared/pr-loop/scripts/test_build_fix_prompt.py +196 -6
  186. package/skills/autoconverge/CLAUDE.md +3 -3
  187. package/skills/autoconverge/SKILL.md +9 -3
  188. package/skills/autoconverge/reference/CLAUDE.md +2 -2
  189. package/skills/autoconverge/reference/convergence.md +33 -11
  190. package/skills/autoconverge/reference/stop-conditions.md +16 -5
  191. package/skills/autoconverge/workflow/CLAUDE.md +2 -1
  192. package/skills/autoconverge/workflow/converge.clean-audit.test.mjs +7 -2
  193. package/skills/autoconverge/workflow/converge.codex-gate.test.mjs +300 -0
  194. package/skills/autoconverge/workflow/converge.contract.test.mjs +5 -5
  195. package/skills/autoconverge/workflow/converge.copilot-gate.test.mjs +29 -29
  196. package/skills/autoconverge/workflow/converge.fix-progress.test.mjs +1 -1
  197. package/skills/autoconverge/workflow/converge.mjs +202 -18
  198. package/skills/bugteam/CLAUDE.md +2 -2
  199. package/skills/bugteam/CONSTRAINTS.md +3 -2
  200. package/skills/bugteam/PROMPTS.md +7 -6
  201. package/skills/bugteam/SKILL.md +18 -13
  202. package/skills/bugteam/reference/README.md +2 -3
  203. package/skills/bugteam/reference/audit-and-teammates.md +215 -35
  204. package/skills/bugteam/reference/design-rationale.md +1 -1
  205. package/skills/bugteam/reference/obstacles/CLAUDE.md +1 -1
  206. package/skills/bugteam/reference/team-setup.md +8 -2
  207. package/skills/closeout/SKILL.md +153 -0
  208. package/skills/closeout/reference/handoff-prompt-template.md +72 -0
  209. package/skills/closeout/reference/issue-body-templates.md +108 -0
  210. package/skills/closeout/reference/pii-redaction-checklist.md +36 -0
  211. package/skills/codex-review/CLAUDE.md +46 -0
  212. package/skills/codex-review/SKILL.md +181 -0
  213. package/skills/codex-review/reference/CLAUDE.md +15 -0
  214. package/skills/codex-review/reference/cli-contract.md +253 -0
  215. package/skills/codex-review/reference/loop-integration.md +118 -0
  216. package/skills/codex-review/scripts/codex_down_classifier.py +98 -0
  217. package/skills/codex-review/scripts/codex_review_scripts_constants/CLAUDE.md +18 -0
  218. package/skills/codex-review/scripts/codex_review_scripts_constants/__init__.py +1 -0
  219. package/skills/codex-review/scripts/codex_review_scripts_constants/classifier_constants.py +35 -0
  220. package/skills/codex-review/scripts/codex_review_scripts_constants/codex_usage_probe_constants.py +86 -0
  221. package/skills/codex-review/scripts/codex_review_scripts_constants/findings_constants.py +18 -0
  222. package/skills/codex-review/scripts/codex_review_scripts_constants/run_constants.py +45 -0
  223. package/skills/codex-review/scripts/codex_usage_probe.py +573 -0
  224. package/skills/codex-review/scripts/fixtures/auth_failure_synthetic.txt +1 -0
  225. package/skills/codex-review/scripts/fixtures/config_load_failure_v0.125.0.txt +1 -0
  226. package/skills/codex-review/scripts/fixtures/freeform_findings_v0.144.3.txt +6 -0
  227. package/skills/codex-review/scripts/fixtures/model_rejection_v0.125.0.jsonl +5 -0
  228. package/skills/codex-review/scripts/fixtures/structured_findings.txt +13 -0
  229. package/skills/codex-review/scripts/fixtures/success_stream_v0.144.3.jsonl +6 -0
  230. package/skills/codex-review/scripts/fixtures/unknown_failure_synthetic.txt +1 -0
  231. package/skills/codex-review/scripts/fixtures/usage_limit_synthetic.txt +1 -0
  232. package/skills/codex-review/scripts/parse_codex_findings.py +207 -0
  233. package/skills/codex-review/scripts/run_codex_review.py +415 -0
  234. package/skills/codex-review/scripts/test_codex_down_classifier.py +143 -0
  235. package/skills/codex-review/scripts/test_codex_usage_probe.py +678 -0
  236. package/skills/codex-review/scripts/test_parse_codex_findings.py +130 -0
  237. package/skills/codex-review/scripts/test_run_codex_review.py +812 -0
  238. package/skills/codex-review/test_skill_scaffold.py +192 -0
  239. package/skills/grok-spawn/CLAUDE.md +28 -0
  240. package/skills/grok-spawn/SKILL.md +226 -0
  241. package/skills/grok-spawn/reference/flag-profiles.md +132 -0
  242. package/skills/grok-spawn/reference/worker-briefs.md +152 -0
  243. package/skills/grokify/SKILL.md +9 -1
  244. package/skills/grokify/capability-claims.test.mjs +28 -0
  245. package/skills/grokify/evals/README.md +72 -0
  246. package/skills/grokify/evals/parse-payload.test.mjs +171 -0
  247. package/skills/grokify/evals/run-capability-evals.mjs +545 -0
  248. package/skills/orchestrator/SKILL.md +32 -22
  249. package/skills/orchestrator-refresh/SKILL.md +12 -8
  250. package/skills/pr-converge/CLAUDE.md +1 -1
  251. package/skills/pr-converge/SKILL.md +34 -13
  252. package/skills/pr-converge/reference/convergence-gates.md +42 -15
  253. package/skills/pr-converge/reference/fix-protocol.md +1 -1
  254. package/skills/pr-converge/reference/ground-rules.md +1 -1
  255. package/skills/pr-converge/reference/per-tick.md +130 -42
  256. package/skills/pr-converge/reference/state-schema.md +10 -0
  257. package/skills/pr-converge/scripts/CLAUDE.md +2 -0
  258. package/skills/pr-converge/scripts/_pr_converge_path_setup.py +5 -1
  259. package/skills/pr-converge/scripts/check_convergence.py +605 -29
  260. package/skills/pr-converge/scripts/check_convergence_availability.py +232 -0
  261. package/skills/pr-converge/scripts/check_convergence_gates.py +279 -235
  262. package/skills/pr-converge/scripts/check_convergence_thread_gates.py +1 -1
  263. package/skills/pr-converge/scripts/pr_converge_scripts_constants/convergence_gate_constants.py +36 -2
  264. package/skills/pr-converge/scripts/test__pr_converge_path_setup.py +4 -0
  265. package/skills/pr-converge/scripts/test_check_convergence.py +71 -3
  266. package/skills/pr-converge/scripts/test_check_convergence_availability.py +326 -0
  267. package/skills/pr-converge/scripts/test_check_convergence_codex.py +507 -0
  268. package/skills/pr-converge/scripts/test_check_convergence_contract.py +89 -17
  269. package/skills/pr-converge/scripts/test_check_convergence_fixture.py +179 -0
  270. package/skills/pr-converge/scripts/test_check_convergence_gates.py +84 -68
  271. package/skills/pr-converge/scripts/test_check_convergence_thread_gates.py +24 -0
  272. package/skills/pr-converge/test_step5_host_branch.py +106 -0
  273. package/skills/pr-fix-protocol/SKILL.md +65 -0
  274. package/skills/pr-loop-cloud-transport/SKILL.md +2 -0
  275. package/skills/reviewer-gates/SKILL.md +7 -5
  276. package/skills/skill-builder/references/skill-modularity.md +1 -1
  277. package/skills/team-advisor/SKILL.md +16 -12
  278. package/system-prompts/software-engineer.xml +7 -6
  279. package/hooks/validators/test_verify_paths.py +0 -32
  280. package/hooks/validators/verify_paths.py +0 -57
@@ -0,0 +1,98 @@
1
+ """Classify Codex run streams into down-detail and gate outcome classes.
2
+
3
+ ::
4
+
5
+ classification = classify_codex_run(exit_code=1, stream_text=stderr_text)
6
+ classification.detail_class # usage_limit | auth_failure | ...
7
+ classification.outcome_class # codex_down | completed
8
+ """
9
+
10
+ from __future__ import annotations
11
+
12
+ from dataclasses import dataclass
13
+
14
+ from codex_review_scripts_constants.classifier_constants import (
15
+ ALL_AUTH_FAILURE_MARKERS,
16
+ ALL_CONFIG_ERROR_MARKERS,
17
+ ALL_MODEL_ERROR_MARKERS,
18
+ ALL_USAGE_LIMIT_MARKERS,
19
+ FAILURE_CLASS_AUTH_FAILURE,
20
+ FAILURE_CLASS_CONFIG_ERROR,
21
+ FAILURE_CLASS_MODEL_ERROR,
22
+ FAILURE_CLASS_UNKNOWN,
23
+ FAILURE_CLASS_USAGE_LIMIT,
24
+ SUCCESS_EXIT_CODE,
25
+ )
26
+ from codex_review_scripts_constants.run_constants import (
27
+ OUTCOME_CLASS_CODEX_DOWN,
28
+ OUTCOME_CLASS_COMPLETED,
29
+ )
30
+
31
+
32
+ @dataclass(frozen=True)
33
+ class CodexRunClassification:
34
+ """Fine-grained failure class plus the gate-level outcome class.
35
+
36
+ ::
37
+
38
+ CodexRunClassification(
39
+ detail_class="config_error",
40
+ outcome_class="codex_down",
41
+ )
42
+
43
+ Attributes:
44
+ detail_class: ``completed`` or a failure class name.
45
+ outcome_class: ``completed`` or ``codex_down`` for the conditional gate.
46
+ """
47
+
48
+ detail_class: str
49
+ outcome_class: str
50
+
51
+
52
+ def _stream_contains_marker(stream_text: str, all_markers: tuple[str, ...]) -> bool:
53
+ lowered_stream = stream_text.lower()
54
+ return any(each_marker in lowered_stream for each_marker in all_markers)
55
+
56
+
57
+ def _classify_failure_detail(stream_text: str) -> str:
58
+ if _stream_contains_marker(stream_text, ALL_CONFIG_ERROR_MARKERS):
59
+ return FAILURE_CLASS_CONFIG_ERROR
60
+ if _stream_contains_marker(stream_text, ALL_MODEL_ERROR_MARKERS):
61
+ return FAILURE_CLASS_MODEL_ERROR
62
+ if _stream_contains_marker(stream_text, ALL_USAGE_LIMIT_MARKERS):
63
+ return FAILURE_CLASS_USAGE_LIMIT
64
+ if _stream_contains_marker(stream_text, ALL_AUTH_FAILURE_MARKERS):
65
+ return FAILURE_CLASS_AUTH_FAILURE
66
+ return FAILURE_CLASS_UNKNOWN
67
+
68
+
69
+ def classify_codex_run(*, exit_code: int, stream_text: str) -> CodexRunClassification:
70
+ """Map exit code and stream text to detail and gate outcome classes.
71
+
72
+ ::
73
+
74
+ classify_codex_run(exit_code=0, stream_text=success_jsonl)
75
+ # ok: detail_class=completed, outcome_class=completed
76
+ classify_codex_run(exit_code=1, stream_text="rate limit")
77
+ # ok: detail_class=usage_limit, outcome_class=codex_down
78
+
79
+ Exit zero is a completed review. Every other class — including
80
+ ``unknown`` for nonzero exits and unparseable text — maps to
81
+ ``codex_down`` so the conditional gate fails closed.
82
+
83
+ Args:
84
+ exit_code: Process exit code from the Codex review invocation.
85
+ stream_text: Captured stdout JSONL and/or stderr text.
86
+
87
+ Returns:
88
+ Detail class and gate outcome class for the run.
89
+ """
90
+ if exit_code == SUCCESS_EXIT_CODE:
91
+ return CodexRunClassification(
92
+ detail_class=OUTCOME_CLASS_COMPLETED,
93
+ outcome_class=OUTCOME_CLASS_COMPLETED,
94
+ )
95
+ return CodexRunClassification(
96
+ detail_class=_classify_failure_detail(stream_text),
97
+ outcome_class=OUTCOME_CLASS_CODEX_DOWN,
98
+ )
@@ -0,0 +1,18 @@
1
+ # codex-review/scripts/codex_review_scripts_constants
2
+
3
+ Python package of named constants imported by codex-review scripts. Importing from this package keeps magic values out of script bodies.
4
+
5
+ ## Modules
6
+
7
+ | File | Constants for |
8
+ |---|---|
9
+ | `__init__.py` | Package marker and package docstring. |
10
+ | `run_constants.py` | Binary name, flag strings, custom-instructions prompt, version-probe pattern, timeout default, decode/timeout exit sentinels, flag_token_pattern suffix (whole-token shape match), JSONL keys, and capture outcome class labels for `run_codex_review.py`. |
11
+ | `findings_constants.py` | Finding field keys, fenced-JSON and freeform patterns for `parse_codex_findings.py`. |
12
+ | `classifier_constants.py` | Failure class names and stream markers for `codex_down_classifier.py`. |
13
+ | `run_constants.py` | Binary name, flag strings, custom-instructions prompt, version-probe pattern, timeout default, decode/timeout exit sentinels, flag_token_pattern suffix (whole-token shape match), JSONL keys, JSONL capture filename and newline mode, and capture outcome class labels for `run_codex_review.py`. |
14
+ | `codex_usage_probe_constants.py` | The weekly-usage probe CLI: gate threshold, report JSON keys, app-server JSON-RPC surface, rate-limit field keys, weekly-window sizing, text-status parse patterns, source labels, and exit codes. |
15
+
16
+ ## Convention
17
+
18
+ Scripts import from this package at module scope. No constant is defined inline in a script body — the hook enforces this at write time.
@@ -0,0 +1 @@
1
+ """Named constants for the codex-review skill scripts."""
@@ -0,0 +1,35 @@
1
+ """Named constants for the Codex down-classifier."""
2
+
3
+ from __future__ import annotations
4
+
5
+ FAILURE_CLASS_USAGE_LIMIT = "usage_limit"
6
+ FAILURE_CLASS_AUTH_FAILURE = "auth_failure"
7
+ FAILURE_CLASS_CONFIG_ERROR = "config_error"
8
+ FAILURE_CLASS_MODEL_ERROR = "model_error"
9
+ FAILURE_CLASS_UNKNOWN = "unknown"
10
+ ALL_CONFIG_ERROR_MARKERS = (
11
+ "error loading config.toml",
12
+ "unknown variant",
13
+ )
14
+ ALL_MODEL_ERROR_MARKERS = (
15
+ "invalid_request_error",
16
+ "model is not supported",
17
+ "requires a newer version of codex",
18
+ )
19
+ ALL_USAGE_LIMIT_MARKERS = (
20
+ "rate limit",
21
+ "too many requests",
22
+ "http 429",
23
+ " (429)",
24
+ "credits exhausted",
25
+ "out of credits",
26
+ "api quota",
27
+ "usage quota",
28
+ )
29
+ ALL_AUTH_FAILURE_MARKERS = (
30
+ "unauthorized",
31
+ "authentication failed",
32
+ "login required",
33
+ "not authenticated",
34
+ )
35
+ SUCCESS_EXIT_CODE = 0
@@ -0,0 +1,86 @@
1
+ """Constants for the Codex weekly-usage probe CLI.
2
+
3
+ Groups: gate threshold, probe report JSON keys, app-server JSON-RPC surface,
4
+ rate-limit snapshot field keys, weekly-window sizing, parse patterns for
5
+ text status output, source labels, and exit codes.
6
+ """
7
+
8
+ from __future__ import annotations
9
+
10
+ WEEKLY_USAGE_GATE_THRESHOLD_PERCENT = 10
11
+
12
+ USAGE_REPORT_KEY_PERCENT_LEFT = "percent_left"
13
+ USAGE_REPORT_KEY_WINDOW_RESET = "window_reset"
14
+ USAGE_REPORT_KEY_SOURCE = "source"
15
+
16
+ CODEX_BINARY_NAME = "codex"
17
+ ALL_APP_SERVER_COMMAND_PARTS = ("app-server", "--listen", "stdio://")
18
+ APP_SERVER_TIMEOUT_SECONDS = 30
19
+ READER_THREAD_JOIN_TIMEOUT_SECONDS = 2
20
+ PROCESS_TREE_WAIT_TIMEOUT_SECONDS = 5
21
+ WINDOWS_OS_NAME = "nt"
22
+ WINDOWS_COMMAND_SHELL = "cmd"
23
+ WINDOWS_COMMAND_SHELL_RUN_FLAG = "/c"
24
+ ALL_WINDOWS_SCRIPT_SUFFIXES = (".cmd", ".bat")
25
+ WINDOWS_TASKKILL_COMMAND = "taskkill"
26
+ WINDOWS_TASKKILL_FORCE_FLAG = "/F"
27
+ WINDOWS_TASKKILL_TREE_FLAG = "/T"
28
+ WINDOWS_TASKKILL_PID_FLAG = "/PID"
29
+
30
+ JSONRPC_VERSION = "2.0"
31
+ JSONRPC_KEY_ID = "id"
32
+ JSONRPC_KEY_METHOD = "method"
33
+ JSONRPC_KEY_PARAMS = "params"
34
+ JSONRPC_KEY_REPLY_BODY = "result"
35
+ JSONRPC_KEY_ERROR = "error"
36
+ JSONRPC_KEY_VERSION = "jsonrpc"
37
+
38
+ INITIALIZE_REQUEST_ID = 1
39
+ RATE_LIMITS_REQUEST_ID = 2
40
+ METHOD_INITIALIZE = "initialize"
41
+ METHOD_INITIALIZED = "initialized"
42
+ METHOD_RATE_LIMITS_READ = "account/rateLimits/read"
43
+
44
+ CLIENT_INFO_KEY = "clientInfo"
45
+ CLIENT_INFO_NAME_KEY = "name"
46
+ CLIENT_INFO_VERSION_KEY = "version"
47
+ CLIENT_INFO_NAME = "codex-usage-probe"
48
+ CLIENT_INFO_VERSION = "1.0.0"
49
+ CAPABILITIES_KEY = "capabilities"
50
+ EXPERIMENTAL_API_KEY = "experimentalApi"
51
+
52
+ RATE_LIMITS_KEY = "rateLimits"
53
+ PRIMARY_WINDOW_KEY = "primary"
54
+ SECONDARY_WINDOW_KEY = "secondary"
55
+ USED_PERCENT_KEY = "usedPercent"
56
+ RESETS_AT_KEY = "resetsAt"
57
+ WINDOW_DURATION_MINS_KEY = "windowDurationMins"
58
+
59
+ WEEKLY_WINDOW_DURATION_MINUTES = 10080
60
+ PERCENT_FULL = 100
61
+ PERCENT_EMPTY = 0
62
+
63
+ SOURCE_APP_SERVER_RATE_LIMITS = "codex app-server account/rateLimits/read"
64
+ SOURCE_TEXT_STATUS = "text-status"
65
+ SOURCE_NO_USAGE_SURFACE = "no-usage-surface"
66
+
67
+ TEXT_WEEKLY_PERCENT_LEFT_PATTERN = (
68
+ r"(?i)weekly(?:\s+(?:limit|usage|cap))?"
69
+ r"[^\n%]{0,40}?"
70
+ r"(?P<percent>\d{1,3}(?:\.\d+)?)\s*%\s*(?:left|remaining)"
71
+ )
72
+ TEXT_WEEKLY_USED_PERCENT_PATTERN = (
73
+ r"(?i)weekly(?:\s+(?:limit|usage|cap))?"
74
+ r"[^\n%]{0,40}?"
75
+ r"(?P<percent>\d{1,3}(?:\.\d+)?)\s*%\s*(?:used|consumed)"
76
+ )
77
+ TEXT_WINDOW_RESET_PATTERN = (
78
+ r"(?i)(?:weekly\s+)?(?:window\s+)?resets?(?:\s+at)?"
79
+ r"[:\s]+(?P<reset>[^\s)\].,;]+)"
80
+ )
81
+
82
+ EXIT_CODE_SUCCESS = 0
83
+ EXIT_CODE_CRASH = 1
84
+
85
+ UTF8_ENCODING = "utf-8"
86
+ NEWLINE = "\n"
@@ -0,0 +1,18 @@
1
+ """Named constants for the Codex findings parser."""
2
+
3
+ from __future__ import annotations
4
+
5
+ FINDING_KEY_TITLE = "title"
6
+ FINDING_KEY_PRIORITY = "priority"
7
+ FINDING_KEY_FILE = "file"
8
+ FINDING_KEY_LINE_RANGE = "line_range"
9
+ FINDING_KEY_BODY = "body"
10
+ FENCED_JSON_BLOCK_PATTERN = r"```(?:json)?\s*\n(.*?)\n```"
11
+ FREEFORM_FINDING_LINE_PATTERN = (
12
+ r"^-\s*\[(?P<priority>P\d+)\]\s+"
13
+ r"(?P<title>.+?)\s+[—–-]\s+"
14
+ r"(?P<file_path>.+?):(?P<line_range>\d+-\d+)\s*$"
15
+ )
16
+ FREEFORM_BULLET_PREFIX = "- ["
17
+ EMPTY_STRING = ""
18
+ NEWLINE = "\n"
@@ -0,0 +1,45 @@
1
+ """Named constants for the codex-review headless wrapper."""
2
+
3
+ from __future__ import annotations
4
+
5
+ CODEX_BINARY_NAME = "codex"
6
+ EXEC_SUBCOMMAND = "exec"
7
+ REVIEW_SUBCOMMAND = "review"
8
+ HELP_FLAG = "--help"
9
+ VERSION_FLAG = "--version"
10
+ JSON_FLAG = "--json"
11
+ BASE_TARGET_FLAG = "--base"
12
+ UNCOMMITTED_TARGET_FLAG = "--uncommitted"
13
+ COMMIT_TARGET_FLAG = "--commit"
14
+ MODEL_FLAG = "-m"
15
+ CODEX_MODEL_PIN = ""
16
+ CODEX_HOME_ENV_VAR = "CODEX_HOME"
17
+ DEFAULT_TIMEOUT_SECONDS = 600
18
+ JSONL_CAPTURE_FILENAME = "codex-review.jsonl"
19
+ JSONL_CAPTURE_NEWLINE = ""
20
+ UTF8_ENCODING = "utf-8"
21
+ VERSION_PROBE_PATTERN = r"codex(?:-cli)?\s+(\d+\.\d+\.\d+)"
22
+ OUTCOME_CLASS_CODEX_DOWN = "codex_down"
23
+ OUTCOME_CLASS_COMPLETED = "completed"
24
+ MISSING_BINARY_EXIT_CODE = 127
25
+ TIMEOUT_EXIT_CODE = 124
26
+ SUBPROCESS_DECODE_EXIT_CODE = 70
27
+ SHAPE_FLAG_TOKEN_TAIL_PATTERN = r"(?![\w-])"
28
+ JSONL_EVENT_TYPE_KEY = "type"
29
+ JSONL_ENTRY_KEY = "item"
30
+ JSONL_ENTRY_COMPLETED_TYPE = "item.completed"
31
+ JSONL_AGENT_MESSAGE_TYPE = "agent_message"
32
+ JSONL_AGENT_MESSAGE_TEXT_KEY = "text"
33
+ CUSTOM_INSTRUCTIONS_PROMPT = (
34
+ "Write a one-line review summary, then the heading Review comment:, then "
35
+ "zero or more finding bullets. Each bullet must use the form "
36
+ "- [P1] <title> — <path>:<start>-<end> "
37
+ "followed by an explanation paragraph. Use the same [P#] priority tags. "
38
+ "When there are no findings, omit finding bullets after the summary."
39
+ )
40
+ ALL_SHAPE_PROBE_REQUIRED_FLAGS = (
41
+ BASE_TARGET_FLAG,
42
+ UNCOMMITTED_TARGET_FLAG,
43
+ COMMIT_TARGET_FLAG,
44
+ JSON_FLAG,
45
+ )