@joshuafolkken/kit 1.1784.0 → 1.2114.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 (690) hide show
  1. package/.claude/agents/reviewer-verification.md +19 -0
  2. package/.claude/agents/reviewer.md +19 -0
  3. package/.claude/settings.json +5 -6
  4. package/.claude/skills/dependency-update/SKILL.md +9 -10
  5. package/.claude/skills/workflow-commands/SKILL.md +6 -6
  6. package/.claude/skills/workflow-commands/background-commands.md +8 -5
  7. package/.claude/skills/workflow-commands/backlogrun-child.md +3 -1
  8. package/.claude/skills/workflow-commands/backlogrun-lanes.md +1 -1
  9. package/.claude/skills/workflow-commands/backlogrun-park.md +5 -2
  10. package/.claude/skills/workflow-commands/backlogrun-progress.md +2 -3
  11. package/.claude/skills/workflow-commands/backlogrun-recovery.md +1 -1
  12. package/.claude/skills/workflow-commands/backlogrun-steps.md +3 -2
  13. package/.claude/skills/workflow-commands/backlogrun.md +1 -1
  14. package/.claude/skills/workflow-commands/chain-rule.md +41 -32
  15. package/.claude/skills/workflow-commands/delegation.md +6 -6
  16. package/.claude/skills/workflow-commands/entry-sequence.md +2 -2
  17. package/.claude/skills/workflow-commands/followup.md +7 -5
  18. package/.claude/skills/workflow-commands/fullrun-steps.md +6 -6
  19. package/.claude/skills/workflow-commands/fullrun.md +1 -1
  20. package/.claude/skills/workflow-commands/issue-comments.md +9 -4
  21. package/.claude/skills/workflow-commands/issue-fold-existing.md +2 -1
  22. package/.claude/skills/workflow-commands/kickoff.md +2 -2
  23. package/.claude/skills/workflow-commands/observation-filing.md +1 -1
  24. package/.claude/skills/workflow-commands/observation-ledger.md +6 -4
  25. package/.claude/skills/workflow-commands/pre-gate-cut.md +9 -7
  26. package/.claude/skills/workflow-commands/prerequisite.md +3 -2
  27. package/.claude/skills/workflow-commands/retrospective.md +2 -2
  28. package/.claude/skills/workflow-commands/split-assessment.md +7 -5
  29. package/.codex/hooks.json +5 -5
  30. package/.github/actions/setup-pnpm/action.yml +9 -16
  31. package/.github/dependabot.yml +16 -0
  32. package/.github/workflows/auto-tag.yml +45 -0
  33. package/.github/workflows/ci.yml +155 -15
  34. package/.github/workflows/dependabot-auto-merge.yml +63 -4
  35. package/.github/workflows/production.yml +8 -0
  36. package/.github/workflows/publish.yml +59 -45
  37. package/.vscode/settings.json +19 -0
  38. package/CLAUDE.md +5 -12
  39. package/SECURITY.md +2 -2
  40. package/dist/CLAUDE.md +5 -12
  41. package/dist/commands/document-read-cli.js +2 -1
  42. package/dist/commands/document-section-main.js +2 -1
  43. package/dist/commands/read-set-cli.js +194 -134
  44. package/dist/commands/run-prep-main.js +9694 -10173
  45. package/dist/commands/run-step-cli.js +22138 -18285
  46. package/dist/hooks/audit-provision.js +23 -5
  47. package/dist/hooks/chunk-3GKE653K.js +6204 -0
  48. package/dist/hooks/chunk-45CJJOO7.js +1243 -0
  49. package/dist/hooks/{chunk-CWMBGKYW.js → chunk-5PM2JRGV.js} +2153 -856
  50. package/dist/hooks/{chunk-WR2KQAYZ.js → chunk-7SIUNQXK.js} +1207 -1470
  51. package/dist/hooks/{chunk-O2YBIDSI.js → chunk-CQD4LJE6.js} +1682 -1130
  52. package/dist/hooks/{chunk-VWWCFGWK.js → chunk-OPSRGWFU.js} +1 -1
  53. package/dist/hooks/{chunk-XGBNSWEI.js → chunk-UJ3FPMMM.js} +132 -49
  54. package/dist/hooks/chunk-VVNYJWEI.js +30 -0
  55. package/dist/hooks/chunk-Z6DQJKH3.js +2806 -0
  56. package/dist/hooks/codex-hook-adapter.js +8 -8
  57. package/dist/hooks/format-edited.js +4 -5
  58. package/dist/hooks/inputs.json +415 -389
  59. package/dist/hooks/pretool-guard.js +7 -6
  60. package/dist/hooks/session-lang.js +101 -258
  61. package/dist/hooks/stop-guard.js +1744 -2576
  62. package/dist/josh.js +7133 -6368
  63. package/dist/version/index.js +161 -1
  64. package/eslint/rules/comment-why-only.js +108 -0
  65. package/package.json +15 -8
  66. package/prompts/coding-standards.md +1 -1
  67. package/prompts/collaboration-workflow/file-edits.md +14 -11
  68. package/prompts/collaboration-workflow/issue-citation.md +0 -4
  69. package/prompts/collaboration-workflow/issue-template.md +40 -21
  70. package/prompts/collaboration-workflow/lane-instructions.md +3 -1
  71. package/prompts/collaboration-workflow/measurement.md +8 -1
  72. package/prompts/collaboration-workflow/operating-rules.md +11 -2
  73. package/prompts/collaboration-workflow/output-bounds.md +6 -2
  74. package/prompts/collaboration-workflow/plan-comment.md +1 -1
  75. package/prompts/collaboration-workflow/principles.md +9 -0
  76. package/prompts/collaboration-workflow/residency.md +3 -2
  77. package/prompts/collaboration-workflow/rule-delivery.md +13 -1
  78. package/prompts/collaboration-workflow/upstream-interrupt.md +2 -2
  79. package/prompts/collaboration-workflow/wip-cap.md +3 -1
  80. package/prompts/review-rubric.md +8 -0
  81. package/prompts/review.md +31 -22
  82. package/prompts/testing-guide.md +1 -0
  83. package/scripts/agent/agent-argv.ts +14 -16
  84. package/scripts/agent/agent-provider.ts +138 -0
  85. package/scripts/agent/agent-role-profile.ts +108 -156
  86. package/scripts/agent/agent-safe-text.ts +20 -5
  87. package/scripts/agent/api-usage-limit.ts +65 -0
  88. package/scripts/agent/claude-agent-argv.ts +19 -9
  89. package/scripts/agent/codex-agent-argv.ts +118 -22
  90. package/scripts/agent/usage-limit-reset.ts +179 -0
  91. package/scripts/auth/claude-token-output.ts +2 -2
  92. package/scripts/auto-ok/auto-ok-author.ts +53 -0
  93. package/scripts/auto-ok/auto-ok-cli.ts +20 -9
  94. package/scripts/backlog/backlog-defect-priority.ts +1 -1
  95. package/scripts/backlog/backlog-drive-cli.ts +6 -1
  96. package/scripts/backlog/backlog-drive-hold.ts +3 -3
  97. package/scripts/backlog/backlog-drive-idle.ts +10 -0
  98. package/scripts/backlog/backlog-drive-launch-pass.ts +90 -0
  99. package/scripts/backlog/backlog-drive-launch.ts +8 -2
  100. package/scripts/backlog/backlog-drive-named-offer.ts +73 -30
  101. package/scripts/backlog/backlog-drive-named.ts +28 -7
  102. package/scripts/backlog/backlog-drive-paused.ts +5 -4
  103. package/scripts/backlog/backlog-drive-restore.ts +11 -3
  104. package/scripts/backlog/backlog-drive.ts +21 -60
  105. package/scripts/backlog/backlog-gate-scope.ts +61 -0
  106. package/scripts/backlog/backlog-measure-close.ts +112 -0
  107. package/scripts/backlog/backlog-next.ts +39 -49
  108. package/scripts/backlog/backlog-occupied.ts +2 -2
  109. package/scripts/backlog/backlog-overlap.ts +42 -8
  110. package/scripts/backlog/backlog-plan-cli.ts +4 -1
  111. package/scripts/backlog/backlog-plan-comment.ts +81 -0
  112. package/scripts/backlog/backlog-plan-read.ts +19 -6
  113. package/scripts/backlog/backlog-pool.ts +50 -12
  114. package/scripts/backlog/backlog-rank.ts +60 -13
  115. package/scripts/backlog/backlog-stalled-detect.ts +2 -1
  116. package/scripts/backlog/backlog-waves.ts +17 -2
  117. package/scripts/backlog/backlogrun-launch.ts +7 -4
  118. package/scripts/cost-runtime/context-cut-payback.ts +27 -25
  119. package/scripts/cost-runtime/cost-cli.ts +37 -16
  120. package/scripts/cost-runtime/cost-pricing.ts +9 -0
  121. package/scripts/cost-runtime/cost-verdict.ts +4 -1
  122. package/scripts/delegation/delegation-policy.ts +2 -2
  123. package/scripts/delegation/duplicate-read-guard.ts +1 -0
  124. package/scripts/delegation/investigation-guard.ts +14 -2
  125. package/scripts/delegation/investigation-reads.ts +45 -23
  126. package/scripts/dependabot/dependabot-cooldown.ts +3 -2
  127. package/scripts/discovery/repo-party.ts +80 -20
  128. package/scripts/discovery/session-owner-pin.ts +51 -0
  129. package/scripts/document/capped-print.ts +1 -1
  130. package/scripts/document/command-reference-line-budget.ts +42 -0
  131. package/scripts/document/document-byte-budget.ts +17 -7
  132. package/scripts/document/document-checks.ts +20 -0
  133. package/scripts/document/document-ratchet-check.ts +101 -0
  134. package/scripts/document/document-section.ts +1 -0
  135. package/scripts/document/entry-read-budget.ts +7 -3
  136. package/scripts/document/issue-citation-budget.ts +94 -0
  137. package/scripts/epic/epic-cli-argv.ts +2 -2
  138. package/scripts/epic/epic-fetch.ts +4 -2
  139. package/scripts/epic/epic-graph.ts +7 -2
  140. package/scripts/epic/epic-issue.ts +3 -1
  141. package/scripts/epic/epic-rank.ts +5 -0
  142. package/scripts/exports/unused-members-check.ts +62 -0
  143. package/scripts/exports/unused-members-cli.ts +6 -51
  144. package/scripts/followup/followup-ci-path.ts +67 -0
  145. package/scripts/followup/followup-coderabbit-retrigger.ts +261 -0
  146. package/scripts/followup/followup-coderabbit-wait.ts +13 -10
  147. package/scripts/followup/followup-failed-tests.ts +160 -0
  148. package/scripts/followup/followup-job-needs.ts +100 -0
  149. package/scripts/followup/followup-job-rerun.ts +303 -0
  150. package/scripts/followup/followup-main-move.ts +113 -0
  151. package/scripts/followup/git-followup-finish.ts +43 -11
  152. package/scripts/followup/git-followup-pending.ts +3 -3
  153. package/scripts/followup/git-followup-stages.ts +41 -11
  154. package/scripts/followup/git-pr-followup-checks.ts +55 -16
  155. package/scripts/followup/git-pr-followup-wrapup.ts +24 -5
  156. package/scripts/followup/git-pr-followup.ts +62 -27
  157. package/scripts/fresh-machine/fresh-machine-script.ts +5 -9
  158. package/scripts/fresh-machine/specs/kit-test-backlogrun-python.json +2 -2
  159. package/scripts/fresh-machine/specs/kit-test-backlogrun.json +2 -2
  160. package/scripts/gate/busy-average.ts +34 -2
  161. package/scripts/gate/check-related-pinned.ts +43 -0
  162. package/scripts/gate/check-related-reuse.ts +64 -0
  163. package/scripts/gate/check-related-section.ts +57 -0
  164. package/scripts/gate/check-related-unplanned.ts +34 -0
  165. package/scripts/gate/check-related.ts +265 -0
  166. package/scripts/gate/command-memory.ts +1 -1
  167. package/scripts/gate/core-admission.ts +24 -6
  168. package/scripts/gate/core-budget-timing.ts +20 -6
  169. package/scripts/gate/core-budget.ts +40 -11
  170. package/scripts/gate/core-wait-record.ts +3 -2
  171. package/scripts/gate/core-wait.ts +25 -2
  172. package/scripts/gate/core-weights.ts +15 -7
  173. package/scripts/gate/gate-labels.ts +46 -0
  174. package/scripts/gate/gate-ledger.ts +14 -6
  175. package/scripts/gate/gate-plan.ts +103 -58
  176. package/scripts/gate/gate-report.ts +9 -7
  177. package/scripts/gate/gate-run-steps.ts +26 -3
  178. package/scripts/gate/gate-skip.ts +45 -6
  179. package/scripts/gate/gate-static-group.ts +60 -0
  180. package/scripts/gate/gate-steps.ts +2 -1
  181. package/scripts/gate/gate-tree.ts +4 -2
  182. package/scripts/gate/hook-gate-reuse.ts +19 -2
  183. package/scripts/gate/metrics-totals.ts +59 -0
  184. package/scripts/gate/scoped-green.ts +68 -15
  185. package/scripts/gate/since-green.ts +14 -6
  186. package/scripts/gate/structural-checks.ts +96 -0
  187. package/scripts/gate/verification-gate.ts +51 -16
  188. package/scripts/gate/verification-inputs.ts +21 -6
  189. package/scripts/gate/verification-tail.ts +52 -0
  190. package/scripts/gh/gh-author-association.ts +23 -2
  191. package/scripts/gh/git-ai-review-scan.ts +1 -1
  192. package/scripts/gh/git-gh-api-path.ts +12 -3
  193. package/scripts/gh/git-gh-comments-unreadable.ts +36 -0
  194. package/scripts/gh/git-gh-exec.ts +32 -2
  195. package/scripts/gh/git-gh-issue-read.ts +4 -2
  196. package/scripts/gh/git-gh-issue-rest.ts +1 -0
  197. package/scripts/gh/git-gh-issue-write.ts +8 -2
  198. package/scripts/gh/git-gh-issue.ts +12 -5
  199. package/scripts/gh/git-gh-pr-auto-merge.ts +13 -6
  200. package/scripts/gh/git-gh-pr-graphql-state.ts +56 -0
  201. package/scripts/gh/git-gh-pr-read.ts +74 -13
  202. package/scripts/gh/git-gh-pr-rest.ts +3 -1
  203. package/scripts/gh/git-gh-pr-snapshot.ts +22 -7
  204. package/scripts/gh/git-gh-pr-too-large.ts +20 -0
  205. package/scripts/gh/git-gh-pr.ts +21 -7
  206. package/scripts/gh/git-gh-retry.ts +141 -0
  207. package/scripts/gh/git-pr-ai-review.ts +15 -6
  208. package/scripts/gh/git-pr-checks-eval.ts +3 -0
  209. package/scripts/gh/git-pr-checks.ts +5 -5
  210. package/scripts/git/base-tree.ts +30 -0
  211. package/scripts/git/change-base.ts +4 -10
  212. package/scripts/git/changed-paths-sync.ts +63 -0
  213. package/scripts/git/changed-paths.ts +16 -1
  214. package/scripts/git/git-common-directory.ts +11 -1
  215. package/scripts/git/git-diff-reads.ts +66 -20
  216. package/scripts/git/git-error.ts +9 -2
  217. package/scripts/git/git-schemas.ts +13 -0
  218. package/scripts/git/git-worktree.ts +13 -0
  219. package/scripts/git/gone-branch.ts +4 -1
  220. package/scripts/git/main-merge-budget-conflict.ts +89 -0
  221. package/scripts/git/main-merge-guard.ts +55 -18
  222. package/scripts/git/main-merge-regenerate.ts +59 -25
  223. package/scripts/git/main-merge.ts +53 -5
  224. package/scripts/git/no-base-checkout.ts +127 -0
  225. package/scripts/git/stash/git-stash.ts +11 -2
  226. package/scripts/git/stash/stash-push-cli.ts +10 -0
  227. package/scripts/hooks/batch-guard.ts +40 -21
  228. package/scripts/hooks/edited-cspell.ts +37 -11
  229. package/scripts/hooks/format-edited-file.ts +22 -2
  230. package/scripts/hooks/lane-plan-guard.ts +50 -0
  231. package/scripts/hooks/pre-commit-lint-switch.ts +9 -0
  232. package/scripts/hooks/pre-commit-lint.ts +14 -1
  233. package/scripts/hooks/pre-push-related-switch.ts +10 -0
  234. package/scripts/hooks/pre-push-unit.ts +76 -10
  235. package/scripts/hooks/pretool-guard.ts +2 -0
  236. package/scripts/hooks/reserved-run.ts +14 -1
  237. package/scripts/hooks/run-hook.sh +23 -8
  238. package/scripts/hooks/step-zero-notice.ts +6 -1
  239. package/scripts/hooks/stop-actions.ts +3 -15
  240. package/scripts/hooks/stop-guard.ts +7 -6
  241. package/scripts/init/distributed-paths.ts +1 -0
  242. package/scripts/init/hook-command-rewrite.ts +5 -1
  243. package/scripts/init/hook-launch.ts +4 -2
  244. package/scripts/issue/aggregation-split.ts +52 -0
  245. package/scripts/issue/defect-origin-line.ts +19 -1
  246. package/scripts/issue/defect-rate-cli.ts +5 -102
  247. package/scripts/issue/defect-report.ts +4 -4
  248. package/scripts/issue/effect-audit-cli.ts +178 -0
  249. package/scripts/issue/effect-audit.ts +185 -0
  250. package/scripts/issue/expected-effect-lint.ts +64 -9
  251. package/scripts/issue/git-next-issues.ts +5 -0
  252. package/scripts/issue/issue-body-or-comment.ts +38 -4
  253. package/scripts/issue/issue-cite-cli.ts +1 -3
  254. package/scripts/issue/issue-classification.ts +1 -0
  255. package/scripts/issue/issue-closing-pr.ts +8 -1
  256. package/scripts/issue/issue-evidence-exit.ts +4 -2
  257. package/scripts/issue/issue-file-cap.ts +58 -0
  258. package/scripts/issue/issue-file-cli.ts +111 -38
  259. package/scripts/issue/issue-file-deferral.ts +52 -0
  260. package/scripts/issue/issue-file-fold.ts +29 -10
  261. package/scripts/issue/issue-file-interrupt.ts +85 -0
  262. package/scripts/issue/issue-file-lane-hint.ts +30 -0
  263. package/scripts/issue/issue-file.ts +43 -6
  264. package/scripts/issue/issue-labels.ts +19 -2
  265. package/scripts/issue/issue-lint-cli.ts +27 -2
  266. package/scripts/issue/issue-measured-cli.ts +13 -35
  267. package/scripts/issue/issue-measured-close.ts +58 -0
  268. package/scripts/issue/issue-not-before-label.ts +2 -2
  269. package/scripts/issue/issue-not-before.ts +4 -1
  270. package/scripts/issue/issue-priority-cli.ts +60 -0
  271. package/scripts/issue/issue-priority-raise.ts +55 -0
  272. package/scripts/issue/issue-priority.ts +174 -43
  273. package/scripts/issue/issue-rank.ts +21 -4
  274. package/scripts/issue/issue-read-cli.ts +32 -6
  275. package/scripts/issue/issue-read.ts +37 -12
  276. package/scripts/issue/issue-sample-gate.ts +95 -74
  277. package/scripts/issue/issue-sample-prime.ts +127 -0
  278. package/scripts/issue/issue-sample-required.ts +57 -0
  279. package/scripts/issue/issue-sample-source.ts +12 -11
  280. package/scripts/issue/issue-search.ts +124 -0
  281. package/scripts/issue/issue-state.ts +13 -1
  282. package/scripts/issue/issue-template-section.ts +43 -0
  283. package/scripts/issue/issue-watch-diff.ts +31 -1
  284. package/scripts/issue/issue-watch-hook.ts +11 -2
  285. package/scripts/issue/issue-watch.ts +55 -12
  286. package/scripts/issue/markdown-section.ts +1 -0
  287. package/scripts/issue/measure-declaration.ts +121 -0
  288. package/scripts/issue/measure-rerun-cli.ts +7 -70
  289. package/scripts/issue/plan-consumers-section.ts +22 -1
  290. package/scripts/issue/reproduction-measure.ts +3 -1
  291. package/scripts/issue/size-estimate.ts +90 -0
  292. package/scripts/issue/trusted-measure.ts +84 -0
  293. package/scripts/josh/command-usage.ts +3 -2
  294. package/scripts/josh/durable-state-migrate.ts +105 -0
  295. package/scripts/josh/durable-state.ts +112 -0
  296. package/scripts/josh/josh-aliases.ts +95 -0
  297. package/scripts/josh/josh-command-map.ts +1 -82
  298. package/scripts/josh/josh-commands-agent-hooks.ts +6 -6
  299. package/scripts/josh/josh-commands-ai.ts +5 -5
  300. package/scripts/josh/josh-commands-development.ts +59 -58
  301. package/scripts/josh/josh-commands-issue-write.ts +23 -4
  302. package/scripts/josh/josh-commands-issue.ts +32 -0
  303. package/scripts/josh/josh-commands-lane.ts +87 -4
  304. package/scripts/josh/josh-commands-lint.ts +16 -3
  305. package/scripts/josh/josh-commands-maintenance.ts +15 -0
  306. package/scripts/josh/josh-commands-review.ts +41 -6
  307. package/scripts/josh/josh-commands-ship.ts +56 -8
  308. package/scripts/josh/josh-commands-test-check.ts +80 -0
  309. package/scripts/josh/josh-commands-workflow.ts +1 -1
  310. package/scripts/josh/josh-environment-file.ts +43 -3
  311. package/scripts/josh/josh-in-process.ts +2 -2
  312. package/scripts/josh/josh-logic.ts +5 -3
  313. package/scripts/josh/josh-run.ts +19 -1
  314. package/scripts/josh/run-record-path.ts +15 -0
  315. package/scripts/josh/stamp-file.ts +11 -2
  316. package/scripts/lane/lane-adopt-cli.ts +98 -0
  317. package/scripts/lane/lane-adopt.ts +208 -0
  318. package/scripts/lane/lane-await.ts +5 -8
  319. package/scripts/lane/lane-baseline.ts +123 -0
  320. package/scripts/lane/lane-breakdown-cli.ts +64 -0
  321. package/scripts/lane/lane-breakdown-implement.ts +170 -0
  322. package/scripts/lane/lane-breakdown-laps.ts +107 -0
  323. package/scripts/lane/lane-breakdown-pinned.ts +76 -0
  324. package/scripts/lane/lane-breakdown-text.ts +145 -0
  325. package/scripts/lane/lane-breakdown.ts +239 -0
  326. package/scripts/lane/lane-check-stats.ts +29 -8
  327. package/scripts/lane/lane-child-invocation.ts +9 -2
  328. package/scripts/lane/lane-child-mark-keys.ts +12 -0
  329. package/scripts/lane/lane-child-marker.ts +20 -1
  330. package/scripts/lane/lane-ci-path-stats.ts +73 -0
  331. package/scripts/lane/lane-claim-stats.ts +84 -0
  332. package/scripts/lane/lane-close.ts +8 -3
  333. package/scripts/lane/lane-dispatch-log.ts +3 -3
  334. package/scripts/lane/lane-dispatch.ts +2 -2
  335. package/scripts/lane/lane-gap-stats.ts +7 -6
  336. package/scripts/lane/lane-guard-policy.ts +7 -1
  337. package/scripts/lane/lane-implement-stats.ts +207 -0
  338. package/scripts/lane/lane-implement-subagents.ts +90 -0
  339. package/scripts/lane/lane-investigation-switch.ts +16 -0
  340. package/scripts/lane/lane-ledger-kind.ts +31 -0
  341. package/scripts/lane/lane-ledger-schema-ship.ts +49 -0
  342. package/scripts/lane/lane-ledger-schema.ts +119 -36
  343. package/scripts/lane/lane-ledger-write.ts +257 -0
  344. package/scripts/lane/lane-ledger.ts +31 -177
  345. package/scripts/lane/lane-load.ts +1 -1
  346. package/scripts/lane/lane-measure-cli.ts +176 -59
  347. package/scripts/lane/lane-net-read.ts +44 -0
  348. package/scripts/lane/lane-net-time.ts +212 -0
  349. package/scripts/lane/lane-open.ts +16 -7
  350. package/scripts/lane/lane-output.ts +2 -4
  351. package/scripts/lane/lane-overrun-prompt.ts +147 -0
  352. package/scripts/lane/lane-overrun.ts +274 -0
  353. package/scripts/lane/lane-paths.ts +24 -1
  354. package/scripts/lane/lane-pause-cli.ts +4 -1
  355. package/scripts/lane/lane-paused-spans.ts +97 -0
  356. package/scripts/lane/lane-plan-check.ts +207 -0
  357. package/scripts/lane/lane-plan-cli.ts +41 -0
  358. package/scripts/lane/lane-plan.ts +144 -0
  359. package/scripts/lane/lane-registry.ts +14 -1
  360. package/scripts/lane/lane-relaunch.ts +1 -1
  361. package/scripts/lane/lane-round-one-stats.ts +51 -0
  362. package/scripts/lane/lane-sampler.ts +23 -4
  363. package/scripts/lane/lane-session-action.ts +93 -18
  364. package/scripts/lane/lane-session-broker.ts +49 -21
  365. package/scripts/lane/lane-session-reread-main.ts +14 -0
  366. package/scripts/lane/lane-session-reread.ts +51 -0
  367. package/scripts/lane/lane-ship-lap-stats.ts +74 -0
  368. package/scripts/lane/lane-sleep.ts +58 -0
  369. package/scripts/lane/lane-spent.ts +1 -1
  370. package/scripts/lane/lane-split-stats.ts +28 -0
  371. package/scripts/lane/lane-stage-stats.ts +13 -1
  372. package/scripts/lane/lane-state.ts +41 -9
  373. package/scripts/lane/lane-stats-tables.ts +58 -0
  374. package/scripts/lane/lane-stats.ts +21 -5
  375. package/scripts/lane/lane-stop-stats.ts +51 -19
  376. package/scripts/lane/lane-tail-stats.ts +32 -0
  377. package/scripts/lane/lane-transcript-calls.ts +67 -10
  378. package/scripts/lane/lane-transcript-stats.ts +44 -12
  379. package/scripts/lane/lane-value-cell.ts +72 -0
  380. package/scripts/lane/lane-value.ts +118 -0
  381. package/scripts/lane/lane-withdraw-closed.ts +124 -0
  382. package/scripts/lane/lane-withdraw.ts +108 -31
  383. package/scripts/lane/lane-yield.ts +85 -0
  384. package/scripts/lane/openai-lane-ship.ts +12 -11
  385. package/scripts/lane/openai-lane-supervisor-decision.ts +6 -8
  386. package/scripts/lane/openai-lane-supervisor-owner.ts +5 -8
  387. package/scripts/lane/openai-lane-supervisor.ts +5 -4
  388. package/scripts/lib/poll.ts +38 -9
  389. package/scripts/lib/settled-together.ts +10 -0
  390. package/scripts/lib/shell-quote.ts +21 -0
  391. package/scripts/lib/token-shape.ts +111 -0
  392. package/scripts/lint/eslint-daemon-sources.ts +79 -0
  393. package/scripts/lint/eslint-daemon.ts +45 -6
  394. package/scripts/lint/eslint-warm-cli.ts +7 -0
  395. package/scripts/lint/eslint-warm.ts +66 -0
  396. package/scripts/lint/import-graph.ts +141 -11
  397. package/scripts/lint/lint-gate-scope.ts +2 -2
  398. package/scripts/lint/lint-parallel.ts +54 -6
  399. package/scripts/lint/lint-related.ts +154 -33
  400. package/scripts/lint/rename-cli.ts +179 -0
  401. package/scripts/lint/rename-identifier.ts +192 -0
  402. package/scripts/lint/type-only-imports.ts +58 -0
  403. package/scripts/notify/telegram-notify.ts +12 -3
  404. package/scripts/observations/observation-record.ts +42 -16
  405. package/scripts/observations/observations-flush.ts +32 -9
  406. package/scripts/overrides/overrides-check.ts +9 -1
  407. package/scripts/release/release-approval-prune.ts +7 -1
  408. package/scripts/repo/required-checks-logic.ts +4 -1
  409. package/scripts/repo/ruleset-check.ts +4 -3
  410. package/scripts/report/markdown-shape.ts +28 -0
  411. package/scripts/report/report-format-reference.ts +15 -1
  412. package/scripts/report/report-labels.ts +12 -1
  413. package/scripts/report/report-lint-child-summary.ts +94 -0
  414. package/scripts/report/report-lint-cli.ts +26 -7
  415. package/scripts/report/report-lint.ts +2 -20
  416. package/scripts/review/prose-stale-cli.ts +88 -0
  417. package/scripts/review/prose-stale-scan.ts +152 -0
  418. package/scripts/review/review-attest.ts +73 -23
  419. package/scripts/review/review-brief-cli.ts +68 -19
  420. package/scripts/review/review-brief-paths.ts +22 -0
  421. package/scripts/review/review-brief.ts +14 -7
  422. package/scripts/review/review-comment-carry.ts +47 -0
  423. package/scripts/review/review-comment-round.ts +85 -22
  424. package/scripts/review/review-finding-ledger.ts +109 -7
  425. package/scripts/review/review-finding-text.ts +43 -0
  426. package/scripts/review/review-interaction.ts +11 -0
  427. package/scripts/review/review-lane-handover.ts +68 -0
  428. package/scripts/review/review-lint-cli.ts +57 -0
  429. package/scripts/review/review-lint-findings.ts +92 -0
  430. package/scripts/review/review-lint-sections.ts +80 -0
  431. package/scripts/review/review-lint.ts +221 -0
  432. package/scripts/review/review-prior-findings.ts +102 -0
  433. package/scripts/review/review-readers-scan.ts +4 -2
  434. package/scripts/review/review-record-cli.ts +177 -54
  435. package/scripts/review/review-record-code-round.ts +55 -0
  436. package/scripts/review/review-record-comment.ts +60 -0
  437. package/scripts/review/review-record-interaction.ts +35 -0
  438. package/scripts/review/review-record-pinned.ts +108 -0
  439. package/scripts/review/review-record.ts +25 -1
  440. package/scripts/review/review-reviewed-tree.ts +307 -0
  441. package/scripts/review/review-round-one-closure.ts +62 -0
  442. package/scripts/review/review-round-reuse.ts +106 -0
  443. package/scripts/review/review-round2-cli.ts +91 -29
  444. package/scripts/review/review-round2-skip-comment.ts +55 -0
  445. package/scripts/review/review-round2.ts +24 -8
  446. package/scripts/review/review-stamps.ts +7 -3
  447. package/scripts/review/review-stop-log.ts +20 -6
  448. package/scripts/review/review-stops-cli.ts +2 -1
  449. package/scripts/review/review-submit-cli.ts +101 -0
  450. package/scripts/rules/agent-model.ts +1 -1
  451. package/scripts/rules/bash-triggers.ts +3 -3
  452. package/scripts/rules/concise-reply.ts +88 -0
  453. package/scripts/rules/credential-body.ts +77 -0
  454. package/scripts/rules/decision-oracle.ts +1 -1
  455. package/scripts/rules/delivered-rules.ts +36 -17
  456. package/scripts/rules/destructive-command.ts +3 -11
  457. package/scripts/rules/direct-issue-comment.ts +34 -12
  458. package/scripts/rules/direct-issue-read.ts +191 -0
  459. package/scripts/rules/direct-pr-create.ts +4 -24
  460. package/scripts/rules/early-heartbeat.ts +2 -0
  461. package/scripts/rules/edit-tool.ts +27 -0
  462. package/scripts/rules/file-edit-rows.ts +17 -0
  463. package/scripts/rules/file-rewrite.ts +146 -0
  464. package/scripts/rules/firing-point.ts +3 -2
  465. package/scripts/rules/gh-api.ts +128 -7
  466. package/scripts/rules/gh-repo-selector.ts +84 -0
  467. package/scripts/rules/git-force.ts +2 -2
  468. package/scripts/rules/guard-remedy.ts +14 -5
  469. package/scripts/rules/implementation-cut.ts +61 -28
  470. package/scripts/rules/investigator-foreground.ts +231 -0
  471. package/scripts/rules/issue-citation.ts +15 -60
  472. package/scripts/rules/issue-comments.ts +9 -4
  473. package/scripts/rules/josh-git-bare.ts +1 -1
  474. package/scripts/rules/lane-background.ts +41 -13
  475. package/scripts/rules/lane-direct-tool.ts +107 -9
  476. package/scripts/rules/lane-interactive-ask.ts +4 -1
  477. package/scripts/rules/lane-park.ts +4 -2
  478. package/scripts/rules/lane-spilled-read.ts +90 -0
  479. package/scripts/rules/lane-split-park.ts +1 -1
  480. package/scripts/rules/lane-switch-main.ts +4 -4
  481. package/scripts/rules/last-prompt.ts +20 -47
  482. package/scripts/rules/oracle-consulted.ts +1 -1
  483. package/scripts/rules/permission-guards.ts +5 -1
  484. package/scripts/rules/piped-verification-shapes.ts +110 -0
  485. package/scripts/rules/piped-verification.ts +67 -17
  486. package/scripts/rules/poll-loop.ts +72 -9
  487. package/scripts/rules/pr-merge.ts +5 -5
  488. package/scripts/rules/pre-gate-cut.ts +3 -3
  489. package/scripts/rules/protected-files.ts +88 -24
  490. package/scripts/rules/reply-language.ts +3 -17
  491. package/scripts/rules/reply-prose.ts +34 -0
  492. package/scripts/rules/repo-admin.ts +132 -0
  493. package/scripts/rules/reviewer-foreground.ts +88 -0
  494. package/scripts/rules/round-one-check-related.ts +120 -0
  495. package/scripts/rules/rule-body-guard.ts +5 -15
  496. package/scripts/rules/rule-value-cache.ts +53 -5
  497. package/scripts/rules/rule-value-candidates.ts +84 -0
  498. package/scripts/rules/rule-value-cli.ts +59 -11
  499. package/scripts/rules/rule-value.ts +17 -4
  500. package/scripts/rules/run-tail-rule.ts +1 -1
  501. package/scripts/rules/sed-in-place.ts +196 -0
  502. package/scripts/rules/shell-segments.ts +10 -2
  503. package/scripts/rules/stop-rule-rows.ts +1 -13
  504. package/scripts/rules/stop-rules.ts +33 -58
  505. package/scripts/rules/test-declared-commit.ts +1 -1
  506. package/scripts/rules/third-party-write.ts +110 -23
  507. package/scripts/rules/timed-rerun.ts +1 -1
  508. package/scripts/rules/turn-filings.ts +90 -0
  509. package/scripts/rules/worktree-guard.ts +22 -7
  510. package/scripts/run/board/run-board-ending-reason.ts +6 -2
  511. package/scripts/run/board/run-board-fit.ts +24 -1
  512. package/scripts/run/board/run-board-found.ts +134 -0
  513. package/scripts/run/board/run-board-header.ts +8 -0
  514. package/scripts/run/board/run-board-labels.ts +11 -1
  515. package/scripts/run/board/run-board-lane-time.ts +1 -0
  516. package/scripts/run/board/run-board-link.ts +15 -2
  517. package/scripts/run/board/run-board-notes.ts +7 -1
  518. package/scripts/run/board/run-board-operation.ts +4 -2
  519. package/scripts/run/board/run-board-phase.ts +2 -5
  520. package/scripts/run/board/run-board-plan.ts +1 -1
  521. package/scripts/run/board/run-board-read.ts +46 -1
  522. package/scripts/run/board/run-board-reason.ts +20 -8
  523. package/scripts/run/board/run-board-render-checks.ts +3 -2
  524. package/scripts/run/board/run-board-render-drawn.ts +11 -0
  525. package/scripts/run/board/run-board-render-found.ts +157 -0
  526. package/scripts/run/board/run-board-render-lead.ts +9 -0
  527. package/scripts/run/board/run-board-render-legend.ts +19 -0
  528. package/scripts/run/board/run-board-render-tail.ts +1 -1
  529. package/scripts/run/board/run-board-render.ts +82 -18
  530. package/scripts/run/board/run-board-spin.ts +1 -3
  531. package/scripts/run/board/run-board-status.ts +2 -0
  532. package/scripts/run/board/run-board-tick.ts +39 -10
  533. package/scripts/run/carry/run-carry-ended.ts +3 -2
  534. package/scripts/run/carry/run-carry.ts +3 -2
  535. package/scripts/run/cut/run-cut-cli.ts +33 -133
  536. package/scripts/run/cut/run-cut-digest.ts +152 -0
  537. package/scripts/run/cut/run-cut-handoff.ts +52 -8
  538. package/scripts/run/cut/run-cut-report.ts +24 -3
  539. package/scripts/run/cut/run-cut-resume.ts +129 -0
  540. package/scripts/run/cut/run-cut-review.ts +105 -0
  541. package/scripts/run/cut/run-cut.ts +18 -7
  542. package/scripts/run/detached-launch.ts +1 -1
  543. package/scripts/run/entry/run-entry-cli.ts +88 -19
  544. package/scripts/run/entry/run-entry-spill.ts +83 -0
  545. package/scripts/run/entry/run-entry-stop.ts +5 -1
  546. package/scripts/run/entry/run-entry-trust.ts +91 -0
  547. package/scripts/run/event/run-event-baseline.ts +56 -0
  548. package/scripts/run/event/run-event-filed.ts +9 -3
  549. package/scripts/run/event/run-event-overrun.ts +197 -0
  550. package/scripts/run/event/run-event-render.ts +4 -0
  551. package/scripts/run/event/run-event-stream.ts +25 -3
  552. package/scripts/run/hold/run-stop-notify.ts +3 -8
  553. package/scripts/run/merge/run-merge-cap.ts +57 -0
  554. package/scripts/run/merge/run-merge-cli.ts +66 -23
  555. package/scripts/run/merge/run-merge-outcome.ts +2 -0
  556. package/scripts/run/merge/run-merge-ship.ts +13 -3
  557. package/scripts/run/merge/run-merge-signals.ts +40 -23
  558. package/scripts/run/merge/run-merge-steps.ts +56 -36
  559. package/scripts/run/merge/run-merge-usage-limit.ts +53 -0
  560. package/scripts/run/merge/run-merge-withdrawn.ts +53 -0
  561. package/scripts/run/merge/run-merge.ts +41 -14
  562. package/scripts/run/review/run-review-cli.ts +306 -20
  563. package/scripts/run/review/run-review-early-push.ts +121 -0
  564. package/scripts/run/review/run-review-join-read.ts +94 -0
  565. package/scripts/run/review/run-review-pinned-accepted.ts +126 -0
  566. package/scripts/run/review/run-review-pinned-join.ts +216 -0
  567. package/scripts/run/review/run-review-pinned-steps.ts +383 -0
  568. package/scripts/run/review/run-review-pinned-tree.ts +37 -0
  569. package/scripts/run/review/run-review-pinned.ts +53 -0
  570. package/scripts/run/review/run-review-steps.ts +70 -34
  571. package/scripts/run/review/run-review.ts +26 -6
  572. package/scripts/run/run-parent-cut-hook.ts +3 -4
  573. package/scripts/run/run-prep.ts +1 -0
  574. package/scripts/run/run-stage-read.ts +2 -6
  575. package/scripts/run/run-step-cli.ts +17 -5
  576. package/scripts/run/run-step-lane-plan.ts +27 -0
  577. package/scripts/run/run-step-section.ts +26 -7
  578. package/scripts/run/run-step.ts +5 -2
  579. package/scripts/run/ship/run-ship-args.ts +19 -0
  580. package/scripts/run/ship/run-ship-brokered-review.ts +106 -0
  581. package/scripts/run/ship/run-ship-cli.ts +131 -39
  582. package/scripts/run/ship/run-ship-conflict-probe.ts +59 -0
  583. package/scripts/run/ship/run-ship-detach.ts +10 -4
  584. package/scripts/run/ship/run-ship-handover.ts +106 -0
  585. package/scripts/run/ship/run-ship-infra-retry.ts +16 -1
  586. package/scripts/run/ship/run-ship-lap.ts +63 -0
  587. package/scripts/run/ship/run-ship-next.ts +27 -26
  588. package/scripts/run/ship/run-ship-overlap.ts +8 -3
  589. package/scripts/run/ship/run-ship-place.ts +9 -2
  590. package/scripts/run/ship/run-ship-planned.ts +92 -0
  591. package/scripts/run/ship/run-ship-pre-detach-pinned.ts +197 -0
  592. package/scripts/run/ship/run-ship-pre-detach-timed.ts +7 -8
  593. package/scripts/run/ship/run-ship-pre-detach.ts +77 -23
  594. package/scripts/run/ship/run-ship-preflight.ts +16 -4
  595. package/scripts/run/ship/run-ship-probe.ts +23 -9
  596. package/scripts/run/ship/run-ship-relaunch-cap.ts +43 -7
  597. package/scripts/run/ship/run-ship-relaunch.ts +51 -0
  598. package/scripts/run/ship/run-ship-return.ts +103 -29
  599. package/scripts/run/ship/run-ship-review-reason.ts +24 -0
  600. package/scripts/run/ship/run-ship-review-steps.ts +230 -59
  601. package/scripts/run/ship/run-ship-review.ts +171 -51
  602. package/scripts/run/ship/run-ship-reviewer.ts +138 -42
  603. package/scripts/run/ship/run-ship-scoped.ts +39 -10
  604. package/scripts/run/ship/run-ship-stage.ts +49 -13
  605. package/scripts/run/ship/run-ship-steps.ts +24 -4
  606. package/scripts/run/ship/run-ship-stop-cause.ts +43 -2
  607. package/scripts/run/ship/run-ship-stop-context.ts +50 -13
  608. package/scripts/run/ship/run-ship-sync.ts +171 -30
  609. package/scripts/run/ship/run-ship-synced-scope.ts +178 -0
  610. package/scripts/run/ship/run-ship-wait-cli.ts +145 -0
  611. package/scripts/run/ship/run-ship-waiter.ts +114 -0
  612. package/scripts/run/ship/run-ship.ts +16 -2
  613. package/scripts/run/wake/run-wake-caffeinate.ts +48 -0
  614. package/scripts/run/wake/run-wake-cli.ts +6 -113
  615. package/scripts/run/wake/run-wake-code.ts +53 -11
  616. package/scripts/run/wake/run-wake-driver.ts +5 -3
  617. package/scripts/run/wake/run-wake-finish.ts +137 -0
  618. package/scripts/run/wake/run-wake-loop.ts +5 -3
  619. package/scripts/run/wake/run-wake-ports.ts +11 -3
  620. package/scripts/run/wake/run-wake-session.ts +2 -0
  621. package/scripts/run/wake/run-wake.ts +3 -2
  622. package/scripts/safe-chain/ci-installer-pin.ts +49 -8
  623. package/scripts/safe-chain/project-config.ts +3 -2
  624. package/scripts/security/secretlint-scan.ts +42 -9
  625. package/scripts/security/security-audit-provision-main.ts +9 -1
  626. package/scripts/security/security-audit-provision.ts +1 -1
  627. package/scripts/security/security-audit.ts +21 -1
  628. package/scripts/security/sonar-file.ts +10 -5
  629. package/scripts/split/split-assess.ts +12 -3
  630. package/scripts/split/split-early-notice.ts +116 -0
  631. package/scripts/split/split-measure.ts +20 -2
  632. package/scripts/split/split-resolution.ts +107 -0
  633. package/scripts/test/direct-importers.ts +185 -0
  634. package/scripts/test/pure-files-entries.ts +83 -0
  635. package/scripts/test/related-heavy-tests.ts +81 -0
  636. package/scripts/test/test-no-base.ts +88 -0
  637. package/scripts/test/test-pinned-cache-logic.ts +363 -0
  638. package/scripts/test/test-pinned-cache.ts +337 -0
  639. package/scripts/test/test-pinned-emit.ts +49 -0
  640. package/scripts/test/test-pinned-functions.ts +116 -0
  641. package/scripts/test/test-pinned-ledger.ts +80 -0
  642. package/scripts/test/test-pinned-logic.ts +208 -20
  643. package/scripts/test/test-pinned-main.ts +84 -18
  644. package/scripts/test/test-pinned-pool.ts +73 -0
  645. package/scripts/test/test-pinned-probe.ts +254 -0
  646. package/scripts/test/test-pinned-prune-logic.ts +118 -0
  647. package/scripts/test/test-pinned-reach.ts +194 -0
  648. package/scripts/test/test-pinned-record.ts +196 -0
  649. package/scripts/test/test-pinned-rewire.ts +148 -0
  650. package/scripts/test/test-pinned-spawn.ts +81 -0
  651. package/scripts/test/test-pinned-stage.ts +70 -0
  652. package/scripts/test/test-pinned.ts +258 -47
  653. package/scripts/test/test-reach-cli.ts +61 -0
  654. package/scripts/test/test-read-map.ts +35 -11
  655. package/scripts/test/test-read-recording.ts +17 -5
  656. package/scripts/test/test-read-trace.ts +26 -8
  657. package/scripts/test/test-red-logic.ts +46 -7
  658. package/scripts/test/test-red.ts +34 -14
  659. package/scripts/test/test-related-claim.ts +37 -0
  660. package/scripts/test/test-related-main.ts +4 -1
  661. package/scripts/test/test-related-moved.ts +91 -0
  662. package/scripts/test/test-related-record.ts +43 -23
  663. package/scripts/test/test-related-scope.ts +99 -34
  664. package/scripts/test/test-related-synced.ts +135 -0
  665. package/scripts/test/test-related-touched.ts +84 -0
  666. package/scripts/test/test-related.ts +167 -83
  667. package/scripts/test/test-unit-guard.ts +28 -5
  668. package/scripts/test/unit-durations.ts +41 -0
  669. package/scripts/test/unit-worker-share.ts +5 -4
  670. package/scripts/test/vitest-cache-directory.ts +19 -0
  671. package/scripts/test/vitest-cli-excludes.ts +14 -0
  672. package/scripts/test/vitest-failure-summary.ts +111 -0
  673. package/scripts/test/whole-suite-files.ts +12 -1
  674. package/scripts/time-runtime/time-batch-guard.ts +42 -4
  675. package/scripts/time-runtime/time-bundle-call.ts +1 -1
  676. package/scripts/time-runtime/time-bundles.ts +36 -5
  677. package/scripts/time-runtime/time-markers.ts +2 -2
  678. package/scripts/time-runtime/time-search-call.ts +38 -0
  679. package/scripts/time-runtime/time-shell.ts +1 -1
  680. package/scripts/time-runtime/time-transcript-line.ts +17 -5
  681. package/scripts/version/development-engines-verdict.ts +124 -0
  682. package/scripts/version/latest-corepack.ts +2 -0
  683. package/templates/gitignore +2 -0
  684. package/templates/workflows/ci.yml +41 -0
  685. package/dist/hooks/chunk-AZX4FGQ3.js +0 -207
  686. package/dist/hooks/chunk-PT5R6UJD.js +0 -7131
  687. package/dist/hooks/chunk-TUIFS5E7.js +0 -72
  688. package/dist/hooks/chunk-YCDOIR3I.js +0 -3456
  689. package/scripts/cost-runtime/context-cut-threshold.ts +0 -11
  690. package/scripts/rules/filing-cap.ts +0 -139
@@ -156,6 +156,7 @@ jobs:
156
156
  reuse: ${{ steps.prove.outputs.reuse }}
157
157
  run-id: ${{ steps.prove.outputs.run-id }}
158
158
  pull-number: ${{ steps.prove.outputs.pull-number }}
159
+ author-association: ${{ steps.prove.outputs.author-association }}
159
160
  steps:
160
161
  - name: Prove the pushed tree passed PR Checks
161
162
  id: prove
@@ -171,7 +172,7 @@ jobs:
171
172
  exit 0
172
173
  fi
173
174
  if ! pull=$(printf '%s' "${pulls}" | jq -r --arg sha "${CURRENT_SHA}" \
174
- '[.[] | select(.merged_at != null and .merge_commit_sha == $sha and .base.ref == "main")] | if length == 1 then .[0] | [.number, .head.sha, .head.ref, .created_at, .merged_at] | @tsv else empty end'); then
175
+ '[.[] | select(.merged_at != null and .merge_commit_sha == $sha and .base.ref == "main")] | if length == 1 then .[0] | [.number, .head.sha, .head.ref, .created_at, .merged_at, .author_association] | @tsv else empty end'); then
175
176
  echo '::notice::Could not parse the pull request; running the verification jobs.'
176
177
  exit 0
177
178
  fi
@@ -179,7 +180,7 @@ jobs:
179
180
  echo 'No unique merged pull request matched this push; running the verification jobs.'
180
181
  exit 0
181
182
  fi
182
- IFS=$'\t' read -r pull_number head_sha head_ref created_at merged_at <<< "${pull}"
183
+ IFS=$'\t' read -r pull_number head_sha head_ref created_at merged_at author_association <<< "${pull}"
183
184
 
184
185
  if ! current_tree=$(gh api "repos/${REPOSITORY}/git/commits/${CURRENT_SHA}" --jq '.tree.sha') || \
185
186
  ! pr_tree=$(gh api "repos/${REPOSITORY}/git/commits/${head_sha}" --jq '.tree.sha'); then
@@ -225,6 +226,7 @@ jobs:
225
226
  echo 'reuse=true' >> "$GITHUB_OUTPUT"
226
227
  echo "run-id=${run_id}" >> "$GITHUB_OUTPUT"
227
228
  echo "pull-number=${pull_number}" >> "$GITHUB_OUTPUT"
229
+ echo "author-association=${author_association}" >> "$GITHUB_OUTPUT"
228
230
  echo "Reusing successful PR Checks for tree ${current_tree}."
229
231
 
230
232
  # joshuafolkken/kit#1226 split the gate's four checks across two runners. The unit suite is the only
@@ -240,12 +242,23 @@ jobs:
240
242
  # needed a ruleset edit to stay as strict as it was, and left every merge between the two
241
243
  # unguarded. So the two halves run under new names and `Checks` stays exactly what the ruleset
242
244
  # already requires: a job that is green only when both halves are.
245
+ #
246
+ # **The static half is a matrix of three legs** (joshuafolkken/kit#5215). On one runner its seven
247
+ # checks took 4.1 minutes while every unit shard was done in about two, so it was the critical path
248
+ # to `Checks`. Each leg is still `josh gate`, narrowed by `--static-group` to the partition
249
+ # `scripts/gate/gate-static-group.ts` defines, and restores only the caches its checks write — a leg
250
+ # that restored a cache it never writes would save it back unchanged under the same sha-keyed name,
251
+ # racing the leg that does write it. `needs.static-checks.result` is `success` only when every leg is.
243
252
  static-checks:
244
- name: Static Checks
253
+ name: Static Checks (${{ matrix.group }})
245
254
  needs: reuse-pr-checks
246
255
  if: ${{ !cancelled() && needs.reuse-pr-checks.outputs.reuse != 'true' }}
247
256
  runs-on: ubuntu-latest
248
257
  timeout-minutes: 8
258
+ strategy:
259
+ fail-fast: false
260
+ matrix:
261
+ group: [lint, types, rest]
249
262
  permissions:
250
263
  contents: read
251
264
  packages: read
@@ -267,6 +280,7 @@ jobs:
267
280
  registry-url: 'https://npm.pkg.github.com'
268
281
 
269
282
  - name: Setup ESLint cache
283
+ if: matrix.group == 'lint'
270
284
  uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
271
285
  id: eslint-cache
272
286
  with:
@@ -307,6 +321,7 @@ jobs:
307
321
  # `josh check` runs `tsc --noEmit --incremental --tsBuildInfoFile .tsbuildinfo` and `josh
308
322
  # cspell:dot` runs `cspell . --dot --cache --cache-strategy content --cache-location .cspellcache`.
309
323
  - name: Setup TypeScript build cache
324
+ if: matrix.group == 'types'
310
325
  uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
311
326
  id: tsbuildinfo-cache
312
327
  with:
@@ -318,6 +333,7 @@ jobs:
318
333
  ${{ runner.os }}-tsbuildinfo-
319
334
 
320
335
  - name: Setup cspell cache
336
+ if: matrix.group == 'rest'
321
337
  uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
322
338
  id: cspell-cache
323
339
  with:
@@ -328,6 +344,25 @@ jobs:
328
344
  ${{ runner.os }}-cspell-cache-${{ hashFiles('pnpm-lock.yaml') }}-
329
345
  ${{ runner.os }}-cspell-cache-
330
346
 
347
+ # joshuafolkken/kit#5116: `josh lint --changed` runs `prettier --check . --cache --cache-strategy
348
+ # content --cache-location .prettiercache` beside eslint, and with no restored cache it walked
349
+ # the whole tree cold on every run. Prettier hashes each file's absolute path into its entry
350
+ # (`scripts/josh/josh-command-types.ts` → `GATE_CACHE_SPECS`), which is why no lane shares it,
351
+ # but the runner checks out to the same path on every run, so an earlier run's entries hit. The
352
+ # key is the eslint cache's shape: lockfile and prettier config hashes, then the sha.
353
+ - name: Setup prettier cache
354
+ if: matrix.group == 'lint'
355
+ uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
356
+ id: prettier-cache
357
+ with:
358
+ path: |
359
+ .prettiercache
360
+ key: ${{ runner.os }}-prettier-cache-${{ hashFiles('pnpm-lock.yaml') }}-${{ hashFiles('prettier.config.js', 'prettier/**/*.js') }}-${{ github.sha }}
361
+ restore-keys: |
362
+ ${{ runner.os }}-prettier-cache-${{ hashFiles('pnpm-lock.yaml') }}-${{ hashFiles('prettier.config.js', 'prettier/**/*.js') }}-
363
+ ${{ runner.os }}-prettier-cache-${{ hashFiles('pnpm-lock.yaml') }}-
364
+ ${{ runner.os }}-prettier-cache-
365
+
331
366
  - name: Setup pnpm and install dependencies
332
367
  uses: ./.github/actions/setup-pnpm
333
368
  with:
@@ -374,9 +409,10 @@ jobs:
374
409
  # default branch itself. A name that does not resolve fails the step rather than comparing
375
410
  # with nothing.
376
411
  - name: Run verification gate
377
- run: pnpm josh gate --verbose --no-unit
412
+ run: pnpm josh gate --verbose --no-unit "--static-group=${STATIC_GROUP}"
378
413
  env:
379
414
  JOSH_METRICS_BASE: HEAD^1
415
+ STATIC_GROUP: ${{ matrix.group }}
380
416
 
381
417
  # joshuafolkken/kit#4449: a main push that reuses this run skips the job above, so it saves no
382
418
  # ESLint cache, and a later pull request restored an entry several merges old. Since
@@ -388,13 +424,13 @@ jobs:
388
424
  # transient artifact-service error must not turn this required job red; it continues on error.
389
425
  - name: Write ESLint cache prefix
390
426
  id: eslint-cache-prefix
391
- if: github.event_name == 'pull_request'
427
+ if: github.event_name == 'pull_request' && matrix.group == 'lint'
392
428
  env:
393
429
  ESLINT_CACHE_PREFIX: ${{ runner.os }}-eslint-cache-${{ steps.setup-node.outputs.node-version }}-${{ hashFiles('pnpm-lock.yaml') }}-${{ hashFiles('eslint.config.js', 'eslint/**/*.js') }}-
394
430
  run: printf '%s\n' "${ESLINT_CACHE_PREFIX}" > eslint-cache-prefix
395
431
 
396
432
  - name: Upload ESLint cache
397
- if: github.event_name == 'pull_request'
433
+ if: github.event_name == 'pull_request' && matrix.group == 'lint'
398
434
  continue-on-error: true
399
435
  uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
400
436
  with:
@@ -411,6 +447,9 @@ jobs:
411
447
  # fresh key and saves the downloaded file in its post step; the prefix is checked before it becomes
412
448
  # a key. A missing artifact — a run from before this — or a prefix that is not a key saves nothing
413
449
  # and leaves the push green; the next pull request then restores an older entry, as it did before.
450
+ # Only a pull request whose author holds a trusted association (OWNER / MEMBER / COLLABORATOR) is promoted:
451
+ # an outside author's run can write any `.eslintcache` it likes, and main's scope would then let
452
+ # later pull requests skip lint on that forged record (joshuafolkken/kit#5050).
414
453
  seed-eslint-cache:
415
454
  name: Seed ESLint Cache
416
455
  needs: reuse-pr-checks
@@ -427,7 +466,15 @@ jobs:
427
466
  REPOSITORY: ${{ github.repository }}
428
467
  RUN_ID: ${{ needs.reuse-pr-checks.outputs.run-id }}
429
468
  PULL_NUMBER: ${{ needs.reuse-pr-checks.outputs.pull-number }}
469
+ AUTHOR_ASSOCIATION: ${{ needs.reuse-pr-checks.outputs.author-association }}
430
470
  run: |
471
+ case "${AUTHOR_ASSOCIATION}" in
472
+ OWNER | MEMBER | COLLABORATOR) ;;
473
+ *)
474
+ echo "::notice::The pull request's author association (${AUTHOR_ASSOCIATION:-unknown}) is not trusted; saving nothing."
475
+ exit 0
476
+ ;;
477
+ esac
431
478
  if ! gh run download "${RUN_ID}" --repo "${REPOSITORY}" --name "eslint-cache-${PULL_NUMBER}"; then
432
479
  echo '::notice::The reused run left no ESLint cache; saving nothing.'
433
480
  exit 0
@@ -448,15 +495,68 @@ jobs:
448
495
  .eslintcache
449
496
  key: ${{ steps.download.outputs.prefix }}${{ github.sha }}
450
497
 
498
+ # joshuafolkken/kit#5189: the seed above saves the pull request's cache under the Node.js release
499
+ # *that* run resolved. When the runner images move to a new patch release, main holds no lineage
500
+ # for it, and the first pull request on the new release lints cold (Static Checks 3.7 → 6.6 min).
501
+ # This job restores with the static-checks key on its own runner, after the seed has saved: an
502
+ # exact hit means the seed already wrote this release's lineage for this push, and nothing runs.
503
+ # A miss — a new release, or a seed that saved nothing — lints here, and `actions/cache` saves the
504
+ # result in its post step, so the cold lint is paid on main instead of on a pull request. The lint
505
+ # only saves time, so its step continues on error: a red lint still saves, and leaves the job green.
506
+ warm-eslint-lineage:
507
+ name: Warm ESLint Lineage
508
+ needs: [reuse-pr-checks, seed-eslint-cache]
509
+ if: ${{ !cancelled() && needs.reuse-pr-checks.outputs.reuse == 'true' }}
510
+ runs-on: ubuntu-latest
511
+ timeout-minutes: 10
512
+ permissions:
513
+ contents: read
514
+ packages: read
515
+ steps:
516
+ - name: Checkout code
517
+ uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
518
+ with:
519
+ persist-credentials: false
520
+
521
+ - name: Setup Node.js
522
+ id: setup-node
523
+ uses: ./.github/actions/setup-node
524
+ with:
525
+ registry-url: 'https://npm.pkg.github.com'
526
+
527
+ - name: Setup ESLint cache
528
+ uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
529
+ id: eslint-cache
530
+ with:
531
+ path: |
532
+ .eslintcache
533
+ key: ${{ runner.os }}-eslint-cache-${{ steps.setup-node.outputs.node-version }}-${{ hashFiles('pnpm-lock.yaml') }}-${{ hashFiles('eslint.config.js', 'eslint/**/*.js') }}-${{ github.sha }}
534
+ restore-keys: |
535
+ ${{ runner.os }}-eslint-cache-${{ steps.setup-node.outputs.node-version }}-${{ hashFiles('pnpm-lock.yaml') }}-${{ hashFiles('eslint.config.js', 'eslint/**/*.js') }}-
536
+ ${{ runner.os }}-eslint-cache-${{ steps.setup-node.outputs.node-version }}-${{ hashFiles('pnpm-lock.yaml') }}-
537
+ ${{ runner.os }}-eslint-cache-${{ steps.setup-node.outputs.node-version }}-
538
+
539
+ - name: Setup pnpm and install dependencies
540
+ if: steps.eslint-cache.outputs.cache-hit != 'true'
541
+ uses: ./.github/actions/setup-pnpm
542
+ with:
543
+ node-auth-token: ${{ secrets.GITHUB_TOKEN }}
544
+
545
+ - name: Lint to write this release's lineage
546
+ id: lint
547
+ if: steps.eslint-cache.outputs.cache-hit != 'true'
548
+ continue-on-error: true
549
+ run: pnpm josh lint
550
+
451
551
  # The other half of the gate, on a runner of its own. A GitHub job is its own machine, so this job
452
552
  # sets Node up again; the pnpm preamble is the shared `.github/actions/setup-pnpm` action
453
553
  # (joshuafolkken/kit#2982), which `templates/workflows/ci.yml` calls the same way, so
454
554
  # `scripts/ci/ci-yml-action-parity.test.ts` compares the two files without the action's own pins
455
555
  # (joshuafolkken/kit#3095).
456
556
  #
457
- # No ESLint cache here — nothing in this job lints — and no `--maxWorkers`: `gate-plan.ts` leaves
458
- # any machine below its measured 11 cores uncapped, so vitest sizes its own pool from the runner
459
- # exactly as it did inside the gate step.
557
+ # No ESLint cache here — nothing in this job lints — and no `--maxWorkers`: `josh test:unit` sizes a
558
+ # lone run's claim on a 4-core runner at vitest's own default, three workers plus vitest itself
559
+ # (`gate_plan.direct_unit_weight`, joshuafolkken/kit#4607).
460
560
  # **Sharded across runners, because one runner is already saturated** (joshuafolkken/kit#3220).
461
561
  # Alone on a 4-core runner vitest takes every core, so the suite can only get faster by spreading
462
562
  # its files over more machines. `fail-fast: false` keeps a red shard from cancelling the others,
@@ -464,19 +564,19 @@ jobs:
464
564
  # which for a matrix is `success` only when every shard succeeded — no change there is needed.
465
565
  # The shards split by the recorded per-file durations in `tools/test/unit-durations.json`, not by
466
566
  # file count, so they finish together (`tools/test/duration-shard.ts`, joshuafolkken/kit#4467).
467
- # Four shards, not three (joshuafolkken/kit#4573): balanced at three, each shard still ran its tests
468
- # for 196–227 seconds and set the CI wait; a fourth cuts each slice by a quarter for about 12
469
- # seconds of duplicated setup.
567
+ # Six shards (joshuafolkken/kit#5090): at three (joshuafolkken/kit#4610) the slowest shard had
568
+ # become the last check `Checks` waited on, past Static Checks. Six bring a shard's recorded load
569
+ # to about two minutes; past that the longest single file, not the shard count, sets the floor.
470
570
  # Only kit shards: the distributed template runs the unit suite inside its single `checks` job,
471
571
  # where a small consumer suite would pay the duplicated setup and could leave a shard with no file.
472
572
  unit:
473
- name: Unit Tests (${{ matrix.shard }}/4)
573
+ name: Unit Tests (${{ matrix.shard }}/6)
474
574
  needs: reuse-pr-checks
475
575
  if: ${{ !cancelled() && needs.reuse-pr-checks.outputs.reuse != 'true' }}
476
576
  strategy:
477
577
  fail-fast: false
478
578
  matrix:
479
- shard: [1, 2, 3, 4]
579
+ shard: [1, 2, 3, 4, 5, 6]
480
580
  runs-on: ubuntu-latest
481
581
  timeout-minutes: 8
482
582
  permissions:
@@ -508,7 +608,7 @@ jobs:
508
608
  # `scripts/ci/ci-yml-unit-job.test.ts` pins the command; the guard itself is
509
609
  # `scripts/test/test-unit-guard.ts`.
510
610
  - name: Run unit tests
511
- run: pnpm josh test:unit --shard=${{ matrix.shard }}/4
611
+ run: pnpm josh test:unit --shard=${{ matrix.shard }}/6
512
612
 
513
613
  # One shard is enough: the check does not depend on which test files ran beside it.
514
614
  - name: Verify optional ESLint consumer install
@@ -586,6 +686,46 @@ jobs:
586
686
  path: pr-checks-evidence
587
687
  retention-days: 1
588
688
 
689
+ # The pre-commit secretlint scan skips when its binary is missing and never runs on a commit made
690
+ # with `--no-verify`, so this job scans the pull request's changes again where neither applies
691
+ # (joshuafolkken/kit#4657). It needs no other job and none needs it, so it stays off the critical
692
+ # path, and its own `Secret Scan` context is what makes a finding block the merge. Only the files
693
+ # the pull request adds or changes are read: the merge commit's first parent is the base, which is
694
+ # why the checkout fetches two commits. secretlint comes from the same store cache every other job
695
+ # installs from, and `JOSH_SECRETLINT_REQUIRE` turns the hook's missing-binary skip into a failure.
696
+ # `shell: bash` adds `pipefail`, so a diff that fails cannot hand `xargs` an empty list and pass.
697
+ secret-scan:
698
+ name: Secret Scan
699
+ if: github.event_name == 'pull_request'
700
+ runs-on: ubuntu-latest
701
+ timeout-minutes: 5
702
+ permissions:
703
+ contents: read
704
+ packages: read
705
+ steps:
706
+ - name: Checkout code
707
+ uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
708
+ with:
709
+ persist-credentials: false
710
+ fetch-depth: 2
711
+
712
+ - name: Setup Node.js
713
+ uses: ./.github/actions/setup-node
714
+ with:
715
+ registry-url: 'https://npm.pkg.github.com'
716
+
717
+ - name: Setup pnpm and install dependencies
718
+ uses: ./.github/actions/setup-pnpm
719
+ with:
720
+ node-auth-token: ${{ secrets.GITHUB_TOKEN }}
721
+
722
+ - name: Scan the changed files for secrets
723
+ id: scan
724
+ shell: bash
725
+ env:
726
+ JOSH_SECRETLINT_REQUIRE: '1'
727
+ run: git diff -z --name-only --diff-filter=d HEAD^1 HEAD | xargs -0 -r pnpm josh secretlint-scan
728
+
589
729
  security:
590
730
  name: Security Audit
591
731
  runs-on: ubuntu-latest
@@ -4,9 +4,10 @@ on: pull_request
4
4
 
5
5
  # One run per pull request, superseded ones cancelled. `ci.yml` groups its pull-request runs the
6
6
  # same way but no longer its pushes: since joshuafolkken/kit#1481 it appends the commit sha on a
7
- # `push` event, which this workflow — triggered by `pull_request` alone — has no use for. kit's own
8
- # copy has no withdrawal for a stale run to arm behind (joshuafolkken/kit#842 is about the
9
- # distributed copy), so here the group only keeps a force-pushed bump from paying for two runs.
7
+ # `push` event, which this workflow — triggered by `pull_request` alone — has no use for. A stale run
8
+ # cannot arm behind the withdrawal below: its `--match-head-commit` is refused once the branch moved
9
+ # (joshuafolkken/kit#842 is about the distributed copy), so here the group only keeps a
10
+ # force-pushed bump from paying for two runs.
10
11
  concurrency:
11
12
  group: ${{ github.workflow }}-${{ github.ref }}
12
13
  cancel-in-progress: true
@@ -51,13 +52,71 @@ jobs:
51
52
  # npm bumps never auto-merge, at any semver level: kit publishes lint plugins as runtime
52
53
  # dependencies, so a patch release can change rule behavior for every consumer while kit's own
53
54
  # CI only proves that kit still builds. Major bumps never auto-merge in either ecosystem.
55
+ #
56
+ # Only the `github-actions` group merges: `.github/dependabot.yml` puts the actions the publish
57
+ # jobs run with publish credentials, and those of the `pack` job that builds the tarball they
58
+ # publish, in a group of their own, because a hijacked release of one would publish with valid
59
+ # provenance, so a person reviews it (joshuafolkken/kit#4633, joshuafolkken/kit#4654). An
60
+ # ungrouped pull request does not merge either, so a bump that escapes both groups is reviewed.
61
+ #
62
+ # `--match-head-commit` refuses to arm when the branch moved after the event this run was
63
+ # triggered for, so a commit pushed before the arming does not merge on the bump's metadata. A
64
+ # push after the arming is the withdrawal step's (joshuafolkken/kit#4654).
54
65
  - name: Enable auto-merge for github-actions patch and minor updates
55
66
  if: >-
56
67
  github.actor == 'dependabot[bot]'
57
68
  && steps.metadata.outputs.package-ecosystem == 'github_actions'
69
+ && steps.metadata.outputs.dependency-group == 'github-actions'
58
70
  && (steps.metadata.outputs.update-type == 'version-update:semver-patch'
59
71
  || steps.metadata.outputs.update-type == 'version-update:semver-minor')
60
72
  env:
61
73
  PR_URL: ${{ github.event.pull_request.html_url }}
74
+ HEAD_SHA: ${{ github.event.pull_request.head.sha }}
62
75
  GH_TOKEN: ${{ github.token }}
63
- run: gh pr merge --auto --merge "$PR_URL"
76
+ run: gh pr merge --auto --merge --match-head-commit "$HEAD_SHA" "$PR_URL"
77
+
78
+ # The arming only binds the head it was made on: GitHub keeps auto-merge on through a later push,
79
+ # so a commit a collaborator pushes to the branch would merge on the bump's metadata. A push by
80
+ # anyone but Dependabot therefore withdraws the arming this workflow made (joshuafolkken/kit#4691).
81
+ # Only that one: an auto-merge a maintainer enabled by hand — before their push or after it — is
82
+ # their decision, and the step reads who enabled it to leave it alone.
83
+ #
84
+ # `--disable-auto` is an error on a pull request with nothing armed, so the state is read first;
85
+ # a read that fails falls through to the withdrawal rather than past it, and a withdrawal that
86
+ # still fails after its retries leaves the run red. GraphQL names the token's identity
87
+ # `github-actions`; the REST spelling is accepted too.
88
+ - name: Withdraw this workflow's auto-merge after a push by anyone but Dependabot
89
+ id: withdraw
90
+ if: github.actor != 'dependabot[bot]'
91
+ env:
92
+ PR_URL: ${{ github.event.pull_request.html_url }}
93
+ # A variable so the unit test that runs this script can set the delay to zero.
94
+ RETRY_ATTEMPTS: '3'
95
+ RETRY_BACKOFF_SECONDS: '5'
96
+ GH_TOKEN: ${{ github.token }}
97
+ run: |
98
+ enabler="$(gh pr view "$PR_URL" --json autoMergeRequest \
99
+ --jq '.autoMergeRequest.enabledBy.login // ""')" || enabler=unknown
100
+
101
+ case "$enabler" in
102
+ '')
103
+ echo 'Auto-merge is not enabled — nothing to withdraw.'
104
+ exit 0
105
+ ;;
106
+ github-actions | 'github-actions[bot]' | unknown) ;;
107
+ *)
108
+ echo "Auto-merge was enabled by $enabler — leaving their decision as it is."
109
+ exit 0
110
+ ;;
111
+ esac
112
+
113
+ attempt=1
114
+
115
+ until gh pr merge --disable-auto "$PR_URL"; do
116
+ if [ "$attempt" -ge "$RETRY_ATTEMPTS" ]; then
117
+ exit 1
118
+ fi
119
+
120
+ sleep "$((attempt * RETRY_BACKOFF_SECONDS))"
121
+ attempt=$((attempt + 1))
122
+ done
@@ -23,6 +23,7 @@ jobs:
23
23
  uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
24
24
  with:
25
25
  fetch-depth: 0
26
+ persist-credentials: false
26
27
 
27
28
  - name: Configure Git
28
29
  run: |
@@ -35,7 +36,14 @@ jobs:
35
36
  # resolves to that branch, not the released tag. Use the tag carried in the
36
37
  # dispatch payload (set by auto-tag.yml) as the merge source instead.
37
38
  REF_NAME: ${{ inputs.tag || github.event.client_payload.tag }}
39
+ GH_TOKEN: ${{ github.token }}
38
40
  run: |
41
+ # The checkout keeps no credentials, so the token reaches git for this step only, through
42
+ # the environment rather than .git/config (joshuafolkken/kit#4651).
43
+ BASIC=$(printf 'x-access-token:%s' "$GH_TOKEN" | base64 -w0)
44
+ echo "::add-mask::$BASIC"
45
+ export GIT_CONFIG_COUNT=1 GIT_CONFIG_KEY_0=http.https://github.com/.extraheader GIT_CONFIG_VALUE_0="AUTHORIZATION: basic $BASIC"
46
+
39
47
  if [ -z "$REF_NAME" ]; then
40
48
  echo "::error::new-tag-created dispatch carried no tag payload; aborting." >&2
41
49
  exit 1
@@ -7,9 +7,11 @@ run-name: Publish ${{ github.ref_name }}
7
7
  on:
8
8
  workflow_dispatch:
9
9
 
10
- # Every job installs through `.github/actions/setup-pnpm`, so the jobs holding the publish rights
11
- # install behind the same hash-verified safe-chain scan as CI (joshuafolkken/kit#2982). The store
12
- # cache is off here: a cache entry another run saved never reaches a job with publish credentials.
10
+ # The jobs holding the publish rights install nothing and run no repository code: a compromised
11
+ # dependency would otherwise publish with valid provenance (joshuafolkken/kit#4633). Every install
12
+ # and every `tsx` run happens in `pack`, which holds no credentials, behind the same hash-verified
13
+ # safe-chain scan as CI (joshuafolkken/kit#2982). Its store cache is off: a cache entry another run
14
+ # saved never reaches the tarball the publish jobs receive.
13
15
 
14
16
  jobs:
15
17
  # The package is built once, here, and both registries receive this one tarball: a job that built
@@ -21,6 +23,12 @@ jobs:
21
23
  timeout-minutes: 10
22
24
  permissions:
23
25
  contents: read
26
+ # One dist-tag for both registries, chosen against npmjs, whose `latest` needs no credentials to
27
+ # read: both receive the same tarball in the same run, so they move in step. `pack` runs outside
28
+ # the `package-publish` queue, so the publish jobs re-check `latest` against its choice (see there).
29
+ outputs:
30
+ tag: ${{ steps.publish-tag.outputs.tag }}
31
+ version: ${{ steps.publish-tag.outputs.version }}
24
32
  steps:
25
33
  - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
26
34
  with:
@@ -28,10 +36,28 @@ jobs:
28
36
 
29
37
  - uses: ./.github/actions/setup-node
30
38
 
39
+ # Read before setup-pnpm puts the safe-chain shims on PATH: safe-chain hides recent versions from
40
+ # registry metadata and prints a notice to stdout, which corrupts the value (joshuafolkken/kit#3060).
41
+ - name: Read registry latest
42
+ id: registry-latest
43
+ run: |
44
+ latest=$(cd "$RUNNER_TEMP" && npm view @joshuafolkken/kit dist-tags.latest --registry https://registry.npmjs.org)
45
+ echo "latest=$latest" >> "$GITHUB_OUTPUT"
46
+
31
47
  - uses: ./.github/actions/setup-pnpm
32
48
  with:
33
49
  cache: 'false'
34
50
 
51
+ - name: Select publish tag
52
+ id: publish-tag
53
+ run: |
54
+ version=$(node -p "require('./package.json').version")
55
+ tag=$(pnpm exec tsx scripts/release/publish-tag-cli.ts "$version" "$LATEST")
56
+ echo "tag=$tag" >> "$GITHUB_OUTPUT"
57
+ echo "version=$version" >> "$GITHUB_OUTPUT"
58
+ env:
59
+ LATEST: ${{ steps.registry-latest.outputs.latest }}
60
+
35
61
  - run: pnpm pack --out "$RUNNER_TEMP/kit.tgz"
36
62
 
37
63
  # Kept as long as GitHub lets a run be re-run, so re-running a failed publish job still finds
@@ -64,34 +90,30 @@ jobs:
64
90
  registry-url: 'https://npm.pkg.github.com'
65
91
  scope: '@joshuafolkken'
66
92
 
67
- # Read before setup-pnpm puts the safe-chain shims on PATH: safe-chain hides recent versions from
68
- # registry metadata and prints a notice to stdout, which corrupts the value (joshuafolkken/kit#3060).
69
- - name: Read registry latest
70
- id: registry-latest
71
- run: |
72
- latest=$(cd "$RUNNER_TEMP" && npm view @joshuafolkken/kit dist-tags.latest --registry https://npm.pkg.github.com)
73
- echo "latest=$latest" >> "$GITHUB_OUTPUT"
74
- env:
75
- NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
76
-
77
- - uses: ./.github/actions/setup-pnpm
78
- with:
79
- cache: 'false'
80
-
81
- - name: Select GitHub Packages tag
82
- id: publish-tag
83
- run: |
84
- version=$(node -p "require('./package.json').version")
85
- tag=$(pnpm exec tsx scripts/release/publish-tag-cli.ts "$version" "$LATEST")
86
- echo "tag=$tag" >> "$GITHUB_OUTPUT"
87
- env:
88
- LATEST: ${{ steps.registry-latest.outputs.latest }}
89
-
90
93
  - uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
91
94
  with:
92
95
  name: kit-package
93
96
  path: ${{ runner.temp }}
94
97
 
98
+ # `pack` chose `latest` outside this queue, so another tag's run may have moved npmjs' `latest`
99
+ # since: publishing then could move it back to an older version (joshuafolkken/kit#2660). The
100
+ # choice stays valid while npmjs' `latest` is not above this run's version, so an older tag's
101
+ # run publishing in between does not stop this one; a newer one stops the job before it
102
+ # publishes, and re-running all jobs chooses again. `sort -V` ranks a prerelease above its
103
+ # release, which can only stop a valid run, never let a stale one through. `backfill` needs no
104
+ # check: a later `latest` is never lower than the one `pack` read. The user config is skipped
105
+ # so the scoped GitHub Packages registry setup-node wrote does not redirect the lookup.
106
+ - name: Confirm npm latest is not newer
107
+ if: needs.pack.outputs.tag == 'latest'
108
+ run: |
109
+ latest=$(cd "$RUNNER_TEMP" && npm view @joshuafolkken/kit dist-tags.latest --registry https://registry.npmjs.org --userconfig /dev/null)
110
+ if ! printf '%s\n%s\n' "$latest" "$VERSION" | sort -V -C; then
111
+ echo "::error::npm latest moved to $latest, above $VERSION, after pack chose the tag; re-run all jobs"
112
+ exit 1
113
+ fi
114
+ env:
115
+ VERSION: ${{ needs.pack.outputs.version }}
116
+
95
117
  # The tag reaches the command through the environment rather than expanded into it, so a step
96
118
  # output is never parsed as shell (joshuafolkken/kit#3084). setup-node's user config carries
97
119
  # the GitHub Packages token, so it is kept here.
@@ -99,7 +121,7 @@ jobs:
99
121
  run: cd "$RUNNER_TEMP" && npm publish kit.tgz --tag "$PUBLISH_TAG" --registry https://npm.pkg.github.com
100
122
  env:
101
123
  NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
102
- PUBLISH_TAG: ${{ steps.publish-tag.outputs.tag }}
124
+ PUBLISH_TAG: ${{ needs.pack.outputs.tag }}
103
125
 
104
126
  publish-npm:
105
127
  needs: pack
@@ -121,35 +143,27 @@ jobs:
121
143
  with:
122
144
  registry-url: 'https://registry.npmjs.org'
123
145
 
124
- # Before setup-pnpm, for the same reason as publish-github's lookup (joshuafolkken/kit#3060).
125
- - name: Read registry latest
126
- id: registry-latest
127
- run: |
128
- latest=$(cd "$RUNNER_TEMP" && npm view @joshuafolkken/kit dist-tags.latest --registry https://registry.npmjs.org)
129
- echo "latest=$latest" >> "$GITHUB_OUTPUT"
130
-
131
- - uses: ./.github/actions/setup-pnpm
132
- with:
133
- cache: 'false'
134
-
135
146
  - uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
136
147
  with:
137
148
  name: kit-package
138
149
  path: ${{ runner.temp }}
139
150
 
140
- - name: Select npm tag
141
- id: publish-tag
151
+ # The same check as publish-github's, for the same reason.
152
+ - name: Confirm npm latest is not newer
153
+ if: needs.pack.outputs.tag == 'latest'
142
154
  run: |
143
- version=$(node -p "require('./package.json').version")
144
- tag=$(pnpm exec tsx scripts/release/publish-tag-cli.ts "$version" "$LATEST")
145
- echo "tag=$tag" >> "$GITHUB_OUTPUT"
155
+ latest=$(cd "$RUNNER_TEMP" && npm view @joshuafolkken/kit dist-tags.latest --registry https://registry.npmjs.org --userconfig /dev/null)
156
+ if ! printf '%s\n%s\n' "$latest" "$VERSION" | sort -V -C; then
157
+ echo "::error::npm latest moved to $latest, above $VERSION, after pack chose the tag; re-run all jobs"
158
+ exit 1
159
+ fi
146
160
  env:
147
- LATEST: ${{ steps.registry-latest.outputs.latest }}
161
+ VERSION: ${{ needs.pack.outputs.version }}
148
162
 
149
163
  - name: Publish to npm
150
164
  run: cd "$RUNNER_TEMP" && npm publish kit.tgz --access public --tag "$PUBLISH_TAG" --registry https://registry.npmjs.org --userconfig /dev/null
151
165
  env:
152
- PUBLISH_TAG: ${{ steps.publish-tag.outputs.tag }}
166
+ PUBLISH_TAG: ${{ needs.pack.outputs.tag }}
153
167
 
154
168
  update-production:
155
169
  needs: [publish-github, publish-npm]
@@ -16,6 +16,25 @@
16
16
  "files.associations": {
17
17
  "**/tsconfig/*.json": "jsonc"
18
18
  },
19
+ "files.watcherExclude": {
20
+ "**/node_modules/**": true,
21
+ "**/.git/objects/**": true,
22
+ "**/.git/subtree-cache/**": true,
23
+ "**/.git/josh/**": true,
24
+ "**/.josh/observations/**": true,
25
+ "**/.svelte-kit/**": true,
26
+ "coverage/**": true,
27
+ "build/**": true,
28
+ "dist/**": true
29
+ },
30
+ "search.exclude": {
31
+ "**/node_modules": true,
32
+ "**/.git/josh": true,
33
+ "**/.svelte-kit": true,
34
+ "coverage": true,
35
+ "build": true,
36
+ "dist": true
37
+ },
19
38
  "[markdown]": {
20
39
  "editor.defaultFormatter": "esbenp.prettier-vscode"
21
40
  },