@joshuafolkken/kit 1.1471.0 → 1.1784.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (895) hide show
  1. package/.claude/agents/investigator.md +1 -1
  2. package/.claude/settings.json +6 -6
  3. package/.claude/skills/epic-commands/SKILL.md +26 -77
  4. package/.claude/skills/epic-commands/epic-bundle.md +12 -6
  5. package/.claude/skills/epic-commands/execution-waves.md +1 -2
  6. package/.claude/skills/verify-ui/SKILL.md +1 -2
  7. package/.claude/skills/workflow-commands/SKILL.md +12 -14
  8. package/.claude/skills/workflow-commands/background-commands.md +8 -12
  9. package/.claude/skills/workflow-commands/backlogrun-child.md +13 -18
  10. package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +7 -25
  11. package/.claude/skills/workflow-commands/backlogrun-lanes.md +23 -28
  12. package/.claude/skills/workflow-commands/backlogrun-park.md +16 -31
  13. package/.claude/skills/workflow-commands/backlogrun-progress.md +12 -21
  14. package/.claude/skills/workflow-commands/backlogrun-recovery.md +12 -12
  15. package/.claude/skills/workflow-commands/backlogrun-steps.md +12 -20
  16. package/.claude/skills/workflow-commands/backlogrun.md +32 -51
  17. package/.claude/skills/workflow-commands/chain-rule.md +18 -11
  18. package/.claude/skills/workflow-commands/delegation.md +13 -8
  19. package/.claude/skills/workflow-commands/entry-sequence.md +10 -12
  20. package/.claude/skills/workflow-commands/followup.md +10 -35
  21. package/.claude/skills/workflow-commands/fullrun-steps.md +38 -49
  22. package/.claude/skills/workflow-commands/fullrun.md +6 -8
  23. package/.claude/skills/workflow-commands/halfrun.md +20 -32
  24. package/.claude/skills/workflow-commands/into-target.md +1 -2
  25. package/.claude/skills/workflow-commands/issue-comments.md +19 -15
  26. package/.claude/skills/workflow-commands/issue-scout.md +5 -4
  27. package/.claude/skills/workflow-commands/kickoff.md +24 -23
  28. package/.claude/skills/workflow-commands/latest-gate.md +9 -18
  29. package/.claude/skills/workflow-commands/needs-human-review.md +11 -19
  30. package/.claude/skills/workflow-commands/observation-filing.md +4 -50
  31. package/.claude/skills/workflow-commands/observation-ledger.md +5 -10
  32. package/.claude/skills/workflow-commands/pre-gate-cut.md +22 -44
  33. package/.claude/skills/workflow-commands/prerequisite.md +11 -18
  34. package/.claude/skills/workflow-commands/progress-watcher.md +3 -8
  35. package/.claude/skills/workflow-commands/prrun.md +6 -12
  36. package/.claude/skills/workflow-commands/retrospective.md +5 -5
  37. package/.claude/skills/workflow-commands/split-assessment.md +14 -4
  38. package/.claude/skills/workflow-commands/target-repository.md +1 -2
  39. package/.claude/skills/workflow-commands/working-tree-hold.md +11 -13
  40. package/.codex/hooks.json +6 -6
  41. package/.github/actions/setup-node/action.yml +10 -1
  42. package/.github/actions/setup-pnpm/action.yml +1 -1
  43. package/.github/dependabot.yml +16 -0
  44. package/.github/release.yml +0 -2
  45. package/.github/workflows/ci.yml +121 -11
  46. package/.github/workflows/publish.yml +10 -3
  47. package/.github/workflows/sonar-qube.yml +1 -0
  48. package/.prettierignore +2 -0
  49. package/.vscode/tasks.json +1 -2
  50. package/CLAUDE.md +4 -8
  51. package/README.md +4 -2
  52. package/SECURITY.md +1 -1
  53. package/cspell/index.yaml +7 -0
  54. package/dist/CLAUDE.md +4 -8
  55. package/dist/commands/document-read-cli.js +882 -0
  56. package/dist/commands/{document-section-cli.js → document-section-main.js} +137 -62
  57. package/dist/commands/read-set-cli.js +1867 -0
  58. package/dist/commands/run-prep-main.js +21653 -0
  59. package/dist/commands/run-step-cli.js +23880 -0
  60. package/dist/config-merge/index.js +5 -1
  61. package/dist/hooks/audit-provision.js +20 -35
  62. package/dist/hooks/{chunk-DGT54IH5.js → chunk-AZX4FGQ3.js} +63 -17
  63. package/dist/hooks/chunk-CWMBGKYW.js +6483 -0
  64. package/dist/hooks/chunk-O2YBIDSI.js +4306 -0
  65. package/dist/hooks/{chunk-AS74OU3D.js → chunk-PT5R6UJD.js} +4582 -2118
  66. package/dist/hooks/chunk-TUIFS5E7.js +72 -0
  67. package/dist/hooks/{chunk-723HKZO5.js → chunk-VWWCFGWK.js} +1 -1
  68. package/dist/hooks/{chunk-E7OIKX5Z.js → chunk-WR2KQAYZ.js} +1863 -382
  69. package/dist/hooks/{chunk-KC5AK2GF.js → chunk-XGBNSWEI.js} +248 -46
  70. package/dist/hooks/chunk-YCDOIR3I.js +3456 -0
  71. package/dist/hooks/codex-hook-adapter.js +10 -19
  72. package/dist/hooks/format-edited.js +5 -5
  73. package/dist/hooks/inputs.json +436 -257
  74. package/dist/hooks/pretool-guard.js +7 -22
  75. package/dist/hooks/session-lang.js +380 -42
  76. package/dist/hooks/stop-guard.js +8711 -782
  77. package/dist/josh.js +5263 -997
  78. package/dist/self-sync-guard/index.js +74 -10
  79. package/dist/version/index.js +115 -406
  80. package/eslint/base.js +1 -1
  81. package/lefthook/base.yml +8 -4
  82. package/package.json +17 -53
  83. package/pnpm-workspace.yaml +4 -2
  84. package/prompts/coding-standards.md +1 -1
  85. package/prompts/collaboration-workflow/file-edits.md +1 -9
  86. package/prompts/collaboration-workflow/gh-rest.md +1 -2
  87. package/prompts/collaboration-workflow/issue-citation.md +2 -4
  88. package/prompts/collaboration-workflow/issue-template.md +42 -17
  89. package/prompts/collaboration-workflow/lane-instructions.md +34 -0
  90. package/prompts/collaboration-workflow/measurement.md +37 -0
  91. package/prompts/collaboration-workflow/operating-rules.md +6 -12
  92. package/prompts/collaboration-workflow/output-bounds.md +4 -9
  93. package/prompts/collaboration-workflow/overview.md +1 -1
  94. package/prompts/collaboration-workflow/plan-comment.md +3 -42
  95. package/prompts/collaboration-workflow/principles.md +19 -8
  96. package/prompts/collaboration-workflow/report-format.md +37 -57
  97. package/prompts/collaboration-workflow/residency.md +12 -8
  98. package/prompts/collaboration-workflow/rule-delivery.md +3 -11
  99. package/prompts/collaboration-workflow/shell-body.md +8 -18
  100. package/prompts/collaboration-workflow/turn-batching.md +4 -6
  101. package/prompts/collaboration-workflow/upstream-interrupt.md +16 -6
  102. package/prompts/collaboration-workflow/wip-cap.md +7 -7
  103. package/prompts/collaboration-workflow.md +4 -7
  104. package/prompts/refactoring.md +1 -1
  105. package/prompts/review-rubric.md +1 -2
  106. package/prompts/review.md +45 -26
  107. package/prompts/testing-guide.md +10 -45
  108. package/scripts/agent/agent-argv.ts +20 -4
  109. package/scripts/agent/agent-event.ts +15 -15
  110. package/scripts/agent/agent-exit-record.ts +13 -1
  111. package/scripts/agent/agent-role-profile.ts +101 -45
  112. package/scripts/agent/agent-safe-text.ts +60 -0
  113. package/scripts/agent/api-auth.ts +41 -0
  114. package/scripts/agent/api-outage.ts +1 -1
  115. package/scripts/agent/claude-agent-argv.ts +14 -0
  116. package/scripts/agent/codex-agent-argv.ts +2 -0
  117. package/scripts/agent/lane-instructions.ts +144 -0
  118. package/scripts/auto-ok/auto-ok-cli.ts +14 -16
  119. package/scripts/auto-ok/auto-ok-judge-read.ts +12 -3
  120. package/scripts/auto-ok/auto-ok-judge-write.ts +46 -19
  121. package/scripts/auto-ok/auto-ok-judge.ts +13 -2
  122. package/scripts/auto-ok/auto-ok-main.ts +17 -0
  123. package/scripts/backlog/backlog-arrival.ts +14 -3
  124. package/scripts/backlog/backlog-budget-cli.ts +7 -33
  125. package/scripts/backlog/backlog-budget-main.ts +16 -0
  126. package/scripts/backlog/backlog-budget.ts +6 -7
  127. package/scripts/backlog/backlog-defect-priority.ts +4 -3
  128. package/scripts/backlog/backlog-drive-adopt.ts +67 -0
  129. package/scripts/backlog/backlog-drive-args.ts +4 -5
  130. package/scripts/backlog/backlog-drive-cli.ts +113 -28
  131. package/scripts/backlog/backlog-drive-hold.ts +162 -0
  132. package/scripts/backlog/backlog-drive-idle.ts +151 -0
  133. package/scripts/backlog/backlog-drive-judge.ts +25 -0
  134. package/scripts/backlog/backlog-drive-memory.ts +126 -0
  135. package/scripts/backlog/backlog-drive-named-offer.ts +5 -10
  136. package/scripts/backlog/backlog-drive-named.ts +54 -7
  137. package/scripts/backlog/backlog-drive-offer-argv.ts +3 -8
  138. package/scripts/backlog/backlog-drive-paused.ts +169 -0
  139. package/scripts/backlog/backlog-drive-restore.ts +39 -8
  140. package/scripts/backlog/backlog-drive-seats.ts +18 -8
  141. package/scripts/backlog/backlog-drive-token-handling.ts +38 -0
  142. package/scripts/backlog/backlog-drive.ts +79 -75
  143. package/scripts/backlog/backlog-next-main.ts +16 -0
  144. package/scripts/backlog/backlog-next-shared.ts +73 -0
  145. package/scripts/backlog/backlog-next.ts +48 -16
  146. package/scripts/backlog/backlog-occupied.ts +69 -0
  147. package/scripts/backlog/backlog-offer-cli.ts +6 -21
  148. package/scripts/backlog/backlog-offer-exclude.ts +15 -0
  149. package/scripts/backlog/backlog-offer-main.ts +12 -0
  150. package/scripts/backlog/backlog-offer.ts +36 -3
  151. package/scripts/backlog/backlog-overlap.ts +22 -4
  152. package/scripts/backlog/backlog-plan-read.ts +6 -2
  153. package/scripts/backlog/backlog-plan.ts +18 -4
  154. package/scripts/backlog/backlog-pool.ts +10 -10
  155. package/scripts/backlog/backlog-rank.ts +10 -2
  156. package/scripts/backlog/backlog-ready.ts +137 -18
  157. package/scripts/backlog/backlog-stalled-detect.ts +109 -36
  158. package/scripts/backlog/backlog-stalled.ts +52 -16
  159. package/scripts/backlog/backlog-wait-cause.ts +86 -0
  160. package/scripts/backlog/backlog-waves.ts +39 -13
  161. package/scripts/backlog/backlogrun-args.ts +19 -7
  162. package/scripts/backlog/backlogrun-cli.ts +19 -5
  163. package/scripts/backlog/backlogrun-launch.ts +6 -0
  164. package/scripts/backlog/backlogrun-restart.ts +97 -0
  165. package/scripts/backlog/backlogrun-stop.ts +79 -7
  166. package/scripts/behavior/behavior-cli.ts +2 -2
  167. package/scripts/behavior/behavior-rules.ts +47 -24
  168. package/scripts/build/build-bin.ts +2 -16
  169. package/scripts/build/build-claude-md.ts +0 -7
  170. package/scripts/build/build-commands.ts +0 -13
  171. package/scripts/build/build-hooks.ts +49 -48
  172. package/scripts/build/hook-bundle-stamp.ts +29 -11
  173. package/scripts/build/local-bin.ts +1 -1
  174. package/scripts/cases/cases-cli.ts +25 -13
  175. package/scripts/cases/cases-interaction-scan.ts +134 -0
  176. package/scripts/cases/cases-interaction.ts +183 -0
  177. package/scripts/cases/cases-logic.ts +39 -6
  178. package/scripts/ci/pr-classification-main.ts +18 -0
  179. package/scripts/ci/pr-classification.ts +10 -17
  180. package/scripts/clone/clone-scan.ts +1 -1
  181. package/scripts/cost-runtime/cost-blocks.ts +22 -37
  182. package/scripts/cost-runtime/cost-cli.ts +31 -14
  183. package/scripts/cost-runtime/cost-main.ts +12 -0
  184. package/scripts/cost-runtime/cost-transcript.ts +1 -0
  185. package/scripts/delegation/delegation-policy.ts +17 -4
  186. package/scripts/delegation/duplicate-read-guard.ts +2 -10
  187. package/scripts/delegation/investigation-guard.ts +15 -73
  188. package/scripts/delegation/investigation-reads.ts +3 -5
  189. package/scripts/dependabot/dependabot-cooldown.ts +194 -0
  190. package/scripts/discovery/repo-discovery.ts +24 -6
  191. package/scripts/doctor/doctor-consumer.ts +2 -5
  192. package/scripts/document/document-byte-budget.ts +9 -6
  193. package/scripts/document/document-scan.ts +1 -1
  194. package/scripts/document/document-section-cli.ts +17 -13
  195. package/scripts/document/document-section-main.ts +12 -0
  196. package/scripts/document/entry-read-budget.ts +2 -2
  197. package/scripts/document/read-set-cli.ts +4 -1
  198. package/scripts/epic/epic-audit-cli.ts +12 -6
  199. package/scripts/epic/epic-audit-orphans.ts +5 -8
  200. package/scripts/epic/epic-audit.ts +52 -1
  201. package/scripts/epic/epic-bundle-apply.ts +137 -0
  202. package/scripts/epic/epic-bundle-cli.ts +32 -121
  203. package/scripts/epic/epic-bundle-evidence.ts +49 -26
  204. package/scripts/epic/epic-bundle-format.ts +116 -0
  205. package/scripts/epic/epic-bundle-main.ts +17 -0
  206. package/scripts/epic/epic-bundle-referenced.ts +14 -3
  207. package/scripts/epic/epic-bundle.ts +17 -9
  208. package/scripts/epic/epic-busy.ts +5 -12
  209. package/scripts/epic/epic-classify.ts +24 -15
  210. package/scripts/epic/epic-cli-argv.ts +31 -0
  211. package/scripts/epic/epic-cli-decide.ts +42 -0
  212. package/scripts/epic/epic-cli.ts +6 -38
  213. package/scripts/epic/epic-close.ts +112 -55
  214. package/scripts/epic/epic-cross-repo.ts +4 -7
  215. package/scripts/epic/epic-decide.ts +119 -0
  216. package/scripts/epic/epic-decision.ts +9 -0
  217. package/scripts/epic/epic-fetch.ts +4 -0
  218. package/scripts/epic/epic-graph.ts +2 -0
  219. package/scripts/epic/epic-issue.ts +5 -1
  220. package/scripts/epic/epic-label-age.ts +1 -1
  221. package/scripts/epic/epic-lane-offer.ts +39 -4
  222. package/scripts/epic/epic-next-main.ts +24 -0
  223. package/scripts/epic/epic-next.ts +6 -24
  224. package/scripts/epic/epic-outside-blocker.ts +6 -2
  225. package/scripts/epic/epic-parse.ts +9 -3
  226. package/scripts/epic/epic-read.ts +1 -0
  227. package/scripts/epic/epic-reconcile.ts +39 -0
  228. package/scripts/epic/epic-run.ts +10 -1
  229. package/scripts/epic/epic-solo.ts +50 -14
  230. package/scripts/epic/epic.ts +41 -7
  231. package/scripts/exports/unused-members-cli.ts +2 -2
  232. package/scripts/followup/followup-checks-event.ts +8 -3
  233. package/scripts/followup/followup-coderabbit-wait.ts +82 -0
  234. package/scripts/followup/followup-review-gates.ts +81 -0
  235. package/scripts/followup/git-followup-stages.ts +13 -3
  236. package/scripts/followup/git-followup-workflow.ts +31 -60
  237. package/scripts/followup/git-pr-followup-wrapup.ts +9 -14
  238. package/scripts/followup/git-pr-followup.ts +36 -8
  239. package/scripts/fresh-machine/fresh-machine-cli.ts +1 -1
  240. package/scripts/fresh-machine/fresh-machine-run.ts +8 -8
  241. package/scripts/fresh-machine/specs/kit-test-backlogrun.json +1 -1
  242. package/scripts/gate/busy-average.ts +58 -0
  243. package/scripts/gate/check-cpu.ts +60 -0
  244. package/scripts/gate/check-inputs.ts +73 -0
  245. package/scripts/gate/check-reuse.ts +141 -0
  246. package/scripts/gate/command-memory.ts +192 -0
  247. package/scripts/gate/core-admission.ts +218 -28
  248. package/scripts/gate/core-budget-timing.ts +37 -0
  249. package/scripts/gate/core-budget.ts +150 -119
  250. package/scripts/gate/core-wait-record.ts +48 -0
  251. package/scripts/gate/core-wait.ts +162 -0
  252. package/scripts/gate/core-weights.ts +86 -0
  253. package/scripts/gate/free-cores.ts +72 -0
  254. package/scripts/gate/gate-ledger.ts +49 -7
  255. package/scripts/gate/gate-plan.ts +44 -15
  256. package/scripts/gate/gate-report.ts +29 -4
  257. package/scripts/gate/gate-run-steps.ts +195 -0
  258. package/scripts/gate/gate-skip.ts +12 -2
  259. package/scripts/gate/gate-steps.ts +12 -1
  260. package/scripts/gate/held-mark.ts +55 -0
  261. package/scripts/gate/input-fingerprint.ts +42 -0
  262. package/scripts/gate/machine-capacity.ts +124 -31
  263. package/scripts/gate/moved-paths.ts +67 -0
  264. package/scripts/gate/pre-commit-type-check.ts +14 -1
  265. package/scripts/gate/project-checks.ts +5 -12
  266. package/scripts/gate/scoped-green.ts +12 -8
  267. package/scripts/gate/since-green.ts +62 -0
  268. package/scripts/gate/toolchain-inputs.ts +115 -0
  269. package/scripts/gate/verification-gate.ts +65 -129
  270. package/scripts/gate/verification-inputs.ts +250 -0
  271. package/scripts/gh/gh-author-association.ts +96 -9
  272. package/scripts/gh/git-ai-review-scan.ts +4 -2
  273. package/scripts/gh/git-gh-api-path.ts +15 -0
  274. package/scripts/gh/git-gh-branch-rules.ts +73 -0
  275. package/scripts/gh/git-gh-conditional.ts +5 -2
  276. package/scripts/gh/git-gh-issue-read.ts +5 -1
  277. package/scripts/gh/git-gh-issue-rest.ts +1 -0
  278. package/scripts/gh/git-gh-issue-write.ts +77 -17
  279. package/scripts/gh/git-gh-issue.ts +7 -3
  280. package/scripts/gh/git-gh-poll-read.ts +89 -0
  281. package/scripts/gh/git-gh-pr-auto-merge.ts +8 -3
  282. package/scripts/gh/git-gh-pr-rest.ts +1 -1
  283. package/scripts/gh/git-gh-pr-snapshot.ts +33 -20
  284. package/scripts/gh/git-gh-pr.ts +27 -15
  285. package/scripts/gh/git-pr-checks-eval.ts +39 -7
  286. package/scripts/gh/git-pr-checks-parse.ts +39 -9
  287. package/scripts/gh/git-pr-merge-checked.ts +80 -0
  288. package/scripts/gh/git-pr.ts +13 -1
  289. package/scripts/git/base-tree.ts +19 -2
  290. package/scripts/git/changed-file-scope.ts +6 -4
  291. package/scripts/git/changed-paths.ts +18 -1
  292. package/scripts/git/git-diff-reads.ts +27 -2
  293. package/scripts/git/git-grep-hits.ts +85 -0
  294. package/scripts/git/git-location-environment.ts +1 -1
  295. package/scripts/git/git-merge-conflicts.ts +83 -0
  296. package/scripts/git/git-preflight.ts +37 -12
  297. package/scripts/git/git-push-transport.ts +1 -2
  298. package/scripts/git/git-schemas.ts +17 -7
  299. package/scripts/git/git-spawn.ts +1 -2
  300. package/scripts/git/git-status.ts +4 -4
  301. package/scripts/git/main-merge-main.ts +12 -0
  302. package/scripts/git/main-merge-regenerate.ts +78 -0
  303. package/scripts/git/main-merge.ts +39 -14
  304. package/scripts/git/main-sync-main.ts +12 -0
  305. package/scripts/git/main-sync.ts +0 -9
  306. package/scripts/git/stash/git-stash.ts +27 -4
  307. package/scripts/git/stash/{stash-pop-args.ts → stash-args.ts} +13 -10
  308. package/scripts/git/stash/stash-pop-cli.ts +6 -12
  309. package/scripts/git/stash/stash-pop-main.ts +12 -0
  310. package/scripts/git/stash/stash-push-cli.ts +76 -0
  311. package/scripts/git/stash/stash-push-main.ts +12 -0
  312. package/scripts/hooks/batch-guard.ts +5 -16
  313. package/scripts/hooks/check-commit-message-main.ts +8 -0
  314. package/scripts/hooks/check-commit-message.ts +4 -7
  315. package/scripts/hooks/format-edited-file.ts +8 -24
  316. package/scripts/hooks/pre-commit-lint.ts +118 -0
  317. package/scripts/hooks/pre-push-unit.ts +4 -2
  318. package/scripts/hooks/pretool-guard-cli.ts +1 -8
  319. package/scripts/hooks/pretool-guard.ts +57 -69
  320. package/scripts/hooks/reserved-run.ts +67 -8
  321. package/scripts/hooks/run-hook.sh +18 -11
  322. package/scripts/hooks/shell-rules-notice.ts +37 -0
  323. package/scripts/hooks/stop-actions.ts +185 -0
  324. package/scripts/hooks/stop-guard.ts +72 -27
  325. package/scripts/init/hook-command-rewrite.ts +19 -5
  326. package/scripts/init/hook-launch.ts +15 -12
  327. package/scripts/init/init-actions.ts +0 -6
  328. package/scripts/init/init-ai-copy.ts +10 -36
  329. package/scripts/init/init-bootstrap.ts +9 -8
  330. package/scripts/init/init-dry-run-report.ts +1 -1
  331. package/scripts/init/init-dry-run.ts +1 -1
  332. package/scripts/init/init-file-action.ts +7 -9
  333. package/scripts/init/init-logic-json-merge.ts +2 -2
  334. package/scripts/init/init-logic-migrate.ts +9 -82
  335. package/scripts/init/init-logic.ts +3 -2
  336. package/scripts/init/init-main.ts +12 -0
  337. package/scripts/init/init.ts +5 -12
  338. package/scripts/init/kit-development-versions.ts +3 -7
  339. package/scripts/init/kit-written-paths.ts +2 -2
  340. package/scripts/init/project-profile.ts +5 -4
  341. package/scripts/init/tsconfig-preset-migration.ts +2 -1
  342. package/scripts/init/vscode-tasks.ts +1 -1
  343. package/scripts/issue/defect-origin-cli.ts +106 -0
  344. package/scripts/issue/defect-origin-line.ts +60 -0
  345. package/scripts/issue/defect-origin-main.ts +11 -0
  346. package/scripts/issue/defect-origin.ts +114 -0
  347. package/scripts/issue/defect-rate-cli.ts +34 -78
  348. package/scripts/issue/defect-rate.ts +0 -16
  349. package/scripts/issue/defect-report-cli.ts +128 -0
  350. package/scripts/issue/defect-report-format.ts +56 -0
  351. package/scripts/issue/defect-report-main.ts +11 -0
  352. package/scripts/issue/defect-report.ts +160 -0
  353. package/scripts/issue/expected-effect-lint.ts +60 -0
  354. package/scripts/issue/issue-already-done-cli.ts +62 -0
  355. package/scripts/issue/issue-body-or-comment.ts +40 -0
  356. package/scripts/issue/issue-cite-cli.ts +33 -22
  357. package/scripts/issue/issue-cite-main.ts +12 -0
  358. package/scripts/issue/issue-classification.ts +13 -8
  359. package/scripts/issue/issue-comment-cli.ts +10 -24
  360. package/scripts/issue/issue-comment-main.ts +12 -0
  361. package/scripts/issue/issue-evidence-exit.ts +100 -0
  362. package/scripts/issue/issue-file-cli.ts +29 -7
  363. package/scripts/issue/issue-file.ts +19 -19
  364. package/scripts/issue/issue-fold-cli.ts +2 -11
  365. package/scripts/issue/issue-fold-main.ts +12 -0
  366. package/scripts/issue/issue-labels.ts +81 -90
  367. package/scripts/issue/issue-lint-cli.ts +7 -13
  368. package/scripts/issue/issue-lint-main.ts +12 -0
  369. package/scripts/issue/issue-measured-cli.ts +56 -0
  370. package/scripts/issue/issue-merged.ts +19 -2
  371. package/scripts/issue/issue-not-before-label.ts +135 -0
  372. package/scripts/issue/issue-not-before.ts +111 -0
  373. package/scripts/issue/issue-number-shape.ts +15 -1
  374. package/scripts/issue/issue-park.ts +28 -0
  375. package/scripts/issue/issue-plan-cli.ts +151 -0
  376. package/scripts/issue/issue-priority.ts +151 -0
  377. package/scripts/issue/issue-rank.ts +7 -1
  378. package/scripts/issue/issue-read-cli.ts +3 -10
  379. package/scripts/issue/issue-read-main.ts +12 -0
  380. package/scripts/issue/issue-read.ts +29 -5
  381. package/scripts/issue/issue-release-cli.ts +0 -10
  382. package/scripts/issue/issue-release-main.ts +13 -0
  383. package/scripts/issue/issue-release.ts +7 -12
  384. package/scripts/issue/issue-sample-gate.ts +192 -0
  385. package/scripts/issue/issue-sample-source.ts +76 -0
  386. package/scripts/issue/issue-scout-cli.ts +19 -25
  387. package/scripts/issue/issue-scout-main.ts +14 -0
  388. package/scripts/issue/issue-state-cli.ts +0 -10
  389. package/scripts/issue/issue-state-main.ts +12 -0
  390. package/scripts/issue/issue-watch-diff.ts +56 -15
  391. package/scripts/issue/issue-watch.ts +2 -1
  392. package/scripts/issue/issue-wip.ts +2 -7
  393. package/scripts/issue/markdown-section.ts +19 -5
  394. package/scripts/issue/measure-rerun-cli.ts +13 -8
  395. package/scripts/issue/plan-consumers-cli.ts +39 -0
  396. package/scripts/issue/plan-consumers-main.ts +11 -0
  397. package/scripts/issue/plan-consumers-section.ts +55 -0
  398. package/scripts/issue/plan-consumers.ts +127 -0
  399. package/scripts/josh/agent-session-environment.ts +1 -1
  400. package/scripts/josh/command-usage.ts +82 -0
  401. package/scripts/josh/file-map-stamp.ts +49 -16
  402. package/scripts/josh/hook-decision.ts +32 -20
  403. package/scripts/josh/josh-command-map.ts +6 -1
  404. package/scripts/josh/josh-command-types.ts +65 -13
  405. package/scripts/josh/josh-commands-agent-hooks.ts +83 -0
  406. package/scripts/josh/josh-commands-ai.ts +169 -157
  407. package/scripts/josh/josh-commands-backlog.ts +82 -16
  408. package/scripts/josh/josh-commands-clone.ts +1 -0
  409. package/scripts/josh/josh-commands-development.ts +111 -71
  410. package/scripts/josh/josh-commands-document.ts +43 -1
  411. package/scripts/josh/josh-commands-epic.ts +171 -0
  412. package/scripts/josh/josh-commands-hooks.ts +31 -2
  413. package/scripts/josh/josh-commands-issue-write.ts +181 -0
  414. package/scripts/josh/josh-commands-issue.ts +124 -24
  415. package/scripts/josh/josh-commands-lane.ts +112 -2
  416. package/scripts/josh/josh-commands-lint.ts +19 -8
  417. package/scripts/josh/josh-commands-maintenance.ts +112 -4
  418. package/scripts/josh/josh-commands-pause.ts +29 -0
  419. package/scripts/josh/josh-commands-progress.ts +87 -0
  420. package/scripts/josh/josh-commands-project.ts +138 -9
  421. package/scripts/josh/josh-commands-review.ts +124 -0
  422. package/scripts/josh/josh-commands-run.ts +211 -23
  423. package/scripts/josh/josh-commands-ship.ts +169 -0
  424. package/scripts/josh/josh-commands-split.ts +9 -0
  425. package/scripts/josh/josh-commands-versioning.ts +49 -2
  426. package/scripts/josh/josh-commands-workflow.ts +149 -6
  427. package/scripts/josh/josh-logic.ts +11 -27
  428. package/scripts/josh/josh.ts +14 -5
  429. package/scripts/josh/package-directory.ts +18 -0
  430. package/scripts/josh/process-identity.ts +13 -4
  431. package/scripts/josh/session-language-cli.ts +4 -8
  432. package/scripts/josh/session-language-main.ts +13 -0
  433. package/scripts/josh/session-language.ts +6 -1
  434. package/scripts/josh/shared-cache.ts +90 -0
  435. package/scripts/josh/stamp-file.ts +9 -15
  436. package/scripts/lane/lane-await.ts +51 -12
  437. package/scripts/lane/lane-cache.ts +5 -30
  438. package/scripts/lane/lane-capacity.ts +19 -22
  439. package/scripts/lane/lane-check-stats.ts +97 -0
  440. package/scripts/lane/lane-child-invocation.ts +43 -4
  441. package/scripts/lane/lane-cli.ts +15 -5
  442. package/scripts/lane/lane-close.ts +86 -18
  443. package/scripts/lane/lane-core-wait-stats.ts +66 -0
  444. package/scripts/lane/lane-dispatch.ts +27 -6
  445. package/scripts/lane/lane-gap-stats.ts +156 -0
  446. package/scripts/lane/lane-guard-policy.ts +2 -2
  447. package/scripts/lane/lane-handoff.ts +76 -1
  448. package/scripts/lane/lane-held-stats.ts +129 -0
  449. package/scripts/lane/lane-install.ts +16 -15
  450. package/scripts/lane/lane-launch-cli.ts +0 -9
  451. package/scripts/lane/lane-launch-main.ts +12 -0
  452. package/scripts/lane/lane-ledger-schema.ts +266 -0
  453. package/scripts/lane/lane-ledger.ts +108 -97
  454. package/scripts/lane/lane-limit-cli.ts +19 -9
  455. package/scripts/lane/lane-measure-cli.ts +58 -10
  456. package/scripts/lane/lane-open.ts +9 -1
  457. package/scripts/lane/lane-parked.ts +3 -3
  458. package/scripts/lane/lane-pause-cli.ts +130 -0
  459. package/scripts/lane/lane-pause.ts +158 -0
  460. package/scripts/lane/lane-preserve.ts +29 -1
  461. package/scripts/lane/lane-process-table.ts +166 -0
  462. package/scripts/lane/lane-reap-settle.ts +124 -0
  463. package/scripts/lane/lane-reap.ts +50 -15
  464. package/scripts/lane/lane-registry.ts +33 -10
  465. package/scripts/lane/lane-residents.ts +162 -0
  466. package/scripts/lane/lane-restart.ts +26 -27
  467. package/scripts/lane/lane-round-two-stats.ts +49 -0
  468. package/scripts/lane/lane-sampler.ts +4 -0
  469. package/scripts/lane/lane-session-action.ts +160 -0
  470. package/scripts/lane/lane-session-broker.ts +134 -134
  471. package/scripts/lane/lane-snapshot-trace.ts +84 -0
  472. package/scripts/lane/lane-spans.ts +51 -0
  473. package/scripts/lane/lane-spent.ts +6 -3
  474. package/scripts/lane/lane-stage-stats.ts +7 -2
  475. package/scripts/lane/lane-state.ts +302 -0
  476. package/scripts/lane/lane-stats.ts +58 -4
  477. package/scripts/lane/lane-stop-stats.ts +113 -37
  478. package/scripts/lane/lane-test-related-stats.ts +127 -0
  479. package/scripts/lane/lane-transcript-calls.ts +145 -0
  480. package/scripts/lane/lane-transcript-stats.ts +168 -0
  481. package/scripts/lane/lane-vacant.ts +13 -3
  482. package/scripts/lane/lane-withdraw-cli.ts +72 -0
  483. package/scripts/lane/lane-withdraw.ts +183 -0
  484. package/scripts/lane/process-directories.ts +70 -0
  485. package/scripts/lane/process-lane-marks.ts +94 -0
  486. package/scripts/lib/atomic-write.ts +62 -0
  487. package/scripts/lib/buffered-process.ts +12 -5
  488. package/scripts/lib/cli-flags.ts +53 -0
  489. package/scripts/lib/figure-format.ts +63 -0
  490. package/scripts/lib/json-value.ts +9 -1
  491. package/scripts/lib/package-manifest.ts +35 -0
  492. package/scripts/lib/read-file.ts +3 -1
  493. package/scripts/lib/stamped-memo.ts +63 -0
  494. package/scripts/lib/stdout-on-stderr.ts +24 -0
  495. package/scripts/lib/timeouts.ts +9 -0
  496. package/scripts/lib/transcript-record.ts +91 -0
  497. package/scripts/lines/effective-limit.ts +1 -1
  498. package/scripts/lint/eslint-cache-dependencies.ts +145 -0
  499. package/scripts/lint/eslint-daemon.ts +265 -0
  500. package/scripts/lint/format.ts +14 -5
  501. package/scripts/lint/import-graph.ts +279 -0
  502. package/scripts/lint/lint-gate-scope.ts +102 -0
  503. package/scripts/lint/lint-parallel-main.ts +19 -0
  504. package/scripts/lint/lint-parallel.ts +72 -33
  505. package/scripts/lint/lint-related-scope.ts +33 -24
  506. package/scripts/lint/lint-related.ts +38 -6
  507. package/scripts/notify/confirmation-options.ts +1 -2
  508. package/scripts/notify/telegram-notify.ts +20 -20
  509. package/scripts/notify/telegram-test-logic.ts +0 -1
  510. package/scripts/notify/telegram-test-main.ts +8 -0
  511. package/scripts/notify/telegram-test.ts +12 -11
  512. package/scripts/observations/observation-ledger.ts +13 -0
  513. package/scripts/observations/observations-flush-landing.ts +5 -3
  514. package/scripts/observations/observations-flush.ts +6 -1
  515. package/scripts/overrides/overrides-check.ts +2 -5
  516. package/scripts/overrides/overrides-files.ts +2 -1
  517. package/scripts/overrides/overrides-logic.ts +3 -6
  518. package/scripts/package/verify-optional-eslint-install.ts +8 -6
  519. package/scripts/propagate/propagate-publish.ts +2 -7
  520. package/scripts/propagate/propagate-targets.ts +4 -12
  521. package/scripts/refactor/import-graph.ts +9 -7
  522. package/scripts/release/github-release-runs.ts +17 -6
  523. package/scripts/release/release-approval-prune.ts +18 -0
  524. package/scripts/release/release-history.ts +1 -3
  525. package/scripts/release/release-progress.ts +42 -22
  526. package/scripts/release/release-publish-run.ts +39 -0
  527. package/scripts/release/release-publish.ts +6 -6
  528. package/scripts/release/release-scope-cli.ts +0 -10
  529. package/scripts/release/release-scope-main.ts +12 -0
  530. package/scripts/repo/repo-setting.ts +3 -6
  531. package/scripts/repo/required-checks-logic.ts +6 -15
  532. package/scripts/report/report-format-reference.ts +4 -0
  533. package/scripts/report/report-labels.ts +155 -0
  534. package/scripts/report/report-lint-cli.ts +3 -0
  535. package/scripts/report/report-lint.ts +85 -110
  536. package/scripts/report/report-template-cli.ts +59 -0
  537. package/scripts/report/report-template.ts +112 -0
  538. package/scripts/review/acceptance-map-check.ts +61 -0
  539. package/scripts/review/acceptance-map.ts +206 -0
  540. package/scripts/review/removed-tests-check.ts +86 -0
  541. package/scripts/review/removed-tests.ts +149 -0
  542. package/scripts/review/review-brief-cli.ts +82 -16
  543. package/scripts/review/review-brief-main.ts +12 -0
  544. package/scripts/review/review-brief.ts +31 -3
  545. package/scripts/review/review-code-tree.ts +10 -6
  546. package/scripts/review/review-comment-round.ts +26 -8
  547. package/scripts/review/review-finding-ledger.ts +30 -15
  548. package/scripts/review/review-interaction.ts +94 -0
  549. package/scripts/review/review-readers-scan.ts +163 -0
  550. package/scripts/review/review-record-cli.ts +69 -30
  551. package/scripts/review/review-record-main.ts +12 -0
  552. package/scripts/review/review-round-one-blobs.ts +221 -0
  553. package/scripts/review/review-round2-cli.ts +49 -12
  554. package/scripts/review/review-round2.ts +80 -12
  555. package/scripts/review/review-stamps.ts +19 -1
  556. package/scripts/review/review-stop-log.ts +96 -0
  557. package/scripts/review/review-stops-cli.ts +85 -0
  558. package/scripts/review/review-tree.ts +6 -17
  559. package/scripts/review/review-untouched-readers.ts +146 -0
  560. package/scripts/review/test-titles.ts +118 -0
  561. package/scripts/rules/agent-model.ts +67 -0
  562. package/scripts/rules/bash-triggers.ts +46 -3
  563. package/scripts/rules/decision-oracle-batch.ts +9 -1
  564. package/scripts/rules/decision-oracle.ts +2 -2
  565. package/scripts/rules/delivered-rules.ts +90 -3
  566. package/scripts/rules/destructive-command.ts +8 -1
  567. package/scripts/rules/direct-filing.ts +10 -2
  568. package/scripts/rules/direct-issue-comment.ts +117 -0
  569. package/scripts/rules/direct-pr-create.ts +69 -3
  570. package/scripts/rules/early-heartbeat.ts +2 -1
  571. package/scripts/rules/file-body.ts +7 -0
  572. package/scripts/rules/filing-cap.ts +8 -0
  573. package/scripts/rules/firing-point.ts +6 -5
  574. package/scripts/rules/git-argv.ts +72 -14
  575. package/scripts/rules/git-force.ts +12 -2
  576. package/scripts/rules/guard-remedy.ts +121 -0
  577. package/scripts/rules/implementation-cut-verdict.ts +1 -1
  578. package/scripts/rules/implementation-cut.ts +11 -3
  579. package/scripts/rules/index-guard.ts +8 -1
  580. package/scripts/rules/issue-comments.ts +76 -7
  581. package/scripts/rules/josh-git-bare.ts +7 -0
  582. package/scripts/rules/lane-background.ts +67 -25
  583. package/scripts/rules/lane-carry-conflict.ts +6 -0
  584. package/scripts/rules/lane-direct-tool.ts +74 -0
  585. package/scripts/rules/lane-interactive-ask.ts +9 -2
  586. package/scripts/rules/lane-park.ts +45 -23
  587. package/scripts/rules/lane-split-park.ts +10 -2
  588. package/scripts/rules/lane-switch-main.ts +7 -0
  589. package/scripts/rules/last-prompt.ts +50 -5
  590. package/scripts/rules/oracle-consulted.ts +10 -0
  591. package/scripts/rules/oracle-firing.ts +1 -0
  592. package/scripts/rules/oracle-list-cli.ts +7 -0
  593. package/scripts/rules/permission-guards.ts +3 -0
  594. package/scripts/rules/piped-verification.ts +4 -2
  595. package/scripts/rules/poll-loop.ts +7 -0
  596. package/scripts/rules/pr-merge.ts +123 -0
  597. package/scripts/rules/protected-files.ts +32 -5
  598. package/scripts/rules/raw-field-body.ts +6 -0
  599. package/scripts/rules/rule-body-guard.ts +8 -0
  600. package/scripts/rules/rule-list.ts +12 -28
  601. package/scripts/rules/rule-rewrite.ts +114 -0
  602. package/scripts/rules/rule-value-cache.ts +4 -9
  603. package/scripts/rules/rule-value-cli.ts +51 -32
  604. package/scripts/rules/rule-value.ts +8 -2
  605. package/scripts/rules/shell-segments.ts +50 -0
  606. package/scripts/rules/stop-decision.ts +77 -0
  607. package/scripts/rules/stop-rule-rows.ts +64 -0
  608. package/scripts/rules/stop-rules.ts +150 -51
  609. package/scripts/rules/tail-commands.ts +15 -1
  610. package/scripts/rules/test-declared-commit.ts +11 -1
  611. package/scripts/rules/third-party-write.ts +7 -0
  612. package/scripts/rules/timed-rerun.ts +69 -0
  613. package/scripts/rules/worktree-guard.ts +13 -3
  614. package/scripts/run/board/run-board-app-name.ts +23 -0
  615. package/scripts/run/board/run-board-cli.ts +65 -30
  616. package/scripts/run/board/run-board-closed.ts +8 -2
  617. package/scripts/run/board/run-board-earlier.ts +94 -0
  618. package/scripts/run/board/run-board-ending-reason.ts +67 -0
  619. package/scripts/run/board/run-board-estimate-schedule.ts +103 -0
  620. package/scripts/run/board/run-board-estimate.ts +98 -0
  621. package/scripts/run/board/run-board-fit.ts +153 -36
  622. package/scripts/run/board/run-board-fold.ts +123 -0
  623. package/scripts/run/board/run-board-fresh.ts +2 -2
  624. package/scripts/run/board/run-board-gather-live.ts +29 -0
  625. package/scripts/run/board/run-board-gather-thread.ts +189 -0
  626. package/scripts/run/board/run-board-gather-worker.ts +29 -0
  627. package/scripts/run/board/run-board-gather.ts +187 -0
  628. package/scripts/run/board/run-board-github.ts +119 -31
  629. package/scripts/run/board/run-board-header.ts +86 -21
  630. package/scripts/run/board/run-board-keys.ts +58 -0
  631. package/scripts/run/board/run-board-kind.ts +20 -6
  632. package/scripts/run/board/run-board-labels.ts +118 -71
  633. package/scripts/run/board/run-board-lane-state.ts +109 -0
  634. package/scripts/run/board/run-board-lane-time.ts +122 -0
  635. package/scripts/run/board/run-board-layout.ts +240 -61
  636. package/scripts/run/board/run-board-length.ts +52 -0
  637. package/scripts/run/board/run-board-machine.ts +8 -4
  638. package/scripts/run/board/run-board-main.ts +12 -0
  639. package/scripts/run/board/run-board-notes.ts +52 -31
  640. package/scripts/run/board/run-board-now.ts +1 -1
  641. package/scripts/run/board/run-board-operation.ts +15 -33
  642. package/scripts/run/board/run-board-phase.ts +1 -1
  643. package/scripts/run/board/run-board-plan-shared.ts +115 -0
  644. package/scripts/run/board/run-board-plan.ts +55 -3
  645. package/scripts/run/board/run-board-planning.ts +45 -0
  646. package/scripts/run/board/run-board-priority.ts +44 -0
  647. package/scripts/run/board/run-board-process-groups.ts +195 -0
  648. package/scripts/run/board/run-board-read.ts +153 -13
  649. package/scripts/run/board/run-board-reason.ts +238 -45
  650. package/scripts/run/board/run-board-released.ts +35 -0
  651. package/scripts/run/board/run-board-render-checks.ts +39 -5
  652. package/scripts/run/board/run-board-render-condition.ts +96 -0
  653. package/scripts/run/board/run-board-render-drawn.ts +67 -0
  654. package/scripts/run/board/run-board-render-foot.ts +59 -0
  655. package/scripts/run/board/run-board-render-icon.ts +35 -0
  656. package/scripts/run/board/run-board-render-lanes.ts +145 -0
  657. package/scripts/run/board/run-board-render-lead.ts +80 -0
  658. package/scripts/run/board/run-board-render-legend.ts +117 -47
  659. package/scripts/run/board/run-board-render-notes.ts +156 -29
  660. package/scripts/run/board/run-board-render-processes.ts +196 -0
  661. package/scripts/run/board/run-board-render-section.ts +119 -0
  662. package/scripts/run/board/run-board-render-slot.ts +3 -36
  663. package/scripts/run/board/run-board-render-tail.ts +115 -48
  664. package/scripts/run/board/run-board-render-time.ts +56 -0
  665. package/scripts/run/board/run-board-render-title.ts +117 -24
  666. package/scripts/run/board/run-board-render-waits.ts +125 -0
  667. package/scripts/run/board/run-board-render.ts +206 -259
  668. package/scripts/run/board/run-board-roots.ts +54 -0
  669. package/scripts/run/board/run-board-row-yield.ts +10 -4
  670. package/scripts/run/board/run-board-setup.ts +1 -12
  671. package/scripts/run/board/run-board-snapshot.ts +111 -0
  672. package/scripts/run/board/run-board-spin.ts +2 -2
  673. package/scripts/run/board/run-board-state.ts +23 -29
  674. package/scripts/run/board/run-board-status.ts +206 -79
  675. package/scripts/run/board/run-board-thanks-read.ts +2 -2
  676. package/scripts/run/board/run-board-tick.ts +123 -104
  677. package/scripts/run/board/run-board-usage-board.ts +78 -0
  678. package/scripts/run/board/run-board-usage-lanes.ts +113 -0
  679. package/scripts/run/board/run-board-usage-listing.ts +93 -0
  680. package/scripts/run/board/run-board-usage-read.ts +120 -150
  681. package/scripts/run/board/run-board-usage-rusage.ts +19 -7
  682. package/scripts/run/board/run-board-usage-text.ts +139 -51
  683. package/scripts/run/board/run-board-usage-top.ts +102 -0
  684. package/scripts/run/board/run-board-usage.ts +89 -72
  685. package/scripts/run/board/run-board-usual.ts +20 -9
  686. package/scripts/run/carry/run-carry-args.ts +4 -7
  687. package/scripts/run/carry/run-carry-conversation.ts +1 -1
  688. package/scripts/run/carry/run-carry.ts +9 -4
  689. package/scripts/run/cut/run-cut-cli.ts +3 -2
  690. package/scripts/run/cut/run-cut-handoff.ts +2 -2
  691. package/scripts/run/cut/run-cut-report.ts +16 -0
  692. package/scripts/run/detached-launch.ts +23 -4
  693. package/scripts/run/entry/run-entry-cli.ts +8 -1
  694. package/scripts/run/event/run-event-cli.ts +1 -5
  695. package/scripts/run/event/run-event-filed.ts +12 -6
  696. package/scripts/run/event/run-event-follow.ts +2 -3
  697. package/scripts/run/event/run-event-render.ts +7 -10
  698. package/scripts/run/event/run-event-scope.ts +20 -2
  699. package/scripts/run/event/run-event-stream-emit.ts +78 -11
  700. package/scripts/run/event/run-event-stream.ts +37 -7
  701. package/scripts/run/hold/run-hold-adopt.ts +65 -0
  702. package/scripts/run/hold/run-hold-cli.ts +93 -22
  703. package/scripts/run/hold/run-hold-main.ts +12 -0
  704. package/scripts/run/hold/run-hold-member.ts +37 -0
  705. package/scripts/run/hold/run-hold-session.ts +46 -0
  706. package/scripts/run/hold/run-hold.ts +7 -1
  707. package/scripts/run/hold/run-stop-notify.ts +183 -0
  708. package/scripts/run/launch-priority.ts +32 -0
  709. package/scripts/run/merge/run-merge-auth.ts +31 -0
  710. package/scripts/run/merge/run-merge-cli.ts +72 -107
  711. package/scripts/run/merge/run-merge-close.ts +74 -0
  712. package/scripts/run/merge/run-merge-collect.ts +6 -13
  713. package/scripts/run/merge/run-merge-driver.ts +71 -0
  714. package/scripts/run/merge/run-merge-main.ts +12 -0
  715. package/scripts/run/merge/run-merge-outcome.ts +23 -0
  716. package/scripts/run/merge/run-merge-restart.ts +39 -0
  717. package/scripts/run/merge/run-merge-ship.ts +20 -4
  718. package/scripts/run/merge/run-merge-signals.ts +123 -0
  719. package/scripts/run/merge/run-merge-steps.ts +128 -83
  720. package/scripts/run/merge/run-merge.ts +53 -40
  721. package/scripts/run/park/run-park-cli.ts +91 -0
  722. package/scripts/run/park/run-park.ts +88 -0
  723. package/scripts/run/park/run-stalled.ts +68 -0
  724. package/scripts/run/pause/run-pause-cli.ts +73 -0
  725. package/scripts/run/pause/run-pause.ts +251 -0
  726. package/scripts/run/progress/run-progress-cli.ts +4 -12
  727. package/scripts/run/progress/run-progress-clock.ts +1 -1
  728. package/scripts/run/progress/run-progress-config.ts +6 -14
  729. package/scripts/run/progress/run-progress-main.ts +12 -0
  730. package/scripts/run/progress/run-progress.ts +1 -4
  731. package/scripts/run/review/run-review.ts +2 -1
  732. package/scripts/run/run-ending.ts +1 -0
  733. package/scripts/run/run-invocation.ts +5 -6
  734. package/scripts/run/run-liveness-cli.ts +6 -8
  735. package/scripts/run/run-liveness.ts +61 -30
  736. package/scripts/run/run-next.ts +1 -1
  737. package/scripts/run/run-parent-cut-hook.ts +2 -2
  738. package/scripts/run/run-poll-hook.ts +157 -0
  739. package/scripts/run/run-preflight.ts +18 -3
  740. package/scripts/run/run-prep-cli.ts +1 -10
  741. package/scripts/run/run-prep-locate.ts +7 -50
  742. package/scripts/run/run-prep-main.ts +12 -0
  743. package/scripts/run/run-prep.ts +6 -0
  744. package/scripts/run/run-report-cli.ts +101 -13
  745. package/scripts/run/run-report-handoff.ts +114 -0
  746. package/scripts/run/run-step-cli.ts +22 -15
  747. package/scripts/run/run-step-section.ts +85 -0
  748. package/scripts/run/run-step.ts +1 -1
  749. package/scripts/run/run-stranded-detect.ts +13 -0
  750. package/scripts/run/run-watcher-guard-cli.ts +1 -1
  751. package/scripts/run/run-watcher-guard.ts +1 -1
  752. package/scripts/run/ship/run-ship-args.ts +121 -0
  753. package/scripts/run/ship/run-ship-body-draft.ts +110 -0
  754. package/scripts/run/ship/run-ship-cli.ts +67 -151
  755. package/scripts/run/ship/run-ship-detach.ts +27 -7
  756. package/scripts/run/ship/run-ship-infra-retry.ts +59 -0
  757. package/scripts/run/ship/run-ship-next.ts +27 -3
  758. package/scripts/run/ship/run-ship-overlap.ts +232 -0
  759. package/scripts/run/ship/run-ship-place.ts +96 -0
  760. package/scripts/run/ship/run-ship-pre-detach-timed.ts +43 -0
  761. package/scripts/run/ship/run-ship-pre-detach.ts +102 -27
  762. package/scripts/run/ship/run-ship-preflight.ts +161 -30
  763. package/scripts/run/ship/run-ship-probe.ts +11 -3
  764. package/scripts/run/ship/run-ship-relaunch-cap.ts +70 -0
  765. package/scripts/run/ship/run-ship-removed-rows.ts +61 -0
  766. package/scripts/run/ship/run-ship-return.ts +123 -15
  767. package/scripts/run/ship/run-ship-review-steps.ts +105 -149
  768. package/scripts/run/ship/run-ship-review.ts +73 -6
  769. package/scripts/run/ship/run-ship-reviewer.ts +207 -0
  770. package/scripts/run/ship/run-ship-stage.ts +55 -6
  771. package/scripts/run/ship/run-ship-steps.ts +46 -15
  772. package/scripts/run/ship/run-ship-stop-cause.ts +135 -0
  773. package/scripts/run/ship/run-ship-stop-context.ts +206 -0
  774. package/scripts/run/ship/run-ship-stop-text.ts +11 -6
  775. package/scripts/run/ship/run-ship-sync.ts +57 -12
  776. package/scripts/run/ship/run-ship.ts +30 -2
  777. package/scripts/run/tidy/run-tidy-cli.ts +0 -4
  778. package/scripts/run/tidy/run-tidy-lanes.ts +3 -0
  779. package/scripts/run/tidy/run-tidy-main.ts +8 -0
  780. package/scripts/run/wake/run-wake-cli.ts +119 -100
  781. package/scripts/run/wake/run-wake-code.ts +83 -0
  782. package/scripts/run/wake/run-wake-driver.ts +19 -8
  783. package/scripts/run/wake/run-wake-loop.ts +34 -3
  784. package/scripts/run/wake/run-wake-main.ts +13 -0
  785. package/scripts/run/wake/run-wake-ports.ts +90 -0
  786. package/scripts/run/wake/run-wake-takeover.ts +66 -0
  787. package/scripts/run/wake/run-wake.ts +2 -1
  788. package/scripts/safe-chain/pack-hook.ts +2 -2
  789. package/scripts/safe-chain/preinstall-command.ts +2 -1
  790. package/scripts/safe-chain/project-config.ts +3 -9
  791. package/scripts/security/security-audit-main.ts +8 -0
  792. package/scripts/security/security-audit-provision-logic.ts +0 -11
  793. package/scripts/security/security-audit-provision-main.ts +12 -0
  794. package/scripts/security/security-audit-provision.ts +11 -26
  795. package/scripts/security/security-audit.ts +6 -7
  796. package/scripts/self-sync-guard/self-sync-guard-logic.ts +6 -13
  797. package/scripts/split/split-assess-cli.ts +2 -2
  798. package/scripts/split/split-assess.ts +15 -0
  799. package/scripts/split/split-measure.ts +65 -0
  800. package/scripts/sync/claude-settings-merge.ts +8 -15
  801. package/scripts/sync/directory-copy-guard.ts +4 -9
  802. package/scripts/sync/file-content.ts +78 -8
  803. package/scripts/sync/sync-ai-files.ts +3 -5
  804. package/scripts/sync/sync-configs.ts +11 -23
  805. package/scripts/sync/sync-hook-safety.ts +4 -10
  806. package/scripts/sync/sync-main.ts +11 -0
  807. package/scripts/sync/sync.ts +25 -37
  808. package/scripts/test/test-declared-changed.ts +2 -2
  809. package/scripts/test/test-declared.ts +1 -1
  810. package/scripts/test/test-e2e-guard.ts +55 -6
  811. package/scripts/test/test-e2e-stamp.ts +38 -0
  812. package/scripts/test/test-pinned-logic.ts +145 -0
  813. package/scripts/test/test-pinned-main.ts +78 -0
  814. package/scripts/test/test-pinned.ts +100 -0
  815. package/scripts/test/test-read-map.ts +264 -0
  816. package/scripts/test/test-read-recording.ts +91 -0
  817. package/scripts/test/test-read-trace.ts +148 -0
  818. package/scripts/test/test-red-main.ts +12 -0
  819. package/scripts/test/test-red.ts +12 -30
  820. package/scripts/test/test-related-main.ts +18 -0
  821. package/scripts/test/test-related-record.ts +119 -0
  822. package/scripts/test/test-related-scope.ts +229 -43
  823. package/scripts/test/test-related.ts +300 -22
  824. package/scripts/test/test-unit-guard-main.ts +15 -0
  825. package/scripts/test/test-unit-guard.ts +54 -21
  826. package/scripts/test/unit-count-file.ts +37 -0
  827. package/scripts/test/unit-run-marker.ts +162 -0
  828. package/scripts/test/unit-setup-files.ts +51 -0
  829. package/scripts/test/unit-worker-share.ts +71 -137
  830. package/scripts/test/whole-suite-files.ts +63 -0
  831. package/scripts/time-runtime/time-background.ts +20 -2
  832. package/scripts/time-runtime/time-bundles.ts +4 -3
  833. package/scripts/time-runtime/time-density-hook.ts +8 -6
  834. package/scripts/time-runtime/time-followup-stage.ts +1 -3
  835. package/scripts/time-runtime/time-format.ts +5 -28
  836. package/scripts/time-runtime/time-markers.ts +10 -1
  837. package/scripts/time-runtime/time-shell.ts +126 -14
  838. package/scripts/time-runtime/time-spans.ts +1 -0
  839. package/scripts/time-runtime/time-tool-call.ts +7 -0
  840. package/scripts/time-runtime/time-transcript-line.ts +49 -62
  841. package/scripts/uninstall/uninstall.ts +1 -1
  842. package/scripts/version/bump-version-main.ts +12 -0
  843. package/scripts/version/bump-version.ts +25 -25
  844. package/scripts/version/effective-upstream.ts +6 -12
  845. package/scripts/version/latest-corepack.ts +17 -32
  846. package/scripts/version/latest-if-required-cli.ts +93 -0
  847. package/scripts/version/latest-lane-guard-main.ts +8 -0
  848. package/scripts/version/latest-lane-guard.ts +0 -4
  849. package/scripts/version/latest-scope-cli.ts +0 -9
  850. package/scripts/version/latest-scope-main.ts +12 -0
  851. package/scripts/version/latest-update.ts +5 -5
  852. package/scripts/version/npm-registry.ts +44 -6
  853. package/scripts/version/publishable-range-check.ts +5 -16
  854. package/scripts/version/release-age.ts +1 -1
  855. package/scripts/version/release-hold.ts +1 -1
  856. package/scripts/version/release-window.ts +38 -0
  857. package/scripts/version/running-binary.ts +1 -1
  858. package/scripts/version/safe-chain-version-update.ts +3 -8
  859. package/scripts/version/version-targets.ts +6 -28
  860. package/templates/dependabot.yml +29 -0
  861. package/templates/gitignore +10 -3
  862. package/templates/pnpm-workspace.basic.yaml +1 -1
  863. package/templates/sonar-project.properties +3 -2
  864. package/templates/workflows/ci.yml +12 -4
  865. package/templates/workflows/github-release.yml +4 -0
  866. package/tsconfig.sonar.json +1 -1
  867. package/.ncurc.json +0 -3
  868. package/dist/hooks/batch-guard.js +0 -29
  869. package/dist/hooks/chunk-43ZHT22P.js +0 -3495
  870. package/dist/hooks/chunk-CDY4NFQG.js +0 -15
  871. package/dist/hooks/chunk-EUMACUK2.js +0 -2038
  872. package/dist/hooks/chunk-H5HVWYXK.js +0 -359
  873. package/dist/hooks/chunk-IIGFYXKC.js +0 -7104
  874. package/dist/hooks/chunk-IX6TTTI6.js +0 -95
  875. package/dist/hooks/chunk-J47HU5H5.js +0 -237
  876. package/dist/hooks/chunk-K4EOONYM.js +0 -45
  877. package/dist/hooks/chunk-K4LMBQC2.js +0 -68
  878. package/dist/hooks/chunk-SHGPANFB.js +0 -56
  879. package/dist/hooks/chunk-YHBZAJSV.js +0 -79
  880. package/dist/hooks/chunk-YYPI7SJZ.js +0 -131
  881. package/dist/hooks/duplicate-read-guard.js +0 -30
  882. package/dist/hooks/investigation-guard.js +0 -32
  883. package/scripts/backlog/backlog-stalled-cli.ts +0 -30
  884. package/scripts/cost-runtime/cost-format.ts +0 -29
  885. package/scripts/init/basic-path-migration.ts +0 -24
  886. package/scripts/issue/issue-backlinks-cli.ts +0 -93
  887. package/scripts/josh/josh-commands-guard.ts +0 -38
  888. package/scripts/lint/cross-file-recheck.ts +0 -155
  889. package/scripts/registry-migration/migrate-logic.ts +0 -237
  890. package/scripts/registry-migration/migrate.ts +0 -292
  891. package/scripts/registry-migration/user-npmrc.ts +0 -15
  892. package/scripts/rules/rule-guard.ts +0 -23
  893. package/scripts/rules/rule-registry-rows.ts +0 -282
  894. package/scripts/rules/rule-registry.ts +0 -109
  895. package/scripts/run/run-stranded-cli.ts +0 -27
@@ -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,7 +1,10 @@
1
- #!/usr/bin/env tsx
2
- import { fileURLToPath } from 'node:url'
3
1
  import { project_checks } from '#scripts/gate/project-checks'
4
- import { ESLINT_CACHE_FILE, ESLINT_CACHE_FLAGS } from '#scripts/josh/josh-command-types'
2
+ import { changed_file_scope } from '#scripts/git/changed-file-scope'
3
+ import {
4
+ ESLINT_CACHE_FILE,
5
+ ESLINT_CACHE_FLAGS,
6
+ PRETTIER_CACHE_FLAGS,
7
+ } from '#scripts/josh/josh-command-types'
5
8
  import { lane_cache_run } from '#scripts/lane/lane-cache-run'
6
9
  import {
7
10
  buffered_process,
@@ -9,34 +12,53 @@ import {
9
12
  type BufferedProcessResult,
10
13
  } from '#scripts/lib/buffered-process'
11
14
  import { SKIP_MARKER } from '#scripts/test/skip-marker'
12
- 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'
13
18
 
14
- const PRETTIER_ARGS = ['exec', 'prettier', '--check', '.'] as const
15
19
  // This — not the `lint:eslint` map entry — is the eslint invocation `josh gate` reaches, so the
16
20
  // cache flags come from the same constant the ignore rules are asserted against.
17
21
  // A copy here would keep writing the old location the day that constant
18
22
  // moves, with every test still green.
19
23
  const WHOLE_TREE = '.'
20
24
  const ESLINT_ARGS = ['exec', 'eslint', WHOLE_TREE, ...ESLINT_CACHE_FLAGS] as const
21
- const WHOLE_TREE_RECHECK: CrossFileRecheckOptions = {
22
- cache_file: ESLINT_CACHE_FILE,
23
- patterns: [WHOLE_TREE],
24
- }
25
25
 
26
- // What one eslint run is made of: the child's arguments, and what re-reading a cached cross-file report
27
- // (`cross-file-recheck.ts`) needs to ask the same question again — the cache file and the targets.
26
+ // Prettier's cache stays this checkout's own, never shared through `lane_cache_run` as eslint's is:
27
+ // its entries do not survive a move (`josh-command-types.ts` → `GATE_CACHE_SPECS`).
28
+ const PRETTIER_ARGS = ['exec', 'prettier', '--check', WHOLE_TREE, ...PRETTIER_CACHE_FLAGS] as const
29
+
30
+ // What one eslint run is made of: the child's arguments and the cache file they name.
28
31
  interface EslintRun {
29
32
  args: ReadonlyArray<string>
30
- 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)
31
50
  }
32
51
 
33
- // The finished report is re-read before it is returned, inside the lane's cache sharing, because
34
- // 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`).
35
54
  async function run_eslint(eslint: EslintRun): Promise<BufferedProcessResult> {
36
- return await lane_cache_run.run(eslint.recheck.cache_file, async () => {
37
- const result = await buffered_process.run_buffered_process(eslint.args)
55
+ const { cache_file } = eslint
38
56
 
39
- 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
+ )
40
62
  })
41
63
  }
42
64
 
@@ -96,19 +118,16 @@ function lint_exit_code(prettier: BufferedProcessResult, eslint: BufferedProcess
96
118
  // and through the same basic-project skip, so a narrowed run never reaches a tool the whole-tree
97
119
  // run would have skipped. The skip reasons answer nothing for a full
98
120
  // project, so the one path serves both profiles.
99
- //
100
- // A narrowed run re-reads a cached cross-file report too (`cross-file-recheck.ts`): one change's
101
- // files can hold both the reported file and the one it reads, and fixing the second leaves the
102
- // first's cached report standing.
103
121
  async function run_lint_checks(
104
122
  prettier_args: ReadonlyArray<string>,
105
123
  eslint_args: ReadonlyArray<string>,
106
- recheck: CrossFileRecheckOptions,
124
+ cache_file: string,
125
+ options: LintRunOptions = COLD_RUN,
107
126
  ): Promise<number> {
108
127
  const directory = process.cwd()
109
128
  const [prettier, eslint] = await Promise.all([
110
129
  run_prettier(directory, prettier_args),
111
- run_checked_eslint(directory, { args: eslint_args, recheck }),
130
+ run_checked_eslint(directory, { args: eslint_args, cache_file, ...options }),
112
131
  ])
113
132
 
114
133
  write_output(with_ran_notice('prettier', prettier, eslint))
@@ -118,18 +137,38 @@ async function run_lint_checks(
118
137
  }
119
138
 
120
139
  async function run_lint_parallel_checks(): Promise<number> {
121
- 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)
122
141
  }
123
142
 
124
- // `process.exitCode` rather than `process.exit()`: both reports are buffered and written here in
125
- // one go, and `process.exit()` truncates a piped stdout at its buffer size — which is exactly how
126
- // this command is read when `josh gate` runs it as one of four concurrent checks. Setting the code
127
- // lets the writes drain and the process end on its own, which it can, since both children have
128
- // already exited by here.
129
- if (process.argv[1] === fileURLToPath(import.meta.url)) {
130
- 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)
131
158
  }
132
159
 
133
- 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
+ }
134
173
 
135
- export { ESLINT_ARGS, lint_parallel }
174
+ export { ESLINT_ARGS, lint_parallel, PRETTIER_ARGS }
@@ -8,16 +8,14 @@ import {
8
8
  import {
9
9
  ESLINT_RELATED_CACHE_FILE,
10
10
  ESLINT_RELATED_CACHE_FLAGS,
11
+ PRETTIER_RELATED_CACHE_FLAGS,
11
12
  } from '#scripts/josh/josh-command-types'
12
- import type { CrossFileRecheckOptions } from './cross-file-recheck'
13
13
 
14
14
  // `josh lint` reads the whole repository on every call, and an implementation loop calls it after
15
15
  // every few edits — re-reading files the change never touched.
16
16
  //
17
- // **This narrowing is added in front of the whole check, never in place of it.** `josh gate` still
18
- // runs `josh lint` over everything before the commit: a formatting rule can be broken by a file the
19
- // change did not name (a shared config, a generated snapshot), and only the whole-tree run sees
20
- // 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.
21
19
  //
22
20
  // The decision this file makes is which extensions the two linters read, and how each of them is
23
21
  // asked about a file list instead of a directory. Everything it shares with `josh test:related` —
@@ -94,39 +92,49 @@ function describe_scope(scope: ChangedFileScope, root: string): string {
94
92
  return changed_file_scope.describe_scope(scope, root, VOCABULARY)
95
93
  }
96
94
 
97
- function prettier_arguments(files: ReadonlyArray<string>): ReadonlyArray<string> {
98
- return [...PRETTIER_ARGS, ...files]
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
+
110
+ // The scoped run's own cache file, for the reason eslint's below gives: prettier too rewrites its
111
+ // cache file whole, so a narrowed run sharing the gate's would discard entries a concurrent gate wrote.
112
+ function prettier_arguments(
113
+ files: ReadonlyArray<string>,
114
+ caches: LintCaches = RELATED_CACHES,
115
+ ): ReadonlyArray<string> {
116
+ return [...PRETTIER_ARGS, ...files, ...caches.prettier_flags]
99
117
  }
100
118
 
101
119
  // The cache file is this command's own rather than the gate's, because the two run at the same time.
102
- // `josh gate` lints the whole tree beside the review while an
120
+ // `josh gate` lints beside the review while an
103
121
  // implementation loop calls this command between edits, and each eslint run rewrites its cache file
104
122
  // whole from the copy it loaded at start-up — so on one file the run that finished last would
105
123
  // discard the other's entries, and a narrowed run finishing during a whole-tree run would roll the
106
124
  // cache back to its pre-gate state. Sharing would let a narrowed run warm the gate's cache only for
107
125
  // pruning, which says nothing about two writers. It is the same judgement the edit hook's own cache
108
126
  // file makes.
109
- //
110
- // **What is narrowed is still only the target list, never the gate.** `josh gate` runs `josh lint`
111
- // over the whole tree before any commit; this file decides which files a repeat call reads.
112
- function eslint_arguments(files: ReadonlyArray<string>): ReadonlyArray<string> {
113
- return [...ESLINT_ARGS, ...files, ...ESLINT_RELATED_CACHE_FLAGS, ...ESLINT_SCOPED_FLAGS]
114
- }
115
-
116
- // What re-reading a cached cross-file report (`cross-file-recheck.ts`) needs to ask the narrowed run's question
117
- // again: the same targets, the same cache file, and the Node API's spelling of `--no-warn-ignored`.
118
- function cross_file_recheck_options(files: ReadonlyArray<string>): CrossFileRecheckOptions {
119
- return {
120
- cache_file: ESLINT_RELATED_CACHE_FILE,
121
- patterns: files,
122
- eslint_options: { warnIgnored: false },
123
- }
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]
124
132
  }
125
133
 
126
134
  const lint_related_scope = {
127
135
  COMMAND_LABEL,
128
- cross_file_recheck_options,
129
136
  NOTHING_LINTABLE_REASON,
137
+ RELATED_CACHES,
130
138
  describe_scope,
131
139
  eslint_arguments,
132
140
  is_lintable,
@@ -134,4 +142,5 @@ const lint_related_scope = {
134
142
  scope_inputs,
135
143
  }
136
144
 
145
+ export type { LintCaches }
137
146
  export { lint_related_scope }