@joshuafolkken/kit 1.1229.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 (939) 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 +24 -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 +27 -16
  27. package/.claude/skills/workflow-commands/latest-gate.md +18 -29
  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/.github/workflows/publish.yml +2 -0
  42. package/.vscode/tasks.json +14 -0
  43. package/CLAUDE.md +10 -61
  44. package/README.md +38 -57
  45. package/SECURITY.md +1 -1
  46. package/dist/CLAUDE.md +10 -61
  47. package/dist/commands/document-section-cli.js +42 -10
  48. package/dist/config-merge/index.js +11 -2
  49. package/dist/hooks/audit-provision.js +2 -2
  50. package/dist/hooks/batch-guard.js +7 -7
  51. package/dist/hooks/{chunk-FIVDHQGT.js → chunk-43G45XJF.js} +18 -20
  52. package/dist/hooks/{chunk-JUDKDCDP.js → chunk-4TW4MQUL.js} +284 -362
  53. package/dist/hooks/{chunk-5VMKCCC4.js → chunk-76RK6E3H.js} +13 -11
  54. package/dist/hooks/{chunk-RNWHN5BP.js → chunk-DZWZ3DKY.js} +4 -4
  55. package/dist/hooks/{chunk-5VNDSNG3.js → chunk-FZ6FUSBM.js} +1 -1
  56. package/dist/hooks/{chunk-VC3PZPZO.js → chunk-GG72ANKI.js} +1 -1
  57. package/dist/hooks/{chunk-6HJJXRBX.js → chunk-KPM4YIIX.js} +8 -44
  58. package/dist/hooks/chunk-MXVQMLDP.js +3705 -0
  59. package/dist/hooks/{chunk-ELCN5LCH.js → chunk-NEC4AT4Z.js} +34 -12
  60. package/dist/hooks/{chunk-TQNPDZNH.js → chunk-NZBHG6FW.js} +7 -5
  61. package/dist/hooks/chunk-NZN2UFI6.js +2409 -0
  62. package/dist/hooks/{chunk-F56MFS4B.js → chunk-R6CRQEAL.js} +4 -4
  63. package/dist/hooks/chunk-SYSRHRWU.js +1589 -0
  64. package/dist/hooks/{chunk-55HHG5PX.js → chunk-TLJYAGZK.js} +799 -903
  65. package/dist/hooks/chunk-Z5TMJIPW.js +45 -0
  66. package/dist/hooks/codex-hook-adapter.js +26 -21
  67. package/dist/hooks/duplicate-read-guard.js +8 -8
  68. package/dist/hooks/format-edited.js +4 -4
  69. package/dist/hooks/inputs.json +213 -197
  70. package/dist/hooks/investigation-guard.js +8 -8
  71. package/dist/hooks/pretool-guard.js +15 -15
  72. package/dist/hooks/session-lang.js +406 -8
  73. package/dist/hooks/stop-guard.js +122 -201
  74. package/dist/josh.js +540 -137
  75. package/dist/version/index.js +15 -13
  76. package/eslint/base.js +43 -5
  77. package/eslint/rules/english-only-prose.js +3 -3
  78. package/eslint/rules/import.js +12 -0
  79. package/eslint/rules/namespace-object-export.js +2 -2
  80. package/package.json +16 -10
  81. package/pnpm-workspace.yaml +2 -4
  82. package/prompts/coding-standards.md +14 -48
  83. package/prompts/collaboration-workflow/file-edits.md +1 -1
  84. package/prompts/collaboration-workflow/issue-citation.md +1 -1
  85. package/prompts/collaboration-workflow/issue-template.md +4 -10
  86. package/prompts/collaboration-workflow/operating-rules.md +7 -8
  87. package/prompts/collaboration-workflow/output-bounds.md +1 -1
  88. package/prompts/collaboration-workflow/overview.md +1 -1
  89. package/prompts/collaboration-workflow/plan-comment.md +2 -1
  90. package/prompts/collaboration-workflow/principles.md +21 -3
  91. package/prompts/collaboration-workflow/report-format.md +16 -29
  92. package/prompts/collaboration-workflow/residency.md +1 -1
  93. package/prompts/collaboration-workflow/rule-delivery.md +7 -95
  94. package/prompts/collaboration-workflow/shell-body.md +3 -23
  95. package/prompts/collaboration-workflow/turn-batching.md +4 -13
  96. package/prompts/collaboration-workflow/wip-cap.md +5 -11
  97. package/prompts/refactoring.md +1 -1
  98. package/prompts/review-rubric.md +3 -22
  99. package/prompts/review.md +15 -38
  100. package/prompts/testing-guide.md +2 -4
  101. package/scripts/adopt/adopt-logic.ts +5 -5
  102. package/scripts/adopt/adopt-toolkits.ts +4 -5
  103. package/scripts/adopt/adopt.ts +2 -3
  104. package/scripts/agent/agent-argv.ts +7 -7
  105. package/scripts/agent/agent-diagnostics.ts +2 -2
  106. package/scripts/agent/agent-exit-record.ts +1 -1
  107. package/scripts/agent/agent-headless.ts +1 -1
  108. package/scripts/agent/agent-launch-environment.ts +6 -1
  109. package/scripts/agent/agent-role-profile.ts +49 -22
  110. package/scripts/agent/agent-session-role.ts +32 -0
  111. package/scripts/agent/api-outage.ts +1 -1
  112. package/scripts/agent/claude-agent-argv.ts +4 -4
  113. package/scripts/agent/claude-result-event.ts +4 -4
  114. package/scripts/agent/codex-hooks.ts +2 -2
  115. package/scripts/agent/interactive-ask.ts +3 -6
  116. package/scripts/auto-ok/auto-ok-cli.ts +46 -60
  117. package/scripts/backlog/backlog-arrival-added.ts +34 -0
  118. package/scripts/backlog/backlog-arrival.ts +54 -17
  119. package/scripts/backlog/backlog-budget-cli.ts +34 -6
  120. package/scripts/backlog/backlog-budget.ts +17 -24
  121. package/scripts/backlog/backlog-defect-priority.ts +1 -1
  122. package/scripts/backlog/backlog-drive-args.ts +5 -4
  123. package/scripts/backlog/backlog-drive-cli.ts +14 -10
  124. package/scripts/backlog/backlog-drive-epic.ts +85 -0
  125. package/scripts/backlog/backlog-drive-launch.ts +1 -1
  126. package/scripts/backlog/backlog-drive-named-offer.ts +60 -9
  127. package/scripts/backlog/backlog-drive-named.ts +39 -9
  128. package/scripts/backlog/backlog-drive-offer-argv.ts +1 -1
  129. package/scripts/backlog/backlog-drive-restore.ts +1 -1
  130. package/scripts/backlog/backlog-drive-retrospective.ts +2 -2
  131. package/scripts/backlog/backlog-drive.ts +43 -28
  132. package/scripts/backlog/backlog-idle.ts +88 -0
  133. package/scripts/backlog/backlog-named.ts +11 -15
  134. package/scripts/backlog/backlog-next.ts +26 -30
  135. package/scripts/backlog/backlog-offer-cli.ts +28 -23
  136. package/scripts/backlog/backlog-offer.ts +7 -7
  137. package/scripts/backlog/backlog-overlap.ts +178 -0
  138. package/scripts/backlog/backlog-plan-cli.ts +14 -90
  139. package/scripts/backlog/backlog-plan-read.ts +111 -0
  140. package/scripts/backlog/backlog-plan.ts +11 -10
  141. package/scripts/backlog/backlog-pool.ts +13 -14
  142. package/scripts/backlog/backlog-rank.ts +11 -11
  143. package/scripts/backlog/backlog-ready.ts +15 -10
  144. package/scripts/backlog/backlog-scope.ts +14 -15
  145. package/scripts/backlog/backlog-stalled-cli.ts +2 -2
  146. package/scripts/backlog/backlog-stalled-detect.ts +4 -4
  147. package/scripts/backlog/backlog-stalled.ts +5 -6
  148. package/scripts/backlog/backlog-waves.ts +4 -4
  149. package/scripts/backlog/backlogrun-args.ts +74 -0
  150. package/scripts/backlog/backlogrun-cli.ts +113 -0
  151. package/scripts/backlog/backlogrun-launch.ts +178 -0
  152. package/scripts/behavior/behavior-assertion.ts +6 -8
  153. package/scripts/behavior/behavior-cli.ts +1 -1
  154. package/scripts/behavior/behavior-rules.ts +3 -3
  155. package/scripts/build/build-claude-md.ts +4 -4
  156. package/scripts/build/build-codex-hooks.ts +2 -2
  157. package/scripts/build/build-commands.ts +1 -1
  158. package/scripts/build/build-hooks.ts +5 -5
  159. package/scripts/build/build.ts +1 -1
  160. package/scripts/build/hook-bundle-stamp.ts +109 -7
  161. package/scripts/build/local-bin.ts +2 -2
  162. package/scripts/cases/cases-cli.ts +1 -1
  163. package/scripts/cases/cases-logic.ts +2 -2
  164. package/scripts/ci/composite-actions.ts +1 -2
  165. package/scripts/ci/pr-classification.ts +2 -2
  166. package/scripts/claude/workflow-destination.ts +1 -1
  167. package/scripts/clone/clone-aggregate.ts +1 -1
  168. package/scripts/clone/clone-fingerprint.ts +1 -1
  169. package/scripts/clone/clone-scan-cli.ts +1 -1
  170. package/scripts/clone/clone-scan.ts +1 -1
  171. package/scripts/config-merge/index.ts +1 -1
  172. package/scripts/config-merge/json-format.ts +1 -3
  173. package/scripts/config-merge/patch-json-array.ts +90 -0
  174. package/scripts/config-merge/patch-json-key.ts +6 -3
  175. package/scripts/config-merge/patch-json-list.ts +1 -1
  176. package/scripts/cost-runtime/codex-usage.ts +1 -1
  177. package/scripts/cost-runtime/context-cut-payback.ts +4 -5
  178. package/scripts/cost-runtime/context-cut-threshold.ts +4 -6
  179. package/scripts/cost-runtime/cost-attribute.ts +3 -3
  180. package/scripts/cost-runtime/cost-blocks.ts +3 -4
  181. package/scripts/cost-runtime/cost-cli.ts +14 -11
  182. package/scripts/cost-runtime/cost-corpus.ts +11 -11
  183. package/scripts/cost-runtime/cost-pricing.ts +4 -4
  184. package/scripts/cost-runtime/cost-tokens.ts +1 -2
  185. package/scripts/cost-runtime/cost-transcript.ts +29 -29
  186. package/scripts/cost-runtime/cost-usage.ts +6 -7
  187. package/scripts/cost-runtime/cost-verdict.ts +10 -11
  188. package/scripts/cost-runtime/own-session.ts +1 -1
  189. package/scripts/cost-runtime/transcript-cwd.ts +2 -2
  190. package/scripts/delegation/delegation-cli.ts +4 -4
  191. package/scripts/delegation/delegation-policy.ts +13 -15
  192. package/scripts/delegation/duplicate-read-guard.ts +9 -10
  193. package/scripts/delegation/fanout-cli.ts +1 -1
  194. package/scripts/delegation/fanout.ts +1 -1
  195. package/scripts/delegation/investigation-guard.ts +18 -22
  196. package/scripts/delegation/investigation-reads.ts +48 -238
  197. package/scripts/discovery/repo-discovery.ts +1 -1
  198. package/scripts/discovery/repo-map-logic.ts +1 -2
  199. package/scripts/discovery/repo-origin.ts +3 -3
  200. package/scripts/discovery/repo-party-cli.ts +2 -2
  201. package/scripts/discovery/repo-party.ts +2 -2
  202. package/scripts/doctor/doctor-consumer.ts +1 -1
  203. package/scripts/doctor/doctor-io.ts +6 -7
  204. package/scripts/doctor/doctor-logic.ts +1 -1
  205. package/scripts/doctor/doctor-ports.ts +1 -1
  206. package/scripts/doctor/doctor.ts +8 -9
  207. package/scripts/document/backlogrun-parent-read-set.ts +5 -6
  208. package/scripts/document/bash-output-cap.ts +5 -7
  209. package/scripts/document/capped-print-part.ts +1 -1
  210. package/scripts/document/capped-print.ts +1 -1
  211. package/scripts/document/document-byte-budget.ts +33 -64
  212. package/scripts/document/document-byte-check.ts +4 -4
  213. package/scripts/document/document-reachability.ts +7 -8
  214. package/scripts/document/document-read-cli.ts +2 -2
  215. package/scripts/document/document-scan.ts +26 -2
  216. package/scripts/document/document-section-cli.ts +6 -8
  217. package/scripts/document/document-section.ts +8 -12
  218. package/scripts/document/edit-files-cli.ts +3 -4
  219. package/scripts/document/entry-read-budget.ts +8 -70
  220. package/scripts/document/entry-read-set.ts +51 -34
  221. package/scripts/document/lane-child-read-set.ts +9 -9
  222. package/scripts/document/read-files-cli.ts +1 -2
  223. package/scripts/document/read-set-cli.ts +16 -19
  224. package/scripts/document/read-set-cost.ts +4 -4
  225. package/scripts/document/read-set-point-of-use.ts +28 -38
  226. package/scripts/document/read-set-pricing.ts +1 -1
  227. package/scripts/document/read-set-trim.ts +3 -3
  228. package/scripts/document/resident-budget.ts +8 -10
  229. package/scripts/epic/epic-add-body.ts +15 -18
  230. package/scripts/epic/epic-add-plan.ts +26 -28
  231. package/scripts/epic/epic-add.ts +32 -25
  232. package/scripts/epic/epic-audit-checks.ts +27 -37
  233. package/scripts/epic/epic-audit-cli.ts +21 -22
  234. package/scripts/epic/epic-audit-orphans.ts +16 -17
  235. package/scripts/epic/epic-audit-rationale.ts +10 -15
  236. package/scripts/epic/epic-audit-report.ts +2 -5
  237. package/scripts/epic/epic-audit.ts +18 -14
  238. package/scripts/epic/epic-body.ts +10 -10
  239. package/scripts/epic/epic-bundle-cli.ts +36 -34
  240. package/scripts/epic/epic-bundle-evidence.ts +5 -5
  241. package/scripts/epic/epic-bundle-gaps.ts +6 -9
  242. package/scripts/epic/epic-bundle-poll.ts +1 -1
  243. package/scripts/epic/epic-bundle-referenced.ts +11 -14
  244. package/scripts/epic/epic-bundle.ts +19 -20
  245. package/scripts/epic/epic-busy.ts +44 -21
  246. package/scripts/epic/epic-candidate-confirm.ts +15 -18
  247. package/scripts/epic/epic-chains.ts +18 -23
  248. package/scripts/epic/epic-classify.ts +11 -12
  249. package/scripts/epic/epic-cli-argv.ts +5 -6
  250. package/scripts/epic/epic-cli-remove.ts +9 -4
  251. package/scripts/epic/epic-cli.ts +38 -26
  252. package/scripts/epic/epic-close-comment.ts +14 -15
  253. package/scripts/epic/epic-close.ts +25 -29
  254. package/scripts/epic/epic-cross-repo.ts +18 -21
  255. package/scripts/epic/epic-decision.ts +14 -18
  256. package/scripts/epic/epic-fetch.ts +25 -31
  257. package/scripts/epic/epic-graph.ts +15 -17
  258. package/scripts/epic/epic-index.ts +14 -16
  259. package/scripts/epic/epic-issue.ts +9 -11
  260. package/scripts/epic/epic-label-age.ts +74 -0
  261. package/scripts/epic/epic-lane-offer.ts +35 -24
  262. package/scripts/epic/epic-nested.ts +1 -1
  263. package/scripts/epic/epic-next-read.ts +8 -8
  264. package/scripts/epic/epic-next-views.ts +12 -12
  265. package/scripts/epic/epic-next.ts +29 -33
  266. package/scripts/epic/epic-outside-blocker.ts +11 -10
  267. package/scripts/epic/epic-parse.ts +22 -24
  268. package/scripts/epic/epic-promote.ts +3 -2
  269. package/scripts/epic/epic-rank.ts +1 -1
  270. package/scripts/epic/epic-read.ts +10 -8
  271. package/scripts/epic/epic-reconcile.ts +8 -6
  272. package/scripts/epic/epic-reference.ts +5 -4
  273. package/scripts/epic/epic-relation-recheck.ts +10 -11
  274. package/scripts/epic/epic-relations.ts +9 -8
  275. package/scripts/epic/epic-remove-plan.ts +4 -5
  276. package/scripts/epic/epic-remove.ts +7 -5
  277. package/scripts/epic/epic-report.ts +18 -20
  278. package/scripts/epic/epic-run.ts +6 -5
  279. package/scripts/epic/epic-sections.ts +2 -2
  280. package/scripts/epic/epic-shape.ts +3 -3
  281. package/scripts/epic/epic-solo-stale.ts +3 -2
  282. package/scripts/epic/epic-solo.ts +8 -8
  283. package/scripts/epic/epic-triage.ts +5 -4
  284. package/scripts/epic/epic-validate.ts +8 -7
  285. package/scripts/epic/epic.ts +5 -5
  286. package/scripts/exports/unused-members-cli.ts +1 -1
  287. package/scripts/followup/followup-issue-number.ts +1 -2
  288. package/scripts/followup/git-followup-cleanup.ts +6 -7
  289. package/scripts/followup/git-followup-finish.ts +11 -13
  290. package/scripts/followup/git-followup-flush.ts +11 -7
  291. package/scripts/followup/git-followup-issue-close.ts +16 -13
  292. package/scripts/followup/git-followup-label.ts +9 -6
  293. package/scripts/followup/git-followup-merged.ts +1 -1
  294. package/scripts/followup/git-followup-pending.ts +7 -9
  295. package/scripts/followup/git-followup-stages.ts +28 -17
  296. package/scripts/followup/git-followup-workflow.ts +19 -21
  297. package/scripts/followup/git-pr-followup-checks.ts +13 -20
  298. package/scripts/followup/git-pr-followup-wrapup.ts +7 -7
  299. package/scripts/followup/git-pr-followup.ts +18 -17
  300. package/scripts/gate/core-admission.ts +162 -0
  301. package/scripts/gate/core-budget.ts +134 -91
  302. package/scripts/gate/gate-ledger.ts +114 -0
  303. package/scripts/gate/gate-log.ts +7 -9
  304. package/scripts/gate/gate-plan.ts +103 -35
  305. package/scripts/gate/gate-report.ts +39 -21
  306. package/scripts/gate/gate-skip.ts +11 -13
  307. package/scripts/gate/gate-steps.ts +5 -1
  308. package/scripts/gate/gate-tree.ts +3 -4
  309. package/scripts/gate/hook-gate-reuse.ts +9 -9
  310. package/scripts/gate/machine-capacity.ts +313 -0
  311. package/scripts/gate/pre-commit-type-check.ts +4 -4
  312. package/scripts/gate/project-checks.ts +12 -4
  313. package/scripts/gate/scoped-green.ts +11 -18
  314. package/scripts/gate/type-check-command.ts +2 -2
  315. package/scripts/gate/type-check-step.ts +4 -4
  316. package/scripts/gate/verification-gate.ts +60 -53
  317. package/scripts/gh/gh-spawn.ts +2 -2
  318. package/scripts/gh/git-ai-review-scan.ts +3 -2
  319. package/scripts/gh/git-gh-api-path.ts +10 -11
  320. package/scripts/gh/git-gh-exec.ts +43 -48
  321. package/scripts/gh/git-gh-failure.ts +6 -9
  322. package/scripts/gh/git-gh-helpers.ts +1 -1
  323. package/scripts/gh/git-gh-issue-list.ts +15 -19
  324. package/scripts/gh/git-gh-issue-read.ts +43 -60
  325. package/scripts/gh/git-gh-issue-rest.ts +14 -15
  326. package/scripts/gh/git-gh-issue-write.ts +52 -40
  327. package/scripts/gh/git-gh-issue.ts +23 -24
  328. package/scripts/gh/git-gh-pr-auto-merge.ts +3 -3
  329. package/scripts/gh/git-gh-pr-read.ts +46 -50
  330. package/scripts/gh/git-gh-pr-rest.ts +23 -26
  331. package/scripts/gh/git-gh-pr-review.ts +2 -2
  332. package/scripts/gh/git-gh-pr-rollup.ts +4 -4
  333. package/scripts/gh/git-gh-pr-snapshot.ts +8 -10
  334. package/scripts/gh/git-gh-pr.ts +16 -16
  335. package/scripts/gh/git-gh-reachability.ts +11 -12
  336. package/scripts/gh/git-gh-repo.ts +2 -3
  337. package/scripts/gh/git-gh-rest-state.ts +1 -1
  338. package/scripts/gh/git-pr-ai-review.ts +6 -5
  339. package/scripts/gh/git-pr-checks-eval.ts +28 -30
  340. package/scripts/gh/git-pr-checks-parse.ts +14 -16
  341. package/scripts/gh/git-pr-checks-watch.ts +17 -17
  342. package/scripts/gh/git-pr-checks.ts +20 -23
  343. package/scripts/gh/git-pr-coderabbit.ts +8 -6
  344. package/scripts/gh/git-pr-confirmation.ts +5 -5
  345. package/scripts/gh/git-pr-managed-config.ts +7 -9
  346. package/scripts/gh/git-pr-messages.ts +1 -1
  347. package/scripts/gh/git-pr.ts +15 -16
  348. package/scripts/gh/github-issue-url.ts +8 -9
  349. package/scripts/git/base-tree.ts +66 -0
  350. package/scripts/git/change-base.ts +42 -2
  351. package/scripts/git/changed-file-scope.ts +5 -5
  352. package/scripts/git/changed-paths.ts +1 -2
  353. package/scripts/git/constants.ts +2 -2
  354. package/scripts/git/git-branch.ts +1 -1
  355. package/scripts/git/git-closes-keyword.ts +3 -3
  356. package/scripts/git/git-command.ts +53 -41
  357. package/scripts/git/git-common-directory.ts +3 -3
  358. package/scripts/git/git-diff-reads.ts +14 -15
  359. package/scripts/git/git-error.ts +1 -1
  360. package/scripts/git/git-execa-error.ts +1 -2
  361. package/scripts/git/git-issue.ts +10 -8
  362. package/scripts/git/git-location-environment.ts +3 -4
  363. package/scripts/git/git-ls-remote.ts +6 -8
  364. package/scripts/git/git-pre-push-hook.ts +11 -10
  365. package/scripts/git/git-preflight.ts +5 -5
  366. package/scripts/git/git-push-transport.ts +2 -2
  367. package/scripts/git/git-remote-branch.ts +1 -2
  368. package/scripts/git/git-schemas.ts +16 -23
  369. package/scripts/git/git-spawn-sync.ts +1 -1
  370. package/scripts/git/git-spawn.ts +37 -14
  371. package/scripts/git/git-ssh-keepalive.ts +12 -5
  372. package/scripts/git/git-staging.ts +7 -8
  373. package/scripts/git/git-workflow.ts +1 -1
  374. package/scripts/git/git-worktree.ts +35 -27
  375. package/scripts/git/gone-branch.ts +2 -2
  376. package/scripts/git/listing-cutoff.ts +1 -2
  377. package/scripts/git/lockfile-sync.ts +65 -0
  378. package/scripts/git/main-merge-guard.ts +1 -2
  379. package/scripts/git/main-merge.ts +7 -7
  380. package/scripts/git/main-sync.ts +23 -8
  381. package/scripts/git/parse-json-array.ts +18 -23
  382. package/scripts/git/repository-lock.ts +34 -2
  383. package/scripts/git/stash/git-stash.ts +4 -5
  384. package/scripts/git/stash/stash-orphans.ts +5 -3
  385. package/scripts/git/stash/stash-pop-args.ts +1 -1
  386. package/scripts/git/stash/stash-pop-cli.ts +3 -3
  387. package/scripts/git/stash/stash-sweep-lock.ts +2 -2
  388. package/scripts/hooks/batch-guard.ts +11 -13
  389. package/scripts/hooks/check-commit-message.ts +12 -9
  390. package/scripts/hooks/codex-hook-adapter.ts +16 -10
  391. package/scripts/hooks/edited-cspell.ts +3 -4
  392. package/scripts/hooks/format-edited-cli.ts +1 -1
  393. package/scripts/hooks/format-edited-file.ts +11 -17
  394. package/scripts/hooks/format-rewrite-notice.ts +19 -17
  395. package/scripts/hooks/pre-push-unit.ts +10 -14
  396. package/scripts/hooks/pretool-guard-cli.ts +4 -4
  397. package/scripts/hooks/pretool-guard.ts +93 -18
  398. package/scripts/hooks/reserved-run.ts +2 -2
  399. package/scripts/hooks/step-zero-notice.ts +1 -1
  400. package/scripts/hooks/stop-guard.ts +21 -10
  401. package/scripts/init/basic-path-migration.ts +2 -2
  402. package/scripts/init/claude-kit-only-settings.ts +2 -2
  403. package/scripts/init/claude-plugin-config.ts +2 -2
  404. package/scripts/init/distributed-paths.ts +4 -4
  405. package/scripts/init/hook-command-rewrite.ts +3 -3
  406. package/scripts/init/hook-launch.ts +5 -5
  407. package/scripts/init/init-actions.ts +13 -0
  408. package/scripts/init/init-ai-copy.ts +11 -11
  409. package/scripts/init/init-bootstrap.ts +3 -3
  410. package/scripts/init/init-copy-content.ts +4 -4
  411. package/scripts/init/init-logic-json-merge.ts +7 -9
  412. package/scripts/init/init-logic-migrate.ts +1 -1
  413. package/scripts/init/init-logic-templates.ts +1 -1
  414. package/scripts/init/init-logic-workspace.ts +4 -4
  415. package/scripts/init/init-logic-yaml-merge.ts +2 -2
  416. package/scripts/init/init-logic.ts +19 -22
  417. package/scripts/init/init.ts +12 -8
  418. package/scripts/init/kit-base-preset.ts +1 -1
  419. package/scripts/init/kit-setup-state.ts +1 -1
  420. package/scripts/init/kit-written-paths.ts +1 -2
  421. package/scripts/init/package-manager-pin.ts +35 -0
  422. package/scripts/init/project-profile-cli.ts +1 -1
  423. package/scripts/init/project-profile.ts +3 -3
  424. package/scripts/init/session-language-environment.ts +1 -1
  425. package/scripts/init/start-exec.ts +3 -4
  426. package/scripts/init/start-plan.ts +2 -2
  427. package/scripts/init/start-setup-pr.ts +3 -2
  428. package/scripts/init/start-steps.ts +2 -2
  429. package/scripts/init/tsconfig-preset-migration.ts +1 -1
  430. package/scripts/init/vscode-tasks.ts +62 -0
  431. package/scripts/issue/baseline-measure.ts +2 -2
  432. package/scripts/issue/behavior-change-lint.ts +2 -2
  433. package/scripts/issue/defect-rate-cli.ts +6 -7
  434. package/scripts/issue/defect-rate.ts +37 -27
  435. package/scripts/issue/git-next-issues.ts +9 -8
  436. package/scripts/issue/issue-auto-ok.ts +49 -11
  437. package/scripts/issue/issue-backlinks-cli.ts +5 -5
  438. package/scripts/issue/issue-backlinks.ts +6 -6
  439. package/scripts/issue/issue-cite-cli.ts +20 -18
  440. package/scripts/issue/issue-cite.ts +18 -8
  441. package/scripts/issue/issue-closing-pr.ts +4 -4
  442. package/scripts/issue/issue-comment-cli.ts +6 -4
  443. package/scripts/issue/issue-file-cli.ts +75 -15
  444. package/scripts/issue/issue-file-fold.ts +155 -0
  445. package/scripts/issue/issue-file.ts +14 -6
  446. package/scripts/issue/issue-fold-cli.ts +14 -9
  447. package/scripts/issue/issue-fold.ts +23 -8
  448. package/scripts/issue/issue-labels.ts +46 -37
  449. package/scripts/issue/issue-lint-cli.ts +2 -2
  450. package/scripts/issue/issue-lint.ts +1 -1
  451. package/scripts/issue/issue-merged.ts +10 -4
  452. package/scripts/issue/issue-number-shape.ts +27 -0
  453. package/scripts/issue/issue-rank.ts +1 -1
  454. package/scripts/issue/issue-read-cli.ts +4 -5
  455. package/scripts/issue/issue-read.ts +4 -5
  456. package/scripts/issue/issue-reference.ts +5 -5
  457. package/scripts/issue/issue-release-cli.ts +165 -0
  458. package/scripts/issue/issue-release.ts +58 -0
  459. package/scripts/issue/issue-report-failures.ts +7 -4
  460. package/scripts/issue/issue-scout-cli.ts +11 -11
  461. package/scripts/issue/issue-scout-closed.ts +4 -4
  462. package/scripts/issue/issue-scout.ts +4 -5
  463. package/scripts/issue/issue-state-cli.ts +17 -10
  464. package/scripts/issue/issue-state.ts +12 -13
  465. package/scripts/issue/issue-wip.ts +7 -7
  466. package/scripts/issue/markdown-section.ts +3 -3
  467. package/scripts/issue/measure-rerun-cli.ts +10 -9
  468. package/scripts/issue/reproduction-measure.ts +3 -3
  469. package/scripts/issue/session-cite.ts +56 -0
  470. package/scripts/josh/agent-session-environment.ts +10 -8
  471. package/scripts/josh/cli-body.ts +2 -2
  472. package/scripts/josh/command-suggest.ts +1 -1
  473. package/scripts/josh/file-map-stamp.ts +20 -23
  474. package/scripts/josh/hook-decision.ts +24 -28
  475. package/scripts/josh/josh-command-map.ts +4 -1
  476. package/scripts/josh/josh-command-types.ts +32 -34
  477. package/scripts/josh/josh-commands-ai.ts +6 -6
  478. package/scripts/josh/josh-commands-backlog.ts +15 -3
  479. package/scripts/josh/josh-commands-clone.ts +1 -1
  480. package/scripts/josh/josh-commands-development.ts +33 -4
  481. package/scripts/josh/josh-commands-document.ts +3 -3
  482. package/scripts/josh/josh-commands-guard.ts +3 -3
  483. package/scripts/josh/josh-commands-issue.ts +11 -5
  484. package/scripts/josh/josh-commands-lane.ts +16 -5
  485. package/scripts/josh/josh-commands-lint.ts +1 -1
  486. package/scripts/josh/josh-commands-maintenance.ts +2 -2
  487. package/scripts/josh/josh-commands-run.ts +20 -6
  488. package/scripts/josh/josh-commands-split.ts +1 -2
  489. package/scripts/josh/josh-commands-versioning.ts +5 -5
  490. package/scripts/josh/josh-commands-workflow.ts +30 -22
  491. package/scripts/josh/josh-environment-file.ts +1 -1
  492. package/scripts/josh/josh-in-process.ts +3 -3
  493. package/scripts/josh/josh-logic.ts +10 -10
  494. package/scripts/josh/josh-run.ts +3 -3
  495. package/scripts/josh/josh-verdict.ts +9 -12
  496. package/scripts/josh/josh.ts +3 -3
  497. package/scripts/josh/kit-only.ts +2 -2
  498. package/scripts/josh/path-decision.ts +3 -3
  499. package/scripts/josh/platform-temporary.ts +7 -5
  500. package/scripts/josh/process-identity.ts +24 -6
  501. package/scripts/josh/process-owner.ts +4 -4
  502. package/scripts/josh/session-language-cli.ts +53 -11
  503. package/scripts/josh/session-language.ts +1 -1
  504. package/scripts/josh/stamp-file.ts +48 -29
  505. package/scripts/josh/stamp-record.ts +57 -0
  506. package/scripts/lane/lane-await.ts +35 -11
  507. package/scripts/lane/lane-cache.ts +6 -6
  508. package/scripts/lane/lane-capacity.ts +32 -17
  509. package/scripts/lane/lane-child-invocation.ts +17 -15
  510. package/scripts/lane/lane-child-marker.ts +12 -12
  511. package/scripts/lane/lane-cli.ts +20 -13
  512. package/scripts/lane/lane-close.ts +6 -6
  513. package/scripts/lane/lane-dispatch.ts +61 -72
  514. package/scripts/lane/lane-environment.ts +5 -5
  515. package/scripts/lane/lane-guard-policy.ts +7 -21
  516. package/scripts/lane/lane-handoff.ts +2 -2
  517. package/scripts/lane/lane-install.ts +9 -10
  518. package/scripts/lane/lane-launch-cli.ts +13 -8
  519. package/scripts/lane/lane-ledger.ts +73 -11
  520. package/scripts/lane/lane-leftover.ts +44 -30
  521. package/scripts/lane/lane-limit-cli.ts +160 -0
  522. package/scripts/lane/lane-limit-override.ts +74 -0
  523. package/scripts/lane/lane-load.ts +19 -68
  524. package/scripts/lane/lane-measure-cli.ts +15 -25
  525. package/scripts/lane/lane-occupancy.ts +6 -4
  526. package/scripts/lane/lane-open.ts +25 -24
  527. package/scripts/lane/lane-output.ts +4 -3
  528. package/scripts/lane/lane-paths.ts +22 -8
  529. package/scripts/lane/lane-phase.ts +33 -0
  530. package/scripts/lane/lane-reap.ts +2 -2
  531. package/scripts/lane/lane-registry.ts +27 -15
  532. package/scripts/lane/lane-relaunch.ts +9 -9
  533. package/scripts/lane/lane-report.ts +5 -4
  534. package/scripts/lane/lane-resume.ts +2 -2
  535. package/scripts/lane/lane-sampler.ts +55 -0
  536. package/scripts/lane/lane-seed.ts +7 -7
  537. package/scripts/lane/lane-stage-stats.ts +135 -0
  538. package/scripts/lane/lane-start-point.ts +8 -11
  539. package/scripts/lane/lane-stats.ts +60 -15
  540. package/scripts/lane/lane-stray.ts +140 -0
  541. package/scripts/lane/lane-vacant.ts +1 -1
  542. package/scripts/lane/openai-lane-supervisor-decision.ts +3 -7
  543. package/scripts/lane/openai-lane-supervisor-owner.ts +3 -9
  544. package/scripts/lane/openai-review-broker.ts +2 -4
  545. package/scripts/lib/ancestor-directories.ts +1 -1
  546. package/scripts/lib/bounded-pool.ts +2 -2
  547. package/scripts/lib/buffered-process.ts +4 -6
  548. package/scripts/lib/caddy-logs.sh +0 -0
  549. package/scripts/lib/cli-flags.ts +39 -6
  550. package/scripts/lib/error-message.ts +1 -1
  551. package/scripts/lib/json-value.ts +17 -3
  552. package/scripts/lib/poll.ts +1 -1
  553. package/scripts/lib/status-icons.ts +3 -3
  554. package/scripts/lib/timed-fetch.ts +1 -1
  555. package/scripts/lib/timeouts.ts +1 -1
  556. package/scripts/lines/bytes-command.ts +3 -4
  557. package/scripts/lines/effective-limit.ts +25 -12
  558. package/scripts/lines/line-budget.ts +47 -55
  559. package/scripts/lines/line-targets.ts +6 -2
  560. package/scripts/lines/lines-command.ts +3 -3
  561. package/scripts/lint/cspell-cached.ts +1 -1
  562. package/scripts/lint/cycle-recheck.ts +122 -0
  563. package/scripts/lint/format.ts +1 -2
  564. package/scripts/lint/lint-parallel.ts +34 -19
  565. package/scripts/lint/lint-related-scope.ts +25 -15
  566. package/scripts/lint/lint-related.ts +6 -7
  567. package/scripts/managed-marker/index.ts +1 -1
  568. package/scripts/managed-marker/managed-marker-logic.ts +1 -2
  569. package/scripts/notify/git-notify.ts +9 -7
  570. package/scripts/notify/telegram-notify.ts +53 -37
  571. package/scripts/notify/telegram-test-logic.ts +3 -3
  572. package/scripts/notify/telegram-test.ts +45 -30
  573. package/scripts/observations/observation-ledger-home.ts +14 -8
  574. package/scripts/observations/observation-ledger-line.ts +3 -2
  575. package/scripts/observations/observation-ledger-migrate.ts +3 -4
  576. package/scripts/observations/observation-ledger-prepare.ts +4 -4
  577. package/scripts/observations/observation-ledger.ts +14 -15
  578. package/scripts/observations/observation-record-cli.ts +83 -0
  579. package/scripts/observations/observation-record.ts +91 -0
  580. package/scripts/observations/observations-flush-cli.ts +1 -1
  581. package/scripts/observations/observations-flush-landing.ts +7 -6
  582. package/scripts/observations/observations-flush.ts +26 -27
  583. package/scripts/overrides/overrides-check.ts +18 -8
  584. package/scripts/package/package-scout-cli.ts +1 -1
  585. package/scripts/package/package-scout-format.ts +2 -2
  586. package/scripts/package/package-scout.ts +1 -1
  587. package/scripts/propagate/propagate-git-failure.ts +1 -1
  588. package/scripts/propagate/propagate-git.ts +7 -7
  589. package/scripts/propagate/propagate-plan.ts +2 -2
  590. package/scripts/propagate/propagate-publish.ts +2 -3
  591. package/scripts/propagate/propagate-run.ts +5 -7
  592. package/scripts/propagate/propagate-select.ts +1 -1
  593. package/scripts/propagate/propagate-steps.ts +19 -20
  594. package/scripts/propagate/propagate-targets.ts +6 -10
  595. package/scripts/propagate/propagate.ts +5 -5
  596. package/scripts/refactor/import-graph.ts +1 -1
  597. package/scripts/refactor/refactor-lint.ts +4 -10
  598. package/scripts/refactor/refactor-scan-cli.ts +1 -1
  599. package/scripts/refactor/refactor-scan.ts +2 -2
  600. package/scripts/refactor/refactor-targets.ts +1 -1
  601. package/scripts/release/github-release-cli.ts +25 -3
  602. package/scripts/release/github-release-environment.ts +1 -0
  603. package/scripts/release/github-release-runs.ts +115 -0
  604. package/scripts/release/github-release.ts +13 -67
  605. package/scripts/release/release-cli.ts +21 -4
  606. package/scripts/release/release-history.ts +6 -10
  607. package/scripts/release/release-plan.ts +3 -3
  608. package/scripts/release/release-progress.ts +3 -4
  609. package/scripts/release/release-publish.ts +8 -9
  610. package/scripts/release/release-scope-cli.ts +8 -10
  611. package/scripts/release/release-tag.ts +6 -8
  612. package/scripts/release/release-worktree.ts +5 -5
  613. package/scripts/repo/auto-merge-setting-logic.ts +7 -9
  614. package/scripts/repo/auto-merge-setting.ts +1 -1
  615. package/scripts/repo/repo-setting.ts +4 -4
  616. package/scripts/repo/repository-labels.ts +1 -1
  617. package/scripts/repo/required-checks-logic.ts +3 -3
  618. package/scripts/repo/required-checks-report.ts +1 -1
  619. package/scripts/repo/ruleset-check-cli.ts +1 -1
  620. package/scripts/repo/ruleset-check.ts +1 -1
  621. package/scripts/report/report-format-reference.ts +26 -0
  622. package/scripts/report/report-lint-cli.ts +2 -2
  623. package/scripts/report/report-lint.ts +16 -2
  624. package/scripts/review/disposition-cli.ts +2 -2
  625. package/scripts/review/disposition-logic.ts +1 -1
  626. package/scripts/review/live-evidence.ts +9 -6
  627. package/scripts/review/review-attest-cli.ts +1 -2
  628. package/scripts/review/review-attest.ts +3 -3
  629. package/scripts/review/review-brief-cli.ts +19 -20
  630. package/scripts/review/review-brief.ts +29 -32
  631. package/scripts/review/review-checkout.ts +2 -2
  632. package/scripts/review/review-diff-parts.ts +3 -5
  633. package/scripts/review/review-diff-write.ts +1 -1
  634. package/scripts/review/review-finding-ledger.ts +7 -4
  635. package/scripts/review/review-findings-cli.ts +2 -2
  636. package/scripts/review/review-level.ts +4 -7
  637. package/scripts/review/review-record-cli.ts +73 -16
  638. package/scripts/review/review-record.ts +5 -4
  639. package/scripts/review/review-round2-cli.ts +2 -3
  640. package/scripts/review/review-round2.ts +13 -21
  641. package/scripts/review/review-stamps.ts +9 -71
  642. package/scripts/review/review-tree.ts +4 -5
  643. package/scripts/rules/bash-triggers.ts +4 -4
  644. package/scripts/rules/decision-oracle-batch.ts +5 -6
  645. package/scripts/rules/decision-oracle-stage.ts +1 -1
  646. package/scripts/rules/decision-oracle-tokens.ts +1 -2
  647. package/scripts/rules/decision-oracle.ts +2 -2
  648. package/scripts/rules/delivered-rules.ts +61 -406
  649. package/scripts/rules/destructive-command.ts +2 -2
  650. package/scripts/rules/direct-filing.ts +4 -4
  651. package/scripts/rules/direct-pr-create.ts +2 -2
  652. package/scripts/rules/early-heartbeat.ts +15 -19
  653. package/scripts/rules/file-body.ts +5 -6
  654. package/scripts/rules/filing-cap.ts +6 -7
  655. package/scripts/rules/filing-offer.ts +1 -1
  656. package/scripts/rules/firing-point.ts +6 -6
  657. package/scripts/rules/gh-api.ts +2 -2
  658. package/scripts/rules/git-argv.ts +3 -3
  659. package/scripts/rules/git-force.ts +2 -2
  660. package/scripts/rules/hook-context-line.ts +31 -0
  661. package/scripts/rules/implementation-cut-verdict.ts +5 -8
  662. package/scripts/rules/implementation-cut.ts +35 -32
  663. package/scripts/rules/index-guard.ts +2 -2
  664. package/scripts/rules/issue-citation.ts +7 -7
  665. package/scripts/rules/issue-comments.ts +21 -13
  666. package/scripts/rules/josh-git-bare.ts +2 -2
  667. package/scripts/rules/lane-background.ts +14 -16
  668. package/scripts/rules/lane-carry-conflict.ts +41 -5
  669. package/scripts/rules/lane-interactive-ask.ts +6 -9
  670. package/scripts/rules/lane-park.ts +12 -16
  671. package/scripts/rules/lane-split-park.ts +1 -2
  672. package/scripts/rules/lane-switch-main.ts +10 -13
  673. package/scripts/rules/last-prompt.ts +1 -1
  674. package/scripts/rules/oracle-consulted.ts +5 -5
  675. package/scripts/rules/oracle-firing.ts +6 -9
  676. package/scripts/rules/oracle-list-cli.ts +2 -2
  677. package/scripts/rules/permission-guards.ts +2 -2
  678. package/scripts/rules/piped-verification.ts +79 -9
  679. package/scripts/rules/poll-loop.ts +9 -11
  680. package/scripts/rules/pre-gate-cut.ts +33 -30
  681. package/scripts/rules/prior-comment-read.ts +3 -3
  682. package/scripts/rules/protected-files.ts +25 -13
  683. package/scripts/rules/raw-field-body.ts +3 -4
  684. package/scripts/rules/reply-language.ts +1 -1
  685. package/scripts/rules/rule-body-guard.ts +10 -12
  686. package/scripts/rules/rule-guard.ts +1 -1
  687. package/scripts/rules/rule-list.ts +51 -0
  688. package/scripts/rules/rule-registry-rows.ts +282 -0
  689. package/scripts/rules/rule-registry.ts +109 -0
  690. package/scripts/rules/rule-value-cache.ts +2 -2
  691. package/scripts/rules/rule-value-cli.ts +6 -4
  692. package/scripts/rules/rule-value.ts +61 -22
  693. package/scripts/rules/run-tail-rule.ts +11 -15
  694. package/scripts/rules/shell-body-trigger.ts +7 -7
  695. package/scripts/rules/shell-segments.ts +2 -4
  696. package/scripts/rules/stop-rules.ts +54 -41
  697. package/scripts/rules/tail-commands.ts +1 -1
  698. package/scripts/rules/test-declared-commit.ts +2 -2
  699. package/scripts/rules/third-party-write.ts +3 -3
  700. package/scripts/rules/worktree-guard.ts +12 -5
  701. package/scripts/run/add/run-add-cli.ts +165 -0
  702. package/scripts/run/add/run-add.ts +124 -0
  703. package/scripts/run/board/run-board-cli.ts +207 -0
  704. package/scripts/run/board/run-board-closed.ts +95 -0
  705. package/scripts/run/board/run-board-every.ts +60 -0
  706. package/scripts/run/board/run-board-fetch.ts +38 -0
  707. package/scripts/run/board/run-board-fit.ts +219 -0
  708. package/scripts/run/board/run-board-github.ts +162 -0
  709. package/scripts/run/board/run-board-header.ts +275 -0
  710. package/scripts/run/board/run-board-kind.ts +35 -0
  711. package/scripts/run/board/run-board-labels.ts +299 -0
  712. package/scripts/run/board/run-board-layout.ts +222 -0
  713. package/scripts/run/board/run-board-link.ts +31 -0
  714. package/scripts/run/board/run-board-machine.ts +198 -0
  715. package/scripts/run/board/run-board-notes.ts +103 -0
  716. package/scripts/run/board/run-board-phase.ts +136 -0
  717. package/scripts/run/board/run-board-plan.ts +129 -0
  718. package/scripts/run/board/run-board-read.ts +62 -0
  719. package/scripts/run/board/run-board-render-legend.ts +82 -0
  720. package/scripts/run/board/run-board-render-notes.ts +77 -0
  721. package/scripts/run/board/run-board-render-slot.ts +50 -0
  722. package/scripts/run/board/run-board-render.ts +407 -0
  723. package/scripts/run/board/run-board-scope.ts +17 -0
  724. package/scripts/run/board/run-board-screen.ts +43 -0
  725. package/scripts/run/board/run-board-span.ts +66 -0
  726. package/scripts/run/board/run-board-spin.ts +115 -0
  727. package/scripts/run/board/run-board-state.ts +113 -0
  728. package/scripts/run/board/run-board-status.ts +279 -0
  729. package/scripts/run/board/run-board-tick.ts +210 -0
  730. package/scripts/run/board/run-board-track.ts +22 -0
  731. package/scripts/run/board/run-board-usage-read.ts +255 -0
  732. package/scripts/run/board/run-board-usage-rusage.ts +124 -0
  733. package/scripts/run/board/run-board-usage-text.ts +80 -0
  734. package/scripts/run/board/run-board-usage.ts +165 -0
  735. package/scripts/run/carry/run-carry-added.ts +62 -0
  736. package/scripts/run/carry/run-carry-args.ts +25 -22
  737. package/scripts/run/carry/run-carry-change.ts +1 -1
  738. package/scripts/run/carry/run-carry-cli.ts +71 -48
  739. package/scripts/run/carry/run-carry-conversation.ts +6 -7
  740. package/scripts/run/carry/run-carry-ended.ts +85 -0
  741. package/scripts/run/carry/run-carry-reclaim.ts +1 -1
  742. package/scripts/run/carry/run-carry-stash.ts +3 -2
  743. package/scripts/run/carry/run-carry-streak.ts +8 -10
  744. package/scripts/run/carry/run-carry.ts +85 -89
  745. package/scripts/run/cut/run-cut-args.ts +7 -7
  746. package/scripts/run/cut/run-cut-cli.ts +68 -37
  747. package/scripts/run/cut/run-cut-handoff.ts +15 -15
  748. package/scripts/run/cut/run-cut-report.ts +37 -16
  749. package/scripts/run/cut/run-cut.ts +63 -77
  750. package/scripts/run/detached-launch.ts +35 -50
  751. package/scripts/run/entry/run-entry-cli.ts +48 -27
  752. package/scripts/run/entry/run-entry-stop.ts +7 -9
  753. package/scripts/run/entry/run-entry.ts +5 -6
  754. package/scripts/run/event/run-event-cli.ts +5 -6
  755. package/scripts/run/event/run-event-filed.ts +69 -0
  756. package/scripts/run/event/run-event-follow.ts +3 -3
  757. package/scripts/run/event/run-event-plan.ts +38 -0
  758. package/scripts/run/event/run-event-render.ts +10 -4
  759. package/scripts/run/event/run-event-scope.ts +47 -18
  760. package/scripts/run/event/run-event-stream-emit.ts +64 -11
  761. package/scripts/run/event/run-event-stream.ts +172 -43
  762. package/scripts/run/event/run-event-watch.ts +4 -6
  763. package/scripts/run/hold/run-hold-cli.ts +65 -62
  764. package/scripts/run/hold/run-hold.ts +88 -46
  765. package/scripts/run/merge/run-merge-cli.ts +116 -77
  766. package/scripts/run/merge/run-merge-collect.ts +107 -0
  767. package/scripts/run/merge/run-merge-steps.ts +112 -65
  768. package/scripts/run/merge/run-merge-token.ts +30 -0
  769. package/scripts/run/merge/run-merge.ts +31 -22
  770. package/scripts/run/progress/run-progress-args.ts +4 -4
  771. package/scripts/run/progress/run-progress-cli.ts +39 -50
  772. package/scripts/run/progress/run-progress-clock.ts +25 -32
  773. package/scripts/run/progress/run-progress-config.ts +6 -9
  774. package/scripts/run/progress/run-progress-read.ts +9 -10
  775. package/scripts/run/progress/run-progress.ts +48 -53
  776. package/scripts/run/review/run-review-cli.ts +6 -6
  777. package/scripts/run/review/run-review-steps.ts +6 -6
  778. package/scripts/run/review/run-review.ts +9 -11
  779. package/scripts/run/run-cli-fault.ts +29 -0
  780. package/scripts/run/run-ending-cli.ts +3 -3
  781. package/scripts/run/run-ending.ts +10 -14
  782. package/scripts/run/run-halfrun-resume.ts +6 -8
  783. package/scripts/run/run-headless.ts +25 -12
  784. package/scripts/run/run-invocation.ts +17 -22
  785. package/scripts/run/run-label.ts +7 -5
  786. package/scripts/run/run-liveness-cli.ts +19 -6
  787. package/scripts/run/run-liveness.ts +27 -38
  788. package/scripts/run/run-next-cli.ts +5 -9
  789. package/scripts/run/run-next.ts +4 -5
  790. package/scripts/run/run-parent-cut-hook.ts +10 -12
  791. package/scripts/run/run-preflight.ts +25 -29
  792. package/scripts/run/run-prep-cli.ts +17 -13
  793. package/scripts/run/run-prep-locate.ts +4 -5
  794. package/scripts/run/run-prep.ts +7 -10
  795. package/scripts/run/run-prrun-resume.ts +2 -2
  796. package/scripts/run/run-report-cli.ts +4 -4
  797. package/scripts/run/run-report.ts +9 -14
  798. package/scripts/run/run-retrospective.ts +3 -3
  799. package/scripts/run/run-section.ts +42 -0
  800. package/scripts/run/run-stage-read.ts +2 -2
  801. package/scripts/run/run-stage.ts +6 -4
  802. package/scripts/run/run-status-cli.ts +7 -5
  803. package/scripts/run/run-status.ts +6 -7
  804. package/scripts/run/run-step-cli.ts +13 -15
  805. package/scripts/run/run-step.ts +62 -48
  806. package/scripts/run/run-stop-notify.ts +7 -8
  807. package/scripts/run/run-stranded-cli.ts +1 -1
  808. package/scripts/run/run-stranded-detect.ts +4 -4
  809. package/scripts/run/run-stranded.ts +11 -13
  810. package/scripts/run/run-tail-cli.ts +15 -16
  811. package/scripts/run/run-tail.ts +14 -33
  812. package/scripts/run/run-watcher-guard-cli.ts +3 -4
  813. package/scripts/run/run-watcher-guard.ts +11 -12
  814. package/scripts/run/run-watcher-hook.ts +6 -12
  815. package/scripts/run/ship/run-ship-cli.ts +67 -33
  816. package/scripts/run/ship/run-ship-detach.ts +15 -13
  817. package/scripts/run/ship/run-ship-lock.ts +1 -1
  818. package/scripts/run/ship/run-ship-next.ts +7 -8
  819. package/scripts/run/ship/run-ship-pre-detach.ts +27 -11
  820. package/scripts/run/ship/run-ship-preflight.ts +10 -11
  821. package/scripts/run/ship/run-ship-probe.ts +4 -4
  822. package/scripts/run/ship/run-ship-return.ts +1 -1
  823. package/scripts/run/ship/run-ship-review-steps.ts +43 -24
  824. package/scripts/run/ship/run-ship-review.ts +12 -14
  825. package/scripts/run/ship/run-ship-scoped.ts +15 -6
  826. package/scripts/run/ship/run-ship-stage.ts +80 -26
  827. package/scripts/run/ship/run-ship-steps.ts +26 -16
  828. package/scripts/run/ship/run-ship-stop-text.ts +4 -2
  829. package/scripts/run/ship/run-ship-sync.ts +9 -8
  830. package/scripts/run/ship/run-ship.ts +17 -32
  831. package/scripts/run/tidy/run-tidy-cli.ts +9 -5
  832. package/scripts/run/tidy/run-tidy-lanes.ts +18 -7
  833. package/scripts/run/tidy/run-tidy-stashes.ts +8 -8
  834. package/scripts/run/tidy/run-tidy.ts +4 -3
  835. package/scripts/run/wake/run-wake-cli.ts +27 -33
  836. package/scripts/run/wake/run-wake-describe.ts +76 -29
  837. package/scripts/run/wake/run-wake-driver.ts +14 -14
  838. package/scripts/run/wake/run-wake-handoff.ts +6 -6
  839. package/scripts/run/wake/run-wake-loop.ts +13 -21
  840. package/scripts/run/wake/run-wake-restart.ts +4 -5
  841. package/scripts/run/wake/run-wake-session.ts +23 -27
  842. package/scripts/run/wake/run-wake.ts +57 -328
  843. package/scripts/safe-chain/ci-installer-pin.ts +3 -3
  844. package/scripts/safe-chain/pack-hook.ts +2 -2
  845. package/scripts/safe-chain/preinstall-command.ts +2 -2
  846. package/scripts/security/security-audit-logic.ts +1 -1
  847. package/scripts/security/security-audit-provision-logic.ts +1 -1
  848. package/scripts/security/security-audit-provision.ts +2 -2
  849. package/scripts/security/security-audit.ts +5 -5
  850. package/scripts/security/security-updates-logic.ts +2 -3
  851. package/scripts/security/security-updates.ts +2 -4
  852. package/scripts/self-sync-guard/index.ts +1 -1
  853. package/scripts/self-sync-guard/self-sync-guard-logic.ts +2 -2
  854. package/scripts/self-sync-guard/self-sync-refusal.ts +1 -1
  855. package/scripts/sonar/sonar-hotspots-cli.ts +1 -1
  856. package/scripts/sonar/sonar-hotspots.ts +1 -1
  857. package/scripts/sonar/sonar-new-code-cli.ts +1 -1
  858. package/scripts/sonar/sonar-new-code.ts +1 -1
  859. package/scripts/sonar/sonar-project.ts +1 -1
  860. package/scripts/split/split-assess-cli.ts +1 -1
  861. package/scripts/split/split-assess.ts +3 -3
  862. package/scripts/sync/directory-copy-guard.ts +2 -3
  863. package/scripts/sync/managed-config-scope-cli.ts +1 -2
  864. package/scripts/sync/managed-config-scope.ts +4 -4
  865. package/scripts/sync/plugin-skill-directories.ts +2 -2
  866. package/scripts/sync/reconcile-templates.ts +17 -8
  867. package/scripts/sync/removed-skill-manifest.ts +2 -3
  868. package/scripts/sync/sync-ai-files.ts +7 -7
  869. package/scripts/sync/sync-configs.ts +30 -3
  870. package/scripts/sync/sync-hook-safety.ts +2 -2
  871. package/scripts/sync/sync.ts +23 -10
  872. package/scripts/sync/synced-paths.ts +2 -1
  873. package/scripts/sync/workflow-pin-logic.ts +1 -1
  874. package/scripts/test/test-declared-changed.ts +4 -4
  875. package/scripts/test/test-declared-logic.ts +2 -3
  876. package/scripts/test/test-declared-match.ts +25 -4
  877. package/scripts/test/test-declared.ts +26 -9
  878. package/scripts/test/test-red-commit.ts +3 -2
  879. package/scripts/test/test-red-logic.ts +7 -14
  880. package/scripts/test/test-red.ts +12 -47
  881. package/scripts/test/test-related-scope.ts +2 -3
  882. package/scripts/test/test-related.ts +3 -3
  883. package/scripts/test/test-type-logic.ts +1 -2
  884. package/scripts/test/test-unit-guard.ts +13 -17
  885. package/scripts/test/unit-worker-share.ts +7 -8
  886. package/scripts/time-runtime/time-agent-bundles.ts +2 -4
  887. package/scripts/time-runtime/time-background.ts +17 -21
  888. package/scripts/time-runtime/time-batch-guard.ts +67 -342
  889. package/scripts/time-runtime/time-bundle-call.ts +26 -28
  890. package/scripts/time-runtime/time-bundles.ts +11 -12
  891. package/scripts/time-runtime/time-call-identity.ts +1 -1
  892. package/scripts/time-runtime/time-command-key.ts +2 -2
  893. package/scripts/time-runtime/time-density-hook.ts +8 -11
  894. package/scripts/time-runtime/time-density.ts +5 -5
  895. package/scripts/time-runtime/time-followup-stage.ts +7 -7
  896. package/scripts/time-runtime/time-format.ts +5 -5
  897. package/scripts/time-runtime/time-hook-transcript.ts +3 -3
  898. package/scripts/time-runtime/time-instant.ts +1 -1
  899. package/scripts/time-runtime/time-markers.ts +15 -19
  900. package/scripts/time-runtime/time-phase-names.ts +3 -3
  901. package/scripts/time-runtime/time-reported-failure.ts +15 -19
  902. package/scripts/time-runtime/time-round-trips.ts +20 -23
  903. package/scripts/time-runtime/time-shell.ts +8 -8
  904. package/scripts/time-runtime/time-single-check.ts +1 -2
  905. package/scripts/time-runtime/time-spans.ts +35 -40
  906. package/scripts/time-runtime/time-tool-call.ts +15 -16
  907. package/scripts/time-runtime/time-transcript-line.ts +53 -34
  908. package/scripts/time-runtime/time-writes.ts +5 -5
  909. package/scripts/ui/ui-routes-cli.ts +1 -2
  910. package/scripts/ui/ui-routes.ts +1 -2
  911. package/scripts/version/bump-version.ts +1 -1
  912. package/scripts/version/fresh-metadata-cache.ts +2 -2
  913. package/scripts/version/latest-corepack.ts +129 -98
  914. package/scripts/version/latest-lane-guard.ts +1 -1
  915. package/scripts/version/latest-scope-cli.ts +2 -2
  916. package/scripts/version/latest-stamp.ts +1 -2
  917. package/scripts/version/latest-update.ts +2 -2
  918. package/scripts/version/npm-registry.ts +2 -2
  919. package/scripts/version/package-manager-version.ts +18 -0
  920. package/scripts/version/publishable-range-check.ts +2 -1
  921. package/scripts/version/publishable-range.ts +1 -1
  922. package/scripts/version/release-age.ts +11 -11
  923. package/scripts/version/release-hold.ts +2 -2
  924. package/scripts/version/safe-chain-version-update.ts +3 -3
  925. package/scripts/version/version-check-logic.ts +2 -3
  926. package/scripts/version/version-check.ts +1 -2
  927. package/scripts/version/version-command-config.ts +2 -2
  928. package/scripts/version/version-commands.ts +3 -3
  929. package/scripts/version/version-remote.ts +4 -4
  930. package/scripts/version/version-targets.ts +2 -2
  931. package/templates/gitignore +7 -0
  932. package/templates/workflows/github-release.yml +4 -0
  933. package/dist/hooks/chunk-NV2JRZZO.js +0 -6385
  934. package/dist/hooks/chunk-RKUAD3I6.js +0 -90
  935. package/dist/hooks/chunk-WPALEIRX.js +0 -18
  936. package/scripts/backlog/backlog-restructure.ts +0 -152
  937. package/scripts/rules/issue-fold-rule.ts +0 -72
  938. package/scripts/rules/wip-cap.ts +0 -63
  939. package/scripts/run/run-issue-number.ts +0 -19
@@ -3,11 +3,12 @@ import { linkSync, statSync, unlinkSync } from 'node:fs'
3
3
  import { process_identity } from '#scripts/josh/process-identity'
4
4
  import { process_owner_schema } from '#scripts/josh/process-owner'
5
5
  import { stamp_file } from '#scripts/josh/stamp-file'
6
+ import { json_value } from '#scripts/lib/json-value'
6
7
  import { z } from 'zod'
7
8
  import { openai_lane_supervisor_decision } from './openai-lane-supervisor-decision'
8
9
 
9
10
  // The supervisor's owner and state stamps — who holds a lane, and which child it last launched —
10
- // split out of `openai-lane-supervisor.ts` when it reached its line limit (joshuafolkken/kit#3264).
11
+ // split out of `openai-lane-supervisor.ts` when it reached its line limit.
11
12
  // `openai_lane_supervisor` re-exports each public one under the name it always had, so the move
12
13
  // changed no call site and no suite that spies on `openai_lane_supervisor`.
13
14
 
@@ -41,14 +42,7 @@ function state_path(lane_directory: string): string {
41
42
  }
42
43
 
43
44
  function parsed_stamp<T>(target: string, schema: z.ZodType<T>): T | undefined {
44
- try {
45
- const value: unknown = JSON.parse(stamp_file.read_stamp_text(target) ?? '')
46
- const parsed = schema.safeParse(value)
47
-
48
- return parsed.success ? parsed.data : undefined
49
- } catch {
50
- return undefined
51
- }
45
+ return json_value.parse_with(stamp_file.read_stamp_text(target) ?? '', schema)
52
46
  }
53
47
 
54
48
  function read(lane_directory: string): SupervisorOwner | undefined {
@@ -7,6 +7,7 @@ import { agent_role_profile } from '#scripts/agent/agent-role-profile'
7
7
  import { git_common_directory } from '#scripts/git/git-common-directory'
8
8
  import { stamp_file } from '#scripts/josh/stamp-file'
9
9
  import { error_text } from '#scripts/lib/error-message'
10
+ import { json_value } from '#scripts/lib/json-value'
10
11
  import { detached_launch } from '#scripts/run/detached-launch'
11
12
  import { run_ship_review } from '#scripts/run/ship/run-ship-review'
12
13
  import { z } from 'zod'
@@ -60,10 +61,7 @@ function response_path(directory: string, issue: string): string | undefined {
60
61
 
61
62
  function read_record<T>(target: string, schema: z.ZodType<T>): T | undefined {
62
63
  try {
63
- const content: unknown = JSON.parse(readFileSync(target, 'utf8'))
64
- const parsed = schema.safeParse(content)
65
-
66
- return parsed.success ? parsed.data : undefined
64
+ return json_value.parse_with(readFileSync(target, 'utf8'), schema)
67
65
  } catch {
68
66
  return undefined
69
67
  }
@@ -1,6 +1,6 @@
1
1
  import path from 'node:path'
2
2
 
3
- // One parent-directory walk, in one place (joshuafolkken/kit#3260). Five modules had each written
3
+ // One parent-directory walk, in one place. Five modules had each written
4
4
  // their own — the josh package-root lookup, the gate's project root, the effective-upstream version
5
5
  // read, the local-bin shim search and the progress-interval read — and they had drifted to three
6
6
  // different stop conditions. The walk stops at the filesystem root (where `dirname` answers itself)
@@ -5,7 +5,7 @@
5
5
  // and `epic-bundle-referenced.ts` each read one issue per reference and must not turn a rate limit
6
6
  // into a wrong answer. The reads were written as waves — slice, `Promise.all`, next slice — which
7
7
  // idles the whole batch behind its slowest member, so the three were neither the same code nor the
8
- // same behavior (joshuafolkken/kit#1144).
8
+ // same behavior.
9
9
  //
10
10
  // A worker pool instead: `limit` consumers pull from one queue, so a slot is refilled the moment its
11
11
  // task ends rather than when its neighbors do.
@@ -32,7 +32,7 @@ interface Pool<Item, Result> {
32
32
  // so the clamp passes it straight through and `Array.from({ length: NaN })` builds no consumer at all
33
33
  // — an empty result for a non-empty input, which is precisely what the paragraph above promises
34
34
  // cannot happen. A caller reading that promise is entitled not to validate first, so it is closed
35
- // here (joshuafolkken/kit#1144). A fractional limit is floored for the same reason: `Array.from`
35
+ // here. A fractional limit is floored for the same reason: `Array.from`
36
36
  // truncates it silently, and a width that is not the number asked for should be a decision rather
37
37
  // than a side effect.
38
38
  function pool_width(limit: number, total: number): number {
@@ -7,8 +7,7 @@ import { SUITE_TIMEOUT_MS } from './timeouts'
7
7
  // need the same three things: the output buffered until the child finishes (concurrent writers
8
8
  // otherwise interleave into an unreadable transcript), a non-zero exit reported rather than thrown
9
9
  // (so one failing check does not abort its siblings), and a bound on how long a child may hang.
10
- // They had the same code twice, which is how a fix to one of them missed the other
11
- // (joshuafolkken/kit#914).
10
+ // They had the same code twice, which is how a fix to one of them missed the other.
12
11
 
13
12
  const PNPM = 'pnpm'
14
13
  const FORCE_COLOR = '1'
@@ -21,13 +20,12 @@ interface BufferedProcessResult {
21
20
  exit_code: number | undefined
22
21
  // How long the child ran, in milliseconds. Measured here rather than at each call site because
23
22
  // this function owns the child's lifetime — a caller timing it from outside would have to repeat
24
- // the same two readings, and every fan-out caller would repeat them once per branch
25
- // (joshuafolkken/kit#1248).
23
+ // the same two readings, and every fan-out caller would repeat them once per branch.
26
24
  elapsed_ms: number
27
25
  }
28
26
 
29
- // The two things a caller outside the fan-out needs to vary, and the only two
30
- // (joshuafolkken/kit#1554). `lane:open` runs its install in the work tree it just created rather
27
+ // The two things a caller outside the fan-out needs to vary, and the only two.
28
+ // `lane:open` runs its install in the work tree it just created rather
31
29
  // than in the directory `josh` was typed in, and bounds it well under the fan-out's half hour
32
30
  // because an install that never answers has to end the command rather than hold a parallel run
33
31
  // open. Everything else — the buffering, the non-throwing exit, and the color policy that respects
File without changes
@@ -1,9 +1,19 @@
1
1
  import { parseArgs, type ParseArgsConfig, type ParseArgsOptionsConfig } from 'node:util'
2
2
 
3
3
  // Argument reading for the commands under `scripts/`.
4
- //
4
+
5
+ const HELP_FLAGS: ReadonlySet<string> = new Set(['--help', '-h'])
6
+
7
+ // The usage line `refuse_unknown_flags` ends with, for a command that prints it on its own help
8
+ // request (`josh release --help`).
9
+ function usage_line(known_flags: ReadonlyArray<string>, command: string): string {
10
+ if (known_flags.length === 0) return `Usage: josh ${command}`
11
+
12
+ return `Usage: josh ${command} [${known_flags.join('] [')}]`
13
+ }
14
+
5
15
  // Reject anything not on the list rather than ignoring it: a misspelled `--dryrun` that fell through
6
- // would run the real write path. `josh propagate` and `josh adopt` both write into working trees, so
16
+ // would run the real write path. `josh propagate`, `josh adopt` and `josh release` all write, so
7
17
  // the refusal is single-sourced here rather than described once per command (`CLAUDE.md` → "No
8
18
  // clones").
9
19
  function refuse_unknown_flags(
@@ -13,15 +23,36 @@ function refuse_unknown_flags(
13
23
  ): string | undefined {
14
24
  const unknown = argv.filter((argument) => !known_flags.includes(argument))
15
25
  if (unknown.length === 0) return undefined
16
- const usage = `Usage: josh ${command} [${known_flags.join('] [')}]`
17
26
 
18
- return `Unknown argument(s): ${unknown.join(' ')}\n${usage}`
27
+ return `Unknown argument(s): ${unknown.join(' ')}\n${usage_line(known_flags, command)}`
28
+ }
29
+
30
+ // The argument gate of a command that publishes (`josh release`, `josh release:github`): a help
31
+ // request prints the usage and exits 0, an unknown argument is refused with exit 1, both before any side effect. `undefined` means the
32
+ // arguments are all known and the command may run.
33
+ function answer_help_or_unknown(
34
+ argv: ReadonlyArray<string>,
35
+ known_flags: ReadonlyArray<string>,
36
+ command: string,
37
+ ): number | undefined {
38
+ if (argv.some((argument) => HELP_FLAGS.has(argument))) {
39
+ console.info(usage_line(known_flags, command))
40
+
41
+ return 0
42
+ }
43
+
44
+ const refusal = refuse_unknown_flags(argv, known_flags, command)
45
+ if (refusal === undefined) return undefined
46
+
47
+ console.error(refusal)
48
+
49
+ return 1
19
50
  }
20
51
 
21
52
  // `parseArgs`, answering `undefined` where it would throw — an unknown flag, a missing option value,
22
53
  // or a positional the config does not allow. Each caller turns that into its usage line and a failure
23
54
  // exit rather than a stack trace, on commands whose output a workflow reads; eleven of them had begun
24
- // to carry a copy of the same try/catch each (joshuafolkken/kit#2902), and this is the one copy.
55
+ // to carry a copy of the same try/catch each, and this is the one copy.
25
56
  function parse_or_undefined<T extends ParseArgsConfig>(
26
57
  config: T,
27
58
  ): ReturnType<typeof parseArgs<T>> | undefined {
@@ -34,7 +65,7 @@ function parse_or_undefined<T extends ParseArgsConfig>(
34
65
 
35
66
  // The two shapes every command reads `argv` in: flags alone, or flags beside positionals. Both are
36
67
  // strict, so an unknown flag is `undefined` rather than a silently ignored typo; the commands had each
37
- // carried a one-line wrapper spelling these out (joshuafolkken/kit#3072).
68
+ // carried a one-line wrapper spelling these out.
38
69
  type FlagsOnly<T extends ParseArgsOptionsConfig> = ReturnType<
39
70
  typeof parseArgs<{ args: Array<string>; options: T }>
40
71
  >
@@ -123,7 +154,9 @@ function attach_values(
123
154
 
124
155
  const cli_flags = {
125
156
  attach_values,
157
+ usage_line,
126
158
  refuse_unknown_flags,
159
+ answer_help_or_unknown,
127
160
  parse_or_undefined,
128
161
  values_of,
129
162
  arguments_of,
@@ -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