@joshuafolkken/kit 1.1514.0 → 1.1784.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 (858) hide show
  1. package/.claude/agents/investigator.md +1 -1
  2. package/.claude/settings.json +5 -5
  3. package/.claude/skills/epic-commands/SKILL.md +26 -65
  4. package/.claude/skills/epic-commands/epic-bundle.md +3 -1
  5. package/.claude/skills/workflow-commands/SKILL.md +5 -5
  6. package/.claude/skills/workflow-commands/background-commands.md +5 -5
  7. package/.claude/skills/workflow-commands/backlogrun-child.md +10 -8
  8. package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +7 -25
  9. package/.claude/skills/workflow-commands/backlogrun-lanes.md +17 -13
  10. package/.claude/skills/workflow-commands/backlogrun-park.md +14 -23
  11. package/.claude/skills/workflow-commands/backlogrun-progress.md +2 -2
  12. package/.claude/skills/workflow-commands/backlogrun-recovery.md +5 -5
  13. package/.claude/skills/workflow-commands/backlogrun-steps.md +10 -10
  14. package/.claude/skills/workflow-commands/backlogrun.md +1 -1
  15. package/.claude/skills/workflow-commands/chain-rule.md +13 -7
  16. package/.claude/skills/workflow-commands/delegation.md +6 -5
  17. package/.claude/skills/workflow-commands/entry-sequence.md +9 -9
  18. package/.claude/skills/workflow-commands/followup.md +9 -31
  19. package/.claude/skills/workflow-commands/fullrun-steps.md +36 -45
  20. package/.claude/skills/workflow-commands/fullrun.md +2 -2
  21. package/.claude/skills/workflow-commands/halfrun.md +17 -25
  22. package/.claude/skills/workflow-commands/issue-comments.md +16 -12
  23. package/.claude/skills/workflow-commands/issue-scout.md +2 -2
  24. package/.claude/skills/workflow-commands/kickoff.md +24 -23
  25. package/.claude/skills/workflow-commands/latest-gate.md +7 -12
  26. package/.claude/skills/workflow-commands/needs-human-review.md +9 -14
  27. package/.claude/skills/workflow-commands/observation-filing.md +4 -36
  28. package/.claude/skills/workflow-commands/observation-ledger.md +1 -1
  29. package/.claude/skills/workflow-commands/pre-gate-cut.md +13 -30
  30. package/.claude/skills/workflow-commands/prerequisite.md +10 -16
  31. package/.claude/skills/workflow-commands/progress-watcher.md +1 -1
  32. package/.claude/skills/workflow-commands/prrun.md +3 -7
  33. package/.claude/skills/workflow-commands/retrospective.md +1 -1
  34. package/.claude/skills/workflow-commands/split-assessment.md +13 -1
  35. package/.claude/skills/workflow-commands/working-tree-hold.md +9 -9
  36. package/.codex/hooks.json +5 -5
  37. package/.github/actions/setup-node/action.yml +9 -0
  38. package/.github/actions/setup-pnpm/action.yml +1 -1
  39. package/.github/dependabot.yml +16 -0
  40. package/.github/release.yml +0 -2
  41. package/.github/workflows/ci.yml +120 -10
  42. package/.github/workflows/publish.yml +8 -1
  43. package/.github/workflows/sonar-qube.yml +1 -0
  44. package/.prettierignore +2 -0
  45. package/.vscode/tasks.json +1 -2
  46. package/CLAUDE.md +3 -7
  47. package/README.md +4 -2
  48. package/SECURITY.md +1 -1
  49. package/dist/CLAUDE.md +3 -7
  50. package/dist/commands/document-read-cli.js +882 -0
  51. package/dist/commands/{document-section-cli.js → document-section-main.js} +79 -37
  52. package/dist/commands/read-set-cli.js +1867 -0
  53. package/dist/commands/run-prep-main.js +21653 -0
  54. package/dist/commands/run-step-cli.js +23880 -0
  55. package/dist/config-merge/index.js +5 -1
  56. package/dist/hooks/audit-provision.js +20 -35
  57. package/dist/hooks/{chunk-DGT54IH5.js → chunk-AZX4FGQ3.js} +63 -17
  58. package/dist/hooks/chunk-CWMBGKYW.js +6483 -0
  59. package/dist/hooks/chunk-O2YBIDSI.js +4306 -0
  60. package/dist/hooks/{chunk-TNUMY6NL.js → chunk-PT5R6UJD.js} +4193 -1900
  61. package/dist/hooks/chunk-TUIFS5E7.js +72 -0
  62. package/dist/hooks/{chunk-723HKZO5.js → chunk-VWWCFGWK.js} +1 -1
  63. package/dist/hooks/{chunk-APUO6U4J.js → chunk-WR2KQAYZ.js} +1843 -440
  64. package/dist/hooks/{chunk-O6GDRNJB.js → chunk-XGBNSWEI.js} +248 -46
  65. package/dist/hooks/chunk-YCDOIR3I.js +3456 -0
  66. package/dist/hooks/codex-hook-adapter.js +10 -22
  67. package/dist/hooks/format-edited.js +5 -6
  68. package/dist/hooks/inputs.json +443 -317
  69. package/dist/hooks/pretool-guard.js +7 -25
  70. package/dist/hooks/session-lang.js +44 -51
  71. package/dist/hooks/stop-guard.js +7716 -2187
  72. package/dist/josh.js +6002 -3583
  73. package/dist/self-sync-guard/index.js +74 -10
  74. package/dist/version/index.js +115 -406
  75. package/eslint/base.js +1 -1
  76. package/lefthook/base.yml +3 -1
  77. package/package.json +10 -48
  78. package/pnpm-workspace.yaml +4 -2
  79. package/prompts/coding-standards.md +1 -1
  80. package/prompts/collaboration-workflow/file-edits.md +1 -7
  81. package/prompts/collaboration-workflow/issue-citation.md +1 -1
  82. package/prompts/collaboration-workflow/issue-template.md +33 -16
  83. package/prompts/collaboration-workflow/lane-instructions.md +1 -2
  84. package/prompts/collaboration-workflow/measurement.md +37 -0
  85. package/prompts/collaboration-workflow/operating-rules.md +4 -6
  86. package/prompts/collaboration-workflow/output-bounds.md +2 -7
  87. package/prompts/collaboration-workflow/plan-comment.md +3 -42
  88. package/prompts/collaboration-workflow/principles.md +5 -0
  89. package/prompts/collaboration-workflow/report-format.md +31 -60
  90. package/prompts/collaboration-workflow/residency.md +2 -2
  91. package/prompts/collaboration-workflow/shell-body.md +6 -16
  92. package/prompts/collaboration-workflow/turn-batching.md +0 -2
  93. package/prompts/collaboration-workflow/upstream-interrupt.md +14 -4
  94. package/prompts/collaboration-workflow/wip-cap.md +1 -1
  95. package/prompts/collaboration-workflow.md +3 -7
  96. package/prompts/refactoring.md +1 -1
  97. package/prompts/review-rubric.md +1 -2
  98. package/prompts/review.md +41 -21
  99. package/prompts/testing-guide.md +8 -43
  100. package/scripts/agent/agent-event.ts +15 -15
  101. package/scripts/agent/agent-exit-record.ts +13 -1
  102. package/scripts/agent/api-auth.ts +41 -0
  103. package/scripts/agent/api-outage.ts +1 -1
  104. package/scripts/auto-ok/auto-ok-cli.ts +14 -16
  105. package/scripts/auto-ok/auto-ok-judge-read.ts +12 -3
  106. package/scripts/auto-ok/auto-ok-judge-write.ts +46 -19
  107. package/scripts/auto-ok/auto-ok-judge.ts +13 -2
  108. package/scripts/auto-ok/auto-ok-main.ts +17 -0
  109. package/scripts/backlog/backlog-arrival.ts +14 -3
  110. package/scripts/backlog/backlog-budget-cli.ts +7 -33
  111. package/scripts/backlog/backlog-budget-main.ts +16 -0
  112. package/scripts/backlog/backlog-budget.ts +2 -3
  113. package/scripts/backlog/backlog-defect-priority.ts +4 -3
  114. package/scripts/backlog/backlog-drive-adopt.ts +67 -0
  115. package/scripts/backlog/backlog-drive-args.ts +4 -5
  116. package/scripts/backlog/backlog-drive-cli.ts +113 -28
  117. package/scripts/backlog/backlog-drive-hold.ts +162 -0
  118. package/scripts/backlog/backlog-drive-idle.ts +151 -0
  119. package/scripts/backlog/backlog-drive-judge.ts +25 -0
  120. package/scripts/backlog/backlog-drive-memory.ts +126 -0
  121. package/scripts/backlog/backlog-drive-named-offer.ts +5 -10
  122. package/scripts/backlog/backlog-drive-named.ts +53 -6
  123. package/scripts/backlog/backlog-drive-offer-argv.ts +3 -8
  124. package/scripts/backlog/backlog-drive-paused.ts +169 -0
  125. package/scripts/backlog/backlog-drive-restore.ts +30 -7
  126. package/scripts/backlog/backlog-drive-seats.ts +18 -8
  127. package/scripts/backlog/backlog-drive-token-handling.ts +38 -0
  128. package/scripts/backlog/backlog-drive.ts +79 -75
  129. package/scripts/backlog/backlog-next-main.ts +16 -0
  130. package/scripts/backlog/backlog-next-shared.ts +73 -0
  131. package/scripts/backlog/backlog-next.ts +48 -16
  132. package/scripts/backlog/backlog-occupied.ts +52 -39
  133. package/scripts/backlog/backlog-offer-cli.ts +6 -21
  134. package/scripts/backlog/backlog-offer-exclude.ts +15 -0
  135. package/scripts/backlog/backlog-offer-main.ts +12 -0
  136. package/scripts/backlog/backlog-offer.ts +36 -3
  137. package/scripts/backlog/backlog-overlap.ts +22 -4
  138. package/scripts/backlog/backlog-plan-read.ts +6 -2
  139. package/scripts/backlog/backlog-plan.ts +18 -4
  140. package/scripts/backlog/backlog-pool.ts +10 -10
  141. package/scripts/backlog/backlog-rank.ts +10 -2
  142. package/scripts/backlog/backlog-ready.ts +112 -30
  143. package/scripts/backlog/backlog-stalled-detect.ts +109 -36
  144. package/scripts/backlog/backlog-stalled.ts +52 -16
  145. package/scripts/backlog/backlog-wait-cause.ts +86 -0
  146. package/scripts/backlog/backlog-waves.ts +39 -13
  147. package/scripts/backlog/backlogrun-args.ts +19 -7
  148. package/scripts/backlog/backlogrun-cli.ts +19 -5
  149. package/scripts/backlog/backlogrun-launch.ts +6 -0
  150. package/scripts/backlog/backlogrun-restart.ts +97 -0
  151. package/scripts/backlog/backlogrun-stop.ts +79 -7
  152. package/scripts/behavior/behavior-cli.ts +2 -2
  153. package/scripts/behavior/behavior-rules.ts +47 -24
  154. package/scripts/build/build-bin.ts +2 -16
  155. package/scripts/build/build-claude-md.ts +0 -7
  156. package/scripts/build/build-commands.ts +0 -13
  157. package/scripts/build/build-hooks.ts +49 -48
  158. package/scripts/build/hook-bundle-stamp.ts +29 -11
  159. package/scripts/build/local-bin.ts +1 -1
  160. package/scripts/cases/cases-cli.ts +25 -13
  161. package/scripts/cases/cases-interaction-scan.ts +134 -0
  162. package/scripts/cases/cases-interaction.ts +183 -0
  163. package/scripts/cases/cases-logic.ts +39 -6
  164. package/scripts/ci/pr-classification-main.ts +18 -0
  165. package/scripts/ci/pr-classification.ts +10 -17
  166. package/scripts/clone/clone-scan.ts +1 -1
  167. package/scripts/cost-runtime/cost-blocks.ts +22 -37
  168. package/scripts/cost-runtime/cost-cli.ts +31 -14
  169. package/scripts/cost-runtime/cost-main.ts +12 -0
  170. package/scripts/cost-runtime/cost-transcript.ts +1 -0
  171. package/scripts/delegation/delegation-policy.ts +17 -4
  172. package/scripts/delegation/duplicate-read-guard.ts +0 -8
  173. package/scripts/delegation/investigation-guard.ts +0 -8
  174. package/scripts/delegation/investigation-reads.ts +3 -4
  175. package/scripts/dependabot/dependabot-cooldown.ts +194 -0
  176. package/scripts/discovery/repo-discovery.ts +24 -6
  177. package/scripts/doctor/doctor-consumer.ts +2 -5
  178. package/scripts/document/document-byte-budget.ts +8 -6
  179. package/scripts/document/document-scan.ts +1 -1
  180. package/scripts/document/document-section-cli.ts +0 -8
  181. package/scripts/document/document-section-main.ts +12 -0
  182. package/scripts/epic/epic-audit-cli.ts +12 -6
  183. package/scripts/epic/epic-bundle-apply.ts +137 -0
  184. package/scripts/epic/epic-bundle-cli.ts +32 -121
  185. package/scripts/epic/epic-bundle-format.ts +116 -0
  186. package/scripts/epic/epic-bundle-main.ts +17 -0
  187. package/scripts/epic/epic-busy.ts +5 -12
  188. package/scripts/epic/epic-classify.ts +24 -15
  189. package/scripts/epic/epic-cli-argv.ts +31 -0
  190. package/scripts/epic/epic-cli-decide.ts +42 -0
  191. package/scripts/epic/epic-cli.ts +6 -38
  192. package/scripts/epic/epic-close.ts +112 -55
  193. package/scripts/epic/epic-cross-repo.ts +4 -7
  194. package/scripts/epic/epic-decide.ts +119 -0
  195. package/scripts/epic/epic-decision.ts +9 -0
  196. package/scripts/epic/epic-fetch.ts +4 -0
  197. package/scripts/epic/epic-graph.ts +2 -0
  198. package/scripts/epic/epic-issue.ts +5 -1
  199. package/scripts/epic/epic-label-age.ts +1 -1
  200. package/scripts/epic/epic-lane-offer.ts +39 -4
  201. package/scripts/epic/epic-next-main.ts +24 -0
  202. package/scripts/epic/epic-next.ts +6 -24
  203. package/scripts/epic/epic-outside-blocker.ts +6 -2
  204. package/scripts/epic/epic-parse.ts +9 -3
  205. package/scripts/epic/epic-read.ts +1 -0
  206. package/scripts/epic/epic-reconcile.ts +39 -0
  207. package/scripts/epic/epic-run.ts +10 -1
  208. package/scripts/epic/epic-solo.ts +50 -14
  209. package/scripts/epic/epic.ts +41 -7
  210. package/scripts/exports/unused-members-cli.ts +2 -2
  211. package/scripts/followup/followup-checks-event.ts +8 -3
  212. package/scripts/followup/followup-coderabbit-wait.ts +82 -0
  213. package/scripts/followup/followup-review-gates.ts +81 -0
  214. package/scripts/followup/git-followup-stages.ts +13 -3
  215. package/scripts/followup/git-followup-workflow.ts +19 -66
  216. package/scripts/followup/git-pr-followup-wrapup.ts +9 -14
  217. package/scripts/followup/git-pr-followup.ts +36 -8
  218. package/scripts/fresh-machine/fresh-machine-cli.ts +1 -1
  219. package/scripts/fresh-machine/fresh-machine-run.ts +8 -8
  220. package/scripts/fresh-machine/specs/kit-test-backlogrun.json +1 -1
  221. package/scripts/gate/busy-average.ts +58 -0
  222. package/scripts/gate/check-cpu.ts +60 -0
  223. package/scripts/gate/check-inputs.ts +39 -95
  224. package/scripts/gate/check-reuse.ts +33 -54
  225. package/scripts/gate/command-memory.ts +192 -0
  226. package/scripts/gate/core-admission.ts +218 -28
  227. package/scripts/gate/core-budget-timing.ts +37 -0
  228. package/scripts/gate/core-budget.ts +80 -98
  229. package/scripts/gate/core-wait-record.ts +48 -0
  230. package/scripts/gate/core-wait.ts +37 -5
  231. package/scripts/gate/core-weights.ts +86 -0
  232. package/scripts/gate/free-cores.ts +27 -4
  233. package/scripts/gate/gate-ledger.ts +32 -4
  234. package/scripts/gate/gate-plan.ts +41 -34
  235. package/scripts/gate/gate-report.ts +14 -2
  236. package/scripts/gate/gate-run-steps.ts +53 -8
  237. package/scripts/gate/gate-skip.ts +12 -2
  238. package/scripts/gate/gate-steps.ts +12 -1
  239. package/scripts/gate/input-fingerprint.ts +42 -0
  240. package/scripts/gate/machine-capacity.ts +65 -31
  241. package/scripts/gate/moved-paths.ts +67 -0
  242. package/scripts/gate/project-checks.ts +5 -12
  243. package/scripts/gate/scoped-green.ts +12 -8
  244. package/scripts/gate/since-green.ts +62 -0
  245. package/scripts/gate/toolchain-inputs.ts +115 -0
  246. package/scripts/gate/verification-gate.ts +27 -24
  247. package/scripts/gate/verification-inputs.ts +250 -0
  248. package/scripts/gh/gh-author-association.ts +96 -9
  249. package/scripts/gh/git-ai-review-scan.ts +4 -2
  250. package/scripts/gh/git-gh-api-path.ts +15 -0
  251. package/scripts/gh/git-gh-branch-rules.ts +73 -0
  252. package/scripts/gh/git-gh-conditional.ts +5 -2
  253. package/scripts/gh/git-gh-issue-read.ts +5 -1
  254. package/scripts/gh/git-gh-issue-write.ts +67 -29
  255. package/scripts/gh/git-gh-issue.ts +7 -3
  256. package/scripts/gh/git-gh-poll-read.ts +89 -0
  257. package/scripts/gh/git-gh-pr-auto-merge.ts +8 -3
  258. package/scripts/gh/git-gh-pr-rest.ts +1 -1
  259. package/scripts/gh/git-gh-pr-snapshot.ts +33 -20
  260. package/scripts/gh/git-gh-pr.ts +27 -15
  261. package/scripts/gh/git-pr-checks-eval.ts +39 -7
  262. package/scripts/gh/git-pr-checks-parse.ts +39 -9
  263. package/scripts/gh/git-pr-merge-checked.ts +80 -0
  264. package/scripts/git/base-tree.ts +19 -2
  265. package/scripts/git/changed-file-scope.ts +6 -4
  266. package/scripts/git/changed-paths.ts +18 -1
  267. package/scripts/git/git-diff-reads.ts +27 -2
  268. package/scripts/git/git-grep-hits.ts +85 -0
  269. package/scripts/git/git-location-environment.ts +1 -1
  270. package/scripts/git/git-merge-conflicts.ts +83 -0
  271. package/scripts/git/git-preflight.ts +37 -12
  272. package/scripts/git/git-push-transport.ts +1 -2
  273. package/scripts/git/git-schemas.ts +17 -7
  274. package/scripts/git/git-spawn.ts +1 -2
  275. package/scripts/git/git-status.ts +4 -4
  276. package/scripts/git/main-merge-main.ts +12 -0
  277. package/scripts/git/main-merge-regenerate.ts +2 -2
  278. package/scripts/git/main-merge.ts +25 -9
  279. package/scripts/git/main-sync-main.ts +12 -0
  280. package/scripts/git/main-sync.ts +0 -9
  281. package/scripts/git/stash/git-stash.ts +27 -4
  282. package/scripts/git/stash/{stash-pop-args.ts → stash-args.ts} +13 -10
  283. package/scripts/git/stash/stash-pop-cli.ts +6 -12
  284. package/scripts/git/stash/stash-pop-main.ts +12 -0
  285. package/scripts/git/stash/stash-push-cli.ts +76 -0
  286. package/scripts/git/stash/stash-push-main.ts +12 -0
  287. package/scripts/hooks/batch-guard.ts +0 -8
  288. package/scripts/hooks/check-commit-message-main.ts +8 -0
  289. package/scripts/hooks/check-commit-message.ts +4 -7
  290. package/scripts/hooks/format-edited-file.ts +8 -24
  291. package/scripts/hooks/pre-commit-lint.ts +30 -3
  292. package/scripts/hooks/pre-push-unit.ts +4 -2
  293. package/scripts/hooks/pretool-guard-cli.ts +1 -8
  294. package/scripts/hooks/pretool-guard.ts +32 -19
  295. package/scripts/hooks/reserved-run.ts +67 -9
  296. package/scripts/hooks/run-hook.sh +13 -4
  297. package/scripts/hooks/shell-rules-notice.ts +37 -0
  298. package/scripts/hooks/stop-actions.ts +2 -21
  299. package/scripts/hooks/stop-guard.ts +13 -9
  300. package/scripts/init/hook-command-rewrite.ts +19 -5
  301. package/scripts/init/hook-launch.ts +15 -17
  302. package/scripts/init/init-actions.ts +0 -6
  303. package/scripts/init/init-ai-copy.ts +10 -36
  304. package/scripts/init/init-bootstrap.ts +9 -8
  305. package/scripts/init/init-dry-run-report.ts +1 -1
  306. package/scripts/init/init-dry-run.ts +1 -1
  307. package/scripts/init/init-file-action.ts +7 -9
  308. package/scripts/init/init-logic-json-merge.ts +2 -2
  309. package/scripts/init/init-logic-migrate.ts +9 -82
  310. package/scripts/init/init-logic.ts +3 -2
  311. package/scripts/init/init-main.ts +12 -0
  312. package/scripts/init/init.ts +5 -12
  313. package/scripts/init/kit-development-versions.ts +3 -7
  314. package/scripts/init/kit-written-paths.ts +2 -2
  315. package/scripts/init/project-profile.ts +5 -4
  316. package/scripts/init/tsconfig-preset-migration.ts +2 -1
  317. package/scripts/init/vscode-tasks.ts +1 -1
  318. package/scripts/issue/defect-origin-cli.ts +106 -0
  319. package/scripts/issue/defect-origin-line.ts +60 -0
  320. package/scripts/issue/defect-origin-main.ts +11 -0
  321. package/scripts/issue/defect-origin.ts +114 -0
  322. package/scripts/issue/defect-rate-cli.ts +34 -78
  323. package/scripts/issue/defect-rate.ts +0 -16
  324. package/scripts/issue/defect-report-cli.ts +128 -0
  325. package/scripts/issue/defect-report-format.ts +56 -0
  326. package/scripts/issue/defect-report-main.ts +11 -0
  327. package/scripts/issue/defect-report.ts +160 -0
  328. package/scripts/issue/expected-effect-lint.ts +1 -0
  329. package/scripts/issue/issue-already-done-cli.ts +62 -0
  330. package/scripts/issue/issue-body-or-comment.ts +40 -0
  331. package/scripts/issue/issue-cite-cli.ts +0 -9
  332. package/scripts/issue/issue-cite-main.ts +12 -0
  333. package/scripts/issue/issue-classification.ts +12 -7
  334. package/scripts/issue/issue-comment-cli.ts +10 -24
  335. package/scripts/issue/issue-comment-main.ts +12 -0
  336. package/scripts/issue/issue-evidence-exit.ts +100 -0
  337. package/scripts/issue/issue-file-cli.ts +29 -7
  338. package/scripts/issue/issue-file.ts +19 -19
  339. package/scripts/issue/issue-fold-cli.ts +2 -11
  340. package/scripts/issue/issue-fold-main.ts +12 -0
  341. package/scripts/issue/issue-labels.ts +81 -90
  342. package/scripts/issue/issue-lint-cli.ts +2 -10
  343. package/scripts/issue/issue-lint-main.ts +12 -0
  344. package/scripts/issue/issue-measured-cli.ts +56 -0
  345. package/scripts/issue/issue-merged.ts +19 -2
  346. package/scripts/issue/issue-not-before-label.ts +135 -0
  347. package/scripts/issue/issue-not-before.ts +111 -0
  348. package/scripts/issue/issue-number-shape.ts +15 -1
  349. package/scripts/issue/issue-park.ts +28 -0
  350. package/scripts/issue/issue-plan-cli.ts +151 -0
  351. package/scripts/issue/issue-priority.ts +151 -0
  352. package/scripts/issue/issue-rank.ts +7 -1
  353. package/scripts/issue/issue-read-cli.ts +3 -10
  354. package/scripts/issue/issue-read-main.ts +12 -0
  355. package/scripts/issue/issue-read.ts +29 -5
  356. package/scripts/issue/issue-release-cli.ts +0 -10
  357. package/scripts/issue/issue-release-main.ts +13 -0
  358. package/scripts/issue/issue-release.ts +7 -12
  359. package/scripts/issue/issue-sample-gate.ts +192 -0
  360. package/scripts/issue/issue-sample-source.ts +76 -0
  361. package/scripts/issue/issue-scout-cli.ts +0 -11
  362. package/scripts/issue/issue-scout-main.ts +14 -0
  363. package/scripts/issue/issue-state-cli.ts +0 -10
  364. package/scripts/issue/issue-state-main.ts +12 -0
  365. package/scripts/issue/issue-watch-diff.ts +56 -15
  366. package/scripts/issue/issue-watch.ts +2 -1
  367. package/scripts/issue/issue-wip.ts +2 -7
  368. package/scripts/issue/measure-rerun-cli.ts +13 -8
  369. package/scripts/issue/plan-consumers-cli.ts +39 -0
  370. package/scripts/issue/plan-consumers-main.ts +11 -0
  371. package/scripts/issue/plan-consumers-section.ts +55 -0
  372. package/scripts/issue/plan-consumers.ts +127 -0
  373. package/scripts/josh/agent-session-environment.ts +1 -1
  374. package/scripts/josh/command-usage.ts +15 -43
  375. package/scripts/josh/file-map-stamp.ts +49 -16
  376. package/scripts/josh/hook-decision.ts +32 -20
  377. package/scripts/josh/josh-command-map.ts +4 -1
  378. package/scripts/josh/josh-command-types.ts +12 -6
  379. package/scripts/josh/josh-commands-agent-hooks.ts +83 -0
  380. package/scripts/josh/josh-commands-ai.ts +157 -158
  381. package/scripts/josh/josh-commands-backlog.ts +82 -16
  382. package/scripts/josh/josh-commands-clone.ts +1 -0
  383. package/scripts/josh/josh-commands-development.ts +111 -71
  384. package/scripts/josh/josh-commands-document.ts +43 -1
  385. package/scripts/josh/josh-commands-epic.ts +171 -0
  386. package/scripts/josh/josh-commands-hooks.ts +25 -2
  387. package/scripts/josh/josh-commands-issue-write.ts +181 -0
  388. package/scripts/josh/josh-commands-issue.ts +124 -24
  389. package/scripts/josh/josh-commands-lane.ts +103 -2
  390. package/scripts/josh/josh-commands-lint.ts +19 -8
  391. package/scripts/josh/josh-commands-maintenance.ts +112 -4
  392. package/scripts/josh/josh-commands-pause.ts +29 -0
  393. package/scripts/josh/josh-commands-progress.ts +87 -0
  394. package/scripts/josh/josh-commands-project.ts +138 -9
  395. package/scripts/josh/josh-commands-review.ts +124 -0
  396. package/scripts/josh/josh-commands-run.ts +211 -23
  397. package/scripts/josh/josh-commands-ship.ts +169 -0
  398. package/scripts/josh/josh-commands-split.ts +9 -0
  399. package/scripts/josh/josh-commands-versioning.ts +49 -2
  400. package/scripts/josh/josh-commands-workflow.ts +144 -6
  401. package/scripts/josh/josh-logic.ts +6 -13
  402. package/scripts/josh/package-directory.ts +2 -4
  403. package/scripts/josh/process-identity.ts +13 -4
  404. package/scripts/josh/session-language-cli.ts +4 -8
  405. package/scripts/josh/session-language-main.ts +13 -0
  406. package/scripts/josh/session-language.ts +6 -1
  407. package/scripts/josh/shared-cache.ts +90 -0
  408. package/scripts/josh/stamp-file.ts +9 -15
  409. package/scripts/lane/lane-await.ts +51 -12
  410. package/scripts/lane/lane-cache.ts +5 -30
  411. package/scripts/lane/lane-capacity.ts +14 -23
  412. package/scripts/lane/lane-check-stats.ts +62 -21
  413. package/scripts/lane/lane-child-invocation.ts +8 -0
  414. package/scripts/lane/lane-cli.ts +15 -5
  415. package/scripts/lane/lane-close.ts +86 -18
  416. package/scripts/lane/lane-core-wait-stats.ts +66 -0
  417. package/scripts/lane/lane-dispatch.ts +24 -3
  418. package/scripts/lane/lane-gap-stats.ts +156 -0
  419. package/scripts/lane/lane-handoff.ts +69 -1
  420. package/scripts/lane/lane-held-stats.ts +129 -0
  421. package/scripts/lane/lane-install.ts +4 -11
  422. package/scripts/lane/lane-launch-cli.ts +0 -9
  423. package/scripts/lane/lane-launch-main.ts +12 -0
  424. package/scripts/lane/lane-ledger-schema.ts +266 -0
  425. package/scripts/lane/lane-ledger.ts +92 -123
  426. package/scripts/lane/lane-limit-cli.ts +12 -1
  427. package/scripts/lane/lane-measure-cli.ts +57 -11
  428. package/scripts/lane/lane-open.ts +9 -1
  429. package/scripts/lane/lane-parked.ts +3 -3
  430. package/scripts/lane/lane-pause-cli.ts +130 -0
  431. package/scripts/lane/lane-pause.ts +158 -0
  432. package/scripts/lane/lane-process-table.ts +166 -0
  433. package/scripts/lane/lane-reap-settle.ts +124 -0
  434. package/scripts/lane/lane-reap.ts +50 -15
  435. package/scripts/lane/lane-registry.ts +24 -3
  436. package/scripts/lane/lane-residents.ts +162 -0
  437. package/scripts/lane/lane-restart.ts +22 -2
  438. package/scripts/lane/lane-round-two-stats.ts +49 -0
  439. package/scripts/lane/lane-sampler.ts +4 -0
  440. package/scripts/lane/lane-session-action.ts +19 -5
  441. package/scripts/lane/lane-session-broker.ts +102 -21
  442. package/scripts/lane/lane-snapshot-trace.ts +84 -0
  443. package/scripts/lane/lane-spans.ts +51 -0
  444. package/scripts/lane/lane-spent.ts +6 -3
  445. package/scripts/lane/lane-stage-stats.ts +7 -2
  446. package/scripts/lane/lane-state.ts +302 -0
  447. package/scripts/lane/lane-stats.ts +58 -4
  448. package/scripts/lane/lane-stop-stats.ts +113 -37
  449. package/scripts/lane/lane-test-related-stats.ts +127 -0
  450. package/scripts/lane/lane-transcript-calls.ts +145 -0
  451. package/scripts/lane/lane-transcript-stats.ts +168 -0
  452. package/scripts/lane/lane-vacant.ts +13 -3
  453. package/scripts/lane/lane-withdraw-cli.ts +5 -4
  454. package/scripts/lane/lane-withdraw.ts +50 -49
  455. package/scripts/lane/process-directories.ts +70 -0
  456. package/scripts/lane/process-lane-marks.ts +94 -0
  457. package/scripts/lib/atomic-write.ts +62 -0
  458. package/scripts/lib/buffered-process.ts +12 -5
  459. package/scripts/lib/cli-flags.ts +53 -0
  460. package/scripts/lib/figure-format.ts +63 -0
  461. package/scripts/lib/json-value.ts +9 -1
  462. package/scripts/lib/package-manifest.ts +35 -0
  463. package/scripts/lib/read-file.ts +3 -1
  464. package/scripts/lib/stamped-memo.ts +63 -0
  465. package/scripts/lib/stdout-on-stderr.ts +24 -0
  466. package/scripts/lib/timeouts.ts +9 -0
  467. package/scripts/lib/transcript-record.ts +91 -0
  468. package/scripts/lines/effective-limit.ts +1 -1
  469. package/scripts/lint/eslint-cache-dependencies.ts +145 -0
  470. package/scripts/lint/eslint-daemon.ts +265 -0
  471. package/scripts/lint/format.ts +11 -2
  472. package/scripts/lint/import-graph.ts +279 -0
  473. package/scripts/lint/lint-gate-scope.ts +102 -0
  474. package/scripts/lint/lint-parallel-main.ts +19 -0
  475. package/scripts/lint/lint-parallel.ts +62 -30
  476. package/scripts/lint/lint-related-scope.ts +30 -24
  477. package/scripts/lint/lint-related.ts +38 -6
  478. package/scripts/notify/confirmation-options.ts +1 -2
  479. package/scripts/notify/telegram-notify.ts +20 -20
  480. package/scripts/notify/telegram-test-logic.ts +0 -1
  481. package/scripts/notify/telegram-test-main.ts +8 -0
  482. package/scripts/notify/telegram-test.ts +2 -6
  483. package/scripts/observations/observation-ledger.ts +13 -0
  484. package/scripts/observations/observations-flush-landing.ts +5 -3
  485. package/scripts/observations/observations-flush.ts +6 -1
  486. package/scripts/overrides/overrides-check.ts +2 -5
  487. package/scripts/overrides/overrides-files.ts +2 -1
  488. package/scripts/overrides/overrides-logic.ts +3 -6
  489. package/scripts/package/verify-optional-eslint-install.ts +8 -6
  490. package/scripts/propagate/propagate-publish.ts +2 -7
  491. package/scripts/propagate/propagate-targets.ts +4 -12
  492. package/scripts/refactor/import-graph.ts +9 -7
  493. package/scripts/release/github-release-runs.ts +17 -6
  494. package/scripts/release/release-approval-prune.ts +18 -0
  495. package/scripts/release/release-history.ts +1 -3
  496. package/scripts/release/release-progress.ts +42 -22
  497. package/scripts/release/release-publish-run.ts +39 -0
  498. package/scripts/release/release-publish.ts +6 -6
  499. package/scripts/release/release-scope-cli.ts +0 -10
  500. package/scripts/release/release-scope-main.ts +12 -0
  501. package/scripts/repo/repo-setting.ts +3 -6
  502. package/scripts/repo/required-checks-logic.ts +6 -15
  503. package/scripts/report/report-format-reference.ts +2 -0
  504. package/scripts/report/report-labels.ts +155 -0
  505. package/scripts/report/report-lint-cli.ts +3 -0
  506. package/scripts/report/report-lint.ts +85 -110
  507. package/scripts/report/report-template-cli.ts +59 -0
  508. package/scripts/report/report-template.ts +112 -0
  509. package/scripts/review/acceptance-map.ts +1 -0
  510. package/scripts/review/removed-tests-check.ts +86 -0
  511. package/scripts/review/removed-tests.ts +149 -0
  512. package/scripts/review/review-brief-cli.ts +81 -15
  513. package/scripts/review/review-brief-main.ts +12 -0
  514. package/scripts/review/review-brief.ts +31 -3
  515. package/scripts/review/review-code-tree.ts +10 -6
  516. package/scripts/review/review-comment-round.ts +26 -8
  517. package/scripts/review/review-finding-ledger.ts +30 -15
  518. package/scripts/review/review-interaction.ts +94 -0
  519. package/scripts/review/review-readers-scan.ts +163 -0
  520. package/scripts/review/review-record-cli.ts +69 -30
  521. package/scripts/review/review-record-main.ts +12 -0
  522. package/scripts/review/review-round-one-blobs.ts +221 -0
  523. package/scripts/review/review-round2-cli.ts +49 -12
  524. package/scripts/review/review-round2.ts +80 -12
  525. package/scripts/review/review-stamps.ts +19 -1
  526. package/scripts/review/review-stop-log.ts +96 -0
  527. package/scripts/review/review-stops-cli.ts +85 -0
  528. package/scripts/review/review-tree.ts +6 -17
  529. package/scripts/review/review-untouched-readers.ts +146 -0
  530. package/scripts/review/test-titles.ts +118 -0
  531. package/scripts/rules/agent-model.ts +8 -0
  532. package/scripts/rules/bash-triggers.ts +46 -3
  533. package/scripts/rules/decision-oracle-batch.ts +9 -1
  534. package/scripts/rules/decision-oracle.ts +2 -2
  535. package/scripts/rules/delivered-rules.ts +80 -2
  536. package/scripts/rules/destructive-command.ts +8 -1
  537. package/scripts/rules/direct-filing.ts +10 -2
  538. package/scripts/rules/direct-issue-comment.ts +117 -0
  539. package/scripts/rules/direct-pr-create.ts +69 -3
  540. package/scripts/rules/early-heartbeat.ts +2 -1
  541. package/scripts/rules/file-body.ts +7 -0
  542. package/scripts/rules/filing-cap.ts +7 -0
  543. package/scripts/rules/git-argv.ts +72 -14
  544. package/scripts/rules/git-force.ts +12 -2
  545. package/scripts/rules/guard-remedy.ts +4 -0
  546. package/scripts/rules/implementation-cut-verdict.ts +1 -1
  547. package/scripts/rules/implementation-cut.ts +11 -3
  548. package/scripts/rules/index-guard.ts +8 -1
  549. package/scripts/rules/issue-comments.ts +9 -1
  550. package/scripts/rules/josh-git-bare.ts +7 -0
  551. package/scripts/rules/lane-background.ts +67 -25
  552. package/scripts/rules/lane-carry-conflict.ts +6 -0
  553. package/scripts/rules/lane-direct-tool.ts +74 -0
  554. package/scripts/rules/lane-interactive-ask.ts +9 -2
  555. package/scripts/rules/lane-park.ts +45 -23
  556. package/scripts/rules/lane-split-park.ts +10 -2
  557. package/scripts/rules/lane-switch-main.ts +7 -0
  558. package/scripts/rules/oracle-consulted.ts +10 -0
  559. package/scripts/rules/oracle-firing.ts +1 -0
  560. package/scripts/rules/permission-guards.ts +3 -0
  561. package/scripts/rules/piped-verification.ts +1 -1
  562. package/scripts/rules/poll-loop.ts +7 -0
  563. package/scripts/rules/pr-merge.ts +123 -0
  564. package/scripts/rules/protected-files.ts +32 -5
  565. package/scripts/rules/raw-field-body.ts +6 -0
  566. package/scripts/rules/rule-body-guard.ts +8 -0
  567. package/scripts/rules/rule-list.ts +9 -28
  568. package/scripts/rules/rule-value-cache.ts +4 -9
  569. package/scripts/rules/rule-value-cli.ts +51 -32
  570. package/scripts/rules/rule-value.ts +1 -1
  571. package/scripts/rules/shell-segments.ts +35 -0
  572. package/scripts/rules/stop-rule-rows.ts +64 -0
  573. package/scripts/rules/stop-rules.ts +3 -4
  574. package/scripts/rules/test-declared-commit.ts +11 -1
  575. package/scripts/rules/third-party-write.ts +7 -0
  576. package/scripts/rules/timed-rerun.ts +69 -0
  577. package/scripts/rules/worktree-guard.ts +13 -3
  578. package/scripts/run/board/run-board-app-name.ts +23 -0
  579. package/scripts/run/board/run-board-cli.ts +65 -32
  580. package/scripts/run/board/run-board-earlier.ts +94 -0
  581. package/scripts/run/board/run-board-ending-reason.ts +67 -0
  582. package/scripts/run/board/run-board-estimate-schedule.ts +103 -0
  583. package/scripts/run/board/run-board-estimate.ts +98 -0
  584. package/scripts/run/board/run-board-fit.ts +153 -36
  585. package/scripts/run/board/run-board-fold.ts +123 -0
  586. package/scripts/run/board/run-board-fresh.ts +2 -2
  587. package/scripts/run/board/run-board-gather-live.ts +29 -0
  588. package/scripts/run/board/run-board-gather-thread.ts +189 -0
  589. package/scripts/run/board/run-board-gather-worker.ts +29 -0
  590. package/scripts/run/board/run-board-gather.ts +187 -0
  591. package/scripts/run/board/run-board-github.ts +118 -38
  592. package/scripts/run/board/run-board-header.ts +82 -20
  593. package/scripts/run/board/run-board-keys.ts +58 -0
  594. package/scripts/run/board/run-board-kind.ts +20 -6
  595. package/scripts/run/board/run-board-labels.ts +116 -71
  596. package/scripts/run/board/run-board-lane-state.ts +109 -0
  597. package/scripts/run/board/run-board-lane-time.ts +122 -0
  598. package/scripts/run/board/run-board-layout.ts +239 -60
  599. package/scripts/run/board/run-board-length.ts +52 -0
  600. package/scripts/run/board/run-board-machine.ts +8 -4
  601. package/scripts/run/board/run-board-main.ts +12 -0
  602. package/scripts/run/board/run-board-notes.ts +52 -31
  603. package/scripts/run/board/run-board-now.ts +1 -1
  604. package/scripts/run/board/run-board-operation.ts +15 -33
  605. package/scripts/run/board/run-board-phase.ts +1 -1
  606. package/scripts/run/board/run-board-plan-shared.ts +115 -0
  607. package/scripts/run/board/run-board-plan.ts +55 -3
  608. package/scripts/run/board/run-board-planning.ts +45 -0
  609. package/scripts/run/board/run-board-priority.ts +44 -0
  610. package/scripts/run/board/run-board-process-groups.ts +195 -0
  611. package/scripts/run/board/run-board-read.ts +151 -27
  612. package/scripts/run/board/run-board-reason.ts +235 -51
  613. package/scripts/run/board/run-board-released.ts +35 -0
  614. package/scripts/run/board/run-board-render-checks.ts +39 -5
  615. package/scripts/run/board/run-board-render-condition.ts +96 -0
  616. package/scripts/run/board/run-board-render-drawn.ts +67 -0
  617. package/scripts/run/board/run-board-render-foot.ts +59 -0
  618. package/scripts/run/board/run-board-render-icon.ts +35 -0
  619. package/scripts/run/board/run-board-render-lanes.ts +145 -0
  620. package/scripts/run/board/run-board-render-lead.ts +80 -0
  621. package/scripts/run/board/run-board-render-legend.ts +117 -48
  622. package/scripts/run/board/run-board-render-notes.ts +156 -29
  623. package/scripts/run/board/run-board-render-processes.ts +196 -0
  624. package/scripts/run/board/run-board-render-section.ts +119 -0
  625. package/scripts/run/board/run-board-render-slot.ts +3 -36
  626. package/scripts/run/board/run-board-render-tail.ts +115 -48
  627. package/scripts/run/board/run-board-render-time.ts +56 -0
  628. package/scripts/run/board/run-board-render-title.ts +117 -24
  629. package/scripts/run/board/run-board-render-waits.ts +104 -20
  630. package/scripts/run/board/run-board-render.ts +207 -265
  631. package/scripts/run/board/run-board-roots.ts +54 -0
  632. package/scripts/run/board/run-board-row-yield.ts +9 -4
  633. package/scripts/run/board/run-board-setup.ts +1 -12
  634. package/scripts/run/board/run-board-snapshot.ts +111 -0
  635. package/scripts/run/board/run-board-spin.ts +2 -2
  636. package/scripts/run/board/run-board-state.ts +22 -33
  637. package/scripts/run/board/run-board-status.ts +147 -71
  638. package/scripts/run/board/run-board-thanks-read.ts +2 -2
  639. package/scripts/run/board/run-board-tick.ts +122 -107
  640. package/scripts/run/board/run-board-usage-board.ts +78 -0
  641. package/scripts/run/board/run-board-usage-lanes.ts +113 -0
  642. package/scripts/run/board/run-board-usage-listing.ts +93 -0
  643. package/scripts/run/board/run-board-usage-read.ts +120 -150
  644. package/scripts/run/board/run-board-usage-rusage.ts +19 -7
  645. package/scripts/run/board/run-board-usage-text.ts +139 -51
  646. package/scripts/run/board/run-board-usage-top.ts +102 -0
  647. package/scripts/run/board/run-board-usage.ts +89 -72
  648. package/scripts/run/board/run-board-usual.ts +20 -9
  649. package/scripts/run/carry/run-carry-args.ts +4 -7
  650. package/scripts/run/carry/run-carry-conversation.ts +1 -1
  651. package/scripts/run/carry/run-carry.ts +9 -4
  652. package/scripts/run/cut/run-cut-handoff.ts +2 -2
  653. package/scripts/run/event/run-event-cli.ts +1 -5
  654. package/scripts/run/event/run-event-filed.ts +12 -6
  655. package/scripts/run/event/run-event-follow.ts +2 -3
  656. package/scripts/run/event/run-event-render.ts +6 -10
  657. package/scripts/run/event/run-event-scope.ts +2 -2
  658. package/scripts/run/event/run-event-stream-emit.ts +82 -22
  659. package/scripts/run/event/run-event-stream.ts +34 -8
  660. package/scripts/run/hold/run-hold-adopt.ts +65 -0
  661. package/scripts/run/hold/run-hold-cli.ts +93 -22
  662. package/scripts/run/hold/run-hold-main.ts +12 -0
  663. package/scripts/run/hold/run-hold-member.ts +37 -0
  664. package/scripts/run/hold/run-stop-notify.ts +183 -0
  665. package/scripts/run/merge/run-merge-auth.ts +31 -0
  666. package/scripts/run/merge/run-merge-cli.ts +62 -48
  667. package/scripts/run/merge/run-merge-close.ts +74 -0
  668. package/scripts/run/merge/run-merge-collect.ts +6 -13
  669. package/scripts/run/merge/run-merge-driver.ts +71 -0
  670. package/scripts/run/merge/run-merge-main.ts +12 -0
  671. package/scripts/run/merge/run-merge-outcome.ts +23 -0
  672. package/scripts/run/merge/run-merge-restart.ts +39 -0
  673. package/scripts/run/merge/run-merge-ship.ts +20 -4
  674. package/scripts/run/merge/run-merge-signals.ts +33 -9
  675. package/scripts/run/merge/run-merge-steps.ts +120 -85
  676. package/scripts/run/merge/run-merge.ts +38 -37
  677. package/scripts/run/park/run-park-cli.ts +91 -0
  678. package/scripts/run/park/run-park.ts +88 -0
  679. package/scripts/run/park/run-stalled.ts +68 -0
  680. package/scripts/run/pause/run-pause-cli.ts +73 -0
  681. package/scripts/run/pause/run-pause.ts +251 -0
  682. package/scripts/run/progress/run-progress-cli.ts +4 -12
  683. package/scripts/run/progress/run-progress-clock.ts +1 -1
  684. package/scripts/run/progress/run-progress-config.ts +6 -14
  685. package/scripts/run/progress/run-progress-main.ts +12 -0
  686. package/scripts/run/progress/run-progress.ts +1 -4
  687. package/scripts/run/review/run-review.ts +2 -1
  688. package/scripts/run/run-ending.ts +1 -0
  689. package/scripts/run/run-invocation.ts +5 -6
  690. package/scripts/run/run-liveness-cli.ts +6 -8
  691. package/scripts/run/run-liveness.ts +60 -29
  692. package/scripts/run/run-next.ts +1 -1
  693. package/scripts/run/run-parent-cut-hook.ts +2 -2
  694. package/scripts/run/run-preflight.ts +18 -3
  695. package/scripts/run/run-prep-cli.ts +1 -10
  696. package/scripts/run/run-prep-locate.ts +7 -50
  697. package/scripts/run/run-prep-main.ts +12 -0
  698. package/scripts/run/run-prep.ts +6 -0
  699. package/scripts/run/run-report-cli.ts +101 -13
  700. package/scripts/run/run-report-handoff.ts +114 -0
  701. package/scripts/run/run-step.ts +1 -1
  702. package/scripts/run/run-stranded-detect.ts +13 -0
  703. package/scripts/run/run-watcher-guard-cli.ts +1 -1
  704. package/scripts/run/run-watcher-guard.ts +1 -1
  705. package/scripts/run/ship/run-ship-args.ts +121 -0
  706. package/scripts/run/ship/run-ship-body-draft.ts +110 -0
  707. package/scripts/run/ship/run-ship-cli.ts +63 -140
  708. package/scripts/run/ship/run-ship-detach.ts +19 -8
  709. package/scripts/run/ship/run-ship-infra-retry.ts +59 -0
  710. package/scripts/run/ship/run-ship-next.ts +18 -2
  711. package/scripts/run/ship/run-ship-overlap.ts +42 -5
  712. package/scripts/run/ship/run-ship-place.ts +96 -0
  713. package/scripts/run/ship/run-ship-pre-detach-timed.ts +43 -0
  714. package/scripts/run/ship/run-ship-pre-detach.ts +81 -24
  715. package/scripts/run/ship/run-ship-preflight.ts +137 -32
  716. package/scripts/run/ship/run-ship-probe.ts +11 -3
  717. package/scripts/run/ship/run-ship-relaunch-cap.ts +70 -0
  718. package/scripts/run/ship/run-ship-removed-rows.ts +61 -0
  719. package/scripts/run/ship/run-ship-return.ts +107 -23
  720. package/scripts/run/ship/run-ship-review-steps.ts +105 -151
  721. package/scripts/run/ship/run-ship-review.ts +73 -6
  722. package/scripts/run/ship/run-ship-reviewer.ts +207 -0
  723. package/scripts/run/ship/run-ship-stage.ts +55 -6
  724. package/scripts/run/ship/run-ship-steps.ts +46 -15
  725. package/scripts/run/ship/run-ship-stop-cause.ts +135 -0
  726. package/scripts/run/ship/run-ship-stop-text.ts +11 -6
  727. package/scripts/run/ship/run-ship-sync.ts +43 -6
  728. package/scripts/run/ship/run-ship.ts +30 -2
  729. package/scripts/run/tidy/run-tidy-cli.ts +0 -4
  730. package/scripts/run/tidy/run-tidy-lanes.ts +3 -0
  731. package/scripts/run/tidy/run-tidy-main.ts +8 -0
  732. package/scripts/run/wake/run-wake-cli.ts +119 -100
  733. package/scripts/run/wake/run-wake-code.ts +83 -0
  734. package/scripts/run/wake/run-wake-driver.ts +19 -8
  735. package/scripts/run/wake/run-wake-loop.ts +34 -3
  736. package/scripts/run/wake/run-wake-main.ts +13 -0
  737. package/scripts/run/wake/run-wake-ports.ts +90 -0
  738. package/scripts/run/wake/run-wake-takeover.ts +66 -0
  739. package/scripts/run/wake/run-wake.ts +2 -1
  740. package/scripts/safe-chain/pack-hook.ts +2 -2
  741. package/scripts/safe-chain/preinstall-command.ts +2 -1
  742. package/scripts/safe-chain/project-config.ts +3 -9
  743. package/scripts/security/security-audit-main.ts +8 -0
  744. package/scripts/security/security-audit-provision-logic.ts +0 -11
  745. package/scripts/security/security-audit-provision-main.ts +12 -0
  746. package/scripts/security/security-audit-provision.ts +11 -26
  747. package/scripts/security/security-audit.ts +6 -7
  748. package/scripts/self-sync-guard/self-sync-guard-logic.ts +6 -13
  749. package/scripts/split/split-assess-cli.ts +2 -2
  750. package/scripts/split/split-assess.ts +15 -0
  751. package/scripts/split/split-measure.ts +65 -0
  752. package/scripts/sync/claude-settings-merge.ts +8 -15
  753. package/scripts/sync/directory-copy-guard.ts +4 -9
  754. package/scripts/sync/file-content.ts +78 -8
  755. package/scripts/sync/sync-ai-files.ts +3 -5
  756. package/scripts/sync/sync-configs.ts +11 -23
  757. package/scripts/sync/sync-hook-safety.ts +4 -10
  758. package/scripts/sync/sync-main.ts +11 -0
  759. package/scripts/sync/sync.ts +25 -37
  760. package/scripts/test/test-declared-changed.ts +2 -2
  761. package/scripts/test/test-declared.ts +1 -1
  762. package/scripts/test/test-e2e-guard.ts +25 -1
  763. package/scripts/test/test-e2e-stamp.ts +38 -0
  764. package/scripts/test/test-pinned-logic.ts +145 -0
  765. package/scripts/test/test-pinned-main.ts +78 -0
  766. package/scripts/test/test-pinned.ts +100 -0
  767. package/scripts/test/test-read-map.ts +264 -0
  768. package/scripts/test/test-read-recording.ts +91 -0
  769. package/scripts/test/test-read-trace.ts +148 -0
  770. package/scripts/test/test-red-main.ts +12 -0
  771. package/scripts/test/test-red.ts +12 -30
  772. package/scripts/test/test-related-main.ts +18 -0
  773. package/scripts/test/test-related-record.ts +119 -0
  774. package/scripts/test/test-related-scope.ts +229 -43
  775. package/scripts/test/test-related.ts +300 -22
  776. package/scripts/test/test-unit-guard-main.ts +15 -0
  777. package/scripts/test/test-unit-guard.ts +42 -24
  778. package/scripts/test/unit-count-file.ts +37 -0
  779. package/scripts/test/unit-run-marker.ts +162 -0
  780. package/scripts/test/unit-setup-files.ts +51 -0
  781. package/scripts/test/unit-worker-share.ts +61 -149
  782. package/scripts/test/whole-suite-files.ts +63 -0
  783. package/scripts/time-runtime/time-background.ts +20 -2
  784. package/scripts/time-runtime/time-bundles.ts +4 -3
  785. package/scripts/time-runtime/time-density-hook.ts +8 -6
  786. package/scripts/time-runtime/time-followup-stage.ts +1 -3
  787. package/scripts/time-runtime/time-format.ts +5 -28
  788. package/scripts/time-runtime/time-markers.ts +10 -1
  789. package/scripts/time-runtime/time-shell.ts +97 -10
  790. package/scripts/time-runtime/time-transcript-line.ts +49 -62
  791. package/scripts/uninstall/uninstall.ts +1 -1
  792. package/scripts/version/bump-version-main.ts +12 -0
  793. package/scripts/version/bump-version.ts +25 -25
  794. package/scripts/version/effective-upstream.ts +6 -12
  795. package/scripts/version/latest-corepack.ts +17 -32
  796. package/scripts/version/latest-if-required-cli.ts +93 -0
  797. package/scripts/version/latest-lane-guard-main.ts +8 -0
  798. package/scripts/version/latest-lane-guard.ts +0 -4
  799. package/scripts/version/latest-scope-cli.ts +0 -9
  800. package/scripts/version/latest-scope-main.ts +12 -0
  801. package/scripts/version/latest-update.ts +5 -5
  802. package/scripts/version/npm-registry.ts +44 -6
  803. package/scripts/version/publishable-range-check.ts +5 -16
  804. package/scripts/version/release-age.ts +1 -1
  805. package/scripts/version/release-hold.ts +1 -1
  806. package/scripts/version/release-window.ts +38 -0
  807. package/scripts/version/running-binary.ts +1 -1
  808. package/scripts/version/safe-chain-version-update.ts +3 -8
  809. package/scripts/version/version-targets.ts +6 -28
  810. package/templates/dependabot.yml +29 -0
  811. package/templates/gitignore +4 -1
  812. package/templates/pnpm-workspace.basic.yaml +1 -1
  813. package/templates/sonar-project.properties +3 -2
  814. package/templates/workflows/ci.yml +12 -4
  815. package/templates/workflows/github-release.yml +4 -0
  816. package/tsconfig.sonar.json +1 -1
  817. package/.ncurc.json +0 -3
  818. package/dist/hooks/batch-guard.js +0 -29
  819. package/dist/hooks/chunk-4KKD2UTK.js +0 -66
  820. package/dist/hooks/chunk-6TS2JD6D.js +0 -237
  821. package/dist/hooks/chunk-7DSBJVFH.js +0 -50
  822. package/dist/hooks/chunk-A65Y4YOR.js +0 -79
  823. package/dist/hooks/chunk-CDY4NFQG.js +0 -15
  824. package/dist/hooks/chunk-EFXE6C37.js +0 -81
  825. package/dist/hooks/chunk-GP4IEC4O.js +0 -20
  826. package/dist/hooks/chunk-JP45SOCJ.js +0 -56
  827. package/dist/hooks/chunk-LAOV7NLM.js +0 -45
  828. package/dist/hooks/chunk-M4HGZV7U.js +0 -83
  829. package/dist/hooks/chunk-PF2NZL2A.js +0 -131
  830. package/dist/hooks/chunk-PTICX4OL.js +0 -358
  831. package/dist/hooks/chunk-RT27QRJW.js +0 -6247
  832. package/dist/hooks/chunk-SYOTDYCI.js +0 -3533
  833. package/dist/hooks/chunk-UPUZF3AN.js +0 -279
  834. package/dist/hooks/chunk-WK6SMBIC.js +0 -3180
  835. package/dist/hooks/duplicate-read-guard.js +0 -30
  836. package/dist/hooks/investigation-guard.js +0 -29
  837. package/scripts/backlog/backlog-stalled-cli.ts +0 -30
  838. package/scripts/cost-runtime/cost-format.ts +0 -29
  839. package/scripts/init/basic-path-migration.ts +0 -24
  840. package/scripts/issue/issue-backlinks-cli.ts +0 -93
  841. package/scripts/josh/josh-commands-guard.ts +0 -38
  842. package/scripts/josh/josh-usage-automation.ts +0 -121
  843. package/scripts/josh/josh-usage-backlog.ts +0 -180
  844. package/scripts/josh/josh-usage-developer.ts +0 -230
  845. package/scripts/josh/josh-usage-hooks.ts +0 -38
  846. package/scripts/josh/josh-usage-issue.ts +0 -205
  847. package/scripts/josh/josh-usage-review.ts +0 -101
  848. package/scripts/josh/josh-usage-run.ts +0 -252
  849. package/scripts/josh/josh-usage-session.ts +0 -238
  850. package/scripts/josh/josh-usage-workflow.ts +0 -212
  851. package/scripts/lint/cross-file-recheck.ts +0 -155
  852. package/scripts/registry-migration/migrate-logic.ts +0 -237
  853. package/scripts/registry-migration/migrate.ts +0 -292
  854. package/scripts/registry-migration/user-npmrc.ts +0 -15
  855. package/scripts/rules/rule-guard.ts +0 -23
  856. package/scripts/rules/rule-registry-rows.ts +0 -292
  857. package/scripts/rules/rule-registry.ts +0 -112
  858. package/scripts/run/run-stranded-cli.ts +0 -27
@@ -0,0 +1,93 @@
1
+ #!/usr/bin/env tsx
2
+ import { fileURLToPath } from 'node:url'
3
+ import { git_stash } from '#scripts/git/stash/git-stash'
4
+ import { stash_pop_cli } from '#scripts/git/stash/stash-pop-cli'
5
+ import { stash_push_cli } from '#scripts/git/stash/stash-push-cli'
6
+ import { resolve_spawn_exit } from '#scripts/lib/spawn-exit'
7
+ import { execaSync } from 'execa'
8
+ import { latest_scope_cli } from './latest-scope-cli'
9
+
10
+ // `josh latest:if-required` — the dependency update a run owes, in one call.
11
+ //
12
+ // `latest:scope` decides; on `required` the tree is set aside, `josh latest` runs, and the stash is
13
+ // popped by its message. Four procedures used to spell that sequence out, and each copy was one more
14
+ // place to drift from the others. `josh latest` itself stays a fixed `sh -c` chain that takes no
15
+ // arguments, so the conditional form is its own command rather than a flag on it.
16
+ //
17
+ // **Every failure leaves the stash where it is.** A failed update can leave `package.json` half
18
+ // rewritten, and a conflicted pop is a stash git keeps — popping onto either would bury the work
19
+ // under conflicts, so the command stops with the message to pop it by.
20
+
21
+ const ARGV_OFFSET = 2
22
+ const USAGE = 'Usage: josh latest:if-required'
23
+ const STASH_MESSAGE = 'josh latest'
24
+ const LATEST_COMMAND: ReadonlyArray<string> = ['josh', 'latest']
25
+ const PNPM = 'pnpm'
26
+ const SUCCESS_EXIT_CODE = 0
27
+ const FAILURE_EXIT_CODE = 1
28
+ const KEPT_STASH_HINT = `the stash is kept — pop it with \`pnpm josh stash:pop "${STASH_MESSAGE}"\``
29
+ // A conflicted pop has already applied the stash, so popping it again would apply it twice.
30
+ const CONFLICTED_STASH_HINT = `the stash "${STASH_MESSAGE}" is applied and still kept — resolve the conflicts, then drop it`
31
+
32
+ function run_latest(): number {
33
+ const result = execaSync(PNPM, LATEST_COMMAND, { stdio: 'inherit', reject: false })
34
+
35
+ return resolve_spawn_exit(PNPM, result)
36
+ }
37
+
38
+ function stop(reason: string): number {
39
+ console.error(`latest:if-required stopped: ${reason}`)
40
+
41
+ return FAILURE_EXIT_CODE
42
+ }
43
+
44
+ function refuse(): number {
45
+ console.error(USAGE)
46
+
47
+ return FAILURE_EXIT_CODE
48
+ }
49
+
50
+ async function restore(): Promise<number> {
51
+ const code = await stash_pop_cli.run([STASH_MESSAGE])
52
+
53
+ if (code !== SUCCESS_EXIT_CODE) return stop(`the pop failed — ${KEPT_STASH_HINT}`)
54
+ if (await git_stash.has_conflict()) return stop(`the pop conflicted — ${CONFLICTED_STASH_HINT}`)
55
+
56
+ return SUCCESS_EXIT_CODE
57
+ }
58
+
59
+ async function update(): Promise<number> {
60
+ const verdict = await stash_push_cli.set_aside({ message: STASH_MESSAGE, dir: undefined })
61
+ const is_stashed = verdict === stash_push_cli.STASHED_VERDICT
62
+ const code = run_latest()
63
+
64
+ if (code !== SUCCESS_EXIT_CODE) {
65
+ return stop(is_stashed ? `josh latest failed — ${KEPT_STASH_HINT}` : 'josh latest failed')
66
+ }
67
+
68
+ return is_stashed ? await restore() : SUCCESS_EXIT_CODE
69
+ }
70
+
71
+ // The scope on stdout and its reason on stderr, the split `latest:scope` prints in, so the log
72
+ // says why the update ran or did not.
73
+ async function run(argv: ReadonlyArray<string>): Promise<number> {
74
+ if (argv.length > 0) return refuse()
75
+
76
+ const decision = latest_scope_cli.scope_decision()
77
+
78
+ console.info(decision.scope)
79
+ console.error(decision.reason)
80
+ if (decision.scope === latest_scope_cli.SKIPPED_SCOPE) return SUCCESS_EXIT_CODE
81
+
82
+ return await update()
83
+ }
84
+
85
+ async function main(argv: ReadonlyArray<string>): Promise<void> {
86
+ process.exitCode = await run(argv)
87
+ }
88
+
89
+ const latest_if_required_cli = { run, STASH_MESSAGE }
90
+
91
+ if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
92
+
93
+ export { latest_if_required_cli }
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env tsx
2
+ import { fileURLToPath } from 'node:url'
3
+ import { latest_lane_guard } from './latest-lane-guard'
4
+
5
+ // The `josh latest:guard` entry, kept apart from `latest-lane-guard.ts` because `latest:scope` imports
6
+ // that one: a bundle is one file, so a main guard there would fire for every command that carries it
7
+ // (joshuafolkken/kit#4186). The guard takes no arguments and sets its own exit code.
8
+ if (process.argv[1] === fileURLToPath(import.meta.url)) latest_lane_guard.main()
@@ -1,5 +1,3 @@
1
- #!/usr/bin/env tsx
2
- import { fileURLToPath } from 'node:url'
3
1
  import { lane_paths, type LaneEnvironment } from '#scripts/lane/lane-paths'
4
2
 
5
3
  // Refuse a dependency update inside a lane.
@@ -44,6 +42,4 @@ const latest_lane_guard = {
44
42
  main,
45
43
  }
46
44
 
47
- if (process.argv[1] === fileURLToPath(import.meta.url)) main()
48
-
49
45
  export { latest_lane_guard }
@@ -1,5 +1,3 @@
1
- #!/usr/bin/env tsx
2
- import { fileURLToPath } from 'node:url'
3
1
  import { latest_lane_guard } from './latest-lane-guard'
4
2
  import { latest_stamp, type LatestStamp } from './latest-stamp'
5
3
 
@@ -14,7 +12,6 @@ import { latest_stamp, type LatestStamp } from './latest-stamp'
14
12
  // paths*, and this decides from *when the last run happened*. The flag parsing and the printing are the small half;
15
13
  // the read of the diff is what that module exists for, and this command never makes one.
16
14
 
17
- const ARGV_OFFSET = 2
18
15
  const USAGE = 'Usage: josh latest:scope [--record] [--json]'
19
16
  const JSON_KEY = 'scope'
20
17
  const JSON_FLAG = '--json'
@@ -124,10 +121,6 @@ function run(argv: ReadonlyArray<string>): number {
124
121
  return 0
125
122
  }
126
123
 
127
- function main(argv: ReadonlyArray<string>): void {
128
- process.exitCode = run(argv)
129
- }
130
-
131
124
  const latest_scope_cli = {
132
125
  decide,
133
126
  JSON_KEY,
@@ -140,6 +133,4 @@ const latest_scope_cli = {
140
133
  USAGE,
141
134
  }
142
135
 
143
- if (process.argv[1] === fileURLToPath(import.meta.url)) main(process.argv.slice(ARGV_OFFSET))
144
-
145
136
  export { latest_scope_cli }
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env tsx
2
+ import { fileURLToPath } from 'node:url'
3
+ import { latest_scope_cli } from './latest-scope-cli'
4
+
5
+ // The `josh latest:scope` entry, kept apart from `latest-scope-cli.ts` because other modules import
6
+ // that one: a bundle is one file, so a main guard there would fire for every command that carries it
7
+ // (joshuafolkken/kit#4186).
8
+ if (process.argv[1] === fileURLToPath(import.meta.url)) {
9
+ const ARGV_OFFSET = 2
10
+
11
+ process.exitCode = latest_scope_cli.run(process.argv.slice(ARGV_OFFSET))
12
+ }
@@ -6,6 +6,7 @@
6
6
  */
7
7
  import { readFileSync, writeFileSync } from 'node:fs'
8
8
  import { fileURLToPath } from 'node:url'
9
+ import { PACKAGE_JSON } from '#scripts/lib/package-manifest'
9
10
  import { file_reader } from '#scripts/lib/read-file'
10
11
  import { lockfile_overrides } from '#scripts/overrides/lockfile-overrides'
11
12
  import { overrides_files } from '#scripts/overrides/overrides-files'
@@ -16,7 +17,6 @@ import { latest_regression, type VersionRegression } from './latest-regression'
16
17
  import { playwright_browsers } from './playwright-browsers'
17
18
  import { safe_chain_version_update } from './safe-chain-version-update'
18
19
 
19
- const PACKAGE_JSON_PATH = 'package.json'
20
20
  const LOCKFILE_PATH = 'pnpm-lock.yaml'
21
21
 
22
22
  interface TreeSnapshot {
@@ -44,7 +44,7 @@ function run_update_stages(stages: Array<Array<string>>): number {
44
44
 
45
45
  function take_snapshot(): TreeSnapshot {
46
46
  return {
47
- package_json: readFileSync(PACKAGE_JSON_PATH, 'utf8'),
47
+ package_json: readFileSync(PACKAGE_JSON, 'utf8'),
48
48
  lockfile: file_reader.read_file_or_empty(LOCKFILE_PATH),
49
49
  }
50
50
  }
@@ -54,7 +54,7 @@ function take_snapshot(): TreeSnapshot {
54
54
  // "the latest release is <older>". The captured lockfile still carries the resolved URL and
55
55
  // integrity, which installs fine.
56
56
  function restore_snapshot(snapshot: TreeSnapshot): void {
57
- writeFileSync(PACKAGE_JSON_PATH, snapshot.package_json)
57
+ writeFileSync(PACKAGE_JSON, snapshot.package_json)
58
58
  if (snapshot.lockfile.length > 0) writeFileSync(LOCKFILE_PATH, snapshot.lockfile)
59
59
  }
60
60
 
@@ -71,7 +71,7 @@ function report_kept_back(regressions: ReadonlyArray<VersionRegression>): void {
71
71
  const PNPM_UPDATE_ALL_TIERS = ['pnpm', 'update']
72
72
 
73
73
  function build_update_commands(): Array<Array<string>> {
74
- const content = readFileSync(PACKAGE_JSON_PATH, 'utf8')
74
+ const content = readFileSync(PACKAGE_JSON, 'utf8')
75
75
  const latest = overrides_check.build_update_command(
76
76
  overrides_files.read_current_overrides(),
77
77
  content,
@@ -87,7 +87,7 @@ interface UpdateOutcome {
87
87
  }
88
88
 
89
89
  function find_regressions_after_update(snapshot: TreeSnapshot): Array<VersionRegression> {
90
- const after = readFileSync(PACKAGE_JSON_PATH, 'utf8')
90
+ const after = readFileSync(PACKAGE_JSON, 'utf8')
91
91
 
92
92
  return latest_regression.find_regressions(snapshot.package_json, after)
93
93
  }
@@ -1,6 +1,5 @@
1
1
  import { json_value } from '#scripts/lib/json-value'
2
- import { FETCH_TIMEOUT_MS } from '#scripts/lib/timeouts'
3
- import { migrate_logic } from '#scripts/registry-migration/migrate-logic'
2
+ import { COMMAND_TIMEOUT_MS, FETCH_TIMEOUT_MS } from '#scripts/lib/timeouts'
4
3
  import { execaSync } from 'execa'
5
4
  import semver from 'semver'
6
5
  import { z } from 'zod'
@@ -18,8 +17,19 @@ const SCOPE_SEPARATOR = '/'
18
17
  const ENCODED_SCOPE_SEPARATOR = '%2f'
19
18
  const SCOPE_PATTERN = /^@[^/]+(?=\/)/u
20
19
  const SCOPE_REGISTRY_SUFFIX = ':registry'
20
+ const GITHUB_REGISTRY_HOST = 'npm.pkg.github.com'
21
+ const PNPM = 'pnpm'
22
+ const JSON_FLAG = '--json'
23
+ const FAILURE_EXIT_CODE = 1
21
24
  const github_scopes = new Map<string, boolean>()
22
25
 
26
+ type ViewFormat = 'json' | 'text'
27
+
28
+ interface ViewAnswer {
29
+ exit_code: number
30
+ stdout: string
31
+ }
32
+
23
33
  // The version commands are synchronous end to end and exported that way to consumers, so the
24
34
  // request runs in a child Node process rather than turning the whole chain async. Node's own
25
35
  // `fetch` needs no external binary, and a non-2xx answer exits non-zero so it reads as "no answer".
@@ -53,19 +63,30 @@ function read_packument(package_name: string, accept: string): unknown {
53
63
  return json_value.parse_or_undefined(result.stdout)
54
64
  }
55
65
 
56
- // Whether this checkout installs the package's scope from GitHub Packages, read with the same
57
- // `pnpm config get` `josh registry:migrate` uses (project `.npmrc` over user `~/.npmrc`). The two
66
+ // The host is compared, not searched for, so a registry carrying it only in its path is not GitHub.
67
+ function is_github_registry(value: string): boolean {
68
+ try {
69
+ const url = new URL(value)
70
+
71
+ return url.protocol === 'https:' && url.hostname === GITHUB_REGISTRY_HOST
72
+ } catch {
73
+ return false
74
+ }
75
+ }
76
+
77
+ // Whether this checkout installs the package's scope from GitHub Packages, read with
78
+ // `pnpm config get` (project `.npmrc` over user `~/.npmrc`). The two
58
79
  // registries are published by parallel jobs and can drift, so a consumer routed to GitHub Packages
59
80
  // keeps reading it: public npm could otherwise offer a release its registry does not carry yet.
60
81
  // Memoized per scope — kit and app-kit share one, and one report asks for both packages.
61
82
  function is_github_scope(scope: string): boolean {
62
83
  const is_cached_github = github_scopes.get(scope)
63
84
  if (is_cached_github !== undefined) return is_cached_github
64
- const result = execaSync('pnpm', ['config', 'get', `${scope}${SCOPE_REGISTRY_SUFFIX}`], {
85
+ const result = execaSync(PNPM, ['config', 'get', `${scope}${SCOPE_REGISTRY_SUFFIX}`], {
65
86
  reject: false,
66
87
  timeout: FETCH_TIMEOUT_MS,
67
88
  })
68
- const is_github = result.exitCode === 0 && migrate_logic.is_github_tarball(result.stdout.trim())
89
+ const is_github = result.exitCode === 0 && is_github_registry(result.stdout.trim())
69
90
 
70
91
  github_scopes.set(scope, is_github)
71
92
 
@@ -106,6 +127,21 @@ function has_public_version(package_name: string, version: string): boolean {
106
127
  return parsed.success && parsed.data.time[version] !== undefined
107
128
  }
108
129
 
130
+ // A `pnpm view` answer, for a question that has to see what the package manager sees: the
131
+ // checkout's own registry routing, and safe-chain's minimum-age filter when it is shimmed on PATH.
132
+ // `pnpm` rather than `npm`, because npm refuses to run at all inside a project whose
133
+ // `devEngines.packageManager` names pnpm with an `onFail` other than `"warn"` / `"ignore"` (kit
134
+ // ships `"download"`), failing with EBADDEVENGINES instead of answering.
135
+ function view(spec: string, field: string, format: ViewFormat = 'text'): ViewAnswer {
136
+ const format_arguments = format === 'json' ? [JSON_FLAG] : []
137
+ const result = execaSync(PNPM, ['view', spec, field, ...format_arguments], {
138
+ reject: false,
139
+ timeout: COMMAND_TIMEOUT_MS,
140
+ })
141
+
142
+ return { exit_code: result.exitCode ?? FAILURE_EXIT_CODE, stdout: result.stdout }
143
+ }
144
+
109
145
  // The version itself, or nothing when it is not exactly a semver version.
110
146
  function valid_version(value: string): string | undefined {
111
147
  return version_schema.safeParse(value).success ? value : undefined
@@ -117,6 +153,8 @@ const npm_registry = {
117
153
  read_latest,
118
154
  read_release_times,
119
155
  valid_version,
156
+ view,
120
157
  }
121
158
 
122
159
  export { npm_registry }
160
+ export type { ViewAnswer }
@@ -9,8 +9,8 @@ import { existsSync, readFileSync } from 'node:fs'
9
9
  import path from 'node:path'
10
10
  import { fileURLToPath } from 'node:url'
11
11
  import { adopt_toolkits } from '#scripts/adopt/adopt-toolkits'
12
- import { COMMAND_TIMEOUT_MS } from '#scripts/lib/timeouts'
13
- import { execaSync } from 'execa'
12
+ import { PACKAGE_JSON } from '#scripts/lib/package-manifest'
13
+ import { npm_registry } from './npm-registry'
14
14
  import { peer_floor } from './peer-floor'
15
15
  import {
16
16
  publishable_range,
@@ -19,7 +19,6 @@ import {
19
19
  type RangeProbe,
20
20
  } from './publishable-range'
21
21
 
22
- const PACKAGE_JSON_PATH = 'package.json'
23
22
  const FAILURE_EXIT_CODE = 1
24
23
  const NODE_MODULES = 'node_modules'
25
24
 
@@ -27,18 +26,8 @@ const NODE_MODULES = 'node_modules'
27
26
  // managers on PATH, so the answer comes back already filtered by the same minimum-age policy a
28
27
  // consumer installs under. A plain fetch would read the unfiltered registry and pass a range no
29
28
  // consumer can resolve — the exact blind spot this guard exists to close.
30
- //
31
- // `pnpm view` rather than `npm view` because npm refuses to run at all inside a project whose
32
- // `devEngines.packageManager` names pnpm with an `onFail` other than `"warn"` / `"ignore"` (kit
33
- // ships `"download"`, which npm refuses on just the same), failing every probe with
34
- // EBADDEVENGINES instead of answering. Both are shimmed, so the filtered view is preserved.
35
29
  function probe_range(name: string, range: string): ProbeResult {
36
- const result = execaSync('pnpm', ['view', `${name}@${range}`, 'version'], {
37
- reject: false,
38
- timeout: COMMAND_TIMEOUT_MS,
39
- })
40
-
41
- return { exit_code: result.exitCode ?? FAILURE_EXIT_CODE, stdout: result.stdout }
30
+ return npm_registry.view(`${name}@${range}`, 'version')
42
31
  }
43
32
 
44
33
  function report(violations: ReadonlyArray<PublishedRange>, total: number): number {
@@ -90,14 +79,14 @@ function check_peer_floors(
90
79
  function read_installed_toolkit_manifests(project_root: string): Array<string> {
91
80
  return adopt_toolkits
92
81
  .all_declared_toolkits(project_root)
93
- .map((package_name) => path.join(project_root, NODE_MODULES, package_name, PACKAGE_JSON_PATH))
82
+ .map((package_name) => path.join(project_root, NODE_MODULES, package_name, PACKAGE_JSON))
94
83
  .filter((manifest_path) => existsSync(manifest_path))
95
84
  .map((manifest_path) => readFileSync(manifest_path, 'utf8'))
96
85
  }
97
86
 
98
87
  // Both checks always run, so one invocation reports everything there is to fix.
99
88
  function main(): void {
100
- const package_json_content = readFileSync(PACKAGE_JSON_PATH, 'utf8')
89
+ const package_json_content = readFileSync(PACKAGE_JSON, 'utf8')
101
90
  const range_exit_code = check(package_json_content, probe_range)
102
91
  const toolkit_json_contents = read_installed_toolkit_manifests(process.cwd())
103
92
  const peer_exit_code = check_peer_floors(package_json_content, toolkit_json_contents)
@@ -1,5 +1,6 @@
1
1
  import { readFileSync } from 'node:fs'
2
2
  import path from 'node:path'
3
+ import { MS_PER_MINUTE } from '#scripts/lib/timeouts'
3
4
  import { yaml_document } from '#scripts/lib/yaml-document'
4
5
  import semver from 'semver'
5
6
  import { z } from 'zod'
@@ -20,7 +21,6 @@ const workspace_age_schema = z.object({ minimumReleaseAge: z.number().int().nonn
20
21
  // A version → ISO publish date map, the shape both the registry and the GitHub Packages API are
21
22
  // reduced to before the aged-version selection runs.
22
23
  const release_times_schema = z.record(z.string(), z.string())
23
- const MS_PER_MINUTE = 60_000
24
24
 
25
25
  function parse_workspace(workspace_content: string): unknown {
26
26
  try {
@@ -1,3 +1,4 @@
1
+ import { MS_PER_MINUTE } from '#scripts/lib/timeouts'
1
2
  import semver from 'semver'
2
3
  import { release_age } from './release-age'
3
4
 
@@ -18,7 +19,6 @@ import { release_age } from './release-age'
18
19
  // which is why this explanation is attached there and nowhere else.
19
20
 
20
21
  const MINUTES_PER_HOUR = 60
21
- const MS_PER_MINUTE = 60_000
22
22
  const HOLD_LABEL = 'Held:'
23
23
 
24
24
  // Whether `latest` is itself inside the window — the precondition for a hold existing at all. Without
@@ -0,0 +1,38 @@
1
+ import path from 'node:path'
2
+ import { file_reader } from '#scripts/lib/read-file'
3
+ import { yaml_document } from '#scripts/lib/yaml-document'
4
+ import { z } from 'zod'
5
+ import { release_age } from './release-age'
6
+
7
+ // The release-age window a workspace declares — its minutes and the packages exempt from it. This is
8
+ // the one reading every mirror of the window derives from: Safe Chain's `.aikido` and Dependabot's
9
+ // `cooldown` both take it from here rather than parsing `pnpm-workspace.yaml` themselves.
10
+ const WORKSPACE_FILE = 'pnpm-workspace.yaml'
11
+ const exclusions_schema = z.object({ minimumReleaseAgeExclude: z.array(z.string()).optional() })
12
+
13
+ // The window a project without a declared one is held to, in minutes (three days). kit's own
14
+ // `pnpm-workspace.yaml` declares the same value.
15
+ const DEFAULT_RELEASE_AGE_MINUTES = 4320
16
+
17
+ interface ReleaseWindow {
18
+ minutes: number | undefined
19
+ exclusions: ReadonlyArray<string>
20
+ }
21
+
22
+ function parse_release_window(workspace: string): ReleaseWindow {
23
+ const exclusions = exclusions_schema.parse(yaml_document.parse_yaml(workspace))
24
+
25
+ return {
26
+ minutes: release_age.parse_declared_minimum_release_age(workspace),
27
+ exclusions: exclusions.minimumReleaseAgeExclude ?? [],
28
+ }
29
+ }
30
+
31
+ // An absent workspace file reads as an empty one: no declared window and no exclusions.
32
+ function read_release_window(root: string): ReleaseWindow {
33
+ return parse_release_window(file_reader.read_file_or_empty(path.join(root, WORKSPACE_FILE)))
34
+ }
35
+
36
+ const release_window = { parse_release_window, read_release_window }
37
+
38
+ export { DEFAULT_RELEASE_AGE_MINUTES, release_window, type ReleaseWindow }
@@ -1,9 +1,9 @@
1
1
  import { existsSync, readFileSync } from 'node:fs'
2
2
  import path from 'node:path'
3
3
  import { json_value } from '#scripts/lib/json-value'
4
+ import { PACKAGE_JSON } from '#scripts/lib/package-manifest'
4
5
  import { package_version_schema } from '#scripts/lib/schemas'
5
6
 
6
- const PACKAGE_JSON = 'package.json'
7
7
  // Scripts live two levels under the package root (scripts/<group>/<file>.ts), so the running
8
8
  // binary's own package.json is reached by walking up twice from the script directory.
9
9
  const SCRIPT_DEPTH_FROM_ROOT = ['..', '..'] as const
@@ -1,20 +1,15 @@
1
- import { COMMAND_TIMEOUT_MS } from '#scripts/lib/timeouts'
2
1
  import { ci_installer_pin } from '#scripts/safe-chain/ci-installer-pin'
3
2
  import { npm_registry } from '#scripts/version/npm-registry'
4
- import { execaSync } from 'execa'
5
3
 
6
4
  const SAFE_CHAIN_PKG = '@aikidosec/safe-chain'
7
5
 
8
6
  // The registry's answer is trusted only as an exact semver version: it ends up in workflow files and
9
7
  // in the installer URL.
10
8
  function fetch_latest_version(): string | undefined {
11
- const result = execaSync('npm', ['view', SAFE_CHAIN_PKG, 'version'], {
12
- reject: false,
13
- timeout: COMMAND_TIMEOUT_MS,
14
- })
15
- if (result.exitCode !== 0 || !result.stdout) return undefined
9
+ const answer = npm_registry.view(SAFE_CHAIN_PKG, 'version')
10
+ if (answer.exit_code !== 0 || !answer.stdout) return undefined
16
11
 
17
- return npm_registry.valid_version(result.stdout.trim())
12
+ return npm_registry.valid_version(answer.stdout.trim())
18
13
  }
19
14
 
20
15
  // The hash-verified installer pinned in the workflows is the one place a safe-chain release is
@@ -1,11 +1,10 @@
1
1
  import path from 'node:path'
2
2
  import { json_value } from '#scripts/lib/json-value'
3
- import { file_reader } from '#scripts/lib/read-file'
3
+ import { package_manifest } from '#scripts/lib/package-manifest'
4
4
  import { package_version_schema, pnpm_ls_global_schema } from '#scripts/lib/schemas'
5
5
  import { execaSync } from 'execa'
6
6
 
7
7
  const NODE_MODULES = 'node_modules'
8
- const PACKAGE_JSON = 'package.json'
9
8
 
10
9
  // Build the `pnpm ls -g --json <package>` arguments for the package being checked.
11
10
  function build_pnpm_ls_arguments(package_name: string): Array<string> {
@@ -21,40 +20,25 @@ function parse_global_version(stdout: string, package_name: string): string | un
21
20
  return parsed.data[0]?.dependencies?.[package_name]?.version
22
21
  }
23
22
 
24
- // Read the project-local version from a node_modules package.json string. Undefined when the
25
- // file is missing (raw is undefined) or malformed.
26
- function parse_project_version(raw: string | undefined): string | undefined {
27
- if (raw === undefined) return undefined
28
- const parsed = package_version_schema.safeParse(json_value.parse_or_undefined(raw))
29
-
30
- return parsed.success ? parsed.data.version : undefined
31
- }
32
-
33
23
  function read_global_version(package_name: string): string | undefined {
34
24
  const result = execaSync('pnpm', build_pnpm_ls_arguments(package_name), { reject: false })
35
25
 
36
26
  return parse_global_version(result.stdout, package_name)
37
27
  }
38
28
 
39
- function project_package_path(cwd: string, package_name: string): string {
40
- return path.join(cwd, NODE_MODULES, package_name, PACKAGE_JSON)
41
- }
42
-
29
+ // Read the project-local version from <cwd>/node_modules/<package>/package.json. Undefined when the
30
+ // file is missing or malformed.
43
31
  function read_project_version(cwd: string, package_name: string): string | undefined {
44
- const package_path = project_package_path(cwd, package_name)
45
- const raw = file_reader.read_optional(package_path)
32
+ const package_directory = path.join(cwd, NODE_MODULES, package_name)
46
33
 
47
- return parse_project_version(raw)
34
+ return package_manifest.read_manifest_if_valid(package_directory, package_version_schema)?.version
48
35
  }
49
36
 
50
37
  // Read the current project's own declared version from <cwd>/package.json. This is the version
51
38
  // that `josh bump` increments — distinct from read_project_version, which reads the installed kit
52
39
  // package version under node_modules.
53
40
  function read_workspace_version(cwd: string): string | undefined {
54
- const package_path = path.join(cwd, PACKAGE_JSON)
55
- const raw = file_reader.read_optional(package_path)
56
-
57
- return parse_project_version(raw)
41
+ return package_manifest.read_manifest_if_valid(cwd, package_version_schema)?.version
58
42
  }
59
43
 
60
44
  // `format_project_version_line` / `project_version_line` lived here and formatted
@@ -67,15 +51,9 @@ function read_workspace_version(cwd: string): string | undefined {
67
51
  const version_targets = {
68
52
  build_pnpm_ls_arguments,
69
53
  parse_global_version,
70
- parse_project_version,
71
54
  read_global_version,
72
55
  read_project_version,
73
- project_package_path,
74
56
  read_workspace_version,
75
- // The manifest's filename. Exported rather than re-declared in each of `josh release`'s two
76
- // halves: the module that already owns "where the project's manifest is"
77
- // is where the name belongs.
78
- PACKAGE_JSON,
79
57
  }
80
58
 
81
59
  export { version_targets }
@@ -0,0 +1,29 @@
1
+ version: 2
2
+ updates:
3
+ # The local composite actions pin actions of their own, and Dependabot reads only the directories
4
+ # it is given — `/` covers `.github/workflows` and no `.github/actions/*/action.yml`.
5
+ - package-ecosystem: 'github-actions'
6
+ directories:
7
+ - '/'
8
+ - '/.github/actions/*'
9
+ schedule:
10
+ interval: 'weekly'
11
+ cooldown:
12
+ default-days: 3
13
+ # Version updates are disabled: `josh latest` runs at the start of every fullrun / halfrun /
14
+ # queue and already bumps npm dependencies to latest, so Dependabot's weekly PRs only duplicate
15
+ # it and were being closed unmerged after consuming a full CI run. `open-pull-requests-limit: 0`
16
+ # disables version updates only — security update PRs "are not subject to this limit and do not
17
+ # count toward it" (GitHub's Dependabot options reference), so an advisory still opens a PR,
18
+ # which is the one case `josh latest` does not cover on its own. That fallback needs Dependabot
19
+ # security updates enabled on the repository (Settings > Advanced Security); without it this file
20
+ # leaves no npm Dependabot PRs at all. See joshuafolkken/kit#803.
21
+ - package-ecosystem: 'npm'
22
+ directory: '/'
23
+ schedule:
24
+ interval: 'weekly'
25
+ open-pull-requests-limit: 0
26
+ cooldown:
27
+ default-days: 3
28
+ exclude:
29
+ - 'vite'
@@ -78,7 +78,10 @@ e2e/.auth/chrome-profile/
78
78
  .claude/scheduled_tasks.lock
79
79
  .claude/tmp/
80
80
 
81
- # Run handoff notes (written for josh run:cut --handoff); they belong in .claude/tmp/, and the
81
+ # Scratch files any agent writes (Issue / PR bodies, plans, handoffs, logs); the rest of .josh/ is tracked
82
+ .josh/tmp/
83
+
84
+ # Run handoff notes (written for josh run:cut --handoff); they belong in .josh/tmp/, and the
82
85
  # names below are the ones that were once written beside the code and committed with it
83
86
  /.git-handoff-*.json
84
87
  /.josh-handoff-*.json
@@ -6,5 +6,5 @@ allowBuilds:
6
6
  unrs-resolver: true
7
7
 
8
8
  # pnpm 12 reads these settings from this file only; the same lines in .npmrc are ignored (kit #3267).
9
- minimumReleaseAge: 1440
9
+ minimumReleaseAge: 4320
10
10
  engineStrict: true
@@ -71,8 +71,9 @@ sonar.issue.ignore.multicriteria.e14.resourceKey=**/*
71
71
 
72
72
  # Files to exclude from the duplicate check.
73
73
  # Snapshot files (.snap) contain machine-generated repetitive patterns and are not authored code.
74
- # Command-registry files (josh-commands-*.ts) are data definitions that follow a fixed schema;
75
- # structural similarity between entries is inherent and expected, not logic duplication.
74
+ # Command-registry files (josh-commands-*.ts) are data
75
+ # definitions that follow a fixed schema; structural similarity between entries is inherent and
76
+ # expected, not logic duplication.
76
77
  sonar.cpd.exclusions=**/*.test.ts,**/*.spec.ts,**/*.e2e.ts,**/*.snap,**/josh-commands-*.ts
77
78
 
78
79
  # Use SonarCloud-compatible tsconfig
@@ -125,6 +125,7 @@ jobs:
125
125
  persist-credentials: false
126
126
 
127
127
  - name: Setup Node.js
128
+ id: setup-node
128
129
  uses: ./.github/actions/setup-node
129
130
 
130
131
  - name: Configure GitHub Packages authentication for existing projects
@@ -144,11 +145,18 @@ jobs:
144
145
  # save nothing back under the key it already hit — a cold lint on every later run.
145
146
  # joshuafolkken/kit#2054: the commit sha makes each run save its warmed cache under a fresh
146
147
  # key, while the sha-less prefix restores the newest entry from an earlier run.
147
- key: ${{ runner.os }}-eslint-cache-${{ hashFiles('pnpm-lock.yaml') }}-${{ hashFiles('eslint.config.js', 'eslint/**/*.js') }}-${{ github.sha }}
148
+ # joshuafolkken/kit#4346: ESLint hashes `process.version` into every entry, and runner
149
+ # images carry different Node.js patch releases for `'24'`, so a restore across two of them
150
+ # lints cold. The resolved version leads every key: each release keeps its own lineage.
151
+ # joshuafolkken/kit#4496: the key is not built from kit's toolchain input list — the cache
152
+ # is restored before the install, and this workflow has no kit source to run. The lockfile
153
+ # and eslint config hashes move it with the two inputs ESLint's own per-entry check does
154
+ # not cover.
155
+ key: ${{ runner.os }}-eslint-cache-${{ steps.setup-node.outputs.node-version }}-${{ hashFiles('pnpm-lock.yaml') }}-${{ hashFiles('eslint.config.js', 'eslint/**/*.js') }}-${{ github.sha }}
148
156
  restore-keys: |
149
- ${{ runner.os }}-eslint-cache-${{ hashFiles('pnpm-lock.yaml') }}-${{ hashFiles('eslint.config.js', 'eslint/**/*.js') }}-
150
- ${{ runner.os }}-eslint-cache-${{ hashFiles('pnpm-lock.yaml') }}-
151
- ${{ runner.os }}-eslint-cache-
157
+ ${{ runner.os }}-eslint-cache-${{ steps.setup-node.outputs.node-version }}-${{ hashFiles('pnpm-lock.yaml') }}-${{ hashFiles('eslint.config.js', 'eslint/**/*.js') }}-
158
+ ${{ runner.os }}-eslint-cache-${{ steps.setup-node.outputs.node-version }}-${{ hashFiles('pnpm-lock.yaml') }}-
159
+ ${{ runner.os }}-eslint-cache-${{ steps.setup-node.outputs.node-version }}-
152
160
 
153
161
  - name: Setup cspell cache
154
162
  uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
@@ -41,6 +41,10 @@ jobs:
41
41
  env:
42
42
  DISPATCH_TAG: ${{ github.event.client_payload.tag }}
43
43
  run: |
44
+ if ! [[ "$DISPATCH_TAG" =~ ^v[0-9]+\.[0-9]+\.[0-9]+([.-][0-9A-Za-z.-]+)?$ ]]; then
45
+ echo "::error::Invalid tag format: $DISPATCH_TAG" >&2
46
+ exit 1
47
+ fi
44
48
  echo "tag=$DISPATCH_TAG" >> "$GITHUB_OUTPUT"
45
49
  if [ -f .github/workflows/publish.yml ]; then
46
50
  echo "workflow=publish.yml" >> "$GITHUB_OUTPUT"