@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,18 +1,18 @@
1
1
  import { GIT_LOCATION_VARIABLES } from '#scripts/git/git-location-environment'
2
2
 
3
3
  // The shell command a Claude Code hook is launched with, so it starts without a `pnpm` wrapper — and,
4
- // for a consumer, without the `dist/josh.js` dispatcher re-spawning `tsx` for the hook's `.ts`
5
- // (joshuafolkken/kit#2023). Each hook is pre-built to its own `dist/hooks/<name>.js`
4
+ // for a consumer, without the `dist/josh.js` dispatcher re-spawning `tsx` for the hook's `.ts`.
5
+ // Each hook is pre-built to its own `dist/hooks/<name>.js`
6
6
  // (`scripts/build/build-hooks.ts`) and launched directly with `node`.
7
7
  //
8
- // **The command starts from the project root, never from wherever the session happens to be**
9
- // (joshuafolkken/kit#2984). Every path after the prefix is relative, so a hook fired from a
8
+ // **The command starts from the project root, never from wherever the session happens to be**.
9
+ // Every path after the prefix is relative, so a hook fired from a
10
10
  // subdirectory would otherwise miss its script. The root is git's, resolved with the location
11
11
  // variables a git hook exports cleared first, and resolved with them only when that fails — git
12
12
  // metadata outside the work tree. The consumer rewrite (`hook-command-rewrite.ts`) keeps this prefix,
13
13
  // so both sides stay one mechanism for Claude Code and Codex alike.
14
14
  //
15
- // **Everything after the root is one script** (`scripts/hooks/run-hook.sh`, joshuafolkken/kit#3184):
15
+ // **Everything after the root is one script** (`scripts/hooks/run-hook.sh`):
16
16
  // clearing the location variables for the hook itself, the bundle-ready gate and the live-source
17
17
  // fallback live there once, so each hook command names only its hook.
18
18
 
@@ -7,6 +7,7 @@ import { init_logic } from './init-logic'
7
7
  import { package_path, PROJECT_ROOT } from './init-paths'
8
8
  import type { ProjectShape } from './project-profile'
9
9
  import { session_language_environment } from './session-language-environment'
10
+ import { vscode_tasks } from './vscode-tasks'
10
11
 
11
12
  const PRETTIER_CONFIG_JS = 'prettier.config.js'
12
13
  const BASIC_PRETTIER_CONFIG = 'prettier.config.mjs'
@@ -38,6 +39,17 @@ function build_action(destination: string, create: () => string, merge: MergeFun
38
39
  return { dest: destination, create, merge }
39
40
  }
40
41
 
42
+ function build_vscode_tasks_action(): FileAction {
43
+ const tasks_path = path.join('.vscode', vscode_tasks.VSCODE_TASKS_FILENAME)
44
+ const kit_tasks = vscode_tasks.read_kit_tasks(read_package_file(tasks_path))
45
+
46
+ return build_action(
47
+ tasks_path,
48
+ () => read_package_file(tasks_path),
49
+ (existing) => vscode_tasks.merge_tasks(existing, kit_tasks),
50
+ )
51
+ }
52
+
41
53
  function build_vscode_actions(): ReadonlyArray<FileAction> {
42
54
  const extensions_path = path.join('.vscode', init_logic.VSCODE_EXTENSIONS_FILENAME)
43
55
  const settings_path = path.join('.vscode', init_logic.get_vscode_settings_filename())
@@ -61,6 +73,7 @@ function build_vscode_actions(): ReadonlyArray<FileAction> {
61
73
  init_logic.strip_kit_only_vscode_settings_content(read_package_file(settings_path)),
62
74
  merge: (existing) => init_logic.merge_json_object(existing, settings_data),
63
75
  },
76
+ build_vscode_tasks_action(),
64
77
  ]
65
78
  }
66
79
 
@@ -33,7 +33,7 @@ const BASIC_AI_FILES = [
33
33
  SECURITY_MD,
34
34
  WORKSPACE_YAML,
35
35
  ]
36
- // A basic project gets its own template for these, not kit's development copy (joshuafolkken/kit#2693).
36
+ // A basic project gets its own template for these, not kit's development copy.
37
37
  const BASIC_SOURCES: Readonly<Record<string, string>> = {
38
38
  [PRETTIER_IGNORE]: 'templates/prettierignore.basic',
39
39
  [WORKSPACE_YAML]: 'templates/pnpm-workspace.basic.yaml',
@@ -68,8 +68,8 @@ function copy_ai_file(source_path: string, destination_path: string): void {
68
68
  // destination may hold a workflow the consumer wrote themselves, and a header claiming this package
69
69
  // owns it would hold every bump to it back on a false premise. But an unstamped workflow is not
70
70
  // merely out of date either — the consumer's auto-merge workflow reads the stamp, so until `sync`
71
- // writes one, a bump to a workflow this package does overwrite merges and the next sync reverts it
72
- // (joshuafolkken/kit#844). A warning is the honest middle: `sync` resolves it either way, and this
71
+ // writes one, a bump to a workflow this package does overwrite merges and the next sync reverts it.
72
+ // A warning is the honest middle: `sync` resolves it either way, and this
73
73
  // names the consequence rather than leaving it to be discovered from a revert.
74
74
  //
75
75
  // The destination is checked before the file is opened, and a read failure is stepped over, so
@@ -103,9 +103,9 @@ function did_skip_copy_if_absent(
103
103
  }
104
104
 
105
105
  // The merged file is written back, and reported as `updated`, only when the merge changed it — a
106
- // second `josh init` over an already-merged file reports `unchanged` (joshuafolkken/kit#2873).
106
+ // second `josh init` over an already-merged file reports `unchanged`.
107
107
  // The workspace template with the project's own `.npmrc` values carried over: once the file holds a
108
- // key, the merge keeps it, so this is the one chance to move the value (joshuafolkken/kit#3267).
108
+ // key, the merge keeps it, so this is the one chance to move the value.
109
109
  function read_workspace_template(source_path: string, destination_path: string): string {
110
110
  const npmrc = file_reader.read_file_or_empty(path.join(path.dirname(destination_path), '.npmrc'))
111
111
 
@@ -242,10 +242,10 @@ function did_skip_ai_directory_copy(directory_name: string): boolean {
242
242
 
243
243
  // `josh init` writes the one-line CLAUDE.md import when the consumer has none, and — like every other
244
244
  // AI file — leaves an existing one untouched so a consumer's additions are never disturbed. `josh sync`
245
- // is what ensures the import line on an existing file (sync.ts). CLAUDE.md is no longer byte-copied
246
- // (joshuafolkken/kit#1878), so it is handled here rather than through AI_COPY_FILES.
245
+ // is what ensures the import line on an existing file (sync.ts). CLAUDE.md is no longer byte-copied,
246
+ // so it is handled here rather than through AI_COPY_FILES.
247
247
  //
248
- // The one edit made to an existing file is the rules import written before joshuafolkken/kit#2829,
248
+ // The one edit made to an existing file is the rules import written under the static profile name,
249
249
  // moved onto the basic path — only that kit-written line, never the consumer's additions.
250
250
  // An unreadable file is left as it is and reported as skipped, as it was before the migration.
251
251
  function read_if_readable(destination_path: string): string | undefined {
@@ -271,8 +271,8 @@ function basic_claude_md(): string {
271
271
  }
272
272
 
273
273
  // A basic CLAUDE.md imports the basic rules alone: the full bootstrap and import are removed, a
274
- // pre-rename path is moved, and the basic header is restored when no basic import is left
275
- // (joshuafolkken/kit#2827). The project's own lines stay as they are.
274
+ // pre-rename path is moved, and the basic header is restored when no basic import is left.
275
+ // The project's own lines stay as they are.
276
276
  function ensure_basic_claude_md(existing: string | undefined): string {
277
277
  if (existing === undefined) return basic_claude_md()
278
278
  const kept = basic_path_migration.migrate_basic_paths(
@@ -303,7 +303,7 @@ function did_skip_claude_md_import(shape?: ProjectShape): boolean {
303
303
  }
304
304
 
305
305
  // Returns the repository name resolved for the Sonar config, so `josh init` can reuse it for the
306
- // security-updates report instead of spawning a second `gh repo view` (joshuafolkken/kit#805).
306
+ // security-updates report instead of spawning a second `gh repo view`.
307
307
  // Resolving it here rather than in the caller keeps every AI-file write ahead of the network call.
308
308
  function should_copy_git_file(filename: string, shape?: ProjectShape): boolean {
309
309
  if (shape?.has_git !== false) return true
@@ -10,7 +10,7 @@ const KIT_PACKAGE_NAME = '@joshuafolkken/kit'
10
10
  const NODE_MODULES = 'node_modules'
11
11
  const PACKAGE_JSON = 'package.json'
12
12
  // The basic template lists exactly the build scripts kit's own dependency tree carries, which is
13
- // what installing kit alone needs approved (joshuafolkken/kit#2785).
13
+ // what installing kit alone needs approved.
14
14
  const KIT_BUILDS_TEMPLATE = 'templates/pnpm-workspace.basic.yaml'
15
15
  const HANDOFF_FAILURE = 'josh init from the project-installed kit failed — see the output above'
16
16
  // Set on the handed-off run, so a kit that still does not find itself installed in the project — pnpm
@@ -29,7 +29,7 @@ function real_directory(directory: string): string | undefined {
29
29
 
30
30
  // A `pnpm dlx` (or global) run executes whatever kit its cache held, which may be days behind the
31
31
  // registry — and `init` pins the kit it runs as, so a stale cache used to leave its version and its
32
- // templates in the project for good (joshuafolkken/kit#2794). Only the kit the project itself installs
32
+ // templates in the project for good. Only the kit the project itself installs
33
33
  // does the setup. Compared by real path, so a global virtual store shared with the project still
34
34
  // reads as the project's own kit.
35
35
  function is_project_kit(package_directory: string, project_root: string): boolean {
@@ -75,7 +75,7 @@ function handoff_step(args: ReadonlyArray<string>): InstallStep {
75
75
  }
76
76
 
77
77
  // pnpm walks up to the nearest `package.json`, so without one here it installs kit into whatever
78
- // project an ancestor directory holds and rewrites that project's files (joshuafolkken/kit#2866).
78
+ // project an ancestor directory holds and rewrites that project's files.
79
79
  function ensure_project_manifest(project_root: string): void {
80
80
  const manifest_path = path.join(project_root, PACKAGE_JSON)
81
81
 
@@ -21,11 +21,11 @@ import { init_logic } from './init-logic'
21
21
  * managed-marker-logic.ts for why the stamp is on the file rather than in a list.
22
22
  *
23
23
  * The consumer's `.claude/settings.json` gets three further passes. The keys kit sets only for its
24
- * own sessions are removed (joshuafolkken/kit#3140, see claude-kit-only-settings.ts). The kit plugin's marketplace and
24
+ * own sessions are removed (see claude-kit-only-settings.ts). The kit plugin's marketplace and
25
25
  * `enabledPlugins` declaration is injected, because the skills that used to be copied now ship as the
26
- * `kit` plugin and load from that declaration (joshuafolkken/kit#1879). And its hook commands are
27
- * rewritten from `pnpm josh` to the published bundle invoked directly with node
28
- * (joshuafolkken/kit#1930), so a consumer's guarded call does not pay a `pnpm` launch it never needed.
26
+ * `kit` plugin and load from that declaration. And its hook commands are
27
+ * rewritten from `pnpm josh` to the published bundle invoked directly with node,
28
+ * so a consumer's guarded call does not pay a `pnpm` launch it never needed.
29
29
  * Keeping both on this one function is the same guarantee as the workflow passes — a copy path that
30
30
  * skipped the plugin block would ship a settings file that never enables the plugin, and one that
31
31
  * skipped the rewrite would leave every consumer hook slower than it has to be.
@@ -28,12 +28,11 @@ function read_extends_entries(content: string): ReadonlyArray<string> {
28
28
 
29
29
  // Ensure kit's tsconfig base preset is in `extends` — UNLESS an `@joshuafolkken/*` tsconfig preset
30
30
  // (kit's own base, or an app-kit / game-kit framework preset that already embeds kit base) is
31
- // present. Adding kit's base alongside such a preset is a redundant second extend. See
32
- // joshuafolkken/kit#660. The legacy `.jsonc` preset extension is migrated first: the presence check
33
- // below matches it too, so without the rewrite a consumer stuck on the old path would be reported
34
- // "already present" and never repaired. `base_directory` is the project root the `extends` paths
35
- // resolve against, which the migration needs to confirm the renamed preset is installed. See
36
- // joshuafolkken/kit#681.
31
+ // present. Adding kit's base alongside such a preset is a redundant second extend. The legacy
32
+ // `.jsonc` preset extension is migrated first: the presence check below matches it too, so without
33
+ // the rewrite a consumer stuck on the old path would be reported "already present" and never
34
+ // repaired. `base_directory` is the project root the `extends` paths resolve against, which the
35
+ // migration needs to confirm the renamed preset is installed.
37
36
  function merge_tsconfig_extends(content: string, entry: string, base_directory: string): string {
38
37
  const migrated = tsconfig_preset_migration.migrate_preset_paths(content, base_directory)
39
38
  if (kit_base_preset.is_tsconfig_base_present(read_extends_entries(migrated))) return migrated
@@ -68,7 +67,7 @@ const COMPILER_OPTIONS_FIELD = 'compilerOptions'
68
67
 
69
68
  // Prune the redundant options one at a time, in place. Setting `compilerOptions` to the kept subset
70
69
  // would be one edit instead of several, but it replaces the whole block and takes any comment the
71
- // consumer wrote inside it along with the options being dropped (joshuafolkken/kit#798). Each
70
+ // consumer wrote inside it along with the options being dropped. Each
72
71
  // removal re-reads the document, so the shifting offsets take care of themselves.
73
72
  function drop_redundant_options(content: string, redundant: ReadonlyArray<string>): string {
74
73
  let current = content
@@ -146,7 +145,6 @@ function missing_entries<T>(
146
145
  // `import` and tsconfig `extends` lists. Arrays and scalars stay untouched: combining a list such as
147
146
  // `eslint.validate` would be a guess about intent, and overwriting it would drop the consumer's own
148
147
  // entries. Without this, one customized key froze out every later kit addition inside it, silently.
149
- // See joshuafolkken/kit#691.
150
148
  function merge_owned_entries(current: unknown, update: unknown): unknown {
151
149
  const current_object = json_object_schema.safeParse(current)
152
150
  const update_object = json_object_schema.safeParse(update)
@@ -218,7 +216,7 @@ function merge_package_scripts(content: string, scripts: Record<string, string>)
218
216
  }
219
217
 
220
218
  // Replace only a safe-chain `preinstall` an earlier kit wrote, for a consumer that never re-runs
221
- // `josh init`; every other key and script is kept (joshuafolkken/kit#3269).
219
+ // `josh init`; every other key and script is kept.
222
220
  function upgrade_safe_chain_preinstall(content: string): string {
223
221
  const parsed = parse_jsonc(content)
224
222
  const raw = parsed['scripts']
@@ -75,7 +75,7 @@ function is_kit_written(key: string, value: string): boolean {
75
75
  }
76
76
 
77
77
  // A retired name alone does not make a script kit's: `sv create` writes its own `check`, which must
78
- // survive `josh init` (joshuafolkken/kit#3069). Only a value kit itself wrote is retired.
78
+ // survive `josh init`. Only a value kit itself wrote is retired.
79
79
  function is_retired_script(key: string, value: string): boolean {
80
80
  return RETIRED_MANAGED_SCRIPTS.has(key) && is_kit_written(key, value)
81
81
  }
@@ -113,7 +113,7 @@ function merge_eslint_config(existing: string): string {
113
113
  }
114
114
 
115
115
  // The default is SvelteKit's stylesheet, and prettier-plugin-tailwindcss aborts every format when
116
- // the named file is missing — so it is written only for a project that has it (joshuafolkken/kit#2710).
116
+ // the named file is missing — so it is written only for a project that has it.
117
117
  function detect_tailwind_stylesheet(project_root: string): string | undefined {
118
118
  return existsSync(path.join(project_root, DEFAULT_TAILWIND_STYLESHEET))
119
119
  ? DEFAULT_TAILWIND_STYLESHEET
@@ -45,7 +45,7 @@ function remove_deprecated_yaml_keys(content: string): string {
45
45
  // pnpm 11+ writes this placeholder into `allowBuilds` for every build script it ignored, and fails
46
46
  // every later install until it is answered. `pnpm add -D @joshuafolkken/kit` before `josh init`
47
47
  // leaves one for esbuild, and the key-level merge below keeps an existing `allowBuilds` whole, so a
48
- // placeholder the template decides is answered here (joshuafolkken/kit#2693).
48
+ // placeholder the template decides is answered here.
49
49
  const BUILD_PLACEHOLDER_PATTERN = /^([ \t]+)([^\s:#][^:#]*): set this to true or false$/gmu
50
50
  const TEMPLATE_BUILD_PATTERN = /^[ \t]+(?<key>[^\s:#][^:#]*):[ \t]*(?<value>true|false)\b/u
51
51
 
@@ -89,8 +89,8 @@ function build_entry_keys(block: string): Set<string> {
89
89
 
90
90
  // The key-level merge keeps an existing `allowBuilds` whole, and `pnpm add -D @joshuafolkken/kit`
91
91
  // before `josh init` always leaves one (esbuild's), so without this the template's other approvals
92
- // never landed and the first `pnpm install` failed on the next build script, e.g. unrs-resolver's
93
- // (joshuafolkken/kit#2710). Entries the project already answered keep their value.
92
+ // never landed and the first `pnpm install` failed on the next build script, e.g. unrs-resolver's.
93
+ // Entries the project already answered keep their value.
94
94
  // Only a block mapping can take appended entry lines; a flow map (`allowBuilds: { … }`) is left whole.
95
95
  const BLOCK_MAPPING_HEADER_PATTERN = /^allowBuilds:[ \t]*(?:#[^\n]*)?(?:\n|$)/u
96
96
  const LEADING_INDENT_PATTERN = /^[ \t]+/u
@@ -133,7 +133,7 @@ interface MovedNpmrcSetting {
133
133
 
134
134
  // `.npmrc` settings pnpm 12 reads only from `pnpm-workspace.yaml`, with the value shape each takes.
135
135
  // A project's own value (a longer age window, `engine-strict=false`) replaces the template's, so the
136
- // move neither loosens nor tightens what the project chose (joshuafolkken/kit#3267).
136
+ // move neither loosens nor tightens what the project chose.
137
137
  const MOVED_NPMRC_SETTINGS: ReadonlyArray<MovedNpmrcSetting> = [
138
138
  { npmrc_key: 'minimum-release-age', workspace_key: 'minimumReleaseAge', value_pattern: /^\d+$/u },
139
139
  { npmrc_key: 'engine-strict', workspace_key: 'engineStrict', value_pattern: /^(?:true|false)$/u },
@@ -23,7 +23,7 @@ function merge_yaml_list_entry(content: string, key: string, value: string): str
23
23
  // lefthook preset (kit's own, or an app-kit / game-kit framework preset that already extends kit
24
24
  // base) is present. Adding kit's `vanilla.yml` alongside such a preset would extend
25
25
  // `lefthook/base.yml` twice, which lefthook rejects with a hard "possible recursion in extends"
26
- // crash. See joshuafolkken/kit#660.
26
+ // crash.
27
27
  function merge_lefthook_extends(content: string, value: string): string {
28
28
  const entries = config_merge.read_yaml_list_field(content, LEFTHOOK_EXTENDS_FIELD)
29
29
  if (kit_base_preset.is_lefthook_base_present(entries)) return content
@@ -35,7 +35,7 @@ function merge_lefthook_extends(content: string, value: string): string {
35
35
  // preset (kit's own base, or an app-kit / game-kit framework preset that already imports kit's
36
36
  // cspell base) is present. Adding kit's base alongside such a preset is a redundant double import.
37
37
  // kit owns this dedup because there is no downstream overlay in kit's `josh sync` path — every
38
- // consumer drives the sync through kit's CLI, so the check must live here. See joshuafolkken/kit#660.
38
+ // consumer drives the sync through kit's CLI, so the check must live here.
39
39
  function merge_cspell_import(content: string, value: string): string {
40
40
  const entries = config_merge.read_yaml_list_field(content, CSPELL_IMPORT_FIELD)
41
41
  if (kit_base_preset.is_cspell_base_present(entries)) return content
@@ -11,12 +11,12 @@ import { init_logic_workspace } from './init-logic-workspace'
11
11
  import { init_logic_yaml_merge } from './init-logic-yaml-merge'
12
12
 
13
13
  const DEV_ENGINES_VALUE = {
14
- packageManager: { name: 'pnpm', version: '>=12.1.0', onFail: 'error' },
14
+ packageManager: { name: 'pnpm', version: '>=12.1.0', onFail: 'download' },
15
15
  }
16
16
 
17
17
  // The settings lines earlier kit releases wrote into a project `.npmrc`. pnpm 12 reads only registry
18
18
  // and auth settings from `.npmrc`, so all four are inert there: the age window and engine check now
19
- // live in `pnpm-workspace.yaml`, and `confirmModulesPurge` no longer exists (joshuafolkken/kit#3267).
19
+ // live in `pnpm-workspace.yaml`, and `confirmModulesPurge` no longer exists.
20
20
  const LEGACY_NPMRC_LINES: ReadonlySet<string> = new Set([
21
21
  'engine-strict=true',
22
22
  'minimum-release-age=1440',
@@ -43,7 +43,7 @@ const LEGACY_POSTINSTALL_KEY = 'postinstall'
43
43
  // both, so an install that left **zero** hooks in place still exited 0 and said nothing. The way it
44
44
  // happens in practice is `core.hooksPath` — lefthook refuses to install while any custom hooks path is
45
45
  // set — and the developer then commits and pushes for weeks with no pre-commit or pre-push check
46
- // running at all, believing they are (joshuafolkken/kit#1503).
46
+ // running at all, believing they are.
47
47
  //
48
48
  // **The `|| true` stays**: a consumer's `pnpm install` must not die over a developer-only hook, which
49
49
  // is what it was added for. What changes is that the failure is named on standard error. The warning
@@ -72,7 +72,7 @@ const PREPARE_CMD = `(${GUARDED_LEFTHOOK_CMD} || true) && (${GUARDED_FIX_GH_PACK
72
72
 
73
73
  // CLAUDE.md is deliberately absent: it is no longer byte-copied. A consumer's CLAUDE.md is a single
74
74
  // @import of kit's published, path-transformed rules (ensure_claude_md_import), so a package update
75
- // alone keeps it current (joshuafolkken/kit#1878). AGENTS.md / GEMINI.md / .cursorrules stay copies
75
+ // alone keeps it current. AGENTS.md / GEMINI.md / .cursorrules stay copies
76
76
  // here — they are for other tools that do not read CLAUDE.md's import.
77
77
  const AI_COPY_FILES: ReadonlyArray<string> = [
78
78
  'AGENTS.md',
@@ -92,11 +92,10 @@ const AI_COPY_FILES: ReadonlyArray<string> = [
92
92
  '.github/workflows/sonar-qube.yml',
93
93
  '.github/workflows/pr-classification.yml',
94
94
  // Called by `ci.yml` and `pr-classification.yml` as `uses: ./.github/actions/setup-pnpm`; without
95
- // it the consumer's jobs cannot resolve the action and their checks fail (joshuafolkken/kit#3013,
96
- // joshuafolkken/kit#3095).
95
+ // it the consumer's jobs cannot resolve the action and their checks fail.
97
96
  '.github/actions/setup-pnpm/action.yml',
98
97
  // The one place the workflows' Node.js version is written, called by every distributed workflow
99
- // that sets Node.js up (joshuafolkken/kit#3084).
98
+ // that sets Node.js up.
100
99
  '.github/actions/setup-node/action.yml',
101
100
  '.github/pull_request_template.md',
102
101
  '.github/release.yml',
@@ -119,19 +118,18 @@ const AI_COPY_FILE_MAPPINGS: ReadonlyArray<FileCopyMapping> = [
119
118
  { src: 'templates/workflows/ci.yml', dest: '.github/workflows/ci.yml' },
120
119
  // The counterpart to the distributed `.github/dependabot.yml`: without it a consumer receives
121
120
  // the machinery that opens Dependabot pull requests and none of the machinery that closes them,
122
- // so every github-actions bump sits green and unmerged (joshuafolkken/kit#834).
121
+ // so every github-actions bump sits green and unmerged.
123
122
  {
124
123
  src: 'templates/workflows/dependabot-auto-merge.yml',
125
124
  dest: '.github/workflows/dependabot-auto-merge.yml',
126
125
  },
127
126
  // A template rather than a copy of kit's own file: kit releases from its publish.yml, so the file
128
- // must not run in kit as well (joshuafolkken/kit#3007).
127
+ // must not run in kit as well.
129
128
  { src: 'templates/workflows/github-release.yml', dest: '.github/workflows/github-release.yml' },
130
129
  ]
131
130
 
132
- // Empty since joshuafolkken/kit#1879: the five skill directories kit used to copy whole
133
- // (`workflow-commands`, `epic-commands`, `dependency-update`, `verify-ui`, `diag`) now ship as the
134
- // `kit` Claude Code plugin and load from the package, so nothing is copied into a consumer's tree.
131
+ // Empty: kit's skill directories ship as the `kit` Claude Code plugin and load from the package, so
132
+ // nothing is copied into a consumer's tree.
135
133
  // The copy-and-transform machinery (directory-copy-guard.ts → transform_copied_tree) is kept intact
136
134
  // for any future distributed directory; the migration that removes a consumer's stale skill copies
137
135
  // lives in `scripts/sync/skill-migration.ts`.
@@ -143,7 +141,7 @@ const LEFTHOOK_EXTENDS = 'node_modules/@joshuafolkken/kit/lefthook/vanilla.yml'
143
141
  // `extends` entry that does not already end in it, then hard-throws when the resulting path is
144
142
  // missing — so a `.jsonc` preset resolves to `*.jsonc.json` and takes down the whole E2E suite
145
143
  // before a single test runs. A tsconfig is parsed as JSONC regardless of extension, so comments in
146
- // the preset still work. See joshuafolkken/kit#681.
144
+ // the preset still work.
147
145
  const TSCONFIG_EXTENDS = './node_modules/@joshuafolkken/kit/tsconfig/base.json'
148
146
 
149
147
  // Preset file basename within the package's tsconfig/ directory, used to read the base
@@ -159,7 +157,7 @@ const TSCONFIG_EXCLUDE_FIELD = 'exclude'
159
157
  // config for. The two directories must stay disjoint (Playwright refuses an html output folder nested
160
158
  // in the tests output folder, and vice versa), so both are excluded rather than consolidated. These
161
159
  // belong in the CONSUMER file: a consumer `exclude` overrides the extended preset's instead of merging
162
- // with it, so shipping them only in a preset would have no effect. See joshuafolkken/kit#712.
160
+ // with it, so shipping them only in a preset would have no effect.
163
161
  const TSCONFIG_GENERATED_OUTPUT_EXCLUDE: ReadonlyArray<string> = [
164
162
  'node_modules',
165
163
  'build',
@@ -186,10 +184,10 @@ const TSCONFIG_GENERATED_OUTPUT_EXCLUDE: ReadonlyArray<string> = [
186
184
  // `node_modules` above already covers it.
187
185
  //
188
186
  // Limit: these are the DEFAULT paths. A project that moves the worker with `kit.files.serviceWorker`
189
- // in `svelte.config.js` gets globs that match nothing, and its real exclusion is still replaced — the
190
- // #796 failure, unfixed for that shape. Covering it means reading `svelte.config.js`, which is the
191
- // same project detection kit does not have; such a project should add its own path to `exclude`
192
- // (the merge appends, so a hand-added entry survives). See joshuafolkken/kit#796.
187
+ // in `svelte.config.js` gets globs that match nothing, and its real exclusion is still replaced.
188
+ // Covering it means reading `svelte.config.js`, which is the same project detection kit does not
189
+ // have; such a project should add its own path to `exclude` (the merge appends, so a hand-added entry
190
+ // survives).
193
191
  const TSCONFIG_SVELTEKIT_EXCLUDE: ReadonlyArray<string> = [
194
192
  'src/service-worker.js',
195
193
  'src/service-worker/**/*.js',
@@ -226,7 +224,7 @@ const SUGGESTED_SCRIPTS_COMMON: Record<string, string> = {
226
224
  // they fit within printWidth, one element per line once they do not — so the file kit writes is
227
225
  // `prettier --check`-clean in the consumer whatever the entry count happens to be (#660).
228
226
  // TypeScript 6 defaults `types` to `[]`, so a full project sees no `process` global — not even in the
229
- // generated `playwright.config.ts` — until the Node types are named (joshuafolkken/kit#2710).
227
+ // generated `playwright.config.ts` — until the Node types are named.
230
228
  function generate_tsconfig(): string {
231
229
  return json_format.format_json({
232
230
  extends: TSCONFIG_EXTENDS,
@@ -378,9 +376,8 @@ function get_suggested_scripts_for_content(content: string): Record<string, stri
378
376
 
379
377
  // **The upgrade path for projects `josh init` has already run in.** Their `prepare` carries the
380
378
  // fix-gh-packages marker, and that marker is exactly what makes both merges here return early — so
381
- // the population joshuafolkken/kit#1503 is actually about, the consumers already installing with zero
382
- // hooks and no warning, would never receive the fix however often they re-ran `josh init`; only new
383
- // projects would. This rewrites the lefthook clause kit itself wrote and nothing else, because the
379
+ // the consumers already installing with zero hooks and no warning would never receive the fix
380
+ // however often they re-ran `josh init`; only new projects would. This rewrites the lefthook clause kit itself wrote and nothing else, because the
384
381
  // rest of that script is the consumer's. It is idempotent by construction: the new clause does not
385
382
  // contain the old one as a substring, since `{ ` sits between them.
386
383
  function upgrade_prepare_lefthook_warning(content: string): string {
@@ -25,6 +25,7 @@ import { init_logic } from './init-logic'
25
25
  import { PACKAGE_DIR, PROJECT_ROOT } from './init-paths'
26
26
  import { kit_development_versions } from './kit-development-versions'
27
27
  import { kit_setup_state } from './kit-setup-state'
28
+ import { package_manager_pin } from './package-manager-pin'
28
29
  import { project_profile, type ProjectProfile, type ProjectShape } from './project-profile'
29
30
 
30
31
  const PACKAGE_JSON = 'package.json'
@@ -52,7 +53,10 @@ function resolve_kit_package_manager(manifest: unknown): string | undefined {
52
53
  }
53
54
 
54
55
  function get_kit_package_manager(): string | undefined {
55
- return resolve_kit_package_manager(init_actions.read_package_json(PACKAGE_JSON))
56
+ return package_manager_pin.choose(
57
+ resolve_kit_package_manager(init_actions.read_package_json(PACKAGE_JSON)),
58
+ process.env['npm_config_user_agent'],
59
+ )
56
60
  }
57
61
 
58
62
  function get_kit_development_engines(): Record<string, unknown> {
@@ -70,7 +74,7 @@ function get_kit_self_dependency(): Record<string, string> {
70
74
  // Each config `init` generates runs a CLI or imports types the consumer has to resolve itself:
71
75
  // `cspell.config.yaml` → cspell, `playwright.config.ts` → @types/node, `lefthook.yml` → lefthook.
72
76
  // Prettier, its preset plugins and @playwright/test come in as peers. Without them the first
73
- // `josh gate` after `pnpm install` fails (joshuafolkken/kit#2710).
77
+ // `josh gate` after `pnpm install` fails.
74
78
  const TOOL_DEVELOPMENT_DEPENDENCIES = ['cspell', '@types/node']
75
79
  const LEFTHOOK_DEVELOPMENT_DEPENDENCY = 'lefthook'
76
80
 
@@ -199,7 +203,7 @@ function run_config_file_actions(shape: ProjectShape): void {
199
203
  }
200
204
 
201
205
  // Gated, unlike `sync`: `init` skips a file the consumer already has, so neither the npm-disable
202
- // (joshuafolkken/kit#803) nor the auto-merge workflow (joshuafolkken/kit#834) may have landed, and a
206
+ // nor the auto-merge workflow may have landed, and a
203
207
  // report's claim would then be false. `sync` overwrites both unconditionally, which is why it needs
204
208
  // no gate. The gates are the artifacts themselves, so a consumer's own pre-existing auto-merge
205
209
  // workflow still gets its prerequisite reported — it needs the same repository setting kit's does.
@@ -215,8 +219,8 @@ function report_repository_settings(name_with_owner: string | undefined): void {
215
219
 
216
220
  // The same refusal `sync` makes, for a larger blast radius: `init` calls the `sync` writers directly
217
221
  // rather than through `sync`'s own `main()`, so the guard there never ran for it — and on top of the
218
- // 14 files #868 reproduced, `init` also rewrites `package.json` scripts and devDependencies
219
- // (joshuafolkken/kit#879). Checked before the first write, for the reason the sync guard is.
222
+ // 14 files #868 reproduced, `init` also rewrites `package.json` scripts and devDependencies.
223
+ // Checked before the first write, for the reason the sync guard is.
220
224
  function run_ai_file_actions(shape: ProjectShape): void {
221
225
  console.info('\nAI files:')
222
226
  // `init` writes the same npm-disabling `.github/dependabot.yml` that `sync` distributes, so a
@@ -242,7 +246,7 @@ function initialize_project(shape: ProjectShape): void {
242
246
  }
243
247
 
244
248
  // A tool `init` just listed is absent until the user installs it — and `josh lint` then fails on it
245
- // rather than skipping it (joshuafolkken/kit#2709). Saying so is what tells the user the next step.
249
+ // rather than skipping it. Saying so is what tells the user the next step.
246
250
  function report_manual_install(shape: ProjectShape): void {
247
251
  console.info(`\nDependencies:\n ${INSTALL_HINT}`)
248
252
  if (shape.has_git && shape.profile === 'full') install_lefthook()
@@ -262,7 +266,7 @@ function finish_dependencies(shape: ProjectShape, is_install: boolean): void {
262
266
  }
263
267
 
264
268
  // A kit run from outside the project — `pnpm dlx`, a global install — sets nothing up itself: it
265
- // installs the project's kit and hands the whole run to that one (joshuafolkken/kit#2794). Under
269
+ // installs the project's kit and hands the whole run to that one. Under
266
270
  // `--no-install` nothing is installed, so the running kit does the setup as before.
267
271
  function did_hand_off(args: ReadonlyArray<string>): boolean {
268
272
  if (init_bootstrap.is_project_kit(PACKAGE_DIR, PROJECT_ROOT)) return false
@@ -296,7 +300,7 @@ function main(args: ReadonlyArray<string> = []): boolean {
296
300
  }
297
301
 
298
302
  // Only the command a person typed points onward to `josh start`: `josh start` calls `main` itself and
299
- // is already the next step (joshuafolkken/kit#2816).
303
+ // is already the next step.
300
304
  // A setup that failed after writing, such as a failed install, sets the exit code and points nowhere.
301
305
  function print_start_hint(): void {
302
306
  if (process.exitCode !== undefined && process.exitCode !== 0) return
@@ -25,7 +25,7 @@ const KIT_TSCONFIG_PRESET = /@joshuafolkken\/[^/]+\/tsconfig\//u
25
25
  // this segment-anchored fallback covers the prefix-less relative form. The `(?<![\w-])` /
26
26
  // `(?![\w-])` boundaries anchor `sveltekit` to a complete path segment — mirroring app-kit's
27
27
  // config-patch anchoring — so a `sveltekit-*` / `*-sveltekit` sibling and hyphenated `svelte-kit`
28
- // are left untouched. See joshuafolkken/kit#664.
28
+ // are left untouched.
29
29
  const SVELTEKIT_PRESET = /(?<![\w-])sveltekit(?![\w-])/u
30
30
 
31
31
  function has_match(entries: ReadonlyArray<string>, pattern: RegExp): boolean {
@@ -5,7 +5,7 @@ const START_HINT =
5
5
  'To use the GitHub Issue workflow, run pnpm exec josh start next: it puts this setup on GitHub, through a pull request when main already has commits.'
6
6
 
7
7
  // Whether the commit checked out records kit in its manifest — the sign that kit's setup has already
8
- // reached the branch, so `josh start` has no setup pull request to open (joshuafolkken/kit#2816).
8
+ // reached the branch, so `josh start` has no setup pull request to open.
9
9
  function is_kit_committed(root: string): boolean {
10
10
  // `./` resolves the path from `root` rather than from the repository's top level.
11
11
  const manifest = start_exec.git_read(['show', 'HEAD:./package.json'], root)
@@ -20,8 +20,7 @@ const SETUP_ONLY_PATHS: ReadonlySet<string> = new Set([
20
20
  ])
21
21
 
22
22
  // Whether a changed path is one kit's setup wrote — what the setup pull request of `josh start`
23
- // carries, so a file the user keeps beside it (notes, an editor's own directory) never rides along
24
- // (joshuafolkken/kit#2816).
23
+ // carries, so a file the user keeps beside it (notes, an editor's own directory) never rides along.
25
24
  function is_kit_written(file_path: string): boolean {
26
25
  return SETUP_ONLY_PATHS.has(file_path) || managed_config_scope.has_managed_path([file_path])
27
26
  }
@@ -0,0 +1,35 @@
1
+ import { package_manager_version } from '#scripts/version/package-manager-version'
2
+ import semver from 'semver'
3
+
4
+ // pnpm sets `npm_config_user_agent` to `pnpm/<version> npm/? node/<version> <platform> <arch>` for
5
+ // every script and `pnpm exec` it runs, so the pnpm that invoked `josh init` is readable from it.
6
+ const PNPM_USER_AGENT_REGEX = /^pnpm\/(\S+)/u
7
+
8
+ function running_pnpm_version(user_agent = ''): string | undefined {
9
+ const version = PNPM_USER_AGENT_REGEX.exec(user_agent)?.[1]
10
+
11
+ return version === undefined ? undefined : (semver.valid(version) ?? undefined)
12
+ }
13
+
14
+ function is_older_than(kit_pin: string, version: string): boolean {
15
+ const kit_version = semver.valid(package_manager_version.extract_pnpm_pin(kit_pin) ?? '')
16
+
17
+ return kit_version !== null && semver.lt(kit_version, version)
18
+ }
19
+
20
+ // Never pin a project below the pnpm installing it: the lockfile that pnpm just wrote can name a
21
+ // version an older pnpm fails to resolve, so `pnpm install` under kit's older pin breaks the
22
+ // first `josh init`. The kit pin keeps its integrity suffix when it wins.
23
+ function choose(kit_pin: string | undefined, user_agent: string | undefined): string | undefined {
24
+ const running = running_pnpm_version(user_agent)
25
+ if (kit_pin === undefined || running === undefined) return kit_pin
26
+
27
+ return is_older_than(kit_pin, running) ? `pnpm@${running}` : kit_pin
28
+ }
29
+
30
+ const package_manager_pin = {
31
+ running_pnpm_version,
32
+ choose,
33
+ }
34
+
35
+ export { package_manager_pin }
@@ -3,7 +3,7 @@ import { fileURLToPath } from 'node:url'
3
3
  import { project_profile } from './project-profile'
4
4
 
5
5
  const ARGUMENT_START_INDEX = 2
6
- // A `ci.yml` synced before joshuafolkken/kit#2829 matches `*'profile: static ('*` on this output to
6
+ // A `ci.yml` synced before the profile rename matches `*'profile: static ('*` on this output to
7
7
  // hand a basic project to `josh gate`. A consumer can upgrade kit without re-syncing that workflow,
8
8
  // so a basic project keeps printing the old phrase on a line of its own until every workflow reads
9
9
  // the new name.
@@ -23,7 +23,7 @@ const IGNORED_DIRECTORIES = new Set(['.git', 'node_modules', 'dist', 'build', '.
23
23
  const WEB_EXTENSIONS = new Set(['.html', '.css', '.js', '.jsx', '.mjs', '.cjs'])
24
24
  const TYPESCRIPT_EXTENSIONS = new Set(['.ts', '.tsx'])
25
25
  const PROFILE_ARG_LENGTH = 2
26
- // The names before joshuafolkken/kit#2829. A project that recorded one, or a script that passes one
26
+ // The names before the profile rename. A project that recorded one, or a script that passes one
27
27
  // to `--profile`, keeps working: each reads as the profile it was renamed to.
28
28
  const PROFILE_NAMES: Readonly<Record<string, ProjectProfile>> = {
29
29
  basic: 'basic',
@@ -39,7 +39,7 @@ function parse_profile(value: unknown): ProjectProfile | undefined {
39
39
  }
40
40
 
41
41
  // The pre-rename name of each profile, which every kit with `--profile` accepts — the new one only
42
- // from joshuafolkken/kit#2829 on.
42
+ // from the rename on.
43
43
  const LEGACY_NAMES: Readonly<Record<ProjectProfile, string>> = { basic: 'static', full: 'node' }
44
44
 
45
45
  // A `josh init` handed to the project's kit may run an older kit than the one handing off: the
@@ -91,7 +91,7 @@ function has_build_script(value: unknown): boolean {
91
91
 
92
92
  // kit itself is not evidence of a Node toolchain: `pnpm add -D @joshuafolkken/kit` before
93
93
  // `josh init` is the documented order, and it must still leave an `index.html` site on the basic
94
- // profile (joshuafolkken/kit#2693).
94
+ // profile.
95
95
  function has_project_dependencies(value: unknown): boolean {
96
96
  if (!json_value.is_record(value)) return false
97
97
 
@@ -1,5 +1,5 @@
1
1
  // `josh init` seeds `JOSH_SESSION_LANG` in `.env` from the OS locale, so a newly adopting user starts
2
- // in their own language (joshuafolkken/kit#2818). A project already using kit keeps its language: the
2
+ // in their own language. A project already using kit keeps its language: the
3
3
  // session language takes effect only through the `session:lang` hook, so a project whose
4
4
  // `.claude/settings.json` already wires it is left alone, and an existing `.env` value — the `export`
5
5
  // form included — is never touched. The unset default stays `ja`.
@@ -9,10 +9,9 @@ import type { Visibility } from './start-plan'
9
9
  // step and the `josh init` hint so none of them keeps a copy of its own.
10
10
  //
11
11
  // The git shapes below act on `root`, so `cwd` has to mean it: an inherited `GIT_DIR` and friends beat `cwd`
12
- // and would carry a `git init` or commit into whichever repository a calling hook was firing in
13
- // (joshuafolkken/kit#3151).
12
+ // and would carry a `git init` or commit into whichever repository a calling hook was firing in.
14
13
  //
15
- // **Every git and gh call here is bounded** (joshuafolkken/kit#3262). A read asks the local
14
+ // **Every git and gh call here is bounded**. A read asks the local
16
15
  // repository and takes git's own budget. A write — and `gh repo create --push` — can fire the
17
16
  // project's own commit and push hooks, which may run its whole suite, so it takes the suite budget:
18
17
  // long enough for that, short enough that a push that never answers ends the run.
@@ -42,7 +41,7 @@ function git_run(args: ReadonlyArray<string>, root: string): void {
42
41
  }
43
42
 
44
43
  // Every gh spawn here dials GitHub directly, past a scanner's loopback proxy, the same as every
45
- // other `gh` spawn under scripts/ (joshuafolkken/kit#2436). Each argument list is written inline so
44
+ // other `gh` spawn under scripts/. Each argument list is written inline so
46
45
  // `gh-subcommand-guard.ts` reads its subcommand rather than `<dynamic>`.
47
46
  interface GhProbeOptions {
48
47
  cwd: string