@joshuafolkken/kit 1.1514.0 → 1.1784.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (858) hide show
  1. package/.claude/agents/investigator.md +1 -1
  2. package/.claude/settings.json +5 -5
  3. package/.claude/skills/epic-commands/SKILL.md +26 -65
  4. package/.claude/skills/epic-commands/epic-bundle.md +3 -1
  5. package/.claude/skills/workflow-commands/SKILL.md +5 -5
  6. package/.claude/skills/workflow-commands/background-commands.md +5 -5
  7. package/.claude/skills/workflow-commands/backlogrun-child.md +10 -8
  8. package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +7 -25
  9. package/.claude/skills/workflow-commands/backlogrun-lanes.md +17 -13
  10. package/.claude/skills/workflow-commands/backlogrun-park.md +14 -23
  11. package/.claude/skills/workflow-commands/backlogrun-progress.md +2 -2
  12. package/.claude/skills/workflow-commands/backlogrun-recovery.md +5 -5
  13. package/.claude/skills/workflow-commands/backlogrun-steps.md +10 -10
  14. package/.claude/skills/workflow-commands/backlogrun.md +1 -1
  15. package/.claude/skills/workflow-commands/chain-rule.md +13 -7
  16. package/.claude/skills/workflow-commands/delegation.md +6 -5
  17. package/.claude/skills/workflow-commands/entry-sequence.md +9 -9
  18. package/.claude/skills/workflow-commands/followup.md +9 -31
  19. package/.claude/skills/workflow-commands/fullrun-steps.md +36 -45
  20. package/.claude/skills/workflow-commands/fullrun.md +2 -2
  21. package/.claude/skills/workflow-commands/halfrun.md +17 -25
  22. package/.claude/skills/workflow-commands/issue-comments.md +16 -12
  23. package/.claude/skills/workflow-commands/issue-scout.md +2 -2
  24. package/.claude/skills/workflow-commands/kickoff.md +24 -23
  25. package/.claude/skills/workflow-commands/latest-gate.md +7 -12
  26. package/.claude/skills/workflow-commands/needs-human-review.md +9 -14
  27. package/.claude/skills/workflow-commands/observation-filing.md +4 -36
  28. package/.claude/skills/workflow-commands/observation-ledger.md +1 -1
  29. package/.claude/skills/workflow-commands/pre-gate-cut.md +13 -30
  30. package/.claude/skills/workflow-commands/prerequisite.md +10 -16
  31. package/.claude/skills/workflow-commands/progress-watcher.md +1 -1
  32. package/.claude/skills/workflow-commands/prrun.md +3 -7
  33. package/.claude/skills/workflow-commands/retrospective.md +1 -1
  34. package/.claude/skills/workflow-commands/split-assessment.md +13 -1
  35. package/.claude/skills/workflow-commands/working-tree-hold.md +9 -9
  36. package/.codex/hooks.json +5 -5
  37. package/.github/actions/setup-node/action.yml +9 -0
  38. package/.github/actions/setup-pnpm/action.yml +1 -1
  39. package/.github/dependabot.yml +16 -0
  40. package/.github/release.yml +0 -2
  41. package/.github/workflows/ci.yml +120 -10
  42. package/.github/workflows/publish.yml +8 -1
  43. package/.github/workflows/sonar-qube.yml +1 -0
  44. package/.prettierignore +2 -0
  45. package/.vscode/tasks.json +1 -2
  46. package/CLAUDE.md +3 -7
  47. package/README.md +4 -2
  48. package/SECURITY.md +1 -1
  49. package/dist/CLAUDE.md +3 -7
  50. package/dist/commands/document-read-cli.js +882 -0
  51. package/dist/commands/{document-section-cli.js → document-section-main.js} +79 -37
  52. package/dist/commands/read-set-cli.js +1867 -0
  53. package/dist/commands/run-prep-main.js +21653 -0
  54. package/dist/commands/run-step-cli.js +23880 -0
  55. package/dist/config-merge/index.js +5 -1
  56. package/dist/hooks/audit-provision.js +20 -35
  57. package/dist/hooks/{chunk-DGT54IH5.js → chunk-AZX4FGQ3.js} +63 -17
  58. package/dist/hooks/chunk-CWMBGKYW.js +6483 -0
  59. package/dist/hooks/chunk-O2YBIDSI.js +4306 -0
  60. package/dist/hooks/{chunk-TNUMY6NL.js → chunk-PT5R6UJD.js} +4193 -1900
  61. package/dist/hooks/chunk-TUIFS5E7.js +72 -0
  62. package/dist/hooks/{chunk-723HKZO5.js → chunk-VWWCFGWK.js} +1 -1
  63. package/dist/hooks/{chunk-APUO6U4J.js → chunk-WR2KQAYZ.js} +1843 -440
  64. package/dist/hooks/{chunk-O6GDRNJB.js → chunk-XGBNSWEI.js} +248 -46
  65. package/dist/hooks/chunk-YCDOIR3I.js +3456 -0
  66. package/dist/hooks/codex-hook-adapter.js +10 -22
  67. package/dist/hooks/format-edited.js +5 -6
  68. package/dist/hooks/inputs.json +443 -317
  69. package/dist/hooks/pretool-guard.js +7 -25
  70. package/dist/hooks/session-lang.js +44 -51
  71. package/dist/hooks/stop-guard.js +7716 -2187
  72. package/dist/josh.js +6002 -3583
  73. package/dist/self-sync-guard/index.js +74 -10
  74. package/dist/version/index.js +115 -406
  75. package/eslint/base.js +1 -1
  76. package/lefthook/base.yml +3 -1
  77. package/package.json +10 -48
  78. package/pnpm-workspace.yaml +4 -2
  79. package/prompts/coding-standards.md +1 -1
  80. package/prompts/collaboration-workflow/file-edits.md +1 -7
  81. package/prompts/collaboration-workflow/issue-citation.md +1 -1
  82. package/prompts/collaboration-workflow/issue-template.md +33 -16
  83. package/prompts/collaboration-workflow/lane-instructions.md +1 -2
  84. package/prompts/collaboration-workflow/measurement.md +37 -0
  85. package/prompts/collaboration-workflow/operating-rules.md +4 -6
  86. package/prompts/collaboration-workflow/output-bounds.md +2 -7
  87. package/prompts/collaboration-workflow/plan-comment.md +3 -42
  88. package/prompts/collaboration-workflow/principles.md +5 -0
  89. package/prompts/collaboration-workflow/report-format.md +31 -60
  90. package/prompts/collaboration-workflow/residency.md +2 -2
  91. package/prompts/collaboration-workflow/shell-body.md +6 -16
  92. package/prompts/collaboration-workflow/turn-batching.md +0 -2
  93. package/prompts/collaboration-workflow/upstream-interrupt.md +14 -4
  94. package/prompts/collaboration-workflow/wip-cap.md +1 -1
  95. package/prompts/collaboration-workflow.md +3 -7
  96. package/prompts/refactoring.md +1 -1
  97. package/prompts/review-rubric.md +1 -2
  98. package/prompts/review.md +41 -21
  99. package/prompts/testing-guide.md +8 -43
  100. package/scripts/agent/agent-event.ts +15 -15
  101. package/scripts/agent/agent-exit-record.ts +13 -1
  102. package/scripts/agent/api-auth.ts +41 -0
  103. package/scripts/agent/api-outage.ts +1 -1
  104. package/scripts/auto-ok/auto-ok-cli.ts +14 -16
  105. package/scripts/auto-ok/auto-ok-judge-read.ts +12 -3
  106. package/scripts/auto-ok/auto-ok-judge-write.ts +46 -19
  107. package/scripts/auto-ok/auto-ok-judge.ts +13 -2
  108. package/scripts/auto-ok/auto-ok-main.ts +17 -0
  109. package/scripts/backlog/backlog-arrival.ts +14 -3
  110. package/scripts/backlog/backlog-budget-cli.ts +7 -33
  111. package/scripts/backlog/backlog-budget-main.ts +16 -0
  112. package/scripts/backlog/backlog-budget.ts +2 -3
  113. package/scripts/backlog/backlog-defect-priority.ts +4 -3
  114. package/scripts/backlog/backlog-drive-adopt.ts +67 -0
  115. package/scripts/backlog/backlog-drive-args.ts +4 -5
  116. package/scripts/backlog/backlog-drive-cli.ts +113 -28
  117. package/scripts/backlog/backlog-drive-hold.ts +162 -0
  118. package/scripts/backlog/backlog-drive-idle.ts +151 -0
  119. package/scripts/backlog/backlog-drive-judge.ts +25 -0
  120. package/scripts/backlog/backlog-drive-memory.ts +126 -0
  121. package/scripts/backlog/backlog-drive-named-offer.ts +5 -10
  122. package/scripts/backlog/backlog-drive-named.ts +53 -6
  123. package/scripts/backlog/backlog-drive-offer-argv.ts +3 -8
  124. package/scripts/backlog/backlog-drive-paused.ts +169 -0
  125. package/scripts/backlog/backlog-drive-restore.ts +30 -7
  126. package/scripts/backlog/backlog-drive-seats.ts +18 -8
  127. package/scripts/backlog/backlog-drive-token-handling.ts +38 -0
  128. package/scripts/backlog/backlog-drive.ts +79 -75
  129. package/scripts/backlog/backlog-next-main.ts +16 -0
  130. package/scripts/backlog/backlog-next-shared.ts +73 -0
  131. package/scripts/backlog/backlog-next.ts +48 -16
  132. package/scripts/backlog/backlog-occupied.ts +52 -39
  133. package/scripts/backlog/backlog-offer-cli.ts +6 -21
  134. package/scripts/backlog/backlog-offer-exclude.ts +15 -0
  135. package/scripts/backlog/backlog-offer-main.ts +12 -0
  136. package/scripts/backlog/backlog-offer.ts +36 -3
  137. package/scripts/backlog/backlog-overlap.ts +22 -4
  138. package/scripts/backlog/backlog-plan-read.ts +6 -2
  139. package/scripts/backlog/backlog-plan.ts +18 -4
  140. package/scripts/backlog/backlog-pool.ts +10 -10
  141. package/scripts/backlog/backlog-rank.ts +10 -2
  142. package/scripts/backlog/backlog-ready.ts +112 -30
  143. package/scripts/backlog/backlog-stalled-detect.ts +109 -36
  144. package/scripts/backlog/backlog-stalled.ts +52 -16
  145. package/scripts/backlog/backlog-wait-cause.ts +86 -0
  146. package/scripts/backlog/backlog-waves.ts +39 -13
  147. package/scripts/backlog/backlogrun-args.ts +19 -7
  148. package/scripts/backlog/backlogrun-cli.ts +19 -5
  149. package/scripts/backlog/backlogrun-launch.ts +6 -0
  150. package/scripts/backlog/backlogrun-restart.ts +97 -0
  151. package/scripts/backlog/backlogrun-stop.ts +79 -7
  152. package/scripts/behavior/behavior-cli.ts +2 -2
  153. package/scripts/behavior/behavior-rules.ts +47 -24
  154. package/scripts/build/build-bin.ts +2 -16
  155. package/scripts/build/build-claude-md.ts +0 -7
  156. package/scripts/build/build-commands.ts +0 -13
  157. package/scripts/build/build-hooks.ts +49 -48
  158. package/scripts/build/hook-bundle-stamp.ts +29 -11
  159. package/scripts/build/local-bin.ts +1 -1
  160. package/scripts/cases/cases-cli.ts +25 -13
  161. package/scripts/cases/cases-interaction-scan.ts +134 -0
  162. package/scripts/cases/cases-interaction.ts +183 -0
  163. package/scripts/cases/cases-logic.ts +39 -6
  164. package/scripts/ci/pr-classification-main.ts +18 -0
  165. package/scripts/ci/pr-classification.ts +10 -17
  166. package/scripts/clone/clone-scan.ts +1 -1
  167. package/scripts/cost-runtime/cost-blocks.ts +22 -37
  168. package/scripts/cost-runtime/cost-cli.ts +31 -14
  169. package/scripts/cost-runtime/cost-main.ts +12 -0
  170. package/scripts/cost-runtime/cost-transcript.ts +1 -0
  171. package/scripts/delegation/delegation-policy.ts +17 -4
  172. package/scripts/delegation/duplicate-read-guard.ts +0 -8
  173. package/scripts/delegation/investigation-guard.ts +0 -8
  174. package/scripts/delegation/investigation-reads.ts +3 -4
  175. package/scripts/dependabot/dependabot-cooldown.ts +194 -0
  176. package/scripts/discovery/repo-discovery.ts +24 -6
  177. package/scripts/doctor/doctor-consumer.ts +2 -5
  178. package/scripts/document/document-byte-budget.ts +8 -6
  179. package/scripts/document/document-scan.ts +1 -1
  180. package/scripts/document/document-section-cli.ts +0 -8
  181. package/scripts/document/document-section-main.ts +12 -0
  182. package/scripts/epic/epic-audit-cli.ts +12 -6
  183. package/scripts/epic/epic-bundle-apply.ts +137 -0
  184. package/scripts/epic/epic-bundle-cli.ts +32 -121
  185. package/scripts/epic/epic-bundle-format.ts +116 -0
  186. package/scripts/epic/epic-bundle-main.ts +17 -0
  187. package/scripts/epic/epic-busy.ts +5 -12
  188. package/scripts/epic/epic-classify.ts +24 -15
  189. package/scripts/epic/epic-cli-argv.ts +31 -0
  190. package/scripts/epic/epic-cli-decide.ts +42 -0
  191. package/scripts/epic/epic-cli.ts +6 -38
  192. package/scripts/epic/epic-close.ts +112 -55
  193. package/scripts/epic/epic-cross-repo.ts +4 -7
  194. package/scripts/epic/epic-decide.ts +119 -0
  195. package/scripts/epic/epic-decision.ts +9 -0
  196. package/scripts/epic/epic-fetch.ts +4 -0
  197. package/scripts/epic/epic-graph.ts +2 -0
  198. package/scripts/epic/epic-issue.ts +5 -1
  199. package/scripts/epic/epic-label-age.ts +1 -1
  200. package/scripts/epic/epic-lane-offer.ts +39 -4
  201. package/scripts/epic/epic-next-main.ts +24 -0
  202. package/scripts/epic/epic-next.ts +6 -24
  203. package/scripts/epic/epic-outside-blocker.ts +6 -2
  204. package/scripts/epic/epic-parse.ts +9 -3
  205. package/scripts/epic/epic-read.ts +1 -0
  206. package/scripts/epic/epic-reconcile.ts +39 -0
  207. package/scripts/epic/epic-run.ts +10 -1
  208. package/scripts/epic/epic-solo.ts +50 -14
  209. package/scripts/epic/epic.ts +41 -7
  210. package/scripts/exports/unused-members-cli.ts +2 -2
  211. package/scripts/followup/followup-checks-event.ts +8 -3
  212. package/scripts/followup/followup-coderabbit-wait.ts +82 -0
  213. package/scripts/followup/followup-review-gates.ts +81 -0
  214. package/scripts/followup/git-followup-stages.ts +13 -3
  215. package/scripts/followup/git-followup-workflow.ts +19 -66
  216. package/scripts/followup/git-pr-followup-wrapup.ts +9 -14
  217. package/scripts/followup/git-pr-followup.ts +36 -8
  218. package/scripts/fresh-machine/fresh-machine-cli.ts +1 -1
  219. package/scripts/fresh-machine/fresh-machine-run.ts +8 -8
  220. package/scripts/fresh-machine/specs/kit-test-backlogrun.json +1 -1
  221. package/scripts/gate/busy-average.ts +58 -0
  222. package/scripts/gate/check-cpu.ts +60 -0
  223. package/scripts/gate/check-inputs.ts +39 -95
  224. package/scripts/gate/check-reuse.ts +33 -54
  225. package/scripts/gate/command-memory.ts +192 -0
  226. package/scripts/gate/core-admission.ts +218 -28
  227. package/scripts/gate/core-budget-timing.ts +37 -0
  228. package/scripts/gate/core-budget.ts +80 -98
  229. package/scripts/gate/core-wait-record.ts +48 -0
  230. package/scripts/gate/core-wait.ts +37 -5
  231. package/scripts/gate/core-weights.ts +86 -0
  232. package/scripts/gate/free-cores.ts +27 -4
  233. package/scripts/gate/gate-ledger.ts +32 -4
  234. package/scripts/gate/gate-plan.ts +41 -34
  235. package/scripts/gate/gate-report.ts +14 -2
  236. package/scripts/gate/gate-run-steps.ts +53 -8
  237. package/scripts/gate/gate-skip.ts +12 -2
  238. package/scripts/gate/gate-steps.ts +12 -1
  239. package/scripts/gate/input-fingerprint.ts +42 -0
  240. package/scripts/gate/machine-capacity.ts +65 -31
  241. package/scripts/gate/moved-paths.ts +67 -0
  242. package/scripts/gate/project-checks.ts +5 -12
  243. package/scripts/gate/scoped-green.ts +12 -8
  244. package/scripts/gate/since-green.ts +62 -0
  245. package/scripts/gate/toolchain-inputs.ts +115 -0
  246. package/scripts/gate/verification-gate.ts +27 -24
  247. package/scripts/gate/verification-inputs.ts +250 -0
  248. package/scripts/gh/gh-author-association.ts +96 -9
  249. package/scripts/gh/git-ai-review-scan.ts +4 -2
  250. package/scripts/gh/git-gh-api-path.ts +15 -0
  251. package/scripts/gh/git-gh-branch-rules.ts +73 -0
  252. package/scripts/gh/git-gh-conditional.ts +5 -2
  253. package/scripts/gh/git-gh-issue-read.ts +5 -1
  254. package/scripts/gh/git-gh-issue-write.ts +67 -29
  255. package/scripts/gh/git-gh-issue.ts +7 -3
  256. package/scripts/gh/git-gh-poll-read.ts +89 -0
  257. package/scripts/gh/git-gh-pr-auto-merge.ts +8 -3
  258. package/scripts/gh/git-gh-pr-rest.ts +1 -1
  259. package/scripts/gh/git-gh-pr-snapshot.ts +33 -20
  260. package/scripts/gh/git-gh-pr.ts +27 -15
  261. package/scripts/gh/git-pr-checks-eval.ts +39 -7
  262. package/scripts/gh/git-pr-checks-parse.ts +39 -9
  263. package/scripts/gh/git-pr-merge-checked.ts +80 -0
  264. package/scripts/git/base-tree.ts +19 -2
  265. package/scripts/git/changed-file-scope.ts +6 -4
  266. package/scripts/git/changed-paths.ts +18 -1
  267. package/scripts/git/git-diff-reads.ts +27 -2
  268. package/scripts/git/git-grep-hits.ts +85 -0
  269. package/scripts/git/git-location-environment.ts +1 -1
  270. package/scripts/git/git-merge-conflicts.ts +83 -0
  271. package/scripts/git/git-preflight.ts +37 -12
  272. package/scripts/git/git-push-transport.ts +1 -2
  273. package/scripts/git/git-schemas.ts +17 -7
  274. package/scripts/git/git-spawn.ts +1 -2
  275. package/scripts/git/git-status.ts +4 -4
  276. package/scripts/git/main-merge-main.ts +12 -0
  277. package/scripts/git/main-merge-regenerate.ts +2 -2
  278. package/scripts/git/main-merge.ts +25 -9
  279. package/scripts/git/main-sync-main.ts +12 -0
  280. package/scripts/git/main-sync.ts +0 -9
  281. package/scripts/git/stash/git-stash.ts +27 -4
  282. package/scripts/git/stash/{stash-pop-args.ts → stash-args.ts} +13 -10
  283. package/scripts/git/stash/stash-pop-cli.ts +6 -12
  284. package/scripts/git/stash/stash-pop-main.ts +12 -0
  285. package/scripts/git/stash/stash-push-cli.ts +76 -0
  286. package/scripts/git/stash/stash-push-main.ts +12 -0
  287. package/scripts/hooks/batch-guard.ts +0 -8
  288. package/scripts/hooks/check-commit-message-main.ts +8 -0
  289. package/scripts/hooks/check-commit-message.ts +4 -7
  290. package/scripts/hooks/format-edited-file.ts +8 -24
  291. package/scripts/hooks/pre-commit-lint.ts +30 -3
  292. package/scripts/hooks/pre-push-unit.ts +4 -2
  293. package/scripts/hooks/pretool-guard-cli.ts +1 -8
  294. package/scripts/hooks/pretool-guard.ts +32 -19
  295. package/scripts/hooks/reserved-run.ts +67 -9
  296. package/scripts/hooks/run-hook.sh +13 -4
  297. package/scripts/hooks/shell-rules-notice.ts +37 -0
  298. package/scripts/hooks/stop-actions.ts +2 -21
  299. package/scripts/hooks/stop-guard.ts +13 -9
  300. package/scripts/init/hook-command-rewrite.ts +19 -5
  301. package/scripts/init/hook-launch.ts +15 -17
  302. package/scripts/init/init-actions.ts +0 -6
  303. package/scripts/init/init-ai-copy.ts +10 -36
  304. package/scripts/init/init-bootstrap.ts +9 -8
  305. package/scripts/init/init-dry-run-report.ts +1 -1
  306. package/scripts/init/init-dry-run.ts +1 -1
  307. package/scripts/init/init-file-action.ts +7 -9
  308. package/scripts/init/init-logic-json-merge.ts +2 -2
  309. package/scripts/init/init-logic-migrate.ts +9 -82
  310. package/scripts/init/init-logic.ts +3 -2
  311. package/scripts/init/init-main.ts +12 -0
  312. package/scripts/init/init.ts +5 -12
  313. package/scripts/init/kit-development-versions.ts +3 -7
  314. package/scripts/init/kit-written-paths.ts +2 -2
  315. package/scripts/init/project-profile.ts +5 -4
  316. package/scripts/init/tsconfig-preset-migration.ts +2 -1
  317. package/scripts/init/vscode-tasks.ts +1 -1
  318. package/scripts/issue/defect-origin-cli.ts +106 -0
  319. package/scripts/issue/defect-origin-line.ts +60 -0
  320. package/scripts/issue/defect-origin-main.ts +11 -0
  321. package/scripts/issue/defect-origin.ts +114 -0
  322. package/scripts/issue/defect-rate-cli.ts +34 -78
  323. package/scripts/issue/defect-rate.ts +0 -16
  324. package/scripts/issue/defect-report-cli.ts +128 -0
  325. package/scripts/issue/defect-report-format.ts +56 -0
  326. package/scripts/issue/defect-report-main.ts +11 -0
  327. package/scripts/issue/defect-report.ts +160 -0
  328. package/scripts/issue/expected-effect-lint.ts +1 -0
  329. package/scripts/issue/issue-already-done-cli.ts +62 -0
  330. package/scripts/issue/issue-body-or-comment.ts +40 -0
  331. package/scripts/issue/issue-cite-cli.ts +0 -9
  332. package/scripts/issue/issue-cite-main.ts +12 -0
  333. package/scripts/issue/issue-classification.ts +12 -7
  334. package/scripts/issue/issue-comment-cli.ts +10 -24
  335. package/scripts/issue/issue-comment-main.ts +12 -0
  336. package/scripts/issue/issue-evidence-exit.ts +100 -0
  337. package/scripts/issue/issue-file-cli.ts +29 -7
  338. package/scripts/issue/issue-file.ts +19 -19
  339. package/scripts/issue/issue-fold-cli.ts +2 -11
  340. package/scripts/issue/issue-fold-main.ts +12 -0
  341. package/scripts/issue/issue-labels.ts +81 -90
  342. package/scripts/issue/issue-lint-cli.ts +2 -10
  343. package/scripts/issue/issue-lint-main.ts +12 -0
  344. package/scripts/issue/issue-measured-cli.ts +56 -0
  345. package/scripts/issue/issue-merged.ts +19 -2
  346. package/scripts/issue/issue-not-before-label.ts +135 -0
  347. package/scripts/issue/issue-not-before.ts +111 -0
  348. package/scripts/issue/issue-number-shape.ts +15 -1
  349. package/scripts/issue/issue-park.ts +28 -0
  350. package/scripts/issue/issue-plan-cli.ts +151 -0
  351. package/scripts/issue/issue-priority.ts +151 -0
  352. package/scripts/issue/issue-rank.ts +7 -1
  353. package/scripts/issue/issue-read-cli.ts +3 -10
  354. package/scripts/issue/issue-read-main.ts +12 -0
  355. package/scripts/issue/issue-read.ts +29 -5
  356. package/scripts/issue/issue-release-cli.ts +0 -10
  357. package/scripts/issue/issue-release-main.ts +13 -0
  358. package/scripts/issue/issue-release.ts +7 -12
  359. package/scripts/issue/issue-sample-gate.ts +192 -0
  360. package/scripts/issue/issue-sample-source.ts +76 -0
  361. package/scripts/issue/issue-scout-cli.ts +0 -11
  362. package/scripts/issue/issue-scout-main.ts +14 -0
  363. package/scripts/issue/issue-state-cli.ts +0 -10
  364. package/scripts/issue/issue-state-main.ts +12 -0
  365. package/scripts/issue/issue-watch-diff.ts +56 -15
  366. package/scripts/issue/issue-watch.ts +2 -1
  367. package/scripts/issue/issue-wip.ts +2 -7
  368. package/scripts/issue/measure-rerun-cli.ts +13 -8
  369. package/scripts/issue/plan-consumers-cli.ts +39 -0
  370. package/scripts/issue/plan-consumers-main.ts +11 -0
  371. package/scripts/issue/plan-consumers-section.ts +55 -0
  372. package/scripts/issue/plan-consumers.ts +127 -0
  373. package/scripts/josh/agent-session-environment.ts +1 -1
  374. package/scripts/josh/command-usage.ts +15 -43
  375. package/scripts/josh/file-map-stamp.ts +49 -16
  376. package/scripts/josh/hook-decision.ts +32 -20
  377. package/scripts/josh/josh-command-map.ts +4 -1
  378. package/scripts/josh/josh-command-types.ts +12 -6
  379. package/scripts/josh/josh-commands-agent-hooks.ts +83 -0
  380. package/scripts/josh/josh-commands-ai.ts +157 -158
  381. package/scripts/josh/josh-commands-backlog.ts +82 -16
  382. package/scripts/josh/josh-commands-clone.ts +1 -0
  383. package/scripts/josh/josh-commands-development.ts +111 -71
  384. package/scripts/josh/josh-commands-document.ts +43 -1
  385. package/scripts/josh/josh-commands-epic.ts +171 -0
  386. package/scripts/josh/josh-commands-hooks.ts +25 -2
  387. package/scripts/josh/josh-commands-issue-write.ts +181 -0
  388. package/scripts/josh/josh-commands-issue.ts +124 -24
  389. package/scripts/josh/josh-commands-lane.ts +103 -2
  390. package/scripts/josh/josh-commands-lint.ts +19 -8
  391. package/scripts/josh/josh-commands-maintenance.ts +112 -4
  392. package/scripts/josh/josh-commands-pause.ts +29 -0
  393. package/scripts/josh/josh-commands-progress.ts +87 -0
  394. package/scripts/josh/josh-commands-project.ts +138 -9
  395. package/scripts/josh/josh-commands-review.ts +124 -0
  396. package/scripts/josh/josh-commands-run.ts +211 -23
  397. package/scripts/josh/josh-commands-ship.ts +169 -0
  398. package/scripts/josh/josh-commands-split.ts +9 -0
  399. package/scripts/josh/josh-commands-versioning.ts +49 -2
  400. package/scripts/josh/josh-commands-workflow.ts +144 -6
  401. package/scripts/josh/josh-logic.ts +6 -13
  402. package/scripts/josh/package-directory.ts +2 -4
  403. package/scripts/josh/process-identity.ts +13 -4
  404. package/scripts/josh/session-language-cli.ts +4 -8
  405. package/scripts/josh/session-language-main.ts +13 -0
  406. package/scripts/josh/session-language.ts +6 -1
  407. package/scripts/josh/shared-cache.ts +90 -0
  408. package/scripts/josh/stamp-file.ts +9 -15
  409. package/scripts/lane/lane-await.ts +51 -12
  410. package/scripts/lane/lane-cache.ts +5 -30
  411. package/scripts/lane/lane-capacity.ts +14 -23
  412. package/scripts/lane/lane-check-stats.ts +62 -21
  413. package/scripts/lane/lane-child-invocation.ts +8 -0
  414. package/scripts/lane/lane-cli.ts +15 -5
  415. package/scripts/lane/lane-close.ts +86 -18
  416. package/scripts/lane/lane-core-wait-stats.ts +66 -0
  417. package/scripts/lane/lane-dispatch.ts +24 -3
  418. package/scripts/lane/lane-gap-stats.ts +156 -0
  419. package/scripts/lane/lane-handoff.ts +69 -1
  420. package/scripts/lane/lane-held-stats.ts +129 -0
  421. package/scripts/lane/lane-install.ts +4 -11
  422. package/scripts/lane/lane-launch-cli.ts +0 -9
  423. package/scripts/lane/lane-launch-main.ts +12 -0
  424. package/scripts/lane/lane-ledger-schema.ts +266 -0
  425. package/scripts/lane/lane-ledger.ts +92 -123
  426. package/scripts/lane/lane-limit-cli.ts +12 -1
  427. package/scripts/lane/lane-measure-cli.ts +57 -11
  428. package/scripts/lane/lane-open.ts +9 -1
  429. package/scripts/lane/lane-parked.ts +3 -3
  430. package/scripts/lane/lane-pause-cli.ts +130 -0
  431. package/scripts/lane/lane-pause.ts +158 -0
  432. package/scripts/lane/lane-process-table.ts +166 -0
  433. package/scripts/lane/lane-reap-settle.ts +124 -0
  434. package/scripts/lane/lane-reap.ts +50 -15
  435. package/scripts/lane/lane-registry.ts +24 -3
  436. package/scripts/lane/lane-residents.ts +162 -0
  437. package/scripts/lane/lane-restart.ts +22 -2
  438. package/scripts/lane/lane-round-two-stats.ts +49 -0
  439. package/scripts/lane/lane-sampler.ts +4 -0
  440. package/scripts/lane/lane-session-action.ts +19 -5
  441. package/scripts/lane/lane-session-broker.ts +102 -21
  442. package/scripts/lane/lane-snapshot-trace.ts +84 -0
  443. package/scripts/lane/lane-spans.ts +51 -0
  444. package/scripts/lane/lane-spent.ts +6 -3
  445. package/scripts/lane/lane-stage-stats.ts +7 -2
  446. package/scripts/lane/lane-state.ts +302 -0
  447. package/scripts/lane/lane-stats.ts +58 -4
  448. package/scripts/lane/lane-stop-stats.ts +113 -37
  449. package/scripts/lane/lane-test-related-stats.ts +127 -0
  450. package/scripts/lane/lane-transcript-calls.ts +145 -0
  451. package/scripts/lane/lane-transcript-stats.ts +168 -0
  452. package/scripts/lane/lane-vacant.ts +13 -3
  453. package/scripts/lane/lane-withdraw-cli.ts +5 -4
  454. package/scripts/lane/lane-withdraw.ts +50 -49
  455. package/scripts/lane/process-directories.ts +70 -0
  456. package/scripts/lane/process-lane-marks.ts +94 -0
  457. package/scripts/lib/atomic-write.ts +62 -0
  458. package/scripts/lib/buffered-process.ts +12 -5
  459. package/scripts/lib/cli-flags.ts +53 -0
  460. package/scripts/lib/figure-format.ts +63 -0
  461. package/scripts/lib/json-value.ts +9 -1
  462. package/scripts/lib/package-manifest.ts +35 -0
  463. package/scripts/lib/read-file.ts +3 -1
  464. package/scripts/lib/stamped-memo.ts +63 -0
  465. package/scripts/lib/stdout-on-stderr.ts +24 -0
  466. package/scripts/lib/timeouts.ts +9 -0
  467. package/scripts/lib/transcript-record.ts +91 -0
  468. package/scripts/lines/effective-limit.ts +1 -1
  469. package/scripts/lint/eslint-cache-dependencies.ts +145 -0
  470. package/scripts/lint/eslint-daemon.ts +265 -0
  471. package/scripts/lint/format.ts +11 -2
  472. package/scripts/lint/import-graph.ts +279 -0
  473. package/scripts/lint/lint-gate-scope.ts +102 -0
  474. package/scripts/lint/lint-parallel-main.ts +19 -0
  475. package/scripts/lint/lint-parallel.ts +62 -30
  476. package/scripts/lint/lint-related-scope.ts +30 -24
  477. package/scripts/lint/lint-related.ts +38 -6
  478. package/scripts/notify/confirmation-options.ts +1 -2
  479. package/scripts/notify/telegram-notify.ts +20 -20
  480. package/scripts/notify/telegram-test-logic.ts +0 -1
  481. package/scripts/notify/telegram-test-main.ts +8 -0
  482. package/scripts/notify/telegram-test.ts +2 -6
  483. package/scripts/observations/observation-ledger.ts +13 -0
  484. package/scripts/observations/observations-flush-landing.ts +5 -3
  485. package/scripts/observations/observations-flush.ts +6 -1
  486. package/scripts/overrides/overrides-check.ts +2 -5
  487. package/scripts/overrides/overrides-files.ts +2 -1
  488. package/scripts/overrides/overrides-logic.ts +3 -6
  489. package/scripts/package/verify-optional-eslint-install.ts +8 -6
  490. package/scripts/propagate/propagate-publish.ts +2 -7
  491. package/scripts/propagate/propagate-targets.ts +4 -12
  492. package/scripts/refactor/import-graph.ts +9 -7
  493. package/scripts/release/github-release-runs.ts +17 -6
  494. package/scripts/release/release-approval-prune.ts +18 -0
  495. package/scripts/release/release-history.ts +1 -3
  496. package/scripts/release/release-progress.ts +42 -22
  497. package/scripts/release/release-publish-run.ts +39 -0
  498. package/scripts/release/release-publish.ts +6 -6
  499. package/scripts/release/release-scope-cli.ts +0 -10
  500. package/scripts/release/release-scope-main.ts +12 -0
  501. package/scripts/repo/repo-setting.ts +3 -6
  502. package/scripts/repo/required-checks-logic.ts +6 -15
  503. package/scripts/report/report-format-reference.ts +2 -0
  504. package/scripts/report/report-labels.ts +155 -0
  505. package/scripts/report/report-lint-cli.ts +3 -0
  506. package/scripts/report/report-lint.ts +85 -110
  507. package/scripts/report/report-template-cli.ts +59 -0
  508. package/scripts/report/report-template.ts +112 -0
  509. package/scripts/review/acceptance-map.ts +1 -0
  510. package/scripts/review/removed-tests-check.ts +86 -0
  511. package/scripts/review/removed-tests.ts +149 -0
  512. package/scripts/review/review-brief-cli.ts +81 -15
  513. package/scripts/review/review-brief-main.ts +12 -0
  514. package/scripts/review/review-brief.ts +31 -3
  515. package/scripts/review/review-code-tree.ts +10 -6
  516. package/scripts/review/review-comment-round.ts +26 -8
  517. package/scripts/review/review-finding-ledger.ts +30 -15
  518. package/scripts/review/review-interaction.ts +94 -0
  519. package/scripts/review/review-readers-scan.ts +163 -0
  520. package/scripts/review/review-record-cli.ts +69 -30
  521. package/scripts/review/review-record-main.ts +12 -0
  522. package/scripts/review/review-round-one-blobs.ts +221 -0
  523. package/scripts/review/review-round2-cli.ts +49 -12
  524. package/scripts/review/review-round2.ts +80 -12
  525. package/scripts/review/review-stamps.ts +19 -1
  526. package/scripts/review/review-stop-log.ts +96 -0
  527. package/scripts/review/review-stops-cli.ts +85 -0
  528. package/scripts/review/review-tree.ts +6 -17
  529. package/scripts/review/review-untouched-readers.ts +146 -0
  530. package/scripts/review/test-titles.ts +118 -0
  531. package/scripts/rules/agent-model.ts +8 -0
  532. package/scripts/rules/bash-triggers.ts +46 -3
  533. package/scripts/rules/decision-oracle-batch.ts +9 -1
  534. package/scripts/rules/decision-oracle.ts +2 -2
  535. package/scripts/rules/delivered-rules.ts +80 -2
  536. package/scripts/rules/destructive-command.ts +8 -1
  537. package/scripts/rules/direct-filing.ts +10 -2
  538. package/scripts/rules/direct-issue-comment.ts +117 -0
  539. package/scripts/rules/direct-pr-create.ts +69 -3
  540. package/scripts/rules/early-heartbeat.ts +2 -1
  541. package/scripts/rules/file-body.ts +7 -0
  542. package/scripts/rules/filing-cap.ts +7 -0
  543. package/scripts/rules/git-argv.ts +72 -14
  544. package/scripts/rules/git-force.ts +12 -2
  545. package/scripts/rules/guard-remedy.ts +4 -0
  546. package/scripts/rules/implementation-cut-verdict.ts +1 -1
  547. package/scripts/rules/implementation-cut.ts +11 -3
  548. package/scripts/rules/index-guard.ts +8 -1
  549. package/scripts/rules/issue-comments.ts +9 -1
  550. package/scripts/rules/josh-git-bare.ts +7 -0
  551. package/scripts/rules/lane-background.ts +67 -25
  552. package/scripts/rules/lane-carry-conflict.ts +6 -0
  553. package/scripts/rules/lane-direct-tool.ts +74 -0
  554. package/scripts/rules/lane-interactive-ask.ts +9 -2
  555. package/scripts/rules/lane-park.ts +45 -23
  556. package/scripts/rules/lane-split-park.ts +10 -2
  557. package/scripts/rules/lane-switch-main.ts +7 -0
  558. package/scripts/rules/oracle-consulted.ts +10 -0
  559. package/scripts/rules/oracle-firing.ts +1 -0
  560. package/scripts/rules/permission-guards.ts +3 -0
  561. package/scripts/rules/piped-verification.ts +1 -1
  562. package/scripts/rules/poll-loop.ts +7 -0
  563. package/scripts/rules/pr-merge.ts +123 -0
  564. package/scripts/rules/protected-files.ts +32 -5
  565. package/scripts/rules/raw-field-body.ts +6 -0
  566. package/scripts/rules/rule-body-guard.ts +8 -0
  567. package/scripts/rules/rule-list.ts +9 -28
  568. package/scripts/rules/rule-value-cache.ts +4 -9
  569. package/scripts/rules/rule-value-cli.ts +51 -32
  570. package/scripts/rules/rule-value.ts +1 -1
  571. package/scripts/rules/shell-segments.ts +35 -0
  572. package/scripts/rules/stop-rule-rows.ts +64 -0
  573. package/scripts/rules/stop-rules.ts +3 -4
  574. package/scripts/rules/test-declared-commit.ts +11 -1
  575. package/scripts/rules/third-party-write.ts +7 -0
  576. package/scripts/rules/timed-rerun.ts +69 -0
  577. package/scripts/rules/worktree-guard.ts +13 -3
  578. package/scripts/run/board/run-board-app-name.ts +23 -0
  579. package/scripts/run/board/run-board-cli.ts +65 -32
  580. package/scripts/run/board/run-board-earlier.ts +94 -0
  581. package/scripts/run/board/run-board-ending-reason.ts +67 -0
  582. package/scripts/run/board/run-board-estimate-schedule.ts +103 -0
  583. package/scripts/run/board/run-board-estimate.ts +98 -0
  584. package/scripts/run/board/run-board-fit.ts +153 -36
  585. package/scripts/run/board/run-board-fold.ts +123 -0
  586. package/scripts/run/board/run-board-fresh.ts +2 -2
  587. package/scripts/run/board/run-board-gather-live.ts +29 -0
  588. package/scripts/run/board/run-board-gather-thread.ts +189 -0
  589. package/scripts/run/board/run-board-gather-worker.ts +29 -0
  590. package/scripts/run/board/run-board-gather.ts +187 -0
  591. package/scripts/run/board/run-board-github.ts +118 -38
  592. package/scripts/run/board/run-board-header.ts +82 -20
  593. package/scripts/run/board/run-board-keys.ts +58 -0
  594. package/scripts/run/board/run-board-kind.ts +20 -6
  595. package/scripts/run/board/run-board-labels.ts +116 -71
  596. package/scripts/run/board/run-board-lane-state.ts +109 -0
  597. package/scripts/run/board/run-board-lane-time.ts +122 -0
  598. package/scripts/run/board/run-board-layout.ts +239 -60
  599. package/scripts/run/board/run-board-length.ts +52 -0
  600. package/scripts/run/board/run-board-machine.ts +8 -4
  601. package/scripts/run/board/run-board-main.ts +12 -0
  602. package/scripts/run/board/run-board-notes.ts +52 -31
  603. package/scripts/run/board/run-board-now.ts +1 -1
  604. package/scripts/run/board/run-board-operation.ts +15 -33
  605. package/scripts/run/board/run-board-phase.ts +1 -1
  606. package/scripts/run/board/run-board-plan-shared.ts +115 -0
  607. package/scripts/run/board/run-board-plan.ts +55 -3
  608. package/scripts/run/board/run-board-planning.ts +45 -0
  609. package/scripts/run/board/run-board-priority.ts +44 -0
  610. package/scripts/run/board/run-board-process-groups.ts +195 -0
  611. package/scripts/run/board/run-board-read.ts +151 -27
  612. package/scripts/run/board/run-board-reason.ts +235 -51
  613. package/scripts/run/board/run-board-released.ts +35 -0
  614. package/scripts/run/board/run-board-render-checks.ts +39 -5
  615. package/scripts/run/board/run-board-render-condition.ts +96 -0
  616. package/scripts/run/board/run-board-render-drawn.ts +67 -0
  617. package/scripts/run/board/run-board-render-foot.ts +59 -0
  618. package/scripts/run/board/run-board-render-icon.ts +35 -0
  619. package/scripts/run/board/run-board-render-lanes.ts +145 -0
  620. package/scripts/run/board/run-board-render-lead.ts +80 -0
  621. package/scripts/run/board/run-board-render-legend.ts +117 -48
  622. package/scripts/run/board/run-board-render-notes.ts +156 -29
  623. package/scripts/run/board/run-board-render-processes.ts +196 -0
  624. package/scripts/run/board/run-board-render-section.ts +119 -0
  625. package/scripts/run/board/run-board-render-slot.ts +3 -36
  626. package/scripts/run/board/run-board-render-tail.ts +115 -48
  627. package/scripts/run/board/run-board-render-time.ts +56 -0
  628. package/scripts/run/board/run-board-render-title.ts +117 -24
  629. package/scripts/run/board/run-board-render-waits.ts +104 -20
  630. package/scripts/run/board/run-board-render.ts +207 -265
  631. package/scripts/run/board/run-board-roots.ts +54 -0
  632. package/scripts/run/board/run-board-row-yield.ts +9 -4
  633. package/scripts/run/board/run-board-setup.ts +1 -12
  634. package/scripts/run/board/run-board-snapshot.ts +111 -0
  635. package/scripts/run/board/run-board-spin.ts +2 -2
  636. package/scripts/run/board/run-board-state.ts +22 -33
  637. package/scripts/run/board/run-board-status.ts +147 -71
  638. package/scripts/run/board/run-board-thanks-read.ts +2 -2
  639. package/scripts/run/board/run-board-tick.ts +122 -107
  640. package/scripts/run/board/run-board-usage-board.ts +78 -0
  641. package/scripts/run/board/run-board-usage-lanes.ts +113 -0
  642. package/scripts/run/board/run-board-usage-listing.ts +93 -0
  643. package/scripts/run/board/run-board-usage-read.ts +120 -150
  644. package/scripts/run/board/run-board-usage-rusage.ts +19 -7
  645. package/scripts/run/board/run-board-usage-text.ts +139 -51
  646. package/scripts/run/board/run-board-usage-top.ts +102 -0
  647. package/scripts/run/board/run-board-usage.ts +89 -72
  648. package/scripts/run/board/run-board-usual.ts +20 -9
  649. package/scripts/run/carry/run-carry-args.ts +4 -7
  650. package/scripts/run/carry/run-carry-conversation.ts +1 -1
  651. package/scripts/run/carry/run-carry.ts +9 -4
  652. package/scripts/run/cut/run-cut-handoff.ts +2 -2
  653. package/scripts/run/event/run-event-cli.ts +1 -5
  654. package/scripts/run/event/run-event-filed.ts +12 -6
  655. package/scripts/run/event/run-event-follow.ts +2 -3
  656. package/scripts/run/event/run-event-render.ts +6 -10
  657. package/scripts/run/event/run-event-scope.ts +2 -2
  658. package/scripts/run/event/run-event-stream-emit.ts +82 -22
  659. package/scripts/run/event/run-event-stream.ts +34 -8
  660. package/scripts/run/hold/run-hold-adopt.ts +65 -0
  661. package/scripts/run/hold/run-hold-cli.ts +93 -22
  662. package/scripts/run/hold/run-hold-main.ts +12 -0
  663. package/scripts/run/hold/run-hold-member.ts +37 -0
  664. package/scripts/run/hold/run-stop-notify.ts +183 -0
  665. package/scripts/run/merge/run-merge-auth.ts +31 -0
  666. package/scripts/run/merge/run-merge-cli.ts +62 -48
  667. package/scripts/run/merge/run-merge-close.ts +74 -0
  668. package/scripts/run/merge/run-merge-collect.ts +6 -13
  669. package/scripts/run/merge/run-merge-driver.ts +71 -0
  670. package/scripts/run/merge/run-merge-main.ts +12 -0
  671. package/scripts/run/merge/run-merge-outcome.ts +23 -0
  672. package/scripts/run/merge/run-merge-restart.ts +39 -0
  673. package/scripts/run/merge/run-merge-ship.ts +20 -4
  674. package/scripts/run/merge/run-merge-signals.ts +33 -9
  675. package/scripts/run/merge/run-merge-steps.ts +120 -85
  676. package/scripts/run/merge/run-merge.ts +38 -37
  677. package/scripts/run/park/run-park-cli.ts +91 -0
  678. package/scripts/run/park/run-park.ts +88 -0
  679. package/scripts/run/park/run-stalled.ts +68 -0
  680. package/scripts/run/pause/run-pause-cli.ts +73 -0
  681. package/scripts/run/pause/run-pause.ts +251 -0
  682. package/scripts/run/progress/run-progress-cli.ts +4 -12
  683. package/scripts/run/progress/run-progress-clock.ts +1 -1
  684. package/scripts/run/progress/run-progress-config.ts +6 -14
  685. package/scripts/run/progress/run-progress-main.ts +12 -0
  686. package/scripts/run/progress/run-progress.ts +1 -4
  687. package/scripts/run/review/run-review.ts +2 -1
  688. package/scripts/run/run-ending.ts +1 -0
  689. package/scripts/run/run-invocation.ts +5 -6
  690. package/scripts/run/run-liveness-cli.ts +6 -8
  691. package/scripts/run/run-liveness.ts +60 -29
  692. package/scripts/run/run-next.ts +1 -1
  693. package/scripts/run/run-parent-cut-hook.ts +2 -2
  694. package/scripts/run/run-preflight.ts +18 -3
  695. package/scripts/run/run-prep-cli.ts +1 -10
  696. package/scripts/run/run-prep-locate.ts +7 -50
  697. package/scripts/run/run-prep-main.ts +12 -0
  698. package/scripts/run/run-prep.ts +6 -0
  699. package/scripts/run/run-report-cli.ts +101 -13
  700. package/scripts/run/run-report-handoff.ts +114 -0
  701. package/scripts/run/run-step.ts +1 -1
  702. package/scripts/run/run-stranded-detect.ts +13 -0
  703. package/scripts/run/run-watcher-guard-cli.ts +1 -1
  704. package/scripts/run/run-watcher-guard.ts +1 -1
  705. package/scripts/run/ship/run-ship-args.ts +121 -0
  706. package/scripts/run/ship/run-ship-body-draft.ts +110 -0
  707. package/scripts/run/ship/run-ship-cli.ts +63 -140
  708. package/scripts/run/ship/run-ship-detach.ts +19 -8
  709. package/scripts/run/ship/run-ship-infra-retry.ts +59 -0
  710. package/scripts/run/ship/run-ship-next.ts +18 -2
  711. package/scripts/run/ship/run-ship-overlap.ts +42 -5
  712. package/scripts/run/ship/run-ship-place.ts +96 -0
  713. package/scripts/run/ship/run-ship-pre-detach-timed.ts +43 -0
  714. package/scripts/run/ship/run-ship-pre-detach.ts +81 -24
  715. package/scripts/run/ship/run-ship-preflight.ts +137 -32
  716. package/scripts/run/ship/run-ship-probe.ts +11 -3
  717. package/scripts/run/ship/run-ship-relaunch-cap.ts +70 -0
  718. package/scripts/run/ship/run-ship-removed-rows.ts +61 -0
  719. package/scripts/run/ship/run-ship-return.ts +107 -23
  720. package/scripts/run/ship/run-ship-review-steps.ts +105 -151
  721. package/scripts/run/ship/run-ship-review.ts +73 -6
  722. package/scripts/run/ship/run-ship-reviewer.ts +207 -0
  723. package/scripts/run/ship/run-ship-stage.ts +55 -6
  724. package/scripts/run/ship/run-ship-steps.ts +46 -15
  725. package/scripts/run/ship/run-ship-stop-cause.ts +135 -0
  726. package/scripts/run/ship/run-ship-stop-text.ts +11 -6
  727. package/scripts/run/ship/run-ship-sync.ts +43 -6
  728. package/scripts/run/ship/run-ship.ts +30 -2
  729. package/scripts/run/tidy/run-tidy-cli.ts +0 -4
  730. package/scripts/run/tidy/run-tidy-lanes.ts +3 -0
  731. package/scripts/run/tidy/run-tidy-main.ts +8 -0
  732. package/scripts/run/wake/run-wake-cli.ts +119 -100
  733. package/scripts/run/wake/run-wake-code.ts +83 -0
  734. package/scripts/run/wake/run-wake-driver.ts +19 -8
  735. package/scripts/run/wake/run-wake-loop.ts +34 -3
  736. package/scripts/run/wake/run-wake-main.ts +13 -0
  737. package/scripts/run/wake/run-wake-ports.ts +90 -0
  738. package/scripts/run/wake/run-wake-takeover.ts +66 -0
  739. package/scripts/run/wake/run-wake.ts +2 -1
  740. package/scripts/safe-chain/pack-hook.ts +2 -2
  741. package/scripts/safe-chain/preinstall-command.ts +2 -1
  742. package/scripts/safe-chain/project-config.ts +3 -9
  743. package/scripts/security/security-audit-main.ts +8 -0
  744. package/scripts/security/security-audit-provision-logic.ts +0 -11
  745. package/scripts/security/security-audit-provision-main.ts +12 -0
  746. package/scripts/security/security-audit-provision.ts +11 -26
  747. package/scripts/security/security-audit.ts +6 -7
  748. package/scripts/self-sync-guard/self-sync-guard-logic.ts +6 -13
  749. package/scripts/split/split-assess-cli.ts +2 -2
  750. package/scripts/split/split-assess.ts +15 -0
  751. package/scripts/split/split-measure.ts +65 -0
  752. package/scripts/sync/claude-settings-merge.ts +8 -15
  753. package/scripts/sync/directory-copy-guard.ts +4 -9
  754. package/scripts/sync/file-content.ts +78 -8
  755. package/scripts/sync/sync-ai-files.ts +3 -5
  756. package/scripts/sync/sync-configs.ts +11 -23
  757. package/scripts/sync/sync-hook-safety.ts +4 -10
  758. package/scripts/sync/sync-main.ts +11 -0
  759. package/scripts/sync/sync.ts +25 -37
  760. package/scripts/test/test-declared-changed.ts +2 -2
  761. package/scripts/test/test-declared.ts +1 -1
  762. package/scripts/test/test-e2e-guard.ts +25 -1
  763. package/scripts/test/test-e2e-stamp.ts +38 -0
  764. package/scripts/test/test-pinned-logic.ts +145 -0
  765. package/scripts/test/test-pinned-main.ts +78 -0
  766. package/scripts/test/test-pinned.ts +100 -0
  767. package/scripts/test/test-read-map.ts +264 -0
  768. package/scripts/test/test-read-recording.ts +91 -0
  769. package/scripts/test/test-read-trace.ts +148 -0
  770. package/scripts/test/test-red-main.ts +12 -0
  771. package/scripts/test/test-red.ts +12 -30
  772. package/scripts/test/test-related-main.ts +18 -0
  773. package/scripts/test/test-related-record.ts +119 -0
  774. package/scripts/test/test-related-scope.ts +229 -43
  775. package/scripts/test/test-related.ts +300 -22
  776. package/scripts/test/test-unit-guard-main.ts +15 -0
  777. package/scripts/test/test-unit-guard.ts +42 -24
  778. package/scripts/test/unit-count-file.ts +37 -0
  779. package/scripts/test/unit-run-marker.ts +162 -0
  780. package/scripts/test/unit-setup-files.ts +51 -0
  781. package/scripts/test/unit-worker-share.ts +61 -149
  782. package/scripts/test/whole-suite-files.ts +63 -0
  783. package/scripts/time-runtime/time-background.ts +20 -2
  784. package/scripts/time-runtime/time-bundles.ts +4 -3
  785. package/scripts/time-runtime/time-density-hook.ts +8 -6
  786. package/scripts/time-runtime/time-followup-stage.ts +1 -3
  787. package/scripts/time-runtime/time-format.ts +5 -28
  788. package/scripts/time-runtime/time-markers.ts +10 -1
  789. package/scripts/time-runtime/time-shell.ts +97 -10
  790. package/scripts/time-runtime/time-transcript-line.ts +49 -62
  791. package/scripts/uninstall/uninstall.ts +1 -1
  792. package/scripts/version/bump-version-main.ts +12 -0
  793. package/scripts/version/bump-version.ts +25 -25
  794. package/scripts/version/effective-upstream.ts +6 -12
  795. package/scripts/version/latest-corepack.ts +17 -32
  796. package/scripts/version/latest-if-required-cli.ts +93 -0
  797. package/scripts/version/latest-lane-guard-main.ts +8 -0
  798. package/scripts/version/latest-lane-guard.ts +0 -4
  799. package/scripts/version/latest-scope-cli.ts +0 -9
  800. package/scripts/version/latest-scope-main.ts +12 -0
  801. package/scripts/version/latest-update.ts +5 -5
  802. package/scripts/version/npm-registry.ts +44 -6
  803. package/scripts/version/publishable-range-check.ts +5 -16
  804. package/scripts/version/release-age.ts +1 -1
  805. package/scripts/version/release-hold.ts +1 -1
  806. package/scripts/version/release-window.ts +38 -0
  807. package/scripts/version/running-binary.ts +1 -1
  808. package/scripts/version/safe-chain-version-update.ts +3 -8
  809. package/scripts/version/version-targets.ts +6 -28
  810. package/templates/dependabot.yml +29 -0
  811. package/templates/gitignore +4 -1
  812. package/templates/pnpm-workspace.basic.yaml +1 -1
  813. package/templates/sonar-project.properties +3 -2
  814. package/templates/workflows/ci.yml +12 -4
  815. package/templates/workflows/github-release.yml +4 -0
  816. package/tsconfig.sonar.json +1 -1
  817. package/.ncurc.json +0 -3
  818. package/dist/hooks/batch-guard.js +0 -29
  819. package/dist/hooks/chunk-4KKD2UTK.js +0 -66
  820. package/dist/hooks/chunk-6TS2JD6D.js +0 -237
  821. package/dist/hooks/chunk-7DSBJVFH.js +0 -50
  822. package/dist/hooks/chunk-A65Y4YOR.js +0 -79
  823. package/dist/hooks/chunk-CDY4NFQG.js +0 -15
  824. package/dist/hooks/chunk-EFXE6C37.js +0 -81
  825. package/dist/hooks/chunk-GP4IEC4O.js +0 -20
  826. package/dist/hooks/chunk-JP45SOCJ.js +0 -56
  827. package/dist/hooks/chunk-LAOV7NLM.js +0 -45
  828. package/dist/hooks/chunk-M4HGZV7U.js +0 -83
  829. package/dist/hooks/chunk-PF2NZL2A.js +0 -131
  830. package/dist/hooks/chunk-PTICX4OL.js +0 -358
  831. package/dist/hooks/chunk-RT27QRJW.js +0 -6247
  832. package/dist/hooks/chunk-SYOTDYCI.js +0 -3533
  833. package/dist/hooks/chunk-UPUZF3AN.js +0 -279
  834. package/dist/hooks/chunk-WK6SMBIC.js +0 -3180
  835. package/dist/hooks/duplicate-read-guard.js +0 -30
  836. package/dist/hooks/investigation-guard.js +0 -29
  837. package/scripts/backlog/backlog-stalled-cli.ts +0 -30
  838. package/scripts/cost-runtime/cost-format.ts +0 -29
  839. package/scripts/init/basic-path-migration.ts +0 -24
  840. package/scripts/issue/issue-backlinks-cli.ts +0 -93
  841. package/scripts/josh/josh-commands-guard.ts +0 -38
  842. package/scripts/josh/josh-usage-automation.ts +0 -121
  843. package/scripts/josh/josh-usage-backlog.ts +0 -180
  844. package/scripts/josh/josh-usage-developer.ts +0 -230
  845. package/scripts/josh/josh-usage-hooks.ts +0 -38
  846. package/scripts/josh/josh-usage-issue.ts +0 -205
  847. package/scripts/josh/josh-usage-review.ts +0 -101
  848. package/scripts/josh/josh-usage-run.ts +0 -252
  849. package/scripts/josh/josh-usage-session.ts +0 -238
  850. package/scripts/josh/josh-usage-workflow.ts +0 -212
  851. package/scripts/lint/cross-file-recheck.ts +0 -155
  852. package/scripts/registry-migration/migrate-logic.ts +0 -237
  853. package/scripts/registry-migration/migrate.ts +0 -292
  854. package/scripts/registry-migration/user-npmrc.ts +0 -15
  855. package/scripts/rules/rule-guard.ts +0 -23
  856. package/scripts/rules/rule-registry-rows.ts +0 -292
  857. package/scripts/rules/rule-registry.ts +0 -112
  858. package/scripts/run/run-stranded-cli.ts +0 -27
@@ -1,11 +1,5 @@
1
- import {
2
- run_board_fit,
3
- type FrameParts,
4
- type NotesPart,
5
- type PlanLine,
6
- type PlanSection,
7
- type TerminalSize,
8
- } from './run-board-fit'
1
+ import type { FrameParts, PlanLine, PlanSection, TerminalSize, YieldStage } from './run-board-fit'
2
+ import { run_board_fold, type FrameBounds } from './run-board-fold'
9
3
  import { run_board_fresh } from './run-board-fresh'
10
4
  import { run_board_header, type BoardHeader } from './run-board-header'
11
5
  import { run_board_labels } from './run-board-labels'
@@ -13,50 +7,49 @@ import {
13
7
  run_board_layout,
14
8
  type BoardLayout,
15
9
  type BoardRow,
16
- type WaveEntry,
10
+ type QueuedEntry,
17
11
  } from './run-board-layout'
18
12
  import type { Link } from './run-board-link'
19
- import type { BoardNote } from './run-board-notes'
20
- import { run_board_render_checks } from './run-board-render-checks'
21
- import { run_board_render_legend } from './run-board-render-legend'
13
+ import { run_board_notes, type BoardNote } from './run-board-notes'
14
+ import { run_board_priority } from './run-board-priority'
15
+ import { run_board_render_condition } from './run-board-render-condition'
16
+ import { run_board_render_foot } from './run-board-render-foot'
17
+ import { run_board_render_icon } from './run-board-render-icon'
18
+ import { run_board_render_lanes, type LaneCells } from './run-board-render-lanes'
19
+ import { run_board_render_lead } from './run-board-render-lead'
22
20
  import { run_board_render_notes } from './run-board-render-notes'
23
- import { run_board_render_slot, type UsageSlot } from './run-board-render-slot'
21
+ import { run_board_render_processes } from './run-board-render-processes'
22
+ import { run_board_render_section } from './run-board-render-section'
24
23
  import { run_board_render_tail } from './run-board-render-tail'
25
- import { run_board_render_thanks } from './run-board-render-thanks'
26
- import { run_board_render_title } from './run-board-render-title'
27
- import { run_board_render_waits } from './run-board-render-waits'
24
+ import { run_board_render_time } from './run-board-render-time'
25
+ import { run_board_render_title, type RowCut, type RowFit } from './run-board-render-title'
28
26
  import { run_board_row_yield } from './run-board-row-yield'
29
27
  import type { Thanks } from './run-board-thanks-csv'
30
28
 
31
29
  // The whole `run:board` screen as lines — pure, so what a person sees is tested apart from the
32
- // terminal. The header says where the run is; the sections below it follow the plan's order; the
33
- // findings at the bottom are what the run would otherwise have said in no chat anyone reads. A section
34
- // is a rule rather than a heading, and the legend at the foot names the symbols, so a row carries only
35
- // what differs between rows. Every word is English whatever the session language: one set of words
36
- // reads the same on every board.
37
-
38
- const { FILED_KIND_ICONS, KIND_BLANK, NOTES_ICON, NOW_ICONS, PHASE_ICONS, STATE_ICONS } =
39
- run_board_labels
40
- const { WAITS_ICON, WORDS } = run_board_labels
41
- const { clock_of, elapsed_of } = run_board_labels
30
+ // terminal. The header says where the run is; under it the run's own rows, then the ones waiting on a
31
+ // person's decision, then the findings — what the run would otherwise have said in no chat anyone
32
+ // reads — and the plan's rest in its order. A section is a rule rather than a heading, and the legend
33
+ // at the foot names the symbols, so a row carries only what differs between rows. Every word is
34
+ // English whatever the session language: one set of words reads the same on every board.
35
+
36
+ const { FILED_KIND_ICONS, KIND_BLANK, STATE_ICONS, WAITS_ICON, WORDS, clock_of } = run_board_labels
37
+ const { time_of, time_width } = run_board_render_time
38
+ const { state_icon } = run_board_render_icon
42
39
  const { NOTE_LIMIT } = run_board_render_notes
43
- const { cell_of, column_width, slot_of, usage_slot } = run_board_render_slot
44
- const { ELLIPSIS, TITLE_LIMIT, fitted, reason_text, title_of } = run_board_render_title
40
+ const { lane_cells_of, lanes_section, number_text } = run_board_render_lanes
41
+ const { LANE_INDENT, lead_of: lane_lead_of, running_fresh } = run_board_render_lead
42
+ const { ELLIPSIS, TITLE_LIMIT, WHOLE, fitted, reason_text, row_overrun, title_of } =
43
+ run_board_render_title
45
44
  const { padded } = run_board_fresh
45
+ const { condition_of, waits_of } = run_board_render_condition
46
+ const { legend_lines, resume_lines, thanks_part } = run_board_render_foot
47
+ const { ROW_INDENT, done_section, keyed, plan_section } = run_board_render_section
46
48
  const GAP = ' '
47
- const INDENT = ' '
48
- const BRANCH = ' ├ '
49
- const LAST_BRANCH = ' └ '
50
- const RULE = '─'
51
- const RULE_LEAD = `${RULE}${RULE}`
52
- const RULE_WIDTH = 50
53
-
54
- // The live terminal a frame is kept within, and the footer the frame ends on and gives way first;
55
- // neither for a frame that is not redrawn in place.
56
- interface FrameBounds {
57
- size?: TerminalSize | undefined
58
- footer?: ReadonlyArray<string> | undefined
59
- }
49
+ const FILED_LEAD = `${run_board_labels.FILED_RUN_MARK} `
50
+ const BRANCH = `${ROW_INDENT} ├ `
51
+ const LAST_BRANCH = `${ROW_INDENT} └ `
52
+ const { bounded } = run_board_fold
60
53
 
61
54
  interface BoardView extends FrameBounds {
62
55
  header: BoardHeader
@@ -68,18 +61,32 @@ interface BoardView extends FrameBounds {
68
61
  link?: Link | undefined
69
62
  }
70
63
 
71
- // What every row of one frame is drawn with: the header, how wide the time column is, so a three-digit
72
- // `125:30` and a `00:42` end in the same column, and each lane's usage where its column is drawn, with
73
- // the column's width.
64
+ // When the reads off this machine last failed, and why.
65
+ type ReadFailure = Pick<BoardHeader, 'read_error' | 'read_failed_ms'>
66
+
67
+ // What every row of one frame is drawn with: the header, how wide the time column is, so a
68
+ // `2°05′30″` and a `42″` end in the same column, and the lane cells after a row's lead where its
69
+ // section draws them.
74
70
  interface RowFrame {
75
71
  header: BoardHeader
76
72
  time_width: number
77
- usage: UsageSlot | undefined
78
- slot_width: number
73
+ cells?: LaneCells | undefined
79
74
  // The columns a row's title is cut to: the title column's, or fewer where a row gives some up.
80
75
  title_limit: number
76
+ // The columns cut off the end of a row's reason, where its title alone could not give up enough.
77
+ reason_cut: number
81
78
  // The pane's width where the frame is kept within one.
82
79
  columns: number | undefined
80
+ // The issues the run filed, whose rows lead their title with ✚.
81
+ filed: ReadonlySet<number>
82
+ // The columns a lane row that draws a tail gives up with every other such row.
83
+ shared?: number | undefined
84
+ // The queued, waiting and done sections draw a condition column after the icon
85
+ // (joshuafolkken/kit#4288, #4292).
86
+ is_conditioned?: boolean | undefined
87
+ // The lanes section draws each row's lead — progress, phase and times — before its cells
88
+ // (`run-board-render-lead.ts`).
89
+ is_lane_row?: boolean | undefined
83
90
  }
84
91
 
85
92
  // A row drawn before the plan is read has no title yet, and says so.
@@ -89,316 +96,241 @@ function row_title(row: BoardRow, header: BoardHeader): string | undefined {
89
96
  return ELLIPSIS
90
97
  }
91
98
 
92
- // A running row runs until now; a settled one until its recorded end. A child settled from the open
93
- // listing has none, so it draws no time rather than one that keeps counting.
94
- function end_of(row: BoardRow, now_ms: number): number | undefined {
95
- return row.state === 'running' ? now_ms : row.status?.ended_ms
96
- }
97
-
98
- // How long a row has run: a running one until now, a settled one its whole span.
99
- function elapsed_ms(row: BoardRow, now_ms: number): number | undefined {
100
- const started = row.status?.started_ms
101
- const ended = end_of(row, now_ms)
102
-
103
- if (started === undefined || ended === undefined) return undefined
104
-
105
- return ended - started
106
- }
107
-
108
- function time_of(row: BoardRow, now_ms: number): string | undefined {
109
- const elapsed = elapsed_ms(row, now_ms)
110
-
111
- return elapsed === undefined ? undefined : elapsed_of(elapsed)
112
- }
113
-
114
- function waits_of(row: BoardRow, header: BoardHeader): string | undefined {
115
- if (row.waits.length === 0) return undefined
99
+ // A row the run filed leads its title with ✚ (joshuafolkken/kit#4099), cut by as many columns, so every
100
+ // column after it stays where an unmarked row has it.
101
+ function title_text(row: BoardRow, frame: RowFrame): string {
102
+ const title = row_title(row, frame.header)
116
103
 
117
- return `${WAITS_ICON} ${row.waits.map((reference) => header.link(reference)).join(', ')}`
118
- }
104
+ if (!frame.filed.has(row.number)) return title_of(title, frame.title_limit)
119
105
 
120
- // A running row's part that changed at `at_ms`, emphasized while fresh (`run-board-fresh.ts`) — its
121
- // start and its phase; a settled row's are long past.
122
- function running_fresh(
123
- row: BoardRow,
124
- text: string,
125
- at_ms: number | undefined,
126
- header: BoardHeader,
127
- ): string {
128
- return row.state === 'running' ? run_board_fresh.since(text, at_ms, header) : text
106
+ return `${FILED_LEAD}${title_of(title, frame.title_limit - FILED_LEAD.length)}`
129
107
  }
130
108
 
131
109
  // The title padded to the title column and the time to the time column — blanks where a row has none —
132
- // so the times form one column, and what follows them starts in one column on every row.
110
+ // so the times form one column, and what follows them starts in one column on every row but a waiting
111
+ // one, whose title is not padded. A lane row draws its time in its lead.
133
112
  function timed_parts(row: BoardRow, frame: RowFrame): Array<string> {
113
+ const title = title_text(row, frame)
114
+
115
+ if (row.state === 'waiting') return [title]
116
+ if (frame.is_lane_row === true) return [title.padEnd(frame.title_limit)]
117
+
134
118
  const time = time_of(row, frame.header.now_ms) ?? ''
135
- const title = title_of(row_title(row, frame.header), frame.title_limit)
136
119
  const fresh = running_fresh(row, time, row.status?.started_ms, frame.header)
137
120
 
138
121
  return [title.padEnd(frame.title_limit), padded(time, frame.time_width, fresh)]
139
122
  }
140
123
 
141
- // A running row leads with the icon of the phase it is in now — the last its track reached — and
142
- // with 🔄 while it has reached none yet.
143
- function state_icon(row: BoardRow): string {
144
- const current = row.state === 'running' ? row.status?.track?.at(-1) : undefined
145
-
146
- return current === undefined ? STATE_ICONS[row.state] : PHASE_ICONS[current]
147
- }
148
-
149
- // A running row turns the spinner in the first column of its indent where the header has one, so its
150
- // title starts in the same column as every other row's.
151
- function indent_of(prefix: string, row: BoardRow, header: BoardHeader): string {
152
- if (row.state !== 'running' || header.spinner === undefined) return prefix
153
-
154
- return `${header.spinner}${prefix.slice(1)}`
155
- }
156
-
157
- // A row's usage column as drawn: a settled row's finish time emphasized while it is fresh.
158
- function slot_text(row: BoardRow, usage: UsageSlot, header: BoardHeader): string | undefined {
159
- const slot = slot_of(row, usage, header.now_ms)
160
- const ended = row.state === 'running' ? undefined : row.status?.ended_ms
161
-
162
- return slot === undefined ? slot : run_board_fresh.since(slot, ended, header)
124
+ function joined(parts: ReadonlyArray<string | undefined>): string {
125
+ return parts.filter((part) => part !== undefined && part !== '').join(GAP)
163
126
  }
164
127
 
165
- // A row's usage column where the frame draws one, padded to one width on every row so every tail
166
- // starts in one column. A plan row the run has not touched draws blanks in its place, so what it waits
167
- // on starts in the tail's column.
168
- function cell_text(row: BoardRow, frame: RowFrame): string | undefined {
169
- const { usage, slot_width } = frame
128
+ // A lane row's lead, else the icon and, in a section that draws one, the condition column after it.
129
+ function icon_text(row: BoardRow, frame: RowFrame): string {
130
+ const { header } = frame
170
131
 
171
- if (usage === undefined || slot_width === 0) return undefined
172
- if (row.status === undefined) return ' '.repeat(slot_width)
132
+ if (frame.is_lane_row === true) return lane_lead_of(row, header)
173
133
 
174
- return cell_of(slot_text(row, usage, frame.header), slot_width)
175
- }
134
+ const icon = running_fresh(row, state_icon(row), row.status?.phase_ms, header)
176
135
 
177
- function joined(parts: ReadonlyArray<string | undefined>): string {
178
- return parts.filter((part) => part !== undefined && part !== '').join(GAP)
136
+ return frame.is_conditioned === true ? `${icon} ${condition_of(row, header)}` : icon
179
137
  }
180
138
 
181
- // The release kind's icon between the number and the title, one space either side; a row with no title
182
- // ends at its icon, so what follows keeps its usual gap.
183
- function lead_of(row: BoardRow, header: BoardHeader, title: string): string {
139
+ // The priority and the release kind's icons between the number — and its lane cells, where drawn —
140
+ // and the title, one space either side; a row with no title ends at its kind, so what follows keeps
141
+ // its usual gap.
142
+ function lead_of(row: BoardRow, frame: RowFrame, title: string): string {
143
+ const { header } = frame
184
144
  const kind = row.kind === undefined ? KIND_BLANK : FILED_KIND_ICONS[row.kind]
185
- const icon = running_fresh(row, state_icon(row), row.status?.phase_ms, header)
186
- const lead = `${icon} ${header.link(String(row.number))} ${kind}`
145
+ const number = number_text(row, frame.cells, header.link)
146
+ const lead = `${icon_text(row, frame)} ${number} ${run_board_priority.cell_of(row)} ${kind}`
187
147
 
188
148
  return title === '' ? lead : `${lead} ${title}`
189
149
  }
190
150
 
191
- // A row up to its usage column — the columns that stay where they are on every row.
151
+ // A row up to its tail — the columns that stay where they are on every row. A waiting row has no time
152
+ // to line up, so it ends at its title and what it waits on follows two blanks on.
192
153
  function head_text(row: BoardRow, frame: RowFrame): string {
193
154
  const [title = '', time] = timed_parts(row, frame)
155
+ const lead = lead_of(row, frame, title)
156
+
157
+ if (row.state === 'waiting') return lead
194
158
 
195
- return joined([lead_of(row, frame.header, title), time, cell_text(row, frame)])
159
+ return joined([lead, time])
196
160
  }
197
161
 
198
- // Every row carries its state's icon, a waiting one ⏳ too; a running row ends on its tail
162
+ // Every row carries its state's icon, or the icon of what it waits on; a running row ends on its tail
199
163
  // (`run-board-render-tail.ts`), and a row with nothing after its padded columns ends where its text does.
200
164
  function row_text(row: BoardRow, frame: RowFrame): string {
201
165
  const { header } = frame
202
166
  const tail = run_board_render_tail.tail_of(row, header)
203
- const notes = [waits_of(row, header), reason_text(row, header.now_ms)]
167
+ const notes = [waits_of(row, header, frame.is_conditioned), reason_text(row, frame.reason_cut)]
204
168
 
205
169
  return joined([head_text(row, frame), ...tail, ...notes]).trimEnd()
206
170
  }
207
171
 
172
+ // A row drawn whole or cut, after its indent.
173
+ function row_draw(indent: string, row: BoardRow, frame: RowFrame): (cut: RowCut) => string {
174
+ return (cut) => `${indent}${row_text(row, { ...frame, ...cut })}`
175
+ }
176
+
177
+ // A row drawn with lane cells keeps its head on one line, its title giving up their columns where the
178
+ // pane is narrow. A row that draws a tail keeps its whole line, giving up the columns its section's
179
+ // rows give up together (joshuafolkken/kit#4226).
180
+ function row_fit(indent: string, row: BoardRow, frame: RowFrame): RowFit {
181
+ const is_line_kept = run_board_render_tail.tail_of(row, frame.header).length > 0
182
+
183
+ return {
184
+ is_line_kept,
185
+ lead: frame.filed.has(row.number) ? FILED_LEAD.length : 0,
186
+ head: (cut) => `${indent}${head_text(row, { ...frame, ...cut })}`,
187
+ is_head_kept: frame.cells !== undefined,
188
+ shared: is_line_kept ? frame.shared : undefined,
189
+ }
190
+ }
191
+
208
192
  // A plan line that draws one issue row, and one that draws none — a blank, a rule, an epic's own line.
209
- function row_line(prefix: string, row: BoardRow, frame: RowFrame): PlanLine {
210
- const indent = indent_of(prefix, row, frame.header)
211
- const text = fitted(
212
- row,
213
- frame.columns,
214
- (title_limit) => `${indent}${row_text(row, { ...frame, title_limit })}`,
215
- )
193
+ function row_line(indent: string, row: BoardRow, frame: RowFrame, stage?: YieldStage): PlanLine {
194
+ const fit = row_fit(indent, row, frame)
195
+ const text = fitted(row, frame.columns, row_draw(indent, row, frame), fit)
216
196
 
217
- return { text, row: run_board_row_yield.yield_of(row) }
197
+ return { text, row: run_board_row_yield.yield_of(row, stage) }
198
+ }
199
+
200
+ // The most columns a lane row that draws a tail runs past the pane, which every such row gives up, so
201
+ // their titles end in one column and the tails after them start in one.
202
+ function shared_overrun(rows: ReadonlyArray<BoardRow>, frame: RowFrame): number {
203
+ const overruns = rows.map((row) => {
204
+ const fit = row_fit(LANE_INDENT, row, frame)
205
+
206
+ return fit.is_line_kept === true
207
+ ? row_overrun(row, frame.columns, row_draw(LANE_INDENT, row, frame), fit)
208
+ : 0
209
+ })
210
+
211
+ return Math.max(0, ...overruns)
218
212
  }
219
213
 
220
214
  function bare(text: string): PlanLine {
221
215
  return { text, row: undefined }
222
216
  }
223
217
 
224
- function epic_lines(entry: Extract<WaveEntry, { kind: 'epic' }>, frame: RowFrame): Array<PlanLine> {
218
+ // A running child turns the spinner in the first column of its branch where the header has one, so its
219
+ // tree says which child is moving.
220
+ function branch_of(prefix: string, row: BoardRow, header: BoardHeader): string {
221
+ if (row.state !== 'running' || header.spinner === undefined) return prefix
222
+
223
+ return `${header.spinner}${prefix.slice(1)}`
224
+ }
225
+
226
+ function epic_lines(
227
+ entry: Extract<QueuedEntry, { kind: 'epic' }>,
228
+ frame: RowFrame,
229
+ ): Array<PlanLine> {
225
230
  const last = entry.rows.length - 1
226
231
  const children = entry.rows.map((row, index) =>
227
- row_line(index === last ? LAST_BRANCH : BRANCH, row, frame),
232
+ row_line(branch_of(index === last ? LAST_BRANCH : BRANCH, row, frame.header), row, frame),
228
233
  )
229
234
  const title = title_of(entry.title)
230
235
  const number = frame.header.link(String(entry.epic))
231
236
  const epic = title === '' ? number : `${number}${GAP}${title}`
232
237
 
233
- return [bare(`${INDENT}📁 ${epic}`), ...children]
238
+ return [bare(`${ROW_INDENT}📁 ${epic}`), ...children]
234
239
  }
235
240
 
236
- function entry_lines(entry: WaveEntry, frame: RowFrame): Array<PlanLine> {
237
- if (entry.kind === 'row') return [row_line(INDENT, entry.row, frame)]
241
+ function entry_lines(entry: QueuedEntry, frame: RowFrame): Array<PlanLine> {
242
+ if (entry.kind === 'row') return [row_line(ROW_INDENT, entry.row, frame)]
238
243
 
239
244
  return epic_lines(entry, frame)
240
245
  }
241
246
 
242
- function rule_of(label: string): string {
243
- return `${RULE_LEAD} ${label} `.padEnd(RULE_WIDTH, RULE)
244
- }
245
-
246
- function heading_lines(heading: string | undefined): Array<string> {
247
- return heading === undefined ? [''] : ['', rule_of(heading)]
248
- }
249
-
250
- function plan_section(
251
- heading: string | undefined,
252
- lines: ReadonlyArray<PlanLine>,
253
- ): Array<PlanSection> {
254
- if (lines.length === 0) return []
255
-
256
- return [{ head: heading_lines(heading), lines }]
257
- }
258
-
259
247
  function rows_section(
260
248
  heading: string | undefined,
261
249
  rows: ReadonlyArray<BoardRow>,
262
250
  frame: RowFrame,
251
+ stage?: YieldStage,
263
252
  ): Array<PlanSection> {
264
253
  return plan_section(
265
254
  heading,
266
- rows.map((row) => row_line(INDENT, row, frame)),
267
- )
268
- }
269
-
270
- // The time column's width: the widest time any active row draws in this frame.
271
- function time_width(header: BoardHeader): number {
272
- const times = (header.layout?.active ?? []).map((row) => time_of(row, header.now_ms) ?? '')
273
-
274
- return Math.max(0, ...times.map((time) => time.length))
275
- }
276
-
277
- // Whether every row's usage column still fits one terminal line — measured as the deepest, an epic's
278
- // child — where a frame is kept within a terminal. The tail and the notes after it are left out: a
279
- // row's reason makes room for itself, so one long reason would otherwise take the column off every row.
280
- function is_usage_fitting(
281
- rows: ReadonlyArray<BoardRow>,
282
- frame: RowFrame,
283
- size: TerminalSize | undefined,
284
- ): boolean {
285
- if (size === undefined) return true
286
-
287
- return rows.every(
288
- (row) => run_board_fit.height_of(`${BRANCH}${head_text(row, frame)}`, size.columns) === 1,
255
+ rows.map((row) => row_line(ROW_INDENT, row, frame, stage)),
289
256
  )
290
257
  }
291
258
 
292
- // The usage column is drawn on every row or on none: a pane too narrow for it on any row draws it on
293
- // none — a finish time with it.
294
259
  function frame_of(
295
260
  header: BoardHeader,
296
- layout: BoardLayout,
261
+ notes: ReadonlyArray<BoardNote>,
297
262
  size: TerminalSize | undefined,
298
263
  ): RowFrame {
299
- const rows = run_board_layout.rows_of(layout)
300
- const usage = header.usages === undefined ? undefined : usage_slot(rows, header.usages)
301
- const frame = {
264
+ return {
302
265
  header,
303
266
  time_width: time_width(header),
304
- usage,
305
- slot_width: usage === undefined ? 0 : column_width(rows, usage, header.now_ms),
306
- title_limit: TITLE_LIMIT,
267
+ ...WHOLE,
307
268
  columns: size?.columns,
269
+ filed: run_board_notes.filed_numbers(notes),
308
270
  }
309
-
310
- return is_usage_fitting(rows, frame, size) ? frame : { ...frame, usage: undefined }
311
271
  }
312
272
 
313
- function plan_sections(header: BoardHeader, size: TerminalSize | undefined): Array<PlanSection> {
314
- const { layout } = header
315
-
316
- if (layout === undefined) return []
317
-
318
- const frame = frame_of(header, layout, size)
319
- const waves = layout.waves.flatMap((wave, index) =>
320
- plan_section(
321
- String(index + 1),
322
- wave.flatMap((entry) => entry_lines(entry, frame)),
323
- ),
273
+ // The rows not yet started under one heading, in the order they are offered: a running batch starts
274
+ // each once a lane and its paths are free, never wave by wave (joshuafolkken/kit#4137).
275
+ function queued_section(layout: BoardLayout, frame: RowFrame): Array<PlanSection> {
276
+ return plan_section(
277
+ `${STATE_ICONS.waiting} ${WORDS.queued}`,
278
+ layout.queued.flatMap((entry) => entry_lines(entry, { ...frame, is_conditioned: true })),
324
279
  )
325
-
326
- return [
327
- ...rows_section(undefined, layout.active, frame),
328
- ...waves,
329
- ...rows_section(STATE_ICONS.human, layout.people, frame),
330
- ...rows_section(WAITS_ICON, layout.unreached, frame),
331
- ]
332
- }
333
-
334
- // The findings under a rule, led by 📌 where a legend names it and by its word where none does, and how
335
- // many more there are, so the section never pushes the plan off the screen.
336
- function notes_part(notes: ReadonlyArray<BoardNote>, header: BoardHeader): NotesPart {
337
- const has_legend = header.layout !== undefined
338
- const lines = run_board_render_notes.note_lines(notes, has_legend, header.link)
339
- const label = has_legend ? NOTES_ICON : WORDS.notes
340
-
341
- return { head: heading_lines(label), lines, hidden: notes.length - lines.length }
342
280
  }
343
281
 
344
- // The command that resumes a stopped run's session, under the header where the person looks first.
345
- function resume_lines(resume: string | undefined): Array<string> {
346
- if (resume === undefined) return []
347
-
348
- return ['', `${STATE_ICONS.human} ${WORDS.resume}${GAP}claude --resume ${resume}`]
349
- }
350
-
351
- // The activity kinds the legend names: the header's third line's, 🔧 where a row's tail draws it, and
352
- // a followup row's checks (joshuafolkken/kit#3770).
353
- function activity_named(header: BoardHeader, rows: ReadonlyArray<BoardRow>): Array<string> {
354
- const now = run_board_header.now_legend(header)
355
- const is_drawn = rows.some((row) => run_board_render_tail.is_operation_drawn(row, header))
356
- const operation = is_drawn ? [`${NOW_ICONS.operation} ${WORDS.operation}`] : []
357
- const is_checks = rows.some((row) => run_board_render_tail.is_checks_drawn(row, header))
358
- const checks = is_checks ? run_board_render_checks.LEGEND : []
282
+ // The rows above the findings: the run's own, the earlier run's lanes still holding a place, then the
283
+ // ones waiting on a person's decision — a child parked on one and an untouched plan row alike
284
+ // (joshuafolkken/kit#4099).
285
+ function active_sections(layout: BoardLayout, frame: RowFrame): Array<PlanSection> {
286
+ const people = run_board_layout.people_of(layout)
287
+ const lead = run_board_layout.lanes_drawn(layout)
288
+ const decision = `${STATE_ICONS.human} ${WORDS.decision}`
289
+ const cells = lane_cells_of(frame.header, lead)
290
+ const lane_frame = { ...frame, cells, is_lane_row: true }
291
+ const shared = shared_overrun(lead, lane_frame)
292
+ const lanes = lanes_section(
293
+ lead.map((row) => row_line(LANE_INDENT, row, { ...lane_frame, shared })),
294
+ cells,
295
+ )
359
296
 
360
- return [...(now === undefined ? [] : [now]), ...operation, ...checks]
297
+ return [...lanes, ...rows_section(decision, people, frame)]
361
298
  }
362
299
 
363
- // No legend is drawn before a plan is read: there are no rows whose symbols it would name.
364
- function legend_lines(header: BoardHeader, notes: ReadonlyArray<BoardNote>): Array<string> {
300
+ // The plan's rest under the findings, the 🔗 waiting rows giving way before them.
301
+ function plan_parts(
302
+ header: BoardHeader,
303
+ notes: ReadonlyArray<BoardNote>,
304
+ size: TerminalSize | undefined,
305
+ ): Pick<FrameParts, 'below' | 'plan'> {
365
306
  const { layout } = header
366
307
 
367
- if (layout === undefined) return []
368
-
369
- const rows = run_board_layout.rows_of(layout)
370
- const drawn = new Set(rows.map((row) => state_icon(row)))
371
- const named = activity_named(header, rows)
308
+ if (layout === undefined) return { plan: [] }
372
309
 
373
- return ['', ...run_board_render_legend.legend_of(rows, drawn, notes, named)]
374
- }
310
+ const frame = frame_of(header, notes, size)
311
+ const conditioned = { ...frame, is_conditioned: true }
312
+ const done = layout.active.filter((row) => run_board_layout.is_finished(row.state))
313
+ const waiting = `${WAITS_ICON} ${WORDS.waiting}`
375
314
 
376
- // Names with no link where no terminal opens one: a frame with no `link` draws them plain.
377
- function thanks_part(view: BoardView): Array<string> {
378
- const link = view.link ?? ((text: string): string => text)
379
-
380
- return run_board_render_thanks.thanks_lines(view.thanks ?? [], link, view.size?.columns)
381
- }
382
-
383
- // A live frame is kept within its terminal; any other is drawn whole.
384
- function bounded(parts: FrameParts, bounds: FrameBounds): Array<string> {
385
- const { size } = bounds
386
-
387
- return size === undefined ? run_board_fit.whole(parts) : run_board_fit.fit(parts, size)
315
+ return {
316
+ plan: active_sections(layout, frame),
317
+ below: [
318
+ ...keyed('queued', queued_section(layout, frame)),
319
+ ...keyed('waiting', rows_section(waiting, layout.unreached, conditioned, 'waiting')),
320
+ ...done_section(done, (row) => row_line(ROW_INDENT, row, conditioned)),
321
+ ],
322
+ }
388
323
  }
389
324
 
390
325
  function render(view: BoardView): Array<string> {
391
326
  const { header, notes } = view
392
- const above = [
393
- ...run_board_header.header_lines(header),
394
- ...run_board_render_waits.wait_lines(header.budget_waits, header.link),
395
- ...resume_lines(view.resume),
396
- ]
327
+ const above = [...run_board_header.header_lines(header), ...resume_lines(view.resume)]
397
328
  const parts = {
398
329
  above,
399
- plan: plan_sections(header, view.size),
400
- notes: notes_part(notes, header),
401
- thanks: thanks_part(view),
330
+ ...plan_parts(header, notes, view.size),
331
+ processes: run_board_render_processes.processes_part(header),
332
+ notes: run_board_render_notes.notes_part(notes, { ...header, columns: view.size?.columns }),
333
+ thanks: thanks_part(view.thanks, view.link, view.size?.columns),
402
334
  legend: legend_lines(header, notes),
403
335
  footer: view.footer ?? [],
404
336
  }
@@ -406,8 +338,18 @@ function render(view: BoardView): Array<string> {
406
338
  return bounded(parts, view)
407
339
  }
408
340
 
409
- function render_no_run(now_ms: number, bounds: FrameBounds = {}): Array<string> {
410
- const above = [`■ backlogrun${GAP}${WORDS.no_run}${GAP}${clock_of(now_ms)}`]
341
+ // No run read here — or the reads failed, which the line says, and why, in place of `no run`: a read
342
+ // that failed cannot tell whether a run is there.
343
+ function render_no_run(
344
+ now_ms: number,
345
+ bounds: FrameBounds = {},
346
+ failure: ReadFailure = {},
347
+ ): Array<string> {
348
+ const { read_failed_ms, read_error } = failure
349
+ const warning = run_board_header.warning_of(WORDS.read, read_failed_ms, read_error)
350
+ const said = warning === undefined ? WORDS.no_run : undefined
351
+ const parts = ['■ backlogrun', said, clock_of(now_ms), warning]
352
+ const above = [parts.filter((part) => part !== undefined).join(GAP)]
411
353
  const notes = { head: [], lines: [], hidden: 0 }
412
354
 
413
355
  return bounded({ above, plan: [], notes, legend: [], footer: bounds.footer ?? [] }, bounds)
@@ -421,4 +363,4 @@ const run_board_render = {
421
363
  }
422
364
 
423
365
  export { run_board_render }
424
- export type { BoardView, FrameBounds }
366
+ export type { BoardView }