@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,28 +1,37 @@
1
1
  import { styleText } from 'node:util'
2
- import { backlog_budget } from '#scripts/backlog/backlog-budget'
2
+ import { MS_PER_MINUTE } from '#scripts/lib/timeouts'
3
3
  import type { PrChecks } from '#scripts/run/event/run-event-checks'
4
+ import { run_board_earlier } from './run-board-earlier'
4
5
  import { run_board_header, type BoardHeader } from './run-board-header'
5
6
  import { run_board_labels, type TextColor } from './run-board-labels'
6
- import type { BoardRow } from './run-board-layout'
7
+ import { run_board_layout, type BoardRow } from './run-board-layout'
7
8
  import { run_board_now, type TimedLine } from './run-board-now'
8
9
  import type { Phase } from './run-board-phase'
9
10
  import { run_board_render_checks } from './run-board-render-checks'
10
-
11
- // The end of a running row (joshuafolkken/kit#3769): how long the child has stood at the phase its row
12
- // leads with, then the kind and the age of the newest thing it did. Both are the row's own `MM:SS`, the
13
- // minutes never carried into hours (`61:05`). The phase's time is right-aligned to the widest any
14
- // running row draws, so a three-digit `125:30` and a `00:40` end in one column and the age after them
15
- // starts in one column whichever row it is on — where the phase track before them grew with every
16
- // round. A settled or a waiting row draws neither.
17
-
18
- const { NOW_ICONS, elapsed_of } = run_board_labels
11
+ import { run_board_render_waits } from './run-board-render-waits'
12
+
13
+ // The end of a running row (joshuafolkken/kit#3769, #4043, #4292): the kind and the age of the newest
14
+ // thing the child did, the board's own length (`1°01′05″`), right-aligned to the widest any running
15
+ // row draws, so a `2°05′30″` and a `40″` end in one column. The phase's icon and how long the child has
16
+ // stood at it lead the row (`run-board-render-lead.ts`), so the event that entered the phase is not
17
+ // drawn again here. A settled or a waiting row draws none. A lane held in the core budget draws the
18
+ // check it holds in the newest activity's place (#4052), its reason and time leading the row.
19
+
20
+ const { PHASE_ICONS, span_of } = run_board_labels
21
+ const { is_live } = run_board_earlier
22
+ const { check_of, held_of } = run_board_render_waits
19
23
  // A phase past twice its usual time is drawn as long, past three times as alarming.
20
24
  const LONG_FACTOR = 2
21
25
  const ALARM_FACTOR = 3
22
26
  // The least a usual time counts as: the ledger's median for a stage of seconds (preflight, sync,
23
27
  // report) is near zero, and scaled as it is it would draw a healthy few-second stage as alarming.
24
28
  const USUAL_FLOOR_MINUTES = 2
25
- const USUAL_FLOOR_MS = USUAL_FLOOR_MINUTES * backlog_budget.MS_PER_MINUTE
29
+ const USUAL_FLOOR_MS = USUAL_FLOOR_MINUTES * MS_PER_MINUTE
30
+
31
+ interface TimedActivity {
32
+ icon: string
33
+ since_ms: number
34
+ }
26
35
 
27
36
  function phase_color(elapsed_ms: number, usual_ms: number | undefined): TextColor | undefined {
28
37
  if (usual_ms === undefined) return undefined
@@ -45,32 +54,40 @@ function current_of(row: BoardRow): { phase: Phase; since_ms: number } | undefin
45
54
  return phase === undefined || phase_ms === undefined ? undefined : { phase, since_ms: phase_ms }
46
55
  }
47
56
 
48
- // The phase column's width: the widest phase time any running row draws in this frame, and `MM:SS`'s
49
- // at the least, so a row with none still blanks a column's width.
50
- function phase_width(header: BoardHeader): number {
51
- const spans = (header.layout?.active ?? []).map((row) => {
52
- const current = row.state === 'running' ? current_of(row) : undefined
57
+ // A column's width: the widest span `age_of` gives any running row or earlier run's lane in this
58
+ // frame, and `0″`'s at the least, so a row with none still blanks a column's width.
59
+ function column_width(header: BoardHeader, age_of: (row: BoardRow) => number | undefined): number {
60
+ const rows = run_board_layout.lane_rows(header.layout ?? run_board_layout.EMPTY_LAYOUT, [])
61
+ const spans = rows.map((row) => {
62
+ const age = is_live(row) ? age_of(row) : undefined
53
63
 
54
- return current === undefined ? 0 : elapsed_of(header.now_ms - current.since_ms).length
64
+ return age === undefined ? 0 : span_of(age).length
55
65
  })
56
66
 
57
- return Math.max(elapsed_of(0).length, ...spans)
67
+ return Math.max(span_of(0).length, ...spans)
58
68
  }
59
69
 
60
- // How long the child has stood at its phase, colored against the phase's usual time; blanks where no
61
- // event said when it got there, so the age after it still starts in its column.
62
- function phase_part(row: BoardRow, header: BoardHeader): string {
63
- const current = current_of(row)
64
- const width = phase_width(header)
70
+ // How long the child has stood at its phase, right-aligned to `width` and colored against the phase's
71
+ // usual time; blanks where no event said when it got there, so what follows still starts in its column.
72
+ function phase_time(row: BoardRow, header: BoardHeader, width: number): string {
73
+ const current = is_live(row) ? current_of(row) : undefined
65
74
 
66
75
  if (current === undefined) return ' '.repeat(width)
67
76
 
68
77
  const elapsed = header.now_ms - current.since_ms
69
- const text = elapsed_of(elapsed).padStart(width)
78
+ const text = span_of(elapsed).padStart(width)
70
79
 
71
80
  return tinted(text, phase_color(elapsed, header.usual?.get(current.phase)))
72
81
  }
73
82
 
83
+ // The icon of the phase a running row's end draws, `undefined` where it draws blanks — named by the
84
+ // legend, since a held row leads with 🚧 instead.
85
+ function phase_icon(row: BoardRow): string | undefined {
86
+ const current = is_live(row) ? current_of(row) : undefined
87
+
88
+ return current === undefined ? undefined : PHASE_ICONS[current.phase]
89
+ }
90
+
74
91
  // The newer of the child's newest operation and its newest event, read as the header's third line
75
92
  // reads it, so the two never disagree on what is newest.
76
93
  function newest_of(row: BoardRow, header: BoardHeader): TimedLine | undefined {
@@ -81,48 +98,98 @@ function newest_of(row: BoardRow, header: BoardHeader): TimedLine | undefined {
81
98
  })
82
99
  }
83
100
 
84
- // The newest activity as its kind's icon and its age, aged as the `💓` is.
85
- function activity_part(row: BoardRow, header: BoardHeader): string | undefined {
101
+ // The newest activity with when it happened, `undefined` where nothing said when.
102
+ function newest_timed(row: BoardRow, header: BoardHeader): TimedActivity | undefined {
86
103
  const newest = newest_of(row, header)
104
+ const since_ms = newest?.since_ms
87
105
 
88
- if (newest?.since_ms === undefined) return undefined
89
-
90
- const age = header.now_ms - newest.since_ms
106
+ return newest === undefined || since_ms === undefined
107
+ ? undefined
108
+ : { icon: newest.icon, since_ms }
109
+ }
91
110
 
92
- return run_board_header.aged(`${newest.icon} ${elapsed_of(age)}`, age)
111
+ // A running row whose lane no core-budget wait holds.
112
+ function is_free(row: BoardRow, header: BoardHeader): boolean {
113
+ return is_live(row) && held_of(row, header) === undefined
93
114
  }
94
115
 
95
116
  // A row in followup with its pull request's checks on the stream (joshuafolkken/kit#3770), whose end
96
- // draws them in place of its newest activity.
117
+ // draws them in place of its newest activity — unless its lane is held, whose wait is drawn instead.
97
118
  function checks_of(row: BoardRow, header: BoardHeader): PrChecks | undefined {
98
- if (row.state !== 'running' || current_of(row)?.phase !== 'followup') return undefined
119
+ if (!is_free(row, header) || current_of(row)?.phase !== 'followup') return undefined
99
120
 
100
121
  return header.activity.pr_checks?.get(row.number)
101
122
  }
102
123
 
103
- // A running row's end, nothing for any other.
104
- function tail_of(row: BoardRow, header: BoardHeader): Array<string | undefined> {
105
- if (row.state !== 'running') return []
124
+ // The event that entered the row's phase, whose time the phase part already draws.
125
+ function is_phase_event(newest: TimedActivity, row: BoardRow): boolean {
126
+ return newest.since_ms === current_of(row)?.since_ms
127
+ }
106
128
 
107
- const checks = checks_of(row, header)
108
- const last =
109
- checks === undefined ? activity_part(row, header) : run_board_render_checks.checks_part(checks)
129
+ // The newest activity a running row's end draws: none where the row draws its checks or its wait in
130
+ // its place, nor where it is the event that entered the phase.
131
+ function drawn_activity(row: BoardRow, header: BoardHeader): TimedActivity | undefined {
132
+ if (!is_free(row, header) || checks_of(row, header) !== undefined) return undefined
110
133
 
111
- return [phase_part(row, header), last]
134
+ const newest = newest_timed(row, header)
135
+
136
+ if (newest === undefined || is_phase_event(newest, row)) return undefined
137
+
138
+ return newest
112
139
  }
113
140
 
114
- // Whether a row draws its pull request's checks, so the legend names them.
115
- function is_checks_drawn(row: BoardRow, header: BoardHeader): boolean {
116
- return checks_of(row, header) !== undefined
141
+ function activity_age(row: BoardRow, header: BoardHeader): number | undefined {
142
+ const newest = drawn_activity(row, header)
143
+
144
+ return newest === undefined ? undefined : header.now_ms - newest.since_ms
117
145
  }
118
146
 
119
- // Whether a row draws the operation's icon, so the legend names it.
120
- function is_operation_drawn(row: BoardRow, header: BoardHeader): boolean {
121
- if (row.state !== 'running' || is_checks_drawn(row, header)) return false
147
+ // The newest activity as its kind's icon and its age, aged as the `💓` is; nothing where the row draws
148
+ // none.
149
+ function activity_part(row: BoardRow, header: BoardHeader): string {
150
+ const newest = drawn_activity(row, header)
151
+
152
+ if (newest === undefined) return ''
122
153
 
123
- return newest_of(row, header)?.icon === NOW_ICONS.operation
154
+ const width = column_width(header, (other) => activity_age(other, header))
155
+ const age = header.now_ms - newest.since_ms
156
+
157
+ return run_board_header.aged(`${newest.icon} ${span_of(age).padStart(width)}`, age)
158
+ }
159
+
160
+ // Whether a row ends on a tail: a running row and an earlier run's lane only.
161
+ function is_tailed(row: BoardRow): boolean {
162
+ return is_live(row)
124
163
  }
125
164
 
126
- const run_board_render_tail = { is_checks_drawn, is_operation_drawn, tail_of }
165
+ // A running row's end — the check its held lane waits to run, its pull request's checks in followup,
166
+ // or its newest activity — and nothing for any other row.
167
+ function tail_of(row: BoardRow, header: BoardHeader): Array<string> {
168
+ if (!is_tailed(row)) return []
169
+
170
+ const held = held_of(row, header)
171
+
172
+ if (held !== undefined) return [check_of(held)]
173
+
174
+ const checks = checks_of(row, header)
175
+
176
+ if (checks !== undefined) return [run_board_render_checks.checks_part(checks)]
177
+
178
+ return [activity_part(row, header)]
179
+ }
180
+
181
+ // The icon a row's end draws for its newest activity, so the legend names it — none where the row
182
+ // draws its checks, its wait or the phase's own event in its place.
183
+ function activity_icon(row: BoardRow, header: BoardHeader): string | undefined {
184
+ return drawn_activity(row, header)?.icon
185
+ }
186
+
187
+ const run_board_render_tail = {
188
+ activity_icon,
189
+ checks_of,
190
+ phase_icon,
191
+ phase_time,
192
+ tail_of,
193
+ }
127
194
 
128
195
  export { run_board_render_tail }
@@ -0,0 +1,56 @@
1
+ import { run_board_earlier } from './run-board-earlier'
2
+ import type { BoardHeader } from './run-board-header'
3
+ import { run_board_labels } from './run-board-labels'
4
+ import { run_board_lane_time } from './run-board-lane-time'
5
+ import { run_board_layout, type BoardRow } from './run-board-layout'
6
+ import type { ItemStatus } from './run-board-status'
7
+
8
+ // A row's time column on `run:board`: how long it has run, and how wide the column is drawn.
9
+
10
+ const { span_of } = run_board_labels
11
+
12
+ // A running row — an earlier run's lane too — runs until now; a settled one until its recorded end. A
13
+ // child settled from the open listing has none, so it draws no time rather than one that keeps counting.
14
+ function end_of(row: BoardRow, now_ms: number): number | undefined {
15
+ return run_board_earlier.is_live(row) ? now_ms : row.status?.ended_ms
16
+ }
17
+
18
+ // The time the event that settled the row recorded (joshuafolkken/kit#4481): a settled row draws it
19
+ // rather than counting again, so it keeps its time when its launch lies outside the run's span.
20
+ function recorded_ms(row: BoardRow): number | undefined {
21
+ return run_board_earlier.is_live(row) ? undefined : row.status?.elapsed_ms
22
+ }
23
+
24
+ // How long a row has run on a lane, up to its end. A row whose launch rolled off the stream has no
25
+ // span, so it runs from its lane record's launch.
26
+ function counted_ms(status: ItemStatus | undefined, ended: number | undefined): number | undefined {
27
+ if (ended === undefined || status?.started_ms === undefined) return undefined
28
+
29
+ return run_board_lane_time.elapsed_of(status.spans ?? [], status.started_ms, ended)
30
+ }
31
+
32
+ // How long a row has run: a running one until now, a settled one until its end.
33
+ function elapsed_ms(row: BoardRow, now_ms: number): number | undefined {
34
+ return recorded_ms(row) ?? counted_ms(row.status, end_of(row, now_ms))
35
+ }
36
+
37
+ function time_of(row: BoardRow, now_ms: number): string | undefined {
38
+ const elapsed = elapsed_ms(row, now_ms)
39
+
40
+ return elapsed === undefined ? undefined : span_of(elapsed)
41
+ }
42
+
43
+ // The time column's width: the widest time any active row or earlier run's lane draws in this frame.
44
+ function time_width(header: BoardHeader): number {
45
+ const rows = run_board_layout.lane_rows(header.layout ?? run_board_layout.EMPTY_LAYOUT, [])
46
+ const times = rows.map((row) => time_of(row, header.now_ms) ?? '')
47
+
48
+ return Math.max(0, ...times.map((time) => time.length))
49
+ }
50
+
51
+ const run_board_render_time = {
52
+ time_of,
53
+ time_width,
54
+ }
55
+
56
+ export { run_board_render_time }
@@ -1,10 +1,9 @@
1
1
  import { run_board_fit } from './run-board-fit'
2
- import { run_board_labels } from './run-board-labels'
3
2
  import type { BoardRow } from './run-board-layout'
4
3
 
5
4
  // A row's title and the reason it makes room for — pure. A title is cut to the title column; a row
6
- // that says why it waits keeps saying it on a narrow pane, its title giving up the columns the line
7
- // runs over, where every other row wraps.
5
+ // that says why it waits, or draws a tail, keeps its line on a narrow pane, its title giving up the
6
+ // columns the line runs over down to a floor and its reason the rest; past the floor it wraps.
8
7
 
9
8
  // The columns a terminal row gives its title: a longer one is cut to an ellipsis.
10
9
  const TITLE_LIMIT = 48
@@ -12,47 +11,141 @@ const TITLE_LIMIT = 48
12
11
  const TITLE_FLOOR = 8
13
12
  const ELLIPSIS = '…'
14
13
 
14
+ // What a row gives up to stay on one line: the columns its title is cut to, and the columns cut off
15
+ // its reason's end.
16
+ interface RowCut {
17
+ title_limit: number
18
+ reason_cut: number
19
+ }
20
+
21
+ const WHOLE: RowCut = { title_limit: TITLE_LIMIT, reason_cut: 0 }
22
+
15
23
  // A title cut to the title column, so every time after it starts in one column.
16
24
  function title_of(title = '', limit = TITLE_LIMIT): string {
17
25
  return title.length > limit ? `${title.slice(0, limit - 1)}${ELLIPSIS}` : title
18
26
  }
19
27
 
20
- // Why a waiting row waits, after its blockers; a lane's stage with how long the lane has stood at it.
21
- function reason_text(row: BoardRow, now_ms: number): string | undefined {
22
- const { reason } = row
28
+ const GRAPHEMES = new Intl.Segmenter()
29
+
30
+ // The text cut to `columns` terminal columns — a wide character takes two — ending on an ellipsis.
31
+ function columns_cut(text: string, columns: number): string {
32
+ let kept = ''
33
+
34
+ for (const { segment } of GRAPHEMES.segment(text)) {
35
+ if (run_board_fit.width_of(`${kept}${segment}${ELLIPSIS}`) > columns) break
36
+ kept += segment
37
+ }
38
+
39
+ return `${kept}${ELLIPSIS}`
40
+ }
41
+
42
+ // The row's reason as it follows the title — what a waiting row waits on there, or why a parked or
43
+ // withdrawn row ended — with `cut` columns given up at its end, which then ends on an ellipsis; at
44
+ // least the ellipsis is left.
45
+ function reason_text(row: BoardRow, cut = 0): string | undefined {
46
+ const text = row.reason?.tail
23
47
 
24
- if (reason?.since_ms === undefined) return reason?.text
48
+ if (text === undefined || cut === 0) return text
25
49
 
26
- return `${reason.text} ${run_board_labels.stage_span_of(now_ms - reason.since_ms)}`
50
+ return columns_cut(text, Math.max(1, run_board_fit.width_of(text) - cut))
27
51
  }
28
52
 
29
- // The columns a line runs past the pane, for a row that says why it waits; none for any other row, and
30
- // none for a frame that is not kept within a pane.
31
- function overrun_of(text: string, row: BoardRow, columns: number | undefined): number {
32
- if (columns === undefined || row.reason === undefined) return 0
53
+ // The columns a line runs past the pane, for a row whose end it keeps; none for any other row, and none
54
+ // for a frame that is not kept within a pane.
55
+ function overrun_of(text: string, is_kept: boolean, columns: number | undefined): number {
56
+ if (columns === undefined || !is_kept) return 0
33
57
 
34
58
  return Math.max(0, run_board_fit.width_of(text) - columns)
35
59
  }
36
60
 
37
- // The title column once it has given up `overrun` columns, never under the floor: the blanks a short
38
- // title is padded with go first, so a title that fits keeps whole.
39
- function narrowed_limit(overrun: number): number {
40
- return Math.max(TITLE_FLOOR, TITLE_LIMIT - overrun)
61
+ // How a row is fitted: whether it keeps its whole line — a row that draws a tail, a held check among
62
+ // it (joshuafolkken/kit#4052) — the columns its title cell leads its title with, a ✚ on a row the run
63
+ // filed, its head as drawn, kept on one line where the row's head is too wide to assume it fits — a
64
+ // lane row's, with its cells (joshuafolkken/kit#3769) — and the columns its section's rows give up
65
+ // together, so their titles end in one column.
66
+ interface RowFit {
67
+ is_line_kept?: boolean
68
+ lead?: number
69
+ head?: (cut: RowCut) => string
70
+ is_head_kept?: boolean
71
+ shared?: number | undefined
41
72
  }
42
73
 
43
- // A row's line as `draw` draws it at a title limit: at the title column's, or at a narrower one where
44
- // that line would run past the pane and the row has a reason to keep.
74
+ // The columns a row's head runs past the pane at its whole title; none where it is not kept.
75
+ function head_overrun(fit: RowFit, columns: number | undefined): number {
76
+ if (fit.head === undefined || fit.is_head_kept !== true) return 0
77
+
78
+ return overrun_of(fit.head(WHOLE), true, columns)
79
+ }
80
+
81
+ // The columns the row's title cell takes as drawn: a waiting row's title is not padded, every other
82
+ // row's is padded to the title column.
83
+ function drawn_width(row: BoardRow, lead: number): number {
84
+ const title = (row.title?.length ?? 0) + lead
85
+
86
+ return row.state === 'waiting' ? Math.min(TITLE_LIMIT, title) : TITLE_LIMIT
87
+ }
88
+
89
+ // The row's title once it has given up `overrun` columns, never under the floor.
90
+ function narrowed_limit(row: BoardRow, overrun: number, lead: number): number {
91
+ return Math.max(TITLE_FLOOR, drawn_width(row, lead) - overrun)
92
+ }
93
+
94
+ // A row's line at a narrowed title with its whole reason, or with the reason's end cut by the columns
95
+ // that line still runs past the pane.
96
+ function reason_fitted(
97
+ row: BoardRow,
98
+ columns: number | undefined,
99
+ title_limit: number,
100
+ draw: (cut: RowCut) => string,
101
+ ): string {
102
+ const text = draw({ title_limit, reason_cut: 0 })
103
+ const reason_cut = overrun_of(text, row.reason !== undefined, columns)
104
+
105
+ return reason_cut === 0 ? text : draw({ title_limit, reason_cut })
106
+ }
107
+
108
+ // The columns a row's line runs past the pane at its whole title, where the row has a reason or a
109
+ // whole line to keep, or its kept head does.
110
+ function row_overrun(
111
+ row: BoardRow,
112
+ columns: number | undefined,
113
+ draw: (cut: RowCut) => string,
114
+ fit: RowFit = {},
115
+ ): number {
116
+ const line = overrun_of(
117
+ draw(WHOLE),
118
+ fit.is_line_kept === true || row.reason !== undefined,
119
+ columns,
120
+ )
121
+
122
+ return Math.max(line, head_overrun(fit, columns))
123
+ }
124
+
125
+ // A row's line as `draw` draws it: whole, or — where it or its section runs past the pane — with its
126
+ // title narrowed first and its reason cut after.
45
127
  function fitted(
46
128
  row: BoardRow,
47
129
  columns: number | undefined,
48
- draw: (title_limit: number) => string,
130
+ draw: (cut: RowCut) => string,
131
+ fit: RowFit = {},
49
132
  ): string {
50
- const text = draw(TITLE_LIMIT)
51
- const overrun = overrun_of(text, row, columns)
133
+ const overrun = Math.max(row_overrun(row, columns, draw, fit), fit.shared ?? 0)
134
+
135
+ if (overrun === 0) return draw(WHOLE)
52
136
 
53
- return overrun === 0 ? text : draw(narrowed_limit(overrun))
137
+ return reason_fitted(row, columns, narrowed_limit(row, overrun, fit.lead ?? 0), draw)
54
138
  }
55
139
 
56
- const run_board_render_title = { ELLIPSIS, TITLE_LIMIT, fitted, reason_text, title_of }
140
+ const run_board_render_title = {
141
+ ELLIPSIS,
142
+ TITLE_LIMIT,
143
+ WHOLE,
144
+ columns_cut,
145
+ fitted,
146
+ reason_text,
147
+ row_overrun,
148
+ title_of,
149
+ }
57
150
 
58
- export { run_board_render_title }
151
+ export { run_board_render_title, type RowCut, type RowFit }
@@ -0,0 +1,125 @@
1
+ import type { BudgetWait, WaitReason } from '#scripts/gate/core-wait'
2
+ import { run_board_fit } from './run-board-fit'
3
+ import type { BoardHeader } from './run-board-header'
4
+ import { run_board_labels } from './run-board-labels'
5
+ import { run_board_layout, type BoardRow } from './run-board-layout'
6
+
7
+ // The claims waiting in the machine-wide core budget (joshuafolkken/kit#3943, #4052): a lane held back
8
+ // by memory pressure otherwise reads the same as one that is stuck. A lane's wait is drawn on its own
9
+ // row — 🚧 in place of its phase icon, and why, how long and which check in place of its newest
10
+ // activity — so a wait coming and going moves no line. A wait no running row owns — the main
11
+ // checkout's, another repository's — is one line right before the legend, which gives way with it,
12
+ // so nothing is added under the header.
13
+
14
+ const { HEADER_ICONS, WORDS, minute_span_of, span_of } = run_board_labels
15
+ // 🚧 rather than ⏳, which a waiting row already draws, or 🚦, the gate stage's; an emoji a terminal
16
+ // draws two columns wide.
17
+ const BUDGET_ICON = '🚧'
18
+ const INDENT = ' '
19
+ const MAIN_CHECKOUT = 'main'
20
+ const UNNAMED_CHECK = 'step'
21
+ const RELATED_SUFFIX = ':related'
22
+ // Why a claim waits, as the header draws the gauge it waits on.
23
+ const REASON_ICONS: Readonly<Record<WaitReason, string>> = {
24
+ cores: HEADER_ICONS.cpu,
25
+ cpu: HEADER_ICONS.cpu,
26
+ memory: HEADER_ICONS.memory,
27
+ pressure: HEADER_ICONS.memory,
28
+ }
29
+ const REASON_WORDS: ReadonlyArray<readonly [string, string]> = [
30
+ [HEADER_ICONS.memory, WORDS.memory],
31
+ [HEADER_ICONS.cpu, WORDS.cores],
32
+ ]
33
+
34
+ // The check's short name: the command's last word without `:related` (`gate lint` → `lint`).
35
+ function check_of(wait: BudgetWait): string {
36
+ const word = wait.command?.split(' ').at(-1)
37
+
38
+ return word === undefined || word === '' ? UNNAMED_CHECK : word.replace(RELATED_SUFFIX, '')
39
+ }
40
+
41
+ // How long, to the minute where the seconds would not fit `room` (`10′05″` → `11′`).
42
+ function held_span(wait: BudgetWait, room: number): string {
43
+ const span = span_of(wait.waited_ms)
44
+
45
+ return run_board_fit.width_of(span) <= room ? span : minute_span_of(wait.waited_ms)
46
+ }
47
+
48
+ // Why and how long, the two filling `width` columns with the time right-aligned (joshuafolkken/kit#4292).
49
+ function held_time(wait: BudgetWait, width: number): string {
50
+ const lead = `${REASON_ICONS[wait.reason]} `
51
+ const room = width - run_board_fit.width_of(lead)
52
+
53
+ return `${lead}${held_span(wait, room).padStart(room)}`
54
+ }
55
+
56
+ // Why, how long and which check.
57
+ function held_text(wait: BudgetWait): string {
58
+ return `${REASON_ICONS[wait.reason]} ${span_of(wait.waited_ms)} ${check_of(wait)}`
59
+ }
60
+
61
+ function is_lane_row(row: BoardRow, wait: BudgetWait): boolean {
62
+ return row.state === 'running' && String(row.number) === wait.lane
63
+ }
64
+
65
+ // The longest wait a running row's lane is held in, if any: a row draws one, the others of its lane
66
+ // none.
67
+ function held_of(row: BoardRow, header: BoardHeader): BudgetWait | undefined {
68
+ const waits = (header.budget_waits ?? []).filter((wait) => is_lane_row(row, wait))
69
+
70
+ return waits.toSorted((left, right) => right.waited_ms - left.waited_ms).at(0)
71
+ }
72
+
73
+ function place_text(wait: BudgetWait, link: (reference: string) => string): string {
74
+ if (wait.elsewhere !== undefined) return wait.elsewhere
75
+
76
+ return wait.lane === undefined ? MAIN_CHECKOUT : link(wait.lane)
77
+ }
78
+
79
+ function rows_of(header: BoardHeader): Array<BoardRow> {
80
+ return header.layout === undefined ? [] : run_board_layout.rows_of(header.layout)
81
+ }
82
+
83
+ // The waits no running row owns.
84
+ function stray_of(header: BoardHeader): Array<BudgetWait> {
85
+ const rows = rows_of(header)
86
+
87
+ return (header.budget_waits ?? []).filter((wait) => rows.every((row) => !is_lane_row(row, wait)))
88
+ }
89
+
90
+ // The waits the frame draws: each held row's and every one no row owns.
91
+ function drawn_of(header: BoardHeader): Array<BudgetWait> {
92
+ const held = rows_of(header).flatMap((row) => held_of(row, header) ?? [])
93
+
94
+ return [...held, ...stray_of(header)]
95
+ }
96
+
97
+ // One line for each wait no running row draws, nothing while none waits.
98
+ function stray_lines(header: BoardHeader): Array<string> {
99
+ return stray_of(header).map(
100
+ (wait) => `${INDENT}${BUDGET_ICON} ${held_text(wait)} ${place_text(wait, header.link)}`,
101
+ )
102
+ }
103
+
104
+ // 🚧 and the reasons the frame draws, nothing while it draws no wait.
105
+ function legend_of(header: BoardHeader): Array<string> {
106
+ const waits = drawn_of(header)
107
+
108
+ if (waits.length === 0) return []
109
+
110
+ const icons = new Set(waits.map((wait) => REASON_ICONS[wait.reason]))
111
+ const reasons = REASON_WORDS.filter(([icon]) => icons.has(icon))
112
+
113
+ return [`${BUDGET_ICON} ${WORDS.held_check}`, ...reasons.map(([icon, word]) => `${icon} ${word}`)]
114
+ }
115
+
116
+ const run_board_render_waits = {
117
+ BUDGET_ICON,
118
+ check_of,
119
+ held_of,
120
+ held_time,
121
+ legend_of,
122
+ stray_lines,
123
+ }
124
+
125
+ export { run_board_render_waits }