@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
@@ -4,16 +4,18 @@ import { git_command } from '#scripts/git/git-command'
4
4
  import { main_merge, type MergeOutcome } from '#scripts/git/main-merge'
5
5
  import { josh_command, type JoshResult } from '#scripts/josh/josh-run'
6
6
  import { error_text } from '#scripts/lib/error-message'
7
+ import { run_ship_overlap } from './run-ship-overlap'
7
8
  import { run_ship_scoped } from './run-ship-scoped'
9
+ import type { Cause } from './run-ship-stop-cause'
8
10
 
9
11
  // `josh ship` keeps the branch current with the default branch itself: a default branch that moves
10
12
  // while the pull request opens and CI runs would otherwise stop the followup as `interrupted`, though
11
13
  // merging the default branch again usually resolves it.
12
14
  //
13
15
  // So the merge happens mechanically: once before the commit (`sync_stage`), and once when
14
- // the followup fails on a pull request GitHub reports `DIRTY` (`followup_stage`). Only a merge git
15
- // itself cannot finish stops the ship, and it stops as `conflict`, naming the unmerged paths so the
16
- // resumed session goes straight to them.
16
+ // the followup fails on a pull request GitHub reports `DIRTY` (`followup_stage`). A conflict only on
17
+ // generated files is regenerated by the merge itself (`main-merge-regenerate.ts`); any other conflict
18
+ // stops the ship as `conflict`, naming the unmerged paths so the resumed session goes straight to them.
17
19
 
18
20
  const should_forward_stderr = true
19
21
  const SUCCESS_EXIT_CODE = 0
@@ -28,10 +30,14 @@ const MERGED_PREFIX = 'merged '
28
30
 
29
31
  // A stage's result, plus the paths a stopped merge left unmerged — carried to the stop prompt.
30
32
  // `is_skipped` marks a stage that found nothing to do — a review round with nothing to review, a gate
31
- // that reused a green record — so its few seconds are not timed as a run of it.
33
+ // that reused a green record — so its few seconds are not timed as a run of it. `preconditions` names
34
+ // the kinds of the preconditions a stopped preflight found unmet (`run-ship-preflight.ts`). `cause` is the
35
+ // one a stopped review round tagged its stop with (`run-ship-stop-cause.ts`).
32
36
  interface StepResult extends JoshResult {
33
37
  is_skipped?: boolean
34
38
  conflicts?: ReadonlyArray<string>
39
+ preconditions?: ReadonlyArray<string>
40
+ cause?: Cause
35
41
  }
36
42
 
37
43
  async function josh(argv: ReadonlyArray<string>): Promise<JoshResult> {
@@ -66,12 +72,19 @@ function sync_note(outcome: Exclude<MergeOutcome, { kind: 'conflict' }>): string
66
72
  // touches, and once that work is committed the followup merges again on a clean tree. A merge that changed
67
73
  // the tree is checked by the gate stage that follows, so the commit never carries
68
74
  // an unchecked merge and the gate's record names the merge base the push carries.
69
- async function sync_stage(): Promise<StepResult> {
75
+ //
76
+ // The merge waits first for any lane whose open pull request changes the same paths
77
+ // (`run-ship-overlap.ts`), so it brings that pull request in before the gate rather than meeting it
78
+ // as `DIRTY` after CI.
79
+ async function sync_stage(issue: string): Promise<StepResult> {
80
+ const waited = run_ship_overlap.note(await run_ship_overlap.await_overlap(issue))
70
81
  const outcome = await merge_outcome()
71
82
 
72
- if (outcome.kind === 'conflict') return conflict_result(outcome.files, '')
83
+ if (outcome.kind === 'conflict') return conflict_result(outcome.files, waited)
84
+
85
+ const out = [waited, sync_note(outcome)].filter((line) => line !== '').join('\n')
73
86
 
74
- return { code: SUCCESS_EXIT_CODE, out: sync_note(outcome) }
87
+ return { code: SUCCESS_EXIT_CODE, out }
75
88
  }
76
89
 
77
90
  // Any read that fails answers "not conflicting": the followup failure then stands as it was.
@@ -109,21 +122,53 @@ async function merge_again(title: string, failed: JoshResult): Promise<StepResul
109
122
  return await push_merged(title)
110
123
  }
111
124
 
112
- async function followup_stage(
125
+ // Whether the ship waits on the merge alone, for its stage record (`run_ship_stage.mark_merge_waiting`).
126
+ type WaitMark = (is_merge_waiting: boolean) => void
127
+
128
+ function ignore_wait(): void {
129
+ // A ship with no stage record has no lane place to free.
130
+ }
131
+
132
+ // The wait is marked only while `josh followup` runs: the merge again and its gate run unmarked, so a
133
+ // lane gating here still holds its place (joshuafolkken/kit#4466).
134
+ async function marked_followup(
113
135
  title: string,
114
136
  notify: ReadonlyArray<string>,
115
- retries = 0,
137
+ mark: WaitMark,
138
+ ): Promise<JoshResult> {
139
+ mark(true)
140
+
141
+ try {
142
+ return await josh(['followup', title, ...notify])
143
+ } finally {
144
+ mark(false)
145
+ }
146
+ }
147
+
148
+ async function followup_attempt(
149
+ title: string,
150
+ notify: ReadonlyArray<string>,
151
+ mark: WaitMark,
152
+ retries: number,
116
153
  ): Promise<StepResult> {
117
- const result = await josh(['followup', title, ...notify])
154
+ const result = await marked_followup(title, notify, mark)
118
155
 
119
156
  if (result.code === SUCCESS_EXIT_CODE || retries >= MAX_MERGE_RETRIES) return result
120
157
 
121
158
  const stop = await merge_again(title, result)
122
159
 
123
- return stop ?? (await followup_stage(title, notify, retries + 1))
160
+ return stop ?? (await followup_attempt(title, notify, mark, retries + 1))
161
+ }
162
+
163
+ async function followup_stage(
164
+ title: string,
165
+ notify: ReadonlyArray<string>,
166
+ mark: WaitMark = ignore_wait,
167
+ ): Promise<StepResult> {
168
+ return await followup_attempt(title, notify, mark, 0)
124
169
  }
125
170
 
126
171
  const run_ship_sync = { CONFLICT_NOTE, MAX_MERGE_RETRIES, followup_stage, sync_stage }
127
172
 
128
- export type { StepResult }
173
+ export type { StepResult, WaitMark }
129
174
  export { run_ship_sync }
@@ -10,6 +10,9 @@
10
10
  // composite ends at the failure, and the report names the step that failed so the run reads only it.
11
11
 
12
12
  import { run_section, type Section } from '#scripts/run/run-section'
13
+ import { run_tail } from '#scripts/run/run-tail'
14
+ import type { Cause } from './run-ship-stop-cause'
15
+ import type { StepResult } from './run-ship-sync'
13
16
 
14
17
  const PREFLIGHT_HEADER = '=== preflight ==='
15
18
  const PRE_DETACH_HEADER = '=== pre-detach checks ==='
@@ -26,14 +29,38 @@ const STOPPED_PREFIX = 'stopped at: '
26
29
  const SKIPPED_BODY = 'skipped — already done'
27
30
 
28
31
  type ShipSection = Section & {
32
+ // The stage's standard output alone, the text an infrastructure stop is read on.
33
+ out?: string
29
34
  // The paths a stopped merge left unmerged, handed to the stop prompt.
30
35
  conflicts?: ReadonlyArray<string>
36
+ // The kinds of the preconditions a stopped preflight found unmet, recorded with the stop.
37
+ preconditions?: ReadonlyArray<string>
38
+ // The cause a stopped review round tagged its stop with, recorded with the stop.
39
+ cause?: Cause
40
+ }
41
+
42
+ // A stage's result under its header, carrying the conflicts, the preconditions and the cause only where
43
+ // it has them.
44
+ function section_of(header: string, result: StepResult): ShipSection {
45
+ const { conflicts, preconditions, cause } = result
46
+
47
+ return {
48
+ header,
49
+ body: run_tail.section_body(result.out, result.err, result.code),
50
+ code: result.code,
51
+ out: result.out,
52
+ ...(conflicts !== undefined && { conflicts }),
53
+ ...(preconditions !== undefined && { preconditions }),
54
+ ...(cause !== undefined && { cause }),
55
+ }
31
56
  }
32
57
 
33
58
  // The step that stopped the ship, or `undefined` when every executed step was green. Because the
34
- // composite breaks at the first failure, this is the last section whenever one exists.
59
+ // composite breaks at the first failure, this is the last section whenever one exists. The pre-detach
60
+ // report runs on past a red check and prints the preflight refusal last (joshuafolkken/kit#4478), so
61
+ // the last failed section is the one named.
35
62
  function failed_section(sections: ReadonlyArray<ShipSection>): ShipSection | undefined {
36
- return sections.find((section) => section.code !== run_section.SUCCESS_EXIT_CODE)
63
+ return sections.findLast((section) => section.code !== run_section.SUCCESS_EXIT_CODE)
37
64
  }
38
65
 
39
66
  // The executed steps under their headers, closed with the name of the step that stopped the run so the
@@ -64,6 +91,7 @@ const run_ship = {
64
91
  exit_code: run_section.exit_code_of,
65
92
  failed_section,
66
93
  format_report,
94
+ section_of,
67
95
  }
68
96
 
69
97
  export type { ShipSection }
@@ -1,5 +1,3 @@
1
- #!/usr/bin/env tsx
2
- import { fileURLToPath } from 'node:url'
3
1
  import { backlog_drive_restore } from '#scripts/backlog/backlog-drive-restore'
4
2
  import { issue_merged } from '#scripts/issue/issue-merged'
5
3
  import { run_event_stream_emit } from '#scripts/run/event/run-event-stream-emit'
@@ -49,6 +47,4 @@ async function sweep(): Promise<void> {
49
47
 
50
48
  const run_tidy_cli = { sweep }
51
49
 
52
- if (process.argv[1] === fileURLToPath(import.meta.url)) await sweep()
53
-
54
50
  export { run_tidy_cli }
@@ -3,6 +3,7 @@ import { git_stash } from '#scripts/git/stash/git-stash'
3
3
  import { session_cite } from '#scripts/issue/session-cite'
4
4
  import { lane_close } from '#scripts/lane/lane-close'
5
5
  import { lane_registry, type LaneInfo } from '#scripts/lane/lane-registry'
6
+ import { lane_residents } from '#scripts/lane/lane-residents'
6
7
  import { error_text } from '#scripts/lib/error-message'
7
8
  import { run_hold } from '#scripts/run/hold/run-hold'
8
9
  import { run_tidy, type Outcome, type Verdict } from './run-tidy'
@@ -72,6 +73,8 @@ async function lane_verdict(lane: LaneInfo, hold_path: string): Promise<Verdict>
72
73
  async function close(issue: string, hold_path: string): Promise<Verdict> {
73
74
  const outcome = await lane_close.close_lane(issue)
74
75
 
76
+ lane_residents.report(outcome.residents, session_cite.issue(issue))
77
+
75
78
  if (outcome.kind !== CLOSED_KIND) return run_tidy.keep(INCOMPLETE_REASON)
76
79
 
77
80
  run_hold.release_hold(hold_path)
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env tsx
2
+ import { fileURLToPath } from 'node:url'
3
+ import { run_tidy_cli } from './run-tidy-cli'
4
+
5
+ // The `josh run:tidy` entry, kept apart from `run-tidy-cli.ts` because `run:hold` imports that one: a
6
+ // bundle is one file, so a main guard there would fire for every command that carries it
7
+ // (joshuafolkken/kit#4186). The sweep takes no arguments and never sets an exit code.
8
+ if (process.argv[1] === fileURLToPath(import.meta.url)) await run_tidy_cli.sweep()
@@ -1,25 +1,24 @@
1
- #!/usr/bin/env tsx
2
- import { randomUUID } from 'node:crypto'
3
1
  import { fileURLToPath } from 'node:url'
4
2
  import type { AgentProfile, AgentProvider } from '#scripts/agent/agent-role-profile'
5
3
  import { backlog_budget } from '#scripts/backlog/backlog-budget'
4
+ import { lane_session_broker } from '#scripts/lane/lane-session-broker'
6
5
  import { cli_flags } from '#scripts/lib/cli-flags'
6
+ import { MS_PER_SECOND } from '#scripts/lib/timeouts'
7
7
  import { telegram_notify } from '#scripts/notify/telegram-notify'
8
8
  import { run_carry, type CarryRead } from '#scripts/run/carry/run-carry'
9
- import { run_event_setup } from '#scripts/run/event/run-event-setup'
10
9
  import { run_event_stream } from '#scripts/run/event/run-event-stream'
11
10
  import { run_event_stream_emit } from '#scripts/run/event/run-event-stream-emit'
12
- import { run_headless } from '#scripts/run/run-headless'
13
11
  import { run_stranded_detect, type WatchedRun } from '#scripts/run/run-stranded-detect'
14
12
  import { run_wake, type WakeStopReason, type WakeTidyResult } from './run-wake'
15
13
  import { run_wake_await } from './run-wake-await'
14
+ import { run_wake_code } from './run-wake-code'
16
15
  import { run_wake_describe, type WakeContext } from './run-wake-describe'
17
- import { run_wake_driver } from './run-wake-driver'
18
- import { run_wake_handoff } from './run-wake-handoff'
19
- import { run_wake_loop, type LoopPorts, type LoopStop } from './run-wake-loop'
16
+ import { run_wake_loop, type LoopStop } from './run-wake-loop'
17
+ import { run_wake_ports } from './run-wake-ports'
20
18
  import { run_wake_session, type LaunchResult } from './run-wake-session'
21
19
  import { run_wake_stop } from './run-wake-stop'
22
20
  import { run_wake_supervise } from './run-wake-supervise'
21
+ import { run_wake_takeover, type TakeoverResult } from './run-wake-takeover'
23
22
 
24
23
  // `josh run:wake --start | --list | --stop | --loop` — the supervisor that continues a cut
25
24
  // `backlogrun` or `queue` without a person retyping the keyword. **Which invocations it may continue
@@ -29,24 +28,22 @@ import { run_wake_supervise } from './run-wake-supervise'
29
28
  // The stdout/stderr split is the contract every `run:*` command shares: exactly one verdict token on
30
29
  // stdout on every path, the reason and the advice on stderr, so a loop branches on one token.
31
30
  //
32
- // **`--start` and `--loop` are two halves of one thing.** `--start` spawns this same script detached
31
+ // **`--start` and `--loop` are two halves of one thing.** `--start` spawns the command's entry detached
33
32
  // with `--loop` and returns immediately, which is what leaves the supervisor outside the conversation;
34
33
  // `--loop` is the body, and running it in the foreground is how a person watches what it does.
35
34
 
36
35
  const SUCCESS_EXIT_CODE = 0
37
36
  const FAILURE_EXIT_CODE = 1
38
- const ARGV_OFFSET = 2
39
37
  const ONE_GROUP = 1
40
- const MS_PER_SECOND = 1000
41
- // Whole and positive. A zero interval is a busy loop against the temp directory, not a faster
42
- // supervisor.
43
- const INTERVAL_PATTERN = /^[1-9]\d*$/u
38
+ // The interval is whole and positive (`cli_flags.to_positive`): a zero interval is a busy loop against
39
+ // the temp directory, not a faster supervisor.
44
40
  // **Bounded above as well as below, and for the same reason.** `setTimeout` clamps any delay past
45
41
  // 2^31−1 ms to *one millisecond*, so a number large enough to look like "poll rarely" produces exactly
46
42
  // the busy loop the lower bound exists to prevent. An hour is far past any useful polling interval and
47
43
  // nowhere near the clamp.
48
44
  const MAX_INTERVAL_SECONDS = 3600
49
- const SCRIPT_PATH = fileURLToPath(import.meta.url)
45
+ // The command's entry, not this module: the guard that runs `main` lives in `run-wake-main.ts`.
46
+ const SCRIPT_PATH = fileURLToPath(new URL('run-wake-main.ts', import.meta.url))
50
47
 
51
48
  const STARTED_VERDICT = 'started'
52
49
  const RUNNING_VERDICT = 'running'
@@ -57,13 +54,6 @@ const NONE_VERDICT = 'none'
57
54
  const UNKNOWN_VERDICT = 'unknown'
58
55
  const FAILED_VERDICT = 'failed'
59
56
 
60
- // **The note covers both ways `wake_argv` answers `undefined`**, because it cannot tell them apart and
61
- // a message that named only the first would accuse a legitimate invocation of carrying unsafe text.
62
- // The second is the one a person actually meets: a `queue` whose references carry a `owner/repo#`
63
- // prefix is a grammar this supervisor does not rebuild, and `queue.md` → "The session boundary" is why
64
- // such a queue begins no record in the first place.
65
- const UNSAFE_INVOCATION_NOTE =
66
- 'the carried invocation is not one this supervisor can continue — it is neither a backlogrun nor a queue it can rebuild, or it carries text that may not be passed to a command line'
67
57
  // The command rather than one entry point: the supervisor continues a `queue` as readily as a
68
58
  // `backlogrun`, and a warning that named the wrong one would send the reader looking at a run that is
69
59
  // not the one that stopped.
@@ -82,12 +72,21 @@ const WARNING_RECOVERY = `Check the wake command, then restart with \`pnpm josh
82
72
  const STOP_BODIES: Record<WakeStopReason, string | undefined> = {
83
73
  ended: undefined,
84
74
  stopped: undefined,
75
+ reload: undefined,
85
76
  failed: 'The supervisor could not continue the run and has stopped.',
86
77
  unreadable:
87
78
  'The carry record could not be read, so the supervisor stopped rather than guess at it.',
88
79
  }
89
80
  const NO_PROFILE_NOTE = 'the scheduler profile could not be resolved'
81
+ const RELOAD_FAILED_NOTE =
82
+ "The supervisor's code changed, but the supervisor to replace it did not start"
83
+ const TAKEOVER_NOTES: Record<Exclude<TakeoverResult, 'taken'>, string> = {
84
+ died: 'it exited before it claimed the run',
85
+ unclaimed: 'it did not claim the run in time, so it was stopped',
86
+ }
90
87
  const SUPERSEDED_RESULT: WakeTidyResult = 'superseded'
88
+ const REMOVED_RESULT: WakeTidyResult = 'removed'
89
+ const STOPPED_STOP: LoopStop = { reason: 'stopped', note: undefined }
91
90
  const SUPERSEDED_NOTE =
92
91
  'another supervisor now holds the record, so it was left alone; this loop is the superseded one'
93
92
 
@@ -115,17 +114,15 @@ function usage(): number {
115
114
  return FAILURE_EXIT_CODE
116
115
  }
117
116
 
118
- function note_to_stderr(note: string): void {
119
- console.error(`wake: ${note}`)
120
- }
117
+ const { note_to_stderr } = run_wake_ports
121
118
 
122
119
  function to_interval_ms(value: string | boolean | undefined): number | undefined {
123
120
  if (typeof value !== 'string') return backlog_budget.OFFER_INTERVAL_MS
124
- if (!INTERVAL_PATTERN.test(value)) return undefined
125
-
126
- const seconds = Number(value)
121
+ const seconds = cli_flags.to_positive(value)
127
122
 
128
- return seconds > MAX_INTERVAL_SECONDS ? undefined : seconds * MS_PER_SECOND
123
+ return seconds === undefined || seconds > MAX_INTERVAL_SECONDS
124
+ ? undefined
125
+ : seconds * MS_PER_SECOND
129
126
  }
130
127
 
131
128
  // Exactly one verb, never a guessed order between two.
@@ -154,56 +151,6 @@ function refuse_without_carry(kind: CarryRead['kind']): number {
154
151
  return report(NONE_VERDICT, FAILURE_EXIT_CODE)
155
152
  }
156
153
 
157
- // **A session that started is said on the stream.** The driver's `waiting on judgment` is the moment it
158
- // asked; from here a session is at work on the answer, until the supervisor's next hand-off.
159
- function say_session_running(context: WakeContext): void {
160
- run_event_setup.emit_to(context.event_target, run_event_setup.STAGE.SESSION, new Date())
161
- }
162
-
163
- function wake_session(
164
- context: WakeContext,
165
- invocation: string,
166
- profile: AgentProfile,
167
- session: { id: string; material: string },
168
- ): LaunchResult {
169
- const built = run_wake_session.wake_argv(invocation, profile, context.worktree, session)
170
-
171
- if (built === undefined) return { kind: 'failed', note: UNSAFE_INVOCATION_NOTE }
172
- if (built.kind === 'rejected') return { kind: 'failed', note: built.note }
173
-
174
- // The headless mark is what lets the stop hook hold this session's turn open while its lanes run —
175
- // under `claude -p` a turn-end is the process's end (`run-headless.ts`).
176
- const environment = run_headless.environment()
177
- const target = { cwd: context.worktree, env: environment, log_path: context.log_target }
178
- const result = run_wake_session.launch({ argv: built.argv, ...target, profile }, note_to_stderr)
179
-
180
- if (result.kind === 'launched') say_session_running(context)
181
-
182
- return result
183
- }
184
-
185
- // **A record this supervisor owns itself is not a session at work.** A failed driver leaves the record
186
- // adopted for this process, so reading that owner as live would have every restarted pass wait on
187
- // itself and never drive again.
188
- function ports_for(context: WakeContext, profile: AgentProfile): LoopPorts {
189
- return {
190
- read_carry: () => run_carry.read_carry(context.carry_target),
191
- is_owner_live: (read) => read.kind === 'carried' && run_carry.is_held_by_another(read.carry),
192
- has_work: async () => true,
193
- new_session_id: () => randomUUID(),
194
- hand_off: () => {
195
- run_wake_handoff.hand_off(context.carry_target)
196
- },
197
- drive: async () => await run_wake_driver.drive(context.carry_target),
198
- wake: (invocation, session_id, material) =>
199
- wake_session(context, invocation, profile, { id: session_id, material }),
200
- sleep: async (milliseconds) => {
201
- await new Promise((resolve) => setTimeout(resolve, milliseconds))
202
- },
203
- now: () => new Date(),
204
- }
205
- }
206
-
207
154
  // The log is named in the warning rather than only in `--list`, because the person reading a warning
208
155
  // at three in the morning is the one who needs to know where to look next.
209
156
  function log_hint(context: WakeContext): string {
@@ -256,7 +203,7 @@ async function record_failure(
256
203
  }
257
204
 
258
205
  // **Only a failed wake exits non-zero; `unreadable` warns but exits zero.** The
259
- // verdict-and-exit-code table in `docs/josh-commands-automation.md` is a contract callers branch on,
206
+ // verdict-and-exit-code table in `docs/josh-commands-run.md` → `run:wake` is a contract callers branch on,
260
207
  // and what that one needs is the notification, not a different exit code.
261
208
  function exit_code_of(reason: WakeStopReason): number {
262
209
  return reason === run_wake_loop.FAILED_REASON ? FAILURE_EXIT_CODE : SUCCESS_EXIT_CODE
@@ -317,8 +264,12 @@ function start_for_launch(git_directory: string, provider: AgentProvider): Launc
317
264
  return launch_supervisor(context_of(git_directory), undefined, resolved.profile)
318
265
  }
319
266
 
320
- function spawn_supervisor(context: WakeContext, interval: string | undefined): number {
321
- const result = launch_supervisor(context, interval, run_wake_session.scheduler_profile())
267
+ function spawn_supervisor(
268
+ context: WakeContext,
269
+ interval: string | undefined,
270
+ profile: AgentProfile | undefined,
271
+ ): number {
272
+ const result = launch_supervisor(context, interval, profile)
322
273
 
323
274
  if (result.kind === 'failed') {
324
275
  console.error(`Could not start the supervisor: ${result.note}`)
@@ -346,7 +297,15 @@ function start(context: WakeContext, interval: string | undefined): number {
346
297
  return report(RUNNING_VERDICT)
347
298
  }
348
299
 
349
- return spawn_supervisor(context, interval)
300
+ return spawn_supervisor(context, interval, run_wake_session.scheduler_profile())
301
+ }
302
+
303
+ // The supervisor `josh backlogrun --restart` starts in place of the one it stopped, on that one's
304
+ // profile, so the shell the restart was typed in does not choose it; the shell's where none was running.
305
+ function restart_supervisor(git_directory: string, profile: AgentProfile | undefined): number {
306
+ const chosen = profile ?? run_wake_session.scheduler_profile()
307
+
308
+ return spawn_supervisor(context_of(git_directory), undefined, chosen)
350
309
  }
351
310
 
352
311
  // **The loop removes its record on the way out, and only its own.** A loop that ended after its record
@@ -357,8 +316,78 @@ function start(context: WakeContext, interval: string | undefined): number {
357
316
  // replaced would leave no trace of that anywhere. Which of the two happened is `tidy_own_wake`'s
358
317
  // answer rather than a second read taken here — the branch that decides it belongs beside the record,
359
318
  // where it is tested, not in a CLI that would have to re-derive it.
360
- function tidy_up(target: string): void {
361
- if (run_wake.tidy_own_wake(target) === SUPERSEDED_RESULT) note_to_stderr(SUPERSEDED_NOTE)
319
+ function tidy_up(target: string): WakeTidyResult {
320
+ const tidied = run_wake.tidy_own_wake(target)
321
+
322
+ if (tidied === SUPERSEDED_RESULT) note_to_stderr(SUPERSEDED_NOTE)
323
+
324
+ return tidied
325
+ }
326
+
327
+ // **No reload while a lane's request is being answered**: ending the broker closes every lane's server
328
+ // but waits out the slowest request, a review up to its limit, leaving the run unwatched and the other
329
+ // lanes unserved meanwhile. The check is skipped, not taken, so the moved commit is still read as
330
+ // stale at the first idle pass.
331
+ function code_check(is_stale: () => Promise<boolean>): () => Promise<boolean> {
332
+ return async () => !lane_session_broker.is_answering() && (await is_stale())
333
+ }
334
+
335
+ function reload_failed(note: string): LoopStop {
336
+ return { reason: run_wake_loop.FAILED_REASON, note: `${RELOAD_FAILED_NOTE}: ${note}` }
337
+ }
338
+
339
+ // A record removed by `--stop` or taken over while the loop ended is not this loop's to hand on.
340
+ function as_not_handed_on(stop: LoopStop): LoopStop {
341
+ return stop.reason === run_wake_loop.RELOAD_REASON ? STOPPED_STOP : stop
342
+ }
343
+
344
+ // **The successor starts only once this supervisor's broker has closed and its record is gone**
345
+ // (joshuafolkken/kit#4509): two brokers for one lane overwrite each other's response
346
+ // (`claude-lane-broker.ts`), and a record still held by a live process refuses the successor's claim.
347
+ // The lanes and the carry record are left as `backlogrun --restart` leaves them: untouched, for the
348
+ // successor to adopt. A successor that did not start leaves the run unwatched, so it fails as a warning.
349
+ async function reload(
350
+ context: WakeContext,
351
+ interval_ms: number,
352
+ profile: AgentProfile,
353
+ ): Promise<LoopStop> {
354
+ const interval = String(Math.round(interval_ms / MS_PER_SECOND))
355
+ const result = launch_supervisor(context, interval, profile)
356
+
357
+ if (result.kind === 'failed') return reload_failed(result.note)
358
+
359
+ const ports = run_wake_takeover.ports_of(context.wake_target)
360
+ const takeover = await run_wake_takeover.await_takeover(result.pid, ports)
361
+
362
+ if (takeover !== 'taken') return reload_failed(TAKEOVER_NOTES[takeover])
363
+
364
+ await run_event_stream_emit.emit(
365
+ run_event_stream.EVENT_KIND.NOTE,
366
+ `The supervisor's code changed on main, so process ${String(process.pid)} handed the run to process ${String(result.pid)} on the new code.`,
367
+ )
368
+
369
+ return { reason: run_wake_loop.RELOAD_REASON, note: undefined }
370
+ }
371
+
372
+ async function supervised(
373
+ context: WakeContext,
374
+ interval_ms: number,
375
+ profile: AgentProfile,
376
+ ): Promise<LoopStop> {
377
+ const source = run_wake_code.source_of(context.worktree, SCRIPT_PATH)
378
+ const is_stale = code_check(await run_wake_code.watch(source))
379
+ const ports = run_wake_ports.ports_for(context, profile, is_stale)
380
+ const stop = await run_wake_supervise.supervise({
381
+ context,
382
+ ports,
383
+ interval_ms,
384
+ note: note_to_stderr,
385
+ })
386
+
387
+ if (tidy_up(context.wake_target) !== REMOVED_RESULT) return as_not_handed_on(stop)
388
+ if (stop.reason !== run_wake_loop.RELOAD_REASON) return stop
389
+
390
+ return await reload(context, interval_ms, profile)
362
391
  }
363
392
 
364
393
  // A failed pass is restarted while the carry record is still resumable (`run-wake-restart.ts`), so
@@ -376,15 +405,7 @@ async function loop(context: WakeContext, interval_ms: number): Promise<number>
376
405
  if (claimed.kind === 'running') return report(RUNNING_VERDICT)
377
406
  if (claimed.kind === 'refused') return refuse_without_carry(claimed.carry_kind)
378
407
 
379
- const ports = ports_for(context, claimed.wake.profile ?? profile)
380
- const stop = await run_wake_supervise.supervise({
381
- context,
382
- ports,
383
- interval_ms,
384
- note: note_to_stderr,
385
- })
386
-
387
- tidy_up(context.wake_target)
408
+ const stop = await supervised(context, interval_ms, claimed.wake.profile ?? profile)
388
409
 
389
410
  return await finish(stop, context, claimed.carry.started_at)
390
411
  }
@@ -436,28 +457,26 @@ async function run(argv: ReadonlyArray<string>): Promise<number> {
436
457
  return await dispatch(values, context, interval_ms)
437
458
  }
438
459
 
439
- async function main(argv: ReadonlyArray<string>): Promise<void> {
440
- process.exitCode = await run(argv)
441
- }
442
-
443
460
  const run_wake_cli = {
444
461
  FAILED_VERDICT,
445
462
  NONE_VERDICT,
446
463
  RUNNING_VERDICT,
464
+ SCRIPT_PATH,
447
465
  STALE_VERDICT,
448
466
  STOPPED_VERDICT,
449
467
  SUPERVISING_VERDICT,
450
468
  UNKNOWN_VERDICT,
451
469
  USAGE,
452
470
  finish,
453
- ports_for,
471
+ RELOAD_FAILED_NOTE,
454
472
  record_failure,
473
+ reload,
474
+ restart_supervisor,
455
475
  run,
456
476
  start_for_launch,
457
477
  stop_body,
478
+ supervised,
458
479
  warning_body,
459
480
  }
460
481
 
461
- if (process.argv[1] === SCRIPT_PATH) await main(process.argv.slice(ARGV_OFFSET))
462
-
463
482
  export { run_wake_cli }
@@ -0,0 +1,83 @@
1
+ import { git_command } from '#scripts/git/git-command'
2
+ import { error_text } from '#scripts/lib/error-message'
3
+ import { import_graph } from '#scripts/lint/import-graph'
4
+
5
+ // Whether the supervisor still runs the code on disk (joshuafolkken/kit#4509). A supervisor keeps the
6
+ // code it started with for its whole life, while the lanes' ships run each new main — so a change to
7
+ // what the supervisor serves them, the broker's request format above all, stops every lane that asks.
8
+ //
9
+ // **The code is the entry's import closure, not the tree**: a merge that touched only files the
10
+ // supervisor never imports changes nothing it runs, and restarting on it would only cost a broker gap.
11
+ // The closure is hashed as the lint cache hashes it (`import-graph.ts`).
12
+ //
13
+ // **The closure is re-hashed only once the commit has moved**: hashing it reads every file it reaches,
14
+ // and on most passes nothing has merged since the last one.
15
+
16
+ interface CodeSource {
17
+ // The commit the checkout sits on; `undefined` where it cannot be read.
18
+ head: () => Promise<string | undefined>
19
+ // The hash of the entry's import closure; `undefined` where it cannot be computed.
20
+ closure: () => Promise<string | undefined>
21
+ }
22
+
23
+ interface CodeState {
24
+ head: string | undefined
25
+ loaded: string | undefined
26
+ }
27
+
28
+ // **A hash that cannot be computed is never stale**: a supervisor that cannot tell keeps running, as
29
+ // it did before this check existed, rather than restarting on every pass.
30
+ function is_changed(loaded: string | undefined, current: string | undefined): boolean {
31
+ if (loaded === undefined || current === undefined) return false
32
+
33
+ return loaded !== current
34
+ }
35
+
36
+ async function is_stale(state: CodeState, source: CodeSource): Promise<boolean> {
37
+ const head = await source.head()
38
+ if (head === state.head) return false
39
+
40
+ state.head = head
41
+
42
+ return is_changed(state.loaded, await source.closure())
43
+ }
44
+
45
+ // The baseline is read when the watch starts — at the supervisor's start, as close to the moment its
46
+ // modules were loaded as a reading can be.
47
+ async function watch(source: CodeSource): Promise<() => Promise<boolean>> {
48
+ const state: CodeState = { head: await source.head(), loaded: await source.closure() }
49
+
50
+ return async () => await is_stale(state, source)
51
+ }
52
+
53
+ async function read_head(): Promise<string | undefined> {
54
+ try {
55
+ return await git_command.head_commit()
56
+ } catch (error) {
57
+ error_text.trace_swallowed('run_wake_code.read_head', error)
58
+
59
+ return undefined
60
+ }
61
+ }
62
+
63
+ // A fresh graph each time: one graph caches the content it read, so it would answer the old hash.
64
+ async function read_closure(root: string, entry: string): Promise<string | undefined> {
65
+ try {
66
+ const graph = await import_graph.create(root)
67
+
68
+ return graph?.closure_hash(entry)
69
+ } catch (error) {
70
+ error_text.trace_swallowed('run_wake_code.read_closure', error)
71
+
72
+ return undefined
73
+ }
74
+ }
75
+
76
+ function source_of(root: string, entry: string): CodeSource {
77
+ return { head: read_head, closure: async () => await read_closure(root, entry) }
78
+ }
79
+
80
+ const run_wake_code = { source_of, watch }
81
+
82
+ export type { CodeSource }
83
+ export { run_wake_code }