@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
@@ -4,13 +4,13 @@ import { gate_skip, type GateReuse } from './gate-skip'
4
4
  import type { GateTree } from './gate-tree'
5
5
 
6
6
  // What the two git hooks share when they decline to re-run a check `pnpm josh gate` already passed on
7
- // this tree (joshuafolkken/kit#1381).
7
+ // this tree.
8
8
  //
9
- // The pre-push hook got this behavior first (joshuafolkken/kit#1334) and the pre-commit type check is
9
+ // The pre-push hook got this behavior first and the pre-commit type check is
10
10
  // the second reader of the same record. Everything that is the same in both lives here rather than in
11
11
  // each of them: the escape hatch, the pre-filter in front of the record, and the one `git status`
12
12
  // reading both narrow themselves from. **The record comparison itself is not here either** — it is
13
- // `gate_skip.reusable_green_gate`, joshuafolkken/kit#1328's, so a hook cannot answer "is this tree
13
+ // `gate_skip.reusable_green_gate`, so a hook cannot answer "is this tree
14
14
  // still the recorded one" differently from the gate printing its answer beside it.
15
15
  //
16
16
  // **Every condition added here only ever narrows.** The gate's own three — the file map matches, the
@@ -19,7 +19,7 @@ import type { GateTree } from './gate-tree'
19
19
  // git operation is about to carry. Where the two can differ, the hook runs the check. Any reading that
20
20
  // could not be taken fails the same way: "we could not tell" must never resolve to "no need to check".
21
21
 
22
- // The `josh` targets that decline a check on the strength of this record (joshuafolkken/kit#1786).
22
+ // The `josh` targets that decline a check on the strength of this record.
23
23
  //
24
24
  // **It is declared beside the mechanism rather than beside the reader.** `josh layers` reports which
25
25
  // checks run in more than one layer, and two of the rows it prints are not the repetition they look
@@ -51,13 +51,13 @@ function is_force_requested(force_environment: string): boolean {
51
51
  // `undefined` rather than an empty list when the reading failed, so a caller cannot mistake "git said
52
52
  // nothing" for "git could not be asked". Every predicate below treats the two differently.
53
53
  //
54
- // **The observation ledger is dropped from the reading, and it is the one line that may be**
55
- // (joshuafolkken/kit#1756). Lines are appended throughout a run — a review's record lands after its
54
+ // **The observation ledger is dropped from the reading, and it is the one line that may be**.
55
+ // Lines are appended throughout a run — a review's record lands after its
56
56
  // gate — and every condition below reads a non-empty status as "this operation carries a tree no
57
57
  // check has read". Left in, one ledger line would send every commit and every push in the primary
58
58
  // checkout back to the full gate, which is the reuse this module exists to grant. **Dropping it is
59
59
  // sound because the ledger is no code any check runs**: `pnpm josh git` stages it with the run's
60
- // commit only after its grammar has been parsed (joshuafolkken/kit#2763), and the rest of its content
60
+ // commit only after its grammar has been parsed, and the rest of its content
61
61
  // is checked by the CI of the pull request that carries it.
62
62
  async function read_status_lines(): Promise<ReadonlyArray<string> | undefined> {
63
63
  try {
@@ -93,7 +93,7 @@ interface HookReuse {
93
93
  // The hook-specific narrowing: whether what this git operation carries is the tree the record
94
94
  // describes. `is_worktree_clean` for a push, `is_index_matching_worktree` for a commit.
95
95
  is_tree_carried: boolean
96
- // The reason a refusal on that narrowing reports, in the hook's own words (joshuafolkken/kit#3307).
96
+ // The reason a refusal on that narrowing reports, in the hook's own words.
97
97
  carry_miss: string
98
98
  extra_arguments: ReadonlyArray<string>
99
99
  force_env: string
@@ -105,7 +105,7 @@ interface HookReuse {
105
105
 
106
106
  // The stamp rather than a boolean, for the same reason `gate_skip.gate_reuse` hands one back: the
107
107
  // caller prints `taken_at`, and a record that does not describe this tree has no timestamp worth
108
- // printing. A refusal carries its reason instead (joshuafolkken/kit#3307).
108
+ // printing. A refusal carries its reason instead.
109
109
  //
110
110
  // **Any argument at all refuses the reuse**, not only the force flag. A caller who narrowed the run
111
111
  // asked for that run rather than for a recorded result about a whole tree, and a hook's own line passes
@@ -0,0 +1,313 @@
1
+ import { readFile } from 'node:fs/promises'
2
+ import { availableParallelism, cpus, totalmem } from 'node:os'
3
+ import { PROBE_TIMEOUT_MS } from '#scripts/lib/timeouts'
4
+ import { execa } from 'execa'
5
+
6
+ // What the machine has free right now, read for the core budget's admission.
7
+ //
8
+ // **The budget used to be the core count, and that count is not what is free.** The ledger in
9
+ // `core-budget.ts` admits against `availableParallelism()`, so the load it never sees — Claude sessions,
10
+ // node processes that do not pass through `josh`, the window server — ran on top of a budget already
11
+ // spent. On 2026-10-07, three lanes on the 11-core / 18 GB machine reached a load average of 16.8 with
12
+ // 31% of the CPU in the kernel, compressing and swapping 4.4 GB of memory the ledger never counted.
13
+ //
14
+ // **This is a closed loop, not an open-loop formula.** An open loop would derive a share from the
15
+ // core count up front; this reads what is busy and free at the moment of
16
+ // admission and subtracts only the part the ledger does not already account for.
17
+ //
18
+ // **The busy cores are the CPU-time difference over a short window, not the load average.** The load
19
+ // average trails by a minute, so a gate started just after another one finished would see the finished
20
+ // one's load as external and wait out the decay. `os.cpus()` is one read with no process spawned.
21
+ //
22
+ // **A reading that fails answers undefined, and undefined is the old behavior.** A CI runner or a
23
+ // container — where the host's CPU times are not this process's quota — budgets by the core count and
24
+ // admits without looking at memory, exactly as before.
25
+ //
26
+ // **`run:board` draws its machine gauges from the same reading**, so what the
27
+ // board shows a person is what the gate admits against. The board takes a sample with no window and
28
+ // draws the difference from its previous one. `lane:sample` records the memory half of it, so the
29
+ // lane-limit measurement sets the same figures beside the lane count.
30
+
31
+ // The window the busy cores are measured over: long enough that one scheduler tick does not dominate it,
32
+ // short enough that a solo admission is not visibly delayed.
33
+ const SAMPLE_WINDOW_MS = 250
34
+ // **The background a developer machine always carries, which the gate's weights were measured beside.**
35
+ // On 2026-10-07 the 11-core machine idled at about 1.5 cores outside `josh` — Claude sessions 0.55, the
36
+ // window server 0.47, a browser 0.5. The solo gate's weights sum to exactly the core count and were
37
+ // measured with that load present, so only what exceeds it is load the budget must give way to;
38
+ // counting the baseline would defer a solo gate's unit suite on every run.
39
+ const BASELINE_CORES = 2
40
+ const BYTES_PER_MB = 1_048_576
41
+ const KB_PER_MB = 1024
42
+ const PERCENT = 100
43
+ const MEMINFO_PATH = '/proc/meminfo'
44
+ const VMSTAT_PATH = '/proc/vmstat'
45
+ const LINUX_AVAILABLE = /^MemAvailable:\s+(?<kb>\d+) kB/mu
46
+ const LINUX_SWAP_IN = /^pswpin (?<pages>\d+)$/mu
47
+ const LINUX_SWAP_OUT = /^pswpout (?<pages>\d+)$/mu
48
+ const PAGE_SIZE_ARGUMENTS = ['PAGESIZE']
49
+ // The whole memory reading in one `sysctl`, cheap enough for `run:board` to take
50
+ // every second. `kern.memorystatus_level` is the kernel's own memory-pressure figure: the percentage of
51
+ // memory still available, compressible and purgeable pages included — what `os.freemem()` leaves out on
52
+ // macOS, where it reads near zero on a machine with gigabytes to spare. The swapper counters are the
53
+ // pages swapped in and out since boot, `vm_stat`'s `Swapins` / `Swapouts`. The names stay in the output
54
+ // (no `-n`), so a name an older macOS lacks drops only its own line.
55
+ const LEVEL_NAME = 'kern.memorystatus_level'
56
+ const SWAP_IN_NAME = 'vm.compressor.swapper.swapins_total'
57
+ const SWAP_OUT_NAME = 'vm.compressor.swapper.swapouts_total'
58
+ const PAGE_SIZE_NAME = 'hw.pagesize'
59
+ // The kernel's memory-pressure verdict — 1 normal, 2 warning, 4 critical — the one Activity Monitor
60
+ // colors its "memory pressure" graph by.
61
+ const PRESSURE_NAME = 'kern.memorystatus_vm_pressure_level'
62
+ const SYSCTL_ARGUMENTS = [LEVEL_NAME, SWAP_IN_NAME, SWAP_OUT_NAME, PAGE_SIZE_NAME, PRESSURE_NAME]
63
+ const SYSCTL_LINE = /^(?<name>[\w.]+): (?<value>\d+)$/gmu
64
+
65
+ interface MachineReading {
66
+ busy_cores: number | undefined
67
+ available_mb: number | undefined
68
+ }
69
+
70
+ // The memory half of a reading. `swapped_mb` is a counter — every page swapped in or out since boot —
71
+ // so a rate is the difference between two readings. `pressure_level` is read on macOS only.
72
+ interface MemoryReading {
73
+ available_mb: number | undefined
74
+ swapped_mb: number | undefined
75
+ pressure_level: number | undefined
76
+ }
77
+
78
+ // What the ledger's admitted reservations declare — the part of the machine's load already accounted for.
79
+ interface LedgerLoad {
80
+ cores: number
81
+ memory_mb: number
82
+ }
83
+
84
+ interface MachineBudget {
85
+ cores: number
86
+ memory_mb: number
87
+ }
88
+
89
+ interface CpuTimes {
90
+ busy: number
91
+ total: number
92
+ }
93
+
94
+ // One moment of the machine for `run:board`: CPU times and the memory reading, no window waited out.
95
+ interface MachineSample {
96
+ cpu: CpuTimes
97
+ memory: MemoryReading
98
+ total_mb: number
99
+ }
100
+
101
+ function cpu_times(): CpuTimes {
102
+ let busy = 0
103
+ let idle = 0
104
+
105
+ for (const { times } of cpus()) {
106
+ busy += times.user + times.nice + times.sys + times.irq
107
+ idle += times.idle
108
+ }
109
+
110
+ return { busy, total: busy + idle }
111
+ }
112
+
113
+ // The busy share of the CPU between two readings, from 0 to 1.
114
+ function busy_share_between(before: CpuTimes, after: CpuTimes): number | undefined {
115
+ const total = after.total - before.total
116
+
117
+ if (total <= 0) return undefined
118
+
119
+ return (after.busy - before.busy) / total
120
+ }
121
+
122
+ function busy_cores_between(before: CpuTimes, after: CpuTimes, cores: number): number | undefined {
123
+ const share = busy_share_between(before, after)
124
+
125
+ return share === undefined ? undefined : share * cores
126
+ }
127
+
128
+ function sysctl_values(output: string): Map<string, number> {
129
+ const values = [...output.matchAll(SYSCTL_LINE)].map(
130
+ (match) => [match.groups?.['name'] ?? '', Number(match.groups?.['value'])] as const,
131
+ )
132
+
133
+ return new Map(values)
134
+ }
135
+
136
+ // The pages swapped in and out since boot; either count unread leaves the sum unread.
137
+ function swapped_pages(
138
+ pages_in: number | undefined,
139
+ pages_out: number | undefined,
140
+ ): number | undefined {
141
+ return pages_in === undefined || pages_out === undefined ? undefined : pages_in + pages_out
142
+ }
143
+
144
+ function swapped_mb(pages: number | undefined, page_bytes: number | undefined): number | undefined {
145
+ if (pages === undefined || page_bytes === undefined) return undefined
146
+
147
+ return (pages * page_bytes) / BYTES_PER_MB
148
+ }
149
+
150
+ // What was swapped between two readings of the counter. A counter that went back — a reboot between
151
+ // them — is read as nothing swapped.
152
+ function swapped_between(from: number | undefined, to: number | undefined): number | undefined {
153
+ if (from === undefined || to === undefined) return undefined
154
+
155
+ return Math.max(0, to - from)
156
+ }
157
+
158
+ // `kern.memorystatus_level: 58` → 58% of physical memory still available, beside the swapped pages.
159
+ function parse_darwin_memory(output: string, total_bytes: number): MemoryReading {
160
+ const values = sysctl_values(output)
161
+ const level = values.get(LEVEL_NAME)
162
+
163
+ return {
164
+ available_mb:
165
+ level === undefined ? undefined : (level / PERCENT) * (total_bytes / BYTES_PER_MB),
166
+ swapped_mb: swapped_mb(
167
+ swapped_pages(values.get(SWAP_IN_NAME), values.get(SWAP_OUT_NAME)),
168
+ values.get(PAGE_SIZE_NAME),
169
+ ),
170
+ pressure_level: values.get(PRESSURE_NAME),
171
+ }
172
+ }
173
+
174
+ function parse_linux_available(meminfo: string): number | undefined {
175
+ const kb = LINUX_AVAILABLE.exec(meminfo)?.groups?.['kb']
176
+
177
+ return kb === undefined ? undefined : Number(kb) / KB_PER_MB
178
+ }
179
+
180
+ function pages_of(pattern: RegExp, vmstat: string): number | undefined {
181
+ const pages = pattern.exec(vmstat)?.groups?.['pages']
182
+
183
+ return pages === undefined ? undefined : Number(pages)
184
+ }
185
+
186
+ // `pswpin` and `pswpout` in `/proc/vmstat` are the pages swapped in and out since boot.
187
+ function parse_linux_swapped(vmstat: string, page_bytes: number): number | undefined {
188
+ const pages = swapped_pages(pages_of(LINUX_SWAP_IN, vmstat), pages_of(LINUX_SWAP_OUT, vmstat))
189
+
190
+ return swapped_mb(pages, page_bytes)
191
+ }
192
+
193
+ async function settled<T>(read: () => Promise<T>): Promise<T | undefined> {
194
+ try {
195
+ return await read()
196
+ } catch {
197
+ return undefined
198
+ }
199
+ }
200
+
201
+ // A name `sysctl` does not know fails the command but still prints the others, so the exit is not read.
202
+ async function read_darwin_memory(): Promise<MemoryReading> {
203
+ const { stdout } = await execa('sysctl', SYSCTL_ARGUMENTS, {
204
+ reject: false,
205
+ timeout: PROBE_TIMEOUT_MS,
206
+ })
207
+
208
+ return parse_darwin_memory(stdout, totalmem())
209
+ }
210
+
211
+ async function read_page_size(): Promise<string> {
212
+ const { stdout } = await execa('getconf', PAGE_SIZE_ARGUMENTS, { timeout: PROBE_TIMEOUT_MS })
213
+
214
+ return stdout
215
+ }
216
+
217
+ async function read_linux_memory(): Promise<MemoryReading> {
218
+ const [meminfo, vmstat, page_size] = await Promise.all([
219
+ settled(async () => await readFile(MEMINFO_PATH, 'utf8')),
220
+ settled(async () => await readFile(VMSTAT_PATH, 'utf8')),
221
+ settled(read_page_size),
222
+ ])
223
+ const page_bytes = page_size === undefined ? undefined : Number(page_size)
224
+
225
+ return {
226
+ available_mb: meminfo === undefined ? undefined : parse_linux_available(meminfo),
227
+ swapped_mb:
228
+ vmstat === undefined || page_bytes === undefined
229
+ ? undefined
230
+ : parse_linux_swapped(vmstat, page_bytes),
231
+ pressure_level: undefined,
232
+ }
233
+ }
234
+
235
+ const UNREAD_MEMORY: MemoryReading = {
236
+ available_mb: undefined,
237
+ swapped_mb: undefined,
238
+ pressure_level: undefined,
239
+ }
240
+
241
+ async function read_memory(): Promise<MemoryReading> {
242
+ if (process.platform === 'darwin') return (await settled(read_darwin_memory)) ?? UNREAD_MEMORY
243
+
244
+ return process.platform === 'linux' ? await read_linux_memory() : UNREAD_MEMORY
245
+ }
246
+
247
+ // A CPU quota narrower than the host makes the host-wide CPU times the wrong machine, so the busy cores
248
+ // are read only where the quota and the host agree.
249
+ function is_unquoted(): boolean {
250
+ return cpus().length > 0 && cpus().length === availableParallelism()
251
+ }
252
+
253
+ async function default_sleep(ms: number): Promise<void> {
254
+ await new Promise<void>((resolve) => {
255
+ setTimeout(resolve, ms)
256
+ })
257
+ }
258
+
259
+ async function read_machine(
260
+ sleep: (ms: number) => Promise<void> = default_sleep,
261
+ ): Promise<MachineReading> {
262
+ const before = cpu_times()
263
+ const [memory] = await Promise.all([read_memory(), sleep(SAMPLE_WINDOW_MS)])
264
+ const busy_cores = is_unquoted()
265
+ ? busy_cores_between(before, cpu_times(), cpus().length)
266
+ : undefined
267
+
268
+ return { busy_cores, available_mb: memory.available_mb }
269
+ }
270
+
271
+ async function read_sample(): Promise<MachineSample> {
272
+ return { cpu: cpu_times(), memory: await read_memory(), total_mb: totalmem() / BYTES_PER_MB }
273
+ }
274
+
275
+ // The busy cores the ledger does not account for, beyond the baseline the weights were measured beside,
276
+ // in whole cores — the budget is in whole cores, and a fraction of a core is not a core to give up.
277
+ function external_cores(busy_cores: number | undefined, ledger_cores: number): number {
278
+ if (busy_cores === undefined) return 0
279
+
280
+ return Math.floor(Math.max(0, busy_cores - ledger_cores - BASELINE_CORES))
281
+ }
282
+
283
+ // **The budget the ledger admits against: what is free plus what the ledger itself already holds.**
284
+ // The admitted reservations' load is inside the reading, and the admission walk counts their declared
285
+ // weight again, so it is added back — what is subtracted is only the load from outside the ledger. The
286
+ // caller passes every admitted claim's cores but only the memory of claims past
287
+ // `core_admission.RAMP_UP_MS`, whose tools have had time to allocate.
288
+ // Memory that could not be read is no limit at all, the behavior before memory was read.
289
+ function machine_budget(cores: number, reading: MachineReading, ledger: LedgerLoad): MachineBudget {
290
+ return {
291
+ cores: cores - external_cores(reading.busy_cores, ledger.cores),
292
+ memory_mb:
293
+ reading.available_mb === undefined ? Infinity : reading.available_mb + ledger.memory_mb,
294
+ }
295
+ }
296
+
297
+ const machine_capacity = {
298
+ BASELINE_CORES,
299
+ busy_cores_between,
300
+ busy_share_between,
301
+ external_cores,
302
+ machine_budget,
303
+ parse_darwin_memory,
304
+ parse_linux_available,
305
+ parse_linux_swapped,
306
+ read_machine,
307
+ read_memory,
308
+ read_sample,
309
+ swapped_between,
310
+ }
311
+
312
+ export type { CpuTimes, LedgerLoad, MachineBudget, MachineReading, MachineSample, MemoryReading }
313
+ export { machine_capacity }
@@ -9,7 +9,7 @@ import { hook_gate_reuse } from './hook-gate-reuse'
9
9
  import { DEFAULT_TYPE_CHECK_ARGS, type_check_step } from './type-check-step'
10
10
 
11
11
  // The pre-commit hook's type check, which no longer re-runs a project-wide `tsc --noEmit` that a green
12
- // gate already covers (joshuafolkken/kit#1381).
12
+ // gate already covers.
13
13
  //
14
14
  // Measured on this repository: `pnpm exec tsc --noEmit` over the whole project takes 3.8–4.4s warm, and
15
15
  // `pnpm josh git -y` pays it on every commit — a `fullrun` commits twice — seconds after `pnpm josh
@@ -22,8 +22,8 @@ import { DEFAULT_TYPE_CHECK_ARGS, type_check_step } from './type-check-step'
22
22
  // recorded wide one. So they are untouched, and so are `prevent-main-commit` and `secretlint`, which
23
23
  // the gate does not run at all and which are therefore duplicates of nothing.
24
24
  //
25
- // **The decision is joshuafolkken/kit#1328's, imported rather than restated** — `hook_gate_reuse`
26
- // carries what this shares with the pre-push hook (joshuafolkken/kit#1334) and defers the record
25
+ // **The decision is the gate's, imported rather than restated** — `hook_gate_reuse`
26
+ // carries what this shares with the pre-push hook and defers the record
27
27
  // comparison itself to `gate_skip.reusable_green_gate`. A hook answering "is this still the recorded
28
28
  // tree" differently from the gate beside it would be two commands disagreeing about one tree.
29
29
  //
@@ -54,7 +54,7 @@ interface CommitTree extends GateTree {
54
54
  }
55
55
 
56
56
  // **The record says the gate's four checks were green; it does not say *which* type check ran.**
57
- // `type-check-step.ts` resolves that per project (joshuafolkken/kit#934): a project carrying a
57
+ // `type-check-step.ts` resolves that per project: a project carrying a
58
58
  // `josh-app` / `josh-game` shim has the toolkit's `check:ci` as its gate step, and this hook's step is
59
59
  // `tsc --noEmit`. Reusing across that difference would skip `tsc --noEmit` on the strength of a
60
60
  // different check — a `.ts` file inside the root `tsconfig.json` but outside the one `svelte-check` is
@@ -1,6 +1,7 @@
1
1
  import { existsSync, globSync, readFileSync } from 'node:fs'
2
2
  import path from 'node:path'
3
3
  import { find_local_bin_upwards } from '#scripts/build/local-bin'
4
+ import { doctor_consumer } from '#scripts/doctor/doctor-consumer'
4
5
  import { project_profile } from '#scripts/init/project-profile'
5
6
  import { ancestor_directories } from '#scripts/lib/ancestor-directories'
6
7
  import { json_value } from '#scripts/lib/json-value'
@@ -51,6 +52,12 @@ function project_root(directory: string): string {
51
52
  )
52
53
  }
53
54
 
55
+ // The kit repository itself rather than a consumer of it — the gate's and the detached ship's one
56
+ // answer to whether kit-only checks run.
57
+ function is_kit_repository(directory: string): boolean {
58
+ return !doctor_consumer.is_kit_consumer(project_root(directory))
59
+ }
60
+
54
61
  function is_ignored(entry: string): boolean {
55
62
  return entry.split(/[/\\]/u).some((part) => IGNORED_DIRS.has(part))
56
63
  }
@@ -106,7 +113,7 @@ function is_declared(directory: string, package_name: string): boolean {
106
113
  }
107
114
 
108
115
  // A tool the manifest lists but `node_modules` lacks is a project that has not run `pnpm install`
109
- // yet — typically right after `josh init` added it (joshuafolkken/kit#2709). Skipping it would pass a
116
+ // yet — typically right after `josh init` added it. Skipping it would pass a
110
117
  // check the configuration asks for without running it, so only an undeclared tool is skipped; a
111
118
  // declared one is run and fails until it is installed.
112
119
  function missing_tool_reason(
@@ -124,7 +131,7 @@ function skip_notice(check: string, reason: string): string {
124
131
  }
125
132
 
126
133
  // Shared by `josh check` and the gate's type-check step, so neither reaches `tsc` on a basic
127
- // project that has nothing to type-check (joshuafolkken/kit#2709).
134
+ // project that has nothing to type-check.
128
135
  function type_check_skip_reason(directory: string): string | undefined {
129
136
  if (!is_basic(directory)) return undefined
130
137
  if (!has_files(directory, TYPE_FILES)) return 'no TypeScript files were found'
@@ -135,7 +142,7 @@ function type_check_skip_reason(directory: string): string | undefined {
135
142
 
136
143
  // Shared by `josh lint`, `josh lint:related` and `josh format`, so a basic project without Web
137
144
  // files — a Python or Rust project, which `josh init` gives no Prettier — is skipped for the same
138
- // reason by all three (joshuafolkken/kit#2606, joshuafolkken/kit#2709).
145
+ // reason by all three.
139
146
  function prettier_skip_reason(directory: string): string | undefined {
140
147
  if (!is_basic(directory)) return undefined
141
148
  if (!has_files(directory, WEB_FILES)) return 'no HTML, CSS or JavaScript files were found'
@@ -144,7 +151,7 @@ function prettier_skip_reason(directory: string): string | undefined {
144
151
  }
145
152
 
146
153
  // Shared by `josh lint`, `josh lint:related` and `josh format`, so a basic project without ESLint
147
- // is skipped for the same reason by all three (joshuafolkken/kit#2693, joshuafolkken/kit#2709).
154
+ // is skipped for the same reason by all three.
148
155
  function eslint_skip_reason(directory: string): string | undefined {
149
156
  if (!is_basic(directory)) return undefined
150
157
  if (!has_files(directory, SCRIPT_FILES)) return 'no JavaScript or TypeScript files were found'
@@ -163,6 +170,7 @@ const project_checks = {
163
170
  has_config,
164
171
  has_files,
165
172
  is_basic,
173
+ is_kit_repository,
166
174
  prettier_skip_reason,
167
175
  project_root,
168
176
  skip_notice,
@@ -6,22 +6,16 @@ import { test_unit_guard } from '#scripts/test/test-unit-guard'
6
6
  import { gate_tree, type GateTree } from './gate-tree'
7
7
 
8
8
  // Whether the two scoped checks have been green on *this exact tree* by the time the review is
9
- // briefed (joshuafolkken/kit#1511).
9
+ // briefed.
10
10
  //
11
- // **The commands were already shipped; what was missing was when they run.** joshuafolkken/kit#1298
12
- // and joshuafolkken/kit#1257 gave the run `lint:related` and `test:related`, and
13
- // joshuafolkken/kit#1383 and joshuafolkken/kit#1246 stopped it re-running the whole gate per edit.
14
- // None of them says the pair has to have answered before the review starts, and `fullrun #1503` is
15
- // what that costs: the gate and round 1 were started on a tree neither check had ever read, three
16
- // findings then arrived on three separate round trips with fourteen edits between them, and the
17
- // rework ran 282 seconds — 31% of a 905-second run. The same run proves the cheap half: the one call
18
- // that ran both checks together took 13.8 seconds and produced two of the three findings at once.
11
+ // **It fixes when `lint:related` and `test:related` run.** A gate and a review round started on a
12
+ // tree neither check has read return their findings one round trip at a time; one call running both
13
+ // checks first returns most of them at once.
19
14
  //
20
15
  // **It fixes when the checks run, never whether they run, and never what they check.** Nothing here
21
16
  // skips a check, narrows one, or reinterprets its output — a green record buys ordering and nothing
22
- // else, and `josh gate` still runs its four checks exactly as before. That is the boundary
23
- // joshuafolkken/kit#1420 sits on the far side of: that issue asked to *reuse* a scoped check's result
24
- // instead of re-running it and was closed as not needed, and this record does not revive it.
17
+ // else, and `josh gate` still runs its four checks exactly as before. It never *reuses* a scoped
18
+ // check's result in place of re-running it.
25
19
  //
26
20
  // **The judgement is the gate's own, not a second one.** "There is a record and nothing it covers has
27
21
  // moved" is `review_brief.matching_stamp` plus the base equality `gate_skip.reusable_green_gate`
@@ -29,8 +23,8 @@ import { gate_tree, type GateTree } from './gate-tree'
29
23
  // definition of "this tree is unchanged" is the clone `CLAUDE.md` prohibits, and it is exactly where
30
24
  // two commands would start disagreeing about one working tree.
31
25
  //
32
- // **It refuses `josh review:brief`, and now the local `josh gate` too, but never CI's**
33
- // (joshuafolkken/kit#2296). The brief was the first refusal point because it is where `review:attest`
26
+ // **It refuses `josh review:brief`, and now the local `josh gate` too, but never CI's**.
27
+ // The brief was the first refusal point because it is where `review:attest`
34
28
  // mints the nonce a round is counted against, so no countable review round bypasses it. But the gate
35
29
  // itself runs *before* the brief, and a run that reached it on a tree the scoped pair had never read
36
30
  // paid for the gap anyway — so `verification-gate.ts` reads this same record one step earlier and
@@ -69,7 +63,7 @@ interface ScopedSources {
69
63
  is_unit_skipped?: boolean
70
64
  }
71
65
 
72
- // **`test:related` is required only where it can ever answer** (joshuafolkken/kit#3136). In a project
66
+ // **`test:related` is required only where it can ever answer**. In a project
73
67
  // whose unit guard skips — vitest absent, or a basic project with no test file — `test:related` runs
74
68
  // nothing and so writes no record, and requiring one refused the gate forever with no way through.
75
69
  // The guard's own decision is asked rather than re-derived, so the writer and this reader agree; a
@@ -142,7 +136,7 @@ function missing_checks(
142
136
  }
143
137
 
144
138
  // The same answer as `missing_checks`, as the `josh` script names a caller runs rather than the
145
- // command lines a refusal prints — so the ship supervisor (joshuafolkken/kit#2500) meets the
139
+ // command lines a refusal prints — so the ship supervisor meets the
146
140
  // precondition itself by running exactly what the refusal would have asked for.
147
141
  function missing_scripts(
148
142
  tree: Record<string, string>,
@@ -230,8 +224,7 @@ interface GreenRecord {
230
224
  // Where the record lands, defaulted by the stamp itself. It exists for the same reason
231
225
  // `record_green` and `gate_skip.reusable_green_gate` take one: without it this function can only
232
226
  // write the real per-checkout record, so a suite exercising it would vouch for the surrounding
233
- // run's own tree — the second-writer trap joshuafolkken/kit#1437 and joshuafolkken/kit#1441
234
- // closed for the gate and round-1 records.
227
+ // run's own tree — the second-writer trap the gate and round-1 records close the same way.
235
228
  target?: string
236
229
  }
237
230
 
@@ -6,8 +6,8 @@ import { project_checks } from './project-checks'
6
6
 
7
7
  // `josh check` — the project-wide TypeScript check. It used to be a bare `tsc --noEmit` shell entry,
8
8
  // so on a basic project with nothing to type-check it failed with `Command "tsc" not found` while
9
- // the gate, which asks `type_check_skip_reason` first, skipped the same step
10
- // (joshuafolkken/kit#2709). Both now read that one decision.
9
+ // the gate, which asks `type_check_skip_reason` first, skipped the same step.
10
+ // Both now read that one decision.
11
11
 
12
12
  const ARGV_OFFSET = 2
13
13
  const FAIL_EXIT_CODE = 1
@@ -2,10 +2,10 @@ import { find_local_bin_upwards } from '#scripts/build/local-bin'
2
2
  import { COMMAND_TIMEOUT_MS } from '#scripts/lib/timeouts'
3
3
  import { execa } from 'execa'
4
4
 
5
- // joshuafolkken/kit#934: `josh gate`'s type-check step used to be `tsc --noEmit` for every project.
6
- // A SvelteKit project type-checks with `svelte-check` behind `svelte-kit sync`, so the fixed step
7
- // both missed every `.svelte` type error and failed outright on a clean checkout, where `./$types`
8
- // has not been generated yet.
5
+ // `josh gate`'s type-check step cannot be `tsc --noEmit` for every project. A SvelteKit project
6
+ // type-checks with `svelte-check` behind `svelte-kit sync`, so a fixed `tsc` step would both miss
7
+ // every `.svelte` type error and fail outright on a clean checkout, where `./$types` has not been
8
+ // generated yet.
9
9
  //
10
10
  // The step is therefore asked of the application layer rather than assumed. Two rules decide it:
11
11
  //