@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
@@ -0,0 +1,106 @@
1
+ import { run_ship_stage, type Stage } from './run-ship-stage'
2
+ import type { ShipArguments } from './run-ship-steps'
3
+
4
+ // The command a relaunched lane child runs once it has fixed what stopped its detached ship
5
+ // (joshuafolkken/kit#2964). The ship-stop prompt used to say only "hand the region back per
6
+ // chain-rule.md", so every relaunched session searched that document and re-derived the next command
7
+ // — 179 reads of it in one run. The stopped stage decides the command mechanically, so it is decided
8
+ // here, once, and the prompt carries it. `chain-rule.md` step 0 stays the single source of the
9
+ // procedure; `ship-stop-prompt-document-rule.test.ts` holds every command below to it.
10
+ //
11
+ // The fix is left uncommitted on purpose: a dirty tree reads as not committed
12
+ // (`run-ship-probe.ts`), so a re-detached ship runs the gate and the commit again on the fixed tree
13
+ // instead of passing over them.
14
+ //
15
+ // **Every route is a re-detach.** The prompt only ever reaches a lane child, and a lane child's commit
16
+ // and push belong to the detached ship (`scripts/rules/lane-background.ts`), so a `josh git -y` here could never
17
+ // run. The rounds are the supervisor's too: under `--review` it skips a round 1 already recorded for the
18
+ // issue and asks `review:round2` itself after the commit (`run-ship-review-steps.ts`), so the fix delta
19
+ // is verified as round 2 rather than reviewed again as round 1.
20
+ //
21
+ // **The re-run carries the stopped ship's own options.** A preflight that stopped on missing live
22
+ // evidence asks for `--body-file`, and `followup` delivers the body from it; a command naming only
23
+ // the title would stop on the same evidence again, and drop the `--cite` follow-ups `run:tail` reads.
24
+
25
+ const { STAGE } = run_ship_stage
26
+
27
+ const COMMAND = {
28
+ LOG: 'pnpm josh ship --log',
29
+ DETACH: 'pnpm josh ship --detach',
30
+ DETACH_REVIEW: 'pnpm josh ship --detach --review',
31
+ } as const
32
+
33
+ // A single quote cannot appear inside single quotes, so it closes the quote, escapes one, and reopens.
34
+ const ESCAPED_QUOTE = String.raw`'\''`
35
+
36
+ // A token of only these characters means the same to the shell quoted or not, so it is left bare.
37
+ const BARE_WORD = /^[\w%+,./:=@-]+$/u
38
+
39
+ // What a stopped ship is re-run with: its title, every option it was started with, and whether it
40
+ // carried `--review` — the one option a route decides rather than repeats.
41
+ interface ShipResume {
42
+ title: string
43
+ flags: ReadonlyArray<string>
44
+ is_review: boolean
45
+ }
46
+
47
+ // Single quotes, so a `$` or a backtick in a title is never expanded by the shell that runs it.
48
+ function quoted(title: string): string {
49
+ return `'${title.split("'").join(ESCAPED_QUOTE)}'`
50
+ }
51
+
52
+ function shell_word(token: string): string {
53
+ return BARE_WORD.test(token) ? token : quoted(token)
54
+ }
55
+
56
+ // A supervised ship's notify tail is already file-form (`run-ship-detach.ts`), so every flag is a path
57
+ // or an issue number and fits the prompt.
58
+ function resume_of(args: ShipArguments): ShipResume {
59
+ const cites = args.cites.flatMap((cite) => ['--cite', cite])
60
+
61
+ return {
62
+ title: args.title,
63
+ flags: [...args.notify, ...args.body, ...cites],
64
+ is_review: args.is_review,
65
+ }
66
+ }
67
+
68
+ // The command prefix stays as written; only the stopped ship's own tokens are quoted where needed.
69
+ function ship_command(command: string, resume: ShipResume): string {
70
+ const words = [...resume.flags, resume.title].map((token) => shell_word(token))
71
+
72
+ return [command, ...words].join(' ')
73
+ }
74
+
75
+ // After the merge-side stages, or after round 2 — which is final — the re-detach reviews nothing.
76
+ function detach_again(resume: ShipResume): string {
77
+ return `leave the fix uncommitted and run \`${ship_command(COMMAND.DETACH, resume)}\`.`
78
+ }
79
+
80
+ // Before round 2 the re-run takes the stopped ship's own shape: `--review` only when it carried it. A
81
+ // reviewing ship skips its recorded round 1 and decides round 2 after the commit; a ship started
82
+ // without `--review` was re-detached after round 2, which is final, so it reviews nothing.
83
+ function detach_as_started(resume: ShipResume): string {
84
+ const command = resume.is_review ? COMMAND.DETACH_REVIEW : COMMAND.DETACH
85
+
86
+ return `leave the fix uncommitted and run \`${ship_command(command, resume)}\`.`
87
+ }
88
+
89
+ const AFTER_FIX: Record<Stage, (resume: ShipResume) => string> = {
90
+ [STAGE.PREFLIGHT]: detach_as_started,
91
+ [STAGE.REVIEW]: detach_as_started,
92
+ [STAGE.GATE]: detach_as_started,
93
+ [STAGE.COMMIT]: detach_as_started,
94
+ [STAGE.ROUND_TWO]: detach_again,
95
+ [STAGE.FOLLOWUP]: detach_again,
96
+ [STAGE.REPORT]: detach_again,
97
+ }
98
+
99
+ // Two lines' worth: read the stopped report, then the one command that resumes after the fix.
100
+ function next_step(issue: string, stage: Stage, resume: ShipResume): string {
101
+ return `Read the stopped report with \`${COMMAND.LOG} ${issue}\`, fix the ${stage} failure, then ${AFTER_FIX[stage](resume)}`
102
+ }
103
+
104
+ const run_ship_next = { COMMAND, next_step, quoted, resume_of }
105
+
106
+ export { run_ship_next, type ShipResume }
@@ -1,7 +1,7 @@
1
1
  import { readFile } from 'node:fs/promises'
2
+ import { git_gh_command } from '#scripts/gh/git-gh-command'
2
3
  import { changed_paths } from '#scripts/git/changed-paths'
3
4
  import { git_branch } from '#scripts/git/git-branch'
4
- import { git_gh_command } from '#scripts/git/git-gh-command'
5
5
  import { git_preflight } from '#scripts/git/git-preflight'
6
6
  import type { JoshResult } from '#scripts/josh/josh-run'
7
7
  import { error_text } from '#scripts/lib/error-message'
@@ -1,5 +1,6 @@
1
1
  import { git_command } from '#scripts/git/git-command'
2
2
  import { git_worktree } from '#scripts/git/git-worktree'
3
+ import { error_text } from '#scripts/lib/error-message'
3
4
  import { run_hold } from './run-hold'
4
5
  import { run_preflight } from './run-preflight'
5
6
  import { run_ship_stage, type ShipState } from './run-ship-stage'
@@ -20,7 +21,9 @@ const HEAD_REFERENCE = 'HEAD'
20
21
  async function or_false(is_true: () => Promise<boolean>): Promise<boolean> {
21
22
  try {
22
23
  return await is_true()
23
- } catch {
24
+ } catch (error) {
25
+ error_text.trace_swallowed('run_ship_probe.or_false', error)
26
+
24
27
  return false
25
28
  }
26
29
  }
@@ -5,6 +5,7 @@ import { lane_registry, type LaneInfo } from '#scripts/lane/lane-registry'
5
5
  import { lane_relaunch } from '#scripts/lane/lane-relaunch'
6
6
  import { run_event_stream } from './run-event-stream'
7
7
  import { run_event_stream_emit } from './run-event-stream-emit'
8
+ import type { ShipResume } from './run-ship-next'
8
9
  import type { Stage } from './run-ship-stage'
9
10
 
10
11
  // How a detached `josh ship` supervisor hands a stopped stage back (joshuafolkken/kit#2428). The agent
@@ -47,14 +48,18 @@ function note(text: string): void {
47
48
  process.stderr.write(`${text}\n`)
48
49
  }
49
50
 
50
- async function return_control(issue: string, stage: Stage): Promise<ReturnOutcome> {
51
+ async function return_control(
52
+ issue: string,
53
+ stage: Stage,
54
+ resume: ShipResume,
55
+ ): Promise<ReturnOutcome> {
51
56
  await run_event_stream_emit.emit(run_event_stream.EVENT_KIND.SHIP_STOP, stop_text(issue, stage))
52
57
 
53
58
  const lane = await lane_to_relaunch(issue)
54
59
 
55
60
  if (lane === undefined) return 'recorded'
56
61
 
57
- const invocation = lane_child_invocation.ship_stop_invocation(issue)
62
+ const invocation = lane_child_invocation.ship_stop_invocation(issue, { stage, ...resume })
58
63
  const result = lane_relaunch.relaunch(
59
64
  lane,
60
65
  invocation,
@@ -69,7 +74,7 @@ async function return_control(issue: string, stage: Stage): Promise<ReturnOutcom
69
74
  return 'recorded'
70
75
  }
71
76
 
72
- const run_ship_return = { return_control, stop_text }
77
+ const run_ship_return = { return_control }
73
78
 
74
79
  export type { ReturnOutcome }
75
80
  export { run_ship_return }
@@ -5,6 +5,7 @@ import { josh_command, type JoshResult } from '#scripts/josh/josh-run'
5
5
  import { stamp_file } from '#scripts/josh/stamp-file'
6
6
  import { lane_child_marker } from '#scripts/lane/lane-child-marker'
7
7
  import { openai_review_broker } from '#scripts/lane/openai-review-broker'
8
+ import { review_record } from '#scripts/review/review-record'
8
9
  import { detached_launch } from './detached-launch'
9
10
  import { run_ship_review, type RoundOutcome, type ScoredVerdict } from './run-ship-review'
10
11
  import { run_ship_scoped, type Phase } from './run-ship-scoped'
@@ -43,8 +44,10 @@ const ROUND_TWO_DECISION = ['review:round2', '--round-1-closed']
43
44
  const ROUND_TWO_BRIEF = ['review:brief', '--round', '2']
44
45
  const ROUND_TWO_REQUIRED = 'required'
45
46
  const FIXED_JOIN_NOTE =
46
- 'the round-1 gate read the tree before the review fixes — drained, not judged; the gate stage re-runs it.'
47
+ 'the round-1 gate read the tree before the review fixes — drained, not judged; the gate re-runs once the tree is fixed.'
47
48
  const ROUND_TWO_SKIPPED_NOTE = 'round 2 not due — nothing left to verify; shipping on.'
49
+ const ROUND_ONE_RECORDED_NOTE =
50
+ 'round 1 already recorded for this issue — not reviewed again; the gate reads the fixed tree and round 2 decides after the commit.'
48
51
 
49
52
  // The scoped pair's precondition, met by the supervisor itself rather than stopped on
50
53
  // (joshuafolkken/kit#2500), single-sourced with the preflight and gate stages (joshuafolkken/kit#2946).
@@ -125,12 +128,14 @@ function current_verdict(): ReturnType<typeof run_ship_review.read_verdict> {
125
128
 
126
129
  // A red join blocks unless the reviewer fixed findings in place: the background gate then read the
127
130
  // tree before the fixes, so its verdict describes a tree that no longer exists. The join still ran to
128
- // its end, so the gate stage that follows never races it.
131
+ // its end, so the gate stage that follows never races it. Any fix drains it, not only a round whose
132
+ // every finding was fixed — a partial fix moved the tree just the same, and the round then stops on its
133
+ // unfixed finding at the record rather than on a `Gate RED` the gate never earned (joshuafolkken/kit#2961).
129
134
  async function join_gate(): Promise<JoshResult> {
130
135
  const joined = await josh([RUN_REVIEW, '--join'])
131
136
 
132
137
  if (joined.code === SUCCESS_EXIT_CODE) return joined
133
- if (current_verdict().kind !== run_ship_review.VERDICT.FIXED) return joined
138
+ if (!run_ship_review.has_fixes(stamp_file.read_stamp_text(paths().findings))) return joined
134
139
 
135
140
  note(FIXED_JOIN_NOTE)
136
141
 
@@ -191,7 +196,16 @@ async function round_one_record(issue: string): Promise<JoshResult> {
191
196
 
192
197
  // The round-1 review, beside the gate: scoped pair → open → review → join → attest → record, stopping
193
198
  // at the first that did not pass.
199
+ //
200
+ // **A recorded round 1 is not run again** (joshuafolkken/kit#2964). A ship relaunched with `--review`
201
+ // after a round-1 stop would otherwise review the whole change a second time as round 1 — a new Medium
202
+ // there stops it again, and round 2 after the commit makes a third. The fix delta is round 2's to
203
+ // verify, and `round_two_stage` asks whether it is due after the commit.
194
204
  async function review_stage(issue: string): Promise<JoshResult> {
205
+ const recorded = await review_record.check(Number(issue))
206
+
207
+ if (recorded.status === 'ok') return { code: SUCCESS_EXIT_CODE, out: ROUND_ONE_RECORDED_NOTE }
208
+
195
209
  return await run_phases([
196
210
  scoped_pair,
197
211
  ...reviewed([RUN_REVIEW], run_ship_review.reviewer_prompt, issue, '1'),
@@ -221,6 +235,6 @@ async function round_two_stage(issue: string): Promise<JoshResult> {
221
235
  ])
222
236
  }
223
237
 
224
- const run_ship_review_steps = { paths, review_stage, round_two_stage }
238
+ const run_ship_review_steps = { review_stage, round_two_stage }
225
239
 
226
240
  export { run_ship_review_steps }
@@ -162,6 +162,16 @@ function is_clean_round_one(text: string | undefined): boolean {
162
162
  return read_verdict(text).kind === VERDICT.CLEAN
163
163
  }
164
164
 
165
+ // Whether the reviewer edited the tree — any finding marked fixed, whether or not another one still
166
+ // blocks (joshuafolkken/kit#2961). A partial fix moves the tree the background gate read as surely as a
167
+ // full one, so the join reads it red either way; keyed off the verdict kind instead, a round that fixed
168
+ // one Medium and left another stopped at a misleading `Gate RED` before its own blocking note.
169
+ function has_fixes(text: string | undefined): boolean {
170
+ if (text === undefined) return false
171
+
172
+ return spec_findings(text).some((finding) => finding.is_fixed)
173
+ }
174
+
165
175
  // Round 2 is final and reads only, so it passes clean or Low-only alone — a fix it made would itself be
166
176
  // unreviewed.
167
177
  function round_two_outcome(verdict: ScoredVerdict): RoundOutcome {
@@ -174,6 +184,7 @@ const run_ship_review = {
174
184
  FIXED_PREFIX,
175
185
  UNVERIFIED_OUTCOME,
176
186
  VERDICT,
187
+ has_fixes,
177
188
  is_clean_round_one,
178
189
  read_verdict,
179
190
  reviewer_prompt,
@@ -16,6 +16,7 @@ async function run_phases(phases: ReadonlyArray<Phase>): Promise<JoshResult> {
16
16
  let last: JoshResult = { code: SUCCESS_EXIT_CODE, out: '' }
17
17
 
18
18
  for (const phase of phases) {
19
+ // eslint-disable-next-line no-await-in-loop -- phases run in order and the first failure stops the rest
19
20
  last = await phase()
20
21
  if (last.code !== SUCCESS_EXIT_CODE) return last
21
22
  }
@@ -99,7 +99,7 @@ function steps(args: ShipArguments): ReadonlyArray<Step> {
99
99
  return [PREFLIGHT_STEP, REVIEW_STEP, ...COMMIT_STEPS, ROUND_TWO_STEP, ...MERGE_STEPS]
100
100
  }
101
101
 
102
- const run_ship_steps = { steps }
102
+ const run_ship_steps = { PREFLIGHT_STEP, steps }
103
103
 
104
104
  export type { ShipArguments, Step }
105
105
  export { run_ship_steps }
@@ -70,7 +70,6 @@ const run_ship = {
70
70
  ROUND_TWO_HEADER,
71
71
  SKIPPED_BODY,
72
72
  STOPPED_PREFIX,
73
- SUCCESS_EXIT_CODE,
74
73
  exit_code,
75
74
  failed_section,
76
75
  format_report,
@@ -0,0 +1,62 @@
1
+ import { has_label_name, PLANNED_LABEL } from '#scripts/issue/issue-labels'
2
+ import { issue_state_cli, type StateRead } from '#scripts/issue/issue-state-cli'
3
+ import { run_halfrun_resume } from './run-halfrun-resume'
4
+ import { run_prrun_resume, type PrrunToken } from './run-prrun-resume'
5
+ import { run_stage, type StageState } from './run-stage'
6
+
7
+ // The reading half of the stage ladder (joshuafolkken/kit#3042): the facts `run_stage.state_of` folds
8
+ // into one state, each read from where the stage that produced it left it — never from the
9
+ // conversation. A closed issue and the `run:planned` label come from GitHub; a `halfrun` stop and a `prrun`
10
+ // stop come from the stop's own mark on the tree's hold (`run-halfrun-resume.ts`,
11
+ // `run-prrun-resume.ts`).
12
+
13
+ const CLOSED = 'CLOSED'
14
+
15
+ interface StageRead {
16
+ state: StageState
17
+ // The `prrun` stop's resume token, kept so the entry acts on it without reading the pull request
18
+ // again; `undefined` when no `prrun` stop is recorded for the issue.
19
+ prrun_token: PrrunToken | undefined
20
+ }
21
+
22
+ function is_closed(read: StateRead): boolean {
23
+ return read.kind === 'state' && read.state.state === CLOSED
24
+ }
25
+
26
+ function is_planned(read: StateRead): boolean {
27
+ return read.kind === 'state' && has_label_name(read.state.labels, PLANNED_LABEL)
28
+ }
29
+
30
+ // The two stops are one hold record, so at most one is present; the `prrun` one is asked only when the
31
+ // `halfrun` one is not, which spares its pull-request read.
32
+ async function read_stop(
33
+ issue: string,
34
+ ): Promise<{ is_halfrun_stopped: boolean; prrun_token: PrrunToken | undefined }> {
35
+ if (await run_halfrun_resume.is_pending(issue)) {
36
+ return { is_halfrun_stopped: true, prrun_token: undefined }
37
+ }
38
+
39
+ return { is_halfrun_stopped: false, prrun_token: await run_prrun_resume.resume_token(issue) }
40
+ }
41
+
42
+ // An unreadable issue reads as neither closed nor planned: the ordinary entry that follows reads it
43
+ // again and answers `unknown` for it, exactly as before the ladder existed.
44
+ async function read_stage(issue: string): Promise<StageRead> {
45
+ const [issue_read, stop] = await Promise.all([
46
+ issue_state_cli.read_issue(issue),
47
+ read_stop(issue),
48
+ ])
49
+ const state = run_stage.state_of({
50
+ is_closed: is_closed(issue_read),
51
+ is_prrun_stopped: stop.prrun_token !== undefined,
52
+ is_halfrun_stopped: stop.is_halfrun_stopped,
53
+ is_planned: is_planned(issue_read),
54
+ })
55
+
56
+ return { state, prrun_token: stop.prrun_token }
57
+ }
58
+
59
+ const run_stage_read = { read_stage }
60
+
61
+ export type { StageRead }
62
+ export { run_stage_read }
@@ -0,0 +1,160 @@
1
+ // joshuafolkken/kit#3042: the workflow commands form a ladder — `kickoff` → `halfrun` → `prrun` →
2
+ // `fullrun` — and **the command typed decides only how far a run goes; where it starts is read off the
3
+ // issue**. A run that finds work already done resumes after it rather than redoing it, and a command
4
+ // whose stopping point the issue has already reached reports that and stops.
5
+ //
6
+ // This module is the pure half of that rule: the five states an issue can be found in, the four
7
+ // commands, and the one table that maps a (state, command) pair to a start and an end. `run:entry` reads
8
+ // the state (`run-stage-read.ts`) and branches on the answer; the stage table in
9
+ // `docs/how-to/run-issues.md` and each stop's `Next:` line are pinned to this module by
10
+ // `run-stage-document.test.ts`, so the prose cannot drift from what the entry does.
11
+
12
+ const KICKOFF = 'kickoff'
13
+ const HALFRUN = 'halfrun'
14
+ const PRRUN = 'prrun'
15
+ const FULLRUN = 'fullrun'
16
+
17
+ // In ladder order: a command's index plus one is the state rank it brings an issue to.
18
+ const COMMANDS = [KICKOFF, HALFRUN, PRRUN, FULLRUN] as const
19
+
20
+ type StageCommand = (typeof COMMANDS)[number]
21
+
22
+ // What `run:entry` serves when no command is named — the one it served alone before the ladder existed.
23
+ const DEFAULT_COMMAND: StageCommand = FULLRUN
24
+
25
+ const FRESH = 'fresh'
26
+ const PLANNED = 'planned'
27
+ const HALFRUN_STOPPED = 'halfrun-stopped'
28
+ const PRRUN_STOPPED = 'prrun-stopped'
29
+ const MERGED = 'merged'
30
+
31
+ // In ladder order: a state's index is how many rungs the issue has already climbed.
32
+ const STATES = [FRESH, PLANNED, HALFRUN_STOPPED, PRRUN_STOPPED, MERGED] as const
33
+
34
+ type StageState = (typeof STATES)[number]
35
+
36
+ const REACHED = 'reached'
37
+
38
+ // Where a run picks the issue up from each state — the first piece of work not yet done. A merged issue
39
+ // has none: every command has reached it.
40
+ const STARTS: Readonly<Record<StageState, string>> = {
41
+ [FRESH]: 'plan',
42
+ [PLANNED]: 'implement',
43
+ [HALFRUN_STOPPED]: 'gate',
44
+ [PRRUN_STOPPED]: 'followup',
45
+ [MERGED]: REACHED,
46
+ }
47
+
48
+ // Every start a decision can print, in ladder order — the `run:entry` oracle's vocabulary.
49
+ const START_TOKENS: ReadonlyArray<string> = [...new Set(Object.values(STARTS))]
50
+
51
+ // Where each command stops.
52
+ const ENDS: Readonly<Record<StageCommand, string>> = {
53
+ [KICKOFF]: 'plan posted',
54
+ [HALFRUN]: 'gated, before the commit',
55
+ [PRRUN]: 'green, mergeable PR',
56
+ [FULLRUN]: 'merged',
57
+ }
58
+
59
+ const NEXT_PREFIX = 'Next: '
60
+ const NEXT_SEPARATOR = ' | '
61
+ const STATE_HEADER = 'Issue state'
62
+ const CELL_ARROW = ' → '
63
+ const REACHED_CELL = 'reached — report and stop'
64
+
65
+ interface StageFacts {
66
+ is_closed: boolean
67
+ is_prrun_stopped: boolean
68
+ is_halfrun_stopped: boolean
69
+ is_planned: boolean
70
+ }
71
+
72
+ interface StageDecision {
73
+ state: StageState
74
+ command: StageCommand
75
+ // The first piece of work the run does, or `reached` when there is none left for this command.
76
+ start: string
77
+ end: string
78
+ is_reached: boolean
79
+ }
80
+
81
+ function to_command(value: string | undefined): StageCommand | undefined {
82
+ return COMMANDS.find((command) => command === value)
83
+ }
84
+
85
+ // The furthest rung the facts show, so a closed issue is merged whatever its hold still says.
86
+ function state_of(facts: StageFacts): StageState {
87
+ if (facts.is_closed) return MERGED
88
+ if (facts.is_prrun_stopped) return PRRUN_STOPPED
89
+ if (facts.is_halfrun_stopped) return HALFRUN_STOPPED
90
+
91
+ return facts.is_planned ? PLANNED : FRESH
92
+ }
93
+
94
+ function decide(state: StageState, command: StageCommand): StageDecision {
95
+ const is_reached = STATES.indexOf(state) > COMMANDS.indexOf(command)
96
+ const start = is_reached ? REACHED : STARTS[state]
97
+
98
+ return { state, command, start, end: ENDS[command], is_reached }
99
+ }
100
+
101
+ // The commands that go further than `command`, nearest first — what a stop offers next.
102
+ function next_commands(command: StageCommand): ReadonlyArray<StageCommand> {
103
+ return COMMANDS.slice(COMMANDS.indexOf(command) + 1)
104
+ }
105
+
106
+ // The `Next:` line a stop's Telegram and report carry, e.g. `Next: prrun #<N> | fullrun #<N>`.
107
+ function next_line(command: StageCommand, issue: string): string {
108
+ const commands = next_commands(command).map((next) => `${next} #${issue}`)
109
+
110
+ return `${NEXT_PREFIX}${commands.join(NEXT_SEPARATOR)}`
111
+ }
112
+
113
+ function format_decision(issue: string, decision: StageDecision): string {
114
+ const fields = [`at: ${decision.state}`, `to: ${decision.command}`, `start: ${decision.start}`]
115
+
116
+ return `stage #${issue} — ${fields.join(' · ')}`
117
+ }
118
+
119
+ function cell(state: StageState, command: StageCommand): string {
120
+ const decision = decide(state, command)
121
+
122
+ return decision.is_reached ? REACHED_CELL : `${decision.start}${CELL_ARROW}${decision.end}`
123
+ }
124
+
125
+ // The stage table as rows of cells, header first — the shape both documents carry.
126
+ function table_rows(): ReadonlyArray<ReadonlyArray<string>> {
127
+ const header = [STATE_HEADER, ...COMMANDS.map((command) => `\`${command}\``)]
128
+ const rows = STATES.map((state) => [
129
+ `\`${state}\``,
130
+ ...COMMANDS.map((command) => cell(state, command)),
131
+ ])
132
+
133
+ return [header, ...rows]
134
+ }
135
+
136
+ const run_stage = {
137
+ COMMANDS,
138
+ DEFAULT_COMMAND,
139
+ FRESH,
140
+ HALFRUN,
141
+ HALFRUN_STOPPED,
142
+ KICKOFF,
143
+ MERGED,
144
+ PLANNED,
145
+ PRRUN,
146
+ PRRUN_STOPPED,
147
+ REACHED,
148
+ START_TOKENS,
149
+ STATES,
150
+ decide,
151
+ format_decision,
152
+ next_commands,
153
+ next_line,
154
+ state_of,
155
+ table_rows,
156
+ to_command,
157
+ } as const
158
+
159
+ export type { StageCommand, StageDecision, StageFacts, StageState }
160
+ export { run_stage }
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env tsx
2
2
  import { fileURLToPath } from 'node:url'
3
- import { parseArgs } from 'node:util'
4
3
  import { cost_cli, type CostVerdict } from '#scripts/cost-runtime/cost-cli'
5
4
  import { issue_state_cli, type StateRead } from '#scripts/issue/issue-state-cli'
5
+ import { cli_flags } from '#scripts/lib/cli-flags'
6
6
  import { run_carry, type CarryRead } from './run-carry'
7
7
  import { run_status, type StatusParts } from './run-status'
8
8
 
@@ -41,19 +41,6 @@ interface StatusReads {
41
41
  cost: CostVerdict
42
42
  }
43
43
 
44
- interface ParsedArguments {
45
- positionals: ReadonlyArray<string>
46
- values: { repo?: string }
47
- }
48
-
49
- function read_args(argv: ReadonlyArray<string>): ParsedArguments | undefined {
50
- try {
51
- return parseArgs({ args: [...argv], options: OPTIONS, allowPositionals: true, strict: true })
52
- } catch {
53
- return undefined
54
- }
55
- }
56
-
57
44
  // Exactly one issue number, or the call is refused: `run:status` reports one run, and a second number
58
45
  // would print a second issue's state a caller reads as this run's own.
59
46
  function valid_issue(positionals: ReadonlyArray<string>): string | undefined {
@@ -65,7 +52,7 @@ function valid_issue(positionals: ReadonlyArray<string>): string | undefined {
65
52
  }
66
53
 
67
54
  function parse(argv: ReadonlyArray<string>): StatusRequest | undefined {
68
- const parsed = read_args(argv)
55
+ const parsed = cli_flags.arguments_of(argv, OPTIONS)
69
56
 
70
57
  if (parsed === undefined) return undefined
71
58
 
@@ -168,7 +155,7 @@ async function main(argv: ReadonlyArray<string>): Promise<void> {
168
155
  process.exitCode = await run(argv)
169
156
  }
170
157
 
171
- const run_status_cli = { USAGE, parse, run }
158
+ const run_status_cli = { parse, run }
172
159
 
173
160
  if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
174
161
 
@@ -44,18 +44,22 @@ function is_handed_off_here(carry: CarryRead): boolean {
44
44
  return run_headless.is_owned_here(carry.carry, lane_reap.own_ancestry)
45
45
  }
46
46
 
47
+ const UNREADABLE_RUN: RunReads = {
48
+ carry_kind: 'unreadable',
49
+ is_retrospective_done: false,
50
+ is_at_cut_cap: false,
51
+ is_handed_off: false,
52
+ last_event: undefined,
53
+ }
54
+
47
55
  // The run-level reads, keyed on the common git directory both the carry and the event stream share. A
48
56
  // directory that cannot be read leaves the position unknowable, which `next_action` answers `unknown`.
49
- function read_run(directory: string | undefined, issue_number: string): RunReads {
50
- if (directory === undefined) {
51
- return {
52
- carry_kind: 'unreadable',
53
- is_retrospective_done: false,
54
- is_at_cut_cap: false,
55
- is_handed_off: false,
56
- last_event: undefined,
57
- }
58
- }
57
+ function read_run(
58
+ directory: string | undefined,
59
+ issue_number: string,
60
+ is_lane_child: boolean,
61
+ ): RunReads {
62
+ if (directory === undefined) return UNREADABLE_RUN
59
63
 
60
64
  const carry = run_carry.read_carry(run_carry.carry_path(directory))
61
65
  const events = run_event_stream.read_events(run_event_stream.target_of(directory))
@@ -63,11 +67,13 @@ function read_run(directory: string | undefined, issue_number: string): RunReads
63
67
  // invocation left on the stream must not be read as this run's position (joshuafolkken/kit#2395). The
64
68
  // observed defect was a `run:step` that printed `wait` on a fresh run because an old `child-launch` was
65
69
  // still the stream's tail. Another issue's detached ship supervisor is left out the same way
66
- // (joshuafolkken/kit#2428).
70
+ // (joshuafolkken/kit#2428), and so — for a lane child — is every event that does not name its own issue
71
+ // (joshuafolkken/kit#3039).
67
72
  const last = run_event_scope.last_issue_event(
68
73
  events,
69
74
  run_event_scope.scope_of(carry),
70
75
  issue_number,
76
+ is_lane_child,
71
77
  )
72
78
 
73
79
  return {
@@ -82,7 +88,8 @@ function read_run(directory: string | undefined, issue_number: string): RunReads
82
88
  async function gather(issue_number: string): Promise<StepInput> {
83
89
  const reads = await run_prep_cli.gather(issue_number)
84
90
  const parts = run_prep_cli.to_parts(issue_number, reads)
85
- const run_reads = read_run(await run_carry.repository_directory(), issue_number)
91
+ const is_lane_child = lane_child_marker.is_child_of(process.cwd())
92
+ const run_reads = read_run(await run_carry.repository_directory(), issue_number, is_lane_child)
86
93
 
87
94
  return {
88
95
  issue_number,
@@ -94,7 +101,7 @@ async function gather(issue_number: string): Promise<StepInput> {
94
101
  is_retrospective_done: run_reads.is_retrospective_done,
95
102
  is_at_cut_cap: run_reads.is_at_cut_cap,
96
103
  is_handed_off: run_reads.is_handed_off,
97
- is_lane_child: lane_child_marker.is_child_of(process.cwd()),
104
+ is_lane_child,
98
105
  is_consumer: doctor_consumer.is_kit_consumer(find_package_directory(process.cwd())),
99
106
  // Read here rather than in `run-step.ts` so the position logic stays a pure function of its input.
100
107
  is_retrospective_enabled: run_retrospective.is_enabled(),
@@ -128,7 +135,7 @@ async function main(argv: ReadonlyArray<string>): Promise<void> {
128
135
  process.exitCode = await run(argv)
129
136
  }
130
137
 
131
- const run_step_cli = { USAGE, gather, main, run }
138
+ const run_step_cli = { run }
132
139
 
133
140
  if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
134
141
 
@@ -1,4 +1,4 @@
1
- import { git_stash } from '#scripts/git/git-stash'
1
+ import { git_stash } from '#scripts/git/stash/git-stash'
2
2
  import { latest_scope_cli } from '#scripts/version/latest-scope-cli'
3
3
  import type { CarryRead } from './run-carry'
4
4
  import { run_event_stream } from './run-event-stream'
@@ -1,4 +1,4 @@
1
- import { telegram_notify } from '#scripts/git/telegram-notify'
1
+ import { telegram_notify } from '#scripts/notify/telegram-notify'
2
2
  import type { CarryRead } from './run-carry'
3
3
 
4
4
  // **A `backlogrun` that halts because a person is needed used to reach nobody once the session was
@@ -43,8 +43,6 @@ async function announce(notice: StopNotice): Promise<boolean> {
43
43
  }
44
44
 
45
45
  const run_stop_notify = {
46
- STOP_RECOVERY,
47
- STOP_TITLE,
48
46
  announce,
49
47
  plan,
50
48
  }
@@ -24,8 +24,4 @@ async function main(): Promise<void> {
24
24
  process.exitCode = SUCCESS_EXIT_CODE
25
25
  }
26
26
 
27
- const run_stranded_cli = { main }
28
-
29
27
  if (process.argv[1] === fileURLToPath(import.meta.url)) await main()
30
-
31
- export { run_stranded_cli }