@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,116 +1,86 @@
1
- import { lane_await } from '#scripts/lane/lane-await'
2
- import { run_progress } from '#scripts/run/progress/run-progress'
3
1
  import type { ClosedIssue } from './run-board-closed'
2
+ import type { EarlierLanes } from './run-board-earlier'
3
+ import type { FrameBounds } from './run-board-fold'
4
+ import type { GatherRead } from './run-board-gather'
4
5
  import { run_board_github } from './run-board-github'
5
6
  import { run_board_header, type BoardHeader } from './run-board-header'
6
- import { run_board_idle } from './run-board-idle'
7
7
  import { run_board_labels } from './run-board-labels'
8
8
  import { run_board_layout, type BoardLayout, type BoardPlan } from './run-board-layout'
9
9
  import { run_board_link } from './run-board-link'
10
- import { run_board_machine } from './run-board-machine'
11
10
  import { run_board_notes, type Titles } from './run-board-notes'
12
11
  import type { LocalRead } from './run-board-read'
13
- import { run_board_reason } from './run-board-reason'
14
- import { run_board_render, type FrameBounds } from './run-board-render'
12
+ import { run_board_reason, type ReasonRead } from './run-board-reason'
13
+ import { run_board_released } from './run-board-released'
14
+ import { run_board_render } from './run-board-render'
15
+ import type { Known } from './run-board-snapshot'
15
16
  import { run_board_spin, type Spun } from './run-board-spin'
16
17
  import { run_board_state, type BoardPorts, type BoardState, type Pace } from './run-board-state'
17
- import { run_board_status, type RunActivity } from './run-board-status'
18
+ import { run_board_status, type ItemStatus, type RunActivity } from './run-board-status'
18
19
  import { run_board_thanks } from './run-board-thanks'
19
- import { run_board_usage } from './run-board-usage'
20
-
21
- // One `run:board` redraw. **Three speeds**: the frame is redrawn once a second, on the second, so
22
- // every elapsed time moves by one, its spinners turned between redraws by `run-board-spin.ts`; the
23
- // run's own stream and lanes are re-read no more often than `LOCAL_READ_MS`, because each read parses
24
- // the whole stream and asks git twice, and a board left open all night would otherwise grow heavier
25
- // as the run grew longer; the GitHub reads they are laid over are `run-board-github.ts`'s, which a
26
- // live board never waits on. Between reads the last one is kept and drawn against the current time.
27
- // A run that ended stays on screen until the next one starts. With no run in this checkout it reads
28
- // nothing from GitHub. The machine is sampled once a second: one `sysctl` takes a few milliseconds,
29
- // and its gauges are the differences between consecutive samples.
20
+
21
+ // One `run:board` redraw. The frame is redrawn once a second, on the second, so every elapsed time
22
+ // moves by one, its spinners turned between redraws by `run-board-spin.ts`. It draws the last reads
23
+ // off this machine (`run-board-gather.ts`) — a live board's taken on a worker thread, so the redraw
24
+ // itself reads nothing that could stop a spinner — laid over the GitHub reads, `run-board-github.ts`'s,
25
+ // which a live board never waits on. A run that ended stays on screen until the next one starts. With
26
+ // no run in this checkout it reads nothing from GitHub.
30
27
 
31
28
  const { REDRAW_MS, SPOT } = run_board_spin
32
- const MACHINE_SAMPLE_MS = run_progress.MS_PER_SECOND
33
- const LOCAL_READ_SECONDS = 5
34
- const LOCAL_READ_MS = LOCAL_READ_SECONDS * run_progress.MS_PER_SECOND
35
- const { FRESH_STATE, is_due } = run_board_state
36
- const { PLAN_RETRY_MS, gather_github, statuses_for } = run_board_github
29
+ const { FRESH_STATE } = run_board_state
30
+ const { PLAN_RETRY_MS, gather_github, known_of, open_read_of, statuses_for } = run_board_github
37
31
  const { gather_thanks } = run_board_thanks
38
32
 
39
- async function read_at(state: BoardState, ports: BoardPorts, now_ms: number): Promise<BoardState> {
40
- const local = await ports.read_local()
41
- const idle_since = run_board_idle.since_of(state.idle_since, local?.idle_lanes ?? [], now_ms)
42
-
43
- return { ...state, local, read_ms: now_ms, idle_since }
44
- }
45
-
46
- // A single frame has no earlier read to confirm an idle lane against (`run-board-idle.ts`).
47
- function is_unconfirmed(before: BoardState, read: BoardState, pace: Pace): boolean {
48
- return pace === 'settled' && before.read_ms === undefined && read.idle_since.size > 0
49
- }
50
-
51
- async function reread(state: BoardState, ports: BoardPorts, pace: Pace): Promise<BoardState> {
52
- const now_ms = ports.now()
53
-
54
- if (!is_due(state.read_ms, LOCAL_READ_MS, now_ms)) return state
55
-
56
- const read = await read_at(state, ports, now_ms)
33
+ // What the last board on this run kept (`run-board-snapshot.ts`); one written on another run is
34
+ // discarded.
35
+ function saved_for(ports: BoardPorts, started_ms: number): Pick<BoardState, 'known' | 'closed'> {
36
+ const snapshot = ports.snapshot?.load()
57
37
 
58
- if (!is_unconfirmed(state, read, pace)) return read
38
+ if (snapshot?.run_started_ms !== started_ms) return FRESH_STATE
59
39
 
60
- await ports.sleep(lane_await.RECONFIRM_MS)
61
-
62
- return await read_at(read, ports, ports.now())
40
+ return { known: { titles: snapshot.titles, labels: snapshot.labels }, closed: snapshot.closed }
63
41
  }
64
42
 
65
- // Each lane's usage, read on the machine's second; a reading that failed draws no column.
66
- async function read_usages(
43
+ // The state of the run on screen, over the reads just taken; a different run starts its plan state
44
+ // from what the last board on it kept, or from nothing, so no row, count or baseline of the previous
45
+ // run is drawn over the new one.
46
+ function state_for(
67
47
  state: BoardState,
48
+ read: GatherRead,
49
+ local: LocalRead,
68
50
  ports: BoardPorts,
69
- ): Promise<Pick<BoardState, 'usage' | 'usages'>> {
70
- const usage = await ports.read_usage(state.usage)
71
- const usages = usage === undefined ? undefined : run_board_usage.usage_of(state.usage, usage)
72
-
73
- return { usage, usages }
74
- }
75
-
76
- // The sample is timed when it is taken, not when the tick began: a plan read between the two would put
77
- // its seconds on the wrong side of the rate's interval. It is due by the tick's clock, so a sample
78
- // taken a few milliseconds into its tick does not slip to the redraw after the second.
79
- async function resample(state: BoardState, ports: BoardPorts, now_ms: number): Promise<BoardState> {
80
- if (!is_due(state.sampled_ms, MACHINE_SAMPLE_MS, now_ms)) return state
51
+ ): BoardState {
52
+ if (state.run_started_ms === local.started_ms) return { ...state, ...read }
81
53
 
82
- const at_ms = ports.now()
83
- const machine = { sample: await ports.read_machine(), at_ms }
84
- const gauges = run_board_machine.gauges_of(state.machine, machine)
54
+ const saved = saved_for(ports, local.started_ms)
85
55
 
86
- return { ...state, ...(await read_usages(state, ports)), machine, gauges, sampled_ms: now_ms }
56
+ return { ...FRESH_STATE, ...saved, ...read, run_started_ms: local.started_ms }
87
57
  }
88
58
 
89
- // The state of the run on screen; a different run starts its plan state from nothing, so no row, count
90
- // or baseline of the previous run is drawn over the new one.
91
- function state_for(state: BoardState, local: LocalRead): BoardState {
92
- if (state.run_started_ms === local.started_ms) return state
93
-
94
- const { local: kept, read_ms, idle_since } = state
59
+ // The titles and labels with a closed child's under the listing's own.
60
+ function closed_under(known: Known, closed: ReadonlyMap<number, ClosedIssue>): Known {
61
+ const closed_titles = [...closed].map(([issue, { title }]) => [issue, title] as const)
62
+ const closed_labels = [...closed].map(([issue, { labels }]) => [issue, labels] as const)
95
63
 
96
- return { ...FRESH_STATE, local: kept, read_ms, idle_since, run_started_ms: local.started_ms }
64
+ return {
65
+ titles: new Map([...closed_titles, ...known.titles]),
66
+ labels: new Map([...closed_labels, ...known.labels]),
67
+ }
97
68
  }
98
69
 
99
70
  // The plan with a closed child's title and labels under the listing's own.
100
71
  function with_closed(plan: BoardPlan, closed: ReadonlyMap<number, ClosedIssue>): BoardPlan {
101
- const closed_titles = [...closed].map(([issue, { title }]) => [issue, title] as const)
102
- const closed_labels = [...closed].map(([issue, { labels }]) => [issue, labels] as const)
103
- const titles = new Map([...closed_titles, ...plan.context.titles])
104
- const labels = new Map([...closed_labels, ...plan.labels])
72
+ const { titles, labels } = closed_under(
73
+ { titles: plan.context.titles, labels: plan.labels },
74
+ closed,
75
+ )
105
76
 
106
77
  return { ...plan, context: { ...plan.context, titles }, labels }
107
78
  }
108
79
 
109
- // The titles the findings name a parked issue by — the rows' own; none before the plan is read.
80
+ // The titles the findings name a parked issue by — the rows' own; the snapshot's before the plan is
81
+ // read.
110
82
  function titles_of(state: BoardState): Titles {
111
- if (state.plan === undefined) return new Map()
112
-
113
- return with_closed(state.plan, state.closed).context.titles
83
+ return closed_under(known_of(state), state.closed).titles
114
84
  }
115
85
 
116
86
  // A run `run:carry --end` closed and one nobody drives any more are both drawn as stopped.
@@ -121,37 +91,75 @@ function activity_here(local: LocalRead): RunActivity {
121
91
  )
122
92
  }
123
93
 
94
+ type RoomRead = Pick<
95
+ ReasonRead,
96
+ 'free_lanes' | 'occupied_count' | 'lane_limit' | 'is_memory_held' | 'gauges'
97
+ >
98
+
99
+ // The room a waiting row is weighed against: the lanes under the limit, and the machine's memory.
100
+ function room_of(state: BoardState, local: LocalRead): RoomRead {
101
+ return {
102
+ free_lanes: local.free_lanes,
103
+ occupied_count: local.occupied_count,
104
+ lane_limit: local.lane_limit,
105
+ is_memory_held: local.is_memory_held,
106
+ gauges: state.gauges,
107
+ }
108
+ }
109
+
110
+ // The run's statuses over the plan, a child read closed settled and one a person released left out.
111
+ function planned_statuses(
112
+ state: BoardState,
113
+ plan: BoardPlan,
114
+ local: LocalRead,
115
+ ): ReadonlyMap<number, ItemStatus> {
116
+ const read = open_read_of(state, plan)
117
+
118
+ return run_board_released.without_released(
119
+ run_board_status.settle_closed(statuses_for(state, local), read),
120
+ read,
121
+ )
122
+ }
123
+
124
+ // The earlier run's lanes still holding a place, and the open lanes with no record.
125
+ function earlier_here(local: LocalRead): EarlierLanes {
126
+ return {
127
+ lanes: local.earlier_occupied ?? [],
128
+ statuses: local.lane_states.earlier,
129
+ unknown: local.lane_states.unknown,
130
+ }
131
+ }
132
+
124
133
  // The plan laid under its statuses, each waiting row saying why it waits.
125
134
  function planned_layout(state: BoardState, plan: BoardPlan, local: LocalRead): BoardLayout {
126
- const { closed } = state
127
- const read = {
128
- open_numbers: plan.context.open_numbers,
129
- read_ms: state.fetched_ms,
130
- closed,
131
- labels: plan.labels,
132
- }
133
- const statuses = run_board_status.settle_closed(statuses_for(state, plan, local), read)
135
+ const statuses = planned_statuses(state, plan, local)
134
136
  const reason_of = run_board_reason.reader({
135
137
  plan,
136
138
  statuses,
137
139
  events: local.events,
138
- free_lanes: local.free_lanes,
140
+ ...room_of(state, local),
141
+ carry: local.carry,
139
142
  is_stopped: activity_here(local).is_stopped,
140
143
  })
141
144
 
142
- return run_board_layout.layout_of(with_closed(plan, closed), statuses, reason_of)
145
+ return run_board_layout.layout_of(
146
+ with_closed(plan, state.closed),
147
+ statuses,
148
+ reason_of,
149
+ earlier_here(local),
150
+ )
143
151
  }
144
152
 
145
- // The statuses scoped to the run's plan, a running child the plan's listing no longer holds settled.
146
- // Before the plan is read, the run's own children alone.
153
+ // The statuses scoped to the run's plan, a running child GitHub read closed settled.
154
+ // Before the plan is read, the run's own children alone, named and settled as the snapshot left them.
147
155
  function layout_for(state: BoardState, local: LocalRead): BoardLayout {
148
156
  if (state.plan !== undefined) return planned_layout(state, state.plan, local)
149
157
 
150
- const stopped = run_board_idle.stopped_of(state.idle_since, state.read_ms)
158
+ const read = open_read_of(state, undefined)
159
+ const statuses = run_board_status.settle_closed(statuses_for(state, local), read)
160
+ const known = closed_under(state.known, state.closed)
151
161
 
152
- return run_board_layout.local_layout_of(
153
- run_board_status.statuses_of(local.events, local.lanes, new Set(), stopped),
154
- )
162
+ return run_board_layout.local_layout_of(statuses, earlier_here(local), known)
155
163
  }
156
164
 
157
165
  // What one redraw draws with.
@@ -163,7 +171,7 @@ interface Redraw {
163
171
  // What the header reads off the local read.
164
172
  type LocalHeader = Pick<
165
173
  BoardHeader,
166
- 'started_ms' | 'ended_ms' | 'activity' | 'operations' | 'usual'
174
+ 'started_ms' | 'ended_ms' | 'activity' | 'operations' | 'usual' | 'lane_limit'
167
175
  >
168
176
 
169
177
  function local_header(local: LocalRead): LocalHeader {
@@ -173,6 +181,7 @@ function local_header(local: LocalRead): LocalHeader {
173
181
  activity: activity_here(local),
174
182
  operations: local.operations,
175
183
  usual: local.usual,
184
+ lane_limit: local.lane_limit,
176
185
  }
177
186
  }
178
187
 
@@ -189,9 +198,12 @@ function header_of(
189
198
  baseline_total: state.baseline_total,
190
199
  plan_fetched_ms: state.fetched_ms,
191
200
  plan_failed_ms: state.failed_ms,
201
+ read_failed_ms: state.read_failed_ms,
202
+ read_error: state.read_error,
192
203
  is_plan_loading: state.plan_fetch !== undefined,
193
204
  machine: state.gauges,
194
205
  usages: state.usages,
206
+ budget_waits: state.budget_waits,
195
207
  form: redraw.ports.form,
196
208
  repo: state.plan?.context.repo,
197
209
  spinner: redraw.ports.is_tty ? SPOT : undefined,
@@ -201,7 +213,7 @@ function header_of(
201
213
 
202
214
  // The pane a live frame is kept within and the footer it ends on, read at every redraw.
203
215
  function bounds_of(ports: BoardPorts): FrameBounds {
204
- return { size: ports.size?.(), footer: ports.footer }
216
+ return { size: ports.size?.(), footer: ports.footer, folded: ports.folded?.() }
205
217
  }
206
218
 
207
219
  // The frame with its spinners drawn at this moment's frame, and where they are on screen.
@@ -209,7 +221,11 @@ function frame_of(state: BoardState, local: LocalRead, layout: BoardLayout, redr
209
221
  const bounds = bounds_of(redraw.ports)
210
222
  const lines = run_board_render.render({
211
223
  header: header_of(state, local, layout, redraw),
212
- notes: run_board_notes.notes_of(local.events, titles_of(state)),
224
+ notes: run_board_notes.notes_of(
225
+ local.events,
226
+ titles_of(state),
227
+ run_board_layout.listed_parks(layout),
228
+ ),
213
229
  resume: local.resume,
214
230
  thanks: state.thanks,
215
231
  link: redraw.ports.link,
@@ -244,27 +260,30 @@ async function tick(
244
260
  ports: BoardPorts,
245
261
  pace: Pace = 'settled',
246
262
  ): Promise<BoardState> {
247
- const read = await reread(state, ports, pace)
263
+ const read = await ports.gather(pace)
248
264
  // Taken after the read, which a single frame may have waited on to confirm an idle lane.
249
265
  const now_ms = ports.now()
250
266
  const { local } = read
251
267
 
252
268
  if (local === undefined) {
253
- draw(ports, run_board_render.render_no_run(now_ms, bounds_of(ports)))
269
+ draw(ports, run_board_render.render_no_run(now_ms, bounds_of(ports), read))
254
270
 
255
- return { ...read, spots: [] }
271
+ return { ...state, ...read, spots: [] }
256
272
  }
257
273
 
258
- const gathered = await gather_github(state_for(read, local), { ports, local, now_ms, pace })
274
+ const gathered = await gather_github(state_for(state, read, local, ports), {
275
+ ports,
276
+ local,
277
+ now_ms,
278
+ pace,
279
+ })
259
280
  const thanked = await gather_thanks(gathered, ports, now_ms, pace)
260
281
 
261
- return draw_run(await resample(thanked, ports, now_ms), local, { ports, now_ms })
282
+ return draw_run(thanked, local, { ports, now_ms })
262
283
  }
263
284
 
264
285
  const run_board_tick = {
265
286
  FRESH_STATE,
266
- LOCAL_READ_MS,
267
- MACHINE_SAMPLE_MS,
268
287
  PLAN_RETRY_MS,
269
288
  REDRAW_MS,
270
289
  tick,
@@ -0,0 +1,78 @@
1
+ import type { TableRead } from '#scripts/lane/lane-process-table'
2
+ import { MS_PER_SECOND } from '#scripts/lib/timeouts'
3
+ import type { GatherPorts, GatherState } from './run-board-gather'
4
+ import type { BoardUsage } from './run-board-header'
5
+ import { run_board_process_groups, type GroupSources } from './run-board-process-groups'
6
+ import type { LocalRead } from './run-board-read'
7
+ import { run_board_usage, type ProcessFigures, type UsageMark } from './run-board-usage'
8
+
9
+ // What a reading draws: each lane's CPU/MEM/CMPRS and the 💻 section's groups, both from the same
10
+ // differences between this reading and the last. A frame drawn once has no last reading, so it reads
11
+ // twice a second apart; otherwise its CPU would be blank.
12
+
13
+ const PRIME_MS = MS_PER_SECOND
14
+
15
+ type UsageRead = Pick<GatherState, 'usage' | 'usages'>
16
+
17
+ // Before the first local read: no lane open, no root running, nothing stuck.
18
+ const NO_LOCAL: Pick<LocalRead, 'closing' | 'lanes' | 'roots' | 'stuck'> = { lanes: [] }
19
+
20
+ function sources_of(
21
+ mark: UsageMark,
22
+ figures: ProcessFigures,
23
+ local: LocalRead | undefined,
24
+ ): GroupSources {
25
+ const { closing = new Set(), lanes, roots = {}, stuck = new Map() } = local ?? NO_LOCAL
26
+
27
+ return { mark, figures, open_lanes: new Set(lanes.map(Number)), roots, stuck, closing }
28
+ }
29
+
30
+ function board_usage_of(
31
+ before: UsageMark | undefined,
32
+ after: UsageMark,
33
+ local: LocalRead | undefined,
34
+ ): BoardUsage {
35
+ const figures = run_board_usage.process_figures(before, after)
36
+
37
+ return {
38
+ lanes: run_board_usage.usage_of(after, figures),
39
+ processes: run_board_process_groups.groups_of(sources_of(after, figures, local)),
40
+ scale: { cores: after.cores, total_bytes: after.total_bytes },
41
+ }
42
+ }
43
+
44
+ // A primed frame's two readings each take a snapshot of their own: the redraw's was taken before the
45
+ // lane read's confirmation wait and the GitHub reads, so it would stretch the first second.
46
+ async function primed(
47
+ state: GatherState,
48
+ ports: GatherPorts,
49
+ table: TableRead,
50
+ ): Promise<{ before: UsageMark | undefined; table: TableRead }> {
51
+ if (ports.is_live || state.usage !== undefined) return { before: state.usage, table }
52
+
53
+ const first = await ports.read_usage(undefined, ports.read_table)
54
+
55
+ if (first !== undefined) await ports.sleep(PRIME_MS)
56
+
57
+ return { before: first, table: ports.read_table }
58
+ }
59
+
60
+ // Read on the machine's second; a reading that failed draws no usage but keeps the last reading, so the
61
+ // next reading after a `ps` timed out under load spans the gap.
62
+ async function read_usages(
63
+ state: GatherState,
64
+ ports: GatherPorts,
65
+ table: TableRead,
66
+ ): Promise<UsageRead> {
67
+ const primer = await primed(state, ports, table)
68
+ const { before } = primer
69
+ const usage = await ports.read_usage(before, primer.table)
70
+
71
+ if (usage === undefined) return { usage: before, usages: undefined }
72
+
73
+ return { usage, usages: board_usage_of(before, usage, state.local) }
74
+ }
75
+
76
+ const run_board_usage_board = { PRIME_MS, board_usage_of, read_usages }
77
+
78
+ export { run_board_usage_board }
@@ -0,0 +1,113 @@
1
+ import { process_directories } from '#scripts/lane/process-directories'
2
+
3
+ // Which lane `run:board` counts each listed process in.
4
+ // **The working directory first:** a process whose directory sits under this repository's
5
+ // `.kit-lanes/<N>` is lane N's — looked up once and remembered, since a process detached with
6
+ // `josh ship --detach` is re-parented and no longer traceable to its lane by its ancestry.
7
+ // **Its nearest ancestor's lane next:** a process whose directory names no lane — `lsof` did not
8
+ // answer for it, or it works outside the lane — is counted in the lane of the nearest ancestor that
9
+ // has one, so a gate's eslint started inside a lane is that lane's whatever its directory read gave.
10
+ // **A process a lookup cut short left out is asked again on the next sample**, never remembered as
11
+ // being in no lane: such a miss pinned a 130%-CPU eslint to none for its whole life
12
+ // (joshuafolkken/kit#4359). What it did answer is kept, so under sustained load each sample asks fewer
13
+ // rather than every process again. A process a finished `lsof` left out — another user's, which a
14
+ // non-root `lsof` never reads, or one gone — is remembered, since asking again would rerun `lsof` every
15
+ // second.
16
+
17
+ interface DirectoryRead {
18
+ // The working directory of each process that answered.
19
+ directories: ReadonlyMap<number, string>
20
+ // Whether the lookup ran to its end; a process missing from one cut short is asked again.
21
+ is_complete: boolean
22
+ }
23
+
24
+ interface LaneLookup {
25
+ directories: (pids: ReadonlyArray<number>) => Promise<DirectoryRead>
26
+ // The board's own lanes root.
27
+ root: string
28
+ }
29
+
30
+ interface ProcessLanes {
31
+ // Every listed process's lane, `undefined` for one under none.
32
+ lanes: ReadonlyMap<number, string | undefined>
33
+ // The processes whose lookup was cut short — asked again next time.
34
+ unread: ReadonlySet<number>
35
+ }
36
+
37
+ function directory_lane(directory: string | undefined, root: string): string | undefined {
38
+ return directory === undefined ? undefined : process_directories.lane_of(directory, root)
39
+ }
40
+
41
+ // The lanes still worth keeping: a gone process dropped, and one left unread asked again.
42
+ function remembered(
43
+ before: ProcessLanes | undefined,
44
+ parents: ReadonlyMap<number, number>,
45
+ ): Map<number, string | undefined> {
46
+ if (before === undefined) return new Map()
47
+
48
+ return new Map([...before.lanes].filter(([pid]) => parents.has(pid) && !before.unread.has(pid)))
49
+ }
50
+
51
+ // A process's ancestors, nearest first, each listed once.
52
+ function ancestors_of(pid: number, parents: ReadonlyMap<number, number>): Array<number> {
53
+ const chain: Array<number> = []
54
+ let ancestor = parents.get(pid)
55
+
56
+ while (ancestor !== undefined && !chain.includes(ancestor)) {
57
+ chain.push(ancestor)
58
+ ancestor = parents.get(ancestor)
59
+ }
60
+
61
+ return chain
62
+ }
63
+
64
+ function ancestor_lane(
65
+ pid: number,
66
+ known: ReadonlyMap<number, string | undefined>,
67
+ parents: ReadonlyMap<number, number>,
68
+ ): string | undefined {
69
+ return ancestors_of(pid, parents)
70
+ .map((ancestor) => known.get(ancestor))
71
+ .find((lane) => lane !== undefined)
72
+ }
73
+
74
+ // The working directories of `fresh`, with no lookup run when there is none to ask about.
75
+ async function directories_of(
76
+ fresh: ReadonlyArray<number>,
77
+ lookup: LaneLookup,
78
+ ): Promise<DirectoryRead> {
79
+ if (fresh.length === 0) return { directories: new Map(), is_complete: true }
80
+
81
+ return await lookup.directories(fresh)
82
+ }
83
+
84
+ function unread_of(fresh: ReadonlyArray<number>, read: DirectoryRead): Set<number> {
85
+ return new Set(read.is_complete ? [] : fresh.filter((pid) => !read.directories.has(pid)))
86
+ }
87
+
88
+ // The lanes of the processes `parents` lists: one not seen before, or left unread, looked up.
89
+ // The ancestry fallback assumes no long-lived process outside a lane's tree — a tmux server, a shell —
90
+ // was started inside `.kit-lanes/<N>`; one that was pulls its descendants into that lane.
91
+ async function lanes_for(
92
+ before: ProcessLanes | undefined,
93
+ parents: ReadonlyMap<number, number>,
94
+ lookup: LaneLookup,
95
+ ): Promise<ProcessLanes> {
96
+ const kept = remembered(before, parents)
97
+ const fresh = [...parents.keys()].filter((pid) => !kept.has(pid))
98
+ const read = await directories_of(fresh, lookup)
99
+ const found = fresh.map(
100
+ (pid) => [pid, directory_lane(read.directories.get(pid), lookup.root)] as const,
101
+ )
102
+ const known = new Map([...kept, ...found])
103
+ const lanes = [...known].map(
104
+ ([pid, lane]) => [pid, lane ?? ancestor_lane(pid, known, parents)] as const,
105
+ )
106
+
107
+ return { lanes: new Map(lanes), unread: unread_of(fresh, read) }
108
+ }
109
+
110
+ const run_board_usage_lanes = { lanes_for }
111
+
112
+ export { run_board_usage_lanes }
113
+ export type { DirectoryRead, LaneLookup, ProcessLanes }
@@ -0,0 +1,93 @@
1
+ import { existsSync } from 'node:fs'
2
+ import path from 'node:path'
3
+ import type { ProcessRow, ProcessTable } from '#scripts/lane/lane-process-table'
4
+ import { MS_PER_SECOND } from '#scripts/lib/timeouts'
5
+
6
+ // The usage columns' reading of one process snapshot (`lane-process-table.ts`), the same rows the lane
7
+ // count reads, so no second `ps` is spawned (joshuafolkken/kit#4246).
8
+ // **The executable is cut from the command line**, since the snapshot carries the full line rather than
9
+ // `comm`: an absolute path runs on across its spaces — `Application Support/`, `Visual Studio Code.app/`
10
+ // — to the shortest run of words that names an existing file, since the text alone cannot tell a spaced
11
+ // directory from a relative argument (`node scripts/foo.ts`). When no run exists, the path ends at the
12
+ // last word holding a directory before the first option or absolute path; a file name with a space of
13
+ // its own is then cut at it, which leaves the bundle that names an app whole.
14
+
15
+ const DAY_SEPARATOR = '-'
16
+ const CLOCK_SEPARATOR = ':'
17
+ const SECONDS_PER_DAY = 86_400
18
+ const SECONDS_PER_CLOCK_PART = 60
19
+ const BYTES_PER_KB = 1024
20
+ const WORD_SEPARATOR = ' '
21
+ const OPTION_PREFIX = '-'
22
+
23
+ // One process's line of the snapshot: its own CPU time and resident set.
24
+ interface ProcessListing {
25
+ parent: number
26
+ // The executable, which names the app the process belongs to.
27
+ command: string
28
+ cpu_ms: number
29
+ rss_bytes: number
30
+ }
31
+
32
+ // `ps`'s `time`, `[DD-][HH:]MM:SS[.ss]`, in milliseconds.
33
+ function cpu_ms_of(text: string): number {
34
+ const [days, clock = ''] = text.includes(DAY_SEPARATOR) ? text.split(DAY_SEPARATOR) : ['0', text]
35
+ const seconds = clock
36
+ .split(CLOCK_SEPARATOR)
37
+ .reduce((sum, part) => sum * SECONDS_PER_CLOCK_PART + Number(part), 0)
38
+
39
+ return (Number(days) * SECONDS_PER_DAY + seconds) * MS_PER_SECOND
40
+ }
41
+
42
+ // A word that opens an argument of its own: an option or another absolute path.
43
+ function opens_argument(word: string): boolean {
44
+ return word.startsWith(path.sep) || word.startsWith(OPTION_PREFIX)
45
+ }
46
+
47
+ // The absolute path's possible ends, shortest first: the first word, then each later word joined on.
48
+ function path_candidates(first: string, words: Array<string>): Array<string> {
49
+ return [
50
+ first,
51
+ ...words.map((_, index) => [first, ...words.slice(0, index + 1)].join(WORD_SEPARATOR)),
52
+ ]
53
+ }
54
+
55
+ /** The executable a command line runs: its first word, or an absolute path with its spaces kept. */
56
+ function executable_of(command: string): string {
57
+ const [first = '', ...rest] = command.split(WORD_SEPARATOR)
58
+
59
+ if (!first.startsWith(path.sep)) return first
60
+
61
+ const opened = rest.findIndex((word) => opens_argument(word))
62
+ const words = opened === -1 ? rest : rest.slice(0, opened)
63
+ const existing = path_candidates(first, words).find((candidate) => existsSync(candidate))
64
+
65
+ if (existing !== undefined) return existing
66
+
67
+ const last_directory = words.findLastIndex((word) => word.includes(path.sep))
68
+
69
+ return [first, ...words.slice(0, last_directory + 1)].join(WORD_SEPARATOR)
70
+ }
71
+
72
+ function listing_of(row: ProcessRow): [number, ProcessListing] | undefined {
73
+ const { pid, parent, time, rss_kb, command } = row
74
+ const cpu_ms = cpu_ms_of(time)
75
+
76
+ if (Number.isNaN(cpu_ms)) return undefined
77
+
78
+ const listing = { parent, command: executable_of(command), cpu_ms }
79
+
80
+ return [pid, { ...listing, rss_bytes: rss_kb * BYTES_PER_KB }]
81
+ }
82
+
83
+ /** Each row of the snapshot as its listing, by pid; a row whose CPU time does not read is left out. */
84
+ function listings_of(table: ProcessTable): Map<number, ProcessListing> {
85
+ const listings = table.map((row) => listing_of(row))
86
+
87
+ return new Map(listings.filter((listing) => listing !== undefined))
88
+ }
89
+
90
+ const run_board_usage_listing = { executable_of, listings_of }
91
+
92
+ export { run_board_usage_listing }
93
+ export type { ProcessListing }