@joshuafolkken/kit 1.1471.0 → 1.1784.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 (895) hide show
  1. package/.claude/agents/investigator.md +1 -1
  2. package/.claude/settings.json +6 -6
  3. package/.claude/skills/epic-commands/SKILL.md +26 -77
  4. package/.claude/skills/epic-commands/epic-bundle.md +12 -6
  5. package/.claude/skills/epic-commands/execution-waves.md +1 -2
  6. package/.claude/skills/verify-ui/SKILL.md +1 -2
  7. package/.claude/skills/workflow-commands/SKILL.md +12 -14
  8. package/.claude/skills/workflow-commands/background-commands.md +8 -12
  9. package/.claude/skills/workflow-commands/backlogrun-child.md +13 -18
  10. package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +7 -25
  11. package/.claude/skills/workflow-commands/backlogrun-lanes.md +23 -28
  12. package/.claude/skills/workflow-commands/backlogrun-park.md +16 -31
  13. package/.claude/skills/workflow-commands/backlogrun-progress.md +12 -21
  14. package/.claude/skills/workflow-commands/backlogrun-recovery.md +12 -12
  15. package/.claude/skills/workflow-commands/backlogrun-steps.md +12 -20
  16. package/.claude/skills/workflow-commands/backlogrun.md +32 -51
  17. package/.claude/skills/workflow-commands/chain-rule.md +18 -11
  18. package/.claude/skills/workflow-commands/delegation.md +13 -8
  19. package/.claude/skills/workflow-commands/entry-sequence.md +10 -12
  20. package/.claude/skills/workflow-commands/followup.md +10 -35
  21. package/.claude/skills/workflow-commands/fullrun-steps.md +38 -49
  22. package/.claude/skills/workflow-commands/fullrun.md +6 -8
  23. package/.claude/skills/workflow-commands/halfrun.md +20 -32
  24. package/.claude/skills/workflow-commands/into-target.md +1 -2
  25. package/.claude/skills/workflow-commands/issue-comments.md +19 -15
  26. package/.claude/skills/workflow-commands/issue-scout.md +5 -4
  27. package/.claude/skills/workflow-commands/kickoff.md +24 -23
  28. package/.claude/skills/workflow-commands/latest-gate.md +9 -18
  29. package/.claude/skills/workflow-commands/needs-human-review.md +11 -19
  30. package/.claude/skills/workflow-commands/observation-filing.md +4 -50
  31. package/.claude/skills/workflow-commands/observation-ledger.md +5 -10
  32. package/.claude/skills/workflow-commands/pre-gate-cut.md +22 -44
  33. package/.claude/skills/workflow-commands/prerequisite.md +11 -18
  34. package/.claude/skills/workflow-commands/progress-watcher.md +3 -8
  35. package/.claude/skills/workflow-commands/prrun.md +6 -12
  36. package/.claude/skills/workflow-commands/retrospective.md +5 -5
  37. package/.claude/skills/workflow-commands/split-assessment.md +14 -4
  38. package/.claude/skills/workflow-commands/target-repository.md +1 -2
  39. package/.claude/skills/workflow-commands/working-tree-hold.md +11 -13
  40. package/.codex/hooks.json +6 -6
  41. package/.github/actions/setup-node/action.yml +10 -1
  42. package/.github/actions/setup-pnpm/action.yml +1 -1
  43. package/.github/dependabot.yml +16 -0
  44. package/.github/release.yml +0 -2
  45. package/.github/workflows/ci.yml +121 -11
  46. package/.github/workflows/publish.yml +10 -3
  47. package/.github/workflows/sonar-qube.yml +1 -0
  48. package/.prettierignore +2 -0
  49. package/.vscode/tasks.json +1 -2
  50. package/CLAUDE.md +4 -8
  51. package/README.md +4 -2
  52. package/SECURITY.md +1 -1
  53. package/cspell/index.yaml +7 -0
  54. package/dist/CLAUDE.md +4 -8
  55. package/dist/commands/document-read-cli.js +882 -0
  56. package/dist/commands/{document-section-cli.js → document-section-main.js} +137 -62
  57. package/dist/commands/read-set-cli.js +1867 -0
  58. package/dist/commands/run-prep-main.js +21653 -0
  59. package/dist/commands/run-step-cli.js +23880 -0
  60. package/dist/config-merge/index.js +5 -1
  61. package/dist/hooks/audit-provision.js +20 -35
  62. package/dist/hooks/{chunk-DGT54IH5.js → chunk-AZX4FGQ3.js} +63 -17
  63. package/dist/hooks/chunk-CWMBGKYW.js +6483 -0
  64. package/dist/hooks/chunk-O2YBIDSI.js +4306 -0
  65. package/dist/hooks/{chunk-AS74OU3D.js → chunk-PT5R6UJD.js} +4582 -2118
  66. package/dist/hooks/chunk-TUIFS5E7.js +72 -0
  67. package/dist/hooks/{chunk-723HKZO5.js → chunk-VWWCFGWK.js} +1 -1
  68. package/dist/hooks/{chunk-E7OIKX5Z.js → chunk-WR2KQAYZ.js} +1863 -382
  69. package/dist/hooks/{chunk-KC5AK2GF.js → chunk-XGBNSWEI.js} +248 -46
  70. package/dist/hooks/chunk-YCDOIR3I.js +3456 -0
  71. package/dist/hooks/codex-hook-adapter.js +10 -19
  72. package/dist/hooks/format-edited.js +5 -5
  73. package/dist/hooks/inputs.json +436 -257
  74. package/dist/hooks/pretool-guard.js +7 -22
  75. package/dist/hooks/session-lang.js +380 -42
  76. package/dist/hooks/stop-guard.js +8711 -782
  77. package/dist/josh.js +5263 -997
  78. package/dist/self-sync-guard/index.js +74 -10
  79. package/dist/version/index.js +115 -406
  80. package/eslint/base.js +1 -1
  81. package/lefthook/base.yml +8 -4
  82. package/package.json +17 -53
  83. package/pnpm-workspace.yaml +4 -2
  84. package/prompts/coding-standards.md +1 -1
  85. package/prompts/collaboration-workflow/file-edits.md +1 -9
  86. package/prompts/collaboration-workflow/gh-rest.md +1 -2
  87. package/prompts/collaboration-workflow/issue-citation.md +2 -4
  88. package/prompts/collaboration-workflow/issue-template.md +42 -17
  89. package/prompts/collaboration-workflow/lane-instructions.md +34 -0
  90. package/prompts/collaboration-workflow/measurement.md +37 -0
  91. package/prompts/collaboration-workflow/operating-rules.md +6 -12
  92. package/prompts/collaboration-workflow/output-bounds.md +4 -9
  93. package/prompts/collaboration-workflow/overview.md +1 -1
  94. package/prompts/collaboration-workflow/plan-comment.md +3 -42
  95. package/prompts/collaboration-workflow/principles.md +19 -8
  96. package/prompts/collaboration-workflow/report-format.md +37 -57
  97. package/prompts/collaboration-workflow/residency.md +12 -8
  98. package/prompts/collaboration-workflow/rule-delivery.md +3 -11
  99. package/prompts/collaboration-workflow/shell-body.md +8 -18
  100. package/prompts/collaboration-workflow/turn-batching.md +4 -6
  101. package/prompts/collaboration-workflow/upstream-interrupt.md +16 -6
  102. package/prompts/collaboration-workflow/wip-cap.md +7 -7
  103. package/prompts/collaboration-workflow.md +4 -7
  104. package/prompts/refactoring.md +1 -1
  105. package/prompts/review-rubric.md +1 -2
  106. package/prompts/review.md +45 -26
  107. package/prompts/testing-guide.md +10 -45
  108. package/scripts/agent/agent-argv.ts +20 -4
  109. package/scripts/agent/agent-event.ts +15 -15
  110. package/scripts/agent/agent-exit-record.ts +13 -1
  111. package/scripts/agent/agent-role-profile.ts +101 -45
  112. package/scripts/agent/agent-safe-text.ts +60 -0
  113. package/scripts/agent/api-auth.ts +41 -0
  114. package/scripts/agent/api-outage.ts +1 -1
  115. package/scripts/agent/claude-agent-argv.ts +14 -0
  116. package/scripts/agent/codex-agent-argv.ts +2 -0
  117. package/scripts/agent/lane-instructions.ts +144 -0
  118. package/scripts/auto-ok/auto-ok-cli.ts +14 -16
  119. package/scripts/auto-ok/auto-ok-judge-read.ts +12 -3
  120. package/scripts/auto-ok/auto-ok-judge-write.ts +46 -19
  121. package/scripts/auto-ok/auto-ok-judge.ts +13 -2
  122. package/scripts/auto-ok/auto-ok-main.ts +17 -0
  123. package/scripts/backlog/backlog-arrival.ts +14 -3
  124. package/scripts/backlog/backlog-budget-cli.ts +7 -33
  125. package/scripts/backlog/backlog-budget-main.ts +16 -0
  126. package/scripts/backlog/backlog-budget.ts +6 -7
  127. package/scripts/backlog/backlog-defect-priority.ts +4 -3
  128. package/scripts/backlog/backlog-drive-adopt.ts +67 -0
  129. package/scripts/backlog/backlog-drive-args.ts +4 -5
  130. package/scripts/backlog/backlog-drive-cli.ts +113 -28
  131. package/scripts/backlog/backlog-drive-hold.ts +162 -0
  132. package/scripts/backlog/backlog-drive-idle.ts +151 -0
  133. package/scripts/backlog/backlog-drive-judge.ts +25 -0
  134. package/scripts/backlog/backlog-drive-memory.ts +126 -0
  135. package/scripts/backlog/backlog-drive-named-offer.ts +5 -10
  136. package/scripts/backlog/backlog-drive-named.ts +54 -7
  137. package/scripts/backlog/backlog-drive-offer-argv.ts +3 -8
  138. package/scripts/backlog/backlog-drive-paused.ts +169 -0
  139. package/scripts/backlog/backlog-drive-restore.ts +39 -8
  140. package/scripts/backlog/backlog-drive-seats.ts +18 -8
  141. package/scripts/backlog/backlog-drive-token-handling.ts +38 -0
  142. package/scripts/backlog/backlog-drive.ts +79 -75
  143. package/scripts/backlog/backlog-next-main.ts +16 -0
  144. package/scripts/backlog/backlog-next-shared.ts +73 -0
  145. package/scripts/backlog/backlog-next.ts +48 -16
  146. package/scripts/backlog/backlog-occupied.ts +69 -0
  147. package/scripts/backlog/backlog-offer-cli.ts +6 -21
  148. package/scripts/backlog/backlog-offer-exclude.ts +15 -0
  149. package/scripts/backlog/backlog-offer-main.ts +12 -0
  150. package/scripts/backlog/backlog-offer.ts +36 -3
  151. package/scripts/backlog/backlog-overlap.ts +22 -4
  152. package/scripts/backlog/backlog-plan-read.ts +6 -2
  153. package/scripts/backlog/backlog-plan.ts +18 -4
  154. package/scripts/backlog/backlog-pool.ts +10 -10
  155. package/scripts/backlog/backlog-rank.ts +10 -2
  156. package/scripts/backlog/backlog-ready.ts +137 -18
  157. package/scripts/backlog/backlog-stalled-detect.ts +109 -36
  158. package/scripts/backlog/backlog-stalled.ts +52 -16
  159. package/scripts/backlog/backlog-wait-cause.ts +86 -0
  160. package/scripts/backlog/backlog-waves.ts +39 -13
  161. package/scripts/backlog/backlogrun-args.ts +19 -7
  162. package/scripts/backlog/backlogrun-cli.ts +19 -5
  163. package/scripts/backlog/backlogrun-launch.ts +6 -0
  164. package/scripts/backlog/backlogrun-restart.ts +97 -0
  165. package/scripts/backlog/backlogrun-stop.ts +79 -7
  166. package/scripts/behavior/behavior-cli.ts +2 -2
  167. package/scripts/behavior/behavior-rules.ts +47 -24
  168. package/scripts/build/build-bin.ts +2 -16
  169. package/scripts/build/build-claude-md.ts +0 -7
  170. package/scripts/build/build-commands.ts +0 -13
  171. package/scripts/build/build-hooks.ts +49 -48
  172. package/scripts/build/hook-bundle-stamp.ts +29 -11
  173. package/scripts/build/local-bin.ts +1 -1
  174. package/scripts/cases/cases-cli.ts +25 -13
  175. package/scripts/cases/cases-interaction-scan.ts +134 -0
  176. package/scripts/cases/cases-interaction.ts +183 -0
  177. package/scripts/cases/cases-logic.ts +39 -6
  178. package/scripts/ci/pr-classification-main.ts +18 -0
  179. package/scripts/ci/pr-classification.ts +10 -17
  180. package/scripts/clone/clone-scan.ts +1 -1
  181. package/scripts/cost-runtime/cost-blocks.ts +22 -37
  182. package/scripts/cost-runtime/cost-cli.ts +31 -14
  183. package/scripts/cost-runtime/cost-main.ts +12 -0
  184. package/scripts/cost-runtime/cost-transcript.ts +1 -0
  185. package/scripts/delegation/delegation-policy.ts +17 -4
  186. package/scripts/delegation/duplicate-read-guard.ts +2 -10
  187. package/scripts/delegation/investigation-guard.ts +15 -73
  188. package/scripts/delegation/investigation-reads.ts +3 -5
  189. package/scripts/dependabot/dependabot-cooldown.ts +194 -0
  190. package/scripts/discovery/repo-discovery.ts +24 -6
  191. package/scripts/doctor/doctor-consumer.ts +2 -5
  192. package/scripts/document/document-byte-budget.ts +9 -6
  193. package/scripts/document/document-scan.ts +1 -1
  194. package/scripts/document/document-section-cli.ts +17 -13
  195. package/scripts/document/document-section-main.ts +12 -0
  196. package/scripts/document/entry-read-budget.ts +2 -2
  197. package/scripts/document/read-set-cli.ts +4 -1
  198. package/scripts/epic/epic-audit-cli.ts +12 -6
  199. package/scripts/epic/epic-audit-orphans.ts +5 -8
  200. package/scripts/epic/epic-audit.ts +52 -1
  201. package/scripts/epic/epic-bundle-apply.ts +137 -0
  202. package/scripts/epic/epic-bundle-cli.ts +32 -121
  203. package/scripts/epic/epic-bundle-evidence.ts +49 -26
  204. package/scripts/epic/epic-bundle-format.ts +116 -0
  205. package/scripts/epic/epic-bundle-main.ts +17 -0
  206. package/scripts/epic/epic-bundle-referenced.ts +14 -3
  207. package/scripts/epic/epic-bundle.ts +17 -9
  208. package/scripts/epic/epic-busy.ts +5 -12
  209. package/scripts/epic/epic-classify.ts +24 -15
  210. package/scripts/epic/epic-cli-argv.ts +31 -0
  211. package/scripts/epic/epic-cli-decide.ts +42 -0
  212. package/scripts/epic/epic-cli.ts +6 -38
  213. package/scripts/epic/epic-close.ts +112 -55
  214. package/scripts/epic/epic-cross-repo.ts +4 -7
  215. package/scripts/epic/epic-decide.ts +119 -0
  216. package/scripts/epic/epic-decision.ts +9 -0
  217. package/scripts/epic/epic-fetch.ts +4 -0
  218. package/scripts/epic/epic-graph.ts +2 -0
  219. package/scripts/epic/epic-issue.ts +5 -1
  220. package/scripts/epic/epic-label-age.ts +1 -1
  221. package/scripts/epic/epic-lane-offer.ts +39 -4
  222. package/scripts/epic/epic-next-main.ts +24 -0
  223. package/scripts/epic/epic-next.ts +6 -24
  224. package/scripts/epic/epic-outside-blocker.ts +6 -2
  225. package/scripts/epic/epic-parse.ts +9 -3
  226. package/scripts/epic/epic-read.ts +1 -0
  227. package/scripts/epic/epic-reconcile.ts +39 -0
  228. package/scripts/epic/epic-run.ts +10 -1
  229. package/scripts/epic/epic-solo.ts +50 -14
  230. package/scripts/epic/epic.ts +41 -7
  231. package/scripts/exports/unused-members-cli.ts +2 -2
  232. package/scripts/followup/followup-checks-event.ts +8 -3
  233. package/scripts/followup/followup-coderabbit-wait.ts +82 -0
  234. package/scripts/followup/followup-review-gates.ts +81 -0
  235. package/scripts/followup/git-followup-stages.ts +13 -3
  236. package/scripts/followup/git-followup-workflow.ts +31 -60
  237. package/scripts/followup/git-pr-followup-wrapup.ts +9 -14
  238. package/scripts/followup/git-pr-followup.ts +36 -8
  239. package/scripts/fresh-machine/fresh-machine-cli.ts +1 -1
  240. package/scripts/fresh-machine/fresh-machine-run.ts +8 -8
  241. package/scripts/fresh-machine/specs/kit-test-backlogrun.json +1 -1
  242. package/scripts/gate/busy-average.ts +58 -0
  243. package/scripts/gate/check-cpu.ts +60 -0
  244. package/scripts/gate/check-inputs.ts +73 -0
  245. package/scripts/gate/check-reuse.ts +141 -0
  246. package/scripts/gate/command-memory.ts +192 -0
  247. package/scripts/gate/core-admission.ts +218 -28
  248. package/scripts/gate/core-budget-timing.ts +37 -0
  249. package/scripts/gate/core-budget.ts +150 -119
  250. package/scripts/gate/core-wait-record.ts +48 -0
  251. package/scripts/gate/core-wait.ts +162 -0
  252. package/scripts/gate/core-weights.ts +86 -0
  253. package/scripts/gate/free-cores.ts +72 -0
  254. package/scripts/gate/gate-ledger.ts +49 -7
  255. package/scripts/gate/gate-plan.ts +44 -15
  256. package/scripts/gate/gate-report.ts +29 -4
  257. package/scripts/gate/gate-run-steps.ts +195 -0
  258. package/scripts/gate/gate-skip.ts +12 -2
  259. package/scripts/gate/gate-steps.ts +12 -1
  260. package/scripts/gate/held-mark.ts +55 -0
  261. package/scripts/gate/input-fingerprint.ts +42 -0
  262. package/scripts/gate/machine-capacity.ts +124 -31
  263. package/scripts/gate/moved-paths.ts +67 -0
  264. package/scripts/gate/pre-commit-type-check.ts +14 -1
  265. package/scripts/gate/project-checks.ts +5 -12
  266. package/scripts/gate/scoped-green.ts +12 -8
  267. package/scripts/gate/since-green.ts +62 -0
  268. package/scripts/gate/toolchain-inputs.ts +115 -0
  269. package/scripts/gate/verification-gate.ts +65 -129
  270. package/scripts/gate/verification-inputs.ts +250 -0
  271. package/scripts/gh/gh-author-association.ts +96 -9
  272. package/scripts/gh/git-ai-review-scan.ts +4 -2
  273. package/scripts/gh/git-gh-api-path.ts +15 -0
  274. package/scripts/gh/git-gh-branch-rules.ts +73 -0
  275. package/scripts/gh/git-gh-conditional.ts +5 -2
  276. package/scripts/gh/git-gh-issue-read.ts +5 -1
  277. package/scripts/gh/git-gh-issue-rest.ts +1 -0
  278. package/scripts/gh/git-gh-issue-write.ts +77 -17
  279. package/scripts/gh/git-gh-issue.ts +7 -3
  280. package/scripts/gh/git-gh-poll-read.ts +89 -0
  281. package/scripts/gh/git-gh-pr-auto-merge.ts +8 -3
  282. package/scripts/gh/git-gh-pr-rest.ts +1 -1
  283. package/scripts/gh/git-gh-pr-snapshot.ts +33 -20
  284. package/scripts/gh/git-gh-pr.ts +27 -15
  285. package/scripts/gh/git-pr-checks-eval.ts +39 -7
  286. package/scripts/gh/git-pr-checks-parse.ts +39 -9
  287. package/scripts/gh/git-pr-merge-checked.ts +80 -0
  288. package/scripts/gh/git-pr.ts +13 -1
  289. package/scripts/git/base-tree.ts +19 -2
  290. package/scripts/git/changed-file-scope.ts +6 -4
  291. package/scripts/git/changed-paths.ts +18 -1
  292. package/scripts/git/git-diff-reads.ts +27 -2
  293. package/scripts/git/git-grep-hits.ts +85 -0
  294. package/scripts/git/git-location-environment.ts +1 -1
  295. package/scripts/git/git-merge-conflicts.ts +83 -0
  296. package/scripts/git/git-preflight.ts +37 -12
  297. package/scripts/git/git-push-transport.ts +1 -2
  298. package/scripts/git/git-schemas.ts +17 -7
  299. package/scripts/git/git-spawn.ts +1 -2
  300. package/scripts/git/git-status.ts +4 -4
  301. package/scripts/git/main-merge-main.ts +12 -0
  302. package/scripts/git/main-merge-regenerate.ts +78 -0
  303. package/scripts/git/main-merge.ts +39 -14
  304. package/scripts/git/main-sync-main.ts +12 -0
  305. package/scripts/git/main-sync.ts +0 -9
  306. package/scripts/git/stash/git-stash.ts +27 -4
  307. package/scripts/git/stash/{stash-pop-args.ts → stash-args.ts} +13 -10
  308. package/scripts/git/stash/stash-pop-cli.ts +6 -12
  309. package/scripts/git/stash/stash-pop-main.ts +12 -0
  310. package/scripts/git/stash/stash-push-cli.ts +76 -0
  311. package/scripts/git/stash/stash-push-main.ts +12 -0
  312. package/scripts/hooks/batch-guard.ts +5 -16
  313. package/scripts/hooks/check-commit-message-main.ts +8 -0
  314. package/scripts/hooks/check-commit-message.ts +4 -7
  315. package/scripts/hooks/format-edited-file.ts +8 -24
  316. package/scripts/hooks/pre-commit-lint.ts +118 -0
  317. package/scripts/hooks/pre-push-unit.ts +4 -2
  318. package/scripts/hooks/pretool-guard-cli.ts +1 -8
  319. package/scripts/hooks/pretool-guard.ts +57 -69
  320. package/scripts/hooks/reserved-run.ts +67 -8
  321. package/scripts/hooks/run-hook.sh +18 -11
  322. package/scripts/hooks/shell-rules-notice.ts +37 -0
  323. package/scripts/hooks/stop-actions.ts +185 -0
  324. package/scripts/hooks/stop-guard.ts +72 -27
  325. package/scripts/init/hook-command-rewrite.ts +19 -5
  326. package/scripts/init/hook-launch.ts +15 -12
  327. package/scripts/init/init-actions.ts +0 -6
  328. package/scripts/init/init-ai-copy.ts +10 -36
  329. package/scripts/init/init-bootstrap.ts +9 -8
  330. package/scripts/init/init-dry-run-report.ts +1 -1
  331. package/scripts/init/init-dry-run.ts +1 -1
  332. package/scripts/init/init-file-action.ts +7 -9
  333. package/scripts/init/init-logic-json-merge.ts +2 -2
  334. package/scripts/init/init-logic-migrate.ts +9 -82
  335. package/scripts/init/init-logic.ts +3 -2
  336. package/scripts/init/init-main.ts +12 -0
  337. package/scripts/init/init.ts +5 -12
  338. package/scripts/init/kit-development-versions.ts +3 -7
  339. package/scripts/init/kit-written-paths.ts +2 -2
  340. package/scripts/init/project-profile.ts +5 -4
  341. package/scripts/init/tsconfig-preset-migration.ts +2 -1
  342. package/scripts/init/vscode-tasks.ts +1 -1
  343. package/scripts/issue/defect-origin-cli.ts +106 -0
  344. package/scripts/issue/defect-origin-line.ts +60 -0
  345. package/scripts/issue/defect-origin-main.ts +11 -0
  346. package/scripts/issue/defect-origin.ts +114 -0
  347. package/scripts/issue/defect-rate-cli.ts +34 -78
  348. package/scripts/issue/defect-rate.ts +0 -16
  349. package/scripts/issue/defect-report-cli.ts +128 -0
  350. package/scripts/issue/defect-report-format.ts +56 -0
  351. package/scripts/issue/defect-report-main.ts +11 -0
  352. package/scripts/issue/defect-report.ts +160 -0
  353. package/scripts/issue/expected-effect-lint.ts +60 -0
  354. package/scripts/issue/issue-already-done-cli.ts +62 -0
  355. package/scripts/issue/issue-body-or-comment.ts +40 -0
  356. package/scripts/issue/issue-cite-cli.ts +33 -22
  357. package/scripts/issue/issue-cite-main.ts +12 -0
  358. package/scripts/issue/issue-classification.ts +13 -8
  359. package/scripts/issue/issue-comment-cli.ts +10 -24
  360. package/scripts/issue/issue-comment-main.ts +12 -0
  361. package/scripts/issue/issue-evidence-exit.ts +100 -0
  362. package/scripts/issue/issue-file-cli.ts +29 -7
  363. package/scripts/issue/issue-file.ts +19 -19
  364. package/scripts/issue/issue-fold-cli.ts +2 -11
  365. package/scripts/issue/issue-fold-main.ts +12 -0
  366. package/scripts/issue/issue-labels.ts +81 -90
  367. package/scripts/issue/issue-lint-cli.ts +7 -13
  368. package/scripts/issue/issue-lint-main.ts +12 -0
  369. package/scripts/issue/issue-measured-cli.ts +56 -0
  370. package/scripts/issue/issue-merged.ts +19 -2
  371. package/scripts/issue/issue-not-before-label.ts +135 -0
  372. package/scripts/issue/issue-not-before.ts +111 -0
  373. package/scripts/issue/issue-number-shape.ts +15 -1
  374. package/scripts/issue/issue-park.ts +28 -0
  375. package/scripts/issue/issue-plan-cli.ts +151 -0
  376. package/scripts/issue/issue-priority.ts +151 -0
  377. package/scripts/issue/issue-rank.ts +7 -1
  378. package/scripts/issue/issue-read-cli.ts +3 -10
  379. package/scripts/issue/issue-read-main.ts +12 -0
  380. package/scripts/issue/issue-read.ts +29 -5
  381. package/scripts/issue/issue-release-cli.ts +0 -10
  382. package/scripts/issue/issue-release-main.ts +13 -0
  383. package/scripts/issue/issue-release.ts +7 -12
  384. package/scripts/issue/issue-sample-gate.ts +192 -0
  385. package/scripts/issue/issue-sample-source.ts +76 -0
  386. package/scripts/issue/issue-scout-cli.ts +19 -25
  387. package/scripts/issue/issue-scout-main.ts +14 -0
  388. package/scripts/issue/issue-state-cli.ts +0 -10
  389. package/scripts/issue/issue-state-main.ts +12 -0
  390. package/scripts/issue/issue-watch-diff.ts +56 -15
  391. package/scripts/issue/issue-watch.ts +2 -1
  392. package/scripts/issue/issue-wip.ts +2 -7
  393. package/scripts/issue/markdown-section.ts +19 -5
  394. package/scripts/issue/measure-rerun-cli.ts +13 -8
  395. package/scripts/issue/plan-consumers-cli.ts +39 -0
  396. package/scripts/issue/plan-consumers-main.ts +11 -0
  397. package/scripts/issue/plan-consumers-section.ts +55 -0
  398. package/scripts/issue/plan-consumers.ts +127 -0
  399. package/scripts/josh/agent-session-environment.ts +1 -1
  400. package/scripts/josh/command-usage.ts +82 -0
  401. package/scripts/josh/file-map-stamp.ts +49 -16
  402. package/scripts/josh/hook-decision.ts +32 -20
  403. package/scripts/josh/josh-command-map.ts +6 -1
  404. package/scripts/josh/josh-command-types.ts +65 -13
  405. package/scripts/josh/josh-commands-agent-hooks.ts +83 -0
  406. package/scripts/josh/josh-commands-ai.ts +169 -157
  407. package/scripts/josh/josh-commands-backlog.ts +82 -16
  408. package/scripts/josh/josh-commands-clone.ts +1 -0
  409. package/scripts/josh/josh-commands-development.ts +111 -71
  410. package/scripts/josh/josh-commands-document.ts +43 -1
  411. package/scripts/josh/josh-commands-epic.ts +171 -0
  412. package/scripts/josh/josh-commands-hooks.ts +31 -2
  413. package/scripts/josh/josh-commands-issue-write.ts +181 -0
  414. package/scripts/josh/josh-commands-issue.ts +124 -24
  415. package/scripts/josh/josh-commands-lane.ts +112 -2
  416. package/scripts/josh/josh-commands-lint.ts +19 -8
  417. package/scripts/josh/josh-commands-maintenance.ts +112 -4
  418. package/scripts/josh/josh-commands-pause.ts +29 -0
  419. package/scripts/josh/josh-commands-progress.ts +87 -0
  420. package/scripts/josh/josh-commands-project.ts +138 -9
  421. package/scripts/josh/josh-commands-review.ts +124 -0
  422. package/scripts/josh/josh-commands-run.ts +211 -23
  423. package/scripts/josh/josh-commands-ship.ts +169 -0
  424. package/scripts/josh/josh-commands-split.ts +9 -0
  425. package/scripts/josh/josh-commands-versioning.ts +49 -2
  426. package/scripts/josh/josh-commands-workflow.ts +149 -6
  427. package/scripts/josh/josh-logic.ts +11 -27
  428. package/scripts/josh/josh.ts +14 -5
  429. package/scripts/josh/package-directory.ts +18 -0
  430. package/scripts/josh/process-identity.ts +13 -4
  431. package/scripts/josh/session-language-cli.ts +4 -8
  432. package/scripts/josh/session-language-main.ts +13 -0
  433. package/scripts/josh/session-language.ts +6 -1
  434. package/scripts/josh/shared-cache.ts +90 -0
  435. package/scripts/josh/stamp-file.ts +9 -15
  436. package/scripts/lane/lane-await.ts +51 -12
  437. package/scripts/lane/lane-cache.ts +5 -30
  438. package/scripts/lane/lane-capacity.ts +19 -22
  439. package/scripts/lane/lane-check-stats.ts +97 -0
  440. package/scripts/lane/lane-child-invocation.ts +43 -4
  441. package/scripts/lane/lane-cli.ts +15 -5
  442. package/scripts/lane/lane-close.ts +86 -18
  443. package/scripts/lane/lane-core-wait-stats.ts +66 -0
  444. package/scripts/lane/lane-dispatch.ts +27 -6
  445. package/scripts/lane/lane-gap-stats.ts +156 -0
  446. package/scripts/lane/lane-guard-policy.ts +2 -2
  447. package/scripts/lane/lane-handoff.ts +76 -1
  448. package/scripts/lane/lane-held-stats.ts +129 -0
  449. package/scripts/lane/lane-install.ts +16 -15
  450. package/scripts/lane/lane-launch-cli.ts +0 -9
  451. package/scripts/lane/lane-launch-main.ts +12 -0
  452. package/scripts/lane/lane-ledger-schema.ts +266 -0
  453. package/scripts/lane/lane-ledger.ts +108 -97
  454. package/scripts/lane/lane-limit-cli.ts +19 -9
  455. package/scripts/lane/lane-measure-cli.ts +58 -10
  456. package/scripts/lane/lane-open.ts +9 -1
  457. package/scripts/lane/lane-parked.ts +3 -3
  458. package/scripts/lane/lane-pause-cli.ts +130 -0
  459. package/scripts/lane/lane-pause.ts +158 -0
  460. package/scripts/lane/lane-preserve.ts +29 -1
  461. package/scripts/lane/lane-process-table.ts +166 -0
  462. package/scripts/lane/lane-reap-settle.ts +124 -0
  463. package/scripts/lane/lane-reap.ts +50 -15
  464. package/scripts/lane/lane-registry.ts +33 -10
  465. package/scripts/lane/lane-residents.ts +162 -0
  466. package/scripts/lane/lane-restart.ts +26 -27
  467. package/scripts/lane/lane-round-two-stats.ts +49 -0
  468. package/scripts/lane/lane-sampler.ts +4 -0
  469. package/scripts/lane/lane-session-action.ts +160 -0
  470. package/scripts/lane/lane-session-broker.ts +134 -134
  471. package/scripts/lane/lane-snapshot-trace.ts +84 -0
  472. package/scripts/lane/lane-spans.ts +51 -0
  473. package/scripts/lane/lane-spent.ts +6 -3
  474. package/scripts/lane/lane-stage-stats.ts +7 -2
  475. package/scripts/lane/lane-state.ts +302 -0
  476. package/scripts/lane/lane-stats.ts +58 -4
  477. package/scripts/lane/lane-stop-stats.ts +113 -37
  478. package/scripts/lane/lane-test-related-stats.ts +127 -0
  479. package/scripts/lane/lane-transcript-calls.ts +145 -0
  480. package/scripts/lane/lane-transcript-stats.ts +168 -0
  481. package/scripts/lane/lane-vacant.ts +13 -3
  482. package/scripts/lane/lane-withdraw-cli.ts +72 -0
  483. package/scripts/lane/lane-withdraw.ts +183 -0
  484. package/scripts/lane/process-directories.ts +70 -0
  485. package/scripts/lane/process-lane-marks.ts +94 -0
  486. package/scripts/lib/atomic-write.ts +62 -0
  487. package/scripts/lib/buffered-process.ts +12 -5
  488. package/scripts/lib/cli-flags.ts +53 -0
  489. package/scripts/lib/figure-format.ts +63 -0
  490. package/scripts/lib/json-value.ts +9 -1
  491. package/scripts/lib/package-manifest.ts +35 -0
  492. package/scripts/lib/read-file.ts +3 -1
  493. package/scripts/lib/stamped-memo.ts +63 -0
  494. package/scripts/lib/stdout-on-stderr.ts +24 -0
  495. package/scripts/lib/timeouts.ts +9 -0
  496. package/scripts/lib/transcript-record.ts +91 -0
  497. package/scripts/lines/effective-limit.ts +1 -1
  498. package/scripts/lint/eslint-cache-dependencies.ts +145 -0
  499. package/scripts/lint/eslint-daemon.ts +265 -0
  500. package/scripts/lint/format.ts +14 -5
  501. package/scripts/lint/import-graph.ts +279 -0
  502. package/scripts/lint/lint-gate-scope.ts +102 -0
  503. package/scripts/lint/lint-parallel-main.ts +19 -0
  504. package/scripts/lint/lint-parallel.ts +72 -33
  505. package/scripts/lint/lint-related-scope.ts +33 -24
  506. package/scripts/lint/lint-related.ts +38 -6
  507. package/scripts/notify/confirmation-options.ts +1 -2
  508. package/scripts/notify/telegram-notify.ts +20 -20
  509. package/scripts/notify/telegram-test-logic.ts +0 -1
  510. package/scripts/notify/telegram-test-main.ts +8 -0
  511. package/scripts/notify/telegram-test.ts +12 -11
  512. package/scripts/observations/observation-ledger.ts +13 -0
  513. package/scripts/observations/observations-flush-landing.ts +5 -3
  514. package/scripts/observations/observations-flush.ts +6 -1
  515. package/scripts/overrides/overrides-check.ts +2 -5
  516. package/scripts/overrides/overrides-files.ts +2 -1
  517. package/scripts/overrides/overrides-logic.ts +3 -6
  518. package/scripts/package/verify-optional-eslint-install.ts +8 -6
  519. package/scripts/propagate/propagate-publish.ts +2 -7
  520. package/scripts/propagate/propagate-targets.ts +4 -12
  521. package/scripts/refactor/import-graph.ts +9 -7
  522. package/scripts/release/github-release-runs.ts +17 -6
  523. package/scripts/release/release-approval-prune.ts +18 -0
  524. package/scripts/release/release-history.ts +1 -3
  525. package/scripts/release/release-progress.ts +42 -22
  526. package/scripts/release/release-publish-run.ts +39 -0
  527. package/scripts/release/release-publish.ts +6 -6
  528. package/scripts/release/release-scope-cli.ts +0 -10
  529. package/scripts/release/release-scope-main.ts +12 -0
  530. package/scripts/repo/repo-setting.ts +3 -6
  531. package/scripts/repo/required-checks-logic.ts +6 -15
  532. package/scripts/report/report-format-reference.ts +4 -0
  533. package/scripts/report/report-labels.ts +155 -0
  534. package/scripts/report/report-lint-cli.ts +3 -0
  535. package/scripts/report/report-lint.ts +85 -110
  536. package/scripts/report/report-template-cli.ts +59 -0
  537. package/scripts/report/report-template.ts +112 -0
  538. package/scripts/review/acceptance-map-check.ts +61 -0
  539. package/scripts/review/acceptance-map.ts +206 -0
  540. package/scripts/review/removed-tests-check.ts +86 -0
  541. package/scripts/review/removed-tests.ts +149 -0
  542. package/scripts/review/review-brief-cli.ts +82 -16
  543. package/scripts/review/review-brief-main.ts +12 -0
  544. package/scripts/review/review-brief.ts +31 -3
  545. package/scripts/review/review-code-tree.ts +10 -6
  546. package/scripts/review/review-comment-round.ts +26 -8
  547. package/scripts/review/review-finding-ledger.ts +30 -15
  548. package/scripts/review/review-interaction.ts +94 -0
  549. package/scripts/review/review-readers-scan.ts +163 -0
  550. package/scripts/review/review-record-cli.ts +69 -30
  551. package/scripts/review/review-record-main.ts +12 -0
  552. package/scripts/review/review-round-one-blobs.ts +221 -0
  553. package/scripts/review/review-round2-cli.ts +49 -12
  554. package/scripts/review/review-round2.ts +80 -12
  555. package/scripts/review/review-stamps.ts +19 -1
  556. package/scripts/review/review-stop-log.ts +96 -0
  557. package/scripts/review/review-stops-cli.ts +85 -0
  558. package/scripts/review/review-tree.ts +6 -17
  559. package/scripts/review/review-untouched-readers.ts +146 -0
  560. package/scripts/review/test-titles.ts +118 -0
  561. package/scripts/rules/agent-model.ts +67 -0
  562. package/scripts/rules/bash-triggers.ts +46 -3
  563. package/scripts/rules/decision-oracle-batch.ts +9 -1
  564. package/scripts/rules/decision-oracle.ts +2 -2
  565. package/scripts/rules/delivered-rules.ts +90 -3
  566. package/scripts/rules/destructive-command.ts +8 -1
  567. package/scripts/rules/direct-filing.ts +10 -2
  568. package/scripts/rules/direct-issue-comment.ts +117 -0
  569. package/scripts/rules/direct-pr-create.ts +69 -3
  570. package/scripts/rules/early-heartbeat.ts +2 -1
  571. package/scripts/rules/file-body.ts +7 -0
  572. package/scripts/rules/filing-cap.ts +8 -0
  573. package/scripts/rules/firing-point.ts +6 -5
  574. package/scripts/rules/git-argv.ts +72 -14
  575. package/scripts/rules/git-force.ts +12 -2
  576. package/scripts/rules/guard-remedy.ts +121 -0
  577. package/scripts/rules/implementation-cut-verdict.ts +1 -1
  578. package/scripts/rules/implementation-cut.ts +11 -3
  579. package/scripts/rules/index-guard.ts +8 -1
  580. package/scripts/rules/issue-comments.ts +76 -7
  581. package/scripts/rules/josh-git-bare.ts +7 -0
  582. package/scripts/rules/lane-background.ts +67 -25
  583. package/scripts/rules/lane-carry-conflict.ts +6 -0
  584. package/scripts/rules/lane-direct-tool.ts +74 -0
  585. package/scripts/rules/lane-interactive-ask.ts +9 -2
  586. package/scripts/rules/lane-park.ts +45 -23
  587. package/scripts/rules/lane-split-park.ts +10 -2
  588. package/scripts/rules/lane-switch-main.ts +7 -0
  589. package/scripts/rules/last-prompt.ts +50 -5
  590. package/scripts/rules/oracle-consulted.ts +10 -0
  591. package/scripts/rules/oracle-firing.ts +1 -0
  592. package/scripts/rules/oracle-list-cli.ts +7 -0
  593. package/scripts/rules/permission-guards.ts +3 -0
  594. package/scripts/rules/piped-verification.ts +4 -2
  595. package/scripts/rules/poll-loop.ts +7 -0
  596. package/scripts/rules/pr-merge.ts +123 -0
  597. package/scripts/rules/protected-files.ts +32 -5
  598. package/scripts/rules/raw-field-body.ts +6 -0
  599. package/scripts/rules/rule-body-guard.ts +8 -0
  600. package/scripts/rules/rule-list.ts +12 -28
  601. package/scripts/rules/rule-rewrite.ts +114 -0
  602. package/scripts/rules/rule-value-cache.ts +4 -9
  603. package/scripts/rules/rule-value-cli.ts +51 -32
  604. package/scripts/rules/rule-value.ts +8 -2
  605. package/scripts/rules/shell-segments.ts +50 -0
  606. package/scripts/rules/stop-decision.ts +77 -0
  607. package/scripts/rules/stop-rule-rows.ts +64 -0
  608. package/scripts/rules/stop-rules.ts +150 -51
  609. package/scripts/rules/tail-commands.ts +15 -1
  610. package/scripts/rules/test-declared-commit.ts +11 -1
  611. package/scripts/rules/third-party-write.ts +7 -0
  612. package/scripts/rules/timed-rerun.ts +69 -0
  613. package/scripts/rules/worktree-guard.ts +13 -3
  614. package/scripts/run/board/run-board-app-name.ts +23 -0
  615. package/scripts/run/board/run-board-cli.ts +65 -30
  616. package/scripts/run/board/run-board-closed.ts +8 -2
  617. package/scripts/run/board/run-board-earlier.ts +94 -0
  618. package/scripts/run/board/run-board-ending-reason.ts +67 -0
  619. package/scripts/run/board/run-board-estimate-schedule.ts +103 -0
  620. package/scripts/run/board/run-board-estimate.ts +98 -0
  621. package/scripts/run/board/run-board-fit.ts +153 -36
  622. package/scripts/run/board/run-board-fold.ts +123 -0
  623. package/scripts/run/board/run-board-fresh.ts +2 -2
  624. package/scripts/run/board/run-board-gather-live.ts +29 -0
  625. package/scripts/run/board/run-board-gather-thread.ts +189 -0
  626. package/scripts/run/board/run-board-gather-worker.ts +29 -0
  627. package/scripts/run/board/run-board-gather.ts +187 -0
  628. package/scripts/run/board/run-board-github.ts +119 -31
  629. package/scripts/run/board/run-board-header.ts +86 -21
  630. package/scripts/run/board/run-board-keys.ts +58 -0
  631. package/scripts/run/board/run-board-kind.ts +20 -6
  632. package/scripts/run/board/run-board-labels.ts +118 -71
  633. package/scripts/run/board/run-board-lane-state.ts +109 -0
  634. package/scripts/run/board/run-board-lane-time.ts +122 -0
  635. package/scripts/run/board/run-board-layout.ts +240 -61
  636. package/scripts/run/board/run-board-length.ts +52 -0
  637. package/scripts/run/board/run-board-machine.ts +8 -4
  638. package/scripts/run/board/run-board-main.ts +12 -0
  639. package/scripts/run/board/run-board-notes.ts +52 -31
  640. package/scripts/run/board/run-board-now.ts +1 -1
  641. package/scripts/run/board/run-board-operation.ts +15 -33
  642. package/scripts/run/board/run-board-phase.ts +1 -1
  643. package/scripts/run/board/run-board-plan-shared.ts +115 -0
  644. package/scripts/run/board/run-board-plan.ts +55 -3
  645. package/scripts/run/board/run-board-planning.ts +45 -0
  646. package/scripts/run/board/run-board-priority.ts +44 -0
  647. package/scripts/run/board/run-board-process-groups.ts +195 -0
  648. package/scripts/run/board/run-board-read.ts +153 -13
  649. package/scripts/run/board/run-board-reason.ts +238 -45
  650. package/scripts/run/board/run-board-released.ts +35 -0
  651. package/scripts/run/board/run-board-render-checks.ts +39 -5
  652. package/scripts/run/board/run-board-render-condition.ts +96 -0
  653. package/scripts/run/board/run-board-render-drawn.ts +67 -0
  654. package/scripts/run/board/run-board-render-foot.ts +59 -0
  655. package/scripts/run/board/run-board-render-icon.ts +35 -0
  656. package/scripts/run/board/run-board-render-lanes.ts +145 -0
  657. package/scripts/run/board/run-board-render-lead.ts +80 -0
  658. package/scripts/run/board/run-board-render-legend.ts +117 -47
  659. package/scripts/run/board/run-board-render-notes.ts +156 -29
  660. package/scripts/run/board/run-board-render-processes.ts +196 -0
  661. package/scripts/run/board/run-board-render-section.ts +119 -0
  662. package/scripts/run/board/run-board-render-slot.ts +3 -36
  663. package/scripts/run/board/run-board-render-tail.ts +115 -48
  664. package/scripts/run/board/run-board-render-time.ts +56 -0
  665. package/scripts/run/board/run-board-render-title.ts +117 -24
  666. package/scripts/run/board/run-board-render-waits.ts +125 -0
  667. package/scripts/run/board/run-board-render.ts +206 -259
  668. package/scripts/run/board/run-board-roots.ts +54 -0
  669. package/scripts/run/board/run-board-row-yield.ts +10 -4
  670. package/scripts/run/board/run-board-setup.ts +1 -12
  671. package/scripts/run/board/run-board-snapshot.ts +111 -0
  672. package/scripts/run/board/run-board-spin.ts +2 -2
  673. package/scripts/run/board/run-board-state.ts +23 -29
  674. package/scripts/run/board/run-board-status.ts +206 -79
  675. package/scripts/run/board/run-board-thanks-read.ts +2 -2
  676. package/scripts/run/board/run-board-tick.ts +123 -104
  677. package/scripts/run/board/run-board-usage-board.ts +78 -0
  678. package/scripts/run/board/run-board-usage-lanes.ts +113 -0
  679. package/scripts/run/board/run-board-usage-listing.ts +93 -0
  680. package/scripts/run/board/run-board-usage-read.ts +120 -150
  681. package/scripts/run/board/run-board-usage-rusage.ts +19 -7
  682. package/scripts/run/board/run-board-usage-text.ts +139 -51
  683. package/scripts/run/board/run-board-usage-top.ts +102 -0
  684. package/scripts/run/board/run-board-usage.ts +89 -72
  685. package/scripts/run/board/run-board-usual.ts +20 -9
  686. package/scripts/run/carry/run-carry-args.ts +4 -7
  687. package/scripts/run/carry/run-carry-conversation.ts +1 -1
  688. package/scripts/run/carry/run-carry.ts +9 -4
  689. package/scripts/run/cut/run-cut-cli.ts +3 -2
  690. package/scripts/run/cut/run-cut-handoff.ts +2 -2
  691. package/scripts/run/cut/run-cut-report.ts +16 -0
  692. package/scripts/run/detached-launch.ts +23 -4
  693. package/scripts/run/entry/run-entry-cli.ts +8 -1
  694. package/scripts/run/event/run-event-cli.ts +1 -5
  695. package/scripts/run/event/run-event-filed.ts +12 -6
  696. package/scripts/run/event/run-event-follow.ts +2 -3
  697. package/scripts/run/event/run-event-render.ts +7 -10
  698. package/scripts/run/event/run-event-scope.ts +20 -2
  699. package/scripts/run/event/run-event-stream-emit.ts +78 -11
  700. package/scripts/run/event/run-event-stream.ts +37 -7
  701. package/scripts/run/hold/run-hold-adopt.ts +65 -0
  702. package/scripts/run/hold/run-hold-cli.ts +93 -22
  703. package/scripts/run/hold/run-hold-main.ts +12 -0
  704. package/scripts/run/hold/run-hold-member.ts +37 -0
  705. package/scripts/run/hold/run-hold-session.ts +46 -0
  706. package/scripts/run/hold/run-hold.ts +7 -1
  707. package/scripts/run/hold/run-stop-notify.ts +183 -0
  708. package/scripts/run/launch-priority.ts +32 -0
  709. package/scripts/run/merge/run-merge-auth.ts +31 -0
  710. package/scripts/run/merge/run-merge-cli.ts +72 -107
  711. package/scripts/run/merge/run-merge-close.ts +74 -0
  712. package/scripts/run/merge/run-merge-collect.ts +6 -13
  713. package/scripts/run/merge/run-merge-driver.ts +71 -0
  714. package/scripts/run/merge/run-merge-main.ts +12 -0
  715. package/scripts/run/merge/run-merge-outcome.ts +23 -0
  716. package/scripts/run/merge/run-merge-restart.ts +39 -0
  717. package/scripts/run/merge/run-merge-ship.ts +20 -4
  718. package/scripts/run/merge/run-merge-signals.ts +123 -0
  719. package/scripts/run/merge/run-merge-steps.ts +128 -83
  720. package/scripts/run/merge/run-merge.ts +53 -40
  721. package/scripts/run/park/run-park-cli.ts +91 -0
  722. package/scripts/run/park/run-park.ts +88 -0
  723. package/scripts/run/park/run-stalled.ts +68 -0
  724. package/scripts/run/pause/run-pause-cli.ts +73 -0
  725. package/scripts/run/pause/run-pause.ts +251 -0
  726. package/scripts/run/progress/run-progress-cli.ts +4 -12
  727. package/scripts/run/progress/run-progress-clock.ts +1 -1
  728. package/scripts/run/progress/run-progress-config.ts +6 -14
  729. package/scripts/run/progress/run-progress-main.ts +12 -0
  730. package/scripts/run/progress/run-progress.ts +1 -4
  731. package/scripts/run/review/run-review.ts +2 -1
  732. package/scripts/run/run-ending.ts +1 -0
  733. package/scripts/run/run-invocation.ts +5 -6
  734. package/scripts/run/run-liveness-cli.ts +6 -8
  735. package/scripts/run/run-liveness.ts +61 -30
  736. package/scripts/run/run-next.ts +1 -1
  737. package/scripts/run/run-parent-cut-hook.ts +2 -2
  738. package/scripts/run/run-poll-hook.ts +157 -0
  739. package/scripts/run/run-preflight.ts +18 -3
  740. package/scripts/run/run-prep-cli.ts +1 -10
  741. package/scripts/run/run-prep-locate.ts +7 -50
  742. package/scripts/run/run-prep-main.ts +12 -0
  743. package/scripts/run/run-prep.ts +6 -0
  744. package/scripts/run/run-report-cli.ts +101 -13
  745. package/scripts/run/run-report-handoff.ts +114 -0
  746. package/scripts/run/run-step-cli.ts +22 -15
  747. package/scripts/run/run-step-section.ts +85 -0
  748. package/scripts/run/run-step.ts +1 -1
  749. package/scripts/run/run-stranded-detect.ts +13 -0
  750. package/scripts/run/run-watcher-guard-cli.ts +1 -1
  751. package/scripts/run/run-watcher-guard.ts +1 -1
  752. package/scripts/run/ship/run-ship-args.ts +121 -0
  753. package/scripts/run/ship/run-ship-body-draft.ts +110 -0
  754. package/scripts/run/ship/run-ship-cli.ts +67 -151
  755. package/scripts/run/ship/run-ship-detach.ts +27 -7
  756. package/scripts/run/ship/run-ship-infra-retry.ts +59 -0
  757. package/scripts/run/ship/run-ship-next.ts +27 -3
  758. package/scripts/run/ship/run-ship-overlap.ts +232 -0
  759. package/scripts/run/ship/run-ship-place.ts +96 -0
  760. package/scripts/run/ship/run-ship-pre-detach-timed.ts +43 -0
  761. package/scripts/run/ship/run-ship-pre-detach.ts +102 -27
  762. package/scripts/run/ship/run-ship-preflight.ts +161 -30
  763. package/scripts/run/ship/run-ship-probe.ts +11 -3
  764. package/scripts/run/ship/run-ship-relaunch-cap.ts +70 -0
  765. package/scripts/run/ship/run-ship-removed-rows.ts +61 -0
  766. package/scripts/run/ship/run-ship-return.ts +123 -15
  767. package/scripts/run/ship/run-ship-review-steps.ts +105 -149
  768. package/scripts/run/ship/run-ship-review.ts +73 -6
  769. package/scripts/run/ship/run-ship-reviewer.ts +207 -0
  770. package/scripts/run/ship/run-ship-stage.ts +55 -6
  771. package/scripts/run/ship/run-ship-steps.ts +46 -15
  772. package/scripts/run/ship/run-ship-stop-cause.ts +135 -0
  773. package/scripts/run/ship/run-ship-stop-context.ts +206 -0
  774. package/scripts/run/ship/run-ship-stop-text.ts +11 -6
  775. package/scripts/run/ship/run-ship-sync.ts +57 -12
  776. package/scripts/run/ship/run-ship.ts +30 -2
  777. package/scripts/run/tidy/run-tidy-cli.ts +0 -4
  778. package/scripts/run/tidy/run-tidy-lanes.ts +3 -0
  779. package/scripts/run/tidy/run-tidy-main.ts +8 -0
  780. package/scripts/run/wake/run-wake-cli.ts +119 -100
  781. package/scripts/run/wake/run-wake-code.ts +83 -0
  782. package/scripts/run/wake/run-wake-driver.ts +19 -8
  783. package/scripts/run/wake/run-wake-loop.ts +34 -3
  784. package/scripts/run/wake/run-wake-main.ts +13 -0
  785. package/scripts/run/wake/run-wake-ports.ts +90 -0
  786. package/scripts/run/wake/run-wake-takeover.ts +66 -0
  787. package/scripts/run/wake/run-wake.ts +2 -1
  788. package/scripts/safe-chain/pack-hook.ts +2 -2
  789. package/scripts/safe-chain/preinstall-command.ts +2 -1
  790. package/scripts/safe-chain/project-config.ts +3 -9
  791. package/scripts/security/security-audit-main.ts +8 -0
  792. package/scripts/security/security-audit-provision-logic.ts +0 -11
  793. package/scripts/security/security-audit-provision-main.ts +12 -0
  794. package/scripts/security/security-audit-provision.ts +11 -26
  795. package/scripts/security/security-audit.ts +6 -7
  796. package/scripts/self-sync-guard/self-sync-guard-logic.ts +6 -13
  797. package/scripts/split/split-assess-cli.ts +2 -2
  798. package/scripts/split/split-assess.ts +15 -0
  799. package/scripts/split/split-measure.ts +65 -0
  800. package/scripts/sync/claude-settings-merge.ts +8 -15
  801. package/scripts/sync/directory-copy-guard.ts +4 -9
  802. package/scripts/sync/file-content.ts +78 -8
  803. package/scripts/sync/sync-ai-files.ts +3 -5
  804. package/scripts/sync/sync-configs.ts +11 -23
  805. package/scripts/sync/sync-hook-safety.ts +4 -10
  806. package/scripts/sync/sync-main.ts +11 -0
  807. package/scripts/sync/sync.ts +25 -37
  808. package/scripts/test/test-declared-changed.ts +2 -2
  809. package/scripts/test/test-declared.ts +1 -1
  810. package/scripts/test/test-e2e-guard.ts +55 -6
  811. package/scripts/test/test-e2e-stamp.ts +38 -0
  812. package/scripts/test/test-pinned-logic.ts +145 -0
  813. package/scripts/test/test-pinned-main.ts +78 -0
  814. package/scripts/test/test-pinned.ts +100 -0
  815. package/scripts/test/test-read-map.ts +264 -0
  816. package/scripts/test/test-read-recording.ts +91 -0
  817. package/scripts/test/test-read-trace.ts +148 -0
  818. package/scripts/test/test-red-main.ts +12 -0
  819. package/scripts/test/test-red.ts +12 -30
  820. package/scripts/test/test-related-main.ts +18 -0
  821. package/scripts/test/test-related-record.ts +119 -0
  822. package/scripts/test/test-related-scope.ts +229 -43
  823. package/scripts/test/test-related.ts +300 -22
  824. package/scripts/test/test-unit-guard-main.ts +15 -0
  825. package/scripts/test/test-unit-guard.ts +54 -21
  826. package/scripts/test/unit-count-file.ts +37 -0
  827. package/scripts/test/unit-run-marker.ts +162 -0
  828. package/scripts/test/unit-setup-files.ts +51 -0
  829. package/scripts/test/unit-worker-share.ts +71 -137
  830. package/scripts/test/whole-suite-files.ts +63 -0
  831. package/scripts/time-runtime/time-background.ts +20 -2
  832. package/scripts/time-runtime/time-bundles.ts +4 -3
  833. package/scripts/time-runtime/time-density-hook.ts +8 -6
  834. package/scripts/time-runtime/time-followup-stage.ts +1 -3
  835. package/scripts/time-runtime/time-format.ts +5 -28
  836. package/scripts/time-runtime/time-markers.ts +10 -1
  837. package/scripts/time-runtime/time-shell.ts +126 -14
  838. package/scripts/time-runtime/time-spans.ts +1 -0
  839. package/scripts/time-runtime/time-tool-call.ts +7 -0
  840. package/scripts/time-runtime/time-transcript-line.ts +49 -62
  841. package/scripts/uninstall/uninstall.ts +1 -1
  842. package/scripts/version/bump-version-main.ts +12 -0
  843. package/scripts/version/bump-version.ts +25 -25
  844. package/scripts/version/effective-upstream.ts +6 -12
  845. package/scripts/version/latest-corepack.ts +17 -32
  846. package/scripts/version/latest-if-required-cli.ts +93 -0
  847. package/scripts/version/latest-lane-guard-main.ts +8 -0
  848. package/scripts/version/latest-lane-guard.ts +0 -4
  849. package/scripts/version/latest-scope-cli.ts +0 -9
  850. package/scripts/version/latest-scope-main.ts +12 -0
  851. package/scripts/version/latest-update.ts +5 -5
  852. package/scripts/version/npm-registry.ts +44 -6
  853. package/scripts/version/publishable-range-check.ts +5 -16
  854. package/scripts/version/release-age.ts +1 -1
  855. package/scripts/version/release-hold.ts +1 -1
  856. package/scripts/version/release-window.ts +38 -0
  857. package/scripts/version/running-binary.ts +1 -1
  858. package/scripts/version/safe-chain-version-update.ts +3 -8
  859. package/scripts/version/version-targets.ts +6 -28
  860. package/templates/dependabot.yml +29 -0
  861. package/templates/gitignore +10 -3
  862. package/templates/pnpm-workspace.basic.yaml +1 -1
  863. package/templates/sonar-project.properties +3 -2
  864. package/templates/workflows/ci.yml +12 -4
  865. package/templates/workflows/github-release.yml +4 -0
  866. package/tsconfig.sonar.json +1 -1
  867. package/.ncurc.json +0 -3
  868. package/dist/hooks/batch-guard.js +0 -29
  869. package/dist/hooks/chunk-43ZHT22P.js +0 -3495
  870. package/dist/hooks/chunk-CDY4NFQG.js +0 -15
  871. package/dist/hooks/chunk-EUMACUK2.js +0 -2038
  872. package/dist/hooks/chunk-H5HVWYXK.js +0 -359
  873. package/dist/hooks/chunk-IIGFYXKC.js +0 -7104
  874. package/dist/hooks/chunk-IX6TTTI6.js +0 -95
  875. package/dist/hooks/chunk-J47HU5H5.js +0 -237
  876. package/dist/hooks/chunk-K4EOONYM.js +0 -45
  877. package/dist/hooks/chunk-K4LMBQC2.js +0 -68
  878. package/dist/hooks/chunk-SHGPANFB.js +0 -56
  879. package/dist/hooks/chunk-YHBZAJSV.js +0 -79
  880. package/dist/hooks/chunk-YYPI7SJZ.js +0 -131
  881. package/dist/hooks/duplicate-read-guard.js +0 -30
  882. package/dist/hooks/investigation-guard.js +0 -32
  883. package/scripts/backlog/backlog-stalled-cli.ts +0 -30
  884. package/scripts/cost-runtime/cost-format.ts +0 -29
  885. package/scripts/init/basic-path-migration.ts +0 -24
  886. package/scripts/issue/issue-backlinks-cli.ts +0 -93
  887. package/scripts/josh/josh-commands-guard.ts +0 -38
  888. package/scripts/lint/cross-file-recheck.ts +0 -155
  889. package/scripts/registry-migration/migrate-logic.ts +0 -237
  890. package/scripts/registry-migration/migrate.ts +0 -292
  891. package/scripts/registry-migration/user-npmrc.ts +0 -15
  892. package/scripts/rules/rule-guard.ts +0 -23
  893. package/scripts/rules/rule-registry-rows.ts +0 -282
  894. package/scripts/rules/rule-registry.ts +0 -109
  895. package/scripts/run/run-stranded-cli.ts +0 -27
@@ -1,9 +1,9 @@
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
9
  import { forget_pr_numbers, git_gh_pr_read, read_pull, require_pr_number } from './git-gh-pr-read'
@@ -49,25 +49,27 @@ const MERGE_UNCONFIRMED_MESSAGE =
49
49
  'gh api could not read the pull request back after the merge request failed'
50
50
  const MERGE_READ_BACK_ATTEMPTS = 3
51
51
  const MERGE_READ_BACK_INTERVAL_MS = 1000
52
+ // `PUT pulls/{N}/merge` with a `sha` that is no longer the branch head.
53
+ const HEAD_MOVED_STATUS = 409
52
54
  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
55
 
56
+ // A pull request is an issue to the labels endpoint, so the write is the issue one: a failed answer
57
+ // is confirmed by reading the labels back before it is reported as a failed write.
56
58
  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
- })
59
+ const write = await git_gh_issue_write.issue_apply_label(number, label)
60
+
61
+ if (!write.is_applied) throw new Error(write.reason)
61
62
  }
62
63
 
64
+ // Labels that could not be read are not "no classification": answering that would add a second
65
+ // classification beside the one a person already put on the pull request.
63
66
  async function pr_get_classification(
64
67
  branch_name: string,
65
68
  ): Promise<ReleaseClassification | undefined> {
66
69
  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())
70
+ const labels = await git_gh_issue_write.read_label_names(String(number))
71
+ if (labels === undefined) throw new Error(`Unreadable labels on branch ${branch_name}`)
72
+ const names = labels.map((name) => name.toLowerCase())
71
73
  const selected = names.filter((name) => pr_classification.is_classification(name))
72
74
  if (selected.length === 0) return undefined
73
75
 
@@ -166,16 +168,25 @@ async function pr_update_body(branch_name: string, body: string): Promise<void>
166
168
  }
167
169
 
168
170
  // A merge moves the remembered detail read's state, so it is cleared first.
169
- async function put_merge(pr_number: number): Promise<void> {
171
+ //
172
+ // **`sha` binds the merge to the head the checks passed on** (#4036): without it GitHub merges
173
+ // whatever the branch points at, so a commit pushed after the gate went green would land unverified.
174
+ // A head that moved is answered 409 (`is_head_moved`).
175
+ async function put_merge(pr_number: number, head_sha: string): Promise<void> {
170
176
  forget_pr_numbers()
171
177
  await git_gh_exec.exec_gh_api({
172
178
  path: git_gh_api_path.pull_merge_api_path(String(pr_number)),
173
179
  method: PUT_METHOD,
174
- body: JSON.stringify({ merge_method: MERGE_COMMIT_METHOD }),
180
+ body: JSON.stringify({ merge_method: MERGE_COMMIT_METHOD, sha: head_sha }),
175
181
  timeout_ms: MERGE_REQUEST_TIMEOUT_MS,
176
182
  })
177
183
  }
178
184
 
185
+ // GitHub's answer to a merge whose `sha` is no longer the branch head.
186
+ function is_head_moved(error: unknown): boolean {
187
+ return gh_failure.failure_of(error)?.status === HEAD_MOVED_STATUS
188
+ }
189
+
179
190
  // `undefined` is "nobody read it", kept apart from the `false` that means "the pull request is not
180
191
  // merged". Folding the two would report an unread state as a settled answer.
181
192
  async function read_merge_state(pr_number: number): Promise<boolean | undefined> {
@@ -240,11 +251,11 @@ async function has_merge_landed(pr_number: number, merge_error: unknown): Promis
240
251
  // made by hand between the failure and the read leaves `followup` with exactly the same work to
241
252
  // finish. REST offers nothing that would tell the two apart without keeping the merge commit's SHA
242
253
  // across a request that never answered.
243
- async function pr_merge(branch_name: string): Promise<void> {
254
+ async function pr_merge(branch_name: string, head_sha: string): Promise<void> {
244
255
  const pr_number = await require_pr_number(branch_name)
245
256
 
246
257
  try {
247
- await put_merge(pr_number)
258
+ await put_merge(pr_number, head_sha)
248
259
  } catch (error) {
249
260
  if (!(await has_merge_landed(pr_number, error))) throw error
250
261
  }
@@ -259,6 +270,7 @@ const git_gh_pr = {
259
270
  pr_comment,
260
271
  pr_merge,
261
272
  pr_update_body,
273
+ is_head_moved,
262
274
  }
263
275
 
264
276
  export { git_gh_pr, MERGE_COMMIT_METHOD, MERGE_REQUEST_TIMEOUT_MS, MERGE_UNCONFIRMED_MESSAGE }
@@ -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
@@ -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 {
@@ -0,0 +1,80 @@
1
+ import { git_gh_command } from './git-gh-command'
2
+ import { git_pr_checks, type PrStateSnapshot } from './git-pr-checks'
3
+
4
+ // **A merge lands the head the merge gate passed, and nothing pushed after it** (#4036).
5
+ //
6
+ // The gate reads the checks of one commit, and the merge request names that commit as its `sha`. A
7
+ // push between the two moves the head, GitHub answers 409, and the wait starts over on the new head
8
+ // — so the push is merged once its own checks pass, with nobody having to re-run anything. The
9
+ // retries are bounded: a branch that keeps moving under every wait is not one to merge unattended.
10
+
11
+ const MAX_HEAD_MOVES = 3
12
+ const NO_CHECKED_HEAD_MESSAGE =
13
+ 'The merge gate answered without the head commit it checked, so there is no commit to bind the merge to'
14
+ const HEAD_MOVED_NOTE =
15
+ 'The pull request head moved after its checks passed — waiting on the new head'
16
+ const HEAD_KEPT_MOVING_MESSAGE = `The pull request head moved after its checks passed ${String(MAX_HEAD_MOVES)} times, so it was not merged`
17
+
18
+ type WaitForGreen = () => Promise<PrStateSnapshot>
19
+
20
+ interface CheckedMerge {
21
+ branch_name: string
22
+ // The wait to go back to when the head moved — the caller's own, so a re-wait watches what the
23
+ // first wait watched.
24
+ wait_for_green: WaitForGreen
25
+ // The snapshot the gate already passed. Absent, the merge waits for one first.
26
+ checked?: PrStateSnapshot | undefined
27
+ }
28
+
29
+ function checked_head(snapshot: PrStateSnapshot): string {
30
+ if (snapshot.head_sha === undefined) throw new Error(NO_CHECKED_HEAD_MESSAGE)
31
+
32
+ return snapshot.head_sha
33
+ }
34
+
35
+ // `false` is "the head moved"; every other failure is the caller's to see.
36
+ async function try_merge(branch_name: string, snapshot: PrStateSnapshot): Promise<boolean> {
37
+ const head_sha = checked_head(snapshot)
38
+
39
+ try {
40
+ await git_gh_command.pr_merge(branch_name, head_sha)
41
+
42
+ return true
43
+ } catch (error) {
44
+ if (!git_gh_command.is_head_moved(error)) throw error
45
+
46
+ return false
47
+ }
48
+ }
49
+
50
+ async function merge_checked(input: CheckedMerge): Promise<void> {
51
+ let snapshot = input.checked ?? (await input.wait_for_green())
52
+
53
+ for (let move = 0; move < MAX_HEAD_MOVES; move += 1) {
54
+ // eslint-disable-next-line no-await-in-loop -- each merge names the head the wait before it passed
55
+ if (await try_merge(input.branch_name, snapshot)) return
56
+
57
+ console.info(HEAD_MOVED_NOTE)
58
+ // eslint-disable-next-line no-await-in-loop -- the new head has to pass before it is merged
59
+ snapshot = await input.wait_for_green()
60
+ }
61
+
62
+ throw new Error(HEAD_KEPT_MOVING_MESSAGE)
63
+ }
64
+
65
+ // The merge gate's default wait, then the bound merge.
66
+ async function merge_when_green(branch_name: string): Promise<void> {
67
+ async function wait_for_green(): Promise<PrStateSnapshot> {
68
+ return await git_pr_checks.wait_for_pr_success(branch_name)
69
+ }
70
+
71
+ await merge_checked({ branch_name, wait_for_green })
72
+ }
73
+
74
+ const git_pr_merge_checked = {
75
+ merge_checked,
76
+ merge_when_green,
77
+ }
78
+
79
+ export type { CheckedMerge, WaitForGreen }
80
+ export { git_pr_merge_checked, HEAD_KEPT_MOVING_MESSAGE, MAX_HEAD_MOVES, NO_CHECKED_HEAD_MESSAGE }
@@ -5,6 +5,7 @@ import { issue_cite } from '#scripts/issue/issue-cite'
5
5
  import { session_cite } from '#scripts/issue/session-cite'
6
6
  import { animation_helpers, type AnimationOptions } from '#scripts/lib/animation-helpers'
7
7
  import { json_value } from '#scripts/lib/json-value'
8
+ import { acceptance_map } from '#scripts/review/acceptance-map'
8
9
  import { git_gh_command } from './git-gh-command'
9
10
  import { git_pr_error } from './git-pr-error'
10
11
  import { git_pr_messages } from './git-pr-messages'
@@ -172,6 +173,17 @@ function build_body(issue_info: IssueInfo, extra_body?: string): string {
172
173
  return `${closes}\n\n${extra_body}`
173
174
  }
174
175
 
176
+ // A body without the acceptance-criteria table gets one pending row per criterion, so the author fills
177
+ // in rows that already carry their identifiers — `josh followup` refuses the merge until they do.
178
+ async function body_with_map(issue_info: IssueInfo, extra_body?: string): Promise<string> {
179
+ const body = build_body(issue_info, extra_body)
180
+
181
+ if (acceptance_map.has_map(body)) return body
182
+ const map = acceptance_map.skeleton(await git_gh_command.issue_get_body(issue_info.number))
183
+
184
+ return map === undefined ? body : `${body}\n\n${map}`
185
+ }
186
+
175
187
  async function existing_pr_label(branch_name: string): Promise<ReleaseClassification | undefined> {
176
188
  if (
177
189
  !(await git_gh_command.pr_exists(branch_name)) ||
@@ -190,7 +202,7 @@ async function create_for_issue(
190
202
  ): Promise<void> {
191
203
  await create(
192
204
  build_title(issue_info),
193
- build_body(issue_info, extra_body),
205
+ await body_with_map(issue_info, extra_body),
194
206
  issue_info.branch_name,
195
207
  {
196
208
  label,
@@ -1,4 +1,4 @@
1
- import { mkdtemp, rm, symlink } from 'node:fs/promises'
1
+ import { copyFile, mkdir, mkdtemp, rm, symlink } from 'node:fs/promises'
2
2
  import { tmpdir } from 'node:os'
3
3
  import path from 'node:path'
4
4
  import { git_worktree } from './git-worktree'
@@ -60,7 +60,24 @@ async function with_tree<T>(
60
60
  }
61
61
  }
62
62
 
63
- const base_tree = { NODE_MODULES, with_tree }
63
+ async function copy_one(tree: string, file: string): Promise<void> {
64
+ const target = path.join(tree, file)
65
+
66
+ await mkdir(path.dirname(target), { recursive: true })
67
+ await copyFile(file, target)
68
+ }
69
+
70
+ // The caller's working-tree files into the tree at the same relative paths. Each file has its own
71
+ // target, and a recursive `mkdir` tolerates a sibling creating the same parent.
72
+ async function copy_in(tree: string, files: ReadonlyArray<string>): Promise<void> {
73
+ await Promise.all(
74
+ files.map(async (file) => {
75
+ await copy_one(tree, file)
76
+ }),
77
+ )
78
+ }
79
+
80
+ const base_tree = { NODE_MODULES, copy_in, with_tree }
64
81
 
65
82
  export type { BaseTree }
66
83
  export { base_tree }
@@ -11,9 +11,10 @@ import { git_command } from './git-command'
11
11
  // nothing, and listing what was narrowed by — is identical, so it lives here once rather than in
12
12
  // each command.
13
13
  //
14
- // **A narrowed run is added in front of the whole check, never in place of it.** Both fallbacks
15
- // therefore end at the whole check, and each says which of the two it was: the one thing this must
16
- // never do is answer "nothing to run" quietly.
14
+ // The narrowed unit run replaces the whole suite in the gate (joshuafolkken/kit#4065), and the
15
+ // narrowed lint the whole-tree lint (joshuafolkken/kit#4085), each with CI's whole run behind it.
16
+ // Either way both fallbacks end at the whole check, and each says which of the two it was: the
17
+ // one thing this must never do is answer "nothing to run" quietly.
17
18
 
18
19
  type ScopeMode = 'all' | 'related'
19
20
 
@@ -176,7 +177,7 @@ async function resolve_command_scope(request: ScopeRequest): Promise<ChangedFile
176
177
  // describing a set the caller never handed over.
177
178
  function report_unusable_arguments(
178
179
  command_arguments: ReadonlyArray<string>,
179
- scope: ChangedFileScope,
180
+ scope: Pick<ChangedFileScope, 'files'>,
180
181
  label: string,
181
182
  ): void {
182
183
  const narrowed = new Set(scope.files)
@@ -195,6 +196,7 @@ const changed_file_scope = {
195
196
  UNREADABLE_REASON,
196
197
  describe_scope,
197
198
  flags_of,
199
+ format_file_list,
198
200
  is_flag,
199
201
  read_changed_files,
200
202
  report_unusable_arguments,
@@ -24,6 +24,23 @@ async function read_changed_paths(is_staged: boolean): Promise<Array<string>> {
24
24
  return [...tracked, ...untracked]
25
25
  }
26
26
 
27
- const changed_paths = { read_changed_paths, to_paths }
27
+ // The same reading against any commit rather than the change base — the change since the tree a
28
+ // test-read map was recorded on.
29
+ async function read_changed_since(commit: string): Promise<Array<string>> {
30
+ const tracked = to_paths(await git_command.diff_names_since(commit))
31
+ const untracked = to_paths(await git_command.untracked_names())
32
+
33
+ return [...new Set([...tracked, ...untracked])]
34
+ }
35
+
36
+ // The paths among `paths` the tree of `commit` held. An empty list asks git nothing, since
37
+ // `ls-tree` with no path lists the whole tree.
38
+ async function read_held_at(commit: string, paths: ReadonlyArray<string>): Promise<Array<string>> {
39
+ if (paths.length === 0) return []
40
+
41
+ return to_paths(await git_command.tree_names_at(commit, paths))
42
+ }
43
+
44
+ const changed_paths = { read_changed_paths, read_changed_since, read_held_at, to_paths }
28
45
 
29
46
  export { changed_paths }
@@ -151,18 +151,41 @@ async function change_base_commit(): Promise<string> {
151
151
  return await git_spawn.read(['rev-parse', await change_base()])
152
152
  }
153
153
 
154
- async function diff_main_names(): Promise<string> {
154
+ // The working tree against any commit, with the same flags as the branch diff. `josh test:related`
155
+ // reads the change since the commit its test-read map was recorded on, which is not the merge base.
156
+ async function diff_names_since(commit: string): Promise<string> {
155
157
  return await git_spawn.read([
156
158
  ...NO_PATH_QUOTING,
157
159
  'diff',
158
160
  NAME_ONLY_FLAG,
159
161
  NO_RELATIVE_PATHS,
160
162
  NO_RENAME_DETECTION,
161
- await change_base(),
163
+ commit,
164
+ '--',
165
+ ])
166
+ }
167
+
168
+ // Which of `paths` a commit's tree holds. `josh test:related` asks it of the tree its test-read map
169
+ // was recorded on: a file that tree held and no test read is one no test reads, while a file added
170
+ // since is one the map knows nothing about. **Callers pass at least one path** — with none, `ls-tree`
171
+ // lists the whole tree.
172
+ async function tree_names_at(commit: string, paths: ReadonlyArray<string>): Promise<string> {
173
+ return await git_spawn.read([
174
+ ...NO_PATH_QUOTING,
175
+ 'ls-tree',
176
+ '-r',
177
+ NAME_ONLY_FLAG,
178
+ '--full-tree',
179
+ commit,
162
180
  '--',
181
+ ...paths,
163
182
  ])
164
183
  }
165
184
 
185
+ async function diff_main_names(): Promise<string> {
186
+ return await diff_names_since(await change_base())
187
+ }
188
+
166
189
  async function diff_cached_names(): Promise<string> {
167
190
  return await git_spawn.read([
168
191
  ...NO_PATH_QUOTING,
@@ -224,7 +247,9 @@ const git_diff_reads = {
224
247
  diff_main,
225
248
  diff_main_names,
226
249
  diff_main_numstat,
250
+ diff_names_since,
227
251
  get_default_branch,
252
+ tree_names_at,
228
253
  untracked_names,
229
254
  }
230
255
 
@@ -0,0 +1,85 @@
1
+ import { get_exit_code } from '#scripts/git/git-execa-error'
2
+ import { git_spawn } from '#scripts/git/git-spawn'
3
+
4
+ // One fixed-string `git grep -n` over a pathspec, read back as `file:line` hits with a short excerpt.
5
+ // `run:prep`'s code locations and `plan:consumers` both search a name this way, so the parse and the
6
+ // no-match-versus-failure reading live here rather than in each.
7
+
8
+ const GREP_LINE = /^(?<path>[^:]+):(?<line>\d+):(?<text>.*)$/u
9
+ const MAX_EXCERPT_LENGTH = 80
10
+ const ELLIPSIS = '…'
11
+ // `git grep` exits 1 for no match; any other exit is a search that never ran.
12
+ const GREP_NO_MATCH_EXIT = 1
13
+
14
+ interface Hit {
15
+ path: string
16
+ line: string
17
+ excerpt: string
18
+ }
19
+
20
+ interface GrepResult {
21
+ hits: ReadonlyArray<Hit>
22
+ has_failed: boolean
23
+ }
24
+
25
+ function shorten(text: string): string {
26
+ const trimmed = text.trim()
27
+
28
+ if (trimmed.length <= MAX_EXCERPT_LENGTH) return trimmed
29
+
30
+ return `${trimmed.slice(0, MAX_EXCERPT_LENGTH)}${ELLIPSIS}`
31
+ }
32
+
33
+ // `git grep -n` prints `path:line:text`; the text may itself hold colons, so only the first two split.
34
+ function to_hit(output_line: string): Hit | undefined {
35
+ const groups = GREP_LINE.exec(output_line)?.groups
36
+
37
+ if (groups === undefined) return undefined
38
+
39
+ // All three groups are non-optional in `GREP_LINE`, so a match always carries each of them.
40
+ const { path, line, text } = groups as Record<'line' | 'path' | 'text', string>
41
+
42
+ return { path, line, excerpt: shorten(text) }
43
+ }
44
+
45
+ function parse(stdout: string): Array<Hit> {
46
+ const hits = stdout.split('\n').map((line) => to_hit(line))
47
+
48
+ return hits.filter((hit): hit is Hit => hit !== undefined)
49
+ }
50
+
51
+ // `git grep` exits 1 when nothing matches, which `git_spawn.read` raises. Only that is "no match": a
52
+ // git without `grep -m` (older than 2.38) exits 129, and naming every target absent then would send
53
+ // the reader away from code that is there. `root` searches that checkout rather than the working
54
+ // directory's.
55
+ async function search(
56
+ target: string,
57
+ flags: ReadonlyArray<string>,
58
+ pathspecs: ReadonlyArray<string>,
59
+ root?: string,
60
+ ): Promise<GrepResult> {
61
+ const location = root === undefined ? [] : ['-C', root]
62
+ const grep_arguments = [
63
+ ...location,
64
+ 'grep',
65
+ '-n',
66
+ '-I',
67
+ '-F',
68
+ ...flags,
69
+ '-e',
70
+ target,
71
+ '--',
72
+ ...pathspecs,
73
+ ]
74
+
75
+ try {
76
+ return { hits: parse(await git_spawn.read(grep_arguments)), has_failed: false }
77
+ } catch (error) {
78
+ return { hits: [], has_failed: get_exit_code(error) !== GREP_NO_MATCH_EXIT }
79
+ }
80
+ }
81
+
82
+ const git_grep_hits = { parse, search }
83
+
84
+ export type { GrepResult, Hit }
85
+ export { git_grep_hits }
@@ -9,7 +9,7 @@
9
9
  //
10
10
  // The list is single-sourced here because it has three consumers that must not drift apart: the
11
11
  // probes that clear it, the fixture that clears it, and the unit-suite guard that refuses a write
12
- // while any of it is set (`scripts/test/test-repository-guard.ts`).
12
+ // while any of it is set (`tools/test/test-repository-guard.ts`).
13
13
  //
14
14
  // **Only the variables that redirect where git writes are listed.** `GIT_PREFIX`, `GIT_EDITOR` and
15
15
  // the `GIT_CONFIG_*` family are exported to hooks too and are deliberately absent: clearing them