@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,17 @@
1
1
  #!/usr/bin/env tsx
2
2
  import { fileURLToPath } from 'node:url'
3
+ import { cost_cli } from '#scripts/cost-runtime/cost-cli'
3
4
  import { git_followup_pending } from '#scripts/followup/git-followup-pending'
5
+ import { session_cite } from '#scripts/issue/session-cite'
6
+ import { telegram_notify } from '#scripts/notify/telegram-notify'
4
7
  import { release_scope_cli } from '#scripts/release/release-scope-cli'
5
- import { run_carry } from '#scripts/run/carry/run-carry'
8
+ import { report_labels } from '#scripts/report/report-labels'
9
+ import { run_carry, type CarryRead } from '#scripts/run/carry/run-carry'
6
10
  import { run_event_scope, type EventScope } from '#scripts/run/event/run-event-scope'
7
11
  import { run_event_stream, type RunEvent } from '#scripts/run/event/run-event-stream'
8
12
  import { run_event_stream_emit } from '#scripts/run/event/run-event-stream-emit'
9
13
  import { run_report } from './run-report'
14
+ import { run_report_handoff, type Handoff } from './run-report-handoff'
10
15
 
11
16
  // `josh run:report` — the session-facing report, generated from the run's event stream rather than
12
17
  // composed by hand. It reads the events the run appended, asks `release:scope`
@@ -18,8 +23,23 @@ import { run_report } from './run-report'
18
23
  // **The body it prints is the Telegram body too.** `josh notify --body-file <file>` sends exactly this
19
24
  // output, so the summary a session shows and the message a person reads off-screen are one string from one
20
25
  // generator, never a second wording of the same facts.
26
+ //
27
+ // `--handoff` prints the `backlogrun` hand-off report (`run-report-handoff.ts`) from the same reads —
28
+ // the run record and the scoped stream — and sends it itself as the `confirmation`, the resume command
29
+ // as its `recommended` choice (joshuafolkken/kit#4161). The body is built with plain `#N` and linked
30
+ // here, at the print boundary, through `session_cite.text`.
21
31
 
32
+ const ARGV_OFFSET = 2
22
33
  const SUCCESS_EXIT_CODE = 0
34
+ const FAILURE_EXIT_CODE = 1
35
+ const HANDOFF_FLAG = '--handoff'
36
+ const USAGE = `Usage: josh run:report [${HANDOFF_FLAG}]`
37
+ const NO_RECORD_NOTE =
38
+ 'No readable run record, so there is no run to hand off. Begin one with `pnpm josh run:carry --begin` first.'
39
+ const HANDOFF_TITLE = 'backlogrun hand-off'
40
+ const HANDOFF_RECOVERY = 'If this did not arrive, the session transcript holds the same report.'
41
+ const NO_RESUME_NOTE =
42
+ 'The run record names no resume command, so no hand-off confirmation was sent; the report above is the hand-off.'
23
43
 
24
44
  // An absent or unreadable stream is an empty run, the same fail-quiet direction the stream's own reader
25
45
  // takes — a report with no events is a report, not an error.
@@ -31,40 +51,108 @@ async function read_stream(): Promise<ReadonlyArray<RunEvent>> {
31
51
  return run_event_stream.read_events(target)
32
52
  }
33
53
 
54
+ // The run record this checkout holds, or `undefined` when the git directory cannot be resolved.
55
+ async function read_record(): Promise<CarryRead | undefined> {
56
+ const directory = await run_carry.repository_directory()
57
+
58
+ if (directory === undefined) return undefined
59
+
60
+ return run_carry.read_carry(run_carry.carry_path(directory))
61
+ }
62
+
34
63
  // The invocation this report covers, taken from the run record that already holds the start time.
35
64
  // A checkout whose git directory cannot be resolved has no record to read, which is the same
36
65
  // undetermined answer an absent record gives — and neither one falls back to the whole stream.
37
- async function read_scope(): Promise<EventScope> {
38
- const directory = await run_carry.repository_directory()
66
+ function scope_of(read: CarryRead | undefined): EventScope {
67
+ if (read === undefined) return run_event_scope.UNKNOWN_EVENT_SCOPE
39
68
 
40
- if (directory === undefined) return run_event_scope.UNKNOWN_EVENT_SCOPE
41
-
42
- return run_event_scope.scope_of(run_carry.read_carry(run_carry.carry_path(directory)))
69
+ return run_event_scope.scope_of(read)
43
70
  }
44
71
 
45
72
  // The three reads are independent, so they are issued together rather than one after another — the stream, the
46
73
  // pending-merge count and the run record share no input.
47
- async function run(): Promise<number> {
48
- const [events, pending, scope] = await Promise.all([
74
+ async function run_summary(): Promise<number> {
75
+ const [events, pending, read] = await Promise.all([
49
76
  read_stream(),
50
77
  git_followup_pending.read_pending({}),
51
- read_scope(),
78
+ read_record(),
52
79
  ])
53
80
  const release = release_scope_cli.decide(pending)
54
81
 
55
- process.stdout.write(`${run_report.build_report({ events, release, scope })}\n`)
82
+ process.stdout.write(`${run_report.build_report({ events, release, scope: scope_of(read) })}\n`)
56
83
 
57
84
  return SUCCESS_EXIT_CODE
58
85
  }
59
86
 
60
- async function main(): Promise<void> {
61
- process.exitCode = await run()
87
+ type CarriedRead = Extract<CarryRead, { kind: 'carried' }>
88
+
89
+ // The report is the hand-off, so it succeeds once printed. The send is `confirm`'s tolerant one, which
90
+ // already reports its own failure with `HANDOFF_RECOVERY` — a checkout with no Telegram credentials is
91
+ // one, and pointing it at `josh notify` would fail the same way. A record whose invocation names no
92
+ // resume command has no `recommended` to send.
93
+ async function send_handoff(handoff: Handoff): Promise<void> {
94
+ if (handoff.resume === undefined) {
95
+ console.error(NO_RESUME_NOTE)
96
+
97
+ return
98
+ }
99
+
100
+ await telegram_notify.confirm({
101
+ issue_title: HANDOFF_TITLE,
102
+ body: handoff.body,
103
+ recovery: HANDOFF_RECOVERY,
104
+ recommended: handoff.resume,
105
+ alternatives: [],
106
+ })
107
+ }
108
+
109
+ function handoff_of(read: CarriedRead, events: ReadonlyArray<RunEvent>): Handoff {
110
+ return run_report_handoff.build_handoff({
111
+ carry: read.carry,
112
+ events: run_event_scope.scoped_events(events, scope_of(read)) ?? [],
113
+ figures: cost_cli.session_figures(),
114
+ labels: report_labels.session_labels(),
115
+ })
116
+ }
117
+
118
+ async function run_handoff(): Promise<number> {
119
+ const [events, read] = await Promise.all([read_stream(), read_record()])
120
+
121
+ if (read?.kind !== 'carried') {
122
+ console.error(NO_RECORD_NOTE)
123
+
124
+ return FAILURE_EXIT_CODE
125
+ }
126
+
127
+ const built = handoff_of(read, events)
128
+ const handoff = { ...built, body: session_cite.text(built.body) }
129
+
130
+ process.stdout.write(`${handoff.body}\n`)
131
+ await send_handoff(handoff)
132
+
133
+ return SUCCESS_EXIT_CODE
134
+ }
135
+
136
+ async function run(argv: ReadonlyArray<string> = []): Promise<number> {
137
+ if (argv.length === 0) return await run_summary()
138
+ if (argv.length === 1 && argv[0] === HANDOFF_FLAG) return await run_handoff()
139
+
140
+ console.error(USAGE)
141
+
142
+ return FAILURE_EXIT_CODE
143
+ }
144
+
145
+ async function main(argv: ReadonlyArray<string>): Promise<void> {
146
+ process.exitCode = await run(argv)
62
147
  }
63
148
 
64
149
  const run_report_cli = {
150
+ NO_RECORD_NOTE,
151
+ NO_RESUME_NOTE,
152
+ USAGE,
65
153
  run,
66
154
  }
67
155
 
68
- if (process.argv[1] === fileURLToPath(import.meta.url)) await main()
156
+ if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
69
157
 
70
158
  export { run_report_cli }
@@ -0,0 +1,114 @@
1
+ import { backlog_drive_restore } from '#scripts/backlog/backlog-drive-restore'
2
+ import type { SessionFigures } from '#scripts/cost-runtime/cost-cli'
3
+ import { issue_cite } from '#scripts/issue/issue-cite'
4
+ import type { HandoffLabels, ReportLabels } from '#scripts/report/report-labels'
5
+ import { run_carry, type RunCarry } from '#scripts/run/carry/run-carry'
6
+ import type { RunEvent } from '#scripts/run/event/run-event-stream'
7
+ import { run_invocation } from '#scripts/run/run-invocation'
8
+
9
+ // `josh run:report --handoff` — the report a `backlogrun` writes when it hands the rest of a batch to a
10
+ // new session, generated from the values that already answer each line rather than filled in by hand:
11
+ // the run record (`run:carry`) names what merged, what is left and the command that resumes the run,
12
+ // the invocation's events name what parked, and `cost --cut`'s figures name why it stopped. **The
13
+ // hand-off is a fourth kind of stop**, so it carries the hand-off labels and never the completion
14
+ // report's `cause` / `fix` / `result` — an unfinished epic would read as finished.
15
+ //
16
+ // **The body is the Telegram body too**, as `run:report`'s is: the CLI prints it and sends it as the
17
+ // `confirmation`, the resume command as its `recommended` choice.
18
+
19
+ const LINE_SEPARATOR = '\n'
20
+ const LIST_SEPARATOR = ', '
21
+ const COST_COMMAND = '`pnpm josh cost --cut`'
22
+
23
+ interface HandoffInput {
24
+ carry: RunCarry
25
+ // This invocation's events, already scoped by `run-event-scope.ts`.
26
+ events: ReadonlyArray<RunEvent>
27
+ figures: SessionFigures
28
+ labels: ReportLabels
29
+ }
30
+
31
+ interface Handoff {
32
+ body: string
33
+ // The command that resumes the run, or `undefined` for a record whose invocation does not parse.
34
+ resume: string | undefined
35
+ }
36
+
37
+ function issue_list(issues: ReadonlyArray<number>, labels: HandoffLabels): string {
38
+ if (issues.length === 0) return labels.none
39
+
40
+ return issues.map((issue) => issue_cite.plain(issue)).join(LIST_SEPARATOR)
41
+ }
42
+
43
+ // The children that parked in this invocation and never merged — named apart from the remaining list,
44
+ // because a parked child is settled for this run but is not done.
45
+ function parked_of(input: HandoffInput): ReadonlyArray<number> {
46
+ const merged = input.carry.merged_issues ?? []
47
+
48
+ return [...backlog_drive_restore.parked_issues(input.events)].filter(
49
+ (issue) => !merged.includes(issue),
50
+ )
51
+ }
52
+
53
+ // **Never omitted**: it is the one line that tells this report from a completion report. A budget-only
54
+ // invocation named no list, so what is left is the pool rather than a count.
55
+ function remaining_line(input: HandoffInput, remaining: ReadonlyArray<number> | undefined): string {
56
+ const labels = input.labels.handoff
57
+ const parked = parked_of(input)
58
+ const listed = remaining === undefined ? labels.pool : issue_list(remaining, labels)
59
+ const count = remaining === undefined ? '' : ` (${String(remaining.length)})`
60
+ const parked_note =
61
+ parked.length === 0 ? '' : ` · ${labels.parked}: ${issue_list(parked, labels)}`
62
+
63
+ return `${listed}${count}${parked_note}`
64
+ }
65
+
66
+ // An unmeasurable session quotes its verdict where the cost would be, never a `0`.
67
+ function measurement_line(figures: SessionFigures): string {
68
+ const cost = figures.cost === undefined ? figures.verdict : String(figures.cost)
69
+
70
+ return `${cost} / ${String(figures.threshold)}`
71
+ }
72
+
73
+ function command_line(resume: string | undefined, labels: HandoffLabels): string {
74
+ return resume === undefined ? labels.none : `\`${resume}\``
75
+ }
76
+
77
+ function body_lines(
78
+ input: HandoffInput,
79
+ handoff_resume: string | undefined,
80
+ ): ReadonlyArray<string> {
81
+ const labels = input.labels.handoff
82
+ const remaining = run_carry.remaining_of(input.carry)
83
+
84
+ return [
85
+ `**${labels.title}**`,
86
+ '',
87
+ `- **${labels.done}**: ${issue_list(input.carry.merged_issues ?? [], labels)}`,
88
+ `- **${labels.remaining}**: ${remaining_line(input, remaining)}`,
89
+ `- **${labels.why_stopped}**: ${COST_COMMAND} → ${input.figures.verdict}`,
90
+ `- **${labels.next_command}**: ${command_line(handoff_resume, labels)}`,
91
+ '',
92
+ `**${input.labels.details}**`,
93
+ '',
94
+ `- ${labels.measurement}: ${measurement_line(input.figures)}`,
95
+ `- ${labels.handover}: ${labels.handover_text}`,
96
+ ]
97
+ }
98
+
99
+ // Handed the same record, events and figures it returns the same report — nothing here reads a clock,
100
+ // the environment or the network, which is what the tests pin. The resume command is the record's own
101
+ // invocation: `run:carry` resumes a record only when the invocation matches it exactly, so a command
102
+ // shrunk to the remaining issues would be refused and its recovery would drop the carried counts.
103
+ function build_handoff(input: HandoffInput): Handoff {
104
+ const resume = run_invocation.rebuild(input.carry.invocation)
105
+
106
+ return { body: body_lines(input, resume).join(LINE_SEPARATOR), resume }
107
+ }
108
+
109
+ const run_report_handoff = {
110
+ build_handoff,
111
+ }
112
+
113
+ export type { Handoff, HandoffInput }
114
+ export { run_report_handoff }
@@ -14,15 +14,16 @@ import { run_prep, type PrepParts } from './run-prep'
14
14
  import { run_prep_cli } from './run-prep-cli'
15
15
  import { run_retrospective } from './run-retrospective'
16
16
  import { run_step, type ParentInput, type StepInput } from './run-step'
17
+ import { run_step_section } from './run-step-section'
17
18
 
18
- // `josh run:step [<N>]` — print the run's next single action, computed from the event stream, the carry
19
+ // `josh run:step [<N>]` — print the run's next single action, followed by the section that governs it
20
+ // (`run-step-section.ts`), computed from the event stream, the carry
19
21
  // record and the issue state. It reads exactly those three, never the
20
22
  // conversation: the issue facts through `run:prep`'s own gather (so this and `run:next` never answer
21
23
  // from different reads), the newest event off the stream, and the carry record's kind. The reader runs
22
24
  // the printed line, returns the result through `run:event`, and asks again — the loop `run:step`
23
25
  // exists to close.
24
26
 
25
- const SUCCESS_EXIT_CODE = 0
26
27
  const FAILURE_EXIT_CODE = 1
27
28
  const ARGV_OFFSET = 2
28
29
  const USAGE =
@@ -154,16 +155,31 @@ function parent_input(directory: string | undefined): ParentInput {
154
155
  // `unknown` is the one answer with nothing to run — no record this session drives — so it exits non-zero
155
156
  // with the usage, exactly as a position missing its issue state does.
156
157
  async function run_parent(): Promise<number> {
157
- const { line } = run_step.parent_action(parent_input(await run_carry.repository_directory()))
158
+ const action = run_step.parent_action(parent_input(await run_carry.repository_directory()))
158
159
 
159
- console.info(line)
160
- if (line !== run_step.UNKNOWN) return SUCCESS_EXIT_CODE
160
+ console.info(action.line)
161
+ if (action.line !== run_step.UNKNOWN) return run_step_section.print_for(action)
161
162
 
162
163
  console.error(USAGE)
163
164
 
164
165
  return FAILURE_EXIT_CODE
165
166
  }
166
167
 
168
+ function report({ input, ship_problems }: Gathered): number {
169
+ const action = run_step.next_action(input)
170
+
171
+ console.info(action.line)
172
+ // On stderr, so stdout stays the action line and its rule: what `josh ship` would
173
+ // refuse on is said at every step, while it is still cheap to meet.
174
+ if (ship_problems.length > 0) console.error(run_prep.ship_body(ship_problems))
175
+
176
+ // A state that could not be read exits non-zero, exactly as `run:prep` and `run:next` exit on the
177
+ // same failure, so a position missing its issue state is never read as a confident next step.
178
+ if (input.state === undefined) return FAILURE_EXIT_CODE
179
+
180
+ return run_step_section.print_for(action)
181
+ }
182
+
167
183
  async function run(argv: ReadonlyArray<string>): Promise<number> {
168
184
  if (argv.length === 0) return await run_parent()
169
185
 
@@ -175,16 +191,7 @@ async function run(argv: ReadonlyArray<string>): Promise<number> {
175
191
  return FAILURE_EXIT_CODE
176
192
  }
177
193
 
178
- const { input, ship_problems } = await gather(issue_number)
179
-
180
- console.info(run_step.next_action(input).line)
181
- // On stderr, so stdout stays the one action line: what `josh ship` would
182
- // refuse on is said at every step, while it is still cheap to meet.
183
- if (ship_problems.length > 0) console.error(run_prep.ship_body(ship_problems))
184
-
185
- // A state that could not be read exits non-zero, exactly as `run:prep` and `run:next` exit on the
186
- // same failure, so a position missing its issue state is never read as a confident next step.
187
- return input.state === undefined ? FAILURE_EXIT_CODE : SUCCESS_EXIT_CODE
194
+ return report(await gather(issue_number))
188
195
  }
189
196
 
190
197
  async function main(argv: ReadonlyArray<string>): Promise<void> {
@@ -0,0 +1,85 @@
1
+ import { document_section_cli } from '#scripts/document/document-section-cli'
2
+ import { run_step, type StepAction } from './run-step'
3
+
4
+ // The section that governs each action `run:step` and `run:entry` print — the one table the action →
5
+ // rule mapping lives in, so the manifests no longer carry a route table the reader walks to find it.
6
+ // The command prints the section after its action line, which saves the `doc:section` turn the reader
7
+ // would otherwise spend fetching a section the action already determined.
8
+ //
9
+ // **A heading that does not resolve fails the command**, exactly as `doc:section` refuses it: a pointer
10
+ // renamed away would otherwise print the action without its rule, and the reader would act unread.
11
+
12
+ const JOSH_PREFIX = 'pnpm josh '
13
+ const COMMAND_SEPARATOR = ' '
14
+ const SUCCESS_EXIT_CODE = 0
15
+
16
+ // The key `run:entry` prints under — not a `run:step` action, but the entry's own read, kept in the
17
+ // same table so every mechanically-chosen section has one home.
18
+ const ENTRY = 'entry'
19
+
20
+ interface SectionReference {
21
+ document: string
22
+ heading: string
23
+ }
24
+
25
+ function reference(document: string, heading: string): SectionReference {
26
+ return { document, heading }
27
+ }
28
+
29
+ // The gate's chain governs both the implementation it follows and a stopped ship's report.
30
+ const CHAIN = reference('chain-rule.md', 'Run the review-to-merge chain')
31
+ const PROGRESS = 'backlogrun-progress.md'
32
+
33
+ // Keyed on a verdict token, or on the josh subcommand a command action runs. An action with no row —
34
+ // `wait`, `stop`, a `decide:` line — has no rule to read beyond its own line.
35
+ const GOVERNING_SECTIONS: ReadonlyMap<string, SectionReference> = new Map([
36
+ [ENTRY, reference('split-assessment.md', 'The question')],
37
+ [run_step.IMPLEMENT, CHAIN],
38
+ [run_step.HUMAN_REVIEW, reference('needs-human-review.md', '`needs-human-review`')],
39
+ [run_step.UPDATE_DEPS, reference('latest-gate.md', 'The dependency update')],
40
+ ['followup', reference('followup.md', 'Run `pnpm josh followup`')],
41
+ ['review:round2', reference('prompts/review.md', 'Review round cap')],
42
+ ['run:merge', reference(PROGRESS, "Running a named epic's children")],
43
+ ['backlog:next', reference('backlogrun-steps.md', 'The loop')],
44
+ ['run:cut', reference('pre-gate-cut.md', 'Resuming')],
45
+ ['ship', CHAIN],
46
+ ['retrospective', reference('retrospective.md', 'The end-of-run retrospective')],
47
+ ['run:carry', reference(PROGRESS, 'The hand-off')],
48
+ ])
49
+
50
+ function key_of(action: StepAction): string {
51
+ if (action.kind !== 'command') return action.line
52
+
53
+ const [subcommand = ''] = action.line.slice(JOSH_PREFIX.length).split(COMMAND_SEPARATOR)
54
+
55
+ return subcommand
56
+ }
57
+
58
+ function section_for(key: string): SectionReference | undefined {
59
+ return GOVERNING_SECTIONS.get(key)
60
+ }
61
+
62
+ // Printed through `doc:section` itself, so the extent, the Bash-cap split and the refusal of an
63
+ // unresolved heading are that command's, never a second copy of them.
64
+ function print_section(key: string, root: string = process.cwd()): number {
65
+ const found = section_for(key)
66
+
67
+ if (found === undefined) return SUCCESS_EXIT_CODE
68
+
69
+ return document_section_cli.run([found.document, found.heading], root)
70
+ }
71
+
72
+ function print_for(action: StepAction, root: string = process.cwd()): number {
73
+ return print_section(key_of(action), root)
74
+ }
75
+
76
+ const run_step_section = {
77
+ ENTRY,
78
+ GOVERNING_SECTIONS,
79
+ key_of,
80
+ print_for,
81
+ print_section,
82
+ }
83
+
84
+ export type { SectionReference }
85
+ export { run_step_section }
@@ -271,7 +271,7 @@ function closed_action(input: StepInput): StepAction {
271
271
 
272
272
  return {
273
273
  kind: 'decide',
274
- line: `decide: ${session_cite.issue(input.issue_number)} is closed but this tree holds uncommitted work — keep it with \`git stash push -u -m "${message}"\` | carry it into a new issue`,
274
+ line: `decide: ${session_cite.issue(input.issue_number)} is closed but this tree holds uncommitted work — keep it with \`pnpm josh stash:push "${message}"\` | carry it into a new issue`,
275
275
  }
276
276
  }
277
277
 
@@ -42,6 +42,8 @@ interface DetectPorts {
42
42
  notify_stranded: (body: string) => Promise<boolean>
43
43
  }
44
44
 
45
+ type SameProcess = NonNullable<Parameters<typeof run_stranded.supervisor_liveness>[1]>
46
+
45
47
  interface RecordTargets {
46
48
  carry: string
47
49
  wake: string
@@ -151,6 +153,16 @@ function is_stranded_at(directory: string, ports: DetectPorts = DEFAULT_PORTS):
151
153
  return input !== undefined && run_stranded.is_stranded(input)
152
154
  }
153
155
 
156
+ // The default ports with both liveness probes asked through `same_process` — `run:board` hands the one
157
+ // that reads its own `ps` snapshot (joshuafolkken/kit#4263).
158
+ function ports_with(same_process: SameProcess): DetectPorts {
159
+ return {
160
+ ...DEFAULT_PORTS,
161
+ is_owner_live: (carry) => run_carry.is_owner_live(carry, new Date(), same_process),
162
+ supervisor_liveness: (wake) => run_stranded.supervisor_liveness(wake, same_process),
163
+ }
164
+ }
165
+
154
166
  // The judgement a supervisor asks of the run it is about to stop watching. The asker is that
155
167
  // supervisor on its way out, so it is taken as gone, and so is an owner that is the asker itself
156
168
  // (`run_carry.is_held_by_another`) — that owner is about to be gone. A
@@ -173,6 +185,7 @@ const run_stranded_detect = {
173
185
  detect_and_report,
174
186
  is_left_stranded,
175
187
  is_stranded_at,
188
+ ports_with,
176
189
  run_stranded_check,
177
190
  }
178
191
 
@@ -9,7 +9,7 @@ import { run_watcher_guard } from './run-watcher-guard'
9
9
  // through `run-watcher-hook.ts` so every tool call is checked.
10
10
  //
11
11
  // **Exits 0 (ok) or 1 (stale).** A non-zero exit is what the hook mechanism treats as a refusal —
12
- // the same contract `batch:guard` and `rule:guard` hold.
12
+ // the same contract `pretool:guard` holds.
13
13
 
14
14
  const SUCCESS_EXIT_CODE = 0
15
15
  const FAILURE_EXIT_CODE = 1
@@ -1,4 +1,5 @@
1
1
  import { lane_registry } from '#scripts/lane/lane-registry'
2
+ import { MS_PER_SECOND } from '#scripts/lib/timeouts'
2
3
  import { run_progress_clock } from '#scripts/run/progress/run-progress-clock'
3
4
  import { run_headless } from './run-headless'
4
5
 
@@ -18,7 +19,6 @@ import { run_headless } from './run-headless'
18
19
 
19
20
  const WATCHER_TICK_MS = 30_000
20
21
  const TICK_MULTIPLIER = 3
21
- const MS_PER_SECOND = 1000
22
22
 
23
23
  const STALE_THRESHOLD_MS = WATCHER_TICK_MS * TICK_MULTIPLIER
24
24
  const STALE_THRESHOLD_S = STALE_THRESHOLD_MS / MS_PER_SECOND
@@ -0,0 +1,121 @@
1
+ import { issue_number_shape } from '#scripts/issue/issue-number-shape'
2
+ import { cli_flags } from '#scripts/lib/cli-flags'
3
+ import { run_ship_body_draft } from './run-ship-body-draft'
4
+ import type { ShipArguments } from './run-ship-steps'
5
+
6
+ // The command line `josh ship` takes (`run-ship-cli.ts`). The first positional is the
7
+ // `"<title> #<N>"` string `git -y` and `followup` already take; the issue number is read off its tail
8
+ // for `run:tail`. Any further positionals are follow-up citations filed this run (`fullrun-steps.md`
9
+ // routes branch-2 filing before `ship`), forwarded to `run:tail` after the closed issue so `issue:cite`
10
+ // reports them too. A notify body — `--notify-message` or the shell-body-safe `--notify-message-file` —
11
+ // is forwarded to `followup` alone; the completion prose is composed before this command and passed
12
+ // straight through.
13
+
14
+ const FIRST = 0
15
+ const NUMBER_GROUP = 1
16
+ const EXTRA_CITE_START = 1
17
+ // The issue reference at the tail of the title — `git -y` and `followup` read the whole string, and
18
+ // `run:tail` needs the number alone.
19
+ const TRAILING_ISSUE_PATTERN = /#([1-9]\d*)\s*$/u
20
+ // Both body forms `followup` documents, forwarded verbatim: the inline `--notify-message` and the
21
+ // shell-body-safe `--notify-message-file` a body naming a command or path must use (`followup.md`).
22
+ const NOTIFY_OPTIONS = ['notify-message', 'notify-message-file'] as const
23
+ const { BODY_FILE_OPTION, body_arguments } = run_ship_body_draft
24
+
25
+ type NotifyValues = Partial<Record<(typeof NOTIFY_OPTIONS)[number], string>>
26
+
27
+ const OPTIONS = {
28
+ [NOTIFY_OPTIONS[0]]: { type: 'string' },
29
+ [NOTIFY_OPTIONS[1]]: { type: 'string' },
30
+ [BODY_FILE_OPTION]: { type: 'string' },
31
+ review: { type: 'boolean' },
32
+ // Hand the region to a detached supervisor (`run-ship-detach.ts`), print the
33
+ // report a stopped supervisor left, and carry follow-up citations as options so the supervisor's
34
+ // command line still ends with its title.
35
+ detach: { type: 'boolean' },
36
+ log: { type: 'string' },
37
+ cite: { type: 'string', multiple: true },
38
+ } as const
39
+
40
+ type ShipCommand = { kind: 'ship'; args: ShipArguments } | { kind: 'log'; number: string }
41
+
42
+ // The notify tail `followup` takes — whichever body form the caller composed, forwarded unchanged so a
43
+ // path-based body reaches `followup` exactly as passed.
44
+ function notify_arguments(values: NotifyValues): ReadonlyArray<string> {
45
+ return NOTIFY_OPTIONS.flatMap((option) => {
46
+ const value = values[option]
47
+
48
+ return value === undefined ? [] : [`--${option}`, value]
49
+ })
50
+ }
51
+
52
+ function issue_number(title: string): string | undefined {
53
+ return TRAILING_ISSUE_PATTERN.exec(title)?.[NUMBER_GROUP]
54
+ }
55
+
56
+ interface ParsedValues extends NotifyValues {
57
+ [BODY_FILE_OPTION]?: string
58
+ review?: boolean
59
+ detach?: boolean
60
+ log?: string
61
+ cite?: Array<string>
62
+ }
63
+
64
+ // A follow-up citation passed as a trailing positional is a bare issue number, so a stray flag is
65
+ // refused rather than forwarded to the wrong step.
66
+ function ship_args(
67
+ title: string,
68
+ rest: ReadonlyArray<string>,
69
+ values: ParsedValues,
70
+ ): ShipArguments | undefined {
71
+ const number = issue_number(title)
72
+ const cites = [...rest, ...(values.cite ?? [])]
73
+
74
+ if (number === undefined || cites.some((token) => !issue_number_shape.is_issue_number(token))) {
75
+ return undefined
76
+ }
77
+
78
+ return {
79
+ title,
80
+ number,
81
+ notify: notify_arguments(values),
82
+ body: body_arguments(values[BODY_FILE_OPTION]),
83
+ body_path: values[BODY_FILE_OPTION],
84
+ cites,
85
+ is_review: values.review === true,
86
+ is_detach: values.detach === true,
87
+ }
88
+ }
89
+
90
+ // `--log <N>` stands alone: a bare issue number and nothing to ship.
91
+ function log_command(number: string, positionals: ReadonlyArray<string>): ShipCommand | undefined {
92
+ return issue_number_shape.ISSUE_NUMBER_PATTERN.test(number) && positionals.length === 0
93
+ ? { kind: 'log', number }
94
+ : undefined
95
+ }
96
+
97
+ function command_of(
98
+ values: ParsedValues,
99
+ positionals: ReadonlyArray<string>,
100
+ ): ShipCommand | undefined {
101
+ if (values.log !== undefined) return log_command(values.log, positionals)
102
+
103
+ const title = positionals[FIRST]
104
+ const args =
105
+ title === undefined ? undefined : ship_args(title, positionals.slice(EXTRA_CITE_START), values)
106
+
107
+ return args === undefined ? undefined : { kind: 'ship', args }
108
+ }
109
+
110
+ // Numbers-only tail and a strict parse, so a title with no `#<N>` or a stray flag is refused rather
111
+ // than shipped past the wrong step.
112
+ function parse(argv: ReadonlyArray<string>): ShipCommand | undefined {
113
+ const parsed = cli_flags.arguments_of(argv, OPTIONS)
114
+
115
+ return parsed === undefined ? undefined : command_of(parsed.values, parsed.positionals)
116
+ }
117
+
118
+ const run_ship_args = { parse }
119
+
120
+ export { run_ship_args }
121
+ export type { ShipCommand }