@joshuafolkken/kit 1.1050.0 → 1.1128.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 (630) hide show
  1. package/.claude/settings.json +9 -8
  2. package/.claude/skills/epic-commands/SKILL.md +5 -7
  3. package/.claude/skills/workflow-commands/SKILL.md +20 -12
  4. package/.claude/skills/workflow-commands/background-commands.md +36 -84
  5. package/.claude/skills/workflow-commands/backlogrun-child.md +1 -1
  6. package/.claude/skills/workflow-commands/backlogrun-lanes.md +8 -6
  7. package/.claude/skills/workflow-commands/backlogrun-progress.md +30 -33
  8. package/.claude/skills/workflow-commands/backlogrun-steps.md +12 -12
  9. package/.claude/skills/workflow-commands/backlogrun.md +2 -2
  10. package/.claude/skills/workflow-commands/chain-rule.md +4 -2
  11. package/.claude/skills/workflow-commands/delegation.md +3 -3
  12. package/.claude/skills/workflow-commands/followup-reference.md +1 -1
  13. package/.claude/skills/workflow-commands/followup.md +7 -3
  14. package/.claude/skills/workflow-commands/fullrun-steps.md +3 -2
  15. package/.claude/skills/workflow-commands/fullrun.md +8 -6
  16. package/.claude/skills/workflow-commands/halfrun.md +19 -21
  17. package/.claude/skills/workflow-commands/issue-comments.md +1 -1
  18. package/.claude/skills/workflow-commands/issue-fold-existing.md +10 -10
  19. package/.claude/skills/workflow-commands/issue-scout.md +1 -1
  20. package/.claude/skills/workflow-commands/kickoff.md +9 -4
  21. package/.claude/skills/workflow-commands/latest-gate.md +8 -16
  22. package/.claude/skills/workflow-commands/needs-human-review.md +1 -1
  23. package/.claude/skills/workflow-commands/observation-filing.md +3 -3
  24. package/.claude/skills/workflow-commands/pre-gate-cut.md +4 -8
  25. package/.claude/skills/workflow-commands/prerequisite.md +1 -1
  26. package/.claude/skills/workflow-commands/prrun.md +36 -0
  27. package/.claude/skills/workflow-commands/retrospective.md +1 -1
  28. package/.claude/skills/workflow-commands/split-assessment.md +4 -18
  29. package/.claude/skills/workflow-commands/working-tree-hold.md +22 -2
  30. package/.codex/hooks.json +16 -20
  31. package/.github/actions/setup-node/action.yml +33 -0
  32. package/.github/actions/setup-pnpm/action.yml +93 -0
  33. package/.github/dependabot.yml +5 -1
  34. package/.github/workflows/auto-tag.yml +2 -3
  35. package/.github/workflows/ci.yml +31 -134
  36. package/.github/workflows/dependabot-auto-merge.yml +1 -0
  37. package/.github/workflows/pr-classification.yml +6 -44
  38. package/.github/workflows/production.yml +1 -0
  39. package/.github/workflows/publish.yml +43 -47
  40. package/.github/workflows/sonar-qube.yml +41 -4
  41. package/.pnpmfile.mjs +29 -0
  42. package/AGENTS.md +5 -2
  43. package/CLAUDE.md +33 -27
  44. package/GEMINI.md +5 -2
  45. package/README.md +66 -20
  46. package/SECURITY.md +37 -6
  47. package/cspell/index.yaml +6 -1
  48. package/dist/CLAUDE.basic.md +6 -6
  49. package/dist/CLAUDE.md +33 -27
  50. package/dist/CLAUDE.static.md +6 -6
  51. package/dist/config-merge/index.js +48 -12
  52. package/dist/hooks/batch-guard.js +4 -4
  53. package/dist/hooks/{chunk-7VPDUBRN.js → chunk-4JZDP5X5.js} +152 -155
  54. package/dist/hooks/{chunk-HJIISEAC.js → chunk-5SD2YM7Z.js} +5 -13
  55. package/dist/hooks/{chunk-NAS4C7GP.js → chunk-77J7IEQM.js} +2 -2
  56. package/dist/hooks/{chunk-DMQN45FN.js → chunk-7HVB7SZG.js} +3 -3
  57. package/dist/hooks/{chunk-RLDX5SOC.js → chunk-AIOIOMPX.js} +4413 -1970
  58. package/dist/hooks/{chunk-5BK3K7V4.js → chunk-M7QKEKWO.js} +873 -2049
  59. package/dist/hooks/{chunk-WQ4OSBSS.js → chunk-MKVGBQPA.js} +2 -2
  60. package/dist/hooks/{chunk-EJDX2TOB.js → chunk-NXYMNPUQ.js} +7 -88
  61. package/dist/hooks/{chunk-NJQOBE6L.js → chunk-QVLT52OV.js} +2 -7
  62. package/dist/hooks/{chunk-GQ7KP45M.js → chunk-XYUIQOW3.js} +2 -2
  63. package/dist/hooks/codex-hook-adapter.js +12 -48
  64. package/dist/hooks/duplicate-read-guard.js +5 -5
  65. package/dist/hooks/format-edited.js +2 -2
  66. package/dist/hooks/inputs.json +280 -0
  67. package/dist/hooks/investigation-guard.js +5 -5
  68. package/dist/hooks/pretool-guard.js +9 -9
  69. package/dist/hooks/session-lang.js +0 -1
  70. package/dist/hooks/stop-guard.js +192 -333
  71. package/dist/josh.js +240 -148
  72. package/dist/managed-marker/index.js +2 -1
  73. package/dist/version/index.js +70 -78
  74. package/eslint/rules/promise.js +5 -0
  75. package/eslint/rules/unicorn.js +3 -2
  76. package/package.json +26 -5
  77. package/pnpm-workspace.yaml +5 -7
  78. package/prompts/collaboration-workflow/glossary.md +17 -0
  79. package/prompts/collaboration-workflow/issue-citation.md +5 -5
  80. package/prompts/collaboration-workflow/issue-template.md +1 -1
  81. package/prompts/collaboration-workflow/operating-rules.md +5 -5
  82. package/prompts/collaboration-workflow/overview.md +13 -1
  83. package/prompts/collaboration-workflow/principles.md +9 -0
  84. package/prompts/collaboration-workflow/report-format.md +1 -1
  85. package/prompts/collaboration-workflow/residency.md +3 -3
  86. package/prompts/collaboration-workflow/rule-delivery.md +1 -1
  87. package/prompts/collaboration-workflow/turn-batching.md +3 -3
  88. package/prompts/collaboration-workflow/upstream-interrupt.md +1 -1
  89. package/prompts/collaboration-workflow/wip-cap.md +25 -22
  90. package/prompts/collaboration-workflow.md +6 -8
  91. package/prompts/review-rubric.md +1 -1
  92. package/prompts/review.md +3 -3
  93. package/prompts/sonar-hotspot-handling.md +11 -3
  94. package/prompts/testing-guide.md +3 -3
  95. package/scripts/adopt/adopt-toolkits.ts +0 -2
  96. package/scripts/adopt/adopt.ts +0 -2
  97. package/scripts/agent/agent-argv.ts +0 -2
  98. package/scripts/agent/agent-diagnostics.ts +1 -1
  99. package/scripts/agent/agent-role-profile.ts +0 -7
  100. package/scripts/agent/claude-agent-argv.ts +0 -2
  101. package/scripts/agent/codex-agent-argv.ts +1 -1
  102. package/scripts/agent/codex-hooks.ts +92 -0
  103. package/scripts/agent/interactive-ask.ts +1 -1
  104. package/scripts/auto-ok/auto-ok-cli.ts +6 -16
  105. package/scripts/backlog/backlog-arrival.ts +30 -10
  106. package/scripts/backlog/backlog-budget-cli.ts +15 -16
  107. package/scripts/backlog/backlog-budget.ts +0 -2
  108. package/scripts/backlog/backlog-defect-priority.ts +2 -2
  109. package/scripts/backlog/backlog-drive-cli.ts +10 -8
  110. package/scripts/backlog/backlog-drive-named-offer.ts +16 -3
  111. package/scripts/backlog/backlog-drive-named.ts +2 -1
  112. package/scripts/backlog/backlog-drive.ts +76 -16
  113. package/scripts/backlog/backlog-named.ts +0 -3
  114. package/scripts/backlog/backlog-next.ts +9 -15
  115. package/scripts/backlog/backlog-offer-cli.ts +6 -19
  116. package/scripts/backlog/backlog-plan-cli.ts +1 -7
  117. package/scripts/backlog/backlog-plan.ts +30 -19
  118. package/scripts/backlog/backlog-pool.ts +3 -6
  119. package/scripts/backlog/backlog-rank.ts +2 -2
  120. package/scripts/backlog/backlog-ready.ts +39 -10
  121. package/scripts/backlog/backlog-scope.ts +1 -3
  122. package/scripts/backlog/backlog-stalled-detect.ts +2 -2
  123. package/scripts/backlog/backlog-stalled.ts +0 -1
  124. package/scripts/backlog/backlog-waves.ts +5 -2
  125. package/scripts/behavior/behavior-cli.ts +1 -1
  126. package/scripts/build/build-codex-hooks.ts +26 -0
  127. package/scripts/build/build-hooks.ts +85 -9
  128. package/scripts/build/hook-bundle-stamp.ts +111 -0
  129. package/scripts/cases/cases-cli.ts +1 -1
  130. package/scripts/cases/cases-logic.ts +1 -1
  131. package/scripts/ci/composite-actions.ts +30 -0
  132. package/scripts/ci/pr-classification.ts +3 -3
  133. package/scripts/claude/workflow-destination.ts +10 -1
  134. package/scripts/clone/clone-fingerprint.ts +0 -1
  135. package/scripts/clone/clone-scan-cli.ts +1 -1
  136. package/scripts/clone/clone-scan.ts +1 -1
  137. package/scripts/config-merge/json-format.ts +0 -1
  138. package/scripts/config-merge/parse-jsonc.ts +33 -3
  139. package/scripts/config-merge/patch-json-key.ts +13 -6
  140. package/scripts/config-merge/patch-yaml-list.ts +1 -1
  141. package/scripts/cost-runtime/codex-usage.ts +2 -9
  142. package/scripts/cost-runtime/cost-attribute.ts +0 -1
  143. package/scripts/cost-runtime/cost-cli.ts +3 -10
  144. package/scripts/cost-runtime/cost-corpus.ts +0 -2
  145. package/scripts/cost-runtime/cost-format.ts +0 -3
  146. package/scripts/cost-runtime/cost-pricing.ts +0 -1
  147. package/scripts/cost-runtime/cost-tokens.ts +0 -1
  148. package/scripts/delegation/delegation-cli.ts +1 -1
  149. package/scripts/delegation/delegation-policy.ts +0 -1
  150. package/scripts/delegation/duplicate-read-guard.ts +0 -8
  151. package/scripts/delegation/fanout-cli.ts +1 -1
  152. package/scripts/delegation/fanout.ts +0 -2
  153. package/scripts/delegation/investigation-reads.ts +1 -164
  154. package/scripts/discovery/repo-map-logic.ts +0 -1
  155. package/scripts/discovery/repo-party-cli.ts +1 -1
  156. package/scripts/doctor/doctor-consumer.ts +6 -10
  157. package/scripts/doctor/doctor-io.ts +9 -13
  158. package/scripts/doctor/doctor-logic.ts +0 -4
  159. package/scripts/doctor/doctor.ts +14 -9
  160. package/scripts/document/backlogrun-parent-read-set.ts +12 -1
  161. package/scripts/document/document-byte-budget.ts +5 -5
  162. package/scripts/document/document-byte-check.ts +0 -1
  163. package/scripts/document/document-read-cli.ts +0 -2
  164. package/scripts/document/document-section-cli.ts +1 -1
  165. package/scripts/document/document-section.ts +0 -3
  166. package/scripts/document/edit-files-cli.ts +0 -1
  167. package/scripts/document/entry-read-budget.ts +21 -7
  168. package/scripts/document/entry-read-set.ts +32 -8
  169. package/scripts/document/lane-child-read-set.ts +8 -6
  170. package/scripts/document/read-files-cli.ts +0 -4
  171. package/scripts/document/read-set-cli.ts +0 -2
  172. package/scripts/document/read-set-point-of-use.ts +9 -3
  173. package/scripts/document/read-set-pricing.ts +0 -1
  174. package/scripts/document/read-set-trim.ts +4 -2
  175. package/scripts/epic/epic-add.ts +1 -1
  176. package/scripts/epic/epic-audit-cli.ts +1 -4
  177. package/scripts/epic/epic-audit-orphans.ts +1 -3
  178. package/scripts/epic/epic-audit-rationale.ts +0 -1
  179. package/scripts/epic/epic-audit-report.ts +0 -2
  180. package/scripts/epic/epic-audit.ts +8 -22
  181. package/scripts/epic/epic-bundle-cli.ts +1 -1
  182. package/scripts/epic/epic-bundle-evidence.ts +0 -1
  183. package/scripts/epic/epic-bundle-referenced.ts +1 -5
  184. package/scripts/epic/epic-bundle.ts +0 -4
  185. package/scripts/epic/epic-busy.ts +4 -5
  186. package/scripts/epic/epic-candidate-confirm.ts +0 -5
  187. package/scripts/epic/epic-classify.ts +2 -2
  188. package/scripts/epic/epic-cli-argv.ts +0 -1
  189. package/scripts/epic/epic-close-comment.ts +1 -1
  190. package/scripts/epic/epic-close.ts +5 -2
  191. package/scripts/epic/epic-cross-repo.ts +2 -4
  192. package/scripts/epic/epic-decision.ts +0 -1
  193. package/scripts/epic/epic-fetch.ts +2 -2
  194. package/scripts/epic/epic-index.ts +2 -3
  195. package/scripts/epic/epic-issue.ts +1 -15
  196. package/scripts/epic/epic-lane-offer.ts +9 -8
  197. package/scripts/epic/epic-nested.ts +1 -1
  198. package/scripts/epic/epic-next-read.ts +1 -3
  199. package/scripts/epic/epic-next-views.ts +0 -1
  200. package/scripts/epic/epic-next.ts +1 -10
  201. package/scripts/epic/epic-parse.ts +0 -1
  202. package/scripts/epic/epic-promote.ts +0 -9
  203. package/scripts/epic/epic-rank.ts +2 -2
  204. package/scripts/epic/epic-read.ts +1 -2
  205. package/scripts/epic/epic-reconcile.ts +1 -1
  206. package/scripts/epic/epic-reference.ts +1 -13
  207. package/scripts/epic/epic-relation-recheck.ts +1 -1
  208. package/scripts/epic/epic-relations.ts +1 -1
  209. package/scripts/epic/epic-remove.ts +1 -1
  210. package/scripts/epic/epic-report.ts +0 -1
  211. package/scripts/epic/epic-run.ts +2 -3
  212. package/scripts/epic/epic-shape.ts +1 -1
  213. package/scripts/epic/epic-solo-stale.ts +107 -0
  214. package/scripts/epic/epic-solo.ts +3 -2
  215. package/scripts/epic/epic-triage.ts +1 -1
  216. package/scripts/epic/epic-validate.ts +1 -1
  217. package/scripts/epic/epic.ts +1 -1
  218. package/scripts/exports/unused-members-cli.ts +53 -0
  219. package/scripts/{git → followup}/followup-issue-number.ts +1 -6
  220. package/scripts/{git → followup}/git-followup-cleanup.ts +2 -1
  221. package/scripts/{git → followup}/git-followup-finish.ts +1 -3
  222. package/scripts/{git → followup}/git-followup-flush.ts +2 -2
  223. package/scripts/{git → followup}/git-followup-issue-close.ts +2 -2
  224. package/scripts/{git → followup}/git-followup-label.ts +4 -4
  225. package/scripts/followup/git-followup-merged.ts +112 -0
  226. package/scripts/{git → followup}/git-followup-pending.ts +1 -1
  227. package/scripts/{git → followup}/git-followup-workflow.ts +19 -11
  228. package/scripts/{git → followup}/git-pr-followup-wrapup.ts +9 -3
  229. package/scripts/{git → followup}/git-pr-followup.ts +53 -16
  230. package/scripts/gate/core-budget.ts +3 -9
  231. package/scripts/gate/gate-plan.ts +7 -4
  232. package/scripts/gate/gate-report.ts +0 -6
  233. package/scripts/gate/gate-tree.ts +1 -1
  234. package/scripts/gate/pre-commit-type-check.ts +0 -6
  235. package/scripts/gate/project-checks.ts +7 -8
  236. package/scripts/gate/scoped-green.ts +0 -1
  237. package/scripts/gate/type-check-step.ts +1 -1
  238. package/scripts/gate/verification-gate.ts +0 -2
  239. package/scripts/gh/fix-gh-packages.ts +15 -12
  240. package/scripts/gh/gh-spawn.ts +2 -2
  241. package/scripts/{git → gh}/git-ai-review-scan.ts +1 -5
  242. package/scripts/{git → gh}/git-gh-check.ts +2 -1
  243. package/scripts/{git → gh}/git-gh-exec.ts +1 -1
  244. package/scripts/{git → gh}/git-gh-failure.ts +1 -1
  245. package/scripts/{git → gh}/git-gh-helpers.ts +0 -1
  246. package/scripts/{git → gh}/git-gh-issue-list.ts +13 -10
  247. package/scripts/{git → gh}/git-gh-issue-read.ts +1 -1
  248. package/scripts/{git → gh}/git-gh-issue-rest.ts +6 -3
  249. package/scripts/{git → gh}/git-gh-issue-write.ts +4 -1
  250. package/scripts/{git → gh}/git-gh-pr-auto-merge.ts +4 -1
  251. package/scripts/{git → gh}/git-gh-pr-read.ts +24 -0
  252. package/scripts/{git → gh}/git-gh-pr-rest.ts +5 -2
  253. package/scripts/{git → gh}/git-gh-pr-review.ts +2 -2
  254. package/scripts/{git → gh}/git-gh-pr-rollup.ts +1 -3
  255. package/scripts/{git → gh}/git-gh-pr.ts +3 -1
  256. package/scripts/{git → gh}/git-pr-ai-review.ts +2 -5
  257. package/scripts/{git → gh}/git-pr-checks-eval.ts +0 -10
  258. package/scripts/{git → gh}/git-pr-checks-parse.ts +4 -20
  259. package/scripts/{git → gh}/git-pr-checks.ts +2 -1
  260. package/scripts/{git → gh}/git-pr-coderabbit.ts +2 -5
  261. package/scripts/{git → gh}/git-pr-confirmation.ts +1 -3
  262. package/scripts/{git → gh}/git-pr-managed-config.ts +2 -3
  263. package/scripts/{git → gh}/git-pr.ts +3 -3
  264. package/scripts/git/changed-file-scope.ts +0 -1
  265. package/scripts/git/git-branch.ts +3 -6
  266. package/scripts/git/git-command.ts +6 -1
  267. package/scripts/git/git-commit.ts +1 -1
  268. package/scripts/git/git-common-directory.ts +80 -24
  269. package/scripts/git/git-error.ts +66 -9
  270. package/scripts/git/git-issue.ts +1 -1
  271. package/scripts/git/git-preflight.ts +2 -2
  272. package/scripts/git/git-prompt.ts +6 -31
  273. package/scripts/git/git-push.ts +1 -1
  274. package/scripts/git/git-spawn-sync.ts +65 -0
  275. package/scripts/git/git-spawn.ts +5 -4
  276. package/scripts/git/git-staging.ts +1 -0
  277. package/scripts/git/git-status.ts +1 -1
  278. package/scripts/git/git-workflow.ts +1 -1
  279. package/scripts/git/gone-branch.ts +1 -0
  280. package/scripts/git/listing-cutoff.ts +1 -1
  281. package/scripts/git/main-merge.ts +1 -1
  282. package/scripts/git/main-sync.ts +19 -1
  283. package/scripts/git/parse-json-array.ts +0 -3
  284. package/scripts/git/repository-lock.ts +16 -16
  285. package/scripts/git/{git-stash.ts → stash/git-stash.ts} +1 -1
  286. package/scripts/git/{stash-pop-args.ts → stash/stash-pop-args.ts} +2 -7
  287. package/scripts/git/{stash-pop-cli.ts → stash/stash-pop-cli.ts} +0 -1
  288. package/scripts/git/{stash-sweep-lock.ts → stash/stash-sweep-lock.ts} +3 -3
  289. package/scripts/hooks/codex-hook-adapter.ts +0 -1
  290. package/scripts/hooks/edited-cspell.ts +1 -1
  291. package/scripts/hooks/format-edited-file.ts +2 -0
  292. package/scripts/hooks/pre-push-unit.ts +0 -4
  293. package/scripts/hooks/pretool-guard.ts +22 -4
  294. package/scripts/hooks/reserved-run.ts +1 -1
  295. package/scripts/hooks/step-zero-notice.ts +76 -0
  296. package/scripts/hooks/stop-guard.ts +47 -21
  297. package/scripts/init/claude-plugin-config.ts +4 -5
  298. package/scripts/init/hook-command-rewrite.ts +16 -8
  299. package/scripts/init/hook-launch.ts +41 -15
  300. package/scripts/init/init-basic.ts +2 -5
  301. package/scripts/init/init-file-action.ts +54 -0
  302. package/scripts/init/init-logic-migrate.ts +35 -17
  303. package/scripts/init/init-logic-secretlint.ts +1 -1
  304. package/scripts/init/init-logic.ts +10 -19
  305. package/scripts/init/init.ts +11 -71
  306. package/scripts/init/kit-written-paths.ts +2 -0
  307. package/scripts/init/project-profile.ts +9 -17
  308. package/scripts/init/start-exec.ts +1 -1
  309. package/scripts/init/start-setup-pr.ts +6 -6
  310. package/scripts/init/start-steps.ts +3 -1
  311. package/scripts/issue/behavior-change-lint.ts +0 -1
  312. package/scripts/issue/defect-rate-cli.ts +64 -23
  313. package/scripts/issue/defect-rate.ts +1 -2
  314. package/scripts/{git → issue}/git-next-issues.ts +3 -3
  315. package/scripts/issue/issue-backlinks-cli.ts +1 -5
  316. package/scripts/issue/issue-backlinks.ts +7 -14
  317. package/scripts/issue/issue-cite-cli.ts +2 -6
  318. package/scripts/issue/issue-cite.ts +12 -8
  319. package/scripts/issue/issue-classification.ts +1 -9
  320. package/scripts/issue/issue-closing-pr.ts +4 -4
  321. package/scripts/issue/issue-comment-cli.ts +2 -2
  322. package/scripts/issue/issue-file-cli.ts +5 -5
  323. package/scripts/issue/issue-file.ts +7 -14
  324. package/scripts/issue/issue-fold-cli.ts +1 -1
  325. package/scripts/issue/issue-fold-existing-cli.ts +1 -1
  326. package/scripts/{git → issue}/issue-labels.ts +8 -0
  327. package/scripts/issue/issue-lint-cli.ts +1 -1
  328. package/scripts/issue/issue-merged.ts +2 -2
  329. package/scripts/{git → issue}/issue-rank.ts +1 -1
  330. package/scripts/issue/issue-read-cli.ts +8 -47
  331. package/scripts/issue/issue-read.ts +0 -2
  332. package/scripts/issue/issue-report-failures.ts +80 -0
  333. package/scripts/issue/issue-scout-cli.ts +1 -7
  334. package/scripts/issue/issue-scout-closed.ts +2 -2
  335. package/scripts/issue/issue-scout.ts +0 -2
  336. package/scripts/issue/issue-state-cli.ts +5 -46
  337. package/scripts/issue/issue-state.ts +1 -5
  338. package/scripts/issue/markdown-section.ts +21 -6
  339. package/scripts/issue/measure-rerun-cli.ts +74 -15
  340. package/scripts/issue/reproduction-measure.ts +1 -1
  341. package/scripts/josh/cli-body.ts +1 -1
  342. package/scripts/josh/file-map-stamp.ts +0 -3
  343. package/scripts/josh/josh-command-map.ts +2 -0
  344. package/scripts/josh/josh-commands-ai.ts +9 -102
  345. package/scripts/josh/josh-commands-backlog.ts +5 -1
  346. package/scripts/josh/josh-commands-development.ts +8 -1
  347. package/scripts/josh/josh-commands-issue.ts +2 -2
  348. package/scripts/josh/josh-commands-maintenance.ts +7 -0
  349. package/scripts/josh/josh-commands-project.ts +7 -1
  350. package/scripts/josh/josh-commands-run.ts +114 -0
  351. package/scripts/josh/josh-commands-versioning.ts +8 -0
  352. package/scripts/josh/josh-commands-workflow.ts +3 -3
  353. package/scripts/josh/path-decision.ts +0 -3
  354. package/scripts/josh/process-owner.ts +16 -0
  355. package/scripts/josh/run-github-prerequisite.ts +3 -6
  356. package/scripts/josh/session-language-cli.ts +0 -1
  357. package/scripts/lane/lane-await.ts +46 -19
  358. package/scripts/lane/lane-capacity.ts +6 -3
  359. package/scripts/lane/lane-child-invocation.ts +20 -7
  360. package/scripts/lane/lane-cli.ts +1 -4
  361. package/scripts/lane/lane-close.ts +5 -4
  362. package/scripts/lane/lane-dispatch.ts +3 -4
  363. package/scripts/lane/lane-environment.ts +0 -9
  364. package/scripts/lane/lane-handoff.ts +38 -0
  365. package/scripts/lane/lane-launch-cli.ts +31 -27
  366. package/scripts/lane/lane-open.ts +0 -3
  367. package/scripts/lane/lane-output.ts +0 -1
  368. package/scripts/lane/lane-registry.ts +9 -0
  369. package/scripts/lane/openai-lane-ship.ts +2 -0
  370. package/scripts/lane/openai-lane-supervisor-decision.ts +2 -1
  371. package/scripts/lane/openai-lane-supervisor.ts +6 -4
  372. package/scripts/lane/openai-review-broker.ts +7 -1
  373. package/scripts/lib/bounded-pool.ts +1 -0
  374. package/scripts/lib/cli-flags.ts +31 -2
  375. package/scripts/lib/error-message.ts +12 -1
  376. package/scripts/lib/json-value.ts +5 -4
  377. package/scripts/lib/poll.ts +3 -1
  378. package/scripts/lib/timed-fetch.ts +15 -0
  379. package/scripts/lib/timeouts.ts +13 -0
  380. package/scripts/{yaml → lib}/yaml-document.ts +3 -1
  381. package/scripts/{bytes → lines}/bytes-command.ts +0 -2
  382. package/scripts/lines/line-targets.ts +0 -11
  383. package/scripts/lines/lines-command.ts +5 -4
  384. package/scripts/lint/lint-related-scope.ts +0 -1
  385. package/scripts/lint/lint-related.ts +1 -1
  386. package/scripts/{git → notify}/telegram-notify.ts +2 -2
  387. package/scripts/{git → notify}/telegram-test.ts +4 -4
  388. package/scripts/observations/observation-ledger-home.ts +0 -1
  389. package/scripts/observations/observation-ledger-line.ts +0 -1
  390. package/scripts/observations/observation-ledger-migrate.ts +1 -1
  391. package/scripts/observations/observations-flush-landing.ts +3 -3
  392. package/scripts/observations/observations-flush.ts +2 -2
  393. package/scripts/overrides/lockfile-overrides.ts +1 -1
  394. package/scripts/overrides/overrides-logic.ts +1 -1
  395. package/scripts/package/package-scout-cli.ts +2 -7
  396. package/scripts/package/package-scout.ts +0 -2
  397. package/scripts/propagate/propagate-git-failure.ts +0 -1
  398. package/scripts/propagate/propagate-git.ts +3 -10
  399. package/scripts/propagate/propagate-publish.ts +2 -3
  400. package/scripts/propagate/propagate-run.ts +0 -2
  401. package/scripts/propagate/propagate-steps.ts +3 -5
  402. package/scripts/propagate/propagate-targets.ts +0 -4
  403. package/scripts/propagate/propagate.ts +0 -4
  404. package/scripts/refactor/import-graph.ts +0 -1
  405. package/scripts/refactor/refactor-lint.ts +0 -2
  406. package/scripts/refactor/refactor-scan.ts +2 -2
  407. package/scripts/refactor/refactor-targets.ts +0 -1
  408. package/scripts/registry-migration/migrate-logic.ts +28 -21
  409. package/scripts/registry-migration/migrate.ts +25 -14
  410. package/scripts/release/github-release-cli.ts +19 -6
  411. package/scripts/release/github-release-environment.ts +46 -0
  412. package/scripts/release/github-release.ts +151 -94
  413. package/scripts/release/release-history.ts +0 -1
  414. package/scripts/release/release-plan.ts +0 -1
  415. package/scripts/release/release-publish.ts +38 -5
  416. package/scripts/release/release-scope-cli.ts +1 -2
  417. package/scripts/release/release-tag.ts +2 -4
  418. package/scripts/release/release-worktree.ts +97 -2
  419. package/scripts/repo/auto-merge-setting-logic.ts +1 -4
  420. package/scripts/repo/repo-setting.ts +1 -1
  421. package/scripts/repo/repository-labels.ts +3 -3
  422. package/scripts/repo/required-checks-logic.ts +206 -0
  423. package/scripts/repo/required-checks-report.ts +71 -0
  424. package/scripts/repo/ruleset-check-cli.ts +53 -0
  425. package/scripts/repo/ruleset-check.ts +147 -0
  426. package/scripts/report/report-lint-cli.ts +0 -4
  427. package/scripts/review/disposition-cli.ts +1 -1
  428. package/scripts/review/live-evidence.ts +1 -1
  429. package/scripts/review/review-attest-cli.ts +0 -6
  430. package/scripts/review/review-attest.ts +4 -16
  431. package/scripts/review/review-brief-cli.ts +23 -6
  432. package/scripts/review/review-brief.ts +21 -8
  433. package/scripts/review/review-checkout.ts +3 -2
  434. package/scripts/review/review-diff-parts.ts +89 -0
  435. package/scripts/review/review-diff-write.ts +97 -0
  436. package/scripts/review/review-finding-ledger.ts +0 -1
  437. package/scripts/review/review-record-cli.ts +10 -17
  438. package/scripts/review/review-record.ts +0 -1
  439. package/scripts/review/review-round2-cli.ts +1 -1
  440. package/scripts/review/review-stamps.ts +0 -3
  441. package/scripts/review/review-tree.ts +14 -2
  442. package/scripts/rules/decision-oracle-stage.ts +18 -0
  443. package/scripts/rules/decision-oracle.ts +10 -7
  444. package/scripts/rules/delivered-rules.ts +9 -1
  445. package/scripts/rules/destructive-command.ts +119 -0
  446. package/scripts/rules/direct-filing.ts +1 -1
  447. package/scripts/rules/early-heartbeat.ts +4 -3
  448. package/scripts/rules/file-body.ts +0 -3
  449. package/scripts/rules/filing-cap.ts +0 -2
  450. package/scripts/rules/gh-api.ts +7 -2
  451. package/scripts/rules/git-argv.ts +18 -7
  452. package/scripts/rules/git-force.ts +0 -2
  453. package/scripts/rules/implementation-cut.ts +0 -1
  454. package/scripts/rules/index-guard.ts +71 -0
  455. package/scripts/rules/issue-citation.ts +50 -25
  456. package/scripts/rules/lane-background.ts +15 -7
  457. package/scripts/rules/lane-park.ts +22 -6
  458. package/scripts/rules/last-prompt.ts +1 -0
  459. package/scripts/rules/oracle-consulted.ts +1 -1
  460. package/scripts/rules/oracle-firing.ts +1 -0
  461. package/scripts/rules/oracle-list-cli.ts +0 -3
  462. package/scripts/rules/permission-guards.ts +14 -0
  463. package/scripts/rules/protected-files.ts +74 -0
  464. package/scripts/rules/reply-language.ts +1 -1
  465. package/scripts/rules/rule-body-guard.ts +0 -3
  466. package/scripts/rules/rule-value-cli.ts +0 -1
  467. package/scripts/rules/shell-body-trigger.ts +0 -1
  468. package/scripts/rules/shell-segments.ts +0 -1
  469. package/scripts/rules/stop-rules.ts +20 -9
  470. package/scripts/rules/tail-commands.ts +1 -1
  471. package/scripts/rules/test-declared-commit.ts +1 -1
  472. package/scripts/rules/third-party-write.ts +0 -1
  473. package/scripts/rules/worktree-guard.ts +26 -9
  474. package/scripts/run/run-carry-args.ts +8 -12
  475. package/scripts/run/run-carry-cli.ts +0 -2
  476. package/scripts/run/run-carry-stash.ts +2 -2
  477. package/scripts/run/run-carry-streak.ts +1 -1
  478. package/scripts/run/run-cut-args.ts +1 -6
  479. package/scripts/run/run-cut-cli.ts +0 -7
  480. package/scripts/run/run-cut.ts +8 -54
  481. package/scripts/run/run-ending-cli.ts +2 -6
  482. package/scripts/run/run-ending.ts +1 -4
  483. package/scripts/run/run-entry-cli.ts +133 -25
  484. package/scripts/run/run-entry-stop.ts +104 -0
  485. package/scripts/run/run-entry.ts +0 -1
  486. package/scripts/run/run-event-cli.ts +0 -2
  487. package/scripts/run/run-event-follow.ts +1 -0
  488. package/scripts/run/run-event-render.ts +1 -1
  489. package/scripts/run/run-event-scope.ts +53 -4
  490. package/scripts/run/run-event-stream-emit.ts +7 -2
  491. package/scripts/run/run-event-stream.ts +0 -3
  492. package/scripts/run/run-event-watch.ts +1 -0
  493. package/scripts/run/run-halfrun-resume.ts +20 -7
  494. package/scripts/run/run-headless.ts +2 -2
  495. package/scripts/run/run-hold-cli.ts +33 -10
  496. package/scripts/run/run-hold.ts +29 -6
  497. package/scripts/run/run-issue-number.ts +1 -1
  498. package/scripts/run/run-liveness-cli.ts +2 -6
  499. package/scripts/run/run-liveness.ts +2 -3
  500. package/scripts/run/run-merge-cli.ts +7 -23
  501. package/scripts/run/run-merge-steps.ts +5 -5
  502. package/scripts/run/run-merge.ts +1 -1
  503. package/scripts/run/run-next-cli.ts +1 -1
  504. package/scripts/run/run-parent-cut-hook.ts +4 -2
  505. package/scripts/run/run-preflight.ts +2 -9
  506. package/scripts/run/run-prep-cli.ts +6 -3
  507. package/scripts/run/run-prep-locate.ts +1 -1
  508. package/scripts/run/run-progress-args.ts +20 -4
  509. package/scripts/run/run-progress-cli.ts +35 -36
  510. package/scripts/run/run-progress-clock.ts +10 -35
  511. package/scripts/run/run-progress-config.ts +0 -4
  512. package/scripts/run/run-progress-read.ts +1 -2
  513. package/scripts/run/run-progress.ts +1 -2
  514. package/scripts/run/run-prrun-resume.ts +117 -0
  515. package/scripts/run/run-report-cli.ts +1 -2
  516. package/scripts/run/run-report.ts +0 -1
  517. package/scripts/run/run-retrospective.ts +1 -1
  518. package/scripts/run/run-review-cli.ts +0 -3
  519. package/scripts/run/run-review-steps.ts +2 -0
  520. package/scripts/run/run-review.ts +0 -2
  521. package/scripts/run/run-ship-cli.ts +29 -19
  522. package/scripts/run/run-ship-detach.ts +1 -0
  523. package/scripts/run/run-ship-next.ts +106 -0
  524. package/scripts/run/run-ship-preflight.ts +1 -1
  525. package/scripts/run/run-ship-probe.ts +4 -1
  526. package/scripts/run/run-ship-return.ts +8 -3
  527. package/scripts/run/run-ship-review-steps.ts +18 -4
  528. package/scripts/run/run-ship-review.ts +11 -0
  529. package/scripts/run/run-ship-scoped.ts +1 -0
  530. package/scripts/run/run-ship-steps.ts +1 -1
  531. package/scripts/run/run-ship.ts +0 -1
  532. package/scripts/run/run-stage-read.ts +62 -0
  533. package/scripts/run/run-stage.ts +160 -0
  534. package/scripts/run/run-status-cli.ts +3 -16
  535. package/scripts/run/run-step-cli.ts +21 -14
  536. package/scripts/run/run-step.ts +1 -1
  537. package/scripts/run/run-stop-notify.ts +1 -3
  538. package/scripts/run/run-stranded-cli.ts +0 -4
  539. package/scripts/run/run-stranded-detect.ts +2 -2
  540. package/scripts/run/run-tail-cli.ts +17 -11
  541. package/scripts/run/run-tail.ts +2 -0
  542. package/scripts/run/run-tidy-lanes.ts +6 -2
  543. package/scripts/run/run-tidy-stashes.ts +12 -12
  544. package/scripts/run/run-wake-cli.ts +4 -13
  545. package/scripts/run/run-wake-loop.ts +2 -2
  546. package/scripts/run/run-wake.ts +2 -4
  547. package/scripts/run/run-watcher-guard-cli.ts +0 -4
  548. package/scripts/run/run-watcher-guard.ts +18 -12
  549. package/scripts/run/run-watcher-hook.ts +1 -1
  550. package/scripts/safe-chain/ci-installer-pin.ts +11 -5
  551. package/scripts/safe-chain/pack-hook.ts +92 -0
  552. package/scripts/safe-chain/project-config.ts +1 -1
  553. package/scripts/security/security-audit-provision-logic.ts +0 -1
  554. package/scripts/security/security-audit-provision.ts +3 -2
  555. package/scripts/security/security-audit.ts +0 -1
  556. package/scripts/security/security-updates-logic.ts +0 -1
  557. package/scripts/sonar/sonar-hotspots-cli.ts +10 -52
  558. package/scripts/sonar/sonar-hotspots.ts +0 -1
  559. package/scripts/sonar/sonar-new-code-cli.ts +150 -0
  560. package/scripts/sonar/sonar-new-code.ts +79 -0
  561. package/scripts/sonar/sonar-project.ts +97 -0
  562. package/scripts/split/split-assess-cli.ts +1 -1
  563. package/scripts/split/split-assess.ts +2 -5
  564. package/scripts/sync/managed-config-scope-cli.ts +1 -1
  565. package/scripts/sync/skill-migration.ts +0 -1
  566. package/scripts/sync/sync-ai-files.ts +4 -0
  567. package/scripts/sync/sync-hook-safety.ts +2 -3
  568. package/scripts/sync/sync.ts +1 -8
  569. package/scripts/sync/template-source-logic.ts +0 -1
  570. package/scripts/sync/workflow-pin-logic.ts +16 -28
  571. package/scripts/test/test-declared-changed.ts +13 -16
  572. package/scripts/test/test-declared-logic.ts +0 -1
  573. package/scripts/test/test-declared.ts +3 -9
  574. package/scripts/test/test-red-commit.ts +2 -2
  575. package/scripts/test/test-red.ts +14 -7
  576. package/scripts/test/test-type-logic.ts +1 -1
  577. package/scripts/test/unit-worker-share.ts +7 -16
  578. package/scripts/time-runtime/time-batch-guard.ts +1 -2
  579. package/scripts/time-runtime/time-bundle-call.ts +0 -1
  580. package/scripts/time-runtime/time-bundles.ts +0 -4
  581. package/scripts/time-runtime/time-density-hook.ts +0 -2
  582. package/scripts/time-runtime/time-followup-stage.ts +1 -1
  583. package/scripts/time-runtime/time-format.ts +0 -73
  584. package/scripts/time-runtime/time-round-trips.ts +0 -4
  585. package/scripts/time-runtime/time-single-check.ts +1 -1
  586. package/scripts/time-runtime/time-spans.ts +1 -1
  587. package/scripts/time-runtime/time-transcript-line.ts +1 -2
  588. package/scripts/ui/ui-routes-cli.ts +0 -5
  589. package/scripts/ui/ui-routes.ts +0 -5
  590. package/scripts/version/effective-upstream.ts +2 -2
  591. package/scripts/version/latest-corepack.ts +7 -9
  592. package/scripts/version/latest-scope-cli.ts +0 -2
  593. package/scripts/version/latest-update.ts +0 -2
  594. package/scripts/version/npm-registry.ts +2 -2
  595. package/scripts/version/publishable-range-check.ts +1 -1
  596. package/scripts/version/release-hold.ts +0 -4
  597. package/scripts/version/running-binary.ts +2 -2
  598. package/scripts/version/version-check-logic.ts +0 -2
  599. package/scripts/version/version-commands.ts +11 -1
  600. package/scripts/version/version-remote.ts +3 -3
  601. package/scripts/version/version-targets.ts +4 -4
  602. package/templates/CLAUDE.basic.md +6 -6
  603. package/templates/sonar-project.properties +28 -1
  604. package/templates/workflows/ci.yml +16 -82
  605. package/templates/workflows/dependabot-auto-merge.yml +6 -3
  606. package/templates/workflows/github-release.yml +79 -0
  607. package/tsconfig.sonar.json +4 -22
  608. package/prompts/collaboration-workflow/cross-repo-epic.md +0 -5
  609. package/prompts/collaboration-workflow/epic-audit.md +0 -5
  610. package/prompts/collaboration-workflow/epic-bundle.md +0 -5
  611. package/scripts/init/plugin-install-hint.ts +0 -47
  612. package/scripts/version/parse-json.ts +0 -13
  613. /package/scripts/{git → followup}/git-followup-stages.ts +0 -0
  614. /package/scripts/{git → gh}/git-gh-api-path.ts +0 -0
  615. /package/scripts/{git → gh}/git-gh-command.ts +0 -0
  616. /package/scripts/{git → gh}/git-gh-issue.ts +0 -0
  617. /package/scripts/{git → gh}/git-gh-pr-snapshot.ts +0 -0
  618. /package/scripts/{git → gh}/git-gh-reachability.ts +0 -0
  619. /package/scripts/{git → gh}/git-gh-repo.ts +0 -0
  620. /package/scripts/{git → gh}/git-gh-rest-state.ts +0 -0
  621. /package/scripts/{git → gh}/git-pr-checks-watch.ts +0 -0
  622. /package/scripts/{git → gh}/git-pr-error.ts +0 -0
  623. /package/scripts/{git → gh}/git-pr-messages.ts +0 -0
  624. /package/scripts/{git → gh}/github-issue-url.ts +0 -0
  625. /package/scripts/git/{stash-orphans.ts → stash/stash-orphans.ts} +0 -0
  626. /package/scripts/{git → issue}/issue-reference.ts +0 -0
  627. /package/scripts/{git → lib}/animation-helpers.ts +0 -0
  628. /package/scripts/{git → lib}/git-animation.ts +0 -0
  629. /package/scripts/{git → notify}/git-notify.ts +0 -0
  630. /package/scripts/{git → notify}/telegram-test-logic.ts +0 -0
@@ -1,5 +1,5 @@
1
+ import { git_gh_command } from '#scripts/gh/git-gh-command'
1
2
  import { git_command } from '#scripts/git/git-command'
2
- import { git_gh_command } from '#scripts/git/git-gh-command'
3
3
  import { main_sync } from '#scripts/git/main-sync'
4
4
  import { error_text } from '#scripts/lib/error-message'
5
5
  import { observation_ledger, OBSERVATION_LEDGER_DIRECTORY } from './observation-ledger'
@@ -308,6 +308,7 @@ async function stage_ledger(): Promise<void> {
308
308
  const ledger_paths = observation_ledger.ledger_paths(await git_command.status())
309
309
 
310
310
  for (const file_path of ledger_paths) {
311
+ // eslint-disable-next-line no-await-in-loop -- git add holds the index lock, so two at once fail
311
312
  await git_command.add_path(file_path)
312
313
  }
313
314
  }
@@ -423,7 +424,6 @@ const observations_flush = {
423
424
  broken_lines_message,
424
425
  CLEAN_MESSAGE,
425
426
  COMMIT_MESSAGE,
426
- empty_flush_message,
427
427
  flush,
428
428
  flush_branch_message,
429
429
  has_ledger_change,
@@ -1,4 +1,4 @@
1
- import { yaml_document } from '#scripts/yaml/yaml-document'
1
+ import { yaml_document } from '#scripts/lib/yaml-document'
2
2
  import { overrides_check } from './overrides-logic'
3
3
  import { lockfile_importers_schema, type LockfileImporter } from './schemas'
4
4
 
@@ -1,4 +1,4 @@
1
- import { yaml_document } from '#scripts/yaml/yaml-document'
1
+ import { yaml_document } from '#scripts/lib/yaml-document'
2
2
  import {
3
3
  package_pnpm_schema,
4
4
  package_with_deps_schema,
@@ -1,6 +1,7 @@
1
1
  #!/usr/bin/env tsx
2
2
  import { fileURLToPath } from 'node:url'
3
3
  import { cli_flags } from '#scripts/lib/cli-flags'
4
+ import { timed_fetch } from '#scripts/lib/timed-fetch'
4
5
  import { z } from 'zod'
5
6
  import {
6
7
  package_scout,
@@ -23,7 +24,6 @@ const SUCCESS_EXIT_CODE = 0
23
24
  const FAILURE_EXIT_CODE = 1
24
25
  const ARGV_OFFSET = 2
25
26
  const DEFAULT_SIZE = 10
26
- const FETCH_TIMEOUT_MS = 10_000
27
27
  const REGISTRY = 'https://registry.npmjs.org'
28
28
  const DOWNLOADS_API = 'https://api.npmjs.org/downloads/point/last-week'
29
29
  const USAGE = 'Usage: josh pkg:scout <keywords> [--size <n>]'
@@ -51,7 +51,7 @@ type Latest = z.infer<typeof latest_schema>
51
51
 
52
52
  async function fetch_json<T>(url: string, schema: z.ZodType<T>): Promise<T | undefined> {
53
53
  try {
54
- const response = await fetch(url, { signal: AbortSignal.timeout(FETCH_TIMEOUT_MS) })
54
+ const response = await timed_fetch(url)
55
55
  if (!response.ok) return undefined
56
56
 
57
57
  return schema.parse(await response.json())
@@ -172,14 +172,9 @@ async function main(argv: ReadonlyArray<string>): Promise<void> {
172
172
 
173
173
  const package_scout_cli = {
174
174
  USAGE,
175
- SEARCH_FAILED_MESSAGE,
176
175
  DEFAULT_SIZE,
177
176
  read_arguments,
178
- facts_of,
179
- license_of,
180
- to_candidate,
181
177
  run,
182
- main,
183
178
  }
184
179
 
185
180
  if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
@@ -112,8 +112,6 @@ const package_scout = {
112
112
  NEAR_TIE_THRESHOLD,
113
113
  to_metrics,
114
114
  rank,
115
- tie_gap,
116
- verdict_of,
117
115
  build_table,
118
116
  }
119
117
 
@@ -178,7 +178,6 @@ const propagate_git_failure = {
178
178
  NO_COMMIT,
179
179
  NOT_OPENED,
180
180
  PUSH_FAILED,
181
- TAIL_LINE_COUNT,
182
181
  UNCOMMITTED,
183
182
  attribute,
184
183
  describe_failure,
@@ -2,7 +2,7 @@ import { existsSync } from 'node:fs'
2
2
  import path from 'node:path'
3
3
  import { git_location_environment } from '#scripts/git/git-location-environment'
4
4
  import { ls_remote_branch_arguments } from '#scripts/git/git-ls-remote'
5
- import { execaSync } from 'execa'
5
+ import { git_spawn_sync } from '#scripts/git/git-spawn-sync'
6
6
 
7
7
  // The git probes propagation needs before it writes anything into a working tree.
8
8
  //
@@ -16,7 +16,6 @@ const GIT_TIMEOUT_MS = 10_000
16
16
  // `rev-parse` and tight for an ssh handshake, and a probe that times out answers "no" — which for
17
17
  // the two below would report a push that never reached origin as a push nobody attempted.
18
18
  const REMOTE_TIMEOUT_MS = 60_000
19
- const SUCCESS_EXIT_CODE = 0
20
19
  const DEFAULT_BRANCH_REF = 'refs/remotes/origin/HEAD'
21
20
  const FALLBACK_DEFAULT_BRANCH = 'main'
22
21
  const ORIGIN_PREFIX = 'refs/remotes/origin/'
@@ -54,15 +53,11 @@ function run_git(
54
53
  args: ReadonlyArray<string>,
55
54
  timeout_ms: number = GIT_TIMEOUT_MS,
56
55
  ): string | undefined {
57
- const result = execaSync('git', args, {
56
+ return git_spawn_sync.read(args, {
58
57
  cwd: repository_path,
59
- reject: false,
60
58
  timeout: timeout_ms,
61
- env: { LC_ALL: 'C', LANGUAGE: 'C', ...git_location_environment.location_free_environment() },
62
- extendEnv: true,
59
+ env: { ...git_spawn_sync.C_LOCALE, ...git_location_environment.location_free_environment() },
63
60
  })
64
-
65
- return result.exitCode === SUCCESS_EXIT_CODE ? result.stdout.trim() : undefined
66
61
  }
67
62
 
68
63
  // The repository's default branch, from the remote's own HEAD. Falls back to `main` when the ref is
@@ -207,7 +202,6 @@ function return_to_default_branch(repository_path: string): boolean {
207
202
 
208
203
  const propagate_git = {
209
204
  default_branch,
210
- fetch_branch,
211
205
  return_to_default_branch,
212
206
  current_branch,
213
207
  commit_ahead,
@@ -215,7 +209,6 @@ const propagate_git = {
215
209
  has_pre_push_hook,
216
210
  can_push_without_hooks,
217
211
  is_clean,
218
- is_up_to_date,
219
212
  decide_tree_state,
220
213
  tree_state,
221
214
  }
@@ -1,4 +1,4 @@
1
- import { git_gh_exec } from '#scripts/git/git-gh-exec'
1
+ import { git_gh_exec } from '#scripts/gh/git-gh-exec'
2
2
  import { poll } from '#scripts/lib/poll'
3
3
  import { with_page_size } from '#scripts/version/version-remote'
4
4
 
@@ -161,6 +161,7 @@ async function wait_for_publish(
161
161
  const { state } = probe_once(resolved, versions_endpoint, target_version, progress)
162
162
 
163
163
  if (state !== undefined) return finish(state, target_version, progress.attempts)
164
+ // eslint-disable-next-line no-await-in-loop -- polling: each read waits on the state the previous one saw
164
165
  await resolved.sleep(resolved.interval_ms)
165
166
  }
166
167
 
@@ -168,8 +169,6 @@ async function wait_for_publish(
168
169
  }
169
170
 
170
171
  const propagate_publish = {
171
- DEFAULT_TIMEOUT_MS,
172
- DEFAULT_INTERVAL_MS,
173
172
  UNREADABLE_THRESHOLD,
174
173
  is_version_published,
175
174
  should_keep_waiting,
@@ -189,8 +189,6 @@ function format_report(results: ReadonlyArray<TargetResult>): string {
189
189
  const propagate_run = {
190
190
  PROPAGATED_REASON,
191
191
  LEFTOVER_NOTE,
192
- has_leftover_changes,
193
- leftover_of,
194
192
  STEP_RETURN,
195
193
  STEP_PRECHECK,
196
194
  STEP_ISSUE,
@@ -1,7 +1,7 @@
1
1
  import { pr_classification } from '#scripts/ci/pr-classification'
2
- import { git_gh_exec } from '#scripts/git/git-gh-exec'
3
- import { git_gh_issue_write } from '#scripts/git/git-gh-issue-write'
4
- import { OTHER_CHANGE_LABEL } from '#scripts/git/issue-labels'
2
+ import { git_gh_exec } from '#scripts/gh/git-gh-exec'
3
+ import { git_gh_issue_write } from '#scripts/gh/git-gh-issue-write'
4
+ import { OTHER_CHANGE_LABEL } from '#scripts/issue/issue-labels'
5
5
  import { GATE_COMMAND } from '#scripts/josh/josh-command-types'
6
6
  import { error_text } from '#scripts/lib/error-message'
7
7
  import { build_upgrade_shell_command } from '#scripts/version/upgrade-shell-command'
@@ -428,14 +428,12 @@ function describe_step(target: PropagateTarget, step: string): StepResult {
428
428
  }
429
429
 
430
430
  const propagate_steps = {
431
- STEP_COMMANDS,
432
431
  JOSH_BIN,
433
432
  PROPAGATE_ORIGIN,
434
433
  sync_command,
435
434
  upgrade_command,
436
435
  upgrade_commands,
437
436
  sync_commands,
438
- return_step,
439
437
  VERIFY_SCRIPT,
440
438
  issue_title,
441
439
  issue_body,
@@ -159,11 +159,7 @@ function resolve_targets(
159
159
  }
160
160
 
161
161
  const propagate_targets = {
162
- has_checkout,
163
162
  read_manifest,
164
- classify_manifest_absence,
165
- classify_before_dependency,
166
- declared_range,
167
163
  installed_version,
168
164
  classify_target,
169
165
  resolve_targets,
@@ -279,16 +279,12 @@ async function main(argv: ReadonlyArray<string>): Promise<void> {
279
279
  }
280
280
 
281
281
  const propagate = {
282
- DRY_RUN_REASON,
283
282
  KNOWN_FLAGS,
284
283
  TARGET_FLAG,
285
284
  parse_options,
286
285
  refuse_outside_source_repository,
287
286
  resolve_target_version,
288
287
  resolve_run_version,
289
- announce_run_version,
290
- run,
291
- main,
292
288
  }
293
289
 
294
290
  if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
@@ -173,7 +173,6 @@ const import_graph = {
173
173
  expand,
174
174
  expand_scope,
175
175
  invert,
176
- neighbors_of,
177
176
  parse_imports,
178
177
  resolve_spec,
179
178
  MAX_STAGES,
@@ -241,8 +241,6 @@ const refactor_lint = {
241
241
  parse_results,
242
242
  scan_categories,
243
243
  CATEGORIES,
244
- HIGH,
245
- MEDIUM,
246
244
  LOW,
247
245
  }
248
246
 
@@ -1,3 +1,4 @@
1
+ import { git_command } from '#scripts/git/git-command'
1
2
  import { line_targets } from '#scripts/lines/line-targets'
2
3
  import { import_graph } from './import-graph'
3
4
  import { refactor_lint, type CategoryResult } from './refactor-lint'
@@ -97,7 +98,7 @@ async function scan(root: string): Promise<ScanResult> {
97
98
  }
98
99
 
99
100
  async function run_scan(): Promise<number> {
100
- const root = await line_targets.repo_root()
101
+ const root = await git_command.repository_root()
101
102
  const result = await scan(root)
102
103
 
103
104
  process.stdout.write(`${render_result(result)}\n`)
@@ -111,7 +112,6 @@ const refactor_scan = {
111
112
  render,
112
113
  render_result,
113
114
  run_scan,
114
- scan,
115
115
  convergence_candidates,
116
116
  verdict_line,
117
117
  verdict_token,
@@ -95,7 +95,6 @@ const refactor_targets = {
95
95
  collect_targets,
96
96
  has_ignore_marker,
97
97
  is_path_excluded,
98
- keep_target,
99
98
  scripts_files,
100
99
  select_scope,
101
100
  }
@@ -99,25 +99,33 @@ function is_github_tarball_line(line: string): boolean {
99
99
  return line.trimStart().startsWith('tarball: https://npm.pkg.github.com/')
100
100
  }
101
101
 
102
- function clean_kit_line(
102
+ // Integrities are keyed by `name@version`, so two scoped packages sharing a version never collide.
103
+ function package_id(key: string): string {
104
+ const name = fix_gh_packages_logic.package_path_from_key(key)
105
+
106
+ return `${name}@${fix_gh_packages_logic.package_version_from_key(key)}`
107
+ }
108
+
109
+ function clean_scoped_line(
103
110
  line: string,
104
- version: string,
111
+ id: string,
105
112
  integrities: ReadonlyMap<string, IntegrityPair>,
106
113
  ): string | undefined {
107
- if (!version) return line
114
+ if (!id) return line
108
115
  if (is_github_tarball_line(line)) return undefined
109
116
  const cleaned = remove_flow_tarball(line)
110
- const pair = integrities.get(version)
117
+ const pair = integrities.get(id)
111
118
  if (pair === undefined) return cleaned
112
119
 
113
120
  return cleaned.split(`integrity: ${pair[0]}`).join(`integrity: ${pair[1]}`)
114
121
  }
115
122
 
116
- function next_kit_version(line: string, version: string): string {
117
- if (!is_package_entry(line)) return version
118
- const prefix = " '@joshuafolkken/kit@"
123
+ function next_scoped_id(line: string, id: string): string {
124
+ if (!is_package_entry(line)) return id
125
+ const prefix = ` '${SCOPE}/`
126
+ if (!line.startsWith(prefix)) return ''
119
127
 
120
- return line.startsWith(prefix) ? (line.slice(prefix.length).split("'", 1)[0] ?? '') : ''
128
+ return package_id(line.slice(" '".length).split("'", 1)[0] ?? '')
121
129
  }
122
130
 
123
131
  function integrity_pair(
@@ -135,12 +143,12 @@ function lock_integrities(
135
143
  ): Map<string, IntegrityPair> {
136
144
  const packages = fix_gh_packages_logic.parse_lockfile_packages(lockfile)
137
145
  const pairs = new Map<string, IntegrityPair>()
138
- const kit_entries = Object.entries(packages).filter(([key]) => key.startsWith(`${SCOPE}/kit@`))
146
+ const scoped_entries = Object.entries(packages).filter(([key]) => key.startsWith(`${SCOPE}/`))
139
147
 
140
- for (const [key, entry] of kit_entries) {
141
- const version = fix_gh_packages_logic.package_version_from_key(key)
142
- const pair = integrity_pair(entry.resolution?.integrity, npm_integrities.get(version))
143
- if (pair !== undefined) pairs.set(version, pair)
148
+ for (const [key, entry] of scoped_entries) {
149
+ const id = package_id(key)
150
+ const pair = integrity_pair(entry.resolution?.integrity, npm_integrities.get(id))
151
+ if (pair !== undefined) pairs.set(id, pair)
144
152
  }
145
153
 
146
154
  return pairs
@@ -150,17 +158,17 @@ function push_if_defined(lines: Array<string>, cleaned: string | undefined): voi
150
158
  if (cleaned !== undefined) lines.push(cleaned)
151
159
  }
152
160
 
153
- function rewrite_kit_lockfile(
161
+ function rewrite_scoped_lockfile(
154
162
  lockfile: string,
155
163
  npm_integrities: ReadonlyMap<string, string>,
156
164
  ): string {
157
- let kit_version = ''
165
+ let id = ''
158
166
  const lines: Array<string> = []
159
167
  const integrities = lock_integrities(lockfile, npm_integrities)
160
168
 
161
169
  for (const line of lockfile.split('\n')) {
162
- kit_version = next_kit_version(line, kit_version)
163
- const cleaned = clean_kit_line(line, kit_version, integrities)
170
+ id = next_scoped_id(line, id)
171
+ const cleaned = clean_scoped_line(line, id, integrities)
164
172
 
165
173
  push_if_defined(lines, cleaned)
166
174
  }
@@ -206,7 +214,8 @@ function previous_registry(project_npmrc: string, user_npmrc: string): string {
206
214
 
207
215
  function plan(project_npmrc: string, user_npmrc: string, lockfile: string): MigrationPlan {
208
216
  const packages = scoped_packages(lockfile)
209
- const blocked = packages.filter((name) => name !== `${SCOPE}/kit`)
217
+ // Every scoped package may migrate; `migrate` blocks any whose locked version is not on public npm.
218
+ const blocked: Array<string> = []
210
219
  if (has_duplicate_mapping(project_npmrc, user_npmrc)) blocked.push('duplicate registry mappings')
211
220
  const unsupported = unsupported_registry(project_npmrc)
212
221
  if (unsupported !== undefined) blocked.push(unsupported)
@@ -220,9 +229,7 @@ const migrate_logic = {
220
229
  plan,
221
230
  github_tarballs,
222
231
  is_github_tarball,
223
- rewrite_kit_lockfile,
224
- registry_of,
225
- scoped_packages,
232
+ rewrite_scoped_lockfile,
226
233
  scoped_versions,
227
234
  }
228
235
 
@@ -2,6 +2,8 @@ import { existsSync, rmSync, writeFileSync } from 'node:fs'
2
2
  import path from 'node:path'
3
3
  import { fileURLToPath } from 'node:url'
4
4
  import { file_reader } from '#scripts/lib/read-file'
5
+ import { timed_fetch } from '#scripts/lib/timed-fetch'
6
+ import { COMMAND_TIMEOUT_MS, INSTALL_TIMEOUT_MS } from '#scripts/lib/timeouts'
5
7
  import { execa } from 'execa'
6
8
  import { z } from 'zod'
7
9
  import { migrate_logic, type MigrationPlan } from './migrate-logic'
@@ -11,7 +13,6 @@ const NPMRC = '.npmrc'
11
13
  const LOCKFILE = 'pnpm-lock.yaml'
12
14
  const WORKSPACE = 'pnpm-workspace.yaml'
13
15
  const PUBLIC_REGISTRY = 'https://registry.npmjs.org/'
14
- const FETCH_TIMEOUT_MS = 10_000
15
16
  const SCOPE = '@joshuafolkken/'
16
17
  const manifest_schema = z.looseObject({
17
18
  dependencies: z.record(z.string(), z.string()).optional(),
@@ -104,13 +105,19 @@ async function verify_public_versions(
104
105
  lockfile: string,
105
106
  probe_version: MigrationDependencies['fetch_version'],
106
107
  ): Promise<VersionCheck> {
108
+ const versions = migrate_logic.scoped_versions(lockfile)
109
+ // Each probe reads its own package, so they run together; the report keeps the lockfile's order.
110
+ const probed = await Promise.all(
111
+ versions.map(async ([name, version]) => await probe_integrity(name, version, probe_version)),
112
+ )
107
113
  const missing: Array<string> = []
108
114
  const integrities = new Map<string, string>()
109
115
 
110
- for (const [name, version] of migrate_logic.scoped_versions(lockfile)) {
111
- const integrity = await probe_integrity(name, version, probe_version)
112
- if (integrity === undefined) missing.push(`${name}@${version}`)
113
- else integrities.set(version, integrity)
116
+ for (const [index, [name, version]] of versions.entries()) {
117
+ const integrity = probed[index]
118
+ const id = `${name}@${version}`
119
+ if (integrity === undefined) missing.push(id)
120
+ else integrities.set(id, integrity)
114
121
  }
115
122
 
116
123
  return { missing, integrities }
@@ -177,7 +184,7 @@ async function verify_resolution(
177
184
  const old_tarballs = migrate_logic.github_tarballs(lockfile)
178
185
  if (old_tarballs.length > 0) throw new Error(`GitHub tarballs remain: ${old_tarballs.join(', ')}`)
179
186
 
180
- if (migrate_logic.rewrite_kit_lockfile(lockfile, integrities) !== lockfile) {
187
+ if (migrate_logic.rewrite_scoped_lockfile(lockfile, integrities) !== lockfile) {
181
188
  throw new Error('lockfile integrity does not match public npm')
182
189
  }
183
190
  }
@@ -191,7 +198,7 @@ async function apply(
191
198
  writeFileSync(context.npmrc_path, context.plan.content)
192
199
  writeFileSync(
193
200
  context.lockfile_path,
194
- migrate_logic.rewrite_kit_lockfile(context.original_lockfile, integrities),
201
+ migrate_logic.rewrite_scoped_lockfile(context.original_lockfile, integrities),
195
202
  )
196
203
  await verify_resolution(context, dependencies, integrities)
197
204
  } catch (error) {
@@ -209,7 +216,7 @@ function is_already_migrated(
209
216
  ): boolean {
210
217
  return (
211
218
  context.plan.content === context.original_npmrc &&
212
- migrate_logic.rewrite_kit_lockfile(context.original_lockfile, integrities) ===
219
+ migrate_logic.rewrite_scoped_lockfile(context.original_lockfile, integrities) ===
213
220
  context.original_lockfile
214
221
  )
215
222
  }
@@ -238,9 +245,7 @@ async function migrate(cwd: string, dependencies: MigrationDependencies): Promis
238
245
 
239
246
  async function fetch_version(name: string, version: string): Promise<string | undefined> {
240
247
  const encoded = encodeURIComponent(name)
241
- const response = await fetch(`${PUBLIC_REGISTRY}${encoded}/${encodeURIComponent(version)}`, {
242
- signal: AbortSignal.timeout(FETCH_TIMEOUT_MS),
243
- })
248
+ const response = await timed_fetch(`${PUBLIC_REGISTRY}${encoded}/${encodeURIComponent(version)}`)
244
249
 
245
250
  if (!response.ok) return undefined
246
251
  const parsed = version_schema.safeParse(await response.json())
@@ -250,11 +255,17 @@ async function fetch_version(name: string, version: string): Promise<string | un
250
255
  }
251
256
 
252
257
  async function install(cwd: string): Promise<void> {
253
- await execa('pnpm', ['install', '--lockfile-only', '--ignore-scripts', '--force'], { cwd })
258
+ await execa('pnpm', ['install', '--lockfile-only', '--ignore-scripts', '--force'], {
259
+ cwd,
260
+ timeout: INSTALL_TIMEOUT_MS,
261
+ })
254
262
  }
255
263
 
256
264
  async function effective_registry(cwd: string): Promise<string> {
257
- const result = await execa('pnpm', ['config', 'get', '@joshuafolkken:registry'], { cwd })
265
+ const result = await execa('pnpm', ['config', 'get', '@joshuafolkken:registry'], {
266
+ cwd,
267
+ timeout: COMMAND_TIMEOUT_MS,
268
+ })
258
269
 
259
270
  return result.stdout.trim()
260
271
  }
@@ -275,7 +286,7 @@ async function main(): Promise<void> {
275
286
 
276
287
  if (process.argv[1] === fileURLToPath(import.meta.url)) await main()
277
288
 
278
- const registry_migration = { migrate }
289
+ const registry_migration = { migrate, install, effective_registry }
279
290
 
280
291
  export { registry_migration }
281
292
  export type { MigrationDependencies }
@@ -1,11 +1,24 @@
1
- import { execFileSync } from 'node:child_process'
1
+ import { fileURLToPath } from 'node:url'
2
+ import { git_spawn_sync } from '#scripts/git/git-spawn-sync'
2
3
  import { github_release } from './github-release'
4
+ import { github_release_environment } from './github-release-environment'
3
5
 
4
- const token = process.env['GH_TOKEN']
5
- const tag = process.env['RELEASE_TAG']
6
+ // A release published without the tag list would pick its previous tag from nothing, so a failed
7
+ // `git tag` stops the run rather than reading as "no tags".
8
+ function local_tags(): Array<string> {
9
+ const output = git_spawn_sync.read(['tag', '--list'])
10
+ if (output === undefined) throw new Error('git tag --list failed')
6
11
 
7
- if (!token || !tag) throw new Error('GH_TOKEN and RELEASE_TAG are required')
12
+ return output.split('\n')
13
+ }
8
14
 
9
- const tags = execFileSync('git', ['tag', '--list'], { encoding: 'utf8' }).trim().split('\n')
15
+ async function main(): Promise<void> {
16
+ const { token, tag, settings } = github_release_environment.read_release_input(process.env)
10
17
 
11
- console.info(await github_release.publish(fetch, token, tag, { tags }))
18
+ console.info(await github_release.publish(fetch, token, tag, { ...settings, tags: local_tags() }))
19
+ }
20
+
21
+ if (process.argv[1] === fileURLToPath(import.meta.url)) await main()
22
+
23
+ const github_release_cli = { local_tags }
24
+ export { github_release_cli }
@@ -0,0 +1,46 @@
1
+ import type { ReleaseSettings } from './github-release'
2
+
3
+ interface ReleaseInput {
4
+ token: string
5
+ tag: string
6
+ settings: ReleaseSettings
7
+ }
8
+
9
+ type Environment = Readonly<Record<string, string | undefined>>
10
+
11
+ // A workflow expression renders an unset input as the empty string, so empty means "not given".
12
+ function optional(value: string | undefined): string | undefined {
13
+ return value === undefined || value === '' ? undefined : value
14
+ }
15
+
16
+ function job_names(value: string | undefined): ReadonlyArray<string> {
17
+ return (optional(value) ?? '')
18
+ .split(',')
19
+ .map((name) => name.trim())
20
+ .filter((name) => name !== '')
21
+ }
22
+
23
+ function read_release_input(environment: Environment): ReleaseInput {
24
+ const token = optional(environment['GH_TOKEN'])
25
+ const tag = optional(environment['RELEASE_TAG'])
26
+ const repository = optional(environment['GITHUB_REPOSITORY'])
27
+
28
+ if (!token || !tag || !repository) {
29
+ throw new Error('GH_TOKEN, RELEASE_TAG and GITHUB_REPOSITORY are required')
30
+ }
31
+
32
+ return {
33
+ token,
34
+ tag,
35
+ settings: {
36
+ repository,
37
+ start_tag: optional(environment['RELEASE_START_TAG']),
38
+ workflow: optional(environment['RELEASE_WORKFLOW']),
39
+ jobs: job_names(environment['RELEASE_JOBS']),
40
+ },
41
+ }
42
+ }
43
+
44
+ const github_release_environment = { read_release_input }
45
+
46
+ export { github_release_environment }