@joshuafolkken/kit 1.1050.0 → 1.1094.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (581) hide show
  1. package/.claude/settings.json +9 -8
  2. package/.claude/skills/epic-commands/SKILL.md +5 -7
  3. package/.claude/skills/workflow-commands/SKILL.md +19 -11
  4. package/.claude/skills/workflow-commands/background-commands.md +4 -3
  5. package/.claude/skills/workflow-commands/backlogrun-child.md +1 -1
  6. package/.claude/skills/workflow-commands/backlogrun-lanes.md +8 -6
  7. package/.claude/skills/workflow-commands/backlogrun-progress.md +1 -1
  8. package/.claude/skills/workflow-commands/backlogrun-steps.md +10 -10
  9. package/.claude/skills/workflow-commands/backlogrun.md +2 -2
  10. package/.claude/skills/workflow-commands/chain-rule.md +4 -2
  11. package/.claude/skills/workflow-commands/delegation.md +3 -3
  12. package/.claude/skills/workflow-commands/followup-reference.md +1 -1
  13. package/.claude/skills/workflow-commands/followup.md +7 -3
  14. package/.claude/skills/workflow-commands/fullrun-steps.md +3 -2
  15. package/.claude/skills/workflow-commands/fullrun.md +3 -2
  16. package/.claude/skills/workflow-commands/halfrun.md +16 -19
  17. package/.claude/skills/workflow-commands/issue-comments.md +1 -1
  18. package/.claude/skills/workflow-commands/issue-fold-existing.md +10 -10
  19. package/.claude/skills/workflow-commands/issue-scout.md +1 -1
  20. package/.claude/skills/workflow-commands/kickoff.md +9 -4
  21. package/.claude/skills/workflow-commands/latest-gate.md +1 -1
  22. package/.claude/skills/workflow-commands/needs-human-review.md +1 -1
  23. package/.claude/skills/workflow-commands/observation-filing.md +3 -3
  24. package/.claude/skills/workflow-commands/prerequisite.md +1 -1
  25. package/.claude/skills/workflow-commands/prrun.md +36 -0
  26. package/.claude/skills/workflow-commands/retrospective.md +1 -1
  27. package/.claude/skills/workflow-commands/working-tree-hold.md +22 -2
  28. package/.codex/hooks.json +16 -20
  29. package/.github/actions/setup-pnpm/action.yml +93 -0
  30. package/.github/dependabot.yml +5 -1
  31. package/.github/workflows/ci.yml +26 -128
  32. package/.github/workflows/pr-classification.yml +5 -41
  33. package/.github/workflows/publish.yml +33 -38
  34. package/.github/workflows/sonar-qube.yml +37 -4
  35. package/AGENTS.md +12 -2
  36. package/CLAUDE.md +15 -16
  37. package/GEMINI.md +14 -2
  38. package/README.md +59 -18
  39. package/SECURITY.md +36 -6
  40. package/cspell/index.yaml +2 -1
  41. package/dist/CLAUDE.md +15 -16
  42. package/dist/config-merge/index.js +15 -3
  43. package/dist/hooks/batch-guard.js +4 -4
  44. package/dist/hooks/{chunk-HJIISEAC.js → chunk-3C4YCCEF.js} +5 -13
  45. package/dist/hooks/{chunk-EJDX2TOB.js → chunk-7ZPFAVR7.js} +7 -88
  46. package/dist/hooks/{chunk-WQ4OSBSS.js → chunk-E54KGFEQ.js} +2 -2
  47. package/dist/hooks/{chunk-GQ7KP45M.js → chunk-IL27YTPH.js} +2 -2
  48. package/dist/hooks/{chunk-DMQN45FN.js → chunk-KHWHKJOM.js} +3 -3
  49. package/dist/hooks/{chunk-5BK3K7V4.js → chunk-M2XDCUKD.js} +997 -478
  50. package/dist/hooks/{chunk-7VPDUBRN.js → chunk-NKOG3XAV.js} +150 -153
  51. package/dist/hooks/{chunk-NJQOBE6L.js → chunk-O4LL4HTI.js} +2 -7
  52. package/dist/hooks/{chunk-NAS4C7GP.js → chunk-OIZUHPJI.js} +2 -2
  53. package/dist/hooks/{chunk-RLDX5SOC.js → chunk-UD24EAIL.js} +2084 -1412
  54. package/dist/hooks/codex-hook-adapter.js +10 -11
  55. package/dist/hooks/duplicate-read-guard.js +5 -5
  56. package/dist/hooks/format-edited.js +2 -2
  57. package/dist/hooks/inputs.json +279 -0
  58. package/dist/hooks/investigation-guard.js +5 -5
  59. package/dist/hooks/pretool-guard.js +9 -9
  60. package/dist/hooks/session-lang.js +0 -1
  61. package/dist/hooks/stop-guard.js +178 -324
  62. package/dist/josh.js +162 -119
  63. package/dist/managed-marker/index.js +2 -1
  64. package/dist/version/index.js +34 -58
  65. package/eslint/rules/promise.js +5 -0
  66. package/package.json +9 -4
  67. package/prompts/collaboration-workflow/issue-citation.md +5 -5
  68. package/prompts/collaboration-workflow/operating-rules.md +4 -4
  69. package/prompts/collaboration-workflow/overview.md +13 -1
  70. package/prompts/collaboration-workflow/report-format.md +1 -1
  71. package/prompts/collaboration-workflow/residency.md +3 -3
  72. package/prompts/collaboration-workflow/rule-delivery.md +1 -1
  73. package/prompts/collaboration-workflow/turn-batching.md +3 -3
  74. package/prompts/collaboration-workflow/upstream-interrupt.md +1 -1
  75. package/prompts/collaboration-workflow/wip-cap.md +25 -22
  76. package/prompts/collaboration-workflow.md +5 -8
  77. package/prompts/review-rubric.md +1 -1
  78. package/prompts/review.md +3 -3
  79. package/prompts/sonar-hotspot-handling.md +11 -3
  80. package/prompts/testing-guide.md +3 -3
  81. package/scripts/adopt/adopt-toolkits.ts +0 -2
  82. package/scripts/adopt/adopt.ts +0 -2
  83. package/scripts/agent/agent-argv.ts +0 -2
  84. package/scripts/agent/agent-diagnostics.ts +1 -1
  85. package/scripts/agent/agent-role-profile.ts +0 -7
  86. package/scripts/agent/claude-agent-argv.ts +0 -2
  87. package/scripts/agent/codex-agent-argv.ts +1 -1
  88. package/scripts/agent/codex-hooks.ts +92 -0
  89. package/scripts/agent/interactive-ask.ts +1 -1
  90. package/scripts/auto-ok/auto-ok-cli.ts +6 -16
  91. package/scripts/backlog/backlog-budget.ts +0 -2
  92. package/scripts/backlog/backlog-defect-priority.ts +2 -2
  93. package/scripts/backlog/backlog-drive-cli.ts +10 -8
  94. package/scripts/backlog/backlog-drive-named-offer.ts +16 -3
  95. package/scripts/backlog/backlog-drive-named.ts +2 -1
  96. package/scripts/backlog/backlog-drive.ts +76 -16
  97. package/scripts/backlog/backlog-named.ts +0 -3
  98. package/scripts/backlog/backlog-next.ts +9 -15
  99. package/scripts/backlog/backlog-offer-cli.ts +0 -5
  100. package/scripts/backlog/backlog-plan-cli.ts +1 -7
  101. package/scripts/backlog/backlog-plan.ts +1 -1
  102. package/scripts/backlog/backlog-pool.ts +3 -6
  103. package/scripts/backlog/backlog-rank.ts +2 -2
  104. package/scripts/backlog/backlog-ready.ts +19 -3
  105. package/scripts/backlog/backlog-scope.ts +1 -3
  106. package/scripts/backlog/backlog-stalled-detect.ts +2 -2
  107. package/scripts/backlog/backlog-stalled.ts +0 -1
  108. package/scripts/backlog/backlog-waves.ts +5 -2
  109. package/scripts/behavior/behavior-cli.ts +1 -1
  110. package/scripts/build/build-codex-hooks.ts +26 -0
  111. package/scripts/build/build-hooks.ts +85 -9
  112. package/scripts/build/hook-bundle-stamp.ts +111 -0
  113. package/scripts/cases/cases-cli.ts +1 -1
  114. package/scripts/cases/cases-logic.ts +1 -1
  115. package/scripts/ci/composite-actions.ts +30 -0
  116. package/scripts/ci/pr-classification.ts +3 -3
  117. package/scripts/claude/workflow-destination.ts +10 -1
  118. package/scripts/clone/clone-fingerprint.ts +0 -1
  119. package/scripts/clone/clone-scan-cli.ts +1 -1
  120. package/scripts/clone/clone-scan.ts +1 -1
  121. package/scripts/config-merge/json-format.ts +0 -1
  122. package/scripts/config-merge/patch-yaml-list.ts +1 -1
  123. package/scripts/cost-runtime/codex-usage.ts +2 -9
  124. package/scripts/cost-runtime/cost-attribute.ts +0 -1
  125. package/scripts/cost-runtime/cost-cli.ts +0 -3
  126. package/scripts/cost-runtime/cost-corpus.ts +0 -2
  127. package/scripts/cost-runtime/cost-format.ts +0 -3
  128. package/scripts/cost-runtime/cost-pricing.ts +0 -1
  129. package/scripts/cost-runtime/cost-tokens.ts +0 -1
  130. package/scripts/delegation/delegation-cli.ts +1 -1
  131. package/scripts/delegation/delegation-policy.ts +0 -1
  132. package/scripts/delegation/duplicate-read-guard.ts +0 -8
  133. package/scripts/delegation/fanout-cli.ts +1 -1
  134. package/scripts/delegation/fanout.ts +0 -2
  135. package/scripts/delegation/investigation-reads.ts +1 -164
  136. package/scripts/discovery/repo-map-logic.ts +0 -1
  137. package/scripts/discovery/repo-party-cli.ts +1 -1
  138. package/scripts/doctor/doctor-consumer.ts +4 -6
  139. package/scripts/doctor/doctor-logic.ts +0 -4
  140. package/scripts/doctor/doctor.ts +14 -9
  141. package/scripts/document/document-byte-budget.ts +4 -5
  142. package/scripts/document/document-byte-check.ts +0 -1
  143. package/scripts/document/document-read-cli.ts +0 -2
  144. package/scripts/document/document-section-cli.ts +1 -1
  145. package/scripts/document/document-section.ts +0 -3
  146. package/scripts/document/edit-files-cli.ts +0 -1
  147. package/scripts/document/entry-read-budget.ts +10 -2
  148. package/scripts/document/lane-child-read-set.ts +1 -6
  149. package/scripts/document/read-files-cli.ts +0 -4
  150. package/scripts/document/read-set-cli.ts +0 -2
  151. package/scripts/document/read-set-point-of-use.ts +1 -0
  152. package/scripts/document/read-set-pricing.ts +0 -1
  153. package/scripts/document/read-set-trim.ts +1 -1
  154. package/scripts/epic/epic-add.ts +1 -1
  155. package/scripts/epic/epic-audit-cli.ts +1 -4
  156. package/scripts/epic/epic-audit-orphans.ts +1 -3
  157. package/scripts/epic/epic-audit-rationale.ts +0 -1
  158. package/scripts/epic/epic-audit-report.ts +0 -2
  159. package/scripts/epic/epic-audit.ts +5 -4
  160. package/scripts/epic/epic-bundle-cli.ts +1 -1
  161. package/scripts/epic/epic-bundle-evidence.ts +0 -1
  162. package/scripts/epic/epic-bundle-referenced.ts +1 -5
  163. package/scripts/epic/epic-bundle.ts +0 -4
  164. package/scripts/epic/epic-busy.ts +4 -5
  165. package/scripts/epic/epic-candidate-confirm.ts +0 -5
  166. package/scripts/epic/epic-classify.ts +2 -2
  167. package/scripts/epic/epic-cli-argv.ts +0 -1
  168. package/scripts/epic/epic-close-comment.ts +1 -1
  169. package/scripts/epic/epic-close.ts +5 -2
  170. package/scripts/epic/epic-cross-repo.ts +2 -4
  171. package/scripts/epic/epic-decision.ts +0 -1
  172. package/scripts/epic/epic-fetch.ts +2 -2
  173. package/scripts/epic/epic-index.ts +2 -3
  174. package/scripts/epic/epic-issue.ts +1 -15
  175. package/scripts/epic/epic-lane-offer.ts +9 -8
  176. package/scripts/epic/epic-nested.ts +1 -1
  177. package/scripts/epic/epic-next-read.ts +1 -3
  178. package/scripts/epic/epic-next-views.ts +0 -1
  179. package/scripts/epic/epic-next.ts +1 -10
  180. package/scripts/epic/epic-parse.ts +0 -1
  181. package/scripts/epic/epic-promote.ts +0 -9
  182. package/scripts/epic/epic-rank.ts +2 -2
  183. package/scripts/epic/epic-read.ts +1 -2
  184. package/scripts/epic/epic-reconcile.ts +1 -1
  185. package/scripts/epic/epic-reference.ts +1 -13
  186. package/scripts/epic/epic-relation-recheck.ts +1 -1
  187. package/scripts/epic/epic-relations.ts +1 -1
  188. package/scripts/epic/epic-remove.ts +1 -1
  189. package/scripts/epic/epic-report.ts +0 -1
  190. package/scripts/epic/epic-run.ts +2 -3
  191. package/scripts/epic/epic-shape.ts +1 -1
  192. package/scripts/epic/epic-solo-stale.ts +107 -0
  193. package/scripts/epic/epic-solo.ts +3 -2
  194. package/scripts/epic/epic-triage.ts +1 -1
  195. package/scripts/epic/epic-validate.ts +1 -1
  196. package/scripts/epic/epic.ts +1 -1
  197. package/scripts/exports/unused-members-cli.ts +53 -0
  198. package/scripts/{git → followup}/followup-issue-number.ts +1 -6
  199. package/scripts/{git → followup}/git-followup-cleanup.ts +2 -1
  200. package/scripts/{git → followup}/git-followup-finish.ts +1 -3
  201. package/scripts/{git → followup}/git-followup-flush.ts +2 -2
  202. package/scripts/{git → followup}/git-followup-issue-close.ts +2 -2
  203. package/scripts/{git → followup}/git-followup-label.ts +4 -4
  204. package/scripts/followup/git-followup-merged.ts +112 -0
  205. package/scripts/{git → followup}/git-followup-pending.ts +1 -1
  206. package/scripts/{git → followup}/git-followup-workflow.ts +19 -11
  207. package/scripts/{git → followup}/git-pr-followup-wrapup.ts +9 -3
  208. package/scripts/{git → followup}/git-pr-followup.ts +53 -16
  209. package/scripts/gate/core-budget.ts +3 -9
  210. package/scripts/gate/gate-plan.ts +7 -4
  211. package/scripts/gate/gate-report.ts +0 -6
  212. package/scripts/gate/gate-tree.ts +1 -1
  213. package/scripts/gate/pre-commit-type-check.ts +0 -6
  214. package/scripts/gate/project-checks.ts +7 -8
  215. package/scripts/gate/scoped-green.ts +0 -1
  216. package/scripts/gate/type-check-step.ts +1 -1
  217. package/scripts/gate/verification-gate.ts +0 -2
  218. package/scripts/gh/fix-gh-packages.ts +15 -12
  219. package/scripts/gh/gh-spawn.ts +2 -2
  220. package/scripts/{git → gh}/git-ai-review-scan.ts +1 -5
  221. package/scripts/{git → gh}/git-gh-check.ts +2 -1
  222. package/scripts/{git → gh}/git-gh-exec.ts +1 -1
  223. package/scripts/{git → gh}/git-gh-failure.ts +1 -1
  224. package/scripts/{git → gh}/git-gh-helpers.ts +0 -1
  225. package/scripts/{git → gh}/git-gh-issue-list.ts +2 -0
  226. package/scripts/{git → gh}/git-gh-issue-read.ts +1 -1
  227. package/scripts/{git → gh}/git-gh-issue-rest.ts +6 -3
  228. package/scripts/{git → gh}/git-gh-pr-read.ts +24 -0
  229. package/scripts/{git → gh}/git-gh-pr-rest.ts +5 -2
  230. package/scripts/{git → gh}/git-gh-pr-review.ts +2 -2
  231. package/scripts/{git → gh}/git-gh-pr-rollup.ts +1 -3
  232. package/scripts/{git → gh}/git-gh-pr.ts +3 -1
  233. package/scripts/{git → gh}/git-pr-ai-review.ts +2 -5
  234. package/scripts/{git → gh}/git-pr-checks-eval.ts +0 -10
  235. package/scripts/{git → gh}/git-pr-checks-parse.ts +4 -20
  236. package/scripts/{git → gh}/git-pr-checks.ts +2 -1
  237. package/scripts/{git → gh}/git-pr-coderabbit.ts +2 -5
  238. package/scripts/{git → gh}/git-pr-confirmation.ts +1 -3
  239. package/scripts/{git → gh}/git-pr-managed-config.ts +2 -3
  240. package/scripts/{git → gh}/git-pr.ts +3 -3
  241. package/scripts/git/changed-file-scope.ts +0 -1
  242. package/scripts/git/git-branch.ts +3 -6
  243. package/scripts/git/git-commit.ts +1 -1
  244. package/scripts/git/git-common-directory.ts +80 -24
  245. package/scripts/git/git-error.ts +66 -9
  246. package/scripts/git/git-issue.ts +1 -1
  247. package/scripts/git/git-preflight.ts +2 -2
  248. package/scripts/git/git-prompt.ts +6 -31
  249. package/scripts/git/git-push.ts +1 -1
  250. package/scripts/git/git-staging.ts +1 -0
  251. package/scripts/git/git-status.ts +1 -1
  252. package/scripts/git/git-workflow.ts +1 -1
  253. package/scripts/git/gone-branch.ts +1 -0
  254. package/scripts/git/listing-cutoff.ts +1 -1
  255. package/scripts/git/main-merge.ts +1 -1
  256. package/scripts/git/main-sync.ts +19 -1
  257. package/scripts/git/parse-json-array.ts +0 -3
  258. package/scripts/git/repository-lock.ts +16 -16
  259. package/scripts/git/{git-stash.ts → stash/git-stash.ts} +1 -1
  260. package/scripts/git/{stash-pop-args.ts → stash/stash-pop-args.ts} +1 -1
  261. package/scripts/git/{stash-pop-cli.ts → stash/stash-pop-cli.ts} +0 -1
  262. package/scripts/git/{stash-sweep-lock.ts → stash/stash-sweep-lock.ts} +3 -3
  263. package/scripts/hooks/codex-hook-adapter.ts +0 -1
  264. package/scripts/hooks/edited-cspell.ts +1 -1
  265. package/scripts/hooks/format-edited-file.ts +2 -0
  266. package/scripts/hooks/pre-push-unit.ts +0 -4
  267. package/scripts/hooks/pretool-guard.ts +22 -4
  268. package/scripts/hooks/reserved-run.ts +1 -1
  269. package/scripts/hooks/step-zero-notice.ts +76 -0
  270. package/scripts/hooks/stop-guard.ts +47 -21
  271. package/scripts/init/claude-plugin-config.ts +4 -5
  272. package/scripts/init/hook-command-rewrite.ts +16 -8
  273. package/scripts/init/hook-launch.ts +41 -15
  274. package/scripts/init/init-basic.ts +2 -5
  275. package/scripts/init/init-logic.ts +7 -0
  276. package/scripts/init/init.ts +0 -3
  277. package/scripts/init/project-profile.ts +6 -11
  278. package/scripts/init/start-exec.ts +1 -1
  279. package/scripts/init/start-setup-pr.ts +6 -6
  280. package/scripts/init/start-steps.ts +1 -0
  281. package/scripts/issue/behavior-change-lint.ts +0 -1
  282. package/scripts/issue/defect-rate-cli.ts +3 -3
  283. package/scripts/issue/defect-rate.ts +1 -2
  284. package/scripts/{git → issue}/git-next-issues.ts +3 -3
  285. package/scripts/issue/issue-backlinks-cli.ts +1 -5
  286. package/scripts/issue/issue-cite-cli.ts +2 -6
  287. package/scripts/issue/issue-cite.ts +0 -2
  288. package/scripts/issue/issue-classification.ts +1 -9
  289. package/scripts/issue/issue-closing-pr.ts +4 -4
  290. package/scripts/issue/issue-comment-cli.ts +2 -2
  291. package/scripts/issue/issue-file-cli.ts +5 -5
  292. package/scripts/issue/issue-file.ts +2 -2
  293. package/scripts/issue/issue-fold-cli.ts +1 -1
  294. package/scripts/issue/issue-fold-existing-cli.ts +1 -1
  295. package/scripts/{git → issue}/issue-labels.ts +8 -0
  296. package/scripts/issue/issue-lint-cli.ts +1 -1
  297. package/scripts/issue/issue-merged.ts +2 -2
  298. package/scripts/{git → issue}/issue-rank.ts +1 -1
  299. package/scripts/issue/issue-read-cli.ts +8 -47
  300. package/scripts/issue/issue-read.ts +0 -2
  301. package/scripts/issue/issue-report-failures.ts +80 -0
  302. package/scripts/issue/issue-scout-cli.ts +1 -7
  303. package/scripts/issue/issue-scout-closed.ts +2 -2
  304. package/scripts/issue/issue-scout.ts +0 -2
  305. package/scripts/issue/issue-state-cli.ts +5 -46
  306. package/scripts/issue/issue-state.ts +1 -5
  307. package/scripts/issue/markdown-section.ts +1 -1
  308. package/scripts/issue/measure-rerun-cli.ts +1 -1
  309. package/scripts/issue/reproduction-measure.ts +1 -1
  310. package/scripts/josh/cli-body.ts +1 -1
  311. package/scripts/josh/file-map-stamp.ts +0 -3
  312. package/scripts/josh/josh-command-map.ts +2 -0
  313. package/scripts/josh/josh-commands-ai.ts +9 -102
  314. package/scripts/josh/josh-commands-backlog.ts +5 -1
  315. package/scripts/josh/josh-commands-development.ts +8 -1
  316. package/scripts/josh/josh-commands-issue.ts +2 -2
  317. package/scripts/josh/josh-commands-maintenance.ts +7 -0
  318. package/scripts/josh/josh-commands-project.ts +6 -0
  319. package/scripts/josh/josh-commands-run.ts +114 -0
  320. package/scripts/josh/josh-commands-versioning.ts +8 -0
  321. package/scripts/josh/josh-commands-workflow.ts +2 -2
  322. package/scripts/josh/path-decision.ts +0 -3
  323. package/scripts/josh/process-owner.ts +16 -0
  324. package/scripts/josh/session-language-cli.ts +0 -1
  325. package/scripts/lane/lane-await.ts +3 -6
  326. package/scripts/lane/lane-capacity.ts +6 -3
  327. package/scripts/lane/lane-child-invocation.ts +20 -7
  328. package/scripts/lane/lane-cli.ts +1 -4
  329. package/scripts/lane/lane-close.ts +1 -3
  330. package/scripts/lane/lane-dispatch.ts +3 -4
  331. package/scripts/lane/lane-environment.ts +0 -9
  332. package/scripts/lane/lane-handoff.ts +38 -0
  333. package/scripts/lane/lane-launch-cli.ts +21 -11
  334. package/scripts/lane/lane-open.ts +0 -3
  335. package/scripts/lane/lane-output.ts +0 -1
  336. package/scripts/lane/lane-registry.ts +9 -0
  337. package/scripts/lane/openai-lane-ship.ts +2 -0
  338. package/scripts/lane/openai-lane-supervisor-decision.ts +2 -1
  339. package/scripts/lane/openai-lane-supervisor.ts +6 -4
  340. package/scripts/lane/openai-review-broker.ts +3 -0
  341. package/scripts/lib/bounded-pool.ts +1 -0
  342. package/scripts/lib/json-value.ts +5 -4
  343. package/scripts/lib/poll.ts +3 -1
  344. package/scripts/lib/timed-fetch.ts +15 -0
  345. package/scripts/lib/timeouts.ts +13 -0
  346. package/scripts/{yaml → lib}/yaml-document.ts +3 -1
  347. package/scripts/{bytes → lines}/bytes-command.ts +0 -2
  348. package/scripts/lines/lines-command.ts +0 -1
  349. package/scripts/lint/lint-related-scope.ts +0 -1
  350. package/scripts/lint/lint-related.ts +1 -1
  351. package/scripts/{git → notify}/telegram-notify.ts +2 -2
  352. package/scripts/{git → notify}/telegram-test.ts +4 -4
  353. package/scripts/observations/observation-ledger-home.ts +0 -1
  354. package/scripts/observations/observation-ledger-line.ts +0 -1
  355. package/scripts/observations/observation-ledger-migrate.ts +1 -1
  356. package/scripts/observations/observations-flush-landing.ts +3 -3
  357. package/scripts/observations/observations-flush.ts +2 -2
  358. package/scripts/overrides/lockfile-overrides.ts +1 -1
  359. package/scripts/overrides/overrides-logic.ts +1 -1
  360. package/scripts/package/package-scout-cli.ts +2 -7
  361. package/scripts/package/package-scout.ts +0 -2
  362. package/scripts/propagate/propagate-git-failure.ts +0 -1
  363. package/scripts/propagate/propagate-git.ts +0 -2
  364. package/scripts/propagate/propagate-publish.ts +2 -3
  365. package/scripts/propagate/propagate-run.ts +0 -2
  366. package/scripts/propagate/propagate-steps.ts +3 -5
  367. package/scripts/propagate/propagate-targets.ts +0 -4
  368. package/scripts/propagate/propagate.ts +0 -4
  369. package/scripts/refactor/import-graph.ts +0 -1
  370. package/scripts/refactor/refactor-lint.ts +0 -2
  371. package/scripts/refactor/refactor-scan.ts +0 -1
  372. package/scripts/refactor/refactor-targets.ts +0 -1
  373. package/scripts/registry-migration/migrate-logic.ts +0 -2
  374. package/scripts/registry-migration/migrate.ts +19 -9
  375. package/scripts/release/github-release-cli.ts +8 -6
  376. package/scripts/release/github-release-environment.ts +46 -0
  377. package/scripts/release/github-release.ts +151 -94
  378. package/scripts/release/release-history.ts +0 -1
  379. package/scripts/release/release-plan.ts +0 -1
  380. package/scripts/release/release-publish.ts +2 -3
  381. package/scripts/release/release-scope-cli.ts +1 -2
  382. package/scripts/release/release-tag.ts +2 -4
  383. package/scripts/repo/auto-merge-setting-logic.ts +1 -4
  384. package/scripts/repo/repo-setting.ts +1 -1
  385. package/scripts/repo/repository-labels.ts +3 -3
  386. package/scripts/repo/required-checks-logic.ts +206 -0
  387. package/scripts/repo/required-checks-report.ts +71 -0
  388. package/scripts/repo/ruleset-check-cli.ts +53 -0
  389. package/scripts/repo/ruleset-check.ts +147 -0
  390. package/scripts/report/report-lint-cli.ts +0 -4
  391. package/scripts/review/disposition-cli.ts +1 -1
  392. package/scripts/review/live-evidence.ts +1 -1
  393. package/scripts/review/review-attest-cli.ts +0 -6
  394. package/scripts/review/review-attest.ts +4 -16
  395. package/scripts/review/review-brief-cli.ts +23 -6
  396. package/scripts/review/review-brief.ts +21 -8
  397. package/scripts/review/review-diff-parts.ts +89 -0
  398. package/scripts/review/review-diff-write.ts +97 -0
  399. package/scripts/review/review-finding-ledger.ts +0 -1
  400. package/scripts/review/review-record-cli.ts +1 -1
  401. package/scripts/review/review-record.ts +0 -1
  402. package/scripts/review/review-round2-cli.ts +1 -1
  403. package/scripts/review/review-stamps.ts +0 -3
  404. package/scripts/review/review-tree.ts +14 -2
  405. package/scripts/rules/decision-oracle-stage.ts +18 -0
  406. package/scripts/rules/decision-oracle.ts +10 -7
  407. package/scripts/rules/delivered-rules.ts +9 -1
  408. package/scripts/rules/destructive-command.ts +119 -0
  409. package/scripts/rules/direct-filing.ts +1 -1
  410. package/scripts/rules/file-body.ts +0 -3
  411. package/scripts/rules/filing-cap.ts +0 -2
  412. package/scripts/rules/gh-api.ts +7 -2
  413. package/scripts/rules/git-argv.ts +18 -7
  414. package/scripts/rules/git-force.ts +0 -2
  415. package/scripts/rules/implementation-cut.ts +0 -1
  416. package/scripts/rules/index-guard.ts +71 -0
  417. package/scripts/rules/issue-citation.ts +50 -25
  418. package/scripts/rules/lane-background.ts +15 -7
  419. package/scripts/rules/lane-park.ts +13 -6
  420. package/scripts/rules/last-prompt.ts +1 -0
  421. package/scripts/rules/oracle-consulted.ts +1 -1
  422. package/scripts/rules/oracle-firing.ts +1 -0
  423. package/scripts/rules/oracle-list-cli.ts +0 -3
  424. package/scripts/rules/permission-guards.ts +14 -0
  425. package/scripts/rules/protected-files.ts +74 -0
  426. package/scripts/rules/reply-language.ts +1 -1
  427. package/scripts/rules/rule-body-guard.ts +0 -3
  428. package/scripts/rules/rule-value-cli.ts +0 -1
  429. package/scripts/rules/shell-body-trigger.ts +0 -1
  430. package/scripts/rules/shell-segments.ts +0 -1
  431. package/scripts/rules/stop-rules.ts +13 -5
  432. package/scripts/rules/tail-commands.ts +1 -1
  433. package/scripts/rules/test-declared-commit.ts +1 -1
  434. package/scripts/rules/third-party-write.ts +0 -1
  435. package/scripts/rules/worktree-guard.ts +26 -9
  436. package/scripts/run/run-carry-cli.ts +0 -2
  437. package/scripts/run/run-carry-stash.ts +2 -2
  438. package/scripts/run/run-carry-streak.ts +1 -1
  439. package/scripts/run/run-cut-cli.ts +0 -7
  440. package/scripts/run/run-cut.ts +8 -54
  441. package/scripts/run/run-ending-cli.ts +1 -1
  442. package/scripts/run/run-ending.ts +1 -4
  443. package/scripts/run/run-entry-cli.ts +101 -24
  444. package/scripts/run/run-entry.ts +0 -1
  445. package/scripts/run/run-event-cli.ts +0 -2
  446. package/scripts/run/run-event-follow.ts +1 -0
  447. package/scripts/run/run-event-render.ts +1 -1
  448. package/scripts/run/run-event-scope.ts +53 -4
  449. package/scripts/run/run-event-stream.ts +0 -3
  450. package/scripts/run/run-event-watch.ts +1 -0
  451. package/scripts/run/run-halfrun-resume.ts +20 -7
  452. package/scripts/run/run-headless.ts +2 -2
  453. package/scripts/run/run-hold-cli.ts +33 -10
  454. package/scripts/run/run-hold.ts +25 -5
  455. package/scripts/run/run-issue-number.ts +1 -1
  456. package/scripts/run/run-liveness-cli.ts +1 -1
  457. package/scripts/run/run-liveness.ts +2 -3
  458. package/scripts/run/run-merge-cli.ts +5 -13
  459. package/scripts/run/run-merge-steps.ts +5 -5
  460. package/scripts/run/run-merge.ts +1 -1
  461. package/scripts/run/run-next-cli.ts +1 -1
  462. package/scripts/run/run-parent-cut-hook.ts +0 -1
  463. package/scripts/run/run-preflight.ts +2 -9
  464. package/scripts/run/run-prep-cli.ts +2 -2
  465. package/scripts/run/run-prep-locate.ts +1 -1
  466. package/scripts/run/run-progress-cli.ts +4 -7
  467. package/scripts/run/run-progress-clock.ts +6 -34
  468. package/scripts/run/run-progress-config.ts +0 -4
  469. package/scripts/run/run-progress-read.ts +1 -2
  470. package/scripts/run/run-progress.ts +1 -2
  471. package/scripts/run/run-prrun-resume.ts +117 -0
  472. package/scripts/run/run-report-cli.ts +1 -2
  473. package/scripts/run/run-report.ts +0 -1
  474. package/scripts/run/run-retrospective.ts +1 -1
  475. package/scripts/run/run-review-cli.ts +0 -3
  476. package/scripts/run/run-review-steps.ts +2 -0
  477. package/scripts/run/run-review.ts +0 -2
  478. package/scripts/run/run-ship-cli.ts +21 -3
  479. package/scripts/run/run-ship-detach.ts +1 -0
  480. package/scripts/run/run-ship-next.ts +106 -0
  481. package/scripts/run/run-ship-preflight.ts +1 -1
  482. package/scripts/run/run-ship-return.ts +8 -3
  483. package/scripts/run/run-ship-review-steps.ts +18 -4
  484. package/scripts/run/run-ship-review.ts +11 -0
  485. package/scripts/run/run-ship-scoped.ts +1 -0
  486. package/scripts/run/run-ship-steps.ts +1 -1
  487. package/scripts/run/run-ship.ts +0 -1
  488. package/scripts/run/run-stage-read.ts +62 -0
  489. package/scripts/run/run-stage.ts +160 -0
  490. package/scripts/run/run-status-cli.ts +1 -1
  491. package/scripts/run/run-step-cli.ts +21 -14
  492. package/scripts/run/run-step.ts +1 -1
  493. package/scripts/run/run-stop-notify.ts +1 -3
  494. package/scripts/run/run-stranded-cli.ts +0 -4
  495. package/scripts/run/run-stranded-detect.ts +2 -2
  496. package/scripts/run/run-tail-cli.ts +17 -11
  497. package/scripts/run/run-tail.ts +2 -0
  498. package/scripts/run/run-tidy-lanes.ts +2 -1
  499. package/scripts/run/run-tidy-stashes.ts +12 -12
  500. package/scripts/run/run-wake-cli.ts +2 -3
  501. package/scripts/run/run-wake-loop.ts +2 -2
  502. package/scripts/run/run-wake.ts +2 -4
  503. package/scripts/run/run-watcher-guard-cli.ts +0 -4
  504. package/scripts/run/run-watcher-guard.ts +9 -7
  505. package/scripts/run/run-watcher-hook.ts +1 -1
  506. package/scripts/safe-chain/ci-installer-pin.ts +11 -5
  507. package/scripts/safe-chain/project-config.ts +1 -1
  508. package/scripts/security/security-audit-provision-logic.ts +0 -1
  509. package/scripts/security/security-audit-provision.ts +3 -2
  510. package/scripts/security/security-audit.ts +0 -1
  511. package/scripts/security/security-updates-logic.ts +0 -1
  512. package/scripts/sonar/sonar-hotspots-cli.ts +10 -52
  513. package/scripts/sonar/sonar-hotspots.ts +0 -1
  514. package/scripts/sonar/sonar-new-code-cli.ts +150 -0
  515. package/scripts/sonar/sonar-new-code.ts +79 -0
  516. package/scripts/sonar/sonar-project.ts +97 -0
  517. package/scripts/split/split-assess-cli.ts +1 -1
  518. package/scripts/split/split-assess.ts +2 -5
  519. package/scripts/sync/managed-config-scope-cli.ts +1 -1
  520. package/scripts/sync/skill-migration.ts +0 -1
  521. package/scripts/sync/sync-hook-safety.ts +2 -3
  522. package/scripts/sync/sync.ts +1 -8
  523. package/scripts/sync/template-source-logic.ts +0 -1
  524. package/scripts/sync/workflow-pin-logic.ts +16 -28
  525. package/scripts/test/test-declared-logic.ts +0 -1
  526. package/scripts/test/test-declared.ts +0 -2
  527. package/scripts/test/test-red-commit.ts +2 -2
  528. package/scripts/test/test-red.ts +14 -7
  529. package/scripts/test/test-type-logic.ts +1 -1
  530. package/scripts/test/unit-worker-share.ts +7 -16
  531. package/scripts/time-runtime/time-batch-guard.ts +1 -2
  532. package/scripts/time-runtime/time-bundle-call.ts +0 -1
  533. package/scripts/time-runtime/time-bundles.ts +0 -4
  534. package/scripts/time-runtime/time-density-hook.ts +0 -2
  535. package/scripts/time-runtime/time-followup-stage.ts +1 -1
  536. package/scripts/time-runtime/time-format.ts +0 -73
  537. package/scripts/time-runtime/time-round-trips.ts +0 -4
  538. package/scripts/time-runtime/time-single-check.ts +1 -1
  539. package/scripts/time-runtime/time-spans.ts +1 -1
  540. package/scripts/time-runtime/time-transcript-line.ts +1 -2
  541. package/scripts/ui/ui-routes-cli.ts +0 -5
  542. package/scripts/ui/ui-routes.ts +0 -5
  543. package/scripts/version/effective-upstream.ts +2 -2
  544. package/scripts/version/latest-corepack.ts +7 -9
  545. package/scripts/version/latest-scope-cli.ts +0 -2
  546. package/scripts/version/latest-update.ts +0 -2
  547. package/scripts/version/npm-registry.ts +2 -2
  548. package/scripts/version/publishable-range-check.ts +1 -1
  549. package/scripts/version/release-hold.ts +0 -4
  550. package/scripts/version/running-binary.ts +2 -2
  551. package/scripts/version/version-check-logic.ts +0 -2
  552. package/scripts/version/version-remote.ts +3 -3
  553. package/scripts/version/version-targets.ts +4 -4
  554. package/templates/sonar-project.properties +28 -1
  555. package/templates/workflows/dependabot-auto-merge.yml +5 -3
  556. package/templates/workflows/github-release.yml +81 -0
  557. package/prompts/collaboration-workflow/cross-repo-epic.md +0 -5
  558. package/prompts/collaboration-workflow/epic-audit.md +0 -5
  559. package/prompts/collaboration-workflow/epic-bundle.md +0 -5
  560. package/scripts/init/plugin-install-hint.ts +0 -47
  561. package/scripts/version/parse-json.ts +0 -13
  562. /package/scripts/{git → followup}/git-followup-stages.ts +0 -0
  563. /package/scripts/{git → gh}/git-gh-api-path.ts +0 -0
  564. /package/scripts/{git → gh}/git-gh-command.ts +0 -0
  565. /package/scripts/{git → gh}/git-gh-issue-write.ts +0 -0
  566. /package/scripts/{git → gh}/git-gh-issue.ts +0 -0
  567. /package/scripts/{git → gh}/git-gh-pr-auto-merge.ts +0 -0
  568. /package/scripts/{git → gh}/git-gh-pr-snapshot.ts +0 -0
  569. /package/scripts/{git → gh}/git-gh-reachability.ts +0 -0
  570. /package/scripts/{git → gh}/git-gh-repo.ts +0 -0
  571. /package/scripts/{git → gh}/git-gh-rest-state.ts +0 -0
  572. /package/scripts/{git → gh}/git-pr-checks-watch.ts +0 -0
  573. /package/scripts/{git → gh}/git-pr-error.ts +0 -0
  574. /package/scripts/{git → gh}/git-pr-messages.ts +0 -0
  575. /package/scripts/{git → gh}/github-issue-url.ts +0 -0
  576. /package/scripts/git/{stash-orphans.ts → stash/stash-orphans.ts} +0 -0
  577. /package/scripts/{git → issue}/issue-reference.ts +0 -0
  578. /package/scripts/{git → lib}/animation-helpers.ts +0 -0
  579. /package/scripts/{git → lib}/git-animation.ts +0 -0
  580. /package/scripts/{git → notify}/git-notify.ts +0 -0
  581. /package/scripts/{git → notify}/telegram-test-logic.ts +0 -0
@@ -238,13 +238,10 @@ const run_event_stream = {
238
238
  EVENT_CAP,
239
239
  EVENT_KIND,
240
240
  EVENT_KINDS,
241
- EVENT_PREFIX,
242
- EVENT_SUFFIX,
243
241
  TRACE_KINDS,
244
242
  append,
245
243
  format_event,
246
244
  has_since,
247
- is_event_kind,
248
245
  read_events,
249
246
  read_from,
250
247
  read_last,
@@ -22,6 +22,7 @@ async function watch(ports: WatchPorts, position: number): Promise<number> {
22
22
  let next = position
23
23
 
24
24
  while (ports.should_continue()) {
25
+ // eslint-disable-next-line no-await-in-loop -- polling: each read waits on the state the previous one saw
25
26
  const read = await ports.pass(next)
26
27
 
27
28
  for (const event of read.events) ports.write(ports.render(event))
@@ -1,4 +1,4 @@
1
- import { run_hold, type HoldRead, type RunHold } from './run-hold'
1
+ import { run_hold, type HoldRead, type RunHold, type StopMarkFields } from './run-hold'
2
2
 
3
3
  // joshuafolkken/kit#2796: a `halfrun` stops before its commit and **keeps** its hold, because the
4
4
  // uncommitted, hand-verified work is exactly what a second run would trample. The person then types
@@ -38,7 +38,13 @@ function is_own_record(read: HoldRead, issue: string): boolean {
38
38
  return hold === undefined || hold.issue === issue || hold.issue === run_hold.UNNUMBERED_ISSUE
39
39
  }
40
40
 
41
- function mark_stop_at(target: string, issue: string): StopMark {
41
+ // `mark` is the `halfrun` stop's by default; a `prrun` stop passes its own (joshuafolkken/kit#3023), so
42
+ // the own-record check is one check whichever run is stopping.
43
+ function mark_stop_at(
44
+ target: string,
45
+ issue: string,
46
+ mark: StopMarkFields = run_hold.HALFRUN_STOP_FIELDS,
47
+ ): StopMark {
42
48
  const read = run_hold.read_hold(target)
43
49
 
44
50
  if (read.kind === 'unreadable') return UNREADABLE
@@ -47,7 +53,14 @@ function mark_stop_at(target: string, issue: string): StopMark {
47
53
 
48
54
  run_hold.release_hold(target)
49
55
 
50
- return run_hold.create_halfrun_stop_hold(target, issue) ? MARKED : FOREIGN
56
+ return run_hold.create_stop_hold(target, issue, mark) ? MARKED : FOREIGN
57
+ }
58
+
59
+ // The stopped run's record is replaced by this `fullrun`'s, shared with the `prrun` resume.
60
+ function take_over(target: string, issue: string): boolean {
61
+ run_hold.release_hold(target)
62
+
63
+ return run_hold.create_hold(target, issue, new Date(), true)
51
64
  }
52
65
 
53
66
  // `false` leaves the record untouched, so the ordinary claim that follows decides the tree exactly as
@@ -55,9 +68,7 @@ function mark_stop_at(target: string, issue: string): StopMark {
55
68
  function adopt_at(target: string, issue: string, is_dirty: boolean): boolean {
56
69
  if (!is_halfrun_stop(run_hold.read_hold(target), issue, is_dirty)) return false
57
70
 
58
- run_hold.release_hold(target)
59
-
60
- return run_hold.create_hold(target, issue, new Date(), true)
71
+ return take_over(target, issue)
61
72
  }
62
73
 
63
74
  // **An unreadable git directory is no resume**, never a crash: `run:entry` must still print its one
@@ -95,9 +106,11 @@ const run_halfrun_resume = {
95
106
  UNREADABLE,
96
107
  adopt,
97
108
  adopt_at,
98
- is_halfrun_stop,
109
+ hold_of,
110
+ hold_target,
99
111
  is_pending,
100
112
  mark_stop_at,
113
+ take_over,
101
114
  }
102
115
 
103
116
  export type { StopMark }
@@ -1,7 +1,7 @@
1
1
  import { lane_child_marker } from '#scripts/lane/lane-child-marker'
2
2
  import { lane_reap } from '#scripts/lane/lane-reap'
3
+ import { lane_registry } from '#scripts/lane/lane-registry'
3
4
  import { run_carry, type CarryRead, type RunCarry } from './run-carry'
4
- import { run_watcher_guard } from './run-watcher-guard'
5
5
 
6
6
  // The headless `backlogrun` parent (joshuafolkken/kit#2437). `run:wake` starts a cut's successor as
7
7
  // `claude -p`, and there a turn that ends is the process that ends: its background `lane:await` and
@@ -51,7 +51,7 @@ async function read_carry_here(): Promise<CarryRead | undefined> {
51
51
  async function must_keep_waiting(source: EnvironmentSource = process.env): Promise<boolean> {
52
52
  const is_candidate = is_headless(source) && lane_child_marker.marked_issue(source) === undefined
53
53
 
54
- if (!is_candidate || !(await run_watcher_guard.has_lanes_in_flight())) return false
54
+ if (!is_candidate || !(await lane_registry.has_lanes_in_flight())) return false
55
55
 
56
56
  return is_driving(await read_carry_here())
57
57
  }
@@ -3,6 +3,7 @@ import { fileURLToPath } from 'node:url'
3
3
  import { run_halfrun_resume } from './run-halfrun-resume'
4
4
  import { run_hold, type HoldRead, type RunHold } from './run-hold'
5
5
  import { run_preflight, type PreflightDecision } from './run-preflight'
6
+ import { run_prrun_resume } from './run-prrun-resume'
6
7
  import { run_tidy_cli } from './run-tidy-cli'
7
8
 
8
9
  // `josh run:hold [<N>]` and `josh run:release [<N> | --force]` — the working-tree guard the typed
@@ -48,11 +49,13 @@ const FORCE_FLAG = '--force'
48
49
  // implementation cut outside a lane resumes as `fullrun #N` (joshuafolkken/kit#2760).
49
50
  const FULLRUN_FLAG = '--fullrun'
50
51
  const HALFRUN_STOP_FLAG = '--halfrun-stop'
52
+ // A `prrun`'s stop before merge (joshuafolkken/kit#3023): its record keeps the commit it stopped on.
53
+ const PRRUN_STOP_FLAG = '--prrun-stop'
51
54
  // The most a claim reads: the issue number and the one flag after it.
52
55
  const MAX_CLAIM_ARGUMENTS = 2
53
56
  const ISSUE_NUMBER_PATTERN = /^[1-9]\d*$/u
54
57
  const USAGE =
55
- 'Usage: josh run:hold [<issue-number> [--fullrun | --halfrun-stop]] | josh run:release [<issue-number> | --force]'
58
+ 'Usage: josh run:hold [<issue-number> [--fullrun | --halfrun-stop | --prrun-stop]] | josh run:release [<issue-number> | --force]'
56
59
 
57
60
  const HOLD_VERDICT = 'hold'
58
61
  const BUSY_VERDICT = 'busy'
@@ -65,6 +68,7 @@ const HELD_VERDICT = 'held'
65
68
 
66
69
  const FORCE_RELEASE_KIND = 'force-release'
67
70
  const HALFRUN_STOP_KIND = 'halfrun-stop'
71
+ const PRRUN_STOP_KIND = 'prrun-stop'
68
72
 
69
73
  interface ClaimRequest {
70
74
  kind: 'claim'
@@ -72,11 +76,20 @@ interface ClaimRequest {
72
76
  is_fullrun?: boolean
73
77
  }
74
78
 
79
+ interface StopRequest {
80
+ kind: typeof HALFRUN_STOP_KIND | typeof PRRUN_STOP_KIND
81
+ issue: string
82
+ }
83
+
75
84
  type HoldRequest =
76
85
  | ClaimRequest
86
+ | StopRequest
77
87
  | { kind: 'release'; claimant: string }
78
88
  | { kind: typeof FORCE_RELEASE_KIND }
79
- | { kind: typeof HALFRUN_STOP_KIND; issue: string }
89
+
90
+ function is_stop_request(request: HoldRequest): request is StopRequest {
91
+ return request.kind === HALFRUN_STOP_KIND || request.kind === PRRUN_STOP_KIND
92
+ }
80
93
 
81
94
  const FORCE_RELEASE_REQUEST: HoldRequest = { kind: FORCE_RELEASE_KIND }
82
95
 
@@ -84,12 +97,20 @@ function release_request(claimant: string): HoldRequest {
84
97
  return { kind: 'release', claimant }
85
98
  }
86
99
 
87
- // The flag after a numbered claim: absent, `--fullrun` or `--halfrun-stop`. Anything else is a usage
88
- // error.
100
+ const STOP_KIND_BY_FLAG: ReadonlyMap<string, typeof HALFRUN_STOP_KIND | typeof PRRUN_STOP_KIND> =
101
+ new Map([
102
+ [HALFRUN_STOP_FLAG, HALFRUN_STOP_KIND],
103
+ [PRRUN_STOP_FLAG, PRRUN_STOP_KIND],
104
+ ])
105
+
106
+ // The flag after a numbered claim: absent, `--fullrun`, `--halfrun-stop` or `--prrun-stop`. Anything
107
+ // else is a usage error.
89
108
  function numbered_claim(issue: string, flag: string | undefined): HoldRequest | undefined {
90
109
  if (flag === undefined) return { kind: 'claim', issue }
91
110
 
92
- if (flag === HALFRUN_STOP_FLAG) return { kind: HALFRUN_STOP_KIND, issue }
111
+ const stop_kind = STOP_KIND_BY_FLAG.get(flag)
112
+
113
+ if (stop_kind !== undefined) return { kind: stop_kind, issue }
93
114
 
94
115
  return flag === FULLRUN_FLAG ? { kind: 'claim', issue, is_fullrun: true } : undefined
95
116
  }
@@ -293,8 +314,12 @@ async function read_worktree(): Promise<string | undefined> {
293
314
 
294
315
  // **A `halfrun` stop marks its own record** (joshuafolkken/kit#2796) — the positive "this run has ended
295
316
  // over its verified diff" that `run:entry` adopts on `fullrun #N`. Another run's record is left alone.
296
- function mark_halfrun_stop(target: string, issue: string): number {
297
- const mark = run_halfrun_resume.mark_stop_at(target, issue)
317
+ // A `prrun` stop marks its record the same way, with the commit it stopped on (joshuafolkken/kit#3023).
318
+ async function mark_stop(target: string, request: StopRequest): Promise<number> {
319
+ const mark =
320
+ request.kind === PRRUN_STOP_KIND
321
+ ? await run_prrun_resume.mark_stop_at(target, request.issue)
322
+ : run_halfrun_resume.mark_stop_at(target, request.issue)
298
323
 
299
324
  if (mark === run_halfrun_resume.MARKED) return report_hold()
300
325
 
@@ -306,7 +331,7 @@ function mark_halfrun_stop(target: string, issue: string): number {
306
331
  async function dispatch(request: HoldRequest, target: string, is_linked: boolean): Promise<number> {
307
332
  if (request.kind === 'claim') return await claim(target, request, is_linked)
308
333
 
309
- if (request.kind === HALFRUN_STOP_KIND) return mark_halfrun_stop(target, request.issue)
334
+ if (is_stop_request(request)) return await mark_stop(target, request)
310
335
 
311
336
  if (request.kind === FORCE_RELEASE_KIND) return force_release(target)
312
337
 
@@ -351,8 +376,6 @@ const run_hold_cli = {
351
376
  RELEASED_VERDICT,
352
377
  UNKNOWN_VERDICT,
353
378
  USAGE,
354
- blocking_message,
355
- main,
356
379
  parse_request,
357
380
  run,
358
381
  }
@@ -52,6 +52,10 @@ interface RunHold {
52
52
  // the positive record that the run has *ended* over its verified diff, which is what lets
53
53
  // `fullrun #N` adopt the hold. A running `halfrun` or a `backlogrun` child never carries it.
54
54
  is_halfrun_stop?: boolean | undefined
55
+ // Set only at a `prrun`'s stop before merge (`run:hold <N> --prrun-stop`, joshuafolkken/kit#3023): the
56
+ // commit the green pull request stood on, so `fullrun #N` can tell an untouched branch — merge it —
57
+ // from one that moved since and has to pass the gate and the review again.
58
+ prrun_stop_head?: string | undefined
55
59
  }
56
60
 
57
61
  type HoldRead =
@@ -92,6 +96,7 @@ const run_hold_schema = z.object({
92
96
  pid: z.number(),
93
97
  is_fullrun: z.boolean().optional(),
94
98
  is_halfrun_stop: z.boolean().optional(),
99
+ prrun_stop_head: z.string().optional(),
95
100
  })
96
101
 
97
102
  // `undefined` for anything that is not a well-formed record, so the caller decides what a broken one
@@ -161,9 +166,24 @@ function create_hold(
161
166
  return stamp_file.create_stamp(target, build_hold(issue, now, is_fullrun))
162
167
  }
163
168
 
164
- // The claim a `halfrun` stop leaves behind: the same exclusive create, carrying the stop mark.
169
+ // What a stopped run's record carries on top of the claim: the `halfrun` stop's flag, or the commit a
170
+ // `prrun` stop stood on (joshuafolkken/kit#3023).
171
+ type StopMarkFields = Pick<RunHold, 'is_halfrun_stop' | 'prrun_stop_head'>
172
+
173
+ const HALFRUN_STOP_FIELDS: StopMarkFields = { is_halfrun_stop: true }
174
+
175
+ // The claim a stop leaves behind: the same exclusive create, carrying the stop mark.
176
+ function create_stop_hold(
177
+ target: string,
178
+ issue: string,
179
+ mark: StopMarkFields,
180
+ now: Date = new Date(),
181
+ ): boolean {
182
+ return stamp_file.create_stamp(target, { ...build_hold(issue, now), ...mark })
183
+ }
184
+
165
185
  function create_halfrun_stop_hold(target: string, issue: string, now: Date = new Date()): boolean {
166
- return stamp_file.create_stamp(target, { ...build_hold(issue, now), is_halfrun_stop: true })
186
+ return create_stop_hold(target, issue, HALFRUN_STOP_FIELDS, now)
167
187
  }
168
188
 
169
189
  // **A tree with uncommitted work in it is never handed over, however old its record is.** No age can
@@ -260,8 +280,9 @@ const run_hold = {
260
280
  UNNUMBERED_ISSUE,
261
281
  classify,
262
282
  create_halfrun_stop_hold,
283
+ create_stop_hold,
284
+ HALFRUN_STOP_FIELDS,
263
285
  create_hold,
264
- describe_holder,
265
286
  foreign_release_message,
266
287
  forced_release_message,
267
288
  held_message,
@@ -270,7 +291,6 @@ const run_hold = {
270
291
  is_own_hold,
271
292
  is_tree_dirty,
272
293
  own_release_command,
273
- parse_hold,
274
294
  race_message,
275
295
  read_hold,
276
296
  release_hold,
@@ -282,5 +302,5 @@ const run_hold = {
282
302
  write_hold,
283
303
  }
284
304
 
285
- export type { HoldRead, RunHold }
305
+ export type { HoldRead, RunHold, StopMarkFields }
286
306
  export { run_hold }
@@ -14,6 +14,6 @@ function require_issue_number(issue: string): void {
14
14
  if (!ISSUE_NUMBER_PATTERN.test(issue)) throw new Error(`${BAD_ISSUE_MESSAGE}${issue}`)
15
15
  }
16
16
 
17
- const run_issue_number = { BAD_ISSUE_MESSAGE, ISSUE_NUMBER_PATTERN, require_issue_number }
17
+ const run_issue_number = { ISSUE_NUMBER_PATTERN, require_issue_number }
18
18
 
19
19
  export { run_issue_number }
@@ -159,7 +159,7 @@ async function main(argv: ReadonlyArray<string>): Promise<void> {
159
159
  process.exitCode = await run(argv)
160
160
  }
161
161
 
162
- const run_liveness_cli = { USAGE, main, parse_request, run }
162
+ const run_liveness_cli = { USAGE, parse_request, run }
163
163
 
164
164
  if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
165
165
 
@@ -3,8 +3,8 @@ import { homedir, tmpdir } from 'node:os'
3
3
  import path from 'node:path'
4
4
  import { setTimeout as sleep } from 'node:timers/promises'
5
5
  import { agent_event, type AgentEventState } from '#scripts/agent/agent-event'
6
- import { git_gh_issue_read } from '#scripts/git/git-gh-issue-read'
7
- import { ALREADY_DONE_LABEL, NEEDS_DECISION_LABEL } from '#scripts/git/issue-labels'
6
+ import { git_gh_issue_read } from '#scripts/gh/git-gh-issue-read'
7
+ import { ALREADY_DONE_LABEL, NEEDS_DECISION_LABEL } from '#scripts/issue/issue-labels'
8
8
  import { issue_state } from '#scripts/issue/issue-state'
9
9
  import { PLATFORM_TEMP_ROOT } from '#scripts/josh/platform-temporary'
10
10
  import { run_hold } from './run-hold'
@@ -401,7 +401,6 @@ const run_liveness = {
401
401
  decide,
402
402
  describe_agent_state,
403
403
  read_child_settled,
404
- read_agent_state,
405
404
  read_output_frozen,
406
405
  sample_output,
407
406
  to_safe_path,
@@ -5,6 +5,7 @@ import { api_outage } from '#scripts/agent/api-outage'
5
5
  import { CONTEXT_CUT_THRESHOLD } from '#scripts/cost-runtime/context-cut-threshold'
6
6
  import { issue_closing_pr } from '#scripts/issue/issue-closing-pr'
7
7
  import { issue_state_cli } from '#scripts/issue/issue-state-cli'
8
+ import { lane_handoff } from '#scripts/lane/lane-handoff'
8
9
  import { run_carry, type CarryOwner, type RunCarry } from './run-carry'
9
10
  import { run_ending } from './run-ending'
10
11
  import { run_event_stream } from './run-event-stream'
@@ -12,8 +13,6 @@ import { run_event_stream_emit } from './run-event-stream-emit'
12
13
  import { run_issue_number } from './run-issue-number'
13
14
  import { run_merge, type ChildOutcome, type EndingSignals } from './run-merge'
14
15
  import { run_merge_steps, type MergeContext } from './run-merge-steps'
15
- import { run_ship_detach } from './run-ship-detach'
16
- import { run_ship_probe } from './run-ship-probe'
17
16
 
18
17
  // `josh run:merge <N>` — one composite command for a `backlogrun` merge event (joshuafolkken/kit#2024).
19
18
  // The parent's context is the largest and its per-turn cost the highest, and the event was two turns:
@@ -316,7 +315,10 @@ async function on_cut(ctx: MergeContext): Promise<MergeVerdict> {
316
315
 
317
316
  // A child that parked itself: nothing is counted, but the park is written to the stream as a failed
318
317
  // child's is, so a reader restoring the run from its events sees the child settled (joshuafolkken/kit#2508).
318
+ // Its `in-progress` is dropped as a failed child's is: left on, it outlived the `needs-decision` a
319
+ // person later lifted, and a `run:solo` child then held the whole backlog (joshuafolkken/kit#3017).
319
320
  async function on_parked(ctx: MergeContext): Promise<MergeVerdict> {
321
+ await run_merge_steps.remove_in_progress(ctx.child)
320
322
  await run_event_stream_emit.emit(run_event_stream.EVENT_KIND.PARK, `#${ctx.child} parked`)
321
323
 
322
324
  return emit(await run_merge_steps.ask_next(ctx), SUCCESS_EXIT_CODE)
@@ -355,18 +357,10 @@ const HANDLERS: Readonly<Record<ChildOutcome, (ctx: MergeContext) => Promise<Mer
355
357
  shipping: on_shipping,
356
358
  }
357
359
 
358
- async function is_ship_running(child: string): Promise<boolean> {
359
- const repository = await run_ship_probe.repository_directory()
360
-
361
- return (
362
- repository !== undefined && run_ship_detach.read_result(repository, child)?.result === 'running'
363
- )
364
- }
365
-
366
360
  // The whole merge event for one returned child, in-process: read its state, classify it, and run the
367
361
  // handler. The CLI prints the token; `backlog:drive` branches on the outcome (joshuafolkken/kit#2508).
368
362
  async function merge_child(ctx: MergeContext): Promise<MergeResult> {
369
- if (await is_ship_running(ctx.child)) {
363
+ if (lane_handoff.is_ship_running(ctx.child, process.cwd())) {
370
364
  return { outcome: 'shipping', ...(await on_shipping()) }
371
365
  }
372
366
 
@@ -405,8 +399,6 @@ const run_merge_cli = {
405
399
  RESUMED_TOKEN,
406
400
  RETRY_TOKEN,
407
401
  STOP_TOKEN,
408
- USAGE,
409
- main,
410
402
  merge_child,
411
403
  parse,
412
404
  run,
@@ -1,9 +1,9 @@
1
1
  import { existsSync } from 'node:fs'
2
2
  import path from 'node:path'
3
- import { git_followup_issue_close } from '#scripts/git/git-followup-issue-close'
4
- import { git_gh_issue_write } from '#scripts/git/git-gh-issue-write'
5
- import { git_stash } from '#scripts/git/git-stash'
6
- import { IN_PROGRESS_LABEL, NEEDS_DECISION_LABEL } from '#scripts/git/issue-labels'
3
+ import { git_followup_issue_close } from '#scripts/followup/git-followup-issue-close'
4
+ import { git_gh_issue_write } from '#scripts/gh/git-gh-issue-write'
5
+ import { git_stash } from '#scripts/git/stash/git-stash'
6
+ import { IN_PROGRESS_LABEL, NEEDS_DECISION_LABEL } from '#scripts/issue/issue-labels'
7
7
  import { josh_command, type JoshResult } from '#scripts/josh/josh-run'
8
8
  import { lane_close } from '#scripts/lane/lane-close'
9
9
  import { lane_reap } from '#scripts/lane/lane-reap'
@@ -347,7 +347,6 @@ async function ask_next(ctx: MergeContext): Promise<string> {
347
347
 
348
348
  const run_merge_steps = {
349
349
  CUT_RELAUNCH_CAUSE,
350
- apply_carry,
351
350
  ask_next,
352
351
  do_failed,
353
352
  do_merged,
@@ -355,6 +354,7 @@ const run_merge_steps = {
355
354
  has_resumable_cut,
356
355
  is_over_budget,
357
356
  refused_carry,
357
+ remove_in_progress,
358
358
  resume_cut,
359
359
  }
360
360
 
@@ -3,7 +3,7 @@ import {
3
3
  EPIC_LABEL,
4
4
  has_label_name,
5
5
  NEEDS_DECISION_LABEL,
6
- } from '#scripts/git/issue-labels'
6
+ } from '#scripts/issue/issue-labels'
7
7
  import type { IssueState } from '#scripts/issue/issue-state'
8
8
  import type { CarryChange, RunCarry } from './run-carry'
9
9
 
@@ -41,7 +41,7 @@ async function main(argv: ReadonlyArray<string>): Promise<void> {
41
41
  process.exitCode = await run(argv)
42
42
  }
43
43
 
44
- const run_next_cli = { USAGE, main, run }
44
+ const run_next_cli = { run }
45
45
 
46
46
  if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
47
47
 
@@ -135,7 +135,6 @@ async function parent_cut_reason(
135
135
  const run_parent_cut_hook = {
136
136
  PARENT_CUT_REASON,
137
137
  QUIET_WINDOW_MS,
138
- STAMP_PREFIX,
139
138
  SWITCH_ENV_KEY,
140
139
  parent_cut_reason,
141
140
  }
@@ -1,5 +1,5 @@
1
+ import { git_gh_pr_read } from '#scripts/gh/git-gh-pr-read'
1
2
  import { git_command } from '#scripts/git/git-command'
2
- import { git_gh_pr_read } from '#scripts/git/git-gh-pr-read'
3
3
  import { lane_registry, type LaneInfo } from '#scripts/lane/lane-registry'
4
4
  import { z } from 'zod'
5
5
  import { run_hold } from './run-hold'
@@ -89,7 +89,7 @@ const STASH_LABEL_PREFIX = 'run:hold reclaimed before #'
89
89
  // so the shape it may take is pinned beside the interpolation rather than only in the CLI that
90
90
  // happens to be today's single caller. `run:liveness` interpolates it the same way, so the pattern
91
91
  // and the refusal live in one module both read (joshuafolkken/kit#1485).
92
- const { ISSUE_NUMBER_PATTERN, require_issue_number } = run_issue_number
92
+ const { require_issue_number } = run_issue_number
93
93
  const UNREADABLE_PR_MESSAGE = 'The pull request could not be read for branch '
94
94
 
95
95
  function needs_reclaim(tree: TreeState): boolean {
@@ -385,15 +385,8 @@ async function check(issue: string): Promise<PreflightDecision> {
385
385
  }
386
386
 
387
387
  const run_preflight = {
388
- CLEAN_ADVICE,
389
- CLEAN_REASON,
390
388
  CLEAN_VERDICT,
391
- ISSUE_NUMBER_PATTERN,
392
- PARK_ADVICE,
393
- PARK_VERDICT,
394
- RECLAIM_VERDICT,
395
389
  RESUME_ADVICE,
396
- RESUME_VERDICT,
397
390
  MERGED_PR,
398
391
  STASH_LABEL_PREFIX,
399
392
  check,
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env tsx
2
2
  import { fileURLToPath } from 'node:url'
3
- import { git_stash } from '#scripts/git/git-stash'
3
+ import { git_stash } from '#scripts/git/stash/git-stash'
4
4
  import { issue_read_cli, type BlockRead } from '#scripts/issue/issue-read-cli'
5
5
  import { issue_state_cli, type StateRead } from '#scripts/issue/issue-state-cli'
6
6
  import { lane_child_marker } from '#scripts/lane/lane-child-marker'
@@ -150,7 +150,7 @@ async function main(argv: ReadonlyArray<string>): Promise<void> {
150
150
  // `gather` and `to_parts` are exported so `run:next` reads the same state from the same three reads
151
151
  // rather than growing a second copy of the gather (joshuafolkken/kit#2188) — `run:next` is the
152
152
  // consumer of `run:prep` the epic #2166 wanted.
153
- const run_prep_cli = { USAGE, gather, main, parse_number, run, to_parts }
153
+ const run_prep_cli = { gather, parse_number, run, to_parts }
154
154
 
155
155
  if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
156
156
 
@@ -159,7 +159,7 @@ async function locate(text: string): Promise<string> {
159
159
  return format_locations(located)
160
160
  }
161
161
 
162
- const run_prep_locate = { extract_targets, format_locations, locate, parse_hits }
162
+ const run_prep_locate = { extract_targets, locate, parse_hits }
163
163
 
164
164
  export type { Hit, Located }
165
165
  export { run_prep_locate }
@@ -28,7 +28,7 @@ import { run_progress_read, type ObservationRead } from './run-progress-read'
28
28
  // `backlogrun` parent — `ready #N · free lanes N` — which is itself something the parent acts on.
29
29
  //
30
30
  // **It cannot send a Telegram.** That is structural rather than a promise — nothing here imports
31
- // `scripts/git/telegram-notify`, which is the only egress there is. A heartbeat every twenty minutes on
31
+ // `scripts/notify/telegram-notify`, which is the only egress there is. A heartbeat every twenty minutes on
32
32
  // a phone is notification fatigue, and it would cheapen the `confirmation` and `completion` messages
33
33
  // that do need to interrupt someone.
34
34
 
@@ -347,10 +347,13 @@ async function run_ticks(
347
347
  let loop = seed_loop(target, started_ms)
348
348
 
349
349
  while (Date.now() - started_ms < options.max_ms && !run_progress_clock.is_life_ended(life)) {
350
+ // eslint-disable-next-line no-await-in-loop -- polling: each read waits on the state the previous one saw
350
351
  await sleep(options.tick_ms)
351
352
  run_progress_clock.ping_life(life)
353
+ // eslint-disable-next-line no-await-in-loop -- polling: each read waits on the state the previous one saw
352
354
  loop = await step(options, target, loop)
353
355
 
356
+ // eslint-disable-next-line no-await-in-loop -- polling: each read waits on the state the previous one saw
354
357
  const exit = await wait_exit(loop, wait)
355
358
 
356
359
  if (exit !== undefined) return exit
@@ -491,27 +494,21 @@ async function main(argv: ReadonlyArray<string>): Promise<void> {
491
494
  }
492
495
 
493
496
  const run_progress_cli = {
494
- DECLINE_RETRY_SECONDS,
495
497
  DEFAULT_MAX_HOURS,
496
498
  DISABLED_NOTICE,
497
499
  FAILED_TICK_PREFIX,
498
500
  FRESH_LOOP,
499
501
  IDLE_NOTICE,
500
502
  LANE_CHILD_NOTICE,
501
- MARKED_NOTICE,
502
503
  REPO_UNRESOLVED_NOTICE,
503
- TICK_SECONDS,
504
504
  UNREADABLE_NOTICE,
505
505
  USAGE,
506
506
  WAIT_EXPIRED_NOTICE,
507
- main,
508
507
  read_arguments: run_progress_args.read_arguments,
509
- report_decline,
510
508
  run,
511
509
  step,
512
510
  to_interval_ms: run_progress_args.to_interval_ms,
513
511
  to_max_ms: run_progress_args.to_max_ms,
514
- to_options,
515
512
  wait_once,
516
513
  }
517
514
 
@@ -1,6 +1,5 @@
1
- import { git_utilities } from '#scripts/git/constants'
1
+ import { git_common_directory } from '#scripts/git/git-common-directory'
2
2
  import { stamp_file } from '#scripts/josh/stamp-file'
3
- import { execaSync } from 'execa'
4
3
  import { z } from 'zod'
5
4
 
6
5
  // The report clock `josh run:progress` keeps, in the one form both of its readers can use
@@ -16,9 +15,10 @@ import { z } from 'zod'
16
15
  //
17
16
  // **The key is the work tree's own git directory**, the way `run_hold` keys its record: two lanes of
18
17
  // one repository are two runs, and one lane's report must not silence the other's clock. The
19
- // synchronous twin asks `git rev-parse --absolute-git-dir`, which is the first of the two lines
20
- // `git_command.git_directories` reads and the one the asynchronous path already takes — so the two
21
- // spellings cannot name different files.
18
+ // synchronous twin is `git_common_directory.own()`, which asks the same two lines
19
+ // `git_command.git_directories` reads and takes the first — so the two spellings cannot name different
20
+ // files. A git read that fails or times out answers `undefined`, which reads as "no clock here" and
21
+ // lets the call through.
22
22
 
23
23
  const PROGRESS_PREFIX = 'josh-run-progress-'
24
24
  // The watcher's own liveness record, kept apart from the report clock above: that one says *when* the
@@ -55,14 +55,6 @@ const MS_PER_MINUTE = 60_000
55
55
  const LOG_STALE_MINUTES = 90
56
56
  const LOG_STALE_MS = LOG_STALE_MINUTES * MS_PER_MINUTE
57
57
  const BLOCK_SEPARATOR = '\n\n'
58
- // The lookup only ever decides whether a rule speaks, so a git call that hangs must not hold the hook
59
- // that is holding the user's call. A timeout answers `undefined`, which reads as "no clock here" and
60
- // lets the call through — the direction every other failure in this path already takes.
61
- const GIT_TIMEOUT_MS = 5000
62
- // The first of the two lines `git_command.git_directories` reads, asked on its own because that is the
63
- // one the record is keyed on. Asking git rather than assuming a directory named `.git` is what makes a
64
- // linked work tree, a bare repository and a `--separate-git-dir` clone all answer correctly.
65
- const GIT_DIRECTORY_ARGUMENTS: ReadonlyArray<string> = ['rev-parse', '--absolute-git-dir']
66
58
 
67
59
  // `line` is the last heartbeat the watcher printed, kept verbatim beside the clock so a reader that
68
60
  // cannot see the watcher's transcript — a person checking a woken headless `backlogrun` through
@@ -259,25 +251,8 @@ function end_life(target: string): void {
259
251
  stamp_file.remove_stamp(target)
260
252
  }
261
253
 
262
- // execa runs the binary directly with an argument array and no `shell` option, so CLI args cannot
263
- // break out of a shell sandbox; the git command and args are internally controlled, never untrusted
264
- // input. tssecurity:S8705 is a false positive here.
265
- function git_directory_sync(): string | undefined {
266
- const git_binary = git_utilities.get_git_command_for_spawn()
267
- const result = execaSync(git_binary, GIT_DIRECTORY_ARGUMENTS, {
268
- reject: false,
269
- timeout: GIT_TIMEOUT_MS,
270
- }) // NOSONAR
271
-
272
- if (result.exitCode !== 0) return undefined
273
-
274
- const output = result.stdout.trim()
275
-
276
- return output === '' ? undefined : output
277
- }
278
-
279
254
  function stamp_target_sync(): string | undefined {
280
- const directory = git_directory_sync()
255
+ const directory = git_common_directory.own()
281
256
 
282
257
  return directory === undefined ? undefined : stamp_target_of(directory)
283
258
  }
@@ -299,8 +274,6 @@ const run_progress_clock = {
299
274
  LIFE_PREFIX,
300
275
  LOG_KEEP,
301
276
  LOG_STALE_MS,
302
- PROGRESS_PREFIX,
303
- append_line,
304
277
  begin_life,
305
278
  end_life,
306
279
  is_life_ended,
@@ -314,7 +287,6 @@ const run_progress_clock = {
314
287
  read_last_report,
315
288
  read_last_report_sync,
316
289
  stamp_target_of,
317
- stamp_target_sync,
318
290
  }
319
291
 
320
292
  export { run_progress_clock }
@@ -27,8 +27,6 @@ import { run_progress } from './run-progress'
27
27
  // watcher it guards kept the default, which is the one state this module exists to prevent.
28
28
 
29
29
  const PACKAGE_FILE = 'package.json'
30
- const CONFIG_FIELD = 'josh'
31
- const INTERVAL_FIELD = 'progress_interval_minutes'
32
30
 
33
31
  // Deep enough to cross a workspace package and its root, and bounded so a path that never reaches a
34
32
  // root — a broken mount, a mocked `dirname` — cannot spin.
@@ -108,8 +106,6 @@ function configured_interval_ms(directory: string = process.cwd()): number {
108
106
  }
109
107
 
110
108
  const run_progress_config = {
111
- CONFIG_FIELD,
112
- INTERVAL_FIELD,
113
109
  PACKAGE_FILE,
114
110
  configured_interval_ms,
115
111
  read_package_minutes,