@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
@@ -1,15 +1,21 @@
1
1
  import { spawnSync } from 'node:child_process'
2
2
  import { setTimeout as sleep } from 'node:timers/promises'
3
3
  import { parseArgs } from 'node:util'
4
+ import { issue_number_shape } from '#scripts/issue/issue-number-shape'
4
5
  import { PROBE_TIMEOUT_MS } from '#scripts/lib/timeouts'
5
- import { run_liveness } from '#scripts/run/run-liveness'
6
+ import {
7
+ PROCESS_ALIVE,
8
+ PROCESS_NONE,
9
+ PROCESS_UNKNOWN,
10
+ run_liveness,
11
+ type ProcessTrace,
12
+ } from '#scripts/run/run-liveness'
6
13
  import { lane_child_invocation } from './lane-child-invocation'
7
14
  import { lane_handoff } from './lane-handoff'
8
15
 
9
16
  // Detached lane children are not harness-tracked processes, so their completion fires no
10
17
  // re-invocation event in the parent's session. Without a blocking wait the parent notices only
11
- // on the next heartbeat interval -- up to 15 minutes after the fact in the measured case
12
- // (joshuafolkken/kit#2113).
18
+ // on the next heartbeat interval -- up to 15 minutes after the fact.
13
19
  //
14
20
  // **The re-confirm delay is the one value the caller must not be left to choose.** A process that
15
21
  // disappears briefly and reappears (the pre-gate boundary cut, where one process exits and a
@@ -22,12 +28,12 @@ const RECONFIRM_MS = 15_000
22
28
  const DEFAULT_POLL_MS = 5000
23
29
  const NEVER_APPEARED_TIMEOUT_MS = 600_000
24
30
  const MS_PER_SECOND = 1000
25
- const ISSUE_PATTERN = /^[1-9]\d*$/u
26
31
  const PROCESS_FOUND = 0
32
+ const PROCESS_NOT_FOUND = 1
27
33
 
28
34
  // `is_settled` is read once, when the wait starts: a child that ended between two `lane:await` calls
29
35
  // never appears in the second one, and only its settled issue tells it apart from one not yet
30
- // launched (joshuafolkken/kit#3133).
36
+ // launched.
31
37
  interface AwaitState {
32
38
  appeared: boolean
33
39
  disappeared_at: number | undefined
@@ -52,6 +58,8 @@ interface AwaitOptions {
52
58
  poll_ms?: number
53
59
  reconfirm_ms?: number
54
60
  never_appeared_timeout_ms?: number
61
+ now?: () => number
62
+ sleep?: (ms: number) => Promise<void>
55
63
  }
56
64
 
57
65
  interface CheckConfig {
@@ -63,18 +71,28 @@ interface CheckConfig {
63
71
  interface RunConfig extends CheckConfig {
64
72
  is_settled: (issue: string) => Promise<boolean>
65
73
  poll_ms: number
74
+ now: () => number
75
+ sleep: (ms: number) => Promise<void>
66
76
  }
67
77
 
68
- function is_process_running_default(issue: string): boolean {
78
+ // Three answers, not two: only pgrep's own "no match" exit is `none`. A pgrep that failed or hit its
79
+ // timeout never looked, and `run:liveness` answers `undetermined` for it rather than booking a live
80
+ // child as stopped.
81
+ function process_trace_default(issue: string): ProcessTrace {
69
82
  const pattern = lane_child_invocation.process_pattern(issue)
70
83
  const result = spawnSync('pgrep', ['-f', pattern], {
71
84
  encoding: 'utf8',
72
85
  timeout: PROBE_TIMEOUT_MS,
73
86
  })
74
87
 
75
- if (result.status === PROCESS_FOUND) return true
88
+ if (result.status === PROCESS_FOUND) return PROCESS_ALIVE
89
+ if (lane_handoff.is_ship_running(issue, process.cwd())) return PROCESS_ALIVE
90
+
91
+ return result.status === PROCESS_NOT_FOUND ? PROCESS_NONE : PROCESS_UNKNOWN
92
+ }
76
93
 
77
- return lane_handoff.is_ship_running(issue, process.cwd())
94
+ function is_process_running_default(issue: string): boolean {
95
+ return process_trace_default(issue) === PROCESS_ALIVE
78
96
  }
79
97
 
80
98
  // The same positive evidence `run:liveness` answers `settled` on: the issue closed, or it was parked.
@@ -101,7 +119,10 @@ function is_valid(raw: RawAwaitArguments): boolean {
101
119
  const { owner } = raw.values
102
120
  const numbers = owner === undefined ? raw.positionals : [...raw.positionals, owner]
103
121
 
104
- return raw.positionals.length > 0 && numbers.every((value) => ISSUE_PATTERN.test(value))
122
+ return (
123
+ raw.positionals.length > 0 &&
124
+ numbers.every((value) => issue_number_shape.is_issue_number(value))
125
+ )
105
126
  }
106
127
 
107
128
  // The issues to wait on and the waiting session's pid, or `undefined` for anything else.
@@ -142,6 +163,8 @@ function resolve_options(options: AwaitOptions): RunConfig {
142
163
  return {
143
164
  is_running: options.is_running ?? is_process_running_default,
144
165
  is_settled: options.is_settled ?? is_settled_default,
166
+ now: options.now ?? Date.now,
167
+ sleep: options.sleep ?? sleep,
145
168
  ...resolve_timing(options),
146
169
  }
147
170
  }
@@ -225,12 +248,12 @@ async function wait_for_any(
225
248
  const states = await make_states(issues, config.is_settled)
226
249
 
227
250
  for (;;) {
228
- const completed = check_any(states, Date.now(), config)
251
+ const completed = check_any(states, config.now(), config)
229
252
 
230
253
  if (completed !== undefined) return completed
231
254
 
232
255
  // eslint-disable-next-line no-await-in-loop -- polling: each read waits on the state the previous one saw
233
- await sleep(config.poll_ms)
256
+ await config.sleep(config.poll_ms)
234
257
  }
235
258
  }
236
259
 
@@ -240,6 +263,7 @@ const lane_await = {
240
263
  check_issue,
241
264
  is_process_running_default,
242
265
  parse_arguments,
266
+ process_trace_default,
243
267
  wait_for_any,
244
268
  }
245
269
 
@@ -8,15 +8,15 @@ import {
8
8
  type GateCacheSpec,
9
9
  } from '#scripts/josh/josh-command-types'
10
10
 
11
- // Warming a fresh lane's verification caches from the main checkout (joshuafolkken/kit#1849).
11
+ // Warming a fresh lane's verification caches from the main checkout.
12
12
  //
13
13
  // `git worktree add` writes a checkout and nothing beside it, and the three caches the gate reads —
14
14
  // `.eslintcache`, `.tsbuildinfo`, `.cspellcache` — are all git-ignored, so a new lane has none of
15
- // them and only its *first* `josh gate` runs fully cold (measured at 353.9 s against 27.5 s warm,
16
- // joshuafolkken/kit#1839). The initial seed warms that run; the per-tool sync below keeps the
17
- // portable ESLint and CSpell caches current afterwards (#2060).
15
+ // them and only its *first* `josh gate` runs fully cold (several minutes against well under a minute
16
+ // warm). The initial seed warms that run; the per-tool sync below keeps the portable ESLint and
17
+ // CSpell caches current afterwards.
18
18
  //
19
- // Content hashes make stale entries safe, but do not by themselves make a cache portable (#2060).
19
+ // Content hashes make stale entries safe, but do not by themselves make a cache portable.
20
20
  // ESLint keys entries by absolute file path, so its JSON is rebased while cspell's relative keys and
21
21
  // TypeScript's build info move raw. The spec in `josh-command-types.ts` is the one declaration of
22
22
  // which treatment and which continuous sharing each gate cache receives.
@@ -103,7 +103,7 @@ function seed_caches(source_root: string, destination: string): void {
103
103
  /**
104
104
  * Copy the pre-built hook bundles (`dist/hooks/`) from `source_root` into `destination`, so a fresh
105
105
  * lane's child runs each Claude Code hook off `node dist/hooks/<name>.js` rather than the slower
106
- * `pnpm josh …` fallback (joshuafolkken/kit#2160). The bundles are git-ignored, so a lane's work tree
106
+ * `pnpm josh …` fallback. The bundles are git-ignored, so a lane's work tree
107
107
  * never carries them and every hook falls back without this seed.
108
108
  *
109
109
  * Best-effort, exactly like `seed_caches`: a source with no bundles (a checkout that never ran
@@ -1,14 +1,14 @@
1
+ import { lane_limit_override } from './lane-limit-override'
1
2
  import type { LaneEnvironment } from './lane-paths'
2
3
  import { lane_seed_policy } from './lane-seed'
3
4
 
4
- // How many lanes one repository may run at once, and how many of them are free
5
- // (joshuafolkken/kit#1491).
5
+ // How many lanes one repository may run at once, and how many of them are free.
6
6
  //
7
7
  // **Nothing here knows what a lane holds.** The limit is a number, the occupancy is a number, and
8
8
  // the answer is a number — so the same pool serves an epic's children, several epics' children at
9
9
  // once, or anything else a scheduler decides to put in a lane. Threading an epic through this module
10
- // is what would have to be undone the first time two epics run together, and the whole reason
11
- // joshuafolkken/kit#1491 built the scheduler epic-free from the start.
10
+ // is what would have to be undone the first time two epics run together, which is why the scheduler
11
+ // is epic-free.
12
12
  //
13
13
  // **It is a ceiling, not a prediction.** Six lanes does not say six children will run at once; it
14
14
  // says a seventh will not start. What actually runs is bounded by what is runnable, by the port
@@ -33,40 +33,55 @@ type LimitChoice = { kind: 'limit'; limit: number } | { kind: 'problem'; problem
33
33
  //
34
34
  // Blank is unset, not invalid: an `.env` line left as `JOSH_LANE_LIMIT=` is a variable nobody
35
35
  // configured, exactly as `lane_paths.lane_root` reads a blank root.
36
- function read_limit(raw: string | undefined): LimitChoice {
36
+ //
37
+ // `name` is what the problem names: `josh lane:limit` reads its argument by the same rule.
38
+ function read_limit(raw: string | undefined, name: string): LimitChoice {
37
39
  const trimmed = raw?.trim() ?? ''
38
40
 
39
41
  if (trimmed === '') return { kind: 'limit', limit: DEFAULT_LANE_LIMIT }
40
42
 
41
43
  if (!POSITIVE_INTEGER.test(trimmed)) {
42
- return {
43
- kind: 'problem',
44
- problem: `${LANE_LIMIT_KEY} must be a positive integer, not "${trimmed}"`,
45
- }
44
+ return { kind: 'problem', problem: `${name} must be a positive integer, not "${trimmed}"` }
46
45
  }
47
46
 
48
47
  return { kind: 'limit', limit: Number(trimmed) }
49
48
  }
50
49
 
51
- function lane_limit(environment: LaneEnvironment = process.env): LimitChoice {
52
- return read_limit(environment[LANE_LIMIT_KEY])
50
+ // **A live run's `lane:limit` override outranks the environment**: a running
51
+ // parent keeps the environment it started with, so the override is the only way its limit moves. This
52
+ // stays the one place the limit is read; the override reader is injected so a test reads none.
53
+ async function lane_limit(
54
+ environment: LaneEnvironment = process.env,
55
+ read_override: () => Promise<number | undefined> = lane_limit_override.read_override,
56
+ ): Promise<LimitChoice> {
57
+ const override = await read_override()
58
+
59
+ if (override !== undefined) return { kind: 'limit', limit: override }
60
+
61
+ return read_limit(environment[LANE_LIMIT_KEY], LANE_LIMIT_KEY)
62
+ }
63
+
64
+ // **A limit above the seat count is capped at the seats**. `lane:open` refuses
65
+ // a tenth lane however high the limit is set, so a limit past the seats offers launches bound to be
66
+ // refused.
67
+ function seated_limit(limit: number): number {
68
+ return Math.min(limit, lane_seed_policy.LAST_LANE_SEAT)
53
69
  }
54
70
 
55
71
  // Never negative: a repository holding more `in-progress` issues than the limit allows — the limit
56
72
  // was lowered, or a stale label outlived its run — has no free lane, and a negative count read as
57
73
  // "how many to offer" would be a slice nobody meant.
58
- //
59
- // **A limit above the seat count is capped at the seats** (joshuafolkken/kit#3027). `lane:open` refuses
60
- // a tenth lane however high `JOSH_LANE_LIMIT` is set, so counting free lanes past the seats offers a
61
- // launch that is bound to be refused.
62
74
  function free_lanes(limit: number, occupied: number): number {
63
- return Math.max(NO_LANES, Math.min(limit, lane_seed_policy.LAST_LANE_SEAT) - occupied)
75
+ return Math.max(NO_LANES, seated_limit(limit) - occupied)
64
76
  }
65
77
 
66
78
  const lane_capacity = {
67
79
  LANE_LIMIT_KEY,
68
- lane_limit,
69
80
  free_lanes,
81
+ lane_limit,
82
+ read_limit,
83
+ seated_limit,
70
84
  }
71
85
 
86
+ export type { LimitChoice }
72
87
  export { lane_capacity }
@@ -1,4 +1,5 @@
1
- import { run_issue_number } from '#scripts/run/run-issue-number'
1
+ import { issue_cite } from '#scripts/issue/issue-cite'
2
+ import { issue_number_shape } from '#scripts/issue/issue-number-shape'
2
3
  import { run_ship_next, type ShipResume } from '#scripts/run/ship/run-ship-next'
3
4
  import type { Stage } from '#scripts/run/ship/run-ship-stage'
4
5
 
@@ -8,7 +9,7 @@ interface ShipStop extends ShipResume {
8
9
 
9
10
  const CHILD_INVOCATION = 'fullrun'
10
11
  const RESUME_GUIDE = '.claude/skills/workflow-commands/pre-gate-cut.md'
11
- // What a detached `josh ship --detach` supervisor's command line carries (joshuafolkken/kit#2428). It ends
12
+ // What a detached `josh ship --detach` supervisor's command line carries. It ends
12
13
  // with the `"<title> #<N>"` title on purpose, so the liveness pattern below finds it by the same trailing
13
14
  // anchor it finds a child by. **The script path alone is not enough**: where the dispatcher is TypeScript
14
15
  // (kit itself) `josh ship` runs in-process, so no process ever carries `run-ship-cli.ts` — the `pnpm josh
@@ -16,57 +17,58 @@ const RESUME_GUIDE = '.claude/skills/workflow-commands/pre-gate-cut.md'
16
17
  const SHIP_PROCESS = String.raw`(josh(\.[jt]s)? ship|run-ship-cli\.ts)`
17
18
 
18
19
  function child_invocation(issue: string): string {
19
- run_issue_number.require_issue_number(issue)
20
+ issue_number_shape.require_issue_number(issue)
20
21
 
21
- return `${CHILD_INVOCATION} #${issue}`
22
+ return `${CHILD_INVOCATION} ${issue_cite.plain(issue)}`
22
23
  }
23
24
 
24
25
  // The `pgrep -f` pattern that finds a running child: the invocation is always the last argument of
25
26
  // its command line — the resume prompts below end with it on purpose — so the anchor matches every
26
- // launch of `#<N>` and never `#<N>0` (joshuafolkken/kit#2421).
27
+ // launch of `#<N>` and never `#<N>0`.
27
28
  //
28
- // **A detached ship supervisor counts as the child** (joshuafolkken/kit#2428). The agent ends once it has
29
+ // **A detached ship supervisor counts as the child**. The agent ends once it has
29
30
  // handed the post-implementation region to `josh ship --detach`, and the parent books a lane whose
30
31
  // pattern stopped matching as finished — parking an issue that was still shipping. The supervisor's
31
32
  // command line ends with its `#<N>` title, so the one extended pattern covers both, and the wait, the
32
33
  // liveness read and the reaper keep searching with a single pattern.
33
34
  function process_pattern(issue: string): string {
34
- run_issue_number.require_issue_number(issue)
35
+ issue_number_shape.require_issue_number(issue)
35
36
 
36
- return `(${CHILD_INVOCATION}|${SHIP_PROCESS} .*) #${issue}$`
37
+ return `(${CHILD_INVOCATION}|${SHIP_PROCESS} .*) ${issue_cite.plain(issue)}$`
37
38
  }
38
39
 
39
40
  function resume_invocation(issue: string): string {
40
- const preamble = `Resuming the lane child for issue #${issue} — do not re-read the workflow-commands entry documents (SKILL.md, fullrun.md). Run \`pnpm josh run:cut --resume ${issue}\` before anything else and follow the matching verdict in ${RESUME_GUIDE}: \`resume\` goes to the gate, \`resume-impl\` continues implementation. Only on \`fresh\` proceed as an ordinary`
41
+ const preamble = `Resuming the lane child for issue ${issue_cite.plain(issue)} — do not re-read the workflow-commands entry documents (SKILL.md, fullrun.md). Run \`pnpm josh run:cut --resume ${issue}\` before anything else and follow the matching verdict in ${RESUME_GUIDE}: \`resume\` goes to the gate, \`resume-impl\` continues implementation. Only on \`fresh\` proceed as an ordinary`
41
42
 
42
43
  return `${preamble} ${child_invocation(issue)}`
43
44
  }
44
45
 
45
- // The prompt an `outage` re-dispatch gives a resumed child (joshuafolkken/kit#2317). Its session was
46
+ // The prompt an `outage` re-dispatch gives a resumed child. Its session was
46
47
  // relaunched with `--resume`, so its full context is already loaded — the preamble tells it not to
47
48
  // re-read the entry documents and to find where it stopped with `run:step`, redoing only the last
48
49
  // action if it did not complete.
49
50
  //
50
51
  // **It ends with `child_invocation` on purpose, not as decoration** — for the same reason
51
- // `resume_invocation` does: the parent's liveness poll is `pgrep -laf "<invocation>$"`, so the trailing
52
+ // `resume_invocation` does: the parent's liveness read (`run:liveness`, `lane:await`) matches
53
+ // `process_pattern` against the command line, so the trailing
52
54
  // `fullrun #<N>` keeps the relaunched process matching, and it is the ordinary run the child carries on.
53
55
  function outage_resume_invocation(issue: string): string {
54
- const preamble = `Resuming the lane child for issue #${issue} after an API disconnection — your session was restored with its full context, so do not re-read the workflow-commands entry documents (SKILL.md, fullrun.md). Continue the run from where it stopped: run \`pnpm josh run:step ${issue}\` to find the next action, redoing only the last step if it did not complete.`
56
+ const preamble = `Resuming the lane child for issue ${issue_cite.plain(issue)} after an API disconnection — your session was restored with its full context, so do not re-read the workflow-commands entry documents (SKILL.md, fullrun.md). Continue the run from where it stopped: run \`pnpm josh run:step ${issue}\` to find the next action, redoing only the last step if it did not complete.`
55
57
 
56
58
  return `${preamble} ${child_invocation(issue)}`
57
59
  }
58
60
 
59
61
  // The prompt a lane child is relaunched with when its detached ship supervisor stopped at a failed
60
- // stage (joshuafolkken/kit#2428) — a red gate, a High/Medium review, a failed push or red CI. The agent
62
+ // stage — a red gate, a High/Medium review, a failed push or red CI. The agent
61
63
  // ended at the hand-off, so this is how control comes back to one: it reads the stopped report, fixes it
62
64
  // and hands the region back. It ends with `child_invocation` for the reason `resume_invocation` does —
63
65
  // the parent's poll keeps matching the relaunched process.
64
66
  //
65
- // **A known stage puts the next command in the prompt** (joshuafolkken/kit#2964), so the relaunched
67
+ // **A known stage puts the next command in the prompt**, so the relaunched
66
68
  // session runs it rather than re-deriving it from `chain-rule.md`. An OpenAI lane's supervisor sees only
67
69
  // that the ship failed, not where, so without a stage the prompt points at `run:step` as before.
68
70
  function ship_stop_invocation(issue: string, stop?: ShipStop): string {
69
- const opening = `Resuming the lane child for issue #${issue} after its detached ship supervisor stopped at a failed stage — do not re-read the workflow-commands entry documents (SKILL.md, fullrun.md).`
71
+ const opening = `Resuming the lane child for issue ${issue_cite.plain(issue)} after its detached ship supervisor stopped at a failed stage — do not re-read the workflow-commands entry documents (SKILL.md, fullrun.md).`
70
72
  const next =
71
73
  stop === undefined
72
74
  ? `Run \`pnpm josh run:step ${issue}\` and read the stopped report it names, fix what stopped the ship, then hand the region back per chain-rule.md.`
@@ -1,15 +1,15 @@
1
- import { run_issue_number } from '#scripts/run/run-issue-number'
1
+ import { issue_number_shape } from '#scripts/issue/issue-number-shape'
2
2
  import { lane_paths } from './lane-paths'
3
3
 
4
4
  // The mark a dispatched lane child carries, so the pre-gate cut and a resume are decided from the
5
- // environment rather than from the model's reading of the prompt (joshuafolkken/kit#1904).
5
+ // environment rather than from the model's reading of the prompt.
6
6
  //
7
- // **A dispatched child used to be indistinguishable from a person's own session.** `lane:dispatch`
8
- // and the `run:cut` relaunch both start the child with `claude -p "fullrun #<N>"` and a copied
9
- // environment, and nothing in the argv, the environment or a file said "this session was launched, not
10
- // typed". So `pre-gate-cut.ts` left the human-or-child question to the model, which read its own prompt
11
- // and — across the six children joshuafolkken/kit#1850 measured — decided "person" every time and
12
- // declined the cut. This variable is that missing fact, made mechanical.
7
+ // **Without this mark a dispatched child is indistinguishable from a person's own session.**
8
+ // `lane:dispatch` and the `run:cut` relaunch both start the child with `claude -p "fullrun #<N>"` and
9
+ // a copied environment, and nothing in the argv, the environment or a file says "this session was
10
+ // launched, not typed". Left to the model, the human-or-child question is answered by reading its own
11
+ // prompt, which decides "person" and declines the cut. This variable is that missing fact, made
12
+ // mechanical.
13
13
  //
14
14
  // **Its value is the issue number, because a mark that only said "a child" could not be told from one
15
15
  // that leaked.** A person's shell, or a parent session that was itself a dispatched child, can carry
@@ -19,7 +19,7 @@ import { lane_paths } from './lane-paths'
19
19
  // `.claude/skills/workflow-commands/pre-gate-cut.md`.
20
20
  const KEY = 'JOSH_LANE_CHILD'
21
21
 
22
- // **A dispatched child also asks for the five-minute prompt-cache TTL** (joshuafolkken/kit#2944). A
22
+ // **A dispatched child also asks for the five-minute prompt-cache TTL**. A
23
23
  // headless `claude -p` session on a subscription defaults to the one-hour TTL, whose writes bill at 2x
24
24
  // the input rate against 1.25x for five minutes. A replay of 1,953 lane transcripts (about 57,000
25
25
  // requests) found 0.3% of request gaps over five minutes, so the shorter TTL — re-writing the prefix on
@@ -34,7 +34,7 @@ type MarkerSource = Readonly<Record<string, string | undefined>>
34
34
  // issue number rather than from text read anywhere — the same discipline `lane-dispatch.ts` applies to
35
35
  // the invocation it builds — so a malformed number fails here rather than reaching a child.
36
36
  function environment_for(issue: string): Record<string, string> {
37
- run_issue_number.require_issue_number(issue)
37
+ issue_number_shape.require_issue_number(issue)
38
38
 
39
39
  return { [KEY]: issue, [CACHE_TTL_KEY]: CACHE_TTL }
40
40
  }
@@ -47,14 +47,14 @@ function marked_issue(source: MarkerSource = process.env): string | undefined {
47
47
 
48
48
  if (value === undefined) return undefined
49
49
 
50
- return run_issue_number.ISSUE_NUMBER_PATTERN.test(value) ? value : undefined
50
+ return issue_number_shape.ISSUE_NUMBER_PATTERN.test(value) ? value : undefined
51
51
  }
52
52
 
53
53
  // True when this session is a dispatched lane child for the checkout it is running in: the mark is
54
54
  // present and names this lane's own issue, read from the checkout path. A numeric mark naming a
55
55
  // *different* issue leaked in from a parent session into a checkout it does not belong to, so it is
56
56
  // read as a person's run — the trust condition the header describes, applied the same way
57
- // `pre-gate-cut.ts` applies it to the resume decision (joshuafolkken/kit#1947).
57
+ // `pre-gate-cut.ts` applies it to the resume decision.
58
58
  function is_child_of(directory: string, source: MarkerSource = process.env): boolean {
59
59
  const marked = marked_issue(source)
60
60
 
@@ -4,6 +4,8 @@ import { epic_busy } from '#scripts/epic/epic-busy'
4
4
  import { git_gh_command } from '#scripts/gh/git-gh-command'
5
5
  import type { OpenIssueData } from '#scripts/git/git-schemas'
6
6
  import { issue_cite, type IssueCiter } from '#scripts/issue/issue-cite'
7
+ import { issue_number_shape } from '#scripts/issue/issue-number-shape'
8
+ import { session_cite } from '#scripts/issue/session-cite'
7
9
  import { error_text } from '#scripts/lib/error-message'
8
10
  import { run_carry } from '#scripts/run/carry/run-carry'
9
11
  import { run_carry_reclaim } from '#scripts/run/carry/run-carry-reclaim'
@@ -16,9 +18,9 @@ import { lane_output, type ReadOutcome, type RecordOutcome } from './lane-output
16
18
  import { lane_registry, type LaneInfo } from './lane-registry'
17
19
  import { lane_report } from './lane-report'
18
20
  import { lane_seed_policy } from './lane-seed'
21
+ import { lane_stray } from './lane-stray'
19
22
 
20
- // `josh lane:open` / `lane:close` / `lane:list` / `lane:prune` — the lane's whole lifecycle
21
- // (joshuafolkken/kit#1490).
23
+ // `josh lane:open` / `lane:close` / `lane:list` / `lane:prune` — the lane's whole lifecycle.
22
24
  //
23
25
  // **`lane:open` prints the lane's directory on standard output and nothing else**, so
24
26
  // `dir=$(pnpm josh lane:open 1490)` is what a caller needs and a refusal is an empty capture beside
@@ -32,7 +34,6 @@ const SINGLE_ARGUMENT = 1
32
34
  const ISSUE_AND_PATH_ARGUMENTS = 2
33
35
  const ALL_FLAG = '--all'
34
36
  const NONE_TOKEN = 'none'
35
- const ISSUE_NUMBER_PATTERN = /^[1-9]\d*$/u
36
37
 
37
38
  const USAGE = [
38
39
  'Usage: josh lane:open <issue-number>',
@@ -53,8 +54,7 @@ function report_usage(): number {
53
54
  }
54
55
 
55
56
  // Read the carry record and refuse if this session has already handed off its budget via `--cut`.
56
- // A cut session must not open new lanes or dispatch new children — the successor owns the budget
57
- // (joshuafolkken/kit#2114).
57
+ // A cut session must not open new lanes or dispatch new children — the successor owns the budget.
58
58
  async function guard_cut_session(): Promise<string | undefined> {
59
59
  const directory = await run_carry.repository_directory()
60
60
 
@@ -72,7 +72,7 @@ async function guard_cut_session(): Promise<string | undefined> {
72
72
  function parse_lane_issue(value: string | undefined): string | undefined {
73
73
  if (value === undefined) return undefined
74
74
 
75
- return ISSUE_NUMBER_PATTERN.test(value) ? value : undefined
75
+ return issue_number_shape.ISSUE_NUMBER_PATTERN.test(value) ? value : undefined
76
76
  }
77
77
 
78
78
  function parse_issue(rest: ReadonlyArray<string>): string | undefined {
@@ -88,7 +88,7 @@ function refusal_message(outcome: Exclude<OpenOutcome, { kind: 'opened' }>): str
88
88
  return `All ${String(lane_seed_policy.LAST_LANE_SEAT)} lane seats are taken. Run \`pnpm josh lane:list\` to see them and \`pnpm josh lane:close <issue-number>\` to free one.`
89
89
  }
90
90
 
91
- return `A lane for #${outcome.lane.issue} is already open at ${outcome.lane.directory}. Run \`pnpm josh lane:close ${outcome.lane.issue}\` before opening it again.`
91
+ return `A lane for ${session_cite.issue(outcome.lane.issue)} is already open at ${outcome.lane.directory}. Run \`pnpm josh lane:close ${outcome.lane.issue}\` before opening it again.`
92
92
  }
93
93
 
94
94
  function report_open(outcome: OpenOutcome): number {
@@ -118,7 +118,7 @@ function report_issues(issues: ReadonlyArray<string>): number {
118
118
  function report_close(outcome: CloseOutcome): number {
119
119
  if (outcome.reaped.length > 0) {
120
120
  console.error(
121
- `Terminated the lane child for #${outcome.issue} that had not ended by itself: process ${outcome.reaped.join(', ')}.`,
121
+ `Terminated the lane child for ${session_cite.issue(outcome.issue)} that had not ended by itself: process ${outcome.reaped.join(', ')}.`,
122
122
  )
123
123
  }
124
124
 
@@ -127,7 +127,7 @@ function report_close(outcome: CloseOutcome): number {
127
127
  }
128
128
 
129
129
  console.error(
130
- `Closing the lane for #${outcome.issue} left this behind: ${outcome.left_behind.join(', ')}. Remove it and run \`pnpm josh lane:close ${outcome.issue}\` again.`,
130
+ `Closing the lane for ${session_cite.issue(outcome.issue)} left this behind: ${outcome.left_behind.join(', ')}. Remove it and run \`pnpm josh lane:close ${outcome.issue}\` again.`,
131
131
  )
132
132
 
133
133
  return FAILURE_EXIT_CODE
@@ -140,7 +140,7 @@ function report_sweep(outcome: SweepOutcome): number {
140
140
 
141
141
  if (outcome.failed.length === 0) return code
142
142
 
143
- const named = outcome.failed.map((issue) => `#${issue}`).join(', ')
143
+ const named = outcome.failed.map((issue) => session_cite.issue(issue)).join(', ')
144
144
 
145
145
  // `lane:list` reads git's work trees, and the usual survivor is a branch whose work tree is
146
146
  // already gone — which that listing cannot show. Closing each one again is what names it.
@@ -193,7 +193,7 @@ const OCCUPANCY_UNREADABLE =
193
193
  'Could not read the `in-progress` listing, so the lane/label difference was not checked — that is not "everything agrees"; check `gh auth status`.'
194
194
 
195
195
  // The `in-progress` issues this repository shows running, read the way `epic:next` reads lane
196
- // occupancy — never rebuilt (joshuafolkken/kit#2235). A read that could not see the whole listing is
196
+ // occupancy — never rebuilt. A read that could not see the whole listing is
197
197
  // `undefined`, so the difference is skipped rather than computed against a set known to be partial.
198
198
  async function to_holders(repo: string): Promise<ReadonlyArray<OpenIssueData> | undefined> {
199
199
  const read = await epic_busy.read_repository(repo)
@@ -203,7 +203,7 @@ async function to_holders(repo: string): Promise<ReadonlyArray<OpenIssueData> |
203
203
  }
204
204
 
205
205
  // The repository and its running issues, read once: the listing cites each lane from the titles here
206
- // (joshuafolkken/kit#2943) and the occupancy check compares against the same set.
206
+ // and the occupancy check compares against the same set.
207
207
  interface InProgress {
208
208
  repo: string | undefined
209
209
  holders: ReadonlyArray<OpenIssueData> | undefined
@@ -268,7 +268,14 @@ async function list_command(rest: ReadonlyArray<string>): Promise<number> {
268
268
  async function prune_command(rest: ReadonlyArray<string>): Promise<number> {
269
269
  if (rest.length > 0) return report_usage()
270
270
 
271
- return report_sweep(await lane_close.prune_lanes())
271
+ const code = report_sweep(await lane_close.prune_lanes())
272
+
273
+ // After the closes, so a lane whose close left its directory behind is swept in the same run. A
274
+ // kept stray is reported, never a failure: it waits on a person, and a non-zero exit would stop
275
+ // every `backlogrun` preparation until one came.
276
+ await lane_stray.sweep_and_report()
277
+
278
+ return code
272
279
  }
273
280
 
274
281
  // The recorded path goes to standard output on both arms, so
@@ -6,7 +6,7 @@ import { lane_paths } from './lane-paths'
6
6
  import { lane_reap } from './lane-reap'
7
7
  import { lane_registry, type LaneInfo } from './lane-registry'
8
8
 
9
- // Closing a lane: no work tree, no branch, no directory (joshuafolkken/kit#1490).
9
+ // Closing a lane: no work tree, no branch, no directory.
10
10
  //
11
11
  // **A lane is closed after a park, a failure or an interruption as readily as after a success**, so
12
12
  // every step here is written to run over a subject that is already gone or that still holds
@@ -21,7 +21,7 @@ interface LaneTargets {
21
21
 
22
22
  // The lane an issue number names: its registration, when there is one, and the paths a close acts on.
23
23
  // Resolved once here so a caller that has to look inside the tree before closing it reads the same
24
- // directory the close removes (joshuafolkken/kit#2476).
24
+ // directory the close removes.
25
25
  interface ResolvedLane {
26
26
  existing: LaneInfo | undefined
27
27
  targets: LaneTargets
@@ -107,8 +107,8 @@ function close_kind(did_exist: boolean, left_behind: ReadonlyArray<string>): Clo
107
107
  }
108
108
 
109
109
  // The main work tree's root, not this one's — the same reading `list_lanes` uses, so the fallback
110
- // directory an unregistered lane is closed by is the one `lane:open` would have created
111
- // (joshuafolkken/kit#1497). Derived here from the current work tree, a close run inside a lane
110
+ // directory an unregistered lane is closed by is the one `lane:open` would have created.
111
+ // Derived here from the current work tree, a close run inside a lane
112
112
  // reports `none` over a directory that is still on disk.
113
113
  async function lane_root_directory(): Promise<string> {
114
114
  return lane_paths.lane_root(await lane_registry.main_repository_root())
@@ -130,8 +130,8 @@ async function close_lane(issue: string): Promise<CloseOutcome> {
130
130
  const { existing, targets } = await resolve_lane(issue)
131
131
  const did_exist = existing !== undefined || existsSync(targets.directory)
132
132
  // Before the removal, not after: a child still running in the tree would keep writing into a
133
- // directory being deleted, and a process outliving its lane is the half-discarded state
134
- // joshuafolkken/kit#2421 found — the work tree gone, the child still answering `alive`.
133
+ // directory being deleted, and a process outliving its lane is a half-discarded state — the work
134
+ // tree gone, the child still answering `alive`.
135
135
  const reaped = lane_reap.reap_child(issue)
136
136
 
137
137
  await remove_lane(targets)