@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
@@ -11,6 +11,11 @@ const DETAILS_TAIL_LENGTH = 2048
11
11
  const TRUNCATION_MARK = '... '
12
12
  // The prefix `backlog-drive-cli.ts` gives the exception it catches.
13
13
  const ERROR_PREFIX = 'error '
14
+ // **The driver is bounded so the supervisor reaches its pass boundary between dispatches**
15
+ // (joshuafolkken/kit#4509): unbounded, `backlog:drive` dispatches, collects and merges lanes in its own
16
+ // loop until a judgment hand-off, and the code check at the pass boundary would wait for that.
17
+ const WINDOW_MINUTES = '5'
18
+ const WINDOW_VERDICT = 'window'
14
19
 
15
20
  function driver_args(invocation: string): ReadonlyArray<string> | undefined {
16
21
  const rebuilt = run_invocation.rebuild(invocation)
@@ -21,6 +26,8 @@ function driver_args(invocation: string): ReadonlyArray<string> | undefined {
21
26
  'backlog:drive',
22
27
  '--owner',
23
28
  String(process.pid),
29
+ '--window',
30
+ WINDOW_MINUTES,
24
31
  ...rebuilt.split(' ').slice(1 + named_count),
25
32
  ]
26
33
  }
@@ -141,11 +148,11 @@ function claim_record(target: string, invocation: string): boolean {
141
148
  }
142
149
 
143
150
  // **A verdict with nothing to judge is re-driven here, never handed to a session.** A woken session
144
- // met with `window`, `merge busy` or `merge retry` could only cut and hand the loop back for the same
145
- // driver to run again — a model round trip, at a cache write each, that decides nothing. The record
146
- // is already this process's, so the rerun needs no fresh claim; the limit keeps a driver that never
147
- // settles from holding the supervisor past its own checks.
148
- const RERUN_VERDICTS: ReadonlyArray<string> = ['window', 'merge busy', 'merge retry']
151
+ // met with `merge busy` or `merge retry` could only cut and hand the loop back for the same driver to
152
+ // run again — a model round trip, at a cache write each, that decides nothing. The record is already
153
+ // this process's, so the rerun needs no fresh claim; the limit keeps a driver that never settles from
154
+ // holding the supervisor past its own checks.
155
+ const RERUN_VERDICTS: ReadonlyArray<string> = ['merge busy', 'merge retry']
149
156
  const RERUN_LIMIT = 10
150
157
  const RERUN_PAUSE_MS = 60_000
151
158
 
@@ -157,18 +164,21 @@ async function pause(ms: number): Promise<void> {
157
164
  })
158
165
  }
159
166
 
160
- function is_mechanical(result: JoshResult): boolean {
167
+ function is_verdict(result: JoshResult, entries: ReadonlyArray<string>): boolean {
161
168
  const verdict = result.out.split('\n', 1)[FIRST_LINE] ?? ''
162
169
 
163
170
  return (
164
171
  result.code === SUCCESS &&
165
- RERUN_VERDICTS.some((entry) => verdict === entry || verdict.startsWith(`${entry} `))
172
+ entries.some((entry) => verdict === entry || verdict.startsWith(`${entry} `))
166
173
  )
167
174
  }
168
175
 
169
176
  // A record that was removed during the pause answers `undefined`: its stale verdict must not reach a
170
177
  // session, so the supervisor's own next pass re-reads the record and ends the run as `ended` or
171
178
  // `stopped`; a rerun would only fail on it and report the run as `failed`.
179
+ //
180
+ // **A spent window answers `undefined` too**, so the supervisor's next pass checks its code before it
181
+ // drives again; the restarted driver adopts the lanes still in flight.
172
182
  async function run_driver(
173
183
  target: string,
174
184
  args: ReadonlyArray<string>,
@@ -176,7 +186,8 @@ async function run_driver(
176
186
  remaining: number,
177
187
  ): Promise<JoshResult | undefined> {
178
188
  const result = await josh_command.josh_run(args, true)
179
- if (remaining === 0 || !is_mechanical(result)) return result
189
+ if (is_verdict(result, [WINDOW_VERDICT])) return undefined
190
+ if (remaining === 0 || !is_verdict(result, RERUN_VERDICTS)) return result
180
191
 
181
192
  await wait(RERUN_PAUSE_MS)
182
193
  if (run_carry.read_carry(target).kind !== 'carried') return undefined
@@ -1,3 +1,4 @@
1
+ import { error_text } from '#scripts/lib/error-message'
1
2
  import type { CarryRead } from '#scripts/run/carry/run-carry'
2
3
  import {
3
4
  run_wake,
@@ -22,8 +23,10 @@ import type { LaunchResult } from './run-wake-session'
22
23
 
23
24
  const STOPPED_REASON: WakeStopReason = 'stopped'
24
25
  const FAILED_REASON: WakeStopReason = 'failed'
26
+ const RELOAD_REASON: WakeStopReason = 'reload'
25
27
  const NO_ATTEMPTS = 0
26
28
  const STOPPED_BY_PERSON: LoopStop = { reason: STOPPED_REASON, note: undefined }
29
+ const CODE_CHANGED: LoopStop = { reason: RELOAD_REASON, note: undefined }
27
30
 
28
31
  interface LoopPorts {
29
32
  // The carry record, re-read every pass rather than cached: it is written by the parent loop of a
@@ -47,10 +50,15 @@ interface LoopPorts {
47
50
  wake: (invocation: string, session_id: string, material: string) => LaunchResult
48
51
  sleep: (milliseconds: number) => Promise<void>
49
52
  now: () => Date
53
+ // Closes again a lane a process outlived, once the process is gone (`lane_close.retry_closes`).
54
+ retry_closes: () => Promise<void>
55
+ // Whether the code this process loaded differs from the code on disk now (`run-wake-code.ts`).
56
+ is_code_stale: () => Promise<boolean>
50
57
  }
51
58
 
52
- // `released`: the carry record ended while the driver paused, so there is nothing to hand on and the
53
- // next pass decides from the record how the run ends.
59
+ // `released`: the carry record ended while the driver paused, or the driver's window was spent, so
60
+ // there is nothing to hand on and the next pass decides from the record whether the run ends, reloads
61
+ // or drives on.
54
62
  type DriveResult =
55
63
  | { kind: 'finished' }
56
64
  | { kind: 'released' }
@@ -151,15 +159,37 @@ async function decide_pass(wake: RunWake, ports: LoopPorts): Promise<WakeDecisio
151
159
  return run_wake.decide({ ...input, has_work: await ports.has_work(input.read) })
152
160
  }
153
161
 
162
+ // A lane whose close a process outlived ends once the process is gone (joshuafolkken/kit#4300). A
163
+ // failed retry is the next pass's to try again, never a reason to stop the run.
164
+ async function retry_closes(ports: LoopPorts): Promise<void> {
165
+ try {
166
+ await ports.retry_closes()
167
+ } catch (error) {
168
+ error_text.trace_swallowed('run_wake_loop.retry_closes', error)
169
+ }
170
+ }
171
+
154
172
  // The record is re-read at the top of every pass rather than carried in a variable, so a `--stop` that
155
173
  // removed it ends the loop at the next interval and a `--list` reads what the loop actually wrote.
156
174
  // One pass: decide, act, write the result back. `undefined` means carry on to the next interval.
175
+ //
176
+ // **A pass boundary is where the supervisor reloads its code** (joshuafolkken/kit#4509): no driver
177
+ // is running and no session is being launched, so a successor on the new code takes over without
178
+ // stopping any lane. A record already removed ends the loop before this pass is reached, and a carry
179
+ // record that ended or became unreadable stops the run before the code is checked, so a reload never
180
+ // hands a finished run to a successor.
157
181
  async function run_pass(
158
182
  target: string,
159
183
  wake: RunWake,
160
184
  ports: LoopPorts,
161
185
  ): Promise<LoopStop | undefined> {
162
- const outcome = await step(wake, await decide_pass(wake, ports), ports)
186
+ const decision = await decide_pass(wake, ports)
187
+
188
+ if (decision.kind !== 'stop' && (await ports.is_code_stale())) return CODE_CHANGED
189
+
190
+ await retry_closes(ports)
191
+
192
+ const outcome = await step(wake, decision, ports)
163
193
 
164
194
  if (outcome.kind === 'stop') return outcome.stop
165
195
 
@@ -197,6 +227,7 @@ async function run_loop(target: string, ports: LoopPorts, interval_ms: number):
197
227
 
198
228
  const run_wake_loop = {
199
229
  FAILED_REASON,
230
+ RELOAD_REASON,
200
231
  run_loop,
201
232
  }
202
233
 
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env tsx
2
+ import { fileURLToPath } from 'node:url'
3
+ import { run_wake_cli } from './run-wake-cli'
4
+
5
+ // The `josh run:wake` entry, and the script `--start` spawns with `--loop`. It is kept apart from
6
+ // `run-wake-cli.ts` because `backlogrun-cli.ts` and `backlogrun-restart.ts` import that one: a bundle
7
+ // is one file, so a main guard there would fire for every command that carries it
8
+ // (joshuafolkken/kit#4186).
9
+ if (process.argv[1] === fileURLToPath(import.meta.url)) {
10
+ const ARGV_OFFSET = 2
11
+
12
+ process.exitCode = await run_wake_cli.run(process.argv.slice(ARGV_OFFSET))
13
+ }
@@ -0,0 +1,90 @@
1
+ import { randomUUID } from 'node:crypto'
2
+ import type { AgentProfile } from '#scripts/agent/agent-role-profile'
3
+ import { lane_close } from '#scripts/lane/lane-close'
4
+ import { poll } from '#scripts/lib/poll'
5
+ import { run_carry } from '#scripts/run/carry/run-carry'
6
+ import { run_event_setup } from '#scripts/run/event/run-event-setup'
7
+ import { run_headless } from '#scripts/run/run-headless'
8
+ import type { WakeContext } from './run-wake-describe'
9
+ import { run_wake_driver } from './run-wake-driver'
10
+ import { run_wake_handoff } from './run-wake-handoff'
11
+ import type { LoopPorts } from './run-wake-loop'
12
+ import { run_wake_session, type LaunchResult } from './run-wake-session'
13
+
14
+ // The production ports of the supervisor's loop (`run-wake-loop.ts` → `LoopPorts`), and the session
15
+ // launch they wake through.
16
+
17
+ // **The note covers both ways `wake_argv` answers `undefined`**, because it cannot tell them apart and
18
+ // a message that named only the first would accuse a legitimate invocation of carrying unsafe text.
19
+ // The second is the one a person actually meets: a `queue` whose references carry a `owner/repo#`
20
+ // prefix is a grammar this supervisor does not rebuild, and `queue.md` → "The session boundary" is why
21
+ // such a queue begins no record in the first place.
22
+ const UNSAFE_INVOCATION_NOTE =
23
+ 'the carried invocation is not one this supervisor can continue — it is neither a backlogrun nor a queue it can rebuild, or it carries text that may not be passed to a command line'
24
+
25
+ function note_to_stderr(note: string): void {
26
+ console.error(`wake: ${note}`)
27
+ }
28
+
29
+ // **A session that started is said on the stream.** The driver's `waiting on judgment` is the moment it
30
+ // asked; from here a session is at work on the answer, until the supervisor's next hand-off.
31
+ function say_session_running(context: WakeContext): void {
32
+ run_event_setup.emit_to(context.event_target, run_event_setup.STAGE.SESSION, new Date())
33
+ }
34
+
35
+ function wake_session(
36
+ context: WakeContext,
37
+ invocation: string,
38
+ profile: AgentProfile,
39
+ session: { id: string; material: string },
40
+ ): LaunchResult {
41
+ const built = run_wake_session.wake_argv(invocation, profile, context.worktree, session)
42
+
43
+ if (built === undefined) return { kind: 'failed', note: UNSAFE_INVOCATION_NOTE }
44
+ if (built.kind === 'rejected') return { kind: 'failed', note: built.note }
45
+
46
+ // The headless mark is what lets the stop hook hold this session's turn open while its lanes run —
47
+ // under `claude -p` a turn-end is the process's end (`run-headless.ts`).
48
+ const environment = run_headless.environment()
49
+ const target = { cwd: context.worktree, env: environment, log_path: context.log_target }
50
+ const result = run_wake_session.launch({ argv: built.argv, ...target, profile }, note_to_stderr)
51
+
52
+ if (result.kind === 'launched') say_session_running(context)
53
+
54
+ return result
55
+ }
56
+
57
+ // **A record this supervisor owns itself is not a session at work.** A failed driver leaves the record
58
+ // adopted for this process, so reading that owner as live would have every restarted pass wait on
59
+ // itself and never drive again.
60
+ //
61
+ // `is_code_stale` defaults to never: only the supervisor's own `--loop` watches its code
62
+ // (`run-wake-code.ts`).
63
+ function ports_for(
64
+ context: WakeContext,
65
+ profile: AgentProfile,
66
+ is_code_stale: () => Promise<boolean> = async () => false,
67
+ ): LoopPorts {
68
+ return {
69
+ is_code_stale,
70
+ read_carry: () => run_carry.read_carry(context.carry_target),
71
+ is_owner_live: (read) => read.kind === 'carried' && run_carry.is_held_by_another(read.carry),
72
+ has_work: async () => true,
73
+ new_session_id: () => randomUUID(),
74
+ hand_off: () => {
75
+ run_wake_handoff.hand_off(context.carry_target)
76
+ },
77
+ drive: async () => await run_wake_driver.drive(context.carry_target),
78
+ wake: (invocation, session_id, material) =>
79
+ wake_session(context, invocation, profile, { id: session_id, material }),
80
+ sleep: poll.sleep,
81
+ now: () => new Date(),
82
+ retry_closes: async () => {
83
+ await lane_close.retry_closes()
84
+ },
85
+ }
86
+ }
87
+
88
+ const run_wake_ports = { note_to_stderr, ports_for }
89
+
90
+ export { run_wake_ports }
@@ -0,0 +1,66 @@
1
+ import { process_identity } from '#scripts/josh/process-identity'
2
+ import { poll } from '#scripts/lib/poll'
3
+ import { MS_PER_SECOND } from '#scripts/lib/timeouts'
4
+ import { run_wake } from './run-wake'
5
+ import { run_wake_stop } from './run-wake-stop'
6
+
7
+ // Whether the successor a reload launched took the run over (joshuafolkken/kit#4509).
8
+ //
9
+ // **A spawn is not a take-over.** A successor that dies at load — a `main:sync` that pulled main but
10
+ // whose reinstall failed — was still `launched`, and reading that as the hand-over would leave the run
11
+ // with nobody watching it and nothing saying so. The successor claims the wake record before anything
12
+ // else (`run-wake-await.ts`), so its pid on that record is the proof; its death, or no claim within the
13
+ // bound, is a reload that failed.
14
+
15
+ const TAKEOVER_INTERVAL_MS = MS_PER_SECOND
16
+ // A cold `tsx` start claims within seconds; the bound is generous so a loaded machine is not a failure.
17
+ const TAKEOVER_ATTEMPTS = 120
18
+
19
+ type TakeoverResult = 'taken' | 'died' | 'unclaimed'
20
+
21
+ interface TakeoverPorts {
22
+ holder_pid: () => number | undefined
23
+ is_alive: (pid: number) => boolean
24
+ stop: (pid: number) => void
25
+ sleeper?: (duration_ms: number) => Promise<void>
26
+ }
27
+
28
+ function ports_of(wake_target: string): TakeoverPorts {
29
+ return {
30
+ holder_pid: () => run_wake.read_wake(wake_target)?.pid,
31
+ is_alive: process_identity.is_live_pid,
32
+ stop: run_wake_stop.signal,
33
+ }
34
+ }
35
+
36
+ function result_of(pid: number, ports: TakeoverPorts): TakeoverResult {
37
+ if (ports.holder_pid() === pid) return 'taken'
38
+
39
+ return ports.is_alive(pid) ? 'unclaimed' : 'died'
40
+ }
41
+
42
+ // **A successor still unclaimed at the bound is stopped**, so the failed reload's warning says what is
43
+ // true: left running, it would claim the run later and supervise one the warning and the board call
44
+ // stranded.
45
+ async function await_takeover(
46
+ pid: number,
47
+ ports: TakeoverPorts,
48
+ attempts: number = TAKEOVER_ATTEMPTS,
49
+ ): Promise<TakeoverResult> {
50
+ await poll.poll_until(async () => result_of(pid, ports) !== 'unclaimed', {
51
+ attempts,
52
+ interval_ms: TAKEOVER_INTERVAL_MS,
53
+ ...(ports.sleeper && { sleeper: ports.sleeper }),
54
+ })
55
+
56
+ const result = result_of(pid, ports)
57
+
58
+ if (result === 'unclaimed') ports.stop(pid)
59
+
60
+ return result
61
+ }
62
+
63
+ const run_wake_takeover = { await_takeover, ports_of }
64
+
65
+ export type { TakeoverPorts, TakeoverResult }
66
+ export { run_wake_takeover }
@@ -53,7 +53,8 @@ interface RunWake {
53
53
  idle_since?: string | undefined
54
54
  }
55
55
 
56
- type WakeStopReason = 'ended' | 'unreadable' | 'failed' | 'stopped'
56
+ // `reload`: the supervisor's code changed on disk, so it hands the run to a successor on that code.
57
+ type WakeStopReason = 'ended' | 'unreadable' | 'failed' | 'stopped' | 'reload'
57
58
 
58
59
  // `superseded`: another supervisor holds the record and this process is the replaced one.
59
60
  type WakeTidyResult = 'absent' | 'removed' | 'superseded'
@@ -1,5 +1,6 @@
1
1
  import { existsSync, readFileSync, rmSync } from 'node:fs'
2
2
  import path from 'node:path'
3
+ import { package_manifest } from '#scripts/lib/package-manifest'
3
4
  import { file_reader } from '#scripts/lib/read-file'
4
5
  import { file_content } from '#scripts/sync/file-content'
5
6
  import { z } from 'zod'
@@ -14,7 +15,6 @@ import { z } from 'zod'
14
15
  // `pnpmfileChecksum`, which fails a frozen install until the lockfile is refreshed.
15
16
  const PACK_HOOK_FILE = '.pnpmfile.mjs'
16
17
  const MANAGED_LINE = '// josh-managed-pnpmfile: @joshuafolkken/kit'
17
- const MANIFEST_FILE = 'package.json'
18
18
  // pnpm loads `.pnpmfile.mjs` in preference to `.pnpmfile.cjs`, and neither once a `pnpmfile` setting
19
19
  // names another file — so writing ours beside either would silently drop the project's hooks, or
20
20
  // report a hook pnpm never runs.
@@ -77,7 +77,7 @@ const MESSAGES: Readonly<Record<PackHookResult, string | undefined>> = {
77
77
  }
78
78
 
79
79
  function sync_pack_hook(project_root: string, package_directory: string): PackHookResult {
80
- const manifest_text = file_reader.read_optional(path.join(project_root, MANIFEST_FILE))
80
+ const manifest_text = file_reader.read_optional(package_manifest.manifest_path(project_root))
81
81
  const is_private = manifest_text === undefined || !is_published(manifest_text)
82
82
  const result = is_private ? 'private' : apply(project_root, package_directory)
83
83
  const message = MESSAGES[result]
@@ -17,7 +17,8 @@ const INTEGRATION_HINT =
17
17
  const LOCAL_INTEGRATION_CHECK_SOURCE = `if(!process.env.CI&&!process.env.GLOBAL_AGENT_HTTP_PROXY)console.warn('${INTEGRATION_HINT}')`
18
18
  const SAFE_CHAIN_CMD = `node -e "${LOCAL_INTEGRATION_CHECK_SOURCE}"`
19
19
  // Every `preinstall` an earlier kit wrote: `setup-ci` alone, pinned or not, or followed by the
20
- // `node -e` check of any earlier wording.
20
+ // `node -e` check of any earlier wording. Removable from kit 2.0.0; consumers still carried `setup-ci`
21
+ // at joshuafolkken/kit#4187.
21
22
  const LEGACY_PREINSTALL_RE =
22
23
  /^pnpm dlx @aikidosec\/safe-chain(?:@\S+)? setup-ci(?: && node -e "[^"]*")?$/u
23
24
 
@@ -2,16 +2,14 @@ import { existsSync, readFileSync, writeFileSync } from 'node:fs'
2
2
  import path from 'node:path'
3
3
  import { file_reader } from '#scripts/lib/read-file'
4
4
  import { yaml_document } from '#scripts/lib/yaml-document'
5
- import { release_age } from '#scripts/version/release-age'
5
+ import { release_window } from '#scripts/version/release-window'
6
6
  import { dump } from 'js-yaml'
7
- import { z } from 'zod'
8
7
 
9
8
  const WORKSPACE_FILE = 'pnpm-workspace.yaml'
10
9
  const PROJECT_CONFIG_FILE = '.aikido'
11
10
  const EXCLUSIONS_FIELD = 'minimumPackageAgeExclusions'
12
11
  const AGE_FIELD = 'minimumPackageAgeHours'
13
12
  const MINUTES_PER_HOUR = 60
14
- const workspace_schema = z.object({ minimumReleaseAgeExclude: z.array(z.string()).optional() })
15
13
 
16
14
  function read_mapping(value: unknown, label: string): Record<string, unknown> {
17
15
  if (value === undefined) return {}
@@ -82,7 +80,7 @@ function replace_safe_chain_block(existing: string, safe_chain: Record<string, u
82
80
  // undeclared window writes nothing; an explicit `0` opt-out is written as 0 so an earlier
83
81
  // synchronized age cannot outlive it.
84
82
  function package_age_hours(workspace: string): number | undefined {
85
- const minutes = release_age.parse_declared_minimum_release_age(workspace)
83
+ const { minutes } = release_window.parse_release_window(workspace)
86
84
  if (minutes === undefined) return undefined
87
85
 
88
86
  return Math.floor(minutes / MINUTES_PER_HOUR)
@@ -117,12 +115,8 @@ function has_nothing_to_write(
117
115
  )
118
116
  }
119
117
 
120
- function read_exclusions(workspace: string): ReadonlyArray<string> {
121
- return workspace_schema.parse(yaml_document.parse_yaml(workspace)).minimumReleaseAgeExclude ?? []
122
- }
123
-
124
118
  function merge_project_config(existing: string, workspace: string): string {
125
- const exclusions = read_exclusions(workspace)
119
+ const { exclusions } = release_window.parse_release_window(workspace)
126
120
  const aikido = yaml_document.parse_yaml(existing)
127
121
  const safe_chain = read_mapping(aikido['safe-chain'], 'safe-chain')
128
122
  const merged = merge_age(merge_exclusions(safe_chain, exclusions), workspace)
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env tsx
2
+ import { fileURLToPath } from 'node:url'
3
+ import { security_audit } from './security-audit'
4
+
5
+ // The `josh audit` entry, kept apart from `security-audit.ts` because `start-steps.ts` imports that
6
+ // one: a bundle is one file, so a main guard there would fire for every command that carries it
7
+ // (joshuafolkken/kit#4186). The audit takes no arguments.
8
+ if (process.argv[1] === fileURLToPath(import.meta.url)) process.exitCode = security_audit.run()
@@ -14,7 +14,6 @@ const RELEASE_BASE_URL = 'https://github.com/google/osv-scanner/releases/downloa
14
14
 
15
15
  const WINDOWS_PLATFORM = 'win32'
16
16
  const WINDOWS_ASSET_SUFFIX = '.exe'
17
- const STAGING_SUFFIX = '.download'
18
17
 
19
18
  // The asset is ~55 MB, and a link delivering it at 300 KB/s — measured, not hypothetical — takes
20
19
  // over three minutes. A `SessionStart` hook is waited on, so a single bound generous enough to
@@ -91,15 +90,6 @@ function build_download_url(asset_name: string): string {
91
90
  return `${RELEASE_BASE_URL}/v${SCANNER_VERSION}/${asset_name}`
92
91
  }
93
92
 
94
- // The staging file the download is written to before it is renamed onto the target. The process id
95
- // is what keeps two sessions of one project apart — the `SessionStart` matcher is empty, so a
96
- // `clear` during a startup's download is exactly that — and without it their writes interleave into
97
- // one file that both then rename into place, which the checksum cannot catch because each verified
98
- // its own buffer.
99
- function build_staging_path(target_path: string, process_id: number): string {
100
- return `${target_path}.${String(process_id)}${STAGING_SUFFIX}`
101
- }
102
-
103
93
  // The whole "where do we fetch from" decision in one pure call, so the table above is testable
104
94
  // without a network round trip — which the unit suite forbids anyway (`test-network-guard.ts`).
105
95
  function resolve_asset(platform: string, architecture: string): ScannerAsset | undefined {
@@ -198,7 +188,6 @@ const security_audit_provision_logic = {
198
188
  build_asset_name,
199
189
  build_download_timeout,
200
190
  build_download_url,
201
- build_staging_path,
202
191
  format_already_present,
203
192
  format_below_floor,
204
193
  format_checksum_mismatch,
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env tsx
2
+ import { fileURLToPath } from 'node:url'
3
+ import { security_audit_provision } from './security-audit-provision'
4
+
5
+ // The `josh audit:provision` entry and the session-start hook's bundle, kept apart from
6
+ // `security-audit-provision.ts` because `start-steps.ts` imports that one: a bundle is one file, so a
7
+ // main guard there would fire for every command that carries it (joshuafolkken/kit#4186).
8
+ if (process.argv[1] === fileURLToPath(import.meta.url)) {
9
+ const ARGV_OFFSET = 2
10
+
11
+ await security_audit_provision.run(process.argv.slice(ARGV_OFFSET))
12
+ }
@@ -1,9 +1,6 @@
1
- #!/usr/bin/env tsx
2
- import { chmodSync, mkdirSync, renameSync, rmSync, writeFileSync } from 'node:fs'
3
- import path from 'node:path'
4
- import { fileURLToPath } from 'node:url'
5
1
  import { PROJECT_ROOT } from '#scripts/init/init-paths'
6
2
  import { stamp_file } from '#scripts/josh/stamp-file'
3
+ import { atomic_write } from '#scripts/lib/atomic-write'
7
4
  import { error_text } from '#scripts/lib/error-message'
8
5
  import { timed_fetch } from '#scripts/lib/timed-fetch'
9
6
  import { security_audit } from './security-audit'
@@ -43,24 +40,14 @@ async function download(url: string, timeout_ms: number): Promise<DownloadOutcom
43
40
  }
44
41
  }
45
42
 
46
- // Staged beside the target and renamed onto it, under a name carrying this process's id. A download
47
- // interrupted halfway would otherwise leave a truncated file at the path `josh audit` spawns; and a
48
- // shared staging name would let two sessions of the same project — the `SessionStart` matcher is
49
- // empty, so a `clear` during a startup's download is exactly that — interleave their writes into one
50
- // file that both then rename into place, which the checksum cannot catch because it was verified
51
- // against each process's own buffer. The `finally` removes the staging file on every failing path.
43
+ // Staged beside the target and renamed onto it (`atomic-write.ts`). A download interrupted halfway
44
+ // would otherwise leave a truncated file at the path `josh audit` spawns; and a shared staging name
45
+ // would let two sessions of the same project — the `SessionStart` matcher is empty, so a `clear`
46
+ // during a startup's download is exactly that — interleave their writes into one file that both then
47
+ // rename into place, which the checksum cannot catch because it was verified against each process's
48
+ // own buffer.
52
49
  function install(target_path: string, content: Buffer): void {
53
- const staging_path = security_audit_provision_logic.build_staging_path(target_path, process.pid)
54
-
55
- mkdirSync(path.dirname(target_path), { recursive: true })
56
-
57
- try {
58
- writeFileSync(staging_path, content)
59
- chmodSync(staging_path, EXECUTABLE_MODE)
60
- renameSync(staging_path, target_path)
61
- } finally {
62
- rmSync(staging_path, { force: true })
63
- }
50
+ atomic_write.replace_file(target_path, content, { mode: EXECUTABLE_MODE })
64
51
  }
65
52
 
66
53
  function failure_stamp_path(target_path: string): string {
@@ -167,8 +154,8 @@ async function report(
167
154
  // Every failure is a printed line and a zero exit, deliberately: this runs at session start, and a
168
155
  // non-zero exit there would take an agent's whole session away over a tool it does not need yet.
169
156
  // The audit's own gate is unchanged — a scanner that never arrived still fails the pre-push run.
170
- async function main(): Promise<void> {
171
- const is_forced = process.argv.includes(FORCE_FLAG)
157
+ async function run(argv: ReadonlyArray<string>): Promise<void> {
158
+ const is_forced = argv.includes(FORCE_FLAG)
172
159
 
173
160
  try {
174
161
  console.info(await report(PROJECT_ROOT, process.platform, process.arch, is_forced))
@@ -179,8 +166,6 @@ async function main(): Promise<void> {
179
166
  }
180
167
  }
181
168
 
182
- if (process.argv[1] === fileURLToPath(import.meta.url)) await main()
183
-
184
- const security_audit_provision = { attempt, provision, report }
169
+ const security_audit_provision = { attempt, provision, report, run }
185
170
 
186
171
  export { security_audit_provision }
@@ -1,6 +1,4 @@
1
- #!/usr/bin/env tsx
2
1
  import { accessSync, constants, statSync } from 'node:fs'
3
- import { fileURLToPath } from 'node:url'
4
2
  import { PROJECT_ROOT } from '#scripts/init/init-paths'
5
3
  import { execaSync } from 'execa'
6
4
  import { security_audit_logic } from './security-audit-logic'
@@ -115,27 +113,28 @@ function warn_below_floor(scanner_path: string): void {
115
113
  console.warn(security_audit_provision_logic.format_below_floor(version))
116
114
  }
117
115
 
118
- function main(): never {
116
+ // The `josh audit` run: the scanner's exit code, or a failure when there is no scanner at all.
117
+ function run(): number {
119
118
  const { BINARY_NAME, format_missing_binary_error } = security_audit_logic
120
119
  const choice = resolve_scanner(PROJECT_ROOT, process.platform)
121
120
 
122
121
  if (choice === undefined) {
123
122
  console.error(format_missing_binary_error(BINARY_NAME))
124
- process.exit(FAILURE_EXIT_CODE)
123
+
124
+ return FAILURE_EXIT_CODE
125
125
  }
126
126
 
127
127
  if (choice.is_below_floor) warn_below_floor(choice.path)
128
128
 
129
- process.exit(run_scanner(choice.path))
129
+ return run_scanner(choice.path)
130
130
  }
131
131
 
132
- if (process.argv[1] === fileURLToPath(import.meta.url)) main()
133
-
134
132
  const security_audit = {
135
133
  is_binary_available,
136
134
  is_executable_file,
137
135
  meets_floor,
138
136
  resolve_scanner,
137
+ run,
139
138
  run_scanner,
140
139
  }
141
140
 
@@ -1,5 +1,6 @@
1
- import { readFileSync } from 'node:fs'
2
1
  import path from 'node:path'
2
+ import { package_manifest } from '#scripts/lib/package-manifest'
3
+ import { z } from 'zod'
3
4
 
4
5
  // `josh sync` / `josh-app sync` / `josh-game sync` all copy a distribution package's files into a
5
6
  // consumer project. Run inside the package's OWN repository the direction reverses: the source of
@@ -12,20 +13,12 @@ import path from 'node:path'
12
13
  // The check lives here rather than in each package's sync so the three distributors share one
13
14
  // implementation: a second copy would drift, and a distributor that spelled the signal differently
14
15
  // would keep exactly the hole this closes.
15
- const MANIFEST_NAME = 'package.json'
16
+ const named_manifest_schema = z.object({ name: z.string() })
16
17
 
18
+ // A missing, unreadable or malformed manifest says nothing about self-sync, and refusing to sync on
19
+ // it would break consumers whose manifest this package is about to create.
17
20
  function read_package_name(directory: string): string | undefined {
18
- try {
19
- const manifest: unknown = JSON.parse(readFileSync(path.join(directory, MANIFEST_NAME), 'utf8'))
20
- if (typeof manifest !== 'object' || manifest === null) return undefined
21
- const { name } = manifest as { name?: unknown }
22
-
23
- return typeof name === 'string' ? name : undefined
24
- } catch {
25
- // A missing, unreadable or malformed manifest says nothing about self-sync, and refusing to
26
- // sync on it would break consumers whose manifest this package is about to create.
27
- return undefined
28
- }
21
+ return package_manifest.read_manifest_if_valid(directory, named_manifest_schema)?.name
29
22
  }
30
23
 
31
24
  function is_same_directory(first: string, second: string): boolean {
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env tsx
2
2
  import { fileURLToPath } from 'node:url'
3
- import { git_command } from '#scripts/git/git-command'
4
3
  import { path_decision } from '#scripts/josh/path-decision'
5
4
  import { split_assess } from './split-assess'
5
+ import { split_measure } from './split-measure'
6
6
 
7
7
  // `josh split:assess` — measure a branch's change size, tests excluded, and answer the size question
8
8
  // of the split assessment.
@@ -33,7 +33,7 @@ async function run(argv: ReadonlyArray<string>): Promise<number> {
33
33
  return FAILURE_EXIT_CODE
34
34
  }
35
35
 
36
- const measurement = split_assess.assess(await git_command.diff_main_numstat())
36
+ const measurement = await split_measure.read_branch()
37
37
  const reason = split_assess.reason(measurement)
38
38
 
39
39
  path_decision.print_decision(JSON_KEY, measurement.verdict, reason, is_json)
@@ -107,12 +107,27 @@ function reason(measurement: SizeMeasurement): string {
107
107
  return `${counted} (${guide}) — ${tail}`
108
108
  }
109
109
 
110
+ // The `split-assessment.md` heading the notice points at; the document-rule test pins the document to it.
111
+ const NOTICE_SECTION = 'Over the guide before the gate'
112
+ const NOTICE_ACTION = `record why it stays one Issue, or carve the rest out into a new Issue — split-assessment.md → "${NOTICE_SECTION}"`
113
+
114
+ // The pre-gate notice `josh main:merge` prints for a diff over the guide. "Clearly" is the `split`
115
+ // verdict — both guides exceeded — so the one bar this file draws is the one the notice fires on,
116
+ // and a diff under it prints nothing.
117
+ function notice(measurement: SizeMeasurement): string | undefined {
118
+ if (measurement.verdict !== SPLIT_VERDICT) return undefined
119
+
120
+ return `split notice: ${reason(measurement)}. Before the run:cut, ${NOTICE_ACTION}`
121
+ }
122
+
110
123
  const split_assess = {
111
124
  FILE_GUIDE,
112
125
  LINE_GUIDE,
126
+ NOTICE_SECTION,
113
127
  SPLIT_VERDICT,
114
128
  SINGLE_VERDICT,
115
129
  assess,
130
+ notice,
116
131
  parse_numstat,
117
132
  reason,
118
133
  }