@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
@@ -0,0 +1,96 @@
1
+ import { setTimeout as sleep } from 'node:timers/promises'
2
+ import { backlog_ready } from '#scripts/backlog/backlog-ready'
3
+ import { git_common_directory } from '#scripts/git/git-common-directory'
4
+ import { lane_capacity } from '#scripts/lane/lane-capacity'
5
+ import { lane_handoff } from '#scripts/lane/lane-handoff'
6
+ import { lane_registry, type LaneInfo } from '#scripts/lane/lane-registry'
7
+ import { run_ship_stage, type Stage } from './run-ship-stage'
8
+
9
+ // **A followup stop past the lane limit waits for a place, then relaunches**: its lane held no place
10
+ // while it waited (`backlog-occupied.ts`), so the next launch may have taken it, and a child started at
11
+ // once would run past the limit (joshuafolkken/kit#4466). The stopped lane counts again while this
12
+ // supervisor waits, so the driver launches nothing into the place it waits for. An unreadable limit or
13
+ // lane count relaunches at once, and so does a place that does not free within the wait.
14
+ //
15
+ // **Waiters queue in issue order rather than block each other**: every waiter counts in the lane use,
16
+ // so three of them past a limit of two would each see the lanes full and wait out the hour together. A
17
+ // waiter leaves out the waiters behind it, so the first ones that fit relaunch and the rest wait on them.
18
+ // The mark is the ship stage record's (`run_ship_stage.mark_place_waiting`), read only while the ship
19
+ // runs, so a dead supervisor's mark queues nobody.
20
+
21
+ // An hour of lane counts, half a minute apart: about two lanes' median run (`lane:stats`).
22
+ const PLACE_POLL_MS = 30_000
23
+ const PLACE_POLLS = 120
24
+
25
+ function is_behind(lane: LaneInfo, issue: string): boolean {
26
+ return lane.issue.localeCompare(issue, undefined, { numeric: true }) > 0
27
+ }
28
+
29
+ async function waiters_behind(issue: string): Promise<number> {
30
+ const lanes = await lane_registry.list_lanes()
31
+
32
+ return lanes.filter(
33
+ (lane) => is_behind(lane, issue) && lane_handoff.is_place_waiting(lane.issue, lane.directory),
34
+ ).length
35
+ }
36
+
37
+ async function is_over_limit(issue: string): Promise<boolean> {
38
+ const limit = await lane_capacity.lane_limit()
39
+
40
+ if (limit.kind !== 'limit') return false
41
+
42
+ const use = await backlog_ready.lane_use()
43
+ const behind = await waiters_behind(issue)
44
+
45
+ return use.occupied - behind > lane_capacity.seated_limit(limit.limit)
46
+ }
47
+
48
+ async function is_place_taken(issue: string): Promise<boolean> {
49
+ try {
50
+ return await is_over_limit(issue)
51
+ } catch {
52
+ return false
53
+ }
54
+ }
55
+
56
+ // Best-effort: a mark that could not be written leaves this waiter counted by the others, as before.
57
+ function mark(lane: LaneInfo, is_waiting: boolean): void {
58
+ const repository = git_common_directory.repository(lane.directory)
59
+
60
+ if (repository === undefined) return
61
+
62
+ try {
63
+ run_ship_stage.mark_place_waiting(
64
+ run_ship_stage.record_path(repository, lane.issue),
65
+ is_waiting,
66
+ )
67
+ } catch {
68
+ // The queue only orders waiters; an unmarked one still waits on the lane count.
69
+ }
70
+ }
71
+
72
+ async function poll(issue: string): Promise<void> {
73
+ for (let polled = 0; polled < PLACE_POLLS; polled += 1) {
74
+ // eslint-disable-next-line no-await-in-loop -- polling: each check waits on a lane the previous one saw busy
75
+ if (!(await is_place_taken(issue))) return
76
+
77
+ // eslint-disable-next-line no-await-in-loop -- polling: the wait between two lane counts
78
+ await sleep(PLACE_POLL_MS)
79
+ }
80
+ }
81
+
82
+ async function await_place(lane: LaneInfo, stage: Stage): Promise<void> {
83
+ if (stage !== run_ship_stage.STAGE.FOLLOWUP) return
84
+
85
+ mark(lane, true)
86
+
87
+ try {
88
+ await poll(lane.issue)
89
+ } finally {
90
+ mark(lane, false)
91
+ }
92
+ }
93
+
94
+ const run_ship_place = { await_place }
95
+
96
+ export { run_ship_place }
@@ -0,0 +1,43 @@
1
+ import type { JoshResult } from '#scripts/josh/josh-run'
2
+ import { lane_ledger } from '#scripts/lane/lane-ledger'
3
+ import { run_event_stream } from '#scripts/run/event/run-event-stream'
4
+ import { run_event_stream_emit } from '#scripts/run/event/run-event-stream-emit'
5
+ import { run_ship_pre_detach } from './run-ship-pre-detach'
6
+ import { run_ship_stage, type Phase } from './run-ship-stage'
7
+
8
+ // The pre-detach checks, timed into the lane ledger and marked on the event stream as a ship stage
9
+ // is, so their minutes are no longer folded into the lane's implementation time
10
+ // (joshuafolkken/kit#4382). They are not a `Stage`: nothing resumes past them, and `run:board` draws no
11
+ // phase from a word it does not know.
12
+
13
+ const SUCCESS_EXIT_CODE = 0
14
+ const { PHASE } = run_ship_stage
15
+
16
+ async function emit_phase(issue: string, phase: Phase): Promise<void> {
17
+ const text = run_ship_stage.event_text(issue, lane_ledger.PRE_DETACH_STAGE, phase)
18
+
19
+ await run_event_stream_emit.emit(run_event_stream.EVENT_KIND.SHIP_STAGE, text)
20
+ }
21
+
22
+ async function checks(
23
+ issue: string,
24
+ run: () => Promise<JoshResult> = run_ship_pre_detach.checks,
25
+ ): Promise<JoshResult> {
26
+ await emit_phase(issue, PHASE.START)
27
+ const started_ms = performance.now()
28
+ const result = await run()
29
+ const elapsed_ms = performance.now() - started_ms
30
+
31
+ await lane_ledger.record_stage({
32
+ stage: lane_ledger.PRE_DETACH_STAGE,
33
+ elapsed_ms,
34
+ issue: Number(issue),
35
+ })
36
+ await emit_phase(issue, result.code === SUCCESS_EXIT_CODE ? PHASE.DONE : PHASE.FAILED)
37
+
38
+ return result
39
+ }
40
+
41
+ const run_ship_pre_detach_timed = { checks }
42
+
43
+ export { run_ship_pre_detach_timed }
@@ -1,17 +1,29 @@
1
1
  import { existsSync } from 'node:fs'
2
2
  import path from 'node:path'
3
+ import { check_reuse, type CheckRecords } from '#scripts/gate/check-reuse'
4
+ import { gate_plan } from '#scripts/gate/gate-plan'
5
+ import type { GateStepResult } from '#scripts/gate/gate-report'
6
+ import { gate_tree } from '#scripts/gate/gate-tree'
3
7
  import { project_checks } from '#scripts/gate/project-checks'
4
8
  import { type_check_step } from '#scripts/gate/type-check-step'
5
9
  import type { JoshResult } from '#scripts/josh/josh-run'
6
10
  import { buffered_process, type BufferedProcessResult } from '#scripts/lib/buffered-process'
7
11
 
8
- // The fast checks a detached `josh ship` runs in the agent's own turn, after the preflight and before
9
- // the hand-off: a type error in a file the related-only checks never touched, an export nothing reads,
12
+ // The fast checks a detached `josh ship` runs in the agent's own turn, after the preflight (whatever it
13
+ // answered) and before the hand-off:a type error in a file the related-only checks never touched, an export nothing reads,
10
14
  // an unknown word, or a guard test (a SKILL.md pointer, a byte budget, the command list, a source with
11
15
  // no colocated test, a bare issue citation) that only the full suite runs, would otherwise first
12
16
  // surface after the detach and cost a relaunched session. They answer in seconds, so the same session
13
- // fixes what they find and ships again. **Nothing moves out of the gate**: the supervised gate stage
14
- // still runs every check, these included.
17
+ // fixes what they find and ships again.
18
+ //
19
+ // **Nothing moves out of the gate, and the gate reuses what these already answered**: a check that is
20
+ // the gate's own check passed silently here is recorded with the gate's per-check record
21
+ // (`check-reuse.ts`), so the supervised gate stage reuses it while its declared inputs have not moved
22
+ // and runs it again when they have. The record, its judgment and its inputs are the gate's; only the
23
+ // type check (`check`) and `exports:unused` (`exports`) carry a gate label. The rest stay unrecorded:
24
+ // `cspell:dot` declares no inputs and runs every gate (`verification-inputs.ts`), the guard tests are a
25
+ // slice of the unit suite and do not answer for the gate's `test:unit`, and the metrics totals leave
26
+ // out the durations the gate's `metrics` holds.
15
27
  //
16
28
  // joshuafolkken/kit#3924: nine of ten ship gate stops were `exports:unused`, `cspell:dot` or a
17
29
  // repository-wide guard test failing on the child's own code — none a check `test:related` selects,
@@ -25,14 +37,26 @@ import { buffered_process, type BufferedProcessResult } from '#scripts/lib/buffe
25
37
  // durations are left out: they read the gate ledger, stale before the detach, so they stay with the
26
38
  // supervised gate.
27
39
 
40
+ interface PreDetachCheck {
41
+ list: ReadonlyArray<string>
42
+ // The gate check this one answers for, absent where it answers for none.
43
+ label?: string | undefined
44
+ }
45
+
46
+ interface PreDetachRun {
47
+ check: PreDetachCheck
48
+ result: BufferedProcessResult
49
+ elapsed_ms: number
50
+ }
51
+
28
52
  const SUCCESS_EXIT_CODE = 0
29
53
  const FAILURE_EXIT_CODE = 1
30
54
  const SECTION_SEPARATOR = '\n\n'
31
55
  const PASSED = 'pre-detach checks passed'
32
56
  const METRICS_TOTALS_COMMAND: ReadonlyArray<string> = ['josh', 'metrics', '--totals-only']
33
- const STATIC_CHECKS: ReadonlyArray<ReadonlyArray<string>> = [
34
- ['josh', 'exports:unused'],
35
- ['josh', 'cspell:dot'],
57
+ const STATIC_CHECKS: ReadonlyArray<PreDetachCheck> = [
58
+ { list: ['josh', 'exports:unused'], label: gate_plan.EXPORTS_LABEL },
59
+ { list: ['josh', 'cspell:dot'] },
36
60
  ]
37
61
  const GUARD_TEST_TARGETS: ReadonlyArray<string> = [
38
62
  'scripts/document',
@@ -40,8 +64,8 @@ const GUARD_TEST_TARGETS: ReadonlyArray<string> = [
40
64
  'scripts/rules',
41
65
  'scripts/josh/josh-command-map.test.ts',
42
66
  'scripts/issue/session-cite-scan.test.ts',
43
- 'scripts/test/untested-sources.test.ts',
44
- 'scripts/test/pure-files.test.ts',
67
+ 'tools/test/untested-sources.test.ts',
68
+ 'tools/test/pure-files.test.ts',
45
69
  ]
46
70
  // A present directory need not hold a test the project's Vitest includes — a consumer's own
47
71
  // `scripts/claude` of shell helpers, say — and a filter that matches nothing would stop every ship.
@@ -51,34 +75,52 @@ function present_targets(directory: string): ReadonlyArray<string> {
51
75
  return GUARD_TEST_TARGETS.filter((target) => existsSync(path.join(directory, target)))
52
76
  }
53
77
 
54
- function guard_tests(directory: string): Array<ReadonlyArray<string>> {
78
+ function guard_tests(directory: string): Array<PreDetachCheck> {
55
79
  const targets = present_targets(directory)
56
80
 
57
- return targets.length === 0 ? [] : [[...GUARD_TEST_COMMAND, ...targets]]
81
+ return targets.length === 0 ? [] : [{ list: [...GUARD_TEST_COMMAND, ...targets] }]
58
82
  }
59
83
 
60
84
  // The same kit-only rule as the gate's `is_kit_only` step: a consumer's kit has no `josh metrics`.
61
- function kit_only(directory: string): Array<ReadonlyArray<string>> {
62
- return project_checks.is_kit_repository(directory) ? [METRICS_TOTALS_COMMAND] : []
85
+ function kit_only(directory: string): Array<PreDetachCheck> {
86
+ return project_checks.is_kit_repository(directory) ? [{ list: METRICS_TOTALS_COMMAND }] : []
63
87
  }
64
88
 
65
- async function command_lists(directory: string): Promise<Array<ReadonlyArray<string>>> {
89
+ async function command_lists(directory: string): Promise<Array<PreDetachCheck>> {
66
90
  const type_check = await type_check_step.resolve_type_check_args(directory)
67
91
 
68
- return [type_check, ...STATIC_CHECKS, ...guard_tests(directory), ...kit_only(directory)]
92
+ return [
93
+ { list: type_check, label: gate_plan.TYPE_CHECK_LABEL },
94
+ ...STATIC_CHECKS,
95
+ ...guard_tests(directory),
96
+ ...kit_only(directory),
97
+ ]
69
98
  }
70
99
 
71
- async function run_in(
72
- directory: string,
73
- list: ReadonlyArray<string>,
74
- ): Promise<BufferedProcessResult> {
75
- return await buffered_process.run_buffered_process(list, { cwd: directory })
100
+ async function run_in(directory: string, check: PreDetachCheck): Promise<PreDetachRun> {
101
+ const started = performance.now()
102
+ const result = await buffered_process.run_buffered_process(check.list, { cwd: directory })
103
+
104
+ return { check, result, elapsed_ms: performance.now() - started }
76
105
  }
77
106
 
78
- // All run at once, buffered, and every failure is reported, so one ship shows all there is to fix.
79
- async function checks(directory: string = process.cwd()): Promise<JoshResult> {
80
- const lists = await command_lists(directory)
81
- const results = await Promise.all(lists.map(async (list) => await run_in(directory, list)))
107
+ interface GateRun extends PreDetachRun {
108
+ check: { list: ReadonlyArray<string>; label: string }
109
+ }
110
+
111
+ function is_gate_run(run: PreDetachRun): run is GateRun {
112
+ return run.check.label !== undefined
113
+ }
114
+
115
+ function gate_results(runs: ReadonlyArray<PreDetachRun>): Array<GateStepResult> {
116
+ return runs
117
+ .filter((run) => is_gate_run(run))
118
+ .map(({ check, result, elapsed_ms }) => {
119
+ return { ...result, label: check.label, command: check.list.join(' '), elapsed_ms }
120
+ })
121
+ }
122
+
123
+ function verdict(results: ReadonlyArray<BufferedProcessResult>): JoshResult {
82
124
  const failed = results.filter((result) => buffered_process.is_process_failed(result))
83
125
 
84
126
  if (failed.length === 0) return { code: SUCCESS_EXIT_CODE, out: PASSED }
@@ -89,6 +131,20 @@ async function checks(directory: string = process.cwd()): Promise<JoshResult> {
89
131
  }
90
132
  }
91
133
 
134
+ // All run at once, buffered, and every failure is reported, so one ship shows all there is to fix.
135
+ // The tree is read before they start, so a record is written only for the tree they read.
136
+ async function checks(
137
+ directory: string = process.cwd(),
138
+ records: CheckRecords = check_reuse.DEFAULT_RECORDS,
139
+ ): Promise<JoshResult> {
140
+ const [lists, tree] = await Promise.all([command_lists(directory), gate_tree.read_gate_tree()])
141
+ const runs = await Promise.all(lists.map(async (check) => await run_in(directory, check)))
142
+
143
+ await check_reuse.record_green_checks(gate_results(runs), tree, records)
144
+
145
+ return verdict(runs.map(({ result }) => result))
146
+ }
147
+
92
148
  const run_ship_pre_detach = {
93
149
  GUARD_TEST_TARGETS,
94
150
  METRICS_TOTALS_COMMAND,
@@ -97,4 +153,5 @@ const run_ship_pre_detach = {
97
153
  checks,
98
154
  }
99
155
 
156
+ export type { PreDetachCheck }
100
157
  export { run_ship_pre_detach }
@@ -4,11 +4,15 @@ import { git_pr } from '#scripts/gh/git-pr'
4
4
  import { changed_paths } from '#scripts/git/changed-paths'
5
5
  import { git_branch } from '#scripts/git/git-branch'
6
6
  import { git_issue } from '#scripts/git/git-issue'
7
- import { git_preflight } from '#scripts/git/git-preflight'
7
+ import { git_preflight, type Unmet } from '#scripts/git/git-preflight'
8
8
  import type { JoshResult } from '#scripts/josh/josh-run'
9
9
  import { error_text } from '#scripts/lib/error-message'
10
+ import { report_format_reference } from '#scripts/report/report-format-reference'
11
+ import { acceptance_map } from '#scripts/review/acceptance-map'
10
12
  import { acceptance_map_check } from '#scripts/review/acceptance-map-check'
11
13
  import { live_evidence } from '#scripts/review/live-evidence'
14
+ import { removed_tests_check } from '#scripts/review/removed-tests-check'
15
+ import { run_ship_body_draft } from './run-ship-body-draft'
12
16
  import { run_ship_lock } from './run-ship-lock'
13
17
  import { run_ship_scoped } from './run-ship-scoped'
14
18
 
@@ -17,26 +21,58 @@ import { run_ship_scoped } from './run-ship-scoped'
17
21
  // **Every precondition decidable before the review is asked here, and all of them are reported at
18
22
  // once.** No check is new: the classification, issue and branch answers
19
23
  // are `git_preflight.problems_of`, and the evidence answer is `live_evidence.verdict_for` over the same
20
- // changed paths and the body this ship will deliver — `--body-file` when given, else the open PR's.
24
+ // changed paths and the body this ship will deliver — `--body-file` when given, else the ship body
25
+ // draft, else the open PR's.
21
26
  //
22
27
  // The scoped pair runs last, met rather than stopped on (`run-ship-scoped.ts`), so the review and the
23
28
  // gate start on a tree both checks are green on.
29
+ //
30
+ // A stop names the kinds of the preconditions it found unmet, beside the git preflight's own, so the
31
+ // lane ledger can count which one stops ships (joshuafolkken/kit#4166).
24
32
 
25
33
  const SUCCESS_EXIT_CODE = 0
26
34
  const FAILURE_EXIT_CODE = 1
27
35
  const UNREADABLE = Symbol('unreadable body')
28
- const EVIDENCE_PROBLEM = `This change touches runtime code, but the PR body has no ${live_evidence.EVIDENCE_HEADING} section: run the acceptance criteria for real and pass the body with --body-file <path>. Write it ${live_evidence.EVIDENCE_FORMAT}`
29
- const EVIDENCE_PENDING = `This change touches runtime code and no PR is open yet: write the ${live_evidence.EVIDENCE_HEADING} section to a file and hand it to josh ship with --body-file <path>, or the ship refuses. Write it ${live_evidence.EVIDENCE_FORMAT}`
36
+ const PRECONDITION = {
37
+ LIVE_EVIDENCE: 'live-evidence',
38
+ ACCEPTANCE_MAP: 'acceptance-map',
39
+ REMOVED_TESTS: 'removed-tests',
40
+ LOCK: 'lock',
41
+ SCOPED: 'scoped',
42
+ UNREADABLE: 'unreadable',
43
+ } as const
44
+ const EVIDENCE_PROBLEM = `This change touches runtime code, but the body this ship delivers has no ${live_evidence.EVIDENCE_HEADING} section: run the acceptance criteria for real and write it into the ship body draft run:prep wrote (josh ship reads it when --body-file is omitted), or pass the body with --body-file <path>. Write it ${live_evidence.EVIDENCE_FORMAT}`
45
+ const EVIDENCE_PENDING = `This change touches runtime code and no PR is open yet: write the ${live_evidence.EVIDENCE_HEADING} section into the ship body draft run:prep wrote (or a file handed to josh ship with --body-file <path>), or the ship refuses. Write it ${live_evidence.EVIDENCE_FORMAT}`
46
+
47
+ // The draft `josh ship` reads when `--body-file` is omitted, named so the run fills that file in.
48
+ function acceptance_pending_text(draft_path: string): string {
49
+ return `Fill in this ${acceptance_map.MAP_HEADING} section in the ship body draft ${draft_path} — josh ship reads it when --body-file is omitted — replacing each pending row's ending with what met or deferred it (format: ${report_format_reference.pointer(report_format_reference.ACCEPTANCE_MAP_HEADING)}), and write ${live_evidence.EVIDENCE_HEADING} there before the ship, or the ship refuses:`
50
+ }
30
51
 
31
52
  interface PreflightRequest {
32
53
  title: string
33
54
  body_path: string | undefined
34
55
  }
35
56
 
57
+ // `preconditions` names the kinds a stopped stage found unmet, each once, in the order they were asked.
58
+ interface PreflightResult extends JoshResult {
59
+ preconditions?: ReadonlyArray<string>
60
+ }
61
+
62
+ // The body the next ship delivers: `--body-file`, else the run's ship body draft, else the open PR's.
36
63
  async function body_text(body_path: string | undefined): Promise<string | undefined> {
37
64
  if (body_path !== undefined) return await readFile(body_path, 'utf8')
65
+ const branch = await git_branch.current()
66
+ const issue = git_issue.branch_number(branch)
67
+ const draft = issue === undefined ? undefined : await run_ship_body_draft.existing(issue)
68
+
69
+ if (draft !== undefined) return await readFile(draft, 'utf8')
70
+
71
+ return await git_gh_command.pr_get_body(branch)
72
+ }
38
73
 
39
- return await git_gh_command.pr_get_body(await git_branch.current())
74
+ function of_kind(kind: string, problems: ReadonlyArray<string>): Array<Unmet> {
75
+ return problems.map((problem) => ({ kind, problem }))
40
76
  }
41
77
 
42
78
  // `no_body_problem` answers a runtime change with no body to read at all — no `--body-file` and no open
@@ -44,7 +80,7 @@ async function body_text(body_path: string | undefined): Promise<string | undefi
44
80
  async function evidence_problems(
45
81
  body_path: string | undefined,
46
82
  no_body_problem: string = EVIDENCE_PROBLEM,
47
- ): Promise<Array<string>> {
83
+ ): Promise<Array<Unmet>> {
48
84
  const [paths, body] = await Promise.all([
49
85
  changed_paths.read_changed_paths(false),
50
86
  body_text(body_path),
@@ -52,25 +88,28 @@ async function evidence_problems(
52
88
 
53
89
  if (live_evidence.verdict_for(paths, body) !== 'required') return []
54
90
 
55
- return [body === undefined ? no_body_problem : EVIDENCE_PROBLEM]
91
+ return of_kind(PRECONDITION.LIVE_EVIDENCE, [
92
+ body === undefined ? no_body_problem : EVIDENCE_PROBLEM,
93
+ ])
56
94
  }
57
95
 
58
- function refusal(problems: ReadonlyArray<string>): JoshResult {
59
- const lines = problems.map((problem) => ` - ${problem}`)
96
+ function refusal(problems: ReadonlyArray<Unmet>): PreflightResult {
97
+ const lines = problems.map(({ problem }) => ` - ${problem}`)
60
98
  const head = `${String(problems.length)} pull-request precondition(s) unmet before the review and the gate:`
99
+ const preconditions = [...new Set(problems.map(({ kind }) => kind))]
61
100
 
62
- return { code: FAILURE_EXIT_CODE, out: [head, ...lines].join('\n') }
101
+ return { code: FAILURE_EXIT_CODE, out: [head, ...lines].join('\n'), preconditions }
63
102
  }
64
103
 
65
104
  // The reads here run in the ship's own process, where the commit stage's ran in a `git -y` child: a
66
105
  // throw — a `--body-file` path that does not exist, a git read that failed — would escape `ship()`
67
106
  // past the stop a supervised ship hands back on, so it is reported as one more unmet precondition.
68
107
  // Each side is caught on its own, so one side's failed read never hides what the other side found.
69
- async function caught(problems: Promise<Array<string>>): Promise<Array<string>> {
108
+ async function caught(problems: Promise<Array<Unmet>>): Promise<Array<Unmet>> {
70
109
  try {
71
110
  return await problems
72
111
  } catch (error) {
73
- return [error_text.message_of(error)]
112
+ return of_kind(PRECONDITION.UNREADABLE, [error_text.message_of(error)])
74
113
  }
75
114
  }
76
115
 
@@ -86,62 +125,128 @@ async function readable_body(
86
125
 
87
126
  // `followup`'s acceptance-map refusal, asked of the body this ship will deliver. A branch with no issue
88
127
  // number is `git_preflight`'s problem to name, and an unreadable body the evidence side's.
89
- async function acceptance_problems(body_path: string | undefined): Promise<Array<string>> {
128
+ async function acceptance_problems(body_path: string | undefined): Promise<Array<Unmet>> {
90
129
  const issue = git_issue.branch_number(await git_branch.current())
91
130
  const body = await readable_body(body_path)
92
131
 
93
132
  if (issue === undefined || body === UNREADABLE) return []
94
133
  const problem = await acceptance_map_check.body_refusal(issue, body)
95
134
 
96
- return problem === undefined ? [] : [problem]
135
+ return problem === undefined ? [] : of_kind(PRECONDITION.ACCEPTANCE_MAP, [problem])
136
+ }
137
+
138
+ // `followup`'s removed-test refusal, asked of the body this ship will deliver.
139
+ async function removed_test_problems(body_path: string | undefined): Promise<Array<Unmet>> {
140
+ const body = await readable_body(body_path)
141
+
142
+ if (body === UNREADABLE) return []
143
+ const problem = await removed_tests_check.body_refusal(body)
144
+
145
+ return problem === undefined ? [] : of_kind(PRECONDITION.REMOVED_TESTS, [problem])
146
+ }
147
+
148
+ async function lock_problems(): Promise<Array<Unmet>> {
149
+ return of_kind(PRECONDITION.LOCK, await run_ship_lock.lock_problems())
97
150
  }
98
151
 
99
152
  // The lock file is asked here too, so a drift stops the ship before the gate
100
153
  // rather than being rewritten by the pre-push hook's install under the push.
101
- async function asked_problems(request: PreflightRequest): Promise<Array<string>> {
102
- const [preflight, evidence, acceptance, lock] = await Promise.all([
154
+ async function asked_problems(request: PreflightRequest): Promise<Array<Unmet>> {
155
+ const [preflight, evidence, acceptance, removed, lock] = await Promise.all([
103
156
  caught(git_preflight.problems_of({ cli_input: request.title, will_open_pr: true })),
104
157
  caught(evidence_problems(request.body_path)),
105
158
  caught(acceptance_problems(request.body_path)),
106
- caught(run_ship_lock.lock_problems()),
159
+ caught(removed_test_problems(request.body_path)),
160
+ caught(lock_problems()),
107
161
  ])
108
162
 
109
- return [...preflight, ...evidence, ...acceptance, ...lock]
163
+ return [...preflight, ...evidence, ...acceptance, ...removed, ...lock]
110
164
  }
111
165
 
112
- async function stage(request: PreflightRequest): Promise<JoshResult> {
166
+ async function stage(request: PreflightRequest): Promise<PreflightResult> {
113
167
  const problems = await asked_problems(request)
114
168
 
115
169
  if (problems.length > 0) return refusal(problems)
116
170
 
117
171
  const scoped = await run_ship_scoped.scoped_pair()
118
172
 
119
- return scoped.code === SUCCESS_EXIT_CODE ? { code: SUCCESS_EXIT_CODE, out: 'ready' } : scoped
173
+ if (scoped.code === SUCCESS_EXIT_CODE) return { code: SUCCESS_EXIT_CODE, out: 'ready' }
174
+
175
+ return { ...scoped, preconditions: [PRECONDITION.SCOPED] }
120
176
  }
121
177
 
122
- async function classification_problems(issue_number: string): Promise<Array<string>> {
178
+ async function classification_problems(issue_number: string): Promise<Array<Unmet>> {
123
179
  await git_pr.release_classification(issue_number, await git_branch.current())
124
180
 
125
181
  return []
126
182
  }
127
183
 
128
- // **The same two refusals, asked before the ship rather than by it**: a missing
129
- // classification or missing evidence is known long before the ship, yet refused there at the run's
130
- // largest context. `run:prep` (and so `run:entry`)
131
- // and `run:step` print this, so the Issue body and the evidence are met while they are cheap. Nothing
132
- // here replaces `stage`: the ship and `followup` still refuse on both. Before the PR exists the evidence
133
- // can only live in the file the ship will be handed, so it is asked for as that file, not reported as a
134
- // body that already failed.
184
+ // Only a body still to be written is handed every row as pending: a draft or an open PR's body keeps
185
+ // the refusal, which names just the rows missing, stale or deferred to an issue that does not exist.
186
+ async function pending_map(
187
+ issue_number: string,
188
+ body: string | undefined,
189
+ ): Promise<string | undefined> {
190
+ if (body !== undefined) return undefined
191
+
192
+ return acceptance_map.skeleton(await git_gh_command.issue_get_body(issue_number))
193
+ }
194
+
195
+ // The rows land in the ship body draft as well as in the report (joshuafolkken/kit#4168).
196
+ async function pending_text(issue_number: string, map: string): Promise<string> {
197
+ const draft = await run_ship_body_draft.prepare(issue_number, map)
198
+
199
+ return `${acceptance_pending_text(draft)}\n${map}`
200
+ }
201
+
202
+ // A refusal of a draft already written names it again, so a later `run:step` still points at the file.
203
+ async function draft_refusal_text(issue_number: string, problem: string): Promise<string> {
204
+ const draft = await run_ship_body_draft.existing(issue_number)
205
+
206
+ return draft === undefined ? problem : `${acceptance_pending_text(draft)}\n${problem}`
207
+ }
208
+
209
+ // The acceptance-map refusal asked early carries the rows to write, identifiers included, built by
210
+ // `acceptance_map.skeleton` — the one builder `josh pr` uses too (joshuafolkken/kit#4244). An Issue
211
+ // with no criteria to build rows from keeps the refusal's own wording.
212
+ async function acceptance_pending(issue_number: string): Promise<Array<Unmet>> {
213
+ const body = await body_text(undefined)
214
+ const problem = await acceptance_map_check.body_refusal(issue_number, body)
215
+
216
+ if (problem === undefined) return []
217
+ const map = await pending_map(issue_number, body)
218
+ const pending =
219
+ map === undefined
220
+ ? await draft_refusal_text(issue_number, problem)
221
+ : await pending_text(issue_number, map)
222
+
223
+ return of_kind(PRECONDITION.ACCEPTANCE_MAP, [pending])
224
+ }
225
+
226
+ // **The same refusals, asked before the ship rather than by it**: a missing classification, missing
227
+ // evidence or an unmapped acceptance criterion is known long before the ship, yet refused there at the
228
+ // run's largest context. `run:prep` (and so `run:entry`)
229
+ // and `run:step` print this, so the Issue body and the PR body are met while they are cheap. Nothing
230
+ // here replaces `stage`: the ship and `followup` still refuse on all of them. Before the PR exists the
231
+ // evidence can only live in the file the ship will be handed, so it is asked for as that file, not
232
+ // reported as a body that already failed.
135
233
  async function ahead(issue_number: string): Promise<Array<string>> {
136
- const [classification, evidence] = await Promise.all([
234
+ const [classification, evidence, acceptance] = await Promise.all([
137
235
  caught(classification_problems(issue_number)),
138
236
  caught(evidence_problems(undefined, EVIDENCE_PENDING)),
237
+ caught(acceptance_pending(issue_number)),
139
238
  ])
140
239
 
141
- return [...classification, ...evidence]
240
+ return [...classification, ...evidence, ...acceptance].map(({ problem }) => problem)
142
241
  }
143
242
 
144
- const run_ship_preflight = { EVIDENCE_PENDING, EVIDENCE_PROBLEM, ahead, stage }
243
+ const run_ship_preflight = {
244
+ EVIDENCE_PENDING,
245
+ EVIDENCE_PROBLEM,
246
+ acceptance_pending_text,
247
+ ahead,
248
+ stage,
249
+ }
145
250
 
146
- export type { PreflightRequest }
251
+ export type { PreflightRequest, PreflightResult }
147
252
  export { run_ship_preflight }
@@ -1,5 +1,6 @@
1
1
  import { git_command } from '#scripts/git/git-command'
2
2
  import { git_worktree } from '#scripts/git/git-worktree'
3
+ import { issue_watch_gate } from '#scripts/issue/issue-watch-gate'
3
4
  import { error_text } from '#scripts/lib/error-message'
4
5
  import { run_hold } from '#scripts/run/hold/run-hold'
5
6
  import { run_preflight } from '#scripts/run/run-preflight'
@@ -60,16 +61,23 @@ async function read_merged(branch_name: string): Promise<boolean> {
60
61
  return (await git_command.commit_count_beyond(base, HEAD_REFERENCE)) === 0
61
62
  }
62
63
 
64
+ // The issue changed after the recorded review was briefed — the refusal `josh followup` would make
65
+ // (joshuafolkken/kit#4221) — so the review stage re-runs instead of the followup failing again.
66
+ async function read_review_stale(): Promise<boolean> {
67
+ return await or_false(async () => (await issue_watch_gate.review_refusal_here()) !== undefined)
68
+ }
69
+
63
70
  const NOTHING_DONE: ShipState = { is_committed: false, is_pushed: false, is_merged: false }
64
71
 
65
72
  async function read_branch_state(branch_name: string): Promise<ShipState> {
66
- const [is_committed, is_pushed, is_merged] = await Promise.all([
73
+ const [is_committed, is_pushed, is_merged, is_review_stale] = await Promise.all([
67
74
  or_false(read_committed),
68
75
  or_false(async () => await read_pushed(branch_name)),
69
76
  or_false(async () => await read_merged(branch_name)),
77
+ read_review_stale(),
70
78
  ])
71
79
 
72
- return { is_committed, is_pushed, is_merged }
80
+ return { is_committed, is_pushed, is_merged, is_review_stale }
73
81
  }
74
82
 
75
83
  // A branch that cannot be named leaves nothing to ask about, so it reads as nothing done.
@@ -101,6 +109,6 @@ async function record_target(issue: string): Promise<string | undefined> {
101
109
  return repository === undefined ? undefined : run_ship_stage.record_path(repository, issue)
102
110
  }
103
111
 
104
- const run_ship_probe = { read_state, record_target, repository_directory }
112
+ const run_ship_probe = { read_review_stale, read_state, record_target, repository_directory }
105
113
 
106
114
  export { run_ship_probe }