@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
@@ -0,0 +1,279 @@
1
+ import path from 'node:path'
2
+ import { input_fingerprint } from '#scripts/gate/input-fingerprint'
3
+ import { file_reader } from '#scripts/lib/read-file'
4
+ import type ts from 'typescript'
5
+
6
+ // What a file's lint verdict reads besides the file itself: every file its imports reach, followed
7
+ // through the project's own files and stopped at a package's. A type-aware rule's verdict on a file
8
+ // is about the types of those, so a cached verdict holds only while all of them do
9
+ // (joshuafolkken/kit#4415).
10
+ //
11
+ // The modules are resolved as the type checker resolves them — the project's `tsconfig.json`, its
12
+ // paths and `package.json` imports — because a resolution of our own would follow a different file
13
+ // than the one whose types the rule read. A package's file is named by its resolved path rather than
14
+ // read: that path carries the installed version, and a package's files change with nothing else.
15
+ const TSCONFIG = 'tsconfig.json'
16
+ const NODE_MODULES = 'node_modules'
17
+ const MODULE_STATEMENT = /^(?:import|export)\b/mu
18
+ const GLOBAL_DECLARATION = /^declare (?:global|module|namespace)\b/mu
19
+
20
+ type TypeScript = typeof ts
21
+
22
+ interface Dependency {
23
+ file: string
24
+ external: boolean
25
+ }
26
+
27
+ interface Resolver {
28
+ typescript: TypeScript
29
+ options: ts.CompilerOptions
30
+ }
31
+
32
+ interface GraphContext extends Resolver {
33
+ root: string
34
+ resolution_cache: ts.ModuleResolutionCache
35
+ ambient: ReadonlyArray<Dependency>
36
+ dependencies: Map<string, ReadonlyArray<Dependency>>
37
+ content_hashes: Map<string, string>
38
+ }
39
+
40
+ interface ProjectConfig {
41
+ options: ts.CompilerOptions
42
+ file_names: ReadonlyArray<string>
43
+ config_files: ReadonlyArray<string>
44
+ }
45
+
46
+ interface ImportGraph {
47
+ closure_hash: (file: string) => string
48
+ }
49
+
50
+ // `typescript` is an optional peer: a project without it has no type-aware rule to go stale.
51
+ async function load_typescript(): Promise<TypeScript | undefined> {
52
+ try {
53
+ const module = await import('typescript')
54
+
55
+ return module.default
56
+ } catch {
57
+ return undefined
58
+ }
59
+ }
60
+
61
+ // A configuration that does not parse fails the type check, which reports it; here it only leaves
62
+ // the options the parse did reach. `config_files` are `tsconfig.json` and every file it extends: a
63
+ // type-aware verdict reads the compiler options — `strict` decides what is `any` — so a changed
64
+ // option is a changed input like a changed import.
65
+ function parsed_config(typescript: TypeScript, root: string): ProjectConfig | undefined {
66
+ const config_file = path.join(root, TSCONFIG)
67
+ if (!typescript.sys.fileExists(config_file)) return undefined
68
+ const source = typescript.readJsonConfigFile(config_file, typescript.sys.readFile)
69
+ const parsed = typescript.parseJsonSourceFileConfigFileContent(
70
+ source,
71
+ typescript.sys,
72
+ root,
73
+ undefined,
74
+ config_file,
75
+ )
76
+
77
+ return {
78
+ options: parsed.options,
79
+ file_names: parsed.fileNames,
80
+ config_files: [config_file, ...(source.extendedSourceFiles ?? [])],
81
+ }
82
+ }
83
+
84
+ // A package is named by its resolved path only while that path sits in an install. A workspace or
85
+ // `link:` package resolves through its symlink to source the project edits — a path that carries no
86
+ // version — so its files are read like the project's own.
87
+ function is_installed(file: string): boolean {
88
+ return file.split(path.sep).includes(NODE_MODULES)
89
+ }
90
+
91
+ function as_dependency(
92
+ file: string | undefined,
93
+ external: boolean | undefined,
94
+ ): Dependency | undefined {
95
+ if (file === undefined) return undefined
96
+
97
+ return { file, external: external === true && is_installed(file) }
98
+ }
99
+
100
+ // A file named by its path from the one naming it: a `/// <reference path>`, or a relative import the
101
+ // checker cannot resolve — a `.svelte` component — whose file is still the one it names.
102
+ function relative_to(specifier: string, file: string): Dependency {
103
+ return { file: path.resolve(path.dirname(file), specifier), external: false }
104
+ }
105
+
106
+ function resolve_module(
107
+ context: GraphContext,
108
+ specifier: string,
109
+ file: string,
110
+ ): Dependency | undefined {
111
+ const { typescript, options, resolution_cache } = context
112
+ const resolved = typescript.resolveModuleName(
113
+ specifier,
114
+ file,
115
+ options,
116
+ typescript.sys,
117
+ resolution_cache,
118
+ ).resolvedModule
119
+
120
+ if (resolved !== undefined) {
121
+ return as_dependency(resolved.resolvedFileName, resolved.isExternalLibraryImport)
122
+ }
123
+
124
+ if (!specifier.startsWith('.')) return undefined
125
+
126
+ return relative_to(specifier, file)
127
+ }
128
+
129
+ function resolve_type(resolver: Resolver, name: string, file: string): Dependency | undefined {
130
+ const { typescript, options } = resolver
131
+ const resolved = typescript.resolveTypeReferenceDirective(
132
+ name,
133
+ file,
134
+ options,
135
+ typescript.sys,
136
+ ).resolvedTypeReferenceDirective
137
+
138
+ return as_dependency(resolved?.resolvedFileName, resolved?.isExternalLibraryImport)
139
+ }
140
+
141
+ function references_of(context: GraphContext, file: string): Array<Dependency | undefined> {
142
+ const processed = context.typescript.preProcessFile(
143
+ file_reader.read_if_readable(file) ?? '',
144
+ true,
145
+ true,
146
+ )
147
+
148
+ return [
149
+ ...processed.importedFiles.map((reference) =>
150
+ resolve_module(context, reference.fileName, file),
151
+ ),
152
+ ...processed.referencedFiles.map((reference) => relative_to(reference.fileName, file)),
153
+ ...processed.typeReferenceDirectives.map((reference) =>
154
+ resolve_type(context, reference.fileName, file),
155
+ ),
156
+ ]
157
+ }
158
+
159
+ function direct_dependencies(context: GraphContext, file: string): ReadonlyArray<Dependency> {
160
+ const known = context.dependencies.get(file)
161
+ if (known !== undefined) return known
162
+ const found = references_of(context, file).filter((dependency) => dependency !== undefined)
163
+
164
+ context.dependencies.set(file, found)
165
+
166
+ return found
167
+ }
168
+
169
+ // A file reaches files that never import it when it is a script or declares a global or a module —
170
+ // SvelteKit's `src/app.d.ts` `App.Locals`, say, or a `.ts` module's `declare global` augmentation;
171
+ // one that only exports is read through its imports like any other module.
172
+ function is_ambient(file: string): boolean {
173
+ const content = file_reader.read_if_readable(file) ?? ''
174
+
175
+ return GLOBAL_DECLARATION.test(content) || !MODULE_STATEMENT.test(content)
176
+ }
177
+
178
+ // What every file reads without importing it: the project's ambient declarations, the type packages
179
+ // its compiler options load (`types`, or every `@types` package when it is unset), and the
180
+ // configuration files those options come from.
181
+ function ambient_of(resolver: Resolver, root: string, config: ProjectConfig): Array<Dependency> {
182
+ const config_file = path.join(root, TSCONFIG)
183
+ const declarations = [
184
+ ...config.file_names.filter((file) => is_ambient(file)),
185
+ ...config.config_files,
186
+ ].map((file) => ({ file, external: false }))
187
+ const types = resolver.typescript
188
+ .getAutomaticTypeDirectiveNames(resolver.options, resolver.typescript.sys)
189
+ .map((name) => resolve_type(resolver, name, config_file))
190
+ .filter((dependency) => dependency !== undefined)
191
+
192
+ return [...declarations, ...types]
193
+ }
194
+
195
+ function content_hash(context: GraphContext, file: string): string {
196
+ const known = context.content_hashes.get(file)
197
+ if (known !== undefined) return known
198
+ const computed = input_fingerprint.of_file(file)
199
+
200
+ context.content_hashes.set(file, computed)
201
+
202
+ return computed
203
+ }
204
+
205
+ // Every file the imports reach, the starting file excluded: its own content is the cache's key
206
+ // already, and a file that imports itself through a cycle is still only that one key.
207
+ function is_unvisited(
208
+ dependency: Dependency,
209
+ start: string,
210
+ reached: Map<string, Dependency>,
211
+ ): boolean {
212
+ return dependency.file !== start && !reached.has(dependency.file)
213
+ }
214
+
215
+ // Dependencies joined to what is reached, and those inside the project queued to be followed.
216
+ function join(
217
+ dependencies: ReadonlyArray<Dependency>,
218
+ start: string,
219
+ reached: Map<string, Dependency>,
220
+ ): Array<string> {
221
+ const next = dependencies.filter((dependency) => is_unvisited(dependency, start, reached))
222
+
223
+ for (const dependency of next) reached.set(dependency.file, dependency)
224
+
225
+ return next.filter((dependency) => !dependency.external).map((dependency) => dependency.file)
226
+ }
227
+
228
+ function reachable(context: GraphContext, file: string): Map<string, Dependency> {
229
+ const reached = new Map<string, Dependency>()
230
+ const pending = [file, ...join(context.ambient, file, reached)]
231
+
232
+ for (let current = pending.pop(); current !== undefined; current = pending.pop()) {
233
+ pending.push(...join(direct_dependencies(context, current), file, reached))
234
+ }
235
+
236
+ return reached
237
+ }
238
+
239
+ // Named from the root rather than absolutely: a lane's seed and the gate's cache sharing rebase the
240
+ // cache file into another checkout, where an absolute name would drop every entry.
241
+ function token_of(context: GraphContext, dependency: Dependency): string {
242
+ const name = path.relative(context.root, dependency.file)
243
+ if (dependency.external) return name
244
+
245
+ return `${name}:${content_hash(context, dependency.file)}`
246
+ }
247
+
248
+ function closure_hash(context: GraphContext, file: string): string {
249
+ const tokens = [...reachable(context, file).values()].map((dependency) =>
250
+ token_of(context, dependency),
251
+ )
252
+
253
+ return input_fingerprint.of_entries(tokens)
254
+ }
255
+
256
+ // Undefined where nothing type-aware can run: no `typescript`, or no `tsconfig.json` at the root.
257
+ async function create(root: string): Promise<ImportGraph | undefined> {
258
+ const typescript = await load_typescript()
259
+ if (typescript === undefined) return undefined
260
+ const parsed = parsed_config(typescript, root)
261
+ if (parsed === undefined) return undefined
262
+ const { options } = parsed
263
+ const context: GraphContext = {
264
+ root,
265
+ typescript,
266
+ options,
267
+ resolution_cache: typescript.createModuleResolutionCache(root, (name) => name, options),
268
+ ambient: ambient_of({ typescript, options }, root, parsed),
269
+ dependencies: new Map(),
270
+ content_hashes: new Map(),
271
+ }
272
+
273
+ return { closure_hash: (file) => closure_hash(context, file) }
274
+ }
275
+
276
+ const import_graph = { create }
277
+
278
+ export type { ImportGraph }
279
+ export { import_graph }
@@ -0,0 +1,102 @@
1
+ import { existsSync } from 'node:fs'
2
+ import path from 'node:path'
3
+ import { environment_flags } from '@joshuafolkken/kit/env'
4
+ import { gate_plan } from '#scripts/gate/gate-plan'
5
+ import { verification_inputs } from '#scripts/gate/verification-inputs'
6
+ import {
7
+ changed_file_scope,
8
+ type ChangedFileScope,
9
+ type ScopeVocabulary,
10
+ } from '#scripts/git/changed-file-scope'
11
+ import {
12
+ ESLINT_CACHE_FILE,
13
+ ESLINT_CACHE_FLAGS,
14
+ PRETTIER_CACHE_FLAGS,
15
+ } from '#scripts/josh/josh-command-types'
16
+ import { lint_related_scope, type LintCaches } from './lint-related-scope'
17
+
18
+ // `josh lint --changed` — the lint `josh gate` runs (joshuafolkken/kit#4085): the branch's changed
19
+ // files rather than the whole tree.
20
+ //
21
+ // **Narrowing gives up only the files the branch did not change.** The whole-tree run answers such a
22
+ // file from its cache entry unless the files its imports reach changed (`eslint-cache-dependencies.ts`,
23
+ // joshuafolkken/kit#4415); this run does not lint it at all, so an unchanged file that a changed
24
+ // import broke is caught by the whole-tree run alone. The other files that run actually lints are
25
+ // the changed ones, and those are exactly the ones this run names.
26
+ //
27
+ // What a cache entry does not see falls back to the whole tree: a configuration the lint check declares
28
+ // (`verification-inputs.ts`) — a toolchain or ignore file, the eslint configuration and kit's own rules,
29
+ // the TypeScript configuration the type-aware rules read — and a change that cannot be read. CI lints the whole tree on every run,
30
+ // so the narrowed gate always has the full check behind it.
31
+
32
+ interface NarrowedLint {
33
+ prettier: ReadonlyArray<string>
34
+ eslint: ReadonlyArray<string>
35
+ eslint_cache_file: string
36
+ }
37
+
38
+ type Environment = Readonly<Record<string, string | undefined>>
39
+
40
+ const GATE_CACHES: LintCaches = {
41
+ eslint_file: ESLINT_CACHE_FILE,
42
+ eslint_flags: ESLINT_CACHE_FLAGS,
43
+ prettier_flags: PRETTIER_CACHE_FLAGS,
44
+ }
45
+
46
+ const CI_REASON = 'CI lints the whole tree'
47
+ const CONFIG_REASON = 'a changed file configures the toolchain or the linters'
48
+
49
+ const VOCABULARY: ScopeVocabulary = {
50
+ label: 'josh lint --changed',
51
+ fallback_suffix: 'checking the whole tree instead',
52
+ narrowed_suffix: 'checking only them',
53
+ }
54
+
55
+ function all_scope(reason: string): ChangedFileScope {
56
+ return { mode: 'all', files: [], reason }
57
+ }
58
+
59
+ // The lint check's declared configurations (`verification-inputs.ts`), as the since-green narrowing
60
+ // reads them too.
61
+ function configures_lint(files: ReadonlyArray<string>, root: string): boolean {
62
+ return verification_inputs.configures(
63
+ gate_plan.LINT_LABEL,
64
+ files.map((file) => path.relative(root, file).split(path.sep).join('/')),
65
+ )
66
+ }
67
+
68
+ // `files` are absolute, as `changed_file_scope.read_changed_files` answers them; `undefined` is a
69
+ // change that could not be read.
70
+ function resolve_gate_scope(
71
+ files: ReadonlyArray<string> | undefined,
72
+ root: string,
73
+ environment: Environment,
74
+ ): ChangedFileScope {
75
+ if (environment_flags.is_ci_enabled(environment['CI'])) return all_scope(CI_REASON)
76
+ if (files !== undefined && configures_lint(files, root)) return all_scope(CONFIG_REASON)
77
+
78
+ return changed_file_scope.resolve_scope(files, lint_related_scope.scope_inputs(existsSync))
79
+ }
80
+
81
+ function narrowed_run(files: ReadonlyArray<string>): NarrowedLint {
82
+ return {
83
+ prettier: lint_related_scope.prettier_arguments(files, GATE_CACHES),
84
+ eslint: lint_related_scope.eslint_arguments(files, GATE_CACHES),
85
+ eslint_cache_file: GATE_CACHES.eslint_file,
86
+ }
87
+ }
88
+
89
+ function describe_scope(scope: ChangedFileScope, root: string): string {
90
+ return changed_file_scope.describe_scope(scope, root, VOCABULARY)
91
+ }
92
+
93
+ const lint_gate_scope = {
94
+ CHANGED_FLAG: '--changed',
95
+ CI_REASON,
96
+ CONFIG_REASON,
97
+ describe_scope,
98
+ narrowed_run,
99
+ resolve_gate_scope,
100
+ }
101
+
102
+ export { lint_gate_scope }
@@ -0,0 +1,19 @@
1
+ #!/usr/bin/env tsx
2
+ import { fileURLToPath } from 'node:url'
3
+ import { changed_file_scope } from '#scripts/git/changed-file-scope'
4
+ import { lint_parallel } from './lint-parallel'
5
+
6
+ // The `josh lint` entry, kept apart from `lint-parallel.ts` because `lint-related.ts` imports that
7
+ // one: a bundle is one file, so a main guard there would fire for every command that carries it
8
+ // (joshuafolkken/kit#4186).
9
+ //
10
+ // `process.exitCode` rather than `process.exit()`: both reports are buffered and written in one go,
11
+ // and `process.exit()` truncates a piped stdout at its buffer size — which is exactly how this
12
+ // command is read when `josh gate` runs it as one of four concurrent checks. Setting the code lets
13
+ // the writes drain and the process end on its own, which it can, since both children have already
14
+ // exited by here.
15
+ if (process.argv[1] === fileURLToPath(import.meta.url)) {
16
+ process.exitCode = await lint_parallel.run_lint_command(
17
+ process.argv.slice(changed_file_scope.ARGV_START),
18
+ )
19
+ }
@@ -1,6 +1,5 @@
1
- #!/usr/bin/env tsx
2
- import { fileURLToPath } from 'node:url'
3
1
  import { project_checks } from '#scripts/gate/project-checks'
2
+ import { changed_file_scope } from '#scripts/git/changed-file-scope'
4
3
  import {
5
4
  ESLINT_CACHE_FILE,
6
5
  ESLINT_CACHE_FLAGS,
@@ -13,7 +12,9 @@ import {
13
12
  type BufferedProcessResult,
14
13
  } from '#scripts/lib/buffered-process'
15
14
  import { SKIP_MARKER } from '#scripts/test/skip-marker'
16
- import { cross_file_recheck, type CrossFileRecheckOptions } from './cross-file-recheck'
15
+ import { eslint_cache_dependencies } from './eslint-cache-dependencies'
16
+ import { eslint_daemon } from './eslint-daemon'
17
+ import { lint_gate_scope } from './lint-gate-scope'
17
18
 
18
19
  // This — not the `lint:eslint` map entry — is the eslint invocation `josh gate` reaches, so the
19
20
  // cache flags come from the same constant the ignore rules are asserted against.
@@ -21,29 +22,43 @@ import { cross_file_recheck, type CrossFileRecheckOptions } from './cross-file-r
21
22
  // moves, with every test still green.
22
23
  const WHOLE_TREE = '.'
23
24
  const ESLINT_ARGS = ['exec', 'eslint', WHOLE_TREE, ...ESLINT_CACHE_FLAGS] as const
24
- const WHOLE_TREE_RECHECK: CrossFileRecheckOptions = {
25
- cache_file: ESLINT_CACHE_FILE,
26
- patterns: [WHOLE_TREE],
27
- }
28
25
 
29
26
  // Prettier's cache stays this checkout's own, never shared through `lane_cache_run` as eslint's is:
30
27
  // its entries do not survive a move (`josh-command-types.ts` → `GATE_CACHE_SPECS`).
31
28
  const PRETTIER_ARGS = ['exec', 'prettier', '--check', WHOLE_TREE, ...PRETTIER_CACHE_FLAGS] as const
32
29
 
33
- // What one eslint run is made of: the child's arguments, and what re-reading a cached cross-file report
34
- // (`cross-file-recheck.ts`) needs to ask the same question again — the cache file and the targets.
30
+ // What one eslint run is made of: the child's arguments and the cache file they name.
35
31
  interface EslintRun {
36
32
  args: ReadonlyArray<string>
37
- recheck: CrossFileRecheckOptions
33
+ cache_file: string
34
+ warm_daemon: boolean
35
+ }
36
+
37
+ // Whether eslint may go through the checkout's warm daemon (`eslint-daemon.ts`). `josh lint:related`
38
+ // asks for it; the gate's own lint does not, so its whole-tree run stays one cold process of its own.
39
+ interface LintRunOptions {
40
+ warm_daemon: boolean
41
+ }
42
+
43
+ const COLD_RUN: LintRunOptions = { warm_daemon: false }
44
+
45
+ // The warm daemon when asked for and reachable, else the cold `pnpm exec eslint` it falls back to.
46
+ async function run_eslint_process(eslint: EslintRun): Promise<BufferedProcessResult> {
47
+ if (eslint.warm_daemon) return await eslint_daemon.run_or_cold(eslint.args)
48
+
49
+ return await buffered_process.run_buffered_process(eslint.args)
38
50
  }
39
51
 
40
- // The finished report is re-read before it is returned, inside the lane's cache sharing, because
41
- // the re-reading uses that same cache file.
52
+ // The run sits inside the lane's cache sharing, between dropping the entries whose imports changed
53
+ // and recording what the fresh ones read (`eslint-cache-dependencies.ts`).
42
54
  async function run_eslint(eslint: EslintRun): Promise<BufferedProcessResult> {
43
- return await lane_cache_run.run(eslint.recheck.cache_file, async () => {
44
- const result = await buffered_process.run_buffered_process(eslint.args)
55
+ const { cache_file } = eslint
45
56
 
46
- return await cross_file_recheck.verify(result, eslint.recheck)
57
+ return await lane_cache_run.run(cache_file, async () => {
58
+ return await eslint_cache_dependencies.guard(
59
+ cache_file,
60
+ async () => await run_eslint_process(eslint),
61
+ )
47
62
  })
48
63
  }
49
64
 
@@ -103,19 +118,16 @@ function lint_exit_code(prettier: BufferedProcessResult, eslint: BufferedProcess
103
118
  // and through the same basic-project skip, so a narrowed run never reaches a tool the whole-tree
104
119
  // run would have skipped. The skip reasons answer nothing for a full
105
120
  // project, so the one path serves both profiles.
106
- //
107
- // A narrowed run re-reads a cached cross-file report too (`cross-file-recheck.ts`): one change's
108
- // files can hold both the reported file and the one it reads, and fixing the second leaves the
109
- // first's cached report standing.
110
121
  async function run_lint_checks(
111
122
  prettier_args: ReadonlyArray<string>,
112
123
  eslint_args: ReadonlyArray<string>,
113
- recheck: CrossFileRecheckOptions,
124
+ cache_file: string,
125
+ options: LintRunOptions = COLD_RUN,
114
126
  ): Promise<number> {
115
127
  const directory = process.cwd()
116
128
  const [prettier, eslint] = await Promise.all([
117
129
  run_prettier(directory, prettier_args),
118
- run_checked_eslint(directory, { args: eslint_args, recheck }),
130
+ run_checked_eslint(directory, { args: eslint_args, cache_file, ...options }),
119
131
  ])
120
132
 
121
133
  write_output(with_ran_notice('prettier', prettier, eslint))
@@ -125,18 +137,38 @@ async function run_lint_checks(
125
137
  }
126
138
 
127
139
  async function run_lint_parallel_checks(): Promise<number> {
128
- return await run_lint_checks(PRETTIER_ARGS, ESLINT_ARGS, WHOLE_TREE_RECHECK)
140
+ return await run_lint_checks(PRETTIER_ARGS, ESLINT_ARGS, ESLINT_CACHE_FILE)
129
141
  }
130
142
 
131
- // `process.exitCode` rather than `process.exit()`: both reports are buffered and written here in
132
- // one go, and `process.exit()` truncates a piped stdout at its buffer size — which is exactly how
133
- // this command is read when `josh gate` runs it as one of four concurrent checks. Setting the code
134
- // lets the writes drain and the process end on its own, which it can, since both children have
135
- // already exited by here.
136
- if (process.argv[1] === fileURLToPath(import.meta.url)) {
137
- process.exitCode = await run_lint_parallel_checks()
143
+ // `josh lint --changed`, the gate's lint: the branch's changed files on the gate's own caches, or the
144
+ // whole tree where `lint-gate-scope.ts` cannot narrow. The line naming the decision is printed first,
145
+ // so a narrowed run is never read as a whole one.
146
+ async function run_changed_lint_checks(): Promise<number> {
147
+ const root = await changed_file_scope.repository_root_or_cwd()
148
+ const files = await changed_file_scope.read_changed_files(root)
149
+ const scope = lint_gate_scope.resolve_gate_scope(files, root, process.env)
150
+
151
+ process.stdout.write(`${lint_gate_scope.describe_scope(scope, root)}\n`)
152
+
153
+ if (scope.mode === 'all') return await run_lint_parallel_checks()
154
+
155
+ const narrowed = lint_gate_scope.narrowed_run(scope.files)
156
+
157
+ return await run_lint_checks(narrowed.prettier, narrowed.eslint, narrowed.eslint_cache_file)
138
158
  }
139
159
 
140
- const lint_parallel = { run_lint_checks, run_lint_parallel_checks }
160
+ async function run_lint_command(command_arguments: ReadonlyArray<string>): Promise<number> {
161
+ if (command_arguments.includes(lint_gate_scope.CHANGED_FLAG)) {
162
+ return await run_changed_lint_checks()
163
+ }
164
+
165
+ return await run_lint_parallel_checks()
166
+ }
167
+
168
+ const lint_parallel = {
169
+ run_lint_checks,
170
+ run_lint_command,
171
+ run_lint_parallel_checks,
172
+ }
141
173
 
142
174
  export { ESLINT_ARGS, lint_parallel, PRETTIER_ARGS }
@@ -10,15 +10,12 @@ import {
10
10
  ESLINT_RELATED_CACHE_FLAGS,
11
11
  PRETTIER_RELATED_CACHE_FLAGS,
12
12
  } from '#scripts/josh/josh-command-types'
13
- import type { CrossFileRecheckOptions } from './cross-file-recheck'
14
13
 
15
14
  // `josh lint` reads the whole repository on every call, and an implementation loop calls it after
16
15
  // every few edits — re-reading files the change never touched.
17
16
  //
18
- // **This narrowing is added in front of the whole check, never in place of it.** `josh gate` still
19
- // runs `josh lint` over everything before the commit: a formatting rule can be broken by a file the
20
- // change did not name (a shared config, a generated snapshot), and only the whole-tree run sees
21
- // that. What the narrowing replaces is the repeat calls in between.
17
+ // The gate narrows its own lint the same way, with its own caches and a whole-tree fallback for a
18
+ // changed toolchain or lint configuration (`lint-gate-scope.ts`), and CI lints the whole tree.
22
19
  //
23
20
  // The decision this file makes is which extensions the two linters read, and how each of them is
24
21
  // asked about a file list instead of a directory. Everything it shares with `josh test:related` —
@@ -95,41 +92,49 @@ function describe_scope(scope: ChangedFileScope, root: string): string {
95
92
  return changed_file_scope.describe_scope(scope, root, VOCABULARY)
96
93
  }
97
94
 
95
+ // Where a narrowed run keeps its caches. `josh lint:related` keeps its own and the gate its own, for
96
+ // the reason `eslint_arguments` gives below; a narrowed gate run on the gate's caches loses none of
97
+ // the whole-tree entries, since a file it does not visit is not pruned (`josh-command-types.ts`).
98
+ interface LintCaches {
99
+ eslint_file: string
100
+ eslint_flags: ReadonlyArray<string>
101
+ prettier_flags: ReadonlyArray<string>
102
+ }
103
+
104
+ const RELATED_CACHES: LintCaches = {
105
+ eslint_file: ESLINT_RELATED_CACHE_FILE,
106
+ eslint_flags: ESLINT_RELATED_CACHE_FLAGS,
107
+ prettier_flags: PRETTIER_RELATED_CACHE_FLAGS,
108
+ }
109
+
98
110
  // The scoped run's own cache file, for the reason eslint's below gives: prettier too rewrites its
99
111
  // cache file whole, so a narrowed run sharing the gate's would discard entries a concurrent gate wrote.
100
- function prettier_arguments(files: ReadonlyArray<string>): ReadonlyArray<string> {
101
- return [...PRETTIER_ARGS, ...files, ...PRETTIER_RELATED_CACHE_FLAGS]
112
+ function prettier_arguments(
113
+ files: ReadonlyArray<string>,
114
+ caches: LintCaches = RELATED_CACHES,
115
+ ): ReadonlyArray<string> {
116
+ return [...PRETTIER_ARGS, ...files, ...caches.prettier_flags]
102
117
  }
103
118
 
104
119
  // The cache file is this command's own rather than the gate's, because the two run at the same time.
105
- // `josh gate` lints the whole tree beside the review while an
120
+ // `josh gate` lints beside the review while an
106
121
  // implementation loop calls this command between edits, and each eslint run rewrites its cache file
107
122
  // whole from the copy it loaded at start-up — so on one file the run that finished last would
108
123
  // discard the other's entries, and a narrowed run finishing during a whole-tree run would roll the
109
124
  // cache back to its pre-gate state. Sharing would let a narrowed run warm the gate's cache only for
110
125
  // pruning, which says nothing about two writers. It is the same judgement the edit hook's own cache
111
126
  // file makes.
112
- //
113
- // **What is narrowed is still only the target list, never the gate.** `josh gate` runs `josh lint`
114
- // over the whole tree before any commit; this file decides which files a repeat call reads.
115
- function eslint_arguments(files: ReadonlyArray<string>): ReadonlyArray<string> {
116
- return [...ESLINT_ARGS, ...files, ...ESLINT_RELATED_CACHE_FLAGS, ...ESLINT_SCOPED_FLAGS]
117
- }
118
-
119
- // What re-reading a cached cross-file report (`cross-file-recheck.ts`) needs to ask the narrowed run's question
120
- // again: the same targets, the same cache file, and the Node API's spelling of `--no-warn-ignored`.
121
- function cross_file_recheck_options(files: ReadonlyArray<string>): CrossFileRecheckOptions {
122
- return {
123
- cache_file: ESLINT_RELATED_CACHE_FILE,
124
- patterns: files,
125
- eslint_options: { warnIgnored: false },
126
- }
127
+ function eslint_arguments(
128
+ files: ReadonlyArray<string>,
129
+ caches: LintCaches = RELATED_CACHES,
130
+ ): ReadonlyArray<string> {
131
+ return [...ESLINT_ARGS, ...files, ...caches.eslint_flags, ...ESLINT_SCOPED_FLAGS]
127
132
  }
128
133
 
129
134
  const lint_related_scope = {
130
135
  COMMAND_LABEL,
131
- cross_file_recheck_options,
132
136
  NOTHING_LINTABLE_REASON,
137
+ RELATED_CACHES,
133
138
  describe_scope,
134
139
  eslint_arguments,
135
140
  is_lintable,
@@ -137,4 +142,5 @@ const lint_related_scope = {
137
142
  scope_inputs,
138
143
  }
139
144
 
145
+ export type { LintCaches }
140
146
  export { lint_related_scope }