@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,4 +1,4 @@
1
- import { GIT_TIMEOUT_MS } from '#scripts/lib/timeouts'
1
+ import { GIT_TIMEOUT_MS, MS_PER_SECOND } from '#scripts/lib/timeouts'
2
2
  import { execa } from 'execa'
3
3
  import { git_utilities } from './constants'
4
4
  import {
@@ -47,7 +47,6 @@ async function read(
47
47
  // still takes this one. The push's budget is reused rather than a second number chosen: both transfer
48
48
  // objects over the same transport, and that one is already read off what a healthy transfer costs here.
49
49
  const REMOTE_TIMEOUT_MS = PUSH_TIMEOUT_MS
50
- const MS_PER_SECOND = 1000
51
50
 
52
51
  // A budget kill is reported as a timeout, never as whatever the killed process printed first, and
53
52
  // `cause` carries the same `TIMEOUT_EXIT_CODE` a timed-out push does. Unlike the push it is not
@@ -1,9 +1,9 @@
1
1
  import { animation_helpers, type AnimationOptions } from '#scripts/lib/animation-helpers'
2
+ import { PACKAGE_JSON } from '#scripts/lib/package-manifest'
2
3
  import { REQUIRED_STATUS_LENGTH, STAGED_STATUS_INDEX, UNTRACKED_FILE_PREFIX } from './constants'
3
4
  import { git_command } from './git-command'
4
5
 
5
6
  const WARNING_ICON = '🔔'
6
- const PACKAGE_JSON_FILE = 'package.json'
7
7
  const STATUS_PREFIX_LENGTH = 2
8
8
  const VERSION_NOT_UPDATED = 'Not updated'
9
9
 
@@ -62,7 +62,7 @@ function is_package_json_staged(status_output: string): boolean {
62
62
 
63
63
  const filename = extract_filename(line)
64
64
 
65
- return filename === PACKAGE_JSON_FILE
65
+ return filename === PACKAGE_JSON
66
66
  })
67
67
  }
68
68
 
@@ -148,7 +148,7 @@ async function check_package_json_version(): Promise<boolean> {
148
148
  return await animation_helpers.execute_with_animation(
149
149
  'Checking if package.json version is updated...',
150
150
  async () => {
151
- const diff_output: string = await git_command.diff_cached(PACKAGE_JSON_FILE)
151
+ const diff_output: string = await git_command.diff_cached(PACKAGE_JSON)
152
152
 
153
153
  return is_version_updated_in_diff(diff_output)
154
154
  },
@@ -166,7 +166,7 @@ async function check_branch_version(): Promise<boolean> {
166
166
  return await animation_helpers.execute_with_animation(
167
167
  'Checking if version is already updated on this branch...',
168
168
  async () => {
169
- const diff_output: string = await git_command.diff_main(PACKAGE_JSON_FILE)
169
+ const diff_output: string = await git_command.diff_main(PACKAGE_JSON)
170
170
 
171
171
  return is_version_updated_in_diff(diff_output)
172
172
  },
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env tsx
2
+ import { fileURLToPath } from 'node:url'
3
+ import { main_merge } from './main-merge'
4
+
5
+ // The `josh main:merge` entry, kept apart from `main-merge.ts` because `run-ship-sync.ts` imports
6
+ // that one: a bundle is one file, so a main guard there would fire for every command that carries it
7
+ // (joshuafolkken/kit#4186).
8
+ if (process.argv[1] === fileURLToPath(import.meta.url)) {
9
+ const ARGV_OFFSET = 2
10
+
11
+ process.exitCode = await main_merge.run(process.argv.slice(ARGV_OFFSET))
12
+ }
@@ -10,7 +10,7 @@ import { git_spawn } from './git-spawn'
10
10
  // **This table is the single list of what is resolved that way** — a file a person writes never
11
11
  // belongs in it, because regenerating would discard that person's side of the merge. A conflict on any
12
12
  // path not listed here still stops as `conflict`. A file belongs here only once its committed content
13
- // is exactly what its command writes: `scripts/test/pure-files.ts` is not, so regenerating it would
13
+ // is exactly what its command writes: `tools/test/pure-files.ts` is not, so regenerating it would
14
14
  // rewrite far more than the conflict.
15
15
 
16
16
  interface RegeneratedFile {
@@ -21,7 +21,7 @@ interface RegeneratedFile {
21
21
  const REGENERATED_FILES: ReadonlyArray<RegeneratedFile> = [
22
22
  {
23
23
  path: 'docs/josh-command-catalog.md',
24
- command: ['pnpm', 'exec', 'tsx', 'scripts/document/generate-catalog.ts'],
24
+ command: ['pnpm', 'exec', 'tsx', 'tools/document/generate-catalog.ts'],
25
25
  },
26
26
  ]
27
27
 
@@ -1,9 +1,9 @@
1
- #!/usr/bin/env tsx
2
- import { fileURLToPath } from 'node:url'
3
1
  import { extract_issue_number } from '#scripts/hooks/check-commit-message'
4
2
  import { issue_cite } from '#scripts/issue/issue-cite'
5
3
  import { composite_arguments, USAGE_ERROR_EXIT_CODE } from '#scripts/josh/josh-composite-arguments'
6
4
  import { error_text } from '#scripts/lib/error-message'
5
+ import { split_assess } from '#scripts/split/split-assess'
6
+ import { split_measure } from '#scripts/split/split-measure'
7
7
  import { git_command } from './git-command'
8
8
  import { main_merge_guard } from './main-merge-guard'
9
9
  import { main_merge_regenerate } from './main-merge-regenerate'
@@ -30,8 +30,9 @@ import { main_merge_regenerate } from './main-merge-regenerate'
30
30
 
31
31
  const SUCCESS_EXIT_CODE = 0
32
32
  const FAILURE_EXIT_CODE = 1
33
- const ARGV_OFFSET = 2
34
33
  const COMMAND_NAME = 'main:merge'
34
+ const SPLIT_UNMEASURED =
35
+ 'split notice: the diff could not be measured — run `pnpm josh split:assess`'
35
36
 
36
37
  // git's default merge message carries no `#N`, so on an issue branch the `commit-msg` hook refuses
37
38
  // it and leaves the index mid-merge. The number is read with the hook's
@@ -115,6 +116,25 @@ function failure_text(outcome: MergeOutcome): string | undefined {
115
116
  return undefined
116
117
  }
117
118
 
119
+ // joshuafolkken/kit#4302: every implementing run merges the default branch immediately before the
120
+ // gate, so this is where a diff that outgrew the entry's split estimate is told so. The notice is
121
+ // advisory: a finished merge never fails on it, and an unreadable diff says so rather than reading as
122
+ // under the guide. It sits on the command, not on `merge()`, because `josh ship` merges again past the
123
+ // point a run can act on it.
124
+ async function split_notice(): Promise<string | undefined> {
125
+ try {
126
+ return split_assess.notice(await split_measure.read_branch())
127
+ } catch (error) {
128
+ return `${SPLIT_UNMEASURED}: ${error_text.message_of(error)}`
129
+ }
130
+ }
131
+
132
+ async function warn_over_split_guide(): Promise<void> {
133
+ const notice = await split_notice()
134
+
135
+ if (notice !== undefined) console.warn(notice)
136
+ }
137
+
118
138
  async function merge_default_branch(): Promise<number> {
119
139
  const outcome = await merge()
120
140
  const failure = failure_text(outcome)
@@ -127,6 +147,8 @@ async function merge_default_branch(): Promise<number> {
127
147
 
128
148
  if ('branch' in outcome) console.info(outcome.branch)
129
149
 
150
+ await warn_over_split_guide()
151
+
130
152
  return SUCCESS_EXIT_CODE
131
153
  }
132
154
 
@@ -154,13 +176,7 @@ async function run(argv: ReadonlyArray<string>): Promise<number> {
154
176
  }
155
177
  }
156
178
 
157
- async function main(argv: ReadonlyArray<string>): Promise<void> {
158
- process.exitCode = await run(argv)
159
- }
160
-
161
179
  const main_merge = { merge, run }
162
180
 
163
- if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
164
-
165
181
  export { main_merge }
166
182
  export type { MergeOutcome }
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env tsx
2
+ import { fileURLToPath } from 'node:url'
3
+ import { main_sync } from './main-sync'
4
+
5
+ // The `josh main:sync` entry, kept apart from `main-sync.ts` because `observations-flush.ts` imports
6
+ // that one: a bundle is one file, so a main guard there would fire for every command that carries it
7
+ // (joshuafolkken/kit#4186).
8
+ if (process.argv[1] === fileURLToPath(import.meta.url)) {
9
+ const ARGV_OFFSET = 2
10
+
11
+ process.exitCode = await main_sync.run(process.argv.slice(ARGV_OFFSET))
12
+ }
@@ -1,5 +1,3 @@
1
- #!/usr/bin/env tsx
2
- import { fileURLToPath } from 'node:url'
3
1
  import { composite_arguments, USAGE_ERROR_EXIT_CODE } from '#scripts/josh/josh-composite-arguments'
4
2
  import { error_text } from '#scripts/lib/error-message'
5
3
  import { git_command } from './git-command'
@@ -27,7 +25,6 @@ import { lockfile_sync } from './lockfile-sync'
27
25
 
28
26
  const SUCCESS_EXIT_CODE = 0
29
27
  const FAILURE_EXIT_CODE = 1
30
- const ARGV_OFFSET = 2
31
28
  const COMMAND_NAME = 'main:sync'
32
29
  const INSTALL_FAILURE =
33
30
  'node_modules is behind pnpm-lock.yaml and `pnpm install --frozen-lockfile` failed; run `pnpm josh ms` again, or the install here by hand.'
@@ -144,12 +141,6 @@ async function run(argv: ReadonlyArray<string>): Promise<number> {
144
141
  }
145
142
  }
146
143
 
147
- async function main(argv: ReadonlyArray<string>): Promise<void> {
148
- process.exitCode = await run(argv)
149
- }
150
-
151
144
  const main_sync = { run }
152
145
 
153
- if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
154
-
155
146
  export { main_sync }
@@ -1,4 +1,5 @@
1
1
  import { git_spawn } from '#scripts/git/git-spawn'
2
+ import { LEDGER_EXCLUSION_PATHSPEC } from '#scripts/observations/observation-ledger'
2
3
 
3
4
  // The one place a sanctioned `git stash pop` is targeted by its message rather than its stack
4
5
  // position. The stash is a single repository-wide stack shared by every
@@ -97,14 +98,34 @@ async function has_conflict(directory?: string): Promise<boolean> {
97
98
 
98
99
  // Uncommitted work is anything `git status --porcelain` lists — untracked files included, which is what
99
100
  // `push` below carries with `-u`, so the two agree on what "work" means.
100
- async function has_changes(directory?: string): Promise<boolean> {
101
- return (await git_spawn.read(git_args(directory, ['status', '--porcelain']))) !== ''
101
+ // A `pathspec` narrows both to the same paths, so a push never finds nothing where this found work.
102
+ async function has_changes(
103
+ directory?: string,
104
+ pathspec: ReadonlyArray<string> = [],
105
+ ): Promise<boolean> {
106
+ const status = await git_spawn.read(git_args(directory, ['status', '--porcelain', ...pathspec]))
107
+
108
+ return status !== ''
109
+ }
110
+
111
+ // What `josh stash:push` sets aside: everything but the observation ledger, whose lines ride on the
112
+ // run's own commit (`stash-push-cli.ts`).
113
+ const STASHABLE_PATHSPEC: ReadonlyArray<string> = ['--', ...LEDGER_EXCLUSION_PATHSPEC]
114
+
115
+ // Whether `josh stash:push` would push anything — the question to ask before telling someone to run it,
116
+ // so a ledger-only tree is never sent to a push that answers `clean`.
117
+ async function has_stashable_changes(directory?: string): Promise<boolean> {
118
+ return await has_changes(directory, STASHABLE_PATHSPEC)
102
119
  }
103
120
 
104
121
  // Push with a message `josh stash:pop` can later target — the stack is shared by every work tree, so an
105
122
  // entry pushed from a lane outlives the lane's own tree.
106
- async function push(message: string, directory?: string): Promise<void> {
107
- await git_spawn.read(git_args(directory, ['stash', 'push', '-u', '-m', message]))
123
+ async function push(
124
+ message: string,
125
+ directory?: string,
126
+ pathspec: ReadonlyArray<string> = [],
127
+ ): Promise<void> {
128
+ await git_spawn.read(git_args(directory, ['stash', 'push', '-u', '-m', message, ...pathspec]))
108
129
  }
109
130
 
110
131
  // The stack keyed by commit rather than position: a sweep that reads the
@@ -181,6 +202,7 @@ const git_stash = {
181
202
  drop_by_hash,
182
203
  has_changes,
183
204
  has_conflict,
205
+ has_stashable_changes,
184
206
  list,
185
207
  list_by_hash,
186
208
  matches,
@@ -188,6 +210,7 @@ const git_stash = {
188
210
  pop,
189
211
  push,
190
212
  select,
213
+ STASHABLE_PATHSPEC,
191
214
  work_message,
192
215
  }
193
216
 
@@ -1,13 +1,12 @@
1
1
  import { cli_flags } from '#scripts/lib/cli-flags'
2
2
 
3
- // `josh stash:pop` turns its `argv` into a single request: the message of the stash to pop. Parsing
4
- // lives here, acting on the stack lives in `stash-pop-cli.ts`, and a malformed command line is
5
- // `undefined` rather than a guessed intent — a pop run on a misread argument would take the wrong
6
- // entry off a stack shared by every lane.
3
+ // `josh stash:push` and `josh stash:pop` turn their `argv` into a single request: the message of the
4
+ // stash to push or pop. Parsing lives here, acting on the stack lives in each command's cli, and a
5
+ // malformed command line is `undefined` rather than a guessed intent — a pop run on a misread argument
6
+ // would take the wrong entry off a stack shared by every lane, and a push without its message would
7
+ // leave an entry nothing can target.
7
8
 
8
- const USAGE = 'Usage: josh stash:pop "<message>" [--dir <path>]'
9
-
10
- // `--dir` points the pop at a lane's work tree; without it the pop lands in the current checkout.
9
+ // `--dir` points the command at a lane's work tree; without it, it acts on the current checkout.
11
10
  const OPTIONS = { dir: { type: 'string' } } as const
12
11
 
13
12
  interface ParsedValues {
@@ -20,12 +19,16 @@ interface Request {
20
19
  dir: string | undefined
21
20
  }
22
21
 
22
+ function usage(command: string): string {
23
+ return `Usage: josh ${command} "<message>" [--dir <path>]`
24
+ }
25
+
23
26
  function read_arguments(argv: ReadonlyArray<string>): ParsedValues | undefined {
24
27
  return cli_flags.arguments_of(argv, OPTIONS)
25
28
  }
26
29
 
27
30
  // The message is the sole positional and must be a non-empty string: an empty message matches every
28
- // stash pushed without a message, which is exactly the ambiguity this command exists to refuse.
31
+ // stash pushed without a message, which is exactly the ambiguity `stash:pop` exists to refuse.
29
32
  function message_of(positionals: ReadonlyArray<string>): string | undefined {
30
33
  if (positionals.length !== 1) return undefined
31
34
 
@@ -42,7 +45,7 @@ function to_request(parsed: ParsedValues): Request | undefined {
42
45
  return { message, dir: parsed.values.dir }
43
46
  }
44
47
 
45
- const stash_pop_args = { USAGE, read_arguments, to_request }
48
+ const stash_args = { read_arguments, to_request, usage }
46
49
 
47
50
  export type { Request }
48
- export { stash_pop_args }
51
+ export { stash_args }
@@ -1,7 +1,6 @@
1
- import { fileURLToPath } from 'node:url'
2
1
  import { error_text } from '#scripts/lib/error-message'
3
2
  import { git_stash } from './git-stash'
4
- import { stash_pop_args, type Request } from './stash-pop-args'
3
+ import { stash_args, type Request } from './stash-args'
5
4
 
6
5
  // `josh stash:pop "<message>"` — pop the stash whose message matches, and no other.
7
6
  // The stash stack is shared by every working tree of the repository, so a
@@ -9,6 +8,8 @@ import { stash_pop_args, type Request } from './stash-pop-args'
9
8
  // selector from the message and pops that entry alone; no match and more than one match are both
10
9
  // refusals rather than a guess at which was meant.
11
10
 
11
+ const COMMAND = 'stash:pop'
12
+
12
13
  const POPPED_VERDICT = 'popped'
13
14
  const CONFLICTED_VERDICT = 'conflicted'
14
15
  const NO_MATCH_VERDICT = 'no-match'
@@ -16,7 +17,6 @@ const AMBIGUOUS_VERDICT = 'ambiguous'
16
17
 
17
18
  const SUCCESS_EXIT_CODE = 0
18
19
  const FAILURE_EXIT_CODE = 1
19
- const ARGV_OFFSET = 2
20
20
 
21
21
  function report(verdict: string, detail: string, code: number): number {
22
22
  console.info(verdict)
@@ -26,7 +26,7 @@ function report(verdict: string, detail: string, code: number): number {
26
26
  }
27
27
 
28
28
  function refuse(): number {
29
- console.error(stash_pop_args.USAGE)
29
+ console.error(stash_args.usage(COMMAND))
30
30
 
31
31
  return FAILURE_EXIT_CODE
32
32
  }
@@ -73,11 +73,11 @@ function report_unknown(error: unknown): number {
73
73
  }
74
74
 
75
75
  async function run(argv: ReadonlyArray<string>): Promise<number> {
76
- const parsed = stash_pop_args.read_arguments(argv)
76
+ const parsed = stash_args.read_arguments(argv)
77
77
 
78
78
  if (parsed === undefined) return refuse()
79
79
 
80
- const request = stash_pop_args.to_request(parsed)
80
+ const request = stash_args.to_request(parsed)
81
81
 
82
82
  if (request === undefined) return refuse()
83
83
 
@@ -88,10 +88,6 @@ async function run(argv: ReadonlyArray<string>): Promise<number> {
88
88
  }
89
89
  }
90
90
 
91
- async function main(argv: ReadonlyArray<string>): Promise<void> {
92
- process.exitCode = await run(argv)
93
- }
94
-
95
91
  const stash_pop_cli = {
96
92
  AMBIGUOUS_VERDICT,
97
93
  CONFLICTED_VERDICT,
@@ -100,6 +96,4 @@ const stash_pop_cli = {
100
96
  run,
101
97
  }
102
98
 
103
- if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
104
-
105
99
  export { stash_pop_cli }
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env tsx
2
+ import { fileURLToPath } from 'node:url'
3
+ import { stash_pop_cli } from './stash-pop-cli'
4
+
5
+ // The `josh stash:pop` entry, kept apart from `stash-pop-cli.ts` because `latest-if-required-cli.ts`
6
+ // imports that one: a bundle is one file, so a main guard there would fire for every command that
7
+ // carries it (joshuafolkken/kit#4186).
8
+ if (process.argv[1] === fileURLToPath(import.meta.url)) {
9
+ const ARGV_OFFSET = 2
10
+
11
+ process.exitCode = await stash_pop_cli.run(process.argv.slice(ARGV_OFFSET))
12
+ }
@@ -0,0 +1,76 @@
1
+ import { error_text } from '#scripts/lib/error-message'
2
+ import { git_stash } from './git-stash'
3
+ import { stash_args, type Request } from './stash-args'
4
+
5
+ // `josh stash:push "<message>"` — the one way a workflow sets its working tree aside, paired with
6
+ // `josh stash:pop "<message>"` that brings it back. Two rules fix what it takes:
7
+ //
8
+ // - **Untracked files go with it (`-u`).** Work in progress almost always includes a new, untracked
9
+ // `*.test.ts`; a stash that leaves it behind leaves it for the next `pnpm josh ms` to refuse.
10
+ // - **The observation ledger stays** — every path `observation_ledger.is_ledger_path` names, legacy
11
+ // ones included (`git_stash.STASHABLE_PATHSPEC`). A run appends its own lines to `.josh/observations/` and they
12
+ // ride on that run's commit; a stash would take them off the tree before the commit or the
13
+ // batch-end flush could see them.
14
+ //
15
+ // A tree with nothing outside the ledger to set aside pushes nothing and says `clean`, so a procedure
16
+ // can call it unconditionally and pop only after `stashed`.
17
+
18
+ const COMMAND = 'stash:push'
19
+
20
+ const STASHED_VERDICT = 'stashed'
21
+ const CLEAN_VERDICT = 'clean'
22
+
23
+ const SUCCESS_EXIT_CODE = 0
24
+ const FAILURE_EXIT_CODE = 1
25
+
26
+ function report(verdict: string, detail: string): number {
27
+ console.info(verdict)
28
+ console.error(detail)
29
+
30
+ return SUCCESS_EXIT_CODE
31
+ }
32
+
33
+ function refuse(): number {
34
+ console.error(stash_args.usage(COMMAND))
35
+
36
+ return FAILURE_EXIT_CODE
37
+ }
38
+
39
+ type PushVerdict = typeof STASHED_VERDICT | typeof CLEAN_VERDICT
40
+
41
+ // The decision and the push without the printing, so a caller that chains a pop on `stashed`
42
+ // (`josh latest:if-required`) reads the verdict instead of parsing stdout.
43
+ async function set_aside(request: Request): Promise<PushVerdict> {
44
+ if (!(await git_stash.has_stashable_changes(request.dir))) return CLEAN_VERDICT
45
+
46
+ await git_stash.push(request.message, request.dir, git_stash.STASHABLE_PATHSPEC)
47
+
48
+ return STASHED_VERDICT
49
+ }
50
+
51
+ async function answer(request: Request): Promise<number> {
52
+ if ((await set_aside(request)) === CLEAN_VERDICT) {
53
+ return report(CLEAN_VERDICT, 'Nothing to stash.')
54
+ }
55
+
56
+ return report(STASHED_VERDICT, `Stashed as "${request.message}".`)
57
+ }
58
+
59
+ async function run(argv: ReadonlyArray<string>): Promise<number> {
60
+ const parsed = stash_args.read_arguments(argv)
61
+ const request = parsed === undefined ? undefined : stash_args.to_request(parsed)
62
+
63
+ if (request === undefined) return refuse()
64
+
65
+ try {
66
+ return await answer(request)
67
+ } catch (error) {
68
+ console.error(error_text.message_of(error))
69
+
70
+ return FAILURE_EXIT_CODE
71
+ }
72
+ }
73
+
74
+ const stash_push_cli = { CLEAN_VERDICT, STASHED_VERDICT, run, set_aside }
75
+
76
+ export { stash_push_cli }
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env tsx
2
+ import { fileURLToPath } from 'node:url'
3
+ import { stash_push_cli } from './stash-push-cli'
4
+
5
+ // The `josh stash:push` entry, kept apart from `stash-push-cli.ts` because `run-pause.ts` and
6
+ // `latest-if-required-cli.ts` import that one: a bundle is one file, so a main guard there would fire
7
+ // 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
+ process.exitCode = await stash_push_cli.run(process.argv.slice(ARGV_OFFSET))
12
+ }
@@ -1,6 +1,3 @@
1
- #!/usr/bin/env tsx
2
- import { text } from 'node:stream/consumers'
3
- import { fileURLToPath } from 'node:url'
4
1
  import { hook_decision } from '#scripts/josh/hook-decision'
5
2
  import { lane_guard_policy, type LaneGuardMode } from '#scripts/lane/lane-guard-policy'
6
3
  import { time_batch_guard, type GuardedCall } from '#scripts/time-runtime/time-batch-guard'
@@ -121,11 +118,6 @@ const notice_refusal_path = hook_decision.create_refusal_stamp(
121
118
  ).path
122
119
  const { deny_envelope, load_environment_file, DISABLED_VALUES } = hook_decision
123
120
 
124
- if (process.argv[1] === fileURLToPath(import.meta.url)) {
125
- if (process.stdin.isTTY) hook_decision.report_no_payload('batch:guard')
126
- else hook_decision.write_outcome(await text(process.stdin), batch_outcome)
127
- }
128
-
129
121
  export {
130
122
  batch_outcome,
131
123
  batch_refusal,
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env tsx
2
+ import { fileURLToPath } from 'node:url'
3
+ import { run_check } from './check-commit-message'
4
+
5
+ // The `josh check-commit-message` entry, kept apart from `check-commit-message.ts` because
6
+ // `main-merge.ts` imports that one: a bundle is one file, so a main guard there would fire for every
7
+ // command that carries it (joshuafolkken/kit#4186). The message file is read from `process.argv`.
8
+ if (process.argv[1] === fileURLToPath(import.meta.url)) process.exitCode = await run_check()
@@ -1,8 +1,6 @@
1
- #!/usr/bin/env tsx
2
1
  import { readFileSync } from 'node:fs'
3
2
  import os from 'node:os'
4
3
  import path from 'node:path'
5
- import { fileURLToPath } from 'node:url'
6
4
  import { git_command } from '#scripts/git/git-command'
7
5
  import { issue_cite } from '#scripts/issue/issue-cite'
8
6
 
@@ -122,16 +120,15 @@ async function check_commit_message(): Promise<CheckResult> {
122
120
  }
123
121
  }
124
122
 
125
- async function main(): Promise<void> {
123
+ // The `commit-msg` hook's run: the check's message, and a failure exit when it refused.
124
+ async function run_check(): Promise<number> {
126
125
  const result = await check_commit_message()
127
126
 
128
127
  console.info(result.message)
129
128
 
130
- if (!result.success) process.exit(1)
129
+ return result.success ? 0 : 1
131
130
  }
132
131
 
133
- if (process.argv[1] === fileURLToPath(import.meta.url)) await main()
134
-
135
- export { check_commit_message, extract_issue_number, is_safe_commit_message_path }
132
+ export { check_commit_message, extract_issue_number, is_safe_commit_message_path, run_check }
136
133
 
137
134
  export type { CheckResult }
@@ -1,11 +1,11 @@
1
1
  #!/usr/bin/env tsx
2
2
  import { existsSync } from 'node:fs'
3
3
  import path from 'node:path'
4
- import { fileURLToPath } from 'node:url'
5
- import { resolve_local_bin, resolve_package_bin } from '#scripts/build/local-bin'
4
+ import { resolve_local_bin } from '#scripts/build/local-bin'
6
5
  import { ESLINT_EDIT_CACHE_FLAGS } from '#scripts/josh/josh-command-types'
7
6
  import { json_value } from '#scripts/lib/json-value'
8
7
  import { HOOK_PROCESS_TIMEOUT_MS } from '#scripts/lib/timeouts'
8
+ import { eslint_daemon } from '#scripts/lint/eslint-daemon'
9
9
  import { time_density_hook } from '#scripts/time-runtime/time-density-hook'
10
10
  import { execa } from 'execa'
11
11
  import { z } from 'zod'
@@ -83,12 +83,8 @@ const ESLINT_ARGUMENTS: ReadonlyArray<string> = [
83
83
  // identical rather than merely similar. The config entry file is re-read per request; the modules it
84
84
  // imports are not, which `plan_daemon_restart` below is the answer to. The daemon exits after 15
85
85
  // minutes of inactivity.
86
- const ESLINT_DAEMON = 'eslint_d'
86
+ const { ESLINT_DAEMON } = eslint_daemon
87
87
  const DAEMON_RESTART = 'restart'
88
- // The two shapes a flat config is built from here and in every consumer of this kit: the root
89
- // `eslint.config.*` entry, and the rule modules under `eslint/` that it imports.
90
- const ESLINT_CONFIG_DIR = 'eslint'
91
- const ESLINT_CONFIG_ENTRY = /^eslint\.config\.[cm]?[jt]s$/u
92
88
 
93
89
  // The problems eslint could not auto-fix are handed to the model verbatim from eslint's own stdout —
94
90
  // its default formatter already prints the file, the `line:col`, and the rule name. A header names what the block is, since additionalContext arrives
@@ -104,11 +100,6 @@ const DIAGNOSTIC_TRUNCATION_NOTICE = '\n…(diagnostics truncated)'
104
100
  // present.
105
101
  const SECTION_SEPARATOR = '\n\n'
106
102
 
107
- // Where this file sits inside the kit package. `eslint_d` is kit's dependency rather than the
108
- // consumer's, and pnpm writes a `node_modules/.bin` shim only for a project's *direct* dependencies,
109
- // so a consumer's project root cannot see it and this directory can.
110
- const MODULE_DIRECTORY = path.dirname(fileURLToPath(import.meta.url))
111
-
112
103
  interface FormatCommand {
113
104
  bin: string
114
105
  command_arguments: ReadonlyArray<string>
@@ -226,10 +217,7 @@ const DAEMON_BINS: ReadonlySet<string> = new Set([ESLINT_BIN, ESLINT_DAEMON])
226
217
  function resolve_daemon_cli(bin: string, project_root: string): string | undefined {
227
218
  if (!DAEMON_BINS.has(bin)) return undefined
228
219
 
229
- return (
230
- resolve_package_bin(MODULE_DIRECTORY, ESLINT_DAEMON, ESLINT_DAEMON) ??
231
- resolve_package_bin(project_root, ESLINT_DAEMON, ESLINT_DAEMON)
232
- )
220
+ return eslint_daemon.resolve_daemon_cli(project_root)
233
221
  }
234
222
 
235
223
  // Only the config *entry file* is re-read per request: ESLint cache-busts `eslint.config.js` by
@@ -238,13 +226,6 @@ function resolve_daemon_cli(bin: string, project_root: string): string | undefin
238
226
  // and then any source file, and it would be auto-fixed against the pre-edit rules for as long as the
239
227
  // daemon lives — an author testing a rule change would read that as the rule being broken. Restarting
240
228
  // after an edit to a config input is what makes the whole config current, not just its first file.
241
- function is_eslint_config_input(relative_path: string): boolean {
242
- return (
243
- relative_path.split(path.sep)[0] === ESLINT_CONFIG_DIR ||
244
- ESLINT_CONFIG_ENTRY.test(relative_path)
245
- )
246
- }
247
-
248
229
  function plan_daemon_restart(
249
230
  file_path: string,
250
231
  project_root: string,
@@ -253,7 +234,7 @@ function plan_daemon_restart(
253
234
 
254
235
  if (
255
236
  relative === undefined ||
256
- !is_eslint_config_input(relative) ||
237
+ !eslint_daemon.is_config_input(relative) ||
257
238
  resolve_daemon_cli(ESLINT_DAEMON, project_root) === undefined
258
239
  ) {
259
240
  return []
@@ -392,8 +373,11 @@ async function format_edited_file(
392
373
  ...plan_commands(file_path, project_root),
393
374
  ...plan_daemon_restart(file_path, project_root),
394
375
  ]
376
+ const daemon_before = eslint_daemon.read_record(project_root)
395
377
  const unfixed = await collect_unfixed(plan, runner, project_root)
396
378
 
379
+ eslint_daemon.remember_started(project_root, daemon_before)
380
+
397
381
  return format_diagnostics(unfixed === '' ? undefined : unfixed)
398
382
  }
399
383