@joshuafolkken/kit 1.1514.0 → 1.2114.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 (1176) hide show
  1. package/.claude/agents/investigator.md +1 -1
  2. package/.claude/agents/reviewer-verification.md +19 -0
  3. package/.claude/agents/reviewer.md +19 -0
  4. package/.claude/settings.json +5 -6
  5. package/.claude/skills/dependency-update/SKILL.md +9 -10
  6. package/.claude/skills/epic-commands/SKILL.md +26 -65
  7. package/.claude/skills/epic-commands/epic-bundle.md +3 -1
  8. package/.claude/skills/workflow-commands/SKILL.md +11 -11
  9. package/.claude/skills/workflow-commands/background-commands.md +13 -10
  10. package/.claude/skills/workflow-commands/backlogrun-child.md +12 -8
  11. package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +7 -25
  12. package/.claude/skills/workflow-commands/backlogrun-lanes.md +18 -14
  13. package/.claude/skills/workflow-commands/backlogrun-park.md +18 -24
  14. package/.claude/skills/workflow-commands/backlogrun-progress.md +4 -5
  15. package/.claude/skills/workflow-commands/backlogrun-recovery.md +6 -6
  16. package/.claude/skills/workflow-commands/backlogrun-steps.md +12 -11
  17. package/.claude/skills/workflow-commands/backlogrun.md +1 -1
  18. package/.claude/skills/workflow-commands/chain-rule.md +43 -28
  19. package/.claude/skills/workflow-commands/delegation.md +11 -10
  20. package/.claude/skills/workflow-commands/entry-sequence.md +10 -10
  21. package/.claude/skills/workflow-commands/followup.md +16 -36
  22. package/.claude/skills/workflow-commands/fullrun-steps.md +38 -47
  23. package/.claude/skills/workflow-commands/fullrun.md +3 -3
  24. package/.claude/skills/workflow-commands/halfrun.md +17 -25
  25. package/.claude/skills/workflow-commands/issue-comments.md +25 -16
  26. package/.claude/skills/workflow-commands/issue-fold-existing.md +2 -1
  27. package/.claude/skills/workflow-commands/issue-scout.md +2 -2
  28. package/.claude/skills/workflow-commands/kickoff.md +24 -23
  29. package/.claude/skills/workflow-commands/latest-gate.md +7 -12
  30. package/.claude/skills/workflow-commands/needs-human-review.md +9 -14
  31. package/.claude/skills/workflow-commands/observation-filing.md +4 -36
  32. package/.claude/skills/workflow-commands/observation-ledger.md +6 -4
  33. package/.claude/skills/workflow-commands/pre-gate-cut.md +22 -37
  34. package/.claude/skills/workflow-commands/prerequisite.md +11 -16
  35. package/.claude/skills/workflow-commands/progress-watcher.md +1 -1
  36. package/.claude/skills/workflow-commands/prrun.md +3 -7
  37. package/.claude/skills/workflow-commands/retrospective.md +2 -2
  38. package/.claude/skills/workflow-commands/split-assessment.md +15 -1
  39. package/.claude/skills/workflow-commands/working-tree-hold.md +9 -9
  40. package/.codex/hooks.json +5 -5
  41. package/.github/actions/setup-node/action.yml +9 -0
  42. package/.github/actions/setup-pnpm/action.yml +10 -17
  43. package/.github/dependabot.yml +32 -0
  44. package/.github/release.yml +0 -2
  45. package/.github/workflows/auto-tag.yml +45 -0
  46. package/.github/workflows/ci.yml +267 -17
  47. package/.github/workflows/dependabot-auto-merge.yml +63 -4
  48. package/.github/workflows/production.yml +8 -0
  49. package/.github/workflows/publish.yml +67 -46
  50. package/.github/workflows/sonar-qube.yml +1 -0
  51. package/.prettierignore +2 -0
  52. package/.vscode/settings.json +19 -0
  53. package/.vscode/tasks.json +1 -2
  54. package/CLAUDE.md +7 -18
  55. package/README.md +4 -2
  56. package/SECURITY.md +3 -3
  57. package/dist/CLAUDE.md +7 -18
  58. package/dist/commands/document-read-cli.js +883 -0
  59. package/dist/commands/{document-section-cli.js → document-section-main.js} +81 -38
  60. package/dist/commands/read-set-cli.js +1927 -0
  61. package/dist/commands/run-prep-main.js +21174 -0
  62. package/dist/commands/run-step-cli.js +27733 -0
  63. package/dist/config-merge/index.js +5 -1
  64. package/dist/hooks/audit-provision.js +39 -36
  65. package/dist/hooks/chunk-3GKE653K.js +6204 -0
  66. package/dist/hooks/chunk-45CJJOO7.js +1243 -0
  67. package/dist/hooks/chunk-5PM2JRGV.js +7780 -0
  68. package/dist/hooks/chunk-7SIUNQXK.js +3591 -0
  69. package/dist/hooks/chunk-CQD4LJE6.js +4858 -0
  70. package/dist/hooks/{chunk-723HKZO5.js → chunk-OPSRGWFU.js} +1 -1
  71. package/dist/hooks/chunk-UJ3FPMMM.js +628 -0
  72. package/dist/hooks/chunk-VVNYJWEI.js +30 -0
  73. package/dist/hooks/chunk-Z6DQJKH3.js +2806 -0
  74. package/dist/hooks/codex-hook-adapter.js +10 -22
  75. package/dist/hooks/format-edited.js +4 -6
  76. package/dist/hooks/inputs.json +460 -308
  77. package/dist/hooks/pretool-guard.js +8 -25
  78. package/dist/hooks/session-lang.js +135 -299
  79. package/dist/hooks/stop-guard.js +6496 -1799
  80. package/dist/josh.js +7412 -4228
  81. package/dist/self-sync-guard/index.js +74 -10
  82. package/dist/version/index.js +276 -407
  83. package/eslint/base.js +1 -1
  84. package/eslint/rules/comment-why-only.js +108 -0
  85. package/lefthook/base.yml +3 -1
  86. package/package.json +23 -54
  87. package/pnpm-workspace.yaml +4 -2
  88. package/prompts/coding-standards.md +2 -2
  89. package/prompts/collaboration-workflow/file-edits.md +14 -17
  90. package/prompts/collaboration-workflow/issue-citation.md +0 -4
  91. package/prompts/collaboration-workflow/issue-template.md +54 -18
  92. package/prompts/collaboration-workflow/lane-instructions.md +3 -2
  93. package/prompts/collaboration-workflow/measurement.md +44 -0
  94. package/prompts/collaboration-workflow/operating-rules.md +15 -8
  95. package/prompts/collaboration-workflow/output-bounds.md +6 -7
  96. package/prompts/collaboration-workflow/plan-comment.md +3 -42
  97. package/prompts/collaboration-workflow/principles.md +14 -0
  98. package/prompts/collaboration-workflow/report-format.md +31 -60
  99. package/prompts/collaboration-workflow/residency.md +3 -2
  100. package/prompts/collaboration-workflow/rule-delivery.md +13 -1
  101. package/prompts/collaboration-workflow/shell-body.md +6 -16
  102. package/prompts/collaboration-workflow/turn-batching.md +0 -2
  103. package/prompts/collaboration-workflow/upstream-interrupt.md +15 -5
  104. package/prompts/collaboration-workflow/wip-cap.md +4 -2
  105. package/prompts/collaboration-workflow.md +3 -7
  106. package/prompts/refactoring.md +1 -1
  107. package/prompts/review-rubric.md +9 -2
  108. package/prompts/review.md +65 -36
  109. package/prompts/testing-guide.md +9 -43
  110. package/scripts/agent/agent-argv.ts +14 -16
  111. package/scripts/agent/agent-event.ts +15 -15
  112. package/scripts/agent/agent-exit-record.ts +13 -1
  113. package/scripts/agent/agent-provider.ts +138 -0
  114. package/scripts/agent/agent-role-profile.ts +108 -156
  115. package/scripts/agent/agent-safe-text.ts +20 -5
  116. package/scripts/agent/api-auth.ts +41 -0
  117. package/scripts/agent/api-outage.ts +1 -1
  118. package/scripts/agent/api-usage-limit.ts +65 -0
  119. package/scripts/agent/claude-agent-argv.ts +19 -9
  120. package/scripts/agent/codex-agent-argv.ts +118 -22
  121. package/scripts/agent/usage-limit-reset.ts +179 -0
  122. package/scripts/auth/claude-token-output.ts +2 -2
  123. package/scripts/auto-ok/auto-ok-author.ts +53 -0
  124. package/scripts/auto-ok/auto-ok-cli.ts +25 -16
  125. package/scripts/auto-ok/auto-ok-judge-read.ts +12 -3
  126. package/scripts/auto-ok/auto-ok-judge-write.ts +46 -19
  127. package/scripts/auto-ok/auto-ok-judge.ts +13 -2
  128. package/scripts/auto-ok/auto-ok-main.ts +17 -0
  129. package/scripts/backlog/backlog-arrival.ts +14 -3
  130. package/scripts/backlog/backlog-budget-cli.ts +7 -33
  131. package/scripts/backlog/backlog-budget-main.ts +16 -0
  132. package/scripts/backlog/backlog-budget.ts +2 -3
  133. package/scripts/backlog/backlog-defect-priority.ts +5 -4
  134. package/scripts/backlog/backlog-drive-adopt.ts +67 -0
  135. package/scripts/backlog/backlog-drive-args.ts +4 -5
  136. package/scripts/backlog/backlog-drive-cli.ts +118 -28
  137. package/scripts/backlog/backlog-drive-hold.ts +162 -0
  138. package/scripts/backlog/backlog-drive-idle.ts +161 -0
  139. package/scripts/backlog/backlog-drive-judge.ts +25 -0
  140. package/scripts/backlog/backlog-drive-launch-pass.ts +90 -0
  141. package/scripts/backlog/backlog-drive-launch.ts +8 -2
  142. package/scripts/backlog/backlog-drive-memory.ts +126 -0
  143. package/scripts/backlog/backlog-drive-named-offer.ts +73 -35
  144. package/scripts/backlog/backlog-drive-named.ts +81 -13
  145. package/scripts/backlog/backlog-drive-offer-argv.ts +3 -8
  146. package/scripts/backlog/backlog-drive-paused.ts +170 -0
  147. package/scripts/backlog/backlog-drive-restore.ts +39 -8
  148. package/scripts/backlog/backlog-drive-seats.ts +18 -8
  149. package/scripts/backlog/backlog-drive-token-handling.ts +38 -0
  150. package/scripts/backlog/backlog-drive.ts +96 -131
  151. package/scripts/backlog/backlog-gate-scope.ts +61 -0
  152. package/scripts/backlog/backlog-measure-close.ts +112 -0
  153. package/scripts/backlog/backlog-next-main.ts +16 -0
  154. package/scripts/backlog/backlog-next-shared.ts +73 -0
  155. package/scripts/backlog/backlog-next.ts +78 -56
  156. package/scripts/backlog/backlog-occupied.ts +52 -39
  157. package/scripts/backlog/backlog-offer-cli.ts +6 -21
  158. package/scripts/backlog/backlog-offer-exclude.ts +15 -0
  159. package/scripts/backlog/backlog-offer-main.ts +12 -0
  160. package/scripts/backlog/backlog-offer.ts +36 -3
  161. package/scripts/backlog/backlog-overlap.ts +62 -10
  162. package/scripts/backlog/backlog-plan-cli.ts +4 -1
  163. package/scripts/backlog/backlog-plan-comment.ts +81 -0
  164. package/scripts/backlog/backlog-plan-read.ts +22 -5
  165. package/scripts/backlog/backlog-plan.ts +18 -4
  166. package/scripts/backlog/backlog-pool.ts +60 -22
  167. package/scripts/backlog/backlog-rank.ts +70 -15
  168. package/scripts/backlog/backlog-ready.ts +112 -30
  169. package/scripts/backlog/backlog-stalled-detect.ts +110 -36
  170. package/scripts/backlog/backlog-stalled.ts +52 -16
  171. package/scripts/backlog/backlog-wait-cause.ts +86 -0
  172. package/scripts/backlog/backlog-waves.ts +56 -15
  173. package/scripts/backlog/backlogrun-args.ts +19 -7
  174. package/scripts/backlog/backlogrun-cli.ts +19 -5
  175. package/scripts/backlog/backlogrun-launch.ts +13 -4
  176. package/scripts/backlog/backlogrun-restart.ts +97 -0
  177. package/scripts/backlog/backlogrun-stop.ts +79 -7
  178. package/scripts/behavior/behavior-cli.ts +2 -2
  179. package/scripts/behavior/behavior-rules.ts +47 -24
  180. package/scripts/build/build-bin.ts +2 -16
  181. package/scripts/build/build-claude-md.ts +0 -7
  182. package/scripts/build/build-commands.ts +0 -13
  183. package/scripts/build/build-hooks.ts +49 -48
  184. package/scripts/build/hook-bundle-stamp.ts +29 -11
  185. package/scripts/build/local-bin.ts +1 -1
  186. package/scripts/cases/cases-cli.ts +25 -13
  187. package/scripts/cases/cases-interaction-scan.ts +134 -0
  188. package/scripts/cases/cases-interaction.ts +183 -0
  189. package/scripts/cases/cases-logic.ts +39 -6
  190. package/scripts/ci/pr-classification-main.ts +18 -0
  191. package/scripts/ci/pr-classification.ts +10 -17
  192. package/scripts/clone/clone-scan.ts +1 -1
  193. package/scripts/cost-runtime/context-cut-payback.ts +27 -25
  194. package/scripts/cost-runtime/cost-blocks.ts +22 -37
  195. package/scripts/cost-runtime/cost-cli.ts +67 -29
  196. package/scripts/cost-runtime/cost-main.ts +12 -0
  197. package/scripts/cost-runtime/cost-pricing.ts +9 -0
  198. package/scripts/cost-runtime/cost-transcript.ts +1 -0
  199. package/scripts/cost-runtime/cost-verdict.ts +4 -1
  200. package/scripts/delegation/delegation-policy.ts +18 -5
  201. package/scripts/delegation/duplicate-read-guard.ts +1 -8
  202. package/scripts/delegation/investigation-guard.ts +12 -8
  203. package/scripts/delegation/investigation-reads.ts +48 -27
  204. package/scripts/dependabot/dependabot-cooldown.ts +195 -0
  205. package/scripts/discovery/repo-discovery.ts +24 -6
  206. package/scripts/discovery/repo-party.ts +80 -20
  207. package/scripts/discovery/session-owner-pin.ts +51 -0
  208. package/scripts/doctor/doctor-consumer.ts +2 -5
  209. package/scripts/document/capped-print.ts +1 -1
  210. package/scripts/document/command-reference-line-budget.ts +42 -0
  211. package/scripts/document/document-byte-budget.ts +18 -6
  212. package/scripts/document/document-checks.ts +20 -0
  213. package/scripts/document/document-ratchet-check.ts +101 -0
  214. package/scripts/document/document-scan.ts +1 -1
  215. package/scripts/document/document-section-cli.ts +0 -8
  216. package/scripts/document/document-section-main.ts +12 -0
  217. package/scripts/document/document-section.ts +1 -0
  218. package/scripts/document/entry-read-budget.ts +7 -3
  219. package/scripts/document/issue-citation-budget.ts +94 -0
  220. package/scripts/epic/epic-audit-cli.ts +12 -6
  221. package/scripts/epic/epic-bundle-apply.ts +137 -0
  222. package/scripts/epic/epic-bundle-cli.ts +32 -121
  223. package/scripts/epic/epic-bundle-format.ts +116 -0
  224. package/scripts/epic/epic-bundle-main.ts +17 -0
  225. package/scripts/epic/epic-busy.ts +5 -12
  226. package/scripts/epic/epic-classify.ts +24 -15
  227. package/scripts/epic/epic-cli-argv.ts +33 -2
  228. package/scripts/epic/epic-cli-decide.ts +42 -0
  229. package/scripts/epic/epic-cli.ts +6 -38
  230. package/scripts/epic/epic-close.ts +112 -55
  231. package/scripts/epic/epic-cross-repo.ts +4 -7
  232. package/scripts/epic/epic-decide.ts +119 -0
  233. package/scripts/epic/epic-decision.ts +9 -0
  234. package/scripts/epic/epic-fetch.ts +6 -0
  235. package/scripts/epic/epic-graph.ts +8 -1
  236. package/scripts/epic/epic-issue.ts +8 -2
  237. package/scripts/epic/epic-label-age.ts +1 -1
  238. package/scripts/epic/epic-lane-offer.ts +39 -4
  239. package/scripts/epic/epic-next-main.ts +24 -0
  240. package/scripts/epic/epic-next.ts +6 -24
  241. package/scripts/epic/epic-outside-blocker.ts +6 -2
  242. package/scripts/epic/epic-parse.ts +9 -3
  243. package/scripts/epic/epic-rank.ts +5 -0
  244. package/scripts/epic/epic-read.ts +1 -0
  245. package/scripts/epic/epic-reconcile.ts +39 -0
  246. package/scripts/epic/epic-run.ts +10 -1
  247. package/scripts/epic/epic-solo.ts +50 -14
  248. package/scripts/epic/epic.ts +41 -7
  249. package/scripts/exports/unused-members-check.ts +62 -0
  250. package/scripts/exports/unused-members-cli.ts +6 -51
  251. package/scripts/followup/followup-checks-event.ts +8 -3
  252. package/scripts/followup/followup-ci-path.ts +67 -0
  253. package/scripts/followup/followup-coderabbit-retrigger.ts +261 -0
  254. package/scripts/followup/followup-coderabbit-wait.ts +85 -0
  255. package/scripts/followup/followup-failed-tests.ts +160 -0
  256. package/scripts/followup/followup-job-needs.ts +100 -0
  257. package/scripts/followup/followup-job-rerun.ts +303 -0
  258. package/scripts/followup/followup-main-move.ts +113 -0
  259. package/scripts/followup/followup-review-gates.ts +81 -0
  260. package/scripts/followup/git-followup-finish.ts +43 -11
  261. package/scripts/followup/git-followup-pending.ts +3 -3
  262. package/scripts/followup/git-followup-stages.ts +52 -12
  263. package/scripts/followup/git-followup-workflow.ts +19 -66
  264. package/scripts/followup/git-pr-followup-checks.ts +55 -16
  265. package/scripts/followup/git-pr-followup-wrapup.ts +32 -18
  266. package/scripts/followup/git-pr-followup.ts +96 -33
  267. package/scripts/fresh-machine/fresh-machine-cli.ts +1 -1
  268. package/scripts/fresh-machine/fresh-machine-run.ts +8 -8
  269. package/scripts/fresh-machine/fresh-machine-script.ts +5 -9
  270. package/scripts/fresh-machine/specs/kit-test-backlogrun-python.json +2 -2
  271. package/scripts/fresh-machine/specs/kit-test-backlogrun.json +3 -3
  272. package/scripts/gate/busy-average.ts +90 -0
  273. package/scripts/gate/check-cpu.ts +60 -0
  274. package/scripts/gate/check-inputs.ts +39 -95
  275. package/scripts/gate/check-related-pinned.ts +43 -0
  276. package/scripts/gate/check-related-reuse.ts +64 -0
  277. package/scripts/gate/check-related-section.ts +57 -0
  278. package/scripts/gate/check-related-unplanned.ts +34 -0
  279. package/scripts/gate/check-related.ts +265 -0
  280. package/scripts/gate/check-reuse.ts +33 -54
  281. package/scripts/gate/command-memory.ts +192 -0
  282. package/scripts/gate/core-admission.ts +236 -28
  283. package/scripts/gate/core-budget-timing.ts +51 -0
  284. package/scripts/gate/core-budget.ts +111 -100
  285. package/scripts/gate/core-wait-record.ts +49 -0
  286. package/scripts/gate/core-wait.ts +62 -7
  287. package/scripts/gate/core-weights.ts +94 -0
  288. package/scripts/gate/free-cores.ts +27 -4
  289. package/scripts/gate/gate-labels.ts +46 -0
  290. package/scripts/gate/gate-ledger.ts +44 -8
  291. package/scripts/gate/gate-plan.ts +130 -78
  292. package/scripts/gate/gate-report.ts +23 -9
  293. package/scripts/gate/gate-run-steps.ts +77 -9
  294. package/scripts/gate/gate-skip.ts +57 -8
  295. package/scripts/gate/gate-static-group.ts +60 -0
  296. package/scripts/gate/gate-steps.ts +14 -2
  297. package/scripts/gate/gate-tree.ts +4 -2
  298. package/scripts/gate/hook-gate-reuse.ts +19 -2
  299. package/scripts/gate/input-fingerprint.ts +42 -0
  300. package/scripts/gate/machine-capacity.ts +65 -31
  301. package/scripts/gate/metrics-totals.ts +59 -0
  302. package/scripts/gate/moved-paths.ts +67 -0
  303. package/scripts/gate/project-checks.ts +5 -12
  304. package/scripts/gate/scoped-green.ts +76 -19
  305. package/scripts/gate/since-green.ts +70 -0
  306. package/scripts/gate/structural-checks.ts +96 -0
  307. package/scripts/gate/toolchain-inputs.ts +115 -0
  308. package/scripts/gate/verification-gate.ts +70 -32
  309. package/scripts/gate/verification-inputs.ts +265 -0
  310. package/scripts/gate/verification-tail.ts +52 -0
  311. package/scripts/gh/gh-author-association.ts +117 -9
  312. package/scripts/gh/git-ai-review-scan.ts +5 -3
  313. package/scripts/gh/git-gh-api-path.ts +26 -2
  314. package/scripts/gh/git-gh-branch-rules.ts +73 -0
  315. package/scripts/gh/git-gh-comments-unreadable.ts +36 -0
  316. package/scripts/gh/git-gh-conditional.ts +5 -2
  317. package/scripts/gh/git-gh-exec.ts +32 -2
  318. package/scripts/gh/git-gh-issue-read.ts +7 -1
  319. package/scripts/gh/git-gh-issue-rest.ts +1 -0
  320. package/scripts/gh/git-gh-issue-write.ts +75 -31
  321. package/scripts/gh/git-gh-issue.ts +19 -8
  322. package/scripts/gh/git-gh-poll-read.ts +89 -0
  323. package/scripts/gh/git-gh-pr-auto-merge.ts +21 -9
  324. package/scripts/gh/git-gh-pr-graphql-state.ts +56 -0
  325. package/scripts/gh/git-gh-pr-read.ts +74 -13
  326. package/scripts/gh/git-gh-pr-rest.ts +4 -2
  327. package/scripts/gh/git-gh-pr-snapshot.ts +48 -20
  328. package/scripts/gh/git-gh-pr-too-large.ts +20 -0
  329. package/scripts/gh/git-gh-pr.ts +48 -22
  330. package/scripts/gh/git-gh-retry.ts +141 -0
  331. package/scripts/gh/git-pr-ai-review.ts +15 -6
  332. package/scripts/gh/git-pr-checks-eval.ts +42 -7
  333. package/scripts/gh/git-pr-checks-parse.ts +39 -9
  334. package/scripts/gh/git-pr-checks.ts +5 -5
  335. package/scripts/gh/git-pr-merge-checked.ts +80 -0
  336. package/scripts/git/base-tree.ts +49 -2
  337. package/scripts/git/change-base.ts +4 -10
  338. package/scripts/git/changed-file-scope.ts +6 -4
  339. package/scripts/git/changed-paths-sync.ts +63 -0
  340. package/scripts/git/changed-paths.ts +34 -2
  341. package/scripts/git/git-common-directory.ts +11 -1
  342. package/scripts/git/git-diff-reads.ts +91 -20
  343. package/scripts/git/git-error.ts +9 -2
  344. package/scripts/git/git-grep-hits.ts +85 -0
  345. package/scripts/git/git-location-environment.ts +1 -1
  346. package/scripts/git/git-merge-conflicts.ts +83 -0
  347. package/scripts/git/git-preflight.ts +37 -12
  348. package/scripts/git/git-push-transport.ts +1 -2
  349. package/scripts/git/git-schemas.ts +30 -7
  350. package/scripts/git/git-spawn.ts +1 -2
  351. package/scripts/git/git-status.ts +4 -4
  352. package/scripts/git/git-worktree.ts +13 -0
  353. package/scripts/git/gone-branch.ts +4 -1
  354. package/scripts/git/main-merge-budget-conflict.ts +89 -0
  355. package/scripts/git/main-merge-guard.ts +55 -18
  356. package/scripts/git/main-merge-main.ts +12 -0
  357. package/scripts/git/main-merge-regenerate.ts +59 -25
  358. package/scripts/git/main-merge.ts +77 -13
  359. package/scripts/git/main-sync-main.ts +12 -0
  360. package/scripts/git/main-sync.ts +0 -9
  361. package/scripts/git/no-base-checkout.ts +127 -0
  362. package/scripts/git/stash/git-stash.ts +38 -6
  363. package/scripts/git/stash/{stash-pop-args.ts → stash-args.ts} +13 -10
  364. package/scripts/git/stash/stash-pop-cli.ts +6 -12
  365. package/scripts/git/stash/stash-pop-main.ts +12 -0
  366. package/scripts/git/stash/stash-push-cli.ts +86 -0
  367. package/scripts/git/stash/stash-push-main.ts +12 -0
  368. package/scripts/hooks/batch-guard.ts +38 -27
  369. package/scripts/hooks/check-commit-message-main.ts +8 -0
  370. package/scripts/hooks/check-commit-message.ts +4 -7
  371. package/scripts/hooks/edited-cspell.ts +37 -11
  372. package/scripts/hooks/format-edited-file.ts +29 -25
  373. package/scripts/hooks/lane-plan-guard.ts +50 -0
  374. package/scripts/hooks/pre-commit-lint-switch.ts +9 -0
  375. package/scripts/hooks/pre-commit-lint.ts +44 -4
  376. package/scripts/hooks/pre-push-related-switch.ts +10 -0
  377. package/scripts/hooks/pre-push-unit.ts +77 -9
  378. package/scripts/hooks/pretool-guard-cli.ts +1 -8
  379. package/scripts/hooks/pretool-guard.ts +34 -19
  380. package/scripts/hooks/reserved-run.ts +81 -10
  381. package/scripts/hooks/run-hook.sh +30 -6
  382. package/scripts/hooks/shell-rules-notice.ts +37 -0
  383. package/scripts/hooks/step-zero-notice.ts +6 -1
  384. package/scripts/hooks/stop-actions.ts +5 -36
  385. package/scripts/hooks/stop-guard.ts +20 -15
  386. package/scripts/init/distributed-paths.ts +1 -0
  387. package/scripts/init/hook-command-rewrite.ts +23 -5
  388. package/scripts/init/hook-launch.ts +17 -17
  389. package/scripts/init/init-actions.ts +0 -6
  390. package/scripts/init/init-ai-copy.ts +10 -36
  391. package/scripts/init/init-bootstrap.ts +9 -8
  392. package/scripts/init/init-dry-run-report.ts +1 -1
  393. package/scripts/init/init-dry-run.ts +1 -1
  394. package/scripts/init/init-file-action.ts +7 -9
  395. package/scripts/init/init-logic-json-merge.ts +2 -2
  396. package/scripts/init/init-logic-migrate.ts +9 -82
  397. package/scripts/init/init-logic.ts +3 -2
  398. package/scripts/init/init-main.ts +12 -0
  399. package/scripts/init/init.ts +5 -12
  400. package/scripts/init/kit-development-versions.ts +3 -7
  401. package/scripts/init/kit-written-paths.ts +2 -2
  402. package/scripts/init/project-profile.ts +5 -4
  403. package/scripts/init/tsconfig-preset-migration.ts +2 -1
  404. package/scripts/init/vscode-tasks.ts +1 -1
  405. package/scripts/issue/aggregation-split.ts +52 -0
  406. package/scripts/issue/defect-origin-cli.ts +106 -0
  407. package/scripts/issue/defect-origin-line.ts +78 -0
  408. package/scripts/issue/defect-origin-main.ts +11 -0
  409. package/scripts/issue/defect-origin.ts +114 -0
  410. package/scripts/issue/defect-rate-cli.ts +38 -179
  411. package/scripts/issue/defect-rate.ts +0 -16
  412. package/scripts/issue/defect-report-cli.ts +128 -0
  413. package/scripts/issue/defect-report-format.ts +56 -0
  414. package/scripts/issue/defect-report-main.ts +11 -0
  415. package/scripts/issue/defect-report.ts +160 -0
  416. package/scripts/issue/effect-audit-cli.ts +178 -0
  417. package/scripts/issue/effect-audit.ts +185 -0
  418. package/scripts/issue/expected-effect-lint.ts +65 -9
  419. package/scripts/issue/git-next-issues.ts +5 -0
  420. package/scripts/issue/issue-already-done-cli.ts +62 -0
  421. package/scripts/issue/issue-body-or-comment.ts +74 -0
  422. package/scripts/issue/issue-cite-cli.ts +1 -12
  423. package/scripts/issue/issue-cite-main.ts +12 -0
  424. package/scripts/issue/issue-classification.ts +13 -7
  425. package/scripts/issue/issue-closing-pr.ts +8 -1
  426. package/scripts/issue/issue-comment-cli.ts +10 -24
  427. package/scripts/issue/issue-comment-main.ts +12 -0
  428. package/scripts/issue/issue-evidence-exit.ts +102 -0
  429. package/scripts/issue/issue-file-cap.ts +58 -0
  430. package/scripts/issue/issue-file-cli.ts +131 -36
  431. package/scripts/issue/issue-file-deferral.ts +52 -0
  432. package/scripts/issue/issue-file-fold.ts +29 -10
  433. package/scripts/issue/issue-file-interrupt.ts +85 -0
  434. package/scripts/issue/issue-file-lane-hint.ts +30 -0
  435. package/scripts/issue/issue-file.ts +56 -19
  436. package/scripts/issue/issue-fold-cli.ts +2 -11
  437. package/scripts/issue/issue-fold-main.ts +12 -0
  438. package/scripts/issue/issue-labels.ts +97 -89
  439. package/scripts/issue/issue-lint-cli.ts +29 -12
  440. package/scripts/issue/issue-lint-main.ts +12 -0
  441. package/scripts/issue/issue-measured-cli.ts +34 -0
  442. package/scripts/issue/issue-measured-close.ts +58 -0
  443. package/scripts/issue/issue-merged.ts +19 -2
  444. package/scripts/issue/issue-not-before-label.ts +135 -0
  445. package/scripts/issue/issue-not-before.ts +114 -0
  446. package/scripts/issue/issue-number-shape.ts +15 -1
  447. package/scripts/issue/issue-park.ts +28 -0
  448. package/scripts/issue/issue-plan-cli.ts +151 -0
  449. package/scripts/issue/issue-priority-cli.ts +60 -0
  450. package/scripts/issue/issue-priority-raise.ts +55 -0
  451. package/scripts/issue/issue-priority.ts +282 -0
  452. package/scripts/issue/issue-rank.ts +27 -4
  453. package/scripts/issue/issue-read-cli.ts +35 -16
  454. package/scripts/issue/issue-read-main.ts +12 -0
  455. package/scripts/issue/issue-read.ts +62 -13
  456. package/scripts/issue/issue-release-cli.ts +0 -10
  457. package/scripts/issue/issue-release-main.ts +13 -0
  458. package/scripts/issue/issue-release.ts +7 -12
  459. package/scripts/issue/issue-sample-gate.ts +213 -0
  460. package/scripts/issue/issue-sample-prime.ts +127 -0
  461. package/scripts/issue/issue-sample-required.ts +57 -0
  462. package/scripts/issue/issue-sample-source.ts +77 -0
  463. package/scripts/issue/issue-scout-cli.ts +0 -11
  464. package/scripts/issue/issue-scout-main.ts +14 -0
  465. package/scripts/issue/issue-search.ts +124 -0
  466. package/scripts/issue/issue-state-cli.ts +0 -10
  467. package/scripts/issue/issue-state-main.ts +12 -0
  468. package/scripts/issue/issue-state.ts +13 -1
  469. package/scripts/issue/issue-template-section.ts +43 -0
  470. package/scripts/issue/issue-watch-diff.ts +87 -16
  471. package/scripts/issue/issue-watch-hook.ts +11 -2
  472. package/scripts/issue/issue-watch.ts +55 -11
  473. package/scripts/issue/issue-wip.ts +2 -7
  474. package/scripts/issue/markdown-section.ts +1 -0
  475. package/scripts/issue/measure-declaration.ts +121 -0
  476. package/scripts/issue/measure-rerun-cli.ts +7 -65
  477. package/scripts/issue/plan-consumers-cli.ts +39 -0
  478. package/scripts/issue/plan-consumers-main.ts +11 -0
  479. package/scripts/issue/plan-consumers-section.ts +76 -0
  480. package/scripts/issue/plan-consumers.ts +127 -0
  481. package/scripts/issue/reproduction-measure.ts +3 -1
  482. package/scripts/issue/size-estimate.ts +90 -0
  483. package/scripts/issue/trusted-measure.ts +84 -0
  484. package/scripts/josh/agent-session-environment.ts +1 -1
  485. package/scripts/josh/command-usage.ts +17 -44
  486. package/scripts/josh/durable-state-migrate.ts +105 -0
  487. package/scripts/josh/durable-state.ts +112 -0
  488. package/scripts/josh/file-map-stamp.ts +49 -16
  489. package/scripts/josh/hook-decision.ts +32 -20
  490. package/scripts/josh/josh-aliases.ts +95 -0
  491. package/scripts/josh/josh-command-map.ts +1 -79
  492. package/scripts/josh/josh-command-types.ts +12 -6
  493. package/scripts/josh/josh-commands-agent-hooks.ts +83 -0
  494. package/scripts/josh/josh-commands-ai.ts +160 -161
  495. package/scripts/josh/josh-commands-backlog.ts +82 -16
  496. package/scripts/josh/josh-commands-clone.ts +1 -0
  497. package/scripts/josh/josh-commands-development.ts +142 -101
  498. package/scripts/josh/josh-commands-document.ts +43 -1
  499. package/scripts/josh/josh-commands-epic.ts +171 -0
  500. package/scripts/josh/josh-commands-hooks.ts +25 -2
  501. package/scripts/josh/josh-commands-issue-write.ts +200 -0
  502. package/scripts/josh/josh-commands-issue.ts +156 -24
  503. package/scripts/josh/josh-commands-lane.ts +187 -3
  504. package/scripts/josh/josh-commands-lint.ts +34 -10
  505. package/scripts/josh/josh-commands-maintenance.ts +127 -4
  506. package/scripts/josh/josh-commands-pause.ts +29 -0
  507. package/scripts/josh/josh-commands-progress.ts +87 -0
  508. package/scripts/josh/josh-commands-project.ts +138 -9
  509. package/scripts/josh/josh-commands-review.ts +159 -0
  510. package/scripts/josh/josh-commands-run.ts +211 -23
  511. package/scripts/josh/josh-commands-ship.ts +217 -0
  512. package/scripts/josh/josh-commands-split.ts +9 -0
  513. package/scripts/josh/josh-commands-test-check.ts +80 -0
  514. package/scripts/josh/josh-commands-versioning.ts +49 -2
  515. package/scripts/josh/josh-commands-workflow.ts +144 -6
  516. package/scripts/josh/josh-environment-file.ts +43 -3
  517. package/scripts/josh/josh-in-process.ts +2 -2
  518. package/scripts/josh/josh-logic.ts +11 -16
  519. package/scripts/josh/josh-run.ts +19 -1
  520. package/scripts/josh/package-directory.ts +2 -4
  521. package/scripts/josh/process-identity.ts +13 -4
  522. package/scripts/josh/run-record-path.ts +15 -0
  523. package/scripts/josh/session-language-cli.ts +4 -8
  524. package/scripts/josh/session-language-main.ts +13 -0
  525. package/scripts/josh/session-language.ts +6 -1
  526. package/scripts/josh/shared-cache.ts +90 -0
  527. package/scripts/josh/stamp-file.ts +20 -17
  528. package/scripts/lane/lane-adopt-cli.ts +98 -0
  529. package/scripts/lane/lane-adopt.ts +208 -0
  530. package/scripts/lane/lane-await.ts +56 -20
  531. package/scripts/lane/lane-baseline.ts +123 -0
  532. package/scripts/lane/lane-breakdown-cli.ts +64 -0
  533. package/scripts/lane/lane-breakdown-implement.ts +170 -0
  534. package/scripts/lane/lane-breakdown-laps.ts +107 -0
  535. package/scripts/lane/lane-breakdown-pinned.ts +76 -0
  536. package/scripts/lane/lane-breakdown-text.ts +145 -0
  537. package/scripts/lane/lane-breakdown.ts +239 -0
  538. package/scripts/lane/lane-cache.ts +5 -30
  539. package/scripts/lane/lane-capacity.ts +14 -23
  540. package/scripts/lane/lane-check-stats.ts +84 -22
  541. package/scripts/lane/lane-child-invocation.ts +17 -2
  542. package/scripts/lane/lane-child-mark-keys.ts +12 -0
  543. package/scripts/lane/lane-child-marker.ts +20 -1
  544. package/scripts/lane/lane-ci-path-stats.ts +73 -0
  545. package/scripts/lane/lane-claim-stats.ts +84 -0
  546. package/scripts/lane/lane-cli.ts +15 -5
  547. package/scripts/lane/lane-close.ts +91 -18
  548. package/scripts/lane/lane-core-wait-stats.ts +66 -0
  549. package/scripts/lane/lane-dispatch-log.ts +3 -3
  550. package/scripts/lane/lane-dispatch.ts +26 -5
  551. package/scripts/lane/lane-gap-stats.ts +157 -0
  552. package/scripts/lane/lane-guard-policy.ts +7 -1
  553. package/scripts/lane/lane-handoff.ts +69 -1
  554. package/scripts/lane/lane-held-stats.ts +129 -0
  555. package/scripts/lane/lane-implement-stats.ts +207 -0
  556. package/scripts/lane/lane-implement-subagents.ts +90 -0
  557. package/scripts/lane/lane-install.ts +4 -11
  558. package/scripts/lane/lane-investigation-switch.ts +16 -0
  559. package/scripts/lane/lane-launch-cli.ts +0 -9
  560. package/scripts/lane/lane-launch-main.ts +12 -0
  561. package/scripts/lane/lane-ledger-kind.ts +31 -0
  562. package/scripts/lane/lane-ledger-schema-ship.ts +49 -0
  563. package/scripts/lane/lane-ledger-schema.ts +349 -0
  564. package/scripts/lane/lane-ledger-write.ts +257 -0
  565. package/scripts/lane/lane-ledger.ts +56 -233
  566. package/scripts/lane/lane-limit-cli.ts +12 -1
  567. package/scripts/lane/lane-load.ts +1 -1
  568. package/scripts/lane/lane-measure-cli.ts +193 -30
  569. package/scripts/lane/lane-net-read.ts +44 -0
  570. package/scripts/lane/lane-net-time.ts +212 -0
  571. package/scripts/lane/lane-open.ts +25 -8
  572. package/scripts/lane/lane-output.ts +2 -4
  573. package/scripts/lane/lane-overrun-prompt.ts +147 -0
  574. package/scripts/lane/lane-overrun.ts +274 -0
  575. package/scripts/lane/lane-parked.ts +3 -3
  576. package/scripts/lane/lane-paths.ts +24 -1
  577. package/scripts/lane/lane-pause-cli.ts +133 -0
  578. package/scripts/lane/lane-pause.ts +158 -0
  579. package/scripts/lane/lane-paused-spans.ts +97 -0
  580. package/scripts/lane/lane-plan-check.ts +207 -0
  581. package/scripts/lane/lane-plan-cli.ts +41 -0
  582. package/scripts/lane/lane-plan.ts +144 -0
  583. package/scripts/lane/lane-process-table.ts +166 -0
  584. package/scripts/lane/lane-reap-settle.ts +124 -0
  585. package/scripts/lane/lane-reap.ts +50 -15
  586. package/scripts/lane/lane-registry.ts +38 -4
  587. package/scripts/lane/lane-relaunch.ts +1 -1
  588. package/scripts/lane/lane-residents.ts +162 -0
  589. package/scripts/lane/lane-restart.ts +22 -2
  590. package/scripts/lane/lane-round-one-stats.ts +51 -0
  591. package/scripts/lane/lane-round-two-stats.ts +49 -0
  592. package/scripts/lane/lane-sampler.ts +26 -3
  593. package/scripts/lane/lane-session-action.ts +112 -23
  594. package/scripts/lane/lane-session-broker.ts +146 -37
  595. package/scripts/lane/lane-session-reread-main.ts +14 -0
  596. package/scripts/lane/lane-session-reread.ts +51 -0
  597. package/scripts/lane/lane-ship-lap-stats.ts +74 -0
  598. package/scripts/lane/lane-sleep.ts +58 -0
  599. package/scripts/lane/lane-snapshot-trace.ts +84 -0
  600. package/scripts/lane/lane-spans.ts +51 -0
  601. package/scripts/lane/lane-spent.ts +7 -4
  602. package/scripts/lane/lane-split-stats.ts +28 -0
  603. package/scripts/lane/lane-stage-stats.ts +20 -3
  604. package/scripts/lane/lane-state.ts +334 -0
  605. package/scripts/lane/lane-stats-tables.ts +58 -0
  606. package/scripts/lane/lane-stats.ts +74 -4
  607. package/scripts/lane/lane-stop-stats.ts +145 -37
  608. package/scripts/lane/lane-tail-stats.ts +32 -0
  609. package/scripts/lane/lane-test-related-stats.ts +127 -0
  610. package/scripts/lane/lane-transcript-calls.ts +202 -0
  611. package/scripts/lane/lane-transcript-stats.ts +200 -0
  612. package/scripts/lane/lane-vacant.ts +13 -3
  613. package/scripts/lane/lane-value-cell.ts +72 -0
  614. package/scripts/lane/lane-value.ts +118 -0
  615. package/scripts/lane/lane-withdraw-cli.ts +5 -4
  616. package/scripts/lane/lane-withdraw-closed.ts +124 -0
  617. package/scripts/lane/lane-withdraw.ts +149 -71
  618. package/scripts/lane/lane-yield.ts +85 -0
  619. package/scripts/lane/openai-lane-ship.ts +12 -11
  620. package/scripts/lane/openai-lane-supervisor-decision.ts +6 -8
  621. package/scripts/lane/openai-lane-supervisor-owner.ts +5 -8
  622. package/scripts/lane/openai-lane-supervisor.ts +5 -4
  623. package/scripts/lane/process-directories.ts +70 -0
  624. package/scripts/lane/process-lane-marks.ts +94 -0
  625. package/scripts/lib/atomic-write.ts +62 -0
  626. package/scripts/lib/buffered-process.ts +12 -5
  627. package/scripts/lib/cli-flags.ts +53 -0
  628. package/scripts/lib/figure-format.ts +63 -0
  629. package/scripts/lib/json-value.ts +9 -1
  630. package/scripts/lib/package-manifest.ts +35 -0
  631. package/scripts/lib/poll.ts +38 -9
  632. package/scripts/lib/read-file.ts +3 -1
  633. package/scripts/lib/settled-together.ts +10 -0
  634. package/scripts/lib/shell-quote.ts +21 -0
  635. package/scripts/lib/stamped-memo.ts +63 -0
  636. package/scripts/lib/stdout-on-stderr.ts +24 -0
  637. package/scripts/lib/timeouts.ts +9 -0
  638. package/scripts/lib/token-shape.ts +111 -0
  639. package/scripts/lib/transcript-record.ts +91 -0
  640. package/scripts/lines/effective-limit.ts +1 -1
  641. package/scripts/lint/eslint-cache-dependencies.ts +145 -0
  642. package/scripts/lint/eslint-daemon-sources.ts +79 -0
  643. package/scripts/lint/eslint-daemon.ts +304 -0
  644. package/scripts/lint/eslint-warm-cli.ts +7 -0
  645. package/scripts/lint/eslint-warm.ts +66 -0
  646. package/scripts/lint/format.ts +11 -2
  647. package/scripts/lint/import-graph.ts +409 -0
  648. package/scripts/lint/lint-gate-scope.ts +102 -0
  649. package/scripts/lint/lint-parallel-main.ts +19 -0
  650. package/scripts/lint/lint-parallel.ts +113 -33
  651. package/scripts/lint/lint-related-scope.ts +30 -24
  652. package/scripts/lint/lint-related.ts +183 -30
  653. package/scripts/lint/rename-cli.ts +179 -0
  654. package/scripts/lint/rename-identifier.ts +192 -0
  655. package/scripts/lint/type-only-imports.ts +58 -0
  656. package/scripts/notify/confirmation-options.ts +1 -2
  657. package/scripts/notify/telegram-notify.ts +32 -23
  658. package/scripts/notify/telegram-test-logic.ts +0 -1
  659. package/scripts/notify/telegram-test-main.ts +8 -0
  660. package/scripts/notify/telegram-test.ts +2 -6
  661. package/scripts/observations/observation-ledger.ts +13 -0
  662. package/scripts/observations/observation-record.ts +42 -16
  663. package/scripts/observations/observations-flush-landing.ts +5 -3
  664. package/scripts/observations/observations-flush.ts +38 -10
  665. package/scripts/overrides/overrides-check.ts +11 -6
  666. package/scripts/overrides/overrides-files.ts +2 -1
  667. package/scripts/overrides/overrides-logic.ts +3 -6
  668. package/scripts/package/verify-optional-eslint-install.ts +8 -6
  669. package/scripts/propagate/propagate-publish.ts +2 -7
  670. package/scripts/propagate/propagate-targets.ts +4 -12
  671. package/scripts/refactor/import-graph.ts +9 -7
  672. package/scripts/release/github-release-runs.ts +17 -6
  673. package/scripts/release/release-approval-prune.ts +24 -0
  674. package/scripts/release/release-history.ts +1 -3
  675. package/scripts/release/release-progress.ts +42 -22
  676. package/scripts/release/release-publish-run.ts +39 -0
  677. package/scripts/release/release-publish.ts +6 -6
  678. package/scripts/release/release-scope-cli.ts +0 -10
  679. package/scripts/release/release-scope-main.ts +12 -0
  680. package/scripts/repo/repo-setting.ts +3 -6
  681. package/scripts/repo/required-checks-logic.ts +10 -16
  682. package/scripts/repo/ruleset-check.ts +4 -3
  683. package/scripts/report/markdown-shape.ts +28 -0
  684. package/scripts/report/report-format-reference.ts +17 -1
  685. package/scripts/report/report-labels.ts +166 -0
  686. package/scripts/report/report-lint-child-summary.ts +94 -0
  687. package/scripts/report/report-lint-cli.ts +29 -7
  688. package/scripts/report/report-lint.ts +85 -128
  689. package/scripts/report/report-template-cli.ts +59 -0
  690. package/scripts/report/report-template.ts +112 -0
  691. package/scripts/review/acceptance-map.ts +1 -0
  692. package/scripts/review/prose-stale-cli.ts +88 -0
  693. package/scripts/review/prose-stale-scan.ts +152 -0
  694. package/scripts/review/removed-tests-check.ts +86 -0
  695. package/scripts/review/removed-tests.ts +149 -0
  696. package/scripts/review/review-attest.ts +73 -23
  697. package/scripts/review/review-brief-cli.ts +138 -23
  698. package/scripts/review/review-brief-main.ts +12 -0
  699. package/scripts/review/review-brief-paths.ts +22 -0
  700. package/scripts/review/review-brief.ts +45 -10
  701. package/scripts/review/review-code-tree.ts +10 -6
  702. package/scripts/review/review-comment-carry.ts +47 -0
  703. package/scripts/review/review-comment-round.ts +111 -30
  704. package/scripts/review/review-finding-ledger.ts +135 -18
  705. package/scripts/review/review-finding-text.ts +43 -0
  706. package/scripts/review/review-interaction.ts +105 -0
  707. package/scripts/review/review-lane-handover.ts +68 -0
  708. package/scripts/review/review-lint-cli.ts +57 -0
  709. package/scripts/review/review-lint-findings.ts +92 -0
  710. package/scripts/review/review-lint-sections.ts +80 -0
  711. package/scripts/review/review-lint.ts +221 -0
  712. package/scripts/review/review-prior-findings.ts +102 -0
  713. package/scripts/review/review-readers-scan.ts +165 -0
  714. package/scripts/review/review-record-cli.ts +236 -74
  715. package/scripts/review/review-record-code-round.ts +55 -0
  716. package/scripts/review/review-record-comment.ts +60 -0
  717. package/scripts/review/review-record-interaction.ts +35 -0
  718. package/scripts/review/review-record-main.ts +12 -0
  719. package/scripts/review/review-record-pinned.ts +108 -0
  720. package/scripts/review/review-record.ts +25 -1
  721. package/scripts/review/review-reviewed-tree.ts +307 -0
  722. package/scripts/review/review-round-one-blobs.ts +221 -0
  723. package/scripts/review/review-round-one-closure.ts +62 -0
  724. package/scripts/review/review-round-reuse.ts +106 -0
  725. package/scripts/review/review-round2-cli.ts +135 -36
  726. package/scripts/review/review-round2-skip-comment.ts +55 -0
  727. package/scripts/review/review-round2.ts +103 -19
  728. package/scripts/review/review-stamps.ts +23 -1
  729. package/scripts/review/review-stop-log.ts +110 -0
  730. package/scripts/review/review-stops-cli.ts +86 -0
  731. package/scripts/review/review-submit-cli.ts +101 -0
  732. package/scripts/review/review-tree.ts +6 -17
  733. package/scripts/review/review-untouched-readers.ts +146 -0
  734. package/scripts/review/test-titles.ts +118 -0
  735. package/scripts/rules/agent-model.ts +9 -1
  736. package/scripts/rules/bash-triggers.ts +49 -6
  737. package/scripts/rules/concise-reply.ts +88 -0
  738. package/scripts/rules/credential-body.ts +77 -0
  739. package/scripts/rules/decision-oracle-batch.ts +9 -1
  740. package/scripts/rules/decision-oracle.ts +3 -3
  741. package/scripts/rules/delivered-rules.ts +115 -18
  742. package/scripts/rules/destructive-command.ts +11 -12
  743. package/scripts/rules/direct-filing.ts +10 -2
  744. package/scripts/rules/direct-issue-comment.ts +139 -0
  745. package/scripts/rules/direct-issue-read.ts +191 -0
  746. package/scripts/rules/direct-pr-create.ts +72 -26
  747. package/scripts/rules/early-heartbeat.ts +4 -1
  748. package/scripts/rules/edit-tool.ts +27 -0
  749. package/scripts/rules/file-body.ts +7 -0
  750. package/scripts/rules/file-edit-rows.ts +17 -0
  751. package/scripts/rules/file-rewrite.ts +146 -0
  752. package/scripts/rules/firing-point.ts +3 -2
  753. package/scripts/rules/gh-api.ts +128 -7
  754. package/scripts/rules/gh-repo-selector.ts +84 -0
  755. package/scripts/rules/git-argv.ts +72 -14
  756. package/scripts/rules/git-force.ts +14 -4
  757. package/scripts/rules/guard-remedy.ts +17 -4
  758. package/scripts/rules/implementation-cut-verdict.ts +1 -1
  759. package/scripts/rules/implementation-cut.ts +68 -27
  760. package/scripts/rules/index-guard.ts +8 -1
  761. package/scripts/rules/investigator-foreground.ts +231 -0
  762. package/scripts/rules/issue-citation.ts +15 -60
  763. package/scripts/rules/issue-comments.ts +18 -5
  764. package/scripts/rules/josh-git-bare.ts +7 -0
  765. package/scripts/rules/lane-background.ts +103 -33
  766. package/scripts/rules/lane-carry-conflict.ts +6 -0
  767. package/scripts/rules/lane-direct-tool.ts +172 -0
  768. package/scripts/rules/lane-interactive-ask.ts +12 -2
  769. package/scripts/rules/lane-park.ts +49 -25
  770. package/scripts/rules/lane-spilled-read.ts +90 -0
  771. package/scripts/rules/lane-split-park.ts +11 -3
  772. package/scripts/rules/lane-switch-main.ts +11 -4
  773. package/scripts/rules/last-prompt.ts +20 -47
  774. package/scripts/rules/oracle-consulted.ts +11 -1
  775. package/scripts/rules/oracle-firing.ts +1 -0
  776. package/scripts/rules/permission-guards.ts +7 -0
  777. package/scripts/rules/piped-verification-shapes.ts +110 -0
  778. package/scripts/rules/piped-verification.ts +68 -18
  779. package/scripts/rules/poll-loop.ts +78 -8
  780. package/scripts/rules/pr-merge.ts +123 -0
  781. package/scripts/rules/pre-gate-cut.ts +3 -3
  782. package/scripts/rules/protected-files.ts +113 -22
  783. package/scripts/rules/raw-field-body.ts +6 -0
  784. package/scripts/rules/reply-language.ts +3 -17
  785. package/scripts/rules/reply-prose.ts +34 -0
  786. package/scripts/rules/repo-admin.ts +132 -0
  787. package/scripts/rules/reviewer-foreground.ts +88 -0
  788. package/scripts/rules/round-one-check-related.ts +120 -0
  789. package/scripts/rules/rule-body-guard.ts +13 -15
  790. package/scripts/rules/rule-list.ts +9 -28
  791. package/scripts/rules/rule-value-cache.ts +57 -14
  792. package/scripts/rules/rule-value-candidates.ts +84 -0
  793. package/scripts/rules/rule-value-cli.ts +106 -39
  794. package/scripts/rules/rule-value.ts +18 -5
  795. package/scripts/rules/run-tail-rule.ts +1 -1
  796. package/scripts/rules/sed-in-place.ts +196 -0
  797. package/scripts/rules/shell-segments.ts +43 -0
  798. package/scripts/rules/stop-rule-rows.ts +52 -0
  799. package/scripts/rules/stop-rules.ts +36 -62
  800. package/scripts/rules/test-declared-commit.ts +11 -1
  801. package/scripts/rules/third-party-write.ts +115 -21
  802. package/scripts/rules/timed-rerun.ts +69 -0
  803. package/scripts/rules/turn-filings.ts +90 -0
  804. package/scripts/rules/worktree-guard.ts +32 -7
  805. package/scripts/run/board/run-board-app-name.ts +23 -0
  806. package/scripts/run/board/run-board-cli.ts +65 -32
  807. package/scripts/run/board/run-board-earlier.ts +94 -0
  808. package/scripts/run/board/run-board-ending-reason.ts +71 -0
  809. package/scripts/run/board/run-board-estimate-schedule.ts +103 -0
  810. package/scripts/run/board/run-board-estimate.ts +98 -0
  811. package/scripts/run/board/run-board-fit.ts +177 -37
  812. package/scripts/run/board/run-board-fold.ts +123 -0
  813. package/scripts/run/board/run-board-found.ts +134 -0
  814. package/scripts/run/board/run-board-fresh.ts +2 -2
  815. package/scripts/run/board/run-board-gather-live.ts +29 -0
  816. package/scripts/run/board/run-board-gather-thread.ts +189 -0
  817. package/scripts/run/board/run-board-gather-worker.ts +29 -0
  818. package/scripts/run/board/run-board-gather.ts +187 -0
  819. package/scripts/run/board/run-board-github.ts +118 -38
  820. package/scripts/run/board/run-board-header.ts +90 -20
  821. package/scripts/run/board/run-board-keys.ts +58 -0
  822. package/scripts/run/board/run-board-kind.ts +20 -6
  823. package/scripts/run/board/run-board-labels.ts +126 -71
  824. package/scripts/run/board/run-board-lane-state.ts +109 -0
  825. package/scripts/run/board/run-board-lane-time.ts +123 -0
  826. package/scripts/run/board/run-board-layout.ts +239 -60
  827. package/scripts/run/board/run-board-length.ts +52 -0
  828. package/scripts/run/board/run-board-link.ts +15 -2
  829. package/scripts/run/board/run-board-machine.ts +8 -4
  830. package/scripts/run/board/run-board-main.ts +12 -0
  831. package/scripts/run/board/run-board-notes.ts +59 -32
  832. package/scripts/run/board/run-board-now.ts +1 -1
  833. package/scripts/run/board/run-board-operation.ts +19 -35
  834. package/scripts/run/board/run-board-phase.ts +3 -6
  835. package/scripts/run/board/run-board-plan-shared.ts +115 -0
  836. package/scripts/run/board/run-board-plan.ts +56 -4
  837. package/scripts/run/board/run-board-planning.ts +45 -0
  838. package/scripts/run/board/run-board-priority.ts +44 -0
  839. package/scripts/run/board/run-board-process-groups.ts +195 -0
  840. package/scripts/run/board/run-board-read.ts +197 -28
  841. package/scripts/run/board/run-board-reason.ts +247 -51
  842. package/scripts/run/board/run-board-released.ts +35 -0
  843. package/scripts/run/board/run-board-render-checks.ts +42 -7
  844. package/scripts/run/board/run-board-render-condition.ts +96 -0
  845. package/scripts/run/board/run-board-render-drawn.ts +78 -0
  846. package/scripts/run/board/run-board-render-foot.ts +59 -0
  847. package/scripts/run/board/run-board-render-found.ts +157 -0
  848. package/scripts/run/board/run-board-render-icon.ts +35 -0
  849. package/scripts/run/board/run-board-render-lanes.ts +145 -0
  850. package/scripts/run/board/run-board-render-lead.ts +89 -0
  851. package/scripts/run/board/run-board-render-legend.ts +136 -48
  852. package/scripts/run/board/run-board-render-notes.ts +156 -29
  853. package/scripts/run/board/run-board-render-processes.ts +196 -0
  854. package/scripts/run/board/run-board-render-section.ts +119 -0
  855. package/scripts/run/board/run-board-render-slot.ts +3 -36
  856. package/scripts/run/board/run-board-render-tail.ts +115 -48
  857. package/scripts/run/board/run-board-render-time.ts +56 -0
  858. package/scripts/run/board/run-board-render-title.ts +117 -24
  859. package/scripts/run/board/run-board-render-waits.ts +104 -20
  860. package/scripts/run/board/run-board-render.ts +264 -258
  861. package/scripts/run/board/run-board-roots.ts +54 -0
  862. package/scripts/run/board/run-board-row-yield.ts +9 -4
  863. package/scripts/run/board/run-board-setup.ts +1 -12
  864. package/scripts/run/board/run-board-snapshot.ts +111 -0
  865. package/scripts/run/board/run-board-spin.ts +3 -5
  866. package/scripts/run/board/run-board-state.ts +22 -33
  867. package/scripts/run/board/run-board-status.ts +149 -71
  868. package/scripts/run/board/run-board-thanks-read.ts +2 -2
  869. package/scripts/run/board/run-board-tick.ts +158 -114
  870. package/scripts/run/board/run-board-usage-board.ts +78 -0
  871. package/scripts/run/board/run-board-usage-lanes.ts +113 -0
  872. package/scripts/run/board/run-board-usage-listing.ts +93 -0
  873. package/scripts/run/board/run-board-usage-read.ts +120 -150
  874. package/scripts/run/board/run-board-usage-rusage.ts +19 -7
  875. package/scripts/run/board/run-board-usage-text.ts +139 -51
  876. package/scripts/run/board/run-board-usage-top.ts +102 -0
  877. package/scripts/run/board/run-board-usage.ts +89 -72
  878. package/scripts/run/board/run-board-usual.ts +20 -9
  879. package/scripts/run/carry/run-carry-args.ts +4 -7
  880. package/scripts/run/carry/run-carry-conversation.ts +1 -1
  881. package/scripts/run/carry/run-carry-ended.ts +3 -2
  882. package/scripts/run/carry/run-carry.ts +12 -6
  883. package/scripts/run/cut/run-cut-cli.ts +33 -133
  884. package/scripts/run/cut/run-cut-digest.ts +152 -0
  885. package/scripts/run/cut/run-cut-handoff.ts +54 -10
  886. package/scripts/run/cut/run-cut-report.ts +24 -3
  887. package/scripts/run/cut/run-cut-resume.ts +129 -0
  888. package/scripts/run/cut/run-cut-review.ts +105 -0
  889. package/scripts/run/cut/run-cut.ts +18 -7
  890. package/scripts/run/detached-launch.ts +1 -1
  891. package/scripts/run/entry/run-entry-cli.ts +88 -19
  892. package/scripts/run/entry/run-entry-spill.ts +83 -0
  893. package/scripts/run/entry/run-entry-stop.ts +5 -1
  894. package/scripts/run/entry/run-entry-trust.ts +91 -0
  895. package/scripts/run/event/run-event-baseline.ts +56 -0
  896. package/scripts/run/event/run-event-cli.ts +1 -5
  897. package/scripts/run/event/run-event-filed.ts +18 -6
  898. package/scripts/run/event/run-event-follow.ts +2 -3
  899. package/scripts/run/event/run-event-overrun.ts +197 -0
  900. package/scripts/run/event/run-event-render.ts +10 -10
  901. package/scripts/run/event/run-event-scope.ts +2 -2
  902. package/scripts/run/event/run-event-stream-emit.ts +82 -22
  903. package/scripts/run/event/run-event-stream.ts +58 -10
  904. package/scripts/run/hold/run-hold-adopt.ts +65 -0
  905. package/scripts/run/hold/run-hold-cli.ts +93 -22
  906. package/scripts/run/hold/run-hold-main.ts +12 -0
  907. package/scripts/run/hold/run-hold-member.ts +37 -0
  908. package/scripts/run/hold/run-stop-notify.ts +178 -0
  909. package/scripts/run/merge/run-merge-auth.ts +31 -0
  910. package/scripts/run/merge/run-merge-cap.ts +57 -0
  911. package/scripts/run/merge/run-merge-cli.ts +119 -62
  912. package/scripts/run/merge/run-merge-close.ts +74 -0
  913. package/scripts/run/merge/run-merge-collect.ts +6 -13
  914. package/scripts/run/merge/run-merge-driver.ts +71 -0
  915. package/scripts/run/merge/run-merge-main.ts +12 -0
  916. package/scripts/run/merge/run-merge-outcome.ts +25 -0
  917. package/scripts/run/merge/run-merge-restart.ts +39 -0
  918. package/scripts/run/merge/run-merge-ship.ts +33 -7
  919. package/scripts/run/merge/run-merge-signals.ts +66 -25
  920. package/scripts/run/merge/run-merge-steps.ts +162 -107
  921. package/scripts/run/merge/run-merge-usage-limit.ts +53 -0
  922. package/scripts/run/merge/run-merge-withdrawn.ts +53 -0
  923. package/scripts/run/merge/run-merge.ts +76 -48
  924. package/scripts/run/park/run-park-cli.ts +91 -0
  925. package/scripts/run/park/run-park.ts +88 -0
  926. package/scripts/run/park/run-stalled.ts +68 -0
  927. package/scripts/run/pause/run-pause-cli.ts +73 -0
  928. package/scripts/run/pause/run-pause.ts +251 -0
  929. package/scripts/run/progress/run-progress-cli.ts +4 -12
  930. package/scripts/run/progress/run-progress-clock.ts +1 -1
  931. package/scripts/run/progress/run-progress-config.ts +6 -14
  932. package/scripts/run/progress/run-progress-main.ts +12 -0
  933. package/scripts/run/progress/run-progress.ts +1 -4
  934. package/scripts/run/review/run-review-cli.ts +306 -20
  935. package/scripts/run/review/run-review-early-push.ts +121 -0
  936. package/scripts/run/review/run-review-join-read.ts +94 -0
  937. package/scripts/run/review/run-review-pinned-accepted.ts +126 -0
  938. package/scripts/run/review/run-review-pinned-join.ts +216 -0
  939. package/scripts/run/review/run-review-pinned-steps.ts +383 -0
  940. package/scripts/run/review/run-review-pinned-tree.ts +37 -0
  941. package/scripts/run/review/run-review-pinned.ts +53 -0
  942. package/scripts/run/review/run-review-steps.ts +70 -34
  943. package/scripts/run/review/run-review.ts +28 -7
  944. package/scripts/run/run-ending.ts +1 -0
  945. package/scripts/run/run-invocation.ts +5 -6
  946. package/scripts/run/run-liveness-cli.ts +6 -8
  947. package/scripts/run/run-liveness.ts +60 -29
  948. package/scripts/run/run-next.ts +1 -1
  949. package/scripts/run/run-parent-cut-hook.ts +3 -4
  950. package/scripts/run/run-preflight.ts +18 -3
  951. package/scripts/run/run-prep-cli.ts +1 -10
  952. package/scripts/run/run-prep-locate.ts +7 -50
  953. package/scripts/run/run-prep-main.ts +12 -0
  954. package/scripts/run/run-prep.ts +7 -0
  955. package/scripts/run/run-report-cli.ts +101 -13
  956. package/scripts/run/run-report-handoff.ts +114 -0
  957. package/scripts/run/run-stage-read.ts +2 -6
  958. package/scripts/run/run-step-cli.ts +17 -5
  959. package/scripts/run/run-step-lane-plan.ts +27 -0
  960. package/scripts/run/run-step-section.ts +26 -7
  961. package/scripts/run/run-step.ts +6 -3
  962. package/scripts/run/run-stranded-detect.ts +13 -0
  963. package/scripts/run/run-watcher-guard-cli.ts +1 -1
  964. package/scripts/run/run-watcher-guard.ts +1 -1
  965. package/scripts/run/ship/run-ship-args.ts +140 -0
  966. package/scripts/run/ship/run-ship-body-draft.ts +110 -0
  967. package/scripts/run/ship/run-ship-brokered-review.ts +106 -0
  968. package/scripts/run/ship/run-ship-cli.ts +181 -166
  969. package/scripts/run/ship/run-ship-conflict-probe.ts +59 -0
  970. package/scripts/run/ship/run-ship-detach.ts +29 -12
  971. package/scripts/run/ship/run-ship-handover.ts +106 -0
  972. package/scripts/run/ship/run-ship-infra-retry.ts +74 -0
  973. package/scripts/run/ship/run-ship-lap.ts +63 -0
  974. package/scripts/run/ship/run-ship-next.ts +44 -27
  975. package/scripts/run/ship/run-ship-overlap.ts +49 -7
  976. package/scripts/run/ship/run-ship-place.ts +103 -0
  977. package/scripts/run/ship/run-ship-planned.ts +92 -0
  978. package/scripts/run/ship/run-ship-pre-detach-pinned.ts +197 -0
  979. package/scripts/run/ship/run-ship-pre-detach-timed.ts +42 -0
  980. package/scripts/run/ship/run-ship-pre-detach.ts +144 -33
  981. package/scripts/run/ship/run-ship-preflight.ts +150 -33
  982. package/scripts/run/ship/run-ship-probe.ts +28 -6
  983. package/scripts/run/ship/run-ship-relaunch-cap.ts +106 -0
  984. package/scripts/run/ship/run-ship-relaunch.ts +51 -0
  985. package/scripts/run/ship/run-ship-removed-rows.ts +61 -0
  986. package/scripts/run/ship/run-ship-return.ts +183 -25
  987. package/scripts/run/ship/run-ship-review-reason.ts +24 -0
  988. package/scripts/run/ship/run-ship-review-steps.ts +296 -171
  989. package/scripts/run/ship/run-ship-review.ts +222 -35
  990. package/scripts/run/ship/run-ship-reviewer.ts +303 -0
  991. package/scripts/run/ship/run-ship-scoped.ts +39 -10
  992. package/scripts/run/ship/run-ship-stage.ts +101 -16
  993. package/scripts/run/ship/run-ship-steps.ts +68 -17
  994. package/scripts/run/ship/run-ship-stop-cause.ts +176 -0
  995. package/scripts/run/ship/run-ship-stop-context.ts +50 -13
  996. package/scripts/run/ship/run-ship-stop-text.ts +11 -6
  997. package/scripts/run/ship/run-ship-sync.ts +212 -34
  998. package/scripts/run/ship/run-ship-synced-scope.ts +178 -0
  999. package/scripts/run/ship/run-ship-wait-cli.ts +145 -0
  1000. package/scripts/run/ship/run-ship-waiter.ts +114 -0
  1001. package/scripts/run/ship/run-ship.ts +44 -2
  1002. package/scripts/run/tidy/run-tidy-cli.ts +0 -4
  1003. package/scripts/run/tidy/run-tidy-lanes.ts +3 -0
  1004. package/scripts/run/tidy/run-tidy-main.ts +8 -0
  1005. package/scripts/run/wake/run-wake-caffeinate.ts +48 -0
  1006. package/scripts/run/wake/run-wake-cli.ts +121 -209
  1007. package/scripts/run/wake/run-wake-code.ts +125 -0
  1008. package/scripts/run/wake/run-wake-driver.ts +22 -9
  1009. package/scripts/run/wake/run-wake-finish.ts +137 -0
  1010. package/scripts/run/wake/run-wake-loop.ts +36 -3
  1011. package/scripts/run/wake/run-wake-main.ts +13 -0
  1012. package/scripts/run/wake/run-wake-ports.ts +98 -0
  1013. package/scripts/run/wake/run-wake-session.ts +2 -0
  1014. package/scripts/run/wake/run-wake-takeover.ts +66 -0
  1015. package/scripts/run/wake/run-wake.ts +5 -3
  1016. package/scripts/safe-chain/ci-installer-pin.ts +49 -8
  1017. package/scripts/safe-chain/pack-hook.ts +2 -2
  1018. package/scripts/safe-chain/preinstall-command.ts +2 -1
  1019. package/scripts/safe-chain/project-config.ts +6 -11
  1020. package/scripts/security/secretlint-scan.ts +42 -9
  1021. package/scripts/security/security-audit-main.ts +8 -0
  1022. package/scripts/security/security-audit-provision-logic.ts +0 -11
  1023. package/scripts/security/security-audit-provision-main.ts +20 -0
  1024. package/scripts/security/security-audit-provision.ts +12 -27
  1025. package/scripts/security/security-audit.ts +27 -8
  1026. package/scripts/security/sonar-file.ts +10 -5
  1027. package/scripts/self-sync-guard/self-sync-guard-logic.ts +6 -13
  1028. package/scripts/split/split-assess-cli.ts +2 -2
  1029. package/scripts/split/split-assess.ts +25 -1
  1030. package/scripts/split/split-early-notice.ts +116 -0
  1031. package/scripts/split/split-measure.ts +83 -0
  1032. package/scripts/split/split-resolution.ts +107 -0
  1033. package/scripts/sync/claude-settings-merge.ts +8 -15
  1034. package/scripts/sync/directory-copy-guard.ts +4 -9
  1035. package/scripts/sync/file-content.ts +78 -8
  1036. package/scripts/sync/sync-ai-files.ts +3 -5
  1037. package/scripts/sync/sync-configs.ts +11 -23
  1038. package/scripts/sync/sync-hook-safety.ts +4 -10
  1039. package/scripts/sync/sync-main.ts +11 -0
  1040. package/scripts/sync/sync.ts +25 -37
  1041. package/scripts/test/direct-importers.ts +185 -0
  1042. package/scripts/test/pure-files-entries.ts +83 -0
  1043. package/scripts/test/related-heavy-tests.ts +81 -0
  1044. package/scripts/test/test-declared-changed.ts +2 -2
  1045. package/scripts/test/test-declared.ts +1 -1
  1046. package/scripts/test/test-e2e-guard.ts +25 -1
  1047. package/scripts/test/test-e2e-stamp.ts +38 -0
  1048. package/scripts/test/test-no-base.ts +88 -0
  1049. package/scripts/test/test-pinned-cache-logic.ts +363 -0
  1050. package/scripts/test/test-pinned-cache.ts +337 -0
  1051. package/scripts/test/test-pinned-emit.ts +49 -0
  1052. package/scripts/test/test-pinned-functions.ts +116 -0
  1053. package/scripts/test/test-pinned-ledger.ts +80 -0
  1054. package/scripts/test/test-pinned-logic.ts +333 -0
  1055. package/scripts/test/test-pinned-main.ts +144 -0
  1056. package/scripts/test/test-pinned-pool.ts +73 -0
  1057. package/scripts/test/test-pinned-probe.ts +254 -0
  1058. package/scripts/test/test-pinned-prune-logic.ts +118 -0
  1059. package/scripts/test/test-pinned-reach.ts +194 -0
  1060. package/scripts/test/test-pinned-record.ts +196 -0
  1061. package/scripts/test/test-pinned-rewire.ts +148 -0
  1062. package/scripts/test/test-pinned-spawn.ts +81 -0
  1063. package/scripts/test/test-pinned-stage.ts +70 -0
  1064. package/scripts/test/test-pinned.ts +311 -0
  1065. package/scripts/test/test-reach-cli.ts +61 -0
  1066. package/scripts/test/test-read-map.ts +288 -0
  1067. package/scripts/test/test-read-recording.ts +103 -0
  1068. package/scripts/test/test-read-trace.ts +166 -0
  1069. package/scripts/test/test-red-logic.ts +46 -7
  1070. package/scripts/test/test-red-main.ts +12 -0
  1071. package/scripts/test/test-red.ts +39 -37
  1072. package/scripts/test/test-related-claim.ts +37 -0
  1073. package/scripts/test/test-related-main.ts +21 -0
  1074. package/scripts/test/test-related-moved.ts +91 -0
  1075. package/scripts/test/test-related-record.ts +139 -0
  1076. package/scripts/test/test-related-scope.ts +292 -41
  1077. package/scripts/test/test-related-synced.ts +135 -0
  1078. package/scripts/test/test-related-touched.ts +84 -0
  1079. package/scripts/test/test-related.ts +381 -19
  1080. package/scripts/test/test-unit-guard-main.ts +15 -0
  1081. package/scripts/test/test-unit-guard.ts +66 -25
  1082. package/scripts/test/unit-count-file.ts +37 -0
  1083. package/scripts/test/unit-durations.ts +41 -0
  1084. package/scripts/test/unit-run-marker.ts +162 -0
  1085. package/scripts/test/unit-setup-files.ts +51 -0
  1086. package/scripts/test/unit-worker-share.ts +64 -151
  1087. package/scripts/test/vitest-cache-directory.ts +19 -0
  1088. package/scripts/test/vitest-cli-excludes.ts +14 -0
  1089. package/scripts/test/vitest-failure-summary.ts +111 -0
  1090. package/scripts/test/whole-suite-files.ts +74 -0
  1091. package/scripts/time-runtime/time-background.ts +20 -2
  1092. package/scripts/time-runtime/time-batch-guard.ts +42 -4
  1093. package/scripts/time-runtime/time-bundle-call.ts +1 -1
  1094. package/scripts/time-runtime/time-bundles.ts +40 -8
  1095. package/scripts/time-runtime/time-density-hook.ts +8 -6
  1096. package/scripts/time-runtime/time-followup-stage.ts +1 -3
  1097. package/scripts/time-runtime/time-format.ts +5 -28
  1098. package/scripts/time-runtime/time-markers.ts +12 -3
  1099. package/scripts/time-runtime/time-search-call.ts +38 -0
  1100. package/scripts/time-runtime/time-shell.ts +98 -11
  1101. package/scripts/time-runtime/time-transcript-line.ts +65 -66
  1102. package/scripts/uninstall/uninstall.ts +1 -1
  1103. package/scripts/version/bump-version-main.ts +12 -0
  1104. package/scripts/version/bump-version.ts +25 -25
  1105. package/scripts/version/development-engines-verdict.ts +124 -0
  1106. package/scripts/version/effective-upstream.ts +6 -12
  1107. package/scripts/version/latest-corepack.ts +19 -32
  1108. package/scripts/version/latest-if-required-cli.ts +93 -0
  1109. package/scripts/version/latest-lane-guard-main.ts +8 -0
  1110. package/scripts/version/latest-lane-guard.ts +0 -4
  1111. package/scripts/version/latest-scope-cli.ts +0 -9
  1112. package/scripts/version/latest-scope-main.ts +12 -0
  1113. package/scripts/version/latest-update.ts +5 -5
  1114. package/scripts/version/npm-registry.ts +44 -6
  1115. package/scripts/version/publishable-range-check.ts +5 -16
  1116. package/scripts/version/release-age.ts +1 -1
  1117. package/scripts/version/release-hold.ts +1 -1
  1118. package/scripts/version/release-window.ts +38 -0
  1119. package/scripts/version/running-binary.ts +1 -1
  1120. package/scripts/version/safe-chain-version-update.ts +3 -8
  1121. package/scripts/version/version-targets.ts +6 -28
  1122. package/templates/dependabot.yml +29 -0
  1123. package/templates/gitignore +6 -1
  1124. package/templates/pnpm-workspace.basic.yaml +1 -1
  1125. package/templates/sonar-project.properties +3 -2
  1126. package/templates/workflows/ci.yml +53 -4
  1127. package/templates/workflows/github-release.yml +4 -0
  1128. package/tsconfig.sonar.json +1 -1
  1129. package/.ncurc.json +0 -3
  1130. package/dist/hooks/batch-guard.js +0 -29
  1131. package/dist/hooks/chunk-4KKD2UTK.js +0 -66
  1132. package/dist/hooks/chunk-6TS2JD6D.js +0 -237
  1133. package/dist/hooks/chunk-7DSBJVFH.js +0 -50
  1134. package/dist/hooks/chunk-A65Y4YOR.js +0 -79
  1135. package/dist/hooks/chunk-APUO6U4J.js +0 -2451
  1136. package/dist/hooks/chunk-CDY4NFQG.js +0 -15
  1137. package/dist/hooks/chunk-DGT54IH5.js +0 -161
  1138. package/dist/hooks/chunk-EFXE6C37.js +0 -81
  1139. package/dist/hooks/chunk-GP4IEC4O.js +0 -20
  1140. package/dist/hooks/chunk-JP45SOCJ.js +0 -56
  1141. package/dist/hooks/chunk-LAOV7NLM.js +0 -45
  1142. package/dist/hooks/chunk-M4HGZV7U.js +0 -83
  1143. package/dist/hooks/chunk-O6GDRNJB.js +0 -343
  1144. package/dist/hooks/chunk-PF2NZL2A.js +0 -131
  1145. package/dist/hooks/chunk-PTICX4OL.js +0 -358
  1146. package/dist/hooks/chunk-RT27QRJW.js +0 -6247
  1147. package/dist/hooks/chunk-SYOTDYCI.js +0 -3533
  1148. package/dist/hooks/chunk-TNUMY6NL.js +0 -4838
  1149. package/dist/hooks/chunk-UPUZF3AN.js +0 -279
  1150. package/dist/hooks/chunk-WK6SMBIC.js +0 -3180
  1151. package/dist/hooks/duplicate-read-guard.js +0 -30
  1152. package/dist/hooks/investigation-guard.js +0 -29
  1153. package/scripts/backlog/backlog-stalled-cli.ts +0 -30
  1154. package/scripts/cost-runtime/context-cut-threshold.ts +0 -11
  1155. package/scripts/cost-runtime/cost-format.ts +0 -29
  1156. package/scripts/init/basic-path-migration.ts +0 -24
  1157. package/scripts/issue/issue-backlinks-cli.ts +0 -93
  1158. package/scripts/josh/josh-commands-guard.ts +0 -38
  1159. package/scripts/josh/josh-usage-automation.ts +0 -121
  1160. package/scripts/josh/josh-usage-backlog.ts +0 -180
  1161. package/scripts/josh/josh-usage-developer.ts +0 -230
  1162. package/scripts/josh/josh-usage-hooks.ts +0 -38
  1163. package/scripts/josh/josh-usage-issue.ts +0 -205
  1164. package/scripts/josh/josh-usage-review.ts +0 -101
  1165. package/scripts/josh/josh-usage-run.ts +0 -252
  1166. package/scripts/josh/josh-usage-session.ts +0 -238
  1167. package/scripts/josh/josh-usage-workflow.ts +0 -212
  1168. package/scripts/lint/cross-file-recheck.ts +0 -155
  1169. package/scripts/registry-migration/migrate-logic.ts +0 -237
  1170. package/scripts/registry-migration/migrate.ts +0 -292
  1171. package/scripts/registry-migration/user-npmrc.ts +0 -15
  1172. package/scripts/rules/filing-cap.ts +0 -132
  1173. package/scripts/rules/rule-guard.ts +0 -23
  1174. package/scripts/rules/rule-registry-rows.ts +0 -292
  1175. package/scripts/rules/rule-registry.ts +0 -112
  1176. package/scripts/run/run-stranded-cli.ts +0 -27
@@ -27,7 +27,7 @@ import { MERGED_STATE, to_gh_state } from './git-gh-rest-state'
27
27
  // branch name that says nothing about which repository holds it. Named once
28
28
  // because both sides of a pull request carry the same shape.
29
29
  const rest_repo_schema = z.looseObject({ full_name: z.string().optional() }).nullish()
30
- const rest_pull_side_schema = z.looseObject({ repo: rest_repo_schema })
30
+ const rest_pull_side_schema = z.looseObject({ ref: z.string().optional(), repo: rest_repo_schema })
31
31
 
32
32
  type RestPullSide = z.infer<typeof rest_pull_side_schema>
33
33
 
@@ -145,7 +145,8 @@ function to_pr_info(pull: RestPull): Record<string, unknown> {
145
145
 
146
146
  // The conversation comments in the shape `gh pr view --json comments` answered with. A listing that
147
147
  // will not parse throws rather than answering an empty one — `git-pr-ai-review.ts` reads an empty
148
- // listing as "no reviewer left a finding" and merges.
148
+ // listing as "no reviewer left a finding" and merges. `updatedAt` is when CodeRabbit last rewrote its
149
+ // rate-limit notice, the moment its stated window counts from (joshuafolkken/kit#5289).
149
150
  function to_pr_comments(rest_json: string): Array<Record<string, unknown>> {
150
151
  const parsed = parse_json_array_or_undefined(rest_json, rest_comment_schema)
151
152
  if (parsed === undefined) throw new Error(NOT_A_COMMENT_LISTING_MESSAGE)
@@ -154,6 +155,7 @@ function to_pr_comments(rest_json: string): Array<Record<string, unknown>> {
154
155
  body: comment.body ?? EMPTY_BODY,
155
156
  url: comment.html_url,
156
157
  author: { login: comment.user?.login },
158
+ updatedAt: comment.updated_at,
157
159
  }))
158
160
  }
159
161
 
@@ -1,12 +1,16 @@
1
1
  import { FULL_PAGE_QUERY, git_gh_api_path } from './git-gh-api-path'
2
+ import { git_gh_branch_rules } from './git-gh-branch-rules'
2
3
  import { git_gh_exec } from './git-gh-exec'
3
- import { read_pull, require_pr_number } from './git-gh-pr-read'
4
+ import { git_gh_poll_read } from './git-gh-poll-read'
5
+ import { git_gh_pr_graphql_state } from './git-gh-pr-graphql-state'
6
+ import { read_listed_pull, read_pull, require_pr_number } from './git-gh-pr-read'
4
7
  import type { RestPull } from './git-gh-pr-rest'
5
8
  import { git_gh_pr_review } from './git-gh-pr-review'
6
9
  import { git_gh_pr_rollup } from './git-gh-pr-rollup'
7
10
  import { to_gh_state } from './git-gh-rest-state'
8
11
 
9
- // The merge gate's pull request state snapshot, rebuilt from REST.
12
+ // The merge gate's pull request state snapshot, rebuilt from REST — GraphQL only for the merge state
13
+ // of a pull request whose REST detail GitHub refuses as too large (`resolve_pull`).
10
14
  //
11
15
  // `gh pr view --json mergeStateStatus,reviewDecision,statusCheckRollup` is answered 403 in a cloud
12
16
  // session, and all three fields are GraphQL-only: one has no REST
@@ -19,17 +23,6 @@ import { to_gh_state } from './git-gh-rest-state'
19
23
 
20
24
  const NO_HEAD_SHA_MESSAGE = 'gh api answered a pull request with no head commit'
21
25
 
22
- // Both commit endpoints answer an *object* wrapping the listing, so `--paginate` alone would emit
23
- // one document per page and `JSON.parse` would reject the pair; `--slurp` wraps the pages in one
24
- // outer array instead (`git-gh-exec.ts` → `GhApiRequest`).
25
- async function read_object_pages(path: string): Promise<string> {
26
- return await git_gh_exec.exec_gh_api({
27
- path: `${path}${FULL_PAGE_QUERY}`,
28
- should_paginate: true,
29
- should_slurp: true,
30
- })
31
- }
32
-
33
26
  // The reviews endpoint answers a bare array, whose pages `gh` merges into one array on its own —
34
27
  // slurping it would produce `[[…],[…]]`, which the listing schema then rejects.
35
28
  async function read_array_pages(path: string): Promise<string> {
@@ -47,11 +40,12 @@ function read_head_sha(pull: RestPull): string {
47
40
  }
48
41
 
49
42
  // One pull request's rollup: the check runs and the status contexts, read from the head commit and
50
- // merged back into the single array `gh` answered with.
43
+ // merged back into the single array `gh` answered with. Both endpoints answer an *object* wrapping the
44
+ // listing, so their pages arrive slurped into one outer array (`git-gh-poll-read.ts`).
51
45
  async function read_status_check_rollup(commit_sha: string): Promise<Array<object>> {
52
46
  const [check_runs_json, status_json] = await Promise.all([
53
- read_object_pages(git_gh_api_path.commit_check_runs_api_path(commit_sha)),
54
- read_object_pages(git_gh_api_path.commit_status_api_path(commit_sha)),
47
+ git_gh_poll_read.read_object_pages(git_gh_api_path.commit_check_runs_api_path(commit_sha)),
48
+ git_gh_poll_read.read_object_pages(git_gh_api_path.commit_status_api_path(commit_sha)),
55
49
  ])
56
50
 
57
51
  return git_gh_pr_rollup.to_status_check_rollup({ check_runs_json, status_json })
@@ -69,10 +63,24 @@ async function pr_get_review_decision(pr_number: number): Promise<string> {
69
63
  // `git-pr-checks-eval.ts` compares strictly against: `MERGE_STATE_CLEAN` never matches a lower-case
70
64
  // `clean`, which would also take every pull request out of the CodeRabbit non-blocking exemption
71
65
  // keyed on `UNSTABLE`. The rule is shared with `to_pr_info` rather than written twice.
66
+ //
67
+ // **`headRefOid` is the commit the rollup was read from**, in `gh`'s spelling, so a merge can be bound
68
+ // to the head whose checks passed rather than to whatever the branch points at by then (#4036).
69
+ //
70
+ // **`requiredContexts` is the base branch's required checks** (`git-gh-branch-rules.ts`), which the
71
+ // merge gate reads to accept an `UNSTABLE` pull request held only by an optional check.
72
72
  async function build_checks_fields(pull: RestPull): Promise<Record<string, unknown>> {
73
+ const head_sha = read_head_sha(pull)
74
+ const [rollup, required_contexts] = await Promise.all([
75
+ read_status_check_rollup(head_sha),
76
+ git_gh_branch_rules.read_required_contexts(pull.base?.ref),
77
+ ])
78
+
73
79
  return {
74
- statusCheckRollup: await read_status_check_rollup(read_head_sha(pull)),
80
+ statusCheckRollup: rollup,
75
81
  mergeStateStatus: to_gh_state(pull.mergeable_state),
82
+ headRefOid: head_sha,
83
+ requiredContexts: required_contexts,
76
84
  }
77
85
  }
78
86
 
@@ -81,12 +89,32 @@ interface ResolvedPull {
81
89
  pull: RestPull
82
90
  }
83
91
 
84
- // The resolution and the detail read, which every path below needs and which the branch → number
85
- // memo in `git-gh-pr-read.ts` makes free after the first poll.
92
+ // The resolution and the detail read, which every path below needs. The branch → number memo in
93
+ // `git-gh-pr-read.ts` makes the first free after the first poll.
94
+ //
95
+ // **The detail is read without an ETag.** GitHub computes `mergeable_state` lazily and can change it
96
+ // under an unchanged ETag, so a 304 answered from the poll cache kept the gate reading a stale
97
+ // `blocked` on a pull request that had turned `clean` (joshuafolkken/kit#4589).
98
+ //
99
+ // **A detail GitHub refuses as too many files changed** is stood in for by the listing row, whose
100
+ // missing `mergeable_state` is read from GraphQL (`git-gh-pr-graphql-state.ts`) — or the snapshot
101
+ // throws with the reason, since an unknown state would hold the gate pending until its budget ran out.
102
+ async function read_detail_or_listed(branch_name: string, pr_number: number): Promise<RestPull> {
103
+ try {
104
+ return await read_pull(pr_number)
105
+ } catch (error) {
106
+ const listed = await read_listed_pull(error, branch_name, pr_number)
107
+ if (listed === undefined) throw error
108
+ const state = await git_gh_pr_graphql_state.read_merge_state_status(listed, error)
109
+
110
+ return { ...listed, mergeable_state: state }
111
+ }
112
+ }
113
+
86
114
  async function resolve_pull(branch_name: string): Promise<ResolvedPull> {
87
115
  const pr_number = await require_pr_number(branch_name)
88
116
 
89
- return { pr_number, pull: await read_pull(pr_number) }
117
+ return { pr_number, pull: await read_detail_or_listed(branch_name, pr_number) }
90
118
  }
91
119
 
92
120
  // Everything the snapshot carries except the review decision: three requests rather than four.
@@ -0,0 +1,20 @@
1
+ import { error_text } from '#scripts/lib/error-message'
2
+ import { gh_failure } from './git-gh-failure'
3
+
4
+ // GitHub refuses the single-pull JSON (`GET /pulls/{N}`) of some pull requests with
5
+ // `HTTP 422: … too many files changed`, every time, however few files the pull request changes — while
6
+ // the listing, the files, the diff and GraphQL all answer for the same one (joshuafolkken/kit#5226).
7
+ // The refusal is about that one response, so the branch-keyed reads fall back to the listing row
8
+ // rather than reporting the pull request unreadable.
9
+ const UNPROCESSABLE_STATUS = 422
10
+ const TOO_MANY_FILES_TEXT = 'too many files changed'
11
+
12
+ function is_too_many_files(error: unknown): boolean {
13
+ if (gh_failure.failure_of(error)?.status !== UNPROCESSABLE_STATUS) return false
14
+
15
+ return error_text.message_of(error).includes(TOO_MANY_FILES_TEXT)
16
+ }
17
+
18
+ const git_gh_pr_too_large = { is_too_many_files }
19
+
20
+ export { git_gh_pr_too_large }
@@ -1,12 +1,18 @@
1
1
  import { pr_classification, type ReleaseClassification } from '#scripts/ci/pr-classification'
2
2
  import { git_command } from '#scripts/git/git-command'
3
3
  import { poll } from '#scripts/lib/poll'
4
- import { z } from 'zod'
5
4
  import { git_gh_api_path } from './git-gh-api-path'
6
5
  import { git_gh_exec } from './git-gh-exec'
6
+ import { gh_failure } from './git-gh-failure'
7
7
  import { git_gh_helpers } from './git-gh-helpers'
8
8
  import { git_gh_issue_write } from './git-gh-issue-write'
9
- import { forget_pr_numbers, git_gh_pr_read, read_pull, require_pr_number } from './git-gh-pr-read'
9
+ import {
10
+ forget_pr_numbers,
11
+ git_gh_pr_read,
12
+ read_pull,
13
+ read_pull_or_listed,
14
+ require_pr_number,
15
+ } from './git-gh-pr-read'
10
16
  import { git_gh_pr_rest } from './git-gh-pr-rest'
11
17
  import { git_gh_pr_snapshot } from './git-gh-pr-snapshot'
12
18
 
@@ -49,25 +55,27 @@ const MERGE_UNCONFIRMED_MESSAGE =
49
55
  'gh api could not read the pull request back after the merge request failed'
50
56
  const MERGE_READ_BACK_ATTEMPTS = 3
51
57
  const MERGE_READ_BACK_INTERVAL_MS = 1000
58
+ // `PUT pulls/{N}/merge` with a `sha` that is no longer the branch head.
59
+ const HEAD_MOVED_STATUS = 409
52
60
  const PR_NUMBER_PATTERN = /\/pull\/([1-9]\d*)$/u
53
- const LABELS_SEGMENT = '/labels'
54
- const PR_LABELS = z.array(z.object({ name: z.string() }))
55
61
 
62
+ // A pull request is an issue to the labels endpoint, so the write is the issue one: a failed answer
63
+ // is confirmed by reading the labels back before it is reported as a failed write.
56
64
  async function add_pr_classification(number: string, label: ReleaseClassification): Promise<void> {
57
- await git_gh_exec.exec_gh_api({
58
- path: `${git_gh_api_path.issue_api_path(number)}${LABELS_SEGMENT}`,
59
- body: JSON.stringify({ labels: [label] }),
60
- })
65
+ const write = await git_gh_issue_write.issue_apply_label(number, label)
66
+
67
+ if (!write.is_applied) throw new Error(write.reason)
61
68
  }
62
69
 
70
+ // Labels that could not be read are not "no classification": answering that would add a second
71
+ // classification beside the one a person already put on the pull request.
63
72
  async function pr_get_classification(
64
73
  branch_name: string,
65
74
  ): Promise<ReleaseClassification | undefined> {
66
75
  const number = await require_pr_number(branch_name)
67
- const response = await git_gh_exec.exec_gh_api({
68
- path: `${git_gh_api_path.issue_api_path(String(number))}${LABELS_SEGMENT}`,
69
- })
70
- const names = PR_LABELS.parse(JSON.parse(response)).map((label) => label.name.toLowerCase())
76
+ const labels = await git_gh_issue_write.read_label_names(String(number))
77
+ if (labels === undefined) throw new Error(`Unreadable labels on branch ${branch_name}`)
78
+ const names = labels.map((name) => name.toLowerCase())
71
79
  const selected = names.filter((name) => pr_classification.is_classification(name))
72
80
  if (selected.length === 0) return undefined
73
81
 
@@ -166,21 +174,34 @@ async function pr_update_body(branch_name: string, body: string): Promise<void>
166
174
  }
167
175
 
168
176
  // A merge moves the remembered detail read's state, so it is cleared first.
169
- async function put_merge(pr_number: number): Promise<void> {
177
+ //
178
+ // **`sha` binds the merge to the head the checks passed on** (#4036): without it GitHub merges
179
+ // whatever the branch points at, so a commit pushed after the gate went green would land unverified.
180
+ // A head that moved is answered 409 (`is_head_moved`).
181
+ async function put_merge(pr_number: number, head_sha: string): Promise<void> {
170
182
  forget_pr_numbers()
171
183
  await git_gh_exec.exec_gh_api({
172
184
  path: git_gh_api_path.pull_merge_api_path(String(pr_number)),
173
185
  method: PUT_METHOD,
174
- body: JSON.stringify({ merge_method: MERGE_COMMIT_METHOD }),
186
+ body: JSON.stringify({ merge_method: MERGE_COMMIT_METHOD, sha: head_sha }),
175
187
  timeout_ms: MERGE_REQUEST_TIMEOUT_MS,
176
188
  })
177
189
  }
178
190
 
191
+ // GitHub's answer to a merge whose `sha` is no longer the branch head.
192
+ function is_head_moved(error: unknown): boolean {
193
+ return gh_failure.failure_of(error)?.status === HEAD_MOVED_STATUS
194
+ }
195
+
179
196
  // `undefined` is "nobody read it", kept apart from the `false` that means "the pull request is not
180
- // merged". Folding the two would report an unread state as a settled answer.
181
- async function read_merge_state(pr_number: number): Promise<boolean | undefined> {
197
+ // merged". Folding the two would report an unread state as a settled answer. The listing row, which
198
+ // carries `merged_at` too, stands in for a detail GitHub refuses as too many files changed.
199
+ async function read_merge_state(
200
+ branch_name: string,
201
+ pr_number: number,
202
+ ): Promise<boolean | undefined> {
182
203
  try {
183
- return git_gh_pr_rest.is_merged(await read_pull(pr_number))
204
+ return git_gh_pr_rest.is_merged(await read_pull_or_listed(branch_name, pr_number, read_pull))
184
205
  } catch (error) {
185
206
  // The reason goes in the line, for the same reason the poll loop's warning carries one: the
186
207
  // failure this throws below names the *merge* request as its cause, so without this an operator
@@ -209,10 +230,14 @@ async function sleep_between_read_backs(attempt: number): Promise<void> {
209
230
  // **A read that failed is still not an answer.** Out of attempts it throws rather than reporting
210
231
  // `false`, carrying the merge failure as its `cause`, so no run ever concludes "the merge did not
211
232
  // happen" from a read nobody got.
212
- async function has_merge_landed(pr_number: number, merge_error: unknown): Promise<boolean> {
233
+ async function has_merge_landed(
234
+ branch_name: string,
235
+ pr_number: number,
236
+ merge_error: unknown,
237
+ ): Promise<boolean> {
213
238
  for (let attempt = 0; attempt < MERGE_READ_BACK_ATTEMPTS; attempt += 1) {
214
239
  // eslint-disable-next-line no-await-in-loop -- a retry runs only after the previous attempt has answered
215
- const is_merged = await read_merge_state(pr_number)
240
+ const is_merged = await read_merge_state(branch_name, pr_number)
216
241
  if (is_merged !== undefined) return is_merged
217
242
 
218
243
  // eslint-disable-next-line no-await-in-loop -- a retry runs only after the previous attempt has answered
@@ -240,13 +265,13 @@ async function has_merge_landed(pr_number: number, merge_error: unknown): Promis
240
265
  // made by hand between the failure and the read leaves `followup` with exactly the same work to
241
266
  // finish. REST offers nothing that would tell the two apart without keeping the merge commit's SHA
242
267
  // across a request that never answered.
243
- async function pr_merge(branch_name: string): Promise<void> {
268
+ async function pr_merge(branch_name: string, head_sha: string): Promise<void> {
244
269
  const pr_number = await require_pr_number(branch_name)
245
270
 
246
271
  try {
247
- await put_merge(pr_number)
272
+ await put_merge(pr_number, head_sha)
248
273
  } catch (error) {
249
- if (!(await has_merge_landed(pr_number, error))) throw error
274
+ if (!(await has_merge_landed(branch_name, pr_number, error))) throw error
250
275
  }
251
276
  }
252
277
 
@@ -259,6 +284,7 @@ const git_gh_pr = {
259
284
  pr_comment,
260
285
  pr_merge,
261
286
  pr_update_body,
287
+ is_head_moved,
262
288
  }
263
289
 
264
290
  export { git_gh_pr, MERGE_COMMIT_METHOD, MERGE_REQUEST_TIMEOUT_MS, MERGE_UNCONFIRMED_MESSAGE }
@@ -0,0 +1,141 @@
1
+ import { setTimeout as delay } from 'node:timers/promises'
2
+ import { get_exit_code, has_timed_out } from '#scripts/git/git-execa-error'
3
+ import { error_text } from '#scripts/lib/error-message'
4
+ import { gh_failure } from './git-gh-failure'
5
+
6
+ // One REST request asked again, a bounded number of times, when GitHub failed it transiently
7
+ // (joshuafolkken/kit#4717). A single 502 on `review:record --comment` used to stop a whole ship stage
8
+ // and cost a relaunched session that changed nothing; the same request seconds later succeeds.
9
+ //
10
+ // **Transient is a 5xx or a request that got no answer at all** — a dropped connection writes no
11
+ // error document, so its status is `undefined`. A 4xx is the request's own fault and answers the same
12
+ // the next time. Three failures without a status are still not retried: a timeout (it has already
13
+ // spent a minute, and a write it killed may have landed — `GH_REQUEST_TIMEOUT_MS`'s note), an error
14
+ // `to_gh_error` never built (gh missing, a refused body), which no wait can change, and one that wrote
15
+ // a body anyway — a GraphQL `errors` document is served with a 200, so it names no status and is
16
+ // still GitHub's answer.
17
+ //
18
+ // **A retried write can land twice** when the first attempt reached GitHub before it failed. The
19
+ // writes on this path tolerate it: a duplicate pull request is refused with the 422 the creator reads
20
+ // (`handle_pr_create_error`), a repeated merge is read back by `has_merge_landed`, and at worst a
21
+ // review-round comment is posted twice — cheaper than the stopped stage it replaces. Issue creation
22
+ // has no such guard — a second issue opens and nothing reads the first back — so
23
+ // `issue_create_request` opts out with `should_retry: false`.
24
+
25
+ const FIRST_RETRY_DELAY_MS = 2000
26
+ const SECOND_RETRY_DELAY_MS = 5000
27
+ const RETRY_DELAYS_MS = [FIRST_RETRY_DELAY_MS, SECOND_RETRY_DELAY_MS]
28
+ const MAX_ATTEMPTS = RETRY_DELAYS_MS.length + 1
29
+ const SERVER_ERROR_FLOOR = 500
30
+ // gh's own exit code for "authentication required" (`gh auth login`, no `GH_TOKEN`). It writes no
31
+ // error document either, so without this it would read as a request that got no answer — and no
32
+ // wait logs anyone in.
33
+ const GH_AUTH_REQUIRED_EXIT_CODE = 4
34
+
35
+ const SPENT_NOTE = 'gh: request failed transiently on every attempt'
36
+
37
+ // gh's own summary line for a failed request, e.g. `gh: Server Error (HTTP 502)`. It is the only
38
+ // place the status is written when the body is an HTML error page rather than GitHub's JSON document.
39
+ const SUMMARY_STATUS_PATTERN = /\(HTTP (?<status>\d{3})\)/u
40
+
41
+ interface RetryHooks {
42
+ wait: (milliseconds: number) => Promise<void>
43
+ note: (text: string) => void
44
+ }
45
+
46
+ const DEFAULT_HOOKS: RetryHooks = {
47
+ wait: async (milliseconds) => {
48
+ await delay(milliseconds)
49
+ },
50
+ note: (text) => {
51
+ process.stderr.write(`${text}\n`)
52
+ },
53
+ }
54
+
55
+ function summary_status(error: Error): number | undefined {
56
+ const { status } = SUMMARY_STATUS_PATTERN.exec(error.message)?.groups ?? {}
57
+
58
+ return status === undefined ? undefined : Number(status)
59
+ }
60
+
61
+ // Whether the failed spawn wrote a response body: a request that got no answer at all wrote none.
62
+ function has_answer(spawn_error: unknown): boolean {
63
+ if (!(spawn_error instanceof Error) || !('stdout' in spawn_error)) return false
64
+
65
+ return typeof spawn_error.stdout === 'string' && spawn_error.stdout.trim().length > 0
66
+ }
67
+
68
+ function is_transient_status(status: number | undefined, spawn_error: unknown): boolean {
69
+ if (status === undefined) return !has_answer(spawn_error)
70
+
71
+ return status >= SERVER_ERROR_FLOOR
72
+ }
73
+
74
+ // A spawn no wait can change: one it killed on its budget, or one gh refused before asking.
75
+ function is_final_spawn(spawn_error: unknown): boolean {
76
+ return has_timed_out(spawn_error) || get_exit_code(spawn_error) === GH_AUTH_REQUIRED_EXIT_CODE
77
+ }
78
+
79
+ function is_transient(error: unknown): boolean {
80
+ const failure = gh_failure.failure_of(error)
81
+
82
+ if (failure === undefined || !(error instanceof Error)) return false
83
+
84
+ const status = failure.status ?? summary_status(error)
85
+
86
+ return !is_final_spawn(error.cause) && is_transient_status(status, error.cause)
87
+ }
88
+
89
+ function first_line(error: unknown): string {
90
+ return error_text.message_of(error).split('\n', 1)[0] ?? ''
91
+ }
92
+
93
+ function retry_note(error: unknown, attempt: number, wait_ms: number): string {
94
+ const ordinal = `${String(attempt)}/${String(MAX_ATTEMPTS)}`
95
+
96
+ return `gh: request failed transiently (attempt ${ordinal}: ${first_line(error)}) — retrying in ${String(wait_ms)} ms`
97
+ }
98
+
99
+ // The wait before asking again, or `undefined` when this failure is final — not transient, or the
100
+ // last attempt spent.
101
+ function retry_delay(error: unknown, attempt: number): number | undefined {
102
+ return is_transient(error) ? RETRY_DELAYS_MS[attempt - 1] : undefined
103
+ }
104
+
105
+ // The line a request transient to its last attempt leaves on stderr, naming the failure by the first
106
+ // line of its message: a stopped `josh ship` stage that ended on that failure reads it as the
107
+ // infrastructure (joshuafolkken/kit#5052). A recovered retry writes none.
108
+ function spent_note(message: string): string {
109
+ return `${SPENT_NOTE} (${message})`
110
+ }
111
+
112
+ function note_spent(error: unknown, attempt: number, hooks: RetryHooks): void {
113
+ if (attempt === MAX_ATTEMPTS && is_transient(error)) hooks.note(spent_note(first_line(error)))
114
+ }
115
+
116
+ async function with_retry<T>(
117
+ request: () => Promise<T>,
118
+ hooks: RetryHooks = DEFAULT_HOOKS,
119
+ attempt = 1,
120
+ ): Promise<T> {
121
+ try {
122
+ return await request()
123
+ } catch (error) {
124
+ const wait_ms = retry_delay(error, attempt)
125
+
126
+ if (wait_ms === undefined) {
127
+ note_spent(error, attempt, hooks)
128
+ throw error
129
+ }
130
+
131
+ hooks.note(retry_note(error, attempt, wait_ms))
132
+ await hooks.wait(wait_ms)
133
+
134
+ return await with_retry(request, hooks, attempt + 1)
135
+ }
136
+ }
137
+
138
+ const gh_retry = { MAX_ATTEMPTS, RETRY_DELAYS_MS, is_transient, spent_note, with_retry }
139
+
140
+ export type { RetryHooks }
141
+ export { gh_retry }
@@ -7,6 +7,7 @@ import {
7
7
  type ReviewComment,
8
8
  } from './git-ai-review-scan'
9
9
  import { git_gh_command } from './git-gh-command'
10
+ import { is_retry_pending, note_unreadable_stop } from './git-gh-comments-unreadable'
10
11
  import { git_pr_confirmation, has_ignore_reason, type TelegramContext } from './git-pr-confirmation'
11
12
 
12
13
  interface AiReviewPullComment {
@@ -132,6 +133,19 @@ const UNREADABLE_COMMENTS_BODY =
132
133
  // never read the gate reports exactly like one that read it and found nothing.
133
134
  const UNREADABLE_COMMENTS_NOTE = 'AI reviewer comments could not be read; the scan was bypassed.'
134
135
 
136
+ // An attempt the ship will run again sends no confirmation; the final one does (is_retry_pending).
137
+ async function confirm_unreadable_stop(context: TelegramContext): Promise<void> {
138
+ note_unreadable_stop()
139
+ if (is_retry_pending()) return
140
+
141
+ await git_pr_confirmation.notify_confirmation({
142
+ context,
143
+ body: UNREADABLE_COMMENTS_BODY,
144
+ recommended: 'Re-run `pnpm josh followup` once the comments can be read',
145
+ alternatives: [IGNORE_ALTERNATIVE],
146
+ })
147
+ }
148
+
135
149
  async function handle_unreadable_comments(input: {
136
150
  branch_name: string
137
151
  ignore_reason: string | undefined
@@ -146,12 +160,7 @@ async function handle_unreadable_comments(input: {
146
160
  return [UNREADABLE_COMMENTS_NOTE]
147
161
  }
148
162
 
149
- await git_pr_confirmation.notify_confirmation({
150
- context: input.context,
151
- body: UNREADABLE_COMMENTS_BODY,
152
- recommended: 'Re-run `pnpm josh followup` once the comments can be read',
153
- alternatives: [IGNORE_ALTERNATIVE],
154
- })
163
+ await confirm_unreadable_stop(input.context)
155
164
 
156
165
  throw new Error(UNREADABLE_COMMENTS_BODY)
157
166
  }
@@ -2,6 +2,7 @@ import {
2
2
  CHECK_STATUS_FAIL,
3
3
  CHECK_STATUS_MISSING,
4
4
  CHECK_STATUS_PASS,
5
+ CHECK_STATUS_PENDING,
5
6
  type PrStateSnapshot,
6
7
  type RollupCheck,
7
8
  } from './git-pr-checks-parse'
@@ -12,7 +13,7 @@ import {
12
13
  // to restore the old behavior. Revert once the fresh-context review subagent replaces it.
13
14
  const DEFAULT_REQUIRED_CHECKS = ['SonarQube']
14
15
  // The single source of the check name every CodeRabbit exemption is keyed on — the merge gate's
15
- // `is_unstable_only_from_coderabbit`, the look-ahead's `is_awaited_check`, and the fixtures the two
16
+ // `is_unstable_only_from_optional`, the look-ahead's `is_awaited_check`, and the fixtures the two
16
17
  // are tested from. A second literal spelling of it anywhere is how one of them silently stops
17
18
  // matching after CodeRabbit renames its context.
18
19
  const CODERABBIT_CHECK_NAME = 'CodeRabbit'
@@ -131,15 +132,46 @@ function is_coderabbit_rate_limited(check: RollupCheck): boolean {
131
132
  )
132
133
  }
133
134
 
134
- // Temporary: a pending or failing CodeRabbit check makes GitHub report UNSTABLE even
135
- // though CodeRabbit is not required. Accept that state only when CodeRabbit checks are the
136
- // sole non-passing ones — any other non-passing check keeps the gate strict.
137
- function is_unstable_only_from_coderabbit(snapshot: PrStateSnapshot): boolean {
135
+ function matches_any(check_name: string, required_names: ReadonlyArray<string>): boolean {
136
+ return required_names.some((required) => is_required_match(check_name, required))
137
+ }
138
+
139
+ // A check still running that the base branch's rules do not require — GitHub's default-setup
140
+ // `CodeQL`, which runs for about thirty minutes beside a six-minute CI (joshuafolkken/kit#4351).
141
+ // With no required context known nothing qualifies, so the gate waits for `CLEAN` as it always did.
142
+ function is_optional_pending(
143
+ check: RollupCheck,
144
+ required_contexts: ReadonlyArray<string>,
145
+ ): boolean {
146
+ if (required_contexts.length === 0 || check.status !== CHECK_STATUS_PENDING) return false
147
+
148
+ return !matches_any(check.name, required_contexts)
149
+ }
150
+
151
+ function is_every_context_passing(
152
+ checks: ReadonlyArray<RollupCheck>,
153
+ contexts: ReadonlyArray<string>,
154
+ ): boolean {
155
+ return contexts.every(
156
+ (context) => find_required_check(checks, context)?.status === CHECK_STATUS_PASS,
157
+ )
158
+ }
159
+
160
+ // GitHub reports UNSTABLE for a pull request whose required checks are green while a check outside
161
+ // them is pending or failing. Accept that state when every non-passing check is CodeRabbit's
162
+ // (temporary: CodeRabbit is not required) or an optional one still running, and every context the
163
+ // base branch requires has passed in the rollup itself — any other non-passing check keeps the gate
164
+ // strict. A failed optional check never reaches here: `collect_blocking_failures` ends the wait first.
165
+ function is_unstable_only_from_optional(snapshot: PrStateSnapshot): boolean {
138
166
  if (snapshot.merge_state_status !== MERGE_STATE_UNSTABLE) return false
167
+ const required_contexts = snapshot.required_contexts ?? []
139
168
  const non_passing = snapshot.rollup.filter((check) => check.status !== CHECK_STATUS_PASS)
140
169
  if (non_passing.length === 0) return false
170
+ const is_tolerated = non_passing.every(
171
+ (check) => is_coderabbit_check(check.name) || is_optional_pending(check, required_contexts),
172
+ )
141
173
 
142
- return non_passing.every((check) => is_coderabbit_check(check.name))
174
+ return is_tolerated && is_every_context_passing(snapshot.rollup, required_contexts)
143
175
  }
144
176
 
145
177
  function is_required_check(check_name: string): boolean {
@@ -169,7 +201,7 @@ function collect_blocking_failures(snapshot: PrStateSnapshot): Array<string> {
169
201
  function is_mergeable_state(snapshot: PrStateSnapshot): boolean {
170
202
  if (is_merge_state_clean(snapshot.merge_state_status)) return true
171
203
 
172
- return is_unstable_only_from_coderabbit(snapshot)
204
+ return is_unstable_only_from_optional(snapshot)
173
205
  }
174
206
 
175
207
  // The wait's own error text: naming the checks that failed is what turns a red `followup` into
@@ -255,6 +287,9 @@ class PrConflictError extends Error {
255
287
  }
256
288
 
257
289
  export {
290
+ FAILURE_MESSAGE_PREFIX,
291
+ FAILURE_REASON_CHECKS,
292
+ FAILURE_REASON_CONFLICT,
258
293
  PrConflictError,
259
294
  evaluate_pr_state,
260
295
  is_auto_merge_blocked,
@@ -1,5 +1,6 @@
1
1
  import { pr_raw_schema, type RollupItemData } from '#scripts/git/git-schemas'
2
2
  import { json_value } from '#scripts/lib/json-value'
3
+ import type { z } from 'zod'
3
4
 
4
5
  const CHECK_STATUS_PASS = 'pass'
5
6
  const CHECK_STATUS_PENDING = 'pending'
@@ -9,8 +10,8 @@ const CHECK_STATUS_MISSING = 'missing'
9
10
  // GitHub reports a job whose `if:` condition was false as COMPLETED with conclusion `skipped`, and
10
11
  // counts it as satisfied for branch protection — a pull request reaches CLEAN with such jobs in its
11
12
  // rollup. Recording them as `fail` would disagree with GitHub itself, and it would disable the
12
- // CodeRabbit non-blocking exemption: `is_unstable_only_from_coderabbit` opens the gate only when
13
- // every non-passing check is CodeRabbit's, so kit's own conditional jobs (`auto-merge`, `E2E`,
13
+ // CodeRabbit non-blocking exemption: `is_unstable_only_from_optional` opens the gate only when
14
+ // every non-passing check is CodeRabbit's or an optional one still running, so kit's own conditional jobs (`auto-merge`, `E2E`,
14
15
  // `Notify Auto Tag`) would keep a slow review blocking the merge until the wait loop timed out. That
15
16
  // is invisible on fast reviews, where CLEAN short-circuits the predicate — it surfaces only on the
16
17
  // exact path the exemption exists to protect.
@@ -45,6 +46,12 @@ interface PrStateSnapshot {
45
46
  rollup: Array<RollupCheck>
46
47
  merge_state_status: string | undefined
47
48
  review_decision: string | undefined
49
+ // The commit `rollup` was read from — the head a merge has to name so that it lands what passed and
50
+ // nothing pushed since (#4036). Absent where the snapshot carried none.
51
+ head_sha?: string
52
+ // The base branch's required status check contexts (joshuafolkken/kit#4351). Absent where the
53
+ // branch requires none or they could not be read, which keeps the merge gate waiting for `CLEAN`.
54
+ required_contexts?: Array<string>
48
55
  }
49
56
 
50
57
  function read_string(value: unknown): string | undefined {
@@ -118,16 +125,39 @@ function parse_rollup_checks(raw_json: string): Array<RollupCheck> {
118
125
  return checks
119
126
  }
120
127
 
121
- function parse_pr_state_snapshot(raw_json: string): PrStateSnapshot {
122
- const parsed = json_value.parse_or_undefined(raw_json)
123
- const result = pr_raw_schema.safeParse(parsed)
124
- const data = result.success ? result.data : undefined
128
+ function with_head_sha(snapshot: PrStateSnapshot, head_sha: string | undefined): PrStateSnapshot {
129
+ return head_sha === undefined ? snapshot : { ...snapshot, head_sha }
130
+ }
131
+
132
+ function with_required_contexts(
133
+ snapshot: PrStateSnapshot,
134
+ required_contexts: Array<string> | undefined,
135
+ ): PrStateSnapshot {
136
+ if (required_contexts === undefined || required_contexts.length === 0) return snapshot
137
+
138
+ return { ...snapshot, required_contexts }
139
+ }
125
140
 
126
- return {
141
+ type PrRawData = Partial<z.infer<typeof pr_raw_schema>>
142
+
143
+ function read_pr_raw_data(raw_json: string): PrRawData {
144
+ const result = pr_raw_schema.safeParse(json_value.parse_or_undefined(raw_json))
145
+
146
+ return result.success ? result.data : {}
147
+ }
148
+
149
+ function parse_pr_state_snapshot(raw_json: string): PrStateSnapshot {
150
+ const data = read_pr_raw_data(raw_json)
151
+ const snapshot = {
127
152
  rollup: parse_rollup_checks(raw_json),
128
- merge_state_status: read_string(data?.mergeStateStatus),
129
- review_decision: read_string(data?.reviewDecision),
153
+ merge_state_status: read_string(data.mergeStateStatus),
154
+ review_decision: read_string(data.reviewDecision),
130
155
  }
156
+
157
+ return with_required_contexts(
158
+ with_head_sha(snapshot, read_string(data.headRefOid)),
159
+ data.requiredContexts,
160
+ )
131
161
  }
132
162
 
133
163
  export {