@joshuafolkken/kit 1.1240.0 → 1.1370.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 (934) hide show
  1. package/.claude/agents/investigator.md +1 -0
  2. package/.claude/settings.json +4 -0
  3. package/.claude/skills/dependency-update/SKILL.md +5 -3
  4. package/.claude/skills/epic-commands/SKILL.md +82 -113
  5. package/.claude/skills/epic-commands/epic-bundle.md +38 -63
  6. package/.claude/skills/epic-commands/execution-waves.md +30 -51
  7. package/.claude/skills/verify-ui/SKILL.md +13 -20
  8. package/.claude/skills/workflow-commands/SKILL.md +10 -10
  9. package/.claude/skills/workflow-commands/background-commands.md +4 -4
  10. package/.claude/skills/workflow-commands/backlogrun-child.md +30 -105
  11. package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +29 -0
  12. package/.claude/skills/workflow-commands/backlogrun-lanes.md +45 -131
  13. package/.claude/skills/workflow-commands/backlogrun-park.md +36 -53
  14. package/.claude/skills/workflow-commands/backlogrun-progress.md +81 -331
  15. package/.claude/skills/workflow-commands/backlogrun-recovery.md +29 -83
  16. package/.claude/skills/workflow-commands/backlogrun-steps.md +105 -424
  17. package/.claude/skills/workflow-commands/backlogrun.md +50 -61
  18. package/.claude/skills/workflow-commands/chain-rule.md +36 -40
  19. package/.claude/skills/workflow-commands/entry-sequence.md +6 -6
  20. package/.claude/skills/workflow-commands/followup.md +19 -20
  21. package/.claude/skills/workflow-commands/fullrun-steps.md +23 -27
  22. package/.claude/skills/workflow-commands/fullrun.md +10 -10
  23. package/.claude/skills/workflow-commands/halfrun.md +9 -8
  24. package/.claude/skills/workflow-commands/into-target.md +12 -18
  25. package/.claude/skills/workflow-commands/issue-comments.md +11 -26
  26. package/.claude/skills/workflow-commands/kickoff.md +26 -16
  27. package/.claude/skills/workflow-commands/latest-gate.md +17 -28
  28. package/.claude/skills/workflow-commands/needs-human-review.md +13 -24
  29. package/.claude/skills/workflow-commands/observation-filing.md +37 -28
  30. package/.claude/skills/workflow-commands/observation-ledger.md +48 -38
  31. package/.claude/skills/workflow-commands/pre-gate-cut.md +9 -9
  32. package/.claude/skills/workflow-commands/prerequisite.md +23 -15
  33. package/.claude/skills/workflow-commands/progress-watcher.md +17 -11
  34. package/.claude/skills/workflow-commands/prrun.md +3 -3
  35. package/.claude/skills/workflow-commands/retrospective.md +13 -18
  36. package/.claude/skills/workflow-commands/split-assessment.md +6 -4
  37. package/.claude/skills/workflow-commands/target-repository.md +25 -28
  38. package/.claude/skills/workflow-commands/working-tree-hold.md +11 -17
  39. package/.gitattributes +2 -1
  40. package/.github/workflows/ci.yml +14 -0
  41. package/.vscode/tasks.json +14 -0
  42. package/CLAUDE.md +10 -61
  43. package/README.md +29 -47
  44. package/SECURITY.md +1 -1
  45. package/dist/CLAUDE.md +10 -61
  46. package/dist/commands/document-section-cli.js +42 -10
  47. package/dist/config-merge/index.js +11 -2
  48. package/dist/hooks/audit-provision.js +2 -2
  49. package/dist/hooks/batch-guard.js +7 -7
  50. package/dist/hooks/{chunk-KHGB5S3Y.js → chunk-43G45XJF.js} +18 -20
  51. package/dist/hooks/{chunk-4TZVB44A.js → chunk-4TW4MQUL.js} +284 -362
  52. package/dist/hooks/{chunk-XZYKEM6J.js → chunk-76RK6E3H.js} +13 -11
  53. package/dist/hooks/{chunk-F3ELQ2AF.js → chunk-DZWZ3DKY.js} +4 -4
  54. package/dist/hooks/{chunk-5VNDSNG3.js → chunk-FZ6FUSBM.js} +1 -1
  55. package/dist/hooks/{chunk-GPTFMK5E.js → chunk-GG72ANKI.js} +1 -1
  56. package/dist/hooks/{chunk-ZQGD4GBY.js → chunk-KPM4YIIX.js} +8 -44
  57. package/dist/hooks/chunk-MXVQMLDP.js +3705 -0
  58. package/dist/hooks/{chunk-ELCN5LCH.js → chunk-NEC4AT4Z.js} +34 -12
  59. package/dist/hooks/{chunk-QVSWU24O.js → chunk-NZBHG6FW.js} +7 -5
  60. package/dist/hooks/chunk-NZN2UFI6.js +2409 -0
  61. package/dist/hooks/{chunk-KRBERBBI.js → chunk-R6CRQEAL.js} +4 -4
  62. package/dist/hooks/chunk-SYSRHRWU.js +1589 -0
  63. package/dist/hooks/{chunk-WK2XSHSI.js → chunk-TLJYAGZK.js} +549 -874
  64. package/dist/hooks/chunk-Z5TMJIPW.js +45 -0
  65. package/dist/hooks/codex-hook-adapter.js +26 -21
  66. package/dist/hooks/duplicate-read-guard.js +8 -8
  67. package/dist/hooks/format-edited.js +4 -4
  68. package/dist/hooks/inputs.json +216 -202
  69. package/dist/hooks/investigation-guard.js +8 -8
  70. package/dist/hooks/pretool-guard.js +15 -15
  71. package/dist/hooks/session-lang.js +406 -8
  72. package/dist/hooks/stop-guard.js +122 -187
  73. package/dist/josh.js +281 -94
  74. package/dist/version/index.js +15 -13
  75. package/eslint/base.js +43 -5
  76. package/eslint/rules/english-only-prose.js +3 -3
  77. package/eslint/rules/import.js +12 -0
  78. package/eslint/rules/namespace-object-export.js +2 -2
  79. package/package.json +16 -10
  80. package/pnpm-workspace.yaml +2 -4
  81. package/prompts/coding-standards.md +14 -48
  82. package/prompts/collaboration-workflow/file-edits.md +1 -1
  83. package/prompts/collaboration-workflow/issue-citation.md +1 -1
  84. package/prompts/collaboration-workflow/issue-template.md +3 -10
  85. package/prompts/collaboration-workflow/operating-rules.md +7 -8
  86. package/prompts/collaboration-workflow/output-bounds.md +1 -1
  87. package/prompts/collaboration-workflow/overview.md +1 -1
  88. package/prompts/collaboration-workflow/plan-comment.md +2 -1
  89. package/prompts/collaboration-workflow/principles.md +21 -3
  90. package/prompts/collaboration-workflow/report-format.md +16 -29
  91. package/prompts/collaboration-workflow/residency.md +1 -1
  92. package/prompts/collaboration-workflow/rule-delivery.md +7 -95
  93. package/prompts/collaboration-workflow/shell-body.md +3 -23
  94. package/prompts/collaboration-workflow/turn-batching.md +4 -13
  95. package/prompts/collaboration-workflow/wip-cap.md +5 -11
  96. package/prompts/refactoring.md +1 -1
  97. package/prompts/review-rubric.md +3 -22
  98. package/prompts/review.md +15 -38
  99. package/prompts/testing-guide.md +2 -4
  100. package/scripts/adopt/adopt-logic.ts +5 -5
  101. package/scripts/adopt/adopt-toolkits.ts +4 -5
  102. package/scripts/adopt/adopt.ts +2 -3
  103. package/scripts/agent/agent-argv.ts +7 -7
  104. package/scripts/agent/agent-diagnostics.ts +2 -2
  105. package/scripts/agent/agent-exit-record.ts +1 -1
  106. package/scripts/agent/agent-headless.ts +1 -1
  107. package/scripts/agent/agent-launch-environment.ts +6 -1
  108. package/scripts/agent/agent-role-profile.ts +49 -22
  109. package/scripts/agent/agent-session-role.ts +32 -0
  110. package/scripts/agent/api-outage.ts +1 -1
  111. package/scripts/agent/claude-agent-argv.ts +4 -4
  112. package/scripts/agent/claude-result-event.ts +4 -4
  113. package/scripts/agent/codex-hooks.ts +2 -2
  114. package/scripts/agent/interactive-ask.ts +3 -6
  115. package/scripts/auto-ok/auto-ok-cli.ts +46 -60
  116. package/scripts/backlog/backlog-arrival-added.ts +34 -0
  117. package/scripts/backlog/backlog-arrival.ts +54 -17
  118. package/scripts/backlog/backlog-budget-cli.ts +34 -6
  119. package/scripts/backlog/backlog-budget.ts +17 -24
  120. package/scripts/backlog/backlog-defect-priority.ts +1 -1
  121. package/scripts/backlog/backlog-drive-args.ts +5 -4
  122. package/scripts/backlog/backlog-drive-cli.ts +14 -10
  123. package/scripts/backlog/backlog-drive-epic.ts +85 -0
  124. package/scripts/backlog/backlog-drive-launch.ts +1 -1
  125. package/scripts/backlog/backlog-drive-named-offer.ts +60 -9
  126. package/scripts/backlog/backlog-drive-named.ts +39 -9
  127. package/scripts/backlog/backlog-drive-offer-argv.ts +1 -1
  128. package/scripts/backlog/backlog-drive-restore.ts +1 -1
  129. package/scripts/backlog/backlog-drive-retrospective.ts +2 -2
  130. package/scripts/backlog/backlog-drive.ts +43 -28
  131. package/scripts/backlog/backlog-idle.ts +88 -0
  132. package/scripts/backlog/backlog-named.ts +11 -15
  133. package/scripts/backlog/backlog-next.ts +26 -30
  134. package/scripts/backlog/backlog-offer-cli.ts +28 -23
  135. package/scripts/backlog/backlog-offer.ts +7 -7
  136. package/scripts/backlog/backlog-overlap.ts +178 -0
  137. package/scripts/backlog/backlog-plan-cli.ts +14 -90
  138. package/scripts/backlog/backlog-plan-read.ts +111 -0
  139. package/scripts/backlog/backlog-plan.ts +11 -10
  140. package/scripts/backlog/backlog-pool.ts +13 -14
  141. package/scripts/backlog/backlog-rank.ts +11 -11
  142. package/scripts/backlog/backlog-ready.ts +15 -10
  143. package/scripts/backlog/backlog-scope.ts +14 -15
  144. package/scripts/backlog/backlog-stalled-cli.ts +2 -2
  145. package/scripts/backlog/backlog-stalled-detect.ts +4 -4
  146. package/scripts/backlog/backlog-stalled.ts +5 -6
  147. package/scripts/backlog/backlog-waves.ts +4 -4
  148. package/scripts/backlog/backlogrun-args.ts +74 -0
  149. package/scripts/backlog/backlogrun-cli.ts +113 -0
  150. package/scripts/backlog/backlogrun-launch.ts +178 -0
  151. package/scripts/behavior/behavior-assertion.ts +6 -8
  152. package/scripts/behavior/behavior-cli.ts +1 -1
  153. package/scripts/behavior/behavior-rules.ts +3 -3
  154. package/scripts/build/build-claude-md.ts +4 -4
  155. package/scripts/build/build-codex-hooks.ts +2 -2
  156. package/scripts/build/build-commands.ts +1 -1
  157. package/scripts/build/build-hooks.ts +5 -5
  158. package/scripts/build/build.ts +1 -1
  159. package/scripts/build/hook-bundle-stamp.ts +109 -7
  160. package/scripts/build/local-bin.ts +2 -2
  161. package/scripts/cases/cases-cli.ts +1 -1
  162. package/scripts/cases/cases-logic.ts +2 -2
  163. package/scripts/ci/composite-actions.ts +1 -2
  164. package/scripts/ci/pr-classification.ts +2 -2
  165. package/scripts/claude/workflow-destination.ts +1 -1
  166. package/scripts/clone/clone-aggregate.ts +1 -1
  167. package/scripts/clone/clone-fingerprint.ts +1 -1
  168. package/scripts/clone/clone-scan-cli.ts +1 -1
  169. package/scripts/clone/clone-scan.ts +1 -1
  170. package/scripts/config-merge/index.ts +1 -1
  171. package/scripts/config-merge/json-format.ts +1 -3
  172. package/scripts/config-merge/patch-json-array.ts +90 -0
  173. package/scripts/config-merge/patch-json-key.ts +6 -3
  174. package/scripts/config-merge/patch-json-list.ts +1 -1
  175. package/scripts/cost-runtime/codex-usage.ts +1 -1
  176. package/scripts/cost-runtime/context-cut-payback.ts +4 -5
  177. package/scripts/cost-runtime/context-cut-threshold.ts +4 -6
  178. package/scripts/cost-runtime/cost-attribute.ts +3 -3
  179. package/scripts/cost-runtime/cost-blocks.ts +3 -4
  180. package/scripts/cost-runtime/cost-cli.ts +14 -11
  181. package/scripts/cost-runtime/cost-corpus.ts +11 -11
  182. package/scripts/cost-runtime/cost-pricing.ts +4 -4
  183. package/scripts/cost-runtime/cost-tokens.ts +1 -2
  184. package/scripts/cost-runtime/cost-transcript.ts +29 -29
  185. package/scripts/cost-runtime/cost-usage.ts +6 -7
  186. package/scripts/cost-runtime/cost-verdict.ts +10 -11
  187. package/scripts/cost-runtime/own-session.ts +1 -1
  188. package/scripts/cost-runtime/transcript-cwd.ts +2 -2
  189. package/scripts/delegation/delegation-cli.ts +4 -4
  190. package/scripts/delegation/delegation-policy.ts +13 -15
  191. package/scripts/delegation/duplicate-read-guard.ts +9 -10
  192. package/scripts/delegation/fanout-cli.ts +1 -1
  193. package/scripts/delegation/fanout.ts +1 -1
  194. package/scripts/delegation/investigation-guard.ts +18 -22
  195. package/scripts/delegation/investigation-reads.ts +48 -238
  196. package/scripts/discovery/repo-discovery.ts +1 -1
  197. package/scripts/discovery/repo-map-logic.ts +1 -2
  198. package/scripts/discovery/repo-origin.ts +3 -3
  199. package/scripts/discovery/repo-party-cli.ts +2 -2
  200. package/scripts/discovery/repo-party.ts +2 -2
  201. package/scripts/doctor/doctor-consumer.ts +1 -1
  202. package/scripts/doctor/doctor-io.ts +6 -7
  203. package/scripts/doctor/doctor-logic.ts +1 -1
  204. package/scripts/doctor/doctor-ports.ts +1 -1
  205. package/scripts/doctor/doctor.ts +8 -9
  206. package/scripts/document/backlogrun-parent-read-set.ts +5 -6
  207. package/scripts/document/bash-output-cap.ts +5 -7
  208. package/scripts/document/capped-print-part.ts +1 -1
  209. package/scripts/document/capped-print.ts +1 -1
  210. package/scripts/document/document-byte-budget.ts +33 -64
  211. package/scripts/document/document-byte-check.ts +4 -4
  212. package/scripts/document/document-reachability.ts +7 -8
  213. package/scripts/document/document-read-cli.ts +2 -2
  214. package/scripts/document/document-scan.ts +26 -2
  215. package/scripts/document/document-section-cli.ts +6 -8
  216. package/scripts/document/document-section.ts +8 -12
  217. package/scripts/document/edit-files-cli.ts +3 -4
  218. package/scripts/document/entry-read-budget.ts +8 -70
  219. package/scripts/document/entry-read-set.ts +51 -34
  220. package/scripts/document/lane-child-read-set.ts +9 -9
  221. package/scripts/document/read-files-cli.ts +1 -2
  222. package/scripts/document/read-set-cli.ts +16 -19
  223. package/scripts/document/read-set-cost.ts +4 -4
  224. package/scripts/document/read-set-point-of-use.ts +28 -38
  225. package/scripts/document/read-set-pricing.ts +1 -1
  226. package/scripts/document/read-set-trim.ts +3 -3
  227. package/scripts/document/resident-budget.ts +8 -10
  228. package/scripts/epic/epic-add-body.ts +15 -18
  229. package/scripts/epic/epic-add-plan.ts +26 -28
  230. package/scripts/epic/epic-add.ts +32 -25
  231. package/scripts/epic/epic-audit-checks.ts +27 -37
  232. package/scripts/epic/epic-audit-cli.ts +21 -22
  233. package/scripts/epic/epic-audit-orphans.ts +16 -17
  234. package/scripts/epic/epic-audit-rationale.ts +10 -15
  235. package/scripts/epic/epic-audit-report.ts +2 -5
  236. package/scripts/epic/epic-audit.ts +18 -14
  237. package/scripts/epic/epic-body.ts +10 -10
  238. package/scripts/epic/epic-bundle-cli.ts +36 -34
  239. package/scripts/epic/epic-bundle-evidence.ts +5 -5
  240. package/scripts/epic/epic-bundle-gaps.ts +6 -9
  241. package/scripts/epic/epic-bundle-poll.ts +1 -1
  242. package/scripts/epic/epic-bundle-referenced.ts +11 -14
  243. package/scripts/epic/epic-bundle.ts +19 -20
  244. package/scripts/epic/epic-busy.ts +44 -21
  245. package/scripts/epic/epic-candidate-confirm.ts +15 -18
  246. package/scripts/epic/epic-chains.ts +18 -23
  247. package/scripts/epic/epic-classify.ts +11 -12
  248. package/scripts/epic/epic-cli-argv.ts +5 -6
  249. package/scripts/epic/epic-cli-remove.ts +9 -4
  250. package/scripts/epic/epic-cli.ts +38 -26
  251. package/scripts/epic/epic-close-comment.ts +14 -15
  252. package/scripts/epic/epic-close.ts +25 -29
  253. package/scripts/epic/epic-cross-repo.ts +18 -21
  254. package/scripts/epic/epic-decision.ts +14 -18
  255. package/scripts/epic/epic-fetch.ts +25 -31
  256. package/scripts/epic/epic-graph.ts +15 -17
  257. package/scripts/epic/epic-index.ts +14 -16
  258. package/scripts/epic/epic-issue.ts +9 -11
  259. package/scripts/epic/epic-label-age.ts +74 -0
  260. package/scripts/epic/epic-lane-offer.ts +35 -24
  261. package/scripts/epic/epic-nested.ts +1 -1
  262. package/scripts/epic/epic-next-read.ts +8 -8
  263. package/scripts/epic/epic-next-views.ts +12 -12
  264. package/scripts/epic/epic-next.ts +29 -33
  265. package/scripts/epic/epic-outside-blocker.ts +11 -10
  266. package/scripts/epic/epic-parse.ts +22 -24
  267. package/scripts/epic/epic-promote.ts +3 -2
  268. package/scripts/epic/epic-rank.ts +1 -1
  269. package/scripts/epic/epic-read.ts +10 -8
  270. package/scripts/epic/epic-reconcile.ts +8 -6
  271. package/scripts/epic/epic-reference.ts +5 -4
  272. package/scripts/epic/epic-relation-recheck.ts +10 -11
  273. package/scripts/epic/epic-relations.ts +9 -8
  274. package/scripts/epic/epic-remove-plan.ts +4 -5
  275. package/scripts/epic/epic-remove.ts +7 -5
  276. package/scripts/epic/epic-report.ts +18 -20
  277. package/scripts/epic/epic-run.ts +6 -5
  278. package/scripts/epic/epic-sections.ts +2 -2
  279. package/scripts/epic/epic-shape.ts +3 -3
  280. package/scripts/epic/epic-solo-stale.ts +3 -2
  281. package/scripts/epic/epic-solo.ts +8 -8
  282. package/scripts/epic/epic-triage.ts +5 -4
  283. package/scripts/epic/epic-validate.ts +8 -7
  284. package/scripts/epic/epic.ts +5 -5
  285. package/scripts/exports/unused-members-cli.ts +1 -1
  286. package/scripts/followup/followup-issue-number.ts +1 -2
  287. package/scripts/followup/git-followup-cleanup.ts +6 -7
  288. package/scripts/followup/git-followup-finish.ts +11 -13
  289. package/scripts/followup/git-followup-flush.ts +11 -7
  290. package/scripts/followup/git-followup-issue-close.ts +16 -13
  291. package/scripts/followup/git-followup-label.ts +9 -6
  292. package/scripts/followup/git-followup-merged.ts +1 -1
  293. package/scripts/followup/git-followup-pending.ts +7 -9
  294. package/scripts/followup/git-followup-stages.ts +28 -17
  295. package/scripts/followup/git-followup-workflow.ts +19 -21
  296. package/scripts/followup/git-pr-followup-checks.ts +13 -20
  297. package/scripts/followup/git-pr-followup-wrapup.ts +7 -7
  298. package/scripts/followup/git-pr-followup.ts +18 -17
  299. package/scripts/gate/core-admission.ts +2 -2
  300. package/scripts/gate/core-budget.ts +15 -26
  301. package/scripts/gate/gate-ledger.ts +114 -0
  302. package/scripts/gate/gate-log.ts +7 -9
  303. package/scripts/gate/gate-plan.ts +70 -35
  304. package/scripts/gate/gate-report.ts +14 -15
  305. package/scripts/gate/gate-skip.ts +11 -13
  306. package/scripts/gate/gate-steps.ts +5 -1
  307. package/scripts/gate/gate-tree.ts +3 -4
  308. package/scripts/gate/hook-gate-reuse.ts +9 -9
  309. package/scripts/gate/machine-capacity.ts +168 -30
  310. package/scripts/gate/pre-commit-type-check.ts +4 -4
  311. package/scripts/gate/project-checks.ts +12 -4
  312. package/scripts/gate/scoped-green.ts +11 -18
  313. package/scripts/gate/type-check-command.ts +2 -2
  314. package/scripts/gate/type-check-step.ts +4 -4
  315. package/scripts/gate/verification-gate.ts +53 -51
  316. package/scripts/gh/gh-spawn.ts +2 -2
  317. package/scripts/gh/git-ai-review-scan.ts +3 -2
  318. package/scripts/gh/git-gh-api-path.ts +10 -11
  319. package/scripts/gh/git-gh-exec.ts +43 -48
  320. package/scripts/gh/git-gh-failure.ts +6 -9
  321. package/scripts/gh/git-gh-helpers.ts +1 -1
  322. package/scripts/gh/git-gh-issue-list.ts +15 -19
  323. package/scripts/gh/git-gh-issue-read.ts +43 -60
  324. package/scripts/gh/git-gh-issue-rest.ts +14 -15
  325. package/scripts/gh/git-gh-issue-write.ts +52 -40
  326. package/scripts/gh/git-gh-issue.ts +23 -24
  327. package/scripts/gh/git-gh-pr-auto-merge.ts +3 -3
  328. package/scripts/gh/git-gh-pr-read.ts +46 -50
  329. package/scripts/gh/git-gh-pr-rest.ts +23 -26
  330. package/scripts/gh/git-gh-pr-review.ts +2 -2
  331. package/scripts/gh/git-gh-pr-rollup.ts +4 -4
  332. package/scripts/gh/git-gh-pr-snapshot.ts +8 -10
  333. package/scripts/gh/git-gh-pr.ts +16 -16
  334. package/scripts/gh/git-gh-reachability.ts +11 -12
  335. package/scripts/gh/git-gh-repo.ts +2 -3
  336. package/scripts/gh/git-gh-rest-state.ts +1 -1
  337. package/scripts/gh/git-pr-ai-review.ts +6 -5
  338. package/scripts/gh/git-pr-checks-eval.ts +28 -30
  339. package/scripts/gh/git-pr-checks-parse.ts +14 -16
  340. package/scripts/gh/git-pr-checks-watch.ts +17 -17
  341. package/scripts/gh/git-pr-checks.ts +20 -23
  342. package/scripts/gh/git-pr-coderabbit.ts +8 -6
  343. package/scripts/gh/git-pr-confirmation.ts +5 -5
  344. package/scripts/gh/git-pr-managed-config.ts +7 -9
  345. package/scripts/gh/git-pr-messages.ts +1 -1
  346. package/scripts/gh/git-pr.ts +15 -16
  347. package/scripts/gh/github-issue-url.ts +8 -9
  348. package/scripts/git/base-tree.ts +66 -0
  349. package/scripts/git/change-base.ts +42 -2
  350. package/scripts/git/changed-file-scope.ts +5 -5
  351. package/scripts/git/changed-paths.ts +1 -2
  352. package/scripts/git/constants.ts +2 -2
  353. package/scripts/git/git-branch.ts +1 -1
  354. package/scripts/git/git-closes-keyword.ts +3 -3
  355. package/scripts/git/git-command.ts +53 -41
  356. package/scripts/git/git-common-directory.ts +3 -3
  357. package/scripts/git/git-diff-reads.ts +14 -15
  358. package/scripts/git/git-error.ts +1 -1
  359. package/scripts/git/git-execa-error.ts +1 -2
  360. package/scripts/git/git-issue.ts +10 -8
  361. package/scripts/git/git-location-environment.ts +3 -4
  362. package/scripts/git/git-ls-remote.ts +6 -8
  363. package/scripts/git/git-pre-push-hook.ts +11 -10
  364. package/scripts/git/git-preflight.ts +5 -5
  365. package/scripts/git/git-push-transport.ts +2 -2
  366. package/scripts/git/git-remote-branch.ts +1 -2
  367. package/scripts/git/git-schemas.ts +16 -23
  368. package/scripts/git/git-spawn-sync.ts +1 -1
  369. package/scripts/git/git-spawn.ts +37 -14
  370. package/scripts/git/git-ssh-keepalive.ts +12 -5
  371. package/scripts/git/git-staging.ts +7 -8
  372. package/scripts/git/git-workflow.ts +1 -1
  373. package/scripts/git/git-worktree.ts +35 -27
  374. package/scripts/git/gone-branch.ts +2 -2
  375. package/scripts/git/listing-cutoff.ts +1 -2
  376. package/scripts/git/lockfile-sync.ts +65 -0
  377. package/scripts/git/main-merge-guard.ts +1 -2
  378. package/scripts/git/main-merge.ts +7 -7
  379. package/scripts/git/main-sync.ts +23 -8
  380. package/scripts/git/parse-json-array.ts +18 -23
  381. package/scripts/git/repository-lock.ts +34 -2
  382. package/scripts/git/stash/git-stash.ts +4 -5
  383. package/scripts/git/stash/stash-orphans.ts +5 -3
  384. package/scripts/git/stash/stash-pop-args.ts +1 -1
  385. package/scripts/git/stash/stash-pop-cli.ts +3 -3
  386. package/scripts/git/stash/stash-sweep-lock.ts +2 -2
  387. package/scripts/hooks/batch-guard.ts +11 -13
  388. package/scripts/hooks/check-commit-message.ts +12 -9
  389. package/scripts/hooks/codex-hook-adapter.ts +16 -10
  390. package/scripts/hooks/edited-cspell.ts +3 -4
  391. package/scripts/hooks/format-edited-cli.ts +1 -1
  392. package/scripts/hooks/format-edited-file.ts +11 -17
  393. package/scripts/hooks/format-rewrite-notice.ts +19 -17
  394. package/scripts/hooks/pre-push-unit.ts +10 -14
  395. package/scripts/hooks/pretool-guard-cli.ts +4 -4
  396. package/scripts/hooks/pretool-guard.ts +93 -18
  397. package/scripts/hooks/reserved-run.ts +2 -2
  398. package/scripts/hooks/step-zero-notice.ts +1 -1
  399. package/scripts/hooks/stop-guard.ts +21 -10
  400. package/scripts/init/basic-path-migration.ts +2 -2
  401. package/scripts/init/claude-kit-only-settings.ts +2 -2
  402. package/scripts/init/claude-plugin-config.ts +2 -2
  403. package/scripts/init/distributed-paths.ts +4 -4
  404. package/scripts/init/hook-command-rewrite.ts +3 -3
  405. package/scripts/init/hook-launch.ts +5 -5
  406. package/scripts/init/init-actions.ts +13 -0
  407. package/scripts/init/init-ai-copy.ts +11 -11
  408. package/scripts/init/init-bootstrap.ts +3 -3
  409. package/scripts/init/init-copy-content.ts +4 -4
  410. package/scripts/init/init-logic-json-merge.ts +7 -9
  411. package/scripts/init/init-logic-migrate.ts +1 -1
  412. package/scripts/init/init-logic-templates.ts +1 -1
  413. package/scripts/init/init-logic-workspace.ts +4 -4
  414. package/scripts/init/init-logic-yaml-merge.ts +2 -2
  415. package/scripts/init/init-logic.ts +19 -22
  416. package/scripts/init/init.ts +7 -7
  417. package/scripts/init/kit-base-preset.ts +1 -1
  418. package/scripts/init/kit-setup-state.ts +1 -1
  419. package/scripts/init/kit-written-paths.ts +1 -2
  420. package/scripts/init/package-manager-pin.ts +1 -1
  421. package/scripts/init/project-profile-cli.ts +1 -1
  422. package/scripts/init/project-profile.ts +3 -3
  423. package/scripts/init/session-language-environment.ts +1 -1
  424. package/scripts/init/start-exec.ts +3 -4
  425. package/scripts/init/start-plan.ts +2 -2
  426. package/scripts/init/start-setup-pr.ts +3 -2
  427. package/scripts/init/start-steps.ts +2 -2
  428. package/scripts/init/tsconfig-preset-migration.ts +1 -1
  429. package/scripts/init/vscode-tasks.ts +62 -0
  430. package/scripts/issue/baseline-measure.ts +2 -2
  431. package/scripts/issue/behavior-change-lint.ts +2 -2
  432. package/scripts/issue/defect-rate-cli.ts +6 -7
  433. package/scripts/issue/defect-rate.ts +37 -27
  434. package/scripts/issue/git-next-issues.ts +9 -8
  435. package/scripts/issue/issue-auto-ok.ts +24 -11
  436. package/scripts/issue/issue-backlinks-cli.ts +5 -5
  437. package/scripts/issue/issue-backlinks.ts +6 -6
  438. package/scripts/issue/issue-cite-cli.ts +20 -18
  439. package/scripts/issue/issue-cite.ts +18 -8
  440. package/scripts/issue/issue-closing-pr.ts +4 -4
  441. package/scripts/issue/issue-comment-cli.ts +6 -4
  442. package/scripts/issue/issue-file-cli.ts +52 -15
  443. package/scripts/issue/issue-file-fold.ts +155 -0
  444. package/scripts/issue/issue-file.ts +9 -6
  445. package/scripts/issue/issue-fold-cli.ts +14 -9
  446. package/scripts/issue/issue-fold.ts +23 -8
  447. package/scripts/issue/issue-labels.ts +34 -38
  448. package/scripts/issue/issue-lint-cli.ts +2 -2
  449. package/scripts/issue/issue-lint.ts +1 -1
  450. package/scripts/issue/issue-merged.ts +10 -4
  451. package/scripts/issue/issue-number-shape.ts +27 -0
  452. package/scripts/issue/issue-rank.ts +1 -1
  453. package/scripts/issue/issue-read-cli.ts +4 -5
  454. package/scripts/issue/issue-read.ts +4 -5
  455. package/scripts/issue/issue-reference.ts +5 -5
  456. package/scripts/issue/issue-release-cli.ts +17 -7
  457. package/scripts/issue/issue-release.ts +3 -3
  458. package/scripts/issue/issue-report-failures.ts +7 -4
  459. package/scripts/issue/issue-scout-cli.ts +11 -11
  460. package/scripts/issue/issue-scout-closed.ts +4 -4
  461. package/scripts/issue/issue-scout.ts +4 -5
  462. package/scripts/issue/issue-state-cli.ts +17 -10
  463. package/scripts/issue/issue-state.ts +12 -13
  464. package/scripts/issue/issue-wip.ts +7 -7
  465. package/scripts/issue/markdown-section.ts +3 -3
  466. package/scripts/issue/measure-rerun-cli.ts +10 -9
  467. package/scripts/issue/reproduction-measure.ts +3 -3
  468. package/scripts/issue/session-cite.ts +56 -0
  469. package/scripts/josh/agent-session-environment.ts +10 -8
  470. package/scripts/josh/cli-body.ts +2 -2
  471. package/scripts/josh/command-suggest.ts +1 -1
  472. package/scripts/josh/file-map-stamp.ts +20 -23
  473. package/scripts/josh/hook-decision.ts +24 -28
  474. package/scripts/josh/josh-command-map.ts +4 -1
  475. package/scripts/josh/josh-command-types.ts +30 -35
  476. package/scripts/josh/josh-commands-ai.ts +6 -6
  477. package/scripts/josh/josh-commands-backlog.ts +15 -3
  478. package/scripts/josh/josh-commands-clone.ts +1 -1
  479. package/scripts/josh/josh-commands-development.ts +25 -4
  480. package/scripts/josh/josh-commands-document.ts +3 -3
  481. package/scripts/josh/josh-commands-guard.ts +3 -3
  482. package/scripts/josh/josh-commands-issue.ts +4 -5
  483. package/scripts/josh/josh-commands-lane.ts +14 -4
  484. package/scripts/josh/josh-commands-lint.ts +1 -1
  485. package/scripts/josh/josh-commands-run.ts +20 -6
  486. package/scripts/josh/josh-commands-split.ts +1 -2
  487. package/scripts/josh/josh-commands-versioning.ts +5 -5
  488. package/scripts/josh/josh-commands-workflow.ts +30 -22
  489. package/scripts/josh/josh-environment-file.ts +1 -1
  490. package/scripts/josh/josh-in-process.ts +3 -3
  491. package/scripts/josh/josh-logic.ts +6 -7
  492. package/scripts/josh/josh-run.ts +3 -3
  493. package/scripts/josh/josh-verdict.ts +9 -12
  494. package/scripts/josh/josh.ts +3 -3
  495. package/scripts/josh/kit-only.ts +2 -2
  496. package/scripts/josh/path-decision.ts +3 -3
  497. package/scripts/josh/platform-temporary.ts +7 -5
  498. package/scripts/josh/process-identity.ts +24 -6
  499. package/scripts/josh/process-owner.ts +4 -4
  500. package/scripts/josh/session-language-cli.ts +53 -11
  501. package/scripts/josh/session-language.ts +1 -1
  502. package/scripts/josh/stamp-file.ts +48 -29
  503. package/scripts/josh/stamp-record.ts +57 -0
  504. package/scripts/lane/lane-await.ts +35 -11
  505. package/scripts/lane/lane-cache.ts +6 -6
  506. package/scripts/lane/lane-capacity.ts +32 -17
  507. package/scripts/lane/lane-child-invocation.ts +17 -15
  508. package/scripts/lane/lane-child-marker.ts +12 -12
  509. package/scripts/lane/lane-cli.ts +12 -13
  510. package/scripts/lane/lane-close.ts +6 -6
  511. package/scripts/lane/lane-dispatch.ts +61 -72
  512. package/scripts/lane/lane-environment.ts +5 -5
  513. package/scripts/lane/lane-guard-policy.ts +7 -21
  514. package/scripts/lane/lane-handoff.ts +2 -2
  515. package/scripts/lane/lane-install.ts +9 -10
  516. package/scripts/lane/lane-launch-cli.ts +13 -8
  517. package/scripts/lane/lane-ledger.ts +73 -11
  518. package/scripts/lane/lane-leftover.ts +2 -2
  519. package/scripts/lane/lane-limit-cli.ts +160 -0
  520. package/scripts/lane/lane-limit-override.ts +74 -0
  521. package/scripts/lane/lane-load.ts +19 -68
  522. package/scripts/lane/lane-measure-cli.ts +15 -25
  523. package/scripts/lane/lane-occupancy.ts +6 -4
  524. package/scripts/lane/lane-open.ts +20 -19
  525. package/scripts/lane/lane-output.ts +4 -3
  526. package/scripts/lane/lane-paths.ts +12 -11
  527. package/scripts/lane/lane-phase.ts +33 -0
  528. package/scripts/lane/lane-reap.ts +2 -2
  529. package/scripts/lane/lane-registry.ts +16 -15
  530. package/scripts/lane/lane-relaunch.ts +9 -9
  531. package/scripts/lane/lane-report.ts +5 -4
  532. package/scripts/lane/lane-resume.ts +2 -2
  533. package/scripts/lane/lane-sampler.ts +55 -0
  534. package/scripts/lane/lane-seed.ts +7 -7
  535. package/scripts/lane/lane-stage-stats.ts +135 -0
  536. package/scripts/lane/lane-start-point.ts +8 -11
  537. package/scripts/lane/lane-stats.ts +60 -15
  538. package/scripts/lane/lane-stray.ts +1 -1
  539. package/scripts/lane/lane-vacant.ts +1 -1
  540. package/scripts/lane/openai-lane-supervisor-decision.ts +3 -7
  541. package/scripts/lane/openai-lane-supervisor-owner.ts +3 -9
  542. package/scripts/lane/openai-review-broker.ts +2 -4
  543. package/scripts/lib/ancestor-directories.ts +1 -1
  544. package/scripts/lib/bounded-pool.ts +2 -2
  545. package/scripts/lib/buffered-process.ts +4 -6
  546. package/scripts/lib/caddy-logs.sh +0 -0
  547. package/scripts/lib/cli-flags.ts +39 -6
  548. package/scripts/lib/error-message.ts +1 -1
  549. package/scripts/lib/json-value.ts +17 -3
  550. package/scripts/lib/poll.ts +1 -1
  551. package/scripts/lib/status-icons.ts +3 -3
  552. package/scripts/lib/timed-fetch.ts +1 -1
  553. package/scripts/lib/timeouts.ts +1 -1
  554. package/scripts/lines/bytes-command.ts +3 -4
  555. package/scripts/lines/effective-limit.ts +25 -12
  556. package/scripts/lines/line-budget.ts +47 -55
  557. package/scripts/lines/line-targets.ts +6 -2
  558. package/scripts/lines/lines-command.ts +3 -3
  559. package/scripts/lint/cspell-cached.ts +1 -1
  560. package/scripts/lint/cycle-recheck.ts +122 -0
  561. package/scripts/lint/format.ts +1 -2
  562. package/scripts/lint/lint-parallel.ts +34 -19
  563. package/scripts/lint/lint-related-scope.ts +25 -15
  564. package/scripts/lint/lint-related.ts +6 -7
  565. package/scripts/managed-marker/index.ts +1 -1
  566. package/scripts/managed-marker/managed-marker-logic.ts +1 -2
  567. package/scripts/notify/git-notify.ts +9 -7
  568. package/scripts/notify/telegram-notify.ts +53 -37
  569. package/scripts/notify/telegram-test-logic.ts +3 -3
  570. package/scripts/notify/telegram-test.ts +45 -30
  571. package/scripts/observations/observation-ledger-home.ts +14 -8
  572. package/scripts/observations/observation-ledger-line.ts +3 -2
  573. package/scripts/observations/observation-ledger-migrate.ts +3 -4
  574. package/scripts/observations/observation-ledger-prepare.ts +4 -4
  575. package/scripts/observations/observation-ledger.ts +14 -15
  576. package/scripts/observations/observation-record-cli.ts +83 -0
  577. package/scripts/observations/observation-record.ts +91 -0
  578. package/scripts/observations/observations-flush-cli.ts +1 -1
  579. package/scripts/observations/observations-flush-landing.ts +7 -6
  580. package/scripts/observations/observations-flush.ts +26 -27
  581. package/scripts/overrides/overrides-check.ts +18 -8
  582. package/scripts/package/package-scout-cli.ts +1 -1
  583. package/scripts/package/package-scout-format.ts +2 -2
  584. package/scripts/package/package-scout.ts +1 -1
  585. package/scripts/propagate/propagate-git-failure.ts +1 -1
  586. package/scripts/propagate/propagate-git.ts +7 -7
  587. package/scripts/propagate/propagate-plan.ts +2 -2
  588. package/scripts/propagate/propagate-publish.ts +2 -3
  589. package/scripts/propagate/propagate-run.ts +5 -7
  590. package/scripts/propagate/propagate-select.ts +1 -1
  591. package/scripts/propagate/propagate-steps.ts +19 -20
  592. package/scripts/propagate/propagate-targets.ts +6 -10
  593. package/scripts/propagate/propagate.ts +5 -5
  594. package/scripts/refactor/import-graph.ts +1 -1
  595. package/scripts/refactor/refactor-lint.ts +4 -10
  596. package/scripts/refactor/refactor-scan-cli.ts +1 -1
  597. package/scripts/refactor/refactor-scan.ts +2 -2
  598. package/scripts/refactor/refactor-targets.ts +1 -1
  599. package/scripts/release/github-release-cli.ts +25 -3
  600. package/scripts/release/github-release-runs.ts +1 -1
  601. package/scripts/release/release-cli.ts +21 -4
  602. package/scripts/release/release-history.ts +6 -10
  603. package/scripts/release/release-plan.ts +3 -3
  604. package/scripts/release/release-progress.ts +3 -4
  605. package/scripts/release/release-publish.ts +8 -9
  606. package/scripts/release/release-scope-cli.ts +8 -10
  607. package/scripts/release/release-tag.ts +6 -8
  608. package/scripts/release/release-worktree.ts +5 -5
  609. package/scripts/repo/auto-merge-setting-logic.ts +7 -9
  610. package/scripts/repo/auto-merge-setting.ts +1 -1
  611. package/scripts/repo/repo-setting.ts +4 -4
  612. package/scripts/repo/repository-labels.ts +1 -1
  613. package/scripts/repo/required-checks-logic.ts +3 -3
  614. package/scripts/repo/required-checks-report.ts +1 -1
  615. package/scripts/repo/ruleset-check-cli.ts +1 -1
  616. package/scripts/repo/ruleset-check.ts +1 -1
  617. package/scripts/report/report-format-reference.ts +26 -0
  618. package/scripts/report/report-lint-cli.ts +2 -2
  619. package/scripts/report/report-lint.ts +16 -2
  620. package/scripts/review/disposition-cli.ts +2 -2
  621. package/scripts/review/disposition-logic.ts +1 -1
  622. package/scripts/review/live-evidence.ts +9 -6
  623. package/scripts/review/review-attest-cli.ts +1 -2
  624. package/scripts/review/review-attest.ts +3 -3
  625. package/scripts/review/review-brief-cli.ts +19 -20
  626. package/scripts/review/review-brief.ts +29 -32
  627. package/scripts/review/review-checkout.ts +2 -2
  628. package/scripts/review/review-diff-parts.ts +3 -5
  629. package/scripts/review/review-diff-write.ts +1 -1
  630. package/scripts/review/review-finding-ledger.ts +7 -4
  631. package/scripts/review/review-findings-cli.ts +2 -2
  632. package/scripts/review/review-level.ts +4 -7
  633. package/scripts/review/review-record-cli.ts +73 -16
  634. package/scripts/review/review-record.ts +5 -4
  635. package/scripts/review/review-round2-cli.ts +2 -3
  636. package/scripts/review/review-round2.ts +13 -21
  637. package/scripts/review/review-stamps.ts +9 -71
  638. package/scripts/review/review-tree.ts +4 -5
  639. package/scripts/rules/bash-triggers.ts +4 -4
  640. package/scripts/rules/decision-oracle-batch.ts +5 -6
  641. package/scripts/rules/decision-oracle-stage.ts +1 -1
  642. package/scripts/rules/decision-oracle-tokens.ts +1 -2
  643. package/scripts/rules/decision-oracle.ts +2 -2
  644. package/scripts/rules/delivered-rules.ts +61 -406
  645. package/scripts/rules/destructive-command.ts +2 -2
  646. package/scripts/rules/direct-filing.ts +4 -4
  647. package/scripts/rules/direct-pr-create.ts +2 -2
  648. package/scripts/rules/early-heartbeat.ts +15 -19
  649. package/scripts/rules/file-body.ts +5 -6
  650. package/scripts/rules/filing-cap.ts +6 -7
  651. package/scripts/rules/filing-offer.ts +1 -1
  652. package/scripts/rules/firing-point.ts +6 -6
  653. package/scripts/rules/gh-api.ts +2 -2
  654. package/scripts/rules/git-argv.ts +3 -3
  655. package/scripts/rules/git-force.ts +2 -2
  656. package/scripts/rules/hook-context-line.ts +31 -0
  657. package/scripts/rules/implementation-cut-verdict.ts +5 -8
  658. package/scripts/rules/implementation-cut.ts +35 -32
  659. package/scripts/rules/index-guard.ts +2 -2
  660. package/scripts/rules/issue-citation.ts +7 -7
  661. package/scripts/rules/issue-comments.ts +21 -13
  662. package/scripts/rules/josh-git-bare.ts +2 -2
  663. package/scripts/rules/lane-background.ts +14 -16
  664. package/scripts/rules/lane-carry-conflict.ts +41 -5
  665. package/scripts/rules/lane-interactive-ask.ts +6 -9
  666. package/scripts/rules/lane-park.ts +12 -16
  667. package/scripts/rules/lane-split-park.ts +1 -2
  668. package/scripts/rules/lane-switch-main.ts +10 -13
  669. package/scripts/rules/last-prompt.ts +1 -1
  670. package/scripts/rules/oracle-consulted.ts +5 -5
  671. package/scripts/rules/oracle-firing.ts +6 -9
  672. package/scripts/rules/oracle-list-cli.ts +2 -2
  673. package/scripts/rules/permission-guards.ts +2 -2
  674. package/scripts/rules/piped-verification.ts +79 -9
  675. package/scripts/rules/poll-loop.ts +9 -11
  676. package/scripts/rules/pre-gate-cut.ts +33 -30
  677. package/scripts/rules/prior-comment-read.ts +3 -3
  678. package/scripts/rules/protected-files.ts +25 -13
  679. package/scripts/rules/raw-field-body.ts +3 -4
  680. package/scripts/rules/reply-language.ts +1 -1
  681. package/scripts/rules/rule-body-guard.ts +10 -12
  682. package/scripts/rules/rule-guard.ts +1 -1
  683. package/scripts/rules/rule-list.ts +51 -0
  684. package/scripts/rules/rule-registry-rows.ts +282 -0
  685. package/scripts/rules/rule-registry.ts +109 -0
  686. package/scripts/rules/rule-value-cache.ts +2 -2
  687. package/scripts/rules/rule-value-cli.ts +6 -4
  688. package/scripts/rules/rule-value.ts +61 -22
  689. package/scripts/rules/run-tail-rule.ts +11 -15
  690. package/scripts/rules/shell-body-trigger.ts +7 -7
  691. package/scripts/rules/shell-segments.ts +2 -4
  692. package/scripts/rules/stop-rules.ts +54 -41
  693. package/scripts/rules/tail-commands.ts +1 -1
  694. package/scripts/rules/test-declared-commit.ts +2 -2
  695. package/scripts/rules/third-party-write.ts +3 -3
  696. package/scripts/rules/worktree-guard.ts +12 -5
  697. package/scripts/run/add/run-add-cli.ts +165 -0
  698. package/scripts/run/add/run-add.ts +124 -0
  699. package/scripts/run/board/run-board-cli.ts +207 -0
  700. package/scripts/run/board/run-board-closed.ts +95 -0
  701. package/scripts/run/board/run-board-every.ts +60 -0
  702. package/scripts/run/board/run-board-fetch.ts +38 -0
  703. package/scripts/run/board/run-board-fit.ts +219 -0
  704. package/scripts/run/board/run-board-github.ts +162 -0
  705. package/scripts/run/board/run-board-header.ts +275 -0
  706. package/scripts/run/board/run-board-kind.ts +35 -0
  707. package/scripts/run/board/run-board-labels.ts +299 -0
  708. package/scripts/run/board/run-board-layout.ts +222 -0
  709. package/scripts/run/board/run-board-link.ts +31 -0
  710. package/scripts/run/board/run-board-machine.ts +198 -0
  711. package/scripts/run/board/run-board-notes.ts +103 -0
  712. package/scripts/run/board/run-board-phase.ts +136 -0
  713. package/scripts/run/board/run-board-plan.ts +129 -0
  714. package/scripts/run/board/run-board-read.ts +62 -0
  715. package/scripts/run/board/run-board-render-legend.ts +82 -0
  716. package/scripts/run/board/run-board-render-notes.ts +77 -0
  717. package/scripts/run/board/run-board-render-slot.ts +50 -0
  718. package/scripts/run/board/run-board-render.ts +407 -0
  719. package/scripts/run/board/run-board-scope.ts +17 -0
  720. package/scripts/run/board/run-board-screen.ts +43 -0
  721. package/scripts/run/board/run-board-span.ts +66 -0
  722. package/scripts/run/board/run-board-spin.ts +115 -0
  723. package/scripts/run/board/run-board-state.ts +113 -0
  724. package/scripts/run/board/run-board-status.ts +279 -0
  725. package/scripts/run/board/run-board-tick.ts +210 -0
  726. package/scripts/run/board/run-board-track.ts +22 -0
  727. package/scripts/run/board/run-board-usage-read.ts +255 -0
  728. package/scripts/run/board/run-board-usage-rusage.ts +124 -0
  729. package/scripts/run/board/run-board-usage-text.ts +80 -0
  730. package/scripts/run/board/run-board-usage.ts +165 -0
  731. package/scripts/run/carry/run-carry-added.ts +62 -0
  732. package/scripts/run/carry/run-carry-args.ts +25 -22
  733. package/scripts/run/carry/run-carry-change.ts +1 -1
  734. package/scripts/run/carry/run-carry-cli.ts +71 -48
  735. package/scripts/run/carry/run-carry-conversation.ts +6 -7
  736. package/scripts/run/carry/run-carry-ended.ts +85 -0
  737. package/scripts/run/carry/run-carry-reclaim.ts +1 -1
  738. package/scripts/run/carry/run-carry-stash.ts +3 -2
  739. package/scripts/run/carry/run-carry-streak.ts +8 -10
  740. package/scripts/run/carry/run-carry.ts +85 -89
  741. package/scripts/run/cut/run-cut-args.ts +7 -7
  742. package/scripts/run/cut/run-cut-cli.ts +54 -36
  743. package/scripts/run/cut/run-cut-handoff.ts +15 -15
  744. package/scripts/run/cut/run-cut-report.ts +37 -16
  745. package/scripts/run/cut/run-cut.ts +63 -77
  746. package/scripts/run/detached-launch.ts +35 -50
  747. package/scripts/run/entry/run-entry-cli.ts +48 -27
  748. package/scripts/run/entry/run-entry-stop.ts +7 -9
  749. package/scripts/run/entry/run-entry.ts +5 -6
  750. package/scripts/run/event/run-event-cli.ts +5 -6
  751. package/scripts/run/event/run-event-filed.ts +69 -0
  752. package/scripts/run/event/run-event-follow.ts +3 -3
  753. package/scripts/run/event/run-event-plan.ts +38 -0
  754. package/scripts/run/event/run-event-render.ts +9 -4
  755. package/scripts/run/event/run-event-scope.ts +47 -18
  756. package/scripts/run/event/run-event-stream-emit.ts +64 -11
  757. package/scripts/run/event/run-event-stream.ts +171 -46
  758. package/scripts/run/event/run-event-watch.ts +4 -6
  759. package/scripts/run/hold/run-hold-cli.ts +65 -62
  760. package/scripts/run/hold/run-hold.ts +88 -46
  761. package/scripts/run/merge/run-merge-cli.ts +116 -77
  762. package/scripts/run/merge/run-merge-collect.ts +107 -0
  763. package/scripts/run/merge/run-merge-steps.ts +112 -65
  764. package/scripts/run/merge/run-merge-token.ts +30 -0
  765. package/scripts/run/merge/run-merge.ts +31 -22
  766. package/scripts/run/progress/run-progress-args.ts +4 -4
  767. package/scripts/run/progress/run-progress-cli.ts +39 -50
  768. package/scripts/run/progress/run-progress-clock.ts +25 -32
  769. package/scripts/run/progress/run-progress-config.ts +6 -9
  770. package/scripts/run/progress/run-progress-read.ts +9 -10
  771. package/scripts/run/progress/run-progress.ts +48 -53
  772. package/scripts/run/review/run-review-cli.ts +6 -6
  773. package/scripts/run/review/run-review-steps.ts +6 -6
  774. package/scripts/run/review/run-review.ts +9 -11
  775. package/scripts/run/run-cli-fault.ts +29 -0
  776. package/scripts/run/run-ending-cli.ts +3 -3
  777. package/scripts/run/run-ending.ts +10 -14
  778. package/scripts/run/run-halfrun-resume.ts +6 -8
  779. package/scripts/run/run-headless.ts +25 -12
  780. package/scripts/run/run-invocation.ts +17 -22
  781. package/scripts/run/run-label.ts +7 -5
  782. package/scripts/run/run-liveness-cli.ts +19 -6
  783. package/scripts/run/run-liveness.ts +27 -38
  784. package/scripts/run/run-next-cli.ts +5 -9
  785. package/scripts/run/run-next.ts +4 -5
  786. package/scripts/run/run-parent-cut-hook.ts +10 -12
  787. package/scripts/run/run-preflight.ts +25 -29
  788. package/scripts/run/run-prep-cli.ts +17 -13
  789. package/scripts/run/run-prep-locate.ts +4 -5
  790. package/scripts/run/run-prep.ts +7 -10
  791. package/scripts/run/run-prrun-resume.ts +2 -2
  792. package/scripts/run/run-report-cli.ts +4 -4
  793. package/scripts/run/run-report.ts +9 -14
  794. package/scripts/run/run-retrospective.ts +3 -3
  795. package/scripts/run/run-section.ts +42 -0
  796. package/scripts/run/run-stage-read.ts +2 -2
  797. package/scripts/run/run-stage.ts +6 -4
  798. package/scripts/run/run-status-cli.ts +7 -5
  799. package/scripts/run/run-status.ts +6 -7
  800. package/scripts/run/run-step-cli.ts +13 -15
  801. package/scripts/run/run-step.ts +58 -47
  802. package/scripts/run/run-stop-notify.ts +7 -8
  803. package/scripts/run/run-stranded-cli.ts +1 -1
  804. package/scripts/run/run-stranded-detect.ts +4 -4
  805. package/scripts/run/run-stranded.ts +11 -13
  806. package/scripts/run/run-tail-cli.ts +15 -16
  807. package/scripts/run/run-tail.ts +14 -33
  808. package/scripts/run/run-watcher-guard-cli.ts +3 -4
  809. package/scripts/run/run-watcher-guard.ts +11 -12
  810. package/scripts/run/run-watcher-hook.ts +6 -12
  811. package/scripts/run/ship/run-ship-cli.ts +67 -33
  812. package/scripts/run/ship/run-ship-detach.ts +15 -13
  813. package/scripts/run/ship/run-ship-lock.ts +1 -1
  814. package/scripts/run/ship/run-ship-next.ts +7 -8
  815. package/scripts/run/ship/run-ship-pre-detach.ts +27 -11
  816. package/scripts/run/ship/run-ship-preflight.ts +10 -11
  817. package/scripts/run/ship/run-ship-probe.ts +4 -4
  818. package/scripts/run/ship/run-ship-return.ts +1 -1
  819. package/scripts/run/ship/run-ship-review-steps.ts +43 -24
  820. package/scripts/run/ship/run-ship-review.ts +12 -14
  821. package/scripts/run/ship/run-ship-scoped.ts +15 -6
  822. package/scripts/run/ship/run-ship-stage.ts +80 -26
  823. package/scripts/run/ship/run-ship-steps.ts +26 -16
  824. package/scripts/run/ship/run-ship-stop-text.ts +4 -2
  825. package/scripts/run/ship/run-ship-sync.ts +9 -8
  826. package/scripts/run/ship/run-ship.ts +17 -32
  827. package/scripts/run/tidy/run-tidy-cli.ts +9 -5
  828. package/scripts/run/tidy/run-tidy-lanes.ts +18 -7
  829. package/scripts/run/tidy/run-tidy-stashes.ts +8 -8
  830. package/scripts/run/tidy/run-tidy.ts +4 -3
  831. package/scripts/run/wake/run-wake-cli.ts +27 -32
  832. package/scripts/run/wake/run-wake-describe.ts +24 -28
  833. package/scripts/run/wake/run-wake-driver.ts +14 -14
  834. package/scripts/run/wake/run-wake-handoff.ts +6 -6
  835. package/scripts/run/wake/run-wake-loop.ts +9 -9
  836. package/scripts/run/wake/run-wake-restart.ts +4 -5
  837. package/scripts/run/wake/run-wake-session.ts +23 -27
  838. package/scripts/run/wake/run-wake.ts +57 -279
  839. package/scripts/safe-chain/ci-installer-pin.ts +3 -3
  840. package/scripts/safe-chain/pack-hook.ts +2 -2
  841. package/scripts/safe-chain/preinstall-command.ts +2 -2
  842. package/scripts/security/security-audit-logic.ts +1 -1
  843. package/scripts/security/security-audit-provision-logic.ts +1 -1
  844. package/scripts/security/security-audit-provision.ts +2 -2
  845. package/scripts/security/security-audit.ts +5 -5
  846. package/scripts/security/security-updates-logic.ts +2 -3
  847. package/scripts/security/security-updates.ts +2 -4
  848. package/scripts/self-sync-guard/index.ts +1 -1
  849. package/scripts/self-sync-guard/self-sync-guard-logic.ts +2 -2
  850. package/scripts/self-sync-guard/self-sync-refusal.ts +1 -1
  851. package/scripts/sonar/sonar-hotspots-cli.ts +1 -1
  852. package/scripts/sonar/sonar-hotspots.ts +1 -1
  853. package/scripts/sonar/sonar-new-code-cli.ts +1 -1
  854. package/scripts/sonar/sonar-new-code.ts +1 -1
  855. package/scripts/sonar/sonar-project.ts +1 -1
  856. package/scripts/split/split-assess-cli.ts +1 -1
  857. package/scripts/split/split-assess.ts +3 -3
  858. package/scripts/sync/directory-copy-guard.ts +2 -3
  859. package/scripts/sync/managed-config-scope-cli.ts +1 -2
  860. package/scripts/sync/managed-config-scope.ts +4 -4
  861. package/scripts/sync/plugin-skill-directories.ts +2 -2
  862. package/scripts/sync/reconcile-templates.ts +17 -8
  863. package/scripts/sync/removed-skill-manifest.ts +2 -3
  864. package/scripts/sync/sync-ai-files.ts +7 -7
  865. package/scripts/sync/sync-configs.ts +30 -3
  866. package/scripts/sync/sync-hook-safety.ts +2 -2
  867. package/scripts/sync/sync.ts +23 -10
  868. package/scripts/sync/synced-paths.ts +2 -1
  869. package/scripts/sync/workflow-pin-logic.ts +1 -1
  870. package/scripts/test/test-declared-changed.ts +4 -4
  871. package/scripts/test/test-declared-logic.ts +2 -3
  872. package/scripts/test/test-declared-match.ts +25 -4
  873. package/scripts/test/test-declared.ts +26 -9
  874. package/scripts/test/test-red-commit.ts +3 -2
  875. package/scripts/test/test-red-logic.ts +7 -14
  876. package/scripts/test/test-red.ts +12 -47
  877. package/scripts/test/test-related-scope.ts +2 -3
  878. package/scripts/test/test-related.ts +3 -3
  879. package/scripts/test/test-type-logic.ts +1 -2
  880. package/scripts/test/test-unit-guard.ts +13 -17
  881. package/scripts/test/unit-worker-share.ts +7 -8
  882. package/scripts/time-runtime/time-agent-bundles.ts +2 -4
  883. package/scripts/time-runtime/time-background.ts +17 -21
  884. package/scripts/time-runtime/time-batch-guard.ts +67 -342
  885. package/scripts/time-runtime/time-bundle-call.ts +26 -28
  886. package/scripts/time-runtime/time-bundles.ts +11 -12
  887. package/scripts/time-runtime/time-call-identity.ts +1 -1
  888. package/scripts/time-runtime/time-command-key.ts +2 -2
  889. package/scripts/time-runtime/time-density-hook.ts +8 -11
  890. package/scripts/time-runtime/time-density.ts +5 -5
  891. package/scripts/time-runtime/time-followup-stage.ts +7 -7
  892. package/scripts/time-runtime/time-format.ts +5 -5
  893. package/scripts/time-runtime/time-hook-transcript.ts +3 -3
  894. package/scripts/time-runtime/time-instant.ts +1 -1
  895. package/scripts/time-runtime/time-markers.ts +15 -19
  896. package/scripts/time-runtime/time-phase-names.ts +3 -3
  897. package/scripts/time-runtime/time-reported-failure.ts +15 -19
  898. package/scripts/time-runtime/time-round-trips.ts +20 -23
  899. package/scripts/time-runtime/time-shell.ts +8 -8
  900. package/scripts/time-runtime/time-single-check.ts +1 -2
  901. package/scripts/time-runtime/time-spans.ts +35 -40
  902. package/scripts/time-runtime/time-tool-call.ts +15 -16
  903. package/scripts/time-runtime/time-transcript-line.ts +53 -34
  904. package/scripts/time-runtime/time-writes.ts +5 -5
  905. package/scripts/ui/ui-routes-cli.ts +1 -2
  906. package/scripts/ui/ui-routes.ts +1 -2
  907. package/scripts/version/bump-version.ts +1 -1
  908. package/scripts/version/fresh-metadata-cache.ts +2 -2
  909. package/scripts/version/latest-corepack.ts +26 -26
  910. package/scripts/version/latest-lane-guard.ts +1 -1
  911. package/scripts/version/latest-scope-cli.ts +2 -2
  912. package/scripts/version/latest-stamp.ts +1 -2
  913. package/scripts/version/latest-update.ts +2 -2
  914. package/scripts/version/npm-registry.ts +2 -2
  915. package/scripts/version/package-manager-version.ts +18 -0
  916. package/scripts/version/publishable-range-check.ts +2 -1
  917. package/scripts/version/publishable-range.ts +1 -1
  918. package/scripts/version/release-age.ts +11 -11
  919. package/scripts/version/release-hold.ts +2 -2
  920. package/scripts/version/safe-chain-version-update.ts +3 -3
  921. package/scripts/version/version-check-logic.ts +2 -3
  922. package/scripts/version/version-check.ts +1 -2
  923. package/scripts/version/version-command-config.ts +2 -2
  924. package/scripts/version/version-commands.ts +3 -3
  925. package/scripts/version/version-remote.ts +4 -4
  926. package/scripts/version/version-targets.ts +2 -2
  927. package/templates/gitignore +7 -0
  928. package/dist/hooks/chunk-KHX4U3BG.js +0 -6400
  929. package/dist/hooks/chunk-RKUAD3I6.js +0 -90
  930. package/dist/hooks/chunk-WPALEIRX.js +0 -18
  931. package/scripts/backlog/backlog-restructure.ts +0 -152
  932. package/scripts/rules/issue-fold-rule.ts +0 -72
  933. package/scripts/rules/wip-cap.ts +0 -63
  934. package/scripts/run/run-issue-number.ts +0 -19
@@ -7,7 +7,7 @@ function message_of(error: unknown): string {
7
7
  const DEBUG_ENV_KEY = 'JOSH_DEBUG'
8
8
 
9
9
  // A catch that folds a failure into a state verdict — "dirty", "not merged", "not written" — leaves no
10
- // trace of why by default, so a wrong verdict cannot be followed back to its cause (joshuafolkken/kit#3067).
10
+ // trace of why by default, so a wrong verdict cannot be followed back to its cause.
11
11
  // `JOSH_DEBUG` set to any non-blank value writes the swallowed reason to stderr; unset, nothing changes.
12
12
  function trace_swallowed(where: string, error: unknown): void {
13
13
  if ((process.env[DEBUG_ENV_KEY] ?? '').trim() === '') return
@@ -1,10 +1,12 @@
1
- // Reading JSON that may not be JSON (joshuafolkken/kit#1151).
1
+ import type { z } from 'zod'
2
+
3
+ // Reading JSON that may not be JSON.
2
4
  //
3
5
  // Readers under `scripts/` parse text that a defect, a truncated write or an older format can make
4
6
  // unparseable — a transcript line, a settings file, an MCP declaration, a lock record, CLI output —
5
7
  // and every one of them answers "could not read this" rather than throwing, because a single bad line
6
8
  // must not fail a whole report. They had begun to carry a copy of the same try/catch each; this is the
7
- // one copy, and `is_record` beside it is the one object test (joshuafolkken/kit#2986).
9
+ // one copy, and `is_record` beside it is the one object test.
8
10
 
9
11
  function parse_or_undefined(text: string): unknown {
10
12
  try {
@@ -14,12 +16,24 @@ function parse_or_undefined(text: string): unknown {
14
16
  }
15
17
  }
16
18
 
19
+ // The same read with a shape asked of it: text that is not JSON and JSON the schema rejects both
20
+ // answer `undefined`, which is what a best-effort reader of a record, a payload or CLI output wants.
21
+ // A reader that must tell the two apart, or keep a shape change visible, is `parse-json-array.ts`.
22
+ function parse_with<T>(text: string, schema: z.ZodType<T>): T | undefined {
23
+ const value = parse_or_undefined(text)
24
+ if (value === undefined) return undefined
25
+
26
+ const parsed = schema.safeParse(value)
27
+
28
+ return parsed.success ? parsed.data : undefined
29
+ }
30
+
17
31
  // A plain object, as opposed to an array or a primitive. `typeof null` is `'object'`, and an array
18
32
  // answers `'object'` too, so both have to be excluded by hand before a key lookup means anything.
19
33
  function is_record(value: unknown): value is Record<string, unknown> {
20
34
  return typeof value === 'object' && value !== null && !Array.isArray(value)
21
35
  }
22
36
 
23
- const json_value = { parse_or_undefined, is_record }
37
+ const json_value = { parse_or_undefined, parse_with, is_record }
24
38
 
25
39
  export { json_value }
@@ -2,7 +2,7 @@
2
2
  //
3
3
  // **Three modules had already written the same three-line `sleep`** — `gh/git-pr-checks.ts`,
4
4
  // `eval/eval-run.ts` and `propagate/propagate-publish.ts` — and the release command's tag watch
5
- // (joshuafolkken/kit#1169) would have been the fourth. `CLAUDE.md` → "No clones — single-source"
5
+ // would have been the fourth. `CLAUDE.md` → "No clones — single-source"
6
6
  // reads an existing duplication as the signal to single-source it rather than as a license to add to
7
7
  // it, so the definition moved here and those three import it.
8
8
  //
@@ -1,4 +1,4 @@
1
- // The icons josh prints in front of a result line (joshuafolkken/kit#1361).
1
+ // The icons josh prints in front of a result line.
2
2
  //
3
3
  // They were one character each, declared beside whichever command printed them — the verification
4
4
  // gate, the health check, the propagation run — and that was harmless while nothing ever *read*
@@ -11,9 +11,9 @@
11
11
  // the health check use `✔`, and unifying those would change what a command prints in order to tidy a
12
12
  // constant — a decision about output, not about single-sourcing.
13
13
  //
14
- // **The success icon is read too since joshuafolkken/kit#1374.** `josh-verdict.ts` reads the gate's
14
+ // **The success icon is read too.** `josh-verdict.ts` reads the gate's
15
15
  // `✔ verification gate passed` line to tell a green gate from the third-party warning bodies it
16
- // forwards, so the pass icon is now under the same rule the failure icon has been under: declared
16
+ // forwards, so the pass icon is under the same rule as the failure icon: declared
17
17
  // once, imported by the printer and the reader alike.
18
18
 
19
19
  const FAIL_ICON = '✗'
@@ -1,6 +1,6 @@
1
1
  import { FETCH_TIMEOUT_MS } from './timeouts'
2
2
 
3
- // **The one place in `scripts/` that calls the global `fetch`** (joshuafolkken/kit#2981). Every request
3
+ // **The one place in `scripts/` that calls the global `fetch`**. Every request
4
4
  // carries a time limit, so a stalled connection rejects instead of holding an unattended run forever;
5
5
  // `timed-fetch-usage.test.ts` refuses a direct `fetch` call anywhere else. The signal also bounds the
6
6
  // body read, because the response stream aborts with it.
@@ -1,6 +1,6 @@
1
1
  // Shared time limits for the calls that leave the process — a network request or a spawned command.
2
2
  // An unattended run (a lane, `followup`, a backlog drain) that waits on a request or a command with no
3
- // limit stays stuck where it stopped and never comes back (joshuafolkken/kit#2981), so every such
3
+ // limit stays stuck where it stopped and never comes back, so every such
4
4
  // call takes one of these, and a value used in more than one place is named once here.
5
5
 
6
6
  // A probe that only asks the local machine (`ps`, `lsof`, `git config`) on a path something else is
@@ -9,7 +9,7 @@ import { resident_budget } from '#scripts/document/resident-budget'
9
9
  // The package root, resolved from this file rather than the caller's working directory.
10
10
  const REPO_ROOT = fileURLToPath(new URL('../../', import.meta.url))
11
11
 
12
- // `josh bytes` — the byte counterpart of `josh lines` (joshuafolkken/kit#2176). A mandated
12
+ // `josh bytes` — the byte counterpart of `josh lines`. A mandated
13
13
  // documentation update that grows an agent-read document past its byte ceiling is invisible until
14
14
  // `pnpm josh gate` reports it 80–90 seconds in, and the raise that follows is rework. This answers
15
15
  // the same question before that: how many bytes each budgeted document already has, its ceiling, and
@@ -81,8 +81,7 @@ function remaining_phrase(remaining: number): string {
81
81
  }
82
82
 
83
83
  // The resident document is held by a fixed limit rather than a block ratchet, and loosening it is
84
- // Tier C, so its row names the headroom or the overage but never a value to raise it to
85
- // (joshuafolkken/kit#3171).
84
+ // Tier C, so its row names the headroom or the overage but never a value to raise it to.
86
85
  function resident_row(status: DocumentStatus): string {
87
86
  const counts = `${status.current.toString()}/${status.recorded.toString()} bytes`
88
87
 
@@ -147,7 +146,7 @@ function entry_status_of(entry: string, recorded: number): EntryStatus {
147
146
 
148
147
  // The primary budget, one row per entry: the total each workflow entry reads against its recorded
149
148
  // ceiling and the headroom left — printed on every scan, so the main budget is no longer a number the
150
- // gate reveals only when it fails (joshuafolkken/kit#2271).
149
+ // gate reveals only when it fails.
151
150
  function entry_row(status: EntryStatus): string {
152
151
  const counts = `${status.current.toString()}/${status.recorded.toString()} bytes`
153
152
 
@@ -3,21 +3,18 @@ import path from 'node:path'
3
3
  import { pathToFileURL } from 'node:url'
4
4
  import { z } from 'zod'
5
5
 
6
- // joshuafolkken/kit#1454: `pnpm josh lines` asked the project's own eslint how many code lines a file
7
- // has, and then explained that answer against **kit's** `max-lines` entry. In kit the two are the same
8
- // object, so nothing showed; in a consumer whose `eslint.config.js` overrides the rule after
9
- // `create_base_config`, the report and the gate described different limits — and the report was the one
10
- // that was wrong, while `line-budget.ts` opens by declaring that agreeing with the gate is the whole of
11
- // its purpose.
6
+ // Resolves the `max-lines` entry the project's own eslint applies, so `pnpm josh lines` explains its
7
+ // count against the limit the gate enforces — in a consumer whose `eslint.config.js` overrides the
8
+ // rule after `create_base_config`, kit's own entry would describe a different limit.
12
9
  //
13
- // **The limit is therefore asked of the configuration the gate actually applies, per file.** A flat
10
+ // **The limit is asked of the configuration the gate actually applies, per file.** A flat
14
11
  // config block can key an override on a `files` pattern, so "the project's limit" is not one number: a
15
12
  // consumer that raises `max-lines` for generated code and leaves it alone elsewhere enforces two, and a
16
13
  // report that picked either would be wrong about the other set.
17
14
  //
18
15
  // **The counting options travel with it, and that is not a widening of the subject.** `skipBlankLines`
19
16
  // and `skipComments` decide what a code line *is*, and taking them from kit while taking the count from
20
- // the consumer's eslint is the same defect wearing a different number. Both now come from the same
17
+ // the consumer's eslint would mismatch the two the same way. Both come from the same
21
18
  // resolved entry, so there is one source rather than two that can disagree.
22
19
  //
23
20
  // **This is the resolution `eslint --print-config` performs, not a second linter.** `line-budget.ts`
@@ -43,7 +40,11 @@ interface ConfigResolver {
43
40
  calculateConfigForFile: (file_path: string) => Promise<unknown>
44
41
  }
45
42
 
46
- type ResolverConstructor = new (options: { cwd: string }) => ConfigResolver
43
+ // eslint's own camelCase name for the option, kept apart from the object that spells it.
44
+ const CONFIG_FILE_OPTION = 'overrideConfigFile'
45
+
46
+ type ResolverOptions = { cwd: string } & Partial<Record<typeof CONFIG_FILE_OPTION, string>>
47
+ type ResolverConstructor = new (options: ResolverOptions) => ConfigResolver
47
48
 
48
49
  // The module is imported from a path computed at runtime, so its shape is checked rather than assumed:
49
50
  // a build that no longer exports `ESLint` must answer "no limit" instead of throwing past the caller.
@@ -100,13 +101,19 @@ function options_in(config: unknown): LineRuleOptions | undefined {
100
101
  // the consumer's own eslint. Every failure — no eslint there, a build without the export, a config that
101
102
  // throws while loading — is the same answer, and it is "no limit" rather than kit's number: falling
102
103
  // back to kit's is precisely the defect this file exists to remove, and it would be silent.
103
- async function resolver_for(project_root: string): Promise<ConfigResolver | undefined> {
104
+ async function resolver_for(
105
+ project_root: string,
106
+ config_file: string | undefined,
107
+ ): Promise<ConfigResolver | undefined> {
104
108
  try {
105
109
  const require_from = createRequire(path.join(project_root, PACKAGE_JSON))
106
110
  const loaded: unknown = await import(pathToFileURL(require_from.resolve(ESLINT_MODULE)).href)
107
111
  const eslint_module = module_schema.parse(loaded)
108
112
 
109
- return new eslint_module.ESLint({ cwd: project_root })
113
+ return new eslint_module.ESLint({
114
+ cwd: project_root,
115
+ ...(config_file !== undefined && { [CONFIG_FILE_OPTION]: config_file }),
116
+ })
110
117
  } catch {
111
118
  return undefined
112
119
  }
@@ -128,12 +135,18 @@ async function entry_for(
128
135
  // One resolver for the whole call: the configuration is loaded and cached once, and every path after
129
136
  // the first is a lookup rather than a load. That is what makes a per-file limit affordable at all.
130
137
  // Keyed by the absolute path, so the caller's spelling of a path does not have to match.
138
+ //
139
+ // `config_file` names the configuration to ask instead of the one `project_root` holds, with
140
+ // `project_root` still the directory its `files` patterns are matched from — what `josh metrics` needs
141
+ // to hold another commit's tree to this checkout's limits (`metrics-code-lines.ts`).
131
142
  async function options_for(
132
143
  file_paths: ReadonlyArray<string>,
133
144
  project_root: string,
145
+ config_file?: string,
134
146
  ): Promise<ReadonlyMap<string, LineRuleOptions>> {
135
147
  const found = new Map<string, LineRuleOptions>()
136
- const resolver = file_paths.length === 0 ? undefined : await resolver_for(project_root)
148
+ const resolver =
149
+ file_paths.length === 0 ? undefined : await resolver_for(project_root, config_file)
137
150
 
138
151
  if (resolver === undefined) return found
139
152
 
@@ -3,17 +3,14 @@ import { statSync } from 'node:fs'
3
3
  import path from 'node:path'
4
4
  import { find_local_bin_upwards } from '#scripts/build/local-bin'
5
5
  import { stamp_file } from '#scripts/josh/stamp-file'
6
+ import { json_value } from '#scripts/lib/json-value'
6
7
  import { LINT_TIMEOUT_MS } from '#scripts/lib/timeouts'
7
8
  import { execa } from 'execa'
8
9
  import { z } from 'zod'
9
10
  import { effective_limit, type LineRuleOptions } from './effective-limit'
10
11
 
11
- // joshuafolkken/kit#1425: the file line limit was only ever reported *after* the writing was done.
12
- // Measured by hand from run #1406's transcript (PR #1422, 45.8 minutes), 19.8% of the whole run —
13
- // 543 seconds — went on reacting to `max-lines` once the implementation was already finished:
14
- // `pnpm josh gate` five times and `pnpm josh lint` four, of which 115 seconds was tool execution and
15
- // the remaining 353 was model time in between. The splitting itself was correct work; what was wrong
16
- // is that it was decided after the fact rather than at design time.
12
+ // Reports each file's line headroom before the writing starts, so a split is decided at design time
13
+ // rather than after the gate reports `max-lines`.
17
14
  //
18
15
  // **The limit is not changed here, and nothing in this file counts lines its own way.** That is the
19
16
  // trap a headroom report walks into: a second counting method becomes a way to satisfy the limit by
@@ -22,21 +19,16 @@ import { effective_limit, type LineRuleOptions } from './effective-limit'
22
19
  // invocation `pnpm josh lint` reaches, with `max-lines` lowered to 0 so the rule reports
23
20
  // unconditionally and its message carries the count it would have compared against the real limit.
24
21
  //
25
- // **Running ESLint in process instead was tried first and is wrong.** `new Linter().verify(...)` and
26
- // `new ESLint().lintFiles(...)` both answer **one line lower than the `eslint` CLI on any file that
27
- // starts with `#!`** — measured on eslint 10.10.0 with this repository's own config, `301` from the
28
- // CLI against `300` from either API for the same file. Every `scripts/*.ts` entry point has a
29
- // hashbang, so an in-process count would have been quietly wrong for most of this package while the
30
- // gate went on failing at a number the report never showed. Spawning costs a process; agreeing with
22
+ // **The count comes from the `eslint` CLI, not the in-process API.** `new Linter().verify(...)` and
23
+ // `new ESLint().lintFiles(...)` both answer **one line lower than the CLI on any file that starts with
24
+ // `#!`**, and every `scripts/*.ts` entry point has a hashbang. Spawning costs a process; agreeing with
31
25
  // the gate is the whole point of the report.
32
26
  //
33
- // **joshuafolkken/kit#1454: the limit and the counting options come from the same place the count
34
- // does.** They used to be read from kit's own `eslint/rules/code-quality.js` while the count was asked
35
- // of the project's eslint — identical in kit, and two different rules in a consumer that overrides
36
- // `max-lines` after `create_base_config`. `effective-limit.ts` resolves the entry the project's own
37
- // eslint applies **to each file**, and nothing in this file reads kit's copy any more. Where no entry
38
- // can be resolved there is no budget, and the count is reported without one: falling back to kit's
39
- // number would restore the defect and do it silently.
27
+ // **The limit and the counting options come from the same place the count does.**
28
+ // `effective-limit.ts` resolves the `max-lines` entry the project's own eslint applies **to each
29
+ // file**, so a consumer that overrides `max-lines` after `create_base_config` is held to its own rule.
30
+ // Where no entry can be resolved there is no budget, and the count is reported without one: falling
31
+ // back to kit's number would report a limit the project does not enforce.
40
32
 
41
33
  const MAX_LINES_RULE = 'max-lines'
42
34
  // The rule reports when the count is **greater than** `max`, and 0 is the lowest value its own schema
@@ -60,13 +52,9 @@ const NO_CODE_LINES = 0
60
52
  const COUNT_PATTERN = /\((\d+)\)/u
61
53
  const COUNT_GROUP = 1
62
54
 
63
- // **Why 85%, and how it lines up with joshuafolkken/kit#1249.** That issue asks for the same shape
64
- // for a distributed document's resident budget and is still open with nothing settled, so there is no
65
- // number there to copy; what it and joshuafolkken/kit#951 settle is the *form* — a margin that turns
66
- // "at the limit" into a warning while there is still room to write the fix. Matching the resident
67
- // reserve's fraction instead (2,000 of 60,000 bytes, 3.3%) would leave 10 lines of margin, less than
68
- // one function is allowed to be, which is a warning arriving with nowhere left to go. 45 lines is a
69
- // little under two functions at the 25-line function limit — enough to write the split into.
55
+ // **Why 85%.** The margin turns "at the limit" into a warning while there is still room to write the
56
+ // fix: 45 lines of a 300-line limit is a little under two functions at the 25-line function limit —
57
+ // enough to write the split into.
70
58
  const NEAR_LIMIT_FRACTION = 0.85
71
59
  const PERCENT = 100
72
60
 
@@ -81,15 +69,14 @@ const PNPM_EXEC = 'exec'
81
69
  const FORMAT_FLAGS: ReadonlyArray<string> = ['--format', 'json', '--no-inline-config']
82
70
  const RULE_FLAG = '--rule'
83
71
  // **No `--cache`, and a `--cache-location` all the same.** An eslint run started *without* `--cache`
84
- // deletes whatever `--cache-location` names, which is how the edit hook once wiped the gate's cache
85
- // (joshuafolkken/kit#1332) — so the flag has to be here, pointed somewhere harmless, even though this
72
+ // deletes whatever `--cache-location` names, which would wipe the gate's cache — so the flag has to be here, pointed somewhere harmless, even though this
86
73
  // probe keeps no cache. It keeps none because the only key available is the checkout, and two
87
74
  // `josh lines` calls at once in one repository — routine with parallel agents here — would then be two
88
- // unsynchronized writers of one file. A cold run is a couple of seconds against the 543 this report
89
- // exists to save, so the cache is not worth a shared-state hazard.
75
+ // unsynchronized writers of one file. A cold run is a couple of seconds, so the cache is not worth a
76
+ // shared-state hazard.
90
77
  //
91
- // **The path is per probe, not per call** (joshuafolkken/kit#1454). Since the counting method decides
92
- // how many probes one call starts, two of them can now run concurrently — and each deletes whatever
78
+ // **The path is per probe, not per call.** Since the counting method decides how many probes one call
79
+ // starts, two of them can run concurrently — and each deletes whatever
93
80
  // `--cache-location` names as it starts, so one shared path would have them racing to unlink the file
94
81
  // the other just made. The option set's own key is folded into the name, which makes the paths
95
82
  // distinct exactly when the probes are.
@@ -100,9 +87,14 @@ const CACHE_KEY_LENGTH = 8
100
87
  // Only the two fields this reads. `ruleId` is nullable on a parse error or an ignore warning, and
101
88
  // both of those are answers — "no count for this path" — rather than failures.
102
89
  const message_schema = z.object({ ruleId: z.string().nullish(), message: z.string() })
103
- const results_schema = z.array(
104
- z.object({ filePath: z.string(), messages: z.array(message_schema) }),
105
- )
90
+ const result_schema = z.object({ filePath: z.string(), messages: z.array(message_schema) })
91
+ const results_schema = z.array(result_schema)
92
+
93
+ type LintResult = z.infer<typeof result_schema>
94
+
95
+ // The rule entry the probe hands eslint — as `--rule` JSON to the CLI, as `overrideConfig` rules to
96
+ // the Node API.
97
+ type ProbeRules = Record<string, [typeof PROBE_SEVERITY, LineRuleOptions & { max: number }]>
106
98
 
107
99
  interface LineBudget {
108
100
  code_lines: number
@@ -113,7 +105,7 @@ interface LineBudget {
113
105
 
114
106
  // `limit` is carried beside the budget, and it is not the same thing as `budget.limit`: a path this
115
107
  // project enforces no `max-lines` on has no limit at all, and the caller has to be able to say that
116
- // rather than say the count failed (joshuafolkken/kit#1454).
108
+ // rather than say the count failed.
117
109
  interface FileBudget {
118
110
  file_path: string
119
111
  limit: number | undefined
@@ -150,10 +142,12 @@ function budget_of(code_lines: number, limit: number): LineBudget {
150
142
 
151
143
  // The counting options are the project's own, so a consumer that turns `skipComments` off is counted
152
144
  // its way. Lowering `max` is the only change the probe makes.
145
+ function probe_rules(options: LineRuleOptions): ProbeRules {
146
+ return { [MAX_LINES_RULE]: [PROBE_SEVERITY, { ...options, max: PROBE_MAX }] }
147
+ }
148
+
153
149
  function probe_rule(options: LineRuleOptions): string {
154
- return JSON.stringify({
155
- [MAX_LINES_RULE]: [PROBE_SEVERITY, { ...options, max: PROBE_MAX }],
156
- })
150
+ return JSON.stringify(probe_rules(options))
157
151
  }
158
152
 
159
153
  function cache_prefix(key: string): string {
@@ -176,8 +170,7 @@ function probe_arguments(group: ProbeGroup, project_root: string): Array<string>
176
170
  // The project's own eslint, through its own shim when there is one and `pnpm exec` when there is not
177
171
  // — the same two routes every other command in this package reaches a local binary by. The lookup
178
172
  // **walks up** from the given directory, because pnpm does: resolving only the directory the command
179
- // was invoked in would disagree with the very binary it spawns, which is joshuafolkken/kit#934 and the
180
- // reason `local-bin.ts` ships this variant.
173
+ // was invoked in would disagree with the very binary it spawns.
181
174
  function probe_command(project_root: string, probe_args: ReadonlyArray<string>): Array<string> {
182
175
  const shim = find_local_bin_upwards(project_root, ESLINT_BIN)
183
176
 
@@ -237,13 +230,12 @@ function count_or_zero(
237
230
 
238
231
  // Keyed by the absolute path eslint reports, so the caller's spelling of a path does not have to
239
232
  // match it. A path eslint refused is simply absent, and the caller reports that rather than a number.
240
- function counts_in(raw_output: string | undefined = 'null'): ReadonlyMap<string, number> {
233
+ // The results are eslint's own objects whether they arrived as the CLI's JSON or from the Node API,
234
+ // so `josh metrics` reads its in-process run through this same reading.
235
+ function counts_from(results: ReadonlyArray<LintResult>): ReadonlyMap<string, number> {
241
236
  const counts = new Map<string, number>()
242
- const parsed = results_schema.safeParse(JSON.parse(raw_output))
243
237
 
244
- if (!parsed.success) return counts
245
-
246
- for (const result of parsed.data) {
238
+ for (const result of results) {
247
239
  const code_lines = count_or_zero(result.messages)
248
240
 
249
241
  if (code_lines !== undefined) counts.set(path.resolve(result.filePath), code_lines)
@@ -252,14 +244,11 @@ function counts_in(raw_output: string | undefined = 'null'): ReadonlyMap<string,
252
244
  return counts
253
245
  }
254
246
 
255
- // The safe entry point, and the only one exported: eslint's output can be empty or truncated, and
256
- // `JSON.parse` throws on both.
257
- function parse_counts(raw_output: string | undefined): ReadonlyMap<string, number> {
258
- try {
259
- return counts_in(raw_output)
260
- } catch {
261
- return new Map<string, number>()
262
- }
247
+ // eslint's output can be empty or truncated, and neither is JSON — both read as no counts at all.
248
+ function parse_counts(raw_output: string | undefined = 'null'): ReadonlyMap<string, number> {
249
+ const results = json_value.parse_with(raw_output, results_schema)
250
+
251
+ return results === undefined ? new Map<string, number>() : counts_from(results)
263
252
  }
264
253
 
265
254
  // **Only regular files are passed to eslint, and this is not tidiness.** One argument eslint cannot
@@ -284,7 +273,7 @@ function lintable_paths(file_paths: ReadonlyArray<string>): ReadonlyArray<string
284
273
  // One eslint run per *distinct counting method*, rather than one per path. The cost of this report is
285
274
  // a process start, so the number of paths is the one thing that must not multiply it — and the number
286
275
  // of distinct `max-lines` option sets in one project is one, in every configuration that does not
287
- // deliberately count two groups of files differently (joshuafolkken/kit#1454).
276
+ // deliberately count two groups of files differently.
288
277
  // The keys are sorted before they are written out, so two config blocks that state the same options in
289
278
  // a different order are one group rather than two. Unsorted, a purely cosmetic difference would split
290
279
  // the probe in two and cost a second eslint process for nothing.
@@ -387,7 +376,9 @@ const line_budget = {
387
376
  advice,
388
377
  budget_of,
389
378
  budgets_for,
379
+ counts_from,
390
380
  describe,
381
+ grouped,
391
382
  is_lintable_path,
392
383
  near_limit_percent,
393
384
  near_limit_threshold,
@@ -395,6 +386,7 @@ const line_budget = {
395
386
  probe_arguments,
396
387
  probe_command,
397
388
  probe_rule,
389
+ probe_rules,
398
390
  NEAR_LIMIT_FRACTION,
399
391
  }
400
392
 
@@ -1,7 +1,8 @@
1
+ import { existsSync } from 'node:fs'
1
2
  import path from 'node:path'
2
3
  import { git_spawn } from '#scripts/git/git-spawn'
3
4
 
4
- // The no-argument half of joshuafolkken/kit#1809. `josh lines <path>` answers for a file someone
5
+ // The no-argument half of `josh lines`. `josh lines <path>` answers for a file someone
5
6
  // already named; a file near the limit that nobody has named yet is invisible until the gate reports
6
7
  // it. This enumerates the repository's own lint-target files so the no-argument scan can report every
7
8
  // one of them near the limit at once, before the first edit rather than after it.
@@ -51,13 +52,16 @@ function split_names(output: string): ReadonlyArray<string> {
51
52
 
52
53
  // The names resolve against the repository `root`, never the process cwd: `--full-name` prints them
53
54
  // relative to the root wherever the command runs, so resolving against cwd would double the prefix
54
- // and drop every file when the command is invoked from a subdirectory.
55
+ // and drop every file when the command is invoked from a subdirectory. `--cached` still lists a file
56
+ // deleted from the working tree but not yet staged, so a path no longer on disk is dropped — every
57
+ // consumer reads or lints the file, and a deletion in flight would otherwise fail them.
55
58
  async function lint_target_files(root: string): Promise<ReadonlyArray<string>> {
56
59
  const output = await git_spawn.read([...LS_FILES_FLAGS, WHOLE_TREE_PATHSPEC])
57
60
 
58
61
  return split_names(output)
59
62
  .filter((name) => is_lint_target(name))
60
63
  .map((name) => path.resolve(root, name))
64
+ .filter((file_path) => existsSync(file_path))
61
65
  }
62
66
 
63
67
  const line_targets = {
@@ -5,7 +5,7 @@ import { git_command } from '#scripts/git/git-command'
5
5
  import { line_budget, type FileBudget, type LineBudget } from './line-budget'
6
6
  import { line_targets } from './line-targets'
7
7
 
8
- // `josh lines` — the ask-before-writing half of joshuafolkken/kit#1425. `pnpm josh lint` reports the
8
+ // `josh lines` — ask before writing. `pnpm josh lint` reports the
9
9
  // file line limit only once it has been broken, and by then the writing is finished and the splitting
10
10
  // that follows is rework. This answers the same question before the first edit: how many code lines
11
11
  // each target file already has, and how many are left.
@@ -33,7 +33,7 @@ const NONE_NEAR = 'no files near the limit'
33
33
  // at all. It deliberately does not name eslint, because the last of those is not eslint's doing.
34
34
  const NOT_A_FILE = 'not counted: not a regular file'
35
35
  const NOT_COUNTED = 'not counted: no line count for this path'
36
- // The third reason, and the one that replaced a wrong number (joshuafolkken/kit#1454). This project's
36
+ // The third reason, and the one that replaced a wrong number. This project's
37
37
  // eslint enforces no `max-lines` here, so there is nothing to report a budget against — and the
38
38
  // alternative to saying so is quoting kit's limit for someone else's project, which is the defect. It
39
39
  // names no cause because there are several: the rule is turned off for this path, no configuration
@@ -63,7 +63,7 @@ function row(relative_path: string, entry: FileBudget): string {
63
63
  // The threshold is printed with the rows rather than left implicit: a reader who sees "near the limit"
64
64
  // on one file and nothing on the next needs the boundary to know which side a third one is on.
65
65
  //
66
- // **It is read off the budgets rather than from a limit of this command's own** (joshuafolkken/kit#1454).
66
+ // **It is read off the budgets rather than from a limit of this command's own**.
67
67
  // Each file's limit is whatever that project's eslint enforces for it, so there is a line count to
68
68
  // print here only where every counted file agrees on one; where they do not — or where none was
69
69
  // resolved — the boundary is stated as the share it has always been, and each row carries its own
@@ -6,7 +6,7 @@ import { lane_cache_run } from '#scripts/lane/lane-cache-run'
6
6
  import { buffered_process, FAIL_EXIT_CODE } from '#scripts/lib/buffered-process'
7
7
 
8
8
  const ARGV_START = 2
9
- // `--no-progress` turns off cspell's per-file `N/1607 <path> cached` line (joshuafolkken/kit#2296).
9
+ // `--no-progress` turns off cspell's per-file `N/1607 <path> cached` line.
10
10
  // Those lines ran to 1,607 of them — the whole output past the 8,000-character tool cap — so a gate
11
11
  // that failed on one unknown word buried the failure under progress and a run could read only the
12
12
  // first of several failures. The summary and the issue lines it prints are untouched; only the
@@ -0,0 +1,122 @@
1
+ import { FAIL_EXIT_CODE, type BufferedProcessResult } from '#scripts/lib/buffered-process'
2
+ import type { ESLint } from 'eslint'
3
+
4
+ // `import/no-cycle` reads other files, and the lint cache keys a verdict on the linted file's own
5
+ // content. So once a cycle is closed by editing one side of it, the untouched side keeps its cached
6
+ // `Dependency cycle detected` until its own content changes (joshuafolkken/kit#3641). The opposite
7
+ // error cannot happen: a new cycle always contains the file that gained the import, and that file is
8
+ // re-linted.
9
+ //
10
+ // A lint run therefore re-reads a cached red that names the rule: the files reported for it are
11
+ // linted once more without the cache, and their fresh results replace the cached ones. A run that
12
+ // reports no cycle never reaches this, so the green path costs what it did.
13
+ //
14
+ // That holds for a run narrowed to one change's files as much as for the whole tree: the change can
15
+ // hold both sides of a cycle, and the side a later edit leaves alone keeps its cached report.
16
+ //
17
+ // The cached run is asked again through the Node API rather than read off the first run's report:
18
+ // that report is the stylish text, and taking a file out of it means re-deriving its problem
19
+ // counts. The second asking is answered from the cache the first one just wrote.
20
+ const NO_CYCLE_RULE = 'import/no-cycle'
21
+ const FORMATTER = 'stylish'
22
+ const UNCACHED_SUFFIX = '.uncached'
23
+
24
+ interface Linters {
25
+ cached: ESLint
26
+ fresh: ESLint
27
+ }
28
+
29
+ interface CycleRecheckOptions {
30
+ cache_file: string
31
+ // What the run linted — the whole tree, or one change's files — so the cached run is asked the
32
+ // question it was asked the first time.
33
+ patterns: ReadonlyArray<string>
34
+ // What the fixture test varies: the directory linted and the configuration it is linted with.
35
+ eslint_options?: ESLint.Options
36
+ }
37
+
38
+ // The exit code is eslint's "finished and reported problems", not any failure: a run that could not
39
+ // finish — a configuration that does not load, a rule that threw — exits 2 and may name the rule
40
+ // too, and asking it again throws the same error here, ahead of both buffered reports.
41
+ function is_cycle_reported(result: BufferedProcessResult): boolean {
42
+ return result.exit_code === FAIL_EXIT_CODE && result.output.includes(NO_CYCLE_RULE)
43
+ }
44
+
45
+ function has_cycle_message(result: ESLint.LintResult): boolean {
46
+ return result.messages.some((message) => message.ruleId === NO_CYCLE_RULE)
47
+ }
48
+
49
+ function cached_options(options: CycleRecheckOptions): ESLint.Options {
50
+ return {
51
+ ...options.eslint_options,
52
+ cache: true,
53
+ cacheStrategy: 'content',
54
+ cacheLocation: options.cache_file,
55
+ }
56
+ }
57
+
58
+ // A linter that runs without a cache deletes the cache file it would have used, and that defaults to
59
+ // the very file the lint run keeps. So the uncached linter is pointed at a sibling path nothing
60
+ // ever writes: the re-reading must not cost the next run its whole cache.
61
+ function fresh_options(options: CycleRecheckOptions): ESLint.Options {
62
+ return {
63
+ ...options.eslint_options,
64
+ cache: false,
65
+ cacheLocation: `${options.cache_file}${UNCACHED_SUFFIX}`,
66
+ }
67
+ }
68
+
69
+ // `eslint` is loaded here, only past the cycle report: it is an optional peer a basic-profile
70
+ // consumer may not have, and this module is imported by the entry of every `josh lint`, which has to
71
+ // reach its skip notice there.
72
+ async function create_linters(options: CycleRecheckOptions): Promise<Linters> {
73
+ const eslint = await import('eslint')
74
+
75
+ return {
76
+ cached: new eslint.ESLint(cached_options(options)),
77
+ fresh: new eslint.ESLint(fresh_options(options)),
78
+ }
79
+ }
80
+
81
+ async function lint_fresh(
82
+ linter: ESLint,
83
+ cached: ReadonlyArray<ESLint.LintResult>,
84
+ ): Promise<Map<string, ESLint.LintResult>> {
85
+ const suspects = cached.filter((result) => has_cycle_message(result))
86
+ if (suspects.length === 0) return new Map()
87
+ const fresh = await linter.lintFiles(suspects.map((result) => result.filePath))
88
+
89
+ return new Map(fresh.map((result) => [result.filePath, result]))
90
+ }
91
+
92
+ async function report(
93
+ linter: ESLint,
94
+ results: Array<ESLint.LintResult>,
95
+ ): Promise<Pick<BufferedProcessResult, 'output' | 'exit_code'>> {
96
+ const formatter = await linter.loadFormatter(FORMATTER)
97
+ const is_failed = results.some((result) => result.errorCount > 0)
98
+
99
+ return { output: await formatter.format(results), exit_code: is_failed ? FAIL_EXIT_CODE : 0 }
100
+ }
101
+
102
+ async function verify(
103
+ result: BufferedProcessResult,
104
+ options: CycleRecheckOptions,
105
+ ): Promise<BufferedProcessResult> {
106
+ if (!is_cycle_reported(result)) return result
107
+ const started_at = performance.now()
108
+ const linters = await create_linters(options)
109
+ const cached = await linters.cached.lintFiles([...options.patterns])
110
+ const fresh = await lint_fresh(linters.fresh, cached)
111
+ const verified = await report(
112
+ linters.fresh,
113
+ cached.map((entry) => fresh.get(entry.filePath) ?? entry),
114
+ )
115
+
116
+ return { ...verified, elapsed_ms: result.elapsed_ms + performance.now() - started_at }
117
+ }
118
+
119
+ const cycle_recheck = { verify }
120
+
121
+ export type { CycleRecheckOptions }
122
+ export { cycle_recheck, NO_CYCLE_RULE }
@@ -19,8 +19,7 @@ async function run_step(args: ReadonlyArray<string>, directory: string): Promise
19
19
 
20
20
  // prettier first, deliberately: `eslint --fix` exits 1 whenever a non-autofixable error remains, so
21
21
  // putting it first would mean one unused variable anywhere in the tree stops prettier from running.
22
- // A basic project without Prettier or ESLint is skipped with the same reason `josh lint` prints
23
- // (joshuafolkken/kit#2693, joshuafolkken/kit#2606).
22
+ // A basic project without Prettier or ESLint is skipped with the same reason `josh lint` prints.
24
23
  async function run_unless_skipped(
25
24
  check: string,
26
25
  reason: string | undefined,