@joshuafolkken/kit 1.1514.0 → 1.1784.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (858) hide show
  1. package/.claude/agents/investigator.md +1 -1
  2. package/.claude/settings.json +5 -5
  3. package/.claude/skills/epic-commands/SKILL.md +26 -65
  4. package/.claude/skills/epic-commands/epic-bundle.md +3 -1
  5. package/.claude/skills/workflow-commands/SKILL.md +5 -5
  6. package/.claude/skills/workflow-commands/background-commands.md +5 -5
  7. package/.claude/skills/workflow-commands/backlogrun-child.md +10 -8
  8. package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +7 -25
  9. package/.claude/skills/workflow-commands/backlogrun-lanes.md +17 -13
  10. package/.claude/skills/workflow-commands/backlogrun-park.md +14 -23
  11. package/.claude/skills/workflow-commands/backlogrun-progress.md +2 -2
  12. package/.claude/skills/workflow-commands/backlogrun-recovery.md +5 -5
  13. package/.claude/skills/workflow-commands/backlogrun-steps.md +10 -10
  14. package/.claude/skills/workflow-commands/backlogrun.md +1 -1
  15. package/.claude/skills/workflow-commands/chain-rule.md +13 -7
  16. package/.claude/skills/workflow-commands/delegation.md +6 -5
  17. package/.claude/skills/workflow-commands/entry-sequence.md +9 -9
  18. package/.claude/skills/workflow-commands/followup.md +9 -31
  19. package/.claude/skills/workflow-commands/fullrun-steps.md +36 -45
  20. package/.claude/skills/workflow-commands/fullrun.md +2 -2
  21. package/.claude/skills/workflow-commands/halfrun.md +17 -25
  22. package/.claude/skills/workflow-commands/issue-comments.md +16 -12
  23. package/.claude/skills/workflow-commands/issue-scout.md +2 -2
  24. package/.claude/skills/workflow-commands/kickoff.md +24 -23
  25. package/.claude/skills/workflow-commands/latest-gate.md +7 -12
  26. package/.claude/skills/workflow-commands/needs-human-review.md +9 -14
  27. package/.claude/skills/workflow-commands/observation-filing.md +4 -36
  28. package/.claude/skills/workflow-commands/observation-ledger.md +1 -1
  29. package/.claude/skills/workflow-commands/pre-gate-cut.md +13 -30
  30. package/.claude/skills/workflow-commands/prerequisite.md +10 -16
  31. package/.claude/skills/workflow-commands/progress-watcher.md +1 -1
  32. package/.claude/skills/workflow-commands/prrun.md +3 -7
  33. package/.claude/skills/workflow-commands/retrospective.md +1 -1
  34. package/.claude/skills/workflow-commands/split-assessment.md +13 -1
  35. package/.claude/skills/workflow-commands/working-tree-hold.md +9 -9
  36. package/.codex/hooks.json +5 -5
  37. package/.github/actions/setup-node/action.yml +9 -0
  38. package/.github/actions/setup-pnpm/action.yml +1 -1
  39. package/.github/dependabot.yml +16 -0
  40. package/.github/release.yml +0 -2
  41. package/.github/workflows/ci.yml +120 -10
  42. package/.github/workflows/publish.yml +8 -1
  43. package/.github/workflows/sonar-qube.yml +1 -0
  44. package/.prettierignore +2 -0
  45. package/.vscode/tasks.json +1 -2
  46. package/CLAUDE.md +3 -7
  47. package/README.md +4 -2
  48. package/SECURITY.md +1 -1
  49. package/dist/CLAUDE.md +3 -7
  50. package/dist/commands/document-read-cli.js +882 -0
  51. package/dist/commands/{document-section-cli.js → document-section-main.js} +79 -37
  52. package/dist/commands/read-set-cli.js +1867 -0
  53. package/dist/commands/run-prep-main.js +21653 -0
  54. package/dist/commands/run-step-cli.js +23880 -0
  55. package/dist/config-merge/index.js +5 -1
  56. package/dist/hooks/audit-provision.js +20 -35
  57. package/dist/hooks/{chunk-DGT54IH5.js → chunk-AZX4FGQ3.js} +63 -17
  58. package/dist/hooks/chunk-CWMBGKYW.js +6483 -0
  59. package/dist/hooks/chunk-O2YBIDSI.js +4306 -0
  60. package/dist/hooks/{chunk-TNUMY6NL.js → chunk-PT5R6UJD.js} +4193 -1900
  61. package/dist/hooks/chunk-TUIFS5E7.js +72 -0
  62. package/dist/hooks/{chunk-723HKZO5.js → chunk-VWWCFGWK.js} +1 -1
  63. package/dist/hooks/{chunk-APUO6U4J.js → chunk-WR2KQAYZ.js} +1843 -440
  64. package/dist/hooks/{chunk-O6GDRNJB.js → chunk-XGBNSWEI.js} +248 -46
  65. package/dist/hooks/chunk-YCDOIR3I.js +3456 -0
  66. package/dist/hooks/codex-hook-adapter.js +10 -22
  67. package/dist/hooks/format-edited.js +5 -6
  68. package/dist/hooks/inputs.json +443 -317
  69. package/dist/hooks/pretool-guard.js +7 -25
  70. package/dist/hooks/session-lang.js +44 -51
  71. package/dist/hooks/stop-guard.js +7716 -2187
  72. package/dist/josh.js +6002 -3583
  73. package/dist/self-sync-guard/index.js +74 -10
  74. package/dist/version/index.js +115 -406
  75. package/eslint/base.js +1 -1
  76. package/lefthook/base.yml +3 -1
  77. package/package.json +10 -48
  78. package/pnpm-workspace.yaml +4 -2
  79. package/prompts/coding-standards.md +1 -1
  80. package/prompts/collaboration-workflow/file-edits.md +1 -7
  81. package/prompts/collaboration-workflow/issue-citation.md +1 -1
  82. package/prompts/collaboration-workflow/issue-template.md +33 -16
  83. package/prompts/collaboration-workflow/lane-instructions.md +1 -2
  84. package/prompts/collaboration-workflow/measurement.md +37 -0
  85. package/prompts/collaboration-workflow/operating-rules.md +4 -6
  86. package/prompts/collaboration-workflow/output-bounds.md +2 -7
  87. package/prompts/collaboration-workflow/plan-comment.md +3 -42
  88. package/prompts/collaboration-workflow/principles.md +5 -0
  89. package/prompts/collaboration-workflow/report-format.md +31 -60
  90. package/prompts/collaboration-workflow/residency.md +2 -2
  91. package/prompts/collaboration-workflow/shell-body.md +6 -16
  92. package/prompts/collaboration-workflow/turn-batching.md +0 -2
  93. package/prompts/collaboration-workflow/upstream-interrupt.md +14 -4
  94. package/prompts/collaboration-workflow/wip-cap.md +1 -1
  95. package/prompts/collaboration-workflow.md +3 -7
  96. package/prompts/refactoring.md +1 -1
  97. package/prompts/review-rubric.md +1 -2
  98. package/prompts/review.md +41 -21
  99. package/prompts/testing-guide.md +8 -43
  100. package/scripts/agent/agent-event.ts +15 -15
  101. package/scripts/agent/agent-exit-record.ts +13 -1
  102. package/scripts/agent/api-auth.ts +41 -0
  103. package/scripts/agent/api-outage.ts +1 -1
  104. package/scripts/auto-ok/auto-ok-cli.ts +14 -16
  105. package/scripts/auto-ok/auto-ok-judge-read.ts +12 -3
  106. package/scripts/auto-ok/auto-ok-judge-write.ts +46 -19
  107. package/scripts/auto-ok/auto-ok-judge.ts +13 -2
  108. package/scripts/auto-ok/auto-ok-main.ts +17 -0
  109. package/scripts/backlog/backlog-arrival.ts +14 -3
  110. package/scripts/backlog/backlog-budget-cli.ts +7 -33
  111. package/scripts/backlog/backlog-budget-main.ts +16 -0
  112. package/scripts/backlog/backlog-budget.ts +2 -3
  113. package/scripts/backlog/backlog-defect-priority.ts +4 -3
  114. package/scripts/backlog/backlog-drive-adopt.ts +67 -0
  115. package/scripts/backlog/backlog-drive-args.ts +4 -5
  116. package/scripts/backlog/backlog-drive-cli.ts +113 -28
  117. package/scripts/backlog/backlog-drive-hold.ts +162 -0
  118. package/scripts/backlog/backlog-drive-idle.ts +151 -0
  119. package/scripts/backlog/backlog-drive-judge.ts +25 -0
  120. package/scripts/backlog/backlog-drive-memory.ts +126 -0
  121. package/scripts/backlog/backlog-drive-named-offer.ts +5 -10
  122. package/scripts/backlog/backlog-drive-named.ts +53 -6
  123. package/scripts/backlog/backlog-drive-offer-argv.ts +3 -8
  124. package/scripts/backlog/backlog-drive-paused.ts +169 -0
  125. package/scripts/backlog/backlog-drive-restore.ts +30 -7
  126. package/scripts/backlog/backlog-drive-seats.ts +18 -8
  127. package/scripts/backlog/backlog-drive-token-handling.ts +38 -0
  128. package/scripts/backlog/backlog-drive.ts +79 -75
  129. package/scripts/backlog/backlog-next-main.ts +16 -0
  130. package/scripts/backlog/backlog-next-shared.ts +73 -0
  131. package/scripts/backlog/backlog-next.ts +48 -16
  132. package/scripts/backlog/backlog-occupied.ts +52 -39
  133. package/scripts/backlog/backlog-offer-cli.ts +6 -21
  134. package/scripts/backlog/backlog-offer-exclude.ts +15 -0
  135. package/scripts/backlog/backlog-offer-main.ts +12 -0
  136. package/scripts/backlog/backlog-offer.ts +36 -3
  137. package/scripts/backlog/backlog-overlap.ts +22 -4
  138. package/scripts/backlog/backlog-plan-read.ts +6 -2
  139. package/scripts/backlog/backlog-plan.ts +18 -4
  140. package/scripts/backlog/backlog-pool.ts +10 -10
  141. package/scripts/backlog/backlog-rank.ts +10 -2
  142. package/scripts/backlog/backlog-ready.ts +112 -30
  143. package/scripts/backlog/backlog-stalled-detect.ts +109 -36
  144. package/scripts/backlog/backlog-stalled.ts +52 -16
  145. package/scripts/backlog/backlog-wait-cause.ts +86 -0
  146. package/scripts/backlog/backlog-waves.ts +39 -13
  147. package/scripts/backlog/backlogrun-args.ts +19 -7
  148. package/scripts/backlog/backlogrun-cli.ts +19 -5
  149. package/scripts/backlog/backlogrun-launch.ts +6 -0
  150. package/scripts/backlog/backlogrun-restart.ts +97 -0
  151. package/scripts/backlog/backlogrun-stop.ts +79 -7
  152. package/scripts/behavior/behavior-cli.ts +2 -2
  153. package/scripts/behavior/behavior-rules.ts +47 -24
  154. package/scripts/build/build-bin.ts +2 -16
  155. package/scripts/build/build-claude-md.ts +0 -7
  156. package/scripts/build/build-commands.ts +0 -13
  157. package/scripts/build/build-hooks.ts +49 -48
  158. package/scripts/build/hook-bundle-stamp.ts +29 -11
  159. package/scripts/build/local-bin.ts +1 -1
  160. package/scripts/cases/cases-cli.ts +25 -13
  161. package/scripts/cases/cases-interaction-scan.ts +134 -0
  162. package/scripts/cases/cases-interaction.ts +183 -0
  163. package/scripts/cases/cases-logic.ts +39 -6
  164. package/scripts/ci/pr-classification-main.ts +18 -0
  165. package/scripts/ci/pr-classification.ts +10 -17
  166. package/scripts/clone/clone-scan.ts +1 -1
  167. package/scripts/cost-runtime/cost-blocks.ts +22 -37
  168. package/scripts/cost-runtime/cost-cli.ts +31 -14
  169. package/scripts/cost-runtime/cost-main.ts +12 -0
  170. package/scripts/cost-runtime/cost-transcript.ts +1 -0
  171. package/scripts/delegation/delegation-policy.ts +17 -4
  172. package/scripts/delegation/duplicate-read-guard.ts +0 -8
  173. package/scripts/delegation/investigation-guard.ts +0 -8
  174. package/scripts/delegation/investigation-reads.ts +3 -4
  175. package/scripts/dependabot/dependabot-cooldown.ts +194 -0
  176. package/scripts/discovery/repo-discovery.ts +24 -6
  177. package/scripts/doctor/doctor-consumer.ts +2 -5
  178. package/scripts/document/document-byte-budget.ts +8 -6
  179. package/scripts/document/document-scan.ts +1 -1
  180. package/scripts/document/document-section-cli.ts +0 -8
  181. package/scripts/document/document-section-main.ts +12 -0
  182. package/scripts/epic/epic-audit-cli.ts +12 -6
  183. package/scripts/epic/epic-bundle-apply.ts +137 -0
  184. package/scripts/epic/epic-bundle-cli.ts +32 -121
  185. package/scripts/epic/epic-bundle-format.ts +116 -0
  186. package/scripts/epic/epic-bundle-main.ts +17 -0
  187. package/scripts/epic/epic-busy.ts +5 -12
  188. package/scripts/epic/epic-classify.ts +24 -15
  189. package/scripts/epic/epic-cli-argv.ts +31 -0
  190. package/scripts/epic/epic-cli-decide.ts +42 -0
  191. package/scripts/epic/epic-cli.ts +6 -38
  192. package/scripts/epic/epic-close.ts +112 -55
  193. package/scripts/epic/epic-cross-repo.ts +4 -7
  194. package/scripts/epic/epic-decide.ts +119 -0
  195. package/scripts/epic/epic-decision.ts +9 -0
  196. package/scripts/epic/epic-fetch.ts +4 -0
  197. package/scripts/epic/epic-graph.ts +2 -0
  198. package/scripts/epic/epic-issue.ts +5 -1
  199. package/scripts/epic/epic-label-age.ts +1 -1
  200. package/scripts/epic/epic-lane-offer.ts +39 -4
  201. package/scripts/epic/epic-next-main.ts +24 -0
  202. package/scripts/epic/epic-next.ts +6 -24
  203. package/scripts/epic/epic-outside-blocker.ts +6 -2
  204. package/scripts/epic/epic-parse.ts +9 -3
  205. package/scripts/epic/epic-read.ts +1 -0
  206. package/scripts/epic/epic-reconcile.ts +39 -0
  207. package/scripts/epic/epic-run.ts +10 -1
  208. package/scripts/epic/epic-solo.ts +50 -14
  209. package/scripts/epic/epic.ts +41 -7
  210. package/scripts/exports/unused-members-cli.ts +2 -2
  211. package/scripts/followup/followup-checks-event.ts +8 -3
  212. package/scripts/followup/followup-coderabbit-wait.ts +82 -0
  213. package/scripts/followup/followup-review-gates.ts +81 -0
  214. package/scripts/followup/git-followup-stages.ts +13 -3
  215. package/scripts/followup/git-followup-workflow.ts +19 -66
  216. package/scripts/followup/git-pr-followup-wrapup.ts +9 -14
  217. package/scripts/followup/git-pr-followup.ts +36 -8
  218. package/scripts/fresh-machine/fresh-machine-cli.ts +1 -1
  219. package/scripts/fresh-machine/fresh-machine-run.ts +8 -8
  220. package/scripts/fresh-machine/specs/kit-test-backlogrun.json +1 -1
  221. package/scripts/gate/busy-average.ts +58 -0
  222. package/scripts/gate/check-cpu.ts +60 -0
  223. package/scripts/gate/check-inputs.ts +39 -95
  224. package/scripts/gate/check-reuse.ts +33 -54
  225. package/scripts/gate/command-memory.ts +192 -0
  226. package/scripts/gate/core-admission.ts +218 -28
  227. package/scripts/gate/core-budget-timing.ts +37 -0
  228. package/scripts/gate/core-budget.ts +80 -98
  229. package/scripts/gate/core-wait-record.ts +48 -0
  230. package/scripts/gate/core-wait.ts +37 -5
  231. package/scripts/gate/core-weights.ts +86 -0
  232. package/scripts/gate/free-cores.ts +27 -4
  233. package/scripts/gate/gate-ledger.ts +32 -4
  234. package/scripts/gate/gate-plan.ts +41 -34
  235. package/scripts/gate/gate-report.ts +14 -2
  236. package/scripts/gate/gate-run-steps.ts +53 -8
  237. package/scripts/gate/gate-skip.ts +12 -2
  238. package/scripts/gate/gate-steps.ts +12 -1
  239. package/scripts/gate/input-fingerprint.ts +42 -0
  240. package/scripts/gate/machine-capacity.ts +65 -31
  241. package/scripts/gate/moved-paths.ts +67 -0
  242. package/scripts/gate/project-checks.ts +5 -12
  243. package/scripts/gate/scoped-green.ts +12 -8
  244. package/scripts/gate/since-green.ts +62 -0
  245. package/scripts/gate/toolchain-inputs.ts +115 -0
  246. package/scripts/gate/verification-gate.ts +27 -24
  247. package/scripts/gate/verification-inputs.ts +250 -0
  248. package/scripts/gh/gh-author-association.ts +96 -9
  249. package/scripts/gh/git-ai-review-scan.ts +4 -2
  250. package/scripts/gh/git-gh-api-path.ts +15 -0
  251. package/scripts/gh/git-gh-branch-rules.ts +73 -0
  252. package/scripts/gh/git-gh-conditional.ts +5 -2
  253. package/scripts/gh/git-gh-issue-read.ts +5 -1
  254. package/scripts/gh/git-gh-issue-write.ts +67 -29
  255. package/scripts/gh/git-gh-issue.ts +7 -3
  256. package/scripts/gh/git-gh-poll-read.ts +89 -0
  257. package/scripts/gh/git-gh-pr-auto-merge.ts +8 -3
  258. package/scripts/gh/git-gh-pr-rest.ts +1 -1
  259. package/scripts/gh/git-gh-pr-snapshot.ts +33 -20
  260. package/scripts/gh/git-gh-pr.ts +27 -15
  261. package/scripts/gh/git-pr-checks-eval.ts +39 -7
  262. package/scripts/gh/git-pr-checks-parse.ts +39 -9
  263. package/scripts/gh/git-pr-merge-checked.ts +80 -0
  264. package/scripts/git/base-tree.ts +19 -2
  265. package/scripts/git/changed-file-scope.ts +6 -4
  266. package/scripts/git/changed-paths.ts +18 -1
  267. package/scripts/git/git-diff-reads.ts +27 -2
  268. package/scripts/git/git-grep-hits.ts +85 -0
  269. package/scripts/git/git-location-environment.ts +1 -1
  270. package/scripts/git/git-merge-conflicts.ts +83 -0
  271. package/scripts/git/git-preflight.ts +37 -12
  272. package/scripts/git/git-push-transport.ts +1 -2
  273. package/scripts/git/git-schemas.ts +17 -7
  274. package/scripts/git/git-spawn.ts +1 -2
  275. package/scripts/git/git-status.ts +4 -4
  276. package/scripts/git/main-merge-main.ts +12 -0
  277. package/scripts/git/main-merge-regenerate.ts +2 -2
  278. package/scripts/git/main-merge.ts +25 -9
  279. package/scripts/git/main-sync-main.ts +12 -0
  280. package/scripts/git/main-sync.ts +0 -9
  281. package/scripts/git/stash/git-stash.ts +27 -4
  282. package/scripts/git/stash/{stash-pop-args.ts → stash-args.ts} +13 -10
  283. package/scripts/git/stash/stash-pop-cli.ts +6 -12
  284. package/scripts/git/stash/stash-pop-main.ts +12 -0
  285. package/scripts/git/stash/stash-push-cli.ts +76 -0
  286. package/scripts/git/stash/stash-push-main.ts +12 -0
  287. package/scripts/hooks/batch-guard.ts +0 -8
  288. package/scripts/hooks/check-commit-message-main.ts +8 -0
  289. package/scripts/hooks/check-commit-message.ts +4 -7
  290. package/scripts/hooks/format-edited-file.ts +8 -24
  291. package/scripts/hooks/pre-commit-lint.ts +30 -3
  292. package/scripts/hooks/pre-push-unit.ts +4 -2
  293. package/scripts/hooks/pretool-guard-cli.ts +1 -8
  294. package/scripts/hooks/pretool-guard.ts +32 -19
  295. package/scripts/hooks/reserved-run.ts +67 -9
  296. package/scripts/hooks/run-hook.sh +13 -4
  297. package/scripts/hooks/shell-rules-notice.ts +37 -0
  298. package/scripts/hooks/stop-actions.ts +2 -21
  299. package/scripts/hooks/stop-guard.ts +13 -9
  300. package/scripts/init/hook-command-rewrite.ts +19 -5
  301. package/scripts/init/hook-launch.ts +15 -17
  302. package/scripts/init/init-actions.ts +0 -6
  303. package/scripts/init/init-ai-copy.ts +10 -36
  304. package/scripts/init/init-bootstrap.ts +9 -8
  305. package/scripts/init/init-dry-run-report.ts +1 -1
  306. package/scripts/init/init-dry-run.ts +1 -1
  307. package/scripts/init/init-file-action.ts +7 -9
  308. package/scripts/init/init-logic-json-merge.ts +2 -2
  309. package/scripts/init/init-logic-migrate.ts +9 -82
  310. package/scripts/init/init-logic.ts +3 -2
  311. package/scripts/init/init-main.ts +12 -0
  312. package/scripts/init/init.ts +5 -12
  313. package/scripts/init/kit-development-versions.ts +3 -7
  314. package/scripts/init/kit-written-paths.ts +2 -2
  315. package/scripts/init/project-profile.ts +5 -4
  316. package/scripts/init/tsconfig-preset-migration.ts +2 -1
  317. package/scripts/init/vscode-tasks.ts +1 -1
  318. package/scripts/issue/defect-origin-cli.ts +106 -0
  319. package/scripts/issue/defect-origin-line.ts +60 -0
  320. package/scripts/issue/defect-origin-main.ts +11 -0
  321. package/scripts/issue/defect-origin.ts +114 -0
  322. package/scripts/issue/defect-rate-cli.ts +34 -78
  323. package/scripts/issue/defect-rate.ts +0 -16
  324. package/scripts/issue/defect-report-cli.ts +128 -0
  325. package/scripts/issue/defect-report-format.ts +56 -0
  326. package/scripts/issue/defect-report-main.ts +11 -0
  327. package/scripts/issue/defect-report.ts +160 -0
  328. package/scripts/issue/expected-effect-lint.ts +1 -0
  329. package/scripts/issue/issue-already-done-cli.ts +62 -0
  330. package/scripts/issue/issue-body-or-comment.ts +40 -0
  331. package/scripts/issue/issue-cite-cli.ts +0 -9
  332. package/scripts/issue/issue-cite-main.ts +12 -0
  333. package/scripts/issue/issue-classification.ts +12 -7
  334. package/scripts/issue/issue-comment-cli.ts +10 -24
  335. package/scripts/issue/issue-comment-main.ts +12 -0
  336. package/scripts/issue/issue-evidence-exit.ts +100 -0
  337. package/scripts/issue/issue-file-cli.ts +29 -7
  338. package/scripts/issue/issue-file.ts +19 -19
  339. package/scripts/issue/issue-fold-cli.ts +2 -11
  340. package/scripts/issue/issue-fold-main.ts +12 -0
  341. package/scripts/issue/issue-labels.ts +81 -90
  342. package/scripts/issue/issue-lint-cli.ts +2 -10
  343. package/scripts/issue/issue-lint-main.ts +12 -0
  344. package/scripts/issue/issue-measured-cli.ts +56 -0
  345. package/scripts/issue/issue-merged.ts +19 -2
  346. package/scripts/issue/issue-not-before-label.ts +135 -0
  347. package/scripts/issue/issue-not-before.ts +111 -0
  348. package/scripts/issue/issue-number-shape.ts +15 -1
  349. package/scripts/issue/issue-park.ts +28 -0
  350. package/scripts/issue/issue-plan-cli.ts +151 -0
  351. package/scripts/issue/issue-priority.ts +151 -0
  352. package/scripts/issue/issue-rank.ts +7 -1
  353. package/scripts/issue/issue-read-cli.ts +3 -10
  354. package/scripts/issue/issue-read-main.ts +12 -0
  355. package/scripts/issue/issue-read.ts +29 -5
  356. package/scripts/issue/issue-release-cli.ts +0 -10
  357. package/scripts/issue/issue-release-main.ts +13 -0
  358. package/scripts/issue/issue-release.ts +7 -12
  359. package/scripts/issue/issue-sample-gate.ts +192 -0
  360. package/scripts/issue/issue-sample-source.ts +76 -0
  361. package/scripts/issue/issue-scout-cli.ts +0 -11
  362. package/scripts/issue/issue-scout-main.ts +14 -0
  363. package/scripts/issue/issue-state-cli.ts +0 -10
  364. package/scripts/issue/issue-state-main.ts +12 -0
  365. package/scripts/issue/issue-watch-diff.ts +56 -15
  366. package/scripts/issue/issue-watch.ts +2 -1
  367. package/scripts/issue/issue-wip.ts +2 -7
  368. package/scripts/issue/measure-rerun-cli.ts +13 -8
  369. package/scripts/issue/plan-consumers-cli.ts +39 -0
  370. package/scripts/issue/plan-consumers-main.ts +11 -0
  371. package/scripts/issue/plan-consumers-section.ts +55 -0
  372. package/scripts/issue/plan-consumers.ts +127 -0
  373. package/scripts/josh/agent-session-environment.ts +1 -1
  374. package/scripts/josh/command-usage.ts +15 -43
  375. package/scripts/josh/file-map-stamp.ts +49 -16
  376. package/scripts/josh/hook-decision.ts +32 -20
  377. package/scripts/josh/josh-command-map.ts +4 -1
  378. package/scripts/josh/josh-command-types.ts +12 -6
  379. package/scripts/josh/josh-commands-agent-hooks.ts +83 -0
  380. package/scripts/josh/josh-commands-ai.ts +157 -158
  381. package/scripts/josh/josh-commands-backlog.ts +82 -16
  382. package/scripts/josh/josh-commands-clone.ts +1 -0
  383. package/scripts/josh/josh-commands-development.ts +111 -71
  384. package/scripts/josh/josh-commands-document.ts +43 -1
  385. package/scripts/josh/josh-commands-epic.ts +171 -0
  386. package/scripts/josh/josh-commands-hooks.ts +25 -2
  387. package/scripts/josh/josh-commands-issue-write.ts +181 -0
  388. package/scripts/josh/josh-commands-issue.ts +124 -24
  389. package/scripts/josh/josh-commands-lane.ts +103 -2
  390. package/scripts/josh/josh-commands-lint.ts +19 -8
  391. package/scripts/josh/josh-commands-maintenance.ts +112 -4
  392. package/scripts/josh/josh-commands-pause.ts +29 -0
  393. package/scripts/josh/josh-commands-progress.ts +87 -0
  394. package/scripts/josh/josh-commands-project.ts +138 -9
  395. package/scripts/josh/josh-commands-review.ts +124 -0
  396. package/scripts/josh/josh-commands-run.ts +211 -23
  397. package/scripts/josh/josh-commands-ship.ts +169 -0
  398. package/scripts/josh/josh-commands-split.ts +9 -0
  399. package/scripts/josh/josh-commands-versioning.ts +49 -2
  400. package/scripts/josh/josh-commands-workflow.ts +144 -6
  401. package/scripts/josh/josh-logic.ts +6 -13
  402. package/scripts/josh/package-directory.ts +2 -4
  403. package/scripts/josh/process-identity.ts +13 -4
  404. package/scripts/josh/session-language-cli.ts +4 -8
  405. package/scripts/josh/session-language-main.ts +13 -0
  406. package/scripts/josh/session-language.ts +6 -1
  407. package/scripts/josh/shared-cache.ts +90 -0
  408. package/scripts/josh/stamp-file.ts +9 -15
  409. package/scripts/lane/lane-await.ts +51 -12
  410. package/scripts/lane/lane-cache.ts +5 -30
  411. package/scripts/lane/lane-capacity.ts +14 -23
  412. package/scripts/lane/lane-check-stats.ts +62 -21
  413. package/scripts/lane/lane-child-invocation.ts +8 -0
  414. package/scripts/lane/lane-cli.ts +15 -5
  415. package/scripts/lane/lane-close.ts +86 -18
  416. package/scripts/lane/lane-core-wait-stats.ts +66 -0
  417. package/scripts/lane/lane-dispatch.ts +24 -3
  418. package/scripts/lane/lane-gap-stats.ts +156 -0
  419. package/scripts/lane/lane-handoff.ts +69 -1
  420. package/scripts/lane/lane-held-stats.ts +129 -0
  421. package/scripts/lane/lane-install.ts +4 -11
  422. package/scripts/lane/lane-launch-cli.ts +0 -9
  423. package/scripts/lane/lane-launch-main.ts +12 -0
  424. package/scripts/lane/lane-ledger-schema.ts +266 -0
  425. package/scripts/lane/lane-ledger.ts +92 -123
  426. package/scripts/lane/lane-limit-cli.ts +12 -1
  427. package/scripts/lane/lane-measure-cli.ts +57 -11
  428. package/scripts/lane/lane-open.ts +9 -1
  429. package/scripts/lane/lane-parked.ts +3 -3
  430. package/scripts/lane/lane-pause-cli.ts +130 -0
  431. package/scripts/lane/lane-pause.ts +158 -0
  432. package/scripts/lane/lane-process-table.ts +166 -0
  433. package/scripts/lane/lane-reap-settle.ts +124 -0
  434. package/scripts/lane/lane-reap.ts +50 -15
  435. package/scripts/lane/lane-registry.ts +24 -3
  436. package/scripts/lane/lane-residents.ts +162 -0
  437. package/scripts/lane/lane-restart.ts +22 -2
  438. package/scripts/lane/lane-round-two-stats.ts +49 -0
  439. package/scripts/lane/lane-sampler.ts +4 -0
  440. package/scripts/lane/lane-session-action.ts +19 -5
  441. package/scripts/lane/lane-session-broker.ts +102 -21
  442. package/scripts/lane/lane-snapshot-trace.ts +84 -0
  443. package/scripts/lane/lane-spans.ts +51 -0
  444. package/scripts/lane/lane-spent.ts +6 -3
  445. package/scripts/lane/lane-stage-stats.ts +7 -2
  446. package/scripts/lane/lane-state.ts +302 -0
  447. package/scripts/lane/lane-stats.ts +58 -4
  448. package/scripts/lane/lane-stop-stats.ts +113 -37
  449. package/scripts/lane/lane-test-related-stats.ts +127 -0
  450. package/scripts/lane/lane-transcript-calls.ts +145 -0
  451. package/scripts/lane/lane-transcript-stats.ts +168 -0
  452. package/scripts/lane/lane-vacant.ts +13 -3
  453. package/scripts/lane/lane-withdraw-cli.ts +5 -4
  454. package/scripts/lane/lane-withdraw.ts +50 -49
  455. package/scripts/lane/process-directories.ts +70 -0
  456. package/scripts/lane/process-lane-marks.ts +94 -0
  457. package/scripts/lib/atomic-write.ts +62 -0
  458. package/scripts/lib/buffered-process.ts +12 -5
  459. package/scripts/lib/cli-flags.ts +53 -0
  460. package/scripts/lib/figure-format.ts +63 -0
  461. package/scripts/lib/json-value.ts +9 -1
  462. package/scripts/lib/package-manifest.ts +35 -0
  463. package/scripts/lib/read-file.ts +3 -1
  464. package/scripts/lib/stamped-memo.ts +63 -0
  465. package/scripts/lib/stdout-on-stderr.ts +24 -0
  466. package/scripts/lib/timeouts.ts +9 -0
  467. package/scripts/lib/transcript-record.ts +91 -0
  468. package/scripts/lines/effective-limit.ts +1 -1
  469. package/scripts/lint/eslint-cache-dependencies.ts +145 -0
  470. package/scripts/lint/eslint-daemon.ts +265 -0
  471. package/scripts/lint/format.ts +11 -2
  472. package/scripts/lint/import-graph.ts +279 -0
  473. package/scripts/lint/lint-gate-scope.ts +102 -0
  474. package/scripts/lint/lint-parallel-main.ts +19 -0
  475. package/scripts/lint/lint-parallel.ts +62 -30
  476. package/scripts/lint/lint-related-scope.ts +30 -24
  477. package/scripts/lint/lint-related.ts +38 -6
  478. package/scripts/notify/confirmation-options.ts +1 -2
  479. package/scripts/notify/telegram-notify.ts +20 -20
  480. package/scripts/notify/telegram-test-logic.ts +0 -1
  481. package/scripts/notify/telegram-test-main.ts +8 -0
  482. package/scripts/notify/telegram-test.ts +2 -6
  483. package/scripts/observations/observation-ledger.ts +13 -0
  484. package/scripts/observations/observations-flush-landing.ts +5 -3
  485. package/scripts/observations/observations-flush.ts +6 -1
  486. package/scripts/overrides/overrides-check.ts +2 -5
  487. package/scripts/overrides/overrides-files.ts +2 -1
  488. package/scripts/overrides/overrides-logic.ts +3 -6
  489. package/scripts/package/verify-optional-eslint-install.ts +8 -6
  490. package/scripts/propagate/propagate-publish.ts +2 -7
  491. package/scripts/propagate/propagate-targets.ts +4 -12
  492. package/scripts/refactor/import-graph.ts +9 -7
  493. package/scripts/release/github-release-runs.ts +17 -6
  494. package/scripts/release/release-approval-prune.ts +18 -0
  495. package/scripts/release/release-history.ts +1 -3
  496. package/scripts/release/release-progress.ts +42 -22
  497. package/scripts/release/release-publish-run.ts +39 -0
  498. package/scripts/release/release-publish.ts +6 -6
  499. package/scripts/release/release-scope-cli.ts +0 -10
  500. package/scripts/release/release-scope-main.ts +12 -0
  501. package/scripts/repo/repo-setting.ts +3 -6
  502. package/scripts/repo/required-checks-logic.ts +6 -15
  503. package/scripts/report/report-format-reference.ts +2 -0
  504. package/scripts/report/report-labels.ts +155 -0
  505. package/scripts/report/report-lint-cli.ts +3 -0
  506. package/scripts/report/report-lint.ts +85 -110
  507. package/scripts/report/report-template-cli.ts +59 -0
  508. package/scripts/report/report-template.ts +112 -0
  509. package/scripts/review/acceptance-map.ts +1 -0
  510. package/scripts/review/removed-tests-check.ts +86 -0
  511. package/scripts/review/removed-tests.ts +149 -0
  512. package/scripts/review/review-brief-cli.ts +81 -15
  513. package/scripts/review/review-brief-main.ts +12 -0
  514. package/scripts/review/review-brief.ts +31 -3
  515. package/scripts/review/review-code-tree.ts +10 -6
  516. package/scripts/review/review-comment-round.ts +26 -8
  517. package/scripts/review/review-finding-ledger.ts +30 -15
  518. package/scripts/review/review-interaction.ts +94 -0
  519. package/scripts/review/review-readers-scan.ts +163 -0
  520. package/scripts/review/review-record-cli.ts +69 -30
  521. package/scripts/review/review-record-main.ts +12 -0
  522. package/scripts/review/review-round-one-blobs.ts +221 -0
  523. package/scripts/review/review-round2-cli.ts +49 -12
  524. package/scripts/review/review-round2.ts +80 -12
  525. package/scripts/review/review-stamps.ts +19 -1
  526. package/scripts/review/review-stop-log.ts +96 -0
  527. package/scripts/review/review-stops-cli.ts +85 -0
  528. package/scripts/review/review-tree.ts +6 -17
  529. package/scripts/review/review-untouched-readers.ts +146 -0
  530. package/scripts/review/test-titles.ts +118 -0
  531. package/scripts/rules/agent-model.ts +8 -0
  532. package/scripts/rules/bash-triggers.ts +46 -3
  533. package/scripts/rules/decision-oracle-batch.ts +9 -1
  534. package/scripts/rules/decision-oracle.ts +2 -2
  535. package/scripts/rules/delivered-rules.ts +80 -2
  536. package/scripts/rules/destructive-command.ts +8 -1
  537. package/scripts/rules/direct-filing.ts +10 -2
  538. package/scripts/rules/direct-issue-comment.ts +117 -0
  539. package/scripts/rules/direct-pr-create.ts +69 -3
  540. package/scripts/rules/early-heartbeat.ts +2 -1
  541. package/scripts/rules/file-body.ts +7 -0
  542. package/scripts/rules/filing-cap.ts +7 -0
  543. package/scripts/rules/git-argv.ts +72 -14
  544. package/scripts/rules/git-force.ts +12 -2
  545. package/scripts/rules/guard-remedy.ts +4 -0
  546. package/scripts/rules/implementation-cut-verdict.ts +1 -1
  547. package/scripts/rules/implementation-cut.ts +11 -3
  548. package/scripts/rules/index-guard.ts +8 -1
  549. package/scripts/rules/issue-comments.ts +9 -1
  550. package/scripts/rules/josh-git-bare.ts +7 -0
  551. package/scripts/rules/lane-background.ts +67 -25
  552. package/scripts/rules/lane-carry-conflict.ts +6 -0
  553. package/scripts/rules/lane-direct-tool.ts +74 -0
  554. package/scripts/rules/lane-interactive-ask.ts +9 -2
  555. package/scripts/rules/lane-park.ts +45 -23
  556. package/scripts/rules/lane-split-park.ts +10 -2
  557. package/scripts/rules/lane-switch-main.ts +7 -0
  558. package/scripts/rules/oracle-consulted.ts +10 -0
  559. package/scripts/rules/oracle-firing.ts +1 -0
  560. package/scripts/rules/permission-guards.ts +3 -0
  561. package/scripts/rules/piped-verification.ts +1 -1
  562. package/scripts/rules/poll-loop.ts +7 -0
  563. package/scripts/rules/pr-merge.ts +123 -0
  564. package/scripts/rules/protected-files.ts +32 -5
  565. package/scripts/rules/raw-field-body.ts +6 -0
  566. package/scripts/rules/rule-body-guard.ts +8 -0
  567. package/scripts/rules/rule-list.ts +9 -28
  568. package/scripts/rules/rule-value-cache.ts +4 -9
  569. package/scripts/rules/rule-value-cli.ts +51 -32
  570. package/scripts/rules/rule-value.ts +1 -1
  571. package/scripts/rules/shell-segments.ts +35 -0
  572. package/scripts/rules/stop-rule-rows.ts +64 -0
  573. package/scripts/rules/stop-rules.ts +3 -4
  574. package/scripts/rules/test-declared-commit.ts +11 -1
  575. package/scripts/rules/third-party-write.ts +7 -0
  576. package/scripts/rules/timed-rerun.ts +69 -0
  577. package/scripts/rules/worktree-guard.ts +13 -3
  578. package/scripts/run/board/run-board-app-name.ts +23 -0
  579. package/scripts/run/board/run-board-cli.ts +65 -32
  580. package/scripts/run/board/run-board-earlier.ts +94 -0
  581. package/scripts/run/board/run-board-ending-reason.ts +67 -0
  582. package/scripts/run/board/run-board-estimate-schedule.ts +103 -0
  583. package/scripts/run/board/run-board-estimate.ts +98 -0
  584. package/scripts/run/board/run-board-fit.ts +153 -36
  585. package/scripts/run/board/run-board-fold.ts +123 -0
  586. package/scripts/run/board/run-board-fresh.ts +2 -2
  587. package/scripts/run/board/run-board-gather-live.ts +29 -0
  588. package/scripts/run/board/run-board-gather-thread.ts +189 -0
  589. package/scripts/run/board/run-board-gather-worker.ts +29 -0
  590. package/scripts/run/board/run-board-gather.ts +187 -0
  591. package/scripts/run/board/run-board-github.ts +118 -38
  592. package/scripts/run/board/run-board-header.ts +82 -20
  593. package/scripts/run/board/run-board-keys.ts +58 -0
  594. package/scripts/run/board/run-board-kind.ts +20 -6
  595. package/scripts/run/board/run-board-labels.ts +116 -71
  596. package/scripts/run/board/run-board-lane-state.ts +109 -0
  597. package/scripts/run/board/run-board-lane-time.ts +122 -0
  598. package/scripts/run/board/run-board-layout.ts +239 -60
  599. package/scripts/run/board/run-board-length.ts +52 -0
  600. package/scripts/run/board/run-board-machine.ts +8 -4
  601. package/scripts/run/board/run-board-main.ts +12 -0
  602. package/scripts/run/board/run-board-notes.ts +52 -31
  603. package/scripts/run/board/run-board-now.ts +1 -1
  604. package/scripts/run/board/run-board-operation.ts +15 -33
  605. package/scripts/run/board/run-board-phase.ts +1 -1
  606. package/scripts/run/board/run-board-plan-shared.ts +115 -0
  607. package/scripts/run/board/run-board-plan.ts +55 -3
  608. package/scripts/run/board/run-board-planning.ts +45 -0
  609. package/scripts/run/board/run-board-priority.ts +44 -0
  610. package/scripts/run/board/run-board-process-groups.ts +195 -0
  611. package/scripts/run/board/run-board-read.ts +151 -27
  612. package/scripts/run/board/run-board-reason.ts +235 -51
  613. package/scripts/run/board/run-board-released.ts +35 -0
  614. package/scripts/run/board/run-board-render-checks.ts +39 -5
  615. package/scripts/run/board/run-board-render-condition.ts +96 -0
  616. package/scripts/run/board/run-board-render-drawn.ts +67 -0
  617. package/scripts/run/board/run-board-render-foot.ts +59 -0
  618. package/scripts/run/board/run-board-render-icon.ts +35 -0
  619. package/scripts/run/board/run-board-render-lanes.ts +145 -0
  620. package/scripts/run/board/run-board-render-lead.ts +80 -0
  621. package/scripts/run/board/run-board-render-legend.ts +117 -48
  622. package/scripts/run/board/run-board-render-notes.ts +156 -29
  623. package/scripts/run/board/run-board-render-processes.ts +196 -0
  624. package/scripts/run/board/run-board-render-section.ts +119 -0
  625. package/scripts/run/board/run-board-render-slot.ts +3 -36
  626. package/scripts/run/board/run-board-render-tail.ts +115 -48
  627. package/scripts/run/board/run-board-render-time.ts +56 -0
  628. package/scripts/run/board/run-board-render-title.ts +117 -24
  629. package/scripts/run/board/run-board-render-waits.ts +104 -20
  630. package/scripts/run/board/run-board-render.ts +207 -265
  631. package/scripts/run/board/run-board-roots.ts +54 -0
  632. package/scripts/run/board/run-board-row-yield.ts +9 -4
  633. package/scripts/run/board/run-board-setup.ts +1 -12
  634. package/scripts/run/board/run-board-snapshot.ts +111 -0
  635. package/scripts/run/board/run-board-spin.ts +2 -2
  636. package/scripts/run/board/run-board-state.ts +22 -33
  637. package/scripts/run/board/run-board-status.ts +147 -71
  638. package/scripts/run/board/run-board-thanks-read.ts +2 -2
  639. package/scripts/run/board/run-board-tick.ts +122 -107
  640. package/scripts/run/board/run-board-usage-board.ts +78 -0
  641. package/scripts/run/board/run-board-usage-lanes.ts +113 -0
  642. package/scripts/run/board/run-board-usage-listing.ts +93 -0
  643. package/scripts/run/board/run-board-usage-read.ts +120 -150
  644. package/scripts/run/board/run-board-usage-rusage.ts +19 -7
  645. package/scripts/run/board/run-board-usage-text.ts +139 -51
  646. package/scripts/run/board/run-board-usage-top.ts +102 -0
  647. package/scripts/run/board/run-board-usage.ts +89 -72
  648. package/scripts/run/board/run-board-usual.ts +20 -9
  649. package/scripts/run/carry/run-carry-args.ts +4 -7
  650. package/scripts/run/carry/run-carry-conversation.ts +1 -1
  651. package/scripts/run/carry/run-carry.ts +9 -4
  652. package/scripts/run/cut/run-cut-handoff.ts +2 -2
  653. package/scripts/run/event/run-event-cli.ts +1 -5
  654. package/scripts/run/event/run-event-filed.ts +12 -6
  655. package/scripts/run/event/run-event-follow.ts +2 -3
  656. package/scripts/run/event/run-event-render.ts +6 -10
  657. package/scripts/run/event/run-event-scope.ts +2 -2
  658. package/scripts/run/event/run-event-stream-emit.ts +82 -22
  659. package/scripts/run/event/run-event-stream.ts +34 -8
  660. package/scripts/run/hold/run-hold-adopt.ts +65 -0
  661. package/scripts/run/hold/run-hold-cli.ts +93 -22
  662. package/scripts/run/hold/run-hold-main.ts +12 -0
  663. package/scripts/run/hold/run-hold-member.ts +37 -0
  664. package/scripts/run/hold/run-stop-notify.ts +183 -0
  665. package/scripts/run/merge/run-merge-auth.ts +31 -0
  666. package/scripts/run/merge/run-merge-cli.ts +62 -48
  667. package/scripts/run/merge/run-merge-close.ts +74 -0
  668. package/scripts/run/merge/run-merge-collect.ts +6 -13
  669. package/scripts/run/merge/run-merge-driver.ts +71 -0
  670. package/scripts/run/merge/run-merge-main.ts +12 -0
  671. package/scripts/run/merge/run-merge-outcome.ts +23 -0
  672. package/scripts/run/merge/run-merge-restart.ts +39 -0
  673. package/scripts/run/merge/run-merge-ship.ts +20 -4
  674. package/scripts/run/merge/run-merge-signals.ts +33 -9
  675. package/scripts/run/merge/run-merge-steps.ts +120 -85
  676. package/scripts/run/merge/run-merge.ts +38 -37
  677. package/scripts/run/park/run-park-cli.ts +91 -0
  678. package/scripts/run/park/run-park.ts +88 -0
  679. package/scripts/run/park/run-stalled.ts +68 -0
  680. package/scripts/run/pause/run-pause-cli.ts +73 -0
  681. package/scripts/run/pause/run-pause.ts +251 -0
  682. package/scripts/run/progress/run-progress-cli.ts +4 -12
  683. package/scripts/run/progress/run-progress-clock.ts +1 -1
  684. package/scripts/run/progress/run-progress-config.ts +6 -14
  685. package/scripts/run/progress/run-progress-main.ts +12 -0
  686. package/scripts/run/progress/run-progress.ts +1 -4
  687. package/scripts/run/review/run-review.ts +2 -1
  688. package/scripts/run/run-ending.ts +1 -0
  689. package/scripts/run/run-invocation.ts +5 -6
  690. package/scripts/run/run-liveness-cli.ts +6 -8
  691. package/scripts/run/run-liveness.ts +60 -29
  692. package/scripts/run/run-next.ts +1 -1
  693. package/scripts/run/run-parent-cut-hook.ts +2 -2
  694. package/scripts/run/run-preflight.ts +18 -3
  695. package/scripts/run/run-prep-cli.ts +1 -10
  696. package/scripts/run/run-prep-locate.ts +7 -50
  697. package/scripts/run/run-prep-main.ts +12 -0
  698. package/scripts/run/run-prep.ts +6 -0
  699. package/scripts/run/run-report-cli.ts +101 -13
  700. package/scripts/run/run-report-handoff.ts +114 -0
  701. package/scripts/run/run-step.ts +1 -1
  702. package/scripts/run/run-stranded-detect.ts +13 -0
  703. package/scripts/run/run-watcher-guard-cli.ts +1 -1
  704. package/scripts/run/run-watcher-guard.ts +1 -1
  705. package/scripts/run/ship/run-ship-args.ts +121 -0
  706. package/scripts/run/ship/run-ship-body-draft.ts +110 -0
  707. package/scripts/run/ship/run-ship-cli.ts +63 -140
  708. package/scripts/run/ship/run-ship-detach.ts +19 -8
  709. package/scripts/run/ship/run-ship-infra-retry.ts +59 -0
  710. package/scripts/run/ship/run-ship-next.ts +18 -2
  711. package/scripts/run/ship/run-ship-overlap.ts +42 -5
  712. package/scripts/run/ship/run-ship-place.ts +96 -0
  713. package/scripts/run/ship/run-ship-pre-detach-timed.ts +43 -0
  714. package/scripts/run/ship/run-ship-pre-detach.ts +81 -24
  715. package/scripts/run/ship/run-ship-preflight.ts +137 -32
  716. package/scripts/run/ship/run-ship-probe.ts +11 -3
  717. package/scripts/run/ship/run-ship-relaunch-cap.ts +70 -0
  718. package/scripts/run/ship/run-ship-removed-rows.ts +61 -0
  719. package/scripts/run/ship/run-ship-return.ts +107 -23
  720. package/scripts/run/ship/run-ship-review-steps.ts +105 -151
  721. package/scripts/run/ship/run-ship-review.ts +73 -6
  722. package/scripts/run/ship/run-ship-reviewer.ts +207 -0
  723. package/scripts/run/ship/run-ship-stage.ts +55 -6
  724. package/scripts/run/ship/run-ship-steps.ts +46 -15
  725. package/scripts/run/ship/run-ship-stop-cause.ts +135 -0
  726. package/scripts/run/ship/run-ship-stop-text.ts +11 -6
  727. package/scripts/run/ship/run-ship-sync.ts +43 -6
  728. package/scripts/run/ship/run-ship.ts +30 -2
  729. package/scripts/run/tidy/run-tidy-cli.ts +0 -4
  730. package/scripts/run/tidy/run-tidy-lanes.ts +3 -0
  731. package/scripts/run/tidy/run-tidy-main.ts +8 -0
  732. package/scripts/run/wake/run-wake-cli.ts +119 -100
  733. package/scripts/run/wake/run-wake-code.ts +83 -0
  734. package/scripts/run/wake/run-wake-driver.ts +19 -8
  735. package/scripts/run/wake/run-wake-loop.ts +34 -3
  736. package/scripts/run/wake/run-wake-main.ts +13 -0
  737. package/scripts/run/wake/run-wake-ports.ts +90 -0
  738. package/scripts/run/wake/run-wake-takeover.ts +66 -0
  739. package/scripts/run/wake/run-wake.ts +2 -1
  740. package/scripts/safe-chain/pack-hook.ts +2 -2
  741. package/scripts/safe-chain/preinstall-command.ts +2 -1
  742. package/scripts/safe-chain/project-config.ts +3 -9
  743. package/scripts/security/security-audit-main.ts +8 -0
  744. package/scripts/security/security-audit-provision-logic.ts +0 -11
  745. package/scripts/security/security-audit-provision-main.ts +12 -0
  746. package/scripts/security/security-audit-provision.ts +11 -26
  747. package/scripts/security/security-audit.ts +6 -7
  748. package/scripts/self-sync-guard/self-sync-guard-logic.ts +6 -13
  749. package/scripts/split/split-assess-cli.ts +2 -2
  750. package/scripts/split/split-assess.ts +15 -0
  751. package/scripts/split/split-measure.ts +65 -0
  752. package/scripts/sync/claude-settings-merge.ts +8 -15
  753. package/scripts/sync/directory-copy-guard.ts +4 -9
  754. package/scripts/sync/file-content.ts +78 -8
  755. package/scripts/sync/sync-ai-files.ts +3 -5
  756. package/scripts/sync/sync-configs.ts +11 -23
  757. package/scripts/sync/sync-hook-safety.ts +4 -10
  758. package/scripts/sync/sync-main.ts +11 -0
  759. package/scripts/sync/sync.ts +25 -37
  760. package/scripts/test/test-declared-changed.ts +2 -2
  761. package/scripts/test/test-declared.ts +1 -1
  762. package/scripts/test/test-e2e-guard.ts +25 -1
  763. package/scripts/test/test-e2e-stamp.ts +38 -0
  764. package/scripts/test/test-pinned-logic.ts +145 -0
  765. package/scripts/test/test-pinned-main.ts +78 -0
  766. package/scripts/test/test-pinned.ts +100 -0
  767. package/scripts/test/test-read-map.ts +264 -0
  768. package/scripts/test/test-read-recording.ts +91 -0
  769. package/scripts/test/test-read-trace.ts +148 -0
  770. package/scripts/test/test-red-main.ts +12 -0
  771. package/scripts/test/test-red.ts +12 -30
  772. package/scripts/test/test-related-main.ts +18 -0
  773. package/scripts/test/test-related-record.ts +119 -0
  774. package/scripts/test/test-related-scope.ts +229 -43
  775. package/scripts/test/test-related.ts +300 -22
  776. package/scripts/test/test-unit-guard-main.ts +15 -0
  777. package/scripts/test/test-unit-guard.ts +42 -24
  778. package/scripts/test/unit-count-file.ts +37 -0
  779. package/scripts/test/unit-run-marker.ts +162 -0
  780. package/scripts/test/unit-setup-files.ts +51 -0
  781. package/scripts/test/unit-worker-share.ts +61 -149
  782. package/scripts/test/whole-suite-files.ts +63 -0
  783. package/scripts/time-runtime/time-background.ts +20 -2
  784. package/scripts/time-runtime/time-bundles.ts +4 -3
  785. package/scripts/time-runtime/time-density-hook.ts +8 -6
  786. package/scripts/time-runtime/time-followup-stage.ts +1 -3
  787. package/scripts/time-runtime/time-format.ts +5 -28
  788. package/scripts/time-runtime/time-markers.ts +10 -1
  789. package/scripts/time-runtime/time-shell.ts +97 -10
  790. package/scripts/time-runtime/time-transcript-line.ts +49 -62
  791. package/scripts/uninstall/uninstall.ts +1 -1
  792. package/scripts/version/bump-version-main.ts +12 -0
  793. package/scripts/version/bump-version.ts +25 -25
  794. package/scripts/version/effective-upstream.ts +6 -12
  795. package/scripts/version/latest-corepack.ts +17 -32
  796. package/scripts/version/latest-if-required-cli.ts +93 -0
  797. package/scripts/version/latest-lane-guard-main.ts +8 -0
  798. package/scripts/version/latest-lane-guard.ts +0 -4
  799. package/scripts/version/latest-scope-cli.ts +0 -9
  800. package/scripts/version/latest-scope-main.ts +12 -0
  801. package/scripts/version/latest-update.ts +5 -5
  802. package/scripts/version/npm-registry.ts +44 -6
  803. package/scripts/version/publishable-range-check.ts +5 -16
  804. package/scripts/version/release-age.ts +1 -1
  805. package/scripts/version/release-hold.ts +1 -1
  806. package/scripts/version/release-window.ts +38 -0
  807. package/scripts/version/running-binary.ts +1 -1
  808. package/scripts/version/safe-chain-version-update.ts +3 -8
  809. package/scripts/version/version-targets.ts +6 -28
  810. package/templates/dependabot.yml +29 -0
  811. package/templates/gitignore +4 -1
  812. package/templates/pnpm-workspace.basic.yaml +1 -1
  813. package/templates/sonar-project.properties +3 -2
  814. package/templates/workflows/ci.yml +12 -4
  815. package/templates/workflows/github-release.yml +4 -0
  816. package/tsconfig.sonar.json +1 -1
  817. package/.ncurc.json +0 -3
  818. package/dist/hooks/batch-guard.js +0 -29
  819. package/dist/hooks/chunk-4KKD2UTK.js +0 -66
  820. package/dist/hooks/chunk-6TS2JD6D.js +0 -237
  821. package/dist/hooks/chunk-7DSBJVFH.js +0 -50
  822. package/dist/hooks/chunk-A65Y4YOR.js +0 -79
  823. package/dist/hooks/chunk-CDY4NFQG.js +0 -15
  824. package/dist/hooks/chunk-EFXE6C37.js +0 -81
  825. package/dist/hooks/chunk-GP4IEC4O.js +0 -20
  826. package/dist/hooks/chunk-JP45SOCJ.js +0 -56
  827. package/dist/hooks/chunk-LAOV7NLM.js +0 -45
  828. package/dist/hooks/chunk-M4HGZV7U.js +0 -83
  829. package/dist/hooks/chunk-PF2NZL2A.js +0 -131
  830. package/dist/hooks/chunk-PTICX4OL.js +0 -358
  831. package/dist/hooks/chunk-RT27QRJW.js +0 -6247
  832. package/dist/hooks/chunk-SYOTDYCI.js +0 -3533
  833. package/dist/hooks/chunk-UPUZF3AN.js +0 -279
  834. package/dist/hooks/chunk-WK6SMBIC.js +0 -3180
  835. package/dist/hooks/duplicate-read-guard.js +0 -30
  836. package/dist/hooks/investigation-guard.js +0 -29
  837. package/scripts/backlog/backlog-stalled-cli.ts +0 -30
  838. package/scripts/cost-runtime/cost-format.ts +0 -29
  839. package/scripts/init/basic-path-migration.ts +0 -24
  840. package/scripts/issue/issue-backlinks-cli.ts +0 -93
  841. package/scripts/josh/josh-commands-guard.ts +0 -38
  842. package/scripts/josh/josh-usage-automation.ts +0 -121
  843. package/scripts/josh/josh-usage-backlog.ts +0 -180
  844. package/scripts/josh/josh-usage-developer.ts +0 -230
  845. package/scripts/josh/josh-usage-hooks.ts +0 -38
  846. package/scripts/josh/josh-usage-issue.ts +0 -205
  847. package/scripts/josh/josh-usage-review.ts +0 -101
  848. package/scripts/josh/josh-usage-run.ts +0 -252
  849. package/scripts/josh/josh-usage-session.ts +0 -238
  850. package/scripts/josh/josh-usage-workflow.ts +0 -212
  851. package/scripts/lint/cross-file-recheck.ts +0 -155
  852. package/scripts/registry-migration/migrate-logic.ts +0 -237
  853. package/scripts/registry-migration/migrate.ts +0 -292
  854. package/scripts/registry-migration/user-npmrc.ts +0 -15
  855. package/scripts/rules/rule-guard.ts +0 -23
  856. package/scripts/rules/rule-registry-rows.ts +0 -292
  857. package/scripts/rules/rule-registry.ts +0 -112
  858. package/scripts/run/run-stranded-cli.ts +0 -27
@@ -1,5 +1,15 @@
1
1
  import { OPTIONAL_ENV_FILE_FLAGS, type CommandEntry } from './josh-command-types'
2
2
 
3
+ const PR_TITLE = '"PR title #N"'
4
+ const BODY_FILE_NOTE =
5
+ '(`-` reads stdin); use this whenever the body carries a backtick or `$`. Passing both forms is refused.'
6
+ const ISSUE_URL = '--issue-url "https://..."'
7
+ const REVIEW_ISSUE = '--issue 2325'
8
+ const CHECK = '--check'
9
+ const YES = '-y'
10
+ const SKIP_COMMIT = '--skip-commit'
11
+ const SKIP_PUSH = '--skip-push'
12
+
3
13
  const GIT_WORKFLOW_SCRIPT = 'scripts/git/git-workflow.ts'
4
14
  const GIT_MESSAGE_ARGUMENTS = '[-y] <message>'
5
15
 
@@ -10,6 +20,28 @@ const WORKFLOW_COMMANDS: Record<string, CommandEntry> = {
10
20
  description: 'Git workflow helper',
11
21
  category: 'Workflow',
12
22
  reference: [GIT_MESSAGE_ARGUMENTS, 'developer', ['git', 'network']],
23
+ usage: {
24
+ examples: [
25
+ { arguments: '', note: 'interactive' },
26
+ { arguments: YES, note: 'unattended (no TTY required)' },
27
+ { arguments: '-y "title"', note: 'set commit message prefix' },
28
+ { arguments: '-y "<title> #<N>"', note: 'follow-up commit on the same branch' },
29
+ {
30
+ arguments: '-y --skip-commit --skip-push',
31
+ note: 'open the PR without committing/pushing',
32
+ },
33
+ ],
34
+ flags: [
35
+ {
36
+ names: [YES, '--yes'],
37
+ description: 'run non-interactively; works without a TTY (agent or CI shell).',
38
+ },
39
+ {
40
+ names: [SKIP_COMMIT, SKIP_PUSH],
41
+ description: 'recover/open a PR without a new commit or push.',
42
+ },
43
+ ],
44
+ },
13
45
  },
14
46
  pr: {
15
47
  script: GIT_WORKFLOW_SCRIPT,
@@ -18,7 +50,8 @@ const WORKFLOW_COMMANDS: Record<string, CommandEntry> = {
18
50
  // Not `GIT_MESSAGE_ARGUMENTS`: `-y` is already in the default arguments below, so advertising
19
51
  // it would document a flag that cannot change what this command does.
20
52
  reference: ['<message>', 'developer', ['network']],
21
- default_script_arguments: ['-y', '--skip-commit', '--skip-push'],
53
+ default_script_arguments: [YES, SKIP_COMMIT, SKIP_PUSH],
54
+ usage: { examples: [{ arguments: '', note: 'open the PR for the current <N>-<slug> branch' }] },
22
55
  },
23
56
  // **The optional form, on both**. The mandatory `--env-file=.env` is resolved by node before the
24
57
  // script's first line: on a machine with no `.env` it dies as `.env: not found` with exit code 9,
@@ -41,9 +74,37 @@ const WORKFLOW_COMMANDS: Record<string, CommandEntry> = {
41
74
  ['git', 'network', 'notifications'],
42
75
  ],
43
76
  tsx_arguments: OPTIONAL_ENV_FILE_FLAGS,
77
+ usage: {
78
+ examples: [
79
+ { arguments: PR_TITLE, note: 'merges (default)' },
80
+ { arguments: String.raw`${PR_TITLE} --notify-message "Implemented X:\n- change 1"` },
81
+ { arguments: `${PR_TITLE} --notify-message-file completion.md` },
82
+ { arguments: `${PR_TITLE} --ai-review-ignore-reason "false positive"` },
83
+ { arguments: `${PR_TITLE} --no-merge`, note: 'do the work, leave the PR open' },
84
+ ],
85
+ flags: [
86
+ {
87
+ names: ['--no-merge'],
88
+ description:
89
+ 'do the follow-up work but do not merge; leaves the PR open (the only flag that stops the merge). `--merge` is a deprecated no-op. A PR already merged by hand skips the CI wait, the AI-review scan and the merge and runs only the post-merge tail; a completion report already on the Issue is not posted again.',
90
+ },
91
+ {
92
+ names: ['--notify-message'],
93
+ description: 'inline completion body; `\\n` expands to newlines.',
94
+ },
95
+ {
96
+ names: ['--notify-message-file'],
97
+ description: `read the completion body from a file ${BODY_FILE_NOTE}`,
98
+ },
99
+ {
100
+ names: ['--ai-review-ignore-reason'],
101
+ description: 'reason to dismiss an AI-review finding.',
102
+ },
103
+ ],
104
+ },
44
105
  },
45
106
  notify: {
46
- script: 'scripts/notify/telegram-test.ts',
107
+ script: 'scripts/notify/telegram-test-main.ts',
47
108
  description: 'Send Telegram notification',
48
109
  category: 'Workflow',
49
110
  reference: [
@@ -52,6 +113,38 @@ const WORKFLOW_COMMANDS: Record<string, CommandEntry> = {
52
113
  ['notifications'],
53
114
  ],
54
115
  tsx_arguments: OPTIONAL_ENV_FILE_FLAGS,
116
+ usage: {
117
+ examples: [
118
+ {
119
+ arguments: String.raw`--task-type planning ${ISSUE_URL} --body="- bullet 1\n- bullet 2"`,
120
+ },
121
+ {
122
+ arguments: `--task-type confirmation ${ISSUE_URL} --body-file r.md --recommended "Go" --alternative "Wait"`,
123
+ },
124
+ ],
125
+ flags: [
126
+ {
127
+ names: ['--task-type'],
128
+ description:
129
+ 'one of `planning` 📋, `completion` ✅, `failure` ❌, `warning` ⚠️, `kickoff_retry` 🔄, `confirmation` ⏸️. Do not send `completion` or `warning` by hand — `josh followup` sends them.',
130
+ },
131
+ {
132
+ names: ['--body', "--body=$'…'"],
133
+ description: "inline body; use `--body=$'…'` when it starts with `-`.",
134
+ },
135
+ { names: ['--body-file'], description: `read the body from a file ${BODY_FILE_NOTE}` },
136
+ {
137
+ names: ['--repo-name', '--issue-url', '--pr-url'],
138
+ description:
139
+ 'header repository, resolved in that order, then the working directory. The issue title is read from `--issue-url`.',
140
+ },
141
+ {
142
+ names: ['--recommended', '--alternative'],
143
+ description:
144
+ 'the choices appended under `JOSH_SESSION_LANG` headings; `--recommended` is required for `confirmation`, `--alternative` is repeatable.',
145
+ },
146
+ ],
147
+ },
55
148
  },
56
149
  // One observation-ledger sighting: the key's count, the append and the second-sighting verdict,
57
150
  // which a run used to type as a `cat | grep -c` and judge by hand.
@@ -60,6 +153,21 @@ const WORKFLOW_COMMANDS: Record<string, CommandEntry> = {
60
153
  description: 'Record an observation sighting and answer whether it is now filed',
61
154
  category: 'Workflow',
62
155
  reference: ['<key> <depth> <where> <what> [--checkout <path>]', 'automation', ['files']],
156
+ usage: {
157
+ examples: [
158
+ { arguments: "flaky-e2e d1 'tests/e2e/login.test.ts' 'times out on CI only'" },
159
+ {
160
+ arguments: "flaky-e2e d1 'src/app.ts' 'fails there too' --checkout ~/Development/app",
161
+ note: "another repository's ledger",
162
+ },
163
+ ],
164
+ flags: [
165
+ {
166
+ names: ['--checkout <path>'],
167
+ description: "count and append in that repository's `.josh/observations/` instead.",
168
+ },
169
+ ],
170
+ },
63
171
  },
64
172
  // The observation ledger's commit path for the lines no run's own commit carried:
65
173
  // a lane's lines sit in the primary checkout, which
@@ -69,20 +177,46 @@ const WORKFLOW_COMMANDS: Record<string, CommandEntry> = {
69
177
  description: 'Commit the observation ledger as a pull request of its own, and merge it',
70
178
  category: 'Workflow',
71
179
  reference: ['', 'automation', ['git', 'network']],
180
+ usage: { examples: [{ arguments: '' }] },
72
181
  },
73
182
  // The one write path for a `/code-review` round's findings, plus the
74
183
  // `--check` gate `followup` runs before it merges. It appends a `- rf:`
75
184
  // line per finding — or one zero-finding line for a clean round — to the observation ledger, so
76
185
  // `observations:flush` commits them and the recurrence count survives the run.
77
186
  'review:record': {
78
- script: 'scripts/review/review-record-cli.ts',
187
+ script: 'scripts/review/review-record-main.ts',
79
188
  description: 'Record a review round’s findings, or check a round was recorded',
80
189
  category: 'Workflow',
81
190
  reference: [
82
- '--issue <N> [--comment] [<category>:<severity>:<file> ...] | --check --issue <N>',
191
+ '--issue <N> [--comment | --interaction] [<category>:<severity>:<file> ...] | --check [--interaction] --issue <N>',
83
192
  'automation',
84
193
  ['files', 'network'],
85
194
  ],
195
+ usage: {
196
+ examples: [
197
+ { arguments: `${REVIEW_ISSUE} bug-risks:medium:src/foo.ts:42 tests:low:a.test.ts` },
198
+ { arguments: REVIEW_ISSUE, note: 'a zero-finding round — records one `none` line' },
199
+ {
200
+ arguments: `${REVIEW_ISSUE} --comment`,
201
+ note: 'a round that passed after the PR opened — an Issue comment, no append',
202
+ },
203
+ { arguments: `${CHECK} ${REVIEW_ISSUE}`, note: 'the merge gate: was it recorded?' },
204
+ {
205
+ arguments: `${REVIEW_ISSUE} --interaction`,
206
+ note: 'the interaction review’s pass — a `- ri:` line',
207
+ },
208
+ ],
209
+ },
210
+ },
211
+ // The reader over the durable review stop log: each finding that stopped a ship, with its file:line
212
+ // and first sentence, so a period's stops are classified without reading ship logs.
213
+ 'review:stops': {
214
+ script: 'scripts/review/review-stops-cli.ts',
215
+ description:
216
+ 'List the review findings that stopped a josh ship over a period, by kind, file:line and first sentence',
217
+ category: 'Workflow',
218
+ reference: ['[--period <days>]', 'developer', ['none']],
219
+ usage: { examples: [{ arguments: '--period 30', note: 'the last 30 days (default 7)' }] },
86
220
  },
87
221
  // The reader over what `review:record` wrote: each recurring category’s
88
222
  // count, and the number of zero-finding rounds that distinguishes a quiet category from an unwatched one.
@@ -91,6 +225,7 @@ const WORKFLOW_COMMANDS: Record<string, CommandEntry> = {
91
225
  description: 'Count review findings by category from the observation ledger',
92
226
  category: 'Workflow',
93
227
  reference: ['', 'developer', ['files']],
228
+ usage: { examples: [{ arguments: '' }] },
94
229
  },
95
230
  // After a behavior-change Issue merges, re-run its declared baseline and print before/after; a value
96
231
  // that did not move appends a refuted-premise line to the observation ledger.
@@ -99,15 +234,17 @@ const WORKFLOW_COMMANDS: Record<string, CommandEntry> = {
99
234
  description: 'Re-run a merged issue’s baseline command and print the before/after pair',
100
235
  category: 'Workflow',
101
236
  reference: ['<issue-number>', 'automation', ['network', 'processes', 'files']],
237
+ usage: { examples: [{ arguments: '2212' }] },
102
238
  },
103
239
  // A script rather than an `sh -c` chain, because it has a precondition to enforce: run inside a
104
240
  // linked work tree it would hijack the default branch from every other one.
105
241
  'main:sync': {
106
- script: 'scripts/git/main-sync.ts',
242
+ script: 'scripts/git/main-sync-main.ts',
107
243
  description:
108
244
  'Checkout default branch, pull latest, and prune merged remote-gone branches (refuses inside a lane)',
109
245
  category: 'Workflow',
110
246
  reference: ['', 'developer', ['git', 'network']],
247
+ usage: { examples: [{ arguments: '' }] },
111
248
  },
112
249
  // A script rather than an `sh -c` chain, because the strategy has to be named rather than left to
113
250
  // the caller's git configuration: a bare `git pull` aborts with `Need to specify how to reconcile
@@ -118,10 +255,11 @@ const WORKFLOW_COMMANDS: Record<string, CommandEntry> = {
118
255
  // hooks — its regenerated catalog's commit runs them — which reserve themselves, and a weight here
119
256
  // would set the held mark they inherit, folding the parallel hook tools into this one place.
120
257
  'main:merge': {
121
- script: 'scripts/git/main-merge.ts',
258
+ script: 'scripts/git/main-merge-main.ts',
122
259
  description: 'Merge origin default branch into the current branch',
123
260
  category: 'Workflow',
124
261
  reference: ['', 'developer', ['git', 'network']],
262
+ usage: { examples: [{ arguments: '' }] },
125
263
  },
126
264
  }
127
265
  /* eslint-enable @typescript-eslint/naming-convention */
@@ -1,8 +1,9 @@
1
- import { existsSync, readFileSync } from 'node:fs'
1
+ import { existsSync } from 'node:fs'
2
2
  import path from 'node:path'
3
3
  import { fileURLToPath } from 'node:url'
4
4
  import { resolve_local_bin, resolve_package_bin } from '#scripts/build/local-bin'
5
5
  import { core_budget } from '#scripts/gate/core-budget'
6
+ import { package_manifest } from '#scripts/lib/package-manifest'
6
7
  import { package_version_schema } from '#scripts/lib/schemas'
7
8
  import { resolve_spawn_exit } from '#scripts/lib/spawn-exit'
8
9
  import { execaSync } from 'execa'
@@ -24,7 +25,6 @@ const COLUMN_WIDTH = 26
24
25
  const ALIAS_PAD_WIDTH = 2
25
26
  const TSX_BIN = 'tsx'
26
27
  const TSX_PACKAGE = 'tsx'
27
- const PACKAGE_JSON = 'package.json'
28
28
  // Not an exit code the shell ever sees: `josh.ts` reads it as "no such command" and answers with
29
29
  // the listing on stderr. It is named because `run_command` now reports through a promise, where a
30
30
  // bare `-1` is one step further from the check that reads it.
@@ -71,9 +71,7 @@ function resolve_tsx_runner(): TsxRunner {
71
71
  }
72
72
 
73
73
  function read_package_version(): string {
74
- const raw = readFileSync(path.join(PACKAGE_DIR, PACKAGE_JSON), 'utf8')
75
-
76
- return package_version_schema.parse(JSON.parse(raw)).version
74
+ return package_manifest.read_manifest(PACKAGE_DIR, package_version_schema).version
77
75
  }
78
76
 
79
77
  const HEADER = `josh v${read_package_version()} — Joshua Folkken's dev toolkit`
@@ -165,16 +163,11 @@ function format_unknown_command(cmd: string): string {
165
163
  return `Unknown command: ${cmd}.${hint} Run 'josh --help' for common commands or 'josh --all' for the full list.`
166
164
  }
167
165
 
168
- // A `.cmd` shim needs the win32 shell to be executable, but the node binary does not — and
169
- // running it through the shell would break on the spaces in a typical Windows install path.
170
- function should_use_shell(executable: string): boolean {
171
- return process.platform === 'win32' && executable !== process.execPath
172
- }
173
-
166
+ // No `shell` option on purpose: execa runs a Windows `.cmd` shim itself and escapes the arguments
167
+ // for cmd.exe, which the shell would receive unescaped.
174
168
  function spawn_script(tsx_executable: string, script_arguments: Array<string>): number {
175
169
  const result = execaSync(tsx_executable, script_arguments, {
176
170
  stdio: 'inherit',
177
- shell: should_use_shell(tsx_executable),
178
171
  reject: false,
179
172
  })
180
173
 
@@ -287,7 +280,7 @@ async function dispatch_entry(
287
280
  return await core_budget.with_command_reservation(
288
281
  weight,
289
282
  async () => await run_entry(entry, subcommand_arguments),
290
- { memory_mb: declared(entry.memory_mb), command },
283
+ { memory_mb: declared(entry.memory_mb), command, is_unit: entry.is_unit_claim },
291
284
  )
292
285
  }
293
286
 
@@ -1,8 +1,6 @@
1
1
  import { existsSync } from 'node:fs'
2
- import path from 'node:path'
3
2
  import { ancestor_directories } from '#scripts/lib/ancestor-directories'
4
-
5
- const PACKAGE_JSON = 'package.json'
3
+ import { package_manifest } from '#scripts/lib/package-manifest'
6
4
 
7
5
  // Resolve the kit package root by ascending to the nearest package.json. This works both
8
6
  // from the bundled dist/josh.js (one level under the root) and from the tsx source at
@@ -12,7 +10,7 @@ const PACKAGE_JSON = 'package.json'
12
10
  function find_package_directory(start_directory: string): string {
13
11
  return (
14
12
  ancestor_directories.nearest(start_directory, (directory) =>
15
- existsSync(path.join(directory, PACKAGE_JSON)),
13
+ existsSync(package_manifest.manifest_path(directory)),
16
14
  ) ?? start_directory
17
15
  )
18
16
  }
@@ -3,8 +3,8 @@ import { randomUUID } from 'node:crypto'
3
3
  import { readFileSync, rmSync } from 'node:fs'
4
4
  import { createServer, type Server } from 'node:net'
5
5
  import path from 'node:path'
6
+ import { PLATFORM_TEMP_ROOT } from '#scripts/josh/platform-temporary'
6
7
  import { PROBE_TIMEOUT_MS } from '#scripts/lib/timeouts'
7
- import { PLATFORM_TEMP_ROOT } from './platform-temporary'
8
8
 
9
9
  // Whether the process a record names is still the one that wrote it.
10
10
  //
@@ -30,7 +30,7 @@ import { PLATFORM_TEMP_ROOT } from './platform-temporary'
30
30
  // `Tue Sep 8 09:15:33 2026` in one shell and `Tue Sep 8 02:15:33 2026` in another that exported
31
31
  // `TZ=UTC` — and a writer and reader disagreeing about `TZ` would read a live process as a stranger.
32
32
  // That failure is worse than the one this module fixes, because it fires on a gate that really is
33
- // running: `unit-worker-share` would sweep the marker of a live run and put every suite back on the
33
+ // running: `unit-run-marker` would sweep the marker of a live run and put every suite back on the
34
34
  // whole machine, and `bench-guard` would clear the caches out from under a running gate. The probe
35
35
  // therefore pins `TZ` and `LC_ALL` rather than inheriting them.
36
36
 
@@ -237,11 +237,16 @@ function beacon_target(token: string): string | undefined {
237
237
  }
238
238
 
239
239
  // No status is a probe killed by its timeout or a signal — unknown, the same as its own timeout.
240
- function run_socket_probe(target: string): number | undefined {
240
+ // `kill_after_ms` is a parameter so a test can ask what the probe itself reports for a socket
241
+ // without a loaded machine's slow start turning the answer into the timeout's.
242
+ function run_socket_probe(
243
+ target: string,
244
+ kill_after_ms: number = PROBE_TIMEOUT_MS,
245
+ ): number | undefined {
241
246
  return (
242
247
  spawnSync(process.execPath, ['-e', SOCKET_PROBE_SOURCE, target], {
243
248
  stdio: 'ignore',
244
- timeout: PROBE_TIMEOUT_MS,
249
+ timeout: kill_after_ms,
245
250
  }).status ?? undefined
246
251
  )
247
252
  }
@@ -359,6 +364,9 @@ function is_own_process(pid: number | undefined, recorded_start: string | undefi
359
364
  }
360
365
 
361
366
  const process_identity = {
367
+ PROBE_ENVIRONMENT,
368
+ START_PROBES,
369
+ START_TIME_FORMAT,
362
370
  close_beacon,
363
371
  is_live_beacon,
364
372
  is_live_pid,
@@ -371,6 +379,7 @@ const process_identity = {
371
379
  own_start,
372
380
  read_start,
373
381
  resolve_own_start,
382
+ run_socket_probe,
374
383
  }
375
384
 
376
385
  export { process_identity }
@@ -1,8 +1,5 @@
1
- #!/usr/bin/env tsx
2
- import { fileURLToPath } from 'node:url'
3
1
  import { backlogrun_launch } from '#scripts/backlog/backlogrun-launch'
4
2
  import { run_carry } from '#scripts/run/carry/run-carry'
5
- import { josh_environment_file } from './josh-environment-file'
6
3
  import { session_language, type Resolution } from './session-language'
7
4
 
8
5
  // `josh session:lang` — say, on stdout, which language this session writes in, so a
@@ -43,7 +40,8 @@ const LIVE_PORTS: LivePorts = {
43
40
  is_running: backlogrun_launch.is_running,
44
41
  }
45
42
 
46
- // The file load happens in `main`, on the command path only; the resolver reads the environment.
43
+ // The file load happens in `session-language-main.ts`, on the command path only; the resolver reads
44
+ // the environment.
47
45
  // The line carries the value alone: what the language covers is `CLAUDE.md` → "Output language",
48
46
  // already in context every turn, so repeating it here only spent context on each prompt. The default
49
47
  // prints nothing — that resident line already names `ja`.
@@ -68,8 +66,7 @@ function prompt_lines(resolution: Resolution, is_live: boolean): Array<string> {
68
66
  return [format_line(resolution), is_live ? BOARD_LINE : ''].filter((line) => line !== '')
69
67
  }
70
68
 
71
- async function main(): Promise<void> {
72
- josh_environment_file.load_environment_file()
69
+ async function print_prompt_lines(): Promise<void> {
73
70
  const lines = prompt_lines(resolve_session_lang(), await is_run_live())
74
71
 
75
72
  for (const line of lines) console.info(line)
@@ -81,11 +78,10 @@ const session_language_cli = {
81
78
  ENV_KEY,
82
79
  format_line,
83
80
  is_run_live,
81
+ print_prompt_lines,
84
82
  prompt_lines,
85
83
  resolve_session_lang,
86
84
  }
87
85
 
88
- if (process.argv[1] === fileURLToPath(import.meta.url)) await main()
89
-
90
86
  export type { LivePorts }
91
87
  export { session_language_cli }
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env tsx
2
+ import { fileURLToPath } from 'node:url'
3
+ import { josh_environment_file } from './josh-environment-file'
4
+ import { session_language_cli } from './session-language-cli'
5
+
6
+ // The `josh session:lang` entry and the `session-lang` hook bundle, kept apart from
7
+ // `session-language-cli.ts` because `metrics-logic.ts` imports that one: a bundle is one file, so a
8
+ // main guard there would fire for every command that carries it (joshuafolkken/kit#4186). `.env` is
9
+ // read here, inside the guard, so a developer's own `.env` cannot decide what the unit tests see.
10
+ if (process.argv[1] === fileURLToPath(import.meta.url)) {
11
+ josh_environment_file.load_environment_file()
12
+ await session_language_cli.print_prompt_lines()
13
+ }
@@ -24,7 +24,12 @@ function resolve_session_lang(): Resolution {
24
24
  return { lang: DEFAULT_SESSION_LANG, is_default: true }
25
25
  }
26
26
 
27
- const session_language = { DEFAULT_SESSION_LANG, ENV_KEY, resolve_session_lang }
27
+ // `ja` and any regional form of it (`ja-JP`) is Japanese; every other language is the English fallback.
28
+ function is_japanese(lang: string): boolean {
29
+ return lang.toLowerCase().startsWith(DEFAULT_SESSION_LANG)
30
+ }
31
+
32
+ const session_language = { DEFAULT_SESSION_LANG, ENV_KEY, resolve_session_lang, is_japanese }
28
33
 
29
34
  export type { Resolution }
30
35
  export { session_language }
@@ -0,0 +1,90 @@
1
+ import { git_common_directory } from '#scripts/git/git-common-directory'
2
+ import { PROJECT_ROOT } from '#scripts/init/init-paths'
3
+ import { json_value } from '#scripts/lib/json-value'
4
+ import { z } from 'zod'
5
+ import { stamp_file } from './stamp-file'
6
+
7
+ // An answer one josh process read from GitHub, kept for the next process to reuse while it is fresh
8
+ // (joshuafolkken/kit#4550).
9
+ //
10
+ // **Keyed to the repository's common git directory, so every work tree shares one record.** A
11
+ // backlogrun asks the same question from its drive, its arrival probe and every lane at once; keying on
12
+ // `PROJECT_ROOT` would give each work tree its own copy and each would read GitHub again.
13
+ //
14
+ // One record per slot: a different `key` replaces it rather than accumulating beside it, so the temp
15
+ // directory holds at most one file per slot however many keys a run walks through.
16
+
17
+ interface CacheSlot {
18
+ prefix: string
19
+ ttl_ms: number
20
+ }
21
+
22
+ const record_schema = z.object({
23
+ key: z.string(),
24
+ saved_at: z.number(),
25
+ value: z.unknown(),
26
+ })
27
+
28
+ function slot_path(slot: CacheSlot): string {
29
+ return stamp_file.stamp_path(slot.prefix, git_common_directory.repository() ?? PROJECT_ROOT)
30
+ }
31
+
32
+ function is_fresh(saved_at: number, slot: CacheSlot, now_ms: number): boolean {
33
+ return saved_at <= now_ms && now_ms - saved_at < slot.ttl_ms
34
+ }
35
+
36
+ function read_value(slot: CacheSlot, key: string, now_ms: number): unknown {
37
+ const raw = stamp_file.read_stamp_text(slot_path(slot))
38
+ const record = raw === undefined ? undefined : json_value.parse_with(raw, record_schema)
39
+
40
+ return record?.key === key && is_fresh(record.saved_at, slot, now_ms) ? record.value : undefined
41
+ }
42
+
43
+ // `undefined` is a miss: no record, another key's record, a stale one, or one that does not parse.
44
+ function read<T>(
45
+ slot: CacheSlot,
46
+ key: string,
47
+ schema: z.ZodType<T>,
48
+ now_ms: number,
49
+ ): T | undefined {
50
+ const parsed = schema.safeParse(read_value(slot, key, now_ms))
51
+
52
+ return parsed.success ? parsed.data : undefined
53
+ }
54
+
55
+ // A write that fails leaves the next process to read GitHub itself — the answer this process already
56
+ // has is still right, so the failure is not its caller's to handle.
57
+ function write(slot: CacheSlot, key: string, value: unknown, now_ms: number): void {
58
+ try {
59
+ stamp_file.replace_stamp(slot_path(slot), { key, saved_at: now_ms, value })
60
+ } catch {
61
+ // The record is an optimization; a missing one costs one read.
62
+ }
63
+ }
64
+
65
+ // The cached answer for `key`, or `compute`'s — stored only when it is defined, so a failed read is
66
+ // asked again by the next process rather than remembered for the whole TTL.
67
+ async function remember<T>(
68
+ request: { slot: CacheSlot; key: string; schema: z.ZodType<T> },
69
+ compute: () => Promise<T | undefined>,
70
+ now_ms: number = Date.now(),
71
+ ): Promise<T | undefined> {
72
+ const cached = read(request.slot, request.key, request.schema, now_ms)
73
+
74
+ if (cached !== undefined) return cached
75
+
76
+ const value = await compute()
77
+
78
+ if (value !== undefined) write(request.slot, request.key, value, now_ms)
79
+
80
+ return value
81
+ }
82
+
83
+ function clear(slot: CacheSlot): void {
84
+ stamp_file.remove_stamp(slot_path(slot))
85
+ }
86
+
87
+ const shared_cache = { clear, read, remember, write }
88
+
89
+ export { shared_cache }
90
+ export type { CacheSlot }
@@ -1,12 +1,13 @@
1
- import { createHash, randomUUID } from 'node:crypto'
2
- import { lstatSync, readFileSync, renameSync, rmSync, writeFileSync } from 'node:fs'
1
+ import { createHash } from 'node:crypto'
2
+ import { lstatSync, readFileSync, rmSync, writeFileSync } from 'node:fs'
3
3
  import path from 'node:path'
4
4
  import { PACKAGE_DIR } from '#scripts/init/init-paths'
5
- import { PLATFORM_TEMP_ROOT } from './platform-temporary'
5
+ import { PLATFORM_TEMP_ROOT } from '#scripts/josh/platform-temporary'
6
+ import { atomic_write } from '#scripts/lib/atomic-write'
6
7
 
7
8
  // A small record one josh command writes and another reads, kept per checkout in the temp directory.
8
9
  //
9
- // Extracted from `scripts/eval/eval-stamp.ts` when `josh latest:scope` needed the same handoff.
10
+ // Extracted from `tools/eval/eval-stamp.ts` when `josh latest:scope` needed the same handoff.
10
11
  // The mechanics below are not boilerplate — the symlink defense on the
11
12
  // write, the ownership check on the read, and the deterministic per-checkout path are each load
12
13
  // bearing — so a second copy of them is the clone `CLAUDE.md` prohibits. What differs between the
@@ -121,8 +122,8 @@ function is_foreign_file(target: string): boolean {
121
122
  }
122
123
 
123
124
  // Mutable coordination state cannot disappear between an unlink and its replacement: a reader that
124
- // mistakes that gap for "no child" can start the same generation twice. The temporary file lives
125
- // beside the target, uses the same exclusive/symlink-safe create, and rename publishes it atomically.
125
+ // mistakes that gap for "no child" can start the same generation twice. `atomic-write.ts` stages the
126
+ // text beside the target with the same exclusive create and renames it over the target.
126
127
  // `rename` replaces the path itself rather than following a symlink planted there, so the write still
127
128
  // never lands somewhere else; a regular file another account owns is refused before it is replaced,
128
129
  // the same answer the unlink gives on a sticky temp directory.
@@ -131,16 +132,9 @@ function replace_text_stamp(target: string, text: string): string {
131
132
  throw new Error(`refusing to replace another account's file: ${target}`)
132
133
  }
133
134
 
134
- const temporary = `${target}.${String(process.pid)}.${randomUUID()}`
135
+ atomic_write.replace_file(target, text, { mode: STAMP_FILE_MODE })
135
136
 
136
- try {
137
- writeFileSync(temporary, text, { flag: STAMP_CREATE_FLAG, mode: STAMP_FILE_MODE })
138
- renameSync(temporary, target)
139
-
140
- return target
141
- } finally {
142
- rmSync(temporary, { force: true })
143
- }
137
+ return target
144
138
  }
145
139
 
146
140
  function replace_stamp(target: string, payload: unknown): string {