@joshuafolkken/kit 1.1229.0 → 1.1370.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (939) hide show
  1. package/.claude/agents/investigator.md +1 -0
  2. package/.claude/settings.json +4 -0
  3. package/.claude/skills/dependency-update/SKILL.md +5 -3
  4. package/.claude/skills/epic-commands/SKILL.md +82 -113
  5. package/.claude/skills/epic-commands/epic-bundle.md +38 -63
  6. package/.claude/skills/epic-commands/execution-waves.md +30 -51
  7. package/.claude/skills/verify-ui/SKILL.md +13 -20
  8. package/.claude/skills/workflow-commands/SKILL.md +10 -10
  9. package/.claude/skills/workflow-commands/background-commands.md +4 -4
  10. package/.claude/skills/workflow-commands/backlogrun-child.md +30 -105
  11. package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +29 -0
  12. package/.claude/skills/workflow-commands/backlogrun-lanes.md +45 -131
  13. package/.claude/skills/workflow-commands/backlogrun-park.md +36 -53
  14. package/.claude/skills/workflow-commands/backlogrun-progress.md +81 -331
  15. package/.claude/skills/workflow-commands/backlogrun-recovery.md +29 -83
  16. package/.claude/skills/workflow-commands/backlogrun-steps.md +105 -424
  17. package/.claude/skills/workflow-commands/backlogrun.md +50 -61
  18. package/.claude/skills/workflow-commands/chain-rule.md +36 -40
  19. package/.claude/skills/workflow-commands/entry-sequence.md +6 -6
  20. package/.claude/skills/workflow-commands/followup.md +24 -20
  21. package/.claude/skills/workflow-commands/fullrun-steps.md +23 -27
  22. package/.claude/skills/workflow-commands/fullrun.md +10 -10
  23. package/.claude/skills/workflow-commands/halfrun.md +9 -8
  24. package/.claude/skills/workflow-commands/into-target.md +12 -18
  25. package/.claude/skills/workflow-commands/issue-comments.md +11 -26
  26. package/.claude/skills/workflow-commands/kickoff.md +27 -16
  27. package/.claude/skills/workflow-commands/latest-gate.md +18 -29
  28. package/.claude/skills/workflow-commands/needs-human-review.md +13 -24
  29. package/.claude/skills/workflow-commands/observation-filing.md +37 -28
  30. package/.claude/skills/workflow-commands/observation-ledger.md +48 -38
  31. package/.claude/skills/workflow-commands/pre-gate-cut.md +9 -9
  32. package/.claude/skills/workflow-commands/prerequisite.md +23 -15
  33. package/.claude/skills/workflow-commands/progress-watcher.md +17 -11
  34. package/.claude/skills/workflow-commands/prrun.md +3 -3
  35. package/.claude/skills/workflow-commands/retrospective.md +13 -18
  36. package/.claude/skills/workflow-commands/split-assessment.md +6 -4
  37. package/.claude/skills/workflow-commands/target-repository.md +25 -28
  38. package/.claude/skills/workflow-commands/working-tree-hold.md +11 -17
  39. package/.gitattributes +2 -1
  40. package/.github/workflows/ci.yml +14 -0
  41. package/.github/workflows/publish.yml +2 -0
  42. package/.vscode/tasks.json +14 -0
  43. package/CLAUDE.md +10 -61
  44. package/README.md +38 -57
  45. package/SECURITY.md +1 -1
  46. package/dist/CLAUDE.md +10 -61
  47. package/dist/commands/document-section-cli.js +42 -10
  48. package/dist/config-merge/index.js +11 -2
  49. package/dist/hooks/audit-provision.js +2 -2
  50. package/dist/hooks/batch-guard.js +7 -7
  51. package/dist/hooks/{chunk-FIVDHQGT.js → chunk-43G45XJF.js} +18 -20
  52. package/dist/hooks/{chunk-JUDKDCDP.js → chunk-4TW4MQUL.js} +284 -362
  53. package/dist/hooks/{chunk-5VMKCCC4.js → chunk-76RK6E3H.js} +13 -11
  54. package/dist/hooks/{chunk-RNWHN5BP.js → chunk-DZWZ3DKY.js} +4 -4
  55. package/dist/hooks/{chunk-5VNDSNG3.js → chunk-FZ6FUSBM.js} +1 -1
  56. package/dist/hooks/{chunk-VC3PZPZO.js → chunk-GG72ANKI.js} +1 -1
  57. package/dist/hooks/{chunk-6HJJXRBX.js → chunk-KPM4YIIX.js} +8 -44
  58. package/dist/hooks/chunk-MXVQMLDP.js +3705 -0
  59. package/dist/hooks/{chunk-ELCN5LCH.js → chunk-NEC4AT4Z.js} +34 -12
  60. package/dist/hooks/{chunk-TQNPDZNH.js → chunk-NZBHG6FW.js} +7 -5
  61. package/dist/hooks/chunk-NZN2UFI6.js +2409 -0
  62. package/dist/hooks/{chunk-F56MFS4B.js → chunk-R6CRQEAL.js} +4 -4
  63. package/dist/hooks/chunk-SYSRHRWU.js +1589 -0
  64. package/dist/hooks/{chunk-55HHG5PX.js → chunk-TLJYAGZK.js} +799 -903
  65. package/dist/hooks/chunk-Z5TMJIPW.js +45 -0
  66. package/dist/hooks/codex-hook-adapter.js +26 -21
  67. package/dist/hooks/duplicate-read-guard.js +8 -8
  68. package/dist/hooks/format-edited.js +4 -4
  69. package/dist/hooks/inputs.json +213 -197
  70. package/dist/hooks/investigation-guard.js +8 -8
  71. package/dist/hooks/pretool-guard.js +15 -15
  72. package/dist/hooks/session-lang.js +406 -8
  73. package/dist/hooks/stop-guard.js +122 -201
  74. package/dist/josh.js +540 -137
  75. package/dist/version/index.js +15 -13
  76. package/eslint/base.js +43 -5
  77. package/eslint/rules/english-only-prose.js +3 -3
  78. package/eslint/rules/import.js +12 -0
  79. package/eslint/rules/namespace-object-export.js +2 -2
  80. package/package.json +16 -10
  81. package/pnpm-workspace.yaml +2 -4
  82. package/prompts/coding-standards.md +14 -48
  83. package/prompts/collaboration-workflow/file-edits.md +1 -1
  84. package/prompts/collaboration-workflow/issue-citation.md +1 -1
  85. package/prompts/collaboration-workflow/issue-template.md +4 -10
  86. package/prompts/collaboration-workflow/operating-rules.md +7 -8
  87. package/prompts/collaboration-workflow/output-bounds.md +1 -1
  88. package/prompts/collaboration-workflow/overview.md +1 -1
  89. package/prompts/collaboration-workflow/plan-comment.md +2 -1
  90. package/prompts/collaboration-workflow/principles.md +21 -3
  91. package/prompts/collaboration-workflow/report-format.md +16 -29
  92. package/prompts/collaboration-workflow/residency.md +1 -1
  93. package/prompts/collaboration-workflow/rule-delivery.md +7 -95
  94. package/prompts/collaboration-workflow/shell-body.md +3 -23
  95. package/prompts/collaboration-workflow/turn-batching.md +4 -13
  96. package/prompts/collaboration-workflow/wip-cap.md +5 -11
  97. package/prompts/refactoring.md +1 -1
  98. package/prompts/review-rubric.md +3 -22
  99. package/prompts/review.md +15 -38
  100. package/prompts/testing-guide.md +2 -4
  101. package/scripts/adopt/adopt-logic.ts +5 -5
  102. package/scripts/adopt/adopt-toolkits.ts +4 -5
  103. package/scripts/adopt/adopt.ts +2 -3
  104. package/scripts/agent/agent-argv.ts +7 -7
  105. package/scripts/agent/agent-diagnostics.ts +2 -2
  106. package/scripts/agent/agent-exit-record.ts +1 -1
  107. package/scripts/agent/agent-headless.ts +1 -1
  108. package/scripts/agent/agent-launch-environment.ts +6 -1
  109. package/scripts/agent/agent-role-profile.ts +49 -22
  110. package/scripts/agent/agent-session-role.ts +32 -0
  111. package/scripts/agent/api-outage.ts +1 -1
  112. package/scripts/agent/claude-agent-argv.ts +4 -4
  113. package/scripts/agent/claude-result-event.ts +4 -4
  114. package/scripts/agent/codex-hooks.ts +2 -2
  115. package/scripts/agent/interactive-ask.ts +3 -6
  116. package/scripts/auto-ok/auto-ok-cli.ts +46 -60
  117. package/scripts/backlog/backlog-arrival-added.ts +34 -0
  118. package/scripts/backlog/backlog-arrival.ts +54 -17
  119. package/scripts/backlog/backlog-budget-cli.ts +34 -6
  120. package/scripts/backlog/backlog-budget.ts +17 -24
  121. package/scripts/backlog/backlog-defect-priority.ts +1 -1
  122. package/scripts/backlog/backlog-drive-args.ts +5 -4
  123. package/scripts/backlog/backlog-drive-cli.ts +14 -10
  124. package/scripts/backlog/backlog-drive-epic.ts +85 -0
  125. package/scripts/backlog/backlog-drive-launch.ts +1 -1
  126. package/scripts/backlog/backlog-drive-named-offer.ts +60 -9
  127. package/scripts/backlog/backlog-drive-named.ts +39 -9
  128. package/scripts/backlog/backlog-drive-offer-argv.ts +1 -1
  129. package/scripts/backlog/backlog-drive-restore.ts +1 -1
  130. package/scripts/backlog/backlog-drive-retrospective.ts +2 -2
  131. package/scripts/backlog/backlog-drive.ts +43 -28
  132. package/scripts/backlog/backlog-idle.ts +88 -0
  133. package/scripts/backlog/backlog-named.ts +11 -15
  134. package/scripts/backlog/backlog-next.ts +26 -30
  135. package/scripts/backlog/backlog-offer-cli.ts +28 -23
  136. package/scripts/backlog/backlog-offer.ts +7 -7
  137. package/scripts/backlog/backlog-overlap.ts +178 -0
  138. package/scripts/backlog/backlog-plan-cli.ts +14 -90
  139. package/scripts/backlog/backlog-plan-read.ts +111 -0
  140. package/scripts/backlog/backlog-plan.ts +11 -10
  141. package/scripts/backlog/backlog-pool.ts +13 -14
  142. package/scripts/backlog/backlog-rank.ts +11 -11
  143. package/scripts/backlog/backlog-ready.ts +15 -10
  144. package/scripts/backlog/backlog-scope.ts +14 -15
  145. package/scripts/backlog/backlog-stalled-cli.ts +2 -2
  146. package/scripts/backlog/backlog-stalled-detect.ts +4 -4
  147. package/scripts/backlog/backlog-stalled.ts +5 -6
  148. package/scripts/backlog/backlog-waves.ts +4 -4
  149. package/scripts/backlog/backlogrun-args.ts +74 -0
  150. package/scripts/backlog/backlogrun-cli.ts +113 -0
  151. package/scripts/backlog/backlogrun-launch.ts +178 -0
  152. package/scripts/behavior/behavior-assertion.ts +6 -8
  153. package/scripts/behavior/behavior-cli.ts +1 -1
  154. package/scripts/behavior/behavior-rules.ts +3 -3
  155. package/scripts/build/build-claude-md.ts +4 -4
  156. package/scripts/build/build-codex-hooks.ts +2 -2
  157. package/scripts/build/build-commands.ts +1 -1
  158. package/scripts/build/build-hooks.ts +5 -5
  159. package/scripts/build/build.ts +1 -1
  160. package/scripts/build/hook-bundle-stamp.ts +109 -7
  161. package/scripts/build/local-bin.ts +2 -2
  162. package/scripts/cases/cases-cli.ts +1 -1
  163. package/scripts/cases/cases-logic.ts +2 -2
  164. package/scripts/ci/composite-actions.ts +1 -2
  165. package/scripts/ci/pr-classification.ts +2 -2
  166. package/scripts/claude/workflow-destination.ts +1 -1
  167. package/scripts/clone/clone-aggregate.ts +1 -1
  168. package/scripts/clone/clone-fingerprint.ts +1 -1
  169. package/scripts/clone/clone-scan-cli.ts +1 -1
  170. package/scripts/clone/clone-scan.ts +1 -1
  171. package/scripts/config-merge/index.ts +1 -1
  172. package/scripts/config-merge/json-format.ts +1 -3
  173. package/scripts/config-merge/patch-json-array.ts +90 -0
  174. package/scripts/config-merge/patch-json-key.ts +6 -3
  175. package/scripts/config-merge/patch-json-list.ts +1 -1
  176. package/scripts/cost-runtime/codex-usage.ts +1 -1
  177. package/scripts/cost-runtime/context-cut-payback.ts +4 -5
  178. package/scripts/cost-runtime/context-cut-threshold.ts +4 -6
  179. package/scripts/cost-runtime/cost-attribute.ts +3 -3
  180. package/scripts/cost-runtime/cost-blocks.ts +3 -4
  181. package/scripts/cost-runtime/cost-cli.ts +14 -11
  182. package/scripts/cost-runtime/cost-corpus.ts +11 -11
  183. package/scripts/cost-runtime/cost-pricing.ts +4 -4
  184. package/scripts/cost-runtime/cost-tokens.ts +1 -2
  185. package/scripts/cost-runtime/cost-transcript.ts +29 -29
  186. package/scripts/cost-runtime/cost-usage.ts +6 -7
  187. package/scripts/cost-runtime/cost-verdict.ts +10 -11
  188. package/scripts/cost-runtime/own-session.ts +1 -1
  189. package/scripts/cost-runtime/transcript-cwd.ts +2 -2
  190. package/scripts/delegation/delegation-cli.ts +4 -4
  191. package/scripts/delegation/delegation-policy.ts +13 -15
  192. package/scripts/delegation/duplicate-read-guard.ts +9 -10
  193. package/scripts/delegation/fanout-cli.ts +1 -1
  194. package/scripts/delegation/fanout.ts +1 -1
  195. package/scripts/delegation/investigation-guard.ts +18 -22
  196. package/scripts/delegation/investigation-reads.ts +48 -238
  197. package/scripts/discovery/repo-discovery.ts +1 -1
  198. package/scripts/discovery/repo-map-logic.ts +1 -2
  199. package/scripts/discovery/repo-origin.ts +3 -3
  200. package/scripts/discovery/repo-party-cli.ts +2 -2
  201. package/scripts/discovery/repo-party.ts +2 -2
  202. package/scripts/doctor/doctor-consumer.ts +1 -1
  203. package/scripts/doctor/doctor-io.ts +6 -7
  204. package/scripts/doctor/doctor-logic.ts +1 -1
  205. package/scripts/doctor/doctor-ports.ts +1 -1
  206. package/scripts/doctor/doctor.ts +8 -9
  207. package/scripts/document/backlogrun-parent-read-set.ts +5 -6
  208. package/scripts/document/bash-output-cap.ts +5 -7
  209. package/scripts/document/capped-print-part.ts +1 -1
  210. package/scripts/document/capped-print.ts +1 -1
  211. package/scripts/document/document-byte-budget.ts +33 -64
  212. package/scripts/document/document-byte-check.ts +4 -4
  213. package/scripts/document/document-reachability.ts +7 -8
  214. package/scripts/document/document-read-cli.ts +2 -2
  215. package/scripts/document/document-scan.ts +26 -2
  216. package/scripts/document/document-section-cli.ts +6 -8
  217. package/scripts/document/document-section.ts +8 -12
  218. package/scripts/document/edit-files-cli.ts +3 -4
  219. package/scripts/document/entry-read-budget.ts +8 -70
  220. package/scripts/document/entry-read-set.ts +51 -34
  221. package/scripts/document/lane-child-read-set.ts +9 -9
  222. package/scripts/document/read-files-cli.ts +1 -2
  223. package/scripts/document/read-set-cli.ts +16 -19
  224. package/scripts/document/read-set-cost.ts +4 -4
  225. package/scripts/document/read-set-point-of-use.ts +28 -38
  226. package/scripts/document/read-set-pricing.ts +1 -1
  227. package/scripts/document/read-set-trim.ts +3 -3
  228. package/scripts/document/resident-budget.ts +8 -10
  229. package/scripts/epic/epic-add-body.ts +15 -18
  230. package/scripts/epic/epic-add-plan.ts +26 -28
  231. package/scripts/epic/epic-add.ts +32 -25
  232. package/scripts/epic/epic-audit-checks.ts +27 -37
  233. package/scripts/epic/epic-audit-cli.ts +21 -22
  234. package/scripts/epic/epic-audit-orphans.ts +16 -17
  235. package/scripts/epic/epic-audit-rationale.ts +10 -15
  236. package/scripts/epic/epic-audit-report.ts +2 -5
  237. package/scripts/epic/epic-audit.ts +18 -14
  238. package/scripts/epic/epic-body.ts +10 -10
  239. package/scripts/epic/epic-bundle-cli.ts +36 -34
  240. package/scripts/epic/epic-bundle-evidence.ts +5 -5
  241. package/scripts/epic/epic-bundle-gaps.ts +6 -9
  242. package/scripts/epic/epic-bundle-poll.ts +1 -1
  243. package/scripts/epic/epic-bundle-referenced.ts +11 -14
  244. package/scripts/epic/epic-bundle.ts +19 -20
  245. package/scripts/epic/epic-busy.ts +44 -21
  246. package/scripts/epic/epic-candidate-confirm.ts +15 -18
  247. package/scripts/epic/epic-chains.ts +18 -23
  248. package/scripts/epic/epic-classify.ts +11 -12
  249. package/scripts/epic/epic-cli-argv.ts +5 -6
  250. package/scripts/epic/epic-cli-remove.ts +9 -4
  251. package/scripts/epic/epic-cli.ts +38 -26
  252. package/scripts/epic/epic-close-comment.ts +14 -15
  253. package/scripts/epic/epic-close.ts +25 -29
  254. package/scripts/epic/epic-cross-repo.ts +18 -21
  255. package/scripts/epic/epic-decision.ts +14 -18
  256. package/scripts/epic/epic-fetch.ts +25 -31
  257. package/scripts/epic/epic-graph.ts +15 -17
  258. package/scripts/epic/epic-index.ts +14 -16
  259. package/scripts/epic/epic-issue.ts +9 -11
  260. package/scripts/epic/epic-label-age.ts +74 -0
  261. package/scripts/epic/epic-lane-offer.ts +35 -24
  262. package/scripts/epic/epic-nested.ts +1 -1
  263. package/scripts/epic/epic-next-read.ts +8 -8
  264. package/scripts/epic/epic-next-views.ts +12 -12
  265. package/scripts/epic/epic-next.ts +29 -33
  266. package/scripts/epic/epic-outside-blocker.ts +11 -10
  267. package/scripts/epic/epic-parse.ts +22 -24
  268. package/scripts/epic/epic-promote.ts +3 -2
  269. package/scripts/epic/epic-rank.ts +1 -1
  270. package/scripts/epic/epic-read.ts +10 -8
  271. package/scripts/epic/epic-reconcile.ts +8 -6
  272. package/scripts/epic/epic-reference.ts +5 -4
  273. package/scripts/epic/epic-relation-recheck.ts +10 -11
  274. package/scripts/epic/epic-relations.ts +9 -8
  275. package/scripts/epic/epic-remove-plan.ts +4 -5
  276. package/scripts/epic/epic-remove.ts +7 -5
  277. package/scripts/epic/epic-report.ts +18 -20
  278. package/scripts/epic/epic-run.ts +6 -5
  279. package/scripts/epic/epic-sections.ts +2 -2
  280. package/scripts/epic/epic-shape.ts +3 -3
  281. package/scripts/epic/epic-solo-stale.ts +3 -2
  282. package/scripts/epic/epic-solo.ts +8 -8
  283. package/scripts/epic/epic-triage.ts +5 -4
  284. package/scripts/epic/epic-validate.ts +8 -7
  285. package/scripts/epic/epic.ts +5 -5
  286. package/scripts/exports/unused-members-cli.ts +1 -1
  287. package/scripts/followup/followup-issue-number.ts +1 -2
  288. package/scripts/followup/git-followup-cleanup.ts +6 -7
  289. package/scripts/followup/git-followup-finish.ts +11 -13
  290. package/scripts/followup/git-followup-flush.ts +11 -7
  291. package/scripts/followup/git-followup-issue-close.ts +16 -13
  292. package/scripts/followup/git-followup-label.ts +9 -6
  293. package/scripts/followup/git-followup-merged.ts +1 -1
  294. package/scripts/followup/git-followup-pending.ts +7 -9
  295. package/scripts/followup/git-followup-stages.ts +28 -17
  296. package/scripts/followup/git-followup-workflow.ts +19 -21
  297. package/scripts/followup/git-pr-followup-checks.ts +13 -20
  298. package/scripts/followup/git-pr-followup-wrapup.ts +7 -7
  299. package/scripts/followup/git-pr-followup.ts +18 -17
  300. package/scripts/gate/core-admission.ts +162 -0
  301. package/scripts/gate/core-budget.ts +134 -91
  302. package/scripts/gate/gate-ledger.ts +114 -0
  303. package/scripts/gate/gate-log.ts +7 -9
  304. package/scripts/gate/gate-plan.ts +103 -35
  305. package/scripts/gate/gate-report.ts +39 -21
  306. package/scripts/gate/gate-skip.ts +11 -13
  307. package/scripts/gate/gate-steps.ts +5 -1
  308. package/scripts/gate/gate-tree.ts +3 -4
  309. package/scripts/gate/hook-gate-reuse.ts +9 -9
  310. package/scripts/gate/machine-capacity.ts +313 -0
  311. package/scripts/gate/pre-commit-type-check.ts +4 -4
  312. package/scripts/gate/project-checks.ts +12 -4
  313. package/scripts/gate/scoped-green.ts +11 -18
  314. package/scripts/gate/type-check-command.ts +2 -2
  315. package/scripts/gate/type-check-step.ts +4 -4
  316. package/scripts/gate/verification-gate.ts +60 -53
  317. package/scripts/gh/gh-spawn.ts +2 -2
  318. package/scripts/gh/git-ai-review-scan.ts +3 -2
  319. package/scripts/gh/git-gh-api-path.ts +10 -11
  320. package/scripts/gh/git-gh-exec.ts +43 -48
  321. package/scripts/gh/git-gh-failure.ts +6 -9
  322. package/scripts/gh/git-gh-helpers.ts +1 -1
  323. package/scripts/gh/git-gh-issue-list.ts +15 -19
  324. package/scripts/gh/git-gh-issue-read.ts +43 -60
  325. package/scripts/gh/git-gh-issue-rest.ts +14 -15
  326. package/scripts/gh/git-gh-issue-write.ts +52 -40
  327. package/scripts/gh/git-gh-issue.ts +23 -24
  328. package/scripts/gh/git-gh-pr-auto-merge.ts +3 -3
  329. package/scripts/gh/git-gh-pr-read.ts +46 -50
  330. package/scripts/gh/git-gh-pr-rest.ts +23 -26
  331. package/scripts/gh/git-gh-pr-review.ts +2 -2
  332. package/scripts/gh/git-gh-pr-rollup.ts +4 -4
  333. package/scripts/gh/git-gh-pr-snapshot.ts +8 -10
  334. package/scripts/gh/git-gh-pr.ts +16 -16
  335. package/scripts/gh/git-gh-reachability.ts +11 -12
  336. package/scripts/gh/git-gh-repo.ts +2 -3
  337. package/scripts/gh/git-gh-rest-state.ts +1 -1
  338. package/scripts/gh/git-pr-ai-review.ts +6 -5
  339. package/scripts/gh/git-pr-checks-eval.ts +28 -30
  340. package/scripts/gh/git-pr-checks-parse.ts +14 -16
  341. package/scripts/gh/git-pr-checks-watch.ts +17 -17
  342. package/scripts/gh/git-pr-checks.ts +20 -23
  343. package/scripts/gh/git-pr-coderabbit.ts +8 -6
  344. package/scripts/gh/git-pr-confirmation.ts +5 -5
  345. package/scripts/gh/git-pr-managed-config.ts +7 -9
  346. package/scripts/gh/git-pr-messages.ts +1 -1
  347. package/scripts/gh/git-pr.ts +15 -16
  348. package/scripts/gh/github-issue-url.ts +8 -9
  349. package/scripts/git/base-tree.ts +66 -0
  350. package/scripts/git/change-base.ts +42 -2
  351. package/scripts/git/changed-file-scope.ts +5 -5
  352. package/scripts/git/changed-paths.ts +1 -2
  353. package/scripts/git/constants.ts +2 -2
  354. package/scripts/git/git-branch.ts +1 -1
  355. package/scripts/git/git-closes-keyword.ts +3 -3
  356. package/scripts/git/git-command.ts +53 -41
  357. package/scripts/git/git-common-directory.ts +3 -3
  358. package/scripts/git/git-diff-reads.ts +14 -15
  359. package/scripts/git/git-error.ts +1 -1
  360. package/scripts/git/git-execa-error.ts +1 -2
  361. package/scripts/git/git-issue.ts +10 -8
  362. package/scripts/git/git-location-environment.ts +3 -4
  363. package/scripts/git/git-ls-remote.ts +6 -8
  364. package/scripts/git/git-pre-push-hook.ts +11 -10
  365. package/scripts/git/git-preflight.ts +5 -5
  366. package/scripts/git/git-push-transport.ts +2 -2
  367. package/scripts/git/git-remote-branch.ts +1 -2
  368. package/scripts/git/git-schemas.ts +16 -23
  369. package/scripts/git/git-spawn-sync.ts +1 -1
  370. package/scripts/git/git-spawn.ts +37 -14
  371. package/scripts/git/git-ssh-keepalive.ts +12 -5
  372. package/scripts/git/git-staging.ts +7 -8
  373. package/scripts/git/git-workflow.ts +1 -1
  374. package/scripts/git/git-worktree.ts +35 -27
  375. package/scripts/git/gone-branch.ts +2 -2
  376. package/scripts/git/listing-cutoff.ts +1 -2
  377. package/scripts/git/lockfile-sync.ts +65 -0
  378. package/scripts/git/main-merge-guard.ts +1 -2
  379. package/scripts/git/main-merge.ts +7 -7
  380. package/scripts/git/main-sync.ts +23 -8
  381. package/scripts/git/parse-json-array.ts +18 -23
  382. package/scripts/git/repository-lock.ts +34 -2
  383. package/scripts/git/stash/git-stash.ts +4 -5
  384. package/scripts/git/stash/stash-orphans.ts +5 -3
  385. package/scripts/git/stash/stash-pop-args.ts +1 -1
  386. package/scripts/git/stash/stash-pop-cli.ts +3 -3
  387. package/scripts/git/stash/stash-sweep-lock.ts +2 -2
  388. package/scripts/hooks/batch-guard.ts +11 -13
  389. package/scripts/hooks/check-commit-message.ts +12 -9
  390. package/scripts/hooks/codex-hook-adapter.ts +16 -10
  391. package/scripts/hooks/edited-cspell.ts +3 -4
  392. package/scripts/hooks/format-edited-cli.ts +1 -1
  393. package/scripts/hooks/format-edited-file.ts +11 -17
  394. package/scripts/hooks/format-rewrite-notice.ts +19 -17
  395. package/scripts/hooks/pre-push-unit.ts +10 -14
  396. package/scripts/hooks/pretool-guard-cli.ts +4 -4
  397. package/scripts/hooks/pretool-guard.ts +93 -18
  398. package/scripts/hooks/reserved-run.ts +2 -2
  399. package/scripts/hooks/step-zero-notice.ts +1 -1
  400. package/scripts/hooks/stop-guard.ts +21 -10
  401. package/scripts/init/basic-path-migration.ts +2 -2
  402. package/scripts/init/claude-kit-only-settings.ts +2 -2
  403. package/scripts/init/claude-plugin-config.ts +2 -2
  404. package/scripts/init/distributed-paths.ts +4 -4
  405. package/scripts/init/hook-command-rewrite.ts +3 -3
  406. package/scripts/init/hook-launch.ts +5 -5
  407. package/scripts/init/init-actions.ts +13 -0
  408. package/scripts/init/init-ai-copy.ts +11 -11
  409. package/scripts/init/init-bootstrap.ts +3 -3
  410. package/scripts/init/init-copy-content.ts +4 -4
  411. package/scripts/init/init-logic-json-merge.ts +7 -9
  412. package/scripts/init/init-logic-migrate.ts +1 -1
  413. package/scripts/init/init-logic-templates.ts +1 -1
  414. package/scripts/init/init-logic-workspace.ts +4 -4
  415. package/scripts/init/init-logic-yaml-merge.ts +2 -2
  416. package/scripts/init/init-logic.ts +19 -22
  417. package/scripts/init/init.ts +12 -8
  418. package/scripts/init/kit-base-preset.ts +1 -1
  419. package/scripts/init/kit-setup-state.ts +1 -1
  420. package/scripts/init/kit-written-paths.ts +1 -2
  421. package/scripts/init/package-manager-pin.ts +35 -0
  422. package/scripts/init/project-profile-cli.ts +1 -1
  423. package/scripts/init/project-profile.ts +3 -3
  424. package/scripts/init/session-language-environment.ts +1 -1
  425. package/scripts/init/start-exec.ts +3 -4
  426. package/scripts/init/start-plan.ts +2 -2
  427. package/scripts/init/start-setup-pr.ts +3 -2
  428. package/scripts/init/start-steps.ts +2 -2
  429. package/scripts/init/tsconfig-preset-migration.ts +1 -1
  430. package/scripts/init/vscode-tasks.ts +62 -0
  431. package/scripts/issue/baseline-measure.ts +2 -2
  432. package/scripts/issue/behavior-change-lint.ts +2 -2
  433. package/scripts/issue/defect-rate-cli.ts +6 -7
  434. package/scripts/issue/defect-rate.ts +37 -27
  435. package/scripts/issue/git-next-issues.ts +9 -8
  436. package/scripts/issue/issue-auto-ok.ts +49 -11
  437. package/scripts/issue/issue-backlinks-cli.ts +5 -5
  438. package/scripts/issue/issue-backlinks.ts +6 -6
  439. package/scripts/issue/issue-cite-cli.ts +20 -18
  440. package/scripts/issue/issue-cite.ts +18 -8
  441. package/scripts/issue/issue-closing-pr.ts +4 -4
  442. package/scripts/issue/issue-comment-cli.ts +6 -4
  443. package/scripts/issue/issue-file-cli.ts +75 -15
  444. package/scripts/issue/issue-file-fold.ts +155 -0
  445. package/scripts/issue/issue-file.ts +14 -6
  446. package/scripts/issue/issue-fold-cli.ts +14 -9
  447. package/scripts/issue/issue-fold.ts +23 -8
  448. package/scripts/issue/issue-labels.ts +46 -37
  449. package/scripts/issue/issue-lint-cli.ts +2 -2
  450. package/scripts/issue/issue-lint.ts +1 -1
  451. package/scripts/issue/issue-merged.ts +10 -4
  452. package/scripts/issue/issue-number-shape.ts +27 -0
  453. package/scripts/issue/issue-rank.ts +1 -1
  454. package/scripts/issue/issue-read-cli.ts +4 -5
  455. package/scripts/issue/issue-read.ts +4 -5
  456. package/scripts/issue/issue-reference.ts +5 -5
  457. package/scripts/issue/issue-release-cli.ts +165 -0
  458. package/scripts/issue/issue-release.ts +58 -0
  459. package/scripts/issue/issue-report-failures.ts +7 -4
  460. package/scripts/issue/issue-scout-cli.ts +11 -11
  461. package/scripts/issue/issue-scout-closed.ts +4 -4
  462. package/scripts/issue/issue-scout.ts +4 -5
  463. package/scripts/issue/issue-state-cli.ts +17 -10
  464. package/scripts/issue/issue-state.ts +12 -13
  465. package/scripts/issue/issue-wip.ts +7 -7
  466. package/scripts/issue/markdown-section.ts +3 -3
  467. package/scripts/issue/measure-rerun-cli.ts +10 -9
  468. package/scripts/issue/reproduction-measure.ts +3 -3
  469. package/scripts/issue/session-cite.ts +56 -0
  470. package/scripts/josh/agent-session-environment.ts +10 -8
  471. package/scripts/josh/cli-body.ts +2 -2
  472. package/scripts/josh/command-suggest.ts +1 -1
  473. package/scripts/josh/file-map-stamp.ts +20 -23
  474. package/scripts/josh/hook-decision.ts +24 -28
  475. package/scripts/josh/josh-command-map.ts +4 -1
  476. package/scripts/josh/josh-command-types.ts +32 -34
  477. package/scripts/josh/josh-commands-ai.ts +6 -6
  478. package/scripts/josh/josh-commands-backlog.ts +15 -3
  479. package/scripts/josh/josh-commands-clone.ts +1 -1
  480. package/scripts/josh/josh-commands-development.ts +33 -4
  481. package/scripts/josh/josh-commands-document.ts +3 -3
  482. package/scripts/josh/josh-commands-guard.ts +3 -3
  483. package/scripts/josh/josh-commands-issue.ts +11 -5
  484. package/scripts/josh/josh-commands-lane.ts +16 -5
  485. package/scripts/josh/josh-commands-lint.ts +1 -1
  486. package/scripts/josh/josh-commands-maintenance.ts +2 -2
  487. package/scripts/josh/josh-commands-run.ts +20 -6
  488. package/scripts/josh/josh-commands-split.ts +1 -2
  489. package/scripts/josh/josh-commands-versioning.ts +5 -5
  490. package/scripts/josh/josh-commands-workflow.ts +30 -22
  491. package/scripts/josh/josh-environment-file.ts +1 -1
  492. package/scripts/josh/josh-in-process.ts +3 -3
  493. package/scripts/josh/josh-logic.ts +10 -10
  494. package/scripts/josh/josh-run.ts +3 -3
  495. package/scripts/josh/josh-verdict.ts +9 -12
  496. package/scripts/josh/josh.ts +3 -3
  497. package/scripts/josh/kit-only.ts +2 -2
  498. package/scripts/josh/path-decision.ts +3 -3
  499. package/scripts/josh/platform-temporary.ts +7 -5
  500. package/scripts/josh/process-identity.ts +24 -6
  501. package/scripts/josh/process-owner.ts +4 -4
  502. package/scripts/josh/session-language-cli.ts +53 -11
  503. package/scripts/josh/session-language.ts +1 -1
  504. package/scripts/josh/stamp-file.ts +48 -29
  505. package/scripts/josh/stamp-record.ts +57 -0
  506. package/scripts/lane/lane-await.ts +35 -11
  507. package/scripts/lane/lane-cache.ts +6 -6
  508. package/scripts/lane/lane-capacity.ts +32 -17
  509. package/scripts/lane/lane-child-invocation.ts +17 -15
  510. package/scripts/lane/lane-child-marker.ts +12 -12
  511. package/scripts/lane/lane-cli.ts +20 -13
  512. package/scripts/lane/lane-close.ts +6 -6
  513. package/scripts/lane/lane-dispatch.ts +61 -72
  514. package/scripts/lane/lane-environment.ts +5 -5
  515. package/scripts/lane/lane-guard-policy.ts +7 -21
  516. package/scripts/lane/lane-handoff.ts +2 -2
  517. package/scripts/lane/lane-install.ts +9 -10
  518. package/scripts/lane/lane-launch-cli.ts +13 -8
  519. package/scripts/lane/lane-ledger.ts +73 -11
  520. package/scripts/lane/lane-leftover.ts +44 -30
  521. package/scripts/lane/lane-limit-cli.ts +160 -0
  522. package/scripts/lane/lane-limit-override.ts +74 -0
  523. package/scripts/lane/lane-load.ts +19 -68
  524. package/scripts/lane/lane-measure-cli.ts +15 -25
  525. package/scripts/lane/lane-occupancy.ts +6 -4
  526. package/scripts/lane/lane-open.ts +25 -24
  527. package/scripts/lane/lane-output.ts +4 -3
  528. package/scripts/lane/lane-paths.ts +22 -8
  529. package/scripts/lane/lane-phase.ts +33 -0
  530. package/scripts/lane/lane-reap.ts +2 -2
  531. package/scripts/lane/lane-registry.ts +27 -15
  532. package/scripts/lane/lane-relaunch.ts +9 -9
  533. package/scripts/lane/lane-report.ts +5 -4
  534. package/scripts/lane/lane-resume.ts +2 -2
  535. package/scripts/lane/lane-sampler.ts +55 -0
  536. package/scripts/lane/lane-seed.ts +7 -7
  537. package/scripts/lane/lane-stage-stats.ts +135 -0
  538. package/scripts/lane/lane-start-point.ts +8 -11
  539. package/scripts/lane/lane-stats.ts +60 -15
  540. package/scripts/lane/lane-stray.ts +140 -0
  541. package/scripts/lane/lane-vacant.ts +1 -1
  542. package/scripts/lane/openai-lane-supervisor-decision.ts +3 -7
  543. package/scripts/lane/openai-lane-supervisor-owner.ts +3 -9
  544. package/scripts/lane/openai-review-broker.ts +2 -4
  545. package/scripts/lib/ancestor-directories.ts +1 -1
  546. package/scripts/lib/bounded-pool.ts +2 -2
  547. package/scripts/lib/buffered-process.ts +4 -6
  548. package/scripts/lib/caddy-logs.sh +0 -0
  549. package/scripts/lib/cli-flags.ts +39 -6
  550. package/scripts/lib/error-message.ts +1 -1
  551. package/scripts/lib/json-value.ts +17 -3
  552. package/scripts/lib/poll.ts +1 -1
  553. package/scripts/lib/status-icons.ts +3 -3
  554. package/scripts/lib/timed-fetch.ts +1 -1
  555. package/scripts/lib/timeouts.ts +1 -1
  556. package/scripts/lines/bytes-command.ts +3 -4
  557. package/scripts/lines/effective-limit.ts +25 -12
  558. package/scripts/lines/line-budget.ts +47 -55
  559. package/scripts/lines/line-targets.ts +6 -2
  560. package/scripts/lines/lines-command.ts +3 -3
  561. package/scripts/lint/cspell-cached.ts +1 -1
  562. package/scripts/lint/cycle-recheck.ts +122 -0
  563. package/scripts/lint/format.ts +1 -2
  564. package/scripts/lint/lint-parallel.ts +34 -19
  565. package/scripts/lint/lint-related-scope.ts +25 -15
  566. package/scripts/lint/lint-related.ts +6 -7
  567. package/scripts/managed-marker/index.ts +1 -1
  568. package/scripts/managed-marker/managed-marker-logic.ts +1 -2
  569. package/scripts/notify/git-notify.ts +9 -7
  570. package/scripts/notify/telegram-notify.ts +53 -37
  571. package/scripts/notify/telegram-test-logic.ts +3 -3
  572. package/scripts/notify/telegram-test.ts +45 -30
  573. package/scripts/observations/observation-ledger-home.ts +14 -8
  574. package/scripts/observations/observation-ledger-line.ts +3 -2
  575. package/scripts/observations/observation-ledger-migrate.ts +3 -4
  576. package/scripts/observations/observation-ledger-prepare.ts +4 -4
  577. package/scripts/observations/observation-ledger.ts +14 -15
  578. package/scripts/observations/observation-record-cli.ts +83 -0
  579. package/scripts/observations/observation-record.ts +91 -0
  580. package/scripts/observations/observations-flush-cli.ts +1 -1
  581. package/scripts/observations/observations-flush-landing.ts +7 -6
  582. package/scripts/observations/observations-flush.ts +26 -27
  583. package/scripts/overrides/overrides-check.ts +18 -8
  584. package/scripts/package/package-scout-cli.ts +1 -1
  585. package/scripts/package/package-scout-format.ts +2 -2
  586. package/scripts/package/package-scout.ts +1 -1
  587. package/scripts/propagate/propagate-git-failure.ts +1 -1
  588. package/scripts/propagate/propagate-git.ts +7 -7
  589. package/scripts/propagate/propagate-plan.ts +2 -2
  590. package/scripts/propagate/propagate-publish.ts +2 -3
  591. package/scripts/propagate/propagate-run.ts +5 -7
  592. package/scripts/propagate/propagate-select.ts +1 -1
  593. package/scripts/propagate/propagate-steps.ts +19 -20
  594. package/scripts/propagate/propagate-targets.ts +6 -10
  595. package/scripts/propagate/propagate.ts +5 -5
  596. package/scripts/refactor/import-graph.ts +1 -1
  597. package/scripts/refactor/refactor-lint.ts +4 -10
  598. package/scripts/refactor/refactor-scan-cli.ts +1 -1
  599. package/scripts/refactor/refactor-scan.ts +2 -2
  600. package/scripts/refactor/refactor-targets.ts +1 -1
  601. package/scripts/release/github-release-cli.ts +25 -3
  602. package/scripts/release/github-release-environment.ts +1 -0
  603. package/scripts/release/github-release-runs.ts +115 -0
  604. package/scripts/release/github-release.ts +13 -67
  605. package/scripts/release/release-cli.ts +21 -4
  606. package/scripts/release/release-history.ts +6 -10
  607. package/scripts/release/release-plan.ts +3 -3
  608. package/scripts/release/release-progress.ts +3 -4
  609. package/scripts/release/release-publish.ts +8 -9
  610. package/scripts/release/release-scope-cli.ts +8 -10
  611. package/scripts/release/release-tag.ts +6 -8
  612. package/scripts/release/release-worktree.ts +5 -5
  613. package/scripts/repo/auto-merge-setting-logic.ts +7 -9
  614. package/scripts/repo/auto-merge-setting.ts +1 -1
  615. package/scripts/repo/repo-setting.ts +4 -4
  616. package/scripts/repo/repository-labels.ts +1 -1
  617. package/scripts/repo/required-checks-logic.ts +3 -3
  618. package/scripts/repo/required-checks-report.ts +1 -1
  619. package/scripts/repo/ruleset-check-cli.ts +1 -1
  620. package/scripts/repo/ruleset-check.ts +1 -1
  621. package/scripts/report/report-format-reference.ts +26 -0
  622. package/scripts/report/report-lint-cli.ts +2 -2
  623. package/scripts/report/report-lint.ts +16 -2
  624. package/scripts/review/disposition-cli.ts +2 -2
  625. package/scripts/review/disposition-logic.ts +1 -1
  626. package/scripts/review/live-evidence.ts +9 -6
  627. package/scripts/review/review-attest-cli.ts +1 -2
  628. package/scripts/review/review-attest.ts +3 -3
  629. package/scripts/review/review-brief-cli.ts +19 -20
  630. package/scripts/review/review-brief.ts +29 -32
  631. package/scripts/review/review-checkout.ts +2 -2
  632. package/scripts/review/review-diff-parts.ts +3 -5
  633. package/scripts/review/review-diff-write.ts +1 -1
  634. package/scripts/review/review-finding-ledger.ts +7 -4
  635. package/scripts/review/review-findings-cli.ts +2 -2
  636. package/scripts/review/review-level.ts +4 -7
  637. package/scripts/review/review-record-cli.ts +73 -16
  638. package/scripts/review/review-record.ts +5 -4
  639. package/scripts/review/review-round2-cli.ts +2 -3
  640. package/scripts/review/review-round2.ts +13 -21
  641. package/scripts/review/review-stamps.ts +9 -71
  642. package/scripts/review/review-tree.ts +4 -5
  643. package/scripts/rules/bash-triggers.ts +4 -4
  644. package/scripts/rules/decision-oracle-batch.ts +5 -6
  645. package/scripts/rules/decision-oracle-stage.ts +1 -1
  646. package/scripts/rules/decision-oracle-tokens.ts +1 -2
  647. package/scripts/rules/decision-oracle.ts +2 -2
  648. package/scripts/rules/delivered-rules.ts +61 -406
  649. package/scripts/rules/destructive-command.ts +2 -2
  650. package/scripts/rules/direct-filing.ts +4 -4
  651. package/scripts/rules/direct-pr-create.ts +2 -2
  652. package/scripts/rules/early-heartbeat.ts +15 -19
  653. package/scripts/rules/file-body.ts +5 -6
  654. package/scripts/rules/filing-cap.ts +6 -7
  655. package/scripts/rules/filing-offer.ts +1 -1
  656. package/scripts/rules/firing-point.ts +6 -6
  657. package/scripts/rules/gh-api.ts +2 -2
  658. package/scripts/rules/git-argv.ts +3 -3
  659. package/scripts/rules/git-force.ts +2 -2
  660. package/scripts/rules/hook-context-line.ts +31 -0
  661. package/scripts/rules/implementation-cut-verdict.ts +5 -8
  662. package/scripts/rules/implementation-cut.ts +35 -32
  663. package/scripts/rules/index-guard.ts +2 -2
  664. package/scripts/rules/issue-citation.ts +7 -7
  665. package/scripts/rules/issue-comments.ts +21 -13
  666. package/scripts/rules/josh-git-bare.ts +2 -2
  667. package/scripts/rules/lane-background.ts +14 -16
  668. package/scripts/rules/lane-carry-conflict.ts +41 -5
  669. package/scripts/rules/lane-interactive-ask.ts +6 -9
  670. package/scripts/rules/lane-park.ts +12 -16
  671. package/scripts/rules/lane-split-park.ts +1 -2
  672. package/scripts/rules/lane-switch-main.ts +10 -13
  673. package/scripts/rules/last-prompt.ts +1 -1
  674. package/scripts/rules/oracle-consulted.ts +5 -5
  675. package/scripts/rules/oracle-firing.ts +6 -9
  676. package/scripts/rules/oracle-list-cli.ts +2 -2
  677. package/scripts/rules/permission-guards.ts +2 -2
  678. package/scripts/rules/piped-verification.ts +79 -9
  679. package/scripts/rules/poll-loop.ts +9 -11
  680. package/scripts/rules/pre-gate-cut.ts +33 -30
  681. package/scripts/rules/prior-comment-read.ts +3 -3
  682. package/scripts/rules/protected-files.ts +25 -13
  683. package/scripts/rules/raw-field-body.ts +3 -4
  684. package/scripts/rules/reply-language.ts +1 -1
  685. package/scripts/rules/rule-body-guard.ts +10 -12
  686. package/scripts/rules/rule-guard.ts +1 -1
  687. package/scripts/rules/rule-list.ts +51 -0
  688. package/scripts/rules/rule-registry-rows.ts +282 -0
  689. package/scripts/rules/rule-registry.ts +109 -0
  690. package/scripts/rules/rule-value-cache.ts +2 -2
  691. package/scripts/rules/rule-value-cli.ts +6 -4
  692. package/scripts/rules/rule-value.ts +61 -22
  693. package/scripts/rules/run-tail-rule.ts +11 -15
  694. package/scripts/rules/shell-body-trigger.ts +7 -7
  695. package/scripts/rules/shell-segments.ts +2 -4
  696. package/scripts/rules/stop-rules.ts +54 -41
  697. package/scripts/rules/tail-commands.ts +1 -1
  698. package/scripts/rules/test-declared-commit.ts +2 -2
  699. package/scripts/rules/third-party-write.ts +3 -3
  700. package/scripts/rules/worktree-guard.ts +12 -5
  701. package/scripts/run/add/run-add-cli.ts +165 -0
  702. package/scripts/run/add/run-add.ts +124 -0
  703. package/scripts/run/board/run-board-cli.ts +207 -0
  704. package/scripts/run/board/run-board-closed.ts +95 -0
  705. package/scripts/run/board/run-board-every.ts +60 -0
  706. package/scripts/run/board/run-board-fetch.ts +38 -0
  707. package/scripts/run/board/run-board-fit.ts +219 -0
  708. package/scripts/run/board/run-board-github.ts +162 -0
  709. package/scripts/run/board/run-board-header.ts +275 -0
  710. package/scripts/run/board/run-board-kind.ts +35 -0
  711. package/scripts/run/board/run-board-labels.ts +299 -0
  712. package/scripts/run/board/run-board-layout.ts +222 -0
  713. package/scripts/run/board/run-board-link.ts +31 -0
  714. package/scripts/run/board/run-board-machine.ts +198 -0
  715. package/scripts/run/board/run-board-notes.ts +103 -0
  716. package/scripts/run/board/run-board-phase.ts +136 -0
  717. package/scripts/run/board/run-board-plan.ts +129 -0
  718. package/scripts/run/board/run-board-read.ts +62 -0
  719. package/scripts/run/board/run-board-render-legend.ts +82 -0
  720. package/scripts/run/board/run-board-render-notes.ts +77 -0
  721. package/scripts/run/board/run-board-render-slot.ts +50 -0
  722. package/scripts/run/board/run-board-render.ts +407 -0
  723. package/scripts/run/board/run-board-scope.ts +17 -0
  724. package/scripts/run/board/run-board-screen.ts +43 -0
  725. package/scripts/run/board/run-board-span.ts +66 -0
  726. package/scripts/run/board/run-board-spin.ts +115 -0
  727. package/scripts/run/board/run-board-state.ts +113 -0
  728. package/scripts/run/board/run-board-status.ts +279 -0
  729. package/scripts/run/board/run-board-tick.ts +210 -0
  730. package/scripts/run/board/run-board-track.ts +22 -0
  731. package/scripts/run/board/run-board-usage-read.ts +255 -0
  732. package/scripts/run/board/run-board-usage-rusage.ts +124 -0
  733. package/scripts/run/board/run-board-usage-text.ts +80 -0
  734. package/scripts/run/board/run-board-usage.ts +165 -0
  735. package/scripts/run/carry/run-carry-added.ts +62 -0
  736. package/scripts/run/carry/run-carry-args.ts +25 -22
  737. package/scripts/run/carry/run-carry-change.ts +1 -1
  738. package/scripts/run/carry/run-carry-cli.ts +71 -48
  739. package/scripts/run/carry/run-carry-conversation.ts +6 -7
  740. package/scripts/run/carry/run-carry-ended.ts +85 -0
  741. package/scripts/run/carry/run-carry-reclaim.ts +1 -1
  742. package/scripts/run/carry/run-carry-stash.ts +3 -2
  743. package/scripts/run/carry/run-carry-streak.ts +8 -10
  744. package/scripts/run/carry/run-carry.ts +85 -89
  745. package/scripts/run/cut/run-cut-args.ts +7 -7
  746. package/scripts/run/cut/run-cut-cli.ts +68 -37
  747. package/scripts/run/cut/run-cut-handoff.ts +15 -15
  748. package/scripts/run/cut/run-cut-report.ts +37 -16
  749. package/scripts/run/cut/run-cut.ts +63 -77
  750. package/scripts/run/detached-launch.ts +35 -50
  751. package/scripts/run/entry/run-entry-cli.ts +48 -27
  752. package/scripts/run/entry/run-entry-stop.ts +7 -9
  753. package/scripts/run/entry/run-entry.ts +5 -6
  754. package/scripts/run/event/run-event-cli.ts +5 -6
  755. package/scripts/run/event/run-event-filed.ts +69 -0
  756. package/scripts/run/event/run-event-follow.ts +3 -3
  757. package/scripts/run/event/run-event-plan.ts +38 -0
  758. package/scripts/run/event/run-event-render.ts +10 -4
  759. package/scripts/run/event/run-event-scope.ts +47 -18
  760. package/scripts/run/event/run-event-stream-emit.ts +64 -11
  761. package/scripts/run/event/run-event-stream.ts +172 -43
  762. package/scripts/run/event/run-event-watch.ts +4 -6
  763. package/scripts/run/hold/run-hold-cli.ts +65 -62
  764. package/scripts/run/hold/run-hold.ts +88 -46
  765. package/scripts/run/merge/run-merge-cli.ts +116 -77
  766. package/scripts/run/merge/run-merge-collect.ts +107 -0
  767. package/scripts/run/merge/run-merge-steps.ts +112 -65
  768. package/scripts/run/merge/run-merge-token.ts +30 -0
  769. package/scripts/run/merge/run-merge.ts +31 -22
  770. package/scripts/run/progress/run-progress-args.ts +4 -4
  771. package/scripts/run/progress/run-progress-cli.ts +39 -50
  772. package/scripts/run/progress/run-progress-clock.ts +25 -32
  773. package/scripts/run/progress/run-progress-config.ts +6 -9
  774. package/scripts/run/progress/run-progress-read.ts +9 -10
  775. package/scripts/run/progress/run-progress.ts +48 -53
  776. package/scripts/run/review/run-review-cli.ts +6 -6
  777. package/scripts/run/review/run-review-steps.ts +6 -6
  778. package/scripts/run/review/run-review.ts +9 -11
  779. package/scripts/run/run-cli-fault.ts +29 -0
  780. package/scripts/run/run-ending-cli.ts +3 -3
  781. package/scripts/run/run-ending.ts +10 -14
  782. package/scripts/run/run-halfrun-resume.ts +6 -8
  783. package/scripts/run/run-headless.ts +25 -12
  784. package/scripts/run/run-invocation.ts +17 -22
  785. package/scripts/run/run-label.ts +7 -5
  786. package/scripts/run/run-liveness-cli.ts +19 -6
  787. package/scripts/run/run-liveness.ts +27 -38
  788. package/scripts/run/run-next-cli.ts +5 -9
  789. package/scripts/run/run-next.ts +4 -5
  790. package/scripts/run/run-parent-cut-hook.ts +10 -12
  791. package/scripts/run/run-preflight.ts +25 -29
  792. package/scripts/run/run-prep-cli.ts +17 -13
  793. package/scripts/run/run-prep-locate.ts +4 -5
  794. package/scripts/run/run-prep.ts +7 -10
  795. package/scripts/run/run-prrun-resume.ts +2 -2
  796. package/scripts/run/run-report-cli.ts +4 -4
  797. package/scripts/run/run-report.ts +9 -14
  798. package/scripts/run/run-retrospective.ts +3 -3
  799. package/scripts/run/run-section.ts +42 -0
  800. package/scripts/run/run-stage-read.ts +2 -2
  801. package/scripts/run/run-stage.ts +6 -4
  802. package/scripts/run/run-status-cli.ts +7 -5
  803. package/scripts/run/run-status.ts +6 -7
  804. package/scripts/run/run-step-cli.ts +13 -15
  805. package/scripts/run/run-step.ts +62 -48
  806. package/scripts/run/run-stop-notify.ts +7 -8
  807. package/scripts/run/run-stranded-cli.ts +1 -1
  808. package/scripts/run/run-stranded-detect.ts +4 -4
  809. package/scripts/run/run-stranded.ts +11 -13
  810. package/scripts/run/run-tail-cli.ts +15 -16
  811. package/scripts/run/run-tail.ts +14 -33
  812. package/scripts/run/run-watcher-guard-cli.ts +3 -4
  813. package/scripts/run/run-watcher-guard.ts +11 -12
  814. package/scripts/run/run-watcher-hook.ts +6 -12
  815. package/scripts/run/ship/run-ship-cli.ts +67 -33
  816. package/scripts/run/ship/run-ship-detach.ts +15 -13
  817. package/scripts/run/ship/run-ship-lock.ts +1 -1
  818. package/scripts/run/ship/run-ship-next.ts +7 -8
  819. package/scripts/run/ship/run-ship-pre-detach.ts +27 -11
  820. package/scripts/run/ship/run-ship-preflight.ts +10 -11
  821. package/scripts/run/ship/run-ship-probe.ts +4 -4
  822. package/scripts/run/ship/run-ship-return.ts +1 -1
  823. package/scripts/run/ship/run-ship-review-steps.ts +43 -24
  824. package/scripts/run/ship/run-ship-review.ts +12 -14
  825. package/scripts/run/ship/run-ship-scoped.ts +15 -6
  826. package/scripts/run/ship/run-ship-stage.ts +80 -26
  827. package/scripts/run/ship/run-ship-steps.ts +26 -16
  828. package/scripts/run/ship/run-ship-stop-text.ts +4 -2
  829. package/scripts/run/ship/run-ship-sync.ts +9 -8
  830. package/scripts/run/ship/run-ship.ts +17 -32
  831. package/scripts/run/tidy/run-tidy-cli.ts +9 -5
  832. package/scripts/run/tidy/run-tidy-lanes.ts +18 -7
  833. package/scripts/run/tidy/run-tidy-stashes.ts +8 -8
  834. package/scripts/run/tidy/run-tidy.ts +4 -3
  835. package/scripts/run/wake/run-wake-cli.ts +27 -33
  836. package/scripts/run/wake/run-wake-describe.ts +76 -29
  837. package/scripts/run/wake/run-wake-driver.ts +14 -14
  838. package/scripts/run/wake/run-wake-handoff.ts +6 -6
  839. package/scripts/run/wake/run-wake-loop.ts +13 -21
  840. package/scripts/run/wake/run-wake-restart.ts +4 -5
  841. package/scripts/run/wake/run-wake-session.ts +23 -27
  842. package/scripts/run/wake/run-wake.ts +57 -328
  843. package/scripts/safe-chain/ci-installer-pin.ts +3 -3
  844. package/scripts/safe-chain/pack-hook.ts +2 -2
  845. package/scripts/safe-chain/preinstall-command.ts +2 -2
  846. package/scripts/security/security-audit-logic.ts +1 -1
  847. package/scripts/security/security-audit-provision-logic.ts +1 -1
  848. package/scripts/security/security-audit-provision.ts +2 -2
  849. package/scripts/security/security-audit.ts +5 -5
  850. package/scripts/security/security-updates-logic.ts +2 -3
  851. package/scripts/security/security-updates.ts +2 -4
  852. package/scripts/self-sync-guard/index.ts +1 -1
  853. package/scripts/self-sync-guard/self-sync-guard-logic.ts +2 -2
  854. package/scripts/self-sync-guard/self-sync-refusal.ts +1 -1
  855. package/scripts/sonar/sonar-hotspots-cli.ts +1 -1
  856. package/scripts/sonar/sonar-hotspots.ts +1 -1
  857. package/scripts/sonar/sonar-new-code-cli.ts +1 -1
  858. package/scripts/sonar/sonar-new-code.ts +1 -1
  859. package/scripts/sonar/sonar-project.ts +1 -1
  860. package/scripts/split/split-assess-cli.ts +1 -1
  861. package/scripts/split/split-assess.ts +3 -3
  862. package/scripts/sync/directory-copy-guard.ts +2 -3
  863. package/scripts/sync/managed-config-scope-cli.ts +1 -2
  864. package/scripts/sync/managed-config-scope.ts +4 -4
  865. package/scripts/sync/plugin-skill-directories.ts +2 -2
  866. package/scripts/sync/reconcile-templates.ts +17 -8
  867. package/scripts/sync/removed-skill-manifest.ts +2 -3
  868. package/scripts/sync/sync-ai-files.ts +7 -7
  869. package/scripts/sync/sync-configs.ts +30 -3
  870. package/scripts/sync/sync-hook-safety.ts +2 -2
  871. package/scripts/sync/sync.ts +23 -10
  872. package/scripts/sync/synced-paths.ts +2 -1
  873. package/scripts/sync/workflow-pin-logic.ts +1 -1
  874. package/scripts/test/test-declared-changed.ts +4 -4
  875. package/scripts/test/test-declared-logic.ts +2 -3
  876. package/scripts/test/test-declared-match.ts +25 -4
  877. package/scripts/test/test-declared.ts +26 -9
  878. package/scripts/test/test-red-commit.ts +3 -2
  879. package/scripts/test/test-red-logic.ts +7 -14
  880. package/scripts/test/test-red.ts +12 -47
  881. package/scripts/test/test-related-scope.ts +2 -3
  882. package/scripts/test/test-related.ts +3 -3
  883. package/scripts/test/test-type-logic.ts +1 -2
  884. package/scripts/test/test-unit-guard.ts +13 -17
  885. package/scripts/test/unit-worker-share.ts +7 -8
  886. package/scripts/time-runtime/time-agent-bundles.ts +2 -4
  887. package/scripts/time-runtime/time-background.ts +17 -21
  888. package/scripts/time-runtime/time-batch-guard.ts +67 -342
  889. package/scripts/time-runtime/time-bundle-call.ts +26 -28
  890. package/scripts/time-runtime/time-bundles.ts +11 -12
  891. package/scripts/time-runtime/time-call-identity.ts +1 -1
  892. package/scripts/time-runtime/time-command-key.ts +2 -2
  893. package/scripts/time-runtime/time-density-hook.ts +8 -11
  894. package/scripts/time-runtime/time-density.ts +5 -5
  895. package/scripts/time-runtime/time-followup-stage.ts +7 -7
  896. package/scripts/time-runtime/time-format.ts +5 -5
  897. package/scripts/time-runtime/time-hook-transcript.ts +3 -3
  898. package/scripts/time-runtime/time-instant.ts +1 -1
  899. package/scripts/time-runtime/time-markers.ts +15 -19
  900. package/scripts/time-runtime/time-phase-names.ts +3 -3
  901. package/scripts/time-runtime/time-reported-failure.ts +15 -19
  902. package/scripts/time-runtime/time-round-trips.ts +20 -23
  903. package/scripts/time-runtime/time-shell.ts +8 -8
  904. package/scripts/time-runtime/time-single-check.ts +1 -2
  905. package/scripts/time-runtime/time-spans.ts +35 -40
  906. package/scripts/time-runtime/time-tool-call.ts +15 -16
  907. package/scripts/time-runtime/time-transcript-line.ts +53 -34
  908. package/scripts/time-runtime/time-writes.ts +5 -5
  909. package/scripts/ui/ui-routes-cli.ts +1 -2
  910. package/scripts/ui/ui-routes.ts +1 -2
  911. package/scripts/version/bump-version.ts +1 -1
  912. package/scripts/version/fresh-metadata-cache.ts +2 -2
  913. package/scripts/version/latest-corepack.ts +129 -98
  914. package/scripts/version/latest-lane-guard.ts +1 -1
  915. package/scripts/version/latest-scope-cli.ts +2 -2
  916. package/scripts/version/latest-stamp.ts +1 -2
  917. package/scripts/version/latest-update.ts +2 -2
  918. package/scripts/version/npm-registry.ts +2 -2
  919. package/scripts/version/package-manager-version.ts +18 -0
  920. package/scripts/version/publishable-range-check.ts +2 -1
  921. package/scripts/version/publishable-range.ts +1 -1
  922. package/scripts/version/release-age.ts +11 -11
  923. package/scripts/version/release-hold.ts +2 -2
  924. package/scripts/version/safe-chain-version-update.ts +3 -3
  925. package/scripts/version/version-check-logic.ts +2 -3
  926. package/scripts/version/version-check.ts +1 -2
  927. package/scripts/version/version-command-config.ts +2 -2
  928. package/scripts/version/version-commands.ts +3 -3
  929. package/scripts/version/version-remote.ts +4 -4
  930. package/scripts/version/version-targets.ts +2 -2
  931. package/templates/gitignore +7 -0
  932. package/templates/workflows/github-release.yml +4 -0
  933. package/dist/hooks/chunk-NV2JRZZO.js +0 -6385
  934. package/dist/hooks/chunk-RKUAD3I6.js +0 -90
  935. package/dist/hooks/chunk-WPALEIRX.js +0 -18
  936. package/scripts/backlog/backlog-restructure.ts +0 -152
  937. package/scripts/rules/issue-fold-rule.ts +0 -72
  938. package/scripts/rules/wip-cap.ts +0 -63
  939. package/scripts/run/run-issue-number.ts +0 -19
@@ -1,11 +1,12 @@
1
1
  import { existsSync, readFileSync } from 'node:fs'
2
2
  import path from 'node:path'
3
3
  import type { RepoMap } from '#scripts/discovery/repo-map-logic'
4
+ import { json_value } from '#scripts/lib/json-value'
4
5
  import { z } from 'zod'
5
6
 
6
7
  // Deciding which repositories a published release should be carried into.
7
8
  //
8
- // The candidate set is joshuafolkken/kit#869's discovery map, so the owner restriction is inherited
9
+ // The candidate set is the repository discovery map, so the owner restriction is inherited
9
10
  // rather than restated: propagation writes — `josh vu`, `josh sync`, a commit, a pull request — and
10
11
  // a write aimed at somebody else's repository is worse than a read aimed at one. Nothing here
11
12
  // re-implements discovery.
@@ -13,16 +14,15 @@ import { z } from 'zod'
13
14
  // Which candidates are targets is read from the candidate itself: a repository is downstream when
14
15
  // its manifest declares a dependency on this package. That is a fact about the checkout in front of
15
16
  // us rather than a roster, so a new consumer needs no edit here — and it covers a consumer that is
16
- // not a published package at all, which a list of downstream package names cannot
17
- // (joshuafolkken/kit#863).
17
+ // not a published package at all, which a list of downstream package names cannot.
18
18
 
19
19
  const MANIFEST_NAME = 'package.json'
20
20
  const NODE_MODULES = 'node_modules'
21
21
 
22
22
  // Why a candidate is not going to be processed, or that it is. `not_selected` is the one state set
23
- // after classification: a candidate `--target` left out (joshuafolkken/kit#2755). `carried_above` is
23
+ // after classification: a candidate `--target` left out. `carried_above` is
24
24
  // the other: a consumer that installs a toolkit above the supplier, which that toolkit's own
25
- // propagation delivers instead (joshuafolkken/kit#2879).
25
+ // propagation delivers instead.
26
26
  type TargetState =
27
27
  | 'ready'
28
28
  | 'up_to_date'
@@ -68,11 +68,7 @@ function read_manifest(repository_path: string): Manifest | undefined {
68
68
  if (!existsSync(manifest_path)) return undefined
69
69
 
70
70
  try {
71
- const parsed: unknown = JSON.parse(readFileSync(manifest_path, 'utf8'))
72
-
73
- const result = manifest_schema.safeParse(parsed)
74
-
75
- return result.success ? result.data : undefined
71
+ return json_value.parse_with(readFileSync(manifest_path, 'utf8'), manifest_schema)
76
72
  } catch {
77
73
  return undefined
78
74
  }
@@ -15,7 +15,7 @@ import { propagate_steps, type ReleasePlan } from './propagate-steps'
15
15
  import { propagate_targets, type PropagateTarget } from './propagate-targets'
16
16
 
17
17
  // `josh propagate` — carry the release this repository just published into every consumer checked
18
- // out next to it (joshuafolkken/kit#863).
18
+ // out next to it.
19
19
 
20
20
  const SUCCESS_EXIT_CODE = 0
21
21
  const FAILURE_EXIT_CODE = 1
@@ -32,7 +32,7 @@ const UNTOUCHED_NOTE = 'No consumer was touched.'
32
32
  interface RunOptions {
33
33
  is_dry_run: boolean
34
34
  is_publish_wait_skipped: boolean
35
- // The one consumer to propagate to, when `--target` narrowed the run (joshuafolkken/kit#2755).
35
+ // The one consumer to propagate to, when `--target` narrowed the run.
36
36
  target?: string
37
37
  // The usage message, when the arguments were not accepted. Carried alongside rather than returned
38
38
  // instead, so the caller has one shape to branch on.
@@ -87,11 +87,11 @@ function parse_options(argv: ReadonlyArray<string>): RunOptions {
87
87
  }
88
88
 
89
89
  // Propagation runs from the supplier's own repository, and only there — kit's, or a toolkit's built
90
- // on it (joshuafolkken/kit#2879).
90
+ // on it.
91
91
  //
92
92
  // This is also what decides who propagates when several sessions are running: in the
93
93
  // per-repository concurrency model there is one session per checkout, so the session standing in
94
- // the supplier repository is the one that can run this command (joshuafolkken/kit#861). It is a
94
+ // the supplier repository is the one that can run this command. It is a
95
95
  // convention enforced at the boundary, not a lock — two checkouts of the supplier would both pass,
96
96
  // which is why each consumer is additionally refused unless its working tree is clean.
97
97
  function refuse_outside_source_repository(project_root: string): string | undefined {
@@ -192,7 +192,7 @@ interface RunPlan {
192
192
 
193
193
  // The consumers this run will consider, narrowed by `--target`. Resolved before the publish wait so
194
194
  // a mistyped name fails at once instead of after minutes of polling the registry. A consumer that
195
- // installs a toolkit above the supplier is left to that toolkit's propagation (joshuafolkken/kit#2879).
195
+ // installs a toolkit above the supplier is left to that toolkit's propagation.
196
196
  function resolve_run_targets(
197
197
  releases: ReleasePlan,
198
198
  version: string,
@@ -1,7 +1,7 @@
1
1
  import path from 'node:path'
2
2
  import { file_reader } from '#scripts/lib/read-file'
3
3
 
4
- // The scope expansion `prompts/refactoring.md` §4.3 used to describe in prose (joshuafolkken/kit#2180):
4
+ // The scope expansion `prompts/refactoring.md` §4.3 used to describe in prose:
5
5
  // from the seed files, follow imports both ways — the files a seed imports and the files that import a
6
6
  // seed — for up to three stages, stopping as soon as a stage finds nothing new. Walking the import
7
7
  // graph is exactly computable, so it is computed here rather than read and traced by hand.
@@ -1,10 +1,11 @@
1
1
  import path from 'node:path'
2
2
  import { find_local_bin_upwards } from '#scripts/build/local-bin'
3
+ import { json_value } from '#scripts/lib/json-value'
3
4
  import { LINT_TIMEOUT_MS } from '#scripts/lib/timeouts'
4
5
  import { execa } from 'execa'
5
6
  import { z } from 'zod'
6
7
 
7
- // The mechanical half of `prompts/refactoring.md` (joshuafolkken/kit#2255): the refactoring
8
+ // The mechanical half of `prompts/refactoring.md`: the refactoring
8
9
  // priorities ESLint already decides. Rather than read the checklist and grep by hand, the project's
9
10
  // own eslint is asked in JSON and its findings are bucketed into the checklist's items.
10
11
  //
@@ -186,16 +187,9 @@ function eslint_command(root: string, files: ReadonlyArray<string>): ReadonlyArr
186
187
  }
187
188
 
188
189
  // `undefined` means the run did not produce parseable eslint JSON — a failure, kept distinct from a
189
- // valid empty array (a clean scope), so a scan that could not run is never reported as `clear`
190
- // (joshuafolkken/kit#2180).
190
+ // valid empty array (a clean scope), so a scan that could not run is never reported as `clear`.
191
191
  function parse_results(raw: string | undefined = 'null'): Array<LintResult> | undefined {
192
- try {
193
- const parsed = results_schema.safeParse(JSON.parse(raw))
194
-
195
- return parsed.success ? parsed.data : undefined
196
- } catch {
197
- return undefined
198
- }
192
+ return json_value.parse_with(raw, results_schema)
199
193
  }
200
194
 
201
195
  // The project's own eslint over the scope, in JSON. `reject: false` because eslint exits non-zero when
@@ -3,7 +3,7 @@ import { fileURLToPath } from 'node:url'
3
3
  import { refactor_scan } from './refactor-scan'
4
4
 
5
5
  // The `josh refactor:scan` entry point. It takes no arguments: the scope is the changed files, or
6
- // `scripts/` when nothing changed, decided the same way for every run (joshuafolkken/kit#2180).
6
+ // `scripts/` when nothing changed, decided the same way for every run.
7
7
 
8
8
  if (process.argv[1] === fileURLToPath(import.meta.url)) {
9
9
  process.exitCode = await refactor_scan.run_scan()
@@ -5,7 +5,7 @@ import { refactor_lint, type CategoryResult } from './refactor-lint'
5
5
  import { refactor_targets } from './refactor-targets'
6
6
 
7
7
  // `josh refactor:scan` — the command `prompts/refactoring.md` §4.1–§4.3 now point to instead of
8
- // describing the search by hand (joshuafolkken/kit#2180). It selects the target files, expands the
8
+ // describing the search by hand. It selects the target files, expands the
9
9
  // scope along the import graph, asks the project's own eslint which refactoring candidates the scope
10
10
  // holds, and answers whether any high- or medium-priority candidate remains.
11
11
  //
@@ -16,7 +16,7 @@ import { refactor_targets } from './refactor-targets'
16
16
 
17
17
  // The convergence vocabulary. `clear` is what §4.3's self-reported "no high- or medium-priority
18
18
  // candidate left" loop exit becomes once a command answers it: a token a caller can read, not a claim.
19
- // `error` is the third answer (joshuafolkken/kit#2180): the eslint run itself did not complete, so the
19
+ // `error` is the third answer: the eslint run itself did not complete, so the
20
20
  // scope's state is unknown — kept distinct from `clear` so a failed scan is never read as converged.
21
21
  const CLEAR = 'clear'
22
22
  const CANDIDATES = 'candidates'
@@ -4,7 +4,7 @@ import { changed_paths } from '#scripts/git/changed-paths'
4
4
  import { line_targets } from '#scripts/lines/line-targets'
5
5
 
6
6
  // The target-file selection of `josh refactor:scan` — the priority `prompts/refactoring.md` §4.1
7
- // used to spell out in prose (joshuafolkken/kit#2180). The scope is the same reading every scoped
7
+ // used to spell out in prose. The scope is the same reading every scoped
8
8
  // command decides from — the branch diff plus the untracked files (`changed-paths.ts`) — and only
9
9
  // when that is empty does it fall back to `scripts/`, so a run on a clean `main` still has something
10
10
  // to scan rather than reporting nothing.
@@ -1,8 +1,14 @@
1
1
  import { fileURLToPath } from 'node:url'
2
2
  import { git_spawn_sync } from '#scripts/git/git-spawn-sync'
3
+ import { cli_flags } from '#scripts/lib/cli-flags'
3
4
  import { github_release } from './github-release'
4
5
  import { github_release_environment } from './github-release-environment'
5
6
 
7
+ const KNOWN_FLAGS: ReadonlyArray<string> = []
8
+ const COMMAND_NAME = 'release:github'
9
+ const ARGUMENT_START = 2
10
+ const SUCCESS_EXIT_CODE = 0
11
+
6
12
  // A release published without the tag list would pick its previous tag from nothing, so a failed
7
13
  // `git tag` stops the run rather than reading as "no tags".
8
14
  function local_tags(): Array<string> {
@@ -12,13 +18,29 @@ function local_tags(): Array<string> {
12
18
  return output.split('\n')
13
19
  }
14
20
 
15
- async function main(): Promise<void> {
21
+ // **No argument reaches the publish**. The command reads only the
22
+ // environment, so a `--help` it ignored would create a real GitHub Release; a help request prints
23
+ // the usage and any other argument is refused, both before the environment is read.
24
+ async function run_argv(argv: ReadonlyArray<string>): Promise<number> {
25
+ const answer = cli_flags.answer_help_or_unknown(
26
+ argv.slice(ARGUMENT_START),
27
+ KNOWN_FLAGS,
28
+ COMMAND_NAME,
29
+ )
30
+ if (answer !== undefined) return answer
31
+
16
32
  const { token, tag, settings } = github_release_environment.read_release_input(process.env)
17
33
 
18
34
  console.info(await github_release.publish(fetch, token, tag, { ...settings, tags: local_tags() }))
35
+
36
+ return SUCCESS_EXIT_CODE
37
+ }
38
+
39
+ async function main(argv: ReadonlyArray<string>): Promise<void> {
40
+ process.exitCode = await run_argv(argv)
19
41
  }
20
42
 
21
- if (process.argv[1] === fileURLToPath(import.meta.url)) await main()
43
+ if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv)
22
44
 
23
- const github_release_cli = { local_tags }
45
+ const github_release_cli = { local_tags, run_argv }
24
46
  export { github_release_cli }
@@ -38,6 +38,7 @@ function read_release_input(environment: Environment): ReleaseInput {
38
38
  workflow: optional(environment['RELEASE_WORKFLOW']),
39
39
  jobs: job_names(environment['RELEASE_JOBS']),
40
40
  await_publish: environment['RELEASE_AWAIT_PUBLISH'] === 'true',
41
+ release_run_workflow: optional(environment['RELEASE_RUN_WORKFLOW']),
41
42
  },
42
43
  }
43
44
  }
@@ -0,0 +1,115 @@
1
+ import { z } from 'zod'
2
+
3
+ // A job skipped by its `if:` (or neutral) belongs to a run that succeeded; counting it would skip a
4
+ // lower tag whose release is still on its way.
5
+ const FAILED_CONCLUSIONS = new Set(['failure', 'cancelled', 'timed_out', 'startup_failure'])
6
+ const RELEASE_RUN_TITLE = 'GitHub Release '
7
+ const RUN_SCHEMA = z.object({
8
+ id: z.number(),
9
+ display_title: z.string(),
10
+ status: z.string().optional(),
11
+ conclusion: z.string().nullable().optional(),
12
+ })
13
+ const JOB_SCHEMA = z.object({
14
+ name: z.string(),
15
+ status: z.string(),
16
+ conclusion: z.string().nullable(),
17
+ })
18
+ const RUNS_SCHEMA = z.object({ workflow_runs: z.array(RUN_SCHEMA) })
19
+ const JOBS_SCHEMA = z.object({ jobs: z.array(JOB_SCHEMA) })
20
+
21
+ type Run = z.infer<typeof RUN_SCHEMA>
22
+ type PollState = 'ready' | 'failed' | 'pending'
23
+
24
+ // `read` answers a GET on a repository API path. `workflow` is the publish workflow and `jobs` the
25
+ // jobs in it whose failure counts (empty: every job). `release_run_workflow` is the workflow that
26
+ // creates a tag's release — the publish workflow itself when its run creates the release.
27
+ interface RunSource {
28
+ read: (path: string) => Promise<unknown>
29
+ workflow: string | undefined
30
+ jobs: ReadonlyArray<string>
31
+ release_run_workflow: string | undefined
32
+ }
33
+
34
+ function is_failed_job(job: z.infer<typeof JOB_SCHEMA>, names: ReadonlyArray<string>): boolean {
35
+ if (job.status !== 'completed' || !FAILED_CONCLUSIONS.has(job.conclusion ?? '')) return false
36
+ if (names.length === 0) return true
37
+
38
+ return names.some((name) => job.name === name || job.name.startsWith(`${name} /`))
39
+ }
40
+
41
+ async function list_runs(source: RunSource, workflow_name: string): Promise<ReadonlyArray<Run>> {
42
+ const workflow = encodeURIComponent(workflow_name)
43
+
44
+ return RUNS_SCHEMA.parse(await source.read(`/actions/workflows/${workflow}/runs?per_page=100`))
45
+ .workflow_runs
46
+ }
47
+
48
+ async function find_run(
49
+ source: RunSource,
50
+ workflow_name: string,
51
+ title: string,
52
+ ): Promise<Run | undefined> {
53
+ const runs = await list_runs(source, workflow_name)
54
+
55
+ return runs.find((item) => item.display_title === title)
56
+ }
57
+
58
+ async function has_failed_job(source: RunSource, run_id: number): Promise<boolean> {
59
+ const { jobs } = JOBS_SCHEMA.parse(
60
+ await source.read(`/actions/runs/${String(run_id)}/jobs?per_page=100`),
61
+ )
62
+
63
+ return jobs.some((job) => is_failed_job(job, source.jobs))
64
+ }
65
+
66
+ // A run started before its title named the tag may be at work on any tag.
67
+ function may_release(run: Run, tag: string): boolean {
68
+ if (run.status === 'completed') return false
69
+
70
+ return (
71
+ run.display_title === `${RELEASE_RUN_TITLE}${tag}` ||
72
+ !run.display_title.startsWith(RELEASE_RUN_TITLE)
73
+ )
74
+ }
75
+
76
+ // Unset, nothing tells that a release is over, so the lower tag is waited for.
77
+ async function is_release_over(source: RunSource, tag: string): Promise<boolean> {
78
+ const workflow = source.release_run_workflow
79
+ if (workflow === undefined) return false
80
+ if (workflow === source.workflow) return true
81
+
82
+ const runs = await list_runs(source, workflow)
83
+
84
+ return runs.every((run) => !may_release(run, tag))
85
+ }
86
+
87
+ // A lower tag whose publication failed, or finished while no release run is left at work on it,
88
+ // never gains a release, so waiting on it would hold every later one.
89
+ async function is_release_lost(source: RunSource, tag: string): Promise<boolean> {
90
+ if (source.workflow === undefined) return false
91
+
92
+ const run = await find_run(source, source.workflow, `Publish ${tag}`)
93
+ if (!run) return false
94
+ if (await has_failed_job(source, run.id)) return true
95
+
96
+ return run.status === 'completed' && (await is_release_over(source, tag))
97
+ }
98
+
99
+ // A run not listed yet is pending too: the announcement that starts this release also starts the
100
+ // publication, so the release can ask before GitHub has queued that run.
101
+ async function publication_state(
102
+ source: RunSource,
103
+ workflow: string,
104
+ tag: string,
105
+ ): Promise<PollState> {
106
+ const run = await find_run(source, workflow, `Publish ${tag}`)
107
+ if (run?.status !== 'completed') return 'pending'
108
+
109
+ return run.conclusion === 'success' ? 'ready' : 'failed'
110
+ }
111
+
112
+ const github_release_runs = { is_release_lost, publication_state }
113
+
114
+ export type { PollState, RunSource }
115
+ export { github_release_runs }
@@ -1,6 +1,7 @@
1
1
  import { setTimeout } from 'node:timers/promises'
2
2
  import semver from 'semver'
3
3
  import { z } from 'zod'
4
+ import { github_release_runs, type PollState, type RunSource } from './github-release-runs'
4
5
 
5
6
  const API_ROOT = 'https://api.github.com/repos'
6
7
  const LATEST_PATH = '/releases/latest'
@@ -8,42 +9,26 @@ const REPOSITORY_PATTERN = /^[\w.-]+\/[\w.-]+$/u
8
9
  const TAG_PATTERN = /^v\d+\.\d+\.\d+(?:[.-][0-9A-Za-z.-]+)?$/u
9
10
  const REQUEST_TIMEOUT_MS = 30_000
10
11
  const NOT_FOUND_STATUS = 404
11
- // A job skipped by its `if:` (or neutral) belongs to a run that succeeded; counting it would skip a
12
- // lower tag whose release is still on its way.
13
- const FAILED_CONCLUSIONS = new Set(['failure', 'cancelled', 'timed_out', 'startup_failure'])
14
12
  const POLL_INTERVAL_MS = 30_000
15
13
  const MAX_WAIT_ATTEMPTS = 120
16
14
  const RELEASE_SCHEMA = z.object({ tag_name: z.string().min(1) })
17
15
  const NOTES_SCHEMA = z.object({ name: z.string().min(1), body: z.string().min(1) })
18
- const RUN_SCHEMA = z.object({
19
- id: z.number(),
20
- display_title: z.string(),
21
- status: z.string().optional(),
22
- conclusion: z.string().nullable().optional(),
23
- })
24
- const JOB_SCHEMA = z.object({
25
- name: z.string(),
26
- status: z.string(),
27
- conclusion: z.string().nullable(),
28
- })
29
- const RUNS_SCHEMA = z.object({ workflow_runs: z.array(RUN_SCHEMA) })
30
- const JOBS_SCHEMA = z.object({ jobs: z.array(JOB_SCHEMA) })
31
-
32
16
  type ReleaseRequest = (url: string, init: RequestInit) => Promise<Response>
33
17
  type Wait = () => Promise<void>
34
- type PollState = 'ready' | 'failed' | 'pending'
35
18
 
36
19
  // What differs between repositories. `start_tag` is the last tag that predates automatic releases;
37
20
  // without it the latest existing release is the floor. `workflow` names the publish workflow whose
38
21
  // failed run lets a lower tag be skipped, and `jobs` the jobs in it that count (empty: every job).
39
22
  // `await_publish` holds the tag's own release until its run in that workflow has succeeded, for a
40
- // release started beside the publication rather than from inside it.
23
+ // release started beside the publication rather than from inside it. `release_run_workflow` names
24
+ // the workflow whose run creates a tag's release, so a lower tag left without one can be told lost.
41
25
  interface ReleaseSettings {
42
26
  repository: string
43
27
  start_tag?: string | undefined
44
28
  workflow?: string | undefined
45
29
  jobs?: ReadonlyArray<string> | undefined
46
30
  await_publish?: boolean | undefined
31
+ release_run_workflow?: string | undefined
47
32
  }
48
33
 
49
34
  interface PublishOptions extends ReleaseSettings {
@@ -51,12 +36,10 @@ interface PublishOptions extends ReleaseSettings {
51
36
  wait?: Wait
52
37
  }
53
38
 
54
- interface Client {
39
+ interface Client extends Omit<RunSource, 'read'> {
55
40
  request: ReleaseRequest
56
41
  token: string
57
42
  url: string
58
- workflow: string | undefined
59
- jobs: ReadonlyArray<string>
60
43
  }
61
44
 
62
45
  // `fallback` answers when no tag sits between the floor and the target; without one the floor itself
@@ -139,59 +122,21 @@ function predecessor(
139
122
  .toSorted((left, right) => semver.compare(right, left))[0]
140
123
  }
141
124
 
142
- function is_failed_job(job: z.infer<typeof JOB_SCHEMA>, names: ReadonlyArray<string>): boolean {
143
- if (job.status !== 'completed' || !FAILED_CONCLUSIONS.has(job.conclusion ?? '')) return false
144
- if (names.length === 0) return true
145
-
146
- return names.some((name) => job.name === name || job.name.startsWith(`${name} /`))
147
- }
148
-
149
- async function publish_run(
150
- client: Client,
151
- workflow_name: string,
152
- tag: string,
153
- ): Promise<z.infer<typeof RUN_SCHEMA> | undefined> {
154
- const workflow = encodeURIComponent(workflow_name)
155
- const runs_response = await api_get(client, `/actions/workflows/${workflow}/runs?per_page=100`)
156
- const runs = RUNS_SCHEMA.parse(await read_response(runs_response)).workflow_runs
157
-
158
- return runs.find((item) => item.display_title === `Publish ${tag}`)
159
- }
160
-
161
- async function failed_publication(client: Client, tag: string): Promise<boolean> {
162
- if (client.workflow === undefined) return false
163
-
164
- const run = await publish_run(client, client.workflow, tag)
165
- if (!run) return false
166
-
167
- const jobs_response = await api_get(client, `/actions/runs/${String(run.id)}/jobs?per_page=100`)
168
- const { jobs } = JOBS_SCHEMA.parse(await read_response(jobs_response))
169
-
170
- return jobs.some((job) => is_failed_job(job, client.jobs))
125
+ function run_source(client: Client): RunSource {
126
+ return { ...client, read: async (path) => await read_response(await api_get(client, path)) }
171
127
  }
172
128
 
173
129
  async function default_wait(): Promise<void> {
174
130
  await setTimeout(POLL_INTERVAL_MS)
175
131
  }
176
132
 
133
+ // The lost state is read before the release: a run completes only after creating the release, so a
134
+ // run that completes between the two reads still shows its release to the second one.
177
135
  async function release_state(client: Client, tag: string): Promise<PollState> {
136
+ const is_lost = await github_release_runs.is_release_lost(run_source(client), tag)
178
137
  if (await existing_release(client, tag)) return 'ready'
179
- if (await failed_publication(client, tag)) return 'failed'
180
-
181
- return 'pending'
182
- }
183
-
184
- // A run not listed yet is pending too: the announcement that starts this release also starts the
185
- // publication, so the release can ask before GitHub has queued that run.
186
- async function publication_state(
187
- client: Client,
188
- workflow: string,
189
- tag: string,
190
- ): Promise<PollState> {
191
- const run = await publish_run(client, workflow, tag)
192
- if (run?.status !== 'completed') return 'pending'
193
138
 
194
- return run.conclusion === 'success' ? 'ready' : 'failed'
139
+ return is_lost ? 'failed' : 'pending'
195
140
  }
196
141
 
197
142
  async function poll(
@@ -225,7 +170,7 @@ async function wait_for_publication(client: Client, tag: string, budget: Budget)
225
170
  if (workflow === undefined) throw new Error('Waiting for the publication needs RELEASE_WORKFLOW')
226
171
 
227
172
  return await poll(
228
- async () => await publication_state(client, workflow, tag),
173
+ async () => await github_release_runs.publication_state(run_source(client), workflow, tag),
229
174
  budget,
230
175
  `Publish ${tag}`,
231
176
  )
@@ -325,6 +270,7 @@ function create_client(request: ReleaseRequest, token: string, settings: Release
325
270
  url: `${API_ROOT}/${settings.repository}`,
326
271
  workflow: settings.workflow,
327
272
  jobs: settings.jobs ?? [],
273
+ release_run_workflow: settings.release_run_workflow,
328
274
  }
329
275
  }
330
276
 
@@ -1,23 +1,26 @@
1
1
  #!/usr/bin/env tsx
2
2
  import { fileURLToPath } from 'node:url'
3
3
  import { git_command } from '#scripts/git/git-command'
4
+ import { cli_flags } from '#scripts/lib/cli-flags'
4
5
  import { error_text } from '#scripts/lib/error-message'
5
6
  import { release_history } from './release-history'
6
7
  import { release_plan, type ReleasePlan } from './release-plan'
7
8
  import { release_publish } from './release-publish'
8
9
 
9
- // `pnpm josh release` — the one place that decides a version (joshuafolkken/kit#1169).
10
+ // `pnpm josh release` — the one place that decides a version.
10
11
  //
11
12
  // It does three things and no more: count the merges main has taken since the version last changed,
12
13
  // report and stop when that count is zero, and otherwise raise the version by that many minors, open
13
14
  // a pull request, merge it and watch for the tag.
14
15
  //
15
- // **It never touches the root checkout** (joshuafolkken/kit#2411). The count is read from
16
+ // **It never touches the root checkout**. The count is read from
16
17
  // `origin/<default>`, and the version bump / commit / push happen in a dedicated work tree
17
18
  // `release_publish` cuts for the release — so a release can run beside a `backlogrun` (which keeps the
18
19
  // root on the default branch) and can start even when the root is dirty or on another branch.
19
20
 
20
21
  const DRY_RUN_FLAG = '--dry-run'
22
+ const KNOWN_FLAGS: ReadonlyArray<string> = [DRY_RUN_FLAG]
23
+ const COMMAND_NAME = 'release'
21
24
  const ARGUMENT_START = 2
22
25
  const SUCCESS_EXIT_CODE = 0
23
26
  const FAILURE_EXIT_CODE = 1
@@ -73,9 +76,23 @@ function is_dry_run_requested(argv: ReadonlyArray<string>): boolean {
73
76
  return argv.slice(ARGUMENT_START).includes(DRY_RUN_FLAG)
74
77
  }
75
78
 
79
+ // **Only a known argument reaches the release**. The command publishes,
80
+ // so a `--help` it did not read once started a real release; a help request now prints the usage, and
81
+ // anything else unknown is refused, both before the first fetch.
82
+ async function run_argv(argv: ReadonlyArray<string>): Promise<number> {
83
+ const answer = cli_flags.answer_help_or_unknown(
84
+ argv.slice(ARGUMENT_START),
85
+ KNOWN_FLAGS,
86
+ COMMAND_NAME,
87
+ )
88
+ if (answer !== undefined) return answer
89
+
90
+ return await run(is_dry_run_requested(argv))
91
+ }
92
+
76
93
  async function main(): Promise<void> {
77
94
  try {
78
- process.exit(await run(is_dry_run_requested(process.argv)))
95
+ process.exit(await run_argv(process.argv))
79
96
  } catch (error) {
80
97
  console.error(error_text.message_of(error))
81
98
  process.exit(FAILURE_EXIT_CODE)
@@ -84,6 +101,6 @@ async function main(): Promise<void> {
84
101
 
85
102
  if (process.argv[1] === fileURLToPath(import.meta.url)) void main()
86
103
 
87
- const release_cli = { is_dry_run_requested, run, DRY_RUN_FLAG }
104
+ const release_cli = { is_dry_run_requested, run, run_argv, DRY_RUN_FLAG }
88
105
 
89
106
  export { release_cli }
@@ -1,15 +1,16 @@
1
1
  import { git_command } from '#scripts/git/git-command'
2
+ import { json_value } from '#scripts/lib/json-value'
2
3
  import { package_with_version_schema } from '#scripts/lib/schemas'
3
4
  import { version_targets } from '#scripts/version/version-targets'
4
5
  import { release_plan, type ReleasePlan, type VersionedCommit } from './release-plan'
5
6
 
6
7
  // Reading main's history for the two numbers a release is made of: where the version last changed,
7
- // and how many merges have landed since (joshuafolkken/kit#1169).
8
+ // and how many merges have landed since.
8
9
 
9
10
  const { PACKAGE_JSON } = version_targets
10
11
 
11
12
  // How far back the search for "the commit that last changed the version" goes, counted in commits
12
- // that touched `package.json`. Once children stop bumping (joshuafolkken/kit#1486) that file still
13
+ // that touched `package.json`. Once children stop bumping that file still
13
14
  // changes for every dependency update, so the base can sit several entries down — but a repository
14
15
  // that has taken thirty `package.json` commits without a single release has a different problem, and
15
16
  // guessing past that point would be worse than saying so.
@@ -18,8 +19,7 @@ const BASE_SEARCH_LIMIT = 30
18
19
  // **Which ref the history is read from.** `josh release` runs on a pulled default branch, so `HEAD`
19
20
  // is main there and the default is right. A caller on a feature branch names the ref it means —
20
21
  // `origin/main` — because `--first-parent` from a branch tip walks that branch rather than main, and
21
- // the count would silently omit every merge main took after the branch was cut
22
- // (joshuafolkken/kit#1486).
22
+ // the count would silently omit every merge main took after the branch was cut.
23
23
  const DEFAULT_TIP = 'HEAD'
24
24
 
25
25
  // The reads this module makes, named so a test can answer them without a git repository. Production
@@ -42,11 +42,7 @@ const git_reader: HistoryReader = {
42
42
  function parse_version(content: string | undefined): string | undefined {
43
43
  if (content === undefined) return undefined
44
44
 
45
- try {
46
- return package_with_version_schema.parse(JSON.parse(content)).version
47
- } catch {
48
- return undefined
49
- }
45
+ return json_value.parse_with(content, package_with_version_schema)?.version
50
46
  }
51
47
 
52
48
  async function read_version_at(
@@ -90,7 +86,7 @@ async function read_base(
90
86
 
91
87
  // The version `package.json` carries at a git revision. `josh release` reads it from
92
88
  // `origin/<default>` rather than from the checkout's own `package.json`, so the number it raises is
93
- // main's latest even when the run happens in a work tree cut for the release (joshuafolkken/kit#2411).
89
+ // main's latest even when the run happens in a work tree cut for the release.
94
90
  async function read_current_version(
95
91
  tip: string = DEFAULT_TIP,
96
92
  reader: HistoryReader = git_reader,
@@ -1,6 +1,6 @@
1
1
  import semver from 'semver'
2
2
 
3
- // What a release is, decided from main's history alone (joshuafolkken/kit#1169).
3
+ // What a release is, decided from main's history alone.
4
4
  //
5
5
  // **A version is a property of main's history, not of a branch.** `bump-version.ts` reads the local
6
6
  // `package.json` and increments it, so two branches cut from the same version both claim the same
@@ -51,7 +51,7 @@ function previous_version_of(
51
51
  // **The newest commit whose `package.json` version differs from the version immediately before it.**
52
52
  //
53
53
  // **A commit that touched `package.json` without moving the version is skipped**, which is what makes
54
- // this right once children stop bumping (joshuafolkken/kit#1486): a dependency update rewrites the
54
+ // this right once children stop bumping: a dependency update rewrites the
55
55
  // file every time and must not be mistaken for a release.
56
56
  //
57
57
  // **Both sides have to be readable for this to be a version change.** An unreadable neighbor makes
@@ -96,7 +96,7 @@ function short_sha(sha: string): string {
96
96
 
97
97
  // **The count is the line a person reads**, which is why it is built here rather than at each caller:
98
98
  // the release command prints it, and so does anything else that wants to say how much is waiting to
99
- // ship (joshuafolkken/kit#1169 → "the count of unreleased merges shows somewhere visible").
99
+ // ship.
100
100
  function format_pending_line(pending: number): string {
101
101
  return `${PENDING_ICON} unreleased merges on main: ${String(pending)}`
102
102
  }
@@ -9,13 +9,12 @@ import { version_targets } from '#scripts/version/version-targets'
9
9
  import { z } from 'zod'
10
10
  import { release_tag } from './release-tag'
11
11
 
12
- // The stage lines `pnpm josh release` prints, and the two stages it waits for after the tag
13
- // (joshuafolkken/kit#3193).
12
+ // The stage lines `pnpm josh release` prints, and the two stages it waits for after the tag.
14
13
  //
15
14
  // **The tag starts the distribution, it does not finish it.** `publish.yml` runs off the tag:
16
15
  // `publish-npm` puts the version on npm and `create-release` opens the GitHub Release once the
17
- // publishing jobs pass. The command used to stop at the tag and call the release published, ahead of
18
- // both. It now waits for each, prints one line per stage reached, and prints the completion line only
16
+ // publishing jobs pass. Stopping at the tag would call the release published ahead of both, so the
17
+ // command waits for each, prints one line per stage reached, and prints the completion line only
19
18
  // when every stage has — a stage that times out is named with ❌ and the run exits non-zero.
20
19
 
21
20
  const { PACKAGE_JSON } = version_targets