@joshuafolkken/kit 1.1035.0 → 1.1094.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 (605) hide show
  1. package/.claude/settings.json +9 -8
  2. package/.claude/skills/epic-commands/SKILL.md +5 -7
  3. package/.claude/skills/verify-ui/SKILL.md +1 -1
  4. package/.claude/skills/workflow-commands/SKILL.md +21 -13
  5. package/.claude/skills/workflow-commands/background-commands.md +5 -4
  6. package/.claude/skills/workflow-commands/backlogrun-child.md +3 -3
  7. package/.claude/skills/workflow-commands/backlogrun-lanes.md +9 -7
  8. package/.claude/skills/workflow-commands/backlogrun-park.md +6 -0
  9. package/.claude/skills/workflow-commands/backlogrun-progress.md +31 -37
  10. package/.claude/skills/workflow-commands/backlogrun-steps.md +25 -25
  11. package/.claude/skills/workflow-commands/backlogrun.md +2 -2
  12. package/.claude/skills/workflow-commands/chain-rule.md +6 -4
  13. package/.claude/skills/workflow-commands/delegation.md +3 -3
  14. package/.claude/skills/workflow-commands/followup-reference.md +3 -3
  15. package/.claude/skills/workflow-commands/followup.md +7 -3
  16. package/.claude/skills/workflow-commands/fullrun-steps.md +3 -2
  17. package/.claude/skills/workflow-commands/fullrun.md +3 -2
  18. package/.claude/skills/workflow-commands/halfrun.md +16 -19
  19. package/.claude/skills/workflow-commands/issue-comments.md +2 -2
  20. package/.claude/skills/workflow-commands/issue-fold-existing.md +10 -10
  21. package/.claude/skills/workflow-commands/issue-scout.md +1 -1
  22. package/.claude/skills/workflow-commands/kickoff.md +9 -4
  23. package/.claude/skills/workflow-commands/latest-gate.md +1 -1
  24. package/.claude/skills/workflow-commands/needs-human-review.md +1 -1
  25. package/.claude/skills/workflow-commands/observation-filing.md +44 -89
  26. package/.claude/skills/workflow-commands/pre-gate-cut.md +33 -36
  27. package/.claude/skills/workflow-commands/prerequisite.md +1 -1
  28. package/.claude/skills/workflow-commands/prrun.md +36 -0
  29. package/.claude/skills/workflow-commands/retrospective.md +1 -1
  30. package/.claude/skills/workflow-commands/working-tree-hold.md +24 -4
  31. package/.codex/hooks.json +16 -20
  32. package/.github/actions/setup-pnpm/action.yml +93 -0
  33. package/.github/dependabot.yml +5 -1
  34. package/.github/workflows/auto-tag.yml +21 -0
  35. package/.github/workflows/ci.yml +26 -128
  36. package/.github/workflows/pr-classification.yml +5 -41
  37. package/.github/workflows/publish.yml +42 -48
  38. package/.github/workflows/sonar-qube.yml +37 -4
  39. package/AGENTS.md +12 -2
  40. package/CLAUDE.md +15 -16
  41. package/GEMINI.md +14 -2
  42. package/README.md +59 -18
  43. package/SECURITY.md +36 -6
  44. package/cspell/index.yaml +2 -1
  45. package/dist/CLAUDE.md +15 -16
  46. package/dist/config-merge/index.js +15 -3
  47. package/dist/hooks/batch-guard.js +4 -4
  48. package/dist/hooks/{chunk-Y27M6A7X.js → chunk-3C4YCCEF.js} +5 -13
  49. package/dist/hooks/{chunk-D67KVGGY.js → chunk-7ZPFAVR7.js} +17 -88
  50. package/dist/hooks/{chunk-HOYJU5RM.js → chunk-E54KGFEQ.js} +11 -4
  51. package/dist/hooks/{chunk-KG6PZD72.js → chunk-IL27YTPH.js} +2 -2
  52. package/dist/hooks/{chunk-GJT4BNVE.js → chunk-KHWHKJOM.js} +3 -3
  53. package/dist/hooks/{chunk-HU66PWWL.js → chunk-M2XDCUKD.js} +1076 -509
  54. package/dist/hooks/{chunk-GLBDBJOK.js → chunk-NKOG3XAV.js} +199 -304
  55. package/dist/hooks/{chunk-ZXNE6NY3.js → chunk-O4LL4HTI.js} +2 -7
  56. package/dist/hooks/{chunk-XPLP27WA.js → chunk-OIZUHPJI.js} +5 -27
  57. package/dist/hooks/{chunk-EIFCAJRB.js → chunk-UD24EAIL.js} +2546 -1636
  58. package/dist/hooks/codex-hook-adapter.js +10 -11
  59. package/dist/hooks/duplicate-read-guard.js +5 -5
  60. package/dist/hooks/format-edited.js +15 -34
  61. package/dist/hooks/inputs.json +279 -0
  62. package/dist/hooks/investigation-guard.js +5 -5
  63. package/dist/hooks/pretool-guard.js +23 -16
  64. package/dist/hooks/session-lang.js +0 -1
  65. package/dist/hooks/stop-guard.js +188 -509
  66. package/dist/josh.js +166 -225
  67. package/dist/managed-marker/index.js +2 -1
  68. package/dist/version/index.js +412 -64
  69. package/eslint/rules/promise.js +5 -0
  70. package/package.json +13 -8
  71. package/prompts/collaboration-workflow/file-edits.md +6 -53
  72. package/prompts/collaboration-workflow/issue-citation.md +5 -5
  73. package/prompts/collaboration-workflow/operating-rules.md +4 -4
  74. package/prompts/collaboration-workflow/overview.md +13 -1
  75. package/prompts/collaboration-workflow/report-format.md +1 -1
  76. package/prompts/collaboration-workflow/residency.md +4 -4
  77. package/prompts/collaboration-workflow/rule-delivery.md +5 -36
  78. package/prompts/collaboration-workflow/shell-body.md +7 -9
  79. package/prompts/collaboration-workflow/turn-batching.md +21 -37
  80. package/prompts/collaboration-workflow/upstream-interrupt.md +1 -1
  81. package/prompts/collaboration-workflow/wip-cap.md +36 -36
  82. package/prompts/collaboration-workflow.md +5 -8
  83. package/prompts/review-rubric.md +1 -1
  84. package/prompts/review.md +3 -3
  85. package/prompts/sonar-hotspot-handling.md +12 -4
  86. package/prompts/testing-guide.md +3 -3
  87. package/scripts/adopt/adopt-toolkits.ts +2 -2
  88. package/scripts/adopt/adopt.ts +0 -2
  89. package/scripts/agent/agent-argv.ts +0 -2
  90. package/scripts/agent/agent-diagnostics.ts +1 -1
  91. package/scripts/agent/agent-role-profile.ts +0 -7
  92. package/scripts/agent/claude-agent-argv.ts +0 -2
  93. package/scripts/agent/codex-agent-argv.ts +1 -1
  94. package/scripts/agent/codex-hooks.ts +92 -0
  95. package/scripts/agent/interactive-ask.ts +1 -1
  96. package/scripts/auto-ok/auto-ok-cli.ts +15 -25
  97. package/scripts/backlog/backlog-budget.ts +0 -2
  98. package/scripts/backlog/backlog-defect-priority.ts +2 -2
  99. package/scripts/backlog/backlog-drive-cli.ts +10 -8
  100. package/scripts/backlog/backlog-drive-named-offer.ts +16 -3
  101. package/scripts/backlog/backlog-drive-named.ts +2 -1
  102. package/scripts/backlog/backlog-drive.ts +76 -16
  103. package/scripts/backlog/backlog-named.ts +0 -3
  104. package/scripts/backlog/backlog-next.ts +32 -22
  105. package/scripts/backlog/backlog-offer-cli.ts +0 -5
  106. package/scripts/backlog/backlog-plan-cli.ts +6 -8
  107. package/scripts/backlog/backlog-plan.ts +1 -1
  108. package/scripts/backlog/backlog-pool.ts +34 -17
  109. package/scripts/backlog/backlog-rank.ts +106 -0
  110. package/scripts/backlog/backlog-ready.ts +19 -3
  111. package/scripts/backlog/backlog-scope.ts +1 -3
  112. package/scripts/backlog/backlog-stalled-detect.ts +2 -2
  113. package/scripts/backlog/backlog-stalled.ts +0 -1
  114. package/scripts/backlog/backlog-waves.ts +47 -31
  115. package/scripts/behavior/behavior-cli.ts +1 -1
  116. package/scripts/build/build-codex-hooks.ts +26 -0
  117. package/scripts/build/build-hooks.ts +92 -11
  118. package/scripts/build/hook-bundle-stamp.ts +111 -0
  119. package/scripts/cases/cases-cli.ts +1 -1
  120. package/scripts/cases/cases-logic.ts +1 -1
  121. package/scripts/ci/composite-actions.ts +30 -0
  122. package/scripts/ci/pr-classification.ts +3 -3
  123. package/scripts/claude/workflow-destination.ts +10 -1
  124. package/scripts/clone/clone-fingerprint.ts +0 -1
  125. package/scripts/clone/clone-scan-cli.ts +1 -1
  126. package/scripts/clone/clone-scan.ts +1 -1
  127. package/scripts/config-merge/json-format.ts +0 -1
  128. package/scripts/config-merge/patch-yaml-list.ts +1 -1
  129. package/scripts/cost-runtime/codex-usage.ts +2 -9
  130. package/scripts/cost-runtime/cost-attribute.ts +0 -1
  131. package/scripts/cost-runtime/cost-cli.ts +0 -3
  132. package/scripts/cost-runtime/cost-corpus.ts +0 -2
  133. package/scripts/cost-runtime/cost-format.ts +0 -3
  134. package/scripts/cost-runtime/cost-pricing.ts +0 -1
  135. package/scripts/cost-runtime/cost-tokens.ts +0 -1
  136. package/scripts/delegation/delegation-cli.ts +1 -1
  137. package/scripts/delegation/delegation-policy.ts +11 -1
  138. package/scripts/delegation/duplicate-read-guard.ts +0 -8
  139. package/scripts/delegation/fanout-cli.ts +1 -1
  140. package/scripts/delegation/fanout.ts +0 -2
  141. package/scripts/delegation/investigation-reads.ts +1 -164
  142. package/scripts/discovery/repo-map-logic.ts +0 -1
  143. package/scripts/discovery/repo-party-cli.ts +1 -1
  144. package/scripts/doctor/doctor-consumer.ts +4 -6
  145. package/scripts/doctor/doctor-logic.ts +0 -4
  146. package/scripts/doctor/doctor.ts +14 -9
  147. package/scripts/document/document-byte-budget.ts +8 -9
  148. package/scripts/document/document-byte-check.ts +0 -1
  149. package/scripts/document/document-read-cli.ts +0 -2
  150. package/scripts/document/document-section-cli.ts +1 -1
  151. package/scripts/document/document-section.ts +0 -3
  152. package/scripts/document/edit-files-cli.ts +0 -1
  153. package/scripts/document/entry-read-budget.ts +13 -4
  154. package/scripts/document/lane-child-read-set.ts +1 -6
  155. package/scripts/document/read-files-cli.ts +0 -4
  156. package/scripts/document/read-set-cli.ts +0 -2
  157. package/scripts/document/read-set-point-of-use.ts +1 -0
  158. package/scripts/document/read-set-pricing.ts +0 -1
  159. package/scripts/document/read-set-trim.ts +1 -1
  160. package/scripts/epic/epic-add.ts +1 -1
  161. package/scripts/epic/epic-audit-cli.ts +1 -4
  162. package/scripts/epic/epic-audit-orphans.ts +1 -3
  163. package/scripts/epic/epic-audit-rationale.ts +0 -1
  164. package/scripts/epic/epic-audit-report.ts +0 -2
  165. package/scripts/epic/epic-audit.ts +5 -4
  166. package/scripts/epic/epic-bundle-cli.ts +1 -1
  167. package/scripts/epic/epic-bundle-evidence.ts +0 -1
  168. package/scripts/epic/epic-bundle-referenced.ts +1 -5
  169. package/scripts/epic/epic-bundle.ts +0 -4
  170. package/scripts/epic/epic-busy.ts +4 -5
  171. package/scripts/epic/epic-candidate-confirm.ts +0 -5
  172. package/scripts/epic/epic-classify.ts +2 -2
  173. package/scripts/epic/epic-cli-argv.ts +0 -1
  174. package/scripts/epic/epic-close-comment.ts +1 -1
  175. package/scripts/epic/epic-close.ts +5 -2
  176. package/scripts/epic/epic-cross-repo.ts +2 -4
  177. package/scripts/epic/epic-decision.ts +0 -1
  178. package/scripts/epic/epic-fetch.ts +2 -2
  179. package/scripts/epic/epic-index.ts +2 -3
  180. package/scripts/epic/epic-issue.ts +1 -15
  181. package/scripts/epic/epic-lane-offer.ts +20 -30
  182. package/scripts/epic/epic-nested.ts +1 -1
  183. package/scripts/epic/epic-next-read.ts +1 -3
  184. package/scripts/epic/epic-next-views.ts +0 -1
  185. package/scripts/epic/epic-next.ts +1 -10
  186. package/scripts/epic/epic-parse.ts +0 -1
  187. package/scripts/epic/epic-promote.ts +0 -9
  188. package/scripts/epic/epic-rank.ts +37 -0
  189. package/scripts/epic/epic-read.ts +1 -2
  190. package/scripts/epic/epic-reconcile.ts +1 -1
  191. package/scripts/epic/epic-reference.ts +1 -13
  192. package/scripts/epic/epic-relation-recheck.ts +1 -1
  193. package/scripts/epic/epic-relations.ts +1 -1
  194. package/scripts/epic/epic-remove.ts +1 -1
  195. package/scripts/epic/epic-report.ts +0 -1
  196. package/scripts/epic/epic-run.ts +2 -3
  197. package/scripts/epic/epic-shape.ts +1 -1
  198. package/scripts/epic/epic-solo-stale.ts +107 -0
  199. package/scripts/epic/epic-solo.ts +32 -30
  200. package/scripts/epic/epic-triage.ts +1 -1
  201. package/scripts/epic/epic-validate.ts +1 -1
  202. package/scripts/epic/epic.ts +1 -1
  203. package/scripts/exports/unused-members-cli.ts +53 -0
  204. package/scripts/{git → followup}/followup-issue-number.ts +1 -6
  205. package/scripts/{git → followup}/git-followup-cleanup.ts +2 -1
  206. package/scripts/{git → followup}/git-followup-finish.ts +1 -3
  207. package/scripts/{git → followup}/git-followup-flush.ts +2 -2
  208. package/scripts/{git → followup}/git-followup-issue-close.ts +2 -2
  209. package/scripts/{git → followup}/git-followup-label.ts +4 -4
  210. package/scripts/followup/git-followup-merged.ts +112 -0
  211. package/scripts/{git → followup}/git-followup-pending.ts +1 -1
  212. package/scripts/{git → followup}/git-followup-workflow.ts +19 -11
  213. package/scripts/{git → followup}/git-pr-followup-wrapup.ts +9 -3
  214. package/scripts/{git → followup}/git-pr-followup.ts +53 -16
  215. package/scripts/gate/core-budget.ts +3 -9
  216. package/scripts/gate/gate-plan.ts +7 -4
  217. package/scripts/gate/gate-report.ts +0 -6
  218. package/scripts/gate/gate-tree.ts +1 -1
  219. package/scripts/gate/pre-commit-type-check.ts +0 -6
  220. package/scripts/gate/project-checks.ts +7 -8
  221. package/scripts/gate/scoped-green.ts +0 -1
  222. package/scripts/gate/type-check-step.ts +1 -1
  223. package/scripts/gate/verification-gate.ts +0 -2
  224. package/scripts/gh/fix-gh-packages.ts +15 -12
  225. package/scripts/gh/gh-spawn.ts +2 -2
  226. package/scripts/{git → gh}/git-ai-review-scan.ts +1 -5
  227. package/scripts/{git → gh}/git-gh-check.ts +2 -1
  228. package/scripts/{git → gh}/git-gh-exec.ts +1 -1
  229. package/scripts/{git → gh}/git-gh-failure.ts +1 -1
  230. package/scripts/{git → gh}/git-gh-helpers.ts +0 -1
  231. package/scripts/{git → gh}/git-gh-issue-list.ts +2 -0
  232. package/scripts/{git → gh}/git-gh-issue-read.ts +1 -1
  233. package/scripts/{git → gh}/git-gh-issue-rest.ts +6 -3
  234. package/scripts/{git → gh}/git-gh-pr-read.ts +24 -0
  235. package/scripts/{git → gh}/git-gh-pr-rest.ts +5 -2
  236. package/scripts/{git → gh}/git-gh-pr-review.ts +2 -2
  237. package/scripts/{git → gh}/git-gh-pr-rollup.ts +1 -3
  238. package/scripts/{git → gh}/git-gh-pr.ts +3 -1
  239. package/scripts/{git → gh}/git-pr-ai-review.ts +2 -5
  240. package/scripts/{git → gh}/git-pr-checks-eval.ts +0 -10
  241. package/scripts/{git → gh}/git-pr-checks-parse.ts +4 -20
  242. package/scripts/{git → gh}/git-pr-checks.ts +2 -1
  243. package/scripts/{git → gh}/git-pr-coderabbit.ts +2 -5
  244. package/scripts/{git → gh}/git-pr-confirmation.ts +1 -3
  245. package/scripts/{git → gh}/git-pr-managed-config.ts +2 -3
  246. package/scripts/{git → gh}/git-pr.ts +3 -3
  247. package/scripts/git/changed-file-scope.ts +0 -1
  248. package/scripts/git/git-branch.ts +3 -6
  249. package/scripts/git/git-command.ts +1 -1
  250. package/scripts/git/git-commit.ts +1 -1
  251. package/scripts/git/git-common-directory.ts +80 -24
  252. package/scripts/git/git-error.ts +66 -9
  253. package/scripts/git/git-execa-error.ts +6 -1
  254. package/scripts/git/git-issue.ts +1 -1
  255. package/scripts/git/git-preflight.ts +24 -6
  256. package/scripts/git/git-prompt.ts +6 -31
  257. package/scripts/git/git-push-transport.ts +12 -69
  258. package/scripts/git/git-push.ts +1 -1
  259. package/scripts/git/git-spawn.ts +79 -3
  260. package/scripts/git/git-ssh-keepalive.ts +74 -0
  261. package/scripts/git/git-staging.ts +1 -0
  262. package/scripts/git/git-status.ts +1 -1
  263. package/scripts/git/git-workflow.ts +1 -1
  264. package/scripts/git/gone-branch.ts +4 -2
  265. package/scripts/git/listing-cutoff.ts +1 -1
  266. package/scripts/git/main-merge.ts +1 -1
  267. package/scripts/git/main-sync.ts +19 -1
  268. package/scripts/git/parse-json-array.ts +0 -3
  269. package/scripts/git/repository-lock.ts +16 -16
  270. package/scripts/git/{git-stash.ts → stash/git-stash.ts} +1 -1
  271. package/scripts/git/{stash-pop-args.ts → stash/stash-pop-args.ts} +1 -1
  272. package/scripts/git/{stash-pop-cli.ts → stash/stash-pop-cli.ts} +0 -1
  273. package/scripts/git/{stash-sweep-lock.ts → stash/stash-sweep-lock.ts} +3 -3
  274. package/scripts/hooks/codex-hook-adapter.ts +0 -1
  275. package/scripts/hooks/edited-cspell.ts +1 -1
  276. package/scripts/hooks/format-edited-cli.ts +15 -0
  277. package/scripts/hooks/format-edited-file.ts +4 -9
  278. package/scripts/hooks/pre-push-unit.ts +0 -4
  279. package/scripts/hooks/pretool-guard-cli.ts +21 -0
  280. package/scripts/hooks/pretool-guard.ts +36 -19
  281. package/scripts/hooks/reserved-run.ts +1 -1
  282. package/scripts/hooks/step-zero-notice.ts +76 -0
  283. package/scripts/hooks/stop-guard.ts +47 -21
  284. package/scripts/init/claude-plugin-config.ts +4 -5
  285. package/scripts/init/hook-command-rewrite.ts +16 -8
  286. package/scripts/init/hook-launch.ts +41 -15
  287. package/scripts/init/init-basic.ts +2 -5
  288. package/scripts/init/init-logic.ts +7 -0
  289. package/scripts/init/init.ts +0 -3
  290. package/scripts/init/project-profile.ts +6 -11
  291. package/scripts/init/start-exec.ts +8 -2
  292. package/scripts/init/start-plan.ts +18 -5
  293. package/scripts/init/start-setup-pr.ts +52 -25
  294. package/scripts/init/start-steps.ts +42 -9
  295. package/scripts/init/start.ts +40 -10
  296. package/scripts/issue/behavior-change-lint.ts +0 -1
  297. package/scripts/issue/defect-rate-cli.ts +3 -3
  298. package/scripts/issue/defect-rate.ts +1 -2
  299. package/scripts/{git → issue}/git-next-issues.ts +37 -8
  300. package/scripts/issue/issue-backlinks-cli.ts +1 -5
  301. package/scripts/issue/issue-cite-cli.ts +2 -6
  302. package/scripts/issue/issue-cite.ts +19 -3
  303. package/scripts/issue/issue-classification.ts +1 -9
  304. package/scripts/issue/issue-closing-pr.ts +4 -4
  305. package/scripts/issue/issue-comment-cli.ts +2 -2
  306. package/scripts/issue/issue-file-cli.ts +5 -5
  307. package/scripts/issue/issue-file.ts +2 -2
  308. package/scripts/issue/issue-fold-cli.ts +1 -1
  309. package/scripts/issue/issue-fold-existing-cli.ts +1 -1
  310. package/scripts/{git → issue}/issue-labels.ts +20 -0
  311. package/scripts/issue/issue-lint-cli.ts +1 -1
  312. package/scripts/issue/issue-merged.ts +2 -2
  313. package/scripts/issue/issue-rank.ts +89 -0
  314. package/scripts/issue/issue-read-cli.ts +8 -47
  315. package/scripts/issue/issue-read.ts +0 -2
  316. package/scripts/issue/issue-report-failures.ts +80 -0
  317. package/scripts/issue/issue-scout-cli.ts +1 -7
  318. package/scripts/issue/issue-scout-closed.ts +2 -2
  319. package/scripts/issue/issue-scout.ts +0 -2
  320. package/scripts/issue/issue-state-cli.ts +5 -46
  321. package/scripts/issue/issue-state.ts +1 -5
  322. package/scripts/issue/markdown-section.ts +1 -1
  323. package/scripts/issue/measure-rerun-cli.ts +1 -1
  324. package/scripts/issue/reproduction-measure.ts +1 -1
  325. package/scripts/josh/cli-body.ts +1 -1
  326. package/scripts/josh/file-map-stamp.ts +0 -3
  327. package/scripts/josh/josh-command-map.ts +2 -102
  328. package/scripts/josh/josh-commands-ai.ts +9 -102
  329. package/scripts/josh/josh-commands-backlog.ts +5 -1
  330. package/scripts/josh/josh-commands-development.ts +10 -3
  331. package/scripts/josh/josh-commands-issue.ts +2 -2
  332. package/scripts/josh/josh-commands-maintenance.ts +7 -0
  333. package/scripts/josh/josh-commands-project.ts +7 -1
  334. package/scripts/josh/josh-commands-run.ts +114 -0
  335. package/scripts/josh/josh-commands-versioning.ts +8 -0
  336. package/scripts/josh/josh-commands-workflow.ts +2 -2
  337. package/scripts/josh/path-decision.ts +0 -3
  338. package/scripts/josh/process-owner.ts +16 -0
  339. package/scripts/josh/session-language-cli.ts +0 -1
  340. package/scripts/lane/lane-await.ts +3 -6
  341. package/scripts/lane/lane-capacity.ts +6 -3
  342. package/scripts/lane/lane-child-invocation.ts +20 -7
  343. package/scripts/lane/lane-child-marker.ts +16 -2
  344. package/scripts/lane/lane-cli.ts +33 -18
  345. package/scripts/lane/lane-close.ts +1 -3
  346. package/scripts/lane/lane-dispatch.ts +3 -4
  347. package/scripts/lane/lane-environment.ts +0 -9
  348. package/scripts/lane/lane-handoff.ts +38 -0
  349. package/scripts/lane/lane-launch-cli.ts +21 -11
  350. package/scripts/lane/lane-open.ts +0 -3
  351. package/scripts/lane/lane-output.ts +0 -1
  352. package/scripts/lane/lane-registry.ts +9 -0
  353. package/scripts/lane/lane-report.ts +10 -4
  354. package/scripts/lane/openai-lane-ship.ts +2 -0
  355. package/scripts/lane/openai-lane-supervisor-decision.ts +2 -1
  356. package/scripts/lane/openai-lane-supervisor.ts +6 -4
  357. package/scripts/lane/openai-review-broker.ts +3 -0
  358. package/scripts/lib/bounded-pool.ts +1 -0
  359. package/scripts/lib/json-value.ts +5 -4
  360. package/scripts/lib/poll.ts +3 -1
  361. package/scripts/lib/timed-fetch.ts +15 -0
  362. package/scripts/lib/timeouts.ts +13 -0
  363. package/scripts/{yaml → lib}/yaml-document.ts +3 -1
  364. package/scripts/{bytes → lines}/bytes-command.ts +0 -2
  365. package/scripts/lines/lines-command.ts +0 -1
  366. package/scripts/lint/lint-related-scope.ts +0 -1
  367. package/scripts/lint/lint-related.ts +1 -1
  368. package/scripts/{git → notify}/telegram-notify.ts +2 -2
  369. package/scripts/{git → notify}/telegram-test.ts +4 -4
  370. package/scripts/observations/observation-ledger-home.ts +0 -1
  371. package/scripts/observations/observation-ledger-line.ts +0 -1
  372. package/scripts/observations/observation-ledger-migrate.ts +1 -1
  373. package/scripts/observations/observations-flush-landing.ts +3 -3
  374. package/scripts/observations/observations-flush.ts +2 -2
  375. package/scripts/overrides/lockfile-overrides.ts +1 -1
  376. package/scripts/overrides/overrides-logic.ts +1 -1
  377. package/scripts/package/package-scout-cli.ts +2 -7
  378. package/scripts/package/package-scout.ts +0 -2
  379. package/scripts/propagate/propagate-git-failure.ts +0 -1
  380. package/scripts/propagate/propagate-git.ts +0 -2
  381. package/scripts/propagate/propagate-plan.ts +185 -0
  382. package/scripts/propagate/propagate-publish.ts +2 -3
  383. package/scripts/propagate/propagate-run.ts +5 -3
  384. package/scripts/propagate/propagate-steps.ts +19 -6
  385. package/scripts/propagate/propagate-targets.ts +13 -6
  386. package/scripts/propagate/propagate.ts +60 -46
  387. package/scripts/refactor/import-graph.ts +0 -1
  388. package/scripts/refactor/refactor-lint.ts +0 -2
  389. package/scripts/refactor/refactor-scan.ts +0 -1
  390. package/scripts/refactor/refactor-targets.ts +0 -1
  391. package/scripts/registry-migration/migrate-logic.ts +1 -2
  392. package/scripts/registry-migration/migrate.ts +19 -9
  393. package/scripts/release/github-release-cli.ts +8 -6
  394. package/scripts/release/github-release-environment.ts +46 -0
  395. package/scripts/release/github-release.ts +151 -94
  396. package/scripts/release/release-history.ts +0 -1
  397. package/scripts/release/release-plan.ts +0 -1
  398. package/scripts/release/release-publish.ts +2 -3
  399. package/scripts/release/release-scope-cli.ts +1 -2
  400. package/scripts/release/release-tag.ts +2 -4
  401. package/scripts/repo/auto-merge-setting-logic.ts +1 -4
  402. package/scripts/repo/repo-setting.ts +1 -1
  403. package/scripts/repo/repository-labels.ts +3 -3
  404. package/scripts/repo/required-checks-logic.ts +206 -0
  405. package/scripts/repo/required-checks-report.ts +71 -0
  406. package/scripts/repo/ruleset-check-cli.ts +53 -0
  407. package/scripts/repo/ruleset-check.ts +147 -0
  408. package/scripts/report/report-lint-cli.ts +0 -4
  409. package/scripts/review/disposition-cli.ts +1 -1
  410. package/scripts/review/live-evidence.ts +1 -1
  411. package/scripts/review/review-attest-cli.ts +0 -6
  412. package/scripts/review/review-attest.ts +48 -16
  413. package/scripts/review/review-brief-cli.ts +72 -8
  414. package/scripts/review/review-brief.ts +67 -9
  415. package/scripts/review/review-diff-parts.ts +89 -0
  416. package/scripts/review/review-diff-write.ts +97 -0
  417. package/scripts/review/review-finding-ledger.ts +0 -1
  418. package/scripts/review/review-record-cli.ts +1 -1
  419. package/scripts/review/review-record.ts +0 -1
  420. package/scripts/review/review-round2-cli.ts +1 -1
  421. package/scripts/review/review-stamps.ts +6 -2
  422. package/scripts/review/review-tree.ts +14 -2
  423. package/scripts/rules/decision-oracle-stage.ts +18 -0
  424. package/scripts/rules/decision-oracle.ts +10 -7
  425. package/scripts/rules/delivered-rules.ts +9 -1
  426. package/scripts/rules/destructive-command.ts +119 -0
  427. package/scripts/rules/direct-filing.ts +1 -1
  428. package/scripts/rules/file-body.ts +0 -3
  429. package/scripts/rules/filing-cap.ts +0 -2
  430. package/scripts/rules/gh-api.ts +7 -2
  431. package/scripts/rules/git-argv.ts +18 -7
  432. package/scripts/rules/git-force.ts +0 -2
  433. package/scripts/rules/implementation-cut.ts +1 -2
  434. package/scripts/rules/index-guard.ts +71 -0
  435. package/scripts/rules/issue-citation.ts +50 -25
  436. package/scripts/rules/issue-fold.ts +1 -2
  437. package/scripts/rules/lane-background.ts +15 -7
  438. package/scripts/rules/lane-carry-conflict.ts +1 -2
  439. package/scripts/rules/lane-park.ts +14 -8
  440. package/scripts/rules/last-prompt.ts +1 -0
  441. package/scripts/rules/oracle-consulted.ts +1 -1
  442. package/scripts/rules/oracle-firing.ts +1 -0
  443. package/scripts/rules/oracle-list-cli.ts +0 -3
  444. package/scripts/rules/permission-guards.ts +14 -0
  445. package/scripts/rules/pre-gate-cut.ts +2 -2
  446. package/scripts/rules/protected-files.ts +74 -0
  447. package/scripts/rules/reply-language.ts +1 -1
  448. package/scripts/rules/rule-body-guard.ts +0 -3
  449. package/scripts/rules/rule-value-cli.ts +0 -1
  450. package/scripts/rules/shell-body-trigger.ts +0 -1
  451. package/scripts/rules/shell-segments.ts +0 -1
  452. package/scripts/rules/stop-rules.ts +13 -5
  453. package/scripts/rules/tail-commands.ts +1 -1
  454. package/scripts/rules/test-declared-commit.ts +1 -1
  455. package/scripts/rules/third-party-write.ts +0 -1
  456. package/scripts/rules/worktree-guard.ts +26 -9
  457. package/scripts/run/run-carry-cli.ts +0 -2
  458. package/scripts/run/run-carry-stash.ts +2 -2
  459. package/scripts/run/run-carry-streak.ts +1 -1
  460. package/scripts/run/run-cut-cli.ts +0 -7
  461. package/scripts/run/run-cut.ts +8 -54
  462. package/scripts/run/run-ending-cli.ts +1 -1
  463. package/scripts/run/run-ending.ts +1 -4
  464. package/scripts/run/run-entry-cli.ts +101 -24
  465. package/scripts/run/run-entry.ts +0 -1
  466. package/scripts/run/run-event-cli.ts +0 -2
  467. package/scripts/run/run-event-follow.ts +1 -0
  468. package/scripts/run/run-event-render.ts +1 -1
  469. package/scripts/run/run-event-scope.ts +53 -4
  470. package/scripts/run/run-event-stream.ts +0 -3
  471. package/scripts/run/run-event-watch.ts +1 -0
  472. package/scripts/run/run-halfrun-resume.ts +20 -7
  473. package/scripts/run/run-headless.ts +24 -8
  474. package/scripts/run/run-hold-cli.ts +33 -10
  475. package/scripts/run/run-hold.ts +25 -5
  476. package/scripts/run/run-issue-number.ts +1 -1
  477. package/scripts/run/run-liveness-cli.ts +1 -1
  478. package/scripts/run/run-liveness.ts +2 -3
  479. package/scripts/run/run-merge-cli.ts +5 -13
  480. package/scripts/run/run-merge-steps.ts +5 -5
  481. package/scripts/run/run-merge.ts +1 -1
  482. package/scripts/run/run-next-cli.ts +1 -1
  483. package/scripts/run/run-parent-cut-hook.ts +143 -0
  484. package/scripts/run/run-preflight.ts +2 -9
  485. package/scripts/run/run-prep-cli.ts +2 -2
  486. package/scripts/run/run-prep-locate.ts +1 -1
  487. package/scripts/run/run-progress-cli.ts +4 -7
  488. package/scripts/run/run-progress-clock.ts +6 -34
  489. package/scripts/run/run-progress-config.ts +0 -4
  490. package/scripts/run/run-progress-read.ts +3 -3
  491. package/scripts/run/run-progress.ts +22 -10
  492. package/scripts/run/run-prrun-resume.ts +117 -0
  493. package/scripts/run/run-report-cli.ts +1 -2
  494. package/scripts/run/run-report.ts +0 -1
  495. package/scripts/run/run-retrospective.ts +1 -1
  496. package/scripts/run/run-review-cli.ts +0 -3
  497. package/scripts/run/run-review-steps.ts +2 -0
  498. package/scripts/run/run-review.ts +0 -2
  499. package/scripts/run/run-ship-cli.ts +27 -77
  500. package/scripts/run/run-ship-detach.ts +1 -0
  501. package/scripts/run/run-ship-next.ts +106 -0
  502. package/scripts/run/run-ship-preflight.ts +87 -0
  503. package/scripts/run/run-ship-return.ts +8 -3
  504. package/scripts/run/run-ship-review-steps.ts +23 -30
  505. package/scripts/run/run-ship-review.ts +20 -0
  506. package/scripts/run/run-ship-scoped.ts +45 -0
  507. package/scripts/run/run-ship-stage.ts +5 -1
  508. package/scripts/run/run-ship-steps.ts +105 -0
  509. package/scripts/run/run-ship.ts +2 -1
  510. package/scripts/run/run-stage-read.ts +62 -0
  511. package/scripts/run/run-stage.ts +160 -0
  512. package/scripts/run/run-status-cli.ts +1 -1
  513. package/scripts/run/run-step-cli.ts +21 -14
  514. package/scripts/run/run-step.ts +1 -1
  515. package/scripts/run/run-stop-notify.ts +1 -3
  516. package/scripts/run/run-stranded-cli.ts +0 -4
  517. package/scripts/run/run-stranded-detect.ts +2 -2
  518. package/scripts/run/run-tail-cli.ts +17 -11
  519. package/scripts/run/run-tail.ts +2 -0
  520. package/scripts/run/run-tidy-lanes.ts +2 -1
  521. package/scripts/run/run-tidy-stashes.ts +12 -12
  522. package/scripts/run/run-wake-cli.ts +4 -5
  523. package/scripts/run/run-wake-describe.ts +19 -1
  524. package/scripts/run/run-wake-loop.ts +2 -2
  525. package/scripts/run/run-wake.ts +2 -4
  526. package/scripts/run/run-watcher-guard-cli.ts +0 -4
  527. package/scripts/run/run-watcher-guard.ts +9 -7
  528. package/scripts/run/run-watcher-hook.ts +1 -1
  529. package/scripts/safe-chain/ci-installer-pin.ts +11 -5
  530. package/scripts/safe-chain/project-config.ts +1 -1
  531. package/scripts/security/security-audit-provision-logic.ts +0 -1
  532. package/scripts/security/security-audit-provision.ts +3 -2
  533. package/scripts/security/security-audit.ts +0 -1
  534. package/scripts/security/security-updates-logic.ts +0 -1
  535. package/scripts/sonar/sonar-hotspots-cli.ts +10 -52
  536. package/scripts/sonar/sonar-hotspots.ts +0 -1
  537. package/scripts/sonar/sonar-new-code-cli.ts +150 -0
  538. package/scripts/sonar/sonar-new-code.ts +79 -0
  539. package/scripts/sonar/sonar-project.ts +97 -0
  540. package/scripts/split/split-assess-cli.ts +1 -1
  541. package/scripts/split/split-assess.ts +2 -5
  542. package/scripts/sync/managed-config-scope-cli.ts +1 -1
  543. package/scripts/sync/skill-migration.ts +0 -1
  544. package/scripts/sync/sync-hook-safety.ts +2 -3
  545. package/scripts/sync/sync.ts +1 -8
  546. package/scripts/sync/template-source-logic.ts +0 -1
  547. package/scripts/sync/workflow-pin-logic.ts +16 -28
  548. package/scripts/test/test-declared-logic.ts +0 -1
  549. package/scripts/test/test-declared.ts +0 -2
  550. package/scripts/test/test-red-commit.ts +2 -2
  551. package/scripts/test/test-red.ts +14 -7
  552. package/scripts/test/test-type-logic.ts +1 -1
  553. package/scripts/test/unit-worker-share.ts +7 -16
  554. package/scripts/time-runtime/time-batch-guard.ts +1 -2
  555. package/scripts/time-runtime/time-bundle-call.ts +2 -3
  556. package/scripts/time-runtime/time-bundles.ts +0 -4
  557. package/scripts/time-runtime/time-density-hook.ts +0 -2
  558. package/scripts/time-runtime/time-followup-stage.ts +1 -1
  559. package/scripts/time-runtime/time-format.ts +0 -73
  560. package/scripts/time-runtime/time-round-trips.ts +0 -4
  561. package/scripts/time-runtime/time-single-check.ts +1 -1
  562. package/scripts/time-runtime/time-spans.ts +1 -1
  563. package/scripts/time-runtime/time-transcript-line.ts +1 -2
  564. package/scripts/ui/ui-routes-cli.ts +0 -5
  565. package/scripts/ui/ui-routes.ts +0 -5
  566. package/scripts/version/effective-upstream.ts +2 -2
  567. package/scripts/version/latest-corepack.ts +7 -9
  568. package/scripts/version/latest-scope-cli.ts +0 -2
  569. package/scripts/version/latest-update.ts +0 -2
  570. package/scripts/version/npm-registry.ts +97 -0
  571. package/scripts/version/publishable-range-check.ts +1 -1
  572. package/scripts/version/release-hold.ts +0 -4
  573. package/scripts/version/running-binary.ts +2 -2
  574. package/scripts/version/version-check-logic.ts +0 -2
  575. package/scripts/version/version-commands.ts +5 -4
  576. package/scripts/version/version-remote.ts +28 -14
  577. package/scripts/version/version-targets.ts +4 -4
  578. package/templates/sonar-project.properties +28 -1
  579. package/templates/workflows/dependabot-auto-merge.yml +5 -3
  580. package/templates/workflows/github-release.yml +81 -0
  581. package/prompts/collaboration-workflow/cross-repo-epic.md +0 -5
  582. package/prompts/collaboration-workflow/epic-audit.md +0 -5
  583. package/prompts/collaboration-workflow/epic-bundle.md +0 -5
  584. package/scripts/init/plugin-install-hint.ts +0 -47
  585. package/scripts/version/parse-json.ts +0 -13
  586. /package/scripts/{git → followup}/git-followup-stages.ts +0 -0
  587. /package/scripts/{git → gh}/git-gh-api-path.ts +0 -0
  588. /package/scripts/{git → gh}/git-gh-command.ts +0 -0
  589. /package/scripts/{git → gh}/git-gh-issue-write.ts +0 -0
  590. /package/scripts/{git → gh}/git-gh-issue.ts +0 -0
  591. /package/scripts/{git → gh}/git-gh-pr-auto-merge.ts +0 -0
  592. /package/scripts/{git → gh}/git-gh-pr-snapshot.ts +0 -0
  593. /package/scripts/{git → gh}/git-gh-reachability.ts +0 -0
  594. /package/scripts/{git → gh}/git-gh-repo.ts +0 -0
  595. /package/scripts/{git → gh}/git-gh-rest-state.ts +0 -0
  596. /package/scripts/{git → gh}/git-pr-checks-watch.ts +0 -0
  597. /package/scripts/{git → gh}/git-pr-error.ts +0 -0
  598. /package/scripts/{git → gh}/git-pr-messages.ts +0 -0
  599. /package/scripts/{git → gh}/github-issue-url.ts +0 -0
  600. /package/scripts/git/{stash-orphans.ts → stash/stash-orphans.ts} +0 -0
  601. /package/scripts/{git → issue}/issue-reference.ts +0 -0
  602. /package/scripts/{git → lib}/animation-helpers.ts +0 -0
  603. /package/scripts/{git → lib}/git-animation.ts +0 -0
  604. /package/scripts/{git → notify}/git-notify.ts +0 -0
  605. /package/scripts/{git → notify}/telegram-test-logic.ts +0 -0
@@ -170,10 +170,8 @@ const bytes_command = {
170
170
  entry_row,
171
171
  entry_rows,
172
172
  near_ceiling_statuses,
173
- run_bytes,
174
173
  scan_lines,
175
174
  status_row,
176
- NONE_NEAR,
177
175
  NOT_A_FILE,
178
176
  NOT_BUDGETED,
179
177
  }
@@ -161,7 +161,6 @@ const lines_command = {
161
161
  header,
162
162
  near_limit_budgets,
163
163
  not_counted_reason,
164
- render,
165
164
  row,
166
165
  rows_for,
167
166
  run_lines,
@@ -116,7 +116,6 @@ function eslint_arguments(files: ReadonlyArray<string>): ReadonlyArray<string> {
116
116
 
117
117
  const lint_related_scope = {
118
118
  COMMAND_LABEL,
119
- COMMAND_NAME,
120
119
  NOTHING_LINTABLE_REASON,
121
120
  describe_scope,
122
121
  eslint_arguments,
@@ -99,6 +99,6 @@ if (process.argv[1] === fileURLToPath(import.meta.url)) {
99
99
  process.exitCode = await run_related_lint(process.argv.slice(changed_file_scope.ARGV_START))
100
100
  }
101
101
 
102
- const lint_related = { report_ignored_flags, run_related_lint }
102
+ const lint_related = { run_related_lint }
103
103
 
104
104
  export { lint_related }
@@ -1,4 +1,5 @@
1
1
  import { gh_spawn } from '#scripts/gh/gh-spawn'
2
+ import { timed_fetch } from '#scripts/lib/timed-fetch'
2
3
  import { z } from 'zod'
3
4
 
4
5
  const TELEGRAM_API_BASE = 'https://api.telegram.org'
@@ -193,7 +194,7 @@ function build_text(input: TelegramSendInput): string {
193
194
 
194
195
  async function post_message(config: TelegramConfig, text: string): Promise<void> {
195
196
  const url = `${TELEGRAM_API_BASE}/bot${config.bot_token}/sendMessage`
196
- const response = await fetch(url, {
197
+ const response = await timed_fetch(url, {
197
198
  method: 'POST',
198
199
  headers: { 'Content-Type': 'application/json' },
199
200
  body: JSON.stringify({ chat_id: config.chat_id, text }),
@@ -412,7 +413,6 @@ async function stranded(input: StrandedInput): Promise<boolean> {
412
413
  }
413
414
 
414
415
  const telegram_notify = {
415
- REPO_LOOKUP_TIMEOUT_MS,
416
416
  confirm,
417
417
  send,
418
418
  send_or_report,
@@ -1,11 +1,11 @@
1
1
  #!/usr/bin/env tsx
2
2
  import { fileURLToPath } from 'node:url'
3
3
  import { parseArgs } from 'node:util'
4
+ import { git_gh_issue_read } from '#scripts/gh/git-gh-issue-read'
5
+ import { git_gh_repo } from '#scripts/gh/git-gh-repo'
6
+ import { github_issue_url, type IssueUrlTarget } from '#scripts/gh/github-issue-url'
7
+ import { git_error } from '#scripts/git/git-error'
4
8
  import { josh_environment_file } from '#scripts/josh/josh-environment-file'
5
- import { git_error } from './git-error'
6
- import { git_gh_issue_read } from './git-gh-issue-read'
7
- import { git_gh_repo } from './git-gh-repo'
8
- import { github_issue_url, type IssueUrlTarget } from './github-issue-url'
9
9
  import { telegram_notify } from './telegram-notify'
10
10
  import { telegram_test_logic, type CliValues, type ResolvedContext } from './telegram-test-logic'
11
11
 
@@ -115,7 +115,6 @@ async function append(target: string, lines: ReadonlyArray<string>): Promise<voi
115
115
  const observation_ledger_home = {
116
116
  append,
117
117
  issue_path,
118
- ledger_directory,
119
118
  ledger_root,
120
119
  read,
121
120
  writer_path,
@@ -96,7 +96,6 @@ function missing_lines(candidates: ReadonlyArray<string>, ledger: string): Array
96
96
  const observation_ledger_line = {
97
97
  broken_ledger_lines,
98
98
  is_ledger_entry_line,
99
- line_reason,
100
99
  missing_lines,
101
100
  }
102
101
 
@@ -146,6 +146,6 @@ function migrate(root: string): boolean {
146
146
  ).some(Boolean)
147
147
  }
148
148
 
149
- const observation_ledger_migrate = { claim_path, migrate }
149
+ const observation_ledger_migrate = { migrate }
150
150
 
151
151
  export { observation_ledger_migrate }
@@ -1,6 +1,6 @@
1
- import { git_gh_command } from '#scripts/git/git-gh-command'
2
- import type { OpenPull } from '#scripts/git/git-gh-pr-auto-merge'
3
- import { git_pr_checks } from '#scripts/git/git-pr-checks'
1
+ import { git_gh_command } from '#scripts/gh/git-gh-command'
2
+ import type { OpenPull } from '#scripts/gh/git-gh-pr-auto-merge'
3
+ import { git_pr_checks } from '#scripts/gh/git-pr-checks'
4
4
  import { error_text } from '#scripts/lib/error-message'
5
5
 
6
6
  // **A flush pull request lands whether or not the flush that opened it is still alive**
@@ -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,
@@ -207,7 +207,6 @@ function return_to_default_branch(repository_path: string): boolean {
207
207
 
208
208
  const propagate_git = {
209
209
  default_branch,
210
- fetch_branch,
211
210
  return_to_default_branch,
212
211
  current_branch,
213
212
  commit_ahead,
@@ -215,7 +214,6 @@ const propagate_git = {
215
214
  has_pre_push_hook,
216
215
  can_push_without_hooks,
217
216
  is_clean,
218
- is_up_to_date,
219
217
  decide_tree_state,
220
218
  tree_state,
221
219
  }
@@ -0,0 +1,185 @@
1
+ import { adopt_toolkits } from '#scripts/adopt/adopt-toolkits'
2
+ import { propagate_run, type RunStep, type StepResult } from './propagate-run'
3
+ import { propagate_steps, type Release, type ReleasePlan } from './propagate-steps'
4
+ import { propagate_targets, type Manifest, type PropagateTarget } from './propagate-targets'
5
+
6
+ // What one `josh propagate` run carries, decided from the repository it runs in (joshuafolkken/kit#2879).
7
+ //
8
+ // The supplier is kit or any toolkit built on it — app-kit, game-kit — and a toolkit's propagation
9
+ // carries the base packages under it too, at the versions that toolkit itself has installed and was
10
+ // verified with rather than at the base's newest. Each consumer is delivered by the topmost toolkit
11
+ // it installs: a lower supplier skips it, because syncing only the base would write the overlay's
12
+ // paths back to the base's originals (`docs/sync.md` → base first, overlay after), and would hand the
13
+ // consumer a base the toolkit above it never verified. Discovery, ordering and the CLI name are
14
+ // `josh adopt`'s own reads (`scripts/adopt/adopt-toolkits.ts`), not a second copy of them.
15
+
16
+ const REFUSAL_PREFIX = 'Refusing to propagate:'
17
+ const SUPPLIER_REFUSAL = [
18
+ `${REFUSAL_PREFIX} this is not a ${adopt_toolkits.TOOLKIT_SCOPE} toolkit's own repository.`,
19
+ 'Propagation carries a published release outward, so it runs from the toolkit that published it',
20
+ '— kit, or a toolkit built on it that ships a CLI. Run it from that checkout instead.',
21
+ ].join('\n')
22
+ const UNRESOLVED_CAUSE =
23
+ 'declared here but not installed with a runnable CLI, so the consumers would receive this toolkit without it. Run `pnpm install`.'
24
+ const MISPLACED_CAUSE =
25
+ 'declared under `dependencies`, which leaves it out of the plan. Move it to `devDependencies`.'
26
+ const ARROW = ' → '
27
+ const LIST_SEPARATOR = ', '
28
+
29
+ interface Supplier {
30
+ package_name: string
31
+ bin_name: string
32
+ }
33
+
34
+ interface SupplierResolution {
35
+ supplier?: Supplier
36
+ refusal?: string
37
+ }
38
+
39
+ interface BaseResolution {
40
+ bases?: Array<Release>
41
+ cause?: string
42
+ }
43
+
44
+ interface PlanResolution {
45
+ plan?: ReleasePlan
46
+ refusal?: string
47
+ }
48
+
49
+ // A toolkit is a scoped package that ships a CLI — the same reading `josh adopt` applies to an
50
+ // installed one, applied here to the repository's own manifest.
51
+ function toolkit_name(manifest: Manifest): string | undefined {
52
+ const { name } = manifest
53
+
54
+ return name !== undefined && adopt_toolkits.is_toolkit_package(name) ? name : undefined
55
+ }
56
+
57
+ function supplier_of(manifest: Manifest | undefined): Supplier | undefined {
58
+ const package_name = manifest === undefined ? undefined : toolkit_name(manifest)
59
+ if (manifest === undefined || package_name === undefined) return undefined
60
+ const bin_name = adopt_toolkits.bin_name_of(package_name, manifest)
61
+
62
+ return bin_name === undefined ? undefined : { package_name, bin_name }
63
+ }
64
+
65
+ function resolve_supplier(project_root: string): SupplierResolution {
66
+ const supplier = supplier_of(propagate_targets.read_manifest(project_root))
67
+
68
+ return supplier === undefined ? { refusal: SUPPLIER_REFUSAL } : { supplier }
69
+ }
70
+
71
+ // A base toolkit pinned to the version installed in the supplier's own checkout — the one the
72
+ // supplier's verification gate ran against.
73
+ function pin_installed(project_root: string, release: Release): Release | undefined {
74
+ const version = propagate_targets.installed_version(project_root, release.package_name)
75
+
76
+ return version === undefined ? undefined : { ...release, version }
77
+ }
78
+
79
+ // Why a declared base toolkit would fall out of the plan, naming it — either way `josh adopt` refuses
80
+ // one for (joshuafolkken/kit#1540). A base left out is not merely left behind: every consumer that
81
+ // installs it would then read it as a toolkit above this one and be skipped.
82
+ function incomplete_cause(project_root: string): string | undefined {
83
+ const misplaced = adopt_toolkits.misplaced_toolkits(project_root)
84
+ if (misplaced.length > 0) return `${misplaced.join(LIST_SEPARATOR)} — ${MISPLACED_CAUSE}`
85
+ const unresolved = adopt_toolkits.unresolved_toolkits(project_root)
86
+
87
+ return unresolved.length === 0
88
+ ? undefined
89
+ : `${unresolved.join(LIST_SEPARATOR)} — ${UNRESOLVED_CAUSE}`
90
+ }
91
+
92
+ // The supplier's base toolkits, base first, or the names that cannot be carried.
93
+ function base_releases(project_root: string, supplier: Supplier): BaseResolution {
94
+ const cause = incomplete_cause(project_root)
95
+ if (cause !== undefined) return { cause }
96
+
97
+ const bases = adopt_toolkits
98
+ .discover_toolkits(project_root)
99
+ .filter((release) => release.package_name !== supplier.package_name)
100
+ .map((release) => pin_installed(project_root, release))
101
+
102
+ return bases.every((release) => release !== undefined) ? { bases } : { cause: UNRESOLVED_CAUSE }
103
+ }
104
+
105
+ // The releases one run carries: the base toolkits first, then the supplier at its own version, so the
106
+ // sync runs base first and the supplier's overlay is written last.
107
+ function build_plan(project_root: string, version: string): PlanResolution {
108
+ const { supplier, refusal } = resolve_supplier(project_root)
109
+ if (supplier === undefined) return { refusal: refusal ?? SUPPLIER_REFUSAL }
110
+ const { bases, cause } = base_releases(project_root, supplier)
111
+ if (bases === undefined) return { refusal: `${REFUSAL_PREFIX} ${cause ?? UNRESOLVED_CAUSE}` }
112
+ const releases = [...bases, { ...supplier, version }]
113
+
114
+ return { plan: { releases, origin: propagate_steps.PROPAGATE_ORIGIN } }
115
+ }
116
+
117
+ // The package the run publishes and waits for — by construction the plan's last release.
118
+ function supplier_name(plan: ReleasePlan): string {
119
+ return plan.releases.at(-1)?.package_name ?? ''
120
+ }
121
+
122
+ // A declared scoped package counts as a toolkit unless it is demonstrably a library: installed, and
123
+ // shipping no CLI. One that is not installed yet cannot be told apart, and treating it as a toolkit
124
+ // errs toward leaving the consumer to the propagation above rather than reverting its overlay.
125
+ function may_be_toolkit(repository_path: string, package_name: string): boolean {
126
+ if (adopt_toolkits.read_bin_name(repository_path, package_name) !== undefined) return true
127
+
128
+ return adopt_toolkits.is_unreachable_toolkit(repository_path, package_name)
129
+ }
130
+
131
+ function carriers_of(target: PropagateTarget, plan: ReleasePlan): Array<string> {
132
+ const carried = new Set(plan.releases.map((release) => release.package_name))
133
+
134
+ return adopt_toolkits
135
+ .all_declared_toolkits(target.path)
136
+ .filter((name) => !carried.has(name) && may_be_toolkit(target.path, name))
137
+ }
138
+
139
+ // A consumer that installs a toolkit this run does not carry is left to that toolkit's propagation.
140
+ // Only a candidate that would otherwise be processed or reported current is re-classified.
141
+ function mark_carried(target: PropagateTarget, plan: ReleasePlan): PropagateTarget {
142
+ if (target.state !== 'ready' && target.state !== 'up_to_date') return target
143
+ const carriers = carriers_of(target, plan)
144
+
145
+ return carriers.length === 0 ? target : { ...target, state: 'carried_above', carriers }
146
+ }
147
+
148
+ // What the dry run prints for the two steps that repeat per release: the versions each package is
149
+ // pinned to, and the sync order.
150
+ function plan_details(plan: ReleasePlan): Readonly<Record<string, string>> {
151
+ return {
152
+ [propagate_run.STEP_UPGRADE]: plan.releases
153
+ .map((release) => `${release.package_name}@${release.version}`)
154
+ .join(LIST_SEPARATOR),
155
+ [propagate_run.STEP_SYNC]: propagate_steps
156
+ .sync_commands(plan)
157
+ .map(({ command }) => command.join(' '))
158
+ .join(ARROW),
159
+ }
160
+ }
161
+
162
+ // The dry-run runner: it reports what each step would do and touches nothing.
163
+ function create_step_describer(plan: ReleasePlan): RunStep {
164
+ const details = plan_details(plan)
165
+
166
+ return (target: PropagateTarget, step: string): StepResult => {
167
+ const detail = details[step]
168
+ const suffix = detail === undefined ? '' : `: ${detail}`
169
+
170
+ console.info(` ${target.repo}: would run ${step}${suffix}`)
171
+
172
+ return { step, is_ok: true }
173
+ }
174
+ }
175
+
176
+ const propagate_plan = {
177
+ resolve_supplier,
178
+ build_plan,
179
+ supplier_name,
180
+ mark_carried,
181
+ create_step_describer,
182
+ }
183
+
184
+ export type { Supplier }
185
+ export { propagate_plan }
@@ -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,
@@ -65,13 +65,17 @@ const SKIP_REASONS: Readonly<Record<string, string>> = {
65
65
  missing_checkout: 'no local checkout at the mapped path — reported, not cloned',
66
66
  unreadable: 'package.json could not be read',
67
67
  not_selected: 'not the repository --target named',
68
+ carried_above: 'delivered by the propagation of a toolkit above this one',
68
69
  }
69
70
 
70
71
  // The reason text for a candidate that is not going to be processed. A missing local checkout is
71
72
  // reported rather than cloned: propagation writes to a working tree, and creating one nobody asked
72
73
  // for is not a step this command may take on its own.
73
74
  function skip_reason(target: PropagateTarget): string {
74
- return SKIP_REASONS[target.state] ?? 'not eligible'
75
+ const reason = SKIP_REASONS[target.state] ?? 'not eligible'
76
+ if (target.carriers === undefined) return reason
77
+
78
+ return `${reason}: ${target.carriers.join(', ')}`
75
79
  }
76
80
 
77
81
  const LEFTOVER_NOTE = 'upgrade/sync changes left uncommitted'
@@ -185,8 +189,6 @@ function format_report(results: ReadonlyArray<TargetResult>): string {
185
189
  const propagate_run = {
186
190
  PROPAGATED_REASON,
187
191
  LEFTOVER_NOTE,
188
- has_leftover_changes,
189
- leftover_of,
190
192
  STEP_RETURN,
191
193
  STEP_PRECHECK,
192
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'
@@ -88,13 +88,28 @@ function release_names(releases: ReadonlyArray<Release>): string {
88
88
  return `${names.slice(0, -1).join(NAME_SEPARATOR)}${LAST_SEPARATOR}${last}`
89
89
  }
90
90
 
91
+ // Each release with its own version, for a plan whose releases disagree on one — a toolkit's
92
+ // propagation carries the base packages at the versions that toolkit was verified with
93
+ // (joshuafolkken/kit#2879), so one shared "to <version>" would name a version most of them are not.
94
+ function versioned_names(releases: ReadonlyArray<Release>): string {
95
+ const named = releases.map((release) => ({
96
+ ...release,
97
+ package_name: `${release.package_name} to ${release.version}`,
98
+ }))
99
+
100
+ return `Upgrade ${release_names(named)}`
101
+ }
102
+
91
103
  // One release reproduces `issue_title` exactly, which is what keeps a `propagate` run's issue title
92
104
  // unchanged by the generalization.
93
105
  function plan_title(releases: ReadonlyArray<Release>): string {
94
106
  const [first] = releases
95
107
  if (first === undefined) return EMPTY_PLAN_TITLE
108
+ const is_one_version = releases.every((release) => release.version === first.version)
96
109
 
97
- return issue_title(release_names(releases), first.version)
110
+ return is_one_version
111
+ ? issue_title(release_names(releases), first.version)
112
+ : versioned_names(releases)
98
113
  }
99
114
 
100
115
  function plan_body(plan: ReleasePlan): string {
@@ -413,14 +428,12 @@ function describe_step(target: PropagateTarget, step: string): StepResult {
413
428
  }
414
429
 
415
430
  const propagate_steps = {
416
- STEP_COMMANDS,
417
431
  JOSH_BIN,
418
432
  PROPAGATE_ORIGIN,
419
433
  sync_command,
420
434
  upgrade_command,
421
435
  upgrade_commands,
422
436
  sync_commands,
423
- return_step,
424
437
  VERIFY_SCRIPT,
425
438
  issue_title,
426
439
  issue_body,
@@ -20,9 +20,17 @@ const MANIFEST_NAME = 'package.json'
20
20
  const NODE_MODULES = 'node_modules'
21
21
 
22
22
  // Why a candidate is not going to be processed, or that it is. `not_selected` is the one state set
23
- // after classification: a candidate `--target` left out (joshuafolkken/kit#2755).
23
+ // after classification: a candidate `--target` left out (joshuafolkken/kit#2755). `carried_above` is
24
+ // the other: a consumer that installs a toolkit above the supplier, which that toolkit's own
25
+ // propagation delivers instead (joshuafolkken/kit#2879).
24
26
  type TargetState =
25
- 'ready' | 'up_to_date' | 'not_downstream' | 'missing_checkout' | 'unreadable' | 'not_selected'
27
+ | 'ready'
28
+ | 'up_to_date'
29
+ | 'not_downstream'
30
+ | 'missing_checkout'
31
+ | 'unreadable'
32
+ | 'not_selected'
33
+ | 'carried_above'
26
34
 
27
35
  interface PropagateTarget {
28
36
  repo: string
@@ -31,6 +39,9 @@ interface PropagateTarget {
31
39
  // The range the consumer currently declares, when it declares one at all. Reported so a skip can
32
40
  // say what it skipped rather than only that it did.
33
41
  declared_range?: string
42
+ // The toolkits above the supplier this consumer installs, when it is `carried_above` — named in
43
+ // the skip so the report says which propagation will deliver it.
44
+ carriers?: ReadonlyArray<string>
34
45
  }
35
46
 
36
47
  // Only the fields propagation reads. `passthrough` is deliberate — a consumer manifest carries far
@@ -148,11 +159,7 @@ function resolve_targets(
148
159
  }
149
160
 
150
161
  const propagate_targets = {
151
- has_checkout,
152
162
  read_manifest,
153
- classify_manifest_absence,
154
- classify_before_dependency,
155
- declared_range,
156
163
  installed_version,
157
164
  classify_target,
158
165
  resolve_targets,