@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,23 +1,25 @@
1
- #!/usr/bin/env tsx
2
1
  import { setTimeout as sleep } from 'node:timers/promises'
3
- import { fileURLToPath } from 'node:url'
4
2
  import { styleText } from 'node:util'
5
- import { machine_capacity } from '#scripts/gate/machine-capacity'
3
+ import { MS_PER_MINUTE } from '#scripts/lib/timeouts'
6
4
  import { telegram_notify } from '#scripts/notify/telegram-notify'
7
5
  import { run_progress } from '#scripts/run/progress/run-progress'
8
6
  import { run_progress_read } from '#scripts/run/progress/run-progress-read'
9
7
  import terminalLink from 'terminal-link'
10
8
  import { run_board_closed } from './run-board-closed'
11
9
  import { run_board_every } from './run-board-every'
10
+ import { run_board_fold } from './run-board-fold'
11
+ import { run_board_gather } from './run-board-gather'
12
+ import { run_board_gather_live } from './run-board-gather-live'
13
+ import { run_board_gather_thread } from './run-board-gather-thread'
14
+ import { run_board_keys, type KeyReading } from './run-board-keys'
12
15
  import { run_board_labels } from './run-board-labels'
13
- import { run_board_plan } from './run-board-plan'
14
- import { run_board_read } from './run-board-read'
16
+ import { run_board_plan_shared } from './run-board-plan-shared'
15
17
  import { run_board_screen, type Screen } from './run-board-screen'
18
+ import { run_board_snapshot } from './run-board-snapshot'
16
19
  import { run_board_spin } from './run-board-spin'
17
20
  import type { BoardPorts } from './run-board-state'
18
21
  import { run_board_thanks_read } from './run-board-thanks-read'
19
22
  import { run_board_tick } from './run-board-tick'
20
- import { run_board_usage_read } from './run-board-usage-read'
21
23
 
22
24
  // `josh run:board` — a full-screen board of the running `backlogrun`, redrawn once a second, its
23
25
  // spinners turned between redraws, for a person to keep open beside the run. What one redraw reads,
@@ -25,7 +27,6 @@ import { run_board_usage_read } from './run-board-usage-read'
25
27
  // terminal around it. A run that ended stays on screen until the next one starts; with no run in this
26
28
  // checkout it reads nothing from GitHub and waits.
27
29
 
28
- const ARGV_OFFSET = 2
29
30
  const SUCCESS_EXIT_CODE = 0
30
31
  const FAILURE_EXIT_CODE = 1
31
32
  const ONCE_FLAG = '--once'
@@ -47,12 +48,10 @@ function on_exit(leave: () => void): void {
47
48
  process.once('SIGTERM', () => process.exit(SIGTERM_EXIT_CODE))
48
49
  }
49
50
 
50
- const LIVE_PORTS: BoardPorts = {
51
- read_plan: async (scope) => await run_board_plan.read_plan(scope),
52
- read_local: run_board_read.read_local,
53
- read_machine: machine_capacity.read_sample,
54
- read_usage: run_board_usage_read.usage_reader(),
51
+ const LIVE_PORTS: Omit<BoardPorts, 'gather'> = {
52
+ read_plan: async (scope) => await run_board_plan_shared.read(scope),
55
53
  read_closed: async (issues) => await run_board_closed.read_all(issues),
54
+ snapshot: run_board_snapshot.file_store(),
56
55
  read_thanks: async () => await run_board_thanks_read.read_thanks(),
57
56
  now: () => Date.now(),
58
57
  write: (frame) => process.stdout.write(frame),
@@ -62,6 +61,20 @@ const LIVE_PORTS: BoardPorts = {
62
61
  // Read on every redraw, so a resized pane is fitted on the next one.
63
62
  size: () => ({ rows: process.stdout.rows, columns: process.stdout.columns }),
64
63
  form: 'screen',
64
+ keys: {
65
+ is_tty: process.stdin.isTTY,
66
+ raw: (is_raw) => {
67
+ process.stdin.setRawMode(is_raw)
68
+ },
69
+ listen: (on_data) => {
70
+ process.stdin.setEncoding('utf8').on('data', on_data).resume()
71
+ },
72
+ // Stops reading, so stdin no longer holds the process open.
73
+ close: () => {
74
+ process.stdin.pause()
75
+ },
76
+ interrupt: () => process.exit(SIGINT_EXIT_CODE),
77
+ },
65
78
  mark: async () => {
66
79
  run_progress_read.mark(await run_progress_read.stamp_target(), Date.now())
67
80
  },
@@ -74,14 +87,27 @@ const LIVE_PORTS: BoardPorts = {
74
87
  },
75
88
  }
76
89
 
90
+ // A live board reads on its worker thread, so no read stops its spinner; a single frame has no spinner
91
+ // to stop, and reads where it draws.
92
+ function live_ports(is_live: boolean): BoardPorts {
93
+ const gather = is_live
94
+ ? run_board_gather_thread.worker_gatherer()
95
+ : run_board_gather.frame_gatherer(run_board_gather_live.ports_of(false))
96
+
97
+ return { ...LIVE_PORTS, gather }
98
+ }
99
+
77
100
  // Every frame starts from the top of the alternate screen, erasing what the last one left below it, and
78
101
  // ends on the line that says closing the screen leaves the run going — only a screen a person can
79
102
  // close says it, and it is the first line to give way to a short pane. Nothing follows the last line,
80
103
  // so a frame that fills the pane never scrolls the header off the top.
104
+ // The keys are named under it where a person can type them.
81
105
  function framed(ports: BoardPorts, screen: Screen): BoardPorts {
106
+ const keys = ports.folded === undefined ? [] : [run_board_fold.KEYS_LINE]
107
+
82
108
  return {
83
109
  ...ports,
84
- footer: ['', styleText('dim', WORDS.keeps_running)],
110
+ footer: ['', ...[WORDS.keeps_running, ...keys].map((line) => styleText('dim', line))],
85
111
  write: (frame) => {
86
112
  ports.write(`${screen.frame}${frame.replace(TRAILING_NEWLINE, '')}`)
87
113
  },
@@ -89,13 +115,15 @@ function framed(ports: BoardPorts, screen: Screen): BoardPorts {
89
115
  }
90
116
 
91
117
  // Leaves the alternate screen once, whichever path gets there first: a second leave would restore the
92
- // cursor saved on entering and draw over whatever was printed after the first.
93
- function leaver(ports: BoardPorts, screen: Screen): () => void {
118
+ // cursor saved on entering and draw over whatever was printed after the first. The terminal leaves raw
119
+ // mode with it.
120
+ function leaver(ports: BoardPorts, screen: Screen, keys: KeyReading): () => void {
94
121
  let has_left = false
95
122
 
96
123
  return () => {
97
124
  if (has_left) return
98
125
  has_left = true
126
+ keys.stop?.()
99
127
  ports.write(screen.leave)
100
128
  }
101
129
  }
@@ -119,13 +147,14 @@ async function redraw_forever(ports: BoardPorts, screen: Screen): Promise<void>
119
147
  // lands on the normal screen rather than vanishing with the alternate one.
120
148
  async function watch(ports: BoardPorts): Promise<void> {
121
149
  const screen = run_board_screen.screen_of('live')
122
- const leave = leaver(ports, screen)
150
+ const keys = run_board_keys.read_keys(ports.keys)
151
+ const leave = leaver(ports, screen, keys)
123
152
 
124
153
  ports.write(screen.enter)
125
154
  ports.on_exit(leave)
126
155
 
127
156
  try {
128
- await redraw_forever(ports, screen)
157
+ await redraw_forever({ ...ports, folded: keys.folded }, screen)
129
158
  } finally {
130
159
  leave()
131
160
  }
@@ -160,25 +189,35 @@ async function push_every(minutes: string | undefined, ports: BoardPorts): Promi
160
189
  return SUCCESS_EXIT_CODE
161
190
  }
162
191
 
163
- await run_board_every.push_until_ended(ports, interval * run_progress.MS_PER_MINUTE)
192
+ await run_board_every.push_until_ended(ports, interval * MS_PER_MINUTE)
164
193
 
165
194
  return SUCCESS_EXIT_CODE
166
195
  }
167
196
 
168
- async function draw(flag: string, ports: BoardPorts): Promise<void> {
197
+ // The ports a test hands in, else the live ones.
198
+ function ports_for(ports: BoardPorts | undefined, is_live: boolean): BoardPorts {
199
+ return ports ?? live_ports(is_live)
200
+ }
201
+
202
+ async function draw(flag: string, ports: BoardPorts | undefined): Promise<void> {
169
203
  if (flag === CHAT_FLAG) {
170
- await answer(ports)
204
+ await answer(ports_for(ports, false))
171
205
 
172
206
  return
173
207
  }
174
208
 
175
- const mode = run_board_screen.mode_of({ is_tty: ports.is_tty, is_once: flag === ONCE_FLAG })
209
+ const { is_tty } = ports ?? LIVE_PORTS
210
+ const mode = run_board_screen.mode_of({ is_tty, is_once: flag === ONCE_FLAG })
211
+
212
+ if (mode === 'live') {
213
+ await watch(ports_for(ports, true))
214
+
215
+ return
216
+ }
176
217
 
177
218
  // One plain frame stays on the terminal after the command, so it draws the still icons rather than a
178
219
  // spinner frame frozen mid-turn.
179
- const once_ports = { ...ports, is_tty: false, size: undefined }
180
-
181
- await (mode === 'live' ? watch(ports) : tick(FRESH_STATE, once_ports))
220
+ await tick(FRESH_STATE, { ...ports_for(ports, false), is_tty: false, size: undefined })
182
221
  }
183
222
 
184
223
  function is_every(flag: string, rest: ReadonlyArray<string>): boolean {
@@ -189,10 +228,10 @@ function is_refused(flag: string, rest: ReadonlyArray<string>): boolean {
189
228
  return rest.length > 0 || !FLAGS.has(flag)
190
229
  }
191
230
 
192
- async function run(argv: ReadonlyArray<string>, ports: BoardPorts = LIVE_PORTS): Promise<number> {
231
+ async function run(argv: ReadonlyArray<string>, ports?: BoardPorts): Promise<number> {
193
232
  const [flag = '', ...rest] = argv
194
233
 
195
- if (is_every(flag, rest)) return await push_every(rest[0], ports)
234
+ if (is_every(flag, rest)) return await push_every(rest[0], ports_for(ports, false))
196
235
  if (is_refused(flag, rest)) return refuse()
197
236
 
198
237
  await draw(flag, ports)
@@ -202,8 +241,4 @@ async function run(argv: ReadonlyArray<string>, ports: BoardPorts = LIVE_PORTS):
202
241
 
203
242
  const run_board_cli = { DISABLED_NOTICE, USAGE, run }
204
243
 
205
- if (process.argv[1] === fileURLToPath(import.meta.url)) {
206
- process.exitCode = await run(process.argv.slice(ARGV_OFFSET))
207
- }
208
-
209
244
  export { run_board_cli }
@@ -18,10 +18,13 @@ interface ClosedIssue {
18
18
  closed_ms: number | undefined
19
19
  // Closed by a merged pull request, rather than closed by hand.
20
20
  is_merged: boolean
21
+ // Closed as not planned — withdrawn rather than finished (joshuafolkken/kit#3958).
22
+ is_not_planned: boolean
21
23
  }
22
24
 
23
- const CLOSED_FIELDS = 'title,state,closedAt,labels'
25
+ const CLOSED_FIELDS = 'title,state,stateReason,closedAt,labels'
24
26
  const CLOSED_STATE = 'CLOSED'
27
+ const NOT_PLANNED_REASON = 'not_planned'
25
28
  const STILL_OPEN = 'open' as const
26
29
 
27
30
  // What one issue answered: closed, still open, or `undefined` when it could not be read.
@@ -41,6 +44,7 @@ const READ_CONCURRENCY = 4
41
44
  const closed_schema = z.looseObject({
42
45
  title: z.string(),
43
46
  state: z.string(),
47
+ stateReason: z.string().nullish(),
44
48
  closedAt: z.string().nullish(),
45
49
  labels: z.array(issue_label_schema).default([]),
46
50
  })
@@ -69,7 +73,9 @@ async function read_closed(issue: number): Promise<ClosedRead> {
69
73
 
70
74
  const labels = view.labels.map((label) => label.name)
71
75
 
72
- return { title: view.title, labels, closed_ms: closed_ms_of(view), is_merged }
76
+ const is_not_planned = view.stateReason === NOT_PLANNED_REASON
77
+
78
+ return { title: view.title, labels, closed_ms: closed_ms_of(view), is_merged, is_not_planned }
73
79
  }
74
80
 
75
81
  async function read_all(
@@ -0,0 +1,94 @@
1
+ import { lane_state } from '#scripts/lane/lane-state'
2
+ import { run_board_kind } from './run-board-kind'
3
+ import type { BoardRow, RowRead } from './run-board-layout'
4
+ import type { ItemStatus } from './run-board-status'
5
+
6
+ // The lanes on `run:board` that are not this run's (joshuafolkken/kit#4200, #4260, #4269): an earlier
7
+ // run's lane that still holds a place under the limit, drawn after the run's own lanes with what its
8
+ // record and the stream say it is doing — its phase, its time, its usage and its newest activity, as a
9
+ // row of this run's is — and a lane with no lane state record, drawn unknown. Neither is ever counted
10
+ // as this run's.
11
+
12
+ // The earlier run's lanes still holding a place, what each is doing, and the open lanes with no record.
13
+ interface EarlierLanes {
14
+ lanes: ReadonlyArray<string>
15
+ statuses?: ReadonlyMap<number, ItemStatus> | undefined
16
+ unknown?: ReadonlyArray<string> | undefined
17
+ }
18
+
19
+ const NO_EARLIER: EarlierLanes = { lanes: [] }
20
+
21
+ // What an unknown lane's row says after its title: it has no record, and keeps its place.
22
+ const UNKNOWN_TAIL = lane_state.NO_STATE_HINT
23
+
24
+ // The mark an earlier run's running lane leads with in place of its phase (joshuafolkken/kit#4269),
25
+ // two columns wide as every row icon is (`run-board-labels.ts`, kept out of it by its size).
26
+ const EARLIER_ICON = '🧳'
27
+
28
+ // A child working now — this run's, or an earlier run's lane holding a place.
29
+ function is_live(row: BoardRow): boolean {
30
+ return row.state === 'running'
31
+ }
32
+
33
+ function base_row(
34
+ number: number,
35
+ read: RowRead,
36
+ ): Pick<BoardRow, 'number' | 'title' | 'kind' | 'priority'> {
37
+ const labels = read.labels.get(number)
38
+
39
+ return {
40
+ number,
41
+ title: read.titles.get(number),
42
+ kind: run_board_kind.kind_of(labels),
43
+ priority: run_board_kind.priority_of(labels),
44
+ }
45
+ }
46
+
47
+ // The row is drawn as its status says, marked as an earlier run's (`is_earlier`).
48
+ function earlier_row(number: number, status: ItemStatus | undefined, read: RowRead): BoardRow {
49
+ return {
50
+ ...base_row(number, read),
51
+ state: status?.state ?? 'running',
52
+ status,
53
+ waits: [],
54
+ is_earlier: true,
55
+ }
56
+ }
57
+
58
+ function unknown_row(number: number, read: RowRead): BoardRow {
59
+ return {
60
+ ...base_row(number, read),
61
+ state: 'unknown',
62
+ status: undefined,
63
+ waits: [],
64
+ reason: { tail: UNKNOWN_TAIL },
65
+ }
66
+ }
67
+
68
+ function apart_of(
69
+ lanes: ReadonlyArray<string>,
70
+ statuses: ReadonlyMap<number, ItemStatus>,
71
+ ): Array<number> {
72
+ return lanes.map(Number).filter((number) => !statuses.has(number))
73
+ }
74
+
75
+ // An earlier run's lane holding a place, then a lane with no record, unless this run has touched its
76
+ // issue since.
77
+ function rows_of(
78
+ earlier: EarlierLanes,
79
+ statuses: ReadonlyMap<number, ItemStatus>,
80
+ read: RowRead,
81
+ ): Array<BoardRow> {
82
+ const lanes = apart_of(earlier.lanes, statuses)
83
+ const unknown = apart_of(earlier.unknown ?? [], statuses)
84
+
85
+ return [
86
+ ...lanes.map((number) => earlier_row(number, earlier.statuses?.get(number), read)),
87
+ ...unknown.map((number) => unknown_row(number, read)),
88
+ ]
89
+ }
90
+
91
+ const run_board_earlier = { EARLIER_ICON, NO_EARLIER, UNKNOWN_TAIL, is_live, rows_of }
92
+
93
+ export { run_board_earlier }
94
+ export type { EarlierLanes }
@@ -0,0 +1,67 @@
1
+ import { run_event_scope } from '#scripts/run/event/run-event-scope'
2
+ import { run_event_stream, type RunEvent } from '#scripts/run/event/run-event-stream'
3
+ import { run_stalled } from '#scripts/run/park/run-stalled'
4
+
5
+ // Why a child's park or withdraw ended it, in the ending event's own words — the reason its board row
6
+ // draws and its park note carries.
7
+
8
+ const KIND = run_event_stream.EVENT_KIND
9
+ // `#<N> parked`, `#<N> parked (<reason>)` and `#<N> waiting on #<M>` lose their leading number, so a
10
+ // waiting park does not name its issue twice.
11
+ const PARK_PREFIX = /^#\d+ (?:parked\s*)?/u
12
+ const PARENTHESES = /^\((?<inner>.*)\)$/u
13
+ // `#<N> withdrawn by a person: <reason>` (`lane-withdraw.ts`).
14
+ const WITHDRAW_PREFIX = /^#\d+ withdrawn by a person:\s*/u
15
+
16
+ // `#<N> parked (needs-decision)` reads as the reason `needs-decision`; a bare park has none.
17
+ function park_reason(event: RunEvent): string {
18
+ const rest = event.text.replace(PARK_PREFIX, '')
19
+
20
+ return PARENTHESES.exec(rest)?.groups?.['inner'] ?? rest
21
+ }
22
+
23
+ // A withdraw's reason after its prefix; a text in any other shape carries none.
24
+ function withdraw_reason(event: RunEvent): string {
25
+ const rest = event.text.replace(WITHDRAW_PREFIX, '')
26
+
27
+ return rest === event.text ? '' : rest.trim()
28
+ }
29
+
30
+ // A `run:stalled` park reads as its cause and the action that resumes it (`run-stalled.ts`); any other
31
+ // park as its reason.
32
+ function park_row_reason(event: RunEvent): string {
33
+ const reason = park_reason(event)
34
+ const cause = run_stalled.cause_of(reason)
35
+ const issue = run_event_scope.issue_named(event)
36
+
37
+ return cause === undefined || issue === undefined ? reason : run_stalled.row_text(issue, cause)
38
+ }
39
+
40
+ // The reason an ending event gives, `undefined` for an event that is neither a park nor a withdraw or
41
+ // that gives none.
42
+ function reason_of(event: RunEvent): string | undefined {
43
+ if (event.kind === KIND.PARK) return park_row_reason(event) || undefined
44
+
45
+ return event.kind === KIND.WITHDRAW ? withdraw_reason(event) || undefined : undefined
46
+ }
47
+
48
+ interface EndingRecord {
49
+ reason?: string
50
+ elapsed_ms?: number
51
+ }
52
+
53
+ // What an ending event records for its row: the reason it gives and the lane time its writer recorded
54
+ // (joshuafolkken/kit#4481), each only where the event carries it.
55
+ function recorded_of(event: RunEvent): EndingRecord {
56
+ const reason = reason_of(event)
57
+ const { elapsed_ms } = event
58
+
59
+ return {
60
+ ...(reason !== undefined && { reason }),
61
+ ...(elapsed_ms !== undefined && { elapsed_ms }),
62
+ }
63
+ }
64
+
65
+ const run_board_ending_reason = { park_reason, reason_of, recorded_of }
66
+
67
+ export { run_board_ending_reason }
@@ -0,0 +1,103 @@
1
+ import { run_board_labels } from './run-board-labels'
2
+ import type { BoardRow } from './run-board-layout'
3
+
4
+ // Where each waiting child lands on the lanes (joshuafolkken/kit#4319): onto the lane that frees
5
+ // first, but never before what it waits on ends — a 🔗 blocker, the 📂 child holding its path, the
6
+ // running lanes a 🧍 `run:solo` child waits out, the 🙅 solo child ahead of it, the 📋 issue a named run
7
+ // starts it after — nor before a `run:solo` child ends: a running one, or a 🧍 one placed ahead, which
8
+ // itself starts once every lane placed before it has freed. A child waiting on an issue the board does
9
+ // not carry waits past this run, so it is left out.
10
+
11
+ const { WAIT_ICONS } = run_board_labels
12
+ const AFTER_ICONS: ReadonlySet<string> = new Set([
13
+ WAIT_ICONS.path,
14
+ WAIT_ICONS.solo,
15
+ WAIT_ICONS.solo_ahead,
16
+ WAIT_ICONS.named,
17
+ ])
18
+
19
+ interface Lanes {
20
+ // When each lane frees, from now.
21
+ free: Array<number>
22
+ // When each child on the board ends, from now.
23
+ ends: Map<number, number>
24
+ // No waiting child starts before this — the end of a `run:solo` child running or placed.
25
+ floor: number
26
+ per_child: number
27
+ }
28
+
29
+ interface Pending {
30
+ number: number
31
+ after: ReadonlyArray<number>
32
+ // A 🧍 `run:solo` child: it starts once every lane is free and lets none start beside it.
33
+ is_solo: boolean
34
+ }
35
+
36
+ // The issues a row's reason says it starts after, none for a wait no child's end lifts.
37
+ function named_of(reason: BoardRow['reason']): ReadonlyArray<string> {
38
+ if (reason?.icon === undefined || !AFTER_ICONS.has(reason.icon)) return []
39
+
40
+ return reason.issues ?? []
41
+ }
42
+
43
+ // The issues a waiting row starts after: its standing blockers, and those its reason names.
44
+ function pending_of(row: BoardRow): Pending {
45
+ const after = new Set([...row.waits, ...named_of(row.reason)])
46
+
47
+ const is_solo = row.reason?.icon === WAIT_ICONS.solo
48
+
49
+ return { number: row.number, after: [...after].map(Number), is_solo }
50
+ }
51
+
52
+ function is_ready(pending: Pending, lanes: Lanes): boolean {
53
+ return pending.after.every((issue) => lanes.ends.has(issue))
54
+ }
55
+
56
+ // The lane freeing latest by the time the child can start, so a child waiting on an end leaves the
57
+ // lane free sooner to a child ready before it; the lane free first where none has freed by then.
58
+ function lane_for(free: ReadonlyArray<number>, ready: number): number {
59
+ const fits = free.filter((at) => at <= ready)
60
+
61
+ return free.indexOf(fits.length > 0 ? Math.max(...fits) : Math.min(...free))
62
+ }
63
+
64
+ function place(pending: Pending, lanes: Lanes): void {
65
+ const waited = pending.after.map((issue) => lanes.ends.get(issue) ?? 0)
66
+ const busy = pending.is_solo ? lanes.free : []
67
+ const ready = Math.max(lanes.floor, ...waited, ...busy)
68
+ const lane = lane_for(lanes.free, ready)
69
+ const end = Math.max(lanes.free[lane] ?? 0, ready) + lanes.per_child
70
+
71
+ lanes.free[lane] = end
72
+ lanes.ends.set(pending.number, end)
73
+ if (pending.is_solo) lanes.floor = end
74
+ }
75
+
76
+ // One pass over the children not yet placed, placing each whose waits have ended; the rest are left.
77
+ function pass(pending: ReadonlyArray<Pending>, lanes: Lanes): Array<Pending> {
78
+ const ready = pending.filter((entry) => is_ready(entry, lanes))
79
+
80
+ for (const entry of ready) place(entry, lanes)
81
+
82
+ return pending.filter((entry) => !lanes.ends.has(entry.number))
83
+ }
84
+
85
+ // The time the last lane ends, the waiting rows placed pass after pass until a pass places none.
86
+ function end_of(waiting: ReadonlyArray<BoardRow>, lanes: Lanes): number {
87
+ let left = waiting.map((row) => pending_of(row))
88
+ let placed = Infinity
89
+
90
+ while (left.length > 0 && placed > 0) {
91
+ const next = pass(left, lanes)
92
+
93
+ placed = left.length - next.length
94
+ left = next
95
+ }
96
+
97
+ return Math.max(...lanes.free)
98
+ }
99
+
100
+ const run_board_estimate_schedule = { end_of }
101
+
102
+ export { run_board_estimate_schedule }
103
+ export type { Lanes }
@@ -0,0 +1,98 @@
1
+ import { run_board_estimate_schedule, type Lanes } from './run-board-estimate-schedule'
2
+ import { run_board_labels } from './run-board-labels'
3
+ import { run_board_layout, type BoardLayout, type BoardRow } from './run-board-layout'
4
+ import { run_board_phase, type Phase } from './run-board-phase'
5
+ import type { ItemStatus } from './run-board-status'
6
+ import type { UsualTimes } from './run-board-usual'
7
+
8
+ // How long the run has left, from how long each phase usually takes (`run-board-usual.ts`,
9
+ // joshuafolkken/kit#4044). A running child has left what remains of its phase and every phase it has
10
+ // not reached; a waiting child the plan's waves hold takes one child's usual time, stacked onto the
11
+ // lane that frees first once what it waits on has ended (`run-board-estimate-schedule.ts`). A parked
12
+ // child, and one the plan has not reached — a start date or a blocker ahead of it — wait on something
13
+ // no usual time measures, so they are left out. Without a usual time nothing is estimated.
14
+
15
+ const { HEADER_ICONS, WORDS, minute_span_of } = run_board_labels
16
+ const LEGEND = `${HEADER_ICONS.estimate} ${WORDS.estimate}`
17
+ const ESTIMATE_MARK = '~'
18
+ // A failed ship sends its child back to implement, so it has that phase and every later one left.
19
+ const FAILED_PHASE: Phase = 'failed'
20
+ const RESUMED_PHASE: Phase = 'implement'
21
+ // The phases a child passes in order, a failed ship aside.
22
+ const PATH: ReadonlyArray<Phase> = run_board_phase.PHASES.filter((phase) => phase !== FAILED_PHASE)
23
+ const MIN_LANES = 1
24
+
25
+ interface EstimateRead {
26
+ now_ms: number
27
+ ended_ms: number | undefined
28
+ layout: BoardLayout | undefined
29
+ usual?: UsualTimes | undefined
30
+ lane_limit?: number | undefined
31
+ }
32
+
33
+ function usual_sum(phases: ReadonlyArray<Phase>, usual: UsualTimes): number {
34
+ return phases.reduce((sum, phase) => sum + (usual.get(phase) ?? 0), 0)
35
+ }
36
+
37
+ // The phase a child stands at, as the path counts it.
38
+ function phase_of(status: ItemStatus | undefined): Phase {
39
+ const phase = status?.track?.at(-1) ?? run_board_phase.LAUNCHED_PHASE
40
+
41
+ return phase === FAILED_PHASE ? RESUMED_PHASE : phase
42
+ }
43
+
44
+ // What a running child has left: its phase's usual time less what it has spent there, then every
45
+ // phase after it.
46
+ function running_left(row: BoardRow, read: EstimateRead, usual: UsualTimes): number {
47
+ const phase = phase_of(row.status)
48
+ const spent = read.now_ms - (row.status?.phase_ms ?? read.now_ms)
49
+ const current = Math.max(0, (usual.get(phase) ?? 0) - spent)
50
+
51
+ return current + usual_sum(PATH.slice(PATH.indexOf(phase) + 1), usual)
52
+ }
53
+
54
+ // The queued rows a lane will take, a decision a person owes left out.
55
+ function waiting_rows(layout: BoardLayout): Array<BoardRow> {
56
+ const queued: BoardLayout = { ...run_board_layout.EMPTY_LAYOUT, queued: layout.queued }
57
+
58
+ return run_board_layout.rows_of(queued).filter((row) => row.state === 'waiting')
59
+ }
60
+
61
+ // The lanes as the running children leave them: each running child's end, the free lanes at zero, and
62
+ // a running `run:solo` child's end as the floor no waiting child starts before.
63
+ function lanes_of(running: ReadonlyArray<BoardRow>, read: EstimateRead, usual: UsualTimes): Lanes {
64
+ const ends = new Map(running.map((row) => [row.number, running_left(row, read, usual)]))
65
+ const count = Math.max(read.lane_limit ?? running.length, running.length, MIN_LANES)
66
+ const free = [...ends.values(), ...Array.from({ length: count - ends.size }, () => 0)]
67
+ const solo = running.filter((row) => row.is_solo === true).map((row) => ends.get(row.number) ?? 0)
68
+
69
+ return { free, ends, floor: Math.max(0, ...solo), per_child: usual_sum(PATH, usual) }
70
+ }
71
+
72
+ // How long the run has left, `undefined` where nothing is left to run or no usual time is known.
73
+ function left_ms(read: EstimateRead): number | undefined {
74
+ const { layout, usual } = read
75
+
76
+ if (layout === undefined || usual === undefined || usual.size === 0) return undefined
77
+
78
+ const running = layout.active.filter((row) => row.state === 'running')
79
+ const waiting = waiting_rows(layout)
80
+
81
+ if (running.length + waiting.length === 0) return undefined
82
+
83
+ return run_board_estimate_schedule.end_of(waiting, lanes_of(running, read, usual))
84
+ }
85
+
86
+ // `🎯 ~25′`, `undefined` for an ended run or one with nothing to estimate.
87
+ function part_of(read: EstimateRead): string | undefined {
88
+ const left = read.ended_ms === undefined ? left_ms(read) : undefined
89
+
90
+ return left === undefined
91
+ ? undefined
92
+ : `${HEADER_ICONS.estimate} ${ESTIMATE_MARK}${minute_span_of(left)}`
93
+ }
94
+
95
+ const run_board_estimate = { LEGEND, left_ms, part_of }
96
+
97
+ export { run_board_estimate }
98
+ export type { EstimateRead }