@joshuafolkken/kit 1.1050.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 (581) 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 +19 -11
  4. package/.claude/skills/workflow-commands/background-commands.md +4 -3
  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 +1 -1
  8. package/.claude/skills/workflow-commands/backlogrun-steps.md +10 -10
  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 +3 -2
  16. package/.claude/skills/workflow-commands/halfrun.md +16 -19
  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 +1 -1
  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/prerequisite.md +1 -1
  25. package/.claude/skills/workflow-commands/prrun.md +36 -0
  26. package/.claude/skills/workflow-commands/retrospective.md +1 -1
  27. package/.claude/skills/workflow-commands/working-tree-hold.md +22 -2
  28. package/.codex/hooks.json +16 -20
  29. package/.github/actions/setup-pnpm/action.yml +93 -0
  30. package/.github/dependabot.yml +5 -1
  31. package/.github/workflows/ci.yml +26 -128
  32. package/.github/workflows/pr-classification.yml +5 -41
  33. package/.github/workflows/publish.yml +33 -38
  34. package/.github/workflows/sonar-qube.yml +37 -4
  35. package/AGENTS.md +12 -2
  36. package/CLAUDE.md +15 -16
  37. package/GEMINI.md +14 -2
  38. package/README.md +59 -18
  39. package/SECURITY.md +36 -6
  40. package/cspell/index.yaml +2 -1
  41. package/dist/CLAUDE.md +15 -16
  42. package/dist/config-merge/index.js +15 -3
  43. package/dist/hooks/batch-guard.js +4 -4
  44. package/dist/hooks/{chunk-HJIISEAC.js → chunk-3C4YCCEF.js} +5 -13
  45. package/dist/hooks/{chunk-EJDX2TOB.js → chunk-7ZPFAVR7.js} +7 -88
  46. package/dist/hooks/{chunk-WQ4OSBSS.js → chunk-E54KGFEQ.js} +2 -2
  47. package/dist/hooks/{chunk-GQ7KP45M.js → chunk-IL27YTPH.js} +2 -2
  48. package/dist/hooks/{chunk-DMQN45FN.js → chunk-KHWHKJOM.js} +3 -3
  49. package/dist/hooks/{chunk-5BK3K7V4.js → chunk-M2XDCUKD.js} +997 -478
  50. package/dist/hooks/{chunk-7VPDUBRN.js → chunk-NKOG3XAV.js} +150 -153
  51. package/dist/hooks/{chunk-NJQOBE6L.js → chunk-O4LL4HTI.js} +2 -7
  52. package/dist/hooks/{chunk-NAS4C7GP.js → chunk-OIZUHPJI.js} +2 -2
  53. package/dist/hooks/{chunk-RLDX5SOC.js → chunk-UD24EAIL.js} +2084 -1412
  54. package/dist/hooks/codex-hook-adapter.js +10 -11
  55. package/dist/hooks/duplicate-read-guard.js +5 -5
  56. package/dist/hooks/format-edited.js +2 -2
  57. package/dist/hooks/inputs.json +279 -0
  58. package/dist/hooks/investigation-guard.js +5 -5
  59. package/dist/hooks/pretool-guard.js +9 -9
  60. package/dist/hooks/session-lang.js +0 -1
  61. package/dist/hooks/stop-guard.js +178 -324
  62. package/dist/josh.js +162 -119
  63. package/dist/managed-marker/index.js +2 -1
  64. package/dist/version/index.js +34 -58
  65. package/eslint/rules/promise.js +5 -0
  66. package/package.json +9 -4
  67. package/prompts/collaboration-workflow/issue-citation.md +5 -5
  68. package/prompts/collaboration-workflow/operating-rules.md +4 -4
  69. package/prompts/collaboration-workflow/overview.md +13 -1
  70. package/prompts/collaboration-workflow/report-format.md +1 -1
  71. package/prompts/collaboration-workflow/residency.md +3 -3
  72. package/prompts/collaboration-workflow/rule-delivery.md +1 -1
  73. package/prompts/collaboration-workflow/turn-batching.md +3 -3
  74. package/prompts/collaboration-workflow/upstream-interrupt.md +1 -1
  75. package/prompts/collaboration-workflow/wip-cap.md +25 -22
  76. package/prompts/collaboration-workflow.md +5 -8
  77. package/prompts/review-rubric.md +1 -1
  78. package/prompts/review.md +3 -3
  79. package/prompts/sonar-hotspot-handling.md +11 -3
  80. package/prompts/testing-guide.md +3 -3
  81. package/scripts/adopt/adopt-toolkits.ts +0 -2
  82. package/scripts/adopt/adopt.ts +0 -2
  83. package/scripts/agent/agent-argv.ts +0 -2
  84. package/scripts/agent/agent-diagnostics.ts +1 -1
  85. package/scripts/agent/agent-role-profile.ts +0 -7
  86. package/scripts/agent/claude-agent-argv.ts +0 -2
  87. package/scripts/agent/codex-agent-argv.ts +1 -1
  88. package/scripts/agent/codex-hooks.ts +92 -0
  89. package/scripts/agent/interactive-ask.ts +1 -1
  90. package/scripts/auto-ok/auto-ok-cli.ts +6 -16
  91. package/scripts/backlog/backlog-budget.ts +0 -2
  92. package/scripts/backlog/backlog-defect-priority.ts +2 -2
  93. package/scripts/backlog/backlog-drive-cli.ts +10 -8
  94. package/scripts/backlog/backlog-drive-named-offer.ts +16 -3
  95. package/scripts/backlog/backlog-drive-named.ts +2 -1
  96. package/scripts/backlog/backlog-drive.ts +76 -16
  97. package/scripts/backlog/backlog-named.ts +0 -3
  98. package/scripts/backlog/backlog-next.ts +9 -15
  99. package/scripts/backlog/backlog-offer-cli.ts +0 -5
  100. package/scripts/backlog/backlog-plan-cli.ts +1 -7
  101. package/scripts/backlog/backlog-plan.ts +1 -1
  102. package/scripts/backlog/backlog-pool.ts +3 -6
  103. package/scripts/backlog/backlog-rank.ts +2 -2
  104. package/scripts/backlog/backlog-ready.ts +19 -3
  105. package/scripts/backlog/backlog-scope.ts +1 -3
  106. package/scripts/backlog/backlog-stalled-detect.ts +2 -2
  107. package/scripts/backlog/backlog-stalled.ts +0 -1
  108. package/scripts/backlog/backlog-waves.ts +5 -2
  109. package/scripts/behavior/behavior-cli.ts +1 -1
  110. package/scripts/build/build-codex-hooks.ts +26 -0
  111. package/scripts/build/build-hooks.ts +85 -9
  112. package/scripts/build/hook-bundle-stamp.ts +111 -0
  113. package/scripts/cases/cases-cli.ts +1 -1
  114. package/scripts/cases/cases-logic.ts +1 -1
  115. package/scripts/ci/composite-actions.ts +30 -0
  116. package/scripts/ci/pr-classification.ts +3 -3
  117. package/scripts/claude/workflow-destination.ts +10 -1
  118. package/scripts/clone/clone-fingerprint.ts +0 -1
  119. package/scripts/clone/clone-scan-cli.ts +1 -1
  120. package/scripts/clone/clone-scan.ts +1 -1
  121. package/scripts/config-merge/json-format.ts +0 -1
  122. package/scripts/config-merge/patch-yaml-list.ts +1 -1
  123. package/scripts/cost-runtime/codex-usage.ts +2 -9
  124. package/scripts/cost-runtime/cost-attribute.ts +0 -1
  125. package/scripts/cost-runtime/cost-cli.ts +0 -3
  126. package/scripts/cost-runtime/cost-corpus.ts +0 -2
  127. package/scripts/cost-runtime/cost-format.ts +0 -3
  128. package/scripts/cost-runtime/cost-pricing.ts +0 -1
  129. package/scripts/cost-runtime/cost-tokens.ts +0 -1
  130. package/scripts/delegation/delegation-cli.ts +1 -1
  131. package/scripts/delegation/delegation-policy.ts +0 -1
  132. package/scripts/delegation/duplicate-read-guard.ts +0 -8
  133. package/scripts/delegation/fanout-cli.ts +1 -1
  134. package/scripts/delegation/fanout.ts +0 -2
  135. package/scripts/delegation/investigation-reads.ts +1 -164
  136. package/scripts/discovery/repo-map-logic.ts +0 -1
  137. package/scripts/discovery/repo-party-cli.ts +1 -1
  138. package/scripts/doctor/doctor-consumer.ts +4 -6
  139. package/scripts/doctor/doctor-logic.ts +0 -4
  140. package/scripts/doctor/doctor.ts +14 -9
  141. package/scripts/document/document-byte-budget.ts +4 -5
  142. package/scripts/document/document-byte-check.ts +0 -1
  143. package/scripts/document/document-read-cli.ts +0 -2
  144. package/scripts/document/document-section-cli.ts +1 -1
  145. package/scripts/document/document-section.ts +0 -3
  146. package/scripts/document/edit-files-cli.ts +0 -1
  147. package/scripts/document/entry-read-budget.ts +10 -2
  148. package/scripts/document/lane-child-read-set.ts +1 -6
  149. package/scripts/document/read-files-cli.ts +0 -4
  150. package/scripts/document/read-set-cli.ts +0 -2
  151. package/scripts/document/read-set-point-of-use.ts +1 -0
  152. package/scripts/document/read-set-pricing.ts +0 -1
  153. package/scripts/document/read-set-trim.ts +1 -1
  154. package/scripts/epic/epic-add.ts +1 -1
  155. package/scripts/epic/epic-audit-cli.ts +1 -4
  156. package/scripts/epic/epic-audit-orphans.ts +1 -3
  157. package/scripts/epic/epic-audit-rationale.ts +0 -1
  158. package/scripts/epic/epic-audit-report.ts +0 -2
  159. package/scripts/epic/epic-audit.ts +5 -4
  160. package/scripts/epic/epic-bundle-cli.ts +1 -1
  161. package/scripts/epic/epic-bundle-evidence.ts +0 -1
  162. package/scripts/epic/epic-bundle-referenced.ts +1 -5
  163. package/scripts/epic/epic-bundle.ts +0 -4
  164. package/scripts/epic/epic-busy.ts +4 -5
  165. package/scripts/epic/epic-candidate-confirm.ts +0 -5
  166. package/scripts/epic/epic-classify.ts +2 -2
  167. package/scripts/epic/epic-cli-argv.ts +0 -1
  168. package/scripts/epic/epic-close-comment.ts +1 -1
  169. package/scripts/epic/epic-close.ts +5 -2
  170. package/scripts/epic/epic-cross-repo.ts +2 -4
  171. package/scripts/epic/epic-decision.ts +0 -1
  172. package/scripts/epic/epic-fetch.ts +2 -2
  173. package/scripts/epic/epic-index.ts +2 -3
  174. package/scripts/epic/epic-issue.ts +1 -15
  175. package/scripts/epic/epic-lane-offer.ts +9 -8
  176. package/scripts/epic/epic-nested.ts +1 -1
  177. package/scripts/epic/epic-next-read.ts +1 -3
  178. package/scripts/epic/epic-next-views.ts +0 -1
  179. package/scripts/epic/epic-next.ts +1 -10
  180. package/scripts/epic/epic-parse.ts +0 -1
  181. package/scripts/epic/epic-promote.ts +0 -9
  182. package/scripts/epic/epic-rank.ts +2 -2
  183. package/scripts/epic/epic-read.ts +1 -2
  184. package/scripts/epic/epic-reconcile.ts +1 -1
  185. package/scripts/epic/epic-reference.ts +1 -13
  186. package/scripts/epic/epic-relation-recheck.ts +1 -1
  187. package/scripts/epic/epic-relations.ts +1 -1
  188. package/scripts/epic/epic-remove.ts +1 -1
  189. package/scripts/epic/epic-report.ts +0 -1
  190. package/scripts/epic/epic-run.ts +2 -3
  191. package/scripts/epic/epic-shape.ts +1 -1
  192. package/scripts/epic/epic-solo-stale.ts +107 -0
  193. package/scripts/epic/epic-solo.ts +3 -2
  194. package/scripts/epic/epic-triage.ts +1 -1
  195. package/scripts/epic/epic-validate.ts +1 -1
  196. package/scripts/epic/epic.ts +1 -1
  197. package/scripts/exports/unused-members-cli.ts +53 -0
  198. package/scripts/{git → followup}/followup-issue-number.ts +1 -6
  199. package/scripts/{git → followup}/git-followup-cleanup.ts +2 -1
  200. package/scripts/{git → followup}/git-followup-finish.ts +1 -3
  201. package/scripts/{git → followup}/git-followup-flush.ts +2 -2
  202. package/scripts/{git → followup}/git-followup-issue-close.ts +2 -2
  203. package/scripts/{git → followup}/git-followup-label.ts +4 -4
  204. package/scripts/followup/git-followup-merged.ts +112 -0
  205. package/scripts/{git → followup}/git-followup-pending.ts +1 -1
  206. package/scripts/{git → followup}/git-followup-workflow.ts +19 -11
  207. package/scripts/{git → followup}/git-pr-followup-wrapup.ts +9 -3
  208. package/scripts/{git → followup}/git-pr-followup.ts +53 -16
  209. package/scripts/gate/core-budget.ts +3 -9
  210. package/scripts/gate/gate-plan.ts +7 -4
  211. package/scripts/gate/gate-report.ts +0 -6
  212. package/scripts/gate/gate-tree.ts +1 -1
  213. package/scripts/gate/pre-commit-type-check.ts +0 -6
  214. package/scripts/gate/project-checks.ts +7 -8
  215. package/scripts/gate/scoped-green.ts +0 -1
  216. package/scripts/gate/type-check-step.ts +1 -1
  217. package/scripts/gate/verification-gate.ts +0 -2
  218. package/scripts/gh/fix-gh-packages.ts +15 -12
  219. package/scripts/gh/gh-spawn.ts +2 -2
  220. package/scripts/{git → gh}/git-ai-review-scan.ts +1 -5
  221. package/scripts/{git → gh}/git-gh-check.ts +2 -1
  222. package/scripts/{git → gh}/git-gh-exec.ts +1 -1
  223. package/scripts/{git → gh}/git-gh-failure.ts +1 -1
  224. package/scripts/{git → gh}/git-gh-helpers.ts +0 -1
  225. package/scripts/{git → gh}/git-gh-issue-list.ts +2 -0
  226. package/scripts/{git → gh}/git-gh-issue-read.ts +1 -1
  227. package/scripts/{git → gh}/git-gh-issue-rest.ts +6 -3
  228. package/scripts/{git → gh}/git-gh-pr-read.ts +24 -0
  229. package/scripts/{git → gh}/git-gh-pr-rest.ts +5 -2
  230. package/scripts/{git → gh}/git-gh-pr-review.ts +2 -2
  231. package/scripts/{git → gh}/git-gh-pr-rollup.ts +1 -3
  232. package/scripts/{git → gh}/git-gh-pr.ts +3 -1
  233. package/scripts/{git → gh}/git-pr-ai-review.ts +2 -5
  234. package/scripts/{git → gh}/git-pr-checks-eval.ts +0 -10
  235. package/scripts/{git → gh}/git-pr-checks-parse.ts +4 -20
  236. package/scripts/{git → gh}/git-pr-checks.ts +2 -1
  237. package/scripts/{git → gh}/git-pr-coderabbit.ts +2 -5
  238. package/scripts/{git → gh}/git-pr-confirmation.ts +1 -3
  239. package/scripts/{git → gh}/git-pr-managed-config.ts +2 -3
  240. package/scripts/{git → gh}/git-pr.ts +3 -3
  241. package/scripts/git/changed-file-scope.ts +0 -1
  242. package/scripts/git/git-branch.ts +3 -6
  243. package/scripts/git/git-commit.ts +1 -1
  244. package/scripts/git/git-common-directory.ts +80 -24
  245. package/scripts/git/git-error.ts +66 -9
  246. package/scripts/git/git-issue.ts +1 -1
  247. package/scripts/git/git-preflight.ts +2 -2
  248. package/scripts/git/git-prompt.ts +6 -31
  249. package/scripts/git/git-push.ts +1 -1
  250. package/scripts/git/git-staging.ts +1 -0
  251. package/scripts/git/git-status.ts +1 -1
  252. package/scripts/git/git-workflow.ts +1 -1
  253. package/scripts/git/gone-branch.ts +1 -0
  254. package/scripts/git/listing-cutoff.ts +1 -1
  255. package/scripts/git/main-merge.ts +1 -1
  256. package/scripts/git/main-sync.ts +19 -1
  257. package/scripts/git/parse-json-array.ts +0 -3
  258. package/scripts/git/repository-lock.ts +16 -16
  259. package/scripts/git/{git-stash.ts → stash/git-stash.ts} +1 -1
  260. package/scripts/git/{stash-pop-args.ts → stash/stash-pop-args.ts} +1 -1
  261. package/scripts/git/{stash-pop-cli.ts → stash/stash-pop-cli.ts} +0 -1
  262. package/scripts/git/{stash-sweep-lock.ts → stash/stash-sweep-lock.ts} +3 -3
  263. package/scripts/hooks/codex-hook-adapter.ts +0 -1
  264. package/scripts/hooks/edited-cspell.ts +1 -1
  265. package/scripts/hooks/format-edited-file.ts +2 -0
  266. package/scripts/hooks/pre-push-unit.ts +0 -4
  267. package/scripts/hooks/pretool-guard.ts +22 -4
  268. package/scripts/hooks/reserved-run.ts +1 -1
  269. package/scripts/hooks/step-zero-notice.ts +76 -0
  270. package/scripts/hooks/stop-guard.ts +47 -21
  271. package/scripts/init/claude-plugin-config.ts +4 -5
  272. package/scripts/init/hook-command-rewrite.ts +16 -8
  273. package/scripts/init/hook-launch.ts +41 -15
  274. package/scripts/init/init-basic.ts +2 -5
  275. package/scripts/init/init-logic.ts +7 -0
  276. package/scripts/init/init.ts +0 -3
  277. package/scripts/init/project-profile.ts +6 -11
  278. package/scripts/init/start-exec.ts +1 -1
  279. package/scripts/init/start-setup-pr.ts +6 -6
  280. package/scripts/init/start-steps.ts +1 -0
  281. package/scripts/issue/behavior-change-lint.ts +0 -1
  282. package/scripts/issue/defect-rate-cli.ts +3 -3
  283. package/scripts/issue/defect-rate.ts +1 -2
  284. package/scripts/{git → issue}/git-next-issues.ts +3 -3
  285. package/scripts/issue/issue-backlinks-cli.ts +1 -5
  286. package/scripts/issue/issue-cite-cli.ts +2 -6
  287. package/scripts/issue/issue-cite.ts +0 -2
  288. package/scripts/issue/issue-classification.ts +1 -9
  289. package/scripts/issue/issue-closing-pr.ts +4 -4
  290. package/scripts/issue/issue-comment-cli.ts +2 -2
  291. package/scripts/issue/issue-file-cli.ts +5 -5
  292. package/scripts/issue/issue-file.ts +2 -2
  293. package/scripts/issue/issue-fold-cli.ts +1 -1
  294. package/scripts/issue/issue-fold-existing-cli.ts +1 -1
  295. package/scripts/{git → issue}/issue-labels.ts +8 -0
  296. package/scripts/issue/issue-lint-cli.ts +1 -1
  297. package/scripts/issue/issue-merged.ts +2 -2
  298. package/scripts/{git → issue}/issue-rank.ts +1 -1
  299. package/scripts/issue/issue-read-cli.ts +8 -47
  300. package/scripts/issue/issue-read.ts +0 -2
  301. package/scripts/issue/issue-report-failures.ts +80 -0
  302. package/scripts/issue/issue-scout-cli.ts +1 -7
  303. package/scripts/issue/issue-scout-closed.ts +2 -2
  304. package/scripts/issue/issue-scout.ts +0 -2
  305. package/scripts/issue/issue-state-cli.ts +5 -46
  306. package/scripts/issue/issue-state.ts +1 -5
  307. package/scripts/issue/markdown-section.ts +1 -1
  308. package/scripts/issue/measure-rerun-cli.ts +1 -1
  309. package/scripts/issue/reproduction-measure.ts +1 -1
  310. package/scripts/josh/cli-body.ts +1 -1
  311. package/scripts/josh/file-map-stamp.ts +0 -3
  312. package/scripts/josh/josh-command-map.ts +2 -0
  313. package/scripts/josh/josh-commands-ai.ts +9 -102
  314. package/scripts/josh/josh-commands-backlog.ts +5 -1
  315. package/scripts/josh/josh-commands-development.ts +8 -1
  316. package/scripts/josh/josh-commands-issue.ts +2 -2
  317. package/scripts/josh/josh-commands-maintenance.ts +7 -0
  318. package/scripts/josh/josh-commands-project.ts +6 -0
  319. package/scripts/josh/josh-commands-run.ts +114 -0
  320. package/scripts/josh/josh-commands-versioning.ts +8 -0
  321. package/scripts/josh/josh-commands-workflow.ts +2 -2
  322. package/scripts/josh/path-decision.ts +0 -3
  323. package/scripts/josh/process-owner.ts +16 -0
  324. package/scripts/josh/session-language-cli.ts +0 -1
  325. package/scripts/lane/lane-await.ts +3 -6
  326. package/scripts/lane/lane-capacity.ts +6 -3
  327. package/scripts/lane/lane-child-invocation.ts +20 -7
  328. package/scripts/lane/lane-cli.ts +1 -4
  329. package/scripts/lane/lane-close.ts +1 -3
  330. package/scripts/lane/lane-dispatch.ts +3 -4
  331. package/scripts/lane/lane-environment.ts +0 -9
  332. package/scripts/lane/lane-handoff.ts +38 -0
  333. package/scripts/lane/lane-launch-cli.ts +21 -11
  334. package/scripts/lane/lane-open.ts +0 -3
  335. package/scripts/lane/lane-output.ts +0 -1
  336. package/scripts/lane/lane-registry.ts +9 -0
  337. package/scripts/lane/openai-lane-ship.ts +2 -0
  338. package/scripts/lane/openai-lane-supervisor-decision.ts +2 -1
  339. package/scripts/lane/openai-lane-supervisor.ts +6 -4
  340. package/scripts/lane/openai-review-broker.ts +3 -0
  341. package/scripts/lib/bounded-pool.ts +1 -0
  342. package/scripts/lib/json-value.ts +5 -4
  343. package/scripts/lib/poll.ts +3 -1
  344. package/scripts/lib/timed-fetch.ts +15 -0
  345. package/scripts/lib/timeouts.ts +13 -0
  346. package/scripts/{yaml → lib}/yaml-document.ts +3 -1
  347. package/scripts/{bytes → lines}/bytes-command.ts +0 -2
  348. package/scripts/lines/lines-command.ts +0 -1
  349. package/scripts/lint/lint-related-scope.ts +0 -1
  350. package/scripts/lint/lint-related.ts +1 -1
  351. package/scripts/{git → notify}/telegram-notify.ts +2 -2
  352. package/scripts/{git → notify}/telegram-test.ts +4 -4
  353. package/scripts/observations/observation-ledger-home.ts +0 -1
  354. package/scripts/observations/observation-ledger-line.ts +0 -1
  355. package/scripts/observations/observation-ledger-migrate.ts +1 -1
  356. package/scripts/observations/observations-flush-landing.ts +3 -3
  357. package/scripts/observations/observations-flush.ts +2 -2
  358. package/scripts/overrides/lockfile-overrides.ts +1 -1
  359. package/scripts/overrides/overrides-logic.ts +1 -1
  360. package/scripts/package/package-scout-cli.ts +2 -7
  361. package/scripts/package/package-scout.ts +0 -2
  362. package/scripts/propagate/propagate-git-failure.ts +0 -1
  363. package/scripts/propagate/propagate-git.ts +0 -2
  364. package/scripts/propagate/propagate-publish.ts +2 -3
  365. package/scripts/propagate/propagate-run.ts +0 -2
  366. package/scripts/propagate/propagate-steps.ts +3 -5
  367. package/scripts/propagate/propagate-targets.ts +0 -4
  368. package/scripts/propagate/propagate.ts +0 -4
  369. package/scripts/refactor/import-graph.ts +0 -1
  370. package/scripts/refactor/refactor-lint.ts +0 -2
  371. package/scripts/refactor/refactor-scan.ts +0 -1
  372. package/scripts/refactor/refactor-targets.ts +0 -1
  373. package/scripts/registry-migration/migrate-logic.ts +0 -2
  374. package/scripts/registry-migration/migrate.ts +19 -9
  375. package/scripts/release/github-release-cli.ts +8 -6
  376. package/scripts/release/github-release-environment.ts +46 -0
  377. package/scripts/release/github-release.ts +151 -94
  378. package/scripts/release/release-history.ts +0 -1
  379. package/scripts/release/release-plan.ts +0 -1
  380. package/scripts/release/release-publish.ts +2 -3
  381. package/scripts/release/release-scope-cli.ts +1 -2
  382. package/scripts/release/release-tag.ts +2 -4
  383. package/scripts/repo/auto-merge-setting-logic.ts +1 -4
  384. package/scripts/repo/repo-setting.ts +1 -1
  385. package/scripts/repo/repository-labels.ts +3 -3
  386. package/scripts/repo/required-checks-logic.ts +206 -0
  387. package/scripts/repo/required-checks-report.ts +71 -0
  388. package/scripts/repo/ruleset-check-cli.ts +53 -0
  389. package/scripts/repo/ruleset-check.ts +147 -0
  390. package/scripts/report/report-lint-cli.ts +0 -4
  391. package/scripts/review/disposition-cli.ts +1 -1
  392. package/scripts/review/live-evidence.ts +1 -1
  393. package/scripts/review/review-attest-cli.ts +0 -6
  394. package/scripts/review/review-attest.ts +4 -16
  395. package/scripts/review/review-brief-cli.ts +23 -6
  396. package/scripts/review/review-brief.ts +21 -8
  397. package/scripts/review/review-diff-parts.ts +89 -0
  398. package/scripts/review/review-diff-write.ts +97 -0
  399. package/scripts/review/review-finding-ledger.ts +0 -1
  400. package/scripts/review/review-record-cli.ts +1 -1
  401. package/scripts/review/review-record.ts +0 -1
  402. package/scripts/review/review-round2-cli.ts +1 -1
  403. package/scripts/review/review-stamps.ts +0 -3
  404. package/scripts/review/review-tree.ts +14 -2
  405. package/scripts/rules/decision-oracle-stage.ts +18 -0
  406. package/scripts/rules/decision-oracle.ts +10 -7
  407. package/scripts/rules/delivered-rules.ts +9 -1
  408. package/scripts/rules/destructive-command.ts +119 -0
  409. package/scripts/rules/direct-filing.ts +1 -1
  410. package/scripts/rules/file-body.ts +0 -3
  411. package/scripts/rules/filing-cap.ts +0 -2
  412. package/scripts/rules/gh-api.ts +7 -2
  413. package/scripts/rules/git-argv.ts +18 -7
  414. package/scripts/rules/git-force.ts +0 -2
  415. package/scripts/rules/implementation-cut.ts +0 -1
  416. package/scripts/rules/index-guard.ts +71 -0
  417. package/scripts/rules/issue-citation.ts +50 -25
  418. package/scripts/rules/lane-background.ts +15 -7
  419. package/scripts/rules/lane-park.ts +13 -6
  420. package/scripts/rules/last-prompt.ts +1 -0
  421. package/scripts/rules/oracle-consulted.ts +1 -1
  422. package/scripts/rules/oracle-firing.ts +1 -0
  423. package/scripts/rules/oracle-list-cli.ts +0 -3
  424. package/scripts/rules/permission-guards.ts +14 -0
  425. package/scripts/rules/protected-files.ts +74 -0
  426. package/scripts/rules/reply-language.ts +1 -1
  427. package/scripts/rules/rule-body-guard.ts +0 -3
  428. package/scripts/rules/rule-value-cli.ts +0 -1
  429. package/scripts/rules/shell-body-trigger.ts +0 -1
  430. package/scripts/rules/shell-segments.ts +0 -1
  431. package/scripts/rules/stop-rules.ts +13 -5
  432. package/scripts/rules/tail-commands.ts +1 -1
  433. package/scripts/rules/test-declared-commit.ts +1 -1
  434. package/scripts/rules/third-party-write.ts +0 -1
  435. package/scripts/rules/worktree-guard.ts +26 -9
  436. package/scripts/run/run-carry-cli.ts +0 -2
  437. package/scripts/run/run-carry-stash.ts +2 -2
  438. package/scripts/run/run-carry-streak.ts +1 -1
  439. package/scripts/run/run-cut-cli.ts +0 -7
  440. package/scripts/run/run-cut.ts +8 -54
  441. package/scripts/run/run-ending-cli.ts +1 -1
  442. package/scripts/run/run-ending.ts +1 -4
  443. package/scripts/run/run-entry-cli.ts +101 -24
  444. package/scripts/run/run-entry.ts +0 -1
  445. package/scripts/run/run-event-cli.ts +0 -2
  446. package/scripts/run/run-event-follow.ts +1 -0
  447. package/scripts/run/run-event-render.ts +1 -1
  448. package/scripts/run/run-event-scope.ts +53 -4
  449. package/scripts/run/run-event-stream.ts +0 -3
  450. package/scripts/run/run-event-watch.ts +1 -0
  451. package/scripts/run/run-halfrun-resume.ts +20 -7
  452. package/scripts/run/run-headless.ts +2 -2
  453. package/scripts/run/run-hold-cli.ts +33 -10
  454. package/scripts/run/run-hold.ts +25 -5
  455. package/scripts/run/run-issue-number.ts +1 -1
  456. package/scripts/run/run-liveness-cli.ts +1 -1
  457. package/scripts/run/run-liveness.ts +2 -3
  458. package/scripts/run/run-merge-cli.ts +5 -13
  459. package/scripts/run/run-merge-steps.ts +5 -5
  460. package/scripts/run/run-merge.ts +1 -1
  461. package/scripts/run/run-next-cli.ts +1 -1
  462. package/scripts/run/run-parent-cut-hook.ts +0 -1
  463. package/scripts/run/run-preflight.ts +2 -9
  464. package/scripts/run/run-prep-cli.ts +2 -2
  465. package/scripts/run/run-prep-locate.ts +1 -1
  466. package/scripts/run/run-progress-cli.ts +4 -7
  467. package/scripts/run/run-progress-clock.ts +6 -34
  468. package/scripts/run/run-progress-config.ts +0 -4
  469. package/scripts/run/run-progress-read.ts +1 -2
  470. package/scripts/run/run-progress.ts +1 -2
  471. package/scripts/run/run-prrun-resume.ts +117 -0
  472. package/scripts/run/run-report-cli.ts +1 -2
  473. package/scripts/run/run-report.ts +0 -1
  474. package/scripts/run/run-retrospective.ts +1 -1
  475. package/scripts/run/run-review-cli.ts +0 -3
  476. package/scripts/run/run-review-steps.ts +2 -0
  477. package/scripts/run/run-review.ts +0 -2
  478. package/scripts/run/run-ship-cli.ts +21 -3
  479. package/scripts/run/run-ship-detach.ts +1 -0
  480. package/scripts/run/run-ship-next.ts +106 -0
  481. package/scripts/run/run-ship-preflight.ts +1 -1
  482. package/scripts/run/run-ship-return.ts +8 -3
  483. package/scripts/run/run-ship-review-steps.ts +18 -4
  484. package/scripts/run/run-ship-review.ts +11 -0
  485. package/scripts/run/run-ship-scoped.ts +1 -0
  486. package/scripts/run/run-ship-steps.ts +1 -1
  487. package/scripts/run/run-ship.ts +0 -1
  488. package/scripts/run/run-stage-read.ts +62 -0
  489. package/scripts/run/run-stage.ts +160 -0
  490. package/scripts/run/run-status-cli.ts +1 -1
  491. package/scripts/run/run-step-cli.ts +21 -14
  492. package/scripts/run/run-step.ts +1 -1
  493. package/scripts/run/run-stop-notify.ts +1 -3
  494. package/scripts/run/run-stranded-cli.ts +0 -4
  495. package/scripts/run/run-stranded-detect.ts +2 -2
  496. package/scripts/run/run-tail-cli.ts +17 -11
  497. package/scripts/run/run-tail.ts +2 -0
  498. package/scripts/run/run-tidy-lanes.ts +2 -1
  499. package/scripts/run/run-tidy-stashes.ts +12 -12
  500. package/scripts/run/run-wake-cli.ts +2 -3
  501. package/scripts/run/run-wake-loop.ts +2 -2
  502. package/scripts/run/run-wake.ts +2 -4
  503. package/scripts/run/run-watcher-guard-cli.ts +0 -4
  504. package/scripts/run/run-watcher-guard.ts +9 -7
  505. package/scripts/run/run-watcher-hook.ts +1 -1
  506. package/scripts/safe-chain/ci-installer-pin.ts +11 -5
  507. package/scripts/safe-chain/project-config.ts +1 -1
  508. package/scripts/security/security-audit-provision-logic.ts +0 -1
  509. package/scripts/security/security-audit-provision.ts +3 -2
  510. package/scripts/security/security-audit.ts +0 -1
  511. package/scripts/security/security-updates-logic.ts +0 -1
  512. package/scripts/sonar/sonar-hotspots-cli.ts +10 -52
  513. package/scripts/sonar/sonar-hotspots.ts +0 -1
  514. package/scripts/sonar/sonar-new-code-cli.ts +150 -0
  515. package/scripts/sonar/sonar-new-code.ts +79 -0
  516. package/scripts/sonar/sonar-project.ts +97 -0
  517. package/scripts/split/split-assess-cli.ts +1 -1
  518. package/scripts/split/split-assess.ts +2 -5
  519. package/scripts/sync/managed-config-scope-cli.ts +1 -1
  520. package/scripts/sync/skill-migration.ts +0 -1
  521. package/scripts/sync/sync-hook-safety.ts +2 -3
  522. package/scripts/sync/sync.ts +1 -8
  523. package/scripts/sync/template-source-logic.ts +0 -1
  524. package/scripts/sync/workflow-pin-logic.ts +16 -28
  525. package/scripts/test/test-declared-logic.ts +0 -1
  526. package/scripts/test/test-declared.ts +0 -2
  527. package/scripts/test/test-red-commit.ts +2 -2
  528. package/scripts/test/test-red.ts +14 -7
  529. package/scripts/test/test-type-logic.ts +1 -1
  530. package/scripts/test/unit-worker-share.ts +7 -16
  531. package/scripts/time-runtime/time-batch-guard.ts +1 -2
  532. package/scripts/time-runtime/time-bundle-call.ts +0 -1
  533. package/scripts/time-runtime/time-bundles.ts +0 -4
  534. package/scripts/time-runtime/time-density-hook.ts +0 -2
  535. package/scripts/time-runtime/time-followup-stage.ts +1 -1
  536. package/scripts/time-runtime/time-format.ts +0 -73
  537. package/scripts/time-runtime/time-round-trips.ts +0 -4
  538. package/scripts/time-runtime/time-single-check.ts +1 -1
  539. package/scripts/time-runtime/time-spans.ts +1 -1
  540. package/scripts/time-runtime/time-transcript-line.ts +1 -2
  541. package/scripts/ui/ui-routes-cli.ts +0 -5
  542. package/scripts/ui/ui-routes.ts +0 -5
  543. package/scripts/version/effective-upstream.ts +2 -2
  544. package/scripts/version/latest-corepack.ts +7 -9
  545. package/scripts/version/latest-scope-cli.ts +0 -2
  546. package/scripts/version/latest-update.ts +0 -2
  547. package/scripts/version/npm-registry.ts +2 -2
  548. package/scripts/version/publishable-range-check.ts +1 -1
  549. package/scripts/version/release-hold.ts +0 -4
  550. package/scripts/version/running-binary.ts +2 -2
  551. package/scripts/version/version-check-logic.ts +0 -2
  552. package/scripts/version/version-remote.ts +3 -3
  553. package/scripts/version/version-targets.ts +4 -4
  554. package/templates/sonar-project.properties +28 -1
  555. package/templates/workflows/dependabot-auto-merge.yml +5 -3
  556. package/templates/workflows/github-release.yml +81 -0
  557. package/prompts/collaboration-workflow/cross-repo-epic.md +0 -5
  558. package/prompts/collaboration-workflow/epic-audit.md +0 -5
  559. package/prompts/collaboration-workflow/epic-bundle.md +0 -5
  560. package/scripts/init/plugin-install-hint.ts +0 -47
  561. package/scripts/version/parse-json.ts +0 -13
  562. /package/scripts/{git → followup}/git-followup-stages.ts +0 -0
  563. /package/scripts/{git → gh}/git-gh-api-path.ts +0 -0
  564. /package/scripts/{git → gh}/git-gh-command.ts +0 -0
  565. /package/scripts/{git → gh}/git-gh-issue-write.ts +0 -0
  566. /package/scripts/{git → gh}/git-gh-issue.ts +0 -0
  567. /package/scripts/{git → gh}/git-gh-pr-auto-merge.ts +0 -0
  568. /package/scripts/{git → gh}/git-gh-pr-snapshot.ts +0 -0
  569. /package/scripts/{git → gh}/git-gh-reachability.ts +0 -0
  570. /package/scripts/{git → gh}/git-gh-repo.ts +0 -0
  571. /package/scripts/{git → gh}/git-gh-rest-state.ts +0 -0
  572. /package/scripts/{git → gh}/git-pr-checks-watch.ts +0 -0
  573. /package/scripts/{git → gh}/git-pr-error.ts +0 -0
  574. /package/scripts/{git → gh}/git-pr-messages.ts +0 -0
  575. /package/scripts/{git → gh}/github-issue-url.ts +0 -0
  576. /package/scripts/git/{stash-orphans.ts → stash/stash-orphans.ts} +0 -0
  577. /package/scripts/{git → issue}/issue-reference.ts +0 -0
  578. /package/scripts/{git → lib}/animation-helpers.ts +0 -0
  579. /package/scripts/{git → lib}/git-animation.ts +0 -0
  580. /package/scripts/{git → notify}/git-notify.ts +0 -0
  581. /package/scripts/{git → notify}/telegram-test-logic.ts +0 -0
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env tsx
2
2
  import { fileURLToPath } from 'node:url'
3
- import { git_gh_command } from '#scripts/git/git-gh-command'
3
+ import { git_gh_command } from '#scripts/gh/git-gh-command'
4
4
  import { 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))
@@ -105,11 +105,9 @@ function no_repo_line(target: CiteTarget): string {
105
105
  }
106
106
 
107
107
  const issue_cite = {
108
- SUMMARY_SEPARATOR,
109
108
  citation_line,
110
109
  citer,
111
110
  issue_url,
112
- label,
113
111
  missing_line,
114
112
  no_repo_line,
115
113
  parse_target,
@@ -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
@@ -90,7 +90,7 @@ async function main(argv: ReadonlyArray<string>): Promise<void> {
90
90
  process.exitCode = await run(argv)
91
91
  }
92
92
 
93
- const issue_fold_cli = { JSON_KEY, USAGE, REASONS, read_arguments, size_verdict, run, main }
93
+ const issue_fold_cli = { read_arguments, size_verdict, run }
94
94
 
95
95
  if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
96
96
 
@@ -74,7 +74,7 @@ async function main(argv: ReadonlyArray<string>): Promise<void> {
74
74
  process.exitCode = await run(argv)
75
75
  }
76
76
 
77
- const issue_fold_existing_cli = { run, main, USAGE }
77
+ const issue_fold_existing_cli = { run }
78
78
 
79
79
  if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
80
80
 
@@ -6,6 +6,11 @@ const BUG_LABEL = 'bug'
6
6
  const ENHANCEMENT_LABEL = 'enhancement'
7
7
  const BREAKING_CHANGE_LABEL = 'breaking-change'
8
8
  const IN_PROGRESS_LABEL = 'in-progress'
9
+ // Applied by `kickoff` once its plan is on the issue, so the next command's `run:entry` reads the issue
10
+ // as planned and starts at the implementation rather than planning again (joshuafolkken/kit#3042).
11
+ // Namespaced like `run:solo`: a bare `planned` is a common roadmap label a person may already apply,
12
+ // and reading one as kickoff's mark would skip the planning that never happened.
13
+ const PLANNED_LABEL = 'run:planned'
9
14
  // Parks a child that cannot advance without a person deciding something. `epic:next` is what reads
10
15
  // it: a parked child is why a run reports "nothing left that time will fix" rather than waiting
11
16
  // forever (joshuafolkken/kit#860).
@@ -207,6 +212,7 @@ const WORKFLOW_LABELS: ReadonlyArray<LabelDefinition> = [
207
212
  description: 'Tracks a batch of child issues from one split',
208
213
  },
209
214
  { name: IN_PROGRESS_LABEL, color: '0075ca', description: 'Work is actively in progress' },
215
+ { name: PLANNED_LABEL, color: 'c2e0c6', description: 'kickoff posted the plan' },
210
216
  {
211
217
  name: RUN_SOLO_LABEL,
212
218
  color: 'b60205',
@@ -328,6 +334,7 @@ const ALL_LABELS: ReadonlySet<string> = new Set([
328
334
  ENHANCEMENT_LABEL,
329
335
  BREAKING_CHANGE_LABEL,
330
336
  IN_PROGRESS_LABEL,
337
+ PLANNED_LABEL,
331
338
  NEEDS_DECISION_LABEL,
332
339
  AUTO_OK_LABEL,
333
340
  NEEDS_HUMAN_REVIEW_LABEL,
@@ -375,6 +382,7 @@ export {
375
382
  NEEDS_HUMAN_REVIEW_LABEL,
376
383
  NOT_DIRECTLY_RUNNABLE_LABELS,
377
384
  OTHER_CHANGE_LABEL,
385
+ PLANNED_LABEL,
378
386
  PRIORITY_HIGH_LABEL,
379
387
  RELEASE_CLASSIFICATION_LABELS,
380
388
  RELEASE_CLASSIFICATION_NAMES,
@@ -58,7 +58,7 @@ async function main(argv: ReadonlyArray<string>): Promise<void> {
58
58
  process.exitCode = await run(argv[0])
59
59
  }
60
60
 
61
- const issue_lint_cli = { problems, run, OK_MESSAGE, USAGE }
61
+ const issue_lint_cli = { problems, run }
62
62
 
63
63
  const ARGV_OFFSET = 2
64
64
 
@@ -1,5 +1,5 @@
1
- import { git_gh_api_path } from '#scripts/git/git-gh-api-path'
2
- import { git_gh_exec } from '#scripts/git/git-gh-exec'
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
3
 
4
4
  // Whether an issue was closed by a merge, read from its REST timeline (joshuafolkken/kit#2701). The
5
5
  // issue's own `state_reason` cannot tell: a pull request's `closes #N` and a person's "Close as
@@ -83,7 +83,7 @@ function rank<T>(items: ReadonlyArray<T>, row_of: (item: T) => RankRow): Array<T
83
83
  .map((entry) => entry.item)
84
84
  }
85
85
 
86
- const issue_rank = { compare, count_dependents, is_priority, is_verification_defect, rank }
86
+ const issue_rank = { count_dependents, rank }
87
87
 
88
88
  export { issue_rank }
89
89
  export type { DependencyRow, RankRow }
@@ -1,8 +1,9 @@
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 { bounded_pool } from '#scripts/lib/bounded-pool'
5
5
  import { issue_read, type IssueComment, type IssueFields } from './issue-read'
6
+ import { issue_report_failures, type ReadFailureKind } from './issue-report-failures'
6
7
 
7
8
  // `josh issue:read <N> [<N> ...]` — the body *and* the comments of every issue named, in one call
8
9
  // (joshuafolkken/kit#1715).
@@ -25,7 +26,6 @@ import { issue_read, type IssueComment, type IssueFields } from './issue-read'
25
26
  // "no comments" — the block says which of the two it holds, because §2g's rule is that the later text
26
27
  // wins, and a comment nobody read cannot win anything.
27
28
 
28
- const SUCCESS_EXIT_CODE = 0
29
29
  const FAILURE_EXIT_CODE = 1
30
30
  const ARGV_OFFSET = 2
31
31
  const ISSUE_NUMBER_PATTERN = /^[1-9]\d*$/u
@@ -35,8 +35,7 @@ const BLOCK_SEPARATOR = '\n\n---\n\n'
35
35
  // process, and an unbounded fan-out is answered with secondary rate limiting rather than with issues.
36
36
  const READ_CONCURRENCY = 8
37
37
  const ISSUE_FIELDS = 'title,state,body'
38
-
39
- type ReadFailureKind = 'missing' | 'unreadable'
38
+ const FAILURE_TERMS = { success_kind: 'issue', misreading: 'the issue is empty' } as const
40
39
 
41
40
  interface IssueContent {
42
41
  fields: IssueFields
@@ -69,16 +68,6 @@ function parse_numbers(argv: ReadonlyArray<string>): ReadonlyArray<string> | und
69
68
  return [...new Set(numbers)]
70
69
  }
71
70
 
72
- function report_failure(kind: ReadFailureKind, issue_number: string): void {
73
- if (kind === 'missing') {
74
- console.error(`✖ issue #${issue_number} does not resolve — check the number and the repository`)
75
- } else {
76
- console.error(
77
- `✖ could not read issue #${issue_number} — a rate limit, expired auth, or a dropped connection. This is not "the issue is empty"`,
78
- )
79
- }
80
- }
81
-
82
71
  // The comments are read beside the fields rather than after them: the two requests need nothing from
83
72
  // one another, and reading them in sequence would put back one of the two round trips this command
84
73
  // exists to remove.
@@ -126,34 +115,6 @@ function issue_blocks(report: IssueReport): ReadonlyArray<string> {
126
115
  return [issue_read.format_issue(report.issue_number, fields, comments)]
127
116
  }
128
117
 
129
- function print_issues(reports: ReadonlyArray<IssueReport>): void {
130
- const blocks = reports.flatMap((report) => issue_blocks(report))
131
-
132
- if (blocks.length === 0) return
133
-
134
- console.info(blocks.join(BLOCK_SEPARATOR))
135
- }
136
-
137
- function report_one_failure(report: IssueReport): boolean {
138
- if (report.result.kind === 'issue') return false
139
-
140
- report_failure(report.result.kind, report.issue_number)
141
-
142
- return true
143
- }
144
-
145
- // Every number that produced no issue is named, so a caller is told which ones it has no answer for
146
- // rather than being left to subtract the printed blocks from what it asked.
147
- function report_failures(reports: ReadonlyArray<IssueReport>): number {
148
- let has_failure = false
149
-
150
- for (const report of reports) {
151
- has_failure = report_one_failure(report) || has_failure
152
- }
153
-
154
- return has_failure ? FAILURE_EXIT_CODE : SUCCESS_EXIT_CODE
155
- }
156
-
157
118
  async function run(argv: ReadonlyArray<string>): Promise<number> {
158
119
  const issue_numbers = parse_numbers(argv)
159
120
 
@@ -165,9 +126,12 @@ async function run(argv: ReadonlyArray<string>): Promise<number> {
165
126
 
166
127
  const reports = await read_all(issue_numbers)
167
128
 
168
- print_issues(reports)
129
+ issue_report_failures.print_blocks(
130
+ reports.flatMap((report) => issue_blocks(report)),
131
+ BLOCK_SEPARATOR,
132
+ )
169
133
 
170
- return report_failures(reports)
134
+ return issue_report_failures.report_failures(reports, FAILURE_TERMS)
171
135
  }
172
136
 
173
137
  async function main(argv: ReadonlyArray<string>): Promise<void> {
@@ -175,10 +139,7 @@ async function main(argv: ReadonlyArray<string>): Promise<void> {
175
139
  }
176
140
 
177
141
  const issue_read_cli = {
178
- BLOCK_SEPARATOR,
179
- ISSUE_FIELDS,
180
142
  USAGE,
181
- main,
182
143
  parse_numbers,
183
144
  read_block,
184
145
  run,
@@ -130,8 +130,6 @@ function format_issue(
130
130
 
131
131
  const issue_read = {
132
132
  ISSUE_LABEL,
133
- TITLE_LABEL,
134
- STATE_LABEL,
135
133
  NO_BODY,
136
134
  NO_COMMENTS,
137
135
  COMMENTS_UNREADABLE,
@@ -0,0 +1,80 @@
1
+ // The failure report `issue:read` and `issue:state` share (joshuafolkken/kit#3046). Both read a batch
2
+ // of numbers, print a block for each one that answered, and name every one that did not; only the
3
+ // result kind that counts as an answer and what a gap must not be mistaken for differ between them.
4
+
5
+ const SUCCESS_EXIT_CODE = 0
6
+ const FAILURE_EXIT_CODE = 1
7
+
8
+ // The two failure kinds a read can end in, kept apart all the way to the report: `missing` is the
9
+ // number resolving to nothing and `unreadable` is a read that failed, and the documents ask a
10
+ // caller to report the two differently. Folding them together to simplify the batch would destroy
11
+ // exactly that distinction.
12
+ type ReadFailureKind = 'missing' | 'unreadable'
13
+
14
+ interface NumberReport<K extends string> {
15
+ issue_number: string
16
+ result: { kind: K | ReadFailureKind }
17
+ }
18
+
19
+ interface FailureTerms<K extends string> {
20
+ success_kind: K
21
+ // What a failed read would be misread as if it were printed silently — "the issue is empty".
22
+ misreading: string
23
+ }
24
+
25
+ function print_blocks(blocks: ReadonlyArray<string>, separator: string): void {
26
+ if (blocks.length === 0) return
27
+
28
+ console.info(blocks.join(separator))
29
+ }
30
+
31
+ // A number that resolves to nothing is an answer — a typo, or another repository's number quoted in
32
+ // prose — and it is reported as one. Everything else is a gap, and the message says so, because the
33
+ // caller's next move differs: a gap is retried, an answer is not.
34
+ function report_failure(kind: ReadFailureKind, issue_number: string, misreading: string): void {
35
+ if (kind === 'missing') {
36
+ console.error(`✖ issue #${issue_number} does not resolve — check the number and the repository`)
37
+ } else {
38
+ console.error(
39
+ `✖ could not read issue #${issue_number} — a rate limit, expired auth, or a dropped connection. This is not "${misreading}"`,
40
+ )
41
+ }
42
+ }
43
+
44
+ function is_failure_kind(kind: string): kind is ReadFailureKind {
45
+ return kind === 'missing' || kind === 'unreadable'
46
+ }
47
+
48
+ function report_one_failure<K extends string>(
49
+ report: NumberReport<K>,
50
+ terms: FailureTerms<K>,
51
+ ): boolean {
52
+ const { kind } = report.result
53
+
54
+ if (!is_failure_kind(kind)) return false
55
+
56
+ report_failure(kind, report.issue_number, terms.misreading)
57
+
58
+ return true
59
+ }
60
+
61
+ // Every number that produced no answer is named, so a caller is told which ones it has no answer for
62
+ // rather than being left to subtract the printed blocks from what it asked. A single failure makes
63
+ // the exit code non-zero.
64
+ function report_failures<K extends string>(
65
+ reports: ReadonlyArray<NumberReport<K>>,
66
+ terms: FailureTerms<K>,
67
+ ): number {
68
+ let has_failure = false
69
+
70
+ for (const report of reports) {
71
+ has_failure = report_one_failure(report, terms) || has_failure
72
+ }
73
+
74
+ return has_failure ? FAILURE_EXIT_CODE : SUCCESS_EXIT_CODE
75
+ }
76
+
77
+ const issue_report_failures = { print_blocks, report_failures }
78
+
79
+ export type { ReadFailureKind }
80
+ export { issue_report_failures }
@@ -5,7 +5,7 @@ import { epic_audit_logic } from '#scripts/epic/epic-audit'
5
5
  import { epic_bundle, type BacklogIssue, type BundleDecision } from '#scripts/epic/epic-bundle'
6
6
  import { epic_bundle_cli } from '#scripts/epic/epic-bundle-cli'
7
7
  import { epic_bundle_gaps } from '#scripts/epic/epic-bundle-gaps'
8
- import { git_gh_command } from '#scripts/git/git-gh-command'
8
+ import { git_gh_command } from '#scripts/gh/git-gh-command'
9
9
  import { cli_flags } from '#scripts/lib/cli-flags'
10
10
  import { issue_citation } from '#scripts/rules/issue-citation'
11
11
  import {
@@ -403,16 +403,10 @@ const issue_scout_cli = {
403
403
  NO_REFERENCE_LINE,
404
404
  CLOSED_UNREADABLE_LINE,
405
405
  CLOSED_CEILING_LINE,
406
- DRAFT_NUMBER,
407
406
  read_arguments,
408
407
  with_draft_body,
409
- draft_of,
410
- format_duplicates,
411
- format_epic_decision,
412
- format_report,
413
408
  scout,
414
409
  run,
415
- main,
416
410
  }
417
411
 
418
412
  if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
@@ -1,9 +1,9 @@
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 { PAGE_CEILING_CAUSE } from '#scripts/git/listing-cutoff'
4
3
  import { parse_json_array_or_undefined } from '#scripts/git/parse-json-array'
5
4
  import { issue_label_schema } from '#scripts/git/schemas'
6
5
  import { z } from 'zod'
6
+ import { EPIC_LABEL, has_any_label } from './issue-labels'
7
7
  import type { ScoutIssue } from './issue-scout'
8
8
 
9
9
  // The closed half of `issue:scout`'s duplicate scan (joshuafolkken/kit#1679), held apart from the CLI
@@ -232,10 +232,8 @@ function find_duplicates(
232
232
 
233
233
  const issue_scout = {
234
234
  SIMILARITY_THRESHOLD,
235
- MIN_SHARED_TOKENS,
236
235
  MAX_CANDIDATES,
237
236
  tokenize,
238
- shared_tokens,
239
237
  dice_similarity,
240
238
  find_duplicates,
241
239
  }
@@ -1,7 +1,8 @@
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 { bounded_pool } from '#scripts/lib/bounded-pool'
5
+ import { issue_report_failures, type ReadFailureKind } from './issue-report-failures'
5
6
  import { issue_state, type IssueState } from './issue-state'
6
7
 
7
8
  // `josh issue:state <N> [<N> ...]` — print each issue's state and labels, in the spelling the
@@ -25,7 +26,6 @@ import { issue_state, type IssueState } from './issue-state'
25
26
  // answer as "not CLOSED" would report a child as failed because nobody could reach GitHub. The two
26
27
  // are told apart here and neither is a state.
27
28
 
28
- const SUCCESS_EXIT_CODE = 0
29
29
  const FAILURE_EXIT_CODE = 1
30
30
  const ARGV_OFFSET = 2
31
31
  const REPO_FLAG = '--repo'
@@ -43,18 +43,13 @@ const READ_CONCURRENCY = 8
43
43
  // The two fields, under the names `gh issue view --json` gave them. `git-gh-issue-rest.ts` maps them
44
44
  // back from REST, which is what keeps `OPEN` / `CLOSED` / `MERGED` out of this file.
45
45
  const STATE_FIELDS = 'state,labels'
46
+ const FAILURE_TERMS = { success_kind: 'state', misreading: 'the issue is open' } as const
46
47
 
47
48
  interface StateRequest {
48
49
  issue_numbers: ReadonlyArray<string>
49
50
  repo?: string
50
51
  }
51
52
 
52
- // The two failure kinds a read can end in, kept apart all the way to the report: `missing` is the
53
- // number resolving to nothing and `unreadable` is a read that failed, and the documents ask a
54
- // caller to report the two differently. Folding them together to simplify the batch would destroy
55
- // exactly that distinction.
56
- type ReadFailureKind = 'missing' | 'unreadable'
57
-
58
53
  // One issue's state, or the failure kind. Named for export because `run:prep` reads the state beside
59
54
  // the body and the dependency-update scope (joshuafolkken/kit#1978), reusing this read rather than a
60
55
  // second one that would drift from the `human_review` decision `parse_issue_state` owns.
@@ -146,19 +141,6 @@ function parse_request(argv: ReadonlyArray<string>): StateRequest | undefined {
146
141
  return repo_flag.kind === 'named' ? { issue_numbers, repo: repo_flag.repo } : { issue_numbers }
147
142
  }
148
143
 
149
- // A number that resolves to nothing is an answer — a typo, or another repository's number quoted in
150
- // prose — and it is reported as one. Everything else is a gap, and the message says so, because the
151
- // caller's next move differs: a gap is retried, an answer is not.
152
- function report_failure(kind: ReadFailureKind, issue_number: string): void {
153
- if (kind === 'missing') {
154
- console.error(`✖ issue #${issue_number} does not resolve — check the number and the repository`)
155
- } else {
156
- console.error(
157
- `✖ could not read issue #${issue_number} — a rate limit, expired auth, or a dropped connection. This is not "the issue is open"`,
158
- )
159
- }
160
- }
161
-
162
144
  // One number's read, reduced to what the report needs and nothing printed yet. Separating the two
163
145
  // is what lets the whole batch be in flight at once: the numbers are independent, so reading them
164
146
  // one after the other spends a round trip per number for no reason.
@@ -206,30 +188,7 @@ function print_states(reports: ReadonlyArray<IssueReport>): void {
206
188
  const should_attribute = reports.length > 1
207
189
  const blocks = reports.flatMap((report) => state_blocks(report, should_attribute))
208
190
 
209
- if (blocks.length === 0) return
210
-
211
- console.info(blocks.join(BLOCK_SEPARATOR))
212
- }
213
-
214
- function report_one_failure(report: IssueReport): boolean {
215
- if (report.result.kind === 'state') return false
216
-
217
- report_failure(report.result.kind, report.issue_number)
218
-
219
- return true
220
- }
221
-
222
- // Every number that produced no state is named, so a caller is told which ones it has no answer for
223
- // rather than being left to subtract the printed blocks from what it asked. A single failure still
224
- // makes the exit code non-zero, exactly as it did when only one number could be passed.
225
- function report_failures(reports: ReadonlyArray<IssueReport>): number {
226
- let has_failure = false
227
-
228
- for (const report of reports) {
229
- has_failure = report_one_failure(report) || has_failure
230
- }
231
-
232
- return has_failure ? FAILURE_EXIT_CODE : SUCCESS_EXIT_CODE
191
+ issue_report_failures.print_blocks(blocks, BLOCK_SEPARATOR)
233
192
  }
234
193
 
235
194
  async function run(argv: ReadonlyArray<string>): Promise<number> {
@@ -245,7 +204,7 @@ async function run(argv: ReadonlyArray<string>): Promise<number> {
245
204
 
246
205
  print_states(reports)
247
206
 
248
- return report_failures(reports)
207
+ return issue_report_failures.report_failures(reports, FAILURE_TERMS)
249
208
  }
250
209
 
251
210
  async function main(argv: ReadonlyArray<string>): Promise<void> {
@@ -1,6 +1,6 @@
1
- import { has_any_label, NEEDS_HUMAN_REVIEW_LABEL } from '#scripts/git/issue-labels'
2
1
  import { parse_json_object_safe } from '#scripts/git/parse-json-array'
3
2
  import { z } from 'zod'
3
+ import { has_any_label, NEEDS_HUMAN_REVIEW_LABEL } from './issue-labels'
4
4
 
5
5
  // The answer `josh issue:state` prints, kept apart from the reading and the printing so the shape of
6
6
  // the report is decided by one pure function (joshuafolkken/kit#1054).
@@ -96,10 +96,6 @@ function format_attributed_issue_state(issue_number: string, state: IssueState):
96
96
 
97
97
  const issue_state = {
98
98
  NO_LABELS,
99
- STATE_LABEL,
100
- LABELS_LABEL,
101
- HUMAN_REVIEW_LABEL_LINE,
102
- ISSUE_LABEL,
103
99
  parse_issue_state,
104
100
  format_issue_state,
105
101
  format_attributed_issue_state,
@@ -68,6 +68,6 @@ function section_lines(body: string, heading: string): ReadonlyArray<string> {
68
68
  return end === -1 ? rest : rest.slice(0, end)
69
69
  }
70
70
 
71
- const markdown_section = { section_lines, is_heading, has_line, has_unfenced_line }
71
+ const markdown_section = { section_lines, has_line, has_unfenced_line }
72
72
 
73
73
  export { markdown_section }
@@ -90,7 +90,7 @@ async function main(argv: ReadonlyArray<string>): Promise<void> {
90
90
  process.exitCode = await run(argv[0], new Date())
91
91
  }
92
92
 
93
- const measure_rerun_cli = { run, rerun_one, USAGE, NO_BASELINE }
93
+ const measure_rerun_cli = { run }
94
94
 
95
95
  const ARGV_OFFSET = 2
96
96
 
@@ -53,7 +53,7 @@ function has_command_output(body: string, heading: string = REPRODUCTION_HEADING
53
53
  return reproduction.has_command && reproduction.has_output
54
54
  }
55
55
 
56
- const reproduction_measure = { REPRODUCTION_HEADING, has_command_output, parse_reproduction }
56
+ const reproduction_measure = { has_command_output }
57
57
 
58
58
  export type { Reproduction }
59
59
  export { reproduction_measure }
@@ -91,6 +91,6 @@ function resolve(input: {
91
91
  return read_file_or_stdin(file_path)
92
92
  }
93
93
 
94
- const cli_body = { read_file_or_stdin, expand_escaped_newlines, has_value, resolve }
94
+ const cli_body = { read_file_or_stdin, has_value, resolve }
95
95
 
96
96
  export { cli_body }
@@ -253,11 +253,8 @@ const file_map_stamp = {
253
253
  changed_since,
254
254
  create,
255
255
  describes_base,
256
- is_file_map,
257
- is_writer_gone,
258
256
  is_writer_running,
259
257
  parse_stamp,
260
- read_at,
261
258
  }
262
259
 
263
260
  export type { FileMapStamp, FileMapStampAccess }