@joshuafolkken/kit 1.1471.0 → 1.1784.0

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