@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
@@ -3,10 +3,14 @@ import { fileURLToPath } from 'node:url'
3
3
  import { core_budget } from '#scripts/gate/core-budget'
4
4
  import {
5
5
  CSPELL_COMMIT_CACHE_FLAGS,
6
+ ESLINT_COMMIT_CACHE_FILE,
6
7
  ESLINT_COMMIT_CACHE_FLAGS,
7
8
  PRETTIER_CACHE_FLAGS,
8
9
  } from '#scripts/josh/josh-command-types'
10
+ import { FAIL_EXIT_CODE } from '#scripts/lib/buffered-process'
9
11
  import { resolve_spawn_exit } from '#scripts/lib/spawn-exit'
12
+ import { eslint_cache_dependencies } from '#scripts/lint/eslint-cache-dependencies'
13
+ import { eslint_daemon } from '#scripts/lint/eslint-daemon'
10
14
  import { execa } from 'execa'
11
15
 
12
16
  // The pre-commit hook's cspell, prettier and eslint runs over the staged files. They go through here
@@ -21,6 +25,7 @@ import { execa } from 'execa'
21
25
  const ARGV_OFFSET = 2
22
26
  const USAGE_ERROR_EXIT_CODE = 2
23
27
  const PNPM = 'pnpm'
28
+ const ESLINT = 'eslint'
24
29
 
25
30
  const TOOL_ARGUMENTS: Readonly<Record<string, ReadonlyArray<string>>> = {
26
31
  cspell: [
@@ -58,18 +63,40 @@ function build_arguments(
58
63
  return [...tool_arguments, ...staged_files]
59
64
  }
60
65
 
66
+ // eslint goes through the lane's warm daemon when one is reachable (joshuafolkken/kit#4358): the same
67
+ // argument list and the same cache file, without paying the config and plugin load per commit. It
68
+ // runs inside the tool's core-budget reservation like the cold route does.
69
+ //
70
+ // A merge or checkout can change only the files a staged file imports, and the content cache keeps
71
+ // the staged file's verdict: its entry is dropped first when they changed (joshuafolkken/kit#4415).
72
+ async function run_eslint(command_arguments: ReadonlyArray<string>): Promise<number> {
73
+ const result = await eslint_cache_dependencies.guard(
74
+ ESLINT_COMMIT_CACHE_FILE,
75
+ async () => await eslint_daemon.run_or_cold(command_arguments),
76
+ )
77
+ if (result.output !== '') process.stdout.write(result.output)
78
+
79
+ return result.exit_code ?? FAIL_EXIT_CODE
80
+ }
81
+
61
82
  async function run_tool(command_arguments: ReadonlyArray<string>): Promise<number> {
62
83
  const result = await execa(PNPM, command_arguments, { stdio: 'inherit', reject: false })
63
84
 
64
85
  return resolve_spawn_exit(PNPM, result)
65
86
  }
66
87
 
88
+ async function run_reserved(tool: string, staged_files: ReadonlyArray<string>): Promise<number> {
89
+ const command_arguments = build_arguments(tool, staged_files) ?? []
90
+ if (tool === ESLINT) return await run_eslint(command_arguments)
91
+
92
+ return await run_tool(command_arguments)
93
+ }
94
+
67
95
  async function run(argv: ReadonlyArray<string>): Promise<number> {
68
96
  const [tool = '', ...staged_files] = argv
69
- const command_arguments = build_arguments(tool, staged_files)
70
97
  const budget = TOOL_BUDGETS[tool]
71
98
 
72
- if (command_arguments === undefined || budget === undefined) {
99
+ if (budget === undefined) {
73
100
  console.error(USAGE)
74
101
 
75
102
  return USAGE_ERROR_EXIT_CODE
@@ -77,7 +104,7 @@ async function run(argv: ReadonlyArray<string>): Promise<number> {
77
104
 
78
105
  return await core_budget.with_command_reservation(
79
106
  core_budget.CORE_WEIGHTS[budget],
80
- async () => await run_tool(command_arguments),
107
+ async () => await run_reserved(tool, staged_files),
81
108
  { memory_mb: core_budget.MEMORY_MB[budget], command: `pre-commit ${tool}` },
82
109
  )
83
110
  }
@@ -130,10 +130,12 @@ function format_miss(reason: string): string {
130
130
  // as foreign load (joshuafolkken/kit#3874). Only the miss reserves: a reused record runs nothing, and a
131
131
  // claim there could make a push wait out a full ledger for a suite it then skips.
132
132
  async function run_reserved_suite(vitest_arguments: ReadonlyArray<string>): Promise<number> {
133
+ const claim = gate_plan.DIRECT_UNIT_CLAIM
134
+
133
135
  return await core_budget.with_command_reservation(
134
- gate_plan.direct_unit_weight(),
136
+ claim.core_weight(),
135
137
  async () => await test_unit_guard.run_guarded_unit(process.cwd(), vitest_arguments),
136
- { memory_mb: gate_plan.direct_unit_memory(), command: 'pre-push test:unit' },
138
+ { memory_mb: claim.memory_mb(), command: 'pre-push test:unit', is_unit: claim.is_unit_claim },
137
139
  )
138
140
  }
139
141
 
@@ -1,5 +1,4 @@
1
1
  #!/usr/bin/env tsx
2
- import { text } from 'node:stream/consumers'
3
2
  import { fileURLToPath } from 'node:url'
4
3
  import { hook_decision } from '#scripts/josh/hook-decision'
5
4
  import { pretool_guard } from './pretool-guard'
@@ -11,11 +10,5 @@ import { pretool_guard } from './pretool-guard'
11
10
  // `dist/hooks/pretool-guard.js`, so the bundled hook ran no guard at all and every refusal failed open.
12
11
  // An entry nothing imports keeps the self-invoke in the file that is actually launched.
13
12
  if (process.argv[1] === fileURLToPath(import.meta.url)) {
14
- if (process.stdin.isTTY) hook_decision.report_no_payload('pretool:guard')
15
- else {
16
- const raw_payload = await text(process.stdin)
17
-
18
- hook_decision.load_environment_file()
19
- await pretool_guard.respond(raw_payload)
20
- }
13
+ await hook_decision.respond_from_stdin('pretool:guard', pretool_guard.respond)
21
14
  }
@@ -11,6 +11,7 @@ import { run_poll_hook } from '#scripts/run/run-poll-hook'
11
11
  import { run_watcher_hook } from '#scripts/run/run-watcher-hook'
12
12
  import type { GuardedCall } from '#scripts/time-runtime/time-batch-guard'
13
13
  import { batch_outcome } from './batch-guard'
14
+ import { shell_rules_notice } from './shell-rules-notice'
14
15
  import { step_zero_notice } from './step-zero-notice'
15
16
 
16
17
  // One PreToolUse process for the three guards that used to be three. A Bash
@@ -52,12 +53,13 @@ function combine_outcomes(
52
53
  return outcomes.find((outcome) => !is_clear(outcome)) ?? CLEAR
53
54
  }
54
55
 
55
- // The Step 0 reminder is the last word: asked only where every guard stayed
56
- // clear, so a refusal or another notice never spends its once-per-session stamp unseen.
57
- function with_step_zero_notice(outcome: GuardOutcome, raw_payload: string): GuardOutcome {
56
+ // The once-per-session reminders are the last word: asked only where every guard stayed clear, so a
57
+ // refusal or another notice never spends their stamps unseen. Step 0 answers an edit and the shell
58
+ // rules a Bash call, so at most one of them speaks on a call.
59
+ function with_session_notice(outcome: GuardOutcome, raw_payload: string): GuardOutcome {
58
60
  if (!is_clear(outcome)) return outcome
59
61
 
60
- const notice = step_zero_notice.notice(raw_payload)
62
+ const notice = step_zero_notice.notice(raw_payload) ?? shell_rules_notice.notice(raw_payload)
61
63
 
62
64
  return notice === undefined ? outcome : { reason: undefined, notice, fault: undefined }
63
65
  }
@@ -75,9 +77,9 @@ function guard_outcome(raw_payload: string): GuardOutcome {
75
77
  return combine_outcomes(outcomes, delivered_rules.delivery(raw_payload))
76
78
  }
77
79
 
78
- // The synchronous verdict the Codex adapter asks for, with the Step 0 reminder as its last layer.
80
+ // The synchronous verdict the Codex adapter asks for, with the session reminders as its last layer.
79
81
  function pretool_outcome(raw_payload: string): GuardOutcome {
80
- return with_step_zero_notice(guard_outcome(raw_payload), raw_payload)
82
+ return with_session_notice(guard_outcome(raw_payload), raw_payload)
81
83
  }
82
84
 
83
85
  // The Step 0 notice fires once, on the first runtime-file edit: the moment a lane child's plan turns
@@ -116,7 +118,7 @@ async function pretool_outcome_async(raw_payload: string): Promise<GuardOutcome>
116
118
 
117
119
  if (reason !== undefined) return { reason, notice: undefined, fault: undefined }
118
120
 
119
- const outcome = with_step_zero_notice(base, raw_payload)
121
+ const outcome = with_session_notice(base, raw_payload)
120
122
 
121
123
  await mark_phase(outcome)
122
124
 
@@ -140,26 +142,36 @@ function rewrite_context(note: string, outcome: GuardOutcome): string {
140
142
  return [note, outcome.notice ?? outcome.fault].filter(Boolean).join('\n\n')
141
143
  }
142
144
 
143
- // The envelope that replaces the outcome's own when a lane child backgrounded `josh ship` alone:
144
- // the call is run in the foreground instead of being refused. A refusal from
145
- // any guard still wins, and a notice the outcome carried rides along in the same context.
145
+ function foreground_input_of(
146
+ raw_payload: string,
147
+ is_lane_child?: () => boolean,
148
+ ): Record<string, unknown> | undefined {
149
+ const call = guarded_call(raw_payload)
150
+
151
+ return call === undefined ? undefined : lane_background.foreground_input(call, is_lane_child)
152
+ }
153
+
154
+ // The envelope that replaces the outcome's own when a lane child runs `josh ship` alone: the call is
155
+ // run in the foreground at the cap instead of being refused or moved aside. A refusal from any guard
156
+ // still wins, and a notice the outcome carried rides along in the same context. On top of a row's
157
+ // rewrite — `raw_payload` is then the rewritten call — it keeps that row's notes and its lack of a
158
+ // permission decision, so the cap is never lost to a pipefail or tail rewrite (joshuafolkken/kit#4101).
146
159
  function foreground_rewrite(
147
160
  outcome: GuardOutcome,
148
161
  raw_payload: string,
149
162
  is_lane_child?: () => boolean,
163
+ rewrite?: RuleRewrite,
150
164
  ): string | undefined {
151
- if (outcome.reason !== undefined) return undefined
152
-
153
- const call = guarded_call(raw_payload)
154
165
  const input =
155
- call === undefined ? undefined : lane_background.foreground_input(call, is_lane_child)
166
+ outcome.reason === undefined ? foreground_input_of(raw_payload, is_lane_child) : undefined
156
167
 
157
168
  if (input === undefined) return undefined
158
169
 
159
- return hook_decision.rewrite_envelope(
160
- input,
161
- rewrite_context(lane_background.FOREGROUND_NOTE, outcome),
162
- )
170
+ const note = [rewrite?.note, lane_background.FOREGROUND_NOTE].filter(Boolean).join('\n\n')
171
+ const envelope_of =
172
+ rewrite === undefined ? hook_decision.rewrite_envelope : hook_decision.flow_rewrite_envelope
173
+
174
+ return envelope_of(input, rewrite_context(note, outcome))
163
175
  }
164
176
 
165
177
  // The rows' rewrite carries no permission decision: whatever else the line runs meets its own prompt.
@@ -174,7 +186,8 @@ function rule_envelope(
174
186
 
175
187
  // The hook's one write: a rewrite where one applies, the outcome's own envelope otherwise.
176
188
  function emit(raw_payload: string, outcome: GuardOutcome, rewrite?: RuleRewrite): void {
177
- const envelope = rule_envelope(outcome, rewrite) ?? foreground_rewrite(outcome, raw_payload)
189
+ const envelope =
190
+ foreground_rewrite(outcome, raw_payload, undefined, rewrite) ?? rule_envelope(outcome, rewrite)
178
191
 
179
192
  if (envelope === undefined) hook_decision.emit_outcome(outcome)
180
193
  else process.stdout.write(`${envelope}\n`)
@@ -1,5 +1,6 @@
1
1
  #!/usr/bin/env tsx
2
2
  import { fileURLToPath } from 'node:url'
3
+ import { command_memory } from '#scripts/gate/command-memory'
3
4
  import { core_budget } from '#scripts/gate/core-budget'
4
5
  import { unit_worker_share } from '#scripts/test/unit-worker-share'
5
6
  import { execa } from 'execa'
@@ -18,6 +19,11 @@ import { execa } from 'execa'
18
19
  // being rewritten around it — and a second copy of the claim-run-release dance is the clone
19
20
  // `CLAUDE.md` prohibits. The weight is the caller's, passed on the command line beside the command, so
20
21
  // the reservation these two conservative numbers stand for lives at the one place a person reads them.
22
+ //
23
+ // **The memory is read off the command, not left at zero** (joshuafolkken/kit#4582): a lane wrapped a
24
+ // four-worker typed eslint here and the 12 GB it held was admitted beside four other lanes. The
25
+ // wrapped command's tool and worker count give its `MEMORY_MB` (`command-memory.ts`); `--memory <MB>`
26
+ // overrides that estimate.
21
27
 
22
28
  // `process.argv` is [runner, script, ...arguments].
23
29
  const FIRST_ARGUMENT_INDEX = 2
@@ -30,24 +36,74 @@ const FAIL_EXIT_CODE = 1
30
36
  // cumulative sum and let a later reservation admit past the budget the ledger exists to hold.
31
37
  const MIN_WEIGHT = 1
32
38
 
39
+ const MEMORY_FLAG = '--memory'
40
+ // `--memory <MB>`: the flag and its value.
41
+ const MEMORY_OPTION_LENGTH = 2
42
+ // An explicit `--memory` claims at least one MB; zero is the absence the estimate already stands for.
43
+ const MIN_MEMORY_MB = 1
44
+ // An argument that is one shell word with no quoting.
45
+ const PLAIN_WORD = /^[\w./=:@%+,-]+$/u
46
+ // A single quote inside a single-quoted word: close, escaped quote, reopen.
47
+ const ESCAPED_QUOTE = String.raw`'\''`
48
+
33
49
  interface ReservedCommand {
34
50
  weight: number
51
+ // The explicit `--memory <MB>`, which overrides the estimate read off the command.
52
+ memory_mb: number | undefined
35
53
  command: ReadonlyArray<string>
36
54
  }
37
55
 
38
- // `<weight> -- <command> [args...]`. `undefined` is a usage error: a missing separator, a weight that
39
- // is not an integer of at least one core, or nothing to run.
56
+ function is_integer_from(value: number, floor: number): boolean {
57
+ return Number.isSafeInteger(value) && value >= floor
58
+ }
59
+
60
+ // The options between the weight and the separator: none, or `--memory <MB>` with a positive integer.
61
+ // `undefined` is a usage error.
62
+ function parse_memory(
63
+ options: ReadonlyArray<string>,
64
+ ): { memory_mb: number | undefined } | undefined {
65
+ if (options.length === 0) return { memory_mb: undefined }
66
+
67
+ const memory_mb = Number(options[1])
68
+ const is_memory_option = options.length === MEMORY_OPTION_LENGTH && options[0] === MEMORY_FLAG
69
+
70
+ return is_memory_option && is_integer_from(memory_mb, MIN_MEMORY_MB) ? { memory_mb } : undefined
71
+ }
72
+
73
+ // `<weight> [--memory <MB>] -- <command> [args...]`. `undefined` is a usage error: a missing
74
+ // separator, a weight that is not an integer of at least one core, a malformed `--memory`, or nothing
75
+ // to run.
40
76
  function parse_arguments(argv: ReadonlyArray<string>): ReservedCommand | undefined {
41
77
  const NOT_FOUND = -1
42
78
  const separator = argv.indexOf(COMMAND_SEPARATOR)
43
79
  const weight = Number(argv[WEIGHT_INDEX])
44
- const is_valid_weight = Number.isSafeInteger(weight) && weight >= MIN_WEIGHT
80
+ const memory = parse_memory(argv.slice(WEIGHT_INDEX + 1, Math.max(separator, 0)))
81
+ const command = argv.slice(separator + 1)
45
82
 
46
- if (separator === NOT_FOUND || !is_valid_weight) return undefined
83
+ if (separator === NOT_FOUND || !is_integer_from(weight, MIN_WEIGHT)) return undefined
47
84
 
48
- const command = argv.slice(separator + 1)
85
+ return memory !== undefined && command.length > 0 ? { weight, ...memory, command } : undefined
86
+ }
87
+
88
+ // An argument as one shell word: a plain one as written, anything else single-quoted. **The estimate
89
+ // re-reads the command as a shell line**, so `git commit -m "a; eslint ."` joined bare would be cut at
90
+ // the `;` and reserved as an eslint run.
91
+ function shell_word(argument: string): string {
92
+ if (PLAIN_WORD.test(argument)) return argument
93
+
94
+ return `'${argument.split("'").join(ESCAPED_QUOTE)}'`
95
+ }
96
+
97
+ // What the claim carries to the ledger: the command named on the waiting line, and the memory it
98
+ // holds — the explicit `--memory`, else the estimate read off the command (`command-memory.ts`), else
99
+ // none, the 0 MB a command the table does not know counted before.
100
+ function reservation_options(parsed: ReservedCommand): {
101
+ command: string
102
+ memory_mb: number | undefined
103
+ } {
104
+ const command = parsed.command.map((argument) => shell_word(argument)).join(' ')
49
105
 
50
- return command.length > 0 ? { weight, command } : undefined
106
+ return { command, memory_mb: parsed.memory_mb ?? command_memory.estimated_memory_mb(command) }
51
107
  }
52
108
 
53
109
  // `stdio: 'inherit'` so the command's own progress reaches the push, and `reject: false` so a failing
@@ -64,7 +120,9 @@ async function run_reserved(argv: ReadonlyArray<string>): Promise<number> {
64
120
  const parsed = parse_arguments(argv)
65
121
 
66
122
  if (parsed === undefined) {
67
- process.stderr.write('reserved-run: usage: reserved-run <weight> -- <command> [args...]\n')
123
+ process.stderr.write(
124
+ 'reserved-run: usage: reserved-run <weight> [--memory <MB>] -- <command> [args...]\n',
125
+ )
68
126
 
69
127
  return FAIL_EXIT_CODE
70
128
  }
@@ -78,7 +136,7 @@ async function run_reserved(argv: ReadonlyArray<string>): Promise<number> {
78
136
  return await core_budget.with_core_reservation(
79
137
  parsed.weight,
80
138
  async () => await run_command(parsed.command),
81
- { command: parsed.command.join(' ') },
139
+ reservation_options(parsed),
82
140
  )
83
141
  }
84
142
 
@@ -86,6 +144,6 @@ if (process.argv[1] === fileURLToPath(import.meta.url)) {
86
144
  process.exitCode = await run_reserved(process.argv.slice(FIRST_ARGUMENT_INDEX))
87
145
  }
88
146
 
89
- const reserved_run = { parse_arguments, run_reserved }
147
+ const reserved_run = { parse_arguments, reservation_options, run_reserved }
90
148
 
91
149
  export { reserved_run }
@@ -5,12 +5,15 @@
5
5
  # A hook command in `.claude/settings.json` / `.codex/hooks.json` only moves to the project root
6
6
  # (`scripts/init/hook-launch.ts`) and calls this script, so everything every hook shares lives here once:
7
7
  #
8
- # - The root prefix has already cleared the git location variables a git hook exports, or kept them
9
- # when the checkout needs them; this script starts no `git` of its own (joshuafolkken/kit#3946).
8
+ # - The git location variables a git hook exports are cleared when the checkout resolves without
9
+ # them, so the hook's own git calls act on the checkout it stands in, and kept when the git metadata
10
+ # lives outside the work tree. `git` starts only when one of them is set — a hook runs on every tool
11
+ # call (joshuafolkken/kit#3946, joshuafolkken/kit#4187). The list is `GIT_LOCATION_VARIABLES`
12
+ # (`scripts/git/git-location-environment.ts`), held to it by `run-hook.test.ts`.
10
13
  # - The pre-built bundle `dist/hooks/<name>.js` runs once its gate passes; otherwise the live source
11
14
  # runs through josh, whose command is the name with its first `-` turned into `:`
12
15
  # (`pretool-guard` → `pretool:guard`).
13
- # - In kit's own checkout the gate is `hook-bundle-ready.ts`, which rebuilds stale bundles
16
+ # - In kit's own checkout the gate is the kit-only `tools/hooks/hook-bundle-ready.ts`, which rebuilds stale bundles
14
17
  # (joshuafolkken/kit#2984) and then runs the bundle — or the josh fallback — itself, so a hook call
15
18
  # starts node once (joshuafolkken/kit#3327). In an installed package it is a presence check: the
16
19
  # published bundles cannot be stale against a source the consumer never edits, and Node strips no
@@ -20,6 +23,12 @@
20
23
  # - An `if`/`else`, never `&&`/`||`: a guard's refusal is a non-zero exit, and a chain would read it as
21
24
  # a missing bundle and run the hook twice.
22
25
 
26
+ location_variables='GIT_ALTERNATE_OBJECT_DIRECTORIES GIT_COMMON_DIR GIT_DIR GIT_INDEX_FILE GIT_NAMESPACE GIT_OBJECT_DIRECTORY GIT_WORK_TREE'
27
+ if [ -n "$GIT_ALTERNATE_OBJECT_DIRECTORIES$GIT_COMMON_DIR$GIT_DIR$GIT_INDEX_FILE$GIT_NAMESPACE$GIT_OBJECT_DIRECTORY$GIT_WORK_TREE" ] &&
28
+ (unset $location_variables && git rev-parse --show-toplevel >/dev/null 2>&1); then
29
+ unset $location_variables
30
+ fi
31
+
23
32
  hook_name=$1
24
33
  shift
25
34
  case $0 in
@@ -35,6 +44,6 @@ case $0 in
35
44
  if [ -d "$package_dir/dist/hooks" ]; then exec node "$bundle" "$@"; else exec node "$package_dir/dist/josh.js" "$josh_command" "$@"; fi
36
45
  ;;
37
46
  *)
38
- exec node --disable-warning=ExperimentalWarning "$hooks_dir/hook-bundle-ready.ts" "$hook_name" "$josh_command" "$@"
47
+ exec node --disable-warning=ExperimentalWarning "$package_dir/tools/hooks/hook-bundle-ready.ts" "$hook_name" "$josh_command" "$@"
39
48
  ;;
40
49
  esac
@@ -0,0 +1,37 @@
1
+ import { cost_blocks } from '#scripts/cost-runtime/cost-blocks'
2
+ import { hook_decision } from '#scripts/josh/hook-decision'
3
+
4
+ // The two most-refused Bash rows, `file-body` and `piped-verification`, delivered ahead of the call
5
+ // that would break them. A refusal teaches the rule only after the call was composed, and each
6
+ // refusal is a round trip spent rewriting it (joshuafolkken/kit#3996). The first Bash call of a
7
+ // session comes before any of those, so the hook that sees it carries the two rules as a notice.
8
+ //
9
+ // **The rows themselves are unchanged.** They still refuse on every occurrence; this only puts their
10
+ // text in front of the first call, the way `step-zero-notice.ts` delivers Step 0 at the first edit.
11
+ //
12
+ // **Once per session**, on a stamp keyed by the transcript. A stamp that cannot be written stays
13
+ // silent rather than repeating the notice on every call.
14
+ const STAMP_PREFIX = 'josh-shell-rules-notice-'
15
+
16
+ const NOTICE =
17
+ 'Shell rules: change an existing file with Edit or Write, never a script or heredoc that writes it (file-edits.md); run a josh check with no pipe or under `set -o pipefail`, never `| head` (output-bounds.md).'
18
+
19
+ const STAMP = hook_decision.create_refusal_stamp(STAMP_PREFIX)
20
+
21
+ function notice(raw_payload: string): string | undefined {
22
+ const payload = hook_decision.parse_hook_payload(raw_payload)
23
+
24
+ if (payload?.tool_name !== cost_blocks.BASH_TOOL) return undefined
25
+
26
+ const target = STAMP.path(payload.transcript_path)
27
+
28
+ if (STAMP.last_ms(target) !== hook_decision.NEVER_MS || !STAMP.record(target, Date.now())) {
29
+ return undefined
30
+ }
31
+
32
+ return NOTICE
33
+ }
34
+
35
+ const shell_rules_notice = { NOTICE, notice, stamp_path: STAMP.path }
36
+
37
+ export { shell_rules_notice }
@@ -3,6 +3,7 @@ import { issue_cite } from '#scripts/issue/issue-cite'
3
3
  import { issue_cite_cli } from '#scripts/issue/issue-cite-cli'
4
4
  import { session_cite } from '#scripts/issue/session-cite'
5
5
  import { bounded_pool } from '#scripts/lib/bounded-pool'
6
+ import { stdout_on_stderr } from '#scripts/lib/stdout-on-stderr'
6
7
  import { telegram_test } from '#scripts/notify/telegram-test'
7
8
  import type { CliValues } from '#scripts/notify/telegram-test-logic'
8
9
  import { issue_citation } from '#scripts/rules/issue-citation'
@@ -124,26 +125,6 @@ async function run_action(action: StopAction): Promise<string | undefined> {
124
125
  return await cite(action.references)
125
126
  }
126
127
 
127
- // **The hook's stdout is the decision envelope, so nothing else may reach it**: the reused calls report
128
- // on stdout (`josh run:release`'s verdict token, the notify's sent line) and are sent to stderr instead.
129
- type StreamWrite = typeof process.stdout.write
130
-
131
- function set_stdout_write(stream_write: StreamWrite): void {
132
- process.stdout.write = stream_write
133
- }
134
-
135
- async function on_stderr<T>(work: () => Promise<T>): Promise<T> {
136
- const saved = { write: process.stdout.write.bind(process.stdout) }
137
-
138
- set_stdout_write(process.stderr.write.bind(process.stderr))
139
-
140
- try {
141
- return await work()
142
- } finally {
143
- set_stdout_write(saved.write)
144
- }
145
- }
146
-
147
128
  // A throw is an action that did not take, the same as one that answered it had failed.
148
129
  async function attempt(action: StopAction): Promise<string | undefined> {
149
130
  try {
@@ -160,7 +141,7 @@ function is_notice(notice: string | undefined): notice is string {
160
141
  // In order, one at a time: the notify reports the hold the release then ends. The first failure is the
161
142
  // one refused with, as the rule order put it first.
162
143
  async function settle(actions: ReadonlyArray<StopAction>): Promise<Settled> {
163
- const notices = await on_stderr(
144
+ const notices = await stdout_on_stderr.run(
164
145
  async () => await bounded_pool.bounded_map(actions, SEQUENTIAL, attempt),
165
146
  )
166
147
  const failed = actions.find((_action, index) => notices[index] === undefined)
@@ -1,5 +1,4 @@
1
1
  #!/usr/bin/env tsx
2
- import { text } from 'node:stream/consumers'
3
2
  import { fileURLToPath } from 'node:url'
4
3
  import { agent_headless } from '#scripts/agent/agent-headless'
5
4
  import { backlog_ready } from '#scripts/backlog/backlog-ready'
@@ -10,6 +9,7 @@ import { hook_decision } from '#scripts/josh/hook-decision'
10
9
  import { session_language } from '#scripts/josh/session-language'
11
10
  import { lane_child_marker } from '#scripts/lane/lane-child-marker'
12
11
  import { lane_handoff } from '#scripts/lane/lane-handoff'
12
+ import { stdout_on_stderr } from '#scripts/lib/stdout-on-stderr'
13
13
  import { filing_cap } from '#scripts/rules/filing-cap'
14
14
  import { lane_background } from '#scripts/rules/lane-background'
15
15
  import { lane_park } from '#scripts/rules/lane-park'
@@ -101,7 +101,7 @@ function is_cut_stop(tail: string): boolean {
101
101
  )
102
102
  }
103
103
 
104
- // The session language the refusal is written for — `write_stop_decision` has already loaded the `.env`.
104
+ // The session language the refusal is written for — `respond_from_stdin` has already loaded the `.env`.
105
105
  function session_lang(): string {
106
106
  return session_language.resolve_session_lang().lang
107
107
  }
@@ -208,13 +208,18 @@ async function run_report_checks(): Promise<void> {
208
208
  await run_stranded_detect.run_stranded_check()
209
209
  }
210
210
 
211
- // Nothing reaches stdout on an ordinary stop, so what the harness parses stays empty unless the stop is
212
- // held or the hook acted on it (`stop-actions.ts`).
213
- async function write_stop_decision(raw_payload: string): Promise<void> {
214
- hook_decision.load_environment_file()
211
+ async function decided_envelope(raw_payload: string): Promise<string | undefined> {
215
212
  await run_report_checks()
216
213
 
217
- const envelope = await stop_actions.envelope_of(await outcome_of(raw_payload), session_lang())
214
+ return await stop_actions.envelope_of(await outcome_of(raw_payload), session_lang())
215
+ }
216
+
217
+ // Nothing reaches stdout on an ordinary stop, so what the harness parses stays empty unless the stop is
218
+ // held or the hook acted on it (`stop-actions.ts`). The report checks print too — a strand's skipped
219
+ // notify line — and text ahead of the envelope makes the harness drop the refusal, as the #4091 child's
220
+ // lane-background block was (joshuafolkken/kit#4101), so everything before the write goes to stderr.
221
+ async function write_stop_decision(raw_payload: string): Promise<void> {
222
+ const envelope = await stdout_on_stderr.run(async () => await decided_envelope(raw_payload))
218
223
 
219
224
  if (envelope === undefined) return
220
225
 
@@ -224,8 +229,7 @@ async function write_stop_decision(raw_payload: string): Promise<void> {
224
229
  const stop_guard = { outcome_of, stop_outcome_for_payload }
225
230
 
226
231
  if (process.argv[1] === fileURLToPath(import.meta.url)) {
227
- if (process.stdin.isTTY) hook_decision.report_no_payload('stop:guard')
228
- else await write_stop_decision(await text(process.stdin))
232
+ await hook_decision.respond_from_stdin('stop:guard', write_stop_decision)
229
233
  }
230
234
 
231
235
  export { stop_guard, write_stop_decision }
@@ -49,8 +49,19 @@ const PLAIN_KIT_COMMANDS: ReadonlySet<string> = new Set(
49
49
  'session:lang',
50
50
  ].map((command) => `${PNPM_JOSH_PREFIX}${command}`),
51
51
  )
52
- // The values below are matched inside raw JSON text, so the root prefix is taken in its escaped form.
53
- const PROJECT_ROOT_PREFIX = JSON.stringify(hook_launch.PROJECT_ROOT_PREFIX).slice(1, -1)
52
+ // The root prefix kit wrote until joshuafolkken/kit#4187 moved the git location variables into the
53
+ // launcher. A consumer's file still carries it until its next sync, which replaces it with the current
54
+ // one. History, never edited; removable from kit 2.0.0.
55
+ const LOCATION_VARIABLES =
56
+ 'GIT_ALTERNATE_OBJECT_DIRECTORIES GIT_COMMON_DIR GIT_DIR GIT_INDEX_FILE GIT_NAMESPACE GIT_OBJECT_DIRECTORY GIT_WORK_TREE'
57
+ const ROOT_LOOKUP = 'git rev-parse --show-toplevel'
58
+ const LEGACY_ROOT_PREFIX = `if project_root="$(unset ${LOCATION_VARIABLES}; ${ROOT_LOOKUP} 2>/dev/null)"; then unset ${LOCATION_VARIABLES}; else project_root="$(${ROOT_LOOKUP})"; fi && cd "$project_root" && `
59
+ // The values below are matched inside raw JSON text, so each root prefix is taken in its escaped form.
60
+ const ROOT_PREFIXES: ReadonlyArray<string> = [
61
+ hook_launch.PROJECT_ROOT_PREFIX,
62
+ LEGACY_ROOT_PREFIX,
63
+ ].map((prefix) => JSON.stringify(prefix).slice(1, -1))
64
+ const [PROJECT_ROOT_PREFIX = ''] = ROOT_PREFIXES
54
65
  // Capture the value of every `"command"` field, escapes and all, so the rewrites below touch command
55
66
  // values alone — never an echo reminder's prose or a `"description"` that merely mentions the string.
56
67
  const COMMAND_FIELD = /("command":\s*")((?:[^"\\]|\\.)*)(")/gu
@@ -76,10 +87,13 @@ function rewrite_command_value(value: string): string {
76
87
  }
77
88
 
78
89
  // kit's own commands already start from the root (`hook-launch.ts`), and so does an already-rewritten
79
- // value. The prefix is taken off before the rewrite and put back after it, so the install guard sits
80
- // behind the `cd` it depends on and a second pass never doubles the prefix.
90
+ // value. The prefix — the current one or the one before it — is taken off before the rewrite and the
91
+ // current one put back after it, so the install guard sits behind the `cd` it depends on and a second
92
+ // pass never doubles the prefix.
81
93
  function without_root_prefix(value: string): string {
82
- return value.startsWith(PROJECT_ROOT_PREFIX) ? value.slice(PROJECT_ROOT_PREFIX.length) : value
94
+ const prefix = ROOT_PREFIXES.find((candidate) => value.startsWith(candidate)) ?? ''
95
+
96
+ return value.slice(prefix.length)
83
97
  }
84
98
 
85
99
  function rewrite_hook_commands(content: string, is_codex = false): string {
@@ -1,31 +1,29 @@
1
- import { GIT_LOCATION_VARIABLES } from '#scripts/git/git-location-environment'
2
-
3
1
  // The shell command a Claude Code hook is launched with, so it starts without a `pnpm` wrapper — and,
4
2
  // for a consumer, without the `dist/josh.js` dispatcher re-spawning `tsx` for the hook's `.ts`.
5
3
  // Each hook is pre-built to its own `dist/hooks/<name>.js`
6
4
  // (`scripts/build/build-hooks.ts`) and launched directly with `node`.
7
5
  //
8
6
  // **The command starts from the project root, never from wherever the session happens to be**.
9
- // Every path after the prefix is relative, so a hook fired from a
10
- // subdirectory would otherwise miss its script. The root is git's, resolved with the location
11
- // variables a git hook exports cleared first, and resolved with them only when that fails — git
12
- // metadata outside the work tree. When the cleared lookup succeeds the variables are cleared for the
13
- // hook too, so its own git calls act on the checkout it stands in. The consumer rewrite
14
- // (`hook-command-rewrite.ts`) keeps this prefix, so both sides stay one mechanism for Claude Code and
15
- // Codex alike.
16
- //
17
- // **A hook runs on every tool call, so its launch spawns as little as it can** (joshuafolkken/kit#3946):
18
- // the shell's own `unset` clears the variables rather than an `env` process, and that one lookup
19
- // both finds the root and decides whether the variables stay — `git` starts once.
7
+ // Every path after the prefix is relative, so a hook fired from a subdirectory would otherwise miss its
8
+ // script. Claude Code names the root in `CLAUDE_PROJECT_DIR`, so its hooks start no `git` to find it;
9
+ // Codex runs a hook in the session's directory and names no root, so there the root is git's — asked
10
+ // first without the git location variables a git hook leaks, since a relative or bare `GIT_DIR` read
11
+ // from a subdirectory names the wrong work tree, and with them only when the checkout does not resolve
12
+ // without them (its metadata lives outside the work tree). A lookup that fails ends the command before
13
+ // the launcher (joshuafolkken/kit#4187).
20
14
  //
21
- // **Everything after the root is one script** (`scripts/hooks/run-hook.sh`): the bundle-ready gate and
22
- // the live-source fallback live there once, so each hook command names only its hook.
15
+ // **Everything after the root is one script** (`scripts/hooks/run-hook.sh`): the git location
16
+ // variables a git hook exports, the bundle-ready gate and the live-source fallback live there once, so
17
+ // each hook command names only its hook. The consumer rewrite (`hook-command-rewrite.ts`) keeps this
18
+ // prefix, so both sides stay one mechanism for Claude Code and Codex alike.
19
+
20
+ import { GIT_LOCATION_VARIABLES } from '#scripts/git/git-location-environment'
23
21
 
24
22
  const HOOK_DIST_DIR = 'dist/hooks'
25
23
  const RUN_HOOK_SCRIPT = 'scripts/hooks/run-hook.sh'
26
- const LOCATION_VARIABLES = GIT_LOCATION_VARIABLES.join(' ')
27
24
  const ROOT_LOOKUP = 'git rev-parse --show-toplevel'
28
- const PROJECT_ROOT_PREFIX = `if project_root="$(unset ${LOCATION_VARIABLES}; ${ROOT_LOOKUP} 2>/dev/null)"; then unset ${LOCATION_VARIABLES}; else project_root="$(${ROOT_LOOKUP})"; fi && cd "$project_root" && `
25
+ const CODEX_ROOT = `$( (unset ${GIT_LOCATION_VARIABLES.join(' ')}; ${ROOT_LOOKUP} 2>/dev/null) || ${ROOT_LOOKUP})`
26
+ const PROJECT_ROOT_PREFIX = `project_root="\${CLAUDE_PROJECT_DIR:-${CODEX_ROOT}}" && cd "$project_root" && `
29
27
 
30
28
  // `name` is the hook's bundle under `dist/hooks` without `.js` (e.g. `pretool-guard`), followed by any
31
29
  // arguments it takes (e.g. `codex-hook-adapter pretool`).
@@ -2,7 +2,6 @@ import { readFileSync } from 'node:fs'
2
2
  import path from 'node:path'
3
3
  import { json_format } from '#scripts/config-merge/json-format'
4
4
  import { string_array_schema, vscode_settings_schema } from '#scripts/lib/schemas'
5
- import { basic_path_migration } from './basic-path-migration'
6
5
  import { init_logic } from './init-logic'
7
6
  import { package_path, PROJECT_ROOT } from './init-paths'
8
7
  import type { ProjectShape } from './project-profile'
@@ -20,9 +19,6 @@ interface FileAction {
20
19
  dest: string
21
20
  create: () => string
22
21
  merge?: (existing: string) => string
23
- // A merge that only migrates a kit-written line, for a file kit otherwise leaves to the project:
24
- // when it changes nothing, the file is reported with the sample to add, as one with no merge is.
25
- should_show_sample_when_unchanged?: boolean
26
22
  }
27
23
 
28
24
  function read_package_file(relative_path: string): string {
@@ -215,8 +211,6 @@ function build_basic_actions(shape: ProjectShape): ReadonlyArray<FileAction> {
215
211
  dest: BASIC_PRETTIER_CONFIG,
216
212
  create: () =>
217
213
  "import { config } from '@joshuafolkken/kit/prettier/basic'\n\nexport default config\n",
218
- merge: (existing) => basic_path_migration.migrate_basic_paths(existing),
219
- should_show_sample_when_unchanged: true,
220
214
  })
221
215
  }
222
216