@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
@@ -2,8 +2,8 @@ import { readFileSync, statSync } from 'node:fs'
2
2
  import path from 'node:path'
3
3
 
4
4
  // A body — an Issue comment, a PR comment, a notification message — handed to a command as an inline
5
- // double-quoted shell argument is **evaluated by the shell before the command ever sees it**
6
- // (joshuafolkken/kit#1198). The observed damage is not a mangled string: a PR comment posted with
5
+ // double-quoted shell argument is **evaluated by the shell before the command ever sees it**.
6
+ // The observed damage is not a mangled string: a PR comment posted with
7
7
  // `gh api … -f body="… \`pnpm josh ms\` …"` had part of its own text run as git commands, which
8
8
  // switched a lane's work tree onto `main` and stopped the run.
9
9
  //
@@ -1,6 +1,6 @@
1
1
  // A single-token "did you mean" for `josh <typo>`. The command set is small and the input is one
2
2
  // word, so a character edit distance is the right measure here — unlike `issue-scout`'s token-set
3
- // Dice similarity, which compares multi-word issue titles (joshuafolkken/kit#1928).
3
+ // Dice similarity, which compares multi-word issue titles.
4
4
  const MAX_SUGGESTION_DISTANCE = 3
5
5
 
6
6
  // A cell of the matrix, defaulting the out-of-range read to 0. Reading through it keeps the nullish
@@ -1,8 +1,7 @@
1
1
  import { process_identity } from './process-identity'
2
2
  import { stamp_file } from './stamp-file'
3
3
 
4
- // A stamp whose payload is "when this was taken, and the digest of every file it covers"
5
- // (joshuafolkken/kit#1241).
4
+ // A stamp whose payload is "when this was taken, and the digest of every file it covers".
6
5
  //
7
6
  // `scripts/eval/eval-stamp.ts` was the only holder of this shape. `josh review:brief` needs two more
8
7
  // records of exactly the same kind — the gate's result, and the snapshot round 1 takes so round 2
@@ -18,10 +17,10 @@ interface FileMapStamp {
18
17
  taken_at: string
19
18
  files: Record<string, string>
20
19
  // The process that wrote it. Only a record whose meaning is "this is happening **now**" needs it —
21
- // the in-flight gate marker (joshuafolkken/kit#1242). The other two assert a completed past fact,
20
+ // the in-flight gate marker. The other two assert a completed past fact,
22
21
  // which stays true however long the file sits there, so they carry it and never read it.
23
22
  pid?: number
24
- // The other half of that process's identity: when it started (joshuafolkken/kit#1245). **A pid
23
+ // The other half of that process's identity: when it started. **A pid
25
24
  // alone names whatever holds that number now**, so a marker left behind by a killed gate began
26
25
  // reading as live again the moment the operating system reissued its pid — the brief then reporting
27
26
  // a gate running on this tree about a gate that no longer exists. The pair separates them, because
@@ -30,19 +29,19 @@ interface FileMapStamp {
30
29
  // the field existed carries none, which `process_identity.is_same_process` answers as "cannot tell"
31
30
  // rather than as a match.
32
31
  process_start?: string
33
- // The commit the file map is defined against (joshuafolkken/kit#1328). Every reader of these
32
+ // The commit the file map is defined against. Every reader of these
34
33
  // records computes its map as a diff against that commit — the branch's merge base with the
35
- // default branch since joshuafolkken/kit#1527 — so **the map alone does not describe a tree**:
34
+ // default branch — so **the map alone does not describe a tree**:
36
35
  // fetch an advanced default branch and rebase onto it, and every digest can stay identical while
37
36
  // the rest of the working tree is replaced by code no check has read. The rebase moves `HEAD` and
38
37
  // so moves the merge base, which is what this field catches; another lane merging into the shared
39
38
  // default branch moves neither, and correctly leaves the record standing. Every reader that acts on
40
39
  // a record rather than merely reporting it needs the guarantee: `josh gate`, which reuses a green
41
- // result instead of re-running it, and since joshuafolkken/kit#1537 the round-1 review snapshot,
40
+ // result instead of re-running it, and the round-1 review snapshot,
42
41
  // whose whole use is to name what round 1's fixes changed. A record written without it is refused
43
42
  // rather than trusted.
44
43
  base?: string
45
- // When the run that wrote this record reached its verdict (joshuafolkken/kit#1164). Written only
44
+ // When the run that wrote this record reached its verdict. Written only
46
45
  // by `complete`, so it is absent on a record whose run was interrupted or threw — which is the
47
46
  // whole difference between "a run measured this tree" and "a run measured this tree and
48
47
  // finished". Only a reader that acts on the *verdict* needs the second, so `josh eval` writes and
@@ -61,7 +60,7 @@ function is_file_map(value: unknown): value is Record<string, string> {
61
60
  }
62
61
 
63
62
  // An optional field of the wrong type is dropped rather than rejected: the records that never read
64
- // one were written without it before joshuafolkken/kit#1242 and joshuafolkken/kit#1328, and every
63
+ // one were written without it, and every
65
64
  // reader treats an absent field as the safe answer — "not running" for a `pid`, "cannot be reused"
66
65
  // for a `base`. Spread rather than assigned, because `exactOptionalPropertyTypes` makes an explicit
67
66
  // `undefined` a different thing from an absent key.
@@ -89,7 +88,7 @@ function parse_stamp(raw: string): FileMapStamp | undefined {
89
88
  return { taken_at, files, ...optional_fields(pid, base, completed_at, process_start) }
90
89
  }
91
90
 
92
- // Whether the process that wrote this record is still running (joshuafolkken/kit#1245). It takes the
91
+ // Whether the process that wrote this record is still running. It takes the
93
92
  // whole record rather than a pid, because a pid on its own is not a process: asked that way a caller
94
93
  // could not tell the writing process from whatever the operating system later reissued its number to,
95
94
  // which is exactly the state the in-flight marker must never describe.
@@ -112,14 +111,13 @@ function is_writer_running(stamp: FileMapStamp | undefined): boolean {
112
111
 
113
112
  // **For a guard: only when certain of the opposite.** `josh bench` deletes caches a running gate is
114
113
  // reading, so the question it must ask is not "is the writer running" but "am I sure it is gone" — an
115
- // uncertain answer there would clear the caches out from under a live gate, which is the very event
116
- // joshuafolkken/kit#1332 was filed for. The probe is a subprocess and can fail on a loaded machine,
114
+ // uncertain answer there would clear the caches out from under a live gate. The probe is a subprocess and can fail on a loaded machine,
117
115
  // which is exactly the machine a gate makes, so this is not a theoretical branch.
118
116
  function is_writer_gone(stamp: FileMapStamp | undefined): boolean {
119
117
  return writer_state(stamp) === false
120
118
  }
121
119
 
122
- // Whether a record may be compared against a map read now (joshuafolkken/kit#1537). Every map here is
120
+ // Whether a record may be compared against a map read now. Every map here is
123
121
  // a diff against `change_base`, so two of them taken against **different** bases do not cover the same
124
122
  // set of paths — and `changed_since` below reports that set difference as though the files had been
125
123
  // edited. Measured on the resumed runs of #1080 / #1085 / #1147 / #1197: a merge of the default branch
@@ -142,7 +140,7 @@ function describes_base(stamp: FileMapStamp, base: string | undefined): boolean
142
140
  //
143
141
  // **It says nothing about two maps read against different bases.** It takes the union of the key
144
142
  // sets, so a path only one of them covers is reported as changed — a set difference, not an edit.
145
- // Callers guard that with `describes_base` above (joshuafolkken/kit#1537).
143
+ // Callers guard that with `describes_base` above.
146
144
  function changed_since(stamp: FileMapStamp, tree: Record<string, string>): ReadonlyArray<string> {
147
145
  const names = new Set([...Object.keys(stamp.files), ...Object.keys(tree)])
148
146
 
@@ -153,17 +151,17 @@ function changed_since(stamp: FileMapStamp, tree: Record<string, string>): Reado
153
151
 
154
152
  interface FileMapStampAccess {
155
153
  stamp_path: () => string
156
- // `base` is written by the one record that is acted on rather than merely reported —
157
- // joshuafolkken/kit#1328's green-gate reuse. The others omit it and are unaffected.
154
+ // `base` is written by the one record that is acted on rather than merely reported — the
155
+ // green-gate reuse. The others omit it and are unaffected.
158
156
  write: (files: Record<string, string>, target?: string, base?: string) => string
159
- // Marks an existing record as belonging to a run that finished (joshuafolkken/kit#1164). It
157
+ // Marks an existing record as belonging to a run that finished. It
160
158
  // amends rather than rewrites, and answers `undefined` where there is no record to amend: a run
161
159
  // whose record never got written has nothing to assert a completion about, and inventing one here
162
160
  // would manufacture the very vouching the field exists to withhold.
163
161
  complete: (target?: string) => string | undefined
164
162
  read: (source?: string) => FileMapStamp | undefined
165
- // For a record whose meaning is its existence rather than its contents — the in-flight gate marker
166
- // (joshuafolkken/kit#1242). A record nobody removes would go on asserting a gate that ended.
163
+ // For a record whose meaning is its existence rather than its contents — the in-flight gate marker.
164
+ // A record nobody removes would go on asserting a gate that ended.
167
165
  remove: (target?: string) => void
168
166
  }
169
167
 
@@ -186,7 +184,7 @@ function read_at(source: string): FileMapStamp | undefined {
186
184
  // Amending is the whole point, and re-writing would defeat it: `write` stamps a fresh `taken_at` and
187
185
  // takes a fresh file map, so calling it again at the end of a run would claim the tree as the run
188
186
  // *left* it was the tree the run measured — the record would then vouch for a comparison of that
189
- // tree against itself, which is the one answer it exists to withhold (joshuafolkken/kit#1164).
187
+ // tree against itself, which is the one answer it exists to withhold.
190
188
  //
191
189
  // **It completes only a record this process wrote**, which the `pid` already in the payload is what
192
190
  // says. The path is deterministic per checkout, so a second whole-suite run started beside the first
@@ -199,7 +197,7 @@ function read_at(source: string): FileMapStamp | undefined {
199
197
  // deliberate but total-by-assumption: a field added to `write` without a matching entry in
200
198
  // `parse_stamp` and `optional_fields` would be dropped by any `complete`, so the two are extended
201
199
  // together.
202
- // **The pid is not the whole of that check either** (joshuafolkken/kit#1245). A record left behind by
200
+ // **The pid is not the whole of that check either**. A record left behind by
203
201
  // a run that was killed, whose pid this process was later handed, passes `pid === process.pid` — and
204
202
  // stamping it would describe that dead run as finished, which is the false `skip` the field exists to
205
203
  // prevent, reached from a third direction. `is_writer_gone` is the added half rather than
@@ -232,8 +230,7 @@ function create(prefix: string, root?: string): FileMapStampAccess {
232
230
  stamp_path: resolve,
233
231
  // `base` goes into the payload undefined and all — `JSON.stringify` drops an undefined value,
234
232
  // so a caller that has no base writes exactly the record it wrote before this field existed.
235
- // `own_fields` is what writes the pid, and since joshuafolkken/kit#1245 the writing process's
236
- // start time beside it — assembled in one place so no record can carry half an identity.
233
+ // `own_fields` is what writes the pid, and the writing process's start time beside it — assembled in one place so no record can carry half an identity.
237
234
  write: (files, target = resolve(), base?: string) =>
238
235
  stamp_file.write_stamp(target, {
239
236
  taken_at: new Date().toISOString(),
@@ -1,3 +1,4 @@
1
+ import { json_value } from '#scripts/lib/json-value'
1
2
  import type { GuardedCall } from '#scripts/time-runtime/time-batch-guard'
2
3
  import { time_density_hook } from '#scripts/time-runtime/time-density-hook'
3
4
  import { time_hook_transcript } from '#scripts/time-runtime/time-hook-transcript'
@@ -5,10 +6,10 @@ import { z } from 'zod'
5
6
  import { josh_environment_file } from './josh-environment-file'
6
7
  import { stamp_file } from './stamp-file'
7
8
 
8
- // The parts every refusing `PreToolUse` hook needs, held once (joshuafolkken/kit#1460).
9
+ // The parts every refusing `PreToolUse` hook needs, held once.
9
10
  //
10
11
  // **It exists because the second such hook arrived.** `batch-guard.ts` was the first
11
- // (joshuafolkken/kit#1390) and carried the whole shell itself: the payload schema, the envelope
12
+ // and carried the whole shell itself: the payload schema, the envelope
12
13
  // Claude Code understands, the environment switch, and the stamp that makes a refusal
13
14
  // unrepeatable. The investigation guard needs all four unchanged and only its *rule* differs, so
14
15
  // copying them across would be the clone `CLAUDE.md` prohibits — and a rule fixed in one copy and
@@ -20,7 +21,7 @@ import { stamp_file } from './stamp-file'
20
21
  // Only the four fields a `PreToolUse` hook is handed and reads. Claude Code names the tool it is
21
22
  // about to run beside a transcript path, so nothing is searched for.
22
23
  //
23
- // **`agent_id` is what makes a delegated unit answerable with its own file** (joshuafolkken/kit#1424).
24
+ // **`agent_id` is what makes a delegated unit answerable with its own file**.
24
25
  // The path in the payload is the *parent* session's whichever agent issued the call, so without this
25
26
  // field a guard judges the parent's frozen timeline and refuses nothing at all inside a fork.
26
27
  const payload_schema = z.object({
@@ -58,7 +59,7 @@ function is_switch_enabled(key: string): boolean {
58
59
  // The opt-in counterpart of `DISABLED_VALUES`: an unset variable stays off, and only one of these
59
60
  // spellings turns the switch on. A switch that must default off cannot be read with `is_switch_enabled`
60
61
  // — that one defaults on — so the value list is spelled out here rather than inverted at the call site,
61
- // keeping a typo from silently enabling what was meant to stay disabled (joshuafolkken/kit#2370).
62
+ // keeping a typo from silently enabling what was meant to stay disabled.
62
63
  const ENABLED_VALUES: ReadonlyArray<string> = ['on', '1', 'true', 'yes']
63
64
 
64
65
  // Read at call time for the same reason as `is_switch_enabled`, so a suite that switches the variable
@@ -85,7 +86,7 @@ function deny_envelope(reason: string): string {
85
86
  })
86
87
  }
87
88
 
88
- // **A rewrite, not a refusal** (joshuafolkken/kit#3154): the call proceeds with `updated_input` merged
89
+ // **A rewrite, not a refusal**: the call proceeds with `updated_input` merged
89
90
  // over its own. `allow` is the decision the harness applies an `updatedInput` under; a settings `deny`
90
91
  // rule still wins over it, so this never widens what the call may do.
91
92
  function rewrite_envelope(updated_input: Record<string, unknown>, context: string): string {
@@ -126,7 +127,7 @@ function stamp_fault(switch_key: string): string {
126
127
  // anything is written under it, so a fork's first guarded calls read a path with no file behind it —
127
128
  // `time-hook-transcript.ts` states that "no history" is the honest verdict there. Reported as a fault
128
129
  // it would print on every early call of every fork, which is the routine case drowning the signal this
129
- // exists to raise (joshuafolkken/kit#1509).
130
+ // exists to raise.
130
131
  function is_missing_file(error: unknown): boolean {
131
132
  if (!(error instanceof Error) || !('code' in error)) return false
132
133
 
@@ -168,11 +169,7 @@ function last_refusal_ms(target: string): number {
168
169
 
169
170
  if (raw === undefined) return NEVER_MS
170
171
 
171
- try {
172
- return refusal_schema.parse(JSON.parse(raw)).refused_at_ms
173
- } catch {
174
- return NEVER_MS
175
- }
172
+ return json_value.parse_with(raw, refusal_schema)?.refused_at_ms ?? NEVER_MS
176
173
  }
177
174
 
178
175
  function record_refusal(target: string, now_ms: number): boolean {
@@ -199,7 +196,7 @@ function create_refusal_stamp(prefix: string): RefusalStamp {
199
196
  // **`.env` is loaded here rather than through the dispatcher's `tsx_arguments`**, and the reason —
200
197
  // declaring any `tsx_arguments` disqualifies a command from in-process dispatch — is now shared with
201
198
  // every other command that has to stay in-process, so the loader lives in `josh-environment-file.ts` rather
202
- // than here (joshuafolkken/kit#1491). Re-exported under this namespace because that is where the
199
+ // than here. Re-exported under this namespace because that is where the
203
200
  // hooks reach for it.
204
201
  //
205
202
  // **Call it only on the real hook path**, never inside the pure refusal function, so a developer's
@@ -217,7 +214,7 @@ interface GuardRun {
217
214
  }
218
215
 
219
216
  // The notice half of a guard's rule, kept optional so a guard that only refuses supplies nothing and is
220
- // untouched (joshuafolkken/kit#1848). The investigation guard omits it; the batching guard supplies one
217
+ // untouched. The investigation guard omits it; the batching guard supplies one
221
218
  // for the whole-file write, which it cannot refuse but can advise.
222
219
  interface NotifySpec {
223
220
  // This disposition's record prefix, distinct from the refusal's so the two dedupe independently and
@@ -226,8 +223,8 @@ interface NotifySpec {
226
223
  // The same shape as `should_block`, asked of the tail for a notify-only call. `notified_at_ms` is
227
224
  // this disposition's own last-fired instant, never the refusal's.
228
225
  should_notify: (tail: string, call: GuardedCall, notified_at_ms: number, run: GuardRun) => boolean
229
- // The non-blocking text handed to `notice_envelope`, chosen from the call and the tail
230
- // (joshuafolkken/kit#2164, joshuafolkken/kit#2276). A guard now notifies about more than one kind of
226
+ // The non-blocking text handed to `notice_envelope`, chosen from the call and the tail.
227
+ // A guard now notifies about more than one kind of
231
228
  // call — the whole-file write it cannot refuse, and, in a lane child, a refusable call whose refusal
232
229
  // is downgraded to a notice — and the two want different wording, so the text is a function of the
233
230
  // call. It is handed the tail as well so a notice can name the concrete calls the run just issued
@@ -252,18 +249,18 @@ interface TranscriptGuardSpec {
252
249
  should_block: (tail: string, call: GuardedCall, refused_at_ms: number, run: GuardRun) => boolean
253
250
  // What the model is told. The deny reason is the only text that reaches it.
254
251
  reason: string
255
- // **The optional notice disposition** (joshuafolkken/kit#1848). Supplied, it lets a guard emit a
252
+ // **The optional notice disposition**. Supplied, it lets a guard emit a
256
253
  // non-blocking notice for a call it does not refuse. Its record lives under a prefix of its own.
257
254
  notify?: NotifySpec
258
255
  }
259
256
 
260
- // What one hook invocation decided. **`fault` is the half that did not exist** (joshuafolkken/kit#1509):
257
+ // What one hook invocation decided. **`fault` is the half that did not exist**:
261
258
  // every failure still allows the call, but a failure that nobody can see is indistinguishable from a
262
259
  // run that was batching properly — so the guard could be dead for two hours and read as satisfied.
263
260
  // `reason` refuses; `fault` allows and says so.
264
261
  interface GuardOutcome {
265
262
  reason: string | undefined
266
- // **A notice, not a refusal** (joshuafolkken/kit#1848). Set where a notify-only call — a whole-file
263
+ // **A notice, not a refusal**. Set where a notify-only call — a whole-file
267
264
  // write — reached the limit; the call still proceeds, and `notice_envelope` carries this to the
268
265
  // model and the person with no `permissionDecision`. Never set together with `reason`: the block
269
266
  // path decides first and returns before the notice path is asked.
@@ -287,7 +284,7 @@ interface FireResult {
287
284
 
288
285
  // The three the guard closes over: the spec, and one record per disposition. Bundled so the functions
289
286
  // below stay within the parameter limit, and so a further disposition adds a field rather than a
290
- // parameter to every one of them (joshuafolkken/kit#1848).
287
+ // parameter to every one of them.
291
288
  interface GuardParts {
292
289
  spec: TranscriptGuardSpec
293
290
  stamp: RefusalStamp
@@ -306,7 +303,7 @@ interface GuardContext extends GuardParts {
306
303
  // cannot repeat on the call in hand. **Recording before firing is what makes a refusal unrepeatable**,
307
304
  // so a disposition that cannot record does not fire — it reports the fault instead of risking the
308
305
  // wedge, which is the half `scripts/hooks/batch-guard.ts` names. Shared by the refusal and the notice so the
309
- // arm-then-fire order is written once (joshuafolkken/kit#1848).
306
+ // arm-then-fire order is written once.
310
307
  function fire_once(
311
308
  stamp: RefusalStamp,
312
309
  run: GuardRun,
@@ -367,7 +364,7 @@ function guard_reason_for_payload(
367
364
  if (!parts.spec.is_candidate(call)) return NO_OUTCOME
368
365
 
369
366
  // A hook firing inside a delegated unit is handed the *parent's* path, so the fork's own file is
370
- // derived here rather than judged from the parent's frozen timeline (joshuafolkken/kit#1424).
367
+ // derived here rather than judged from the parent's frozen timeline.
371
368
  const transcript = time_hook_transcript.transcript_of(payload.transcript_path, payload.agent_id)
372
369
  const tail = time_density_hook.read_tail(transcript)
373
370
  const context = { ...parts, tail, call, run: { transcript, now_ms } }
@@ -393,7 +390,7 @@ function guard_outcome(parts: GuardParts, raw_payload: string, now_ms: number):
393
390
  function create_transcript_guard(spec: TranscriptGuardSpec): TranscriptGuard {
394
391
  const stamp = create_refusal_stamp(spec.prefix)
395
392
  // A record of its own for the notice, only where a notify spec is supplied. Keyed on its own prefix
396
- // so a notice never spends the refusal's stamp (joshuafolkken/kit#1848).
393
+ // so a notice never spends the refusal's stamp.
397
394
  const notify_stamp = spec.notify ? create_refusal_stamp(spec.notify.prefix) : undefined
398
395
  const parts = { spec, stamp, notify_stamp }
399
396
 
@@ -410,7 +407,7 @@ function create_transcript_guard(spec: TranscriptGuardSpec): TranscriptGuard {
410
407
  // same reason `format-edited-file.ts` swallows a formatter it could not start: a hook that failed
411
408
  // closed would stop a run over its own plumbing.
412
409
  //
413
- // **What changed is that it no longer does so in silence** (joshuafolkken/kit#1509). The call still
410
+ // **What changed is that it no longer does so in silence**. The call still
414
411
  // goes through — failing open is the right call and is not being revisited — but the fault comes
415
412
  // back as text the run can see, so "the guard said nothing" and "the guard could not look" stop
416
413
  // being the same observation.
@@ -430,8 +427,8 @@ function create_transcript_guard(spec: TranscriptGuardSpec): TranscriptGuard {
430
427
  }
431
428
 
432
429
  // Write one already-resolved outcome, so a caller that has to await its rule (the watcher guard reads
433
- // the lane registry and the life record) can compute the outcome first and hand it here
434
- // (joshuafolkken/kit#2353). Nothing reaches stdout on the ordinary call, so what the harness parses
430
+ // the lane registry and the life record) can compute the outcome first and hand it here.
431
+ // Nothing reaches stdout on the ordinary call, so what the harness parses
435
432
  // stays empty unless the call is being refused.
436
433
  function emit_outcome(outcome: GuardOutcome): void {
437
434
  const { reason, notice, fault } = outcome
@@ -453,9 +450,8 @@ function write_outcome(raw_payload: string, outcome: (raw: string) => GuardOutco
453
450
  // wrapper rather than a second implementation, so both paths write the same envelopes.
454
451
  //
455
452
  // **A guard still calling this discards any fault it raised** — `investigation-guard.ts` is the one
456
- // that does, so a stamp it could not write there is still silent. That is the same gap
457
- // joshuafolkken/kit#1509 closed for the batching guard, left standing deliberately: this Issue's
458
- // subject is the batching guard, and moving another hook across belongs with its own test.
453
+ // that does, so a stamp it could not write there is still silent — the gap the batching guard no
454
+ // longer has. Moving another hook across belongs with its own test.
459
455
  function write_decision(raw_payload: string, refusal: (raw: string) => string | undefined): void {
460
456
  write_outcome(raw_payload, (raw) => ({
461
457
  reason: refusal(raw),
@@ -37,6 +37,7 @@ const ALIASES: Record<string, string> = {
37
37
  lr: 'lint:related',
38
38
  ln: 'lines',
39
39
  by: 'bytes',
40
+ mt: 'metrics',
40
41
  f: 'format',
41
42
  sd: 'cspell:dot',
42
43
  bh: 'behavior',
@@ -80,10 +81,12 @@ const ALIASES: Record<string, string> = {
80
81
  ev: 'eval',
81
82
  lsm: 'lane:sample',
82
83
  lst: 'lane:stats',
84
+ lli: 'lane:limit',
85
+ blr: 'backlogrun',
83
86
  }
84
87
 
85
88
  // The canonical name of a `josh` subcommand: an alias expands, and anything else passes through
86
- // unchanged (joshuafolkken/kit#1789).
89
+ // unchanged.
87
90
  //
88
91
  // **The expansion is one rule, so it lives beside the table it reads.** Two readers had each written
89
92
  // their own `ALIASES[name] ?? name` — the layer report and the gate-run count — and a third, the run
@@ -6,9 +6,9 @@ import { ENV_FILE_NAME } from '#ports'
6
6
  //
7
7
  // **There is no mandatory counterpart any more.** `--env-file=.env` aborts before the script's first
8
8
  // line when the file is missing, which is wrong for every command kit ships: `doctor` runs from
9
- // anywhere, including a directory with no project at all (joshuafolkken/kit#869), and `notify` /
9
+ // anywhere, including a directory with no project at all, and `notify` /
10
10
  // `followup` run in cloud sessions that carry their credentials as environment variables and keep no
11
- // `.env` at all (joshuafolkken/kit#1564). A command that needs a value to be present says so itself,
11
+ // `.env` at all. A command that needs a value to be present says so itself,
12
12
  // where it can name what is missing.
13
13
  const OPTIONAL_ENV_FILE_FLAGS: ReadonlyArray<string> = [`--env-file-if-exists=${ENV_FILE_NAME}`]
14
14
 
@@ -17,7 +17,7 @@ type CommandCategory =
17
17
 
18
18
  // The two vocabularies are runtime tuples the types are derived from, rather than bare unions. A
19
19
  // union exists only at compile time, so the completeness test and the generated reference
20
- // (joshuafolkken/kit#2064) would each have to restate the values to check or render them — two
20
+ // would each have to restate the values to check or render them — two
21
21
  // copies that drift apart silently. Deriving the type from the tuple keeps one definition.
22
22
  const COMMAND_AUDIENCES = ['developer', 'maintainer', 'automation'] as const
23
23
  const COMMAND_SIDE_EFFECTS = [
@@ -57,42 +57,43 @@ interface CommandEntry {
57
57
  // A command that only makes sense inside the kit repository itself — the rule-compliance eval and
58
58
  // the run measurements that analyze kit's own development. It is dropped from a consumer's
59
59
  // `josh --help` and refused with guidance when run in a consumer project, so a distributed help
60
- // listing carries only what a consumer can run (joshuafolkken/kit#1988). The audience in
60
+ // listing carries only what a consumer can run. The audience in
61
61
  // `reference` separately decides whether the command appears in the default listing.
62
62
  is_kit_only?: boolean
63
63
  // Pre-built to `dist/commands/` so a consumer's `dist/josh.js` imports it in its own process
64
- // instead of spawning tsx for it (joshuafolkken/kit#3328, `docs/maintainers/runtime-bundling.md`).
64
+ // instead of spawning tsx for it (`docs/maintainers/runtime-bundling.md`).
65
65
  is_bundled?: boolean
66
- // The cores the command reserves from the machine-wide budget before it starts its heavy tools
67
- // (joshuafolkken/kit#3345). `josh-logic.ts` claims them at the one dispatch point every command
66
+ // The cores the command reserves from the machine-wide budget before it starts its heavy tools.
67
+ // `josh-logic.ts` claims them at the one dispatch point every command
68
68
  // passes through, so the command only declares the number. A function means the weight is read
69
69
  // when the command starts: the unit suite's share depends on what else is running at that moment.
70
70
  // **The edit hook declares none, on purpose.** It formats one file per edit and finishes in well
71
71
  // under a second, so a wait for room on the machine would stall every edit for the length of
72
72
  // another lane's check.
73
73
  core_weight?: number | (() => number)
74
+ // The memory the command's tools hold, claimed with its cores; read like
75
+ // `core_weight`, and none declared is none waited for.
76
+ memory_mb?: number | (() => number)
74
77
  }
75
78
 
76
79
  // The name `josh gate` registers under. It lives here rather than in `verification-gate.ts` so a
77
80
  // consumer of the name — the command map, `propagate` — does not import the script module: that
78
81
  // module carries a `process.argv[1] === import.meta.url` main guard, and esbuild bundles every
79
- // import into one `dist/josh.js` where that guard matches on *any* `josh` invocation
80
- // (joshuafolkken/kit#914).
82
+ // import into one `dist/josh.js` where that guard matches on *any* `josh` invocation.
81
83
  const GATE_COMMAND = 'gate'
82
84
 
83
- // joshuafolkken/kit#1256: three of the gate's four checks keep a content-addressed cache, so a
84
- // second run reads only what changed. eslint had one from the start; the type check and the spell
85
- // check rescanned the whole tree every time, which cost 10.5s of CPU against 2.8s cached.
85
+ // Three of the gate's four checks keep a content-addressed cache, so a second run reads only what
86
+ // changed.
86
87
  //
87
- // Neither of those two needs an invalidation rule of its own. `tsc` records the compiler options
88
- // inside the build-info file and re-checks everything when they differ, and `cspell` records a
89
- // content hash of every config and dictionary file it loaded as that entry's dependency — so editing
88
+ // Neither the type check nor the spell check needs an invalidation rule of its own. `tsc` records
89
+ // the compiler options inside the build-info file and re-checks everything when they differ, and
90
+ // `cspell` records a content hash of every config and dictionary file it loaded as that entry's dependency — so editing
90
91
  // `tsconfig.json` or `cspell.config.yaml` invalidates what it should. CI restores only the eslint
91
92
  // cache (`.github/workflows/ci.yml` → "Setup ESLint cache"); the other two start every run cold.
92
93
  //
93
- // **eslint's does need one, and it is not here** (joshuafolkken/kit#1347). ESLint hashes the
94
- // *serialized* config, which drops every rule's `create`, so editing `eslint/rules/*.js` left every
95
- // cached entry valid on every cache file below. The fix is a content fingerprint of the rule modules
94
+ // **eslint's does need one, and it is not here**. ESLint hashes the
95
+ // *serialized* config, which drops every rule's `create`, so editing `eslint/rules/*.js` would leave
96
+ // every cached entry valid on every cache file below. The answer is a content fingerprint of the rule modules
96
97
  // carried in the shared config's `settings` — `eslint/config-fingerprint.js` — because one value
97
98
  // there invalidates the gate's cache, the scoped one and the edit hook's at once, while a rule
98
99
  // written per cache file would have to be repeated for each and would go stale one file at a time.
@@ -150,10 +151,9 @@ const SHARED_CACHE_SPECS: ReadonlyArray<GateCacheSpec> = [
150
151
  ]
151
152
  const GATE_CACHE_FILES: ReadonlyArray<string> = GATE_CACHE_SPECS.map((spec) => spec.cache_file)
152
153
 
153
- // joshuafolkken/kit#1332: the `PostToolUse` edit hook runs eslint too, and ESLint *deletes* the file
154
- // at `--cache-location` whenever it is started without `--cache` — so every single edit wiped the
155
- // cache the gate had just filled, and both gates of run joshuafolkken/kit#1326 paid a cold lint
156
- // (59.4s and 54.5s, against 3.0s warm). The hook is given a location of its own rather than the
154
+ // The `PostToolUse` edit hook runs eslint too, and ESLint *deletes* the file at `--cache-location`
155
+ // whenever it is started without `--cache` — so a shared file would be wiped by every single edit,
156
+ // leaving the gate a cold lint. The hook is given a location of its own rather than the
157
157
  // gate's because the two run at the same time: `josh gate` lints the whole tree beside the review
158
158
  // while this hook fires on every edit, and each eslint run rewrites its cache file whole from the
159
159
  // copy it loaded at start-up — so two writers silently discard each other's entries. A file of its
@@ -162,18 +162,16 @@ const GATE_CACHE_FILES: ReadonlyArray<string> = GATE_CACHE_SPECS.map((spec) => s
162
162
  // **Pruning is not the reason**, though it reads like one: `file-entry-cache` defaults `noPrune` to
163
163
  // true, and a single-file run against the gate's full cache was measured byte-identical, so a shared
164
164
  // file would keep the entries that run never visited.
165
- // joshuafolkken/kit#1347: the same reasoning, reached a second time. `josh lint:related` is what an
166
- // implementation loop calls between edits, and `josh gate` lints the whole tree beside the review —
167
- // so those two run at the same time as readily as the hook and the gate do, and they shared one file
168
- // until this constant existed. Whichever of the pair wrote last replaced the file with "the copy I
169
- // loaded at start-up plus what I visited", so a narrowed run finishing during a whole-tree run rolled
170
- // the cache back to its pre-gate state, and a whole-tree run finishing second discarded the narrowed
171
- // one's entries.
165
+ // The same reasoning for the scoped lint. `josh lint:related` is what an implementation loop calls
166
+ // between edits, and `josh gate` lints the whole tree beside the review — so those two run at the
167
+ // same time as readily as the hook and the gate do. Whichever of a pair sharing one file wrote last
168
+ // would replace it with "the copy I loaded at start-up plus what I visited", so a narrowed run
169
+ // finishing during a whole-tree run would roll the cache back to its pre-gate state, and a
170
+ // whole-tree run finishing second would discard the narrowed one's entries.
172
171
  //
173
- // **The warming this gives up is worth less than the entries it stops losing.** The comment this
174
- // replaced argued the shared file let a narrowed run warm the gate's cache, which is true only while
175
- // the two never overlap; a file of its own is warm from its own second call onwards, and the gate's
176
- // stays exactly as the gate left it.
172
+ // **The warming this gives up is worth less than the entries it stops losing.** A shared file would
173
+ // let a narrowed run warm the gate's cache only while the two never overlap; a file of its own is
174
+ // warm from its own second call onwards, and the gate's stays exactly as the gate left it.
177
175
  //
178
176
  // **The lint's target scope is untouched.** This is where a cache is written, not what is read:
179
177
  // `josh lint:related` narrows in front of the gate and `josh gate` still runs `josh lint` over the
@@ -209,7 +207,7 @@ const CSPELL_CACHE_FLAGS = content_cache_flags(CSPELL_CACHE_FILE)
209
207
 
210
208
  export type { CommandCategory, CommandEntry, GateCacheSpec }
211
209
  // The three cache files are exported one by one as well as as a list, because `josh bench` clears
212
- // them per target (joshuafolkken/kit#1314): the lint step writes only the eslint one, so a target
210
+ // them per target: the lint step writes only the eslint one, so a target
213
211
  // that cleared the list would report a cold type check as the lint's own cost. The edit hook's cache
214
212
  // stays private; the scoped lint cache is exported because #2060 shares its completed file between
215
213
  // worktrees, but it still never overlaps the gate's distinct cache location.
@@ -77,12 +77,12 @@ const AI_COMMANDS: Record<string, CommandEntry> = {
77
77
  reference: ['[options]', 'maintainer', ['none']],
78
78
  // Kit-only: it measures kit's own development runs and its report modules live under the
79
79
  // undistributed `scripts/time/`, so it means nothing in a consumer project and is dropped from a
80
- // consumer's help (joshuafolkken/kit#1997). The runtime analysis hooks and guards rely on stays
80
+ // consumer's help. The runtime analysis hooks and guards rely on stays
81
81
  // distributed under `scripts/time-runtime/`.
82
82
  is_kit_only: true,
83
83
  },
84
84
  // The tool-calls-per-round-trip density the batching guard is measured on, aggregated across the
85
- // recent lane sessions (joshuafolkken/kit#2405). Kit-only for the same reason `time` is: it reads
85
+ // recent lane sessions. Kit-only for the same reason `time` is: it reads
86
86
  // kit's own lane transcripts and means nothing in a consumer project.
87
87
  'time:density': {
88
88
  script: 'scripts/time/time-density-cli.ts',
@@ -99,7 +99,7 @@ const AI_COMMANDS: Record<string, CommandEntry> = {
99
99
  reference: ['', 'maintainer', ['none']],
100
100
  // Kit-only: it reads kit's own development run — the transcript store, the review ledger and the
101
101
  // run event stream — so it means nothing in a consumer project and is dropped from a consumer's
102
- // help (joshuafolkken/kit#2328), through the same declaration `josh time` uses for the same reason.
102
+ // help, through the same declaration `josh time` uses for the same reason.
103
103
  is_kit_only: true,
104
104
  },
105
105
  'review:brief': {
@@ -156,7 +156,7 @@ const AI_COMMANDS: Record<string, CommandEntry> = {
156
156
  category: 'AI tools',
157
157
  reference: ['[--join]', 'automation', ['processes', 'files']],
158
158
  },
159
- // The post-merge sequence a run closed on, folded into one call (joshuafolkken/kit#2372): commit the
159
+ // The post-merge sequence a run closed on, folded into one call: commit the
160
160
  // observation ledger, read the completion citations and decide the release scope. `observations:flush`,
161
161
  // `issue:cite` and `release:scope` were three round trips re-billing the run's full context each.
162
162
  'run:tail': {
@@ -166,7 +166,7 @@ const AI_COMMANDS: Record<string, CommandEntry> = {
166
166
  category: 'AI tools',
167
167
  reference: ['[<issue> ...]', 'automation', ['git', 'network']],
168
168
  },
169
- // The commit-to-report region a run ships a change on, folded into one call (joshuafolkken/kit#2398):
169
+ // The commit-to-report region a run ships a change on, folded into one call:
170
170
  // the gate, the commit/push/PR (`git -y`), the CI-wait merge (`followup`) and the report bookkeeping
171
171
  // (`run:tail`) were four round trips re-billing the run's full context each. It stops at the first
172
172
  // failed step and names it, so the run reads only the step to fix.
@@ -231,7 +231,7 @@ const AI_COMMANDS: Record<string, CommandEntry> = {
231
231
  category: 'AI tools',
232
232
  reference: ['[scenario...]', 'maintainer', ['processes', 'network']],
233
233
  // Kit-only: it replays kit's own distributed rules against real Claude sessions, so it means
234
- // nothing in a consumer project and is dropped from a consumer's help (joshuafolkken/kit#1988).
234
+ // nothing in a consumer project and is dropped from a consumer's help.
235
235
  is_kit_only: true,
236
236
  },
237
237
  }
@@ -1,12 +1,24 @@
1
1
  import { OPTIONAL_ENV_FILE_FLAGS, type CommandEntry } from './josh-command-types'
2
2
 
3
3
  // The `backlog:*` command registry, split out of `josh-commands-ai.ts` so that file stays under its
4
- // 300-code-line limit, exactly as `LANE_COMMANDS` and `SPLIT_COMMANDS` were for the same reason
5
- // (joshuafolkken/kit#2162, joshuafolkken/kit#2218). It is spread into `AI_COMMANDS` so the commands
4
+ // 300-code-line limit, exactly as `LANE_COMMANDS` and `SPLIT_COMMANDS` were for the same reason.
5
+ // It is spread into `AI_COMMANDS` so the commands
6
6
  // stay grouped with the other AI tools under the 'AI tools' category.
7
7
 
8
8
  /* eslint-disable @typescript-eslint/naming-convention */
9
9
  const BACKLOG_COMMANDS: Record<string, CommandEntry> = {
10
+ // Started from a terminal: the `backlogrun` keyword's launcher, and the board.
11
+ backlogrun: {
12
+ script: 'scripts/backlog/backlogrun-cli.ts',
13
+ description:
14
+ 'Start a backlogrun in the background and show its board; with one already running, only show the board',
15
+ category: 'AI tools',
16
+ reference: [
17
+ '[#<n>...] [--only] [--max <n>] [--idle <minutes>] [--agent claude|codex]',
18
+ 'developer',
19
+ ['files', 'network', 'processes'],
20
+ ],
21
+ },
10
22
  'backlog:next': {
11
23
  script: 'scripts/backlog/backlog-next.ts',
12
24
  description:
@@ -41,7 +53,7 @@ const BACKLOG_COMMANDS: Record<string, CommandEntry> = {
41
53
  },
42
54
  'backlog:stalled': {
43
55
  script: 'scripts/backlog/backlog-stalled-cli.ts',
44
- // A stall sends one Telegram warning (joshuafolkken/kit#3357). The `Stop` hook calls the detector
56
+ // A stall sends one Telegram warning. The `Stop` hook calls the detector
45
57
  // directly, so this flag costs only the manual command its in-process dispatch.
46
58
  tsx_arguments: OPTIONAL_ENV_FILE_FLAGS,
47
59
  description:
@@ -1,7 +1,7 @@
1
1
  import type { CommandEntry } from './josh-command-types'
2
2
 
3
3
  // The clone-detection commands, kept in their own module so `josh-commands-ai.ts` stays under its
4
- // line ceiling as the AI-tools set grows (joshuafolkken/kit#2217). Spread into `COMMAND_MAP` in
4
+ // line ceiling as the AI-tools set grows. Spread into `COMMAND_MAP` in
5
5
  // `josh-command-map.ts` alongside the other command groups.
6
6
  /* eslint-disable @typescript-eslint/naming-convention */
7
7
  const CLONE_COMMANDS: Record<string, CommandEntry> = {