@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
@@ -5,33 +5,37 @@
5
5
  * The target version is resolved from the registry's publish timestamps
6
6
  * (`pnpm view pnpm time --json`) instead of a dist-tag, because pnpm publishes its
7
7
  * per-major tag `latest-<major>` only for SUPERSEDED majors — while <major> is the newest
8
- * major, the only tag covering it is `latest` (kit#750). The former `latest-<major>` pin
9
- * (kit#444) therefore failed on every run in the common case, and `latest` itself can
10
- * momentarily point below the devEngines floor. Picking the newest registry version whose
11
- * major equals the `packageManager` pin keeps both invariants: never below the adopted
12
- * major, and advancing while that major is the current one.
8
+ * major, the only tag covering it is `latest`, so a `latest-<major>` pin would fail on every
9
+ * run in the common case, and `latest` itself can momentarily point below the devEngines
10
+ * floor. Picking the newest registry version whose major equals the `packageManager` pin keeps
11
+ * both invariants: never below the adopted major, and advancing while that major is the
12
+ * current one.
13
13
  *
14
- * The `minimumReleaseAge` quarantine is applied natively from `pnpm-workspace.yaml` (kit#768,
15
- * #3267). safe-chain filters the registry only when the process tree was launched through one
16
- * of its wrapped shell commands, so `josh latest` and `pnpm josh latest` used to resolve
17
- * different answers and the pin oscillated. Reading the window from the repo-managed
14
+ * The `minimumReleaseAge` quarantine is applied natively from `pnpm-workspace.yaml`.
15
+ * safe-chain filters the registry only when the process tree was launched through one of its
16
+ * wrapped shell commands, so `josh latest` and `pnpm josh latest` would resolve different
17
+ * answers and the pin would oscillate. Reading the window from the repo-managed
18
18
  * `pnpm-workspace.yaml` and filtering by publish timestamp makes the resolution identical in
19
19
  * every invocation context; right after a pnpm release the answer is simply the previous
20
- * release, exactly as the filtered view behaved.
20
+ * release, exactly as the filtered view behaves.
21
21
  *
22
22
  * The resolved version is floored at the current `packageManager` pin: a filtered registry
23
23
  * view legitimately answers below a freshly adopted pin for the first 24 hours after every
24
- * pnpm release, and writing that answer would downgrade the protected toolchain pin
25
- * (kit#766). Not-newer answers skip the bump non-fatally instead.
24
+ * pnpm release, and writing that answer would downgrade the protected toolchain pin.
25
+ * Not-newer answers skip the bump non-fatally instead.
26
26
  *
27
27
  * `devEngines.packageManager.version` is realigned with the `packageManager` pin on every
28
- * path — bumped, skipped, or unresolvable (kit#773). Alignment used to run only after a
29
- * successful bump, which never fires in the steady state of an up-to-date repository, so a
30
- * manifest that arrived with the two fields out of step kept the pnpm dual-declaration
31
- * warning forever. The alignment is idempotent, so running it unconditionally is free.
28
+ * path — bumped, skipped, or unresolvable. A bump never fires in the steady state of an
29
+ * up-to-date repository, so alignment gated on one would leave a manifest that arrived with
30
+ * the two fields out of step warning forever. The alignment is idempotent, so running it
31
+ * unconditionally is free.
32
32
  *
33
- * Registry and pnpm failures stay non-fatal: they are logged and swallowed (exit 0)
34
- * so the rest of the `josh latest` chain (`latest:update`, `audit`) keeps running.
33
+ * A failed bump exits non-zero with its cause, the manifest restored — a skip would let
34
+ * `latest:scope --record` mark the run fresh while a pnpm that could not self-update (the
35
+ * Corepack shim refuses it) stayed pinned silently. `josh latest` runs this step
36
+ * last, right before the record, so the dependency update and the audit still finish and only the
37
+ * record is withheld. A registry answer not newer than the pin, or nothing aged past the
38
+ * quarantine window yet, remains a non-fatal skip.
35
39
  *
36
40
  * Usage: tsx scripts/version/latest-corepack.ts
37
41
  */
@@ -54,9 +58,19 @@ const WORKSPACE_PATH = 'pnpm-workspace.yaml'
54
58
  const SHA512_BYTES = 64
55
59
  const INTEGRITY_RE = /^sha512-([A-Za-z0-9+/]+={0,2})$/u
56
60
  const PACKAGE_MANAGER_VALUE_RE = /("packageManager"\s*:\s*")pnpm@[^"]+(")/u
61
+
62
+ // `target` is undefined both when the registry did not answer and when it answered but nothing has
63
+ // aged past the quarantine window yet; only the first is a failure.
64
+ interface TargetResolution {
65
+ target: string | undefined
66
+ is_registry_reachable: boolean
67
+ }
68
+
57
69
  const PNPM_DEVELOPMENT_MANAGER_SCHEMA = z.object({ name: z.literal('pnpm'), version: z.string() })
58
70
  const DEV_ENGINES_SCHEMA = z.object({ packageManager: PNPM_DEVELOPMENT_MANAGER_SCHEMA })
59
71
  const DEV_ENGINES_PNPM_SCHEMA = z.object({ devEngines: DEV_ENGINES_SCHEMA.optional() })
72
+ const COREPACK_REMEDY =
73
+ 'pnpm runs through the Corepack shim, where pnpm 11+ refuses self-update (ERR_PNPM_CANT_SELF_UPDATE_IN_COREPACK). Run `corepack disable pnpm`, install a standalone pnpm (https://pnpm.io/installation), run josh sync so a devEngines.packageManager.onFail of "error" becomes "download" (the standalone pnpm then fetches the pinned version), then rerun josh latest.'
60
74
 
61
75
  function extract_development_engines_version(package_json_content: string): string | undefined {
62
76
  const parsed = DEV_ENGINES_PNPM_SCHEMA.safeParse(
@@ -94,7 +108,7 @@ function extract_pinned_version(package_json_content: string): string | undefine
94
108
 
95
109
  // Never move the pin backwards. A filtered registry view (safe-chain's minimum-release-age
96
110
  // proxy) answers below a freshly adopted pin for 24 hours after every pnpm release, and an
97
- // equal answer would only rewrite the same value — both skip instead (kit#766).
111
+ // equal answer would only rewrite the same value — both skip instead.
98
112
  function is_target_not_newer_than_pin(target: string, pinned_version: string | undefined): boolean {
99
113
  if (pinned_version === undefined) return false
100
114
  const target_version = target.slice(TARGET_PREFIX.length)
@@ -128,22 +142,33 @@ function query_release_times(): Record<string, string> | undefined {
128
142
  return extract_times_json(result.stdout)
129
143
  }
130
144
 
145
+ function to_resolution(
146
+ version: string | undefined,
147
+ is_registry_reachable: boolean,
148
+ ): TargetResolution {
149
+ const target = version === undefined ? undefined : `${TARGET_PREFIX}${version}`
150
+
151
+ return { target, is_registry_reachable }
152
+ }
153
+
131
154
  // Ask the registry for the newest pnpm release on the pinned major that has aged past the
132
- // quarantine window. Returns undefined when the query fails or nothing qualifies yet.
133
- function query_major_latest_version(major: string): string | undefined {
155
+ // quarantine window.
156
+ function resolve_major_target(major: string): TargetResolution {
134
157
  const times = query_release_times()
135
- if (times === undefined) return undefined
158
+ if (times === undefined) return to_resolution(undefined, false)
136
159
 
137
160
  // The project's own `pnpm-workspace.yaml`, deliberately not the upward walk the version check
138
161
  // uses: `josh latest` reads `package.json` and writes the pnpm pin relative to the working
139
162
  // directory, so it has no subdirectory case — and honouring an ancestor's policy here could freeze
140
- // pnpm bumps in a project that declares none (joshuafolkken/kit#808).
141
- return release_age.select_aged_version(
163
+ // pnpm bumps in a project that declares none.
164
+ const version = release_age.select_aged_version(
142
165
  times,
143
166
  major,
144
167
  release_age.read_minimum_release_age(WORKSPACE_PATH),
145
168
  Date.now(),
146
169
  )
170
+
171
+ return to_resolution(version, true)
147
172
  }
148
173
 
149
174
  function parse_latest_version(stdout: string): string | undefined {
@@ -163,24 +188,40 @@ function query_latest_version(): string | undefined {
163
188
  return parse_latest_version(result.stdout)
164
189
  }
165
190
 
166
- // The value handed to pnpm self-update: an exact registry-resolved version on the pinned
167
- // major, the latest exact version when no major can be read from package.json, or undefined when
168
- // the registry could not answer (the caller skips non-fatally).
169
- function resolve_corepack_target(major: string | undefined): string | undefined {
170
- const version = major === undefined ? query_latest_version() : query_major_latest_version(major)
171
- if (version === undefined) return undefined
191
+ // The target handed to pnpm self-update: an exact registry-resolved version on the pinned major, or
192
+ // the latest exact version when no major can be read from package.json. The latest-version query
193
+ // has no quarantine selection, so resolving nothing there always means the registry did not answer.
194
+ function resolve_target(major: string | undefined): TargetResolution {
195
+ if (major !== undefined) return resolve_major_target(major)
196
+ const version = query_latest_version()
197
+
198
+ return to_resolution(version, version !== undefined)
199
+ }
172
200
 
173
- return `pnpm@${version}`
201
+ function resolve_corepack_target(major: string | undefined): string | undefined {
202
+ return resolve_target(major).target
174
203
  }
175
204
 
176
- // Non-fatal skip message shared by both skip paths: keep the josh latest chain
177
- // (latest:update, audit) running instead of aborting on a bump failure.
205
+ // Non-fatal skip message for a registry answer with nothing to adopt — nothing to bump, nothing failed.
178
206
  function warn_skip(reason: string): void {
179
- console.warn(`⚠ Skipped pnpm bump (${reason}); the chain continues.`)
207
+ console.warn(`⚠ Skipped pnpm bump (${reason}).`)
208
+ }
209
+
210
+ // Every failure path ends here, so the exit status the `josh latest` chain stops on is one value.
211
+ function fail_bump(reason: string): number {
212
+ console.error(
213
+ `✖ pnpm bump failed (${reason}); the run is not recorded, so the next josh latest retries it.`,
214
+ )
215
+
216
+ return FAILURE_EXIT_CODE
180
217
  }
181
218
 
182
- function warn_unresolved(major: string | undefined = ''): void {
183
- warn_skip(`no pnpm ${major} release resolvable from the registry`)
219
+ // Corepack exports COREPACK_ROOT to the package manager it launches, and pnpm 11+ refuses
220
+ // `self-update` under it (ERR_PNPM_CANT_SELF_UPDATE_IN_COREPACK), so the remedy is named there.
221
+ function fail_self_update(status: number, environment: NodeJS.ProcessEnv = process.env): number {
222
+ if (environment['COREPACK_ROOT'] !== undefined) console.error(COREPACK_REMEDY)
223
+
224
+ return fail_bump(`pnpm self-update exited ${String(status)}`)
184
225
  }
185
226
 
186
227
  function run_pnpm_update(target: string): number {
@@ -193,22 +234,11 @@ function run_pnpm_update(target: string): number {
193
234
  return result.exitCode ?? FAILURE_EXIT_CODE
194
235
  }
195
236
 
196
- // The target is an already-resolved exact version, so a non-zero status here is a
197
- // genuine pnpm or network failure; a later run retries. Returns whether a skip
198
- // happened.
199
- function did_warn_skip(status: number): boolean {
200
- if (status === 0) return false
201
-
202
- warn_skip(`pnpm self-update exited ${String(status)}`)
203
-
204
- return true
205
- }
206
-
207
237
  // Realign `devEngines.packageManager.version` with the `packageManager` pin so the two
208
238
  // fields keep matching (pnpm suppresses the dual-declaration warning only on an exact
209
239
  // match). Runs on every path, not just after a successful bump: a repository that arrives
210
240
  // with the two fields already out of step sits in the no-bump steady state forever, so an
211
- // alignment gated on a bump would never repair it (kit#773).
241
+ // alignment gated on a bump would never repair it.
212
242
  function sync_development_engines(package_json_path: string = PACKAGE_JSON_PATH): void {
213
243
  const content = readFileSync(package_json_path, 'utf8')
214
244
  const aligned = package_manager_version.align_development_engines_version(content)
@@ -224,7 +254,7 @@ function restore_package_json(
224
254
  package_json_path: string = PACKAGE_JSON_PATH,
225
255
  ): void {
226
256
  writeFileSync(package_json_path, content)
227
- console.info('✔ Restored package.json pin (pnpm bump skipped)')
257
+ console.info('✔ Restored package.json pin (pnpm bump failed)')
228
258
  }
229
259
 
230
260
  function decode_integrity(encoded: string): string | undefined {
@@ -281,7 +311,7 @@ function restore_integrity(target: string, integrity: string): void {
281
311
  }
282
312
 
283
313
  // The equal case is the steady state of every up-to-date run, so it logs as success; only
284
- // an answer strictly below the pin is the anomaly worth a warning (kit#766).
314
+ // an answer strictly below the pin is the anomaly worth a warning.
285
315
  function notify_skipped_bump(target: string, pinned_version: string): void {
286
316
  if (target === `${TARGET_PREFIX}${pinned_version}`) {
287
317
  console.info(`✔ pnpm pin ${pinned_version} already matches the newest registry release.`)
@@ -292,35 +322,19 @@ function notify_skipped_bump(target: string, pinned_version: string): void {
292
322
  warn_skip(`registry answered ${target}, below the pinned ${pinned_version}`)
293
323
  }
294
324
 
295
- // Resolve the pnpm target with the pin floor applied. Undefined means the bump was
296
- // skipped and the reason has already been logged.
297
- function resolve_floored_target(original: string, major: string | undefined): string | undefined {
298
- const target = resolve_corepack_target(major)
299
-
300
- if (target === undefined) {
301
- warn_unresolved(major)
302
-
303
- return undefined
304
- }
305
-
306
- const pinned_version = extract_pinned_version(original)
307
- if (!is_target_not_newer_than_pin(target, pinned_version)) return target
308
-
309
- notify_skipped_bump(target, pinned_version ?? '')
310
-
311
- return undefined
312
- }
313
-
314
- function restore_after_update(original: string, target: string, integrity: string): void {
325
+ function restore_after_update(original: string, target: string, integrity: string): number {
315
326
  try {
316
327
  restore_integrity(target, integrity)
328
+
329
+ return 0
317
330
  } catch {
318
331
  restore_package_json(original)
319
- warn_skip('pnpm self-update wrote an unexpected pin')
332
+
333
+ return fail_bump('pnpm self-update wrote an unexpected pin')
320
334
  }
321
335
  }
322
336
 
323
- function pin_unpinned_manifest(original: string, target: string, integrity: string): void {
337
+ function pin_unpinned_manifest(original: string, target: string, integrity: string): number {
324
338
  const manifest = z.record(z.string(), z.unknown()).parse(json_value.parse_or_undefined(original))
325
339
  const pinned = JSON.stringify(
326
340
  { ...manifest, packageManager: `${target}+${integrity}` },
@@ -334,53 +348,71 @@ function pin_unpinned_manifest(original: string, target: string, integrity: stri
334
348
  )
335
349
 
336
350
  const result = execaSync('pnpm', ['--version'], { reject: false })
337
- if (result.exitCode === 0 && result.stdout.trim() === target.slice(TARGET_PREFIX.length)) return
351
+ if (result.exitCode === 0 && result.stdout.trim() === target.slice(TARGET_PREFIX.length)) return 0
338
352
 
339
353
  restore_package_json(original)
340
- warn_skip('the newly pinned pnpm version could not start')
341
- }
342
354
 
343
- function update_pinned_manifest(original: string, target: string, integrity: string): void {
344
- const is_skipped = did_warn_skip(run_pnpm_update(target))
355
+ return fail_bump('the newly pinned pnpm version could not start')
356
+ }
345
357
 
346
- if (is_skipped) {
347
- restore_package_json(original)
358
+ // The target is an already-resolved exact version, so a non-zero status here is a genuine
359
+ // pnpm, Corepack or network failure.
360
+ function update_pinned_manifest(original: string, target: string, integrity: string): number {
361
+ const status = run_pnpm_update(target)
362
+ if (status === 0) return restore_after_update(original, target, integrity)
348
363
 
349
- return
350
- }
364
+ restore_package_json(original)
351
365
 
352
- restore_after_update(original, target, integrity)
366
+ return fail_self_update(status)
353
367
  }
354
368
 
355
369
  // Query integrity before mutating the manifest; self-update writes both pins without it.
356
- function bump_package_manager(original: string, target: string): void {
370
+ function bump_package_manager(original: string, target: string): number {
357
371
  const integrity = query_integrity(target)
372
+ if (integrity === undefined) return fail_bump(`no integrity for ${target}`)
373
+ if (!PACKAGE_MANAGER_RE.test(original)) return pin_unpinned_manifest(original, target, integrity)
358
374
 
359
- if (integrity === undefined) {
360
- warn_skip(`no integrity for ${target}`)
375
+ return update_pinned_manifest(original, target, integrity)
376
+ }
361
377
 
362
- return
363
- }
378
+ // An unreachable registry fails, so the unrecorded run is retried. A reachable one with nothing
379
+ // aged past the quarantine window is the quarantine skip — like a not-newer answer, there is nothing
380
+ // to adopt yet, and failing would stall every run for up to the whole window.
381
+ function report_unresolved(major: string | undefined, is_registry_reachable: boolean): number {
382
+ const label = `pnpm ${major ?? ''}`.trimEnd()
383
+ if (!is_registry_reachable) return fail_bump(`the registry did not answer for ${label}`)
364
384
 
365
- if (!PACKAGE_MANAGER_RE.test(original)) {
366
- pin_unpinned_manifest(original, target, integrity)
385
+ warn_skip(`no ${label} release has aged past the quarantine window yet`)
367
386
 
368
- return
387
+ return 0
388
+ }
389
+
390
+ // Resolve the pnpm target with the pin floor applied, then bump.
391
+ function bump_to_registry_target(original: string, major: string | undefined): number {
392
+ const { target, is_registry_reachable } = resolve_target(major)
393
+ if (target === undefined) return report_unresolved(major, is_registry_reachable)
394
+
395
+ const pinned_version = extract_pinned_version(original)
396
+
397
+ if (!is_target_not_newer_than_pin(target, pinned_version)) {
398
+ return bump_package_manager(original, target)
369
399
  }
370
400
 
371
- update_pinned_manifest(original, target, integrity)
401
+ notify_skipped_bump(target, pinned_version ?? '')
402
+
403
+ return 0
372
404
  }
373
405
 
374
- function main(): void {
406
+ function main(): number {
375
407
  const original = readFileSync(PACKAGE_JSON_PATH, 'utf8')
376
- const major = extract_pnpm_major(original)
377
- const target = resolve_floored_target(original, major)
378
- if (target !== undefined) bump_package_manager(original, target)
408
+ const status = bump_to_registry_target(original, extract_pnpm_major(original))
379
409
 
380
410
  sync_development_engines()
411
+
412
+ return status
381
413
  }
382
414
 
383
- if (process.argv[1] === fileURLToPath(import.meta.url)) main()
415
+ if (process.argv[1] === fileURLToPath(import.meta.url)) process.exitCode = main()
384
416
 
385
417
  const latest_corepack = {
386
418
  extract_pnpm_major,
@@ -388,12 +420,11 @@ const latest_corepack = {
388
420
  is_target_not_newer_than_pin,
389
421
  notify_skipped_bump,
390
422
  extract_times_json,
391
- query_major_latest_version,
392
423
  resolve_corepack_target,
393
424
  run_pnpm_update,
394
425
  query_integrity,
395
426
  restore_integrity,
396
- did_warn_skip,
427
+ fail_self_update,
397
428
  sync_development_engines,
398
429
  restore_package_json,
399
430
  main,
@@ -2,7 +2,7 @@
2
2
  import { fileURLToPath } from 'node:url'
3
3
  import { lane_paths, type LaneEnvironment } from '#scripts/lane/lane-paths'
4
4
 
5
- // Refuse a dependency update inside a lane (joshuafolkken/kit#2135).
5
+ // Refuse a dependency update inside a lane.
6
6
  //
7
7
  // `latest:scope` reads how long ago `josh latest` last finished, and that stamp is keyed to the
8
8
  // project root. A lane is a linked work tree whose project root is its own directory, so a fresh
@@ -3,7 +3,7 @@ import { fileURLToPath } from 'node:url'
3
3
  import { latest_lane_guard } from './latest-lane-guard'
4
4
  import { latest_stamp, type LatestStamp } from './latest-stamp'
5
5
 
6
- // `josh latest:scope` — say whether this run has to update dependencies (joshuafolkken/kit#1215).
6
+ // `josh latest:scope` — say whether this run has to update dependencies.
7
7
  //
8
8
  // A command rather than a paragraph in a procedure, for the reason `josh review:level` is a command:
9
9
  // a rule an agent applies from memory is a rule an agent can talk itself out of, and this one is
@@ -65,7 +65,7 @@ function decide(): Decision {
65
65
  }
66
66
  }
67
67
 
68
- // A lane is answered `skip` before the stamp is even read (joshuafolkken/kit#2135): the stamp is
68
+ // A lane is answered `skip` before the stamp is even read: the stamp is
69
69
  // keyed to the project root, so a lane always reads as stale, and every lane would otherwise run its
70
70
  // own dependency update. `latest_lane_guard` is the single source of the reason and of the refusal
71
71
  // `josh latest` prints.
@@ -1,8 +1,7 @@
1
1
  import { PROJECT_ROOT } from '#scripts/init/init-paths'
2
2
  import { stamp_file } from '#scripts/josh/stamp-file'
3
3
 
4
- // When `josh latest` last finished in this checkout, and whether that is recent enough to skip
5
- // (joshuafolkken/kit#1215).
4
+ // When `josh latest` last finished in this checkout, and whether that is recent enough to skip.
6
5
  //
7
6
  // `josh latest` is a network-bound chain — pnpm update, every dependency, `ranges`, `pnpm audit` — that
8
7
  // took 60–120 seconds at the head of every `fullrun` / `halfrun` and of every child a batch ran, and
@@ -63,8 +63,8 @@ function report_kept_back(regressions: ReadonlyArray<VersionRegression>): void {
63
63
 
64
64
  // The direct-dependency `--latest` bump lifts the package.json ranges; this second, argument-less
65
65
  // pass then re-resolves every tier the lockfile carries within those ranges, which is the only stage
66
- // that reaches the indirect packages a direct-only update leaves pinned at a stale resolution
67
- // (joshuafolkken/kit#2200). `pnpm update` defaults to depth Infinity, so no flag is needed to reach
66
+ // that reaches the indirect packages a direct-only update leaves pinned at a stale resolution.
67
+ // `pnpm update` defaults to depth Infinity, so no flag is needed to reach
68
68
  // the whole tree. The re-resolution stage always runs — even when every direct dependency is
69
69
  // overridden and the `--latest` stage is absent, the indirect tiers still need re-resolving.
70
70
  const PNPM_UPDATE_ALL_TIERS = ['pnpm', 'update']
@@ -7,7 +7,7 @@ import { z } from 'zod'
7
7
  import { release_age } from './release-age'
8
8
 
9
9
  // The public npm registry, read without credentials so a consumer who installed from public npm
10
- // can see the latest release without a `read:packages` GitHub token (joshuafolkken/kit#2882). The
10
+ // can see the latest release without a `read:packages` GitHub token. The
11
11
  // GitHub Packages versions API stays the source for a scope routed there, and the fallback for a
12
12
  // package public npm does not carry.
13
13
  const PUBLIC_REGISTRY = 'https://registry.npmjs.org'
@@ -99,7 +99,7 @@ function read_release_times(package_name: string): Record<string, string> | unde
99
99
  // Whether public npm already carries `<name>@<version>`. **Asked of public npm regardless of how this
100
100
  // checkout routes the scope**, unlike the two readers above: `josh release` waits for `publish.yml`'s
101
101
  // `publish-npm` job and links the npmjs.com page, so GitHub Packages answering would not be the
102
- // question it asks (joshuafolkken/kit#3193).
102
+ // question it asks.
103
103
  function has_public_version(package_name: string, version: string): boolean {
104
104
  const parsed = times_schema.safeParse(read_packument(package_name, FULL_ACCEPT))
105
105
 
@@ -14,6 +14,12 @@ const PNPM_PIN_REGEX = /^pnpm@(.+)$/u
14
14
  const DEV_ENGINES_NAME_FIRST_REGEX = /("name":\s*"pnpm"\s*,\s*"version":\s*")[^"]+(")/u
15
15
  const DEV_ENGINES_VERSION_FIRST_REGEX = /("version":\s*")[^"]+("\s*,\s*"name":\s*"pnpm")/u
16
16
 
17
+ // An `onFail: "error"` inside a `"packageManager": { … }` object — in a manifest that is only
18
+ // `devEngines.packageManager`, since the top-level `packageManager` is a string — and never
19
+ // `devEngines.runtime`, because `[^{}]` cannot cross into another block.
20
+ const DEV_ENGINES_ON_FAIL_ERROR_REGEX = /("packageManager":\s*\{[^{}]*"onFail":\s*")error(")/u
21
+ const ON_FAIL_DOWNLOAD = 'download'
22
+
17
23
  const optional_version_schema = z.object({ version: z.string().optional() }).optional()
18
24
 
19
25
  const alignment_read_schema = z.object({
@@ -86,10 +92,22 @@ function align_development_engines_version(content: string): string {
86
92
  return set_development_engines_version(content, target)
87
93
  }
88
94
 
95
+ // `onFail: "error"` rejects any pnpm that is not byte-for-byte the pin, so a machine that left
96
+ // Corepack for a standalone pnpm cannot run pnpm at all; `"download"` fetches the pinned version
97
+ // instead. Only `"error"` is rewritten — a `"warn"` / `"ignore"` the
98
+ // project chose itself is kept, and the rest of the file is preserved byte-for-byte.
99
+ function upgrade_development_engines_on_fail(content: string): string {
100
+ return content.replace(
101
+ DEV_ENGINES_ON_FAIL_ERROR_REGEX,
102
+ (_match: string, prefix: string, suffix: string) => `${prefix}${ON_FAIL_DOWNLOAD}${suffix}`,
103
+ )
104
+ }
105
+
89
106
  const package_manager_version = {
90
107
  extract_pnpm_pin,
91
108
  align_development_engines_version,
92
109
  set_development_engines_version,
110
+ upgrade_development_engines_on_fail,
93
111
  }
94
112
 
95
113
  export { package_manager_version }
@@ -24,7 +24,8 @@ const FAILURE_EXIT_CODE = 1
24
24
  // consumer can resolve — the exact blind spot this guard exists to close.
25
25
  //
26
26
  // `pnpm view` rather than `npm view` because npm refuses to run at all inside a project whose
27
- // `devEngines.packageManager` names pnpm with `onFail: "error"`, failing every probe with
27
+ // `devEngines.packageManager` names pnpm with an `onFail` other than `"warn"` / `"ignore"` (kit
28
+ // ships `"download"`, which npm refuses on just the same), failing every probe with
28
29
  // EBADDEVENGINES instead of answering. Both are shimmed, so the filtered view is preserved.
29
30
  function probe_range(name: string, range: string): ProbeResult {
30
31
  const result = execaSync('pnpm', ['view', `${name}@${range}`, 'version'], {
@@ -4,7 +4,7 @@ import semver from 'semver'
4
4
  // kit ships a `preinstall` hook that installs @aikidosec/safe-chain, whose minimum-age policy hides
5
5
  // releases younger than its window from every install running behind it. A range whose floor sits
6
6
  // inside that window has no satisfying version for a consumer, so `pnpm install` fails with
7
- // ERR_PNPM_NO_MATCHING_VERSION naming a version that demonstrably exists and is tagged latest (#742).
7
+ // ERR_PNPM_NO_MATCHING_VERSION naming a version that demonstrably exists and is tagged latest.
8
8
  //
9
9
  // The check asks the registry through that same filtered view instead of modelling the policy:
10
10
  // `pnpm view <name>@<range> version` prints no version and exits non-zero
@@ -4,14 +4,14 @@ import { yaml_document } from '#scripts/lib/yaml-document'
4
4
  import semver from 'semver'
5
5
  import { z } from 'zod'
6
6
 
7
- // The minimum-release-age quarantine (kit#768), applied natively instead of inherited from
8
- // safe-chain's interception. safe-chain filters the registry only when the process tree was
9
- // started through one of its six wrapped shell commands, so `josh latest` and
10
- // `pnpm josh latest` used to resolve different "newest release" answers. These functions
11
- // make the resolution deterministic: the policy comes from the repo-managed `pnpm-workspace.yaml`,
12
- // the publish timestamps from the registry, and the selection is a pure computation over both.
13
- // pnpm 12 reads its settings from `pnpm-workspace.yaml` — a `minimum-release-age` line in `.npmrc`
14
- // is ignored there, so reading it would report a window pnpm does not apply (kit#3267).
7
+ // The minimum-release-age quarantine, applied natively instead of inherited from safe-chain's
8
+ // interception. safe-chain filters the registry only when the process tree was started through one
9
+ // of its wrapped shell commands, so `josh latest` and `pnpm josh latest` would resolve different
10
+ // "newest release" answers. These functions make the resolution deterministic: the policy comes
11
+ // from the repo-managed `pnpm-workspace.yaml`, the publish timestamps from the registry, and the
12
+ // selection is a pure computation over both. pnpm 12 reads its settings from `pnpm-workspace.yaml`
13
+ // — a `minimum-release-age` line in `.npmrc` is ignored there, so reading it would report a window
14
+ // pnpm does not apply.
15
15
 
16
16
  const NO_QUARANTINE_MINUTES = 0
17
17
  const WORKSPACE_PATH = 'pnpm-workspace.yaml'
@@ -78,7 +78,7 @@ function is_eligible(
78
78
  // `major` pins the search to one major line — what `josh latest` needs, since corepack validates the
79
79
  // resolved pnpm version against `devEngines`. Pass `undefined` to search every major, which is what
80
80
  // an "is this installable at all" question wants: `pnpm add pkg@latest` resolves to the newest
81
- // permitted release regardless of major (joshuafolkken/kit#808).
81
+ // permitted release regardless of major.
82
82
  function select_aged_version(
83
83
  times: Record<string, string>,
84
84
  major: string | undefined,
@@ -112,7 +112,7 @@ function read_declared_minimum_release_age(workspace_path: string): number | und
112
112
  //
113
113
  // Deliberately not the upward walk below: `josh latest` resolves this against the working directory
114
114
  // it also writes `corepack use` into, and honouring an ancestor's policy there could freeze pnpm
115
- // bumps in a project that declares none (joshuafolkken/kit#808).
115
+ // bumps in a project that declares none.
116
116
  function read_minimum_release_age(workspace_path: string = WORKSPACE_PATH): number {
117
117
  return read_declared_minimum_release_age(workspace_path) ?? NO_QUARANTINE_MINUTES
118
118
  }
@@ -121,7 +121,7 @@ function read_minimum_release_age(workspace_path: string = WORKSPACE_PATH): numb
121
121
  //
122
122
  // This walks rather than reading one path because `josh version` and `josh latest` both run from
123
123
  // anywhere inside a project — and from outside one — so resolving against the working directory
124
- // alone would silently read "no quarantine" in every subdirectory (joshuafolkken/kit#808). pnpm
124
+ // alone would silently read "no quarantine" in every subdirectory. pnpm
125
125
  // finds its workspace root the same way, by walking up to the nearest `pnpm-workspace.yaml`.
126
126
  //
127
127
  // `boundary` stops the walk at a known root. Production passes none, while tests bound the search
@@ -5,7 +5,7 @@ import { release_age } from './release-age'
5
5
  // *unpinned* resolution, so anything resolved without an explicit version stops one or more releases
6
6
  // short of `latest`. Reporting that as a bare `⚠ → <latest>` is indistinguishable from an install the
7
7
  // user forgot to upgrade — and it recurs after every successful upgrade, because the newest release
8
- // is by definition the youngest (joshuafolkken/kit#808).
8
+ // is by definition the youngest.
9
9
  //
10
10
  // **The window binds unpinned resolution only.** Measured on pnpm 11.22.0 with
11
11
  // `minimumReleaseAge: 1440` and a release published 3.5 h earlier:
@@ -14,7 +14,7 @@ import { release_age } from './release-age'
14
14
  // pnpm add pkg -> 1.78.0 (the newest release past the window)
15
15
  //
16
16
  // So a pinned `Run:` hint always works and is never suppressed. What the window actually holds back
17
- // is peer resolution — the mechanism behind an upstream's effective install (joshuafolkken/kit#698),
17
+ // is peer resolution — the mechanism behind an upstream's effective install,
18
18
  // which is why this explanation is attached there and nowhere else.
19
19
 
20
20
  const MINUTES_PER_HOUR = 60
@@ -6,7 +6,7 @@ import { execaSync } from 'execa'
6
6
  const SAFE_CHAIN_PKG = '@aikidosec/safe-chain'
7
7
 
8
8
  // The registry's answer is trusted only as an exact semver version: it ends up in workflow files and
9
- // in the installer URL (joshuafolkken/kit#3266).
9
+ // in the installer URL.
10
10
  function fetch_latest_version(): string | undefined {
11
11
  const result = execaSync('npm', ['view', SAFE_CHAIN_PKG, 'version'], {
12
12
  reject: false,
@@ -18,8 +18,8 @@ function fetch_latest_version(): string | undefined {
18
18
  }
19
19
 
20
20
  // The hash-verified installer pinned in the workflows is the one place a safe-chain release is
21
- // recorded; `preinstall` no longer names one (joshuafolkken/kit#3269). Every repository moves the
22
- // files that carry the pin — app-kit's own `dast.yml` / `load.yml` included (joshuafolkken/kit#2830).
21
+ // recorded; `preinstall` no longer names one. Every repository moves the
22
+ // files that carry the pin — app-kit's own `dast.yml` / `load.yml` included.
23
23
  function sync(): void {
24
24
  const latest = fetch_latest_version()
25
25
 
@@ -29,8 +29,7 @@ interface VersionSnapshot {
29
29
  // What the local minimum-release-age policy permits an unpinned resolve to reach. Carried only on an
30
30
  // upstream report, because only the effective install is peer-resolved — every other target is
31
31
  // upgraded by an explicitly pinned command the window does not block. Optional throughout: a package
32
- // whose publish timestamps could not be read keeps exactly the report it had before
33
- // (joshuafolkken/kit#808).
32
+ // whose publish timestamps could not be read keeps exactly the report it had before.
34
33
  interface ReleaseHold {
35
34
  installable: string
36
35
  minimum_age_minutes: number
@@ -75,7 +74,7 @@ interface EffectiveUpgradeHint {
75
74
  // `installed_versions` is populated only when the consumer declared its global upgrade command
76
75
  // pin-only (`is_global_upgrade_command_pinned`). It lists the globally-resolved versions kit already
77
76
  // knows, so a command whose every pin is already installed can be proven dead and replaced with an
78
- // explanation instead of a `Run:` hint (#697). Absent, no command is ever suppressed.
77
+ // explanation instead of a `Run:` hint. Absent, no command is ever suppressed.
79
78
  interface UpstreamReport {
80
79
  config: PackageVersionConfig
81
80
  project_version: string | undefined
@@ -4,8 +4,7 @@ import { version_check_arguments } from './version-check-arguments'
4
4
  import { version_commands } from './version-commands'
5
5
 
6
6
  // `version` shows the installed versions; `version --upgrade` updates both the global and the project
7
- // @joshuafolkken/kit install. The upgrade was a separate `version:upgrade` command until
8
- // joshuafolkken/kit#1928 folded it into this flag, so the version surface is one command again.
7
+ // @joshuafolkken/kit install, so the version surface is one command.
9
8
  const UPGRADE_FLAG = '--upgrade'
10
9
  const ARGUMENT_OFFSET = 2
11
10
  const version_arguments = process.argv.slice(ARGUMENT_OFFSET)