@joshuafolkken/kit 1.1514.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 (858) hide show
  1. package/.claude/agents/investigator.md +1 -1
  2. package/.claude/settings.json +5 -5
  3. package/.claude/skills/epic-commands/SKILL.md +26 -65
  4. package/.claude/skills/epic-commands/epic-bundle.md +3 -1
  5. package/.claude/skills/workflow-commands/SKILL.md +5 -5
  6. package/.claude/skills/workflow-commands/background-commands.md +5 -5
  7. package/.claude/skills/workflow-commands/backlogrun-child.md +10 -8
  8. package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +7 -25
  9. package/.claude/skills/workflow-commands/backlogrun-lanes.md +17 -13
  10. package/.claude/skills/workflow-commands/backlogrun-park.md +14 -23
  11. package/.claude/skills/workflow-commands/backlogrun-progress.md +2 -2
  12. package/.claude/skills/workflow-commands/backlogrun-recovery.md +5 -5
  13. package/.claude/skills/workflow-commands/backlogrun-steps.md +10 -10
  14. package/.claude/skills/workflow-commands/backlogrun.md +1 -1
  15. package/.claude/skills/workflow-commands/chain-rule.md +13 -7
  16. package/.claude/skills/workflow-commands/delegation.md +6 -5
  17. package/.claude/skills/workflow-commands/entry-sequence.md +9 -9
  18. package/.claude/skills/workflow-commands/followup.md +9 -31
  19. package/.claude/skills/workflow-commands/fullrun-steps.md +36 -45
  20. package/.claude/skills/workflow-commands/fullrun.md +2 -2
  21. package/.claude/skills/workflow-commands/halfrun.md +17 -25
  22. package/.claude/skills/workflow-commands/issue-comments.md +16 -12
  23. package/.claude/skills/workflow-commands/issue-scout.md +2 -2
  24. package/.claude/skills/workflow-commands/kickoff.md +24 -23
  25. package/.claude/skills/workflow-commands/latest-gate.md +7 -12
  26. package/.claude/skills/workflow-commands/needs-human-review.md +9 -14
  27. package/.claude/skills/workflow-commands/observation-filing.md +4 -36
  28. package/.claude/skills/workflow-commands/observation-ledger.md +1 -1
  29. package/.claude/skills/workflow-commands/pre-gate-cut.md +13 -30
  30. package/.claude/skills/workflow-commands/prerequisite.md +10 -16
  31. package/.claude/skills/workflow-commands/progress-watcher.md +1 -1
  32. package/.claude/skills/workflow-commands/prrun.md +3 -7
  33. package/.claude/skills/workflow-commands/retrospective.md +1 -1
  34. package/.claude/skills/workflow-commands/split-assessment.md +13 -1
  35. package/.claude/skills/workflow-commands/working-tree-hold.md +9 -9
  36. package/.codex/hooks.json +5 -5
  37. package/.github/actions/setup-node/action.yml +9 -0
  38. package/.github/actions/setup-pnpm/action.yml +1 -1
  39. package/.github/dependabot.yml +16 -0
  40. package/.github/release.yml +0 -2
  41. package/.github/workflows/ci.yml +120 -10
  42. package/.github/workflows/publish.yml +8 -1
  43. package/.github/workflows/sonar-qube.yml +1 -0
  44. package/.prettierignore +2 -0
  45. package/.vscode/tasks.json +1 -2
  46. package/CLAUDE.md +3 -7
  47. package/README.md +4 -2
  48. package/SECURITY.md +1 -1
  49. package/dist/CLAUDE.md +3 -7
  50. package/dist/commands/document-read-cli.js +882 -0
  51. package/dist/commands/{document-section-cli.js → document-section-main.js} +79 -37
  52. package/dist/commands/read-set-cli.js +1867 -0
  53. package/dist/commands/run-prep-main.js +21653 -0
  54. package/dist/commands/run-step-cli.js +23880 -0
  55. package/dist/config-merge/index.js +5 -1
  56. package/dist/hooks/audit-provision.js +20 -35
  57. package/dist/hooks/{chunk-DGT54IH5.js → chunk-AZX4FGQ3.js} +63 -17
  58. package/dist/hooks/chunk-CWMBGKYW.js +6483 -0
  59. package/dist/hooks/chunk-O2YBIDSI.js +4306 -0
  60. package/dist/hooks/{chunk-TNUMY6NL.js → chunk-PT5R6UJD.js} +4193 -1900
  61. package/dist/hooks/chunk-TUIFS5E7.js +72 -0
  62. package/dist/hooks/{chunk-723HKZO5.js → chunk-VWWCFGWK.js} +1 -1
  63. package/dist/hooks/{chunk-APUO6U4J.js → chunk-WR2KQAYZ.js} +1843 -440
  64. package/dist/hooks/{chunk-O6GDRNJB.js → chunk-XGBNSWEI.js} +248 -46
  65. package/dist/hooks/chunk-YCDOIR3I.js +3456 -0
  66. package/dist/hooks/codex-hook-adapter.js +10 -22
  67. package/dist/hooks/format-edited.js +5 -6
  68. package/dist/hooks/inputs.json +443 -317
  69. package/dist/hooks/pretool-guard.js +7 -25
  70. package/dist/hooks/session-lang.js +44 -51
  71. package/dist/hooks/stop-guard.js +7716 -2187
  72. package/dist/josh.js +6002 -3583
  73. package/dist/self-sync-guard/index.js +74 -10
  74. package/dist/version/index.js +115 -406
  75. package/eslint/base.js +1 -1
  76. package/lefthook/base.yml +3 -1
  77. package/package.json +10 -48
  78. package/pnpm-workspace.yaml +4 -2
  79. package/prompts/coding-standards.md +1 -1
  80. package/prompts/collaboration-workflow/file-edits.md +1 -7
  81. package/prompts/collaboration-workflow/issue-citation.md +1 -1
  82. package/prompts/collaboration-workflow/issue-template.md +33 -16
  83. package/prompts/collaboration-workflow/lane-instructions.md +1 -2
  84. package/prompts/collaboration-workflow/measurement.md +37 -0
  85. package/prompts/collaboration-workflow/operating-rules.md +4 -6
  86. package/prompts/collaboration-workflow/output-bounds.md +2 -7
  87. package/prompts/collaboration-workflow/plan-comment.md +3 -42
  88. package/prompts/collaboration-workflow/principles.md +5 -0
  89. package/prompts/collaboration-workflow/report-format.md +31 -60
  90. package/prompts/collaboration-workflow/residency.md +2 -2
  91. package/prompts/collaboration-workflow/shell-body.md +6 -16
  92. package/prompts/collaboration-workflow/turn-batching.md +0 -2
  93. package/prompts/collaboration-workflow/upstream-interrupt.md +14 -4
  94. package/prompts/collaboration-workflow/wip-cap.md +1 -1
  95. package/prompts/collaboration-workflow.md +3 -7
  96. package/prompts/refactoring.md +1 -1
  97. package/prompts/review-rubric.md +1 -2
  98. package/prompts/review.md +41 -21
  99. package/prompts/testing-guide.md +8 -43
  100. package/scripts/agent/agent-event.ts +15 -15
  101. package/scripts/agent/agent-exit-record.ts +13 -1
  102. package/scripts/agent/api-auth.ts +41 -0
  103. package/scripts/agent/api-outage.ts +1 -1
  104. package/scripts/auto-ok/auto-ok-cli.ts +14 -16
  105. package/scripts/auto-ok/auto-ok-judge-read.ts +12 -3
  106. package/scripts/auto-ok/auto-ok-judge-write.ts +46 -19
  107. package/scripts/auto-ok/auto-ok-judge.ts +13 -2
  108. package/scripts/auto-ok/auto-ok-main.ts +17 -0
  109. package/scripts/backlog/backlog-arrival.ts +14 -3
  110. package/scripts/backlog/backlog-budget-cli.ts +7 -33
  111. package/scripts/backlog/backlog-budget-main.ts +16 -0
  112. package/scripts/backlog/backlog-budget.ts +2 -3
  113. package/scripts/backlog/backlog-defect-priority.ts +4 -3
  114. package/scripts/backlog/backlog-drive-adopt.ts +67 -0
  115. package/scripts/backlog/backlog-drive-args.ts +4 -5
  116. package/scripts/backlog/backlog-drive-cli.ts +113 -28
  117. package/scripts/backlog/backlog-drive-hold.ts +162 -0
  118. package/scripts/backlog/backlog-drive-idle.ts +151 -0
  119. package/scripts/backlog/backlog-drive-judge.ts +25 -0
  120. package/scripts/backlog/backlog-drive-memory.ts +126 -0
  121. package/scripts/backlog/backlog-drive-named-offer.ts +5 -10
  122. package/scripts/backlog/backlog-drive-named.ts +53 -6
  123. package/scripts/backlog/backlog-drive-offer-argv.ts +3 -8
  124. package/scripts/backlog/backlog-drive-paused.ts +169 -0
  125. package/scripts/backlog/backlog-drive-restore.ts +30 -7
  126. package/scripts/backlog/backlog-drive-seats.ts +18 -8
  127. package/scripts/backlog/backlog-drive-token-handling.ts +38 -0
  128. package/scripts/backlog/backlog-drive.ts +79 -75
  129. package/scripts/backlog/backlog-next-main.ts +16 -0
  130. package/scripts/backlog/backlog-next-shared.ts +73 -0
  131. package/scripts/backlog/backlog-next.ts +48 -16
  132. package/scripts/backlog/backlog-occupied.ts +52 -39
  133. package/scripts/backlog/backlog-offer-cli.ts +6 -21
  134. package/scripts/backlog/backlog-offer-exclude.ts +15 -0
  135. package/scripts/backlog/backlog-offer-main.ts +12 -0
  136. package/scripts/backlog/backlog-offer.ts +36 -3
  137. package/scripts/backlog/backlog-overlap.ts +22 -4
  138. package/scripts/backlog/backlog-plan-read.ts +6 -2
  139. package/scripts/backlog/backlog-plan.ts +18 -4
  140. package/scripts/backlog/backlog-pool.ts +10 -10
  141. package/scripts/backlog/backlog-rank.ts +10 -2
  142. package/scripts/backlog/backlog-ready.ts +112 -30
  143. package/scripts/backlog/backlog-stalled-detect.ts +109 -36
  144. package/scripts/backlog/backlog-stalled.ts +52 -16
  145. package/scripts/backlog/backlog-wait-cause.ts +86 -0
  146. package/scripts/backlog/backlog-waves.ts +39 -13
  147. package/scripts/backlog/backlogrun-args.ts +19 -7
  148. package/scripts/backlog/backlogrun-cli.ts +19 -5
  149. package/scripts/backlog/backlogrun-launch.ts +6 -0
  150. package/scripts/backlog/backlogrun-restart.ts +97 -0
  151. package/scripts/backlog/backlogrun-stop.ts +79 -7
  152. package/scripts/behavior/behavior-cli.ts +2 -2
  153. package/scripts/behavior/behavior-rules.ts +47 -24
  154. package/scripts/build/build-bin.ts +2 -16
  155. package/scripts/build/build-claude-md.ts +0 -7
  156. package/scripts/build/build-commands.ts +0 -13
  157. package/scripts/build/build-hooks.ts +49 -48
  158. package/scripts/build/hook-bundle-stamp.ts +29 -11
  159. package/scripts/build/local-bin.ts +1 -1
  160. package/scripts/cases/cases-cli.ts +25 -13
  161. package/scripts/cases/cases-interaction-scan.ts +134 -0
  162. package/scripts/cases/cases-interaction.ts +183 -0
  163. package/scripts/cases/cases-logic.ts +39 -6
  164. package/scripts/ci/pr-classification-main.ts +18 -0
  165. package/scripts/ci/pr-classification.ts +10 -17
  166. package/scripts/clone/clone-scan.ts +1 -1
  167. package/scripts/cost-runtime/cost-blocks.ts +22 -37
  168. package/scripts/cost-runtime/cost-cli.ts +31 -14
  169. package/scripts/cost-runtime/cost-main.ts +12 -0
  170. package/scripts/cost-runtime/cost-transcript.ts +1 -0
  171. package/scripts/delegation/delegation-policy.ts +17 -4
  172. package/scripts/delegation/duplicate-read-guard.ts +0 -8
  173. package/scripts/delegation/investigation-guard.ts +0 -8
  174. package/scripts/delegation/investigation-reads.ts +3 -4
  175. package/scripts/dependabot/dependabot-cooldown.ts +194 -0
  176. package/scripts/discovery/repo-discovery.ts +24 -6
  177. package/scripts/doctor/doctor-consumer.ts +2 -5
  178. package/scripts/document/document-byte-budget.ts +8 -6
  179. package/scripts/document/document-scan.ts +1 -1
  180. package/scripts/document/document-section-cli.ts +0 -8
  181. package/scripts/document/document-section-main.ts +12 -0
  182. package/scripts/epic/epic-audit-cli.ts +12 -6
  183. package/scripts/epic/epic-bundle-apply.ts +137 -0
  184. package/scripts/epic/epic-bundle-cli.ts +32 -121
  185. package/scripts/epic/epic-bundle-format.ts +116 -0
  186. package/scripts/epic/epic-bundle-main.ts +17 -0
  187. package/scripts/epic/epic-busy.ts +5 -12
  188. package/scripts/epic/epic-classify.ts +24 -15
  189. package/scripts/epic/epic-cli-argv.ts +31 -0
  190. package/scripts/epic/epic-cli-decide.ts +42 -0
  191. package/scripts/epic/epic-cli.ts +6 -38
  192. package/scripts/epic/epic-close.ts +112 -55
  193. package/scripts/epic/epic-cross-repo.ts +4 -7
  194. package/scripts/epic/epic-decide.ts +119 -0
  195. package/scripts/epic/epic-decision.ts +9 -0
  196. package/scripts/epic/epic-fetch.ts +4 -0
  197. package/scripts/epic/epic-graph.ts +2 -0
  198. package/scripts/epic/epic-issue.ts +5 -1
  199. package/scripts/epic/epic-label-age.ts +1 -1
  200. package/scripts/epic/epic-lane-offer.ts +39 -4
  201. package/scripts/epic/epic-next-main.ts +24 -0
  202. package/scripts/epic/epic-next.ts +6 -24
  203. package/scripts/epic/epic-outside-blocker.ts +6 -2
  204. package/scripts/epic/epic-parse.ts +9 -3
  205. package/scripts/epic/epic-read.ts +1 -0
  206. package/scripts/epic/epic-reconcile.ts +39 -0
  207. package/scripts/epic/epic-run.ts +10 -1
  208. package/scripts/epic/epic-solo.ts +50 -14
  209. package/scripts/epic/epic.ts +41 -7
  210. package/scripts/exports/unused-members-cli.ts +2 -2
  211. package/scripts/followup/followup-checks-event.ts +8 -3
  212. package/scripts/followup/followup-coderabbit-wait.ts +82 -0
  213. package/scripts/followup/followup-review-gates.ts +81 -0
  214. package/scripts/followup/git-followup-stages.ts +13 -3
  215. package/scripts/followup/git-followup-workflow.ts +19 -66
  216. package/scripts/followup/git-pr-followup-wrapup.ts +9 -14
  217. package/scripts/followup/git-pr-followup.ts +36 -8
  218. package/scripts/fresh-machine/fresh-machine-cli.ts +1 -1
  219. package/scripts/fresh-machine/fresh-machine-run.ts +8 -8
  220. package/scripts/fresh-machine/specs/kit-test-backlogrun.json +1 -1
  221. package/scripts/gate/busy-average.ts +58 -0
  222. package/scripts/gate/check-cpu.ts +60 -0
  223. package/scripts/gate/check-inputs.ts +39 -95
  224. package/scripts/gate/check-reuse.ts +33 -54
  225. package/scripts/gate/command-memory.ts +192 -0
  226. package/scripts/gate/core-admission.ts +218 -28
  227. package/scripts/gate/core-budget-timing.ts +37 -0
  228. package/scripts/gate/core-budget.ts +80 -98
  229. package/scripts/gate/core-wait-record.ts +48 -0
  230. package/scripts/gate/core-wait.ts +37 -5
  231. package/scripts/gate/core-weights.ts +86 -0
  232. package/scripts/gate/free-cores.ts +27 -4
  233. package/scripts/gate/gate-ledger.ts +32 -4
  234. package/scripts/gate/gate-plan.ts +41 -34
  235. package/scripts/gate/gate-report.ts +14 -2
  236. package/scripts/gate/gate-run-steps.ts +53 -8
  237. package/scripts/gate/gate-skip.ts +12 -2
  238. package/scripts/gate/gate-steps.ts +12 -1
  239. package/scripts/gate/input-fingerprint.ts +42 -0
  240. package/scripts/gate/machine-capacity.ts +65 -31
  241. package/scripts/gate/moved-paths.ts +67 -0
  242. package/scripts/gate/project-checks.ts +5 -12
  243. package/scripts/gate/scoped-green.ts +12 -8
  244. package/scripts/gate/since-green.ts +62 -0
  245. package/scripts/gate/toolchain-inputs.ts +115 -0
  246. package/scripts/gate/verification-gate.ts +27 -24
  247. package/scripts/gate/verification-inputs.ts +250 -0
  248. package/scripts/gh/gh-author-association.ts +96 -9
  249. package/scripts/gh/git-ai-review-scan.ts +4 -2
  250. package/scripts/gh/git-gh-api-path.ts +15 -0
  251. package/scripts/gh/git-gh-branch-rules.ts +73 -0
  252. package/scripts/gh/git-gh-conditional.ts +5 -2
  253. package/scripts/gh/git-gh-issue-read.ts +5 -1
  254. package/scripts/gh/git-gh-issue-write.ts +67 -29
  255. package/scripts/gh/git-gh-issue.ts +7 -3
  256. package/scripts/gh/git-gh-poll-read.ts +89 -0
  257. package/scripts/gh/git-gh-pr-auto-merge.ts +8 -3
  258. package/scripts/gh/git-gh-pr-rest.ts +1 -1
  259. package/scripts/gh/git-gh-pr-snapshot.ts +33 -20
  260. package/scripts/gh/git-gh-pr.ts +27 -15
  261. package/scripts/gh/git-pr-checks-eval.ts +39 -7
  262. package/scripts/gh/git-pr-checks-parse.ts +39 -9
  263. package/scripts/gh/git-pr-merge-checked.ts +80 -0
  264. package/scripts/git/base-tree.ts +19 -2
  265. package/scripts/git/changed-file-scope.ts +6 -4
  266. package/scripts/git/changed-paths.ts +18 -1
  267. package/scripts/git/git-diff-reads.ts +27 -2
  268. package/scripts/git/git-grep-hits.ts +85 -0
  269. package/scripts/git/git-location-environment.ts +1 -1
  270. package/scripts/git/git-merge-conflicts.ts +83 -0
  271. package/scripts/git/git-preflight.ts +37 -12
  272. package/scripts/git/git-push-transport.ts +1 -2
  273. package/scripts/git/git-schemas.ts +17 -7
  274. package/scripts/git/git-spawn.ts +1 -2
  275. package/scripts/git/git-status.ts +4 -4
  276. package/scripts/git/main-merge-main.ts +12 -0
  277. package/scripts/git/main-merge-regenerate.ts +2 -2
  278. package/scripts/git/main-merge.ts +25 -9
  279. package/scripts/git/main-sync-main.ts +12 -0
  280. package/scripts/git/main-sync.ts +0 -9
  281. package/scripts/git/stash/git-stash.ts +27 -4
  282. package/scripts/git/stash/{stash-pop-args.ts → stash-args.ts} +13 -10
  283. package/scripts/git/stash/stash-pop-cli.ts +6 -12
  284. package/scripts/git/stash/stash-pop-main.ts +12 -0
  285. package/scripts/git/stash/stash-push-cli.ts +76 -0
  286. package/scripts/git/stash/stash-push-main.ts +12 -0
  287. package/scripts/hooks/batch-guard.ts +0 -8
  288. package/scripts/hooks/check-commit-message-main.ts +8 -0
  289. package/scripts/hooks/check-commit-message.ts +4 -7
  290. package/scripts/hooks/format-edited-file.ts +8 -24
  291. package/scripts/hooks/pre-commit-lint.ts +30 -3
  292. package/scripts/hooks/pre-push-unit.ts +4 -2
  293. package/scripts/hooks/pretool-guard-cli.ts +1 -8
  294. package/scripts/hooks/pretool-guard.ts +32 -19
  295. package/scripts/hooks/reserved-run.ts +67 -9
  296. package/scripts/hooks/run-hook.sh +13 -4
  297. package/scripts/hooks/shell-rules-notice.ts +37 -0
  298. package/scripts/hooks/stop-actions.ts +2 -21
  299. package/scripts/hooks/stop-guard.ts +13 -9
  300. package/scripts/init/hook-command-rewrite.ts +19 -5
  301. package/scripts/init/hook-launch.ts +15 -17
  302. package/scripts/init/init-actions.ts +0 -6
  303. package/scripts/init/init-ai-copy.ts +10 -36
  304. package/scripts/init/init-bootstrap.ts +9 -8
  305. package/scripts/init/init-dry-run-report.ts +1 -1
  306. package/scripts/init/init-dry-run.ts +1 -1
  307. package/scripts/init/init-file-action.ts +7 -9
  308. package/scripts/init/init-logic-json-merge.ts +2 -2
  309. package/scripts/init/init-logic-migrate.ts +9 -82
  310. package/scripts/init/init-logic.ts +3 -2
  311. package/scripts/init/init-main.ts +12 -0
  312. package/scripts/init/init.ts +5 -12
  313. package/scripts/init/kit-development-versions.ts +3 -7
  314. package/scripts/init/kit-written-paths.ts +2 -2
  315. package/scripts/init/project-profile.ts +5 -4
  316. package/scripts/init/tsconfig-preset-migration.ts +2 -1
  317. package/scripts/init/vscode-tasks.ts +1 -1
  318. package/scripts/issue/defect-origin-cli.ts +106 -0
  319. package/scripts/issue/defect-origin-line.ts +60 -0
  320. package/scripts/issue/defect-origin-main.ts +11 -0
  321. package/scripts/issue/defect-origin.ts +114 -0
  322. package/scripts/issue/defect-rate-cli.ts +34 -78
  323. package/scripts/issue/defect-rate.ts +0 -16
  324. package/scripts/issue/defect-report-cli.ts +128 -0
  325. package/scripts/issue/defect-report-format.ts +56 -0
  326. package/scripts/issue/defect-report-main.ts +11 -0
  327. package/scripts/issue/defect-report.ts +160 -0
  328. package/scripts/issue/expected-effect-lint.ts +1 -0
  329. package/scripts/issue/issue-already-done-cli.ts +62 -0
  330. package/scripts/issue/issue-body-or-comment.ts +40 -0
  331. package/scripts/issue/issue-cite-cli.ts +0 -9
  332. package/scripts/issue/issue-cite-main.ts +12 -0
  333. package/scripts/issue/issue-classification.ts +12 -7
  334. package/scripts/issue/issue-comment-cli.ts +10 -24
  335. package/scripts/issue/issue-comment-main.ts +12 -0
  336. package/scripts/issue/issue-evidence-exit.ts +100 -0
  337. package/scripts/issue/issue-file-cli.ts +29 -7
  338. package/scripts/issue/issue-file.ts +19 -19
  339. package/scripts/issue/issue-fold-cli.ts +2 -11
  340. package/scripts/issue/issue-fold-main.ts +12 -0
  341. package/scripts/issue/issue-labels.ts +81 -90
  342. package/scripts/issue/issue-lint-cli.ts +2 -10
  343. package/scripts/issue/issue-lint-main.ts +12 -0
  344. package/scripts/issue/issue-measured-cli.ts +56 -0
  345. package/scripts/issue/issue-merged.ts +19 -2
  346. package/scripts/issue/issue-not-before-label.ts +135 -0
  347. package/scripts/issue/issue-not-before.ts +111 -0
  348. package/scripts/issue/issue-number-shape.ts +15 -1
  349. package/scripts/issue/issue-park.ts +28 -0
  350. package/scripts/issue/issue-plan-cli.ts +151 -0
  351. package/scripts/issue/issue-priority.ts +151 -0
  352. package/scripts/issue/issue-rank.ts +7 -1
  353. package/scripts/issue/issue-read-cli.ts +3 -10
  354. package/scripts/issue/issue-read-main.ts +12 -0
  355. package/scripts/issue/issue-read.ts +29 -5
  356. package/scripts/issue/issue-release-cli.ts +0 -10
  357. package/scripts/issue/issue-release-main.ts +13 -0
  358. package/scripts/issue/issue-release.ts +7 -12
  359. package/scripts/issue/issue-sample-gate.ts +192 -0
  360. package/scripts/issue/issue-sample-source.ts +76 -0
  361. package/scripts/issue/issue-scout-cli.ts +0 -11
  362. package/scripts/issue/issue-scout-main.ts +14 -0
  363. package/scripts/issue/issue-state-cli.ts +0 -10
  364. package/scripts/issue/issue-state-main.ts +12 -0
  365. package/scripts/issue/issue-watch-diff.ts +56 -15
  366. package/scripts/issue/issue-watch.ts +2 -1
  367. package/scripts/issue/issue-wip.ts +2 -7
  368. package/scripts/issue/measure-rerun-cli.ts +13 -8
  369. package/scripts/issue/plan-consumers-cli.ts +39 -0
  370. package/scripts/issue/plan-consumers-main.ts +11 -0
  371. package/scripts/issue/plan-consumers-section.ts +55 -0
  372. package/scripts/issue/plan-consumers.ts +127 -0
  373. package/scripts/josh/agent-session-environment.ts +1 -1
  374. package/scripts/josh/command-usage.ts +15 -43
  375. package/scripts/josh/file-map-stamp.ts +49 -16
  376. package/scripts/josh/hook-decision.ts +32 -20
  377. package/scripts/josh/josh-command-map.ts +4 -1
  378. package/scripts/josh/josh-command-types.ts +12 -6
  379. package/scripts/josh/josh-commands-agent-hooks.ts +83 -0
  380. package/scripts/josh/josh-commands-ai.ts +157 -158
  381. package/scripts/josh/josh-commands-backlog.ts +82 -16
  382. package/scripts/josh/josh-commands-clone.ts +1 -0
  383. package/scripts/josh/josh-commands-development.ts +111 -71
  384. package/scripts/josh/josh-commands-document.ts +43 -1
  385. package/scripts/josh/josh-commands-epic.ts +171 -0
  386. package/scripts/josh/josh-commands-hooks.ts +25 -2
  387. package/scripts/josh/josh-commands-issue-write.ts +181 -0
  388. package/scripts/josh/josh-commands-issue.ts +124 -24
  389. package/scripts/josh/josh-commands-lane.ts +103 -2
  390. package/scripts/josh/josh-commands-lint.ts +19 -8
  391. package/scripts/josh/josh-commands-maintenance.ts +112 -4
  392. package/scripts/josh/josh-commands-pause.ts +29 -0
  393. package/scripts/josh/josh-commands-progress.ts +87 -0
  394. package/scripts/josh/josh-commands-project.ts +138 -9
  395. package/scripts/josh/josh-commands-review.ts +124 -0
  396. package/scripts/josh/josh-commands-run.ts +211 -23
  397. package/scripts/josh/josh-commands-ship.ts +169 -0
  398. package/scripts/josh/josh-commands-split.ts +9 -0
  399. package/scripts/josh/josh-commands-versioning.ts +49 -2
  400. package/scripts/josh/josh-commands-workflow.ts +144 -6
  401. package/scripts/josh/josh-logic.ts +6 -13
  402. package/scripts/josh/package-directory.ts +2 -4
  403. package/scripts/josh/process-identity.ts +13 -4
  404. package/scripts/josh/session-language-cli.ts +4 -8
  405. package/scripts/josh/session-language-main.ts +13 -0
  406. package/scripts/josh/session-language.ts +6 -1
  407. package/scripts/josh/shared-cache.ts +90 -0
  408. package/scripts/josh/stamp-file.ts +9 -15
  409. package/scripts/lane/lane-await.ts +51 -12
  410. package/scripts/lane/lane-cache.ts +5 -30
  411. package/scripts/lane/lane-capacity.ts +14 -23
  412. package/scripts/lane/lane-check-stats.ts +62 -21
  413. package/scripts/lane/lane-child-invocation.ts +8 -0
  414. package/scripts/lane/lane-cli.ts +15 -5
  415. package/scripts/lane/lane-close.ts +86 -18
  416. package/scripts/lane/lane-core-wait-stats.ts +66 -0
  417. package/scripts/lane/lane-dispatch.ts +24 -3
  418. package/scripts/lane/lane-gap-stats.ts +156 -0
  419. package/scripts/lane/lane-handoff.ts +69 -1
  420. package/scripts/lane/lane-held-stats.ts +129 -0
  421. package/scripts/lane/lane-install.ts +4 -11
  422. package/scripts/lane/lane-launch-cli.ts +0 -9
  423. package/scripts/lane/lane-launch-main.ts +12 -0
  424. package/scripts/lane/lane-ledger-schema.ts +266 -0
  425. package/scripts/lane/lane-ledger.ts +92 -123
  426. package/scripts/lane/lane-limit-cli.ts +12 -1
  427. package/scripts/lane/lane-measure-cli.ts +57 -11
  428. package/scripts/lane/lane-open.ts +9 -1
  429. package/scripts/lane/lane-parked.ts +3 -3
  430. package/scripts/lane/lane-pause-cli.ts +130 -0
  431. package/scripts/lane/lane-pause.ts +158 -0
  432. package/scripts/lane/lane-process-table.ts +166 -0
  433. package/scripts/lane/lane-reap-settle.ts +124 -0
  434. package/scripts/lane/lane-reap.ts +50 -15
  435. package/scripts/lane/lane-registry.ts +24 -3
  436. package/scripts/lane/lane-residents.ts +162 -0
  437. package/scripts/lane/lane-restart.ts +22 -2
  438. package/scripts/lane/lane-round-two-stats.ts +49 -0
  439. package/scripts/lane/lane-sampler.ts +4 -0
  440. package/scripts/lane/lane-session-action.ts +19 -5
  441. package/scripts/lane/lane-session-broker.ts +102 -21
  442. package/scripts/lane/lane-snapshot-trace.ts +84 -0
  443. package/scripts/lane/lane-spans.ts +51 -0
  444. package/scripts/lane/lane-spent.ts +6 -3
  445. package/scripts/lane/lane-stage-stats.ts +7 -2
  446. package/scripts/lane/lane-state.ts +302 -0
  447. package/scripts/lane/lane-stats.ts +58 -4
  448. package/scripts/lane/lane-stop-stats.ts +113 -37
  449. package/scripts/lane/lane-test-related-stats.ts +127 -0
  450. package/scripts/lane/lane-transcript-calls.ts +145 -0
  451. package/scripts/lane/lane-transcript-stats.ts +168 -0
  452. package/scripts/lane/lane-vacant.ts +13 -3
  453. package/scripts/lane/lane-withdraw-cli.ts +5 -4
  454. package/scripts/lane/lane-withdraw.ts +50 -49
  455. package/scripts/lane/process-directories.ts +70 -0
  456. package/scripts/lane/process-lane-marks.ts +94 -0
  457. package/scripts/lib/atomic-write.ts +62 -0
  458. package/scripts/lib/buffered-process.ts +12 -5
  459. package/scripts/lib/cli-flags.ts +53 -0
  460. package/scripts/lib/figure-format.ts +63 -0
  461. package/scripts/lib/json-value.ts +9 -1
  462. package/scripts/lib/package-manifest.ts +35 -0
  463. package/scripts/lib/read-file.ts +3 -1
  464. package/scripts/lib/stamped-memo.ts +63 -0
  465. package/scripts/lib/stdout-on-stderr.ts +24 -0
  466. package/scripts/lib/timeouts.ts +9 -0
  467. package/scripts/lib/transcript-record.ts +91 -0
  468. package/scripts/lines/effective-limit.ts +1 -1
  469. package/scripts/lint/eslint-cache-dependencies.ts +145 -0
  470. package/scripts/lint/eslint-daemon.ts +265 -0
  471. package/scripts/lint/format.ts +11 -2
  472. package/scripts/lint/import-graph.ts +279 -0
  473. package/scripts/lint/lint-gate-scope.ts +102 -0
  474. package/scripts/lint/lint-parallel-main.ts +19 -0
  475. package/scripts/lint/lint-parallel.ts +62 -30
  476. package/scripts/lint/lint-related-scope.ts +30 -24
  477. package/scripts/lint/lint-related.ts +38 -6
  478. package/scripts/notify/confirmation-options.ts +1 -2
  479. package/scripts/notify/telegram-notify.ts +20 -20
  480. package/scripts/notify/telegram-test-logic.ts +0 -1
  481. package/scripts/notify/telegram-test-main.ts +8 -0
  482. package/scripts/notify/telegram-test.ts +2 -6
  483. package/scripts/observations/observation-ledger.ts +13 -0
  484. package/scripts/observations/observations-flush-landing.ts +5 -3
  485. package/scripts/observations/observations-flush.ts +6 -1
  486. package/scripts/overrides/overrides-check.ts +2 -5
  487. package/scripts/overrides/overrides-files.ts +2 -1
  488. package/scripts/overrides/overrides-logic.ts +3 -6
  489. package/scripts/package/verify-optional-eslint-install.ts +8 -6
  490. package/scripts/propagate/propagate-publish.ts +2 -7
  491. package/scripts/propagate/propagate-targets.ts +4 -12
  492. package/scripts/refactor/import-graph.ts +9 -7
  493. package/scripts/release/github-release-runs.ts +17 -6
  494. package/scripts/release/release-approval-prune.ts +18 -0
  495. package/scripts/release/release-history.ts +1 -3
  496. package/scripts/release/release-progress.ts +42 -22
  497. package/scripts/release/release-publish-run.ts +39 -0
  498. package/scripts/release/release-publish.ts +6 -6
  499. package/scripts/release/release-scope-cli.ts +0 -10
  500. package/scripts/release/release-scope-main.ts +12 -0
  501. package/scripts/repo/repo-setting.ts +3 -6
  502. package/scripts/repo/required-checks-logic.ts +6 -15
  503. package/scripts/report/report-format-reference.ts +2 -0
  504. package/scripts/report/report-labels.ts +155 -0
  505. package/scripts/report/report-lint-cli.ts +3 -0
  506. package/scripts/report/report-lint.ts +85 -110
  507. package/scripts/report/report-template-cli.ts +59 -0
  508. package/scripts/report/report-template.ts +112 -0
  509. package/scripts/review/acceptance-map.ts +1 -0
  510. package/scripts/review/removed-tests-check.ts +86 -0
  511. package/scripts/review/removed-tests.ts +149 -0
  512. package/scripts/review/review-brief-cli.ts +81 -15
  513. package/scripts/review/review-brief-main.ts +12 -0
  514. package/scripts/review/review-brief.ts +31 -3
  515. package/scripts/review/review-code-tree.ts +10 -6
  516. package/scripts/review/review-comment-round.ts +26 -8
  517. package/scripts/review/review-finding-ledger.ts +30 -15
  518. package/scripts/review/review-interaction.ts +94 -0
  519. package/scripts/review/review-readers-scan.ts +163 -0
  520. package/scripts/review/review-record-cli.ts +69 -30
  521. package/scripts/review/review-record-main.ts +12 -0
  522. package/scripts/review/review-round-one-blobs.ts +221 -0
  523. package/scripts/review/review-round2-cli.ts +49 -12
  524. package/scripts/review/review-round2.ts +80 -12
  525. package/scripts/review/review-stamps.ts +19 -1
  526. package/scripts/review/review-stop-log.ts +96 -0
  527. package/scripts/review/review-stops-cli.ts +85 -0
  528. package/scripts/review/review-tree.ts +6 -17
  529. package/scripts/review/review-untouched-readers.ts +146 -0
  530. package/scripts/review/test-titles.ts +118 -0
  531. package/scripts/rules/agent-model.ts +8 -0
  532. package/scripts/rules/bash-triggers.ts +46 -3
  533. package/scripts/rules/decision-oracle-batch.ts +9 -1
  534. package/scripts/rules/decision-oracle.ts +2 -2
  535. package/scripts/rules/delivered-rules.ts +80 -2
  536. package/scripts/rules/destructive-command.ts +8 -1
  537. package/scripts/rules/direct-filing.ts +10 -2
  538. package/scripts/rules/direct-issue-comment.ts +117 -0
  539. package/scripts/rules/direct-pr-create.ts +69 -3
  540. package/scripts/rules/early-heartbeat.ts +2 -1
  541. package/scripts/rules/file-body.ts +7 -0
  542. package/scripts/rules/filing-cap.ts +7 -0
  543. package/scripts/rules/git-argv.ts +72 -14
  544. package/scripts/rules/git-force.ts +12 -2
  545. package/scripts/rules/guard-remedy.ts +4 -0
  546. package/scripts/rules/implementation-cut-verdict.ts +1 -1
  547. package/scripts/rules/implementation-cut.ts +11 -3
  548. package/scripts/rules/index-guard.ts +8 -1
  549. package/scripts/rules/issue-comments.ts +9 -1
  550. package/scripts/rules/josh-git-bare.ts +7 -0
  551. package/scripts/rules/lane-background.ts +67 -25
  552. package/scripts/rules/lane-carry-conflict.ts +6 -0
  553. package/scripts/rules/lane-direct-tool.ts +74 -0
  554. package/scripts/rules/lane-interactive-ask.ts +9 -2
  555. package/scripts/rules/lane-park.ts +45 -23
  556. package/scripts/rules/lane-split-park.ts +10 -2
  557. package/scripts/rules/lane-switch-main.ts +7 -0
  558. package/scripts/rules/oracle-consulted.ts +10 -0
  559. package/scripts/rules/oracle-firing.ts +1 -0
  560. package/scripts/rules/permission-guards.ts +3 -0
  561. package/scripts/rules/piped-verification.ts +1 -1
  562. package/scripts/rules/poll-loop.ts +7 -0
  563. package/scripts/rules/pr-merge.ts +123 -0
  564. package/scripts/rules/protected-files.ts +32 -5
  565. package/scripts/rules/raw-field-body.ts +6 -0
  566. package/scripts/rules/rule-body-guard.ts +8 -0
  567. package/scripts/rules/rule-list.ts +9 -28
  568. package/scripts/rules/rule-value-cache.ts +4 -9
  569. package/scripts/rules/rule-value-cli.ts +51 -32
  570. package/scripts/rules/rule-value.ts +1 -1
  571. package/scripts/rules/shell-segments.ts +35 -0
  572. package/scripts/rules/stop-rule-rows.ts +64 -0
  573. package/scripts/rules/stop-rules.ts +3 -4
  574. package/scripts/rules/test-declared-commit.ts +11 -1
  575. package/scripts/rules/third-party-write.ts +7 -0
  576. package/scripts/rules/timed-rerun.ts +69 -0
  577. package/scripts/rules/worktree-guard.ts +13 -3
  578. package/scripts/run/board/run-board-app-name.ts +23 -0
  579. package/scripts/run/board/run-board-cli.ts +65 -32
  580. package/scripts/run/board/run-board-earlier.ts +94 -0
  581. package/scripts/run/board/run-board-ending-reason.ts +67 -0
  582. package/scripts/run/board/run-board-estimate-schedule.ts +103 -0
  583. package/scripts/run/board/run-board-estimate.ts +98 -0
  584. package/scripts/run/board/run-board-fit.ts +153 -36
  585. package/scripts/run/board/run-board-fold.ts +123 -0
  586. package/scripts/run/board/run-board-fresh.ts +2 -2
  587. package/scripts/run/board/run-board-gather-live.ts +29 -0
  588. package/scripts/run/board/run-board-gather-thread.ts +189 -0
  589. package/scripts/run/board/run-board-gather-worker.ts +29 -0
  590. package/scripts/run/board/run-board-gather.ts +187 -0
  591. package/scripts/run/board/run-board-github.ts +118 -38
  592. package/scripts/run/board/run-board-header.ts +82 -20
  593. package/scripts/run/board/run-board-keys.ts +58 -0
  594. package/scripts/run/board/run-board-kind.ts +20 -6
  595. package/scripts/run/board/run-board-labels.ts +116 -71
  596. package/scripts/run/board/run-board-lane-state.ts +109 -0
  597. package/scripts/run/board/run-board-lane-time.ts +122 -0
  598. package/scripts/run/board/run-board-layout.ts +239 -60
  599. package/scripts/run/board/run-board-length.ts +52 -0
  600. package/scripts/run/board/run-board-machine.ts +8 -4
  601. package/scripts/run/board/run-board-main.ts +12 -0
  602. package/scripts/run/board/run-board-notes.ts +52 -31
  603. package/scripts/run/board/run-board-now.ts +1 -1
  604. package/scripts/run/board/run-board-operation.ts +15 -33
  605. package/scripts/run/board/run-board-phase.ts +1 -1
  606. package/scripts/run/board/run-board-plan-shared.ts +115 -0
  607. package/scripts/run/board/run-board-plan.ts +55 -3
  608. package/scripts/run/board/run-board-planning.ts +45 -0
  609. package/scripts/run/board/run-board-priority.ts +44 -0
  610. package/scripts/run/board/run-board-process-groups.ts +195 -0
  611. package/scripts/run/board/run-board-read.ts +151 -27
  612. package/scripts/run/board/run-board-reason.ts +235 -51
  613. package/scripts/run/board/run-board-released.ts +35 -0
  614. package/scripts/run/board/run-board-render-checks.ts +39 -5
  615. package/scripts/run/board/run-board-render-condition.ts +96 -0
  616. package/scripts/run/board/run-board-render-drawn.ts +67 -0
  617. package/scripts/run/board/run-board-render-foot.ts +59 -0
  618. package/scripts/run/board/run-board-render-icon.ts +35 -0
  619. package/scripts/run/board/run-board-render-lanes.ts +145 -0
  620. package/scripts/run/board/run-board-render-lead.ts +80 -0
  621. package/scripts/run/board/run-board-render-legend.ts +117 -48
  622. package/scripts/run/board/run-board-render-notes.ts +156 -29
  623. package/scripts/run/board/run-board-render-processes.ts +196 -0
  624. package/scripts/run/board/run-board-render-section.ts +119 -0
  625. package/scripts/run/board/run-board-render-slot.ts +3 -36
  626. package/scripts/run/board/run-board-render-tail.ts +115 -48
  627. package/scripts/run/board/run-board-render-time.ts +56 -0
  628. package/scripts/run/board/run-board-render-title.ts +117 -24
  629. package/scripts/run/board/run-board-render-waits.ts +104 -20
  630. package/scripts/run/board/run-board-render.ts +207 -265
  631. package/scripts/run/board/run-board-roots.ts +54 -0
  632. package/scripts/run/board/run-board-row-yield.ts +9 -4
  633. package/scripts/run/board/run-board-setup.ts +1 -12
  634. package/scripts/run/board/run-board-snapshot.ts +111 -0
  635. package/scripts/run/board/run-board-spin.ts +2 -2
  636. package/scripts/run/board/run-board-state.ts +22 -33
  637. package/scripts/run/board/run-board-status.ts +147 -71
  638. package/scripts/run/board/run-board-thanks-read.ts +2 -2
  639. package/scripts/run/board/run-board-tick.ts +122 -107
  640. package/scripts/run/board/run-board-usage-board.ts +78 -0
  641. package/scripts/run/board/run-board-usage-lanes.ts +113 -0
  642. package/scripts/run/board/run-board-usage-listing.ts +93 -0
  643. package/scripts/run/board/run-board-usage-read.ts +120 -150
  644. package/scripts/run/board/run-board-usage-rusage.ts +19 -7
  645. package/scripts/run/board/run-board-usage-text.ts +139 -51
  646. package/scripts/run/board/run-board-usage-top.ts +102 -0
  647. package/scripts/run/board/run-board-usage.ts +89 -72
  648. package/scripts/run/board/run-board-usual.ts +20 -9
  649. package/scripts/run/carry/run-carry-args.ts +4 -7
  650. package/scripts/run/carry/run-carry-conversation.ts +1 -1
  651. package/scripts/run/carry/run-carry.ts +9 -4
  652. package/scripts/run/cut/run-cut-handoff.ts +2 -2
  653. package/scripts/run/event/run-event-cli.ts +1 -5
  654. package/scripts/run/event/run-event-filed.ts +12 -6
  655. package/scripts/run/event/run-event-follow.ts +2 -3
  656. package/scripts/run/event/run-event-render.ts +6 -10
  657. package/scripts/run/event/run-event-scope.ts +2 -2
  658. package/scripts/run/event/run-event-stream-emit.ts +82 -22
  659. package/scripts/run/event/run-event-stream.ts +34 -8
  660. package/scripts/run/hold/run-hold-adopt.ts +65 -0
  661. package/scripts/run/hold/run-hold-cli.ts +93 -22
  662. package/scripts/run/hold/run-hold-main.ts +12 -0
  663. package/scripts/run/hold/run-hold-member.ts +37 -0
  664. package/scripts/run/hold/run-stop-notify.ts +183 -0
  665. package/scripts/run/merge/run-merge-auth.ts +31 -0
  666. package/scripts/run/merge/run-merge-cli.ts +62 -48
  667. package/scripts/run/merge/run-merge-close.ts +74 -0
  668. package/scripts/run/merge/run-merge-collect.ts +6 -13
  669. package/scripts/run/merge/run-merge-driver.ts +71 -0
  670. package/scripts/run/merge/run-merge-main.ts +12 -0
  671. package/scripts/run/merge/run-merge-outcome.ts +23 -0
  672. package/scripts/run/merge/run-merge-restart.ts +39 -0
  673. package/scripts/run/merge/run-merge-ship.ts +20 -4
  674. package/scripts/run/merge/run-merge-signals.ts +33 -9
  675. package/scripts/run/merge/run-merge-steps.ts +120 -85
  676. package/scripts/run/merge/run-merge.ts +38 -37
  677. package/scripts/run/park/run-park-cli.ts +91 -0
  678. package/scripts/run/park/run-park.ts +88 -0
  679. package/scripts/run/park/run-stalled.ts +68 -0
  680. package/scripts/run/pause/run-pause-cli.ts +73 -0
  681. package/scripts/run/pause/run-pause.ts +251 -0
  682. package/scripts/run/progress/run-progress-cli.ts +4 -12
  683. package/scripts/run/progress/run-progress-clock.ts +1 -1
  684. package/scripts/run/progress/run-progress-config.ts +6 -14
  685. package/scripts/run/progress/run-progress-main.ts +12 -0
  686. package/scripts/run/progress/run-progress.ts +1 -4
  687. package/scripts/run/review/run-review.ts +2 -1
  688. package/scripts/run/run-ending.ts +1 -0
  689. package/scripts/run/run-invocation.ts +5 -6
  690. package/scripts/run/run-liveness-cli.ts +6 -8
  691. package/scripts/run/run-liveness.ts +60 -29
  692. package/scripts/run/run-next.ts +1 -1
  693. package/scripts/run/run-parent-cut-hook.ts +2 -2
  694. package/scripts/run/run-preflight.ts +18 -3
  695. package/scripts/run/run-prep-cli.ts +1 -10
  696. package/scripts/run/run-prep-locate.ts +7 -50
  697. package/scripts/run/run-prep-main.ts +12 -0
  698. package/scripts/run/run-prep.ts +6 -0
  699. package/scripts/run/run-report-cli.ts +101 -13
  700. package/scripts/run/run-report-handoff.ts +114 -0
  701. package/scripts/run/run-step.ts +1 -1
  702. package/scripts/run/run-stranded-detect.ts +13 -0
  703. package/scripts/run/run-watcher-guard-cli.ts +1 -1
  704. package/scripts/run/run-watcher-guard.ts +1 -1
  705. package/scripts/run/ship/run-ship-args.ts +121 -0
  706. package/scripts/run/ship/run-ship-body-draft.ts +110 -0
  707. package/scripts/run/ship/run-ship-cli.ts +63 -140
  708. package/scripts/run/ship/run-ship-detach.ts +19 -8
  709. package/scripts/run/ship/run-ship-infra-retry.ts +59 -0
  710. package/scripts/run/ship/run-ship-next.ts +18 -2
  711. package/scripts/run/ship/run-ship-overlap.ts +42 -5
  712. package/scripts/run/ship/run-ship-place.ts +96 -0
  713. package/scripts/run/ship/run-ship-pre-detach-timed.ts +43 -0
  714. package/scripts/run/ship/run-ship-pre-detach.ts +81 -24
  715. package/scripts/run/ship/run-ship-preflight.ts +137 -32
  716. package/scripts/run/ship/run-ship-probe.ts +11 -3
  717. package/scripts/run/ship/run-ship-relaunch-cap.ts +70 -0
  718. package/scripts/run/ship/run-ship-removed-rows.ts +61 -0
  719. package/scripts/run/ship/run-ship-return.ts +107 -23
  720. package/scripts/run/ship/run-ship-review-steps.ts +105 -151
  721. package/scripts/run/ship/run-ship-review.ts +73 -6
  722. package/scripts/run/ship/run-ship-reviewer.ts +207 -0
  723. package/scripts/run/ship/run-ship-stage.ts +55 -6
  724. package/scripts/run/ship/run-ship-steps.ts +46 -15
  725. package/scripts/run/ship/run-ship-stop-cause.ts +135 -0
  726. package/scripts/run/ship/run-ship-stop-text.ts +11 -6
  727. package/scripts/run/ship/run-ship-sync.ts +43 -6
  728. package/scripts/run/ship/run-ship.ts +30 -2
  729. package/scripts/run/tidy/run-tidy-cli.ts +0 -4
  730. package/scripts/run/tidy/run-tidy-lanes.ts +3 -0
  731. package/scripts/run/tidy/run-tidy-main.ts +8 -0
  732. package/scripts/run/wake/run-wake-cli.ts +119 -100
  733. package/scripts/run/wake/run-wake-code.ts +83 -0
  734. package/scripts/run/wake/run-wake-driver.ts +19 -8
  735. package/scripts/run/wake/run-wake-loop.ts +34 -3
  736. package/scripts/run/wake/run-wake-main.ts +13 -0
  737. package/scripts/run/wake/run-wake-ports.ts +90 -0
  738. package/scripts/run/wake/run-wake-takeover.ts +66 -0
  739. package/scripts/run/wake/run-wake.ts +2 -1
  740. package/scripts/safe-chain/pack-hook.ts +2 -2
  741. package/scripts/safe-chain/preinstall-command.ts +2 -1
  742. package/scripts/safe-chain/project-config.ts +3 -9
  743. package/scripts/security/security-audit-main.ts +8 -0
  744. package/scripts/security/security-audit-provision-logic.ts +0 -11
  745. package/scripts/security/security-audit-provision-main.ts +12 -0
  746. package/scripts/security/security-audit-provision.ts +11 -26
  747. package/scripts/security/security-audit.ts +6 -7
  748. package/scripts/self-sync-guard/self-sync-guard-logic.ts +6 -13
  749. package/scripts/split/split-assess-cli.ts +2 -2
  750. package/scripts/split/split-assess.ts +15 -0
  751. package/scripts/split/split-measure.ts +65 -0
  752. package/scripts/sync/claude-settings-merge.ts +8 -15
  753. package/scripts/sync/directory-copy-guard.ts +4 -9
  754. package/scripts/sync/file-content.ts +78 -8
  755. package/scripts/sync/sync-ai-files.ts +3 -5
  756. package/scripts/sync/sync-configs.ts +11 -23
  757. package/scripts/sync/sync-hook-safety.ts +4 -10
  758. package/scripts/sync/sync-main.ts +11 -0
  759. package/scripts/sync/sync.ts +25 -37
  760. package/scripts/test/test-declared-changed.ts +2 -2
  761. package/scripts/test/test-declared.ts +1 -1
  762. package/scripts/test/test-e2e-guard.ts +25 -1
  763. package/scripts/test/test-e2e-stamp.ts +38 -0
  764. package/scripts/test/test-pinned-logic.ts +145 -0
  765. package/scripts/test/test-pinned-main.ts +78 -0
  766. package/scripts/test/test-pinned.ts +100 -0
  767. package/scripts/test/test-read-map.ts +264 -0
  768. package/scripts/test/test-read-recording.ts +91 -0
  769. package/scripts/test/test-read-trace.ts +148 -0
  770. package/scripts/test/test-red-main.ts +12 -0
  771. package/scripts/test/test-red.ts +12 -30
  772. package/scripts/test/test-related-main.ts +18 -0
  773. package/scripts/test/test-related-record.ts +119 -0
  774. package/scripts/test/test-related-scope.ts +229 -43
  775. package/scripts/test/test-related.ts +300 -22
  776. package/scripts/test/test-unit-guard-main.ts +15 -0
  777. package/scripts/test/test-unit-guard.ts +42 -24
  778. package/scripts/test/unit-count-file.ts +37 -0
  779. package/scripts/test/unit-run-marker.ts +162 -0
  780. package/scripts/test/unit-setup-files.ts +51 -0
  781. package/scripts/test/unit-worker-share.ts +61 -149
  782. package/scripts/test/whole-suite-files.ts +63 -0
  783. package/scripts/time-runtime/time-background.ts +20 -2
  784. package/scripts/time-runtime/time-bundles.ts +4 -3
  785. package/scripts/time-runtime/time-density-hook.ts +8 -6
  786. package/scripts/time-runtime/time-followup-stage.ts +1 -3
  787. package/scripts/time-runtime/time-format.ts +5 -28
  788. package/scripts/time-runtime/time-markers.ts +10 -1
  789. package/scripts/time-runtime/time-shell.ts +97 -10
  790. package/scripts/time-runtime/time-transcript-line.ts +49 -62
  791. package/scripts/uninstall/uninstall.ts +1 -1
  792. package/scripts/version/bump-version-main.ts +12 -0
  793. package/scripts/version/bump-version.ts +25 -25
  794. package/scripts/version/effective-upstream.ts +6 -12
  795. package/scripts/version/latest-corepack.ts +17 -32
  796. package/scripts/version/latest-if-required-cli.ts +93 -0
  797. package/scripts/version/latest-lane-guard-main.ts +8 -0
  798. package/scripts/version/latest-lane-guard.ts +0 -4
  799. package/scripts/version/latest-scope-cli.ts +0 -9
  800. package/scripts/version/latest-scope-main.ts +12 -0
  801. package/scripts/version/latest-update.ts +5 -5
  802. package/scripts/version/npm-registry.ts +44 -6
  803. package/scripts/version/publishable-range-check.ts +5 -16
  804. package/scripts/version/release-age.ts +1 -1
  805. package/scripts/version/release-hold.ts +1 -1
  806. package/scripts/version/release-window.ts +38 -0
  807. package/scripts/version/running-binary.ts +1 -1
  808. package/scripts/version/safe-chain-version-update.ts +3 -8
  809. package/scripts/version/version-targets.ts +6 -28
  810. package/templates/dependabot.yml +29 -0
  811. package/templates/gitignore +4 -1
  812. package/templates/pnpm-workspace.basic.yaml +1 -1
  813. package/templates/sonar-project.properties +3 -2
  814. package/templates/workflows/ci.yml +12 -4
  815. package/templates/workflows/github-release.yml +4 -0
  816. package/tsconfig.sonar.json +1 -1
  817. package/.ncurc.json +0 -3
  818. package/dist/hooks/batch-guard.js +0 -29
  819. package/dist/hooks/chunk-4KKD2UTK.js +0 -66
  820. package/dist/hooks/chunk-6TS2JD6D.js +0 -237
  821. package/dist/hooks/chunk-7DSBJVFH.js +0 -50
  822. package/dist/hooks/chunk-A65Y4YOR.js +0 -79
  823. package/dist/hooks/chunk-CDY4NFQG.js +0 -15
  824. package/dist/hooks/chunk-EFXE6C37.js +0 -81
  825. package/dist/hooks/chunk-GP4IEC4O.js +0 -20
  826. package/dist/hooks/chunk-JP45SOCJ.js +0 -56
  827. package/dist/hooks/chunk-LAOV7NLM.js +0 -45
  828. package/dist/hooks/chunk-M4HGZV7U.js +0 -83
  829. package/dist/hooks/chunk-PF2NZL2A.js +0 -131
  830. package/dist/hooks/chunk-PTICX4OL.js +0 -358
  831. package/dist/hooks/chunk-RT27QRJW.js +0 -6247
  832. package/dist/hooks/chunk-SYOTDYCI.js +0 -3533
  833. package/dist/hooks/chunk-UPUZF3AN.js +0 -279
  834. package/dist/hooks/chunk-WK6SMBIC.js +0 -3180
  835. package/dist/hooks/duplicate-read-guard.js +0 -30
  836. package/dist/hooks/investigation-guard.js +0 -29
  837. package/scripts/backlog/backlog-stalled-cli.ts +0 -30
  838. package/scripts/cost-runtime/cost-format.ts +0 -29
  839. package/scripts/init/basic-path-migration.ts +0 -24
  840. package/scripts/issue/issue-backlinks-cli.ts +0 -93
  841. package/scripts/josh/josh-commands-guard.ts +0 -38
  842. package/scripts/josh/josh-usage-automation.ts +0 -121
  843. package/scripts/josh/josh-usage-backlog.ts +0 -180
  844. package/scripts/josh/josh-usage-developer.ts +0 -230
  845. package/scripts/josh/josh-usage-hooks.ts +0 -38
  846. package/scripts/josh/josh-usage-issue.ts +0 -205
  847. package/scripts/josh/josh-usage-review.ts +0 -101
  848. package/scripts/josh/josh-usage-run.ts +0 -252
  849. package/scripts/josh/josh-usage-session.ts +0 -238
  850. package/scripts/josh/josh-usage-workflow.ts +0 -212
  851. package/scripts/lint/cross-file-recheck.ts +0 -155
  852. package/scripts/registry-migration/migrate-logic.ts +0 -237
  853. package/scripts/registry-migration/migrate.ts +0 -292
  854. package/scripts/registry-migration/user-npmrc.ts +0 -15
  855. package/scripts/rules/rule-guard.ts +0 -23
  856. package/scripts/rules/rule-registry-rows.ts +0 -292
  857. package/scripts/rules/rule-registry.ts +0 -112
  858. package/scripts/run/run-stranded-cli.ts +0 -27
@@ -0,0 +1,23 @@
1
+ import path from 'node:path'
2
+
3
+ // The name an app is drawn under on `run:board`'s 💻 processes section, computed from its command.
4
+ // `run-board-process-groups.ts` remembers each command's answer, so a redraw names only the processes
5
+ // new since the last one (joshuafolkken/kit#4263).
6
+
7
+ const APP_SUFFIX = '.app'
8
+ const COMMAND_SEPARATOR = ' '
9
+
10
+ // An app's name: the outermost `.app` bundle its executable sits in, else its command's own name.
11
+ function app_of(command: string): string {
12
+ const bundle = command.split(path.sep).find((part) => part.endsWith(APP_SUFFIX))
13
+
14
+ if (bundle !== undefined) return bundle.slice(0, -APP_SUFFIX.length)
15
+
16
+ const executable = command.startsWith(path.sep) ? command : command.split(COMMAND_SEPARATOR)[0]
17
+
18
+ return path.basename(executable ?? command)
19
+ }
20
+
21
+ const run_board_app_name = { app_of }
22
+
23
+ export { run_board_app_name }
@@ -1,24 +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 { core_budget } from '#scripts/gate/core-budget'
6
- import { machine_capacity } from '#scripts/gate/machine-capacity'
3
+ import { MS_PER_MINUTE } from '#scripts/lib/timeouts'
7
4
  import { telegram_notify } from '#scripts/notify/telegram-notify'
8
5
  import { run_progress } from '#scripts/run/progress/run-progress'
9
6
  import { run_progress_read } from '#scripts/run/progress/run-progress-read'
10
7
  import terminalLink from 'terminal-link'
11
8
  import { run_board_closed } from './run-board-closed'
12
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'
13
15
  import { run_board_labels } from './run-board-labels'
14
- import { run_board_plan } from './run-board-plan'
15
- import { run_board_read } from './run-board-read'
16
+ import { run_board_plan_shared } from './run-board-plan-shared'
16
17
  import { run_board_screen, type Screen } from './run-board-screen'
18
+ import { run_board_snapshot } from './run-board-snapshot'
17
19
  import { run_board_spin } from './run-board-spin'
18
20
  import type { BoardPorts } from './run-board-state'
19
21
  import { run_board_thanks_read } from './run-board-thanks-read'
20
22
  import { run_board_tick } from './run-board-tick'
21
- import { run_board_usage_read } from './run-board-usage-read'
22
23
 
23
24
  // `josh run:board` — a full-screen board of the running `backlogrun`, redrawn once a second, its
24
25
  // spinners turned between redraws, for a person to keep open beside the run. What one redraw reads,
@@ -26,7 +27,6 @@ import { run_board_usage_read } from './run-board-usage-read'
26
27
  // terminal around it. A run that ended stays on screen until the next one starts; with no run in this
27
28
  // checkout it reads nothing from GitHub and waits.
28
29
 
29
- const ARGV_OFFSET = 2
30
30
  const SUCCESS_EXIT_CODE = 0
31
31
  const FAILURE_EXIT_CODE = 1
32
32
  const ONCE_FLAG = '--once'
@@ -48,13 +48,10 @@ function on_exit(leave: () => void): void {
48
48
  process.once('SIGTERM', () => process.exit(SIGTERM_EXIT_CODE))
49
49
  }
50
50
 
51
- const LIVE_PORTS: BoardPorts = {
52
- read_plan: async (scope) => await run_board_plan.read_plan(scope),
53
- read_local: run_board_read.read_local,
54
- read_machine: machine_capacity.read_sample,
55
- read_waits: () => core_budget.budget_waits(),
56
- 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),
57
53
  read_closed: async (issues) => await run_board_closed.read_all(issues),
54
+ snapshot: run_board_snapshot.file_store(),
58
55
  read_thanks: async () => await run_board_thanks_read.read_thanks(),
59
56
  now: () => Date.now(),
60
57
  write: (frame) => process.stdout.write(frame),
@@ -64,6 +61,20 @@ const LIVE_PORTS: BoardPorts = {
64
61
  // Read on every redraw, so a resized pane is fitted on the next one.
65
62
  size: () => ({ rows: process.stdout.rows, columns: process.stdout.columns }),
66
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
+ },
67
78
  mark: async () => {
68
79
  run_progress_read.mark(await run_progress_read.stamp_target(), Date.now())
69
80
  },
@@ -76,14 +87,27 @@ const LIVE_PORTS: BoardPorts = {
76
87
  },
77
88
  }
78
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
+
79
100
  // Every frame starts from the top of the alternate screen, erasing what the last one left below it, and
80
101
  // ends on the line that says closing the screen leaves the run going — only a screen a person can
81
102
  // close says it, and it is the first line to give way to a short pane. Nothing follows the last line,
82
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.
83
105
  function framed(ports: BoardPorts, screen: Screen): BoardPorts {
106
+ const keys = ports.folded === undefined ? [] : [run_board_fold.KEYS_LINE]
107
+
84
108
  return {
85
109
  ...ports,
86
- footer: ['', styleText('dim', WORDS.keeps_running)],
110
+ footer: ['', ...[WORDS.keeps_running, ...keys].map((line) => styleText('dim', line))],
87
111
  write: (frame) => {
88
112
  ports.write(`${screen.frame}${frame.replace(TRAILING_NEWLINE, '')}`)
89
113
  },
@@ -91,13 +115,15 @@ function framed(ports: BoardPorts, screen: Screen): BoardPorts {
91
115
  }
92
116
 
93
117
  // Leaves the alternate screen once, whichever path gets there first: a second leave would restore the
94
- // cursor saved on entering and draw over whatever was printed after the first.
95
- 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 {
96
121
  let has_left = false
97
122
 
98
123
  return () => {
99
124
  if (has_left) return
100
125
  has_left = true
126
+ keys.stop?.()
101
127
  ports.write(screen.leave)
102
128
  }
103
129
  }
@@ -121,13 +147,14 @@ async function redraw_forever(ports: BoardPorts, screen: Screen): Promise<void>
121
147
  // lands on the normal screen rather than vanishing with the alternate one.
122
148
  async function watch(ports: BoardPorts): Promise<void> {
123
149
  const screen = run_board_screen.screen_of('live')
124
- const leave = leaver(ports, screen)
150
+ const keys = run_board_keys.read_keys(ports.keys)
151
+ const leave = leaver(ports, screen, keys)
125
152
 
126
153
  ports.write(screen.enter)
127
154
  ports.on_exit(leave)
128
155
 
129
156
  try {
130
- await redraw_forever(ports, screen)
157
+ await redraw_forever({ ...ports, folded: keys.folded }, screen)
131
158
  } finally {
132
159
  leave()
133
160
  }
@@ -162,25 +189,35 @@ async function push_every(minutes: string | undefined, ports: BoardPorts): Promi
162
189
  return SUCCESS_EXIT_CODE
163
190
  }
164
191
 
165
- 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)
166
193
 
167
194
  return SUCCESS_EXIT_CODE
168
195
  }
169
196
 
170
- 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> {
171
203
  if (flag === CHAT_FLAG) {
172
- await answer(ports)
204
+ await answer(ports_for(ports, false))
173
205
 
174
206
  return
175
207
  }
176
208
 
177
- 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
+ }
178
217
 
179
218
  // One plain frame stays on the terminal after the command, so it draws the still icons rather than a
180
219
  // spinner frame frozen mid-turn.
181
- const once_ports = { ...ports, is_tty: false, size: undefined }
182
-
183
- await (mode === 'live' ? watch(ports) : tick(FRESH_STATE, once_ports))
220
+ await tick(FRESH_STATE, { ...ports_for(ports, false), is_tty: false, size: undefined })
184
221
  }
185
222
 
186
223
  function is_every(flag: string, rest: ReadonlyArray<string>): boolean {
@@ -191,10 +228,10 @@ function is_refused(flag: string, rest: ReadonlyArray<string>): boolean {
191
228
  return rest.length > 0 || !FLAGS.has(flag)
192
229
  }
193
230
 
194
- async function run(argv: ReadonlyArray<string>, ports: BoardPorts = LIVE_PORTS): Promise<number> {
231
+ async function run(argv: ReadonlyArray<string>, ports?: BoardPorts): Promise<number> {
195
232
  const [flag = '', ...rest] = argv
196
233
 
197
- 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))
198
235
  if (is_refused(flag, rest)) return refuse()
199
236
 
200
237
  await draw(flag, ports)
@@ -204,8 +241,4 @@ async function run(argv: ReadonlyArray<string>, ports: BoardPorts = LIVE_PORTS):
204
241
 
205
242
  const run_board_cli = { DISABLED_NOTICE, USAGE, run }
206
243
 
207
- if (process.argv[1] === fileURLToPath(import.meta.url)) {
208
- process.exitCode = await run(process.argv.slice(ARGV_OFFSET))
209
- }
210
-
211
244
  export { run_board_cli }
@@ -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 }