@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
@@ -0,0 +1,91 @@
1
+ import { observation_ledger_home } from './observation-ledger-home'
2
+ import { observation_ledger_line } from './observation-ledger-line'
3
+
4
+ // The count, the append and the promotion verdict of one observation-ledger sighting, as one command.
5
+ // They were a `cat | grep -c … || true` a run typed by hand, an append it
6
+ // wrote itself, and a "does the count answer exactly 1" it judged — three steps whose answers are
7
+ // fixed, now read off the ledger rather than re-derived in every run. The grammar and the promotion
8
+ // rule are `.claude/skills/workflow-commands/observation-ledger.md`'s.
9
+
10
+ const FILE_VERDICT = 'file'
11
+ const LEDGER_VERDICT = 'ledger'
12
+ const REFUSED_VERDICT = 'refused'
13
+ // The sample line in `observation-ledger.md` carries it, so a real sighting under it would be counted
14
+ // against the sample.
15
+ const RESERVED_SLUG = 'example'
16
+ const RESERVED_REASON = '`k:example` is reserved for the sample in observation-ledger.md'
17
+ // The one earlier sighting that makes this one the second — a higher count means the sighting that
18
+ // answered `1` already filed the Issue.
19
+ const PROMOTING_COUNT = 1
20
+
21
+ interface ObservationEntry {
22
+ slug: string
23
+ depth: string
24
+ where: string
25
+ what: string
26
+ }
27
+
28
+ interface RecordRequest {
29
+ entry: ObservationEntry
30
+ checkout: string
31
+ now: Date
32
+ }
33
+
34
+ type RecordResult =
35
+ | { verdict: typeof REFUSED_VERDICT; reason: string }
36
+ | {
37
+ verdict: typeof FILE_VERDICT | typeof LEDGER_VERDICT
38
+ earlier: ReadonlyArray<string>
39
+ line: string
40
+ target: string
41
+ }
42
+
43
+ function entry_line(entry: ObservationEntry, date: string): string {
44
+ return `- k:${entry.slug} | ${entry.depth} | ${date} | ${entry.where} | ${entry.what}`
45
+ }
46
+
47
+ function refusal_of(entry: ObservationEntry, line: string): string | undefined {
48
+ if (entry.slug === RESERVED_SLUG) return RESERVED_REASON
49
+
50
+ return observation_ledger_line.line_reason(line)
51
+ }
52
+
53
+ // Every ledger line already carrying the key, across every file — a recurrence is a recurrence
54
+ // whichever issue's file each sighting sits in. No ledger at all is a first sighting.
55
+ function sightings(ledger: string | undefined, slug: string): ReadonlyArray<string> {
56
+ const prefix = `- k:${slug} |`
57
+
58
+ return (ledger ?? '').split('\n').filter((line) => line.startsWith(prefix))
59
+ }
60
+
61
+ // The count is read before the append, so it is the sightings *before* this one.
62
+ async function record(request: RecordRequest): Promise<RecordResult> {
63
+ const date = observation_ledger_home.ledger_date(request.now)
64
+ const line = entry_line(request.entry, date)
65
+ const reason = refusal_of(request.entry, line)
66
+
67
+ if (reason !== undefined) return { verdict: REFUSED_VERDICT, reason }
68
+
69
+ const earlier = sightings(
70
+ await observation_ledger_home.read(request.checkout),
71
+ request.entry.slug,
72
+ )
73
+ const target = await observation_ledger_home.writer_path(request.now, request.checkout)
74
+
75
+ await observation_ledger_home.append(target, [line])
76
+
77
+ const verdict = earlier.length === PROMOTING_COUNT ? FILE_VERDICT : LEDGER_VERDICT
78
+
79
+ return { verdict, earlier, line, target }
80
+ }
81
+
82
+ const observation_record = { record }
83
+
84
+ export {
85
+ FILE_VERDICT,
86
+ LEDGER_VERDICT,
87
+ observation_record,
88
+ REFUSED_VERDICT,
89
+ type ObservationEntry,
90
+ type RecordResult,
91
+ }
@@ -9,7 +9,7 @@ const FAILURE_EXIT_CODE = 1
9
9
  // as a stack: "this checkout is on a feature branch" and "the tree holds somebody else's work" are
10
10
  // both things the person fixes in one step, and a trace hides the sentence that says which.
11
11
  //
12
- // **It acts on the checkout it runs in** (joshuafolkken/kit#2919). A lane's ledger lines merge with
12
+ // **It acts on the checkout it runs in**. A lane's ledger lines merge with
13
13
  // the lane's own pull request, so a lane has nothing to flush and is refused like any feature branch.
14
14
  async function main(): Promise<void> {
15
15
  try {
@@ -1,12 +1,13 @@
1
1
  import { git_gh_command } from '#scripts/gh/git-gh-command'
2
2
  import type { OpenPull } from '#scripts/gh/git-gh-pr-auto-merge'
3
3
  import { git_pr_checks } from '#scripts/gh/git-pr-checks'
4
+ import { issue_cite } from '#scripts/issue/issue-cite'
4
5
  import { error_text } from '#scripts/lib/error-message'
5
6
 
6
- // **A flush pull request lands whether or not the flush that opened it is still alive**
7
- // (joshuafolkken/kit#2497). The merge used to happen only inside the flush's own wait, so a session
8
- // cut or a killed process left a green pull request open with nobody to merge it — and once a later
9
- // flush appended to the same ledger tail, it conflicted and could not land at all. Auto-merge moves
7
+ // **A flush pull request lands whether or not the flush that opened it is still alive**.
8
+ // A merge only inside the flush's own wait would let a session cut or a killed process leave a green
9
+ // pull request open with nobody to merge it — and once a later flush appended to the same ledger
10
+ // tail, it would conflict and could not land at all. Auto-merge moves
10
11
  // the merge to GitHub, and the wait that remains is only for fast-forwarding the local default
11
12
  // branch.
12
13
 
@@ -18,7 +19,7 @@ const MERGE_FAILED_REASON =
18
19
  'a required check failed or the branch conflicts, so auto-merge will not land the pull request'
19
20
 
20
21
  // **Best-effort, and the answer says which wait to use.** GraphQL — the only way to enable auto-merge
21
- // — can be refused in a cloud session (joshuafolkken/kit#1022), and that loses the safety net rather
22
+ // — can be refused in a cloud session, and that loses the safety net rather
22
23
  // than the flush: the in-process wait-and-merge still runs, exactly as before auto-merge existed.
23
24
  async function request_auto_merge(branch_name: string): Promise<boolean> {
24
25
  try {
@@ -49,7 +50,7 @@ async function wait_for_landing(branch_name: string, is_auto_merge: boolean): Pr
49
50
  }
50
51
 
51
52
  function describe_pull(pull: OpenPull): string {
52
- return `#${String(pull.number)} (\`${pull.head_ref}\`)`
53
+ return `${issue_cite.plain(pull.number)} (\`${pull.head_ref}\`)`
53
54
  }
54
55
 
55
56
  // **Landing means GitHub will merge it with nobody watching**: auto-merge is on and the merge gate has
@@ -7,9 +7,9 @@ import type { BrokenLine } from './observation-ledger-line'
7
7
  import { observation_ledger_prepare } from './observation-ledger-prepare'
8
8
  import { observations_flush_landing } from './observations-flush-landing'
9
9
 
10
- // The commit path for the ledger lines no run's own commit carried (joshuafolkken/kit#1756). Every run —
10
+ // The commit path for the ledger lines no run's own commit carried. Every run —
11
11
  // a lane's included — commits its appended lines with its own pull request (`scripts/git/
12
- // git-staging.ts`, joshuafolkken/kit#2763, joshuafolkken/kit#2919), and `pnpm josh followup` commits a
12
+ // git-staging.ts`), and `pnpm josh followup` commits a
13
13
  // line appended after that commit before it merges, so what is left here is a line written on the
14
14
  // default branch outside any issue's run — the date-named file `observation-ledger-home.ts` resolves.
15
15
  //
@@ -17,7 +17,7 @@ import { observations_flush_landing } from './observations-flush-landing'
17
17
  // their own over one path, wait on the same required checks every other pull request waits on, and
18
18
  // merge — so this reuses the same primitives rather than growing a second answer to "how does a
19
19
  // josh command open and land a pull request". The one difference is that this pull request is handed
20
- // to GitHub's auto-merge as soon as it opens (joshuafolkken/kit#2497), so it lands even when the wait
20
+ // to GitHub's auto-merge as soon as it opens, so it lands even when the wait
21
21
  // below does not survive — `observations-flush-landing.ts` carries why.
22
22
 
23
23
  const COMMIT_MESSAGE = 'Record observation ledger entries'
@@ -72,7 +72,7 @@ function status_paths(status_output: string): ReadonlyArray<string> {
72
72
  .map((line) => observation_ledger.status_path(line))
73
73
  }
74
74
 
75
- // **Single-sourced with `pnpm josh followup`'s pre-flush short-circuit** (joshuafolkken/kit#1810):
75
+ // **Single-sourced with `pnpm josh followup`'s pre-flush short-circuit**:
76
76
  // the ledger-change test lives in `observation-ledger.ts`, so the two callers cannot drift.
77
77
  function has_ledger_change(status_output: string): boolean {
78
78
  return observation_ledger.has_pending_append(status_output)
@@ -89,17 +89,17 @@ function other_changed_paths(status_output: string): ReadonlyArray<string> {
89
89
  // is what the ordinary off-default refusal says — would abandon them without a word, so this branch
90
90
  // of the refusal says the opposite.
91
91
  //
92
- // **The exits it names are ones the caller can actually take** (joshuafolkken/kit#1785). It used to
93
- // say "finish or delete that branch", and both are closed to an agent: the distributed
92
+ // **The exits it names are ones the caller can actually take**. "Finish or delete that branch" are
93
+ // both closed to an agent: the distributed
94
94
  // `.claude/settings.json` denies `Bash(git commit*)` and `Bash(git branch -d*)`, and `pnpm josh git`
95
- // excludes the ledger from staging by design (joshuafolkken/kit#1756), so finishing through it is not
95
+ // excludes the ledger from staging by design, so finishing through it is not
96
96
  // possible either. Pushing the branch and landing its pull request is the route that is open.
97
97
  function stranded_flush_message(current: string): string {
98
98
  return `\`${current}\` is a flush branch an earlier \`pnpm josh observations:flush\` left behind, and its appended observations are committed only there. Land it before flushing again — \`git push -u origin ${current}\`, then open and merge its pull request; \`pnpm josh ms\` here would leave the only copy of those lines behind.`
99
99
  }
100
100
 
101
- // **A flush branch with no commit on it strands nothing, so it is told the opposite**
102
- // (joshuafolkken/kit#1785). The appended lines never left the working tree, which makes the "only
101
+ // **A flush branch with no commit on it strands nothing, so it is told the opposite**.
102
+ // The appended lines never left the working tree, which makes the "only
103
103
  // copy" premise above factually false here — and makes `pnpm josh ms` the correct exit, the very one
104
104
  // the other message forbids.
105
105
  function empty_flush_message(current: string): string {
@@ -120,9 +120,9 @@ function off_default_message(current: string, default_branch: string): string {
120
120
  }
121
121
 
122
122
  // **A branch cut from a default branch that predates another merged flush conflicts by
123
- // construction** (joshuafolkken/kit#1768). The ledger is append-only and every writer adds at the
123
+ // construction**. The ledger is append-only and every writer adds at the
124
124
  // same tail, so a stale start point opens a pull request `wait_for_pr_success` waits on until it
125
- // exhausts its budget rather than merging. The flush fast-forwards first (joshuafolkken/kit#2462), so
125
+ // exhausts its budget rather than merging. The flush fast-forwards first, so
126
126
  // this is printed only when that fast-forward was refused — the reason is git's own.
127
127
  function behind_default_message(default_branch: string, reason: string): string {
128
128
  return `\`pnpm josh observations:flush\` cuts its branch from \`${default_branch}\`, which is behind \`origin/${default_branch}\` and could not be fast-forwarded (${reason}) — a branch cut here would open a pull request that cannot merge. Run \`pnpm josh ms\` first.`
@@ -183,7 +183,7 @@ async function refuse_off_default(current: string, default_branch: string): Prom
183
183
  }
184
184
 
185
185
  // **The start point's freshness is judged without moving the working tree**, which is the whole
186
- // point of doing it here rather than pulling (joshuafolkken/kit#1768). `git fetch` updates the
186
+ // point of doing it here rather than pulling. `git fetch` updates the
187
187
  // remote-tracking ref and `git rev-list --count HEAD..origin/<default>` reads it — neither writes a
188
188
  // file, so the ledger, dirty by definition when this runs, is left exactly as it is.
189
189
  async function commits_behind_default(default_branch: string): Promise<number> {
@@ -192,8 +192,8 @@ async function commits_behind_default(default_branch: string): Promise<number> {
192
192
  return await git_command.commit_count_beyond('HEAD', `origin/${default_branch}`)
193
193
  }
194
194
 
195
- // **A default branch that is only behind is brought forward rather than refused**
196
- // (joshuafolkken/kit#2462). A lane's flush acts on the primary checkout, whose default branch is
195
+ // **A default branch that is only behind is brought forward rather than refused**.
196
+ // A lane's flush acts on the primary checkout, whose default branch is
197
197
  // behind by the lane's own merge every time — so the refusal alone stopped every lane close. A
198
198
  // `--ff-only` merge moves no file the dirty ledger conflicts with: git refuses it, untouched, when an
199
199
  // incoming commit changes the ledger too, and only that case is still refused.
@@ -231,7 +231,7 @@ async function refuse_unsafe_flush(status_output: string): Promise<string> {
231
231
  // **Its exit code is read rather than discarded**: `run` catches its own errors and returns `1`, so a
232
232
  // checkout left on the flush branch would otherwise be reported as a completed flush.
233
233
  //
234
- // **The local default branch is fast-forwarded before it is checked out** (joshuafolkken/kit#2462).
234
+ // **The local default branch is fast-forwarded before it is checked out**.
235
235
  // Lines appended while the pull request waited leave the ledger dirty, and git refuses to check out a
236
236
  // default branch whose ledger differs from the flush branch's. Once the merge is in, the fast-forwarded
237
237
  // default branch holds the same ledger the flush branch does, so the checkout carries those lines over.
@@ -266,9 +266,8 @@ async function push_and_open(branch_name: string): Promise<string> {
266
266
  }
267
267
  }
268
268
 
269
- // **The side that created the branch is the side that rolls it back** (joshuafolkken/kit#1785). A
270
- // commit rejected by the pre-commit hook used to leave the branch behind with nothing on it, and the
271
- // refusal the next run printed named two exits an agent cannot take. Nothing is stranded at this
269
+ // **The side that created the branch is the side that rolls it back**, so a commit rejected by the
270
+ // pre-commit hook does not leave the branch behind with nothing on it. Nothing is stranded at this
272
271
  // point — the appended lines are still in the working tree, staged and uncommitted — so returning to
273
272
  // the default branch and removing the branch loses none of them.
274
273
  //
@@ -300,7 +299,7 @@ function rejection_message(
300
299
  return roll_back_failure_message(branch_name, reason, roll_back_reason)
301
300
  }
302
301
 
303
- // **Every ledger path the status names is staged, not the one constant** (joshuafolkken/kit#2724).
302
+ // **Every ledger path the status names is staged, not the one constant**.
304
303
  // After a migration the change is the new file together with the old one's deletion, and a commit
305
304
  // holding only the first would leave the deletion behind as a change no later flush could tell apart
306
305
  // from a fresh append.
@@ -342,8 +341,8 @@ async function open_pull_request(branch_name: string, default_branch: string): P
342
341
  // at any more. The next flush would read `has_ledger_change` as false and report `clean`, which is
343
342
  // the silent loss the refusals above exist to prevent. Left on the branch, the refusal fires.
344
343
  //
345
- // With auto-merge on, a failed wait no longer strands the lines for good — GitHub still merges once
346
- // the checks pass (joshuafolkken/kit#2497) — but the checkout stays on the branch all the same,
344
+ // With auto-merge on, a failed wait does not strand the lines for good — GitHub still merges once
345
+ // the checks pass — but the checkout stays on the branch all the same,
347
346
  // because only a merge this command has seen makes returning to the default branch safe.
348
347
  async function land(
349
348
  branch_name: string,
@@ -380,9 +379,9 @@ function broken_lines_message(broken: ReadonlyArray<BrokenLine>): string {
380
379
  }
381
380
 
382
381
  // **A malformed line is refused before a branch is cut, not after.** The ledger path was collected
383
- // without a line ever being parsed (joshuafolkken/kit#2123), so a broken append could ride a flush
382
+ // without a line ever being parsed, so a broken append could ride a flush
384
383
  // through; validating here keeps the committed ledger to its grammar. The migration and the parse are
385
- // `observation-ledger-prepare.ts`'s, shared with the run's own commit (joshuafolkken/kit#2763).
384
+ // `observation-ledger-prepare.ts`'s, shared with the run's own commit.
386
385
  async function prepare_ledger(): Promise<void> {
387
386
  const broken = await observation_ledger_prepare.prepare(process.cwd())
388
387
 
@@ -392,12 +391,12 @@ async function prepare_ledger(): Promise<void> {
392
391
  // **Nothing pulls in front of the branch, and that is deliberate.** The ledger is dirty by
393
392
  // definition at this point, so `git pull --ff-only` aborts on it in exactly the case a pull would
394
393
  // have been for — an upstream flush that already advanced the ledger — and reports a failure about
395
- // the wrong thing (joshuafolkken/kit#1756's second review round). So the freshness of the start
396
- // point is read from the remote first (joshuafolkken/kit#1768), and `catch_up_default` fast-forwards
397
- // only where git can do it without touching the ledger (joshuafolkken/kit#2462): a default branch
394
+ // the wrong thing. So the freshness of the start
395
+ // point is read from the remote first, and `catch_up_default` fast-forwards
396
+ // only where git can do it without touching the ledger: a default branch
398
397
  // that predates another merged flush still stops here — before a branch is cut — rather than opening
399
398
  // a pull request that cannot merge. An earlier flush pull request still open is checked for the same
400
- // reason (joshuafolkken/kit#2497): a branch cut beside it conflicts with it at the ledger's tail.
399
+ // reason: a branch cut beside it conflicts with it at the ledger's tail.
401
400
  async function flush(now: Date): Promise<string> {
402
401
  const status_output = await git_command.status()
403
402
  const default_branch = await refuse_unsafe_flush(status_output)
@@ -10,11 +10,15 @@
10
10
  */
11
11
  import { readFileSync, writeFileSync } from 'node:fs'
12
12
  import { fileURLToPath } from 'node:url'
13
- import { parseArgs } from 'node:util'
13
+ import { cli_flags } from '#scripts/lib/cli-flags'
14
14
  import { overrides_snapshot_schema } from '#scripts/lib/schemas'
15
15
  import { overrides_files } from './overrides-files'
16
16
  import { overrides_check, type OverridesDiff } from './overrides-logic'
17
17
 
18
+ const ARGV_OFFSET = 2
19
+ const OPTIONS = { save: { type: 'boolean', default: false } } as const
20
+ const USAGE = cli_flags.usage_line(['--save'], 'overrides')
21
+
18
22
  function is_file_not_found(error: unknown): boolean {
19
23
  return error instanceof Error && 'code' in error && error.code === 'ENOENT'
20
24
  }
@@ -70,15 +74,21 @@ function run_overrides_check(should_save: boolean): void {
70
74
  console.info(`✔ overrides unchanged (${summary}).`)
71
75
  }
72
76
 
73
- function main(): void {
74
- const { values } = parseArgs({
75
- options: { save: { type: 'boolean', default: false } },
76
- strict: true,
77
- })
77
+ // A line nobody can read is refused before the snapshot is read or written: a misspelled `--save` that
78
+ // fell through would compare against the record the caller meant to replace.
79
+ function refuse_usage(): never {
80
+ console.error(USAGE)
81
+
82
+ return process.exit(1)
83
+ }
84
+
85
+ function main(argv: ReadonlyArray<string>): void {
86
+ const values = cli_flags.values_of(argv, OPTIONS)
78
87
 
88
+ if (values === undefined) refuse_usage()
79
89
  run_overrides_check(values.save)
80
90
  }
81
91
 
82
- if (process.argv[1] === fileURLToPath(import.meta.url)) main()
92
+ if (process.argv[1] === fileURLToPath(import.meta.url)) main(process.argv.slice(ARGV_OFFSET))
83
93
 
84
- export { run_overrides_check }
94
+ export { run_overrides_check, main }
@@ -13,7 +13,7 @@ import { package_scout_format } from './package-scout-format'
13
13
 
14
14
  // `josh pkg:scout <keywords> [--size <n>]` — before the Package-First tier decision, rank the
15
15
  // candidate packages by measured metrics so "clearly best (Tier A)" and "genuine toss-up (Tier B)"
16
- // are read off the output rather than judged (joshuafolkken/kit#2216).
16
+ // are read off the output rather than judged.
17
17
  //
18
18
  // The registry answers in three reads: one search for the candidates, then per candidate a downloads
19
19
  // point and the latest version metadata (bundled types, license, unpacked size). A per-candidate read
@@ -6,8 +6,8 @@ import {
6
6
  } from './package-scout'
7
7
 
8
8
  // The printed shape of `josh pkg:scout` — one line per candidate with each metric labelled, then a
9
- // verdict line that names whether the choice is a Tier A pick or a Tier B question
10
- // (joshuafolkken/kit#2216). Formatting is pure so the layout and the verdict wording are unit-tested
9
+ // verdict line that names whether the choice is a Tier A pick or a Tier B question.
10
+ // Formatting is pure so the layout and the verdict wording are unit-tested
11
11
  // without a registry.
12
12
 
13
13
  // The blank shown for a metric the registry did not report — a fact absent, never a zero measured.
@@ -1,6 +1,6 @@
1
1
  // The measured metrics behind `josh pkg:scout` — the ranking of package candidates and the near-tie
2
2
  // verdict that turns the Package-First "clearly best (Tier A) / genuine toss-up (Tier B)" branch from
3
- // an impression into a computed answer (joshuafolkken/kit#2216).
3
+ // an impression into a computed answer.
4
4
  //
5
5
  // This module is the pure half: it takes candidates already gathered from the npm registry and
6
6
  // answers two things — the order they rank in, and whether the top two are close enough that the
@@ -7,7 +7,7 @@ import type { StepResult } from './propagate-run'
7
7
  // a failed spawn reports one exit code for all three. The run's report then appended "upgrade/sync
8
8
  // changes left uncommitted" to that code, which names the *first* of the three: so a consumer whose
9
9
  // pre-push hook refused the push was reported as a consumer whose sync never got committed, and the
10
- // reader went looking at a sync that had worked (joshuafolkken/kit#1417).
10
+ // reader went looking at a sync that had worked.
11
11
  //
12
12
  // **Nothing here changes whether a push is blocked.** A consumer's pre-push gate refusing a push is
13
13
  // the gate doing its job, and the probes below are read-only. What is fixed is the sentence.
@@ -10,7 +10,7 @@ import { GIT_TIMEOUT_MS } from '#scripts/lib/timeouts'
10
10
  // Propagation commits and pushes. A consumer with uncommitted work would have that work swept into
11
11
  // the upgrade commit — `josh git` stages the whole tree — and a supplier repository that is behind
12
12
  // its remote would propagate the *previous* release, which is already published and would report
13
- // success (joshuafolkken/kit#863).
13
+ // success.
14
14
 
15
15
  // The probes that talk to the remote get their own budget. Ten seconds is generous for a local
16
16
  // `rev-parse` and tight for an ssh handshake, and a probe that times out answers "no" — which for
@@ -27,7 +27,7 @@ interface TreeState {
27
27
  reason?: string
28
28
  }
29
29
 
30
- // **`cwd` alone does not say which repository this is about** (joshuafolkken/kit#1515). `GIT_DIR` and
30
+ // **`cwd` alone does not say which repository this is about**. `GIT_DIR` and
31
31
  // `GIT_WORK_TREE` beat it outright, and git exports both to every hook it runs — so under
32
32
  // `pnpm josh git`'s pre-push hook every probe below silently answered about the checkout the hook was
33
33
  // firing in rather than the path it was handed. The visible cost was in the unit suite, where
@@ -42,8 +42,8 @@ interface TreeState {
42
42
  // because every call below already passes the path this way and a second spelling of the same intent
43
43
  // is one more thing to keep in step.
44
44
  //
45
- // **The list itself moved to `#scripts/git/git-location-environment`** when joshuafolkken/kit#1530
46
- // found the same defect in a second file: three consumers now clear the same names, and a list kept
45
+ // **The list itself lives in `#scripts/git/git-location-environment`**: three consumers clear the
46
+ // same names, and a list kept
47
47
  // in one of them is a list the other two drift away from. It widened there past `GIT_DIR` /
48
48
  // `GIT_WORK_TREE` to the index and object-store variables, which redirect a *write* rather than a
49
49
  // lookup — inert for the read-only probes below, and required by the fixture that commits.
@@ -116,8 +116,8 @@ function commit_ahead(repository_path: string, default_name: string): string | u
116
116
  // remote-tracking ref: a push that was refused leaves no such ref behind, and neither does a branch
117
117
  // that was never pushed at all, so the ref cannot tell the two apart.
118
118
  //
119
- // **The arguments come from `git-ls-remote.ts`, which anchors the pattern at `refs/heads/`**
120
- // (joshuafolkken/kit#1732). Built here from the bare name, the query answered for any branch whose
119
+ // **The arguments come from `git-ls-remote.ts`, which anchors the pattern at `refs/heads/`**.
120
+ // Built here from the bare name, the query answered for any branch whose
121
121
  // ref ends in it — so a lane pushed as `wip/1641-lane` reported `1641-lane` as already on origin,
122
122
  // and propagation classified an unpushed branch as pushed.
123
123
  function has_remote_branch(repository_path: string, branch: string): boolean {
@@ -130,7 +130,7 @@ function has_remote_branch(repository_path: string, branch: string): boolean {
130
130
  // --git-path` does not. Without this the classification would name a hook on the strength of a dry
131
131
  // run alone, and **any** push failure that has cleared by the time the probe runs satisfies that: a
132
132
  // dropped ssh connection, a refreshed token, one 500 from GitHub. Naming a hook that does not exist
133
- // is the same misattribution joshuafolkken/kit#1417 was filed for, pointed the other way.
133
+ // is the same misattribution as blaming the wrong push sub-step, pointed the other way.
134
134
  function hooks_directory(repository_path: string): string | undefined {
135
135
  const configured = run_git(repository_path, ['config', '--get', 'core.hooksPath'])
136
136
  if (configured !== undefined && configured !== '') return configured
@@ -3,7 +3,7 @@ import { propagate_run, type RunStep, type StepResult } from './propagate-run'
3
3
  import { propagate_steps, type Release, type ReleasePlan } from './propagate-steps'
4
4
  import { propagate_targets, type Manifest, type PropagateTarget } from './propagate-targets'
5
5
 
6
- // What one `josh propagate` run carries, decided from the repository it runs in (joshuafolkken/kit#2879).
6
+ // What one `josh propagate` run carries, decided from the repository it runs in.
7
7
  //
8
8
  // The supplier is kit or any toolkit built on it — app-kit, game-kit — and a toolkit's propagation
9
9
  // carries the base packages under it too, at the versions that toolkit itself has installed and was
@@ -77,7 +77,7 @@ function pin_installed(project_root: string, release: Release): Release | undefi
77
77
  }
78
78
 
79
79
  // Why a declared base toolkit would fall out of the plan, naming it — either way `josh adopt` refuses
80
- // one for (joshuafolkken/kit#1540). A base left out is not merely left behind: every consumer that
80
+ // one for. A base left out is not merely left behind: every consumer that
81
81
  // installs it would then read it as a toolkit above this one and be skipped.
82
82
  function incomplete_cause(project_root: string): string | undefined {
83
83
  const misplaced = adopt_toolkits.misplaced_toolkits(project_root)
@@ -7,9 +7,8 @@ import { with_page_size } from '#scripts/version/version-remote'
7
7
  //
8
8
  // A merge is not a publish: kit's auto-tag and publish workflows run after the merge commit lands,
9
9
  // so a consumer told to upgrade the instant the PR merged resolves the previous release. The wait is
10
- // implemented once here because joshuafolkken/kit#864 resolves a cross-repository child on the same
11
- // condition — two implementations would drift, and the looser one would decide
12
- // (joshuafolkken/kit#863).
10
+ // implemented once here because resolving a cross-repository epic child waits on the same
11
+ // condition — two implementations would drift, and the looser one would decide.
13
12
 
14
13
  const VERSIONS_PAGE_SIZE = 100
15
14
  const NAMES_JQ = '[.[] | .name]'
@@ -5,11 +5,11 @@ import type { PropagateTarget } from './propagate-targets'
5
5
  //
6
6
  // One consumer's failure never stops another: the whole point of the command is to leave the run
7
7
  // knowing which consumers took the release and which did not, and a run that aborts on the first
8
- // failure answers that for a prefix of them (joshuafolkken/kit#863).
8
+ // failure answers that for a prefix of them.
9
9
 
10
10
  // The steps, in order, that carry a release into one consumer. `josh` here is the consumer's own
11
11
  // installed CLI, run from the consumer's directory — which is what keeps kit's self-sync guard
12
- // (joshuafolkken/kit#868) out of the way: the sync runs in a consumer project, where it belongs.
12
+ // out of the way: the sync runs in a consumer project, where it belongs.
13
13
  const STEP_PRECHECK = 'working tree check'
14
14
  const STEP_UPGRADE = 'josh vu'
15
15
  const STEP_SYNC = 'josh sync'
@@ -44,8 +44,7 @@ interface StepResult {
44
44
  // file, for instance. The sequence ends here as a skip rather than opening an empty pull request.
45
45
  is_complete?: boolean
46
46
  // What this failure actually left in the consumer, as the failing step measured it. Only the
47
- // steps that can probe set it; for the rest the standing note below is what they always leave
48
- // (joshuafolkken/kit#1417).
47
+ // steps that can probe set it; for the rest the standing note below is what they always leave.
49
48
  leftover?: string
50
49
  }
51
50
 
@@ -89,9 +88,8 @@ function has_leftover_changes(steps: ReadonlyArray<StepResult>): boolean {
89
88
 
90
89
  // What to say the failure left behind. A step that measured it wins; the note above stands in only
91
90
  // where none did, which is every step before the commit — and there it is accurate, since nothing
92
- // has committed yet. Before joshuafolkken/kit#1417 it was appended to *every* failure after the
93
- // upgrade, including one whose commit had already been made, so a push refused by the consumer's
94
- // pre-push hook was reported as changes that were never committed.
91
+ // has committed yet. Appended to *every* failure after the upgrade, it would report a push refused
92
+ // by the consumer's pre-push hook as changes that were never committed.
95
93
  function leftover_of(result: StepResult, steps: ReadonlyArray<StepResult>): string | undefined {
96
94
  if (!has_leftover_changes(steps)) return undefined
97
95
 
@@ -1,7 +1,7 @@
1
1
  import { propagate_run } from './propagate-run'
2
2
  import type { PropagateTarget, TargetState } from './propagate-targets'
3
3
 
4
- // Narrowing a run to the one consumer `--target` names (joshuafolkken/kit#2755).
4
+ // Narrowing a run to the one consumer `--target` names.
5
5
  //
6
6
  // Every other consumer stays in the list as `not_selected`, so the report still accounts for each
7
7
  // repository considered and says why it was left alone. A name that matches nothing — or matches a
@@ -1,6 +1,7 @@
1
1
  import { pr_classification } from '#scripts/ci/pr-classification'
2
2
  import { git_gh_exec } from '#scripts/gh/git-gh-exec'
3
3
  import { git_gh_issue_write } from '#scripts/gh/git-gh-issue-write'
4
+ import { issue_cite } from '#scripts/issue/issue-cite'
4
5
  import { OTHER_CHANGE_LABEL } from '#scripts/issue/issue-labels'
5
6
  import { GATE_COMMAND } from '#scripts/josh/josh-command-types'
6
7
  import { error_text } from '#scripts/lib/error-message'
@@ -18,11 +19,11 @@ import type { PropagateTarget } from './propagate-targets'
18
19
  // Kept out of the command module because two of the steps are not plain spawns: the pre-check is a
19
20
  // decision made from git probes, and the pull-request step needs the issue number the step before it
20
21
  // created. A closure carries that number instead of module-level state, so a run is self-contained
21
- // and the sequencing stays testable (joshuafolkken/kit#863).
22
+ // and the sequencing stays testable.
22
23
 
23
24
  const SUCCESS_EXIT_CODE = 0
24
25
  // The consumer-side gate. `josh gate` is the same command the AI documents require of a person
25
- // (joshuafolkken/kit#914) — running the four checks concurrently and reporting every failure in one
26
+ // — running the four checks concurrently and reporting every failure in one
26
27
  // pass — so the chain is not repeated here. It resolves in the consumer's directory, which by this
27
28
  // point has already been upgraded to the version being propagated, so the command is present.
28
29
  const VERIFY_SCRIPT = `pnpm josh ${GATE_COMMAND}`
@@ -37,12 +38,11 @@ const STEP_COMMANDS: Readonly<Record<string, ReadonlyArray<string>>> = {
37
38
 
38
39
  // kit's own CLI name. The sync is spelled through the *toolkit's* bin rather than hardcoded, because
39
40
  // `@joshuafolkken/app-kit` syncs with `josh-app` and `@joshuafolkken/game-kit` with `josh-game`; a
40
- // run that synced only `josh` would leave the other toolkit's managed files behind
41
- // (joshuafolkken/kit#1085).
41
+ // run that synced only `josh` would leave the other toolkit's managed files behind.
42
42
  const JOSH_BIN = 'josh'
43
43
 
44
44
  // `pnpm <bin>` resolves the target's own installed CLI, never this checkout — which is what keeps
45
- // the sync a consumer-side sync and leaves kit's self-sync guard (joshuafolkken/kit#868) satisfied.
45
+ // the sync a consumer-side sync and leaves kit's self-sync guard satisfied.
46
46
  function sync_command(bin_name: string): ReadonlyArray<string> {
47
47
  return ['pnpm', bin_name, 'sync']
48
48
  }
@@ -67,9 +67,9 @@ const PROPAGATE_ORIGIN =
67
67
  'Opened by `josh propagate` from the supplier repository after the release was published.'
68
68
  const RUN_NOTE =
69
69
  'The upgrade, the managed-file sync and the verification gate have already run here.'
70
- // `josh git` refuses to open a pull request for an issue that declares no release classification
71
- // (joshuafolkken/kit#2666), so the upgrade issue declares one. A dependency upgrade changes no code of
72
- // the consumer's own, which is what `other-change` covers (joshuafolkken/kit#2858).
70
+ // `josh git` refuses to open a pull request for an issue that declares no release classification,
71
+ // so the upgrade issue declares one. A dependency upgrade changes no code of
72
+ // the consumer's own, which is what `other-change` covers.
73
73
  const UPGRADE_CLASSIFICATION = OTHER_CHANGE_LABEL
74
74
  const EMPTY_PLAN_TITLE = 'Upgrade the installed toolkits'
75
75
  const LAST_SEPARATOR = ' and '
@@ -91,8 +91,8 @@ function release_names(releases: ReadonlyArray<Release>): string {
91
91
  }
92
92
 
93
93
  // Each release with its own version, for a plan whose releases disagree on one — a toolkit's
94
- // propagation carries the base packages at the versions that toolkit was verified with
95
- // (joshuafolkken/kit#2879), so one shared "to <version>" would name a version most of them are not.
94
+ // propagation carries the base packages at the versions that toolkit was verified with,
95
+ // so one shared "to <version>" would name a version most of them are not.
96
96
  function versioned_names(releases: ReadonlyArray<Release>): string {
97
97
  const named = releases.map((release) => ({
98
98
  ...release,
@@ -181,9 +181,8 @@ function spawn_step(
181
181
  }
182
182
 
183
183
  // The same, keeping what the command printed. Only the pull-request step uses it: a consumer's
184
- // pre-push hook names the check that stopped it in its own last lines, and until
185
- // joshuafolkken/kit#1417 nothing in the run kept them — so the report had one exit code to attribute
186
- // three sub-steps with, and attributed it to the wrong one.
184
+ // pre-push hook names the check that stopped it in its own last lines, and without them
185
+ // the report has one exit code to attribute three sub-steps with, and can blame the wrong one.
187
186
  //
188
187
  // **This step's output is replayed when it finishes rather than printed as it runs**, and that is
189
188
  // the price of keeping it. A synchronous spawn gives one target per file descriptor, so `['inherit',
@@ -233,10 +232,10 @@ function precheck_step(target: PropagateTarget, step: string): StepResult {
233
232
  // rather than a branchless pull request that cannot be opened at all.
234
233
  //
235
234
  // It posts to REST instead of running `gh issue create`: that command goes through GraphQL, which a
236
- // cloud session is answered 403 for, while the REST endpoint is served normally
237
- // (joshuafolkken/kit#1022). This was the last `gh <noun> <verb>` spawn in kit's own code, and it was
235
+ // cloud session is answered 403 for, while the REST endpoint is served normally.
236
+ // This was the last `gh <noun> <verb>` spawn in kit's own code, and it was
238
237
  // missed by that epic's survey because the survey counted `exec_gh_command` call sites and this one
239
- // spawned gh directly (joshuafolkken/kit#1042).
238
+ // spawned gh directly.
240
239
  //
241
240
  // The request is the one every issue creation builds, and the spawn is the synchronous twin of the
242
241
  // one the asynchronous writers use — so no second write layer exists to disagree with the first.
@@ -246,7 +245,7 @@ function precheck_step(target: PropagateTarget, step: string): StepResult {
246
245
  // gh's own output is the only thing that distinguishes a missing scope from disabled issues from a
247
246
  // repository that does not exist. Reporting `could not open an issue` alone hides all three, so the
248
247
  // whole message is kept — `to_gh_error` puts the stderr summary and the JSON body REST writes to
249
- // stdout on separate lines (joshuafolkken/kit#1029), and both carry the reason.
248
+ // stdout on separate lines, and both carry the reason.
250
249
  //
251
250
  // **It is folded back onto one line here.** The run's report is one line per consumer, and
252
251
  // `failure_reason` appends the "changes left uncommitted" warning to the end of this text — so a
@@ -319,7 +318,7 @@ function issue_step(
319
318
 
320
319
  // Put the consumer back on its default branch. `josh git` leaves it on the feature branch, and the
321
320
  // next run's pre-check would refuse it for that — the consumer would silently stop receiving
322
- // releases (joshuafolkken/kit#863).
321
+ // releases.
323
322
  function return_step(target: PropagateTarget, step: string): StepResult {
324
323
  if (propagate_git.return_to_default_branch(target.path)) return { step, is_ok: true }
325
324
 
@@ -335,7 +334,7 @@ function pull_request_step(
335
334
  ): StepResult {
336
335
  const number = issue_numbers.get(target.repo)
337
336
  if (number === undefined) return { step, is_ok: false, detail: 'no issue number' }
338
- const argument = `${plan_title(plan.releases)} #${number}`
337
+ const argument = `${plan_title(plan.releases)} ${issue_cite.plain(number)}`
339
338
  const outcome = spawn_captured(target, step, ['pnpm', 'josh', 'git', '-y', argument])
340
339
  if (outcome.result.is_ok) return outcome.result
341
340
 
@@ -352,7 +351,7 @@ interface Release {
352
351
 
353
352
  // What one run carries: the releases, and the sentence naming the command that opened the issue.
354
353
  // `josh propagate` always passes exactly one release; `josh adopt` passes every toolkit installed in
355
- // the repository it runs in (joshuafolkken/kit#1085). Only the upgrade and the sync repeat per
354
+ // the repository it runs in. Only the upgrade and the sync repeat per
356
355
  // release — the pre-check, the verification gate, the issue, the pull request and the return to the
357
356
  // default branch happen once, which is why the step order itself is unchanged.
358
357
  interface ReleasePlan {