@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,7 +1,7 @@
1
1
  // Captures the number, so the one pattern answers every question asked of a PR body: whether the
2
- // linked issue will auto-close, which issue that is when the invocation did not say
3
- // (joshuafolkken/kit#1539), and whether a merged pull request closes a child a `backlogrun` judged
4
- // unfinished (joshuafolkken/kit#2769). A second pattern would be two readings of "closes #N" to disagree.
2
+ // linked issue will auto-close, which issue that is when the invocation did not say,
3
+ // and whether a merged pull request closes a child a `backlogrun` judged
4
+ // unfinished. A second pattern would be two readings of "closes #N" to disagree.
5
5
  const CLOSES_PATTERN = /closes\s+#(\d+)/iu
6
6
 
7
7
  function parse_closes_issue_number(body: string | undefined): string | undefined {
@@ -1,3 +1,4 @@
1
+ import { SUITE_TIMEOUT_MS } from '#scripts/lib/timeouts'
1
2
  import { PORCELAIN_FLAG, UNTRACKED_FILES_FLAG } from './constants'
2
3
  import { git_diff_reads } from './git-diff-reads'
3
4
  import { create_spawn_error } from './git-execa-error'
@@ -10,7 +11,7 @@ async function branch(): Promise<string> {
10
11
  return await git_spawn.read(['rev-parse', '--abbrev-ref', 'HEAD'])
11
12
  }
12
13
 
13
- // **The untracked-files mode is passed rather than inherited** (joshuafolkken/kit#1381). Every
14
+ // **The untracked-files mode is passed rather than inherited**. Every
14
15
  // reader of this output depends on the `??` lines being there: `git-staging.ts` stages exactly those,
15
16
  // and `hook-gate-reuse.ts` reads an empty output as "this push carries the recorded tree". A person
16
17
  // with `status.showUntrackedFiles=no` in their git config — a common setting on large repositories —
@@ -18,8 +19,8 @@ async function branch(): Promise<string> {
18
19
  // pre-push hook reuses a record for a commit that does not contain them. Naming the mode makes the
19
20
  // reading answer to this codebase rather than to whoever ran it.
20
21
  //
21
- // **`all` rather than `normal`, so a new file is named even inside an untracked directory**
22
- // (joshuafolkken/kit#2724). `normal` collapses it to `?? docs/maintainers/`, and every reader that
22
+ // **`all` rather than `normal`, so a new file is named even inside an untracked directory**.
23
+ // `normal` collapses it to `?? docs/maintainers/`, and every reader that
23
24
  // recognizes the observation ledger by its path then misses it: `git-staging.ts` stages the directory
24
25
  // — ledger included — into an unrelated pull request, and the flush refuses the directory as "other
25
26
  // changes".
@@ -33,7 +34,7 @@ async function status(directory?: string): Promise<string> {
33
34
  // The absolute path every other git command's output is relative to. Asking git rather than reading
34
35
  // `process.cwd()` is the whole point: run from a subdirectory, joining a repository-relative path
35
36
  // onto the working directory resolves to nothing, and a digest map built that way collapses to
36
- // "every file absent" — which compares *equal* to another such map (joshuafolkken/kit#1241).
37
+ // "every file absent" — which compares *equal* to another such map.
37
38
  async function repository_root(): Promise<string> {
38
39
  const result = git_spawn_sync.toplevel()
39
40
  if (result.exit_code !== 0) throw create_spawn_error('rev-parse', result.exit_code)
@@ -43,8 +44,7 @@ async function repository_root(): Promise<string> {
43
44
 
44
45
  // The commit this checkout is sitting on, as opposed to `change_base_commit`'s commit a change is
45
46
  // measured against. Read by `josh review:brief` to say which tree a review was
46
- // briefed on, so a review that read a different one can be told apart from one that read this one
47
- // (joshuafolkken/kit#1522).
47
+ // briefed on, so a review that read a different one can be told apart from one that read this one.
48
48
  async function head_commit(): Promise<string> {
49
49
  return await git_spawn.read(['rev-parse', 'HEAD'])
50
50
  }
@@ -53,9 +53,9 @@ async function head_commit(): Promise<string> {
53
53
  // same path; in a linked work tree the first is `<repo>/.git/worktrees/<name>` and the second is
54
54
  // `<repo>/.git`, and the commit-message file lives under the first. Asking git rather than assuming
55
55
  // a directory named `.git` is what makes a bare repository and a `--separate-git-dir` clone answer
56
- // correctly too (joshuafolkken/kit#1106).
56
+ // correctly too.
57
57
  // Exported so a caller that must ask the same question **synchronously** asks it with the same
58
- // arguments rather than a second spelling of them (joshuafolkken/kit#1864). `git_spawn` is
58
+ // arguments rather than a second spelling of them. `git_spawn` is
59
59
  // asynchronous throughout and a `PreToolUse` guard is synchronous by contract, so the one place that
60
60
  // needs it runs these arguments itself — sharing the list is what keeps that from becoming a clone.
61
61
  const GIT_DIRECTORY_ARGUMENTS: ReadonlyArray<string> = [
@@ -76,7 +76,7 @@ async function diff_cached(file_path: string): Promise<string> {
76
76
  }
77
77
 
78
78
  // One branch from `origin`, fetched by name. `gh pr checkout` did this itself after resolving the
79
- // head branch through GraphQL, which a cloud session is answered 403 for (joshuafolkken/kit#1022);
79
+ // head branch through GraphQL, which a cloud session is answered 403 for;
80
80
  // the resolution moved to REST and the fetch is spelled out here instead of being re-wrapped.
81
81
  //
82
82
  // The refspec is written out rather than left to the remote's configuration. A bare branch name is
@@ -84,61 +84,73 @@ async function diff_cached(file_path: string): Promise<string> {
84
84
  // clone, and every `actions/checkout` checkout, narrow it to one branch, and there a bare name
85
85
  // updates `FETCH_HEAD` alone. The `checkout` and the fast-forward that follow both read
86
86
  // `refs/remotes/origin/<branch>`, so naming the destination is what keeps them working off this
87
- // repository's own machine (joshuafolkken/kit#1029). `+` allows a forced update, matching what the
87
+ // repository's own machine. `+` allows a forced update, matching what the
88
88
  // default refspec does.
89
89
  async function fetch_branch(branch_name: string): Promise<string> {
90
90
  const refspec = `+refs/heads/${branch_name}:refs/remotes/origin/${branch_name}`
91
91
 
92
- return await git_spawn.read(['fetch', 'origin', refspec])
92
+ return await git_spawn.read_remote(['fetch', 'origin', refspec])
93
93
  }
94
94
 
95
95
  // The fast-forward `gh pr checkout` ran after its fetch, for the case the branch is already local.
96
96
  // Without it a second `josh sdp <pr>` run works on the commit the first one left behind: the pin
97
97
  // sync reads a stale `.github/workflows` and either reports "already in sync" or commits onto a base
98
- // that `push` then rejects (joshuafolkken/kit#1029).
98
+ // that `push` then rejects.
99
99
  //
100
100
  // `--ff-only` is the whole point — a branch that has diverged fails loudly rather than growing a
101
101
  // merge commit nobody asked for, which is the behavior the CLI had.
102
+ //
103
+ // It moves the working tree, so it runs the `post-merge` hook and takes a suite's budget for it.
102
104
  async function merge_fast_forward(branch_name: string): Promise<string> {
103
- return await git_spawn.read(['merge', '--ff-only', `origin/${branch_name}`])
105
+ return await git_spawn.read(['merge', '--ff-only', `origin/${branch_name}`], SUITE_TIMEOUT_MS)
104
106
  }
105
107
 
106
- // The same fast-forward for a branch that is *not* checked out, so no file in the working tree moves
107
- // (joshuafolkken/kit#2462). A plain refspec refuses a non-fast-forward update, and git refuses it
108
+ // The same fast-forward for a branch that is *not* checked out, so no file in the working tree moves.
109
+ // A plain refspec refuses a non-fast-forward update, and git refuses it
108
110
  // outright for a branch checked out in any work tree — both are failures, never a rewrite.
109
111
  async function fast_forward_local(branch_name: string): Promise<string> {
110
- return await git_spawn.read(['fetch', 'origin', `${branch_name}:${branch_name}`])
112
+ return await git_spawn.read_remote(['fetch', 'origin', `${branch_name}:${branch_name}`])
111
113
  }
112
114
 
113
115
  // The merge `josh main:merge` runs, and the deliberate opposite of the one above: **no `--ff-only`**,
114
- // because the branch it is called on has diverged whenever the command is worth typing at all
115
- // (joshuafolkken/kit#1659). Naming the strategy here is the whole fix — `git pull` decides it from
116
+ // because the branch it is called on has diverged whenever the command is worth typing at all.
117
+ // Naming the strategy here is the whole fix — `git pull` decides it from
116
118
  // `pull.rebase` / `pull.ff`, and with neither set it decides nothing and aborts.
117
119
  //
118
120
  // `with_output` rather than `read`: a merge that conflicts has to put git's own report in front of
119
121
  // the person, which is what the `git pull` this replaced did.
120
122
  //
121
123
  // `message` replaces git's default merge message, which carries no `#N` and is therefore refused
122
- // by the `commit-msg` hook on an issue branch (joshuafolkken/kit#2439).
124
+ // by the `commit-msg` hook on an issue branch.
125
+ //
126
+ // The budget is a suite's, not a local git command's: the merge commit runs the `commit-msg` hook,
127
+ // which is not git's own work.
123
128
  async function merge_branch(branch_name: string, message?: string): Promise<void> {
124
129
  const message_arguments = message === undefined ? [] : ['-m', message]
125
130
 
126
- await git_spawn.with_output('merge', [...message_arguments, `origin/${branch_name}`])
131
+ await git_spawn.with_output('merge', [...message_arguments, `origin/${branch_name}`], {
132
+ timeout_ms: SUITE_TIMEOUT_MS,
133
+ })
127
134
  }
128
135
 
136
+ // Both checkouts run the `post-checkout` hook — a `pnpm install` in some consumers — so they take the
137
+ // budget of a suite rather than a local git command's, which would end them inside that hook with the
138
+ // branch already created.
129
139
  async function checkout_b(branch_name: string): Promise<string> {
130
- return await git_spawn.read(['checkout', '-b', branch_name])
140
+ return await git_spawn.read(['checkout', '-b', branch_name], SUITE_TIMEOUT_MS)
131
141
  }
132
142
 
133
143
  async function checkout(branch_name: string): Promise<string> {
134
- return await git_spawn.read(['checkout', branch_name])
144
+ return await git_spawn.read(['checkout', branch_name], SUITE_TIMEOUT_MS)
135
145
  }
136
146
 
147
+ // A commit runs the `pre-commit` and `commit-msg` hooks — a type check among them — so it takes the
148
+ // budget of the suite those hooks may run rather than a local git command's.
137
149
  async function commit(message: string): Promise<void> {
138
- await git_spawn.with_output('commit', ['-m', message])
150
+ await git_spawn.with_output('commit', ['-m', message], { timeout_ms: SUITE_TIMEOUT_MS })
139
151
  }
140
152
 
141
- // **`-d` rather than `-D`, and that is the safety rather than a preference** (joshuafolkken/kit#1785).
153
+ // **`-d` rather than `-D`, and that is the safety rather than a preference**.
142
154
  // The one caller is a rollback that removes a branch it created moments earlier, so `-d`'s refusal to
143
155
  // delete a branch holding an unmerged commit is exactly the net it wants: a rollback can never be the
144
156
  // thing that destroys a commit.
@@ -148,7 +160,7 @@ async function delete_branch(branch_name: string): Promise<void> {
148
160
 
149
161
  // How many commits `tip` holds that `base` does not. **`0` is the answer that distinguishes a flush
150
162
  // branch carrying the only copy of an appended line from one an aborted flush merely left behind**,
151
- // and the two get opposite advice (joshuafolkken/kit#1785).
163
+ // and the two get opposite advice.
152
164
  // **Output that is not a count throws rather than parsing to `0`.** `Number('')` is `0`, and `0` is
153
165
  // the answer that says a branch holds nothing — so a read that came back empty or unparseable would
154
166
  // report "nothing is stranded" about a branch nobody measured, which is the one wrong answer that
@@ -180,8 +192,9 @@ function is_upstream_not_set_error(error: unknown): boolean {
180
192
  const NO_VERIFY_FLAG = '--no-verify'
181
193
 
182
194
  // Both pushes go through `git_push_transport` rather than `git_spawn.with_output`, which is
183
- // what gives them a timeout and an SSH keepalive the local git commands beside them do not need
184
- // (joshuafolkken/kit#1251). The thrown error keeps the same `cause.exit_code` shape, so the 128
195
+ // what gives them a transfer's timeout and an SSH keepalive the local git commands beside them do not
196
+ // need.
197
+ // The thrown error keeps the same `cause.exit_code` shape, so the 128
185
198
  // fallback below reads it exactly as it did.
186
199
  async function push_with_upstream(
187
200
  branch_name: string,
@@ -190,8 +203,8 @@ async function push_with_upstream(
190
203
  await git_push_transport.push([...verify_flags, '--set-upstream', 'origin', branch_name])
191
204
  }
192
205
 
193
- // **The push budget bounds the transfer alone** (joshuafolkken/kit#3300). The pre-push hook runs once,
194
- // unbounded, before either push and outside the `try`; both transfers then skip it with `--no-verify`,
206
+ // **The push budget bounds the transfer alone**. The pre-push hook runs once,
207
+ // on a suite's budget of its own, before either push and outside the `try`; both transfers then skip it with `--no-verify`,
195
208
  // so neither the timeout retry nor the `--set-upstream` fallback repeats it, and a failed hook is not
196
209
  // mistaken for a missing upstream. A git too old to run the hook ahead leaves it to the push, as before.
197
210
  async function push(): Promise<void> {
@@ -212,15 +225,14 @@ async function push(): Promise<void> {
212
225
  }
213
226
  }
214
227
 
215
- // **`--ff-only` is named here rather than read out of whoever's git configuration is in force**
216
- // (joshuafolkken/kit#1683). A bare `git pull` decides its strategy from `pull.rebase` / `pull.ff`,
228
+ // **`--ff-only` is named here rather than read out of whoever's git configuration is in force**.
229
+ // A bare `git pull` decides its strategy from `pull.rebase` / `pull.ff`,
217
230
  // and with neither set — the state of a checkout nobody has configured — it decides nothing and
218
231
  // aborts the moment the two sides have each moved:
219
232
  //
220
233
  // fatal: Need to specify how to reconcile divergent branches
221
234
  //
222
- // This is joshuafolkken/kit#1659's defect at the second of that issue's two `git pull` sites, left
223
- // there deliberately because the callers and the conditions differ. Every caller turns out to want
235
+ // Every caller wants
224
236
  // the same thing: it is on the default branch, bringing it up to date before doing something else —
225
237
  // `main-sync.ts` for `josh ms`, `release-cli.ts` / `release-publish.ts` around the release pull
226
238
  // request, `scripts-ai/prep.ts` before it snapshots the overrides, and `git-branch.ts` →
@@ -237,7 +249,7 @@ async function pull_fast_forward(): Promise<void> {
237
249
  // Every local branch matching a `git branch --list` pattern, one name per line. The boolean below is
238
250
  // this same read, expressed on top of it rather than beside it: `run:hold`'s preflight check needs the name
239
251
  // itself, because the pull request an interrupted run left behind is keyed by its head branch and the
240
- // slug is not derivable from an issue number alone (joshuafolkken/kit#926).
252
+ // slug is not derivable from an issue number alone.
241
253
  const SHORT_NAME_FORMAT = '--format=%(refname:short)'
242
254
  const REMOTES_FLAG = '--remotes'
243
255
 
@@ -286,7 +298,7 @@ function exclude_pathspec(file_path: string): string {
286
298
  return `:(exclude,top)${file_path}`
287
299
  }
288
300
 
289
- // Every tracked modification, minus the paths the caller names (joshuafolkken/kit#1756). **The
301
+ // Every tracked modification, minus the paths the caller names. **The
290
302
  // positive pathspec is not decoration**: a pathspec list made only of exclusions matches nothing at
291
303
  // all, so `ALL_PATHS_PATHSPEC` is what the exclusions are subtracted from. The one caller is
292
304
  // `git-staging.ts`, which keeps the observation ledger out of every ordinary commit.
@@ -302,18 +314,18 @@ async function add_path(file_path: string): Promise<void> {
302
314
 
303
315
  // Main's own line of history. Both reads below restrict themselves to it, and for one reason: a
304
316
  // child's commits are merged into main rather than being main's, so a walk that follows every parent
305
- // answers about everything ever merged instead of about main (joshuafolkken/kit#1169).
317
+ // answers about everything ever merged instead of about main.
306
318
  const FIRST_PARENT_FLAG = '--first-parent'
307
319
 
308
320
  // The commits that touched `file_path` along `tip`'s own first-parent line, newest first.
309
321
  // **`--first-parent` is what keeps the answer about main's history rather than about everything ever
310
322
  // merged into it**: a child's own commits are not main's, and the version question
311
- // (joshuafolkken/kit#1169) is asked of main.
323
+ // is asked of main.
312
324
  //
313
325
  // **`tip` is not decoration.** `--first-parent` only reads as "main's line" when the walk starts on
314
326
  // main; started on a feature branch it walks that branch's commits first, and any merge main took
315
327
  // after the branch was cut is not an ancestor at all. A caller that is not on main names the ref it
316
- // means — `origin/main`, say — rather than inheriting `HEAD` (joshuafolkken/kit#1486).
328
+ // means — `origin/main`, say — rather than inheriting `HEAD`.
317
329
  async function log_first_parent(
318
330
  limit: number,
319
331
  file_path: string,
@@ -344,7 +356,7 @@ async function show_file(spec: string): Promise<string> {
344
356
  // merges made *inside* a pull request branch — GitHub's "Update branch" button, or a local
345
357
  // `git merge main` before pushing. Measured on this repository, `HEAD~200..HEAD` counts 201 merges
346
358
  // unrestricted and 200 along the first-parent line, so one such merge is already in the last two
347
- // hundred commits and would have inflated a release by a whole minor (joshuafolkken/kit#1169).
359
+ // hundred commits and would have inflated a release by a whole minor.
348
360
  const MERGE_COUNT_ARGUMENTS: ReadonlyArray<string> = [
349
361
  'rev-list',
350
362
  '--count',
@@ -374,8 +386,8 @@ const git_command = {
374
386
  head_commit,
375
387
  git_directories,
376
388
  diff_cached,
377
- // The default branch, the change base and every reading against it are `git-diff-reads.ts`'s
378
- // (joshuafolkken/kit#3264), re-exported here so no call site, mock or spy moved with them.
389
+ // The default branch, the change base and every reading against it are `git-diff-reads.ts`'s,
390
+ // re-exported here so no call site, mock or spy moved with them.
379
391
  ...git_diff_reads,
380
392
  fetch_branch,
381
393
  merge_fast_forward,
@@ -3,7 +3,7 @@ import { git_utilities } from './constants'
3
3
  import { git_command } from './git-command'
4
4
  import { git_location_environment, GIT_LOCATION_VARIABLES } from './git-location-environment'
5
5
 
6
- // The one synchronous read of a checkout's two git directories (joshuafolkken/kit#2986) — the same
6
+ // The one synchronous read of a checkout's two git directories — the same
7
7
  // `GIT_DIRECTORY_ARGUMENTS` `git_command.git_directories` asks asynchronously, so the two spellings
8
8
  // cannot name different directories. It had been run in three places with three timeouts and no
9
9
  // memory of the answer, though a `PreToolUse` hook may ask it several times in one call.
@@ -20,8 +20,8 @@ const PROBE_TIMEOUT_MS = 5000
20
20
  const answers = new Map<string, ReadonlyArray<string>>()
21
21
 
22
22
  // With an explicit `cwd`, the git location variables are cleared so that directory is what git answers
23
- // for: a hook exports `GIT_DIR`, which beats `cwd` and would name the hook's checkout instead
24
- // (joshuafolkken/kit#2515). Without one the environment is kept, so the read resolves the same
23
+ // for: a hook exports `GIT_DIR`, which beats `cwd` and would name the hook's checkout instead.
24
+ // Without one the environment is kept, so the read resolves the same
25
25
  // checkout as the asynchronous `git_directories`.
26
26
  function probe_environment(cwd: string | undefined): NodeJS.ProcessEnv {
27
27
  if (cwd === undefined) return process.env
@@ -1,8 +1,8 @@
1
1
  import { git_spawn } from './git-spawn'
2
2
 
3
3
  // The default branch, the base a change is measured against, and every "changed" reading taken
4
- // against that base — split out of `git-command.ts` when it reached its line limit
5
- // (joshuafolkken/kit#3264). `git_command` re-exports each one under the name it always had, so the
4
+ // against that base — split out of `git-command.ts` when it reached its line limit.
5
+ // `git_command` re-exports each one under the name it always had, so the
6
6
  // move changed no call site and no suite that mocks or spies on `git_command`.
7
7
 
8
8
  const REFS_REMOTES_ORIGIN_PREFIX = 'refs/remotes/origin/'
@@ -26,8 +26,8 @@ async function get_default_branch(): Promise<string> {
26
26
 
27
27
  const MERGE_BASE_COMMAND = 'merge-base'
28
28
 
29
- // **The ref the default branch is actually at**, which is not the same thing as its name
30
- // (joshuafolkken/kit#1535). `get_default_branch` returns the bare name, and git resolves that to the
29
+ // **The ref the default branch is actually at**, which is not the same thing as its name.
30
+ // `get_default_branch` returns the bare name, and git resolves that to the
31
31
  // *local* `refs/heads/<default>` — a ref nothing in this workflow advances, because merges happen on
32
32
  // GitHub and the default branch is checked out in no work tree. This is the single source both the
33
33
  // lane's start point and `change_base` below resolve through, so a lane cut from
@@ -59,7 +59,7 @@ async function default_branch_reference(): Promise<string> {
59
59
  // against, in place of the default branch itself.
60
60
  //
61
61
  // **A two-dot `git diff <default-branch>` compares a moving *ref* to the working tree, and in a
62
- // linked work tree that ref is shared with every other lane** (joshuafolkken/kit#1527). So when one
62
+ // linked work tree that ref is shared with every other lane**. So when one
63
63
  // lane merges, an unmerged lane's diff picks that lane's files up in reverse: files this branch
64
64
  // never touched arrive in `josh review:brief`'s target list, in the digest map `josh gate` stamps,
65
65
  // and in `josh review:round2`'s fix delta.
@@ -96,24 +96,24 @@ async function diff_main(file_path: string): Promise<string> {
96
96
 
97
97
  // Names only, for callers that classify a change rather than read it — `josh review:level` decides
98
98
  // the review depth from the paths alone, and reading the whole diff to get them would be the
99
- // expensive half of the thing it exists to make cheaper (joshuafolkken/kit#966).
99
+ // expensive half of the thing it exists to make cheaper.
100
100
  //
101
101
  // `core.quotePath=false` is not cosmetic. With git's default, a path containing any non-ASCII byte
102
102
  // comes back C-quoted — `"prompts/\343\202\263.md"` — and a classifier testing `startsWith('prompts/')`
103
103
  // against a string that begins with a quote character answers no. `review:level` fails safe there
104
104
  // (non-inert wins), but a classifier that answered `skip` would drop a change it is meant to catch,
105
- // so the quoting is turned off at the source every reader shares (joshuafolkken/kit#907).
105
+ // so the quoting is turned off at the source every reader shares.
106
106
  const NO_PATH_QUOTING: ReadonlyArray<string> = ['-c', 'core.quotePath=false']
107
107
 
108
108
  // Repository-root-relative paths, whatever the checkout is configured to prefer. `diff.relative` is
109
109
  // a per-repository setting a person may have turned on for their own reading, and with it `git diff
110
110
  // --name-only` run from a subdirectory prints cwd-relative paths — which every caller of this
111
- // reading then joins onto the repository root (joshuafolkken/kit#1257). The flag pins the spelling
111
+ // reading then joins onto the repository root. The flag pins the spelling
112
112
  // at the source rather than leaving each caller to discover the configuration.
113
113
  const NO_RELATIVE_PATHS = '--no-relative'
114
114
 
115
115
  // **Rename detection is turned off because this listing is a description of a tree, not a summary of
116
- // a change** (joshuafolkken/kit#1533). With git's default `diff.renames=true`, a rename prints only
116
+ // a change**. With git's default `diff.renames=true`, a rename prints only
117
117
  // its *destination*: `git diff --name-only <base>` across a commit that moved `scripts/init-logic.ts`
118
118
  // to `scripts/init/init-logic.ts` names the second path and never the first.
119
119
  //
@@ -139,10 +139,9 @@ const NO_RENAME_DETECTION = '--no-renames'
139
139
  // The commit `change_base` resolves to. Every "changed" reading below is a diff against it, so a set
140
140
  // of changed paths — or a map of their digests — means nothing without it: fetch an advanced default
141
141
  // branch and rebase onto it, and each digest can stay identical while the rest of the tree is
142
- // replaced by code no check has read (joshuafolkken/kit#1328). A rebase still invalidates a stamp
142
+ // replaced by code no check has read. A rebase still invalidates a stamp
143
143
  // taken against it — the rebase moves `HEAD`, and with it the merge base — while another lane
144
- // merging into the shared default branch no longer does, because it moves neither
145
- // (joshuafolkken/kit#1527).
144
+ // merging into the shared default branch no longer does, because it moves neither.
146
145
  async function change_base_commit(): Promise<string> {
147
146
  return await git_spawn.read(['rev-parse', await change_base()])
148
147
  }
@@ -187,10 +186,10 @@ async function diff_main_numstat(): Promise<string> {
187
186
 
188
187
  // Files git is not tracking yet. `git diff` never lists them, so a classifier built on the diff
189
188
  // alone sees a change that adds a whole new module as an empty one — which is how a run adding new
190
- // code could have been handed a reduced review level (joshuafolkken/kit#966).
189
+ // code could have been handed a reduced review level.
191
190
  //
192
- // **`--full-name` and the `:/` pathspec are what make this reading agree with the diff beside it**
193
- // (joshuafolkken/kit#1257). `git diff --name-only` prints repository-root-relative paths for the
191
+ // **`--full-name` and the `:/` pathspec are what make this reading agree with the diff beside it**.
192
+ // `git diff --name-only` prints repository-root-relative paths for the
194
193
  // whole tree wherever it is run; `git ls-files --others` prints *cwd*-relative paths and lists only
195
194
  // what is below cwd. Read from a subdirectory, the two halves of `changed_paths` therefore came
196
195
  // back in two different coordinate systems, and every caller that resolves a path against the
@@ -37,7 +37,7 @@ function display_error_details(cause: unknown): void {
37
37
  const FAILURE_EXIT_CODE = 1
38
38
  const OPERATION_CANCELLED_MESSAGE = '💡 Operation cancelled.'
39
39
 
40
- // **A library refuses by throwing; only the CLI entry decides the exit code** (joshuafolkken/kit#2985).
40
+ // **A library refuses by throwing; only the CLI entry decides the exit code**.
41
41
  // `process.exit()` from an imported module skips every `finally` above it (a lock release included)
42
42
  // and truncates a piped stdout, so these modules throw a typed error instead, and `handle` — the catch
43
43
  // at each entry — renders it and sets `process.exitCode`.
@@ -14,8 +14,7 @@ function get_exit_code(error: unknown): number | undefined {
14
14
  // had printed one line first would otherwise be reported as whatever that line happened to say.
15
15
  //
16
16
  // It lives here rather than beside either caller because both `gh` and `git push` now pass a
17
- // timeout, and a second copy of the same three lines is the duplication `CLAUDE.md` prohibits
18
- // (joshuafolkken/kit#1251).
17
+ // timeout, and a second copy of the same three lines is the duplication `CLAUDE.md` prohibits.
19
18
  function has_timed_out(error: unknown): boolean {
20
19
  if (typeof error !== 'object' || error === null || !('timedOut' in error)) return false
21
20
 
@@ -1,4 +1,6 @@
1
1
  import { git_gh_issue_read } from '#scripts/gh/git-gh-issue-read'
2
+ import { issue_cite } from '#scripts/issue/issue-cite'
3
+ import { session_cite } from '#scripts/issue/session-cite'
2
4
  import { lane_paths } from '#scripts/lane/lane-paths'
3
5
  import { SEPARATOR_LINE } from './constants'
4
6
  import { git_prompt } from './git-prompt'
@@ -52,7 +54,7 @@ function parse_issue_input(input: string): IssueInfo {
52
54
  const issue_number = extract_issue_number(trimmed_input)
53
55
  const title = extract_issue_title(trimmed_input)
54
56
  const branch_name = create_branch_name(issue_number, title)
55
- const commit_message = `${title} #${issue_number}`
57
+ const commit_message = `${title} ${issue_cite.plain(issue_number)}`
56
58
 
57
59
  return {
58
60
  title,
@@ -64,10 +66,10 @@ function parse_issue_input(input: string): IssueInfo {
64
66
 
65
67
  const BRANCH_NUMBER_PATTERN = /^(\d+)-(.+)$/u
66
68
 
67
- // A lane's branch is `<N>-lane` (joshuafolkken/kit#1490), so its second segment is the fixed word
68
- // `lane` rather than a slug of the title — de-slugging it produced commit messages like `lane #1465`
69
- // on joshuafolkken/kit#1586. The shape is recognized through `lane_paths.lane_branch` rather than a
70
- // second copy of the suffix, so the two ends cannot drift apart (joshuafolkken/kit#1590).
69
+ // A lane's branch is `<N>-lane`, so its second segment is the fixed word
70
+ // `lane` rather than a slug of the title — de-slugging it would produce commit messages like
71
+ // `lane #1465`. The shape is recognized through `lane_paths.lane_branch` rather than a
72
+ // second copy of the suffix, so the two ends cannot drift apart.
71
73
  function is_lane_branch(branch_name: string, issue_number: string): boolean {
72
74
  return branch_name === lane_paths.lane_branch(issue_number)
73
75
  }
@@ -75,7 +77,7 @@ function is_lane_branch(branch_name: string, issue_number: string): boolean {
75
77
  const EXAMPLE_ISSUE_NUMBER = '42'
76
78
 
77
79
  function argument_hint(issue_number: string): string {
78
- return `Provide an issue argument like "title #${issue_number}".`
80
+ return `Provide an issue argument like "title ${issue_cite.plain(issue_number)}".`
79
81
  }
80
82
 
81
83
  // Never falls back to the branch's own word: `lane` is not a title, and a commit message cannot be
@@ -85,7 +87,7 @@ async function lane_issue_title(branch_name: string, issue_number: string): Prom
85
87
 
86
88
  if (title === undefined) {
87
89
  throw new Error(
88
- `Cannot read the title of issue #${issue_number} for lane branch "${branch_name}". ${argument_hint(issue_number)}`,
90
+ `Cannot read the title of issue ${session_cite.issue(issue_number)} for lane branch "${branch_name}". ${argument_hint(issue_number)}`,
89
91
  )
90
92
  }
91
93
 
@@ -110,7 +112,7 @@ async function derive_issue_input_from_branch(branch_name: string): Promise<stri
110
112
  ? await lane_issue_title(branch_name, number)
111
113
  : slug.replaceAll('-', ' ').trim()
112
114
 
113
- return `${title} #${number}`
115
+ return `${title} ${issue_cite.plain(number)}`
114
116
  }
115
117
 
116
118
  async function derive_from_branch(branch_name: string): Promise<IssueInfo> {
@@ -4,11 +4,10 @@
4
4
  // git exports them to every hook it runs, so a child process spawned from inside `pre-commit` or
5
5
  // `pre-push` inherits a pointer at the repository the hook is firing in. A helper that passes
6
6
  // `{ cwd: fixture_directory }` and nothing else therefore writes into the **real** checkout, with no
7
- // error anywhere: joshuafolkken/kit#1515 found it in `propagate-git`'s probes, and
8
- // joshuafolkken/kit#1530 found the same shape in `lane-change-base.test.ts`, where it committed a
9
- // test fixture's own commits onto a lane's live branch during the pre-push gate.
7
+ // error anywhere — a test fixture's own commits can land on a lane's live branch during the pre-push
8
+ // gate.
10
9
  //
11
- // The list is single-sourced here because it now has three consumers that must not drift apart: the
10
+ // The list is single-sourced here because it has three consumers that must not drift apart: the
12
11
  // probes that clear it, the fixture that clears it, and the unit-suite guard that refuses a write
13
12
  // while any of it is set (`scripts/test/test-repository-guard.ts`).
14
13
  //
@@ -1,8 +1,7 @@
1
- // How origin is asked whether it carries a branch — the one place that says it
2
- // (joshuafolkken/kit#1732).
1
+ // How origin is asked whether it carries a branch — the one place that says it.
3
2
  //
4
3
  // **The pattern is the full ref path, because `ls-remote` matches a pattern against the *tail* of a
5
- // ref at a slash boundary** (joshuafolkken/kit#1709). A bare name therefore answers for any branch
4
+ // ref at a slash boundary**. A bare name therefore answers for any branch
6
5
  // ending in it: `1641-lane` matches `refs/heads/wip/1641-lane`, and `release/v1.2.0` matches
7
6
  // `refs/heads/foo/release/v1.2.0`. **`--heads` does not close it** — that limits which refs are
8
7
  // considered, not where inside one the pattern may match. Anchored at `refs/heads/`, only the exact
@@ -11,11 +10,10 @@
11
10
  // slash.
12
11
  //
13
12
  // **It is the arguments that are shared, not the spawn.** `git_worktree.ls_remote_branch` runs this
14
- // asynchronously against the process's own cwd with no timeout, while
15
- // `propagate_git.has_remote_branch` runs it synchronously against a consumer's path under a remote
16
- // budget — three differences that belong to those callers. What was duplicated is the knowledge
17
- // above, and joshuafolkken/kit#1709 fixed it in only one of the two places, which is the defect
18
- // joshuafolkken/kit#1732 was filed for. Kept in one module, the next such fix reaches both.
13
+ // asynchronously against the process's own cwd, while `propagate_git.has_remote_branch` runs it
14
+ // synchronously against a consumer's path — both under a remote budget, and two differences that
15
+ // belong to those callers. What is shared is the knowledge above:
16
+ // kept in one module, a fix to it reaches both.
19
17
  const LS_REMOTE_COMMAND = 'ls-remote'
20
18
  const HEADS_FLAG = '--heads'
21
19
  const ORIGIN_REMOTE = 'origin'
@@ -1,9 +1,10 @@
1
1
  import { mkdtemp, rm, writeFile } from 'node:fs/promises'
2
2
  import { tmpdir } from 'node:os'
3
3
  import path from 'node:path'
4
+ import { SUITE_TIMEOUT_MS } from '#scripts/lib/timeouts'
4
5
  import { git_spawn } from './git-spawn'
5
6
 
6
- // The pre-push hook, run ahead of the push instead of inside it (joshuafolkken/kit#3300).
7
+ // The pre-push hook, run ahead of the push instead of inside it.
7
8
  //
8
9
  // **The push budget is a transfer budget, and a hook is not a transfer.** `PUSH_TIMEOUT_MS` was read
9
10
  // off what moving objects costs here, but `git push` runs the pre-push hook first and the budget
@@ -13,9 +14,10 @@ import { git_spawn } from './git-spawn'
13
14
  // either: lefthook and vitest outlived it, and the retry started a second suite in the same work tree,
14
15
  // where each `test-state-guard` read the other's temporary files as a mutation and both failed.
15
16
  //
16
- // So the hook runs here, once, with no budget, and `git_command.push` spawns the bounded transfer that
17
- // follows with `--no-verify`. The retry then repeats the transfer alone, and a hook that is still
18
- // running cannot exist for it to overlap.
17
+ // So the hook runs here, once, on a suite's budget rather than a transfer's, and `git_command.push`
18
+ // spawns the bounded transfer that follows with `--no-verify`. The retry then repeats the transfer
19
+ // alone, and a hook that is still running cannot exist for it to overlap: a hook cut at
20
+ // `SUITE_TIMEOUT_MS` fails the push instead of reaching the transfer.
19
21
  //
20
22
  // **What git hands the hook is reproduced rather than dropped.** `git hook run` executes whatever
21
23
  // hook is configured — lefthook's or anyone's — and the arguments and stdin are git's pre-push
@@ -108,12 +110,11 @@ async function run_with_stdin(stdin_line: string): Promise<boolean> {
108
110
  if (!(await can_run_hooks(stdin_path))) return false
109
111
  const url = await git_spawn.read(['remote', 'get-url', REMOTE])
110
112
 
111
- await git_spawn.with_output('hook', [
112
- ...to_hook_run_arguments(stdin_path, HOOK_NAME),
113
- '--',
114
- REMOTE,
115
- url,
116
- ])
113
+ await git_spawn.with_output(
114
+ 'hook',
115
+ [...to_hook_run_arguments(stdin_path, HOOK_NAME), '--', REMOTE, url],
116
+ { timeout_ms: SUITE_TIMEOUT_MS },
117
+ )
117
118
 
118
119
  return true
119
120
  } finally {
@@ -7,10 +7,10 @@ import { git_branch } from './git-branch'
7
7
  import { git_command } from './git-command'
8
8
  import { git_issue, type IssueInfo } from './git-issue'
9
9
 
10
- // joshuafolkken/kit#2817. A first `josh git -y` was refused once per unmet precondition — the title's
11
- // issue number, the branch name, the issue's release classification — each only after the stage
12
- // before it had already staged, switched or pushed. **Every precondition decidable at the start is
13
- // asked here, before anything changes, and all of them are reported at once.** No rule is new: each
10
+ // A later stage of `josh git -y` refuses on an unmet precondition — the title's issue number, the
11
+ // branch name, the issue's release classification — only after the stage before it has already
12
+ // staged, switched or pushed. **Every precondition decidable at the start is asked here, before
13
+ // anything changes, and all of them are reported at once.** No rule is new: each
14
14
  // answer comes from the function the later stage refuses with, so the two cannot drift apart.
15
15
 
16
16
  interface PreflightInput {
@@ -131,7 +131,7 @@ async function answer(input: PreflightInput): Promise<PreflightAnswer> {
131
131
  return { pr_target, problems: [...problems, ...pr_problems] }
132
132
  }
133
133
 
134
- // joshuafolkken/kit#2946: the unmet preconditions as a list, so `josh ship` can ask them before its
134
+ // The unmet preconditions as a list, so `josh ship` can ask them before its
135
135
  // review and gate start instead of meeting the refusal at the commit stage.
136
136
  async function problems_of(input: PreflightInput): Promise<Array<string>> {
137
137
  const { problems } = await answer(input)
@@ -10,8 +10,8 @@ import { git_ssh_keepalive } from './git-ssh-keepalive'
10
10
 
11
11
  const MS_PER_SECOND = 1000
12
12
 
13
- // The budget for one `git push`, and the reason a push can no longer wait without end
14
- // (joshuafolkken/kit#1251). Measured on PR #1244: the commit itself took 0.6 seconds and the push
13
+ // The budget for one `git push`, and the reason a push can no longer wait without end.
14
+ // Measured on PR #1244: the commit itself took 0.6 seconds and the push
15
15
  // then sat silent for 8 minutes 13 seconds before it was found by hand and killed — about 9 minutes
16
16
  // 50 seconds of a 72-minute run, with no way while waiting to tell a stalled push from a slow one.
17
17
  // `execa` has always accepted a `timeout`; the push path never passed one, which left it the single
@@ -1,7 +1,6 @@
1
1
  import { git_worktree } from './git-worktree'
2
2
 
3
- // Does origin still have this branch, and could we even tell? (joshuafolkken/kit#1641; lifted out of
4
- // `scripts/lane/lane-start-point.ts`, which asked the question first.)
3
+ // Does origin still have this branch, and could we even tell?
5
4
  //
6
5
  // **The remote-tracking ref is not evidence that the remote still has the branch.** Nothing here
7
6
  // prunes it — `lane:close` removes the work tree and the local branch, GitHub deletes the remote