@joshuafolkken/kit 1.1471.0 → 1.1784.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (895) hide show
  1. package/.claude/agents/investigator.md +1 -1
  2. package/.claude/settings.json +6 -6
  3. package/.claude/skills/epic-commands/SKILL.md +26 -77
  4. package/.claude/skills/epic-commands/epic-bundle.md +12 -6
  5. package/.claude/skills/epic-commands/execution-waves.md +1 -2
  6. package/.claude/skills/verify-ui/SKILL.md +1 -2
  7. package/.claude/skills/workflow-commands/SKILL.md +12 -14
  8. package/.claude/skills/workflow-commands/background-commands.md +8 -12
  9. package/.claude/skills/workflow-commands/backlogrun-child.md +13 -18
  10. package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +7 -25
  11. package/.claude/skills/workflow-commands/backlogrun-lanes.md +23 -28
  12. package/.claude/skills/workflow-commands/backlogrun-park.md +16 -31
  13. package/.claude/skills/workflow-commands/backlogrun-progress.md +12 -21
  14. package/.claude/skills/workflow-commands/backlogrun-recovery.md +12 -12
  15. package/.claude/skills/workflow-commands/backlogrun-steps.md +12 -20
  16. package/.claude/skills/workflow-commands/backlogrun.md +32 -51
  17. package/.claude/skills/workflow-commands/chain-rule.md +18 -11
  18. package/.claude/skills/workflow-commands/delegation.md +13 -8
  19. package/.claude/skills/workflow-commands/entry-sequence.md +10 -12
  20. package/.claude/skills/workflow-commands/followup.md +10 -35
  21. package/.claude/skills/workflow-commands/fullrun-steps.md +38 -49
  22. package/.claude/skills/workflow-commands/fullrun.md +6 -8
  23. package/.claude/skills/workflow-commands/halfrun.md +20 -32
  24. package/.claude/skills/workflow-commands/into-target.md +1 -2
  25. package/.claude/skills/workflow-commands/issue-comments.md +19 -15
  26. package/.claude/skills/workflow-commands/issue-scout.md +5 -4
  27. package/.claude/skills/workflow-commands/kickoff.md +24 -23
  28. package/.claude/skills/workflow-commands/latest-gate.md +9 -18
  29. package/.claude/skills/workflow-commands/needs-human-review.md +11 -19
  30. package/.claude/skills/workflow-commands/observation-filing.md +4 -50
  31. package/.claude/skills/workflow-commands/observation-ledger.md +5 -10
  32. package/.claude/skills/workflow-commands/pre-gate-cut.md +22 -44
  33. package/.claude/skills/workflow-commands/prerequisite.md +11 -18
  34. package/.claude/skills/workflow-commands/progress-watcher.md +3 -8
  35. package/.claude/skills/workflow-commands/prrun.md +6 -12
  36. package/.claude/skills/workflow-commands/retrospective.md +5 -5
  37. package/.claude/skills/workflow-commands/split-assessment.md +14 -4
  38. package/.claude/skills/workflow-commands/target-repository.md +1 -2
  39. package/.claude/skills/workflow-commands/working-tree-hold.md +11 -13
  40. package/.codex/hooks.json +6 -6
  41. package/.github/actions/setup-node/action.yml +10 -1
  42. package/.github/actions/setup-pnpm/action.yml +1 -1
  43. package/.github/dependabot.yml +16 -0
  44. package/.github/release.yml +0 -2
  45. package/.github/workflows/ci.yml +121 -11
  46. package/.github/workflows/publish.yml +10 -3
  47. package/.github/workflows/sonar-qube.yml +1 -0
  48. package/.prettierignore +2 -0
  49. package/.vscode/tasks.json +1 -2
  50. package/CLAUDE.md +4 -8
  51. package/README.md +4 -2
  52. package/SECURITY.md +1 -1
  53. package/cspell/index.yaml +7 -0
  54. package/dist/CLAUDE.md +4 -8
  55. package/dist/commands/document-read-cli.js +882 -0
  56. package/dist/commands/{document-section-cli.js → document-section-main.js} +137 -62
  57. package/dist/commands/read-set-cli.js +1867 -0
  58. package/dist/commands/run-prep-main.js +21653 -0
  59. package/dist/commands/run-step-cli.js +23880 -0
  60. package/dist/config-merge/index.js +5 -1
  61. package/dist/hooks/audit-provision.js +20 -35
  62. package/dist/hooks/{chunk-DGT54IH5.js → chunk-AZX4FGQ3.js} +63 -17
  63. package/dist/hooks/chunk-CWMBGKYW.js +6483 -0
  64. package/dist/hooks/chunk-O2YBIDSI.js +4306 -0
  65. package/dist/hooks/{chunk-AS74OU3D.js → chunk-PT5R6UJD.js} +4582 -2118
  66. package/dist/hooks/chunk-TUIFS5E7.js +72 -0
  67. package/dist/hooks/{chunk-723HKZO5.js → chunk-VWWCFGWK.js} +1 -1
  68. package/dist/hooks/{chunk-E7OIKX5Z.js → chunk-WR2KQAYZ.js} +1863 -382
  69. package/dist/hooks/{chunk-KC5AK2GF.js → chunk-XGBNSWEI.js} +248 -46
  70. package/dist/hooks/chunk-YCDOIR3I.js +3456 -0
  71. package/dist/hooks/codex-hook-adapter.js +10 -19
  72. package/dist/hooks/format-edited.js +5 -5
  73. package/dist/hooks/inputs.json +436 -257
  74. package/dist/hooks/pretool-guard.js +7 -22
  75. package/dist/hooks/session-lang.js +380 -42
  76. package/dist/hooks/stop-guard.js +8711 -782
  77. package/dist/josh.js +5263 -997
  78. package/dist/self-sync-guard/index.js +74 -10
  79. package/dist/version/index.js +115 -406
  80. package/eslint/base.js +1 -1
  81. package/lefthook/base.yml +8 -4
  82. package/package.json +17 -53
  83. package/pnpm-workspace.yaml +4 -2
  84. package/prompts/coding-standards.md +1 -1
  85. package/prompts/collaboration-workflow/file-edits.md +1 -9
  86. package/prompts/collaboration-workflow/gh-rest.md +1 -2
  87. package/prompts/collaboration-workflow/issue-citation.md +2 -4
  88. package/prompts/collaboration-workflow/issue-template.md +42 -17
  89. package/prompts/collaboration-workflow/lane-instructions.md +34 -0
  90. package/prompts/collaboration-workflow/measurement.md +37 -0
  91. package/prompts/collaboration-workflow/operating-rules.md +6 -12
  92. package/prompts/collaboration-workflow/output-bounds.md +4 -9
  93. package/prompts/collaboration-workflow/overview.md +1 -1
  94. package/prompts/collaboration-workflow/plan-comment.md +3 -42
  95. package/prompts/collaboration-workflow/principles.md +19 -8
  96. package/prompts/collaboration-workflow/report-format.md +37 -57
  97. package/prompts/collaboration-workflow/residency.md +12 -8
  98. package/prompts/collaboration-workflow/rule-delivery.md +3 -11
  99. package/prompts/collaboration-workflow/shell-body.md +8 -18
  100. package/prompts/collaboration-workflow/turn-batching.md +4 -6
  101. package/prompts/collaboration-workflow/upstream-interrupt.md +16 -6
  102. package/prompts/collaboration-workflow/wip-cap.md +7 -7
  103. package/prompts/collaboration-workflow.md +4 -7
  104. package/prompts/refactoring.md +1 -1
  105. package/prompts/review-rubric.md +1 -2
  106. package/prompts/review.md +45 -26
  107. package/prompts/testing-guide.md +10 -45
  108. package/scripts/agent/agent-argv.ts +20 -4
  109. package/scripts/agent/agent-event.ts +15 -15
  110. package/scripts/agent/agent-exit-record.ts +13 -1
  111. package/scripts/agent/agent-role-profile.ts +101 -45
  112. package/scripts/agent/agent-safe-text.ts +60 -0
  113. package/scripts/agent/api-auth.ts +41 -0
  114. package/scripts/agent/api-outage.ts +1 -1
  115. package/scripts/agent/claude-agent-argv.ts +14 -0
  116. package/scripts/agent/codex-agent-argv.ts +2 -0
  117. package/scripts/agent/lane-instructions.ts +144 -0
  118. package/scripts/auto-ok/auto-ok-cli.ts +14 -16
  119. package/scripts/auto-ok/auto-ok-judge-read.ts +12 -3
  120. package/scripts/auto-ok/auto-ok-judge-write.ts +46 -19
  121. package/scripts/auto-ok/auto-ok-judge.ts +13 -2
  122. package/scripts/auto-ok/auto-ok-main.ts +17 -0
  123. package/scripts/backlog/backlog-arrival.ts +14 -3
  124. package/scripts/backlog/backlog-budget-cli.ts +7 -33
  125. package/scripts/backlog/backlog-budget-main.ts +16 -0
  126. package/scripts/backlog/backlog-budget.ts +6 -7
  127. package/scripts/backlog/backlog-defect-priority.ts +4 -3
  128. package/scripts/backlog/backlog-drive-adopt.ts +67 -0
  129. package/scripts/backlog/backlog-drive-args.ts +4 -5
  130. package/scripts/backlog/backlog-drive-cli.ts +113 -28
  131. package/scripts/backlog/backlog-drive-hold.ts +162 -0
  132. package/scripts/backlog/backlog-drive-idle.ts +151 -0
  133. package/scripts/backlog/backlog-drive-judge.ts +25 -0
  134. package/scripts/backlog/backlog-drive-memory.ts +126 -0
  135. package/scripts/backlog/backlog-drive-named-offer.ts +5 -10
  136. package/scripts/backlog/backlog-drive-named.ts +54 -7
  137. package/scripts/backlog/backlog-drive-offer-argv.ts +3 -8
  138. package/scripts/backlog/backlog-drive-paused.ts +169 -0
  139. package/scripts/backlog/backlog-drive-restore.ts +39 -8
  140. package/scripts/backlog/backlog-drive-seats.ts +18 -8
  141. package/scripts/backlog/backlog-drive-token-handling.ts +38 -0
  142. package/scripts/backlog/backlog-drive.ts +79 -75
  143. package/scripts/backlog/backlog-next-main.ts +16 -0
  144. package/scripts/backlog/backlog-next-shared.ts +73 -0
  145. package/scripts/backlog/backlog-next.ts +48 -16
  146. package/scripts/backlog/backlog-occupied.ts +69 -0
  147. package/scripts/backlog/backlog-offer-cli.ts +6 -21
  148. package/scripts/backlog/backlog-offer-exclude.ts +15 -0
  149. package/scripts/backlog/backlog-offer-main.ts +12 -0
  150. package/scripts/backlog/backlog-offer.ts +36 -3
  151. package/scripts/backlog/backlog-overlap.ts +22 -4
  152. package/scripts/backlog/backlog-plan-read.ts +6 -2
  153. package/scripts/backlog/backlog-plan.ts +18 -4
  154. package/scripts/backlog/backlog-pool.ts +10 -10
  155. package/scripts/backlog/backlog-rank.ts +10 -2
  156. package/scripts/backlog/backlog-ready.ts +137 -18
  157. package/scripts/backlog/backlog-stalled-detect.ts +109 -36
  158. package/scripts/backlog/backlog-stalled.ts +52 -16
  159. package/scripts/backlog/backlog-wait-cause.ts +86 -0
  160. package/scripts/backlog/backlog-waves.ts +39 -13
  161. package/scripts/backlog/backlogrun-args.ts +19 -7
  162. package/scripts/backlog/backlogrun-cli.ts +19 -5
  163. package/scripts/backlog/backlogrun-launch.ts +6 -0
  164. package/scripts/backlog/backlogrun-restart.ts +97 -0
  165. package/scripts/backlog/backlogrun-stop.ts +79 -7
  166. package/scripts/behavior/behavior-cli.ts +2 -2
  167. package/scripts/behavior/behavior-rules.ts +47 -24
  168. package/scripts/build/build-bin.ts +2 -16
  169. package/scripts/build/build-claude-md.ts +0 -7
  170. package/scripts/build/build-commands.ts +0 -13
  171. package/scripts/build/build-hooks.ts +49 -48
  172. package/scripts/build/hook-bundle-stamp.ts +29 -11
  173. package/scripts/build/local-bin.ts +1 -1
  174. package/scripts/cases/cases-cli.ts +25 -13
  175. package/scripts/cases/cases-interaction-scan.ts +134 -0
  176. package/scripts/cases/cases-interaction.ts +183 -0
  177. package/scripts/cases/cases-logic.ts +39 -6
  178. package/scripts/ci/pr-classification-main.ts +18 -0
  179. package/scripts/ci/pr-classification.ts +10 -17
  180. package/scripts/clone/clone-scan.ts +1 -1
  181. package/scripts/cost-runtime/cost-blocks.ts +22 -37
  182. package/scripts/cost-runtime/cost-cli.ts +31 -14
  183. package/scripts/cost-runtime/cost-main.ts +12 -0
  184. package/scripts/cost-runtime/cost-transcript.ts +1 -0
  185. package/scripts/delegation/delegation-policy.ts +17 -4
  186. package/scripts/delegation/duplicate-read-guard.ts +2 -10
  187. package/scripts/delegation/investigation-guard.ts +15 -73
  188. package/scripts/delegation/investigation-reads.ts +3 -5
  189. package/scripts/dependabot/dependabot-cooldown.ts +194 -0
  190. package/scripts/discovery/repo-discovery.ts +24 -6
  191. package/scripts/doctor/doctor-consumer.ts +2 -5
  192. package/scripts/document/document-byte-budget.ts +9 -6
  193. package/scripts/document/document-scan.ts +1 -1
  194. package/scripts/document/document-section-cli.ts +17 -13
  195. package/scripts/document/document-section-main.ts +12 -0
  196. package/scripts/document/entry-read-budget.ts +2 -2
  197. package/scripts/document/read-set-cli.ts +4 -1
  198. package/scripts/epic/epic-audit-cli.ts +12 -6
  199. package/scripts/epic/epic-audit-orphans.ts +5 -8
  200. package/scripts/epic/epic-audit.ts +52 -1
  201. package/scripts/epic/epic-bundle-apply.ts +137 -0
  202. package/scripts/epic/epic-bundle-cli.ts +32 -121
  203. package/scripts/epic/epic-bundle-evidence.ts +49 -26
  204. package/scripts/epic/epic-bundle-format.ts +116 -0
  205. package/scripts/epic/epic-bundle-main.ts +17 -0
  206. package/scripts/epic/epic-bundle-referenced.ts +14 -3
  207. package/scripts/epic/epic-bundle.ts +17 -9
  208. package/scripts/epic/epic-busy.ts +5 -12
  209. package/scripts/epic/epic-classify.ts +24 -15
  210. package/scripts/epic/epic-cli-argv.ts +31 -0
  211. package/scripts/epic/epic-cli-decide.ts +42 -0
  212. package/scripts/epic/epic-cli.ts +6 -38
  213. package/scripts/epic/epic-close.ts +112 -55
  214. package/scripts/epic/epic-cross-repo.ts +4 -7
  215. package/scripts/epic/epic-decide.ts +119 -0
  216. package/scripts/epic/epic-decision.ts +9 -0
  217. package/scripts/epic/epic-fetch.ts +4 -0
  218. package/scripts/epic/epic-graph.ts +2 -0
  219. package/scripts/epic/epic-issue.ts +5 -1
  220. package/scripts/epic/epic-label-age.ts +1 -1
  221. package/scripts/epic/epic-lane-offer.ts +39 -4
  222. package/scripts/epic/epic-next-main.ts +24 -0
  223. package/scripts/epic/epic-next.ts +6 -24
  224. package/scripts/epic/epic-outside-blocker.ts +6 -2
  225. package/scripts/epic/epic-parse.ts +9 -3
  226. package/scripts/epic/epic-read.ts +1 -0
  227. package/scripts/epic/epic-reconcile.ts +39 -0
  228. package/scripts/epic/epic-run.ts +10 -1
  229. package/scripts/epic/epic-solo.ts +50 -14
  230. package/scripts/epic/epic.ts +41 -7
  231. package/scripts/exports/unused-members-cli.ts +2 -2
  232. package/scripts/followup/followup-checks-event.ts +8 -3
  233. package/scripts/followup/followup-coderabbit-wait.ts +82 -0
  234. package/scripts/followup/followup-review-gates.ts +81 -0
  235. package/scripts/followup/git-followup-stages.ts +13 -3
  236. package/scripts/followup/git-followup-workflow.ts +31 -60
  237. package/scripts/followup/git-pr-followup-wrapup.ts +9 -14
  238. package/scripts/followup/git-pr-followup.ts +36 -8
  239. package/scripts/fresh-machine/fresh-machine-cli.ts +1 -1
  240. package/scripts/fresh-machine/fresh-machine-run.ts +8 -8
  241. package/scripts/fresh-machine/specs/kit-test-backlogrun.json +1 -1
  242. package/scripts/gate/busy-average.ts +58 -0
  243. package/scripts/gate/check-cpu.ts +60 -0
  244. package/scripts/gate/check-inputs.ts +73 -0
  245. package/scripts/gate/check-reuse.ts +141 -0
  246. package/scripts/gate/command-memory.ts +192 -0
  247. package/scripts/gate/core-admission.ts +218 -28
  248. package/scripts/gate/core-budget-timing.ts +37 -0
  249. package/scripts/gate/core-budget.ts +150 -119
  250. package/scripts/gate/core-wait-record.ts +48 -0
  251. package/scripts/gate/core-wait.ts +162 -0
  252. package/scripts/gate/core-weights.ts +86 -0
  253. package/scripts/gate/free-cores.ts +72 -0
  254. package/scripts/gate/gate-ledger.ts +49 -7
  255. package/scripts/gate/gate-plan.ts +44 -15
  256. package/scripts/gate/gate-report.ts +29 -4
  257. package/scripts/gate/gate-run-steps.ts +195 -0
  258. package/scripts/gate/gate-skip.ts +12 -2
  259. package/scripts/gate/gate-steps.ts +12 -1
  260. package/scripts/gate/held-mark.ts +55 -0
  261. package/scripts/gate/input-fingerprint.ts +42 -0
  262. package/scripts/gate/machine-capacity.ts +124 -31
  263. package/scripts/gate/moved-paths.ts +67 -0
  264. package/scripts/gate/pre-commit-type-check.ts +14 -1
  265. package/scripts/gate/project-checks.ts +5 -12
  266. package/scripts/gate/scoped-green.ts +12 -8
  267. package/scripts/gate/since-green.ts +62 -0
  268. package/scripts/gate/toolchain-inputs.ts +115 -0
  269. package/scripts/gate/verification-gate.ts +65 -129
  270. package/scripts/gate/verification-inputs.ts +250 -0
  271. package/scripts/gh/gh-author-association.ts +96 -9
  272. package/scripts/gh/git-ai-review-scan.ts +4 -2
  273. package/scripts/gh/git-gh-api-path.ts +15 -0
  274. package/scripts/gh/git-gh-branch-rules.ts +73 -0
  275. package/scripts/gh/git-gh-conditional.ts +5 -2
  276. package/scripts/gh/git-gh-issue-read.ts +5 -1
  277. package/scripts/gh/git-gh-issue-rest.ts +1 -0
  278. package/scripts/gh/git-gh-issue-write.ts +77 -17
  279. package/scripts/gh/git-gh-issue.ts +7 -3
  280. package/scripts/gh/git-gh-poll-read.ts +89 -0
  281. package/scripts/gh/git-gh-pr-auto-merge.ts +8 -3
  282. package/scripts/gh/git-gh-pr-rest.ts +1 -1
  283. package/scripts/gh/git-gh-pr-snapshot.ts +33 -20
  284. package/scripts/gh/git-gh-pr.ts +27 -15
  285. package/scripts/gh/git-pr-checks-eval.ts +39 -7
  286. package/scripts/gh/git-pr-checks-parse.ts +39 -9
  287. package/scripts/gh/git-pr-merge-checked.ts +80 -0
  288. package/scripts/gh/git-pr.ts +13 -1
  289. package/scripts/git/base-tree.ts +19 -2
  290. package/scripts/git/changed-file-scope.ts +6 -4
  291. package/scripts/git/changed-paths.ts +18 -1
  292. package/scripts/git/git-diff-reads.ts +27 -2
  293. package/scripts/git/git-grep-hits.ts +85 -0
  294. package/scripts/git/git-location-environment.ts +1 -1
  295. package/scripts/git/git-merge-conflicts.ts +83 -0
  296. package/scripts/git/git-preflight.ts +37 -12
  297. package/scripts/git/git-push-transport.ts +1 -2
  298. package/scripts/git/git-schemas.ts +17 -7
  299. package/scripts/git/git-spawn.ts +1 -2
  300. package/scripts/git/git-status.ts +4 -4
  301. package/scripts/git/main-merge-main.ts +12 -0
  302. package/scripts/git/main-merge-regenerate.ts +78 -0
  303. package/scripts/git/main-merge.ts +39 -14
  304. package/scripts/git/main-sync-main.ts +12 -0
  305. package/scripts/git/main-sync.ts +0 -9
  306. package/scripts/git/stash/git-stash.ts +27 -4
  307. package/scripts/git/stash/{stash-pop-args.ts → stash-args.ts} +13 -10
  308. package/scripts/git/stash/stash-pop-cli.ts +6 -12
  309. package/scripts/git/stash/stash-pop-main.ts +12 -0
  310. package/scripts/git/stash/stash-push-cli.ts +76 -0
  311. package/scripts/git/stash/stash-push-main.ts +12 -0
  312. package/scripts/hooks/batch-guard.ts +5 -16
  313. package/scripts/hooks/check-commit-message-main.ts +8 -0
  314. package/scripts/hooks/check-commit-message.ts +4 -7
  315. package/scripts/hooks/format-edited-file.ts +8 -24
  316. package/scripts/hooks/pre-commit-lint.ts +118 -0
  317. package/scripts/hooks/pre-push-unit.ts +4 -2
  318. package/scripts/hooks/pretool-guard-cli.ts +1 -8
  319. package/scripts/hooks/pretool-guard.ts +57 -69
  320. package/scripts/hooks/reserved-run.ts +67 -8
  321. package/scripts/hooks/run-hook.sh +18 -11
  322. package/scripts/hooks/shell-rules-notice.ts +37 -0
  323. package/scripts/hooks/stop-actions.ts +185 -0
  324. package/scripts/hooks/stop-guard.ts +72 -27
  325. package/scripts/init/hook-command-rewrite.ts +19 -5
  326. package/scripts/init/hook-launch.ts +15 -12
  327. package/scripts/init/init-actions.ts +0 -6
  328. package/scripts/init/init-ai-copy.ts +10 -36
  329. package/scripts/init/init-bootstrap.ts +9 -8
  330. package/scripts/init/init-dry-run-report.ts +1 -1
  331. package/scripts/init/init-dry-run.ts +1 -1
  332. package/scripts/init/init-file-action.ts +7 -9
  333. package/scripts/init/init-logic-json-merge.ts +2 -2
  334. package/scripts/init/init-logic-migrate.ts +9 -82
  335. package/scripts/init/init-logic.ts +3 -2
  336. package/scripts/init/init-main.ts +12 -0
  337. package/scripts/init/init.ts +5 -12
  338. package/scripts/init/kit-development-versions.ts +3 -7
  339. package/scripts/init/kit-written-paths.ts +2 -2
  340. package/scripts/init/project-profile.ts +5 -4
  341. package/scripts/init/tsconfig-preset-migration.ts +2 -1
  342. package/scripts/init/vscode-tasks.ts +1 -1
  343. package/scripts/issue/defect-origin-cli.ts +106 -0
  344. package/scripts/issue/defect-origin-line.ts +60 -0
  345. package/scripts/issue/defect-origin-main.ts +11 -0
  346. package/scripts/issue/defect-origin.ts +114 -0
  347. package/scripts/issue/defect-rate-cli.ts +34 -78
  348. package/scripts/issue/defect-rate.ts +0 -16
  349. package/scripts/issue/defect-report-cli.ts +128 -0
  350. package/scripts/issue/defect-report-format.ts +56 -0
  351. package/scripts/issue/defect-report-main.ts +11 -0
  352. package/scripts/issue/defect-report.ts +160 -0
  353. package/scripts/issue/expected-effect-lint.ts +60 -0
  354. package/scripts/issue/issue-already-done-cli.ts +62 -0
  355. package/scripts/issue/issue-body-or-comment.ts +40 -0
  356. package/scripts/issue/issue-cite-cli.ts +33 -22
  357. package/scripts/issue/issue-cite-main.ts +12 -0
  358. package/scripts/issue/issue-classification.ts +13 -8
  359. package/scripts/issue/issue-comment-cli.ts +10 -24
  360. package/scripts/issue/issue-comment-main.ts +12 -0
  361. package/scripts/issue/issue-evidence-exit.ts +100 -0
  362. package/scripts/issue/issue-file-cli.ts +29 -7
  363. package/scripts/issue/issue-file.ts +19 -19
  364. package/scripts/issue/issue-fold-cli.ts +2 -11
  365. package/scripts/issue/issue-fold-main.ts +12 -0
  366. package/scripts/issue/issue-labels.ts +81 -90
  367. package/scripts/issue/issue-lint-cli.ts +7 -13
  368. package/scripts/issue/issue-lint-main.ts +12 -0
  369. package/scripts/issue/issue-measured-cli.ts +56 -0
  370. package/scripts/issue/issue-merged.ts +19 -2
  371. package/scripts/issue/issue-not-before-label.ts +135 -0
  372. package/scripts/issue/issue-not-before.ts +111 -0
  373. package/scripts/issue/issue-number-shape.ts +15 -1
  374. package/scripts/issue/issue-park.ts +28 -0
  375. package/scripts/issue/issue-plan-cli.ts +151 -0
  376. package/scripts/issue/issue-priority.ts +151 -0
  377. package/scripts/issue/issue-rank.ts +7 -1
  378. package/scripts/issue/issue-read-cli.ts +3 -10
  379. package/scripts/issue/issue-read-main.ts +12 -0
  380. package/scripts/issue/issue-read.ts +29 -5
  381. package/scripts/issue/issue-release-cli.ts +0 -10
  382. package/scripts/issue/issue-release-main.ts +13 -0
  383. package/scripts/issue/issue-release.ts +7 -12
  384. package/scripts/issue/issue-sample-gate.ts +192 -0
  385. package/scripts/issue/issue-sample-source.ts +76 -0
  386. package/scripts/issue/issue-scout-cli.ts +19 -25
  387. package/scripts/issue/issue-scout-main.ts +14 -0
  388. package/scripts/issue/issue-state-cli.ts +0 -10
  389. package/scripts/issue/issue-state-main.ts +12 -0
  390. package/scripts/issue/issue-watch-diff.ts +56 -15
  391. package/scripts/issue/issue-watch.ts +2 -1
  392. package/scripts/issue/issue-wip.ts +2 -7
  393. package/scripts/issue/markdown-section.ts +19 -5
  394. package/scripts/issue/measure-rerun-cli.ts +13 -8
  395. package/scripts/issue/plan-consumers-cli.ts +39 -0
  396. package/scripts/issue/plan-consumers-main.ts +11 -0
  397. package/scripts/issue/plan-consumers-section.ts +55 -0
  398. package/scripts/issue/plan-consumers.ts +127 -0
  399. package/scripts/josh/agent-session-environment.ts +1 -1
  400. package/scripts/josh/command-usage.ts +82 -0
  401. package/scripts/josh/file-map-stamp.ts +49 -16
  402. package/scripts/josh/hook-decision.ts +32 -20
  403. package/scripts/josh/josh-command-map.ts +6 -1
  404. package/scripts/josh/josh-command-types.ts +65 -13
  405. package/scripts/josh/josh-commands-agent-hooks.ts +83 -0
  406. package/scripts/josh/josh-commands-ai.ts +169 -157
  407. package/scripts/josh/josh-commands-backlog.ts +82 -16
  408. package/scripts/josh/josh-commands-clone.ts +1 -0
  409. package/scripts/josh/josh-commands-development.ts +111 -71
  410. package/scripts/josh/josh-commands-document.ts +43 -1
  411. package/scripts/josh/josh-commands-epic.ts +171 -0
  412. package/scripts/josh/josh-commands-hooks.ts +31 -2
  413. package/scripts/josh/josh-commands-issue-write.ts +181 -0
  414. package/scripts/josh/josh-commands-issue.ts +124 -24
  415. package/scripts/josh/josh-commands-lane.ts +112 -2
  416. package/scripts/josh/josh-commands-lint.ts +19 -8
  417. package/scripts/josh/josh-commands-maintenance.ts +112 -4
  418. package/scripts/josh/josh-commands-pause.ts +29 -0
  419. package/scripts/josh/josh-commands-progress.ts +87 -0
  420. package/scripts/josh/josh-commands-project.ts +138 -9
  421. package/scripts/josh/josh-commands-review.ts +124 -0
  422. package/scripts/josh/josh-commands-run.ts +211 -23
  423. package/scripts/josh/josh-commands-ship.ts +169 -0
  424. package/scripts/josh/josh-commands-split.ts +9 -0
  425. package/scripts/josh/josh-commands-versioning.ts +49 -2
  426. package/scripts/josh/josh-commands-workflow.ts +149 -6
  427. package/scripts/josh/josh-logic.ts +11 -27
  428. package/scripts/josh/josh.ts +14 -5
  429. package/scripts/josh/package-directory.ts +18 -0
  430. package/scripts/josh/process-identity.ts +13 -4
  431. package/scripts/josh/session-language-cli.ts +4 -8
  432. package/scripts/josh/session-language-main.ts +13 -0
  433. package/scripts/josh/session-language.ts +6 -1
  434. package/scripts/josh/shared-cache.ts +90 -0
  435. package/scripts/josh/stamp-file.ts +9 -15
  436. package/scripts/lane/lane-await.ts +51 -12
  437. package/scripts/lane/lane-cache.ts +5 -30
  438. package/scripts/lane/lane-capacity.ts +19 -22
  439. package/scripts/lane/lane-check-stats.ts +97 -0
  440. package/scripts/lane/lane-child-invocation.ts +43 -4
  441. package/scripts/lane/lane-cli.ts +15 -5
  442. package/scripts/lane/lane-close.ts +86 -18
  443. package/scripts/lane/lane-core-wait-stats.ts +66 -0
  444. package/scripts/lane/lane-dispatch.ts +27 -6
  445. package/scripts/lane/lane-gap-stats.ts +156 -0
  446. package/scripts/lane/lane-guard-policy.ts +2 -2
  447. package/scripts/lane/lane-handoff.ts +76 -1
  448. package/scripts/lane/lane-held-stats.ts +129 -0
  449. package/scripts/lane/lane-install.ts +16 -15
  450. package/scripts/lane/lane-launch-cli.ts +0 -9
  451. package/scripts/lane/lane-launch-main.ts +12 -0
  452. package/scripts/lane/lane-ledger-schema.ts +266 -0
  453. package/scripts/lane/lane-ledger.ts +108 -97
  454. package/scripts/lane/lane-limit-cli.ts +19 -9
  455. package/scripts/lane/lane-measure-cli.ts +58 -10
  456. package/scripts/lane/lane-open.ts +9 -1
  457. package/scripts/lane/lane-parked.ts +3 -3
  458. package/scripts/lane/lane-pause-cli.ts +130 -0
  459. package/scripts/lane/lane-pause.ts +158 -0
  460. package/scripts/lane/lane-preserve.ts +29 -1
  461. package/scripts/lane/lane-process-table.ts +166 -0
  462. package/scripts/lane/lane-reap-settle.ts +124 -0
  463. package/scripts/lane/lane-reap.ts +50 -15
  464. package/scripts/lane/lane-registry.ts +33 -10
  465. package/scripts/lane/lane-residents.ts +162 -0
  466. package/scripts/lane/lane-restart.ts +26 -27
  467. package/scripts/lane/lane-round-two-stats.ts +49 -0
  468. package/scripts/lane/lane-sampler.ts +4 -0
  469. package/scripts/lane/lane-session-action.ts +160 -0
  470. package/scripts/lane/lane-session-broker.ts +134 -134
  471. package/scripts/lane/lane-snapshot-trace.ts +84 -0
  472. package/scripts/lane/lane-spans.ts +51 -0
  473. package/scripts/lane/lane-spent.ts +6 -3
  474. package/scripts/lane/lane-stage-stats.ts +7 -2
  475. package/scripts/lane/lane-state.ts +302 -0
  476. package/scripts/lane/lane-stats.ts +58 -4
  477. package/scripts/lane/lane-stop-stats.ts +113 -37
  478. package/scripts/lane/lane-test-related-stats.ts +127 -0
  479. package/scripts/lane/lane-transcript-calls.ts +145 -0
  480. package/scripts/lane/lane-transcript-stats.ts +168 -0
  481. package/scripts/lane/lane-vacant.ts +13 -3
  482. package/scripts/lane/lane-withdraw-cli.ts +72 -0
  483. package/scripts/lane/lane-withdraw.ts +183 -0
  484. package/scripts/lane/process-directories.ts +70 -0
  485. package/scripts/lane/process-lane-marks.ts +94 -0
  486. package/scripts/lib/atomic-write.ts +62 -0
  487. package/scripts/lib/buffered-process.ts +12 -5
  488. package/scripts/lib/cli-flags.ts +53 -0
  489. package/scripts/lib/figure-format.ts +63 -0
  490. package/scripts/lib/json-value.ts +9 -1
  491. package/scripts/lib/package-manifest.ts +35 -0
  492. package/scripts/lib/read-file.ts +3 -1
  493. package/scripts/lib/stamped-memo.ts +63 -0
  494. package/scripts/lib/stdout-on-stderr.ts +24 -0
  495. package/scripts/lib/timeouts.ts +9 -0
  496. package/scripts/lib/transcript-record.ts +91 -0
  497. package/scripts/lines/effective-limit.ts +1 -1
  498. package/scripts/lint/eslint-cache-dependencies.ts +145 -0
  499. package/scripts/lint/eslint-daemon.ts +265 -0
  500. package/scripts/lint/format.ts +14 -5
  501. package/scripts/lint/import-graph.ts +279 -0
  502. package/scripts/lint/lint-gate-scope.ts +102 -0
  503. package/scripts/lint/lint-parallel-main.ts +19 -0
  504. package/scripts/lint/lint-parallel.ts +72 -33
  505. package/scripts/lint/lint-related-scope.ts +33 -24
  506. package/scripts/lint/lint-related.ts +38 -6
  507. package/scripts/notify/confirmation-options.ts +1 -2
  508. package/scripts/notify/telegram-notify.ts +20 -20
  509. package/scripts/notify/telegram-test-logic.ts +0 -1
  510. package/scripts/notify/telegram-test-main.ts +8 -0
  511. package/scripts/notify/telegram-test.ts +12 -11
  512. package/scripts/observations/observation-ledger.ts +13 -0
  513. package/scripts/observations/observations-flush-landing.ts +5 -3
  514. package/scripts/observations/observations-flush.ts +6 -1
  515. package/scripts/overrides/overrides-check.ts +2 -5
  516. package/scripts/overrides/overrides-files.ts +2 -1
  517. package/scripts/overrides/overrides-logic.ts +3 -6
  518. package/scripts/package/verify-optional-eslint-install.ts +8 -6
  519. package/scripts/propagate/propagate-publish.ts +2 -7
  520. package/scripts/propagate/propagate-targets.ts +4 -12
  521. package/scripts/refactor/import-graph.ts +9 -7
  522. package/scripts/release/github-release-runs.ts +17 -6
  523. package/scripts/release/release-approval-prune.ts +18 -0
  524. package/scripts/release/release-history.ts +1 -3
  525. package/scripts/release/release-progress.ts +42 -22
  526. package/scripts/release/release-publish-run.ts +39 -0
  527. package/scripts/release/release-publish.ts +6 -6
  528. package/scripts/release/release-scope-cli.ts +0 -10
  529. package/scripts/release/release-scope-main.ts +12 -0
  530. package/scripts/repo/repo-setting.ts +3 -6
  531. package/scripts/repo/required-checks-logic.ts +6 -15
  532. package/scripts/report/report-format-reference.ts +4 -0
  533. package/scripts/report/report-labels.ts +155 -0
  534. package/scripts/report/report-lint-cli.ts +3 -0
  535. package/scripts/report/report-lint.ts +85 -110
  536. package/scripts/report/report-template-cli.ts +59 -0
  537. package/scripts/report/report-template.ts +112 -0
  538. package/scripts/review/acceptance-map-check.ts +61 -0
  539. package/scripts/review/acceptance-map.ts +206 -0
  540. package/scripts/review/removed-tests-check.ts +86 -0
  541. package/scripts/review/removed-tests.ts +149 -0
  542. package/scripts/review/review-brief-cli.ts +82 -16
  543. package/scripts/review/review-brief-main.ts +12 -0
  544. package/scripts/review/review-brief.ts +31 -3
  545. package/scripts/review/review-code-tree.ts +10 -6
  546. package/scripts/review/review-comment-round.ts +26 -8
  547. package/scripts/review/review-finding-ledger.ts +30 -15
  548. package/scripts/review/review-interaction.ts +94 -0
  549. package/scripts/review/review-readers-scan.ts +163 -0
  550. package/scripts/review/review-record-cli.ts +69 -30
  551. package/scripts/review/review-record-main.ts +12 -0
  552. package/scripts/review/review-round-one-blobs.ts +221 -0
  553. package/scripts/review/review-round2-cli.ts +49 -12
  554. package/scripts/review/review-round2.ts +80 -12
  555. package/scripts/review/review-stamps.ts +19 -1
  556. package/scripts/review/review-stop-log.ts +96 -0
  557. package/scripts/review/review-stops-cli.ts +85 -0
  558. package/scripts/review/review-tree.ts +6 -17
  559. package/scripts/review/review-untouched-readers.ts +146 -0
  560. package/scripts/review/test-titles.ts +118 -0
  561. package/scripts/rules/agent-model.ts +67 -0
  562. package/scripts/rules/bash-triggers.ts +46 -3
  563. package/scripts/rules/decision-oracle-batch.ts +9 -1
  564. package/scripts/rules/decision-oracle.ts +2 -2
  565. package/scripts/rules/delivered-rules.ts +90 -3
  566. package/scripts/rules/destructive-command.ts +8 -1
  567. package/scripts/rules/direct-filing.ts +10 -2
  568. package/scripts/rules/direct-issue-comment.ts +117 -0
  569. package/scripts/rules/direct-pr-create.ts +69 -3
  570. package/scripts/rules/early-heartbeat.ts +2 -1
  571. package/scripts/rules/file-body.ts +7 -0
  572. package/scripts/rules/filing-cap.ts +8 -0
  573. package/scripts/rules/firing-point.ts +6 -5
  574. package/scripts/rules/git-argv.ts +72 -14
  575. package/scripts/rules/git-force.ts +12 -2
  576. package/scripts/rules/guard-remedy.ts +121 -0
  577. package/scripts/rules/implementation-cut-verdict.ts +1 -1
  578. package/scripts/rules/implementation-cut.ts +11 -3
  579. package/scripts/rules/index-guard.ts +8 -1
  580. package/scripts/rules/issue-comments.ts +76 -7
  581. package/scripts/rules/josh-git-bare.ts +7 -0
  582. package/scripts/rules/lane-background.ts +67 -25
  583. package/scripts/rules/lane-carry-conflict.ts +6 -0
  584. package/scripts/rules/lane-direct-tool.ts +74 -0
  585. package/scripts/rules/lane-interactive-ask.ts +9 -2
  586. package/scripts/rules/lane-park.ts +45 -23
  587. package/scripts/rules/lane-split-park.ts +10 -2
  588. package/scripts/rules/lane-switch-main.ts +7 -0
  589. package/scripts/rules/last-prompt.ts +50 -5
  590. package/scripts/rules/oracle-consulted.ts +10 -0
  591. package/scripts/rules/oracle-firing.ts +1 -0
  592. package/scripts/rules/oracle-list-cli.ts +7 -0
  593. package/scripts/rules/permission-guards.ts +3 -0
  594. package/scripts/rules/piped-verification.ts +4 -2
  595. package/scripts/rules/poll-loop.ts +7 -0
  596. package/scripts/rules/pr-merge.ts +123 -0
  597. package/scripts/rules/protected-files.ts +32 -5
  598. package/scripts/rules/raw-field-body.ts +6 -0
  599. package/scripts/rules/rule-body-guard.ts +8 -0
  600. package/scripts/rules/rule-list.ts +12 -28
  601. package/scripts/rules/rule-rewrite.ts +114 -0
  602. package/scripts/rules/rule-value-cache.ts +4 -9
  603. package/scripts/rules/rule-value-cli.ts +51 -32
  604. package/scripts/rules/rule-value.ts +8 -2
  605. package/scripts/rules/shell-segments.ts +50 -0
  606. package/scripts/rules/stop-decision.ts +77 -0
  607. package/scripts/rules/stop-rule-rows.ts +64 -0
  608. package/scripts/rules/stop-rules.ts +150 -51
  609. package/scripts/rules/tail-commands.ts +15 -1
  610. package/scripts/rules/test-declared-commit.ts +11 -1
  611. package/scripts/rules/third-party-write.ts +7 -0
  612. package/scripts/rules/timed-rerun.ts +69 -0
  613. package/scripts/rules/worktree-guard.ts +13 -3
  614. package/scripts/run/board/run-board-app-name.ts +23 -0
  615. package/scripts/run/board/run-board-cli.ts +65 -30
  616. package/scripts/run/board/run-board-closed.ts +8 -2
  617. package/scripts/run/board/run-board-earlier.ts +94 -0
  618. package/scripts/run/board/run-board-ending-reason.ts +67 -0
  619. package/scripts/run/board/run-board-estimate-schedule.ts +103 -0
  620. package/scripts/run/board/run-board-estimate.ts +98 -0
  621. package/scripts/run/board/run-board-fit.ts +153 -36
  622. package/scripts/run/board/run-board-fold.ts +123 -0
  623. package/scripts/run/board/run-board-fresh.ts +2 -2
  624. package/scripts/run/board/run-board-gather-live.ts +29 -0
  625. package/scripts/run/board/run-board-gather-thread.ts +189 -0
  626. package/scripts/run/board/run-board-gather-worker.ts +29 -0
  627. package/scripts/run/board/run-board-gather.ts +187 -0
  628. package/scripts/run/board/run-board-github.ts +119 -31
  629. package/scripts/run/board/run-board-header.ts +86 -21
  630. package/scripts/run/board/run-board-keys.ts +58 -0
  631. package/scripts/run/board/run-board-kind.ts +20 -6
  632. package/scripts/run/board/run-board-labels.ts +118 -71
  633. package/scripts/run/board/run-board-lane-state.ts +109 -0
  634. package/scripts/run/board/run-board-lane-time.ts +122 -0
  635. package/scripts/run/board/run-board-layout.ts +240 -61
  636. package/scripts/run/board/run-board-length.ts +52 -0
  637. package/scripts/run/board/run-board-machine.ts +8 -4
  638. package/scripts/run/board/run-board-main.ts +12 -0
  639. package/scripts/run/board/run-board-notes.ts +52 -31
  640. package/scripts/run/board/run-board-now.ts +1 -1
  641. package/scripts/run/board/run-board-operation.ts +15 -33
  642. package/scripts/run/board/run-board-phase.ts +1 -1
  643. package/scripts/run/board/run-board-plan-shared.ts +115 -0
  644. package/scripts/run/board/run-board-plan.ts +55 -3
  645. package/scripts/run/board/run-board-planning.ts +45 -0
  646. package/scripts/run/board/run-board-priority.ts +44 -0
  647. package/scripts/run/board/run-board-process-groups.ts +195 -0
  648. package/scripts/run/board/run-board-read.ts +153 -13
  649. package/scripts/run/board/run-board-reason.ts +238 -45
  650. package/scripts/run/board/run-board-released.ts +35 -0
  651. package/scripts/run/board/run-board-render-checks.ts +39 -5
  652. package/scripts/run/board/run-board-render-condition.ts +96 -0
  653. package/scripts/run/board/run-board-render-drawn.ts +67 -0
  654. package/scripts/run/board/run-board-render-foot.ts +59 -0
  655. package/scripts/run/board/run-board-render-icon.ts +35 -0
  656. package/scripts/run/board/run-board-render-lanes.ts +145 -0
  657. package/scripts/run/board/run-board-render-lead.ts +80 -0
  658. package/scripts/run/board/run-board-render-legend.ts +117 -47
  659. package/scripts/run/board/run-board-render-notes.ts +156 -29
  660. package/scripts/run/board/run-board-render-processes.ts +196 -0
  661. package/scripts/run/board/run-board-render-section.ts +119 -0
  662. package/scripts/run/board/run-board-render-slot.ts +3 -36
  663. package/scripts/run/board/run-board-render-tail.ts +115 -48
  664. package/scripts/run/board/run-board-render-time.ts +56 -0
  665. package/scripts/run/board/run-board-render-title.ts +117 -24
  666. package/scripts/run/board/run-board-render-waits.ts +125 -0
  667. package/scripts/run/board/run-board-render.ts +206 -259
  668. package/scripts/run/board/run-board-roots.ts +54 -0
  669. package/scripts/run/board/run-board-row-yield.ts +10 -4
  670. package/scripts/run/board/run-board-setup.ts +1 -12
  671. package/scripts/run/board/run-board-snapshot.ts +111 -0
  672. package/scripts/run/board/run-board-spin.ts +2 -2
  673. package/scripts/run/board/run-board-state.ts +23 -29
  674. package/scripts/run/board/run-board-status.ts +206 -79
  675. package/scripts/run/board/run-board-thanks-read.ts +2 -2
  676. package/scripts/run/board/run-board-tick.ts +123 -104
  677. package/scripts/run/board/run-board-usage-board.ts +78 -0
  678. package/scripts/run/board/run-board-usage-lanes.ts +113 -0
  679. package/scripts/run/board/run-board-usage-listing.ts +93 -0
  680. package/scripts/run/board/run-board-usage-read.ts +120 -150
  681. package/scripts/run/board/run-board-usage-rusage.ts +19 -7
  682. package/scripts/run/board/run-board-usage-text.ts +139 -51
  683. package/scripts/run/board/run-board-usage-top.ts +102 -0
  684. package/scripts/run/board/run-board-usage.ts +89 -72
  685. package/scripts/run/board/run-board-usual.ts +20 -9
  686. package/scripts/run/carry/run-carry-args.ts +4 -7
  687. package/scripts/run/carry/run-carry-conversation.ts +1 -1
  688. package/scripts/run/carry/run-carry.ts +9 -4
  689. package/scripts/run/cut/run-cut-cli.ts +3 -2
  690. package/scripts/run/cut/run-cut-handoff.ts +2 -2
  691. package/scripts/run/cut/run-cut-report.ts +16 -0
  692. package/scripts/run/detached-launch.ts +23 -4
  693. package/scripts/run/entry/run-entry-cli.ts +8 -1
  694. package/scripts/run/event/run-event-cli.ts +1 -5
  695. package/scripts/run/event/run-event-filed.ts +12 -6
  696. package/scripts/run/event/run-event-follow.ts +2 -3
  697. package/scripts/run/event/run-event-render.ts +7 -10
  698. package/scripts/run/event/run-event-scope.ts +20 -2
  699. package/scripts/run/event/run-event-stream-emit.ts +78 -11
  700. package/scripts/run/event/run-event-stream.ts +37 -7
  701. package/scripts/run/hold/run-hold-adopt.ts +65 -0
  702. package/scripts/run/hold/run-hold-cli.ts +93 -22
  703. package/scripts/run/hold/run-hold-main.ts +12 -0
  704. package/scripts/run/hold/run-hold-member.ts +37 -0
  705. package/scripts/run/hold/run-hold-session.ts +46 -0
  706. package/scripts/run/hold/run-hold.ts +7 -1
  707. package/scripts/run/hold/run-stop-notify.ts +183 -0
  708. package/scripts/run/launch-priority.ts +32 -0
  709. package/scripts/run/merge/run-merge-auth.ts +31 -0
  710. package/scripts/run/merge/run-merge-cli.ts +72 -107
  711. package/scripts/run/merge/run-merge-close.ts +74 -0
  712. package/scripts/run/merge/run-merge-collect.ts +6 -13
  713. package/scripts/run/merge/run-merge-driver.ts +71 -0
  714. package/scripts/run/merge/run-merge-main.ts +12 -0
  715. package/scripts/run/merge/run-merge-outcome.ts +23 -0
  716. package/scripts/run/merge/run-merge-restart.ts +39 -0
  717. package/scripts/run/merge/run-merge-ship.ts +20 -4
  718. package/scripts/run/merge/run-merge-signals.ts +123 -0
  719. package/scripts/run/merge/run-merge-steps.ts +128 -83
  720. package/scripts/run/merge/run-merge.ts +53 -40
  721. package/scripts/run/park/run-park-cli.ts +91 -0
  722. package/scripts/run/park/run-park.ts +88 -0
  723. package/scripts/run/park/run-stalled.ts +68 -0
  724. package/scripts/run/pause/run-pause-cli.ts +73 -0
  725. package/scripts/run/pause/run-pause.ts +251 -0
  726. package/scripts/run/progress/run-progress-cli.ts +4 -12
  727. package/scripts/run/progress/run-progress-clock.ts +1 -1
  728. package/scripts/run/progress/run-progress-config.ts +6 -14
  729. package/scripts/run/progress/run-progress-main.ts +12 -0
  730. package/scripts/run/progress/run-progress.ts +1 -4
  731. package/scripts/run/review/run-review.ts +2 -1
  732. package/scripts/run/run-ending.ts +1 -0
  733. package/scripts/run/run-invocation.ts +5 -6
  734. package/scripts/run/run-liveness-cli.ts +6 -8
  735. package/scripts/run/run-liveness.ts +61 -30
  736. package/scripts/run/run-next.ts +1 -1
  737. package/scripts/run/run-parent-cut-hook.ts +2 -2
  738. package/scripts/run/run-poll-hook.ts +157 -0
  739. package/scripts/run/run-preflight.ts +18 -3
  740. package/scripts/run/run-prep-cli.ts +1 -10
  741. package/scripts/run/run-prep-locate.ts +7 -50
  742. package/scripts/run/run-prep-main.ts +12 -0
  743. package/scripts/run/run-prep.ts +6 -0
  744. package/scripts/run/run-report-cli.ts +101 -13
  745. package/scripts/run/run-report-handoff.ts +114 -0
  746. package/scripts/run/run-step-cli.ts +22 -15
  747. package/scripts/run/run-step-section.ts +85 -0
  748. package/scripts/run/run-step.ts +1 -1
  749. package/scripts/run/run-stranded-detect.ts +13 -0
  750. package/scripts/run/run-watcher-guard-cli.ts +1 -1
  751. package/scripts/run/run-watcher-guard.ts +1 -1
  752. package/scripts/run/ship/run-ship-args.ts +121 -0
  753. package/scripts/run/ship/run-ship-body-draft.ts +110 -0
  754. package/scripts/run/ship/run-ship-cli.ts +67 -151
  755. package/scripts/run/ship/run-ship-detach.ts +27 -7
  756. package/scripts/run/ship/run-ship-infra-retry.ts +59 -0
  757. package/scripts/run/ship/run-ship-next.ts +27 -3
  758. package/scripts/run/ship/run-ship-overlap.ts +232 -0
  759. package/scripts/run/ship/run-ship-place.ts +96 -0
  760. package/scripts/run/ship/run-ship-pre-detach-timed.ts +43 -0
  761. package/scripts/run/ship/run-ship-pre-detach.ts +102 -27
  762. package/scripts/run/ship/run-ship-preflight.ts +161 -30
  763. package/scripts/run/ship/run-ship-probe.ts +11 -3
  764. package/scripts/run/ship/run-ship-relaunch-cap.ts +70 -0
  765. package/scripts/run/ship/run-ship-removed-rows.ts +61 -0
  766. package/scripts/run/ship/run-ship-return.ts +123 -15
  767. package/scripts/run/ship/run-ship-review-steps.ts +105 -149
  768. package/scripts/run/ship/run-ship-review.ts +73 -6
  769. package/scripts/run/ship/run-ship-reviewer.ts +207 -0
  770. package/scripts/run/ship/run-ship-stage.ts +55 -6
  771. package/scripts/run/ship/run-ship-steps.ts +46 -15
  772. package/scripts/run/ship/run-ship-stop-cause.ts +135 -0
  773. package/scripts/run/ship/run-ship-stop-context.ts +206 -0
  774. package/scripts/run/ship/run-ship-stop-text.ts +11 -6
  775. package/scripts/run/ship/run-ship-sync.ts +57 -12
  776. package/scripts/run/ship/run-ship.ts +30 -2
  777. package/scripts/run/tidy/run-tidy-cli.ts +0 -4
  778. package/scripts/run/tidy/run-tidy-lanes.ts +3 -0
  779. package/scripts/run/tidy/run-tidy-main.ts +8 -0
  780. package/scripts/run/wake/run-wake-cli.ts +119 -100
  781. package/scripts/run/wake/run-wake-code.ts +83 -0
  782. package/scripts/run/wake/run-wake-driver.ts +19 -8
  783. package/scripts/run/wake/run-wake-loop.ts +34 -3
  784. package/scripts/run/wake/run-wake-main.ts +13 -0
  785. package/scripts/run/wake/run-wake-ports.ts +90 -0
  786. package/scripts/run/wake/run-wake-takeover.ts +66 -0
  787. package/scripts/run/wake/run-wake.ts +2 -1
  788. package/scripts/safe-chain/pack-hook.ts +2 -2
  789. package/scripts/safe-chain/preinstall-command.ts +2 -1
  790. package/scripts/safe-chain/project-config.ts +3 -9
  791. package/scripts/security/security-audit-main.ts +8 -0
  792. package/scripts/security/security-audit-provision-logic.ts +0 -11
  793. package/scripts/security/security-audit-provision-main.ts +12 -0
  794. package/scripts/security/security-audit-provision.ts +11 -26
  795. package/scripts/security/security-audit.ts +6 -7
  796. package/scripts/self-sync-guard/self-sync-guard-logic.ts +6 -13
  797. package/scripts/split/split-assess-cli.ts +2 -2
  798. package/scripts/split/split-assess.ts +15 -0
  799. package/scripts/split/split-measure.ts +65 -0
  800. package/scripts/sync/claude-settings-merge.ts +8 -15
  801. package/scripts/sync/directory-copy-guard.ts +4 -9
  802. package/scripts/sync/file-content.ts +78 -8
  803. package/scripts/sync/sync-ai-files.ts +3 -5
  804. package/scripts/sync/sync-configs.ts +11 -23
  805. package/scripts/sync/sync-hook-safety.ts +4 -10
  806. package/scripts/sync/sync-main.ts +11 -0
  807. package/scripts/sync/sync.ts +25 -37
  808. package/scripts/test/test-declared-changed.ts +2 -2
  809. package/scripts/test/test-declared.ts +1 -1
  810. package/scripts/test/test-e2e-guard.ts +55 -6
  811. package/scripts/test/test-e2e-stamp.ts +38 -0
  812. package/scripts/test/test-pinned-logic.ts +145 -0
  813. package/scripts/test/test-pinned-main.ts +78 -0
  814. package/scripts/test/test-pinned.ts +100 -0
  815. package/scripts/test/test-read-map.ts +264 -0
  816. package/scripts/test/test-read-recording.ts +91 -0
  817. package/scripts/test/test-read-trace.ts +148 -0
  818. package/scripts/test/test-red-main.ts +12 -0
  819. package/scripts/test/test-red.ts +12 -30
  820. package/scripts/test/test-related-main.ts +18 -0
  821. package/scripts/test/test-related-record.ts +119 -0
  822. package/scripts/test/test-related-scope.ts +229 -43
  823. package/scripts/test/test-related.ts +300 -22
  824. package/scripts/test/test-unit-guard-main.ts +15 -0
  825. package/scripts/test/test-unit-guard.ts +54 -21
  826. package/scripts/test/unit-count-file.ts +37 -0
  827. package/scripts/test/unit-run-marker.ts +162 -0
  828. package/scripts/test/unit-setup-files.ts +51 -0
  829. package/scripts/test/unit-worker-share.ts +71 -137
  830. package/scripts/test/whole-suite-files.ts +63 -0
  831. package/scripts/time-runtime/time-background.ts +20 -2
  832. package/scripts/time-runtime/time-bundles.ts +4 -3
  833. package/scripts/time-runtime/time-density-hook.ts +8 -6
  834. package/scripts/time-runtime/time-followup-stage.ts +1 -3
  835. package/scripts/time-runtime/time-format.ts +5 -28
  836. package/scripts/time-runtime/time-markers.ts +10 -1
  837. package/scripts/time-runtime/time-shell.ts +126 -14
  838. package/scripts/time-runtime/time-spans.ts +1 -0
  839. package/scripts/time-runtime/time-tool-call.ts +7 -0
  840. package/scripts/time-runtime/time-transcript-line.ts +49 -62
  841. package/scripts/uninstall/uninstall.ts +1 -1
  842. package/scripts/version/bump-version-main.ts +12 -0
  843. package/scripts/version/bump-version.ts +25 -25
  844. package/scripts/version/effective-upstream.ts +6 -12
  845. package/scripts/version/latest-corepack.ts +17 -32
  846. package/scripts/version/latest-if-required-cli.ts +93 -0
  847. package/scripts/version/latest-lane-guard-main.ts +8 -0
  848. package/scripts/version/latest-lane-guard.ts +0 -4
  849. package/scripts/version/latest-scope-cli.ts +0 -9
  850. package/scripts/version/latest-scope-main.ts +12 -0
  851. package/scripts/version/latest-update.ts +5 -5
  852. package/scripts/version/npm-registry.ts +44 -6
  853. package/scripts/version/publishable-range-check.ts +5 -16
  854. package/scripts/version/release-age.ts +1 -1
  855. package/scripts/version/release-hold.ts +1 -1
  856. package/scripts/version/release-window.ts +38 -0
  857. package/scripts/version/running-binary.ts +1 -1
  858. package/scripts/version/safe-chain-version-update.ts +3 -8
  859. package/scripts/version/version-targets.ts +6 -28
  860. package/templates/dependabot.yml +29 -0
  861. package/templates/gitignore +10 -3
  862. package/templates/pnpm-workspace.basic.yaml +1 -1
  863. package/templates/sonar-project.properties +3 -2
  864. package/templates/workflows/ci.yml +12 -4
  865. package/templates/workflows/github-release.yml +4 -0
  866. package/tsconfig.sonar.json +1 -1
  867. package/.ncurc.json +0 -3
  868. package/dist/hooks/batch-guard.js +0 -29
  869. package/dist/hooks/chunk-43ZHT22P.js +0 -3495
  870. package/dist/hooks/chunk-CDY4NFQG.js +0 -15
  871. package/dist/hooks/chunk-EUMACUK2.js +0 -2038
  872. package/dist/hooks/chunk-H5HVWYXK.js +0 -359
  873. package/dist/hooks/chunk-IIGFYXKC.js +0 -7104
  874. package/dist/hooks/chunk-IX6TTTI6.js +0 -95
  875. package/dist/hooks/chunk-J47HU5H5.js +0 -237
  876. package/dist/hooks/chunk-K4EOONYM.js +0 -45
  877. package/dist/hooks/chunk-K4LMBQC2.js +0 -68
  878. package/dist/hooks/chunk-SHGPANFB.js +0 -56
  879. package/dist/hooks/chunk-YHBZAJSV.js +0 -79
  880. package/dist/hooks/chunk-YYPI7SJZ.js +0 -131
  881. package/dist/hooks/duplicate-read-guard.js +0 -30
  882. package/dist/hooks/investigation-guard.js +0 -32
  883. package/scripts/backlog/backlog-stalled-cli.ts +0 -30
  884. package/scripts/cost-runtime/cost-format.ts +0 -29
  885. package/scripts/init/basic-path-migration.ts +0 -24
  886. package/scripts/issue/issue-backlinks-cli.ts +0 -93
  887. package/scripts/josh/josh-commands-guard.ts +0 -38
  888. package/scripts/lint/cross-file-recheck.ts +0 -155
  889. package/scripts/registry-migration/migrate-logic.ts +0 -237
  890. package/scripts/registry-migration/migrate.ts +0 -292
  891. package/scripts/registry-migration/user-npmrc.ts +0 -15
  892. package/scripts/rules/rule-guard.ts +0 -23
  893. package/scripts/rules/rule-registry-rows.ts +0 -282
  894. package/scripts/rules/rule-registry.ts +0 -109
  895. package/scripts/run/run-stranded-cli.ts +0 -27
@@ -4,18 +4,18 @@ import { run_board_labels } from './run-board-labels'
4
4
 
5
5
  // A live `run:board` frame kept within the terminal. A frame taller than the pane scrolls the
6
6
  // alternate screen as it is written, and the header — the lines that say whether the run moves and
7
- // how far it is — is what scrolls off. So the parts below it give way instead, least wanted first:
8
- // the footer, the legend, the oldest notes until three are left, the finished rows, the rest of the
9
- // notes, the reviewers thanked above the legend, the rows not yet started, the parked rows and, last,
10
- // the running rows — what a person keeps the board open to see. Each stage stops once the
11
- // frame fits, a cut row is counted on its section's `more N` line, and the order a row is drawn in
7
+ // how far it is — is what scrolls off. So the parts below it give way instead, least wanted first and
8
+ // in the order the frame draws them from the bottom (joshuafolkken/kit#4099): the footer, the legend,
9
+ // the rows under the notes — the finished, the 🔗 waiting, the not yet started — the notes from the
10
+ // oldest, the reviewers thanked above the legend, the parked rows and, last, the rows waiting on a person's decision
11
+ // and the running rows — what a person keeps the board open to see. Each stage stops once the
12
+ // frame fits, a cut row is counted on the plan's `more N` line — or on its folding section's own last
13
+ // line while that section keeps a row (joshuafolkken/kit#4042) — and the order a row is drawn in
12
14
  // never changes. A line wider than the pane wraps, so every line is counted by the rows it takes on
13
15
  // screen, not as one.
14
16
 
15
17
  const { WORDS } = run_board_labels
16
18
  const INDENT = ' '
17
- // The newest notes kept until the finished rows are gone; the older ones give way before them.
18
- const NOTES_KEPT = 3
19
19
 
20
20
  interface TerminalSize {
21
21
  rows: number
@@ -23,7 +23,7 @@ interface TerminalSize {
23
23
  }
24
24
 
25
25
  // The stage an issue row gives way in, the earlier first.
26
- type YieldStage = 'finished' | 'pending' | 'parked' | 'running'
26
+ type YieldStage = 'finished' | 'waiting' | 'pending' | 'parked' | 'decision' | 'running'
27
27
 
28
28
  // When a row's stage gives it way: the oldest first, a row with no time before every timed one.
29
29
  interface RowYield {
@@ -37,42 +37,75 @@ interface PlanLine {
37
37
  row: RowYield | undefined
38
38
  }
39
39
 
40
- // A plan section drops its heading once none of its rows is left.
41
- interface PlanSection {
40
+ // A section a person folds and unfolds with one key on a live board (`run-board-fold.ts`).
41
+ type SectionKey = 'lanes' | 'processes' | 'findings' | 'queued' | 'waiting' | 'done'
42
+
43
+ // What a foldable part's rule is labeled, and whether a person folded it to its heading alone.
44
+ interface Foldable {
45
+ label?: string | undefined
46
+ is_folded?: boolean | undefined
47
+ }
48
+
49
+ // A plan section drops its heading once none of its rows is left — unless it folds: then its cut rows
50
+ // are counted on its own last line, drawn by `fold`, rather than on the plan's `more N`. A folded one
51
+ // is its heading alone.
52
+ interface PlanSection extends Foldable {
42
53
  head: ReadonlyArray<string>
43
54
  lines: ReadonlyArray<PlanLine>
55
+ fold?: ((cut: ReadonlyArray<PlanLine>) => string) | undefined
56
+ key?: SectionKey | undefined
44
57
  }
45
58
 
46
59
  // The newest notes shown, and how many older ones are already past the section's limit.
47
- interface NotesPart {
60
+ interface NotesPart extends Foldable {
48
61
  head: ReadonlyArray<string>
49
62
  lines: ReadonlyArray<string>
50
63
  hidden: number
51
64
  }
52
65
 
53
- // A frame in its parts, top to bottom: the header above stays.
66
+ // A part drawn after `plan` whose lines a group's parts are, `is_detail`, and give way all at once;
67
+ // `summary` is what its folded heading says.
68
+ interface DetailPart extends Foldable {
69
+ head: ReadonlyArray<string>
70
+ lines: ReadonlyArray<{ text: string; is_detail: boolean }>
71
+ summary?: string | undefined
72
+ }
73
+
74
+ // A frame in its parts, top to bottom: the header above stays. The plan's sections are drawn around
75
+ // the notes: `plan` above them, `below` under them; `processes` between the plan and the notes.
54
76
  interface FrameParts {
55
77
  above: ReadonlyArray<string>
56
78
  plan: ReadonlyArray<PlanSection>
79
+ processes?: DetailPart | undefined
57
80
  notes: NotesPart
81
+ below?: ReadonlyArray<PlanSection> | undefined
58
82
  // The reviewers thanked, drawn right above the legend; none where nobody is.
59
83
  thanks?: ReadonlyArray<string> | undefined
60
84
  legend: ReadonlyArray<string>
61
85
  footer: ReadonlyArray<string>
62
86
  }
63
87
 
64
- // One thing that gives way: a part as a whole, one note (the oldest shown), or one issue row.
65
- type Yielder = 'thanks' | 'footer' | 'legend' | 'note' | PlanLine
88
+ // One thing that gives way: a part as a whole, the processes' details, one note (the oldest shown),
89
+ // or one issue row.
90
+ type Yielder = 'thanks' | 'footer' | 'legend' | 'details' | 'note' | PlanLine
66
91
 
67
92
  interface Cut {
68
93
  thanks: boolean
69
94
  footer: boolean
70
95
  legend: boolean
96
+ details: boolean
71
97
  notes: number
72
98
  rows: ReadonlySet<PlanLine>
73
99
  }
74
100
 
75
- const NO_CUT: Cut = { thanks: false, footer: false, legend: false, notes: 0, rows: new Set() }
101
+ const NO_CUT: Cut = {
102
+ thanks: false,
103
+ footer: false,
104
+ legend: false,
105
+ details: false,
106
+ notes: 0,
107
+ rows: new Set(),
108
+ }
76
109
 
77
110
  // The columns a line takes on screen: its color escapes take none, an emoji two.
78
111
  function width_of(line: string): number {
@@ -92,25 +125,50 @@ function more_lines(hidden: number): Array<string> {
92
125
  }
93
126
 
94
127
  // A section that ends on an epic whose children were all cut ends on its last row instead.
95
- function section_lines(section: PlanSection, cut: ReadonlySet<PlanLine>): Array<string> {
128
+ function kept_lines(section: PlanSection, cut: ReadonlySet<PlanLine>): Array<string> {
96
129
  const kept = section.lines.filter((line) => !cut.has(line))
97
130
  const last = kept.findLastIndex((line) => line.row !== undefined)
98
131
 
99
- if (last === -1) return []
132
+ return kept.slice(0, last + 1).map((line) => line.text)
133
+ }
134
+
135
+ // A folding section counts its own cut rows while any of its rows is left; with none left it goes,
136
+ // and the plan's `more N` counts them.
137
+ function is_folding(section: PlanSection, cut: ReadonlySet<PlanLine>): boolean {
138
+ return section.fold !== undefined && kept_lines(section, cut).length > 0
139
+ }
140
+
141
+ // The fold line a folding section ends on while any of its rows is cut.
142
+ function fold_lines(section: PlanSection, cut: ReadonlySet<PlanLine>): Array<string> {
143
+ const gone = section.lines.filter((line) => cut.has(line))
144
+
145
+ if (!is_folding(section, cut) || gone.length === 0) return []
146
+
147
+ return [section.fold?.(gone) ?? '']
148
+ }
149
+
150
+ function section_lines(section: PlanSection, cut: ReadonlySet<PlanLine>): Array<string> {
151
+ if (section.is_folded === true) return [...section.head]
152
+
153
+ const kept = kept_lines(section, cut)
154
+
155
+ if (kept.length === 0) return []
100
156
 
101
- return [...section.head, ...kept.slice(0, last + 1).map((line) => line.text)]
157
+ return [...section.head, ...kept, ...fold_lines(section, cut)]
102
158
  }
103
159
 
104
- // The plan's cut rows are counted on one line at its end, under a blank when no section is left.
105
- function plan_lines(plan: ReadonlyArray<PlanSection>, cut: ReadonlySet<PlanLine>): Array<string> {
106
- const drawn = plan.flatMap((section) => section_lines(section, cut))
107
- const lead = drawn.length === 0 && cut.size > 0 ? [''] : []
160
+ // The cut rows no folding section counts.
161
+ function unfolded(plan: ReadonlyArray<PlanSection>, cut: ReadonlySet<PlanLine>): number {
162
+ const folding = plan.filter((section) => is_folding(section, cut))
163
+ const folded = new Set(folding.flatMap((section) => section.lines))
108
164
 
109
- return [...lead, ...drawn, ...more_lines(cut.size)]
165
+ return [...cut].filter((line) => !folded.has(line)).length
110
166
  }
111
167
 
112
168
  // The notes give way from the oldest shown; with none left the section goes, heading and all.
113
169
  function notes_lines(notes: NotesPart, cut: number): Array<string> {
170
+ if (notes.is_folded === true) return [...notes.head]
171
+
114
172
  const kept = notes.lines.slice(0, notes.lines.length - cut)
115
173
 
116
174
  if (kept.length === 0) return []
@@ -118,11 +176,45 @@ function notes_lines(notes: NotesPart, cut: number): Array<string> {
118
176
  return [...notes.head, ...kept, ...more_lines(notes.hidden + cut)]
119
177
  }
120
178
 
179
+ function sections_lines(
180
+ sections: ReadonlyArray<PlanSection>,
181
+ cut: ReadonlySet<PlanLine>,
182
+ ): Array<string> {
183
+ return sections.flatMap((section) => section_lines(section, cut))
184
+ }
185
+
186
+ // The processes under their heading, the groups alone once their details are cut.
187
+ function detail_lines(part: DetailPart | undefined, is_cut: boolean): Array<string> {
188
+ if (part === undefined) return []
189
+
190
+ const kept = part.lines.filter((line) => !is_cut || !line.is_detail)
191
+
192
+ return [...part.head, ...kept.map((line) => line.text)]
193
+ }
194
+
195
+ // The plan's sections around the notes, its cut rows counted on one line after its last drawn section —
196
+ // under `below` while any of it is drawn, else above the processes and the notes, never under the
197
+ // notes' own `more` — and under a blank when no section is left above it.
198
+ function body_lines(parts: FrameParts, cut: Cut): Array<string> {
199
+ const below = parts.below ?? []
200
+ const [plan, notes, under] = [
201
+ sections_lines(parts.plan, cut.rows),
202
+ [...detail_lines(parts.processes, cut.details), ...notes_lines(parts.notes, cut.notes)],
203
+ sections_lines(below, cut.rows),
204
+ ]
205
+ const more = more_lines(unfolded([...parts.plan, ...below], cut.rows))
206
+
207
+ if (under.length > 0) return [...plan, ...notes, ...under, ...more]
208
+
209
+ const lead = plan.length === 0 && more.length > 0 ? [''] : []
210
+
211
+ return [...lead, ...plan, ...more, ...notes]
212
+ }
213
+
121
214
  function compose(parts: FrameParts, cut: Cut): Array<string> {
122
215
  return [
123
216
  ...parts.above,
124
- ...plan_lines(parts.plan, cut.rows),
125
- ...notes_lines(parts.notes, cut.notes),
217
+ ...body_lines(parts, cut),
126
218
  ...(cut.thanks ? [] : (parts.thanks ?? [])),
127
219
  ...(cut.legend ? [] : parts.legend),
128
220
  ...(cut.footer ? [] : parts.footer),
@@ -154,25 +246,39 @@ function yielding(rows: ReadonlyArray<Indexed>, stage: YieldStage): Array<PlanLi
154
246
  .map((entry) => entry.line)
155
247
  }
156
248
 
157
- // Everything that gives way, in the order it does.
158
- function order_of(parts: FrameParts): Array<Yielder> {
159
- const rows = parts.plan
249
+ // The stages in the order their rows give way.
250
+ const STAGES: ReadonlyArray<YieldStage> = [
251
+ 'finished',
252
+ 'waiting',
253
+ 'pending',
254
+ 'parked',
255
+ 'decision',
256
+ 'running',
257
+ ]
258
+
259
+ // The issue rows of some sections, in the order they give way.
260
+ function rows_yielding(sections: ReadonlyArray<PlanSection>): Array<PlanLine> {
261
+ const rows = sections
160
262
  .flatMap((section) => section.lines)
161
263
  .map((line, index) => ({ line, index }))
162
264
  .filter((entry) => entry.line.row !== undefined)
265
+
266
+ return STAGES.flatMap((stage) => yielding(rows, stage))
267
+ }
268
+
269
+ // Everything that gives way, in the order it does: the rows drawn under the notes before them, the
270
+ // processes' details before the notes, the rows above them after the thanks.
271
+ function order_of(parts: FrameParts): Array<Yielder> {
163
272
  const notes = parts.notes.lines.map((): Yielder => 'note')
164
- const surplus = Math.max(0, notes.length - NOTES_KEPT)
165
273
 
166
274
  return [
167
275
  'footer',
168
276
  'legend',
169
- ...notes.slice(0, surplus),
170
- ...yielding(rows, 'finished'),
171
- ...notes.slice(surplus),
277
+ ...rows_yielding(parts.below ?? []),
278
+ 'details',
279
+ ...notes,
172
280
  'thanks',
173
- ...yielding(rows, 'pending'),
174
- ...yielding(rows, 'parked'),
175
- ...yielding(rows, 'running'),
281
+ ...rows_yielding(parts.plan),
176
282
  ]
177
283
  }
178
284
 
@@ -188,6 +294,7 @@ function cut_of(order: ReadonlyArray<Yielder>, count: number): Cut {
188
294
  thanks: gone.includes('thanks'),
189
295
  footer: gone.includes('footer'),
190
296
  legend: gone.includes('legend'),
297
+ details: gone.includes('details'),
191
298
  notes: gone.filter((item) => item === 'note').length,
192
299
  rows: new Set(gone.filter((item) => is_line(item))),
193
300
  }
@@ -227,4 +334,14 @@ function fit(parts: FrameParts, size: TerminalSize): Array<string> {
227
334
  const run_board_fit = { fit, height_of, whole, width_of }
228
335
 
229
336
  export { run_board_fit }
230
- export type { FrameParts, NotesPart, PlanLine, PlanSection, RowYield, TerminalSize, YieldStage }
337
+ export type {
338
+ DetailPart,
339
+ FrameParts,
340
+ NotesPart,
341
+ PlanLine,
342
+ PlanSection,
343
+ RowYield,
344
+ SectionKey,
345
+ TerminalSize,
346
+ YieldStage,
347
+ }
@@ -0,0 +1,123 @@
1
+ import {
2
+ run_board_fit,
3
+ type DetailPart,
4
+ type FrameParts,
5
+ type NotesPart,
6
+ type PlanSection,
7
+ type SectionKey,
8
+ type TerminalSize,
9
+ } from './run-board-fit'
10
+ import { run_board_render_section } from './run-board-render-section'
11
+
12
+ // A live `run:board`'s sections folded and unfolded by one key each (joshuafolkken/kit#4172): every
13
+ // section starts unfolded, and what a person folds holds until the board closes — it is never saved.
14
+ // A folded section is its heading alone, led by ▸ and saying what it holds, and the rows it gave up go
15
+ // to the other sections before `run-board-fit.ts` cuts anything; an unfolded one's heading is led by ▾.
16
+
17
+ const { folded_head, open_head } = run_board_render_section
18
+ const SECTION_KEYS: ReadonlyMap<string, SectionKey> = new Map([
19
+ ['l', 'lanes'],
20
+ ['p', 'processes'],
21
+ ['f', 'findings'],
22
+ ['q', 'queued'],
23
+ ['w', 'waiting'],
24
+ ['d', 'done'],
25
+ ])
26
+ const ALL_KEY = 'a'
27
+ const SECTIONS: ReadonlyArray<SectionKey> = [...SECTION_KEYS.values()]
28
+ const KEYS_LINE = ` ${[...SECTION_KEYS.keys()].join(' ')}: fold · ${ALL_KEY}: all · Ctrl-C: quit`
29
+
30
+ // The live terminal a frame is kept within, the footer the frame ends on and gives way first, and the
31
+ // sections a person folded; none for a frame that is not redrawn in place, which is drawn as it was.
32
+ interface FrameBounds {
33
+ size?: TerminalSize | undefined
34
+ footer?: ReadonlyArray<string> | undefined
35
+ folded?: ReadonlySet<SectionKey> | undefined
36
+ }
37
+
38
+ interface Headed {
39
+ head: ReadonlyArray<string>
40
+ is_folded?: boolean | undefined
41
+ }
42
+
43
+ function flipped(folded: ReadonlySet<SectionKey>, section: SectionKey): ReadonlySet<SectionKey> {
44
+ const rest = [...folded].filter((key) => key !== section)
45
+
46
+ return new Set(folded.has(section) ? rest : [...rest, section])
47
+ }
48
+
49
+ // What a key leaves folded: `a` folds every section, or unfolds them all once every one is folded; a key
50
+ // that names no section leaves it as it was.
51
+ function toggled(folded: ReadonlySet<SectionKey>, key: string): ReadonlySet<SectionKey> {
52
+ if (key === ALL_KEY) return new Set(folded.size === SECTIONS.length ? [] : SECTIONS)
53
+
54
+ const section = SECTION_KEYS.get(key)
55
+
56
+ return section === undefined ? folded : flipped(folded, section)
57
+ }
58
+
59
+ // A part's heading: ▾ while it is open, its one ▸ line saying `summary` once it is folded.
60
+ function headed<Part extends Headed>(part: Part, label: string, summary: string | undefined): Part {
61
+ if (summary === undefined) return { ...part, head: open_head(part.head, label) }
62
+
63
+ return { ...part, head: folded_head(label, summary), is_folded: true }
64
+ }
65
+
66
+ // A folded section counts its rows.
67
+ function fold_section(section: PlanSection, folded: ReadonlySet<SectionKey>): PlanSection {
68
+ const { key, label } = section
69
+
70
+ if (key === undefined || label === undefined) return section
71
+ if (!folded.has(key)) return headed(section, label, undefined)
72
+
73
+ const count = section.lines.filter((line) => line.row !== undefined).length
74
+
75
+ return { ...headed(section, label, String(count)), lines: [] }
76
+ }
77
+
78
+ // The findings count every one there is, the ones past the section's limit too; with none there is no
79
+ // section to fold.
80
+ function fold_notes(notes: NotesPart, folded: ReadonlySet<SectionKey>): NotesPart {
81
+ const { label } = notes
82
+
83
+ if (label === undefined || notes.lines.length === 0) return notes
84
+ if (!folded.has('findings')) return headed(notes, label, undefined)
85
+
86
+ const count = String(notes.lines.length + notes.hidden)
87
+
88
+ return { ...headed(notes, label, count), lines: [], hidden: 0 }
89
+ }
90
+
91
+ // The processes say each group's totals.
92
+ function fold_processes(
93
+ part: DetailPart | undefined,
94
+ folded: ReadonlySet<SectionKey>,
95
+ ): DetailPart | undefined {
96
+ if (part?.label === undefined) return part
97
+ if (!folded.has('processes')) return headed(part, part.label, undefined)
98
+
99
+ return { ...headed(part, part.label, part.summary ?? ''), lines: [] }
100
+ }
101
+
102
+ function fold_parts(parts: FrameParts, folded: ReadonlySet<SectionKey>): FrameParts {
103
+ return {
104
+ ...parts,
105
+ plan: parts.plan.map((section) => fold_section(section, folded)),
106
+ below: parts.below?.map((section) => fold_section(section, folded)),
107
+ processes: fold_processes(parts.processes, folded),
108
+ notes: fold_notes(parts.notes, folded),
109
+ }
110
+ }
111
+
112
+ // A live frame is kept within its terminal, folded as a person folded it; any other is drawn whole.
113
+ function bounded(parts: FrameParts, bounds: FrameBounds): Array<string> {
114
+ const { size, folded } = bounds
115
+ const shown = folded === undefined ? parts : fold_parts(parts, folded)
116
+
117
+ return size === undefined ? run_board_fit.whole(shown) : run_board_fit.fit(shown, size)
118
+ }
119
+
120
+ const run_board_fold = { KEYS_LINE, bounded, fold_parts, toggled }
121
+
122
+ export { run_board_fold }
123
+ export type { FrameBounds }
@@ -1,5 +1,5 @@
1
1
  import { styleText } from 'node:util'
2
- import { run_progress } from '#scripts/run/progress/run-progress'
2
+ import { MS_PER_SECOND } from '#scripts/lib/timeouts'
3
3
 
4
4
  // **The one place a freshly updated part of `run:board` is emphasized** — the header's `💓` and third
5
5
  // line, an issue row's phase, start and end (joshuafolkken/kit#3784). The emphasis fades in three
@@ -17,7 +17,7 @@ interface FreshFrame {
17
17
  spinner: string | undefined
18
18
  }
19
19
 
20
- const STAGE_MS = run_progress.MS_PER_SECOND
20
+ const STAGE_MS = MS_PER_SECOND
21
21
  const FADING: ReadonlyArray<FreshStage> = ['inverse', 'bold-color', 'bold']
22
22
  const FORMATS: Readonly<Record<Exclude<FreshStage, 'none'>, TextFormat>> = {
23
23
  inverse: 'inverse',
@@ -0,0 +1,29 @@
1
+ import { setTimeout as sleep } from 'node:timers/promises'
2
+ import { core_budget } from '#scripts/gate/core-budget'
3
+ import { machine_capacity } from '#scripts/gate/machine-capacity'
4
+ import { lane_process_table } from '#scripts/lane/lane-process-table'
5
+ import type { GatherPorts } from './run-board-gather'
6
+ import { run_board_read } from './run-board-read'
7
+ import { run_board_usage_read } from './run-board-usage-read'
8
+
9
+ // The live reads off this machine, shared by the live board's worker thread
10
+ // (`run-board-gather-worker.ts`) and the single frame that reads where it draws.
11
+
12
+ function ports_of(is_live: boolean): GatherPorts {
13
+ return {
14
+ read_table: lane_process_table.read_table,
15
+ read_local: run_board_read.read_local,
16
+ read_machine: machine_capacity.read_sample,
17
+ read_waits: () => core_budget.budget_waits(),
18
+ read_usage: run_board_usage_read.usage_reader(),
19
+ is_live,
20
+ now: () => Date.now(),
21
+ sleep: async (ms) => {
22
+ await sleep(ms)
23
+ },
24
+ }
25
+ }
26
+
27
+ const run_board_gather_live = { ports_of }
28
+
29
+ export { run_board_gather_live }
@@ -0,0 +1,189 @@
1
+ import { isDeepStrictEqual } from 'node:util'
2
+ import { Worker } from 'node:worker_threads'
3
+ import {
4
+ run_board_gather,
5
+ type Gatherer,
6
+ type GatherPorts,
7
+ type GatherRead,
8
+ type GatherState,
9
+ } from './run-board-gather'
10
+ import type { LocalRead } from './run-board-read'
11
+
12
+ // The live board's side of its worker thread (`run-board-gather-worker.ts`): the worker takes the
13
+ // reads off this machine and hands each round over; a redraw draws the last one it handed, so no read
14
+ // stops the board's spinner. A round that throws is handed over as failed, and the worker reads again
15
+ // next round; a worker that dies is said on the board, and started again on the next redraw — there is
16
+ // no other place the reads are taken.
17
+
18
+ const WORKER_URL = new URL('run-board-gather-worker.ts', import.meta.url)
19
+ const EMPTY_READ = run_board_gather.read_of(run_board_gather.FRESH_GATHER)
20
+
21
+ // The run's read as the worker hands it over. A stream read again unchanged is not handed over — the
22
+ // board keeps its own array, so the folds it keyed on that array are not folded again.
23
+ interface LocalPost {
24
+ value: LocalRead | undefined
25
+ is_same_events?: boolean | undefined
26
+ }
27
+
28
+ // One round as the worker hands it over: the run's read only when it was read again, so the board
29
+ // does not copy the whole stream every second.
30
+ interface GatherPost {
31
+ read: Omit<GatherRead, 'local'>
32
+ local?: LocalPost | undefined
33
+ }
34
+
35
+ // A round whose reads threw, handed over with why; the worker reads again next round.
36
+ interface FailedPost {
37
+ failed: string
38
+ }
39
+
40
+ // The part of a worker the board listens to.
41
+ interface GatherWorker {
42
+ on: (event: 'message' | 'error' | 'exit', listener: (value: unknown) => void) => unknown
43
+ unref: () => void
44
+ }
45
+
46
+ type Spawn = () => GatherWorker
47
+
48
+ interface Thread {
49
+ worker: GatherWorker | undefined
50
+ latest: GatherRead | undefined
51
+ waiting: Array<(read: GatherRead) => void>
52
+ }
53
+
54
+ function local_post(before: LocalRead | undefined, after: LocalRead | undefined): LocalPost {
55
+ if (before === undefined || after === undefined) return { value: after }
56
+ if (!isDeepStrictEqual(before.events, after.events)) return { value: after }
57
+
58
+ return { value: { ...after, events: [] }, is_same_events: true }
59
+ }
60
+
61
+ function post_of(before: GatherState, after: GatherState): GatherPost {
62
+ const { local, ...read } = run_board_gather.read_of(after)
63
+ const is_reread = after.read_ms !== before.read_ms
64
+
65
+ return { read, local: is_reread ? local_post(before.local, local) : undefined }
66
+ }
67
+
68
+ function is_post(value: unknown): value is GatherPost {
69
+ return typeof value === 'object' && value !== null && 'read' in value
70
+ }
71
+
72
+ // What a failure is said as: the first line of its message.
73
+ function reason_of(error: unknown): string {
74
+ const message = error instanceof Error ? error.message : String(error)
75
+
76
+ return message.split('\n', 1)[0] ?? ''
77
+ }
78
+
79
+ function failed_of(error: unknown): FailedPost {
80
+ return { failed: reason_of(error) }
81
+ }
82
+
83
+ // One round on the worker: the reads handed over, or why they threw — the state kept for the next.
84
+ async function gather_round(
85
+ state: GatherState,
86
+ ports: GatherPorts,
87
+ post: (value: GatherPost | FailedPost) => void,
88
+ ): Promise<GatherState> {
89
+ try {
90
+ const next = await run_board_gather.gather(state, ports, 'background')
91
+
92
+ post(post_of(state, next))
93
+
94
+ return next
95
+ } catch (error) {
96
+ post(failed_of(error))
97
+
98
+ return state
99
+ }
100
+ }
101
+
102
+ function is_failed(value: unknown): value is FailedPost {
103
+ return typeof value === 'object' && value !== null && 'failed' in value
104
+ }
105
+
106
+ function settle(thread: Thread, read: GatherRead): void {
107
+ thread.latest = read
108
+
109
+ for (const resolve of thread.waiting.splice(0)) resolve(read)
110
+ }
111
+
112
+ function local_of(thread: Thread, post: LocalPost): LocalRead | undefined {
113
+ const { value, is_same_events } = post
114
+ const kept = thread.latest?.local
115
+
116
+ if (is_same_events !== true || value === undefined || kept === undefined) return value
117
+
118
+ return { ...value, events: kept.events }
119
+ }
120
+
121
+ function receive(thread: Thread, post: GatherPost): void {
122
+ const local = post.local === undefined ? thread.latest?.local : local_of(thread, post.local)
123
+
124
+ settle(thread, { ...post.read, local, read_failed_ms: undefined, read_error: undefined })
125
+ }
126
+
127
+ // A failed read keeps the last round on screen, said failed and why until the next answers.
128
+ function said_failed(thread: Thread, reason: string, now: () => number): void {
129
+ settle(thread, { ...(thread.latest ?? EMPTY_READ), read_failed_ms: now(), read_error: reason })
130
+ }
131
+
132
+ // A worker that threw or exited is started again on the next redraw.
133
+ function fail(thread: Thread, worker: GatherWorker, reason: string, now: () => number): void {
134
+ if (thread.worker !== worker) return
135
+
136
+ thread.worker = undefined
137
+ said_failed(thread, reason, now)
138
+ }
139
+
140
+ function listen(thread: Thread, worker: GatherWorker, now: () => number): void {
141
+ worker.on('message', (value) => {
142
+ if (is_post(value)) receive(thread, value)
143
+ else if (is_failed(value)) said_failed(thread, value.failed, now)
144
+ })
145
+ worker.on('error', (error) => {
146
+ fail(thread, worker, reason_of(error), now)
147
+ })
148
+ worker.on('exit', (code) => {
149
+ fail(thread, worker, `exit ${String(code)}`, now)
150
+ })
151
+ }
152
+
153
+ function start(thread: Thread, spawn: Spawn, now: () => number): GatherWorker {
154
+ const worker = spawn()
155
+
156
+ listen(thread, worker, now)
157
+ // The board's own loop keeps the process; the worker never holds it open past the board.
158
+ worker.unref()
159
+
160
+ return worker
161
+ }
162
+
163
+ async function latest_of(thread: Thread): Promise<GatherRead> {
164
+ if (thread.latest !== undefined) return thread.latest
165
+
166
+ return await new Promise((resolve) => {
167
+ thread.waiting.push(resolve)
168
+ })
169
+ }
170
+
171
+ function spawn_worker(): GatherWorker {
172
+ return new Worker(WORKER_URL)
173
+ }
174
+
175
+ // The first redraw waits for the worker's first round; every later one draws the last round handed.
176
+ function worker_gatherer(spawn: Spawn = spawn_worker, now: () => number = Date.now): Gatherer {
177
+ const thread: Thread = { worker: undefined, latest: undefined, waiting: [] }
178
+
179
+ return async () => {
180
+ thread.worker ??= start(thread, spawn, now)
181
+
182
+ return await latest_of(thread)
183
+ }
184
+ }
185
+
186
+ const run_board_gather_thread = { WORKER_URL, gather_round, post_of, worker_gatherer }
187
+
188
+ export { run_board_gather_thread }
189
+ export type { FailedPost, GatherPost, GatherWorker }