@joshuafolkken/kit 1.1455.0 → 1.1514.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 (374) hide show
  1. package/.claude/settings.json +6 -6
  2. package/.claude/skills/dependency-update/SKILL.md +26 -55
  3. package/.claude/skills/epic-commands/SKILL.md +83 -156
  4. package/.claude/skills/epic-commands/epic-bundle.md +51 -79
  5. package/.claude/skills/epic-commands/execution-waves.md +43 -81
  6. package/.claude/skills/verify-ui/SKILL.md +24 -50
  7. package/.claude/skills/workflow-commands/SKILL.md +7 -9
  8. package/.claude/skills/workflow-commands/background-commands.md +31 -46
  9. package/.claude/skills/workflow-commands/backlogrun-child.md +65 -85
  10. package/.claude/skills/workflow-commands/backlogrun-lanes.md +86 -125
  11. package/.claude/skills/workflow-commands/backlogrun-park.md +68 -118
  12. package/.claude/skills/workflow-commands/backlogrun-progress.md +17 -28
  13. package/.claude/skills/workflow-commands/backlogrun-recovery.md +17 -26
  14. package/.claude/skills/workflow-commands/backlogrun-steps.md +35 -52
  15. package/.claude/skills/workflow-commands/backlogrun.md +31 -50
  16. package/.claude/skills/workflow-commands/chain-rule.md +31 -40
  17. package/.claude/skills/workflow-commands/delegation.md +12 -8
  18. package/.claude/skills/workflow-commands/entry-sequence.md +1 -3
  19. package/.claude/skills/workflow-commands/followup.md +55 -77
  20. package/.claude/skills/workflow-commands/fullrun-steps.md +3 -5
  21. package/.claude/skills/workflow-commands/fullrun.md +4 -6
  22. package/.claude/skills/workflow-commands/halfrun.md +3 -7
  23. package/.claude/skills/workflow-commands/into-target.md +1 -2
  24. package/.claude/skills/workflow-commands/issue-comments.md +43 -60
  25. package/.claude/skills/workflow-commands/issue-scout.md +3 -2
  26. package/.claude/skills/workflow-commands/kickoff.md +65 -74
  27. package/.claude/skills/workflow-commands/latest-gate.md +2 -6
  28. package/.claude/skills/workflow-commands/needs-human-review.md +2 -5
  29. package/.claude/skills/workflow-commands/observation-filing.md +59 -118
  30. package/.claude/skills/workflow-commands/observation-ledger.md +52 -112
  31. package/.claude/skills/workflow-commands/pre-gate-cut.md +88 -142
  32. package/.claude/skills/workflow-commands/prerequisite.md +11 -17
  33. package/.claude/skills/workflow-commands/progress-watcher.md +23 -33
  34. package/.claude/skills/workflow-commands/prrun.md +3 -5
  35. package/.claude/skills/workflow-commands/retrospective.md +35 -54
  36. package/.claude/skills/workflow-commands/split-assessment.md +32 -58
  37. package/.claude/skills/workflow-commands/target-repository.md +1 -2
  38. package/.claude/skills/workflow-commands/working-tree-hold.md +54 -73
  39. package/.codex/hooks.json +6 -6
  40. package/.github/actions/setup-node/action.yml +1 -1
  41. package/.github/workflows/ci.yml +1 -1
  42. package/.github/workflows/publish.yml +2 -2
  43. package/CLAUDE.md +7 -6
  44. package/cspell/index.yaml +7 -0
  45. package/dist/CLAUDE.md +7 -6
  46. package/dist/commands/document-section-cli.js +67 -34
  47. package/dist/hooks/batch-guard.js +6 -6
  48. package/dist/hooks/chunk-4KKD2UTK.js +66 -0
  49. package/dist/hooks/{chunk-GPLGZ6IC.js → chunk-6TS2JD6D.js} +14 -3
  50. package/dist/hooks/chunk-7DSBJVFH.js +50 -0
  51. package/dist/hooks/{chunk-5H4SSDSD.js → chunk-A65Y4YOR.js} +3 -3
  52. package/dist/hooks/{chunk-3C4XRYG6.js → chunk-APUO6U4J.js} +102 -19
  53. package/dist/hooks/{chunk-IX6TTTI6.js → chunk-EFXE6C37.js} +8 -22
  54. package/dist/hooks/chunk-GP4IEC4O.js +20 -0
  55. package/dist/hooks/chunk-JP45SOCJ.js +56 -0
  56. package/dist/hooks/{chunk-OLMO72ON.js → chunk-LAOV7NLM.js} +1 -1
  57. package/dist/hooks/chunk-M4HGZV7U.js +83 -0
  58. package/dist/hooks/{chunk-TBJFTSUY.js → chunk-O6GDRNJB.js} +9 -7
  59. package/dist/hooks/{chunk-HFGWYGUV.js → chunk-PF2NZL2A.js} +5 -5
  60. package/dist/hooks/{chunk-WNLVGT7E.js → chunk-PTICX4OL.js} +4 -5
  61. package/dist/hooks/{chunk-HHI6FO3R.js → chunk-RT27QRJW.js} +763 -1515
  62. package/dist/hooks/{chunk-7WQBPLUN.js → chunk-SYOTDYCI.js} +1149 -1095
  63. package/dist/hooks/{chunk-LIAFCXL7.js → chunk-TNUMY6NL.js} +1519 -1332
  64. package/dist/hooks/chunk-UPUZF3AN.js +279 -0
  65. package/dist/hooks/{chunk-Z4XI7CZS.js → chunk-WK6SMBIC.js} +1932 -784
  66. package/dist/hooks/codex-hook-adapter.js +17 -14
  67. package/dist/hooks/duplicate-read-guard.js +7 -7
  68. package/dist/hooks/format-edited.js +5 -4
  69. package/dist/hooks/inputs.json +302 -247
  70. package/dist/hooks/investigation-guard.js +8 -11
  71. package/dist/hooks/pretool-guard.js +16 -13
  72. package/dist/hooks/session-lang.js +372 -26
  73. package/dist/hooks/stop-guard.js +2593 -189
  74. package/dist/josh.js +2128 -282
  75. package/dist/managed-marker/index.js +1 -2
  76. package/dist/version/index.js +15 -12
  77. package/eslint/base.js +2 -1
  78. package/eslint/rules/unicorn.js +16 -0
  79. package/lefthook/base.yml +5 -3
  80. package/package.json +14 -12
  81. package/prompts/coding-standards.md +12 -22
  82. package/prompts/collaboration-workflow/file-edits.md +25 -45
  83. package/prompts/collaboration-workflow/gh-rest.md +19 -36
  84. package/prompts/collaboration-workflow/glossary.md +5 -7
  85. package/prompts/collaboration-workflow/issue-citation.md +6 -14
  86. package/prompts/collaboration-workflow/issue-template.md +40 -32
  87. package/prompts/collaboration-workflow/lane-instructions.md +35 -0
  88. package/prompts/collaboration-workflow/operating-rules.md +33 -46
  89. package/prompts/collaboration-workflow/output-bounds.md +15 -15
  90. package/prompts/collaboration-workflow/overview.md +14 -19
  91. package/prompts/collaboration-workflow/plan-comment.md +13 -13
  92. package/prompts/collaboration-workflow/principles.md +57 -54
  93. package/prompts/collaboration-workflow/proposal-request.md +1 -9
  94. package/prompts/collaboration-workflow/report-format.md +41 -49
  95. package/prompts/collaboration-workflow/residency.md +15 -11
  96. package/prompts/collaboration-workflow/rule-delivery.md +7 -15
  97. package/prompts/collaboration-workflow/shell-body.md +10 -20
  98. package/prompts/collaboration-workflow/turn-batching.md +8 -14
  99. package/prompts/collaboration-workflow/upstream-interrupt.md +26 -34
  100. package/prompts/collaboration-workflow/wip-cap.md +26 -32
  101. package/prompts/collaboration-workflow.md +25 -25
  102. package/prompts/refactoring.md +33 -43
  103. package/prompts/review-rubric.md +84 -129
  104. package/prompts/review.md +110 -141
  105. package/prompts/sonar-hotspot-handling.md +22 -50
  106. package/prompts/testing-guide.md +48 -99
  107. package/scripts/adopt/adopt-toolkits.ts +2 -4
  108. package/scripts/agent/agent-argv.ts +20 -4
  109. package/scripts/agent/agent-exit-record.ts +23 -1
  110. package/scripts/agent/agent-role-profile.ts +101 -45
  111. package/scripts/agent/agent-safe-text.ts +60 -0
  112. package/scripts/agent/claude-agent-argv.ts +14 -0
  113. package/scripts/agent/codex-agent-argv.ts +9 -2
  114. package/scripts/agent/lane-instructions.ts +144 -0
  115. package/scripts/backlog/backlog-budget-cli.ts +1 -2
  116. package/scripts/backlog/backlog-budget.ts +4 -4
  117. package/scripts/backlog/backlog-drive-carried.ts +26 -0
  118. package/scripts/backlog/backlog-drive-cli.ts +10 -5
  119. package/scripts/backlog/backlog-drive-named.ts +3 -5
  120. package/scripts/backlog/backlog-drive-restore.ts +28 -2
  121. package/scripts/backlog/backlog-drive-seats.ts +27 -0
  122. package/scripts/backlog/backlog-drive.ts +11 -6
  123. package/scripts/backlog/backlog-occupied.ts +56 -0
  124. package/scripts/backlog/backlog-ready.ts +59 -15
  125. package/scripts/behavior/behavior-rules.ts +3 -2
  126. package/scripts/cost-runtime/codex-usage.ts +4 -2
  127. package/scripts/cost-runtime/cost-cli.ts +1 -2
  128. package/scripts/delegation/duplicate-read-guard.ts +2 -2
  129. package/scripts/delegation/investigation-guard.ts +15 -65
  130. package/scripts/delegation/investigation-reads.ts +1 -2
  131. package/scripts/discovery/repo-discovery.ts +4 -2
  132. package/scripts/discovery/repo-origin.ts +2 -4
  133. package/scripts/doctor/doctor-logic.ts +6 -3
  134. package/scripts/document/document-byte-budget.ts +28 -27
  135. package/scripts/document/document-byte-check.ts +1 -2
  136. package/scripts/document/document-section-cli.ts +17 -5
  137. package/scripts/document/entry-read-budget.ts +3 -3
  138. package/scripts/document/read-set-cli.ts +4 -1
  139. package/scripts/epic/epic-audit-orphans.ts +5 -8
  140. package/scripts/epic/epic-audit-rationale.ts +8 -2
  141. package/scripts/epic/epic-audit.ts +52 -1
  142. package/scripts/epic/epic-bundle-cli.ts +1 -2
  143. package/scripts/epic/epic-bundle-evidence.ts +49 -26
  144. package/scripts/epic/epic-bundle-referenced.ts +14 -3
  145. package/scripts/epic/epic-bundle.ts +17 -9
  146. package/scripts/epic/epic-chains.ts +6 -2
  147. package/scripts/epic/epic-close-comment.ts +1 -2
  148. package/scripts/followup/git-followup-workflow.ts +19 -1
  149. package/scripts/gate/check-inputs.ts +129 -0
  150. package/scripts/gate/check-reuse.ts +162 -0
  151. package/scripts/gate/core-budget.ts +93 -44
  152. package/scripts/gate/core-wait.ts +130 -0
  153. package/scripts/gate/free-cores.ts +49 -0
  154. package/scripts/gate/gate-ledger.ts +17 -3
  155. package/scripts/gate/gate-plan.ts +23 -1
  156. package/scripts/gate/gate-report.ts +15 -2
  157. package/scripts/gate/gate-run-steps.ts +150 -0
  158. package/scripts/gate/held-mark.ts +55 -0
  159. package/scripts/gate/machine-capacity.ts +70 -11
  160. package/scripts/gate/pre-commit-type-check.ts +14 -1
  161. package/scripts/gate/verification-gate.ts +65 -127
  162. package/scripts/gh/git-gh-issue-rest.ts +1 -0
  163. package/scripts/gh/git-gh-issue-write.ts +24 -2
  164. package/scripts/gh/git-pr.ts +19 -3
  165. package/scripts/git/git-common-directory.ts +3 -3
  166. package/scripts/git/git-diff-reads.ts +16 -9
  167. package/scripts/git/git-execa-error.ts +1 -2
  168. package/scripts/git/main-merge-regenerate.ts +78 -0
  169. package/scripts/git/main-merge.ts +14 -5
  170. package/scripts/hooks/batch-guard.ts +5 -8
  171. package/scripts/hooks/format-edited-file.ts +10 -4
  172. package/scripts/hooks/pre-commit-lint.ts +91 -0
  173. package/scripts/hooks/pre-push-unit.ts +15 -4
  174. package/scripts/hooks/pretool-guard.ts +48 -79
  175. package/scripts/hooks/reserved-run.ts +1 -0
  176. package/scripts/hooks/run-hook.sh +10 -12
  177. package/scripts/hooks/step-zero-notice.ts +3 -2
  178. package/scripts/hooks/stop-actions.ts +204 -0
  179. package/scripts/hooks/stop-guard.ts +62 -21
  180. package/scripts/init/hook-command-rewrite.ts +6 -2
  181. package/scripts/init/hook-launch.ts +12 -7
  182. package/scripts/init/init-logic-deploy-vps.ts +4 -2
  183. package/scripts/issue/behavior-change-lint.ts +12 -6
  184. package/scripts/issue/expected-effect-lint.ts +59 -0
  185. package/scripts/issue/issue-cite-cli.ts +35 -15
  186. package/scripts/issue/issue-classification.ts +1 -1
  187. package/scripts/issue/issue-lint-cli.ts +5 -3
  188. package/scripts/issue/issue-scout-cli.ts +22 -16
  189. package/scripts/issue/markdown-section.ts +19 -5
  190. package/scripts/josh/command-usage.ts +110 -0
  191. package/scripts/josh/file-map-stamp.ts +1 -3
  192. package/scripts/josh/hook-decision.ts +17 -2
  193. package/scripts/josh/josh-command-map.ts +2 -0
  194. package/scripts/josh/josh-command-types.ts +55 -9
  195. package/scripts/josh/josh-commands-ai.ts +13 -0
  196. package/scripts/josh/josh-commands-development.ts +1 -1
  197. package/scripts/josh/josh-commands-hooks.ts +6 -0
  198. package/scripts/josh/josh-commands-lane.ts +10 -1
  199. package/scripts/josh/josh-commands-workflow.ts +5 -0
  200. package/scripts/josh/josh-logic.ts +6 -15
  201. package/scripts/josh/josh-usage-automation.ts +121 -0
  202. package/scripts/josh/josh-usage-backlog.ts +180 -0
  203. package/scripts/josh/josh-usage-developer.ts +230 -0
  204. package/scripts/josh/josh-usage-hooks.ts +38 -0
  205. package/scripts/josh/josh-usage-issue.ts +205 -0
  206. package/scripts/josh/josh-usage-review.ts +101 -0
  207. package/scripts/josh/josh-usage-run.ts +252 -0
  208. package/scripts/josh/josh-usage-session.ts +238 -0
  209. package/scripts/josh/josh-usage-workflow.ts +212 -0
  210. package/scripts/josh/josh.ts +14 -5
  211. package/scripts/josh/package-directory.ts +20 -0
  212. package/scripts/lane/lane-await.ts +3 -2
  213. package/scripts/lane/lane-capacity.ts +8 -2
  214. package/scripts/lane/lane-check-stats.ts +56 -0
  215. package/scripts/lane/lane-child-invocation.ts +49 -5
  216. package/scripts/lane/lane-dispatch.ts +3 -3
  217. package/scripts/lane/lane-guard-policy.ts +5 -5
  218. package/scripts/lane/lane-handoff.ts +8 -1
  219. package/scripts/lane/lane-install.ts +12 -4
  220. package/scripts/lane/lane-ledger.ts +52 -1
  221. package/scripts/lane/lane-limit-cli.ts +8 -9
  222. package/scripts/lane/lane-load.ts +9 -2
  223. package/scripts/lane/lane-measure-cli.ts +4 -0
  224. package/scripts/lane/lane-parked.ts +18 -0
  225. package/scripts/lane/lane-preserve.ts +29 -1
  226. package/scripts/lane/lane-process-load.ts +125 -0
  227. package/scripts/lane/lane-process-stats.ts +93 -0
  228. package/scripts/lane/lane-registry.ts +17 -10
  229. package/scripts/lane/lane-restart.ts +5 -26
  230. package/scripts/lane/lane-session-action.ts +146 -0
  231. package/scripts/lane/lane-session-broker.ts +68 -125
  232. package/scripts/lane/lane-spent.ts +14 -3
  233. package/scripts/lane/lane-stats.ts +1 -0
  234. package/scripts/lane/lane-withdraw-cli.ts +71 -0
  235. package/scripts/lane/lane-withdraw.ts +182 -0
  236. package/scripts/lint/format.ts +4 -4
  237. package/scripts/lint/lint-parallel.ts +10 -3
  238. package/scripts/lint/lint-related-scope.ts +4 -1
  239. package/scripts/managed-marker/managed-marker-logic.ts +1 -2
  240. package/scripts/notify/telegram-test.ts +10 -5
  241. package/scripts/overrides/lockfile-overrides.ts +1 -3
  242. package/scripts/propagate/propagate.ts +1 -2
  243. package/scripts/release/release-progress.ts +3 -2
  244. package/scripts/report/report-format-reference.ts +2 -0
  245. package/scripts/report/report-lint.ts +7 -4
  246. package/scripts/review/acceptance-map-check.ts +61 -0
  247. package/scripts/review/acceptance-map.ts +205 -0
  248. package/scripts/review/review-brief-cli.ts +1 -1
  249. package/scripts/review/review-record-cli.ts +6 -2
  250. package/scripts/rules/agent-model.ts +59 -0
  251. package/scripts/rules/delivered-rules.ts +11 -2
  252. package/scripts/rules/destructive-command.ts +6 -9
  253. package/scripts/rules/direct-filing.ts +3 -7
  254. package/scripts/rules/early-heartbeat.ts +7 -18
  255. package/scripts/rules/file-body.ts +6 -13
  256. package/scripts/rules/filing-cap.ts +4 -6
  257. package/scripts/rules/firing-point.ts +6 -5
  258. package/scripts/rules/git-force.ts +5 -9
  259. package/scripts/rules/guard-remedy.ts +117 -0
  260. package/scripts/rules/implementation-cut.ts +37 -35
  261. package/scripts/rules/index-guard.ts +4 -7
  262. package/scripts/rules/issue-comments.ts +67 -16
  263. package/scripts/rules/josh-git-bare.ts +3 -6
  264. package/scripts/rules/lane-background.ts +10 -21
  265. package/scripts/rules/lane-carry-conflict.ts +7 -17
  266. package/scripts/rules/lane-interactive-ask.ts +6 -11
  267. package/scripts/rules/lane-park.ts +5 -13
  268. package/scripts/rules/lane-split-park.ts +2 -7
  269. package/scripts/rules/lane-switch-main.ts +9 -12
  270. package/scripts/rules/last-prompt.ts +50 -5
  271. package/scripts/rules/oracle-consulted.ts +4 -5
  272. package/scripts/rules/oracle-list-cli.ts +7 -0
  273. package/scripts/rules/piped-verification.ts +84 -32
  274. package/scripts/rules/poll-loop.ts +7 -17
  275. package/scripts/rules/pre-gate-cut.ts +7 -21
  276. package/scripts/rules/prior-comment-read.ts +7 -5
  277. package/scripts/rules/protected-files.ts +5 -9
  278. package/scripts/rules/raw-field-body.ts +3 -7
  279. package/scripts/rules/rule-body-guard.ts +4 -11
  280. package/scripts/rules/rule-list.ts +4 -1
  281. package/scripts/rules/rule-registry-rows.ts +10 -0
  282. package/scripts/rules/rule-registry.ts +7 -4
  283. package/scripts/rules/rule-rewrite.ts +114 -0
  284. package/scripts/rules/rule-value.ts +7 -1
  285. package/scripts/rules/run-tail-rule.ts +6 -22
  286. package/scripts/rules/shell-body-trigger.ts +4 -6
  287. package/scripts/rules/shell-segments.ts +22 -0
  288. package/scripts/rules/stop-decision.ts +77 -0
  289. package/scripts/rules/stop-rules.ts +164 -77
  290. package/scripts/rules/tail-commands.ts +15 -1
  291. package/scripts/rules/test-declared-commit.ts +4 -10
  292. package/scripts/rules/third-party-write.ts +5 -10
  293. package/scripts/rules/worktree-guard.ts +5 -12
  294. package/scripts/run/board/run-board-cli.ts +2 -0
  295. package/scripts/run/board/run-board-closed.ts +8 -2
  296. package/scripts/run/board/run-board-github.ts +19 -3
  297. package/scripts/run/board/run-board-header.ts +4 -1
  298. package/scripts/run/board/run-board-idle.ts +31 -0
  299. package/scripts/run/board/run-board-labels.ts +2 -0
  300. package/scripts/run/board/run-board-layout.ts +1 -1
  301. package/scripts/run/board/run-board-read.ts +25 -12
  302. package/scripts/run/board/run-board-reason.ts +17 -4
  303. package/scripts/run/board/run-board-render-legend.ts +1 -0
  304. package/scripts/run/board/run-board-render-slot.ts +1 -1
  305. package/scripts/run/board/run-board-render-waits.ts +41 -0
  306. package/scripts/run/board/run-board-render.ts +6 -1
  307. package/scripts/run/board/run-board-row-yield.ts +1 -0
  308. package/scripts/run/board/run-board-state.ts +9 -0
  309. package/scripts/run/board/run-board-status.ts +89 -23
  310. package/scripts/run/board/run-board-thanks.ts +7 -2
  311. package/scripts/run/board/run-board-tick.ts +37 -8
  312. package/scripts/run/carry/run-carry-args.ts +1 -3
  313. package/scripts/run/carry/run-carry-conversation.ts +7 -2
  314. package/scripts/run/cut/run-cut-cli.ts +18 -22
  315. package/scripts/run/cut/run-cut-decline.ts +72 -0
  316. package/scripts/run/cut/run-cut-ready.ts +74 -0
  317. package/scripts/run/cut/run-cut-report.ts +29 -0
  318. package/scripts/run/cut/run-cut.ts +10 -1
  319. package/scripts/run/detached-launch.ts +23 -4
  320. package/scripts/run/entry/run-entry-cli.ts +8 -1
  321. package/scripts/run/event/run-event-render.ts +1 -0
  322. package/scripts/run/event/run-event-scope.ts +19 -1
  323. package/scripts/run/event/run-event-stream-emit.ts +13 -6
  324. package/scripts/run/event/run-event-stream.ts +4 -0
  325. package/scripts/run/hold/run-hold-cli.ts +14 -3
  326. package/scripts/run/hold/run-hold-session.ts +46 -0
  327. package/scripts/run/hold/run-hold.ts +13 -4
  328. package/scripts/run/launch-priority.ts +32 -0
  329. package/scripts/run/merge/run-merge-cli.ts +16 -42
  330. package/scripts/run/merge/run-merge-ship.ts +59 -1
  331. package/scripts/run/merge/run-merge-signals.ts +99 -0
  332. package/scripts/run/merge/run-merge-steps.ts +11 -1
  333. package/scripts/run/merge/run-merge.ts +22 -9
  334. package/scripts/run/run-ending.ts +31 -3
  335. package/scripts/run/run-liveness.ts +1 -1
  336. package/scripts/run/run-parent-cut-hook.ts +5 -10
  337. package/scripts/run/run-poll-hook.ts +157 -0
  338. package/scripts/run/run-preflight.ts +1 -2
  339. package/scripts/run/run-step-cli.ts +22 -15
  340. package/scripts/run/run-step-section.ts +85 -0
  341. package/scripts/run/run-stop-notify.ts +1 -2
  342. package/scripts/run/run-watcher-guard.ts +6 -3
  343. package/scripts/run/ship/run-ship-cli.ts +5 -12
  344. package/scripts/run/ship/run-ship-detach.ts +9 -0
  345. package/scripts/run/ship/run-ship-next.ts +10 -2
  346. package/scripts/run/ship/run-ship-overlap.ts +195 -0
  347. package/scripts/run/ship/run-ship-pre-detach.ts +33 -15
  348. package/scripts/run/ship/run-ship-preflight.ts +28 -2
  349. package/scripts/run/ship/run-ship-return.ts +31 -7
  350. package/scripts/run/ship/run-ship-review-steps.ts +25 -14
  351. package/scripts/run/ship/run-ship-review.ts +15 -2
  352. package/scripts/run/ship/run-ship-steps.ts +1 -1
  353. package/scripts/run/ship/run-ship-stop-context.ts +206 -0
  354. package/scripts/run/ship/run-ship-sync.ts +14 -6
  355. package/scripts/run/tidy/run-tidy-cli.ts +3 -3
  356. package/scripts/run/tidy/run-tidy-lanes.ts +3 -2
  357. package/scripts/safe-chain/project-config.ts +7 -2
  358. package/scripts/sync/sync-hook-safety.ts +8 -2
  359. package/scripts/test/test-e2e-guard.ts +30 -5
  360. package/scripts/test/test-unit-guard.ts +16 -1
  361. package/scripts/test/unit-worker-share.ts +26 -3
  362. package/scripts/time-runtime/time-batch-guard.ts +3 -3
  363. package/scripts/time-runtime/time-hook-transcript.ts +3 -2
  364. package/scripts/time-runtime/time-shell.ts +39 -4
  365. package/scripts/time-runtime/time-spans.ts +1 -0
  366. package/scripts/time-runtime/time-tool-call.ts +7 -0
  367. package/scripts/version/effective-upstream.ts +3 -4
  368. package/scripts/version/kit-version-config.ts +8 -2
  369. package/scripts/version/latest-corepack.ts +1 -2
  370. package/scripts/version/release-hold.ts +11 -4
  371. package/scripts/version/version-commands.ts +12 -4
  372. package/templates/gitignore +6 -2
  373. package/dist/hooks/chunk-D5QBTOCZ.js +0 -68
  374. package/dist/hooks/chunk-UT7YC3N2.js +0 -56
@@ -1,13 +1,43 @@
1
1
  #!/usr/bin/env tsx
2
2
 
3
3
  // scripts/document/document-section-cli.ts
4
- import { existsSync as existsSync2 } from "node:fs";
5
- import path6 from "node:path";
4
+ import { existsSync as existsSync3 } from "node:fs";
5
+ import path8 from "node:path";
6
6
  import { fileURLToPath as fileURLToPath2 } from "node:url";
7
7
 
8
+ // scripts/josh/package-directory.ts
9
+ import { existsSync } from "node:fs";
10
+ import path2 from "node:path";
11
+
12
+ // scripts/lib/ancestor-directories.ts
13
+ import path from "node:path";
14
+ var MAX_DEPTH = 64;
15
+ function list(start_directory) {
16
+ const directories = [];
17
+ let current = path.resolve(start_directory);
18
+ while (directories.length < MAX_DEPTH && !directories.includes(current)) {
19
+ directories.push(current);
20
+ current = path.dirname(current);
21
+ }
22
+ return directories;
23
+ }
24
+ function nearest(start_directory, is_match2) {
25
+ return list(start_directory).find((directory) => is_match2(directory));
26
+ }
27
+ var ancestor_directories = { list, nearest };
28
+
29
+ // scripts/josh/package-directory.ts
30
+ var PACKAGE_JSON = "package.json";
31
+ function find_package_directory(start_directory) {
32
+ return ancestor_directories.nearest(
33
+ start_directory,
34
+ (directory) => existsSync(path2.join(directory, PACKAGE_JSON))
35
+ ) ?? start_directory;
36
+ }
37
+
8
38
  // scripts/document/capped-print.ts
9
39
  import { mkdtempSync, writeFileSync } from "node:fs";
10
- import path3 from "node:path";
40
+ import path5 from "node:path";
11
41
 
12
42
  // scripts/josh/platform-temporary.ts
13
43
  import { accessSync, constants } from "node:fs";
@@ -82,7 +112,7 @@ function reading_block(parts, cap) {
82
112
  var review_diff_parts = { body_of, part_texts, reading_block, split_text };
83
113
 
84
114
  // scripts/document/bash-output-cap.ts
85
- import path from "node:path";
115
+ import path3 from "node:path";
86
116
 
87
117
  // scripts/lib/read-file.ts
88
118
  import { readFileSync } from "node:fs";
@@ -90,20 +120,20 @@ var ABSENT_CODE = "ENOENT";
90
120
  function is_absent(error) {
91
121
  return error instanceof Error && "code" in error && error.code === ABSENT_CODE;
92
122
  }
93
- function read_optional(path7) {
123
+ function read_optional(path9) {
94
124
  try {
95
- return readFileSync(path7, "utf8");
125
+ return readFileSync(path9, "utf8");
96
126
  } catch (error) {
97
127
  if (is_absent(error)) return void 0;
98
128
  throw error;
99
129
  }
100
130
  }
101
- function read_file_or_empty(path7) {
102
- return read_optional(path7) ?? "";
131
+ function read_file_or_empty(path9) {
132
+ return read_optional(path9) ?? "";
103
133
  }
104
- function read_if_readable(path7) {
134
+ function read_if_readable(path9) {
105
135
  try {
106
- return readFileSync(path7, "utf8");
136
+ return readFileSync(path9, "utf8");
107
137
  } catch {
108
138
  return void 0;
109
139
  }
@@ -131,8 +161,8 @@ function is_real_label(token) {
131
161
  function label_references(text) {
132
162
  return matches(text, LABEL_PATTERN).map((match) => match[1] ?? "").filter((token) => is_real_label(token));
133
163
  }
134
- function base_name(path7) {
135
- return path7.split("/").at(-1) ?? path7;
164
+ function base_name(path9) {
165
+ return path9.split("/").at(-1) ?? path9;
136
166
  }
137
167
  function is_placeholder_file(name) {
138
168
  return name.includes("<") || PLACEHOLDER_FILES.has(base_name(name).toLowerCase());
@@ -313,7 +343,7 @@ var document_section = {
313
343
  };
314
344
 
315
345
  // scripts/document/bash-output-cap.ts
316
- var SETTINGS_FILE = path.join(".claude", "settings.json");
346
+ var SETTINGS_FILE = path3.join(".claude", "settings.json");
317
347
  var HARNESS_DEFAULT_CAP_CHARS = 3e4;
318
348
  var ENV_KEY = "env";
319
349
  var CAP_KEY = "BASH_MAX_OUTPUT_LENGTH";
@@ -330,14 +360,14 @@ function declared_cap(text) {
330
360
  }
331
361
  }
332
362
  function bash_output_cap(root) {
333
- const text = document_section.read_optional(path.join(root, SETTINGS_FILE)) ?? "";
363
+ const text = document_section.read_optional(path3.join(root, SETTINGS_FILE)) ?? "";
334
364
  const chars = Number(declared_cap(text));
335
365
  return Number.isSafeInteger(chars) && chars > NONE ? chars : HARNESS_DEFAULT_CAP_CHARS;
336
366
  }
337
367
  var bash_output_cap_reader = { HARNESS_DEFAULT_CAP_CHARS, bash_output_cap };
338
368
 
339
369
  // scripts/document/capped-print-part.ts
340
- import path2 from "node:path";
370
+ import path4 from "node:path";
341
371
  var DIRECTORY_PREFIX = "josh-capped-print-";
342
372
  var PART_PREFIX = "part-";
343
373
  var PART_SUFFIX = ".md";
@@ -346,8 +376,8 @@ function part_name(index) {
346
376
  return `${PART_PREFIX}${String(index + 1)}${PART_SUFFIX}`;
347
377
  }
348
378
  function is_part_file(absolute) {
349
- const parent = path2.basename(path2.dirname(absolute));
350
- return parent.startsWith(DIRECTORY_PREFIX) && PART_PATTERN.test(path2.basename(absolute));
379
+ const parent = path4.basename(path4.dirname(absolute));
380
+ return parent.startsWith(DIRECTORY_PREFIX) && PART_PATTERN.test(path4.basename(absolute));
351
381
  }
352
382
  var capped_print_part = { DIRECTORY_PREFIX, part_name, is_part_file };
353
383
 
@@ -356,9 +386,9 @@ var FILE_MODE = 384;
356
386
  var LINE_BREAK2 = "\n";
357
387
  var HEADROOM_CHARS = 512;
358
388
  function write_parts(label, text, cap) {
359
- const directory = mkdtempSync(path3.join(PLATFORM_TEMP_ROOT, capped_print_part.DIRECTORY_PREFIX));
389
+ const directory = mkdtempSync(path5.join(PLATFORM_TEMP_ROOT, capped_print_part.DIRECTORY_PREFIX));
360
390
  return review_diff_parts.part_texts(label, text, cap).map((part, index) => {
361
- const file = path3.join(directory, capped_print_part.part_name(index));
391
+ const file = path5.join(directory, capped_print_part.part_name(index));
362
392
  writeFileSync(file, part, { flag: "wx", mode: FILE_MODE });
363
393
  return file;
364
394
  });
@@ -385,13 +415,13 @@ function capped_print(text, label, root = process.cwd()) {
385
415
  var capped_output = { HEADROOM_CHARS, capped_print };
386
416
 
387
417
  // scripts/document/entry-read-set.ts
388
- import { existsSync } from "node:fs";
389
- import path5 from "node:path";
418
+ import { existsSync as existsSync2 } from "node:fs";
419
+ import path7 from "node:path";
390
420
 
391
421
  // scripts/init/init-paths.ts
392
- import path4 from "node:path";
422
+ import path6 from "node:path";
393
423
  import { fileURLToPath } from "node:url";
394
- var PACKAGE_DIR = path4.join(path4.dirname(fileURLToPath(import.meta.url)), "..", "..");
424
+ var PACKAGE_DIR = path6.join(path6.dirname(fileURLToPath(import.meta.url)), "..", "..");
395
425
  var PROJECT_ROOT = process.cwd();
396
426
 
397
427
  // scripts/cost-runtime/cost-tokens.ts
@@ -517,7 +547,7 @@ var read_set_point_of_use = {
517
547
  // scripts/document/entry-read-set.ts
518
548
  var { POINT_OF_USE_FILES: POINT_OF_USE_FILES2, POINT_OF_USE_BY_ENTRY: POINT_OF_USE_BY_ENTRY2, is_point_of_use: is_point_of_use2, point_of_use_files: point_of_use_files2 } = read_set_point_of_use;
519
549
  var { cost_of: cost_of2, scoped_file_cost: scoped_file_cost2, total: total2 } = read_set_cost;
520
- var SKILL_DIRECTORY = path5.join(".claude", "skills", "workflow-commands");
550
+ var SKILL_DIRECTORY = path7.join(".claude", "skills", "workflow-commands");
521
551
  var SKILL_FILE = "SKILL.md";
522
552
  var TABLE_SECTION = "1. Which file to read";
523
553
  var NOTHING2 = 0;
@@ -529,11 +559,11 @@ var ENTRY_KEYWORD = /`(?<keyword>[a-z]+)/u;
529
559
  var SECTION_REFERENCE = /`(?<file>[\w.-]+\.md)` *→ *"(?<heading>[^"]+)"/gu;
530
560
  var WHITESPACE_RUN = /\s+/gu;
531
561
  function document_path(root, name) {
532
- const in_project = path5.join(root, SKILL_DIRECTORY, name);
533
- const in_package = path5.join(PACKAGE_DIR, SKILL_DIRECTORY, name);
534
- const project_manifest = path5.join(root, "package.json");
535
- if (root !== "" && existsSync(project_manifest) && existsSync(in_package)) return in_package;
536
- return existsSync(in_project) ? in_project : in_package;
562
+ const in_project = path7.join(root, SKILL_DIRECTORY, name);
563
+ const in_package = path7.join(PACKAGE_DIR, SKILL_DIRECTORY, name);
564
+ const project_manifest = path7.join(root, "package.json");
565
+ if (root !== "" && existsSync2(project_manifest) && existsSync2(in_package)) return in_package;
566
+ return existsSync2(in_project) ? in_project : in_package;
537
567
  }
538
568
  function read_document(root, name) {
539
569
  return document_section.read_optional(document_path(root, name)) ?? "";
@@ -721,11 +751,14 @@ var FILE_ARGUMENT = 0;
721
751
  var HEADING_ARGUMENT = 1;
722
752
  var NO_CANDIDATE = 0;
723
753
  var USAGE = 'Usage: josh doc:section <file.md> "<heading>"';
724
- function resolve_document(name, root = process.cwd()) {
725
- const named = path6.resolve(root, name);
726
- if (existsSync2(named)) return named;
727
- const in_skill = entry_read_set.document_path(root, name);
728
- return existsSync2(in_skill) ? in_skill : named;
754
+ var PACKAGE_DIRECTORY = find_package_directory(path8.dirname(fileURLToPath2(import.meta.url)));
755
+ function candidates_under(directory, name) {
756
+ return [path8.resolve(directory, name), entry_read_set.document_path(directory, name)];
757
+ }
758
+ function resolve_document(name, root = process.cwd(), package_directory = PACKAGE_DIRECTORY) {
759
+ const named = path8.resolve(root, name);
760
+ const candidates2 = [...candidates_under(root, name), ...candidates_under(package_directory, name)];
761
+ return candidates2.find((candidate) => existsSync3(candidate)) ?? named;
729
762
  }
730
763
  function report_missing(markdown, heading) {
731
764
  const near = document_section.candidates(markdown, heading);
@@ -9,12 +9,12 @@ import {
9
9
  load_environment_file,
10
10
  notice_refusal_path,
11
11
  refusal_path
12
- } from "./chunk-5H4SSDSD.js";
13
- import "./chunk-UT7YC3N2.js";
14
- import "./chunk-GPLGZ6IC.js";
15
- import "./chunk-LIAFCXL7.js";
16
- import "./chunk-OLMO72ON.js";
17
- import "./chunk-3C4XRYG6.js";
12
+ } from "./chunk-A65Y4YOR.js";
13
+ import "./chunk-JP45SOCJ.js";
14
+ import "./chunk-6TS2JD6D.js";
15
+ import "./chunk-TNUMY6NL.js";
16
+ import "./chunk-LAOV7NLM.js";
17
+ import "./chunk-APUO6U4J.js";
18
18
  import "./chunk-DGT54IH5.js";
19
19
  export {
20
20
  DISABLED_VALUES,
@@ -0,0 +1,66 @@
1
+ // scripts/observations/observation-ledger.ts
2
+ var OBSERVATION_LEDGER_DIRECTORY = ".josh/observations";
3
+ var LEGACY_OBSERVATION_LEDGER_DIRECTORY = "docs/maintainers/observations";
4
+ var LEDGER_DIRECTORIES = [
5
+ OBSERVATION_LEDGER_DIRECTORY,
6
+ LEGACY_OBSERVATION_LEDGER_DIRECTORY
7
+ ];
8
+ var LEDGER_FILE_EXTENSION = ".md";
9
+ var LEGACY_LEDGER_FILE = `legacy${LEDGER_FILE_EXTENSION}`;
10
+ var LEGACY_OBSERVATION_LEDGER_PATHS = [
11
+ "docs/maintainers/observations.md",
12
+ "docs/observations.md"
13
+ ];
14
+ var STATUS_PATH_INDEX = 3;
15
+ function status_path(line) {
16
+ return line.slice(STATUS_PATH_INDEX).trim();
17
+ }
18
+ function ledger_file(name) {
19
+ return `${OBSERVATION_LEDGER_DIRECTORY}/${String(name)}${LEDGER_FILE_EXTENSION}`;
20
+ }
21
+ function is_ledger_file_name(name) {
22
+ return name.endsWith(LEDGER_FILE_EXTENSION);
23
+ }
24
+ var MIGRATION_CLAIM_SUFFIX = ".migrating";
25
+ function is_legacy_directory_file(file_path) {
26
+ return file_path.startsWith(`${LEGACY_OBSERVATION_LEDGER_DIRECTORY}/`);
27
+ }
28
+ function is_migration_claim(file_path) {
29
+ if (!file_path.endsWith(MIGRATION_CLAIM_SUFFIX)) return false;
30
+ return is_legacy_directory_file(file_path) || LEGACY_OBSERVATION_LEDGER_PATHS.some((legacy) => file_path.startsWith(`${legacy}.`));
31
+ }
32
+ function is_in_directory(file_path) {
33
+ return LEDGER_DIRECTORIES.some((directory) => file_path.startsWith(`${directory}/`));
34
+ }
35
+ function is_ledger_path(file_path) {
36
+ return is_in_directory(file_path) || LEGACY_OBSERVATION_LEDGER_PATHS.includes(file_path) || is_migration_claim(file_path);
37
+ }
38
+ function is_ledger_line(line) {
39
+ return is_ledger_path(status_path(line));
40
+ }
41
+ function ledger_paths(status_output) {
42
+ return status_output.split("\n").filter((line) => is_ledger_line(line)).map((line) => status_path(line));
43
+ }
44
+ function has_pending_append(status_output) {
45
+ return status_output.split("\n").some((line) => is_ledger_line(line));
46
+ }
47
+ var observation_ledger = {
48
+ has_pending_append,
49
+ is_ledger_file_name,
50
+ is_ledger_line,
51
+ is_ledger_path,
52
+ is_migration_claim,
53
+ ledger_file,
54
+ ledger_paths,
55
+ status_path
56
+ };
57
+
58
+ export {
59
+ OBSERVATION_LEDGER_DIRECTORY,
60
+ LEGACY_OBSERVATION_LEDGER_DIRECTORY,
61
+ LEDGER_FILE_EXTENSION,
62
+ LEGACY_LEDGER_FILE,
63
+ LEGACY_OBSERVATION_LEDGER_PATHS,
64
+ MIGRATION_CLAIM_SUFFIX,
65
+ observation_ledger
66
+ };
@@ -1,13 +1,13 @@
1
1
  import {
2
2
  time_density_hook,
3
3
  time_hook_transcript
4
- } from "./chunk-LIAFCXL7.js";
4
+ } from "./chunk-TNUMY6NL.js";
5
5
  import {
6
6
  josh_environment_file
7
- } from "./chunk-OLMO72ON.js";
7
+ } from "./chunk-LAOV7NLM.js";
8
8
  import {
9
9
  json_value
10
- } from "./chunk-3C4XRYG6.js";
10
+ } from "./chunk-APUO6U4J.js";
11
11
  import {
12
12
  stamp_file
13
13
  } from "./chunk-DGT54IH5.js";
@@ -61,6 +61,16 @@ function rewrite_envelope(updated_input, context) {
61
61
  }
62
62
  });
63
63
  }
64
+ function flow_rewrite_envelope(updated_input, context) {
65
+ return JSON.stringify({
66
+ systemMessage: context,
67
+ hookSpecificOutput: {
68
+ hookEventName: HOOK_EVENT_NAME,
69
+ updatedInput: updated_input,
70
+ additionalContext: context
71
+ }
72
+ });
73
+ }
64
74
  function notice_envelope(notice) {
65
75
  return JSON.stringify({
66
76
  systemMessage: notice,
@@ -209,6 +219,7 @@ var hook_decision = {
209
219
  deny_envelope,
210
220
  emit_outcome,
211
221
  fault_notice,
222
+ flow_rewrite_envelope,
212
223
  is_switch_enabled,
213
224
  is_switch_opt_in,
214
225
  load_environment_file,
@@ -0,0 +1,50 @@
1
+ import {
2
+ investigation_reads
3
+ } from "./chunk-PTICX4OL.js";
4
+ import {
5
+ agent_session_role
6
+ } from "./chunk-UPUZF3AN.js";
7
+ import {
8
+ lane_guard_policy
9
+ } from "./chunk-JP45SOCJ.js";
10
+ import {
11
+ hook_decision
12
+ } from "./chunk-6TS2JD6D.js";
13
+
14
+ // scripts/delegation/investigation-guard.ts
15
+ import { text } from "node:stream/consumers";
16
+ import { fileURLToPath } from "node:url";
17
+ var SWITCH_ENV_KEY = "JOSH_INVESTIGATION_GUARD";
18
+ var STAMP_PREFIX = "josh-investigation-guard-";
19
+ function should_block(tail, call, refused_at_ms, run) {
20
+ if (agent_session_role.is_reviewer() || lane_guard_policy.mode_here("investigation") !== "refuse") {
21
+ return false;
22
+ }
23
+ return investigation_reads.should_block(tail, call, refused_at_ms, run);
24
+ }
25
+ var GUARD = hook_decision.create_transcript_guard({
26
+ prefix: STAMP_PREFIX,
27
+ switch_key: SWITCH_ENV_KEY,
28
+ is_candidate: investigation_reads.is_refusable_call,
29
+ should_block,
30
+ reason: investigation_reads.REASON
31
+ });
32
+ var investigation_refusal = GUARD.refusal;
33
+ var investigation_outcome = GUARD.outcome;
34
+ var { is_enabled, refusal_path } = GUARD;
35
+ var { deny_envelope, load_environment_file, DISABLED_VALUES } = hook_decision;
36
+ if (process.argv[1] === fileURLToPath(import.meta.url)) {
37
+ if (process.stdin.isTTY) hook_decision.report_no_payload("investigation:guard");
38
+ else hook_decision.write_outcome(await text(process.stdin), investigation_outcome);
39
+ }
40
+
41
+ export {
42
+ SWITCH_ENV_KEY,
43
+ investigation_refusal,
44
+ investigation_outcome,
45
+ is_enabled,
46
+ refusal_path,
47
+ deny_envelope,
48
+ load_environment_file,
49
+ DISABLED_VALUES
50
+ };
@@ -1,12 +1,12 @@
1
1
  import {
2
2
  lane_guard_policy
3
- } from "./chunk-UT7YC3N2.js";
3
+ } from "./chunk-JP45SOCJ.js";
4
4
  import {
5
5
  hook_decision
6
- } from "./chunk-GPLGZ6IC.js";
6
+ } from "./chunk-6TS2JD6D.js";
7
7
  import {
8
8
  time_batch_guard
9
- } from "./chunk-LIAFCXL7.js";
9
+ } from "./chunk-TNUMY6NL.js";
10
10
 
11
11
  // scripts/hooks/batch-guard.ts
12
12
  import { text } from "node:stream/consumers";
@@ -51,8 +51,7 @@ import { execa as execa3 } from "execa";
51
51
 
52
52
  // scripts/git/git-execa-error.ts
53
53
  function get_exit_code(error) {
54
- if (typeof error !== "object" || error === null) return void 0;
55
- if (!("exitCode" in error)) return void 0;
54
+ if (typeof error !== "object" || error === null || !("exitCode" in error)) return void 0;
56
55
  const { exitCode: exit_code } = error;
57
56
  return typeof exit_code === "number" ? exit_code : void 0;
58
57
  }
@@ -207,16 +206,18 @@ var git_spawn = {
207
206
  var REFS_REMOTES_ORIGIN_PREFIX = "refs/remotes/origin/";
208
207
  var NAME_ONLY_FLAG = "--name-only";
209
208
  var DEFAULT_BRANCH_FALLBACK = "main";
209
+ var DEFAULT_BRANCH_ARGUMENTS = ["symbolic-ref", "refs/remotes/origin/HEAD"];
210
+ function default_branch_of(output) {
211
+ const trimmed = output?.trim() ?? "";
212
+ if (!trimmed.startsWith(REFS_REMOTES_ORIGIN_PREFIX)) return DEFAULT_BRANCH_FALLBACK;
213
+ return trimmed.slice(REFS_REMOTES_ORIGIN_PREFIX.length);
214
+ }
210
215
  async function get_default_branch() {
211
216
  try {
212
- const output = await git_spawn.read(["symbolic-ref", "refs/remotes/origin/HEAD"]);
213
- const trimmed = output.trim();
214
- if (trimmed.startsWith(REFS_REMOTES_ORIGIN_PREFIX)) {
215
- return trimmed.slice(REFS_REMOTES_ORIGIN_PREFIX.length);
216
- }
217
+ return default_branch_of(await git_spawn.read([...DEFAULT_BRANCH_ARGUMENTS]));
217
218
  } catch {
219
+ return DEFAULT_BRANCH_FALLBACK;
218
220
  }
219
- return DEFAULT_BRANCH_FALLBACK;
220
221
  }
221
222
  var MERGE_BASE_COMMAND = "merge-base";
222
223
  async function reference_exists(reference) {
@@ -293,8 +294,10 @@ async function untracked_names() {
293
294
  ]);
294
295
  }
295
296
  var git_diff_reads = {
297
+ DEFAULT_BRANCH_ARGUMENTS,
296
298
  change_base,
297
299
  change_base_commit,
300
+ default_branch_of,
298
301
  default_branch_reference,
299
302
  diff_cached_names,
300
303
  diff_main,
@@ -1006,7 +1009,7 @@ var WATCH_VERDICT = "watch";
1006
1009
  var STOP_VERDICT = "stop";
1007
1010
  var TRIAGE_VERDICT = "triage";
1008
1011
  var ANSWERS = ["blocked", "candidates", "exhausted", "parked", "unreadable", "untriaged"];
1009
- var BLOCKED_REASON = "Everything opted in is blocked or already running, so waiting can still change the answer. Poll again at the polling interval.";
1012
+ var BLOCKED_REASON = "Everything opted in is blocked or already running, so waiting can still change the answer. Ask again at the re-ask floor (60 s).";
1010
1013
  var TRIAGE_REASON = "An opted-in candidate carries neither `run:solo` nor `run:lane`, so nothing starts until it is judged. Read each issue named above, record its order and one of the two labels with a comment, then ask again.";
1011
1014
  var EMPTY_BACKLOG = "The backlog is empty";
1012
1015
  var WAITING_ON = {
@@ -1027,7 +1030,7 @@ function max_reached_reason(merged, max_issues) {
1027
1030
  return `This run's maximum of ${String(max_issues)} is reached, with ${String(merged)} merged. Report what was done, including how many were picked up during an idle watch, and finish.`;
1028
1031
  }
1029
1032
  function draining_reason(running, reason) {
1030
- return `Start nothing more and poll until the running children merge (running: ${String(running)}). Then report and finish \u2014 ${reason}`;
1033
+ return `Start nothing more and wait on \`pnpm josh lane:await\` until the running children merge (running: ${String(running)}). Then report and finish \u2014 ${reason}`;
1031
1034
  }
1032
1035
  function idle_expired_reason(answer, idle_budget_ms) {
1033
1036
  return `${waiting_on(answer)}, and stayed so for the whole ${to_minutes(idle_budget_ms)}-minute idle watch. Report what was done, including how many were picked up during the watch, and finish.`;
@@ -1036,7 +1039,7 @@ function idle_watch_reason(answer, left_ms) {
1036
1039
  return `${waiting_on(answer)} and the idle watch has about ${to_minutes(left_ms)} minutes left. Release the working tree, ask again in ${String(OFFER_INTERVAL_SECONDS)} seconds, and restart the watch the moment a candidate appears.`;
1037
1040
  }
1038
1041
  function running_watch_reason(answer, running, left_ms) {
1039
- return `${waiting_on(answer)} and the idle watch has about ${to_minutes(left_ms)} minutes left, with ${String(running)} still running. Keep the working tree until they merge and poll at the polling interval \u2014 the watch is running down meanwhile.`;
1042
+ return `${waiting_on(answer)} and the idle watch has about ${to_minutes(left_ms)} minutes left, with ${String(running)} still running. Keep the working tree and wait on \`pnpm josh lane:await\` until they merge \u2014 the watch is running down meanwhile.`;
1040
1043
  }
1041
1044
  function watching_reason(input, left_ms) {
1042
1045
  if (input.running === 0) return idle_watch_reason(input.answer, left_ms);
@@ -1185,8 +1188,7 @@ function build_input(values, now_ms) {
1185
1188
  const answer = to_answer(cli_flags.string_of(values.answer));
1186
1189
  if (answer === void 0) return void 0;
1187
1190
  const started_at_ms = to_time_ms(cli_flags.string_of(values.started));
1188
- if (started_at_ms === void 0) return void 0;
1189
- if (!are_values_readable(values)) return void 0;
1191
+ if (started_at_ms === void 0 || !are_values_readable(values)) return void 0;
1190
1192
  return input_of(values, { answer, now_ms, started_at_ms });
1191
1193
  }
1192
1194
  function print_json(input, decision) {
@@ -2031,8 +2033,9 @@ function is_same_conversation(carry, owner) {
2031
2033
  return owner.transcript !== void 0 && owner.transcript === carry.owner_transcript;
2032
2034
  }
2033
2035
  function reclaim_owner(carry, owner) {
2034
- if (carry.is_handed_off === true || !is_same_conversation(carry, owner)) return carry;
2035
- if (owner.pid === carry.owner_pid) return carry;
2036
+ if (carry.is_handed_off === true || !is_same_conversation(carry, owner) || owner.pid === carry.owner_pid) {
2037
+ return carry;
2038
+ }
2036
2039
  return { ...carry, owner_pid: owner.pid, owner_start: owner.start };
2037
2040
  }
2038
2041
  var run_carry_conversation = {
@@ -2337,27 +2340,107 @@ var ports = {
2337
2340
  import { z as z3 } from "zod";
2338
2341
  var process_owner_schema = z3.object({ pid: z3.number(), process_start: z3.string().optional() });
2339
2342
 
2343
+ // scripts/git/git-schemas.ts
2344
+ import { z as z4 } from "zod";
2345
+ var package_name_schema = z4.object({ name: z4.string().min(1) });
2346
+ var rollup_item_schema = z4.looseObject({
2347
+ // eslint-disable-next-line @typescript-eslint/naming-convention -- GraphQL field name from GitHub API
2348
+ __typename: z4.string().optional(),
2349
+ state: z4.string().optional(),
2350
+ status: z4.string().optional(),
2351
+ conclusion: z4.string().optional(),
2352
+ name: z4.string().optional(),
2353
+ context: z4.string().optional(),
2354
+ description: z4.string().nullish()
2355
+ });
2356
+ var pr_raw_schema = z4.object({
2357
+ statusCheckRollup: z4.array(rollup_item_schema).optional(),
2358
+ mergeStateStatus: z4.string().optional(),
2359
+ reviewDecision: z4.string().optional()
2360
+ });
2361
+ var pull_comment_schema = z4.object({
2362
+ body: z4.string().optional(),
2363
+ html_url: z4.string().optional(),
2364
+ user: z4.object({ login: z4.string().optional() }).optional()
2365
+ });
2366
+ var ai_review_pull_comment_schema = z4.object({
2367
+ body: z4.string().optional(),
2368
+ url: z4.string().optional(),
2369
+ author: z4.object({ login: z4.string().optional() }).optional()
2370
+ });
2371
+ var pr_info_schema = z4.object({
2372
+ mergeable: z4.union([z4.boolean(), z4.string()]).nullable().optional(),
2373
+ mergeStateStatus: z4.string().nullable().optional(),
2374
+ state: z4.string().optional()
2375
+ });
2376
+ var epic_issue_schema = z4.object({
2377
+ number: z4.number(),
2378
+ body: z4.string().optional()
2379
+ });
2380
+ var blocking_issue_schema = z4.object({
2381
+ number: z4.number(),
2382
+ state: z4.string().optional(),
2383
+ repository_url: z4.string().optional()
2384
+ });
2385
+ var blocked_by_schema = z4.object({
2386
+ nodes: z4.array(blocking_issue_schema).default([]),
2387
+ totalCount: z4.number().optional()
2388
+ }).optional();
2389
+ var epic_child_schema = z4.object({
2390
+ state: z4.string().optional(),
2391
+ blockedBy: blocked_by_schema
2392
+ });
2393
+ var rest_comment_schema = z4.looseObject({
2394
+ body: z4.string().nullish(),
2395
+ html_url: z4.string().optional(),
2396
+ user: z4.looseObject({ login: z4.string().optional() }).nullish()
2397
+ });
2398
+ var issue_label_schema = z4.object({ name: z4.string() });
2399
+ var epic_subject_schema = z4.object({
2400
+ number: z4.number(),
2401
+ state: z4.string().optional(),
2402
+ labels: z4.array(issue_label_schema).optional(),
2403
+ body: z4.string().optional()
2404
+ });
2405
+ var open_issue_schema = z4.object({
2406
+ number: z4.number(),
2407
+ title: z4.string(),
2408
+ labels: z4.array(issue_label_schema).optional(),
2409
+ createdAt: z4.string(),
2410
+ blockedBy: blocked_by_schema,
2411
+ // Present only on the pickup listing, which reads it for the paths each issue declares.
2412
+ body: z4.string().optional()
2413
+ });
2414
+
2340
2415
  export {
2341
2416
  json_value,
2417
+ process_identity,
2418
+ process_owner_schema,
2419
+ issue_number_shape,
2420
+ lane_paths,
2342
2421
  PORT_SEED_KEY,
2343
2422
  LANE_SEAT_KEY,
2344
2423
  ENV_FILE_NAME,
2345
2424
  ports,
2346
- process_identity,
2347
- process_owner_schema,
2425
+ pr_raw_schema,
2426
+ blocking_issue_schema,
2427
+ rest_comment_schema,
2428
+ issue_label_schema,
2429
+ open_issue_schema,
2348
2430
  PORCELAIN_FLAG,
2431
+ UNTRACKED_FILES_FLAG,
2349
2432
  git_utilities,
2350
2433
  has_timed_out,
2351
2434
  git_spawn,
2435
+ git_diff_reads,
2352
2436
  GIT_LOCATION_VARIABLES,
2353
2437
  git_location_environment,
2354
2438
  git_spawn_sync,
2355
2439
  git_command,
2440
+ changed_paths,
2356
2441
  cli_flags,
2357
2442
  backlog_budget,
2358
- issue_number_shape,
2359
2443
  run_invocation,
2360
- lane_paths,
2361
2444
  file_reader,
2362
2445
  time_instant,
2363
2446
  cost_usage,
@@ -1,24 +1,11 @@
1
+ import {
2
+ ancestor_directories
3
+ } from "./chunk-GP4IEC4O.js";
4
+
1
5
  // scripts/build/local-bin.ts
2
6
  import { existsSync, readFileSync } from "node:fs";
3
7
  import { createRequire } from "node:module";
4
- import path2 from "node:path";
5
-
6
- // scripts/lib/ancestor-directories.ts
7
8
  import path from "node:path";
8
- var MAX_DEPTH = 64;
9
- function list(start_directory) {
10
- const directories = [];
11
- let current = path.resolve(start_directory);
12
- while (directories.length < MAX_DEPTH && !directories.includes(current)) {
13
- directories.push(current);
14
- current = path.dirname(current);
15
- }
16
- return directories;
17
- }
18
- function nearest(start_directory, is_match) {
19
- return list(start_directory).find((directory) => is_match(directory));
20
- }
21
- var ancestor_directories = { list, nearest };
22
9
 
23
10
  // scripts/lib/schemas.ts
24
11
  import { z } from "zod";
@@ -60,23 +47,23 @@ var WINDOWS_SHIM_SUFFIX = ".cmd";
60
47
  var PACKAGE_JSON = "package.json";
61
48
  function resolve_local_bin(project_root, bin_name) {
62
49
  const shim = process.platform === WINDOWS_PLATFORM ? `${bin_name}${WINDOWS_SHIM_SUFFIX}` : bin_name;
63
- return path2.join(project_root, NODE_MODULES, BIN_DIR, shim);
50
+ return path.join(project_root, NODE_MODULES, BIN_DIR, shim);
64
51
  }
65
52
  function find_local_bin_upwards(start_directory, bin_name) {
66
53
  return ancestor_directories.list(start_directory).map((directory) => resolve_local_bin(directory, bin_name)).find((candidate) => existsSync(candidate));
67
54
  }
68
55
  function read_bin_entry(manifest_path, package_name, bin_name) {
69
56
  const { bin } = package_bin_schema.parse(JSON.parse(readFileSync(manifest_path, "utf8")));
70
- if (typeof bin === "string") return bin_name === path2.basename(package_name) ? bin : void 0;
57
+ if (typeof bin === "string") return bin_name === path.basename(package_name) ? bin : void 0;
71
58
  return bin?.[bin_name];
72
59
  }
73
60
  function resolve_package_bin(base_directory, package_name, bin_name) {
74
61
  try {
75
- const resolve_from = createRequire(path2.join(base_directory, PACKAGE_JSON));
62
+ const resolve_from = createRequire(path.join(base_directory, PACKAGE_JSON));
76
63
  const manifest_path = resolve_from.resolve(`${package_name}/${PACKAGE_JSON}`);
77
64
  const bin_entry = read_bin_entry(manifest_path, package_name, bin_name);
78
65
  if (bin_entry === void 0) return void 0;
79
- const cli_entry = path2.join(path2.dirname(manifest_path), bin_entry);
66
+ const cli_entry = path.join(path.dirname(manifest_path), bin_entry);
80
67
  return existsSync(cli_entry) ? cli_entry : void 0;
81
68
  } catch {
82
69
  return void 0;
@@ -84,7 +71,6 @@ function resolve_package_bin(base_directory, package_name, bin_name) {
84
71
  }
85
72
 
86
73
  export {
87
- ancestor_directories,
88
74
  vscode_settings_schema,
89
75
  json_object_schema,
90
76
  string_array_schema,