@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,5 +1,7 @@
1
1
  import { styleText } from 'node:util'
2
- import { backlog_budget } from '#scripts/backlog/backlog-budget'
2
+ import type { BudgetWait } from '#scripts/gate/core-wait'
3
+ import { MS_PER_MINUTE } from '#scripts/lib/timeouts'
4
+ import { run_board_estimate } from './run-board-estimate'
3
5
  import { run_board_fit } from './run-board-fit'
4
6
  import { run_board_fresh } from './run-board-fresh'
5
7
  import { run_board_labels } from './run-board-labels'
@@ -7,14 +9,18 @@ import { run_board_layout, type BoardLayout, type BoardRow } from './run-board-l
7
9
  import { run_board_machine, type MachineGauges } from './run-board-machine'
8
10
  import { run_board_now, type NowLine } from './run-board-now'
9
11
  import type { SessionOperations } from './run-board-operation-read'
12
+ import { run_board_priority } from './run-board-priority'
13
+ import type { ProcessGroups } from './run-board-process-groups'
10
14
  import { run_board_render_slot } from './run-board-render-slot'
15
+ import { run_board_render_title } from './run-board-render-title'
11
16
  import type { RunActivity } from './run-board-status'
12
- import type { LaneUsages } from './run-board-usage'
17
+ import type { LaneUsages, UsageScale } from './run-board-usage'
13
18
  import type { UsualTimes } from './run-board-usual'
14
19
 
15
20
  // The top of `run:board`: whether the run is moving, how long it has run, how fresh its last event is,
16
21
  // and how far through the plan it is. Every time comes from a record (the carry's start, the stream's
17
- // events); nothing here guesses one. Two lines of symbols rather than sentences: the `⏰` that moves
22
+ // events); nothing here guesses one, but the estimated finish after the progress bar, which is drawn `~`
23
+ // as the estimate it is (`run-board-estimate.ts`). Two lines of symbols rather than sentences: the `⏰` that moves
18
24
  // every second is the proof the board is live, so no `updated` line is drawn. **Always three lines,
19
25
  // the first two in three columns**: the run's mark and name over its repository's, the run's age over
20
26
  // the `💓`, then the progress over the machine the run is on — so the first line reads as how far the
@@ -27,6 +33,9 @@ import type { UsualTimes } from './run-board-usual'
27
33
 
28
34
  const { HEADER_ICONS, STATE_ICONS, WORDS, bar_of, minute_of, span_of } = run_board_labels
29
35
  const { cell_of } = run_board_render_slot
36
+ const { title_of } = run_board_render_title
37
+ // The columns a failed read's reason is cut to, so the header keeps its line.
38
+ const REASON_LIMIT = 40
30
39
  const { padded } = run_board_fresh
31
40
  const aged_fresh = run_board_fresh.aged
32
41
  const UNKNOWN = '-'
@@ -36,7 +45,7 @@ const { GAP, PERCENT_WIDTH } = run_board_machine
36
45
  // A running run whose newest event is older than this is drawn as stale, so a hang stands out; past
37
46
  // twice that it is drawn as alarming.
38
47
  const STALE_MINUTES = 15
39
- const STALE_MS = STALE_MINUTES * backlog_budget.MS_PER_MINUTE
48
+ const STALE_MS = STALE_MINUTES * MS_PER_MINUTE
40
49
  const ALARM_FACTOR = 2
41
50
  const ALARM_MS = STALE_MS * ALARM_FACTOR
42
51
  const RUN_NAME = 'backlogrun'
@@ -46,6 +55,14 @@ const RUN_NAME = 'backlogrun'
46
55
  // means nothing.
47
56
  type BoardForm = 'screen' | 'chat'
48
57
 
58
+ // What the lane cells and the processes section are drawn from, and the machine a gauge's width
59
+ // stands for.
60
+ interface BoardUsage {
61
+ lanes: LaneUsages
62
+ processes: ProcessGroups
63
+ scale: UsageScale
64
+ }
65
+
49
66
  interface BoardHeader {
50
67
  now_ms: number
51
68
  started_ms: number
@@ -59,14 +76,22 @@ interface BoardHeader {
59
76
  baseline_total: number | undefined
60
77
  plan_fetched_ms: number | undefined
61
78
  plan_failed_ms: number | undefined
79
+ // When the reads off this machine last failed (`run-board-gather-thread.ts`); none once they answer.
80
+ read_failed_ms?: number | undefined
81
+ // Why they failed, drawn beside the failure.
82
+ read_error?: string | undefined
62
83
  // Whether a plan read is in flight.
63
84
  is_plan_loading: boolean
64
85
  // The machine's gauges, `undefined` before the first sample.
65
86
  machine: MachineGauges | undefined
66
- // Each running lane's CPU and memory, `undefined` where none could be read.
67
- usages?: LaneUsages | undefined
87
+ // Each running lane's and each process group's usage, `undefined` where none could be read.
88
+ usages?: BoardUsage | undefined
89
+ // The claims waiting in the machine-wide core budget (`run-board-render-waits.ts`).
90
+ budget_waits?: ReadonlyArray<BudgetWait> | undefined
68
91
  // How long each phase usually takes; a running row's phase time is colored against it.
69
92
  usual?: UsualTimes | undefined
93
+ // How many lanes the run may hold at once, which the estimated finish stacks the waiting children on.
94
+ lane_limit?: number | undefined
70
95
  // The spinner's frame a running run and a running row turn, `undefined` where the output is not a
71
96
  // terminal and they draw their still icons.
72
97
  spinner: string | undefined
@@ -107,7 +132,7 @@ function count_state(rows: ReadonlyArray<BoardRow>, state: BoardRow['state']): n
107
132
  function counts_of(layout: BoardLayout): BoardCounts {
108
133
  const total = run_board_layout.rows_of(layout).length
109
134
  const parked = count_state(layout.active, 'parked')
110
- const settled = count_state(layout.active, 'merged') + parked + count_state(layout.active, 'done')
135
+ const settled = layout.active.filter((row) => run_board_layout.is_settled(row.state)).length
111
136
  const running = count_state(layout.active, 'running')
112
137
 
113
138
  return { total, settled, parked, running, remaining: total - settled - running }
@@ -123,7 +148,9 @@ function quiet_mark(header: BoardHeader): RunMark {
123
148
 
124
149
  if (header.activity.setup !== undefined) return 'setup'
125
150
 
126
- return layout?.waves.length === 0 && layout.people.length > 0 ? 'human' : 'idle'
151
+ return layout?.queued.length === 0 && run_board_layout.people_of(layout).length > 0
152
+ ? 'human'
153
+ : 'idle'
127
154
  }
128
155
 
129
156
  // The run's state, each state overriding the ones below it.
@@ -247,13 +274,13 @@ function time_parts(header: BoardHeader, mark: RunMark, now: NowLine | undefined
247
274
  ]
248
275
  }
249
276
 
250
- // A plan fetch is said only when it failed — the board otherwise keeps quiet about a routine read.
251
- function plan_warning(header: BoardHeader): string | undefined {
252
- const failed = header.plan_failed_ms
253
-
277
+ // A read is said only when it failed — the board otherwise keeps quiet about a routine read — and why,
278
+ // where that is known, cut so it never pushes the line past its pane.
279
+ function warning_of(word: string, failed: number | undefined, reason?: string): string | undefined {
254
280
  if (failed === undefined) return undefined
281
+ const why = reason === undefined || reason === '' ? '' : ` ${title_of(reason, REASON_LIMIT)}`
255
282
 
256
- return styleText('yellow', `⚠ ${WORDS.plan} ${minute_of(failed)}`)
283
+ return styleText('yellow', `${HEADER_ICONS.warning} ${word} ${minute_of(failed)}${why}`)
257
284
  }
258
285
 
259
286
  // A plan read in flight turns the spinner after ⏳ and says nothing more; a
@@ -304,20 +331,39 @@ function tally_part(counts: BoardCounts, header: BoardHeader): string {
304
331
  return `${STATE_ICONS.merged} ${tally} ${bar}`
305
332
  }
306
333
 
307
- function progress_parts(counts: BoardCounts, header: BoardHeader): Array<string> {
334
+ // The estimated finish after the bar (`run-board-estimate.ts`), once the plan says what is left to run.
335
+ // A stopped run advances nothing, so an estimate would count down to a finish that never comes.
336
+ function estimate_part(header: BoardHeader): string | undefined {
337
+ const is_moving = is_plan_read(header) && !header.activity.is_stopped
338
+
339
+ return is_moving ? run_board_estimate.part_of(header) : undefined
340
+ }
341
+
342
+ // The ⏳ count with the priorities among it (joshuafolkken/kit#4383).
343
+ function waiting_of(counts: BoardCounts, header: BoardHeader): string {
344
+ return `${String(counts.remaining)}${run_board_priority.tally_of(layout_of(header))}`
345
+ }
346
+
347
+ function progress_parts(counts: BoardCounts, header: BoardHeader): Array<string | undefined> {
308
348
  const is_read = is_plan_read(header)
309
349
 
310
350
  return [
311
351
  `${tally_part(counts, header)}${is_read ? plus_of(counts, header) : ''}`,
352
+ estimate_part(header),
312
353
  `${STATE_ICONS.running} ${String(counts.running)}`,
313
- `${STATE_ICONS.waiting} ${is_read ? String(counts.remaining) : UNKNOWN}`,
354
+ `${STATE_ICONS.waiting} ${is_read ? waiting_of(counts, header) : UNKNOWN}`,
314
355
  `${STATE_ICONS.parked} ${String(counts.parked)}`,
315
356
  ]
316
357
  }
317
358
 
318
- // The run's progress, then what its plan read is doing.
359
+ // The run's progress, then what its reads are doing.
319
360
  function progress_part(counts: BoardCounts, header: BoardHeader): string {
320
- const parts = [...progress_parts(counts, header), loading_part(header), plan_warning(header)]
361
+ const parts = [
362
+ ...progress_parts(counts, header),
363
+ loading_part(header),
364
+ warning_of(WORDS.plan, header.plan_failed_ms),
365
+ warning_of(WORDS.read, header.read_failed_ms, header.read_error),
366
+ ]
321
367
 
322
368
  return parts.filter((part) => part !== undefined).join(GAP)
323
369
  }
@@ -339,7 +385,7 @@ function now_line(counts: BoardCounts, header: BoardHeader): NowLine | undefined
339
385
  children: running_issues(layout_of(header)),
340
386
  running: counts.running,
341
387
  waiting: is_plan_read(header) ? counts.remaining : undefined,
342
- people: layout_of(header).people.length,
388
+ people: run_board_layout.people_of(layout_of(header)).length,
343
389
  })
344
390
  }
345
391
 
@@ -372,7 +418,7 @@ function column_of(cells: ReadonlyArray<string>): Array<string> {
372
418
  }
373
419
 
374
420
  // The run's name, age and progress, then its repository, heartbeat and machine under them, then what
375
- // it is doing now — its time under theirs, its kind's icon under the `⚡`, the name's column left blank
421
+ // it is doing now — its time under theirs, its kind's icon under the `💪`, the name's column left blank
376
422
  // and no label — in every state the board can be in. A stream with no event yet leaves it blank.
377
423
  function header_lines(header: BoardHeader): Array<string> {
378
424
  const counts = counts_of(layout_of(header))
@@ -394,7 +440,26 @@ function now_legend(header: BoardHeader): string | undefined {
394
440
  return now?.legend === undefined ? undefined : `${now.icon} ${now.legend}`
395
441
  }
396
442
 
397
- const run_board_header = { aged, counts_of, header_lines, is_plan_read, now_legend }
443
+ // The estimated finish as the legend names it, on a frame that draws it alone.
444
+ function estimate_legend(header: BoardHeader): string | undefined {
445
+ return estimate_part(header) === undefined ? undefined : run_board_estimate.LEGEND
446
+ }
447
+
448
+ // The third line's icon, so the legend names the phase it draws.
449
+ function now_icon(header: BoardHeader): string | undefined {
450
+ return now_line(counts_of(layout_of(header)), header)?.icon
451
+ }
452
+
453
+ const run_board_header = {
454
+ aged,
455
+ counts_of,
456
+ estimate_legend,
457
+ header_lines,
458
+ is_plan_read,
459
+ now_icon,
460
+ now_legend,
461
+ warning_of,
462
+ }
398
463
 
399
464
  export { run_board_header }
400
- export type { BoardCounts, BoardForm, BoardHeader }
465
+ export type { BoardCounts, BoardForm, BoardHeader, BoardUsage }
@@ -0,0 +1,58 @@
1
+ import type { SectionKey } from './run-board-fit'
2
+ import { run_board_fold } from './run-board-fold'
3
+
4
+ // The keys a live `run:board` reads: one per section, folding it or unfolding it (`run-board-fold.ts`).
5
+ // The terminal is put in raw mode so a key arrives without Enter, which also stops it from turning
6
+ // Ctrl-C into SIGINT — so Ctrl-C is read as a key and quits, and leaving puts the terminal back.
7
+
8
+ const CTRL_C = '\u{3}'
9
+
10
+ // The keyboard as the board uses it; `interrupt` is what Ctrl-C does once raw mode reads it as a key.
11
+ interface KeyInput {
12
+ is_tty: boolean
13
+ raw: (is_raw: boolean) => void
14
+ listen: (on_data: (chunk: string) => void) => void
15
+ close: () => void
16
+ interrupt: () => void
17
+ }
18
+
19
+ // The sections folded so far, read at every redraw — none where no key can be read — and what puts the
20
+ // terminal back.
21
+ interface KeyReading {
22
+ folded: (() => ReadonlySet<SectionKey>) | undefined
23
+ stop?: (() => void) | undefined
24
+ }
25
+
26
+ // What a chunk of keys leaves folded, each key in the order typed.
27
+ function folded_by(folded: ReadonlySet<SectionKey>, chunk: string): ReadonlySet<SectionKey> {
28
+ let next = folded
29
+
30
+ for (const key of chunk) next = run_board_fold.toggled(next, key)
31
+
32
+ return next
33
+ }
34
+
35
+ function read_keys(input: KeyInput | undefined): KeyReading {
36
+ if (input?.is_tty !== true) return { folded: undefined }
37
+
38
+ let folded: ReadonlySet<SectionKey> = new Set()
39
+
40
+ input.raw(true)
41
+ input.listen((chunk) => {
42
+ if (chunk.includes(CTRL_C)) input.interrupt()
43
+ else folded = folded_by(folded, chunk)
44
+ })
45
+
46
+ return {
47
+ folded: () => folded,
48
+ stop: () => {
49
+ input.raw(false)
50
+ input.close()
51
+ },
52
+ }
53
+ }
54
+
55
+ const run_board_keys = { CTRL_C, read_keys }
56
+
57
+ export { run_board_keys }
58
+ export type { KeyInput, KeyReading }
@@ -4,6 +4,8 @@ import {
4
4
  BUGFIX_LABEL,
5
5
  ENHANCEMENT_LABEL,
6
6
  has_label_name,
7
+ PRIORITY_CRITICAL_LABEL,
8
+ PRIORITY_HIGH_LABEL,
7
9
  } from '#scripts/issue/issue-labels'
8
10
  import type { FiledKind } from '#scripts/run/event/run-event-filed'
9
11
 
@@ -12,12 +14,9 @@ import type { FiledKind } from '#scripts/run/event/run-event-filed'
12
14
  // there. An issue with labels from several takes the first, as the release notes do; one with none is
13
15
  // an Other Change and draws no kind.
14
16
 
15
- const SEMVER_MAJOR_LABEL = 'Semver-Major'
16
- const SEMVER_MINOR_LABEL = 'Semver-Minor'
17
-
18
17
  const RELEASE_KINDS: ReadonlyArray<readonly [FiledKind, ReadonlyArray<string>]> = [
19
- ['breaking-change', [BREAKING_CHANGE_LABEL, SEMVER_MAJOR_LABEL]],
20
- ['enhancement', [ENHANCEMENT_LABEL, SEMVER_MINOR_LABEL]],
18
+ ['breaking-change', [BREAKING_CHANGE_LABEL]],
19
+ ['enhancement', [ENHANCEMENT_LABEL]],
21
20
  ['bug', [BUGFIX_LABEL, BUG_LABEL]],
22
21
  ]
23
22
 
@@ -30,6 +29,21 @@ function kind_of(labels: ReadonlyArray<string> | undefined): FiledKind | undefin
30
29
  return RELEASE_KINDS.find(([, names]) => names.some((name) => has_label_name(labels, name)))?.[0]
31
30
  }
32
31
 
33
- const run_board_kind = { KIND_ORDER, kind_of }
32
+ // The priority a row is drawn with (joshuafolkken/kit#4383): critical over high, none for the rest.
33
+ type BoardPriority = 'critical' | 'high'
34
+
35
+ const PRIORITIES: ReadonlyArray<readonly [BoardPriority, string]> = [
36
+ ['critical', PRIORITY_CRITICAL_LABEL],
37
+ ['high', PRIORITY_HIGH_LABEL],
38
+ ]
39
+
40
+ function priority_of(labels: ReadonlyArray<string> | undefined): BoardPriority | undefined {
41
+ if (labels === undefined) return undefined
42
+
43
+ return PRIORITIES.find(([, name]) => has_label_name(labels, name))?.[0]
44
+ }
45
+
46
+ const run_board_kind = { KIND_ORDER, kind_of, priority_of }
34
47
 
48
+ export type { BoardPriority }
35
49
  export { run_board_kind }
@@ -1,22 +1,19 @@
1
1
  import { WriteStream } from 'node:tty'
2
2
  import { styleText } from 'node:util'
3
+ import { figure_format } from '#scripts/lib/figure-format'
3
4
  import type { FiledKind } from '#scripts/run/event/run-event-filed'
4
5
  import { run_event_setup } from '#scripts/run/event/run-event-setup'
5
6
  import cli_spinners from 'cli-spinners'
7
+ import { run_board_length } from './run-board-length'
6
8
  import type { BoardNote } from './run-board-notes'
7
9
  import type { Phase } from './run-board-phase'
8
10
  import type { ItemState } from './run-board-status'
9
11
 
10
12
  // The words and the clock `run:board` draws with. A moment on the board is a local clock, `HH:MM`
11
- // where a person reads it to the minute; how long a row or the heartbeat has run is a short `MM:SS`,
12
- // and how long the run has run or its wait has left is `H:MM:SS` — two separators are a length and one
13
- // is a time of day, so the header's time column never reads a length as a moment.
14
-
15
- const CLOCK_WIDTH = 2
16
- const CLOCK_PAD = '0'
17
- const MS_PER_SECOND = 1000
18
- const SECONDS_PER_MINUTE = 60
19
- const MINUTES_PER_HOUR = 60
13
+ // where a person reads it to the minute; every length — how long the run, a row, a phase or the
14
+ // heartbeat has run — is degree-minute-second style (`1°15′57″`), so `:` is a time of day alone and
15
+ // the board never reads a length as a moment.
16
+
20
17
  // Every gauge is this wide — the plan, the machine and a row's phase.
21
18
  const BAR_WIDTH = 10
22
19
  // A centered square done and a thin line left: the shapes alone tell the two apart where no color is
@@ -40,14 +37,43 @@ const DEFAULT_FOREGROUND = `${ESC}[39m`
40
37
  const WORDS = {
41
38
  no_run: 'no run',
42
39
  plan: 'plan',
40
+ // The reads off this machine — the run's stream, its lanes and the gauges — that last failed.
41
+ read: 'read',
43
42
  merged: 'merged',
44
43
  parked: 'parked',
45
44
  done: 'done',
45
+ withdrawn: 'withdrawn',
46
46
  in_progress: 'running',
47
47
  stopped: 'stopped',
48
+ paused: 'paused',
49
+ earlier: 'earlier run',
50
+ unknown: 'lane state unknown',
48
51
  waiting: 'waiting',
52
+ queued: 'queued',
53
+ not_before: 'not before',
49
54
  decision: 'decision',
50
55
  waits: 'waits on',
56
+ // What a waiting row waits on, where the legend names its icon.
57
+ opening: 'opening lane',
58
+ installing: 'installing',
59
+ dispatching: 'dispatching',
60
+ lane: 'free lane',
61
+ path: 'path held',
62
+ named: 'named order',
63
+ held: 'held by triage',
64
+ headroom: 'memory headroom',
65
+ untriaged: 'untriaged',
66
+ solo: 'runs alone',
67
+ solo_ahead: 'behind solo',
68
+ solo_running: 'solo running',
69
+ // A blocker this run will not finish, which a person has to move (joshuafolkken/kit#4292).
70
+ on_human: 'needs a person',
71
+ // A lane held back by the machine-wide core budget, and why.
72
+ held_check: 'held',
73
+ memory: 'waits for memory',
74
+ cores: 'waits for CPU',
75
+ // How long a lane has run, which the lanes rule's ⏰ stands over.
76
+ elapsed: 'elapsed',
51
77
  investigate: 'investigate',
52
78
  implement: 'implement',
53
79
  ship: 'ship',
@@ -59,9 +85,10 @@ const WORDS = {
59
85
  followup: 'followup',
60
86
  report: 'report',
61
87
  failed: 'failed',
62
- notes: 'findings and decisions',
88
+ notes: 'findings',
63
89
  more: 'more',
64
90
  filed: 'filed',
91
+ filed_run: 'filed this run',
65
92
  breaking: 'breaking',
66
93
  feature: 'feature',
67
94
  fix: 'fix',
@@ -74,6 +101,7 @@ const WORDS = {
74
101
  on_person: 'waiting on a person',
75
102
  operation: 'operation',
76
103
  ended: 'ended',
104
+ estimate: 'estimated finish',
77
105
  // The session a stopped run waits in, and what closing the board leaves.
78
106
  resume: 'stopped — resume with',
79
107
  keeps_running: 'Closing this screen leaves the run going · reopen with `pnpm josh backlogrun`',
@@ -104,11 +132,21 @@ const STATE_ICONS: Readonly<Record<ItemState, string>> = {
104
132
  waiting: '⏳',
105
133
  human: '🙋',
106
134
  stopped: '🛑',
135
+ paused: '🧊',
136
+ withdrawn: '🚫',
137
+ unknown: '❔',
107
138
  }
108
139
 
109
140
  // The blocking edge, chosen on the same rule: ⛓ is a text symbol.
110
141
  const WAITS_ICON = '🔗'
111
142
 
143
+ // A waiting row that waits on the start time its body declares rather than on a blocker
144
+ // (joshuafolkken/kit#4079), chosen on the same rule: 🗓 is a text symbol.
145
+ const NOT_BEFORE_ICON = '📅'
146
+
147
+ // The lanes section's rule, and a waiting row that waits on a free lane.
148
+ const LANES_ICON = '🧵'
149
+
112
150
  // A running row's phases as icons, chosen on the same rule; the row draws every phase it has passed,
113
151
  // so the rightmost icon is what it is doing now. Each of `josh ship`'s stages has its own; ⚓ rather
114
152
  // than 🔁, which reads as a retry.
@@ -147,6 +185,9 @@ const PHASE_WORDS: Readonly<Record<Phase, keyof Words>> = {
147
185
  // phase and state icon, so the legend names them and a row needs no word. 🆕 is a filed issue whose
148
186
  // kind is none of `FILED_KIND_ICONS`.
149
187
  const NOTES_ICON = '📌'
188
+ // A plan row the run filed leads its title with it, in place of a findings line naming it again
189
+ // (joshuafolkken/kit#4099).
190
+ const FILED_RUN_MARK = '✚'
150
191
  const NOTE_ICONS: Readonly<Record<BoardNote['kind'], string>> = {
151
192
  filed: '🆕',
152
193
  park: STATE_ICONS.parked,
@@ -169,25 +210,32 @@ const KIND_WORDS: Readonly<Record<FiledKind, keyof Words>> = {
169
210
  bug: 'fix',
170
211
  }
171
212
 
172
- // The header's gauges and marks. ⚡ rather than 🔥: a fire beside a gauge drawn green reads as an
173
- // alarm. ⏰ rather than ⏱, a text symbol some terminals draw one column wide: under it the 💓's digits
174
- // would stand a column off.
213
+ // The header's gauges and marks. 💪 for the CPU: ⚡ is drawn too thin to see, a 🔥 beside a gauge
214
+ // drawn green reads as an alarm, and 💻 is hard to tell from 💾. ⏰ rather than ⏱, a text symbol
215
+ // some terminals draw one column wide: under it the 💓's digits would stand a column off.
175
216
  const HEADER_ICONS = {
176
- cpu: '⚡',
217
+ cpu: '💪',
177
218
  memory: '🧠',
178
219
  swap: '💾',
179
220
  ended: '🔚',
180
221
  loading: '⏳',
181
222
  elapsed: '⏰',
182
223
  heartbeat: '💓',
224
+ // A failed plan read: ❗ rather than ⚠, a text symbol drawn two columns wide over the blank after it.
225
+ warning: '❗',
226
+ // The estimated finish: 🎯 rather than 🏁, a done row's state icon, so the legend names each once
227
+ // (joshuafolkken/kit#4538).
228
+ estimate: '🎯',
183
229
  } as const
184
230
 
185
- // The kind of what the header's third line says, under the `⚡` (joshuafolkken/kit#3767): a call a
231
+ // The kind of what the header's third line says, under the `💪` (joshuafolkken/kit#3767): a call a
186
232
  // session made, the run watching its pool, the run ended, or each of the run's own stages, keyed by the
187
233
  // stage's words before any issue. A child's event draws its row's phase icon instead. The run ended
188
234
  // draws the header's own end mark — 🏁 is already a done row's state icon.
189
235
  const NOW_ICONS = { operation: '🔧', watching: '🔭', ended: HEADER_ICONS.ended } as const
190
236
  const { STAGE, LANE_STAGE } = run_event_setup
237
+ // The stages a lane's launch passes, which a queued row waiting on its lane leads with too.
238
+ const LANE_STAGE_ICONS = { opening: '🚪', installing: '📥', dispatching: '📤' } as const
191
239
  const STAGE_ICONS: Readonly<Partial<Record<string, string>>> = {
192
240
  [STAGE.STARTING]: '🚀',
193
241
  [STAGE.PLANNING]: '📝',
@@ -195,11 +243,50 @@ const STAGE_ICONS: Readonly<Partial<Record<string, string>>> = {
195
243
  [STAGE.JUDGING]: '🤔',
196
244
  [STAGE.SESSION]: '💭',
197
245
  [STAGE.NO_CHILD]: '🚫',
198
- [LANE_STAGE.OPENING]: '🚪',
199
- [LANE_STAGE.INSTALLING]: '📥',
200
- [LANE_STAGE.DISPATCHING]: '📤',
246
+ [LANE_STAGE.OPENING]: LANE_STAGE_ICONS.opening,
247
+ [LANE_STAGE.INSTALLING]: LANE_STAGE_ICONS.installing,
248
+ [LANE_STAGE.DISPATCHING]: LANE_STAGE_ICONS.dispatching,
201
249
  }
202
250
 
251
+ // What a queued or waiting row leads with (joshuafolkken/kit#4288), in place of ⏳: 📂 a path a
252
+ // running issue holds, 📋 the declared order, ✋ a pool held for a judgment, ❓ an issue nobody has
253
+ // judged, 🧍 a `run:solo` issue waiting for the running lanes, 🙅 a row behind it (#4294; 🚧 is a
254
+ // held check's) and 🔒 a row a running `run:solo` issue holds (#4391), chosen on the same rule as
255
+ // every row icon. The rest are the board's own, shared rather than copied.
256
+ const WAIT_ICONS = {
257
+ path: '📂',
258
+ named: '📋',
259
+ held: '✋',
260
+ untriaged: '❓',
261
+ solo: '🧍',
262
+ solo_ahead: '🙅',
263
+ solo_running: '🔒',
264
+ lane: LANES_ICON,
265
+ memory: HEADER_ICONS.memory,
266
+ blocker: WAITS_ICON,
267
+ not_before: NOT_BEFORE_ICON,
268
+ } as const
269
+
270
+ // The legend's word for each icon a waiting row can lead with — a lane's stage among them. 📝, the
271
+ // planning a row waits on, is the plan phase's icon, which the legend names already.
272
+ const WAIT_WORDS: ReadonlyArray<readonly [icon: string, word: keyof Words]> = [
273
+ [LANE_STAGE_ICONS.opening, 'opening'],
274
+ [LANE_STAGE_ICONS.installing, 'installing'],
275
+ [LANE_STAGE_ICONS.dispatching, 'dispatching'],
276
+ [WAIT_ICONS.lane, 'lane'],
277
+ [WAIT_ICONS.path, 'path'],
278
+ [WAIT_ICONS.named, 'named'],
279
+ [WAIT_ICONS.held, 'held'],
280
+ [WAIT_ICONS.solo, 'solo'],
281
+ [WAIT_ICONS.solo_ahead, 'solo_ahead'],
282
+ [WAIT_ICONS.solo_running, 'solo_running'],
283
+ [WAIT_ICONS.memory, 'headroom'],
284
+ [WAIT_ICONS.untriaged, 'untriaged'],
285
+ [WAIT_ICONS.blocker, 'waits'],
286
+ [STATE_ICONS.human, 'on_human'],
287
+ [WAIT_ICONS.not_before, 'not_before'],
288
+ ]
289
+
203
290
  // **The machine gauges' three colors, decided here alone**: Activity Monitor's green, yellow and red
204
291
  // in the system's dark-mode values. A palette's `green` draws blue and its `red` orange in a VSCode
205
292
  // terminal, so the normal gauge would read as the cyan plan bar and the busy one as yellow.
@@ -209,60 +296,16 @@ const GAUGE_SHADES = {
209
296
  red: { rgb: '255;69;58', named: 'red' },
210
297
  } as const satisfies Readonly<Record<string, Shade>>
211
298
 
212
- function two_digits(value: number): string {
213
- return String(value).padStart(CLOCK_WIDTH, CLOCK_PAD)
214
- }
215
-
216
- // The local wall-clock `HH:MM:SS` of a moment.
217
- function clock_of(ms: number): string {
218
- const date = new Date(ms)
299
+ const { two_digits, clock_of, minute_of } = figure_format
300
+ const { minute_span_of, span_of } = run_board_length
219
301
 
220
- return [date.getHours(), date.getMinutes(), date.getSeconds()]
221
- .map((value) => two_digits(value))
222
- .join(':')
223
- }
224
-
225
- // The local wall-clock `HH:MM` of a moment, for one a person reads to the minute — when a run ended, or
226
- // when a finding was filed.
227
- function minute_of(ms: number): string {
302
+ // The local `MM-DD HH:MM` of a moment, for one that may fall on another day — when a waiting row may
303
+ // start, in the condition column it is the widest value of (joshuafolkken/kit#4288).
304
+ function day_minute_of(ms: number): string {
228
305
  const date = new Date(ms)
306
+ const day = [date.getMonth() + 1, date.getDate()].map((value) => two_digits(value))
229
307
 
230
- return [date.getHours(), date.getMinutes()].map((value) => two_digits(value)).join(':')
231
- }
232
-
233
- // How long a row's child has run, as `MM:SS` whose minutes never carry into hours (`61:05`), so every
234
- // row reads one short column; a negative span reads as zero.
235
- function elapsed_of(ms: number): string {
236
- const seconds = Math.floor(Math.max(0, ms) / MS_PER_SECOND)
237
- const minutes = Math.floor(seconds / SECONDS_PER_MINUTE)
238
-
239
- return `${two_digits(minutes)}:${two_digits(seconds % SECONDS_PER_MINUTE)}`
240
- }
241
-
242
- // A length as its hours, and its minutes and seconds within the hour; a negative span reads as zero.
243
- function span_fields(ms: number): [hours: number, minutes: number, seconds: number] {
244
- const seconds = Math.floor(Math.max(0, ms) / MS_PER_SECOND)
245
- const minutes = Math.floor(seconds / SECONDS_PER_MINUTE)
246
- const hours = Math.floor(minutes / MINUTES_PER_HOUR)
247
-
248
- return [hours, minutes % MINUTES_PER_HOUR, seconds % SECONDS_PER_MINUTE]
249
- }
250
-
251
- // How long the run has run or its stream has been silent, as `H:MM:SS` with the hours not padded; a negative
252
- // span reads as zero. Always three fields, so a run under an hour (`0:03:25`) never reads as a time.
253
- function span_of(ms: number): string {
254
- const [hours, ...tail] = span_fields(ms)
255
-
256
- return [String(hours), ...tail.map((value) => two_digits(value))].join(':')
257
- }
258
-
259
- // How long the run has stood at its stage, as `M:SS` with the minutes not padded, and as `span_of`'s
260
- // `H:MM:SS` from an hour on. It stands beside the stage's words, never in the header's time column, so
261
- // its one separator is not read there as a time of day.
262
- function stage_span_of(ms: number): string {
263
- const [hours, minutes, seconds] = span_fields(ms)
264
-
265
- return hours === 0 ? `${String(minutes)}:${two_digits(seconds)}` : span_of(ms)
308
+ return `${day.join('-')} ${minute_of(ms)}`
266
309
  }
267
310
 
268
311
  function is_shade(color: Paint): color is Shade {
@@ -315,6 +358,7 @@ function spinner_of(now_ms: number): string {
315
358
 
316
359
  const run_board_labels = {
317
360
  FILED_KIND_ICONS,
361
+ FILED_RUN_MARK,
318
362
  GAUGE_SHADES,
319
363
  HEADER_ICONS,
320
364
  KIND_BLANK,
@@ -330,13 +374,16 @@ const run_board_labels = {
330
374
  WAITS_ICON,
331
375
  WORDS,
332
376
  bar_of,
377
+ LANES_ICON,
378
+ WAIT_ICONS,
379
+ WAIT_WORDS,
333
380
  clock_of,
334
- elapsed_of,
381
+ day_minute_of,
335
382
  minute_of,
383
+ minute_span_of,
336
384
  painted,
337
385
  span_of,
338
386
  spinner_of,
339
- stage_span_of,
340
387
  }
341
388
 
342
389
  export { run_board_labels }