@joshuafolkken/kit 1.1514.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 (858) hide show
  1. package/.claude/agents/investigator.md +1 -1
  2. package/.claude/settings.json +5 -5
  3. package/.claude/skills/epic-commands/SKILL.md +26 -65
  4. package/.claude/skills/epic-commands/epic-bundle.md +3 -1
  5. package/.claude/skills/workflow-commands/SKILL.md +5 -5
  6. package/.claude/skills/workflow-commands/background-commands.md +5 -5
  7. package/.claude/skills/workflow-commands/backlogrun-child.md +10 -8
  8. package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +7 -25
  9. package/.claude/skills/workflow-commands/backlogrun-lanes.md +17 -13
  10. package/.claude/skills/workflow-commands/backlogrun-park.md +14 -23
  11. package/.claude/skills/workflow-commands/backlogrun-progress.md +2 -2
  12. package/.claude/skills/workflow-commands/backlogrun-recovery.md +5 -5
  13. package/.claude/skills/workflow-commands/backlogrun-steps.md +10 -10
  14. package/.claude/skills/workflow-commands/backlogrun.md +1 -1
  15. package/.claude/skills/workflow-commands/chain-rule.md +13 -7
  16. package/.claude/skills/workflow-commands/delegation.md +6 -5
  17. package/.claude/skills/workflow-commands/entry-sequence.md +9 -9
  18. package/.claude/skills/workflow-commands/followup.md +9 -31
  19. package/.claude/skills/workflow-commands/fullrun-steps.md +36 -45
  20. package/.claude/skills/workflow-commands/fullrun.md +2 -2
  21. package/.claude/skills/workflow-commands/halfrun.md +17 -25
  22. package/.claude/skills/workflow-commands/issue-comments.md +16 -12
  23. package/.claude/skills/workflow-commands/issue-scout.md +2 -2
  24. package/.claude/skills/workflow-commands/kickoff.md +24 -23
  25. package/.claude/skills/workflow-commands/latest-gate.md +7 -12
  26. package/.claude/skills/workflow-commands/needs-human-review.md +9 -14
  27. package/.claude/skills/workflow-commands/observation-filing.md +4 -36
  28. package/.claude/skills/workflow-commands/observation-ledger.md +1 -1
  29. package/.claude/skills/workflow-commands/pre-gate-cut.md +13 -30
  30. package/.claude/skills/workflow-commands/prerequisite.md +10 -16
  31. package/.claude/skills/workflow-commands/progress-watcher.md +1 -1
  32. package/.claude/skills/workflow-commands/prrun.md +3 -7
  33. package/.claude/skills/workflow-commands/retrospective.md +1 -1
  34. package/.claude/skills/workflow-commands/split-assessment.md +13 -1
  35. package/.claude/skills/workflow-commands/working-tree-hold.md +9 -9
  36. package/.codex/hooks.json +5 -5
  37. package/.github/actions/setup-node/action.yml +9 -0
  38. package/.github/actions/setup-pnpm/action.yml +1 -1
  39. package/.github/dependabot.yml +16 -0
  40. package/.github/release.yml +0 -2
  41. package/.github/workflows/ci.yml +120 -10
  42. package/.github/workflows/publish.yml +8 -1
  43. package/.github/workflows/sonar-qube.yml +1 -0
  44. package/.prettierignore +2 -0
  45. package/.vscode/tasks.json +1 -2
  46. package/CLAUDE.md +3 -7
  47. package/README.md +4 -2
  48. package/SECURITY.md +1 -1
  49. package/dist/CLAUDE.md +3 -7
  50. package/dist/commands/document-read-cli.js +882 -0
  51. package/dist/commands/{document-section-cli.js → document-section-main.js} +79 -37
  52. package/dist/commands/read-set-cli.js +1867 -0
  53. package/dist/commands/run-prep-main.js +21653 -0
  54. package/dist/commands/run-step-cli.js +23880 -0
  55. package/dist/config-merge/index.js +5 -1
  56. package/dist/hooks/audit-provision.js +20 -35
  57. package/dist/hooks/{chunk-DGT54IH5.js → chunk-AZX4FGQ3.js} +63 -17
  58. package/dist/hooks/chunk-CWMBGKYW.js +6483 -0
  59. package/dist/hooks/chunk-O2YBIDSI.js +4306 -0
  60. package/dist/hooks/{chunk-TNUMY6NL.js → chunk-PT5R6UJD.js} +4193 -1900
  61. package/dist/hooks/chunk-TUIFS5E7.js +72 -0
  62. package/dist/hooks/{chunk-723HKZO5.js → chunk-VWWCFGWK.js} +1 -1
  63. package/dist/hooks/{chunk-APUO6U4J.js → chunk-WR2KQAYZ.js} +1843 -440
  64. package/dist/hooks/{chunk-O6GDRNJB.js → chunk-XGBNSWEI.js} +248 -46
  65. package/dist/hooks/chunk-YCDOIR3I.js +3456 -0
  66. package/dist/hooks/codex-hook-adapter.js +10 -22
  67. package/dist/hooks/format-edited.js +5 -6
  68. package/dist/hooks/inputs.json +443 -317
  69. package/dist/hooks/pretool-guard.js +7 -25
  70. package/dist/hooks/session-lang.js +44 -51
  71. package/dist/hooks/stop-guard.js +7716 -2187
  72. package/dist/josh.js +6002 -3583
  73. package/dist/self-sync-guard/index.js +74 -10
  74. package/dist/version/index.js +115 -406
  75. package/eslint/base.js +1 -1
  76. package/lefthook/base.yml +3 -1
  77. package/package.json +10 -48
  78. package/pnpm-workspace.yaml +4 -2
  79. package/prompts/coding-standards.md +1 -1
  80. package/prompts/collaboration-workflow/file-edits.md +1 -7
  81. package/prompts/collaboration-workflow/issue-citation.md +1 -1
  82. package/prompts/collaboration-workflow/issue-template.md +33 -16
  83. package/prompts/collaboration-workflow/lane-instructions.md +1 -2
  84. package/prompts/collaboration-workflow/measurement.md +37 -0
  85. package/prompts/collaboration-workflow/operating-rules.md +4 -6
  86. package/prompts/collaboration-workflow/output-bounds.md +2 -7
  87. package/prompts/collaboration-workflow/plan-comment.md +3 -42
  88. package/prompts/collaboration-workflow/principles.md +5 -0
  89. package/prompts/collaboration-workflow/report-format.md +31 -60
  90. package/prompts/collaboration-workflow/residency.md +2 -2
  91. package/prompts/collaboration-workflow/shell-body.md +6 -16
  92. package/prompts/collaboration-workflow/turn-batching.md +0 -2
  93. package/prompts/collaboration-workflow/upstream-interrupt.md +14 -4
  94. package/prompts/collaboration-workflow/wip-cap.md +1 -1
  95. package/prompts/collaboration-workflow.md +3 -7
  96. package/prompts/refactoring.md +1 -1
  97. package/prompts/review-rubric.md +1 -2
  98. package/prompts/review.md +41 -21
  99. package/prompts/testing-guide.md +8 -43
  100. package/scripts/agent/agent-event.ts +15 -15
  101. package/scripts/agent/agent-exit-record.ts +13 -1
  102. package/scripts/agent/api-auth.ts +41 -0
  103. package/scripts/agent/api-outage.ts +1 -1
  104. package/scripts/auto-ok/auto-ok-cli.ts +14 -16
  105. package/scripts/auto-ok/auto-ok-judge-read.ts +12 -3
  106. package/scripts/auto-ok/auto-ok-judge-write.ts +46 -19
  107. package/scripts/auto-ok/auto-ok-judge.ts +13 -2
  108. package/scripts/auto-ok/auto-ok-main.ts +17 -0
  109. package/scripts/backlog/backlog-arrival.ts +14 -3
  110. package/scripts/backlog/backlog-budget-cli.ts +7 -33
  111. package/scripts/backlog/backlog-budget-main.ts +16 -0
  112. package/scripts/backlog/backlog-budget.ts +2 -3
  113. package/scripts/backlog/backlog-defect-priority.ts +4 -3
  114. package/scripts/backlog/backlog-drive-adopt.ts +67 -0
  115. package/scripts/backlog/backlog-drive-args.ts +4 -5
  116. package/scripts/backlog/backlog-drive-cli.ts +113 -28
  117. package/scripts/backlog/backlog-drive-hold.ts +162 -0
  118. package/scripts/backlog/backlog-drive-idle.ts +151 -0
  119. package/scripts/backlog/backlog-drive-judge.ts +25 -0
  120. package/scripts/backlog/backlog-drive-memory.ts +126 -0
  121. package/scripts/backlog/backlog-drive-named-offer.ts +5 -10
  122. package/scripts/backlog/backlog-drive-named.ts +53 -6
  123. package/scripts/backlog/backlog-drive-offer-argv.ts +3 -8
  124. package/scripts/backlog/backlog-drive-paused.ts +169 -0
  125. package/scripts/backlog/backlog-drive-restore.ts +30 -7
  126. package/scripts/backlog/backlog-drive-seats.ts +18 -8
  127. package/scripts/backlog/backlog-drive-token-handling.ts +38 -0
  128. package/scripts/backlog/backlog-drive.ts +79 -75
  129. package/scripts/backlog/backlog-next-main.ts +16 -0
  130. package/scripts/backlog/backlog-next-shared.ts +73 -0
  131. package/scripts/backlog/backlog-next.ts +48 -16
  132. package/scripts/backlog/backlog-occupied.ts +52 -39
  133. package/scripts/backlog/backlog-offer-cli.ts +6 -21
  134. package/scripts/backlog/backlog-offer-exclude.ts +15 -0
  135. package/scripts/backlog/backlog-offer-main.ts +12 -0
  136. package/scripts/backlog/backlog-offer.ts +36 -3
  137. package/scripts/backlog/backlog-overlap.ts +22 -4
  138. package/scripts/backlog/backlog-plan-read.ts +6 -2
  139. package/scripts/backlog/backlog-plan.ts +18 -4
  140. package/scripts/backlog/backlog-pool.ts +10 -10
  141. package/scripts/backlog/backlog-rank.ts +10 -2
  142. package/scripts/backlog/backlog-ready.ts +112 -30
  143. package/scripts/backlog/backlog-stalled-detect.ts +109 -36
  144. package/scripts/backlog/backlog-stalled.ts +52 -16
  145. package/scripts/backlog/backlog-wait-cause.ts +86 -0
  146. package/scripts/backlog/backlog-waves.ts +39 -13
  147. package/scripts/backlog/backlogrun-args.ts +19 -7
  148. package/scripts/backlog/backlogrun-cli.ts +19 -5
  149. package/scripts/backlog/backlogrun-launch.ts +6 -0
  150. package/scripts/backlog/backlogrun-restart.ts +97 -0
  151. package/scripts/backlog/backlogrun-stop.ts +79 -7
  152. package/scripts/behavior/behavior-cli.ts +2 -2
  153. package/scripts/behavior/behavior-rules.ts +47 -24
  154. package/scripts/build/build-bin.ts +2 -16
  155. package/scripts/build/build-claude-md.ts +0 -7
  156. package/scripts/build/build-commands.ts +0 -13
  157. package/scripts/build/build-hooks.ts +49 -48
  158. package/scripts/build/hook-bundle-stamp.ts +29 -11
  159. package/scripts/build/local-bin.ts +1 -1
  160. package/scripts/cases/cases-cli.ts +25 -13
  161. package/scripts/cases/cases-interaction-scan.ts +134 -0
  162. package/scripts/cases/cases-interaction.ts +183 -0
  163. package/scripts/cases/cases-logic.ts +39 -6
  164. package/scripts/ci/pr-classification-main.ts +18 -0
  165. package/scripts/ci/pr-classification.ts +10 -17
  166. package/scripts/clone/clone-scan.ts +1 -1
  167. package/scripts/cost-runtime/cost-blocks.ts +22 -37
  168. package/scripts/cost-runtime/cost-cli.ts +31 -14
  169. package/scripts/cost-runtime/cost-main.ts +12 -0
  170. package/scripts/cost-runtime/cost-transcript.ts +1 -0
  171. package/scripts/delegation/delegation-policy.ts +17 -4
  172. package/scripts/delegation/duplicate-read-guard.ts +0 -8
  173. package/scripts/delegation/investigation-guard.ts +0 -8
  174. package/scripts/delegation/investigation-reads.ts +3 -4
  175. package/scripts/dependabot/dependabot-cooldown.ts +194 -0
  176. package/scripts/discovery/repo-discovery.ts +24 -6
  177. package/scripts/doctor/doctor-consumer.ts +2 -5
  178. package/scripts/document/document-byte-budget.ts +8 -6
  179. package/scripts/document/document-scan.ts +1 -1
  180. package/scripts/document/document-section-cli.ts +0 -8
  181. package/scripts/document/document-section-main.ts +12 -0
  182. package/scripts/epic/epic-audit-cli.ts +12 -6
  183. package/scripts/epic/epic-bundle-apply.ts +137 -0
  184. package/scripts/epic/epic-bundle-cli.ts +32 -121
  185. package/scripts/epic/epic-bundle-format.ts +116 -0
  186. package/scripts/epic/epic-bundle-main.ts +17 -0
  187. package/scripts/epic/epic-busy.ts +5 -12
  188. package/scripts/epic/epic-classify.ts +24 -15
  189. package/scripts/epic/epic-cli-argv.ts +31 -0
  190. package/scripts/epic/epic-cli-decide.ts +42 -0
  191. package/scripts/epic/epic-cli.ts +6 -38
  192. package/scripts/epic/epic-close.ts +112 -55
  193. package/scripts/epic/epic-cross-repo.ts +4 -7
  194. package/scripts/epic/epic-decide.ts +119 -0
  195. package/scripts/epic/epic-decision.ts +9 -0
  196. package/scripts/epic/epic-fetch.ts +4 -0
  197. package/scripts/epic/epic-graph.ts +2 -0
  198. package/scripts/epic/epic-issue.ts +5 -1
  199. package/scripts/epic/epic-label-age.ts +1 -1
  200. package/scripts/epic/epic-lane-offer.ts +39 -4
  201. package/scripts/epic/epic-next-main.ts +24 -0
  202. package/scripts/epic/epic-next.ts +6 -24
  203. package/scripts/epic/epic-outside-blocker.ts +6 -2
  204. package/scripts/epic/epic-parse.ts +9 -3
  205. package/scripts/epic/epic-read.ts +1 -0
  206. package/scripts/epic/epic-reconcile.ts +39 -0
  207. package/scripts/epic/epic-run.ts +10 -1
  208. package/scripts/epic/epic-solo.ts +50 -14
  209. package/scripts/epic/epic.ts +41 -7
  210. package/scripts/exports/unused-members-cli.ts +2 -2
  211. package/scripts/followup/followup-checks-event.ts +8 -3
  212. package/scripts/followup/followup-coderabbit-wait.ts +82 -0
  213. package/scripts/followup/followup-review-gates.ts +81 -0
  214. package/scripts/followup/git-followup-stages.ts +13 -3
  215. package/scripts/followup/git-followup-workflow.ts +19 -66
  216. package/scripts/followup/git-pr-followup-wrapup.ts +9 -14
  217. package/scripts/followup/git-pr-followup.ts +36 -8
  218. package/scripts/fresh-machine/fresh-machine-cli.ts +1 -1
  219. package/scripts/fresh-machine/fresh-machine-run.ts +8 -8
  220. package/scripts/fresh-machine/specs/kit-test-backlogrun.json +1 -1
  221. package/scripts/gate/busy-average.ts +58 -0
  222. package/scripts/gate/check-cpu.ts +60 -0
  223. package/scripts/gate/check-inputs.ts +39 -95
  224. package/scripts/gate/check-reuse.ts +33 -54
  225. package/scripts/gate/command-memory.ts +192 -0
  226. package/scripts/gate/core-admission.ts +218 -28
  227. package/scripts/gate/core-budget-timing.ts +37 -0
  228. package/scripts/gate/core-budget.ts +80 -98
  229. package/scripts/gate/core-wait-record.ts +48 -0
  230. package/scripts/gate/core-wait.ts +37 -5
  231. package/scripts/gate/core-weights.ts +86 -0
  232. package/scripts/gate/free-cores.ts +27 -4
  233. package/scripts/gate/gate-ledger.ts +32 -4
  234. package/scripts/gate/gate-plan.ts +41 -34
  235. package/scripts/gate/gate-report.ts +14 -2
  236. package/scripts/gate/gate-run-steps.ts +53 -8
  237. package/scripts/gate/gate-skip.ts +12 -2
  238. package/scripts/gate/gate-steps.ts +12 -1
  239. package/scripts/gate/input-fingerprint.ts +42 -0
  240. package/scripts/gate/machine-capacity.ts +65 -31
  241. package/scripts/gate/moved-paths.ts +67 -0
  242. package/scripts/gate/project-checks.ts +5 -12
  243. package/scripts/gate/scoped-green.ts +12 -8
  244. package/scripts/gate/since-green.ts +62 -0
  245. package/scripts/gate/toolchain-inputs.ts +115 -0
  246. package/scripts/gate/verification-gate.ts +27 -24
  247. package/scripts/gate/verification-inputs.ts +250 -0
  248. package/scripts/gh/gh-author-association.ts +96 -9
  249. package/scripts/gh/git-ai-review-scan.ts +4 -2
  250. package/scripts/gh/git-gh-api-path.ts +15 -0
  251. package/scripts/gh/git-gh-branch-rules.ts +73 -0
  252. package/scripts/gh/git-gh-conditional.ts +5 -2
  253. package/scripts/gh/git-gh-issue-read.ts +5 -1
  254. package/scripts/gh/git-gh-issue-write.ts +67 -29
  255. package/scripts/gh/git-gh-issue.ts +7 -3
  256. package/scripts/gh/git-gh-poll-read.ts +89 -0
  257. package/scripts/gh/git-gh-pr-auto-merge.ts +8 -3
  258. package/scripts/gh/git-gh-pr-rest.ts +1 -1
  259. package/scripts/gh/git-gh-pr-snapshot.ts +33 -20
  260. package/scripts/gh/git-gh-pr.ts +27 -15
  261. package/scripts/gh/git-pr-checks-eval.ts +39 -7
  262. package/scripts/gh/git-pr-checks-parse.ts +39 -9
  263. package/scripts/gh/git-pr-merge-checked.ts +80 -0
  264. package/scripts/git/base-tree.ts +19 -2
  265. package/scripts/git/changed-file-scope.ts +6 -4
  266. package/scripts/git/changed-paths.ts +18 -1
  267. package/scripts/git/git-diff-reads.ts +27 -2
  268. package/scripts/git/git-grep-hits.ts +85 -0
  269. package/scripts/git/git-location-environment.ts +1 -1
  270. package/scripts/git/git-merge-conflicts.ts +83 -0
  271. package/scripts/git/git-preflight.ts +37 -12
  272. package/scripts/git/git-push-transport.ts +1 -2
  273. package/scripts/git/git-schemas.ts +17 -7
  274. package/scripts/git/git-spawn.ts +1 -2
  275. package/scripts/git/git-status.ts +4 -4
  276. package/scripts/git/main-merge-main.ts +12 -0
  277. package/scripts/git/main-merge-regenerate.ts +2 -2
  278. package/scripts/git/main-merge.ts +25 -9
  279. package/scripts/git/main-sync-main.ts +12 -0
  280. package/scripts/git/main-sync.ts +0 -9
  281. package/scripts/git/stash/git-stash.ts +27 -4
  282. package/scripts/git/stash/{stash-pop-args.ts → stash-args.ts} +13 -10
  283. package/scripts/git/stash/stash-pop-cli.ts +6 -12
  284. package/scripts/git/stash/stash-pop-main.ts +12 -0
  285. package/scripts/git/stash/stash-push-cli.ts +76 -0
  286. package/scripts/git/stash/stash-push-main.ts +12 -0
  287. package/scripts/hooks/batch-guard.ts +0 -8
  288. package/scripts/hooks/check-commit-message-main.ts +8 -0
  289. package/scripts/hooks/check-commit-message.ts +4 -7
  290. package/scripts/hooks/format-edited-file.ts +8 -24
  291. package/scripts/hooks/pre-commit-lint.ts +30 -3
  292. package/scripts/hooks/pre-push-unit.ts +4 -2
  293. package/scripts/hooks/pretool-guard-cli.ts +1 -8
  294. package/scripts/hooks/pretool-guard.ts +32 -19
  295. package/scripts/hooks/reserved-run.ts +67 -9
  296. package/scripts/hooks/run-hook.sh +13 -4
  297. package/scripts/hooks/shell-rules-notice.ts +37 -0
  298. package/scripts/hooks/stop-actions.ts +2 -21
  299. package/scripts/hooks/stop-guard.ts +13 -9
  300. package/scripts/init/hook-command-rewrite.ts +19 -5
  301. package/scripts/init/hook-launch.ts +15 -17
  302. package/scripts/init/init-actions.ts +0 -6
  303. package/scripts/init/init-ai-copy.ts +10 -36
  304. package/scripts/init/init-bootstrap.ts +9 -8
  305. package/scripts/init/init-dry-run-report.ts +1 -1
  306. package/scripts/init/init-dry-run.ts +1 -1
  307. package/scripts/init/init-file-action.ts +7 -9
  308. package/scripts/init/init-logic-json-merge.ts +2 -2
  309. package/scripts/init/init-logic-migrate.ts +9 -82
  310. package/scripts/init/init-logic.ts +3 -2
  311. package/scripts/init/init-main.ts +12 -0
  312. package/scripts/init/init.ts +5 -12
  313. package/scripts/init/kit-development-versions.ts +3 -7
  314. package/scripts/init/kit-written-paths.ts +2 -2
  315. package/scripts/init/project-profile.ts +5 -4
  316. package/scripts/init/tsconfig-preset-migration.ts +2 -1
  317. package/scripts/init/vscode-tasks.ts +1 -1
  318. package/scripts/issue/defect-origin-cli.ts +106 -0
  319. package/scripts/issue/defect-origin-line.ts +60 -0
  320. package/scripts/issue/defect-origin-main.ts +11 -0
  321. package/scripts/issue/defect-origin.ts +114 -0
  322. package/scripts/issue/defect-rate-cli.ts +34 -78
  323. package/scripts/issue/defect-rate.ts +0 -16
  324. package/scripts/issue/defect-report-cli.ts +128 -0
  325. package/scripts/issue/defect-report-format.ts +56 -0
  326. package/scripts/issue/defect-report-main.ts +11 -0
  327. package/scripts/issue/defect-report.ts +160 -0
  328. package/scripts/issue/expected-effect-lint.ts +1 -0
  329. package/scripts/issue/issue-already-done-cli.ts +62 -0
  330. package/scripts/issue/issue-body-or-comment.ts +40 -0
  331. package/scripts/issue/issue-cite-cli.ts +0 -9
  332. package/scripts/issue/issue-cite-main.ts +12 -0
  333. package/scripts/issue/issue-classification.ts +12 -7
  334. package/scripts/issue/issue-comment-cli.ts +10 -24
  335. package/scripts/issue/issue-comment-main.ts +12 -0
  336. package/scripts/issue/issue-evidence-exit.ts +100 -0
  337. package/scripts/issue/issue-file-cli.ts +29 -7
  338. package/scripts/issue/issue-file.ts +19 -19
  339. package/scripts/issue/issue-fold-cli.ts +2 -11
  340. package/scripts/issue/issue-fold-main.ts +12 -0
  341. package/scripts/issue/issue-labels.ts +81 -90
  342. package/scripts/issue/issue-lint-cli.ts +2 -10
  343. package/scripts/issue/issue-lint-main.ts +12 -0
  344. package/scripts/issue/issue-measured-cli.ts +56 -0
  345. package/scripts/issue/issue-merged.ts +19 -2
  346. package/scripts/issue/issue-not-before-label.ts +135 -0
  347. package/scripts/issue/issue-not-before.ts +111 -0
  348. package/scripts/issue/issue-number-shape.ts +15 -1
  349. package/scripts/issue/issue-park.ts +28 -0
  350. package/scripts/issue/issue-plan-cli.ts +151 -0
  351. package/scripts/issue/issue-priority.ts +151 -0
  352. package/scripts/issue/issue-rank.ts +7 -1
  353. package/scripts/issue/issue-read-cli.ts +3 -10
  354. package/scripts/issue/issue-read-main.ts +12 -0
  355. package/scripts/issue/issue-read.ts +29 -5
  356. package/scripts/issue/issue-release-cli.ts +0 -10
  357. package/scripts/issue/issue-release-main.ts +13 -0
  358. package/scripts/issue/issue-release.ts +7 -12
  359. package/scripts/issue/issue-sample-gate.ts +192 -0
  360. package/scripts/issue/issue-sample-source.ts +76 -0
  361. package/scripts/issue/issue-scout-cli.ts +0 -11
  362. package/scripts/issue/issue-scout-main.ts +14 -0
  363. package/scripts/issue/issue-state-cli.ts +0 -10
  364. package/scripts/issue/issue-state-main.ts +12 -0
  365. package/scripts/issue/issue-watch-diff.ts +56 -15
  366. package/scripts/issue/issue-watch.ts +2 -1
  367. package/scripts/issue/issue-wip.ts +2 -7
  368. package/scripts/issue/measure-rerun-cli.ts +13 -8
  369. package/scripts/issue/plan-consumers-cli.ts +39 -0
  370. package/scripts/issue/plan-consumers-main.ts +11 -0
  371. package/scripts/issue/plan-consumers-section.ts +55 -0
  372. package/scripts/issue/plan-consumers.ts +127 -0
  373. package/scripts/josh/agent-session-environment.ts +1 -1
  374. package/scripts/josh/command-usage.ts +15 -43
  375. package/scripts/josh/file-map-stamp.ts +49 -16
  376. package/scripts/josh/hook-decision.ts +32 -20
  377. package/scripts/josh/josh-command-map.ts +4 -1
  378. package/scripts/josh/josh-command-types.ts +12 -6
  379. package/scripts/josh/josh-commands-agent-hooks.ts +83 -0
  380. package/scripts/josh/josh-commands-ai.ts +157 -158
  381. package/scripts/josh/josh-commands-backlog.ts +82 -16
  382. package/scripts/josh/josh-commands-clone.ts +1 -0
  383. package/scripts/josh/josh-commands-development.ts +111 -71
  384. package/scripts/josh/josh-commands-document.ts +43 -1
  385. package/scripts/josh/josh-commands-epic.ts +171 -0
  386. package/scripts/josh/josh-commands-hooks.ts +25 -2
  387. package/scripts/josh/josh-commands-issue-write.ts +181 -0
  388. package/scripts/josh/josh-commands-issue.ts +124 -24
  389. package/scripts/josh/josh-commands-lane.ts +103 -2
  390. package/scripts/josh/josh-commands-lint.ts +19 -8
  391. package/scripts/josh/josh-commands-maintenance.ts +112 -4
  392. package/scripts/josh/josh-commands-pause.ts +29 -0
  393. package/scripts/josh/josh-commands-progress.ts +87 -0
  394. package/scripts/josh/josh-commands-project.ts +138 -9
  395. package/scripts/josh/josh-commands-review.ts +124 -0
  396. package/scripts/josh/josh-commands-run.ts +211 -23
  397. package/scripts/josh/josh-commands-ship.ts +169 -0
  398. package/scripts/josh/josh-commands-split.ts +9 -0
  399. package/scripts/josh/josh-commands-versioning.ts +49 -2
  400. package/scripts/josh/josh-commands-workflow.ts +144 -6
  401. package/scripts/josh/josh-logic.ts +6 -13
  402. package/scripts/josh/package-directory.ts +2 -4
  403. package/scripts/josh/process-identity.ts +13 -4
  404. package/scripts/josh/session-language-cli.ts +4 -8
  405. package/scripts/josh/session-language-main.ts +13 -0
  406. package/scripts/josh/session-language.ts +6 -1
  407. package/scripts/josh/shared-cache.ts +90 -0
  408. package/scripts/josh/stamp-file.ts +9 -15
  409. package/scripts/lane/lane-await.ts +51 -12
  410. package/scripts/lane/lane-cache.ts +5 -30
  411. package/scripts/lane/lane-capacity.ts +14 -23
  412. package/scripts/lane/lane-check-stats.ts +62 -21
  413. package/scripts/lane/lane-child-invocation.ts +8 -0
  414. package/scripts/lane/lane-cli.ts +15 -5
  415. package/scripts/lane/lane-close.ts +86 -18
  416. package/scripts/lane/lane-core-wait-stats.ts +66 -0
  417. package/scripts/lane/lane-dispatch.ts +24 -3
  418. package/scripts/lane/lane-gap-stats.ts +156 -0
  419. package/scripts/lane/lane-handoff.ts +69 -1
  420. package/scripts/lane/lane-held-stats.ts +129 -0
  421. package/scripts/lane/lane-install.ts +4 -11
  422. package/scripts/lane/lane-launch-cli.ts +0 -9
  423. package/scripts/lane/lane-launch-main.ts +12 -0
  424. package/scripts/lane/lane-ledger-schema.ts +266 -0
  425. package/scripts/lane/lane-ledger.ts +92 -123
  426. package/scripts/lane/lane-limit-cli.ts +12 -1
  427. package/scripts/lane/lane-measure-cli.ts +57 -11
  428. package/scripts/lane/lane-open.ts +9 -1
  429. package/scripts/lane/lane-parked.ts +3 -3
  430. package/scripts/lane/lane-pause-cli.ts +130 -0
  431. package/scripts/lane/lane-pause.ts +158 -0
  432. package/scripts/lane/lane-process-table.ts +166 -0
  433. package/scripts/lane/lane-reap-settle.ts +124 -0
  434. package/scripts/lane/lane-reap.ts +50 -15
  435. package/scripts/lane/lane-registry.ts +24 -3
  436. package/scripts/lane/lane-residents.ts +162 -0
  437. package/scripts/lane/lane-restart.ts +22 -2
  438. package/scripts/lane/lane-round-two-stats.ts +49 -0
  439. package/scripts/lane/lane-sampler.ts +4 -0
  440. package/scripts/lane/lane-session-action.ts +19 -5
  441. package/scripts/lane/lane-session-broker.ts +102 -21
  442. package/scripts/lane/lane-snapshot-trace.ts +84 -0
  443. package/scripts/lane/lane-spans.ts +51 -0
  444. package/scripts/lane/lane-spent.ts +6 -3
  445. package/scripts/lane/lane-stage-stats.ts +7 -2
  446. package/scripts/lane/lane-state.ts +302 -0
  447. package/scripts/lane/lane-stats.ts +58 -4
  448. package/scripts/lane/lane-stop-stats.ts +113 -37
  449. package/scripts/lane/lane-test-related-stats.ts +127 -0
  450. package/scripts/lane/lane-transcript-calls.ts +145 -0
  451. package/scripts/lane/lane-transcript-stats.ts +168 -0
  452. package/scripts/lane/lane-vacant.ts +13 -3
  453. package/scripts/lane/lane-withdraw-cli.ts +5 -4
  454. package/scripts/lane/lane-withdraw.ts +50 -49
  455. package/scripts/lane/process-directories.ts +70 -0
  456. package/scripts/lane/process-lane-marks.ts +94 -0
  457. package/scripts/lib/atomic-write.ts +62 -0
  458. package/scripts/lib/buffered-process.ts +12 -5
  459. package/scripts/lib/cli-flags.ts +53 -0
  460. package/scripts/lib/figure-format.ts +63 -0
  461. package/scripts/lib/json-value.ts +9 -1
  462. package/scripts/lib/package-manifest.ts +35 -0
  463. package/scripts/lib/read-file.ts +3 -1
  464. package/scripts/lib/stamped-memo.ts +63 -0
  465. package/scripts/lib/stdout-on-stderr.ts +24 -0
  466. package/scripts/lib/timeouts.ts +9 -0
  467. package/scripts/lib/transcript-record.ts +91 -0
  468. package/scripts/lines/effective-limit.ts +1 -1
  469. package/scripts/lint/eslint-cache-dependencies.ts +145 -0
  470. package/scripts/lint/eslint-daemon.ts +265 -0
  471. package/scripts/lint/format.ts +11 -2
  472. package/scripts/lint/import-graph.ts +279 -0
  473. package/scripts/lint/lint-gate-scope.ts +102 -0
  474. package/scripts/lint/lint-parallel-main.ts +19 -0
  475. package/scripts/lint/lint-parallel.ts +62 -30
  476. package/scripts/lint/lint-related-scope.ts +30 -24
  477. package/scripts/lint/lint-related.ts +38 -6
  478. package/scripts/notify/confirmation-options.ts +1 -2
  479. package/scripts/notify/telegram-notify.ts +20 -20
  480. package/scripts/notify/telegram-test-logic.ts +0 -1
  481. package/scripts/notify/telegram-test-main.ts +8 -0
  482. package/scripts/notify/telegram-test.ts +2 -6
  483. package/scripts/observations/observation-ledger.ts +13 -0
  484. package/scripts/observations/observations-flush-landing.ts +5 -3
  485. package/scripts/observations/observations-flush.ts +6 -1
  486. package/scripts/overrides/overrides-check.ts +2 -5
  487. package/scripts/overrides/overrides-files.ts +2 -1
  488. package/scripts/overrides/overrides-logic.ts +3 -6
  489. package/scripts/package/verify-optional-eslint-install.ts +8 -6
  490. package/scripts/propagate/propagate-publish.ts +2 -7
  491. package/scripts/propagate/propagate-targets.ts +4 -12
  492. package/scripts/refactor/import-graph.ts +9 -7
  493. package/scripts/release/github-release-runs.ts +17 -6
  494. package/scripts/release/release-approval-prune.ts +18 -0
  495. package/scripts/release/release-history.ts +1 -3
  496. package/scripts/release/release-progress.ts +42 -22
  497. package/scripts/release/release-publish-run.ts +39 -0
  498. package/scripts/release/release-publish.ts +6 -6
  499. package/scripts/release/release-scope-cli.ts +0 -10
  500. package/scripts/release/release-scope-main.ts +12 -0
  501. package/scripts/repo/repo-setting.ts +3 -6
  502. package/scripts/repo/required-checks-logic.ts +6 -15
  503. package/scripts/report/report-format-reference.ts +2 -0
  504. package/scripts/report/report-labels.ts +155 -0
  505. package/scripts/report/report-lint-cli.ts +3 -0
  506. package/scripts/report/report-lint.ts +85 -110
  507. package/scripts/report/report-template-cli.ts +59 -0
  508. package/scripts/report/report-template.ts +112 -0
  509. package/scripts/review/acceptance-map.ts +1 -0
  510. package/scripts/review/removed-tests-check.ts +86 -0
  511. package/scripts/review/removed-tests.ts +149 -0
  512. package/scripts/review/review-brief-cli.ts +81 -15
  513. package/scripts/review/review-brief-main.ts +12 -0
  514. package/scripts/review/review-brief.ts +31 -3
  515. package/scripts/review/review-code-tree.ts +10 -6
  516. package/scripts/review/review-comment-round.ts +26 -8
  517. package/scripts/review/review-finding-ledger.ts +30 -15
  518. package/scripts/review/review-interaction.ts +94 -0
  519. package/scripts/review/review-readers-scan.ts +163 -0
  520. package/scripts/review/review-record-cli.ts +69 -30
  521. package/scripts/review/review-record-main.ts +12 -0
  522. package/scripts/review/review-round-one-blobs.ts +221 -0
  523. package/scripts/review/review-round2-cli.ts +49 -12
  524. package/scripts/review/review-round2.ts +80 -12
  525. package/scripts/review/review-stamps.ts +19 -1
  526. package/scripts/review/review-stop-log.ts +96 -0
  527. package/scripts/review/review-stops-cli.ts +85 -0
  528. package/scripts/review/review-tree.ts +6 -17
  529. package/scripts/review/review-untouched-readers.ts +146 -0
  530. package/scripts/review/test-titles.ts +118 -0
  531. package/scripts/rules/agent-model.ts +8 -0
  532. package/scripts/rules/bash-triggers.ts +46 -3
  533. package/scripts/rules/decision-oracle-batch.ts +9 -1
  534. package/scripts/rules/decision-oracle.ts +2 -2
  535. package/scripts/rules/delivered-rules.ts +80 -2
  536. package/scripts/rules/destructive-command.ts +8 -1
  537. package/scripts/rules/direct-filing.ts +10 -2
  538. package/scripts/rules/direct-issue-comment.ts +117 -0
  539. package/scripts/rules/direct-pr-create.ts +69 -3
  540. package/scripts/rules/early-heartbeat.ts +2 -1
  541. package/scripts/rules/file-body.ts +7 -0
  542. package/scripts/rules/filing-cap.ts +7 -0
  543. package/scripts/rules/git-argv.ts +72 -14
  544. package/scripts/rules/git-force.ts +12 -2
  545. package/scripts/rules/guard-remedy.ts +4 -0
  546. package/scripts/rules/implementation-cut-verdict.ts +1 -1
  547. package/scripts/rules/implementation-cut.ts +11 -3
  548. package/scripts/rules/index-guard.ts +8 -1
  549. package/scripts/rules/issue-comments.ts +9 -1
  550. package/scripts/rules/josh-git-bare.ts +7 -0
  551. package/scripts/rules/lane-background.ts +67 -25
  552. package/scripts/rules/lane-carry-conflict.ts +6 -0
  553. package/scripts/rules/lane-direct-tool.ts +74 -0
  554. package/scripts/rules/lane-interactive-ask.ts +9 -2
  555. package/scripts/rules/lane-park.ts +45 -23
  556. package/scripts/rules/lane-split-park.ts +10 -2
  557. package/scripts/rules/lane-switch-main.ts +7 -0
  558. package/scripts/rules/oracle-consulted.ts +10 -0
  559. package/scripts/rules/oracle-firing.ts +1 -0
  560. package/scripts/rules/permission-guards.ts +3 -0
  561. package/scripts/rules/piped-verification.ts +1 -1
  562. package/scripts/rules/poll-loop.ts +7 -0
  563. package/scripts/rules/pr-merge.ts +123 -0
  564. package/scripts/rules/protected-files.ts +32 -5
  565. package/scripts/rules/raw-field-body.ts +6 -0
  566. package/scripts/rules/rule-body-guard.ts +8 -0
  567. package/scripts/rules/rule-list.ts +9 -28
  568. package/scripts/rules/rule-value-cache.ts +4 -9
  569. package/scripts/rules/rule-value-cli.ts +51 -32
  570. package/scripts/rules/rule-value.ts +1 -1
  571. package/scripts/rules/shell-segments.ts +35 -0
  572. package/scripts/rules/stop-rule-rows.ts +64 -0
  573. package/scripts/rules/stop-rules.ts +3 -4
  574. package/scripts/rules/test-declared-commit.ts +11 -1
  575. package/scripts/rules/third-party-write.ts +7 -0
  576. package/scripts/rules/timed-rerun.ts +69 -0
  577. package/scripts/rules/worktree-guard.ts +13 -3
  578. package/scripts/run/board/run-board-app-name.ts +23 -0
  579. package/scripts/run/board/run-board-cli.ts +65 -32
  580. package/scripts/run/board/run-board-earlier.ts +94 -0
  581. package/scripts/run/board/run-board-ending-reason.ts +67 -0
  582. package/scripts/run/board/run-board-estimate-schedule.ts +103 -0
  583. package/scripts/run/board/run-board-estimate.ts +98 -0
  584. package/scripts/run/board/run-board-fit.ts +153 -36
  585. package/scripts/run/board/run-board-fold.ts +123 -0
  586. package/scripts/run/board/run-board-fresh.ts +2 -2
  587. package/scripts/run/board/run-board-gather-live.ts +29 -0
  588. package/scripts/run/board/run-board-gather-thread.ts +189 -0
  589. package/scripts/run/board/run-board-gather-worker.ts +29 -0
  590. package/scripts/run/board/run-board-gather.ts +187 -0
  591. package/scripts/run/board/run-board-github.ts +118 -38
  592. package/scripts/run/board/run-board-header.ts +82 -20
  593. package/scripts/run/board/run-board-keys.ts +58 -0
  594. package/scripts/run/board/run-board-kind.ts +20 -6
  595. package/scripts/run/board/run-board-labels.ts +116 -71
  596. package/scripts/run/board/run-board-lane-state.ts +109 -0
  597. package/scripts/run/board/run-board-lane-time.ts +122 -0
  598. package/scripts/run/board/run-board-layout.ts +239 -60
  599. package/scripts/run/board/run-board-length.ts +52 -0
  600. package/scripts/run/board/run-board-machine.ts +8 -4
  601. package/scripts/run/board/run-board-main.ts +12 -0
  602. package/scripts/run/board/run-board-notes.ts +52 -31
  603. package/scripts/run/board/run-board-now.ts +1 -1
  604. package/scripts/run/board/run-board-operation.ts +15 -33
  605. package/scripts/run/board/run-board-phase.ts +1 -1
  606. package/scripts/run/board/run-board-plan-shared.ts +115 -0
  607. package/scripts/run/board/run-board-plan.ts +55 -3
  608. package/scripts/run/board/run-board-planning.ts +45 -0
  609. package/scripts/run/board/run-board-priority.ts +44 -0
  610. package/scripts/run/board/run-board-process-groups.ts +195 -0
  611. package/scripts/run/board/run-board-read.ts +151 -27
  612. package/scripts/run/board/run-board-reason.ts +235 -51
  613. package/scripts/run/board/run-board-released.ts +35 -0
  614. package/scripts/run/board/run-board-render-checks.ts +39 -5
  615. package/scripts/run/board/run-board-render-condition.ts +96 -0
  616. package/scripts/run/board/run-board-render-drawn.ts +67 -0
  617. package/scripts/run/board/run-board-render-foot.ts +59 -0
  618. package/scripts/run/board/run-board-render-icon.ts +35 -0
  619. package/scripts/run/board/run-board-render-lanes.ts +145 -0
  620. package/scripts/run/board/run-board-render-lead.ts +80 -0
  621. package/scripts/run/board/run-board-render-legend.ts +117 -48
  622. package/scripts/run/board/run-board-render-notes.ts +156 -29
  623. package/scripts/run/board/run-board-render-processes.ts +196 -0
  624. package/scripts/run/board/run-board-render-section.ts +119 -0
  625. package/scripts/run/board/run-board-render-slot.ts +3 -36
  626. package/scripts/run/board/run-board-render-tail.ts +115 -48
  627. package/scripts/run/board/run-board-render-time.ts +56 -0
  628. package/scripts/run/board/run-board-render-title.ts +117 -24
  629. package/scripts/run/board/run-board-render-waits.ts +104 -20
  630. package/scripts/run/board/run-board-render.ts +207 -265
  631. package/scripts/run/board/run-board-roots.ts +54 -0
  632. package/scripts/run/board/run-board-row-yield.ts +9 -4
  633. package/scripts/run/board/run-board-setup.ts +1 -12
  634. package/scripts/run/board/run-board-snapshot.ts +111 -0
  635. package/scripts/run/board/run-board-spin.ts +2 -2
  636. package/scripts/run/board/run-board-state.ts +22 -33
  637. package/scripts/run/board/run-board-status.ts +147 -71
  638. package/scripts/run/board/run-board-thanks-read.ts +2 -2
  639. package/scripts/run/board/run-board-tick.ts +122 -107
  640. package/scripts/run/board/run-board-usage-board.ts +78 -0
  641. package/scripts/run/board/run-board-usage-lanes.ts +113 -0
  642. package/scripts/run/board/run-board-usage-listing.ts +93 -0
  643. package/scripts/run/board/run-board-usage-read.ts +120 -150
  644. package/scripts/run/board/run-board-usage-rusage.ts +19 -7
  645. package/scripts/run/board/run-board-usage-text.ts +139 -51
  646. package/scripts/run/board/run-board-usage-top.ts +102 -0
  647. package/scripts/run/board/run-board-usage.ts +89 -72
  648. package/scripts/run/board/run-board-usual.ts +20 -9
  649. package/scripts/run/carry/run-carry-args.ts +4 -7
  650. package/scripts/run/carry/run-carry-conversation.ts +1 -1
  651. package/scripts/run/carry/run-carry.ts +9 -4
  652. package/scripts/run/cut/run-cut-handoff.ts +2 -2
  653. package/scripts/run/event/run-event-cli.ts +1 -5
  654. package/scripts/run/event/run-event-filed.ts +12 -6
  655. package/scripts/run/event/run-event-follow.ts +2 -3
  656. package/scripts/run/event/run-event-render.ts +6 -10
  657. package/scripts/run/event/run-event-scope.ts +2 -2
  658. package/scripts/run/event/run-event-stream-emit.ts +82 -22
  659. package/scripts/run/event/run-event-stream.ts +34 -8
  660. package/scripts/run/hold/run-hold-adopt.ts +65 -0
  661. package/scripts/run/hold/run-hold-cli.ts +93 -22
  662. package/scripts/run/hold/run-hold-main.ts +12 -0
  663. package/scripts/run/hold/run-hold-member.ts +37 -0
  664. package/scripts/run/hold/run-stop-notify.ts +183 -0
  665. package/scripts/run/merge/run-merge-auth.ts +31 -0
  666. package/scripts/run/merge/run-merge-cli.ts +62 -48
  667. package/scripts/run/merge/run-merge-close.ts +74 -0
  668. package/scripts/run/merge/run-merge-collect.ts +6 -13
  669. package/scripts/run/merge/run-merge-driver.ts +71 -0
  670. package/scripts/run/merge/run-merge-main.ts +12 -0
  671. package/scripts/run/merge/run-merge-outcome.ts +23 -0
  672. package/scripts/run/merge/run-merge-restart.ts +39 -0
  673. package/scripts/run/merge/run-merge-ship.ts +20 -4
  674. package/scripts/run/merge/run-merge-signals.ts +33 -9
  675. package/scripts/run/merge/run-merge-steps.ts +120 -85
  676. package/scripts/run/merge/run-merge.ts +38 -37
  677. package/scripts/run/park/run-park-cli.ts +91 -0
  678. package/scripts/run/park/run-park.ts +88 -0
  679. package/scripts/run/park/run-stalled.ts +68 -0
  680. package/scripts/run/pause/run-pause-cli.ts +73 -0
  681. package/scripts/run/pause/run-pause.ts +251 -0
  682. package/scripts/run/progress/run-progress-cli.ts +4 -12
  683. package/scripts/run/progress/run-progress-clock.ts +1 -1
  684. package/scripts/run/progress/run-progress-config.ts +6 -14
  685. package/scripts/run/progress/run-progress-main.ts +12 -0
  686. package/scripts/run/progress/run-progress.ts +1 -4
  687. package/scripts/run/review/run-review.ts +2 -1
  688. package/scripts/run/run-ending.ts +1 -0
  689. package/scripts/run/run-invocation.ts +5 -6
  690. package/scripts/run/run-liveness-cli.ts +6 -8
  691. package/scripts/run/run-liveness.ts +60 -29
  692. package/scripts/run/run-next.ts +1 -1
  693. package/scripts/run/run-parent-cut-hook.ts +2 -2
  694. package/scripts/run/run-preflight.ts +18 -3
  695. package/scripts/run/run-prep-cli.ts +1 -10
  696. package/scripts/run/run-prep-locate.ts +7 -50
  697. package/scripts/run/run-prep-main.ts +12 -0
  698. package/scripts/run/run-prep.ts +6 -0
  699. package/scripts/run/run-report-cli.ts +101 -13
  700. package/scripts/run/run-report-handoff.ts +114 -0
  701. package/scripts/run/run-step.ts +1 -1
  702. package/scripts/run/run-stranded-detect.ts +13 -0
  703. package/scripts/run/run-watcher-guard-cli.ts +1 -1
  704. package/scripts/run/run-watcher-guard.ts +1 -1
  705. package/scripts/run/ship/run-ship-args.ts +121 -0
  706. package/scripts/run/ship/run-ship-body-draft.ts +110 -0
  707. package/scripts/run/ship/run-ship-cli.ts +63 -140
  708. package/scripts/run/ship/run-ship-detach.ts +19 -8
  709. package/scripts/run/ship/run-ship-infra-retry.ts +59 -0
  710. package/scripts/run/ship/run-ship-next.ts +18 -2
  711. package/scripts/run/ship/run-ship-overlap.ts +42 -5
  712. package/scripts/run/ship/run-ship-place.ts +96 -0
  713. package/scripts/run/ship/run-ship-pre-detach-timed.ts +43 -0
  714. package/scripts/run/ship/run-ship-pre-detach.ts +81 -24
  715. package/scripts/run/ship/run-ship-preflight.ts +137 -32
  716. package/scripts/run/ship/run-ship-probe.ts +11 -3
  717. package/scripts/run/ship/run-ship-relaunch-cap.ts +70 -0
  718. package/scripts/run/ship/run-ship-removed-rows.ts +61 -0
  719. package/scripts/run/ship/run-ship-return.ts +107 -23
  720. package/scripts/run/ship/run-ship-review-steps.ts +105 -151
  721. package/scripts/run/ship/run-ship-review.ts +73 -6
  722. package/scripts/run/ship/run-ship-reviewer.ts +207 -0
  723. package/scripts/run/ship/run-ship-stage.ts +55 -6
  724. package/scripts/run/ship/run-ship-steps.ts +46 -15
  725. package/scripts/run/ship/run-ship-stop-cause.ts +135 -0
  726. package/scripts/run/ship/run-ship-stop-text.ts +11 -6
  727. package/scripts/run/ship/run-ship-sync.ts +43 -6
  728. package/scripts/run/ship/run-ship.ts +30 -2
  729. package/scripts/run/tidy/run-tidy-cli.ts +0 -4
  730. package/scripts/run/tidy/run-tidy-lanes.ts +3 -0
  731. package/scripts/run/tidy/run-tidy-main.ts +8 -0
  732. package/scripts/run/wake/run-wake-cli.ts +119 -100
  733. package/scripts/run/wake/run-wake-code.ts +83 -0
  734. package/scripts/run/wake/run-wake-driver.ts +19 -8
  735. package/scripts/run/wake/run-wake-loop.ts +34 -3
  736. package/scripts/run/wake/run-wake-main.ts +13 -0
  737. package/scripts/run/wake/run-wake-ports.ts +90 -0
  738. package/scripts/run/wake/run-wake-takeover.ts +66 -0
  739. package/scripts/run/wake/run-wake.ts +2 -1
  740. package/scripts/safe-chain/pack-hook.ts +2 -2
  741. package/scripts/safe-chain/preinstall-command.ts +2 -1
  742. package/scripts/safe-chain/project-config.ts +3 -9
  743. package/scripts/security/security-audit-main.ts +8 -0
  744. package/scripts/security/security-audit-provision-logic.ts +0 -11
  745. package/scripts/security/security-audit-provision-main.ts +12 -0
  746. package/scripts/security/security-audit-provision.ts +11 -26
  747. package/scripts/security/security-audit.ts +6 -7
  748. package/scripts/self-sync-guard/self-sync-guard-logic.ts +6 -13
  749. package/scripts/split/split-assess-cli.ts +2 -2
  750. package/scripts/split/split-assess.ts +15 -0
  751. package/scripts/split/split-measure.ts +65 -0
  752. package/scripts/sync/claude-settings-merge.ts +8 -15
  753. package/scripts/sync/directory-copy-guard.ts +4 -9
  754. package/scripts/sync/file-content.ts +78 -8
  755. package/scripts/sync/sync-ai-files.ts +3 -5
  756. package/scripts/sync/sync-configs.ts +11 -23
  757. package/scripts/sync/sync-hook-safety.ts +4 -10
  758. package/scripts/sync/sync-main.ts +11 -0
  759. package/scripts/sync/sync.ts +25 -37
  760. package/scripts/test/test-declared-changed.ts +2 -2
  761. package/scripts/test/test-declared.ts +1 -1
  762. package/scripts/test/test-e2e-guard.ts +25 -1
  763. package/scripts/test/test-e2e-stamp.ts +38 -0
  764. package/scripts/test/test-pinned-logic.ts +145 -0
  765. package/scripts/test/test-pinned-main.ts +78 -0
  766. package/scripts/test/test-pinned.ts +100 -0
  767. package/scripts/test/test-read-map.ts +264 -0
  768. package/scripts/test/test-read-recording.ts +91 -0
  769. package/scripts/test/test-read-trace.ts +148 -0
  770. package/scripts/test/test-red-main.ts +12 -0
  771. package/scripts/test/test-red.ts +12 -30
  772. package/scripts/test/test-related-main.ts +18 -0
  773. package/scripts/test/test-related-record.ts +119 -0
  774. package/scripts/test/test-related-scope.ts +229 -43
  775. package/scripts/test/test-related.ts +300 -22
  776. package/scripts/test/test-unit-guard-main.ts +15 -0
  777. package/scripts/test/test-unit-guard.ts +42 -24
  778. package/scripts/test/unit-count-file.ts +37 -0
  779. package/scripts/test/unit-run-marker.ts +162 -0
  780. package/scripts/test/unit-setup-files.ts +51 -0
  781. package/scripts/test/unit-worker-share.ts +61 -149
  782. package/scripts/test/whole-suite-files.ts +63 -0
  783. package/scripts/time-runtime/time-background.ts +20 -2
  784. package/scripts/time-runtime/time-bundles.ts +4 -3
  785. package/scripts/time-runtime/time-density-hook.ts +8 -6
  786. package/scripts/time-runtime/time-followup-stage.ts +1 -3
  787. package/scripts/time-runtime/time-format.ts +5 -28
  788. package/scripts/time-runtime/time-markers.ts +10 -1
  789. package/scripts/time-runtime/time-shell.ts +97 -10
  790. package/scripts/time-runtime/time-transcript-line.ts +49 -62
  791. package/scripts/uninstall/uninstall.ts +1 -1
  792. package/scripts/version/bump-version-main.ts +12 -0
  793. package/scripts/version/bump-version.ts +25 -25
  794. package/scripts/version/effective-upstream.ts +6 -12
  795. package/scripts/version/latest-corepack.ts +17 -32
  796. package/scripts/version/latest-if-required-cli.ts +93 -0
  797. package/scripts/version/latest-lane-guard-main.ts +8 -0
  798. package/scripts/version/latest-lane-guard.ts +0 -4
  799. package/scripts/version/latest-scope-cli.ts +0 -9
  800. package/scripts/version/latest-scope-main.ts +12 -0
  801. package/scripts/version/latest-update.ts +5 -5
  802. package/scripts/version/npm-registry.ts +44 -6
  803. package/scripts/version/publishable-range-check.ts +5 -16
  804. package/scripts/version/release-age.ts +1 -1
  805. package/scripts/version/release-hold.ts +1 -1
  806. package/scripts/version/release-window.ts +38 -0
  807. package/scripts/version/running-binary.ts +1 -1
  808. package/scripts/version/safe-chain-version-update.ts +3 -8
  809. package/scripts/version/version-targets.ts +6 -28
  810. package/templates/dependabot.yml +29 -0
  811. package/templates/gitignore +4 -1
  812. package/templates/pnpm-workspace.basic.yaml +1 -1
  813. package/templates/sonar-project.properties +3 -2
  814. package/templates/workflows/ci.yml +12 -4
  815. package/templates/workflows/github-release.yml +4 -0
  816. package/tsconfig.sonar.json +1 -1
  817. package/.ncurc.json +0 -3
  818. package/dist/hooks/batch-guard.js +0 -29
  819. package/dist/hooks/chunk-4KKD2UTK.js +0 -66
  820. package/dist/hooks/chunk-6TS2JD6D.js +0 -237
  821. package/dist/hooks/chunk-7DSBJVFH.js +0 -50
  822. package/dist/hooks/chunk-A65Y4YOR.js +0 -79
  823. package/dist/hooks/chunk-CDY4NFQG.js +0 -15
  824. package/dist/hooks/chunk-EFXE6C37.js +0 -81
  825. package/dist/hooks/chunk-GP4IEC4O.js +0 -20
  826. package/dist/hooks/chunk-JP45SOCJ.js +0 -56
  827. package/dist/hooks/chunk-LAOV7NLM.js +0 -45
  828. package/dist/hooks/chunk-M4HGZV7U.js +0 -83
  829. package/dist/hooks/chunk-PF2NZL2A.js +0 -131
  830. package/dist/hooks/chunk-PTICX4OL.js +0 -358
  831. package/dist/hooks/chunk-RT27QRJW.js +0 -6247
  832. package/dist/hooks/chunk-SYOTDYCI.js +0 -3533
  833. package/dist/hooks/chunk-UPUZF3AN.js +0 -279
  834. package/dist/hooks/chunk-WK6SMBIC.js +0 -3180
  835. package/dist/hooks/duplicate-read-guard.js +0 -30
  836. package/dist/hooks/investigation-guard.js +0 -29
  837. package/scripts/backlog/backlog-stalled-cli.ts +0 -30
  838. package/scripts/cost-runtime/cost-format.ts +0 -29
  839. package/scripts/init/basic-path-migration.ts +0 -24
  840. package/scripts/issue/issue-backlinks-cli.ts +0 -93
  841. package/scripts/josh/josh-commands-guard.ts +0 -38
  842. package/scripts/josh/josh-usage-automation.ts +0 -121
  843. package/scripts/josh/josh-usage-backlog.ts +0 -180
  844. package/scripts/josh/josh-usage-developer.ts +0 -230
  845. package/scripts/josh/josh-usage-hooks.ts +0 -38
  846. package/scripts/josh/josh-usage-issue.ts +0 -205
  847. package/scripts/josh/josh-usage-review.ts +0 -101
  848. package/scripts/josh/josh-usage-run.ts +0 -252
  849. package/scripts/josh/josh-usage-session.ts +0 -238
  850. package/scripts/josh/josh-usage-workflow.ts +0 -212
  851. package/scripts/lint/cross-file-recheck.ts +0 -155
  852. package/scripts/registry-migration/migrate-logic.ts +0 -237
  853. package/scripts/registry-migration/migrate.ts +0 -292
  854. package/scripts/registry-migration/user-npmrc.ts +0 -15
  855. package/scripts/rules/rule-guard.ts +0 -23
  856. package/scripts/rules/rule-registry-rows.ts +0 -292
  857. package/scripts/rules/rule-registry.ts +0 -112
  858. package/scripts/run/run-stranded-cli.ts +0 -27
@@ -1,7 +1,6 @@
1
- #!/usr/bin/env tsx
2
- import { fileURLToPath } from 'node:url'
3
1
  import { CONTEXT_CUT_THRESHOLD } from '#scripts/cost-runtime/context-cut-threshold'
4
2
  import { issue_cite } from '#scripts/issue/issue-cite'
3
+ import { RUN_STALLED_LABEL } from '#scripts/issue/issue-labels'
5
4
  import { issue_number_shape } from '#scripts/issue/issue-number-shape'
6
5
  import { issue_state_cli } from '#scripts/issue/issue-state-cli'
7
6
  import { lane_handoff } from '#scripts/lane/lane-handoff'
@@ -10,8 +9,10 @@ import { cli_flags } from '#scripts/lib/cli-flags'
10
9
  import { run_carry, type CarryOwner, type RunCarry } from '#scripts/run/carry/run-carry'
11
10
  import { run_event_stream } from '#scripts/run/event/run-event-stream'
12
11
  import { run_event_stream_emit } from '#scripts/run/event/run-event-stream-emit'
13
- import { run_label } from '#scripts/run/run-label'
12
+ import { run_stalled, type StallCause } from '#scripts/run/park/run-stalled'
14
13
  import { run_merge, type ChildOutcome } from './run-merge'
14
+ import { run_merge_auth } from './run-merge-auth'
15
+ import { run_merge_driver } from './run-merge-driver'
15
16
  import { run_merge_signals } from './run-merge-signals'
16
17
  import { run_merge_steps, type FailedResult, type MergeContext } from './run-merge-steps'
17
18
  import { run_merge_token, type MergeToken } from './run-merge-token'
@@ -26,15 +27,12 @@ import { run_merge_token, type MergeToken } from './run-merge-token'
26
27
  // (stop — the child's own ending), `stop` (the consecutive-failure guard tripped, or a failed child could not be parked) and `retry` (the
27
28
  // child's state could not be read; re-read before deciding).
28
29
 
29
- const ARGV_OFFSET = 2
30
30
  const SUCCESS_EXIT_CODE = 0
31
31
  const FAILURE_EXIT_CODE = 1
32
32
  const FIRST = 0
33
33
  const MIN_PID = 1
34
34
  const { MERGE_TOKEN } = run_merge_token
35
- const PARK_FAILURE_NOTE = 'The failed child could not be parked with needs-decision; stopping.'
36
- // The same digit shape `run-carry-args.ts` reads an owner pid under; a count is a bare run of digits.
37
- const DIGITS = /^\d+$/u
35
+ const PARK_FAILURE_NOTE = `The failed child could not be parked with ${RUN_STALLED_LABEL}; stopping.`
38
36
  // A GitHub `owner/repo` slug: an owner and a repository name around a single slash, each starting with
39
37
  // an alphanumeric so neither half can begin with `-`. `epic` and `repo` flow into `pnpm josh`
40
38
  // subprocess arguments, so a value shaped like an option (`--foo`, or `--evil/x`) would be read as a
@@ -43,9 +41,10 @@ const DIGITS = /^\d+$/u
43
41
  // itself forbids (names cannot start with a hyphen) and which the taint analyzer keeps flagging.
44
42
  const REPO_PATTERN = /^[A-Za-z0-9][\w.-]*\/[A-Za-z0-9][\w.-]*$/u
45
43
  const USAGE =
46
- 'Usage: josh run:merge <issue> [--over <deprecated>] [--epic <E> --repo <owner/repo>] [--owner <pid>] [--output <path>]'
44
+ 'Usage: josh run:merge <issue> [--over <deprecated>] [--epic <E> --repo <owner/repo>] [--owner <pid>] [--output <path>] [--driver]'
47
45
 
48
46
  const OPTIONS = {
47
+ driver: { type: 'boolean' },
49
48
  epic: { type: 'string' },
50
49
  output: { type: 'string' },
51
50
  over: { type: 'string' },
@@ -55,7 +54,9 @@ const OPTIONS = {
55
54
 
56
55
  interface ParsedArguments {
57
56
  positionals: ReadonlyArray<string>
58
- values: Partial<Record<'epic' | 'output' | 'over' | 'owner' | 'repo', string>>
57
+ values: Partial<Record<'epic' | 'output' | 'over' | 'owner' | 'repo', string>> & {
58
+ driver?: boolean
59
+ }
59
60
  }
60
61
 
61
62
  // Absent owner is "no owner declared", which the carry guard reads as not provably foreign; a present
@@ -63,11 +64,10 @@ interface ParsedArguments {
63
64
  function to_owner(raw: string | undefined): CarryOwner | undefined {
64
65
  if (raw === undefined) return run_carry.NO_OWNER
65
66
 
66
- if (!DIGITS.test(raw)) return undefined
67
-
68
- const pid = Number(raw)
67
+ // The same count shape `run-carry-args.ts` reads an owner pid under.
68
+ const pid = cli_flags.to_count(raw)
69
69
 
70
- return pid < MIN_PID ? undefined : run_carry.owner_of(pid)
70
+ return pid === undefined || pid < MIN_PID ? undefined : run_carry.owner_of(pid)
71
71
  }
72
72
 
73
73
  // The epic form needs a repository (`epic:next --lanes` refuses without one), so an epic named with
@@ -116,7 +116,7 @@ function has_invalid_offer(values: ParsedArguments['values']): boolean {
116
116
  function has_invalid_legacy_over(raw: string | undefined): boolean {
117
117
  if (raw === undefined) return false
118
118
 
119
- return !DIGITS.test(raw) || !Number.isSafeInteger(Number(raw))
119
+ return cli_flags.to_count(raw) === undefined
120
120
  }
121
121
 
122
122
  function valid_child(parsed: ParsedArguments): string | undefined {
@@ -127,6 +127,11 @@ function valid_child(parsed: ParsedArguments): string | undefined {
127
127
  return issue_number_shape.ISSUE_NUMBER_PATTERN.test(child) ? child : undefined
128
128
  }
129
129
 
130
+ // `backlog:drive` has no context to cut, so its merge is never handed back `over`.
131
+ function threshold_of(values: ParsedArguments['values']): number | undefined {
132
+ return values.driver === true ? undefined : CONTEXT_CUT_THRESHOLD
133
+ }
134
+
130
135
  function to_context(parsed: ParsedArguments): MergeContext | undefined {
131
136
  if (has_invalid_offer(parsed.values) || has_invalid_legacy_over(parsed.values.over)) {
132
137
  return undefined
@@ -144,7 +149,7 @@ function to_context(parsed: ParsedArguments): MergeContext | undefined {
144
149
  child,
145
150
  epic: valid_epic(parsed.values.epic),
146
151
  repo: valid_repo(parsed.values.repo),
147
- over: CONTEXT_CUT_THRESHOLD,
152
+ over: threshold_of(parsed.values),
148
153
  owner,
149
154
  output: parsed.values.output,
150
155
  }
@@ -156,8 +161,8 @@ function parse(argv: ReadonlyArray<string>): MergeContext | undefined {
156
161
  return parsed === undefined ? undefined : to_context(parsed)
157
162
  }
158
163
 
159
- // One handled return: the stdout token and the exit code. Returned rather than printed, so the
160
- // in-process caller (`backlog:drive`) reads the same verdict the CLI prints.
164
+ // One handled return: the stdout token and the exit code. Returned rather than printed, so
165
+ // `merge_child` carries the verdict to `run_merge_driver.printed`, which prints it.
161
166
  interface ControlVerdict {
162
167
  token: MergeToken
163
168
  code: number
@@ -183,8 +188,13 @@ function emit(token: MergeToken, code: number): ControlVerdict {
183
188
  return { token, code, is_offer: false }
184
189
  }
185
190
 
191
+ // No threshold is `backlog:drive`, which asks `backlog:offer` itself in the pass that collected the
192
+ // child: `backlog:next` here would only hold back its next launch (joshuafolkken/kit#4406).
186
193
  async function offered(ctx: MergeContext): Promise<OfferVerdict> {
187
- return { token: await run_merge_steps.ask_next(ctx), code: SUCCESS_EXIT_CODE, is_offer: true }
194
+ const token =
195
+ ctx.over === undefined ? run_merge_driver.DEFERRED_OFFER : await run_merge_steps.ask_next(ctx)
196
+
197
+ return { token, code: SUCCESS_EXIT_CODE, is_offer: true }
188
198
  }
189
199
 
190
200
  // A refused count means this session is not the carry record's owner, so the whole operation is
@@ -197,7 +207,8 @@ function report_count_refused(carry: RunCarry | undefined): MergeVerdict {
197
207
 
198
208
  // A merged child counted and its lane closed, the merge put on the stream and in the ledger. Returns the
199
209
  // carry when the ownership check refused it, `undefined` once recorded. `run:carry --end` records the
200
- // merges a run ended with through it too (`run-merge-collect.ts`).
210
+ // merges a run ended with through it too (`run-merge-collect.ts`). The lane's `ended` record is
211
+ // `lane:close`'s alone: an `incomplete` close leaves the lane open on it (joshuafolkken/kit#4300).
201
212
  async function record_merged(ctx: MergeContext): Promise<RunCarry | undefined> {
202
213
  const refused = await run_merge_steps.do_merged(ctx)
203
214
 
@@ -226,16 +237,13 @@ async function on_merged(ctx: MergeContext): Promise<MergeVerdict> {
226
237
  return await offered(ctx)
227
238
  }
228
239
 
229
- // A child released to wait on its open blockers: settled for this run like a parked one, so it goes on
230
- // the stream the same way, but nothing was counted — the failure guard is not read, and the next child
231
- // is offered.
232
- async function on_waiting(
233
- ctx: MergeContext,
234
- blockers: ReadonlyArray<string>,
235
- ): Promise<MergeVerdict> {
240
+ // A child released to wait on its open blockers or its start date: settled for this run like a parked
241
+ // one, so it goes on the stream the same way, but nothing was counted — the failure guard is not read,
242
+ // and the next child is offered.
243
+ async function on_waiting(ctx: MergeContext, waits: ReadonlyArray<string>): Promise<MergeVerdict> {
236
244
  await run_event_stream_emit.emit(
237
245
  run_event_stream.EVENT_KIND.PARK,
238
- `${issue_cite.plain(ctx.child)} waiting on ${blockers.join(', ')}`,
246
+ `${issue_cite.plain(ctx.child)} waiting on ${waits.join(', ')}`,
239
247
  )
240
248
 
241
249
  return await offered(ctx)
@@ -248,9 +256,11 @@ async function on_parked_failure(ctx: MergeContext, result: FailedResult): Promi
248
256
  return emit(MERGE_TOKEN.STOP, FAILURE_EXIT_CODE)
249
257
  }
250
258
 
259
+ const cause = result.cause ?? run_stalled.SESSION_UNFINISHED.short
260
+
251
261
  await run_event_stream_emit.emit(
252
262
  run_event_stream.EVENT_KIND.PARK,
253
- `${issue_cite.plain(ctx.child)} parked (needs-decision)`,
263
+ run_stalled.park_event(ctx.child, cause),
254
264
  )
255
265
 
256
266
  if (result.carry !== undefined && run_merge.is_guard_tripped(result.carry.failures)) {
@@ -260,12 +270,12 @@ async function on_parked_failure(ctx: MergeContext, result: FailedResult): Promi
260
270
  return await offered(ctx)
261
271
  }
262
272
 
263
- async function on_failed(ctx: MergeContext, cause?: string): Promise<MergeVerdict> {
273
+ async function on_failed(ctx: MergeContext, cause?: StallCause): Promise<MergeVerdict> {
264
274
  const result = await run_merge_steps.do_failed(ctx, cause)
265
275
 
266
276
  if (result.is_refused) return report_count_refused(result.carry)
267
277
 
268
- if (result.blockers.length > 0) return await on_waiting(ctx, result.blockers)
278
+ if (result.waits.length > 0) return await on_waiting(ctx, result.waits)
269
279
 
270
280
  return await on_parked_failure(ctx, result)
271
281
  }
@@ -290,6 +300,14 @@ async function on_outage(ctx: MergeContext): Promise<MergeVerdict> {
290
300
  return await offered(ctx)
291
301
  }
292
302
 
303
+ // A child whose session could not authenticate: the run stops with nothing counted or parked
304
+ // (`run-merge-auth.ts`).
305
+ async function on_unauthenticated(ctx: MergeContext): Promise<MergeVerdict> {
306
+ await run_merge_auth.stop(ctx.child)
307
+
308
+ return emit(MERGE_TOKEN.ENVIRONMENT, SUCCESS_EXIT_CODE)
309
+ }
310
+
293
311
  // A child that ended its session with a cut no successor adopted: its successor is relaunched,
294
312
  // nothing is counted and nothing is parked, and `resumed` tells the parent to await the same lane
295
313
  // again rather than dispatch into it. A successor that could not be started — or a cut the
@@ -301,7 +319,7 @@ async function on_cut(ctx: MergeContext): Promise<MergeVerdict> {
301
319
  if (refused !== undefined) return report_count_refused(refused)
302
320
 
303
321
  if (!(await run_merge_steps.resume_cut(ctx.child))) {
304
- return await on_failed(ctx, run_merge_steps.CUT_RELAUNCH_CAUSE)
322
+ return await on_failed(ctx, run_stalled.CUT_NOT_RELAUNCHED)
305
323
  }
306
324
 
307
325
  await run_event_stream_emit.emit(
@@ -314,10 +332,10 @@ async function on_cut(ctx: MergeContext): Promise<MergeVerdict> {
314
332
 
315
333
  // A child that parked itself: nothing is counted, but the park is written to the stream as a failed
316
334
  // child's is, so a reader restoring the run from its events sees the child settled. Its `in-progress`
317
- // is dropped as a failed child's is: left on, it would outlive the `needs-decision` a person later
318
- // lifts, and a `run:solo` child would then hold the whole backlog.
335
+ // is dropped as a failed child's is: left on, it would outlive the park label a person later
336
+ // lifts, and a `run:solo` child would then hold the whole backlog. A lane it left empty is closed.
319
337
  async function on_parked(ctx: MergeContext): Promise<MergeVerdict> {
320
- await run_label.unmark(ctx.child)
338
+ await run_merge_steps.release_child(ctx.child)
321
339
  await run_event_stream_emit.emit(
322
340
  run_event_stream.EVENT_KIND.PARK,
323
341
  `${issue_cite.plain(ctx.child)} parked`,
@@ -338,9 +356,9 @@ async function on_skipped(ctx: MergeContext): Promise<MergeVerdict> {
338
356
  return await offered(ctx)
339
357
  }
340
358
 
341
- // A child a person withdrew with `lane:withdraw`: the withdrawal already stopped it, closed its issue
342
- // and lane and put itself on the stream, so nothing is counted or written here and its seat goes to the
343
- // next child.
359
+ // A child a person withdrew with `lane:withdraw`: the withdrawal already stopped it, closed its lane
360
+ // and put itself on the stream, leaving its issue open for the next run, so nothing is counted or
361
+ // written here and its seat goes to the next child.
344
362
  async function on_withdrawn(ctx: MergeContext): Promise<MergeVerdict> {
345
363
  return await offered(ctx)
346
364
  }
@@ -366,6 +384,7 @@ const HANDLERS: Readonly<Record<ChildOutcome, (ctx: MergeContext) => Promise<Mer
366
384
  'human-review': on_human_review,
367
385
  merged: on_merged,
368
386
  outage: on_outage,
387
+ unauthenticated: on_unauthenticated,
369
388
  parked: on_parked,
370
389
  split: on_skipped,
371
390
  unresolved: on_unresolved,
@@ -373,8 +392,9 @@ const HANDLERS: Readonly<Record<ChildOutcome, (ctx: MergeContext) => Promise<Mer
373
392
  withdrawn: on_withdrawn,
374
393
  }
375
394
 
376
- // The whole merge event for one returned child, in-process: read its state, classify it, and run the
377
- // handler. The CLI prints the token; `backlog:drive` branches on the outcome.
395
+ // The whole merge event for one returned child: read its state, classify it, and run the handler.
396
+ // The CLI prints the token and the outcome; `backlog:drive` runs it as a child process
397
+ // (`run-merge-driver.ts`) and branches on the printed outcome.
378
398
  async function merge_child(ctx: MergeContext): Promise<MergeResult> {
379
399
  if (lane_handoff.is_ship_running(ctx.child, process.cwd())) {
380
400
  return { outcome: 'shipping', ...(await on_shipping()) }
@@ -384,9 +404,9 @@ async function merge_child(ctx: MergeContext): Promise<MergeResult> {
384
404
  const signals = await run_merge_signals.read_signals(ctx, read)
385
405
  const outcome = run_merge_signals.outcome_of(read, signals)
386
406
 
387
- const { merged_pr, is_unanswered } = signals
407
+ const { merged_pr, is_streak_exempt } = signals
388
408
 
389
- return { outcome, ...(await HANDLERS[outcome]({ ...ctx, merged_pr, is_unanswered })) }
409
+ return { outcome, ...(await HANDLERS[outcome]({ ...ctx, merged_pr, is_streak_exempt })) }
390
410
  }
391
411
 
392
412
  async function run(argv: ReadonlyArray<string>): Promise<number> {
@@ -400,15 +420,11 @@ async function run(argv: ReadonlyArray<string>): Promise<number> {
400
420
 
401
421
  const result = await merge_child(ctx)
402
422
 
403
- console.info(result.token)
423
+ console.info(run_merge_driver.printed(argv, result))
404
424
 
405
425
  return result.code
406
426
  }
407
427
 
408
- async function main(argv: ReadonlyArray<string>): Promise<void> {
409
- process.exitCode = await run(argv)
410
- }
411
-
412
428
  const run_merge_cli = {
413
429
  merge_child,
414
430
  parse,
@@ -417,7 +433,5 @@ const run_merge_cli = {
417
433
  run,
418
434
  }
419
435
 
420
- if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
421
-
422
436
  export type { MergeResult }
423
437
  export { run_merge_cli }
@@ -0,0 +1,74 @@
1
+ import { epic_close } from '#scripts/epic/epic-close'
2
+ import { git_followup_issue_close } from '#scripts/followup/git-followup-issue-close'
3
+ import { session_cite } from '#scripts/issue/session-cite'
4
+
5
+ const MERGE_CLOSER = 'pnpm josh run:merge'
6
+ const SINGLE_READ = { attempts: 1, interval_ms: 0 }
7
+
8
+ interface MergedChild {
9
+ child: string
10
+ // The merged pull request that closes the child, when GitHub left the child OPEN after the merge.
11
+ merged_pr?: string | undefined
12
+ }
13
+
14
+ // A child merged while GitHub left it OPEN is closed here, through the one close `followup` uses.
15
+ // The state was just read OPEN, so it is read once rather than waited on. A
16
+ // close that fails is reported with its recovery and does not undo the merge being counted. Answers
17
+ // whether the child is closed now.
18
+ async function close_merged_open(merged: MergedChild): Promise<boolean> {
19
+ if (merged.merged_pr === undefined) return true
20
+
21
+ try {
22
+ await git_followup_issue_close.ensure_issue_closed(
23
+ { issue_number: merged.child, pr_url: merged.merged_pr, closer: MERGE_CLOSER },
24
+ SINGLE_READ,
25
+ )
26
+
27
+ return true
28
+ } catch {
29
+ console.error(
30
+ `${session_cite.issue(merged.child)}: could not be closed — ${git_followup_issue_close.CLOSE_RECOVERY}`,
31
+ )
32
+
33
+ return false
34
+ }
35
+ }
36
+
37
+ // `run:merge`'s stdout carries only the next child or a verdict, so the epic auto-close's notes go to
38
+ // stderr for as long as it runs, beside this command's own notes.
39
+ function divert_info_to_stderr(): () => void {
40
+ const { info } = console
41
+
42
+ console.info = console.error
43
+
44
+ return function restore(): void {
45
+ console.info = info
46
+ }
47
+ }
48
+
49
+ async function with_notes_on_stderr(step: () => Promise<void>): Promise<void> {
50
+ const restore = divert_info_to_stderr()
51
+
52
+ try {
53
+ await step()
54
+ } finally {
55
+ restore()
56
+ }
57
+ }
58
+
59
+ // Every other child `run:merge` counts as merged is already closed, whatever closed it — `followup`
60
+ // or `josh issue:measured` — so its epics are evaluated here, through the one entry every child close
61
+ // takes (`epic-close.ts`, #4560). A child still OPEN after a failed close is not: the auto-close
62
+ // treats the child as closed without reading it. An `already-done` child reads OPEN here and is
63
+ // parked; once a person closes it, the next child close sweeps its epic (`epic-close.ts`, #4564).
64
+ async function close_merged(merged: MergedChild): Promise<void> {
65
+ if (!(await close_merged_open(merged))) return
66
+
67
+ await with_notes_on_stderr(async () => {
68
+ await epic_close.close_completed_epics({ issue_number: merged.child, is_merged: true })
69
+ })
70
+ }
71
+
72
+ const run_merge_close = { close_merged }
73
+
74
+ export { run_merge_close }
@@ -1,19 +1,18 @@
1
- import { backlog_drive_restore } from '#scripts/backlog/backlog-drive-restore'
1
+ import { backlog_drive_adopt } from '#scripts/backlog/backlog-drive-adopt'
2
2
  import { issue_merged } from '#scripts/issue/issue-merged'
3
3
  import { issue_state_cli } from '#scripts/issue/issue-state-cli'
4
4
  import { session_cite } from '#scripts/issue/session-cite'
5
5
  import { lane_handoff } from '#scripts/lane/lane-handoff'
6
- import { lane_registry, type LaneInfo } from '#scripts/lane/lane-registry'
6
+ import type { LaneInfo } from '#scripts/lane/lane-registry'
7
7
  import { run_carry, type CarryOwner, type RunCarry } from '#scripts/run/carry/run-carry'
8
- import { run_event_stream_emit } from '#scripts/run/event/run-event-stream-emit'
9
8
  import { run_merge } from './run-merge'
10
9
  import { run_merge_cli } from './run-merge-cli'
11
10
 
12
11
  type IssueRead = Awaited<ReturnType<typeof issue_state_cli.read_issue>>
13
12
 
14
- // The merges a run ends with, recorded at `run:carry --end`. `backlog:drive` collects only the lanes
15
- // it holds in memory, and a restarted driver reseeds them from the open lanes, so a lane that merged
16
- // while no driver watched it never reached `run:merge`: no `merge` event, no ledger line, no merged
13
+ // The merges a run ends with, recorded at `run:carry --end`. `backlog:drive` collects the lanes it
14
+ // holds or adopts while it runs (`backlog-drive-adopt.ts`), so a lane that merged while no driver
15
+ // watched it never reached `run:merge`: no `merge` event, no ledger line, no merged
17
16
  // count. Each lane still open on a child the run launched and never settled is read once more, and
18
17
  // **only a merged one is collected** — closed by a merged pull request, or left open behind one —
19
18
  // through the same `run:merge` recording a driver would have made.
@@ -79,13 +78,7 @@ function owner_of(carry: RunCarry): CarryOwner {
79
78
  }
80
79
 
81
80
  async function collect_carried(carry: RunCarry): Promise<void> {
82
- const in_flight = backlog_drive_restore.active_issues(
83
- await run_event_stream_emit.current_events(),
84
- )
85
- const lanes = await lane_registry.list_lanes()
86
- const collectable = lanes.filter((lane) => !lane.is_stranded && in_flight.has(lane.issue))
87
-
88
- await collect_all(collectable, owner_of(carry))
81
+ await collect_all(await backlog_drive_adopt.active_lanes(), owner_of(carry))
89
82
  }
90
83
 
91
84
  // Asked by `--end` before it closes the record under `directory`, the common git directory; a run with
@@ -0,0 +1,71 @@
1
+ import { json_value } from '#scripts/lib/json-value'
2
+ import { z } from 'zod'
3
+ import type { MergeResult } from './run-merge-cli'
4
+ import { run_merge_outcome } from './run-merge-outcome'
5
+ import { run_merge_token } from './run-merge-token'
6
+
7
+ // `run:merge` as `backlog:drive` runs it: a child process per merge, never an import, so a fix merged
8
+ // into `run:merge` after the driver started is the code its next merge runs (joshuafolkken/kit#4102).
9
+ // Imported in process, the driver went on parking children with the code it was started with.
10
+ //
11
+ // `--driver` asks for what the driver alone needs: no hand-off threshold — a supervisor has no context
12
+ // to cut — and the whole `MergeResult` as one JSON line on stdout's last line, since the outcome the
13
+ // driver branches on is not in the token a person reads.
14
+
15
+ const COMMAND = 'run:merge'
16
+ const DRIVER_FLAG = '--driver'
17
+ const JSON_KEY = 'merge'
18
+ const LINE_BREAK = '\n'
19
+ // The offer token `--driver` answers in place of `backlog:next`'s: the driver never reads an offer's
20
+ // text, only that one was printed, and asks `backlog:offer` itself (joshuafolkken/kit#4406).
21
+ const DEFERRED_OFFER = 'deferred'
22
+
23
+ const control_schema = z.object({
24
+ token: z.enum(Object.values(run_merge_token.MERGE_TOKEN)),
25
+ code: z.number(),
26
+ is_offer: z.literal(false),
27
+ outcome: z.enum(run_merge_outcome.CHILD_OUTCOMES),
28
+ })
29
+ const offer_schema = z.object({
30
+ token: z.string(),
31
+ code: z.number(),
32
+ is_offer: z.literal(true),
33
+ outcome: z.enum(run_merge_outcome.CHILD_OUTCOMES),
34
+ })
35
+ const printed_schema = z.object({
36
+ [JSON_KEY]: z.discriminatedUnion('is_offer', [control_schema, offer_schema]),
37
+ })
38
+
39
+ interface DriverMerge {
40
+ child: string
41
+ owner: string
42
+ output: string | undefined
43
+ }
44
+
45
+ function argv_of(merge: DriverMerge): Array<string> {
46
+ const output = merge.output === undefined ? [] : ['--output', merge.output]
47
+
48
+ return [COMMAND, merge.child, '--owner', merge.owner, DRIVER_FLAG, ...output]
49
+ }
50
+
51
+ function print(result: MergeResult): string {
52
+ return JSON.stringify({ [JSON_KEY]: result })
53
+ }
54
+
55
+ // What `run:merge` prints: the whole result under `--driver`, else the token a person reads.
56
+ function printed(argv: ReadonlyArray<string>, result: MergeResult): string {
57
+ return argv.includes(DRIVER_FLAG) ? print(result) : result.token
58
+ }
59
+
60
+ // The result on stdout's last line, or `undefined` where the child process printed none — a crash
61
+ // before its verdict, which the driver reads as no token.
62
+ function read(out: string): MergeResult | undefined {
63
+ const last = out.trimEnd().split(LINE_BREAK).at(-1) ?? ''
64
+
65
+ return json_value.parse_with(last, printed_schema)?.[JSON_KEY]
66
+ }
67
+
68
+ const run_merge_driver = { DEFERRED_OFFER, DRIVER_FLAG, argv_of, print, printed, read }
69
+
70
+ export type { DriverMerge }
71
+ export { run_merge_driver }
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env tsx
2
+ import { fileURLToPath } from 'node:url'
3
+ import { run_merge_cli } from './run-merge-cli'
4
+
5
+ // The `josh run:merge` entry, kept apart from `run-merge-cli.ts` because other modules import that
6
+ // one: a bundle is one file, so a main guard there would fire for every command that carries it
7
+ // (joshuafolkken/kit#4186).
8
+ if (process.argv[1] === fileURLToPath(import.meta.url)) {
9
+ const ARGV_OFFSET = 2
10
+
11
+ process.exitCode = await run_merge_cli.run(process.argv.slice(ARGV_OFFSET))
12
+ }
@@ -0,0 +1,23 @@
1
+ // The outcomes `run:merge` classifies a returned child as — each one's meaning is `run-merge.ts`'s.
2
+ // Listed as values so `run:merge --driver`'s JSON is read back against the same names
3
+ // (`run-merge-driver.ts`) rather than a second list.
4
+ const CHILD_OUTCOMES = [
5
+ 'merged',
6
+ 'withdrawn',
7
+ 'human-review',
8
+ 'parked',
9
+ 'split',
10
+ 'cut',
11
+ 'outage',
12
+ 'unauthenticated',
13
+ 'failed',
14
+ 'unresolved',
15
+ 'shipping',
16
+ ] as const
17
+
18
+ type ChildOutcome = (typeof CHILD_OUTCOMES)[number]
19
+
20
+ const run_merge_outcome = { CHILD_OUTCOMES }
21
+
22
+ export type { ChildOutcome }
23
+ export { run_merge_outcome }
@@ -0,0 +1,39 @@
1
+ import { uptime } from 'node:os'
2
+ import { agent_exit_record } from '#scripts/agent/agent-exit-record'
3
+ import { lane_registry } from '#scripts/lane/lane-registry'
4
+ import { run_ending } from '#scripts/run/run-ending'
5
+
6
+ // Whether a returned child was killed by the host restarting rather than ending on its own
7
+ // (joshuafolkken/kit#4540). A restart clears the temporary directory the child's transcript and the run's
8
+ // event stream live in, so the exit record cannot tell it apart from a failure; the lane's dispatch time,
9
+ // kept in its worktree, can: a child dispatched before the host booted, with no exit record of its own,
10
+ // did not end itself.
11
+
12
+ const MS_PER_SECOND = 1000
13
+
14
+ // When the host last booted, in epoch milliseconds.
15
+ function booted_ms(): number {
16
+ return Date.now() - uptime() * MS_PER_SECOND
17
+ }
18
+
19
+ // Whether the newest launch ended on its own exit record. The log is appended across launches, and where
20
+ // the temporary root survives a reboot it still holds an earlier launch's record, so only a record that
21
+ // is the log's last line belongs to the launch the restart may have killed.
22
+ function has_exit_record(output: string | undefined): boolean {
23
+ const transcript = output === undefined ? undefined : run_ending.read_transcript(output)
24
+
25
+ return transcript !== undefined && agent_exit_record.ends_on_exit_record(transcript)
26
+ }
27
+
28
+ async function is_host_restart(child: string, output: string | undefined): Promise<boolean> {
29
+ if (has_exit_record(output)) return false
30
+
31
+ const lane = await lane_registry.find_open_lane(child)
32
+ const dispatched_ms = lane?.dispatched_ms
33
+
34
+ return dispatched_ms !== undefined && dispatched_ms < booted_ms()
35
+ }
36
+
37
+ const run_merge_restart = { is_host_restart }
38
+
39
+ export { run_merge_restart }
@@ -3,8 +3,10 @@ import { lane_registry } from '#scripts/lane/lane-registry'
3
3
  import { lane_relaunch } from '#scripts/lane/lane-relaunch'
4
4
  import { run_event_scope } from '#scripts/run/event/run-event-scope'
5
5
  import { run_event_stream, type RunEvent } from '#scripts/run/event/run-event-stream'
6
+ import type { StallCause } from '#scripts/run/park/run-stalled'
6
7
  import { run_ending } from '#scripts/run/run-ending'
7
8
  import { run_ship_detach } from '#scripts/run/ship/run-ship-detach'
9
+ import { run_ship_stop_text } from '#scripts/run/ship/run-ship-stop-text'
8
10
 
9
11
  // Why `run:merge` parks a child whose detached ship has already ended (joshuafolkken/kit#3808).
10
12
  //
@@ -35,7 +37,18 @@ function since_ship_launch(events: Events, child: string): Events | undefined {
35
37
  return launched_at === -1 ? undefined : own.slice(launched_at + 1)
36
38
  }
37
39
 
38
- function cause_of(ending: ShipEnding, events: Events, child: string): string | undefined {
40
+ // The stopped stage names the cause's short form (`review failed`); a stop text in no known shape is
41
+ // still a ship stop.
42
+ function stop_cause(stop: RunEvent): StallCause {
43
+ const stage = run_ship_stop_text.reason_of(stop.text)
44
+
45
+ return {
46
+ short: stage === undefined ? 'ship stopped' : `${stage} failed`,
47
+ why: `its detached ship stopped and was not fixed: ${stop.text}.`,
48
+ }
49
+ }
50
+
51
+ function cause_of(ending: ShipEnding, events: Events, child: string): StallCause | undefined {
39
52
  if (ending === undefined || !ENDED_RESULTS.has(ending.result)) return undefined
40
53
 
41
54
  const attempt = since_ship_launch(events, child)
@@ -43,14 +56,17 @@ function cause_of(ending: ShipEnding, events: Events, child: string): string | u
43
56
 
44
57
  const stop = attempt.findLast((event) => event.kind === run_event_stream.EVENT_KIND.SHIP_STOP)
45
58
 
46
- if (stop !== undefined) return `its detached ship stopped and was not fixed: ${stop.text}.`
59
+ if (stop !== undefined) return stop_cause(stop)
47
60
 
48
- return `its detached ship ended ${ending.result} before recording a stopped stage — pnpm josh ship --log ${child}.`
61
+ return {
62
+ short: `ship ${ending.result}`,
63
+ why: `its detached ship ended ${ending.result} before recording a stopped stage — pnpm josh ship --log ${child}.`,
64
+ }
49
65
  }
50
66
 
51
67
  // The ship's cause for `child`'s park, read from the record and the stream this checkout's repository
52
68
  // keys on, or `undefined` when the child handed nothing to a ship or its ship succeeded.
53
- function cause(child: string, directory: string = process.cwd()): string | undefined {
69
+ function cause(child: string, directory: string = process.cwd()): StallCause | undefined {
54
70
  const repository = git_common_directory.repository(directory)
55
71
  if (repository === undefined) return undefined
56
72