@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
@@ -0,0 +1,86 @@
1
+ import type { EpicChild } from '#scripts/epic/epic-graph'
2
+ import { issue_cite } from '#scripts/issue/issue-cite'
3
+ import { has_label_name, IN_PROGRESS_LABEL } from '#scripts/issue/issue-labels'
4
+ import { issue_not_before } from '#scripts/issue/issue-not-before'
5
+
6
+ // Why the backlog had nothing to offer while children ran (joshuafolkken/kit#4513): which waiting
7
+ // issues wait on a dependency chain, and which on a declared start condition (a start date or a
8
+ // sample condition, `issue-not-before.ts`), so `lane:stats` splits `offer:watch:blocked` by cause instead of reporting one row.
9
+ //
10
+ // `backlog:next` writes one line per cause on standard error and `backlog:offer` reads them back, the
11
+ // way the `run:solo` notice travels; both sides go through this module so the spelling cannot drift.
12
+ // A child carrying `in-progress` is the running work itself, not a wait it causes, so it is left out.
13
+
14
+ type WaitCause = 'chain' | 'gate'
15
+
16
+ type WaitCauses = Readonly<Record<WaitCause, ReadonlyArray<number>>>
17
+
18
+ const CAUSES: ReadonlyArray<WaitCause> = ['chain', 'gate']
19
+ const MARKS: Readonly<Record<WaitCause, string>> = {
20
+ chain: 'Waiting on a dependency chain:',
21
+ gate: 'Waiting on a start condition:',
22
+ }
23
+ const TAG_SEPARATOR = '+'
24
+ const ISSUE_PATTERN = /#(\d+)/gu
25
+ const CLOSED_STATE = 'CLOSED'
26
+
27
+ // `blocked_by` keeps a relation after its blocker closes, so a candidate the overlap separation moved
28
+ // to `waiting` would read as a chain on the closed relation alone.
29
+ function has_open_blocker(child: EpicChild): boolean {
30
+ return child.blocked_by.some((blocker) => blocker.state !== CLOSED_STATE)
31
+ }
32
+
33
+ function cause_of(child: EpicChild): WaitCause | undefined {
34
+ if (has_label_name(child.labels, IN_PROGRESS_LABEL)) return undefined
35
+ if (!issue_not_before.is_due(child.body)) return 'gate'
36
+
37
+ return has_open_blocker(child) ? 'chain' : undefined
38
+ }
39
+
40
+ function numbers_with(children: ReadonlyArray<EpicChild>, cause: WaitCause): Array<number> {
41
+ return children.filter((child) => cause_of(child) === cause).map((child) => child.number)
42
+ }
43
+
44
+ // This repository's waiting children by cause; a child elsewhere is not work this checkout could start.
45
+ function classify(children: ReadonlyArray<EpicChild>, repo: string): WaitCauses {
46
+ const here = children.filter((child) => child.repo === repo)
47
+
48
+ return { chain: numbers_with(here, 'chain'), gate: numbers_with(here, 'gate') }
49
+ }
50
+
51
+ function cited(numbers: ReadonlyArray<number>): string {
52
+ return numbers.map((number) => issue_cite.plain(number)).join(' ')
53
+ }
54
+
55
+ function lines_of(causes: WaitCauses): ReadonlyArray<string> {
56
+ return CAUSES.filter((cause) => causes[cause].length > 0).map(
57
+ (cause) => `${MARKS[cause]} ${cited(causes[cause])}`,
58
+ )
59
+ }
60
+
61
+ // The numbers on the cause's line; a linkified `[#N](…/issues/N)` still reads as one `#N`.
62
+ function numbers_on(text: string, cause: WaitCause): ReadonlyArray<number> {
63
+ const line = text.split('\n').find((candidate) => candidate.startsWith(MARKS[cause]))
64
+
65
+ return [...(line ?? '').matchAll(ISSUE_PATTERN)].map((match) => Number(match[1]))
66
+ }
67
+
68
+ function parse(text: string): WaitCauses {
69
+ return { chain: numbers_on(text, 'chain'), gate: numbers_on(text, 'gate') }
70
+ }
71
+
72
+ // `chain`, `gate` or `chain+gate` — the held reason's last part — or `undefined` when neither applies.
73
+ function tag_of(causes: WaitCauses): string | undefined {
74
+ const present = CAUSES.filter((cause) => causes[cause].length > 0)
75
+
76
+ return present.length > 0 ? present.join(TAG_SEPARATOR) : undefined
77
+ }
78
+
79
+ function numbers_of(causes: WaitCauses): ReadonlyArray<number> {
80
+ return [...causes.chain, ...causes.gate]
81
+ }
82
+
83
+ const backlog_wait_cause = { classify, lines_of, numbers_of, parse, tag_of }
84
+
85
+ export type { WaitCauses }
86
+ export { backlog_wait_cause }
@@ -6,9 +6,12 @@ import { epic_outside_blocker } from '#scripts/epic/epic-outside-blocker'
6
6
  import { epic_report, type EpicNextResult } from '#scripts/epic/epic-report'
7
7
  import {
8
8
  has_label_name,
9
+ has_parked_label,
9
10
  IN_PROGRESS_LABEL,
10
11
  NEEDS_DECISION_LABEL,
12
+ RUN_STALLED_LABEL,
11
13
  } from '#scripts/issue/issue-labels'
14
+ import { run_stalled } from '#scripts/run/park/run-stalled'
12
15
  import { backlog_plan, type PlanContext } from './backlog-plan'
13
16
  import { backlog_rank, type GateScope } from './backlog-rank'
14
17
 
@@ -32,7 +35,7 @@ const CLOSED = 'CLOSED'
32
35
  const EMPTY_SCOPE: GateScope = { standalone: new Set(), declared: new Map() }
33
36
 
34
37
  const HEADING_ASSUMPTION =
35
- 'Assumes every issue in a wave merges before the next wave starts. Issues a run already has are left out, and only issues of this repository are planned.'
38
+ 'Assumes every issue in a wave merges before the next wave starts. Issues a run already has are left out and count as merged first, and only issues of this repository are planned.'
36
39
  const UNREACHED_HEADING = 'Not reached — each names what it is waiting on:'
37
40
  const PARALLEL_NOTE = '(parallel)'
38
41
  const NEEDS_DECISION_NOTE = `waiting on a person (\`${NEEDS_DECISION_LABEL}\`)`
@@ -45,18 +48,23 @@ const PARALLEL_GAP = ' '.repeat(PARALLEL_GAP_WIDTH)
45
48
  interface WavePlan {
46
49
  waves: ReadonlyArray<ReadonlyArray<EpicChild>>
47
50
  unreached: ReadonlyArray<EpicChild>
51
+ // This repository's running issues, which count as merged before wave 1 and so sit in neither list
52
+ // above; still the run's own, so `run:board` holds their lanes (kit#3969).
53
+ running?: ReadonlyArray<EpicChild>
48
54
  }
49
55
 
56
+ // A park leaves `in-progress` on (`epic-busy.ts`), and a parked issue waits on a person rather than
57
+ // finishing first.
50
58
  function is_running(child: EpicChild): boolean {
51
- return has_label_name(child.labels, IN_PROGRESS_LABEL)
59
+ return has_label_name(child.labels, IN_PROGRESS_LABEL) && !has_parked_label(child.labels)
52
60
  }
53
61
 
54
62
  function as_closed(child: EpicChild, done: ReadonlySet<string>): EpicChild {
55
63
  return done.has(epic_graph.key_of(child)) ? { ...child, state: CLOSED } : child
56
64
  }
57
65
 
58
- // The pool a wave is chosen from. A running issue is left out of it but kept in `running`, so a child
59
- // behind it waits on it rather than being handed to a person.
66
+ // The pool a wave is chosen from. `running` is every issue this run may finish, so a child behind one
67
+ // waits on it rather than being handed to a person.
60
68
  interface WavePool {
61
69
  children: ReadonlyArray<EpicChild>
62
70
  running: ReadonlySet<string>
@@ -67,12 +75,7 @@ interface WavePool {
67
75
  function pool_of(result: EpicNextResult, repo: string, scope: GateScope): WavePool {
68
76
  const all = backlog_rank.everything_in(result)
69
77
 
70
- return {
71
- children: all.filter((child) => !is_running(child)),
72
- running: epic_outside_blocker.running_keys(all),
73
- repo,
74
- scope,
75
- }
78
+ return { children: all, running: epic_outside_blocker.running_keys(all), repo, scope }
76
79
  }
77
80
 
78
81
  function offer(
@@ -107,15 +110,31 @@ function next_wave(pool: WavePool, done: ReadonlySet<string>): ReadonlyArray<Epi
107
110
  )
108
111
  }
109
112
 
113
+ // `backlog:next` offers nothing behind a running issue, so an empty first wave still asks for the
114
+ // issues the running ones release.
115
+ function opening_wave(
116
+ result: EpicNextResult,
117
+ pool: WavePool,
118
+ done: ReadonlySet<string>,
119
+ ): ReadonlyArray<EpicChild> {
120
+ const wave = first_wave(result, pool)
121
+
122
+ return wave.length > 0 ? wave : next_wave(pool, done)
123
+ }
124
+
110
125
  // Each wave is closed before the next is asked for; a wave that offers nothing ends the plan, which
111
126
  // the pool's size bounds because every wave closes at least one child. `scope` names the rows the
112
127
  // offer's cap bounds and the paths each issue declares; left empty, no wave is capped or separated.
113
128
  function build(result: EpicNextResult, repo: string, scope: GateScope = EMPTY_SCOPE): WavePlan {
114
129
  const pool = pool_of(result, repo, scope)
115
- const done = new Set<string>()
130
+ const running = pool.children.filter((child) => child.repo === repo && is_running(child))
131
+ // A running issue finishes first, before any wave: it starts closed, so it is never offered and the
132
+ // issues behind it reach a later wave instead of waiting past the plan. Another repository's is not
133
+ // this run's to finish, and closing it would answer its release from the version already out.
134
+ const done = new Set(running.map((child) => epic_graph.key_of(child)))
116
135
  const waves: Array<ReadonlyArray<EpicChild>> = []
117
136
 
118
- for (let wave = first_wave(result, pool); wave.length > 0; wave = next_wave(pool, done)) {
137
+ for (let wave = opening_wave(result, pool, done); wave.length > 0; wave = next_wave(pool, done)) {
119
138
  waves.push(wave)
120
139
  for (const child of wave) done.add(epic_graph.key_of(child))
121
140
  }
@@ -124,7 +143,12 @@ function build(result: EpicNextResult, repo: string, scope: GateScope = EMPTY_SC
124
143
  .everything_in(result)
125
144
  .filter((child) => child.repo === repo && !done.has(epic_graph.key_of(child)))
126
145
 
127
- return { waves, unreached }
146
+ return { waves, unreached, running }
147
+ }
148
+
149
+ // A stalled issue's note ends on the one next action its park comment names (`run-stalled.ts`).
150
+ function run_stalled_note(child: number): string {
151
+ return `stalled mechanically — ${run_stalled.next_step(child)}`
128
152
  }
129
153
 
130
154
  // The plan's own "waiting on" wording is reused, so an unreached issue names its blocker the way the
@@ -132,6 +156,7 @@ function build(result: EpicNextResult, repo: string, scope: GateScope = EMPTY_SC
132
156
  // as not reached instead.
133
157
  function unreached_note(child: EpicChild, context: PlanContext): string {
134
158
  if (has_label_name(child.labels, NEEDS_DECISION_LABEL)) return NEEDS_DECISION_NOTE
159
+ if (has_label_name(child.labels, RUN_STALLED_LABEL)) return run_stalled_note(child.number)
135
160
  const note = backlog_plan.waiting_note(child, context)
136
161
 
137
162
  return note === backlog_plan.PAST_OFFER_NOTE ? NOT_REACHED_NOTE : note
@@ -174,6 +199,7 @@ const backlog_waves = {
174
199
  HEADING_ASSUMPTION,
175
200
  NEEDS_DECISION_NOTE,
176
201
  PARALLEL_NOTE,
202
+ run_stalled_note,
177
203
  UNREACHED_HEADING,
178
204
  build,
179
205
  format_waves,
@@ -10,11 +10,16 @@ import { run_invocation } from '#scripts/run/run-invocation'
10
10
  // **A bare number is an issue.** A shell reads an unquoted `#3437` as a comment, so `3437` in the named
11
11
  // list is taken as `#3437`; a number after the first flag is that flag's value and is left alone.
12
12
  //
13
- // **`--stop` stands alone.** It stops the run rather than starting one, so beside an issue or any other
14
- // flag it is refused before anything is stopped — a mistyped start must never end a run.
13
+ // **`--stop` and `--restart` stand alone.** Each stops the run rather than starting one, so beside an
14
+ // issue or any other flag it is refused before anything is stopped — a mistyped start must never end a
15
+ // run.
15
16
 
16
17
  const AGENT_FLAG = '--agent'
17
- const STOP_FLAG = '--stop'
18
+ // A map, not an object literal: a token such as `constructor` must not read an inherited property.
19
+ const LONE_FLAGS: ReadonlyMap<string, LoneKind> = new Map([
20
+ ['--stop', 'stop'],
21
+ ['--restart', 'restart'],
22
+ ])
18
23
  const BACKLOG_COMMAND = 'backlogrun'
19
24
  const ISSUE_PREFIX = '#'
20
25
  const FLAG_PREFIX = '-'
@@ -30,8 +35,13 @@ interface BacklogrunArguments {
30
35
  issues: ReadonlyArray<number>
31
36
  }
32
37
 
38
+ type LoneKind = 'stop' | 'restart'
39
+
33
40
  type ArgumentsResult =
34
- { kind: 'args'; args: BacklogrunArguments } | { kind: 'stop' } | { kind: 'refused' }
41
+ | { kind: 'args'; args: BacklogrunArguments }
42
+ | { kind: 'stop' }
43
+ | { kind: 'restart' }
44
+ | { kind: 'refused' }
35
45
 
36
46
  interface AgentSplit {
37
47
  agent: string | undefined
@@ -74,12 +84,14 @@ function parse_start(argv: ReadonlyArray<string>): ArgumentsResult {
74
84
  }
75
85
 
76
86
  function parse(argv: ReadonlyArray<string>): ArgumentsResult {
77
- if (!argv.includes(STOP_FLAG)) return parse_start(argv)
87
+ const lone = argv.map((token) => LONE_FLAGS.get(token)).find((kind) => kind !== undefined)
88
+
89
+ if (lone === undefined) return parse_start(argv)
78
90
 
79
- return { kind: argv.length === 1 ? 'stop' : 'refused' }
91
+ return { kind: argv.length === 1 ? lone : 'refused' }
80
92
  }
81
93
 
82
94
  const backlogrun_args = { parse }
83
95
 
84
- export type { BacklogrunArguments }
96
+ export type { ArgumentsResult, BacklogrunArguments }
85
97
  export { backlogrun_args }
@@ -7,12 +7,14 @@ import { run_board_cli } from '#scripts/run/board/run-board-cli'
7
7
  import { run_carry } from '#scripts/run/carry/run-carry'
8
8
  import type { LaunchResult } from '#scripts/run/detached-launch'
9
9
  import { run_wake_cli } from '#scripts/run/wake/run-wake-cli'
10
- import { backlogrun_args, type BacklogrunArguments } from './backlogrun-args'
10
+ import { backlogrun_args, type ArgumentsResult, type BacklogrunArguments } from './backlogrun-args'
11
11
  import { backlogrun_launch, type LaunchTarget, type StartResult } from './backlogrun-launch'
12
12
  import { backlogrun_replace, type ReplaceVerdict } from './backlogrun-replace'
13
+ import { backlogrun_restart } from './backlogrun-restart'
13
14
  import { backlogrun_stop, type StopReport } from './backlogrun-stop'
14
15
 
15
- // `josh backlogrun` — start a `backlogrun` from the terminal and watch it, or stop it with `--stop`. A
16
+ // `josh backlogrun` — start a `backlogrun` from the terminal and watch it, stop it with `--stop`, or
17
+ // replace its processes with `--restart` while its record is kept (`backlogrun-restart.ts`). A
16
18
  // run already going is never joined by a second one: the board is shown, and any issue named is pointed
17
19
  // at `run:add` rather than added behind the person's back. Otherwise the agent is started in the
18
20
  // background, its output to a log file, and the board takes over the terminal at once. Closing the
@@ -27,7 +29,7 @@ const ARGV_OFFSET = 2
27
29
  const SUCCESS_EXIT_CODE = 0
28
30
  const FAILURE_EXIT_CODE = 1
29
31
  const USAGE =
30
- 'Usage: josh backlogrun [<n>...] [--only] [--max <n>] [--idle <minutes>] [--agent claude|codex] | --stop'
32
+ 'Usage: josh backlogrun [<n>...] [--only] [--max <n>] [--idle <minutes>] [--agent claude|codex] | --stop | --restart'
31
33
 
32
34
  interface BacklogrunPorts {
33
35
  repository_directory: () => Promise<string | undefined>
@@ -36,6 +38,7 @@ interface BacklogrunPorts {
36
38
  start: (args: BacklogrunArguments, target: LaunchTarget) => StartResult
37
39
  start_supervisor: (git_directory: string, provider: AgentProvider) => LaunchResult
38
40
  stop: (git_directory: string) => Promise<StopReport>
41
+ restart: (git_directory: string) => Promise<number>
39
42
  show_board: () => Promise<number>
40
43
  write: (line: string) => void
41
44
  }
@@ -48,6 +51,7 @@ const LIVE_PORTS: BacklogrunPorts = {
48
51
  start: (args, target) => backlogrun_launch.start(args.invocation, args.provider, target),
49
52
  start_supervisor: run_wake_cli.start_for_launch,
50
53
  stop: async (git_directory) => await backlogrun_stop.stop(git_directory),
54
+ restart: async (git_directory) => await backlogrun_restart.restart(git_directory),
51
55
  show_board: async () => await run_board_cli.run([]),
52
56
  write: (line) => process.stdout.write(`${line}\n`),
53
57
  }
@@ -150,6 +154,17 @@ async function stop(git_directory: string, ports: BacklogrunPorts): Promise<numb
150
154
  return backlogrun_stop.is_stopped(report) ? SUCCESS_EXIT_CODE : FAILURE_EXIT_CODE
151
155
  }
152
156
 
157
+ async function dispatch(
158
+ parsed: Exclude<ArgumentsResult, { kind: 'refused' }>,
159
+ git_directory: string,
160
+ ports: BacklogrunPorts,
161
+ ): Promise<number> {
162
+ if (parsed.kind === 'stop') return await stop(git_directory, ports)
163
+ if (parsed.kind === 'restart') return await ports.restart(git_directory)
164
+
165
+ return await begin(parsed.args, git_directory, ports)
166
+ }
167
+
153
168
  function refuse(line: string, ports: BacklogrunPorts): number {
154
169
  ports.write(line)
155
170
 
@@ -167,9 +182,8 @@ async function run(
167
182
  const git_directory = await ports.repository_directory()
168
183
 
169
184
  if (git_directory === undefined) return refuse('backlogrun: not inside a git repository', ports)
170
- if (parsed.kind === 'stop') return await stop(git_directory, ports)
171
185
 
172
- return await begin(parsed.args, git_directory, ports)
186
+ return await dispatch(parsed, git_directory, ports)
173
187
  }
174
188
 
175
189
  const backlogrun_cli = { run }
@@ -180,6 +180,11 @@ function signal_parent(pid: number): void {
180
180
  }
181
181
  }
182
182
 
183
+ // The pid `stop_parent` would stop, read without stopping it.
184
+ function running_parent(git_directory: string): number | undefined {
185
+ return live_launch(git_directory)?.pid
186
+ }
187
+
183
188
  // Stops the parent this launcher started and forgets its launch — the pid stopped, `undefined` where
184
189
  // no launched parent was live. **Only the process the record names, and only while it is still that
185
190
  // process**: a session a person typed `backlogrun` into has no launch record and is never signalled.
@@ -244,6 +249,7 @@ const backlogrun_launch = {
244
249
  chosen_environment,
245
250
  is_running,
246
251
  pending_launch,
252
+ running_parent,
247
253
  start,
248
254
  started_for,
249
255
  stop_parent,
@@ -0,0 +1,97 @@
1
+ import type { AgentProfile } from '#scripts/agent/agent-role-profile'
2
+ import { run_board_cli } from '#scripts/run/board/run-board-cli'
3
+ import { run_carry, type CarryRead } from '#scripts/run/carry/run-carry'
4
+ import { run_carry_ended, type EndedRun } from '#scripts/run/carry/run-carry-ended'
5
+ import { run_wake } from '#scripts/run/wake/run-wake'
6
+ import { run_wake_cli } from '#scripts/run/wake/run-wake-cli'
7
+ import { backlogrun_stop, type StopReport } from './backlogrun-stop'
8
+
9
+ // `josh backlogrun --restart` — the run's processes replaced, its record kept. The supervisor, the
10
+ // parent and a headless session are stopped as `--stop` stops them, the record is left standing, and a
11
+ // supervisor started on the stopped one's profile adopts it: the budget, the counters and the named list
12
+ // carry over, and the plan made at the start is not made again.
13
+ //
14
+ // **Only a run with a record is restarted.** No record is nothing to restart; a record `--end` closed
15
+ // is a run that is over, and the line names the invocation that starts it again rather than reviving it.
16
+ // A run owned by a session this command may not signal is refused as `--stop` refuses it.
17
+ //
18
+ // **No parent session is started.** The driver (`backlog:drive`) does the routine work, and the
19
+ // supervisor wakes a session only where a decision is needed.
20
+
21
+ const PREFIX = 'backlogrun:'
22
+ const ISSUE_PREFIX_PATTERN = /^#/u
23
+ const SUCCESS_EXIT_CODE = 0
24
+ const FAILURE_EXIT_CODE = 1
25
+
26
+ interface RestartPorts {
27
+ read_carry: (git_directory: string) => CarryRead
28
+ read_ended: (git_directory: string) => EndedRun | undefined
29
+ read_profile: (git_directory: string) => AgentProfile | undefined
30
+ stop: (git_directory: string) => Promise<StopReport>
31
+ start_supervisor: (git_directory: string, profile: AgentProfile | undefined) => number
32
+ show_board: () => Promise<number>
33
+ write: (line: string) => void
34
+ }
35
+
36
+ const LIVE_PORTS: RestartPorts = {
37
+ read_carry: (git_directory) => run_carry.read_carry(run_carry.carry_path(git_directory)),
38
+ read_ended: (git_directory) =>
39
+ run_carry_ended.read_ended(run_carry_ended.ended_path(git_directory)),
40
+ read_profile: (git_directory) => run_wake.read_wake(run_wake.wake_path(git_directory))?.profile,
41
+ stop: async (git_directory) => await backlogrun_stop.stop_keeping_record(git_directory),
42
+ start_supervisor: run_wake_cli.restart_supervisor,
43
+ show_board: async () => await run_board_cli.run([]),
44
+ write: (line) => process.stdout.write(`${line}\n`),
45
+ }
46
+
47
+ // The shell reads an unquoted `#N` as a comment, so the named list is written as bare numbers, which
48
+ // `josh backlogrun` reads back as issues.
49
+ function typed_invocation(invocation: string): string {
50
+ const tokens = invocation.split(' ').map((token) => token.replace(ISSUE_PREFIX_PATTERN, ''))
51
+
52
+ return `pnpm josh ${tokens.join(' ')}`
53
+ }
54
+
55
+ // Why nothing is restarted where the record is not carried.
56
+ function refusal_of(read: CarryRead, ended: EndedRun | undefined): string {
57
+ if (read.kind === 'unreadable') return `${PREFIX} the run's record could not be read`
58
+ if (ended === undefined) return `${PREFIX} nothing to restart`
59
+
60
+ return `${PREFIX} the run has ended; start it again with \`${typed_invocation(ended.invocation)}\``
61
+ }
62
+
63
+ function refuse(line: string, ports: RestartPorts): number {
64
+ ports.write(line)
65
+
66
+ return FAILURE_EXIT_CODE
67
+ }
68
+
69
+ // The supervisor's profile is read before it is stopped, since stopping it removes the record that
70
+ // holds it; the new one runs on the same provider whatever shell the restart was typed in.
71
+ async function replace(git_directory: string, ports: RestartPorts): Promise<number> {
72
+ const profile = ports.read_profile(git_directory)
73
+ const report = await ports.stop(git_directory)
74
+
75
+ for (const line of backlogrun_stop.lines_of(report)) ports.write(line)
76
+
77
+ if (!backlogrun_stop.is_stopped(report)) return FAILURE_EXIT_CODE
78
+
79
+ if (ports.start_supervisor(git_directory, profile) !== SUCCESS_EXIT_CODE) {
80
+ return refuse(`${PREFIX} could not start the supervisor`, ports)
81
+ }
82
+
83
+ return await ports.show_board()
84
+ }
85
+
86
+ async function restart(git_directory: string, ports: RestartPorts = LIVE_PORTS): Promise<number> {
87
+ const read = ports.read_carry(git_directory)
88
+
89
+ if (read.kind === 'carried') return await replace(git_directory, ports)
90
+
91
+ return refuse(refusal_of(read, ports.read_ended(git_directory)), ports)
92
+ }
93
+
94
+ const backlogrun_restart = { restart }
95
+
96
+ export type { RestartPorts }
97
+ export { backlogrun_restart }
@@ -22,12 +22,27 @@ import { backlogrun_launch } from './backlogrun-launch'
22
22
  // after a `run:wake --stop` or a supervisor that gave up, and the session it woke outlives both.
23
23
  //
24
24
  // **Lanes are counted, never stopped**: a child killed mid-change leaves a tree nobody can resume.
25
+ // `josh lane:pause --all` is the way to suspend them without discarding anything.
26
+ //
27
+ // **`--restart` stops the same processes and keeps the record** (`stop_keeping_record`), so the run's
28
+ // budget, counters and named list carry over to the supervisor started after it.
25
29
 
26
30
  const STOPPED_REASON = 'stopped by a person with `josh backlogrun --stop`'
27
31
  const PREFIX = 'backlogrun:'
28
32
  const ISSUE_PREFIX = '#'
29
33
 
30
- type RecordOutcome = { kind: 'none' } | { kind: 'ended' } | { kind: 'held'; owner: number }
34
+ type RecordOutcome =
35
+ { kind: 'none' } | { kind: 'ended' } | { kind: 'kept' } | { kind: 'held'; owner: number }
36
+
37
+ // What stopping the processes left: the pids stopped, the record as it stood, and the live owner this
38
+ // command may not signal.
39
+ interface StoppedProcesses {
40
+ supervisor: number | undefined
41
+ parent: number | undefined
42
+ session: number | undefined
43
+ read: CarryRead
44
+ holder: number | undefined
45
+ }
31
46
 
32
47
  interface StopReport {
33
48
  // The pids stopped, `undefined` where there was nothing to stop.
@@ -41,6 +56,8 @@ interface StopReport {
41
56
  }
42
57
 
43
58
  interface StopPorts {
59
+ running_supervisor: (git_directory: string) => number | undefined
60
+ running_parent: (git_directory: string) => number | undefined
44
61
  stop_supervisor: (git_directory: string) => number | undefined
45
62
  stop_parent: (git_directory: string) => number | undefined
46
63
  stop_session: (pid: number) => void
@@ -59,6 +76,8 @@ async function open_lanes(): Promise<Array<string>> {
59
76
 
60
77
  // A person who typed the stop is at the terminal, so the ⏸️ confirmation a stop pushes is not sent.
61
78
  const LIVE_PORTS: StopPorts = {
79
+ running_supervisor: (git_directory) => run_wake.read_wake(run_wake.wake_path(git_directory))?.pid,
80
+ running_parent: backlogrun_launch.running_parent,
62
81
  stop_supervisor: (git_directory) => run_wake_stop.stop(run_wake.wake_path(git_directory))?.pid,
63
82
  stop_parent: backlogrun_launch.stop_parent,
64
83
  stop_session: run_wake_stop.signal,
@@ -120,17 +139,67 @@ async function close_record(
120
139
  return { kind: 'ended' }
121
140
  }
122
141
 
123
- async function stop(git_directory: string, ports: StopPorts = LIVE_PORTS): Promise<StopReport> {
142
+ function stop_processes(git_directory: string, ports: StopPorts): StoppedProcesses {
124
143
  const supervisor = ports.stop_supervisor(git_directory)
125
144
  const parent = ports.stop_parent(git_directory)
126
145
  const read = ports.read_carry(git_directory)
127
146
  const owner = standing_owner(read, [supervisor, parent], ports)
128
147
  const session = stop_headless(owner, read, ports)
129
148
  const holder = session === undefined ? owner : undefined
130
- const record = await close_record(git_directory, read, holder, ports)
131
- const lanes = await ports.lanes()
132
149
 
133
- return { supervisor, parent, session, record, lanes }
150
+ return { supervisor, parent, session, read, holder }
151
+ }
152
+
153
+ function kept_record(read: CarryRead, holder: number | undefined): RecordOutcome {
154
+ if (read.kind === 'none') return { kind: 'none' }
155
+
156
+ return holder === undefined ? { kind: 'kept' } : { kind: 'held', owner: holder }
157
+ }
158
+
159
+ const NOTHING_STOPPED = { supervisor: undefined, parent: undefined, session: undefined }
160
+
161
+ // The live owner `--restart` may not signal, read before anything is stopped: a refusal found after the
162
+ // supervisor and the parent were stopped would leave the run with neither.
163
+ function foreign_owner(git_directory: string, ports: StopPorts): number | undefined {
164
+ const read = ports.read_carry(git_directory)
165
+
166
+ if (is_headless_owner(read)) return undefined
167
+
168
+ const running = [ports.running_supervisor(git_directory), ports.running_parent(git_directory)]
169
+
170
+ return standing_owner(read, running, ports)
171
+ }
172
+
173
+ async function report_of(
174
+ stopped: Pick<StoppedProcesses, 'supervisor' | 'parent' | 'session'>,
175
+ record: RecordOutcome,
176
+ ports: StopPorts,
177
+ ): Promise<StopReport> {
178
+ const { supervisor, parent, session } = stopped
179
+
180
+ return { supervisor, parent, session, record, lanes: await ports.lanes() }
181
+ }
182
+
183
+ async function stop(git_directory: string, ports: StopPorts = LIVE_PORTS): Promise<StopReport> {
184
+ const stopped = stop_processes(git_directory, ports)
185
+ const record = await close_record(git_directory, stopped.read, stopped.holder, ports)
186
+
187
+ return await report_of(stopped, record, ports)
188
+ }
189
+
190
+ async function stop_keeping_record(
191
+ git_directory: string,
192
+ ports: StopPorts = LIVE_PORTS,
193
+ ): Promise<StopReport> {
194
+ const holder = foreign_owner(git_directory, ports)
195
+
196
+ if (holder !== undefined) {
197
+ return await report_of(NOTHING_STOPPED, { kind: 'held', owner: holder }, ports)
198
+ }
199
+
200
+ const stopped = stop_processes(git_directory, ports)
201
+
202
+ return await report_of(stopped, kept_record(stopped.read, stopped.holder), ports)
134
203
  }
135
204
 
136
205
  function process_line(what: string, pid: number | undefined): Array<string> {
@@ -140,6 +209,7 @@ function process_line(what: string, pid: number | undefined): Array<string> {
140
209
  function record_lines(outcome: RecordOutcome): Array<string> {
141
210
  if (outcome.kind === 'none') return []
142
211
  if (outcome.kind === 'ended') return [`${PREFIX} ended the run's record`]
212
+ if (outcome.kind === 'kept') return [`${PREFIX} kept the run's record`]
143
213
 
144
214
  return [
145
215
  `${PREFIX} process ${String(outcome.owner)} owns the run and was not started by \`josh backlogrun\`; its record is kept — end the run from that session`,
@@ -151,7 +221,9 @@ function lane_lines(lanes: ReadonlyArray<string>): Array<string> {
151
221
 
152
222
  const issues = lanes.map((issue) => `${ISSUE_PREFIX}${issue}`).join(' ')
153
223
 
154
- return [`${PREFIX} ${String(lanes.length)} lane(s) still running, not stopped: ${issues}`]
224
+ return [
225
+ `${PREFIX} ${String(lanes.length)} lane(s) still running, not stopped: ${issues} — suspend them in place with \`josh lane:pause --all\``,
226
+ ]
155
227
  }
156
228
 
157
229
  // What a person reads back: one line per thing done, or the one line that says nothing was running.
@@ -172,7 +244,7 @@ function is_stopped(report: StopReport): boolean {
172
244
  return report.record.kind !== 'held'
173
245
  }
174
246
 
175
- const backlogrun_stop = { is_stopped, lines_of, stop }
247
+ const backlogrun_stop = { is_stopped, lines_of, stop, stop_keeping_record }
176
248
 
177
249
  export type { StopPorts, StopReport }
178
250
  export { backlogrun_stop }
@@ -13,8 +13,8 @@ import { behavior_rules } from './behavior-rules'
13
13
  // **The scope is the current run, not the whole corpus.** The store holds thousands of transcripts
14
14
  // and over a gigabyte; walking all of it every gate would cost minutes, not the seconds the other
15
15
  // checks take. Each gate checks its own run, so across runs the whole corpus is covered a run at a
16
- // time — and the engine stays general, so a broad scan of past runs (the greenness check this seed
17
- // assertion was verified with) is the same walk over a different set of files.
16
+ // time — and the engine stays general, so a broad scan of past runs (the greenness check each
17
+ // assertion is verified with) is the same walk over a different set of files.
18
18
 
19
19
  const PASS_EXIT_CODE = 0
20
20
  const FAIL_EXIT_CODE = 1