@joshuafolkken/kit 1.1240.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 (934) 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 +19 -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 +26 -16
  27. package/.claude/skills/workflow-commands/latest-gate.md +17 -28
  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/.vscode/tasks.json +14 -0
  42. package/CLAUDE.md +10 -61
  43. package/README.md +29 -47
  44. package/SECURITY.md +1 -1
  45. package/dist/CLAUDE.md +10 -61
  46. package/dist/commands/document-section-cli.js +42 -10
  47. package/dist/config-merge/index.js +11 -2
  48. package/dist/hooks/audit-provision.js +2 -2
  49. package/dist/hooks/batch-guard.js +7 -7
  50. package/dist/hooks/{chunk-KHGB5S3Y.js → chunk-43G45XJF.js} +18 -20
  51. package/dist/hooks/{chunk-4TZVB44A.js → chunk-4TW4MQUL.js} +284 -362
  52. package/dist/hooks/{chunk-XZYKEM6J.js → chunk-76RK6E3H.js} +13 -11
  53. package/dist/hooks/{chunk-F3ELQ2AF.js → chunk-DZWZ3DKY.js} +4 -4
  54. package/dist/hooks/{chunk-5VNDSNG3.js → chunk-FZ6FUSBM.js} +1 -1
  55. package/dist/hooks/{chunk-GPTFMK5E.js → chunk-GG72ANKI.js} +1 -1
  56. package/dist/hooks/{chunk-ZQGD4GBY.js → chunk-KPM4YIIX.js} +8 -44
  57. package/dist/hooks/chunk-MXVQMLDP.js +3705 -0
  58. package/dist/hooks/{chunk-ELCN5LCH.js → chunk-NEC4AT4Z.js} +34 -12
  59. package/dist/hooks/{chunk-QVSWU24O.js → chunk-NZBHG6FW.js} +7 -5
  60. package/dist/hooks/chunk-NZN2UFI6.js +2409 -0
  61. package/dist/hooks/{chunk-KRBERBBI.js → chunk-R6CRQEAL.js} +4 -4
  62. package/dist/hooks/chunk-SYSRHRWU.js +1589 -0
  63. package/dist/hooks/{chunk-WK2XSHSI.js → chunk-TLJYAGZK.js} +549 -874
  64. package/dist/hooks/chunk-Z5TMJIPW.js +45 -0
  65. package/dist/hooks/codex-hook-adapter.js +26 -21
  66. package/dist/hooks/duplicate-read-guard.js +8 -8
  67. package/dist/hooks/format-edited.js +4 -4
  68. package/dist/hooks/inputs.json +216 -202
  69. package/dist/hooks/investigation-guard.js +8 -8
  70. package/dist/hooks/pretool-guard.js +15 -15
  71. package/dist/hooks/session-lang.js +406 -8
  72. package/dist/hooks/stop-guard.js +122 -187
  73. package/dist/josh.js +281 -94
  74. package/dist/version/index.js +15 -13
  75. package/eslint/base.js +43 -5
  76. package/eslint/rules/english-only-prose.js +3 -3
  77. package/eslint/rules/import.js +12 -0
  78. package/eslint/rules/namespace-object-export.js +2 -2
  79. package/package.json +16 -10
  80. package/pnpm-workspace.yaml +2 -4
  81. package/prompts/coding-standards.md +14 -48
  82. package/prompts/collaboration-workflow/file-edits.md +1 -1
  83. package/prompts/collaboration-workflow/issue-citation.md +1 -1
  84. package/prompts/collaboration-workflow/issue-template.md +3 -10
  85. package/prompts/collaboration-workflow/operating-rules.md +7 -8
  86. package/prompts/collaboration-workflow/output-bounds.md +1 -1
  87. package/prompts/collaboration-workflow/overview.md +1 -1
  88. package/prompts/collaboration-workflow/plan-comment.md +2 -1
  89. package/prompts/collaboration-workflow/principles.md +21 -3
  90. package/prompts/collaboration-workflow/report-format.md +16 -29
  91. package/prompts/collaboration-workflow/residency.md +1 -1
  92. package/prompts/collaboration-workflow/rule-delivery.md +7 -95
  93. package/prompts/collaboration-workflow/shell-body.md +3 -23
  94. package/prompts/collaboration-workflow/turn-batching.md +4 -13
  95. package/prompts/collaboration-workflow/wip-cap.md +5 -11
  96. package/prompts/refactoring.md +1 -1
  97. package/prompts/review-rubric.md +3 -22
  98. package/prompts/review.md +15 -38
  99. package/prompts/testing-guide.md +2 -4
  100. package/scripts/adopt/adopt-logic.ts +5 -5
  101. package/scripts/adopt/adopt-toolkits.ts +4 -5
  102. package/scripts/adopt/adopt.ts +2 -3
  103. package/scripts/agent/agent-argv.ts +7 -7
  104. package/scripts/agent/agent-diagnostics.ts +2 -2
  105. package/scripts/agent/agent-exit-record.ts +1 -1
  106. package/scripts/agent/agent-headless.ts +1 -1
  107. package/scripts/agent/agent-launch-environment.ts +6 -1
  108. package/scripts/agent/agent-role-profile.ts +49 -22
  109. package/scripts/agent/agent-session-role.ts +32 -0
  110. package/scripts/agent/api-outage.ts +1 -1
  111. package/scripts/agent/claude-agent-argv.ts +4 -4
  112. package/scripts/agent/claude-result-event.ts +4 -4
  113. package/scripts/agent/codex-hooks.ts +2 -2
  114. package/scripts/agent/interactive-ask.ts +3 -6
  115. package/scripts/auto-ok/auto-ok-cli.ts +46 -60
  116. package/scripts/backlog/backlog-arrival-added.ts +34 -0
  117. package/scripts/backlog/backlog-arrival.ts +54 -17
  118. package/scripts/backlog/backlog-budget-cli.ts +34 -6
  119. package/scripts/backlog/backlog-budget.ts +17 -24
  120. package/scripts/backlog/backlog-defect-priority.ts +1 -1
  121. package/scripts/backlog/backlog-drive-args.ts +5 -4
  122. package/scripts/backlog/backlog-drive-cli.ts +14 -10
  123. package/scripts/backlog/backlog-drive-epic.ts +85 -0
  124. package/scripts/backlog/backlog-drive-launch.ts +1 -1
  125. package/scripts/backlog/backlog-drive-named-offer.ts +60 -9
  126. package/scripts/backlog/backlog-drive-named.ts +39 -9
  127. package/scripts/backlog/backlog-drive-offer-argv.ts +1 -1
  128. package/scripts/backlog/backlog-drive-restore.ts +1 -1
  129. package/scripts/backlog/backlog-drive-retrospective.ts +2 -2
  130. package/scripts/backlog/backlog-drive.ts +43 -28
  131. package/scripts/backlog/backlog-idle.ts +88 -0
  132. package/scripts/backlog/backlog-named.ts +11 -15
  133. package/scripts/backlog/backlog-next.ts +26 -30
  134. package/scripts/backlog/backlog-offer-cli.ts +28 -23
  135. package/scripts/backlog/backlog-offer.ts +7 -7
  136. package/scripts/backlog/backlog-overlap.ts +178 -0
  137. package/scripts/backlog/backlog-plan-cli.ts +14 -90
  138. package/scripts/backlog/backlog-plan-read.ts +111 -0
  139. package/scripts/backlog/backlog-plan.ts +11 -10
  140. package/scripts/backlog/backlog-pool.ts +13 -14
  141. package/scripts/backlog/backlog-rank.ts +11 -11
  142. package/scripts/backlog/backlog-ready.ts +15 -10
  143. package/scripts/backlog/backlog-scope.ts +14 -15
  144. package/scripts/backlog/backlog-stalled-cli.ts +2 -2
  145. package/scripts/backlog/backlog-stalled-detect.ts +4 -4
  146. package/scripts/backlog/backlog-stalled.ts +5 -6
  147. package/scripts/backlog/backlog-waves.ts +4 -4
  148. package/scripts/backlog/backlogrun-args.ts +74 -0
  149. package/scripts/backlog/backlogrun-cli.ts +113 -0
  150. package/scripts/backlog/backlogrun-launch.ts +178 -0
  151. package/scripts/behavior/behavior-assertion.ts +6 -8
  152. package/scripts/behavior/behavior-cli.ts +1 -1
  153. package/scripts/behavior/behavior-rules.ts +3 -3
  154. package/scripts/build/build-claude-md.ts +4 -4
  155. package/scripts/build/build-codex-hooks.ts +2 -2
  156. package/scripts/build/build-commands.ts +1 -1
  157. package/scripts/build/build-hooks.ts +5 -5
  158. package/scripts/build/build.ts +1 -1
  159. package/scripts/build/hook-bundle-stamp.ts +109 -7
  160. package/scripts/build/local-bin.ts +2 -2
  161. package/scripts/cases/cases-cli.ts +1 -1
  162. package/scripts/cases/cases-logic.ts +2 -2
  163. package/scripts/ci/composite-actions.ts +1 -2
  164. package/scripts/ci/pr-classification.ts +2 -2
  165. package/scripts/claude/workflow-destination.ts +1 -1
  166. package/scripts/clone/clone-aggregate.ts +1 -1
  167. package/scripts/clone/clone-fingerprint.ts +1 -1
  168. package/scripts/clone/clone-scan-cli.ts +1 -1
  169. package/scripts/clone/clone-scan.ts +1 -1
  170. package/scripts/config-merge/index.ts +1 -1
  171. package/scripts/config-merge/json-format.ts +1 -3
  172. package/scripts/config-merge/patch-json-array.ts +90 -0
  173. package/scripts/config-merge/patch-json-key.ts +6 -3
  174. package/scripts/config-merge/patch-json-list.ts +1 -1
  175. package/scripts/cost-runtime/codex-usage.ts +1 -1
  176. package/scripts/cost-runtime/context-cut-payback.ts +4 -5
  177. package/scripts/cost-runtime/context-cut-threshold.ts +4 -6
  178. package/scripts/cost-runtime/cost-attribute.ts +3 -3
  179. package/scripts/cost-runtime/cost-blocks.ts +3 -4
  180. package/scripts/cost-runtime/cost-cli.ts +14 -11
  181. package/scripts/cost-runtime/cost-corpus.ts +11 -11
  182. package/scripts/cost-runtime/cost-pricing.ts +4 -4
  183. package/scripts/cost-runtime/cost-tokens.ts +1 -2
  184. package/scripts/cost-runtime/cost-transcript.ts +29 -29
  185. package/scripts/cost-runtime/cost-usage.ts +6 -7
  186. package/scripts/cost-runtime/cost-verdict.ts +10 -11
  187. package/scripts/cost-runtime/own-session.ts +1 -1
  188. package/scripts/cost-runtime/transcript-cwd.ts +2 -2
  189. package/scripts/delegation/delegation-cli.ts +4 -4
  190. package/scripts/delegation/delegation-policy.ts +13 -15
  191. package/scripts/delegation/duplicate-read-guard.ts +9 -10
  192. package/scripts/delegation/fanout-cli.ts +1 -1
  193. package/scripts/delegation/fanout.ts +1 -1
  194. package/scripts/delegation/investigation-guard.ts +18 -22
  195. package/scripts/delegation/investigation-reads.ts +48 -238
  196. package/scripts/discovery/repo-discovery.ts +1 -1
  197. package/scripts/discovery/repo-map-logic.ts +1 -2
  198. package/scripts/discovery/repo-origin.ts +3 -3
  199. package/scripts/discovery/repo-party-cli.ts +2 -2
  200. package/scripts/discovery/repo-party.ts +2 -2
  201. package/scripts/doctor/doctor-consumer.ts +1 -1
  202. package/scripts/doctor/doctor-io.ts +6 -7
  203. package/scripts/doctor/doctor-logic.ts +1 -1
  204. package/scripts/doctor/doctor-ports.ts +1 -1
  205. package/scripts/doctor/doctor.ts +8 -9
  206. package/scripts/document/backlogrun-parent-read-set.ts +5 -6
  207. package/scripts/document/bash-output-cap.ts +5 -7
  208. package/scripts/document/capped-print-part.ts +1 -1
  209. package/scripts/document/capped-print.ts +1 -1
  210. package/scripts/document/document-byte-budget.ts +33 -64
  211. package/scripts/document/document-byte-check.ts +4 -4
  212. package/scripts/document/document-reachability.ts +7 -8
  213. package/scripts/document/document-read-cli.ts +2 -2
  214. package/scripts/document/document-scan.ts +26 -2
  215. package/scripts/document/document-section-cli.ts +6 -8
  216. package/scripts/document/document-section.ts +8 -12
  217. package/scripts/document/edit-files-cli.ts +3 -4
  218. package/scripts/document/entry-read-budget.ts +8 -70
  219. package/scripts/document/entry-read-set.ts +51 -34
  220. package/scripts/document/lane-child-read-set.ts +9 -9
  221. package/scripts/document/read-files-cli.ts +1 -2
  222. package/scripts/document/read-set-cli.ts +16 -19
  223. package/scripts/document/read-set-cost.ts +4 -4
  224. package/scripts/document/read-set-point-of-use.ts +28 -38
  225. package/scripts/document/read-set-pricing.ts +1 -1
  226. package/scripts/document/read-set-trim.ts +3 -3
  227. package/scripts/document/resident-budget.ts +8 -10
  228. package/scripts/epic/epic-add-body.ts +15 -18
  229. package/scripts/epic/epic-add-plan.ts +26 -28
  230. package/scripts/epic/epic-add.ts +32 -25
  231. package/scripts/epic/epic-audit-checks.ts +27 -37
  232. package/scripts/epic/epic-audit-cli.ts +21 -22
  233. package/scripts/epic/epic-audit-orphans.ts +16 -17
  234. package/scripts/epic/epic-audit-rationale.ts +10 -15
  235. package/scripts/epic/epic-audit-report.ts +2 -5
  236. package/scripts/epic/epic-audit.ts +18 -14
  237. package/scripts/epic/epic-body.ts +10 -10
  238. package/scripts/epic/epic-bundle-cli.ts +36 -34
  239. package/scripts/epic/epic-bundle-evidence.ts +5 -5
  240. package/scripts/epic/epic-bundle-gaps.ts +6 -9
  241. package/scripts/epic/epic-bundle-poll.ts +1 -1
  242. package/scripts/epic/epic-bundle-referenced.ts +11 -14
  243. package/scripts/epic/epic-bundle.ts +19 -20
  244. package/scripts/epic/epic-busy.ts +44 -21
  245. package/scripts/epic/epic-candidate-confirm.ts +15 -18
  246. package/scripts/epic/epic-chains.ts +18 -23
  247. package/scripts/epic/epic-classify.ts +11 -12
  248. package/scripts/epic/epic-cli-argv.ts +5 -6
  249. package/scripts/epic/epic-cli-remove.ts +9 -4
  250. package/scripts/epic/epic-cli.ts +38 -26
  251. package/scripts/epic/epic-close-comment.ts +14 -15
  252. package/scripts/epic/epic-close.ts +25 -29
  253. package/scripts/epic/epic-cross-repo.ts +18 -21
  254. package/scripts/epic/epic-decision.ts +14 -18
  255. package/scripts/epic/epic-fetch.ts +25 -31
  256. package/scripts/epic/epic-graph.ts +15 -17
  257. package/scripts/epic/epic-index.ts +14 -16
  258. package/scripts/epic/epic-issue.ts +9 -11
  259. package/scripts/epic/epic-label-age.ts +74 -0
  260. package/scripts/epic/epic-lane-offer.ts +35 -24
  261. package/scripts/epic/epic-nested.ts +1 -1
  262. package/scripts/epic/epic-next-read.ts +8 -8
  263. package/scripts/epic/epic-next-views.ts +12 -12
  264. package/scripts/epic/epic-next.ts +29 -33
  265. package/scripts/epic/epic-outside-blocker.ts +11 -10
  266. package/scripts/epic/epic-parse.ts +22 -24
  267. package/scripts/epic/epic-promote.ts +3 -2
  268. package/scripts/epic/epic-rank.ts +1 -1
  269. package/scripts/epic/epic-read.ts +10 -8
  270. package/scripts/epic/epic-reconcile.ts +8 -6
  271. package/scripts/epic/epic-reference.ts +5 -4
  272. package/scripts/epic/epic-relation-recheck.ts +10 -11
  273. package/scripts/epic/epic-relations.ts +9 -8
  274. package/scripts/epic/epic-remove-plan.ts +4 -5
  275. package/scripts/epic/epic-remove.ts +7 -5
  276. package/scripts/epic/epic-report.ts +18 -20
  277. package/scripts/epic/epic-run.ts +6 -5
  278. package/scripts/epic/epic-sections.ts +2 -2
  279. package/scripts/epic/epic-shape.ts +3 -3
  280. package/scripts/epic/epic-solo-stale.ts +3 -2
  281. package/scripts/epic/epic-solo.ts +8 -8
  282. package/scripts/epic/epic-triage.ts +5 -4
  283. package/scripts/epic/epic-validate.ts +8 -7
  284. package/scripts/epic/epic.ts +5 -5
  285. package/scripts/exports/unused-members-cli.ts +1 -1
  286. package/scripts/followup/followup-issue-number.ts +1 -2
  287. package/scripts/followup/git-followup-cleanup.ts +6 -7
  288. package/scripts/followup/git-followup-finish.ts +11 -13
  289. package/scripts/followup/git-followup-flush.ts +11 -7
  290. package/scripts/followup/git-followup-issue-close.ts +16 -13
  291. package/scripts/followup/git-followup-label.ts +9 -6
  292. package/scripts/followup/git-followup-merged.ts +1 -1
  293. package/scripts/followup/git-followup-pending.ts +7 -9
  294. package/scripts/followup/git-followup-stages.ts +28 -17
  295. package/scripts/followup/git-followup-workflow.ts +19 -21
  296. package/scripts/followup/git-pr-followup-checks.ts +13 -20
  297. package/scripts/followup/git-pr-followup-wrapup.ts +7 -7
  298. package/scripts/followup/git-pr-followup.ts +18 -17
  299. package/scripts/gate/core-admission.ts +2 -2
  300. package/scripts/gate/core-budget.ts +15 -26
  301. package/scripts/gate/gate-ledger.ts +114 -0
  302. package/scripts/gate/gate-log.ts +7 -9
  303. package/scripts/gate/gate-plan.ts +70 -35
  304. package/scripts/gate/gate-report.ts +14 -15
  305. package/scripts/gate/gate-skip.ts +11 -13
  306. package/scripts/gate/gate-steps.ts +5 -1
  307. package/scripts/gate/gate-tree.ts +3 -4
  308. package/scripts/gate/hook-gate-reuse.ts +9 -9
  309. package/scripts/gate/machine-capacity.ts +168 -30
  310. package/scripts/gate/pre-commit-type-check.ts +4 -4
  311. package/scripts/gate/project-checks.ts +12 -4
  312. package/scripts/gate/scoped-green.ts +11 -18
  313. package/scripts/gate/type-check-command.ts +2 -2
  314. package/scripts/gate/type-check-step.ts +4 -4
  315. package/scripts/gate/verification-gate.ts +53 -51
  316. package/scripts/gh/gh-spawn.ts +2 -2
  317. package/scripts/gh/git-ai-review-scan.ts +3 -2
  318. package/scripts/gh/git-gh-api-path.ts +10 -11
  319. package/scripts/gh/git-gh-exec.ts +43 -48
  320. package/scripts/gh/git-gh-failure.ts +6 -9
  321. package/scripts/gh/git-gh-helpers.ts +1 -1
  322. package/scripts/gh/git-gh-issue-list.ts +15 -19
  323. package/scripts/gh/git-gh-issue-read.ts +43 -60
  324. package/scripts/gh/git-gh-issue-rest.ts +14 -15
  325. package/scripts/gh/git-gh-issue-write.ts +52 -40
  326. package/scripts/gh/git-gh-issue.ts +23 -24
  327. package/scripts/gh/git-gh-pr-auto-merge.ts +3 -3
  328. package/scripts/gh/git-gh-pr-read.ts +46 -50
  329. package/scripts/gh/git-gh-pr-rest.ts +23 -26
  330. package/scripts/gh/git-gh-pr-review.ts +2 -2
  331. package/scripts/gh/git-gh-pr-rollup.ts +4 -4
  332. package/scripts/gh/git-gh-pr-snapshot.ts +8 -10
  333. package/scripts/gh/git-gh-pr.ts +16 -16
  334. package/scripts/gh/git-gh-reachability.ts +11 -12
  335. package/scripts/gh/git-gh-repo.ts +2 -3
  336. package/scripts/gh/git-gh-rest-state.ts +1 -1
  337. package/scripts/gh/git-pr-ai-review.ts +6 -5
  338. package/scripts/gh/git-pr-checks-eval.ts +28 -30
  339. package/scripts/gh/git-pr-checks-parse.ts +14 -16
  340. package/scripts/gh/git-pr-checks-watch.ts +17 -17
  341. package/scripts/gh/git-pr-checks.ts +20 -23
  342. package/scripts/gh/git-pr-coderabbit.ts +8 -6
  343. package/scripts/gh/git-pr-confirmation.ts +5 -5
  344. package/scripts/gh/git-pr-managed-config.ts +7 -9
  345. package/scripts/gh/git-pr-messages.ts +1 -1
  346. package/scripts/gh/git-pr.ts +15 -16
  347. package/scripts/gh/github-issue-url.ts +8 -9
  348. package/scripts/git/base-tree.ts +66 -0
  349. package/scripts/git/change-base.ts +42 -2
  350. package/scripts/git/changed-file-scope.ts +5 -5
  351. package/scripts/git/changed-paths.ts +1 -2
  352. package/scripts/git/constants.ts +2 -2
  353. package/scripts/git/git-branch.ts +1 -1
  354. package/scripts/git/git-closes-keyword.ts +3 -3
  355. package/scripts/git/git-command.ts +53 -41
  356. package/scripts/git/git-common-directory.ts +3 -3
  357. package/scripts/git/git-diff-reads.ts +14 -15
  358. package/scripts/git/git-error.ts +1 -1
  359. package/scripts/git/git-execa-error.ts +1 -2
  360. package/scripts/git/git-issue.ts +10 -8
  361. package/scripts/git/git-location-environment.ts +3 -4
  362. package/scripts/git/git-ls-remote.ts +6 -8
  363. package/scripts/git/git-pre-push-hook.ts +11 -10
  364. package/scripts/git/git-preflight.ts +5 -5
  365. package/scripts/git/git-push-transport.ts +2 -2
  366. package/scripts/git/git-remote-branch.ts +1 -2
  367. package/scripts/git/git-schemas.ts +16 -23
  368. package/scripts/git/git-spawn-sync.ts +1 -1
  369. package/scripts/git/git-spawn.ts +37 -14
  370. package/scripts/git/git-ssh-keepalive.ts +12 -5
  371. package/scripts/git/git-staging.ts +7 -8
  372. package/scripts/git/git-workflow.ts +1 -1
  373. package/scripts/git/git-worktree.ts +35 -27
  374. package/scripts/git/gone-branch.ts +2 -2
  375. package/scripts/git/listing-cutoff.ts +1 -2
  376. package/scripts/git/lockfile-sync.ts +65 -0
  377. package/scripts/git/main-merge-guard.ts +1 -2
  378. package/scripts/git/main-merge.ts +7 -7
  379. package/scripts/git/main-sync.ts +23 -8
  380. package/scripts/git/parse-json-array.ts +18 -23
  381. package/scripts/git/repository-lock.ts +34 -2
  382. package/scripts/git/stash/git-stash.ts +4 -5
  383. package/scripts/git/stash/stash-orphans.ts +5 -3
  384. package/scripts/git/stash/stash-pop-args.ts +1 -1
  385. package/scripts/git/stash/stash-pop-cli.ts +3 -3
  386. package/scripts/git/stash/stash-sweep-lock.ts +2 -2
  387. package/scripts/hooks/batch-guard.ts +11 -13
  388. package/scripts/hooks/check-commit-message.ts +12 -9
  389. package/scripts/hooks/codex-hook-adapter.ts +16 -10
  390. package/scripts/hooks/edited-cspell.ts +3 -4
  391. package/scripts/hooks/format-edited-cli.ts +1 -1
  392. package/scripts/hooks/format-edited-file.ts +11 -17
  393. package/scripts/hooks/format-rewrite-notice.ts +19 -17
  394. package/scripts/hooks/pre-push-unit.ts +10 -14
  395. package/scripts/hooks/pretool-guard-cli.ts +4 -4
  396. package/scripts/hooks/pretool-guard.ts +93 -18
  397. package/scripts/hooks/reserved-run.ts +2 -2
  398. package/scripts/hooks/step-zero-notice.ts +1 -1
  399. package/scripts/hooks/stop-guard.ts +21 -10
  400. package/scripts/init/basic-path-migration.ts +2 -2
  401. package/scripts/init/claude-kit-only-settings.ts +2 -2
  402. package/scripts/init/claude-plugin-config.ts +2 -2
  403. package/scripts/init/distributed-paths.ts +4 -4
  404. package/scripts/init/hook-command-rewrite.ts +3 -3
  405. package/scripts/init/hook-launch.ts +5 -5
  406. package/scripts/init/init-actions.ts +13 -0
  407. package/scripts/init/init-ai-copy.ts +11 -11
  408. package/scripts/init/init-bootstrap.ts +3 -3
  409. package/scripts/init/init-copy-content.ts +4 -4
  410. package/scripts/init/init-logic-json-merge.ts +7 -9
  411. package/scripts/init/init-logic-migrate.ts +1 -1
  412. package/scripts/init/init-logic-templates.ts +1 -1
  413. package/scripts/init/init-logic-workspace.ts +4 -4
  414. package/scripts/init/init-logic-yaml-merge.ts +2 -2
  415. package/scripts/init/init-logic.ts +19 -22
  416. package/scripts/init/init.ts +7 -7
  417. package/scripts/init/kit-base-preset.ts +1 -1
  418. package/scripts/init/kit-setup-state.ts +1 -1
  419. package/scripts/init/kit-written-paths.ts +1 -2
  420. package/scripts/init/package-manager-pin.ts +1 -1
  421. package/scripts/init/project-profile-cli.ts +1 -1
  422. package/scripts/init/project-profile.ts +3 -3
  423. package/scripts/init/session-language-environment.ts +1 -1
  424. package/scripts/init/start-exec.ts +3 -4
  425. package/scripts/init/start-plan.ts +2 -2
  426. package/scripts/init/start-setup-pr.ts +3 -2
  427. package/scripts/init/start-steps.ts +2 -2
  428. package/scripts/init/tsconfig-preset-migration.ts +1 -1
  429. package/scripts/init/vscode-tasks.ts +62 -0
  430. package/scripts/issue/baseline-measure.ts +2 -2
  431. package/scripts/issue/behavior-change-lint.ts +2 -2
  432. package/scripts/issue/defect-rate-cli.ts +6 -7
  433. package/scripts/issue/defect-rate.ts +37 -27
  434. package/scripts/issue/git-next-issues.ts +9 -8
  435. package/scripts/issue/issue-auto-ok.ts +24 -11
  436. package/scripts/issue/issue-backlinks-cli.ts +5 -5
  437. package/scripts/issue/issue-backlinks.ts +6 -6
  438. package/scripts/issue/issue-cite-cli.ts +20 -18
  439. package/scripts/issue/issue-cite.ts +18 -8
  440. package/scripts/issue/issue-closing-pr.ts +4 -4
  441. package/scripts/issue/issue-comment-cli.ts +6 -4
  442. package/scripts/issue/issue-file-cli.ts +52 -15
  443. package/scripts/issue/issue-file-fold.ts +155 -0
  444. package/scripts/issue/issue-file.ts +9 -6
  445. package/scripts/issue/issue-fold-cli.ts +14 -9
  446. package/scripts/issue/issue-fold.ts +23 -8
  447. package/scripts/issue/issue-labels.ts +34 -38
  448. package/scripts/issue/issue-lint-cli.ts +2 -2
  449. package/scripts/issue/issue-lint.ts +1 -1
  450. package/scripts/issue/issue-merged.ts +10 -4
  451. package/scripts/issue/issue-number-shape.ts +27 -0
  452. package/scripts/issue/issue-rank.ts +1 -1
  453. package/scripts/issue/issue-read-cli.ts +4 -5
  454. package/scripts/issue/issue-read.ts +4 -5
  455. package/scripts/issue/issue-reference.ts +5 -5
  456. package/scripts/issue/issue-release-cli.ts +17 -7
  457. package/scripts/issue/issue-release.ts +3 -3
  458. package/scripts/issue/issue-report-failures.ts +7 -4
  459. package/scripts/issue/issue-scout-cli.ts +11 -11
  460. package/scripts/issue/issue-scout-closed.ts +4 -4
  461. package/scripts/issue/issue-scout.ts +4 -5
  462. package/scripts/issue/issue-state-cli.ts +17 -10
  463. package/scripts/issue/issue-state.ts +12 -13
  464. package/scripts/issue/issue-wip.ts +7 -7
  465. package/scripts/issue/markdown-section.ts +3 -3
  466. package/scripts/issue/measure-rerun-cli.ts +10 -9
  467. package/scripts/issue/reproduction-measure.ts +3 -3
  468. package/scripts/issue/session-cite.ts +56 -0
  469. package/scripts/josh/agent-session-environment.ts +10 -8
  470. package/scripts/josh/cli-body.ts +2 -2
  471. package/scripts/josh/command-suggest.ts +1 -1
  472. package/scripts/josh/file-map-stamp.ts +20 -23
  473. package/scripts/josh/hook-decision.ts +24 -28
  474. package/scripts/josh/josh-command-map.ts +4 -1
  475. package/scripts/josh/josh-command-types.ts +30 -35
  476. package/scripts/josh/josh-commands-ai.ts +6 -6
  477. package/scripts/josh/josh-commands-backlog.ts +15 -3
  478. package/scripts/josh/josh-commands-clone.ts +1 -1
  479. package/scripts/josh/josh-commands-development.ts +25 -4
  480. package/scripts/josh/josh-commands-document.ts +3 -3
  481. package/scripts/josh/josh-commands-guard.ts +3 -3
  482. package/scripts/josh/josh-commands-issue.ts +4 -5
  483. package/scripts/josh/josh-commands-lane.ts +14 -4
  484. package/scripts/josh/josh-commands-lint.ts +1 -1
  485. package/scripts/josh/josh-commands-run.ts +20 -6
  486. package/scripts/josh/josh-commands-split.ts +1 -2
  487. package/scripts/josh/josh-commands-versioning.ts +5 -5
  488. package/scripts/josh/josh-commands-workflow.ts +30 -22
  489. package/scripts/josh/josh-environment-file.ts +1 -1
  490. package/scripts/josh/josh-in-process.ts +3 -3
  491. package/scripts/josh/josh-logic.ts +6 -7
  492. package/scripts/josh/josh-run.ts +3 -3
  493. package/scripts/josh/josh-verdict.ts +9 -12
  494. package/scripts/josh/josh.ts +3 -3
  495. package/scripts/josh/kit-only.ts +2 -2
  496. package/scripts/josh/path-decision.ts +3 -3
  497. package/scripts/josh/platform-temporary.ts +7 -5
  498. package/scripts/josh/process-identity.ts +24 -6
  499. package/scripts/josh/process-owner.ts +4 -4
  500. package/scripts/josh/session-language-cli.ts +53 -11
  501. package/scripts/josh/session-language.ts +1 -1
  502. package/scripts/josh/stamp-file.ts +48 -29
  503. package/scripts/josh/stamp-record.ts +57 -0
  504. package/scripts/lane/lane-await.ts +35 -11
  505. package/scripts/lane/lane-cache.ts +6 -6
  506. package/scripts/lane/lane-capacity.ts +32 -17
  507. package/scripts/lane/lane-child-invocation.ts +17 -15
  508. package/scripts/lane/lane-child-marker.ts +12 -12
  509. package/scripts/lane/lane-cli.ts +12 -13
  510. package/scripts/lane/lane-close.ts +6 -6
  511. package/scripts/lane/lane-dispatch.ts +61 -72
  512. package/scripts/lane/lane-environment.ts +5 -5
  513. package/scripts/lane/lane-guard-policy.ts +7 -21
  514. package/scripts/lane/lane-handoff.ts +2 -2
  515. package/scripts/lane/lane-install.ts +9 -10
  516. package/scripts/lane/lane-launch-cli.ts +13 -8
  517. package/scripts/lane/lane-ledger.ts +73 -11
  518. package/scripts/lane/lane-leftover.ts +2 -2
  519. package/scripts/lane/lane-limit-cli.ts +160 -0
  520. package/scripts/lane/lane-limit-override.ts +74 -0
  521. package/scripts/lane/lane-load.ts +19 -68
  522. package/scripts/lane/lane-measure-cli.ts +15 -25
  523. package/scripts/lane/lane-occupancy.ts +6 -4
  524. package/scripts/lane/lane-open.ts +20 -19
  525. package/scripts/lane/lane-output.ts +4 -3
  526. package/scripts/lane/lane-paths.ts +12 -11
  527. package/scripts/lane/lane-phase.ts +33 -0
  528. package/scripts/lane/lane-reap.ts +2 -2
  529. package/scripts/lane/lane-registry.ts +16 -15
  530. package/scripts/lane/lane-relaunch.ts +9 -9
  531. package/scripts/lane/lane-report.ts +5 -4
  532. package/scripts/lane/lane-resume.ts +2 -2
  533. package/scripts/lane/lane-sampler.ts +55 -0
  534. package/scripts/lane/lane-seed.ts +7 -7
  535. package/scripts/lane/lane-stage-stats.ts +135 -0
  536. package/scripts/lane/lane-start-point.ts +8 -11
  537. package/scripts/lane/lane-stats.ts +60 -15
  538. package/scripts/lane/lane-stray.ts +1 -1
  539. package/scripts/lane/lane-vacant.ts +1 -1
  540. package/scripts/lane/openai-lane-supervisor-decision.ts +3 -7
  541. package/scripts/lane/openai-lane-supervisor-owner.ts +3 -9
  542. package/scripts/lane/openai-review-broker.ts +2 -4
  543. package/scripts/lib/ancestor-directories.ts +1 -1
  544. package/scripts/lib/bounded-pool.ts +2 -2
  545. package/scripts/lib/buffered-process.ts +4 -6
  546. package/scripts/lib/caddy-logs.sh +0 -0
  547. package/scripts/lib/cli-flags.ts +39 -6
  548. package/scripts/lib/error-message.ts +1 -1
  549. package/scripts/lib/json-value.ts +17 -3
  550. package/scripts/lib/poll.ts +1 -1
  551. package/scripts/lib/status-icons.ts +3 -3
  552. package/scripts/lib/timed-fetch.ts +1 -1
  553. package/scripts/lib/timeouts.ts +1 -1
  554. package/scripts/lines/bytes-command.ts +3 -4
  555. package/scripts/lines/effective-limit.ts +25 -12
  556. package/scripts/lines/line-budget.ts +47 -55
  557. package/scripts/lines/line-targets.ts +6 -2
  558. package/scripts/lines/lines-command.ts +3 -3
  559. package/scripts/lint/cspell-cached.ts +1 -1
  560. package/scripts/lint/cycle-recheck.ts +122 -0
  561. package/scripts/lint/format.ts +1 -2
  562. package/scripts/lint/lint-parallel.ts +34 -19
  563. package/scripts/lint/lint-related-scope.ts +25 -15
  564. package/scripts/lint/lint-related.ts +6 -7
  565. package/scripts/managed-marker/index.ts +1 -1
  566. package/scripts/managed-marker/managed-marker-logic.ts +1 -2
  567. package/scripts/notify/git-notify.ts +9 -7
  568. package/scripts/notify/telegram-notify.ts +53 -37
  569. package/scripts/notify/telegram-test-logic.ts +3 -3
  570. package/scripts/notify/telegram-test.ts +45 -30
  571. package/scripts/observations/observation-ledger-home.ts +14 -8
  572. package/scripts/observations/observation-ledger-line.ts +3 -2
  573. package/scripts/observations/observation-ledger-migrate.ts +3 -4
  574. package/scripts/observations/observation-ledger-prepare.ts +4 -4
  575. package/scripts/observations/observation-ledger.ts +14 -15
  576. package/scripts/observations/observation-record-cli.ts +83 -0
  577. package/scripts/observations/observation-record.ts +91 -0
  578. package/scripts/observations/observations-flush-cli.ts +1 -1
  579. package/scripts/observations/observations-flush-landing.ts +7 -6
  580. package/scripts/observations/observations-flush.ts +26 -27
  581. package/scripts/overrides/overrides-check.ts +18 -8
  582. package/scripts/package/package-scout-cli.ts +1 -1
  583. package/scripts/package/package-scout-format.ts +2 -2
  584. package/scripts/package/package-scout.ts +1 -1
  585. package/scripts/propagate/propagate-git-failure.ts +1 -1
  586. package/scripts/propagate/propagate-git.ts +7 -7
  587. package/scripts/propagate/propagate-plan.ts +2 -2
  588. package/scripts/propagate/propagate-publish.ts +2 -3
  589. package/scripts/propagate/propagate-run.ts +5 -7
  590. package/scripts/propagate/propagate-select.ts +1 -1
  591. package/scripts/propagate/propagate-steps.ts +19 -20
  592. package/scripts/propagate/propagate-targets.ts +6 -10
  593. package/scripts/propagate/propagate.ts +5 -5
  594. package/scripts/refactor/import-graph.ts +1 -1
  595. package/scripts/refactor/refactor-lint.ts +4 -10
  596. package/scripts/refactor/refactor-scan-cli.ts +1 -1
  597. package/scripts/refactor/refactor-scan.ts +2 -2
  598. package/scripts/refactor/refactor-targets.ts +1 -1
  599. package/scripts/release/github-release-cli.ts +25 -3
  600. package/scripts/release/github-release-runs.ts +1 -1
  601. package/scripts/release/release-cli.ts +21 -4
  602. package/scripts/release/release-history.ts +6 -10
  603. package/scripts/release/release-plan.ts +3 -3
  604. package/scripts/release/release-progress.ts +3 -4
  605. package/scripts/release/release-publish.ts +8 -9
  606. package/scripts/release/release-scope-cli.ts +8 -10
  607. package/scripts/release/release-tag.ts +6 -8
  608. package/scripts/release/release-worktree.ts +5 -5
  609. package/scripts/repo/auto-merge-setting-logic.ts +7 -9
  610. package/scripts/repo/auto-merge-setting.ts +1 -1
  611. package/scripts/repo/repo-setting.ts +4 -4
  612. package/scripts/repo/repository-labels.ts +1 -1
  613. package/scripts/repo/required-checks-logic.ts +3 -3
  614. package/scripts/repo/required-checks-report.ts +1 -1
  615. package/scripts/repo/ruleset-check-cli.ts +1 -1
  616. package/scripts/repo/ruleset-check.ts +1 -1
  617. package/scripts/report/report-format-reference.ts +26 -0
  618. package/scripts/report/report-lint-cli.ts +2 -2
  619. package/scripts/report/report-lint.ts +16 -2
  620. package/scripts/review/disposition-cli.ts +2 -2
  621. package/scripts/review/disposition-logic.ts +1 -1
  622. package/scripts/review/live-evidence.ts +9 -6
  623. package/scripts/review/review-attest-cli.ts +1 -2
  624. package/scripts/review/review-attest.ts +3 -3
  625. package/scripts/review/review-brief-cli.ts +19 -20
  626. package/scripts/review/review-brief.ts +29 -32
  627. package/scripts/review/review-checkout.ts +2 -2
  628. package/scripts/review/review-diff-parts.ts +3 -5
  629. package/scripts/review/review-diff-write.ts +1 -1
  630. package/scripts/review/review-finding-ledger.ts +7 -4
  631. package/scripts/review/review-findings-cli.ts +2 -2
  632. package/scripts/review/review-level.ts +4 -7
  633. package/scripts/review/review-record-cli.ts +73 -16
  634. package/scripts/review/review-record.ts +5 -4
  635. package/scripts/review/review-round2-cli.ts +2 -3
  636. package/scripts/review/review-round2.ts +13 -21
  637. package/scripts/review/review-stamps.ts +9 -71
  638. package/scripts/review/review-tree.ts +4 -5
  639. package/scripts/rules/bash-triggers.ts +4 -4
  640. package/scripts/rules/decision-oracle-batch.ts +5 -6
  641. package/scripts/rules/decision-oracle-stage.ts +1 -1
  642. package/scripts/rules/decision-oracle-tokens.ts +1 -2
  643. package/scripts/rules/decision-oracle.ts +2 -2
  644. package/scripts/rules/delivered-rules.ts +61 -406
  645. package/scripts/rules/destructive-command.ts +2 -2
  646. package/scripts/rules/direct-filing.ts +4 -4
  647. package/scripts/rules/direct-pr-create.ts +2 -2
  648. package/scripts/rules/early-heartbeat.ts +15 -19
  649. package/scripts/rules/file-body.ts +5 -6
  650. package/scripts/rules/filing-cap.ts +6 -7
  651. package/scripts/rules/filing-offer.ts +1 -1
  652. package/scripts/rules/firing-point.ts +6 -6
  653. package/scripts/rules/gh-api.ts +2 -2
  654. package/scripts/rules/git-argv.ts +3 -3
  655. package/scripts/rules/git-force.ts +2 -2
  656. package/scripts/rules/hook-context-line.ts +31 -0
  657. package/scripts/rules/implementation-cut-verdict.ts +5 -8
  658. package/scripts/rules/implementation-cut.ts +35 -32
  659. package/scripts/rules/index-guard.ts +2 -2
  660. package/scripts/rules/issue-citation.ts +7 -7
  661. package/scripts/rules/issue-comments.ts +21 -13
  662. package/scripts/rules/josh-git-bare.ts +2 -2
  663. package/scripts/rules/lane-background.ts +14 -16
  664. package/scripts/rules/lane-carry-conflict.ts +41 -5
  665. package/scripts/rules/lane-interactive-ask.ts +6 -9
  666. package/scripts/rules/lane-park.ts +12 -16
  667. package/scripts/rules/lane-split-park.ts +1 -2
  668. package/scripts/rules/lane-switch-main.ts +10 -13
  669. package/scripts/rules/last-prompt.ts +1 -1
  670. package/scripts/rules/oracle-consulted.ts +5 -5
  671. package/scripts/rules/oracle-firing.ts +6 -9
  672. package/scripts/rules/oracle-list-cli.ts +2 -2
  673. package/scripts/rules/permission-guards.ts +2 -2
  674. package/scripts/rules/piped-verification.ts +79 -9
  675. package/scripts/rules/poll-loop.ts +9 -11
  676. package/scripts/rules/pre-gate-cut.ts +33 -30
  677. package/scripts/rules/prior-comment-read.ts +3 -3
  678. package/scripts/rules/protected-files.ts +25 -13
  679. package/scripts/rules/raw-field-body.ts +3 -4
  680. package/scripts/rules/reply-language.ts +1 -1
  681. package/scripts/rules/rule-body-guard.ts +10 -12
  682. package/scripts/rules/rule-guard.ts +1 -1
  683. package/scripts/rules/rule-list.ts +51 -0
  684. package/scripts/rules/rule-registry-rows.ts +282 -0
  685. package/scripts/rules/rule-registry.ts +109 -0
  686. package/scripts/rules/rule-value-cache.ts +2 -2
  687. package/scripts/rules/rule-value-cli.ts +6 -4
  688. package/scripts/rules/rule-value.ts +61 -22
  689. package/scripts/rules/run-tail-rule.ts +11 -15
  690. package/scripts/rules/shell-body-trigger.ts +7 -7
  691. package/scripts/rules/shell-segments.ts +2 -4
  692. package/scripts/rules/stop-rules.ts +54 -41
  693. package/scripts/rules/tail-commands.ts +1 -1
  694. package/scripts/rules/test-declared-commit.ts +2 -2
  695. package/scripts/rules/third-party-write.ts +3 -3
  696. package/scripts/rules/worktree-guard.ts +12 -5
  697. package/scripts/run/add/run-add-cli.ts +165 -0
  698. package/scripts/run/add/run-add.ts +124 -0
  699. package/scripts/run/board/run-board-cli.ts +207 -0
  700. package/scripts/run/board/run-board-closed.ts +95 -0
  701. package/scripts/run/board/run-board-every.ts +60 -0
  702. package/scripts/run/board/run-board-fetch.ts +38 -0
  703. package/scripts/run/board/run-board-fit.ts +219 -0
  704. package/scripts/run/board/run-board-github.ts +162 -0
  705. package/scripts/run/board/run-board-header.ts +275 -0
  706. package/scripts/run/board/run-board-kind.ts +35 -0
  707. package/scripts/run/board/run-board-labels.ts +299 -0
  708. package/scripts/run/board/run-board-layout.ts +222 -0
  709. package/scripts/run/board/run-board-link.ts +31 -0
  710. package/scripts/run/board/run-board-machine.ts +198 -0
  711. package/scripts/run/board/run-board-notes.ts +103 -0
  712. package/scripts/run/board/run-board-phase.ts +136 -0
  713. package/scripts/run/board/run-board-plan.ts +129 -0
  714. package/scripts/run/board/run-board-read.ts +62 -0
  715. package/scripts/run/board/run-board-render-legend.ts +82 -0
  716. package/scripts/run/board/run-board-render-notes.ts +77 -0
  717. package/scripts/run/board/run-board-render-slot.ts +50 -0
  718. package/scripts/run/board/run-board-render.ts +407 -0
  719. package/scripts/run/board/run-board-scope.ts +17 -0
  720. package/scripts/run/board/run-board-screen.ts +43 -0
  721. package/scripts/run/board/run-board-span.ts +66 -0
  722. package/scripts/run/board/run-board-spin.ts +115 -0
  723. package/scripts/run/board/run-board-state.ts +113 -0
  724. package/scripts/run/board/run-board-status.ts +279 -0
  725. package/scripts/run/board/run-board-tick.ts +210 -0
  726. package/scripts/run/board/run-board-track.ts +22 -0
  727. package/scripts/run/board/run-board-usage-read.ts +255 -0
  728. package/scripts/run/board/run-board-usage-rusage.ts +124 -0
  729. package/scripts/run/board/run-board-usage-text.ts +80 -0
  730. package/scripts/run/board/run-board-usage.ts +165 -0
  731. package/scripts/run/carry/run-carry-added.ts +62 -0
  732. package/scripts/run/carry/run-carry-args.ts +25 -22
  733. package/scripts/run/carry/run-carry-change.ts +1 -1
  734. package/scripts/run/carry/run-carry-cli.ts +71 -48
  735. package/scripts/run/carry/run-carry-conversation.ts +6 -7
  736. package/scripts/run/carry/run-carry-ended.ts +85 -0
  737. package/scripts/run/carry/run-carry-reclaim.ts +1 -1
  738. package/scripts/run/carry/run-carry-stash.ts +3 -2
  739. package/scripts/run/carry/run-carry-streak.ts +8 -10
  740. package/scripts/run/carry/run-carry.ts +85 -89
  741. package/scripts/run/cut/run-cut-args.ts +7 -7
  742. package/scripts/run/cut/run-cut-cli.ts +54 -36
  743. package/scripts/run/cut/run-cut-handoff.ts +15 -15
  744. package/scripts/run/cut/run-cut-report.ts +37 -16
  745. package/scripts/run/cut/run-cut.ts +63 -77
  746. package/scripts/run/detached-launch.ts +35 -50
  747. package/scripts/run/entry/run-entry-cli.ts +48 -27
  748. package/scripts/run/entry/run-entry-stop.ts +7 -9
  749. package/scripts/run/entry/run-entry.ts +5 -6
  750. package/scripts/run/event/run-event-cli.ts +5 -6
  751. package/scripts/run/event/run-event-filed.ts +69 -0
  752. package/scripts/run/event/run-event-follow.ts +3 -3
  753. package/scripts/run/event/run-event-plan.ts +38 -0
  754. package/scripts/run/event/run-event-render.ts +9 -4
  755. package/scripts/run/event/run-event-scope.ts +47 -18
  756. package/scripts/run/event/run-event-stream-emit.ts +64 -11
  757. package/scripts/run/event/run-event-stream.ts +171 -46
  758. package/scripts/run/event/run-event-watch.ts +4 -6
  759. package/scripts/run/hold/run-hold-cli.ts +65 -62
  760. package/scripts/run/hold/run-hold.ts +88 -46
  761. package/scripts/run/merge/run-merge-cli.ts +116 -77
  762. package/scripts/run/merge/run-merge-collect.ts +107 -0
  763. package/scripts/run/merge/run-merge-steps.ts +112 -65
  764. package/scripts/run/merge/run-merge-token.ts +30 -0
  765. package/scripts/run/merge/run-merge.ts +31 -22
  766. package/scripts/run/progress/run-progress-args.ts +4 -4
  767. package/scripts/run/progress/run-progress-cli.ts +39 -50
  768. package/scripts/run/progress/run-progress-clock.ts +25 -32
  769. package/scripts/run/progress/run-progress-config.ts +6 -9
  770. package/scripts/run/progress/run-progress-read.ts +9 -10
  771. package/scripts/run/progress/run-progress.ts +48 -53
  772. package/scripts/run/review/run-review-cli.ts +6 -6
  773. package/scripts/run/review/run-review-steps.ts +6 -6
  774. package/scripts/run/review/run-review.ts +9 -11
  775. package/scripts/run/run-cli-fault.ts +29 -0
  776. package/scripts/run/run-ending-cli.ts +3 -3
  777. package/scripts/run/run-ending.ts +10 -14
  778. package/scripts/run/run-halfrun-resume.ts +6 -8
  779. package/scripts/run/run-headless.ts +25 -12
  780. package/scripts/run/run-invocation.ts +17 -22
  781. package/scripts/run/run-label.ts +7 -5
  782. package/scripts/run/run-liveness-cli.ts +19 -6
  783. package/scripts/run/run-liveness.ts +27 -38
  784. package/scripts/run/run-next-cli.ts +5 -9
  785. package/scripts/run/run-next.ts +4 -5
  786. package/scripts/run/run-parent-cut-hook.ts +10 -12
  787. package/scripts/run/run-preflight.ts +25 -29
  788. package/scripts/run/run-prep-cli.ts +17 -13
  789. package/scripts/run/run-prep-locate.ts +4 -5
  790. package/scripts/run/run-prep.ts +7 -10
  791. package/scripts/run/run-prrun-resume.ts +2 -2
  792. package/scripts/run/run-report-cli.ts +4 -4
  793. package/scripts/run/run-report.ts +9 -14
  794. package/scripts/run/run-retrospective.ts +3 -3
  795. package/scripts/run/run-section.ts +42 -0
  796. package/scripts/run/run-stage-read.ts +2 -2
  797. package/scripts/run/run-stage.ts +6 -4
  798. package/scripts/run/run-status-cli.ts +7 -5
  799. package/scripts/run/run-status.ts +6 -7
  800. package/scripts/run/run-step-cli.ts +13 -15
  801. package/scripts/run/run-step.ts +58 -47
  802. package/scripts/run/run-stop-notify.ts +7 -8
  803. package/scripts/run/run-stranded-cli.ts +1 -1
  804. package/scripts/run/run-stranded-detect.ts +4 -4
  805. package/scripts/run/run-stranded.ts +11 -13
  806. package/scripts/run/run-tail-cli.ts +15 -16
  807. package/scripts/run/run-tail.ts +14 -33
  808. package/scripts/run/run-watcher-guard-cli.ts +3 -4
  809. package/scripts/run/run-watcher-guard.ts +11 -12
  810. package/scripts/run/run-watcher-hook.ts +6 -12
  811. package/scripts/run/ship/run-ship-cli.ts +67 -33
  812. package/scripts/run/ship/run-ship-detach.ts +15 -13
  813. package/scripts/run/ship/run-ship-lock.ts +1 -1
  814. package/scripts/run/ship/run-ship-next.ts +7 -8
  815. package/scripts/run/ship/run-ship-pre-detach.ts +27 -11
  816. package/scripts/run/ship/run-ship-preflight.ts +10 -11
  817. package/scripts/run/ship/run-ship-probe.ts +4 -4
  818. package/scripts/run/ship/run-ship-return.ts +1 -1
  819. package/scripts/run/ship/run-ship-review-steps.ts +43 -24
  820. package/scripts/run/ship/run-ship-review.ts +12 -14
  821. package/scripts/run/ship/run-ship-scoped.ts +15 -6
  822. package/scripts/run/ship/run-ship-stage.ts +80 -26
  823. package/scripts/run/ship/run-ship-steps.ts +26 -16
  824. package/scripts/run/ship/run-ship-stop-text.ts +4 -2
  825. package/scripts/run/ship/run-ship-sync.ts +9 -8
  826. package/scripts/run/ship/run-ship.ts +17 -32
  827. package/scripts/run/tidy/run-tidy-cli.ts +9 -5
  828. package/scripts/run/tidy/run-tidy-lanes.ts +18 -7
  829. package/scripts/run/tidy/run-tidy-stashes.ts +8 -8
  830. package/scripts/run/tidy/run-tidy.ts +4 -3
  831. package/scripts/run/wake/run-wake-cli.ts +27 -32
  832. package/scripts/run/wake/run-wake-describe.ts +24 -28
  833. package/scripts/run/wake/run-wake-driver.ts +14 -14
  834. package/scripts/run/wake/run-wake-handoff.ts +6 -6
  835. package/scripts/run/wake/run-wake-loop.ts +9 -9
  836. package/scripts/run/wake/run-wake-restart.ts +4 -5
  837. package/scripts/run/wake/run-wake-session.ts +23 -27
  838. package/scripts/run/wake/run-wake.ts +57 -279
  839. package/scripts/safe-chain/ci-installer-pin.ts +3 -3
  840. package/scripts/safe-chain/pack-hook.ts +2 -2
  841. package/scripts/safe-chain/preinstall-command.ts +2 -2
  842. package/scripts/security/security-audit-logic.ts +1 -1
  843. package/scripts/security/security-audit-provision-logic.ts +1 -1
  844. package/scripts/security/security-audit-provision.ts +2 -2
  845. package/scripts/security/security-audit.ts +5 -5
  846. package/scripts/security/security-updates-logic.ts +2 -3
  847. package/scripts/security/security-updates.ts +2 -4
  848. package/scripts/self-sync-guard/index.ts +1 -1
  849. package/scripts/self-sync-guard/self-sync-guard-logic.ts +2 -2
  850. package/scripts/self-sync-guard/self-sync-refusal.ts +1 -1
  851. package/scripts/sonar/sonar-hotspots-cli.ts +1 -1
  852. package/scripts/sonar/sonar-hotspots.ts +1 -1
  853. package/scripts/sonar/sonar-new-code-cli.ts +1 -1
  854. package/scripts/sonar/sonar-new-code.ts +1 -1
  855. package/scripts/sonar/sonar-project.ts +1 -1
  856. package/scripts/split/split-assess-cli.ts +1 -1
  857. package/scripts/split/split-assess.ts +3 -3
  858. package/scripts/sync/directory-copy-guard.ts +2 -3
  859. package/scripts/sync/managed-config-scope-cli.ts +1 -2
  860. package/scripts/sync/managed-config-scope.ts +4 -4
  861. package/scripts/sync/plugin-skill-directories.ts +2 -2
  862. package/scripts/sync/reconcile-templates.ts +17 -8
  863. package/scripts/sync/removed-skill-manifest.ts +2 -3
  864. package/scripts/sync/sync-ai-files.ts +7 -7
  865. package/scripts/sync/sync-configs.ts +30 -3
  866. package/scripts/sync/sync-hook-safety.ts +2 -2
  867. package/scripts/sync/sync.ts +23 -10
  868. package/scripts/sync/synced-paths.ts +2 -1
  869. package/scripts/sync/workflow-pin-logic.ts +1 -1
  870. package/scripts/test/test-declared-changed.ts +4 -4
  871. package/scripts/test/test-declared-logic.ts +2 -3
  872. package/scripts/test/test-declared-match.ts +25 -4
  873. package/scripts/test/test-declared.ts +26 -9
  874. package/scripts/test/test-red-commit.ts +3 -2
  875. package/scripts/test/test-red-logic.ts +7 -14
  876. package/scripts/test/test-red.ts +12 -47
  877. package/scripts/test/test-related-scope.ts +2 -3
  878. package/scripts/test/test-related.ts +3 -3
  879. package/scripts/test/test-type-logic.ts +1 -2
  880. package/scripts/test/test-unit-guard.ts +13 -17
  881. package/scripts/test/unit-worker-share.ts +7 -8
  882. package/scripts/time-runtime/time-agent-bundles.ts +2 -4
  883. package/scripts/time-runtime/time-background.ts +17 -21
  884. package/scripts/time-runtime/time-batch-guard.ts +67 -342
  885. package/scripts/time-runtime/time-bundle-call.ts +26 -28
  886. package/scripts/time-runtime/time-bundles.ts +11 -12
  887. package/scripts/time-runtime/time-call-identity.ts +1 -1
  888. package/scripts/time-runtime/time-command-key.ts +2 -2
  889. package/scripts/time-runtime/time-density-hook.ts +8 -11
  890. package/scripts/time-runtime/time-density.ts +5 -5
  891. package/scripts/time-runtime/time-followup-stage.ts +7 -7
  892. package/scripts/time-runtime/time-format.ts +5 -5
  893. package/scripts/time-runtime/time-hook-transcript.ts +3 -3
  894. package/scripts/time-runtime/time-instant.ts +1 -1
  895. package/scripts/time-runtime/time-markers.ts +15 -19
  896. package/scripts/time-runtime/time-phase-names.ts +3 -3
  897. package/scripts/time-runtime/time-reported-failure.ts +15 -19
  898. package/scripts/time-runtime/time-round-trips.ts +20 -23
  899. package/scripts/time-runtime/time-shell.ts +8 -8
  900. package/scripts/time-runtime/time-single-check.ts +1 -2
  901. package/scripts/time-runtime/time-spans.ts +35 -40
  902. package/scripts/time-runtime/time-tool-call.ts +15 -16
  903. package/scripts/time-runtime/time-transcript-line.ts +53 -34
  904. package/scripts/time-runtime/time-writes.ts +5 -5
  905. package/scripts/ui/ui-routes-cli.ts +1 -2
  906. package/scripts/ui/ui-routes.ts +1 -2
  907. package/scripts/version/bump-version.ts +1 -1
  908. package/scripts/version/fresh-metadata-cache.ts +2 -2
  909. package/scripts/version/latest-corepack.ts +26 -26
  910. package/scripts/version/latest-lane-guard.ts +1 -1
  911. package/scripts/version/latest-scope-cli.ts +2 -2
  912. package/scripts/version/latest-stamp.ts +1 -2
  913. package/scripts/version/latest-update.ts +2 -2
  914. package/scripts/version/npm-registry.ts +2 -2
  915. package/scripts/version/package-manager-version.ts +18 -0
  916. package/scripts/version/publishable-range-check.ts +2 -1
  917. package/scripts/version/publishable-range.ts +1 -1
  918. package/scripts/version/release-age.ts +11 -11
  919. package/scripts/version/release-hold.ts +2 -2
  920. package/scripts/version/safe-chain-version-update.ts +3 -3
  921. package/scripts/version/version-check-logic.ts +2 -3
  922. package/scripts/version/version-check.ts +1 -2
  923. package/scripts/version/version-command-config.ts +2 -2
  924. package/scripts/version/version-commands.ts +3 -3
  925. package/scripts/version/version-remote.ts +4 -4
  926. package/scripts/version/version-targets.ts +2 -2
  927. package/templates/gitignore +7 -0
  928. package/dist/hooks/chunk-KHX4U3BG.js +0 -6400
  929. package/dist/hooks/chunk-RKUAD3I6.js +0 -90
  930. package/dist/hooks/chunk-WPALEIRX.js +0 -18
  931. package/scripts/backlog/backlog-restructure.ts +0 -152
  932. package/scripts/rules/issue-fold-rule.ts +0 -72
  933. package/scripts/rules/wip-cap.ts +0 -63
  934. package/scripts/run/run-issue-number.ts +0 -19
@@ -42,17 +42,16 @@ const epic_issue_schema = z.object({
42
42
  })
43
43
 
44
44
  // One blocker as `gh` reports it inside the `blockedBy` connection. `state` comes back with the
45
- // number, so telling a resolved blocker from a standing one costs no extra request
46
- // (joshuafolkken/kit#996).
45
+ // number, so telling a resolved blocker from a standing one costs no extra request.
47
46
  // `number` is **required**. Relaxing it looks harmless and is not: `epic_issue.blockers_of` maps the
48
47
  // nodes to their numbers, so an optional one turns a `blockedBy` shape change from a failed parse —
49
48
  // which marks the child unreadable — into an empty blocker list, and `epic:next` then hands a
50
49
  // dependent to an unattended run before its prerequisite. Fail-safe is the direction that matters
51
- // here (joshuafolkken/kit#1005).
50
+ // here.
52
51
  //
53
52
  // `repository_url` is the repository the blocker lives in, as REST names it
54
- // (`https://api.github.com/repos/<owner>/<repo>`). Carried since joshuafolkken/kit#1126: a
55
- // `blocked-by` relation may cross a repository, and a reader that keeps only the number resolves it
53
+ // (`https://api.github.com/repos/<owner>/<repo>`). Carried because a `blocked-by` relation may
54
+ // cross a repository, and a reader that keeps only the number resolves it
56
55
  // against the blocked child's own repository — a different issue, or none. Optional because a
57
56
  // caller that only wants numbers must not be made to fail on a response shape it never reads.
58
57
  const blocking_issue_schema = z.object({
@@ -62,16 +61,11 @@ const blocking_issue_schema = z.object({
62
61
  })
63
62
 
64
63
  // The blocker relations arrive as a connection — `{ nodes, totalCount }` — not a bare array.
65
- // Measured against a real issue rather than assumed (joshuafolkken/kit#860). `gh issue view`
66
- // answered the connection itself; since joshuafolkken/kit#1024 REST serves a bare array from the
67
- // issue's own `dependencies/blocked_by` endpoint and `git-gh-issue-rest.ts` maps it back into this
68
- // shape, so every reader below is unchanged.
64
+ // REST serves a bare array from the issue's own `dependencies/blocked_by` endpoint and
65
+ // `git-gh-issue-rest.ts` maps it back into this shape.
69
66
  //
70
- // **One definition, every reader.** The same connection was written out three times — twice here and
71
- // once in `scripts/epic/epic-issue.ts` — each naming only the fields its own caller happened to want,
72
- // so a shape change had three places to reach and one of them would not be noticed. That is the
73
- // duplication joshuafolkken/kit#862 removed from the epic commands, reintroduced by the readers that
74
- // came after (joshuafolkken/kit#1005).
67
+ // **One definition, every reader.** A copy per reader, each naming only the fields its own caller
68
+ // wants, would give a shape change several places to reach, one of which would not be noticed.
75
69
  //
76
70
  // `nodes` is a page — `blockedBy(first:50)` under GraphQL, one unpaged `per_page=100` request under
77
71
  // REST — while `totalCount` is exact, read from the issue's own dependency summary. A reader that
@@ -80,8 +74,7 @@ const blocking_issue_schema = z.object({
80
74
  // reads as complete. Every issue the reads go through carries one, so that is a guard rather than
81
75
  // a case. **Only the `auto-ok` pickup compares them**; the epic readers judge from the page they
82
76
  // were given, so an epic child declaring more blockers than one page holds is read from the first
83
- // page. Carried here so the field is available, not because every reader consults it
84
- // (joshuafolkken/kit#1005).
77
+ // page. Carried here so the field is available, not because every reader consults it.
85
78
  const blocked_by_schema = z
86
79
  .object({
87
80
  nodes: z.array(blocking_issue_schema).default([]),
@@ -99,7 +92,7 @@ const epic_child_schema = z.object({
99
92
  //
100
93
  // Carried here rather than beside either reader: the pull request's conversation comments and an
101
94
  // epic's are the *same endpoint* answering the same objects, so a second declaration of this shape
102
- // would be the clone `CLAUDE.md` prohibits (joshuafolkken/kit#1039). `ai_review_pull_comment_schema`
95
+ // would be the clone `CLAUDE.md` prohibits. `ai_review_pull_comment_schema`
103
96
  // above is the `gh --json` spelling the scan reads after the mapping, not this one.
104
97
  const rest_comment_schema = z.looseObject({
105
98
  body: z.string().nullish(),
@@ -112,7 +105,7 @@ const rest_comment_schema = z.looseObject({
112
105
  const issue_label_schema = z.object({ name: z.string() })
113
106
 
114
107
  // `state` is optional because most readers ignore it — only `epic-add.ts` consults it, to refuse
115
- // adding a child to a closed epic (joshuafolkken/kit#2337). A reader that never asks the state field
108
+ // adding a child to a closed epic. A reader that never asks the state field
116
109
  // still parses cleanly.
117
110
  const epic_subject_schema = z.object({
118
111
  number: z.number(),
@@ -123,11 +116,11 @@ const epic_subject_schema = z.object({
123
116
 
124
117
  // One row of an open-issue listing, under the field names `gh issue list --json` answered with.
125
118
  // Three readers parse a listing through this shape: the next-issues display printed when a workflow
126
- // completes (#821), the `auto-ok` pickup (joshuafolkken/kit#906), and the per-repository busy check
127
- // `epic:next` makes before it offers a child (joshuafolkken/kit#925).
119
+ // completes, the `auto-ok` pickup, and the per-repository busy check
120
+ // `epic:next` makes before it offers a child.
128
121
  //
129
- // The row is *assembled* under those names rather than returned under them. Since
130
- // joshuafolkken/kit#1025 the listing is REST, and `blockedBy` is not part of a listing response at
122
+ // The row is *assembled* under those names rather than returned under them. The listing is REST,
123
+ // and `blockedBy` is not part of a listing response at
131
124
  // all: `git-gh-issue-list.ts` reads the relations from each row's own dependencies endpoint, and
132
125
  // only for the pickup, which is the one caller whose field list names `blockedBy` at all.
133
126
  //
@@ -140,7 +133,7 @@ const open_issue_schema = z.object({
140
133
  labels: z.array(issue_label_schema).optional(),
141
134
  createdAt: z.string(),
142
135
  blockedBy: blocked_by_schema,
143
- // Present only on the pickup listing, which reads it for the restructures each issue declares.
136
+ // Present only on the pickup listing, which reads it for the paths each issue declares.
144
137
  body: z.string().optional(),
145
138
  })
146
139
 
@@ -3,7 +3,7 @@ import { GIT_TIMEOUT_MS } from '#scripts/lib/timeouts'
3
3
  import { execaSync } from 'execa'
4
4
  import { git_utilities } from './constants'
5
5
 
6
- // The one place a synchronous git command is spawned from (joshuafolkken/kit#3065) — the sync
6
+ // The one place a synchronous git command is spawned from — the sync
7
7
  // counterpart of `git-spawn.ts`. Every caller here wants an answer rather than an exception, so a
8
8
  // non-zero exit is returned as a result, and every call is bounded: a git that never answers is an
9
9
  // unknown the caller already handles, never a hang.
@@ -1,3 +1,4 @@
1
+ import { GIT_TIMEOUT_MS } from '#scripts/lib/timeouts'
1
2
  import { execa } from 'execa'
2
3
  import { git_utilities } from './constants'
3
4
  import {
@@ -9,7 +10,7 @@ import {
9
10
  import { PUSH_TIMEOUT_MS } from './git-push-transport'
10
11
  import { git_ssh_keepalive } from './git-ssh-keepalive'
11
12
 
12
- // The one place the ordinary git commands are spawned from (joshuafolkken/kit#1640). It sits in a
13
+ // The one place the ordinary git commands are spawned from. It sits in a
13
14
  // module of its own rather than inside `git-command.ts` so that a second command module —
14
15
  // `git-worktree.ts` — can read it without importing the first. `read` is what resolves the git binary
15
16
  // and turns a non-zero exit into an error, and a second spawn helper beside it would be the clone
@@ -19,26 +20,32 @@ import { git_ssh_keepalive } from './git-ssh-keepalive'
19
20
  // second helper of this kind: a push needs a transport-fault retry that no other command has, so it
20
21
  // spawns git itself. The timeout it carries is shared here by `read_remote` / `with_output_remote`. Those two files are the spawn sites of the ordinary command
21
22
  // modules — the claim stops there. A synchronous caller goes through `git-spawn-sync.ts`, the same
22
- // binary resolution with a result instead of an exception (joshuafolkken/kit#3065). Other parts of
23
+ // binary resolution with a result instead of an exception. Other parts of
23
24
  // this package spawn git for their own purposes (`scripts/run/progress/run-progress-clock.ts`,
24
25
  // `scripts/git/git-fixture-workspace.ts`), and an audit of how the git binary is resolved has to read
25
26
  // those too.
26
27
 
27
- async function read(arguments_: Array<string>): Promise<string> {
28
+ // Bounded by `GIT_TIMEOUT_MS` unless the caller says otherwise, as the synchronous `git_spawn_sync.run`
29
+ // is: a local git that never answers ends the call instead of holding an unattended run open.
30
+ async function read(
31
+ arguments_: Array<string>,
32
+ timeout_ms: number = GIT_TIMEOUT_MS,
33
+ ): Promise<string> {
28
34
  const git_cmd = git_utilities.get_git_command_for_spawn()
29
35
  // execa runs the binary directly with an argument array and no `shell` option, so CLI
30
36
  // args cannot break out of a shell sandbox; the git command and args are internally
31
37
  // controlled, never untrusted input. tssecurity:S8705 is a false positive here.
32
- const { stdout } = await execa(git_cmd, arguments_) // NOSONAR
38
+ const { stdout } = await execa(git_cmd, arguments_, { timeout: timeout_ms }) // NOSONAR
33
39
 
34
40
  return stdout.trimEnd()
35
41
  }
36
42
 
37
- // The budget for a git call that talks to the remote — `fetch` and `pull` (joshuafolkken/kit#2942).
38
- // `read` and `with_output` wait without end, and a `git fetch --prune` under `josh main:sync` sat on
39
- // a dead ssh connection for 37 minutes, stalling the unattended backlog driver whose merge step runs
40
- // it. The push's budget is reused rather than a second number chosen: both transfer objects over the
41
- // same transport, and that one is already read off what a healthy transfer costs here.
43
+ // The budget for a git call that talks to the remote — `fetch` and `pull`.
44
+ // `read` and `with_output` once waited without end, and a `git fetch --prune` under `josh main:sync`
45
+ // sat on a dead ssh connection for 37 minutes, stalling the unattended backlog driver whose merge step
46
+ // runs it. Their default now is a local command's, far too short for a transfer, so a remote call
47
+ // still takes this one. The push's budget is reused rather than a second number chosen: both transfer
48
+ // objects over the same transport, and that one is already read off what a healthy transfer costs here.
42
49
  const REMOTE_TIMEOUT_MS = PUSH_TIMEOUT_MS
43
50
  const MS_PER_SECOND = 1000
44
51
 
@@ -46,7 +53,7 @@ const MS_PER_SECOND = 1000
46
53
  // `cause` carries the same `TIMEOUT_EXIT_CODE` a timed-out push does. Unlike the push it is not
47
54
  // retried here: what the issue needed is that the wait ends, and a failure then surfaces to the
48
55
  // caller — `run:merge` raises a failed `main:sync` — instead of a second budget doubling the wait.
49
- function to_remote_error(command: string, error: unknown, timeout_ms: number): Error {
56
+ function to_budget_error(command: string, error: unknown, timeout_ms: number): Error {
50
57
  if (!has_timed_out(error)) return create_spawn_error(command, get_exit_code(error))
51
58
 
52
59
  const seconds = String(Math.round(timeout_ms / MS_PER_SECOND))
@@ -75,7 +82,7 @@ async function spawn_remote(arguments_: Array<string>, options: RemoteOptions):
75
82
 
76
83
  return typeof stdout === 'string' ? stdout.trimEnd() : ''
77
84
  } catch (error) {
78
- throw to_remote_error(arguments_[0] ?? '', error, options.timeout)
85
+ throw to_budget_error(arguments_[0] ?? '', error, options.timeout)
79
86
  }
80
87
  }
81
88
 
@@ -101,16 +108,32 @@ async function with_output_remote(command: string, arguments_list: Array<string>
101
108
  })
102
109
  }
103
110
 
104
- async function with_output(command: string, arguments_list: Array<string>): Promise<void> {
111
+ // `config_options` are `-c <key>=<value>` pairs, which git reads only ahead of the command name and
112
+ // which last for this one call — nothing is written into anyone's git configuration.
113
+ //
114
+ // `timeout_ms` defaults to a local command's budget. A command that runs hooks — a commit, a merge,
115
+ // `git hook run` — is not one, and names the longer budget itself.
116
+ interface OutputOptions {
117
+ config_options?: ReadonlyArray<string>
118
+ timeout_ms?: number
119
+ }
120
+
121
+ async function with_output(
122
+ command: string,
123
+ arguments_list: Array<string>,
124
+ options: OutputOptions = {},
125
+ ): Promise<void> {
126
+ const { config_options = [], timeout_ms = GIT_TIMEOUT_MS } = options
105
127
  const git_command_bin = git_utilities.get_git_command_for_spawn()
128
+ const spawn_arguments = [...config_options, command, ...arguments_list]
106
129
 
107
130
  try {
108
131
  // execa runs the binary directly with an argument array and no `shell` option, so CLI
109
132
  // args cannot break out of a shell sandbox; the git command and args are internally
110
133
  // controlled, never untrusted input. tssecurity:S8705 is a false positive here.
111
- await execa(git_command_bin, [command, ...arguments_list], { stdio: 'inherit' }) // NOSONAR
134
+ await execa(git_command_bin, spawn_arguments, { stdio: 'inherit', timeout: timeout_ms }) // NOSONAR
112
135
  } catch (error) {
113
- throw create_spawn_error(command, get_exit_code(error))
136
+ throw to_budget_error(command, error, timeout_ms)
114
137
  }
115
138
  }
116
139
 
@@ -1,8 +1,10 @@
1
+ import { PROBE_TIMEOUT_MS } from '#scripts/lib/timeouts'
1
2
  import { execa } from 'execa'
2
3
  import { git_utilities } from './constants'
4
+ import { has_timed_out } from './git-execa-error'
3
5
 
4
- // The ssh environment every git network call runs under (joshuafolkken/kit#2942). It began inside
5
- // `git-push-transport.ts` as the push's own (joshuafolkken/kit#1251), and moved here when the fetch
6
+ // The ssh environment every git network call runs under. It began inside
7
+ // `git-push-transport.ts` as the push's own, and moved here when the fetch
6
8
  // and pull of `josh main:sync` turned out to need the same thing: a dead connection under a `git
7
9
  // fetch` was waited on for 37 minutes, stalling the unattended backlog driver behind it.
8
10
  //
@@ -16,6 +18,8 @@ const SSH_COMMAND_VARIABLE = 'GIT_SSH_COMMAND'
16
18
  const SSH_LEGACY_VARIABLE = 'GIT_SSH'
17
19
  const KEEPALIVE_SSH_COMMAND = `ssh ${SSH_KEEPALIVE_OPTIONS}`
18
20
  const SSH_COMMAND_CONFIG_KEY = 'core.sshCommand'
21
+ const CONFIG_PROBE_ARGUMENTS = ['config', '--get', SSH_COMMAND_CONFIG_KEY]
22
+ const PROBE_OPTIONS = { timeout: PROBE_TIMEOUT_MS }
19
23
 
20
24
  // Whatever already decides how ssh is invoked, or an empty string when nothing does. git reads three
21
25
  // sources in this order — `GIT_SSH_COMMAND`, `core.sshCommand`, then the legacy `GIT_SSH` — and the
@@ -50,12 +54,15 @@ async function has_configured_ssh_command(): Promise<boolean> {
50
54
  // execa runs the binary directly with an argument array and no `shell` option, so CLI
51
55
  // args cannot break out of a shell sandbox; the git command and args are internally
52
56
  // controlled, never untrusted input. tssecurity:S8705 is a false positive here.
53
- const { stdout } = await execa(git_command_bin, ['config', '--get', SSH_COMMAND_CONFIG_KEY]) // NOSONAR
57
+ const { stdout } = await execa(git_command_bin, CONFIG_PROBE_ARGUMENTS, PROBE_OPTIONS) // NOSONAR
54
58
 
55
59
  return stdout.trim() !== ''
56
- } catch {
60
+ } catch (error) {
57
61
  // `git config --get` exits 1 when the key is unset, which is the answer rather than a failure.
58
- return false
62
+ // A probe that never answers lands here as well: the remote call awaits this before its own
63
+ // budget starts, so a wait here is one that budget cannot end. It did not say the key is unset,
64
+ // so it reads as configured — guessing "unset" would put a plain `ssh` over a per-repository key.
65
+ return has_timed_out(error)
59
66
  }
60
67
  }
61
68
 
@@ -68,17 +68,16 @@ async function stage_untracked_files(files: ReadonlyArray<string>): Promise<void
68
68
  for (const file of files) console.info(` + ${file}`)
69
69
  }
70
70
 
71
- // **The observation ledger rides the run's own commit** (joshuafolkken/kit#2763). It used to be
72
- // excluded here (joshuafolkken/kit#1756) and committed afterwards by `pnpm josh observations:flush` as
73
- // a pull request of its own — a second branch, CI wait and merge behind every run that appended a
74
- // line, 144 of them in one month. Staged with the run instead, the lines are reviewed and merged with
75
- // the pull request whose run recorded them, while CI for that pull request is the only wait.
71
+ // **The observation ledger rides the run's own commit**. Committing it separately would cost a
72
+ // second branch, CI wait and merge behind every run that appended a line. Staged with the run, the
73
+ // lines are reviewed and merged with the pull request whose run recorded them, while CI for that pull
74
+ // request is the only wait.
76
75
  //
77
- // **A line that breaks the grammar keeps the old exclusion** (joshuafolkken/kit#2123): the commit
76
+ // **A line that breaks the grammar keeps the old exclusion**: the commit
78
77
  // goes ahead without the ledger, and `pnpm josh observations:flush` — which refuses the same line and
79
78
  // names it — is where it is repaired. The migration is run first, as the flush runs it, so a line
80
- // still on an old path (joshuafolkken/kit#2724) is committed in the directory. **A lane carries its
81
- // own lines** (joshuafolkken/kit#2919): its writers append to its own tree's issue file, so this is
79
+ // still on an old path is committed in the directory. **A lane carries its
80
+ // own lines**: its writers append to its own tree's issue file, so this is
82
81
  // the step that takes them to the default branch.
83
82
  const LEDGER_PATHSPECS: ReadonlyArray<string> = [
84
83
  ...LEDGER_DIRECTORIES,
@@ -189,7 +189,7 @@ function build_commit_message(
189
189
  }
190
190
 
191
191
  // The file form exists because the PR body now carries a live-execution evidence section of commands
192
- // and their output (joshuafolkken/kit#2446) — text an inline double-quoted `--body` would have the shell
192
+ // and their output — text an inline double-quoted `--body` would have the shell
193
193
  // evaluate first. Resolved through `cli_body`, the shared reader every `*-file` flag uses.
194
194
  function resolve_pr_body(values: CliArguments['values']): string | undefined {
195
195
  return cli_body.resolve({
@@ -1,10 +1,11 @@
1
+ import { INSTALL_TIMEOUT_MS, SUITE_TIMEOUT_MS } from '#scripts/lib/timeouts'
1
2
  import { PORCELAIN_FLAG } from './constants'
2
3
  import { ls_remote_branch_arguments } from './git-ls-remote'
3
4
  import { git_spawn } from './git-spawn'
4
5
  import { repository_lock } from './repository-lock'
5
6
 
6
- // The four worktree reads and writes a lane's lifecycle needs, plus the branch deletion that ends it
7
- // (joshuafolkken/kit#1490; split out of `git-command.ts` under joshuafolkken/kit#1640). They live
7
+ // The four worktree reads and writes a lane's lifecycle needs, plus the branch deletion that ends it.
8
+ // They live
8
9
  // beside the other git commands rather than in `scripts/lane/` because `git_spawn.read` is what
9
10
  // resolves the git binary and turns a non-zero exit into an error — a second spawn helper next to it
10
11
  // would be the clone `CLAUDE.md` prohibits, so this module imports the shared one.
@@ -13,15 +14,14 @@ import { repository_lock } from './repository-lock'
13
14
  // asynchronous `git ls-remote` spawn, and a second spawn helper beside it would be that same clone.
14
15
  // **It is not the only one in this package** — `propagate_git.has_remote_branch` runs the same query
15
16
  // synchronously against a consumer's path, and the two share their arguments through
16
- // `git-ls-remote.ts` rather than the spawn (joshuafolkken/kit#1732). Its sole
17
- // caller is now `git-remote-branch.ts`, which turns the raw output into the three-way answer
18
- // (`absent` / `present` / `unreachable`) that `lane-start-point.ts` and `release-publish.ts` both act
19
- // on — so this module stops at "what git printed" and the meaning of it is decided there
20
- // (joshuafolkken/kit#1641; before it, `lane-start-point.ts` was the only reader and did both).
17
+ // `git-ls-remote.ts` rather than the spawn. Its sole caller is `git-remote-branch.ts`, which turns
18
+ // the raw output into the three-way answer (`absent` / `present` / `unreachable`) that
19
+ // `lane-start-point.ts` and `release-publish.ts` both act on — so this module stops at "what git
20
+ // printed" and the meaning of it is decided there.
21
21
  const WORKTREE = 'worktree'
22
22
 
23
- // **Every call that writes `.git/worktrees/` runs under one repository-wide lock**
24
- // (joshuafolkken/kit#2736). `git worktree add` is not safe against itself: while one add is still
23
+ // **Every call that writes `.git/worktrees/` runs under one repository-wide lock**.
24
+ // `git worktree add` is not safe against itself: while one add is still
25
25
  // building `.git/worktrees/<id>/` — its `commondir` not yet written — a second add enumerates the
26
26
  // existing registrations, reads the half-built one and fails with `fatal: failed to read
27
27
  // .git/worktrees/<id>/commondir`. Two lanes opened at once do exactly that, and the per-seat lock in
@@ -33,10 +33,13 @@ const WORKTREE_LOCK_PREFIX = 'josh-worktree-lock-'
33
33
  // because a large repository's checkout is itself several seconds, and several lanes queue behind it.
34
34
  const WORKTREE_LOCK_MAX_WAIT_MS = 120_000
35
35
 
36
- async function locked(arguments_: Array<string>): Promise<string> {
36
+ // `timeout_ms` is left out by every call that only edits git's own records. An add checks a tree out
37
+ // and so runs the `post-checkout` hook — a `pnpm install` in some consumers — on a suite's budget
38
+ // instead of a local git command's, and a removal names the budget of what it deletes.
39
+ async function locked(arguments_: Array<string>, timeout_ms?: number): Promise<string> {
37
40
  const target = repository_lock.lock_path(WORKTREE_LOCK_PREFIX)
38
41
  const output = await repository_lock.with_lock(
39
- async () => await git_spawn.read(arguments_),
42
+ async () => await git_spawn.read(arguments_, timeout_ms),
40
43
  target,
41
44
  WORKTREE_LOCK_MAX_WAIT_MS,
42
45
  )
@@ -61,15 +64,15 @@ async function worktree_list(): Promise<string> {
61
64
  // a detached HEAD; `start_point` is passed explicitly rather than left to `HEAD`, because a lane is
62
65
  // branched from the default branch whatever the checkout that opened it happens to be sitting on.
63
66
  //
64
- // **`--no-track` is load-bearing now that the start point is a remote-tracking ref**
65
- // (joshuafolkken/kit#1535). Branching from `refs/remotes/origin/<default>` makes git's default
67
+ // **`--no-track` is load-bearing now that the start point is a remote-tracking ref**.
68
+ // Branching from `refs/remotes/origin/<default>` makes git's default
66
69
  // `branch.autoSetupMerge` set `branch.<lane>.merge=refs/heads/<default>`, and a bare `git push` from
67
70
  // the lane then fails with "the upstream branch of your current branch does not match the name of
68
71
  // your current branch" — which is *not* the missing-upstream error `push()` retries as
69
72
  // `--set-upstream`, so every lane's `pnpm josh git` would stop there. Measured against git 2.x.
70
73
  //
71
74
  // **An absent `start_point` attaches the tree to the branch that is already there, and neither flag
72
- // is passed then** (joshuafolkken/kit#1627). `-b` refuses a branch that exists, so a lane whose child
75
+ // is passed then**. `-b` refuses a branch that exists, so a lane whose child
73
76
  // had already pushed could not be reopened at all; deleting the branch first to get `-b` back would
74
77
  // discard those commits and orphan the pull request. `--no-track` cannot ride along either — git
75
78
  // answers `--[no-]track can only be used if a new branch is created` — and it has nothing to do here:
@@ -81,22 +84,25 @@ async function worktree_add(
81
84
  ): Promise<string> {
82
85
  const flags = start_point === undefined ? ['add'] : ['add', '--no-track', '-b', branch_name]
83
86
 
84
- return await locked([WORKTREE, ...flags, directory, start_point ?? branch_name])
87
+ return await locked([WORKTREE, ...flags, directory, start_point ?? branch_name], SUITE_TIMEOUT_MS)
85
88
  }
86
89
 
87
90
  // A throwaway tree at one commit, on no branch — `josh test:red` checks the merge-base out here, so
88
- // the pre-fix tree is built without creating a branch or touching the caller's tree and index
89
- // (joshuafolkken/kit#2448).
91
+ // the pre-fix tree is built without creating a branch or touching the caller's tree and index.
90
92
  async function worktree_add_detached(directory: string, commit: string): Promise<string> {
91
- return await locked([WORKTREE, 'add', '--detach', directory, commit])
93
+ return await locked([WORKTREE, 'add', '--detach', directory, commit], SUITE_TIMEOUT_MS)
92
94
  }
93
95
 
94
96
  // **`--force` is the point, not a convenience.** A lane is closed after a park, a failure or an
95
97
  // interruption as readily as after a success, and in each of those the tree still holds uncommitted
96
98
  // or untracked work. Refusing to remove it there would leave exactly the debris the close exists to
97
99
  // prevent.
100
+ //
101
+ // **It takes an install's budget, not a local git command's.** The tree it deletes holds the
102
+ // `node_modules` an install wrote, and a removal cut partway leaves a half-deleted tree git still
103
+ // registers — which `release_worktree.remove` does not step over, so the release branch stays too.
98
104
  async function worktree_remove(directory: string): Promise<string> {
99
- return await locked([WORKTREE, 'remove', '--force', directory])
105
+ return await locked([WORKTREE, 'remove', '--force', directory], INSTALL_TIMEOUT_MS)
100
106
  }
101
107
 
102
108
  // Drops the registrations whose directories are already gone — what makes a lane whose directory was
@@ -105,21 +111,23 @@ async function worktree_prune(): Promise<string> {
105
111
  return await locked([WORKTREE, 'prune'])
106
112
  }
107
113
 
108
- // **Asked of the remote itself, because nothing prunes the remote-tracking refs**
109
- // (joshuafolkken/kit#1627). `lane:close` deletes the local branch, GitHub deletes the remote one at
114
+ // **Asked of the remote itself, because nothing prunes the remote-tracking refs**.
115
+ // `lane:close` deletes the local branch, GitHub deletes the remote one at
110
116
  // the merge, and `refs/remotes/origin/<N>-lane` outlives both: this repository carried sixteen of
111
117
  // them for branches the remote no longer had. Empty output on a zero exit is therefore "not on the
112
118
  // remote", which a stale ref cannot say, and a non-zero exit is "could not ask" — a different answer
113
119
  // again, and the reason the caller cannot use `fetch` for this: `fetch` fails identically for a
114
120
  // branch that is gone and for a network that is down, and prunes neither (measured on git 2.x).
115
121
  //
116
- // **The arguments come from `git-ls-remote.ts`, which is the single source of the full ref path**
117
- // (joshuafolkken/kit#1709 for the anchoring, joshuafolkken/kit#1732 for the sharing). What broke
118
- // here was the truthfulness of the message rather than the safety of the answer: `lane:open` was
119
- // told origin has the lane branch and then stopped naming a branch nobody could find there, and the
120
- // release guard refused a name that was free.
122
+ // **The arguments come from `git-ls-remote.ts`, which is the single source of the full ref path.**
123
+ // An unanchored ref would make the message untruthful rather than the answer unsafe: `lane:open`
124
+ // would be told origin has the lane branch and then stop naming a branch nobody could find there,
125
+ // and the release guard would refuse a name that was free.
126
+ //
127
+ // **It takes the remote budget, not `read`'s**: that default is a local command's, and an ssh that
128
+ // is slow to connect or waiting at a passphrase prompt would be cut there and read as `unreachable`.
121
129
  async function ls_remote_branch(branch_name: string): Promise<string> {
122
- return await git_spawn.read(ls_remote_branch_arguments(branch_name))
130
+ return await git_spawn.read_remote(ls_remote_branch_arguments(branch_name))
123
131
  }
124
132
 
125
133
  // `-D` rather than `-d`: a lane branch is deleted whatever state its work reached, and `-d` refuses
@@ -1,6 +1,6 @@
1
1
  import { git_spawn } from './git-spawn'
2
2
 
3
- // The local branches `josh ms` removes after it syncs (joshuafolkken/kit#2504). The repository
3
+ // The local branches `josh ms` removes after it syncs. The repository
4
4
  // deletes a pull request's remote branch at the merge, and nothing removed the local copy: measured on
5
5
  // 2026-09-24, 212 of the primary checkout's 244 local branches tracked an upstream that was `[gone]`.
6
6
  //
@@ -102,7 +102,7 @@ async function delete_each(names: ReadonlyArray<string>): Promise<PruneResult> {
102
102
 
103
103
  // `fetch --prune` first, because `[gone]` is read from the remote-tracking refs and those outlive the
104
104
  // remote branch until something prunes them. The fetch is the one call here that reaches the remote,
105
- // so it is the one bounded (joshuafolkken/kit#2942).
105
+ // so it is the one bounded.
106
106
  async function prune(default_branch: string): Promise<PruneResult> {
107
107
  await git_spawn.read_remote(['fetch', '--prune'])
108
108
 
@@ -1,7 +1,6 @@
1
1
  import { MAX_SCANNED } from '#scripts/gh/git-gh-issue-list'
2
2
 
3
- // Why an open-issue listing stopped short of the end of the backlog, or that it did not
4
- // (joshuafolkken/kit#1067).
3
+ // Why an open-issue listing stopped short of the end of the backlog, or that it did not.
5
4
  //
6
5
  // Every caller of `issue_list` asks this same question, and before this the answer was written
7
6
  // out again at each of them — `rows.length >= LIMIT` in `epic:bundle` and the `auto-ok` pickup, a
@@ -0,0 +1,65 @@
1
+ import { createHash } from 'node:crypto'
2
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs'
3
+ import path from 'node:path'
4
+ import { lane_install } from '#scripts/lane/lane-install'
5
+
6
+ // Keeping the primary checkout's `node_modules` in step with its lock. A
7
+ // fast-forward that brought in a merge adding `cli-spinners` left the primary checkout without it, and
8
+ // every `josh` typed there — the supervisor's driver included — failed with `ERR_MODULE_NOT_FOUND`
9
+ // until someone ran the install by hand.
10
+ //
11
+ // **The trigger is the lock differing from the one last installed, not the sync itself.** Most syncs
12
+ // pull no dependency change, and an install on every one would cost seconds per child for nothing. The
13
+ // comparison is against a record written after a successful install rather than against the lock read
14
+ // before the sync: a sync-relative trigger forgets a failed install, so the retry saw an unchanged lock
15
+ // and left `node_modules` stale, where this one keeps asking until an install succeeds. The record lives
16
+ // inside `node_modules`, so deleting the directory forgets it too. The install is `lane_install`'s, so
17
+ // `--frozen-lockfile`, the buffered output and the timeout stay single-sourced with the lane's own fill.
18
+
19
+ const LOCKFILE_NAME = 'pnpm-lock.yaml'
20
+ const RECORD_PATH = path.join('node_modules', '.josh-installed-lock')
21
+
22
+ const UP_TO_DATE = { is_installed: true, output: '' }
23
+
24
+ interface LockfileSyncResult {
25
+ is_installed: boolean
26
+ output: string
27
+ }
28
+
29
+ function read_text(file_path: string): string | undefined {
30
+ return existsSync(file_path) ? readFileSync(file_path, 'utf8') : undefined
31
+ }
32
+
33
+ function digest(content: string): string {
34
+ return createHash('sha256').update(content).digest('hex')
35
+ }
36
+
37
+ function record(directory: string, lock_digest: string): void {
38
+ const record_path = path.join(directory, RECORD_PATH)
39
+
40
+ mkdirSync(path.dirname(record_path), { recursive: true })
41
+ writeFileSync(record_path, lock_digest)
42
+ }
43
+
44
+ /**
45
+ * Reinstall when the lock in `directory` differs from the one the last successful install recorded.
46
+ * A checkout with no lock, or one already installed, spawns nothing and reports installed.
47
+ */
48
+ async function reinstall_if_stale(directory: string): Promise<LockfileSyncResult> {
49
+ const lock = read_text(path.join(directory, LOCKFILE_NAME))
50
+
51
+ if (lock === undefined) return UP_TO_DATE
52
+ const lock_digest = digest(lock)
53
+
54
+ if (read_text(path.join(directory, RECORD_PATH)) === lock_digest) return UP_TO_DATE
55
+ const result = await lane_install.install_dependencies(directory)
56
+
57
+ if (result.is_installed) record(directory, lock_digest)
58
+
59
+ return result
60
+ }
61
+
62
+ const lockfile_sync = { reinstall_if_stale }
63
+
64
+ export type { LockfileSyncResult }
65
+ export { lockfile_sync, LOCKFILE_NAME, RECORD_PATH }
@@ -1,7 +1,6 @@
1
1
  import { git_spawn } from './git-spawn'
2
2
 
3
- // What `josh main:merge` refuses before it merges, and what it tells the run to do instead
4
- // (joshuafolkken/kit#2445).
3
+ // What `josh main:merge` refuses before it merges, and what it tells the run to do instead.
5
4
  //
6
5
  // **A dirty tree is not refused as such.** The chain runs `main:merge` before the commit, over the
7
6
  // uncommitted implementation, and git carries uncommitted changes through a merge that touches none of
@@ -1,13 +1,13 @@
1
1
  #!/usr/bin/env tsx
2
2
  import { fileURLToPath } from 'node:url'
3
3
  import { extract_issue_number } from '#scripts/hooks/check-commit-message'
4
+ import { issue_cite } from '#scripts/issue/issue-cite'
4
5
  import { composite_arguments, USAGE_ERROR_EXIT_CODE } from '#scripts/josh/josh-composite-arguments'
5
6
  import { error_text } from '#scripts/lib/error-message'
6
7
  import { git_command } from './git-command'
7
8
  import { main_merge_guard } from './main-merge-guard'
8
9
 
9
- // `josh main:merge` (`josh mm`) — bring the default branch into the branch this checkout is on
10
- // (joshuafolkken/kit#1659).
10
+ // `josh main:merge` (`josh mm`) — bring the default branch into the branch this checkout is on.
11
11
  //
12
12
  // **It stopped being a `git pull` because `git pull` cannot decide anything on a diverged branch.**
13
13
  // With neither `pull.rebase` nor `pull.ff` set — the state of a checkout nobody has configured — git
@@ -21,7 +21,7 @@ import { main_merge_guard } from './main-merge-guard'
21
21
  //
22
22
  // The strategy is therefore named by this file rather than read out of whoever's git configuration
23
23
  // happens to be in force: **fetch, then merge `origin/<default>` into the current branch.** Merging
24
- // rather than rebasing is joshuafolkken/kit#1446's decision and not a fresh one — a rebase rewrites
24
+ // rather than rebasing because a rebase rewrites
25
25
  // commits that are already pushed, so it needs a force push, which `.claude/settings.json` denies.
26
26
  //
27
27
  // `git_command.merge_fast_forward` is deliberately not reused: it passes `--ff-only`, which fails
@@ -33,7 +33,7 @@ const ARGV_OFFSET = 2
33
33
  const COMMAND_NAME = 'main:merge'
34
34
 
35
35
  // git's default merge message carries no `#N`, so on an issue branch the `commit-msg` hook refuses
36
- // it and leaves the index mid-merge (joshuafolkken/kit#2439). The number is read with the hook's
36
+ // it and leaves the index mid-merge. The number is read with the hook's
37
37
  // own parser, so the message this writes is exactly the one that hook accepts; a branch without a
38
38
  // number keeps git's default.
39
39
  function merge_message(default_branch: string, current_branch: string): string | undefined {
@@ -41,10 +41,10 @@ function merge_message(default_branch: string, current_branch: string): string |
41
41
 
42
42
  if (issue_number === undefined) return undefined
43
43
 
44
- return `Merge ${default_branch} into ${current_branch} #${issue_number}`
44
+ return `Merge ${default_branch} into ${current_branch} ${issue_cite.plain(issue_number)}`
45
45
  }
46
46
 
47
- // What one merge of the default branch came to (joshuafolkken/kit#3221). `josh ship` merges it again
47
+ // What one merge of the default branch came to. `josh ship` merges it again
48
48
  // before the commit and on a conflicting pull request, and branches on the answer rather than on an
49
49
  // exit code: `current` brought nothing in, so the tree is unchanged; `merged` changed it; `refused`
50
50
  // is the guard's answer, nothing attempted; `conflict` names the paths git left unmerged, so a resumed
@@ -81,7 +81,7 @@ async function merge_into(target: MergeTarget): Promise<MergeOutcome> {
81
81
 
82
82
  // The fetch is what makes `origin/<default>` current before the merge reads it. `git pull` did the
83
83
  // two together, which is the only thing it was doing here that is worth keeping. The refusal is read
84
- // after the fetch, so the incoming paths are the ones the merge would bring in (joshuafolkken/kit#2445).
84
+ // after the fetch, so the incoming paths are the ones the merge would bring in.
85
85
  async function merge(): Promise<MergeOutcome> {
86
86
  const default_branch = await git_command.get_default_branch()
87
87
  const current_branch = await git_command.branch()