@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,22 +1,19 @@
1
- #!/usr/bin/env tsx
2
- import { fileURLToPath } from 'node:url'
3
- import { api_outage } from '#scripts/agent/api-outage'
4
1
  import { CONTEXT_CUT_THRESHOLD } from '#scripts/cost-runtime/context-cut-threshold'
5
2
  import { issue_cite } from '#scripts/issue/issue-cite'
6
- import { issue_closing_pr } from '#scripts/issue/issue-closing-pr'
3
+ import { RUN_STALLED_LABEL } from '#scripts/issue/issue-labels'
7
4
  import { issue_number_shape } from '#scripts/issue/issue-number-shape'
8
5
  import { issue_state_cli } from '#scripts/issue/issue-state-cli'
9
6
  import { lane_handoff } from '#scripts/lane/lane-handoff'
10
7
  import { lane_ledger } from '#scripts/lane/lane-ledger'
11
8
  import { cli_flags } from '#scripts/lib/cli-flags'
12
9
  import { run_carry, type CarryOwner, type RunCarry } from '#scripts/run/carry/run-carry'
13
- import { run_event_scope } from '#scripts/run/event/run-event-scope'
14
10
  import { run_event_stream } from '#scripts/run/event/run-event-stream'
15
11
  import { run_event_stream_emit } from '#scripts/run/event/run-event-stream-emit'
16
- import { run_ending } from '#scripts/run/run-ending'
17
- import { run_label } from '#scripts/run/run-label'
18
- import { run_merge, type ChildOutcome, type EndingSignals } from './run-merge'
19
- import { run_merge_ship } from './run-merge-ship'
12
+ import { run_stalled, type StallCause } from '#scripts/run/park/run-stalled'
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'
16
+ import { run_merge_signals } from './run-merge-signals'
20
17
  import { run_merge_steps, type FailedResult, type MergeContext } from './run-merge-steps'
21
18
  import { run_merge_token, type MergeToken } from './run-merge-token'
22
19
 
@@ -30,15 +27,12 @@ import { run_merge_token, type MergeToken } from './run-merge-token'
30
27
  // (stop — the child's own ending), `stop` (the consecutive-failure guard tripped, or a failed child could not be parked) and `retry` (the
31
28
  // child's state could not be read; re-read before deciding).
32
29
 
33
- const ARGV_OFFSET = 2
34
30
  const SUCCESS_EXIT_CODE = 0
35
31
  const FAILURE_EXIT_CODE = 1
36
32
  const FIRST = 0
37
33
  const MIN_PID = 1
38
34
  const { MERGE_TOKEN } = run_merge_token
39
- const PARK_FAILURE_NOTE = 'The failed child could not be parked with needs-decision; stopping.'
40
- // The same digit shape `run-carry-args.ts` reads an owner pid under; a count is a bare run of digits.
41
- const DIGITS = /^\d+$/u
35
+ const PARK_FAILURE_NOTE = `The failed child could not be parked with ${RUN_STALLED_LABEL}; stopping.`
42
36
  // A GitHub `owner/repo` slug: an owner and a repository name around a single slash, each starting with
43
37
  // an alphanumeric so neither half can begin with `-`. `epic` and `repo` flow into `pnpm josh`
44
38
  // subprocess arguments, so a value shaped like an option (`--foo`, or `--evil/x`) would be read as a
@@ -47,9 +41,10 @@ const DIGITS = /^\d+$/u
47
41
  // itself forbids (names cannot start with a hyphen) and which the taint analyzer keeps flagging.
48
42
  const REPO_PATTERN = /^[A-Za-z0-9][\w.-]*\/[A-Za-z0-9][\w.-]*$/u
49
43
  const USAGE =
50
- '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]'
51
45
 
52
46
  const OPTIONS = {
47
+ driver: { type: 'boolean' },
53
48
  epic: { type: 'string' },
54
49
  output: { type: 'string' },
55
50
  over: { type: 'string' },
@@ -59,7 +54,9 @@ const OPTIONS = {
59
54
 
60
55
  interface ParsedArguments {
61
56
  positionals: ReadonlyArray<string>
62
- values: Partial<Record<'epic' | 'output' | 'over' | 'owner' | 'repo', string>>
57
+ values: Partial<Record<'epic' | 'output' | 'over' | 'owner' | 'repo', string>> & {
58
+ driver?: boolean
59
+ }
63
60
  }
64
61
 
65
62
  // Absent owner is "no owner declared", which the carry guard reads as not provably foreign; a present
@@ -67,11 +64,10 @@ interface ParsedArguments {
67
64
  function to_owner(raw: string | undefined): CarryOwner | undefined {
68
65
  if (raw === undefined) return run_carry.NO_OWNER
69
66
 
70
- if (!DIGITS.test(raw)) return undefined
71
-
72
- 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)
73
69
 
74
- return pid < MIN_PID ? undefined : run_carry.owner_of(pid)
70
+ return pid === undefined || pid < MIN_PID ? undefined : run_carry.owner_of(pid)
75
71
  }
76
72
 
77
73
  // The epic form needs a repository (`epic:next --lanes` refuses without one), so an epic named with
@@ -120,7 +116,7 @@ function has_invalid_offer(values: ParsedArguments['values']): boolean {
120
116
  function has_invalid_legacy_over(raw: string | undefined): boolean {
121
117
  if (raw === undefined) return false
122
118
 
123
- return !DIGITS.test(raw) || !Number.isSafeInteger(Number(raw))
119
+ return cli_flags.to_count(raw) === undefined
124
120
  }
125
121
 
126
122
  function valid_child(parsed: ParsedArguments): string | undefined {
@@ -131,6 +127,11 @@ function valid_child(parsed: ParsedArguments): string | undefined {
131
127
  return issue_number_shape.ISSUE_NUMBER_PATTERN.test(child) ? child : undefined
132
128
  }
133
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
+
134
135
  function to_context(parsed: ParsedArguments): MergeContext | undefined {
135
136
  if (has_invalid_offer(parsed.values) || has_invalid_legacy_over(parsed.values.over)) {
136
137
  return undefined
@@ -148,7 +149,7 @@ function to_context(parsed: ParsedArguments): MergeContext | undefined {
148
149
  child,
149
150
  epic: valid_epic(parsed.values.epic),
150
151
  repo: valid_repo(parsed.values.repo),
151
- over: CONTEXT_CUT_THRESHOLD,
152
+ over: threshold_of(parsed.values),
152
153
  owner,
153
154
  output: parsed.values.output,
154
155
  }
@@ -160,8 +161,8 @@ function parse(argv: ReadonlyArray<string>): MergeContext | undefined {
160
161
  return parsed === undefined ? undefined : to_context(parsed)
161
162
  }
162
163
 
163
- // One handled return: the stdout token and the exit code. Returned rather than printed, so the
164
- // 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.
165
166
  interface ControlVerdict {
166
167
  token: MergeToken
167
168
  code: number
@@ -187,63 +188,13 @@ function emit(token: MergeToken, code: number): ControlVerdict {
187
188
  return { token, code, is_offer: false }
188
189
  }
189
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).
190
193
  async function offered(ctx: MergeContext): Promise<OfferVerdict> {
191
- return { token: await run_merge_steps.ask_next(ctx), code: SUCCESS_EXIT_CODE, is_offer: true }
192
- }
193
-
194
- // Whether the child's session ended through its environment — read only when `--output` named the
195
- // transcript, off otherwise: its exit record shows it could not reach the API, or the session was
196
- // killed inside a turn. The path is validated inside `run_ending`, so a missing output is "no".
197
- function read_is_outage(output: string | undefined): boolean {
198
- if (output === undefined) return false
199
-
200
- return api_outage.is_outage(run_ending.read_exit(output)) || run_ending.ended_mid_turn(output)
201
- }
202
-
203
- async function child_outages(child: string): Promise<number> {
204
- const events = await run_event_stream_emit.current_events()
205
-
206
- return events.filter(
207
- (event) =>
208
- event.kind === run_event_stream.EVENT_KIND.OUTAGE &&
209
- run_event_scope.issue_named(event) === child,
210
- ).length
211
- }
212
-
213
- // An outage child is re-dispatched only so many times: one that ends the same way on every dispatch is
214
- // parked, since merges in other lanes reset the run-wide outage streak and would never stop it.
215
- async function read_is_retryable(child: string, output: string | undefined): Promise<boolean> {
216
- const is_interrupted =
217
- read_is_outage(output) || (await run_merge_ship.is_unanswered(child, output))
218
-
219
- if (!is_interrupted) return false
220
-
221
- return (await child_outages(child)) < run_merge.CONSECUTIVE_OUTAGE_LIMIT
222
- }
223
-
224
- type IssueRead = Awaited<ReturnType<typeof issue_state_cli.read_issue>>
225
-
226
- // The timeline is read only for an OPEN, unparked child — the one classification a merged closing pull
227
- // request changes. A CLOSED child was closed by GitHub, so it must carry no `merged_pr` for
228
- // `do_merged` to close again.
229
- async function read_merged_pr(child: string, read: IssueRead): Promise<string | undefined> {
230
- if (read.kind !== 'state' || run_merge.classify_child(read.state) !== 'failed') return undefined
194
+ const token =
195
+ ctx.over === undefined ? run_merge_driver.DEFERRED_OFFER : await run_merge_steps.ask_next(ctx)
231
196
 
232
- return await issue_closing_pr.read_closing_pr(child)
233
- }
234
-
235
- async function read_signals(ctx: MergeContext, read: IssueRead): Promise<EndingSignals> {
236
- const [is_cut, merged_pr, is_outage] = await Promise.all([
237
- run_merge_steps.has_resumable_cut(ctx.child),
238
- read_merged_pr(ctx.child, read),
239
- read_is_retryable(ctx.child, ctx.output),
240
- ])
241
-
242
- return { is_outage, is_cut, merged_pr }
243
- }
244
-
245
- function outcome_of(read: IssueRead, signals: EndingSignals): ChildOutcome {
246
- return read.kind === 'state' ? run_merge.classify_child(read.state, signals) : 'unresolved'
197
+ return { token, code: SUCCESS_EXIT_CODE, is_offer: true }
247
198
  }
248
199
 
249
200
  // A refused count means this session is not the carry record's owner, so the whole operation is
@@ -256,7 +207,8 @@ function report_count_refused(carry: RunCarry | undefined): MergeVerdict {
256
207
 
257
208
  // A merged child counted and its lane closed, the merge put on the stream and in the ledger. Returns the
258
209
  // carry when the ownership check refused it, `undefined` once recorded. `run:carry --end` records the
259
- // 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).
260
212
  async function record_merged(ctx: MergeContext): Promise<RunCarry | undefined> {
261
213
  const refused = await run_merge_steps.do_merged(ctx)
262
214
 
@@ -285,16 +237,13 @@ async function on_merged(ctx: MergeContext): Promise<MergeVerdict> {
285
237
  return await offered(ctx)
286
238
  }
287
239
 
288
- // A child released to wait on its open blockers: settled for this run like a parked one, so it goes on
289
- // the stream the same way, but nothing was counted — the failure guard is not read, and the next child
290
- // is offered.
291
- async function on_waiting(
292
- ctx: MergeContext,
293
- blockers: ReadonlyArray<string>,
294
- ): 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> {
295
244
  await run_event_stream_emit.emit(
296
245
  run_event_stream.EVENT_KIND.PARK,
297
- `${issue_cite.plain(ctx.child)} waiting on ${blockers.join(', ')}`,
246
+ `${issue_cite.plain(ctx.child)} waiting on ${waits.join(', ')}`,
298
247
  )
299
248
 
300
249
  return await offered(ctx)
@@ -307,9 +256,11 @@ async function on_parked_failure(ctx: MergeContext, result: FailedResult): Promi
307
256
  return emit(MERGE_TOKEN.STOP, FAILURE_EXIT_CODE)
308
257
  }
309
258
 
259
+ const cause = result.cause ?? run_stalled.SESSION_UNFINISHED.short
260
+
310
261
  await run_event_stream_emit.emit(
311
262
  run_event_stream.EVENT_KIND.PARK,
312
- `${issue_cite.plain(ctx.child)} parked (needs-decision)`,
263
+ run_stalled.park_event(ctx.child, cause),
313
264
  )
314
265
 
315
266
  if (result.carry !== undefined && run_merge.is_guard_tripped(result.carry.failures)) {
@@ -319,12 +270,12 @@ async function on_parked_failure(ctx: MergeContext, result: FailedResult): Promi
319
270
  return await offered(ctx)
320
271
  }
321
272
 
322
- async function on_failed(ctx: MergeContext, cause?: string): Promise<MergeVerdict> {
273
+ async function on_failed(ctx: MergeContext, cause?: StallCause): Promise<MergeVerdict> {
323
274
  const result = await run_merge_steps.do_failed(ctx, cause)
324
275
 
325
276
  if (result.is_refused) return report_count_refused(result.carry)
326
277
 
327
- 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)
328
279
 
329
280
  return await on_parked_failure(ctx, result)
330
281
  }
@@ -349,6 +300,14 @@ async function on_outage(ctx: MergeContext): Promise<MergeVerdict> {
349
300
  return await offered(ctx)
350
301
  }
351
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
+
352
311
  // A child that ended its session with a cut no successor adopted: its successor is relaunched,
353
312
  // nothing is counted and nothing is parked, and `resumed` tells the parent to await the same lane
354
313
  // again rather than dispatch into it. A successor that could not be started — or a cut the
@@ -360,7 +319,7 @@ async function on_cut(ctx: MergeContext): Promise<MergeVerdict> {
360
319
  if (refused !== undefined) return report_count_refused(refused)
361
320
 
362
321
  if (!(await run_merge_steps.resume_cut(ctx.child))) {
363
- return await on_failed(ctx, run_merge_steps.CUT_RELAUNCH_CAUSE)
322
+ return await on_failed(ctx, run_stalled.CUT_NOT_RELAUNCHED)
364
323
  }
365
324
 
366
325
  await run_event_stream_emit.emit(
@@ -373,10 +332,10 @@ async function on_cut(ctx: MergeContext): Promise<MergeVerdict> {
373
332
 
374
333
  // A child that parked itself: nothing is counted, but the park is written to the stream as a failed
375
334
  // child's is, so a reader restoring the run from its events sees the child settled. Its `in-progress`
376
- // is dropped as a failed child's is: left on, it would outlive the `needs-decision` a person later
377
- // 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.
378
337
  async function on_parked(ctx: MergeContext): Promise<MergeVerdict> {
379
- await run_label.unmark(ctx.child)
338
+ await run_merge_steps.release_child(ctx.child)
380
339
  await run_event_stream_emit.emit(
381
340
  run_event_stream.EVENT_KIND.PARK,
382
341
  `${issue_cite.plain(ctx.child)} parked`,
@@ -397,6 +356,13 @@ async function on_skipped(ctx: MergeContext): Promise<MergeVerdict> {
397
356
  return await offered(ctx)
398
357
  }
399
358
 
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.
362
+ async function on_withdrawn(ctx: MergeContext): Promise<MergeVerdict> {
363
+ return await offered(ctx)
364
+ }
365
+
400
366
  // The child's own ending: it stopped before its commit for a person to look at, so nothing is counted
401
367
  // and no next child is offered.
402
368
  async function on_human_review(): Promise<MergeVerdict> {
@@ -418,24 +384,29 @@ const HANDLERS: Readonly<Record<ChildOutcome, (ctx: MergeContext) => Promise<Mer
418
384
  'human-review': on_human_review,
419
385
  merged: on_merged,
420
386
  outage: on_outage,
387
+ unauthenticated: on_unauthenticated,
421
388
  parked: on_parked,
422
389
  split: on_skipped,
423
390
  unresolved: on_unresolved,
424
391
  shipping: on_shipping,
392
+ withdrawn: on_withdrawn,
425
393
  }
426
394
 
427
- // The whole merge event for one returned child, in-process: read its state, classify it, and run the
428
- // 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.
429
398
  async function merge_child(ctx: MergeContext): Promise<MergeResult> {
430
399
  if (lane_handoff.is_ship_running(ctx.child, process.cwd())) {
431
400
  return { outcome: 'shipping', ...(await on_shipping()) }
432
401
  }
433
402
 
434
403
  const read = await issue_state_cli.read_issue(ctx.child, ctx.repo)
435
- const signals = await read_signals(ctx, read)
436
- const outcome = outcome_of(read, signals)
404
+ const signals = await run_merge_signals.read_signals(ctx, read)
405
+ const outcome = run_merge_signals.outcome_of(read, signals)
437
406
 
438
- return { outcome, ...(await HANDLERS[outcome]({ ...ctx, merged_pr: signals.merged_pr })) }
407
+ const { merged_pr, is_streak_exempt } = signals
408
+
409
+ return { outcome, ...(await HANDLERS[outcome]({ ...ctx, merged_pr, is_streak_exempt })) }
439
410
  }
440
411
 
441
412
  async function run(argv: ReadonlyArray<string>): Promise<number> {
@@ -449,24 +420,18 @@ async function run(argv: ReadonlyArray<string>): Promise<number> {
449
420
 
450
421
  const result = await merge_child(ctx)
451
422
 
452
- console.info(result.token)
423
+ console.info(run_merge_driver.printed(argv, result))
453
424
 
454
425
  return result.code
455
426
  }
456
427
 
457
- async function main(argv: ReadonlyArray<string>): Promise<void> {
458
- process.exitCode = await run(argv)
459
- }
460
-
461
428
  const run_merge_cli = {
462
429
  merge_child,
463
430
  parse,
464
- read_merged_pr,
431
+ read_merged_pr: run_merge_signals.read_merged_pr,
465
432
  record_merged,
466
433
  run,
467
434
  }
468
435
 
469
- if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
470
-
471
436
  export type { MergeResult }
472
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 }