@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,80 +1,168 @@
1
1
  import { run_board_labels } from './run-board-labels'
2
- import { run_board_machine } from './run-board-machine'
3
- import type { LaneUsage } from './run-board-usage'
4
-
5
- // A running row's CPU and memory column: `⚡ 20% 🧠1.6G`, each figure green, yellow or red in the
6
- // header gauges' `GAUGE_SHADES`. **A lane's thresholds are its share of what the running lanes may
7
- // use together**: the header's yellow threshold (`CPU_YELLOW` / `MEMORY_YELLOW`), never the whole
8
- // machine — the OS, the IDE and the browser always hold some of it — divided by the running rows the
9
- // frame draws. A lane turns yellow at three quarters of its share and red past the share itself — on
10
- // an 18 GB machine at 3.2 and 4.2 GB with three lanes running, 1.2 and 1.6 GB with eight. One lane's
11
- // share is the header's own threshold, so it takes no color the header gauge would not; a lane that
12
- // ends widens the others' shares, and their colors may turn back.
13
-
14
- const { GAUGE_SHADES, HEADER_ICONS, minute_of, painted } = run_board_labels
15
- const { CPU_YELLOW, MEMORY_YELLOW, percent_text, threshold_alert } = run_board_machine
16
- const YELLOW_OF_SHARE = 0.75
2
+ import { run_board_machine, type Alert } from './run-board-machine'
3
+ import type { UsageFigure, UsageScale } from './run-board-usage'
4
+
5
+ // The CPU, memory and compressed-memory cells a lane row and a processes row draw: each a figure and a
6
+ // gauge, `16.4 ■─────` / ` 0.7 ■────`, a processes row's gauge full at the whole machine — the header's
7
+ // 💪 and 🧠 scale — a lane row's at its share (joshuafolkken/kit#4546), and its color the header gauges' own `GAUGE_SHADES`. CPU is a percentage of the whole
8
+ // machine, the header's 💪 unit, and memory is in GB; the column labels name neither unit.
9
+ //
10
+ // **A lane row's gauge is full at its share of what the running lanes may use together**
11
+ // (joshuafolkken/kit#3612): the header's yellow threshold (`CPU_YELLOW` / `MEMORY_YELLOW`), never the
12
+ // whole machine — the OS, the IDE and the browser always hold some of it — divided by the running rows
13
+ // the frame draws. A lane that ends widens the others' shares, and their gauges may shrink.
14
+ //
15
+ // **Both rows are shaded at the same two points of their full gauge** (joshuafolkken/kit#4570): yellow
16
+ // past half, red past nine tenths, so the third cell reads yellow and the fifth red. The header's own
17
+ // thresholds shade the header alone.
18
+
19
+ const { GAUGE_SHADES, bar_of } = run_board_labels
20
+ const { CPU_YELLOW, MEMORY_YELLOW } = run_board_machine
21
+ const ROW_YELLOW_OF_FULL = 50
22
+ const ROW_RED_OF_FULL = 90
17
23
  const BYTES_PER_KB = 1024
18
24
  const BYTES_PER_GB = BYTES_PER_KB * BYTES_PER_KB * BYTES_PER_KB
19
- const GB_DECIMALS = 1
20
- const PART_GAP = ' '
25
+ const PERCENT = 100
26
+ const DECIMALS = 1
27
+ const FIGURE_WIDTH = '99.9'.length
28
+ const GB_UNIT = 'G'
29
+ const PERCENT_UNIT = '%'
30
+ const CELL_GAP = ' '
31
+ const PLAIN_GAP = '/'
32
+ const NO_CORES = '-'
33
+
34
+ // Where a row's gauges are full, in percent of the machine: the CPU's, then both memories'.
35
+ interface CellLimits {
36
+ cpu: number
37
+ memory: number
38
+ }
21
39
 
22
- type Shade = (typeof GAUGE_SHADES)[keyof typeof GAUGE_SHADES]
40
+ const MACHINE_LIMITS: CellLimits = { cpu: PERCENT, memory: PERCENT }
23
41
 
24
- // A running lane's thresholds, in percent of the machine: its share of `pool_percent` among `running`.
25
- function lane_thresholds(pool_percent: number, running: number): { yellow: number; red: number } {
26
- const share = pool_percent / Math.max(1, running)
42
+ // The gauge is drawn full at `full`, and shaded at its fill.
43
+ interface Cell {
44
+ text: string | undefined
45
+ value: number
46
+ full: number
47
+ }
27
48
 
28
- return { yellow: share * YELLOW_OF_SHARE, red: share }
49
+ function gigabytes(bytes: number): string {
50
+ return (bytes / BYTES_PER_GB).toFixed(DECIMALS)
29
51
  }
30
52
 
31
- function shade_of(percent: number, pool_percent: number, running: number): Shade {
32
- return GAUGE_SHADES[threshold_alert(percent, lane_thresholds(pool_percent, running))]
53
+ function share_of(value: number, full: number): number {
54
+ return full === 0 ? 0 : (value / full) * PERCENT
33
55
  }
34
56
 
35
- // The first sample has no CPU figure, so a row draws its memory alone until the second.
36
- function cpu_part(cpu_percent: number | undefined, running: number): string | undefined {
37
- if (cpu_percent === undefined) return undefined
57
+ // The cores as a percentage of the machine's, `56.4`; a full machine is `100`, so the figure stays as
58
+ // wide as `99.9`.
59
+ function cpu_text(cores: number | undefined, scale: UsageScale): string | undefined {
60
+ if (cores === undefined) return undefined
38
61
 
39
- const shade = shade_of(cpu_percent, CPU_YELLOW, running)
62
+ const text = share_of(cores, scale.cores).toFixed(DECIMALS)
40
63
 
41
- return `${HEADER_ICONS.cpu}${painted(shade, percent_text(cpu_percent))}`
64
+ return Number(text) >= PERCENT ? String(PERCENT) : text
42
65
  }
43
66
 
44
- function memory_part(usage: LaneUsage, running: number): string {
45
- const figure = `${(usage.memory_bytes / BYTES_PER_GB).toFixed(GB_DECIMALS)}G`
46
- const shade = shade_of(usage.memory_percent, MEMORY_YELLOW, running)
67
+ // The columns a gauge takes after its figure — none where no gauge is drawn.
68
+ function gauge_width(gauge: number): number {
69
+ return gauge === 0 ? 0 : CELL_GAP.length + gauge
70
+ }
47
71
 
48
- return `${HEADER_ICONS.memory}${painted(shade, figure)}`
72
+ // A row gauge's color at `percent` of its full: yellow past half, red past nine tenths, each line itself
73
+ // still the color below it.
74
+ function row_alert(percent: number): Alert {
75
+ if (percent > ROW_RED_OF_FULL) return 'red'
76
+
77
+ return percent > ROW_YELLOW_OF_FULL ? 'yellow' : 'normal'
49
78
  }
50
79
 
51
- // `undefined` for a lane no process was found under; `running` is the frame's running rows.
52
- function text_of(usage: LaneUsage | undefined, running: number): string | undefined {
53
- if (usage === undefined) return undefined
80
+ function cell_text(cell: Cell, width: number, gauge: number): string {
81
+ if (cell.text === undefined) return CELL_GAP.repeat(width + gauge_width(gauge))
82
+
83
+ const figure = cell.text.padStart(width)
54
84
 
55
- return [cpu_part(usage.cpu_percent, running), memory_part(usage, running)]
56
- .filter((part) => part !== undefined)
57
- .join(PART_GAP)
85
+ if (gauge === 0) return figure
86
+
87
+ const shade = GAUGE_SHADES[row_alert(share_of(cell.value, cell.full))]
88
+
89
+ return `${figure}${CELL_GAP}${bar_of(cell.value, cell.full, gauge, shade)}`
58
90
  }
59
91
 
60
- // The day a settled row finished, `10/8 `, where that is not the board's own day.
61
- function day_of(ended_ms: number, now_ms: number): string {
62
- const ended = new Date(ended_ms)
92
+ // A running lane's share, in percent of the machine: `pool_percent` divided among `running`.
93
+ function lane_share(pool_percent: number, running: number): number {
94
+ return pool_percent / Math.max(1, running)
95
+ }
63
96
 
64
- if (ended.toDateString() === new Date(now_ms).toDateString()) return ''
97
+ // A lane row's limits with `running` lanes drawn: each gauge full at its share of the header's yellow
98
+ // threshold (joshuafolkken/kit#4546).
99
+ function lane_limits(running: number): CellLimits {
100
+ return { cpu: lane_share(CPU_YELLOW, running), memory: lane_share(MEMORY_YELLOW, running) }
101
+ }
65
102
 
66
- return `${String(ended.getMonth() + 1)}/${String(ended.getDate())} `
103
+ function cell_of(text: string | undefined, value: number, full: number): Cell {
104
+ return { text, value, full }
67
105
  }
68
106
 
69
- // A settled row's finish time, drawn in the usage column: `🔚 14:05`, or
70
- // `🔚 10/8 14:05` on another day; `undefined` for a row settled with no recorded end. 🔚 is the
71
- // header's own end mark — 🏁 is already a done row's state icon.
72
- function finish_of(ended_ms: number | undefined, now_ms: number): string | undefined {
73
- if (ended_ms === undefined) return undefined
107
+ function cells_from(figure: UsageFigure, scale: UsageScale, limits: CellLimits): Array<Cell> {
108
+ const { cpu_cores, memory_bytes, compressed_bytes } = figure
109
+ const cores = (scale.cores * limits.cpu) / PERCENT
110
+ const bytes = (scale.total_bytes * limits.memory) / PERCENT
74
111
 
75
- return `${HEADER_ICONS.ended} ${day_of(ended_ms, now_ms)}${minute_of(ended_ms)}`
112
+ return [
113
+ cell_of(cpu_text(cpu_cores, scale), cpu_cores ?? 0, cores),
114
+ cell_of(gigabytes(memory_bytes), memory_bytes, bytes),
115
+ cell_of(gigabytes(compressed_bytes), compressed_bytes, bytes),
116
+ ]
76
117
  }
77
118
 
78
- const run_board_usage_text = { finish_of, lane_thresholds, text_of }
119
+ // Each cell's width before its gauge: the CPU's text, then the two memories'.
120
+ function text_widths(): Array<number> {
121
+ return [FIGURE_WIDTH, FIGURE_WIDTH, FIGURE_WIDTH]
122
+ }
123
+
124
+ // Each cell's width in columns, so a heading can put a column's label over it.
125
+ function cell_widths(gauge: number): Array<number> {
126
+ return text_widths().map((width) => width + gauge_width(gauge))
127
+ }
128
+
129
+ // The CPU, MEM and CMPRS cells, each `gauge` columns of bar after its figure — the figure alone at a
130
+ // `gauge` of 0, where a frame is not drawn on a terminal; a row with no figure, or
131
+ // a figure from the first sample with no CPU yet, draws blanks of the same width in the cell it lacks.
132
+ // Filled and shaded at `limits`, the whole machine's unless a lane row passes its share.
133
+ function cells_of(
134
+ figure: UsageFigure | undefined,
135
+ scale: UsageScale,
136
+ gauge: number,
137
+ limits: CellLimits = MACHINE_LIMITS,
138
+ ): Array<string> {
139
+ if (figure === undefined) return cell_widths(gauge).map((width) => CELL_GAP.repeat(width))
140
+
141
+ const widths = text_widths()
142
+
143
+ return cells_from(figure, scale, limits).map((cell, index) =>
144
+ cell_text(cell, widths[index] ?? 0, gauge),
145
+ )
146
+ }
147
+
148
+ // A figure on one line where no gauge is drawn, and so no column label names the units:
149
+ // `56.4%/0.7G/0.6G`, `-` for cores not read yet.
150
+ function plain_of(figure: UsageFigure, scale: UsageScale): string {
151
+ const cpu = cpu_text(figure.cpu_cores, scale)
152
+ const memories = [figure.memory_bytes, figure.compressed_bytes].map(
153
+ (bytes) => `${gigabytes(bytes)}${GB_UNIT}`,
154
+ )
155
+
156
+ return [cpu === undefined ? NO_CORES : `${cpu}${PERCENT_UNIT}`, ...memories].join(PLAIN_GAP)
157
+ }
158
+
159
+ const run_board_usage_text = {
160
+ cell_widths,
161
+ cells_of,
162
+ lane_limits,
163
+ lane_share,
164
+ plain_of,
165
+ }
79
166
 
80
167
  export { run_board_usage_text }
168
+ export type { CellLimits }
@@ -0,0 +1,102 @@
1
+ import { execa } from 'execa'
2
+
3
+ // Each process's memory and compressed memory as `top`'s MEM and CMPRS count them — the columns
4
+ // Activity Monitor's "Memory" and "Compressed Memory" show. Compressed pages are what a resident set
5
+ // leaves out: `eslint_d` holds about 28 MB resident against 1 GB in `top`'s MEM (joshuafolkken/kit#4171).
6
+ // **CMPRS has no cheaper reader**: `proc_pid_rusage` carries the footprint (MEM) but no compressed
7
+ // count, and `top -l 1` costs about 1.1 s of system CPU against `ps`'s 30 ms. So `top` runs at most once
8
+ // every 30 s, in the background, and the board draws the last reading; only the very first read waits.
9
+
10
+ const TOP_ARGUMENTS = ['-l', '1', '-F', '-R', '-stats', 'pid,mem,cmprs']
11
+ const TOP_INTERVAL_MS = 30_000
12
+ // `top -l 1` samples for about a second and lists every process; `PROBE_TIMEOUT_MS` is sized for `ps`.
13
+ const TOP_TIMEOUT_MS = 10_000
14
+ const BYTES_PER_UNIT = 1024
15
+ // `top`'s size units, each 1024 times the one before.
16
+ const SIZE_UNITS = ['B', 'K', 'M', 'G', 'T']
17
+ // A size such as `3904K`, `154M+` or `1.2G-` — the sign marks a change since the last sample.
18
+ const SIZE_PATTERN = /^(\d+(?:\.\d+)?)([BKMGT])[+-]?$/u
19
+ const TOP_LINE = /^\s*(\d+)\s+(\S+)\s+(\S+)\s*$/u
20
+
21
+ interface TopReading {
22
+ memory_bytes: number
23
+ compressed_bytes: number
24
+ }
25
+
26
+ // Each process's `top` reading by its pid.
27
+ type TopReadings = ReadonlyMap<number, TopReading>
28
+
29
+ interface TopPorts {
30
+ // `top`'s one-sample listing.
31
+ list: () => Promise<string>
32
+ now: () => number
33
+ }
34
+
35
+ // `NaN` for a field that is not a size, such as the `MEM` column heading.
36
+ function bytes_of(text = ''): number {
37
+ const [, amount, unit = ''] = SIZE_PATTERN.exec(text) ?? []
38
+
39
+ return Number(amount) * BYTES_PER_UNIT ** SIZE_UNITS.indexOf(unit)
40
+ }
41
+
42
+ function top_line(line: string): [number, TopReading] | undefined {
43
+ const [, pid, memory, compressed] = TOP_LINE.exec(line) ?? []
44
+ const reading = { memory_bytes: bytes_of(memory), compressed_bytes: bytes_of(compressed) }
45
+
46
+ if (Number.isNaN(reading.memory_bytes + reading.compressed_bytes)) return undefined
47
+
48
+ return [Number(pid), reading]
49
+ }
50
+
51
+ function parse_top(output: string): Map<number, TopReading> {
52
+ const lines = output.split('\n').map((line) => top_line(line))
53
+
54
+ return new Map(lines.filter((line) => line !== undefined))
55
+ }
56
+
57
+ interface TopHeld {
58
+ readings: TopReadings | undefined
59
+ read_ms: number
60
+ pending: Promise<TopReadings> | undefined
61
+ }
62
+
63
+ // A read that fails keeps the earlier readings, and an empty map where there were none.
64
+ async function refreshed(held: TopHeld, ports: TopPorts): Promise<TopReadings> {
65
+ try {
66
+ held.readings = parse_top(await ports.list())
67
+ } catch {
68
+ held.readings ??= new Map()
69
+ } finally {
70
+ held.pending = undefined
71
+ }
72
+
73
+ return held.readings
74
+ }
75
+
76
+ // The last reading, with a fresh `top` started in the background once it is `TOP_INTERVAL_MS` old;
77
+ // only the first read, which has none to draw, waits for it.
78
+ function top_reader(ports: TopPorts): () => Promise<TopReadings> {
79
+ const held: TopHeld = { readings: undefined, read_ms: -Infinity, pending: undefined }
80
+
81
+ async function read(): Promise<TopReadings> {
82
+ if (held.pending === undefined && ports.now() - held.read_ms >= TOP_INTERVAL_MS) {
83
+ held.read_ms = ports.now()
84
+ held.pending = refreshed(held, ports)
85
+ }
86
+
87
+ return held.readings ?? (await (held.pending ?? Promise.resolve(new Map())))
88
+ }
89
+
90
+ return read
91
+ }
92
+
93
+ async function list_top(): Promise<string> {
94
+ const { stdout } = await execa('top', TOP_ARGUMENTS, { timeout: TOP_TIMEOUT_MS })
95
+
96
+ return stdout
97
+ }
98
+
99
+ const run_board_usage_top = { TOP_INTERVAL_MS, TOP_TIMEOUT_MS, list_top, parse_top, top_reader }
100
+
101
+ export { run_board_usage_top }
102
+ export type { TopPorts, TopReading, TopReadings }
@@ -1,66 +1,61 @@
1
- // Each lane's CPU and memory on its `run:board` row: which lane is loading the machine the header's ⚡
2
- // and 🧠 show. How the processes are read is `run-board-usage-read.ts`'s; this file turns two readings
3
- // into each lane's figures.
1
+ // Each process's CPU, memory and compressed memory on `run:board`: which lane, which part of the
2
+ // backlogrun, or which app outside it is loading the machine the header's 💪 and 🧠 show. How the
3
+ // processes are read is `run-board-usage-read.ts`'s, how they are grouped `run-board-process-groups.ts`'s;
4
+ // this file turns two readings into each process's figures and each lane's sum.
4
5
  //
5
- // A lane's CPU is its processes' CPU time between two samples as a share of the whole machine — the
6
- // header's ⚡ scale, so the two read side by side, never Activity Monitor's one-core-is-100% — and its
7
- // memory the sum of their resident sets. Shared pages are counted once per process, so the figure is
8
- // larger than what the kernel holds; it compares lanes, which is all the column is for.
9
-
10
- const PERCENT = 100
6
+ // CPU is a process's CPU time between two samples in cores, drawn as a percentage of the machine's
7
+ // cores — the header's 💪 unit, never Activity Monitor's one-core-is-100% — and memory what `top`'s
8
+ // MEM and CMPRS count, so the figures read the same in the lane rows and the processes section.
11
9
 
12
10
  interface ProcessReading {
13
11
  cpu_ms: number
14
- rss_bytes: number
12
+ memory_bytes: number
13
+ compressed_bytes: number
15
14
  }
16
15
 
17
16
  interface UsageMark {
18
17
  at_ms: number
19
18
  processes: ReadonlyMap<number, ProcessReading>
20
- // Every listed process's lane, `undefined` for one under none — kept so each is looked up once.
19
+ // Every listed process's lane — its working directory's, else its nearest ancestor's — `undefined`
20
+ // for one under none; kept so each directory is looked up once (`run-board-usage-lanes.ts`).
21
21
  lanes: ReadonlyMap<number, string | undefined>
22
- // Each process's parent, kept only where the counts fold in the children each reaped — empty on the
23
- // `ps` path, so nothing is deducted there.
22
+ // The processes an `lsof` cut short was asked about, asked again on the next sample.
23
+ unread: ReadonlySet<number>
24
+ // Each process's command, which names the app it belongs to.
25
+ names: ReadonlyMap<number, string>
26
+ // Each process's parent: the ancestry the processes section groups by, and the way to the ancestor
27
+ // a gone process's reaped time landed in.
24
28
  parents: ReadonlyMap<number, number>
25
29
  // The processes whose count was read with its reaped children folded in — one whose own read failed
26
- // keeps the larger of `ps`'s own time and its last reading, so nothing reaped is taken off it.
30
+ // keeps the larger of `ps`'s own time and its last reading, so nothing reaped is taken off it. Empty
31
+ // on the `ps` path, so nothing is deducted there.
27
32
  folded: ReadonlySet<number>
28
33
  cores: number
29
34
  total_bytes: number
30
35
  }
31
36
 
32
- // The CPU share is `undefined` on the first sample, which has nothing to take a difference from.
33
- interface LaneUsage {
34
- cpu_percent: number | undefined
37
+ // What one process or group uses. The cores are `undefined` on the first sample, which has nothing to
38
+ // take a difference from.
39
+ interface UsageFigure {
40
+ cpu_cores: number | undefined
35
41
  memory_bytes: number
36
- memory_percent: number
42
+ compressed_bytes: number
37
43
  }
38
44
 
39
- // Each lane's usage by its issue number.
40
- type LaneUsages = ReadonlyMap<number, LaneUsage>
45
+ // Each process's figure by its pid.
46
+ type ProcessFigures = ReadonlyMap<number, UsageFigure>
41
47
 
42
- interface LaneProcess {
43
- lane: string
44
- pid: number
45
- reading: ProcessReading
46
- }
48
+ // Each lane's figure by its issue number.
49
+ type LaneUsages = ReadonlyMap<number, UsageFigure>
47
50
 
48
- interface LaneTotal {
49
- cpu_ms: number
50
- rss_bytes: number
51
+ // The machine's cores and its physical memory: a processes row's gauge is full at them, a lane row's
52
+ // at its share of them.
53
+ interface UsageScale {
54
+ cores: number
55
+ total_bytes: number
51
56
  }
52
57
 
53
- const NO_TOTAL: LaneTotal = { cpu_ms: 0, rss_bytes: 0 }
54
-
55
- function lane_processes(mark: UsageMark): Array<LaneProcess> {
56
- const processes = [...mark.processes].map(([pid, reading]) => {
57
- const lane = mark.lanes.get(pid)
58
-
59
- return lane === undefined ? undefined : { lane, pid, reading }
60
- })
61
-
62
- return processes.filter((lane_process) => lane_process !== undefined)
63
- }
58
+ const NO_FIGURE: UsageFigure = { cpu_cores: 0, memory_bytes: 0, compressed_bytes: 0 }
64
59
 
65
60
  // The nearest of a gone process's ancestors still running — the one whose reaped-children time it has
66
61
  // landed in. Walked through the last sample's parents, at most once round them. Where a parent between
@@ -101,65 +96,87 @@ function reaped_counted(before: UsageMark, after: UsageMark): Map<number, number
101
96
  function cpu_spent(
102
97
  before: UsageMark,
103
98
  counted: ReadonlyMap<number, number>,
104
- { pid, reading }: LaneProcess,
99
+ pid: number,
100
+ reading: ProcessReading,
105
101
  ): number {
106
102
  const earlier = (before.processes.get(pid)?.cpu_ms ?? 0) + (counted.get(pid) ?? 0)
107
103
 
108
104
  return Math.max(0, reading.cpu_ms - earlier)
109
105
  }
110
106
 
111
- function spent_of(
107
+ // The cores a process used since the last sample, `undefined` with none to take a difference from.
108
+ function cores_of(
112
109
  before: UsageMark | undefined,
113
110
  after: UsageMark,
114
- ): (process: LaneProcess) => number {
115
- if (before === undefined) return () => 0
111
+ ): ((pid: number, reading: ProcessReading) => number) | undefined {
112
+ const elapsed = before === undefined ? 0 : after.at_ms - before.at_ms
113
+
114
+ if (before === undefined || elapsed <= 0) return undefined
116
115
 
117
116
  const counted = reaped_counted(before, after)
118
117
 
119
- return (lane_process) => cpu_spent(before, counted, lane_process)
118
+ return (pid, reading) => cpu_spent(before, counted, pid, reading) / elapsed
119
+ }
120
+
121
+ function process_figures(
122
+ before: UsageMark | undefined,
123
+ after: UsageMark,
124
+ ): Map<number, UsageFigure> {
125
+ const cores = cores_of(before, after)
126
+ const figures = [...after.processes].map(([pid, reading]) => {
127
+ const { memory_bytes, compressed_bytes } = reading
128
+
129
+ return [pid, { cpu_cores: cores?.(pid, reading), memory_bytes, compressed_bytes }] as const
130
+ })
131
+
132
+ return new Map(figures)
120
133
  }
121
134
 
122
- function totals_of(before: UsageMark | undefined, after: UsageMark): Map<string, LaneTotal> {
123
- const totals = new Map<string, LaneTotal>()
124
- const spent = spent_of(before, after)
135
+ function cores_sum(left: number | undefined, right: number | undefined): number | undefined {
136
+ return left === undefined || right === undefined ? undefined : left + right
137
+ }
125
138
 
126
- for (const lane_process of lane_processes(after)) {
127
- const total = totals.get(lane_process.lane) ?? NO_TOTAL
139
+ // The figures' sum, its cores `undefined` where any one's are.
140
+ function sum_of(figures: Iterable<UsageFigure>): UsageFigure {
141
+ let sum = NO_FIGURE
128
142
 
129
- totals.set(lane_process.lane, {
130
- cpu_ms: total.cpu_ms + spent(lane_process),
131
- rss_bytes: total.rss_bytes + lane_process.reading.rss_bytes,
132
- })
143
+ for (const figure of figures) {
144
+ sum = {
145
+ cpu_cores: cores_sum(sum.cpu_cores, figure.cpu_cores),
146
+ memory_bytes: sum.memory_bytes + figure.memory_bytes,
147
+ compressed_bytes: sum.compressed_bytes + figure.compressed_bytes,
148
+ }
133
149
  }
134
150
 
135
- return totals
151
+ return sum
136
152
  }
137
153
 
138
- function cpu_percent(
139
- before: UsageMark | undefined,
140
- after: UsageMark,
141
- cpu_ms: number,
142
- ): number | undefined {
143
- const elapsed = before === undefined ? 0 : after.at_ms - before.at_ms
154
+ // Each group's sum, the group of each process given by `group_of`; one in none is left out.
155
+ function grouped_sums<Key>(
156
+ figures: ProcessFigures,
157
+ group_of: (pid: number) => Key | undefined,
158
+ ): Map<Key, UsageFigure> {
159
+ const sums = new Map<Key, UsageFigure>()
144
160
 
145
- return elapsed <= 0 ? undefined : (cpu_ms / (elapsed * after.cores)) * PERCENT
146
- }
161
+ for (const [pid, figure] of figures) {
162
+ const group = group_of(pid)
147
163
 
148
- function lane_usage(before: UsageMark | undefined, after: UsageMark, total: LaneTotal): LaneUsage {
149
- return {
150
- cpu_percent: cpu_percent(before, after, total.cpu_ms),
151
- memory_bytes: total.rss_bytes,
152
- memory_percent: (total.rss_bytes / after.total_bytes) * PERCENT,
164
+ if (group !== undefined) sums.set(group, sum_of([sums.get(group) ?? NO_FIGURE, figure]))
153
165
  }
166
+
167
+ return sums
154
168
  }
155
169
 
156
- function usage_of(before: UsageMark | undefined, after: UsageMark): LaneUsages {
157
- const totals = [...totals_of(before, after)]
170
+ function lane_number(lane: string | undefined): number | undefined {
171
+ return lane === undefined ? undefined : Number(lane)
172
+ }
158
173
 
159
- return new Map(totals.map(([lane, total]) => [Number(lane), lane_usage(before, after, total)]))
174
+ // Each lane's processes' sum, by each process's lane in `mark.lanes`.
175
+ function usage_of(mark: UsageMark, figures: ProcessFigures): LaneUsages {
176
+ return grouped_sums(figures, (pid) => lane_number(mark.lanes.get(pid)))
160
177
  }
161
178
 
162
- const run_board_usage = { usage_of }
179
+ const run_board_usage = { grouped_sums, process_figures, sum_of, usage_of }
163
180
 
164
181
  export { run_board_usage }
165
- export type { LaneUsage, LaneUsages, ProcessReading, UsageMark }
182
+ export type { LaneUsages, ProcessFigures, ProcessReading, UsageFigure, UsageMark, UsageScale }
@@ -1,5 +1,6 @@
1
- import { lane_ledger, type LedgerEntry } from '#scripts/lane/lane-ledger'
1
+ import type { LedgerEntry } from '#scripts/lane/lane-ledger'
2
2
  import { lane_stage_stats } from '#scripts/lane/lane-stage-stats'
3
+ import { lane_stats } from '#scripts/lane/lane-stats'
3
4
  import { run_board_phase, type Phase } from './run-board-phase'
4
5
 
5
6
  // How long each phase usually takes: the lane ledger's median of the stage the phase is
@@ -7,10 +8,15 @@ import { run_board_phase, type Phase } from './run-board-phase'
7
8
  // (joshuafolkken/kit#3769). A phase is a `josh ship` stage under the names `run-board-phase.ts` gives
8
9
  // them, and `implement` is the ledger's derived one. A phase no stage records — `investigate`, `plan`,
9
10
  // `failed` — has no usual time, and is never drawn as long.
11
+ //
12
+ // **The median is the recent one** (joshuafolkken/kit#4319): only the last `PERIOD_DAYS` of the
13
+ // ledger count, so a faster season long past never pulls the estimate down; a stage with nothing that
14
+ // recent falls back to the whole ledger's median.
10
15
 
11
16
  type UsualTimes = ReadonlyMap<Phase, number>
12
17
 
13
18
  const IMPLEMENT_PHASE: Phase = 'implement'
19
+ const PERIOD_DAYS = 3
14
20
 
15
21
  // Each phase's ledger stage, from the stage-to-phase names a row's phase is drawn with. The ledger's
16
22
  // `implement` runs from the dispatch, so it also holds the investigation and the plan the row draws
@@ -21,8 +27,18 @@ const PHASE_STAGES: ReadonlyArray<readonly [string, Phase | undefined]> = [
21
27
  ...Object.entries(run_board_phase.SHIP_PHASES),
22
28
  ]
23
29
 
24
- function usual_of(entries: ReadonlyArray<LedgerEntry>): UsualTimes {
25
- const medians = lane_stage_stats.medians(entries)
30
+ // Per stage, so a run's first lanes — dispatched, no stage recorded yet — still draw every phase.
31
+ function medians_of(
32
+ entries: ReadonlyArray<LedgerEntry>,
33
+ now_ms: number,
34
+ ): ReadonlyMap<string, number> {
35
+ const recent = lane_stats.in_window(entries, lane_stats.window_of(PERIOD_DAYS, now_ms))
36
+
37
+ return new Map([...lane_stage_stats.medians(entries), ...lane_stage_stats.medians(recent)])
38
+ }
39
+
40
+ function usual_of(entries: ReadonlyArray<LedgerEntry>, now_ms: number): UsualTimes {
41
+ const medians = medians_of(entries, now_ms)
26
42
 
27
43
  return new Map(
28
44
  PHASE_STAGES.flatMap(([stage, phase]) => {
@@ -33,12 +49,7 @@ function usual_of(entries: ReadonlyArray<LedgerEntry>): UsualTimes {
33
49
  )
34
50
  }
35
51
 
36
- // The repository's whole ledger, read where the board reads its stream; an absent one has no usual time.
37
- function read(repository: string): UsualTimes {
38
- return usual_of(lane_ledger.read_entries(lane_ledger.target_of(repository)))
39
- }
40
-
41
- const run_board_usual = { read, usual_of }
52
+ const run_board_usual = { usual_of }
42
53
 
43
54
  export { run_board_usual }
44
55
  export type { UsualTimes }
@@ -13,7 +13,6 @@ const ONE_MERGE = 1
13
13
  // The four request groups below are mutually exclusive, so more than one of them named in a single
14
14
  // invocation is a usage error rather than an order to guess.
15
15
  const ONE_GROUP = 1
16
- const COUNT_PATTERN = /^\d+$/u
17
16
  const EMPTY_INVOCATION = ''
18
17
  // A pid below this addresses a process group rather than a process, which `process-identity.ts`
19
18
  // rejects on the read side. Refused here too, so a record never records an owner nothing can be.
@@ -87,7 +86,7 @@ function to_count(value: OptionValue): number | undefined {
87
86
 
88
87
  if (text === undefined) return NO_INCREMENT
89
88
 
90
- return COUNT_PATTERN.test(text) ? Number(text) : undefined
89
+ return cli_flags.to_count(text)
91
90
  }
92
91
 
93
92
  // **`--done` and `--merged` name an issue, so each is checked as one and not as a count.** The shape
@@ -105,7 +104,7 @@ function to_issue(value: OptionValue): { issue?: number } | undefined {
105
104
  const issue = Number(text)
106
105
 
107
106
  // The pattern is anchored on digits and bounds nothing, so the magnitude check is separate — the
108
- // same shape `backlog_budget_cli.to_count` ends with. A number past the safe range would be
107
+ // same shape `cli_flags.to_count` ends with. A number past the safe range would be
109
108
  // recorded as a different number and never match anything in `remaining`.
110
109
  return Number.isSafeInteger(issue) ? { issue } : undefined
111
110
  }
@@ -196,11 +195,9 @@ function to_owner(value: OptionValue): CarryOwner | undefined {
196
195
 
197
196
  if (text === undefined) return run_carry.NO_OWNER
198
197
 
199
- if (!COUNT_PATTERN.test(text)) return undefined
198
+ const pid = cli_flags.to_count(text)
200
199
 
201
- const pid = Number(text)
202
-
203
- return pid < MIN_PID ? undefined : marked(run_carry.owner_of(pid))
200
+ return pid === undefined || pid < MIN_PID ? undefined : marked(run_carry.owner_of(pid))
204
201
  }
205
202
 
206
203
  // A non-empty `--summary`, or nothing. An empty string is nothing here, so it reads as absent and the