@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,3 +1,4 @@
1
+ import { delegation_policy } from '#scripts/delegation/delegation-policy'
1
2
  import { issue_state, type IssueState } from '#scripts/issue/issue-state'
2
3
 
3
4
  // `josh run:prep <N>` — the reads a `fullrun` makes before its first edit, assembled into one report.
@@ -22,6 +23,9 @@ const CONTENT_HEADER = '=== issue ==='
22
23
  const STATE_HEADER = '=== state ==='
23
24
  const LATEST_HEADER = '=== dependency update ==='
24
25
  const LOCATIONS_HEADER = '=== code locations ==='
26
+ const INVESTIGATION_HEADER = '=== investigation ==='
27
+ // The step the investigation guard would otherwise name only once it refuses, mid-reading (#4345).
28
+ const INVESTIGATION_BODY = `Delegate before the first read — the guard refuses at ${delegation_policy.INVESTIGATION_LIMIT}. ${delegation_policy.INVESTIGATION_STEP} Brief it with the code locations above; read in the main line only the files this run will edit.`
25
29
  const SHIP_HEADER = '=== ship preconditions ==='
26
30
  const SHIP_MET = 'met — nothing `josh ship` refuses on as the tree stands'
27
31
  const SHIP_UNMET =
@@ -89,12 +93,14 @@ function format_report(parts: PrepParts): string {
89
93
  section(STATE_HEADER, state_body(parts)),
90
94
  section(LATEST_HEADER, `${parts.latest_scope}${LATEST_JOINER}${parts.latest_reason}`),
91
95
  section(LOCATIONS_HEADER, parts.locations),
96
+ section(INVESTIGATION_HEADER, INVESTIGATION_BODY),
92
97
  section(SHIP_HEADER, ship_body(parts.ship_problems)),
93
98
  ].join(SECTION_SEPARATOR)
94
99
  }
95
100
 
96
101
  const run_prep = {
97
102
  CONTENT_HEADER,
103
+ INVESTIGATION_HEADER,
98
104
  LATEST_HEADER,
99
105
  LOCATIONS_HEADER,
100
106
  SHIP_HEADER,
@@ -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 }
@@ -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 }
@@ -0,0 +1,110 @@
1
+ import { access, rm, writeFile } from 'node:fs/promises'
2
+ import path from 'node:path'
3
+ import { git_command } from '#scripts/git/git-command'
4
+ import { acceptance_map } from '#scripts/review/acceptance-map'
5
+ import { live_evidence } from '#scripts/review/live-evidence'
6
+ import { removed_tests } from '#scripts/review/removed-tests'
7
+ import type { ShipArguments } from './run-ship-steps'
8
+
9
+ // **The pull-request body a run fills in before `josh ship`, written where ship reads it.** The
10
+ // acceptance-map and live-evidence refusals stopped about one ship per merge: their rows were printed
11
+ // at `run:prep`, long before the ship, and the lane child's ship carried no `--body-file` at all
12
+ // (joshuafolkken/kit#4168). The rows now land in a file in the work tree's own git directory — outside
13
+ // the tree, so no check sees it as a change — and `josh ship` reads it when `--body-file` is omitted,
14
+ // handing it to the preflight, `git -y` and a detached supervisor alike (`with_draft`).
15
+ // Nothing is satisfied for the run: each row still carries its pending ending and the evidence section is empty, so
16
+ // the same refusals stand until the run writes them.
17
+
18
+ // The PR body carrying the live-execution evidence `followup` gates the merge
19
+ // on, forwarded to `git -y` as a path because it holds commands and their output.
20
+ const BODY_FILE_OPTION = 'body-file' as const
21
+ const DRAFT_PREFIX = 'josh-ship-body-'
22
+ const DRAFT_SUFFIX = '.md'
23
+ const EXISTS_CODE = 'EEXIST'
24
+ const NO_GIT_DIRECTORY = 'no git directory to hold the ship body draft'
25
+
26
+ async function path_of(issue_number: string): Promise<string> {
27
+ const [git_directory] = await git_command.git_directories()
28
+
29
+ if (git_directory === undefined) throw new Error(NO_GIT_DIRECTORY)
30
+
31
+ return path.join(git_directory, `${DRAFT_PREFIX}${issue_number}${DRAFT_SUFFIX}`)
32
+ }
33
+
34
+ function is_exists_error(error: unknown): boolean {
35
+ return error instanceof Error && 'code' in error && error.code === EXISTS_CODE
36
+ }
37
+
38
+ // The formats the preflight refuses on, as comments a rendered body hides: lanes that wrote the rows and
39
+ // the evidence in shapes of their own met them only at the refusal (joshuafolkken/kit#4478). They sit
40
+ // above the evidence heading, so their backticks are never read as that section's command.
41
+ const FORMAT_HINTS: ReadonlyArray<string> = [
42
+ acceptance_map.ROW_FORMAT,
43
+ live_evidence.EVIDENCE_FORMAT,
44
+ `when the change removes or renames a test, ${removed_tests.ROW_FORMAT}`,
45
+ ]
46
+
47
+ function hint_line(format: string): string {
48
+ return `<!-- ${format} -->`
49
+ }
50
+
51
+ function draft_text(acceptance_rows: string): string {
52
+ const hints = FORMAT_HINTS.map((format) => hint_line(format)).join('\n')
53
+
54
+ return `${acceptance_rows}\n\n${hints}\n\n${live_evidence.EVIDENCE_HEADING}\n`
55
+ }
56
+
57
+ // Written once: a draft the run has already filled in is never replaced by pending rows.
58
+ async function prepare(issue_number: string, acceptance_rows: string): Promise<string> {
59
+ const target = await path_of(issue_number)
60
+
61
+ try {
62
+ await writeFile(target, draft_text(acceptance_rows), { flag: 'wx' })
63
+ } catch (error) {
64
+ if (!is_exists_error(error)) throw error
65
+ }
66
+
67
+ return target
68
+ }
69
+
70
+ async function existing(issue_number: string): Promise<string | undefined> {
71
+ const target = await path_of(issue_number)
72
+
73
+ try {
74
+ await access(target)
75
+
76
+ return target
77
+ } catch {
78
+ return undefined
79
+ }
80
+ }
81
+
82
+ // Removed once the pull request merged: keyed by issue number alone, a draft left in a git directory
83
+ // no lane close prunes (the main checkout's `.git`) would hand a reopened issue's ship the old body.
84
+ async function remove(issue_number: string): Promise<void> {
85
+ await rm(await path_of(issue_number), { force: true })
86
+ }
87
+
88
+ function body_arguments(body_path: string | undefined): ReadonlyArray<string> {
89
+ return body_path === undefined ? [] : [`--${BODY_FILE_OPTION}`, body_path]
90
+ }
91
+
92
+ // The ship's `--body-file`, or the draft when it was omitted and one exists.
93
+ async function with_draft(args: ShipArguments): Promise<ShipArguments> {
94
+ if (args.body_path !== undefined) return args
95
+ const draft = await existing(args.number)
96
+
97
+ return draft === undefined ? args : { ...args, body: body_arguments(draft), body_path: draft }
98
+ }
99
+
100
+ const run_ship_body_draft = {
101
+ BODY_FILE_OPTION,
102
+ body_arguments,
103
+ existing,
104
+ path_of,
105
+ prepare,
106
+ remove,
107
+ with_draft,
108
+ }
109
+
110
+ export { run_ship_body_draft }