@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,12 +1,26 @@
1
1
  import { closeSync, constants, openSync, writeSync } from 'node:fs'
2
2
  import { stamp_file } from '#scripts/josh/stamp-file'
3
3
  import { json_value } from '#scripts/lib/json-value'
4
+ import { stamped_memo } from '#scripts/lib/stamped-memo'
4
5
  import { run_carry } from '#scripts/run/carry/run-carry'
5
- import { z } from 'zod'
6
+ import {
7
+ lane_ledger_schema,
8
+ type CoreWaitRecord,
9
+ type GateRecord,
10
+ type HeldRecord,
11
+ type LedgerEntry,
12
+ type OverlapRecord,
13
+ type RoundTwoRecord,
14
+ type StageRecord,
15
+ type StopRecord,
16
+ type TestRelatedRecord,
17
+ type UnitFileRecord,
18
+ } from './lane-ledger-schema'
6
19
 
7
20
  // The measurement ledger the lane limit is tuned against: one JSON line per
8
21
  // lane merge, per finished `josh gate`, per machine-load sample, per lane dispatch, per finished
9
- // `josh ship` stage and per stopped `josh ship`, read back by `josh lane:stats`.
22
+ // `josh ship` stage, per stopped `josh ship`, per round-2 decision, per core-budget wait and per
23
+ // `josh test:related` run, read back by `josh lane:stats`. Each line's shape is `lane-ledger-schema.ts`.
10
24
  //
11
25
  // **Its own file rather than the run's event stream.** The stream is capped at 500 events and is
12
26
  // rewritten whole on every append, which is right for "where is the run" and wrong for a measurement
@@ -23,101 +37,20 @@ const LEDGER_SUFFIX = '.jsonl'
23
37
  const LINE_SEPARATOR = '\n'
24
38
  // `followup`'s wait for CI — a stage of a lane's run that no `josh ship` stage is the whole of.
25
39
  const CI_WAIT_STAGE = 'ci-wait'
40
+ // The part of `followup`'s waits CodeRabbit spent running or rate-limited, and the rate-limited part
41
+ // alone (joshuafolkken/kit#4574).
42
+ const CODERABBIT_WAIT_STAGE = 'coderabbit-wait'
43
+ const CODERABBIT_RATE_LIMIT_STAGE = 'coderabbit-rate-limit'
44
+ // A detached `josh ship`'s fast checks in the agent's own turn — not a resumable ship stage, since the
45
+ // supervised gate runs them again (joshuafolkken/kit#4382).
46
+ const PRE_DETACH_STAGE = 'pre-detach'
26
47
  const LEDGER_FILE_MODE = 0o600
27
48
  // The flags `detached-launch.ts` appends its log with, for the same deterministic shared-temp path.
28
49
  const { O_APPEND, O_CREAT, O_NOFOLLOW, O_WRONLY } = constants
29
50
  // eslint-disable-next-line no-bitwise -- POSIX open flags are a bit field; `||` here would be a bug
30
51
  const APPEND_FLAGS = O_WRONLY | O_APPEND | O_CREAT | O_NOFOLLOW
31
52
 
32
- const KIND = {
33
- MERGE: 'merge',
34
- GATE: 'gate',
35
- LOAD: 'load',
36
- DISPATCH: 'dispatch',
37
- STAGE: 'stage',
38
- STOP: 'stop',
39
- } as const
40
-
41
- const merge_schema = z.object({ kind: z.literal(KIND.MERGE), at: z.string(), issue: z.number() })
42
- const gate_schema = z.object({
43
- kind: z.literal(KIND.GATE),
44
- at: z.string(),
45
- elapsed_ms: z.number(),
46
- is_passed: z.boolean(),
47
- // The unit suite's own duration, present when this gate ran it — the one
48
- // record of a full vitest run `josh metrics` reads, so the suite is never timed twice.
49
- unit_ms: z.number().optional(),
50
- // The whole cores busy outside this gate, beyond the machine's baseline, at its start or its end —
51
- // whichever was higher. Absent when the machine could not be read.
52
- external_cores: z.number().optional(),
53
- })
54
- // `available_mb`, `swapped_mb` and `lanes` are optional because each read can fail on its own — a
55
- // platform with no memory reading, a `git worktree` call that did not answer — and a sample is still
56
- // worth its load. `swapped_mb` is `machine_capacity`'s counter, every page swapped since boot.
57
- // Both memory fields were renamed with their meaning (joshuafolkken/kit#3593): an older row's
58
- // `free_mb` / `swap_mb` are stripped on read, so the two measurements never share a column.
59
- const process_kind_schema = z.object({
60
- kind: z.string(),
61
- cpu_percent: z.number(),
62
- rss_mb: z.number(),
63
- count: z.number(),
64
- })
65
- const load_schema = z.object({
66
- kind: z.literal(KIND.LOAD),
67
- at: z.string(),
68
- load: z.number(),
69
- available_mb: z.number().optional(),
70
- swapped_mb: z.number().optional(),
71
- lanes: z.number().optional(),
72
- // The heaviest process kinds at the instant of the sample (`lane-process-load.ts`), so the load the
73
- // core budget's ledger does not explain can be read back by what made it (joshuafolkken/kit#3874).
74
- processes: z.array(process_kind_schema).optional(),
75
- })
76
- // A lane child started on `issue` — the instant its implementation is timed from.
77
- const dispatch_schema = z.object({
78
- kind: z.literal(KIND.DISPATCH),
79
- at: z.string(),
80
- issue: z.number(),
81
- })
82
- // One finished stage of a lane's run, passed or failed: `at` is its end and `elapsed_ms` its length, so
83
- // its start is read from the two. `issue` is absent where the writer does not hold one — `followup`'s
84
- // CI wait, which is timed on a path that fails before the issue is known.
85
- const stage_schema = z.object({
86
- kind: z.literal(KIND.STAGE),
87
- at: z.string(),
88
- stage: z.string(),
89
- elapsed_ms: z.number(),
90
- issue: z.number().optional(),
91
- })
92
- // A `josh ship` that stopped on `issue`: `reason` is the stage it stopped at, or `conflict` — the
93
- // retrospective's stop reason. How long it stayed stopped is derived from the next ship stage, not
94
- // recorded, so a resumed ship never has to know the stop it ends.
95
- const stop_schema = z.object({
96
- kind: z.literal(KIND.STOP),
97
- at: z.string(),
98
- issue: z.number(),
99
- reason: z.string(),
100
- })
101
- const entry_schema = z.discriminatedUnion('kind', [
102
- merge_schema,
103
- gate_schema,
104
- load_schema,
105
- dispatch_schema,
106
- stage_schema,
107
- stop_schema,
108
- ])
109
-
110
- type LedgerEntry = z.infer<typeof entry_schema>
111
- type MergeEntry = z.infer<typeof merge_schema>
112
- type GateEntry = z.infer<typeof gate_schema>
113
- type LoadEntry = z.infer<typeof load_schema>
114
- type DispatchEntry = z.infer<typeof dispatch_schema>
115
- type StageEntry = z.infer<typeof stage_schema>
116
- type StopEntry = z.infer<typeof stop_schema>
117
- // What a finished gate reports; the ledger stamps the kind and the time.
118
- type GateRecord = Omit<GateEntry, 'kind' | 'at'>
119
- type StageRecord = Omit<StageEntry, 'kind' | 'at'>
120
- type StopRecord = Omit<StopEntry, 'kind' | 'at'>
53
+ const { KIND, entry_schema } = lane_ledger_schema
121
54
 
122
55
  function target_of(repository: string): string {
123
56
  return stamp_file.stamp_path(LEDGER_PREFIX, repository, LEDGER_SUFFIX)
@@ -144,8 +77,8 @@ async function target(): Promise<string | undefined> {
144
77
 
145
78
  // **Append, never rewrite** — `O_APPEND` keeps each short line whole across concurrent writers, and
146
79
  // `O_NOFOLLOW` plus `stamp_file`'s ownership test keep a planted link or another account's file from
147
- // receiving it.
148
- function append(path: string, entry: LedgerEntry): void {
80
+ // receiving it. Any JSON-lines log takes it — the durable review stop log too (joshuafolkken/kit#4519).
81
+ function append(path: string, entry: object): void {
149
82
  const descriptor = openSync(path, APPEND_FLAGS, LEDGER_FILE_MODE)
150
83
 
151
84
  try {
@@ -194,6 +127,45 @@ async function record_stop(stop: StopRecord, path?: string): Promise<void> {
194
127
  await record({ kind: KIND.STOP, at: now_iso(), ...stop }, path)
195
128
  }
196
129
 
130
+ async function record_overlap(overlap: OverlapRecord, path?: string): Promise<void> {
131
+ await record({ kind: KIND.OVERLAP, at: now_iso(), ...overlap }, path)
132
+ }
133
+
134
+ // `waiting` is written only when the offer named issues, so a hold that waited on none stays one short line.
135
+ async function record_held(held: HeldRecord, path?: string): Promise<void> {
136
+ const waiting = held.waiting ?? []
137
+ const named = waiting.length > 0 ? { waiting: [...waiting] } : {}
138
+
139
+ await record({ kind: KIND.HELD, at: now_iso(), reason: held.reason, ...named }, path)
140
+ }
141
+
142
+ async function record_released(path?: string): Promise<void> {
143
+ await record({ kind: KIND.RELEASED, at: now_iso() }, path)
144
+ }
145
+
146
+ async function record_offerable(is_offerable: boolean, path?: string): Promise<void> {
147
+ await record({ kind: KIND.OFFERABLE, at: now_iso(), is_offerable }, path)
148
+ }
149
+
150
+ async function record_round_two(round_two: RoundTwoRecord, path?: string): Promise<void> {
151
+ await record({ kind: KIND.ROUND_TWO, at: now_iso(), ...round_two }, path)
152
+ }
153
+
154
+ async function record_core_wait(wait: CoreWaitRecord, path?: string): Promise<void> {
155
+ await record({ kind: KIND.CORE_WAIT, at: now_iso(), ...wait }, path)
156
+ }
157
+
158
+ async function record_unit_files(
159
+ files: ReadonlyArray<UnitFileRecord>,
160
+ path?: string,
161
+ ): Promise<void> {
162
+ await record({ kind: KIND.UNIT_FILES, at: now_iso(), files: [...files] }, path)
163
+ }
164
+
165
+ async function record_test_related(run: TestRelatedRecord, path?: string): Promise<void> {
166
+ await record({ kind: KIND.TEST_RELATED, at: now_iso(), ...run }, path)
167
+ }
168
+
197
169
  function parse_line(line: string): LedgerEntry | undefined {
198
170
  return entry_schema.safeParse(json_value.parse_or_undefined(line)).data
199
171
  }
@@ -202,9 +174,7 @@ function is_present(entry: LedgerEntry | undefined): entry is LedgerEntry {
202
174
  return entry !== undefined
203
175
  }
204
176
 
205
- // Every entry, oldest first. A malformed line — a write cut short — is skipped rather than making the
206
- // whole ledger unreadable, and an absent or unowned file is an empty ledger.
207
- function read_entries(path: string): ReadonlyArray<LedgerEntry> {
177
+ function parse_entries(path: string): ReadonlyArray<LedgerEntry> {
208
178
  const raw = stamp_file.read_stamp_text(path)
209
179
 
210
180
  if (raw === undefined) return []
@@ -215,20 +185,61 @@ function read_entries(path: string): ReadonlyArray<LedgerEntry> {
215
185
  .filter(is_present)
216
186
  }
217
187
 
188
+ // Each ledger's entries, parsed again only once the file itself has changed (joshuafolkken/kit#4263).
189
+ const parsed_ledgers = stamped_memo.create<ReadonlyArray<LedgerEntry>>()
190
+
191
+ // Every entry, oldest first. A malformed line — a write cut short — is skipped rather than making the
192
+ // whole ledger unreadable, and an absent or unowned file is an empty ledger.
193
+ function read_entries(path: string): ReadonlyArray<LedgerEntry> {
194
+ return parsed_ledgers.of(path, stamped_memo.file_stamp(path), () => parse_entries(path))
195
+ }
196
+
218
197
  const lane_ledger = {
219
198
  CI_WAIT_STAGE,
199
+ CODERABBIT_RATE_LIMIT_STAGE,
200
+ CODERABBIT_WAIT_STAGE,
220
201
  KIND,
202
+ PRE_DETACH_STAGE,
221
203
  append,
222
204
  read_entries,
223
205
  record,
206
+ record_core_wait,
224
207
  record_dispatch,
225
208
  record_gate,
209
+ record_held,
210
+ record_released,
226
211
  record_merge,
212
+ record_overlap,
213
+ record_offerable,
214
+ record_round_two,
227
215
  record_stage,
228
216
  record_stop,
217
+ record_test_related,
218
+ record_unit_files,
229
219
  target,
230
220
  target_of,
231
221
  }
232
222
 
233
- export type { DispatchEntry, GateEntry, LedgerEntry, LoadEntry, MergeEntry, StageEntry, StopEntry }
223
+ export type {
224
+ CoreWaitEntry,
225
+ CoreWaitRecord,
226
+ DispatchEntry,
227
+ GateCheckRecord,
228
+ GateEntry,
229
+ HeldEntry,
230
+ LedgerEntry,
231
+ LoadEntry,
232
+ MergeEntry,
233
+ OfferableEntry,
234
+ OverlapEntry,
235
+ OverlapRecord,
236
+ RoundTwoEntry,
237
+ StageEntry,
238
+ StopEntry,
239
+ StopRecord,
240
+ TestRelatedEntry,
241
+ TestRelatedRecord,
242
+ UnitFileRecord,
243
+ UnitFilesEntry,
244
+ } from './lane-ledger-schema'
234
245
  export { lane_ledger }
@@ -1,9 +1,11 @@
1
1
  #!/usr/bin/env tsx
2
2
  import { fileURLToPath } from 'node:url'
3
- import { backlog_ready } from '#scripts/backlog/backlog-ready'
3
+ import { backlog_ready, type LaneUse } from '#scripts/backlog/backlog-ready'
4
+ import { session_cite } from '#scripts/issue/session-cite'
4
5
  import { cli_flags } from '#scripts/lib/cli-flags'
5
6
  import { lane_capacity, type LimitChoice } from './lane-capacity'
6
7
  import { lane_limit_override } from './lane-limit-override'
8
+ import { lane_state } from './lane-state'
7
9
 
8
10
  // `josh lane:limit [<limit>] [--reset]` — change a live `backlogrun`'s lane limit without stopping it.
9
11
  // A running parent keeps the environment it started with, so `JOSH_LANE_LIMIT`
@@ -37,13 +39,13 @@ interface LimitPorts {
37
39
  read_override: () => Promise<number | undefined>
38
40
  write_override: (limit: number | undefined) => Promise<boolean>
39
41
  emit_raise: (text: string) => Promise<void>
40
- live_lane_count: () => Promise<number>
42
+ lane_use: () => Promise<LaneUse>
41
43
  }
42
44
 
43
45
  interface LimitStatus {
44
46
  limit: number
45
47
  override: number | undefined
46
- in_use: number
48
+ use: LaneUse
47
49
  }
48
50
 
49
51
  const SHOW: LimitRequest = { kind: 'show' }
@@ -55,7 +57,7 @@ const DEFAULT_PORTS: LimitPorts = {
55
57
  read_override: lane_limit_override.read_override,
56
58
  write_override: lane_limit_override.write_override,
57
59
  emit_raise: lane_limit_override.emit_raise,
58
- live_lane_count: backlog_ready.live_lane_count,
60
+ lane_use: backlog_ready.lane_use,
59
61
  }
60
62
 
61
63
  function refuse(message: string): number {
@@ -96,11 +98,21 @@ function limit_text(limit: number): string {
96
98
  : `${String(seated)} (${String(limit)} capped at the seats)`
97
99
  }
98
100
 
101
+ // The lanes with no state record, counted in use since their state is unknown.
102
+ function unknown_text(unknown: ReadonlyArray<string>): string {
103
+ if (unknown.length === 0) return ''
104
+
105
+ const issues = unknown.map((issue) => session_cite.issue(issue)).join(' ')
106
+
107
+ return ` · ${issues}: ${lane_state.NO_STATE_HINT}`
108
+ }
109
+
99
110
  function status_line(status: LimitStatus): string {
100
111
  const source = status.override === undefined ? lane_capacity.LANE_LIMIT_KEY : OVERRIDE_SOURCE
101
- const free = lane_capacity.free_lanes(status.limit, status.in_use)
112
+ const { occupied, seated } = status.use
113
+ const free = lane_capacity.free_lanes(status.limit, occupied, seated)
102
114
 
103
- return `lane limit ${limit_text(status.limit)} (${source}) · in use ${String(status.in_use)} · free ${String(free)}`
115
+ return `lane limit ${limit_text(status.limit)} (${source}) · in use ${String(occupied)} · free ${String(free)}${unknown_text(status.use.unknown)}`
104
116
  }
105
117
 
106
118
  async function show(ports: LimitPorts): Promise<number> {
@@ -110,9 +122,7 @@ async function show(ports: LimitPorts): Promise<number> {
110
122
 
111
123
  const override = await ports.read_override()
112
124
 
113
- console.info(
114
- status_line({ limit: choice.limit, override, in_use: await ports.live_lane_count() }),
115
- )
125
+ console.info(status_line({ limit: choice.limit, override, use: await ports.lane_use() }))
116
126
 
117
127
  return SUCCESS_EXIT_CODE
118
128
  }
@@ -1,14 +1,26 @@
1
1
  #!/usr/bin/env tsx
2
2
  import { setInterval as every } from 'node:timers/promises'
3
3
  import { fileURLToPath } from 'node:url'
4
+ import { cost_transcript } from '#scripts/cost-runtime/cost-transcript'
4
5
  import { cli_flags } from '#scripts/lib/cli-flags'
6
+ import { MS_PER_SECOND } from '#scripts/lib/timeouts'
7
+ import { run_event_stream, type RunEvent } from '#scripts/run/event/run-event-stream'
8
+ import { run_event_stream_emit } from '#scripts/run/event/run-event-stream-emit'
5
9
  import { lane_capacity } from './lane-capacity'
10
+ import { lane_check_stats } from './lane-check-stats'
11
+ import { lane_core_wait_stats } from './lane-core-wait-stats'
12
+ import { lane_gap_stats } from './lane-gap-stats'
13
+ import { lane_held_stats } from './lane-held-stats'
6
14
  import { lane_ledger } from './lane-ledger'
7
15
  import { lane_process_stats } from './lane-process-stats'
16
+ import { lane_round_two_stats } from './lane-round-two-stats'
8
17
  import { lane_sampler, type MeasureContext } from './lane-sampler'
9
18
  import { lane_stage_stats } from './lane-stage-stats'
10
- import { lane_stats } from './lane-stats'
19
+ import { lane_stats, type StatsWindow } from './lane-stats'
11
20
  import { lane_stop_stats } from './lane-stop-stats'
21
+ import { lane_test_related_stats } from './lane-test-related-stats'
22
+ import type { ToolCall } from './lane-transcript-calls'
23
+ import { lane_transcript_stats } from './lane-transcript-stats'
12
24
 
13
25
  // `josh lane:sample` / `josh lane:stats` — the lane-limit measurement.
14
26
  //
@@ -22,7 +34,6 @@ import { lane_stop_stats } from './lane-stop-stats'
22
34
 
23
35
  const ARGV_OFFSET = 2
24
36
  const FAILURE_EXIT_CODE = 1
25
- const MS_PER_SECOND = 1000
26
37
  const SAMPLE_VERB = 'sample'
27
38
  const STATS_VERB = 'stats'
28
39
  const USAGE = [
@@ -101,6 +112,45 @@ async function read_ledger(
101
112
  return path === undefined ? [] : lane_ledger.read_entries(path)
102
113
  }
103
114
 
115
+ // The run's event stream, read for the parks that end a stop's wait.
116
+ async function read_events(context: MeasureContext): Promise<ReadonlyArray<RunEvent>> {
117
+ if (context.events_path !== undefined) return run_event_stream.read_events(context.events_path)
118
+
119
+ return await run_event_stream_emit.all_events()
120
+ }
121
+
122
+ // Every lane's transcript directory under this checkout's lane root, read from a lane or the main checkout.
123
+ function transcript_directories(context: MeasureContext): ReadonlyArray<string> {
124
+ if (context.transcript_directories !== undefined) return context.transcript_directories
125
+
126
+ const main_cwd = cost_transcript.session_cwd(process.cwd())
127
+
128
+ return cost_transcript.lane_transcript_directories(main_cwd, cost_transcript.home_directory())
129
+ }
130
+
131
+ interface PeriodRecords {
132
+ entries: ReturnType<typeof lane_ledger.read_entries>
133
+ events: ReadonlyArray<RunEvent>
134
+ calls: ReadonlyArray<ToolCall>
135
+ }
136
+
137
+ // The tables under the period's row, in the order `lane:stats` prints them.
138
+ function tables_of({ entries, events, calls }: PeriodRecords, window: StatsWindow): Array<string> {
139
+ return [
140
+ lane_stage_stats.table(entries, window),
141
+ lane_stop_stats.table(entries, window, events),
142
+ lane_gap_stats.table(entries, window, events),
143
+ lane_round_two_stats.table(entries, window),
144
+ lane_held_stats.table(entries, window),
145
+ lane_core_wait_stats.table(entries, window),
146
+ lane_process_stats.table(entries, window),
147
+ lane_check_stats.table(entries, window),
148
+ lane_test_related_stats.table(entries, window),
149
+ lane_test_related_stats.trigger_table(entries, window),
150
+ lane_transcript_stats.table(calls, window),
151
+ ]
152
+ }
153
+
104
154
  async function stats_command(
105
155
  rest: ReadonlyArray<string>,
106
156
  context: MeasureContext,
@@ -114,15 +164,13 @@ async function stats_command(
114
164
  const label = { limit: await limit_label(values.limit), period_days }
115
165
  const entries = await read_ledger(context)
116
166
  const row = lane_stats.row(entries, window, label)
167
+ const records = {
168
+ entries,
169
+ events: await read_events(context),
170
+ calls: lane_transcript_stats.read_calls(transcript_directories(context), window),
171
+ }
117
172
 
118
- console.info(
119
- [
120
- `${lane_stats.header()}\n${row}`,
121
- lane_stage_stats.table(entries, window),
122
- lane_stop_stats.table(entries, window),
123
- lane_process_stats.table(entries, window),
124
- ].join('\n\n'),
125
- )
173
+ console.info([`${lane_stats.header()}\n${row}`, ...tables_of(records, window)].join('\n\n'))
126
174
 
127
175
  return 0
128
176
  }
@@ -13,6 +13,7 @@ import { lane_paths } from './lane-paths'
13
13
  import { lane_registry, type LaneInfo } from './lane-registry'
14
14
  import { lane_seed_policy } from './lane-seed'
15
15
  import { lane_start_point } from './lane-start-point'
16
+ import { lane_state } from './lane-state'
16
17
 
17
18
  // Opening a lane: one linked work tree, one branch, one port seed, and the dependencies to run in it.
18
19
  //
@@ -256,6 +257,13 @@ async function clear_the_way(
256
257
  await lane_leftover.reclaim(lane_paths.lane_directory(root, issue))
257
258
  }
258
259
 
260
+ // The lane's state record starts here, so no lane opened from now on is without one.
261
+ async function opened(lane: LaneInfo): Promise<OpenOutcome> {
262
+ await lane_state.record_change({ issue: lane.issue, state: 'open', command: 'lane:open' })
263
+
264
+ return { kind: 'opened', lane }
265
+ }
266
+
259
267
  /**
260
268
  * Open the lane for `issue`, or say why it was not opened.
261
269
  *
@@ -283,7 +291,7 @@ async function open_lane(issue: string): Promise<OpenOutcome> {
283
291
 
284
292
  await materialize(plan, repository_root)
285
293
 
286
- return { kind: 'opened', lane: plan.lane }
294
+ return await opened(plan.lane)
287
295
  }
288
296
 
289
297
  const lane_open = {
@@ -1,7 +1,7 @@
1
- import { has_label_name, NEEDS_DECISION_LABEL } from '#scripts/issue/issue-labels'
1
+ import { has_parked_label } from '#scripts/issue/issue-labels'
2
2
  import { issue_state_cli } from '#scripts/issue/issue-state-cli'
3
3
 
4
- // Whether an issue is parked for a person — the `needs-decision` label — read live, so a session a
4
+ // Whether an issue is parked for a person — any park label (`PARKED_LABELS`) — read live, so a session a
5
5
  // lane's broker would start for it is refused once the run has parked it (joshuafolkken/kit#3878).
6
6
  //
7
7
  // **An issue whose state cannot be read is not parked**: the read gates every brokered review, so
@@ -10,7 +10,7 @@ import { issue_state_cli } from '#scripts/issue/issue-state-cli'
10
10
  async function is_parked(issue: string): Promise<boolean> {
11
11
  const read = await issue_state_cli.read_issue(issue)
12
12
 
13
- return read.kind === 'state' && has_label_name(read.state.labels, NEEDS_DECISION_LABEL)
13
+ return read.kind === 'state' && has_parked_label(read.state.labels)
14
14
  }
15
15
 
16
16
  const lane_parked = { is_parked }
@@ -0,0 +1,130 @@
1
+ #!/usr/bin/env tsx
2
+ import { fileURLToPath } from 'node:url'
3
+ import { issue_cite } from '#scripts/issue/issue-cite'
4
+ import { issue_number_shape } from '#scripts/issue/issue-number-shape'
5
+ import { run_event_stream } from '#scripts/run/event/run-event-stream'
6
+ import { run_event_stream_emit } from '#scripts/run/event/run-event-stream-emit'
7
+ import { lane_pause, type LaneSignalled } from './lane-pause'
8
+ import type { LaneProcesses } from './lane-reap'
9
+ import { lane_registry } from './lane-registry'
10
+ import { lane_state } from './lane-state'
11
+
12
+ // `josh lane:pause <issue> | --all` and `josh lane:resume <issue> | --all` — one script told apart by
13
+ // the verb the registry passes first. A named lane with no child process to signal exits non-zero, so a
14
+ // caller never takes a pause that stopped nothing as done — a detached resident signalled alone counts
15
+ // as nothing. A lane whose detached processes could not be read exits non-zero too, since a resume
16
+ // may have left one of them stopped. A lane whose child was signalled has the change written to its state record and to the
17
+ // run's event stream, so who halted it is on record.
18
+
19
+ const ARGV_OFFSET = 2
20
+ const SUCCESS_EXIT_CODE = 0
21
+ const FAILURE_EXIT_CODE = 1
22
+ const ALL_FLAG = '--all'
23
+ const USAGE = [
24
+ 'Usage: josh lane:pause <issue-number> | josh lane:pause --all',
25
+ ' josh lane:resume <issue-number> | josh lane:resume --all',
26
+ ].join('\n')
27
+
28
+ const VERBS = {
29
+ pause: { act: 'pause_lane', done: 'paused', state: 'paused' },
30
+ resume: { act: 'resume_lane', done: 'resumed', state: 'running' },
31
+ } as const
32
+
33
+ type Verb = keyof typeof VERBS
34
+
35
+ function is_verb(value: string | undefined): value is Verb {
36
+ return value === 'pause' || value === 'resume'
37
+ }
38
+
39
+ async function lanes_of(target: ReadonlyArray<string>): Promise<Array<LaneProcesses> | undefined> {
40
+ const [issue, ...rest] = target
41
+
42
+ if (issue === undefined || rest.length > 0) return undefined
43
+ if (issue === ALL_FLAG) return await lane_pause.open_lanes()
44
+ if (!issue_number_shape.is_issue_number(issue)) return undefined
45
+
46
+ return [await lane_registry.lane_location(issue)]
47
+ }
48
+
49
+ function outcome_of(verb: Verb, result: LaneSignalled): string {
50
+ const { done } = VERBS[verb]
51
+ const count = String(result.signalled.length)
52
+
53
+ if (result.signalled.length === 0) return `no child process running — nothing ${done}`
54
+
55
+ if (result.child.length === 0) {
56
+ return `no child process running — ${done} ${count} detached process(es), state unchanged`
57
+ }
58
+
59
+ return `${done} ${count} process(es)`
60
+ }
61
+
62
+ const UNREAD_NOTE =
63
+ ' — could not read the detached processes (lsof or ps failed); any of them was missed'
64
+
65
+ // One line per lane: how many of its processes were signalled, and whether its residents went unread.
66
+ function report(verb: Verb, issue: string, result: LaneSignalled): void {
67
+ const note = result.is_unread ? UNREAD_NOTE : ''
68
+
69
+ console.info(`lane:${verb} ${issue_cite.plain(issue)}: ${outcome_of(verb, result)}${note}`)
70
+ }
71
+
72
+ async function record(verb: Verb, issue: string): Promise<void> {
73
+ const command = `lane:${verb}`
74
+
75
+ await lane_state.record_change({ issue, state: VERBS[verb].state, command })
76
+ await run_event_stream_emit.emit(
77
+ run_event_stream.EVENT_KIND.LANE_STATE,
78
+ `${issue_cite.plain(issue)} ${VERBS[verb].done} by ${command}`,
79
+ )
80
+ }
81
+
82
+ async function settle(verb: Verb, lane: LaneProcesses): Promise<LaneSignalled> {
83
+ const result = lane_pause[VERBS[verb].act](lane)
84
+
85
+ report(verb, lane.issue, result)
86
+ if (result.child.length > 0) await record(verb, lane.issue)
87
+
88
+ return result
89
+ }
90
+
91
+ // A named lane with no child signalled fails; any lane whose residents went unread fails.
92
+ function is_failed(result: LaneSignalled, is_named: boolean): boolean {
93
+ return result.is_unread || (is_named && result.child.length === 0)
94
+ }
95
+
96
+ async function apply(
97
+ verb: Verb,
98
+ lanes: ReadonlyArray<LaneProcesses>,
99
+ is_named: boolean,
100
+ ): Promise<number> {
101
+ const results = await Promise.all(lanes.map(async (lane) => await settle(verb, lane)))
102
+
103
+ return results.some((result) => is_failed(result, is_named))
104
+ ? FAILURE_EXIT_CODE
105
+ : SUCCESS_EXIT_CODE
106
+ }
107
+
108
+ function report_usage(): number {
109
+ console.error(USAGE)
110
+
111
+ return FAILURE_EXIT_CODE
112
+ }
113
+
114
+ async function run(argv: ReadonlyArray<string>): Promise<number> {
115
+ const [verb, ...target] = argv
116
+ if (!is_verb(verb)) return report_usage()
117
+ const lanes = await lanes_of(target)
118
+
119
+ return lanes === undefined ? report_usage() : await apply(verb, lanes, target[0] !== ALL_FLAG)
120
+ }
121
+
122
+ async function main(argv: ReadonlyArray<string>): Promise<void> {
123
+ process.exitCode = await run(argv)
124
+ }
125
+
126
+ const lane_pause_cli = { run }
127
+
128
+ if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
129
+
130
+ export { lane_pause_cli }