@joshuafolkken/kit 1.1784.0 → 1.2116.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 (690) hide show
  1. package/.claude/agents/reviewer-verification.md +19 -0
  2. package/.claude/agents/reviewer.md +19 -0
  3. package/.claude/settings.json +5 -6
  4. package/.claude/skills/dependency-update/SKILL.md +9 -10
  5. package/.claude/skills/workflow-commands/SKILL.md +6 -6
  6. package/.claude/skills/workflow-commands/background-commands.md +8 -5
  7. package/.claude/skills/workflow-commands/backlogrun-child.md +3 -1
  8. package/.claude/skills/workflow-commands/backlogrun-lanes.md +1 -1
  9. package/.claude/skills/workflow-commands/backlogrun-park.md +5 -2
  10. package/.claude/skills/workflow-commands/backlogrun-progress.md +2 -3
  11. package/.claude/skills/workflow-commands/backlogrun-recovery.md +1 -1
  12. package/.claude/skills/workflow-commands/backlogrun-steps.md +3 -2
  13. package/.claude/skills/workflow-commands/backlogrun.md +1 -1
  14. package/.claude/skills/workflow-commands/chain-rule.md +41 -32
  15. package/.claude/skills/workflow-commands/delegation.md +6 -6
  16. package/.claude/skills/workflow-commands/entry-sequence.md +2 -2
  17. package/.claude/skills/workflow-commands/followup.md +7 -5
  18. package/.claude/skills/workflow-commands/fullrun-steps.md +6 -6
  19. package/.claude/skills/workflow-commands/fullrun.md +1 -1
  20. package/.claude/skills/workflow-commands/issue-comments.md +9 -4
  21. package/.claude/skills/workflow-commands/issue-fold-existing.md +2 -1
  22. package/.claude/skills/workflow-commands/kickoff.md +2 -2
  23. package/.claude/skills/workflow-commands/observation-filing.md +1 -1
  24. package/.claude/skills/workflow-commands/observation-ledger.md +6 -4
  25. package/.claude/skills/workflow-commands/pre-gate-cut.md +9 -7
  26. package/.claude/skills/workflow-commands/prerequisite.md +3 -2
  27. package/.claude/skills/workflow-commands/retrospective.md +2 -2
  28. package/.claude/skills/workflow-commands/split-assessment.md +7 -5
  29. package/.codex/hooks.json +5 -5
  30. package/.github/actions/setup-pnpm/action.yml +9 -16
  31. package/.github/dependabot.yml +16 -0
  32. package/.github/workflows/auto-tag.yml +45 -0
  33. package/.github/workflows/ci.yml +155 -15
  34. package/.github/workflows/dependabot-auto-merge.yml +63 -4
  35. package/.github/workflows/production.yml +8 -0
  36. package/.github/workflows/publish.yml +60 -45
  37. package/.vscode/settings.json +19 -0
  38. package/CLAUDE.md +5 -12
  39. package/SECURITY.md +2 -2
  40. package/dist/CLAUDE.md +5 -12
  41. package/dist/commands/document-read-cli.js +2 -1
  42. package/dist/commands/document-section-main.js +2 -1
  43. package/dist/commands/read-set-cli.js +194 -134
  44. package/dist/commands/run-prep-main.js +9694 -10173
  45. package/dist/commands/run-step-cli.js +22138 -18285
  46. package/dist/hooks/audit-provision.js +23 -5
  47. package/dist/hooks/chunk-3GKE653K.js +6204 -0
  48. package/dist/hooks/chunk-45CJJOO7.js +1243 -0
  49. package/dist/hooks/{chunk-CWMBGKYW.js → chunk-5PM2JRGV.js} +2153 -856
  50. package/dist/hooks/{chunk-WR2KQAYZ.js → chunk-7SIUNQXK.js} +1207 -1470
  51. package/dist/hooks/{chunk-O2YBIDSI.js → chunk-CQD4LJE6.js} +1682 -1130
  52. package/dist/hooks/{chunk-VWWCFGWK.js → chunk-OPSRGWFU.js} +1 -1
  53. package/dist/hooks/{chunk-XGBNSWEI.js → chunk-UJ3FPMMM.js} +132 -49
  54. package/dist/hooks/chunk-VVNYJWEI.js +30 -0
  55. package/dist/hooks/chunk-Z6DQJKH3.js +2806 -0
  56. package/dist/hooks/codex-hook-adapter.js +8 -8
  57. package/dist/hooks/format-edited.js +4 -5
  58. package/dist/hooks/inputs.json +386 -360
  59. package/dist/hooks/pretool-guard.js +7 -6
  60. package/dist/hooks/session-lang.js +101 -258
  61. package/dist/hooks/stop-guard.js +1744 -2576
  62. package/dist/josh.js +7133 -6368
  63. package/dist/version/index.js +161 -1
  64. package/eslint/rules/comment-why-only.js +108 -0
  65. package/package.json +16 -9
  66. package/prompts/coding-standards.md +1 -1
  67. package/prompts/collaboration-workflow/file-edits.md +14 -11
  68. package/prompts/collaboration-workflow/issue-citation.md +0 -4
  69. package/prompts/collaboration-workflow/issue-template.md +40 -21
  70. package/prompts/collaboration-workflow/lane-instructions.md +3 -1
  71. package/prompts/collaboration-workflow/measurement.md +8 -1
  72. package/prompts/collaboration-workflow/operating-rules.md +11 -2
  73. package/prompts/collaboration-workflow/output-bounds.md +6 -2
  74. package/prompts/collaboration-workflow/plan-comment.md +1 -1
  75. package/prompts/collaboration-workflow/principles.md +9 -0
  76. package/prompts/collaboration-workflow/residency.md +3 -2
  77. package/prompts/collaboration-workflow/rule-delivery.md +13 -1
  78. package/prompts/collaboration-workflow/upstream-interrupt.md +2 -2
  79. package/prompts/collaboration-workflow/wip-cap.md +3 -1
  80. package/prompts/review-rubric.md +8 -0
  81. package/prompts/review.md +31 -22
  82. package/prompts/testing-guide.md +1 -0
  83. package/scripts/agent/agent-argv.ts +14 -16
  84. package/scripts/agent/agent-provider.ts +138 -0
  85. package/scripts/agent/agent-role-profile.ts +108 -156
  86. package/scripts/agent/agent-safe-text.ts +20 -5
  87. package/scripts/agent/api-usage-limit.ts +65 -0
  88. package/scripts/agent/claude-agent-argv.ts +19 -9
  89. package/scripts/agent/codex-agent-argv.ts +118 -22
  90. package/scripts/agent/usage-limit-reset.ts +179 -0
  91. package/scripts/auth/claude-token-output.ts +2 -2
  92. package/scripts/auto-ok/auto-ok-author.ts +53 -0
  93. package/scripts/auto-ok/auto-ok-cli.ts +20 -9
  94. package/scripts/backlog/backlog-defect-priority.ts +1 -1
  95. package/scripts/backlog/backlog-drive-cli.ts +6 -1
  96. package/scripts/backlog/backlog-drive-hold.ts +3 -3
  97. package/scripts/backlog/backlog-drive-idle.ts +10 -0
  98. package/scripts/backlog/backlog-drive-launch-pass.ts +90 -0
  99. package/scripts/backlog/backlog-drive-launch.ts +8 -2
  100. package/scripts/backlog/backlog-drive-named-offer.ts +73 -30
  101. package/scripts/backlog/backlog-drive-named.ts +28 -7
  102. package/scripts/backlog/backlog-drive-paused.ts +5 -4
  103. package/scripts/backlog/backlog-drive-restore.ts +11 -3
  104. package/scripts/backlog/backlog-drive.ts +21 -60
  105. package/scripts/backlog/backlog-gate-scope.ts +61 -0
  106. package/scripts/backlog/backlog-measure-close.ts +112 -0
  107. package/scripts/backlog/backlog-next.ts +39 -49
  108. package/scripts/backlog/backlog-occupied.ts +2 -2
  109. package/scripts/backlog/backlog-overlap.ts +42 -8
  110. package/scripts/backlog/backlog-plan-cli.ts +4 -1
  111. package/scripts/backlog/backlog-plan-comment.ts +81 -0
  112. package/scripts/backlog/backlog-plan-read.ts +19 -6
  113. package/scripts/backlog/backlog-pool.ts +50 -12
  114. package/scripts/backlog/backlog-rank.ts +60 -13
  115. package/scripts/backlog/backlog-stalled-detect.ts +2 -1
  116. package/scripts/backlog/backlog-waves.ts +17 -2
  117. package/scripts/backlog/backlogrun-launch.ts +7 -4
  118. package/scripts/cost-runtime/context-cut-payback.ts +27 -25
  119. package/scripts/cost-runtime/cost-cli.ts +37 -16
  120. package/scripts/cost-runtime/cost-pricing.ts +9 -0
  121. package/scripts/cost-runtime/cost-verdict.ts +4 -1
  122. package/scripts/delegation/delegation-policy.ts +2 -2
  123. package/scripts/delegation/duplicate-read-guard.ts +1 -0
  124. package/scripts/delegation/investigation-guard.ts +14 -2
  125. package/scripts/delegation/investigation-reads.ts +45 -23
  126. package/scripts/dependabot/dependabot-cooldown.ts +3 -2
  127. package/scripts/discovery/repo-party.ts +80 -20
  128. package/scripts/discovery/session-owner-pin.ts +51 -0
  129. package/scripts/document/capped-print.ts +1 -1
  130. package/scripts/document/command-reference-line-budget.ts +42 -0
  131. package/scripts/document/document-byte-budget.ts +17 -7
  132. package/scripts/document/document-checks.ts +20 -0
  133. package/scripts/document/document-ratchet-check.ts +101 -0
  134. package/scripts/document/document-section.ts +1 -0
  135. package/scripts/document/entry-read-budget.ts +7 -3
  136. package/scripts/document/issue-citation-budget.ts +94 -0
  137. package/scripts/epic/epic-cli-argv.ts +2 -2
  138. package/scripts/epic/epic-fetch.ts +4 -2
  139. package/scripts/epic/epic-graph.ts +7 -2
  140. package/scripts/epic/epic-issue.ts +3 -1
  141. package/scripts/epic/epic-rank.ts +5 -0
  142. package/scripts/exports/unused-members-check.ts +62 -0
  143. package/scripts/exports/unused-members-cli.ts +6 -51
  144. package/scripts/followup/followup-ci-path.ts +67 -0
  145. package/scripts/followup/followup-coderabbit-retrigger.ts +261 -0
  146. package/scripts/followup/followup-coderabbit-wait.ts +13 -10
  147. package/scripts/followup/followup-failed-tests.ts +160 -0
  148. package/scripts/followup/followup-job-needs.ts +100 -0
  149. package/scripts/followup/followup-job-rerun.ts +303 -0
  150. package/scripts/followup/followup-main-move.ts +113 -0
  151. package/scripts/followup/git-followup-finish.ts +43 -11
  152. package/scripts/followup/git-followup-pending.ts +3 -3
  153. package/scripts/followup/git-followup-stages.ts +41 -11
  154. package/scripts/followup/git-pr-followup-checks.ts +55 -16
  155. package/scripts/followup/git-pr-followup-wrapup.ts +24 -5
  156. package/scripts/followup/git-pr-followup.ts +62 -27
  157. package/scripts/fresh-machine/fresh-machine-script.ts +5 -9
  158. package/scripts/fresh-machine/specs/kit-test-backlogrun-python.json +2 -2
  159. package/scripts/fresh-machine/specs/kit-test-backlogrun.json +2 -2
  160. package/scripts/gate/busy-average.ts +34 -2
  161. package/scripts/gate/check-related-pinned.ts +43 -0
  162. package/scripts/gate/check-related-reuse.ts +64 -0
  163. package/scripts/gate/check-related-section.ts +57 -0
  164. package/scripts/gate/check-related-unplanned.ts +34 -0
  165. package/scripts/gate/check-related.ts +265 -0
  166. package/scripts/gate/command-memory.ts +1 -1
  167. package/scripts/gate/core-admission.ts +24 -6
  168. package/scripts/gate/core-budget-timing.ts +20 -6
  169. package/scripts/gate/core-budget.ts +40 -11
  170. package/scripts/gate/core-wait-record.ts +3 -2
  171. package/scripts/gate/core-wait.ts +25 -2
  172. package/scripts/gate/core-weights.ts +15 -7
  173. package/scripts/gate/gate-labels.ts +46 -0
  174. package/scripts/gate/gate-ledger.ts +14 -6
  175. package/scripts/gate/gate-plan.ts +103 -58
  176. package/scripts/gate/gate-report.ts +9 -7
  177. package/scripts/gate/gate-run-steps.ts +26 -3
  178. package/scripts/gate/gate-skip.ts +45 -6
  179. package/scripts/gate/gate-static-group.ts +60 -0
  180. package/scripts/gate/gate-steps.ts +2 -1
  181. package/scripts/gate/gate-tree.ts +4 -2
  182. package/scripts/gate/hook-gate-reuse.ts +19 -2
  183. package/scripts/gate/metrics-totals.ts +59 -0
  184. package/scripts/gate/scoped-green.ts +68 -15
  185. package/scripts/gate/since-green.ts +14 -6
  186. package/scripts/gate/structural-checks.ts +96 -0
  187. package/scripts/gate/verification-gate.ts +51 -16
  188. package/scripts/gate/verification-inputs.ts +21 -6
  189. package/scripts/gate/verification-tail.ts +52 -0
  190. package/scripts/gh/gh-author-association.ts +23 -2
  191. package/scripts/gh/git-ai-review-scan.ts +1 -1
  192. package/scripts/gh/git-gh-api-path.ts +12 -3
  193. package/scripts/gh/git-gh-comments-unreadable.ts +36 -0
  194. package/scripts/gh/git-gh-exec.ts +32 -2
  195. package/scripts/gh/git-gh-issue-read.ts +4 -2
  196. package/scripts/gh/git-gh-issue-rest.ts +1 -0
  197. package/scripts/gh/git-gh-issue-write.ts +8 -2
  198. package/scripts/gh/git-gh-issue.ts +12 -5
  199. package/scripts/gh/git-gh-pr-auto-merge.ts +13 -6
  200. package/scripts/gh/git-gh-pr-graphql-state.ts +56 -0
  201. package/scripts/gh/git-gh-pr-read.ts +74 -13
  202. package/scripts/gh/git-gh-pr-rest.ts +3 -1
  203. package/scripts/gh/git-gh-pr-snapshot.ts +22 -7
  204. package/scripts/gh/git-gh-pr-too-large.ts +20 -0
  205. package/scripts/gh/git-gh-pr.ts +21 -7
  206. package/scripts/gh/git-gh-retry.ts +141 -0
  207. package/scripts/gh/git-pr-ai-review.ts +15 -6
  208. package/scripts/gh/git-pr-checks-eval.ts +3 -0
  209. package/scripts/gh/git-pr-checks.ts +5 -5
  210. package/scripts/git/base-tree.ts +30 -0
  211. package/scripts/git/change-base.ts +4 -10
  212. package/scripts/git/changed-paths-sync.ts +63 -0
  213. package/scripts/git/changed-paths.ts +16 -1
  214. package/scripts/git/git-common-directory.ts +11 -1
  215. package/scripts/git/git-diff-reads.ts +66 -20
  216. package/scripts/git/git-error.ts +9 -2
  217. package/scripts/git/git-schemas.ts +13 -0
  218. package/scripts/git/git-worktree.ts +13 -0
  219. package/scripts/git/gone-branch.ts +4 -1
  220. package/scripts/git/main-merge-budget-conflict.ts +89 -0
  221. package/scripts/git/main-merge-guard.ts +55 -18
  222. package/scripts/git/main-merge-regenerate.ts +59 -25
  223. package/scripts/git/main-merge.ts +53 -5
  224. package/scripts/git/no-base-checkout.ts +127 -0
  225. package/scripts/git/stash/git-stash.ts +11 -2
  226. package/scripts/git/stash/stash-push-cli.ts +10 -0
  227. package/scripts/hooks/batch-guard.ts +40 -21
  228. package/scripts/hooks/edited-cspell.ts +37 -11
  229. package/scripts/hooks/format-edited-file.ts +22 -2
  230. package/scripts/hooks/lane-plan-guard.ts +50 -0
  231. package/scripts/hooks/pre-commit-lint-switch.ts +9 -0
  232. package/scripts/hooks/pre-commit-lint.ts +14 -1
  233. package/scripts/hooks/pre-push-related-switch.ts +10 -0
  234. package/scripts/hooks/pre-push-unit.ts +76 -10
  235. package/scripts/hooks/pretool-guard.ts +2 -0
  236. package/scripts/hooks/reserved-run.ts +14 -1
  237. package/scripts/hooks/run-hook.sh +23 -8
  238. package/scripts/hooks/step-zero-notice.ts +6 -1
  239. package/scripts/hooks/stop-actions.ts +3 -15
  240. package/scripts/hooks/stop-guard.ts +7 -6
  241. package/scripts/init/distributed-paths.ts +1 -0
  242. package/scripts/init/hook-command-rewrite.ts +5 -1
  243. package/scripts/init/hook-launch.ts +4 -2
  244. package/scripts/issue/aggregation-split.ts +52 -0
  245. package/scripts/issue/defect-origin-line.ts +19 -1
  246. package/scripts/issue/defect-rate-cli.ts +5 -102
  247. package/scripts/issue/defect-report.ts +4 -4
  248. package/scripts/issue/effect-audit-cli.ts +178 -0
  249. package/scripts/issue/effect-audit.ts +185 -0
  250. package/scripts/issue/expected-effect-lint.ts +64 -9
  251. package/scripts/issue/git-next-issues.ts +5 -0
  252. package/scripts/issue/issue-body-or-comment.ts +38 -4
  253. package/scripts/issue/issue-cite-cli.ts +1 -3
  254. package/scripts/issue/issue-classification.ts +1 -0
  255. package/scripts/issue/issue-closing-pr.ts +8 -1
  256. package/scripts/issue/issue-evidence-exit.ts +4 -2
  257. package/scripts/issue/issue-file-cap.ts +58 -0
  258. package/scripts/issue/issue-file-cli.ts +111 -38
  259. package/scripts/issue/issue-file-deferral.ts +52 -0
  260. package/scripts/issue/issue-file-fold.ts +29 -10
  261. package/scripts/issue/issue-file-interrupt.ts +85 -0
  262. package/scripts/issue/issue-file-lane-hint.ts +30 -0
  263. package/scripts/issue/issue-file.ts +43 -6
  264. package/scripts/issue/issue-labels.ts +19 -2
  265. package/scripts/issue/issue-lint-cli.ts +27 -2
  266. package/scripts/issue/issue-measured-cli.ts +13 -35
  267. package/scripts/issue/issue-measured-close.ts +58 -0
  268. package/scripts/issue/issue-not-before-label.ts +2 -2
  269. package/scripts/issue/issue-not-before.ts +4 -1
  270. package/scripts/issue/issue-priority-cli.ts +60 -0
  271. package/scripts/issue/issue-priority-raise.ts +55 -0
  272. package/scripts/issue/issue-priority.ts +174 -43
  273. package/scripts/issue/issue-rank.ts +21 -4
  274. package/scripts/issue/issue-read-cli.ts +32 -6
  275. package/scripts/issue/issue-read.ts +37 -12
  276. package/scripts/issue/issue-sample-gate.ts +95 -74
  277. package/scripts/issue/issue-sample-prime.ts +127 -0
  278. package/scripts/issue/issue-sample-required.ts +57 -0
  279. package/scripts/issue/issue-sample-source.ts +12 -11
  280. package/scripts/issue/issue-search.ts +124 -0
  281. package/scripts/issue/issue-state.ts +13 -1
  282. package/scripts/issue/issue-template-section.ts +43 -0
  283. package/scripts/issue/issue-watch-diff.ts +31 -1
  284. package/scripts/issue/issue-watch-hook.ts +11 -2
  285. package/scripts/issue/issue-watch.ts +55 -12
  286. package/scripts/issue/markdown-section.ts +1 -0
  287. package/scripts/issue/measure-declaration.ts +121 -0
  288. package/scripts/issue/measure-rerun-cli.ts +7 -70
  289. package/scripts/issue/plan-consumers-section.ts +22 -1
  290. package/scripts/issue/reproduction-measure.ts +3 -1
  291. package/scripts/issue/size-estimate.ts +90 -0
  292. package/scripts/issue/trusted-measure.ts +84 -0
  293. package/scripts/josh/command-usage.ts +3 -2
  294. package/scripts/josh/durable-state-migrate.ts +105 -0
  295. package/scripts/josh/durable-state.ts +112 -0
  296. package/scripts/josh/josh-aliases.ts +95 -0
  297. package/scripts/josh/josh-command-map.ts +1 -82
  298. package/scripts/josh/josh-commands-agent-hooks.ts +6 -6
  299. package/scripts/josh/josh-commands-ai.ts +5 -5
  300. package/scripts/josh/josh-commands-development.ts +59 -58
  301. package/scripts/josh/josh-commands-issue-write.ts +23 -4
  302. package/scripts/josh/josh-commands-issue.ts +32 -0
  303. package/scripts/josh/josh-commands-lane.ts +87 -4
  304. package/scripts/josh/josh-commands-lint.ts +16 -3
  305. package/scripts/josh/josh-commands-maintenance.ts +15 -0
  306. package/scripts/josh/josh-commands-review.ts +41 -6
  307. package/scripts/josh/josh-commands-ship.ts +56 -8
  308. package/scripts/josh/josh-commands-test-check.ts +80 -0
  309. package/scripts/josh/josh-commands-workflow.ts +1 -1
  310. package/scripts/josh/josh-environment-file.ts +43 -3
  311. package/scripts/josh/josh-in-process.ts +2 -2
  312. package/scripts/josh/josh-logic.ts +5 -3
  313. package/scripts/josh/josh-run.ts +19 -1
  314. package/scripts/josh/run-record-path.ts +15 -0
  315. package/scripts/josh/stamp-file.ts +11 -2
  316. package/scripts/lane/lane-adopt-cli.ts +98 -0
  317. package/scripts/lane/lane-adopt.ts +208 -0
  318. package/scripts/lane/lane-await.ts +5 -8
  319. package/scripts/lane/lane-baseline.ts +123 -0
  320. package/scripts/lane/lane-breakdown-cli.ts +64 -0
  321. package/scripts/lane/lane-breakdown-implement.ts +170 -0
  322. package/scripts/lane/lane-breakdown-laps.ts +107 -0
  323. package/scripts/lane/lane-breakdown-pinned.ts +76 -0
  324. package/scripts/lane/lane-breakdown-text.ts +145 -0
  325. package/scripts/lane/lane-breakdown.ts +239 -0
  326. package/scripts/lane/lane-check-stats.ts +29 -8
  327. package/scripts/lane/lane-child-invocation.ts +9 -2
  328. package/scripts/lane/lane-child-mark-keys.ts +12 -0
  329. package/scripts/lane/lane-child-marker.ts +20 -1
  330. package/scripts/lane/lane-ci-path-stats.ts +73 -0
  331. package/scripts/lane/lane-claim-stats.ts +84 -0
  332. package/scripts/lane/lane-close.ts +8 -3
  333. package/scripts/lane/lane-dispatch-log.ts +3 -3
  334. package/scripts/lane/lane-dispatch.ts +2 -2
  335. package/scripts/lane/lane-gap-stats.ts +7 -6
  336. package/scripts/lane/lane-guard-policy.ts +7 -1
  337. package/scripts/lane/lane-implement-stats.ts +207 -0
  338. package/scripts/lane/lane-implement-subagents.ts +90 -0
  339. package/scripts/lane/lane-investigation-switch.ts +16 -0
  340. package/scripts/lane/lane-ledger-kind.ts +31 -0
  341. package/scripts/lane/lane-ledger-schema-ship.ts +49 -0
  342. package/scripts/lane/lane-ledger-schema.ts +119 -36
  343. package/scripts/lane/lane-ledger-write.ts +257 -0
  344. package/scripts/lane/lane-ledger.ts +31 -177
  345. package/scripts/lane/lane-load.ts +1 -1
  346. package/scripts/lane/lane-measure-cli.ts +176 -59
  347. package/scripts/lane/lane-net-read.ts +44 -0
  348. package/scripts/lane/lane-net-time.ts +212 -0
  349. package/scripts/lane/lane-open.ts +16 -7
  350. package/scripts/lane/lane-output.ts +2 -4
  351. package/scripts/lane/lane-overrun-prompt.ts +147 -0
  352. package/scripts/lane/lane-overrun.ts +274 -0
  353. package/scripts/lane/lane-paths.ts +24 -1
  354. package/scripts/lane/lane-pause-cli.ts +4 -1
  355. package/scripts/lane/lane-paused-spans.ts +97 -0
  356. package/scripts/lane/lane-plan-check.ts +207 -0
  357. package/scripts/lane/lane-plan-cli.ts +41 -0
  358. package/scripts/lane/lane-plan.ts +144 -0
  359. package/scripts/lane/lane-registry.ts +14 -1
  360. package/scripts/lane/lane-relaunch.ts +1 -1
  361. package/scripts/lane/lane-round-one-stats.ts +51 -0
  362. package/scripts/lane/lane-sampler.ts +23 -4
  363. package/scripts/lane/lane-session-action.ts +93 -18
  364. package/scripts/lane/lane-session-broker.ts +49 -21
  365. package/scripts/lane/lane-session-reread-main.ts +14 -0
  366. package/scripts/lane/lane-session-reread.ts +51 -0
  367. package/scripts/lane/lane-ship-lap-stats.ts +74 -0
  368. package/scripts/lane/lane-sleep.ts +58 -0
  369. package/scripts/lane/lane-spent.ts +1 -1
  370. package/scripts/lane/lane-split-stats.ts +28 -0
  371. package/scripts/lane/lane-stage-stats.ts +13 -1
  372. package/scripts/lane/lane-state.ts +41 -9
  373. package/scripts/lane/lane-stats-tables.ts +58 -0
  374. package/scripts/lane/lane-stats.ts +21 -5
  375. package/scripts/lane/lane-stop-stats.ts +51 -19
  376. package/scripts/lane/lane-tail-stats.ts +32 -0
  377. package/scripts/lane/lane-transcript-calls.ts +67 -10
  378. package/scripts/lane/lane-transcript-stats.ts +44 -12
  379. package/scripts/lane/lane-value-cell.ts +72 -0
  380. package/scripts/lane/lane-value.ts +118 -0
  381. package/scripts/lane/lane-withdraw-closed.ts +124 -0
  382. package/scripts/lane/lane-withdraw.ts +108 -31
  383. package/scripts/lane/lane-yield.ts +85 -0
  384. package/scripts/lane/openai-lane-ship.ts +12 -11
  385. package/scripts/lane/openai-lane-supervisor-decision.ts +6 -8
  386. package/scripts/lane/openai-lane-supervisor-owner.ts +5 -8
  387. package/scripts/lane/openai-lane-supervisor.ts +5 -4
  388. package/scripts/lib/poll.ts +38 -9
  389. package/scripts/lib/settled-together.ts +10 -0
  390. package/scripts/lib/shell-quote.ts +21 -0
  391. package/scripts/lib/token-shape.ts +111 -0
  392. package/scripts/lint/eslint-daemon-sources.ts +79 -0
  393. package/scripts/lint/eslint-daemon.ts +45 -6
  394. package/scripts/lint/eslint-warm-cli.ts +7 -0
  395. package/scripts/lint/eslint-warm.ts +66 -0
  396. package/scripts/lint/import-graph.ts +141 -11
  397. package/scripts/lint/lint-gate-scope.ts +2 -2
  398. package/scripts/lint/lint-parallel.ts +54 -6
  399. package/scripts/lint/lint-related.ts +154 -33
  400. package/scripts/lint/rename-cli.ts +179 -0
  401. package/scripts/lint/rename-identifier.ts +192 -0
  402. package/scripts/lint/type-only-imports.ts +58 -0
  403. package/scripts/notify/telegram-notify.ts +12 -3
  404. package/scripts/observations/observation-record.ts +42 -16
  405. package/scripts/observations/observations-flush.ts +32 -9
  406. package/scripts/overrides/overrides-check.ts +9 -1
  407. package/scripts/release/release-approval-prune.ts +7 -1
  408. package/scripts/repo/required-checks-logic.ts +4 -1
  409. package/scripts/repo/ruleset-check.ts +4 -3
  410. package/scripts/report/markdown-shape.ts +28 -0
  411. package/scripts/report/report-format-reference.ts +15 -1
  412. package/scripts/report/report-labels.ts +12 -1
  413. package/scripts/report/report-lint-child-summary.ts +94 -0
  414. package/scripts/report/report-lint-cli.ts +26 -7
  415. package/scripts/report/report-lint.ts +2 -20
  416. package/scripts/review/prose-stale-cli.ts +88 -0
  417. package/scripts/review/prose-stale-scan.ts +152 -0
  418. package/scripts/review/review-attest.ts +73 -23
  419. package/scripts/review/review-brief-cli.ts +68 -19
  420. package/scripts/review/review-brief-paths.ts +22 -0
  421. package/scripts/review/review-brief.ts +14 -7
  422. package/scripts/review/review-comment-carry.ts +47 -0
  423. package/scripts/review/review-comment-round.ts +85 -22
  424. package/scripts/review/review-finding-ledger.ts +109 -7
  425. package/scripts/review/review-finding-text.ts +43 -0
  426. package/scripts/review/review-interaction.ts +11 -0
  427. package/scripts/review/review-lane-handover.ts +68 -0
  428. package/scripts/review/review-lint-cli.ts +57 -0
  429. package/scripts/review/review-lint-findings.ts +92 -0
  430. package/scripts/review/review-lint-sections.ts +80 -0
  431. package/scripts/review/review-lint.ts +221 -0
  432. package/scripts/review/review-prior-findings.ts +102 -0
  433. package/scripts/review/review-readers-scan.ts +4 -2
  434. package/scripts/review/review-record-cli.ts +177 -54
  435. package/scripts/review/review-record-code-round.ts +55 -0
  436. package/scripts/review/review-record-comment.ts +60 -0
  437. package/scripts/review/review-record-interaction.ts +35 -0
  438. package/scripts/review/review-record-pinned.ts +108 -0
  439. package/scripts/review/review-record.ts +25 -1
  440. package/scripts/review/review-reviewed-tree.ts +307 -0
  441. package/scripts/review/review-round-one-closure.ts +62 -0
  442. package/scripts/review/review-round-reuse.ts +106 -0
  443. package/scripts/review/review-round2-cli.ts +91 -29
  444. package/scripts/review/review-round2-skip-comment.ts +55 -0
  445. package/scripts/review/review-round2.ts +24 -8
  446. package/scripts/review/review-stamps.ts +7 -3
  447. package/scripts/review/review-stop-log.ts +20 -6
  448. package/scripts/review/review-stops-cli.ts +2 -1
  449. package/scripts/review/review-submit-cli.ts +101 -0
  450. package/scripts/rules/agent-model.ts +1 -1
  451. package/scripts/rules/bash-triggers.ts +3 -3
  452. package/scripts/rules/concise-reply.ts +88 -0
  453. package/scripts/rules/credential-body.ts +77 -0
  454. package/scripts/rules/decision-oracle.ts +1 -1
  455. package/scripts/rules/delivered-rules.ts +36 -17
  456. package/scripts/rules/destructive-command.ts +3 -11
  457. package/scripts/rules/direct-issue-comment.ts +34 -12
  458. package/scripts/rules/direct-issue-read.ts +191 -0
  459. package/scripts/rules/direct-pr-create.ts +4 -24
  460. package/scripts/rules/early-heartbeat.ts +2 -0
  461. package/scripts/rules/edit-tool.ts +27 -0
  462. package/scripts/rules/file-edit-rows.ts +17 -0
  463. package/scripts/rules/file-rewrite.ts +146 -0
  464. package/scripts/rules/firing-point.ts +3 -2
  465. package/scripts/rules/gh-api.ts +128 -7
  466. package/scripts/rules/gh-repo-selector.ts +84 -0
  467. package/scripts/rules/git-force.ts +2 -2
  468. package/scripts/rules/guard-remedy.ts +14 -5
  469. package/scripts/rules/implementation-cut.ts +61 -28
  470. package/scripts/rules/investigator-foreground.ts +231 -0
  471. package/scripts/rules/issue-citation.ts +15 -60
  472. package/scripts/rules/issue-comments.ts +9 -4
  473. package/scripts/rules/josh-git-bare.ts +1 -1
  474. package/scripts/rules/lane-background.ts +41 -13
  475. package/scripts/rules/lane-direct-tool.ts +107 -9
  476. package/scripts/rules/lane-interactive-ask.ts +4 -1
  477. package/scripts/rules/lane-park.ts +4 -2
  478. package/scripts/rules/lane-spilled-read.ts +90 -0
  479. package/scripts/rules/lane-split-park.ts +1 -1
  480. package/scripts/rules/lane-switch-main.ts +4 -4
  481. package/scripts/rules/last-prompt.ts +20 -47
  482. package/scripts/rules/oracle-consulted.ts +1 -1
  483. package/scripts/rules/permission-guards.ts +5 -1
  484. package/scripts/rules/piped-verification-shapes.ts +110 -0
  485. package/scripts/rules/piped-verification.ts +67 -17
  486. package/scripts/rules/poll-loop.ts +72 -9
  487. package/scripts/rules/pr-merge.ts +5 -5
  488. package/scripts/rules/pre-gate-cut.ts +3 -3
  489. package/scripts/rules/protected-files.ts +88 -24
  490. package/scripts/rules/reply-language.ts +3 -17
  491. package/scripts/rules/reply-prose.ts +34 -0
  492. package/scripts/rules/repo-admin.ts +132 -0
  493. package/scripts/rules/reviewer-foreground.ts +88 -0
  494. package/scripts/rules/round-one-check-related.ts +120 -0
  495. package/scripts/rules/rule-body-guard.ts +5 -15
  496. package/scripts/rules/rule-value-cache.ts +53 -5
  497. package/scripts/rules/rule-value-candidates.ts +84 -0
  498. package/scripts/rules/rule-value-cli.ts +59 -11
  499. package/scripts/rules/rule-value.ts +17 -4
  500. package/scripts/rules/run-tail-rule.ts +1 -1
  501. package/scripts/rules/sed-in-place.ts +196 -0
  502. package/scripts/rules/shell-segments.ts +10 -2
  503. package/scripts/rules/stop-rule-rows.ts +1 -13
  504. package/scripts/rules/stop-rules.ts +33 -58
  505. package/scripts/rules/test-declared-commit.ts +1 -1
  506. package/scripts/rules/third-party-write.ts +110 -23
  507. package/scripts/rules/timed-rerun.ts +1 -1
  508. package/scripts/rules/turn-filings.ts +90 -0
  509. package/scripts/rules/worktree-guard.ts +22 -7
  510. package/scripts/run/board/run-board-ending-reason.ts +6 -2
  511. package/scripts/run/board/run-board-fit.ts +24 -1
  512. package/scripts/run/board/run-board-found.ts +134 -0
  513. package/scripts/run/board/run-board-header.ts +8 -0
  514. package/scripts/run/board/run-board-labels.ts +11 -1
  515. package/scripts/run/board/run-board-lane-time.ts +1 -0
  516. package/scripts/run/board/run-board-link.ts +15 -2
  517. package/scripts/run/board/run-board-notes.ts +7 -1
  518. package/scripts/run/board/run-board-operation.ts +4 -2
  519. package/scripts/run/board/run-board-phase.ts +2 -5
  520. package/scripts/run/board/run-board-plan.ts +1 -1
  521. package/scripts/run/board/run-board-read.ts +46 -1
  522. package/scripts/run/board/run-board-reason.ts +20 -8
  523. package/scripts/run/board/run-board-render-checks.ts +3 -2
  524. package/scripts/run/board/run-board-render-drawn.ts +11 -0
  525. package/scripts/run/board/run-board-render-found.ts +157 -0
  526. package/scripts/run/board/run-board-render-lead.ts +9 -0
  527. package/scripts/run/board/run-board-render-legend.ts +19 -0
  528. package/scripts/run/board/run-board-render-tail.ts +1 -1
  529. package/scripts/run/board/run-board-render.ts +82 -18
  530. package/scripts/run/board/run-board-spin.ts +1 -3
  531. package/scripts/run/board/run-board-status.ts +2 -0
  532. package/scripts/run/board/run-board-tick.ts +39 -10
  533. package/scripts/run/carry/run-carry-ended.ts +3 -2
  534. package/scripts/run/carry/run-carry.ts +3 -2
  535. package/scripts/run/cut/run-cut-cli.ts +33 -133
  536. package/scripts/run/cut/run-cut-digest.ts +152 -0
  537. package/scripts/run/cut/run-cut-handoff.ts +52 -8
  538. package/scripts/run/cut/run-cut-report.ts +24 -3
  539. package/scripts/run/cut/run-cut-resume.ts +129 -0
  540. package/scripts/run/cut/run-cut-review.ts +105 -0
  541. package/scripts/run/cut/run-cut.ts +18 -7
  542. package/scripts/run/detached-launch.ts +1 -1
  543. package/scripts/run/entry/run-entry-cli.ts +88 -19
  544. package/scripts/run/entry/run-entry-spill.ts +83 -0
  545. package/scripts/run/entry/run-entry-stop.ts +5 -1
  546. package/scripts/run/entry/run-entry-trust.ts +91 -0
  547. package/scripts/run/event/run-event-baseline.ts +56 -0
  548. package/scripts/run/event/run-event-filed.ts +9 -3
  549. package/scripts/run/event/run-event-overrun.ts +197 -0
  550. package/scripts/run/event/run-event-render.ts +4 -0
  551. package/scripts/run/event/run-event-stream.ts +25 -3
  552. package/scripts/run/hold/run-stop-notify.ts +3 -8
  553. package/scripts/run/merge/run-merge-cap.ts +57 -0
  554. package/scripts/run/merge/run-merge-cli.ts +66 -23
  555. package/scripts/run/merge/run-merge-outcome.ts +2 -0
  556. package/scripts/run/merge/run-merge-ship.ts +13 -3
  557. package/scripts/run/merge/run-merge-signals.ts +40 -23
  558. package/scripts/run/merge/run-merge-steps.ts +56 -36
  559. package/scripts/run/merge/run-merge-usage-limit.ts +53 -0
  560. package/scripts/run/merge/run-merge-withdrawn.ts +53 -0
  561. package/scripts/run/merge/run-merge.ts +41 -14
  562. package/scripts/run/review/run-review-cli.ts +306 -20
  563. package/scripts/run/review/run-review-early-push.ts +121 -0
  564. package/scripts/run/review/run-review-join-read.ts +94 -0
  565. package/scripts/run/review/run-review-pinned-accepted.ts +126 -0
  566. package/scripts/run/review/run-review-pinned-join.ts +216 -0
  567. package/scripts/run/review/run-review-pinned-steps.ts +383 -0
  568. package/scripts/run/review/run-review-pinned-tree.ts +37 -0
  569. package/scripts/run/review/run-review-pinned.ts +53 -0
  570. package/scripts/run/review/run-review-steps.ts +70 -34
  571. package/scripts/run/review/run-review.ts +26 -6
  572. package/scripts/run/run-parent-cut-hook.ts +3 -4
  573. package/scripts/run/run-prep.ts +1 -0
  574. package/scripts/run/run-stage-read.ts +2 -6
  575. package/scripts/run/run-step-cli.ts +17 -5
  576. package/scripts/run/run-step-lane-plan.ts +27 -0
  577. package/scripts/run/run-step-section.ts +26 -7
  578. package/scripts/run/run-step.ts +5 -2
  579. package/scripts/run/ship/run-ship-args.ts +19 -0
  580. package/scripts/run/ship/run-ship-brokered-review.ts +106 -0
  581. package/scripts/run/ship/run-ship-cli.ts +131 -39
  582. package/scripts/run/ship/run-ship-conflict-probe.ts +59 -0
  583. package/scripts/run/ship/run-ship-detach.ts +10 -4
  584. package/scripts/run/ship/run-ship-handover.ts +106 -0
  585. package/scripts/run/ship/run-ship-infra-retry.ts +16 -1
  586. package/scripts/run/ship/run-ship-lap.ts +63 -0
  587. package/scripts/run/ship/run-ship-next.ts +27 -26
  588. package/scripts/run/ship/run-ship-overlap.ts +8 -3
  589. package/scripts/run/ship/run-ship-place.ts +9 -2
  590. package/scripts/run/ship/run-ship-planned.ts +92 -0
  591. package/scripts/run/ship/run-ship-pre-detach-pinned.ts +197 -0
  592. package/scripts/run/ship/run-ship-pre-detach-timed.ts +7 -8
  593. package/scripts/run/ship/run-ship-pre-detach.ts +77 -23
  594. package/scripts/run/ship/run-ship-preflight.ts +16 -4
  595. package/scripts/run/ship/run-ship-probe.ts +23 -9
  596. package/scripts/run/ship/run-ship-relaunch-cap.ts +43 -7
  597. package/scripts/run/ship/run-ship-relaunch.ts +51 -0
  598. package/scripts/run/ship/run-ship-return.ts +103 -29
  599. package/scripts/run/ship/run-ship-review-reason.ts +24 -0
  600. package/scripts/run/ship/run-ship-review-steps.ts +230 -59
  601. package/scripts/run/ship/run-ship-review.ts +171 -51
  602. package/scripts/run/ship/run-ship-reviewer.ts +138 -42
  603. package/scripts/run/ship/run-ship-scoped.ts +39 -10
  604. package/scripts/run/ship/run-ship-stage.ts +49 -13
  605. package/scripts/run/ship/run-ship-steps.ts +24 -4
  606. package/scripts/run/ship/run-ship-stop-cause.ts +43 -2
  607. package/scripts/run/ship/run-ship-stop-context.ts +50 -13
  608. package/scripts/run/ship/run-ship-sync.ts +171 -30
  609. package/scripts/run/ship/run-ship-synced-scope.ts +178 -0
  610. package/scripts/run/ship/run-ship-wait-cli.ts +145 -0
  611. package/scripts/run/ship/run-ship-waiter.ts +114 -0
  612. package/scripts/run/ship/run-ship.ts +16 -2
  613. package/scripts/run/wake/run-wake-caffeinate.ts +48 -0
  614. package/scripts/run/wake/run-wake-cli.ts +6 -113
  615. package/scripts/run/wake/run-wake-code.ts +53 -11
  616. package/scripts/run/wake/run-wake-driver.ts +5 -3
  617. package/scripts/run/wake/run-wake-finish.ts +137 -0
  618. package/scripts/run/wake/run-wake-loop.ts +5 -3
  619. package/scripts/run/wake/run-wake-ports.ts +11 -3
  620. package/scripts/run/wake/run-wake-session.ts +2 -0
  621. package/scripts/run/wake/run-wake.ts +3 -2
  622. package/scripts/safe-chain/ci-installer-pin.ts +49 -8
  623. package/scripts/safe-chain/project-config.ts +3 -2
  624. package/scripts/security/secretlint-scan.ts +42 -9
  625. package/scripts/security/security-audit-provision-main.ts +9 -1
  626. package/scripts/security/security-audit-provision.ts +1 -1
  627. package/scripts/security/security-audit.ts +21 -1
  628. package/scripts/security/sonar-file.ts +10 -5
  629. package/scripts/split/split-assess.ts +12 -3
  630. package/scripts/split/split-early-notice.ts +116 -0
  631. package/scripts/split/split-measure.ts +20 -2
  632. package/scripts/split/split-resolution.ts +107 -0
  633. package/scripts/test/direct-importers.ts +185 -0
  634. package/scripts/test/pure-files-entries.ts +83 -0
  635. package/scripts/test/related-heavy-tests.ts +81 -0
  636. package/scripts/test/test-no-base.ts +88 -0
  637. package/scripts/test/test-pinned-cache-logic.ts +363 -0
  638. package/scripts/test/test-pinned-cache.ts +337 -0
  639. package/scripts/test/test-pinned-emit.ts +49 -0
  640. package/scripts/test/test-pinned-functions.ts +116 -0
  641. package/scripts/test/test-pinned-ledger.ts +80 -0
  642. package/scripts/test/test-pinned-logic.ts +208 -20
  643. package/scripts/test/test-pinned-main.ts +84 -18
  644. package/scripts/test/test-pinned-pool.ts +73 -0
  645. package/scripts/test/test-pinned-probe.ts +254 -0
  646. package/scripts/test/test-pinned-prune-logic.ts +118 -0
  647. package/scripts/test/test-pinned-reach.ts +194 -0
  648. package/scripts/test/test-pinned-record.ts +196 -0
  649. package/scripts/test/test-pinned-rewire.ts +148 -0
  650. package/scripts/test/test-pinned-spawn.ts +81 -0
  651. package/scripts/test/test-pinned-stage.ts +70 -0
  652. package/scripts/test/test-pinned.ts +258 -47
  653. package/scripts/test/test-reach-cli.ts +61 -0
  654. package/scripts/test/test-read-map.ts +35 -11
  655. package/scripts/test/test-read-recording.ts +17 -5
  656. package/scripts/test/test-read-trace.ts +26 -8
  657. package/scripts/test/test-red-logic.ts +46 -7
  658. package/scripts/test/test-red.ts +34 -14
  659. package/scripts/test/test-related-claim.ts +37 -0
  660. package/scripts/test/test-related-main.ts +4 -1
  661. package/scripts/test/test-related-moved.ts +91 -0
  662. package/scripts/test/test-related-record.ts +43 -23
  663. package/scripts/test/test-related-scope.ts +99 -34
  664. package/scripts/test/test-related-synced.ts +135 -0
  665. package/scripts/test/test-related-touched.ts +84 -0
  666. package/scripts/test/test-related.ts +167 -83
  667. package/scripts/test/test-unit-guard.ts +28 -5
  668. package/scripts/test/unit-durations.ts +41 -0
  669. package/scripts/test/unit-worker-share.ts +5 -4
  670. package/scripts/test/vitest-cache-directory.ts +19 -0
  671. package/scripts/test/vitest-cli-excludes.ts +14 -0
  672. package/scripts/test/vitest-failure-summary.ts +111 -0
  673. package/scripts/test/whole-suite-files.ts +12 -1
  674. package/scripts/time-runtime/time-batch-guard.ts +42 -4
  675. package/scripts/time-runtime/time-bundle-call.ts +1 -1
  676. package/scripts/time-runtime/time-bundles.ts +36 -5
  677. package/scripts/time-runtime/time-markers.ts +2 -2
  678. package/scripts/time-runtime/time-search-call.ts +38 -0
  679. package/scripts/time-runtime/time-shell.ts +1 -1
  680. package/scripts/time-runtime/time-transcript-line.ts +17 -5
  681. package/scripts/version/development-engines-verdict.ts +124 -0
  682. package/scripts/version/latest-corepack.ts +2 -0
  683. package/templates/gitignore +2 -0
  684. package/templates/workflows/ci.yml +41 -0
  685. package/dist/hooks/chunk-AZX4FGQ3.js +0 -207
  686. package/dist/hooks/chunk-PT5R6UJD.js +0 -7131
  687. package/dist/hooks/chunk-TUIFS5E7.js +0 -72
  688. package/dist/hooks/chunk-YCDOIR3I.js +0 -3456
  689. package/scripts/cost-runtime/context-cut-threshold.ts +0 -11
  690. package/scripts/rules/filing-cap.ts +0 -139
@@ -1,6 +1,6 @@
1
- import { existsSync, readFileSync } from 'node:fs'
1
+ import { existsSync } from 'node:fs'
2
2
  import path from 'node:path'
3
- import { gate_plan } from '#scripts/gate/gate-plan'
3
+ import { gate_labels } from '#scripts/gate/gate-labels'
4
4
  import type { GateTree } from '#scripts/gate/gate-tree'
5
5
  import { input_fingerprint } from '#scripts/gate/input-fingerprint'
6
6
  import { moved_paths } from '#scripts/gate/moved-paths'
@@ -9,9 +9,17 @@ import { since_green } from '#scripts/gate/since-green'
9
9
  import { changed_file_scope } from '#scripts/git/changed-file-scope'
10
10
  import { changed_paths } from '#scripts/git/changed-paths'
11
11
  import { review_stamps } from '#scripts/review/review-stamps'
12
+ import { direct_importers } from './direct-importers'
13
+ import { pure_files_entries } from './pure-files-entries'
14
+ import { related_heavy_tests } from './related-heavy-tests'
15
+ import { test_no_base } from './test-no-base'
12
16
  import { test_read_map, type ReadMap } from './test-read-map'
17
+ import { test_related_claim } from './test-related-claim'
18
+ import { test_related_moved, type ChangeReading } from './test-related-moved'
13
19
  import { test_related_record, type RunInput } from './test-related-record'
14
- import { related_scope, type RelatedScope, type ScopeRequest } from './test-related-scope'
20
+ import { related_scope, type RelatedScope } from './test-related-scope'
21
+ import { test_related_synced } from './test-related-synced'
22
+ import { test_related_touched } from './test-related-touched'
15
23
  import { test_unit_guard } from './test-unit-guard'
16
24
 
17
25
  // `josh test:related` — the unit check an implementation loop runs between edits.
@@ -36,15 +44,6 @@ function conclusive_tree(before: GateTree | undefined): GateTree | undefined {
36
44
  return test_unit_guard.is_running(process.cwd()) ? before : undefined
37
45
  }
38
46
 
39
- // The change a narrowing reads, and the map it reads it against. `is_unmoved` is the since-green
40
- // reading's positive fact that nothing moved since this command was last green on this checkout.
41
- // `synced` is the part of the change a main sync brought in, kept for the run's ledger record, and
42
- // `since_map` the part the change since the map's tree joined to what this change moved.
43
- type ChangeReading = Pick<ScopeRequest, 'changed' | 'map' | 'since_map'> & {
44
- is_unmoved?: true
45
- synced?: ReadonlyArray<string>
46
- }
47
-
48
47
  // A failure answers `undefined` rather than an empty list: the two are opposite inputs to
49
48
  // `resolve_scope`, and only one of them means "could not tell".
50
49
  async function read_or_undefined(
@@ -84,8 +83,8 @@ async function change_since(
84
83
 
85
84
  // **The map's tree is whichever lane last ran the whole suite green**, so the change since it holds that
86
85
  // lane's own branch change too (joshuafolkken/kit#4527). What this branch did not change is marked
87
- // `since_map`: it still reaches its readers — a source file only when it names what moved — but only
88
- // this branch's change can send the run to the whole suite. A branch change git cannot read marks nothing.
86
+ // `since_map`: it reaches vitest only as a code file naming what moved, and only this branch's change
87
+ // can send the run to the whole suite (joshuafolkken/kit#4896). A branch change git cannot read marks nothing.
89
88
  async function map_change(root: string, map: ReadMap): Promise<ChangeReading> {
90
89
  const changed = await change_since(root, map)
91
90
 
@@ -101,8 +100,8 @@ async function map_change(root: string, map: ReadMap): Promise<ChangeReading> {
101
100
  // Explicit file arguments win over the git reading, which is what makes the narrowing testable by
102
101
  // hand and usable from a hook that already knows which file it just wrote. **The map still answers
103
102
  // only for the change since its tree**, so that change joins the arguments: a test added since the
104
- // map was recorded is in no entry, and only its own appearance in the change runs it — a source file
105
- // there only when it names a file the arguments moved (`naming_moved`).
103
+ // map was recorded is in no entry, and only its own appearance in the change runs it — when it names
104
+ // a file the arguments moved (`naming_moved`), as a source file there does.
106
105
  async function explicit_change(
107
106
  root: string,
108
107
  explicit: ReadonlyArray<string>,
@@ -118,34 +117,29 @@ async function explicit_change(
118
117
  return { changed: [...named, ...since_map], map, since_map }
119
118
  }
120
119
 
121
- // **A non-code file a main sync brought in is not this branch's change** (joshuafolkken/kit#4572), so it
122
- // joins `since_map`: it still reaches the tests reading it, but never sends the run to the whole suite —
123
- // main's CI verified it. A synced module stays a moved file, so `vitest related` still walks to the
124
- // tests importing it, a branch-only one among them. A branch change git cannot read marks nothing.
125
- async function synced_data(synced: ReadonlyArray<string>): Promise<ReadonlyArray<string>> {
126
- const data = synced.filter((file) => !related_scope.is_relatable(file))
127
-
128
- if (data.length === 0) return []
129
-
130
- const branch = (await branch_change()) ?? data
120
+ // **The whole-suite leg never narrows by a green a bare run recorded past a file every test imports**:
121
+ // that green vouches only for the file's direct importers (joshuafolkken/kit#5122), so while this
122
+ // branch changes one, the gate's unit leg reads the whole branch change.
123
+ async function is_green_narrowable(is_whole: boolean): Promise<boolean> {
124
+ if (!is_whole) return true
131
125
 
132
- return data.filter((file) => !branch.includes(file))
126
+ return direct_importers.every_test_imports_of((await branch_change()) ?? []).length === 0
133
127
  }
134
128
 
135
129
  // **What moved since this command's last green run** (`since-green.ts`), read as explicit arguments
136
130
  // are. A moved file — code or not — reaches the tests reading it as data through the map, whose
137
131
  // entries hold no module that started reading it after the map's tree; the change since that tree
138
- // joins the list — its test files, and a source file only when it names a moved file
139
- // (`naming_moved`) — so such a module runs the tests importing it. Nothing moved runs nothing; no map,
132
+ // joins the list — a code file of it only when it names a moved file (`naming_moved`) — so such a
133
+ // module runs the tests importing it. Nothing moved runs nothing; no map,
140
134
  // or one git can no longer diff against, answers `undefined`, which reads the whole branch change.
141
135
  async function since_green_change(
142
136
  root: string,
143
137
  map: ReadMap | undefined,
138
+ is_whole: boolean,
144
139
  ): Promise<ChangeReading | undefined> {
145
- const parts = await since_green.read_moved_parts(
146
- review_stamps.test_related_stamp,
147
- gate_plan.UNIT_LABEL,
148
- )
140
+ const parts = (await is_green_narrowable(is_whole))
141
+ ? await since_green.read_moved_parts(review_stamps.test_related_stamp, gate_labels.UNIT_LABEL)
142
+ : undefined
149
143
 
150
144
  if (parts === undefined) return undefined
151
145
 
@@ -153,37 +147,50 @@ async function since_green_change(
153
147
 
154
148
  if (moved.length === 0) return { changed: [], map, is_unmoved: true }
155
149
 
156
- const change = await explicit_change(root, moved, map)
150
+ const branch = await branch_change()
151
+ const split = await test_related_synced.split(root, parts.synced, branch, map)
152
+ const change = await explicit_change(
153
+ root,
154
+ test_related_moved.narrowed_moved(moved, split, branch, map),
155
+ map,
156
+ )
157
157
 
158
158
  if (change.map === undefined) return undefined
159
159
 
160
160
  process.stdout.write(`${since_green.describe(related_scope.COMMAND_LABEL, moved)}\n`)
161
161
 
162
- const since_map = [...(change.since_map ?? []), ...(await synced_data(parts.synced))]
163
-
164
- return { ...change, since_map, synced: parts.synced }
162
+ return test_related_moved.moved_reading(change, parts, branch, split)
165
163
  }
166
164
 
167
- async function whole_change(root: string, map: ReadMap | undefined): Promise<ChangeReading> {
168
- const since = await since_green_change(root, map)
165
+ async function whole_change(
166
+ root: string,
167
+ map: ReadMap | undefined,
168
+ is_whole: boolean,
169
+ ): Promise<ChangeReading> {
170
+ const since = await since_green_change(root, map, is_whole)
169
171
 
170
172
  if (since !== undefined) return since
171
173
 
172
174
  return map === undefined ? { changed: await branch_change(), map } : await map_change(root, map)
173
175
  }
174
176
 
177
+ function explicit_files(root: string, command_arguments: ReadonlyArray<string>): Array<string> {
178
+ return command_arguments
179
+ .filter((argument) => !changed_file_scope.is_flag(argument))
180
+ .map((file) => path.relative(root, path.resolve(file)))
181
+ }
182
+
175
183
  async function read_change(
176
184
  root: string,
177
185
  command_arguments: ReadonlyArray<string>,
186
+ is_whole: boolean,
178
187
  ): Promise<ChangeReading> {
179
188
  const map = test_read_map.read_map(root)
180
- const explicit = command_arguments
181
- .filter((argument) => !changed_file_scope.is_flag(argument))
182
- .map((file) => path.relative(root, path.resolve(file)))
189
+ const explicit = explicit_files(root, command_arguments)
183
190
 
184
191
  return explicit.length > 0
185
192
  ? await explicit_change(root, explicit, map)
186
- : await whole_change(root, map)
193
+ : await whole_change(root, map, is_whole)
187
194
  }
188
195
 
189
196
  // **The changed non-code files the map's tree held and that did not already differ from it** — the
@@ -203,41 +210,50 @@ async function recorded_files(change: ChangeReading): Promise<ReadonlySet<string
203
210
  )
204
211
  }
205
212
 
206
- function text_of(file_path: string): string {
207
- try {
208
- return readFileSync(file_path, 'utf8')
209
- } catch {
210
- return ''
211
- }
212
- }
213
-
214
- // Each file's text is read once, however many names it is checked for.
215
- function names_any(text: string, names: ReadonlyArray<string>): boolean {
216
- return names.some((name) => text.includes(name))
217
- }
218
-
219
213
  // **The code files of the change since the map that name a file this change moved** — read off their
220
214
  // text, the one place a file-system read added since the map's tree shows (`is_code_input` in
221
- // `test-related-scope.ts`, joshuafolkken/kit#4532). A file the tree no longer holds names nothing.
215
+ // `test-related-scope.ts`, joshuafolkken/kit#4532). A file the tree no longer holds names nothing. A
216
+ // file every test depends on is never one: handed to vitest it runs the whole suite unannounced, and
217
+ // only this branch's own change of it may do that (joshuafolkken/kit#4993). **Only this branch's own
218
+ // change names**, where it was read: a main sync's file — a shared test, or one main deleted — would
219
+ // match main's own sources, which vitest widens to hundreds of tests (joshuafolkken/kit#5041).
222
220
  function naming_moved(root: string, change: ChangeReading): ReadonlySet<string> {
223
- const { changed = [], since_map = [] } = change
221
+ const { changed = [], since_map = [], branch = changed } = change
224
222
  const names = changed
225
- .filter((file) => !since_map.includes(file))
223
+ .filter((file) => !since_map.includes(file) && branch.includes(file))
226
224
  .map((file) => path.basename(file))
227
- const code = since_map.filter((file) => related_scope.is_relatable(file))
225
+ const code = since_map.filter(
226
+ (file) => related_scope.is_relatable(file) && !test_related_moved.is_whole_suite(file),
227
+ )
228
228
 
229
- return new Set(code.filter((file) => names_any(text_of(path.join(root, file)), names)))
229
+ // Each file's text is read once, however many names it is checked for.
230
+ return new Set(
231
+ code.filter((file) =>
232
+ test_no_base.names_any(test_no_base.text_of(path.join(root, file)), names),
233
+ ),
234
+ )
230
235
  }
231
236
 
232
- async function scope_of(root: string, change: ChangeReading): Promise<RelatedScope> {
237
+ // A file every test imports narrows to its direct importers unless `is_whole`: the gate's unit leg, and
238
+ // the gate's reuse of it, keep the whole suite for it (`gate_labels.KEEP_WHOLE_SUITE_FLAG`).
239
+ async function scope_of(
240
+ root: string,
241
+ change: ChangeReading,
242
+ is_whole: boolean,
243
+ ): Promise<RelatedScope> {
233
244
  const recorded = await recorded_files(change)
234
245
  const naming = naming_moved(root, change)
246
+ const pure_entries = await pure_files_entries.read_moved(root, change.changed)
247
+ const narrowed = is_whole ? [] : (change.changed ?? [])
248
+ const importers = await direct_importers.every_test_importers(root, narrowed)
235
249
 
236
250
  return related_scope.resolve_scope({
237
251
  root,
238
252
  ...change,
239
253
  recorded,
240
254
  naming_moved: naming,
255
+ pure_entries,
256
+ every_test_importers: importers,
241
257
  is_present: existsSync,
242
258
  })
243
259
  }
@@ -246,7 +262,7 @@ async function scope_of(root: string, change: ChangeReading): Promise<RelatedSco
246
262
  // narrows with, so the gate's reuse of a green unit step (`check-inputs.ts`) can never trust a change
247
263
  // this command would have run tests for. Unknown reaches: no map, or one recorded on a tree git can
248
264
  // no longer diff against. The change since the map joins the paths as it does for explicit
249
- // arguments, so a test added or edited after the map was recorded still reaches.
265
+ // arguments, so a test added or edited after the map was recorded still reaches when it names a path.
250
266
  async function reaches_tests(root: string, paths: ReadonlyArray<string>): Promise<boolean> {
251
267
  if (paths.length === 0) return false
252
268
 
@@ -254,7 +270,7 @@ async function reaches_tests(root: string, paths: ReadonlyArray<string>): Promis
254
270
 
255
271
  if (change.map === undefined) return true
256
272
 
257
- const scope = await scope_of(root, change)
273
+ const scope = await scope_of(root, change, true)
258
274
 
259
275
  return scope.mode !== 'none'
260
276
  }
@@ -273,32 +289,46 @@ async function run_scope(
273
289
  return 0
274
290
  }
275
291
 
276
- return await test_unit_guard.run_guarded_vitest(
277
- process.cwd(),
278
- related_scope.vitest_arguments(scope, changed_file_scope.flags_of(command_arguments)),
279
- related_scope.COMMAND_NAME,
280
- description,
292
+ const vitest_arguments = related_scope.vitest_arguments(scope, [
293
+ ...changed_file_scope.flags_of(command_arguments),
294
+ ...related_heavy_tests.exclude_flags(scope, root),
295
+ ])
296
+
297
+ return await test_related_claim.with_unit_claim(
298
+ scope.mode === 'related' ? scope.files : undefined,
299
+ async () =>
300
+ await test_unit_guard.run_guarded_vitest(
301
+ process.cwd(),
302
+ vitest_arguments,
303
+ related_scope.COMMAND_NAME,
304
+ description,
305
+ ),
281
306
  )
282
307
  }
283
308
 
284
- async function resolve_change(root: string, change: ChangeReading): Promise<RelatedScope> {
309
+ async function resolve_change(
310
+ root: string,
311
+ change: ChangeReading,
312
+ is_whole: boolean,
313
+ ): Promise<RelatedScope> {
285
314
  const { UNMOVED_REASON } = related_scope
286
315
 
287
316
  if (change.is_unmoved === true) return { mode: 'none', files: [], reason: UNMOVED_REASON }
288
317
 
289
- return await scope_of(root, change)
318
+ return await scope_of(root, change, is_whole)
290
319
  }
291
320
 
292
321
  async function read_run_input(
293
322
  root: string,
294
323
  command_arguments: ReadonlyArray<string>,
324
+ is_whole: boolean,
295
325
  ): Promise<RunInput> {
296
- const change = await read_change(root, command_arguments)
297
- const scope = await resolve_change(root, change)
326
+ const change = await read_change(root, command_arguments, is_whole)
327
+ const scope = await resolve_change(root, change, is_whole)
298
328
 
299
- const { changed, synced = [], since_map = [] } = change
329
+ const { changed, synced = [], since_map = [], branch } = change
300
330
 
301
- return { scope, root, changed, synced, since_map }
331
+ return { scope, root, changed, synced, since_map, branch }
302
332
  }
303
333
 
304
334
  // Every run is timed and counted into the lane ledger (joshuafolkken/kit#4465).
@@ -319,20 +349,74 @@ async function run_and_record(
319
349
  return exit_code
320
350
  }
321
351
 
322
- async function run_related_tests(command_arguments: ReadonlyArray<string>): Promise<number> {
323
- const root = await changed_file_scope.repository_root_or_cwd()
324
- const input = await read_run_input(root, command_arguments)
352
+ // **The no-base pass is part of the run's verdict**, so a green record — the one `josh ship` and the
353
+ // gate reuse — never vouches for a tree whose base-touching code fails in CI's checkout. It runs
354
+ // only after a green first pass (`test-no-base.ts`), and only over this branch's own files: those
355
+ // the map's tree or a main sync joined were verified by main's CI.
356
+ async function with_no_base_pass(
357
+ input: RunInput,
358
+ command_arguments: ReadonlyArray<string>,
359
+ exit_code: number,
360
+ ): Promise<number> {
361
+ if (exit_code !== 0) return exit_code
362
+
363
+ const flags = changed_file_scope.flags_of(command_arguments)
364
+ const joined = new Set([...input.since_map, ...input.synced])
365
+ const own = (input.changed ?? []).filter((file) => !joined.has(file))
325
366
 
326
- // A non-code argument is resolved through the map rather than handed to vitest, so only the
327
- // code arguments can be ones vitest was not given.
367
+ return await test_no_base.run_if_touched(input.root, own, flags)
368
+ }
369
+
370
+ // A non-code argument is resolved through the map, and a file every test imports through its
371
+ // importers, rather than handed to vitest, so only the other code arguments can be ones vitest was not
372
+ // given.
373
+ function report_unhanded(
374
+ root: string,
375
+ command_arguments: ReadonlyArray<string>,
376
+ scope: RelatedScope,
377
+ ): void {
328
378
  changed_file_scope.report_unusable_arguments(
329
- command_arguments.filter((argument) => related_scope.is_relatable(argument)),
330
- input.scope,
379
+ command_arguments.filter(
380
+ (argument) =>
381
+ related_scope.is_relatable(argument) &&
382
+ !direct_importers.is_every_test_import(root, argument),
383
+ ),
384
+ scope,
331
385
  related_scope.COMMAND_LABEL,
332
386
  )
387
+ }
388
+
389
+ // **A `--touched` run is the implementation loop's** (`test-related-touched.ts`): it reads its scope off
390
+ // the change alone and leaves no green record, so `josh review:brief` and the gate's reuse count only
391
+ // a full-reach run.
392
+ async function run_touched(given: ReadonlyArray<string>): Promise<number> {
393
+ const { TOUCHED_FLAG, TOUCHED_KIND } = test_related_touched
394
+ const command_arguments = given.filter((argument) => argument !== TOUCHED_FLAG)
395
+ const root = await changed_file_scope.repository_root_or_cwd()
396
+ const explicit = explicit_files(root, command_arguments)
397
+ const changed = explicit.length > 0 ? explicit : await branch_change()
398
+ const scope = test_related_touched.touched_scope(root, changed)
399
+ const input = { scope, root, changed, synced: [], since_map: [], kind: TOUCHED_KIND }
400
+
401
+ return await run_and_record(input, command_arguments)
402
+ }
403
+
404
+ async function run_related_tests(given: ReadonlyArray<string>): Promise<number> {
405
+ if (given.includes(test_related_touched.TOUCHED_FLAG)) return await run_touched(given)
406
+
407
+ const { KEEP_WHOLE_SUITE_FLAG } = gate_labels
408
+ const command_arguments = given.filter((argument) => argument !== KEEP_WHOLE_SUITE_FLAG)
409
+ const root = await changed_file_scope.repository_root_or_cwd()
410
+ const input = await read_run_input(root, command_arguments, given.includes(KEEP_WHOLE_SUITE_FLAG))
411
+
412
+ report_unhanded(root, command_arguments, input.scope)
333
413
 
334
414
  const before = await scoped_green.read_before(command_arguments)
335
- const exit_code = await run_and_record(input, command_arguments)
415
+ const exit_code = await with_no_base_pass(
416
+ input,
417
+ command_arguments,
418
+ await run_and_record(input, command_arguments),
419
+ )
336
420
 
337
421
  await scoped_green.record_if_green(review_stamps.test_related_stamp, {
338
422
  before: conclusive_tree(before),
@@ -11,6 +11,7 @@ import { project_test_script, type ProjectScriptState } from './project-test-scr
11
11
  import { SKIP_MARKER } from './skip-marker'
12
12
  import { test_read_recording, type RecordingEnvironment } from './test-read-recording'
13
13
  import { unit_worker_share } from './unit-worker-share'
14
+ import { vitest_failure_summary } from './vitest-failure-summary'
14
15
 
15
16
  const PNPM = 'pnpm'
16
17
  const FAIL_EXIT_CODE = 1
@@ -203,19 +204,32 @@ async function vitest_share(vitest_arguments: ReadonlyArray<string>): Promise<nu
203
204
  async function execute_vitest(
204
205
  vitest_arguments: ReadonlyArray<string>,
205
206
  recording: RecordingEnvironment,
207
+ directory: string,
206
208
  ): Promise<number> {
209
+ // Shown as it runs and kept as well, so a failed run can end with its summary (joshuafolkken/kit#4869).
207
210
  const result = await execa(PNPM, ['exec', 'vitest', ...vitest_arguments], {
211
+ cwd: directory,
208
212
  env: { ...isolated_unit_environment(), ...recording },
209
213
  extendEnv: false,
210
- stdio: 'inherit',
214
+ stdin: 'inherit',
215
+ stdout: ['inherit', 'pipe'],
216
+ stderr: ['inherit', 'pipe'],
217
+ all: true,
211
218
  reject: false,
212
219
  })
220
+ const exit_code = result.exitCode ?? FAIL_EXIT_CODE
213
221
 
214
- return result.exitCode ?? FAIL_EXIT_CODE
222
+ vitest_failure_summary.report(vitest_arguments, result.all, exit_code)
223
+
224
+ return exit_code
215
225
  }
216
226
 
217
- // A whole-suite run also records the test-read map `josh test:related` narrows by.
218
- async function run_vitest(vitest_arguments: ReadonlyArray<string>): Promise<number> {
227
+ // A whole-suite run also records the test-read map `josh test:related` narrows by. `directory` is
228
+ // where vitest runs — another checkout's for `test-no-base.ts`, this process's otherwise.
229
+ async function run_vitest(
230
+ vitest_arguments: ReadonlyArray<string>,
231
+ directory: string = process.cwd(),
232
+ ): Promise<number> {
219
233
  return await unit_worker_share.with_run_marker(async () => {
220
234
  const sized = [
221
235
  ...vitest_arguments,
@@ -226,11 +240,19 @@ async function run_vitest(vitest_arguments: ReadonlyArray<string>): Promise<numb
226
240
  return await test_read_recording.with_read_recording(
227
241
  root,
228
242
  sized,
229
- async (recording) => await execute_vitest(sized, recording),
243
+ async (recording) => await execute_vitest(sized, recording, directory),
230
244
  )
231
245
  })
232
246
  }
233
247
 
248
+ // The same funnel, run in another checkout of this project — whose `node_modules` is this one's.
249
+ async function run_vitest_in(
250
+ directory: string,
251
+ vitest_arguments: ReadonlyArray<string>,
252
+ ): Promise<number> {
253
+ return await run_vitest(vitest_arguments, directory)
254
+ }
255
+
234
256
  // The label names the command the notice is printed for, so a skipped scoped run says
235
257
  // `josh test:related` rather than reporting itself as the full suite. `SKIP_MARKER` is unchanged
236
258
  // either way: the gate reads that word, never the label.
@@ -297,6 +319,7 @@ const test_unit_guard = {
297
319
  isolated_unit_environment,
298
320
  run_guarded_unit,
299
321
  run_guarded_vitest,
322
+ run_vitest_in,
300
323
  vitest_share,
301
324
  }
302
325
 
@@ -0,0 +1,41 @@
1
+ import { readFileSync } from 'node:fs'
2
+ import path from 'node:path'
3
+
4
+ // The per-file unit durations the CI shards are balanced by (joshuafolkken/kit#4467), read here so
5
+ // the published `josh test:related` can weigh them too (joshuafolkken/kit#5105) — the reporter that
6
+ // refreshes the record is kit-only (`tools/test/unit-duration-record.ts`). A project without the
7
+ // record reads an empty one.
8
+
9
+ type Durations = Readonly<Record<string, number>>
10
+
11
+ const RECORD_FILE = 'tools/test/unit-durations.json'
12
+
13
+ function parse(text: string): Durations {
14
+ const parsed: unknown = JSON.parse(text)
15
+
16
+ if (typeof parsed !== 'object' || parsed === null) return {}
17
+
18
+ return Object.fromEntries(
19
+ Object.entries(parsed).filter(
20
+ (entry): entry is [string, number] => typeof entry[1] === 'number',
21
+ ),
22
+ )
23
+ }
24
+
25
+ // A missing or unreadable record is an empty one: every file then weighs the same fallback.
26
+ function read(root: string): Durations {
27
+ try {
28
+ return parse(readFileSync(path.join(root, RECORD_FILE), 'utf8'))
29
+ } catch {
30
+ return {}
31
+ }
32
+ }
33
+
34
+ const unit_durations = {
35
+ RECORD_FILE,
36
+ parse,
37
+ read,
38
+ }
39
+
40
+ export type { Durations }
41
+ export { unit_durations }
@@ -19,8 +19,9 @@ import { unit_run_marker } from './unit-run-marker'
19
19
  // worker.
20
20
  //
21
21
  // **The division activates only under concurrency.** One run in flight — every solo run, CI included
22
- // — gets exactly the number the gate and the hook produced before this module existed, so a quiet
23
- // machine behaves bit for bit as it did and only the condition that was measured broken changes.
22
+ // — gets no share from it; what bounds a solo run is the claim it was admitted on (`cap_to_claim`),
23
+ // which for a direct run is vitest's own default on a small machine such as a four-core CI runner
24
+ // (`gate_plan.direct_unit_weight`, joshuafolkken/kit#4607).
24
25
  //
25
26
  // **The run markers and their division of the machine are `unit-run-marker.ts`**, the part the vitest
26
27
  // config imports (joshuafolkken/kit#4572); the capacity and claim bounds and the flag handling are here.
@@ -86,8 +87,8 @@ interface UnitClaim {
86
87
  // **The share never exceeds the claim the run was admitted on** (joshuafolkken/kit#4235). The share is
87
88
  // read after admission, when fewer runs may be in flight than when the weight was sized, and a share
88
89
  // wider than the claim puts workers on the machine the ledger does not hold. The claim bounds a solo
89
- // share too: vitest's own choice is one worker per core but one, wider than any weight the ledger
90
- // reserves for a unit run, so leaving it in place would open workers no claim holds. The claim holds
90
+ // share too: vitest's own choice is one worker per core but one, wider than the weight the ledger
91
+ // reserves for a unit run from seven cores up, so leaving it in place would open workers no claim holds. The claim holds
91
92
  // vitest's own process as well, so its workers are the claim less that core.
92
93
  function cap_to_claim(share: number | undefined, claim: UnitClaim | undefined): number | undefined {
93
94
  if (claim === undefined) return share
@@ -0,0 +1,19 @@
1
+ // The Vite cache directory `vitest.config.ts` hands a vitest run in a throwaway tree (joshuafolkken/kit#4770).
2
+ //
3
+ // **A tree from `base-tree.ts` borrows this checkout's `node_modules`**, and vitest keys its dependency
4
+ // optimizer's cache by project name alone, so a `josh test:red` / `josh test:pinned` run beside the gate
5
+ // re-bundled the same `node_modules/.vite/vitest/<hash>/deps_ssr` the gate was importing from, and a gate
6
+ // file failed on a deleted `execa.js`. The tree's run names a directory of its own through
7
+ // `CACHE_DIRECTORY_KEY`; any other run leaves it unset and keeps Vite's default.
8
+
9
+ const CACHE_DIRECTORY_KEY = 'JOSH_VITEST_CACHE_DIR'
10
+
11
+ function config_cache_directory(environment: NodeJS.ProcessEnv = process.env): string | undefined {
12
+ const directory = environment[CACHE_DIRECTORY_KEY] ?? ''
13
+
14
+ return directory === '' ? undefined : directory
15
+ }
16
+
17
+ const vitest_cache_directory = { CACHE_DIRECTORY_KEY, config_cache_directory }
18
+
19
+ export { vitest_cache_directory }
@@ -0,0 +1,14 @@
1
+ // **A command line's `--exclude` reaches both unit projects** (joshuafolkken/kit#5105): vitest applies
2
+ // the flag to the root config alone, which the inline projects of `tools/test/unit-projects.ts` do not
3
+ // inherit, so without this it excluded nothing. `josh test:related` passes it to leave the heavy files
4
+ // out of a scoped run. A leaf module, since `vitest.config.ts` imports it.
5
+
6
+ const EXCLUDE_FLAG = '--exclude'
7
+
8
+ function cli_excludes(argv: ReadonlyArray<string>): Array<string> {
9
+ return argv.slice(1).filter((_argument, index) => argv[index] === EXCLUDE_FLAG)
10
+ }
11
+
12
+ const vitest_cli_excludes = { EXCLUDE_FLAG, cli_excludes }
13
+
14
+ export { vitest_cli_excludes }