@joshuafolkken/kit 1.1514.0 → 1.1784.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (858) hide show
  1. package/.claude/agents/investigator.md +1 -1
  2. package/.claude/settings.json +5 -5
  3. package/.claude/skills/epic-commands/SKILL.md +26 -65
  4. package/.claude/skills/epic-commands/epic-bundle.md +3 -1
  5. package/.claude/skills/workflow-commands/SKILL.md +5 -5
  6. package/.claude/skills/workflow-commands/background-commands.md +5 -5
  7. package/.claude/skills/workflow-commands/backlogrun-child.md +10 -8
  8. package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +7 -25
  9. package/.claude/skills/workflow-commands/backlogrun-lanes.md +17 -13
  10. package/.claude/skills/workflow-commands/backlogrun-park.md +14 -23
  11. package/.claude/skills/workflow-commands/backlogrun-progress.md +2 -2
  12. package/.claude/skills/workflow-commands/backlogrun-recovery.md +5 -5
  13. package/.claude/skills/workflow-commands/backlogrun-steps.md +10 -10
  14. package/.claude/skills/workflow-commands/backlogrun.md +1 -1
  15. package/.claude/skills/workflow-commands/chain-rule.md +13 -7
  16. package/.claude/skills/workflow-commands/delegation.md +6 -5
  17. package/.claude/skills/workflow-commands/entry-sequence.md +9 -9
  18. package/.claude/skills/workflow-commands/followup.md +9 -31
  19. package/.claude/skills/workflow-commands/fullrun-steps.md +36 -45
  20. package/.claude/skills/workflow-commands/fullrun.md +2 -2
  21. package/.claude/skills/workflow-commands/halfrun.md +17 -25
  22. package/.claude/skills/workflow-commands/issue-comments.md +16 -12
  23. package/.claude/skills/workflow-commands/issue-scout.md +2 -2
  24. package/.claude/skills/workflow-commands/kickoff.md +24 -23
  25. package/.claude/skills/workflow-commands/latest-gate.md +7 -12
  26. package/.claude/skills/workflow-commands/needs-human-review.md +9 -14
  27. package/.claude/skills/workflow-commands/observation-filing.md +4 -36
  28. package/.claude/skills/workflow-commands/observation-ledger.md +1 -1
  29. package/.claude/skills/workflow-commands/pre-gate-cut.md +13 -30
  30. package/.claude/skills/workflow-commands/prerequisite.md +10 -16
  31. package/.claude/skills/workflow-commands/progress-watcher.md +1 -1
  32. package/.claude/skills/workflow-commands/prrun.md +3 -7
  33. package/.claude/skills/workflow-commands/retrospective.md +1 -1
  34. package/.claude/skills/workflow-commands/split-assessment.md +13 -1
  35. package/.claude/skills/workflow-commands/working-tree-hold.md +9 -9
  36. package/.codex/hooks.json +5 -5
  37. package/.github/actions/setup-node/action.yml +9 -0
  38. package/.github/actions/setup-pnpm/action.yml +1 -1
  39. package/.github/dependabot.yml +16 -0
  40. package/.github/release.yml +0 -2
  41. package/.github/workflows/ci.yml +120 -10
  42. package/.github/workflows/publish.yml +8 -1
  43. package/.github/workflows/sonar-qube.yml +1 -0
  44. package/.prettierignore +2 -0
  45. package/.vscode/tasks.json +1 -2
  46. package/CLAUDE.md +3 -7
  47. package/README.md +4 -2
  48. package/SECURITY.md +1 -1
  49. package/dist/CLAUDE.md +3 -7
  50. package/dist/commands/document-read-cli.js +882 -0
  51. package/dist/commands/{document-section-cli.js → document-section-main.js} +79 -37
  52. package/dist/commands/read-set-cli.js +1867 -0
  53. package/dist/commands/run-prep-main.js +21653 -0
  54. package/dist/commands/run-step-cli.js +23880 -0
  55. package/dist/config-merge/index.js +5 -1
  56. package/dist/hooks/audit-provision.js +20 -35
  57. package/dist/hooks/{chunk-DGT54IH5.js → chunk-AZX4FGQ3.js} +63 -17
  58. package/dist/hooks/chunk-CWMBGKYW.js +6483 -0
  59. package/dist/hooks/chunk-O2YBIDSI.js +4306 -0
  60. package/dist/hooks/{chunk-TNUMY6NL.js → chunk-PT5R6UJD.js} +4193 -1900
  61. package/dist/hooks/chunk-TUIFS5E7.js +72 -0
  62. package/dist/hooks/{chunk-723HKZO5.js → chunk-VWWCFGWK.js} +1 -1
  63. package/dist/hooks/{chunk-APUO6U4J.js → chunk-WR2KQAYZ.js} +1843 -440
  64. package/dist/hooks/{chunk-O6GDRNJB.js → chunk-XGBNSWEI.js} +248 -46
  65. package/dist/hooks/chunk-YCDOIR3I.js +3456 -0
  66. package/dist/hooks/codex-hook-adapter.js +10 -22
  67. package/dist/hooks/format-edited.js +5 -6
  68. package/dist/hooks/inputs.json +443 -317
  69. package/dist/hooks/pretool-guard.js +7 -25
  70. package/dist/hooks/session-lang.js +44 -51
  71. package/dist/hooks/stop-guard.js +7716 -2187
  72. package/dist/josh.js +6002 -3583
  73. package/dist/self-sync-guard/index.js +74 -10
  74. package/dist/version/index.js +115 -406
  75. package/eslint/base.js +1 -1
  76. package/lefthook/base.yml +3 -1
  77. package/package.json +10 -48
  78. package/pnpm-workspace.yaml +4 -2
  79. package/prompts/coding-standards.md +1 -1
  80. package/prompts/collaboration-workflow/file-edits.md +1 -7
  81. package/prompts/collaboration-workflow/issue-citation.md +1 -1
  82. package/prompts/collaboration-workflow/issue-template.md +33 -16
  83. package/prompts/collaboration-workflow/lane-instructions.md +1 -2
  84. package/prompts/collaboration-workflow/measurement.md +37 -0
  85. package/prompts/collaboration-workflow/operating-rules.md +4 -6
  86. package/prompts/collaboration-workflow/output-bounds.md +2 -7
  87. package/prompts/collaboration-workflow/plan-comment.md +3 -42
  88. package/prompts/collaboration-workflow/principles.md +5 -0
  89. package/prompts/collaboration-workflow/report-format.md +31 -60
  90. package/prompts/collaboration-workflow/residency.md +2 -2
  91. package/prompts/collaboration-workflow/shell-body.md +6 -16
  92. package/prompts/collaboration-workflow/turn-batching.md +0 -2
  93. package/prompts/collaboration-workflow/upstream-interrupt.md +14 -4
  94. package/prompts/collaboration-workflow/wip-cap.md +1 -1
  95. package/prompts/collaboration-workflow.md +3 -7
  96. package/prompts/refactoring.md +1 -1
  97. package/prompts/review-rubric.md +1 -2
  98. package/prompts/review.md +41 -21
  99. package/prompts/testing-guide.md +8 -43
  100. package/scripts/agent/agent-event.ts +15 -15
  101. package/scripts/agent/agent-exit-record.ts +13 -1
  102. package/scripts/agent/api-auth.ts +41 -0
  103. package/scripts/agent/api-outage.ts +1 -1
  104. package/scripts/auto-ok/auto-ok-cli.ts +14 -16
  105. package/scripts/auto-ok/auto-ok-judge-read.ts +12 -3
  106. package/scripts/auto-ok/auto-ok-judge-write.ts +46 -19
  107. package/scripts/auto-ok/auto-ok-judge.ts +13 -2
  108. package/scripts/auto-ok/auto-ok-main.ts +17 -0
  109. package/scripts/backlog/backlog-arrival.ts +14 -3
  110. package/scripts/backlog/backlog-budget-cli.ts +7 -33
  111. package/scripts/backlog/backlog-budget-main.ts +16 -0
  112. package/scripts/backlog/backlog-budget.ts +2 -3
  113. package/scripts/backlog/backlog-defect-priority.ts +4 -3
  114. package/scripts/backlog/backlog-drive-adopt.ts +67 -0
  115. package/scripts/backlog/backlog-drive-args.ts +4 -5
  116. package/scripts/backlog/backlog-drive-cli.ts +113 -28
  117. package/scripts/backlog/backlog-drive-hold.ts +162 -0
  118. package/scripts/backlog/backlog-drive-idle.ts +151 -0
  119. package/scripts/backlog/backlog-drive-judge.ts +25 -0
  120. package/scripts/backlog/backlog-drive-memory.ts +126 -0
  121. package/scripts/backlog/backlog-drive-named-offer.ts +5 -10
  122. package/scripts/backlog/backlog-drive-named.ts +53 -6
  123. package/scripts/backlog/backlog-drive-offer-argv.ts +3 -8
  124. package/scripts/backlog/backlog-drive-paused.ts +169 -0
  125. package/scripts/backlog/backlog-drive-restore.ts +30 -7
  126. package/scripts/backlog/backlog-drive-seats.ts +18 -8
  127. package/scripts/backlog/backlog-drive-token-handling.ts +38 -0
  128. package/scripts/backlog/backlog-drive.ts +79 -75
  129. package/scripts/backlog/backlog-next-main.ts +16 -0
  130. package/scripts/backlog/backlog-next-shared.ts +73 -0
  131. package/scripts/backlog/backlog-next.ts +48 -16
  132. package/scripts/backlog/backlog-occupied.ts +52 -39
  133. package/scripts/backlog/backlog-offer-cli.ts +6 -21
  134. package/scripts/backlog/backlog-offer-exclude.ts +15 -0
  135. package/scripts/backlog/backlog-offer-main.ts +12 -0
  136. package/scripts/backlog/backlog-offer.ts +36 -3
  137. package/scripts/backlog/backlog-overlap.ts +22 -4
  138. package/scripts/backlog/backlog-plan-read.ts +6 -2
  139. package/scripts/backlog/backlog-plan.ts +18 -4
  140. package/scripts/backlog/backlog-pool.ts +10 -10
  141. package/scripts/backlog/backlog-rank.ts +10 -2
  142. package/scripts/backlog/backlog-ready.ts +112 -30
  143. package/scripts/backlog/backlog-stalled-detect.ts +109 -36
  144. package/scripts/backlog/backlog-stalled.ts +52 -16
  145. package/scripts/backlog/backlog-wait-cause.ts +86 -0
  146. package/scripts/backlog/backlog-waves.ts +39 -13
  147. package/scripts/backlog/backlogrun-args.ts +19 -7
  148. package/scripts/backlog/backlogrun-cli.ts +19 -5
  149. package/scripts/backlog/backlogrun-launch.ts +6 -0
  150. package/scripts/backlog/backlogrun-restart.ts +97 -0
  151. package/scripts/backlog/backlogrun-stop.ts +79 -7
  152. package/scripts/behavior/behavior-cli.ts +2 -2
  153. package/scripts/behavior/behavior-rules.ts +47 -24
  154. package/scripts/build/build-bin.ts +2 -16
  155. package/scripts/build/build-claude-md.ts +0 -7
  156. package/scripts/build/build-commands.ts +0 -13
  157. package/scripts/build/build-hooks.ts +49 -48
  158. package/scripts/build/hook-bundle-stamp.ts +29 -11
  159. package/scripts/build/local-bin.ts +1 -1
  160. package/scripts/cases/cases-cli.ts +25 -13
  161. package/scripts/cases/cases-interaction-scan.ts +134 -0
  162. package/scripts/cases/cases-interaction.ts +183 -0
  163. package/scripts/cases/cases-logic.ts +39 -6
  164. package/scripts/ci/pr-classification-main.ts +18 -0
  165. package/scripts/ci/pr-classification.ts +10 -17
  166. package/scripts/clone/clone-scan.ts +1 -1
  167. package/scripts/cost-runtime/cost-blocks.ts +22 -37
  168. package/scripts/cost-runtime/cost-cli.ts +31 -14
  169. package/scripts/cost-runtime/cost-main.ts +12 -0
  170. package/scripts/cost-runtime/cost-transcript.ts +1 -0
  171. package/scripts/delegation/delegation-policy.ts +17 -4
  172. package/scripts/delegation/duplicate-read-guard.ts +0 -8
  173. package/scripts/delegation/investigation-guard.ts +0 -8
  174. package/scripts/delegation/investigation-reads.ts +3 -4
  175. package/scripts/dependabot/dependabot-cooldown.ts +194 -0
  176. package/scripts/discovery/repo-discovery.ts +24 -6
  177. package/scripts/doctor/doctor-consumer.ts +2 -5
  178. package/scripts/document/document-byte-budget.ts +8 -6
  179. package/scripts/document/document-scan.ts +1 -1
  180. package/scripts/document/document-section-cli.ts +0 -8
  181. package/scripts/document/document-section-main.ts +12 -0
  182. package/scripts/epic/epic-audit-cli.ts +12 -6
  183. package/scripts/epic/epic-bundle-apply.ts +137 -0
  184. package/scripts/epic/epic-bundle-cli.ts +32 -121
  185. package/scripts/epic/epic-bundle-format.ts +116 -0
  186. package/scripts/epic/epic-bundle-main.ts +17 -0
  187. package/scripts/epic/epic-busy.ts +5 -12
  188. package/scripts/epic/epic-classify.ts +24 -15
  189. package/scripts/epic/epic-cli-argv.ts +31 -0
  190. package/scripts/epic/epic-cli-decide.ts +42 -0
  191. package/scripts/epic/epic-cli.ts +6 -38
  192. package/scripts/epic/epic-close.ts +112 -55
  193. package/scripts/epic/epic-cross-repo.ts +4 -7
  194. package/scripts/epic/epic-decide.ts +119 -0
  195. package/scripts/epic/epic-decision.ts +9 -0
  196. package/scripts/epic/epic-fetch.ts +4 -0
  197. package/scripts/epic/epic-graph.ts +2 -0
  198. package/scripts/epic/epic-issue.ts +5 -1
  199. package/scripts/epic/epic-label-age.ts +1 -1
  200. package/scripts/epic/epic-lane-offer.ts +39 -4
  201. package/scripts/epic/epic-next-main.ts +24 -0
  202. package/scripts/epic/epic-next.ts +6 -24
  203. package/scripts/epic/epic-outside-blocker.ts +6 -2
  204. package/scripts/epic/epic-parse.ts +9 -3
  205. package/scripts/epic/epic-read.ts +1 -0
  206. package/scripts/epic/epic-reconcile.ts +39 -0
  207. package/scripts/epic/epic-run.ts +10 -1
  208. package/scripts/epic/epic-solo.ts +50 -14
  209. package/scripts/epic/epic.ts +41 -7
  210. package/scripts/exports/unused-members-cli.ts +2 -2
  211. package/scripts/followup/followup-checks-event.ts +8 -3
  212. package/scripts/followup/followup-coderabbit-wait.ts +82 -0
  213. package/scripts/followup/followup-review-gates.ts +81 -0
  214. package/scripts/followup/git-followup-stages.ts +13 -3
  215. package/scripts/followup/git-followup-workflow.ts +19 -66
  216. package/scripts/followup/git-pr-followup-wrapup.ts +9 -14
  217. package/scripts/followup/git-pr-followup.ts +36 -8
  218. package/scripts/fresh-machine/fresh-machine-cli.ts +1 -1
  219. package/scripts/fresh-machine/fresh-machine-run.ts +8 -8
  220. package/scripts/fresh-machine/specs/kit-test-backlogrun.json +1 -1
  221. package/scripts/gate/busy-average.ts +58 -0
  222. package/scripts/gate/check-cpu.ts +60 -0
  223. package/scripts/gate/check-inputs.ts +39 -95
  224. package/scripts/gate/check-reuse.ts +33 -54
  225. package/scripts/gate/command-memory.ts +192 -0
  226. package/scripts/gate/core-admission.ts +218 -28
  227. package/scripts/gate/core-budget-timing.ts +37 -0
  228. package/scripts/gate/core-budget.ts +80 -98
  229. package/scripts/gate/core-wait-record.ts +48 -0
  230. package/scripts/gate/core-wait.ts +37 -5
  231. package/scripts/gate/core-weights.ts +86 -0
  232. package/scripts/gate/free-cores.ts +27 -4
  233. package/scripts/gate/gate-ledger.ts +32 -4
  234. package/scripts/gate/gate-plan.ts +41 -34
  235. package/scripts/gate/gate-report.ts +14 -2
  236. package/scripts/gate/gate-run-steps.ts +53 -8
  237. package/scripts/gate/gate-skip.ts +12 -2
  238. package/scripts/gate/gate-steps.ts +12 -1
  239. package/scripts/gate/input-fingerprint.ts +42 -0
  240. package/scripts/gate/machine-capacity.ts +65 -31
  241. package/scripts/gate/moved-paths.ts +67 -0
  242. package/scripts/gate/project-checks.ts +5 -12
  243. package/scripts/gate/scoped-green.ts +12 -8
  244. package/scripts/gate/since-green.ts +62 -0
  245. package/scripts/gate/toolchain-inputs.ts +115 -0
  246. package/scripts/gate/verification-gate.ts +27 -24
  247. package/scripts/gate/verification-inputs.ts +250 -0
  248. package/scripts/gh/gh-author-association.ts +96 -9
  249. package/scripts/gh/git-ai-review-scan.ts +4 -2
  250. package/scripts/gh/git-gh-api-path.ts +15 -0
  251. package/scripts/gh/git-gh-branch-rules.ts +73 -0
  252. package/scripts/gh/git-gh-conditional.ts +5 -2
  253. package/scripts/gh/git-gh-issue-read.ts +5 -1
  254. package/scripts/gh/git-gh-issue-write.ts +67 -29
  255. package/scripts/gh/git-gh-issue.ts +7 -3
  256. package/scripts/gh/git-gh-poll-read.ts +89 -0
  257. package/scripts/gh/git-gh-pr-auto-merge.ts +8 -3
  258. package/scripts/gh/git-gh-pr-rest.ts +1 -1
  259. package/scripts/gh/git-gh-pr-snapshot.ts +33 -20
  260. package/scripts/gh/git-gh-pr.ts +27 -15
  261. package/scripts/gh/git-pr-checks-eval.ts +39 -7
  262. package/scripts/gh/git-pr-checks-parse.ts +39 -9
  263. package/scripts/gh/git-pr-merge-checked.ts +80 -0
  264. package/scripts/git/base-tree.ts +19 -2
  265. package/scripts/git/changed-file-scope.ts +6 -4
  266. package/scripts/git/changed-paths.ts +18 -1
  267. package/scripts/git/git-diff-reads.ts +27 -2
  268. package/scripts/git/git-grep-hits.ts +85 -0
  269. package/scripts/git/git-location-environment.ts +1 -1
  270. package/scripts/git/git-merge-conflicts.ts +83 -0
  271. package/scripts/git/git-preflight.ts +37 -12
  272. package/scripts/git/git-push-transport.ts +1 -2
  273. package/scripts/git/git-schemas.ts +17 -7
  274. package/scripts/git/git-spawn.ts +1 -2
  275. package/scripts/git/git-status.ts +4 -4
  276. package/scripts/git/main-merge-main.ts +12 -0
  277. package/scripts/git/main-merge-regenerate.ts +2 -2
  278. package/scripts/git/main-merge.ts +25 -9
  279. package/scripts/git/main-sync-main.ts +12 -0
  280. package/scripts/git/main-sync.ts +0 -9
  281. package/scripts/git/stash/git-stash.ts +27 -4
  282. package/scripts/git/stash/{stash-pop-args.ts → stash-args.ts} +13 -10
  283. package/scripts/git/stash/stash-pop-cli.ts +6 -12
  284. package/scripts/git/stash/stash-pop-main.ts +12 -0
  285. package/scripts/git/stash/stash-push-cli.ts +76 -0
  286. package/scripts/git/stash/stash-push-main.ts +12 -0
  287. package/scripts/hooks/batch-guard.ts +0 -8
  288. package/scripts/hooks/check-commit-message-main.ts +8 -0
  289. package/scripts/hooks/check-commit-message.ts +4 -7
  290. package/scripts/hooks/format-edited-file.ts +8 -24
  291. package/scripts/hooks/pre-commit-lint.ts +30 -3
  292. package/scripts/hooks/pre-push-unit.ts +4 -2
  293. package/scripts/hooks/pretool-guard-cli.ts +1 -8
  294. package/scripts/hooks/pretool-guard.ts +32 -19
  295. package/scripts/hooks/reserved-run.ts +67 -9
  296. package/scripts/hooks/run-hook.sh +13 -4
  297. package/scripts/hooks/shell-rules-notice.ts +37 -0
  298. package/scripts/hooks/stop-actions.ts +2 -21
  299. package/scripts/hooks/stop-guard.ts +13 -9
  300. package/scripts/init/hook-command-rewrite.ts +19 -5
  301. package/scripts/init/hook-launch.ts +15 -17
  302. package/scripts/init/init-actions.ts +0 -6
  303. package/scripts/init/init-ai-copy.ts +10 -36
  304. package/scripts/init/init-bootstrap.ts +9 -8
  305. package/scripts/init/init-dry-run-report.ts +1 -1
  306. package/scripts/init/init-dry-run.ts +1 -1
  307. package/scripts/init/init-file-action.ts +7 -9
  308. package/scripts/init/init-logic-json-merge.ts +2 -2
  309. package/scripts/init/init-logic-migrate.ts +9 -82
  310. package/scripts/init/init-logic.ts +3 -2
  311. package/scripts/init/init-main.ts +12 -0
  312. package/scripts/init/init.ts +5 -12
  313. package/scripts/init/kit-development-versions.ts +3 -7
  314. package/scripts/init/kit-written-paths.ts +2 -2
  315. package/scripts/init/project-profile.ts +5 -4
  316. package/scripts/init/tsconfig-preset-migration.ts +2 -1
  317. package/scripts/init/vscode-tasks.ts +1 -1
  318. package/scripts/issue/defect-origin-cli.ts +106 -0
  319. package/scripts/issue/defect-origin-line.ts +60 -0
  320. package/scripts/issue/defect-origin-main.ts +11 -0
  321. package/scripts/issue/defect-origin.ts +114 -0
  322. package/scripts/issue/defect-rate-cli.ts +34 -78
  323. package/scripts/issue/defect-rate.ts +0 -16
  324. package/scripts/issue/defect-report-cli.ts +128 -0
  325. package/scripts/issue/defect-report-format.ts +56 -0
  326. package/scripts/issue/defect-report-main.ts +11 -0
  327. package/scripts/issue/defect-report.ts +160 -0
  328. package/scripts/issue/expected-effect-lint.ts +1 -0
  329. package/scripts/issue/issue-already-done-cli.ts +62 -0
  330. package/scripts/issue/issue-body-or-comment.ts +40 -0
  331. package/scripts/issue/issue-cite-cli.ts +0 -9
  332. package/scripts/issue/issue-cite-main.ts +12 -0
  333. package/scripts/issue/issue-classification.ts +12 -7
  334. package/scripts/issue/issue-comment-cli.ts +10 -24
  335. package/scripts/issue/issue-comment-main.ts +12 -0
  336. package/scripts/issue/issue-evidence-exit.ts +100 -0
  337. package/scripts/issue/issue-file-cli.ts +29 -7
  338. package/scripts/issue/issue-file.ts +19 -19
  339. package/scripts/issue/issue-fold-cli.ts +2 -11
  340. package/scripts/issue/issue-fold-main.ts +12 -0
  341. package/scripts/issue/issue-labels.ts +81 -90
  342. package/scripts/issue/issue-lint-cli.ts +2 -10
  343. package/scripts/issue/issue-lint-main.ts +12 -0
  344. package/scripts/issue/issue-measured-cli.ts +56 -0
  345. package/scripts/issue/issue-merged.ts +19 -2
  346. package/scripts/issue/issue-not-before-label.ts +135 -0
  347. package/scripts/issue/issue-not-before.ts +111 -0
  348. package/scripts/issue/issue-number-shape.ts +15 -1
  349. package/scripts/issue/issue-park.ts +28 -0
  350. package/scripts/issue/issue-plan-cli.ts +151 -0
  351. package/scripts/issue/issue-priority.ts +151 -0
  352. package/scripts/issue/issue-rank.ts +7 -1
  353. package/scripts/issue/issue-read-cli.ts +3 -10
  354. package/scripts/issue/issue-read-main.ts +12 -0
  355. package/scripts/issue/issue-read.ts +29 -5
  356. package/scripts/issue/issue-release-cli.ts +0 -10
  357. package/scripts/issue/issue-release-main.ts +13 -0
  358. package/scripts/issue/issue-release.ts +7 -12
  359. package/scripts/issue/issue-sample-gate.ts +192 -0
  360. package/scripts/issue/issue-sample-source.ts +76 -0
  361. package/scripts/issue/issue-scout-cli.ts +0 -11
  362. package/scripts/issue/issue-scout-main.ts +14 -0
  363. package/scripts/issue/issue-state-cli.ts +0 -10
  364. package/scripts/issue/issue-state-main.ts +12 -0
  365. package/scripts/issue/issue-watch-diff.ts +56 -15
  366. package/scripts/issue/issue-watch.ts +2 -1
  367. package/scripts/issue/issue-wip.ts +2 -7
  368. package/scripts/issue/measure-rerun-cli.ts +13 -8
  369. package/scripts/issue/plan-consumers-cli.ts +39 -0
  370. package/scripts/issue/plan-consumers-main.ts +11 -0
  371. package/scripts/issue/plan-consumers-section.ts +55 -0
  372. package/scripts/issue/plan-consumers.ts +127 -0
  373. package/scripts/josh/agent-session-environment.ts +1 -1
  374. package/scripts/josh/command-usage.ts +15 -43
  375. package/scripts/josh/file-map-stamp.ts +49 -16
  376. package/scripts/josh/hook-decision.ts +32 -20
  377. package/scripts/josh/josh-command-map.ts +4 -1
  378. package/scripts/josh/josh-command-types.ts +12 -6
  379. package/scripts/josh/josh-commands-agent-hooks.ts +83 -0
  380. package/scripts/josh/josh-commands-ai.ts +157 -158
  381. package/scripts/josh/josh-commands-backlog.ts +82 -16
  382. package/scripts/josh/josh-commands-clone.ts +1 -0
  383. package/scripts/josh/josh-commands-development.ts +111 -71
  384. package/scripts/josh/josh-commands-document.ts +43 -1
  385. package/scripts/josh/josh-commands-epic.ts +171 -0
  386. package/scripts/josh/josh-commands-hooks.ts +25 -2
  387. package/scripts/josh/josh-commands-issue-write.ts +181 -0
  388. package/scripts/josh/josh-commands-issue.ts +124 -24
  389. package/scripts/josh/josh-commands-lane.ts +103 -2
  390. package/scripts/josh/josh-commands-lint.ts +19 -8
  391. package/scripts/josh/josh-commands-maintenance.ts +112 -4
  392. package/scripts/josh/josh-commands-pause.ts +29 -0
  393. package/scripts/josh/josh-commands-progress.ts +87 -0
  394. package/scripts/josh/josh-commands-project.ts +138 -9
  395. package/scripts/josh/josh-commands-review.ts +124 -0
  396. package/scripts/josh/josh-commands-run.ts +211 -23
  397. package/scripts/josh/josh-commands-ship.ts +169 -0
  398. package/scripts/josh/josh-commands-split.ts +9 -0
  399. package/scripts/josh/josh-commands-versioning.ts +49 -2
  400. package/scripts/josh/josh-commands-workflow.ts +144 -6
  401. package/scripts/josh/josh-logic.ts +6 -13
  402. package/scripts/josh/package-directory.ts +2 -4
  403. package/scripts/josh/process-identity.ts +13 -4
  404. package/scripts/josh/session-language-cli.ts +4 -8
  405. package/scripts/josh/session-language-main.ts +13 -0
  406. package/scripts/josh/session-language.ts +6 -1
  407. package/scripts/josh/shared-cache.ts +90 -0
  408. package/scripts/josh/stamp-file.ts +9 -15
  409. package/scripts/lane/lane-await.ts +51 -12
  410. package/scripts/lane/lane-cache.ts +5 -30
  411. package/scripts/lane/lane-capacity.ts +14 -23
  412. package/scripts/lane/lane-check-stats.ts +62 -21
  413. package/scripts/lane/lane-child-invocation.ts +8 -0
  414. package/scripts/lane/lane-cli.ts +15 -5
  415. package/scripts/lane/lane-close.ts +86 -18
  416. package/scripts/lane/lane-core-wait-stats.ts +66 -0
  417. package/scripts/lane/lane-dispatch.ts +24 -3
  418. package/scripts/lane/lane-gap-stats.ts +156 -0
  419. package/scripts/lane/lane-handoff.ts +69 -1
  420. package/scripts/lane/lane-held-stats.ts +129 -0
  421. package/scripts/lane/lane-install.ts +4 -11
  422. package/scripts/lane/lane-launch-cli.ts +0 -9
  423. package/scripts/lane/lane-launch-main.ts +12 -0
  424. package/scripts/lane/lane-ledger-schema.ts +266 -0
  425. package/scripts/lane/lane-ledger.ts +92 -123
  426. package/scripts/lane/lane-limit-cli.ts +12 -1
  427. package/scripts/lane/lane-measure-cli.ts +57 -11
  428. package/scripts/lane/lane-open.ts +9 -1
  429. package/scripts/lane/lane-parked.ts +3 -3
  430. package/scripts/lane/lane-pause-cli.ts +130 -0
  431. package/scripts/lane/lane-pause.ts +158 -0
  432. package/scripts/lane/lane-process-table.ts +166 -0
  433. package/scripts/lane/lane-reap-settle.ts +124 -0
  434. package/scripts/lane/lane-reap.ts +50 -15
  435. package/scripts/lane/lane-registry.ts +24 -3
  436. package/scripts/lane/lane-residents.ts +162 -0
  437. package/scripts/lane/lane-restart.ts +22 -2
  438. package/scripts/lane/lane-round-two-stats.ts +49 -0
  439. package/scripts/lane/lane-sampler.ts +4 -0
  440. package/scripts/lane/lane-session-action.ts +19 -5
  441. package/scripts/lane/lane-session-broker.ts +102 -21
  442. package/scripts/lane/lane-snapshot-trace.ts +84 -0
  443. package/scripts/lane/lane-spans.ts +51 -0
  444. package/scripts/lane/lane-spent.ts +6 -3
  445. package/scripts/lane/lane-stage-stats.ts +7 -2
  446. package/scripts/lane/lane-state.ts +302 -0
  447. package/scripts/lane/lane-stats.ts +58 -4
  448. package/scripts/lane/lane-stop-stats.ts +113 -37
  449. package/scripts/lane/lane-test-related-stats.ts +127 -0
  450. package/scripts/lane/lane-transcript-calls.ts +145 -0
  451. package/scripts/lane/lane-transcript-stats.ts +168 -0
  452. package/scripts/lane/lane-vacant.ts +13 -3
  453. package/scripts/lane/lane-withdraw-cli.ts +5 -4
  454. package/scripts/lane/lane-withdraw.ts +50 -49
  455. package/scripts/lane/process-directories.ts +70 -0
  456. package/scripts/lane/process-lane-marks.ts +94 -0
  457. package/scripts/lib/atomic-write.ts +62 -0
  458. package/scripts/lib/buffered-process.ts +12 -5
  459. package/scripts/lib/cli-flags.ts +53 -0
  460. package/scripts/lib/figure-format.ts +63 -0
  461. package/scripts/lib/json-value.ts +9 -1
  462. package/scripts/lib/package-manifest.ts +35 -0
  463. package/scripts/lib/read-file.ts +3 -1
  464. package/scripts/lib/stamped-memo.ts +63 -0
  465. package/scripts/lib/stdout-on-stderr.ts +24 -0
  466. package/scripts/lib/timeouts.ts +9 -0
  467. package/scripts/lib/transcript-record.ts +91 -0
  468. package/scripts/lines/effective-limit.ts +1 -1
  469. package/scripts/lint/eslint-cache-dependencies.ts +145 -0
  470. package/scripts/lint/eslint-daemon.ts +265 -0
  471. package/scripts/lint/format.ts +11 -2
  472. package/scripts/lint/import-graph.ts +279 -0
  473. package/scripts/lint/lint-gate-scope.ts +102 -0
  474. package/scripts/lint/lint-parallel-main.ts +19 -0
  475. package/scripts/lint/lint-parallel.ts +62 -30
  476. package/scripts/lint/lint-related-scope.ts +30 -24
  477. package/scripts/lint/lint-related.ts +38 -6
  478. package/scripts/notify/confirmation-options.ts +1 -2
  479. package/scripts/notify/telegram-notify.ts +20 -20
  480. package/scripts/notify/telegram-test-logic.ts +0 -1
  481. package/scripts/notify/telegram-test-main.ts +8 -0
  482. package/scripts/notify/telegram-test.ts +2 -6
  483. package/scripts/observations/observation-ledger.ts +13 -0
  484. package/scripts/observations/observations-flush-landing.ts +5 -3
  485. package/scripts/observations/observations-flush.ts +6 -1
  486. package/scripts/overrides/overrides-check.ts +2 -5
  487. package/scripts/overrides/overrides-files.ts +2 -1
  488. package/scripts/overrides/overrides-logic.ts +3 -6
  489. package/scripts/package/verify-optional-eslint-install.ts +8 -6
  490. package/scripts/propagate/propagate-publish.ts +2 -7
  491. package/scripts/propagate/propagate-targets.ts +4 -12
  492. package/scripts/refactor/import-graph.ts +9 -7
  493. package/scripts/release/github-release-runs.ts +17 -6
  494. package/scripts/release/release-approval-prune.ts +18 -0
  495. package/scripts/release/release-history.ts +1 -3
  496. package/scripts/release/release-progress.ts +42 -22
  497. package/scripts/release/release-publish-run.ts +39 -0
  498. package/scripts/release/release-publish.ts +6 -6
  499. package/scripts/release/release-scope-cli.ts +0 -10
  500. package/scripts/release/release-scope-main.ts +12 -0
  501. package/scripts/repo/repo-setting.ts +3 -6
  502. package/scripts/repo/required-checks-logic.ts +6 -15
  503. package/scripts/report/report-format-reference.ts +2 -0
  504. package/scripts/report/report-labels.ts +155 -0
  505. package/scripts/report/report-lint-cli.ts +3 -0
  506. package/scripts/report/report-lint.ts +85 -110
  507. package/scripts/report/report-template-cli.ts +59 -0
  508. package/scripts/report/report-template.ts +112 -0
  509. package/scripts/review/acceptance-map.ts +1 -0
  510. package/scripts/review/removed-tests-check.ts +86 -0
  511. package/scripts/review/removed-tests.ts +149 -0
  512. package/scripts/review/review-brief-cli.ts +81 -15
  513. package/scripts/review/review-brief-main.ts +12 -0
  514. package/scripts/review/review-brief.ts +31 -3
  515. package/scripts/review/review-code-tree.ts +10 -6
  516. package/scripts/review/review-comment-round.ts +26 -8
  517. package/scripts/review/review-finding-ledger.ts +30 -15
  518. package/scripts/review/review-interaction.ts +94 -0
  519. package/scripts/review/review-readers-scan.ts +163 -0
  520. package/scripts/review/review-record-cli.ts +69 -30
  521. package/scripts/review/review-record-main.ts +12 -0
  522. package/scripts/review/review-round-one-blobs.ts +221 -0
  523. package/scripts/review/review-round2-cli.ts +49 -12
  524. package/scripts/review/review-round2.ts +80 -12
  525. package/scripts/review/review-stamps.ts +19 -1
  526. package/scripts/review/review-stop-log.ts +96 -0
  527. package/scripts/review/review-stops-cli.ts +85 -0
  528. package/scripts/review/review-tree.ts +6 -17
  529. package/scripts/review/review-untouched-readers.ts +146 -0
  530. package/scripts/review/test-titles.ts +118 -0
  531. package/scripts/rules/agent-model.ts +8 -0
  532. package/scripts/rules/bash-triggers.ts +46 -3
  533. package/scripts/rules/decision-oracle-batch.ts +9 -1
  534. package/scripts/rules/decision-oracle.ts +2 -2
  535. package/scripts/rules/delivered-rules.ts +80 -2
  536. package/scripts/rules/destructive-command.ts +8 -1
  537. package/scripts/rules/direct-filing.ts +10 -2
  538. package/scripts/rules/direct-issue-comment.ts +117 -0
  539. package/scripts/rules/direct-pr-create.ts +69 -3
  540. package/scripts/rules/early-heartbeat.ts +2 -1
  541. package/scripts/rules/file-body.ts +7 -0
  542. package/scripts/rules/filing-cap.ts +7 -0
  543. package/scripts/rules/git-argv.ts +72 -14
  544. package/scripts/rules/git-force.ts +12 -2
  545. package/scripts/rules/guard-remedy.ts +4 -0
  546. package/scripts/rules/implementation-cut-verdict.ts +1 -1
  547. package/scripts/rules/implementation-cut.ts +11 -3
  548. package/scripts/rules/index-guard.ts +8 -1
  549. package/scripts/rules/issue-comments.ts +9 -1
  550. package/scripts/rules/josh-git-bare.ts +7 -0
  551. package/scripts/rules/lane-background.ts +67 -25
  552. package/scripts/rules/lane-carry-conflict.ts +6 -0
  553. package/scripts/rules/lane-direct-tool.ts +74 -0
  554. package/scripts/rules/lane-interactive-ask.ts +9 -2
  555. package/scripts/rules/lane-park.ts +45 -23
  556. package/scripts/rules/lane-split-park.ts +10 -2
  557. package/scripts/rules/lane-switch-main.ts +7 -0
  558. package/scripts/rules/oracle-consulted.ts +10 -0
  559. package/scripts/rules/oracle-firing.ts +1 -0
  560. package/scripts/rules/permission-guards.ts +3 -0
  561. package/scripts/rules/piped-verification.ts +1 -1
  562. package/scripts/rules/poll-loop.ts +7 -0
  563. package/scripts/rules/pr-merge.ts +123 -0
  564. package/scripts/rules/protected-files.ts +32 -5
  565. package/scripts/rules/raw-field-body.ts +6 -0
  566. package/scripts/rules/rule-body-guard.ts +8 -0
  567. package/scripts/rules/rule-list.ts +9 -28
  568. package/scripts/rules/rule-value-cache.ts +4 -9
  569. package/scripts/rules/rule-value-cli.ts +51 -32
  570. package/scripts/rules/rule-value.ts +1 -1
  571. package/scripts/rules/shell-segments.ts +35 -0
  572. package/scripts/rules/stop-rule-rows.ts +64 -0
  573. package/scripts/rules/stop-rules.ts +3 -4
  574. package/scripts/rules/test-declared-commit.ts +11 -1
  575. package/scripts/rules/third-party-write.ts +7 -0
  576. package/scripts/rules/timed-rerun.ts +69 -0
  577. package/scripts/rules/worktree-guard.ts +13 -3
  578. package/scripts/run/board/run-board-app-name.ts +23 -0
  579. package/scripts/run/board/run-board-cli.ts +65 -32
  580. package/scripts/run/board/run-board-earlier.ts +94 -0
  581. package/scripts/run/board/run-board-ending-reason.ts +67 -0
  582. package/scripts/run/board/run-board-estimate-schedule.ts +103 -0
  583. package/scripts/run/board/run-board-estimate.ts +98 -0
  584. package/scripts/run/board/run-board-fit.ts +153 -36
  585. package/scripts/run/board/run-board-fold.ts +123 -0
  586. package/scripts/run/board/run-board-fresh.ts +2 -2
  587. package/scripts/run/board/run-board-gather-live.ts +29 -0
  588. package/scripts/run/board/run-board-gather-thread.ts +189 -0
  589. package/scripts/run/board/run-board-gather-worker.ts +29 -0
  590. package/scripts/run/board/run-board-gather.ts +187 -0
  591. package/scripts/run/board/run-board-github.ts +118 -38
  592. package/scripts/run/board/run-board-header.ts +82 -20
  593. package/scripts/run/board/run-board-keys.ts +58 -0
  594. package/scripts/run/board/run-board-kind.ts +20 -6
  595. package/scripts/run/board/run-board-labels.ts +116 -71
  596. package/scripts/run/board/run-board-lane-state.ts +109 -0
  597. package/scripts/run/board/run-board-lane-time.ts +122 -0
  598. package/scripts/run/board/run-board-layout.ts +239 -60
  599. package/scripts/run/board/run-board-length.ts +52 -0
  600. package/scripts/run/board/run-board-machine.ts +8 -4
  601. package/scripts/run/board/run-board-main.ts +12 -0
  602. package/scripts/run/board/run-board-notes.ts +52 -31
  603. package/scripts/run/board/run-board-now.ts +1 -1
  604. package/scripts/run/board/run-board-operation.ts +15 -33
  605. package/scripts/run/board/run-board-phase.ts +1 -1
  606. package/scripts/run/board/run-board-plan-shared.ts +115 -0
  607. package/scripts/run/board/run-board-plan.ts +55 -3
  608. package/scripts/run/board/run-board-planning.ts +45 -0
  609. package/scripts/run/board/run-board-priority.ts +44 -0
  610. package/scripts/run/board/run-board-process-groups.ts +195 -0
  611. package/scripts/run/board/run-board-read.ts +151 -27
  612. package/scripts/run/board/run-board-reason.ts +235 -51
  613. package/scripts/run/board/run-board-released.ts +35 -0
  614. package/scripts/run/board/run-board-render-checks.ts +39 -5
  615. package/scripts/run/board/run-board-render-condition.ts +96 -0
  616. package/scripts/run/board/run-board-render-drawn.ts +67 -0
  617. package/scripts/run/board/run-board-render-foot.ts +59 -0
  618. package/scripts/run/board/run-board-render-icon.ts +35 -0
  619. package/scripts/run/board/run-board-render-lanes.ts +145 -0
  620. package/scripts/run/board/run-board-render-lead.ts +80 -0
  621. package/scripts/run/board/run-board-render-legend.ts +117 -48
  622. package/scripts/run/board/run-board-render-notes.ts +156 -29
  623. package/scripts/run/board/run-board-render-processes.ts +196 -0
  624. package/scripts/run/board/run-board-render-section.ts +119 -0
  625. package/scripts/run/board/run-board-render-slot.ts +3 -36
  626. package/scripts/run/board/run-board-render-tail.ts +115 -48
  627. package/scripts/run/board/run-board-render-time.ts +56 -0
  628. package/scripts/run/board/run-board-render-title.ts +117 -24
  629. package/scripts/run/board/run-board-render-waits.ts +104 -20
  630. package/scripts/run/board/run-board-render.ts +207 -265
  631. package/scripts/run/board/run-board-roots.ts +54 -0
  632. package/scripts/run/board/run-board-row-yield.ts +9 -4
  633. package/scripts/run/board/run-board-setup.ts +1 -12
  634. package/scripts/run/board/run-board-snapshot.ts +111 -0
  635. package/scripts/run/board/run-board-spin.ts +2 -2
  636. package/scripts/run/board/run-board-state.ts +22 -33
  637. package/scripts/run/board/run-board-status.ts +147 -71
  638. package/scripts/run/board/run-board-thanks-read.ts +2 -2
  639. package/scripts/run/board/run-board-tick.ts +122 -107
  640. package/scripts/run/board/run-board-usage-board.ts +78 -0
  641. package/scripts/run/board/run-board-usage-lanes.ts +113 -0
  642. package/scripts/run/board/run-board-usage-listing.ts +93 -0
  643. package/scripts/run/board/run-board-usage-read.ts +120 -150
  644. package/scripts/run/board/run-board-usage-rusage.ts +19 -7
  645. package/scripts/run/board/run-board-usage-text.ts +139 -51
  646. package/scripts/run/board/run-board-usage-top.ts +102 -0
  647. package/scripts/run/board/run-board-usage.ts +89 -72
  648. package/scripts/run/board/run-board-usual.ts +20 -9
  649. package/scripts/run/carry/run-carry-args.ts +4 -7
  650. package/scripts/run/carry/run-carry-conversation.ts +1 -1
  651. package/scripts/run/carry/run-carry.ts +9 -4
  652. package/scripts/run/cut/run-cut-handoff.ts +2 -2
  653. package/scripts/run/event/run-event-cli.ts +1 -5
  654. package/scripts/run/event/run-event-filed.ts +12 -6
  655. package/scripts/run/event/run-event-follow.ts +2 -3
  656. package/scripts/run/event/run-event-render.ts +6 -10
  657. package/scripts/run/event/run-event-scope.ts +2 -2
  658. package/scripts/run/event/run-event-stream-emit.ts +82 -22
  659. package/scripts/run/event/run-event-stream.ts +34 -8
  660. package/scripts/run/hold/run-hold-adopt.ts +65 -0
  661. package/scripts/run/hold/run-hold-cli.ts +93 -22
  662. package/scripts/run/hold/run-hold-main.ts +12 -0
  663. package/scripts/run/hold/run-hold-member.ts +37 -0
  664. package/scripts/run/hold/run-stop-notify.ts +183 -0
  665. package/scripts/run/merge/run-merge-auth.ts +31 -0
  666. package/scripts/run/merge/run-merge-cli.ts +62 -48
  667. package/scripts/run/merge/run-merge-close.ts +74 -0
  668. package/scripts/run/merge/run-merge-collect.ts +6 -13
  669. package/scripts/run/merge/run-merge-driver.ts +71 -0
  670. package/scripts/run/merge/run-merge-main.ts +12 -0
  671. package/scripts/run/merge/run-merge-outcome.ts +23 -0
  672. package/scripts/run/merge/run-merge-restart.ts +39 -0
  673. package/scripts/run/merge/run-merge-ship.ts +20 -4
  674. package/scripts/run/merge/run-merge-signals.ts +33 -9
  675. package/scripts/run/merge/run-merge-steps.ts +120 -85
  676. package/scripts/run/merge/run-merge.ts +38 -37
  677. package/scripts/run/park/run-park-cli.ts +91 -0
  678. package/scripts/run/park/run-park.ts +88 -0
  679. package/scripts/run/park/run-stalled.ts +68 -0
  680. package/scripts/run/pause/run-pause-cli.ts +73 -0
  681. package/scripts/run/pause/run-pause.ts +251 -0
  682. package/scripts/run/progress/run-progress-cli.ts +4 -12
  683. package/scripts/run/progress/run-progress-clock.ts +1 -1
  684. package/scripts/run/progress/run-progress-config.ts +6 -14
  685. package/scripts/run/progress/run-progress-main.ts +12 -0
  686. package/scripts/run/progress/run-progress.ts +1 -4
  687. package/scripts/run/review/run-review.ts +2 -1
  688. package/scripts/run/run-ending.ts +1 -0
  689. package/scripts/run/run-invocation.ts +5 -6
  690. package/scripts/run/run-liveness-cli.ts +6 -8
  691. package/scripts/run/run-liveness.ts +60 -29
  692. package/scripts/run/run-next.ts +1 -1
  693. package/scripts/run/run-parent-cut-hook.ts +2 -2
  694. package/scripts/run/run-preflight.ts +18 -3
  695. package/scripts/run/run-prep-cli.ts +1 -10
  696. package/scripts/run/run-prep-locate.ts +7 -50
  697. package/scripts/run/run-prep-main.ts +12 -0
  698. package/scripts/run/run-prep.ts +6 -0
  699. package/scripts/run/run-report-cli.ts +101 -13
  700. package/scripts/run/run-report-handoff.ts +114 -0
  701. package/scripts/run/run-step.ts +1 -1
  702. package/scripts/run/run-stranded-detect.ts +13 -0
  703. package/scripts/run/run-watcher-guard-cli.ts +1 -1
  704. package/scripts/run/run-watcher-guard.ts +1 -1
  705. package/scripts/run/ship/run-ship-args.ts +121 -0
  706. package/scripts/run/ship/run-ship-body-draft.ts +110 -0
  707. package/scripts/run/ship/run-ship-cli.ts +63 -140
  708. package/scripts/run/ship/run-ship-detach.ts +19 -8
  709. package/scripts/run/ship/run-ship-infra-retry.ts +59 -0
  710. package/scripts/run/ship/run-ship-next.ts +18 -2
  711. package/scripts/run/ship/run-ship-overlap.ts +42 -5
  712. package/scripts/run/ship/run-ship-place.ts +96 -0
  713. package/scripts/run/ship/run-ship-pre-detach-timed.ts +43 -0
  714. package/scripts/run/ship/run-ship-pre-detach.ts +81 -24
  715. package/scripts/run/ship/run-ship-preflight.ts +137 -32
  716. package/scripts/run/ship/run-ship-probe.ts +11 -3
  717. package/scripts/run/ship/run-ship-relaunch-cap.ts +70 -0
  718. package/scripts/run/ship/run-ship-removed-rows.ts +61 -0
  719. package/scripts/run/ship/run-ship-return.ts +107 -23
  720. package/scripts/run/ship/run-ship-review-steps.ts +105 -151
  721. package/scripts/run/ship/run-ship-review.ts +73 -6
  722. package/scripts/run/ship/run-ship-reviewer.ts +207 -0
  723. package/scripts/run/ship/run-ship-stage.ts +55 -6
  724. package/scripts/run/ship/run-ship-steps.ts +46 -15
  725. package/scripts/run/ship/run-ship-stop-cause.ts +135 -0
  726. package/scripts/run/ship/run-ship-stop-text.ts +11 -6
  727. package/scripts/run/ship/run-ship-sync.ts +43 -6
  728. package/scripts/run/ship/run-ship.ts +30 -2
  729. package/scripts/run/tidy/run-tidy-cli.ts +0 -4
  730. package/scripts/run/tidy/run-tidy-lanes.ts +3 -0
  731. package/scripts/run/tidy/run-tidy-main.ts +8 -0
  732. package/scripts/run/wake/run-wake-cli.ts +119 -100
  733. package/scripts/run/wake/run-wake-code.ts +83 -0
  734. package/scripts/run/wake/run-wake-driver.ts +19 -8
  735. package/scripts/run/wake/run-wake-loop.ts +34 -3
  736. package/scripts/run/wake/run-wake-main.ts +13 -0
  737. package/scripts/run/wake/run-wake-ports.ts +90 -0
  738. package/scripts/run/wake/run-wake-takeover.ts +66 -0
  739. package/scripts/run/wake/run-wake.ts +2 -1
  740. package/scripts/safe-chain/pack-hook.ts +2 -2
  741. package/scripts/safe-chain/preinstall-command.ts +2 -1
  742. package/scripts/safe-chain/project-config.ts +3 -9
  743. package/scripts/security/security-audit-main.ts +8 -0
  744. package/scripts/security/security-audit-provision-logic.ts +0 -11
  745. package/scripts/security/security-audit-provision-main.ts +12 -0
  746. package/scripts/security/security-audit-provision.ts +11 -26
  747. package/scripts/security/security-audit.ts +6 -7
  748. package/scripts/self-sync-guard/self-sync-guard-logic.ts +6 -13
  749. package/scripts/split/split-assess-cli.ts +2 -2
  750. package/scripts/split/split-assess.ts +15 -0
  751. package/scripts/split/split-measure.ts +65 -0
  752. package/scripts/sync/claude-settings-merge.ts +8 -15
  753. package/scripts/sync/directory-copy-guard.ts +4 -9
  754. package/scripts/sync/file-content.ts +78 -8
  755. package/scripts/sync/sync-ai-files.ts +3 -5
  756. package/scripts/sync/sync-configs.ts +11 -23
  757. package/scripts/sync/sync-hook-safety.ts +4 -10
  758. package/scripts/sync/sync-main.ts +11 -0
  759. package/scripts/sync/sync.ts +25 -37
  760. package/scripts/test/test-declared-changed.ts +2 -2
  761. package/scripts/test/test-declared.ts +1 -1
  762. package/scripts/test/test-e2e-guard.ts +25 -1
  763. package/scripts/test/test-e2e-stamp.ts +38 -0
  764. package/scripts/test/test-pinned-logic.ts +145 -0
  765. package/scripts/test/test-pinned-main.ts +78 -0
  766. package/scripts/test/test-pinned.ts +100 -0
  767. package/scripts/test/test-read-map.ts +264 -0
  768. package/scripts/test/test-read-recording.ts +91 -0
  769. package/scripts/test/test-read-trace.ts +148 -0
  770. package/scripts/test/test-red-main.ts +12 -0
  771. package/scripts/test/test-red.ts +12 -30
  772. package/scripts/test/test-related-main.ts +18 -0
  773. package/scripts/test/test-related-record.ts +119 -0
  774. package/scripts/test/test-related-scope.ts +229 -43
  775. package/scripts/test/test-related.ts +300 -22
  776. package/scripts/test/test-unit-guard-main.ts +15 -0
  777. package/scripts/test/test-unit-guard.ts +42 -24
  778. package/scripts/test/unit-count-file.ts +37 -0
  779. package/scripts/test/unit-run-marker.ts +162 -0
  780. package/scripts/test/unit-setup-files.ts +51 -0
  781. package/scripts/test/unit-worker-share.ts +61 -149
  782. package/scripts/test/whole-suite-files.ts +63 -0
  783. package/scripts/time-runtime/time-background.ts +20 -2
  784. package/scripts/time-runtime/time-bundles.ts +4 -3
  785. package/scripts/time-runtime/time-density-hook.ts +8 -6
  786. package/scripts/time-runtime/time-followup-stage.ts +1 -3
  787. package/scripts/time-runtime/time-format.ts +5 -28
  788. package/scripts/time-runtime/time-markers.ts +10 -1
  789. package/scripts/time-runtime/time-shell.ts +97 -10
  790. package/scripts/time-runtime/time-transcript-line.ts +49 -62
  791. package/scripts/uninstall/uninstall.ts +1 -1
  792. package/scripts/version/bump-version-main.ts +12 -0
  793. package/scripts/version/bump-version.ts +25 -25
  794. package/scripts/version/effective-upstream.ts +6 -12
  795. package/scripts/version/latest-corepack.ts +17 -32
  796. package/scripts/version/latest-if-required-cli.ts +93 -0
  797. package/scripts/version/latest-lane-guard-main.ts +8 -0
  798. package/scripts/version/latest-lane-guard.ts +0 -4
  799. package/scripts/version/latest-scope-cli.ts +0 -9
  800. package/scripts/version/latest-scope-main.ts +12 -0
  801. package/scripts/version/latest-update.ts +5 -5
  802. package/scripts/version/npm-registry.ts +44 -6
  803. package/scripts/version/publishable-range-check.ts +5 -16
  804. package/scripts/version/release-age.ts +1 -1
  805. package/scripts/version/release-hold.ts +1 -1
  806. package/scripts/version/release-window.ts +38 -0
  807. package/scripts/version/running-binary.ts +1 -1
  808. package/scripts/version/safe-chain-version-update.ts +3 -8
  809. package/scripts/version/version-targets.ts +6 -28
  810. package/templates/dependabot.yml +29 -0
  811. package/templates/gitignore +4 -1
  812. package/templates/pnpm-workspace.basic.yaml +1 -1
  813. package/templates/sonar-project.properties +3 -2
  814. package/templates/workflows/ci.yml +12 -4
  815. package/templates/workflows/github-release.yml +4 -0
  816. package/tsconfig.sonar.json +1 -1
  817. package/.ncurc.json +0 -3
  818. package/dist/hooks/batch-guard.js +0 -29
  819. package/dist/hooks/chunk-4KKD2UTK.js +0 -66
  820. package/dist/hooks/chunk-6TS2JD6D.js +0 -237
  821. package/dist/hooks/chunk-7DSBJVFH.js +0 -50
  822. package/dist/hooks/chunk-A65Y4YOR.js +0 -79
  823. package/dist/hooks/chunk-CDY4NFQG.js +0 -15
  824. package/dist/hooks/chunk-EFXE6C37.js +0 -81
  825. package/dist/hooks/chunk-GP4IEC4O.js +0 -20
  826. package/dist/hooks/chunk-JP45SOCJ.js +0 -56
  827. package/dist/hooks/chunk-LAOV7NLM.js +0 -45
  828. package/dist/hooks/chunk-M4HGZV7U.js +0 -83
  829. package/dist/hooks/chunk-PF2NZL2A.js +0 -131
  830. package/dist/hooks/chunk-PTICX4OL.js +0 -358
  831. package/dist/hooks/chunk-RT27QRJW.js +0 -6247
  832. package/dist/hooks/chunk-SYOTDYCI.js +0 -3533
  833. package/dist/hooks/chunk-UPUZF3AN.js +0 -279
  834. package/dist/hooks/chunk-WK6SMBIC.js +0 -3180
  835. package/dist/hooks/duplicate-read-guard.js +0 -30
  836. package/dist/hooks/investigation-guard.js +0 -29
  837. package/scripts/backlog/backlog-stalled-cli.ts +0 -30
  838. package/scripts/cost-runtime/cost-format.ts +0 -29
  839. package/scripts/init/basic-path-migration.ts +0 -24
  840. package/scripts/issue/issue-backlinks-cli.ts +0 -93
  841. package/scripts/josh/josh-commands-guard.ts +0 -38
  842. package/scripts/josh/josh-usage-automation.ts +0 -121
  843. package/scripts/josh/josh-usage-backlog.ts +0 -180
  844. package/scripts/josh/josh-usage-developer.ts +0 -230
  845. package/scripts/josh/josh-usage-hooks.ts +0 -38
  846. package/scripts/josh/josh-usage-issue.ts +0 -205
  847. package/scripts/josh/josh-usage-review.ts +0 -101
  848. package/scripts/josh/josh-usage-run.ts +0 -252
  849. package/scripts/josh/josh-usage-session.ts +0 -238
  850. package/scripts/josh/josh-usage-workflow.ts +0 -212
  851. package/scripts/lint/cross-file-recheck.ts +0 -155
  852. package/scripts/registry-migration/migrate-logic.ts +0 -237
  853. package/scripts/registry-migration/migrate.ts +0 -292
  854. package/scripts/registry-migration/user-npmrc.ts +0 -15
  855. package/scripts/rules/rule-guard.ts +0 -23
  856. package/scripts/rules/rule-registry-rows.ts +0 -292
  857. package/scripts/rules/rule-registry.ts +0 -112
  858. package/scripts/run/run-stranded-cli.ts +0 -27
@@ -1,7 +1,6 @@
1
- import { readFileSync } from 'node:fs'
2
- import path from 'node:path'
3
1
  import { ancestor_directories } from '#scripts/lib/ancestor-directories'
4
- import { json_value } from '#scripts/lib/json-value'
2
+ import { PACKAGE_JSON, package_manifest } from '#scripts/lib/package-manifest'
3
+ import { MS_PER_MINUTE } from '#scripts/lib/timeouts'
5
4
  import { z } from 'zod'
6
5
  import { run_progress } from './run-progress'
7
6
 
@@ -25,8 +24,6 @@ import { run_progress } from './run-progress'
25
24
  // Reading the working directory alone would let the guard enforce the repository's interval while the
26
25
  // watcher it guards kept the default, which is the one state this module exists to prevent.
27
26
 
28
- const PACKAGE_FILE = 'package.json'
29
-
30
27
  // Unknown keys are stripped rather than rejected: this reads a whole `package.json`, and every other
31
28
  // field in it is none of this module's business. A present-but-unusable interval fails the parse and
32
29
  // falls through, which is the same answer an unusable environment variable already gets.
@@ -35,13 +32,8 @@ const package_schema = z.object({
35
32
  })
36
33
 
37
34
  function read_declared_minutes(directory: string): number | undefined {
38
- try {
39
- const raw = readFileSync(path.join(directory, PACKAGE_FILE), 'utf8')
40
-
41
- return json_value.parse_with(raw, package_schema)?.josh?.progress_interval_minutes
42
- } catch {
43
- return undefined
44
- }
35
+ return package_manifest.read_manifest_if_valid(directory, package_schema)?.josh
36
+ ?.progress_interval_minutes
45
37
  }
46
38
 
47
39
  function read_package_minutes(start: string): number | undefined {
@@ -55,7 +47,7 @@ function read_package_minutes(start: string): number | undefined {
55
47
  }
56
48
 
57
49
  function to_ms(minutes: number | undefined): number | undefined {
58
- return minutes === undefined ? undefined : minutes * run_progress.MS_PER_MINUTE
50
+ return minutes === undefined ? undefined : minutes * MS_PER_MINUTE
59
51
  }
60
52
 
61
53
  /**
@@ -88,7 +80,7 @@ function configured_interval_ms(directory: string = process.cwd()): number {
88
80
  }
89
81
 
90
82
  const run_progress_config = {
91
- PACKAGE_FILE,
83
+ PACKAGE_FILE: PACKAGE_JSON,
92
84
  configured_interval_ms,
93
85
  read_package_minutes,
94
86
  resolve_interval_ms,
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env tsx
2
+ import { fileURLToPath } from 'node:url'
3
+ import { run_progress_cli } from './run-progress-cli'
4
+
5
+ // The `josh run:progress` entry, kept apart from `run-progress-cli.ts` because other modules import
6
+ // that one: a bundle is one file, so a main guard there would fire for every command that carries it
7
+ // (joshuafolkken/kit#4186).
8
+ if (process.argv[1] === fileURLToPath(import.meta.url)) {
9
+ const ARGV_OFFSET = 2
10
+
11
+ process.exitCode = await run_progress_cli.run(process.argv.slice(ARGV_OFFSET))
12
+ }
@@ -1,4 +1,5 @@
1
1
  import { issue_cite, type IssueCiter } from '#scripts/issue/issue-cite'
2
+ import { MS_PER_MINUTE } from '#scripts/lib/timeouts'
2
3
 
3
4
  // `josh run:progress` — the one line an unattended run prints when it has gone quiet, and the clock
4
5
  // that decides when that is.
@@ -45,8 +46,6 @@ const DEFAULT_INTERVAL_MINUTES = 20
45
46
  // The one name for the setting, so the watcher and the guard read the same variable rather than two
46
47
  // spellings of it.
47
48
  const INTERVAL_KEY = 'JOSH_PROGRESS_INTERVAL_MINUTES'
48
- const MS_PER_MINUTE = 60_000
49
- const MS_PER_SECOND = 1000
50
49
  const DEFAULT_INTERVAL_MS = DEFAULT_INTERVAL_MINUTES * MS_PER_MINUTE
51
50
  // The switch that silences every progress report — the watcher's and `run:board --every`'s alike.
52
51
  const DISABLED_KEY = 'JOSH_PROGRESS'
@@ -351,8 +350,6 @@ const run_progress = {
351
350
  DISABLED_KEY,
352
351
  DISABLED_VALUE,
353
352
  INTERVAL_KEY,
354
- MS_PER_MINUTE,
355
- MS_PER_SECOND,
356
353
  NO_CHILD_YET,
357
354
  NO_NEXT,
358
355
  format_child,
@@ -11,6 +11,8 @@
11
11
  // - **how far the gate and the review overlapped** — the measurement the parallel start exists to
12
12
  // produce, computed from the four timestamps `run-review-steps.ts` records.
13
13
 
14
+ import { MS_PER_SECOND } from '#scripts/lib/timeouts'
15
+
14
16
  const ADOPT = 'adopt'
15
17
  const BLOCKED = 'blocked'
16
18
 
@@ -46,7 +48,6 @@ function is_gate_settled(state: GateState): boolean {
46
48
  return state !== GATE_RUNNING
47
49
  }
48
50
 
49
- const MS_PER_SECOND = 1000
50
51
  const SECONDS_DECIMALS = 1
51
52
  const NO_OVERLAP = 0
52
53
 
@@ -246,6 +246,7 @@ const run_ending = {
246
246
  decide,
247
247
  ended_mid_turn,
248
248
  read_exit,
249
+ read_transcript,
249
250
  written_at,
250
251
  }
251
252
 
@@ -1,4 +1,3 @@
1
- import { backlog_budget_cli } from '#scripts/backlog/backlog-budget-cli'
2
1
  import { issue_number_shape } from '#scripts/issue/issue-number-shape'
3
2
  import { cli_flags } from '#scripts/lib/cli-flags'
4
3
 
@@ -71,15 +70,15 @@ function tokens_of(invocation: string): ReadonlyArray<string> {
71
70
  return invocation.split(TOKEN_SEPARATOR).filter((token) => token.length > EMPTY_LENGTH)
72
71
  }
73
72
 
74
- // **The integer check is `backlog:budget`'s own, imported rather than restated.** It is the command
75
- // this invocation is going to be handed to, so a second copy of the rule here would be free to drift
76
- // from the one that actually reads the number. `--only` carries no value and renders to its own
73
+ // **The integer check is `cli_flags.to_count`, the one `backlog:budget` reads the number with.** It is
74
+ // the command this invocation is going to be handed to, so a second copy of the rule here would be free
75
+ // to drift from the one that actually reads the number. `--only` carries no value and renders to its own
77
76
  // constant for the same taint reason every other token does — the constant severs the record's string
78
77
  // from the rebuilt one.
79
78
  function render_option(token: ArgumentToken): string | undefined {
80
79
  if (token.name === cli_flags.option_name(ONLY_FLAG)) return ONLY_FLAG
81
80
  const flag = KNOWN_FLAGS.find((known) => cli_flags.option_name(known) === token.name)
82
- const value = backlog_budget_cli.to_count(token.value)
81
+ const value = cli_flags.to_count(token.value)
83
82
 
84
83
  if (flag === undefined || value === undefined) return undefined
85
84
 
@@ -109,7 +108,7 @@ function rendered_options(tokens: ReadonlyArray<ArgumentToken>): ReadonlyArray<s
109
108
  // `backlog:budget`'s.** It already refuses `0` and a leading zero, which is what keeps `#05` from
110
109
  // rebuilding as `#5` and being refused downstream as a rewritten record.
111
110
  // **The magnitude bound is here and not in the pattern**, which is anchored on digits and says nothing
112
- // about size — the same shape `backlog_budget_cli.to_count` ends with for a flag value. Without it a
111
+ // about size — the same shape `cli_flags.to_count` ends with for a flag value. Without it a
113
112
  // number past `Number.MAX_SAFE_INTEGER` rebuilds as a different number through precision loss, and the
114
113
  // record would carry a `done` entry that never matches anything in `remaining`.
115
114
  function issue_of(token: string): number | undefined {
@@ -4,9 +4,8 @@ import { issue_number_shape } from '#scripts/issue/issue-number-shape'
4
4
  import { lane_await } from '#scripts/lane/lane-await'
5
5
  import { cli_flags } from '#scripts/lib/cli-flags'
6
6
  import { error_text } from '#scripts/lib/error-message'
7
+ import { MS_PER_MINUTE, MS_PER_SECOND } from '#scripts/lib/timeouts'
7
8
  import {
8
- MS_PER_MINUTE,
9
- MS_PER_SECOND,
10
9
  PROCESS_ALIVE,
11
10
  PROCESS_NONE,
12
11
  PROCESS_UNKNOWN,
@@ -29,10 +28,6 @@ const FAILURE_EXIT_CODE = 1
29
28
  const ARGV_OFFSET = 2
30
29
  const USAGE =
31
30
  'Usage: josh run:liveness <issue-number> --output <path> [--process alive|none] [--window <minutes>] [--gap <seconds>] [--repo <owner/repo>]'
32
- // Whole and positive, both of them. A zero window would call any unit not writing at that instant
33
- // frozen, and a zero gap would take both samples back-to-back — together they book a live unit as
34
- // stopped, which is the one error direction this command is built to avoid.
35
- const DURATION_PATTERN = /^[1-9]\d*$/u
36
31
 
37
32
  const PROCESS_TRACES: ReadonlyArray<ProcessTrace> = [PROCESS_ALIVE, PROCESS_NONE, PROCESS_UNKNOWN]
38
33
 
@@ -69,9 +64,12 @@ function to_ms(raw: string | undefined, unit_ms: number): number | undefined {
69
64
  }
70
65
 
71
66
  // A malformed duration is refused rather than silently replaced by the default: a caller that meant
72
- // to widen the window and mistyped it would otherwise be answered against the 30-minute one.
67
+ // to widen the window and mistyped it would otherwise be answered against the 30-minute one. Whole and
68
+ // positive, both of them: a zero window would call any unit not writing at that instant frozen, and a
69
+ // zero gap would take both samples back-to-back — together they book a live unit as stopped, which is
70
+ // the one error direction this command is built to avoid.
73
71
  function is_valid_duration(raw: string | undefined): boolean {
74
- return raw === undefined || DURATION_PATTERN.test(raw)
72
+ return raw === undefined || cli_flags.to_positive(raw) !== undefined
75
73
  }
76
74
 
77
75
  const OPTIONS = {
@@ -4,10 +4,12 @@ import path from 'node:path'
4
4
  import { setTimeout as sleep } from 'node:timers/promises'
5
5
  import { agent_event, type AgentEventState } from '#scripts/agent/agent-event'
6
6
  import { git_gh_issue_read } from '#scripts/gh/git-gh-issue-read'
7
- import { ALREADY_DONE_LABEL, NEEDS_DECISION_LABEL } from '#scripts/issue/issue-labels'
7
+ import { has_parked_label } from '#scripts/issue/issue-labels'
8
8
  import { issue_number_shape } from '#scripts/issue/issue-number-shape'
9
9
  import { issue_state } from '#scripts/issue/issue-state'
10
10
  import { PLATFORM_TEMP_ROOT } from '#scripts/josh/platform-temporary'
11
+ import { lane_state, type LaneState } from '#scripts/lane/lane-state'
12
+ import { MS_PER_MINUTE, MS_PER_SECOND } from '#scripts/lib/timeouts'
11
13
  import { run_hold } from '#scripts/run/hold/run-hold'
12
14
 
13
15
  // `josh run:liveness <N>` — whether the delegated unit running child `<N>` is still working, or
@@ -33,13 +35,22 @@ import { run_hold } from '#scripts/run/hold/run-hold'
33
35
  // dead. `statSync` follows the link, and the size is compared as well as the modification time,
34
36
  // because it is the two-sample size comparison that actually proves liveness.
35
37
 
38
+ //
39
+ // **The lane state record answers before any trace** (joshuafolkken/kit#4270): a lane `lane:pause`
40
+ // suspended has a live process and frozen output, which the traces read as `alive` for as long as it
41
+ // stays paused; the record says `paused`. An `ended` record is a lane done with its child. Whether a
42
+ // child that parked or died is still there is not the record's — it writes nothing then — so the
43
+ // traces still decide every other lane.
44
+
36
45
  const ALIVE_VERDICT = 'alive'
46
+ const PAUSED_VERDICT = 'paused'
37
47
  const SETTLED_VERDICT = 'settled'
38
48
  const STOPPED_VERDICT = 'stopped'
39
49
  const UNDETERMINED_VERDICT = 'undetermined'
40
50
 
41
51
  type LivenessVerdict =
42
52
  | typeof ALIVE_VERDICT
53
+ | typeof PAUSED_VERDICT
43
54
  | typeof SETTLED_VERDICT
44
55
  | typeof STOPPED_VERDICT
45
56
  | typeof UNDETERMINED_VERDICT
@@ -58,8 +69,6 @@ const DEFAULT_SILENT_MINUTES = 30
58
69
  // Two samples, a few seconds apart. The gap is what turns "this file has an old timestamp" into
59
70
  // "this file is not being written", and five seconds is long enough for a unit mid-turn to append.
60
71
  const DEFAULT_GAP_SECONDS = 5
61
- const MS_PER_MINUTE = 60_000
62
- const MS_PER_SECOND = 1000
63
72
  const OPEN_STATE = 'OPEN'
64
73
  const STATE_FIELDS = 'state,labels'
65
74
 
@@ -73,6 +82,8 @@ interface Traces {
73
82
  is_child_settled: boolean | undefined
74
83
  is_output_frozen: boolean | undefined
75
84
  is_tree_dirty: boolean
85
+ // The lane's state record's state; `undefined` where the lane has none.
86
+ lane_state?: LaneState | undefined
76
87
  process_trace: ProcessTrace
77
88
  }
78
89
 
@@ -95,8 +106,10 @@ interface LivenessRequest {
95
106
  const REASONS: Record<LivenessVerdict, string> = {
96
107
  [ALIVE_VERDICT]:
97
108
  'The unit is still working: its output moved, or a process of the child is alive.',
109
+ [PAUSED_VERDICT]:
110
+ 'The lane state record says the lane is paused: its child is suspended, not working, and nothing moves until someone resumes it.',
98
111
  [SETTLED_VERDICT]:
99
- 'The child is closed, parked with `needs-decision`, or marked `already-done`, so there is nothing here to recover.',
112
+ 'The child is closed, parked with `needs-decision` or `run:stalled`, or marked `already-done`, so there is nothing here to recover.',
100
113
  [STOPPED_VERDICT]:
101
114
  'The output has been frozen past the silent window and no process of the child is alive in that checkout.',
102
115
  [UNDETERMINED_VERDICT]:
@@ -104,6 +117,8 @@ const REASONS: Record<LivenessVerdict, string> = {
104
117
  }
105
118
 
106
119
  const ALIVE_ADVICE = 'Keep waiting on `pnpm josh lane:await`; do not touch the child.'
120
+ const PAUSED_ADVICE =
121
+ 'Do not wait on it and do not recover it: tell the person the lane is paused; `pnpm josh lane:resume <N>` resumes it once they ask.'
107
122
  const SETTLED_ADVICE =
108
123
  'Read the child with `pnpm josh issue:state <N>` and take the branch its state says.'
109
124
  // The unit stopped, but *why* it stopped — abandoned mid-implementation, or dead because it could not
@@ -112,11 +127,11 @@ const SETTLED_ADVICE =
112
127
  // routed through `run:merge --output`, the same composite a returned child takes: it reads the exit
113
128
  // record without waiting for the unit to return, re-dispatches an outage child (counting the outage,
114
129
  // and stopping the run on the environment guard once a run of them trips it), and parks an abandoned
115
- // child with `needs-decision` against the consecutive-failure guard.
130
+ // child with `run:stalled` against the consecutive-failure guard.
116
131
  const STOPPED_CLEAN_ADVICE =
117
- 'The unit ended — classify how before booking it. Run `pnpm josh run:merge <N> --output <path>` (add `--epic <E> --repo <owner/repo> --owner "$PPID"` for a named epic): it reads the child\'s exit record without waiting for the unit to return, re-dispatches a child that could not reach the API (counting the outage; a run of them trips the environment guard and stops the run), and parks an abandoned child with `needs-decision` against the consecutive-failure guard. The checkout is clean, so there is nothing to stash.'
132
+ 'The unit ended — classify how before booking it. Run `pnpm josh run:merge <N> --output <path>` (add `--epic <E> --repo <owner/repo> --owner "$PPID"` for a named epic): it reads the child\'s exit record without waiting for the unit to return, re-dispatches a child that could not reach the API (counting the outage; a run of them trips the environment guard and stops the run), and parks an abandoned child with `run:stalled` against the consecutive-failure guard. The checkout is clean, so there is nothing to stash.'
118
133
  const STOPPED_DIRTY_ADVICE =
119
- 'Stash the half-finished work with `git stash push -u -m "backlogrun: stopped unit for #<N>"` and record it on the Issue, then classify how the unit ended with `pnpm josh run:merge <N> --output <path>` (add `--epic <E> --repo <owner/repo> --owner "$PPID"` for a named epic): it re-dispatches an API-outage child (counting the outage; a run of them trips the environment guard) and parks an abandoned child with `needs-decision` against the consecutive-failure guard, without waiting for the unit to return.'
134
+ 'Stash the half-finished work with `pnpm josh stash:push "backlogrun: stopped unit for #<N>"` and record it on the Issue, then classify how the unit ended with `pnpm josh run:merge <N> --output <path>` (add `--epic <E> --repo <owner/repo> --owner "$PPID"` for a named epic): it re-dispatches an API-outage child (counting the outage; a run of them trips the environment guard) and parks an abandoned child with `run:stalled` against the consecutive-failure guard, without waiting for the unit to return.'
120
135
  const UNDETERMINED_ADVICE =
121
136
  'Read the trace that failed and ask again. Where the process trace was given as `unknown`, leave `--process` out so the command reads it. Two of these in a row is a fault in the check itself rather than a slow unit: stop polling and report it.'
122
137
 
@@ -134,8 +149,19 @@ function is_agent_finished(traces: Traces): boolean {
134
149
  return is_agent_state_finished(traces.agent_state)
135
150
  }
136
151
 
152
+ // What the lane state record answers on its own: a paused lane, or one done with its child.
153
+ function recorded_verdict(state: LaneState | undefined): LivenessVerdict | undefined {
154
+ if (state === 'paused') return PAUSED_VERDICT
155
+
156
+ return state === 'ended' ? SETTLED_VERDICT : undefined
157
+ }
158
+
137
159
  function definitive_verdict(traces: Traces): LivenessVerdict | undefined {
138
160
  if (traces.is_child_settled === true) return SETTLED_VERDICT
161
+
162
+ const recorded = recorded_verdict(traces.lane_state)
163
+
164
+ if (recorded !== undefined) return recorded
139
165
  if (is_agent_finished(traces)) return STOPPED_VERDICT
140
166
  if (is_output_moving(traces)) return ALIVE_VERDICT
141
167
 
@@ -171,10 +197,16 @@ function to_verdict(traces: Traces): LivenessVerdict {
171
197
  return is_check_running(traces) ? ALIVE_VERDICT : STOPPED_VERDICT
172
198
  }
173
199
 
200
+ // The advice for every verdict but `stopped`, whose advice turns on the work left to stash.
201
+ const ADVICE: Record<Exclude<LivenessVerdict, typeof STOPPED_VERDICT>, string> = {
202
+ [ALIVE_VERDICT]: ALIVE_ADVICE,
203
+ [PAUSED_VERDICT]: PAUSED_ADVICE,
204
+ [SETTLED_VERDICT]: SETTLED_ADVICE,
205
+ [UNDETERMINED_VERDICT]: UNDETERMINED_ADVICE,
206
+ }
207
+
174
208
  function to_advice(verdict: LivenessVerdict, has_work_to_stash: boolean): string {
175
- if (verdict === ALIVE_VERDICT) return ALIVE_ADVICE
176
- if (verdict === SETTLED_VERDICT) return SETTLED_ADVICE
177
- if (verdict === UNDETERMINED_VERDICT) return UNDETERMINED_ADVICE
209
+ if (verdict !== STOPPED_VERDICT) return ADVICE[verdict]
178
210
 
179
211
  return has_work_to_stash ? STOPPED_DIRTY_ADVICE : STOPPED_CLEAN_ADVICE
180
212
  }
@@ -307,19 +339,13 @@ async function read_output_frozen(request: FreshnessRequest): Promise<boolean |
307
339
  return second.mtime_ms === first.mtime_ms && second.size === first.size
308
340
  }
309
341
 
310
- function carries_label(labels: ReadonlyArray<string>, wanted: string): boolean {
311
- return labels.some((label) => label.toLowerCase() === wanted)
312
- }
313
-
314
- // The labels that say a unit stopped on purpose. `needs-decision` is the park branch; `already-done`
315
- // is the exit a child takes when it verifies its Issue's work is already merged
316
- // — it comments the evidence, applies the label and stops with the checkout
342
+ // The park labels (`PARKED_LABELS`) say a unit stopped on purpose. `needs-decision` and `run:stalled`
343
+ // are the park branches; `already-done` is the exit a child takes when it verifies its Issue's work is
344
+ // already merged — it comments the evidence, applies the label and stops with the checkout
317
345
  // clean, which is settled by the same reasoning. Left out, this command reports a child that
318
346
  // finished correctly as `stopped` and a supervisor restarts the investigation it just completed.
319
- const SETTLED_LABELS: ReadonlyArray<string> = [NEEDS_DECISION_LABEL, ALREADY_DONE_LABEL]
320
-
321
347
  function carries_settled_label(labels: ReadonlyArray<string>): boolean {
322
- return SETTLED_LABELS.some((label) => carries_label(labels, label))
348
+ return has_parked_label(labels)
323
349
  }
324
350
 
325
351
  // Settled needs positive evidence that the child is done with: it closed, or the unit parked it and
@@ -340,20 +366,25 @@ async function read_child_settled(issue: string, repo?: string): Promise<boolean
340
366
  return state.state !== OPEN_STATE || carries_settled_label(state.labels)
341
367
  }
342
368
 
369
+ function freshness_of(request: LivenessRequest): FreshnessRequest {
370
+ return {
371
+ gap_ms: request.gap_ms ?? DEFAULT_GAP_SECONDS * MS_PER_SECOND,
372
+ now_ms: Date.now(),
373
+ output_path: request.output_path,
374
+ silent_window_ms: request.silent_window_ms ?? DEFAULT_SILENT_MINUTES * MS_PER_MINUTE,
375
+ }
376
+ }
377
+
343
378
  // The dirty tree is deliberately not one of the traces, so it is the one input that does not answer
344
379
  // `undetermined`. `run_hold.is_tree_dirty` reports an unreadable checkout as dirty, which here means
345
380
  // the advice offers a stash that may find nothing — the safe direction for the only question this
346
381
  // input decides, and one that cannot move the verdict.
347
382
  async function read_traces(request: LivenessRequest): Promise<Traces> {
348
- const [is_initial_child_settled, is_output_frozen, is_tree_dirty] = await Promise.all([
383
+ const [is_initial_child_settled, is_output_frozen, is_tree_dirty, record] = await Promise.all([
349
384
  read_child_settled(request.issue, request.repo),
350
- read_output_frozen({
351
- gap_ms: request.gap_ms ?? DEFAULT_GAP_SECONDS * MS_PER_SECOND,
352
- now_ms: Date.now(),
353
- output_path: request.output_path,
354
- silent_window_ms: request.silent_window_ms ?? DEFAULT_SILENT_MINUTES * MS_PER_MINUTE,
355
- }),
385
+ read_output_frozen(freshness_of(request)),
356
386
  run_hold.is_tree_dirty(),
387
+ lane_state.read_state(request.issue),
357
388
  ])
358
389
  const agent_state = read_agent_state(request.output_path)
359
390
  // A child can close or park its Issue and append its terminal event after the parallel GitHub read
@@ -370,6 +401,7 @@ async function read_traces(request: LivenessRequest): Promise<Traces> {
370
401
  is_child_settled,
371
402
  is_output_frozen,
372
403
  is_tree_dirty,
404
+ lane_state: record?.state,
373
405
  process_trace: request.process_trace,
374
406
  }
375
407
  }
@@ -400,8 +432,7 @@ export {
400
432
  ALIVE_VERDICT,
401
433
  DEFAULT_GAP_SECONDS,
402
434
  DEFAULT_SILENT_MINUTES,
403
- MS_PER_MINUTE,
404
- MS_PER_SECOND,
435
+ PAUSED_VERDICT,
405
436
  PROCESS_ALIVE,
406
437
  PROCESS_NONE,
407
438
  PROCESS_UNKNOWN,
@@ -14,7 +14,7 @@ import { run_step, type PreVerdict } from './run-step'
14
14
  const ALREADY_DONE_STEP =
15
15
  'Issue is CLOSED — nothing to run. Verify it against merged code before starting.'
16
16
  const KEEP_WORK_STEP =
17
- 'Issue is CLOSED but this lane holds uncommitted work — stash it with `git stash push -u -m "<N>: uncommitted work at already-done"` before ending.'
17
+ 'Issue is CLOSED but this lane holds uncommitted work — stash it with `pnpm josh stash:push "<N>: uncommitted work at already-done"` before ending.'
18
18
  const LATEST_STEP =
19
19
  'Update dependencies first (latest: required), load the dependency-update skill, then implement.'
20
20
  const HUMAN_REVIEW_STEP =
@@ -1,9 +1,9 @@
1
1
  import { CONTEXT_CUT_THRESHOLD } from '#scripts/cost-runtime/context-cut-threshold'
2
2
  import { cost_cli, type CostVerdict } from '#scripts/cost-runtime/cost-cli'
3
- import { cost_format } from '#scripts/cost-runtime/cost-format'
4
3
  import { cost_verdict } from '#scripts/cost-runtime/cost-verdict'
5
4
  import { hook_decision } from '#scripts/josh/hook-decision'
6
5
  import { error_text } from '#scripts/lib/error-message'
6
+ import { figure_format } from '#scripts/lib/figure-format'
7
7
  import { implementation_cut_verdict } from '#scripts/rules/implementation-cut-verdict'
8
8
  import type { RunCarry } from '#scripts/run/carry/run-carry'
9
9
  import { run_headless } from './run-headless'
@@ -50,7 +50,7 @@ function current_state(): ParentCutState {
50
50
  }
51
51
  }
52
52
 
53
- const THRESHOLD_TEXT = `${cost_format.format_tokens(CONTEXT_CUT_THRESHOLD)}-token`
53
+ const THRESHOLD_TEXT = `${figure_format.format_tokens(CONTEXT_CUT_THRESHOLD)}-token`
54
54
 
55
55
  const PARENT_CUT_REASON =
56
56
  '⛔ backlogrun parent hand-off: this session drives a `backlogrun` and its recent-context cost ' +
@@ -1,8 +1,10 @@
1
1
  import { git_gh_pr_read } from '#scripts/gh/git-gh-pr-read'
2
2
  import { git_command } from '#scripts/git/git-command'
3
+ import { git_stash } from '#scripts/git/stash/git-stash'
3
4
  import { issue_number_shape } from '#scripts/issue/issue-number-shape'
4
5
  import { session_cite } from '#scripts/issue/session-cite'
5
6
  import { lane_registry, type LaneInfo } from '#scripts/lane/lane-registry'
7
+ import { error_text } from '#scripts/lib/error-message'
6
8
  import { json_value } from '#scripts/lib/json-value'
7
9
  import { run_hold } from '#scripts/run/hold/run-hold'
8
10
  import { z } from 'zod'
@@ -162,13 +164,13 @@ function to_reason(verdict: PreflightVerdict, tree: TreeState, child: ChildState
162
164
  // comment is the only thing that can ever bring it back.
163
165
  //
164
166
  // **The stash lines appear only over a dirty tree.** `reclaim` also answers a clean checkout parked on
165
- // a feature branch, and printing them there tells the caller to record a stash `git stash push` never
167
+ // a feature branch, and printing them there tells the caller to record a stash `stash:push` never
166
168
  // created — an Issue comment naming nothing, under a rule that says the comment is what restores it.
167
169
  function reclaim_steps(tree: TreeState, issue: string): Array<string> {
168
170
  if (!tree.is_dirty) return []
169
171
 
170
172
  return [
171
- `git stash push -u -m "${STASH_LABEL_PREFIX}${issue}"`,
173
+ `pnpm josh stash:push "${STASH_LABEL_PREFIX}${issue}"`,
172
174
  `Record the stash on ${session_cite.issue(issue)} — the comment is what gets it popped; nothing pops it for you.`,
173
175
  ]
174
176
  }
@@ -211,9 +213,22 @@ function to_pr_state(raw: string): PrState {
211
213
  return (state === undefined ? undefined : GH_PR_STATES.get(state)) ?? NO_PR
212
214
  }
213
215
 
216
+ // Dirty means work `stash:push` would set aside: a tree whose only change is the observation ledger
217
+ // would otherwise be told to stash, get `clean`, and be told to stash again. Unreadable is dirty, as
218
+ // in `run_hold.is_tree_dirty`.
219
+ async function has_stashable_work(): Promise<boolean> {
220
+ try {
221
+ return await git_stash.has_stashable_changes()
222
+ } catch (error) {
223
+ error_text.trace_swallowed('run_preflight.has_stashable_work', error)
224
+
225
+ return true
226
+ }
227
+ }
228
+
214
229
  async function read_tree_state(): Promise<TreeState> {
215
230
  const [is_dirty, current, default_branch] = await Promise.all([
216
- run_hold.is_tree_dirty(),
231
+ has_stashable_work(),
217
232
  git_command.branch(),
218
233
  git_command.get_default_branch(),
219
234
  ])
@@ -1,5 +1,3 @@
1
- #!/usr/bin/env tsx
2
- import { fileURLToPath } from 'node:url'
3
1
  import { git_stash } from '#scripts/git/stash/git-stash'
4
2
  import { issue_number_shape } from '#scripts/issue/issue-number-shape'
5
3
  import { issue_read_cli, type BlockRead } from '#scripts/issue/issue-read-cli'
@@ -26,7 +24,6 @@ import { run_prep_locate } from './run-prep-locate'
26
24
 
27
25
  const SUCCESS_EXIT_CODE = 0
28
26
  const FAILURE_EXIT_CODE = 1
29
- const ARGV_OFFSET = 2
30
27
  const USAGE = 'Usage: josh run:prep <issue-number>'
31
28
  const LANE_SKIP_SCOPE = 'not asked'
32
29
  const LANE_SKIP_REASON =
@@ -88,7 +85,7 @@ async function lane_has_changes(): Promise<boolean> {
88
85
  if (!lane_child_marker.is_child_of(process.cwd())) return false
89
86
 
90
87
  try {
91
- return await git_stash.has_changes(process.cwd())
88
+ return await git_stash.has_stashable_changes(process.cwd())
92
89
  } catch (error) {
93
90
  error_text.trace_swallowed('run_prep_cli.lane_has_changes', error)
94
91
 
@@ -155,14 +152,8 @@ async function run(argv: ReadonlyArray<string>): Promise<number> {
155
152
  return exit_code(reads)
156
153
  }
157
154
 
158
- async function main(argv: ReadonlyArray<string>): Promise<void> {
159
- process.exitCode = await run(argv)
160
- }
161
-
162
155
  // `gather` and `to_parts` are exported so `run:next` reads the same state from the same three reads
163
156
  // rather than growing a second copy of the gather.
164
157
  const run_prep_cli = { gather, parse_number, run, to_parts }
165
158
 
166
- if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
167
-
168
159
  export { run_prep_cli }
@@ -1,4 +1,4 @@
1
- import { get_exit_code } from '#scripts/git/git-execa-error'
1
+ import { git_grep_hits, type Hit } from '#scripts/git/git-grep-hits'
2
2
  import { git_spawn } from '#scripts/git/git-spawn'
3
3
 
4
4
  // The code locations an issue names, bundled into `run:prep`. Investigation is most of a run's
@@ -17,18 +17,13 @@ const LINE_SUFFIX = /(?::\d+)+$/u
17
17
  // A name carries a separator a prose word does not — `run:prep`, `run_prep`, `run-prep.ts`, `a/b`.
18
18
  const NAME_CHARACTERS = /^[\w@./:-]+$/u
19
19
  const NAME_SEPARATOR = /[./:_-]/u
20
- const GREP_LINE = /^(?<path>[^:]+):(?<line>\d+):(?<text>.*)$/u
21
20
  const MIN_TARGET_LENGTH = 3
22
21
  const MAX_TARGETS = 10
23
22
  const MAX_FILES_PER_TARGET = 3
24
- const MAX_EXCERPT_LENGTH = 80
25
- const ELLIPSIS = '…'
26
23
  const INDENT = ' '
27
24
  const HIT_SEPARATOR = ' '
28
25
  const NO_MATCH = ' — no match in code'
29
26
  const SEARCH_FAILED = ' — git grep failed; not searched'
30
- // `git grep` exits 1 for no match; any other exit is a search that never ran.
31
- const GREP_NO_MATCH_EXIT = 1
32
27
  const FILE_PATHSPEC = ':(glob)**/'
33
28
  const FILE_HIT = { line: '1', excerpt: '(file named in the issue)' }
34
29
  const NO_TARGETS = '(no backticked path or identifier in the issue)'
@@ -43,12 +38,6 @@ const CODE_PATHS = [
43
38
  ':(exclude)*.snap',
44
39
  ]
45
40
 
46
- interface Hit {
47
- path: string
48
- line: string
49
- excerpt: string
50
- }
51
-
52
41
  interface Located {
53
42
  target: string
54
43
  hits: ReadonlyArray<Hit>
@@ -73,32 +62,6 @@ function extract_targets(text: string): Array<string> {
73
62
  return [...new Set(targets.filter((target) => is_name(target)))].slice(0, MAX_TARGETS)
74
63
  }
75
64
 
76
- function shorten(text: string): string {
77
- const trimmed = text.trim()
78
-
79
- if (trimmed.length <= MAX_EXCERPT_LENGTH) return trimmed
80
-
81
- return `${trimmed.slice(0, MAX_EXCERPT_LENGTH)}${ELLIPSIS}`
82
- }
83
-
84
- // `git grep -n` prints `path:line:text`; the text may itself hold colons, so only the first two split.
85
- function to_hit(output_line: string): Hit | undefined {
86
- const groups = GREP_LINE.exec(output_line)?.groups
87
-
88
- if (groups === undefined) return undefined
89
-
90
- // All three groups are non-optional in `GREP_LINE`, so a match always carries each of them.
91
- const { path, line, text } = groups as Record<'line' | 'path' | 'text', string>
92
-
93
- return { path, line, excerpt: shorten(text) }
94
- }
95
-
96
- function parse_hits(stdout: string): Array<Hit> {
97
- const hits = stdout.split('\n').map((line) => to_hit(line))
98
-
99
- return hits.filter((hit): hit is Hit => hit !== undefined).slice(0, MAX_FILES_PER_TARGET)
100
- }
101
-
102
65
  function format_target(located: Located): string {
103
66
  if (located.has_failed) return `${located.target}${SEARCH_FAILED}`
104
67
  if (located.hits.length === 0) return `${located.target}${NO_MATCH}`
@@ -116,18 +79,12 @@ function format_locations(located: ReadonlyArray<Located>): string {
116
79
  return located.map((entry) => format_target(entry)).join('\n')
117
80
  }
118
81
 
119
- // `git grep` exits 1 when nothing matches, which `git_spawn.read` raises. Neither that nor a search
120
- // that could not run fails the bundle — the issue body is still worth printing without it — but only
121
- // the first is reported as "no match": a git without `grep -m` (older than 2.38) exits 129, and naming
122
- // every target absent then would send the reader away from code that is there.
82
+ // Neither a no-match nor a search that could not run fails the bundle — the issue body is still worth
83
+ // printing without it — but only the first is reported as "no match" (`git-grep-hits.ts`).
123
84
  async function grep(target: string): Promise<Located> {
124
- const grep_arguments = ['grep', '-n', '-I', '-F', '-m', '1', '-e', target, '--', ...CODE_PATHS]
85
+ const { hits, has_failed } = await git_grep_hits.search(target, ['-m', '1'], CODE_PATHS)
125
86
 
126
- try {
127
- return { target, hits: parse_hits(await git_spawn.read(grep_arguments)), has_failed: false }
128
- } catch (error) {
129
- return { target, hits: [], has_failed: get_exit_code(error) !== GREP_NO_MATCH_EXIT }
130
- }
87
+ return { target, hits: hits.slice(0, MAX_FILES_PER_TARGET), has_failed }
131
88
  }
132
89
 
133
90
  // A path is rarely spelled out inside code — imports drop the extension and resolve relatively — so
@@ -158,7 +115,7 @@ async function locate(text: string): Promise<string> {
158
115
  return format_locations(located)
159
116
  }
160
117
 
161
- const run_prep_locate = { extract_targets, locate, parse_hits }
118
+ const run_prep_locate = { extract_targets, locate }
162
119
 
163
- export type { Hit, Located }
120
+ export type { Located }
164
121
  export { run_prep_locate }
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env tsx
2
+ import { fileURLToPath } from 'node:url'
3
+ import { run_prep_cli } from './run-prep-cli'
4
+
5
+ // The `josh run:prep` entry, kept apart from `run-prep-cli.ts` because other modules import that
6
+ // one: a bundle is one file, so a main guard there would fire for every command that carries it
7
+ // (joshuafolkken/kit#4186).
8
+ if (process.argv[1] === fileURLToPath(import.meta.url)) {
9
+ const ARGV_OFFSET = 2
10
+
11
+ process.exitCode = await run_prep_cli.run(process.argv.slice(ARGV_OFFSET))
12
+ }