@joshuafolkken/kit 1.1514.0 → 1.1784.0

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