@joshuafolkken/kit 1.1471.0 → 1.1784.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (895) hide show
  1. package/.claude/agents/investigator.md +1 -1
  2. package/.claude/settings.json +6 -6
  3. package/.claude/skills/epic-commands/SKILL.md +26 -77
  4. package/.claude/skills/epic-commands/epic-bundle.md +12 -6
  5. package/.claude/skills/epic-commands/execution-waves.md +1 -2
  6. package/.claude/skills/verify-ui/SKILL.md +1 -2
  7. package/.claude/skills/workflow-commands/SKILL.md +12 -14
  8. package/.claude/skills/workflow-commands/background-commands.md +8 -12
  9. package/.claude/skills/workflow-commands/backlogrun-child.md +13 -18
  10. package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +7 -25
  11. package/.claude/skills/workflow-commands/backlogrun-lanes.md +23 -28
  12. package/.claude/skills/workflow-commands/backlogrun-park.md +16 -31
  13. package/.claude/skills/workflow-commands/backlogrun-progress.md +12 -21
  14. package/.claude/skills/workflow-commands/backlogrun-recovery.md +12 -12
  15. package/.claude/skills/workflow-commands/backlogrun-steps.md +12 -20
  16. package/.claude/skills/workflow-commands/backlogrun.md +32 -51
  17. package/.claude/skills/workflow-commands/chain-rule.md +18 -11
  18. package/.claude/skills/workflow-commands/delegation.md +13 -8
  19. package/.claude/skills/workflow-commands/entry-sequence.md +10 -12
  20. package/.claude/skills/workflow-commands/followup.md +10 -35
  21. package/.claude/skills/workflow-commands/fullrun-steps.md +38 -49
  22. package/.claude/skills/workflow-commands/fullrun.md +6 -8
  23. package/.claude/skills/workflow-commands/halfrun.md +20 -32
  24. package/.claude/skills/workflow-commands/into-target.md +1 -2
  25. package/.claude/skills/workflow-commands/issue-comments.md +19 -15
  26. package/.claude/skills/workflow-commands/issue-scout.md +5 -4
  27. package/.claude/skills/workflow-commands/kickoff.md +24 -23
  28. package/.claude/skills/workflow-commands/latest-gate.md +9 -18
  29. package/.claude/skills/workflow-commands/needs-human-review.md +11 -19
  30. package/.claude/skills/workflow-commands/observation-filing.md +4 -50
  31. package/.claude/skills/workflow-commands/observation-ledger.md +5 -10
  32. package/.claude/skills/workflow-commands/pre-gate-cut.md +22 -44
  33. package/.claude/skills/workflow-commands/prerequisite.md +11 -18
  34. package/.claude/skills/workflow-commands/progress-watcher.md +3 -8
  35. package/.claude/skills/workflow-commands/prrun.md +6 -12
  36. package/.claude/skills/workflow-commands/retrospective.md +5 -5
  37. package/.claude/skills/workflow-commands/split-assessment.md +14 -4
  38. package/.claude/skills/workflow-commands/target-repository.md +1 -2
  39. package/.claude/skills/workflow-commands/working-tree-hold.md +11 -13
  40. package/.codex/hooks.json +6 -6
  41. package/.github/actions/setup-node/action.yml +10 -1
  42. package/.github/actions/setup-pnpm/action.yml +1 -1
  43. package/.github/dependabot.yml +16 -0
  44. package/.github/release.yml +0 -2
  45. package/.github/workflows/ci.yml +121 -11
  46. package/.github/workflows/publish.yml +10 -3
  47. package/.github/workflows/sonar-qube.yml +1 -0
  48. package/.prettierignore +2 -0
  49. package/.vscode/tasks.json +1 -2
  50. package/CLAUDE.md +4 -8
  51. package/README.md +4 -2
  52. package/SECURITY.md +1 -1
  53. package/cspell/index.yaml +7 -0
  54. package/dist/CLAUDE.md +4 -8
  55. package/dist/commands/document-read-cli.js +882 -0
  56. package/dist/commands/{document-section-cli.js → document-section-main.js} +137 -62
  57. package/dist/commands/read-set-cli.js +1867 -0
  58. package/dist/commands/run-prep-main.js +21653 -0
  59. package/dist/commands/run-step-cli.js +23880 -0
  60. package/dist/config-merge/index.js +5 -1
  61. package/dist/hooks/audit-provision.js +20 -35
  62. package/dist/hooks/{chunk-DGT54IH5.js → chunk-AZX4FGQ3.js} +63 -17
  63. package/dist/hooks/chunk-CWMBGKYW.js +6483 -0
  64. package/dist/hooks/chunk-O2YBIDSI.js +4306 -0
  65. package/dist/hooks/{chunk-AS74OU3D.js → chunk-PT5R6UJD.js} +4582 -2118
  66. package/dist/hooks/chunk-TUIFS5E7.js +72 -0
  67. package/dist/hooks/{chunk-723HKZO5.js → chunk-VWWCFGWK.js} +1 -1
  68. package/dist/hooks/{chunk-E7OIKX5Z.js → chunk-WR2KQAYZ.js} +1863 -382
  69. package/dist/hooks/{chunk-KC5AK2GF.js → chunk-XGBNSWEI.js} +248 -46
  70. package/dist/hooks/chunk-YCDOIR3I.js +3456 -0
  71. package/dist/hooks/codex-hook-adapter.js +10 -19
  72. package/dist/hooks/format-edited.js +5 -5
  73. package/dist/hooks/inputs.json +436 -257
  74. package/dist/hooks/pretool-guard.js +7 -22
  75. package/dist/hooks/session-lang.js +380 -42
  76. package/dist/hooks/stop-guard.js +8711 -782
  77. package/dist/josh.js +5263 -997
  78. package/dist/self-sync-guard/index.js +74 -10
  79. package/dist/version/index.js +115 -406
  80. package/eslint/base.js +1 -1
  81. package/lefthook/base.yml +8 -4
  82. package/package.json +17 -53
  83. package/pnpm-workspace.yaml +4 -2
  84. package/prompts/coding-standards.md +1 -1
  85. package/prompts/collaboration-workflow/file-edits.md +1 -9
  86. package/prompts/collaboration-workflow/gh-rest.md +1 -2
  87. package/prompts/collaboration-workflow/issue-citation.md +2 -4
  88. package/prompts/collaboration-workflow/issue-template.md +42 -17
  89. package/prompts/collaboration-workflow/lane-instructions.md +34 -0
  90. package/prompts/collaboration-workflow/measurement.md +37 -0
  91. package/prompts/collaboration-workflow/operating-rules.md +6 -12
  92. package/prompts/collaboration-workflow/output-bounds.md +4 -9
  93. package/prompts/collaboration-workflow/overview.md +1 -1
  94. package/prompts/collaboration-workflow/plan-comment.md +3 -42
  95. package/prompts/collaboration-workflow/principles.md +19 -8
  96. package/prompts/collaboration-workflow/report-format.md +37 -57
  97. package/prompts/collaboration-workflow/residency.md +12 -8
  98. package/prompts/collaboration-workflow/rule-delivery.md +3 -11
  99. package/prompts/collaboration-workflow/shell-body.md +8 -18
  100. package/prompts/collaboration-workflow/turn-batching.md +4 -6
  101. package/prompts/collaboration-workflow/upstream-interrupt.md +16 -6
  102. package/prompts/collaboration-workflow/wip-cap.md +7 -7
  103. package/prompts/collaboration-workflow.md +4 -7
  104. package/prompts/refactoring.md +1 -1
  105. package/prompts/review-rubric.md +1 -2
  106. package/prompts/review.md +45 -26
  107. package/prompts/testing-guide.md +10 -45
  108. package/scripts/agent/agent-argv.ts +20 -4
  109. package/scripts/agent/agent-event.ts +15 -15
  110. package/scripts/agent/agent-exit-record.ts +13 -1
  111. package/scripts/agent/agent-role-profile.ts +101 -45
  112. package/scripts/agent/agent-safe-text.ts +60 -0
  113. package/scripts/agent/api-auth.ts +41 -0
  114. package/scripts/agent/api-outage.ts +1 -1
  115. package/scripts/agent/claude-agent-argv.ts +14 -0
  116. package/scripts/agent/codex-agent-argv.ts +2 -0
  117. package/scripts/agent/lane-instructions.ts +144 -0
  118. package/scripts/auto-ok/auto-ok-cli.ts +14 -16
  119. package/scripts/auto-ok/auto-ok-judge-read.ts +12 -3
  120. package/scripts/auto-ok/auto-ok-judge-write.ts +46 -19
  121. package/scripts/auto-ok/auto-ok-judge.ts +13 -2
  122. package/scripts/auto-ok/auto-ok-main.ts +17 -0
  123. package/scripts/backlog/backlog-arrival.ts +14 -3
  124. package/scripts/backlog/backlog-budget-cli.ts +7 -33
  125. package/scripts/backlog/backlog-budget-main.ts +16 -0
  126. package/scripts/backlog/backlog-budget.ts +6 -7
  127. package/scripts/backlog/backlog-defect-priority.ts +4 -3
  128. package/scripts/backlog/backlog-drive-adopt.ts +67 -0
  129. package/scripts/backlog/backlog-drive-args.ts +4 -5
  130. package/scripts/backlog/backlog-drive-cli.ts +113 -28
  131. package/scripts/backlog/backlog-drive-hold.ts +162 -0
  132. package/scripts/backlog/backlog-drive-idle.ts +151 -0
  133. package/scripts/backlog/backlog-drive-judge.ts +25 -0
  134. package/scripts/backlog/backlog-drive-memory.ts +126 -0
  135. package/scripts/backlog/backlog-drive-named-offer.ts +5 -10
  136. package/scripts/backlog/backlog-drive-named.ts +54 -7
  137. package/scripts/backlog/backlog-drive-offer-argv.ts +3 -8
  138. package/scripts/backlog/backlog-drive-paused.ts +169 -0
  139. package/scripts/backlog/backlog-drive-restore.ts +39 -8
  140. package/scripts/backlog/backlog-drive-seats.ts +18 -8
  141. package/scripts/backlog/backlog-drive-token-handling.ts +38 -0
  142. package/scripts/backlog/backlog-drive.ts +79 -75
  143. package/scripts/backlog/backlog-next-main.ts +16 -0
  144. package/scripts/backlog/backlog-next-shared.ts +73 -0
  145. package/scripts/backlog/backlog-next.ts +48 -16
  146. package/scripts/backlog/backlog-occupied.ts +69 -0
  147. package/scripts/backlog/backlog-offer-cli.ts +6 -21
  148. package/scripts/backlog/backlog-offer-exclude.ts +15 -0
  149. package/scripts/backlog/backlog-offer-main.ts +12 -0
  150. package/scripts/backlog/backlog-offer.ts +36 -3
  151. package/scripts/backlog/backlog-overlap.ts +22 -4
  152. package/scripts/backlog/backlog-plan-read.ts +6 -2
  153. package/scripts/backlog/backlog-plan.ts +18 -4
  154. package/scripts/backlog/backlog-pool.ts +10 -10
  155. package/scripts/backlog/backlog-rank.ts +10 -2
  156. package/scripts/backlog/backlog-ready.ts +137 -18
  157. package/scripts/backlog/backlog-stalled-detect.ts +109 -36
  158. package/scripts/backlog/backlog-stalled.ts +52 -16
  159. package/scripts/backlog/backlog-wait-cause.ts +86 -0
  160. package/scripts/backlog/backlog-waves.ts +39 -13
  161. package/scripts/backlog/backlogrun-args.ts +19 -7
  162. package/scripts/backlog/backlogrun-cli.ts +19 -5
  163. package/scripts/backlog/backlogrun-launch.ts +6 -0
  164. package/scripts/backlog/backlogrun-restart.ts +97 -0
  165. package/scripts/backlog/backlogrun-stop.ts +79 -7
  166. package/scripts/behavior/behavior-cli.ts +2 -2
  167. package/scripts/behavior/behavior-rules.ts +47 -24
  168. package/scripts/build/build-bin.ts +2 -16
  169. package/scripts/build/build-claude-md.ts +0 -7
  170. package/scripts/build/build-commands.ts +0 -13
  171. package/scripts/build/build-hooks.ts +49 -48
  172. package/scripts/build/hook-bundle-stamp.ts +29 -11
  173. package/scripts/build/local-bin.ts +1 -1
  174. package/scripts/cases/cases-cli.ts +25 -13
  175. package/scripts/cases/cases-interaction-scan.ts +134 -0
  176. package/scripts/cases/cases-interaction.ts +183 -0
  177. package/scripts/cases/cases-logic.ts +39 -6
  178. package/scripts/ci/pr-classification-main.ts +18 -0
  179. package/scripts/ci/pr-classification.ts +10 -17
  180. package/scripts/clone/clone-scan.ts +1 -1
  181. package/scripts/cost-runtime/cost-blocks.ts +22 -37
  182. package/scripts/cost-runtime/cost-cli.ts +31 -14
  183. package/scripts/cost-runtime/cost-main.ts +12 -0
  184. package/scripts/cost-runtime/cost-transcript.ts +1 -0
  185. package/scripts/delegation/delegation-policy.ts +17 -4
  186. package/scripts/delegation/duplicate-read-guard.ts +2 -10
  187. package/scripts/delegation/investigation-guard.ts +15 -73
  188. package/scripts/delegation/investigation-reads.ts +3 -5
  189. package/scripts/dependabot/dependabot-cooldown.ts +194 -0
  190. package/scripts/discovery/repo-discovery.ts +24 -6
  191. package/scripts/doctor/doctor-consumer.ts +2 -5
  192. package/scripts/document/document-byte-budget.ts +9 -6
  193. package/scripts/document/document-scan.ts +1 -1
  194. package/scripts/document/document-section-cli.ts +17 -13
  195. package/scripts/document/document-section-main.ts +12 -0
  196. package/scripts/document/entry-read-budget.ts +2 -2
  197. package/scripts/document/read-set-cli.ts +4 -1
  198. package/scripts/epic/epic-audit-cli.ts +12 -6
  199. package/scripts/epic/epic-audit-orphans.ts +5 -8
  200. package/scripts/epic/epic-audit.ts +52 -1
  201. package/scripts/epic/epic-bundle-apply.ts +137 -0
  202. package/scripts/epic/epic-bundle-cli.ts +32 -121
  203. package/scripts/epic/epic-bundle-evidence.ts +49 -26
  204. package/scripts/epic/epic-bundle-format.ts +116 -0
  205. package/scripts/epic/epic-bundle-main.ts +17 -0
  206. package/scripts/epic/epic-bundle-referenced.ts +14 -3
  207. package/scripts/epic/epic-bundle.ts +17 -9
  208. package/scripts/epic/epic-busy.ts +5 -12
  209. package/scripts/epic/epic-classify.ts +24 -15
  210. package/scripts/epic/epic-cli-argv.ts +31 -0
  211. package/scripts/epic/epic-cli-decide.ts +42 -0
  212. package/scripts/epic/epic-cli.ts +6 -38
  213. package/scripts/epic/epic-close.ts +112 -55
  214. package/scripts/epic/epic-cross-repo.ts +4 -7
  215. package/scripts/epic/epic-decide.ts +119 -0
  216. package/scripts/epic/epic-decision.ts +9 -0
  217. package/scripts/epic/epic-fetch.ts +4 -0
  218. package/scripts/epic/epic-graph.ts +2 -0
  219. package/scripts/epic/epic-issue.ts +5 -1
  220. package/scripts/epic/epic-label-age.ts +1 -1
  221. package/scripts/epic/epic-lane-offer.ts +39 -4
  222. package/scripts/epic/epic-next-main.ts +24 -0
  223. package/scripts/epic/epic-next.ts +6 -24
  224. package/scripts/epic/epic-outside-blocker.ts +6 -2
  225. package/scripts/epic/epic-parse.ts +9 -3
  226. package/scripts/epic/epic-read.ts +1 -0
  227. package/scripts/epic/epic-reconcile.ts +39 -0
  228. package/scripts/epic/epic-run.ts +10 -1
  229. package/scripts/epic/epic-solo.ts +50 -14
  230. package/scripts/epic/epic.ts +41 -7
  231. package/scripts/exports/unused-members-cli.ts +2 -2
  232. package/scripts/followup/followup-checks-event.ts +8 -3
  233. package/scripts/followup/followup-coderabbit-wait.ts +82 -0
  234. package/scripts/followup/followup-review-gates.ts +81 -0
  235. package/scripts/followup/git-followup-stages.ts +13 -3
  236. package/scripts/followup/git-followup-workflow.ts +31 -60
  237. package/scripts/followup/git-pr-followup-wrapup.ts +9 -14
  238. package/scripts/followup/git-pr-followup.ts +36 -8
  239. package/scripts/fresh-machine/fresh-machine-cli.ts +1 -1
  240. package/scripts/fresh-machine/fresh-machine-run.ts +8 -8
  241. package/scripts/fresh-machine/specs/kit-test-backlogrun.json +1 -1
  242. package/scripts/gate/busy-average.ts +58 -0
  243. package/scripts/gate/check-cpu.ts +60 -0
  244. package/scripts/gate/check-inputs.ts +73 -0
  245. package/scripts/gate/check-reuse.ts +141 -0
  246. package/scripts/gate/command-memory.ts +192 -0
  247. package/scripts/gate/core-admission.ts +218 -28
  248. package/scripts/gate/core-budget-timing.ts +37 -0
  249. package/scripts/gate/core-budget.ts +150 -119
  250. package/scripts/gate/core-wait-record.ts +48 -0
  251. package/scripts/gate/core-wait.ts +162 -0
  252. package/scripts/gate/core-weights.ts +86 -0
  253. package/scripts/gate/free-cores.ts +72 -0
  254. package/scripts/gate/gate-ledger.ts +49 -7
  255. package/scripts/gate/gate-plan.ts +44 -15
  256. package/scripts/gate/gate-report.ts +29 -4
  257. package/scripts/gate/gate-run-steps.ts +195 -0
  258. package/scripts/gate/gate-skip.ts +12 -2
  259. package/scripts/gate/gate-steps.ts +12 -1
  260. package/scripts/gate/held-mark.ts +55 -0
  261. package/scripts/gate/input-fingerprint.ts +42 -0
  262. package/scripts/gate/machine-capacity.ts +124 -31
  263. package/scripts/gate/moved-paths.ts +67 -0
  264. package/scripts/gate/pre-commit-type-check.ts +14 -1
  265. package/scripts/gate/project-checks.ts +5 -12
  266. package/scripts/gate/scoped-green.ts +12 -8
  267. package/scripts/gate/since-green.ts +62 -0
  268. package/scripts/gate/toolchain-inputs.ts +115 -0
  269. package/scripts/gate/verification-gate.ts +65 -129
  270. package/scripts/gate/verification-inputs.ts +250 -0
  271. package/scripts/gh/gh-author-association.ts +96 -9
  272. package/scripts/gh/git-ai-review-scan.ts +4 -2
  273. package/scripts/gh/git-gh-api-path.ts +15 -0
  274. package/scripts/gh/git-gh-branch-rules.ts +73 -0
  275. package/scripts/gh/git-gh-conditional.ts +5 -2
  276. package/scripts/gh/git-gh-issue-read.ts +5 -1
  277. package/scripts/gh/git-gh-issue-rest.ts +1 -0
  278. package/scripts/gh/git-gh-issue-write.ts +77 -17
  279. package/scripts/gh/git-gh-issue.ts +7 -3
  280. package/scripts/gh/git-gh-poll-read.ts +89 -0
  281. package/scripts/gh/git-gh-pr-auto-merge.ts +8 -3
  282. package/scripts/gh/git-gh-pr-rest.ts +1 -1
  283. package/scripts/gh/git-gh-pr-snapshot.ts +33 -20
  284. package/scripts/gh/git-gh-pr.ts +27 -15
  285. package/scripts/gh/git-pr-checks-eval.ts +39 -7
  286. package/scripts/gh/git-pr-checks-parse.ts +39 -9
  287. package/scripts/gh/git-pr-merge-checked.ts +80 -0
  288. package/scripts/gh/git-pr.ts +13 -1
  289. package/scripts/git/base-tree.ts +19 -2
  290. package/scripts/git/changed-file-scope.ts +6 -4
  291. package/scripts/git/changed-paths.ts +18 -1
  292. package/scripts/git/git-diff-reads.ts +27 -2
  293. package/scripts/git/git-grep-hits.ts +85 -0
  294. package/scripts/git/git-location-environment.ts +1 -1
  295. package/scripts/git/git-merge-conflicts.ts +83 -0
  296. package/scripts/git/git-preflight.ts +37 -12
  297. package/scripts/git/git-push-transport.ts +1 -2
  298. package/scripts/git/git-schemas.ts +17 -7
  299. package/scripts/git/git-spawn.ts +1 -2
  300. package/scripts/git/git-status.ts +4 -4
  301. package/scripts/git/main-merge-main.ts +12 -0
  302. package/scripts/git/main-merge-regenerate.ts +78 -0
  303. package/scripts/git/main-merge.ts +39 -14
  304. package/scripts/git/main-sync-main.ts +12 -0
  305. package/scripts/git/main-sync.ts +0 -9
  306. package/scripts/git/stash/git-stash.ts +27 -4
  307. package/scripts/git/stash/{stash-pop-args.ts → stash-args.ts} +13 -10
  308. package/scripts/git/stash/stash-pop-cli.ts +6 -12
  309. package/scripts/git/stash/stash-pop-main.ts +12 -0
  310. package/scripts/git/stash/stash-push-cli.ts +76 -0
  311. package/scripts/git/stash/stash-push-main.ts +12 -0
  312. package/scripts/hooks/batch-guard.ts +5 -16
  313. package/scripts/hooks/check-commit-message-main.ts +8 -0
  314. package/scripts/hooks/check-commit-message.ts +4 -7
  315. package/scripts/hooks/format-edited-file.ts +8 -24
  316. package/scripts/hooks/pre-commit-lint.ts +118 -0
  317. package/scripts/hooks/pre-push-unit.ts +4 -2
  318. package/scripts/hooks/pretool-guard-cli.ts +1 -8
  319. package/scripts/hooks/pretool-guard.ts +57 -69
  320. package/scripts/hooks/reserved-run.ts +67 -8
  321. package/scripts/hooks/run-hook.sh +18 -11
  322. package/scripts/hooks/shell-rules-notice.ts +37 -0
  323. package/scripts/hooks/stop-actions.ts +185 -0
  324. package/scripts/hooks/stop-guard.ts +72 -27
  325. package/scripts/init/hook-command-rewrite.ts +19 -5
  326. package/scripts/init/hook-launch.ts +15 -12
  327. package/scripts/init/init-actions.ts +0 -6
  328. package/scripts/init/init-ai-copy.ts +10 -36
  329. package/scripts/init/init-bootstrap.ts +9 -8
  330. package/scripts/init/init-dry-run-report.ts +1 -1
  331. package/scripts/init/init-dry-run.ts +1 -1
  332. package/scripts/init/init-file-action.ts +7 -9
  333. package/scripts/init/init-logic-json-merge.ts +2 -2
  334. package/scripts/init/init-logic-migrate.ts +9 -82
  335. package/scripts/init/init-logic.ts +3 -2
  336. package/scripts/init/init-main.ts +12 -0
  337. package/scripts/init/init.ts +5 -12
  338. package/scripts/init/kit-development-versions.ts +3 -7
  339. package/scripts/init/kit-written-paths.ts +2 -2
  340. package/scripts/init/project-profile.ts +5 -4
  341. package/scripts/init/tsconfig-preset-migration.ts +2 -1
  342. package/scripts/init/vscode-tasks.ts +1 -1
  343. package/scripts/issue/defect-origin-cli.ts +106 -0
  344. package/scripts/issue/defect-origin-line.ts +60 -0
  345. package/scripts/issue/defect-origin-main.ts +11 -0
  346. package/scripts/issue/defect-origin.ts +114 -0
  347. package/scripts/issue/defect-rate-cli.ts +34 -78
  348. package/scripts/issue/defect-rate.ts +0 -16
  349. package/scripts/issue/defect-report-cli.ts +128 -0
  350. package/scripts/issue/defect-report-format.ts +56 -0
  351. package/scripts/issue/defect-report-main.ts +11 -0
  352. package/scripts/issue/defect-report.ts +160 -0
  353. package/scripts/issue/expected-effect-lint.ts +60 -0
  354. package/scripts/issue/issue-already-done-cli.ts +62 -0
  355. package/scripts/issue/issue-body-or-comment.ts +40 -0
  356. package/scripts/issue/issue-cite-cli.ts +33 -22
  357. package/scripts/issue/issue-cite-main.ts +12 -0
  358. package/scripts/issue/issue-classification.ts +13 -8
  359. package/scripts/issue/issue-comment-cli.ts +10 -24
  360. package/scripts/issue/issue-comment-main.ts +12 -0
  361. package/scripts/issue/issue-evidence-exit.ts +100 -0
  362. package/scripts/issue/issue-file-cli.ts +29 -7
  363. package/scripts/issue/issue-file.ts +19 -19
  364. package/scripts/issue/issue-fold-cli.ts +2 -11
  365. package/scripts/issue/issue-fold-main.ts +12 -0
  366. package/scripts/issue/issue-labels.ts +81 -90
  367. package/scripts/issue/issue-lint-cli.ts +7 -13
  368. package/scripts/issue/issue-lint-main.ts +12 -0
  369. package/scripts/issue/issue-measured-cli.ts +56 -0
  370. package/scripts/issue/issue-merged.ts +19 -2
  371. package/scripts/issue/issue-not-before-label.ts +135 -0
  372. package/scripts/issue/issue-not-before.ts +111 -0
  373. package/scripts/issue/issue-number-shape.ts +15 -1
  374. package/scripts/issue/issue-park.ts +28 -0
  375. package/scripts/issue/issue-plan-cli.ts +151 -0
  376. package/scripts/issue/issue-priority.ts +151 -0
  377. package/scripts/issue/issue-rank.ts +7 -1
  378. package/scripts/issue/issue-read-cli.ts +3 -10
  379. package/scripts/issue/issue-read-main.ts +12 -0
  380. package/scripts/issue/issue-read.ts +29 -5
  381. package/scripts/issue/issue-release-cli.ts +0 -10
  382. package/scripts/issue/issue-release-main.ts +13 -0
  383. package/scripts/issue/issue-release.ts +7 -12
  384. package/scripts/issue/issue-sample-gate.ts +192 -0
  385. package/scripts/issue/issue-sample-source.ts +76 -0
  386. package/scripts/issue/issue-scout-cli.ts +19 -25
  387. package/scripts/issue/issue-scout-main.ts +14 -0
  388. package/scripts/issue/issue-state-cli.ts +0 -10
  389. package/scripts/issue/issue-state-main.ts +12 -0
  390. package/scripts/issue/issue-watch-diff.ts +56 -15
  391. package/scripts/issue/issue-watch.ts +2 -1
  392. package/scripts/issue/issue-wip.ts +2 -7
  393. package/scripts/issue/markdown-section.ts +19 -5
  394. package/scripts/issue/measure-rerun-cli.ts +13 -8
  395. package/scripts/issue/plan-consumers-cli.ts +39 -0
  396. package/scripts/issue/plan-consumers-main.ts +11 -0
  397. package/scripts/issue/plan-consumers-section.ts +55 -0
  398. package/scripts/issue/plan-consumers.ts +127 -0
  399. package/scripts/josh/agent-session-environment.ts +1 -1
  400. package/scripts/josh/command-usage.ts +82 -0
  401. package/scripts/josh/file-map-stamp.ts +49 -16
  402. package/scripts/josh/hook-decision.ts +32 -20
  403. package/scripts/josh/josh-command-map.ts +6 -1
  404. package/scripts/josh/josh-command-types.ts +65 -13
  405. package/scripts/josh/josh-commands-agent-hooks.ts +83 -0
  406. package/scripts/josh/josh-commands-ai.ts +169 -157
  407. package/scripts/josh/josh-commands-backlog.ts +82 -16
  408. package/scripts/josh/josh-commands-clone.ts +1 -0
  409. package/scripts/josh/josh-commands-development.ts +111 -71
  410. package/scripts/josh/josh-commands-document.ts +43 -1
  411. package/scripts/josh/josh-commands-epic.ts +171 -0
  412. package/scripts/josh/josh-commands-hooks.ts +31 -2
  413. package/scripts/josh/josh-commands-issue-write.ts +181 -0
  414. package/scripts/josh/josh-commands-issue.ts +124 -24
  415. package/scripts/josh/josh-commands-lane.ts +112 -2
  416. package/scripts/josh/josh-commands-lint.ts +19 -8
  417. package/scripts/josh/josh-commands-maintenance.ts +112 -4
  418. package/scripts/josh/josh-commands-pause.ts +29 -0
  419. package/scripts/josh/josh-commands-progress.ts +87 -0
  420. package/scripts/josh/josh-commands-project.ts +138 -9
  421. package/scripts/josh/josh-commands-review.ts +124 -0
  422. package/scripts/josh/josh-commands-run.ts +211 -23
  423. package/scripts/josh/josh-commands-ship.ts +169 -0
  424. package/scripts/josh/josh-commands-split.ts +9 -0
  425. package/scripts/josh/josh-commands-versioning.ts +49 -2
  426. package/scripts/josh/josh-commands-workflow.ts +149 -6
  427. package/scripts/josh/josh-logic.ts +11 -27
  428. package/scripts/josh/josh.ts +14 -5
  429. package/scripts/josh/package-directory.ts +18 -0
  430. package/scripts/josh/process-identity.ts +13 -4
  431. package/scripts/josh/session-language-cli.ts +4 -8
  432. package/scripts/josh/session-language-main.ts +13 -0
  433. package/scripts/josh/session-language.ts +6 -1
  434. package/scripts/josh/shared-cache.ts +90 -0
  435. package/scripts/josh/stamp-file.ts +9 -15
  436. package/scripts/lane/lane-await.ts +51 -12
  437. package/scripts/lane/lane-cache.ts +5 -30
  438. package/scripts/lane/lane-capacity.ts +19 -22
  439. package/scripts/lane/lane-check-stats.ts +97 -0
  440. package/scripts/lane/lane-child-invocation.ts +43 -4
  441. package/scripts/lane/lane-cli.ts +15 -5
  442. package/scripts/lane/lane-close.ts +86 -18
  443. package/scripts/lane/lane-core-wait-stats.ts +66 -0
  444. package/scripts/lane/lane-dispatch.ts +27 -6
  445. package/scripts/lane/lane-gap-stats.ts +156 -0
  446. package/scripts/lane/lane-guard-policy.ts +2 -2
  447. package/scripts/lane/lane-handoff.ts +76 -1
  448. package/scripts/lane/lane-held-stats.ts +129 -0
  449. package/scripts/lane/lane-install.ts +16 -15
  450. package/scripts/lane/lane-launch-cli.ts +0 -9
  451. package/scripts/lane/lane-launch-main.ts +12 -0
  452. package/scripts/lane/lane-ledger-schema.ts +266 -0
  453. package/scripts/lane/lane-ledger.ts +108 -97
  454. package/scripts/lane/lane-limit-cli.ts +19 -9
  455. package/scripts/lane/lane-measure-cli.ts +58 -10
  456. package/scripts/lane/lane-open.ts +9 -1
  457. package/scripts/lane/lane-parked.ts +3 -3
  458. package/scripts/lane/lane-pause-cli.ts +130 -0
  459. package/scripts/lane/lane-pause.ts +158 -0
  460. package/scripts/lane/lane-preserve.ts +29 -1
  461. package/scripts/lane/lane-process-table.ts +166 -0
  462. package/scripts/lane/lane-reap-settle.ts +124 -0
  463. package/scripts/lane/lane-reap.ts +50 -15
  464. package/scripts/lane/lane-registry.ts +33 -10
  465. package/scripts/lane/lane-residents.ts +162 -0
  466. package/scripts/lane/lane-restart.ts +26 -27
  467. package/scripts/lane/lane-round-two-stats.ts +49 -0
  468. package/scripts/lane/lane-sampler.ts +4 -0
  469. package/scripts/lane/lane-session-action.ts +160 -0
  470. package/scripts/lane/lane-session-broker.ts +134 -134
  471. package/scripts/lane/lane-snapshot-trace.ts +84 -0
  472. package/scripts/lane/lane-spans.ts +51 -0
  473. package/scripts/lane/lane-spent.ts +6 -3
  474. package/scripts/lane/lane-stage-stats.ts +7 -2
  475. package/scripts/lane/lane-state.ts +302 -0
  476. package/scripts/lane/lane-stats.ts +58 -4
  477. package/scripts/lane/lane-stop-stats.ts +113 -37
  478. package/scripts/lane/lane-test-related-stats.ts +127 -0
  479. package/scripts/lane/lane-transcript-calls.ts +145 -0
  480. package/scripts/lane/lane-transcript-stats.ts +168 -0
  481. package/scripts/lane/lane-vacant.ts +13 -3
  482. package/scripts/lane/lane-withdraw-cli.ts +72 -0
  483. package/scripts/lane/lane-withdraw.ts +183 -0
  484. package/scripts/lane/process-directories.ts +70 -0
  485. package/scripts/lane/process-lane-marks.ts +94 -0
  486. package/scripts/lib/atomic-write.ts +62 -0
  487. package/scripts/lib/buffered-process.ts +12 -5
  488. package/scripts/lib/cli-flags.ts +53 -0
  489. package/scripts/lib/figure-format.ts +63 -0
  490. package/scripts/lib/json-value.ts +9 -1
  491. package/scripts/lib/package-manifest.ts +35 -0
  492. package/scripts/lib/read-file.ts +3 -1
  493. package/scripts/lib/stamped-memo.ts +63 -0
  494. package/scripts/lib/stdout-on-stderr.ts +24 -0
  495. package/scripts/lib/timeouts.ts +9 -0
  496. package/scripts/lib/transcript-record.ts +91 -0
  497. package/scripts/lines/effective-limit.ts +1 -1
  498. package/scripts/lint/eslint-cache-dependencies.ts +145 -0
  499. package/scripts/lint/eslint-daemon.ts +265 -0
  500. package/scripts/lint/format.ts +14 -5
  501. package/scripts/lint/import-graph.ts +279 -0
  502. package/scripts/lint/lint-gate-scope.ts +102 -0
  503. package/scripts/lint/lint-parallel-main.ts +19 -0
  504. package/scripts/lint/lint-parallel.ts +72 -33
  505. package/scripts/lint/lint-related-scope.ts +33 -24
  506. package/scripts/lint/lint-related.ts +38 -6
  507. package/scripts/notify/confirmation-options.ts +1 -2
  508. package/scripts/notify/telegram-notify.ts +20 -20
  509. package/scripts/notify/telegram-test-logic.ts +0 -1
  510. package/scripts/notify/telegram-test-main.ts +8 -0
  511. package/scripts/notify/telegram-test.ts +12 -11
  512. package/scripts/observations/observation-ledger.ts +13 -0
  513. package/scripts/observations/observations-flush-landing.ts +5 -3
  514. package/scripts/observations/observations-flush.ts +6 -1
  515. package/scripts/overrides/overrides-check.ts +2 -5
  516. package/scripts/overrides/overrides-files.ts +2 -1
  517. package/scripts/overrides/overrides-logic.ts +3 -6
  518. package/scripts/package/verify-optional-eslint-install.ts +8 -6
  519. package/scripts/propagate/propagate-publish.ts +2 -7
  520. package/scripts/propagate/propagate-targets.ts +4 -12
  521. package/scripts/refactor/import-graph.ts +9 -7
  522. package/scripts/release/github-release-runs.ts +17 -6
  523. package/scripts/release/release-approval-prune.ts +18 -0
  524. package/scripts/release/release-history.ts +1 -3
  525. package/scripts/release/release-progress.ts +42 -22
  526. package/scripts/release/release-publish-run.ts +39 -0
  527. package/scripts/release/release-publish.ts +6 -6
  528. package/scripts/release/release-scope-cli.ts +0 -10
  529. package/scripts/release/release-scope-main.ts +12 -0
  530. package/scripts/repo/repo-setting.ts +3 -6
  531. package/scripts/repo/required-checks-logic.ts +6 -15
  532. package/scripts/report/report-format-reference.ts +4 -0
  533. package/scripts/report/report-labels.ts +155 -0
  534. package/scripts/report/report-lint-cli.ts +3 -0
  535. package/scripts/report/report-lint.ts +85 -110
  536. package/scripts/report/report-template-cli.ts +59 -0
  537. package/scripts/report/report-template.ts +112 -0
  538. package/scripts/review/acceptance-map-check.ts +61 -0
  539. package/scripts/review/acceptance-map.ts +206 -0
  540. package/scripts/review/removed-tests-check.ts +86 -0
  541. package/scripts/review/removed-tests.ts +149 -0
  542. package/scripts/review/review-brief-cli.ts +82 -16
  543. package/scripts/review/review-brief-main.ts +12 -0
  544. package/scripts/review/review-brief.ts +31 -3
  545. package/scripts/review/review-code-tree.ts +10 -6
  546. package/scripts/review/review-comment-round.ts +26 -8
  547. package/scripts/review/review-finding-ledger.ts +30 -15
  548. package/scripts/review/review-interaction.ts +94 -0
  549. package/scripts/review/review-readers-scan.ts +163 -0
  550. package/scripts/review/review-record-cli.ts +69 -30
  551. package/scripts/review/review-record-main.ts +12 -0
  552. package/scripts/review/review-round-one-blobs.ts +221 -0
  553. package/scripts/review/review-round2-cli.ts +49 -12
  554. package/scripts/review/review-round2.ts +80 -12
  555. package/scripts/review/review-stamps.ts +19 -1
  556. package/scripts/review/review-stop-log.ts +96 -0
  557. package/scripts/review/review-stops-cli.ts +85 -0
  558. package/scripts/review/review-tree.ts +6 -17
  559. package/scripts/review/review-untouched-readers.ts +146 -0
  560. package/scripts/review/test-titles.ts +118 -0
  561. package/scripts/rules/agent-model.ts +67 -0
  562. package/scripts/rules/bash-triggers.ts +46 -3
  563. package/scripts/rules/decision-oracle-batch.ts +9 -1
  564. package/scripts/rules/decision-oracle.ts +2 -2
  565. package/scripts/rules/delivered-rules.ts +90 -3
  566. package/scripts/rules/destructive-command.ts +8 -1
  567. package/scripts/rules/direct-filing.ts +10 -2
  568. package/scripts/rules/direct-issue-comment.ts +117 -0
  569. package/scripts/rules/direct-pr-create.ts +69 -3
  570. package/scripts/rules/early-heartbeat.ts +2 -1
  571. package/scripts/rules/file-body.ts +7 -0
  572. package/scripts/rules/filing-cap.ts +8 -0
  573. package/scripts/rules/firing-point.ts +6 -5
  574. package/scripts/rules/git-argv.ts +72 -14
  575. package/scripts/rules/git-force.ts +12 -2
  576. package/scripts/rules/guard-remedy.ts +121 -0
  577. package/scripts/rules/implementation-cut-verdict.ts +1 -1
  578. package/scripts/rules/implementation-cut.ts +11 -3
  579. package/scripts/rules/index-guard.ts +8 -1
  580. package/scripts/rules/issue-comments.ts +76 -7
  581. package/scripts/rules/josh-git-bare.ts +7 -0
  582. package/scripts/rules/lane-background.ts +67 -25
  583. package/scripts/rules/lane-carry-conflict.ts +6 -0
  584. package/scripts/rules/lane-direct-tool.ts +74 -0
  585. package/scripts/rules/lane-interactive-ask.ts +9 -2
  586. package/scripts/rules/lane-park.ts +45 -23
  587. package/scripts/rules/lane-split-park.ts +10 -2
  588. package/scripts/rules/lane-switch-main.ts +7 -0
  589. package/scripts/rules/last-prompt.ts +50 -5
  590. package/scripts/rules/oracle-consulted.ts +10 -0
  591. package/scripts/rules/oracle-firing.ts +1 -0
  592. package/scripts/rules/oracle-list-cli.ts +7 -0
  593. package/scripts/rules/permission-guards.ts +3 -0
  594. package/scripts/rules/piped-verification.ts +4 -2
  595. package/scripts/rules/poll-loop.ts +7 -0
  596. package/scripts/rules/pr-merge.ts +123 -0
  597. package/scripts/rules/protected-files.ts +32 -5
  598. package/scripts/rules/raw-field-body.ts +6 -0
  599. package/scripts/rules/rule-body-guard.ts +8 -0
  600. package/scripts/rules/rule-list.ts +12 -28
  601. package/scripts/rules/rule-rewrite.ts +114 -0
  602. package/scripts/rules/rule-value-cache.ts +4 -9
  603. package/scripts/rules/rule-value-cli.ts +51 -32
  604. package/scripts/rules/rule-value.ts +8 -2
  605. package/scripts/rules/shell-segments.ts +50 -0
  606. package/scripts/rules/stop-decision.ts +77 -0
  607. package/scripts/rules/stop-rule-rows.ts +64 -0
  608. package/scripts/rules/stop-rules.ts +150 -51
  609. package/scripts/rules/tail-commands.ts +15 -1
  610. package/scripts/rules/test-declared-commit.ts +11 -1
  611. package/scripts/rules/third-party-write.ts +7 -0
  612. package/scripts/rules/timed-rerun.ts +69 -0
  613. package/scripts/rules/worktree-guard.ts +13 -3
  614. package/scripts/run/board/run-board-app-name.ts +23 -0
  615. package/scripts/run/board/run-board-cli.ts +65 -30
  616. package/scripts/run/board/run-board-closed.ts +8 -2
  617. package/scripts/run/board/run-board-earlier.ts +94 -0
  618. package/scripts/run/board/run-board-ending-reason.ts +67 -0
  619. package/scripts/run/board/run-board-estimate-schedule.ts +103 -0
  620. package/scripts/run/board/run-board-estimate.ts +98 -0
  621. package/scripts/run/board/run-board-fit.ts +153 -36
  622. package/scripts/run/board/run-board-fold.ts +123 -0
  623. package/scripts/run/board/run-board-fresh.ts +2 -2
  624. package/scripts/run/board/run-board-gather-live.ts +29 -0
  625. package/scripts/run/board/run-board-gather-thread.ts +189 -0
  626. package/scripts/run/board/run-board-gather-worker.ts +29 -0
  627. package/scripts/run/board/run-board-gather.ts +187 -0
  628. package/scripts/run/board/run-board-github.ts +119 -31
  629. package/scripts/run/board/run-board-header.ts +86 -21
  630. package/scripts/run/board/run-board-keys.ts +58 -0
  631. package/scripts/run/board/run-board-kind.ts +20 -6
  632. package/scripts/run/board/run-board-labels.ts +118 -71
  633. package/scripts/run/board/run-board-lane-state.ts +109 -0
  634. package/scripts/run/board/run-board-lane-time.ts +122 -0
  635. package/scripts/run/board/run-board-layout.ts +240 -61
  636. package/scripts/run/board/run-board-length.ts +52 -0
  637. package/scripts/run/board/run-board-machine.ts +8 -4
  638. package/scripts/run/board/run-board-main.ts +12 -0
  639. package/scripts/run/board/run-board-notes.ts +52 -31
  640. package/scripts/run/board/run-board-now.ts +1 -1
  641. package/scripts/run/board/run-board-operation.ts +15 -33
  642. package/scripts/run/board/run-board-phase.ts +1 -1
  643. package/scripts/run/board/run-board-plan-shared.ts +115 -0
  644. package/scripts/run/board/run-board-plan.ts +55 -3
  645. package/scripts/run/board/run-board-planning.ts +45 -0
  646. package/scripts/run/board/run-board-priority.ts +44 -0
  647. package/scripts/run/board/run-board-process-groups.ts +195 -0
  648. package/scripts/run/board/run-board-read.ts +153 -13
  649. package/scripts/run/board/run-board-reason.ts +238 -45
  650. package/scripts/run/board/run-board-released.ts +35 -0
  651. package/scripts/run/board/run-board-render-checks.ts +39 -5
  652. package/scripts/run/board/run-board-render-condition.ts +96 -0
  653. package/scripts/run/board/run-board-render-drawn.ts +67 -0
  654. package/scripts/run/board/run-board-render-foot.ts +59 -0
  655. package/scripts/run/board/run-board-render-icon.ts +35 -0
  656. package/scripts/run/board/run-board-render-lanes.ts +145 -0
  657. package/scripts/run/board/run-board-render-lead.ts +80 -0
  658. package/scripts/run/board/run-board-render-legend.ts +117 -47
  659. package/scripts/run/board/run-board-render-notes.ts +156 -29
  660. package/scripts/run/board/run-board-render-processes.ts +196 -0
  661. package/scripts/run/board/run-board-render-section.ts +119 -0
  662. package/scripts/run/board/run-board-render-slot.ts +3 -36
  663. package/scripts/run/board/run-board-render-tail.ts +115 -48
  664. package/scripts/run/board/run-board-render-time.ts +56 -0
  665. package/scripts/run/board/run-board-render-title.ts +117 -24
  666. package/scripts/run/board/run-board-render-waits.ts +125 -0
  667. package/scripts/run/board/run-board-render.ts +206 -259
  668. package/scripts/run/board/run-board-roots.ts +54 -0
  669. package/scripts/run/board/run-board-row-yield.ts +10 -4
  670. package/scripts/run/board/run-board-setup.ts +1 -12
  671. package/scripts/run/board/run-board-snapshot.ts +111 -0
  672. package/scripts/run/board/run-board-spin.ts +2 -2
  673. package/scripts/run/board/run-board-state.ts +23 -29
  674. package/scripts/run/board/run-board-status.ts +206 -79
  675. package/scripts/run/board/run-board-thanks-read.ts +2 -2
  676. package/scripts/run/board/run-board-tick.ts +123 -104
  677. package/scripts/run/board/run-board-usage-board.ts +78 -0
  678. package/scripts/run/board/run-board-usage-lanes.ts +113 -0
  679. package/scripts/run/board/run-board-usage-listing.ts +93 -0
  680. package/scripts/run/board/run-board-usage-read.ts +120 -150
  681. package/scripts/run/board/run-board-usage-rusage.ts +19 -7
  682. package/scripts/run/board/run-board-usage-text.ts +139 -51
  683. package/scripts/run/board/run-board-usage-top.ts +102 -0
  684. package/scripts/run/board/run-board-usage.ts +89 -72
  685. package/scripts/run/board/run-board-usual.ts +20 -9
  686. package/scripts/run/carry/run-carry-args.ts +4 -7
  687. package/scripts/run/carry/run-carry-conversation.ts +1 -1
  688. package/scripts/run/carry/run-carry.ts +9 -4
  689. package/scripts/run/cut/run-cut-cli.ts +3 -2
  690. package/scripts/run/cut/run-cut-handoff.ts +2 -2
  691. package/scripts/run/cut/run-cut-report.ts +16 -0
  692. package/scripts/run/detached-launch.ts +23 -4
  693. package/scripts/run/entry/run-entry-cli.ts +8 -1
  694. package/scripts/run/event/run-event-cli.ts +1 -5
  695. package/scripts/run/event/run-event-filed.ts +12 -6
  696. package/scripts/run/event/run-event-follow.ts +2 -3
  697. package/scripts/run/event/run-event-render.ts +7 -10
  698. package/scripts/run/event/run-event-scope.ts +20 -2
  699. package/scripts/run/event/run-event-stream-emit.ts +78 -11
  700. package/scripts/run/event/run-event-stream.ts +37 -7
  701. package/scripts/run/hold/run-hold-adopt.ts +65 -0
  702. package/scripts/run/hold/run-hold-cli.ts +93 -22
  703. package/scripts/run/hold/run-hold-main.ts +12 -0
  704. package/scripts/run/hold/run-hold-member.ts +37 -0
  705. package/scripts/run/hold/run-hold-session.ts +46 -0
  706. package/scripts/run/hold/run-hold.ts +7 -1
  707. package/scripts/run/hold/run-stop-notify.ts +183 -0
  708. package/scripts/run/launch-priority.ts +32 -0
  709. package/scripts/run/merge/run-merge-auth.ts +31 -0
  710. package/scripts/run/merge/run-merge-cli.ts +72 -107
  711. package/scripts/run/merge/run-merge-close.ts +74 -0
  712. package/scripts/run/merge/run-merge-collect.ts +6 -13
  713. package/scripts/run/merge/run-merge-driver.ts +71 -0
  714. package/scripts/run/merge/run-merge-main.ts +12 -0
  715. package/scripts/run/merge/run-merge-outcome.ts +23 -0
  716. package/scripts/run/merge/run-merge-restart.ts +39 -0
  717. package/scripts/run/merge/run-merge-ship.ts +20 -4
  718. package/scripts/run/merge/run-merge-signals.ts +123 -0
  719. package/scripts/run/merge/run-merge-steps.ts +128 -83
  720. package/scripts/run/merge/run-merge.ts +53 -40
  721. package/scripts/run/park/run-park-cli.ts +91 -0
  722. package/scripts/run/park/run-park.ts +88 -0
  723. package/scripts/run/park/run-stalled.ts +68 -0
  724. package/scripts/run/pause/run-pause-cli.ts +73 -0
  725. package/scripts/run/pause/run-pause.ts +251 -0
  726. package/scripts/run/progress/run-progress-cli.ts +4 -12
  727. package/scripts/run/progress/run-progress-clock.ts +1 -1
  728. package/scripts/run/progress/run-progress-config.ts +6 -14
  729. package/scripts/run/progress/run-progress-main.ts +12 -0
  730. package/scripts/run/progress/run-progress.ts +1 -4
  731. package/scripts/run/review/run-review.ts +2 -1
  732. package/scripts/run/run-ending.ts +1 -0
  733. package/scripts/run/run-invocation.ts +5 -6
  734. package/scripts/run/run-liveness-cli.ts +6 -8
  735. package/scripts/run/run-liveness.ts +61 -30
  736. package/scripts/run/run-next.ts +1 -1
  737. package/scripts/run/run-parent-cut-hook.ts +2 -2
  738. package/scripts/run/run-poll-hook.ts +157 -0
  739. package/scripts/run/run-preflight.ts +18 -3
  740. package/scripts/run/run-prep-cli.ts +1 -10
  741. package/scripts/run/run-prep-locate.ts +7 -50
  742. package/scripts/run/run-prep-main.ts +12 -0
  743. package/scripts/run/run-prep.ts +6 -0
  744. package/scripts/run/run-report-cli.ts +101 -13
  745. package/scripts/run/run-report-handoff.ts +114 -0
  746. package/scripts/run/run-step-cli.ts +22 -15
  747. package/scripts/run/run-step-section.ts +85 -0
  748. package/scripts/run/run-step.ts +1 -1
  749. package/scripts/run/run-stranded-detect.ts +13 -0
  750. package/scripts/run/run-watcher-guard-cli.ts +1 -1
  751. package/scripts/run/run-watcher-guard.ts +1 -1
  752. package/scripts/run/ship/run-ship-args.ts +121 -0
  753. package/scripts/run/ship/run-ship-body-draft.ts +110 -0
  754. package/scripts/run/ship/run-ship-cli.ts +67 -151
  755. package/scripts/run/ship/run-ship-detach.ts +27 -7
  756. package/scripts/run/ship/run-ship-infra-retry.ts +59 -0
  757. package/scripts/run/ship/run-ship-next.ts +27 -3
  758. package/scripts/run/ship/run-ship-overlap.ts +232 -0
  759. package/scripts/run/ship/run-ship-place.ts +96 -0
  760. package/scripts/run/ship/run-ship-pre-detach-timed.ts +43 -0
  761. package/scripts/run/ship/run-ship-pre-detach.ts +102 -27
  762. package/scripts/run/ship/run-ship-preflight.ts +161 -30
  763. package/scripts/run/ship/run-ship-probe.ts +11 -3
  764. package/scripts/run/ship/run-ship-relaunch-cap.ts +70 -0
  765. package/scripts/run/ship/run-ship-removed-rows.ts +61 -0
  766. package/scripts/run/ship/run-ship-return.ts +123 -15
  767. package/scripts/run/ship/run-ship-review-steps.ts +105 -149
  768. package/scripts/run/ship/run-ship-review.ts +73 -6
  769. package/scripts/run/ship/run-ship-reviewer.ts +207 -0
  770. package/scripts/run/ship/run-ship-stage.ts +55 -6
  771. package/scripts/run/ship/run-ship-steps.ts +46 -15
  772. package/scripts/run/ship/run-ship-stop-cause.ts +135 -0
  773. package/scripts/run/ship/run-ship-stop-context.ts +206 -0
  774. package/scripts/run/ship/run-ship-stop-text.ts +11 -6
  775. package/scripts/run/ship/run-ship-sync.ts +57 -12
  776. package/scripts/run/ship/run-ship.ts +30 -2
  777. package/scripts/run/tidy/run-tidy-cli.ts +0 -4
  778. package/scripts/run/tidy/run-tidy-lanes.ts +3 -0
  779. package/scripts/run/tidy/run-tidy-main.ts +8 -0
  780. package/scripts/run/wake/run-wake-cli.ts +119 -100
  781. package/scripts/run/wake/run-wake-code.ts +83 -0
  782. package/scripts/run/wake/run-wake-driver.ts +19 -8
  783. package/scripts/run/wake/run-wake-loop.ts +34 -3
  784. package/scripts/run/wake/run-wake-main.ts +13 -0
  785. package/scripts/run/wake/run-wake-ports.ts +90 -0
  786. package/scripts/run/wake/run-wake-takeover.ts +66 -0
  787. package/scripts/run/wake/run-wake.ts +2 -1
  788. package/scripts/safe-chain/pack-hook.ts +2 -2
  789. package/scripts/safe-chain/preinstall-command.ts +2 -1
  790. package/scripts/safe-chain/project-config.ts +3 -9
  791. package/scripts/security/security-audit-main.ts +8 -0
  792. package/scripts/security/security-audit-provision-logic.ts +0 -11
  793. package/scripts/security/security-audit-provision-main.ts +12 -0
  794. package/scripts/security/security-audit-provision.ts +11 -26
  795. package/scripts/security/security-audit.ts +6 -7
  796. package/scripts/self-sync-guard/self-sync-guard-logic.ts +6 -13
  797. package/scripts/split/split-assess-cli.ts +2 -2
  798. package/scripts/split/split-assess.ts +15 -0
  799. package/scripts/split/split-measure.ts +65 -0
  800. package/scripts/sync/claude-settings-merge.ts +8 -15
  801. package/scripts/sync/directory-copy-guard.ts +4 -9
  802. package/scripts/sync/file-content.ts +78 -8
  803. package/scripts/sync/sync-ai-files.ts +3 -5
  804. package/scripts/sync/sync-configs.ts +11 -23
  805. package/scripts/sync/sync-hook-safety.ts +4 -10
  806. package/scripts/sync/sync-main.ts +11 -0
  807. package/scripts/sync/sync.ts +25 -37
  808. package/scripts/test/test-declared-changed.ts +2 -2
  809. package/scripts/test/test-declared.ts +1 -1
  810. package/scripts/test/test-e2e-guard.ts +55 -6
  811. package/scripts/test/test-e2e-stamp.ts +38 -0
  812. package/scripts/test/test-pinned-logic.ts +145 -0
  813. package/scripts/test/test-pinned-main.ts +78 -0
  814. package/scripts/test/test-pinned.ts +100 -0
  815. package/scripts/test/test-read-map.ts +264 -0
  816. package/scripts/test/test-read-recording.ts +91 -0
  817. package/scripts/test/test-read-trace.ts +148 -0
  818. package/scripts/test/test-red-main.ts +12 -0
  819. package/scripts/test/test-red.ts +12 -30
  820. package/scripts/test/test-related-main.ts +18 -0
  821. package/scripts/test/test-related-record.ts +119 -0
  822. package/scripts/test/test-related-scope.ts +229 -43
  823. package/scripts/test/test-related.ts +300 -22
  824. package/scripts/test/test-unit-guard-main.ts +15 -0
  825. package/scripts/test/test-unit-guard.ts +54 -21
  826. package/scripts/test/unit-count-file.ts +37 -0
  827. package/scripts/test/unit-run-marker.ts +162 -0
  828. package/scripts/test/unit-setup-files.ts +51 -0
  829. package/scripts/test/unit-worker-share.ts +71 -137
  830. package/scripts/test/whole-suite-files.ts +63 -0
  831. package/scripts/time-runtime/time-background.ts +20 -2
  832. package/scripts/time-runtime/time-bundles.ts +4 -3
  833. package/scripts/time-runtime/time-density-hook.ts +8 -6
  834. package/scripts/time-runtime/time-followup-stage.ts +1 -3
  835. package/scripts/time-runtime/time-format.ts +5 -28
  836. package/scripts/time-runtime/time-markers.ts +10 -1
  837. package/scripts/time-runtime/time-shell.ts +126 -14
  838. package/scripts/time-runtime/time-spans.ts +1 -0
  839. package/scripts/time-runtime/time-tool-call.ts +7 -0
  840. package/scripts/time-runtime/time-transcript-line.ts +49 -62
  841. package/scripts/uninstall/uninstall.ts +1 -1
  842. package/scripts/version/bump-version-main.ts +12 -0
  843. package/scripts/version/bump-version.ts +25 -25
  844. package/scripts/version/effective-upstream.ts +6 -12
  845. package/scripts/version/latest-corepack.ts +17 -32
  846. package/scripts/version/latest-if-required-cli.ts +93 -0
  847. package/scripts/version/latest-lane-guard-main.ts +8 -0
  848. package/scripts/version/latest-lane-guard.ts +0 -4
  849. package/scripts/version/latest-scope-cli.ts +0 -9
  850. package/scripts/version/latest-scope-main.ts +12 -0
  851. package/scripts/version/latest-update.ts +5 -5
  852. package/scripts/version/npm-registry.ts +44 -6
  853. package/scripts/version/publishable-range-check.ts +5 -16
  854. package/scripts/version/release-age.ts +1 -1
  855. package/scripts/version/release-hold.ts +1 -1
  856. package/scripts/version/release-window.ts +38 -0
  857. package/scripts/version/running-binary.ts +1 -1
  858. package/scripts/version/safe-chain-version-update.ts +3 -8
  859. package/scripts/version/version-targets.ts +6 -28
  860. package/templates/dependabot.yml +29 -0
  861. package/templates/gitignore +10 -3
  862. package/templates/pnpm-workspace.basic.yaml +1 -1
  863. package/templates/sonar-project.properties +3 -2
  864. package/templates/workflows/ci.yml +12 -4
  865. package/templates/workflows/github-release.yml +4 -0
  866. package/tsconfig.sonar.json +1 -1
  867. package/.ncurc.json +0 -3
  868. package/dist/hooks/batch-guard.js +0 -29
  869. package/dist/hooks/chunk-43ZHT22P.js +0 -3495
  870. package/dist/hooks/chunk-CDY4NFQG.js +0 -15
  871. package/dist/hooks/chunk-EUMACUK2.js +0 -2038
  872. package/dist/hooks/chunk-H5HVWYXK.js +0 -359
  873. package/dist/hooks/chunk-IIGFYXKC.js +0 -7104
  874. package/dist/hooks/chunk-IX6TTTI6.js +0 -95
  875. package/dist/hooks/chunk-J47HU5H5.js +0 -237
  876. package/dist/hooks/chunk-K4EOONYM.js +0 -45
  877. package/dist/hooks/chunk-K4LMBQC2.js +0 -68
  878. package/dist/hooks/chunk-SHGPANFB.js +0 -56
  879. package/dist/hooks/chunk-YHBZAJSV.js +0 -79
  880. package/dist/hooks/chunk-YYPI7SJZ.js +0 -131
  881. package/dist/hooks/duplicate-read-guard.js +0 -30
  882. package/dist/hooks/investigation-guard.js +0 -32
  883. package/scripts/backlog/backlog-stalled-cli.ts +0 -30
  884. package/scripts/cost-runtime/cost-format.ts +0 -29
  885. package/scripts/init/basic-path-migration.ts +0 -24
  886. package/scripts/issue/issue-backlinks-cli.ts +0 -93
  887. package/scripts/josh/josh-commands-guard.ts +0 -38
  888. package/scripts/lint/cross-file-recheck.ts +0 -155
  889. package/scripts/registry-migration/migrate-logic.ts +0 -237
  890. package/scripts/registry-migration/migrate.ts +0 -292
  891. package/scripts/registry-migration/user-npmrc.ts +0 -15
  892. package/scripts/rules/rule-guard.ts +0 -23
  893. package/scripts/rules/rule-registry-rows.ts +0 -282
  894. package/scripts/rules/rule-registry.ts +0 -109
  895. package/scripts/run/run-stranded-cli.ts +0 -27
@@ -1,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,28 +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
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
39
60
  // A stopped run opens no lane, so a stage its stream ends on is not one any lane is at.
40
61
  is_stopped: boolean
41
62
  }
42
63
 
43
64
  // What every row of one layout is weighed against, read once.
44
65
  interface Pool {
45
- // An untriaged issue nothing blocks withholds every candidate (`epic-triage.ts`).
46
- is_held: boolean
66
+ // The untriaged issue nothing blocks that withholds every candidate (`epic-triage.ts`), if any.
67
+ held_by: number | undefined
47
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
48
77
  }
49
78
 
50
- function stage_word(text: string): string | undefined {
51
- 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]
52
83
  }
53
84
 
54
85
  function stage_of(child: EpicChild, read: ReasonRead): RowReason | undefined {
55
86
  const stage = read.is_stopped ? undefined : run_board_setup.lane_stage(read.events, child.number)
56
- const text = stage === undefined ? undefined : stage_word(stage.text)
87
+ const icon = stage === undefined ? undefined : stage_icon(stage.text)
57
88
 
58
- if (stage === undefined || text === undefined) return undefined
89
+ if (stage === undefined || icon === undefined) return undefined
59
90
 
60
- return { text, since_ms: stage.at_ms }
91
+ return { icon, since_ms: stage.at_ms }
61
92
  }
62
93
 
63
94
  function is_untriaged_candidate(child: EpicChild, read: ReasonRead): boolean {
@@ -73,52 +104,214 @@ function running_of(read: ReasonRead): Array<number> {
73
104
  return [...read.statuses].filter(([, status]) => holds_paths(status)).map(([issue]) => issue)
74
105
  }
75
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
+
76
125
  function pool_of(read: ReasonRead): Pool {
77
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))
78
129
 
79
130
  return {
80
- is_held: waiting.some((child) => is_untriaged_candidate(child, read)),
81
- 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)),
82
137
  }
83
138
  }
84
139
 
85
- 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 {
86
157
  const { declared = new Map(), context } = read.plan
87
158
  const holding = { holders: pool.running, repo: context.repo }
88
159
  const clash = backlog_overlap.running_clash(child, declared, holding)
89
160
 
90
- return clash === undefined
91
- ? undefined
92
- : `${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 }
166
+ }
167
+
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
172
+
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
+ }
191
+ }
192
+
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)
196
+
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
+ }
209
+
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
213
+
214
+ return { icon: WAIT_ICONS.held, issues: [String(pool.held_by)] }
215
+ }
216
+
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)
93
245
  }
94
246
 
95
- // A candidate nothing blocks, in the order `backlog:next` answers: the pool held for a judgment, then
96
- // a path a running issue declares, then a pool with no lane left.
97
- function offer_wait(child: EpicChild, read: ReasonRead, pool: Pool): string | undefined {
98
- if (pool.is_held) return WORDS.held
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
+ }
99
260
 
100
- const overlap = overlap_of(child, read, pool)
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)
101
265
 
102
- if (overlap !== undefined) return overlap
266
+ if (wait === undefined) return undefined
267
+ if (wait.kind !== 'short') return { icon: WAIT_ICONS.not_before, issues: [String(wait.pr)] }
103
268
 
104
- return read.free_lanes === NO_FREE_LANES ? WORDS.no_lane : undefined
269
+ return { icon: WAIT_ICONS.not_before, value: `${String(wait.counted)}/${String(wait.needed)}` }
105
270
  }
106
271
 
107
- function wait_of(child: EpicChild, read: ReasonRead, pool: Pool): RowReason | undefined {
108
- if (!epic_triage.is_triaged(child)) return { text: WORDS.untriaged }
109
- if (run_board_layout.is_blocked(child, read)) return undefined
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
+ }
110
296
 
111
- 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 }
112
305
 
113
- return text === undefined ? undefined : { text }
306
+ return not_before_of(child) ?? offer_wait(child, read, pool)
114
307
  }
115
308
 
116
309
  // What each waiting row of one layout says, the pool-wide facts read once for all of them.
117
310
  function reader(read: ReasonRead): ReasonOf {
118
311
  const pool = pool_of(read)
119
312
 
120
- return function reason_of(child: EpicChild): RowReason | undefined {
121
- 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)
122
315
  }
123
316
  }
124
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 }