@joshuafolkken/kit 1.1050.0 → 1.1128.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (630) hide show
  1. package/.claude/settings.json +9 -8
  2. package/.claude/skills/epic-commands/SKILL.md +5 -7
  3. package/.claude/skills/workflow-commands/SKILL.md +20 -12
  4. package/.claude/skills/workflow-commands/background-commands.md +36 -84
  5. package/.claude/skills/workflow-commands/backlogrun-child.md +1 -1
  6. package/.claude/skills/workflow-commands/backlogrun-lanes.md +8 -6
  7. package/.claude/skills/workflow-commands/backlogrun-progress.md +30 -33
  8. package/.claude/skills/workflow-commands/backlogrun-steps.md +12 -12
  9. package/.claude/skills/workflow-commands/backlogrun.md +2 -2
  10. package/.claude/skills/workflow-commands/chain-rule.md +4 -2
  11. package/.claude/skills/workflow-commands/delegation.md +3 -3
  12. package/.claude/skills/workflow-commands/followup-reference.md +1 -1
  13. package/.claude/skills/workflow-commands/followup.md +7 -3
  14. package/.claude/skills/workflow-commands/fullrun-steps.md +3 -2
  15. package/.claude/skills/workflow-commands/fullrun.md +8 -6
  16. package/.claude/skills/workflow-commands/halfrun.md +19 -21
  17. package/.claude/skills/workflow-commands/issue-comments.md +1 -1
  18. package/.claude/skills/workflow-commands/issue-fold-existing.md +10 -10
  19. package/.claude/skills/workflow-commands/issue-scout.md +1 -1
  20. package/.claude/skills/workflow-commands/kickoff.md +9 -4
  21. package/.claude/skills/workflow-commands/latest-gate.md +8 -16
  22. package/.claude/skills/workflow-commands/needs-human-review.md +1 -1
  23. package/.claude/skills/workflow-commands/observation-filing.md +3 -3
  24. package/.claude/skills/workflow-commands/pre-gate-cut.md +4 -8
  25. package/.claude/skills/workflow-commands/prerequisite.md +1 -1
  26. package/.claude/skills/workflow-commands/prrun.md +36 -0
  27. package/.claude/skills/workflow-commands/retrospective.md +1 -1
  28. package/.claude/skills/workflow-commands/split-assessment.md +4 -18
  29. package/.claude/skills/workflow-commands/working-tree-hold.md +22 -2
  30. package/.codex/hooks.json +16 -20
  31. package/.github/actions/setup-node/action.yml +33 -0
  32. package/.github/actions/setup-pnpm/action.yml +93 -0
  33. package/.github/dependabot.yml +5 -1
  34. package/.github/workflows/auto-tag.yml +2 -3
  35. package/.github/workflows/ci.yml +31 -134
  36. package/.github/workflows/dependabot-auto-merge.yml +1 -0
  37. package/.github/workflows/pr-classification.yml +6 -44
  38. package/.github/workflows/production.yml +1 -0
  39. package/.github/workflows/publish.yml +43 -47
  40. package/.github/workflows/sonar-qube.yml +41 -4
  41. package/.pnpmfile.mjs +29 -0
  42. package/AGENTS.md +5 -2
  43. package/CLAUDE.md +33 -27
  44. package/GEMINI.md +5 -2
  45. package/README.md +66 -20
  46. package/SECURITY.md +37 -6
  47. package/cspell/index.yaml +6 -1
  48. package/dist/CLAUDE.basic.md +6 -6
  49. package/dist/CLAUDE.md +33 -27
  50. package/dist/CLAUDE.static.md +6 -6
  51. package/dist/config-merge/index.js +48 -12
  52. package/dist/hooks/batch-guard.js +4 -4
  53. package/dist/hooks/{chunk-7VPDUBRN.js → chunk-4JZDP5X5.js} +152 -155
  54. package/dist/hooks/{chunk-HJIISEAC.js → chunk-5SD2YM7Z.js} +5 -13
  55. package/dist/hooks/{chunk-NAS4C7GP.js → chunk-77J7IEQM.js} +2 -2
  56. package/dist/hooks/{chunk-DMQN45FN.js → chunk-7HVB7SZG.js} +3 -3
  57. package/dist/hooks/{chunk-RLDX5SOC.js → chunk-AIOIOMPX.js} +4413 -1970
  58. package/dist/hooks/{chunk-5BK3K7V4.js → chunk-M7QKEKWO.js} +873 -2049
  59. package/dist/hooks/{chunk-WQ4OSBSS.js → chunk-MKVGBQPA.js} +2 -2
  60. package/dist/hooks/{chunk-EJDX2TOB.js → chunk-NXYMNPUQ.js} +7 -88
  61. package/dist/hooks/{chunk-NJQOBE6L.js → chunk-QVLT52OV.js} +2 -7
  62. package/dist/hooks/{chunk-GQ7KP45M.js → chunk-XYUIQOW3.js} +2 -2
  63. package/dist/hooks/codex-hook-adapter.js +12 -48
  64. package/dist/hooks/duplicate-read-guard.js +5 -5
  65. package/dist/hooks/format-edited.js +2 -2
  66. package/dist/hooks/inputs.json +280 -0
  67. package/dist/hooks/investigation-guard.js +5 -5
  68. package/dist/hooks/pretool-guard.js +9 -9
  69. package/dist/hooks/session-lang.js +0 -1
  70. package/dist/hooks/stop-guard.js +192 -333
  71. package/dist/josh.js +240 -148
  72. package/dist/managed-marker/index.js +2 -1
  73. package/dist/version/index.js +70 -78
  74. package/eslint/rules/promise.js +5 -0
  75. package/eslint/rules/unicorn.js +3 -2
  76. package/package.json +26 -5
  77. package/pnpm-workspace.yaml +5 -7
  78. package/prompts/collaboration-workflow/glossary.md +17 -0
  79. package/prompts/collaboration-workflow/issue-citation.md +5 -5
  80. package/prompts/collaboration-workflow/issue-template.md +1 -1
  81. package/prompts/collaboration-workflow/operating-rules.md +5 -5
  82. package/prompts/collaboration-workflow/overview.md +13 -1
  83. package/prompts/collaboration-workflow/principles.md +9 -0
  84. package/prompts/collaboration-workflow/report-format.md +1 -1
  85. package/prompts/collaboration-workflow/residency.md +3 -3
  86. package/prompts/collaboration-workflow/rule-delivery.md +1 -1
  87. package/prompts/collaboration-workflow/turn-batching.md +3 -3
  88. package/prompts/collaboration-workflow/upstream-interrupt.md +1 -1
  89. package/prompts/collaboration-workflow/wip-cap.md +25 -22
  90. package/prompts/collaboration-workflow.md +6 -8
  91. package/prompts/review-rubric.md +1 -1
  92. package/prompts/review.md +3 -3
  93. package/prompts/sonar-hotspot-handling.md +11 -3
  94. package/prompts/testing-guide.md +3 -3
  95. package/scripts/adopt/adopt-toolkits.ts +0 -2
  96. package/scripts/adopt/adopt.ts +0 -2
  97. package/scripts/agent/agent-argv.ts +0 -2
  98. package/scripts/agent/agent-diagnostics.ts +1 -1
  99. package/scripts/agent/agent-role-profile.ts +0 -7
  100. package/scripts/agent/claude-agent-argv.ts +0 -2
  101. package/scripts/agent/codex-agent-argv.ts +1 -1
  102. package/scripts/agent/codex-hooks.ts +92 -0
  103. package/scripts/agent/interactive-ask.ts +1 -1
  104. package/scripts/auto-ok/auto-ok-cli.ts +6 -16
  105. package/scripts/backlog/backlog-arrival.ts +30 -10
  106. package/scripts/backlog/backlog-budget-cli.ts +15 -16
  107. package/scripts/backlog/backlog-budget.ts +0 -2
  108. package/scripts/backlog/backlog-defect-priority.ts +2 -2
  109. package/scripts/backlog/backlog-drive-cli.ts +10 -8
  110. package/scripts/backlog/backlog-drive-named-offer.ts +16 -3
  111. package/scripts/backlog/backlog-drive-named.ts +2 -1
  112. package/scripts/backlog/backlog-drive.ts +76 -16
  113. package/scripts/backlog/backlog-named.ts +0 -3
  114. package/scripts/backlog/backlog-next.ts +9 -15
  115. package/scripts/backlog/backlog-offer-cli.ts +6 -19
  116. package/scripts/backlog/backlog-plan-cli.ts +1 -7
  117. package/scripts/backlog/backlog-plan.ts +30 -19
  118. package/scripts/backlog/backlog-pool.ts +3 -6
  119. package/scripts/backlog/backlog-rank.ts +2 -2
  120. package/scripts/backlog/backlog-ready.ts +39 -10
  121. package/scripts/backlog/backlog-scope.ts +1 -3
  122. package/scripts/backlog/backlog-stalled-detect.ts +2 -2
  123. package/scripts/backlog/backlog-stalled.ts +0 -1
  124. package/scripts/backlog/backlog-waves.ts +5 -2
  125. package/scripts/behavior/behavior-cli.ts +1 -1
  126. package/scripts/build/build-codex-hooks.ts +26 -0
  127. package/scripts/build/build-hooks.ts +85 -9
  128. package/scripts/build/hook-bundle-stamp.ts +111 -0
  129. package/scripts/cases/cases-cli.ts +1 -1
  130. package/scripts/cases/cases-logic.ts +1 -1
  131. package/scripts/ci/composite-actions.ts +30 -0
  132. package/scripts/ci/pr-classification.ts +3 -3
  133. package/scripts/claude/workflow-destination.ts +10 -1
  134. package/scripts/clone/clone-fingerprint.ts +0 -1
  135. package/scripts/clone/clone-scan-cli.ts +1 -1
  136. package/scripts/clone/clone-scan.ts +1 -1
  137. package/scripts/config-merge/json-format.ts +0 -1
  138. package/scripts/config-merge/parse-jsonc.ts +33 -3
  139. package/scripts/config-merge/patch-json-key.ts +13 -6
  140. package/scripts/config-merge/patch-yaml-list.ts +1 -1
  141. package/scripts/cost-runtime/codex-usage.ts +2 -9
  142. package/scripts/cost-runtime/cost-attribute.ts +0 -1
  143. package/scripts/cost-runtime/cost-cli.ts +3 -10
  144. package/scripts/cost-runtime/cost-corpus.ts +0 -2
  145. package/scripts/cost-runtime/cost-format.ts +0 -3
  146. package/scripts/cost-runtime/cost-pricing.ts +0 -1
  147. package/scripts/cost-runtime/cost-tokens.ts +0 -1
  148. package/scripts/delegation/delegation-cli.ts +1 -1
  149. package/scripts/delegation/delegation-policy.ts +0 -1
  150. package/scripts/delegation/duplicate-read-guard.ts +0 -8
  151. package/scripts/delegation/fanout-cli.ts +1 -1
  152. package/scripts/delegation/fanout.ts +0 -2
  153. package/scripts/delegation/investigation-reads.ts +1 -164
  154. package/scripts/discovery/repo-map-logic.ts +0 -1
  155. package/scripts/discovery/repo-party-cli.ts +1 -1
  156. package/scripts/doctor/doctor-consumer.ts +6 -10
  157. package/scripts/doctor/doctor-io.ts +9 -13
  158. package/scripts/doctor/doctor-logic.ts +0 -4
  159. package/scripts/doctor/doctor.ts +14 -9
  160. package/scripts/document/backlogrun-parent-read-set.ts +12 -1
  161. package/scripts/document/document-byte-budget.ts +5 -5
  162. package/scripts/document/document-byte-check.ts +0 -1
  163. package/scripts/document/document-read-cli.ts +0 -2
  164. package/scripts/document/document-section-cli.ts +1 -1
  165. package/scripts/document/document-section.ts +0 -3
  166. package/scripts/document/edit-files-cli.ts +0 -1
  167. package/scripts/document/entry-read-budget.ts +21 -7
  168. package/scripts/document/entry-read-set.ts +32 -8
  169. package/scripts/document/lane-child-read-set.ts +8 -6
  170. package/scripts/document/read-files-cli.ts +0 -4
  171. package/scripts/document/read-set-cli.ts +0 -2
  172. package/scripts/document/read-set-point-of-use.ts +9 -3
  173. package/scripts/document/read-set-pricing.ts +0 -1
  174. package/scripts/document/read-set-trim.ts +4 -2
  175. package/scripts/epic/epic-add.ts +1 -1
  176. package/scripts/epic/epic-audit-cli.ts +1 -4
  177. package/scripts/epic/epic-audit-orphans.ts +1 -3
  178. package/scripts/epic/epic-audit-rationale.ts +0 -1
  179. package/scripts/epic/epic-audit-report.ts +0 -2
  180. package/scripts/epic/epic-audit.ts +8 -22
  181. package/scripts/epic/epic-bundle-cli.ts +1 -1
  182. package/scripts/epic/epic-bundle-evidence.ts +0 -1
  183. package/scripts/epic/epic-bundle-referenced.ts +1 -5
  184. package/scripts/epic/epic-bundle.ts +0 -4
  185. package/scripts/epic/epic-busy.ts +4 -5
  186. package/scripts/epic/epic-candidate-confirm.ts +0 -5
  187. package/scripts/epic/epic-classify.ts +2 -2
  188. package/scripts/epic/epic-cli-argv.ts +0 -1
  189. package/scripts/epic/epic-close-comment.ts +1 -1
  190. package/scripts/epic/epic-close.ts +5 -2
  191. package/scripts/epic/epic-cross-repo.ts +2 -4
  192. package/scripts/epic/epic-decision.ts +0 -1
  193. package/scripts/epic/epic-fetch.ts +2 -2
  194. package/scripts/epic/epic-index.ts +2 -3
  195. package/scripts/epic/epic-issue.ts +1 -15
  196. package/scripts/epic/epic-lane-offer.ts +9 -8
  197. package/scripts/epic/epic-nested.ts +1 -1
  198. package/scripts/epic/epic-next-read.ts +1 -3
  199. package/scripts/epic/epic-next-views.ts +0 -1
  200. package/scripts/epic/epic-next.ts +1 -10
  201. package/scripts/epic/epic-parse.ts +0 -1
  202. package/scripts/epic/epic-promote.ts +0 -9
  203. package/scripts/epic/epic-rank.ts +2 -2
  204. package/scripts/epic/epic-read.ts +1 -2
  205. package/scripts/epic/epic-reconcile.ts +1 -1
  206. package/scripts/epic/epic-reference.ts +1 -13
  207. package/scripts/epic/epic-relation-recheck.ts +1 -1
  208. package/scripts/epic/epic-relations.ts +1 -1
  209. package/scripts/epic/epic-remove.ts +1 -1
  210. package/scripts/epic/epic-report.ts +0 -1
  211. package/scripts/epic/epic-run.ts +2 -3
  212. package/scripts/epic/epic-shape.ts +1 -1
  213. package/scripts/epic/epic-solo-stale.ts +107 -0
  214. package/scripts/epic/epic-solo.ts +3 -2
  215. package/scripts/epic/epic-triage.ts +1 -1
  216. package/scripts/epic/epic-validate.ts +1 -1
  217. package/scripts/epic/epic.ts +1 -1
  218. package/scripts/exports/unused-members-cli.ts +53 -0
  219. package/scripts/{git → followup}/followup-issue-number.ts +1 -6
  220. package/scripts/{git → followup}/git-followup-cleanup.ts +2 -1
  221. package/scripts/{git → followup}/git-followup-finish.ts +1 -3
  222. package/scripts/{git → followup}/git-followup-flush.ts +2 -2
  223. package/scripts/{git → followup}/git-followup-issue-close.ts +2 -2
  224. package/scripts/{git → followup}/git-followup-label.ts +4 -4
  225. package/scripts/followup/git-followup-merged.ts +112 -0
  226. package/scripts/{git → followup}/git-followup-pending.ts +1 -1
  227. package/scripts/{git → followup}/git-followup-workflow.ts +19 -11
  228. package/scripts/{git → followup}/git-pr-followup-wrapup.ts +9 -3
  229. package/scripts/{git → followup}/git-pr-followup.ts +53 -16
  230. package/scripts/gate/core-budget.ts +3 -9
  231. package/scripts/gate/gate-plan.ts +7 -4
  232. package/scripts/gate/gate-report.ts +0 -6
  233. package/scripts/gate/gate-tree.ts +1 -1
  234. package/scripts/gate/pre-commit-type-check.ts +0 -6
  235. package/scripts/gate/project-checks.ts +7 -8
  236. package/scripts/gate/scoped-green.ts +0 -1
  237. package/scripts/gate/type-check-step.ts +1 -1
  238. package/scripts/gate/verification-gate.ts +0 -2
  239. package/scripts/gh/fix-gh-packages.ts +15 -12
  240. package/scripts/gh/gh-spawn.ts +2 -2
  241. package/scripts/{git → gh}/git-ai-review-scan.ts +1 -5
  242. package/scripts/{git → gh}/git-gh-check.ts +2 -1
  243. package/scripts/{git → gh}/git-gh-exec.ts +1 -1
  244. package/scripts/{git → gh}/git-gh-failure.ts +1 -1
  245. package/scripts/{git → gh}/git-gh-helpers.ts +0 -1
  246. package/scripts/{git → gh}/git-gh-issue-list.ts +13 -10
  247. package/scripts/{git → gh}/git-gh-issue-read.ts +1 -1
  248. package/scripts/{git → gh}/git-gh-issue-rest.ts +6 -3
  249. package/scripts/{git → gh}/git-gh-issue-write.ts +4 -1
  250. package/scripts/{git → gh}/git-gh-pr-auto-merge.ts +4 -1
  251. package/scripts/{git → gh}/git-gh-pr-read.ts +24 -0
  252. package/scripts/{git → gh}/git-gh-pr-rest.ts +5 -2
  253. package/scripts/{git → gh}/git-gh-pr-review.ts +2 -2
  254. package/scripts/{git → gh}/git-gh-pr-rollup.ts +1 -3
  255. package/scripts/{git → gh}/git-gh-pr.ts +3 -1
  256. package/scripts/{git → gh}/git-pr-ai-review.ts +2 -5
  257. package/scripts/{git → gh}/git-pr-checks-eval.ts +0 -10
  258. package/scripts/{git → gh}/git-pr-checks-parse.ts +4 -20
  259. package/scripts/{git → gh}/git-pr-checks.ts +2 -1
  260. package/scripts/{git → gh}/git-pr-coderabbit.ts +2 -5
  261. package/scripts/{git → gh}/git-pr-confirmation.ts +1 -3
  262. package/scripts/{git → gh}/git-pr-managed-config.ts +2 -3
  263. package/scripts/{git → gh}/git-pr.ts +3 -3
  264. package/scripts/git/changed-file-scope.ts +0 -1
  265. package/scripts/git/git-branch.ts +3 -6
  266. package/scripts/git/git-command.ts +6 -1
  267. package/scripts/git/git-commit.ts +1 -1
  268. package/scripts/git/git-common-directory.ts +80 -24
  269. package/scripts/git/git-error.ts +66 -9
  270. package/scripts/git/git-issue.ts +1 -1
  271. package/scripts/git/git-preflight.ts +2 -2
  272. package/scripts/git/git-prompt.ts +6 -31
  273. package/scripts/git/git-push.ts +1 -1
  274. package/scripts/git/git-spawn-sync.ts +65 -0
  275. package/scripts/git/git-spawn.ts +5 -4
  276. package/scripts/git/git-staging.ts +1 -0
  277. package/scripts/git/git-status.ts +1 -1
  278. package/scripts/git/git-workflow.ts +1 -1
  279. package/scripts/git/gone-branch.ts +1 -0
  280. package/scripts/git/listing-cutoff.ts +1 -1
  281. package/scripts/git/main-merge.ts +1 -1
  282. package/scripts/git/main-sync.ts +19 -1
  283. package/scripts/git/parse-json-array.ts +0 -3
  284. package/scripts/git/repository-lock.ts +16 -16
  285. package/scripts/git/{git-stash.ts → stash/git-stash.ts} +1 -1
  286. package/scripts/git/{stash-pop-args.ts → stash/stash-pop-args.ts} +2 -7
  287. package/scripts/git/{stash-pop-cli.ts → stash/stash-pop-cli.ts} +0 -1
  288. package/scripts/git/{stash-sweep-lock.ts → stash/stash-sweep-lock.ts} +3 -3
  289. package/scripts/hooks/codex-hook-adapter.ts +0 -1
  290. package/scripts/hooks/edited-cspell.ts +1 -1
  291. package/scripts/hooks/format-edited-file.ts +2 -0
  292. package/scripts/hooks/pre-push-unit.ts +0 -4
  293. package/scripts/hooks/pretool-guard.ts +22 -4
  294. package/scripts/hooks/reserved-run.ts +1 -1
  295. package/scripts/hooks/step-zero-notice.ts +76 -0
  296. package/scripts/hooks/stop-guard.ts +47 -21
  297. package/scripts/init/claude-plugin-config.ts +4 -5
  298. package/scripts/init/hook-command-rewrite.ts +16 -8
  299. package/scripts/init/hook-launch.ts +41 -15
  300. package/scripts/init/init-basic.ts +2 -5
  301. package/scripts/init/init-file-action.ts +54 -0
  302. package/scripts/init/init-logic-migrate.ts +35 -17
  303. package/scripts/init/init-logic-secretlint.ts +1 -1
  304. package/scripts/init/init-logic.ts +10 -19
  305. package/scripts/init/init.ts +11 -71
  306. package/scripts/init/kit-written-paths.ts +2 -0
  307. package/scripts/init/project-profile.ts +9 -17
  308. package/scripts/init/start-exec.ts +1 -1
  309. package/scripts/init/start-setup-pr.ts +6 -6
  310. package/scripts/init/start-steps.ts +3 -1
  311. package/scripts/issue/behavior-change-lint.ts +0 -1
  312. package/scripts/issue/defect-rate-cli.ts +64 -23
  313. package/scripts/issue/defect-rate.ts +1 -2
  314. package/scripts/{git → issue}/git-next-issues.ts +3 -3
  315. package/scripts/issue/issue-backlinks-cli.ts +1 -5
  316. package/scripts/issue/issue-backlinks.ts +7 -14
  317. package/scripts/issue/issue-cite-cli.ts +2 -6
  318. package/scripts/issue/issue-cite.ts +12 -8
  319. package/scripts/issue/issue-classification.ts +1 -9
  320. package/scripts/issue/issue-closing-pr.ts +4 -4
  321. package/scripts/issue/issue-comment-cli.ts +2 -2
  322. package/scripts/issue/issue-file-cli.ts +5 -5
  323. package/scripts/issue/issue-file.ts +7 -14
  324. package/scripts/issue/issue-fold-cli.ts +1 -1
  325. package/scripts/issue/issue-fold-existing-cli.ts +1 -1
  326. package/scripts/{git → issue}/issue-labels.ts +8 -0
  327. package/scripts/issue/issue-lint-cli.ts +1 -1
  328. package/scripts/issue/issue-merged.ts +2 -2
  329. package/scripts/{git → issue}/issue-rank.ts +1 -1
  330. package/scripts/issue/issue-read-cli.ts +8 -47
  331. package/scripts/issue/issue-read.ts +0 -2
  332. package/scripts/issue/issue-report-failures.ts +80 -0
  333. package/scripts/issue/issue-scout-cli.ts +1 -7
  334. package/scripts/issue/issue-scout-closed.ts +2 -2
  335. package/scripts/issue/issue-scout.ts +0 -2
  336. package/scripts/issue/issue-state-cli.ts +5 -46
  337. package/scripts/issue/issue-state.ts +1 -5
  338. package/scripts/issue/markdown-section.ts +21 -6
  339. package/scripts/issue/measure-rerun-cli.ts +74 -15
  340. package/scripts/issue/reproduction-measure.ts +1 -1
  341. package/scripts/josh/cli-body.ts +1 -1
  342. package/scripts/josh/file-map-stamp.ts +0 -3
  343. package/scripts/josh/josh-command-map.ts +2 -0
  344. package/scripts/josh/josh-commands-ai.ts +9 -102
  345. package/scripts/josh/josh-commands-backlog.ts +5 -1
  346. package/scripts/josh/josh-commands-development.ts +8 -1
  347. package/scripts/josh/josh-commands-issue.ts +2 -2
  348. package/scripts/josh/josh-commands-maintenance.ts +7 -0
  349. package/scripts/josh/josh-commands-project.ts +7 -1
  350. package/scripts/josh/josh-commands-run.ts +114 -0
  351. package/scripts/josh/josh-commands-versioning.ts +8 -0
  352. package/scripts/josh/josh-commands-workflow.ts +3 -3
  353. package/scripts/josh/path-decision.ts +0 -3
  354. package/scripts/josh/process-owner.ts +16 -0
  355. package/scripts/josh/run-github-prerequisite.ts +3 -6
  356. package/scripts/josh/session-language-cli.ts +0 -1
  357. package/scripts/lane/lane-await.ts +46 -19
  358. package/scripts/lane/lane-capacity.ts +6 -3
  359. package/scripts/lane/lane-child-invocation.ts +20 -7
  360. package/scripts/lane/lane-cli.ts +1 -4
  361. package/scripts/lane/lane-close.ts +5 -4
  362. package/scripts/lane/lane-dispatch.ts +3 -4
  363. package/scripts/lane/lane-environment.ts +0 -9
  364. package/scripts/lane/lane-handoff.ts +38 -0
  365. package/scripts/lane/lane-launch-cli.ts +31 -27
  366. package/scripts/lane/lane-open.ts +0 -3
  367. package/scripts/lane/lane-output.ts +0 -1
  368. package/scripts/lane/lane-registry.ts +9 -0
  369. package/scripts/lane/openai-lane-ship.ts +2 -0
  370. package/scripts/lane/openai-lane-supervisor-decision.ts +2 -1
  371. package/scripts/lane/openai-lane-supervisor.ts +6 -4
  372. package/scripts/lane/openai-review-broker.ts +7 -1
  373. package/scripts/lib/bounded-pool.ts +1 -0
  374. package/scripts/lib/cli-flags.ts +31 -2
  375. package/scripts/lib/error-message.ts +12 -1
  376. package/scripts/lib/json-value.ts +5 -4
  377. package/scripts/lib/poll.ts +3 -1
  378. package/scripts/lib/timed-fetch.ts +15 -0
  379. package/scripts/lib/timeouts.ts +13 -0
  380. package/scripts/{yaml → lib}/yaml-document.ts +3 -1
  381. package/scripts/{bytes → lines}/bytes-command.ts +0 -2
  382. package/scripts/lines/line-targets.ts +0 -11
  383. package/scripts/lines/lines-command.ts +5 -4
  384. package/scripts/lint/lint-related-scope.ts +0 -1
  385. package/scripts/lint/lint-related.ts +1 -1
  386. package/scripts/{git → notify}/telegram-notify.ts +2 -2
  387. package/scripts/{git → notify}/telegram-test.ts +4 -4
  388. package/scripts/observations/observation-ledger-home.ts +0 -1
  389. package/scripts/observations/observation-ledger-line.ts +0 -1
  390. package/scripts/observations/observation-ledger-migrate.ts +1 -1
  391. package/scripts/observations/observations-flush-landing.ts +3 -3
  392. package/scripts/observations/observations-flush.ts +2 -2
  393. package/scripts/overrides/lockfile-overrides.ts +1 -1
  394. package/scripts/overrides/overrides-logic.ts +1 -1
  395. package/scripts/package/package-scout-cli.ts +2 -7
  396. package/scripts/package/package-scout.ts +0 -2
  397. package/scripts/propagate/propagate-git-failure.ts +0 -1
  398. package/scripts/propagate/propagate-git.ts +3 -10
  399. package/scripts/propagate/propagate-publish.ts +2 -3
  400. package/scripts/propagate/propagate-run.ts +0 -2
  401. package/scripts/propagate/propagate-steps.ts +3 -5
  402. package/scripts/propagate/propagate-targets.ts +0 -4
  403. package/scripts/propagate/propagate.ts +0 -4
  404. package/scripts/refactor/import-graph.ts +0 -1
  405. package/scripts/refactor/refactor-lint.ts +0 -2
  406. package/scripts/refactor/refactor-scan.ts +2 -2
  407. package/scripts/refactor/refactor-targets.ts +0 -1
  408. package/scripts/registry-migration/migrate-logic.ts +28 -21
  409. package/scripts/registry-migration/migrate.ts +25 -14
  410. package/scripts/release/github-release-cli.ts +19 -6
  411. package/scripts/release/github-release-environment.ts +46 -0
  412. package/scripts/release/github-release.ts +151 -94
  413. package/scripts/release/release-history.ts +0 -1
  414. package/scripts/release/release-plan.ts +0 -1
  415. package/scripts/release/release-publish.ts +38 -5
  416. package/scripts/release/release-scope-cli.ts +1 -2
  417. package/scripts/release/release-tag.ts +2 -4
  418. package/scripts/release/release-worktree.ts +97 -2
  419. package/scripts/repo/auto-merge-setting-logic.ts +1 -4
  420. package/scripts/repo/repo-setting.ts +1 -1
  421. package/scripts/repo/repository-labels.ts +3 -3
  422. package/scripts/repo/required-checks-logic.ts +206 -0
  423. package/scripts/repo/required-checks-report.ts +71 -0
  424. package/scripts/repo/ruleset-check-cli.ts +53 -0
  425. package/scripts/repo/ruleset-check.ts +147 -0
  426. package/scripts/report/report-lint-cli.ts +0 -4
  427. package/scripts/review/disposition-cli.ts +1 -1
  428. package/scripts/review/live-evidence.ts +1 -1
  429. package/scripts/review/review-attest-cli.ts +0 -6
  430. package/scripts/review/review-attest.ts +4 -16
  431. package/scripts/review/review-brief-cli.ts +23 -6
  432. package/scripts/review/review-brief.ts +21 -8
  433. package/scripts/review/review-checkout.ts +3 -2
  434. package/scripts/review/review-diff-parts.ts +89 -0
  435. package/scripts/review/review-diff-write.ts +97 -0
  436. package/scripts/review/review-finding-ledger.ts +0 -1
  437. package/scripts/review/review-record-cli.ts +10 -17
  438. package/scripts/review/review-record.ts +0 -1
  439. package/scripts/review/review-round2-cli.ts +1 -1
  440. package/scripts/review/review-stamps.ts +0 -3
  441. package/scripts/review/review-tree.ts +14 -2
  442. package/scripts/rules/decision-oracle-stage.ts +18 -0
  443. package/scripts/rules/decision-oracle.ts +10 -7
  444. package/scripts/rules/delivered-rules.ts +9 -1
  445. package/scripts/rules/destructive-command.ts +119 -0
  446. package/scripts/rules/direct-filing.ts +1 -1
  447. package/scripts/rules/early-heartbeat.ts +4 -3
  448. package/scripts/rules/file-body.ts +0 -3
  449. package/scripts/rules/filing-cap.ts +0 -2
  450. package/scripts/rules/gh-api.ts +7 -2
  451. package/scripts/rules/git-argv.ts +18 -7
  452. package/scripts/rules/git-force.ts +0 -2
  453. package/scripts/rules/implementation-cut.ts +0 -1
  454. package/scripts/rules/index-guard.ts +71 -0
  455. package/scripts/rules/issue-citation.ts +50 -25
  456. package/scripts/rules/lane-background.ts +15 -7
  457. package/scripts/rules/lane-park.ts +22 -6
  458. package/scripts/rules/last-prompt.ts +1 -0
  459. package/scripts/rules/oracle-consulted.ts +1 -1
  460. package/scripts/rules/oracle-firing.ts +1 -0
  461. package/scripts/rules/oracle-list-cli.ts +0 -3
  462. package/scripts/rules/permission-guards.ts +14 -0
  463. package/scripts/rules/protected-files.ts +74 -0
  464. package/scripts/rules/reply-language.ts +1 -1
  465. package/scripts/rules/rule-body-guard.ts +0 -3
  466. package/scripts/rules/rule-value-cli.ts +0 -1
  467. package/scripts/rules/shell-body-trigger.ts +0 -1
  468. package/scripts/rules/shell-segments.ts +0 -1
  469. package/scripts/rules/stop-rules.ts +20 -9
  470. package/scripts/rules/tail-commands.ts +1 -1
  471. package/scripts/rules/test-declared-commit.ts +1 -1
  472. package/scripts/rules/third-party-write.ts +0 -1
  473. package/scripts/rules/worktree-guard.ts +26 -9
  474. package/scripts/run/run-carry-args.ts +8 -12
  475. package/scripts/run/run-carry-cli.ts +0 -2
  476. package/scripts/run/run-carry-stash.ts +2 -2
  477. package/scripts/run/run-carry-streak.ts +1 -1
  478. package/scripts/run/run-cut-args.ts +1 -6
  479. package/scripts/run/run-cut-cli.ts +0 -7
  480. package/scripts/run/run-cut.ts +8 -54
  481. package/scripts/run/run-ending-cli.ts +2 -6
  482. package/scripts/run/run-ending.ts +1 -4
  483. package/scripts/run/run-entry-cli.ts +133 -25
  484. package/scripts/run/run-entry-stop.ts +104 -0
  485. package/scripts/run/run-entry.ts +0 -1
  486. package/scripts/run/run-event-cli.ts +0 -2
  487. package/scripts/run/run-event-follow.ts +1 -0
  488. package/scripts/run/run-event-render.ts +1 -1
  489. package/scripts/run/run-event-scope.ts +53 -4
  490. package/scripts/run/run-event-stream-emit.ts +7 -2
  491. package/scripts/run/run-event-stream.ts +0 -3
  492. package/scripts/run/run-event-watch.ts +1 -0
  493. package/scripts/run/run-halfrun-resume.ts +20 -7
  494. package/scripts/run/run-headless.ts +2 -2
  495. package/scripts/run/run-hold-cli.ts +33 -10
  496. package/scripts/run/run-hold.ts +29 -6
  497. package/scripts/run/run-issue-number.ts +1 -1
  498. package/scripts/run/run-liveness-cli.ts +2 -6
  499. package/scripts/run/run-liveness.ts +2 -3
  500. package/scripts/run/run-merge-cli.ts +7 -23
  501. package/scripts/run/run-merge-steps.ts +5 -5
  502. package/scripts/run/run-merge.ts +1 -1
  503. package/scripts/run/run-next-cli.ts +1 -1
  504. package/scripts/run/run-parent-cut-hook.ts +4 -2
  505. package/scripts/run/run-preflight.ts +2 -9
  506. package/scripts/run/run-prep-cli.ts +6 -3
  507. package/scripts/run/run-prep-locate.ts +1 -1
  508. package/scripts/run/run-progress-args.ts +20 -4
  509. package/scripts/run/run-progress-cli.ts +35 -36
  510. package/scripts/run/run-progress-clock.ts +10 -35
  511. package/scripts/run/run-progress-config.ts +0 -4
  512. package/scripts/run/run-progress-read.ts +1 -2
  513. package/scripts/run/run-progress.ts +1 -2
  514. package/scripts/run/run-prrun-resume.ts +117 -0
  515. package/scripts/run/run-report-cli.ts +1 -2
  516. package/scripts/run/run-report.ts +0 -1
  517. package/scripts/run/run-retrospective.ts +1 -1
  518. package/scripts/run/run-review-cli.ts +0 -3
  519. package/scripts/run/run-review-steps.ts +2 -0
  520. package/scripts/run/run-review.ts +0 -2
  521. package/scripts/run/run-ship-cli.ts +29 -19
  522. package/scripts/run/run-ship-detach.ts +1 -0
  523. package/scripts/run/run-ship-next.ts +106 -0
  524. package/scripts/run/run-ship-preflight.ts +1 -1
  525. package/scripts/run/run-ship-probe.ts +4 -1
  526. package/scripts/run/run-ship-return.ts +8 -3
  527. package/scripts/run/run-ship-review-steps.ts +18 -4
  528. package/scripts/run/run-ship-review.ts +11 -0
  529. package/scripts/run/run-ship-scoped.ts +1 -0
  530. package/scripts/run/run-ship-steps.ts +1 -1
  531. package/scripts/run/run-ship.ts +0 -1
  532. package/scripts/run/run-stage-read.ts +62 -0
  533. package/scripts/run/run-stage.ts +160 -0
  534. package/scripts/run/run-status-cli.ts +3 -16
  535. package/scripts/run/run-step-cli.ts +21 -14
  536. package/scripts/run/run-step.ts +1 -1
  537. package/scripts/run/run-stop-notify.ts +1 -3
  538. package/scripts/run/run-stranded-cli.ts +0 -4
  539. package/scripts/run/run-stranded-detect.ts +2 -2
  540. package/scripts/run/run-tail-cli.ts +17 -11
  541. package/scripts/run/run-tail.ts +2 -0
  542. package/scripts/run/run-tidy-lanes.ts +6 -2
  543. package/scripts/run/run-tidy-stashes.ts +12 -12
  544. package/scripts/run/run-wake-cli.ts +4 -13
  545. package/scripts/run/run-wake-loop.ts +2 -2
  546. package/scripts/run/run-wake.ts +2 -4
  547. package/scripts/run/run-watcher-guard-cli.ts +0 -4
  548. package/scripts/run/run-watcher-guard.ts +18 -12
  549. package/scripts/run/run-watcher-hook.ts +1 -1
  550. package/scripts/safe-chain/ci-installer-pin.ts +11 -5
  551. package/scripts/safe-chain/pack-hook.ts +92 -0
  552. package/scripts/safe-chain/project-config.ts +1 -1
  553. package/scripts/security/security-audit-provision-logic.ts +0 -1
  554. package/scripts/security/security-audit-provision.ts +3 -2
  555. package/scripts/security/security-audit.ts +0 -1
  556. package/scripts/security/security-updates-logic.ts +0 -1
  557. package/scripts/sonar/sonar-hotspots-cli.ts +10 -52
  558. package/scripts/sonar/sonar-hotspots.ts +0 -1
  559. package/scripts/sonar/sonar-new-code-cli.ts +150 -0
  560. package/scripts/sonar/sonar-new-code.ts +79 -0
  561. package/scripts/sonar/sonar-project.ts +97 -0
  562. package/scripts/split/split-assess-cli.ts +1 -1
  563. package/scripts/split/split-assess.ts +2 -5
  564. package/scripts/sync/managed-config-scope-cli.ts +1 -1
  565. package/scripts/sync/skill-migration.ts +0 -1
  566. package/scripts/sync/sync-ai-files.ts +4 -0
  567. package/scripts/sync/sync-hook-safety.ts +2 -3
  568. package/scripts/sync/sync.ts +1 -8
  569. package/scripts/sync/template-source-logic.ts +0 -1
  570. package/scripts/sync/workflow-pin-logic.ts +16 -28
  571. package/scripts/test/test-declared-changed.ts +13 -16
  572. package/scripts/test/test-declared-logic.ts +0 -1
  573. package/scripts/test/test-declared.ts +3 -9
  574. package/scripts/test/test-red-commit.ts +2 -2
  575. package/scripts/test/test-red.ts +14 -7
  576. package/scripts/test/test-type-logic.ts +1 -1
  577. package/scripts/test/unit-worker-share.ts +7 -16
  578. package/scripts/time-runtime/time-batch-guard.ts +1 -2
  579. package/scripts/time-runtime/time-bundle-call.ts +0 -1
  580. package/scripts/time-runtime/time-bundles.ts +0 -4
  581. package/scripts/time-runtime/time-density-hook.ts +0 -2
  582. package/scripts/time-runtime/time-followup-stage.ts +1 -1
  583. package/scripts/time-runtime/time-format.ts +0 -73
  584. package/scripts/time-runtime/time-round-trips.ts +0 -4
  585. package/scripts/time-runtime/time-single-check.ts +1 -1
  586. package/scripts/time-runtime/time-spans.ts +1 -1
  587. package/scripts/time-runtime/time-transcript-line.ts +1 -2
  588. package/scripts/ui/ui-routes-cli.ts +0 -5
  589. package/scripts/ui/ui-routes.ts +0 -5
  590. package/scripts/version/effective-upstream.ts +2 -2
  591. package/scripts/version/latest-corepack.ts +7 -9
  592. package/scripts/version/latest-scope-cli.ts +0 -2
  593. package/scripts/version/latest-update.ts +0 -2
  594. package/scripts/version/npm-registry.ts +2 -2
  595. package/scripts/version/publishable-range-check.ts +1 -1
  596. package/scripts/version/release-hold.ts +0 -4
  597. package/scripts/version/running-binary.ts +2 -2
  598. package/scripts/version/version-check-logic.ts +0 -2
  599. package/scripts/version/version-commands.ts +11 -1
  600. package/scripts/version/version-remote.ts +3 -3
  601. package/scripts/version/version-targets.ts +4 -4
  602. package/templates/CLAUDE.basic.md +6 -6
  603. package/templates/sonar-project.properties +28 -1
  604. package/templates/workflows/ci.yml +16 -82
  605. package/templates/workflows/dependabot-auto-merge.yml +6 -3
  606. package/templates/workflows/github-release.yml +79 -0
  607. package/tsconfig.sonar.json +4 -22
  608. package/prompts/collaboration-workflow/cross-repo-epic.md +0 -5
  609. package/prompts/collaboration-workflow/epic-audit.md +0 -5
  610. package/prompts/collaboration-workflow/epic-bundle.md +0 -5
  611. package/scripts/init/plugin-install-hint.ts +0 -47
  612. package/scripts/version/parse-json.ts +0 -13
  613. /package/scripts/{git → followup}/git-followup-stages.ts +0 -0
  614. /package/scripts/{git → gh}/git-gh-api-path.ts +0 -0
  615. /package/scripts/{git → gh}/git-gh-command.ts +0 -0
  616. /package/scripts/{git → gh}/git-gh-issue.ts +0 -0
  617. /package/scripts/{git → gh}/git-gh-pr-snapshot.ts +0 -0
  618. /package/scripts/{git → gh}/git-gh-reachability.ts +0 -0
  619. /package/scripts/{git → gh}/git-gh-repo.ts +0 -0
  620. /package/scripts/{git → gh}/git-gh-rest-state.ts +0 -0
  621. /package/scripts/{git → gh}/git-pr-checks-watch.ts +0 -0
  622. /package/scripts/{git → gh}/git-pr-error.ts +0 -0
  623. /package/scripts/{git → gh}/git-pr-messages.ts +0 -0
  624. /package/scripts/{git → gh}/github-issue-url.ts +0 -0
  625. /package/scripts/git/{stash-orphans.ts → stash/stash-orphans.ts} +0 -0
  626. /package/scripts/{git → issue}/issue-reference.ts +0 -0
  627. /package/scripts/{git → lib}/animation-helpers.ts +0 -0
  628. /package/scripts/{git → lib}/git-animation.ts +0 -0
  629. /package/scripts/{git → notify}/git-notify.ts +0 -0
  630. /package/scripts/{git → notify}/telegram-test-logic.ts +0 -0
@@ -3,6 +3,7 @@ import { fileURLToPath } from 'node:url'
3
3
  import { run_halfrun_resume } from './run-halfrun-resume'
4
4
  import { run_hold, type HoldRead, type RunHold } from './run-hold'
5
5
  import { run_preflight, type PreflightDecision } from './run-preflight'
6
+ import { run_prrun_resume } from './run-prrun-resume'
6
7
  import { run_tidy_cli } from './run-tidy-cli'
7
8
 
8
9
  // `josh run:hold [<N>]` and `josh run:release [<N> | --force]` — the working-tree guard the typed
@@ -48,11 +49,13 @@ const FORCE_FLAG = '--force'
48
49
  // implementation cut outside a lane resumes as `fullrun #N` (joshuafolkken/kit#2760).
49
50
  const FULLRUN_FLAG = '--fullrun'
50
51
  const HALFRUN_STOP_FLAG = '--halfrun-stop'
52
+ // A `prrun`'s stop before merge (joshuafolkken/kit#3023): its record keeps the commit it stopped on.
53
+ const PRRUN_STOP_FLAG = '--prrun-stop'
51
54
  // The most a claim reads: the issue number and the one flag after it.
52
55
  const MAX_CLAIM_ARGUMENTS = 2
53
56
  const ISSUE_NUMBER_PATTERN = /^[1-9]\d*$/u
54
57
  const USAGE =
55
- 'Usage: josh run:hold [<issue-number> [--fullrun | --halfrun-stop]] | josh run:release [<issue-number> | --force]'
58
+ 'Usage: josh run:hold [<issue-number> [--fullrun | --halfrun-stop | --prrun-stop]] | josh run:release [<issue-number> | --force]'
56
59
 
57
60
  const HOLD_VERDICT = 'hold'
58
61
  const BUSY_VERDICT = 'busy'
@@ -65,6 +68,7 @@ const HELD_VERDICT = 'held'
65
68
 
66
69
  const FORCE_RELEASE_KIND = 'force-release'
67
70
  const HALFRUN_STOP_KIND = 'halfrun-stop'
71
+ const PRRUN_STOP_KIND = 'prrun-stop'
68
72
 
69
73
  interface ClaimRequest {
70
74
  kind: 'claim'
@@ -72,11 +76,20 @@ interface ClaimRequest {
72
76
  is_fullrun?: boolean
73
77
  }
74
78
 
79
+ interface StopRequest {
80
+ kind: typeof HALFRUN_STOP_KIND | typeof PRRUN_STOP_KIND
81
+ issue: string
82
+ }
83
+
75
84
  type HoldRequest =
76
85
  | ClaimRequest
86
+ | StopRequest
77
87
  | { kind: 'release'; claimant: string }
78
88
  | { kind: typeof FORCE_RELEASE_KIND }
79
- | { kind: typeof HALFRUN_STOP_KIND; issue: string }
89
+
90
+ function is_stop_request(request: HoldRequest): request is StopRequest {
91
+ return request.kind === HALFRUN_STOP_KIND || request.kind === PRRUN_STOP_KIND
92
+ }
80
93
 
81
94
  const FORCE_RELEASE_REQUEST: HoldRequest = { kind: FORCE_RELEASE_KIND }
82
95
 
@@ -84,12 +97,20 @@ function release_request(claimant: string): HoldRequest {
84
97
  return { kind: 'release', claimant }
85
98
  }
86
99
 
87
- // The flag after a numbered claim: absent, `--fullrun` or `--halfrun-stop`. Anything else is a usage
88
- // error.
100
+ const STOP_KIND_BY_FLAG: ReadonlyMap<string, typeof HALFRUN_STOP_KIND | typeof PRRUN_STOP_KIND> =
101
+ new Map([
102
+ [HALFRUN_STOP_FLAG, HALFRUN_STOP_KIND],
103
+ [PRRUN_STOP_FLAG, PRRUN_STOP_KIND],
104
+ ])
105
+
106
+ // The flag after a numbered claim: absent, `--fullrun`, `--halfrun-stop` or `--prrun-stop`. Anything
107
+ // else is a usage error.
89
108
  function numbered_claim(issue: string, flag: string | undefined): HoldRequest | undefined {
90
109
  if (flag === undefined) return { kind: 'claim', issue }
91
110
 
92
- if (flag === HALFRUN_STOP_FLAG) return { kind: HALFRUN_STOP_KIND, issue }
111
+ const stop_kind = STOP_KIND_BY_FLAG.get(flag)
112
+
113
+ if (stop_kind !== undefined) return { kind: stop_kind, issue }
93
114
 
94
115
  return flag === FULLRUN_FLAG ? { kind: 'claim', issue, is_fullrun: true } : undefined
95
116
  }
@@ -293,8 +314,12 @@ async function read_worktree(): Promise<string | undefined> {
293
314
 
294
315
  // **A `halfrun` stop marks its own record** (joshuafolkken/kit#2796) — the positive "this run has ended
295
316
  // over its verified diff" that `run:entry` adopts on `fullrun #N`. Another run's record is left alone.
296
- function mark_halfrun_stop(target: string, issue: string): number {
297
- const mark = run_halfrun_resume.mark_stop_at(target, issue)
317
+ // A `prrun` stop marks its record the same way, with the commit it stopped on (joshuafolkken/kit#3023).
318
+ async function mark_stop(target: string, request: StopRequest): Promise<number> {
319
+ const mark =
320
+ request.kind === PRRUN_STOP_KIND
321
+ ? await run_prrun_resume.mark_stop_at(target, request.issue)
322
+ : run_halfrun_resume.mark_stop_at(target, request.issue)
298
323
 
299
324
  if (mark === run_halfrun_resume.MARKED) return report_hold()
300
325
 
@@ -306,7 +331,7 @@ function mark_halfrun_stop(target: string, issue: string): number {
306
331
  async function dispatch(request: HoldRequest, target: string, is_linked: boolean): Promise<number> {
307
332
  if (request.kind === 'claim') return await claim(target, request, is_linked)
308
333
 
309
- if (request.kind === HALFRUN_STOP_KIND) return mark_halfrun_stop(target, request.issue)
334
+ if (is_stop_request(request)) return await mark_stop(target, request)
310
335
 
311
336
  if (request.kind === FORCE_RELEASE_KIND) return force_release(target)
312
337
 
@@ -351,8 +376,6 @@ const run_hold_cli = {
351
376
  RELEASED_VERDICT,
352
377
  UNKNOWN_VERDICT,
353
378
  USAGE,
354
- blocking_message,
355
- main,
356
379
  parse_request,
357
380
  run,
358
381
  }
@@ -1,5 +1,6 @@
1
1
  import { git_command } from '#scripts/git/git-command'
2
2
  import { stamp_file } from '#scripts/josh/stamp-file'
3
+ import { error_text } from '#scripts/lib/error-message'
3
4
  import { z } from 'zod'
4
5
 
5
6
  // joshuafolkken/kit#1091: `epicrun` asks `epic-busy.ts` whether a *repository* already has a child in
@@ -52,6 +53,10 @@ interface RunHold {
52
53
  // the positive record that the run has *ended* over its verified diff, which is what lets
53
54
  // `fullrun #N` adopt the hold. A running `halfrun` or a `backlogrun` child never carries it.
54
55
  is_halfrun_stop?: boolean | undefined
56
+ // Set only at a `prrun`'s stop before merge (`run:hold <N> --prrun-stop`, joshuafolkken/kit#3023): the
57
+ // commit the green pull request stood on, so `fullrun #N` can tell an untouched branch — merge it —
58
+ // from one that moved since and has to pass the gate and the review again.
59
+ prrun_stop_head?: string | undefined
55
60
  }
56
61
 
57
62
  type HoldRead =
@@ -92,6 +97,7 @@ const run_hold_schema = z.object({
92
97
  pid: z.number(),
93
98
  is_fullrun: z.boolean().optional(),
94
99
  is_halfrun_stop: z.boolean().optional(),
100
+ prrun_stop_head: z.string().optional(),
95
101
  })
96
102
 
97
103
  // `undefined` for anything that is not a well-formed record, so the caller decides what a broken one
@@ -161,9 +167,24 @@ function create_hold(
161
167
  return stamp_file.create_stamp(target, build_hold(issue, now, is_fullrun))
162
168
  }
163
169
 
164
- // The claim a `halfrun` stop leaves behind: the same exclusive create, carrying the stop mark.
170
+ // What a stopped run's record carries on top of the claim: the `halfrun` stop's flag, or the commit a
171
+ // `prrun` stop stood on (joshuafolkken/kit#3023).
172
+ type StopMarkFields = Pick<RunHold, 'is_halfrun_stop' | 'prrun_stop_head'>
173
+
174
+ const HALFRUN_STOP_FIELDS: StopMarkFields = { is_halfrun_stop: true }
175
+
176
+ // The claim a stop leaves behind: the same exclusive create, carrying the stop mark.
177
+ function create_stop_hold(
178
+ target: string,
179
+ issue: string,
180
+ mark: StopMarkFields,
181
+ now: Date = new Date(),
182
+ ): boolean {
183
+ return stamp_file.create_stamp(target, { ...build_hold(issue, now), ...mark })
184
+ }
185
+
165
186
  function create_halfrun_stop_hold(target: string, issue: string, now: Date = new Date()): boolean {
166
- return stamp_file.create_stamp(target, { ...build_hold(issue, now), is_halfrun_stop: true })
187
+ return create_stop_hold(target, issue, HALFRUN_STOP_FIELDS, now)
167
188
  }
168
189
 
169
190
  // **A tree with uncommitted work in it is never handed over, however old its record is.** No age can
@@ -176,7 +197,9 @@ async function is_tree_dirty(directory?: string): Promise<boolean> {
176
197
  const status = await git_command.status(directory)
177
198
 
178
199
  return status.trim() !== ''
179
- } catch {
200
+ } catch (error) {
201
+ error_text.trace_swallowed('run_hold.is_tree_dirty', error)
202
+
180
203
  return true
181
204
  }
182
205
  }
@@ -260,8 +283,9 @@ const run_hold = {
260
283
  UNNUMBERED_ISSUE,
261
284
  classify,
262
285
  create_halfrun_stop_hold,
286
+ create_stop_hold,
287
+ HALFRUN_STOP_FIELDS,
263
288
  create_hold,
264
- describe_holder,
265
289
  foreign_release_message,
266
290
  forced_release_message,
267
291
  held_message,
@@ -270,7 +294,6 @@ const run_hold = {
270
294
  is_own_hold,
271
295
  is_tree_dirty,
272
296
  own_release_command,
273
- parse_hold,
274
297
  race_message,
275
298
  read_hold,
276
299
  release_hold,
@@ -282,5 +305,5 @@ const run_hold = {
282
305
  write_hold,
283
306
  }
284
307
 
285
- export type { HoldRead, RunHold }
308
+ export type { HoldRead, RunHold, StopMarkFields }
286
309
  export { run_hold }
@@ -14,6 +14,6 @@ function require_issue_number(issue: string): void {
14
14
  if (!ISSUE_NUMBER_PATTERN.test(issue)) throw new Error(`${BAD_ISSUE_MESSAGE}${issue}`)
15
15
  }
16
16
 
17
- const run_issue_number = { BAD_ISSUE_MESSAGE, ISSUE_NUMBER_PATTERN, require_issue_number }
17
+ const run_issue_number = { ISSUE_NUMBER_PATTERN, require_issue_number }
18
18
 
19
19
  export { run_issue_number }
@@ -89,10 +89,6 @@ interface ParsedArguments {
89
89
  values: ParsedValues
90
90
  }
91
91
 
92
- function read_arguments(argv: ReadonlyArray<string>): ParsedArguments | undefined {
93
- return cli_flags.parse_or_undefined({ args: [...argv], options: OPTIONS, allowPositionals: true })
94
- }
95
-
96
92
  function is_valid_target(parsed: ParsedArguments): boolean {
97
93
  return (
98
94
  parsed.positionals.length === 1 &&
@@ -136,7 +132,7 @@ function to_request(parsed: ParsedArguments): LivenessRequest {
136
132
  }
137
133
 
138
134
  function parse_request(argv: ReadonlyArray<string>): LivenessRequest | undefined {
139
- const parsed = read_arguments(argv)
135
+ const parsed = cli_flags.arguments_of(argv, OPTIONS)
140
136
 
141
137
  if (parsed === undefined || !is_valid(parsed)) return undefined
142
138
 
@@ -159,7 +155,7 @@ async function main(argv: ReadonlyArray<string>): Promise<void> {
159
155
  process.exitCode = await run(argv)
160
156
  }
161
157
 
162
- const run_liveness_cli = { USAGE, main, parse_request, run }
158
+ const run_liveness_cli = { USAGE, parse_request, run }
163
159
 
164
160
  if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
165
161
 
@@ -3,8 +3,8 @@ import { homedir, tmpdir } from 'node:os'
3
3
  import path from 'node:path'
4
4
  import { setTimeout as sleep } from 'node:timers/promises'
5
5
  import { agent_event, type AgentEventState } from '#scripts/agent/agent-event'
6
- import { git_gh_issue_read } from '#scripts/git/git-gh-issue-read'
7
- import { ALREADY_DONE_LABEL, NEEDS_DECISION_LABEL } from '#scripts/git/issue-labels'
6
+ import { git_gh_issue_read } from '#scripts/gh/git-gh-issue-read'
7
+ import { ALREADY_DONE_LABEL, NEEDS_DECISION_LABEL } from '#scripts/issue/issue-labels'
8
8
  import { issue_state } from '#scripts/issue/issue-state'
9
9
  import { PLATFORM_TEMP_ROOT } from '#scripts/josh/platform-temporary'
10
10
  import { run_hold } from './run-hold'
@@ -401,7 +401,6 @@ const run_liveness = {
401
401
  decide,
402
402
  describe_agent_state,
403
403
  read_child_settled,
404
- read_agent_state,
405
404
  read_output_frozen,
406
405
  sample_output,
407
406
  to_safe_path,
@@ -1,10 +1,11 @@
1
1
  #!/usr/bin/env tsx
2
2
  import { fileURLToPath } from 'node:url'
3
- import { parseArgs } from 'node:util'
4
3
  import { api_outage } from '#scripts/agent/api-outage'
5
4
  import { CONTEXT_CUT_THRESHOLD } from '#scripts/cost-runtime/context-cut-threshold'
6
5
  import { issue_closing_pr } from '#scripts/issue/issue-closing-pr'
7
6
  import { issue_state_cli } from '#scripts/issue/issue-state-cli'
7
+ import { lane_handoff } from '#scripts/lane/lane-handoff'
8
+ import { cli_flags } from '#scripts/lib/cli-flags'
8
9
  import { run_carry, type CarryOwner, type RunCarry } from './run-carry'
9
10
  import { run_ending } from './run-ending'
10
11
  import { run_event_stream } from './run-event-stream'
@@ -12,8 +13,6 @@ import { run_event_stream_emit } from './run-event-stream-emit'
12
13
  import { run_issue_number } from './run-issue-number'
13
14
  import { run_merge, type ChildOutcome, type EndingSignals } from './run-merge'
14
15
  import { run_merge_steps, type MergeContext } from './run-merge-steps'
15
- import { run_ship_detach } from './run-ship-detach'
16
- import { run_ship_probe } from './run-ship-probe'
17
16
 
18
17
  // `josh run:merge <N>` — one composite command for a `backlogrun` merge event (joshuafolkken/kit#2024).
19
18
  // The parent's context is the largest and its per-turn cost the highest, and the event was two turns:
@@ -70,14 +69,6 @@ interface ParsedArguments {
70
69
  values: Partial<Record<'epic' | 'output' | 'over' | 'owner' | 'repo', string>>
71
70
  }
72
71
 
73
- function read_args(argv: ReadonlyArray<string>): ParsedArguments | undefined {
74
- try {
75
- return parseArgs({ args: [...argv], options: OPTIONS, allowPositionals: true, strict: true })
76
- } catch {
77
- return undefined
78
- }
79
- }
80
-
81
72
  // Absent owner is "no owner declared", which the carry guard reads as not provably foreign; a present
82
73
  // but malformed pid invalidates the invocation rather than silently counting unguarded.
83
74
  function to_owner(raw: string | undefined): CarryOwner | undefined {
@@ -171,7 +162,7 @@ function to_context(parsed: ParsedArguments): MergeContext | undefined {
171
162
  }
172
163
 
173
164
  function parse(argv: ReadonlyArray<string>): MergeContext | undefined {
174
- const parsed = read_args(argv)
165
+ const parsed = cli_flags.arguments_of(argv, OPTIONS)
175
166
 
176
167
  return parsed === undefined ? undefined : to_context(parsed)
177
168
  }
@@ -316,7 +307,10 @@ async function on_cut(ctx: MergeContext): Promise<MergeVerdict> {
316
307
 
317
308
  // A child that parked itself: nothing is counted, but the park is written to the stream as a failed
318
309
  // child's is, so a reader restoring the run from its events sees the child settled (joshuafolkken/kit#2508).
310
+ // Its `in-progress` is dropped as a failed child's is: left on, it outlived the `needs-decision` a
311
+ // person later lifted, and a `run:solo` child then held the whole backlog (joshuafolkken/kit#3017).
319
312
  async function on_parked(ctx: MergeContext): Promise<MergeVerdict> {
313
+ await run_merge_steps.remove_in_progress(ctx.child)
320
314
  await run_event_stream_emit.emit(run_event_stream.EVENT_KIND.PARK, `#${ctx.child} parked`)
321
315
 
322
316
  return emit(await run_merge_steps.ask_next(ctx), SUCCESS_EXIT_CODE)
@@ -355,18 +349,10 @@ const HANDLERS: Readonly<Record<ChildOutcome, (ctx: MergeContext) => Promise<Mer
355
349
  shipping: on_shipping,
356
350
  }
357
351
 
358
- async function is_ship_running(child: string): Promise<boolean> {
359
- const repository = await run_ship_probe.repository_directory()
360
-
361
- return (
362
- repository !== undefined && run_ship_detach.read_result(repository, child)?.result === 'running'
363
- )
364
- }
365
-
366
352
  // The whole merge event for one returned child, in-process: read its state, classify it, and run the
367
353
  // handler. The CLI prints the token; `backlog:drive` branches on the outcome (joshuafolkken/kit#2508).
368
354
  async function merge_child(ctx: MergeContext): Promise<MergeResult> {
369
- if (await is_ship_running(ctx.child)) {
355
+ if (lane_handoff.is_ship_running(ctx.child, process.cwd())) {
370
356
  return { outcome: 'shipping', ...(await on_shipping()) }
371
357
  }
372
358
 
@@ -405,8 +391,6 @@ const run_merge_cli = {
405
391
  RESUMED_TOKEN,
406
392
  RETRY_TOKEN,
407
393
  STOP_TOKEN,
408
- USAGE,
409
- main,
410
394
  merge_child,
411
395
  parse,
412
396
  run,
@@ -1,9 +1,9 @@
1
1
  import { existsSync } from 'node:fs'
2
2
  import path from 'node:path'
3
- import { git_followup_issue_close } from '#scripts/git/git-followup-issue-close'
4
- import { git_gh_issue_write } from '#scripts/git/git-gh-issue-write'
5
- import { git_stash } from '#scripts/git/git-stash'
6
- import { IN_PROGRESS_LABEL, NEEDS_DECISION_LABEL } from '#scripts/git/issue-labels'
3
+ import { git_followup_issue_close } from '#scripts/followup/git-followup-issue-close'
4
+ import { git_gh_issue_write } from '#scripts/gh/git-gh-issue-write'
5
+ import { git_stash } from '#scripts/git/stash/git-stash'
6
+ import { IN_PROGRESS_LABEL, NEEDS_DECISION_LABEL } from '#scripts/issue/issue-labels'
7
7
  import { josh_command, type JoshResult } from '#scripts/josh/josh-run'
8
8
  import { lane_close } from '#scripts/lane/lane-close'
9
9
  import { lane_reap } from '#scripts/lane/lane-reap'
@@ -347,7 +347,6 @@ async function ask_next(ctx: MergeContext): Promise<string> {
347
347
 
348
348
  const run_merge_steps = {
349
349
  CUT_RELAUNCH_CAUSE,
350
- apply_carry,
351
350
  ask_next,
352
351
  do_failed,
353
352
  do_merged,
@@ -355,6 +354,7 @@ const run_merge_steps = {
355
354
  has_resumable_cut,
356
355
  is_over_budget,
357
356
  refused_carry,
357
+ remove_in_progress,
358
358
  resume_cut,
359
359
  }
360
360
 
@@ -3,7 +3,7 @@ import {
3
3
  EPIC_LABEL,
4
4
  has_label_name,
5
5
  NEEDS_DECISION_LABEL,
6
- } from '#scripts/git/issue-labels'
6
+ } from '#scripts/issue/issue-labels'
7
7
  import type { IssueState } from '#scripts/issue/issue-state'
8
8
  import type { CarryChange, RunCarry } from './run-carry'
9
9
 
@@ -41,7 +41,7 @@ async function main(argv: ReadonlyArray<string>): Promise<void> {
41
41
  process.exitCode = await run(argv)
42
42
  }
43
43
 
44
- const run_next_cli = { USAGE, main, run }
44
+ const run_next_cli = { run }
45
45
 
46
46
  if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
47
47
 
@@ -3,6 +3,7 @@ import { cost_cli, type CostVerdict } from '#scripts/cost-runtime/cost-cli'
3
3
  import { cost_format } from '#scripts/cost-runtime/cost-format'
4
4
  import { cost_verdict } from '#scripts/cost-runtime/cost-verdict'
5
5
  import { hook_decision } from '#scripts/josh/hook-decision'
6
+ import { error_text } from '#scripts/lib/error-message'
6
7
  import { implementation_cut_verdict } from '#scripts/rules/implementation-cut-verdict'
7
8
  import { run_carry, type RunCarry } from './run-carry'
8
9
  import { run_headless } from './run-headless'
@@ -104,7 +105,9 @@ async function refusal_for(
104
105
  function is_unit_call(raw_payload: string): boolean {
105
106
  try {
106
107
  return (hook_decision.parse_hook_payload(raw_payload)?.agent_id ?? '') !== ''
107
- } catch {
108
+ } catch (error) {
109
+ error_text.trace_swallowed('run_parent_cut_hook.is_unit_call', error)
110
+
108
111
  return false
109
112
  }
110
113
  }
@@ -135,7 +138,6 @@ async function parent_cut_reason(
135
138
  const run_parent_cut_hook = {
136
139
  PARENT_CUT_REASON,
137
140
  QUIET_WINDOW_MS,
138
- STAMP_PREFIX,
139
141
  SWITCH_ENV_KEY,
140
142
  parent_cut_reason,
141
143
  }
@@ -1,5 +1,5 @@
1
+ import { git_gh_pr_read } from '#scripts/gh/git-gh-pr-read'
1
2
  import { git_command } from '#scripts/git/git-command'
2
- import { git_gh_pr_read } from '#scripts/git/git-gh-pr-read'
3
3
  import { lane_registry, type LaneInfo } from '#scripts/lane/lane-registry'
4
4
  import { z } from 'zod'
5
5
  import { run_hold } from './run-hold'
@@ -89,7 +89,7 @@ const STASH_LABEL_PREFIX = 'run:hold reclaimed before #'
89
89
  // so the shape it may take is pinned beside the interpolation rather than only in the CLI that
90
90
  // happens to be today's single caller. `run:liveness` interpolates it the same way, so the pattern
91
91
  // and the refusal live in one module both read (joshuafolkken/kit#1485).
92
- const { ISSUE_NUMBER_PATTERN, require_issue_number } = run_issue_number
92
+ const { require_issue_number } = run_issue_number
93
93
  const UNREADABLE_PR_MESSAGE = 'The pull request could not be read for branch '
94
94
 
95
95
  function needs_reclaim(tree: TreeState): boolean {
@@ -385,15 +385,8 @@ async function check(issue: string): Promise<PreflightDecision> {
385
385
  }
386
386
 
387
387
  const run_preflight = {
388
- CLEAN_ADVICE,
389
- CLEAN_REASON,
390
388
  CLEAN_VERDICT,
391
- ISSUE_NUMBER_PATTERN,
392
- PARK_ADVICE,
393
- PARK_VERDICT,
394
- RECLAIM_VERDICT,
395
389
  RESUME_ADVICE,
396
- RESUME_VERDICT,
397
390
  MERGED_PR,
398
391
  STASH_LABEL_PREFIX,
399
392
  check,
@@ -1,9 +1,10 @@
1
1
  #!/usr/bin/env tsx
2
2
  import { fileURLToPath } from 'node:url'
3
- import { git_stash } from '#scripts/git/git-stash'
3
+ import { git_stash } from '#scripts/git/stash/git-stash'
4
4
  import { issue_read_cli, type BlockRead } from '#scripts/issue/issue-read-cli'
5
5
  import { issue_state_cli, type StateRead } from '#scripts/issue/issue-state-cli'
6
6
  import { lane_child_marker } from '#scripts/lane/lane-child-marker'
7
+ import { error_text } from '#scripts/lib/error-message'
7
8
  import { latest_scope_cli } from '#scripts/version/latest-scope-cli'
8
9
  import { run_prep, type PrepParts } from './run-prep'
9
10
  import { run_prep_locate } from './run-prep-locate'
@@ -82,7 +83,9 @@ async function lane_has_changes(): Promise<boolean> {
82
83
 
83
84
  try {
84
85
  return await git_stash.has_changes(process.cwd())
85
- } catch {
86
+ } catch (error) {
87
+ error_text.trace_swallowed('run_prep_cli.lane_has_changes', error)
88
+
86
89
  return false
87
90
  }
88
91
  }
@@ -150,7 +153,7 @@ async function main(argv: ReadonlyArray<string>): Promise<void> {
150
153
  // `gather` and `to_parts` are exported so `run:next` reads the same state from the same three reads
151
154
  // rather than growing a second copy of the gather (joshuafolkken/kit#2188) — `run:next` is the
152
155
  // consumer of `run:prep` the epic #2166 wanted.
153
- const run_prep_cli = { USAGE, gather, main, parse_number, run, to_parts }
156
+ const run_prep_cli = { gather, parse_number, run, to_parts }
154
157
 
155
158
  if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
156
159
 
@@ -159,7 +159,7 @@ async function locate(text: string): Promise<string> {
159
159
  return format_locations(located)
160
160
  }
161
161
 
162
- const run_prep_locate = { extract_targets, format_locations, locate, parse_hits }
162
+ const run_prep_locate = { extract_targets, locate, parse_hits }
163
163
 
164
164
  export type { Hit, Located }
165
165
  export { run_prep_locate }
@@ -12,6 +12,12 @@ import { run_progress_config } from './run-progress-config'
12
12
  // only a heartbeat the caller restarts on the next interval, so the two guard different things and
13
13
  // only one has anything to lose by being short.
14
14
  const DEFAULT_MAX_HOURS = 1
15
+ // **`--wait` is bounded by a run, not by three intervals** (joshuafolkken/kit#3102). It no longer exits
16
+ // at its first report — the reports go to the event stream — so its one-hour bound would be the last
17
+ // wake that asks the parent for no judgement, a restart an hour. Eight hours is `run:hold`'s expiry;
18
+ // what ends a finished run's watcher sooner is `josh followup` removing its life record, and a stop
19
+ // tearing it down in the same turn.
20
+ const DEFAULT_WAIT_MAX_HOURS = 8
15
21
  const MS_PER_HOUR = 3_600_000
16
22
 
17
23
  const OPTIONS = {
@@ -37,7 +43,7 @@ interface ParsedValues {
37
43
  }
38
44
 
39
45
  function read_arguments(argv: ReadonlyArray<string>): ParsedValues | undefined {
40
- return cli_flags.parse_or_undefined({ args: [...argv], options: OPTIONS })?.values
46
+ return cli_flags.values_of(argv, OPTIONS)
41
47
  }
42
48
 
43
49
  // A hand-typed `--interval` outranks the environment, the environment outranks the interval the
@@ -48,14 +54,24 @@ function to_interval_ms(raw: string | undefined): number {
48
54
  return run_progress_config.resolve_interval_ms(raw)
49
55
  }
50
56
 
51
- function to_max_ms(raw: string | undefined): number {
57
+ function default_hours(is_wait: boolean): number {
58
+ return is_wait ? DEFAULT_WAIT_MAX_HOURS : DEFAULT_MAX_HOURS
59
+ }
60
+
61
+ function to_max_ms(raw: string | undefined, is_wait = false): number {
52
62
  const hours = Number(raw)
53
63
  const is_usable = raw !== undefined && Number.isFinite(hours) && hours > 0
54
64
 
55
- return (is_usable ? hours : DEFAULT_MAX_HOURS) * MS_PER_HOUR
65
+ return (is_usable ? hours : default_hours(is_wait)) * MS_PER_HOUR
56
66
  }
57
67
 
58
- const run_progress_args = { DEFAULT_MAX_HOURS, read_arguments, to_interval_ms, to_max_ms }
68
+ const run_progress_args = {
69
+ DEFAULT_MAX_HOURS,
70
+ DEFAULT_WAIT_MAX_HOURS,
71
+ read_arguments,
72
+ to_interval_ms,
73
+ to_max_ms,
74
+ }
59
75
 
60
76
  export type { ParsedValues }
61
77
  export { run_progress_args }