@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
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env tsx
2
2
  import { fileURLToPath } from 'node:url'
3
- import { git_gh_command } from '#scripts/git/git-gh-command'
3
+ import { git_gh_command } from '#scripts/gh/git-gh-command'
4
4
  import { cutoff_of, type ScanCutoff } from '#scripts/git/listing-cutoff'
5
5
  import { parse_json_array_or_undefined } from '#scripts/git/parse-json-array'
6
6
  import { bounded_pool } from '#scripts/lib/bounded-pool'
@@ -139,7 +139,6 @@ function format_evidence(
139
139
 
140
140
  const epic_bundle_evidence = {
141
141
  EVIDENCE_HEADING,
142
- ordering_evidence,
143
142
  format_evidence,
144
143
  }
145
144
 
@@ -1,4 +1,4 @@
1
- import { git_gh_command } from '#scripts/git/git-gh-command'
1
+ import { git_gh_command } from '#scripts/gh/git-gh-command'
2
2
  import { bounded_pool } from '#scripts/lib/bounded-pool'
3
3
  import { epic_audit_logic } from './epic-audit'
4
4
  import type { BacklogIssue } from './epic-bundle'
@@ -181,11 +181,7 @@ async function referenced_candidates(
181
181
 
182
182
  const epic_bundle_referenced = {
183
183
  REFERENCED_LOOKUP_LIMIT,
184
- LOOKUP_CONCURRENCY,
185
184
  referenced_lookups,
186
- is_failed_read,
187
- to_backlog_issue,
188
- is_usable_candidate,
189
185
  collect_referenced,
190
186
  fetch_referenced,
191
187
  referenced_candidates,
@@ -294,12 +294,8 @@ const epic_bundle = {
294
294
  names_in_body,
295
295
  NO_SIGNAL_REASON,
296
296
  already_tracked_reason,
297
- SPREAD_REASON,
298
- has_mutual_reference,
299
297
  has_recorded_dependency,
300
298
  is_strong_signal,
301
- find_candidates,
302
- candidate_epics,
303
299
  decide_bundle,
304
300
  bundle_dependency_links,
305
301
  bundle_children,
@@ -1,12 +1,12 @@
1
- import { git_gh_command } from '#scripts/git/git-gh-command'
1
+ import { git_gh_command } from '#scripts/gh/git-gh-command'
2
+ import { read_json_listing } from '#scripts/git/parse-json-array'
3
+ import { open_issue_schema, type OpenIssueData } from '#scripts/git/schemas'
2
4
  import {
3
5
  ALREADY_DONE_LABEL,
4
6
  has_any_label,
5
7
  IN_PROGRESS_LABEL,
6
8
  NEEDS_DECISION_LABEL,
7
- } from '#scripts/git/issue-labels'
8
- import { read_json_listing } from '#scripts/git/parse-json-array'
9
- import { open_issue_schema, type OpenIssueData } from '#scripts/git/schemas'
9
+ } from '#scripts/issue/issue-labels'
10
10
 
11
11
  // How much of a repository's parallelism is already spoken for — asked of the *repository*, never of
12
12
  // the epic (joshuafolkken/kit#925), and counted rather than treated as a yes/no since
@@ -194,7 +194,6 @@ const epic_busy = {
194
194
  unreadable_message,
195
195
  truncated_message,
196
196
  busy_reason,
197
- format_holders,
198
197
  is_parked,
199
198
  parse_listing,
200
199
  read_repository,
@@ -268,11 +268,6 @@ async function answer_for_repo(
268
268
 
269
269
  const epic_candidate_confirm = {
270
270
  is_same_blockers,
271
- untracked_blockers,
272
- with_blockers,
273
- is_still_runnable,
274
- confirm_candidates,
275
- withheld_verdict,
276
271
  answer_for_repo,
277
272
  }
278
273
 
@@ -3,7 +3,7 @@ import {
3
3
  has_label_name,
4
4
  IN_PROGRESS_LABEL,
5
5
  NEEDS_DECISION_LABEL,
6
- } from '#scripts/git/issue-labels'
6
+ } from '#scripts/issue/issue-labels'
7
7
  import { epic_graph, type EpicChild, type IssueReference } from './epic-graph'
8
8
  import { epic_nested } from './epic-nested'
9
9
  import {
@@ -44,7 +44,7 @@ function resolve_by_state(blocker: EpicChild): DependencyVerdict {
44
44
  // Case-insensitive, through the shared comparison rather than `Array.includes`. GitHub keeps the
45
45
  // casing a label was created with and treats `Epic` and `epic` as one label, so a repository that
46
46
  // predates these scripts can answer with either spelling — and a child read by eye against the
47
- // lowercase string is one this classification never sees (`scripts/git/issue-labels.ts`).
47
+ // lowercase string is one this classification never sees (`scripts/issue/issue-labels.ts`).
48
48
  function has_label(child: EpicChild, label: string): boolean {
49
49
  return has_label_name(child.labels, label)
50
50
  }
@@ -66,7 +66,6 @@ function has_unknown_flag(argv: ReadonlyArray<string>, known: ReadonlySet<string
66
66
  }
67
67
 
68
68
  const epic_cli_argv = {
69
- is_flag,
70
69
  read_flag_value,
71
70
  to_positional_arguments,
72
71
  count_flag,
@@ -1,4 +1,4 @@
1
- import { git_gh_command } from '#scripts/git/git-gh-command'
1
+ import { git_gh_command } from '#scripts/gh/git-gh-command'
2
2
  import { read_json_listing } from '#scripts/git/parse-json-array'
3
3
  import { rest_comment_schema, type RestCommentData } from '#scripts/git/schemas'
4
4
  import { epic_parse, type ExternalChild } from './epic-parse'
@@ -1,11 +1,11 @@
1
- import { git_gh_command } from '#scripts/git/git-gh-command'
2
- import { EPIC_LABEL } from '#scripts/git/issue-labels'
1
+ import { git_gh_command } from '#scripts/gh/git-gh-command'
3
2
  import { cutoff_cause, cutoff_of, type ScanCutoff } from '#scripts/git/listing-cutoff'
4
3
  import {
5
4
  parse_json_array_or_undefined,
6
5
  parse_json_object_safe,
7
6
  } from '#scripts/git/parse-json-array'
8
7
  import { epic_child_schema, epic_issue_schema, type EpicChildData } from '#scripts/git/schemas'
8
+ import { EPIC_LABEL } from '#scripts/issue/issue-labels'
9
9
  import { error_text } from '#scripts/lib/error-message'
10
10
  import { epic_close_comment } from './epic-close-comment'
11
11
  import { epic_parse, type ExternalChild } from './epic-parse'
@@ -296,6 +296,7 @@ async function close_parents_of(
296
296
  const closed: Array<number> = []
297
297
 
298
298
  for (const epic of parents_of(open_epics, child_number)) {
299
+ // eslint-disable-next-line no-await-in-loop -- each close updates the evaluated set the next one reads
299
300
  const number = await close_if_unseen(epic, child_number, evaluated)
300
301
  if (number !== undefined) closed.push(number)
301
302
  }
@@ -311,6 +312,7 @@ async function close_next_level(
311
312
  const next: Array<number> = []
312
313
 
313
314
  for (const child_number of frontier) {
315
+ // eslint-disable-next-line no-await-in-loop -- each close updates the evaluated set the next one reads
314
316
  next.push(...(await close_parents_of(open_epics, child_number, evaluated)))
315
317
  }
316
318
 
@@ -328,6 +330,7 @@ async function cascade_close(
328
330
 
329
331
  for (let depth = 0; depth < MAX_CASCADE_DEPTH; depth++) {
330
332
  if (frontier.length === 0) return
333
+ // eslint-disable-next-line no-await-in-loop -- the cascade closes one level before reading the next
331
334
  frontier = await close_next_level(open_epics, frontier, evaluated)
332
335
  }
333
336
 
@@ -1,7 +1,7 @@
1
1
  import { repo_map_logic } from '#scripts/discovery/repo-map-logic'
2
2
  import { repo_origin } from '#scripts/discovery/repo-origin'
3
- import { git_gh_api_path } from '#scripts/git/git-gh-api-path'
4
- import { git_gh_exec } from '#scripts/git/git-gh-exec'
3
+ import { git_gh_api_path } from '#scripts/gh/git-gh-api-path'
4
+ import { git_gh_exec } from '#scripts/gh/git-gh-exec'
5
5
  import { propagate_publish } from '#scripts/propagate/propagate-publish'
6
6
  import { derive_versions_endpoint } from '#scripts/version/version-command-config'
7
7
  import { load } from 'js-yaml'
@@ -336,11 +336,9 @@ function is_same_owner_repo(repo: string, current_owner: string): boolean {
336
336
 
337
337
  const epic_cross_repo = {
338
338
  publishes_nothing,
339
- read_manifest,
340
339
  read_default_branch_version,
341
340
  reset_publish_cache,
342
341
  package_name_for,
343
- is_published,
344
342
  resolve_cross_repo,
345
343
  owner_of,
346
344
  is_same_owner_repo,
@@ -158,7 +158,6 @@ function read_recorded_reasons(body: string | undefined): string {
158
158
  }
159
159
 
160
160
  const epic_decision = {
161
- DECISIONS_HEADING,
162
161
  append_decision,
163
162
  append_replacements,
164
163
  read_recorded_reasons,
@@ -1,5 +1,5 @@
1
- import { git_gh_command } from '#scripts/git/git-gh-command'
2
- import type { IssueReadFailure } from '#scripts/git/git-gh-issue-read'
1
+ import { git_gh_command } from '#scripts/gh/git-gh-command'
2
+ import type { IssueReadFailure } from '#scripts/gh/git-gh-issue-read'
3
3
  import { epic_cross_repo } from './epic-cross-repo'
4
4
  import type { EpicChild, IssueReference } from './epic-graph'
5
5
  import { epic_issue, type EpicIssue } from './epic-issue'
@@ -1,8 +1,8 @@
1
- import { git_gh_command } from '#scripts/git/git-gh-command'
2
- import { EPIC_LABEL, has_any_label } from '#scripts/git/issue-labels'
1
+ import { git_gh_command } from '#scripts/gh/git-gh-command'
3
2
  import { cutoff_of, type ScanCutoff } from '#scripts/git/listing-cutoff'
4
3
  import { parse_json_array_or_undefined } from '#scripts/git/parse-json-array'
5
4
  import type { OpenIssueData } from '#scripts/git/schemas'
5
+ import { EPIC_LABEL, has_any_label } from '#scripts/issue/issue-labels'
6
6
  import { z } from 'zod'
7
7
  import { epic_parse } from './epic-parse'
8
8
 
@@ -200,7 +200,6 @@ const epic_index = {
200
200
  build_epic_index,
201
201
  build_tracking_index,
202
202
  fetch_epics,
203
- opted_in_epic_numbers,
204
203
  reachable_epic_numbers,
205
204
  withheld_children,
206
205
  }
@@ -1,4 +1,4 @@
1
- import { git_gh_issue_rest } from '#scripts/git/git-gh-issue-rest'
1
+ import { git_gh_issue_rest } from '#scripts/gh/git-gh-issue-rest'
2
2
  import { parse_json_object_safe } from '#scripts/git/parse-json-array'
3
3
  import { blocked_by_schema } from '#scripts/git/schemas'
4
4
  import { z } from 'zod'
@@ -77,18 +77,6 @@ function blocker_references_of(
77
77
  )
78
78
  }
79
79
 
80
- // The same blockers as bare numbers, for the callers that predate the qualified read: the planner and
81
- // the bundler. A projection of the read above rather than a second unwrapping of the connection.
82
- //
83
- // **The number alone is lossy, and those callers inherit that.** A blocker in another repository
84
- // collapses to its number here and can then match a local issue that happens to share it —
85
- // joshuafolkken/kit#1130 carries the case, which is `epic:bundle` reading a false relation and
86
- // recording one onto the wrong issue. It predates joshuafolkken/kit#1126 rather than being introduced
87
- // by it, and threading the repository through the bundler is its own change with its own reach.
88
- function blockers_of(issue: EpicIssue): Array<number> {
89
- return blocker_references_of(issue).map((blocker) => blocker.number)
90
- }
91
-
92
80
  function label_names(issue: EpicIssue): Array<string> {
93
81
  return issue.labels.map((label) => label.name)
94
82
  }
@@ -157,9 +145,7 @@ function parse_epic_reference(raw = ''): EpicReference | undefined {
157
145
  const epic_issue = {
158
146
  CLOSED,
159
147
  blocker_references_of,
160
- UNKNOWN_STATE,
161
148
  parse_epic_issue,
162
- blockers_of,
163
149
  label_names,
164
150
  normalize_state,
165
151
  is_open,
@@ -6,8 +6,10 @@ import {
6
6
  type RepoAnswer,
7
7
  } from './epic-candidate-confirm'
8
8
  import { epic_graph, type EpicChild } from './epic-graph'
9
+ import { epic_rank } from './epic-rank'
9
10
  import type { EpicVerdict } from './epic-report'
10
11
  import { epic_solo } from './epic-solo'
12
+ import { epic_solo_stale } from './epic-solo-stale'
11
13
  import { epic_triage, type TriageVerdict } from './epic-triage'
12
14
 
13
15
  // Which children a repository has room to start right now (joshuafolkken/kit#1491).
@@ -107,6 +109,15 @@ function candidates_in(pool: RepoPool, repo: string): RepoPool {
107
109
  return { ...pool, candidates: pool.candidates.filter((child) => child.repo === repo) }
108
110
  }
109
111
 
112
+ // A pool's candidates for the repository in `epic_rank.rank` order — the ranking `backlog:next` offers
113
+ // in (joshuafolkken/kit#2928), counted against the pool's own graph. **Within a pool, not across
114
+ // pools**: the pool order is the order a person named the epics in, and that stays the outer key.
115
+ function ranked_in(pool: RepoPool, repo: string): RepoPool {
116
+ const scoped = candidates_in(pool, repo)
117
+
118
+ return { ...scoped, candidates: epic_rank.rank(scoped.candidates, pool.context.children) }
119
+ }
120
+
110
121
  // One pool's candidates, minus every one an earlier pool already carries. `seen` is mutated rather
111
122
  // than rebuilt because the earlier pools' claim is what the later one is filtered against.
112
123
  function unseen_candidates(pool: RepoPool, seen: Set<string>): RepoPool {
@@ -158,6 +169,7 @@ async function collect(
158
169
  for (const pool of pools) {
159
170
  if (children.length >= wanted) break
160
171
 
172
+ // eslint-disable-next-line no-await-in-loop -- pools are asked in order until enough children are found
161
173
  const answer = await ask_pool(pool, wanted - children.length)
162
174
 
163
175
  children.push(...answer.children)
@@ -184,24 +196,6 @@ function solo_offer(
184
196
  return { ...answer, children: offered, notice: offered_notice(offered, read, request) }
185
197
  }
186
198
 
187
- // The confirmation walk stops at the free-lane count, so a `run:solo` candidate ranked past it — or
188
- // in a pool past it — would never reach `solo_offer` to be preferred. Into an idle repository the
189
- // first pool holding one is asked first, with it at its head through the same `epic_solo.prefer` the
190
- // offer applies (joshuafolkken/kit#2778). The candidate stays in its own pool, because a pool carries
191
- // the graph it is confirmed against.
192
- function solo_first(pools: ReadonlyArray<RepoPool>, read: BusyRead): ReadonlyArray<RepoPool> {
193
- if (read.kind !== 'idle') return pools
194
-
195
- const index = pools.findIndex((pool) => pool.candidates.some((child) => epic_solo.is_solo(child)))
196
- const pool = pools[index]
197
-
198
- if (pool === undefined) return pools
199
-
200
- const lifted = { ...pool, candidates: epic_solo.prefer(pool.candidates, read) }
201
-
202
- return [lifted, ...pools.filter((other) => other !== pool)]
203
- }
204
-
205
199
  // The repository is asked how full it is **before** any candidate is confirmed, for the reason
206
200
  // joshuafolkken/kit#1121 records: a repository with no free lane is handed nothing, so the relations
207
201
  // request that would confirm a candidate there buys an answer nobody reads — and a polling `epicrun`
@@ -236,7 +230,13 @@ async function offer_for_repo(
236
230
 
237
231
  if (triage !== undefined) return triage
238
232
 
239
- const read = await epic_busy.read_repository(request.repo)
233
+ const { read, notice } = await epic_solo_stale.release(
234
+ await epic_busy.read_repository(request.repo),
235
+ request.repo,
236
+ )
237
+
238
+ if (notice !== undefined) console.error(notice)
239
+
240
240
  const free = free_lanes(read, request.limit)
241
241
 
242
242
  if (free === NO_LANES) {
@@ -247,24 +247,14 @@ async function offer_for_repo(
247
247
  }
248
248
  }
249
249
 
250
- const for_repo = solo_first(
251
- dedupe_pools(pools.map((pool) => candidates_in(pool, request.repo))),
252
- read,
253
- )
250
+ const for_repo = dedupe_pools(pools.map((pool) => ranked_in(pool, request.repo)))
254
251
 
255
252
  return solo_offer(await collect(for_repo, wanted_of(request, free)), read, request)
256
253
  }
257
254
 
258
255
  const epic_lane_offer = {
259
- is_held,
260
- free_lanes,
261
- wanted_of,
262
256
  combine_verdicts,
263
- candidates_in,
264
- unseen_candidates,
265
257
  dedupe_pools,
266
- withheld_message,
267
- collect,
268
258
  offer_for_repo,
269
259
  }
270
260
 
@@ -1,4 +1,4 @@
1
- import { EPIC_LABEL, has_label_name } from '#scripts/git/issue-labels'
1
+ import { EPIC_LABEL, has_label_name } from '#scripts/issue/issue-labels'
2
2
  import type { EpicChild } from './epic-graph'
3
3
 
4
4
  // Whether a task-list row points at another epic (joshuafolkken/kit#1476).
@@ -118,6 +118,7 @@ async function read_snapshots(
118
118
  const notices: Array<string> = []
119
119
 
120
120
  for (const reference of unique_references(references, current_repo)) {
121
+ // eslint-disable-next-line no-await-in-loop -- the first refusal ends the read, so later reads are not spent
121
122
  const outcome = await read_one(reference, current_repo)
122
123
 
123
124
  if (outcome.refusal !== undefined) return { reads, notices, refusal: outcome.refusal }
@@ -129,11 +130,8 @@ async function read_snapshots(
129
130
 
130
131
  const epic_next_read = {
131
132
  FOREIGN_EPIC,
132
- epic_repo_of,
133
133
  childless,
134
134
  unique_references,
135
- is_childless,
136
- read_one,
137
135
  read_snapshots,
138
136
  }
139
137
 
@@ -132,7 +132,6 @@ function settle_views(
132
132
  const epic_next_views = {
133
133
  settle_views,
134
134
  format_reference,
135
- confirm_context,
136
135
  pools_of,
137
136
  combined_verdict,
138
137
  error_view,
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env tsx
2
2
  import { fileURLToPath } from 'node:url'
3
3
  import { repo_discovery } from '#scripts/discovery/repo-discovery'
4
- import { git_gh_command } from '#scripts/git/git-gh-command'
4
+ import { git_gh_command } from '#scripts/gh/git-gh-command'
5
5
  import { PROJECT_ROOT } from '#scripts/init/init-paths'
6
6
  import { josh_environment_file } from '#scripts/josh/josh-environment-file'
7
7
  import { lane_capacity } from '#scripts/lane/lane-capacity'
@@ -441,27 +441,18 @@ async function main(argv: ReadonlyArray<string>): Promise<void> {
441
441
  }
442
442
 
443
443
  const epic_next = {
444
- USAGE,
445
444
  EXTERNAL_NOTICE,
446
445
  FOREIGN_EPIC,
447
- body_anomaly,
448
- unreadable_anomaly,
449
446
  is_order_declared,
450
447
  repo_verdict,
451
- offer_children,
452
- report_offer,
453
448
  UNCHECKED_EXCLUSION,
454
449
  split_at_flag,
455
- parse_references,
456
450
  parse_options,
457
- note_external,
458
451
  refuse_reads,
459
452
  views_of,
460
453
  run_epics,
461
454
  decide,
462
455
  report,
463
- run,
464
- main,
465
456
  }
466
457
 
467
458
  // `.env` is read here rather than through the dispatcher's `tsx_arguments`: declaring any would
@@ -310,7 +310,6 @@ const epic_parse = {
310
310
  fence_mask,
311
311
  is_task_list_line,
312
312
  is_declaration_line,
313
- chain_links,
314
313
  parse_dependency_chains,
315
314
  parse_task_list_issue_numbers,
316
315
  has_external_task_list_entry,
@@ -1,14 +1,6 @@
1
1
  import { epic_body } from './epic-body'
2
2
  import { epic_parse } from './epic-parse'
3
3
 
4
- // Promoting an existing issue into an epic.
5
- //
6
- // The discussion that concluded "this is really several issues" is almost always *inside* an
7
- // existing issue, and that discussion is usually the split rationale itself. Creating a separate
8
- // epic leaves two issues tracking one topic, so the promotion appends the epic's sections to the
9
- // body rather than replacing it (joshuafolkken/kit#865).
10
-
11
- const EPIC_SECTION_MARKER = '## Progress'
12
4
  const PROMOTED_HEADING = '## Split into children'
13
5
 
14
6
  interface PromoteInput {
@@ -90,7 +82,6 @@ function find_tracking_error(body: string, children: ReadonlyArray<number>): str
90
82
  }
91
83
 
92
84
  const epic_promote = {
93
- EPIC_SECTION_MARKER,
94
85
  PROMOTED_HEADING,
95
86
  has_conflicting_tracking,
96
87
  conflict_reason,
@@ -0,0 +1,37 @@
1
+ import { issue_rank } from '#scripts/issue/issue-rank'
2
+ import { epic_graph, type EpicChild } from './epic-graph'
3
+
4
+ // `issue-rank.ts`'s keys over graph children (joshuafolkken/kit#2928), for both offer paths that hand
5
+ // out children: `backlog:next` (`backlog-rank.ts`) and a named epic's `epic:next --lanes`
6
+ // (`epic-lane-offer.ts`). One ranking, so the two cannot disagree about which child goes first.
7
+
8
+ const CLOSED = 'CLOSED'
9
+
10
+ // How many open issues of the pool wait on each child. Only the pool is counted: it is every issue the
11
+ // caller may run, and an issue outside it is not one this ranking can start sooner.
12
+ function dependents_of(pool: ReadonlyArray<EpicChild>): ReadonlyMap<string, number> {
13
+ return issue_rank.count_dependents(
14
+ pool
15
+ .filter((child) => child.state !== CLOSED)
16
+ .map((child) => ({
17
+ key: epic_graph.key_of(child),
18
+ blockers: child.blocked_by.map((blocker) => epic_graph.blocker_key(blocker)),
19
+ })),
20
+ )
21
+ }
22
+
23
+ function rank(
24
+ children: ReadonlyArray<EpicChild>,
25
+ pool: ReadonlyArray<EpicChild>,
26
+ ): Array<EpicChild> {
27
+ const dependents = dependents_of(pool)
28
+
29
+ return issue_rank.rank(children, (child) => ({
30
+ labels: child.labels,
31
+ dependents: dependents.get(epic_graph.key_of(child)) ?? 0,
32
+ }))
33
+ }
34
+
35
+ const epic_rank = { rank }
36
+
37
+ export { epic_rank }
@@ -1,4 +1,4 @@
1
- import { git_gh_command } from '#scripts/git/git-gh-command'
1
+ import { git_gh_command } from '#scripts/gh/git-gh-command'
2
2
  import { epic_fetch } from './epic-fetch'
3
3
  import { epic_graph, type EpicChild } from './epic-graph'
4
4
  import { epic_parse } from './epic-parse'
@@ -65,7 +65,6 @@ async function read_epic(epic_number: number): Promise<EpicReading | { error: st
65
65
  }
66
66
 
67
67
  const epic_read = {
68
- UNKNOWN_REPO,
69
68
  read_epic,
70
69
  }
71
70
 
@@ -1,4 +1,4 @@
1
- import { git_gh_command } from '#scripts/git/git-gh-command'
1
+ import { git_gh_command } from '#scripts/gh/git-gh-command'
2
2
  import { epic_add_body } from './epic-add-body'
3
3
  import { epic_chains } from './epic-chains'
4
4
  import { epic_graph, type EpicChild, type IssueReference } from './epic-graph'
@@ -54,20 +54,8 @@ function format_replaced_relations(links: ReadonlyArray<DependencyLink>): string
54
54
  return `Replaced blocked-by: ${join_references(quoted)}.`
55
55
  }
56
56
 
57
- const epic_reference = {
58
- DEPENDENCY_ARROW,
59
- REFERENCE_SEPARATOR,
60
- to_issue_reference,
61
- join_references,
62
- format_dependency_link,
63
- format_dependency_links,
64
- format_issue_references,
65
- format_replaced_relations,
66
- }
67
-
68
- export type { IssueReference } from '#scripts/git/issue-reference'
57
+ export type { IssueReference } from '#scripts/issue/issue-reference'
69
58
  export {
70
- epic_reference,
71
59
  DEPENDENCY_ARROW,
72
60
  REFERENCE_SEPARATOR,
73
61
  to_issue_reference,
@@ -103,7 +103,7 @@ async function recheck_missing_relations(
103
103
  )
104
104
  }
105
105
 
106
- const epic_relation_recheck = { recheck_missing_relations, suspect_children, RECHECK_LIMIT }
106
+ const epic_relation_recheck = { recheck_missing_relations, RECHECK_LIMIT }
107
107
 
108
108
  export type { BlockersReader }
109
109
  export { epic_relation_recheck }
@@ -1,4 +1,4 @@
1
- import { git_gh_command } from '#scripts/git/git-gh-command'
1
+ import { git_gh_command } from '#scripts/gh/git-gh-command'
2
2
  import type { DependencyLink } from './epic-parse'
3
3
  import { format_dependency_links } from './epic-reference'
4
4
 
@@ -1,4 +1,4 @@
1
- import { git_gh_command } from '#scripts/git/git-gh-command'
1
+ import { git_gh_command } from '#scripts/gh/git-gh-command'
2
2
  import { epic_decision } from './epic-decision'
3
3
  import { epic_read } from './epic-read'
4
4
  import { format_dependency_links } from './epic-reference'
@@ -193,7 +193,6 @@ const epic_report = {
193
193
  build_result,
194
194
  candidates_for_repo,
195
195
  format_result,
196
- VERDICT_LINES,
197
196
  }
198
197
 
199
198
  export type { EpicNextResult, EpicVerdict, RepoCandidates }
@@ -1,5 +1,5 @@
1
- import { git_gh_command } from '#scripts/git/git-gh-command'
2
- import { EPIC_LABEL } from '#scripts/git/issue-labels'
1
+ import { git_gh_command } from '#scripts/gh/git-gh-command'
2
+ import { EPIC_LABEL } from '#scripts/issue/issue-labels'
3
3
  import { epic_body } from './epic-body'
4
4
  import { epic_promote } from './epic-promote'
5
5
  import { epic_relations } from './epic-relations'
@@ -213,7 +213,6 @@ async function check_epic(epic_number: number): Promise<number> {
213
213
  }
214
214
 
215
215
  const epic_run = {
216
- parse_created_number,
217
216
  create_epic,
218
217
  promote_epic,
219
218
  check_epic,
@@ -1,4 +1,4 @@
1
- import { EPIC_LABEL } from '#scripts/git/issue-labels'
1
+ import { EPIC_LABEL } from '#scripts/issue/issue-labels'
2
2
  import { epic_parse } from './epic-parse'
3
3
  import { to_issue_reference } from './epic-reference'
4
4