@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
@@ -8,6 +8,7 @@ interface StartOptions {
8
8
  is_yes: boolean
9
9
  is_github: boolean
10
10
  visibility: Visibility
11
+ init_command: string | undefined
11
12
  }
12
13
 
13
14
  type StartStep = 'git_init' | 'initialize' | 'commit' | 'repository' | 'labels' | 'setup_pr'
@@ -137,20 +138,31 @@ function github_consent(
137
138
  }
138
139
  }
139
140
 
141
+ // A run whose initialize step was handed to a caller's command names that command wherever the step
142
+ // is printed, so the plan, the progress and a failure all say what actually runs (#2872).
143
+ function step_labels(init_command: string | undefined): Readonly<Record<StartStep, string>> {
144
+ if (init_command === undefined) return STEP_LABELS
145
+
146
+ return { ...STEP_LABELS, initialize: `Initialize with ${init_command}` }
147
+ }
148
+
140
149
  // What a failed run prints, so the user can tell how far it got before deciding how to resume.
141
150
  function progress_report(
142
151
  failed: StartStep,
143
152
  completed: ReadonlyArray<StartStep>,
144
153
  cause: string,
154
+ labels: Readonly<Record<StartStep, string>> = STEP_LABELS,
145
155
  ): string {
146
- const done =
147
- completed.length === 0 ? 'nothing' : completed.map((step) => STEP_LABELS[step]).join('; ')
156
+ const done = completed.length === 0 ? 'nothing' : completed.map((step) => labels[step]).join('; ')
148
157
 
149
- return `josh start stopped at: ${STEP_LABELS[failed]}\nCompleted: ${done}\nCause: ${cause}`
158
+ return `josh start stopped at: ${labels[failed]}\nCompleted: ${done}\nCause: ${cause}`
150
159
  }
151
160
 
152
- function plan_summary(steps: ReadonlyArray<StartStep>): string {
153
- const lines = steps.map((step, index) => ` ${String(index + 1)}. ${STEP_LABELS[step]}`)
161
+ function plan_summary(
162
+ steps: ReadonlyArray<StartStep>,
163
+ labels: Readonly<Record<StartStep, string>> = STEP_LABELS,
164
+ ): string {
165
+ const lines = steps.map((step, index) => ` ${String(index + 1)}. ${labels[step]}`)
154
166
 
155
167
  return ['josh start will:', ...lines].join('\n')
156
168
  }
@@ -161,6 +173,7 @@ const start_plan = {
161
173
  github_consent,
162
174
  progress_report,
163
175
  plan_summary,
176
+ step_labels,
164
177
  STEP_LABELS,
165
178
  }
166
179
  export { start_plan }
@@ -1,10 +1,10 @@
1
- import { git_gh_api_path } from '#scripts/git/git-gh-api-path'
2
- import { git_gh_exec } from '#scripts/git/git-gh-exec'
3
- import { git_gh_issue_write } from '#scripts/git/git-gh-issue-write'
1
+ import { git_gh_api_path } from '#scripts/gh/git-gh-api-path'
2
+ import { git_gh_exec } from '#scripts/gh/git-gh-exec'
3
+ import { git_gh_issue_write } from '#scripts/gh/git-gh-issue-write'
4
+ import { git_pr } from '#scripts/gh/git-pr'
5
+ import { github_issue_url } from '#scripts/gh/github-issue-url'
4
6
  import { git_issue, type IssueInfo } from '#scripts/git/git-issue'
5
- import { git_pr } from '#scripts/git/git-pr'
6
- import { github_issue_url } from '#scripts/git/github-issue-url'
7
- import { IGNORE_FOR_RELEASE_LABEL } from '#scripts/git/issue-labels'
7
+ import { IGNORE_FOR_RELEASE_LABEL } from '#scripts/issue/issue-labels'
8
8
  import { KIT_PACKAGE_NAME } from '#scripts/version/kit-descriptor'
9
9
  import { kit_written_paths } from './kit-written-paths'
10
10
  import { start_exec } from './start-exec'
@@ -12,15 +12,22 @@ import { start_exec } from './start-exec'
12
12
  const SETUP_TITLE = `Set up ${KIT_PACKAGE_NAME}`
13
13
  const SETUP_BODY = [
14
14
  `Adds the files \`josh start\` wrote while setting up ${KIT_PACKAGE_NAME}, so main carries the`,
15
- 'rules, settings and workflows every later Issue is run with. Only the files kit wrote are in the',
16
- 'pull request; anything else in the working tree is left as it was.',
15
+ 'rules, settings and workflows every later Issue is run with. Only the files the setup wrote are in',
16
+ 'the pull request; anything else in the working tree is left as it was.',
17
17
  ].join('\n')
18
+ const NAME_ONLY = '--name-only'
18
19
  const NOTHING_TO_COMMIT = 'The kit setup has no changes to commit, so no pull request was opened.'
19
20
  const OPEN_SETUP_ISSUES_QUERY = `?state=open&labels=${IGNORE_FOR_RELEASE_LABEL}&per_page=100`
20
21
  const FIRST_SETUP_ISSUE_FILTER = `[.[] | select(.title == "${SETUP_TITLE}") | .number][0] // empty`
21
22
 
22
- function lines_of(output: string | undefined): Array<string> {
23
- return (output ?? '').split('\n').filter((line) => line.length > 0)
23
+ // Listings are read NUL-separated (`-z`), so a path is never quoted — a name a caller's initialize
24
+ // command wrote need not be ASCII the way kit's own are (#2872).
25
+ function paths_of(output: string | undefined): Array<string> {
26
+ return (output ?? '').split('\0').filter((listed) => listed.length > 0)
27
+ }
28
+
29
+ function listing(args: ReadonlyArray<string>, root: string): Array<string> {
30
+ return paths_of(start_exec.read_output('git', [...args, '-z'], root))
24
31
  }
25
32
 
26
33
  function setup_issue(issue_number: string): IssueInfo {
@@ -42,17 +49,18 @@ function is_setup_branch(branch: string | undefined): boolean {
42
49
  }
43
50
 
44
51
  // Untracked files the ignore rules let through, plus tracked files the setup changed — two plain
45
- // listings, so nothing has to be parsed out of `git status`. Every kit path is ASCII, so git's
46
- // quoting of other names never hides one.
52
+ // listings, so nothing has to be parsed out of `git status`.
47
53
  function changed_paths(root: string): Array<string> {
48
- const untracked = start_exec.read_output(
49
- 'git',
50
- ['ls-files', '--others', '--exclude-standard'],
51
- root,
52
- )
53
- const modified = start_exec.read_output('git', ['diff', '--name-only', 'HEAD'], root)
54
-
55
- return [...lines_of(untracked), ...lines_of(modified)]
54
+ const untracked = listing(['ls-files', '--others', '--exclude-standard'], root)
55
+ const modified = listing(['diff', NAME_ONLY, 'HEAD'], root)
56
+
57
+ return [...untracked, ...modified]
58
+ }
59
+
60
+ // On the setup branch a failed commit left, that run's `git add` already staged its files, so they
61
+ // read as changed before this run's command ran — the staged ones count as setup output (#2872).
62
+ function carried_paths(root: string, current: string | undefined): Array<string> {
63
+ return is_setup_branch(current) ? listing(['diff', NAME_ONLY, '--cached'], root) : []
56
64
  }
57
65
 
58
66
  // The Issue carries the release classification the pull request is opened with, so the PR step finds
@@ -113,10 +121,30 @@ function commit_kit_paths(paths: ReadonlyArray<string>, issue: IssueInfo, root:
113
121
  start_exec.run('git', ['commit', '--message', issue.commit_message, '--', ...paths], root)
114
122
  }
115
123
 
116
- // Issue → branch → only kit's files committed → push → pull request. The merge is left to a person:
117
- // it is the one step that changes main.
118
- async function open(root: string): Promise<void> {
119
- const paths = kit_written_paths.select(changed_paths(root))
124
+ // A caller's initialize command writes files kit cannot name, so with a `baseline` — what was already
125
+ // changed before that command ran — everything changed since joins kit's own files, while a change
126
+ // the user had made before the run still stays out (#2872).
127
+ function setup_paths(
128
+ root: string,
129
+ baseline: ReadonlyArray<string> | undefined,
130
+ current: string | undefined,
131
+ ): Array<string> {
132
+ const changed = changed_paths(root)
133
+ const kit_paths = kit_written_paths.select(changed)
134
+
135
+ if (baseline === undefined) return kit_paths
136
+
137
+ const carried = carried_paths(root, current)
138
+ const written = changed.filter((path) => !baseline.includes(path) || carried.includes(path))
139
+
140
+ return [...new Set([...kit_paths, ...written])]
141
+ }
142
+
143
+ // Issue → branch → only the setup's files committed → push → pull request. The merge is left to a
144
+ // person: it is the one step that changes main.
145
+ async function open(root: string, baseline?: ReadonlyArray<string>): Promise<void> {
146
+ const current = start_exec.read_output('git', ['symbolic-ref', '--short', 'HEAD'], root)
147
+ const paths = setup_paths(root, baseline, current)
120
148
 
121
149
  if (paths.length === 0) {
122
150
  console.info(NOTHING_TO_COMMIT)
@@ -124,7 +152,6 @@ async function open(root: string): Promise<void> {
124
152
  return
125
153
  }
126
154
 
127
- const current = start_exec.read_output('git', ['symbolic-ref', '--short', 'HEAD'], root)
128
155
  const issue = resolve_issue(current)
129
156
 
130
157
  switch_to(issue.branch_name, current, root)
@@ -2,6 +2,7 @@ import path from 'node:path'
2
2
  import { error_text } from '#scripts/lib/error-message'
3
3
  import { repository_labels } from '#scripts/repo/repository-labels'
4
4
  import { self_sync_guard } from '#scripts/self-sync-guard/self-sync-guard-logic'
5
+ import { parseCommandString } from 'execa'
5
6
  import { main as init_main } from './init'
6
7
  import { PACKAGE_DIR } from './init-paths'
7
8
  import { kit_setup_state } from './kit-setup-state'
@@ -14,6 +15,11 @@ interface StepContext {
14
15
  root: string
15
16
  profile: ProjectProfile
16
17
  visibility: Visibility
18
+ init_command: string | undefined
19
+ }
20
+
21
+ interface RunContext extends StepContext {
22
+ baseline: ReadonlyArray<string> | undefined
17
23
  }
18
24
 
19
25
  const DEFAULT_BRANCH = 'main'
@@ -22,7 +28,7 @@ const GH_INSTALL_HINT =
22
28
  const GH_AUTH_HINT =
23
29
  'GitHub CLI is not signed in. Run gh auth login, then run josh start again. Nothing was changed.'
24
30
 
25
- const { succeeds, read_output, run } = start_exec
31
+ const { succeeds, read_output, run, run_local } = start_exec
26
32
 
27
33
  function read_git_state(root: string, shape: ProjectShape): GitState {
28
34
  const { has_git, has_github } = shape
@@ -67,8 +73,19 @@ function create_git_repository(context: StepContext): void {
67
73
  }
68
74
 
69
75
  // The same setup `josh init` runs, called rather than copied, with the profile the user confirmed.
76
+ // A toolkit that layers its files over kit's (`josh-app init`) names its own setup instead, so every
77
+ // other step and guard stays here rather than in a copy of this command (#2872). That command runs
78
+ // without a shell, is given the same profile, and a non-zero exit stops the run before the commit.
70
79
  function initialize(context: StepContext): void {
71
- init_main(['--profile', context.profile])
80
+ if (context.init_command === undefined) {
81
+ init_main(['--profile', context.profile])
82
+
83
+ return
84
+ }
85
+
86
+ const [command = '', ...args] = parseCommandString(context.init_command)
87
+
88
+ run_local(command, [...args, '--profile', context.profile], context.root)
72
89
  }
73
90
 
74
91
  function commit_all(context: StepContext): void {
@@ -97,11 +114,22 @@ function add_missing_labels(): void {
97
114
 
98
115
  // Main already has a history here, so the setup reaches it the way every other change does: through
99
116
  // an Issue and a pull request a person merges (joshuafolkken/kit#2816).
100
- async function open_setup_pull_request(context: StepContext): Promise<void> {
101
- await start_setup_pr.open(context.root)
117
+ async function open_setup_pull_request(context: RunContext): Promise<void> {
118
+ await start_setup_pr.open(context.root, context.baseline)
102
119
  }
103
120
 
104
- type StepAction = (context: StepContext) => void | Promise<void>
121
+ // What was already changed before a caller's initialize command ran, read only when the setup pull
122
+ // request will need to tell that command's files from the user's own (#2872).
123
+ function baseline_of(
124
+ steps: ReadonlyArray<StartStep>,
125
+ context: StepContext,
126
+ ): ReadonlyArray<string> | undefined {
127
+ if (context.init_command === undefined || !steps.includes('setup_pr')) return undefined
128
+
129
+ return start_setup_pr.changed_paths(context.root)
130
+ }
131
+
132
+ type StepAction = (context: RunContext) => void | Promise<void>
105
133
 
106
134
  const STEP_ACTIONS: Readonly<Record<StartStep, StepAction>> = {
107
135
  git_init: create_git_repository,
@@ -114,24 +142,29 @@ const STEP_ACTIONS: Readonly<Record<StartStep, StepAction>> = {
114
142
 
115
143
  async function run_step(
116
144
  step: StartStep,
117
- context: StepContext,
145
+ context: RunContext,
118
146
  completed: ReadonlyArray<StartStep>,
119
147
  ): Promise<void> {
120
148
  try {
121
149
  await STEP_ACTIONS[step](context)
122
150
  } catch (error) {
123
151
  const cause = error_text.message_of(error)
152
+ const labels = start_plan.step_labels(context.init_command)
124
153
 
125
- throw new Error(start_plan.progress_report(step, completed, cause), { cause: error })
154
+ throw new Error(start_plan.progress_report(step, completed, cause, labels), { cause: error })
126
155
  }
127
156
  }
128
157
 
129
158
  async function run_steps(steps: ReadonlyArray<StartStep>, context: StepContext): Promise<void> {
159
+ const labels = start_plan.step_labels(context.init_command)
160
+ const run_context: RunContext = { ...context, baseline: baseline_of(steps, context) }
161
+
130
162
  for (const [index, step] of steps.entries()) {
131
163
  const position = `${String(index + 1)}/${String(steps.length)}`
132
164
 
133
- console.info(`\n[${position}] ${start_plan.STEP_LABELS[step]}`)
134
- await run_step(step, context, steps.slice(0, index))
165
+ console.info(`\n[${position}] ${labels[step]}`)
166
+ // eslint-disable-next-line no-await-in-loop -- each step builds on what the earlier ones set up
167
+ await run_step(step, run_context, steps.slice(0, index))
135
168
  }
136
169
  }
137
170
 
@@ -14,7 +14,9 @@ import { start_steps } from './start-steps'
14
14
 
15
15
  const ARGUMENT_START_INDEX = 2
16
16
  const READY_MESSAGE = 'GitHub workflow ready. Use kickoff new in your assistant to plan an Issue.'
17
- const START_USAGE = 'josh start [--profile basic|full] [--yes] [--github] [--public]'
17
+ const START_USAGE =
18
+ 'josh start [--profile basic|full] [--yes] [--github] [--public] [--init-command <command>]'
19
+ const INIT_COMMAND_FLAG = '--init-command'
18
20
  const YES_FLAG = '--yes'
19
21
  const GITHUB_FLAG = '--github'
20
22
  const PUBLIC_FLAG = '--public'
@@ -26,16 +28,42 @@ interface Prepared {
26
28
  choices: Choices
27
29
  }
28
30
 
29
- // The switches are peeled off first, so what remains is exactly the `--profile` pair `josh init`
30
- // accepts — one parser for the profile in both commands.
31
+ interface InitCommandSplit {
32
+ init_command: string | undefined
33
+ rest: ReadonlyArray<string>
34
+ }
35
+
36
+ // A value that is blank or another flag means the command itself was left out, which would otherwise
37
+ // swallow the next switch or hand the initialize step nothing to run.
38
+ function is_command_value(value: string | undefined): value is string {
39
+ return value !== undefined && value.trim() !== '' && !value.startsWith('-')
40
+ }
41
+
42
+ // The command arrives as the one argument after its flag and is removed together with it.
43
+ function split_init_command(args: ReadonlyArray<string>): InitCommandSplit {
44
+ const index = args.indexOf(INIT_COMMAND_FLAG)
45
+
46
+ if (index === -1) return { init_command: undefined, rest: args }
47
+
48
+ const value = args[index + 1]
49
+
50
+ if (!is_command_value(value)) throw new Error(`Usage: ${START_USAGE}`)
51
+
52
+ return { init_command: value, rest: args.filter((_, at) => at !== index && at !== index + 1) }
53
+ }
54
+
55
+ // The switches and the initialize command are peeled off first, so what remains is exactly the
56
+ // `--profile` pair `josh init` accepts — one parser for the profile in both commands.
31
57
  function parse_start_options(args: ReadonlyArray<string>): StartOptions {
32
- const profile_args = args.filter((argument) => !SWITCHES.has(argument))
58
+ const { init_command, rest } = split_init_command(args)
59
+ const profile_args = rest.filter((argument) => !SWITCHES.has(argument))
33
60
 
34
61
  return {
35
62
  profile: project_profile.requested_profile(profile_args, START_USAGE),
36
- is_yes: args.includes(YES_FLAG),
37
- is_github: args.includes(GITHUB_FLAG),
38
- visibility: args.includes(PUBLIC_FLAG) ? 'public' : 'private',
63
+ is_yes: rest.includes(YES_FLAG),
64
+ is_github: rest.includes(GITHUB_FLAG),
65
+ visibility: rest.includes(PUBLIC_FLAG) ? 'public' : 'private',
66
+ init_command,
39
67
  }
40
68
  }
41
69
 
@@ -83,11 +111,13 @@ function prepare(args: ReadonlyArray<string>, is_tty: boolean, root: string): Pr
83
111
  async function main(args: ReadonlyArray<string>, is_tty: boolean): Promise<void> {
84
112
  const { steps, interaction, choices } = prepare(args, is_tty, process.cwd())
85
113
 
86
- console.info(start_plan.plan_summary(steps))
87
- const profile = await resolve_profile(choices, interaction)
88
114
  const { root, options } = choices
115
+ const { visibility, init_command } = options
116
+
117
+ console.info(start_plan.plan_summary(steps, start_plan.step_labels(init_command)))
118
+ const profile = await resolve_profile(choices, interaction)
89
119
 
90
- await start_steps.run_steps(steps, { root, profile, visibility: options.visibility })
120
+ await start_steps.run_steps(steps, { root, profile, visibility, init_command })
91
121
  console.info(`\n${READY_MESSAGE}`)
92
122
  }
93
123
 
@@ -112,7 +112,6 @@ function problems(body: string): ReadonlyArray<string> {
112
112
 
113
113
  const behavior_change_lint = {
114
114
  is_target,
115
- missing_headings,
116
115
  firing_point_name,
117
116
  problems,
118
117
  REQUIRED_HEADINGS,
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env tsx
2
2
  import { fileURLToPath } from 'node:url'
3
3
  import { parseArgs } from 'node:util'
4
- import { git_gh_command } from '#scripts/git/git-gh-command'
5
- import { git_gh_exec } from '#scripts/git/git-gh-exec'
4
+ import { git_gh_command } from '#scripts/gh/git-gh-command'
5
+ import { git_gh_exec } from '#scripts/gh/git-gh-exec'
6
6
  import { parse_json_array_or_undefined } from '#scripts/git/parse-json-array'
7
7
  import { issue_label_schema } from '#scripts/git/schemas'
8
8
  import { z } from 'zod'
@@ -160,7 +160,7 @@ async function main(argv: ReadonlyArray<string>): Promise<void> {
160
160
  process.exitCode = await run(argv)
161
161
  }
162
162
 
163
- const defect_rate_cli = { USAGE, read_days, search_path, measure_window, run, main }
163
+ const defect_rate_cli = { USAGE, read_days, search_path, measure_window, run }
164
164
 
165
165
  if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
166
166
 
@@ -1,5 +1,5 @@
1
- import { has_label_name, INTERRUPT_ROUTE_LABEL } from '#scripts/git/issue-labels'
2
1
  import { behavior_change_lint } from './behavior-change-lint'
2
+ import { has_label_name, INTERRUPT_ROUTE_LABEL } from './issue-labels'
3
3
  import { markdown_section } from './markdown-section'
4
4
 
5
5
  // The defect rate of merged work over a window (joshuafolkken/kit#2449): issues filed as defects
@@ -132,7 +132,6 @@ const defect_rate = {
132
132
  filed_query,
133
133
  format,
134
134
  is_above_baseline,
135
- is_behavior_change,
136
135
  is_defect,
137
136
  kind_of,
138
137
  measure,
@@ -1,12 +1,14 @@
1
- import { git_gh_command } from './git-gh-command'
1
+ import { git_gh_command } from '#scripts/gh/git-gh-command'
2
+ import { parse_json_array_safe } from '#scripts/git/parse-json-array'
3
+ import { open_issue_schema, type OpenIssueData } from '#scripts/git/schemas'
2
4
  import { has_any_label, NOT_DIRECTLY_RUNNABLE_LABELS } from './issue-labels'
3
- import { parse_json_array_safe } from './parse-json-array'
4
- import { open_issue_schema, type OpenIssueData } from './schemas'
5
+ import { issue_rank, type DependencyRow } from './issue-rank'
5
6
 
6
7
  // The next-issues display printed when a workflow completes (#821): up to five open issues in
7
8
  // priority order, so the user picks the next run from the completion output instead of opening the
8
9
  // issue list. Priority is recency — a newer issue usually encodes the most current understanding
9
- // of the backlog — with the label-based exclusions below.
10
+ // of the backlog — with the label-based exclusions below, under the ranking keys `issue-rank.ts`
11
+ // defines (joshuafolkken/kit#2928).
10
12
  //
11
13
  // `prioritize` is also the order `epicrun` picks up `auto-ok` issues in (joshuafolkken/kit#906).
12
14
  // The two ask one question — which open issue outside an epic is run next — so they share one
@@ -37,6 +39,34 @@ function compare_newest_first(first: OpenIssueData, second: OpenIssueData): numb
37
39
  return first.createdAt < second.createdAt ? 1 : -1
38
40
  }
39
41
 
42
+ // A row's blockers by number. **Lossy across repositories**: a blocker elsewhere sharing a number
43
+ // with a row here counts as one of its dependents. The listings this ranks are one repository's own,
44
+ // and `backlog:next` re-ranks its offer from the qualified graph (`backlog-rank.ts`), so the cost is a
45
+ // display row placed one slot off rather than a run started early.
46
+ function dependency_row(issue: OpenIssueData): DependencyRow {
47
+ return {
48
+ key: String(issue.number),
49
+ blockers: (issue.blockedBy?.nodes ?? []).map((blocker) => String(blocker.number)),
50
+ }
51
+ }
52
+
53
+ // Every candidate in rank order, uncapped. `backlog:next` takes this rather than `prioritize`, so the
54
+ // `run:solo` gate sees the whole ranking before anything is cut (joshuafolkken/kit#2928).
55
+ function order(
56
+ issues: ReadonlyArray<OpenIssueData>,
57
+ completed_issue_number?: number,
58
+ ): Array<OpenIssueData> {
59
+ const candidates = issues
60
+ .filter((issue) => is_candidate(issue, completed_issue_number))
61
+ .toSorted(compare_newest_first)
62
+ const dependents = issue_rank.count_dependents(candidates.map((issue) => dependency_row(issue)))
63
+
64
+ return issue_rank.rank(candidates, (issue) => ({
65
+ labels: (issue.labels ?? []).map((label) => label.name),
66
+ dependents: dependents.get(String(issue.number)) ?? 0,
67
+ }))
68
+ }
69
+
40
70
  // **This display deliberately does not drop a blocked issue, and the `auto-ok` pickup deliberately
41
71
  // does.** They share this ordering and differ on the set, which reads as an inconsistency and is not
42
72
  // one (joshuafolkken/kit#1005).
@@ -50,10 +80,7 @@ function prioritize(
50
80
  issues: ReadonlyArray<OpenIssueData>,
51
81
  completed_issue_number?: number,
52
82
  ): Array<OpenIssueData> {
53
- return issues
54
- .filter((issue) => is_candidate(issue, completed_issue_number))
55
- .toSorted(compare_newest_first)
56
- .slice(0, DISPLAY_LIMIT)
83
+ return order(issues, completed_issue_number).slice(0, DISPLAY_LIMIT)
57
84
  }
58
85
 
59
86
  // Empty input yields no lines at all — a bare header with nothing under it reads as an error.
@@ -90,6 +117,8 @@ async function fetch_next_issue_lines(completed_issue_number?: number): Promise<
90
117
  }
91
118
 
92
119
  const git_next_issues = {
120
+ DISPLAY_LIMIT,
121
+ order,
93
122
  prioritize,
94
123
  format_lines,
95
124
  fetch_next_issue_lines,
@@ -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 { parse_json_object_safe } from '#scripts/git/parse-json-array'
5
5
  import { z } from 'zod'
6
6
  import { issue_backlinks, type UpstreamEntry } from './issue-backlinks'
@@ -90,8 +90,4 @@ async function main(argv: ReadonlyArray<string>): Promise<void> {
90
90
  process.exitCode = await run(argv)
91
91
  }
92
92
 
93
- const issue_backlinks_cli = { run, USAGE }
94
-
95
93
  if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
96
-
97
- export { issue_backlinks_cli }
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env tsx
2
2
  import { fileURLToPath } from 'node:url'
3
3
  import { parseArgs } from 'node:util'
4
- import { git_gh_command } from '#scripts/git/git-gh-command'
5
- import type { IssueRead } from '#scripts/git/git-gh-issue-read'
4
+ import { git_gh_command } from '#scripts/gh/git-gh-command'
5
+ import type { IssueRead } from '#scripts/gh/git-gh-issue-read'
6
6
  import { bounded_pool } from '#scripts/lib/bounded-pool'
7
7
  import { z } from 'zod'
8
8
  import { issue_cite, type CiteTarget } from './issue-cite'
@@ -145,12 +145,8 @@ async function main(args: ReadonlyArray<string>): Promise<void> {
145
145
 
146
146
  const issue_cite_cli = {
147
147
  USAGE,
148
- main,
149
148
  parse_targets,
150
- parse_title,
151
- report,
152
149
  run,
153
- to_line,
154
150
  }
155
151
 
156
152
  if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
@@ -40,6 +40,23 @@ function citation_line(slug: string, number: string, summary: string): string {
40
40
  return `[#${number}](${issue_url(slug, number)})${SUMMARY_SEPARATOR}${summary}`
41
41
  }
42
42
 
43
+ // How a listing names one issue, given what it already holds (joshuafolkken/kit#2943). A progress
44
+ // command's output is copied into a report verbatim, so the line it prints is the citation the report
45
+ // carries: the full form when the title is in hand, the bare number-link when only the repository is,
46
+ // and the plain `#N` only when the repository could not be read at all.
47
+ type IssueCiter = (number: string) => string
48
+
49
+ function citer(slug: string | undefined, titles: ReadonlyMap<string, string>): IssueCiter {
50
+ return function cite(number: string): string {
51
+ if (slug === undefined) return `#${number}`
52
+ const title = titles.get(number)
53
+
54
+ return title === undefined
55
+ ? `[#${number}](${issue_url(slug, number)})`
56
+ : citation_line(slug, number, title)
57
+ }
58
+ }
59
+
43
60
  function qualified_target(token: string): CiteTarget | undefined {
44
61
  const match = REPO_QUALIFIED.exec(token)
45
62
  if (match === null) return undefined
@@ -88,15 +105,14 @@ function no_repo_line(target: CiteTarget): string {
88
105
  }
89
106
 
90
107
  const issue_cite = {
91
- SUMMARY_SEPARATOR,
92
108
  citation_line,
109
+ citer,
93
110
  issue_url,
94
- label,
95
111
  missing_line,
96
112
  no_repo_line,
97
113
  parse_target,
98
114
  unreadable_line,
99
115
  }
100
116
 
101
- export type { CiteTarget }
117
+ export type { CiteTarget, IssueCiter }
102
118
  export { issue_cite }
@@ -1,10 +1,5 @@
1
- import {
2
- BREAKING_CHANGE_LABEL,
3
- BUG_LABEL,
4
- ENHANCEMENT_LABEL,
5
- has_label_name,
6
- } from '#scripts/git/issue-labels'
7
1
  import { issue_bug_label } from './issue-bug-label'
2
+ import { BREAKING_CHANGE_LABEL, BUG_LABEL, ENHANCEMENT_LABEL, has_label_name } from './issue-labels'
8
3
  import { markdown_section } from './markdown-section'
9
4
 
10
5
  const FEATURE_DECLARATIONS = ['- 目的: 機能追加', '- 目的: 機能改善']
@@ -62,10 +57,7 @@ function problems(body: string): ReadonlyArray<string> {
62
57
  }
63
58
 
64
59
  const issue_classification = {
65
- BREAKING_DECLARATION,
66
60
  CLASSIFICATION_LABELS,
67
- FEATURE_DECLARATIONS,
68
- NON_BUG_DECLARATION,
69
61
  labels_for,
70
62
  problems,
71
63
  required_labels,
@@ -1,7 +1,7 @@
1
+ import { git_gh_api_path } from '#scripts/gh/git-gh-api-path'
2
+ import { git_gh_exec } from '#scripts/gh/git-gh-exec'
3
+ import { git_gh_repo } from '#scripts/gh/git-gh-repo'
1
4
  import { git_closes_keyword } from '#scripts/git/git-closes-keyword'
2
- import { git_gh_api_path } from '#scripts/git/git-gh-api-path'
3
- import { git_gh_exec } from '#scripts/git/git-gh-exec'
4
- import { git_gh_repo } from '#scripts/git/git-gh-repo'
5
5
  import { parse_json_object_safe } from '#scripts/git/parse-json-array'
6
6
  import { z } from 'zod'
7
7
 
@@ -88,6 +88,6 @@ async function read_closing_pr(issue: string): Promise<string | undefined> {
88
88
  }
89
89
  }
90
90
 
91
- const issue_closing_pr = { parse_references, pick_closing_pr, read_closing_pr }
91
+ const issue_closing_pr = { read_closing_pr }
92
92
 
93
93
  export { issue_closing_pr }
@@ -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 { cli_body } from '#scripts/josh/cli-body'
5
5
  import { error_text } from '#scripts/lib/error-message'
6
6
 
@@ -89,7 +89,7 @@ async function main(argv: ReadonlyArray<string>): Promise<void> {
89
89
  process.exitCode = await run(argv)
90
90
  }
91
91
 
92
- const issue_comment_cli = { USAGE, main, parse_request, run }
92
+ const issue_comment_cli = { USAGE, run }
93
93
 
94
94
  if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
95
95
 
@@ -3,10 +3,10 @@ import { readFile } from 'node:fs/promises'
3
3
  import { fileURLToPath } from 'node:url'
4
4
  import { repo_party } from '#scripts/discovery/repo-party'
5
5
  import { epic_bundle_cli } from '#scripts/epic/epic-bundle-cli'
6
- import { git_gh_command } from '#scripts/git/git-gh-command'
7
- import { git_gh_exec } from '#scripts/git/git-gh-exec'
8
- import { git_gh_issue_write } from '#scripts/git/git-gh-issue-write'
9
- import { github_issue_url } from '#scripts/git/github-issue-url'
6
+ import { git_gh_command } from '#scripts/gh/git-gh-command'
7
+ import { git_gh_exec } from '#scripts/gh/git-gh-exec'
8
+ import { git_gh_issue_write } from '#scripts/gh/git-gh-issue-write'
9
+ import { github_issue_url } from '#scripts/gh/github-issue-url'
10
10
  import { error_text } from '#scripts/lib/error-message'
11
11
  import { issue_file, type FileArguments } from './issue-file'
12
12
  import { issue_lint_cli } from './issue-lint-cli'
@@ -182,7 +182,7 @@ async function main(argv: ReadonlyArray<string>): Promise<void> {
182
182
  process.exitCode = await run(argv)
183
183
  }
184
184
 
185
- const issue_file_cli = { USAGE, THIRD_PARTY_MESSAGE, UNKNOWN_REPO_MESSAGE, run, main }
185
+ const issue_file_cli = { THIRD_PARTY_MESSAGE, run }
186
186
 
187
187
  if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
188
188
 
@@ -1,9 +1,9 @@
1
1
  import { parseArgs } from 'node:util'
2
2
  import { epic_issue } from '#scripts/epic/epic-issue'
3
- import { github_issue_url } from '#scripts/git/github-issue-url'
4
- import { DEPTH_LABEL_ORDER, FILING_ROUTE_LABELS, has_label_name } from '#scripts/git/issue-labels'
3
+ import { github_issue_url } from '#scripts/gh/github-issue-url'
5
4
  import { issue_backlinks } from './issue-backlinks'
6
5
  import { issue_classification } from './issue-classification'
6
+ import { DEPTH_LABEL_ORDER, FILING_ROUTE_LABELS, has_label_name } from './issue-labels'
7
7
  import { markdown_section } from './markdown-section'
8
8
 
9
9
  // The decisions behind `josh issue:file` (joshuafolkken/kit#2808), kept apart from the command that