@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,7 +1,9 @@
1
- import { NEEDS_DECISION_LABEL } from '#scripts/issue/issue-labels'
1
+ import { issue_cite } from '#scripts/issue/issue-cite'
2
2
  import { run_event_filed, type FiledKind } from '#scripts/run/event/run-event-filed'
3
3
  import { run_event_scope } from '#scripts/run/event/run-event-scope'
4
4
  import { run_event_stream, type RunEvent } from '#scripts/run/event/run-event-stream'
5
+ import { run_board_ending_reason } from './run-board-ending-reason'
6
+ import { run_board_layout } from './run-board-layout'
5
7
 
6
8
  // The board's findings section: what a run filed, what it parked and the
7
9
  // one-line observations it left, read off the event stream alone. A run started from the command line
@@ -20,20 +22,16 @@ interface BoardNote {
20
22
  found_during?: string | undefined
21
23
  // A filed Issue's classification, which its line leads with.
22
24
  filed_kind?: FiledKind | undefined
23
- // A park waiting on a person's decision, drawn apart from an ordinary park.
24
- is_decision: boolean
25
25
  }
26
26
 
27
27
  const KIND = run_event_stream.EVENT_KIND
28
- // `#<N> parked`, `#<N> parked (<reason>)` and `#<N> waiting on #<M>` lose their leading number, so a
29
- // waiting park does not name its issue twice.
30
- const PARK_PREFIX = /^#\d+ (?:parked\s*)?/u
31
- const PARENTHESES = /^\((?<inner>.*)\)$/u
32
28
 
29
+ // Only the run's own filings (joshuafolkken/kit#4099): a session outside the run writes to the same
30
+ // stream, and what it filed is drawn as any other plan row.
33
31
  function filed_note(event: RunEvent): BoardNote | undefined {
34
32
  const filed = run_event_filed.parse(event.text)
35
33
 
36
- if (filed === undefined) return undefined
34
+ if (filed?.is_run !== true) return undefined
37
35
 
38
36
  return {
39
37
  kind: 'filed',
@@ -42,20 +40,12 @@ function filed_note(event: RunEvent): BoardNote | undefined {
42
40
  text: filed.title,
43
41
  found_during: filed.found_during,
44
42
  filed_kind: filed.kind,
45
- is_decision: false,
46
43
  }
47
44
  }
48
45
 
49
46
  // The board's titles by issue number: the plan's listing with its closed children's.
50
47
  type Titles = ReadonlyMap<number, string>
51
48
 
52
- // `#<N> parked (needs-decision)` reads as the reason `needs-decision`; a bare park has none.
53
- function reason_of(event: RunEvent): string {
54
- const rest = event.text.replace(PARK_PREFIX, '')
55
-
56
- return PARENTHESES.exec(rest)?.groups?.['inner'] ?? rest
57
- }
58
-
59
49
  // The parked issue's title with its reason after it; before the plan is read there is no title, and
60
50
  // the reason alone is drawn.
61
51
  function park_text(title: string | undefined, reason: string): string {
@@ -64,25 +54,34 @@ function park_text(title: string | undefined, reason: string): string {
64
54
  return reason === '' ? title : `${title} (${reason})`
65
55
  }
66
56
 
67
- function park_note(event: RunEvent, titles: Titles): BoardNote {
68
- const reason = reason_of(event)
57
+ // A park waiting on a person's decision is no finding (joshuafolkken/kit#4099): while the child stays
58
+ // parked its row is in the 🙋 decision section, and once it resumes the decision is made.
59
+ function park_note(event: RunEvent, titles: Titles): BoardNote | undefined {
60
+ const reason = run_board_ending_reason.park_reason(event)
61
+
62
+ if (run_board_layout.is_decision(reason)) return undefined
63
+
69
64
  const issue = run_event_scope.issue_named(event)
70
65
  const title = issue === undefined ? undefined : titles.get(Number(issue))
71
- const is_decision = reason.includes(NEEDS_DECISION_LABEL)
72
66
 
73
- return {
74
- kind: 'park',
75
- at_ms: Date.parse(event.at),
76
- issue,
77
- text: park_text(title, reason),
78
- is_decision,
79
- }
67
+ return { kind: 'park', at_ms: Date.parse(event.at), issue, text: park_text(title, reason) }
68
+ }
69
+
70
+ // The line already leads with the number a note names, so a text that opens with it does not say it
71
+ // again (joshuafolkken/kit#4097).
72
+ function note_body(text: string, issue: string | undefined): string {
73
+ if (issue === undefined) return text
74
+
75
+ const lead = `${issue_cite.plain(issue)} `
76
+
77
+ return text.startsWith(lead) ? text.slice(lead.length) : text
80
78
  }
81
79
 
82
80
  function plain_note(event: RunEvent): BoardNote {
83
81
  const issue = run_event_scope.issue_named(event)
82
+ const text = note_body(event.text, issue)
84
83
 
85
- return { kind: 'note', at_ms: Date.parse(event.at), issue, text: event.text, is_decision: false }
84
+ return { kind: 'note', at_ms: Date.parse(event.at), issue, text }
86
85
  }
87
86
 
88
87
  function note_of(event: RunEvent, titles: Titles): BoardNote | undefined {
@@ -92,12 +91,34 @@ function note_of(event: RunEvent, titles: Titles): BoardNote | undefined {
92
91
  return event.kind === KIND.NOTE ? plain_note(event) : undefined
93
92
  }
94
93
 
95
- // Newest first: the line a person glancing at the board needs is the latest one.
96
- function notes_of(events: ReadonlyArray<RunEvent>, titles: Titles): ReadonlyArray<BoardNote> {
97
- return events.flatMap((event) => note_of(event, titles) ?? []).toReversed()
94
+ // A park is said only of a child the board still holds parked, so one a person released or closed
95
+ // is not (joshuafolkken/kit#4127).
96
+ function is_listed(note: BoardNote, listed: ReadonlySet<number> | undefined): boolean {
97
+ return listed === undefined || note.kind !== 'park' || listed.has(Number(note.issue))
98
+ }
99
+
100
+ // Newest first: the line a person glancing at the board needs is the latest one. `listed` holds the
101
+ // parked children whose park the section says (`run_board_layout.listed_parks`); without it, every
102
+ // park is said.
103
+ function notes_of(
104
+ events: ReadonlyArray<RunEvent>,
105
+ titles: Titles,
106
+ listed?: ReadonlySet<number>,
107
+ ): ReadonlyArray<BoardNote> {
108
+ return events
109
+ .flatMap((event) => note_of(event, titles) ?? [])
110
+ .filter((note) => is_listed(note, listed))
111
+ .toReversed()
112
+ }
113
+
114
+ // The issues the run filed in this repository — the rows that lead their title with ✚.
115
+ function filed_numbers(notes: ReadonlyArray<BoardNote>): ReadonlySet<number> {
116
+ const filed = notes.filter((note) => note.kind === 'filed').map((note) => Number(note.issue))
117
+
118
+ return new Set(filed.filter((number) => Number.isSafeInteger(number)))
98
119
  }
99
120
 
100
- const run_board_notes = { notes_of }
121
+ const run_board_notes = { filed_numbers, notes_of }
101
122
 
102
123
  export { run_board_notes }
103
124
  export type { BoardNote, Titles }
@@ -43,7 +43,7 @@ interface NowRead {
43
43
  }
44
44
 
45
45
  interface NowLine {
46
- // The kind's icon, drawn under the `⚡`.
46
+ // The kind's icon, drawn under the `💪`.
47
47
  icon: string
48
48
  // The icon's word in the legend, `undefined` where the line's own words or the phase legend name it.
49
49
  legend?: string | undefined
@@ -1,5 +1,5 @@
1
1
  import path from 'node:path'
2
- import { json_value } from '#scripts/lib/json-value'
2
+ import { transcript_record, type TranscriptRecord } from '#scripts/lib/transcript-record'
3
3
  import { z } from 'zod'
4
4
 
5
5
  // The newest thing a session did, read off the end of its log — a lane child's dispatch log, the
@@ -37,28 +37,11 @@ const SPACES = /\s+/gu
37
37
  // The printable ASCII a target begins with: what follows may be the session's own language.
38
38
  const ASCII_HEAD = /^[ -~]*/u
39
39
 
40
- // A call names its tool; every other block of a line — its text, its thinking — is not one.
41
- const CALL_SCHEMA = z.looseObject({
42
- type: z.literal(TOOL_USE),
43
- name: z.string(),
44
- input: z.unknown(),
45
- })
46
-
47
- function is_dated(text: string): boolean {
48
- return !Number.isNaN(Date.parse(text))
49
- }
50
-
51
- const MESSAGE_SCHEMA = z.looseObject({ content: z.array(z.unknown()) })
52
- const LINE_SCHEMA = z.looseObject({
53
- timestamp: z.string().refine(is_dated),
54
- message: MESSAGE_SCHEMA,
55
- })
56
40
  // An input that is no object reads as one pointed at nothing.
57
41
  const INPUT_SCHEMA = z
58
42
  .looseObject({ command: z.string().optional(), file_path: z.string().optional() })
59
43
  .catch({})
60
44
 
61
- type Call = z.infer<typeof CALL_SCHEMA>
62
45
  type Input = z.infer<typeof INPUT_SCHEMA>
63
46
 
64
47
  function ascii_head(text: string): string {
@@ -103,26 +86,25 @@ function target_of(input: Input, root: string | undefined): string | undefined {
103
86
  return input.file_path === undefined ? undefined : shown(path_target(input.file_path, root))
104
87
  }
105
88
 
106
- function is_call(block: unknown): block is Call {
107
- return CALL_SCHEMA.safeParse(block).success
108
- }
89
+ // The last call a line holds, `undefined` for an undated line or one holding none. A call names its
90
+ // tool; every other block of a line — its text, its thinking — is not one.
91
+ function record_operation(
92
+ record: TranscriptRecord,
93
+ root: string | undefined,
94
+ ): Operation | undefined {
95
+ const call = transcript_record.tool_calls_of(record).at(-1)
96
+ const at_ms = Date.parse(record.timestamp ?? '')
109
97
 
110
- function last_call(content: ReadonlyArray<unknown>): Call | undefined {
111
- return content.findLast((block) => is_call(block))
98
+ if (call === undefined || Number.isNaN(at_ms)) return undefined
99
+
100
+ return { kind: call.name, target: target_of(INPUT_SCHEMA.parse(call.input), root), at_ms }
112
101
  }
113
102
 
114
- // The last call a line holds, `undefined` for a line that is cut, is not JSON, or holds none.
103
+ // The same, `undefined` too for a line that is cut or is not JSON.
115
104
  function line_operation(line: string, root: string | undefined): Operation | undefined {
116
- const parsed = json_value.parse_with(line, LINE_SCHEMA)
117
- const call = last_call(parsed?.message.content ?? [])
118
-
119
- if (parsed === undefined || call === undefined) return undefined
105
+ const record = transcript_record.parse(line)
120
106
 
121
- return {
122
- kind: call.name,
123
- target: target_of(INPUT_SCHEMA.parse(call.input), root),
124
- at_ms: Date.parse(parsed.timestamp),
125
- }
107
+ return record === undefined ? undefined : record_operation(record, root)
126
108
  }
127
109
 
128
110
  // The newest operation in `tail` — the end of a log, whose first line is usually cut mid-way and so
@@ -19,9 +19,9 @@ const PHASES = [
19
19
  'plan',
20
20
  'implement',
21
21
  'ship',
22
+ 'sync',
22
23
  'review',
23
24
  'gate',
24
- 'sync',
25
25
  'commit',
26
26
  'round_two',
27
27
  'followup',
@@ -0,0 +1,115 @@
1
+ import { backlog_next_shared } from '#scripts/backlog/backlog-next-shared'
2
+ import type { NamedPlan } from '#scripts/backlog/backlog-plan'
3
+ import { shared_cache, type CacheSlot } from '#scripts/josh/shared-cache'
4
+ import { z } from 'zod'
5
+ import type { BoardPlan } from './run-board-layout'
6
+ import { run_board_plan } from './run-board-plan'
7
+
8
+ // `run:board`'s plan read, shared the way the drive's assignment and the arrival probe share
9
+ // `josh backlog:next` (joshuafolkken/kit#4558): one read within a minute, keyed by the scope it was
10
+ // asked for and the newest event on the run's stream, so a launch, a merge or a park reads again.
11
+ // Only a plan that read is kept; a failed read is asked again by the next redraw.
12
+ //
13
+ // The plan holds maps and sets, which JSON does not, so each is kept as its entries and rebuilt on read.
14
+
15
+ const PLAN_CACHE: CacheSlot = {
16
+ prefix: 'josh-run-board-plan-',
17
+ ttl_ms: backlog_next_shared.NEXT_CACHE.ttl_ms,
18
+ }
19
+
20
+ type EntriesCodec<T, I> = z.ZodCodec<
21
+ z.ZodArray<z.ZodTuple<[z.ZodNumber, z.ZodType<T, I>], null>>,
22
+ z.ZodReadonly<z.ZodMap<z.ZodNumber, z.ZodCustom<T, T>>>
23
+ >
24
+
25
+ // The value is checked once, on the entries side: a value that is itself a codec would otherwise be
26
+ // encoded twice, by the map and again by its entries.
27
+ function map_of<T, I>(value: z.ZodType<T, I>): EntriesCodec<T, I> {
28
+ const entries = z.array(z.tuple([z.number(), value]))
29
+ const map = z.map(z.number(), z.custom<T>()).readonly()
30
+
31
+ return z.codec(entries, map, {
32
+ decode: (pairs) => new Map(pairs),
33
+ encode: (pairs) => [...pairs],
34
+ })
35
+ }
36
+
37
+ const number_set = z.codec(z.array(z.number()), z.set(z.number()).readonly(), {
38
+ decode: (numbers) => new Set(numbers),
39
+ encode: (numbers) => [...numbers],
40
+ })
41
+
42
+ // A listing cut short knows no open issues (`PlanContext.open_numbers`); JSON drops an `undefined`
43
+ // key, so the set is kept inside an object that is always written.
44
+ const optional_numbers = z.array(z.number()).optional()
45
+ const unknown_or_set = z.codec(
46
+ z.object({ numbers: optional_numbers }),
47
+ z.custom<ReadonlySet<number> | undefined>(),
48
+ {
49
+ decode: ({ numbers }) => (numbers === undefined ? undefined : new Set(numbers)),
50
+ encode: (numbers) => (numbers === undefined ? {} : { numbers: [...numbers] }),
51
+ },
52
+ )
53
+
54
+ const string_set = z.codec(z.array(z.string()), z.set(z.string()).readonly(), {
55
+ decode: (values) => new Set(values),
56
+ encode: (values) => [...values],
57
+ })
58
+
59
+ const names = z.array(z.string()).readonly()
60
+ const reference_schema = z.object({ repo: z.string(), number: z.number() })
61
+
62
+ const child_schema = z.object({
63
+ number: z.number(),
64
+ repo: z.string(),
65
+ state: z.enum(['OPEN', 'CLOSED']),
66
+ labels: names,
67
+ blocked_by: z.array(reference_schema).readonly(),
68
+ body: z.string().optional(),
69
+ })
70
+
71
+ const children = z.array(child_schema).readonly()
72
+
73
+ const waves_schema = z.object({
74
+ waves: z.array(children).readonly(),
75
+ unreached: children,
76
+ running: children.exactOptional(),
77
+ })
78
+
79
+ const context_schema = z.object({
80
+ repo: z.string(),
81
+ titles: map_of(z.string()),
82
+ open_numbers: unknown_or_set,
83
+ })
84
+
85
+ const board_plan_schema = z.object({
86
+ waves: waves_schema,
87
+ tracked: map_of(z.number()),
88
+ context: context_schema,
89
+ labels: map_of(names),
90
+ declared: map_of(string_set).optional(),
91
+ withheld: number_set.optional(),
92
+ })
93
+
94
+ async function read(
95
+ named: NamedPlan,
96
+ read_plan = run_board_plan.read_plan,
97
+ ): Promise<BoardPlan | undefined> {
98
+ const key = await backlog_next_shared.stream_key({ board: named })
99
+ const now_ms = Date.now()
100
+ const kept = shared_cache.read(PLAN_CACHE, key, board_plan_schema, now_ms)
101
+
102
+ if (kept !== undefined) return kept
103
+
104
+ const plan = await read_plan(named)
105
+
106
+ if (plan !== undefined) {
107
+ shared_cache.write(PLAN_CACHE, key, board_plan_schema.encode(plan), now_ms)
108
+ }
109
+
110
+ return plan
111
+ }
112
+
113
+ const run_board_plan_shared = { PLAN_CACHE, read }
114
+
115
+ export { run_board_plan_shared }
@@ -1,8 +1,9 @@
1
1
  import { auto_ok_cli, type OptedInRead } from '#scripts/auto-ok/auto-ok-cli'
2
2
  import type { OptedIn } from '#scripts/backlog/backlog-next'
3
- import type { NamedPlan } from '#scripts/backlog/backlog-plan'
3
+ import { backlog_plan, type NamedPlan } from '#scripts/backlog/backlog-plan'
4
4
  import { backlog_plan_read, type OpenListing, type Plan } from '#scripts/backlog/backlog-plan-read'
5
5
  import { backlog_waves } from '#scripts/backlog/backlog-waves'
6
+ import { epic_classify } from '#scripts/epic/epic-classify'
6
7
  import type { EpicChild } from '#scripts/epic/epic-graph'
7
8
  import type { OpenIssueData } from '#scripts/git/git-schemas'
8
9
  import { run_board_layout, type BoardPlan } from './run-board-layout'
@@ -21,10 +22,20 @@ interface PlanPorts {
21
22
  classify: (opted_in: OptedIn, exclude: ReadonlyArray<number>) => Promise<Plan | undefined>
22
23
  }
23
24
 
25
+ // The board leads a row withheld for a person with 🙋, so classifying says no ❗ notice over it.
26
+ async function classify_quietly(
27
+ opted_in: OptedIn,
28
+ exclude: ReadonlyArray<number>,
29
+ ): Promise<Plan | undefined> {
30
+ epic_classify.mute_notices()
31
+
32
+ return await backlog_plan_read.classify(opted_in, exclude)
33
+ }
34
+
24
35
  const LIVE_PORTS: PlanPorts = {
25
36
  fetch_open: backlog_plan_read.fetch_open,
26
37
  fetch_opted_in: auto_ok_cli.fetch_opted_in,
27
- classify: backlog_plan_read.classify,
38
+ classify: classify_quietly,
28
39
  }
29
40
 
30
41
  // One classified plan, against the listing it was read with.
@@ -57,6 +68,7 @@ async function board_of(
57
68
  context: backlog_plan_read.context_of(plan, read.listing),
58
69
  labels: labels_of(read.listing.rows),
59
70
  declared: plan.scope.declared,
71
+ withheld: new Set(plan.result.blocked_on_people.map((child) => child.number)),
60
72
  }
61
73
  }
62
74
 
@@ -80,6 +92,41 @@ function not_held(children: ReadonlyArray<EpicChild>, held: ReadonlySet<number>)
80
92
  return children.filter((child) => !held.has(child.number))
81
93
  }
82
94
 
95
+ // The issues the pool runs: its waves and its running issues, not what it leaves unreached.
96
+ function runs_of(pool: BoardPlan): ReadonlySet<number> {
97
+ const running = pool.waves.running ?? []
98
+
99
+ return new Set([...pool.waves.waves.flat(), ...running].map((child) => child.number))
100
+ }
101
+
102
+ // The named plan is classified alone, so a blocker only the pool holds reads as outside it; the
103
+ // child still waits on a person only while a standing blocker is one the pool does not run.
104
+ function waits_outside(child: EpicChild, pool: BoardPlan, runs: ReadonlySet<number>): boolean {
105
+ const { context } = pool
106
+
107
+ return child.blocked_by.some(
108
+ (edge) =>
109
+ backlog_plan.is_standing(edge, context) &&
110
+ !(edge.repo === context.repo && runs.has(edge.number)),
111
+ )
112
+ }
113
+
114
+ function lead_withheld(lead: BoardPlan, pool: BoardPlan): Array<number> {
115
+ const runs = runs_of(pool)
116
+ const children = [...lead.waves.waves.flat(), ...lead.waves.unreached]
117
+ const freed = children.filter((child) => !waits_outside(child, pool, runs))
118
+ const freed_numbers = new Set(freed.map((child) => child.number))
119
+
120
+ return [...(lead.withheld ?? [])].filter((number) => !freed_numbers.has(number))
121
+ }
122
+
123
+ // The named plan's withheld issues the pool does not free, and the pool's the named plan does not hold.
124
+ function withheld_of(lead: BoardPlan, pool: BoardPlan, held: ReadonlySet<number>): Set<number> {
125
+ const from_pool = [...(pool.withheld ?? [])].filter((number) => !held.has(number))
126
+
127
+ return new Set([...lead_withheld(lead, pool), ...from_pool])
128
+ }
129
+
83
130
  // The named waves lead and the pool's follow, a child the named plan already holds left out of the pool
84
131
  // so a named epic's children are not drawn twice.
85
132
  function joined(lead: BoardPlan, pool: BoardPlan): BoardPlan {
@@ -89,11 +136,13 @@ function joined(lead: BoardPlan, pool: BoardPlan): BoardPlan {
89
136
  waves: {
90
137
  waves: [...lead.waves.waves, ...pool.waves.waves.map((wave) => not_held(wave, held))],
91
138
  unreached: [...lead.waves.unreached, ...not_held(pool.waves.unreached, held)],
139
+ running: [...(lead.waves.running ?? []), ...not_held(pool.waves.running ?? [], held)],
92
140
  },
93
141
  tracked: new Map([...pool.tracked, ...lead.tracked]),
94
142
  context: pool.context,
95
143
  labels: pool.labels,
96
144
  declared: new Map([...(pool.declared ?? []), ...(lead.declared ?? [])]),
145
+ withheld: withheld_of(lead, pool, held),
97
146
  }
98
147
  }
99
148
 
@@ -108,13 +157,16 @@ async function scoped_board(named: NamedPlan, read: PlanRead): Promise<BoardPlan
108
157
  }
109
158
 
110
159
  // `undefined` is a failed read, which the board answers by keeping the plan it already has.
160
+ // An empty listing is one too: the board is read while its own run's issues are open, and an empty one
161
+ // drew every live child finished and the pool empty (joshuafolkken/kit#4537). The guard is the board's
162
+ // alone — `backlog:plan` in a repository with no open issue reads an empty listing correctly.
111
163
  async function read_plan(
112
164
  named: NamedPlan,
113
165
  ports: PlanPorts = LIVE_PORTS,
114
166
  ): Promise<BoardPlan | undefined> {
115
167
  const listing = await ports.fetch_open()
116
168
 
117
- if (listing === undefined) return undefined
169
+ if (listing === undefined || listing.rows.length === 0) return undefined
118
170
 
119
171
  const read = { listing, ports }
120
172
 
@@ -0,0 +1,45 @@
1
+ import { backlog_drive_named } from '#scripts/backlog/backlog-drive-named'
2
+ import { run_event_setup } from '#scripts/run/event/run-event-setup'
3
+ import { run_board_labels } from './run-board-labels'
4
+ import { run_board_layout, type RowReason } from './run-board-layout'
5
+ import type { ReasonRead } from './run-board-reason'
6
+ import { run_board_setup } from './run-board-setup'
7
+
8
+ // The queued row the run's planning is for (joshuafolkken/kit#4279): while the run stands at its
9
+ // `planning` stage, the one issue it launches next leads with 📝 and says how long it has planned, and
10
+ // no other row does. That issue is the driver's own next in a named run (`backlog-drive-named.ts`), else
11
+ // the plan's first waiting row — the head of its first wave. No event says it; the stage and the order do.
12
+
13
+ const { STAGE } = run_event_setup
14
+ const FIRST = 0
15
+ const PLANNING_ICON = run_board_labels.STAGE_ICONS[STAGE.PLANNING]
16
+
17
+ interface Planning {
18
+ issue: number
19
+ reason: RowReason
20
+ }
21
+
22
+ function named_next(read: ReasonRead, in_flight: ReadonlyArray<number>): number | undefined {
23
+ if (read.carry === undefined) return undefined
24
+
25
+ return backlog_drive_named.next_of(read.carry, in_flight.map(String))
26
+ }
27
+
28
+ function next_launch(read: ReasonRead, in_flight: ReadonlyArray<number>): number | undefined {
29
+ return named_next(read, in_flight) ?? run_board_layout.waiting_children(read)[FIRST]?.number
30
+ }
31
+
32
+ function planning_of(read: ReasonRead, in_flight: ReadonlyArray<number>): Planning | undefined {
33
+ const { setup, setup_ms } = run_board_setup.read(read.events)
34
+ if (read.is_stopped || setup !== STAGE.PLANNING) return undefined
35
+ const issue = next_launch(read, in_flight)
36
+
37
+ return issue === undefined
38
+ ? undefined
39
+ : { issue, reason: { icon: PLANNING_ICON, since_ms: setup_ms } }
40
+ }
41
+
42
+ const run_board_planning = { planning_of }
43
+
44
+ export { run_board_planning }
45
+ export type { Planning }
@@ -0,0 +1,44 @@
1
+ import type { BoardPriority } from './run-board-kind'
2
+ import { run_board_labels } from './run-board-labels'
3
+ import { run_board_layout, type BoardLayout, type BoardRow } from './run-board-layout'
4
+
5
+ // A row's priority (joshuafolkken/kit#4383), drawn between its number and its kind, and tallied
6
+ // beside the header's ⏳ count. A normal row draws `KIND_BLANK` in the column, so every title still
7
+ // starts in one column.
8
+
9
+ const { KIND_BLANK } = run_board_labels
10
+
11
+ const PRIORITY_ICONS: Readonly<Record<BoardPriority, string>> = {
12
+ critical: '🚨',
13
+ high: '🔺',
14
+ }
15
+ const ORDER: ReadonlyArray<BoardPriority> = ['critical', 'high']
16
+
17
+ function cell_of(row: BoardRow): string {
18
+ return row.priority === undefined ? KIND_BLANK : PRIORITY_ICONS[row.priority]
19
+ }
20
+
21
+ // The rows the ⏳ count holds: neither settled nor running.
22
+ function is_waiting(row: BoardRow): boolean {
23
+ return row.state !== 'running' && !run_board_layout.is_settled(row.state)
24
+ }
25
+
26
+ function part_of(rows: ReadonlyArray<BoardRow>, priority: BoardPriority): string | undefined {
27
+ const count = rows.filter((row) => row.priority === priority).length
28
+
29
+ return count === 0 ? undefined : `${PRIORITY_ICONS[priority]} ${String(count)}`
30
+ }
31
+
32
+ // ` (🚨 1 🔺 2)` after the ⏳ count, naming only the priorities present; nothing when none is.
33
+ function tally_of(layout: BoardLayout): string {
34
+ const waiting = run_board_layout.rows_of(layout).filter((row) => is_waiting(row))
35
+ const parts = ORDER.map((priority) => part_of(waiting, priority)).filter(
36
+ (part) => part !== undefined,
37
+ )
38
+
39
+ return parts.length === 0 ? '' : ` (${parts.join(' ')})`
40
+ }
41
+
42
+ const run_board_priority = { cell_of, tally_of }
43
+
44
+ export { run_board_priority }