claude-dev-env 2.16.0 → 2.18.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 (557) hide show
  1. package/.agents/agents/AGENTS.md +6 -0
  2. package/.agents/skills/AGENTS.md +34 -35
  3. package/.agents/skills/_shared/pr-loop/AGENTS.md +22 -15
  4. package/.agents/skills/_shared/pr-loop/portable-driver.md +6 -7
  5. package/.agents/skills/_shared/pr-loop/prompts/AGENTS.md +2 -2
  6. package/.agents/skills/_shared/pr-loop/scripts/AGENTS.md +1 -1
  7. package/.agents/skills/_shared/pr-loop/scripts/portable_converge_driver.py +25 -16
  8. package/.agents/skills/_shared/pr-loop/scripts/skills_pr_loop_constants/portable_driver_constants.py +1 -5
  9. package/.agents/skills/autoconverge/reference/convergence-gates.md +31 -0
  10. package/.agents/skills/autoconverge/reference/convergence.md +8 -10
  11. package/.agents/skills/autoconverge/reference/gotchas.md +1 -1
  12. package/.agents/skills/autoconverge/reference/stop-conditions.md +1 -1
  13. package/.agents/skills/autoconverge/workflow/converge.codex-gate.test.mjs +1 -1
  14. package/.agents/skills/autoconverge/workflow/converge.contract.test.mjs +1 -1
  15. package/.agents/skills/autoconverge/workflow/converge.mjs +3 -3
  16. package/.agents/skills/cert-classification-rule/SKILL.md +224 -0
  17. package/.agents/skills/cert-classification-rule/scripts/resort_cert_folders.py +158 -0
  18. package/.agents/skills/eli5/SKILL.md +128 -0
  19. package/.agents/skills/eli5/reference/task-seeds.md +11 -0
  20. package/.agents/skills/fresh-branch/scripts/test_create_fresh_branch.py +2 -3
  21. package/.agents/skills/name-by-capability-audit/SKILL.md +67 -0
  22. package/.agents/skills/name-by-capability-audit/reference/fetch-commands.md +29 -0
  23. package/.agents/skills/name-by-capability-audit/reference/offense-examples.md +32 -0
  24. package/.agents/skills/name-by-capability-audit/reference/report-template.md +29 -0
  25. package/.agents/skills/name-by-capability-audit/reference/rule-checklist.md +38 -0
  26. package/.agents/skills/name-by-capability-audit/reference/task-seeds.md +9 -0
  27. package/.agents/skills/orchestrator/SKILL.md +6 -4
  28. package/.agents/skills/orchestrator-refresh/SKILL.md +9 -5
  29. package/.agents/skills/pr-cleanup/SKILL.md +99 -0
  30. package/.agents/skills/prototype/reference/honest-limitations.md +1 -1
  31. package/.agents/skills/prototype/reference/promotion-tasks.md +1 -1
  32. package/.agents/skills/prototype/scripts/test_build_sandbox_settings.py +2 -2
  33. package/.agents/skills/prototype/workflows/promotion.md +2 -2
  34. package/.agents/skills/review-router/SKILL.md +51 -0
  35. package/.agents/skills/review-router/reference/route-policy.json +7 -0
  36. package/.agents/skills/review-router/reference/task-seeds.md +1 -0
  37. package/.agents/skills/review-router/scripts/conftest.py +4 -0
  38. package/.agents/skills/review-router/scripts/review_router.py +50 -0
  39. package/.agents/skills/review-router/scripts/review_router_cli.py +211 -0
  40. package/.agents/skills/review-router/scripts/review_router_constants/__init__.py +1 -0
  41. package/.agents/skills/review-router/scripts/review_router_constants/config/__init__.py +0 -0
  42. package/.agents/skills/review-router/scripts/review_router_constants/config/constants.py +13 -0
  43. package/.agents/skills/review-router/scripts/test_review_router.py +23 -0
  44. package/.agents/skills/review-router/scripts/test_review_router_cli.py +47 -0
  45. package/.agents/skills/review-tier/SKILL.md +56 -0
  46. package/.agents/skills/review-tier/reference/task-seeds.md +1 -0
  47. package/.agents/skills/review-tier/reference/tier-policy.json +9 -0
  48. package/.agents/skills/review-tier/scripts/conftest.py +4 -0
  49. package/.agents/skills/review-tier/scripts/review_tier.py +332 -0
  50. package/.agents/skills/review-tier/scripts/review_tier_constants/__init__.py +1 -0
  51. package/.agents/skills/review-tier/scripts/review_tier_constants/config/__init__.py +0 -0
  52. package/.agents/skills/review-tier/scripts/review_tier_constants/config/constants.py +29 -0
  53. package/.agents/skills/review-tier/scripts/test_generation.py +171 -0
  54. package/.agents/skills/review-tier/scripts/test_review_tier.py +33 -0
  55. package/.agents/skills/session-log/SKILL.md +1 -1
  56. package/.agents/skills/shared-extraction-audit/SKILL.md +160 -0
  57. package/.agents/skills/shared-extraction-audit/reference/examples.md +46 -0
  58. package/.agents/skills/shared-extraction-audit/reference/offense-taxonomy.md +100 -0
  59. package/.agents/skills/source-command-logifix/SKILL.md +29 -0
  60. package/.agents/skills/source-command-sr-loop/SKILL.md +58 -0
  61. package/.agents/skills/team-advisor/SKILL.md +5 -5
  62. package/.agents/skills-archived/AGENTS.md +45 -0
  63. package/.agents/{skills → skills-archived}/anthropic-plan/AGENTS.md +1 -1
  64. package/.agents/{skills → skills-archived}/bugteam/scripts/reflow_skill_md.py +3 -3
  65. package/.agents/{skills → skills-archived}/codex-review/test_skill_scaffold.py +1 -1
  66. package/.agents/{skills → skills-archived}/copilot-finding-triage/SKILL.md +1 -1
  67. package/.agents/{skills → skills-archived}/pr-converge/SKILL.md +6 -6
  68. package/.agents/{skills → skills-archived}/pr-converge/pr_converge_skill_constants/AGENTS.md +1 -1
  69. package/.agents/{skills → skills-archived}/pr-converge/pr_converge_skill_constants/constants.py +1 -1
  70. package/.agents/{skills → skills-archived}/pr-converge/reference/multi-pr-orchestration.md +1 -1
  71. package/.agents/{skills → skills-archived}/pr-converge/reference/per-tick.md +3 -3
  72. package/.agents/{skills → skills-archived}/pr-converge/scripts/reflow_skill_md.py +2 -2
  73. package/.agents/{skills → skills-archived}/pr-converge/test_portable_pacer_gate.py +6 -2
  74. package/.agents/{skills → skills-archived}/pr-converge/workflows/schedule-wakeup-loop.md +1 -1
  75. package/.agents/{skills → skills-archived}/split-pr/reference/proposal-format.md +1 -1
  76. package/AGENTS.md +34 -58
  77. package/_shared/AGENTS.md +2 -0
  78. package/_shared/advisor/AGENTS.md +5 -5
  79. package/_shared/advisor/advisor-protocol.md +54 -31
  80. package/_shared/advisor/reference/advisor-block.md +5 -1
  81. package/_shared/advisor/reference/consult-format.md +1 -1
  82. package/_shared/advisor/reference/identity.md +28 -0
  83. package/_shared/advisor/reference/lifecycle.md +8 -1
  84. package/_shared/advisor/reference/sol-rung.md +14 -9
  85. package/_shared/advisor/reference/spawn-walk-log.md +6 -5
  86. package/_shared/advisor/reference/third-party-bind.md +6 -7
  87. package/_shared/advisor/reference/warm-up.md +9 -2
  88. package/_shared/advisor/scripts/codex_sol_advisor.py +66 -11
  89. package/_shared/advisor/scripts/config/advisor_scripts_constants/advisor_route_constants.py +9 -0
  90. package/_shared/advisor/scripts/config/advisor_scripts_constants/model_tier_run_validator_constants.py +16 -4
  91. package/_shared/advisor/scripts/config/advisor_scripts_constants/sol_advisor_constants.py +11 -10
  92. package/_shared/advisor/scripts/model_tier_run_validator.py +50 -23
  93. package/_shared/advisor/scripts/tests/test_codex_sol_advisor.py +108 -3
  94. package/_shared/advisor/scripts/tests/test_model_tier_run_validator.py +171 -82
  95. package/_shared/advisor/scripts/tests/test_tier_model_ids.py +43 -0
  96. package/_shared/advisor/scripts/tier_model_ids.py +75 -7
  97. package/_shared/pr-loop/audit-reply-template.md +4 -0
  98. package/_shared/pr-loop/fix-protocol.md +7 -6
  99. package/_shared/pr-loop/gh-payloads.md +8 -6
  100. package/_shared/pr-loop/precatch-rubric.md +6 -5
  101. package/_shared/pr-loop/scripts/AGENTS.md +15 -0
  102. package/_shared/pr-loop/scripts/_pr_converge_path_setup.py +38 -0
  103. package/_shared/pr-loop/scripts/check_bugbot_ci.py +279 -0
  104. package/_shared/pr-loop/scripts/check_convergence.py +923 -0
  105. package/_shared/pr-loop/scripts/check_convergence_availability.py +275 -0
  106. package/_shared/pr-loop/scripts/check_convergence_gates.py +279 -0
  107. package/_shared/pr-loop/scripts/check_convergence_thread_gates.py +219 -0
  108. package/_shared/pr-loop/scripts/check_pending_reviews.py +154 -0
  109. package/_shared/pr-loop/scripts/codex_down_classifier.py +98 -0
  110. package/_shared/pr-loop/scripts/codex_review_scripts_constants/.claude/CLAUDE.md +1 -0
  111. package/_shared/pr-loop/scripts/codex_review_scripts_constants/AGENTS.md +18 -0
  112. package/_shared/pr-loop/scripts/codex_review_scripts_constants/__init__.py +1 -0
  113. package/_shared/pr-loop/scripts/codex_review_scripts_constants/classifier_constants.py +35 -0
  114. package/_shared/pr-loop/scripts/codex_review_scripts_constants/codex_usage_probe_constants.py +82 -0
  115. package/_shared/pr-loop/scripts/codex_review_scripts_constants/findings_constants.py +18 -0
  116. package/_shared/pr-loop/scripts/codex_review_scripts_constants/run_constants.py +53 -0
  117. package/_shared/pr-loop/scripts/codex_usage_probe.py +570 -0
  118. package/_shared/pr-loop/scripts/conftest.py +43 -0
  119. package/_shared/pr-loop/scripts/fetch_copilot_reviews.py +134 -0
  120. package/_shared/pr-loop/scripts/fixtures/auth_failure_synthetic.txt +1 -0
  121. package/_shared/pr-loop/scripts/fixtures/config_load_failure_v0.125.0.txt +1 -0
  122. package/_shared/pr-loop/scripts/fixtures/freeform_findings_v0.144.3.txt +6 -0
  123. package/_shared/pr-loop/scripts/fixtures/model_rejection_v0.125.0.jsonl +5 -0
  124. package/_shared/pr-loop/scripts/fixtures/structured_findings.txt +13 -0
  125. package/_shared/pr-loop/scripts/fixtures/success_stream_v0.144.3.jsonl +6 -0
  126. package/_shared/pr-loop/scripts/fixtures/unknown_failure_synthetic.txt +1 -0
  127. package/_shared/pr-loop/scripts/fixtures/usage_limit_synthetic.txt +1 -0
  128. package/_shared/pr-loop/scripts/parse_codex_findings.py +207 -0
  129. package/_shared/pr-loop/scripts/post_fix_reply.py +168 -0
  130. package/_shared/pr-loop/scripts/pr_converge_scripts_constants/.claude/CLAUDE.md +1 -0
  131. package/_shared/pr-loop/scripts/pr_converge_scripts_constants/AGENTS.md +18 -0
  132. package/_shared/pr-loop/scripts/pr_converge_scripts_constants/__init__.py +0 -0
  133. package/_shared/pr-loop/scripts/pr_converge_scripts_constants/convergence_gate_constants.py +70 -0
  134. package/_shared/pr-loop/scripts/pr_converge_scripts_constants/pr_converge_constants.py +118 -0
  135. package/_shared/pr-loop/scripts/pr_converge_scripts_constants/reflow_skill_md_constants.py +13 -0
  136. package/_shared/pr-loop/scripts/pr_converge_skill_constants/.claude/CLAUDE.md +1 -0
  137. package/_shared/pr-loop/scripts/pr_converge_skill_constants/AGENTS.md +26 -0
  138. package/_shared/pr-loop/scripts/pr_converge_skill_constants/__init__.py +0 -0
  139. package/_shared/pr-loop/scripts/pr_converge_skill_constants/constants.py +69 -0
  140. package/_shared/pr-loop/scripts/run_codex_review.py +609 -0
  141. package/_shared/pr-loop/scripts/test__pr_converge_path_setup.py +30 -0
  142. package/_shared/pr-loop/scripts/test_check_bugbot_ci.py +312 -0
  143. package/_shared/pr-loop/scripts/test_check_convergence.py +438 -0
  144. package/_shared/pr-loop/scripts/test_check_convergence_availability.py +391 -0
  145. package/_shared/pr-loop/scripts/test_check_convergence_codex.py +517 -0
  146. package/_shared/pr-loop/scripts/test_check_convergence_contract.py +400 -0
  147. package/_shared/pr-loop/scripts/test_check_convergence_fixture.py +179 -0
  148. package/_shared/pr-loop/scripts/test_check_convergence_gates.py +84 -0
  149. package/_shared/pr-loop/scripts/test_check_convergence_thread_gates.py +99 -0
  150. package/_shared/pr-loop/scripts/test_codex_down_classifier.py +143 -0
  151. package/_shared/pr-loop/scripts/test_codex_usage_probe.py +683 -0
  152. package/_shared/pr-loop/scripts/test_parse_codex_findings.py +130 -0
  153. package/_shared/pr-loop/scripts/test_run_codex_review.py +969 -0
  154. package/_shared/pr-loop/scripts/tests/test_claude_permissions_common.py +1 -1
  155. package/_shared/pr-loop/scripts/tests/test_code_rules_gate.py +1 -1
  156. package/_shared/pr-loop/scripts/tests/test_fix_hookspath.py +1 -1
  157. package/_shared/pr-loop/state-schema.md +20 -28
  158. package/_shared/pr-loop/worker-spawn.md +4 -3
  159. package/_shared/process-tree/AGENTS.md +3 -3
  160. package/bin/ever-shipped-skills.mjs +29 -1
  161. package/bin/install-constants.mjs +15 -6
  162. package/bin/install.agents-home.test.mjs +13 -0
  163. package/bin/install.cursor-rules.test.mjs +3 -3
  164. package/bin/install.mjs +80 -20
  165. package/bin/install.profile-root.test.mjs +1 -1
  166. package/bin/install.prune.test.mjs +23 -204
  167. package/bin/install.test.mjs +8 -5
  168. package/bin/resolve-install-root.mjs +21 -0
  169. package/bin/resolve-package-managed-directory.mjs +4 -4
  170. package/commands/AGENTS.md +2 -0
  171. package/commands/sr-loop.md +3 -0
  172. package/docs/references/prose-style-enforcement.md +3 -7
  173. package/docs/references/team-advisor-skill.md +2 -2
  174. package/hooks/AGENTS.md +0 -3
  175. package/hooks/blocking/AGENTS.md +0 -2
  176. package/hooks/blocking/ask_user_question_shape_blocker.py +83 -0
  177. package/hooks/blocking/pre_tool_use_dispatcher.py +2 -19
  178. package/hooks/blocking/state_description_blocker.py +1 -1
  179. package/hooks/blocking/test_ask_user_question_shape.py +69 -0
  180. package/hooks/blocking/test_pre_tool_use_dispatcher.py +17 -58
  181. package/hooks/blocking/test_pre_tool_use_dispatcher_native.py +9 -104
  182. package/hooks/blocking/test_state_description_blocker.py +1 -0
  183. package/hooks/blocking/test_stop_dispatcher.py +1 -26
  184. package/hooks/hooks.json +1 -1
  185. package/hooks/hooks_constants/AGENTS.md +0 -3
  186. package/hooks/hooks_constants/ask_user_question_shape.py +1 -1
  187. package/hooks/hooks_constants/ask_user_question_shape_constants.py +73 -0
  188. package/hooks/hooks_constants/bot_mention_comment_blocker_constants.py +1 -2
  189. package/hooks/hooks_constants/code_rules_path_utils_constants.py +0 -1
  190. package/hooks/hooks_constants/pre_tool_use_dispatcher_constants.py +0 -7
  191. package/hooks/hooks_constants/stop_dispatcher_constants.py +0 -1
  192. package/hooks/hooks_constants/test_ask_user_question_shape.py +1 -1
  193. package/hooks/hooks_constants/test_prose_metrics_parity.py +29 -107
  194. package/hooks/hooks_constants/test_stop_dispatcher_constants.py +0 -1
  195. package/hooks/hooks_constants/working_style_prompt_constants.py +9 -10
  196. package/hooks/session/AGENTS.md +4 -1
  197. package/hooks/session/test_working_style_prompt.py +8 -4
  198. package/hooks/session/working_style_prompt.py +4 -2
  199. package/package.json +1 -4
  200. package/rules/AGENTS.md +2 -5
  201. package/rules/asd-ste100-language.md +39 -0
  202. package/rules/ask-user-question-required.md +1 -1
  203. package/rules/long-horizon-autonomy.md +1 -1
  204. package/scripts/AGENTS.md +1 -0
  205. package/scripts/Show-Asset.ps1 +106 -0
  206. package/scripts/test_validate_instruction_pairs.py +30 -3
  207. package/scripts/tests/test_engine.py +4 -4
  208. package/scripts/tests/test_rules.py +5 -5
  209. package/system-prompts/AGENTS.md +8 -0
  210. package/system-prompts/software-engineer.xml +8 -3
  211. package/.agents/skills/grokify/evals/README.md +0 -72
  212. package/.agents/skills/grokify/evals/parse-payload.test.mjs +0 -171
  213. package/.agents/skills/grokify/evals/run-capability-evals.mjs +0 -545
  214. package/_shared/pr-loop/scripts/README.md +0 -21
  215. package/docs/imagegen.md +0 -22
  216. package/hooks/blocking/eli11_reply_enforcer.py +0 -436
  217. package/hooks/blocking/plain_language_blocker.py +0 -758
  218. package/hooks/blocking/test_eli11_reply_enforcer.py +0 -390
  219. package/hooks/blocking/test_plain_language_blocker.py +0 -683
  220. package/hooks/blocking/test_plain_language_blocker_allowlist.py +0 -228
  221. package/hooks/diagnostic/AGENTS.md +0 -75
  222. package/hooks/diagnostic/CLAUDE.md +0 -1
  223. package/hooks/diagnostic/hook_log_extractor.py +0 -875
  224. package/hooks/diagnostic/hook_log_init.py +0 -202
  225. package/hooks/diagnostic/hook_log_stop_wrapper.py +0 -26
  226. package/hooks/diagnostic/migrations/2026-04-25-drop-themes-hook-events.sql +0 -3
  227. package/hooks/diagnostic/migrations/AGENTS.md +0 -16
  228. package/hooks/diagnostic/migrations/CLAUDE.md +0 -1
  229. package/hooks/diagnostic/migrations/README.md +0 -76
  230. package/hooks/diagnostic/queries/AGENTS.md +0 -19
  231. package/hooks/diagnostic/queries/CLAUDE.md +0 -1
  232. package/hooks/diagnostic/queries/block_details_for_hook.sql +0 -26
  233. package/hooks/diagnostic/queries/blocks_by_category.sql +0 -10
  234. package/hooks/diagnostic/queries/blocks_by_tool.sql +0 -9
  235. package/hooks/diagnostic/queries/blocks_last_7_days.sql +0 -11
  236. package/hooks/diagnostic/queries/top_blockers_last_24_hours.sql +0 -12
  237. package/hooks/diagnostic/queries/top_blockers_overall.sql +0 -12
  238. package/hooks/diagnostic/requirements-hook-logs-dev.txt +0 -2
  239. package/hooks/diagnostic/requirements-hook-logs.txt +0 -1
  240. package/hooks/diagnostic/schema.sql +0 -51
  241. package/hooks/diagnostic/test_hook_log_extractor.py +0 -1518
  242. package/hooks/diagnostic/test_hook_log_init.py +0 -227
  243. package/hooks/diagnostic/test_hook_log_stop_wrapper.py +0 -17
  244. package/hooks/hooks_constants/eli11_reply_enforcer_constants.py +0 -94
  245. package/hooks/hooks_constants/hook_log_extractor_constants.py +0 -233
  246. package/hooks/hooks_constants/plain_language_blocker_constants.py +0 -366
  247. package/hooks/hooks_constants/test_hook_log_extractor_constants.py +0 -123
  248. package/rules/doc-prose-cuts.md +0 -58
  249. package/rules/eli11-replies.md +0 -36
  250. package/rules/opus5-communication-contract.md +0 -45
  251. package/rules/plain-language.md +0 -9
  252. /package/.agents/{skills → skills-archived}/anthropic-plan/.claude/CLAUDE.md +0 -0
  253. /package/.agents/{skills → skills-archived}/anthropic-plan/SKILL.md +0 -0
  254. /package/.agents/{skills → skills-archived}/anthropic-plan/scripts/.claude/CLAUDE.md +0 -0
  255. /package/.agents/{skills → skills-archived}/anthropic-plan/scripts/AGENTS.md +0 -0
  256. /package/.agents/{skills → skills-archived}/anthropic-plan/scripts/anthropic_plan_scripts_constants/.claude/CLAUDE.md +0 -0
  257. /package/.agents/{skills → skills-archived}/anthropic-plan/scripts/anthropic_plan_scripts_constants/AGENTS.md +0 -0
  258. /package/.agents/{skills → skills-archived}/anthropic-plan/scripts/anthropic_plan_scripts_constants/__init__.py +0 -0
  259. /package/.agents/{skills → skills-archived}/anthropic-plan/scripts/anthropic_plan_scripts_constants/validate_packet_constants.py +0 -0
  260. /package/.agents/{skills → skills-archived}/anthropic-plan/scripts/test_validate_packet.py +0 -0
  261. /package/.agents/{skills → skills-archived}/anthropic-plan/scripts/validate_packet.py +0 -0
  262. /package/.agents/{skills → skills-archived}/anthropic-plan/templates/.claude/CLAUDE.md +0 -0
  263. /package/.agents/{skills → skills-archived}/anthropic-plan/templates/AGENTS.md +0 -0
  264. /package/.agents/{skills → skills-archived}/anthropic-plan/templates/README.md +0 -0
  265. /package/.agents/{skills → skills-archived}/anthropic-plan/templates/build-prompt.md +0 -0
  266. /package/.agents/{skills → skills-archived}/anthropic-plan/templates/reuse-audit.md +0 -0
  267. /package/.agents/{skills → skills-archived}/anthropic-plan/templates/source-map.md +0 -0
  268. /package/.agents/{skills → skills-archived}/anthropic-plan/templates/visual-plan.template.html +0 -0
  269. /package/.agents/{skills → skills-archived}/anthropic-plan/test_skill_contract.py +0 -0
  270. /package/.agents/{skills → skills-archived}/anthropic-plan/workflow/.claude/CLAUDE.md +0 -0
  271. /package/.agents/{skills → skills-archived}/anthropic-plan/workflow/AGENTS.md +0 -0
  272. /package/.agents/{skills → skills-archived}/anthropic-plan/workflow/plan-packet.contract.test.mjs +0 -0
  273. /package/.agents/{skills → skills-archived}/anthropic-plan/workflow/plan-packet.mjs +0 -0
  274. /package/.agents/{skills → skills-archived}/auditing-claude-config/.claude/CLAUDE.md +0 -0
  275. /package/.agents/{skills → skills-archived}/auditing-claude-config/AGENTS.md +0 -0
  276. /package/.agents/{skills → skills-archived}/auditing-claude-config/SKILL.md +0 -0
  277. /package/.agents/{skills → skills-archived}/auditing-claude-config/reference/probe-hook.md +0 -0
  278. /package/.agents/{skills → skills-archived}/beat-sheet/SKILL.md +0 -0
  279. /package/.agents/{skills → skills-archived}/beat-sheet/reference/visual-beats.md +0 -0
  280. /package/.agents/{skills → skills-archived}/bugteam/.claude/CLAUDE.md +0 -0
  281. /package/.agents/{skills → skills-archived}/bugteam/AGENTS.md +0 -0
  282. /package/.agents/{skills → skills-archived}/bugteam/CONSTRAINTS.md +0 -0
  283. /package/.agents/{skills → skills-archived}/bugteam/EXAMPLES.md +0 -0
  284. /package/.agents/{skills → skills-archived}/bugteam/PROMPTS.md +0 -0
  285. /package/.agents/{skills → skills-archived}/bugteam/SKILL.md +0 -0
  286. /package/.agents/{skills → skills-archived}/bugteam/reference/.claude/CLAUDE.md +0 -0
  287. /package/.agents/{skills → skills-archived}/bugteam/reference/AGENTS.md +0 -0
  288. /package/.agents/{skills → skills-archived}/bugteam/reference/README.md +0 -0
  289. /package/.agents/{skills → skills-archived}/bugteam/reference/audit-and-teammates.md +0 -0
  290. /package/.agents/{skills → skills-archived}/bugteam/reference/copilot-gap-analysis.md +0 -0
  291. /package/.agents/{skills → skills-archived}/bugteam/reference/design-rationale.md +0 -0
  292. /package/.agents/{skills → skills-archived}/bugteam/reference/github-pr-reviews.md +0 -0
  293. /package/.agents/{skills → skills-archived}/bugteam/reference/obstacles/.claude/CLAUDE.md +0 -0
  294. /package/.agents/{skills → skills-archived}/bugteam/reference/obstacles/AGENTS.md +0 -0
  295. /package/.agents/{skills → skills-archived}/bugteam/reference/obstacles/audit-assign-ids.md +0 -0
  296. /package/.agents/{skills → skills-archived}/bugteam/reference/obstacles/audit-capture-excerpts.md +0 -0
  297. /package/.agents/{skills → skills-archived}/bugteam/reference/obstacles/audit-walk-categories.md +0 -0
  298. /package/.agents/{skills → skills-archived}/bugteam/reference/obstacles/audit-write-xml.md +0 -0
  299. /package/.agents/{skills → skills-archived}/bugteam/reference/obstacles/fix-append-summary.md +0 -0
  300. /package/.agents/{skills → skills-archived}/bugteam/reference/obstacles/fix-apply-fixes.md +0 -0
  301. /package/.agents/{skills → skills-archived}/bugteam/reference/obstacles/fix-git-add-commit.md +0 -0
  302. /package/.agents/{skills → skills-archived}/bugteam/reference/obstacles/fix-git-push.md +0 -0
  303. /package/.agents/{skills → skills-archived}/bugteam/reference/obstacles/fix-post-reply.md +0 -0
  304. /package/.agents/{skills → skills-archived}/bugteam/reference/obstacles/fix-publish-summary.md +0 -0
  305. /package/.agents/{skills → skills-archived}/bugteam/reference/obstacles/fix-py-compile.md +0 -0
  306. /package/.agents/{skills → skills-archived}/bugteam/reference/obstacles/fix-read-files.md +0 -0
  307. /package/.agents/{skills → skills-archived}/bugteam/reference/obstacles/fix-resolve-thread.md +0 -0
  308. /package/.agents/{skills → skills-archived}/bugteam/reference/obstacles/fix-test-suite.md +0 -0
  309. /package/.agents/{skills → skills-archived}/bugteam/reference/obstacles/fix-violation-count.md +0 -0
  310. /package/.agents/{skills → skills-archived}/bugteam/reference/obstacles/fix-write-xml.md +0 -0
  311. /package/.agents/{skills → skills-archived}/bugteam/reference/team-setup.md +0 -0
  312. /package/.agents/{skills → skills-archived}/bugteam/scripts/.claude/CLAUDE.md +0 -0
  313. /package/.agents/{skills → skills-archived}/bugteam/scripts/AGENTS.md +0 -0
  314. /package/.agents/{skills → skills-archived}/bugteam/scripts/README.md +0 -0
  315. /package/.agents/{skills → skills-archived}/bugteam/scripts/bugteam_code_rules_gate.py +0 -0
  316. /package/.agents/{skills → skills-archived}/bugteam/scripts/bugteam_fix_hookspath.py +0 -0
  317. /package/.agents/{skills → skills-archived}/bugteam/scripts/bugteam_preflight.py +0 -0
  318. /package/.agents/{skills → skills-archived}/bugteam/scripts/bugteam_scripts_constants/.claude/CLAUDE.md +0 -0
  319. /package/.agents/{skills → skills-archived}/bugteam/scripts/bugteam_scripts_constants/AGENTS.md +0 -0
  320. /package/.agents/{skills → skills-archived}/bugteam/scripts/bugteam_scripts_constants/__init__.py +0 -0
  321. /package/.agents/{skills → skills-archived}/bugteam/scripts/bugteam_scripts_constants/probe_code_rules_enforcer_check_constants.py +0 -0
  322. /package/.agents/{skills → skills-archived}/bugteam/scripts/bugteam_scripts_constants/reflow_skill_md_constants.py +0 -0
  323. /package/.agents/{skills → skills-archived}/bugteam/scripts/bugteam_scripts_constants/windows_safe_rmtree_constants.py +0 -0
  324. /package/.agents/{skills → skills-archived}/bugteam/scripts/probe_code_rules_enforcer_check.py +0 -0
  325. /package/.agents/{skills → skills-archived}/bugteam/scripts/test_bugteam_code_rules_gate.py +0 -0
  326. /package/.agents/{skills → skills-archived}/bugteam/scripts/test_bugteam_fix_hookspath.py +0 -0
  327. /package/.agents/{skills → skills-archived}/bugteam/scripts/test_bugteam_preflight.py +0 -0
  328. /package/.agents/{skills → skills-archived}/bugteam/scripts/test_probe_code_rules_enforcer_check.py +0 -0
  329. /package/.agents/{skills → skills-archived}/bugteam/scripts/test_windows_safe_rmtree.py +0 -0
  330. /package/.agents/{skills → skills-archived}/bugteam/scripts/windows_safe_rmtree.py +0 -0
  331. /package/.agents/{skills → skills-archived}/bugteam/sources.md +0 -0
  332. /package/.agents/{skills → skills-archived}/bugteam/test_skill_additions.py +0 -0
  333. /package/.agents/{skills → skills-archived}/closeout/SKILL.md +0 -0
  334. /package/.agents/{skills → skills-archived}/closeout/reference/handoff-prompt-template.md +0 -0
  335. /package/.agents/{skills → skills-archived}/closeout/reference/pii-redaction-checklist.md +0 -0
  336. /package/.agents/{skills → skills-archived}/codex-review/.claude/CLAUDE.md +0 -0
  337. /package/.agents/{skills → skills-archived}/codex-review/AGENTS.md +0 -0
  338. /package/.agents/{skills → skills-archived}/codex-review/SKILL.md +0 -0
  339. /package/.agents/{skills → skills-archived}/codex-review/reference/.claude/CLAUDE.md +0 -0
  340. /package/.agents/{skills → skills-archived}/codex-review/reference/AGENTS.md +0 -0
  341. /package/.agents/{skills → skills-archived}/codex-review/reference/cli-contract.md +0 -0
  342. /package/.agents/{skills → skills-archived}/codex-review/reference/loop-integration.md +0 -0
  343. /package/.agents/{skills → skills-archived}/codex-review/scripts/codex_down_classifier.py +0 -0
  344. /package/.agents/{skills → skills-archived}/codex-review/scripts/codex_review_scripts_constants/.claude/CLAUDE.md +0 -0
  345. /package/.agents/{skills → skills-archived}/codex-review/scripts/codex_review_scripts_constants/AGENTS.md +0 -0
  346. /package/.agents/{skills → skills-archived}/codex-review/scripts/codex_review_scripts_constants/__init__.py +0 -0
  347. /package/.agents/{skills → skills-archived}/codex-review/scripts/codex_review_scripts_constants/classifier_constants.py +0 -0
  348. /package/.agents/{skills → skills-archived}/codex-review/scripts/codex_review_scripts_constants/codex_usage_probe_constants.py +0 -0
  349. /package/.agents/{skills → skills-archived}/codex-review/scripts/codex_review_scripts_constants/findings_constants.py +0 -0
  350. /package/.agents/{skills → skills-archived}/codex-review/scripts/codex_review_scripts_constants/run_constants.py +0 -0
  351. /package/.agents/{skills → skills-archived}/codex-review/scripts/codex_usage_probe.py +0 -0
  352. /package/.agents/{skills → skills-archived}/codex-review/scripts/fixtures/auth_failure_synthetic.txt +0 -0
  353. /package/.agents/{skills → skills-archived}/codex-review/scripts/fixtures/config_load_failure_v0.125.0.txt +0 -0
  354. /package/.agents/{skills → skills-archived}/codex-review/scripts/fixtures/freeform_findings_v0.144.3.txt +0 -0
  355. /package/.agents/{skills → skills-archived}/codex-review/scripts/fixtures/model_rejection_v0.125.0.jsonl +0 -0
  356. /package/.agents/{skills → skills-archived}/codex-review/scripts/fixtures/structured_findings.txt +0 -0
  357. /package/.agents/{skills → skills-archived}/codex-review/scripts/fixtures/success_stream_v0.144.3.jsonl +0 -0
  358. /package/.agents/{skills → skills-archived}/codex-review/scripts/fixtures/unknown_failure_synthetic.txt +0 -0
  359. /package/.agents/{skills → skills-archived}/codex-review/scripts/fixtures/usage_limit_synthetic.txt +0 -0
  360. /package/.agents/{skills → skills-archived}/codex-review/scripts/parse_codex_findings.py +0 -0
  361. /package/.agents/{skills → skills-archived}/codex-review/scripts/run_codex_review.py +0 -0
  362. /package/.agents/{skills → skills-archived}/codex-review/scripts/test_codex_down_classifier.py +0 -0
  363. /package/.agents/{skills → skills-archived}/codex-review/scripts/test_codex_usage_probe.py +0 -0
  364. /package/.agents/{skills → skills-archived}/codex-review/scripts/test_parse_codex_findings.py +0 -0
  365. /package/.agents/{skills → skills-archived}/codex-review/scripts/test_run_codex_review.py +0 -0
  366. /package/.agents/{skills → skills-archived}/comments/SKILL.md +0 -0
  367. /package/.agents/{skills → skills-archived}/condensing-instructions/SKILL.md +0 -0
  368. /package/.agents/{skills → skills-archived}/copilot-finding-triage/reference/tier-rubric.md +0 -0
  369. /package/.agents/{skills → skills-archived}/copilot-finding-triage/scripts/conftest.py +0 -0
  370. /package/.agents/{skills → skills-archived}/copilot-finding-triage/scripts/copilot_finding_triage_constants/__init__.py +0 -0
  371. /package/.agents/{skills → skills-archived}/copilot-finding-triage/scripts/copilot_finding_triage_constants/config/__init__.py +0 -0
  372. /package/.agents/{skills → skills-archived}/copilot-finding-triage/scripts/copilot_finding_triage_constants/config/notify_ntfy_constants.py +0 -0
  373. /package/.agents/{skills → skills-archived}/copilot-finding-triage/scripts/notify_ntfy.py +0 -0
  374. /package/.agents/{skills → skills-archived}/copilot-finding-triage/scripts/test_notify_ntfy.py +0 -0
  375. /package/.agents/{skills → skills-archived}/copilot-finding-triage/templates/notification.md +0 -0
  376. /package/.agents/{skills → skills-archived}/copilot-review/.claude/CLAUDE.md +0 -0
  377. /package/.agents/{skills → skills-archived}/copilot-review/AGENTS.md +0 -0
  378. /package/.agents/{skills → skills-archived}/copilot-review/SKILL.md +0 -0
  379. /package/.agents/{skills → skills-archived}/copilot-review/templates/subagent-prompt.md +0 -0
  380. /package/.agents/{skills → skills-archived}/descriptions/SKILL.md +0 -0
  381. /package/.agents/{skills → skills-archived}/emergencies/SKILL.md +0 -0
  382. /package/.agents/{skills → skills-archived}/grokify/SKILL.md +0 -0
  383. /package/.agents/{skills → skills-archived}/grokify/capability-claims.test.mjs +0 -0
  384. /package/.agents/{skills → skills-archived}/grokify/templates/handoff-template.md +0 -0
  385. /package/.agents/{skills → skills-archived}/plan-to-pr/SKILL.md +0 -0
  386. /package/.agents/{skills → skills-archived}/plan-to-pr/reference/final-validation-tasks.md +0 -0
  387. /package/.agents/{skills → skills-archived}/plan-to-pr/reference/model-routing.md +0 -0
  388. /package/.agents/{skills → skills-archived}/plan-to-pr/reference/packet-contract.md +0 -0
  389. /package/.agents/{skills → skills-archived}/plan-to-pr/reference/packet-schema.json +0 -0
  390. /package/.agents/{skills → skills-archived}/plan-to-pr/reference/process-inventory.md +0 -0
  391. /package/.agents/{skills → skills-archived}/plan-to-pr/reference/review-loop.md +0 -0
  392. /package/.agents/{skills → skills-archived}/plan-to-pr/reference/run-record.schema.json +0 -0
  393. /package/.agents/{skills → skills-archived}/plan-to-pr/reference/self-audit-tasks.md +0 -0
  394. /package/.agents/{skills → skills-archived}/plan-to-pr/reference/task-seeds.md +0 -0
  395. /package/.agents/{skills → skills-archived}/plan-to-pr/reference/task-ticket.md +0 -0
  396. /package/.agents/{skills → skills-archived}/plan-to-pr/scripts/config/__init__.py +0 -0
  397. /package/.agents/{skills → skills-archived}/plan-to-pr/scripts/config/constants.py +0 -0
  398. /package/.agents/{skills → skills-archived}/plan-to-pr/scripts/create_packet.py +0 -0
  399. /package/.agents/{skills → skills-archived}/plan-to-pr/scripts/load_skill_constants.py +0 -0
  400. /package/.agents/{skills → skills-archived}/plan-to-pr/scripts/test_create_packet.py +0 -0
  401. /package/.agents/{skills → skills-archived}/plan-to-pr/scripts/test_validate_packet.py +0 -0
  402. /package/.agents/{skills → skills-archived}/plan-to-pr/scripts/test_validate_protocol.py +0 -0
  403. /package/.agents/{skills → skills-archived}/plan-to-pr/scripts/test_validate_run.py +0 -0
  404. /package/.agents/{skills → skills-archived}/plan-to-pr/scripts/validate_packet.py +0 -0
  405. /package/.agents/{skills → skills-archived}/plan-to-pr/scripts/validate_protocol.py +0 -0
  406. /package/.agents/{skills → skills-archived}/plan-to-pr/scripts/validate_run.py +0 -0
  407. /package/.agents/{skills → skills-archived}/plan-to-pr/test_skill_contract.py +0 -0
  408. /package/.agents/{skills → skills-archived}/plan-to-pr/test_task_ticket_contract.py +0 -0
  409. /package/.agents/{skills → skills-archived}/pr-converge/.claude/CLAUDE.md +0 -0
  410. /package/.agents/{skills → skills-archived}/pr-converge/AGENTS.md +0 -0
  411. /package/.agents/{skills → skills-archived}/pr-converge/pr_converge_skill_constants/.claude/CLAUDE.md +0 -0
  412. /package/.agents/{skills → skills-archived}/pr-converge/pr_converge_skill_constants/__init__.py +0 -0
  413. /package/.agents/{skills → skills-archived}/pr-converge/reference/.claude/CLAUDE.md +0 -0
  414. /package/.agents/{skills → skills-archived}/pr-converge/reference/AGENTS.md +0 -0
  415. /package/.agents/{skills → skills-archived}/pr-converge/reference/convergence-gates.md +0 -0
  416. /package/.agents/{skills → skills-archived}/pr-converge/reference/examples.md +0 -0
  417. /package/.agents/{skills → skills-archived}/pr-converge/reference/fix-protocol.md +0 -0
  418. /package/.agents/{skills → skills-archived}/pr-converge/reference/ground-rules.md +0 -0
  419. /package/.agents/{skills → skills-archived}/pr-converge/reference/obstacles/.claude/CLAUDE.md +0 -0
  420. /package/.agents/{skills → skills-archived}/pr-converge/reference/obstacles/AGENTS.md +0 -0
  421. /package/.agents/{skills → skills-archived}/pr-converge/reference/obstacles/fix-post-replies.md +0 -0
  422. /package/.agents/{skills → skills-archived}/pr-converge/reference/obstacles/fix-publish-summary.md +0 -0
  423. /package/.agents/{skills → skills-archived}/pr-converge/reference/obstacles/fix-push.md +0 -0
  424. /package/.agents/{skills → skills-archived}/pr-converge/reference/obstacles/fix-read-filelines.md +0 -0
  425. /package/.agents/{skills → skills-archived}/pr-converge/reference/obstacles/fix-reset-state.md +0 -0
  426. /package/.agents/{skills → skills-archived}/pr-converge/reference/obstacles/fix-resolve-threads.md +0 -0
  427. /package/.agents/{skills → skills-archived}/pr-converge/reference/obstacles/fix-spawn-clean-coder.md +0 -0
  428. /package/.agents/{skills → skills-archived}/pr-converge/reference/obstacles/fix-stage-commit.md +0 -0
  429. /package/.agents/{skills → skills-archived}/pr-converge/reference/obstacles/fix-trigger-bugbot.md +0 -0
  430. /package/.agents/{skills → skills-archived}/pr-converge/reference/obstacles/fix-write-test.md +0 -0
  431. /package/.agents/{skills → skills-archived}/pr-converge/reference/progress-checklist.md +0 -0
  432. /package/.agents/{skills → skills-archived}/pr-converge/reference/state-schema.md +0 -0
  433. /package/.agents/{skills → skills-archived}/pr-converge/reference/stop-conditions.md +0 -0
  434. /package/.agents/{skills → skills-archived}/pr-converge/scripts/.claude/CLAUDE.md +0 -0
  435. /package/.agents/{skills → skills-archived}/pr-converge/scripts/AGENTS.md +0 -0
  436. /package/.agents/{skills → skills-archived}/pr-converge/scripts/README.md +0 -0
  437. /package/.agents/{skills → skills-archived}/pr-converge/scripts/_pr_converge_path_setup.py +0 -0
  438. /package/.agents/{skills → skills-archived}/pr-converge/scripts/caller-window-pid.ps1 +0 -0
  439. /package/.agents/{skills → skills-archived}/pr-converge/scripts/check_bugbot_ci.py +0 -0
  440. /package/.agents/{skills → skills-archived}/pr-converge/scripts/check_convergence.py +0 -0
  441. /package/.agents/{skills → skills-archived}/pr-converge/scripts/check_convergence_availability.py +0 -0
  442. /package/.agents/{skills → skills-archived}/pr-converge/scripts/check_convergence_gates.py +0 -0
  443. /package/.agents/{skills → skills-archived}/pr-converge/scripts/check_convergence_thread_gates.py +0 -0
  444. /package/.agents/{skills → skills-archived}/pr-converge/scripts/check_pending_reviews.py +0 -0
  445. /package/.agents/{skills → skills-archived}/pr-converge/scripts/conftest.py +0 -0
  446. /package/.agents/{skills → skills-archived}/pr-converge/scripts/cursor-agents-continue-caller.cmd +0 -0
  447. /package/.agents/{skills → skills-archived}/pr-converge/scripts/cursor-agents-continue-stop-others.ps1 +0 -0
  448. /package/.agents/{skills → skills-archived}/pr-converge/scripts/cursor-agents-continue.ahk +0 -0
  449. /package/.agents/{skills → skills-archived}/pr-converge/scripts/cursor-agents-continue.cmd +0 -0
  450. /package/.agents/{skills → skills-archived}/pr-converge/scripts/fetch_copilot_reviews.py +0 -0
  451. /package/.agents/{skills → skills-archived}/pr-converge/scripts/post_fix_reply.py +0 -0
  452. /package/.agents/{skills → skills-archived}/pr-converge/scripts/pr_converge_scripts_constants/.claude/CLAUDE.md +0 -0
  453. /package/.agents/{skills → skills-archived}/pr-converge/scripts/pr_converge_scripts_constants/AGENTS.md +0 -0
  454. /package/.agents/{skills → skills-archived}/pr-converge/scripts/pr_converge_scripts_constants/__init__.py +0 -0
  455. /package/.agents/{skills → skills-archived}/pr-converge/scripts/pr_converge_scripts_constants/convergence_gate_constants.py +0 -0
  456. /package/.agents/{skills → skills-archived}/pr-converge/scripts/pr_converge_scripts_constants/pr_converge_constants.py +0 -0
  457. /package/.agents/{skills → skills-archived}/pr-converge/scripts/pr_converge_scripts_constants/reflow_skill_md_constants.py +0 -0
  458. /package/.agents/{skills → skills-archived}/pr-converge/scripts/test__pr_converge_path_setup.py +0 -0
  459. /package/.agents/{skills → skills-archived}/pr-converge/scripts/test_check_bugbot_ci.py +0 -0
  460. /package/.agents/{skills → skills-archived}/pr-converge/scripts/test_check_convergence.py +0 -0
  461. /package/.agents/{skills → skills-archived}/pr-converge/scripts/test_check_convergence_availability.py +0 -0
  462. /package/.agents/{skills → skills-archived}/pr-converge/scripts/test_check_convergence_codex.py +0 -0
  463. /package/.agents/{skills → skills-archived}/pr-converge/scripts/test_check_convergence_contract.py +0 -0
  464. /package/.agents/{skills → skills-archived}/pr-converge/scripts/test_check_convergence_fixture.py +0 -0
  465. /package/.agents/{skills → skills-archived}/pr-converge/scripts/test_check_convergence_gates.py +0 -0
  466. /package/.agents/{skills → skills-archived}/pr-converge/scripts/test_check_convergence_thread_gates.py +0 -0
  467. /package/.agents/{skills → skills-archived}/pr-converge/scripts/test_cursor_agents_continue.py +0 -0
  468. /package/.agents/{skills → skills-archived}/pr-converge/scripts/test_reflow_skill_md.py +0 -0
  469. /package/.agents/{skills → skills-archived}/pr-converge/test_step5_host_branch.py +0 -0
  470. /package/.agents/{skills → skills-archived}/pr-converge/workflows/.claude/CLAUDE.md +0 -0
  471. /package/.agents/{skills → skills-archived}/pr-converge/workflows/AGENTS.md +0 -0
  472. /package/.agents/{skills → skills-archived}/pr-fix-protocol/SKILL.md +0 -0
  473. /package/.agents/{skills → skills-archived}/pr-loop-cloud-transport/SKILL.md +0 -0
  474. /package/.agents/{skills → skills-archived}/pr-loop-cloud-transport/reference/identity-and-hooks.md +0 -0
  475. /package/.agents/{skills → skills-archived}/pr-loop-cloud-transport/reference/substitution-matrix.md +0 -0
  476. /package/.agents/{skills → skills-archived}/pr-loop-lifecycle/SKILL.md +0 -0
  477. /package/.agents/{skills → skills-archived}/pr-loop-lifecycle/reference/teardown-publish-permissions.md +0 -0
  478. /package/.agents/{skills → skills-archived}/recall/.claude/CLAUDE.md +0 -0
  479. /package/.agents/{skills → skills-archived}/recall/AGENTS.md +0 -0
  480. /package/.agents/{skills → skills-archived}/recall/SKILL.md +0 -0
  481. /package/.agents/{skills → skills-archived}/release-notes-html/SKILL.md +0 -0
  482. /package/.agents/{skills → skills-archived}/remember/.claude/CLAUDE.md +0 -0
  483. /package/.agents/{skills → skills-archived}/remember/AGENTS.md +0 -0
  484. /package/.agents/{skills → skills-archived}/remember/SKILL.md +0 -0
  485. /package/.agents/{skills → skills-archived}/reviewer-gates/SKILL.md +0 -0
  486. /package/.agents/{skills → skills-archived}/reviews/SKILL.md +0 -0
  487. /package/.agents/{skills → skills-archived}/show/SKILL.md +0 -0
  488. /package/.agents/{skills → skills-archived}/show/references/accessibility.md +0 -0
  489. /package/.agents/{skills → skills-archived}/show/references/art.md +0 -0
  490. /package/.agents/{skills → skills-archived}/show/references/charts.md +0 -0
  491. /package/.agents/{skills → skills-archived}/show/references/core-design.md +0 -0
  492. /package/.agents/{skills → skills-archived}/show/references/erds.md +0 -0
  493. /package/.agents/{skills → skills-archived}/show/references/flowcharts.md +0 -0
  494. /package/.agents/{skills → skills-archived}/show/references/host-and-html.md +0 -0
  495. /package/.agents/{skills → skills-archived}/show/references/illustrative-diagrams.md +0 -0
  496. /package/.agents/{skills → skills-archived}/show/references/interaction.md +0 -0
  497. /package/.agents/{skills → skills-archived}/show/references/mockups.md +0 -0
  498. /package/.agents/{skills → skills-archived}/show/references/quality-gates.md +0 -0
  499. /package/.agents/{skills → skills-archived}/show/references/structural-diagrams.md +0 -0
  500. /package/.agents/{skills → skills-archived}/show/references/subject-inventory.md +0 -0
  501. /package/.agents/{skills → skills-archived}/show/references/svg-contract.md +0 -0
  502. /package/.agents/{skills → skills-archived}/show/routing.yaml +0 -0
  503. /package/.agents/{skills → skills-archived}/show/samples/pr1262-v2.svg +0 -0
  504. /package/.agents/{skills → skills-archived}/show/scripts/README.md +0 -0
  505. /package/.agents/{skills → skills-archived}/show/scripts/validate-artifact.py +0 -0
  506. /package/.agents/{skills → skills-archived}/show/scripts/validate-package.py +0 -0
  507. /package/.agents/{skills → skills-archived}/show/templates/html-widget.html +0 -0
  508. /package/.agents/{skills → skills-archived}/show/templates/svg-base.svg +0 -0
  509. /package/.agents/{skills → skills-archived}/show/tests/fixtures/css-var.svg +0 -0
  510. /package/.agents/{skills → skills-archived}/show/tests/fixtures/dead-ref.svg +0 -0
  511. /package/.agents/{skills → skills-archived}/show/tests/fixtures/filled-glyph.svg +0 -0
  512. /package/.agents/{skills → skills-archived}/show/tests/fixtures/inherited-fill.svg +0 -0
  513. /package/.agents/{skills → skills-archived}/show/tests/fixtures/invalid.svg +0 -0
  514. /package/.agents/{skills → skills-archived}/show/tests/fixtures/large-canvas.svg +0 -0
  515. /package/.agents/{skills → skills-archived}/show/tests/fixtures/unfilled-connector.svg +0 -0
  516. /package/.agents/{skills → skills-archived}/show/tests/fixtures/valid.html +0 -0
  517. /package/.agents/{skills → skills-archived}/show/tests/test_validate-artifact.py +0 -0
  518. /package/.agents/{skills → skills-archived}/show/tests/test_validators.py +0 -0
  519. /package/.agents/{skills → skills-archived}/show/workflows/create-visual.md +0 -0
  520. /package/.agents/{skills → skills-archived}/show/workflows/review-visual.md +0 -0
  521. /package/.agents/{skills → skills-archived}/split-pr/SKILL.md +0 -0
  522. /package/.agents/{skills → skills-archived}/split-pr/reference/path-layers.md +0 -0
  523. /package/.agents/{skills → skills-archived}/split-pr/reference/split-further-loop.md +0 -0
  524. /package/.agents/{skills → skills-archived}/split-pr/reference/splitting-principles.md +0 -0
  525. /package/.agents/{skills → skills-archived}/split-pr/scripts/analyze_pr.py +0 -0
  526. /package/.agents/{skills → skills-archived}/split-pr/scripts/categorize_files.py +0 -0
  527. /package/.agents/{skills → skills-archived}/split-pr/scripts/config/__init__.py +0 -0
  528. /package/.agents/{skills → skills-archived}/split-pr/scripts/config/dependency_constants.py +0 -0
  529. /package/.agents/{skills → skills-archived}/split-pr/scripts/config/git_operations_constants.py +0 -0
  530. /package/.agents/{skills → skills-archived}/split-pr/scripts/config/packing_constants.py +0 -0
  531. /package/.agents/{skills → skills-archived}/split-pr/scripts/config/plan_constants.py +0 -0
  532. /package/.agents/{skills → skills-archived}/split-pr/scripts/config/split_pr_constants.py +0 -0
  533. /package/.agents/{skills → skills-archived}/split-pr/scripts/execute_split_slices.py +0 -0
  534. /package/.agents/{skills → skills-archived}/split-pr/scripts/pack_files_into_slices.py +0 -0
  535. /package/.agents/{skills → skills-archived}/split-pr/scripts/split_pr_dependency_graph.py +0 -0
  536. /package/.agents/{skills → skills-archived}/split-pr/scripts/split_pr_git_operations.py +0 -0
  537. /package/.agents/{skills → skills-archived}/split-pr/scripts/split_pr_layer_order.py +0 -0
  538. /package/.agents/{skills → skills-archived}/split-pr/scripts/split_pr_paginate.py +0 -0
  539. /package/.agents/{skills → skills-archived}/split-pr/scripts/split_pr_process_runner.py +0 -0
  540. /package/.agents/{skills → skills-archived}/split-pr/scripts/split_pr_script_types.py +0 -0
  541. /package/.agents/{skills → skills-archived}/split-pr/scripts/split_pr_title.py +0 -0
  542. /package/.agents/{skills → skills-archived}/split-pr/scripts/test_analyze_pr.py +0 -0
  543. /package/.agents/{skills → skills-archived}/split-pr/scripts/test_categorize_files.py +0 -0
  544. /package/.agents/{skills → skills-archived}/split-pr/scripts/test_categorize_files_packing.py +0 -0
  545. /package/.agents/{skills → skills-archived}/split-pr/scripts/test_execute_split_slices.py +0 -0
  546. /package/.agents/{skills → skills-archived}/split-pr/scripts/test_split_pr_dependency_graph.py +0 -0
  547. /package/.agents/{skills → skills-archived}/split-pr/scripts/test_split_pr_git_operations.py +0 -0
  548. /package/.agents/{skills → skills-archived}/split-pr/scripts/test_split_pr_layer_order.py +0 -0
  549. /package/.agents/{skills → skills-archived}/split-pr/scripts/test_split_pr_paginate.py +0 -0
  550. /package/.agents/{skills → skills-archived}/split-pr/scripts/test_split_pr_script_types.py +0 -0
  551. /package/.agents/{skills → skills-archived}/split-pr/scripts/test_split_pr_title.py +0 -0
  552. /package/.agents/{skills → skills-archived}/split-pr/scripts/test_verify_dependency_graph.py +0 -0
  553. /package/.agents/{skills → skills-archived}/split-pr/scripts/test_verify_plan.py +0 -0
  554. /package/.agents/{skills → skills-archived}/split-pr/scripts/test_verify_plan_contract.py +0 -0
  555. /package/.agents/{skills → skills-archived}/split-pr/scripts/test_verify_plan_path_normalization.py +0 -0
  556. /package/.agents/{skills → skills-archived}/split-pr/scripts/verify_dependency_graph.py +0 -0
  557. /package/.agents/{skills → skills-archived}/split-pr/scripts/verify_plan.py +0 -0
@@ -0,0 +1,609 @@
1
+ """Headless wrapper that runs one Codex review and captures its outputs.
2
+
3
+ ::
4
+
5
+ review_outcome = run_codex_review(
6
+ repository_directory=Path("/path/to/repo"),
7
+ run_state_directory=Path("/path/to/run_state"),
8
+ is_uncommitted=True,
9
+ )
10
+ review_outcome.outcome_class # "completed" or "codex_down"
11
+ review_outcome.jsonl_path # path to captured JSONL stream
12
+ review_outcome.agent_message # final agent_message text
13
+ """
14
+
15
+ from __future__ import annotations
16
+
17
+ import json
18
+ import os
19
+ import re
20
+ import shutil
21
+ import subprocess
22
+ import sys
23
+ from dataclasses import dataclass
24
+ from pathlib import Path
25
+
26
+ _here = Path(__file__).resolve()
27
+ _skills_home_directory = _here.parents[3]
28
+ _package_or_user_home = (
29
+ _skills_home_directory.parent
30
+ if _skills_home_directory.name == ".agents"
31
+ else _skills_home_directory
32
+ )
33
+ _shared_under_package = _package_or_user_home / "_shared" / "process-tree" / "scripts"
34
+ _shared_process_tree_scripts_directory = (
35
+ _shared_under_package
36
+ if _shared_under_package.is_dir()
37
+ else _package_or_user_home / ".claude" / "_shared" / "process-tree" / "scripts"
38
+ )
39
+ if str(_shared_process_tree_scripts_directory) not in sys.path:
40
+ sys.path.insert(0, str(_shared_process_tree_scripts_directory))
41
+
42
+ from process_tree_kill import ( # noqa: E402
43
+ should_start_new_session,
44
+ terminate_process_tree,
45
+ )
46
+
47
+ from codex_review_scripts_constants.codex_usage_probe_constants import ( # noqa: E402
48
+ ALL_WINDOWS_SCRIPT_SUFFIXES,
49
+ WINDOWS_COMMAND_SHELL,
50
+ WINDOWS_COMMAND_SHELL_RUN_FLAG,
51
+ WINDOWS_OS_NAME,
52
+ )
53
+ from codex_review_scripts_constants.run_constants import ( # noqa: E402
54
+ ALL_SHAPE_PROBE_REQUIRED_FLAGS,
55
+ BASE_TARGET_FLAG,
56
+ CAPTURE_STREAMS_KEYWORD,
57
+ CHECK_KEYWORD,
58
+ CODEX_BINARY_NAME,
59
+ CODEX_MODEL_PIN,
60
+ COMMIT_TARGET_FLAG,
61
+ CUSTOM_INSTRUCTIONS_PROMPT,
62
+ CWD_KEYWORD,
63
+ DEFAULT_TIMEOUT_SECONDS,
64
+ ENCODING_KEYWORD,
65
+ ENVIRONMENT_KEYWORD,
66
+ EXEC_SUBCOMMAND,
67
+ HELP_FLAG,
68
+ JSON_FLAG,
69
+ JSONL_AGENT_MESSAGE_TEXT_KEY,
70
+ JSONL_AGENT_MESSAGE_TYPE,
71
+ JSONL_CAPTURE_FILENAME,
72
+ JSONL_CAPTURE_NEWLINE,
73
+ JSONL_ENTRY_COMPLETED_TYPE,
74
+ JSONL_ENTRY_KEY,
75
+ JSONL_EVENT_TYPE_KEY,
76
+ MISSING_BINARY_EXIT_CODE,
77
+ MODEL_FLAG,
78
+ OUTCOME_CLASS_CODEX_DOWN,
79
+ OUTCOME_CLASS_COMPLETED,
80
+ PROCESS_TREE_KILL_TIMEOUT_SECONDS,
81
+ REVIEW_SUBCOMMAND,
82
+ SHAPE_FLAG_TOKEN_TAIL_PATTERN,
83
+ SUBPROCESS_DECODE_EXIT_CODE,
84
+ TEXT_MODE_KEYWORD,
85
+ TIMEOUT_EXIT_CODE,
86
+ TIMEOUT_KEYWORD,
87
+ UNCOMMITTED_TARGET_FLAG,
88
+ UTF8_ENCODING,
89
+ VERSION_FLAG,
90
+ VERSION_PROBE_PATTERN,
91
+ )
92
+
93
+
94
+ def _open_codex_popen(
95
+ all_arguments: list[str],
96
+ all_keyword_arguments: dict[str, object],
97
+ ) -> subprocess.Popen[str]:
98
+ """Start the codex process in its own session so its tree can be killed."""
99
+ should_capture = bool(all_keyword_arguments.get(CAPTURE_STREAMS_KEYWORD, False))
100
+ stream_target = subprocess.PIPE if should_capture else None
101
+ working_directory = all_keyword_arguments.get(CWD_KEYWORD)
102
+ stream_encoding = all_keyword_arguments.get(ENCODING_KEYWORD)
103
+ process_environment = all_keyword_arguments.get(ENVIRONMENT_KEYWORD)
104
+ return subprocess.Popen(
105
+ all_arguments,
106
+ cwd=working_directory if isinstance(working_directory, str) else None,
107
+ stdout=stream_target,
108
+ stderr=stream_target,
109
+ text=bool(all_keyword_arguments.get(TEXT_MODE_KEYWORD, False)),
110
+ encoding=stream_encoding if isinstance(stream_encoding, str) else None,
111
+ env=process_environment if isinstance(process_environment, dict) else None,
112
+ start_new_session=should_start_new_session(),
113
+ )
114
+
115
+
116
+ def _drain_process_after_tree_kill(
117
+ review_process: subprocess.Popen[str],
118
+ ) -> None:
119
+ """Join pipe reader threads after a tree kill; never block unbounded.
120
+
121
+ ::
122
+
123
+ kill tree -> communicate(grace) ok: pipe EOF, threads join
124
+ kill incomplete, no drain flag: Popen.__exit__ wait() hangs
125
+
126
+ Windows needs a post-kill ``communicate()`` so timed-out reader threads
127
+ join. Every platform needs a timed join so an incomplete tree kill cannot
128
+ leave ``Popen.__exit__`` waiting forever.
129
+ """
130
+ try:
131
+ review_process.communicate(timeout=PROCESS_TREE_KILL_TIMEOUT_SECONDS)
132
+ except subprocess.TimeoutExpired:
133
+ try:
134
+ review_process.kill()
135
+ except ProcessLookupError:
136
+ pass
137
+ try:
138
+ review_process.communicate(timeout=PROCESS_TREE_KILL_TIMEOUT_SECONDS)
139
+ except subprocess.TimeoutExpired:
140
+ return
141
+
142
+
143
+ def _communicate_with_tree_kill_on_timeout(
144
+ review_process: subprocess.Popen[str],
145
+ timeout_seconds: float | None,
146
+ ) -> tuple[str, str]:
147
+ """Drain the process; on timeout kill its whole tree, drain again, re-raise.
148
+
149
+ ::
150
+
151
+ codex -> codex.exe -> code-mode-host grandchildren hold the stdout pipe
152
+ kill only the parent on timeout drain waits for EOF, hangs
153
+ ok: kill the whole tree, then drain pipe reaches EOF, timeout raised
154
+
155
+ Killing only the direct child on a timeout leaves grandchildren holding the
156
+ capture pipe open, so the drain read never reaches end-of-file and blocks
157
+ forever. Killing the entire tree and then draining with a grace timeout lets
158
+ the pipe reach end-of-file without an unbounded wait.
159
+ """
160
+ try:
161
+ return review_process.communicate(timeout=timeout_seconds)
162
+ except subprocess.TimeoutExpired:
163
+ terminate_process_tree(review_process)
164
+ _drain_process_after_tree_kill(review_process)
165
+ raise
166
+
167
+
168
+ def _completed_from_streams(
169
+ all_arguments: list[str],
170
+ review_return_code: int,
171
+ captured_stdout: str,
172
+ captured_stderr: str,
173
+ should_check: bool,
174
+ ) -> subprocess.CompletedProcess[str]:
175
+ """Wrap captured streams in a CompletedProcess, honoring the check flag."""
176
+ completed_process = subprocess.CompletedProcess(
177
+ all_arguments, review_return_code, captured_stdout, captured_stderr
178
+ )
179
+ if should_check:
180
+ completed_process.check_returncode()
181
+ return completed_process
182
+
183
+
184
+ def _optional_timeout_seconds(requested_timeout: object) -> float | None:
185
+ """Return a numeric timeout as float, or None when it is not a number."""
186
+ if isinstance(requested_timeout, (int, float)):
187
+ return float(requested_timeout)
188
+ return None
189
+
190
+
191
+ def _close_popen_streams(review_process: subprocess.Popen[str]) -> None:
192
+ """Close the child's stdio pipes without waiting for process exit."""
193
+ for each_stream in (review_process.stdout, review_process.stderr, review_process.stdin):
194
+ if each_stream is None:
195
+ continue
196
+ try:
197
+ each_stream.close()
198
+ except OSError:
199
+ pass
200
+
201
+
202
+ def _reap_process_with_grace(review_process: subprocess.Popen[str]) -> None:
203
+ """Kill and wait with a grace timeout so cleanup never blocks unbounded.
204
+
205
+ ::
206
+
207
+ poll None after incomplete drain ok: kill + wait(grace), then return
208
+ Popen.__exit__ wait() no timeout flag: hang forever on surviving child
209
+
210
+ ``Popen`` as a context manager always ends in ``wait()`` with no timeout.
211
+ After a timed-out drain that still leaves the child alive, that wait would
212
+ hang. This path kills once more and bounds the reap.
213
+ """
214
+ if review_process.poll() is not None:
215
+ return
216
+ try:
217
+ review_process.kill()
218
+ except ProcessLookupError:
219
+ return
220
+ try:
221
+ review_process.wait(timeout=PROCESS_TREE_KILL_TIMEOUT_SECONDS)
222
+ except subprocess.TimeoutExpired:
223
+ return
224
+
225
+
226
+ def _run_codex_process(
227
+ all_arguments: list[str],
228
+ **all_keyword_arguments: object,
229
+ ) -> subprocess.CompletedProcess[str]:
230
+ """Run a codex process, killing its whole child tree on a timeout.
231
+
232
+ Mirrors the ``subprocess.run`` keyword arguments the review wrapper passes:
233
+ ``cwd``, ``capture_output``, ``text``, ``encoding``, ``check``, ``timeout``,
234
+ and ``env``. Avoids ``Popen`` as a context manager so a surviving child after
235
+ a timed-out drain cannot hang on an unbounded ``wait()``.
236
+ """
237
+ timeout_seconds = _optional_timeout_seconds(all_keyword_arguments.get(TIMEOUT_KEYWORD))
238
+ should_check = bool(all_keyword_arguments.get(CHECK_KEYWORD, False))
239
+ review_process = _open_codex_popen(all_arguments, all_keyword_arguments)
240
+ try:
241
+ captured_stdout, captured_stderr = _communicate_with_tree_kill_on_timeout(
242
+ review_process, timeout_seconds
243
+ )
244
+ review_return_code = review_process.returncode
245
+ finally:
246
+ _close_popen_streams(review_process)
247
+ _reap_process_with_grace(review_process)
248
+ return _completed_from_streams(
249
+ all_arguments,
250
+ review_return_code,
251
+ captured_stdout,
252
+ captured_stderr,
253
+ should_check,
254
+ )
255
+
256
+
257
+ codex_subprocess_runner = _run_codex_process
258
+
259
+
260
+ @dataclass(frozen=True)
261
+ class CodexReviewOutcome:
262
+ """Captured result of one probe-plus-review attempt.
263
+
264
+ ::
265
+
266
+ CodexReviewOutcome(
267
+ outcome_class="completed",
268
+ exit_code=0,
269
+ binary_version="0.144.3",
270
+ jsonl_path=Path("run_state/codex-review.jsonl"),
271
+ agent_message="No issues found.",
272
+ )
273
+
274
+ Attributes:
275
+ outcome_class: Capture-boundary class ``completed`` or ``codex_down``.
276
+ Callers treat this field as the success signal; ``exit_code`` alone
277
+ is not enough (a shape probe can exit 0 while flags are missing).
278
+ exit_code: Last process exit code, or a sentinel when none ran.
279
+ binary_version: Parsed ``codex --version`` string, or empty.
280
+ jsonl_path: Captured JSONL path, or None when review did not run.
281
+ agent_message: Last JSONL ``agent_message`` text when present; on a
282
+ non-zero review exit, falls back to stderr text when JSONL has no
283
+ agent message (config and argument errors land on stderr).
284
+ """
285
+
286
+ outcome_class: str
287
+ exit_code: int
288
+ binary_version: str
289
+ jsonl_path: Path | None
290
+ agent_message: str
291
+
292
+
293
+ def _down(*, exit_code: int, binary_version: str) -> CodexReviewOutcome:
294
+ return CodexReviewOutcome(
295
+ outcome_class=OUTCOME_CLASS_CODEX_DOWN,
296
+ exit_code=exit_code,
297
+ binary_version=binary_version,
298
+ jsonl_path=None,
299
+ agent_message="",
300
+ )
301
+
302
+
303
+ def _resolve_codex_command_prefix() -> list[str]:
304
+ """Resolve the codex launch prefix, wrapping a Windows ``.cmd``/``.bat`` shim.
305
+
306
+ ::
307
+
308
+ POSIX codex on PATH -> ["/usr/local/bin/codex"]
309
+ Windows codex.cmd -> ["cmd", "/c", "C:\\...\\codex.cmd"]
310
+ codex not on PATH -> ["codex"] (downstream FileNotFoundError)
311
+
312
+ ``CreateProcess`` resolves a bare name only against ``.exe``, so a bare
313
+ ``codex`` never finds the npm shim; the ``cmd /c`` wrap runs it.
314
+ """
315
+ codex_path = shutil.which(CODEX_BINARY_NAME)
316
+ if codex_path is None:
317
+ return [CODEX_BINARY_NAME]
318
+ if os.name == WINDOWS_OS_NAME and codex_path.lower().endswith(
319
+ ALL_WINDOWS_SCRIPT_SUFFIXES
320
+ ):
321
+ return [WINDOWS_COMMAND_SHELL, WINDOWS_COMMAND_SHELL_RUN_FLAG, codex_path]
322
+ return [codex_path]
323
+
324
+
325
+ def _run_command(
326
+ all_arguments: list[str],
327
+ *,
328
+ working_directory: Path | None,
329
+ timeout_seconds: int,
330
+ ) -> subprocess.CompletedProcess[str]:
331
+ return codex_subprocess_runner(
332
+ all_arguments,
333
+ cwd=str(working_directory) if working_directory is not None else None,
334
+ capture_output=True,
335
+ text=True,
336
+ encoding=UTF8_ENCODING,
337
+ check=False,
338
+ timeout=timeout_seconds,
339
+ env=dict(os.environ),
340
+ )
341
+
342
+
343
+ def _safe_run(
344
+ all_arguments: list[str],
345
+ *,
346
+ working_directory: Path | None,
347
+ timeout_seconds: int,
348
+ ) -> subprocess.CompletedProcess[str] | int:
349
+ try:
350
+ return _run_command(
351
+ all_arguments,
352
+ working_directory=working_directory,
353
+ timeout_seconds=timeout_seconds,
354
+ )
355
+ except FileNotFoundError:
356
+ if working_directory is not None and not working_directory.is_dir():
357
+ raise
358
+ return MISSING_BINARY_EXIT_CODE
359
+ except subprocess.TimeoutExpired:
360
+ return TIMEOUT_EXIT_CODE
361
+ except UnicodeDecodeError:
362
+ return SUBPROCESS_DECODE_EXIT_CODE
363
+
364
+
365
+ def _parse_binary_version(version_stdout: str) -> str:
366
+ version_match = re.search(VERSION_PROBE_PATTERN, version_stdout)
367
+ if version_match is None:
368
+ return version_stdout.strip()
369
+ return version_match.group(1)
370
+
371
+
372
+ def _probe_binary_version(timeout_seconds: int) -> tuple[str, int | None]:
373
+ completion_or_exit = _safe_run(
374
+ [*_resolve_codex_command_prefix(), VERSION_FLAG],
375
+ working_directory=None,
376
+ timeout_seconds=timeout_seconds,
377
+ )
378
+ if isinstance(completion_or_exit, int):
379
+ return "", completion_or_exit
380
+ if completion_or_exit.returncode != 0:
381
+ return "", completion_or_exit.returncode
382
+ return _parse_binary_version(completion_or_exit.stdout), None
383
+
384
+
385
+ def _probe_review_shape(timeout_seconds: int) -> tuple[bool, int]:
386
+ completion_or_exit = _safe_run(
387
+ [*_resolve_codex_command_prefix(), EXEC_SUBCOMMAND, REVIEW_SUBCOMMAND, HELP_FLAG],
388
+ working_directory=None,
389
+ timeout_seconds=timeout_seconds,
390
+ )
391
+ if isinstance(completion_or_exit, int):
392
+ return False, completion_or_exit
393
+ if completion_or_exit.returncode != 0:
394
+ return False, completion_or_exit.returncode
395
+ help_text = f"{completion_or_exit.stdout}{completion_or_exit.stderr}"
396
+ has_required_flags = all(
397
+ _help_text_contains_flag(help_text, each_flag)
398
+ for each_flag in ALL_SHAPE_PROBE_REQUIRED_FLAGS
399
+ )
400
+ return has_required_flags, completion_or_exit.returncode
401
+
402
+
403
+ def _help_text_contains_flag(help_text: str, flag_name: str) -> bool:
404
+ flag_token_pattern = re.compile(
405
+ re.escape(flag_name) + SHAPE_FLAG_TOKEN_TAIL_PATTERN
406
+ )
407
+ return flag_token_pattern.search(help_text) is not None
408
+
409
+
410
+ def _require_single_target(
411
+ *,
412
+ base_branch: str | None,
413
+ is_uncommitted: bool,
414
+ commit_sha: str | None,
415
+ is_prompt_target: bool,
416
+ ) -> None:
417
+ selected_target_count = sum(
418
+ [
419
+ base_branch is not None,
420
+ is_uncommitted,
421
+ commit_sha is not None,
422
+ is_prompt_target,
423
+ ]
424
+ )
425
+ if selected_target_count != 1:
426
+ raise ValueError(
427
+ "exactly one of base_branch, is_uncommitted, commit_sha, "
428
+ "or is_prompt_target must be selected"
429
+ )
430
+
431
+
432
+ def _require_existing_directory(directory_path: Path, parameter_name: str) -> None:
433
+ if not directory_path.is_dir():
434
+ raise ValueError(
435
+ f"{parameter_name} is not an existing directory: {directory_path}"
436
+ )
437
+
438
+
439
+ def _build_review_arguments(
440
+ *,
441
+ base_branch: str | None,
442
+ is_uncommitted: bool,
443
+ commit_sha: str | None,
444
+ is_prompt_target: bool,
445
+ ) -> list[str]:
446
+ all_arguments = [*_resolve_codex_command_prefix(), EXEC_SUBCOMMAND]
447
+ if CODEX_MODEL_PIN:
448
+ all_arguments.extend([MODEL_FLAG, CODEX_MODEL_PIN])
449
+ all_arguments.extend([REVIEW_SUBCOMMAND, JSON_FLAG])
450
+ if is_uncommitted:
451
+ all_arguments.append(UNCOMMITTED_TARGET_FLAG)
452
+ elif base_branch is not None:
453
+ all_arguments.extend([BASE_TARGET_FLAG, base_branch])
454
+ elif commit_sha is not None:
455
+ all_arguments.extend([COMMIT_TARGET_FLAG, commit_sha])
456
+ elif is_prompt_target:
457
+ all_arguments.append(CUSTOM_INSTRUCTIONS_PROMPT)
458
+ return all_arguments
459
+
460
+
461
+ def _extract_agent_message(jsonl_text: str) -> str:
462
+ agent_message_text = ""
463
+ for each_line in jsonl_text.splitlines():
464
+ stripped_line = each_line.strip()
465
+ if not stripped_line:
466
+ continue
467
+ try:
468
+ event_payload = json.loads(stripped_line)
469
+ except json.JSONDecodeError:
470
+ continue
471
+ if not isinstance(event_payload, dict):
472
+ continue
473
+ if event_payload.get(JSONL_EVENT_TYPE_KEY) != JSONL_ENTRY_COMPLETED_TYPE:
474
+ continue
475
+ entry_payload = event_payload.get(JSONL_ENTRY_KEY)
476
+ if not isinstance(entry_payload, dict):
477
+ continue
478
+ if entry_payload.get(JSONL_EVENT_TYPE_KEY) != JSONL_AGENT_MESSAGE_TYPE:
479
+ continue
480
+ message_text = entry_payload.get(JSONL_AGENT_MESSAGE_TEXT_KEY)
481
+ if isinstance(message_text, str):
482
+ agent_message_text = message_text
483
+ return agent_message_text
484
+
485
+
486
+ def _probe_or_down(timeout_seconds: int) -> CodexReviewOutcome | str:
487
+ binary_version, version_failure_exit_code = _probe_binary_version(timeout_seconds)
488
+ if version_failure_exit_code is not None:
489
+ return _down(
490
+ exit_code=version_failure_exit_code,
491
+ binary_version=binary_version,
492
+ )
493
+ is_shape_supported, shape_exit_code = _probe_review_shape(timeout_seconds)
494
+ if not is_shape_supported:
495
+ return _down(exit_code=shape_exit_code, binary_version=binary_version)
496
+ return binary_version
497
+
498
+
499
+ def _capture_review_run(
500
+ *,
501
+ repository_directory: Path,
502
+ run_state_directory: Path,
503
+ all_review_arguments: list[str],
504
+ timeout_seconds: int,
505
+ binary_version: str,
506
+ ) -> CodexReviewOutcome:
507
+ completion_or_exit = _safe_run(
508
+ all_review_arguments,
509
+ working_directory=repository_directory,
510
+ timeout_seconds=timeout_seconds,
511
+ )
512
+ if isinstance(completion_or_exit, int):
513
+ return _down(exit_code=completion_or_exit, binary_version=binary_version)
514
+ jsonl_text = completion_or_exit.stdout or ""
515
+ stderr_text = completion_or_exit.stderr or ""
516
+ jsonl_path = run_state_directory / JSONL_CAPTURE_FILENAME
517
+ run_state_directory.mkdir(parents=True, exist_ok=True)
518
+ jsonl_path.write_text(
519
+ jsonl_text,
520
+ encoding=UTF8_ENCODING,
521
+ newline=JSONL_CAPTURE_NEWLINE,
522
+ )
523
+ review_returncode = completion_or_exit.returncode
524
+ if review_returncode != 0:
525
+ return CodexReviewOutcome(
526
+ outcome_class=OUTCOME_CLASS_CODEX_DOWN,
527
+ exit_code=review_returncode,
528
+ binary_version=binary_version,
529
+ jsonl_path=jsonl_path,
530
+ agent_message=_extract_agent_message(jsonl_text) or stderr_text,
531
+ )
532
+ return CodexReviewOutcome(
533
+ outcome_class=OUTCOME_CLASS_COMPLETED,
534
+ exit_code=review_returncode,
535
+ binary_version=binary_version,
536
+ jsonl_path=jsonl_path,
537
+ agent_message=_extract_agent_message(jsonl_text),
538
+ )
539
+
540
+
541
+ def run_codex_review(
542
+ *,
543
+ repository_directory: Path,
544
+ run_state_directory: Path,
545
+ base_branch: str | None = None,
546
+ is_uncommitted: bool = False,
547
+ commit_sha: str | None = None,
548
+ is_prompt_target: bool = False,
549
+ timeout_seconds: int | None = None,
550
+ ) -> CodexReviewOutcome:
551
+ """Run one Codex review against a single target and capture its outputs.
552
+
553
+ Capture-only boundary: returns ``completed`` or ``codex_down`` plus raw
554
+ capture fields. Skill-level classes ``down`` / ``clean`` / ``findings``
555
+ come from a later classifier that reads this outcome.
556
+
557
+ ::
558
+
559
+ ok: outcome_class == "completed" and exit_code == 0
560
+ flag: outcome_class == "codex_down" even when exit_code == 0
561
+ (shape probe ran, required flags missing)
562
+
563
+ Args:
564
+ repository_directory: Repository root used as the process cwd.
565
+ run_state_directory: Existing directory that receives the JSONL stream
566
+ file. The caller creates this directory before the call.
567
+ base_branch: Base branch for ``--base``; exclusive with other targets.
568
+ is_uncommitted: When True, uses ``--uncommitted``.
569
+ commit_sha: Commit SHA for ``--commit``; exclusive with other targets.
570
+ is_prompt_target: When True, uses the custom-instructions PROMPT target.
571
+ timeout_seconds: Per-invocation timeout; defaults from constants.
572
+
573
+ Returns:
574
+ Capture outcome (``completed`` / ``codex_down``), process exit code,
575
+ binary version, JSONL path, and agent text (JSONL agent_message, or
576
+ stderr on a failed review when JSONL has no agent message).
577
+
578
+ Raises:
579
+ ValueError: When zero targets or more than one target is selected, or
580
+ when ``repository_directory`` or ``run_state_directory`` is not an
581
+ existing directory. Both directories are checked before any Codex
582
+ process starts, so a bad path costs no review run.
583
+ """
584
+ _require_single_target(
585
+ base_branch=base_branch,
586
+ is_uncommitted=is_uncommitted,
587
+ commit_sha=commit_sha,
588
+ is_prompt_target=is_prompt_target,
589
+ )
590
+ _require_existing_directory(repository_directory, "repository_directory")
591
+ _require_existing_directory(run_state_directory, "run_state_directory")
592
+ resolved_timeout_seconds = (
593
+ DEFAULT_TIMEOUT_SECONDS if timeout_seconds is None else timeout_seconds
594
+ )
595
+ probe_outcome = _probe_or_down(resolved_timeout_seconds)
596
+ if isinstance(probe_outcome, CodexReviewOutcome):
597
+ return probe_outcome
598
+ return _capture_review_run(
599
+ repository_directory=repository_directory,
600
+ run_state_directory=run_state_directory,
601
+ all_review_arguments=_build_review_arguments(
602
+ base_branch=base_branch,
603
+ is_uncommitted=is_uncommitted,
604
+ commit_sha=commit_sha,
605
+ is_prompt_target=is_prompt_target,
606
+ ),
607
+ timeout_seconds=resolved_timeout_seconds,
608
+ binary_version=probe_outcome,
609
+ )
@@ -0,0 +1,30 @@
1
+ """Importing _pr_converge_path_setup registers the skill and shared directories.
2
+
3
+ ::
4
+
5
+ import _pr_converge_path_setup
6
+ ok: str(skill_directory) in sys.path
7
+ ok: str(shared_pr_loop_scripts_directory) in sys.path
8
+ """
9
+
10
+ from __future__ import annotations
11
+
12
+ import sys
13
+ from pathlib import Path
14
+
15
+ import _pr_converge_path_setup # noqa: F401
16
+
17
+ _SCRIPTS_DIRECTORY = Path(__file__).absolute().parent
18
+
19
+
20
+ def test_path_setup_registers_skill_and_shared_directories() -> None:
21
+ skill_directory = _SCRIPTS_DIRECTORY.parent
22
+ shared_entries = [
23
+ each_path
24
+ for each_path in sys.path
25
+ if each_path.replace("\\", "/").endswith("_shared/pr-loop/scripts")
26
+ ]
27
+ assert str(skill_directory) in sys.path
28
+ assert shared_entries
29
+ assert Path(shared_entries[0]).is_dir()
30
+ assert str(_SCRIPTS_DIRECTORY) in sys.path