@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,38 @@
1
+ import { git_common_directory } from '#scripts/git/git-common-directory'
2
+ import { run_ship_detach } from '#scripts/run/run-ship-detach'
3
+ import { lane_child_marker, type MarkerSource } from './lane-child-marker'
4
+
5
+ // Whether a lane has handed its post-implementation region to the detached ship (joshuafolkken/kit#2962).
6
+ //
7
+ // **A child that ran `pnpm josh ship --detach` waits on nobody when it ends.** The supervisor drives the
8
+ // gate, the review and the merge, and notifies on its own outcome, so the `Stop` hook's demand for a
9
+ // `confirmation` notify and `lane-park`'s refusal of that notify only bought a "nothing needed"
10
+ // Telegram and a wasted turn — measured on 2026-10-02 as 43 demands, 21 refusals and ~94 extra turns.
11
+ // Both hooks read this one predicate, so they cannot disagree about whether the lane was handed off.
12
+ //
13
+ // **Running, never merely recorded.** A ship that failed hands its region back to the child, whose
14
+ // record then reads `failed`; that child is waiting again and owes the notify, so only a live
15
+ // supervisor counts as a hand-off.
16
+
17
+ // A detached ship for `issue` is live in the repository `directory` belongs to — the single reading
18
+ // `lane:await`, `run:merge` and the two stop hooks share.
19
+ function is_ship_running(issue: string, directory: string): boolean {
20
+ const repository = git_common_directory.repository(directory)
21
+
22
+ return (
23
+ repository !== undefined && run_ship_detach.read_result(repository, issue)?.result === 'running'
24
+ )
25
+ }
26
+
27
+ // This session is the dispatched lane child for `directory` and its own ship is running.
28
+ function is_handed_off(directory: string, source: MarkerSource = process.env): boolean {
29
+ const issue = lane_child_marker.marked_issue(source)
30
+
31
+ if (issue === undefined || !lane_child_marker.is_child_of(directory, source)) return false
32
+
33
+ return is_ship_running(issue, directory)
34
+ }
35
+
36
+ const lane_handoff = { is_handed_off, is_ship_running }
37
+
38
+ export { lane_handoff }
@@ -1,7 +1,8 @@
1
1
  #!/usr/bin/env tsx
2
2
  import { fileURLToPath } from 'node:url'
3
- import { parseArgs } from 'node:util'
4
3
  import { josh_command } from '#scripts/josh/josh-run'
4
+ import { cli_flags } from '#scripts/lib/cli-flags'
5
+ import { INSTALL_TIMEOUT_MS } from '#scripts/lib/timeouts'
5
6
  import { execa } from 'execa'
6
7
 
7
8
  // `josh lane:launch <issue> [--stash <message>]` — one composite command for a `backlogrun` lane-start
@@ -34,21 +35,15 @@ interface LaunchContext {
34
35
  }
35
36
 
36
37
  function read_context(argv: ReadonlyArray<string>): LaunchContext | undefined {
37
- try {
38
- const parsed = parseArgs({
39
- args: [...argv],
40
- options: OPTIONS,
41
- strict: true,
42
- allowPositionals: true,
43
- })
44
- const [issue, ...rest] = parsed.positionals
45
-
46
- if (issue === undefined || rest.length > 0 || !ISSUE_PATTERN.test(issue)) return undefined
47
-
48
- return { issue, stash: parsed.values.stash }
49
- } catch {
50
- return undefined
51
- }
38
+ const parsed = cli_flags.arguments_of(argv, OPTIONS)
39
+
40
+ if (parsed === undefined) return undefined
41
+
42
+ const [issue, ...rest] = parsed.positionals
43
+
44
+ if (issue === undefined || rest.length > 0 || !ISSUE_PATTERN.test(issue)) return undefined
45
+
46
+ return { issue, stash: parsed.values.stash }
52
47
  }
53
48
 
54
49
  // The pop brought in the `pnpm-lock.yaml` `josh latest` rewrote, so this one lane installs a second
@@ -57,6 +52,7 @@ function read_context(argv: ReadonlyArray<string>): LaunchContext | undefined {
57
52
  async function install(directory: string): Promise<boolean> {
58
53
  const result = await execa(PNPM, ['--dir', directory, 'install', '--frozen-lockfile'], {
59
54
  reject: false,
55
+ timeout: INSTALL_TIMEOUT_MS,
60
56
  })
61
57
 
62
58
  if ((result.exitCode ?? FAILURE_EXIT_CODE) === SUCCESS_EXIT_CODE) return true
@@ -82,29 +78,37 @@ async function prepare(stash: string | undefined, directory: string): Promise<bo
82
78
  return await install(directory)
83
79
  }
84
80
 
85
- // The launch chain in-process: the dispatched child's pid, or `undefined` when a step refused. The CLI
86
- // prints the pid; `backlog:drive` launches through this same chain (joshuafolkken/kit#2508).
87
- async function launch_lane(context: LaunchContext): Promise<string | undefined> {
81
+ // Where the chain ended. `unopened` is a `lane:open` refusal — no lane was taken; `failed` is a step
82
+ // after it, which leaves the opened lane holding a seat, so a caller cannot read the two alike
83
+ // (joshuafolkken/kit#3027).
84
+ type LaunchOutcome = { kind: 'launched'; pid: string } | { kind: 'unopened' } | { kind: 'failed' }
85
+
86
+ const UNOPENED: LaunchOutcome = { kind: 'unopened' }
87
+ const FAILED: LaunchOutcome = { kind: 'failed' }
88
+
89
+ // The launch chain in-process. The CLI prints the pid; `backlog:drive` launches through this same
90
+ // chain (joshuafolkken/kit#2508).
91
+ async function launch_lane(context: LaunchContext): Promise<LaunchOutcome> {
88
92
  const opened = await josh_command.josh_run(['lane:open', context.issue], should_forward_stderr)
89
93
 
90
- if (opened.code !== SUCCESS_EXIT_CODE) return undefined
94
+ if (opened.code !== SUCCESS_EXIT_CODE) return UNOPENED
91
95
 
92
- if (!(await prepare(context.stash, opened.out))) return undefined
96
+ if (!(await prepare(context.stash, opened.out))) return FAILED
93
97
 
94
98
  const dispatched = await josh_command.josh_run(
95
99
  ['lane:dispatch', context.issue],
96
100
  should_forward_stderr,
97
101
  )
98
102
 
99
- return dispatched.code === SUCCESS_EXIT_CODE ? dispatched.out : undefined
103
+ return dispatched.code === SUCCESS_EXIT_CODE ? { kind: 'launched', pid: dispatched.out } : FAILED
100
104
  }
101
105
 
102
106
  async function launch(context: LaunchContext): Promise<number> {
103
- const pid = await launch_lane(context)
107
+ const outcome = await launch_lane(context)
104
108
 
105
- if (pid === undefined) return FAILURE_EXIT_CODE
109
+ if (outcome.kind !== 'launched') return FAILURE_EXIT_CODE
106
110
 
107
- console.info(pid)
111
+ console.info(outcome.pid)
108
112
 
109
113
  return SUCCESS_EXIT_CODE
110
114
  }
@@ -125,9 +129,9 @@ async function main(argv: ReadonlyArray<string>): Promise<void> {
125
129
  process.exitCode = await run(argv)
126
130
  }
127
131
 
128
- const lane_launch_cli = { USAGE, install, launch, launch_lane, prepare, read_context, run }
132
+ const lane_launch_cli = { launch_lane, read_context, run }
129
133
 
130
134
  if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
131
135
 
132
- export type { LaunchContext }
136
+ export type { LaunchContext, LaunchOutcome }
133
137
  export { lane_launch_cli }
@@ -279,10 +279,7 @@ async function open_lane(issue: string): Promise<OpenOutcome> {
279
279
  }
280
280
 
281
281
  const lane_open = {
282
- build_plan,
283
- guard_unreadable,
284
282
  open_lane,
285
- read_root_environment,
286
283
  }
287
284
 
288
285
  export type { OpenOutcome }
@@ -115,7 +115,6 @@ function describe_refusal(refusal: Refusal, issue: string): string {
115
115
  const lane_output = {
116
116
  NO_OUTPUT,
117
117
  describe_refusal,
118
- invalid_reason,
119
118
  read_output,
120
119
  record_output,
121
120
  }
@@ -217,6 +217,14 @@ async function list_lanes(): Promise<Array<LaneInfo>> {
217
217
  return lanes.toSorted((left, right) => Number(left.issue) - Number(right.issue))
218
218
  }
219
219
 
220
+ // The lanes a parent is still waiting on. A stranded lane has no child working in it, so it is not
221
+ // in-flight — the one definition the watcher guard and the headless stop rule both read.
222
+ async function has_lanes_in_flight(): Promise<boolean> {
223
+ const lanes = await list_lanes()
224
+
225
+ return lanes.some((lane) => !lane.is_stranded)
226
+ }
227
+
220
228
  /** The seats live lanes hold — what a new lane's seat has to avoid. */
221
229
  function used_seats(lanes: ReadonlyArray<LaneInfo>): Array<number> {
222
230
  return lanes.map((lane) => lane.seat).filter((seat): seat is number => seat !== undefined)
@@ -246,6 +254,7 @@ async function find_open_lane(issue: string): Promise<LaneInfo | undefined> {
246
254
  const lane_registry = {
247
255
  find_lane,
248
256
  find_open_lane,
257
+ has_lanes_in_flight,
249
258
  list_lanes,
250
259
  main_repository_root,
251
260
  parse_block,
@@ -17,7 +17,9 @@ async function wait_for_ship(issue: string, prior_launch: string | undefined): P
17
17
  if (read === undefined || read.launch_id === prior_launch) return 'none'
18
18
 
19
19
  while (read.result === 'running') {
20
+ // eslint-disable-next-line no-await-in-loop -- polling: each read waits on the state the previous one saw
20
21
  await sleep(POLL_MS)
22
+ // eslint-disable-next-line no-await-in-loop -- polling: each read waits on the state the previous one saw
21
23
  read = await current(issue)
22
24
  if (read === undefined) return 'abnormal'
23
25
  }
@@ -48,6 +48,7 @@ async function is_approved(lane_directory: string, nonce: string): Promise<boole
48
48
  const decision = read(lane_directory, nonce)?.decision
49
49
  if (decision !== undefined) return decision === 'approved'
50
50
 
51
+ // eslint-disable-next-line no-await-in-loop -- polling: each read waits on the state the previous one saw
51
52
  await new Promise((resolve) => setTimeout(resolve, APPROVAL_POLL_MS))
52
53
  }
53
54
 
@@ -58,6 +59,6 @@ function remove(lane_directory: string, nonce: string): void {
58
59
  stamp_file.remove_stamp(target(lane_directory, nonce))
59
60
  }
60
61
 
61
- const openai_lane_supervisor_decision = { approve, cancel, is_approved, remove, target }
62
+ const openai_lane_supervisor_decision = { approve, cancel, is_approved, remove }
62
63
 
63
64
  export { openai_lane_supervisor_decision }
@@ -4,6 +4,7 @@ import { fileURLToPath } from 'node:url'
4
4
  import { agent_argv } from '#scripts/agent/agent-argv'
5
5
  import type { AgentProfile } from '#scripts/agent/agent-role-profile'
6
6
  import { process_identity } from '#scripts/josh/process-identity'
7
+ import { process_owner_schema } from '#scripts/josh/process-owner'
7
8
  import { stamp_file } from '#scripts/josh/stamp-file'
8
9
  import { detached_launch, type LaunchArgv } from '#scripts/run/detached-launch'
9
10
  import { run_cut, type RunCut } from '#scripts/run/run-cut'
@@ -22,11 +23,12 @@ const CHILD_POLL_MS = 250
22
23
  const CLAIM_POLL_MS = 50
23
24
  const CLAIM_POLL_LIMIT = 40
24
25
  const SUPERVISOR_SCRIPT = fileURLToPath(new URL('openai-lane-supervisor-cli.ts', import.meta.url))
25
- const owner_schema = z.object({
26
+ // The shared owner pair, with the pid narrowed: this record is written only by a live supervisor, so a
27
+ // pid that is not a real one marks it as corrupt rather than as a dead owner.
28
+ const owner_schema = process_owner_schema.extend({
26
29
  issue: z.string(),
27
30
  nonce: z.string(),
28
31
  pid: z.number().int().positive(),
29
- process_start: z.string().optional(),
30
32
  })
31
33
  const state_schema = z.object({
32
34
  owner_nonce: z.string(),
@@ -81,6 +83,7 @@ async function wait_for_active(lane_directory: string): Promise<SupervisorOwner
81
83
  for (let attempt = 0; attempt < CLAIM_POLL_LIMIT; attempt += 1) {
82
84
  const owner = active(lane_directory)
83
85
  if (owner !== undefined) return owner
86
+ // eslint-disable-next-line no-await-in-loop -- polling: each read waits on the state the previous one saw
84
87
  await new Promise((resolve) => setTimeout(resolve, CLAIM_POLL_MS))
85
88
  }
86
89
 
@@ -298,6 +301,7 @@ async function wait_for_inherited_child(
298
301
  child_process_start: string | undefined,
299
302
  ): Promise<void> {
300
303
  while (process_identity.is_same_process(child_pid, child_process_start) !== false) {
304
+ // eslint-disable-next-line no-await-in-loop -- polling: each read waits on the state the previous one saw
301
305
  await new Promise((resolve) => setTimeout(resolve, CHILD_POLL_MS))
302
306
  }
303
307
  }
@@ -350,10 +354,8 @@ const openai_lane_supervisor = {
350
354
  approve: openai_lane_supervisor_decision.approve,
351
355
  cancel: openai_lane_supervisor_decision.cancel,
352
356
  claim,
353
- decision_path: openai_lane_supervisor_decision.target,
354
357
  marker_path,
355
358
  new_nonce: randomUUID,
356
- read,
357
359
  release,
358
360
  state_path,
359
361
  supervise,
@@ -6,6 +6,7 @@ import { agent_argv } from '#scripts/agent/agent-argv'
6
6
  import { agent_role_profile } from '#scripts/agent/agent-role-profile'
7
7
  import { git_common_directory } from '#scripts/git/git-common-directory'
8
8
  import { stamp_file } from '#scripts/josh/stamp-file'
9
+ import { error_text } from '#scripts/lib/error-message'
9
10
  import { detached_launch } from '#scripts/run/detached-launch'
10
11
  import { run_ship_review } from '#scripts/run/run-ship-review'
11
12
  import { z } from 'zod'
@@ -102,7 +103,9 @@ function write_response(target: string, body: z.infer<typeof response_schema>):
102
103
  async function launched(lane: LaneInfo, round: ReviewRound): Promise<boolean> {
103
104
  try {
104
105
  return await launch_review(lane, round)
105
- } catch {
106
+ } catch (error) {
107
+ error_text.trace_swallowed('openai_review_broker.launched', error)
108
+
106
109
  return false
107
110
  }
108
111
  }
@@ -138,9 +141,11 @@ async function serve(
138
141
 
139
142
  if (received?.session === session && received.nonce !== last_nonce) {
140
143
  last_nonce = received.nonce
144
+ // eslint-disable-next-line no-await-in-loop -- requests are served one at a time, in arrival order
141
145
  await process_request(lane, response, received, state)
142
146
  }
143
147
 
148
+ // eslint-disable-next-line no-await-in-loop -- polling: each read waits on the state the previous one saw
144
149
  await sleep(POLL_MS)
145
150
  }
146
151
  }
@@ -232,6 +237,7 @@ async function wait_response(target: string, session: string, nonce: string): Pr
232
237
  const verdict = response_verdict(read_record(target, response_schema), session, nonce)
233
238
  if (verdict !== 'wait') return verdict === 'success'
234
239
 
240
+ // eslint-disable-next-line no-await-in-loop -- polling: each read waits on the state the previous one saw
235
241
  await sleep(POLL_MS)
236
242
  }
237
243
 
@@ -70,6 +70,7 @@ async function drain<Item, Result>(
70
70
  const [index, item] = entry
71
71
 
72
72
  try {
73
+ // eslint-disable-next-line no-await-in-loop -- one consumer runs one task at a time; the pool's width is the concurrency
73
74
  pool.results.push({ index, value: await worker(item, index) })
74
75
  } catch (error) {
75
76
  pool.failures.push(error)
@@ -1,4 +1,4 @@
1
- import { parseArgs, type ParseArgsConfig } from 'node:util'
1
+ import { parseArgs, type ParseArgsConfig, type ParseArgsOptionsConfig } from 'node:util'
2
2
 
3
3
  // Argument reading for the commands under `scripts/`.
4
4
  //
@@ -32,6 +32,35 @@ function parse_or_undefined<T extends ParseArgsConfig>(
32
32
  }
33
33
  }
34
34
 
35
- const cli_flags = { refuse_unknown_flags, parse_or_undefined }
35
+ // The two shapes every command reads `argv` in: flags alone, or flags beside positionals. Both are
36
+ // strict, so an unknown flag is `undefined` rather than a silently ignored typo; the commands had each
37
+ // carried a one-line wrapper spelling these out (joshuafolkken/kit#3072).
38
+ type FlagsOnly<T extends ParseArgsOptionsConfig> = ReturnType<
39
+ typeof parseArgs<{ args: Array<string>; options: T }>
40
+ >
41
+ type WithPositionals<T extends ParseArgsOptionsConfig> = ReturnType<
42
+ typeof parseArgs<{ args: Array<string>; options: T; allowPositionals: true }>
43
+ >
44
+
45
+ function values_of<T extends ParseArgsOptionsConfig>(
46
+ argv: ReadonlyArray<string>,
47
+ options: T,
48
+ ): FlagsOnly<T>['values'] | undefined {
49
+ return parse_or_undefined({ args: [...argv], options })?.values
50
+ }
51
+
52
+ function arguments_of<T extends ParseArgsOptionsConfig>(
53
+ argv: ReadonlyArray<string>,
54
+ options: T,
55
+ ): WithPositionals<T> | undefined {
56
+ return parse_or_undefined({ args: [...argv], options, allowPositionals: true })
57
+ }
58
+
59
+ // A string option's value, or `undefined` where the flag was absent or parsed as anything else.
60
+ function string_of(value: unknown): string | undefined {
61
+ return typeof value === 'string' ? value : undefined
62
+ }
63
+
64
+ const cli_flags = { refuse_unknown_flags, parse_or_undefined, values_of, arguments_of, string_of }
36
65
 
37
66
  export { cli_flags }
@@ -4,6 +4,17 @@ function message_of(error: unknown): string {
4
4
  return error instanceof Error ? error.message : String(error)
5
5
  }
6
6
 
7
- const error_text = { message_of }
7
+ const DEBUG_ENV_KEY = 'JOSH_DEBUG'
8
+
9
+ // A catch that folds a failure into a state verdict — "dirty", "not merged", "not written" — leaves no
10
+ // trace of why by default, so a wrong verdict cannot be followed back to its cause (joshuafolkken/kit#3067).
11
+ // `JOSH_DEBUG` set to any non-blank value writes the swallowed reason to stderr; unset, nothing changes.
12
+ function trace_swallowed(where: string, error: unknown): void {
13
+ if ((process.env[DEBUG_ENV_KEY] ?? '').trim() === '') return
14
+
15
+ process.stderr.write(`josh debug: ${where}: ${message_of(error)}\n`)
16
+ }
17
+
18
+ const error_text = { message_of, trace_swallowed }
8
19
 
9
20
  export { error_text }
@@ -1,9 +1,10 @@
1
1
  // Reading JSON that may not be JSON (joshuafolkken/kit#1151).
2
2
  //
3
- // Four readers under `scripts/` parse text that a defect, a truncated write or an older format can
4
- // make unparseable — a transcript line, a settings file, an MCP declaration — and every one of them
5
- // answers "could not read this" rather than throwing, because a single bad line must not fail a
6
- // whole report. They had begun to carry a copy of the same try/catch each; this is the one copy.
3
+ // Readers under `scripts/` parse text that a defect, a truncated write or an older format can make
4
+ // unparseable — a transcript line, a settings file, an MCP declaration, a lock record, CLI output —
5
+ // and every one of them answers "could not read this" rather than throwing, because a single bad line
6
+ // must not fail a whole report. They had begun to carry a copy of the same try/catch each; this is the
7
+ // one copy, and `is_record` beside it is the one object test (joshuafolkken/kit#2986).
7
8
 
8
9
  function parse_or_undefined(text: string): unknown {
9
10
  try {
@@ -1,6 +1,6 @@
1
1
  // One bounded polling loop and one sleep, in one place.
2
2
  //
3
- // **Three modules had already written the same three-line `sleep`** — `git/git-pr-checks.ts`,
3
+ // **Three modules had already written the same three-line `sleep`** — `gh/git-pr-checks.ts`,
4
4
  // `eval/eval-run.ts` and `propagate/propagate-publish.ts` — and the release command's tag watch
5
5
  // (joshuafolkken/kit#1169) would have been the fourth. `CLAUDE.md` → "No clones — single-source"
6
6
  // reads an existing duplication as the signal to single-source it rather than as a license to add to
@@ -43,8 +43,10 @@ async function poll_until(is_done: () => Promise<boolean>, options: PollOptions)
43
43
  const wait = options.sleeper ?? sleep
44
44
 
45
45
  for (let attempt = 0; attempt < options.attempts; attempt += 1) {
46
+ // eslint-disable-next-line no-await-in-loop -- polling: each read waits on the state the previous one saw
46
47
  if (await is_done()) return true
47
48
 
49
+ // eslint-disable-next-line no-await-in-loop -- polling: each read waits on the state the previous one saw
48
50
  await wait_between(wait, options.interval_ms, attempt, options.attempts)
49
51
  }
50
52
 
@@ -0,0 +1,15 @@
1
+ import { FETCH_TIMEOUT_MS } from './timeouts'
2
+
3
+ // **The one place in `scripts/` that calls the global `fetch`** (joshuafolkken/kit#2981). Every request
4
+ // carries a time limit, so a stalled connection rejects instead of holding an unattended run forever;
5
+ // `timed-fetch-usage.test.ts` refuses a direct `fetch` call anywhere else. The signal also bounds the
6
+ // body read, because the response stream aborts with it.
7
+ async function timed_fetch(
8
+ url: string,
9
+ init: Omit<RequestInit, 'signal'> = {},
10
+ timeout_ms: number = FETCH_TIMEOUT_MS,
11
+ ): Promise<Response> {
12
+ return await fetch(url, { ...init, signal: AbortSignal.timeout(timeout_ms) })
13
+ }
14
+
15
+ export { timed_fetch }
@@ -0,0 +1,13 @@
1
+ // Shared time limits for the calls that leave the process — a network request or a spawned command.
2
+ // An unattended run (a lane, `followup`, a backlog drain) that waits on a request or a command with no
3
+ // limit stays stuck where it stopped and never comes back (joshuafolkken/kit#2981), so every such
4
+ // call takes one of these, and a value used in more than one place is named once here.
5
+
6
+ // One HTTP request to a registry, an API or a webhook.
7
+ const FETCH_TIMEOUT_MS = 10_000
8
+ // A short command that only answers a question (`gh --version`, `pnpm config get`).
9
+ const COMMAND_TIMEOUT_MS = 30_000
10
+ // A `pnpm install`, which can download the whole dependency tree on a cold store.
11
+ const INSTALL_TIMEOUT_MS = 600_000
12
+
13
+ export { COMMAND_TIMEOUT_MS, FETCH_TIMEOUT_MS, INSTALL_TIMEOUT_MS }
@@ -1,3 +1,4 @@
1
+ import { json_value } from '#scripts/lib/json-value'
1
2
  import { json_object_schema } from '#scripts/lib/schemas'
2
3
  import { load, loadAll, YAMLException } from 'js-yaml'
3
4
 
@@ -25,8 +26,9 @@ function parse_yaml(content: string): Record<string, unknown> {
25
26
  return json_object_schema.parse(raw)
26
27
  }
27
28
 
29
+ // A YAML mapping parses to the same plain object a JSON object does, so the test is `json_value`'s.
28
30
  function is_mapping_document(value: unknown): value is Record<string, unknown> {
29
- return typeof value === 'object' && value !== null && !Array.isArray(value)
31
+ return json_value.is_record(value)
30
32
  }
31
33
 
32
34
  // pnpm 11 writes pnpm-lock.yaml as a multi-document stream (the package-manager document, then the
@@ -170,10 +170,8 @@ const bytes_command = {
170
170
  entry_row,
171
171
  entry_rows,
172
172
  near_ceiling_statuses,
173
- run_bytes,
174
173
  scan_lines,
175
174
  status_row,
176
- NONE_NEAR,
177
175
  NOT_A_FILE,
178
176
  NOT_BUDGETED,
179
177
  }
@@ -40,10 +40,6 @@ const LS_FILES_FLAGS: ReadonlyArray<string> = [
40
40
  '-z',
41
41
  ]
42
42
  const NUL = '\0'
43
- // `--show-toplevel` prints the absolute repository (or worktree) root from anywhere inside it, so the
44
- // root-relative names `--full-name` returns resolve to the right absolute paths wherever the command
45
- // was invoked.
46
- const SHOW_TOPLEVEL: ReadonlyArray<string> = ['rev-parse', '--show-toplevel']
47
43
 
48
44
  function is_lint_target(relative_path: string): boolean {
49
45
  return LINT_EXTENSIONS.has(path.extname(relative_path))
@@ -53,12 +49,6 @@ function split_names(output: string): ReadonlyArray<string> {
53
49
  return output.split(NUL).filter((name) => name.length > 0)
54
50
  }
55
51
 
56
- // `git_spawn.read` is the one place ordinary git commands are spawned from, so this reuses it rather
57
- // than growing a second spawn site (joshuafolkken/kit#1640).
58
- async function repo_root(): Promise<string> {
59
- return await git_spawn.read([...SHOW_TOPLEVEL])
60
- }
61
-
62
52
  // The names resolve against the repository `root`, never the process cwd: `--full-name` prints them
63
53
  // relative to the root wherever the command runs, so resolving against cwd would double the prefix
64
54
  // and drop every file when the command is invoked from a subdirectory.
@@ -73,7 +63,6 @@ async function lint_target_files(root: string): Promise<ReadonlyArray<string>> {
73
63
  const line_targets = {
74
64
  is_lint_target,
75
65
  lint_target_files,
76
- repo_root,
77
66
  split_names,
78
67
  }
79
68
 
@@ -1,6 +1,7 @@
1
1
  #!/usr/bin/env tsx
2
2
  import path from 'node:path'
3
3
  import { fileURLToPath } from 'node:url'
4
+ import { git_command } from '#scripts/git/git-command'
4
5
  import { line_budget, type FileBudget, type LineBudget } from './line-budget'
5
6
  import { line_targets } from './line-targets'
6
7
 
@@ -122,10 +123,11 @@ function render(budgets: ReadonlyArray<FileBudget>, project_root: string): strin
122
123
  return [header(budgets), ...rows_for(budgets, project_root)].join('\n')
123
124
  }
124
125
 
125
- // The scan resolves the repository root first — `budgets_for` and the row display both key off it — so
126
- // a run started from a subdirectory reports the same files as one started from the root.
126
+ // The scan resolves the repository root first — `budgets_for` and the row display both key off it, and
127
+ // `git ls-files --full-name` names files relative to it — so a run started from a subdirectory reports
128
+ // the same files as one started from the root.
127
129
  async function run_scan(): Promise<number> {
128
- const root = await line_targets.repo_root()
130
+ const root = await git_command.repository_root()
129
131
  const budgets = await scan_budgets(root)
130
132
 
131
133
  process.stdout.write(`${render(budgets, root)}\n`)
@@ -161,7 +163,6 @@ const lines_command = {
161
163
  header,
162
164
  near_limit_budgets,
163
165
  not_counted_reason,
164
- render,
165
166
  row,
166
167
  rows_for,
167
168
  run_lines,
@@ -116,7 +116,6 @@ function eslint_arguments(files: ReadonlyArray<string>): ReadonlyArray<string> {
116
116
 
117
117
  const lint_related_scope = {
118
118
  COMMAND_LABEL,
119
- COMMAND_NAME,
120
119
  NOTHING_LINTABLE_REASON,
121
120
  describe_scope,
122
121
  eslint_arguments,
@@ -99,6 +99,6 @@ if (process.argv[1] === fileURLToPath(import.meta.url)) {
99
99
  process.exitCode = await run_related_lint(process.argv.slice(changed_file_scope.ARGV_START))
100
100
  }
101
101
 
102
- const lint_related = { report_ignored_flags, run_related_lint }
102
+ const lint_related = { run_related_lint }
103
103
 
104
104
  export { lint_related }
@@ -1,4 +1,5 @@
1
1
  import { gh_spawn } from '#scripts/gh/gh-spawn'
2
+ import { timed_fetch } from '#scripts/lib/timed-fetch'
2
3
  import { z } from 'zod'
3
4
 
4
5
  const TELEGRAM_API_BASE = 'https://api.telegram.org'
@@ -193,7 +194,7 @@ function build_text(input: TelegramSendInput): string {
193
194
 
194
195
  async function post_message(config: TelegramConfig, text: string): Promise<void> {
195
196
  const url = `${TELEGRAM_API_BASE}/bot${config.bot_token}/sendMessage`
196
- const response = await fetch(url, {
197
+ const response = await timed_fetch(url, {
197
198
  method: 'POST',
198
199
  headers: { 'Content-Type': 'application/json' },
199
200
  body: JSON.stringify({ chat_id: config.chat_id, text }),
@@ -412,7 +413,6 @@ async function stranded(input: StrandedInput): Promise<boolean> {
412
413
  }
413
414
 
414
415
  const telegram_notify = {
415
- REPO_LOOKUP_TIMEOUT_MS,
416
416
  confirm,
417
417
  send,
418
418
  send_or_report,
@@ -1,11 +1,11 @@
1
1
  #!/usr/bin/env tsx
2
2
  import { fileURLToPath } from 'node:url'
3
3
  import { parseArgs } from 'node:util'
4
+ import { git_gh_issue_read } from '#scripts/gh/git-gh-issue-read'
5
+ import { git_gh_repo } from '#scripts/gh/git-gh-repo'
6
+ import { github_issue_url, type IssueUrlTarget } from '#scripts/gh/github-issue-url'
7
+ import { git_error } from '#scripts/git/git-error'
4
8
  import { josh_environment_file } from '#scripts/josh/josh-environment-file'
5
- import { git_error } from './git-error'
6
- import { git_gh_issue_read } from './git-gh-issue-read'
7
- import { git_gh_repo } from './git-gh-repo'
8
- import { github_issue_url, type IssueUrlTarget } from './github-issue-url'
9
9
  import { telegram_notify } from './telegram-notify'
10
10
  import { telegram_test_logic, type CliValues, type ResolvedContext } from './telegram-test-logic'
11
11
 
@@ -115,7 +115,6 @@ async function append(target: string, lines: ReadonlyArray<string>): Promise<voi
115
115
  const observation_ledger_home = {
116
116
  append,
117
117
  issue_path,
118
- ledger_directory,
119
118
  ledger_root,
120
119
  read,
121
120
  writer_path,
@@ -96,7 +96,6 @@ function missing_lines(candidates: ReadonlyArray<string>, ledger: string): Array
96
96
  const observation_ledger_line = {
97
97
  broken_ledger_lines,
98
98
  is_ledger_entry_line,
99
- line_reason,
100
99
  missing_lines,
101
100
  }
102
101
 
@@ -146,6 +146,6 @@ function migrate(root: string): boolean {
146
146
  ).some(Boolean)
147
147
  }
148
148
 
149
- const observation_ledger_migrate = { claim_path, migrate }
149
+ const observation_ledger_migrate = { migrate }
150
150
 
151
151
  export { observation_ledger_migrate }
@@ -1,6 +1,6 @@
1
- import { git_gh_command } from '#scripts/git/git-gh-command'
2
- import type { OpenPull } from '#scripts/git/git-gh-pr-auto-merge'
3
- import { git_pr_checks } from '#scripts/git/git-pr-checks'
1
+ import { git_gh_command } from '#scripts/gh/git-gh-command'
2
+ import type { OpenPull } from '#scripts/gh/git-gh-pr-auto-merge'
3
+ import { git_pr_checks } from '#scripts/gh/git-pr-checks'
4
4
  import { error_text } from '#scripts/lib/error-message'
5
5
 
6
6
  // **A flush pull request lands whether or not the flush that opened it is still alive**