@joshuafolkken/kit 1.1514.0 → 1.2114.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 (1176) hide show
  1. package/.claude/agents/investigator.md +1 -1
  2. package/.claude/agents/reviewer-verification.md +19 -0
  3. package/.claude/agents/reviewer.md +19 -0
  4. package/.claude/settings.json +5 -6
  5. package/.claude/skills/dependency-update/SKILL.md +9 -10
  6. package/.claude/skills/epic-commands/SKILL.md +26 -65
  7. package/.claude/skills/epic-commands/epic-bundle.md +3 -1
  8. package/.claude/skills/workflow-commands/SKILL.md +11 -11
  9. package/.claude/skills/workflow-commands/background-commands.md +13 -10
  10. package/.claude/skills/workflow-commands/backlogrun-child.md +12 -8
  11. package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +7 -25
  12. package/.claude/skills/workflow-commands/backlogrun-lanes.md +18 -14
  13. package/.claude/skills/workflow-commands/backlogrun-park.md +18 -24
  14. package/.claude/skills/workflow-commands/backlogrun-progress.md +4 -5
  15. package/.claude/skills/workflow-commands/backlogrun-recovery.md +6 -6
  16. package/.claude/skills/workflow-commands/backlogrun-steps.md +12 -11
  17. package/.claude/skills/workflow-commands/backlogrun.md +1 -1
  18. package/.claude/skills/workflow-commands/chain-rule.md +43 -28
  19. package/.claude/skills/workflow-commands/delegation.md +11 -10
  20. package/.claude/skills/workflow-commands/entry-sequence.md +10 -10
  21. package/.claude/skills/workflow-commands/followup.md +16 -36
  22. package/.claude/skills/workflow-commands/fullrun-steps.md +38 -47
  23. package/.claude/skills/workflow-commands/fullrun.md +3 -3
  24. package/.claude/skills/workflow-commands/halfrun.md +17 -25
  25. package/.claude/skills/workflow-commands/issue-comments.md +25 -16
  26. package/.claude/skills/workflow-commands/issue-fold-existing.md +2 -1
  27. package/.claude/skills/workflow-commands/issue-scout.md +2 -2
  28. package/.claude/skills/workflow-commands/kickoff.md +24 -23
  29. package/.claude/skills/workflow-commands/latest-gate.md +7 -12
  30. package/.claude/skills/workflow-commands/needs-human-review.md +9 -14
  31. package/.claude/skills/workflow-commands/observation-filing.md +4 -36
  32. package/.claude/skills/workflow-commands/observation-ledger.md +6 -4
  33. package/.claude/skills/workflow-commands/pre-gate-cut.md +22 -37
  34. package/.claude/skills/workflow-commands/prerequisite.md +11 -16
  35. package/.claude/skills/workflow-commands/progress-watcher.md +1 -1
  36. package/.claude/skills/workflow-commands/prrun.md +3 -7
  37. package/.claude/skills/workflow-commands/retrospective.md +2 -2
  38. package/.claude/skills/workflow-commands/split-assessment.md +15 -1
  39. package/.claude/skills/workflow-commands/working-tree-hold.md +9 -9
  40. package/.codex/hooks.json +5 -5
  41. package/.github/actions/setup-node/action.yml +9 -0
  42. package/.github/actions/setup-pnpm/action.yml +10 -17
  43. package/.github/dependabot.yml +32 -0
  44. package/.github/release.yml +0 -2
  45. package/.github/workflows/auto-tag.yml +45 -0
  46. package/.github/workflows/ci.yml +267 -17
  47. package/.github/workflows/dependabot-auto-merge.yml +63 -4
  48. package/.github/workflows/production.yml +8 -0
  49. package/.github/workflows/publish.yml +67 -46
  50. package/.github/workflows/sonar-qube.yml +1 -0
  51. package/.prettierignore +2 -0
  52. package/.vscode/settings.json +19 -0
  53. package/.vscode/tasks.json +1 -2
  54. package/CLAUDE.md +7 -18
  55. package/README.md +4 -2
  56. package/SECURITY.md +3 -3
  57. package/dist/CLAUDE.md +7 -18
  58. package/dist/commands/document-read-cli.js +883 -0
  59. package/dist/commands/{document-section-cli.js → document-section-main.js} +81 -38
  60. package/dist/commands/read-set-cli.js +1927 -0
  61. package/dist/commands/run-prep-main.js +21174 -0
  62. package/dist/commands/run-step-cli.js +27733 -0
  63. package/dist/config-merge/index.js +5 -1
  64. package/dist/hooks/audit-provision.js +39 -36
  65. package/dist/hooks/chunk-3GKE653K.js +6204 -0
  66. package/dist/hooks/chunk-45CJJOO7.js +1243 -0
  67. package/dist/hooks/chunk-5PM2JRGV.js +7780 -0
  68. package/dist/hooks/chunk-7SIUNQXK.js +3591 -0
  69. package/dist/hooks/chunk-CQD4LJE6.js +4858 -0
  70. package/dist/hooks/{chunk-723HKZO5.js → chunk-OPSRGWFU.js} +1 -1
  71. package/dist/hooks/chunk-UJ3FPMMM.js +628 -0
  72. package/dist/hooks/chunk-VVNYJWEI.js +30 -0
  73. package/dist/hooks/chunk-Z6DQJKH3.js +2806 -0
  74. package/dist/hooks/codex-hook-adapter.js +10 -22
  75. package/dist/hooks/format-edited.js +4 -6
  76. package/dist/hooks/inputs.json +460 -308
  77. package/dist/hooks/pretool-guard.js +8 -25
  78. package/dist/hooks/session-lang.js +135 -299
  79. package/dist/hooks/stop-guard.js +6496 -1799
  80. package/dist/josh.js +7412 -4228
  81. package/dist/self-sync-guard/index.js +74 -10
  82. package/dist/version/index.js +276 -407
  83. package/eslint/base.js +1 -1
  84. package/eslint/rules/comment-why-only.js +108 -0
  85. package/lefthook/base.yml +3 -1
  86. package/package.json +23 -54
  87. package/pnpm-workspace.yaml +4 -2
  88. package/prompts/coding-standards.md +2 -2
  89. package/prompts/collaboration-workflow/file-edits.md +14 -17
  90. package/prompts/collaboration-workflow/issue-citation.md +0 -4
  91. package/prompts/collaboration-workflow/issue-template.md +54 -18
  92. package/prompts/collaboration-workflow/lane-instructions.md +3 -2
  93. package/prompts/collaboration-workflow/measurement.md +44 -0
  94. package/prompts/collaboration-workflow/operating-rules.md +15 -8
  95. package/prompts/collaboration-workflow/output-bounds.md +6 -7
  96. package/prompts/collaboration-workflow/plan-comment.md +3 -42
  97. package/prompts/collaboration-workflow/principles.md +14 -0
  98. package/prompts/collaboration-workflow/report-format.md +31 -60
  99. package/prompts/collaboration-workflow/residency.md +3 -2
  100. package/prompts/collaboration-workflow/rule-delivery.md +13 -1
  101. package/prompts/collaboration-workflow/shell-body.md +6 -16
  102. package/prompts/collaboration-workflow/turn-batching.md +0 -2
  103. package/prompts/collaboration-workflow/upstream-interrupt.md +15 -5
  104. package/prompts/collaboration-workflow/wip-cap.md +4 -2
  105. package/prompts/collaboration-workflow.md +3 -7
  106. package/prompts/refactoring.md +1 -1
  107. package/prompts/review-rubric.md +9 -2
  108. package/prompts/review.md +65 -36
  109. package/prompts/testing-guide.md +9 -43
  110. package/scripts/agent/agent-argv.ts +14 -16
  111. package/scripts/agent/agent-event.ts +15 -15
  112. package/scripts/agent/agent-exit-record.ts +13 -1
  113. package/scripts/agent/agent-provider.ts +138 -0
  114. package/scripts/agent/agent-role-profile.ts +108 -156
  115. package/scripts/agent/agent-safe-text.ts +20 -5
  116. package/scripts/agent/api-auth.ts +41 -0
  117. package/scripts/agent/api-outage.ts +1 -1
  118. package/scripts/agent/api-usage-limit.ts +65 -0
  119. package/scripts/agent/claude-agent-argv.ts +19 -9
  120. package/scripts/agent/codex-agent-argv.ts +118 -22
  121. package/scripts/agent/usage-limit-reset.ts +179 -0
  122. package/scripts/auth/claude-token-output.ts +2 -2
  123. package/scripts/auto-ok/auto-ok-author.ts +53 -0
  124. package/scripts/auto-ok/auto-ok-cli.ts +25 -16
  125. package/scripts/auto-ok/auto-ok-judge-read.ts +12 -3
  126. package/scripts/auto-ok/auto-ok-judge-write.ts +46 -19
  127. package/scripts/auto-ok/auto-ok-judge.ts +13 -2
  128. package/scripts/auto-ok/auto-ok-main.ts +17 -0
  129. package/scripts/backlog/backlog-arrival.ts +14 -3
  130. package/scripts/backlog/backlog-budget-cli.ts +7 -33
  131. package/scripts/backlog/backlog-budget-main.ts +16 -0
  132. package/scripts/backlog/backlog-budget.ts +2 -3
  133. package/scripts/backlog/backlog-defect-priority.ts +5 -4
  134. package/scripts/backlog/backlog-drive-adopt.ts +67 -0
  135. package/scripts/backlog/backlog-drive-args.ts +4 -5
  136. package/scripts/backlog/backlog-drive-cli.ts +118 -28
  137. package/scripts/backlog/backlog-drive-hold.ts +162 -0
  138. package/scripts/backlog/backlog-drive-idle.ts +161 -0
  139. package/scripts/backlog/backlog-drive-judge.ts +25 -0
  140. package/scripts/backlog/backlog-drive-launch-pass.ts +90 -0
  141. package/scripts/backlog/backlog-drive-launch.ts +8 -2
  142. package/scripts/backlog/backlog-drive-memory.ts +126 -0
  143. package/scripts/backlog/backlog-drive-named-offer.ts +73 -35
  144. package/scripts/backlog/backlog-drive-named.ts +81 -13
  145. package/scripts/backlog/backlog-drive-offer-argv.ts +3 -8
  146. package/scripts/backlog/backlog-drive-paused.ts +170 -0
  147. package/scripts/backlog/backlog-drive-restore.ts +39 -8
  148. package/scripts/backlog/backlog-drive-seats.ts +18 -8
  149. package/scripts/backlog/backlog-drive-token-handling.ts +38 -0
  150. package/scripts/backlog/backlog-drive.ts +96 -131
  151. package/scripts/backlog/backlog-gate-scope.ts +61 -0
  152. package/scripts/backlog/backlog-measure-close.ts +112 -0
  153. package/scripts/backlog/backlog-next-main.ts +16 -0
  154. package/scripts/backlog/backlog-next-shared.ts +73 -0
  155. package/scripts/backlog/backlog-next.ts +78 -56
  156. package/scripts/backlog/backlog-occupied.ts +52 -39
  157. package/scripts/backlog/backlog-offer-cli.ts +6 -21
  158. package/scripts/backlog/backlog-offer-exclude.ts +15 -0
  159. package/scripts/backlog/backlog-offer-main.ts +12 -0
  160. package/scripts/backlog/backlog-offer.ts +36 -3
  161. package/scripts/backlog/backlog-overlap.ts +62 -10
  162. package/scripts/backlog/backlog-plan-cli.ts +4 -1
  163. package/scripts/backlog/backlog-plan-comment.ts +81 -0
  164. package/scripts/backlog/backlog-plan-read.ts +22 -5
  165. package/scripts/backlog/backlog-plan.ts +18 -4
  166. package/scripts/backlog/backlog-pool.ts +60 -22
  167. package/scripts/backlog/backlog-rank.ts +70 -15
  168. package/scripts/backlog/backlog-ready.ts +112 -30
  169. package/scripts/backlog/backlog-stalled-detect.ts +110 -36
  170. package/scripts/backlog/backlog-stalled.ts +52 -16
  171. package/scripts/backlog/backlog-wait-cause.ts +86 -0
  172. package/scripts/backlog/backlog-waves.ts +56 -15
  173. package/scripts/backlog/backlogrun-args.ts +19 -7
  174. package/scripts/backlog/backlogrun-cli.ts +19 -5
  175. package/scripts/backlog/backlogrun-launch.ts +13 -4
  176. package/scripts/backlog/backlogrun-restart.ts +97 -0
  177. package/scripts/backlog/backlogrun-stop.ts +79 -7
  178. package/scripts/behavior/behavior-cli.ts +2 -2
  179. package/scripts/behavior/behavior-rules.ts +47 -24
  180. package/scripts/build/build-bin.ts +2 -16
  181. package/scripts/build/build-claude-md.ts +0 -7
  182. package/scripts/build/build-commands.ts +0 -13
  183. package/scripts/build/build-hooks.ts +49 -48
  184. package/scripts/build/hook-bundle-stamp.ts +29 -11
  185. package/scripts/build/local-bin.ts +1 -1
  186. package/scripts/cases/cases-cli.ts +25 -13
  187. package/scripts/cases/cases-interaction-scan.ts +134 -0
  188. package/scripts/cases/cases-interaction.ts +183 -0
  189. package/scripts/cases/cases-logic.ts +39 -6
  190. package/scripts/ci/pr-classification-main.ts +18 -0
  191. package/scripts/ci/pr-classification.ts +10 -17
  192. package/scripts/clone/clone-scan.ts +1 -1
  193. package/scripts/cost-runtime/context-cut-payback.ts +27 -25
  194. package/scripts/cost-runtime/cost-blocks.ts +22 -37
  195. package/scripts/cost-runtime/cost-cli.ts +67 -29
  196. package/scripts/cost-runtime/cost-main.ts +12 -0
  197. package/scripts/cost-runtime/cost-pricing.ts +9 -0
  198. package/scripts/cost-runtime/cost-transcript.ts +1 -0
  199. package/scripts/cost-runtime/cost-verdict.ts +4 -1
  200. package/scripts/delegation/delegation-policy.ts +18 -5
  201. package/scripts/delegation/duplicate-read-guard.ts +1 -8
  202. package/scripts/delegation/investigation-guard.ts +12 -8
  203. package/scripts/delegation/investigation-reads.ts +48 -27
  204. package/scripts/dependabot/dependabot-cooldown.ts +195 -0
  205. package/scripts/discovery/repo-discovery.ts +24 -6
  206. package/scripts/discovery/repo-party.ts +80 -20
  207. package/scripts/discovery/session-owner-pin.ts +51 -0
  208. package/scripts/doctor/doctor-consumer.ts +2 -5
  209. package/scripts/document/capped-print.ts +1 -1
  210. package/scripts/document/command-reference-line-budget.ts +42 -0
  211. package/scripts/document/document-byte-budget.ts +18 -6
  212. package/scripts/document/document-checks.ts +20 -0
  213. package/scripts/document/document-ratchet-check.ts +101 -0
  214. package/scripts/document/document-scan.ts +1 -1
  215. package/scripts/document/document-section-cli.ts +0 -8
  216. package/scripts/document/document-section-main.ts +12 -0
  217. package/scripts/document/document-section.ts +1 -0
  218. package/scripts/document/entry-read-budget.ts +7 -3
  219. package/scripts/document/issue-citation-budget.ts +94 -0
  220. package/scripts/epic/epic-audit-cli.ts +12 -6
  221. package/scripts/epic/epic-bundle-apply.ts +137 -0
  222. package/scripts/epic/epic-bundle-cli.ts +32 -121
  223. package/scripts/epic/epic-bundle-format.ts +116 -0
  224. package/scripts/epic/epic-bundle-main.ts +17 -0
  225. package/scripts/epic/epic-busy.ts +5 -12
  226. package/scripts/epic/epic-classify.ts +24 -15
  227. package/scripts/epic/epic-cli-argv.ts +33 -2
  228. package/scripts/epic/epic-cli-decide.ts +42 -0
  229. package/scripts/epic/epic-cli.ts +6 -38
  230. package/scripts/epic/epic-close.ts +112 -55
  231. package/scripts/epic/epic-cross-repo.ts +4 -7
  232. package/scripts/epic/epic-decide.ts +119 -0
  233. package/scripts/epic/epic-decision.ts +9 -0
  234. package/scripts/epic/epic-fetch.ts +6 -0
  235. package/scripts/epic/epic-graph.ts +8 -1
  236. package/scripts/epic/epic-issue.ts +8 -2
  237. package/scripts/epic/epic-label-age.ts +1 -1
  238. package/scripts/epic/epic-lane-offer.ts +39 -4
  239. package/scripts/epic/epic-next-main.ts +24 -0
  240. package/scripts/epic/epic-next.ts +6 -24
  241. package/scripts/epic/epic-outside-blocker.ts +6 -2
  242. package/scripts/epic/epic-parse.ts +9 -3
  243. package/scripts/epic/epic-rank.ts +5 -0
  244. package/scripts/epic/epic-read.ts +1 -0
  245. package/scripts/epic/epic-reconcile.ts +39 -0
  246. package/scripts/epic/epic-run.ts +10 -1
  247. package/scripts/epic/epic-solo.ts +50 -14
  248. package/scripts/epic/epic.ts +41 -7
  249. package/scripts/exports/unused-members-check.ts +62 -0
  250. package/scripts/exports/unused-members-cli.ts +6 -51
  251. package/scripts/followup/followup-checks-event.ts +8 -3
  252. package/scripts/followup/followup-ci-path.ts +67 -0
  253. package/scripts/followup/followup-coderabbit-retrigger.ts +261 -0
  254. package/scripts/followup/followup-coderabbit-wait.ts +85 -0
  255. package/scripts/followup/followup-failed-tests.ts +160 -0
  256. package/scripts/followup/followup-job-needs.ts +100 -0
  257. package/scripts/followup/followup-job-rerun.ts +303 -0
  258. package/scripts/followup/followup-main-move.ts +113 -0
  259. package/scripts/followup/followup-review-gates.ts +81 -0
  260. package/scripts/followup/git-followup-finish.ts +43 -11
  261. package/scripts/followup/git-followup-pending.ts +3 -3
  262. package/scripts/followup/git-followup-stages.ts +52 -12
  263. package/scripts/followup/git-followup-workflow.ts +19 -66
  264. package/scripts/followup/git-pr-followup-checks.ts +55 -16
  265. package/scripts/followup/git-pr-followup-wrapup.ts +32 -18
  266. package/scripts/followup/git-pr-followup.ts +96 -33
  267. package/scripts/fresh-machine/fresh-machine-cli.ts +1 -1
  268. package/scripts/fresh-machine/fresh-machine-run.ts +8 -8
  269. package/scripts/fresh-machine/fresh-machine-script.ts +5 -9
  270. package/scripts/fresh-machine/specs/kit-test-backlogrun-python.json +2 -2
  271. package/scripts/fresh-machine/specs/kit-test-backlogrun.json +3 -3
  272. package/scripts/gate/busy-average.ts +90 -0
  273. package/scripts/gate/check-cpu.ts +60 -0
  274. package/scripts/gate/check-inputs.ts +39 -95
  275. package/scripts/gate/check-related-pinned.ts +43 -0
  276. package/scripts/gate/check-related-reuse.ts +64 -0
  277. package/scripts/gate/check-related-section.ts +57 -0
  278. package/scripts/gate/check-related-unplanned.ts +34 -0
  279. package/scripts/gate/check-related.ts +265 -0
  280. package/scripts/gate/check-reuse.ts +33 -54
  281. package/scripts/gate/command-memory.ts +192 -0
  282. package/scripts/gate/core-admission.ts +236 -28
  283. package/scripts/gate/core-budget-timing.ts +51 -0
  284. package/scripts/gate/core-budget.ts +111 -100
  285. package/scripts/gate/core-wait-record.ts +49 -0
  286. package/scripts/gate/core-wait.ts +62 -7
  287. package/scripts/gate/core-weights.ts +94 -0
  288. package/scripts/gate/free-cores.ts +27 -4
  289. package/scripts/gate/gate-labels.ts +46 -0
  290. package/scripts/gate/gate-ledger.ts +44 -8
  291. package/scripts/gate/gate-plan.ts +130 -78
  292. package/scripts/gate/gate-report.ts +23 -9
  293. package/scripts/gate/gate-run-steps.ts +77 -9
  294. package/scripts/gate/gate-skip.ts +57 -8
  295. package/scripts/gate/gate-static-group.ts +60 -0
  296. package/scripts/gate/gate-steps.ts +14 -2
  297. package/scripts/gate/gate-tree.ts +4 -2
  298. package/scripts/gate/hook-gate-reuse.ts +19 -2
  299. package/scripts/gate/input-fingerprint.ts +42 -0
  300. package/scripts/gate/machine-capacity.ts +65 -31
  301. package/scripts/gate/metrics-totals.ts +59 -0
  302. package/scripts/gate/moved-paths.ts +67 -0
  303. package/scripts/gate/project-checks.ts +5 -12
  304. package/scripts/gate/scoped-green.ts +76 -19
  305. package/scripts/gate/since-green.ts +70 -0
  306. package/scripts/gate/structural-checks.ts +96 -0
  307. package/scripts/gate/toolchain-inputs.ts +115 -0
  308. package/scripts/gate/verification-gate.ts +70 -32
  309. package/scripts/gate/verification-inputs.ts +265 -0
  310. package/scripts/gate/verification-tail.ts +52 -0
  311. package/scripts/gh/gh-author-association.ts +117 -9
  312. package/scripts/gh/git-ai-review-scan.ts +5 -3
  313. package/scripts/gh/git-gh-api-path.ts +26 -2
  314. package/scripts/gh/git-gh-branch-rules.ts +73 -0
  315. package/scripts/gh/git-gh-comments-unreadable.ts +36 -0
  316. package/scripts/gh/git-gh-conditional.ts +5 -2
  317. package/scripts/gh/git-gh-exec.ts +32 -2
  318. package/scripts/gh/git-gh-issue-read.ts +7 -1
  319. package/scripts/gh/git-gh-issue-rest.ts +1 -0
  320. package/scripts/gh/git-gh-issue-write.ts +75 -31
  321. package/scripts/gh/git-gh-issue.ts +19 -8
  322. package/scripts/gh/git-gh-poll-read.ts +89 -0
  323. package/scripts/gh/git-gh-pr-auto-merge.ts +21 -9
  324. package/scripts/gh/git-gh-pr-graphql-state.ts +56 -0
  325. package/scripts/gh/git-gh-pr-read.ts +74 -13
  326. package/scripts/gh/git-gh-pr-rest.ts +4 -2
  327. package/scripts/gh/git-gh-pr-snapshot.ts +48 -20
  328. package/scripts/gh/git-gh-pr-too-large.ts +20 -0
  329. package/scripts/gh/git-gh-pr.ts +48 -22
  330. package/scripts/gh/git-gh-retry.ts +141 -0
  331. package/scripts/gh/git-pr-ai-review.ts +15 -6
  332. package/scripts/gh/git-pr-checks-eval.ts +42 -7
  333. package/scripts/gh/git-pr-checks-parse.ts +39 -9
  334. package/scripts/gh/git-pr-checks.ts +5 -5
  335. package/scripts/gh/git-pr-merge-checked.ts +80 -0
  336. package/scripts/git/base-tree.ts +49 -2
  337. package/scripts/git/change-base.ts +4 -10
  338. package/scripts/git/changed-file-scope.ts +6 -4
  339. package/scripts/git/changed-paths-sync.ts +63 -0
  340. package/scripts/git/changed-paths.ts +34 -2
  341. package/scripts/git/git-common-directory.ts +11 -1
  342. package/scripts/git/git-diff-reads.ts +91 -20
  343. package/scripts/git/git-error.ts +9 -2
  344. package/scripts/git/git-grep-hits.ts +85 -0
  345. package/scripts/git/git-location-environment.ts +1 -1
  346. package/scripts/git/git-merge-conflicts.ts +83 -0
  347. package/scripts/git/git-preflight.ts +37 -12
  348. package/scripts/git/git-push-transport.ts +1 -2
  349. package/scripts/git/git-schemas.ts +30 -7
  350. package/scripts/git/git-spawn.ts +1 -2
  351. package/scripts/git/git-status.ts +4 -4
  352. package/scripts/git/git-worktree.ts +13 -0
  353. package/scripts/git/gone-branch.ts +4 -1
  354. package/scripts/git/main-merge-budget-conflict.ts +89 -0
  355. package/scripts/git/main-merge-guard.ts +55 -18
  356. package/scripts/git/main-merge-main.ts +12 -0
  357. package/scripts/git/main-merge-regenerate.ts +59 -25
  358. package/scripts/git/main-merge.ts +77 -13
  359. package/scripts/git/main-sync-main.ts +12 -0
  360. package/scripts/git/main-sync.ts +0 -9
  361. package/scripts/git/no-base-checkout.ts +127 -0
  362. package/scripts/git/stash/git-stash.ts +38 -6
  363. package/scripts/git/stash/{stash-pop-args.ts → stash-args.ts} +13 -10
  364. package/scripts/git/stash/stash-pop-cli.ts +6 -12
  365. package/scripts/git/stash/stash-pop-main.ts +12 -0
  366. package/scripts/git/stash/stash-push-cli.ts +86 -0
  367. package/scripts/git/stash/stash-push-main.ts +12 -0
  368. package/scripts/hooks/batch-guard.ts +38 -27
  369. package/scripts/hooks/check-commit-message-main.ts +8 -0
  370. package/scripts/hooks/check-commit-message.ts +4 -7
  371. package/scripts/hooks/edited-cspell.ts +37 -11
  372. package/scripts/hooks/format-edited-file.ts +29 -25
  373. package/scripts/hooks/lane-plan-guard.ts +50 -0
  374. package/scripts/hooks/pre-commit-lint-switch.ts +9 -0
  375. package/scripts/hooks/pre-commit-lint.ts +44 -4
  376. package/scripts/hooks/pre-push-related-switch.ts +10 -0
  377. package/scripts/hooks/pre-push-unit.ts +77 -9
  378. package/scripts/hooks/pretool-guard-cli.ts +1 -8
  379. package/scripts/hooks/pretool-guard.ts +34 -19
  380. package/scripts/hooks/reserved-run.ts +81 -10
  381. package/scripts/hooks/run-hook.sh +30 -6
  382. package/scripts/hooks/shell-rules-notice.ts +37 -0
  383. package/scripts/hooks/step-zero-notice.ts +6 -1
  384. package/scripts/hooks/stop-actions.ts +5 -36
  385. package/scripts/hooks/stop-guard.ts +20 -15
  386. package/scripts/init/distributed-paths.ts +1 -0
  387. package/scripts/init/hook-command-rewrite.ts +23 -5
  388. package/scripts/init/hook-launch.ts +17 -17
  389. package/scripts/init/init-actions.ts +0 -6
  390. package/scripts/init/init-ai-copy.ts +10 -36
  391. package/scripts/init/init-bootstrap.ts +9 -8
  392. package/scripts/init/init-dry-run-report.ts +1 -1
  393. package/scripts/init/init-dry-run.ts +1 -1
  394. package/scripts/init/init-file-action.ts +7 -9
  395. package/scripts/init/init-logic-json-merge.ts +2 -2
  396. package/scripts/init/init-logic-migrate.ts +9 -82
  397. package/scripts/init/init-logic.ts +3 -2
  398. package/scripts/init/init-main.ts +12 -0
  399. package/scripts/init/init.ts +5 -12
  400. package/scripts/init/kit-development-versions.ts +3 -7
  401. package/scripts/init/kit-written-paths.ts +2 -2
  402. package/scripts/init/project-profile.ts +5 -4
  403. package/scripts/init/tsconfig-preset-migration.ts +2 -1
  404. package/scripts/init/vscode-tasks.ts +1 -1
  405. package/scripts/issue/aggregation-split.ts +52 -0
  406. package/scripts/issue/defect-origin-cli.ts +106 -0
  407. package/scripts/issue/defect-origin-line.ts +78 -0
  408. package/scripts/issue/defect-origin-main.ts +11 -0
  409. package/scripts/issue/defect-origin.ts +114 -0
  410. package/scripts/issue/defect-rate-cli.ts +38 -179
  411. package/scripts/issue/defect-rate.ts +0 -16
  412. package/scripts/issue/defect-report-cli.ts +128 -0
  413. package/scripts/issue/defect-report-format.ts +56 -0
  414. package/scripts/issue/defect-report-main.ts +11 -0
  415. package/scripts/issue/defect-report.ts +160 -0
  416. package/scripts/issue/effect-audit-cli.ts +178 -0
  417. package/scripts/issue/effect-audit.ts +185 -0
  418. package/scripts/issue/expected-effect-lint.ts +65 -9
  419. package/scripts/issue/git-next-issues.ts +5 -0
  420. package/scripts/issue/issue-already-done-cli.ts +62 -0
  421. package/scripts/issue/issue-body-or-comment.ts +74 -0
  422. package/scripts/issue/issue-cite-cli.ts +1 -12
  423. package/scripts/issue/issue-cite-main.ts +12 -0
  424. package/scripts/issue/issue-classification.ts +13 -7
  425. package/scripts/issue/issue-closing-pr.ts +8 -1
  426. package/scripts/issue/issue-comment-cli.ts +10 -24
  427. package/scripts/issue/issue-comment-main.ts +12 -0
  428. package/scripts/issue/issue-evidence-exit.ts +102 -0
  429. package/scripts/issue/issue-file-cap.ts +58 -0
  430. package/scripts/issue/issue-file-cli.ts +131 -36
  431. package/scripts/issue/issue-file-deferral.ts +52 -0
  432. package/scripts/issue/issue-file-fold.ts +29 -10
  433. package/scripts/issue/issue-file-interrupt.ts +85 -0
  434. package/scripts/issue/issue-file-lane-hint.ts +30 -0
  435. package/scripts/issue/issue-file.ts +56 -19
  436. package/scripts/issue/issue-fold-cli.ts +2 -11
  437. package/scripts/issue/issue-fold-main.ts +12 -0
  438. package/scripts/issue/issue-labels.ts +97 -89
  439. package/scripts/issue/issue-lint-cli.ts +29 -12
  440. package/scripts/issue/issue-lint-main.ts +12 -0
  441. package/scripts/issue/issue-measured-cli.ts +34 -0
  442. package/scripts/issue/issue-measured-close.ts +58 -0
  443. package/scripts/issue/issue-merged.ts +19 -2
  444. package/scripts/issue/issue-not-before-label.ts +135 -0
  445. package/scripts/issue/issue-not-before.ts +114 -0
  446. package/scripts/issue/issue-number-shape.ts +15 -1
  447. package/scripts/issue/issue-park.ts +28 -0
  448. package/scripts/issue/issue-plan-cli.ts +151 -0
  449. package/scripts/issue/issue-priority-cli.ts +60 -0
  450. package/scripts/issue/issue-priority-raise.ts +55 -0
  451. package/scripts/issue/issue-priority.ts +282 -0
  452. package/scripts/issue/issue-rank.ts +27 -4
  453. package/scripts/issue/issue-read-cli.ts +35 -16
  454. package/scripts/issue/issue-read-main.ts +12 -0
  455. package/scripts/issue/issue-read.ts +62 -13
  456. package/scripts/issue/issue-release-cli.ts +0 -10
  457. package/scripts/issue/issue-release-main.ts +13 -0
  458. package/scripts/issue/issue-release.ts +7 -12
  459. package/scripts/issue/issue-sample-gate.ts +213 -0
  460. package/scripts/issue/issue-sample-prime.ts +127 -0
  461. package/scripts/issue/issue-sample-required.ts +57 -0
  462. package/scripts/issue/issue-sample-source.ts +77 -0
  463. package/scripts/issue/issue-scout-cli.ts +0 -11
  464. package/scripts/issue/issue-scout-main.ts +14 -0
  465. package/scripts/issue/issue-search.ts +124 -0
  466. package/scripts/issue/issue-state-cli.ts +0 -10
  467. package/scripts/issue/issue-state-main.ts +12 -0
  468. package/scripts/issue/issue-state.ts +13 -1
  469. package/scripts/issue/issue-template-section.ts +43 -0
  470. package/scripts/issue/issue-watch-diff.ts +87 -16
  471. package/scripts/issue/issue-watch-hook.ts +11 -2
  472. package/scripts/issue/issue-watch.ts +55 -11
  473. package/scripts/issue/issue-wip.ts +2 -7
  474. package/scripts/issue/markdown-section.ts +1 -0
  475. package/scripts/issue/measure-declaration.ts +121 -0
  476. package/scripts/issue/measure-rerun-cli.ts +7 -65
  477. package/scripts/issue/plan-consumers-cli.ts +39 -0
  478. package/scripts/issue/plan-consumers-main.ts +11 -0
  479. package/scripts/issue/plan-consumers-section.ts +76 -0
  480. package/scripts/issue/plan-consumers.ts +127 -0
  481. package/scripts/issue/reproduction-measure.ts +3 -1
  482. package/scripts/issue/size-estimate.ts +90 -0
  483. package/scripts/issue/trusted-measure.ts +84 -0
  484. package/scripts/josh/agent-session-environment.ts +1 -1
  485. package/scripts/josh/command-usage.ts +17 -44
  486. package/scripts/josh/durable-state-migrate.ts +105 -0
  487. package/scripts/josh/durable-state.ts +112 -0
  488. package/scripts/josh/file-map-stamp.ts +49 -16
  489. package/scripts/josh/hook-decision.ts +32 -20
  490. package/scripts/josh/josh-aliases.ts +95 -0
  491. package/scripts/josh/josh-command-map.ts +1 -79
  492. package/scripts/josh/josh-command-types.ts +12 -6
  493. package/scripts/josh/josh-commands-agent-hooks.ts +83 -0
  494. package/scripts/josh/josh-commands-ai.ts +160 -161
  495. package/scripts/josh/josh-commands-backlog.ts +82 -16
  496. package/scripts/josh/josh-commands-clone.ts +1 -0
  497. package/scripts/josh/josh-commands-development.ts +142 -101
  498. package/scripts/josh/josh-commands-document.ts +43 -1
  499. package/scripts/josh/josh-commands-epic.ts +171 -0
  500. package/scripts/josh/josh-commands-hooks.ts +25 -2
  501. package/scripts/josh/josh-commands-issue-write.ts +200 -0
  502. package/scripts/josh/josh-commands-issue.ts +156 -24
  503. package/scripts/josh/josh-commands-lane.ts +187 -3
  504. package/scripts/josh/josh-commands-lint.ts +34 -10
  505. package/scripts/josh/josh-commands-maintenance.ts +127 -4
  506. package/scripts/josh/josh-commands-pause.ts +29 -0
  507. package/scripts/josh/josh-commands-progress.ts +87 -0
  508. package/scripts/josh/josh-commands-project.ts +138 -9
  509. package/scripts/josh/josh-commands-review.ts +159 -0
  510. package/scripts/josh/josh-commands-run.ts +211 -23
  511. package/scripts/josh/josh-commands-ship.ts +217 -0
  512. package/scripts/josh/josh-commands-split.ts +9 -0
  513. package/scripts/josh/josh-commands-test-check.ts +80 -0
  514. package/scripts/josh/josh-commands-versioning.ts +49 -2
  515. package/scripts/josh/josh-commands-workflow.ts +144 -6
  516. package/scripts/josh/josh-environment-file.ts +43 -3
  517. package/scripts/josh/josh-in-process.ts +2 -2
  518. package/scripts/josh/josh-logic.ts +11 -16
  519. package/scripts/josh/josh-run.ts +19 -1
  520. package/scripts/josh/package-directory.ts +2 -4
  521. package/scripts/josh/process-identity.ts +13 -4
  522. package/scripts/josh/run-record-path.ts +15 -0
  523. package/scripts/josh/session-language-cli.ts +4 -8
  524. package/scripts/josh/session-language-main.ts +13 -0
  525. package/scripts/josh/session-language.ts +6 -1
  526. package/scripts/josh/shared-cache.ts +90 -0
  527. package/scripts/josh/stamp-file.ts +20 -17
  528. package/scripts/lane/lane-adopt-cli.ts +98 -0
  529. package/scripts/lane/lane-adopt.ts +208 -0
  530. package/scripts/lane/lane-await.ts +56 -20
  531. package/scripts/lane/lane-baseline.ts +123 -0
  532. package/scripts/lane/lane-breakdown-cli.ts +64 -0
  533. package/scripts/lane/lane-breakdown-implement.ts +170 -0
  534. package/scripts/lane/lane-breakdown-laps.ts +107 -0
  535. package/scripts/lane/lane-breakdown-pinned.ts +76 -0
  536. package/scripts/lane/lane-breakdown-text.ts +145 -0
  537. package/scripts/lane/lane-breakdown.ts +239 -0
  538. package/scripts/lane/lane-cache.ts +5 -30
  539. package/scripts/lane/lane-capacity.ts +14 -23
  540. package/scripts/lane/lane-check-stats.ts +84 -22
  541. package/scripts/lane/lane-child-invocation.ts +17 -2
  542. package/scripts/lane/lane-child-mark-keys.ts +12 -0
  543. package/scripts/lane/lane-child-marker.ts +20 -1
  544. package/scripts/lane/lane-ci-path-stats.ts +73 -0
  545. package/scripts/lane/lane-claim-stats.ts +84 -0
  546. package/scripts/lane/lane-cli.ts +15 -5
  547. package/scripts/lane/lane-close.ts +91 -18
  548. package/scripts/lane/lane-core-wait-stats.ts +66 -0
  549. package/scripts/lane/lane-dispatch-log.ts +3 -3
  550. package/scripts/lane/lane-dispatch.ts +26 -5
  551. package/scripts/lane/lane-gap-stats.ts +157 -0
  552. package/scripts/lane/lane-guard-policy.ts +7 -1
  553. package/scripts/lane/lane-handoff.ts +69 -1
  554. package/scripts/lane/lane-held-stats.ts +129 -0
  555. package/scripts/lane/lane-implement-stats.ts +207 -0
  556. package/scripts/lane/lane-implement-subagents.ts +90 -0
  557. package/scripts/lane/lane-install.ts +4 -11
  558. package/scripts/lane/lane-investigation-switch.ts +16 -0
  559. package/scripts/lane/lane-launch-cli.ts +0 -9
  560. package/scripts/lane/lane-launch-main.ts +12 -0
  561. package/scripts/lane/lane-ledger-kind.ts +31 -0
  562. package/scripts/lane/lane-ledger-schema-ship.ts +49 -0
  563. package/scripts/lane/lane-ledger-schema.ts +349 -0
  564. package/scripts/lane/lane-ledger-write.ts +257 -0
  565. package/scripts/lane/lane-ledger.ts +56 -233
  566. package/scripts/lane/lane-limit-cli.ts +12 -1
  567. package/scripts/lane/lane-load.ts +1 -1
  568. package/scripts/lane/lane-measure-cli.ts +193 -30
  569. package/scripts/lane/lane-net-read.ts +44 -0
  570. package/scripts/lane/lane-net-time.ts +212 -0
  571. package/scripts/lane/lane-open.ts +25 -8
  572. package/scripts/lane/lane-output.ts +2 -4
  573. package/scripts/lane/lane-overrun-prompt.ts +147 -0
  574. package/scripts/lane/lane-overrun.ts +274 -0
  575. package/scripts/lane/lane-parked.ts +3 -3
  576. package/scripts/lane/lane-paths.ts +24 -1
  577. package/scripts/lane/lane-pause-cli.ts +133 -0
  578. package/scripts/lane/lane-pause.ts +158 -0
  579. package/scripts/lane/lane-paused-spans.ts +97 -0
  580. package/scripts/lane/lane-plan-check.ts +207 -0
  581. package/scripts/lane/lane-plan-cli.ts +41 -0
  582. package/scripts/lane/lane-plan.ts +144 -0
  583. package/scripts/lane/lane-process-table.ts +166 -0
  584. package/scripts/lane/lane-reap-settle.ts +124 -0
  585. package/scripts/lane/lane-reap.ts +50 -15
  586. package/scripts/lane/lane-registry.ts +38 -4
  587. package/scripts/lane/lane-relaunch.ts +1 -1
  588. package/scripts/lane/lane-residents.ts +162 -0
  589. package/scripts/lane/lane-restart.ts +22 -2
  590. package/scripts/lane/lane-round-one-stats.ts +51 -0
  591. package/scripts/lane/lane-round-two-stats.ts +49 -0
  592. package/scripts/lane/lane-sampler.ts +26 -3
  593. package/scripts/lane/lane-session-action.ts +112 -23
  594. package/scripts/lane/lane-session-broker.ts +146 -37
  595. package/scripts/lane/lane-session-reread-main.ts +14 -0
  596. package/scripts/lane/lane-session-reread.ts +51 -0
  597. package/scripts/lane/lane-ship-lap-stats.ts +74 -0
  598. package/scripts/lane/lane-sleep.ts +58 -0
  599. package/scripts/lane/lane-snapshot-trace.ts +84 -0
  600. package/scripts/lane/lane-spans.ts +51 -0
  601. package/scripts/lane/lane-spent.ts +7 -4
  602. package/scripts/lane/lane-split-stats.ts +28 -0
  603. package/scripts/lane/lane-stage-stats.ts +20 -3
  604. package/scripts/lane/lane-state.ts +334 -0
  605. package/scripts/lane/lane-stats-tables.ts +58 -0
  606. package/scripts/lane/lane-stats.ts +74 -4
  607. package/scripts/lane/lane-stop-stats.ts +145 -37
  608. package/scripts/lane/lane-tail-stats.ts +32 -0
  609. package/scripts/lane/lane-test-related-stats.ts +127 -0
  610. package/scripts/lane/lane-transcript-calls.ts +202 -0
  611. package/scripts/lane/lane-transcript-stats.ts +200 -0
  612. package/scripts/lane/lane-vacant.ts +13 -3
  613. package/scripts/lane/lane-value-cell.ts +72 -0
  614. package/scripts/lane/lane-value.ts +118 -0
  615. package/scripts/lane/lane-withdraw-cli.ts +5 -4
  616. package/scripts/lane/lane-withdraw-closed.ts +124 -0
  617. package/scripts/lane/lane-withdraw.ts +149 -71
  618. package/scripts/lane/lane-yield.ts +85 -0
  619. package/scripts/lane/openai-lane-ship.ts +12 -11
  620. package/scripts/lane/openai-lane-supervisor-decision.ts +6 -8
  621. package/scripts/lane/openai-lane-supervisor-owner.ts +5 -8
  622. package/scripts/lane/openai-lane-supervisor.ts +5 -4
  623. package/scripts/lane/process-directories.ts +70 -0
  624. package/scripts/lane/process-lane-marks.ts +94 -0
  625. package/scripts/lib/atomic-write.ts +62 -0
  626. package/scripts/lib/buffered-process.ts +12 -5
  627. package/scripts/lib/cli-flags.ts +53 -0
  628. package/scripts/lib/figure-format.ts +63 -0
  629. package/scripts/lib/json-value.ts +9 -1
  630. package/scripts/lib/package-manifest.ts +35 -0
  631. package/scripts/lib/poll.ts +38 -9
  632. package/scripts/lib/read-file.ts +3 -1
  633. package/scripts/lib/settled-together.ts +10 -0
  634. package/scripts/lib/shell-quote.ts +21 -0
  635. package/scripts/lib/stamped-memo.ts +63 -0
  636. package/scripts/lib/stdout-on-stderr.ts +24 -0
  637. package/scripts/lib/timeouts.ts +9 -0
  638. package/scripts/lib/token-shape.ts +111 -0
  639. package/scripts/lib/transcript-record.ts +91 -0
  640. package/scripts/lines/effective-limit.ts +1 -1
  641. package/scripts/lint/eslint-cache-dependencies.ts +145 -0
  642. package/scripts/lint/eslint-daemon-sources.ts +79 -0
  643. package/scripts/lint/eslint-daemon.ts +304 -0
  644. package/scripts/lint/eslint-warm-cli.ts +7 -0
  645. package/scripts/lint/eslint-warm.ts +66 -0
  646. package/scripts/lint/format.ts +11 -2
  647. package/scripts/lint/import-graph.ts +409 -0
  648. package/scripts/lint/lint-gate-scope.ts +102 -0
  649. package/scripts/lint/lint-parallel-main.ts +19 -0
  650. package/scripts/lint/lint-parallel.ts +113 -33
  651. package/scripts/lint/lint-related-scope.ts +30 -24
  652. package/scripts/lint/lint-related.ts +183 -30
  653. package/scripts/lint/rename-cli.ts +179 -0
  654. package/scripts/lint/rename-identifier.ts +192 -0
  655. package/scripts/lint/type-only-imports.ts +58 -0
  656. package/scripts/notify/confirmation-options.ts +1 -2
  657. package/scripts/notify/telegram-notify.ts +32 -23
  658. package/scripts/notify/telegram-test-logic.ts +0 -1
  659. package/scripts/notify/telegram-test-main.ts +8 -0
  660. package/scripts/notify/telegram-test.ts +2 -6
  661. package/scripts/observations/observation-ledger.ts +13 -0
  662. package/scripts/observations/observation-record.ts +42 -16
  663. package/scripts/observations/observations-flush-landing.ts +5 -3
  664. package/scripts/observations/observations-flush.ts +38 -10
  665. package/scripts/overrides/overrides-check.ts +11 -6
  666. package/scripts/overrides/overrides-files.ts +2 -1
  667. package/scripts/overrides/overrides-logic.ts +3 -6
  668. package/scripts/package/verify-optional-eslint-install.ts +8 -6
  669. package/scripts/propagate/propagate-publish.ts +2 -7
  670. package/scripts/propagate/propagate-targets.ts +4 -12
  671. package/scripts/refactor/import-graph.ts +9 -7
  672. package/scripts/release/github-release-runs.ts +17 -6
  673. package/scripts/release/release-approval-prune.ts +24 -0
  674. package/scripts/release/release-history.ts +1 -3
  675. package/scripts/release/release-progress.ts +42 -22
  676. package/scripts/release/release-publish-run.ts +39 -0
  677. package/scripts/release/release-publish.ts +6 -6
  678. package/scripts/release/release-scope-cli.ts +0 -10
  679. package/scripts/release/release-scope-main.ts +12 -0
  680. package/scripts/repo/repo-setting.ts +3 -6
  681. package/scripts/repo/required-checks-logic.ts +10 -16
  682. package/scripts/repo/ruleset-check.ts +4 -3
  683. package/scripts/report/markdown-shape.ts +28 -0
  684. package/scripts/report/report-format-reference.ts +17 -1
  685. package/scripts/report/report-labels.ts +166 -0
  686. package/scripts/report/report-lint-child-summary.ts +94 -0
  687. package/scripts/report/report-lint-cli.ts +29 -7
  688. package/scripts/report/report-lint.ts +85 -128
  689. package/scripts/report/report-template-cli.ts +59 -0
  690. package/scripts/report/report-template.ts +112 -0
  691. package/scripts/review/acceptance-map.ts +1 -0
  692. package/scripts/review/prose-stale-cli.ts +88 -0
  693. package/scripts/review/prose-stale-scan.ts +152 -0
  694. package/scripts/review/removed-tests-check.ts +86 -0
  695. package/scripts/review/removed-tests.ts +149 -0
  696. package/scripts/review/review-attest.ts +73 -23
  697. package/scripts/review/review-brief-cli.ts +138 -23
  698. package/scripts/review/review-brief-main.ts +12 -0
  699. package/scripts/review/review-brief-paths.ts +22 -0
  700. package/scripts/review/review-brief.ts +45 -10
  701. package/scripts/review/review-code-tree.ts +10 -6
  702. package/scripts/review/review-comment-carry.ts +47 -0
  703. package/scripts/review/review-comment-round.ts +111 -30
  704. package/scripts/review/review-finding-ledger.ts +135 -18
  705. package/scripts/review/review-finding-text.ts +43 -0
  706. package/scripts/review/review-interaction.ts +105 -0
  707. package/scripts/review/review-lane-handover.ts +68 -0
  708. package/scripts/review/review-lint-cli.ts +57 -0
  709. package/scripts/review/review-lint-findings.ts +92 -0
  710. package/scripts/review/review-lint-sections.ts +80 -0
  711. package/scripts/review/review-lint.ts +221 -0
  712. package/scripts/review/review-prior-findings.ts +102 -0
  713. package/scripts/review/review-readers-scan.ts +165 -0
  714. package/scripts/review/review-record-cli.ts +236 -74
  715. package/scripts/review/review-record-code-round.ts +55 -0
  716. package/scripts/review/review-record-comment.ts +60 -0
  717. package/scripts/review/review-record-interaction.ts +35 -0
  718. package/scripts/review/review-record-main.ts +12 -0
  719. package/scripts/review/review-record-pinned.ts +108 -0
  720. package/scripts/review/review-record.ts +25 -1
  721. package/scripts/review/review-reviewed-tree.ts +307 -0
  722. package/scripts/review/review-round-one-blobs.ts +221 -0
  723. package/scripts/review/review-round-one-closure.ts +62 -0
  724. package/scripts/review/review-round-reuse.ts +106 -0
  725. package/scripts/review/review-round2-cli.ts +135 -36
  726. package/scripts/review/review-round2-skip-comment.ts +55 -0
  727. package/scripts/review/review-round2.ts +103 -19
  728. package/scripts/review/review-stamps.ts +23 -1
  729. package/scripts/review/review-stop-log.ts +110 -0
  730. package/scripts/review/review-stops-cli.ts +86 -0
  731. package/scripts/review/review-submit-cli.ts +101 -0
  732. package/scripts/review/review-tree.ts +6 -17
  733. package/scripts/review/review-untouched-readers.ts +146 -0
  734. package/scripts/review/test-titles.ts +118 -0
  735. package/scripts/rules/agent-model.ts +9 -1
  736. package/scripts/rules/bash-triggers.ts +49 -6
  737. package/scripts/rules/concise-reply.ts +88 -0
  738. package/scripts/rules/credential-body.ts +77 -0
  739. package/scripts/rules/decision-oracle-batch.ts +9 -1
  740. package/scripts/rules/decision-oracle.ts +3 -3
  741. package/scripts/rules/delivered-rules.ts +115 -18
  742. package/scripts/rules/destructive-command.ts +11 -12
  743. package/scripts/rules/direct-filing.ts +10 -2
  744. package/scripts/rules/direct-issue-comment.ts +139 -0
  745. package/scripts/rules/direct-issue-read.ts +191 -0
  746. package/scripts/rules/direct-pr-create.ts +72 -26
  747. package/scripts/rules/early-heartbeat.ts +4 -1
  748. package/scripts/rules/edit-tool.ts +27 -0
  749. package/scripts/rules/file-body.ts +7 -0
  750. package/scripts/rules/file-edit-rows.ts +17 -0
  751. package/scripts/rules/file-rewrite.ts +146 -0
  752. package/scripts/rules/firing-point.ts +3 -2
  753. package/scripts/rules/gh-api.ts +128 -7
  754. package/scripts/rules/gh-repo-selector.ts +84 -0
  755. package/scripts/rules/git-argv.ts +72 -14
  756. package/scripts/rules/git-force.ts +14 -4
  757. package/scripts/rules/guard-remedy.ts +17 -4
  758. package/scripts/rules/implementation-cut-verdict.ts +1 -1
  759. package/scripts/rules/implementation-cut.ts +68 -27
  760. package/scripts/rules/index-guard.ts +8 -1
  761. package/scripts/rules/investigator-foreground.ts +231 -0
  762. package/scripts/rules/issue-citation.ts +15 -60
  763. package/scripts/rules/issue-comments.ts +18 -5
  764. package/scripts/rules/josh-git-bare.ts +7 -0
  765. package/scripts/rules/lane-background.ts +103 -33
  766. package/scripts/rules/lane-carry-conflict.ts +6 -0
  767. package/scripts/rules/lane-direct-tool.ts +172 -0
  768. package/scripts/rules/lane-interactive-ask.ts +12 -2
  769. package/scripts/rules/lane-park.ts +49 -25
  770. package/scripts/rules/lane-spilled-read.ts +90 -0
  771. package/scripts/rules/lane-split-park.ts +11 -3
  772. package/scripts/rules/lane-switch-main.ts +11 -4
  773. package/scripts/rules/last-prompt.ts +20 -47
  774. package/scripts/rules/oracle-consulted.ts +11 -1
  775. package/scripts/rules/oracle-firing.ts +1 -0
  776. package/scripts/rules/permission-guards.ts +7 -0
  777. package/scripts/rules/piped-verification-shapes.ts +110 -0
  778. package/scripts/rules/piped-verification.ts +68 -18
  779. package/scripts/rules/poll-loop.ts +78 -8
  780. package/scripts/rules/pr-merge.ts +123 -0
  781. package/scripts/rules/pre-gate-cut.ts +3 -3
  782. package/scripts/rules/protected-files.ts +113 -22
  783. package/scripts/rules/raw-field-body.ts +6 -0
  784. package/scripts/rules/reply-language.ts +3 -17
  785. package/scripts/rules/reply-prose.ts +34 -0
  786. package/scripts/rules/repo-admin.ts +132 -0
  787. package/scripts/rules/reviewer-foreground.ts +88 -0
  788. package/scripts/rules/round-one-check-related.ts +120 -0
  789. package/scripts/rules/rule-body-guard.ts +13 -15
  790. package/scripts/rules/rule-list.ts +9 -28
  791. package/scripts/rules/rule-value-cache.ts +57 -14
  792. package/scripts/rules/rule-value-candidates.ts +84 -0
  793. package/scripts/rules/rule-value-cli.ts +106 -39
  794. package/scripts/rules/rule-value.ts +18 -5
  795. package/scripts/rules/run-tail-rule.ts +1 -1
  796. package/scripts/rules/sed-in-place.ts +196 -0
  797. package/scripts/rules/shell-segments.ts +43 -0
  798. package/scripts/rules/stop-rule-rows.ts +52 -0
  799. package/scripts/rules/stop-rules.ts +36 -62
  800. package/scripts/rules/test-declared-commit.ts +11 -1
  801. package/scripts/rules/third-party-write.ts +115 -21
  802. package/scripts/rules/timed-rerun.ts +69 -0
  803. package/scripts/rules/turn-filings.ts +90 -0
  804. package/scripts/rules/worktree-guard.ts +32 -7
  805. package/scripts/run/board/run-board-app-name.ts +23 -0
  806. package/scripts/run/board/run-board-cli.ts +65 -32
  807. package/scripts/run/board/run-board-earlier.ts +94 -0
  808. package/scripts/run/board/run-board-ending-reason.ts +71 -0
  809. package/scripts/run/board/run-board-estimate-schedule.ts +103 -0
  810. package/scripts/run/board/run-board-estimate.ts +98 -0
  811. package/scripts/run/board/run-board-fit.ts +177 -37
  812. package/scripts/run/board/run-board-fold.ts +123 -0
  813. package/scripts/run/board/run-board-found.ts +134 -0
  814. package/scripts/run/board/run-board-fresh.ts +2 -2
  815. package/scripts/run/board/run-board-gather-live.ts +29 -0
  816. package/scripts/run/board/run-board-gather-thread.ts +189 -0
  817. package/scripts/run/board/run-board-gather-worker.ts +29 -0
  818. package/scripts/run/board/run-board-gather.ts +187 -0
  819. package/scripts/run/board/run-board-github.ts +118 -38
  820. package/scripts/run/board/run-board-header.ts +90 -20
  821. package/scripts/run/board/run-board-keys.ts +58 -0
  822. package/scripts/run/board/run-board-kind.ts +20 -6
  823. package/scripts/run/board/run-board-labels.ts +126 -71
  824. package/scripts/run/board/run-board-lane-state.ts +109 -0
  825. package/scripts/run/board/run-board-lane-time.ts +123 -0
  826. package/scripts/run/board/run-board-layout.ts +239 -60
  827. package/scripts/run/board/run-board-length.ts +52 -0
  828. package/scripts/run/board/run-board-link.ts +15 -2
  829. package/scripts/run/board/run-board-machine.ts +8 -4
  830. package/scripts/run/board/run-board-main.ts +12 -0
  831. package/scripts/run/board/run-board-notes.ts +59 -32
  832. package/scripts/run/board/run-board-now.ts +1 -1
  833. package/scripts/run/board/run-board-operation.ts +19 -35
  834. package/scripts/run/board/run-board-phase.ts +3 -6
  835. package/scripts/run/board/run-board-plan-shared.ts +115 -0
  836. package/scripts/run/board/run-board-plan.ts +56 -4
  837. package/scripts/run/board/run-board-planning.ts +45 -0
  838. package/scripts/run/board/run-board-priority.ts +44 -0
  839. package/scripts/run/board/run-board-process-groups.ts +195 -0
  840. package/scripts/run/board/run-board-read.ts +197 -28
  841. package/scripts/run/board/run-board-reason.ts +247 -51
  842. package/scripts/run/board/run-board-released.ts +35 -0
  843. package/scripts/run/board/run-board-render-checks.ts +42 -7
  844. package/scripts/run/board/run-board-render-condition.ts +96 -0
  845. package/scripts/run/board/run-board-render-drawn.ts +78 -0
  846. package/scripts/run/board/run-board-render-foot.ts +59 -0
  847. package/scripts/run/board/run-board-render-found.ts +157 -0
  848. package/scripts/run/board/run-board-render-icon.ts +35 -0
  849. package/scripts/run/board/run-board-render-lanes.ts +145 -0
  850. package/scripts/run/board/run-board-render-lead.ts +89 -0
  851. package/scripts/run/board/run-board-render-legend.ts +136 -48
  852. package/scripts/run/board/run-board-render-notes.ts +156 -29
  853. package/scripts/run/board/run-board-render-processes.ts +196 -0
  854. package/scripts/run/board/run-board-render-section.ts +119 -0
  855. package/scripts/run/board/run-board-render-slot.ts +3 -36
  856. package/scripts/run/board/run-board-render-tail.ts +115 -48
  857. package/scripts/run/board/run-board-render-time.ts +56 -0
  858. package/scripts/run/board/run-board-render-title.ts +117 -24
  859. package/scripts/run/board/run-board-render-waits.ts +104 -20
  860. package/scripts/run/board/run-board-render.ts +264 -258
  861. package/scripts/run/board/run-board-roots.ts +54 -0
  862. package/scripts/run/board/run-board-row-yield.ts +9 -4
  863. package/scripts/run/board/run-board-setup.ts +1 -12
  864. package/scripts/run/board/run-board-snapshot.ts +111 -0
  865. package/scripts/run/board/run-board-spin.ts +3 -5
  866. package/scripts/run/board/run-board-state.ts +22 -33
  867. package/scripts/run/board/run-board-status.ts +149 -71
  868. package/scripts/run/board/run-board-thanks-read.ts +2 -2
  869. package/scripts/run/board/run-board-tick.ts +158 -114
  870. package/scripts/run/board/run-board-usage-board.ts +78 -0
  871. package/scripts/run/board/run-board-usage-lanes.ts +113 -0
  872. package/scripts/run/board/run-board-usage-listing.ts +93 -0
  873. package/scripts/run/board/run-board-usage-read.ts +120 -150
  874. package/scripts/run/board/run-board-usage-rusage.ts +19 -7
  875. package/scripts/run/board/run-board-usage-text.ts +139 -51
  876. package/scripts/run/board/run-board-usage-top.ts +102 -0
  877. package/scripts/run/board/run-board-usage.ts +89 -72
  878. package/scripts/run/board/run-board-usual.ts +20 -9
  879. package/scripts/run/carry/run-carry-args.ts +4 -7
  880. package/scripts/run/carry/run-carry-conversation.ts +1 -1
  881. package/scripts/run/carry/run-carry-ended.ts +3 -2
  882. package/scripts/run/carry/run-carry.ts +12 -6
  883. package/scripts/run/cut/run-cut-cli.ts +33 -133
  884. package/scripts/run/cut/run-cut-digest.ts +152 -0
  885. package/scripts/run/cut/run-cut-handoff.ts +54 -10
  886. package/scripts/run/cut/run-cut-report.ts +24 -3
  887. package/scripts/run/cut/run-cut-resume.ts +129 -0
  888. package/scripts/run/cut/run-cut-review.ts +105 -0
  889. package/scripts/run/cut/run-cut.ts +18 -7
  890. package/scripts/run/detached-launch.ts +1 -1
  891. package/scripts/run/entry/run-entry-cli.ts +88 -19
  892. package/scripts/run/entry/run-entry-spill.ts +83 -0
  893. package/scripts/run/entry/run-entry-stop.ts +5 -1
  894. package/scripts/run/entry/run-entry-trust.ts +91 -0
  895. package/scripts/run/event/run-event-baseline.ts +56 -0
  896. package/scripts/run/event/run-event-cli.ts +1 -5
  897. package/scripts/run/event/run-event-filed.ts +18 -6
  898. package/scripts/run/event/run-event-follow.ts +2 -3
  899. package/scripts/run/event/run-event-overrun.ts +197 -0
  900. package/scripts/run/event/run-event-render.ts +10 -10
  901. package/scripts/run/event/run-event-scope.ts +2 -2
  902. package/scripts/run/event/run-event-stream-emit.ts +82 -22
  903. package/scripts/run/event/run-event-stream.ts +58 -10
  904. package/scripts/run/hold/run-hold-adopt.ts +65 -0
  905. package/scripts/run/hold/run-hold-cli.ts +93 -22
  906. package/scripts/run/hold/run-hold-main.ts +12 -0
  907. package/scripts/run/hold/run-hold-member.ts +37 -0
  908. package/scripts/run/hold/run-stop-notify.ts +178 -0
  909. package/scripts/run/merge/run-merge-auth.ts +31 -0
  910. package/scripts/run/merge/run-merge-cap.ts +57 -0
  911. package/scripts/run/merge/run-merge-cli.ts +119 -62
  912. package/scripts/run/merge/run-merge-close.ts +74 -0
  913. package/scripts/run/merge/run-merge-collect.ts +6 -13
  914. package/scripts/run/merge/run-merge-driver.ts +71 -0
  915. package/scripts/run/merge/run-merge-main.ts +12 -0
  916. package/scripts/run/merge/run-merge-outcome.ts +25 -0
  917. package/scripts/run/merge/run-merge-restart.ts +39 -0
  918. package/scripts/run/merge/run-merge-ship.ts +33 -7
  919. package/scripts/run/merge/run-merge-signals.ts +66 -25
  920. package/scripts/run/merge/run-merge-steps.ts +162 -107
  921. package/scripts/run/merge/run-merge-usage-limit.ts +53 -0
  922. package/scripts/run/merge/run-merge-withdrawn.ts +53 -0
  923. package/scripts/run/merge/run-merge.ts +76 -48
  924. package/scripts/run/park/run-park-cli.ts +91 -0
  925. package/scripts/run/park/run-park.ts +88 -0
  926. package/scripts/run/park/run-stalled.ts +68 -0
  927. package/scripts/run/pause/run-pause-cli.ts +73 -0
  928. package/scripts/run/pause/run-pause.ts +251 -0
  929. package/scripts/run/progress/run-progress-cli.ts +4 -12
  930. package/scripts/run/progress/run-progress-clock.ts +1 -1
  931. package/scripts/run/progress/run-progress-config.ts +6 -14
  932. package/scripts/run/progress/run-progress-main.ts +12 -0
  933. package/scripts/run/progress/run-progress.ts +1 -4
  934. package/scripts/run/review/run-review-cli.ts +306 -20
  935. package/scripts/run/review/run-review-early-push.ts +121 -0
  936. package/scripts/run/review/run-review-join-read.ts +94 -0
  937. package/scripts/run/review/run-review-pinned-accepted.ts +126 -0
  938. package/scripts/run/review/run-review-pinned-join.ts +216 -0
  939. package/scripts/run/review/run-review-pinned-steps.ts +383 -0
  940. package/scripts/run/review/run-review-pinned-tree.ts +37 -0
  941. package/scripts/run/review/run-review-pinned.ts +53 -0
  942. package/scripts/run/review/run-review-steps.ts +70 -34
  943. package/scripts/run/review/run-review.ts +28 -7
  944. package/scripts/run/run-ending.ts +1 -0
  945. package/scripts/run/run-invocation.ts +5 -6
  946. package/scripts/run/run-liveness-cli.ts +6 -8
  947. package/scripts/run/run-liveness.ts +60 -29
  948. package/scripts/run/run-next.ts +1 -1
  949. package/scripts/run/run-parent-cut-hook.ts +3 -4
  950. package/scripts/run/run-preflight.ts +18 -3
  951. package/scripts/run/run-prep-cli.ts +1 -10
  952. package/scripts/run/run-prep-locate.ts +7 -50
  953. package/scripts/run/run-prep-main.ts +12 -0
  954. package/scripts/run/run-prep.ts +7 -0
  955. package/scripts/run/run-report-cli.ts +101 -13
  956. package/scripts/run/run-report-handoff.ts +114 -0
  957. package/scripts/run/run-stage-read.ts +2 -6
  958. package/scripts/run/run-step-cli.ts +17 -5
  959. package/scripts/run/run-step-lane-plan.ts +27 -0
  960. package/scripts/run/run-step-section.ts +26 -7
  961. package/scripts/run/run-step.ts +6 -3
  962. package/scripts/run/run-stranded-detect.ts +13 -0
  963. package/scripts/run/run-watcher-guard-cli.ts +1 -1
  964. package/scripts/run/run-watcher-guard.ts +1 -1
  965. package/scripts/run/ship/run-ship-args.ts +140 -0
  966. package/scripts/run/ship/run-ship-body-draft.ts +110 -0
  967. package/scripts/run/ship/run-ship-brokered-review.ts +106 -0
  968. package/scripts/run/ship/run-ship-cli.ts +181 -166
  969. package/scripts/run/ship/run-ship-conflict-probe.ts +59 -0
  970. package/scripts/run/ship/run-ship-detach.ts +29 -12
  971. package/scripts/run/ship/run-ship-handover.ts +106 -0
  972. package/scripts/run/ship/run-ship-infra-retry.ts +74 -0
  973. package/scripts/run/ship/run-ship-lap.ts +63 -0
  974. package/scripts/run/ship/run-ship-next.ts +44 -27
  975. package/scripts/run/ship/run-ship-overlap.ts +49 -7
  976. package/scripts/run/ship/run-ship-place.ts +103 -0
  977. package/scripts/run/ship/run-ship-planned.ts +92 -0
  978. package/scripts/run/ship/run-ship-pre-detach-pinned.ts +197 -0
  979. package/scripts/run/ship/run-ship-pre-detach-timed.ts +42 -0
  980. package/scripts/run/ship/run-ship-pre-detach.ts +144 -33
  981. package/scripts/run/ship/run-ship-preflight.ts +150 -33
  982. package/scripts/run/ship/run-ship-probe.ts +28 -6
  983. package/scripts/run/ship/run-ship-relaunch-cap.ts +106 -0
  984. package/scripts/run/ship/run-ship-relaunch.ts +51 -0
  985. package/scripts/run/ship/run-ship-removed-rows.ts +61 -0
  986. package/scripts/run/ship/run-ship-return.ts +183 -25
  987. package/scripts/run/ship/run-ship-review-reason.ts +24 -0
  988. package/scripts/run/ship/run-ship-review-steps.ts +296 -171
  989. package/scripts/run/ship/run-ship-review.ts +222 -35
  990. package/scripts/run/ship/run-ship-reviewer.ts +303 -0
  991. package/scripts/run/ship/run-ship-scoped.ts +39 -10
  992. package/scripts/run/ship/run-ship-stage.ts +101 -16
  993. package/scripts/run/ship/run-ship-steps.ts +68 -17
  994. package/scripts/run/ship/run-ship-stop-cause.ts +176 -0
  995. package/scripts/run/ship/run-ship-stop-context.ts +50 -13
  996. package/scripts/run/ship/run-ship-stop-text.ts +11 -6
  997. package/scripts/run/ship/run-ship-sync.ts +212 -34
  998. package/scripts/run/ship/run-ship-synced-scope.ts +178 -0
  999. package/scripts/run/ship/run-ship-wait-cli.ts +145 -0
  1000. package/scripts/run/ship/run-ship-waiter.ts +114 -0
  1001. package/scripts/run/ship/run-ship.ts +44 -2
  1002. package/scripts/run/tidy/run-tidy-cli.ts +0 -4
  1003. package/scripts/run/tidy/run-tidy-lanes.ts +3 -0
  1004. package/scripts/run/tidy/run-tidy-main.ts +8 -0
  1005. package/scripts/run/wake/run-wake-caffeinate.ts +48 -0
  1006. package/scripts/run/wake/run-wake-cli.ts +121 -209
  1007. package/scripts/run/wake/run-wake-code.ts +125 -0
  1008. package/scripts/run/wake/run-wake-driver.ts +22 -9
  1009. package/scripts/run/wake/run-wake-finish.ts +137 -0
  1010. package/scripts/run/wake/run-wake-loop.ts +36 -3
  1011. package/scripts/run/wake/run-wake-main.ts +13 -0
  1012. package/scripts/run/wake/run-wake-ports.ts +98 -0
  1013. package/scripts/run/wake/run-wake-session.ts +2 -0
  1014. package/scripts/run/wake/run-wake-takeover.ts +66 -0
  1015. package/scripts/run/wake/run-wake.ts +5 -3
  1016. package/scripts/safe-chain/ci-installer-pin.ts +49 -8
  1017. package/scripts/safe-chain/pack-hook.ts +2 -2
  1018. package/scripts/safe-chain/preinstall-command.ts +2 -1
  1019. package/scripts/safe-chain/project-config.ts +6 -11
  1020. package/scripts/security/secretlint-scan.ts +42 -9
  1021. package/scripts/security/security-audit-main.ts +8 -0
  1022. package/scripts/security/security-audit-provision-logic.ts +0 -11
  1023. package/scripts/security/security-audit-provision-main.ts +20 -0
  1024. package/scripts/security/security-audit-provision.ts +12 -27
  1025. package/scripts/security/security-audit.ts +27 -8
  1026. package/scripts/security/sonar-file.ts +10 -5
  1027. package/scripts/self-sync-guard/self-sync-guard-logic.ts +6 -13
  1028. package/scripts/split/split-assess-cli.ts +2 -2
  1029. package/scripts/split/split-assess.ts +25 -1
  1030. package/scripts/split/split-early-notice.ts +116 -0
  1031. package/scripts/split/split-measure.ts +83 -0
  1032. package/scripts/split/split-resolution.ts +107 -0
  1033. package/scripts/sync/claude-settings-merge.ts +8 -15
  1034. package/scripts/sync/directory-copy-guard.ts +4 -9
  1035. package/scripts/sync/file-content.ts +78 -8
  1036. package/scripts/sync/sync-ai-files.ts +3 -5
  1037. package/scripts/sync/sync-configs.ts +11 -23
  1038. package/scripts/sync/sync-hook-safety.ts +4 -10
  1039. package/scripts/sync/sync-main.ts +11 -0
  1040. package/scripts/sync/sync.ts +25 -37
  1041. package/scripts/test/direct-importers.ts +185 -0
  1042. package/scripts/test/pure-files-entries.ts +83 -0
  1043. package/scripts/test/related-heavy-tests.ts +81 -0
  1044. package/scripts/test/test-declared-changed.ts +2 -2
  1045. package/scripts/test/test-declared.ts +1 -1
  1046. package/scripts/test/test-e2e-guard.ts +25 -1
  1047. package/scripts/test/test-e2e-stamp.ts +38 -0
  1048. package/scripts/test/test-no-base.ts +88 -0
  1049. package/scripts/test/test-pinned-cache-logic.ts +363 -0
  1050. package/scripts/test/test-pinned-cache.ts +337 -0
  1051. package/scripts/test/test-pinned-emit.ts +49 -0
  1052. package/scripts/test/test-pinned-functions.ts +116 -0
  1053. package/scripts/test/test-pinned-ledger.ts +80 -0
  1054. package/scripts/test/test-pinned-logic.ts +333 -0
  1055. package/scripts/test/test-pinned-main.ts +144 -0
  1056. package/scripts/test/test-pinned-pool.ts +73 -0
  1057. package/scripts/test/test-pinned-probe.ts +254 -0
  1058. package/scripts/test/test-pinned-prune-logic.ts +118 -0
  1059. package/scripts/test/test-pinned-reach.ts +194 -0
  1060. package/scripts/test/test-pinned-record.ts +196 -0
  1061. package/scripts/test/test-pinned-rewire.ts +148 -0
  1062. package/scripts/test/test-pinned-spawn.ts +81 -0
  1063. package/scripts/test/test-pinned-stage.ts +70 -0
  1064. package/scripts/test/test-pinned.ts +311 -0
  1065. package/scripts/test/test-reach-cli.ts +61 -0
  1066. package/scripts/test/test-read-map.ts +288 -0
  1067. package/scripts/test/test-read-recording.ts +103 -0
  1068. package/scripts/test/test-read-trace.ts +166 -0
  1069. package/scripts/test/test-red-logic.ts +46 -7
  1070. package/scripts/test/test-red-main.ts +12 -0
  1071. package/scripts/test/test-red.ts +39 -37
  1072. package/scripts/test/test-related-claim.ts +37 -0
  1073. package/scripts/test/test-related-main.ts +21 -0
  1074. package/scripts/test/test-related-moved.ts +91 -0
  1075. package/scripts/test/test-related-record.ts +139 -0
  1076. package/scripts/test/test-related-scope.ts +292 -41
  1077. package/scripts/test/test-related-synced.ts +135 -0
  1078. package/scripts/test/test-related-touched.ts +84 -0
  1079. package/scripts/test/test-related.ts +381 -19
  1080. package/scripts/test/test-unit-guard-main.ts +15 -0
  1081. package/scripts/test/test-unit-guard.ts +66 -25
  1082. package/scripts/test/unit-count-file.ts +37 -0
  1083. package/scripts/test/unit-durations.ts +41 -0
  1084. package/scripts/test/unit-run-marker.ts +162 -0
  1085. package/scripts/test/unit-setup-files.ts +51 -0
  1086. package/scripts/test/unit-worker-share.ts +64 -151
  1087. package/scripts/test/vitest-cache-directory.ts +19 -0
  1088. package/scripts/test/vitest-cli-excludes.ts +14 -0
  1089. package/scripts/test/vitest-failure-summary.ts +111 -0
  1090. package/scripts/test/whole-suite-files.ts +74 -0
  1091. package/scripts/time-runtime/time-background.ts +20 -2
  1092. package/scripts/time-runtime/time-batch-guard.ts +42 -4
  1093. package/scripts/time-runtime/time-bundle-call.ts +1 -1
  1094. package/scripts/time-runtime/time-bundles.ts +40 -8
  1095. package/scripts/time-runtime/time-density-hook.ts +8 -6
  1096. package/scripts/time-runtime/time-followup-stage.ts +1 -3
  1097. package/scripts/time-runtime/time-format.ts +5 -28
  1098. package/scripts/time-runtime/time-markers.ts +12 -3
  1099. package/scripts/time-runtime/time-search-call.ts +38 -0
  1100. package/scripts/time-runtime/time-shell.ts +98 -11
  1101. package/scripts/time-runtime/time-transcript-line.ts +65 -66
  1102. package/scripts/uninstall/uninstall.ts +1 -1
  1103. package/scripts/version/bump-version-main.ts +12 -0
  1104. package/scripts/version/bump-version.ts +25 -25
  1105. package/scripts/version/development-engines-verdict.ts +124 -0
  1106. package/scripts/version/effective-upstream.ts +6 -12
  1107. package/scripts/version/latest-corepack.ts +19 -32
  1108. package/scripts/version/latest-if-required-cli.ts +93 -0
  1109. package/scripts/version/latest-lane-guard-main.ts +8 -0
  1110. package/scripts/version/latest-lane-guard.ts +0 -4
  1111. package/scripts/version/latest-scope-cli.ts +0 -9
  1112. package/scripts/version/latest-scope-main.ts +12 -0
  1113. package/scripts/version/latest-update.ts +5 -5
  1114. package/scripts/version/npm-registry.ts +44 -6
  1115. package/scripts/version/publishable-range-check.ts +5 -16
  1116. package/scripts/version/release-age.ts +1 -1
  1117. package/scripts/version/release-hold.ts +1 -1
  1118. package/scripts/version/release-window.ts +38 -0
  1119. package/scripts/version/running-binary.ts +1 -1
  1120. package/scripts/version/safe-chain-version-update.ts +3 -8
  1121. package/scripts/version/version-targets.ts +6 -28
  1122. package/templates/dependabot.yml +29 -0
  1123. package/templates/gitignore +6 -1
  1124. package/templates/pnpm-workspace.basic.yaml +1 -1
  1125. package/templates/sonar-project.properties +3 -2
  1126. package/templates/workflows/ci.yml +53 -4
  1127. package/templates/workflows/github-release.yml +4 -0
  1128. package/tsconfig.sonar.json +1 -1
  1129. package/.ncurc.json +0 -3
  1130. package/dist/hooks/batch-guard.js +0 -29
  1131. package/dist/hooks/chunk-4KKD2UTK.js +0 -66
  1132. package/dist/hooks/chunk-6TS2JD6D.js +0 -237
  1133. package/dist/hooks/chunk-7DSBJVFH.js +0 -50
  1134. package/dist/hooks/chunk-A65Y4YOR.js +0 -79
  1135. package/dist/hooks/chunk-APUO6U4J.js +0 -2451
  1136. package/dist/hooks/chunk-CDY4NFQG.js +0 -15
  1137. package/dist/hooks/chunk-DGT54IH5.js +0 -161
  1138. package/dist/hooks/chunk-EFXE6C37.js +0 -81
  1139. package/dist/hooks/chunk-GP4IEC4O.js +0 -20
  1140. package/dist/hooks/chunk-JP45SOCJ.js +0 -56
  1141. package/dist/hooks/chunk-LAOV7NLM.js +0 -45
  1142. package/dist/hooks/chunk-M4HGZV7U.js +0 -83
  1143. package/dist/hooks/chunk-O6GDRNJB.js +0 -343
  1144. package/dist/hooks/chunk-PF2NZL2A.js +0 -131
  1145. package/dist/hooks/chunk-PTICX4OL.js +0 -358
  1146. package/dist/hooks/chunk-RT27QRJW.js +0 -6247
  1147. package/dist/hooks/chunk-SYOTDYCI.js +0 -3533
  1148. package/dist/hooks/chunk-TNUMY6NL.js +0 -4838
  1149. package/dist/hooks/chunk-UPUZF3AN.js +0 -279
  1150. package/dist/hooks/chunk-WK6SMBIC.js +0 -3180
  1151. package/dist/hooks/duplicate-read-guard.js +0 -30
  1152. package/dist/hooks/investigation-guard.js +0 -29
  1153. package/scripts/backlog/backlog-stalled-cli.ts +0 -30
  1154. package/scripts/cost-runtime/context-cut-threshold.ts +0 -11
  1155. package/scripts/cost-runtime/cost-format.ts +0 -29
  1156. package/scripts/init/basic-path-migration.ts +0 -24
  1157. package/scripts/issue/issue-backlinks-cli.ts +0 -93
  1158. package/scripts/josh/josh-commands-guard.ts +0 -38
  1159. package/scripts/josh/josh-usage-automation.ts +0 -121
  1160. package/scripts/josh/josh-usage-backlog.ts +0 -180
  1161. package/scripts/josh/josh-usage-developer.ts +0 -230
  1162. package/scripts/josh/josh-usage-hooks.ts +0 -38
  1163. package/scripts/josh/josh-usage-issue.ts +0 -205
  1164. package/scripts/josh/josh-usage-review.ts +0 -101
  1165. package/scripts/josh/josh-usage-run.ts +0 -252
  1166. package/scripts/josh/josh-usage-session.ts +0 -238
  1167. package/scripts/josh/josh-usage-workflow.ts +0 -212
  1168. package/scripts/lint/cross-file-recheck.ts +0 -155
  1169. package/scripts/registry-migration/migrate-logic.ts +0 -237
  1170. package/scripts/registry-migration/migrate.ts +0 -292
  1171. package/scripts/registry-migration/user-npmrc.ts +0 -15
  1172. package/scripts/rules/filing-cap.ts +0 -132
  1173. package/scripts/rules/rule-guard.ts +0 -23
  1174. package/scripts/rules/rule-registry-rows.ts +0 -292
  1175. package/scripts/rules/rule-registry.ts +0 -112
  1176. package/scripts/run/run-stranded-cli.ts +0 -27
@@ -0,0 +1,3591 @@
1
+ import {
2
+ MS_PER_MINUTE,
3
+ PLATFORM_TEMP_ROOT,
4
+ PROBE_TIMEOUT_MS,
5
+ error_text,
6
+ git_command,
7
+ git_common_directory,
8
+ platform_temporary,
9
+ repo_discovery,
10
+ repo_origin,
11
+ stamp_file
12
+ } from "./chunk-45CJJOO7.js";
13
+
14
+ // scripts/lib/json-value.ts
15
+ function parse_or_undefined(text2) {
16
+ try {
17
+ return JSON.parse(text2);
18
+ } catch {
19
+ return void 0;
20
+ }
21
+ }
22
+ function parse_with(text2, schema) {
23
+ const value = parse_or_undefined(text2);
24
+ if (value === void 0) return void 0;
25
+ const parsed = schema.safeParse(value);
26
+ return parsed.success ? parsed.data : void 0;
27
+ }
28
+ function parse_array(text2) {
29
+ const value = parse_or_undefined(text2);
30
+ return Array.isArray(value) ? value : void 0;
31
+ }
32
+ function is_record(value) {
33
+ return typeof value === "object" && value !== null && !Array.isArray(value);
34
+ }
35
+ var json_value = { parse_or_undefined, parse_with, parse_array, is_record };
36
+
37
+ // scripts/josh/durable-state.ts
38
+ import { mkdirSync } from "node:fs";
39
+ import path2 from "node:path";
40
+
41
+ // scripts/josh/durable-state-migrate.ts
42
+ import { constants, copyFileSync, lstatSync, readdirSync, rmSync, writeFileSync } from "node:fs";
43
+ import path from "node:path";
44
+ var COPIED_MARKER = ".legacy-copied";
45
+ var MARKER_MODE = 384;
46
+ var LOG_RETENTION_DAYS = 14;
47
+ var DAY_MS = 864e5;
48
+ var LOG_SUFFIX = ".log";
49
+ var RECORD_SUFFIXES = [".json", ".jsonl", LOG_SUFFIX];
50
+ function is_record_name(name, prefixes) {
51
+ const has_prefix = prefixes.some((prefix) => name.startsWith(prefix));
52
+ return has_prefix && RECORD_SUFFIXES.some((suffix) => name.endsWith(suffix));
53
+ }
54
+ function list_names(directory) {
55
+ try {
56
+ return readdirSync(directory);
57
+ } catch {
58
+ return [];
59
+ }
60
+ }
61
+ function copy_record(from, to) {
62
+ try {
63
+ if (!stamp_file.is_own_regular_file(from)) return;
64
+ copyFileSync(from, to, constants.COPYFILE_EXCL);
65
+ } catch {
66
+ }
67
+ }
68
+ function copy_legacy(from, to, prefixes) {
69
+ if (from === to) return;
70
+ for (const name of list_names(from)) {
71
+ if (is_record_name(name, prefixes)) copy_record(path.join(from, name), path.join(to, name));
72
+ }
73
+ }
74
+ function claim_copy(directory) {
75
+ try {
76
+ writeFileSync(path.join(directory, COPIED_MARKER), "", { flag: "wx", mode: MARKER_MODE });
77
+ return true;
78
+ } catch {
79
+ return false;
80
+ }
81
+ }
82
+ function copy_once(from, to, prefixes) {
83
+ if (claim_copy(to)) copy_legacy(from, to, prefixes);
84
+ }
85
+ function is_stale(target2, now_ms) {
86
+ const age_ms = now_ms - lstatSync(target2).mtimeMs;
87
+ return age_ms > LOG_RETENTION_DAYS * DAY_MS && stamp_file.is_own_regular_file(target2);
88
+ }
89
+ function prune_log(target2, now_ms) {
90
+ try {
91
+ if (is_stale(target2, now_ms)) rmSync(target2, { force: true });
92
+ } catch {
93
+ }
94
+ }
95
+ function prune_stale_logs(directory, prefixes, now_ms) {
96
+ for (const name of list_names(directory)) {
97
+ if (name.endsWith(LOG_SUFFIX) && is_record_name(name, prefixes)) {
98
+ prune_log(path.join(directory, name), now_ms);
99
+ }
100
+ }
101
+ }
102
+ var durable_state_migrate = { LOG_RETENTION_DAYS, copy_once, is_record_name, prune_stale_logs };
103
+
104
+ // scripts/josh/durable-state.ts
105
+ var RUN_STATE_DIRECTORY = "run-state";
106
+ var OVERRIDE_STATE_DIRECTORY = "josh-state";
107
+ var STATE_DIRECTORY_MODE = 448;
108
+ function state_root(override, common) {
109
+ if (override !== void 0 && override !== "") {
110
+ return path2.join(override, OVERRIDE_STATE_DIRECTORY);
111
+ }
112
+ if (common === void 0) return PLATFORM_TEMP_ROOT;
113
+ return path2.join(common, git_common_directory.STATE_DIRECTORY, RUN_STATE_DIRECTORY);
114
+ }
115
+ var STATE_ROOT_OVERRIDE = process.env[platform_temporary.TEMP_ROOT_KEY];
116
+ function root_for(common) {
117
+ return state_root(STATE_ROOT_OVERRIDE, common);
118
+ }
119
+ function root() {
120
+ return root_for(git_common_directory.repository());
121
+ }
122
+ var PREFIX = {
123
+ CARRY: "josh-run-carry-",
124
+ ENDED: "josh-run-ended-",
125
+ EVENTS: "josh-run-events-",
126
+ LANE_STATE: "josh-lane-state-",
127
+ LANE_LEDGER: "josh-lane-ledger-",
128
+ WAKE_LOG: "josh-run-wake-log-",
129
+ BACKLOGRUN_LAUNCH: "josh-backlogrun-launch-",
130
+ BACKLOGRUN_LOG: "josh-backlogrun-log-",
131
+ SHIP_LOG: "josh-ship-log-",
132
+ SHIP_RESULT: "josh-ship-result-",
133
+ LANE_DISPATCH: "josh-lane-dispatch-",
134
+ LANE_PLAN: "josh-lane-plan-"
135
+ };
136
+ var PREFIXES = Object.values(PREFIX);
137
+ var ensured = /* @__PURE__ */ new Set();
138
+ function prepare(directory) {
139
+ mkdirSync(directory, { recursive: true, mode: STATE_DIRECTORY_MODE });
140
+ durable_state_migrate.copy_once(PLATFORM_TEMP_ROOT, directory, PREFIXES);
141
+ durable_state_migrate.prune_stale_logs(directory, PREFIXES, Date.now());
142
+ }
143
+ function ensure(directory) {
144
+ if (ensured.has(directory)) return directory;
145
+ try {
146
+ prepare(directory);
147
+ } catch {
148
+ return PLATFORM_TEMP_ROOT;
149
+ }
150
+ ensured.add(directory);
151
+ return directory;
152
+ }
153
+ function durable_path(prefix, key_root, suffix) {
154
+ return path2.join(ensure(root()), stamp_file.stamp_name(prefix, key_root, suffix));
155
+ }
156
+ var durable_state = {
157
+ PREFIX,
158
+ STATE_DIRECTORY_MODE,
159
+ ensure,
160
+ path: durable_path,
161
+ root,
162
+ root_for,
163
+ state_root
164
+ };
165
+
166
+ // scripts/josh/process-identity.ts
167
+ import { execFileSync, spawnSync } from "node:child_process";
168
+ import { randomUUID } from "node:crypto";
169
+ import { readFileSync, rmSync as rmSync2 } from "node:fs";
170
+ import { createServer } from "node:net";
171
+ import path3 from "node:path";
172
+ var PS_COMMAND = "/bin/ps";
173
+ var FORMAT_FLAG = "-o";
174
+ var START_TIME_FORMAT = "lstart=";
175
+ var PID_FLAG = "-p";
176
+ var PROBE_ENVIRONMENT = { TZ: "UTC", LC_ALL: "C" };
177
+ var LIVENESS_SIGNAL = 0;
178
+ var NO_SUCH_PROCESS = "ESRCH";
179
+ var LOWEST_REAL_PID = 1;
180
+ var PROC_START_FIELD_INDEX = 19;
181
+ var BEACON_SCHEME = "socket:";
182
+ var BEACON_SUFFIX = ".sock";
183
+ var BEACON_PREFIX = `josh-process-identity-${String(process.getuid?.() ?? "")}-`;
184
+ var BEACON_ID_LENGTH = 36;
185
+ var BEACON_ID_PATTERN = /^[\da-f-]+$/u;
186
+ var WINDOWS_PLATFORM = "win32";
187
+ var BEACON_LIVE_STATUS = 0;
188
+ var BEACON_UNKNOWN_STATUS = 1;
189
+ var BEACON_GONE_STATUS = 2;
190
+ var SOCKET_PROBE_SOURCE = `const net=require('node:net');const socket=net.createConnection(process.argv[1]);socket.once('connect',()=>process.exit(${String(BEACON_LIVE_STATUS)}));socket.once('error',(error)=>process.exit(['ECONNREFUSED','ENOENT'].includes(error.code)?${String(BEACON_GONE_STATUS)}:${String(BEACON_UNKNOWN_STATUS)}));socket.setTimeout(1000,()=>process.exit(${String(BEACON_UNKNOWN_STATUS)}));`;
191
+ var beacons = /* @__PURE__ */ new Map();
192
+ var exit_cleanup = { is_registered: false };
193
+ function signal_refusal(pid) {
194
+ try {
195
+ process.kill(pid, LIVENESS_SIGNAL);
196
+ return void 0;
197
+ } catch (error) {
198
+ return error.code ?? NO_SUCH_PROCESS;
199
+ }
200
+ }
201
+ function is_live_pid(pid) {
202
+ return pid >= LOWEST_REAL_PID && signal_refusal(pid) === void 0;
203
+ }
204
+ function is_present_pid(pid) {
205
+ return pid >= LOWEST_REAL_PID && signal_refusal(pid) !== NO_SUCH_PROCESS;
206
+ }
207
+ function read_proc_start(pid) {
208
+ try {
209
+ const stat = readFileSync(`/proc/${String(pid)}/stat`, "utf8");
210
+ const fields = stat.slice(stat.lastIndexOf(")") + 1).trim().split(/\s+/u);
211
+ const start = fields[PROC_START_FIELD_INDEX];
212
+ return start === void 0 ? void 0 : `proc:${start}`;
213
+ } catch {
214
+ return void 0;
215
+ }
216
+ }
217
+ function read_ps_start(pid) {
218
+ try {
219
+ const printed = execFileSync(
220
+ PS_COMMAND,
221
+ [FORMAT_FLAG, START_TIME_FORMAT, PID_FLAG, String(pid)],
222
+ {
223
+ encoding: "utf8",
224
+ timeout: PROBE_TIMEOUT_MS,
225
+ stdio: ["ignore", "pipe", "ignore"],
226
+ env: PROBE_ENVIRONMENT
227
+ }
228
+ ).trim();
229
+ return printed.length > 0 ? printed : void 0;
230
+ } catch {
231
+ return void 0;
232
+ }
233
+ }
234
+ var START_PROBES = { read_proc_start, read_ps_start };
235
+ function safe_probe(probe, pid) {
236
+ try {
237
+ return probe(pid);
238
+ } catch {
239
+ return void 0;
240
+ }
241
+ }
242
+ function read_start(pid, probes = START_PROBES) {
243
+ return safe_probe(probes.read_proc_start, pid) ?? safe_probe(probes.read_ps_start, pid);
244
+ }
245
+ function close_beacon(token) {
246
+ const server = beacons.get(token);
247
+ if (server === void 0) return;
248
+ beacons.delete(token);
249
+ server.close();
250
+ rmSync2(token.slice(BEACON_SCHEME.length), { force: true });
251
+ }
252
+ function close_beacons() {
253
+ for (const token of beacons.keys()) close_beacon(token);
254
+ }
255
+ function ensure_exit_cleanup() {
256
+ if (exit_cleanup.is_registered) return;
257
+ exit_cleanup.is_registered = true;
258
+ process.once("exit", close_beacons);
259
+ }
260
+ function ignore_beacon_error() {
261
+ }
262
+ function bind_beacon(target2) {
263
+ return createServer().on("error", ignore_beacon_error).listen(target2);
264
+ }
265
+ function try_bind_beacon(bind, target2) {
266
+ try {
267
+ const server = bind(target2);
268
+ return server.listening ? server : void 0;
269
+ } catch {
270
+ return void 0;
271
+ }
272
+ }
273
+ function open_beacon(bind = bind_beacon) {
274
+ const target2 = path3.join(PLATFORM_TEMP_ROOT, `${BEACON_PREFIX}${randomUUID()}${BEACON_SUFFIX}`);
275
+ const token = `${BEACON_SCHEME}${target2}`;
276
+ const server = try_bind_beacon(bind, target2);
277
+ if (server === void 0) return void 0;
278
+ server.unref();
279
+ beacons.set(token, server);
280
+ ensure_exit_cleanup();
281
+ return token;
282
+ }
283
+ function resolve_own_start(probes = START_PROBES, platform = process.platform) {
284
+ const start = read_start(process.pid, probes);
285
+ if (start !== void 0 || platform === WINDOWS_PLATFORM) return start;
286
+ return open_beacon();
287
+ }
288
+ function is_valid_beacon_name(name) {
289
+ if (!name.startsWith(BEACON_PREFIX) || !name.endsWith(BEACON_SUFFIX)) return false;
290
+ const id = name.slice(BEACON_PREFIX.length, -BEACON_SUFFIX.length);
291
+ return id.length === BEACON_ID_LENGTH && BEACON_ID_PATTERN.test(id);
292
+ }
293
+ function beacon_target(token) {
294
+ if (!token.startsWith(BEACON_SCHEME)) return void 0;
295
+ const target2 = token.slice(BEACON_SCHEME.length);
296
+ if (path3.dirname(target2) !== PLATFORM_TEMP_ROOT) return void 0;
297
+ return is_valid_beacon_name(path3.basename(target2)) ? target2 : void 0;
298
+ }
299
+ function run_socket_probe(target2, kill_after_ms = PROBE_TIMEOUT_MS) {
300
+ return spawnSync(process.execPath, ["-e", SOCKET_PROBE_SOURCE, target2], {
301
+ stdio: "ignore",
302
+ timeout: kill_after_ms
303
+ }).status ?? void 0;
304
+ }
305
+ function is_live_beacon(target2, probe = run_socket_probe) {
306
+ const status = probe(target2);
307
+ if (status === BEACON_LIVE_STATUS) return true;
308
+ return status === BEACON_GONE_STATUS ? false : void 0;
309
+ }
310
+ function has_matching_start(pid, recorded_start, read) {
311
+ const observed = read(pid);
312
+ return observed === void 0 ? void 0 : observed === recorded_start;
313
+ }
314
+ function matches_recorded_start(pid, recorded_start, read) {
315
+ const target2 = beacon_target(recorded_start);
316
+ return target2 === void 0 ? has_matching_start(pid, recorded_start, read) : is_live_beacon(target2);
317
+ }
318
+ var own_probe = /* @__PURE__ */ new Map();
319
+ function own_start() {
320
+ if (!own_probe.has(process.pid)) own_probe.set(process.pid, resolve_own_start());
321
+ return own_probe.get(process.pid);
322
+ }
323
+ function own_fields() {
324
+ const start = own_start();
325
+ return { pid: process.pid, ...start !== void 0 && { process_start: start } };
326
+ }
327
+ function is_same_process(pid, recorded_start, read = read_start) {
328
+ if (pid === void 0 || !is_live_pid(pid)) return false;
329
+ if (recorded_start === void 0) return void 0;
330
+ return matches_recorded_start(pid, recorded_start, read);
331
+ }
332
+ function is_present_process(pid, recorded_start, read = read_start) {
333
+ if (!is_present_pid(pid)) return false;
334
+ if (recorded_start === void 0) return void 0;
335
+ return matches_recorded_start(pid, recorded_start, read);
336
+ }
337
+ function is_own_process(pid, recorded_start) {
338
+ return pid === process.pid && recorded_start === own_start();
339
+ }
340
+ var process_identity = {
341
+ PROBE_ENVIRONMENT,
342
+ START_PROBES,
343
+ START_TIME_FORMAT,
344
+ close_beacon,
345
+ is_live_beacon,
346
+ is_live_pid,
347
+ is_own_process,
348
+ is_present_pid,
349
+ is_present_process,
350
+ is_same_process,
351
+ open_beacon,
352
+ own_fields,
353
+ own_start,
354
+ read_start,
355
+ resolve_own_start,
356
+ run_socket_probe
357
+ };
358
+
359
+ // scripts/issue/issue-number-shape.ts
360
+ var ISSUE_NUMBER_PATTERN = /^[1-9]\d*$/u;
361
+ var BAD_ISSUE_MESSAGE = "Not an issue number: ";
362
+ function is_issue_number(value) {
363
+ return ISSUE_NUMBER_PATTERN.test(value);
364
+ }
365
+ function require_issue_number(issue2) {
366
+ if (!is_issue_number(issue2)) throw new Error(`${BAD_ISSUE_MESSAGE}${issue2}`);
367
+ }
368
+ function single_of(positionals) {
369
+ const [issue_number, ...rest] = positionals;
370
+ const is_single = rest.length === 0 && issue_number !== void 0;
371
+ return is_single && ISSUE_NUMBER_PATTERN.test(issue_number) ? issue_number : void 0;
372
+ }
373
+ var issue_number_shape = {
374
+ ISSUE_NUMBER_PATTERN,
375
+ is_issue_number,
376
+ require_issue_number,
377
+ single_of
378
+ };
379
+
380
+ // scripts/lib/cli-flags.ts
381
+ import { parseArgs } from "node:util";
382
+ var HELP_FLAGS = /* @__PURE__ */ new Set(["--help", "-h"]);
383
+ function usage_line(known_flags, command) {
384
+ if (known_flags.length === 0) return `Usage: josh ${command}`;
385
+ return `Usage: josh ${command} [${known_flags.join("] [")}]`;
386
+ }
387
+ function refuse_unknown_flags(argv, known_flags, command) {
388
+ const unknown = argv.filter((argument) => !known_flags.includes(argument));
389
+ if (unknown.length === 0) return void 0;
390
+ return `Unknown argument(s): ${unknown.join(" ")}
391
+ ${usage_line(known_flags, command)}`;
392
+ }
393
+ function answer_help_or_unknown(argv, known_flags, command) {
394
+ if (argv.some((argument) => HELP_FLAGS.has(argument))) {
395
+ console.info(usage_line(known_flags, command));
396
+ return 0;
397
+ }
398
+ const refusal = refuse_unknown_flags(argv, known_flags, command);
399
+ if (refusal === void 0) return void 0;
400
+ console.error(refusal);
401
+ return 1;
402
+ }
403
+ function parse_or_undefined2(config) {
404
+ try {
405
+ return parseArgs(config);
406
+ } catch {
407
+ return void 0;
408
+ }
409
+ }
410
+ function values_of(argv, options) {
411
+ return parse_or_undefined2({ args: [...argv], options })?.values;
412
+ }
413
+ function arguments_of(argv, options) {
414
+ return parse_or_undefined2({ args: [...argv], options, allowPositionals: true });
415
+ }
416
+ function string_of(value) {
417
+ return typeof value === "string" ? value : void 0;
418
+ }
419
+ var LONG_FLAG_PREFIX = "--";
420
+ var SHORT_FLAG_PREFIX = "-";
421
+ function option_name(flag) {
422
+ return flag.slice(LONG_FLAG_PREFIX.length);
423
+ }
424
+ function is_unusable_value(value) {
425
+ if (typeof value === "boolean" || value.length === 0) return true;
426
+ return value !== SHORT_FLAG_PREFIX && value.startsWith(SHORT_FLAG_PREFIX);
427
+ }
428
+ function given_values(argv, flag) {
429
+ const name = option_name(flag);
430
+ const given = parse_or_undefined2({
431
+ args: [...argv],
432
+ options: { [name]: { type: "string", multiple: true } },
433
+ strict: false,
434
+ allowPositionals: true
435
+ })?.values[name];
436
+ return Array.isArray(given) ? given : [];
437
+ }
438
+ function is_value_unusable(argv, flag) {
439
+ return given_values(argv, flag).some((value) => is_unusable_value(value));
440
+ }
441
+ function attach_one(attached, argument, flags) {
442
+ const previous = attached.at(-1);
443
+ if (previous !== void 0 && flags.includes(previous)) {
444
+ attached[attached.length - 1] = `${previous}=${argument}`;
445
+ } else attached.push(argument);
446
+ }
447
+ function attach_values(argv, flags) {
448
+ const attached = [];
449
+ for (const argument of argv) attach_one(attached, argument, flags);
450
+ return attached;
451
+ }
452
+ var COUNT_PATTERN = /^\d+$/u;
453
+ var POSITIVE_PATTERN = /^[1-9]\d*$/u;
454
+ function to_integer(raw, pattern) {
455
+ if (raw === void 0 || !pattern.test(raw)) return void 0;
456
+ const parsed = Number(raw);
457
+ return Number.isSafeInteger(parsed) ? parsed : void 0;
458
+ }
459
+ function to_count(raw) {
460
+ return to_integer(raw, COUNT_PATTERN);
461
+ }
462
+ function to_positive(raw) {
463
+ return to_integer(raw, POSITIVE_PATTERN);
464
+ }
465
+ function read_positive_setting(raw, name, fallback) {
466
+ const trimmed = raw?.trim() ?? "";
467
+ if (trimmed === "") return { kind: "limit", limit: fallback };
468
+ const limit = to_positive(trimmed);
469
+ if (limit !== void 0) return { kind: "limit", limit };
470
+ return { kind: "problem", problem: `${name} must be a positive integer, not "${trimmed}"` };
471
+ }
472
+ var cli_flags = {
473
+ to_count,
474
+ to_positive,
475
+ read_positive_setting,
476
+ attach_values,
477
+ usage_line,
478
+ refuse_unknown_flags,
479
+ answer_help_or_unknown,
480
+ parse_or_undefined: parse_or_undefined2,
481
+ values_of,
482
+ arguments_of,
483
+ string_of,
484
+ option_name,
485
+ given_values,
486
+ is_value_unusable
487
+ };
488
+
489
+ // scripts/run/run-invocation.ts
490
+ var BACKLOG_COMMAND = "backlogrun";
491
+ var KNOWN_FLAGS = ["--max", "--idle"];
492
+ var ONLY_FLAG = "--only";
493
+ var OPTIONS = {
494
+ max: { type: "string" },
495
+ idle: { type: "string" },
496
+ only: { type: "boolean" }
497
+ };
498
+ var ISSUE_PREFIX = "#";
499
+ var FLAG_PREFIX = "-";
500
+ var TOKEN_SEPARATOR = " ";
501
+ var FIRST_TOKEN = 0;
502
+ var FIRST_ARGUMENT_INDEX = 1;
503
+ var EMPTY_LENGTH = 0;
504
+ var NOT_FOUND = -1;
505
+ function tokens_of(invocation) {
506
+ return invocation.split(TOKEN_SEPARATOR).filter((token) => token.length > EMPTY_LENGTH);
507
+ }
508
+ function render_option(token) {
509
+ if (token.name === cli_flags.option_name(ONLY_FLAG)) return ONLY_FLAG;
510
+ const flag = KNOWN_FLAGS.find((known) => cli_flags.option_name(known) === token.name);
511
+ const value = cli_flags.to_count(token.value);
512
+ if (flag === void 0 || value === void 0) return void 0;
513
+ return `${flag} ${String(value)}`;
514
+ }
515
+ function rendered_options(tokens) {
516
+ const rendered = [];
517
+ for (const token of tokens) {
518
+ const part = render_option(token);
519
+ if (part === void 0) return void 0;
520
+ rendered.push(part);
521
+ }
522
+ return rendered;
523
+ }
524
+ function issue_of(token) {
525
+ if (!token.startsWith(ISSUE_PREFIX)) return void 0;
526
+ const digits = token.slice(ISSUE_PREFIX.length);
527
+ if (!issue_number_shape.ISSUE_NUMBER_PATTERN.test(digits)) return void 0;
528
+ const issue2 = Number(digits);
529
+ return Number.isSafeInteger(issue2) ? issue2 : void 0;
530
+ }
531
+ function issues_of(tokens) {
532
+ const issues = [];
533
+ for (const token of tokens) {
534
+ const issue2 = issue_of(token.value ?? "");
535
+ if (issue2 === void 0) return void 0;
536
+ issues.push(issue2);
537
+ }
538
+ return issues;
539
+ }
540
+ function argument_tokens(invocation) {
541
+ const tokens = tokens_of(invocation);
542
+ if (tokens[FIRST_TOKEN] !== BACKLOG_COMMAND) return void 0;
543
+ return cli_flags.parse_or_undefined({
544
+ args: tokens.slice(FIRST_ARGUMENT_INDEX),
545
+ options: OPTIONS,
546
+ allowPositionals: true,
547
+ tokens: true
548
+ })?.tokens;
549
+ }
550
+ function parse(invocation) {
551
+ const tokens = argument_tokens(invocation);
552
+ if (tokens === void 0) return void 0;
553
+ const stop = tokens.findIndex((token) => token.kind !== "positional");
554
+ const split_at = stop === NOT_FOUND ? tokens.length : stop;
555
+ const issues = issues_of(tokens.slice(FIRST_TOKEN, split_at));
556
+ const flags = rendered_options(tokens.slice(split_at));
557
+ if (issues === void 0 || flags === void 0) return void 0;
558
+ return { issues, flags };
559
+ }
560
+ function issue_token(issue2) {
561
+ return `${ISSUE_PREFIX}${String(issue2)}`;
562
+ }
563
+ function joined(command, rendered) {
564
+ return [command, ...rendered].join(TOKEN_SEPARATOR);
565
+ }
566
+ function rebuild(invocation) {
567
+ const parsed = parse(invocation);
568
+ if (parsed === void 0) return void 0;
569
+ return joined(BACKLOG_COMMAND, [
570
+ ...parsed.issues.map((issue2) => issue_token(issue2)),
571
+ ...parsed.flags
572
+ ]);
573
+ }
574
+ function issue_numbers(invocation) {
575
+ const tokens = tokens_of(invocation);
576
+ const stop = tokens.findIndex((token) => token.startsWith(FLAG_PREFIX));
577
+ const leading = stop === NOT_FOUND ? tokens : tokens.slice(FIRST_TOKEN, stop);
578
+ const issues = parse(leading.join(TOKEN_SEPARATOR))?.issues;
579
+ if (issues === void 0 || issues.length === EMPTY_LENGTH) return void 0;
580
+ return issues;
581
+ }
582
+ function has_only(invocation) {
583
+ return parse(invocation)?.flags.includes(ONLY_FLAG) === true;
584
+ }
585
+ var run_invocation = {
586
+ has_only,
587
+ issue_numbers,
588
+ rebuild
589
+ };
590
+
591
+ // scripts/run/carry/run-carry.ts
592
+ import { z as z2 } from "zod";
593
+
594
+ // scripts/run/carry/run-carry-added.ts
595
+ function issues_of2(added, is_priority) {
596
+ return added.filter((entry) => entry.is_priority === is_priority).map((entry) => entry.issue);
597
+ }
598
+ function ordered(declared, added = []) {
599
+ const sequence = [...issues_of2(added, true), ...declared, ...issues_of2(added, false)];
600
+ return sequence.filter((issue2, index) => sequence.indexOf(issue2) === index);
601
+ }
602
+ function next_added(carry, additions) {
603
+ const next = [...carry.added ?? []];
604
+ for (const addition of additions) {
605
+ if (next.every((entry) => entry.issue !== addition.issue)) next.push(addition);
606
+ }
607
+ return next;
608
+ }
609
+ function add_issues(target2, carry, additions) {
610
+ const next = { ...carry, added: next_added(carry, additions) };
611
+ stamp_file.replace_stamp(target2, next);
612
+ return next;
613
+ }
614
+ var run_carry_added = { add_issues, ordered };
615
+
616
+ // scripts/run/carry/run-carry-streak.ts
617
+ var NO_INCREMENT = 0;
618
+ var OUTAGE_FOLD_WINDOW_MS = 12e4;
619
+ function has_increment(value) {
620
+ return (value ?? NO_INCREMENT) > NO_INCREMENT;
621
+ }
622
+ function next_failures(carry, change) {
623
+ if (has_increment(change.merged)) return NO_INCREMENT;
624
+ return carry.failures + (change.failures ?? NO_INCREMENT);
625
+ }
626
+ function is_within_fold_window(last_outage_at, now) {
627
+ if (last_outage_at === void 0) return false;
628
+ const last = Date.parse(last_outage_at);
629
+ if (Number.isNaN(last)) return false;
630
+ return now.getTime() - last <= OUTAGE_FOLD_WINDOW_MS;
631
+ }
632
+ function folded_outage(carry) {
633
+ return { outages: carry.outages, last_outage_at: carry.last_outage_at };
634
+ }
635
+ function counted_outage(carry, change, now) {
636
+ const outages = carry.outages + (change.outages ?? NO_INCREMENT);
637
+ return { outages, last_outage_at: now.toISOString() };
638
+ }
639
+ function next_outage(carry, change, now) {
640
+ if (has_increment(change.outages)) {
641
+ return is_within_fold_window(carry.last_outage_at, now) ? folded_outage(carry) : counted_outage(carry, change, now);
642
+ }
643
+ const is_reachable = has_increment(change.merged) || has_increment(change.failures);
644
+ return is_reachable ? { outages: NO_INCREMENT, last_outage_at: void 0 } : folded_outage(carry);
645
+ }
646
+ function next_state(carry, change, now) {
647
+ const outage = next_outage(carry, change, now);
648
+ return {
649
+ failures: next_failures(carry, change),
650
+ outages: outage.outages,
651
+ last_outage_at: outage.last_outage_at
652
+ };
653
+ }
654
+ var run_carry_streak = { next_state };
655
+
656
+ // scripts/run/carry/run-carry-change.ts
657
+ var NO_INCREMENT2 = 0;
658
+ function next_done(carry, done) {
659
+ if (done === void 0) return carry.done;
660
+ const current = carry.done ?? [];
661
+ return current.includes(done) ? current : [...current, done];
662
+ }
663
+ function next_merged_issues(carry, issue2) {
664
+ if (issue2 === void 0) return carry.merged_issues;
665
+ const current = carry.merged_issues ?? [];
666
+ return current.includes(issue2) ? current : [...current, issue2];
667
+ }
668
+ function is_duplicate_merge(carry, change) {
669
+ const issue2 = change.merged_issue;
670
+ return issue2 !== void 0 && carry.merged_issues?.includes(issue2) === true;
671
+ }
672
+ function has_other_change(change) {
673
+ const amounts = [change.filed, change.cuts, change.failures, change.outages];
674
+ const has_amount = amounts.some((amount) => (amount ?? NO_INCREMENT2) > NO_INCREMENT2);
675
+ return has_amount || change.done !== void 0 || change.retrospective === true;
676
+ }
677
+ function effective_change(carry, change) {
678
+ if (!is_duplicate_merge(carry, change)) return change;
679
+ return has_other_change(change) ? { ...change, merged: NO_INCREMENT2 } : void 0;
680
+ }
681
+ function next_counts(carry, change) {
682
+ const cuts = change.cuts ?? NO_INCREMENT2;
683
+ return {
684
+ merged: carry.merged + (change.merged ?? NO_INCREMENT2),
685
+ filed: carry.filed + (change.filed ?? NO_INCREMENT2),
686
+ cuts: carry.cuts + cuts,
687
+ is_handed_off: cuts > NO_INCREMENT2
688
+ };
689
+ }
690
+ function apply_change(target2, carry, change, now = /* @__PURE__ */ new Date()) {
691
+ const effective = effective_change(carry, change);
692
+ if (effective === void 0) return carry;
693
+ const streak = run_carry_streak.next_state(carry, effective, now);
694
+ const next = {
695
+ ...carry,
696
+ ...next_counts(carry, effective),
697
+ merged_issues: next_merged_issues(carry, effective.merged_issue),
698
+ failures: streak.failures,
699
+ outages: streak.outages,
700
+ last_outage_at: streak.last_outage_at,
701
+ done: next_done(carry, effective.done),
702
+ retrospective: effective.retrospective === true || carry.retrospective
703
+ };
704
+ stamp_file.replace_stamp(target2, next);
705
+ return next;
706
+ }
707
+ var run_carry_change = { apply_change };
708
+
709
+ // scripts/run/carry/run-carry-conversation.ts
710
+ import { existsSync, statSync as statSync2 } from "node:fs";
711
+ import path6 from "node:path";
712
+
713
+ // scripts/cost-runtime/cost-transcript.ts
714
+ import { readdirSync as readdirSync2, readFileSync as readFileSync3, statSync } from "node:fs";
715
+ import { homedir } from "node:os";
716
+ import path5 from "node:path";
717
+
718
+ // scripts/lane/lane-paths.ts
719
+ import path4 from "node:path";
720
+ var LANE_ROOT_KEY = "JOSH_LANE_ROOT";
721
+ var LANE_DIRECTORY_SUFFIX = "-lanes";
722
+ var LANE_BRANCH_SUFFIX = "-lane";
723
+ function default_lane_root(repository_root) {
724
+ const name = path4.basename(repository_root);
725
+ return path4.join(path4.dirname(repository_root), `.${name}${LANE_DIRECTORY_SUFFIX}`);
726
+ }
727
+ function lane_root(repository_root, environment = process.env) {
728
+ const configured = environment[LANE_ROOT_KEY]?.trim() ?? "";
729
+ return configured.length === 0 ? default_lane_root(repository_root) : path4.resolve(configured);
730
+ }
731
+ function lane_directory(root2, issue2) {
732
+ return path4.join(root2, issue2);
733
+ }
734
+ var DEFAULT_LANE_ROOT_PATTERN = new RegExp(String.raw`^\..+${LANE_DIRECTORY_SUFFIX}$`, "u");
735
+ function is_lane_root(directory, environment) {
736
+ const configured = environment[LANE_ROOT_KEY]?.trim() ?? "";
737
+ if (configured.length > 0) return path4.resolve(configured) === directory;
738
+ return DEFAULT_LANE_ROOT_PATTERN.test(path4.basename(directory));
739
+ }
740
+ var CLAUDE_WORKTREES_PATTERN = /[/\\]\.claude[/\\]worktrees[/\\][^/\\]+(?:[/\\].*)?$/u;
741
+ function checkout_of(directory) {
742
+ return directory.replace(CLAUDE_WORKTREES_PATTERN, "");
743
+ }
744
+ function lane_issue_of(directory, environment = process.env) {
745
+ const resolved = checkout_of(path4.resolve(directory));
746
+ const issue2 = path4.basename(resolved);
747
+ if (!issue_number_shape.ISSUE_NUMBER_PATTERN.test(issue2)) return void 0;
748
+ return is_lane_root(path4.dirname(resolved), environment) ? issue2 : void 0;
749
+ }
750
+ function issue_here(directory = process.cwd(), environment = process.env) {
751
+ const lane = lane_issue_of(directory, environment);
752
+ return lane === void 0 ? void 0 : Number(lane);
753
+ }
754
+ function lane_branch(issue2) {
755
+ return `${issue2}${LANE_BRANCH_SUFFIX}`;
756
+ }
757
+ var SEAT_LOCK_DIR = ".seat-locks";
758
+ function is_lane_entry(name) {
759
+ return issue_number_shape.ISSUE_NUMBER_PATTERN.test(name) || DEFAULT_LANE_ROOT_PATTERN.test(name);
760
+ }
761
+ var lane_paths = {
762
+ LANE_BRANCH_SUFFIX,
763
+ LANE_ROOT_KEY,
764
+ SEAT_LOCK_DIR,
765
+ checkout_of,
766
+ default_lane_root,
767
+ is_lane_entry,
768
+ issue_here,
769
+ lane_branch,
770
+ lane_directory,
771
+ lane_issue_of,
772
+ lane_root
773
+ };
774
+
775
+ // scripts/lib/read-file.ts
776
+ import { readFileSync as readFileSync2 } from "node:fs";
777
+ var ABSENT_CODE = "ENOENT";
778
+ function is_absent(error) {
779
+ return error instanceof Error && "code" in error && error.code === ABSENT_CODE;
780
+ }
781
+ function read_optional(path12) {
782
+ try {
783
+ return readFileSync2(path12, "utf8");
784
+ } catch (error) {
785
+ if (is_absent(error)) return void 0;
786
+ throw error;
787
+ }
788
+ }
789
+ function read_file_or_empty(path12) {
790
+ return read_optional(path12) ?? "";
791
+ }
792
+ function read_if_readable(path12) {
793
+ try {
794
+ return readFileSync2(path12, "utf8");
795
+ } catch {
796
+ return void 0;
797
+ }
798
+ }
799
+ var file_reader = { is_absent, read_optional, read_file_or_empty, read_if_readable };
800
+
801
+ // scripts/time-runtime/time-instant.ts
802
+ function parse_instant(raw) {
803
+ if (raw === null || raw === void 0) return void 0;
804
+ const parsed = Date.parse(raw);
805
+ return Number.isNaN(parsed) ? void 0 : parsed;
806
+ }
807
+ var time_instant = { parse_instant };
808
+
809
+ // scripts/cost-runtime/cost-usage.ts
810
+ import { z } from "zod";
811
+ var CACHE_CREATION_SCHEMA = z.object({
812
+ ephemeral_1h_input_tokens: z.number().nullish(),
813
+ ephemeral_5m_input_tokens: z.number().nullish()
814
+ });
815
+ var USAGE_SCHEMA = z.object({
816
+ input_tokens: z.number(),
817
+ cache_creation_input_tokens: z.number().nullish(),
818
+ cache_read_input_tokens: z.number().nullish(),
819
+ output_tokens: z.number(),
820
+ output_tokens_details: z.object({ thinking_tokens: z.number().nullish() }).nullish(),
821
+ cache_creation: CACHE_CREATION_SCHEMA.nullish()
822
+ });
823
+ var MESSAGE_SCHEMA = z.object({
824
+ id: z.string().nullish(),
825
+ model: z.string().nullish(),
826
+ usage: USAGE_SCHEMA.nullish()
827
+ });
828
+ var LINE_SCHEMA = z.object({
829
+ type: z.string(),
830
+ requestId: z.string().nullish(),
831
+ uuid: z.string().nullish(),
832
+ gitBranch: z.string().nullish(),
833
+ timestamp: z.string().nullish(),
834
+ message: MESSAGE_SCHEMA.nullish()
835
+ });
836
+ var SYNTHETIC_MODEL = "<synthetic>";
837
+ var EMPTY_TOTALS = {
838
+ input_tokens: 0,
839
+ cache_write_5m_tokens: 0,
840
+ cache_write_1h_tokens: 0,
841
+ cache_read_tokens: 0,
842
+ output_tokens: 0,
843
+ thinking_tokens: 0,
844
+ thinking_measured: false
845
+ };
846
+ var UNKNOWN_MODEL = "unknown";
847
+ var UNKNOWN_BRANCH = "";
848
+ function split_cache_write(usage) {
849
+ const total = usage.cache_creation_input_tokens ?? 0;
850
+ const detail = usage.cache_creation;
851
+ if (!detail) return { write_5m: total, write_1h: 0 };
852
+ const write_1h = detail.ephemeral_1h_input_tokens ?? 0;
853
+ return { write_5m: detail.ephemeral_5m_input_tokens ?? total - write_1h, write_1h };
854
+ }
855
+ function thinking_usage(usage) {
856
+ const raw = usage.output_tokens_details?.thinking_tokens;
857
+ return { tokens: raw ?? 0, measured: raw !== null && raw !== void 0 };
858
+ }
859
+ function to_totals(usage) {
860
+ const { write_5m, write_1h } = split_cache_write(usage);
861
+ const thinking = thinking_usage(usage);
862
+ return {
863
+ input_tokens: usage.input_tokens,
864
+ cache_write_5m_tokens: write_5m,
865
+ cache_write_1h_tokens: write_1h,
866
+ cache_read_tokens: usage.cache_read_input_tokens ?? 0,
867
+ output_tokens: usage.output_tokens,
868
+ thinking_tokens: thinking.tokens,
869
+ thinking_measured: thinking.measured
870
+ };
871
+ }
872
+ function declared_id(data) {
873
+ return data.requestId ?? data.message?.id ?? data.uuid ?? void 0;
874
+ }
875
+ function request_id_of(data, usage) {
876
+ const fallback = `${data.timestamp ?? ""}-${String(usage.output_tokens)}`;
877
+ return declared_id(data) ?? fallback;
878
+ }
879
+ function to_record(data, usage) {
880
+ return {
881
+ request_id: request_id_of(data, usage),
882
+ model: data.message?.model ?? UNKNOWN_MODEL,
883
+ branch: data.gitBranch ?? UNKNOWN_BRANCH,
884
+ at_ms: time_instant.parse_instant(data.timestamp),
885
+ totals: to_totals(usage)
886
+ };
887
+ }
888
+ var ASSISTANT_TYPE = "assistant";
889
+ function is_priced_line(data) {
890
+ return data.type === ASSISTANT_TYPE && data.message?.model !== SYNTHETIC_MODEL;
891
+ }
892
+ function classify(data) {
893
+ if (!is_priced_line(data)) return { kind: "skipped" };
894
+ const usage = data.message?.usage;
895
+ return usage ? { kind: "record", record: to_record(data, usage) } : { kind: "no_usage" };
896
+ }
897
+ function parse_line(line) {
898
+ if (line.trim() === "") return { kind: "skipped" };
899
+ const parsed = LINE_SCHEMA.safeParse(json_value.parse_or_undefined(line));
900
+ return parsed.success ? classify(parsed.data) : { kind: "malformed" };
901
+ }
902
+ function later_instant(left, right) {
903
+ if (left === void 0) return right;
904
+ if (right === void 0) return left;
905
+ return Math.max(left, right);
906
+ }
907
+ function dedupe(records) {
908
+ const by_id = /* @__PURE__ */ new Map();
909
+ for (const record2 of records) {
910
+ const seen = by_id.get(record2.request_id);
911
+ const at_ms = later_instant(seen?.at_ms, record2.at_ms);
912
+ by_id.set(record2.request_id, { ...seen ?? record2, at_ms });
913
+ }
914
+ return [...by_id.values()];
915
+ }
916
+ function add_totals(left, right) {
917
+ return {
918
+ input_tokens: left.input_tokens + right.input_tokens,
919
+ cache_write_5m_tokens: left.cache_write_5m_tokens + right.cache_write_5m_tokens,
920
+ cache_write_1h_tokens: left.cache_write_1h_tokens + right.cache_write_1h_tokens,
921
+ cache_read_tokens: left.cache_read_tokens + right.cache_read_tokens,
922
+ output_tokens: left.output_tokens + right.output_tokens,
923
+ thinking_tokens: left.thinking_tokens + right.thinking_tokens,
924
+ thinking_measured: left.thinking_measured || right.thinking_measured
925
+ };
926
+ }
927
+ function sum_totals(records) {
928
+ let total = EMPTY_TOTALS;
929
+ for (const record2 of records) total = add_totals(total, record2.totals);
930
+ return total;
931
+ }
932
+ function billed_input(totals) {
933
+ return totals.input_tokens + totals.cache_write_5m_tokens + totals.cache_write_1h_tokens + totals.cache_read_tokens;
934
+ }
935
+ var cost_usage = {
936
+ EMPTY_TOTALS,
937
+ UNKNOWN_MODEL,
938
+ SYNTHETIC_MODEL,
939
+ parse_line,
940
+ dedupe,
941
+ add_totals,
942
+ sum_totals,
943
+ billed_input
944
+ };
945
+
946
+ // scripts/cost-runtime/cost-transcript.ts
947
+ var TRANSCRIPT_ROOT = path5.join(".claude", "projects");
948
+ var TRANSCRIPT_EXTENSION = ".jsonl";
949
+ var SLUG_PATTERN = /[^a-zA-Z0-9-]/gu;
950
+ var UNIT_DIRECTORY = "subagents";
951
+ var UNIT_ID_SEPARATOR = "/";
952
+ function project_slug(cwd) {
953
+ return cwd.replaceAll(SLUG_PATTERN, "-");
954
+ }
955
+ function transcript_directory(cwd, home = homedir()) {
956
+ return path5.join(home, TRANSCRIPT_ROOT, project_slug(cwd));
957
+ }
958
+ var GIT_ENTRY = ".git";
959
+ var GITDIR_PREFIX = "gitdir:";
960
+ var WORKTREE_SEGMENT = `/${GIT_ENTRY}/worktrees/`;
961
+ var NOT_FOUND2 = -1;
962
+ function linked_worktree_gitdir(cwd) {
963
+ try {
964
+ const contents = readFileSync3(path5.join(cwd, GIT_ENTRY), "utf8").trim();
965
+ return contents.startsWith(GITDIR_PREFIX) ? contents.slice(GITDIR_PREFIX.length).trim() : "";
966
+ } catch {
967
+ return "";
968
+ }
969
+ }
970
+ function session_cwd(cwd) {
971
+ const gitdir = linked_worktree_gitdir(cwd);
972
+ const absolute = gitdir === "" ? "" : path5.resolve(cwd, gitdir);
973
+ const segment = absolute.indexOf(WORKTREE_SEGMENT);
974
+ return segment === NOT_FOUND2 ? cwd : absolute.slice(0, segment);
975
+ }
976
+ function read_directory(directory) {
977
+ try {
978
+ return readdirSync2(directory);
979
+ } catch {
980
+ return [];
981
+ }
982
+ }
983
+ function lane_transcript_directories(main_cwd, home) {
984
+ const projects = path5.join(home, TRANSCRIPT_ROOT);
985
+ const prefix = `${project_slug(lane_paths.lane_root(main_cwd))}-`;
986
+ return read_directory(projects).filter(
987
+ (name) => name.startsWith(prefix) && issue_number_shape.ISSUE_NUMBER_PATTERN.test(name.slice(prefix.length))
988
+ ).map((name) => path5.join(projects, name));
989
+ }
990
+ function transcript_directories(cwd, home = homedir()) {
991
+ const own = transcript_directory(cwd, home);
992
+ const lanes = session_cwd(cwd) === cwd ? lane_transcript_directories(cwd, home) : [];
993
+ return [.../* @__PURE__ */ new Set([own, ...lanes])];
994
+ }
995
+ var OWN_DEPTH = 0;
996
+ function home_directory() {
997
+ return homedir();
998
+ }
999
+ function to_session_file(full_path, session_id, depth) {
1000
+ try {
1001
+ return {
1002
+ session_id,
1003
+ path: full_path,
1004
+ modified_ms: statSync(full_path).mtimeMs,
1005
+ is_delegated: depth > OWN_DEPTH,
1006
+ depth
1007
+ };
1008
+ } catch {
1009
+ return void 0;
1010
+ }
1011
+ }
1012
+ function is_transcript(name) {
1013
+ return name.endsWith(TRANSCRIPT_EXTENSION);
1014
+ }
1015
+ function without_extension(name) {
1016
+ return name.slice(0, -TRANSCRIPT_EXTENSION.length);
1017
+ }
1018
+ function own_files(directory, names) {
1019
+ return names.filter((name) => is_transcript(name)).map((name) => to_session_file(path5.join(directory, name), without_extension(name), OWN_DEPTH)).filter((file) => file !== void 0);
1020
+ }
1021
+ function unit_directory(directory, session_id) {
1022
+ return path5.join(directory, session_id, UNIT_DIRECTORY);
1023
+ }
1024
+ var UNIT_DEPTH = 1;
1025
+ function level_units(subagents_directory, prefix, depth) {
1026
+ return read_directory(subagents_directory).filter((name) => is_transcript(name)).map(
1027
+ (name) => to_session_file(
1028
+ path5.join(subagents_directory, name),
1029
+ `${prefix}${UNIT_ID_SEPARATOR}${without_extension(name)}`,
1030
+ depth
1031
+ )
1032
+ ).filter((file) => file !== void 0);
1033
+ }
1034
+ function collect_units(subagents_directory, prefix, depth) {
1035
+ const nested = read_directory(subagents_directory).filter((name) => !is_transcript(name)).flatMap(
1036
+ (name) => collect_units(
1037
+ unit_directory(subagents_directory, name),
1038
+ `${prefix}${UNIT_ID_SEPARATOR}${name}`,
1039
+ depth + 1
1040
+ )
1041
+ );
1042
+ return [...level_units(subagents_directory, prefix, depth), ...nested];
1043
+ }
1044
+ function unit_files(directory, session_name) {
1045
+ return collect_units(unit_directory(directory, session_name), session_name, UNIT_DEPTH);
1046
+ }
1047
+ function list_sessions(directory) {
1048
+ const names = read_directory(directory);
1049
+ const units = names.filter((name) => !is_transcript(name)).flatMap((name) => unit_files(directory, name));
1050
+ return [...own_files(directory, names), ...units].toSorted(
1051
+ (left, right) => right.modified_ms - left.modified_ms
1052
+ );
1053
+ }
1054
+ function list_sessions_across(directories) {
1055
+ const seen = /* @__PURE__ */ new Set();
1056
+ const merged = directories.flatMap((directory) => list_sessions(directory));
1057
+ const newest_first = merged.toSorted((left, right) => right.modified_ms - left.modified_ms);
1058
+ const kept = [];
1059
+ for (const file of newest_first) {
1060
+ if (seen.has(file.session_id)) continue;
1061
+ seen.add(file.session_id);
1062
+ kept.push(file);
1063
+ }
1064
+ return kept;
1065
+ }
1066
+ function owning_session_id(file) {
1067
+ const [owner] = file.session_id.split(UNIT_ID_SEPARATOR);
1068
+ return owner ?? file.session_id;
1069
+ }
1070
+ function parent_session_id(file) {
1071
+ const separator = file.session_id.lastIndexOf(UNIT_ID_SEPARATOR);
1072
+ return separator === NOT_FOUND2 ? file.session_id : file.session_id.slice(0, separator);
1073
+ }
1074
+ function latest_own_index(files) {
1075
+ const index = files.findIndex((file) => !file.is_delegated);
1076
+ return index === -1 ? 0 : index;
1077
+ }
1078
+ function empty_session() {
1079
+ return {
1080
+ records: [],
1081
+ no_usage_lines: 0,
1082
+ malformed_lines: 0,
1083
+ is_readable: false,
1084
+ baseline_tokens: 0
1085
+ };
1086
+ }
1087
+ function tally(content) {
1088
+ const outcomes = content.split("\n").map((line) => cost_usage.parse_line(line));
1089
+ const records = outcomes.flatMap(
1090
+ (outcome) => outcome.kind === "record" ? [outcome.record] : []
1091
+ );
1092
+ const unique = cost_usage.dedupe(records);
1093
+ const [first] = unique;
1094
+ return {
1095
+ records: unique,
1096
+ no_usage_lines: outcomes.filter((outcome) => outcome.kind === "no_usage").length,
1097
+ malformed_lines: outcomes.filter((outcome) => outcome.kind === "malformed").length,
1098
+ is_readable: true,
1099
+ baseline_tokens: first === void 0 ? 0 : cost_usage.billed_input(first.totals)
1100
+ };
1101
+ }
1102
+ function read_session(file) {
1103
+ const content = file_reader.read_if_readable(file.path);
1104
+ if (content === void 0) return { session_id: file.session_id, ...empty_session() };
1105
+ return { session_id: file.session_id, ...tally(content) };
1106
+ }
1107
+ function read_raw(file) {
1108
+ return file_reader.read_if_readable(file.path) ?? "";
1109
+ }
1110
+ function read_optional2(file) {
1111
+ return file_reader.read_if_readable(file.path);
1112
+ }
1113
+ function directory_exists(directory) {
1114
+ try {
1115
+ return statSync(directory).isDirectory();
1116
+ } catch {
1117
+ return false;
1118
+ }
1119
+ }
1120
+ function searched_directories(directories) {
1121
+ return directories.map((directory) => ({
1122
+ path: directory,
1123
+ exists: directory_exists(directory)
1124
+ }));
1125
+ }
1126
+ function describe_searched(directory) {
1127
+ return ` ${directory.path} \u2014 ${directory.exists ? "no transcripts here" : "no such directory"}`;
1128
+ }
1129
+ function missing_message(searched, session_id) {
1130
+ const lead = session_id === void 0 ? "No transcripts found. Searched:" : `No transcript named ${session_id}. Searched:`;
1131
+ const listed = searched.map((directory) => describe_searched(directory));
1132
+ if (session_id !== void 0) return [lead, ...listed];
1133
+ return [
1134
+ lead,
1135
+ ...listed,
1136
+ "Claude Code writes them per project; run this from the project it ran in."
1137
+ ];
1138
+ }
1139
+ var cost_transcript = {
1140
+ TRANSCRIPT_EXTENSION,
1141
+ TRANSCRIPT_ROOT,
1142
+ UNIT_DIRECTORY,
1143
+ project_slug,
1144
+ transcript_directory,
1145
+ transcript_directories,
1146
+ session_cwd,
1147
+ lane_transcript_directories,
1148
+ unit_directory,
1149
+ list_sessions,
1150
+ list_sessions_across,
1151
+ searched_directories,
1152
+ owning_session_id,
1153
+ parent_session_id,
1154
+ latest_own_index,
1155
+ tally,
1156
+ read_session,
1157
+ read_raw,
1158
+ read_optional: read_optional2,
1159
+ missing_message,
1160
+ home_directory
1161
+ };
1162
+
1163
+ // scripts/josh/agent-session-environment.ts
1164
+ var SESSION_ID_KEY = "CLAUDE_CODE_SESSION_ID";
1165
+ var AGENT_PID_KEY = "CLAUDE_PID";
1166
+ var PARENT_SESSION_KEYS = [
1167
+ "CLAUDE_CODE_MESSAGING_SOCKET",
1168
+ "CLAUDE_CODE_MESSAGING_TOKEN",
1169
+ SESSION_ID_KEY,
1170
+ "CLAUDE_CODE_CHILD_SESSION"
1171
+ ];
1172
+ var PROXY_KEYS = [
1173
+ "ALL_PROXY",
1174
+ "HTTP_PROXY",
1175
+ "HTTPS_PROXY",
1176
+ "all_proxy",
1177
+ "http_proxy",
1178
+ "https_proxy",
1179
+ "GLOBAL_AGENT_HTTP_PROXY",
1180
+ "GLOBAL_AGENT_HTTPS_PROXY"
1181
+ ];
1182
+ var PROXY_CERTIFICATE_KEY = "NODE_EXTRA_CA_CERTS";
1183
+ var LOOPBACK_HOSTS = ["localhost", "ip6-localhost", "[::1]"];
1184
+ var LOOPBACK_PREFIX = "127.";
1185
+ var NO_HOST = "";
1186
+ function parsed_host(value) {
1187
+ try {
1188
+ return new URL(value).hostname;
1189
+ } catch {
1190
+ return NO_HOST;
1191
+ }
1192
+ }
1193
+ function proxy_host(value) {
1194
+ const direct = parsed_host(value);
1195
+ return direct === NO_HOST ? parsed_host(`http://${value}`) : direct;
1196
+ }
1197
+ function is_loopback_host(host) {
1198
+ return host.startsWith(LOOPBACK_PREFIX) || LOOPBACK_HOSTS.includes(host);
1199
+ }
1200
+ function is_loopback_proxy(value) {
1201
+ if (value === void 0 || value === NO_HOST) return false;
1202
+ return is_loopback_host(proxy_host(value));
1203
+ }
1204
+ function is_declared(value) {
1205
+ return value !== void 0 && value !== NO_HOST;
1206
+ }
1207
+ function loopback_proxy_keys(source, is_removed = is_loopback_proxy) {
1208
+ const declared = PROXY_KEYS.filter((key) => is_declared(source[key]));
1209
+ const matched = declared.filter((key) => is_removed(source[key]));
1210
+ const is_certificate_included = matched.length > 0 && matched.length === declared.length;
1211
+ return is_certificate_included ? [...matched, PROXY_CERTIFICATE_KEY] : matched;
1212
+ }
1213
+ function to_removed(keys) {
1214
+ return Object.fromEntries(keys.map((key) => [key, void 0]));
1215
+ }
1216
+ function removed_environment(source = process.env) {
1217
+ return to_removed([...PARENT_SESSION_KEYS, ...loopback_proxy_keys(source)]);
1218
+ }
1219
+ var SCANNER_DIRECTORY = ".safe-chain";
1220
+ var PATH_SEPARATOR = /[/\\]/u;
1221
+ function is_scanner_certificate(value) {
1222
+ return value?.split(PATH_SEPARATOR).includes(SCANNER_DIRECTORY) ?? false;
1223
+ }
1224
+ var SCANNER_PROXY_KEY = "HTTPS_PROXY";
1225
+ function is_scanner_proxy(source) {
1226
+ const scanner_proxy = source[SCANNER_PROXY_KEY];
1227
+ return function is_match(value) {
1228
+ return value === scanner_proxy && is_loopback_proxy(value);
1229
+ };
1230
+ }
1231
+ function removed_proxy_environment(source = process.env) {
1232
+ if (!is_scanner_certificate(source[PROXY_CERTIFICATE_KEY])) return {};
1233
+ return to_removed(loopback_proxy_keys(source, is_scanner_proxy(source)));
1234
+ }
1235
+ var agent_session_environment = {
1236
+ AGENT_PID_KEY,
1237
+ LOOPBACK_HOSTS,
1238
+ PARENT_SESSION_KEYS,
1239
+ PROXY_CERTIFICATE_KEY,
1240
+ PROXY_KEYS,
1241
+ SESSION_ID_KEY,
1242
+ removed_environment,
1243
+ removed_proxy_environment
1244
+ };
1245
+
1246
+ // scripts/cost-runtime/own-session.ts
1247
+ var NOT_FOUND3 = -1;
1248
+ function session_id_of(environment) {
1249
+ const value = environment[agent_session_environment.SESSION_ID_KEY];
1250
+ return value === void 0 || value === "" ? void 0 : value;
1251
+ }
1252
+ function select_own_session(files, environment) {
1253
+ const session_id = session_id_of(environment);
1254
+ if (session_id === void 0) {
1255
+ return { kind: "own", index: cost_transcript.latest_own_index(files) };
1256
+ }
1257
+ const index = files.findIndex((file) => file.session_id === session_id);
1258
+ return index === NOT_FOUND3 ? { kind: "absent", session_id } : { kind: "own", index };
1259
+ }
1260
+ var own_session = {
1261
+ session_id_of,
1262
+ select_own_session
1263
+ };
1264
+
1265
+ // scripts/run/carry/run-carry-conversation.ts
1266
+ var CONVERSATION_QUIET_MS = 6e5;
1267
+ function own_transcript(environment = process.env, directories = cost_transcript.transcript_directories(process.cwd())) {
1268
+ const session_id = own_session.session_id_of(environment);
1269
+ if (session_id === void 0) return void 0;
1270
+ const name = `${session_id}${cost_transcript.TRANSCRIPT_EXTENSION}`;
1271
+ return directories.map((directory) => path6.join(directory, name)).find((file) => existsSync(file));
1272
+ }
1273
+ function modified_ms(transcript) {
1274
+ try {
1275
+ return statSync2(transcript).mtimeMs;
1276
+ } catch {
1277
+ return void 0;
1278
+ }
1279
+ }
1280
+ function is_recent(modified, now) {
1281
+ return modified !== void 0 && now.getTime() - modified <= CONVERSATION_QUIET_MS;
1282
+ }
1283
+ function is_conversation_live(carry, now = /* @__PURE__ */ new Date(), read_modified = modified_ms) {
1284
+ if (carry.is_handed_off === true || carry.owner_transcript === void 0) return false;
1285
+ return is_recent(read_modified(carry.owner_transcript), now);
1286
+ }
1287
+ function is_same_conversation(carry, owner) {
1288
+ return owner.transcript !== void 0 && owner.transcript === carry.owner_transcript;
1289
+ }
1290
+ function reclaim_owner(carry, owner) {
1291
+ if (carry.is_handed_off === true || !is_same_conversation(carry, owner) || owner.pid === carry.owner_pid) {
1292
+ return carry;
1293
+ }
1294
+ return { ...carry, owner_pid: owner.pid, owner_start: owner.start };
1295
+ }
1296
+ var run_carry_conversation = {
1297
+ CONVERSATION_QUIET_MS,
1298
+ own_transcript,
1299
+ is_conversation_live,
1300
+ is_same_conversation,
1301
+ reclaim_owner
1302
+ };
1303
+
1304
+ // scripts/run/carry/run-carry.ts
1305
+ var CARRY_PREFIX = durable_state.PREFIX.CARRY;
1306
+ var REPOSITORY_DIRECTORY_INDEX = 1;
1307
+ var NO_INCREMENT3 = 0;
1308
+ var MAX_CUTS = 6;
1309
+ var END_COMMAND = "pnpm josh run:carry --end";
1310
+ var RESUME_COMMAND = "pnpm josh run:carry --resume";
1311
+ var READ_COMMAND = "pnpm josh run:carry --json";
1312
+ var OWNER_ARGUMENT = '--owner "$PPID"';
1313
+ var NO_OWNER = {};
1314
+ var carry_addition_schema = z2.object({ issue: z2.number(), is_priority: z2.boolean() });
1315
+ var run_carry_schema = z2.object({
1316
+ invocation: z2.string(),
1317
+ started_at: z2.string(),
1318
+ merged: z2.number(),
1319
+ merged_issues: z2.array(z2.number()).optional(),
1320
+ filed: z2.number(),
1321
+ cuts: z2.number(),
1322
+ // Defaulted, so a record that lacks the streak parses with a zero streak rather than failing to read.
1323
+ failures: z2.number().default(0),
1324
+ outages: z2.number().default(0),
1325
+ last_outage_at: z2.string().optional(),
1326
+ // An absent owner reads as "no owner declared", which is the not-provably-live answer rather than a
1327
+ // live one.
1328
+ owner_pid: z2.number().optional(),
1329
+ owner_start: z2.string().optional(),
1330
+ owner_transcript: z2.string().optional(),
1331
+ is_owner_headless: z2.boolean().optional(),
1332
+ is_handed_off: z2.boolean().optional(),
1333
+ done: z2.array(z2.number()).optional(),
1334
+ retrospective: z2.boolean().optional(),
1335
+ added: z2.array(carry_addition_schema).optional(),
1336
+ lane_limit: z2.number().int().positive().optional()
1337
+ });
1338
+ function carry_path(git_directory) {
1339
+ return durable_state.path(CARRY_PREFIX, git_directory);
1340
+ }
1341
+ async function repository_directory() {
1342
+ const directories = await git_command.git_directories();
1343
+ return directories[REPOSITORY_DIRECTORY_INDEX];
1344
+ }
1345
+ function parse_carry(raw) {
1346
+ return json_value.parse_with(raw, run_carry_schema);
1347
+ }
1348
+ function classify2(raw) {
1349
+ if (raw === void 0) return { kind: "none" };
1350
+ const carry = parse_carry(raw);
1351
+ if (carry === void 0 || Number.isNaN(Date.parse(carry.started_at))) {
1352
+ return { kind: "unreadable" };
1353
+ }
1354
+ return { kind: "carried", carry };
1355
+ }
1356
+ function read_carry(target2) {
1357
+ return classify2(stamp_file.read_stamp_text(target2));
1358
+ }
1359
+ function owner_of(pid, read = process_identity.read_start, transcript = run_carry_conversation.own_transcript()) {
1360
+ return { pid, start: read(pid), transcript };
1361
+ }
1362
+ function fresh_carry(invocation, owner, now) {
1363
+ return {
1364
+ invocation,
1365
+ started_at: now.toISOString(),
1366
+ merged: NO_INCREMENT3,
1367
+ filed: NO_INCREMENT3,
1368
+ cuts: NO_INCREMENT3,
1369
+ failures: NO_INCREMENT3,
1370
+ outages: NO_INCREMENT3,
1371
+ owner_pid: owner.pid,
1372
+ owner_start: owner.start,
1373
+ owner_transcript: owner.transcript,
1374
+ is_owner_headless: owner.is_headless
1375
+ };
1376
+ }
1377
+ function begin_carry(target2, invocation, owner = NO_OWNER, now = /* @__PURE__ */ new Date()) {
1378
+ const carry = fresh_carry(invocation, owner, now);
1379
+ return stamp_file.create_stamp(target2, carry) ? carry : void 0;
1380
+ }
1381
+ function adopt_carry(target2, carry, owner = NO_OWNER) {
1382
+ const next = {
1383
+ ...carry,
1384
+ owner_pid: owner.pid,
1385
+ owner_start: owner.start,
1386
+ owner_transcript: owner.transcript,
1387
+ is_owner_headless: owner.is_headless,
1388
+ is_handed_off: false
1389
+ };
1390
+ stamp_file.remove_stamp(target2);
1391
+ return stamp_file.create_stamp(target2, next) ? next : void 0;
1392
+ }
1393
+ function is_owner_live(carry, now = /* @__PURE__ */ new Date(), same_process = process_identity.is_same_process) {
1394
+ if (same_process(carry.owner_pid, carry.owner_start) !== false) return true;
1395
+ return carry.is_owner_headless !== true && run_carry_conversation.is_conversation_live(carry, now);
1396
+ }
1397
+ function is_owned_by(carry, owner) {
1398
+ if (run_carry_conversation.is_same_conversation(carry, owner)) return true;
1399
+ return carry.owner_pid === owner.pid && carry.owner_start === owner.start;
1400
+ }
1401
+ function is_foreign_live_owner(carry, owner) {
1402
+ return is_owner_live(carry) && !is_owned_by(carry, owner);
1403
+ }
1404
+ function is_held_by_another(carry, is_live = is_owner_live) {
1405
+ const caller = owner_of(process.pid);
1406
+ const is_own = carry.owner_pid === caller.pid && carry.owner_start === caller.start;
1407
+ return !is_own && is_live(carry);
1408
+ }
1409
+ function is_handed_off_to(carry, invocation) {
1410
+ return carry.is_handed_off === true && carry.invocation === invocation;
1411
+ }
1412
+ function classify_claim(carry, request) {
1413
+ if (is_handed_off_to(carry, request.invocation)) return "resume";
1414
+ if (is_foreign_live_owner(carry, request.owner)) return "busy";
1415
+ if (carry.invocation !== request.invocation) return "mismatch";
1416
+ return request.is_adoption ? "resume" : "standing";
1417
+ }
1418
+ function is_count_refused(carry, owner) {
1419
+ return carry.is_handed_off === true || is_foreign_live_owner(carry, owner);
1420
+ }
1421
+ function is_at_cut_cap(carry) {
1422
+ return carry.cuts >= MAX_CUTS;
1423
+ }
1424
+ function end_carry(target2) {
1425
+ stamp_file.remove_stamp(target2);
1426
+ }
1427
+ function retrospective_done_of(read) {
1428
+ return read.kind === "carried" && read.carry.retrospective === true;
1429
+ }
1430
+ function remaining_of(carry) {
1431
+ if (carry === void 0) return void 0;
1432
+ const declared = run_invocation.issue_numbers(carry.invocation);
1433
+ if (declared === void 0) return void 0;
1434
+ const done = carry.done ?? [];
1435
+ return run_carry_added.ordered(declared, carry.added).filter((issue2) => !done.includes(issue2));
1436
+ }
1437
+ function done_note(carry) {
1438
+ const done = carry.done ?? [];
1439
+ return done.length === 0 ? "" : `, issues ${done.join(", ")} done`;
1440
+ }
1441
+ function describe_carry(carry) {
1442
+ return `${carry.invocation} started ${carry.started_at}; ${String(carry.merged)} merged, ${String(carry.filed)} filed, ${String(carry.failures)} failed in a row, ${String(carry.outages)} outage(s) in a row, ${String(carry.cuts)} cut(s) crossed${done_note(carry)}`;
1443
+ }
1444
+ function mismatch_message(carry, invocation) {
1445
+ return `A different invocation is carried here \u2014 ${describe_carry(carry)}. This one is \`${invocation}\`. End the standing record with \`${END_COMMAND}\` once you know its run is over, then begin again.`;
1446
+ }
1447
+ function busy_message(carry) {
1448
+ return `A live run holds this budget \u2014 ${describe_carry(carry)}, owner pid ${String(carry.owner_pid)} still running. Nothing was established. Wait for that run, or end its record with \`${END_COMMAND}\` once you know it is over.`;
1449
+ }
1450
+ function claim_command(invocation) {
1451
+ return `${RESUME_COMMAND} "${invocation}" ${OWNER_ARGUMENT}`;
1452
+ }
1453
+ function standing_message(carry) {
1454
+ return `A run record is standing here that no cut handed off \u2014 ${describe_carry(carry)}. Nothing was established. Carry that budget with \`${claim_command(carry.invocation)}\`, or discard it with \`${END_COMMAND}\` and begin again.`;
1455
+ }
1456
+ function count_refused_message(carry) {
1457
+ if (carry.is_handed_off === true) {
1458
+ return `This budget was handed off at a cut and is waiting for its successor \u2014 ${describe_carry(carry)}. Nothing was counted; the cutting session must not advance a handed-off budget.`;
1459
+ }
1460
+ return `A live run owns this budget \u2014 ${describe_carry(carry)}, owner pid ${String(carry.owner_pid)} still running. Nothing was counted; only its owner advances the budget.`;
1461
+ }
1462
+ function lost_message() {
1463
+ return `Another process established a run record here first, so nothing was established. Read it with \`${READ_COMMAND}\`.`;
1464
+ }
1465
+ function nothing_to_resume_message() {
1466
+ return `Nothing is carried here, so there is no budget to resume. Begin one with \`pnpm josh run:carry --begin "<invocation>"\`.`;
1467
+ }
1468
+ function unreadable_message() {
1469
+ return `A run record is here but could not be read; clear it with \`${END_COMMAND}\` once you know no run is using it.`;
1470
+ }
1471
+ function unknown_message() {
1472
+ return "This repository\u2019s git directory could not be read, so no run record was established.";
1473
+ }
1474
+ var run_carry = {
1475
+ END_COMMAND,
1476
+ MAX_CUTS,
1477
+ NO_OWNER,
1478
+ RESUME_COMMAND,
1479
+ adopt_carry,
1480
+ apply_change: run_carry_change.apply_change,
1481
+ begin_carry,
1482
+ busy_message,
1483
+ carry_path,
1484
+ claim_command,
1485
+ classify: classify2,
1486
+ classify_claim,
1487
+ count_refused_message,
1488
+ is_at_cut_cap,
1489
+ describe_carry,
1490
+ end_carry,
1491
+ mismatch_message,
1492
+ fresh_carry,
1493
+ is_count_refused,
1494
+ is_foreign_live_owner,
1495
+ is_held_by_another,
1496
+ is_owner_live,
1497
+ lost_message,
1498
+ nothing_to_resume_message,
1499
+ owner_of,
1500
+ parse_carry,
1501
+ read_carry,
1502
+ remaining_of,
1503
+ repository_directory,
1504
+ retrospective_done_of,
1505
+ standing_message,
1506
+ unknown_message,
1507
+ unreadable_message
1508
+ };
1509
+
1510
+ // scripts/lane/lane-ledger-write.ts
1511
+ import { closeSync, constants as constants2, openSync, writeSync } from "node:fs";
1512
+
1513
+ // scripts/lane/lane-ledger-schema.ts
1514
+ import { z as z4 } from "zod";
1515
+
1516
+ // scripts/lane/lane-ledger-kind.ts
1517
+ var KIND = {
1518
+ MERGE: "merge",
1519
+ GATE: "gate",
1520
+ LOAD: "load",
1521
+ DISPATCH: "dispatch",
1522
+ STAGE: "stage",
1523
+ STOP: "stop",
1524
+ OVERLAP: "overlap",
1525
+ HELD: "held",
1526
+ RELEASED: "released",
1527
+ ROUND_ONE: "round-one",
1528
+ ROUND_TWO: "round-two",
1529
+ OFFERABLE: "offerable",
1530
+ CORE_WAIT: "core-wait",
1531
+ UNIT_FILES: "unit-files",
1532
+ TEST_RELATED: "test-related",
1533
+ TEST_PINNED: "test-pinned",
1534
+ SPLIT_NOTICE: "split-notice",
1535
+ SPLIT_FILED: "split-filed",
1536
+ UNPLANNED_NOTICE: "unplanned-notice",
1537
+ LANE_STATE: "lane-state",
1538
+ PUSH_MISS: "push-miss",
1539
+ SHIP_LAP: "ship-lap"
1540
+ };
1541
+ var lane_ledger_kind = { KIND };
1542
+
1543
+ // scripts/lane/lane-ledger-schema-ship.ts
1544
+ import { z as z3 } from "zod";
1545
+ var { KIND: KIND2 } = lane_ledger_kind;
1546
+ var stop_schema = z3.object({
1547
+ kind: z3.literal(KIND2.STOP),
1548
+ at: z3.string(),
1549
+ issue: z3.number(),
1550
+ reason: z3.string(),
1551
+ cause: z3.string().optional(),
1552
+ preconditions: z3.array(z3.string()).optional(),
1553
+ findings: z3.array(z3.string()).optional()
1554
+ });
1555
+ var unplanned_notice_schema = z3.object({
1556
+ kind: z3.literal(KIND2.UNPLANNED_NOTICE),
1557
+ at: z3.string(),
1558
+ issue: z3.number(),
1559
+ files: z3.array(z3.string())
1560
+ });
1561
+ var ship_lap_schema = z3.object({
1562
+ kind: z3.literal(KIND2.SHIP_LAP),
1563
+ at: z3.string(),
1564
+ issue: z3.number(),
1565
+ stage: z3.string(),
1566
+ step: z3.string(),
1567
+ elapsed_ms: z3.number()
1568
+ });
1569
+ var lane_ledger_schema_ship = { ship_lap_schema, stop_schema, unplanned_notice_schema };
1570
+
1571
+ // scripts/lane/lane-ledger-schema.ts
1572
+ var { KIND: KIND3 } = lane_ledger_kind;
1573
+ var { ship_lap_schema: ship_lap_schema2, stop_schema: stop_schema2, unplanned_notice_schema: unplanned_notice_schema2 } = lane_ledger_schema_ship;
1574
+ var merge_schema = z4.object({ kind: z4.literal(KIND3.MERGE), at: z4.string(), issue: z4.number() });
1575
+ var check_schema = z4.object({
1576
+ label: z4.string(),
1577
+ elapsed_ms: z4.number(),
1578
+ is_passed: z4.boolean(),
1579
+ is_reused: z4.boolean().optional(),
1580
+ // The CPU milliseconds the check's process tree spent, so a core weight can be re-measured from
1581
+ // the ledger (joshuafolkken/kit#4362). Absent where the gate could not read it (off macOS).
1582
+ cpu_ms: z4.number().optional(),
1583
+ // Why the unit leg ran the whole suite instead of the related tests — a stable kind, never the
1584
+ // file it names (joshuafolkken/kit#4397). Absent when it narrowed, and on every other check.
1585
+ fallback: z4.string().optional(),
1586
+ // The unit leg's since-green no-op: nothing moved, so it ran no test (joshuafolkken/kit#4457).
1587
+ is_unmoved: z4.boolean().optional(),
1588
+ // The width the check asked the core budget for, the width it ran at and how long it waited, so a
1589
+ // unit claim's wait for room is read per run (joshuafolkken/kit#4451). Absent on a check that
1590
+ // claimed none — a reused one, or one inside another gate's claim.
1591
+ claim: z4.object({ requested: z4.number(), granted: z4.number(), waited_ms: z4.number() }).optional()
1592
+ });
1593
+ var gate_schema = z4.object({
1594
+ kind: z4.literal(KIND3.GATE),
1595
+ at: z4.string(),
1596
+ elapsed_ms: z4.number(),
1597
+ is_passed: z4.boolean(),
1598
+ // The unit suite's own duration, present when this gate ran it — the one
1599
+ // record of a full vitest run `josh metrics` reads, so the suite is never timed twice.
1600
+ unit_ms: z4.number().optional(),
1601
+ // The whole cores busy outside this gate, beyond the machine's baseline, at its start or its end —
1602
+ // whichever was higher. Absent when the machine could not be read.
1603
+ external_cores: z4.number().optional(),
1604
+ // Each check's own duration and verdict, so `josh lane:stats` can name the check a slow gate waited
1605
+ // on. A reused check started no process: its row says so, and its zero is no timing.
1606
+ checks: z4.array(check_schema).optional(),
1607
+ // A gate that reused a green record for this tree and base and started no check: counted, never
1608
+ // timed (joshuafolkken/kit#4397).
1609
+ is_reused: z4.boolean().optional(),
1610
+ // The lane the gate ran in, so `josh lane:breakdown` puts its checks under the lane's ship gate;
1611
+ // absent outside a lane and on a row written before it (joshuafolkken/kit#5319).
1612
+ issue: z4.number().optional()
1613
+ });
1614
+ var process_kind_schema = z4.object({
1615
+ kind: z4.string(),
1616
+ cpu_percent: z4.number(),
1617
+ rss_mb: z4.number(),
1618
+ count: z4.number()
1619
+ });
1620
+ var load_schema = z4.object({
1621
+ kind: z4.literal(KIND3.LOAD),
1622
+ at: z4.string(),
1623
+ load: z4.number(),
1624
+ available_mb: z4.number().optional(),
1625
+ swapped_mb: z4.number().optional(),
1626
+ lanes: z4.number().optional(),
1627
+ // The heaviest process kinds at the instant of the sample (`lane-process-load.ts`), so the load the
1628
+ // core budget's ledger does not explain can be read back by what made it (joshuafolkken/kit#3874).
1629
+ processes: z4.array(process_kind_schema).optional()
1630
+ });
1631
+ var dispatch_schema = z4.object({
1632
+ kind: z4.literal(KIND3.DISPATCH),
1633
+ at: z4.string(),
1634
+ issue: z4.number()
1635
+ });
1636
+ var stage_schema = z4.object({
1637
+ kind: z4.literal(KIND3.STAGE),
1638
+ at: z4.string(),
1639
+ stage: z4.string(),
1640
+ elapsed_ms: z4.number(),
1641
+ issue: z4.number().optional(),
1642
+ last_check: z4.string().optional(),
1643
+ check_ms: z4.record(z4.string(), z4.number()).optional()
1644
+ });
1645
+ var overlap_schema = z4.object({
1646
+ kind: z4.literal(KIND3.OVERLAP),
1647
+ at: z4.string(),
1648
+ issue: z4.number(),
1649
+ lanes: z4.array(z4.number()),
1650
+ paths: z4.array(z4.string()),
1651
+ waited_ms: z4.number(),
1652
+ is_cleared: z4.boolean()
1653
+ });
1654
+ var held_schema = z4.object({
1655
+ kind: z4.literal(KIND3.HELD),
1656
+ at: z4.string(),
1657
+ reason: z4.string(),
1658
+ waiting: z4.array(z4.number()).optional()
1659
+ });
1660
+ var released_schema = z4.object({ kind: z4.literal(KIND3.RELEASED), at: z4.string() });
1661
+ var lane_state_schema = z4.object({
1662
+ kind: z4.literal(KIND3.LANE_STATE),
1663
+ at: z4.string(),
1664
+ issue: z4.number(),
1665
+ state: z4.enum(["paused", "running"])
1666
+ });
1667
+ var round_one_schema = z4.object({
1668
+ kind: z4.literal(KIND3.ROUND_ONE),
1669
+ at: z4.string(),
1670
+ issue: z4.number(),
1671
+ verdict: z4.string()
1672
+ });
1673
+ var round_two_schema = z4.object({
1674
+ kind: z4.literal(KIND3.ROUND_TWO),
1675
+ at: z4.string(),
1676
+ issue: z4.number(),
1677
+ verdict: z4.string(),
1678
+ code: z4.string()
1679
+ });
1680
+ var offerable_schema = z4.object({
1681
+ kind: z4.literal(KIND3.OFFERABLE),
1682
+ at: z4.string(),
1683
+ is_offerable: z4.boolean()
1684
+ });
1685
+ var core_wait_schema = z4.object({
1686
+ kind: z4.literal(KIND3.CORE_WAIT),
1687
+ at: z4.string(),
1688
+ command: z4.string(),
1689
+ waited_ms: z4.number(),
1690
+ issue: z4.number().optional()
1691
+ });
1692
+ var unit_file_schema = z4.object({ file: z4.string(), elapsed_ms: z4.number() });
1693
+ var unit_files_schema = z4.object({
1694
+ kind: z4.literal(KIND3.UNIT_FILES),
1695
+ at: z4.string(),
1696
+ files: z4.array(unit_file_schema)
1697
+ });
1698
+ var test_related_schema = z4.object({
1699
+ kind: z4.literal(KIND3.TEST_RELATED),
1700
+ at: z4.string(),
1701
+ scope: z4.string(),
1702
+ changed: z4.number(),
1703
+ synced: z4.number(),
1704
+ since_map: z4.number(),
1705
+ readers: z4.number(),
1706
+ test_files: z4.number().optional(),
1707
+ trigger_files: z4.array(z4.string()).optional(),
1708
+ elapsed_ms: z4.number()
1709
+ });
1710
+ var pinned_origin_schema = z4.enum(["run-review", "pre-detach", "manual"]);
1711
+ var test_pinned_probe_schema = z4.object({
1712
+ file: z4.string(),
1713
+ tests: z4.number().optional(),
1714
+ elapsed_ms: z4.number()
1715
+ });
1716
+ var test_pinned_schema = z4.object({
1717
+ kind: z4.literal(KIND3.TEST_PINNED),
1718
+ at: z4.string(),
1719
+ issue: z4.number().optional(),
1720
+ held: z4.number(),
1721
+ rewired: z4.number().optional(),
1722
+ probes: z4.array(test_pinned_probe_schema),
1723
+ elapsed_ms: z4.number(),
1724
+ origin: pinned_origin_schema.optional(),
1725
+ discarded: z4.boolean().optional()
1726
+ });
1727
+ var split_notice_schema = z4.object({
1728
+ kind: z4.literal(KIND3.SPLIT_NOTICE),
1729
+ at: z4.string(),
1730
+ issue: z4.number(),
1731
+ files: z4.number(),
1732
+ lines: z4.number()
1733
+ });
1734
+ var split_filed_schema = z4.object({
1735
+ kind: z4.literal(KIND3.SPLIT_FILED),
1736
+ at: z4.string(),
1737
+ issue: z4.number(),
1738
+ child: z4.string()
1739
+ });
1740
+ var push_miss_schema = z4.object({
1741
+ kind: z4.literal(KIND3.PUSH_MISS),
1742
+ at: z4.string(),
1743
+ scope: z4.enum(["whole", "related"]),
1744
+ reason: z4.string()
1745
+ });
1746
+ var entry_schema = z4.discriminatedUnion("kind", [
1747
+ merge_schema,
1748
+ gate_schema,
1749
+ load_schema,
1750
+ dispatch_schema,
1751
+ stage_schema,
1752
+ stop_schema2,
1753
+ overlap_schema,
1754
+ held_schema,
1755
+ released_schema,
1756
+ round_one_schema,
1757
+ round_two_schema,
1758
+ offerable_schema,
1759
+ core_wait_schema,
1760
+ unit_files_schema,
1761
+ test_related_schema,
1762
+ test_pinned_schema,
1763
+ split_notice_schema,
1764
+ split_filed_schema,
1765
+ unplanned_notice_schema2,
1766
+ lane_state_schema,
1767
+ push_miss_schema,
1768
+ ship_lap_schema2
1769
+ ]);
1770
+ var lane_ledger_schema = { KIND: KIND3, entry_schema, pinned_origin_schema };
1771
+
1772
+ // scripts/lane/lane-ledger-write.ts
1773
+ var LEDGER_PREFIX = durable_state.PREFIX.LANE_LEDGER;
1774
+ var LEDGER_SUFFIX = ".jsonl";
1775
+ var LINE_SEPARATOR = "\n";
1776
+ var CI_WAIT_STAGE = "ci-wait";
1777
+ var CODERABBIT_WAIT_STAGE = "coderabbit-wait";
1778
+ var CODERABBIT_RATE_LIMIT_STAGE = "coderabbit-rate-limit";
1779
+ var CODERABBIT_RETRIGGER_STAGE = "coderabbit-retriggered";
1780
+ var PRE_DETACH_STAGE = "pre-detach";
1781
+ var ROUND_ONE_REUSED = "reused";
1782
+ var LEDGER_FILE_MODE = 384;
1783
+ var { O_APPEND, O_CREAT, O_NOFOLLOW, O_WRONLY } = constants2;
1784
+ var APPEND_FLAGS = O_WRONLY | O_APPEND | O_CREAT | O_NOFOLLOW;
1785
+ var { KIND: KIND4 } = lane_ledger_schema;
1786
+ function target_of(repository) {
1787
+ return durable_state.path(LEDGER_PREFIX, repository, LEDGER_SUFFIX);
1788
+ }
1789
+ async function target() {
1790
+ if (process.env["VITEST"] !== void 0) return void 0;
1791
+ try {
1792
+ const repository = await run_carry.repository_directory();
1793
+ return repository === void 0 ? void 0 : target_of(repository);
1794
+ } catch {
1795
+ return void 0;
1796
+ }
1797
+ }
1798
+ function append(path12, entry) {
1799
+ const descriptor = openSync(path12, APPEND_FLAGS, LEDGER_FILE_MODE);
1800
+ try {
1801
+ if (stamp_file.is_own_regular_file(path12)) {
1802
+ writeSync(descriptor, `${JSON.stringify(entry)}${LINE_SEPARATOR}`);
1803
+ }
1804
+ } finally {
1805
+ closeSync(descriptor);
1806
+ }
1807
+ }
1808
+ async function record(entry, path12) {
1809
+ try {
1810
+ const destination = path12 ?? await target();
1811
+ if (destination !== void 0) append(destination, entry);
1812
+ } catch {
1813
+ }
1814
+ }
1815
+ function now_iso() {
1816
+ return (/* @__PURE__ */ new Date()).toISOString();
1817
+ }
1818
+ async function record_gate(path12, gate) {
1819
+ await record({ kind: KIND4.GATE, at: now_iso(), ...gate }, path12);
1820
+ }
1821
+ async function record_merge(issue2, at = /* @__PURE__ */ new Date()) {
1822
+ await record({ kind: KIND4.MERGE, at: at.toISOString(), issue: issue2 });
1823
+ }
1824
+ async function record_dispatch(issue2, path12) {
1825
+ await record({ kind: KIND4.DISPATCH, at: now_iso(), issue: issue2 }, path12);
1826
+ }
1827
+ async function record_stage(stage, path12) {
1828
+ await record({ kind: KIND4.STAGE, at: now_iso(), ...stage }, path12);
1829
+ }
1830
+ async function record_stop(stop, path12) {
1831
+ await record({ kind: KIND4.STOP, at: now_iso(), ...stop }, path12);
1832
+ }
1833
+ async function record_overlap(overlap, path12) {
1834
+ await record({ kind: KIND4.OVERLAP, at: now_iso(), ...overlap }, path12);
1835
+ }
1836
+ async function record_held(held, path12) {
1837
+ const waiting = held.waiting ?? [];
1838
+ const named = waiting.length > 0 ? { waiting: [...waiting] } : {};
1839
+ await record({ kind: KIND4.HELD, at: now_iso(), reason: held.reason, ...named }, path12);
1840
+ }
1841
+ async function record_released(path12) {
1842
+ await record({ kind: KIND4.RELEASED, at: now_iso() }, path12);
1843
+ }
1844
+ async function record_lane_state(change, path12) {
1845
+ await record({ kind: KIND4.LANE_STATE, at: now_iso(), ...change }, path12);
1846
+ }
1847
+ async function record_offerable(is_offerable, path12) {
1848
+ await record({ kind: KIND4.OFFERABLE, at: now_iso(), is_offerable }, path12);
1849
+ }
1850
+ async function record_round_one(round_one, path12) {
1851
+ await record({ kind: KIND4.ROUND_ONE, at: now_iso(), ...round_one }, path12);
1852
+ }
1853
+ async function record_round_two(round_two, path12) {
1854
+ await record({ kind: KIND4.ROUND_TWO, at: now_iso(), ...round_two }, path12);
1855
+ }
1856
+ async function record_core_wait(wait, path12) {
1857
+ await record({ kind: KIND4.CORE_WAIT, at: now_iso(), ...wait }, path12);
1858
+ }
1859
+ async function record_unit_files(files, path12) {
1860
+ await record({ kind: KIND4.UNIT_FILES, at: now_iso(), files: [...files] }, path12);
1861
+ }
1862
+ async function record_test_related(run, path12) {
1863
+ await record({ kind: KIND4.TEST_RELATED, at: now_iso(), ...run }, path12);
1864
+ }
1865
+ async function record_test_pinned(run, path12) {
1866
+ await record({ kind: KIND4.TEST_PINNED, at: now_iso(), ...run }, path12);
1867
+ }
1868
+ async function record_split_notice(notice, path12) {
1869
+ await record({ kind: KIND4.SPLIT_NOTICE, at: now_iso(), ...notice }, path12);
1870
+ }
1871
+ async function record_split_filed(filed, path12) {
1872
+ await record({ kind: KIND4.SPLIT_FILED, at: now_iso(), ...filed }, path12);
1873
+ }
1874
+ async function record_push_miss(miss, path12) {
1875
+ await record({ kind: KIND4.PUSH_MISS, at: now_iso(), ...miss }, path12);
1876
+ }
1877
+ async function record_ship_lap(lap, path12) {
1878
+ await record({ kind: KIND4.SHIP_LAP, at: now_iso(), ...lap }, path12);
1879
+ }
1880
+ async function record_unplanned_notice(notice, path12) {
1881
+ await record({ kind: KIND4.UNPLANNED_NOTICE, at: now_iso(), ...notice }, path12);
1882
+ }
1883
+ var lane_ledger_write = {
1884
+ CI_WAIT_STAGE,
1885
+ CODERABBIT_RATE_LIMIT_STAGE,
1886
+ CODERABBIT_RETRIGGER_STAGE,
1887
+ CODERABBIT_WAIT_STAGE,
1888
+ KIND: KIND4,
1889
+ LINE_SEPARATOR,
1890
+ PRE_DETACH_STAGE,
1891
+ ROUND_ONE_REUSED,
1892
+ append,
1893
+ record,
1894
+ record_core_wait,
1895
+ record_dispatch,
1896
+ record_gate,
1897
+ record_held,
1898
+ record_lane_state,
1899
+ record_released,
1900
+ record_merge,
1901
+ record_overlap,
1902
+ record_offerable,
1903
+ record_push_miss,
1904
+ record_round_one,
1905
+ record_round_two,
1906
+ record_ship_lap,
1907
+ record_split_filed,
1908
+ record_split_notice,
1909
+ record_stage,
1910
+ record_stop,
1911
+ record_test_pinned,
1912
+ record_test_related,
1913
+ record_unit_files,
1914
+ record_unplanned_notice,
1915
+ target,
1916
+ target_of
1917
+ };
1918
+
1919
+ // scripts/issue/issue-cite.ts
1920
+ var GITHUB_URL_PREFIX = "https://github.com/";
1921
+ var ISSUE_PATH = "/issues/";
1922
+ var SUMMARY_SEPARATOR = " \u2014 ";
1923
+ var REPO_QUALIFIED = /^([^\s/#]+\/[^\s/#]+)#(\d+)$/u;
1924
+ var BARE_NUMBER = /^#?(\d+)$/u;
1925
+ function plain(number, repo = "") {
1926
+ return `${repo}#${String(number)}`;
1927
+ }
1928
+ function issue_url(slug, number) {
1929
+ return `${GITHUB_URL_PREFIX}${slug}${ISSUE_PATH}${number}`;
1930
+ }
1931
+ function citation_line(slug, number, summary) {
1932
+ return `[${plain(number)}](${issue_url(slug, number)})${SUMMARY_SEPARATOR}${summary}`;
1933
+ }
1934
+ function reference(slug, number, title) {
1935
+ if (slug === void 0) return plain(number);
1936
+ return title === void 0 ? `[${plain(number)}](${issue_url(slug, number)})` : citation_line(slug, number, title);
1937
+ }
1938
+ function citer(slug, titles) {
1939
+ return function cite(number) {
1940
+ return reference(slug, number, titles.get(number));
1941
+ };
1942
+ }
1943
+ function qualified_target(token) {
1944
+ const match = REPO_QUALIFIED.exec(token);
1945
+ if (match === null) return void 0;
1946
+ const [, repo = "", number = ""] = match;
1947
+ return { number, repo };
1948
+ }
1949
+ function bare_target(token, default_repo) {
1950
+ const match = BARE_NUMBER.exec(token);
1951
+ if (match === null) return void 0;
1952
+ const [, number = ""] = match;
1953
+ return { number, repo: default_repo };
1954
+ }
1955
+ function parse_target(token, default_repo) {
1956
+ return qualified_target(token) ?? bare_target(token, default_repo);
1957
+ }
1958
+ function label(target2) {
1959
+ return plain(target2.number, target2.repo);
1960
+ }
1961
+ function missing_line(target2) {
1962
+ return `\u2716 ${label(target2)}: issue does not resolve \u2014 check the number and the repository`;
1963
+ }
1964
+ function unreadable_line(target2) {
1965
+ return `\u2716 ${label(target2)}: could not be read \u2014 a rate limit, expired auth, or a dropped connection`;
1966
+ }
1967
+ function no_repo_line(target2) {
1968
+ return `\u2716 ${label(target2)}: could not read this repository \u2014 check gh auth and the origin remote`;
1969
+ }
1970
+ var issue_cite = {
1971
+ citation_line,
1972
+ citer,
1973
+ issue_url,
1974
+ missing_line,
1975
+ no_repo_line,
1976
+ parse_target,
1977
+ plain,
1978
+ reference,
1979
+ unreadable_line
1980
+ };
1981
+
1982
+ // scripts/run/ship/run-ship-stage.ts
1983
+ import { z as z5 } from "zod";
1984
+ var STAGE = {
1985
+ PREFLIGHT: "preflight",
1986
+ REVIEW: "review",
1987
+ GATE: "gate",
1988
+ SYNC: "sync",
1989
+ COMMIT: "commit",
1990
+ ROUND_TWO: "round-2",
1991
+ FOLLOWUP: "followup",
1992
+ REPORT: "report"
1993
+ };
1994
+ var PHASE = {
1995
+ START: "start",
1996
+ DONE: "done",
1997
+ FAILED: "failed",
1998
+ SKIPPED: "skipped"
1999
+ };
2000
+ var RECORD_PREFIX = "josh-ship-stages-";
2001
+ var RECORD_SEPARATOR = "-";
2002
+ var SKIP_COMMIT_FLAG = "--skip-commit";
2003
+ var SKIP_PUSH_FLAG = "--skip-push";
2004
+ var WORD_SEPARATOR = " ";
2005
+ var STARTED_SEPARATOR = ",";
2006
+ var STARTED_INDEX = 3;
2007
+ var WORD_COUNT = STARTED_INDEX + 1;
2008
+ var REASON_SEPARATOR = " | ";
2009
+ var record_schema = z5.object({
2010
+ done: z5.array(z5.string()),
2011
+ started: z5.array(z5.string()).default([]),
2012
+ is_merge_waiting: z5.boolean().default(false),
2013
+ is_place_waiting: z5.boolean().default(false)
2014
+ });
2015
+ var EMPTY_RECORD = {
2016
+ done: [],
2017
+ started: [],
2018
+ is_merge_waiting: false,
2019
+ is_place_waiting: false
2020
+ };
2021
+ function record_path(repository, issue2) {
2022
+ return stamp_file.stamp_path(`${RECORD_PREFIX}${issue2}${RECORD_SEPARATOR}`, repository);
2023
+ }
2024
+ function parse_record(raw) {
2025
+ return json_value.parse_with(raw, record_schema) ?? EMPTY_RECORD;
2026
+ }
2027
+ function read_record(target2) {
2028
+ const raw = stamp_file.read_stamp_text(target2);
2029
+ return raw === void 0 ? EMPTY_RECORD : parse_record(raw);
2030
+ }
2031
+ function read_done(target2) {
2032
+ return new Set(read_record(target2).done);
2033
+ }
2034
+ function mark_done(target2, stage) {
2035
+ const record2 = read_record(target2);
2036
+ stamp_file.replace_stamp(target2, { ...record2, done: [.../* @__PURE__ */ new Set([...record2.done, stage])] });
2037
+ }
2038
+ function read_started(target2) {
2039
+ return read_record(target2).started;
2040
+ }
2041
+ function mark_started(target2, stage) {
2042
+ const record2 = read_record(target2);
2043
+ stamp_file.replace_stamp(target2, { ...record2, started: [.../* @__PURE__ */ new Set([...record2.started, stage])] });
2044
+ }
2045
+ function end_attempt(target2) {
2046
+ stamp_file.replace_stamp(target2, { ...read_record(target2), started: [], is_merge_waiting: false });
2047
+ }
2048
+ function read_merge_waiting(target2) {
2049
+ return read_record(target2).is_merge_waiting;
2050
+ }
2051
+ function mark_merge_waiting(target2, is_merge_waiting) {
2052
+ stamp_file.replace_stamp(target2, { ...read_record(target2), is_merge_waiting });
2053
+ }
2054
+ function read_place_waiting(target2) {
2055
+ return read_record(target2).is_place_waiting;
2056
+ }
2057
+ function mark_place_waiting(target2, is_place_waiting) {
2058
+ stamp_file.replace_stamp(target2, { ...read_record(target2), is_place_waiting });
2059
+ }
2060
+ function clear_waits(target2) {
2061
+ stamp_file.replace_stamp(target2, {
2062
+ ...read_record(target2),
2063
+ is_merge_waiting: false,
2064
+ is_place_waiting: false
2065
+ });
2066
+ }
2067
+ function clear(target2) {
2068
+ stamp_file.remove_stamp(target2);
2069
+ }
2070
+ function is_shipped(state) {
2071
+ return state.is_committed && state.is_pushed;
2072
+ }
2073
+ var DONE_BY = {
2074
+ // The preflight asks what the commit stage would refuse on, so a commit is
2075
+ // its output; a resumed commit stage still asks `git -y`'s own preflight.
2076
+ [STAGE.PREFLIGHT]: (done, state) => state.is_merged || done.has(STAGE.PREFLIGHT) && state.is_committed,
2077
+ // The sync stage commits locally before the review round and the gate, without pushing
2078
+ // (`run-ship-sync.ts`), so a commit is neither's output: a pushed one on a clean tree is, as only the
2079
+ // commit stage after the gate pushes — unless the issue changed since.
2080
+ [STAGE.REVIEW]: (done, state) => state.is_merged || done.has(STAGE.REVIEW) && is_shipped(state) && state.is_review_stale !== true,
2081
+ [STAGE.GATE]: (done, state) => state.is_merged || done.has(STAGE.GATE) && is_shipped(state),
2082
+ // The merge of the default branch before the gate: once pushed, a default branch that
2083
+ // moved is the followup's to merge again.
2084
+ [STAGE.SYNC]: (done, state) => state.is_merged || done.has(STAGE.SYNC) && is_shipped(state),
2085
+ [STAGE.COMMIT]: (done, state) => state.is_merged || done.has(STAGE.COMMIT) && is_shipped(state),
2086
+ // The round-2 pass reads the pushed fix delta, so its record is honored only
2087
+ // while that push still stands — new work pushed on top reruns it.
2088
+ [STAGE.ROUND_TWO]: (done, state) => state.is_merged || done.has(STAGE.ROUND_TWO) && is_shipped(state),
2089
+ // A recorded followup still needs the shipped state: a record left by a merged ship whose report
2090
+ // failed must not pass over the followup of new, not-yet-pushed work on the same issue.
2091
+ [STAGE.FOLLOWUP]: (done, state) => state.is_merged || done.has(STAGE.FOLLOWUP) && is_shipped(state),
2092
+ [STAGE.REPORT]: (done) => done.has(STAGE.REPORT)
2093
+ };
2094
+ function is_done(stage, done, state, has_body = false) {
2095
+ if (has_body && stage === STAGE.COMMIT && !state.is_merged) return false;
2096
+ return DONE_BY[stage](done, state);
2097
+ }
2098
+ function commit_flags(state) {
2099
+ if (!state.is_committed) return [];
2100
+ return state.is_pushed ? [SKIP_COMMIT_FLAG, SKIP_PUSH_FLAG] : [SKIP_COMMIT_FLAG];
2101
+ }
2102
+ function event_text(issue2, stage, phase, started = []) {
2103
+ const words = [issue_cite.plain(issue2), stage, phase];
2104
+ const listed = [...new Set(started)].join(STARTED_SEPARATOR);
2105
+ const full = started.length > 0 ? [...words, listed] : words;
2106
+ return full.join(WORD_SEPARATOR);
2107
+ }
2108
+ function with_reason(text2, reason) {
2109
+ return reason === void 0 ? text2 : `${text2}${REASON_SEPARATOR}${reason}`;
2110
+ }
2111
+ function words_part(text2) {
2112
+ return text2.split(REASON_SEPARATOR, 1)[0] ?? "";
2113
+ }
2114
+ function started_of(text2) {
2115
+ return words_part(text2).split(WORD_SEPARATOR, WORD_COUNT)[STARTED_INDEX]?.split(STARTED_SEPARATOR);
2116
+ }
2117
+ function words_of(text2) {
2118
+ const [, stage = "", phase = ""] = words_part(text2).split(WORD_SEPARATOR, WORD_COUNT);
2119
+ return { stage, phase };
2120
+ }
2121
+ function reason_of(text2) {
2122
+ const at = text2.indexOf(REASON_SEPARATOR);
2123
+ return at === -1 ? void 0 : text2.slice(at + REASON_SEPARATOR.length);
2124
+ }
2125
+ var CONFLICT = "conflict";
2126
+ function stop_reason(stage, conflicts = []) {
2127
+ return conflicts.length > 0 ? CONFLICT : stage;
2128
+ }
2129
+ var run_ship_stage = {
2130
+ CONFLICT,
2131
+ PHASE,
2132
+ STAGE,
2133
+ clear,
2134
+ clear_waits,
2135
+ commit_flags,
2136
+ end_attempt,
2137
+ event_text,
2138
+ is_done,
2139
+ is_shipped,
2140
+ mark_done,
2141
+ mark_merge_waiting,
2142
+ mark_place_waiting,
2143
+ mark_started,
2144
+ read_done,
2145
+ read_merge_waiting,
2146
+ read_place_waiting,
2147
+ read_started,
2148
+ reason_of,
2149
+ record_path,
2150
+ started_of,
2151
+ with_reason,
2152
+ words_of,
2153
+ stop_reason
2154
+ };
2155
+
2156
+ // scripts/git/repository-lock.ts
2157
+ import { randomUUID as randomUUID2 } from "node:crypto";
2158
+ import { linkSync, renameSync, rmSync as rmSync3 } from "node:fs";
2159
+ import { setTimeout as sleep } from "node:timers/promises";
2160
+
2161
+ // scripts/josh/process-owner.ts
2162
+ import { z as z6 } from "zod";
2163
+ var process_owner_schema = z6.object({ pid: z6.number(), process_start: z6.string().optional() });
2164
+
2165
+ // scripts/git/repository-lock.ts
2166
+ var POLL_INTERVAL_MS = 200;
2167
+ var SYNC_POLL_INTERVAL_MS = 10;
2168
+ var SLEEP_CELL = new Int32Array(new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT));
2169
+ function lock_path(prefix, cwd) {
2170
+ return stamp_file.stamp_path(prefix, git_common_directory.repository(cwd) ?? cwd ?? process.cwd());
2171
+ }
2172
+ function parse_owner(raw) {
2173
+ if (raw === void 0) return void 0;
2174
+ const parsed = process_owner_schema.safeParse(json_value.parse_or_undefined(raw));
2175
+ return parsed.success ? parsed.data : void 0;
2176
+ }
2177
+ function read_owner(target2) {
2178
+ return parse_owner(stamp_file.read_stamp_text(target2));
2179
+ }
2180
+ function is_owner_gone(owner) {
2181
+ return process_identity.is_same_process(owner.pid, owner.process_start) === false;
2182
+ }
2183
+ function restore(aside, target2) {
2184
+ try {
2185
+ linkSync(aside, target2);
2186
+ } catch {
2187
+ }
2188
+ }
2189
+ function stale_record(target2, is_gone) {
2190
+ const raw = stamp_file.read_stamp_text(target2);
2191
+ const owner = parse_owner(raw);
2192
+ return owner !== void 0 && is_gone(owner) ? raw : void 0;
2193
+ }
2194
+ function move_aside(target2) {
2195
+ const aside = `${target2}.${String(process.pid)}.${randomUUID2()}`;
2196
+ try {
2197
+ renameSync(target2, aside);
2198
+ return aside;
2199
+ } catch {
2200
+ return void 0;
2201
+ }
2202
+ }
2203
+ function clear_stale(target2, is_gone = is_owner_gone) {
2204
+ const raw = stale_record(target2, is_gone);
2205
+ if (raw === void 0) return;
2206
+ const aside = move_aside(target2);
2207
+ if (aside === void 0) return;
2208
+ if (stamp_file.read_stamp_text(aside) !== raw) restore(aside, target2);
2209
+ rmSync3(aside, { force: true });
2210
+ }
2211
+ function claim(target2) {
2212
+ clear_stale(target2);
2213
+ return stamp_file.create_stamp(target2, process_identity.own_fields());
2214
+ }
2215
+ function release(target2) {
2216
+ const owner = read_owner(target2);
2217
+ if (owner !== void 0 && process_identity.is_own_process(owner.pid, owner.process_start)) {
2218
+ stamp_file.remove_stamp(target2);
2219
+ }
2220
+ }
2221
+ async function acquire(target2, max_wait_ms) {
2222
+ const deadline = Date.now() + max_wait_ms;
2223
+ while (!claim(target2)) {
2224
+ if (Date.now() >= deadline) return false;
2225
+ await sleep(POLL_INTERVAL_MS);
2226
+ }
2227
+ return true;
2228
+ }
2229
+ function sleep_sync(ms) {
2230
+ Atomics.wait(SLEEP_CELL, 0, 0, ms);
2231
+ }
2232
+ function acquire_sync(target2, max_wait_ms) {
2233
+ const deadline = Date.now() + max_wait_ms;
2234
+ while (!claim(target2)) {
2235
+ if (Date.now() >= deadline) return false;
2236
+ sleep_sync(SYNC_POLL_INTERVAL_MS);
2237
+ }
2238
+ return true;
2239
+ }
2240
+ async function with_lock(work, target2, max_wait_ms) {
2241
+ if (!await acquire(target2, max_wait_ms)) return void 0;
2242
+ try {
2243
+ return await work();
2244
+ } finally {
2245
+ release(target2);
2246
+ }
2247
+ }
2248
+ function with_lock_sync(work, target2, max_wait_ms) {
2249
+ if (!acquire_sync(target2, max_wait_ms)) return void 0;
2250
+ try {
2251
+ return work();
2252
+ } finally {
2253
+ release(target2);
2254
+ }
2255
+ }
2256
+ var repository_lock = { clear_stale, lock_path, with_lock, with_lock_sync };
2257
+
2258
+ // scripts/run/event/run-event-stream.ts
2259
+ import { z as z7 } from "zod";
2260
+ var EVENT_PREFIX = durable_state.PREFIX.EVENTS;
2261
+ var EVENT_SUFFIX = ".jsonl";
2262
+ var EVENT_CAP = 15e3;
2263
+ var FIRST_POSITION = 0;
2264
+ var POSITION_INCREMENT = 1;
2265
+ var LINE_SEPARATOR2 = "\n";
2266
+ var WORD_SEPARATOR2 = " ";
2267
+ var STAGE_PHASE_INDEX = 2;
2268
+ var LOCK_SUFFIX = ".lock";
2269
+ var LOCK_WAIT_MS = 5e3;
2270
+ var EVENT_KIND = {
2271
+ PLAN: "plan",
2272
+ CHILD_LAUNCH: "child-launch",
2273
+ MERGE: "merge",
2274
+ PARK: "park",
2275
+ SPLIT: "split",
2276
+ OUTAGE: "outage",
2277
+ // A Claude usage limit stopped a lane child (joshuafolkken/kit#4745). Its text names the reset time,
2278
+ // which `backlog:drive` reads to hold launches until then; it counts against no streak, so it is not an
2279
+ // `OUTAGE`.
2280
+ USAGE_LIMIT: "usage-limit",
2281
+ CUT: "cut",
2282
+ // A fresh session adopted an implementation cut — `run:cut --resume` answered `resume-impl`. The
2283
+ // resume clears the cut record, so without this the `cut` would stay the newest position and
2284
+ // `run:step` would keep answering the resume command it had just run.
2285
+ RESUME: "resume",
2286
+ // A person stopped a running lane child and re-dispatched its issue in a fresh session
2287
+ // (`lane:restart`). It follows the fresh dispatch's `CHILD_LAUNCH`, so it is a launch to the parent and
2288
+ // the board, and — like that launch — a batch record a lane child never reads as its own position.
2289
+ RESTART: "restart",
2290
+ // A person withdrew a lane child — stopped it and left its issue open for the next run (`lane:withdraw`).
2291
+ // It is written before the stop, so `run:merge` settles the child as withdrawn whatever GitHub says
2292
+ // by the time the parent collects it, and counts it as neither a merge, a failure nor an outage.
2293
+ WITHDRAW: "withdraw",
2294
+ // The backlog emptied while nothing of the run's own was in flight — the drain. It marks the position
2295
+ // at which the end-of-run retrospective is owed, *before* the idle watch opens, so `run:step` fires
2296
+ // the retrospective at the drain rather than after the watch runs its course. It is not itself a
2297
+ // stop: the run watches on once the retrospective has run, and the real `STOP` follows when the watch
2298
+ // expires.
2299
+ DRAIN: "drain",
2300
+ STOP: "stop",
2301
+ PR_OPENED: "pr-opened",
2302
+ REVIEW_ROUND: "review-round",
2303
+ // The end-of-run retrospective's result, recorded when the run marks the retrospective done. A
2304
+ // retrospective that files zero improvements and one that never ran look
2305
+ // the same from outside — no new Issue either way — so the result is put on the stream the report is
2306
+ // generated from: the issues filed (or that none were), and the candidates dropped with why. It is
2307
+ // emitted from the `run:carry --retrospective` close, so marking the retrospective done and recording
2308
+ // what it found are one action rather than two the run could do only one of.
2309
+ RETROSPECTIVE: "retrospective",
2310
+ // Ready backlog work is sitting undispatched while a lane is free and nothing has dispatched for a
2311
+ // while. Emitted once per stall episode by the stop-time detector, it is both the dedup marker —
2312
+ // `emit_once_since` refuses a second until a `CHILD_LAUNCH` intervenes — and the line a terminal
2313
+ // reader following the stream sees. `run:step` reads it as `backlog:next`, so a run that
2314
+ // stalled is pointed straight at dispatching the work rather than left waiting.
2315
+ STALL: "stall",
2316
+ // The run's own driver is gone: the cut handed the budget off, the owner has died, and no supervisor
2317
+ // is watching. Emitted once per strand episode by the stop-time detector — or by the `run:wake`
2318
+ // supervisor as it fails, leaves that state behind and has warned of it —
2319
+ // exactly as `STALL` is — the newest-event dedup keeps a run polled every stop from notifying more
2320
+ // than once, and a terminal reader following the stream sees the line. The strand is the step before
2321
+ // the stall: a stalled run still has a driver that could dispatch, a stranded one has none.
2322
+ STRANDED: "stranded",
2323
+ // One `josh ship` stage starting, succeeding or failing. It is a trace of the
2324
+ // composite's progress rather than a position the run is at — the positions a ship leaves behind are
2325
+ // the closed issue its `followup` merges, or a detached supervisor's `SHIP_LAUNCH` / `SHIP_STOP` below
2326
+ // — so it is one of the `TRACE_KINDS` the last-event read skips.
2327
+ SHIP_STAGE: "ship-stage",
2328
+ // One progress watcher line — the `at … / next …` heartbeat `run:progress` prints. Printed only to
2329
+ // the watcher's own output, a headless successor's heartbeat would be buried in its log after a cut;
2330
+ // on the stream it reaches the attached session's relay. It says
2331
+ // the run is alive rather than where it is, so it is a trace kind like `SHIP_STAGE`.
2332
+ HEARTBEAT: "heartbeat",
2333
+ // The post-implementation region handed to a detached `josh ship --detach` supervisor. Unlike a stage
2334
+ // trace it is a position: the agent has ended and the
2335
+ // supervisor carries the run, so `run:step` answers `wait` until it stops or the issue closes.
2336
+ SHIP_LAUNCH: "ship-launch",
2337
+ // The supervisor stopped at a failed stage — a red gate, a High/Medium review, a failed push, red CI
2338
+ // The position that hands control back: `run:step` prints the command that
2339
+ // shows the stopped report, so the agent fixes it and relaunches rather than rebuilding the context.
2340
+ SHIP_STOP: "ship-stop",
2341
+ // The relaunch meant to answer a `SHIP_STOP` started nothing — the broker refused it, or the direct
2342
+ // spawn failed (joshuafolkken/kit#4765). `run:merge` reads it, not the transcript's mtime, to tell the
2343
+ // stop went unanswered, and a re-dispatch cap's park names its reason. A trace: the stop stays the
2344
+ // position `run:step` answers.
2345
+ RELAUNCH_FAILED: "relaunch-failed",
2346
+ // An Issue the run filed on its way, written by `issue:file`, so a run started from the command line
2347
+ // still surfaces what it found — `run:board`'s findings section reads it.
2348
+ FILED: "filed",
2349
+ // A one-line observation short of an Issue, written with `run:event --append note` and shown in the
2350
+ // same section.
2351
+ NOTE: "note",
2352
+ // A lane child reached a phase no other event marks — its first implementation edit, written by the
2353
+ // PreToolUse hook — so `run:board` draws how far the child has got. A trace,
2354
+ // like `SHIP_STAGE`: it says where the child's work is, not where the run is.
2355
+ LANE_PHASE: "lane-phase",
2356
+ // An issue `run:add` put into the live run. The parent's `--wait` watcher
2357
+ // ends on it, so the issue takes the next free lane without waiting out the arrival probe's minute. A
2358
+ // trace: it says what the run was handed, not where the run is.
2359
+ ADD: "add",
2360
+ // `josh lane:limit` raised a live run's lane limit. The `--wait` watcher's
2361
+ // arrival probe reads it as a wake: the lanes a raise frees are new room for a pool its baseline
2362
+ // already holds. A trace: it says the run gained room, not where the run is.
2363
+ LANE_LIMIT: "lane-limit",
2364
+ // One stage of the run's start — the session starting, the plan, the hand-off to the supervisor, a
2365
+ // lane opening (`run-event-setup.ts`). `run:board` draws it while the run stands at it, so the
2366
+ // minutes before one read as work rather than as a run that has stopped. A trace: it says the run is
2367
+ // getting ready, not where the run is.
2368
+ SETUP: "setup",
2369
+ // A child's pull request checks as `josh followup` last polled them — the CI counts and CodeRabbit's
2370
+ // state (`run-event-checks.ts`), written only when they change, so `run:board` draws a child waiting
2371
+ // in followup without asking GitHub (joshuafolkken/kit#3770). A trace: it says how the checks stand,
2372
+ // not where the run is.
2373
+ PR_CHECKS: "pr-checks",
2374
+ // `backlog:drive` reached a watch with no child running and nothing to dispatch — the point a person's
2375
+ // hand is wanted. Emitted once per idle episode (`emit_once_since_with`, reset by `CHILD_LAUNCH`), it
2376
+ // is the dedup marker for the one idle Telegram. A trace: a drain's retrospective is read off the
2377
+ // position beneath it, so the marker must not stand over it.
2378
+ IDLE_NOTICE: "idle-notice",
2379
+ // A person paused or resumed a lane child (`lane:pause` / `lane:resume`), so who halted a lane and
2380
+ // when is on the stream rather than only in a shell history (joshuafolkken/kit#4268). A trace: it
2381
+ // says what a lane's processes were told, not where the run is.
2382
+ LANE_STATE: "lane-state",
2383
+ // `backlog:drive` found nothing of the run in flight and only paused lanes left, paused past the
2384
+ // silent window (joshuafolkken/kit#4270). Emitted once per pause episode (`emit_once_since_with`,
2385
+ // reset by `LANE_STATE`), it is the dedup marker for the one paused-lane Telegram. A trace.
2386
+ PAUSED_NOTICE: "paused-notice",
2387
+ // `backlog:drive` ran a due issue's measurement declaration itself, found it within its bound and
2388
+ // closed the issue through `issue:measured` — no lane was launched for it (joshuafolkken/kit#4621).
2389
+ // `run:board` draws it merged. A trace: the parent's position is the drive's, not this close.
2390
+ MEASURED: "measured",
2391
+ // The host slept while `backlog:drive` sampled its load (joshuafolkken/kit#5032): the sampler's timer
2392
+ // ran late by more than a few intervals. `at` is the wake and `elapsed_ms` how long the sleep
2393
+ // lasted; every lane's net time takes it out (`lane-sleep.ts`). A trace.
2394
+ SLEEP: "sleep"
2395
+ };
2396
+ var EVENT_KINDS = Object.values(EVENT_KIND);
2397
+ var TRACE_KINDS = /* @__PURE__ */ new Set([
2398
+ EVENT_KIND.SHIP_STAGE,
2399
+ EVENT_KIND.HEARTBEAT,
2400
+ EVENT_KIND.FILED,
2401
+ EVENT_KIND.NOTE,
2402
+ EVENT_KIND.LANE_PHASE,
2403
+ EVENT_KIND.ADD,
2404
+ EVENT_KIND.LANE_LIMIT,
2405
+ EVENT_KIND.SETUP,
2406
+ EVENT_KIND.PR_CHECKS,
2407
+ EVENT_KIND.IDLE_NOTICE,
2408
+ EVENT_KIND.LANE_STATE,
2409
+ EVENT_KIND.PAUSED_NOTICE,
2410
+ EVENT_KIND.MEASURED,
2411
+ EVENT_KIND.RELAUNCH_FAILED,
2412
+ EVENT_KIND.SLEEP
2413
+ ]);
2414
+ var DISPOSABLE_KINDS = /* @__PURE__ */ new Set([
2415
+ EVENT_KIND.SHIP_STAGE,
2416
+ EVENT_KIND.HEARTBEAT,
2417
+ EVENT_KIND.SETUP,
2418
+ EVENT_KIND.PR_CHECKS
2419
+ ]);
2420
+ var event_schema = z7.object({
2421
+ pos: z7.number(),
2422
+ at: z7.string(),
2423
+ kind: z7.string(),
2424
+ text: z7.string(),
2425
+ // The child's time on a lane, recorded once by the writer of an ending (joshuafolkken/kit#4481), so a
2426
+ // reader never has to find its launch again. An event written before it has none. A `sleep` event
2427
+ // carries the sleep's length here.
2428
+ elapsed_ms: z7.number().optional()
2429
+ });
2430
+ function is_event_kind(value) {
2431
+ return EVENT_KINDS.includes(value);
2432
+ }
2433
+ function target_of2(repository) {
2434
+ return durable_state.path(EVENT_PREFIX, repository, EVENT_SUFFIX);
2435
+ }
2436
+ function is_present(event) {
2437
+ return event !== void 0;
2438
+ }
2439
+ function parse_line2(line) {
2440
+ return event_schema.safeParse(json_value.parse_or_undefined(line)).data;
2441
+ }
2442
+ function read_lines(target2) {
2443
+ const raw = stamp_file.read_stamp_text(target2);
2444
+ if (raw === void 0) return [];
2445
+ return raw.split(LINE_SEPARATOR2).map((line) => line.trim()).filter((line) => line.length > 0).map((line) => parse_line2(line)).filter(is_present);
2446
+ }
2447
+ function read_events(target2) {
2448
+ return read_lines(target2).filter((event) => is_event_kind(event.kind));
2449
+ }
2450
+ function last_position(events) {
2451
+ return events[events.length - POSITION_INCREMENT]?.pos ?? FIRST_POSITION;
2452
+ }
2453
+ function issue_of2(event) {
2454
+ return event.text.split(WORD_SEPARATOR2)[FIRST_POSITION] ?? "";
2455
+ }
2456
+ function newest_by_issue(events, kind) {
2457
+ const newest = /* @__PURE__ */ new Map();
2458
+ for (const event of events) {
2459
+ if (event.kind === kind) newest.set(issue_of2(event), event);
2460
+ }
2461
+ return new Set(newest.values());
2462
+ }
2463
+ function is_stage_start(event) {
2464
+ if (event.kind !== EVENT_KIND.SHIP_STAGE) return false;
2465
+ return event.text.split(WORD_SEPARATOR2)[STAGE_PHASE_INDEX] === run_ship_stage.PHASE.START;
2466
+ }
2467
+ function drawn_lines(events) {
2468
+ const setup = events.findLast((event) => event.kind === EVENT_KIND.SETUP);
2469
+ return /* @__PURE__ */ new Set([
2470
+ ...newest_by_issue(events, EVENT_KIND.SHIP_STAGE),
2471
+ ...newest_by_issue(events, EVENT_KIND.PR_CHECKS),
2472
+ ...setup === void 0 ? [] : [setup]
2473
+ ]);
2474
+ }
2475
+ function droppable(events) {
2476
+ const kept = drawn_lines(events);
2477
+ const disposable = events.filter((event) => DISPOSABLE_KINDS.has(event.kind) && !kept.has(event));
2478
+ return [
2479
+ ...disposable.filter((event) => !is_stage_start(event)),
2480
+ ...disposable.filter((event) => is_stage_start(event))
2481
+ ];
2482
+ }
2483
+ function bounded(events) {
2484
+ const excess = events.length - EVENT_CAP;
2485
+ if (excess <= 0) return events;
2486
+ const dropped = new Set(droppable(events).slice(0, excess));
2487
+ return events.filter((event) => !dropped.has(event)).slice(-EVENT_CAP);
2488
+ }
2489
+ function serialize(events) {
2490
+ return `${events.map((event) => JSON.stringify(event)).join(LINE_SEPARATOR2)}${LINE_SEPARATOR2}`;
2491
+ }
2492
+ function append_held(target2, event) {
2493
+ const position = last_position(read_lines(target2)) + POSITION_INCREMENT;
2494
+ const events = bounded([...read_events(target2), { pos: position, ...event }]);
2495
+ stamp_file.replace_text_stamp(target2, serialize(events));
2496
+ return position;
2497
+ }
2498
+ function append_event(target2, event) {
2499
+ if (!is_event_kind(event.kind)) return { appended: false, position: FIRST_POSITION };
2500
+ const lock = `${target2}${LOCK_SUFFIX}`;
2501
+ const position = repository_lock.with_lock_sync(
2502
+ () => append_held(target2, event),
2503
+ lock,
2504
+ LOCK_WAIT_MS
2505
+ );
2506
+ if (position === void 0) {
2507
+ const message = `run event stream: gave up waiting for the lock at ${lock}`;
2508
+ process.stderr.write(`${message}
2509
+ `);
2510
+ throw new Error(message);
2511
+ }
2512
+ return { appended: true, position };
2513
+ }
2514
+ function append2(target2, kind, text2, at) {
2515
+ return append_event(target2, { at, kind, text: text2 });
2516
+ }
2517
+ function read_from(target2, position) {
2518
+ const events = read_events(target2);
2519
+ return {
2520
+ events: events.filter((event) => event.pos > position),
2521
+ next_position: last_position(events)
2522
+ };
2523
+ }
2524
+ function read_last(target2) {
2525
+ return read_events(target2).findLast((event) => !TRACE_KINDS.has(event.kind));
2526
+ }
2527
+ function has_since(events, kind, reset_kind) {
2528
+ const reset_at = events.findLastIndex((event) => event.kind === reset_kind);
2529
+ return events.slice(reset_at + POSITION_INCREMENT).some((event) => event.kind === kind);
2530
+ }
2531
+ var FIELD_SEPARATOR = " \xB7 ";
2532
+ function format_event(event) {
2533
+ return [event.at, event.kind, event.text].join(FIELD_SEPARATOR);
2534
+ }
2535
+ var run_event_stream = {
2536
+ EVENT_CAP,
2537
+ EVENT_KIND,
2538
+ EVENT_KINDS,
2539
+ TRACE_KINDS,
2540
+ append: append2,
2541
+ append_event,
2542
+ format_event,
2543
+ has_since,
2544
+ is_stage_start,
2545
+ read_events,
2546
+ read_from,
2547
+ read_last,
2548
+ target_of: target_of2
2549
+ };
2550
+
2551
+ // scripts/rules/issue-citation.ts
2552
+ var ISSUE_NUMBER = /#\d+/gu;
2553
+ var REFERENCE_BOUNDARY = /[\s#()[\]<>|]/u;
2554
+ var OWNER_REPO = /^[^\s/#]+\/[^\s/#]+$/u;
2555
+ var MARKDOWN_LINK = /\[[^[\]]*\]\([^()]*\)/gu;
2556
+ var NUMBER_CONTINUATION = /^(?:\w|-[a-z])/iu;
2557
+ var CONTINUATION_WIDTH = 2;
2558
+ var GLUED_LEAD = /[&./]/u;
2559
+ var FENCE_MARKER = /^\s*(?:`{3,}|~{3,})/u;
2560
+ var QUOTE_LINE = /^\s*>/u;
2561
+ var PR_PREFIX = /\b(?:pr|pull request)\s*$/iu;
2562
+ var BACKTICK_PAIR = 2;
2563
+ function link_covers(link, index) {
2564
+ const start = link.index ?? 0;
2565
+ return index >= start && index < start + link[0].length;
2566
+ }
2567
+ function is_linked_at(line, index) {
2568
+ for (const link of line.matchAll(MARKDOWN_LINK)) {
2569
+ if (link_covers(link, index)) return true;
2570
+ }
2571
+ return false;
2572
+ }
2573
+ function lead_token(message, hash_index) {
2574
+ let start = hash_index;
2575
+ while (start > 0 && !REFERENCE_BOUNDARY.test(message.charAt(start - 1))) start -= 1;
2576
+ return message.slice(start, hash_index);
2577
+ }
2578
+ function repo_prefix(message, hash_index) {
2579
+ const token = lead_token(message, hash_index);
2580
+ return OWNER_REPO.test(token) ? token : "";
2581
+ }
2582
+ function is_inline_code_at(line, index) {
2583
+ const backticks = line.slice(0, index).split("`").length - 1;
2584
+ return backticks % BACKTICK_PAIR === 1;
2585
+ }
2586
+ function is_bare_at(line, index) {
2587
+ if (is_linked_at(line, index) || is_inline_code_at(line, index)) return false;
2588
+ return !PR_PREFIX.test(line.slice(0, index));
2589
+ }
2590
+ function is_glued(line, reference2) {
2591
+ const end = reference2.index + reference2.text.length;
2592
+ if (NUMBER_CONTINUATION.test(line.slice(end, end + CONTINUATION_WIDTH))) return true;
2593
+ return reference2.prefix === "" && GLUED_LEAD.test(lead_token(line, reference2.index));
2594
+ }
2595
+ function line_references(line) {
2596
+ const references = [];
2597
+ for (const match of line.matchAll(ISSUE_NUMBER)) {
2598
+ const reference2 = { index: match.index, prefix: repo_prefix(line, match.index), text: match[0] };
2599
+ if (!is_glued(line, reference2) && is_bare_at(line, match.index)) references.push(reference2);
2600
+ }
2601
+ return references;
2602
+ }
2603
+ function collect_line_references(line, found) {
2604
+ for (const reference2 of line_references(line)) found.push(`${reference2.prefix}${reference2.text}`);
2605
+ }
2606
+ function lines_outside_fences(message) {
2607
+ const lines = [];
2608
+ let is_in_fence = false;
2609
+ for (const line of message.split("\n")) {
2610
+ if (FENCE_MARKER.test(line)) is_in_fence = !is_in_fence;
2611
+ else if (!is_in_fence) lines.push(line);
2612
+ }
2613
+ return lines;
2614
+ }
2615
+ function prose_lines(message) {
2616
+ return lines_outside_fences(message).filter((line) => !QUOTE_LINE.test(line));
2617
+ }
2618
+ function bare_references(message) {
2619
+ const found = [];
2620
+ for (const line of prose_lines(message)) collect_line_references(line, found);
2621
+ return [...new Set(found)];
2622
+ }
2623
+ function has_bare_reference(message) {
2624
+ return bare_references(message).length > 0;
2625
+ }
2626
+ function reference_link(reference2, default_slug) {
2627
+ const slug = reference2.prefix === "" ? default_slug : reference2.prefix;
2628
+ const number = reference2.text.slice(1);
2629
+ return `[${reference2.prefix}${reference2.text}](${issue_cite.issue_url(slug, number)})`;
2630
+ }
2631
+ function linkify_line(line, slug) {
2632
+ let result = "";
2633
+ let cursor = 0;
2634
+ for (const reference2 of line_references(line)) {
2635
+ const start = reference2.index - reference2.prefix.length;
2636
+ result += line.slice(cursor, start) + reference_link(reference2, slug);
2637
+ cursor = reference2.index + reference2.text.length;
2638
+ }
2639
+ return result + line.slice(cursor);
2640
+ }
2641
+ function rewrite_line(line, slug, is_in_fence) {
2642
+ if (is_in_fence || FENCE_MARKER.test(line) || QUOTE_LINE.test(line)) return line;
2643
+ return linkify_line(line, slug);
2644
+ }
2645
+ function linkify(message, slug) {
2646
+ const out = [];
2647
+ let is_in_fence = false;
2648
+ for (const line of message.split("\n")) {
2649
+ if (FENCE_MARKER.test(line)) is_in_fence = !is_in_fence;
2650
+ out.push(rewrite_line(line, slug, is_in_fence));
2651
+ }
2652
+ return out.join("\n");
2653
+ }
2654
+ var issue_citation = {
2655
+ bare_references,
2656
+ has_bare_reference,
2657
+ linkify,
2658
+ prose_lines
2659
+ };
2660
+
2661
+ // scripts/issue/session-cite.ts
2662
+ function session_repo() {
2663
+ const url = repo_discovery.read_origin_url(process.cwd());
2664
+ const identity = url === void 0 ? void 0 : repo_origin.parse_origin_url(url);
2665
+ return identity === void 0 ? void 0 : `${identity.owner}/${identity.repo}`;
2666
+ }
2667
+ function issue(number, title, repo = session_repo()) {
2668
+ return issue_cite.reference(repo, String(number), title);
2669
+ }
2670
+ function text(message) {
2671
+ const repo = session_repo();
2672
+ return repo === void 0 ? message : issue_citation.linkify(message, repo);
2673
+ }
2674
+ var session_cite = {
2675
+ issue,
2676
+ session_repo,
2677
+ text
2678
+ };
2679
+
2680
+ // scripts/lane/lane-state.ts
2681
+ import { readdirSync as readdirSync3 } from "node:fs";
2682
+ import path7 from "node:path";
2683
+
2684
+ // scripts/lib/figure-format.ts
2685
+ var USD_DECIMALS = 4;
2686
+ var PERCENT_SCALE = 100;
2687
+ var PERCENT_DECIMALS = 1;
2688
+ var MINUTE_DECIMALS = 1;
2689
+ var CLOCK_WIDTH = 2;
2690
+ var CLOCK_PAD = "0";
2691
+ function format_usd(usd, decimals = USD_DECIMALS) {
2692
+ return `$${usd.toFixed(decimals)}`;
2693
+ }
2694
+ function format_tokens(count) {
2695
+ return count.toLocaleString("en-US");
2696
+ }
2697
+ function format_share(part, whole) {
2698
+ if (whole === 0) return "n/a";
2699
+ return `${(part / whole * PERCENT_SCALE).toFixed(PERCENT_DECIMALS)}%`;
2700
+ }
2701
+ function format_minutes(duration_ms) {
2702
+ return `${(duration_ms / MS_PER_MINUTE).toFixed(MINUTE_DECIMALS)} min`;
2703
+ }
2704
+ function two_digits(value) {
2705
+ return String(value).padStart(CLOCK_WIDTH, CLOCK_PAD);
2706
+ }
2707
+ function clock_of(ms) {
2708
+ const date = new Date(ms);
2709
+ return [date.getHours(), date.getMinutes(), date.getSeconds()].map((value) => two_digits(value)).join(":");
2710
+ }
2711
+ function minute_of(ms) {
2712
+ const date = new Date(ms);
2713
+ return [date.getHours(), date.getMinutes()].map((value) => two_digits(value)).join(":");
2714
+ }
2715
+ var figure_format = {
2716
+ format_usd,
2717
+ format_tokens,
2718
+ format_share,
2719
+ format_minutes,
2720
+ two_digits,
2721
+ clock_of,
2722
+ minute_of
2723
+ };
2724
+
2725
+ // scripts/lane/lane-state.ts
2726
+ import { z as z8 } from "zod";
2727
+ var STATE_PREFIX = durable_state.PREFIX.LANE_STATE;
2728
+ var STATE_SUFFIX = ".json";
2729
+ var LOCK_SUFFIX2 = ".lock";
2730
+ var LOCK_WAIT_MS2 = 5e3;
2731
+ var LANE_STATES = ["open", "running", "paused", "ended"];
2732
+ var NO_STATE_HINT = "no lane state \u2014 counted in use";
2733
+ var lane_run_schema = z8.object({ started_at: z8.string(), owner_pid: z8.number().optional() });
2734
+ var stuck_schema = z8.object({ pid: z8.number(), reason: z8.string() });
2735
+ var lane_state_schema2 = z8.object({
2736
+ issue: z8.string(),
2737
+ run: lane_run_schema.optional(),
2738
+ state: z8.enum(LANE_STATES),
2739
+ launched_at: z8.string().optional(),
2740
+ changed_at: z8.string(),
2741
+ changed_by: z8.string(),
2742
+ stuck: z8.array(stuck_schema).optional()
2743
+ });
2744
+ var TRANSITIONS = {
2745
+ open: ["open", "running", "ended"],
2746
+ running: ["running", "paused", "ended"],
2747
+ paused: ["paused", "running", "ended"],
2748
+ ended: ["ended", "open"]
2749
+ };
2750
+ function state_path(directory, issue2) {
2751
+ return durable_state.path(STATE_PREFIX, directory, `-${issue2}${STATE_SUFFIX}`);
2752
+ }
2753
+ function is_allowed(from, to) {
2754
+ return from === void 0 || TRANSITIONS[from].includes(to);
2755
+ }
2756
+ function read_record2(directory, issue2) {
2757
+ const raw = stamp_file.read_stamp_text(state_path(directory, issue2));
2758
+ return raw === void 0 ? void 0 : json_value.parse_with(raw, lane_state_schema2);
2759
+ }
2760
+ function write_record(directory, record2) {
2761
+ stamp_file.replace_stamp(state_path(directory, record2.issue), record2);
2762
+ }
2763
+ function current_run(directory) {
2764
+ const carried = run_carry.read_carry(run_carry.carry_path(directory));
2765
+ if (carried.kind !== "carried") return void 0;
2766
+ return { started_at: carried.carry.started_at, owner_pid: carried.carry.owner_pid };
2767
+ }
2768
+ function launch_fields(change, directory, now) {
2769
+ if (change.is_launch !== true) return {};
2770
+ return { run: current_run(directory), launched_at: now.toISOString() };
2771
+ }
2772
+ function next_record(change, previous, directory, now) {
2773
+ return {
2774
+ // An open starts a fresh life: a reopened lane keeps nothing of the run that launched it before.
2775
+ ...change.state !== "open" && previous,
2776
+ issue: change.issue,
2777
+ state: change.state,
2778
+ changed_at: now.toISOString(),
2779
+ changed_by: change.command,
2780
+ ...launch_fields(change, directory, now)
2781
+ };
2782
+ }
2783
+ function apply_held(change, directory, now) {
2784
+ const previous = read_record2(directory, change.issue);
2785
+ if (!is_allowed(previous?.state, change.state)) {
2786
+ return { kind: "skipped", reason: `no ${previous?.state ?? ""} \u2192 ${change.state} transition` };
2787
+ }
2788
+ const record2 = next_record(change, previous, directory, now);
2789
+ write_record(directory, record2);
2790
+ return { kind: "written", record: record2 };
2791
+ }
2792
+ var NO_DIRECTORY = { kind: "skipped", reason: "no git directory" };
2793
+ function locked(directory, issue2, held) {
2794
+ const lock = `${state_path(directory, issue2)}${LOCK_SUFFIX2}`;
2795
+ const outcome = repository_lock.with_lock_sync(held, lock, LOCK_WAIT_MS2);
2796
+ return outcome ?? { kind: "skipped", reason: `gave up waiting for the lock at ${lock}` };
2797
+ }
2798
+ function apply(change, directory, now) {
2799
+ return locked(directory, change.issue, () => apply_held(change, directory, now));
2800
+ }
2801
+ function warn(change, reason) {
2802
+ console.warn(
2803
+ `${change.command} ${session_cite.issue(change.issue)}: lane state not recorded \u2014 ${reason}`
2804
+ );
2805
+ }
2806
+ async function resolve_directory(directory) {
2807
+ return directory ?? await run_carry.repository_directory();
2808
+ }
2809
+ async function outcome_of(change, options) {
2810
+ const directory = await resolve_directory(options.directory);
2811
+ if (directory === void 0) return NO_DIRECTORY;
2812
+ return apply(change, directory, options.now ?? /* @__PURE__ */ new Date());
2813
+ }
2814
+ async function settled(write) {
2815
+ try {
2816
+ return await write();
2817
+ } catch (error) {
2818
+ return { kind: "skipped", reason: error instanceof Error ? error.message : String(error) };
2819
+ }
2820
+ }
2821
+ async function record_change(change, options = {}) {
2822
+ const outcome = await settled(async () => await outcome_of(change, options));
2823
+ if (outcome.kind === "skipped") warn(change, outcome.reason);
2824
+ return outcome;
2825
+ }
2826
+ async function read_state(issue2, directory) {
2827
+ const root2 = await resolve_directory(directory);
2828
+ return root2 === void 0 ? void 0 : read_record2(root2, issue2);
2829
+ }
2830
+ function recorded_issues(directory) {
2831
+ const empty = state_path(directory, "");
2832
+ const head = path7.basename(empty).slice(0, -STATE_SUFFIX.length);
2833
+ return readdirSync3(path7.dirname(empty)).filter((name) => name.startsWith(head) && name.endsWith(STATE_SUFFIX)).map((name) => name.slice(head.length, -STATE_SUFFIX.length)).filter((issue2) => issue2.length > 0);
2834
+ }
2835
+ async function read_records(directory) {
2836
+ const root2 = await resolve_directory(directory);
2837
+ if (root2 === void 0) return [];
2838
+ const records = recorded_issues(root2).map((issue2) => read_record2(root2, issue2));
2839
+ return records.filter((record2) => record2 !== void 0);
2840
+ }
2841
+ function stuck_held(issue2, stuck, directory) {
2842
+ const previous = read_record2(directory, issue2);
2843
+ if (previous === void 0) return { kind: "skipped", reason: "no record" };
2844
+ const record2 = { ...previous, stuck };
2845
+ write_record(directory, record2);
2846
+ return { kind: "written", record: record2 };
2847
+ }
2848
+ async function record_stuck(issue2, stuck, directory) {
2849
+ const root2 = await resolve_directory(directory);
2850
+ if (root2 === void 0) return NO_DIRECTORY;
2851
+ return locked(root2, issue2, () => stuck_held(issue2, stuck, root2));
2852
+ }
2853
+ function adopted_held(change, directory, now) {
2854
+ if (read_record2(directory, change.issue) !== void 0) {
2855
+ return { kind: "skipped", reason: "a record exists" };
2856
+ }
2857
+ return apply_held(change, directory, now);
2858
+ }
2859
+ async function adopted_outcome(change, options) {
2860
+ const directory = await resolve_directory(options.directory);
2861
+ if (directory === void 0) return NO_DIRECTORY;
2862
+ const now = options.now ?? /* @__PURE__ */ new Date();
2863
+ return locked(directory, change.issue, () => adopted_held(change, directory, now));
2864
+ }
2865
+ async function record_adopted(change, options = {}) {
2866
+ return await settled(async () => await adopted_outcome(change, options));
2867
+ }
2868
+ async function read_states(issues, directory) {
2869
+ const root2 = await resolve_directory(directory);
2870
+ if (root2 === void 0) return /* @__PURE__ */ new Map();
2871
+ const read = issues.map((issue2) => [
2872
+ issue2,
2873
+ read_record2(root2, issue2)
2874
+ ]);
2875
+ return new Map(read.filter((entry) => entry[1] !== void 0));
2876
+ }
2877
+ function paused_text(since_ms, changed_by) {
2878
+ return `paused since ${figure_format.minute_of(since_ms)} by ${changed_by}`;
2879
+ }
2880
+ function paused_note(record2) {
2881
+ if (record2?.state !== "paused") return void 0;
2882
+ return paused_text(Date.parse(record2.changed_at), record2.changed_by);
2883
+ }
2884
+ var lane_state = {
2885
+ LANE_STATES,
2886
+ NO_STATE_HINT,
2887
+ is_allowed,
2888
+ paused_note,
2889
+ paused_text,
2890
+ read_records,
2891
+ read_state,
2892
+ read_states,
2893
+ record_adopted,
2894
+ record_change,
2895
+ record_stuck,
2896
+ state_path
2897
+ };
2898
+
2899
+ // scripts/run/event/run-event-scope.ts
2900
+ var SINCE_SCOPE = "since";
2901
+ var UNKNOWN_SCOPE = "unknown";
2902
+ var UNKNOWN_EVENT_SCOPE = { kind: UNKNOWN_SCOPE };
2903
+ function moment_of(at) {
2904
+ const parsed = Date.parse(at);
2905
+ return Number.isNaN(parsed) ? void 0 : parsed;
2906
+ }
2907
+ function is_within(event, floor) {
2908
+ const at = moment_of(event.at);
2909
+ return at !== void 0 && at >= floor;
2910
+ }
2911
+ function scoped_events(events, scope) {
2912
+ if (scope.kind === UNKNOWN_SCOPE) return void 0;
2913
+ const floor = moment_of(scope.started_at);
2914
+ if (floor === void 0) return void 0;
2915
+ return events.filter((event) => is_within(event, floor));
2916
+ }
2917
+ function scope_of(read) {
2918
+ if (read.kind !== "carried") return UNKNOWN_EVENT_SCOPE;
2919
+ return { kind: SINCE_SCOPE, started_at: read.carry.started_at };
2920
+ }
2921
+ function last_scoped_event(events, scope) {
2922
+ return scoped_events(events, scope)?.findLast(
2923
+ (event) => !run_event_stream.TRACE_KINDS.has(event.kind)
2924
+ );
2925
+ }
2926
+ var SHIP_POSITION_KINDS = /* @__PURE__ */ new Set([
2927
+ run_event_stream.EVENT_KIND.SHIP_LAUNCH,
2928
+ run_event_stream.EVENT_KIND.SHIP_STOP
2929
+ ]);
2930
+ var KIND5 = run_event_stream.EVENT_KIND;
2931
+ var BATCH_RECORD_KINDS = /* @__PURE__ */ new Set([
2932
+ KIND5.CHILD_LAUNCH,
2933
+ KIND5.RESTART,
2934
+ KIND5.WITHDRAW,
2935
+ KIND5.PARK,
2936
+ KIND5.SPLIT,
2937
+ KIND5.RETROSPECTIVE,
2938
+ KIND5.STRANDED
2939
+ ]);
2940
+ var ISSUE_REFERENCE = /#(\d+)/u;
2941
+ function is_foreign_ship_event(event, issue2) {
2942
+ return SHIP_POSITION_KINDS.has(event.kind) && !event.text.startsWith(`${issue_cite.plain(issue2)} `);
2943
+ }
2944
+ function is_own_ship_event(event, issue2) {
2945
+ return SHIP_POSITION_KINDS.has(event.kind) && !is_foreign_ship_event(event, issue2);
2946
+ }
2947
+ function issue_named(event) {
2948
+ return ISSUE_REFERENCE.exec(event.text)?.[1];
2949
+ }
2950
+ function names_issue(event, issue2) {
2951
+ return issue_named(event) === issue2;
2952
+ }
2953
+ function is_lane_position(event, issue2) {
2954
+ return !BATCH_RECORD_KINDS.has(event.kind) && names_issue(event, issue2);
2955
+ }
2956
+ function since_own_launch(events, issue2) {
2957
+ const launch = events.findLastIndex(
2958
+ (event) => event.kind === KIND5.CHILD_LAUNCH && names_issue(event, issue2)
2959
+ );
2960
+ return events.slice(launch + 1);
2961
+ }
2962
+ function is_foreign_event(event, issue2, is_lane_child) {
2963
+ if (is_lane_child) return !is_lane_position(event, issue2);
2964
+ return is_foreign_ship_event(event, issue2);
2965
+ }
2966
+ function last_issue_event(events, scope, issue2, is_lane_child) {
2967
+ const attempt = is_lane_child ? since_own_launch(events, issue2) : events;
2968
+ const own = attempt.filter((event) => !is_foreign_event(event, issue2, is_lane_child));
2969
+ if (scope.kind === SINCE_SCOPE) return last_scoped_event(own, scope);
2970
+ return own.findLast((event) => is_own_ship_event(event, issue2));
2971
+ }
2972
+ var LAUNCH_OR_SETTLE_KINDS = /* @__PURE__ */ new Set([
2973
+ KIND5.CHILD_LAUNCH,
2974
+ KIND5.MERGE,
2975
+ KIND5.PARK,
2976
+ KIND5.SPLIT,
2977
+ KIND5.WITHDRAW
2978
+ ]);
2979
+ function is_merge_owed(events, scope, issue2) {
2980
+ const newest = (scoped_events(events, scope) ?? []).findLast(
2981
+ (event) => LAUNCH_OR_SETTLE_KINDS.has(event.kind) && names_issue(event, issue2)
2982
+ );
2983
+ return newest?.kind === KIND5.CHILD_LAUNCH;
2984
+ }
2985
+ function is_launch_or_withdrawal(event, issue2) {
2986
+ const is_kind = event.kind === KIND5.CHILD_LAUNCH || event.kind === KIND5.WITHDRAW;
2987
+ return is_kind && names_issue(event, issue2);
2988
+ }
2989
+ function is_withdrawn(events, issue2) {
2990
+ const newest = events.findLast((event) => is_launch_or_withdrawal(event, issue2));
2991
+ return newest?.kind === KIND5.WITHDRAW;
2992
+ }
2993
+ var run_event_scope = {
2994
+ UNKNOWN_EVENT_SCOPE,
2995
+ is_merge_owed,
2996
+ is_withdrawn,
2997
+ issue_named,
2998
+ last_issue_event,
2999
+ last_scoped_event,
3000
+ moment_of,
3001
+ scope_of,
3002
+ scoped_events,
3003
+ since_own_launch
3004
+ };
3005
+
3006
+ // scripts/lane/lane-spans.ts
3007
+ function next_start_ms(starts, issue2, from_ms) {
3008
+ const later = starts.filter((other) => other.issue === issue2 && other.at_ms > from_ms);
3009
+ return Math.min(...later.map((other) => other.at_ms));
3010
+ }
3011
+ function issue_spans(pair) {
3012
+ return pair.starts.map((start) => {
3013
+ const until_ms = next_start_ms(pair.bounds, start.issue, start.at_ms);
3014
+ return {
3015
+ from_ms: start.at_ms,
3016
+ end_ms: pair.ends.find(
3017
+ (end) => end.issue === start.issue && end.at_ms >= start.at_ms && end.at_ms < until_ms
3018
+ )?.at_ms
3019
+ };
3020
+ });
3021
+ }
3022
+ var lane_spans = { issue_spans };
3023
+
3024
+ // scripts/run/board/run-board-lane-time.ts
3025
+ var KIND6 = run_event_stream.EVENT_KIND;
3026
+ var LAUNCH_KINDS = /* @__PURE__ */ new Set([KIND6.CHILD_LAUNCH, KIND6.RESTART]);
3027
+ var OFF_LANE_KINDS = /* @__PURE__ */ new Set([
3028
+ KIND6.MERGE,
3029
+ KIND6.PARK,
3030
+ KIND6.WITHDRAW,
3031
+ KIND6.OUTAGE,
3032
+ KIND6.USAGE_LIMIT,
3033
+ KIND6.SPLIT,
3034
+ KIND6.STOP
3035
+ ]);
3036
+ function moments_of(events, kinds) {
3037
+ return events.filter((event) => kinds.has(event.kind)).map((event) => ({
3038
+ issue: Number(run_event_scope.issue_named(event)),
3039
+ at_ms: Date.parse(event.at)
3040
+ }));
3041
+ }
3042
+ function spans_of(events) {
3043
+ const launches = moments_of(events, LAUNCH_KINDS);
3044
+ const ends = moments_of(events, OFF_LANE_KINDS);
3045
+ const issues = new Set(launches.map((launch) => launch.issue));
3046
+ return new Map(
3047
+ [...issues].map((issue2) => {
3048
+ const starts = launches.filter((launch) => launch.issue === issue2);
3049
+ return [issue2, lane_spans.issue_spans({ starts, bounds: starts, ends })];
3050
+ })
3051
+ );
3052
+ }
3053
+ function span_ms(span, until_ms, end_ms) {
3054
+ return Math.max(0, Math.min(span.end_ms ?? until_ms, end_ms) - span.from_ms);
3055
+ }
3056
+ function in_lane_ms(spans, end_ms) {
3057
+ return spans.reduce(
3058
+ (total, span, index) => total + span_ms(span, spans[index + 1]?.from_ms ?? end_ms, end_ms),
3059
+ 0
3060
+ );
3061
+ }
3062
+ function elapsed_of(spans, started_ms, ended_ms) {
3063
+ return spans.length === 0 ? ended_ms - started_ms : in_lane_ms(spans, ended_ms);
3064
+ }
3065
+ function launched_ms(record2) {
3066
+ const launched_at = record2?.launched_at;
3067
+ return launched_at === void 0 ? void 0 : Date.parse(launched_at);
3068
+ }
3069
+ function counted_from(run, started_ms) {
3070
+ return run === void 0 ? started_ms : Date.parse(run.started_at);
3071
+ }
3072
+ function is_ended(spans) {
3073
+ return spans.at(-1)?.end_ms !== void 0;
3074
+ }
3075
+ function ending_elapsed(read) {
3076
+ const started_ms = launched_ms(read.record);
3077
+ if (started_ms === void 0) return void 0;
3078
+ const from_ms = counted_from(read.record?.run, started_ms);
3079
+ const spans = (spans_of(read.events).get(read.issue) ?? []).filter(
3080
+ (span) => span.from_ms >= from_ms
3081
+ );
3082
+ return is_ended(spans) ? void 0 : elapsed_of(spans, started_ms, read.ended_ms);
3083
+ }
3084
+ var run_board_lane_time = {
3085
+ LAUNCH_KINDS,
3086
+ OFF_LANE_KINDS,
3087
+ elapsed_of,
3088
+ ending_elapsed,
3089
+ in_lane_ms,
3090
+ spans_of
3091
+ };
3092
+
3093
+ // scripts/run/event/run-event-stream-emit.ts
3094
+ function now_iso2() {
3095
+ return (/* @__PURE__ */ new Date()).toISOString();
3096
+ }
3097
+ async function stream_target() {
3098
+ const repository = await run_carry.repository_directory();
3099
+ return repository === void 0 ? void 0 : run_event_stream.target_of(repository);
3100
+ }
3101
+ async function lane_record(issue2) {
3102
+ try {
3103
+ return await lane_state.read_state(issue2);
3104
+ } catch (error) {
3105
+ error_text.trace_swallowed("run_event_stream_emit.lane_record", error);
3106
+ return void 0;
3107
+ }
3108
+ }
3109
+ async function ending_fields(target2, event) {
3110
+ const issue2 = run_event_scope.issue_named(event);
3111
+ if (issue2 === void 0 || !run_board_lane_time.OFF_LANE_KINDS.has(event.kind)) return {};
3112
+ const elapsed_ms = run_board_lane_time.ending_elapsed({
3113
+ events: run_event_stream.read_events(target2),
3114
+ issue: Number(issue2),
3115
+ record: await lane_record(issue2),
3116
+ ended_ms: Date.parse(event.at)
3117
+ });
3118
+ return elapsed_ms === void 0 ? {} : { elapsed_ms };
3119
+ }
3120
+ async function append_at(target2, kind, text2, at) {
3121
+ const event = { kind, text: text2, at: at.toISOString() };
3122
+ return run_event_stream.append_event(target2, {
3123
+ ...event,
3124
+ ...await ending_fields(target2, event)
3125
+ });
3126
+ }
3127
+ async function emit(kind, text2, at = /* @__PURE__ */ new Date()) {
3128
+ try {
3129
+ const target2 = await stream_target();
3130
+ if (target2 === void 0) return;
3131
+ await append_at(target2, kind, text2, at);
3132
+ } catch {
3133
+ }
3134
+ }
3135
+ async function emit_once(kind, text2) {
3136
+ try {
3137
+ const target2 = await stream_target();
3138
+ if (target2 === void 0 || run_event_stream.read_last(target2)?.kind === kind) return false;
3139
+ return run_event_stream.append(target2, kind, text2, now_iso2()).appended;
3140
+ } catch (error) {
3141
+ error_text.trace_swallowed("run_event_stream_emit.emit_once", error);
3142
+ return false;
3143
+ }
3144
+ }
3145
+ function invocation_events(repository, target2) {
3146
+ const events = run_event_stream.read_events(target2);
3147
+ const scope = run_event_scope.scope_of(run_carry.read_carry(run_carry.carry_path(repository)));
3148
+ return run_event_scope.scoped_events(events, scope) ?? events;
3149
+ }
3150
+ async function emit_once_since_with(kind, reset_kind, compose) {
3151
+ try {
3152
+ const repository = await run_carry.repository_directory();
3153
+ if (repository === void 0) return void 0;
3154
+ const target2 = run_event_stream.target_of(repository);
3155
+ if (run_event_stream.has_since(invocation_events(repository, target2), kind, reset_kind)) {
3156
+ return void 0;
3157
+ }
3158
+ const text2 = await compose();
3159
+ return run_event_stream.append(target2, kind, text2, now_iso2()).appended ? text2 : void 0;
3160
+ } catch (error) {
3161
+ error_text.trace_swallowed("run_event_stream_emit.emit_once_since", error);
3162
+ return void 0;
3163
+ }
3164
+ }
3165
+ async function emit_once_since(kind, text2, reset_kind) {
3166
+ const appended = await emit_once_since_with(kind, reset_kind, async () => text2);
3167
+ return appended !== void 0;
3168
+ }
3169
+ async function emit_heartbeat(line) {
3170
+ await emit(run_event_stream.EVENT_KIND.HEARTBEAT, line);
3171
+ }
3172
+ async function current_events() {
3173
+ try {
3174
+ const repository = await run_carry.repository_directory();
3175
+ if (repository === void 0) return [];
3176
+ const read = run_carry.read_carry(run_carry.carry_path(repository));
3177
+ const scope = run_event_scope.scope_of(read);
3178
+ const events = run_event_stream.read_events(run_event_stream.target_of(repository));
3179
+ return run_event_scope.scoped_events(events, scope) ?? [];
3180
+ } catch {
3181
+ return [];
3182
+ }
3183
+ }
3184
+ async function invocation_or_all_events() {
3185
+ try {
3186
+ const repository = await run_carry.repository_directory();
3187
+ return repository === void 0 ? [] : invocation_events(repository, run_event_stream.target_of(repository));
3188
+ } catch {
3189
+ return [];
3190
+ }
3191
+ }
3192
+ async function all_events() {
3193
+ try {
3194
+ const target2 = await stream_target();
3195
+ return target2 === void 0 ? [] : run_event_stream.read_events(target2);
3196
+ } catch {
3197
+ return [];
3198
+ }
3199
+ }
3200
+ var run_event_stream_emit = {
3201
+ all_events,
3202
+ append_at,
3203
+ current_events,
3204
+ emit,
3205
+ emit_heartbeat,
3206
+ emit_once,
3207
+ emit_once_since,
3208
+ emit_once_since_with,
3209
+ invocation_or_all_events,
3210
+ stream_target
3211
+ };
3212
+
3213
+ // ports/index.js
3214
+ import { existsSync as existsSync2 } from "node:fs";
3215
+ import path8 from "node:path";
3216
+ var PORT_SEED_KEY = "PORT_SEED";
3217
+ var LANE_SEAT_KEY = "JOSH_LANE_SEAT";
3218
+ var ENV_FILE_NAME = ".env";
3219
+ var PACKAGE_FILE_NAME = "package.json";
3220
+ var PROJECT_ENVIRONMENT_KEYS = /* @__PURE__ */ new Set([PORT_SEED_KEY, LANE_SEAT_KEY, "PLAYWRIGHT_REUSE_SERVER"]);
3221
+ var DEV_PORT_BASE = 5173;
3222
+ var PREVIEW_PORT_BASE = 4173;
3223
+ var MIN_SEED = 0;
3224
+ var SEED_LANE_MULTIPLIER = 10;
3225
+ var MAX_LANE = 9;
3226
+ var MAX_SEED = 99;
3227
+ var INTEGER_PATTERN = /^\d+$/u;
3228
+ function fail_invalid(key, raw, max) {
3229
+ throw new Error(
3230
+ `${key} must be an integer between ${MIN_SEED} and ${max}, got ${JSON.stringify(raw)}. Unset it to use the default ports (dev ${DEV_PORT_BASE}, preview ${PREVIEW_PORT_BASE}).`
3231
+ );
3232
+ }
3233
+ function read_trimmed(environment, key) {
3234
+ const raw = environment[key];
3235
+ return raw === void 0 ? "" : raw.trim();
3236
+ }
3237
+ function resolve_bounded(environment, key, max) {
3238
+ const trimmed = read_trimmed(environment, key);
3239
+ if (trimmed.length === 0) return MIN_SEED;
3240
+ if (!INTEGER_PATTERN.test(trimmed)) fail_invalid(key, trimmed, max);
3241
+ const value = Number(trimmed);
3242
+ if (value > max) fail_invalid(key, trimmed, max);
3243
+ return value;
3244
+ }
3245
+ function resolve_seed(environment = process.env) {
3246
+ return resolve_bounded(environment, PORT_SEED_KEY, MAX_SEED);
3247
+ }
3248
+ function resolve_lane(environment = process.env) {
3249
+ return resolve_bounded(environment, LANE_SEAT_KEY, MAX_LANE);
3250
+ }
3251
+ function resolve_offset(environment = process.env) {
3252
+ return resolve_seed(environment) * SEED_LANE_MULTIPLIER + resolve_lane(environment);
3253
+ }
3254
+ function offset_from(base, environment) {
3255
+ return base + resolve_offset(environment);
3256
+ }
3257
+ function resolve_development_port(environment = process.env) {
3258
+ return offset_from(DEV_PORT_BASE, environment);
3259
+ }
3260
+ function resolve_preview_port(environment = process.env) {
3261
+ return offset_from(PREVIEW_PORT_BASE, environment);
3262
+ }
3263
+ function resolve_project_directory(directory) {
3264
+ const start = path8.resolve(directory);
3265
+ let current = start;
3266
+ while (!existsSync2(path8.join(current, PACKAGE_FILE_NAME))) {
3267
+ const parent = path8.dirname(current);
3268
+ if (parent === current) return start;
3269
+ current = parent;
3270
+ }
3271
+ return current;
3272
+ }
3273
+ function discard_loaded_keys(snapshot) {
3274
+ for (const key of Object.keys(process.env)) {
3275
+ if (!PROJECT_ENVIRONMENT_KEYS.has(key) && !Object.hasOwn(snapshot, key)) {
3276
+ Reflect.deleteProperty(process.env, key);
3277
+ }
3278
+ }
3279
+ }
3280
+ function load_environment_file(directory = process.cwd()) {
3281
+ const file = path8.join(resolve_project_directory(directory), ENV_FILE_NAME);
3282
+ if (!existsSync2(file)) return false;
3283
+ const snapshot = { ...process.env };
3284
+ process.loadEnvFile(file);
3285
+ discard_loaded_keys(snapshot);
3286
+ return true;
3287
+ }
3288
+ var ports = {
3289
+ load_environment_file,
3290
+ resolve_project_directory,
3291
+ resolve_seed,
3292
+ resolve_lane,
3293
+ resolve_development_port,
3294
+ resolve_preview_port
3295
+ };
3296
+
3297
+ // scripts/josh/josh-command-types.ts
3298
+ var OPTIONAL_ENV_FILE_FLAGS = [`--env-file-if-exists=${ENV_FILE_NAME}`];
3299
+ var ESLINT_CACHE_FILE = ".eslintcache";
3300
+ var TS_BUILD_INFO_FILE = ".tsbuildinfo";
3301
+ var CSPELL_CACHE_FILE = ".cspellcache";
3302
+ var ESLINT_EDIT_CACHE_FILE = ".eslintcache.edit";
3303
+ var ESLINT_RELATED_CACHE_FILE = ".eslintcache.related";
3304
+ var PRETTIER_CACHE_FILE = ".prettiercache";
3305
+ var PRETTIER_RELATED_CACHE_FILE = ".prettiercache.related";
3306
+ var CSPELL_COMMIT_CACHE_FILE = ".cspellcache.commit";
3307
+ var ESLINT_COMMIT_CACHE_FILE = ".eslintcache.commit";
3308
+ var ROOTED_JSON_PORTABILITY = "rooted-json";
3309
+ var ESLINT_CACHE_SPEC = {
3310
+ cache_file: ESLINT_CACHE_FILE,
3311
+ portability: ROOTED_JSON_PORTABILITY
3312
+ };
3313
+ var TS_CACHE_SPEC = {
3314
+ cache_file: TS_BUILD_INFO_FILE,
3315
+ portability: "raw"
3316
+ };
3317
+ var CSPELL_CACHE_SPEC = {
3318
+ cache_file: CSPELL_CACHE_FILE,
3319
+ portability: "raw"
3320
+ };
3321
+ var GATE_CACHE_SPECS = [
3322
+ ESLINT_CACHE_SPEC,
3323
+ TS_CACHE_SPEC,
3324
+ CSPELL_CACHE_SPEC
3325
+ ];
3326
+ var GATE_CACHE_FILES = GATE_CACHE_SPECS.map((spec) => spec.cache_file);
3327
+ var IGNORED_CACHE_FILES = [
3328
+ ...GATE_CACHE_FILES,
3329
+ ESLINT_EDIT_CACHE_FILE,
3330
+ ESLINT_RELATED_CACHE_FILE,
3331
+ PRETTIER_CACHE_FILE,
3332
+ PRETTIER_RELATED_CACHE_FILE,
3333
+ CSPELL_COMMIT_CACHE_FILE,
3334
+ ESLINT_COMMIT_CACHE_FILE
3335
+ ];
3336
+ var CONTENT_CACHE_FLAGS = ["--cache", "--cache-strategy", "content"];
3337
+ var CACHE_LOCATION_FLAG = "--cache-location";
3338
+ function content_cache_flags(cache_file) {
3339
+ return [...CONTENT_CACHE_FLAGS, CACHE_LOCATION_FLAG, cache_file];
3340
+ }
3341
+ var ESLINT_CACHE_FLAGS = content_cache_flags(ESLINT_CACHE_FILE);
3342
+ var ESLINT_EDIT_CACHE_FLAGS = content_cache_flags(ESLINT_EDIT_CACHE_FILE);
3343
+ var ESLINT_RELATED_CACHE_FLAGS = content_cache_flags(ESLINT_RELATED_CACHE_FILE);
3344
+ var CSPELL_CACHE_FLAGS = content_cache_flags(CSPELL_CACHE_FILE);
3345
+ var PRETTIER_CACHE_FLAGS = content_cache_flags(PRETTIER_CACHE_FILE);
3346
+ var PRETTIER_RELATED_CACHE_FLAGS = content_cache_flags(PRETTIER_RELATED_CACHE_FILE);
3347
+ var CSPELL_COMMIT_CACHE_FLAGS = content_cache_flags(CSPELL_COMMIT_CACHE_FILE);
3348
+ var ESLINT_COMMIT_CACHE_FLAGS = content_cache_flags(ESLINT_COMMIT_CACHE_FILE);
3349
+
3350
+ // scripts/lib/ancestor-directories.ts
3351
+ import path9 from "node:path";
3352
+ var MAX_DEPTH = 64;
3353
+ function list(start_directory) {
3354
+ const directories = [];
3355
+ let current = path9.resolve(start_directory);
3356
+ while (directories.length < MAX_DEPTH && !directories.includes(current)) {
3357
+ directories.push(current);
3358
+ current = path9.dirname(current);
3359
+ }
3360
+ return directories;
3361
+ }
3362
+ function nearest(start_directory, is_match) {
3363
+ return list(start_directory).find((directory) => is_match(directory));
3364
+ }
3365
+ var ancestor_directories = { list, nearest };
3366
+
3367
+ // scripts/lib/package-manifest.ts
3368
+ import { readFileSync as readFileSync4 } from "node:fs";
3369
+ import path10 from "node:path";
3370
+ var PACKAGE_JSON = "package.json";
3371
+ function manifest_path(directory) {
3372
+ return path10.join(directory, PACKAGE_JSON);
3373
+ }
3374
+ function read_manifest(directory, schema) {
3375
+ const text2 = readFileSync4(manifest_path(directory), "utf8");
3376
+ return schema.parse(JSON.parse(text2));
3377
+ }
3378
+ function read_manifest_if_valid(directory, schema) {
3379
+ const text2 = file_reader.read_if_readable(manifest_path(directory));
3380
+ if (text2 === void 0) return void 0;
3381
+ return json_value.parse_with(text2, schema);
3382
+ }
3383
+ var package_manifest = { manifest_path, read_manifest, read_manifest_if_valid };
3384
+
3385
+ // scripts/gate/toolchain-inputs.ts
3386
+ import { createHash } from "node:crypto";
3387
+ import { existsSync as existsSync3, readdirSync as readdirSync4, readFileSync as readFileSync5 } from "node:fs";
3388
+ import path11 from "node:path";
3389
+ var PACKAGE_FILES = [
3390
+ "package.json",
3391
+ "pnpm-lock.yaml",
3392
+ "pnpm-workspace.yaml",
3393
+ "package-lock.json",
3394
+ "yarn.lock",
3395
+ "bun.lock",
3396
+ "bun.lockb",
3397
+ ".npmrc",
3398
+ "node_modules/.modules.yaml"
3399
+ ];
3400
+ var CONFIG_ENTRIES = [
3401
+ /^eslint\.config\.[cm]?[jt]s$/u,
3402
+ /^tsconfig(?:\.[\w-]+)?\.json$/u
3403
+ ];
3404
+ var CONFIG_DIRECTORIES = /* @__PURE__ */ new Set(["eslint", "tsconfig"]);
3405
+ var TEST_MARKER = ".test.";
3406
+ var SEPARATOR = "/";
3407
+ var DIGEST_ALGORITHM = "sha256";
3408
+ function by_code_unit(left, right) {
3409
+ if (left === right) return 0;
3410
+ return left < right ? -1 : 1;
3411
+ }
3412
+ function to_posix(relative) {
3413
+ return relative.split(path11.sep).join(SEPARATOR);
3414
+ }
3415
+ function is_config_entry(name) {
3416
+ return CONFIG_ENTRIES.some((entry) => entry.test(name));
3417
+ }
3418
+ function is_config_module(relative) {
3419
+ const [top = ""] = relative.split(SEPARATOR, 1);
3420
+ return CONFIG_DIRECTORIES.has(top) && !path11.basename(relative).includes(TEST_MARKER);
3421
+ }
3422
+ function is_input(relative) {
3423
+ const posix = to_posix(relative);
3424
+ if (PACKAGE_FILES.includes(posix)) return true;
3425
+ return is_config_entry(posix) || is_config_module(posix);
3426
+ }
3427
+ function modules_under(root2, directory) {
3428
+ const absolute = path11.join(root2, directory);
3429
+ if (!existsSync3(absolute)) return [];
3430
+ return readdirSync4(absolute, { recursive: true, withFileTypes: true }).filter((entry) => entry.isFile()).map((entry) => to_posix(path11.relative(root2, path11.join(entry.parentPath, entry.name)))).filter((relative) => is_config_module(relative));
3431
+ }
3432
+ function paths(root2) {
3433
+ const present = PACKAGE_FILES.filter((relative) => existsSync3(path11.join(root2, relative)));
3434
+ const entries = readdirSync4(root2).filter((name) => is_config_entry(name));
3435
+ const modules = [...CONFIG_DIRECTORIES].flatMap((directory) => modules_under(root2, directory));
3436
+ return [...present, ...entries, ...modules].toSorted(by_code_unit);
3437
+ }
3438
+ function read_or_empty(file) {
3439
+ try {
3440
+ return readFileSync5(file);
3441
+ } catch {
3442
+ return new Uint8Array();
3443
+ }
3444
+ }
3445
+ function digest(root2) {
3446
+ const hash = createHash(DIGEST_ALGORITHM);
3447
+ for (const relative of paths(root2)) {
3448
+ hash.update(`${relative}\0`).update(read_or_empty(path11.join(root2, relative))).update("\0");
3449
+ }
3450
+ return hash.digest("hex");
3451
+ }
3452
+ var toolchain_inputs = { digest, is_input, PACKAGE_FILES, paths };
3453
+
3454
+ // scripts/git/git-schemas.ts
3455
+ import { z as z9 } from "zod";
3456
+ var package_name_schema = z9.object({ name: z9.string().min(1) });
3457
+ var rollup_item_schema = z9.looseObject({
3458
+ // eslint-disable-next-line @typescript-eslint/naming-convention -- GraphQL field name from GitHub API
3459
+ __typename: z9.string().nullish(),
3460
+ state: z9.string().nullish(),
3461
+ status: z9.string().nullish(),
3462
+ conclusion: z9.string().nullish(),
3463
+ name: z9.string().nullish(),
3464
+ context: z9.string().nullish(),
3465
+ description: z9.string().nullish()
3466
+ });
3467
+ var pr_raw_schema = z9.object({
3468
+ statusCheckRollup: z9.array(rollup_item_schema).optional(),
3469
+ // The base branch's required status check contexts, read from its rules — empty where none are
3470
+ // set or they could not be read (`git-gh-branch-rules.ts`).
3471
+ requiredContexts: z9.array(z9.string()).optional(),
3472
+ mergeStateStatus: z9.string().optional(),
3473
+ reviewDecision: z9.string().optional(),
3474
+ headRefOid: z9.string().optional()
3475
+ });
3476
+ var pull_comment_schema = z9.object({
3477
+ body: z9.string().optional(),
3478
+ html_url: z9.string().optional(),
3479
+ user: z9.object({ login: z9.string().optional() }).optional()
3480
+ });
3481
+ var ai_review_pull_comment_schema = z9.object({
3482
+ body: z9.string().optional(),
3483
+ url: z9.string().optional(),
3484
+ author: z9.object({ login: z9.string().optional() }).optional(),
3485
+ updatedAt: z9.string().optional()
3486
+ });
3487
+ var pr_info_schema = z9.object({
3488
+ mergeable: z9.union([z9.boolean(), z9.string()]).nullable().optional(),
3489
+ mergeStateStatus: z9.string().nullable().optional(),
3490
+ state: z9.string().optional()
3491
+ });
3492
+ var epic_issue_schema = z9.object({
3493
+ number: z9.number(),
3494
+ body: z9.string().optional(),
3495
+ // REST answers null for an issue never closed and `reopened` for one a person reopened.
3496
+ stateReason: z9.string().nullish()
3497
+ });
3498
+ var blocking_issue_schema = z9.object({
3499
+ number: z9.number(),
3500
+ state: z9.string().optional(),
3501
+ repository_url: z9.string().optional()
3502
+ });
3503
+ var blocked_by_schema = z9.object({
3504
+ nodes: z9.array(blocking_issue_schema).default([]),
3505
+ totalCount: z9.number().optional()
3506
+ }).optional();
3507
+ var epic_child_schema = z9.object({
3508
+ state: z9.string().optional(),
3509
+ blockedBy: blocked_by_schema
3510
+ });
3511
+ var rest_comment_schema = z9.looseObject({
3512
+ body: z9.string().nullish(),
3513
+ html_url: z9.string().optional(),
3514
+ user: z9.looseObject({ login: z9.string().optional() }).nullish(),
3515
+ updated_at: z9.string().optional()
3516
+ });
3517
+ var issue_label_schema = z9.object({ name: z9.string() });
3518
+ var epic_subject_schema = z9.object({
3519
+ number: z9.number(),
3520
+ state: z9.string().optional(),
3521
+ labels: z9.array(issue_label_schema).optional(),
3522
+ body: z9.string().optional()
3523
+ });
3524
+ var author_fields_schema = {
3525
+ author_association: z9.string().nullish(),
3526
+ user: z9.looseObject({ login: z9.string() }).nullish()
3527
+ };
3528
+ var open_issue_schema = z9.object({
3529
+ number: z9.number(),
3530
+ title: z9.string(),
3531
+ labels: z9.array(issue_label_schema).optional(),
3532
+ createdAt: z9.string(),
3533
+ blockedBy: blocked_by_schema,
3534
+ // Present only on the pickup listing, which reads it for the paths each issue declares.
3535
+ body: z9.string().optional(),
3536
+ ...author_fields_schema,
3537
+ // Assembled by the pickup from the author above, never read off the listing: whether the author
3538
+ // has write access. Absent on every other listing.
3539
+ author_trusted: z9.boolean().optional()
3540
+ });
3541
+
3542
+ export {
3543
+ json_value,
3544
+ file_reader,
3545
+ figure_format,
3546
+ pr_raw_schema,
3547
+ epic_issue_schema,
3548
+ blocking_issue_schema,
3549
+ blocked_by_schema,
3550
+ rest_comment_schema,
3551
+ issue_label_schema,
3552
+ author_fields_schema,
3553
+ open_issue_schema,
3554
+ durable_state,
3555
+ process_identity,
3556
+ issue_number_shape,
3557
+ cli_flags,
3558
+ run_invocation,
3559
+ lane_paths,
3560
+ time_instant,
3561
+ cost_usage,
3562
+ cost_transcript,
3563
+ agent_session_environment,
3564
+ own_session,
3565
+ run_carry,
3566
+ lane_ledger_schema,
3567
+ lane_ledger_write,
3568
+ issue_cite,
3569
+ process_owner_schema,
3570
+ repository_lock,
3571
+ run_ship_stage,
3572
+ run_event_stream,
3573
+ issue_citation,
3574
+ session_cite,
3575
+ lane_state,
3576
+ run_event_scope,
3577
+ run_event_stream_emit,
3578
+ PORT_SEED_KEY,
3579
+ LANE_SEAT_KEY,
3580
+ ENV_FILE_NAME,
3581
+ ports,
3582
+ OPTIONAL_ENV_FILE_FLAGS,
3583
+ ESLINT_RELATED_CACHE_FILE,
3584
+ ESLINT_EDIT_CACHE_FLAGS,
3585
+ ESLINT_RELATED_CACHE_FLAGS,
3586
+ PRETTIER_RELATED_CACHE_FLAGS,
3587
+ ancestor_directories,
3588
+ PACKAGE_JSON,
3589
+ package_manifest,
3590
+ toolchain_inputs
3591
+ };