@joshuafolkken/kit 1.1784.0 → 1.2116.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 (690) hide show
  1. package/.claude/agents/reviewer-verification.md +19 -0
  2. package/.claude/agents/reviewer.md +19 -0
  3. package/.claude/settings.json +5 -6
  4. package/.claude/skills/dependency-update/SKILL.md +9 -10
  5. package/.claude/skills/workflow-commands/SKILL.md +6 -6
  6. package/.claude/skills/workflow-commands/background-commands.md +8 -5
  7. package/.claude/skills/workflow-commands/backlogrun-child.md +3 -1
  8. package/.claude/skills/workflow-commands/backlogrun-lanes.md +1 -1
  9. package/.claude/skills/workflow-commands/backlogrun-park.md +5 -2
  10. package/.claude/skills/workflow-commands/backlogrun-progress.md +2 -3
  11. package/.claude/skills/workflow-commands/backlogrun-recovery.md +1 -1
  12. package/.claude/skills/workflow-commands/backlogrun-steps.md +3 -2
  13. package/.claude/skills/workflow-commands/backlogrun.md +1 -1
  14. package/.claude/skills/workflow-commands/chain-rule.md +41 -32
  15. package/.claude/skills/workflow-commands/delegation.md +6 -6
  16. package/.claude/skills/workflow-commands/entry-sequence.md +2 -2
  17. package/.claude/skills/workflow-commands/followup.md +7 -5
  18. package/.claude/skills/workflow-commands/fullrun-steps.md +6 -6
  19. package/.claude/skills/workflow-commands/fullrun.md +1 -1
  20. package/.claude/skills/workflow-commands/issue-comments.md +9 -4
  21. package/.claude/skills/workflow-commands/issue-fold-existing.md +2 -1
  22. package/.claude/skills/workflow-commands/kickoff.md +2 -2
  23. package/.claude/skills/workflow-commands/observation-filing.md +1 -1
  24. package/.claude/skills/workflow-commands/observation-ledger.md +6 -4
  25. package/.claude/skills/workflow-commands/pre-gate-cut.md +9 -7
  26. package/.claude/skills/workflow-commands/prerequisite.md +3 -2
  27. package/.claude/skills/workflow-commands/retrospective.md +2 -2
  28. package/.claude/skills/workflow-commands/split-assessment.md +7 -5
  29. package/.codex/hooks.json +5 -5
  30. package/.github/actions/setup-pnpm/action.yml +9 -16
  31. package/.github/dependabot.yml +16 -0
  32. package/.github/workflows/auto-tag.yml +45 -0
  33. package/.github/workflows/ci.yml +155 -15
  34. package/.github/workflows/dependabot-auto-merge.yml +63 -4
  35. package/.github/workflows/production.yml +8 -0
  36. package/.github/workflows/publish.yml +60 -45
  37. package/.vscode/settings.json +19 -0
  38. package/CLAUDE.md +5 -12
  39. package/SECURITY.md +2 -2
  40. package/dist/CLAUDE.md +5 -12
  41. package/dist/commands/document-read-cli.js +2 -1
  42. package/dist/commands/document-section-main.js +2 -1
  43. package/dist/commands/read-set-cli.js +194 -134
  44. package/dist/commands/run-prep-main.js +9694 -10173
  45. package/dist/commands/run-step-cli.js +22138 -18285
  46. package/dist/hooks/audit-provision.js +23 -5
  47. package/dist/hooks/chunk-3GKE653K.js +6204 -0
  48. package/dist/hooks/chunk-45CJJOO7.js +1243 -0
  49. package/dist/hooks/{chunk-CWMBGKYW.js → chunk-5PM2JRGV.js} +2153 -856
  50. package/dist/hooks/{chunk-WR2KQAYZ.js → chunk-7SIUNQXK.js} +1207 -1470
  51. package/dist/hooks/{chunk-O2YBIDSI.js → chunk-CQD4LJE6.js} +1682 -1130
  52. package/dist/hooks/{chunk-VWWCFGWK.js → chunk-OPSRGWFU.js} +1 -1
  53. package/dist/hooks/{chunk-XGBNSWEI.js → chunk-UJ3FPMMM.js} +132 -49
  54. package/dist/hooks/chunk-VVNYJWEI.js +30 -0
  55. package/dist/hooks/chunk-Z6DQJKH3.js +2806 -0
  56. package/dist/hooks/codex-hook-adapter.js +8 -8
  57. package/dist/hooks/format-edited.js +4 -5
  58. package/dist/hooks/inputs.json +386 -360
  59. package/dist/hooks/pretool-guard.js +7 -6
  60. package/dist/hooks/session-lang.js +101 -258
  61. package/dist/hooks/stop-guard.js +1744 -2576
  62. package/dist/josh.js +7133 -6368
  63. package/dist/version/index.js +161 -1
  64. package/eslint/rules/comment-why-only.js +108 -0
  65. package/package.json +16 -9
  66. package/prompts/coding-standards.md +1 -1
  67. package/prompts/collaboration-workflow/file-edits.md +14 -11
  68. package/prompts/collaboration-workflow/issue-citation.md +0 -4
  69. package/prompts/collaboration-workflow/issue-template.md +40 -21
  70. package/prompts/collaboration-workflow/lane-instructions.md +3 -1
  71. package/prompts/collaboration-workflow/measurement.md +8 -1
  72. package/prompts/collaboration-workflow/operating-rules.md +11 -2
  73. package/prompts/collaboration-workflow/output-bounds.md +6 -2
  74. package/prompts/collaboration-workflow/plan-comment.md +1 -1
  75. package/prompts/collaboration-workflow/principles.md +9 -0
  76. package/prompts/collaboration-workflow/residency.md +3 -2
  77. package/prompts/collaboration-workflow/rule-delivery.md +13 -1
  78. package/prompts/collaboration-workflow/upstream-interrupt.md +2 -2
  79. package/prompts/collaboration-workflow/wip-cap.md +3 -1
  80. package/prompts/review-rubric.md +8 -0
  81. package/prompts/review.md +31 -22
  82. package/prompts/testing-guide.md +1 -0
  83. package/scripts/agent/agent-argv.ts +14 -16
  84. package/scripts/agent/agent-provider.ts +138 -0
  85. package/scripts/agent/agent-role-profile.ts +108 -156
  86. package/scripts/agent/agent-safe-text.ts +20 -5
  87. package/scripts/agent/api-usage-limit.ts +65 -0
  88. package/scripts/agent/claude-agent-argv.ts +19 -9
  89. package/scripts/agent/codex-agent-argv.ts +118 -22
  90. package/scripts/agent/usage-limit-reset.ts +179 -0
  91. package/scripts/auth/claude-token-output.ts +2 -2
  92. package/scripts/auto-ok/auto-ok-author.ts +53 -0
  93. package/scripts/auto-ok/auto-ok-cli.ts +20 -9
  94. package/scripts/backlog/backlog-defect-priority.ts +1 -1
  95. package/scripts/backlog/backlog-drive-cli.ts +6 -1
  96. package/scripts/backlog/backlog-drive-hold.ts +3 -3
  97. package/scripts/backlog/backlog-drive-idle.ts +10 -0
  98. package/scripts/backlog/backlog-drive-launch-pass.ts +90 -0
  99. package/scripts/backlog/backlog-drive-launch.ts +8 -2
  100. package/scripts/backlog/backlog-drive-named-offer.ts +73 -30
  101. package/scripts/backlog/backlog-drive-named.ts +28 -7
  102. package/scripts/backlog/backlog-drive-paused.ts +5 -4
  103. package/scripts/backlog/backlog-drive-restore.ts +11 -3
  104. package/scripts/backlog/backlog-drive.ts +21 -60
  105. package/scripts/backlog/backlog-gate-scope.ts +61 -0
  106. package/scripts/backlog/backlog-measure-close.ts +112 -0
  107. package/scripts/backlog/backlog-next.ts +39 -49
  108. package/scripts/backlog/backlog-occupied.ts +2 -2
  109. package/scripts/backlog/backlog-overlap.ts +42 -8
  110. package/scripts/backlog/backlog-plan-cli.ts +4 -1
  111. package/scripts/backlog/backlog-plan-comment.ts +81 -0
  112. package/scripts/backlog/backlog-plan-read.ts +19 -6
  113. package/scripts/backlog/backlog-pool.ts +50 -12
  114. package/scripts/backlog/backlog-rank.ts +60 -13
  115. package/scripts/backlog/backlog-stalled-detect.ts +2 -1
  116. package/scripts/backlog/backlog-waves.ts +17 -2
  117. package/scripts/backlog/backlogrun-launch.ts +7 -4
  118. package/scripts/cost-runtime/context-cut-payback.ts +27 -25
  119. package/scripts/cost-runtime/cost-cli.ts +37 -16
  120. package/scripts/cost-runtime/cost-pricing.ts +9 -0
  121. package/scripts/cost-runtime/cost-verdict.ts +4 -1
  122. package/scripts/delegation/delegation-policy.ts +2 -2
  123. package/scripts/delegation/duplicate-read-guard.ts +1 -0
  124. package/scripts/delegation/investigation-guard.ts +14 -2
  125. package/scripts/delegation/investigation-reads.ts +45 -23
  126. package/scripts/dependabot/dependabot-cooldown.ts +3 -2
  127. package/scripts/discovery/repo-party.ts +80 -20
  128. package/scripts/discovery/session-owner-pin.ts +51 -0
  129. package/scripts/document/capped-print.ts +1 -1
  130. package/scripts/document/command-reference-line-budget.ts +42 -0
  131. package/scripts/document/document-byte-budget.ts +17 -7
  132. package/scripts/document/document-checks.ts +20 -0
  133. package/scripts/document/document-ratchet-check.ts +101 -0
  134. package/scripts/document/document-section.ts +1 -0
  135. package/scripts/document/entry-read-budget.ts +7 -3
  136. package/scripts/document/issue-citation-budget.ts +94 -0
  137. package/scripts/epic/epic-cli-argv.ts +2 -2
  138. package/scripts/epic/epic-fetch.ts +4 -2
  139. package/scripts/epic/epic-graph.ts +7 -2
  140. package/scripts/epic/epic-issue.ts +3 -1
  141. package/scripts/epic/epic-rank.ts +5 -0
  142. package/scripts/exports/unused-members-check.ts +62 -0
  143. package/scripts/exports/unused-members-cli.ts +6 -51
  144. package/scripts/followup/followup-ci-path.ts +67 -0
  145. package/scripts/followup/followup-coderabbit-retrigger.ts +261 -0
  146. package/scripts/followup/followup-coderabbit-wait.ts +13 -10
  147. package/scripts/followup/followup-failed-tests.ts +160 -0
  148. package/scripts/followup/followup-job-needs.ts +100 -0
  149. package/scripts/followup/followup-job-rerun.ts +303 -0
  150. package/scripts/followup/followup-main-move.ts +113 -0
  151. package/scripts/followup/git-followup-finish.ts +43 -11
  152. package/scripts/followup/git-followup-pending.ts +3 -3
  153. package/scripts/followup/git-followup-stages.ts +41 -11
  154. package/scripts/followup/git-pr-followup-checks.ts +55 -16
  155. package/scripts/followup/git-pr-followup-wrapup.ts +24 -5
  156. package/scripts/followup/git-pr-followup.ts +62 -27
  157. package/scripts/fresh-machine/fresh-machine-script.ts +5 -9
  158. package/scripts/fresh-machine/specs/kit-test-backlogrun-python.json +2 -2
  159. package/scripts/fresh-machine/specs/kit-test-backlogrun.json +2 -2
  160. package/scripts/gate/busy-average.ts +34 -2
  161. package/scripts/gate/check-related-pinned.ts +43 -0
  162. package/scripts/gate/check-related-reuse.ts +64 -0
  163. package/scripts/gate/check-related-section.ts +57 -0
  164. package/scripts/gate/check-related-unplanned.ts +34 -0
  165. package/scripts/gate/check-related.ts +265 -0
  166. package/scripts/gate/command-memory.ts +1 -1
  167. package/scripts/gate/core-admission.ts +24 -6
  168. package/scripts/gate/core-budget-timing.ts +20 -6
  169. package/scripts/gate/core-budget.ts +40 -11
  170. package/scripts/gate/core-wait-record.ts +3 -2
  171. package/scripts/gate/core-wait.ts +25 -2
  172. package/scripts/gate/core-weights.ts +15 -7
  173. package/scripts/gate/gate-labels.ts +46 -0
  174. package/scripts/gate/gate-ledger.ts +14 -6
  175. package/scripts/gate/gate-plan.ts +103 -58
  176. package/scripts/gate/gate-report.ts +9 -7
  177. package/scripts/gate/gate-run-steps.ts +26 -3
  178. package/scripts/gate/gate-skip.ts +45 -6
  179. package/scripts/gate/gate-static-group.ts +60 -0
  180. package/scripts/gate/gate-steps.ts +2 -1
  181. package/scripts/gate/gate-tree.ts +4 -2
  182. package/scripts/gate/hook-gate-reuse.ts +19 -2
  183. package/scripts/gate/metrics-totals.ts +59 -0
  184. package/scripts/gate/scoped-green.ts +68 -15
  185. package/scripts/gate/since-green.ts +14 -6
  186. package/scripts/gate/structural-checks.ts +96 -0
  187. package/scripts/gate/verification-gate.ts +51 -16
  188. package/scripts/gate/verification-inputs.ts +21 -6
  189. package/scripts/gate/verification-tail.ts +52 -0
  190. package/scripts/gh/gh-author-association.ts +23 -2
  191. package/scripts/gh/git-ai-review-scan.ts +1 -1
  192. package/scripts/gh/git-gh-api-path.ts +12 -3
  193. package/scripts/gh/git-gh-comments-unreadable.ts +36 -0
  194. package/scripts/gh/git-gh-exec.ts +32 -2
  195. package/scripts/gh/git-gh-issue-read.ts +4 -2
  196. package/scripts/gh/git-gh-issue-rest.ts +1 -0
  197. package/scripts/gh/git-gh-issue-write.ts +8 -2
  198. package/scripts/gh/git-gh-issue.ts +12 -5
  199. package/scripts/gh/git-gh-pr-auto-merge.ts +13 -6
  200. package/scripts/gh/git-gh-pr-graphql-state.ts +56 -0
  201. package/scripts/gh/git-gh-pr-read.ts +74 -13
  202. package/scripts/gh/git-gh-pr-rest.ts +3 -1
  203. package/scripts/gh/git-gh-pr-snapshot.ts +22 -7
  204. package/scripts/gh/git-gh-pr-too-large.ts +20 -0
  205. package/scripts/gh/git-gh-pr.ts +21 -7
  206. package/scripts/gh/git-gh-retry.ts +141 -0
  207. package/scripts/gh/git-pr-ai-review.ts +15 -6
  208. package/scripts/gh/git-pr-checks-eval.ts +3 -0
  209. package/scripts/gh/git-pr-checks.ts +5 -5
  210. package/scripts/git/base-tree.ts +30 -0
  211. package/scripts/git/change-base.ts +4 -10
  212. package/scripts/git/changed-paths-sync.ts +63 -0
  213. package/scripts/git/changed-paths.ts +16 -1
  214. package/scripts/git/git-common-directory.ts +11 -1
  215. package/scripts/git/git-diff-reads.ts +66 -20
  216. package/scripts/git/git-error.ts +9 -2
  217. package/scripts/git/git-schemas.ts +13 -0
  218. package/scripts/git/git-worktree.ts +13 -0
  219. package/scripts/git/gone-branch.ts +4 -1
  220. package/scripts/git/main-merge-budget-conflict.ts +89 -0
  221. package/scripts/git/main-merge-guard.ts +55 -18
  222. package/scripts/git/main-merge-regenerate.ts +59 -25
  223. package/scripts/git/main-merge.ts +53 -5
  224. package/scripts/git/no-base-checkout.ts +127 -0
  225. package/scripts/git/stash/git-stash.ts +11 -2
  226. package/scripts/git/stash/stash-push-cli.ts +10 -0
  227. package/scripts/hooks/batch-guard.ts +40 -21
  228. package/scripts/hooks/edited-cspell.ts +37 -11
  229. package/scripts/hooks/format-edited-file.ts +22 -2
  230. package/scripts/hooks/lane-plan-guard.ts +50 -0
  231. package/scripts/hooks/pre-commit-lint-switch.ts +9 -0
  232. package/scripts/hooks/pre-commit-lint.ts +14 -1
  233. package/scripts/hooks/pre-push-related-switch.ts +10 -0
  234. package/scripts/hooks/pre-push-unit.ts +76 -10
  235. package/scripts/hooks/pretool-guard.ts +2 -0
  236. package/scripts/hooks/reserved-run.ts +14 -1
  237. package/scripts/hooks/run-hook.sh +23 -8
  238. package/scripts/hooks/step-zero-notice.ts +6 -1
  239. package/scripts/hooks/stop-actions.ts +3 -15
  240. package/scripts/hooks/stop-guard.ts +7 -6
  241. package/scripts/init/distributed-paths.ts +1 -0
  242. package/scripts/init/hook-command-rewrite.ts +5 -1
  243. package/scripts/init/hook-launch.ts +4 -2
  244. package/scripts/issue/aggregation-split.ts +52 -0
  245. package/scripts/issue/defect-origin-line.ts +19 -1
  246. package/scripts/issue/defect-rate-cli.ts +5 -102
  247. package/scripts/issue/defect-report.ts +4 -4
  248. package/scripts/issue/effect-audit-cli.ts +178 -0
  249. package/scripts/issue/effect-audit.ts +185 -0
  250. package/scripts/issue/expected-effect-lint.ts +64 -9
  251. package/scripts/issue/git-next-issues.ts +5 -0
  252. package/scripts/issue/issue-body-or-comment.ts +38 -4
  253. package/scripts/issue/issue-cite-cli.ts +1 -3
  254. package/scripts/issue/issue-classification.ts +1 -0
  255. package/scripts/issue/issue-closing-pr.ts +8 -1
  256. package/scripts/issue/issue-evidence-exit.ts +4 -2
  257. package/scripts/issue/issue-file-cap.ts +58 -0
  258. package/scripts/issue/issue-file-cli.ts +111 -38
  259. package/scripts/issue/issue-file-deferral.ts +52 -0
  260. package/scripts/issue/issue-file-fold.ts +29 -10
  261. package/scripts/issue/issue-file-interrupt.ts +85 -0
  262. package/scripts/issue/issue-file-lane-hint.ts +30 -0
  263. package/scripts/issue/issue-file.ts +43 -6
  264. package/scripts/issue/issue-labels.ts +19 -2
  265. package/scripts/issue/issue-lint-cli.ts +27 -2
  266. package/scripts/issue/issue-measured-cli.ts +13 -35
  267. package/scripts/issue/issue-measured-close.ts +58 -0
  268. package/scripts/issue/issue-not-before-label.ts +2 -2
  269. package/scripts/issue/issue-not-before.ts +4 -1
  270. package/scripts/issue/issue-priority-cli.ts +60 -0
  271. package/scripts/issue/issue-priority-raise.ts +55 -0
  272. package/scripts/issue/issue-priority.ts +174 -43
  273. package/scripts/issue/issue-rank.ts +21 -4
  274. package/scripts/issue/issue-read-cli.ts +32 -6
  275. package/scripts/issue/issue-read.ts +37 -12
  276. package/scripts/issue/issue-sample-gate.ts +95 -74
  277. package/scripts/issue/issue-sample-prime.ts +127 -0
  278. package/scripts/issue/issue-sample-required.ts +57 -0
  279. package/scripts/issue/issue-sample-source.ts +12 -11
  280. package/scripts/issue/issue-search.ts +124 -0
  281. package/scripts/issue/issue-state.ts +13 -1
  282. package/scripts/issue/issue-template-section.ts +43 -0
  283. package/scripts/issue/issue-watch-diff.ts +31 -1
  284. package/scripts/issue/issue-watch-hook.ts +11 -2
  285. package/scripts/issue/issue-watch.ts +55 -12
  286. package/scripts/issue/markdown-section.ts +1 -0
  287. package/scripts/issue/measure-declaration.ts +121 -0
  288. package/scripts/issue/measure-rerun-cli.ts +7 -70
  289. package/scripts/issue/plan-consumers-section.ts +22 -1
  290. package/scripts/issue/reproduction-measure.ts +3 -1
  291. package/scripts/issue/size-estimate.ts +90 -0
  292. package/scripts/issue/trusted-measure.ts +84 -0
  293. package/scripts/josh/command-usage.ts +3 -2
  294. package/scripts/josh/durable-state-migrate.ts +105 -0
  295. package/scripts/josh/durable-state.ts +112 -0
  296. package/scripts/josh/josh-aliases.ts +95 -0
  297. package/scripts/josh/josh-command-map.ts +1 -82
  298. package/scripts/josh/josh-commands-agent-hooks.ts +6 -6
  299. package/scripts/josh/josh-commands-ai.ts +5 -5
  300. package/scripts/josh/josh-commands-development.ts +59 -58
  301. package/scripts/josh/josh-commands-issue-write.ts +23 -4
  302. package/scripts/josh/josh-commands-issue.ts +32 -0
  303. package/scripts/josh/josh-commands-lane.ts +87 -4
  304. package/scripts/josh/josh-commands-lint.ts +16 -3
  305. package/scripts/josh/josh-commands-maintenance.ts +15 -0
  306. package/scripts/josh/josh-commands-review.ts +41 -6
  307. package/scripts/josh/josh-commands-ship.ts +56 -8
  308. package/scripts/josh/josh-commands-test-check.ts +80 -0
  309. package/scripts/josh/josh-commands-workflow.ts +1 -1
  310. package/scripts/josh/josh-environment-file.ts +43 -3
  311. package/scripts/josh/josh-in-process.ts +2 -2
  312. package/scripts/josh/josh-logic.ts +5 -3
  313. package/scripts/josh/josh-run.ts +19 -1
  314. package/scripts/josh/run-record-path.ts +15 -0
  315. package/scripts/josh/stamp-file.ts +11 -2
  316. package/scripts/lane/lane-adopt-cli.ts +98 -0
  317. package/scripts/lane/lane-adopt.ts +208 -0
  318. package/scripts/lane/lane-await.ts +5 -8
  319. package/scripts/lane/lane-baseline.ts +123 -0
  320. package/scripts/lane/lane-breakdown-cli.ts +64 -0
  321. package/scripts/lane/lane-breakdown-implement.ts +170 -0
  322. package/scripts/lane/lane-breakdown-laps.ts +107 -0
  323. package/scripts/lane/lane-breakdown-pinned.ts +76 -0
  324. package/scripts/lane/lane-breakdown-text.ts +145 -0
  325. package/scripts/lane/lane-breakdown.ts +239 -0
  326. package/scripts/lane/lane-check-stats.ts +29 -8
  327. package/scripts/lane/lane-child-invocation.ts +9 -2
  328. package/scripts/lane/lane-child-mark-keys.ts +12 -0
  329. package/scripts/lane/lane-child-marker.ts +20 -1
  330. package/scripts/lane/lane-ci-path-stats.ts +73 -0
  331. package/scripts/lane/lane-claim-stats.ts +84 -0
  332. package/scripts/lane/lane-close.ts +8 -3
  333. package/scripts/lane/lane-dispatch-log.ts +3 -3
  334. package/scripts/lane/lane-dispatch.ts +2 -2
  335. package/scripts/lane/lane-gap-stats.ts +7 -6
  336. package/scripts/lane/lane-guard-policy.ts +7 -1
  337. package/scripts/lane/lane-implement-stats.ts +207 -0
  338. package/scripts/lane/lane-implement-subagents.ts +90 -0
  339. package/scripts/lane/lane-investigation-switch.ts +16 -0
  340. package/scripts/lane/lane-ledger-kind.ts +31 -0
  341. package/scripts/lane/lane-ledger-schema-ship.ts +49 -0
  342. package/scripts/lane/lane-ledger-schema.ts +119 -36
  343. package/scripts/lane/lane-ledger-write.ts +257 -0
  344. package/scripts/lane/lane-ledger.ts +31 -177
  345. package/scripts/lane/lane-load.ts +1 -1
  346. package/scripts/lane/lane-measure-cli.ts +176 -59
  347. package/scripts/lane/lane-net-read.ts +44 -0
  348. package/scripts/lane/lane-net-time.ts +212 -0
  349. package/scripts/lane/lane-open.ts +16 -7
  350. package/scripts/lane/lane-output.ts +2 -4
  351. package/scripts/lane/lane-overrun-prompt.ts +147 -0
  352. package/scripts/lane/lane-overrun.ts +274 -0
  353. package/scripts/lane/lane-paths.ts +24 -1
  354. package/scripts/lane/lane-pause-cli.ts +4 -1
  355. package/scripts/lane/lane-paused-spans.ts +97 -0
  356. package/scripts/lane/lane-plan-check.ts +207 -0
  357. package/scripts/lane/lane-plan-cli.ts +41 -0
  358. package/scripts/lane/lane-plan.ts +144 -0
  359. package/scripts/lane/lane-registry.ts +14 -1
  360. package/scripts/lane/lane-relaunch.ts +1 -1
  361. package/scripts/lane/lane-round-one-stats.ts +51 -0
  362. package/scripts/lane/lane-sampler.ts +23 -4
  363. package/scripts/lane/lane-session-action.ts +93 -18
  364. package/scripts/lane/lane-session-broker.ts +49 -21
  365. package/scripts/lane/lane-session-reread-main.ts +14 -0
  366. package/scripts/lane/lane-session-reread.ts +51 -0
  367. package/scripts/lane/lane-ship-lap-stats.ts +74 -0
  368. package/scripts/lane/lane-sleep.ts +58 -0
  369. package/scripts/lane/lane-spent.ts +1 -1
  370. package/scripts/lane/lane-split-stats.ts +28 -0
  371. package/scripts/lane/lane-stage-stats.ts +13 -1
  372. package/scripts/lane/lane-state.ts +41 -9
  373. package/scripts/lane/lane-stats-tables.ts +58 -0
  374. package/scripts/lane/lane-stats.ts +21 -5
  375. package/scripts/lane/lane-stop-stats.ts +51 -19
  376. package/scripts/lane/lane-tail-stats.ts +32 -0
  377. package/scripts/lane/lane-transcript-calls.ts +67 -10
  378. package/scripts/lane/lane-transcript-stats.ts +44 -12
  379. package/scripts/lane/lane-value-cell.ts +72 -0
  380. package/scripts/lane/lane-value.ts +118 -0
  381. package/scripts/lane/lane-withdraw-closed.ts +124 -0
  382. package/scripts/lane/lane-withdraw.ts +108 -31
  383. package/scripts/lane/lane-yield.ts +85 -0
  384. package/scripts/lane/openai-lane-ship.ts +12 -11
  385. package/scripts/lane/openai-lane-supervisor-decision.ts +6 -8
  386. package/scripts/lane/openai-lane-supervisor-owner.ts +5 -8
  387. package/scripts/lane/openai-lane-supervisor.ts +5 -4
  388. package/scripts/lib/poll.ts +38 -9
  389. package/scripts/lib/settled-together.ts +10 -0
  390. package/scripts/lib/shell-quote.ts +21 -0
  391. package/scripts/lib/token-shape.ts +111 -0
  392. package/scripts/lint/eslint-daemon-sources.ts +79 -0
  393. package/scripts/lint/eslint-daemon.ts +45 -6
  394. package/scripts/lint/eslint-warm-cli.ts +7 -0
  395. package/scripts/lint/eslint-warm.ts +66 -0
  396. package/scripts/lint/import-graph.ts +141 -11
  397. package/scripts/lint/lint-gate-scope.ts +2 -2
  398. package/scripts/lint/lint-parallel.ts +54 -6
  399. package/scripts/lint/lint-related.ts +154 -33
  400. package/scripts/lint/rename-cli.ts +179 -0
  401. package/scripts/lint/rename-identifier.ts +192 -0
  402. package/scripts/lint/type-only-imports.ts +58 -0
  403. package/scripts/notify/telegram-notify.ts +12 -3
  404. package/scripts/observations/observation-record.ts +42 -16
  405. package/scripts/observations/observations-flush.ts +32 -9
  406. package/scripts/overrides/overrides-check.ts +9 -1
  407. package/scripts/release/release-approval-prune.ts +7 -1
  408. package/scripts/repo/required-checks-logic.ts +4 -1
  409. package/scripts/repo/ruleset-check.ts +4 -3
  410. package/scripts/report/markdown-shape.ts +28 -0
  411. package/scripts/report/report-format-reference.ts +15 -1
  412. package/scripts/report/report-labels.ts +12 -1
  413. package/scripts/report/report-lint-child-summary.ts +94 -0
  414. package/scripts/report/report-lint-cli.ts +26 -7
  415. package/scripts/report/report-lint.ts +2 -20
  416. package/scripts/review/prose-stale-cli.ts +88 -0
  417. package/scripts/review/prose-stale-scan.ts +152 -0
  418. package/scripts/review/review-attest.ts +73 -23
  419. package/scripts/review/review-brief-cli.ts +68 -19
  420. package/scripts/review/review-brief-paths.ts +22 -0
  421. package/scripts/review/review-brief.ts +14 -7
  422. package/scripts/review/review-comment-carry.ts +47 -0
  423. package/scripts/review/review-comment-round.ts +85 -22
  424. package/scripts/review/review-finding-ledger.ts +109 -7
  425. package/scripts/review/review-finding-text.ts +43 -0
  426. package/scripts/review/review-interaction.ts +11 -0
  427. package/scripts/review/review-lane-handover.ts +68 -0
  428. package/scripts/review/review-lint-cli.ts +57 -0
  429. package/scripts/review/review-lint-findings.ts +92 -0
  430. package/scripts/review/review-lint-sections.ts +80 -0
  431. package/scripts/review/review-lint.ts +221 -0
  432. package/scripts/review/review-prior-findings.ts +102 -0
  433. package/scripts/review/review-readers-scan.ts +4 -2
  434. package/scripts/review/review-record-cli.ts +177 -54
  435. package/scripts/review/review-record-code-round.ts +55 -0
  436. package/scripts/review/review-record-comment.ts +60 -0
  437. package/scripts/review/review-record-interaction.ts +35 -0
  438. package/scripts/review/review-record-pinned.ts +108 -0
  439. package/scripts/review/review-record.ts +25 -1
  440. package/scripts/review/review-reviewed-tree.ts +307 -0
  441. package/scripts/review/review-round-one-closure.ts +62 -0
  442. package/scripts/review/review-round-reuse.ts +106 -0
  443. package/scripts/review/review-round2-cli.ts +91 -29
  444. package/scripts/review/review-round2-skip-comment.ts +55 -0
  445. package/scripts/review/review-round2.ts +24 -8
  446. package/scripts/review/review-stamps.ts +7 -3
  447. package/scripts/review/review-stop-log.ts +20 -6
  448. package/scripts/review/review-stops-cli.ts +2 -1
  449. package/scripts/review/review-submit-cli.ts +101 -0
  450. package/scripts/rules/agent-model.ts +1 -1
  451. package/scripts/rules/bash-triggers.ts +3 -3
  452. package/scripts/rules/concise-reply.ts +88 -0
  453. package/scripts/rules/credential-body.ts +77 -0
  454. package/scripts/rules/decision-oracle.ts +1 -1
  455. package/scripts/rules/delivered-rules.ts +36 -17
  456. package/scripts/rules/destructive-command.ts +3 -11
  457. package/scripts/rules/direct-issue-comment.ts +34 -12
  458. package/scripts/rules/direct-issue-read.ts +191 -0
  459. package/scripts/rules/direct-pr-create.ts +4 -24
  460. package/scripts/rules/early-heartbeat.ts +2 -0
  461. package/scripts/rules/edit-tool.ts +27 -0
  462. package/scripts/rules/file-edit-rows.ts +17 -0
  463. package/scripts/rules/file-rewrite.ts +146 -0
  464. package/scripts/rules/firing-point.ts +3 -2
  465. package/scripts/rules/gh-api.ts +128 -7
  466. package/scripts/rules/gh-repo-selector.ts +84 -0
  467. package/scripts/rules/git-force.ts +2 -2
  468. package/scripts/rules/guard-remedy.ts +14 -5
  469. package/scripts/rules/implementation-cut.ts +61 -28
  470. package/scripts/rules/investigator-foreground.ts +231 -0
  471. package/scripts/rules/issue-citation.ts +15 -60
  472. package/scripts/rules/issue-comments.ts +9 -4
  473. package/scripts/rules/josh-git-bare.ts +1 -1
  474. package/scripts/rules/lane-background.ts +41 -13
  475. package/scripts/rules/lane-direct-tool.ts +107 -9
  476. package/scripts/rules/lane-interactive-ask.ts +4 -1
  477. package/scripts/rules/lane-park.ts +4 -2
  478. package/scripts/rules/lane-spilled-read.ts +90 -0
  479. package/scripts/rules/lane-split-park.ts +1 -1
  480. package/scripts/rules/lane-switch-main.ts +4 -4
  481. package/scripts/rules/last-prompt.ts +20 -47
  482. package/scripts/rules/oracle-consulted.ts +1 -1
  483. package/scripts/rules/permission-guards.ts +5 -1
  484. package/scripts/rules/piped-verification-shapes.ts +110 -0
  485. package/scripts/rules/piped-verification.ts +67 -17
  486. package/scripts/rules/poll-loop.ts +72 -9
  487. package/scripts/rules/pr-merge.ts +5 -5
  488. package/scripts/rules/pre-gate-cut.ts +3 -3
  489. package/scripts/rules/protected-files.ts +88 -24
  490. package/scripts/rules/reply-language.ts +3 -17
  491. package/scripts/rules/reply-prose.ts +34 -0
  492. package/scripts/rules/repo-admin.ts +132 -0
  493. package/scripts/rules/reviewer-foreground.ts +88 -0
  494. package/scripts/rules/round-one-check-related.ts +120 -0
  495. package/scripts/rules/rule-body-guard.ts +5 -15
  496. package/scripts/rules/rule-value-cache.ts +53 -5
  497. package/scripts/rules/rule-value-candidates.ts +84 -0
  498. package/scripts/rules/rule-value-cli.ts +59 -11
  499. package/scripts/rules/rule-value.ts +17 -4
  500. package/scripts/rules/run-tail-rule.ts +1 -1
  501. package/scripts/rules/sed-in-place.ts +196 -0
  502. package/scripts/rules/shell-segments.ts +10 -2
  503. package/scripts/rules/stop-rule-rows.ts +1 -13
  504. package/scripts/rules/stop-rules.ts +33 -58
  505. package/scripts/rules/test-declared-commit.ts +1 -1
  506. package/scripts/rules/third-party-write.ts +110 -23
  507. package/scripts/rules/timed-rerun.ts +1 -1
  508. package/scripts/rules/turn-filings.ts +90 -0
  509. package/scripts/rules/worktree-guard.ts +22 -7
  510. package/scripts/run/board/run-board-ending-reason.ts +6 -2
  511. package/scripts/run/board/run-board-fit.ts +24 -1
  512. package/scripts/run/board/run-board-found.ts +134 -0
  513. package/scripts/run/board/run-board-header.ts +8 -0
  514. package/scripts/run/board/run-board-labels.ts +11 -1
  515. package/scripts/run/board/run-board-lane-time.ts +1 -0
  516. package/scripts/run/board/run-board-link.ts +15 -2
  517. package/scripts/run/board/run-board-notes.ts +7 -1
  518. package/scripts/run/board/run-board-operation.ts +4 -2
  519. package/scripts/run/board/run-board-phase.ts +2 -5
  520. package/scripts/run/board/run-board-plan.ts +1 -1
  521. package/scripts/run/board/run-board-read.ts +46 -1
  522. package/scripts/run/board/run-board-reason.ts +20 -8
  523. package/scripts/run/board/run-board-render-checks.ts +3 -2
  524. package/scripts/run/board/run-board-render-drawn.ts +11 -0
  525. package/scripts/run/board/run-board-render-found.ts +157 -0
  526. package/scripts/run/board/run-board-render-lead.ts +9 -0
  527. package/scripts/run/board/run-board-render-legend.ts +19 -0
  528. package/scripts/run/board/run-board-render-tail.ts +1 -1
  529. package/scripts/run/board/run-board-render.ts +82 -18
  530. package/scripts/run/board/run-board-spin.ts +1 -3
  531. package/scripts/run/board/run-board-status.ts +2 -0
  532. package/scripts/run/board/run-board-tick.ts +39 -10
  533. package/scripts/run/carry/run-carry-ended.ts +3 -2
  534. package/scripts/run/carry/run-carry.ts +3 -2
  535. package/scripts/run/cut/run-cut-cli.ts +33 -133
  536. package/scripts/run/cut/run-cut-digest.ts +152 -0
  537. package/scripts/run/cut/run-cut-handoff.ts +52 -8
  538. package/scripts/run/cut/run-cut-report.ts +24 -3
  539. package/scripts/run/cut/run-cut-resume.ts +129 -0
  540. package/scripts/run/cut/run-cut-review.ts +105 -0
  541. package/scripts/run/cut/run-cut.ts +18 -7
  542. package/scripts/run/detached-launch.ts +1 -1
  543. package/scripts/run/entry/run-entry-cli.ts +88 -19
  544. package/scripts/run/entry/run-entry-spill.ts +83 -0
  545. package/scripts/run/entry/run-entry-stop.ts +5 -1
  546. package/scripts/run/entry/run-entry-trust.ts +91 -0
  547. package/scripts/run/event/run-event-baseline.ts +56 -0
  548. package/scripts/run/event/run-event-filed.ts +9 -3
  549. package/scripts/run/event/run-event-overrun.ts +197 -0
  550. package/scripts/run/event/run-event-render.ts +4 -0
  551. package/scripts/run/event/run-event-stream.ts +25 -3
  552. package/scripts/run/hold/run-stop-notify.ts +3 -8
  553. package/scripts/run/merge/run-merge-cap.ts +57 -0
  554. package/scripts/run/merge/run-merge-cli.ts +66 -23
  555. package/scripts/run/merge/run-merge-outcome.ts +2 -0
  556. package/scripts/run/merge/run-merge-ship.ts +13 -3
  557. package/scripts/run/merge/run-merge-signals.ts +40 -23
  558. package/scripts/run/merge/run-merge-steps.ts +56 -36
  559. package/scripts/run/merge/run-merge-usage-limit.ts +53 -0
  560. package/scripts/run/merge/run-merge-withdrawn.ts +53 -0
  561. package/scripts/run/merge/run-merge.ts +41 -14
  562. package/scripts/run/review/run-review-cli.ts +306 -20
  563. package/scripts/run/review/run-review-early-push.ts +121 -0
  564. package/scripts/run/review/run-review-join-read.ts +94 -0
  565. package/scripts/run/review/run-review-pinned-accepted.ts +126 -0
  566. package/scripts/run/review/run-review-pinned-join.ts +216 -0
  567. package/scripts/run/review/run-review-pinned-steps.ts +383 -0
  568. package/scripts/run/review/run-review-pinned-tree.ts +37 -0
  569. package/scripts/run/review/run-review-pinned.ts +53 -0
  570. package/scripts/run/review/run-review-steps.ts +70 -34
  571. package/scripts/run/review/run-review.ts +26 -6
  572. package/scripts/run/run-parent-cut-hook.ts +3 -4
  573. package/scripts/run/run-prep.ts +1 -0
  574. package/scripts/run/run-stage-read.ts +2 -6
  575. package/scripts/run/run-step-cli.ts +17 -5
  576. package/scripts/run/run-step-lane-plan.ts +27 -0
  577. package/scripts/run/run-step-section.ts +26 -7
  578. package/scripts/run/run-step.ts +5 -2
  579. package/scripts/run/ship/run-ship-args.ts +19 -0
  580. package/scripts/run/ship/run-ship-brokered-review.ts +106 -0
  581. package/scripts/run/ship/run-ship-cli.ts +131 -39
  582. package/scripts/run/ship/run-ship-conflict-probe.ts +59 -0
  583. package/scripts/run/ship/run-ship-detach.ts +10 -4
  584. package/scripts/run/ship/run-ship-handover.ts +106 -0
  585. package/scripts/run/ship/run-ship-infra-retry.ts +16 -1
  586. package/scripts/run/ship/run-ship-lap.ts +63 -0
  587. package/scripts/run/ship/run-ship-next.ts +27 -26
  588. package/scripts/run/ship/run-ship-overlap.ts +8 -3
  589. package/scripts/run/ship/run-ship-place.ts +9 -2
  590. package/scripts/run/ship/run-ship-planned.ts +92 -0
  591. package/scripts/run/ship/run-ship-pre-detach-pinned.ts +197 -0
  592. package/scripts/run/ship/run-ship-pre-detach-timed.ts +7 -8
  593. package/scripts/run/ship/run-ship-pre-detach.ts +77 -23
  594. package/scripts/run/ship/run-ship-preflight.ts +16 -4
  595. package/scripts/run/ship/run-ship-probe.ts +23 -9
  596. package/scripts/run/ship/run-ship-relaunch-cap.ts +43 -7
  597. package/scripts/run/ship/run-ship-relaunch.ts +51 -0
  598. package/scripts/run/ship/run-ship-return.ts +103 -29
  599. package/scripts/run/ship/run-ship-review-reason.ts +24 -0
  600. package/scripts/run/ship/run-ship-review-steps.ts +230 -59
  601. package/scripts/run/ship/run-ship-review.ts +171 -51
  602. package/scripts/run/ship/run-ship-reviewer.ts +138 -42
  603. package/scripts/run/ship/run-ship-scoped.ts +39 -10
  604. package/scripts/run/ship/run-ship-stage.ts +49 -13
  605. package/scripts/run/ship/run-ship-steps.ts +24 -4
  606. package/scripts/run/ship/run-ship-stop-cause.ts +43 -2
  607. package/scripts/run/ship/run-ship-stop-context.ts +50 -13
  608. package/scripts/run/ship/run-ship-sync.ts +171 -30
  609. package/scripts/run/ship/run-ship-synced-scope.ts +178 -0
  610. package/scripts/run/ship/run-ship-wait-cli.ts +145 -0
  611. package/scripts/run/ship/run-ship-waiter.ts +114 -0
  612. package/scripts/run/ship/run-ship.ts +16 -2
  613. package/scripts/run/wake/run-wake-caffeinate.ts +48 -0
  614. package/scripts/run/wake/run-wake-cli.ts +6 -113
  615. package/scripts/run/wake/run-wake-code.ts +53 -11
  616. package/scripts/run/wake/run-wake-driver.ts +5 -3
  617. package/scripts/run/wake/run-wake-finish.ts +137 -0
  618. package/scripts/run/wake/run-wake-loop.ts +5 -3
  619. package/scripts/run/wake/run-wake-ports.ts +11 -3
  620. package/scripts/run/wake/run-wake-session.ts +2 -0
  621. package/scripts/run/wake/run-wake.ts +3 -2
  622. package/scripts/safe-chain/ci-installer-pin.ts +49 -8
  623. package/scripts/safe-chain/project-config.ts +3 -2
  624. package/scripts/security/secretlint-scan.ts +42 -9
  625. package/scripts/security/security-audit-provision-main.ts +9 -1
  626. package/scripts/security/security-audit-provision.ts +1 -1
  627. package/scripts/security/security-audit.ts +21 -1
  628. package/scripts/security/sonar-file.ts +10 -5
  629. package/scripts/split/split-assess.ts +12 -3
  630. package/scripts/split/split-early-notice.ts +116 -0
  631. package/scripts/split/split-measure.ts +20 -2
  632. package/scripts/split/split-resolution.ts +107 -0
  633. package/scripts/test/direct-importers.ts +185 -0
  634. package/scripts/test/pure-files-entries.ts +83 -0
  635. package/scripts/test/related-heavy-tests.ts +81 -0
  636. package/scripts/test/test-no-base.ts +88 -0
  637. package/scripts/test/test-pinned-cache-logic.ts +363 -0
  638. package/scripts/test/test-pinned-cache.ts +337 -0
  639. package/scripts/test/test-pinned-emit.ts +49 -0
  640. package/scripts/test/test-pinned-functions.ts +116 -0
  641. package/scripts/test/test-pinned-ledger.ts +80 -0
  642. package/scripts/test/test-pinned-logic.ts +208 -20
  643. package/scripts/test/test-pinned-main.ts +84 -18
  644. package/scripts/test/test-pinned-pool.ts +73 -0
  645. package/scripts/test/test-pinned-probe.ts +254 -0
  646. package/scripts/test/test-pinned-prune-logic.ts +118 -0
  647. package/scripts/test/test-pinned-reach.ts +194 -0
  648. package/scripts/test/test-pinned-record.ts +196 -0
  649. package/scripts/test/test-pinned-rewire.ts +148 -0
  650. package/scripts/test/test-pinned-spawn.ts +81 -0
  651. package/scripts/test/test-pinned-stage.ts +70 -0
  652. package/scripts/test/test-pinned.ts +258 -47
  653. package/scripts/test/test-reach-cli.ts +61 -0
  654. package/scripts/test/test-read-map.ts +35 -11
  655. package/scripts/test/test-read-recording.ts +17 -5
  656. package/scripts/test/test-read-trace.ts +26 -8
  657. package/scripts/test/test-red-logic.ts +46 -7
  658. package/scripts/test/test-red.ts +34 -14
  659. package/scripts/test/test-related-claim.ts +37 -0
  660. package/scripts/test/test-related-main.ts +4 -1
  661. package/scripts/test/test-related-moved.ts +91 -0
  662. package/scripts/test/test-related-record.ts +43 -23
  663. package/scripts/test/test-related-scope.ts +99 -34
  664. package/scripts/test/test-related-synced.ts +135 -0
  665. package/scripts/test/test-related-touched.ts +84 -0
  666. package/scripts/test/test-related.ts +167 -83
  667. package/scripts/test/test-unit-guard.ts +28 -5
  668. package/scripts/test/unit-durations.ts +41 -0
  669. package/scripts/test/unit-worker-share.ts +5 -4
  670. package/scripts/test/vitest-cache-directory.ts +19 -0
  671. package/scripts/test/vitest-cli-excludes.ts +14 -0
  672. package/scripts/test/vitest-failure-summary.ts +111 -0
  673. package/scripts/test/whole-suite-files.ts +12 -1
  674. package/scripts/time-runtime/time-batch-guard.ts +42 -4
  675. package/scripts/time-runtime/time-bundle-call.ts +1 -1
  676. package/scripts/time-runtime/time-bundles.ts +36 -5
  677. package/scripts/time-runtime/time-markers.ts +2 -2
  678. package/scripts/time-runtime/time-search-call.ts +38 -0
  679. package/scripts/time-runtime/time-shell.ts +1 -1
  680. package/scripts/time-runtime/time-transcript-line.ts +17 -5
  681. package/scripts/version/development-engines-verdict.ts +124 -0
  682. package/scripts/version/latest-corepack.ts +2 -0
  683. package/templates/gitignore +2 -0
  684. package/templates/workflows/ci.yml +41 -0
  685. package/dist/hooks/chunk-AZX4FGQ3.js +0 -207
  686. package/dist/hooks/chunk-PT5R6UJD.js +0 -7131
  687. package/dist/hooks/chunk-TUIFS5E7.js +0 -72
  688. package/dist/hooks/chunk-YCDOIR3I.js +0 -3456
  689. package/scripts/cost-runtime/context-cut-threshold.ts +0 -11
  690. package/scripts/rules/filing-cap.ts +0 -139
@@ -0,0 +1,1243 @@
1
+ // scripts/init/init-paths.ts
2
+ import path from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ var PACKAGE_DIR = path.join(path.dirname(fileURLToPath(import.meta.url)), "..", "..");
5
+ var PROJECT_ROOT = process.cwd();
6
+ function package_path(relative_path) {
7
+ return path.join(PACKAGE_DIR, relative_path);
8
+ }
9
+
10
+ // scripts/lib/atomic-write.ts
11
+ import { randomUUID } from "node:crypto";
12
+ import { chmodSync, mkdirSync, renameSync, rmSync, writeFileSync } from "node:fs";
13
+ import path2 from "node:path";
14
+ var STAGING_EXTENSION = ".tmp";
15
+ var CREATE_EXCLUSIVE_FLAG = "wx";
16
+ function staging_path(target, staging_directory) {
17
+ const name = `${path2.basename(target)}.${String(process.pid)}.${randomUUID()}${STAGING_EXTENSION}`;
18
+ return path2.join(staging_directory, name);
19
+ }
20
+ function write_staged(staging, content, mode) {
21
+ writeFileSync(staging, content, {
22
+ flag: CREATE_EXCLUSIVE_FLAG,
23
+ ...mode !== void 0 && { mode }
24
+ });
25
+ if (mode !== void 0) chmodSync(staging, mode);
26
+ }
27
+ function replace_file(target, content, options = {}) {
28
+ const directory = options.staging_directory ?? path2.dirname(target);
29
+ const staging = staging_path(target, directory);
30
+ mkdirSync(directory, { recursive: true });
31
+ try {
32
+ write_staged(staging, content, options.mode);
33
+ renameSync(staging, target);
34
+ } finally {
35
+ rmSync(staging, { force: true });
36
+ }
37
+ }
38
+ var atomic_write = { replace_file };
39
+
40
+ // scripts/josh/stamp-file.ts
41
+ import { createHash } from "node:crypto";
42
+ import { lstatSync, readFileSync, rmSync as rmSync2, writeFileSync as writeFileSync2 } from "node:fs";
43
+ import path3 from "node:path";
44
+
45
+ // scripts/josh/platform-temporary.ts
46
+ import { accessSync, constants } from "node:fs";
47
+ import { tmpdir } from "node:os";
48
+ var POSIX_TEMP_ROOT = "/tmp";
49
+ var WINDOWS_PLATFORM = "win32";
50
+ function is_writable_directory(directory) {
51
+ try {
52
+ accessSync(directory, constants.W_OK);
53
+ return true;
54
+ } catch {
55
+ return false;
56
+ }
57
+ }
58
+ function resolve_temporary_root(platform2, can_write = is_writable_directory) {
59
+ if (platform2 === WINDOWS_PLATFORM) return tmpdir();
60
+ return can_write(POSIX_TEMP_ROOT) ? POSIX_TEMP_ROOT : tmpdir();
61
+ }
62
+ var TEMP_ROOT_KEY = "JOSH_TEMP_ROOT";
63
+ function temporary_root(override, platform2) {
64
+ return override === void 0 || override === "" ? resolve_temporary_root(platform2) : override;
65
+ }
66
+ var PLATFORM_TEMP_ROOT = temporary_root(process.env[TEMP_ROOT_KEY], process.platform);
67
+ var platform_temporary = {
68
+ TEMP_ROOT_KEY,
69
+ resolve_temporary_root,
70
+ is_writable_directory,
71
+ temporary_root
72
+ };
73
+
74
+ // scripts/josh/stamp-file.ts
75
+ var HASH_ALGORITHM = "sha256";
76
+ var STAMP_SUFFIX = ".json";
77
+ var STAMP_KEY_LENGTH = 16;
78
+ var STAMP_FILE_MODE = 384;
79
+ var STAMP_WRITE_FLAG = "wx";
80
+ var STAMP_CREATE_FLAG = STAMP_WRITE_FLAG;
81
+ var EXISTS_ERROR_CODE = "EEXIST";
82
+ var ACCOUNT_KEY_SEPARATOR = ":";
83
+ function digest(content) {
84
+ return createHash(HASH_ALGORITHM).update(content).digest("hex");
85
+ }
86
+ function account_key() {
87
+ return String(process.getuid?.() ?? "");
88
+ }
89
+ function stamp_name(prefix, root = PACKAGE_DIR, suffix = STAMP_SUFFIX) {
90
+ const key = digest(`${account_key()}${ACCOUNT_KEY_SEPARATOR}${root}`).slice(0, STAMP_KEY_LENGTH);
91
+ return `${prefix}${key}${suffix}`;
92
+ }
93
+ function stamp_path(prefix, root = PACKAGE_DIR, suffix = STAMP_SUFFIX) {
94
+ return path3.join(PLATFORM_TEMP_ROOT, stamp_name(prefix, root, suffix));
95
+ }
96
+ function write_exclusively(target, content) {
97
+ rmSync2(target, { force: true });
98
+ writeFileSync2(target, content, { flag: STAMP_WRITE_FLAG, mode: STAMP_FILE_MODE });
99
+ return target;
100
+ }
101
+ function write_stamp(target, payload) {
102
+ return write_exclusively(target, JSON.stringify(payload));
103
+ }
104
+ function is_own_regular_file(source) {
105
+ const stats = lstatSync(source);
106
+ if (!stats.isFile()) return false;
107
+ const uid = process.getuid?.();
108
+ return uid === void 0 || stats.uid === uid;
109
+ }
110
+ function is_foreign_file(target) {
111
+ try {
112
+ return lstatSync(target).isFile() && !is_own_regular_file(target);
113
+ } catch {
114
+ return false;
115
+ }
116
+ }
117
+ function replace_text_stamp(target, text) {
118
+ if (is_foreign_file(target)) {
119
+ throw new Error(`refusing to replace another account's file: ${target}`);
120
+ }
121
+ atomic_write.replace_file(target, text, { mode: STAMP_FILE_MODE });
122
+ return target;
123
+ }
124
+ function replace_stamp(target, payload) {
125
+ return replace_text_stamp(target, JSON.stringify(payload));
126
+ }
127
+ function write_text_stamp(target, text) {
128
+ return write_exclusively(target, text);
129
+ }
130
+ function create_stamp(target, payload) {
131
+ try {
132
+ writeFileSync2(target, JSON.stringify(payload), {
133
+ flag: STAMP_CREATE_FLAG,
134
+ mode: STAMP_FILE_MODE
135
+ });
136
+ return true;
137
+ } catch (error) {
138
+ if (error.code === EXISTS_ERROR_CODE) return false;
139
+ throw error;
140
+ }
141
+ }
142
+ function remove_stamp(target) {
143
+ rmSync2(target, { force: true });
144
+ }
145
+ function read_stamp_text(source) {
146
+ try {
147
+ if (!is_own_regular_file(source)) return void 0;
148
+ return readFileSync(source, "utf8");
149
+ } catch {
150
+ return void 0;
151
+ }
152
+ }
153
+ var stamp_file = {
154
+ create_stamp,
155
+ digest,
156
+ is_own_regular_file,
157
+ read_stamp_text,
158
+ replace_stamp,
159
+ replace_text_stamp,
160
+ remove_stamp,
161
+ stamp_name,
162
+ stamp_path,
163
+ write_stamp,
164
+ write_text_stamp
165
+ };
166
+
167
+ // scripts/lib/timeouts.ts
168
+ var MS_PER_SECOND = 1e3;
169
+ var SECONDS_PER_MINUTE = 60;
170
+ var MS_PER_MINUTE = MS_PER_SECOND * SECONDS_PER_MINUTE;
171
+ var PROBE_TIMEOUT_MS = 2e3;
172
+ var FETCH_TIMEOUT_MS = 1e4;
173
+ var GIT_TIMEOUT_MS = 1e4;
174
+ var HOOK_PROCESS_TIMEOUT_MS = 15e3;
175
+ var GH_API_TIMEOUT_MS = 2e4;
176
+ var COMMAND_TIMEOUT_MS = 3e4;
177
+ var INSTALL_TIMEOUT_MS = 6e5;
178
+ var SUITE_TIMEOUT_MS = 18e5;
179
+
180
+ // scripts/git/constants.ts
181
+ import { platform } from "node:os";
182
+ var GIT_COMMAND_UNIX = "/usr/bin/git";
183
+ var PORCELAIN_FLAG = "--porcelain";
184
+ var UNTRACKED_FILES_FLAG = "--untracked-files=all";
185
+ var GIT_BINARY_KEY = "JOSH_GIT_BINARY";
186
+ function get_git_command() {
187
+ if (platform() === "win32") return String.raw`"C:\Program Files\Git\cmd\git.exe"`;
188
+ return GIT_COMMAND_UNIX;
189
+ }
190
+ function get_git_command_for_spawn() {
191
+ const binary = process.env[GIT_BINARY_KEY];
192
+ if (binary !== void 0 && binary !== "") return binary;
193
+ if (platform() === "win32") return String.raw`C:\Program Files\Git\cmd\git.exe`;
194
+ return GIT_COMMAND_UNIX;
195
+ }
196
+ var git_utilities = {
197
+ get_git_command,
198
+ get_git_command_for_spawn
199
+ };
200
+
201
+ // scripts/git/git-spawn.ts
202
+ import { execa as execa3 } from "execa";
203
+
204
+ // scripts/git/git-execa-error.ts
205
+ function get_exit_code(error) {
206
+ if (typeof error !== "object" || error === null || !("exitCode" in error)) return void 0;
207
+ const { exitCode: exit_code } = error;
208
+ return typeof exit_code === "number" ? exit_code : void 0;
209
+ }
210
+ function has_timed_out(error) {
211
+ if (typeof error !== "object" || error === null || !("timedOut" in error)) return false;
212
+ return error.timedOut === true;
213
+ }
214
+ var TIMEOUT_EXIT_CODE = "timeout";
215
+ function create_spawn_error(command, exit_code) {
216
+ const exit_code_string = exit_code === void 0 ? "unknown" : String(exit_code);
217
+ const error_message = `git ${command} exited with code ${exit_code_string}`;
218
+ return new Error(error_message, { cause: { exit_code: exit_code_string } });
219
+ }
220
+
221
+ // scripts/git/git-push-transport.ts
222
+ import { execa as execa2 } from "execa";
223
+
224
+ // scripts/git/git-ssh-keepalive.ts
225
+ import { execa } from "execa";
226
+ var SSH_KEEPALIVE_OPTIONS = "-o ServerAliveInterval=15 -o ServerAliveCountMax=3";
227
+ var SSH_COMMAND_VARIABLE = "GIT_SSH_COMMAND";
228
+ var SSH_LEGACY_VARIABLE = "GIT_SSH";
229
+ var KEEPALIVE_SSH_COMMAND = `ssh ${SSH_KEEPALIVE_OPTIONS}`;
230
+ var SSH_COMMAND_CONFIG_KEY = "core.sshCommand";
231
+ var CONFIG_PROBE_ARGUMENTS = ["config", "--get", SSH_COMMAND_CONFIG_KEY];
232
+ var PROBE_OPTIONS = { timeout: PROBE_TIMEOUT_MS };
233
+ function to_environment_value(name) {
234
+ return process.env[name]?.trim() ?? "";
235
+ }
236
+ function to_configured_ssh_command() {
237
+ const from_command = to_environment_value(SSH_COMMAND_VARIABLE);
238
+ return from_command === "" ? to_environment_value(SSH_LEGACY_VARIABLE) : from_command;
239
+ }
240
+ async function has_configured_ssh_command() {
241
+ if (to_configured_ssh_command() !== "") return true;
242
+ try {
243
+ const git_command_bin = git_utilities.get_git_command_for_spawn();
244
+ const { stdout } = await execa(git_command_bin, CONFIG_PROBE_ARGUMENTS, PROBE_OPTIONS);
245
+ return stdout.trim() !== "";
246
+ } catch (error) {
247
+ return has_timed_out(error);
248
+ }
249
+ }
250
+ async function to_environment() {
251
+ const should_keep_alive = !await has_configured_ssh_command();
252
+ return should_keep_alive ? { [SSH_COMMAND_VARIABLE]: KEEPALIVE_SSH_COMMAND } : {};
253
+ }
254
+ var git_ssh_keepalive = {
255
+ to_environment
256
+ };
257
+
258
+ // scripts/git/git-push-transport.ts
259
+ var PUSH_TIMEOUT_SECONDS = 120;
260
+ var PUSH_TIMEOUT_MS = PUSH_TIMEOUT_SECONDS * MS_PER_SECOND;
261
+ var PUSH_TIMEOUT_LABEL = `${String(PUSH_TIMEOUT_SECONDS)}s`;
262
+ var PUSH_TIMEOUT_MESSAGE = "git push timed out";
263
+ var PUSH_SUBCOMMAND = "push";
264
+ async function to_push_options() {
265
+ return {
266
+ stdio: "inherit",
267
+ timeout: PUSH_TIMEOUT_MS,
268
+ env: await git_ssh_keepalive.to_environment()
269
+ };
270
+ }
271
+ async function did_push_time_out(arguments_list) {
272
+ const git_command_bin = git_utilities.get_git_command_for_spawn();
273
+ const options = await to_push_options();
274
+ try {
275
+ await execa2(git_command_bin, [PUSH_SUBCOMMAND, ...arguments_list], options);
276
+ return false;
277
+ } catch (error) {
278
+ if (has_timed_out(error)) return true;
279
+ throw create_spawn_error(PUSH_SUBCOMMAND, get_exit_code(error));
280
+ }
281
+ }
282
+ function to_manual_command(arguments_list) {
283
+ return ["git", PUSH_SUBCOMMAND, ...arguments_list].join(" ");
284
+ }
285
+ function to_retry_notice(arguments_list) {
286
+ return `${PUSH_TIMEOUT_MESSAGE} after ${PUSH_TIMEOUT_LABEL} \u2014 retrying once: ${to_manual_command(arguments_list)}`;
287
+ }
288
+ function create_timeout_error(arguments_list) {
289
+ const message = `${PUSH_TIMEOUT_MESSAGE} twice (${PUSH_TIMEOUT_LABEL} each). Re-run it by hand: ${to_manual_command(arguments_list)}`;
290
+ return new Error(message, { cause: { exit_code: TIMEOUT_EXIT_CODE } });
291
+ }
292
+ async function push(arguments_list) {
293
+ if (!await did_push_time_out(arguments_list)) return;
294
+ console.warn(to_retry_notice(arguments_list));
295
+ if (!await did_push_time_out(arguments_list)) return;
296
+ throw create_timeout_error(arguments_list);
297
+ }
298
+ var git_push_transport = {
299
+ push
300
+ };
301
+
302
+ // scripts/git/git-spawn.ts
303
+ async function read(arguments_, timeout_ms = GIT_TIMEOUT_MS) {
304
+ const git_cmd = git_utilities.get_git_command_for_spawn();
305
+ const { stdout } = await execa3(git_cmd, arguments_, { timeout: timeout_ms });
306
+ return stdout.trimEnd();
307
+ }
308
+ var REMOTE_TIMEOUT_MS = PUSH_TIMEOUT_MS;
309
+ function to_budget_error(command, error, timeout_ms) {
310
+ if (!has_timed_out(error)) return create_spawn_error(command, get_exit_code(error));
311
+ const seconds = String(Math.round(timeout_ms / MS_PER_SECOND));
312
+ return new Error(`git ${command} timed out after ${seconds}s`, {
313
+ cause: { exit_code: TIMEOUT_EXIT_CODE }
314
+ });
315
+ }
316
+ async function spawn_remote(arguments_, options) {
317
+ const git_cmd = git_utilities.get_git_command_for_spawn();
318
+ try {
319
+ const { stdout } = await execa3(git_cmd, arguments_, options);
320
+ return typeof stdout === "string" ? stdout.trimEnd() : "";
321
+ } catch (error) {
322
+ throw to_budget_error(arguments_[0] ?? "", error, options.timeout);
323
+ }
324
+ }
325
+ async function read_remote(arguments_, timeout_ms = REMOTE_TIMEOUT_MS) {
326
+ return await spawn_remote(arguments_, {
327
+ timeout: timeout_ms,
328
+ env: await git_ssh_keepalive.to_environment()
329
+ });
330
+ }
331
+ async function with_output_remote(command, arguments_list) {
332
+ await spawn_remote([command, ...arguments_list], {
333
+ stdio: "inherit",
334
+ timeout: REMOTE_TIMEOUT_MS,
335
+ env: await git_ssh_keepalive.to_environment()
336
+ });
337
+ }
338
+ async function with_output(command, arguments_list, options = {}) {
339
+ const { config_options = [], timeout_ms = GIT_TIMEOUT_MS } = options;
340
+ const git_command_bin = git_utilities.get_git_command_for_spawn();
341
+ const spawn_arguments = [...config_options, command, ...arguments_list];
342
+ try {
343
+ await execa3(git_command_bin, spawn_arguments, { stdio: "inherit", timeout: timeout_ms });
344
+ } catch (error) {
345
+ throw to_budget_error(command, error, timeout_ms);
346
+ }
347
+ }
348
+ var git_spawn = {
349
+ read,
350
+ read_remote,
351
+ with_output,
352
+ with_output_remote
353
+ };
354
+
355
+ // scripts/git/git-diff-reads.ts
356
+ var REFS_REMOTES_ORIGIN_PREFIX = "refs/remotes/origin/";
357
+ var NAME_ONLY_FLAG = "--name-only";
358
+ var DEFAULT_BRANCH_FALLBACK = "main";
359
+ var DEFAULT_BRANCH_ARGUMENTS = ["symbolic-ref", "refs/remotes/origin/HEAD"];
360
+ function default_branch_of(output) {
361
+ const trimmed = output?.trim() ?? "";
362
+ if (!trimmed.startsWith(REFS_REMOTES_ORIGIN_PREFIX)) return DEFAULT_BRANCH_FALLBACK;
363
+ return trimmed.slice(REFS_REMOTES_ORIGIN_PREFIX.length);
364
+ }
365
+ async function get_default_branch() {
366
+ try {
367
+ return default_branch_of(await git_spawn.read([...DEFAULT_BRANCH_ARGUMENTS]));
368
+ } catch {
369
+ return DEFAULT_BRANCH_FALLBACK;
370
+ }
371
+ }
372
+ var MERGE_BASE_COMMAND = "merge-base";
373
+ function reference_check_arguments(reference) {
374
+ return ["rev-parse", "--verify", "--quiet", reference];
375
+ }
376
+ function remote_reference_of(default_branch) {
377
+ return `${REFS_REMOTES_ORIGIN_PREFIX}${default_branch}`;
378
+ }
379
+ async function reference_exists(reference) {
380
+ try {
381
+ await git_spawn.read([...reference_check_arguments(reference)]);
382
+ return true;
383
+ } catch {
384
+ return false;
385
+ }
386
+ }
387
+ async function default_branch_reference() {
388
+ const default_branch = await get_default_branch();
389
+ const remote_reference = remote_reference_of(default_branch);
390
+ return await reference_exists(remote_reference) ? remote_reference : default_branch;
391
+ }
392
+ function merge_base_arguments(reference) {
393
+ return [MERGE_BASE_COMMAND, reference, "HEAD"];
394
+ }
395
+ function incoming_base_arguments(reference) {
396
+ return [MERGE_BASE_COMMAND, reference, "MERGE_HEAD"];
397
+ }
398
+ function later_base_arguments(base, incoming) {
399
+ return [MERGE_BASE_COMMAND, "--independent", base, incoming];
400
+ }
401
+ function later_base_of(output, base) {
402
+ const [later = ""] = output?.split("\n", 1) ?? [];
403
+ return later === "" ? base : later;
404
+ }
405
+ async function change_base() {
406
+ const default_branch = await default_branch_reference();
407
+ try {
408
+ return await git_spawn.read([...merge_base_arguments(default_branch)]);
409
+ } catch {
410
+ return default_branch;
411
+ }
412
+ }
413
+ async function diff_main(file_path) {
414
+ return await git_spawn.read(["diff", await change_base(), "--", file_path]);
415
+ }
416
+ var NO_PATH_QUOTING = ["-c", "core.quotePath=false"];
417
+ var NO_RELATIVE_PATHS = "--no-relative";
418
+ var NO_RENAME_DETECTION = "--no-renames";
419
+ async function change_base_commit() {
420
+ return await git_spawn.read(["rev-parse", await change_base()]);
421
+ }
422
+ function names_since_arguments(commit2) {
423
+ return [
424
+ ...NO_PATH_QUOTING,
425
+ "diff",
426
+ NAME_ONLY_FLAG,
427
+ NO_RELATIVE_PATHS,
428
+ NO_RENAME_DETECTION,
429
+ commit2,
430
+ "--"
431
+ ];
432
+ }
433
+ async function diff_names_since(commit2) {
434
+ return await git_spawn.read([...names_since_arguments(commit2)]);
435
+ }
436
+ async function tree_names_at(commit2, paths) {
437
+ return await git_spawn.read([
438
+ ...NO_PATH_QUOTING,
439
+ "ls-tree",
440
+ "-r",
441
+ NAME_ONLY_FLAG,
442
+ "--full-tree",
443
+ commit2,
444
+ "--",
445
+ ...paths
446
+ ]);
447
+ }
448
+ async function diff_main_names() {
449
+ return await diff_names_since(await change_base());
450
+ }
451
+ async function diff_cached_names() {
452
+ return await git_spawn.read([
453
+ ...NO_PATH_QUOTING,
454
+ "diff",
455
+ "--cached",
456
+ NAME_ONLY_FLAG,
457
+ NO_RELATIVE_PATHS,
458
+ NO_RENAME_DETECTION
459
+ ]);
460
+ }
461
+ async function diff_numstat_since(base) {
462
+ return await git_spawn.read([
463
+ ...NO_PATH_QUOTING,
464
+ "diff",
465
+ "--numstat",
466
+ NO_RELATIVE_PATHS,
467
+ NO_RENAME_DETECTION,
468
+ base,
469
+ "--"
470
+ ]);
471
+ }
472
+ var WHOLE_TREE_PATHSPEC = ":/";
473
+ var UNTRACKED_ARGUMENTS = [
474
+ ...NO_PATH_QUOTING,
475
+ "ls-files",
476
+ "--others",
477
+ "--exclude-standard",
478
+ "--full-name",
479
+ WHOLE_TREE_PATHSPEC
480
+ ];
481
+ async function untracked_names() {
482
+ return await git_spawn.read([...UNTRACKED_ARGUMENTS]);
483
+ }
484
+ var git_diff_reads = {
485
+ DEFAULT_BRANCH_ARGUMENTS,
486
+ UNTRACKED_ARGUMENTS,
487
+ change_base,
488
+ change_base_commit,
489
+ default_branch_of,
490
+ default_branch_reference,
491
+ diff_cached_names,
492
+ diff_main,
493
+ diff_main_names,
494
+ diff_numstat_since,
495
+ diff_names_since,
496
+ get_default_branch,
497
+ incoming_base_arguments,
498
+ later_base_arguments,
499
+ later_base_of,
500
+ merge_base_arguments,
501
+ names_since_arguments,
502
+ reference_check_arguments,
503
+ remote_reference_of,
504
+ tree_names_at,
505
+ untracked_names
506
+ };
507
+
508
+ // scripts/git/git-pre-push-hook.ts
509
+ import { mkdtemp, rm, writeFile } from "node:fs/promises";
510
+ import { tmpdir as tmpdir2 } from "node:os";
511
+ import path4 from "node:path";
512
+ var REMOTE = "origin";
513
+ var HOOK_NAME = "pre-push";
514
+ var PROBE_HOOK_NAME = "kit-hook-run-probe";
515
+ var ALLOW_UNKNOWN_HOOK_NAME_FLAG = "--allow-unknown-hook-name";
516
+ var HOOK_RUN = "run";
517
+ var STDIN_FILE = "refs";
518
+ var TEMPORARY_PREFIX = "kit-pre-push-";
519
+ var ZERO_DIGIT = "0";
520
+ async function read_remote_oid(branch2) {
521
+ try {
522
+ return await git_spawn.read([
523
+ "rev-parse",
524
+ "--verify",
525
+ "--quiet",
526
+ `refs/remotes/${REMOTE}/${branch2}`
527
+ ]);
528
+ } catch {
529
+ return void 0;
530
+ }
531
+ }
532
+ async function read_push_references() {
533
+ const [branch2, local_oid] = await Promise.all([
534
+ git_spawn.read(["rev-parse", "--abbrev-ref", "HEAD"]),
535
+ git_spawn.read(["rev-parse", "HEAD"])
536
+ ]);
537
+ return { branch: branch2, local_oid, remote_oid: await read_remote_oid(branch2) };
538
+ }
539
+ function to_stdin_line(references) {
540
+ const reference = `refs/heads/${references.branch}`;
541
+ const remote_oid = references.remote_oid ?? ZERO_DIGIT.repeat(references.local_oid.length);
542
+ return `${reference} ${references.local_oid} ${reference} ${remote_oid}
543
+ `;
544
+ }
545
+ function to_hook_run_arguments(stdin_path, hook_name) {
546
+ return [HOOK_RUN, "--ignore-missing", `--to-stdin=${stdin_path}`, hook_name];
547
+ }
548
+ async function can_probe(probe_arguments) {
549
+ try {
550
+ await git_spawn.read(["hook", ...probe_arguments]);
551
+ return true;
552
+ } catch {
553
+ return false;
554
+ }
555
+ }
556
+ async function can_run_hooks(stdin_path) {
557
+ const [, ...options] = to_hook_run_arguments(stdin_path, PROBE_HOOK_NAME);
558
+ if (await can_probe([HOOK_RUN, ALLOW_UNKNOWN_HOOK_NAME_FLAG, ...options])) return true;
559
+ return await can_probe([HOOK_RUN, ...options]);
560
+ }
561
+ async function run_with_stdin(stdin_line) {
562
+ const directory = await mkdtemp(path4.join(tmpdir2(), TEMPORARY_PREFIX));
563
+ const stdin_path = path4.join(directory, STDIN_FILE);
564
+ try {
565
+ await writeFile(stdin_path, stdin_line);
566
+ if (!await can_run_hooks(stdin_path)) return false;
567
+ const url = await git_spawn.read(["remote", "get-url", REMOTE]);
568
+ await git_spawn.with_output(
569
+ "hook",
570
+ [...to_hook_run_arguments(stdin_path, HOOK_NAME), "--", REMOTE, url],
571
+ { timeout_ms: SUITE_TIMEOUT_MS }
572
+ );
573
+ return true;
574
+ } finally {
575
+ await rm(directory, { force: true, recursive: true });
576
+ }
577
+ }
578
+ async function run() {
579
+ const references = await read_push_references();
580
+ if (references.local_oid === references.remote_oid) return true;
581
+ return await run_with_stdin(to_stdin_line(references));
582
+ }
583
+ var git_pre_push_hook = {
584
+ run
585
+ };
586
+
587
+ // scripts/lib/spawn-exit.ts
588
+ function read_spawn_stdout(result) {
589
+ return result.stdout ?? "";
590
+ }
591
+ function read_spawn_stderr(result) {
592
+ return result.stderr ?? "";
593
+ }
594
+
595
+ // scripts/git/git-spawn-sync.ts
596
+ import { execaSync } from "execa";
597
+
598
+ // scripts/git/git-location-environment.ts
599
+ var GIT_LOCATION_VARIABLES = [
600
+ "GIT_ALTERNATE_OBJECT_DIRECTORIES",
601
+ "GIT_COMMON_DIR",
602
+ "GIT_DIR",
603
+ "GIT_INDEX_FILE",
604
+ "GIT_NAMESPACE",
605
+ "GIT_OBJECT_DIRECTORY",
606
+ "GIT_WORK_TREE"
607
+ ];
608
+ function location_free_environment() {
609
+ return Object.fromEntries(GIT_LOCATION_VARIABLES.map((name) => [name, void 0]));
610
+ }
611
+ function forget(name) {
612
+ Reflect.deleteProperty(process.env, name);
613
+ }
614
+ function restore_one(name, value) {
615
+ if (value === void 0) forget(name);
616
+ else process.env[name] = value;
617
+ }
618
+ function clear_git_location_variables() {
619
+ const previous = GIT_LOCATION_VARIABLES.map((name) => [name, process.env[name]]);
620
+ for (const [name] of previous) forget(name);
621
+ return () => {
622
+ for (const [name, value] of previous) restore_one(name, value);
623
+ };
624
+ }
625
+ var git_location_environment = { clear_git_location_variables, location_free_environment };
626
+
627
+ // scripts/git/git-spawn-sync.ts
628
+ var SUCCESS_EXIT_CODE = 0;
629
+ var C_LOCALE = { LC_ALL: "C", LANGUAGE: "C" };
630
+ function run2(args, options = {}) {
631
+ const result = execaSync(git_utilities.get_git_command_for_spawn(), args, {
632
+ ...options,
633
+ extendEnv: true,
634
+ reject: false,
635
+ timeout: options.timeout ?? GIT_TIMEOUT_MS
636
+ });
637
+ return {
638
+ exit_code: result.exitCode,
639
+ stdout: read_spawn_stdout(result),
640
+ stderr: read_spawn_stderr(result)
641
+ };
642
+ }
643
+ function read2(args, options = {}) {
644
+ const result = run2(args, options);
645
+ return result.exit_code === SUCCESS_EXIT_CODE ? result.stdout.trim() : void 0;
646
+ }
647
+ function origin_url(cwd) {
648
+ return read2(["config", "--get", "remote.origin.url"], {
649
+ cwd,
650
+ env: git_location_environment.location_free_environment()
651
+ });
652
+ }
653
+ function toplevel(timeout = GIT_TIMEOUT_MS) {
654
+ return run2(["rev-parse", "--show-toplevel"], { env: C_LOCALE, timeout });
655
+ }
656
+ var git_spawn_sync = { GIT_TIMEOUT_MS, C_LOCALE, run: run2, read: read2, origin_url, toplevel };
657
+
658
+ // scripts/git/git-command.ts
659
+ async function branch() {
660
+ return await git_spawn.read(["rev-parse", "--abbrev-ref", "HEAD"]);
661
+ }
662
+ async function status(directory) {
663
+ const location = directory === void 0 ? [] : ["-C", directory];
664
+ return await git_spawn.read([...location, "status", PORCELAIN_FLAG, UNTRACKED_FILES_FLAG]);
665
+ }
666
+ async function repository_root() {
667
+ const result = git_spawn_sync.toplevel();
668
+ if (result.exit_code !== 0) throw create_spawn_error("rev-parse", result.exit_code);
669
+ return result.stdout.trim();
670
+ }
671
+ async function head_commit() {
672
+ return await git_spawn.read(["rev-parse", "HEAD"]);
673
+ }
674
+ var GIT_DIRECTORY_ARGUMENTS = [
675
+ "rev-parse",
676
+ "--absolute-git-dir",
677
+ "--path-format=absolute",
678
+ "--git-common-dir"
679
+ ];
680
+ async function git_directories() {
681
+ const output = await git_spawn.read([...GIT_DIRECTORY_ARGUMENTS]);
682
+ return output.split("\n").filter((line) => line !== "");
683
+ }
684
+ async function diff_cached(file_path) {
685
+ return await git_spawn.read(["diff", "--cached", file_path]);
686
+ }
687
+ async function fetch_branch(branch_name) {
688
+ const refspec = `+refs/heads/${branch_name}:refs/remotes/origin/${branch_name}`;
689
+ return await git_spawn.read_remote(["fetch", "origin", refspec]);
690
+ }
691
+ async function merge_fast_forward(branch_name) {
692
+ return await git_spawn.read(["merge", "--ff-only", `origin/${branch_name}`], SUITE_TIMEOUT_MS);
693
+ }
694
+ async function fast_forward_local(branch_name) {
695
+ return await git_spawn.read_remote(["fetch", "origin", `${branch_name}:${branch_name}`]);
696
+ }
697
+ async function merge_branch(branch_name, message) {
698
+ const message_arguments = message === void 0 ? [] : ["-m", message];
699
+ await git_spawn.with_output("merge", [...message_arguments, `origin/${branch_name}`], {
700
+ timeout_ms: SUITE_TIMEOUT_MS
701
+ });
702
+ }
703
+ async function checkout_b(branch_name) {
704
+ return await git_spawn.read(["checkout", "-b", branch_name], SUITE_TIMEOUT_MS);
705
+ }
706
+ async function checkout(branch_name) {
707
+ return await git_spawn.read(["checkout", branch_name], SUITE_TIMEOUT_MS);
708
+ }
709
+ async function commit(message) {
710
+ await git_spawn.with_output("commit", ["-m", message], { timeout_ms: SUITE_TIMEOUT_MS });
711
+ }
712
+ async function delete_branch(branch_name) {
713
+ await git_spawn.read(["branch", "-d", branch_name]);
714
+ }
715
+ async function read_commit_count(revisions) {
716
+ const output = await git_spawn.read(["rev-list", "--count", ...revisions]);
717
+ const parsed = Number(output);
718
+ if (output.length > 0 && Number.isFinite(parsed)) return parsed;
719
+ throw new Error(
720
+ `\`git rev-list --count ${revisions.join(" ")}\` printed \`${output}\` rather than a count`
721
+ );
722
+ }
723
+ async function commit_count_beyond(base, tip) {
724
+ return await read_commit_count([`${base}..${tip}`]);
725
+ }
726
+ async function commit_count_unpushed(branch_name) {
727
+ return await read_commit_count([branch_name, "--not", "--remotes"]);
728
+ }
729
+ function is_exit_code_128(cause) {
730
+ return typeof cause === "object" && cause !== null && "exit_code" in cause && cause.exit_code === "128";
731
+ }
732
+ function is_upstream_not_set_error(error) {
733
+ if (!(error instanceof Error)) return false;
734
+ const { cause } = error;
735
+ return cause !== void 0 && is_exit_code_128(cause);
736
+ }
737
+ var NO_VERIFY_FLAG = "--no-verify";
738
+ async function push_with_upstream(branch_name, verify_flags) {
739
+ await git_push_transport.push([...verify_flags, "--set-upstream", "origin", branch_name]);
740
+ }
741
+ async function push2() {
742
+ const verify_flags = await git_pre_push_hook.run() ? [NO_VERIFY_FLAG] : [];
743
+ try {
744
+ await git_push_transport.push([...verify_flags]);
745
+ } catch (error) {
746
+ if (is_upstream_not_set_error(error)) {
747
+ const current_branch = await branch();
748
+ await push_with_upstream(current_branch, verify_flags);
749
+ return;
750
+ }
751
+ throw error;
752
+ }
753
+ }
754
+ async function pull_fast_forward() {
755
+ await git_spawn.with_output_remote("pull", ["--ff-only"]);
756
+ }
757
+ var SHORT_NAME_FORMAT = "--format=%(refname:short)";
758
+ var REMOTES_FLAG = "--remotes";
759
+ async function list_branches(flags, pattern) {
760
+ try {
761
+ const output = await git_spawn.read([
762
+ "branch",
763
+ "--list",
764
+ SHORT_NAME_FORMAT,
765
+ ...flags,
766
+ pattern
767
+ ]);
768
+ return output.split("\n").filter((line) => line.trim() !== "");
769
+ } catch {
770
+ return [];
771
+ }
772
+ }
773
+ async function branch_names(pattern) {
774
+ return await list_branches([], pattern);
775
+ }
776
+ async function branch_names_remote(pattern) {
777
+ return await list_branches([REMOTES_FLAG], pattern);
778
+ }
779
+ async function branch_exists(branch_name) {
780
+ const names = await branch_names(branch_name);
781
+ return names.length > 0;
782
+ }
783
+ var ALL_PATHS_PATHSPEC = ":/";
784
+ function exclude_pathspec(file_path) {
785
+ return `:(exclude,top)${file_path}`;
786
+ }
787
+ async function add_tracked(excluded_paths) {
788
+ const exclusions = excluded_paths.map((file_path) => exclude_pathspec(file_path));
789
+ await git_spawn.read(["add", "-u", "--", ALL_PATHS_PATHSPEC, ...exclusions]);
790
+ }
791
+ async function add_path(file_path) {
792
+ await git_spawn.with_output("add", ["--", file_path]);
793
+ }
794
+ var FIRST_PARENT_FLAG = "--first-parent";
795
+ async function log_first_parent(limit, file_path, tip = "HEAD") {
796
+ const output = await git_spawn.read([
797
+ "log",
798
+ FIRST_PARENT_FLAG,
799
+ "--format=%H",
800
+ `-n`,
801
+ String(limit),
802
+ tip,
803
+ "--",
804
+ file_path
805
+ ]);
806
+ return output.split("\n").filter((line) => line.length > 0);
807
+ }
808
+ async function show_file(spec) {
809
+ return await git_spawn.read(["show", spec]);
810
+ }
811
+ var MERGE_COUNT_ARGUMENTS = [
812
+ "rev-list",
813
+ "--count",
814
+ "--merges",
815
+ FIRST_PARENT_FLAG
816
+ ];
817
+ function merge_count_arguments(range) {
818
+ return [...MERGE_COUNT_ARGUMENTS, range];
819
+ }
820
+ async function count_merges(range) {
821
+ const output = await git_spawn.read(merge_count_arguments(range));
822
+ const parsed = Number(output.trim());
823
+ return Number.isFinite(parsed) ? parsed : 0;
824
+ }
825
+ var git_command = {
826
+ GIT_DIRECTORY_ARGUMENTS,
827
+ branch,
828
+ status,
829
+ repository_root,
830
+ head_commit,
831
+ git_directories,
832
+ diff_cached,
833
+ // The default branch, the change base and every reading against it are `git-diff-reads.ts`'s,
834
+ // re-exported here so no call site, mock or spy moved with them.
835
+ ...git_diff_reads,
836
+ fetch_branch,
837
+ merge_fast_forward,
838
+ fast_forward_local,
839
+ merge_branch,
840
+ checkout_b,
841
+ checkout,
842
+ commit,
843
+ commit_count_beyond,
844
+ commit_count_unpushed,
845
+ delete_branch,
846
+ push: push2,
847
+ pull_fast_forward,
848
+ branch_exists,
849
+ branch_names,
850
+ branch_names_remote,
851
+ add_tracked,
852
+ add_path,
853
+ log_first_parent,
854
+ show_file,
855
+ count_merges,
856
+ merge_count_arguments,
857
+ is_upstream_not_set_error
858
+ };
859
+
860
+ // scripts/git/git-common-directory.ts
861
+ import { execFileSync } from "node:child_process";
862
+ var STATE_DIRECTORY = "josh";
863
+ var OWN_GIT_DIRECTORY = 0;
864
+ var COMMON_GIT_DIRECTORY = 1;
865
+ var PROBE_TIMEOUT_MS2 = 5e3;
866
+ var answers = /* @__PURE__ */ new Map();
867
+ function probe_environment(cwd) {
868
+ if (cwd === void 0) return process.env;
869
+ return { ...process.env, ...git_location_environment.location_free_environment() };
870
+ }
871
+ function cache_key(cwd) {
872
+ if (cwd !== void 0) return `explicit\0${cwd}`;
873
+ const locations = GIT_LOCATION_VARIABLES.map((name) => process.env[name] ?? "");
874
+ return ["inherited", process.cwd(), ...locations].join("\0");
875
+ }
876
+ function read_directories(cwd) {
877
+ try {
878
+ const output = execFileSync(
879
+ git_utilities.get_git_command_for_spawn(),
880
+ [...git_command.GIT_DIRECTORY_ARGUMENTS],
881
+ {
882
+ cwd,
883
+ env: probe_environment(cwd),
884
+ encoding: "utf8",
885
+ stdio: ["ignore", "pipe", "ignore"],
886
+ timeout: PROBE_TIMEOUT_MS2
887
+ }
888
+ );
889
+ return output.split("\n").filter((line) => line !== "");
890
+ } catch {
891
+ return [];
892
+ }
893
+ }
894
+ function directories(cwd) {
895
+ const key = cache_key(cwd);
896
+ const known = answers.get(key);
897
+ if (known !== void 0) return known;
898
+ const read3 = read_directories(cwd);
899
+ if (read3.length > 0) answers.set(key, read3);
900
+ return read3;
901
+ }
902
+ function own(cwd) {
903
+ return directories(cwd)[OWN_GIT_DIRECTORY];
904
+ }
905
+ function repository(cwd) {
906
+ return directories(cwd)[COMMON_GIT_DIRECTORY];
907
+ }
908
+ function select_linked(found) {
909
+ const own_directory = found[OWN_GIT_DIRECTORY];
910
+ const common = found[COMMON_GIT_DIRECTORY];
911
+ return own_directory === void 0 || common === void 0 || own_directory === common ? void 0 : common;
912
+ }
913
+ function resolve(cwd) {
914
+ return select_linked(directories(cwd));
915
+ }
916
+ var git_common_directory = {
917
+ STATE_DIRECTORY,
918
+ directories,
919
+ own,
920
+ repository,
921
+ resolve,
922
+ select_linked
923
+ };
924
+
925
+ // scripts/discovery/repo-origin.ts
926
+ var GITHUB_HOST = "github.com";
927
+ var SSH_ALIAS_PATTERN = /^github(?:-\w+)*$/u;
928
+ var GIT_SUFFIX = ".git";
929
+ var PATH_SEPARATOR = "/";
930
+ var USER_SEPARATOR = "@";
931
+ var HOST_SEPARATOR = ":";
932
+ var OWNER_INDEX = 0;
933
+ var REPO_INDEX = 1;
934
+ var REPO_PATH_SEGMENTS = 2;
935
+ var NOT_FOUND = -1;
936
+ var SECTION_PREFIX = "[";
937
+ var ORIGIN_SECTION = /^\[remote\s+"origin"\]$/u;
938
+ var REMOTE_SECTION = /^\[remote\s+"[^"]+"\]$/u;
939
+ var URL_KEY = "url";
940
+ function is_github_hostname(host) {
941
+ return host.toLowerCase() === GITHUB_HOST;
942
+ }
943
+ function is_github_ssh_host(host) {
944
+ const normalized = host.toLowerCase();
945
+ return is_github_hostname(normalized) || SSH_ALIAS_PATTERN.test(normalized);
946
+ }
947
+ function strip_git_suffix(name) {
948
+ return name.endsWith(GIT_SUFFIX) ? name.slice(0, -GIT_SUFFIX.length) : name;
949
+ }
950
+ function to_identity(repository_path) {
951
+ const segments = repository_path.split(PATH_SEPARATOR).filter((segment) => segment !== "");
952
+ if (segments.length !== REPO_PATH_SEGMENTS) return void 0;
953
+ const owner = segments[OWNER_INDEX] ?? "";
954
+ const repo = strip_git_suffix(segments[REPO_INDEX] ?? "");
955
+ return repo === "" ? void 0 : { owner, repo };
956
+ }
957
+ function parse_scp_like(url) {
958
+ const user_end = url.indexOf(USER_SEPARATOR);
959
+ const authority = user_end === NOT_FOUND ? url : url.slice(user_end + 1);
960
+ const host_end = authority.indexOf(HOST_SEPARATOR);
961
+ if (host_end === NOT_FOUND || !is_github_ssh_host(authority.slice(0, host_end))) return void 0;
962
+ return to_identity(authority.slice(host_end + 1));
963
+ }
964
+ function parse_url_like(url) {
965
+ try {
966
+ const parsed = new URL(url);
967
+ return is_github_hostname(parsed.hostname) ? to_identity(parsed.pathname) : void 0;
968
+ } catch {
969
+ return void 0;
970
+ }
971
+ }
972
+ function parse_origin_url(url) {
973
+ const trimmed = url.trim();
974
+ if (trimmed === "") return void 0;
975
+ return parse_url_like(trimmed) ?? parse_scp_like(trimmed);
976
+ }
977
+ function is_section_header(line) {
978
+ return line.startsWith(SECTION_PREFIX);
979
+ }
980
+ function origin_section_lines(lines) {
981
+ const start = lines.findIndex((line) => ORIGIN_SECTION.test(line));
982
+ if (start === NOT_FOUND) return [];
983
+ const rest = lines.slice(start + 1);
984
+ const end = rest.findIndex((line) => is_section_header(line));
985
+ return end === NOT_FOUND ? rest : rest.slice(0, end);
986
+ }
987
+ function url_value(line) {
988
+ const separator = line.indexOf("=");
989
+ if (separator === NOT_FOUND || line.slice(0, separator).trim() !== URL_KEY) return void 0;
990
+ return line.slice(separator + 1).trim();
991
+ }
992
+ function parse_origin_from_config(content) {
993
+ const lines = content.split("\n").map((line) => line.trim());
994
+ return origin_section_lines(lines).map((line) => url_value(line)).find((url) => url !== void 0);
995
+ }
996
+ function section_groups(lines) {
997
+ const groups = [];
998
+ for (const line of lines) {
999
+ if (is_section_header(line)) groups.push([line]);
1000
+ else groups.at(-1)?.push(line);
1001
+ }
1002
+ return groups;
1003
+ }
1004
+ function parse_remote_urls_from_config(content) {
1005
+ const lines = content.split("\n").map((line) => line.trim());
1006
+ return section_groups(lines).filter((group) => REMOTE_SECTION.test(group[0] ?? "")).flatMap((group) => group.map((line) => url_value(line))).filter((url) => url !== void 0);
1007
+ }
1008
+ function format_identity(identity) {
1009
+ return `${identity.owner}${PATH_SEPARATOR}${identity.repo}`.toLowerCase();
1010
+ }
1011
+ var repo_origin = {
1012
+ GITHUB_HOST,
1013
+ is_github_hostname,
1014
+ is_github_ssh_host,
1015
+ parse_origin_from_config,
1016
+ parse_origin_url,
1017
+ parse_remote_urls_from_config,
1018
+ format_identity
1019
+ };
1020
+
1021
+ // scripts/discovery/repo-discovery.ts
1022
+ import { existsSync, readdirSync, readFileSync as readFileSync2, statSync } from "node:fs";
1023
+ import path5 from "node:path";
1024
+
1025
+ // scripts/lib/stamped-memo.ts
1026
+ import { lstatSync as lstatSync2 } from "node:fs";
1027
+ var NO_STAMP = "";
1028
+ var STAMP_SEPARATOR = ":";
1029
+ function create() {
1030
+ const answers2 = /* @__PURE__ */ new Map();
1031
+ return {
1032
+ of(key, stamp, compute) {
1033
+ const known = answers2.get(key);
1034
+ if (known?.stamp === stamp) return known.value;
1035
+ const value = compute();
1036
+ answers2.set(key, { stamp, value });
1037
+ return value;
1038
+ },
1039
+ keep(keys) {
1040
+ for (const key of answers2.keys()) if (!keys.has(key)) answers2.delete(key);
1041
+ }
1042
+ };
1043
+ }
1044
+ function file_stamp(file) {
1045
+ try {
1046
+ const status2 = lstatSync2(file);
1047
+ return [status2.ino, status2.mtimeMs, status2.ctimeMs, status2.size].join(STAMP_SEPARATOR);
1048
+ } catch {
1049
+ return NO_STAMP;
1050
+ }
1051
+ }
1052
+ var stamped_memo = { NO_STAMP, create, file_stamp };
1053
+
1054
+ // scripts/discovery/repo-map-logic.ts
1055
+ var OVERRIDE_ENTRY_SEPARATOR = ",";
1056
+ var OVERRIDE_PAIR_SEPARATOR = "=";
1057
+ var OVERRIDE_PAIR_PARTS = 2;
1058
+ var KEY_INDEX = 0;
1059
+ var PATH_INDEX = 1;
1060
+ function is_same_owner(identity, current_owner) {
1061
+ return identity.owner.toLowerCase() === current_owner.toLowerCase();
1062
+ }
1063
+ function add_entry(target, origin_url2, repository_path, current_owner) {
1064
+ if (origin_url2 === void 0) return;
1065
+ const identity = repo_origin.parse_origin_url(origin_url2);
1066
+ if (identity === void 0 || !is_same_owner(identity, current_owner)) return;
1067
+ target.set(repo_origin.format_identity(identity), repository_path);
1068
+ }
1069
+ function parse_override_entry(entry) {
1070
+ const parts = entry.split(OVERRIDE_PAIR_SEPARATOR).map((part) => part.trim());
1071
+ if (parts.length !== OVERRIDE_PAIR_PARTS) return void 0;
1072
+ const key = parts[KEY_INDEX] ?? "";
1073
+ const repository_path = parts[PATH_INDEX] ?? "";
1074
+ if (repository_path === "") return void 0;
1075
+ return { path: repository_path, origin_url: `https://${repo_origin.GITHUB_HOST}/${key}` };
1076
+ }
1077
+ function parse_overrides(raw) {
1078
+ if (raw === void 0) return [];
1079
+ return raw.split(OVERRIDE_ENTRY_SEPARATOR).map((entry) => parse_override_entry(entry)).filter((entry) => entry !== void 0);
1080
+ }
1081
+ function build_repository_map(discovered, current_owner, override_value) {
1082
+ const result = /* @__PURE__ */ new Map();
1083
+ for (const entry of discovered) add_entry(result, entry.origin_url, entry.path, current_owner);
1084
+ for (const entry of parse_overrides(override_value)) {
1085
+ add_entry(result, entry.origin_url, entry.path, current_owner);
1086
+ }
1087
+ return result;
1088
+ }
1089
+ var repo_map_logic = {
1090
+ is_same_owner,
1091
+ build_repository_map
1092
+ };
1093
+
1094
+ // scripts/discovery/repo-discovery.ts
1095
+ var GIT_DIRECTORY = ".git";
1096
+ var GIT_CONFIG = "config";
1097
+ var GITDIR_PREFIX = "gitdir:";
1098
+ var COMMON_DIRECTORY_FILE = "commondir";
1099
+ var OVERRIDE_ENV_KEY = "JOSH_REPO_PATHS";
1100
+ function resolve_common_directory(git_directory) {
1101
+ const pointer = path5.join(git_directory, COMMON_DIRECTORY_FILE);
1102
+ if (!existsSync(pointer)) return git_directory;
1103
+ try {
1104
+ return path5.resolve(git_directory, readFileSync2(pointer, "utf8").trim());
1105
+ } catch {
1106
+ return git_directory;
1107
+ }
1108
+ }
1109
+ function follow_git_file(repository_path, git_file) {
1110
+ const pointer = readFileSync2(git_file, "utf8").trim();
1111
+ if (!pointer.startsWith(GITDIR_PREFIX)) return void 0;
1112
+ return path5.resolve(repository_path, pointer.slice(GITDIR_PREFIX.length).trim());
1113
+ }
1114
+ function resolve_git_directory(repository_path) {
1115
+ const candidate = path5.join(repository_path, GIT_DIRECTORY);
1116
+ if (!existsSync(candidate)) return void 0;
1117
+ try {
1118
+ if (statSync(candidate).isDirectory()) return candidate;
1119
+ const linked = follow_git_file(repository_path, candidate);
1120
+ return linked === void 0 ? void 0 : resolve_common_directory(linked);
1121
+ } catch {
1122
+ return void 0;
1123
+ }
1124
+ }
1125
+ function read_text(file) {
1126
+ try {
1127
+ return readFileSync2(file, "utf8");
1128
+ } catch {
1129
+ return void 0;
1130
+ }
1131
+ }
1132
+ var git_directories2 = stamped_memo.create();
1133
+ var configs = stamped_memo.create();
1134
+ function read_config(repository_path) {
1135
+ const git_entry = path5.join(repository_path, GIT_DIRECTORY);
1136
+ const git_directory = git_directories2.of(
1137
+ repository_path,
1138
+ stamped_memo.file_stamp(git_entry),
1139
+ () => resolve_git_directory(repository_path)
1140
+ );
1141
+ if (git_directory === void 0) return void 0;
1142
+ const config = path5.join(git_directory, GIT_CONFIG);
1143
+ return configs.of(config, stamped_memo.file_stamp(config), () => read_text(config));
1144
+ }
1145
+ function read_origin_url(repository_path) {
1146
+ const config = read_config(repository_path);
1147
+ return config === void 0 ? void 0 : repo_origin.parse_origin_from_config(config);
1148
+ }
1149
+ function read_remote_urls(repository_path) {
1150
+ const config = read_config(repository_path);
1151
+ return config === void 0 ? [] : repo_origin.parse_remote_urls_from_config(config);
1152
+ }
1153
+ function sibling_directories(parent) {
1154
+ try {
1155
+ return readdirSync(parent, { withFileTypes: true }).filter((entry) => entry.isDirectory()).map((entry) => path5.join(parent, entry.name)).toSorted((left, right) => left.localeCompare(right));
1156
+ } catch {
1157
+ return [];
1158
+ }
1159
+ }
1160
+ function scan_siblings(parent) {
1161
+ return sibling_directories(parent).map((repository_path) => ({
1162
+ path: repository_path,
1163
+ origin_url: read_origin_url(repository_path)
1164
+ }));
1165
+ }
1166
+ function resolve_current_owner(repository_path) {
1167
+ const origin_url2 = read_origin_url(repository_path);
1168
+ if (origin_url2 === void 0) return void 0;
1169
+ return repo_origin.parse_origin_url(origin_url2)?.owner;
1170
+ }
1171
+ function main_worktree(repository_path) {
1172
+ const git_directory = resolve_git_directory(repository_path);
1173
+ if (git_directory === void 0 || path5.basename(git_directory) !== GIT_DIRECTORY) {
1174
+ return repository_path;
1175
+ }
1176
+ return path5.dirname(git_directory);
1177
+ }
1178
+ function discover_repositories(repository_path, environment = process.env) {
1179
+ const main = main_worktree(repository_path);
1180
+ const current_owner = resolve_current_owner(main);
1181
+ if (current_owner === void 0) return /* @__PURE__ */ new Map();
1182
+ return repo_map_logic.build_repository_map(
1183
+ scan_siblings(path5.dirname(main)),
1184
+ current_owner,
1185
+ environment[OVERRIDE_ENV_KEY]
1186
+ );
1187
+ }
1188
+ var repo_discovery = {
1189
+ OVERRIDE_ENV_KEY,
1190
+ main_worktree,
1191
+ read_origin_url,
1192
+ read_remote_urls,
1193
+ resolve_current_owner,
1194
+ scan_siblings,
1195
+ discover_repositories
1196
+ };
1197
+
1198
+ // scripts/lib/error-message.ts
1199
+ function message_of(error) {
1200
+ return error instanceof Error ? error.message : String(error);
1201
+ }
1202
+ var DEBUG_ENV_KEY = "JOSH_DEBUG";
1203
+ function trace_swallowed(where, error) {
1204
+ if ((process.env[DEBUG_ENV_KEY] ?? "").trim() === "") return;
1205
+ process.stderr.write(`josh debug: ${where}: ${message_of(error)}
1206
+ `);
1207
+ }
1208
+ var error_text = { message_of, trace_swallowed };
1209
+
1210
+ export {
1211
+ PACKAGE_DIR,
1212
+ PROJECT_ROOT,
1213
+ package_path,
1214
+ PLATFORM_TEMP_ROOT,
1215
+ platform_temporary,
1216
+ atomic_write,
1217
+ stamp_file,
1218
+ MS_PER_SECOND,
1219
+ MS_PER_MINUTE,
1220
+ PROBE_TIMEOUT_MS,
1221
+ FETCH_TIMEOUT_MS,
1222
+ HOOK_PROCESS_TIMEOUT_MS,
1223
+ GH_API_TIMEOUT_MS,
1224
+ COMMAND_TIMEOUT_MS,
1225
+ INSTALL_TIMEOUT_MS,
1226
+ SUITE_TIMEOUT_MS,
1227
+ PORCELAIN_FLAG,
1228
+ UNTRACKED_FILES_FLAG,
1229
+ get_exit_code,
1230
+ has_timed_out,
1231
+ git_spawn,
1232
+ git_diff_reads,
1233
+ GIT_LOCATION_VARIABLES,
1234
+ git_location_environment,
1235
+ git_spawn_sync,
1236
+ git_command,
1237
+ git_common_directory,
1238
+ stamped_memo,
1239
+ repo_origin,
1240
+ repo_map_logic,
1241
+ repo_discovery,
1242
+ error_text
1243
+ };