@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
@@ -3,14 +3,15 @@ import { investigation_outcome } from '#scripts/delegation/investigation-guard'
3
3
  import { issue_watch_hook } from '#scripts/issue/issue-watch-hook'
4
4
  import { hook_decision, type GuardOutcome } from '#scripts/josh/hook-decision'
5
5
  import { lane_phase } from '#scripts/lane/lane-phase'
6
- import { json_value } from '#scripts/lib/json-value'
7
6
  import { delivered_rules } from '#scripts/rules/delivered-rules'
8
7
  import { lane_background } from '#scripts/rules/lane-background'
9
- import { piped_verification } from '#scripts/rules/piped-verification'
8
+ import { rule_rewrite, type RuleRewrite } from '#scripts/rules/rule-rewrite'
10
9
  import { run_parent_cut_hook } from '#scripts/run/run-parent-cut-hook'
10
+ 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
@@ -22,11 +23,12 @@ import { step_zero_notice } from './step-zero-notice'
22
23
  //
23
24
  // **The verdict is identical to running the three in turn**, and that is the whole point. Each guard
24
25
  // self-gates on the tool name inside its own `is_candidate` / trigger, so running all three on the
25
- // union matcher (`Bash|Edit|Read|Write|AskUserQuestion`) refuses exactly what the three separate
26
- // entries did — `AskUserQuestion` is matched for the rule guard's lane-child interactive-ask row,
27
- // and the batching and investigation guards self-gate away from it. A
28
- // refusal from any guard wins first; only when none refuses is a guard's non-blocking notice or fault
29
- // (the whole-file-write notice, a lane child's investigation notice) emitted. Each guard still honours its own
26
+ // union matcher (`Bash|Edit|Read|Write|AskUserQuestion|Agent|Task`) refuses exactly what the three
27
+ // separate entries did — `AskUserQuestion` is matched for the rule guard's lane-child interactive-ask
28
+ // row and `Agent|Task` for its `agent-model` row, and the batching and investigation guards self-gate
29
+ // away from both. A refusal from any guard wins first; only when none refuses is a guard's non-blocking
30
+ // notice or fault (the whole-file-write notice, a lane child's duplicate-read notice) emitted. Each
31
+ // guard still honours its own
30
32
  // switch (`JOSH_BATCH_GUARD` / `JOSH_INVESTIGATION_GUARD` / `JOSH_RULE_GUARD`) internally, so this
31
33
  // process needs no switch of its own.
32
34
 
@@ -51,12 +53,13 @@ function combine_outcomes(
51
53
  return outcomes.find((outcome) => !is_clear(outcome)) ?? CLEAR
52
54
  }
53
55
 
54
- // The Step 0 reminder is the last word: asked only where every guard stayed
55
- // clear, so a refusal or another notice never spends its once-per-session stamp unseen.
56
- 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 {
57
60
  if (!is_clear(outcome)) return outcome
58
61
 
59
- const notice = step_zero_notice.notice(raw_payload)
62
+ const notice = step_zero_notice.notice(raw_payload) ?? shell_rules_notice.notice(raw_payload)
60
63
 
61
64
  return notice === undefined ? outcome : { reason: undefined, notice, fault: undefined }
62
65
  }
@@ -74,9 +77,9 @@ function guard_outcome(raw_payload: string): GuardOutcome {
74
77
  return combine_outcomes(outcomes, delivered_rules.delivery(raw_payload))
75
78
  }
76
79
 
77
- // 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.
78
81
  function pretool_outcome(raw_payload: string): GuardOutcome {
79
- return with_step_zero_notice(guard_outcome(raw_payload), raw_payload)
82
+ return with_session_notice(guard_outcome(raw_payload), raw_payload)
80
83
  }
81
84
 
82
85
  // The Step 0 notice fires once, on the first runtime-file edit: the moment a lane child's plan turns
@@ -96,12 +99,14 @@ async function mark_phase(outcome: GuardOutcome): Promise<void> {
96
99
  // **The parent hand-off guard is the second asynchronous rule, asked after the watcher's**.
97
100
  // It reads the carry record to tell the `backlogrun` parent apart, so it sits
98
101
  // beside the watcher rather than among the synchronous rows; a stale watcher is the cheaper fix and is
99
- // surfaced first.
102
+ // surfaced first. **The poll guard is third**: it reads the same carry record, and only for a call that
103
+ // repeats a state read, so the hand-off still wins over it.
100
104
  async function async_reason(raw_payload: string): Promise<string | undefined> {
101
105
  const watcher = await run_watcher_hook.watcher_hook_reason(raw_payload)
102
106
  const cut = watcher ?? (await run_parent_cut_hook.parent_cut_reason(raw_payload))
107
+ const poll = cut ?? (await run_poll_hook.safe_poll_reason(raw_payload))
103
108
 
104
- return cut ?? (await issue_watch_hook.watch_reason())
109
+ return poll ?? (await issue_watch_hook.watch_reason())
105
110
  }
106
111
 
107
112
  async function pretool_outcome_async(raw_payload: string): Promise<GuardOutcome> {
@@ -113,7 +118,7 @@ async function pretool_outcome_async(raw_payload: string): Promise<GuardOutcome>
113
118
 
114
119
  if (reason !== undefined) return { reason, notice: undefined, fault: undefined }
115
120
 
116
- const outcome = with_step_zero_notice(base, raw_payload)
121
+ const outcome = with_session_notice(base, raw_payload)
117
122
 
118
123
  await mark_phase(outcome)
119
124
 
@@ -137,81 +142,65 @@ function rewrite_context(note: string, outcome: GuardOutcome): string {
137
142
  return [note, outcome.notice ?? outcome.fault].filter(Boolean).join('\n\n')
138
143
  }
139
144
 
140
- // The envelope that replaces the outcome's own when a lane child backgrounded `josh ship` alone:
141
- // the call is run in the foreground instead of being refused. A refusal from
142
- // 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).
143
159
  function foreground_rewrite(
144
160
  outcome: GuardOutcome,
145
161
  raw_payload: string,
146
162
  is_lane_child?: () => boolean,
163
+ rewrite?: RuleRewrite,
147
164
  ): string | undefined {
148
- if (outcome.reason !== undefined) return undefined
149
-
150
- const call = guarded_call(raw_payload)
151
165
  const input =
152
- call === undefined ? undefined : lane_background.foreground_input(call, is_lane_child)
166
+ outcome.reason === undefined ? foreground_input_of(raw_payload, is_lane_child) : undefined
153
167
 
154
168
  if (input === undefined) return undefined
155
169
 
156
- return hook_decision.rewrite_envelope(
157
- input,
158
- rewrite_context(lane_background.FOREGROUND_NOTE, outcome),
159
- )
160
- }
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
161
173
 
162
- interface PipefailRewrite {
163
- payload: string
164
- input: Record<string, unknown>
174
+ return envelope_of(input, rewrite_context(note, outcome))
165
175
  }
166
176
 
167
- // A piped josh check the hook runs under `set -o pipefail` instead of refusing it:
168
- // the rewritten input, and the payload that carries it. The rewrite is the
169
- // rule guard's delivery, so the rule guard's switch turns it off too.
170
- function pipefail_rewrite(raw_payload: string): PipefailRewrite | undefined {
171
- if (!delivered_rules.is_enabled()) return undefined
172
-
173
- const call = guarded_call(raw_payload)
174
- const input = call === undefined ? undefined : piped_verification.pipefail_input(call)
175
- const payload = json_value.parse_or_undefined(raw_payload)
176
-
177
- if (input === undefined || !json_value.is_record(payload)) return undefined
178
-
179
- return { payload: JSON.stringify({ ...payload, tool_input: input }), input }
180
- }
181
-
182
- function pipefail_envelope(
177
+ // The rows' rewrite carries no permission decision: whatever else the line runs meets its own prompt.
178
+ function rule_envelope(
183
179
  outcome: GuardOutcome,
184
- input: Record<string, unknown> | undefined,
180
+ rewrite: RuleRewrite | undefined,
185
181
  ): string | undefined {
186
- if (input === undefined || outcome.reason !== undefined) return undefined
182
+ if (rewrite === undefined || outcome.reason !== undefined) return undefined
187
183
 
188
- return hook_decision.flow_rewrite_envelope(
189
- input,
190
- rewrite_context(piped_verification.PIPEFAIL_NOTE, outcome),
191
- )
184
+ return hook_decision.flow_rewrite_envelope(rewrite.input, rewrite_context(rewrite.note, outcome))
192
185
  }
193
186
 
194
187
  // The hook's one write: a rewrite where one applies, the outcome's own envelope otherwise.
195
- function emit(
196
- raw_payload: string,
197
- outcome: GuardOutcome,
198
- pipefail_input?: Record<string, unknown>,
199
- ): void {
200
- const rewrite =
201
- pipefail_envelope(outcome, pipefail_input) ?? foreground_rewrite(outcome, raw_payload)
188
+ function emit(raw_payload: string, outcome: GuardOutcome, rewrite?: RuleRewrite): void {
189
+ const envelope =
190
+ foreground_rewrite(outcome, raw_payload, undefined, rewrite) ?? rule_envelope(outcome, rewrite)
202
191
 
203
- if (rewrite === undefined) hook_decision.emit_outcome(outcome)
204
- else process.stdout.write(`${rewrite}\n`)
192
+ if (envelope === undefined) hook_decision.emit_outcome(outcome)
193
+ else process.stdout.write(`${envelope}\n`)
205
194
  }
206
195
 
207
- // **The guards judge the call that will run.** A rewritable piped check reaches every guard already
208
- // prefixed, so the piped-verification row stays quiet on it while any other guard's refusal still wins
209
- // over the rewrite. The Codex adapter cannot rewrite a call, so it goes on judging the call as typed.
196
+ // **The guards judge the call that will run.** A rewritten call reaches every guard already made
197
+ // right, so the rewriting row stays quiet on it while any other guard's refusal still wins over the
198
+ // rewrite. The Codex adapter cannot rewrite a call, so it goes on judging the call as typed.
210
199
  async function respond(raw_payload: string): Promise<void> {
211
- const pipefail = pipefail_rewrite(raw_payload)
212
- const judged = pipefail?.payload ?? raw_payload
200
+ const rewrite = rule_rewrite.rewrite(raw_payload)
201
+ const judged = rewrite?.payload ?? raw_payload
213
202
 
214
- emit(judged, await pretool_outcome_async(judged), pipefail?.input)
203
+ emit(judged, await pretool_outcome_async(judged), rewrite)
215
204
  }
216
205
 
217
206
  const pretool_guard = {
@@ -219,7 +208,6 @@ const pretool_guard = {
219
208
  emit,
220
209
  foreground_rewrite,
221
210
  mark_phase,
222
- pipefail_rewrite,
223
211
  pretool_outcome,
224
212
  respond,
225
213
  }
@@ -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,6 +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),
139
+ reservation_options(parsed),
81
140
  )
82
141
  }
83
142
 
@@ -85,6 +144,6 @@ if (process.argv[1] === fileURLToPath(import.meta.url)) {
85
144
  process.exitCode = await run_reserved(process.argv.slice(FIRST_ARGUMENT_INDEX))
86
145
  }
87
146
 
88
- const reserved_run = { parse_arguments, run_reserved }
147
+ const reserved_run = { parse_arguments, reservation_options, run_reserved }
89
148
 
90
149
  export { reserved_run }
@@ -5,38 +5,45 @@
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 git location variables a git hook exports are cleared when the root resolves without them, so
9
- # the hook's own git calls act on the checkout it stands in. They are kept when the checkout needs
10
- # them — git metadata outside the work tree.
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`.
11
13
  # - The pre-built bundle `dist/hooks/<name>.js` runs once its gate passes; otherwise the live source
12
14
  # runs through josh, whose command is the name with its first `-` turned into `:`
13
15
  # (`pretool-guard` → `pretool:guard`).
14
- # - 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
15
17
  # (joshuafolkken/kit#2984) and then runs the bundle — or the josh fallback — itself, so a hook call
16
18
  # starts node once (joshuafolkken/kit#3327). In an installed package it is a presence check: the
17
19
  # published bundles cannot be stale against a source the consumer never edits, and Node strips no
18
20
  # types under `node_modules`.
21
+ # - Nothing is spawned that the shell can do itself: the directory is a parameter expansion rather than
22
+ # `dirname`, and `node` replaces this shell through `exec` rather than running beside it.
19
23
  # - An `if`/`else`, never `&&`/`||`: a guard's refusal is a non-zero exit, and a chain would read it as
20
24
  # a missing bundle and run the hook twice.
21
25
 
22
26
  location_variables='GIT_ALTERNATE_OBJECT_DIRECTORIES GIT_COMMON_DIR GIT_DIR GIT_INDEX_FILE GIT_NAMESPACE GIT_OBJECT_DIRECTORY GIT_WORK_TREE'
23
- unset_options=''
24
- for variable in $location_variables; do unset_options="$unset_options -u $variable"; done
25
- # shellcheck disable=SC2086
26
- if env $unset_options git rev-parse --show-toplevel >/dev/null 2>&1; then unset $location_variables; fi
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
27
31
 
28
32
  hook_name=$1
29
33
  shift
30
- hooks_dir=$(dirname "$0")
34
+ case $0 in
35
+ */*) hooks_dir=${0%/*} ;;
36
+ *) hooks_dir=. ;;
37
+ esac
31
38
  package_dir="$hooks_dir/../.."
32
39
  bundle="$package_dir/dist/hooks/$hook_name.js"
33
40
  josh_command="${hook_name%%-*}:${hook_name#*-}"
34
41
 
35
42
  case $0 in
36
43
  *node_modules/*)
37
- if [ -d "$package_dir/dist/hooks" ]; then node "$bundle" "$@"; else node "$package_dir/dist/josh.js" "$josh_command" "$@"; fi
44
+ if [ -d "$package_dir/dist/hooks" ]; then exec node "$bundle" "$@"; else exec node "$package_dir/dist/josh.js" "$josh_command" "$@"; fi
38
45
  ;;
39
46
  *)
40
- 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" "$@"
41
48
  ;;
42
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 }
@@ -0,0 +1,185 @@
1
+ import { git_gh_repo } from '#scripts/gh/git-gh-repo'
2
+ import { issue_cite } from '#scripts/issue/issue-cite'
3
+ import { issue_cite_cli } from '#scripts/issue/issue-cite-cli'
4
+ import { session_cite } from '#scripts/issue/session-cite'
5
+ import { bounded_pool } from '#scripts/lib/bounded-pool'
6
+ import { stdout_on_stderr } from '#scripts/lib/stdout-on-stderr'
7
+ import { telegram_test } from '#scripts/notify/telegram-test'
8
+ import type { CliValues } from '#scripts/notify/telegram-test-logic'
9
+ import { issue_citation } from '#scripts/rules/issue-citation'
10
+ import { stop_rules, type StopAction, type StopOutcome } from '#scripts/rules/stop-rules'
11
+ import { run_hold } from '#scripts/run/hold/run-hold'
12
+ import { run_hold_cli } from '#scripts/run/hold/run-hold-cli'
13
+ import { run_hold_session } from '#scripts/run/hold/run-hold-session'
14
+
15
+ type NotifyAction = Extract<StopAction, { kind: 'notify' }>
16
+
17
+ // The `Stop` hook running the operations whose answer is fixed (joshuafolkken/kit#3919): the
18
+ // `confirmation` notify, the hold release and the citation lines, through the very calls
19
+ // `josh notify`, `josh run:release` and `josh issue:cite` make — in process, since three `pnpm`
20
+ // launches would spend most of the hook's 20-second budget. What each did reaches the person as a
21
+ // `systemMessage`; one that did not take falls back to the refusal it replaced (`stop_rules.fallback_reason`).
22
+
23
+ const SUCCESS_EXIT_CODE = 0
24
+ const NOTICE_SEPARATOR = '\n'
25
+ // The reply is the stop's reason, but a Telegram is read at a glance — its opening is enough.
26
+ const SUMMARY_CHARS = 600
27
+ // A `#N`, `owner/repo#N` or URL is a run of printable ASCII; a cut inside one would link the wrong Issue.
28
+ const TOKEN_CHAR = /^[!-~]$/u
29
+ const EMPTY_SUMMARY = 'The run stopped and is waiting for you.'
30
+
31
+ interface Settled {
32
+ notices: ReadonlyArray<string>
33
+ failure: string | undefined
34
+ }
35
+
36
+ // One action at a time — the order is the rule order.
37
+ const SEQUENTIAL = 1
38
+
39
+ // Where the run of token characters `text` ends with starts.
40
+ function token_start(text: string): number {
41
+ let index = text.length
42
+
43
+ while (index > 0 && TOKEN_CHAR.test(text.charAt(index - 1))) index -= 1
44
+
45
+ return index
46
+ }
47
+
48
+ // Cut before linking, on a boundary that keeps every reference whole: the character past the cut shows
49
+ // whether the last token ran on, and a token that did is dropped rather than halved.
50
+ function summary_of(message: string): string {
51
+ const trimmed = message.trim()
52
+ if (trimmed === '') return EMPTY_SUMMARY
53
+ if (trimmed.length <= SUMMARY_CHARS) return trimmed
54
+
55
+ const overshoot = trimmed.slice(0, SUMMARY_CHARS + 1)
56
+ const cut = overshoot.slice(0, Math.min(token_start(overshoot), SUMMARY_CHARS))
57
+
58
+ return cut === '' ? trimmed.slice(0, SUMMARY_CHARS) : cut
59
+ }
60
+
61
+ // The held Issue's URL, or `undefined` for a `new` entry or a repository that cannot be read.
62
+ async function issue_url_of(issue: string): Promise<string | undefined> {
63
+ if (issue === run_hold.UNNUMBERED_ISSUE) return undefined
64
+
65
+ const slug = await git_gh_repo.repo_get_name_with_owner()
66
+
67
+ return slug === undefined ? undefined : issue_cite.issue_url(slug, issue)
68
+ }
69
+
70
+ // The body is the reply's opening copied into a Telegram, so its bare `#N` are linked (`issue-citation.md`).
71
+ // The choices are the reply's own decision lines (joshuafolkken/kit#3961).
72
+ function notify_values(issue_url: string | undefined, action: NotifyAction): CliValues {
73
+ const { recommended, alternative } = action.decision
74
+ const values: CliValues = {
75
+ 'task-type': 'confirmation',
76
+ body: session_cite.text(summary_of(action.message)),
77
+ recommended,
78
+ ...(alternative !== undefined && { alternative: [alternative] }),
79
+ }
80
+
81
+ return issue_url === undefined ? values : { ...values, 'issue-url': issue_url }
82
+ }
83
+
84
+ // The send is stamped on the hold, so a later stop of the same pause does not announce it again. A
85
+ // stamp that fails does not fail the send: the Telegram is out, and a refused stop would send it twice.
86
+ async function mark_notified(): Promise<void> {
87
+ try {
88
+ const directory = await run_hold.worktree_directory()
89
+
90
+ if (directory !== undefined) run_hold_session.mark_notified(run_hold.hold_path(directory))
91
+ } catch (error) {
92
+ console.warn(`stop:guard could not stamp the notify on the hold: ${String(error)}`)
93
+ }
94
+ }
95
+
96
+ async function notify(action: NotifyAction): Promise<string> {
97
+ const issue_url = await issue_url_of(action.issue)
98
+
99
+ await telegram_test.send_values(notify_values(issue_url, action))
100
+ await mark_notified()
101
+
102
+ return `📱 stop:guard sent the confirmation notify (${issue_url ?? action.issue}).`
103
+ }
104
+
105
+ async function release(issue: string): Promise<string | undefined> {
106
+ const argv = issue === run_hold.UNNUMBERED_ISSUE ? ['--release'] : ['--release', issue]
107
+ const code = await run_hold_cli.run(argv)
108
+
109
+ return code === SUCCESS_EXIT_CODE ? '🔓 stop:guard released the run:hold record.' : undefined
110
+ }
111
+
112
+ // Every line or none: a citation with a number missing is the half-fix the refusal exists to avoid.
113
+ async function cite(references: ReadonlyArray<string>): Promise<string | undefined> {
114
+ const cited = await issue_cite_cli.cite(issue_citation.cite_arguments(references))
115
+ if (cited === undefined || cited.failures.length > 0) return undefined
116
+
117
+ return ['Issue citations:', ...cited.lines].join(NOTICE_SEPARATOR)
118
+ }
119
+
120
+ // An action's line for the person, or `undefined` when it did not take.
121
+ async function run_action(action: StopAction): Promise<string | undefined> {
122
+ if (action.kind === 'notify') return await notify(action)
123
+ if (action.kind === 'release') return await release(action.issue)
124
+
125
+ return await cite(action.references)
126
+ }
127
+
128
+ // A throw is an action that did not take, the same as one that answered it had failed.
129
+ async function attempt(action: StopAction): Promise<string | undefined> {
130
+ try {
131
+ return await run_action(action)
132
+ } catch {
133
+ return undefined
134
+ }
135
+ }
136
+
137
+ function is_notice(notice: string | undefined): notice is string {
138
+ return notice !== undefined
139
+ }
140
+
141
+ // In order, one at a time: the notify reports the hold the release then ends. The first failure is the
142
+ // one refused with, as the rule order put it first.
143
+ async function settle(actions: ReadonlyArray<StopAction>): Promise<Settled> {
144
+ const notices = await stdout_on_stderr.run(
145
+ async () => await bounded_pool.bounded_map(actions, SEQUENTIAL, attempt),
146
+ )
147
+ const failed = actions.find((_action, index) => notices[index] === undefined)
148
+
149
+ return {
150
+ notices: notices.filter((notice) => is_notice(notice)),
151
+ failure: failed === undefined ? undefined : stop_rules.fallback_reason(failed),
152
+ }
153
+ }
154
+
155
+ function joined(notices: ReadonlyArray<string>): string | undefined {
156
+ return notices.length === 0 ? undefined : notices.join(NOTICE_SEPARATOR)
157
+ }
158
+
159
+ // A failure refuses only where the outcome allows it — never past the loop-breaker.
160
+ function settled_envelope(
161
+ settled: Settled,
162
+ is_blocking: boolean,
163
+ lang: string,
164
+ ): string | undefined {
165
+ const notice = joined(settled.notices)
166
+
167
+ if (is_blocking && settled.failure !== undefined) {
168
+ return stop_rules.block_envelope(settled.failure, lang, notice)
169
+ }
170
+
171
+ return notice === undefined ? undefined : stop_rules.notice_envelope(notice)
172
+ }
173
+
174
+ // What the hook writes for one stop's outcome, or `undefined` for a stop that writes nothing.
175
+ async function envelope_of(outcome: StopOutcome, lang: string): Promise<string | undefined> {
176
+ if (outcome.reason !== undefined) return stop_rules.block_envelope(outcome.reason, lang)
177
+
178
+ const settled = await settle(outcome.actions)
179
+
180
+ return settled_envelope(settled, outcome.blocks_on_failure, lang)
181
+ }
182
+
183
+ const stop_actions = { envelope_of, summary_of }
184
+
185
+ export { stop_actions }