@joshuafolkken/kit 1.1240.0 → 1.1373.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 (934) hide show
  1. package/.claude/agents/investigator.md +1 -0
  2. package/.claude/settings.json +4 -0
  3. package/.claude/skills/dependency-update/SKILL.md +5 -3
  4. package/.claude/skills/epic-commands/SKILL.md +82 -113
  5. package/.claude/skills/epic-commands/epic-bundle.md +38 -63
  6. package/.claude/skills/epic-commands/execution-waves.md +30 -51
  7. package/.claude/skills/verify-ui/SKILL.md +13 -20
  8. package/.claude/skills/workflow-commands/SKILL.md +10 -10
  9. package/.claude/skills/workflow-commands/background-commands.md +4 -4
  10. package/.claude/skills/workflow-commands/backlogrun-child.md +30 -105
  11. package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +29 -0
  12. package/.claude/skills/workflow-commands/backlogrun-lanes.md +45 -131
  13. package/.claude/skills/workflow-commands/backlogrun-park.md +36 -53
  14. package/.claude/skills/workflow-commands/backlogrun-progress.md +81 -331
  15. package/.claude/skills/workflow-commands/backlogrun-recovery.md +29 -83
  16. package/.claude/skills/workflow-commands/backlogrun-steps.md +105 -424
  17. package/.claude/skills/workflow-commands/backlogrun.md +52 -61
  18. package/.claude/skills/workflow-commands/chain-rule.md +36 -40
  19. package/.claude/skills/workflow-commands/entry-sequence.md +6 -6
  20. package/.claude/skills/workflow-commands/followup.md +19 -20
  21. package/.claude/skills/workflow-commands/fullrun-steps.md +23 -27
  22. package/.claude/skills/workflow-commands/fullrun.md +10 -10
  23. package/.claude/skills/workflow-commands/halfrun.md +9 -8
  24. package/.claude/skills/workflow-commands/into-target.md +12 -18
  25. package/.claude/skills/workflow-commands/issue-comments.md +11 -26
  26. package/.claude/skills/workflow-commands/kickoff.md +26 -16
  27. package/.claude/skills/workflow-commands/latest-gate.md +17 -28
  28. package/.claude/skills/workflow-commands/needs-human-review.md +13 -24
  29. package/.claude/skills/workflow-commands/observation-filing.md +37 -28
  30. package/.claude/skills/workflow-commands/observation-ledger.md +48 -38
  31. package/.claude/skills/workflow-commands/pre-gate-cut.md +9 -9
  32. package/.claude/skills/workflow-commands/prerequisite.md +23 -15
  33. package/.claude/skills/workflow-commands/progress-watcher.md +17 -11
  34. package/.claude/skills/workflow-commands/prrun.md +3 -3
  35. package/.claude/skills/workflow-commands/retrospective.md +13 -18
  36. package/.claude/skills/workflow-commands/split-assessment.md +6 -4
  37. package/.claude/skills/workflow-commands/target-repository.md +25 -28
  38. package/.claude/skills/workflow-commands/working-tree-hold.md +11 -17
  39. package/.gitattributes +2 -1
  40. package/.github/workflows/ci.yml +14 -0
  41. package/.vscode/tasks.json +14 -0
  42. package/CLAUDE.md +10 -61
  43. package/README.md +23 -66
  44. package/SECURITY.md +1 -1
  45. package/dist/CLAUDE.md +10 -61
  46. package/dist/commands/document-section-cli.js +43 -11
  47. package/dist/config-merge/index.js +11 -2
  48. package/dist/hooks/audit-provision.js +2 -2
  49. package/dist/hooks/batch-guard.js +7 -7
  50. package/dist/hooks/{chunk-KHGB5S3Y.js → chunk-7UBFU3CL.js} +18 -20
  51. package/dist/hooks/{chunk-ZQGD4GBY.js → chunk-7WKYHEGU.js} +8 -44
  52. package/dist/hooks/{chunk-4TZVB44A.js → chunk-AKGCP4LX.js} +285 -363
  53. package/dist/hooks/{chunk-QVSWU24O.js → chunk-BZMPVFDY.js} +7 -5
  54. package/dist/hooks/{chunk-5VNDSNG3.js → chunk-FZ6FUSBM.js} +1 -1
  55. package/dist/hooks/{chunk-GPTFMK5E.js → chunk-GG72ANKI.js} +1 -1
  56. package/dist/hooks/{chunk-XZYKEM6J.js → chunk-JCRDBQXB.js} +13 -11
  57. package/dist/hooks/{chunk-F3ELQ2AF.js → chunk-JGW24KKM.js} +4 -4
  58. package/dist/hooks/{chunk-ELCN5LCH.js → chunk-NEC4AT4Z.js} +34 -12
  59. package/dist/hooks/chunk-NZN2UFI6.js +2409 -0
  60. package/dist/hooks/{chunk-WK2XSHSI.js → chunk-SLSFIWTX.js} +550 -875
  61. package/dist/hooks/chunk-UTHMB4O2.js +1590 -0
  62. package/dist/hooks/{chunk-KRBERBBI.js → chunk-V4TKZHER.js} +4 -4
  63. package/dist/hooks/chunk-YLBBSSTF.js +3705 -0
  64. package/dist/hooks/chunk-Z5TMJIPW.js +45 -0
  65. package/dist/hooks/codex-hook-adapter.js +26 -21
  66. package/dist/hooks/duplicate-read-guard.js +8 -8
  67. package/dist/hooks/format-edited.js +4 -4
  68. package/dist/hooks/inputs.json +195 -181
  69. package/dist/hooks/investigation-guard.js +8 -8
  70. package/dist/hooks/pretool-guard.js +15 -15
  71. package/dist/hooks/session-lang.js +406 -8
  72. package/dist/hooks/stop-guard.js +122 -187
  73. package/dist/josh.js +282 -95
  74. package/dist/version/index.js +15 -13
  75. package/eslint/base.js +43 -5
  76. package/eslint/rules/english-only-prose.js +3 -3
  77. package/eslint/rules/import.js +12 -0
  78. package/eslint/rules/namespace-object-export.js +2 -2
  79. package/package.json +17 -11
  80. package/pnpm-workspace.yaml +2 -4
  81. package/prompts/coding-standards.md +14 -48
  82. package/prompts/collaboration-workflow/file-edits.md +1 -1
  83. package/prompts/collaboration-workflow/issue-citation.md +1 -1
  84. package/prompts/collaboration-workflow/issue-template.md +3 -10
  85. package/prompts/collaboration-workflow/operating-rules.md +7 -8
  86. package/prompts/collaboration-workflow/output-bounds.md +1 -1
  87. package/prompts/collaboration-workflow/overview.md +1 -1
  88. package/prompts/collaboration-workflow/plan-comment.md +2 -1
  89. package/prompts/collaboration-workflow/principles.md +21 -3
  90. package/prompts/collaboration-workflow/report-format.md +16 -29
  91. package/prompts/collaboration-workflow/residency.md +1 -1
  92. package/prompts/collaboration-workflow/rule-delivery.md +7 -95
  93. package/prompts/collaboration-workflow/shell-body.md +3 -23
  94. package/prompts/collaboration-workflow/turn-batching.md +4 -13
  95. package/prompts/collaboration-workflow/wip-cap.md +5 -11
  96. package/prompts/refactoring.md +1 -1
  97. package/prompts/review-rubric.md +3 -22
  98. package/prompts/review.md +15 -38
  99. package/prompts/testing-guide.md +2 -4
  100. package/scripts/adopt/adopt-logic.ts +5 -5
  101. package/scripts/adopt/adopt-toolkits.ts +4 -5
  102. package/scripts/adopt/adopt.ts +2 -3
  103. package/scripts/agent/agent-argv.ts +7 -7
  104. package/scripts/agent/agent-diagnostics.ts +2 -2
  105. package/scripts/agent/agent-exit-record.ts +1 -1
  106. package/scripts/agent/agent-headless.ts +1 -1
  107. package/scripts/agent/agent-launch-environment.ts +6 -1
  108. package/scripts/agent/agent-role-profile.ts +49 -22
  109. package/scripts/agent/agent-session-role.ts +32 -0
  110. package/scripts/agent/api-outage.ts +1 -1
  111. package/scripts/agent/claude-agent-argv.ts +4 -4
  112. package/scripts/agent/claude-result-event.ts +4 -4
  113. package/scripts/agent/codex-hooks.ts +2 -2
  114. package/scripts/agent/interactive-ask.ts +3 -6
  115. package/scripts/auto-ok/auto-ok-cli.ts +46 -60
  116. package/scripts/backlog/backlog-arrival-added.ts +34 -0
  117. package/scripts/backlog/backlog-arrival.ts +54 -17
  118. package/scripts/backlog/backlog-budget-cli.ts +34 -6
  119. package/scripts/backlog/backlog-budget.ts +17 -24
  120. package/scripts/backlog/backlog-defect-priority.ts +1 -1
  121. package/scripts/backlog/backlog-drive-args.ts +5 -4
  122. package/scripts/backlog/backlog-drive-cli.ts +14 -10
  123. package/scripts/backlog/backlog-drive-epic.ts +85 -0
  124. package/scripts/backlog/backlog-drive-launch.ts +1 -1
  125. package/scripts/backlog/backlog-drive-named-offer.ts +60 -9
  126. package/scripts/backlog/backlog-drive-named.ts +39 -9
  127. package/scripts/backlog/backlog-drive-offer-argv.ts +1 -1
  128. package/scripts/backlog/backlog-drive-restore.ts +1 -1
  129. package/scripts/backlog/backlog-drive-retrospective.ts +2 -2
  130. package/scripts/backlog/backlog-drive.ts +43 -28
  131. package/scripts/backlog/backlog-idle.ts +88 -0
  132. package/scripts/backlog/backlog-named.ts +11 -15
  133. package/scripts/backlog/backlog-next.ts +26 -30
  134. package/scripts/backlog/backlog-offer-cli.ts +28 -23
  135. package/scripts/backlog/backlog-offer.ts +7 -7
  136. package/scripts/backlog/backlog-overlap.ts +178 -0
  137. package/scripts/backlog/backlog-plan-cli.ts +14 -90
  138. package/scripts/backlog/backlog-plan-read.ts +111 -0
  139. package/scripts/backlog/backlog-plan.ts +11 -10
  140. package/scripts/backlog/backlog-pool.ts +13 -14
  141. package/scripts/backlog/backlog-rank.ts +11 -11
  142. package/scripts/backlog/backlog-ready.ts +15 -10
  143. package/scripts/backlog/backlog-scope.ts +14 -15
  144. package/scripts/backlog/backlog-stalled-cli.ts +2 -2
  145. package/scripts/backlog/backlog-stalled-detect.ts +4 -4
  146. package/scripts/backlog/backlog-stalled.ts +5 -6
  147. package/scripts/backlog/backlog-waves.ts +4 -4
  148. package/scripts/backlog/backlogrun-args.ts +74 -0
  149. package/scripts/backlog/backlogrun-cli.ts +113 -0
  150. package/scripts/backlog/backlogrun-launch.ts +178 -0
  151. package/scripts/behavior/behavior-assertion.ts +6 -8
  152. package/scripts/behavior/behavior-cli.ts +1 -1
  153. package/scripts/behavior/behavior-rules.ts +3 -3
  154. package/scripts/build/build-claude-md.ts +4 -4
  155. package/scripts/build/build-codex-hooks.ts +2 -2
  156. package/scripts/build/build-commands.ts +1 -1
  157. package/scripts/build/build-hooks.ts +5 -5
  158. package/scripts/build/build.ts +1 -1
  159. package/scripts/build/hook-bundle-stamp.ts +109 -7
  160. package/scripts/build/local-bin.ts +2 -2
  161. package/scripts/cases/cases-cli.ts +1 -1
  162. package/scripts/cases/cases-logic.ts +2 -2
  163. package/scripts/ci/composite-actions.ts +1 -2
  164. package/scripts/ci/pr-classification.ts +2 -2
  165. package/scripts/claude/workflow-destination.ts +1 -1
  166. package/scripts/clone/clone-aggregate.ts +1 -1
  167. package/scripts/clone/clone-fingerprint.ts +1 -1
  168. package/scripts/clone/clone-scan-cli.ts +1 -1
  169. package/scripts/clone/clone-scan.ts +1 -1
  170. package/scripts/config-merge/index.ts +1 -1
  171. package/scripts/config-merge/json-format.ts +1 -3
  172. package/scripts/config-merge/patch-json-array.ts +90 -0
  173. package/scripts/config-merge/patch-json-key.ts +6 -3
  174. package/scripts/config-merge/patch-json-list.ts +1 -1
  175. package/scripts/cost-runtime/codex-usage.ts +1 -1
  176. package/scripts/cost-runtime/context-cut-payback.ts +4 -5
  177. package/scripts/cost-runtime/context-cut-threshold.ts +4 -6
  178. package/scripts/cost-runtime/cost-attribute.ts +3 -3
  179. package/scripts/cost-runtime/cost-blocks.ts +3 -4
  180. package/scripts/cost-runtime/cost-cli.ts +14 -11
  181. package/scripts/cost-runtime/cost-corpus.ts +11 -11
  182. package/scripts/cost-runtime/cost-pricing.ts +4 -4
  183. package/scripts/cost-runtime/cost-tokens.ts +1 -2
  184. package/scripts/cost-runtime/cost-transcript.ts +29 -29
  185. package/scripts/cost-runtime/cost-usage.ts +6 -7
  186. package/scripts/cost-runtime/cost-verdict.ts +10 -11
  187. package/scripts/cost-runtime/own-session.ts +1 -1
  188. package/scripts/cost-runtime/transcript-cwd.ts +2 -2
  189. package/scripts/delegation/delegation-cli.ts +4 -4
  190. package/scripts/delegation/delegation-policy.ts +13 -15
  191. package/scripts/delegation/duplicate-read-guard.ts +9 -10
  192. package/scripts/delegation/fanout-cli.ts +1 -1
  193. package/scripts/delegation/fanout.ts +1 -1
  194. package/scripts/delegation/investigation-guard.ts +18 -22
  195. package/scripts/delegation/investigation-reads.ts +48 -238
  196. package/scripts/discovery/repo-discovery.ts +1 -1
  197. package/scripts/discovery/repo-map-logic.ts +1 -2
  198. package/scripts/discovery/repo-origin.ts +3 -3
  199. package/scripts/discovery/repo-party-cli.ts +2 -2
  200. package/scripts/discovery/repo-party.ts +2 -2
  201. package/scripts/doctor/doctor-consumer.ts +1 -1
  202. package/scripts/doctor/doctor-io.ts +6 -7
  203. package/scripts/doctor/doctor-logic.ts +1 -1
  204. package/scripts/doctor/doctor-ports.ts +1 -1
  205. package/scripts/doctor/doctor.ts +8 -9
  206. package/scripts/document/backlogrun-parent-read-set.ts +5 -6
  207. package/scripts/document/bash-output-cap.ts +5 -7
  208. package/scripts/document/capped-print-part.ts +1 -1
  209. package/scripts/document/capped-print.ts +1 -1
  210. package/scripts/document/document-byte-budget.ts +33 -64
  211. package/scripts/document/document-byte-check.ts +4 -4
  212. package/scripts/document/document-reachability.ts +7 -8
  213. package/scripts/document/document-read-cli.ts +2 -2
  214. package/scripts/document/document-scan.ts +30 -5
  215. package/scripts/document/document-section-cli.ts +6 -8
  216. package/scripts/document/document-section.ts +8 -12
  217. package/scripts/document/edit-files-cli.ts +3 -4
  218. package/scripts/document/entry-read-budget.ts +8 -70
  219. package/scripts/document/entry-read-set.ts +51 -34
  220. package/scripts/document/lane-child-read-set.ts +9 -9
  221. package/scripts/document/read-files-cli.ts +1 -2
  222. package/scripts/document/read-set-cli.ts +16 -19
  223. package/scripts/document/read-set-cost.ts +4 -4
  224. package/scripts/document/read-set-point-of-use.ts +28 -38
  225. package/scripts/document/read-set-pricing.ts +1 -1
  226. package/scripts/document/read-set-trim.ts +3 -3
  227. package/scripts/document/resident-budget.ts +8 -10
  228. package/scripts/epic/epic-add-body.ts +15 -18
  229. package/scripts/epic/epic-add-plan.ts +26 -28
  230. package/scripts/epic/epic-add.ts +32 -25
  231. package/scripts/epic/epic-audit-checks.ts +27 -37
  232. package/scripts/epic/epic-audit-cli.ts +21 -22
  233. package/scripts/epic/epic-audit-orphans.ts +16 -17
  234. package/scripts/epic/epic-audit-rationale.ts +10 -15
  235. package/scripts/epic/epic-audit-report.ts +2 -5
  236. package/scripts/epic/epic-audit.ts +18 -14
  237. package/scripts/epic/epic-body.ts +10 -10
  238. package/scripts/epic/epic-bundle-cli.ts +36 -34
  239. package/scripts/epic/epic-bundle-evidence.ts +5 -5
  240. package/scripts/epic/epic-bundle-gaps.ts +6 -9
  241. package/scripts/epic/epic-bundle-poll.ts +1 -1
  242. package/scripts/epic/epic-bundle-referenced.ts +11 -14
  243. package/scripts/epic/epic-bundle.ts +19 -20
  244. package/scripts/epic/epic-busy.ts +44 -21
  245. package/scripts/epic/epic-candidate-confirm.ts +15 -18
  246. package/scripts/epic/epic-chains.ts +18 -23
  247. package/scripts/epic/epic-classify.ts +11 -12
  248. package/scripts/epic/epic-cli-argv.ts +5 -6
  249. package/scripts/epic/epic-cli-remove.ts +9 -4
  250. package/scripts/epic/epic-cli.ts +38 -26
  251. package/scripts/epic/epic-close-comment.ts +14 -15
  252. package/scripts/epic/epic-close.ts +25 -29
  253. package/scripts/epic/epic-cross-repo.ts +18 -21
  254. package/scripts/epic/epic-decision.ts +14 -18
  255. package/scripts/epic/epic-fetch.ts +25 -31
  256. package/scripts/epic/epic-graph.ts +15 -17
  257. package/scripts/epic/epic-index.ts +14 -16
  258. package/scripts/epic/epic-issue.ts +9 -11
  259. package/scripts/epic/epic-label-age.ts +74 -0
  260. package/scripts/epic/epic-lane-offer.ts +35 -24
  261. package/scripts/epic/epic-nested.ts +1 -1
  262. package/scripts/epic/epic-next-read.ts +8 -8
  263. package/scripts/epic/epic-next-views.ts +12 -12
  264. package/scripts/epic/epic-next.ts +29 -33
  265. package/scripts/epic/epic-outside-blocker.ts +11 -10
  266. package/scripts/epic/epic-parse.ts +22 -24
  267. package/scripts/epic/epic-promote.ts +3 -2
  268. package/scripts/epic/epic-rank.ts +1 -1
  269. package/scripts/epic/epic-read.ts +10 -8
  270. package/scripts/epic/epic-reconcile.ts +8 -6
  271. package/scripts/epic/epic-reference.ts +5 -4
  272. package/scripts/epic/epic-relation-recheck.ts +10 -11
  273. package/scripts/epic/epic-relations.ts +9 -8
  274. package/scripts/epic/epic-remove-plan.ts +4 -5
  275. package/scripts/epic/epic-remove.ts +7 -5
  276. package/scripts/epic/epic-report.ts +18 -20
  277. package/scripts/epic/epic-run.ts +6 -5
  278. package/scripts/epic/epic-sections.ts +2 -2
  279. package/scripts/epic/epic-shape.ts +3 -3
  280. package/scripts/epic/epic-solo-stale.ts +3 -2
  281. package/scripts/epic/epic-solo.ts +8 -8
  282. package/scripts/epic/epic-triage.ts +5 -4
  283. package/scripts/epic/epic-validate.ts +8 -7
  284. package/scripts/epic/epic.ts +5 -5
  285. package/scripts/exports/unused-members-cli.ts +1 -1
  286. package/scripts/followup/followup-issue-number.ts +1 -2
  287. package/scripts/followup/git-followup-cleanup.ts +6 -7
  288. package/scripts/followup/git-followup-finish.ts +11 -13
  289. package/scripts/followup/git-followup-flush.ts +11 -7
  290. package/scripts/followup/git-followup-issue-close.ts +16 -13
  291. package/scripts/followup/git-followup-label.ts +9 -6
  292. package/scripts/followup/git-followup-merged.ts +1 -1
  293. package/scripts/followup/git-followup-pending.ts +7 -9
  294. package/scripts/followup/git-followup-stages.ts +28 -17
  295. package/scripts/followup/git-followup-workflow.ts +19 -21
  296. package/scripts/followup/git-pr-followup-checks.ts +13 -20
  297. package/scripts/followup/git-pr-followup-wrapup.ts +7 -7
  298. package/scripts/followup/git-pr-followup.ts +18 -17
  299. package/scripts/gate/core-admission.ts +2 -2
  300. package/scripts/gate/core-budget.ts +15 -26
  301. package/scripts/gate/gate-ledger.ts +114 -0
  302. package/scripts/gate/gate-log.ts +7 -9
  303. package/scripts/gate/gate-plan.ts +70 -35
  304. package/scripts/gate/gate-report.ts +14 -15
  305. package/scripts/gate/gate-skip.ts +11 -13
  306. package/scripts/gate/gate-steps.ts +5 -1
  307. package/scripts/gate/gate-tree.ts +3 -4
  308. package/scripts/gate/hook-gate-reuse.ts +9 -9
  309. package/scripts/gate/machine-capacity.ts +168 -30
  310. package/scripts/gate/pre-commit-type-check.ts +4 -4
  311. package/scripts/gate/project-checks.ts +12 -4
  312. package/scripts/gate/scoped-green.ts +11 -18
  313. package/scripts/gate/type-check-command.ts +2 -2
  314. package/scripts/gate/type-check-step.ts +4 -4
  315. package/scripts/gate/verification-gate.ts +53 -51
  316. package/scripts/gh/gh-spawn.ts +2 -2
  317. package/scripts/gh/git-ai-review-scan.ts +3 -2
  318. package/scripts/gh/git-gh-api-path.ts +10 -11
  319. package/scripts/gh/git-gh-exec.ts +43 -48
  320. package/scripts/gh/git-gh-failure.ts +6 -9
  321. package/scripts/gh/git-gh-helpers.ts +1 -1
  322. package/scripts/gh/git-gh-issue-list.ts +15 -19
  323. package/scripts/gh/git-gh-issue-read.ts +43 -60
  324. package/scripts/gh/git-gh-issue-rest.ts +14 -15
  325. package/scripts/gh/git-gh-issue-write.ts +52 -40
  326. package/scripts/gh/git-gh-issue.ts +23 -24
  327. package/scripts/gh/git-gh-pr-auto-merge.ts +3 -3
  328. package/scripts/gh/git-gh-pr-read.ts +46 -50
  329. package/scripts/gh/git-gh-pr-rest.ts +23 -26
  330. package/scripts/gh/git-gh-pr-review.ts +2 -2
  331. package/scripts/gh/git-gh-pr-rollup.ts +4 -4
  332. package/scripts/gh/git-gh-pr-snapshot.ts +8 -10
  333. package/scripts/gh/git-gh-pr.ts +16 -16
  334. package/scripts/gh/git-gh-reachability.ts +11 -12
  335. package/scripts/gh/git-gh-repo.ts +2 -3
  336. package/scripts/gh/git-gh-rest-state.ts +1 -1
  337. package/scripts/gh/git-pr-ai-review.ts +6 -5
  338. package/scripts/gh/git-pr-checks-eval.ts +28 -30
  339. package/scripts/gh/git-pr-checks-parse.ts +14 -16
  340. package/scripts/gh/git-pr-checks-watch.ts +17 -17
  341. package/scripts/gh/git-pr-checks.ts +20 -23
  342. package/scripts/gh/git-pr-coderabbit.ts +8 -6
  343. package/scripts/gh/git-pr-confirmation.ts +5 -5
  344. package/scripts/gh/git-pr-managed-config.ts +7 -9
  345. package/scripts/gh/git-pr-messages.ts +1 -1
  346. package/scripts/gh/git-pr.ts +15 -16
  347. package/scripts/gh/github-issue-url.ts +8 -9
  348. package/scripts/git/base-tree.ts +66 -0
  349. package/scripts/git/change-base.ts +42 -2
  350. package/scripts/git/changed-file-scope.ts +5 -5
  351. package/scripts/git/changed-paths.ts +1 -2
  352. package/scripts/git/constants.ts +2 -2
  353. package/scripts/git/git-branch.ts +1 -1
  354. package/scripts/git/git-closes-keyword.ts +3 -3
  355. package/scripts/git/git-command.ts +53 -41
  356. package/scripts/git/git-common-directory.ts +3 -3
  357. package/scripts/git/git-diff-reads.ts +14 -15
  358. package/scripts/git/git-error.ts +1 -1
  359. package/scripts/git/git-execa-error.ts +1 -2
  360. package/scripts/git/git-issue.ts +10 -8
  361. package/scripts/git/git-location-environment.ts +3 -4
  362. package/scripts/git/git-ls-remote.ts +6 -8
  363. package/scripts/git/git-pre-push-hook.ts +11 -10
  364. package/scripts/git/git-preflight.ts +5 -5
  365. package/scripts/git/git-push-transport.ts +2 -2
  366. package/scripts/git/git-remote-branch.ts +1 -2
  367. package/scripts/git/git-schemas.ts +16 -23
  368. package/scripts/git/git-spawn-sync.ts +1 -1
  369. package/scripts/git/git-spawn.ts +37 -14
  370. package/scripts/git/git-ssh-keepalive.ts +12 -5
  371. package/scripts/git/git-staging.ts +7 -8
  372. package/scripts/git/git-workflow.ts +1 -1
  373. package/scripts/git/git-worktree.ts +35 -27
  374. package/scripts/git/gone-branch.ts +2 -2
  375. package/scripts/git/listing-cutoff.ts +1 -2
  376. package/scripts/git/lockfile-sync.ts +65 -0
  377. package/scripts/git/main-merge-guard.ts +1 -2
  378. package/scripts/git/main-merge.ts +7 -7
  379. package/scripts/git/main-sync.ts +23 -8
  380. package/scripts/git/parse-json-array.ts +18 -23
  381. package/scripts/git/repository-lock.ts +34 -2
  382. package/scripts/git/stash/git-stash.ts +4 -5
  383. package/scripts/git/stash/stash-orphans.ts +5 -3
  384. package/scripts/git/stash/stash-pop-args.ts +1 -1
  385. package/scripts/git/stash/stash-pop-cli.ts +3 -3
  386. package/scripts/git/stash/stash-sweep-lock.ts +2 -2
  387. package/scripts/hooks/batch-guard.ts +11 -13
  388. package/scripts/hooks/check-commit-message.ts +12 -9
  389. package/scripts/hooks/codex-hook-adapter.ts +16 -10
  390. package/scripts/hooks/edited-cspell.ts +3 -4
  391. package/scripts/hooks/format-edited-cli.ts +1 -1
  392. package/scripts/hooks/format-edited-file.ts +11 -17
  393. package/scripts/hooks/format-rewrite-notice.ts +19 -17
  394. package/scripts/hooks/pre-push-unit.ts +10 -14
  395. package/scripts/hooks/pretool-guard-cli.ts +4 -4
  396. package/scripts/hooks/pretool-guard.ts +93 -18
  397. package/scripts/hooks/reserved-run.ts +2 -2
  398. package/scripts/hooks/step-zero-notice.ts +1 -1
  399. package/scripts/hooks/stop-guard.ts +21 -10
  400. package/scripts/init/basic-path-migration.ts +2 -2
  401. package/scripts/init/claude-kit-only-settings.ts +2 -2
  402. package/scripts/init/claude-plugin-config.ts +2 -2
  403. package/scripts/init/distributed-paths.ts +4 -4
  404. package/scripts/init/hook-command-rewrite.ts +3 -3
  405. package/scripts/init/hook-launch.ts +5 -5
  406. package/scripts/init/init-actions.ts +13 -0
  407. package/scripts/init/init-ai-copy.ts +11 -11
  408. package/scripts/init/init-bootstrap.ts +3 -3
  409. package/scripts/init/init-copy-content.ts +4 -4
  410. package/scripts/init/init-logic-json-merge.ts +7 -9
  411. package/scripts/init/init-logic-migrate.ts +1 -1
  412. package/scripts/init/init-logic-templates.ts +1 -1
  413. package/scripts/init/init-logic-workspace.ts +4 -4
  414. package/scripts/init/init-logic-yaml-merge.ts +2 -2
  415. package/scripts/init/init-logic.ts +19 -22
  416. package/scripts/init/init.ts +7 -7
  417. package/scripts/init/kit-base-preset.ts +1 -1
  418. package/scripts/init/kit-setup-state.ts +1 -1
  419. package/scripts/init/kit-written-paths.ts +1 -2
  420. package/scripts/init/package-manager-pin.ts +1 -1
  421. package/scripts/init/project-profile-cli.ts +1 -1
  422. package/scripts/init/project-profile.ts +3 -3
  423. package/scripts/init/session-language-environment.ts +1 -1
  424. package/scripts/init/start-exec.ts +3 -4
  425. package/scripts/init/start-plan.ts +2 -2
  426. package/scripts/init/start-setup-pr.ts +3 -2
  427. package/scripts/init/start-steps.ts +2 -2
  428. package/scripts/init/tsconfig-preset-migration.ts +1 -1
  429. package/scripts/init/vscode-tasks.ts +62 -0
  430. package/scripts/issue/baseline-measure.ts +2 -2
  431. package/scripts/issue/behavior-change-lint.ts +2 -2
  432. package/scripts/issue/defect-rate-cli.ts +6 -7
  433. package/scripts/issue/defect-rate.ts +37 -27
  434. package/scripts/issue/git-next-issues.ts +9 -8
  435. package/scripts/issue/issue-auto-ok.ts +24 -11
  436. package/scripts/issue/issue-backlinks-cli.ts +5 -5
  437. package/scripts/issue/issue-backlinks.ts +6 -6
  438. package/scripts/issue/issue-cite-cli.ts +20 -18
  439. package/scripts/issue/issue-cite.ts +18 -8
  440. package/scripts/issue/issue-closing-pr.ts +4 -4
  441. package/scripts/issue/issue-comment-cli.ts +6 -4
  442. package/scripts/issue/issue-file-cli.ts +52 -15
  443. package/scripts/issue/issue-file-fold.ts +155 -0
  444. package/scripts/issue/issue-file.ts +9 -6
  445. package/scripts/issue/issue-fold-cli.ts +14 -9
  446. package/scripts/issue/issue-fold.ts +23 -8
  447. package/scripts/issue/issue-labels.ts +34 -38
  448. package/scripts/issue/issue-lint-cli.ts +2 -2
  449. package/scripts/issue/issue-lint.ts +1 -1
  450. package/scripts/issue/issue-merged.ts +10 -4
  451. package/scripts/issue/issue-number-shape.ts +27 -0
  452. package/scripts/issue/issue-rank.ts +1 -1
  453. package/scripts/issue/issue-read-cli.ts +4 -5
  454. package/scripts/issue/issue-read.ts +4 -5
  455. package/scripts/issue/issue-reference.ts +5 -5
  456. package/scripts/issue/issue-release-cli.ts +17 -7
  457. package/scripts/issue/issue-release.ts +3 -3
  458. package/scripts/issue/issue-report-failures.ts +7 -4
  459. package/scripts/issue/issue-scout-cli.ts +11 -11
  460. package/scripts/issue/issue-scout-closed.ts +4 -4
  461. package/scripts/issue/issue-scout.ts +4 -5
  462. package/scripts/issue/issue-state-cli.ts +17 -10
  463. package/scripts/issue/issue-state.ts +12 -13
  464. package/scripts/issue/issue-wip.ts +7 -7
  465. package/scripts/issue/markdown-section.ts +3 -3
  466. package/scripts/issue/measure-rerun-cli.ts +10 -9
  467. package/scripts/issue/reproduction-measure.ts +3 -3
  468. package/scripts/issue/session-cite.ts +56 -0
  469. package/scripts/josh/agent-session-environment.ts +10 -8
  470. package/scripts/josh/cli-body.ts +2 -2
  471. package/scripts/josh/command-suggest.ts +1 -1
  472. package/scripts/josh/file-map-stamp.ts +20 -23
  473. package/scripts/josh/hook-decision.ts +24 -28
  474. package/scripts/josh/josh-command-map.ts +4 -1
  475. package/scripts/josh/josh-command-types.ts +30 -35
  476. package/scripts/josh/josh-commands-ai.ts +6 -6
  477. package/scripts/josh/josh-commands-backlog.ts +15 -3
  478. package/scripts/josh/josh-commands-clone.ts +1 -1
  479. package/scripts/josh/josh-commands-development.ts +25 -4
  480. package/scripts/josh/josh-commands-document.ts +3 -3
  481. package/scripts/josh/josh-commands-guard.ts +3 -3
  482. package/scripts/josh/josh-commands-issue.ts +4 -5
  483. package/scripts/josh/josh-commands-lane.ts +14 -4
  484. package/scripts/josh/josh-commands-lint.ts +1 -1
  485. package/scripts/josh/josh-commands-run.ts +21 -7
  486. package/scripts/josh/josh-commands-split.ts +1 -2
  487. package/scripts/josh/josh-commands-versioning.ts +5 -5
  488. package/scripts/josh/josh-commands-workflow.ts +30 -22
  489. package/scripts/josh/josh-environment-file.ts +1 -1
  490. package/scripts/josh/josh-in-process.ts +3 -3
  491. package/scripts/josh/josh-logic.ts +6 -7
  492. package/scripts/josh/josh-run.ts +3 -3
  493. package/scripts/josh/josh-verdict.ts +9 -12
  494. package/scripts/josh/josh.ts +3 -3
  495. package/scripts/josh/kit-only.ts +2 -2
  496. package/scripts/josh/path-decision.ts +3 -3
  497. package/scripts/josh/platform-temporary.ts +7 -5
  498. package/scripts/josh/process-identity.ts +24 -6
  499. package/scripts/josh/process-owner.ts +4 -4
  500. package/scripts/josh/session-language-cli.ts +53 -11
  501. package/scripts/josh/session-language.ts +1 -1
  502. package/scripts/josh/stamp-file.ts +48 -29
  503. package/scripts/josh/stamp-record.ts +57 -0
  504. package/scripts/lane/lane-await.ts +35 -11
  505. package/scripts/lane/lane-cache.ts +6 -6
  506. package/scripts/lane/lane-capacity.ts +32 -17
  507. package/scripts/lane/lane-child-invocation.ts +17 -15
  508. package/scripts/lane/lane-child-marker.ts +12 -12
  509. package/scripts/lane/lane-cli.ts +12 -13
  510. package/scripts/lane/lane-close.ts +6 -6
  511. package/scripts/lane/lane-dispatch.ts +61 -72
  512. package/scripts/lane/lane-environment.ts +5 -5
  513. package/scripts/lane/lane-guard-policy.ts +7 -21
  514. package/scripts/lane/lane-handoff.ts +2 -2
  515. package/scripts/lane/lane-install.ts +9 -10
  516. package/scripts/lane/lane-launch-cli.ts +13 -8
  517. package/scripts/lane/lane-ledger.ts +73 -11
  518. package/scripts/lane/lane-leftover.ts +2 -2
  519. package/scripts/lane/lane-limit-cli.ts +160 -0
  520. package/scripts/lane/lane-limit-override.ts +74 -0
  521. package/scripts/lane/lane-load.ts +19 -68
  522. package/scripts/lane/lane-measure-cli.ts +15 -25
  523. package/scripts/lane/lane-occupancy.ts +6 -4
  524. package/scripts/lane/lane-open.ts +20 -19
  525. package/scripts/lane/lane-output.ts +4 -3
  526. package/scripts/lane/lane-paths.ts +12 -11
  527. package/scripts/lane/lane-phase.ts +33 -0
  528. package/scripts/lane/lane-reap.ts +2 -2
  529. package/scripts/lane/lane-registry.ts +16 -15
  530. package/scripts/lane/lane-relaunch.ts +9 -9
  531. package/scripts/lane/lane-report.ts +5 -4
  532. package/scripts/lane/lane-resume.ts +2 -2
  533. package/scripts/lane/lane-sampler.ts +55 -0
  534. package/scripts/lane/lane-seed.ts +7 -7
  535. package/scripts/lane/lane-stage-stats.ts +135 -0
  536. package/scripts/lane/lane-start-point.ts +8 -11
  537. package/scripts/lane/lane-stats.ts +60 -15
  538. package/scripts/lane/lane-stray.ts +1 -1
  539. package/scripts/lane/lane-vacant.ts +1 -1
  540. package/scripts/lane/openai-lane-supervisor-decision.ts +3 -7
  541. package/scripts/lane/openai-lane-supervisor-owner.ts +3 -9
  542. package/scripts/lane/openai-review-broker.ts +2 -4
  543. package/scripts/lib/ancestor-directories.ts +1 -1
  544. package/scripts/lib/bounded-pool.ts +2 -2
  545. package/scripts/lib/buffered-process.ts +4 -6
  546. package/scripts/lib/caddy-logs.sh +0 -0
  547. package/scripts/lib/cli-flags.ts +39 -6
  548. package/scripts/lib/error-message.ts +1 -1
  549. package/scripts/lib/json-value.ts +17 -3
  550. package/scripts/lib/poll.ts +1 -1
  551. package/scripts/lib/status-icons.ts +3 -3
  552. package/scripts/lib/timed-fetch.ts +1 -1
  553. package/scripts/lib/timeouts.ts +1 -1
  554. package/scripts/lines/bytes-command.ts +3 -4
  555. package/scripts/lines/effective-limit.ts +25 -12
  556. package/scripts/lines/line-budget.ts +47 -55
  557. package/scripts/lines/line-targets.ts +6 -2
  558. package/scripts/lines/lines-command.ts +3 -3
  559. package/scripts/lint/cross-file-recheck.ts +155 -0
  560. package/scripts/lint/cspell-cached.ts +1 -1
  561. package/scripts/lint/format.ts +1 -2
  562. package/scripts/lint/lint-parallel.ts +35 -19
  563. package/scripts/lint/lint-related-scope.ts +25 -15
  564. package/scripts/lint/lint-related.ts +6 -7
  565. package/scripts/managed-marker/index.ts +1 -1
  566. package/scripts/managed-marker/managed-marker-logic.ts +1 -2
  567. package/scripts/notify/git-notify.ts +9 -7
  568. package/scripts/notify/telegram-notify.ts +53 -37
  569. package/scripts/notify/telegram-test-logic.ts +3 -3
  570. package/scripts/notify/telegram-test.ts +45 -30
  571. package/scripts/observations/observation-ledger-home.ts +14 -8
  572. package/scripts/observations/observation-ledger-line.ts +3 -2
  573. package/scripts/observations/observation-ledger-migrate.ts +3 -4
  574. package/scripts/observations/observation-ledger-prepare.ts +4 -4
  575. package/scripts/observations/observation-ledger.ts +14 -15
  576. package/scripts/observations/observation-record-cli.ts +83 -0
  577. package/scripts/observations/observation-record.ts +91 -0
  578. package/scripts/observations/observations-flush-cli.ts +1 -1
  579. package/scripts/observations/observations-flush-landing.ts +7 -6
  580. package/scripts/observations/observations-flush.ts +26 -27
  581. package/scripts/overrides/overrides-check.ts +18 -8
  582. package/scripts/package/package-scout-cli.ts +1 -1
  583. package/scripts/package/package-scout-format.ts +2 -2
  584. package/scripts/package/package-scout.ts +1 -1
  585. package/scripts/propagate/propagate-git-failure.ts +1 -1
  586. package/scripts/propagate/propagate-git.ts +7 -7
  587. package/scripts/propagate/propagate-plan.ts +2 -2
  588. package/scripts/propagate/propagate-publish.ts +2 -3
  589. package/scripts/propagate/propagate-run.ts +5 -7
  590. package/scripts/propagate/propagate-select.ts +1 -1
  591. package/scripts/propagate/propagate-steps.ts +19 -20
  592. package/scripts/propagate/propagate-targets.ts +6 -10
  593. package/scripts/propagate/propagate.ts +5 -5
  594. package/scripts/refactor/import-graph.ts +1 -1
  595. package/scripts/refactor/refactor-lint.ts +4 -10
  596. package/scripts/refactor/refactor-scan-cli.ts +1 -1
  597. package/scripts/refactor/refactor-scan.ts +2 -2
  598. package/scripts/refactor/refactor-targets.ts +1 -1
  599. package/scripts/release/github-release-cli.ts +25 -3
  600. package/scripts/release/github-release-runs.ts +1 -1
  601. package/scripts/release/release-cli.ts +21 -4
  602. package/scripts/release/release-history.ts +6 -10
  603. package/scripts/release/release-plan.ts +3 -3
  604. package/scripts/release/release-progress.ts +3 -4
  605. package/scripts/release/release-publish.ts +8 -9
  606. package/scripts/release/release-scope-cli.ts +8 -10
  607. package/scripts/release/release-tag.ts +6 -8
  608. package/scripts/release/release-worktree.ts +5 -5
  609. package/scripts/repo/auto-merge-setting-logic.ts +7 -9
  610. package/scripts/repo/auto-merge-setting.ts +1 -1
  611. package/scripts/repo/repo-setting.ts +4 -4
  612. package/scripts/repo/repository-labels.ts +1 -1
  613. package/scripts/repo/required-checks-logic.ts +3 -3
  614. package/scripts/repo/required-checks-report.ts +1 -1
  615. package/scripts/repo/ruleset-check-cli.ts +1 -1
  616. package/scripts/repo/ruleset-check.ts +1 -1
  617. package/scripts/report/report-format-reference.ts +26 -0
  618. package/scripts/report/report-lint-cli.ts +2 -2
  619. package/scripts/report/report-lint.ts +16 -2
  620. package/scripts/review/disposition-cli.ts +2 -2
  621. package/scripts/review/disposition-logic.ts +1 -1
  622. package/scripts/review/live-evidence.ts +9 -6
  623. package/scripts/review/review-attest-cli.ts +1 -2
  624. package/scripts/review/review-attest.ts +3 -3
  625. package/scripts/review/review-brief-cli.ts +19 -20
  626. package/scripts/review/review-brief.ts +29 -32
  627. package/scripts/review/review-checkout.ts +2 -2
  628. package/scripts/review/review-diff-parts.ts +3 -5
  629. package/scripts/review/review-diff-write.ts +1 -1
  630. package/scripts/review/review-finding-ledger.ts +7 -4
  631. package/scripts/review/review-findings-cli.ts +2 -2
  632. package/scripts/review/review-level.ts +4 -7
  633. package/scripts/review/review-record-cli.ts +73 -16
  634. package/scripts/review/review-record.ts +5 -4
  635. package/scripts/review/review-round2-cli.ts +2 -3
  636. package/scripts/review/review-round2.ts +13 -21
  637. package/scripts/review/review-stamps.ts +9 -71
  638. package/scripts/review/review-tree.ts +4 -5
  639. package/scripts/rules/bash-triggers.ts +4 -4
  640. package/scripts/rules/decision-oracle-batch.ts +6 -7
  641. package/scripts/rules/decision-oracle-stage.ts +1 -1
  642. package/scripts/rules/decision-oracle-tokens.ts +1 -2
  643. package/scripts/rules/decision-oracle.ts +2 -2
  644. package/scripts/rules/delivered-rules.ts +61 -406
  645. package/scripts/rules/destructive-command.ts +2 -2
  646. package/scripts/rules/direct-filing.ts +4 -4
  647. package/scripts/rules/direct-pr-create.ts +2 -2
  648. package/scripts/rules/early-heartbeat.ts +15 -19
  649. package/scripts/rules/file-body.ts +5 -6
  650. package/scripts/rules/filing-cap.ts +6 -7
  651. package/scripts/rules/filing-offer.ts +1 -1
  652. package/scripts/rules/firing-point.ts +6 -6
  653. package/scripts/rules/gh-api.ts +2 -2
  654. package/scripts/rules/git-argv.ts +3 -3
  655. package/scripts/rules/git-force.ts +2 -2
  656. package/scripts/rules/hook-context-line.ts +31 -0
  657. package/scripts/rules/implementation-cut-verdict.ts +5 -8
  658. package/scripts/rules/implementation-cut.ts +35 -32
  659. package/scripts/rules/index-guard.ts +2 -2
  660. package/scripts/rules/issue-citation.ts +7 -7
  661. package/scripts/rules/issue-comments.ts +21 -13
  662. package/scripts/rules/josh-git-bare.ts +2 -2
  663. package/scripts/rules/lane-background.ts +14 -16
  664. package/scripts/rules/lane-carry-conflict.ts +41 -5
  665. package/scripts/rules/lane-interactive-ask.ts +6 -9
  666. package/scripts/rules/lane-park.ts +12 -16
  667. package/scripts/rules/lane-split-park.ts +1 -2
  668. package/scripts/rules/lane-switch-main.ts +10 -13
  669. package/scripts/rules/last-prompt.ts +1 -1
  670. package/scripts/rules/oracle-consulted.ts +5 -5
  671. package/scripts/rules/oracle-firing.ts +6 -9
  672. package/scripts/rules/oracle-list-cli.ts +2 -2
  673. package/scripts/rules/permission-guards.ts +2 -2
  674. package/scripts/rules/piped-verification.ts +79 -9
  675. package/scripts/rules/poll-loop.ts +9 -11
  676. package/scripts/rules/pre-gate-cut.ts +33 -30
  677. package/scripts/rules/prior-comment-read.ts +3 -3
  678. package/scripts/rules/protected-files.ts +25 -13
  679. package/scripts/rules/raw-field-body.ts +3 -4
  680. package/scripts/rules/reply-language.ts +1 -1
  681. package/scripts/rules/rule-body-guard.ts +10 -12
  682. package/scripts/rules/rule-guard.ts +1 -1
  683. package/scripts/rules/rule-list.ts +51 -0
  684. package/scripts/rules/rule-registry-rows.ts +282 -0
  685. package/scripts/rules/rule-registry.ts +109 -0
  686. package/scripts/rules/rule-value-cache.ts +2 -2
  687. package/scripts/rules/rule-value-cli.ts +6 -4
  688. package/scripts/rules/rule-value.ts +61 -22
  689. package/scripts/rules/run-tail-rule.ts +11 -15
  690. package/scripts/rules/shell-body-trigger.ts +7 -7
  691. package/scripts/rules/shell-segments.ts +2 -4
  692. package/scripts/rules/stop-rules.ts +54 -41
  693. package/scripts/rules/tail-commands.ts +1 -1
  694. package/scripts/rules/test-declared-commit.ts +2 -2
  695. package/scripts/rules/third-party-write.ts +3 -3
  696. package/scripts/rules/worktree-guard.ts +12 -5
  697. package/scripts/run/add/run-add-cli.ts +165 -0
  698. package/scripts/run/add/run-add.ts +124 -0
  699. package/scripts/run/board/run-board-cli.ts +207 -0
  700. package/scripts/run/board/run-board-closed.ts +95 -0
  701. package/scripts/run/board/run-board-every.ts +60 -0
  702. package/scripts/run/board/run-board-fetch.ts +38 -0
  703. package/scripts/run/board/run-board-fit.ts +219 -0
  704. package/scripts/run/board/run-board-github.ts +162 -0
  705. package/scripts/run/board/run-board-header.ts +275 -0
  706. package/scripts/run/board/run-board-kind.ts +35 -0
  707. package/scripts/run/board/run-board-labels.ts +299 -0
  708. package/scripts/run/board/run-board-layout.ts +222 -0
  709. package/scripts/run/board/run-board-link.ts +31 -0
  710. package/scripts/run/board/run-board-machine.ts +198 -0
  711. package/scripts/run/board/run-board-notes.ts +103 -0
  712. package/scripts/run/board/run-board-phase.ts +136 -0
  713. package/scripts/run/board/run-board-plan.ts +129 -0
  714. package/scripts/run/board/run-board-read.ts +62 -0
  715. package/scripts/run/board/run-board-render-legend.ts +82 -0
  716. package/scripts/run/board/run-board-render-notes.ts +77 -0
  717. package/scripts/run/board/run-board-render-slot.ts +50 -0
  718. package/scripts/run/board/run-board-render.ts +407 -0
  719. package/scripts/run/board/run-board-scope.ts +17 -0
  720. package/scripts/run/board/run-board-screen.ts +43 -0
  721. package/scripts/run/board/run-board-span.ts +66 -0
  722. package/scripts/run/board/run-board-spin.ts +115 -0
  723. package/scripts/run/board/run-board-state.ts +113 -0
  724. package/scripts/run/board/run-board-status.ts +279 -0
  725. package/scripts/run/board/run-board-tick.ts +210 -0
  726. package/scripts/run/board/run-board-track.ts +22 -0
  727. package/scripts/run/board/run-board-usage-read.ts +255 -0
  728. package/scripts/run/board/run-board-usage-rusage.ts +124 -0
  729. package/scripts/run/board/run-board-usage-text.ts +80 -0
  730. package/scripts/run/board/run-board-usage.ts +165 -0
  731. package/scripts/run/carry/run-carry-added.ts +62 -0
  732. package/scripts/run/carry/run-carry-args.ts +25 -22
  733. package/scripts/run/carry/run-carry-change.ts +1 -1
  734. package/scripts/run/carry/run-carry-cli.ts +71 -48
  735. package/scripts/run/carry/run-carry-conversation.ts +6 -7
  736. package/scripts/run/carry/run-carry-ended.ts +85 -0
  737. package/scripts/run/carry/run-carry-reclaim.ts +1 -1
  738. package/scripts/run/carry/run-carry-stash.ts +3 -2
  739. package/scripts/run/carry/run-carry-streak.ts +8 -10
  740. package/scripts/run/carry/run-carry.ts +85 -89
  741. package/scripts/run/cut/run-cut-args.ts +7 -7
  742. package/scripts/run/cut/run-cut-cli.ts +54 -36
  743. package/scripts/run/cut/run-cut-handoff.ts +15 -15
  744. package/scripts/run/cut/run-cut-report.ts +37 -16
  745. package/scripts/run/cut/run-cut.ts +63 -77
  746. package/scripts/run/detached-launch.ts +35 -50
  747. package/scripts/run/entry/run-entry-cli.ts +48 -27
  748. package/scripts/run/entry/run-entry-stop.ts +7 -9
  749. package/scripts/run/entry/run-entry.ts +5 -6
  750. package/scripts/run/event/run-event-cli.ts +5 -6
  751. package/scripts/run/event/run-event-filed.ts +69 -0
  752. package/scripts/run/event/run-event-follow.ts +3 -3
  753. package/scripts/run/event/run-event-plan.ts +38 -0
  754. package/scripts/run/event/run-event-render.ts +9 -4
  755. package/scripts/run/event/run-event-scope.ts +47 -18
  756. package/scripts/run/event/run-event-stream-emit.ts +64 -11
  757. package/scripts/run/event/run-event-stream.ts +171 -46
  758. package/scripts/run/event/run-event-watch.ts +4 -6
  759. package/scripts/run/hold/run-hold-cli.ts +65 -62
  760. package/scripts/run/hold/run-hold.ts +88 -46
  761. package/scripts/run/merge/run-merge-cli.ts +116 -77
  762. package/scripts/run/merge/run-merge-collect.ts +107 -0
  763. package/scripts/run/merge/run-merge-steps.ts +112 -65
  764. package/scripts/run/merge/run-merge-token.ts +30 -0
  765. package/scripts/run/merge/run-merge.ts +31 -22
  766. package/scripts/run/progress/run-progress-args.ts +4 -4
  767. package/scripts/run/progress/run-progress-cli.ts +39 -50
  768. package/scripts/run/progress/run-progress-clock.ts +25 -32
  769. package/scripts/run/progress/run-progress-config.ts +6 -9
  770. package/scripts/run/progress/run-progress-read.ts +9 -10
  771. package/scripts/run/progress/run-progress.ts +48 -53
  772. package/scripts/run/review/run-review-cli.ts +6 -6
  773. package/scripts/run/review/run-review-steps.ts +6 -6
  774. package/scripts/run/review/run-review.ts +9 -11
  775. package/scripts/run/run-cli-fault.ts +29 -0
  776. package/scripts/run/run-ending-cli.ts +3 -3
  777. package/scripts/run/run-ending.ts +10 -14
  778. package/scripts/run/run-halfrun-resume.ts +6 -8
  779. package/scripts/run/run-headless.ts +26 -12
  780. package/scripts/run/run-invocation.ts +17 -22
  781. package/scripts/run/run-label.ts +7 -5
  782. package/scripts/run/run-liveness-cli.ts +19 -6
  783. package/scripts/run/run-liveness.ts +27 -38
  784. package/scripts/run/run-next-cli.ts +5 -9
  785. package/scripts/run/run-next.ts +4 -5
  786. package/scripts/run/run-parent-cut-hook.ts +10 -12
  787. package/scripts/run/run-preflight.ts +25 -29
  788. package/scripts/run/run-prep-cli.ts +17 -13
  789. package/scripts/run/run-prep-locate.ts +4 -5
  790. package/scripts/run/run-prep.ts +7 -10
  791. package/scripts/run/run-prrun-resume.ts +2 -2
  792. package/scripts/run/run-report-cli.ts +4 -4
  793. package/scripts/run/run-report.ts +9 -14
  794. package/scripts/run/run-retrospective.ts +3 -3
  795. package/scripts/run/run-section.ts +42 -0
  796. package/scripts/run/run-stage-read.ts +2 -2
  797. package/scripts/run/run-stage.ts +6 -4
  798. package/scripts/run/run-status-cli.ts +7 -5
  799. package/scripts/run/run-status.ts +6 -7
  800. package/scripts/run/run-step-cli.ts +64 -18
  801. package/scripts/run/run-step.ts +107 -51
  802. package/scripts/run/run-stop-notify.ts +7 -8
  803. package/scripts/run/run-stranded-cli.ts +1 -1
  804. package/scripts/run/run-stranded-detect.ts +4 -4
  805. package/scripts/run/run-stranded.ts +11 -13
  806. package/scripts/run/run-tail-cli.ts +15 -16
  807. package/scripts/run/run-tail.ts +14 -33
  808. package/scripts/run/run-watcher-guard-cli.ts +3 -4
  809. package/scripts/run/run-watcher-guard.ts +11 -12
  810. package/scripts/run/run-watcher-hook.ts +6 -12
  811. package/scripts/run/ship/run-ship-cli.ts +67 -33
  812. package/scripts/run/ship/run-ship-detach.ts +15 -13
  813. package/scripts/run/ship/run-ship-lock.ts +1 -1
  814. package/scripts/run/ship/run-ship-next.ts +7 -8
  815. package/scripts/run/ship/run-ship-pre-detach.ts +27 -11
  816. package/scripts/run/ship/run-ship-preflight.ts +10 -11
  817. package/scripts/run/ship/run-ship-probe.ts +4 -4
  818. package/scripts/run/ship/run-ship-return.ts +1 -1
  819. package/scripts/run/ship/run-ship-review-steps.ts +43 -24
  820. package/scripts/run/ship/run-ship-review.ts +12 -14
  821. package/scripts/run/ship/run-ship-scoped.ts +15 -6
  822. package/scripts/run/ship/run-ship-stage.ts +80 -26
  823. package/scripts/run/ship/run-ship-steps.ts +26 -16
  824. package/scripts/run/ship/run-ship-stop-text.ts +4 -2
  825. package/scripts/run/ship/run-ship-sync.ts +9 -8
  826. package/scripts/run/ship/run-ship.ts +17 -32
  827. package/scripts/run/tidy/run-tidy-cli.ts +9 -5
  828. package/scripts/run/tidy/run-tidy-lanes.ts +18 -7
  829. package/scripts/run/tidy/run-tidy-stashes.ts +8 -8
  830. package/scripts/run/tidy/run-tidy.ts +4 -3
  831. package/scripts/run/wake/run-wake-cli.ts +27 -32
  832. package/scripts/run/wake/run-wake-describe.ts +24 -28
  833. package/scripts/run/wake/run-wake-driver.ts +14 -14
  834. package/scripts/run/wake/run-wake-handoff.ts +6 -6
  835. package/scripts/run/wake/run-wake-loop.ts +9 -9
  836. package/scripts/run/wake/run-wake-restart.ts +4 -5
  837. package/scripts/run/wake/run-wake-session.ts +23 -27
  838. package/scripts/run/wake/run-wake.ts +57 -279
  839. package/scripts/safe-chain/ci-installer-pin.ts +3 -3
  840. package/scripts/safe-chain/pack-hook.ts +2 -2
  841. package/scripts/safe-chain/preinstall-command.ts +2 -2
  842. package/scripts/security/security-audit-logic.ts +1 -1
  843. package/scripts/security/security-audit-provision-logic.ts +1 -1
  844. package/scripts/security/security-audit-provision.ts +2 -2
  845. package/scripts/security/security-audit.ts +5 -5
  846. package/scripts/security/security-updates-logic.ts +2 -3
  847. package/scripts/security/security-updates.ts +2 -4
  848. package/scripts/self-sync-guard/index.ts +1 -1
  849. package/scripts/self-sync-guard/self-sync-guard-logic.ts +2 -2
  850. package/scripts/self-sync-guard/self-sync-refusal.ts +1 -1
  851. package/scripts/sonar/sonar-hotspots-cli.ts +1 -1
  852. package/scripts/sonar/sonar-hotspots.ts +1 -1
  853. package/scripts/sonar/sonar-new-code-cli.ts +1 -1
  854. package/scripts/sonar/sonar-new-code.ts +1 -1
  855. package/scripts/sonar/sonar-project.ts +1 -1
  856. package/scripts/split/split-assess-cli.ts +1 -1
  857. package/scripts/split/split-assess.ts +3 -3
  858. package/scripts/sync/directory-copy-guard.ts +2 -3
  859. package/scripts/sync/managed-config-scope-cli.ts +1 -2
  860. package/scripts/sync/managed-config-scope.ts +4 -4
  861. package/scripts/sync/plugin-skill-directories.ts +2 -2
  862. package/scripts/sync/reconcile-templates.ts +17 -8
  863. package/scripts/sync/removed-skill-manifest.ts +2 -3
  864. package/scripts/sync/sync-ai-files.ts +7 -7
  865. package/scripts/sync/sync-configs.ts +30 -3
  866. package/scripts/sync/sync-hook-safety.ts +2 -2
  867. package/scripts/sync/sync.ts +23 -10
  868. package/scripts/sync/synced-paths.ts +2 -1
  869. package/scripts/sync/workflow-pin-logic.ts +1 -1
  870. package/scripts/test/test-declared-changed.ts +4 -4
  871. package/scripts/test/test-declared-logic.ts +2 -3
  872. package/scripts/test/test-declared-match.ts +25 -4
  873. package/scripts/test/test-declared.ts +26 -9
  874. package/scripts/test/test-red-commit.ts +3 -2
  875. package/scripts/test/test-red-logic.ts +7 -14
  876. package/scripts/test/test-red.ts +12 -47
  877. package/scripts/test/test-related-scope.ts +2 -3
  878. package/scripts/test/test-related.ts +3 -3
  879. package/scripts/test/test-type-logic.ts +1 -2
  880. package/scripts/test/test-unit-guard.ts +13 -17
  881. package/scripts/test/unit-worker-share.ts +7 -8
  882. package/scripts/time-runtime/time-agent-bundles.ts +2 -4
  883. package/scripts/time-runtime/time-background.ts +17 -21
  884. package/scripts/time-runtime/time-batch-guard.ts +67 -342
  885. package/scripts/time-runtime/time-bundle-call.ts +26 -28
  886. package/scripts/time-runtime/time-bundles.ts +11 -12
  887. package/scripts/time-runtime/time-call-identity.ts +1 -1
  888. package/scripts/time-runtime/time-command-key.ts +2 -2
  889. package/scripts/time-runtime/time-density-hook.ts +8 -11
  890. package/scripts/time-runtime/time-density.ts +5 -5
  891. package/scripts/time-runtime/time-followup-stage.ts +7 -7
  892. package/scripts/time-runtime/time-format.ts +5 -5
  893. package/scripts/time-runtime/time-hook-transcript.ts +3 -3
  894. package/scripts/time-runtime/time-instant.ts +1 -1
  895. package/scripts/time-runtime/time-markers.ts +15 -19
  896. package/scripts/time-runtime/time-phase-names.ts +3 -3
  897. package/scripts/time-runtime/time-reported-failure.ts +15 -19
  898. package/scripts/time-runtime/time-round-trips.ts +20 -23
  899. package/scripts/time-runtime/time-shell.ts +8 -8
  900. package/scripts/time-runtime/time-single-check.ts +1 -2
  901. package/scripts/time-runtime/time-spans.ts +35 -40
  902. package/scripts/time-runtime/time-tool-call.ts +15 -16
  903. package/scripts/time-runtime/time-transcript-line.ts +53 -34
  904. package/scripts/time-runtime/time-writes.ts +5 -5
  905. package/scripts/ui/ui-routes-cli.ts +1 -2
  906. package/scripts/ui/ui-routes.ts +1 -2
  907. package/scripts/version/bump-version.ts +1 -1
  908. package/scripts/version/fresh-metadata-cache.ts +2 -2
  909. package/scripts/version/latest-corepack.ts +26 -26
  910. package/scripts/version/latest-lane-guard.ts +1 -1
  911. package/scripts/version/latest-scope-cli.ts +2 -2
  912. package/scripts/version/latest-stamp.ts +1 -2
  913. package/scripts/version/latest-update.ts +2 -2
  914. package/scripts/version/npm-registry.ts +2 -2
  915. package/scripts/version/package-manager-version.ts +18 -0
  916. package/scripts/version/publishable-range-check.ts +2 -1
  917. package/scripts/version/publishable-range.ts +1 -1
  918. package/scripts/version/release-age.ts +11 -11
  919. package/scripts/version/release-hold.ts +2 -2
  920. package/scripts/version/safe-chain-version-update.ts +3 -3
  921. package/scripts/version/version-check-logic.ts +2 -3
  922. package/scripts/version/version-check.ts +1 -2
  923. package/scripts/version/version-command-config.ts +2 -2
  924. package/scripts/version/version-commands.ts +3 -3
  925. package/scripts/version/version-remote.ts +4 -4
  926. package/scripts/version/version-targets.ts +2 -2
  927. package/templates/gitignore +7 -0
  928. package/dist/hooks/chunk-KHX4U3BG.js +0 -6400
  929. package/dist/hooks/chunk-RKUAD3I6.js +0 -90
  930. package/dist/hooks/chunk-WPALEIRX.js +0 -18
  931. package/scripts/backlog/backlog-restructure.ts +0 -152
  932. package/scripts/rules/issue-fold-rule.ts +0 -72
  933. package/scripts/rules/wip-cap.ts +0 -63
  934. package/scripts/run/run-issue-number.ts +0 -19
@@ -0,0 +1,1590 @@
1
+ import {
2
+ lane_child_marker
3
+ } from "./chunk-Z5TMJIPW.js";
4
+ import {
5
+ ENV_FILE_NAME,
6
+ LANE_SEAT_KEY,
7
+ PORCELAIN_FLAG,
8
+ PORT_SEED_KEY,
9
+ agent_session_environment,
10
+ file_reader,
11
+ git_command,
12
+ git_spawn,
13
+ git_utilities,
14
+ issue_number_shape,
15
+ json_value,
16
+ lane_paths,
17
+ ports,
18
+ process_identity,
19
+ process_owner_schema,
20
+ run_carry
21
+ } from "./chunk-NZN2UFI6.js";
22
+ import {
23
+ INSTALL_TIMEOUT_MS,
24
+ PLATFORM_TEMP_ROOT,
25
+ PROBE_TIMEOUT_MS,
26
+ SUITE_TIMEOUT_MS,
27
+ stamp_file
28
+ } from "./chunk-NEC4AT4Z.js";
29
+
30
+ // scripts/agent/agent-headless.ts
31
+ var KEY = "JOSH_AGENT_HEADLESS";
32
+ var VALUE = "1";
33
+ function environment() {
34
+ return { [KEY]: VALUE };
35
+ }
36
+ function is_headless(source = process.env) {
37
+ return source[KEY] === VALUE;
38
+ }
39
+ var agent_headless = { KEY, environment, is_headless };
40
+
41
+ // scripts/lane/lane-reap.ts
42
+ import { execFileSync } from "node:child_process";
43
+
44
+ // scripts/issue/issue-cite.ts
45
+ var GITHUB_URL_PREFIX = "https://github.com/";
46
+ var ISSUE_PATH = "/issues/";
47
+ var SUMMARY_SEPARATOR = " \u2014 ";
48
+ var REPO_QUALIFIED = /^([^\s/#]+\/[^\s/#]+)#(\d+)$/u;
49
+ var BARE_NUMBER = /^#?(\d+)$/u;
50
+ function plain(number, repo = "") {
51
+ return `${repo}#${String(number)}`;
52
+ }
53
+ function issue_url(slug, number) {
54
+ return `${GITHUB_URL_PREFIX}${slug}${ISSUE_PATH}${number}`;
55
+ }
56
+ function citation_line(slug, number, summary) {
57
+ return `[${plain(number)}](${issue_url(slug, number)})${SUMMARY_SEPARATOR}${summary}`;
58
+ }
59
+ function reference(slug, number, title) {
60
+ if (slug === void 0) return plain(number);
61
+ return title === void 0 ? `[${plain(number)}](${issue_url(slug, number)})` : citation_line(slug, number, title);
62
+ }
63
+ function citer(slug, titles) {
64
+ return function cite(number) {
65
+ return reference(slug, number, titles.get(number));
66
+ };
67
+ }
68
+ function qualified_target(token) {
69
+ const match = REPO_QUALIFIED.exec(token);
70
+ if (match === null) return void 0;
71
+ const [, repo = "", number = ""] = match;
72
+ return { number, repo };
73
+ }
74
+ function bare_target(token, default_repo) {
75
+ const match = BARE_NUMBER.exec(token);
76
+ if (match === null) return void 0;
77
+ const [, number = ""] = match;
78
+ return { number, repo: default_repo };
79
+ }
80
+ function parse_target(token, default_repo) {
81
+ return qualified_target(token) ?? bare_target(token, default_repo);
82
+ }
83
+ function label(target) {
84
+ return plain(target.number, target.repo);
85
+ }
86
+ function missing_line(target) {
87
+ return `\u2716 ${label(target)}: issue does not resolve \u2014 check the number and the repository`;
88
+ }
89
+ function unreadable_line(target) {
90
+ return `\u2716 ${label(target)}: could not be read \u2014 a rate limit, expired auth, or a dropped connection`;
91
+ }
92
+ function no_repo_line(target) {
93
+ return `\u2716 ${label(target)}: could not read this repository \u2014 check gh auth and the origin remote`;
94
+ }
95
+ var issue_cite = {
96
+ citation_line,
97
+ citer,
98
+ issue_url,
99
+ missing_line,
100
+ no_repo_line,
101
+ parse_target,
102
+ plain,
103
+ reference,
104
+ unreadable_line
105
+ };
106
+
107
+ // scripts/run/ship/run-ship-stage.ts
108
+ import { z } from "zod";
109
+ var STAGE = {
110
+ PREFLIGHT: "preflight",
111
+ REVIEW: "review",
112
+ GATE: "gate",
113
+ SYNC: "sync",
114
+ COMMIT: "commit",
115
+ ROUND_TWO: "round-2",
116
+ FOLLOWUP: "followup",
117
+ REPORT: "report"
118
+ };
119
+ var PHASE = {
120
+ START: "start",
121
+ DONE: "done",
122
+ FAILED: "failed",
123
+ SKIPPED: "skipped"
124
+ };
125
+ var RECORD_PREFIX = "josh-ship-stages-";
126
+ var RECORD_SEPARATOR = "-";
127
+ var SKIP_COMMIT_FLAG = "--skip-commit";
128
+ var SKIP_PUSH_FLAG = "--skip-push";
129
+ var WORD_SEPARATOR = " ";
130
+ var STARTED_SEPARATOR = ",";
131
+ var STARTED_INDEX = 3;
132
+ var WORD_COUNT = STARTED_INDEX + 1;
133
+ var record_schema = z.object({
134
+ done: z.array(z.string()),
135
+ started: z.array(z.string()).default([])
136
+ });
137
+ var EMPTY_RECORD = { done: [], started: [] };
138
+ function record_path(repository2, issue) {
139
+ return stamp_file.stamp_path(`${RECORD_PREFIX}${issue}${RECORD_SEPARATOR}`, repository2);
140
+ }
141
+ function parse_record(raw) {
142
+ return json_value.parse_with(raw, record_schema) ?? EMPTY_RECORD;
143
+ }
144
+ function read_record(target) {
145
+ const raw = stamp_file.read_stamp_text(target);
146
+ return raw === void 0 ? EMPTY_RECORD : parse_record(raw);
147
+ }
148
+ function read_done(target) {
149
+ return new Set(read_record(target).done);
150
+ }
151
+ function mark_done(target, stage) {
152
+ const record = read_record(target);
153
+ stamp_file.replace_stamp(target, { ...record, done: [.../* @__PURE__ */ new Set([...record.done, stage])] });
154
+ }
155
+ function read_started(target) {
156
+ return read_record(target).started;
157
+ }
158
+ function mark_started(target, stage) {
159
+ const record = read_record(target);
160
+ stamp_file.replace_stamp(target, { ...record, started: [.../* @__PURE__ */ new Set([...record.started, stage])] });
161
+ }
162
+ function end_attempt(target) {
163
+ stamp_file.replace_stamp(target, { ...read_record(target), started: [] });
164
+ }
165
+ function clear(target) {
166
+ stamp_file.remove_stamp(target);
167
+ }
168
+ function is_shipped(state) {
169
+ return state.is_committed && state.is_pushed;
170
+ }
171
+ var DONE_BY = {
172
+ // The preflight asks what the commit stage would refuse on, so a commit is
173
+ // its output as it is the gate's; a resumed commit stage still asks `git -y`'s own preflight.
174
+ [STAGE.PREFLIGHT]: (_done, state) => state.is_merged || state.is_committed,
175
+ // The `--review` round precedes the commit, so a commit is its output as it
176
+ // is the gate's. A record alone is not honored: before a commit the tree may have been edited since
177
+ // the recorded round, and only a commit pins the tree that round read.
178
+ [STAGE.REVIEW]: (_done, state) => state.is_merged || state.is_committed,
179
+ [STAGE.GATE]: (_done, state) => state.is_merged || state.is_committed,
180
+ // The merge of the default branch before the commit: once committed, a
181
+ // conflicting pull request is the followup's to merge again.
182
+ [STAGE.SYNC]: (_done, state) => state.is_merged || state.is_committed,
183
+ [STAGE.COMMIT]: (done, state) => state.is_merged || done.has(STAGE.COMMIT) && is_shipped(state),
184
+ // The round-2 pass reads the pushed fix delta, so its record is honored only
185
+ // while that push still stands — new work pushed on top reruns it.
186
+ [STAGE.ROUND_TWO]: (done, state) => state.is_merged || done.has(STAGE.ROUND_TWO) && is_shipped(state),
187
+ // A recorded followup still needs the shipped state: a record left by a merged ship whose report
188
+ // failed must not pass over the followup of new, not-yet-pushed work on the same issue.
189
+ [STAGE.FOLLOWUP]: (done, state) => state.is_merged || done.has(STAGE.FOLLOWUP) && is_shipped(state),
190
+ [STAGE.REPORT]: (done) => done.has(STAGE.REPORT)
191
+ };
192
+ function is_done(stage, done, state, has_body = false) {
193
+ if (has_body && stage === STAGE.COMMIT && !state.is_merged) return false;
194
+ return DONE_BY[stage](done, state);
195
+ }
196
+ function commit_flags(state) {
197
+ if (!state.is_committed) return [];
198
+ return state.is_pushed ? [SKIP_COMMIT_FLAG, SKIP_PUSH_FLAG] : [SKIP_COMMIT_FLAG];
199
+ }
200
+ function event_text(issue, stage, phase, started = []) {
201
+ const words = [issue_cite.plain(issue), stage, phase];
202
+ const listed = [...new Set(started)].join(STARTED_SEPARATOR);
203
+ const full = started.length > 0 ? [...words, listed] : words;
204
+ return full.join(WORD_SEPARATOR);
205
+ }
206
+ function started_of(text) {
207
+ return text.split(WORD_SEPARATOR, WORD_COUNT)[STARTED_INDEX]?.split(STARTED_SEPARATOR);
208
+ }
209
+ var CONFLICT = "conflict";
210
+ function stop_reason(stage, conflicts = []) {
211
+ return conflicts.length > 0 ? CONFLICT : stage;
212
+ }
213
+ var run_ship_stage = {
214
+ PHASE,
215
+ STAGE,
216
+ clear,
217
+ commit_flags,
218
+ end_attempt,
219
+ event_text,
220
+ is_done,
221
+ mark_done,
222
+ mark_started,
223
+ read_done,
224
+ read_started,
225
+ record_path,
226
+ started_of,
227
+ stop_reason
228
+ };
229
+
230
+ // scripts/run/ship/run-ship-next.ts
231
+ var { STAGE: STAGE2 } = run_ship_stage;
232
+ var COMMAND = {
233
+ LOG: "pnpm josh ship --log",
234
+ DETACH: "pnpm josh ship --detach",
235
+ DETACH_REVIEW: "pnpm josh ship --detach --review"
236
+ };
237
+ var ESCAPED_QUOTE = String.raw`'\''`;
238
+ var BARE_WORD = /^[\w%+,./:=@-]+$/u;
239
+ function quoted(title) {
240
+ return `'${title.split("'").join(ESCAPED_QUOTE)}'`;
241
+ }
242
+ function shell_word(token) {
243
+ return BARE_WORD.test(token) ? token : quoted(token);
244
+ }
245
+ function resume_of(args) {
246
+ const cites = args.cites.flatMap((cite) => ["--cite", cite]);
247
+ return {
248
+ title: args.title,
249
+ flags: [...args.notify, ...args.body, ...cites],
250
+ is_review: args.is_review
251
+ };
252
+ }
253
+ function ship_command(command, resume) {
254
+ const words = [...resume.flags, resume.title].map((token) => shell_word(token));
255
+ return [command, ...words].join(" ");
256
+ }
257
+ function detach_again(resume) {
258
+ return `leave the fix uncommitted and run \`${ship_command(COMMAND.DETACH, resume)}\`.`;
259
+ }
260
+ function detach_as_started(resume) {
261
+ const command = resume.is_review ? COMMAND.DETACH_REVIEW : COMMAND.DETACH;
262
+ return `leave the fix uncommitted and run \`${ship_command(command, resume)}\`.`;
263
+ }
264
+ var AFTER_FIX = {
265
+ [STAGE2.PREFLIGHT]: detach_as_started,
266
+ [STAGE2.REVIEW]: detach_as_started,
267
+ [STAGE2.GATE]: detach_as_started,
268
+ [STAGE2.SYNC]: detach_as_started,
269
+ [STAGE2.COMMIT]: detach_as_started,
270
+ [STAGE2.ROUND_TWO]: detach_again,
271
+ [STAGE2.FOLLOWUP]: detach_again,
272
+ [STAGE2.REPORT]: detach_again
273
+ };
274
+ function conflict_step(conflicts) {
275
+ return `Resolve the conflict with origin/main in ${conflicts.join(", ")} (the merge is left in progress: remove the conflict markers in those files), then`;
276
+ }
277
+ function next_step(issue, stage, resume) {
278
+ const conflicts = resume.conflicts ?? [];
279
+ if (conflicts.length > 0) return `${conflict_step(conflicts)} ${AFTER_FIX[stage](resume)}`;
280
+ return `Read the stopped report with \`${COMMAND.LOG} ${issue}\`, fix the ${stage} failure, then ${AFTER_FIX[stage](resume)}`;
281
+ }
282
+ var run_ship_next = { COMMAND, next_step, quoted, resume_of };
283
+
284
+ // scripts/lane/lane-child-invocation.ts
285
+ var CHILD_INVOCATION = "fullrun";
286
+ var RESUME_GUIDE = ".claude/skills/workflow-commands/pre-gate-cut.md";
287
+ var SHIP_PROCESS = String.raw`(josh(\.[jt]s)? ship|run-ship-cli\.ts)`;
288
+ function child_invocation(issue) {
289
+ issue_number_shape.require_issue_number(issue);
290
+ return `${CHILD_INVOCATION} ${issue_cite.plain(issue)}`;
291
+ }
292
+ function process_pattern(issue) {
293
+ issue_number_shape.require_issue_number(issue);
294
+ return `(${CHILD_INVOCATION}|${SHIP_PROCESS} .*) ${issue_cite.plain(issue)}$`;
295
+ }
296
+ function resume_invocation(issue) {
297
+ const preamble = `Resuming the lane child for issue ${issue_cite.plain(issue)} \u2014 do not re-read the workflow-commands entry documents (SKILL.md, fullrun.md). Run \`pnpm josh run:cut --resume ${issue}\` before anything else and follow the matching verdict in ${RESUME_GUIDE}: \`resume\` goes to the gate, \`resume-impl\` continues implementation. Only on \`fresh\` proceed as an ordinary`;
298
+ return `${preamble} ${child_invocation(issue)}`;
299
+ }
300
+ function outage_resume_invocation(issue) {
301
+ const preamble = `Resuming the lane child for issue ${issue_cite.plain(issue)} after an API disconnection \u2014 your session was restored with its full context, so do not re-read the workflow-commands entry documents (SKILL.md, fullrun.md). Continue the run from where it stopped: run \`pnpm josh run:step ${issue}\` to find the next action, redoing only the last step if it did not complete.`;
302
+ return `${preamble} ${child_invocation(issue)}`;
303
+ }
304
+ function ship_stop_invocation(issue, stop) {
305
+ const opening = `Resuming the lane child for issue ${issue_cite.plain(issue)} after its detached ship supervisor stopped at a failed stage \u2014 do not re-read the workflow-commands entry documents (SKILL.md, fullrun.md).`;
306
+ const next = stop === void 0 ? `Run \`pnpm josh run:step ${issue}\` and read the stopped report it names, fix what stopped the ship, then hand the region back per chain-rule.md.` : run_ship_next.next_step(issue, stop.stage, stop);
307
+ return `${opening} ${next} Do not re-plan or re-implement what is already on the branch. ${child_invocation(issue)}`;
308
+ }
309
+ var lane_child_invocation = {
310
+ child_invocation,
311
+ outage_resume_invocation,
312
+ process_pattern,
313
+ resume_invocation,
314
+ ship_stop_invocation
315
+ };
316
+
317
+ // scripts/lane/lane-reap.ts
318
+ var PGREP_COMMAND = "pgrep";
319
+ var MATCH_FULL_COMMAND_LINE = "-f";
320
+ var CHILDREN_OF_FLAG = "-P";
321
+ var PS_COMMAND = "/bin/ps";
322
+ var PARENT_FORMAT = ["-o", "ppid=", "-p"];
323
+ var TERMINATE_SIGNAL = "SIGTERM";
324
+ var LOWEST_CHILD_PID = 2;
325
+ function parse_pids(printed) {
326
+ return printed.split("\n").map((line) => Number(line.trim())).filter((pid) => Number.isSafeInteger(pid) && pid >= LOWEST_CHILD_PID);
327
+ }
328
+ function run_probe(command, args) {
329
+ try {
330
+ return execFileSync(command, [...args], {
331
+ encoding: "utf8",
332
+ timeout: PROBE_TIMEOUT_MS,
333
+ stdio: ["ignore", "pipe", "ignore"]
334
+ });
335
+ } catch {
336
+ return "";
337
+ }
338
+ }
339
+ function parent_of(pid) {
340
+ return parse_pids(run_probe(PS_COMMAND, [...PARENT_FORMAT, String(pid)]))[0];
341
+ }
342
+ function terminate(pid) {
343
+ try {
344
+ process.kill(pid, TERMINATE_SIGNAL);
345
+ return true;
346
+ } catch {
347
+ return false;
348
+ }
349
+ }
350
+ var SYSTEM_PROBES = {
351
+ matching: (pattern) => parse_pids(run_probe(PGREP_COMMAND, [MATCH_FULL_COMMAND_LINE, pattern])),
352
+ children_of: (pid) => parse_pids(run_probe(PGREP_COMMAND, [CHILDREN_OF_FLAG, String(pid)])),
353
+ parent_of,
354
+ terminate
355
+ };
356
+ function ancestry_of(pid, probes) {
357
+ const ancestry = /* @__PURE__ */ new Set([pid]);
358
+ let current = probes.parent_of(pid);
359
+ while (current !== void 0 && !ancestry.has(current)) {
360
+ ancestry.add(current);
361
+ current = probes.parent_of(current);
362
+ }
363
+ return ancestry;
364
+ }
365
+ function own_ancestry(probes = SYSTEM_PROBES) {
366
+ return ancestry_of(process.pid, probes);
367
+ }
368
+ function tree_of(roots, probes) {
369
+ const tree = [];
370
+ const pending = [...roots];
371
+ let next = pending.shift();
372
+ while (next !== void 0) {
373
+ if (!tree.includes(next)) {
374
+ tree.push(next);
375
+ pending.push(...probes.children_of(next));
376
+ }
377
+ next = pending.shift();
378
+ }
379
+ return tree;
380
+ }
381
+ function reap_child(issue, probes = SYSTEM_PROBES) {
382
+ const own2 = own_ancestry(probes);
383
+ const pattern = lane_child_invocation.process_pattern(issue);
384
+ const roots = probes.matching(pattern).filter((pid) => !own2.has(pid));
385
+ const doomed = tree_of(roots, probes).filter((pid) => !own2.has(pid));
386
+ return doomed.filter((pid) => probes.terminate(pid));
387
+ }
388
+ var lane_reap = {
389
+ own_ancestry,
390
+ parse_pids,
391
+ reap_child
392
+ };
393
+
394
+ // scripts/lane/lane-registry.ts
395
+ import { existsSync as existsSync2 } from "node:fs";
396
+ import path2 from "node:path";
397
+
398
+ // scripts/discovery/repo-discovery.ts
399
+ import { existsSync, readdirSync, readFileSync, statSync } from "node:fs";
400
+ import path from "node:path";
401
+
402
+ // scripts/discovery/repo-origin.ts
403
+ var GITHUB_HOST = "github.com";
404
+ var SSH_ALIAS_PATTERN = /^github(?:-\w+)*$/u;
405
+ var GIT_SUFFIX = ".git";
406
+ var PATH_SEPARATOR = "/";
407
+ var USER_SEPARATOR = "@";
408
+ var HOST_SEPARATOR = ":";
409
+ var OWNER_INDEX = 0;
410
+ var REPO_INDEX = 1;
411
+ var REPO_PATH_SEGMENTS = 2;
412
+ var NOT_FOUND = -1;
413
+ var SECTION_PREFIX = "[";
414
+ var ORIGIN_SECTION = /^\[remote\s+"origin"\]$/u;
415
+ var REMOTE_SECTION = /^\[remote\s+"[^"]+"\]$/u;
416
+ var URL_KEY = "url";
417
+ function is_github_hostname(host) {
418
+ return host.toLowerCase() === GITHUB_HOST;
419
+ }
420
+ function is_github_ssh_host(host) {
421
+ const normalized = host.toLowerCase();
422
+ return is_github_hostname(normalized) || SSH_ALIAS_PATTERN.test(normalized);
423
+ }
424
+ function strip_git_suffix(name) {
425
+ return name.endsWith(GIT_SUFFIX) ? name.slice(0, -GIT_SUFFIX.length) : name;
426
+ }
427
+ function to_identity(repository_path) {
428
+ const segments = repository_path.split(PATH_SEPARATOR).filter((segment) => segment !== "");
429
+ if (segments.length !== REPO_PATH_SEGMENTS) return void 0;
430
+ const owner = segments[OWNER_INDEX] ?? "";
431
+ const repo = strip_git_suffix(segments[REPO_INDEX] ?? "");
432
+ return repo === "" ? void 0 : { owner, repo };
433
+ }
434
+ function parse_scp_like(url) {
435
+ const user_end = url.indexOf(USER_SEPARATOR);
436
+ const authority = user_end === NOT_FOUND ? url : url.slice(user_end + 1);
437
+ const host_end = authority.indexOf(HOST_SEPARATOR);
438
+ if (host_end === NOT_FOUND) return void 0;
439
+ if (!is_github_ssh_host(authority.slice(0, host_end))) return void 0;
440
+ return to_identity(authority.slice(host_end + 1));
441
+ }
442
+ function parse_url_like(url) {
443
+ try {
444
+ const parsed = new URL(url);
445
+ return is_github_hostname(parsed.hostname) ? to_identity(parsed.pathname) : void 0;
446
+ } catch {
447
+ return void 0;
448
+ }
449
+ }
450
+ function parse_origin_url(url) {
451
+ const trimmed2 = url.trim();
452
+ if (trimmed2 === "") return void 0;
453
+ return parse_url_like(trimmed2) ?? parse_scp_like(trimmed2);
454
+ }
455
+ function is_section_header(line) {
456
+ return line.startsWith(SECTION_PREFIX);
457
+ }
458
+ function origin_section_lines(lines) {
459
+ const start = lines.findIndex((line) => ORIGIN_SECTION.test(line));
460
+ if (start === NOT_FOUND) return [];
461
+ const rest = lines.slice(start + 1);
462
+ const end = rest.findIndex((line) => is_section_header(line));
463
+ return end === NOT_FOUND ? rest : rest.slice(0, end);
464
+ }
465
+ function url_value(line) {
466
+ const separator = line.indexOf("=");
467
+ if (separator === NOT_FOUND) return void 0;
468
+ if (line.slice(0, separator).trim() !== URL_KEY) return void 0;
469
+ return line.slice(separator + 1).trim();
470
+ }
471
+ function parse_origin_from_config(content) {
472
+ const lines = content.split("\n").map((line) => line.trim());
473
+ return origin_section_lines(lines).map((line) => url_value(line)).find((url) => url !== void 0);
474
+ }
475
+ function section_groups(lines) {
476
+ const groups = [];
477
+ for (const line of lines) {
478
+ if (is_section_header(line)) groups.push([line]);
479
+ else groups.at(-1)?.push(line);
480
+ }
481
+ return groups;
482
+ }
483
+ function parse_remote_urls_from_config(content) {
484
+ const lines = content.split("\n").map((line) => line.trim());
485
+ return section_groups(lines).filter((group) => REMOTE_SECTION.test(group[0] ?? "")).flatMap((group) => group.map((line) => url_value(line))).filter((url) => url !== void 0);
486
+ }
487
+ function format_identity(identity) {
488
+ return `${identity.owner}${PATH_SEPARATOR}${identity.repo}`.toLowerCase();
489
+ }
490
+ var repo_origin = {
491
+ GITHUB_HOST,
492
+ is_github_hostname,
493
+ is_github_ssh_host,
494
+ parse_origin_from_config,
495
+ parse_origin_url,
496
+ parse_remote_urls_from_config,
497
+ format_identity
498
+ };
499
+
500
+ // scripts/discovery/repo-map-logic.ts
501
+ var OVERRIDE_ENTRY_SEPARATOR = ",";
502
+ var OVERRIDE_PAIR_SEPARATOR = "=";
503
+ var OVERRIDE_PAIR_PARTS = 2;
504
+ var KEY_INDEX = 0;
505
+ var PATH_INDEX = 1;
506
+ function is_same_owner(identity, current_owner) {
507
+ return identity.owner.toLowerCase() === current_owner.toLowerCase();
508
+ }
509
+ function add_entry(target, origin_url, repository_path, current_owner) {
510
+ if (origin_url === void 0) return;
511
+ const identity = repo_origin.parse_origin_url(origin_url);
512
+ if (identity === void 0 || !is_same_owner(identity, current_owner)) return;
513
+ target.set(repo_origin.format_identity(identity), repository_path);
514
+ }
515
+ function parse_override_entry(entry) {
516
+ const parts = entry.split(OVERRIDE_PAIR_SEPARATOR).map((part) => part.trim());
517
+ if (parts.length !== OVERRIDE_PAIR_PARTS) return void 0;
518
+ const key = parts[KEY_INDEX] ?? "";
519
+ const repository_path = parts[PATH_INDEX] ?? "";
520
+ if (repository_path === "") return void 0;
521
+ return { path: repository_path, origin_url: `https://${repo_origin.GITHUB_HOST}/${key}` };
522
+ }
523
+ function parse_overrides(raw) {
524
+ if (raw === void 0) return [];
525
+ return raw.split(OVERRIDE_ENTRY_SEPARATOR).map((entry) => parse_override_entry(entry)).filter((entry) => entry !== void 0);
526
+ }
527
+ function build_repository_map(discovered, current_owner, override_value2) {
528
+ const result = /* @__PURE__ */ new Map();
529
+ for (const entry of discovered) add_entry(result, entry.origin_url, entry.path, current_owner);
530
+ for (const entry of parse_overrides(override_value2)) {
531
+ add_entry(result, entry.origin_url, entry.path, current_owner);
532
+ }
533
+ return result;
534
+ }
535
+ var repo_map_logic = {
536
+ is_same_owner,
537
+ build_repository_map
538
+ };
539
+
540
+ // scripts/discovery/repo-discovery.ts
541
+ var GIT_DIRECTORY = ".git";
542
+ var GIT_CONFIG = "config";
543
+ var GITDIR_PREFIX = "gitdir:";
544
+ var COMMON_DIRECTORY_FILE = "commondir";
545
+ var OVERRIDE_ENV_KEY = "JOSH_REPO_PATHS";
546
+ function resolve_common_directory(git_directory) {
547
+ const pointer = path.join(git_directory, COMMON_DIRECTORY_FILE);
548
+ if (!existsSync(pointer)) return git_directory;
549
+ try {
550
+ return path.resolve(git_directory, readFileSync(pointer, "utf8").trim());
551
+ } catch {
552
+ return git_directory;
553
+ }
554
+ }
555
+ function follow_git_file(repository_path, git_file) {
556
+ const pointer = readFileSync(git_file, "utf8").trim();
557
+ if (!pointer.startsWith(GITDIR_PREFIX)) return void 0;
558
+ return path.resolve(repository_path, pointer.slice(GITDIR_PREFIX.length).trim());
559
+ }
560
+ function resolve_git_directory(repository_path) {
561
+ const candidate = path.join(repository_path, GIT_DIRECTORY);
562
+ if (!existsSync(candidate)) return void 0;
563
+ try {
564
+ if (statSync(candidate).isDirectory()) return candidate;
565
+ const linked = follow_git_file(repository_path, candidate);
566
+ return linked === void 0 ? void 0 : resolve_common_directory(linked);
567
+ } catch {
568
+ return void 0;
569
+ }
570
+ }
571
+ function read_config(repository_path) {
572
+ const git_directory = resolve_git_directory(repository_path);
573
+ if (git_directory === void 0) return void 0;
574
+ try {
575
+ return readFileSync(path.join(git_directory, GIT_CONFIG), "utf8");
576
+ } catch {
577
+ return void 0;
578
+ }
579
+ }
580
+ function read_origin_url(repository_path) {
581
+ const config = read_config(repository_path);
582
+ return config === void 0 ? void 0 : repo_origin.parse_origin_from_config(config);
583
+ }
584
+ function read_remote_urls(repository_path) {
585
+ const config = read_config(repository_path);
586
+ return config === void 0 ? [] : repo_origin.parse_remote_urls_from_config(config);
587
+ }
588
+ function sibling_directories(parent) {
589
+ try {
590
+ return readdirSync(parent, { withFileTypes: true }).filter((entry) => entry.isDirectory()).map((entry) => path.join(parent, entry.name)).toSorted((left, right) => left.localeCompare(right));
591
+ } catch {
592
+ return [];
593
+ }
594
+ }
595
+ function scan_siblings(parent) {
596
+ return sibling_directories(parent).map((repository_path) => ({
597
+ path: repository_path,
598
+ origin_url: read_origin_url(repository_path)
599
+ }));
600
+ }
601
+ function resolve_current_owner(repository_path) {
602
+ const origin_url = read_origin_url(repository_path);
603
+ if (origin_url === void 0) return void 0;
604
+ return repo_origin.parse_origin_url(origin_url)?.owner;
605
+ }
606
+ function main_worktree(repository_path) {
607
+ const git_directory = resolve_git_directory(repository_path);
608
+ if (git_directory === void 0) return repository_path;
609
+ if (path.basename(git_directory) !== GIT_DIRECTORY) return repository_path;
610
+ return path.dirname(git_directory);
611
+ }
612
+ function discover_repositories(repository_path, environment3 = process.env) {
613
+ const main = main_worktree(repository_path);
614
+ const current_owner = resolve_current_owner(main);
615
+ if (current_owner === void 0) return /* @__PURE__ */ new Map();
616
+ return repo_map_logic.build_repository_map(
617
+ scan_siblings(path.dirname(main)),
618
+ current_owner,
619
+ environment3[OVERRIDE_ENV_KEY]
620
+ );
621
+ }
622
+ var repo_discovery = {
623
+ OVERRIDE_ENV_KEY,
624
+ main_worktree,
625
+ read_origin_url,
626
+ read_remote_urls,
627
+ resolve_current_owner,
628
+ scan_siblings,
629
+ discover_repositories
630
+ };
631
+
632
+ // scripts/git/git-ls-remote.ts
633
+ var LS_REMOTE_COMMAND = "ls-remote";
634
+ var HEADS_FLAG = "--heads";
635
+ var ORIGIN_REMOTE = "origin";
636
+ var HEADS_REF_PREFIX = "refs/heads/";
637
+ function ls_remote_branch_arguments(branch_name) {
638
+ return [LS_REMOTE_COMMAND, HEADS_FLAG, ORIGIN_REMOTE, `${HEADS_REF_PREFIX}${branch_name}`];
639
+ }
640
+
641
+ // scripts/git/repository-lock.ts
642
+ import { randomUUID } from "node:crypto";
643
+ import { linkSync, renameSync, rmSync } from "node:fs";
644
+ import { setTimeout as sleep } from "node:timers/promises";
645
+
646
+ // scripts/git/git-common-directory.ts
647
+ import { execFileSync as execFileSync2 } from "node:child_process";
648
+
649
+ // scripts/git/git-location-environment.ts
650
+ var GIT_LOCATION_VARIABLES = [
651
+ "GIT_ALTERNATE_OBJECT_DIRECTORIES",
652
+ "GIT_COMMON_DIR",
653
+ "GIT_DIR",
654
+ "GIT_INDEX_FILE",
655
+ "GIT_NAMESPACE",
656
+ "GIT_OBJECT_DIRECTORY",
657
+ "GIT_WORK_TREE"
658
+ ];
659
+ function location_free_environment() {
660
+ return Object.fromEntries(GIT_LOCATION_VARIABLES.map((name) => [name, void 0]));
661
+ }
662
+ function forget(name) {
663
+ Reflect.deleteProperty(process.env, name);
664
+ }
665
+ function restore_one(name, value) {
666
+ if (value === void 0) forget(name);
667
+ else process.env[name] = value;
668
+ }
669
+ function clear_git_location_variables() {
670
+ const previous = GIT_LOCATION_VARIABLES.map((name) => [name, process.env[name]]);
671
+ for (const [name] of previous) forget(name);
672
+ return () => {
673
+ for (const [name, value] of previous) restore_one(name, value);
674
+ };
675
+ }
676
+ var git_location_environment = { clear_git_location_variables, location_free_environment };
677
+
678
+ // scripts/git/git-common-directory.ts
679
+ var OWN_GIT_DIRECTORY = 0;
680
+ var COMMON_GIT_DIRECTORY = 1;
681
+ var PROBE_TIMEOUT_MS2 = 5e3;
682
+ var answers = /* @__PURE__ */ new Map();
683
+ function probe_environment(cwd) {
684
+ if (cwd === void 0) return process.env;
685
+ return { ...process.env, ...git_location_environment.location_free_environment() };
686
+ }
687
+ function cache_key(cwd) {
688
+ if (cwd !== void 0) return `explicit\0${cwd}`;
689
+ const locations = GIT_LOCATION_VARIABLES.map((name) => process.env[name] ?? "");
690
+ return ["inherited", process.cwd(), ...locations].join("\0");
691
+ }
692
+ function read_directories(cwd) {
693
+ try {
694
+ const output = execFileSync2(
695
+ git_utilities.get_git_command_for_spawn(),
696
+ [...git_command.GIT_DIRECTORY_ARGUMENTS],
697
+ {
698
+ cwd,
699
+ env: probe_environment(cwd),
700
+ encoding: "utf8",
701
+ stdio: ["ignore", "pipe", "ignore"],
702
+ timeout: PROBE_TIMEOUT_MS2
703
+ }
704
+ );
705
+ return output.split("\n").filter((line) => line !== "");
706
+ } catch {
707
+ return [];
708
+ }
709
+ }
710
+ function directories(cwd) {
711
+ const key = cache_key(cwd);
712
+ const known = answers.get(key);
713
+ if (known !== void 0) return known;
714
+ const read = read_directories(cwd);
715
+ if (read.length > 0) answers.set(key, read);
716
+ return read;
717
+ }
718
+ function own(cwd) {
719
+ return directories(cwd)[OWN_GIT_DIRECTORY];
720
+ }
721
+ function repository(cwd) {
722
+ return directories(cwd)[COMMON_GIT_DIRECTORY];
723
+ }
724
+ function select_linked(found) {
725
+ const own_directory = found[OWN_GIT_DIRECTORY];
726
+ const common = found[COMMON_GIT_DIRECTORY];
727
+ return own_directory !== void 0 && common !== void 0 && own_directory !== common ? common : void 0;
728
+ }
729
+ function resolve(cwd) {
730
+ return select_linked(directories(cwd));
731
+ }
732
+ var git_common_directory = { directories, own, repository, resolve, select_linked };
733
+
734
+ // scripts/git/repository-lock.ts
735
+ var POLL_INTERVAL_MS = 200;
736
+ var SYNC_POLL_INTERVAL_MS = 10;
737
+ var SLEEP_CELL = new Int32Array(new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT));
738
+ function lock_path(prefix, cwd) {
739
+ return stamp_file.stamp_path(prefix, git_common_directory.repository(cwd) ?? cwd ?? process.cwd());
740
+ }
741
+ function parse_owner(raw) {
742
+ if (raw === void 0) return void 0;
743
+ const parsed = process_owner_schema.safeParse(json_value.parse_or_undefined(raw));
744
+ return parsed.success ? parsed.data : void 0;
745
+ }
746
+ function read_owner(target) {
747
+ return parse_owner(stamp_file.read_stamp_text(target));
748
+ }
749
+ function is_owner_gone(owner) {
750
+ return process_identity.is_same_process(owner.pid, owner.process_start) === false;
751
+ }
752
+ function restore(aside, target) {
753
+ try {
754
+ linkSync(aside, target);
755
+ } catch {
756
+ }
757
+ }
758
+ function stale_record(target, is_gone2) {
759
+ const raw = stamp_file.read_stamp_text(target);
760
+ const owner = parse_owner(raw);
761
+ return owner !== void 0 && is_gone2(owner) ? raw : void 0;
762
+ }
763
+ function move_aside(target) {
764
+ const aside = `${target}.${String(process.pid)}.${randomUUID()}`;
765
+ try {
766
+ renameSync(target, aside);
767
+ return aside;
768
+ } catch {
769
+ return void 0;
770
+ }
771
+ }
772
+ function clear_stale(target, is_gone2 = is_owner_gone) {
773
+ const raw = stale_record(target, is_gone2);
774
+ if (raw === void 0) return;
775
+ const aside = move_aside(target);
776
+ if (aside === void 0) return;
777
+ if (stamp_file.read_stamp_text(aside) !== raw) restore(aside, target);
778
+ rmSync(aside, { force: true });
779
+ }
780
+ function claim(target) {
781
+ clear_stale(target);
782
+ return stamp_file.create_stamp(target, process_identity.own_fields());
783
+ }
784
+ function release(target) {
785
+ const owner = read_owner(target);
786
+ if (owner !== void 0 && process_identity.is_own_process(owner.pid, owner.process_start)) {
787
+ stamp_file.remove_stamp(target);
788
+ }
789
+ }
790
+ async function acquire(target, max_wait_ms) {
791
+ const deadline = Date.now() + max_wait_ms;
792
+ while (!claim(target)) {
793
+ if (Date.now() >= deadline) return false;
794
+ await sleep(POLL_INTERVAL_MS);
795
+ }
796
+ return true;
797
+ }
798
+ function sleep_sync(ms) {
799
+ Atomics.wait(SLEEP_CELL, 0, 0, ms);
800
+ }
801
+ function acquire_sync(target, max_wait_ms) {
802
+ const deadline = Date.now() + max_wait_ms;
803
+ while (!claim(target)) {
804
+ if (Date.now() >= deadline) return false;
805
+ sleep_sync(SYNC_POLL_INTERVAL_MS);
806
+ }
807
+ return true;
808
+ }
809
+ async function with_lock(work, target, max_wait_ms) {
810
+ if (!await acquire(target, max_wait_ms)) return void 0;
811
+ try {
812
+ return await work();
813
+ } finally {
814
+ release(target);
815
+ }
816
+ }
817
+ function with_lock_sync(work, target, max_wait_ms) {
818
+ if (!acquire_sync(target, max_wait_ms)) return void 0;
819
+ try {
820
+ return work();
821
+ } finally {
822
+ release(target);
823
+ }
824
+ }
825
+ var repository_lock = { clear_stale, lock_path, with_lock, with_lock_sync };
826
+
827
+ // scripts/git/git-worktree.ts
828
+ var WORKTREE = "worktree";
829
+ var WORKTREE_LOCK_PREFIX = "josh-worktree-lock-";
830
+ var WORKTREE_LOCK_MAX_WAIT_MS = 12e4;
831
+ async function locked(arguments_, timeout_ms) {
832
+ const target = repository_lock.lock_path(WORKTREE_LOCK_PREFIX);
833
+ const output = await repository_lock.with_lock(
834
+ async () => await git_spawn.read(arguments_, timeout_ms),
835
+ target,
836
+ WORKTREE_LOCK_MAX_WAIT_MS
837
+ );
838
+ if (output === void 0) {
839
+ throw new Error(
840
+ `git ${arguments_.join(" ")}: timed out waiting for the work-tree lock ${target}`
841
+ );
842
+ }
843
+ return output;
844
+ }
845
+ async function worktree_list() {
846
+ return await git_spawn.read([WORKTREE, "list", PORCELAIN_FLAG]);
847
+ }
848
+ async function worktree_add(directory, branch_name, start_point) {
849
+ const flags = start_point === void 0 ? ["add"] : ["add", "--no-track", "-b", branch_name];
850
+ return await locked([WORKTREE, ...flags, directory, start_point ?? branch_name], SUITE_TIMEOUT_MS);
851
+ }
852
+ async function worktree_add_detached(directory, commit) {
853
+ return await locked([WORKTREE, "add", "--detach", directory, commit], SUITE_TIMEOUT_MS);
854
+ }
855
+ async function worktree_remove(directory) {
856
+ return await locked([WORKTREE, "remove", "--force", directory], INSTALL_TIMEOUT_MS);
857
+ }
858
+ async function worktree_prune() {
859
+ return await locked([WORKTREE, "prune"]);
860
+ }
861
+ async function ls_remote_branch(branch_name) {
862
+ return await git_spawn.read_remote(ls_remote_branch_arguments(branch_name));
863
+ }
864
+ async function branch_delete(branch_name) {
865
+ return await git_spawn.read(["branch", "-D", branch_name]);
866
+ }
867
+ var git_worktree = {
868
+ branch_delete,
869
+ ls_remote_branch,
870
+ worktree_add,
871
+ worktree_add_detached,
872
+ worktree_list,
873
+ worktree_prune,
874
+ worktree_remove
875
+ };
876
+
877
+ // scripts/agent/agent-role-profile.ts
878
+ import { z as z2 } from "zod";
879
+ var FIRST_PRINTABLE_CODE = 32;
880
+ var DELETE_CODE = 127;
881
+ var FIRST_CODE_POINT = 0;
882
+ var EMPTY_LENGTH = 0;
883
+ var MAX_VALUE_LENGTH = 4096;
884
+ var ROLE_SCHEMA = z2.enum(["scheduler", "worker", "reviewer"]);
885
+ var PROVIDER_SCHEMA = z2.enum(["anthropic", "openai"]);
886
+ var EFFORT_SCHEMA = z2.enum(["low", "medium", "high", "xhigh", "max"]);
887
+ var PHASE_SCHEMA = z2.enum(["implementation", "pre-gate"]);
888
+ var PROFILE_SCHEMA = z2.object({
889
+ provider: PROVIDER_SCHEMA.default("anthropic"),
890
+ role: ROLE_SCHEMA,
891
+ model: z2.string(),
892
+ effort: EFFORT_SCHEMA
893
+ });
894
+ var SCHEDULER = "scheduler";
895
+ var WORKER = "worker";
896
+ var REVIEWER = "reviewer";
897
+ var IMPLEMENTATION_PHASE = "implementation";
898
+ var PRE_GATE_PHASE = "pre-gate";
899
+ var ANTHROPIC_PROVIDER = "anthropic";
900
+ var OPENAI_PROVIDER = "openai";
901
+ var OPENAI_MODEL = "gpt-6.1-sol";
902
+ var ANTHROPIC_MODEL = "claude-opus-5-5";
903
+ var CODEX_SESSION_KEY = "CODEX_THREAD_ID";
904
+ var DEFAULT_PROFILES = {
905
+ scheduler: {
906
+ provider: ANTHROPIC_PROVIDER,
907
+ role: SCHEDULER,
908
+ model: ANTHROPIC_MODEL,
909
+ effort: "medium"
910
+ },
911
+ worker: { provider: ANTHROPIC_PROVIDER, role: WORKER, model: ANTHROPIC_MODEL, effort: "medium" },
912
+ reviewer: {
913
+ provider: ANTHROPIC_PROVIDER,
914
+ role: REVIEWER,
915
+ model: ANTHROPIC_MODEL,
916
+ effort: "high"
917
+ }
918
+ };
919
+ var OPENAI_PROFILES = {
920
+ scheduler: { provider: OPENAI_PROVIDER, role: SCHEDULER, model: OPENAI_MODEL, effort: "medium" },
921
+ worker: { provider: OPENAI_PROVIDER, role: WORKER, model: OPENAI_MODEL, effort: "medium" },
922
+ reviewer: { provider: OPENAI_PROVIDER, role: REVIEWER, model: OPENAI_MODEL, effort: "high" }
923
+ };
924
+ var PROVIDER_PROFILES = { anthropic: DEFAULT_PROFILES, openai: OPENAI_PROFILES };
925
+ var SHIP_EFFORT = "low";
926
+ var PHASE_EFFORT = {
927
+ worker: { [PRE_GATE_PHASE]: SHIP_EFFORT }
928
+ };
929
+ var ENV_KEYS = {
930
+ scheduler: { model: "JOSH_SCHEDULER_MODEL", effort: "JOSH_SCHEDULER_EFFORT" },
931
+ worker: { model: "JOSH_WORKER_MODEL", effort: "JOSH_WORKER_EFFORT" },
932
+ reviewer: { model: "JOSH_REVIEWER_MODEL", effort: "JOSH_REVIEWER_EFFORT" }
933
+ };
934
+ var LEGACY_WORKER_KEYS = { model: "JOSH_LANE_MODEL", effort: "JOSH_LANE_EFFORT" };
935
+ function is_control_character(character) {
936
+ const code = character.codePointAt(FIRST_CODE_POINT) ?? FIRST_PRINTABLE_CODE;
937
+ return code < FIRST_PRINTABLE_CODE || code === DELETE_CODE;
938
+ }
939
+ function is_safe_value(value) {
940
+ if (value.length === EMPTY_LENGTH || value.length > MAX_VALUE_LENGTH) return false;
941
+ for (const character of value) if (is_control_character(character)) return false;
942
+ return true;
943
+ }
944
+ function trimmed(value) {
945
+ const result = value?.trim();
946
+ return result === void 0 || result.length === EMPTY_LENGTH ? void 0 : result;
947
+ }
948
+ function override_value(role, field, environment3) {
949
+ const key = ENV_KEYS[role][field];
950
+ const value = trimmed(environment3[key]);
951
+ if (value !== void 0) return { key, value };
952
+ if (role !== WORKER) return { key, value: void 0 };
953
+ const legacy = LEGACY_WORKER_KEYS[field];
954
+ const legacy_value = trimmed(environment3[legacy]);
955
+ return legacy_value === void 0 ? { key, value: void 0 } : { key: legacy, value: legacy_value };
956
+ }
957
+ function model_override(role, environment3, provider) {
958
+ const key = ENV_KEYS[role].model;
959
+ return provider === OPENAI_PROVIDER ? { key, value: void 0 } : override_value(role, "model", environment3);
960
+ }
961
+ function rejection(key, value, expected) {
962
+ return { kind: "rejected", note: `${key}=${value} ${expected}, so the agent was not started` };
963
+ }
964
+ function resolved_effort(override, fallback) {
965
+ const parsed = EFFORT_SCHEMA.safeParse(override.value ?? fallback);
966
+ return parsed.success ? { kind: "effort", effort: parsed.data } : rejection(override.key, override.value ?? "", "is not an allowed effort");
967
+ }
968
+ function has_session(environment3, keys) {
969
+ return keys.some((key) => trimmed(environment3[key]) !== void 0);
970
+ }
971
+ var CONFLICTING_SESSIONS = {
972
+ kind: "rejected",
973
+ note: "both Codex and Claude Code sessions were detected"
974
+ };
975
+ var HANDED_PROVIDER_KEY = "JOSH_AGENT_PROVIDER";
976
+ var DEFAULT_PROVIDER = {
977
+ kind: "provider",
978
+ provider: ANTHROPIC_PROVIDER,
979
+ is_default: true
980
+ };
981
+ var DEFAULT_NOTICE = ` No agent session or ${HANDED_PROVIDER_KEY} was found, so the provider defaulted to ${ANTHROPIC_PROVIDER} (Claude Code).`;
982
+ function handed_provider(environment3) {
983
+ const value = trimmed(environment3[HANDED_PROVIDER_KEY]);
984
+ if (value === void 0) return DEFAULT_PROVIDER;
985
+ const parsed = PROVIDER_SCHEMA.safeParse(value);
986
+ return parsed.success ? { kind: "provider", provider: parsed.data } : rejection(HANDED_PROVIDER_KEY, value, "is not an allowed provider");
987
+ }
988
+ function detected_provider(environment3) {
989
+ const has_codex = has_session(environment3, [CODEX_SESSION_KEY]);
990
+ const has_claude = has_session(environment3, agent_session_environment.PARENT_SESSION_KEYS);
991
+ if (has_codex === has_claude) return has_codex ? CONFLICTING_SESSIONS : void 0;
992
+ return { kind: "provider", provider: has_codex ? OPENAI_PROVIDER : ANTHROPIC_PROVIDER };
993
+ }
994
+ function resolve_provider(environment3 = process.env) {
995
+ return detected_provider(environment3) ?? handed_provider(environment3);
996
+ }
997
+ function default_notice(environment3 = process.env) {
998
+ const selected = resolve_provider(environment3);
999
+ return selected.kind === "provider" && selected.is_default === true ? DEFAULT_NOTICE : "";
1000
+ }
1001
+ function warn_of_default(environment3 = process.env) {
1002
+ const notice = default_notice(environment3).trim();
1003
+ if (notice !== "") console.error(notice);
1004
+ }
1005
+ function has_completion_callback(environment3 = process.env) {
1006
+ const selected = resolve_provider(environment3);
1007
+ return selected.kind !== "provider" || selected.provider !== OPENAI_PROVIDER;
1008
+ }
1009
+ function handoff_environment(environment3 = process.env) {
1010
+ const selected = resolve_provider(environment3);
1011
+ return selected.kind === "provider" ? { [HANDED_PROVIDER_KEY]: selected.provider } : {};
1012
+ }
1013
+ function validate(profile, model_key) {
1014
+ if (!is_safe_value(profile.model)) {
1015
+ return rejection(model_key, profile.model, "is not a safe model");
1016
+ }
1017
+ return { kind: "profile", profile };
1018
+ }
1019
+ function phase_effort(role, phase, fallback) {
1020
+ const parsed = PHASE_SCHEMA.safeParse(phase);
1021
+ if (!parsed.success) return fallback;
1022
+ return PHASE_EFFORT[role]?.[parsed.data] ?? fallback;
1023
+ }
1024
+ function overridden_effort(profile, phase, environment3) {
1025
+ const parsed = EFFORT_SCHEMA.safeParse(override_value(profile.role, "effort", environment3).value);
1026
+ return parsed.success ? parsed.data : phase_effort(profile.role, phase, profile.effort);
1027
+ }
1028
+ function with_phase_effort(profile, phase, environment3 = process.env) {
1029
+ return { ...profile, effort: overridden_effort(profile, phase, environment3) };
1030
+ }
1031
+ function resolve2(role, environment3 = process.env, phase) {
1032
+ const selected = resolve_provider(environment3);
1033
+ if (selected.kind === "rejected") return selected;
1034
+ const defaults = PROVIDER_PROFILES[selected.provider][role];
1035
+ const model = model_override(role, environment3, selected.provider);
1036
+ const effort = override_value(role, "effort", environment3);
1037
+ const resolved = resolved_effort(effort, phase_effort(role, phase, defaults.effort));
1038
+ if (resolved.kind === "rejected") return resolved;
1039
+ const profile = {
1040
+ provider: selected.provider,
1041
+ role,
1042
+ model: model.value ?? defaults.model,
1043
+ effort: resolved.effort
1044
+ };
1045
+ return validate(profile, model.key);
1046
+ }
1047
+ function describe(profile) {
1048
+ return `provider=${profile.provider} role=${profile.role} model=${profile.model} effort=${profile.effort}`;
1049
+ }
1050
+ function parse(value) {
1051
+ const parsed = PROFILE_SCHEMA.safeParse(value);
1052
+ return parsed.success && is_safe_value(parsed.data.model) ? parsed.data : void 0;
1053
+ }
1054
+ var agent_role_profile = {
1055
+ CODEX_SESSION_KEY,
1056
+ DEFAULT_PROFILES,
1057
+ HANDED_PROVIDER_KEY,
1058
+ IMPLEMENTATION_PHASE,
1059
+ MAX_VALUE_LENGTH,
1060
+ OPENAI_PROFILES,
1061
+ PRE_GATE_PHASE,
1062
+ PROFILE_SCHEMA,
1063
+ REVIEWER,
1064
+ SCHEDULER,
1065
+ WORKER,
1066
+ default_notice,
1067
+ describe,
1068
+ handoff_environment,
1069
+ has_completion_callback,
1070
+ is_safe_value,
1071
+ parse,
1072
+ resolve: resolve2,
1073
+ resolve_provider,
1074
+ warn_of_default,
1075
+ with_phase_effort
1076
+ };
1077
+
1078
+ // scripts/lane/lane-environment.ts
1079
+ var LANE_OUTPUT_KEY = "JOSH_LANE_OUTPUT";
1080
+ var LANE_PROVIDER_KEY = "JOSH_LANE_AGENT_PROVIDER";
1081
+ var LANE_ROLE_KEY = "JOSH_LANE_AGENT_ROLE";
1082
+ var LANE_MODEL_KEY = "JOSH_LANE_AGENT_MODEL";
1083
+ var LANE_EFFORT_KEY = "JOSH_LANE_AGENT_EFFORT";
1084
+ var ASSIGNMENT_SEPARATOR = "=";
1085
+ var EXPORT_PREFIX = "export ";
1086
+ var QUOTE_CHARACTERS = /* @__PURE__ */ new Set(['"', "'"]);
1087
+ var MIN_QUOTED_LENGTH = 2;
1088
+ var FIRST_CHARACTER_END = 1;
1089
+ var LAST_CHARACTER_START = -1;
1090
+ function strip_export(line) {
1091
+ const trimmed2 = line.trimStart();
1092
+ return trimmed2.startsWith(EXPORT_PREFIX) ? trimmed2.slice(EXPORT_PREFIX.length).trimStart() : trimmed2;
1093
+ }
1094
+ function is_key_line(line, key) {
1095
+ const body = strip_export(line);
1096
+ if (!body.startsWith(key)) return false;
1097
+ return body.slice(key.length).trimStart().startsWith(ASSIGNMENT_SEPARATOR);
1098
+ }
1099
+ function is_seat_line(line) {
1100
+ return is_key_line(line, LANE_SEAT_KEY);
1101
+ }
1102
+ function is_output_line(line) {
1103
+ return is_key_line(line, LANE_OUTPUT_KEY);
1104
+ }
1105
+ function split_lines(content) {
1106
+ const trimmed2 = content.trimEnd();
1107
+ return trimmed2.length === 0 ? [] : trimmed2.split("\n");
1108
+ }
1109
+ function is_quoted(raw) {
1110
+ const first = raw.slice(0, FIRST_CHARACTER_END);
1111
+ if (!QUOTE_CHARACTERS.has(first)) return false;
1112
+ return raw.length >= MIN_QUOTED_LENGTH && raw.endsWith(first);
1113
+ }
1114
+ function unquote(raw) {
1115
+ return is_quoted(raw) ? raw.slice(FIRST_CHARACTER_END, LAST_CHARACTER_START) : raw;
1116
+ }
1117
+ function assignment_value(line) {
1118
+ return unquote(line.slice(line.indexOf(ASSIGNMENT_SEPARATOR) + FIRST_CHARACTER_END).trim());
1119
+ }
1120
+ function read_assignment(content, key) {
1121
+ const line = split_lines(content).findLast((entry) => is_key_line(entry, key));
1122
+ return line === void 0 ? void 0 : assignment_value(line);
1123
+ }
1124
+ function read_root_seed(content) {
1125
+ return ports.resolve_seed({ [PORT_SEED_KEY]: read_assignment(content, PORT_SEED_KEY) });
1126
+ }
1127
+ function read_lane_seat(content) {
1128
+ const raw = read_assignment(content, LANE_SEAT_KEY);
1129
+ return raw === void 0 ? void 0 : ports.resolve_lane({ [LANE_SEAT_KEY]: raw });
1130
+ }
1131
+ function read_lane_ports(content) {
1132
+ const environment3 = {
1133
+ [PORT_SEED_KEY]: read_assignment(content, PORT_SEED_KEY),
1134
+ [LANE_SEAT_KEY]: read_assignment(content, LANE_SEAT_KEY)
1135
+ };
1136
+ return {
1137
+ development: ports.resolve_development_port(environment3),
1138
+ preview: ports.resolve_preview_port(environment3)
1139
+ };
1140
+ }
1141
+ function read_lane_output(content) {
1142
+ const line = split_lines(content).findLast((entry) => is_output_line(entry));
1143
+ const raw = line === void 0 ? void 0 : assignment_value(line);
1144
+ return raw === void 0 || raw.length === 0 ? void 0 : raw;
1145
+ }
1146
+ function read_lane_profile(content) {
1147
+ return agent_role_profile.parse({
1148
+ provider: read_assignment(content, LANE_PROVIDER_KEY),
1149
+ role: read_assignment(content, LANE_ROLE_KEY),
1150
+ model: read_assignment(content, LANE_MODEL_KEY),
1151
+ effort: read_assignment(content, LANE_EFFORT_KEY)
1152
+ });
1153
+ }
1154
+ function replace_assignment(lines, keep, assignment, key) {
1155
+ return lines.flatMap((entry, index) => {
1156
+ if (index === keep) return [assignment];
1157
+ if (is_key_line(entry, key)) return [];
1158
+ return [entry];
1159
+ });
1160
+ }
1161
+ function upsert_assignment(content, key, value) {
1162
+ const assignment = `${key}${ASSIGNMENT_SEPARATOR}${value}`;
1163
+ const lines = split_lines(content);
1164
+ const last = lines.findLastIndex((entry) => is_key_line(entry, key));
1165
+ const body = last === -1 ? [...lines, assignment] : replace_assignment(lines, last, assignment, key);
1166
+ return `${body.join("\n")}
1167
+ `;
1168
+ }
1169
+ function lane_file_content(root_content, seat) {
1170
+ return upsert_assignment(root_content, LANE_SEAT_KEY, String(seat));
1171
+ }
1172
+ function with_lane_output(content, output, profile) {
1173
+ const recorded = upsert_assignment(content, LANE_OUTPUT_KEY, `"${output}"`);
1174
+ if (profile === void 0) return recorded;
1175
+ const with_provider = upsert_assignment(recorded, LANE_PROVIDER_KEY, profile.provider);
1176
+ const with_role = upsert_assignment(with_provider, LANE_ROLE_KEY, profile.role);
1177
+ const with_model = upsert_assignment(with_role, LANE_MODEL_KEY, profile.model);
1178
+ return upsert_assignment(with_model, LANE_EFFORT_KEY, profile.effort);
1179
+ }
1180
+ var lane_environment = {
1181
+ is_seat_line,
1182
+ lane_file_content,
1183
+ read_lane_output,
1184
+ read_lane_profile,
1185
+ read_lane_ports,
1186
+ read_lane_seat,
1187
+ read_root_seed,
1188
+ with_lane_output
1189
+ };
1190
+
1191
+ // scripts/lane/lane-registry.ts
1192
+ var WORKTREE_PREFIX = "worktree ";
1193
+ var BRANCH_PREFIX = "branch refs/heads/";
1194
+ var BLOCK_SEPARATOR = "\n\n";
1195
+ function line_value(lines, prefix) {
1196
+ return lines.find((line) => line.startsWith(prefix))?.slice(prefix.length);
1197
+ }
1198
+ function seat_from_content(content) {
1199
+ const seat = lane_environment.read_lane_seat(content);
1200
+ if (seat === void 0) return void 0;
1201
+ const port_pair = lane_environment.read_lane_ports(content);
1202
+ return { seat, development_port: port_pair.development, preview_port: port_pair.preview };
1203
+ }
1204
+ var EMPTY_SEAT = {
1205
+ seat: void 0,
1206
+ development_port: void 0,
1207
+ preview_port: void 0
1208
+ };
1209
+ function held_seat(content) {
1210
+ if (content === void 0) return EMPTY_SEAT;
1211
+ return seat_from_content(content) ?? EMPTY_SEAT;
1212
+ }
1213
+ function read_environment(directory) {
1214
+ return file_reader.read_if_readable(path2.join(directory, ENV_FILE_NAME));
1215
+ }
1216
+ function branch_issue(branch) {
1217
+ if (!branch?.endsWith(lane_paths.LANE_BRANCH_SUFFIX)) return void 0;
1218
+ const issue = branch.slice(0, -lane_paths.LANE_BRANCH_SUFFIX.length);
1219
+ return issue_number_shape.ISSUE_NUMBER_PATTERN.test(issue) ? issue : void 0;
1220
+ }
1221
+ function is_gone(directory) {
1222
+ return !existsSync2(directory);
1223
+ }
1224
+ function build_lane(issue, branch, directory, is_stranded) {
1225
+ const content = is_stranded ? void 0 : read_environment(directory);
1226
+ const held = held_seat(content);
1227
+ const output = content === void 0 ? void 0 : lane_environment.read_lane_output(content);
1228
+ const profile = content === void 0 ? void 0 : lane_environment.read_lane_profile(content);
1229
+ return {
1230
+ issue,
1231
+ branch,
1232
+ directory,
1233
+ seat: held.seat,
1234
+ development_port: held.development_port,
1235
+ preview_port: held.preview_port,
1236
+ output,
1237
+ profile,
1238
+ is_stranded
1239
+ };
1240
+ }
1241
+ function is_lane_directory(root, issue, directory) {
1242
+ return directory === lane_paths.lane_directory(root, issue);
1243
+ }
1244
+ function parse_block(block, root) {
1245
+ const lines = block.split("\n");
1246
+ const directory = line_value(lines, WORKTREE_PREFIX);
1247
+ const branch = line_value(lines, BRANCH_PREFIX);
1248
+ const issue = branch_issue(branch);
1249
+ if (directory === void 0 || branch === void 0 || issue === void 0) return void 0;
1250
+ if (!is_lane_directory(root, issue, directory)) return void 0;
1251
+ return build_lane(issue, branch, directory, is_gone(directory));
1252
+ }
1253
+ function is_lane(lane) {
1254
+ return lane !== void 0;
1255
+ }
1256
+ async function worktree_blocks() {
1257
+ const listing = await git_worktree.worktree_list();
1258
+ return listing.split(BLOCK_SEPARATOR);
1259
+ }
1260
+ async function main_repository_root() {
1261
+ return repo_discovery.main_worktree(await git_command.repository_root());
1262
+ }
1263
+ async function list_lanes() {
1264
+ const root = lane_paths.lane_root(await main_repository_root());
1265
+ const blocks = await worktree_blocks();
1266
+ const lanes = blocks.map((block) => parse_block(block, root)).filter(is_lane);
1267
+ return lanes.toSorted((left, right) => Number(left.issue) - Number(right.issue));
1268
+ }
1269
+ async function registered_directories() {
1270
+ const blocks = await worktree_blocks();
1271
+ return blocks.flatMap((block) => line_value(block.split("\n"), WORKTREE_PREFIX) ?? []);
1272
+ }
1273
+ async function has_lanes_in_flight() {
1274
+ const lanes = await list_lanes();
1275
+ return lanes.some((lane) => !lane.is_stranded);
1276
+ }
1277
+ function used_seats(lanes) {
1278
+ return lanes.map((lane) => lane.seat).filter((seat) => seat !== void 0);
1279
+ }
1280
+ function unreadable_lanes(lanes) {
1281
+ return lanes.filter((lane) => !lane.is_stranded && lane.seat === void 0);
1282
+ }
1283
+ function find_lane(lanes, issue) {
1284
+ return lanes.find((lane) => lane.issue === issue);
1285
+ }
1286
+ async function find_open_lane(issue) {
1287
+ return find_lane(await list_lanes(), issue);
1288
+ }
1289
+ var lane_registry = {
1290
+ find_lane,
1291
+ find_open_lane,
1292
+ has_lanes_in_flight,
1293
+ list_lanes,
1294
+ main_repository_root,
1295
+ parse_block,
1296
+ read_environment,
1297
+ registered_directories,
1298
+ unreadable_lanes,
1299
+ used_seats
1300
+ };
1301
+
1302
+ // scripts/run/run-headless.ts
1303
+ var HEADLESS_ENV_KEY = "JOSH_RUN_HEADLESS";
1304
+ var HEADLESS_VALUE = "1";
1305
+ function environment2() {
1306
+ return { [HEADLESS_ENV_KEY]: HEADLESS_VALUE };
1307
+ }
1308
+ function is_headless2(source = process.env) {
1309
+ return source[HEADLESS_ENV_KEY] === HEADLESS_VALUE;
1310
+ }
1311
+ function is_headless_parent(source) {
1312
+ return is_headless2(source) && lane_child_marker.marked_issue(source) === void 0;
1313
+ }
1314
+ function is_cut_capped(carry, source = process.env) {
1315
+ return !is_headless_parent(source) && run_carry.is_at_cut_cap(carry);
1316
+ }
1317
+ function is_driving(read) {
1318
+ return read?.kind === "carried" && read.carry.is_handed_off !== true;
1319
+ }
1320
+ async function read_carry_here() {
1321
+ const repository2 = await run_carry.repository_directory();
1322
+ return repository2 === void 0 ? void 0 : run_carry.read_carry(run_carry.carry_path(repository2));
1323
+ }
1324
+ async function must_keep_waiting(source = process.env) {
1325
+ if (!is_headless_parent(source) || !await lane_registry.has_lanes_in_flight()) return false;
1326
+ return is_driving(await read_carry_here());
1327
+ }
1328
+ async function current_carry() {
1329
+ const read = await read_carry_here();
1330
+ return read?.kind === "carried" ? read.carry : void 0;
1331
+ }
1332
+ function is_owned_here(carry, ancestry) {
1333
+ return carry.owner_pid !== void 0 && ancestry().has(carry.owner_pid);
1334
+ }
1335
+ function driven_here(read, ancestry) {
1336
+ if (read?.kind !== "carried" || !is_driving(read)) return void 0;
1337
+ return is_owned_here(read.carry, ancestry) ? read.carry : void 0;
1338
+ }
1339
+ async function driving_carry(source = process.env, ancestry = lane_reap.own_ancestry) {
1340
+ if (lane_child_marker.marked_issue(source) !== void 0) return void 0;
1341
+ return driven_here(await read_carry_here(), ancestry);
1342
+ }
1343
+ async function is_backlog_parent(source = process.env, ancestry = lane_reap.own_ancestry) {
1344
+ return await driving_carry(source, ancestry) !== void 0;
1345
+ }
1346
+ var run_headless = {
1347
+ HEADLESS_ENV_KEY,
1348
+ current_carry,
1349
+ driven_here,
1350
+ driving_carry,
1351
+ environment: environment2,
1352
+ is_backlog_parent,
1353
+ is_cut_capped,
1354
+ is_headless: is_headless2,
1355
+ is_owned_here,
1356
+ must_keep_waiting
1357
+ };
1358
+
1359
+ // scripts/run/detached-launch.ts
1360
+ import { spawn } from "node:child_process";
1361
+ import { closeSync, constants, openSync, writeSync } from "node:fs";
1362
+
1363
+ // scripts/agent/agent-launch-environment.ts
1364
+ import { existsSync as existsSync3, lstatSync, mkdirSync, readlinkSync, symlinkSync, unlinkSync } from "node:fs";
1365
+ import path4 from "node:path";
1366
+
1367
+ // scripts/gh/gh-cli-token.ts
1368
+ import { execaSync } from "execa";
1369
+ var GH_CLI_TIMEOUT_MS = 5e3;
1370
+ function get() {
1371
+ try {
1372
+ const { stdout } = execaSync("gh", ["auth", "token"], { timeout: GH_CLI_TIMEOUT_MS });
1373
+ const token = stdout.trim();
1374
+ return token.length > 0 ? token : void 0;
1375
+ } catch {
1376
+ return void 0;
1377
+ }
1378
+ }
1379
+ var gh_cli_token = { get };
1380
+
1381
+ // scripts/agent/agent-session-role.ts
1382
+ var KEY2 = "JOSH_AGENT_ROLE";
1383
+ function environment_for(role) {
1384
+ return { [KEY2]: role };
1385
+ }
1386
+ function is_reviewer(source = process.env) {
1387
+ return source[KEY2] === agent_role_profile.REVIEWER;
1388
+ }
1389
+ var agent_session_role = { KEY: KEY2, env_for: environment_for, is_reviewer };
1390
+
1391
+ // scripts/agent/codex-home-source.ts
1392
+ import os from "node:os";
1393
+ import path3 from "node:path";
1394
+ function default_home() {
1395
+ return path3.join(os.homedir(), ".codex");
1396
+ }
1397
+ var codex_home_source = { default_home };
1398
+
1399
+ // scripts/agent/agent-launch-environment.ts
1400
+ var OPENAI_PROVIDER2 = "openai";
1401
+ var REVIEWER_HOME = ["node_modules", ".cache", "josh", "openai", "reviewer-home"];
1402
+ var HOME_FILES = ["auth.json", "config.toml"];
1403
+ var PRIVATE_DIRECTORY_MODE = 448;
1404
+ function openai_environment() {
1405
+ const token = gh_cli_token.get();
1406
+ return token === void 0 ? { TMPDIR: PLATFORM_TEMP_ROOT } : { GH_TOKEN: token, TMPDIR: PLATFORM_TEMP_ROOT };
1407
+ }
1408
+ function remove_old_home_link(source, target) {
1409
+ const current = lstatSync(target, { throwIfNoEntry: false });
1410
+ if (current === void 0) return false;
1411
+ if (!current.isSymbolicLink()) throw new Error(`Reviewer home file is not a link: ${target}`);
1412
+ if (existsSync3(source) && readlinkSync(target) === source) return true;
1413
+ unlinkSync(target);
1414
+ return false;
1415
+ }
1416
+ function link_home_file(source_home, target_home, name) {
1417
+ const source = path4.join(source_home, name);
1418
+ const target = path4.join(target_home, name);
1419
+ if (!remove_old_home_link(source, target) && existsSync3(source)) symlinkSync(source, target);
1420
+ }
1421
+ function reviewer_home(cwd, environment3) {
1422
+ const source = environment3["CODEX_HOME"] ?? process.env["CODEX_HOME"] ?? codex_home_source.default_home();
1423
+ const target = path4.resolve(cwd, ...REVIEWER_HOME);
1424
+ mkdirSync(target, { recursive: true, mode: PRIVATE_DIRECTORY_MODE });
1425
+ for (const name of HOME_FILES) link_home_file(source, target, name);
1426
+ return target;
1427
+ }
1428
+ function build(cwd, profile, environment3 = {}) {
1429
+ if (profile === void 0) return environment3;
1430
+ const marked = {
1431
+ ...agent_headless.environment(),
1432
+ ...agent_session_role.env_for(profile.role),
1433
+ ...environment3
1434
+ };
1435
+ if (profile.provider !== OPENAI_PROVIDER2) return marked;
1436
+ const base = { ...openai_environment(), ...marked };
1437
+ return profile.role === agent_role_profile.REVIEWER ? { ...base, CODEX_HOME: reviewer_home(cwd, environment3) } : base;
1438
+ }
1439
+ var agent_launch_environment = { build };
1440
+
1441
+ // scripts/run/detached-launch.ts
1442
+ var NO_PID_NOTE = "the process started without a pid";
1443
+ var UNSAFE_NOTE = "the wake command or its arguments contain characters that are not safe to execute";
1444
+ var { is_safe_value: is_safe_value2 } = agent_role_profile;
1445
+ function is_safe_argv(argv) {
1446
+ return is_safe_value2(argv.command) && argv.args.every((value) => is_safe_value2(value));
1447
+ }
1448
+ function note_of(error) {
1449
+ return error instanceof Error ? error.message : JSON.stringify(error);
1450
+ }
1451
+ function launched(pid) {
1452
+ return { kind: "launched", pid };
1453
+ }
1454
+ var LOG_FLAGS = constants.O_WRONLY | constants.O_APPEND | constants.O_CREAT | constants.O_NOFOLLOW;
1455
+ var LOG_MODE = 384;
1456
+ function profile_suffix(profile) {
1457
+ return profile === void 0 ? "" : ` \xB7 ${agent_role_profile.describe(profile)}`;
1458
+ }
1459
+ function log_header(argv, profile) {
1460
+ const stamp = (/* @__PURE__ */ new Date()).toISOString();
1461
+ return `
1462
+ === ${stamp} \xB7 started by process ${String(process.pid)} \xB7 ${argv.command}${profile_suffix(profile)} ===
1463
+ `;
1464
+ }
1465
+ function opened_log(log_path, on_error) {
1466
+ const descriptor = openSync(log_path, LOG_FLAGS, LOG_MODE);
1467
+ if (!stamp_file.is_own_regular_file(log_path)) {
1468
+ closeSync(descriptor);
1469
+ on_error(`${log_path} is not this account's own file, so nothing is kept there`);
1470
+ return void 0;
1471
+ }
1472
+ return descriptor;
1473
+ }
1474
+ function stamped(descriptor, argv, profile, on_error) {
1475
+ if (descriptor === void 0) return;
1476
+ try {
1477
+ writeSync(descriptor, log_header(argv, profile));
1478
+ } catch (error) {
1479
+ on_error(`the session log could not be written: ${note_of(error)}`);
1480
+ }
1481
+ }
1482
+ function open_log(log_path, on_error) {
1483
+ if (log_path === void 0) return void 0;
1484
+ try {
1485
+ return opened_log(log_path, on_error);
1486
+ } catch (error) {
1487
+ on_error(`the session log at ${log_path} could not be opened: ${note_of(error)}`);
1488
+ return void 0;
1489
+ }
1490
+ }
1491
+ function ensure_log(log_path, on_error) {
1492
+ const descriptor = open_log(log_path, on_error);
1493
+ if (descriptor !== void 0) closeSync(descriptor);
1494
+ }
1495
+ function spawn_options(cwd, log, environment3 = {}, is_detached = true) {
1496
+ return {
1497
+ cwd,
1498
+ detached: is_detached,
1499
+ stdio: log === void 0 ? "ignore" : ["ignore", log, log],
1500
+ env: { ...process.env, ...agent_session_environment.removed_environment(), ...environment3 }
1501
+ };
1502
+ }
1503
+ function notify_spawn(pid, on_spawn, on_error) {
1504
+ if (pid === void 0) return;
1505
+ try {
1506
+ on_spawn(pid);
1507
+ } catch (error) {
1508
+ on_error(`the child state could not be recorded: ${note_of(error)}`);
1509
+ }
1510
+ }
1511
+ async function attached_spawn(request, log, on_error, on_spawn) {
1512
+ return await new Promise((resolve3) => {
1513
+ const environment3 = agent_launch_environment.build(request.cwd, request.profile, request.env);
1514
+ const child = spawn(
1515
+ request.argv.command,
1516
+ [...request.argv.args],
1517
+ spawn_options(request.cwd, log, environment3, false)
1518
+ );
1519
+ child.once("error", (error) => {
1520
+ on_error(note_of(error));
1521
+ resolve3({ kind: "failed", note: note_of(error) });
1522
+ });
1523
+ child.once("exit", (exit_code) => {
1524
+ resolve3({ kind: "completed", pid: child.pid ?? 0, exit_code });
1525
+ });
1526
+ notify_spawn(child.pid, on_spawn, on_error);
1527
+ });
1528
+ }
1529
+ function ignore_spawn(_pid) {
1530
+ }
1531
+ function spawned(request, log, on_error) {
1532
+ const { command, args } = request.argv;
1533
+ const environment3 = agent_launch_environment.build(request.cwd, request.profile, request.env);
1534
+ const child = spawn(command, [...args], spawn_options(request.cwd, log, environment3));
1535
+ child.on("error", (error) => {
1536
+ on_error(note_of(error));
1537
+ });
1538
+ child.unref();
1539
+ return child.pid === void 0 ? { kind: "failed", note: NO_PID_NOTE } : launched(child.pid);
1540
+ }
1541
+ function launch(request, on_error) {
1542
+ if (!is_safe_argv(request.argv)) return { kind: "failed", note: UNSAFE_NOTE };
1543
+ const log = open_log(request.log_path, on_error);
1544
+ try {
1545
+ stamped(log, request.argv, request.profile, on_error);
1546
+ return spawned(request, log, on_error);
1547
+ } catch (error) {
1548
+ return { kind: "failed", note: note_of(error) };
1549
+ } finally {
1550
+ if (log !== void 0) closeSync(log);
1551
+ }
1552
+ }
1553
+ async function launch_attached(request, on_error, on_spawn = ignore_spawn) {
1554
+ if (!is_safe_argv(request.argv)) return { kind: "failed", note: UNSAFE_NOTE };
1555
+ const log = open_log(request.log_path, on_error);
1556
+ try {
1557
+ stamped(log, request.argv, request.profile, on_error);
1558
+ return await attached_spawn(request, log, on_error, on_spawn);
1559
+ } catch (error) {
1560
+ return { kind: "failed", note: note_of(error) };
1561
+ } finally {
1562
+ if (log !== void 0) closeSync(log);
1563
+ }
1564
+ }
1565
+ var detached_launch = {
1566
+ UNSAFE_NOTE,
1567
+ ensure_log,
1568
+ is_safe_argv,
1569
+ is_safe_value: is_safe_value2,
1570
+ launch,
1571
+ launch_attached,
1572
+ log_header,
1573
+ note_of
1574
+ };
1575
+
1576
+ export {
1577
+ issue_cite,
1578
+ git_common_directory,
1579
+ repository_lock,
1580
+ run_ship_stage,
1581
+ agent_role_profile,
1582
+ agent_session_role,
1583
+ lane_child_invocation,
1584
+ repo_origin,
1585
+ repo_discovery,
1586
+ agent_headless,
1587
+ detached_launch,
1588
+ lane_registry,
1589
+ run_headless
1590
+ };