@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
@@ -1,34 +1,45 @@
1
+ import { backlog_drive_named } from '#scripts/backlog/backlog-drive-named'
1
2
  import { backlog_overlap } from '#scripts/backlog/backlog-overlap'
2
3
  import type { EpicChild } from '#scripts/epic/epic-graph'
4
+ import { epic_solo, type Labelled, type SoloQueue } from '#scripts/epic/epic-solo'
3
5
  import { epic_triage } from '#scripts/epic/epic-triage'
6
+ import { has_label_name, has_parked_label, IN_PROGRESS_LABEL } from '#scripts/issue/issue-labels'
7
+ import { issue_not_before } from '#scripts/issue/issue-not-before'
8
+ import { issue_sample_gate } from '#scripts/issue/issue-sample-gate'
9
+ import { lane_state } from '#scripts/lane/lane-state'
10
+ import type { RunCarry } from '#scripts/run/carry/run-carry'
4
11
  import { run_event_setup } from '#scripts/run/event/run-event-setup'
5
12
  import type { RunEvent } from '#scripts/run/event/run-event-stream'
13
+ import { run_board_labels } from './run-board-labels'
6
14
  import { run_board_layout, type Overlay, type ReasonOf, type RowReason } from './run-board-layout'
15
+ import { run_board_machine, type MachineGauges } from './run-board-machine'
16
+ import { run_board_planning, type Planning } from './run-board-planning'
7
17
  import { run_board_setup } from './run-board-setup'
8
18
  import type { ItemStatus } from './run-board-status'
9
19
 
10
- // Why each waiting row waits — pure, so the words are tested apart from the screen. A row whose lane is
11
- // being opened says the stage that lane is at; any other says what `backlog:next` would answer for it,
12
- // read off the same rules: `epic_triage` for an untriaged issue, `backlog_overlap` for a declared path a
13
- // running issue holds, the lane limit for a full pool. A blocker stays the row's `🔗`; only a row that
14
- // nobody has judged says so beside it, since judging it is what a person can do meanwhile.
15
- // Every word is English whatever the session language, as every other word on the board is.
20
+ // Why each waiting row waits — pure, so the reasons are tested apart from the screen. Each is one
21
+ // `RowReason` its row only draws (joshuafolkken/kit#4288): an icon, the condition column's value and
22
+ // what follows the title. A row whose lane is being opened leads with the stage that lane is at; any
23
+ // other with what `backlog:next` would answer for it, read off the same rules — after the row a
24
+ // planning run is for, which says so (`run-board-planning.ts`): the driver's declared order for a named
25
+ // run's issue, `epic_triage` for an untriaged issue, `epic_solo` for a running `run:solo` issue, a
26
+ // waiting one and the rows behind it, `backlog_overlap` for a declared path a running issue holds,
27
+ // the lane limit for a full pool. A start time the body declares and the clock has not reached
28
+ // (`issue-not-before.ts`) comes before the pool's reasons, since the pickup never offers the row
29
+ // until then; it reads in the local time every other time on the board does (#4017). A blocker
30
+ // leads its row with `🔗`; a row that nobody has judged leads with ❓ even where it is blocked, since
31
+ // judging it is what a person can do meanwhile.
16
32
 
17
33
  const { LANE_STAGE } = run_event_setup
34
+ const { HEADER_ICONS, STAGE_ICONS, STATE_ICONS, WAIT_ICONS } = run_board_labels
18
35
  const NO_FREE_LANES = 0
36
+ const FIRST_ONLY = 1
19
37
 
20
- const WORDS = {
21
- untriaged: 'untriaged',
22
- held: 'held by triage',
23
- no_lane: 'no free lane',
24
- overlaps: 'overlaps',
25
- } as const
26
-
27
- // A lane's stage as its row says it: the event's own words, cut to what fits beside a title.
28
- const STAGE_WORDS: ReadonlyArray<readonly [stage: string, word: string]> = [
29
- [LANE_STAGE.OPENING, 'opening lane'],
30
- [LANE_STAGE.INSTALLING, 'installing'],
31
- [LANE_STAGE.DISPATCHING, 'dispatching'],
38
+ // The stages a lane's launch passes, each leading its row with its own icon.
39
+ const LANE_STAGES: ReadonlyArray<string> = [
40
+ LANE_STAGE.OPENING,
41
+ LANE_STAGE.INSTALLING,
42
+ LANE_STAGE.DISPATCHING,
32
43
  ]
33
44
 
34
45
  // What the reasons are read from, beside the plan and the statuses a layout is drawn from.
@@ -36,31 +47,48 @@ interface ReasonRead extends Overlay {
36
47
  events: ReadonlyArray<RunEvent>
37
48
  // How many more lanes the limit allows; `undefined` where it could not be read.
38
49
  free_lanes: number | undefined
39
- // The issues whose lanes fill the limit, named after `no free lane` so a lane an earlier run left
40
- // behind shows on the row it holds back.
41
- occupied_lanes?: ReadonlyArray<string> | undefined
50
+ // How many lanes hold a place under the limit, counted after `🧵`.
51
+ occupied_count?: number | undefined
52
+ // The limit those lanes fill; `undefined` where it could not be read.
53
+ lane_limit?: number | undefined
54
+ // The driver holds its offered issue for memory (`backlog-drive-memory.ts`).
55
+ is_memory_held?: boolean | undefined
56
+ // The machine's latest gauges, the figures a memory hold names.
57
+ gauges?: MachineGauges | undefined
58
+ // The run's record, whose declared order holds the issues declared after one in flight.
59
+ carry?: RunCarry | undefined
42
60
  // A stopped run opens no lane, so a stage its stream ends on is not one any lane is at.
43
61
  is_stopped: boolean
44
62
  }
45
63
 
46
64
  // What every row of one layout is weighed against, read once.
47
65
  interface Pool {
48
- // An untriaged issue nothing blocks withholds every candidate (`epic-triage.ts`).
49
- is_held: boolean
66
+ // The untriaged issue nothing blocks that withholds every candidate (`epic-triage.ts`), if any.
67
+ held_by: number | undefined
50
68
  running: ReadonlyArray<number>
69
+ // The issues the classifier withholds for a person (`epic-outside-blocker.ts`'s `human`).
70
+ withheld: ReadonlySet<number>
71
+ // The row the run's planning is for, while the run plans (`run-board-planning.ts`).
72
+ planning: Planning | undefined
73
+ // The first `run:solo` candidate and the candidates behind it (`epic-solo.ts`), if any.
74
+ solo: SoloQueue | undefined
75
+ // The running `run:solo` issue that lets nothing new start (`epic_solo.holder_of`), if any.
76
+ solo_holder: number | undefined
51
77
  }
52
78
 
53
- function stage_word(text: string): string | undefined {
54
- return STAGE_WORDS.find(([stage]) => text.startsWith(stage))?.[1]
79
+ function stage_icon(text: string): string | undefined {
80
+ const stage = LANE_STAGES.find((name) => text.startsWith(name))
81
+
82
+ return stage === undefined ? undefined : STAGE_ICONS[stage]
55
83
  }
56
84
 
57
85
  function stage_of(child: EpicChild, read: ReasonRead): RowReason | undefined {
58
86
  const stage = read.is_stopped ? undefined : run_board_setup.lane_stage(read.events, child.number)
59
- const text = stage === undefined ? undefined : stage_word(stage.text)
87
+ const icon = stage === undefined ? undefined : stage_icon(stage.text)
60
88
 
61
- if (stage === undefined || text === undefined) return undefined
89
+ if (stage === undefined || icon === undefined) return undefined
62
90
 
63
- return { text, since_ms: stage.at_ms }
91
+ return { icon, since_ms: stage.at_ms }
64
92
  }
65
93
 
66
94
  function is_untriaged_candidate(child: EpicChild, read: ReasonRead): boolean {
@@ -76,58 +104,214 @@ function running_of(read: ReasonRead): Array<number> {
76
104
  return [...read.statuses].filter(([, status]) => holds_paths(status)).map(([issue]) => issue)
77
105
  }
78
106
 
107
+ // A waiting row the pool could offer: judged, due, and with no blocker standing — a start time not yet
108
+ // reached keeps a row out of `backlog:next`'s candidates, so it holds nothing behind it.
109
+ function is_candidate(child: EpicChild, read: ReasonRead): boolean {
110
+ return (
111
+ epic_triage.is_triaged(child) &&
112
+ issue_not_before.is_due(child.body) &&
113
+ !run_board_layout.is_blocked(child, read)
114
+ )
115
+ }
116
+
117
+ // Every open issue holding a lane as `backlog:next` reads it (`epic-busy.ts`): `in-progress` and no
118
+ // park label — a paused lane, or one another run or a person works, holds as this run's lanes do.
119
+ function running_labelled(read: ReasonRead): Array<Labelled> {
120
+ return [...read.plan.labels]
121
+ .filter(([, labels]) => has_label_name(labels, IN_PROGRESS_LABEL) && !has_parked_label(labels))
122
+ .map(([number, labels]) => ({ number, labels }))
123
+ }
124
+
79
125
  function pool_of(read: ReasonRead): Pool {
80
126
  const waiting = run_board_layout.waiting_children(read)
127
+ const running = running_of(read)
128
+ const candidates = waiting.filter((child) => is_candidate(child, read))
81
129
 
82
130
  return {
83
- is_held: waiting.some((child) => is_untriaged_candidate(child, read)),
84
- running: running_of(read),
131
+ held_by: waiting.find((child) => is_untriaged_candidate(child, read))?.number,
132
+ running,
133
+ withheld: read.plan.withheld ?? new Set(),
134
+ planning: run_board_planning.planning_of(read, running),
135
+ solo: epic_solo.queue_of(candidates),
136
+ solo_holder: epic_solo.holder_of(running_labelled(read)),
85
137
  }
86
138
  }
87
139
 
88
- function overlap_of(child: EpicChild, read: ReasonRead, pool: Pool): string | undefined {
140
+ function planned_of(child: EpicChild, pool: Pool): RowReason | undefined {
141
+ return pool.planning?.issue === child.number ? pool.planning.reason : undefined
142
+ }
143
+
144
+ // ` — paused since 01:28 by lane:pause` for a holder whose lane is paused (joshuafolkken/kit#4270):
145
+ // only a paused lane's status carries who paused it, and its end is when.
146
+ function paused_tail(status: ItemStatus | undefined): string {
147
+ const { ended_ms, paused_by } = status ?? {}
148
+
149
+ if (paused_by === undefined || ended_ms === undefined) return ''
150
+
151
+ return ` — ${lane_state.paused_text(ended_ms, paused_by)}`
152
+ }
153
+
154
+ // `📂 4238 … scripts/gate/machine-capacity.ts`: the running issue holding a path this row declares,
155
+ // and the path after the title — with when and by what the holder was paused, where it is.
156
+ function overlap_of(child: EpicChild, read: ReasonRead, pool: Pool): RowReason | undefined {
89
157
  const { declared = new Map(), context } = read.plan
90
158
  const holding = { holders: pool.running, repo: context.repo }
91
159
  const clash = backlog_overlap.running_clash(child, declared, holding)
92
160
 
93
- return clash === undefined
94
- ? undefined
95
- : `${WORDS.overlaps} ${String(clash.holder)} (${clash.path})`
161
+ if (clash === undefined) return undefined
162
+
163
+ const tail = `${clash.path}${paused_tail(read.statuses.get(clash.holder))}`
164
+
165
+ return { icon: WAIT_ICONS.path, issues: [String(clash.holder)], tail }
96
166
  }
97
167
 
98
- function no_lane_of(occupied: ReadonlyArray<string> = []): string {
99
- if (occupied.length === 0) return WORDS.no_lane
168
+ // `🧵 4/4`: how many lanes hold a place against the limit the row starts after a free one of. Every
169
+ // waiting row repeated the same breakdown of them, so the row counts them and names none (#4111).
170
+ function no_lane_of(read: ReasonRead): RowReason {
171
+ const { occupied_count = 0, lane_limit } = read
100
172
 
101
- return `${WORDS.no_lane} — ${occupied.join(' ')}`
173
+ if (lane_limit === undefined) return { icon: WAIT_ICONS.lane }
174
+
175
+ return { icon: WAIT_ICONS.lane, value: `${String(occupied_count)}/${String(lane_limit)}` }
176
+ }
177
+
178
+ // `🧠 88% … 💾 12M/s`: run:board's own latest 🧠 / 💾, not the driver's reading, so a hold the kernel's
179
+ // verdict alone raised may show both green. Each is drawn only where it was read (#4084); the 💾 follows
180
+ // the title, so the row draws 🧠 once.
181
+ function no_memory_of(gauges: MachineGauges | undefined): RowReason {
182
+ const { percent_text, rate_text } = run_board_machine
183
+ const memory = gauges?.memory_percent
184
+ const swap = gauges?.swap_mb_per_s
185
+
186
+ return {
187
+ icon: WAIT_ICONS.memory,
188
+ value: memory === undefined ? undefined : percent_text(memory).trim(),
189
+ tail: swap === undefined ? undefined : `${HEADER_ICONS.swap} ${rate_text(swap).trim()}`,
190
+ }
102
191
  }
103
192
 
104
- // A candidate nothing blocks, in the order `backlog:next` answers: the pool held for a judgment, then
105
- // a path a running issue declares, then a pool with no lane left.
106
- function offer_wait(child: EpicChild, read: ReasonRead, pool: Pool): string | undefined {
107
- if (pool.is_held) return WORDS.held
193
+ // The machine's room: no lane left under the limit, else no memory for one more.
194
+ function room_wait(read: ReasonRead): RowReason | undefined {
195
+ if (read.free_lanes === NO_FREE_LANES) return no_lane_of(read)
108
196
 
109
- const overlap = overlap_of(child, read, pool)
197
+ return read.is_memory_held === true ? no_memory_of(read.gauges) : undefined
198
+ }
199
+
200
+ // `📋 4198`: the declared issue a named run starts this one after — the driver's own reading
201
+ // (`backlog-drive-named.ts`), asked before it offers anything.
202
+ function named_of(child: EpicChild, read: ReasonRead, pool: Pool): RowReason | undefined {
203
+ if (read.carry === undefined) return undefined
204
+ const in_flight = pool.running.map(String)
205
+ const holder = backlog_drive_named.held_after(read.carry, in_flight, child.number)
206
+
207
+ return holder === undefined ? undefined : { icon: WAIT_ICONS.named, issues: [String(holder)] }
208
+ }
110
209
 
111
- if (overlap !== undefined) return overlap
210
+ // `✋ 4301`: the untriaged issue the pool is held for a judgment of.
211
+ function held_of(pool: Pool): RowReason | undefined {
212
+ if (pool.held_by === undefined) return undefined
112
213
 
113
- return read.free_lanes === NO_FREE_LANES ? no_lane_of(read.occupied_lanes) : undefined
214
+ return { icon: WAIT_ICONS.held, issues: [String(pool.held_by)] }
114
215
  }
115
216
 
116
- function wait_of(child: EpicChild, read: ReasonRead, pool: Pool): RowReason | undefined {
117
- if (!epic_triage.is_triaged(child)) return { text: WORDS.untriaged }
118
- if (run_board_layout.is_blocked(child, read)) return undefined
217
+ // `🔒 4374`: the running `run:solo` issue nothing new starts beside until it merges or is parked.
218
+ function held_solo_of(pool: Pool): RowReason | undefined {
219
+ if (pool.solo_holder === undefined) return undefined
220
+
221
+ return { icon: WAIT_ICONS.solo_running, issues: [String(pool.solo_holder)] }
222
+ }
223
+
224
+ // `🧍 4288+1 … 4268`: a `run:solo` issue starts only into an idle repository, so it names the running
225
+ // lanes it waits for — the first in the condition column, the rest after the title.
226
+ function alone_of(running: ReadonlyArray<number>): RowReason | undefined {
227
+ return running.length === 0 ? undefined : { icon: WAIT_ICONS.solo, issues: running.map(String) }
228
+ }
229
+
230
+ // `🙅 4287`: nothing ranked behind a waiting `run:solo` issue is offered past it.
231
+ function solo_of(child: EpicChild, pool: Pool): RowReason | undefined {
232
+ const { solo } = pool
233
+
234
+ if (solo === undefined) return undefined
235
+ if (solo.solo.number === child.number) return alone_of(pool.running)
236
+ const is_behind = solo.behind.some((item) => item.number === child.number)
237
+
238
+ return is_behind ? { icon: WAIT_ICONS.solo_ahead, issues: [String(solo.solo.number)] } : undefined
239
+ }
240
+
241
+ // The `run:solo` gate as `epic_solo.select` reads it: a running `run:solo` issue first, then a waiting
242
+ // one's wait.
243
+ function solo_wait(child: EpicChild, pool: Pool): RowReason | undefined {
244
+ return held_solo_of(pool) ?? solo_of(child, pool)
245
+ }
246
+
247
+ // A candidate nothing blocks, in the order the driver answers: the declared order, then what
248
+ // `backlog:next` answers — the pool held for a judgment, then a running `run:solo` issue, then a
249
+ // waiting `run:solo` issue's wait, then a path a running issue declares, then a pool with no lane
250
+ // left, then a machine with no memory.
251
+ function offer_wait(child: EpicChild, read: ReasonRead, pool: Pool): RowReason | undefined {
252
+ return (
253
+ named_of(child, read, pool) ??
254
+ held_of(pool) ??
255
+ solo_wait(child, pool) ??
256
+ overlap_of(child, read, pool) ??
257
+ room_wait(read)
258
+ )
259
+ }
260
+
261
+ // `📅 3/10`: the merges the ledger recorded after the declared pull request merged, of those the body
262
+ // waits on; `📅 4313` while that pull request has not merged or its merge is unread.
263
+ function sample_wait_of(child: EpicChild): RowReason | undefined {
264
+ const wait = issue_sample_gate.wait_of(child.body)
265
+
266
+ if (wait === undefined) return undefined
267
+ if (wait.kind !== 'short') return { icon: WAIT_ICONS.not_before, issues: [String(wait.pr)] }
268
+
269
+ return { icon: WAIT_ICONS.not_before, value: `${String(wait.counted)}/${String(wait.needed)}` }
270
+ }
271
+
272
+ // `📅 10-20 16:30`: the start time the body declares and the clock has not reached, in the board's
273
+ // local time.
274
+ function not_before_of(child: EpicChild): RowReason | undefined {
275
+ const ms = issue_not_before.waiting_ms(child.body)
276
+
277
+ if (ms === undefined) return sample_wait_of(child)
278
+
279
+ return {
280
+ icon: WAIT_ICONS.not_before,
281
+ value: run_board_labels.day_minute_of(ms),
282
+ not_before_ms: ms,
283
+ }
284
+ }
285
+
286
+ // `🔗 4183` for a blocker the run finishes, `🙋 4183` where the classifier withholds the row for a
287
+ // person: the run will not finish a blocker it waits on (joshuafolkken/kit#4292).
288
+ function blocker_icon(child: EpicChild, pool: Pool): string {
289
+ return pool.withheld.has(child.number) ? STATE_ICONS.human : WAIT_ICONS.blocker
290
+ }
291
+
292
+ // `❓ 4183`: an issue nobody has judged, naming its first standing blocker where it has one.
293
+ function untriaged_of(waits: ReadonlyArray<string>): RowReason {
294
+ return { icon: WAIT_ICONS.untriaged, issues: waits.slice(0, FIRST_ONLY) }
295
+ }
119
296
 
120
- const text = offer_wait(child, read, pool)
297
+ function wait_of(
298
+ child: EpicChild,
299
+ waits: ReadonlyArray<string>,
300
+ read: ReasonRead,
301
+ pool: Pool,
302
+ ): RowReason | undefined {
303
+ if (!epic_triage.is_triaged(child)) return untriaged_of(waits)
304
+ if (waits.length > 0) return { icon: blocker_icon(child, pool), issues: waits }
121
305
 
122
- return text === undefined ? undefined : { text }
306
+ return not_before_of(child) ?? offer_wait(child, read, pool)
123
307
  }
124
308
 
125
309
  // What each waiting row of one layout says, the pool-wide facts read once for all of them.
126
310
  function reader(read: ReasonRead): ReasonOf {
127
311
  const pool = pool_of(read)
128
312
 
129
- return function reason_of(child: EpicChild): RowReason | undefined {
130
- return stage_of(child, read) ?? wait_of(child, read, pool)
313
+ return function reason_of(child, waits) {
314
+ return stage_of(child, read) ?? planned_of(child, pool) ?? wait_of(child, waits, read, pool)
131
315
  }
132
316
  }
133
317
 
@@ -0,0 +1,35 @@
1
+ import { has_parked_label } from '#scripts/issue/issue-labels'
2
+ import type { ItemStatus, OpenRead } from './run-board-status'
3
+
4
+ // A parked child a person has released by removing `needs-decision` is no longer the run's: the
5
+ // listing, read after the park, holds it open without the label. Its status is dropped, so the board
6
+ // lays it where the plan places it, as it does any issue the run has not touched.
7
+
8
+ type ReleaseRead = Pick<OpenRead, 'read_ms' | 'labels'>
9
+
10
+ function is_read_after_park(status: ItemStatus, read_ms: number | undefined): boolean {
11
+ return read_ms !== undefined && (status.ended_ms ?? 0) <= read_ms
12
+ }
13
+
14
+ // A person still owns a parked child while any park label (`PARKED_LABELS`) is on it. An issue the
15
+ // listing did not hold has no labels to read, and stays parked.
16
+ function is_undecided(labels: ReadonlyArray<string> | undefined): boolean {
17
+ return labels !== undefined && !has_parked_label(labels)
18
+ }
19
+
20
+ function is_released(issue: number, status: ItemStatus, read: ReleaseRead): boolean {
21
+ if (status.state !== 'parked') return false
22
+
23
+ return is_read_after_park(status, read.read_ms) && is_undecided(read.labels.get(issue))
24
+ }
25
+
26
+ function without_released(
27
+ statuses: ReadonlyMap<number, ItemStatus>,
28
+ read: ReleaseRead,
29
+ ): ReadonlyMap<number, ItemStatus> {
30
+ return new Map([...statuses].filter(([issue, status]) => !is_released(issue, status, read)))
31
+ }
32
+
33
+ const run_board_released = { without_released }
34
+
35
+ export { run_board_released }
@@ -20,11 +20,13 @@ const CODERABBIT_COLORS: Readonly<Partial<Record<CodeRabbitState, TextColor>>> =
20
20
  'rate-limited': 'yellow',
21
21
  failed: 'red',
22
22
  }
23
- // What the legend says of the part, once some row draws it.
24
- const LEGEND = [
25
- `${CHECK_ICONS.pass} ${CHECK_ICONS.pending} ${CHECK_ICONS.fail} checks passed · pending · failed`,
26
- `${CODERABBIT_ICON} CodeRabbit (${CODERABBIT_MARKS['rate-limited'] ?? ''} rate-limited)`,
23
+ // Each mark the legend can name, in its order, with its word.
24
+ const CHECK_WORDS: ReadonlyArray<readonly [string, string]> = [
25
+ [CHECK_ICONS.pass, 'passed'],
26
+ [CHECK_ICONS.pending, 'pending'],
27
+ [CHECK_ICONS.fail, 'failed'],
27
28
  ]
29
+ const RATE_LIMITED_MARK = CODERABBIT_MARKS['rate-limited'] ?? ''
28
30
 
29
31
  function tinted(text: string, color: TextColor | undefined): string {
30
32
  return color === undefined ? text : styleText(color, text)
@@ -50,6 +52,38 @@ function checks_part(checks: PrChecks): string {
50
52
  ].join(GAP)
51
53
  }
52
54
 
53
- const run_board_render_checks = { LEGEND, checks_part }
55
+ // The marks one row's part draws: each count it leaves in and CodeRabbit's mark.
56
+ function marks_of(checks: PrChecks): Array<string> {
57
+ const counts: ReadonlyArray<readonly [string, number]> = [
58
+ [CHECK_ICONS.pass, checks.pass],
59
+ [CHECK_ICONS.pending, checks.pending],
60
+ [CHECK_ICONS.fail, checks.fail],
61
+ ]
62
+ const drawn = counts.filter(([, count]) => count > 0).map(([icon]) => icon)
63
+
64
+ return [...drawn, CODERABBIT_MARKS[checks.coderabbit] ?? '']
65
+ }
66
+
67
+ function coderabbit_legend(drawn: ReadonlyArray<PrChecks>): Array<string> {
68
+ const states = new Set(drawn.map((checks) => checks.coderabbit))
69
+ const limited = states.has('rate-limited') ? ` (${RATE_LIMITED_MARK} rate-limited)` : ''
70
+
71
+ states.delete('none')
72
+
73
+ return states.size === 0 ? [] : [`${CODERABBIT_ICON} CodeRabbit${limited}`]
74
+ }
75
+
76
+ // What the legend says of the parts the rows draw (`drawn`): only the marks some part draws.
77
+ function legend_of(drawn: ReadonlyArray<PrChecks>): Array<string> {
78
+ const marks = new Set(drawn.flatMap((checks) => marks_of(checks)))
79
+ const shown = CHECK_WORDS.filter(([icon]) => marks.has(icon))
80
+ const icons = shown.map(([icon]) => icon).join(' ')
81
+ const words = shown.map(([, word]) => word).join(' · ')
82
+ const checks = shown.length === 0 ? [] : [`${icons} checks ${words}`]
83
+
84
+ return [...checks, ...coderabbit_legend(drawn)]
85
+ }
86
+
87
+ const run_board_render_checks = { checks_part, legend_of }
54
88
 
55
89
  export { run_board_render_checks }
@@ -0,0 +1,96 @@
1
+ import { run_board_fit } from './run-board-fit'
2
+ import { run_board_fresh } from './run-board-fresh'
3
+ import type { BoardHeader } from './run-board-header'
4
+ import { run_board_labels } from './run-board-labels'
5
+ import { run_board_layout, type BoardRow, type RowReason } from './run-board-layout'
6
+
7
+ // A queued, waiting or done row's condition column, and the issues its wait names after its title
8
+ // (joshuafolkken/kit#4288, #4292) — pure. The column is one width in every section, the widest value's
9
+ // — a 📅 row's or a done row's `MM-DD HH:MM` — so every row's number starts in one column. A value is
10
+ // padded on its drawn width: a linked issue's escape draws nothing.
11
+
12
+ const CONDITION_WIDTH = run_board_labels.day_minute_of(0).length
13
+ const ISSUE_SEPARATOR = ', '
14
+ const FIRST = 1
15
+
16
+ // `+1` for each issue after the first, which follow the title.
17
+ function more_of(issues: ReadonlyArray<string>): string {
18
+ return issues.length > FIRST ? `+${String(issues.length - FIRST)}` : ''
19
+ }
20
+
21
+ // How many of the wait's issues the column draws: the first, where it fits with its `+N` — a
22
+ // cross-repo `owner/repo#N` reference overruns the column, so it and the rest follow the title.
23
+ function column_count_of(issues: ReadonlyArray<string>): number {
24
+ const [first] = issues
25
+
26
+ if (first === undefined) return 0
27
+
28
+ return run_board_fit.width_of(`${first}${more_of(issues)}`) <= CONDITION_WIDTH ? FIRST : 0
29
+ }
30
+
31
+ // The first issue with its `+N` where the column draws it, else blank.
32
+ function issue_value_of(issues: ReadonlyArray<string>, header: BoardHeader): string {
33
+ const [first = ''] = issues.slice(0, column_count_of(issues))
34
+
35
+ return first === '' ? '' : `${header.link(first)}${more_of(issues)}`
36
+ }
37
+
38
+ // The wait's issues, else how long a stage has stood, else the wait's own figure.
39
+ function value_of(reason: RowReason, header: BoardHeader): string {
40
+ const { issues = [], since_ms } = reason
41
+
42
+ if (issues.length > 0) return issue_value_of(issues, header)
43
+ if (since_ms !== undefined) return run_board_labels.span_of(header.now_ms - since_ms)
44
+
45
+ return reason.value ?? ''
46
+ }
47
+
48
+ // A finished row's end, `MM-DD HH:MM`, emphasized while fresh (joshuafolkken/kit#4292); blank where
49
+ // the row is not finished or recorded no end.
50
+ function ended_of(row: BoardRow, header: BoardHeader): string {
51
+ const ended_ms = row.status?.ended_ms
52
+
53
+ if (ended_ms === undefined || !run_board_layout.is_finished(row.state)) return ''
54
+
55
+ return run_board_fresh.since(run_board_labels.day_minute_of(ended_ms), ended_ms, header)
56
+ }
57
+
58
+ // The column as drawn: what the row waits on, else when it finished, else blank.
59
+ function condition_of(row: BoardRow, header: BoardHeader): string {
60
+ const reason_value = row.reason === undefined ? '' : value_of(row.reason, header)
61
+ const value = reason_value === '' ? ended_of(row, header) : reason_value
62
+ const blank = Math.max(0, CONDITION_WIDTH - run_board_fit.width_of(value))
63
+
64
+ return `${value}${' '.repeat(blank)}`
65
+ }
66
+
67
+ // The issues the wait names that the column does not draw, which follow the title; `undefined` where
68
+ // it names none.
69
+ function rest_of(reason: RowReason | undefined): ReadonlyArray<string> | undefined {
70
+ const issues = reason?.issues
71
+
72
+ return issues?.slice(column_count_of(issues))
73
+ }
74
+
75
+ function linked(issues: ReadonlyArray<string>, header: BoardHeader): string | undefined {
76
+ if (issues.length === 0) return undefined
77
+
78
+ return issues.map((reference) => header.link(reference)).join(ISSUE_SEPARATOR)
79
+ }
80
+
81
+ // What a row waits on after its title: in a section that draws the condition column, the issues its
82
+ // wait names after the first; any other row — a 🙋 one, or a stalled one whose wait names no issue
83
+ // even there — `🔗` and every blocker still standing.
84
+ function waits_of(row: BoardRow, header: BoardHeader, is_conditioned = false): string | undefined {
85
+ const rest = is_conditioned ? rest_of(row.reason) : undefined
86
+
87
+ if (rest !== undefined) return linked(rest, header)
88
+
89
+ const blockers = linked(row.waits, header)
90
+
91
+ return blockers === undefined ? undefined : `${run_board_labels.WAITS_ICON} ${blockers}`
92
+ }
93
+
94
+ const run_board_render_condition = { CONDITION_WIDTH, condition_of, waits_of }
95
+
96
+ export { run_board_render_condition }
@@ -0,0 +1,67 @@
1
+ import { run_board_header, type BoardHeader } from './run-board-header'
2
+ import { run_board_labels } from './run-board-labels'
3
+ import { run_board_layout, type BoardRow } from './run-board-layout'
4
+ import { run_board_render_checks } from './run-board-render-checks'
5
+ import type { LegendDrawn } from './run-board-render-legend'
6
+ import { run_board_render_tail } from './run-board-render-tail'
7
+ import { run_board_render_waits } from './run-board-render-waits'
8
+
9
+ // What a `run:board` frame draws, read for its legend (joshuafolkken/kit#4047): every icon a phase may be
10
+ // drawn with — the rows' leads, the header's third line and the rows' ends — the activity kinds their
11
+ // words leave unnamed, the header's estimated finish (joshuafolkken/kit#4044), and a followup row's checks
12
+ // (joshuafolkken/kit#3770).
13
+
14
+ const { HEADER_ICONS, NOW_ICONS, WORDS } = run_board_labels
15
+
16
+ function present(icons: ReadonlyArray<string | undefined>): Set<string> {
17
+ return new Set(icons.filter((icon) => icon !== undefined))
18
+ }
19
+
20
+ // The lanes rule stands ⏰ over the lanes' times wherever a lanes section is drawn.
21
+ function has_lanes(header: BoardHeader): boolean {
22
+ const { layout } = header
23
+
24
+ return layout !== undefined && run_board_layout.lanes_drawn(layout).length > 0
25
+ }
26
+
27
+ // The third line's kinds, ⏰ where the lanes rule stands it over the lanes' times, then the estimated
28
+ // finish.
29
+ function named_of(header: BoardHeader, icons: ReadonlySet<string>): Array<string> {
30
+ const is_operation = icons.has(NOW_ICONS.operation)
31
+ const operation = is_operation ? `${NOW_ICONS.operation} ${WORDS.operation}` : undefined
32
+ const elapsed = has_lanes(header) ? `${HEADER_ICONS.elapsed} ${WORDS.elapsed}` : undefined
33
+ const legends = [
34
+ run_board_header.now_legend(header),
35
+ operation,
36
+ elapsed,
37
+ run_board_header.estimate_legend(header),
38
+ ]
39
+
40
+ return legends.filter((legend) => legend !== undefined)
41
+ }
42
+
43
+ // `leads` is the icons the rows lead with, which the frame's rows already know.
44
+ function drawn_of(
45
+ header: BoardHeader,
46
+ rows: ReadonlyArray<BoardRow>,
47
+ leads: ReadonlySet<string>,
48
+ ): LegendDrawn {
49
+ const ends = rows.flatMap((row) => [
50
+ run_board_render_tail.phase_icon(row),
51
+ run_board_render_tail.activity_icon(row, header),
52
+ ])
53
+ const icons = present([...leads, run_board_header.now_icon(header), ...ends])
54
+ const checks = rows.flatMap((row) => run_board_render_tail.checks_of(row, header) ?? [])
55
+
56
+ return {
57
+ leads,
58
+ icons,
59
+ named: named_of(header, icons),
60
+ checks: run_board_render_checks.legend_of(checks),
61
+ held: run_board_render_waits.legend_of(header),
62
+ }
63
+ }
64
+
65
+ const run_board_render_drawn = { drawn_of }
66
+
67
+ export { run_board_render_drawn }