@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
@@ -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 }
@@ -1,19 +1,21 @@
1
1
  #!/usr/bin/env tsx
2
2
  import { fileURLToPath } from 'node:url'
3
- import { issue_number_shape } from '#scripts/issue/issue-number-shape'
4
3
  import { lane_child_marker } from '#scripts/lane/lane-child-marker'
5
4
  import { lane_ledger } from '#scripts/lane/lane-ledger'
6
- import { cli_flags } from '#scripts/lib/cli-flags'
5
+ import { review_stop_log } from '#scripts/review/review-stop-log'
7
6
  import { run_event_stream } from '#scripts/run/event/run-event-stream'
8
7
  import { run_event_stream_emit } from '#scripts/run/event/run-event-stream-emit'
9
8
  import { run_ship, type ShipSection } from './run-ship'
9
+ import { run_ship_args } from './run-ship-args'
10
+ import { run_ship_body_draft } from './run-ship-body-draft'
10
11
  import { run_ship_detach } from './run-ship-detach'
11
- import { run_ship_next } from './run-ship-next'
12
- import { run_ship_pre_detach } from './run-ship-pre-detach'
12
+ import { run_ship_infra_retry } from './run-ship-infra-retry'
13
+ import { run_ship_pre_detach_timed } from './run-ship-pre-detach-timed'
13
14
  import { run_ship_probe } from './run-ship-probe'
14
15
  import { run_ship_return } from './run-ship-return'
15
16
  import { run_ship_stage, type Phase, type ShipState, type Stage } from './run-ship-stage'
16
17
  import { run_ship_steps, type ShipArguments, type Step } from './run-ship-steps'
18
+ import { run_ship_stop_cause } from './run-ship-stop-cause'
17
19
 
18
20
  // `josh ship "<title> #<N>"` — one call for the fixed commit-to-report region a run ships a change on.
19
21
  // It runs `gate`, `git -y`, `followup` and `run:tail` internally, so no round trip re-bills a lane's
@@ -39,51 +41,17 @@ import { run_ship_steps, type ShipArguments, type Step } from './run-ship-steps'
39
41
  // the agent ends at the hand-off instead of relaunching itself for the gate, a supervised ship that stops
40
42
  // hands the stage back (`run-ship-return.ts`), and `--log <N>` prints the report it stopped on.
41
43
  //
42
- // The first positional is the `"<title> #<N>"` string `git -y` and `followup` already take; the issue
43
- // number is read off its tail for `run:tail`. Any further positionals are follow-up citations filed
44
- // this run (`fullrun-steps.md` routes branch-2 filing before `ship`), forwarded to `run:tail` after the
45
- // closed issue so `issue:cite` reports them too. A notify body — `--notify-message` or the
46
- // shell-body-safe `--notify-message-file` — is forwarded to `followup` alone; the completion prose is
47
- // composed before this command and passed straight through.
44
+ // The command line it takes is read in `run-ship-args.ts`.
48
45
 
49
46
  const ARGV_OFFSET = 2
50
47
  const SUCCESS_EXIT_CODE = 0
51
48
  const FAILURE_EXIT_CODE = 1
52
- const FIRST = 0
53
- const NUMBER_GROUP = 1
54
- const EXTRA_CITE_START = 1
55
- // The issue reference at the tail of the title — `git -y` and `followup` read the whole string, and
56
- // `run:tail` needs the number alone.
57
- const TRAILING_ISSUE_PATTERN = /#([1-9]\d*)\s*$/u
58
- // Both body forms `followup` documents, forwarded verbatim: the inline `--notify-message` and the
59
- // shell-body-safe `--notify-message-file` a body naming a command or path must use (`followup.md`).
60
- const NOTIFY_OPTIONS = ['notify-message', 'notify-message-file'] as const
61
- // The PR body carrying the live-execution evidence `followup` gates the merge
62
- // on, forwarded to `git -y` as a path because it holds commands and their output.
63
- const BODY_FILE_OPTION = 'body-file'
64
49
  const USAGE =
65
50
  'Usage: josh ship "<title> #<N>" [<follow-up-N> ...] [--cite <N> ...] [--review] [--detach] [--body-file <path>] [--notify-message <text> | --notify-message-file <path>] | josh ship --log <N>'
66
51
  const NO_LOG_NOTE = 'no detached ship supervisor log for this issue'
67
52
  const LANE_CHILD_DETACH_NOTE =
68
53
  'lane child: shipping through the detached supervisor (--detach implied), so the end of this turn cannot kill it'
69
54
 
70
- type NotifyValues = Partial<Record<(typeof NOTIFY_OPTIONS)[number], string>>
71
-
72
- const OPTIONS = {
73
- [NOTIFY_OPTIONS[0]]: { type: 'string' },
74
- [NOTIFY_OPTIONS[1]]: { type: 'string' },
75
- [BODY_FILE_OPTION]: { type: 'string' },
76
- review: { type: 'boolean' },
77
- // Hand the region to a detached supervisor (`run-ship-detach.ts`), print the
78
- // report a stopped supervisor left, and carry follow-up citations as options so the supervisor's
79
- // command line still ends with its title.
80
- detach: { type: 'boolean' },
81
- log: { type: 'string' },
82
- cite: { type: 'string', multiple: true },
83
- } as const
84
-
85
- type ShipCommand = { kind: 'ship'; args: ShipArguments } | { kind: 'log'; number: string }
86
-
87
55
  // What a resumed ship knows before its first stage: the record's path (absent outside a repository),
88
56
  // the stages it says completed, and the repository's actual state (`run-ship-stage.ts` decides from it).
89
57
  // `started` opens with the stages the record says this attempt started — a supervisor that ended
@@ -95,87 +63,7 @@ interface ShipContext {
95
63
  started: Array<string>
96
64
  }
97
65
 
98
- // The notify tail `followup` takes — whichever body form the caller composed, forwarded unchanged so a
99
- // path-based body reaches `followup` exactly as passed.
100
- function notify_arguments(values: NotifyValues): ReadonlyArray<string> {
101
- return NOTIFY_OPTIONS.flatMap((option) => {
102
- const value = values[option]
103
-
104
- return value === undefined ? [] : [`--${option}`, value]
105
- })
106
- }
107
-
108
- function body_arguments(path: string | undefined): ReadonlyArray<string> {
109
- return path === undefined ? [] : [`--${BODY_FILE_OPTION}`, path]
110
- }
111
-
112
- const { PHASE } = run_ship_stage
113
-
114
- function issue_number(title: string): string | undefined {
115
- return TRAILING_ISSUE_PATTERN.exec(title)?.[NUMBER_GROUP]
116
- }
117
-
118
- interface ParsedValues extends NotifyValues {
119
- [BODY_FILE_OPTION]?: string
120
- review?: boolean
121
- detach?: boolean
122
- log?: string
123
- cite?: Array<string>
124
- }
125
-
126
- // A follow-up citation passed as a trailing positional is a bare issue number, so a stray flag is
127
- // refused rather than forwarded to the wrong step.
128
- function ship_args(
129
- title: string,
130
- rest: ReadonlyArray<string>,
131
- values: ParsedValues,
132
- ): ShipArguments | undefined {
133
- const number = issue_number(title)
134
- const cites = [...rest, ...(values.cite ?? [])]
135
-
136
- if (number === undefined || cites.some((token) => !issue_number_shape.is_issue_number(token))) {
137
- return undefined
138
- }
139
-
140
- return {
141
- title,
142
- number,
143
- notify: notify_arguments(values),
144
- body: body_arguments(values[BODY_FILE_OPTION]),
145
- body_path: values[BODY_FILE_OPTION],
146
- cites,
147
- is_review: values.review === true,
148
- is_detach: values.detach === true,
149
- }
150
- }
151
-
152
- // `--log <N>` stands alone: a bare issue number and nothing to ship.
153
- function log_command(number: string, positionals: ReadonlyArray<string>): ShipCommand | undefined {
154
- return issue_number_shape.ISSUE_NUMBER_PATTERN.test(number) && positionals.length === 0
155
- ? { kind: 'log', number }
156
- : undefined
157
- }
158
-
159
- function command_of(
160
- values: ParsedValues,
161
- positionals: ReadonlyArray<string>,
162
- ): ShipCommand | undefined {
163
- if (values.log !== undefined) return log_command(values.log, positionals)
164
-
165
- const title = positionals[FIRST]
166
- const args =
167
- title === undefined ? undefined : ship_args(title, positionals.slice(EXTRA_CITE_START), values)
168
-
169
- return args === undefined ? undefined : { kind: 'ship', args }
170
- }
171
-
172
- // Numbers-only tail and a strict parse, so a title with no `#<N>` or a stray flag is refused rather
173
- // than shipped past the wrong step.
174
- function parse(argv: ReadonlyArray<string>): ShipCommand | undefined {
175
- const parsed = cli_flags.arguments_of(argv, OPTIONS)
176
-
177
- return parsed === undefined ? undefined : command_of(parsed.values, parsed.positionals)
178
- }
66
+ const { PHASE, STAGE } = run_ship_stage
179
67
 
180
68
  // Every stage that ran is timed into the lane ledger, failed ones included — a stage that stopped the
181
69
  // ship cost the lane its time as well. The append is local and best-effort, so it adds no wait.
@@ -187,15 +75,26 @@ async function record_timed(step: Step, issue: string, elapsed_ms: number): Prom
187
75
  await lane_ledger.record_stage({ stage: step.stage, elapsed_ms, issue: Number(issue) })
188
76
  }
189
77
 
190
- async function run_step(step: Step, args: ShipArguments, state: ShipState): Promise<ShipSection> {
78
+ async function run_once(step: Step, args: ShipArguments, state: ShipState): Promise<ShipSection> {
191
79
  const started_ms = performance.now()
192
80
  const result = await step.run(args, state)
193
81
  const elapsed_ms = performance.now() - started_ms
194
82
 
195
83
  if (result.is_skipped !== true) await record_timed(step, args.number, elapsed_ms)
196
- const section = { header: step.header, body: result.out, code: result.code }
197
84
 
198
- return result.conflicts === undefined ? section : { ...section, conflicts: result.conflicts }
85
+ return run_ship.section_of(step.header, result)
86
+ }
87
+
88
+ // A stage that stopped on the infrastructure runs again in place before it stops the ship. A retry
89
+ // re-reads the state, as a resumed ship does: a commit whose push failed is not made a second time.
90
+ async function run_step(step: Step, args: ShipArguments, state: ShipState): Promise<ShipSection> {
91
+ const first = [state]
92
+
93
+ return await run_ship_infra_retry.retried(step.stage, async () => {
94
+ const current = first.pop() ?? (await run_ship_probe.read_state())
95
+
96
+ return await run_once(step, args, current)
97
+ })
199
98
  }
200
99
 
201
100
  async function emit_phase(
@@ -238,6 +137,12 @@ async function settle(
238
137
  })
239
138
  }
240
139
 
140
+ // A function of its own so the write does not sit after an `await`, where `require-atomic-updates`
141
+ // reads it as a possible race — the reason `held-mark.ts` gives `set_held_mark`.
142
+ function set_state(context: ShipContext, state: ShipState): void {
143
+ context.state = state
144
+ }
145
+
241
146
  // One stage: passed over when the record and the state say it is done, run and recorded otherwise.
242
147
  async function run_stage(
243
148
  step: Step,
@@ -258,6 +163,8 @@ async function run_stage(
258
163
  const section = await run_step(step, args, context.state)
259
164
 
260
165
  await settle(step, args, context, section.code)
166
+ // A review may fix the tree and refreshes the brief, so the stages after it read the state anew.
167
+ if (step.stage === STAGE.REVIEW) set_state(context, await run_ship_probe.read_state())
261
168
 
262
169
  return section
263
170
  }
@@ -271,19 +178,22 @@ async function open_context(args: ShipArguments): Promise<ShipContext> {
271
178
  const done = target === undefined ? new Set<string>() : run_ship_stage.read_done(target)
272
179
  const started = target === undefined ? [] : [...run_ship_stage.read_started(target)]
273
180
 
181
+ // A supervisor that died mid-followup left its wait marked; this one waits on nothing yet.
182
+ record(target, (path) => {
183
+ run_ship_stage.clear_waits(path)
184
+ })
185
+
274
186
  return { target, done, state, started }
275
187
  }
276
188
 
277
189
  // Every stop goes to the lane ledger — supervised, in an agent's own turn, or a lane child's preflight
278
- // before the hand-off — so `lane:stats` can say how long a ship stayed stopped for each reason.
279
- async function record_stop(
280
- args: ShipArguments,
281
- stage: Stage,
282
- conflicts?: ReadonlyArray<string>,
283
- ): Promise<void> {
284
- const reason = run_ship_stage.stop_reason(stage, conflicts)
190
+ // before the hand-off — so `lane:stats` can say how long a ship stayed stopped for each reason. A review
191
+ // stop's deciding findings also go, whole, to the durable stop log `review:stops` reads.
192
+ async function record_stop(args: ShipArguments, stage: Stage, failed?: ShipSection): Promise<void> {
193
+ const issue = Number(args.number)
285
194
 
286
- await lane_ledger.record_stop({ issue: Number(args.number), reason })
195
+ await lane_ledger.record_stop(run_ship_stop_cause.record_of(issue, stage, failed))
196
+ review_stop_log.record({ issue, stage, findings: run_ship_stop_cause.details_of(stage, failed) })
287
197
  }
288
198
 
289
199
  // A detached supervisor hands the stopped stage back (`run-ship-return.ts`); a
@@ -295,19 +205,13 @@ async function stopped(
295
205
  step: Step,
296
206
  context: ShipContext,
297
207
  ): Promise<ReadonlyArray<ShipSection>> {
298
- const conflicts = sections.at(-1)?.conflicts
208
+ const failed = sections.at(-1)
299
209
 
300
- await record_stop(args, step.stage, conflicts)
210
+ await record_stop(args, step.stage, failed)
301
211
 
302
212
  if (run_ship_detach.is_supervised()) {
303
- const resume = run_ship_next.resume_of(args)
304
-
305
213
  record(context.target, run_ship_stage.end_attempt)
306
- await run_ship_return.return_control(
307
- args.number,
308
- step.stage,
309
- conflicts === undefined ? resume : { ...resume, conflicts },
310
- )
214
+ await run_ship_return.hand_back(args, step.stage, failed)
311
215
  }
312
216
 
313
217
  return sections
@@ -379,23 +283,35 @@ function should_detach(args: ShipArguments): boolean {
379
283
  return !run_ship_detach.is_supervised() && lane_child_marker.is_child_of(process.cwd())
380
284
  }
381
285
 
286
+ // The preflight stop's unmet kinds, with `pre-detach` added when those checks went red beside it.
287
+ function with_checks(stop: ShipSection, checks: ShipSection): ShipSection {
288
+ if (checks.code === SUCCESS_EXIT_CODE) return stop
289
+
290
+ return { ...stop, preconditions: [...(stop.preconditions ?? []), lane_ledger.PRE_DETACH_STAGE] }
291
+ }
292
+
382
293
  // The preflight is deterministic and fast, so it runs here, in the agent's own turn, before the
383
294
  // hand-off — a stop it finds is fixed by the same session instead of relaunching one from the
384
- // supervisor. Only the slow stages go to the supervisor, which re-asks the preflight itself. The type
385
- // check and the document tests follow it here for the same reason; they are not a stage, so the
386
- // supervisor's gate runs them again rather than passing over them.
295
+ // supervisor. Only the slow stages go to the supervisor, which re-asks the preflight itself. The fast
296
+ // checks (`run-ship-pre-detach.ts`) follow it here for the same reason; they are not a stage, so the
297
+ // supervisor's gate runs them again rather than passing over them. They run even when the preflight
298
+ // refused, so one ship reports every failure there is to fix (joshuafolkken/kit#4305); the preflight's
299
+ // refusal still comes before its own scoped pair, the one heavy check here.
300
+ //
301
+ // **The refusal is printed last**: a lane child reading the report through `tail` saw only the red
302
+ // metrics or type check after it, fixed those, and shipped into the same refusal again — every repeated
303
+ // preflight stop of joshuafolkken/kit#4478. The stop records the pre-detach checks' red beside the
304
+ // unmet kinds, so the ledger shows which refusals came with one.
387
305
  async function pre_detach_sections(args: ShipArguments): Promise<ReadonlyArray<ShipSection>> {
388
306
  const preflight = await run_stage(run_ship_steps.PREFLIGHT_STEP, args, await open_context(args))
307
+ const result = await run_ship_pre_detach_timed.checks(args.number)
308
+ const checks = { header: run_ship.PRE_DETACH_HEADER, body: result.out, code: result.code }
389
309
 
390
310
  if (preflight.code !== SUCCESS_EXIT_CODE) {
391
- await record_stop(args, run_ship_steps.PREFLIGHT_STEP.stage)
392
-
393
- return [preflight]
311
+ await record_stop(args, run_ship_steps.PREFLIGHT_STEP.stage, with_checks(preflight, checks))
394
312
  }
395
313
 
396
- const result = await run_ship_pre_detach.checks()
397
-
398
- return [preflight, { header: run_ship.PRE_DETACH_HEADER, body: result.out, code: result.code }]
314
+ return [checks, preflight]
399
315
  }
400
316
 
401
317
  async function detach_after_preflight(args: ShipArguments): Promise<number> {
@@ -444,7 +360,7 @@ async function run_ship_command(args: ShipArguments): Promise<number> {
444
360
  }
445
361
 
446
362
  async function run(argv: ReadonlyArray<string>): Promise<number> {
447
- const command = parse(argv)
363
+ const command = run_ship_args.parse(argv)
448
364
 
449
365
  if (command === undefined) {
450
366
  console.error(USAGE)
@@ -454,7 +370,7 @@ async function run(argv: ReadonlyArray<string>): Promise<number> {
454
370
 
455
371
  return command.kind === 'log'
456
372
  ? await print_log(command.number)
457
- : await run_ship_command(command.args)
373
+ : await run_ship_command(await run_ship_body_draft.with_draft(command.args))
458
374
  }
459
375
 
460
376
  async function main(argv: ReadonlyArray<string>): Promise<void> {
@@ -58,6 +58,7 @@ const RECORD_WAIT_ATTEMPTS = 200
58
58
  // a `pnpm josh ship` start-up, far below the lifetime a reused pid could otherwise be believed for.
59
59
  const CLAIM_WINDOW_MS = 120_000
60
60
  type ShipResult = 'running' | 'success' | 'failed' | 'abnormal'
61
+ type StartRead = (pid: number) => string | undefined
61
62
 
62
63
  interface ShipRecord {
63
64
  pid?: number | undefined
@@ -146,35 +147,43 @@ function is_within_claim_window(record: ShipRecord): boolean {
146
147
  return record.launched_at !== undefined && Date.now() - record.launched_at < CLAIM_WINDOW_MS
147
148
  }
148
149
 
149
- function has_live_identity(pid: number, record: ShipRecord): boolean {
150
+ function has_live_identity(pid: number, record: ShipRecord, read: StartRead): boolean {
150
151
  if (record.process_start === undefined) {
151
152
  return is_within_claim_window(record) && process_identity.is_live_pid(pid)
152
153
  }
153
154
 
154
- return process_identity.is_same_process(pid, record.process_start) !== false
155
+ return process_identity.is_same_process(pid, record.process_start, read) !== false
155
156
  }
156
157
 
157
- function result_of(record: ShipRecord): ShipResult {
158
+ function result_of(record: ShipRecord, read: StartRead): ShipResult {
158
159
  if (record.pid === undefined) {
159
- const is_launcher = process_identity.is_same_process(record.launcher_pid, record.launcher_start)
160
+ const { launcher_pid, launcher_start } = record
161
+ const is_launcher = process_identity.is_same_process(launcher_pid, launcher_start, read)
160
162
 
161
163
  return is_launcher === false ? 'abnormal' : 'running'
162
164
  }
163
165
 
164
- if (has_live_identity(record.pid, record)) return 'running'
166
+ if (has_live_identity(record.pid, record, read)) return 'running'
165
167
 
166
168
  return record.result ?? 'abnormal'
167
169
  }
168
170
 
171
+ // `read` answers each recorded process's start time: a reader holding one process snapshot passes its
172
+ // own, so the reading starts no `ps` (joshuafolkken/kit#4245).
169
173
  function read_result(
170
174
  repository: string,
171
175
  number: string,
172
- ): { launch_id: string; result: ShipResult } | undefined {
176
+ read: StartRead = process_identity.read_start,
177
+ ): { launch_id: string; launched_at?: number | undefined; result: ShipResult } | undefined {
173
178
  const record = read_record(repository, number)
174
179
 
175
180
  return record === undefined
176
181
  ? undefined
177
- : { launch_id: record.launch_id, result: result_of(record) }
182
+ : {
183
+ launch_id: record.launch_id,
184
+ launched_at: record.launched_at,
185
+ result: result_of(record, read),
186
+ }
178
187
  }
179
188
 
180
189
  function current_record(repository: string, number: string): ShipRecord | undefined {
@@ -183,6 +192,16 @@ function current_record(repository: string, number: string): ShipRecord | undefi
183
192
  return record?.launch_id === process.env[LAUNCH_ID_KEY] ? record : undefined
184
193
  }
185
194
 
195
+ // When the ship for `number` that is still running was launched — `undefined` where none is running or
196
+ // its record carries no launch time. `run-ship-overlap.ts` orders two running ships by it.
197
+ function running_since(repository: string, number: string): number | undefined {
198
+ const record = read_record(repository, number)
199
+
200
+ return record !== undefined && result_of(record, process_identity.read_start) === 'running'
201
+ ? record.launched_at
202
+ : undefined
203
+ }
204
+
186
205
  function is_pending(record: ShipRecord | undefined): boolean {
187
206
  return record !== undefined && record.pid === undefined
188
207
  }
@@ -362,6 +381,7 @@ const run_ship_detach = {
362
381
  last_launch,
363
382
  log_path,
364
383
  read_log,
384
+ running_since,
365
385
  supervisor_argv,
366
386
  }
367
387
 
@@ -0,0 +1,59 @@
1
+ import { setTimeout as delay } from 'node:timers/promises'
2
+ import type { ShipSection } from './run-ship'
3
+ import type { Stage } from './run-ship-stage'
4
+ import { run_ship_stop_cause } from './run-ship-stop-cause'
5
+
6
+ // A stage that stopped on the infrastructure is run again in place, a bounded number of times, before
7
+ // the ship stops (joshuafolkken/kit#3998). Re-running a stage is what a resumed ship does already, so
8
+ // a retry repeats nothing a relaunched lane would not; it only skips the stop, the relaunch and the
9
+ // wait in between. Any other stop — a finding, a red check, a conflict — returns at once, and so does a
10
+ // review round's, a reviewer that did not finish included: a review is never re-run in place.
11
+
12
+ const MAX_INFRA_RETRIES = 2
13
+ const RETRY_DELAY_MS = 60_000
14
+ const RETRY_CAP = String(MAX_INFRA_RETRIES)
15
+
16
+ type Attempt = () => Promise<ShipSection>
17
+
18
+ interface RetryHooks {
19
+ wait: (milliseconds: number) => Promise<void>
20
+ note: (text: string) => void
21
+ }
22
+
23
+ const DEFAULT_HOOKS: RetryHooks = {
24
+ wait: async (milliseconds) => {
25
+ await delay(milliseconds)
26
+ },
27
+ note: (text) => {
28
+ process.stderr.write(`${text}\n`)
29
+ },
30
+ }
31
+
32
+ function is_retryable(stage: Stage, section: ShipSection): boolean {
33
+ if (section.code === 0 || run_ship_stop_cause.is_review(stage)) return false
34
+
35
+ return run_ship_stop_cause.cause_of(stage, section) === run_ship_stop_cause.CAUSE.INFRA
36
+ }
37
+
38
+ async function retried(
39
+ stage: Stage,
40
+ attempt: Attempt,
41
+ hooks: RetryHooks = DEFAULT_HOOKS,
42
+ retries_left = MAX_INFRA_RETRIES,
43
+ ): Promise<ShipSection> {
44
+ const section = await attempt()
45
+
46
+ if (retries_left === 0 || !is_retryable(stage, section)) return section
47
+
48
+ const ordinal = String(MAX_INFRA_RETRIES - retries_left + 1)
49
+
50
+ hooks.note(`josh ship: ${stage} stopped on the infrastructure — retry ${ordinal}/${RETRY_CAP}`)
51
+ await hooks.wait(RETRY_DELAY_MS)
52
+
53
+ return await retried(stage, attempt, hooks, retries_left - 1)
54
+ }
55
+
56
+ const run_ship_infra_retry = { MAX_INFRA_RETRIES, RETRY_DELAY_MS, retried }
57
+
58
+ export type { RetryHooks }
59
+ export { run_ship_infra_retry }
@@ -1,5 +1,6 @@
1
1
  import { run_ship_stage, type Stage } from './run-ship-stage'
2
2
  import type { ShipArguments } from './run-ship-steps'
3
+ import type { Cause } from './run-ship-stop-cause'
3
4
 
4
5
  // The command a relaunched lane child runs once it has fixed what stopped its detached ship.
5
6
  // The stopped stage decides the command mechanically, so it is decided here, once, and the prompt
@@ -43,6 +44,10 @@ interface ShipResume {
43
44
  is_review: boolean
44
45
  // The paths a merge of the default branch left unmerged.
45
46
  conflicts?: ReadonlyArray<string>
47
+ // The cause a stopped review round tagged its stop with (`run-ship-stop-cause.ts`).
48
+ cause?: Cause
49
+ // The issue changed after the recorded review's brief (`run-ship-probe.ts`).
50
+ is_review_stale?: boolean
46
51
  }
47
52
 
48
53
  // Single quotes, so a `$` or a backtick in a title is never expanded by the shell that runs it.
@@ -98,19 +103,38 @@ const AFTER_FIX: Record<Stage, (resume: ShipResume) => string> = {
98
103
  [STAGE.REPORT]: detach_again,
99
104
  }
100
105
 
106
+ // Whatever stage stopped, a review that read the issue before its update is round 1's to redo: the
107
+ // supervisor reviews it again even on a committed tree (`run-ship-stage.ts`), and `josh followup`
108
+ // refuses the merge until it has (joshuafolkken/kit#4221).
109
+ function detach_review_again(resume: ShipResume): string {
110
+ return `leave the fix uncommitted and run \`${ship_command(COMMAND.DETACH_REVIEW, resume)}\` — the review read the issue before its update, so the supervisor reviews round 1 again.`
111
+ }
112
+
113
+ function after_fix(stage: Stage, resume: ShipResume): string {
114
+ return resume.is_review_stale === true ? detach_review_again(resume) : AFTER_FIX[stage](resume)
115
+ }
116
+
101
117
  // A conflict names its paths, so the resumed session resolves them without
102
118
  // reading the report or asking git which files are unmerged.
103
119
  function conflict_step(conflicts: ReadonlyArray<string>): string {
104
120
  return `Resolve the conflict with origin/main in ${conflicts.join(', ')} (the merge is left in progress: remove the conflict markers in those files), then`
105
121
  }
106
122
 
123
+ // A prompt that already carries the failed output points at it; only one without has the
124
+ // session read the stopped report first.
125
+ function fix_step(issue: string, stage: Stage, is_excerpted: boolean): string {
126
+ if (is_excerpted) return `Fix the ${stage} failure shown in the output below`
127
+
128
+ return `Read the stopped report with \`${COMMAND.LOG} ${issue}\`, fix the ${stage} failure`
129
+ }
130
+
107
131
  // Two lines' worth: read the stopped report, then the one command that resumes after the fix.
108
- function next_step(issue: string, stage: Stage, resume: ShipResume): string {
132
+ function next_step(issue: string, stage: Stage, resume: ShipResume, is_excerpted = false): string {
109
133
  const conflicts = resume.conflicts ?? []
110
134
 
111
- if (conflicts.length > 0) return `${conflict_step(conflicts)} ${AFTER_FIX[stage](resume)}`
135
+ if (conflicts.length > 0) return `${conflict_step(conflicts)} ${after_fix(stage, resume)}`
112
136
 
113
- return `Read the stopped report with \`${COMMAND.LOG} ${issue}\`, fix the ${stage} failure, then ${AFTER_FIX[stage](resume)}`
137
+ return `${fix_step(issue, stage, is_excerpted)}, then ${after_fix(stage, resume)}`
114
138
  }
115
139
 
116
140
  const run_ship_next = { COMMAND, next_step, quoted, resume_of }