@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
@@ -22,12 +22,27 @@ import { backlogrun_launch } from './backlogrun-launch'
22
22
  // after a `run:wake --stop` or a supervisor that gave up, and the session it woke outlives both.
23
23
  //
24
24
  // **Lanes are counted, never stopped**: a child killed mid-change leaves a tree nobody can resume.
25
+ // `josh lane:pause --all` is the way to suspend them without discarding anything.
26
+ //
27
+ // **`--restart` stops the same processes and keeps the record** (`stop_keeping_record`), so the run's
28
+ // budget, counters and named list carry over to the supervisor started after it.
25
29
 
26
30
  const STOPPED_REASON = 'stopped by a person with `josh backlogrun --stop`'
27
31
  const PREFIX = 'backlogrun:'
28
32
  const ISSUE_PREFIX = '#'
29
33
 
30
- type RecordOutcome = { kind: 'none' } | { kind: 'ended' } | { kind: 'held'; owner: number }
34
+ type RecordOutcome =
35
+ { kind: 'none' } | { kind: 'ended' } | { kind: 'kept' } | { kind: 'held'; owner: number }
36
+
37
+ // What stopping the processes left: the pids stopped, the record as it stood, and the live owner this
38
+ // command may not signal.
39
+ interface StoppedProcesses {
40
+ supervisor: number | undefined
41
+ parent: number | undefined
42
+ session: number | undefined
43
+ read: CarryRead
44
+ holder: number | undefined
45
+ }
31
46
 
32
47
  interface StopReport {
33
48
  // The pids stopped, `undefined` where there was nothing to stop.
@@ -41,6 +56,8 @@ interface StopReport {
41
56
  }
42
57
 
43
58
  interface StopPorts {
59
+ running_supervisor: (git_directory: string) => number | undefined
60
+ running_parent: (git_directory: string) => number | undefined
44
61
  stop_supervisor: (git_directory: string) => number | undefined
45
62
  stop_parent: (git_directory: string) => number | undefined
46
63
  stop_session: (pid: number) => void
@@ -59,6 +76,8 @@ async function open_lanes(): Promise<Array<string>> {
59
76
 
60
77
  // A person who typed the stop is at the terminal, so the ⏸️ confirmation a stop pushes is not sent.
61
78
  const LIVE_PORTS: StopPorts = {
79
+ running_supervisor: (git_directory) => run_wake.read_wake(run_wake.wake_path(git_directory))?.pid,
80
+ running_parent: backlogrun_launch.running_parent,
62
81
  stop_supervisor: (git_directory) => run_wake_stop.stop(run_wake.wake_path(git_directory))?.pid,
63
82
  stop_parent: backlogrun_launch.stop_parent,
64
83
  stop_session: run_wake_stop.signal,
@@ -120,17 +139,67 @@ async function close_record(
120
139
  return { kind: 'ended' }
121
140
  }
122
141
 
123
- async function stop(git_directory: string, ports: StopPorts = LIVE_PORTS): Promise<StopReport> {
142
+ function stop_processes(git_directory: string, ports: StopPorts): StoppedProcesses {
124
143
  const supervisor = ports.stop_supervisor(git_directory)
125
144
  const parent = ports.stop_parent(git_directory)
126
145
  const read = ports.read_carry(git_directory)
127
146
  const owner = standing_owner(read, [supervisor, parent], ports)
128
147
  const session = stop_headless(owner, read, ports)
129
148
  const holder = session === undefined ? owner : undefined
130
- const record = await close_record(git_directory, read, holder, ports)
131
- const lanes = await ports.lanes()
132
149
 
133
- return { supervisor, parent, session, record, lanes }
150
+ return { supervisor, parent, session, read, holder }
151
+ }
152
+
153
+ function kept_record(read: CarryRead, holder: number | undefined): RecordOutcome {
154
+ if (read.kind === 'none') return { kind: 'none' }
155
+
156
+ return holder === undefined ? { kind: 'kept' } : { kind: 'held', owner: holder }
157
+ }
158
+
159
+ const NOTHING_STOPPED = { supervisor: undefined, parent: undefined, session: undefined }
160
+
161
+ // The live owner `--restart` may not signal, read before anything is stopped: a refusal found after the
162
+ // supervisor and the parent were stopped would leave the run with neither.
163
+ function foreign_owner(git_directory: string, ports: StopPorts): number | undefined {
164
+ const read = ports.read_carry(git_directory)
165
+
166
+ if (is_headless_owner(read)) return undefined
167
+
168
+ const running = [ports.running_supervisor(git_directory), ports.running_parent(git_directory)]
169
+
170
+ return standing_owner(read, running, ports)
171
+ }
172
+
173
+ async function report_of(
174
+ stopped: Pick<StoppedProcesses, 'supervisor' | 'parent' | 'session'>,
175
+ record: RecordOutcome,
176
+ ports: StopPorts,
177
+ ): Promise<StopReport> {
178
+ const { supervisor, parent, session } = stopped
179
+
180
+ return { supervisor, parent, session, record, lanes: await ports.lanes() }
181
+ }
182
+
183
+ async function stop(git_directory: string, ports: StopPorts = LIVE_PORTS): Promise<StopReport> {
184
+ const stopped = stop_processes(git_directory, ports)
185
+ const record = await close_record(git_directory, stopped.read, stopped.holder, ports)
186
+
187
+ return await report_of(stopped, record, ports)
188
+ }
189
+
190
+ async function stop_keeping_record(
191
+ git_directory: string,
192
+ ports: StopPorts = LIVE_PORTS,
193
+ ): Promise<StopReport> {
194
+ const holder = foreign_owner(git_directory, ports)
195
+
196
+ if (holder !== undefined) {
197
+ return await report_of(NOTHING_STOPPED, { kind: 'held', owner: holder }, ports)
198
+ }
199
+
200
+ const stopped = stop_processes(git_directory, ports)
201
+
202
+ return await report_of(stopped, kept_record(stopped.read, stopped.holder), ports)
134
203
  }
135
204
 
136
205
  function process_line(what: string, pid: number | undefined): Array<string> {
@@ -140,6 +209,7 @@ function process_line(what: string, pid: number | undefined): Array<string> {
140
209
  function record_lines(outcome: RecordOutcome): Array<string> {
141
210
  if (outcome.kind === 'none') return []
142
211
  if (outcome.kind === 'ended') return [`${PREFIX} ended the run's record`]
212
+ if (outcome.kind === 'kept') return [`${PREFIX} kept the run's record`]
143
213
 
144
214
  return [
145
215
  `${PREFIX} process ${String(outcome.owner)} owns the run and was not started by \`josh backlogrun\`; its record is kept — end the run from that session`,
@@ -151,7 +221,9 @@ function lane_lines(lanes: ReadonlyArray<string>): Array<string> {
151
221
 
152
222
  const issues = lanes.map((issue) => `${ISSUE_PREFIX}${issue}`).join(' ')
153
223
 
154
- return [`${PREFIX} ${String(lanes.length)} lane(s) still running, not stopped: ${issues}`]
224
+ return [
225
+ `${PREFIX} ${String(lanes.length)} lane(s) still running, not stopped: ${issues} — suspend them in place with \`josh lane:pause --all\``,
226
+ ]
155
227
  }
156
228
 
157
229
  // What a person reads back: one line per thing done, or the one line that says nothing was running.
@@ -172,7 +244,7 @@ function is_stopped(report: StopReport): boolean {
172
244
  return report.record.kind !== 'held'
173
245
  }
174
246
 
175
- const backlogrun_stop = { is_stopped, lines_of, stop }
247
+ const backlogrun_stop = { is_stopped, lines_of, stop, stop_keeping_record }
176
248
 
177
249
  export type { StopPorts, StopReport }
178
250
  export { backlogrun_stop }
@@ -13,8 +13,8 @@ import { behavior_rules } from './behavior-rules'
13
13
  // **The scope is the current run, not the whole corpus.** The store holds thousands of transcripts
14
14
  // and over a gigabyte; walking all of it every gate would cost minutes, not the seconds the other
15
15
  // checks take. Each gate checks its own run, so across runs the whole corpus is covered a run at a
16
- // time — and the engine stays general, so a broad scan of past runs (the greenness check this seed
17
- // assertion was verified with) is the same walk over a different set of files.
16
+ // time — and the engine stays general, so a broad scan of past runs (the greenness check each
17
+ // assertion is verified with) is the same walk over a different set of files.
18
18
 
19
19
  const PASS_EXIT_CODE = 0
20
20
  const FAIL_EXIT_CODE = 1
@@ -1,12 +1,12 @@
1
1
  import { json_value } from '#scripts/lib/json-value'
2
+ import { direct_pr_create } from '#scripts/rules/direct-pr-create'
2
3
  import { time_shell } from '#scripts/time-runtime/time-shell'
3
4
  import type { Block, TranscriptLine } from '#scripts/time-runtime/time-transcript-line'
4
5
  import type { Assertion, Finding } from './behavior-assertion'
5
6
 
6
- // The behavior assertions checked against recorded transcripts. This is the
7
- // **seed set** — the issue's own plan is to land one rule that is green across the recorded corpus,
8
- // then add more one at a time, each verified green before it joins. Starting with many would land a
9
- // wall of red that says nothing about which behavior actually regressed.
7
+ // The behavior assertions checked against recorded transcripts. Rules join one at a time, each
8
+ // verified green across the recorded corpus first — starting with many would land a wall of red that
9
+ // says nothing about which behavior actually regressed.
10
10
 
11
11
  const BASH_TOOL = 'Bash'
12
12
  const TOOL_USE = 'tool_use'
@@ -98,46 +98,69 @@ function denied_call_ids(lines: ReadonlyArray<TranscriptLine>): ReadonlySet<stri
98
98
  )
99
99
  }
100
100
 
101
- // The direct index mutations one transcript line ran, each as a finding at that line's position. A
102
- // line is one assistant content block, so its position is a place a reader can open in the file.
103
- function line_mutations(
101
+ // The Bash calls that ran on one transcript line and broke the rule, each as a finding at that line's
102
+ // position. A line is one assistant content block, so its position is a place a reader can open.
103
+ function line_findings(
104
104
  line: TranscriptLine,
105
- index: number,
105
+ position: number,
106
106
  denied_ids: ReadonlySet<string>,
107
+ rule: BashRule,
107
108
  ): ReadonlyArray<Finding> {
108
109
  return line.blocks
109
110
  .filter((block) => !denied_ids.has(block.id))
110
111
  .map((block) => command_of(block))
111
- .filter((command): command is string => command !== undefined && is_index_mutation(command))
112
- .map((command) => ({
113
- assertion: INDEX_ASSERTION_NAME,
114
- position: index + FIRST_POSITION_OFFSET,
115
- detail: command,
116
- }))
112
+ .filter((command): command is string => command !== undefined && rule.is_violation(command))
113
+ .map((command) => ({ assertion: rule.name, position, detail: command }))
117
114
  }
118
115
 
119
- function scan_index_mutation(lines: ReadonlyArray<TranscriptLine>): ReadonlyArray<Finding> {
120
- const denied_ids = denied_call_ids(lines)
116
+ interface BashRule {
117
+ name: string
118
+ describe: string
119
+ is_violation: (command: string) => boolean
120
+ }
121
+
122
+ // One assertion over the Bash calls a run actually executed: a call the permission layer or a
123
+ // PreToolUse hook refused never ran, so it breaks nothing.
124
+ function bash_assertion(rule: BashRule): Assertion {
125
+ function scan(lines: ReadonlyArray<TranscriptLine>): ReadonlyArray<Finding> {
126
+ const denied_ids = denied_call_ids(lines)
127
+
128
+ return lines.flatMap((line, index) =>
129
+ line_findings(line, index + FIRST_POSITION_OFFSET, denied_ids, rule),
130
+ )
131
+ }
121
132
 
122
- return lines.flatMap((line, index) => line_mutations(line, index, denied_ids))
133
+ return { name: rule.name, describe: rule.describe, scan }
123
134
  }
124
135
 
125
- const index_mutation_assertion: Assertion = {
136
+ const index_mutation_assertion = bash_assertion({
126
137
  name: INDEX_ASSERTION_NAME,
127
138
  describe: 'git staging or commit must go through `pnpm josh git`, never a direct git call',
128
- scan: scan_index_mutation,
129
- }
130
-
131
- // The seed set: every rule green across the recorded corpus today. A new rule is appended here only
132
- // after it has been verified green against past real runs.
133
- const ALL_ASSERTIONS: ReadonlyArray<Assertion> = [index_mutation_assertion]
139
+ is_violation: is_index_mutation,
140
+ })
141
+
142
+ // The matcher is the `direct-pr-create` guard's own, so the assertion and the refusal cannot drift. The
143
+ // guard refuses every match, so a finding means a direct PR call ran past it — every run since the
144
+ // guard landed is green; the only hits in the corpus predate it.
145
+ const PR_CREATE_ASSERTION_NAME = 'no-direct-pr-create'
146
+ const pr_create_assertion = bash_assertion({
147
+ name: PR_CREATE_ASSERTION_NAME,
148
+ describe: 'a pull request must be opened with `pnpm josh pr`, never `gh pr create` or `gh api`',
149
+ is_violation: direct_pr_create.is_direct_pr_create,
150
+ })
151
+
152
+ // Every rule green across the recorded corpus. A new rule is appended here only after it has been
153
+ // verified green against past real runs.
154
+ const ALL_ASSERTIONS: ReadonlyArray<Assertion> = [index_mutation_assertion, pr_create_assertion]
134
155
 
135
156
  const behavior_rules = {
136
157
  ALL_ASSERTIONS,
137
158
  INDEX_ASSERTION_NAME,
159
+ PR_CREATE_ASSERTION_NAME,
138
160
  command_of,
139
161
  index_mutation_assertion,
140
162
  is_index_mutation,
163
+ pr_create_assertion,
141
164
  }
142
165
 
143
166
  export { behavior_rules }
@@ -1,7 +1,5 @@
1
- #!/usr/bin/env tsx
2
1
  import path from 'node:path'
3
2
  import { fileURLToPath } from 'node:url'
4
- import { error_text } from '#scripts/lib/error-message'
5
3
  import { build } from 'esbuild'
6
4
 
7
5
  const PACKAGE_DIR = path.join(path.dirname(fileURLToPath(import.meta.url)), '..', '..')
@@ -9,10 +7,10 @@ const ENTRY_POINT = path.join(PACKAGE_DIR, 'scripts', 'josh', 'josh.ts')
9
7
  const OUTFILE = path.join(PACKAGE_DIR, 'dist', 'josh.js')
10
8
  const NODE_BANNER = '#!/usr/bin/env node'
11
9
 
12
- async function build_bin(): Promise<void> {
10
+ async function build_bin(outfile: string = OUTFILE): Promise<void> {
13
11
  await build({
14
12
  entryPoints: [ENTRY_POINT],
15
- outfile: OUTFILE,
13
+ outfile,
16
14
  bundle: true,
17
15
  platform: 'node',
18
16
  format: 'esm',
@@ -22,16 +20,4 @@ async function build_bin(): Promise<void> {
22
20
  })
23
21
  }
24
22
 
25
- async function main(): Promise<void> {
26
- try {
27
- await build_bin()
28
- console.info(` ✔ ${OUTFILE} built`)
29
- } catch (error) {
30
- console.error(error_text.message_of(error))
31
- process.exit(1)
32
- }
33
- }
34
-
35
- if (process.argv[1] === fileURLToPath(import.meta.url)) await main()
36
-
37
23
  export { build_bin, NODE_BANNER, OUTFILE }
@@ -1,4 +1,3 @@
1
- #!/usr/bin/env tsx
2
1
  import { mkdirSync, readFileSync, writeFileSync } from 'node:fs'
3
2
  import path from 'node:path'
4
3
  import { fileURLToPath } from 'node:url'
@@ -40,12 +39,6 @@ function build_claude_md(): string {
40
39
  return DIST_CLAUDE_MD
41
40
  }
42
41
 
43
- function main(): void {
44
- console.info(` ✔ ${build_claude_md()} built`)
45
- }
46
-
47
- if (process.argv[1] === fileURLToPath(import.meta.url)) main()
48
-
49
42
  export {
50
43
  build_claude_md,
51
44
  DIST_BASIC_CLAUDE_MDS,
@@ -1,10 +1,8 @@
1
- #!/usr/bin/env tsx
2
1
  import { rmSync } from 'node:fs'
3
2
  import path from 'node:path'
4
3
  import { fileURLToPath } from 'node:url'
5
4
  import { COMMAND_MAP } from '#scripts/josh/josh-command-map'
6
5
  import { BUNDLED_COMMAND_DIRECTORY, josh_in_process } from '#scripts/josh/josh-in-process'
7
- import { error_text } from '#scripts/lib/error-message'
8
6
  import { build } from 'esbuild'
9
7
 
10
8
  const PACKAGE_DIR = path.join(path.dirname(fileURLToPath(import.meta.url)), '..', '..')
@@ -52,15 +50,4 @@ async function build_commands(out_directory: string = OUT_DIR): Promise<string>
52
50
  return out_directory
53
51
  }
54
52
 
55
- async function main(): Promise<void> {
56
- try {
57
- console.info(` ✔ ${await build_commands()} built`)
58
- } catch (error) {
59
- console.error(error_text.message_of(error))
60
- process.exit(1)
61
- }
62
- }
63
-
64
- if (process.argv[1] === fileURLToPath(import.meta.url)) await main()
65
-
66
53
  export { build_commands, bundled_scripts, OUT_DIR }
@@ -1,20 +1,13 @@
1
- #!/usr/bin/env tsx
2
- import {
3
- mkdirSync,
4
- mkdtempSync,
5
- readdirSync,
6
- readFileSync,
7
- renameSync,
8
- rmSync,
9
- writeFileSync,
10
- } from 'node:fs'
1
+ import { mkdirSync, mkdtempSync, readdirSync, readFileSync, rmSync } from 'node:fs'
11
2
  import path from 'node:path'
12
3
  import { fileURLToPath } from 'node:url'
13
4
  import { hook_bundle_stamp } from '#scripts/build/hook-bundle-stamp'
14
- import { error_text } from '#scripts/lib/error-message'
5
+ import { toolchain_inputs } from '#scripts/gate/toolchain-inputs'
6
+ import { atomic_write } from '#scripts/lib/atomic-write'
15
7
  import { build, type OnLoadArgs, type OutputFile, type Plugin, type PluginBuild } from 'esbuild'
16
8
 
17
- const PACKAGE_DIR = path.join(path.dirname(fileURLToPath(import.meta.url)), '..', '..')
9
+ const BUILD_SCRIPT = fileURLToPath(import.meta.url)
10
+ const PACKAGE_DIR = path.join(path.dirname(BUILD_SCRIPT), '..', '..')
18
11
  const OUT_DIR = path.join(PACKAGE_DIR, 'dist', 'hooks')
19
12
  const { STAMP_NAME } = hook_bundle_stamp
20
13
  const CHUNK_PREFIX = 'chunk-'
@@ -29,11 +22,11 @@ const ANY_PATH = /.*/
29
22
  //
30
23
  // **`splitting: true` is load-bearing, not an optimization.** Every hook module decides whether to
31
24
  // run its main from `process.argv[1] === fileURLToPath(import.meta.url)`. A single-file bundle would
32
- // collapse every imported module's `import.meta.url` to the one output path, so a call to
33
- // `node dist/hooks/pretool-guard.js` would fire the self-invoke of `batch-guard` and
34
- // `investigation-guard` too — each reads stdin, and the second read gets an empty payload. Code
35
- // splitting keeps every entry in its own file with its own `import.meta.url`, so an imported guard's
36
- // `import.meta.url` never equals `argv[1]` and only the file actually launched runs its main.
25
+ // collapse every imported module's `import.meta.url` to the one output path, so a call to one hook
26
+ // would fire the self-invoke of every other entry it carries — each reads stdin, and the second read
27
+ // gets an empty payload. Code splitting keeps every entry in its own file with its own
28
+ // `import.meta.url`, so only the file actually launched runs its main. The guards `pretool-guard`
29
+ // composes carry no self-invoke: theirs live in `*-main.ts` entries no module imports.
37
30
  //
38
31
  // **The flip side: an entry another entry imports loses its main**. Splitting
39
32
  // moves a module two entries share into a chunk, so a launched hook whose own module is imported
@@ -49,20 +42,15 @@ interface HookBundle {
49
42
  out: string
50
43
  }
51
44
 
52
- // The settings.json hooks (the session-start audit provisioner among them), the Codex input adapter, and the three guards `pretool-guard`
53
- // composes: `batch-guard`, `investigation-guard` and `duplicate-read-guard` each self-invoke, so they
54
- // must be their own entries to keep their `import.meta.url` out of `pretool-guard`'s file.
55
- // `delivered-rules` (the fourth guard) has no self-invoke, so it stays inlined.
45
+ // The settings.json hooks (the session-start audit provisioner among them) and the Codex input
46
+ // adapter — every hook a hook config launches, and nothing else.
56
47
  const HOOK_BUNDLES: ReadonlyArray<HookBundle> = [
57
48
  { source: 'scripts/hooks/codex-hook-adapter.ts', out: 'codex-hook-adapter' },
58
49
  { source: 'scripts/hooks/pretool-guard-cli.ts', out: 'pretool-guard' },
59
50
  { source: 'scripts/hooks/stop-guard.ts', out: 'stop-guard' },
60
51
  { source: 'scripts/hooks/format-edited-cli.ts', out: 'format-edited' },
61
- { source: 'scripts/josh/session-language-cli.ts', out: 'session-lang' },
62
- { source: 'scripts/security/security-audit-provision.ts', out: 'audit-provision' },
63
- { source: 'scripts/hooks/batch-guard.ts', out: 'batch-guard' },
64
- { source: 'scripts/delegation/investigation-guard.ts', out: 'investigation-guard' },
65
- { source: 'scripts/delegation/duplicate-read-guard.ts', out: 'duplicate-read-guard' },
52
+ { source: 'scripts/josh/session-language-main.ts', out: 'session-lang' },
53
+ { source: 'scripts/security/security-audit-provision-main.ts', out: 'audit-provision' },
66
54
  ]
67
55
 
68
56
  function entry_point(bundle: HookBundle): { in: string; out: string } {
@@ -83,9 +71,22 @@ function prune_stale_outputs(out_directory: string, outputs: ReadonlyArray<strin
83
71
  }
84
72
  }
85
73
 
74
+ // **A module inlined into an entry keeps no self-invoke.** Its `import.meta.url` collapses to the
75
+ // entry's output path, so its guard would match `argv[1]` and its main would run beside the hook's:
76
+ // `stop-guard` ran `josh run:hold`'s, `josh notify`'s and `josh run:tidy`'s on every stop, and their
77
+ // stdout ahead of the envelope made the harness drop the refusal (joshuafolkken/kit#4123). Only the
78
+ // launched entry runs a main, so every other module's guard is built as `false`.
79
+ const SELF_INVOKE_GUARD = 'process.argv[1] === fileURLToPath(import.meta.url)'
80
+
81
+ function loaded_contents(contents: Uint8Array, is_entry: boolean): string {
82
+ const source = Buffer.from(contents).toString('utf8')
83
+
84
+ return is_entry ? source : source.replaceAll(SELF_INVOKE_GUARD, 'false')
85
+ }
86
+
86
87
  // Every file the build loads is read here, so the stamp digests the exact bytes that were bundled —
87
88
  // a source edited mid-build is recorded as what it was, and the next launch rebuilds it.
88
- function source_recorder(sources: Map<string, Uint8Array>): Plugin {
89
+ function source_recorder(sources: Map<string, Uint8Array>, entries: ReadonlySet<string>): Plugin {
89
90
  return {
90
91
  name: 'hook-source-recorder',
91
92
  setup(plugin_build: PluginBuild): void {
@@ -94,7 +95,7 @@ function source_recorder(sources: Map<string, Uint8Array>): Plugin {
94
95
 
95
96
  sources.set(path.relative(PACKAGE_DIR, args.path), contents)
96
97
 
97
- return { contents, loader: 'default' }
98
+ return { contents: loaded_contents(contents, entries.has(args.path)), loader: 'default' }
98
99
  })
99
100
  },
100
101
  }
@@ -113,10 +114,7 @@ function is_chunk_first(left: OutputFile, right: OutputFile): number {
113
114
  // Each file is written into a private staging directory and renamed into place, so a hook never
114
115
  // reads a half-written bundle and two builds running side by side never write one file at once.
115
116
  function place(staging: string, target: string, contents: Uint8Array | string): void {
116
- const temporary = path.join(staging, path.basename(target))
117
-
118
- writeFileSync(temporary, contents)
119
- renameSync(temporary, target)
117
+ atomic_write.replace_file(target, contents, { staging_directory: staging })
120
118
  }
121
119
 
122
120
  function place_build(out_directory: string, files: ReadonlyArray<OutputFile>, stamp: string): void {
@@ -142,11 +140,26 @@ function place_build(out_directory: string, files: ReadonlyArray<OutputFile>, st
142
140
  // every tool call, and an emptied directory would make a hook launched mid-build fail to load and its
143
141
  // guard fail open. The source digest is placed last (`hook-bundle-stamp.ts`), so a launch only reads
144
142
  // the bundles as fresh once every one of them is in place.
143
+ //
144
+ // This script is an input too: it rewrites what it loads, so an edit to it changes the bundles while
145
+ // every bundled source stays byte-identical. So is the toolchain (`toolchain-inputs.ts`): the manifest
146
+ // maps the `#scripts/*` imports esbuild resolves, and the lockfile pins esbuild itself.
147
+ function build_inputs(): Map<string, Uint8Array> {
148
+ const toolchain = toolchain_inputs.paths(PACKAGE_DIR)
149
+
150
+ return new Map<string, Uint8Array>([
151
+ [path.relative(PACKAGE_DIR, BUILD_SCRIPT), readFileSync(BUILD_SCRIPT)],
152
+ ...toolchain.map((input) => [input, readFileSync(path.join(PACKAGE_DIR, input))] as const),
153
+ ])
154
+ }
155
+
145
156
  async function build_hooks(out_directory: string = OUT_DIR): Promise<void> {
146
- const sources = new Map<string, Uint8Array>()
157
+ const sources = build_inputs()
158
+ const entry_points = HOOK_BUNDLES.map((bundle) => entry_point(bundle))
159
+ const entries = new Set(entry_points.map((entry) => entry.in))
147
160
  const { outputFiles: files } = await build({
148
161
  absWorkingDir: PACKAGE_DIR,
149
- entryPoints: HOOK_BUNDLES.map((bundle) => entry_point(bundle)),
162
+ entryPoints: entry_points,
150
163
  outdir: out_directory,
151
164
  bundle: true,
152
165
  splitting: true,
@@ -155,7 +168,7 @@ async function build_hooks(out_directory: string = OUT_DIR): Promise<void> {
155
168
  target: 'node22',
156
169
  packages: 'external',
157
170
  write: false,
158
- plugins: [source_recorder(sources)],
171
+ plugins: [source_recorder(sources, entries)],
159
172
  })
160
173
  const stamp = hook_bundle_stamp.stamp_text(
161
174
  sources,
@@ -165,17 +178,5 @@ async function build_hooks(out_directory: string = OUT_DIR): Promise<void> {
165
178
  place_build(out_directory, files, stamp)
166
179
  }
167
180
 
168
- async function main(): Promise<void> {
169
- try {
170
- await build_hooks()
171
- for (const bundle of HOOK_BUNDLES) console.info(` ✔ ${outfile_for(bundle)} built`)
172
- } catch (error) {
173
- console.error(error_text.message_of(error))
174
- process.exit(1)
175
- }
176
- }
177
-
178
- if (process.argv[1] === fileURLToPath(import.meta.url)) await main()
179
-
180
181
  export type { HookBundle }
181
- export { build_hooks, HOOK_BUNDLES, OUT_DIR, outfile_for }
182
+ export { build_hooks, HOOK_BUNDLES, OUT_DIR, outfile_for, STAGING_PREFIX }
@@ -1,6 +1,8 @@
1
1
  import { createHash } from 'node:crypto'
2
- import { existsSync, readFileSync, renameSync, rmSync, statSync, writeFileSync } from 'node:fs'
2
+ import { existsSync, readFileSync, statSync } from 'node:fs'
3
3
  import path from 'node:path'
4
+ import { toolchain_inputs } from '#scripts/gate/toolchain-inputs'
5
+ import { atomic_write } from '#scripts/lib/atomic-write'
4
6
  import { json_value } from '#scripts/lib/json-value'
5
7
 
6
8
  // What a hook build was made from, so a later launch can tell whether `dist/hooks/` still matches the
@@ -31,7 +33,7 @@ import { json_value } from '#scripts/lib/json-value'
31
33
  // again. Once an mtime is older than the window any later write moves it, so only settled inputs are
32
34
  // remembered; a launch inside the window simply hashes.
33
35
  //
34
- // This module is loaded by plain `node` on every hook launch (`scripts/hooks/hook-bundle-ready.ts`),
36
+ // This module is loaded by plain `node` on every hook launch (`tools/hooks/hook-bundle-ready.ts`),
35
37
  // so it imports `node:` built-ins and `#scripts/*` subpaths alone — nothing slow to load.
36
38
 
37
39
  const STAMP_NAME = 'inputs.json'
@@ -171,13 +173,10 @@ function is_remembered(
171
173
  // Written through a rename so a concurrent launch never reads half a record. Best-effort: a tree that
172
174
  // cannot be written is simply hashed again next time.
173
175
  function remember(out_directory: string, verified: VerifiedDigest): void {
174
- const temporary_path = path.join(out_directory, `${VERIFIED_NAME}.${String(process.pid)}`)
175
-
176
176
  try {
177
- writeFileSync(temporary_path, JSON.stringify(verified))
178
- renameSync(temporary_path, path.join(out_directory, VERIFIED_NAME))
177
+ atomic_write.replace_file(path.join(out_directory, VERIFIED_NAME), JSON.stringify(verified))
179
178
  } catch {
180
- rmSync(temporary_path, { force: true })
179
+ // A record that could not be written leaves the digest to be computed again.
181
180
  }
182
181
  }
183
182
 
@@ -194,12 +193,31 @@ function is_digest_current(
194
193
  return true
195
194
  }
196
195
 
197
- // Fresh only when the record exists, every output it lists is still there, and the listed inputs hash
198
- // to the recorded digest — a missing or deleted input counts as stale. The hash is skipped when the
199
- // inputs still carry the signatures of an earlier launch that verified this digest.
196
+ // The build records the toolchain inputs among its sources (`build-hooks.ts`), so an edited one
197
+ // changes the digest; one created since — a new `tsconfig.*.json` or rule module — is in no record.
198
+ function lists_toolchain(stamp: HookBundleStamp, package_directory: string): boolean {
199
+ const recorded = new Set(stamp.inputs.map((input) => input.split(path.sep).join('/')))
200
+
201
+ return toolchain_inputs.paths(package_directory).every((input) => recorded.has(input))
202
+ }
203
+
204
+ function is_complete(
205
+ stamp: HookBundleStamp,
206
+ out_directory: string,
207
+ package_directory: string,
208
+ ): boolean {
209
+ if (stamp.outputs.some((output) => !existsSync(path.join(out_directory, output)))) return false
210
+
211
+ return lists_toolchain(stamp, package_directory)
212
+ }
213
+
214
+ // Fresh only when the record exists, every output it lists is still there, it lists every toolchain
215
+ // input, and the listed inputs hash to the recorded digest — a missing or deleted input counts as
216
+ // stale. The hash is skipped when the inputs still carry the signatures of an earlier launch that
217
+ // verified this digest.
200
218
  function is_fresh(out_directory: string, package_directory: string): boolean {
201
219
  const stamp = read_stamp(out_directory)
202
- if (!stamp?.outputs.every((output) => existsSync(path.join(out_directory, output)))) return false
220
+ if (stamp === undefined || !is_complete(stamp, out_directory, package_directory)) return false
203
221
  const snapshot = read_snapshot(package_directory, stamp.inputs)
204
222
  if (snapshot === undefined) return false
205
223
  if (is_remembered(out_directory, stamp.digest, snapshot.signatures)) return true
@@ -2,13 +2,13 @@ import { existsSync, readFileSync } from 'node:fs'
2
2
  import { createRequire } from 'node:module'
3
3
  import path from 'node:path'
4
4
  import { ancestor_directories } from '#scripts/lib/ancestor-directories'
5
+ import { PACKAGE_JSON } from '#scripts/lib/package-manifest'
5
6
  import { package_bin_schema } from '#scripts/lib/schemas'
6
7
 
7
8
  const NODE_MODULES = 'node_modules'
8
9
  const BIN_DIR = '.bin'
9
10
  const WINDOWS_PLATFORM = 'win32'
10
11
  const WINDOWS_SHIM_SUFFIX = '.cmd'
11
- const PACKAGE_JSON = 'package.json'
12
12
 
13
13
  // Every spawn site that reaches for a locally-installed CLI needs the same two details: pnpm
14
14
  // writes the shims under `node_modules/.bin`, and on Windows the executable one carries a