@joshuafolkken/kit 1.1050.0 → 1.1128.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (630) hide show
  1. package/.claude/settings.json +9 -8
  2. package/.claude/skills/epic-commands/SKILL.md +5 -7
  3. package/.claude/skills/workflow-commands/SKILL.md +20 -12
  4. package/.claude/skills/workflow-commands/background-commands.md +36 -84
  5. package/.claude/skills/workflow-commands/backlogrun-child.md +1 -1
  6. package/.claude/skills/workflow-commands/backlogrun-lanes.md +8 -6
  7. package/.claude/skills/workflow-commands/backlogrun-progress.md +30 -33
  8. package/.claude/skills/workflow-commands/backlogrun-steps.md +12 -12
  9. package/.claude/skills/workflow-commands/backlogrun.md +2 -2
  10. package/.claude/skills/workflow-commands/chain-rule.md +4 -2
  11. package/.claude/skills/workflow-commands/delegation.md +3 -3
  12. package/.claude/skills/workflow-commands/followup-reference.md +1 -1
  13. package/.claude/skills/workflow-commands/followup.md +7 -3
  14. package/.claude/skills/workflow-commands/fullrun-steps.md +3 -2
  15. package/.claude/skills/workflow-commands/fullrun.md +8 -6
  16. package/.claude/skills/workflow-commands/halfrun.md +19 -21
  17. package/.claude/skills/workflow-commands/issue-comments.md +1 -1
  18. package/.claude/skills/workflow-commands/issue-fold-existing.md +10 -10
  19. package/.claude/skills/workflow-commands/issue-scout.md +1 -1
  20. package/.claude/skills/workflow-commands/kickoff.md +9 -4
  21. package/.claude/skills/workflow-commands/latest-gate.md +8 -16
  22. package/.claude/skills/workflow-commands/needs-human-review.md +1 -1
  23. package/.claude/skills/workflow-commands/observation-filing.md +3 -3
  24. package/.claude/skills/workflow-commands/pre-gate-cut.md +4 -8
  25. package/.claude/skills/workflow-commands/prerequisite.md +1 -1
  26. package/.claude/skills/workflow-commands/prrun.md +36 -0
  27. package/.claude/skills/workflow-commands/retrospective.md +1 -1
  28. package/.claude/skills/workflow-commands/split-assessment.md +4 -18
  29. package/.claude/skills/workflow-commands/working-tree-hold.md +22 -2
  30. package/.codex/hooks.json +16 -20
  31. package/.github/actions/setup-node/action.yml +33 -0
  32. package/.github/actions/setup-pnpm/action.yml +93 -0
  33. package/.github/dependabot.yml +5 -1
  34. package/.github/workflows/auto-tag.yml +2 -3
  35. package/.github/workflows/ci.yml +31 -134
  36. package/.github/workflows/dependabot-auto-merge.yml +1 -0
  37. package/.github/workflows/pr-classification.yml +6 -44
  38. package/.github/workflows/production.yml +1 -0
  39. package/.github/workflows/publish.yml +43 -47
  40. package/.github/workflows/sonar-qube.yml +41 -4
  41. package/.pnpmfile.mjs +29 -0
  42. package/AGENTS.md +5 -2
  43. package/CLAUDE.md +33 -27
  44. package/GEMINI.md +5 -2
  45. package/README.md +66 -20
  46. package/SECURITY.md +37 -6
  47. package/cspell/index.yaml +6 -1
  48. package/dist/CLAUDE.basic.md +6 -6
  49. package/dist/CLAUDE.md +33 -27
  50. package/dist/CLAUDE.static.md +6 -6
  51. package/dist/config-merge/index.js +48 -12
  52. package/dist/hooks/batch-guard.js +4 -4
  53. package/dist/hooks/{chunk-7VPDUBRN.js → chunk-4JZDP5X5.js} +152 -155
  54. package/dist/hooks/{chunk-HJIISEAC.js → chunk-5SD2YM7Z.js} +5 -13
  55. package/dist/hooks/{chunk-NAS4C7GP.js → chunk-77J7IEQM.js} +2 -2
  56. package/dist/hooks/{chunk-DMQN45FN.js → chunk-7HVB7SZG.js} +3 -3
  57. package/dist/hooks/{chunk-RLDX5SOC.js → chunk-AIOIOMPX.js} +4413 -1970
  58. package/dist/hooks/{chunk-5BK3K7V4.js → chunk-M7QKEKWO.js} +873 -2049
  59. package/dist/hooks/{chunk-WQ4OSBSS.js → chunk-MKVGBQPA.js} +2 -2
  60. package/dist/hooks/{chunk-EJDX2TOB.js → chunk-NXYMNPUQ.js} +7 -88
  61. package/dist/hooks/{chunk-NJQOBE6L.js → chunk-QVLT52OV.js} +2 -7
  62. package/dist/hooks/{chunk-GQ7KP45M.js → chunk-XYUIQOW3.js} +2 -2
  63. package/dist/hooks/codex-hook-adapter.js +12 -48
  64. package/dist/hooks/duplicate-read-guard.js +5 -5
  65. package/dist/hooks/format-edited.js +2 -2
  66. package/dist/hooks/inputs.json +280 -0
  67. package/dist/hooks/investigation-guard.js +5 -5
  68. package/dist/hooks/pretool-guard.js +9 -9
  69. package/dist/hooks/session-lang.js +0 -1
  70. package/dist/hooks/stop-guard.js +192 -333
  71. package/dist/josh.js +240 -148
  72. package/dist/managed-marker/index.js +2 -1
  73. package/dist/version/index.js +70 -78
  74. package/eslint/rules/promise.js +5 -0
  75. package/eslint/rules/unicorn.js +3 -2
  76. package/package.json +26 -5
  77. package/pnpm-workspace.yaml +5 -7
  78. package/prompts/collaboration-workflow/glossary.md +17 -0
  79. package/prompts/collaboration-workflow/issue-citation.md +5 -5
  80. package/prompts/collaboration-workflow/issue-template.md +1 -1
  81. package/prompts/collaboration-workflow/operating-rules.md +5 -5
  82. package/prompts/collaboration-workflow/overview.md +13 -1
  83. package/prompts/collaboration-workflow/principles.md +9 -0
  84. package/prompts/collaboration-workflow/report-format.md +1 -1
  85. package/prompts/collaboration-workflow/residency.md +3 -3
  86. package/prompts/collaboration-workflow/rule-delivery.md +1 -1
  87. package/prompts/collaboration-workflow/turn-batching.md +3 -3
  88. package/prompts/collaboration-workflow/upstream-interrupt.md +1 -1
  89. package/prompts/collaboration-workflow/wip-cap.md +25 -22
  90. package/prompts/collaboration-workflow.md +6 -8
  91. package/prompts/review-rubric.md +1 -1
  92. package/prompts/review.md +3 -3
  93. package/prompts/sonar-hotspot-handling.md +11 -3
  94. package/prompts/testing-guide.md +3 -3
  95. package/scripts/adopt/adopt-toolkits.ts +0 -2
  96. package/scripts/adopt/adopt.ts +0 -2
  97. package/scripts/agent/agent-argv.ts +0 -2
  98. package/scripts/agent/agent-diagnostics.ts +1 -1
  99. package/scripts/agent/agent-role-profile.ts +0 -7
  100. package/scripts/agent/claude-agent-argv.ts +0 -2
  101. package/scripts/agent/codex-agent-argv.ts +1 -1
  102. package/scripts/agent/codex-hooks.ts +92 -0
  103. package/scripts/agent/interactive-ask.ts +1 -1
  104. package/scripts/auto-ok/auto-ok-cli.ts +6 -16
  105. package/scripts/backlog/backlog-arrival.ts +30 -10
  106. package/scripts/backlog/backlog-budget-cli.ts +15 -16
  107. package/scripts/backlog/backlog-budget.ts +0 -2
  108. package/scripts/backlog/backlog-defect-priority.ts +2 -2
  109. package/scripts/backlog/backlog-drive-cli.ts +10 -8
  110. package/scripts/backlog/backlog-drive-named-offer.ts +16 -3
  111. package/scripts/backlog/backlog-drive-named.ts +2 -1
  112. package/scripts/backlog/backlog-drive.ts +76 -16
  113. package/scripts/backlog/backlog-named.ts +0 -3
  114. package/scripts/backlog/backlog-next.ts +9 -15
  115. package/scripts/backlog/backlog-offer-cli.ts +6 -19
  116. package/scripts/backlog/backlog-plan-cli.ts +1 -7
  117. package/scripts/backlog/backlog-plan.ts +30 -19
  118. package/scripts/backlog/backlog-pool.ts +3 -6
  119. package/scripts/backlog/backlog-rank.ts +2 -2
  120. package/scripts/backlog/backlog-ready.ts +39 -10
  121. package/scripts/backlog/backlog-scope.ts +1 -3
  122. package/scripts/backlog/backlog-stalled-detect.ts +2 -2
  123. package/scripts/backlog/backlog-stalled.ts +0 -1
  124. package/scripts/backlog/backlog-waves.ts +5 -2
  125. package/scripts/behavior/behavior-cli.ts +1 -1
  126. package/scripts/build/build-codex-hooks.ts +26 -0
  127. package/scripts/build/build-hooks.ts +85 -9
  128. package/scripts/build/hook-bundle-stamp.ts +111 -0
  129. package/scripts/cases/cases-cli.ts +1 -1
  130. package/scripts/cases/cases-logic.ts +1 -1
  131. package/scripts/ci/composite-actions.ts +30 -0
  132. package/scripts/ci/pr-classification.ts +3 -3
  133. package/scripts/claude/workflow-destination.ts +10 -1
  134. package/scripts/clone/clone-fingerprint.ts +0 -1
  135. package/scripts/clone/clone-scan-cli.ts +1 -1
  136. package/scripts/clone/clone-scan.ts +1 -1
  137. package/scripts/config-merge/json-format.ts +0 -1
  138. package/scripts/config-merge/parse-jsonc.ts +33 -3
  139. package/scripts/config-merge/patch-json-key.ts +13 -6
  140. package/scripts/config-merge/patch-yaml-list.ts +1 -1
  141. package/scripts/cost-runtime/codex-usage.ts +2 -9
  142. package/scripts/cost-runtime/cost-attribute.ts +0 -1
  143. package/scripts/cost-runtime/cost-cli.ts +3 -10
  144. package/scripts/cost-runtime/cost-corpus.ts +0 -2
  145. package/scripts/cost-runtime/cost-format.ts +0 -3
  146. package/scripts/cost-runtime/cost-pricing.ts +0 -1
  147. package/scripts/cost-runtime/cost-tokens.ts +0 -1
  148. package/scripts/delegation/delegation-cli.ts +1 -1
  149. package/scripts/delegation/delegation-policy.ts +0 -1
  150. package/scripts/delegation/duplicate-read-guard.ts +0 -8
  151. package/scripts/delegation/fanout-cli.ts +1 -1
  152. package/scripts/delegation/fanout.ts +0 -2
  153. package/scripts/delegation/investigation-reads.ts +1 -164
  154. package/scripts/discovery/repo-map-logic.ts +0 -1
  155. package/scripts/discovery/repo-party-cli.ts +1 -1
  156. package/scripts/doctor/doctor-consumer.ts +6 -10
  157. package/scripts/doctor/doctor-io.ts +9 -13
  158. package/scripts/doctor/doctor-logic.ts +0 -4
  159. package/scripts/doctor/doctor.ts +14 -9
  160. package/scripts/document/backlogrun-parent-read-set.ts +12 -1
  161. package/scripts/document/document-byte-budget.ts +5 -5
  162. package/scripts/document/document-byte-check.ts +0 -1
  163. package/scripts/document/document-read-cli.ts +0 -2
  164. package/scripts/document/document-section-cli.ts +1 -1
  165. package/scripts/document/document-section.ts +0 -3
  166. package/scripts/document/edit-files-cli.ts +0 -1
  167. package/scripts/document/entry-read-budget.ts +21 -7
  168. package/scripts/document/entry-read-set.ts +32 -8
  169. package/scripts/document/lane-child-read-set.ts +8 -6
  170. package/scripts/document/read-files-cli.ts +0 -4
  171. package/scripts/document/read-set-cli.ts +0 -2
  172. package/scripts/document/read-set-point-of-use.ts +9 -3
  173. package/scripts/document/read-set-pricing.ts +0 -1
  174. package/scripts/document/read-set-trim.ts +4 -2
  175. package/scripts/epic/epic-add.ts +1 -1
  176. package/scripts/epic/epic-audit-cli.ts +1 -4
  177. package/scripts/epic/epic-audit-orphans.ts +1 -3
  178. package/scripts/epic/epic-audit-rationale.ts +0 -1
  179. package/scripts/epic/epic-audit-report.ts +0 -2
  180. package/scripts/epic/epic-audit.ts +8 -22
  181. package/scripts/epic/epic-bundle-cli.ts +1 -1
  182. package/scripts/epic/epic-bundle-evidence.ts +0 -1
  183. package/scripts/epic/epic-bundle-referenced.ts +1 -5
  184. package/scripts/epic/epic-bundle.ts +0 -4
  185. package/scripts/epic/epic-busy.ts +4 -5
  186. package/scripts/epic/epic-candidate-confirm.ts +0 -5
  187. package/scripts/epic/epic-classify.ts +2 -2
  188. package/scripts/epic/epic-cli-argv.ts +0 -1
  189. package/scripts/epic/epic-close-comment.ts +1 -1
  190. package/scripts/epic/epic-close.ts +5 -2
  191. package/scripts/epic/epic-cross-repo.ts +2 -4
  192. package/scripts/epic/epic-decision.ts +0 -1
  193. package/scripts/epic/epic-fetch.ts +2 -2
  194. package/scripts/epic/epic-index.ts +2 -3
  195. package/scripts/epic/epic-issue.ts +1 -15
  196. package/scripts/epic/epic-lane-offer.ts +9 -8
  197. package/scripts/epic/epic-nested.ts +1 -1
  198. package/scripts/epic/epic-next-read.ts +1 -3
  199. package/scripts/epic/epic-next-views.ts +0 -1
  200. package/scripts/epic/epic-next.ts +1 -10
  201. package/scripts/epic/epic-parse.ts +0 -1
  202. package/scripts/epic/epic-promote.ts +0 -9
  203. package/scripts/epic/epic-rank.ts +2 -2
  204. package/scripts/epic/epic-read.ts +1 -2
  205. package/scripts/epic/epic-reconcile.ts +1 -1
  206. package/scripts/epic/epic-reference.ts +1 -13
  207. package/scripts/epic/epic-relation-recheck.ts +1 -1
  208. package/scripts/epic/epic-relations.ts +1 -1
  209. package/scripts/epic/epic-remove.ts +1 -1
  210. package/scripts/epic/epic-report.ts +0 -1
  211. package/scripts/epic/epic-run.ts +2 -3
  212. package/scripts/epic/epic-shape.ts +1 -1
  213. package/scripts/epic/epic-solo-stale.ts +107 -0
  214. package/scripts/epic/epic-solo.ts +3 -2
  215. package/scripts/epic/epic-triage.ts +1 -1
  216. package/scripts/epic/epic-validate.ts +1 -1
  217. package/scripts/epic/epic.ts +1 -1
  218. package/scripts/exports/unused-members-cli.ts +53 -0
  219. package/scripts/{git → followup}/followup-issue-number.ts +1 -6
  220. package/scripts/{git → followup}/git-followup-cleanup.ts +2 -1
  221. package/scripts/{git → followup}/git-followup-finish.ts +1 -3
  222. package/scripts/{git → followup}/git-followup-flush.ts +2 -2
  223. package/scripts/{git → followup}/git-followup-issue-close.ts +2 -2
  224. package/scripts/{git → followup}/git-followup-label.ts +4 -4
  225. package/scripts/followup/git-followup-merged.ts +112 -0
  226. package/scripts/{git → followup}/git-followup-pending.ts +1 -1
  227. package/scripts/{git → followup}/git-followup-workflow.ts +19 -11
  228. package/scripts/{git → followup}/git-pr-followup-wrapup.ts +9 -3
  229. package/scripts/{git → followup}/git-pr-followup.ts +53 -16
  230. package/scripts/gate/core-budget.ts +3 -9
  231. package/scripts/gate/gate-plan.ts +7 -4
  232. package/scripts/gate/gate-report.ts +0 -6
  233. package/scripts/gate/gate-tree.ts +1 -1
  234. package/scripts/gate/pre-commit-type-check.ts +0 -6
  235. package/scripts/gate/project-checks.ts +7 -8
  236. package/scripts/gate/scoped-green.ts +0 -1
  237. package/scripts/gate/type-check-step.ts +1 -1
  238. package/scripts/gate/verification-gate.ts +0 -2
  239. package/scripts/gh/fix-gh-packages.ts +15 -12
  240. package/scripts/gh/gh-spawn.ts +2 -2
  241. package/scripts/{git → gh}/git-ai-review-scan.ts +1 -5
  242. package/scripts/{git → gh}/git-gh-check.ts +2 -1
  243. package/scripts/{git → gh}/git-gh-exec.ts +1 -1
  244. package/scripts/{git → gh}/git-gh-failure.ts +1 -1
  245. package/scripts/{git → gh}/git-gh-helpers.ts +0 -1
  246. package/scripts/{git → gh}/git-gh-issue-list.ts +13 -10
  247. package/scripts/{git → gh}/git-gh-issue-read.ts +1 -1
  248. package/scripts/{git → gh}/git-gh-issue-rest.ts +6 -3
  249. package/scripts/{git → gh}/git-gh-issue-write.ts +4 -1
  250. package/scripts/{git → gh}/git-gh-pr-auto-merge.ts +4 -1
  251. package/scripts/{git → gh}/git-gh-pr-read.ts +24 -0
  252. package/scripts/{git → gh}/git-gh-pr-rest.ts +5 -2
  253. package/scripts/{git → gh}/git-gh-pr-review.ts +2 -2
  254. package/scripts/{git → gh}/git-gh-pr-rollup.ts +1 -3
  255. package/scripts/{git → gh}/git-gh-pr.ts +3 -1
  256. package/scripts/{git → gh}/git-pr-ai-review.ts +2 -5
  257. package/scripts/{git → gh}/git-pr-checks-eval.ts +0 -10
  258. package/scripts/{git → gh}/git-pr-checks-parse.ts +4 -20
  259. package/scripts/{git → gh}/git-pr-checks.ts +2 -1
  260. package/scripts/{git → gh}/git-pr-coderabbit.ts +2 -5
  261. package/scripts/{git → gh}/git-pr-confirmation.ts +1 -3
  262. package/scripts/{git → gh}/git-pr-managed-config.ts +2 -3
  263. package/scripts/{git → gh}/git-pr.ts +3 -3
  264. package/scripts/git/changed-file-scope.ts +0 -1
  265. package/scripts/git/git-branch.ts +3 -6
  266. package/scripts/git/git-command.ts +6 -1
  267. package/scripts/git/git-commit.ts +1 -1
  268. package/scripts/git/git-common-directory.ts +80 -24
  269. package/scripts/git/git-error.ts +66 -9
  270. package/scripts/git/git-issue.ts +1 -1
  271. package/scripts/git/git-preflight.ts +2 -2
  272. package/scripts/git/git-prompt.ts +6 -31
  273. package/scripts/git/git-push.ts +1 -1
  274. package/scripts/git/git-spawn-sync.ts +65 -0
  275. package/scripts/git/git-spawn.ts +5 -4
  276. package/scripts/git/git-staging.ts +1 -0
  277. package/scripts/git/git-status.ts +1 -1
  278. package/scripts/git/git-workflow.ts +1 -1
  279. package/scripts/git/gone-branch.ts +1 -0
  280. package/scripts/git/listing-cutoff.ts +1 -1
  281. package/scripts/git/main-merge.ts +1 -1
  282. package/scripts/git/main-sync.ts +19 -1
  283. package/scripts/git/parse-json-array.ts +0 -3
  284. package/scripts/git/repository-lock.ts +16 -16
  285. package/scripts/git/{git-stash.ts → stash/git-stash.ts} +1 -1
  286. package/scripts/git/{stash-pop-args.ts → stash/stash-pop-args.ts} +2 -7
  287. package/scripts/git/{stash-pop-cli.ts → stash/stash-pop-cli.ts} +0 -1
  288. package/scripts/git/{stash-sweep-lock.ts → stash/stash-sweep-lock.ts} +3 -3
  289. package/scripts/hooks/codex-hook-adapter.ts +0 -1
  290. package/scripts/hooks/edited-cspell.ts +1 -1
  291. package/scripts/hooks/format-edited-file.ts +2 -0
  292. package/scripts/hooks/pre-push-unit.ts +0 -4
  293. package/scripts/hooks/pretool-guard.ts +22 -4
  294. package/scripts/hooks/reserved-run.ts +1 -1
  295. package/scripts/hooks/step-zero-notice.ts +76 -0
  296. package/scripts/hooks/stop-guard.ts +47 -21
  297. package/scripts/init/claude-plugin-config.ts +4 -5
  298. package/scripts/init/hook-command-rewrite.ts +16 -8
  299. package/scripts/init/hook-launch.ts +41 -15
  300. package/scripts/init/init-basic.ts +2 -5
  301. package/scripts/init/init-file-action.ts +54 -0
  302. package/scripts/init/init-logic-migrate.ts +35 -17
  303. package/scripts/init/init-logic-secretlint.ts +1 -1
  304. package/scripts/init/init-logic.ts +10 -19
  305. package/scripts/init/init.ts +11 -71
  306. package/scripts/init/kit-written-paths.ts +2 -0
  307. package/scripts/init/project-profile.ts +9 -17
  308. package/scripts/init/start-exec.ts +1 -1
  309. package/scripts/init/start-setup-pr.ts +6 -6
  310. package/scripts/init/start-steps.ts +3 -1
  311. package/scripts/issue/behavior-change-lint.ts +0 -1
  312. package/scripts/issue/defect-rate-cli.ts +64 -23
  313. package/scripts/issue/defect-rate.ts +1 -2
  314. package/scripts/{git → issue}/git-next-issues.ts +3 -3
  315. package/scripts/issue/issue-backlinks-cli.ts +1 -5
  316. package/scripts/issue/issue-backlinks.ts +7 -14
  317. package/scripts/issue/issue-cite-cli.ts +2 -6
  318. package/scripts/issue/issue-cite.ts +12 -8
  319. package/scripts/issue/issue-classification.ts +1 -9
  320. package/scripts/issue/issue-closing-pr.ts +4 -4
  321. package/scripts/issue/issue-comment-cli.ts +2 -2
  322. package/scripts/issue/issue-file-cli.ts +5 -5
  323. package/scripts/issue/issue-file.ts +7 -14
  324. package/scripts/issue/issue-fold-cli.ts +1 -1
  325. package/scripts/issue/issue-fold-existing-cli.ts +1 -1
  326. package/scripts/{git → issue}/issue-labels.ts +8 -0
  327. package/scripts/issue/issue-lint-cli.ts +1 -1
  328. package/scripts/issue/issue-merged.ts +2 -2
  329. package/scripts/{git → issue}/issue-rank.ts +1 -1
  330. package/scripts/issue/issue-read-cli.ts +8 -47
  331. package/scripts/issue/issue-read.ts +0 -2
  332. package/scripts/issue/issue-report-failures.ts +80 -0
  333. package/scripts/issue/issue-scout-cli.ts +1 -7
  334. package/scripts/issue/issue-scout-closed.ts +2 -2
  335. package/scripts/issue/issue-scout.ts +0 -2
  336. package/scripts/issue/issue-state-cli.ts +5 -46
  337. package/scripts/issue/issue-state.ts +1 -5
  338. package/scripts/issue/markdown-section.ts +21 -6
  339. package/scripts/issue/measure-rerun-cli.ts +74 -15
  340. package/scripts/issue/reproduction-measure.ts +1 -1
  341. package/scripts/josh/cli-body.ts +1 -1
  342. package/scripts/josh/file-map-stamp.ts +0 -3
  343. package/scripts/josh/josh-command-map.ts +2 -0
  344. package/scripts/josh/josh-commands-ai.ts +9 -102
  345. package/scripts/josh/josh-commands-backlog.ts +5 -1
  346. package/scripts/josh/josh-commands-development.ts +8 -1
  347. package/scripts/josh/josh-commands-issue.ts +2 -2
  348. package/scripts/josh/josh-commands-maintenance.ts +7 -0
  349. package/scripts/josh/josh-commands-project.ts +7 -1
  350. package/scripts/josh/josh-commands-run.ts +114 -0
  351. package/scripts/josh/josh-commands-versioning.ts +8 -0
  352. package/scripts/josh/josh-commands-workflow.ts +3 -3
  353. package/scripts/josh/path-decision.ts +0 -3
  354. package/scripts/josh/process-owner.ts +16 -0
  355. package/scripts/josh/run-github-prerequisite.ts +3 -6
  356. package/scripts/josh/session-language-cli.ts +0 -1
  357. package/scripts/lane/lane-await.ts +46 -19
  358. package/scripts/lane/lane-capacity.ts +6 -3
  359. package/scripts/lane/lane-child-invocation.ts +20 -7
  360. package/scripts/lane/lane-cli.ts +1 -4
  361. package/scripts/lane/lane-close.ts +5 -4
  362. package/scripts/lane/lane-dispatch.ts +3 -4
  363. package/scripts/lane/lane-environment.ts +0 -9
  364. package/scripts/lane/lane-handoff.ts +38 -0
  365. package/scripts/lane/lane-launch-cli.ts +31 -27
  366. package/scripts/lane/lane-open.ts +0 -3
  367. package/scripts/lane/lane-output.ts +0 -1
  368. package/scripts/lane/lane-registry.ts +9 -0
  369. package/scripts/lane/openai-lane-ship.ts +2 -0
  370. package/scripts/lane/openai-lane-supervisor-decision.ts +2 -1
  371. package/scripts/lane/openai-lane-supervisor.ts +6 -4
  372. package/scripts/lane/openai-review-broker.ts +7 -1
  373. package/scripts/lib/bounded-pool.ts +1 -0
  374. package/scripts/lib/cli-flags.ts +31 -2
  375. package/scripts/lib/error-message.ts +12 -1
  376. package/scripts/lib/json-value.ts +5 -4
  377. package/scripts/lib/poll.ts +3 -1
  378. package/scripts/lib/timed-fetch.ts +15 -0
  379. package/scripts/lib/timeouts.ts +13 -0
  380. package/scripts/{yaml → lib}/yaml-document.ts +3 -1
  381. package/scripts/{bytes → lines}/bytes-command.ts +0 -2
  382. package/scripts/lines/line-targets.ts +0 -11
  383. package/scripts/lines/lines-command.ts +5 -4
  384. package/scripts/lint/lint-related-scope.ts +0 -1
  385. package/scripts/lint/lint-related.ts +1 -1
  386. package/scripts/{git → notify}/telegram-notify.ts +2 -2
  387. package/scripts/{git → notify}/telegram-test.ts +4 -4
  388. package/scripts/observations/observation-ledger-home.ts +0 -1
  389. package/scripts/observations/observation-ledger-line.ts +0 -1
  390. package/scripts/observations/observation-ledger-migrate.ts +1 -1
  391. package/scripts/observations/observations-flush-landing.ts +3 -3
  392. package/scripts/observations/observations-flush.ts +2 -2
  393. package/scripts/overrides/lockfile-overrides.ts +1 -1
  394. package/scripts/overrides/overrides-logic.ts +1 -1
  395. package/scripts/package/package-scout-cli.ts +2 -7
  396. package/scripts/package/package-scout.ts +0 -2
  397. package/scripts/propagate/propagate-git-failure.ts +0 -1
  398. package/scripts/propagate/propagate-git.ts +3 -10
  399. package/scripts/propagate/propagate-publish.ts +2 -3
  400. package/scripts/propagate/propagate-run.ts +0 -2
  401. package/scripts/propagate/propagate-steps.ts +3 -5
  402. package/scripts/propagate/propagate-targets.ts +0 -4
  403. package/scripts/propagate/propagate.ts +0 -4
  404. package/scripts/refactor/import-graph.ts +0 -1
  405. package/scripts/refactor/refactor-lint.ts +0 -2
  406. package/scripts/refactor/refactor-scan.ts +2 -2
  407. package/scripts/refactor/refactor-targets.ts +0 -1
  408. package/scripts/registry-migration/migrate-logic.ts +28 -21
  409. package/scripts/registry-migration/migrate.ts +25 -14
  410. package/scripts/release/github-release-cli.ts +19 -6
  411. package/scripts/release/github-release-environment.ts +46 -0
  412. package/scripts/release/github-release.ts +151 -94
  413. package/scripts/release/release-history.ts +0 -1
  414. package/scripts/release/release-plan.ts +0 -1
  415. package/scripts/release/release-publish.ts +38 -5
  416. package/scripts/release/release-scope-cli.ts +1 -2
  417. package/scripts/release/release-tag.ts +2 -4
  418. package/scripts/release/release-worktree.ts +97 -2
  419. package/scripts/repo/auto-merge-setting-logic.ts +1 -4
  420. package/scripts/repo/repo-setting.ts +1 -1
  421. package/scripts/repo/repository-labels.ts +3 -3
  422. package/scripts/repo/required-checks-logic.ts +206 -0
  423. package/scripts/repo/required-checks-report.ts +71 -0
  424. package/scripts/repo/ruleset-check-cli.ts +53 -0
  425. package/scripts/repo/ruleset-check.ts +147 -0
  426. package/scripts/report/report-lint-cli.ts +0 -4
  427. package/scripts/review/disposition-cli.ts +1 -1
  428. package/scripts/review/live-evidence.ts +1 -1
  429. package/scripts/review/review-attest-cli.ts +0 -6
  430. package/scripts/review/review-attest.ts +4 -16
  431. package/scripts/review/review-brief-cli.ts +23 -6
  432. package/scripts/review/review-brief.ts +21 -8
  433. package/scripts/review/review-checkout.ts +3 -2
  434. package/scripts/review/review-diff-parts.ts +89 -0
  435. package/scripts/review/review-diff-write.ts +97 -0
  436. package/scripts/review/review-finding-ledger.ts +0 -1
  437. package/scripts/review/review-record-cli.ts +10 -17
  438. package/scripts/review/review-record.ts +0 -1
  439. package/scripts/review/review-round2-cli.ts +1 -1
  440. package/scripts/review/review-stamps.ts +0 -3
  441. package/scripts/review/review-tree.ts +14 -2
  442. package/scripts/rules/decision-oracle-stage.ts +18 -0
  443. package/scripts/rules/decision-oracle.ts +10 -7
  444. package/scripts/rules/delivered-rules.ts +9 -1
  445. package/scripts/rules/destructive-command.ts +119 -0
  446. package/scripts/rules/direct-filing.ts +1 -1
  447. package/scripts/rules/early-heartbeat.ts +4 -3
  448. package/scripts/rules/file-body.ts +0 -3
  449. package/scripts/rules/filing-cap.ts +0 -2
  450. package/scripts/rules/gh-api.ts +7 -2
  451. package/scripts/rules/git-argv.ts +18 -7
  452. package/scripts/rules/git-force.ts +0 -2
  453. package/scripts/rules/implementation-cut.ts +0 -1
  454. package/scripts/rules/index-guard.ts +71 -0
  455. package/scripts/rules/issue-citation.ts +50 -25
  456. package/scripts/rules/lane-background.ts +15 -7
  457. package/scripts/rules/lane-park.ts +22 -6
  458. package/scripts/rules/last-prompt.ts +1 -0
  459. package/scripts/rules/oracle-consulted.ts +1 -1
  460. package/scripts/rules/oracle-firing.ts +1 -0
  461. package/scripts/rules/oracle-list-cli.ts +0 -3
  462. package/scripts/rules/permission-guards.ts +14 -0
  463. package/scripts/rules/protected-files.ts +74 -0
  464. package/scripts/rules/reply-language.ts +1 -1
  465. package/scripts/rules/rule-body-guard.ts +0 -3
  466. package/scripts/rules/rule-value-cli.ts +0 -1
  467. package/scripts/rules/shell-body-trigger.ts +0 -1
  468. package/scripts/rules/shell-segments.ts +0 -1
  469. package/scripts/rules/stop-rules.ts +20 -9
  470. package/scripts/rules/tail-commands.ts +1 -1
  471. package/scripts/rules/test-declared-commit.ts +1 -1
  472. package/scripts/rules/third-party-write.ts +0 -1
  473. package/scripts/rules/worktree-guard.ts +26 -9
  474. package/scripts/run/run-carry-args.ts +8 -12
  475. package/scripts/run/run-carry-cli.ts +0 -2
  476. package/scripts/run/run-carry-stash.ts +2 -2
  477. package/scripts/run/run-carry-streak.ts +1 -1
  478. package/scripts/run/run-cut-args.ts +1 -6
  479. package/scripts/run/run-cut-cli.ts +0 -7
  480. package/scripts/run/run-cut.ts +8 -54
  481. package/scripts/run/run-ending-cli.ts +2 -6
  482. package/scripts/run/run-ending.ts +1 -4
  483. package/scripts/run/run-entry-cli.ts +133 -25
  484. package/scripts/run/run-entry-stop.ts +104 -0
  485. package/scripts/run/run-entry.ts +0 -1
  486. package/scripts/run/run-event-cli.ts +0 -2
  487. package/scripts/run/run-event-follow.ts +1 -0
  488. package/scripts/run/run-event-render.ts +1 -1
  489. package/scripts/run/run-event-scope.ts +53 -4
  490. package/scripts/run/run-event-stream-emit.ts +7 -2
  491. package/scripts/run/run-event-stream.ts +0 -3
  492. package/scripts/run/run-event-watch.ts +1 -0
  493. package/scripts/run/run-halfrun-resume.ts +20 -7
  494. package/scripts/run/run-headless.ts +2 -2
  495. package/scripts/run/run-hold-cli.ts +33 -10
  496. package/scripts/run/run-hold.ts +29 -6
  497. package/scripts/run/run-issue-number.ts +1 -1
  498. package/scripts/run/run-liveness-cli.ts +2 -6
  499. package/scripts/run/run-liveness.ts +2 -3
  500. package/scripts/run/run-merge-cli.ts +7 -23
  501. package/scripts/run/run-merge-steps.ts +5 -5
  502. package/scripts/run/run-merge.ts +1 -1
  503. package/scripts/run/run-next-cli.ts +1 -1
  504. package/scripts/run/run-parent-cut-hook.ts +4 -2
  505. package/scripts/run/run-preflight.ts +2 -9
  506. package/scripts/run/run-prep-cli.ts +6 -3
  507. package/scripts/run/run-prep-locate.ts +1 -1
  508. package/scripts/run/run-progress-args.ts +20 -4
  509. package/scripts/run/run-progress-cli.ts +35 -36
  510. package/scripts/run/run-progress-clock.ts +10 -35
  511. package/scripts/run/run-progress-config.ts +0 -4
  512. package/scripts/run/run-progress-read.ts +1 -2
  513. package/scripts/run/run-progress.ts +1 -2
  514. package/scripts/run/run-prrun-resume.ts +117 -0
  515. package/scripts/run/run-report-cli.ts +1 -2
  516. package/scripts/run/run-report.ts +0 -1
  517. package/scripts/run/run-retrospective.ts +1 -1
  518. package/scripts/run/run-review-cli.ts +0 -3
  519. package/scripts/run/run-review-steps.ts +2 -0
  520. package/scripts/run/run-review.ts +0 -2
  521. package/scripts/run/run-ship-cli.ts +29 -19
  522. package/scripts/run/run-ship-detach.ts +1 -0
  523. package/scripts/run/run-ship-next.ts +106 -0
  524. package/scripts/run/run-ship-preflight.ts +1 -1
  525. package/scripts/run/run-ship-probe.ts +4 -1
  526. package/scripts/run/run-ship-return.ts +8 -3
  527. package/scripts/run/run-ship-review-steps.ts +18 -4
  528. package/scripts/run/run-ship-review.ts +11 -0
  529. package/scripts/run/run-ship-scoped.ts +1 -0
  530. package/scripts/run/run-ship-steps.ts +1 -1
  531. package/scripts/run/run-ship.ts +0 -1
  532. package/scripts/run/run-stage-read.ts +62 -0
  533. package/scripts/run/run-stage.ts +160 -0
  534. package/scripts/run/run-status-cli.ts +3 -16
  535. package/scripts/run/run-step-cli.ts +21 -14
  536. package/scripts/run/run-step.ts +1 -1
  537. package/scripts/run/run-stop-notify.ts +1 -3
  538. package/scripts/run/run-stranded-cli.ts +0 -4
  539. package/scripts/run/run-stranded-detect.ts +2 -2
  540. package/scripts/run/run-tail-cli.ts +17 -11
  541. package/scripts/run/run-tail.ts +2 -0
  542. package/scripts/run/run-tidy-lanes.ts +6 -2
  543. package/scripts/run/run-tidy-stashes.ts +12 -12
  544. package/scripts/run/run-wake-cli.ts +4 -13
  545. package/scripts/run/run-wake-loop.ts +2 -2
  546. package/scripts/run/run-wake.ts +2 -4
  547. package/scripts/run/run-watcher-guard-cli.ts +0 -4
  548. package/scripts/run/run-watcher-guard.ts +18 -12
  549. package/scripts/run/run-watcher-hook.ts +1 -1
  550. package/scripts/safe-chain/ci-installer-pin.ts +11 -5
  551. package/scripts/safe-chain/pack-hook.ts +92 -0
  552. package/scripts/safe-chain/project-config.ts +1 -1
  553. package/scripts/security/security-audit-provision-logic.ts +0 -1
  554. package/scripts/security/security-audit-provision.ts +3 -2
  555. package/scripts/security/security-audit.ts +0 -1
  556. package/scripts/security/security-updates-logic.ts +0 -1
  557. package/scripts/sonar/sonar-hotspots-cli.ts +10 -52
  558. package/scripts/sonar/sonar-hotspots.ts +0 -1
  559. package/scripts/sonar/sonar-new-code-cli.ts +150 -0
  560. package/scripts/sonar/sonar-new-code.ts +79 -0
  561. package/scripts/sonar/sonar-project.ts +97 -0
  562. package/scripts/split/split-assess-cli.ts +1 -1
  563. package/scripts/split/split-assess.ts +2 -5
  564. package/scripts/sync/managed-config-scope-cli.ts +1 -1
  565. package/scripts/sync/skill-migration.ts +0 -1
  566. package/scripts/sync/sync-ai-files.ts +4 -0
  567. package/scripts/sync/sync-hook-safety.ts +2 -3
  568. package/scripts/sync/sync.ts +1 -8
  569. package/scripts/sync/template-source-logic.ts +0 -1
  570. package/scripts/sync/workflow-pin-logic.ts +16 -28
  571. package/scripts/test/test-declared-changed.ts +13 -16
  572. package/scripts/test/test-declared-logic.ts +0 -1
  573. package/scripts/test/test-declared.ts +3 -9
  574. package/scripts/test/test-red-commit.ts +2 -2
  575. package/scripts/test/test-red.ts +14 -7
  576. package/scripts/test/test-type-logic.ts +1 -1
  577. package/scripts/test/unit-worker-share.ts +7 -16
  578. package/scripts/time-runtime/time-batch-guard.ts +1 -2
  579. package/scripts/time-runtime/time-bundle-call.ts +0 -1
  580. package/scripts/time-runtime/time-bundles.ts +0 -4
  581. package/scripts/time-runtime/time-density-hook.ts +0 -2
  582. package/scripts/time-runtime/time-followup-stage.ts +1 -1
  583. package/scripts/time-runtime/time-format.ts +0 -73
  584. package/scripts/time-runtime/time-round-trips.ts +0 -4
  585. package/scripts/time-runtime/time-single-check.ts +1 -1
  586. package/scripts/time-runtime/time-spans.ts +1 -1
  587. package/scripts/time-runtime/time-transcript-line.ts +1 -2
  588. package/scripts/ui/ui-routes-cli.ts +0 -5
  589. package/scripts/ui/ui-routes.ts +0 -5
  590. package/scripts/version/effective-upstream.ts +2 -2
  591. package/scripts/version/latest-corepack.ts +7 -9
  592. package/scripts/version/latest-scope-cli.ts +0 -2
  593. package/scripts/version/latest-update.ts +0 -2
  594. package/scripts/version/npm-registry.ts +2 -2
  595. package/scripts/version/publishable-range-check.ts +1 -1
  596. package/scripts/version/release-hold.ts +0 -4
  597. package/scripts/version/running-binary.ts +2 -2
  598. package/scripts/version/version-check-logic.ts +0 -2
  599. package/scripts/version/version-commands.ts +11 -1
  600. package/scripts/version/version-remote.ts +3 -3
  601. package/scripts/version/version-targets.ts +4 -4
  602. package/templates/CLAUDE.basic.md +6 -6
  603. package/templates/sonar-project.properties +28 -1
  604. package/templates/workflows/ci.yml +16 -82
  605. package/templates/workflows/dependabot-auto-merge.yml +6 -3
  606. package/templates/workflows/github-release.yml +79 -0
  607. package/tsconfig.sonar.json +4 -22
  608. package/prompts/collaboration-workflow/cross-repo-epic.md +0 -5
  609. package/prompts/collaboration-workflow/epic-audit.md +0 -5
  610. package/prompts/collaboration-workflow/epic-bundle.md +0 -5
  611. package/scripts/init/plugin-install-hint.ts +0 -47
  612. package/scripts/version/parse-json.ts +0 -13
  613. /package/scripts/{git → followup}/git-followup-stages.ts +0 -0
  614. /package/scripts/{git → gh}/git-gh-api-path.ts +0 -0
  615. /package/scripts/{git → gh}/git-gh-command.ts +0 -0
  616. /package/scripts/{git → gh}/git-gh-issue.ts +0 -0
  617. /package/scripts/{git → gh}/git-gh-pr-snapshot.ts +0 -0
  618. /package/scripts/{git → gh}/git-gh-reachability.ts +0 -0
  619. /package/scripts/{git → gh}/git-gh-repo.ts +0 -0
  620. /package/scripts/{git → gh}/git-gh-rest-state.ts +0 -0
  621. /package/scripts/{git → gh}/git-pr-checks-watch.ts +0 -0
  622. /package/scripts/{git → gh}/git-pr-error.ts +0 -0
  623. /package/scripts/{git → gh}/git-pr-messages.ts +0 -0
  624. /package/scripts/{git → gh}/github-issue-url.ts +0 -0
  625. /package/scripts/git/{stash-orphans.ts → stash/stash-orphans.ts} +0 -0
  626. /package/scripts/{git → issue}/issue-reference.ts +0 -0
  627. /package/scripts/{git → lib}/animation-helpers.ts +0 -0
  628. /package/scripts/{git → lib}/git-animation.ts +0 -0
  629. /package/scripts/{git → notify}/git-notify.ts +0 -0
  630. /package/scripts/{git → notify}/telegram-test-logic.ts +0 -0
@@ -122,11 +122,7 @@ function main(argv: ReadonlyArray<string>): void {
122
122
 
123
123
  const read_files_cli = {
124
124
  OVER_CAP_PREFIX,
125
- READ_TOOL_DIRECTIVE,
126
- SUCCESS_EXIT_CODE,
127
125
  USAGE,
128
- main,
129
- over_cap_directive,
130
126
  run,
131
127
  }
132
128
 
@@ -282,10 +282,8 @@ const read_set_cli = {
282
282
  POINT_OF_USE_LABEL,
283
283
  SCOPED_LABEL,
284
284
  TOTAL_READ_LABEL,
285
- USAGE,
286
285
  WHOLE_LABEL,
287
286
  known_entries,
288
- main,
289
287
  run,
290
288
  saved_percent,
291
289
  }
@@ -62,6 +62,7 @@ const POINT_OF_USE_BY_ENTRY: ReadonlyMap<string, ReadonlySet<string>> = new Map(
62
62
  ['kickoff', DEFERRED_DECISIONS],
63
63
  ['fullrun', DEFERRED_DECISIONS],
64
64
  ['halfrun', DEFERRED_DECISIONS],
65
+ ['prrun', DEFERRED_DECISIONS],
65
66
  ['backlogrun', new Set([...DEFERRED_DECISIONS, 'fullrun.md', 'split-assessment.md'])],
66
67
  ])
67
68
 
@@ -74,9 +75,14 @@ function is_point_of_use(entry: string, file: string): boolean {
74
75
  return (POINT_OF_USE_BY_ENTRY.get(entry) ?? NO_PER_ENTRY_FILES).has(file)
75
76
  }
76
77
 
77
- // The global point-of-use files plus the ones this entry names in its own row.
78
- function point_of_use_files(entry: string): Array<string> {
79
- return [...POINT_OF_USE_FILES, ...(POINT_OF_USE_BY_ENTRY.get(entry) ?? NO_PER_ENTRY_FILES)]
78
+ // **Only the global files the entry reaches, plus the ones this entry names in its own row**
79
+ // (joshuafolkken/kit#3078). `cited` is every document the entry's path names; a global file outside it
80
+ // is one this entry never opens — a `kickoff` never issues `followup` — so charging it made every
81
+ // entry's total the same figure and the per-entry ratchet measured nothing.
82
+ function point_of_use_files(entry: string, cited: ReadonlySet<string>): Array<string> {
83
+ const reached = [...POINT_OF_USE_FILES].filter((file) => cited.has(file))
84
+
85
+ return [...reached, ...(POINT_OF_USE_BY_ENTRY.get(entry) ?? NO_PER_ENTRY_FILES)]
80
86
  }
81
87
 
82
88
  const read_set_point_of_use = {
@@ -45,7 +45,6 @@ function dollars_per_run(tokens: number): number {
45
45
 
46
46
  const read_set_pricing = {
47
47
  ASSUMED_REQUESTS,
48
- REFERENCE_MODEL,
49
48
  dollars_per_run,
50
49
  }
51
50
 
@@ -24,6 +24,8 @@ interface TrimSpec {
24
24
  unused_skill_sections: ReadonlyArray<string>
25
25
  // The point-of-use documents this role's parent owns; empty when the role owns them all.
26
26
  skipped_point_of_use: ReadonlySet<string>
27
+ // The point-of-use documents this role reaches that its base entry's path does not name.
28
+ reached_point_of_use: ReadonlySet<string>
27
29
  }
28
30
 
29
31
  function subtract(left: Cost, right: Cost): Cost {
@@ -59,7 +61,7 @@ function reduce_skill(file: FileCost, saving: Cost): FileCost {
59
61
  // **`whole` and `scoped` both carry the own-files cost identically**, so the `SKILL.md` saving lands
60
62
  // on each by the same amount — there is no need to re-derive the referenced-section split.
61
63
  function costed(root: string, spec: TrimSpec): ReadSetCost {
62
- const base = entry_read_set.costed(root, spec.base_entry)
64
+ const base = entry_read_set.costed(root, spec.base_entry, spec.reached_point_of_use)
63
65
  const saving = unused_skill_cost(root, spec.unused_skill_sections)
64
66
 
65
67
  return {
@@ -72,7 +74,7 @@ function costed(root: string, spec: TrimSpec): ReadSetCost {
72
74
  }
73
75
  }
74
76
 
75
- const read_set_trim = { costed, unused_skill_cost }
77
+ const read_set_trim = { costed }
76
78
 
77
79
  export type { TrimSpec }
78
80
  export { read_set_trim }
@@ -1,5 +1,5 @@
1
1
  import { backlog_ready } from '#scripts/backlog/backlog-ready'
2
- import { git_gh_command } from '#scripts/git/git-gh-command'
2
+ import { git_gh_command } from '#scripts/gh/git-gh-command'
3
3
  import { epic_add_plan, type AddPlan } from './epic-add-plan'
4
4
  import type { InsertPosition } from './epic-chains'
5
5
  import { epic_decision } from './epic-decision'
@@ -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 { issue_read } from '#scripts/issue/issue-read'
5
5
  import { epic_audit_logic, type AuditFinding, type ReferenceState } from './epic-audit'
6
6
  import { epic_audit_checks, type AuditChild } from './epic-audit-checks'
@@ -356,16 +356,13 @@ async function main(argv: ReadonlyArray<string>): Promise<void> {
356
356
  }
357
357
 
358
358
  const epic_audit_cli = {
359
- USAGE,
360
359
  UNREADABLE_REPO,
361
360
  parse_epic_number: epic_issue.parse_epic_number,
362
361
  attach_bodies,
363
362
  resolve_reference_states,
364
363
  outside_references,
365
- read_order_comments,
366
364
  audit,
367
365
  run,
368
- main,
369
366
  }
370
367
 
371
368
  if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
@@ -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 { cutoff_of, PAGE_CEILING_CAUSE, type ScanCutoff } from '#scripts/git/listing-cutoff'
3
3
  import { parse_json_array_safe } from '#scripts/git/parse-json-array'
4
4
  import { z } from 'zod'
@@ -129,8 +129,6 @@ function locally_tracked(snapshot: EpicSnapshot): Array<number> {
129
129
  }
130
130
 
131
131
  const epic_audit_orphans = {
132
- PARENT_MARKERS,
133
- ORPHAN_SEARCH,
134
132
  claimed_numbers,
135
133
  claims_parent,
136
134
  find_claiming_issues,
@@ -181,7 +181,6 @@ function find_unjustified_orders(input: RationaleInput): Array<AuditFinding> {
181
181
  }
182
182
 
183
183
  const epic_audit_rationale = {
184
- UNJUSTIFIED_ORDER,
185
184
  order_pairs,
186
185
  pair_ends,
187
186
  find_unjustified_orders,
@@ -91,9 +91,7 @@ const epic_audit_report = {
91
91
  PASS_LINE,
92
92
  anomaly_findings,
93
93
  unreadable_findings,
94
- has_error,
95
94
  build_result,
96
- sort_findings,
97
95
  format_report,
98
96
  }
99
97
 
@@ -1,3 +1,4 @@
1
+ import { markdown_section } from '#scripts/issue/markdown-section'
1
2
  import { epic_graph, type EpicChild, type IssueReference } from './epic-graph'
2
3
 
3
4
  // Reading an epic's children against each other.
@@ -39,8 +40,10 @@ const REPO_NAME_DOT = '.'
39
40
  const NO_KNOWN_REPOS: ReadonlySet<string> = new Set()
40
41
  // Where a child states what it must deliver. Both spellings, because the bodies are written in
41
42
  // whichever language the session was in.
42
- const ACCEPTANCE_HEADINGS: ReadonlyArray<string> = ['## 受け入れ条件', '## Acceptance criteria']
43
- const HEADING_PREFIX = '## '
43
+ const ACCEPTANCE_HEADINGS: ReadonlySet<string> = new Set([
44
+ '## 受け入れ条件',
45
+ '## Acceptance criteria',
46
+ ])
44
47
 
45
48
  type FindingLevel = 'error' | 'warning'
46
49
 
@@ -163,29 +166,14 @@ function parse_references(text: string, repo = ''): Array<number> {
163
166
  }
164
167
 
165
168
  function is_acceptance_heading(line: string): boolean {
166
- return ACCEPTANCE_HEADINGS.includes(line.trim())
169
+ return ACCEPTANCE_HEADINGS.has(line.trim())
167
170
  }
168
171
 
169
- function is_heading(line: string): boolean {
170
- return line.trimStart().startsWith(HEADING_PREFIX)
171
- }
172
-
173
- // The lines under the acceptance-criteria heading, up to the next `##`. Shaped like the other
174
- // section readers in this repository, for the same reason: a regex spanning the block backtracks.
175
- function section_lines(lines: ReadonlyArray<string>): Array<string> {
176
- const start = lines.findIndex((line) => is_acceptance_heading(line))
177
- if (start === -1) return []
178
- const rest = lines.slice(start + 1)
179
- const end = rest.findIndex((line) => is_heading(line))
180
-
181
- return end === -1 ? rest : rest.slice(0, end)
182
- }
183
-
184
- // The acceptance-criteria section of a child's body, or an empty string.
172
+ // The acceptance-criteria section of a child's body, up to the next unfenced `##`, or an empty string.
185
173
  function acceptance_section(body: string | undefined): string {
186
174
  if (body === undefined) return ''
187
175
 
188
- return section_lines(body.split('\n')).join('\n')
176
+ return markdown_section.section_lines_matching(body, is_acceptance_heading).join('\n')
189
177
  }
190
178
 
191
179
  // Everything `node` depends on, directly or through a chain. Walked iteratively so a graph that
@@ -226,13 +214,11 @@ function depends_on(
226
214
  // a `#` lives in `prefix_before`, so the pattern on its own matches the tail of `owner/repo#12` —
227
215
  // the very reading this module exists to prevent.
228
216
  const epic_audit_logic = {
229
- ACCEPTANCE_HEADINGS,
230
217
  unique_references,
231
218
  known_repos,
232
219
  parse_issue_references,
233
220
  parse_references,
234
221
  acceptance_section,
235
- collect_blockers,
236
222
  depends_on,
237
223
  }
238
224
 
@@ -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,
@@ -9,6 +9,7 @@ import { epic_graph, type EpicChild } from './epic-graph'
9
9
  import { epic_rank } from './epic-rank'
10
10
  import type { EpicVerdict } from './epic-report'
11
11
  import { epic_solo } from './epic-solo'
12
+ import { epic_solo_stale } from './epic-solo-stale'
12
13
  import { epic_triage, type TriageVerdict } from './epic-triage'
13
14
 
14
15
  // Which children a repository has room to start right now (joshuafolkken/kit#1491).
@@ -168,6 +169,7 @@ async function collect(
168
169
  for (const pool of pools) {
169
170
  if (children.length >= wanted) break
170
171
 
172
+ // eslint-disable-next-line no-await-in-loop -- pools are asked in order until enough children are found
171
173
  const answer = await ask_pool(pool, wanted - children.length)
172
174
 
173
175
  children.push(...answer.children)
@@ -228,7 +230,13 @@ async function offer_for_repo(
228
230
 
229
231
  if (triage !== undefined) return triage
230
232
 
231
- 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
+
232
240
  const free = free_lanes(read, request.limit)
233
241
 
234
242
  if (free === NO_LANES) {
@@ -245,15 +253,8 @@ async function offer_for_repo(
245
253
  }
246
254
 
247
255
  const epic_lane_offer = {
248
- is_held,
249
- free_lanes,
250
- wanted_of,
251
256
  combine_verdicts,
252
- candidates_in,
253
- unseen_candidates,
254
257
  dedupe_pools,
255
- withheld_message,
256
- collect,
257
258
  offer_for_repo,
258
259
  }
259
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,
@@ -1,4 +1,4 @@
1
- import { issue_rank } from '#scripts/git/issue-rank'
1
+ import { issue_rank } from '#scripts/issue/issue-rank'
2
2
  import { epic_graph, type EpicChild } from './epic-graph'
3
3
 
4
4
  // `issue-rank.ts`'s keys over graph children (joshuafolkken/kit#2928), for both offer paths that hand
@@ -32,6 +32,6 @@ function rank(
32
32
  }))
33
33
  }
34
34
 
35
- const epic_rank = { dependents_of, rank }
35
+ const epic_rank = { rank }
36
36
 
37
37
  export { epic_rank }