@joshuafolkken/kit 1.1240.0 → 1.1373.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (934) hide show
  1. package/.claude/agents/investigator.md +1 -0
  2. package/.claude/settings.json +4 -0
  3. package/.claude/skills/dependency-update/SKILL.md +5 -3
  4. package/.claude/skills/epic-commands/SKILL.md +82 -113
  5. package/.claude/skills/epic-commands/epic-bundle.md +38 -63
  6. package/.claude/skills/epic-commands/execution-waves.md +30 -51
  7. package/.claude/skills/verify-ui/SKILL.md +13 -20
  8. package/.claude/skills/workflow-commands/SKILL.md +10 -10
  9. package/.claude/skills/workflow-commands/background-commands.md +4 -4
  10. package/.claude/skills/workflow-commands/backlogrun-child.md +30 -105
  11. package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +29 -0
  12. package/.claude/skills/workflow-commands/backlogrun-lanes.md +45 -131
  13. package/.claude/skills/workflow-commands/backlogrun-park.md +36 -53
  14. package/.claude/skills/workflow-commands/backlogrun-progress.md +81 -331
  15. package/.claude/skills/workflow-commands/backlogrun-recovery.md +29 -83
  16. package/.claude/skills/workflow-commands/backlogrun-steps.md +105 -424
  17. package/.claude/skills/workflow-commands/backlogrun.md +52 -61
  18. package/.claude/skills/workflow-commands/chain-rule.md +36 -40
  19. package/.claude/skills/workflow-commands/entry-sequence.md +6 -6
  20. package/.claude/skills/workflow-commands/followup.md +19 -20
  21. package/.claude/skills/workflow-commands/fullrun-steps.md +23 -27
  22. package/.claude/skills/workflow-commands/fullrun.md +10 -10
  23. package/.claude/skills/workflow-commands/halfrun.md +9 -8
  24. package/.claude/skills/workflow-commands/into-target.md +12 -18
  25. package/.claude/skills/workflow-commands/issue-comments.md +11 -26
  26. package/.claude/skills/workflow-commands/kickoff.md +26 -16
  27. package/.claude/skills/workflow-commands/latest-gate.md +17 -28
  28. package/.claude/skills/workflow-commands/needs-human-review.md +13 -24
  29. package/.claude/skills/workflow-commands/observation-filing.md +37 -28
  30. package/.claude/skills/workflow-commands/observation-ledger.md +48 -38
  31. package/.claude/skills/workflow-commands/pre-gate-cut.md +9 -9
  32. package/.claude/skills/workflow-commands/prerequisite.md +23 -15
  33. package/.claude/skills/workflow-commands/progress-watcher.md +17 -11
  34. package/.claude/skills/workflow-commands/prrun.md +3 -3
  35. package/.claude/skills/workflow-commands/retrospective.md +13 -18
  36. package/.claude/skills/workflow-commands/split-assessment.md +6 -4
  37. package/.claude/skills/workflow-commands/target-repository.md +25 -28
  38. package/.claude/skills/workflow-commands/working-tree-hold.md +11 -17
  39. package/.gitattributes +2 -1
  40. package/.github/workflows/ci.yml +14 -0
  41. package/.vscode/tasks.json +14 -0
  42. package/CLAUDE.md +10 -61
  43. package/README.md +23 -66
  44. package/SECURITY.md +1 -1
  45. package/dist/CLAUDE.md +10 -61
  46. package/dist/commands/document-section-cli.js +43 -11
  47. package/dist/config-merge/index.js +11 -2
  48. package/dist/hooks/audit-provision.js +2 -2
  49. package/dist/hooks/batch-guard.js +7 -7
  50. package/dist/hooks/{chunk-KHGB5S3Y.js → chunk-7UBFU3CL.js} +18 -20
  51. package/dist/hooks/{chunk-ZQGD4GBY.js → chunk-7WKYHEGU.js} +8 -44
  52. package/dist/hooks/{chunk-4TZVB44A.js → chunk-AKGCP4LX.js} +285 -363
  53. package/dist/hooks/{chunk-QVSWU24O.js → chunk-BZMPVFDY.js} +7 -5
  54. package/dist/hooks/{chunk-5VNDSNG3.js → chunk-FZ6FUSBM.js} +1 -1
  55. package/dist/hooks/{chunk-GPTFMK5E.js → chunk-GG72ANKI.js} +1 -1
  56. package/dist/hooks/{chunk-XZYKEM6J.js → chunk-JCRDBQXB.js} +13 -11
  57. package/dist/hooks/{chunk-F3ELQ2AF.js → chunk-JGW24KKM.js} +4 -4
  58. package/dist/hooks/{chunk-ELCN5LCH.js → chunk-NEC4AT4Z.js} +34 -12
  59. package/dist/hooks/chunk-NZN2UFI6.js +2409 -0
  60. package/dist/hooks/{chunk-WK2XSHSI.js → chunk-SLSFIWTX.js} +550 -875
  61. package/dist/hooks/chunk-UTHMB4O2.js +1590 -0
  62. package/dist/hooks/{chunk-KRBERBBI.js → chunk-V4TKZHER.js} +4 -4
  63. package/dist/hooks/chunk-YLBBSSTF.js +3705 -0
  64. package/dist/hooks/chunk-Z5TMJIPW.js +45 -0
  65. package/dist/hooks/codex-hook-adapter.js +26 -21
  66. package/dist/hooks/duplicate-read-guard.js +8 -8
  67. package/dist/hooks/format-edited.js +4 -4
  68. package/dist/hooks/inputs.json +195 -181
  69. package/dist/hooks/investigation-guard.js +8 -8
  70. package/dist/hooks/pretool-guard.js +15 -15
  71. package/dist/hooks/session-lang.js +406 -8
  72. package/dist/hooks/stop-guard.js +122 -187
  73. package/dist/josh.js +282 -95
  74. package/dist/version/index.js +15 -13
  75. package/eslint/base.js +43 -5
  76. package/eslint/rules/english-only-prose.js +3 -3
  77. package/eslint/rules/import.js +12 -0
  78. package/eslint/rules/namespace-object-export.js +2 -2
  79. package/package.json +17 -11
  80. package/pnpm-workspace.yaml +2 -4
  81. package/prompts/coding-standards.md +14 -48
  82. package/prompts/collaboration-workflow/file-edits.md +1 -1
  83. package/prompts/collaboration-workflow/issue-citation.md +1 -1
  84. package/prompts/collaboration-workflow/issue-template.md +3 -10
  85. package/prompts/collaboration-workflow/operating-rules.md +7 -8
  86. package/prompts/collaboration-workflow/output-bounds.md +1 -1
  87. package/prompts/collaboration-workflow/overview.md +1 -1
  88. package/prompts/collaboration-workflow/plan-comment.md +2 -1
  89. package/prompts/collaboration-workflow/principles.md +21 -3
  90. package/prompts/collaboration-workflow/report-format.md +16 -29
  91. package/prompts/collaboration-workflow/residency.md +1 -1
  92. package/prompts/collaboration-workflow/rule-delivery.md +7 -95
  93. package/prompts/collaboration-workflow/shell-body.md +3 -23
  94. package/prompts/collaboration-workflow/turn-batching.md +4 -13
  95. package/prompts/collaboration-workflow/wip-cap.md +5 -11
  96. package/prompts/refactoring.md +1 -1
  97. package/prompts/review-rubric.md +3 -22
  98. package/prompts/review.md +15 -38
  99. package/prompts/testing-guide.md +2 -4
  100. package/scripts/adopt/adopt-logic.ts +5 -5
  101. package/scripts/adopt/adopt-toolkits.ts +4 -5
  102. package/scripts/adopt/adopt.ts +2 -3
  103. package/scripts/agent/agent-argv.ts +7 -7
  104. package/scripts/agent/agent-diagnostics.ts +2 -2
  105. package/scripts/agent/agent-exit-record.ts +1 -1
  106. package/scripts/agent/agent-headless.ts +1 -1
  107. package/scripts/agent/agent-launch-environment.ts +6 -1
  108. package/scripts/agent/agent-role-profile.ts +49 -22
  109. package/scripts/agent/agent-session-role.ts +32 -0
  110. package/scripts/agent/api-outage.ts +1 -1
  111. package/scripts/agent/claude-agent-argv.ts +4 -4
  112. package/scripts/agent/claude-result-event.ts +4 -4
  113. package/scripts/agent/codex-hooks.ts +2 -2
  114. package/scripts/agent/interactive-ask.ts +3 -6
  115. package/scripts/auto-ok/auto-ok-cli.ts +46 -60
  116. package/scripts/backlog/backlog-arrival-added.ts +34 -0
  117. package/scripts/backlog/backlog-arrival.ts +54 -17
  118. package/scripts/backlog/backlog-budget-cli.ts +34 -6
  119. package/scripts/backlog/backlog-budget.ts +17 -24
  120. package/scripts/backlog/backlog-defect-priority.ts +1 -1
  121. package/scripts/backlog/backlog-drive-args.ts +5 -4
  122. package/scripts/backlog/backlog-drive-cli.ts +14 -10
  123. package/scripts/backlog/backlog-drive-epic.ts +85 -0
  124. package/scripts/backlog/backlog-drive-launch.ts +1 -1
  125. package/scripts/backlog/backlog-drive-named-offer.ts +60 -9
  126. package/scripts/backlog/backlog-drive-named.ts +39 -9
  127. package/scripts/backlog/backlog-drive-offer-argv.ts +1 -1
  128. package/scripts/backlog/backlog-drive-restore.ts +1 -1
  129. package/scripts/backlog/backlog-drive-retrospective.ts +2 -2
  130. package/scripts/backlog/backlog-drive.ts +43 -28
  131. package/scripts/backlog/backlog-idle.ts +88 -0
  132. package/scripts/backlog/backlog-named.ts +11 -15
  133. package/scripts/backlog/backlog-next.ts +26 -30
  134. package/scripts/backlog/backlog-offer-cli.ts +28 -23
  135. package/scripts/backlog/backlog-offer.ts +7 -7
  136. package/scripts/backlog/backlog-overlap.ts +178 -0
  137. package/scripts/backlog/backlog-plan-cli.ts +14 -90
  138. package/scripts/backlog/backlog-plan-read.ts +111 -0
  139. package/scripts/backlog/backlog-plan.ts +11 -10
  140. package/scripts/backlog/backlog-pool.ts +13 -14
  141. package/scripts/backlog/backlog-rank.ts +11 -11
  142. package/scripts/backlog/backlog-ready.ts +15 -10
  143. package/scripts/backlog/backlog-scope.ts +14 -15
  144. package/scripts/backlog/backlog-stalled-cli.ts +2 -2
  145. package/scripts/backlog/backlog-stalled-detect.ts +4 -4
  146. package/scripts/backlog/backlog-stalled.ts +5 -6
  147. package/scripts/backlog/backlog-waves.ts +4 -4
  148. package/scripts/backlog/backlogrun-args.ts +74 -0
  149. package/scripts/backlog/backlogrun-cli.ts +113 -0
  150. package/scripts/backlog/backlogrun-launch.ts +178 -0
  151. package/scripts/behavior/behavior-assertion.ts +6 -8
  152. package/scripts/behavior/behavior-cli.ts +1 -1
  153. package/scripts/behavior/behavior-rules.ts +3 -3
  154. package/scripts/build/build-claude-md.ts +4 -4
  155. package/scripts/build/build-codex-hooks.ts +2 -2
  156. package/scripts/build/build-commands.ts +1 -1
  157. package/scripts/build/build-hooks.ts +5 -5
  158. package/scripts/build/build.ts +1 -1
  159. package/scripts/build/hook-bundle-stamp.ts +109 -7
  160. package/scripts/build/local-bin.ts +2 -2
  161. package/scripts/cases/cases-cli.ts +1 -1
  162. package/scripts/cases/cases-logic.ts +2 -2
  163. package/scripts/ci/composite-actions.ts +1 -2
  164. package/scripts/ci/pr-classification.ts +2 -2
  165. package/scripts/claude/workflow-destination.ts +1 -1
  166. package/scripts/clone/clone-aggregate.ts +1 -1
  167. package/scripts/clone/clone-fingerprint.ts +1 -1
  168. package/scripts/clone/clone-scan-cli.ts +1 -1
  169. package/scripts/clone/clone-scan.ts +1 -1
  170. package/scripts/config-merge/index.ts +1 -1
  171. package/scripts/config-merge/json-format.ts +1 -3
  172. package/scripts/config-merge/patch-json-array.ts +90 -0
  173. package/scripts/config-merge/patch-json-key.ts +6 -3
  174. package/scripts/config-merge/patch-json-list.ts +1 -1
  175. package/scripts/cost-runtime/codex-usage.ts +1 -1
  176. package/scripts/cost-runtime/context-cut-payback.ts +4 -5
  177. package/scripts/cost-runtime/context-cut-threshold.ts +4 -6
  178. package/scripts/cost-runtime/cost-attribute.ts +3 -3
  179. package/scripts/cost-runtime/cost-blocks.ts +3 -4
  180. package/scripts/cost-runtime/cost-cli.ts +14 -11
  181. package/scripts/cost-runtime/cost-corpus.ts +11 -11
  182. package/scripts/cost-runtime/cost-pricing.ts +4 -4
  183. package/scripts/cost-runtime/cost-tokens.ts +1 -2
  184. package/scripts/cost-runtime/cost-transcript.ts +29 -29
  185. package/scripts/cost-runtime/cost-usage.ts +6 -7
  186. package/scripts/cost-runtime/cost-verdict.ts +10 -11
  187. package/scripts/cost-runtime/own-session.ts +1 -1
  188. package/scripts/cost-runtime/transcript-cwd.ts +2 -2
  189. package/scripts/delegation/delegation-cli.ts +4 -4
  190. package/scripts/delegation/delegation-policy.ts +13 -15
  191. package/scripts/delegation/duplicate-read-guard.ts +9 -10
  192. package/scripts/delegation/fanout-cli.ts +1 -1
  193. package/scripts/delegation/fanout.ts +1 -1
  194. package/scripts/delegation/investigation-guard.ts +18 -22
  195. package/scripts/delegation/investigation-reads.ts +48 -238
  196. package/scripts/discovery/repo-discovery.ts +1 -1
  197. package/scripts/discovery/repo-map-logic.ts +1 -2
  198. package/scripts/discovery/repo-origin.ts +3 -3
  199. package/scripts/discovery/repo-party-cli.ts +2 -2
  200. package/scripts/discovery/repo-party.ts +2 -2
  201. package/scripts/doctor/doctor-consumer.ts +1 -1
  202. package/scripts/doctor/doctor-io.ts +6 -7
  203. package/scripts/doctor/doctor-logic.ts +1 -1
  204. package/scripts/doctor/doctor-ports.ts +1 -1
  205. package/scripts/doctor/doctor.ts +8 -9
  206. package/scripts/document/backlogrun-parent-read-set.ts +5 -6
  207. package/scripts/document/bash-output-cap.ts +5 -7
  208. package/scripts/document/capped-print-part.ts +1 -1
  209. package/scripts/document/capped-print.ts +1 -1
  210. package/scripts/document/document-byte-budget.ts +33 -64
  211. package/scripts/document/document-byte-check.ts +4 -4
  212. package/scripts/document/document-reachability.ts +7 -8
  213. package/scripts/document/document-read-cli.ts +2 -2
  214. package/scripts/document/document-scan.ts +30 -5
  215. package/scripts/document/document-section-cli.ts +6 -8
  216. package/scripts/document/document-section.ts +8 -12
  217. package/scripts/document/edit-files-cli.ts +3 -4
  218. package/scripts/document/entry-read-budget.ts +8 -70
  219. package/scripts/document/entry-read-set.ts +51 -34
  220. package/scripts/document/lane-child-read-set.ts +9 -9
  221. package/scripts/document/read-files-cli.ts +1 -2
  222. package/scripts/document/read-set-cli.ts +16 -19
  223. package/scripts/document/read-set-cost.ts +4 -4
  224. package/scripts/document/read-set-point-of-use.ts +28 -38
  225. package/scripts/document/read-set-pricing.ts +1 -1
  226. package/scripts/document/read-set-trim.ts +3 -3
  227. package/scripts/document/resident-budget.ts +8 -10
  228. package/scripts/epic/epic-add-body.ts +15 -18
  229. package/scripts/epic/epic-add-plan.ts +26 -28
  230. package/scripts/epic/epic-add.ts +32 -25
  231. package/scripts/epic/epic-audit-checks.ts +27 -37
  232. package/scripts/epic/epic-audit-cli.ts +21 -22
  233. package/scripts/epic/epic-audit-orphans.ts +16 -17
  234. package/scripts/epic/epic-audit-rationale.ts +10 -15
  235. package/scripts/epic/epic-audit-report.ts +2 -5
  236. package/scripts/epic/epic-audit.ts +18 -14
  237. package/scripts/epic/epic-body.ts +10 -10
  238. package/scripts/epic/epic-bundle-cli.ts +36 -34
  239. package/scripts/epic/epic-bundle-evidence.ts +5 -5
  240. package/scripts/epic/epic-bundle-gaps.ts +6 -9
  241. package/scripts/epic/epic-bundle-poll.ts +1 -1
  242. package/scripts/epic/epic-bundle-referenced.ts +11 -14
  243. package/scripts/epic/epic-bundle.ts +19 -20
  244. package/scripts/epic/epic-busy.ts +44 -21
  245. package/scripts/epic/epic-candidate-confirm.ts +15 -18
  246. package/scripts/epic/epic-chains.ts +18 -23
  247. package/scripts/epic/epic-classify.ts +11 -12
  248. package/scripts/epic/epic-cli-argv.ts +5 -6
  249. package/scripts/epic/epic-cli-remove.ts +9 -4
  250. package/scripts/epic/epic-cli.ts +38 -26
  251. package/scripts/epic/epic-close-comment.ts +14 -15
  252. package/scripts/epic/epic-close.ts +25 -29
  253. package/scripts/epic/epic-cross-repo.ts +18 -21
  254. package/scripts/epic/epic-decision.ts +14 -18
  255. package/scripts/epic/epic-fetch.ts +25 -31
  256. package/scripts/epic/epic-graph.ts +15 -17
  257. package/scripts/epic/epic-index.ts +14 -16
  258. package/scripts/epic/epic-issue.ts +9 -11
  259. package/scripts/epic/epic-label-age.ts +74 -0
  260. package/scripts/epic/epic-lane-offer.ts +35 -24
  261. package/scripts/epic/epic-nested.ts +1 -1
  262. package/scripts/epic/epic-next-read.ts +8 -8
  263. package/scripts/epic/epic-next-views.ts +12 -12
  264. package/scripts/epic/epic-next.ts +29 -33
  265. package/scripts/epic/epic-outside-blocker.ts +11 -10
  266. package/scripts/epic/epic-parse.ts +22 -24
  267. package/scripts/epic/epic-promote.ts +3 -2
  268. package/scripts/epic/epic-rank.ts +1 -1
  269. package/scripts/epic/epic-read.ts +10 -8
  270. package/scripts/epic/epic-reconcile.ts +8 -6
  271. package/scripts/epic/epic-reference.ts +5 -4
  272. package/scripts/epic/epic-relation-recheck.ts +10 -11
  273. package/scripts/epic/epic-relations.ts +9 -8
  274. package/scripts/epic/epic-remove-plan.ts +4 -5
  275. package/scripts/epic/epic-remove.ts +7 -5
  276. package/scripts/epic/epic-report.ts +18 -20
  277. package/scripts/epic/epic-run.ts +6 -5
  278. package/scripts/epic/epic-sections.ts +2 -2
  279. package/scripts/epic/epic-shape.ts +3 -3
  280. package/scripts/epic/epic-solo-stale.ts +3 -2
  281. package/scripts/epic/epic-solo.ts +8 -8
  282. package/scripts/epic/epic-triage.ts +5 -4
  283. package/scripts/epic/epic-validate.ts +8 -7
  284. package/scripts/epic/epic.ts +5 -5
  285. package/scripts/exports/unused-members-cli.ts +1 -1
  286. package/scripts/followup/followup-issue-number.ts +1 -2
  287. package/scripts/followup/git-followup-cleanup.ts +6 -7
  288. package/scripts/followup/git-followup-finish.ts +11 -13
  289. package/scripts/followup/git-followup-flush.ts +11 -7
  290. package/scripts/followup/git-followup-issue-close.ts +16 -13
  291. package/scripts/followup/git-followup-label.ts +9 -6
  292. package/scripts/followup/git-followup-merged.ts +1 -1
  293. package/scripts/followup/git-followup-pending.ts +7 -9
  294. package/scripts/followup/git-followup-stages.ts +28 -17
  295. package/scripts/followup/git-followup-workflow.ts +19 -21
  296. package/scripts/followup/git-pr-followup-checks.ts +13 -20
  297. package/scripts/followup/git-pr-followup-wrapup.ts +7 -7
  298. package/scripts/followup/git-pr-followup.ts +18 -17
  299. package/scripts/gate/core-admission.ts +2 -2
  300. package/scripts/gate/core-budget.ts +15 -26
  301. package/scripts/gate/gate-ledger.ts +114 -0
  302. package/scripts/gate/gate-log.ts +7 -9
  303. package/scripts/gate/gate-plan.ts +70 -35
  304. package/scripts/gate/gate-report.ts +14 -15
  305. package/scripts/gate/gate-skip.ts +11 -13
  306. package/scripts/gate/gate-steps.ts +5 -1
  307. package/scripts/gate/gate-tree.ts +3 -4
  308. package/scripts/gate/hook-gate-reuse.ts +9 -9
  309. package/scripts/gate/machine-capacity.ts +168 -30
  310. package/scripts/gate/pre-commit-type-check.ts +4 -4
  311. package/scripts/gate/project-checks.ts +12 -4
  312. package/scripts/gate/scoped-green.ts +11 -18
  313. package/scripts/gate/type-check-command.ts +2 -2
  314. package/scripts/gate/type-check-step.ts +4 -4
  315. package/scripts/gate/verification-gate.ts +53 -51
  316. package/scripts/gh/gh-spawn.ts +2 -2
  317. package/scripts/gh/git-ai-review-scan.ts +3 -2
  318. package/scripts/gh/git-gh-api-path.ts +10 -11
  319. package/scripts/gh/git-gh-exec.ts +43 -48
  320. package/scripts/gh/git-gh-failure.ts +6 -9
  321. package/scripts/gh/git-gh-helpers.ts +1 -1
  322. package/scripts/gh/git-gh-issue-list.ts +15 -19
  323. package/scripts/gh/git-gh-issue-read.ts +43 -60
  324. package/scripts/gh/git-gh-issue-rest.ts +14 -15
  325. package/scripts/gh/git-gh-issue-write.ts +52 -40
  326. package/scripts/gh/git-gh-issue.ts +23 -24
  327. package/scripts/gh/git-gh-pr-auto-merge.ts +3 -3
  328. package/scripts/gh/git-gh-pr-read.ts +46 -50
  329. package/scripts/gh/git-gh-pr-rest.ts +23 -26
  330. package/scripts/gh/git-gh-pr-review.ts +2 -2
  331. package/scripts/gh/git-gh-pr-rollup.ts +4 -4
  332. package/scripts/gh/git-gh-pr-snapshot.ts +8 -10
  333. package/scripts/gh/git-gh-pr.ts +16 -16
  334. package/scripts/gh/git-gh-reachability.ts +11 -12
  335. package/scripts/gh/git-gh-repo.ts +2 -3
  336. package/scripts/gh/git-gh-rest-state.ts +1 -1
  337. package/scripts/gh/git-pr-ai-review.ts +6 -5
  338. package/scripts/gh/git-pr-checks-eval.ts +28 -30
  339. package/scripts/gh/git-pr-checks-parse.ts +14 -16
  340. package/scripts/gh/git-pr-checks-watch.ts +17 -17
  341. package/scripts/gh/git-pr-checks.ts +20 -23
  342. package/scripts/gh/git-pr-coderabbit.ts +8 -6
  343. package/scripts/gh/git-pr-confirmation.ts +5 -5
  344. package/scripts/gh/git-pr-managed-config.ts +7 -9
  345. package/scripts/gh/git-pr-messages.ts +1 -1
  346. package/scripts/gh/git-pr.ts +15 -16
  347. package/scripts/gh/github-issue-url.ts +8 -9
  348. package/scripts/git/base-tree.ts +66 -0
  349. package/scripts/git/change-base.ts +42 -2
  350. package/scripts/git/changed-file-scope.ts +5 -5
  351. package/scripts/git/changed-paths.ts +1 -2
  352. package/scripts/git/constants.ts +2 -2
  353. package/scripts/git/git-branch.ts +1 -1
  354. package/scripts/git/git-closes-keyword.ts +3 -3
  355. package/scripts/git/git-command.ts +53 -41
  356. package/scripts/git/git-common-directory.ts +3 -3
  357. package/scripts/git/git-diff-reads.ts +14 -15
  358. package/scripts/git/git-error.ts +1 -1
  359. package/scripts/git/git-execa-error.ts +1 -2
  360. package/scripts/git/git-issue.ts +10 -8
  361. package/scripts/git/git-location-environment.ts +3 -4
  362. package/scripts/git/git-ls-remote.ts +6 -8
  363. package/scripts/git/git-pre-push-hook.ts +11 -10
  364. package/scripts/git/git-preflight.ts +5 -5
  365. package/scripts/git/git-push-transport.ts +2 -2
  366. package/scripts/git/git-remote-branch.ts +1 -2
  367. package/scripts/git/git-schemas.ts +16 -23
  368. package/scripts/git/git-spawn-sync.ts +1 -1
  369. package/scripts/git/git-spawn.ts +37 -14
  370. package/scripts/git/git-ssh-keepalive.ts +12 -5
  371. package/scripts/git/git-staging.ts +7 -8
  372. package/scripts/git/git-workflow.ts +1 -1
  373. package/scripts/git/git-worktree.ts +35 -27
  374. package/scripts/git/gone-branch.ts +2 -2
  375. package/scripts/git/listing-cutoff.ts +1 -2
  376. package/scripts/git/lockfile-sync.ts +65 -0
  377. package/scripts/git/main-merge-guard.ts +1 -2
  378. package/scripts/git/main-merge.ts +7 -7
  379. package/scripts/git/main-sync.ts +23 -8
  380. package/scripts/git/parse-json-array.ts +18 -23
  381. package/scripts/git/repository-lock.ts +34 -2
  382. package/scripts/git/stash/git-stash.ts +4 -5
  383. package/scripts/git/stash/stash-orphans.ts +5 -3
  384. package/scripts/git/stash/stash-pop-args.ts +1 -1
  385. package/scripts/git/stash/stash-pop-cli.ts +3 -3
  386. package/scripts/git/stash/stash-sweep-lock.ts +2 -2
  387. package/scripts/hooks/batch-guard.ts +11 -13
  388. package/scripts/hooks/check-commit-message.ts +12 -9
  389. package/scripts/hooks/codex-hook-adapter.ts +16 -10
  390. package/scripts/hooks/edited-cspell.ts +3 -4
  391. package/scripts/hooks/format-edited-cli.ts +1 -1
  392. package/scripts/hooks/format-edited-file.ts +11 -17
  393. package/scripts/hooks/format-rewrite-notice.ts +19 -17
  394. package/scripts/hooks/pre-push-unit.ts +10 -14
  395. package/scripts/hooks/pretool-guard-cli.ts +4 -4
  396. package/scripts/hooks/pretool-guard.ts +93 -18
  397. package/scripts/hooks/reserved-run.ts +2 -2
  398. package/scripts/hooks/step-zero-notice.ts +1 -1
  399. package/scripts/hooks/stop-guard.ts +21 -10
  400. package/scripts/init/basic-path-migration.ts +2 -2
  401. package/scripts/init/claude-kit-only-settings.ts +2 -2
  402. package/scripts/init/claude-plugin-config.ts +2 -2
  403. package/scripts/init/distributed-paths.ts +4 -4
  404. package/scripts/init/hook-command-rewrite.ts +3 -3
  405. package/scripts/init/hook-launch.ts +5 -5
  406. package/scripts/init/init-actions.ts +13 -0
  407. package/scripts/init/init-ai-copy.ts +11 -11
  408. package/scripts/init/init-bootstrap.ts +3 -3
  409. package/scripts/init/init-copy-content.ts +4 -4
  410. package/scripts/init/init-logic-json-merge.ts +7 -9
  411. package/scripts/init/init-logic-migrate.ts +1 -1
  412. package/scripts/init/init-logic-templates.ts +1 -1
  413. package/scripts/init/init-logic-workspace.ts +4 -4
  414. package/scripts/init/init-logic-yaml-merge.ts +2 -2
  415. package/scripts/init/init-logic.ts +19 -22
  416. package/scripts/init/init.ts +7 -7
  417. package/scripts/init/kit-base-preset.ts +1 -1
  418. package/scripts/init/kit-setup-state.ts +1 -1
  419. package/scripts/init/kit-written-paths.ts +1 -2
  420. package/scripts/init/package-manager-pin.ts +1 -1
  421. package/scripts/init/project-profile-cli.ts +1 -1
  422. package/scripts/init/project-profile.ts +3 -3
  423. package/scripts/init/session-language-environment.ts +1 -1
  424. package/scripts/init/start-exec.ts +3 -4
  425. package/scripts/init/start-plan.ts +2 -2
  426. package/scripts/init/start-setup-pr.ts +3 -2
  427. package/scripts/init/start-steps.ts +2 -2
  428. package/scripts/init/tsconfig-preset-migration.ts +1 -1
  429. package/scripts/init/vscode-tasks.ts +62 -0
  430. package/scripts/issue/baseline-measure.ts +2 -2
  431. package/scripts/issue/behavior-change-lint.ts +2 -2
  432. package/scripts/issue/defect-rate-cli.ts +6 -7
  433. package/scripts/issue/defect-rate.ts +37 -27
  434. package/scripts/issue/git-next-issues.ts +9 -8
  435. package/scripts/issue/issue-auto-ok.ts +24 -11
  436. package/scripts/issue/issue-backlinks-cli.ts +5 -5
  437. package/scripts/issue/issue-backlinks.ts +6 -6
  438. package/scripts/issue/issue-cite-cli.ts +20 -18
  439. package/scripts/issue/issue-cite.ts +18 -8
  440. package/scripts/issue/issue-closing-pr.ts +4 -4
  441. package/scripts/issue/issue-comment-cli.ts +6 -4
  442. package/scripts/issue/issue-file-cli.ts +52 -15
  443. package/scripts/issue/issue-file-fold.ts +155 -0
  444. package/scripts/issue/issue-file.ts +9 -6
  445. package/scripts/issue/issue-fold-cli.ts +14 -9
  446. package/scripts/issue/issue-fold.ts +23 -8
  447. package/scripts/issue/issue-labels.ts +34 -38
  448. package/scripts/issue/issue-lint-cli.ts +2 -2
  449. package/scripts/issue/issue-lint.ts +1 -1
  450. package/scripts/issue/issue-merged.ts +10 -4
  451. package/scripts/issue/issue-number-shape.ts +27 -0
  452. package/scripts/issue/issue-rank.ts +1 -1
  453. package/scripts/issue/issue-read-cli.ts +4 -5
  454. package/scripts/issue/issue-read.ts +4 -5
  455. package/scripts/issue/issue-reference.ts +5 -5
  456. package/scripts/issue/issue-release-cli.ts +17 -7
  457. package/scripts/issue/issue-release.ts +3 -3
  458. package/scripts/issue/issue-report-failures.ts +7 -4
  459. package/scripts/issue/issue-scout-cli.ts +11 -11
  460. package/scripts/issue/issue-scout-closed.ts +4 -4
  461. package/scripts/issue/issue-scout.ts +4 -5
  462. package/scripts/issue/issue-state-cli.ts +17 -10
  463. package/scripts/issue/issue-state.ts +12 -13
  464. package/scripts/issue/issue-wip.ts +7 -7
  465. package/scripts/issue/markdown-section.ts +3 -3
  466. package/scripts/issue/measure-rerun-cli.ts +10 -9
  467. package/scripts/issue/reproduction-measure.ts +3 -3
  468. package/scripts/issue/session-cite.ts +56 -0
  469. package/scripts/josh/agent-session-environment.ts +10 -8
  470. package/scripts/josh/cli-body.ts +2 -2
  471. package/scripts/josh/command-suggest.ts +1 -1
  472. package/scripts/josh/file-map-stamp.ts +20 -23
  473. package/scripts/josh/hook-decision.ts +24 -28
  474. package/scripts/josh/josh-command-map.ts +4 -1
  475. package/scripts/josh/josh-command-types.ts +30 -35
  476. package/scripts/josh/josh-commands-ai.ts +6 -6
  477. package/scripts/josh/josh-commands-backlog.ts +15 -3
  478. package/scripts/josh/josh-commands-clone.ts +1 -1
  479. package/scripts/josh/josh-commands-development.ts +25 -4
  480. package/scripts/josh/josh-commands-document.ts +3 -3
  481. package/scripts/josh/josh-commands-guard.ts +3 -3
  482. package/scripts/josh/josh-commands-issue.ts +4 -5
  483. package/scripts/josh/josh-commands-lane.ts +14 -4
  484. package/scripts/josh/josh-commands-lint.ts +1 -1
  485. package/scripts/josh/josh-commands-run.ts +21 -7
  486. package/scripts/josh/josh-commands-split.ts +1 -2
  487. package/scripts/josh/josh-commands-versioning.ts +5 -5
  488. package/scripts/josh/josh-commands-workflow.ts +30 -22
  489. package/scripts/josh/josh-environment-file.ts +1 -1
  490. package/scripts/josh/josh-in-process.ts +3 -3
  491. package/scripts/josh/josh-logic.ts +6 -7
  492. package/scripts/josh/josh-run.ts +3 -3
  493. package/scripts/josh/josh-verdict.ts +9 -12
  494. package/scripts/josh/josh.ts +3 -3
  495. package/scripts/josh/kit-only.ts +2 -2
  496. package/scripts/josh/path-decision.ts +3 -3
  497. package/scripts/josh/platform-temporary.ts +7 -5
  498. package/scripts/josh/process-identity.ts +24 -6
  499. package/scripts/josh/process-owner.ts +4 -4
  500. package/scripts/josh/session-language-cli.ts +53 -11
  501. package/scripts/josh/session-language.ts +1 -1
  502. package/scripts/josh/stamp-file.ts +48 -29
  503. package/scripts/josh/stamp-record.ts +57 -0
  504. package/scripts/lane/lane-await.ts +35 -11
  505. package/scripts/lane/lane-cache.ts +6 -6
  506. package/scripts/lane/lane-capacity.ts +32 -17
  507. package/scripts/lane/lane-child-invocation.ts +17 -15
  508. package/scripts/lane/lane-child-marker.ts +12 -12
  509. package/scripts/lane/lane-cli.ts +12 -13
  510. package/scripts/lane/lane-close.ts +6 -6
  511. package/scripts/lane/lane-dispatch.ts +61 -72
  512. package/scripts/lane/lane-environment.ts +5 -5
  513. package/scripts/lane/lane-guard-policy.ts +7 -21
  514. package/scripts/lane/lane-handoff.ts +2 -2
  515. package/scripts/lane/lane-install.ts +9 -10
  516. package/scripts/lane/lane-launch-cli.ts +13 -8
  517. package/scripts/lane/lane-ledger.ts +73 -11
  518. package/scripts/lane/lane-leftover.ts +2 -2
  519. package/scripts/lane/lane-limit-cli.ts +160 -0
  520. package/scripts/lane/lane-limit-override.ts +74 -0
  521. package/scripts/lane/lane-load.ts +19 -68
  522. package/scripts/lane/lane-measure-cli.ts +15 -25
  523. package/scripts/lane/lane-occupancy.ts +6 -4
  524. package/scripts/lane/lane-open.ts +20 -19
  525. package/scripts/lane/lane-output.ts +4 -3
  526. package/scripts/lane/lane-paths.ts +12 -11
  527. package/scripts/lane/lane-phase.ts +33 -0
  528. package/scripts/lane/lane-reap.ts +2 -2
  529. package/scripts/lane/lane-registry.ts +16 -15
  530. package/scripts/lane/lane-relaunch.ts +9 -9
  531. package/scripts/lane/lane-report.ts +5 -4
  532. package/scripts/lane/lane-resume.ts +2 -2
  533. package/scripts/lane/lane-sampler.ts +55 -0
  534. package/scripts/lane/lane-seed.ts +7 -7
  535. package/scripts/lane/lane-stage-stats.ts +135 -0
  536. package/scripts/lane/lane-start-point.ts +8 -11
  537. package/scripts/lane/lane-stats.ts +60 -15
  538. package/scripts/lane/lane-stray.ts +1 -1
  539. package/scripts/lane/lane-vacant.ts +1 -1
  540. package/scripts/lane/openai-lane-supervisor-decision.ts +3 -7
  541. package/scripts/lane/openai-lane-supervisor-owner.ts +3 -9
  542. package/scripts/lane/openai-review-broker.ts +2 -4
  543. package/scripts/lib/ancestor-directories.ts +1 -1
  544. package/scripts/lib/bounded-pool.ts +2 -2
  545. package/scripts/lib/buffered-process.ts +4 -6
  546. package/scripts/lib/caddy-logs.sh +0 -0
  547. package/scripts/lib/cli-flags.ts +39 -6
  548. package/scripts/lib/error-message.ts +1 -1
  549. package/scripts/lib/json-value.ts +17 -3
  550. package/scripts/lib/poll.ts +1 -1
  551. package/scripts/lib/status-icons.ts +3 -3
  552. package/scripts/lib/timed-fetch.ts +1 -1
  553. package/scripts/lib/timeouts.ts +1 -1
  554. package/scripts/lines/bytes-command.ts +3 -4
  555. package/scripts/lines/effective-limit.ts +25 -12
  556. package/scripts/lines/line-budget.ts +47 -55
  557. package/scripts/lines/line-targets.ts +6 -2
  558. package/scripts/lines/lines-command.ts +3 -3
  559. package/scripts/lint/cross-file-recheck.ts +155 -0
  560. package/scripts/lint/cspell-cached.ts +1 -1
  561. package/scripts/lint/format.ts +1 -2
  562. package/scripts/lint/lint-parallel.ts +35 -19
  563. package/scripts/lint/lint-related-scope.ts +25 -15
  564. package/scripts/lint/lint-related.ts +6 -7
  565. package/scripts/managed-marker/index.ts +1 -1
  566. package/scripts/managed-marker/managed-marker-logic.ts +1 -2
  567. package/scripts/notify/git-notify.ts +9 -7
  568. package/scripts/notify/telegram-notify.ts +53 -37
  569. package/scripts/notify/telegram-test-logic.ts +3 -3
  570. package/scripts/notify/telegram-test.ts +45 -30
  571. package/scripts/observations/observation-ledger-home.ts +14 -8
  572. package/scripts/observations/observation-ledger-line.ts +3 -2
  573. package/scripts/observations/observation-ledger-migrate.ts +3 -4
  574. package/scripts/observations/observation-ledger-prepare.ts +4 -4
  575. package/scripts/observations/observation-ledger.ts +14 -15
  576. package/scripts/observations/observation-record-cli.ts +83 -0
  577. package/scripts/observations/observation-record.ts +91 -0
  578. package/scripts/observations/observations-flush-cli.ts +1 -1
  579. package/scripts/observations/observations-flush-landing.ts +7 -6
  580. package/scripts/observations/observations-flush.ts +26 -27
  581. package/scripts/overrides/overrides-check.ts +18 -8
  582. package/scripts/package/package-scout-cli.ts +1 -1
  583. package/scripts/package/package-scout-format.ts +2 -2
  584. package/scripts/package/package-scout.ts +1 -1
  585. package/scripts/propagate/propagate-git-failure.ts +1 -1
  586. package/scripts/propagate/propagate-git.ts +7 -7
  587. package/scripts/propagate/propagate-plan.ts +2 -2
  588. package/scripts/propagate/propagate-publish.ts +2 -3
  589. package/scripts/propagate/propagate-run.ts +5 -7
  590. package/scripts/propagate/propagate-select.ts +1 -1
  591. package/scripts/propagate/propagate-steps.ts +19 -20
  592. package/scripts/propagate/propagate-targets.ts +6 -10
  593. package/scripts/propagate/propagate.ts +5 -5
  594. package/scripts/refactor/import-graph.ts +1 -1
  595. package/scripts/refactor/refactor-lint.ts +4 -10
  596. package/scripts/refactor/refactor-scan-cli.ts +1 -1
  597. package/scripts/refactor/refactor-scan.ts +2 -2
  598. package/scripts/refactor/refactor-targets.ts +1 -1
  599. package/scripts/release/github-release-cli.ts +25 -3
  600. package/scripts/release/github-release-runs.ts +1 -1
  601. package/scripts/release/release-cli.ts +21 -4
  602. package/scripts/release/release-history.ts +6 -10
  603. package/scripts/release/release-plan.ts +3 -3
  604. package/scripts/release/release-progress.ts +3 -4
  605. package/scripts/release/release-publish.ts +8 -9
  606. package/scripts/release/release-scope-cli.ts +8 -10
  607. package/scripts/release/release-tag.ts +6 -8
  608. package/scripts/release/release-worktree.ts +5 -5
  609. package/scripts/repo/auto-merge-setting-logic.ts +7 -9
  610. package/scripts/repo/auto-merge-setting.ts +1 -1
  611. package/scripts/repo/repo-setting.ts +4 -4
  612. package/scripts/repo/repository-labels.ts +1 -1
  613. package/scripts/repo/required-checks-logic.ts +3 -3
  614. package/scripts/repo/required-checks-report.ts +1 -1
  615. package/scripts/repo/ruleset-check-cli.ts +1 -1
  616. package/scripts/repo/ruleset-check.ts +1 -1
  617. package/scripts/report/report-format-reference.ts +26 -0
  618. package/scripts/report/report-lint-cli.ts +2 -2
  619. package/scripts/report/report-lint.ts +16 -2
  620. package/scripts/review/disposition-cli.ts +2 -2
  621. package/scripts/review/disposition-logic.ts +1 -1
  622. package/scripts/review/live-evidence.ts +9 -6
  623. package/scripts/review/review-attest-cli.ts +1 -2
  624. package/scripts/review/review-attest.ts +3 -3
  625. package/scripts/review/review-brief-cli.ts +19 -20
  626. package/scripts/review/review-brief.ts +29 -32
  627. package/scripts/review/review-checkout.ts +2 -2
  628. package/scripts/review/review-diff-parts.ts +3 -5
  629. package/scripts/review/review-diff-write.ts +1 -1
  630. package/scripts/review/review-finding-ledger.ts +7 -4
  631. package/scripts/review/review-findings-cli.ts +2 -2
  632. package/scripts/review/review-level.ts +4 -7
  633. package/scripts/review/review-record-cli.ts +73 -16
  634. package/scripts/review/review-record.ts +5 -4
  635. package/scripts/review/review-round2-cli.ts +2 -3
  636. package/scripts/review/review-round2.ts +13 -21
  637. package/scripts/review/review-stamps.ts +9 -71
  638. package/scripts/review/review-tree.ts +4 -5
  639. package/scripts/rules/bash-triggers.ts +4 -4
  640. package/scripts/rules/decision-oracle-batch.ts +6 -7
  641. package/scripts/rules/decision-oracle-stage.ts +1 -1
  642. package/scripts/rules/decision-oracle-tokens.ts +1 -2
  643. package/scripts/rules/decision-oracle.ts +2 -2
  644. package/scripts/rules/delivered-rules.ts +61 -406
  645. package/scripts/rules/destructive-command.ts +2 -2
  646. package/scripts/rules/direct-filing.ts +4 -4
  647. package/scripts/rules/direct-pr-create.ts +2 -2
  648. package/scripts/rules/early-heartbeat.ts +15 -19
  649. package/scripts/rules/file-body.ts +5 -6
  650. package/scripts/rules/filing-cap.ts +6 -7
  651. package/scripts/rules/filing-offer.ts +1 -1
  652. package/scripts/rules/firing-point.ts +6 -6
  653. package/scripts/rules/gh-api.ts +2 -2
  654. package/scripts/rules/git-argv.ts +3 -3
  655. package/scripts/rules/git-force.ts +2 -2
  656. package/scripts/rules/hook-context-line.ts +31 -0
  657. package/scripts/rules/implementation-cut-verdict.ts +5 -8
  658. package/scripts/rules/implementation-cut.ts +35 -32
  659. package/scripts/rules/index-guard.ts +2 -2
  660. package/scripts/rules/issue-citation.ts +7 -7
  661. package/scripts/rules/issue-comments.ts +21 -13
  662. package/scripts/rules/josh-git-bare.ts +2 -2
  663. package/scripts/rules/lane-background.ts +14 -16
  664. package/scripts/rules/lane-carry-conflict.ts +41 -5
  665. package/scripts/rules/lane-interactive-ask.ts +6 -9
  666. package/scripts/rules/lane-park.ts +12 -16
  667. package/scripts/rules/lane-split-park.ts +1 -2
  668. package/scripts/rules/lane-switch-main.ts +10 -13
  669. package/scripts/rules/last-prompt.ts +1 -1
  670. package/scripts/rules/oracle-consulted.ts +5 -5
  671. package/scripts/rules/oracle-firing.ts +6 -9
  672. package/scripts/rules/oracle-list-cli.ts +2 -2
  673. package/scripts/rules/permission-guards.ts +2 -2
  674. package/scripts/rules/piped-verification.ts +79 -9
  675. package/scripts/rules/poll-loop.ts +9 -11
  676. package/scripts/rules/pre-gate-cut.ts +33 -30
  677. package/scripts/rules/prior-comment-read.ts +3 -3
  678. package/scripts/rules/protected-files.ts +25 -13
  679. package/scripts/rules/raw-field-body.ts +3 -4
  680. package/scripts/rules/reply-language.ts +1 -1
  681. package/scripts/rules/rule-body-guard.ts +10 -12
  682. package/scripts/rules/rule-guard.ts +1 -1
  683. package/scripts/rules/rule-list.ts +51 -0
  684. package/scripts/rules/rule-registry-rows.ts +282 -0
  685. package/scripts/rules/rule-registry.ts +109 -0
  686. package/scripts/rules/rule-value-cache.ts +2 -2
  687. package/scripts/rules/rule-value-cli.ts +6 -4
  688. package/scripts/rules/rule-value.ts +61 -22
  689. package/scripts/rules/run-tail-rule.ts +11 -15
  690. package/scripts/rules/shell-body-trigger.ts +7 -7
  691. package/scripts/rules/shell-segments.ts +2 -4
  692. package/scripts/rules/stop-rules.ts +54 -41
  693. package/scripts/rules/tail-commands.ts +1 -1
  694. package/scripts/rules/test-declared-commit.ts +2 -2
  695. package/scripts/rules/third-party-write.ts +3 -3
  696. package/scripts/rules/worktree-guard.ts +12 -5
  697. package/scripts/run/add/run-add-cli.ts +165 -0
  698. package/scripts/run/add/run-add.ts +124 -0
  699. package/scripts/run/board/run-board-cli.ts +207 -0
  700. package/scripts/run/board/run-board-closed.ts +95 -0
  701. package/scripts/run/board/run-board-every.ts +60 -0
  702. package/scripts/run/board/run-board-fetch.ts +38 -0
  703. package/scripts/run/board/run-board-fit.ts +219 -0
  704. package/scripts/run/board/run-board-github.ts +162 -0
  705. package/scripts/run/board/run-board-header.ts +275 -0
  706. package/scripts/run/board/run-board-kind.ts +35 -0
  707. package/scripts/run/board/run-board-labels.ts +299 -0
  708. package/scripts/run/board/run-board-layout.ts +222 -0
  709. package/scripts/run/board/run-board-link.ts +31 -0
  710. package/scripts/run/board/run-board-machine.ts +198 -0
  711. package/scripts/run/board/run-board-notes.ts +103 -0
  712. package/scripts/run/board/run-board-phase.ts +136 -0
  713. package/scripts/run/board/run-board-plan.ts +129 -0
  714. package/scripts/run/board/run-board-read.ts +62 -0
  715. package/scripts/run/board/run-board-render-legend.ts +82 -0
  716. package/scripts/run/board/run-board-render-notes.ts +77 -0
  717. package/scripts/run/board/run-board-render-slot.ts +50 -0
  718. package/scripts/run/board/run-board-render.ts +407 -0
  719. package/scripts/run/board/run-board-scope.ts +17 -0
  720. package/scripts/run/board/run-board-screen.ts +43 -0
  721. package/scripts/run/board/run-board-span.ts +66 -0
  722. package/scripts/run/board/run-board-spin.ts +115 -0
  723. package/scripts/run/board/run-board-state.ts +113 -0
  724. package/scripts/run/board/run-board-status.ts +279 -0
  725. package/scripts/run/board/run-board-tick.ts +210 -0
  726. package/scripts/run/board/run-board-track.ts +22 -0
  727. package/scripts/run/board/run-board-usage-read.ts +255 -0
  728. package/scripts/run/board/run-board-usage-rusage.ts +124 -0
  729. package/scripts/run/board/run-board-usage-text.ts +80 -0
  730. package/scripts/run/board/run-board-usage.ts +165 -0
  731. package/scripts/run/carry/run-carry-added.ts +62 -0
  732. package/scripts/run/carry/run-carry-args.ts +25 -22
  733. package/scripts/run/carry/run-carry-change.ts +1 -1
  734. package/scripts/run/carry/run-carry-cli.ts +71 -48
  735. package/scripts/run/carry/run-carry-conversation.ts +6 -7
  736. package/scripts/run/carry/run-carry-ended.ts +85 -0
  737. package/scripts/run/carry/run-carry-reclaim.ts +1 -1
  738. package/scripts/run/carry/run-carry-stash.ts +3 -2
  739. package/scripts/run/carry/run-carry-streak.ts +8 -10
  740. package/scripts/run/carry/run-carry.ts +85 -89
  741. package/scripts/run/cut/run-cut-args.ts +7 -7
  742. package/scripts/run/cut/run-cut-cli.ts +54 -36
  743. package/scripts/run/cut/run-cut-handoff.ts +15 -15
  744. package/scripts/run/cut/run-cut-report.ts +37 -16
  745. package/scripts/run/cut/run-cut.ts +63 -77
  746. package/scripts/run/detached-launch.ts +35 -50
  747. package/scripts/run/entry/run-entry-cli.ts +48 -27
  748. package/scripts/run/entry/run-entry-stop.ts +7 -9
  749. package/scripts/run/entry/run-entry.ts +5 -6
  750. package/scripts/run/event/run-event-cli.ts +5 -6
  751. package/scripts/run/event/run-event-filed.ts +69 -0
  752. package/scripts/run/event/run-event-follow.ts +3 -3
  753. package/scripts/run/event/run-event-plan.ts +38 -0
  754. package/scripts/run/event/run-event-render.ts +9 -4
  755. package/scripts/run/event/run-event-scope.ts +47 -18
  756. package/scripts/run/event/run-event-stream-emit.ts +64 -11
  757. package/scripts/run/event/run-event-stream.ts +171 -46
  758. package/scripts/run/event/run-event-watch.ts +4 -6
  759. package/scripts/run/hold/run-hold-cli.ts +65 -62
  760. package/scripts/run/hold/run-hold.ts +88 -46
  761. package/scripts/run/merge/run-merge-cli.ts +116 -77
  762. package/scripts/run/merge/run-merge-collect.ts +107 -0
  763. package/scripts/run/merge/run-merge-steps.ts +112 -65
  764. package/scripts/run/merge/run-merge-token.ts +30 -0
  765. package/scripts/run/merge/run-merge.ts +31 -22
  766. package/scripts/run/progress/run-progress-args.ts +4 -4
  767. package/scripts/run/progress/run-progress-cli.ts +39 -50
  768. package/scripts/run/progress/run-progress-clock.ts +25 -32
  769. package/scripts/run/progress/run-progress-config.ts +6 -9
  770. package/scripts/run/progress/run-progress-read.ts +9 -10
  771. package/scripts/run/progress/run-progress.ts +48 -53
  772. package/scripts/run/review/run-review-cli.ts +6 -6
  773. package/scripts/run/review/run-review-steps.ts +6 -6
  774. package/scripts/run/review/run-review.ts +9 -11
  775. package/scripts/run/run-cli-fault.ts +29 -0
  776. package/scripts/run/run-ending-cli.ts +3 -3
  777. package/scripts/run/run-ending.ts +10 -14
  778. package/scripts/run/run-halfrun-resume.ts +6 -8
  779. package/scripts/run/run-headless.ts +26 -12
  780. package/scripts/run/run-invocation.ts +17 -22
  781. package/scripts/run/run-label.ts +7 -5
  782. package/scripts/run/run-liveness-cli.ts +19 -6
  783. package/scripts/run/run-liveness.ts +27 -38
  784. package/scripts/run/run-next-cli.ts +5 -9
  785. package/scripts/run/run-next.ts +4 -5
  786. package/scripts/run/run-parent-cut-hook.ts +10 -12
  787. package/scripts/run/run-preflight.ts +25 -29
  788. package/scripts/run/run-prep-cli.ts +17 -13
  789. package/scripts/run/run-prep-locate.ts +4 -5
  790. package/scripts/run/run-prep.ts +7 -10
  791. package/scripts/run/run-prrun-resume.ts +2 -2
  792. package/scripts/run/run-report-cli.ts +4 -4
  793. package/scripts/run/run-report.ts +9 -14
  794. package/scripts/run/run-retrospective.ts +3 -3
  795. package/scripts/run/run-section.ts +42 -0
  796. package/scripts/run/run-stage-read.ts +2 -2
  797. package/scripts/run/run-stage.ts +6 -4
  798. package/scripts/run/run-status-cli.ts +7 -5
  799. package/scripts/run/run-status.ts +6 -7
  800. package/scripts/run/run-step-cli.ts +64 -18
  801. package/scripts/run/run-step.ts +107 -51
  802. package/scripts/run/run-stop-notify.ts +7 -8
  803. package/scripts/run/run-stranded-cli.ts +1 -1
  804. package/scripts/run/run-stranded-detect.ts +4 -4
  805. package/scripts/run/run-stranded.ts +11 -13
  806. package/scripts/run/run-tail-cli.ts +15 -16
  807. package/scripts/run/run-tail.ts +14 -33
  808. package/scripts/run/run-watcher-guard-cli.ts +3 -4
  809. package/scripts/run/run-watcher-guard.ts +11 -12
  810. package/scripts/run/run-watcher-hook.ts +6 -12
  811. package/scripts/run/ship/run-ship-cli.ts +67 -33
  812. package/scripts/run/ship/run-ship-detach.ts +15 -13
  813. package/scripts/run/ship/run-ship-lock.ts +1 -1
  814. package/scripts/run/ship/run-ship-next.ts +7 -8
  815. package/scripts/run/ship/run-ship-pre-detach.ts +27 -11
  816. package/scripts/run/ship/run-ship-preflight.ts +10 -11
  817. package/scripts/run/ship/run-ship-probe.ts +4 -4
  818. package/scripts/run/ship/run-ship-return.ts +1 -1
  819. package/scripts/run/ship/run-ship-review-steps.ts +43 -24
  820. package/scripts/run/ship/run-ship-review.ts +12 -14
  821. package/scripts/run/ship/run-ship-scoped.ts +15 -6
  822. package/scripts/run/ship/run-ship-stage.ts +80 -26
  823. package/scripts/run/ship/run-ship-steps.ts +26 -16
  824. package/scripts/run/ship/run-ship-stop-text.ts +4 -2
  825. package/scripts/run/ship/run-ship-sync.ts +9 -8
  826. package/scripts/run/ship/run-ship.ts +17 -32
  827. package/scripts/run/tidy/run-tidy-cli.ts +9 -5
  828. package/scripts/run/tidy/run-tidy-lanes.ts +18 -7
  829. package/scripts/run/tidy/run-tidy-stashes.ts +8 -8
  830. package/scripts/run/tidy/run-tidy.ts +4 -3
  831. package/scripts/run/wake/run-wake-cli.ts +27 -32
  832. package/scripts/run/wake/run-wake-describe.ts +24 -28
  833. package/scripts/run/wake/run-wake-driver.ts +14 -14
  834. package/scripts/run/wake/run-wake-handoff.ts +6 -6
  835. package/scripts/run/wake/run-wake-loop.ts +9 -9
  836. package/scripts/run/wake/run-wake-restart.ts +4 -5
  837. package/scripts/run/wake/run-wake-session.ts +23 -27
  838. package/scripts/run/wake/run-wake.ts +57 -279
  839. package/scripts/safe-chain/ci-installer-pin.ts +3 -3
  840. package/scripts/safe-chain/pack-hook.ts +2 -2
  841. package/scripts/safe-chain/preinstall-command.ts +2 -2
  842. package/scripts/security/security-audit-logic.ts +1 -1
  843. package/scripts/security/security-audit-provision-logic.ts +1 -1
  844. package/scripts/security/security-audit-provision.ts +2 -2
  845. package/scripts/security/security-audit.ts +5 -5
  846. package/scripts/security/security-updates-logic.ts +2 -3
  847. package/scripts/security/security-updates.ts +2 -4
  848. package/scripts/self-sync-guard/index.ts +1 -1
  849. package/scripts/self-sync-guard/self-sync-guard-logic.ts +2 -2
  850. package/scripts/self-sync-guard/self-sync-refusal.ts +1 -1
  851. package/scripts/sonar/sonar-hotspots-cli.ts +1 -1
  852. package/scripts/sonar/sonar-hotspots.ts +1 -1
  853. package/scripts/sonar/sonar-new-code-cli.ts +1 -1
  854. package/scripts/sonar/sonar-new-code.ts +1 -1
  855. package/scripts/sonar/sonar-project.ts +1 -1
  856. package/scripts/split/split-assess-cli.ts +1 -1
  857. package/scripts/split/split-assess.ts +3 -3
  858. package/scripts/sync/directory-copy-guard.ts +2 -3
  859. package/scripts/sync/managed-config-scope-cli.ts +1 -2
  860. package/scripts/sync/managed-config-scope.ts +4 -4
  861. package/scripts/sync/plugin-skill-directories.ts +2 -2
  862. package/scripts/sync/reconcile-templates.ts +17 -8
  863. package/scripts/sync/removed-skill-manifest.ts +2 -3
  864. package/scripts/sync/sync-ai-files.ts +7 -7
  865. package/scripts/sync/sync-configs.ts +30 -3
  866. package/scripts/sync/sync-hook-safety.ts +2 -2
  867. package/scripts/sync/sync.ts +23 -10
  868. package/scripts/sync/synced-paths.ts +2 -1
  869. package/scripts/sync/workflow-pin-logic.ts +1 -1
  870. package/scripts/test/test-declared-changed.ts +4 -4
  871. package/scripts/test/test-declared-logic.ts +2 -3
  872. package/scripts/test/test-declared-match.ts +25 -4
  873. package/scripts/test/test-declared.ts +26 -9
  874. package/scripts/test/test-red-commit.ts +3 -2
  875. package/scripts/test/test-red-logic.ts +7 -14
  876. package/scripts/test/test-red.ts +12 -47
  877. package/scripts/test/test-related-scope.ts +2 -3
  878. package/scripts/test/test-related.ts +3 -3
  879. package/scripts/test/test-type-logic.ts +1 -2
  880. package/scripts/test/test-unit-guard.ts +13 -17
  881. package/scripts/test/unit-worker-share.ts +7 -8
  882. package/scripts/time-runtime/time-agent-bundles.ts +2 -4
  883. package/scripts/time-runtime/time-background.ts +17 -21
  884. package/scripts/time-runtime/time-batch-guard.ts +67 -342
  885. package/scripts/time-runtime/time-bundle-call.ts +26 -28
  886. package/scripts/time-runtime/time-bundles.ts +11 -12
  887. package/scripts/time-runtime/time-call-identity.ts +1 -1
  888. package/scripts/time-runtime/time-command-key.ts +2 -2
  889. package/scripts/time-runtime/time-density-hook.ts +8 -11
  890. package/scripts/time-runtime/time-density.ts +5 -5
  891. package/scripts/time-runtime/time-followup-stage.ts +7 -7
  892. package/scripts/time-runtime/time-format.ts +5 -5
  893. package/scripts/time-runtime/time-hook-transcript.ts +3 -3
  894. package/scripts/time-runtime/time-instant.ts +1 -1
  895. package/scripts/time-runtime/time-markers.ts +15 -19
  896. package/scripts/time-runtime/time-phase-names.ts +3 -3
  897. package/scripts/time-runtime/time-reported-failure.ts +15 -19
  898. package/scripts/time-runtime/time-round-trips.ts +20 -23
  899. package/scripts/time-runtime/time-shell.ts +8 -8
  900. package/scripts/time-runtime/time-single-check.ts +1 -2
  901. package/scripts/time-runtime/time-spans.ts +35 -40
  902. package/scripts/time-runtime/time-tool-call.ts +15 -16
  903. package/scripts/time-runtime/time-transcript-line.ts +53 -34
  904. package/scripts/time-runtime/time-writes.ts +5 -5
  905. package/scripts/ui/ui-routes-cli.ts +1 -2
  906. package/scripts/ui/ui-routes.ts +1 -2
  907. package/scripts/version/bump-version.ts +1 -1
  908. package/scripts/version/fresh-metadata-cache.ts +2 -2
  909. package/scripts/version/latest-corepack.ts +26 -26
  910. package/scripts/version/latest-lane-guard.ts +1 -1
  911. package/scripts/version/latest-scope-cli.ts +2 -2
  912. package/scripts/version/latest-stamp.ts +1 -2
  913. package/scripts/version/latest-update.ts +2 -2
  914. package/scripts/version/npm-registry.ts +2 -2
  915. package/scripts/version/package-manager-version.ts +18 -0
  916. package/scripts/version/publishable-range-check.ts +2 -1
  917. package/scripts/version/publishable-range.ts +1 -1
  918. package/scripts/version/release-age.ts +11 -11
  919. package/scripts/version/release-hold.ts +2 -2
  920. package/scripts/version/safe-chain-version-update.ts +3 -3
  921. package/scripts/version/version-check-logic.ts +2 -3
  922. package/scripts/version/version-check.ts +1 -2
  923. package/scripts/version/version-command-config.ts +2 -2
  924. package/scripts/version/version-commands.ts +3 -3
  925. package/scripts/version/version-remote.ts +4 -4
  926. package/scripts/version/version-targets.ts +2 -2
  927. package/templates/gitignore +7 -0
  928. package/dist/hooks/chunk-KHX4U3BG.js +0 -6400
  929. package/dist/hooks/chunk-RKUAD3I6.js +0 -90
  930. package/dist/hooks/chunk-WPALEIRX.js +0 -18
  931. package/scripts/backlog/backlog-restructure.ts +0 -152
  932. package/scripts/rules/issue-fold-rule.ts +0 -72
  933. package/scripts/rules/wip-cap.ts +0 -63
  934. package/scripts/run/run-issue-number.ts +0 -19
@@ -4,10 +4,11 @@ import { composite_arguments, USAGE_ERROR_EXIT_CODE } from '#scripts/josh/josh-c
4
4
  import { error_text } from '#scripts/lib/error-message'
5
5
  import { git_command } from './git-command'
6
6
  import { gone_branch, type PruneResult } from './gone-branch'
7
+ import { lockfile_sync } from './lockfile-sync'
7
8
 
8
- // `josh main:sync` (`josh ms`) — return this checkout to the default branch and pull
9
- // (joshuafolkken/kit#1535), then prune the local branches whose merged remote branch is gone
10
- // (joshuafolkken/kit#2504; the rule for which ones is `gone-branch.ts`).
9
+ // `josh main:sync` (`josh ms`) — return this checkout to the default branch and pull,
10
+ // then prune the local branches whose merged remote branch is gone
11
+ // (the rule for which ones is `gone-branch.ts`).
11
12
  //
12
13
  // **It refuses inside a linked work tree, and that refusal is the reason this stopped being a
13
14
  // one-line `sh -c` entry.** The default branch is a *branch*: advancing it means checking it out
@@ -28,6 +29,8 @@ const SUCCESS_EXIT_CODE = 0
28
29
  const FAILURE_EXIT_CODE = 1
29
30
  const ARGV_OFFSET = 2
30
31
  const COMMAND_NAME = 'main:sync'
32
+ const INSTALL_FAILURE =
33
+ 'node_modules is behind pnpm-lock.yaml and `pnpm install --frozen-lockfile` failed; run `pnpm josh ms` again, or the install here by hand.'
31
34
 
32
35
  // `git_directories()` returns `[--absolute-git-dir, --git-common-dir]`. They are the same path in the
33
36
  // main work tree and differ in a linked one, which is git's own definition of the distinction rather
@@ -70,12 +73,12 @@ async function prune_quietly(default_branch: string): Promise<void> {
70
73
  }
71
74
  }
72
75
 
73
- // **The local default branch is fast-forwarded before it is checked out** (joshuafolkken/kit#2979).
76
+ // **The local default branch is fast-forwarded before it is checked out**.
74
77
  // A run's ledger file is committed on its feature branch and merged; a line appended afterwards leaves
75
78
  // it dirty, and git refuses to check out a stale default branch that lacks the file — so `run:tail`'s
76
- // sync failed exactly when the flush after it had work. Once fast-forwarded, the default branch holds
77
- // the committed file and the checkout carries the dirty lines over (the same step the flush takes,
78
- // joshuafolkken/kit#2462). Skipped on the default branch, where `fetch` refuses to update the checked-out
79
+ // sync would fail exactly when the flush after it had work. Once fast-forwarded, the default branch
80
+ // holds the committed file and the checkout carries the dirty lines over (the same step the flush
81
+ // takes). Skipped on the default branch, where `fetch` refuses to update the checked-out
79
82
  // ref; a refusal elsewhere — a local default ahead of origin — is left to the checkout and pull to judge.
80
83
  async function fast_forward_quietly(default_branch: string): Promise<void> {
81
84
  if ((await git_command.branch()) === default_branch) return
@@ -87,6 +90,18 @@ async function fast_forward_quietly(default_branch: string): Promise<void> {
87
90
  }
88
91
  }
89
92
 
93
+ // A pull that changed the lock leaves `node_modules` behind it, and every `josh` typed in this checkout
94
+ // then fails to load the new dependency — so the install the lock now asks for
95
+ // is part of the sync, and its failure is the sync's. A failed one is retried by the next `ms`.
96
+ async function reinstall(root: string): Promise<number> {
97
+ const result = await lockfile_sync.reinstall_if_stale(root)
98
+
99
+ if (result.is_installed) return SUCCESS_EXIT_CODE
100
+ console.error(`${INSTALL_FAILURE}\n${result.output}`)
101
+
102
+ return FAILURE_EXIT_CODE
103
+ }
104
+
90
105
  async function synchronize(): Promise<number> {
91
106
  const default_branch = await git_command.get_default_branch()
92
107
 
@@ -96,7 +111,7 @@ async function synchronize(): Promise<number> {
96
111
  await prune_quietly(default_branch)
97
112
  console.info(default_branch)
98
113
 
99
- return SUCCESS_EXIT_CODE
114
+ return await reinstall(await git_command.repository_root())
100
115
  }
101
116
 
102
117
  // The argument refusal is kept even though this is no longer an `sh -c` entry: the message is the
@@ -1,17 +1,12 @@
1
+ import { json_value } from '#scripts/lib/json-value'
1
2
  import type { z } from 'zod'
2
3
 
3
- // Marks input that is not JSON at all, letting each caller pick its own empty value. Schema
4
- // mismatches are deliberately not folded in here: those rethrow, so a shape change stays visible
5
- // instead of silently degrading to a fallback.
6
- const MALFORMED_JSON = Symbol('malformed-json')
7
-
4
+ // Input that is not JSON at all reads as `undefined`, letting each caller pick its own empty value.
5
+ // Schema mismatches are deliberately not folded in here: those rethrow, so a shape change stays
6
+ // visible instead of silently degrading to a fallback. A reader that wants both gaps as `undefined`
7
+ // is `json_value.parse_with`.
8
8
  function parse_json_loose(raw_json: string): unknown {
9
- try {
10
- return JSON.parse(raw_json)
11
- } catch (error) {
12
- if (error instanceof SyntaxError) return MALFORMED_JSON
13
- throw error
14
- }
9
+ return json_value.parse_or_undefined(raw_json)
15
10
  }
16
11
 
17
12
  /**
@@ -19,8 +14,7 @@ function parse_json_loose(raw_json: string): unknown {
19
14
  * Malformed JSON yields undefined, so a caller can tell it apart from an empty listing.
20
15
  *
21
16
  * `parse_json_array_safe` answers `[]` for both, which reads as "there is nothing" — and a command
22
- * that acts on that reports a confident absence built on a response it could not parse
23
- * (joshuafolkken/kit#950).
17
+ * that acts on that reports a confident absence built on a response it could not parse.
24
18
  */
25
19
  function parse_json_array_or_undefined<T>(
26
20
  raw_json: string,
@@ -30,14 +24,14 @@ function parse_json_array_or_undefined<T>(
30
24
  // Not an array at all — `gh` answering `{"message":"API rate limit exceeded"}` rather than a
31
25
  // listing. That is the same kind of gap as unparseable output, not a change in the shape of the
32
26
  // elements, so it reads as unreadable instead of throwing out of the command.
33
- if (value === MALFORMED_JSON || !Array.isArray(value)) return undefined
27
+ if (!Array.isArray(value)) return undefined
34
28
 
35
29
  return element_schema.array().parse(value)
36
30
  }
37
31
 
38
32
  // What one listing read produced. The two gaps are deliberately apart: JSON that is not a listing at
39
33
  // all is an access or connectivity problem, while elements the schema rejects mean the tool's fields
40
- // changed — and those send a reader to two different places (joshuafolkken/kit#996). A caller that
34
+ // changed — and those send a reader to two different places. A caller that
41
35
  // treats them the same still reads them from here rather than writing the try/catch again.
42
36
  type ListingRead<T> =
43
37
  { kind: 'read'; rows: Array<T> } | { kind: 'unreadable' } | { kind: 'unexpected_shape' }
@@ -47,7 +41,7 @@ type ListingRead<T> =
47
41
  *
48
42
  * The rethrow `parse_json_array_or_undefined` performs is the whole point, and every caller that
49
43
  * wants both gaps named was catching it itself — the `auto-ok` pickup and `epic:next`'s
50
- * repository-level busy check wrote the same six lines (joshuafolkken/kit#925).
44
+ * repository-level busy check wrote the same six lines.
51
45
  */
52
46
  function read_json_listing<T>(raw_json: string, element_schema: z.ZodType<T>): ListingRead<T> {
53
47
  try {
@@ -66,34 +60,35 @@ function read_json_listing<T>(raw_json: string, element_schema: z.ZodType<T>): L
66
60
  * Deliberately **not** `parse_json_array_or_undefined(...) ?? []`, near-identical though the bodies
67
61
  * are. The two differ on the branch that matters: valid JSON that is not an array throws here, so a
68
62
  * `gh` field that changed shape stays visible, while the variant above reads it as a gap. Folding
69
- * them together silences that throw for every existing caller (joshuafolkken/kit#950).
63
+ * them together silences that throw for every existing caller.
70
64
  */
71
65
  function parse_json_array_safe<T>(raw_json: string, element_schema: z.ZodType<T>): Array<T> {
72
66
  const value = parse_json_loose(raw_json)
73
- if (value === MALFORMED_JSON) return []
67
+ if (value === undefined) return []
74
68
 
75
69
  return element_schema.array().parse(value)
76
70
  }
77
71
 
78
72
  /**
79
73
  * Parse a JSON string into a single object validated by the given schema.
80
- * Malformed JSON yields undefined.
74
+ * Malformed JSON yields undefined; JSON the schema rejects throws, as the array readers above do —
75
+ * the name says only what it answers for text that is not JSON.
81
76
  */
82
- function parse_json_object_safe<T>(raw_json: string, schema: z.ZodType<T>): T | undefined {
77
+ function parse_json_object_or_undefined<T>(raw_json: string, schema: z.ZodType<T>): T | undefined {
83
78
  const value = parse_json_loose(raw_json)
84
- if (value === MALFORMED_JSON) return undefined
79
+ if (value === undefined) return undefined
85
80
 
86
81
  return schema.parse(value)
87
82
  }
88
83
 
89
84
  const parse_json = {
90
- parse_json_object_safe,
85
+ parse_json_object_or_undefined,
91
86
  }
92
87
 
93
88
  export {
94
89
  parse_json,
95
90
  parse_json_array_or_undefined,
96
91
  parse_json_array_safe,
97
- parse_json_object_safe,
92
+ parse_json_object_or_undefined,
98
93
  read_json_listing,
99
94
  }
@@ -8,13 +8,16 @@ import { json_value } from '#scripts/lib/json-value'
8
8
  import { git_common_directory } from './git-common-directory'
9
9
 
10
10
  // One holder at a time per repository, for work that every work tree of that repository shares
11
- // (joshuafolkken/kit#2701 for the stash sweep, joshuafolkken/kit#2736 for `git worktree add`). The
11
+ // (the stash sweep, `git worktree add`). The
12
12
  // record is keyed on the git common directory, so every work tree of one repository contends for one
13
13
  // record per lock name, and it lives in the platform temp root beside the other stamps rather than
14
14
  // inside `.git`. Each caller names its own lock with a prefix, so two unrelated kinds of work never
15
15
  // wait on each other.
16
16
 
17
17
  const POLL_INTERVAL_MS = 200
18
+ // The synchronous wait is for locks held for milliseconds, so it polls far more often.
19
+ const SYNC_POLL_INTERVAL_MS = 10
20
+ const SLEEP_CELL = new Int32Array(new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT))
18
21
 
19
22
  type IsGone = (owner: ProcessOwner) => boolean
20
23
 
@@ -117,6 +120,23 @@ async function acquire(target: string, max_wait_ms: number): Promise<boolean> {
117
120
  return true
118
121
  }
119
122
 
123
+ // A blocking wait for a caller that cannot await. `Atomics.wait` parks the thread without spinning, so
124
+ // a writer queued behind another costs no CPU while it waits.
125
+ function sleep_sync(ms: number): void {
126
+ Atomics.wait(SLEEP_CELL, 0, 0, ms)
127
+ }
128
+
129
+ function acquire_sync(target: string, max_wait_ms: number): boolean {
130
+ const deadline = Date.now() + max_wait_ms
131
+
132
+ while (!claim(target)) {
133
+ if (Date.now() >= deadline) return false
134
+ sleep_sync(SYNC_POLL_INTERVAL_MS)
135
+ }
136
+
137
+ return true
138
+ }
139
+
120
140
  // Runs `work` holding the lock at `target` and answers its result, or `undefined` without running it
121
141
  // when another holder kept the lock for the whole wait.
122
142
  async function with_lock<T>(
@@ -133,6 +153,18 @@ async function with_lock<T>(
133
153
  }
134
154
  }
135
155
 
136
- const repository_lock = { clear_stale, lock_path, with_lock }
156
+ // `with_lock` for synchronous work — a read-modify-write that holds the lock for milliseconds, whose
157
+ // callers are synchronous all the way up.
158
+ function with_lock_sync<T>(work: () => T, target: string, max_wait_ms: number): T | undefined {
159
+ if (!acquire_sync(target, max_wait_ms)) return undefined
160
+
161
+ try {
162
+ return work()
163
+ } finally {
164
+ release(target)
165
+ }
166
+ }
167
+
168
+ const repository_lock = { clear_stale, lock_path, with_lock, with_lock_sync }
137
169
 
138
170
  export { repository_lock }
@@ -1,7 +1,7 @@
1
1
  import { git_spawn } from '#scripts/git/git-spawn'
2
2
 
3
3
  // The one place a sanctioned `git stash pop` is targeted by its message rather than its stack
4
- // position (joshuafolkken/kit#2050). The stash is a single repository-wide stack shared by every
4
+ // position. The stash is a single repository-wide stack shared by every
5
5
  // working tree of the repository, so a bare `git stash pop` — or a positional `stash@{n}` read
6
6
  // before another lane pushed — pops whatever now sits on top, which is how one lane's parked work
7
7
  // ended up in another lane's tree. Resolving the selector from the message the stash was pushed
@@ -70,8 +70,7 @@ function select(entries: ReadonlyArray<StashEntry>, message: string): Selection
70
70
  }
71
71
 
72
72
  // The stash is a repository-level stack every work tree shares, so the list reads the same wherever
73
- // it runs; `dir` is what makes the pop land in the lane's tree rather than the primary checkout —
74
- // the `git -C <dir>` a lane child used to write by hand.
73
+ // it runs; `dir` is what makes the pop land in the lane's tree rather than the primary checkout.
75
74
  function git_args(directory: string | undefined, args: Array<string>): Array<string> {
76
75
  return directory === undefined ? args : ['-C', directory, ...args]
77
76
  }
@@ -97,7 +96,7 @@ async function has_conflict(directory?: string): Promise<boolean> {
97
96
  }
98
97
 
99
98
  // Uncommitted work is anything `git status --porcelain` lists — untracked files included, which is what
100
- // `push` below carries with `-u`, so the two agree on what "work" means (joshuafolkken/kit#2476).
99
+ // `push` below carries with `-u`, so the two agree on what "work" means.
101
100
  async function has_changes(directory?: string): Promise<boolean> {
102
101
  return (await git_spawn.read(git_args(directory, ['status', '--porcelain']))) !== ''
103
102
  }
@@ -108,7 +107,7 @@ async function push(message: string, directory?: string): Promise<void> {
108
107
  await git_spawn.read(git_args(directory, ['stash', 'push', '-u', '-m', message]))
109
108
  }
110
109
 
111
- // The stack keyed by commit rather than position (joshuafolkken/kit#2701): a sweep that reads the
110
+ // The stack keyed by commit rather than position: a sweep that reads the
112
111
  // stack, asks GitHub about each entry and only then drops one would drop whatever another lane pushed
113
112
  // on top in the meantime if it kept the `stash@{n}` it read first. The `selector` of each entry here is
114
113
  // its commit hash, which never moves.
@@ -1,7 +1,8 @@
1
+ import { session_cite } from '#scripts/issue/session-cite'
1
2
  import { run_preflight } from '#scripts/run/run-preflight'
2
3
  import type { StashEntry } from './git-stash'
3
4
 
4
- // Which stashes nobody is coming back for (joshuafolkken/kit#2505). A parked or paused run pushes its
5
+ // Which stashes nobody is coming back for. A parked or paused run pushes its
5
6
  // work with a message `josh stash:pop` later targets, but an issue closed by another route leaves that
6
7
  // entry with no run to pop it — the pile #2168 sorted by hand. This reads the owning issue out of each
7
8
  // entry's subject so the closed ones, and the ones with no readable owner, can be put in front of a
@@ -71,7 +72,7 @@ function message_issues(subject: string): Array<string | undefined> {
71
72
  return [...hashed, LEADING_PATTERN.exec(subject)?.groups?.['issue']]
72
73
  }
73
74
 
74
- // Every issue a subject names, not just its owner (joshuafolkken/kit#2701): `backlogrun: paused #M for
75
+ // Every issue a subject names, not just its owner: `backlogrun: paused #M for
75
76
  // prerequisite #N` is tied to both, and the `#N` of a `run:hold reclaimed before #N` entry — which
76
77
  // `issue_of` reads as no owner — still names the run the work was found by. A `WIP on` subject is
77
78
  // read by its branch alone, for the reason `WIP_PREFIX` records.
@@ -95,7 +96,8 @@ function orphans(
95
96
  }
96
97
 
97
98
  function format_line(orphan: OrphanStash): string {
98
- const owner = orphan.issue === undefined ? UNKNOWN_OWNER : `#${orphan.issue} closed`
99
+ const owner =
100
+ orphan.issue === undefined ? UNKNOWN_OWNER : `${session_cite.issue(orphan.issue)} closed`
99
101
 
100
102
  return ` ${[orphan.selector, owner, orphan.subject].join(COLUMN_SEPARATOR)}`
101
103
  }
@@ -3,7 +3,7 @@ import { cli_flags } from '#scripts/lib/cli-flags'
3
3
  // `josh stash:pop` turns its `argv` into a single request: the message of the stash to pop. Parsing
4
4
  // lives here, acting on the stack lives in `stash-pop-cli.ts`, and a malformed command line is
5
5
  // `undefined` rather than a guessed intent — a pop run on a misread argument would take the wrong
6
- // entry off a stack shared by every lane (joshuafolkken/kit#2050).
6
+ // entry off a stack shared by every lane.
7
7
 
8
8
  const USAGE = 'Usage: josh stash:pop "<message>" [--dir <path>]'
9
9
 
@@ -3,8 +3,8 @@ import { error_text } from '#scripts/lib/error-message'
3
3
  import { git_stash } from './git-stash'
4
4
  import { stash_pop_args, type Request } from './stash-pop-args'
5
5
 
6
- // `josh stash:pop "<message>"` — pop the stash whose message matches, and no other
7
- // (joshuafolkken/kit#2050). The stash stack is shared by every working tree of the repository, so a
6
+ // `josh stash:pop "<message>"` — pop the stash whose message matches, and no other.
7
+ // The stash stack is shared by every working tree of the repository, so a
8
8
  // procedure that pops by position takes whatever another lane last pushed. This resolves the
9
9
  // selector from the message and pops that entry alone; no match and more than one match are both
10
10
  // refusals rather than a guess at which was meant.
@@ -32,7 +32,7 @@ function refuse(): number {
32
32
  }
33
33
 
34
34
  // A pop that leaves unmerged paths applied the stash and only needs the conflicts resolved, so it is
35
- // reported `conflicted` at exit 0 rather than raised as an unknown failure (joshuafolkken/kit#2050);
35
+ // reported `conflicted` at exit 0 rather than raised as an unknown failure;
36
36
  // any other pop error is re-thrown for `run` to report. `has_conflict` reads the tree the pop wrote.
37
37
  async function pop_selected(selector: string, directory: string | undefined): Promise<number> {
38
38
  try {
@@ -1,10 +1,10 @@
1
1
  import { repository_lock } from '#scripts/git/repository-lock'
2
2
 
3
- // One stash sweep at a time per repository (joshuafolkken/kit#2701). The stash is a single stack every
3
+ // One stash sweep at a time per repository. The stash is a single stack every
4
4
  // work tree shares, and a `backlogrun` runs one sweep per lane seat at once: two sweeps that each
5
5
  // resolve the same entry to `stash@{n}` and drop it would have the second drop land on whichever entry
6
6
  // moved into that position, and two that carry the same ledger lines would both append them. The
7
- // locking itself is `repository-lock.ts`, shared with the work-tree writes (joshuafolkken/kit#2736).
7
+ // locking itself is `repository-lock.ts`, shared with the work-tree writes.
8
8
 
9
9
  const LOCK_PREFIX = 'josh-stash-sweep-lock-'
10
10
  // The locked phase is local git and one file append per entry, so a holder finishes in well under the
@@ -5,7 +5,7 @@ import { hook_decision } from '#scripts/josh/hook-decision'
5
5
  import { lane_guard_policy, type LaneGuardMode } from '#scripts/lane/lane-guard-policy'
6
6
  import { time_batch_guard, type GuardedCall } from '#scripts/time-runtime/time-batch-guard'
7
7
 
8
- // The disk half of the batching guard (joshuafolkken/kit#1390): find the transcript, read enough of
8
+ // The disk half of the batching guard: find the transcript, read enough of
9
9
  // its end, remember when a call was last refused, and write the refusal Claude Code understands.
10
10
  //
11
11
  // **It is a `PreToolUse` hook, and that is the point of the Issue.** The live density line rides
@@ -16,10 +16,9 @@ import { time_batch_guard, type GuardedCall } from '#scripts/time-runtime/time-b
16
16
  // **What the transcript holds is the turns already closed, and nothing usable about the one in hand.**
17
17
  // Claude Code writes one line per content block and starts the first tool as soon as that block parses,
18
18
  // so a turn's later `tool_use` lines do not exist yet — measured on a live session, they arrive 1.4 to
19
- // 15 seconds afterwards. The decision is therefore made from closed history alone;
20
- // `time-batch-guard.ts` → "What it cannot know" carries the measurement and what it costs.
19
+ // 15 seconds afterwards. The decision is therefore made from closed history alone.
21
20
  //
22
- // **The shell is `hook-decision.ts`, shared with the investigation guard** (joshuafolkken/kit#1460):
21
+ // **The shell is `hook-decision.ts`, shared with the investigation guard**:
23
22
  // the payload schema, the deny envelope, the switch, the `.env` load, the stamp that makes a refusal
24
23
  // unrepeatable, and the six steps every refusing hook takes in the same order. What stays here is this
25
24
  // guard's own rule and its own two names, and the seven exports below are unchanged so nothing that
@@ -36,14 +35,13 @@ const SWITCH_ENV_KEY = 'JOSH_BATCH_GUARD'
36
35
  // refuse and whether the run has stopped batching are both its, so a refusal here can never disagree
37
36
  // with the report the Issue's own verification step reads.
38
37
  // The transcript is read for a call the guard could act on either way: one it may refuse, or the one
39
- // whole-file write it may only notify about (joshuafolkken/kit#1848). The read is skipped for the rest
40
- // exactly as before — most of a run's calls are neither.
38
+ // whole-file write it may only notify about. The read is skipped for the rest
39
+ // — most of a run's calls are neither.
41
40
  function is_batch_candidate(call: GuardedCall): boolean {
42
41
  return time_batch_guard.is_guarded_call(call) || time_batch_guard.is_notice_call(call)
43
42
  }
44
43
 
45
- // **How the batching guard behaves for the session in hand, decided from the one-place enumeration**
46
- // (joshuafolkken/kit#2138, joshuafolkken/kit#2164, joshuafolkken/kit#2178, joshuafolkken/kit#2276).
44
+ // **How the batching guard behaves for the session in hand, decided from the one-place enumeration**.
47
45
  // Outside a lane child the mode is `refuse` and the guard is exactly what it always was; in a dispatched
48
46
  // lane child it is `notice` — kit#2178 took it to `off` after kit#2164's generic notice did not move the
49
47
  // density, and kit#2276 restores it as a notice that names the concrete recent calls and recurs every
@@ -72,7 +70,7 @@ function should_block_here(tail: string, call: GuardedCall, refused_at_ms: numbe
72
70
  return time_batch_guard.should_block(tail, call, refused_at_ms)
73
71
  }
74
72
 
75
- // The whole-file write earns a notice on every run (joshuafolkken/kit#1848). The second branch turns a
73
+ // The whole-file write earns a notice on every run. The second branch turns a
76
74
  // refusable call into a notice under a `notice`-mode guard, which is the mode batching takes in a lane
77
75
  // child again since kit#2276. Both read the notice's own record, so a notice never spends the refusal's
78
76
  // stamp and re-fires on the notice's own `NOTICE_REFIRE_EVERY` cadence.
@@ -88,8 +86,8 @@ function should_notify_here(tail: string, call: GuardedCall, notified_at_ms: num
88
86
  )
89
87
  }
90
88
 
91
- // The wording each notice carries, with the concrete calls the run just issued one-per-turn appended
92
- // (joshuafolkken/kit#2276). The whole-file write keeps its own base text; the lane notice is reached
89
+ // The wording each notice carries, with the concrete calls the run just issued one-per-turn appended.
90
+ // The whole-file write keeps its own base text; the lane notice is reached
93
91
  // under the `notice`-mode guard batching takes in a lane child again since kit#2276, so a headless
94
92
  // child is shown *which* recent calls it could have batched rather than only told to batch.
95
93
  function notice_text(call: GuardedCall, tail: string): string {
@@ -107,7 +105,7 @@ const GUARD = hook_decision.create_transcript_guard({
107
105
  should_block: should_block_here,
108
106
  reason: time_batch_guard.REASON,
109
107
  // The whole-file write is notified rather than refused, on a record of its own so it never spends
110
- // the refusal's stamp (joshuafolkken/kit#1848); the lane-child refusable-call notice kit#2164 added
108
+ // the refusal's stamp; the lane-child refusable-call notice kit#2164 added
111
109
  // here fires again since kit#2276 restored batching to `notice` in a lane child.
112
110
  notify: {
113
111
  prefix: time_batch_guard.NOTICE_STAMP_PREFIX,
@@ -120,7 +118,7 @@ const batch_refusal = GUARD.refusal
120
118
  const batch_outcome = GUARD.outcome
121
119
  const { is_enabled, refusal_path } = GUARD
122
120
  // The notice's stamp path, exposed the way `refusal_path` is so a test can clean it apart from the
123
- // refusal's record (joshuafolkken/kit#1848).
121
+ // refusal's record.
124
122
  const notice_refusal_path = hook_decision.create_refusal_stamp(
125
123
  time_batch_guard.NOTICE_STAMP_PREFIX,
126
124
  ).path
@@ -4,6 +4,7 @@ import os from 'node:os'
4
4
  import path from 'node:path'
5
5
  import { fileURLToPath } from 'node:url'
6
6
  import { git_command } from '#scripts/git/git-command'
7
+ import { issue_cite } from '#scripts/issue/issue-cite'
7
8
 
8
9
  interface CheckResult {
9
10
  success: boolean
@@ -25,10 +26,10 @@ function is_inside(directory: string, resolved_path: string): boolean {
25
26
  return relative !== '' && !relative.startsWith(PARENT_SEGMENT) && !path.isAbsolute(relative)
26
27
  }
27
28
 
28
- // joshuafolkken/kit#1106: the guard used to be a prefix test — the path had to *start* with `.git/`,
29
- // which is only the shape the main work tree produces. A linked work tree gets an absolute
30
- // `<repo>/.git/worktrees/<name>/COMMIT_EDITMSG`, which shares no prefix with it, so the guard threw
31
- // before the real check ran and no commit inside a work tree could succeed.
29
+ // A prefix test — the path has to *start* with `.git/` — fits only the shape the main work tree
30
+ // produces. A linked work tree gets an absolute `<repo>/.git/worktrees/<name>/COMMIT_EDITMSG`, which
31
+ // shares no prefix with it, so such a guard would throw before the real check ran and no commit inside
32
+ // a work tree could succeed.
32
33
  //
33
34
  // The directories are asked of git rather than assumed to be named `.git`, because the name is not a
34
35
  // property of a repository: a bare repository's git directory is the repository, and
@@ -50,7 +51,7 @@ function is_safe_commit_message_path(
50
51
  // Where git would have written the message, for a run that was passed no path. The work tree's own
51
52
  // git directory rather than a literal `.git/`: in a linked work tree that name is a *file*, so the
52
53
  // relative spelling this used to hardcode ends the run at ENOTDIR — the same defect as the guard's,
53
- // on the branch the guard does not reach (joshuafolkken/kit#1106).
54
+ // on the branch the guard does not reach.
54
55
  function default_commit_message_path(git_directories: ReadonlyArray<string>): string {
55
56
  return path.join(git_directories[0] ?? FALLBACK_GIT_DIRECTORY, COMMIT_MESSAGE_FILE_NAME)
56
57
  }
@@ -85,11 +86,13 @@ function extract_issue_number(branch_name: string): string | undefined {
85
86
  }
86
87
 
87
88
  function create_error_message(issue_number: string, branch: string, message: string): string {
89
+ const reference = issue_cite.plain(issue_number)
90
+
88
91
  return (
89
- `🚫 Error: Commit message must include #${issue_number}\n` +
92
+ `🚫 Error: Commit message must include ${reference}\n` +
90
93
  ` Current branch: ${branch}\n` +
91
94
  ` Commit message: ${message}\n` +
92
- ` Please include #${issue_number} in your commit message\n`
95
+ ` Please include ${reference} in your commit message\n`
93
96
  )
94
97
  }
95
98
 
@@ -106,7 +109,7 @@ async function check_commit_message(): Promise<CheckResult> {
106
109
 
107
110
  const commit_message = await get_commit_message()
108
111
 
109
- if (!commit_message.includes(`#${issue_number}`)) {
112
+ if (!commit_message.includes(issue_cite.plain(issue_number))) {
110
113
  return {
111
114
  success: false,
112
115
  message: create_error_message(issue_number, current_branch, commit_message),
@@ -115,7 +118,7 @@ async function check_commit_message(): Promise<CheckResult> {
115
118
 
116
119
  return {
117
120
  success: true,
118
- message: `✅ Commit message check passed: Found #${issue_number}`,
121
+ message: `✅ Commit message check passed: Found ${issue_cite.plain(issue_number)}`,
119
122
  }
120
123
  }
121
124
 
@@ -3,6 +3,7 @@ import { text } from 'node:stream/consumers'
3
3
  import { fileURLToPath } from 'node:url'
4
4
  import { hook_decision, type GuardOutcome } from '#scripts/josh/hook-decision'
5
5
  import { bounded_pool } from '#scripts/lib/bounded-pool'
6
+ import { json_value } from '#scripts/lib/json-value'
6
7
  import { time_density_hook } from '#scripts/time-runtime/time-density-hook'
7
8
  import { z } from 'zod'
8
9
  import { build_envelope, compose_context, format_edited_payload } from './format-edited-file'
@@ -36,13 +37,7 @@ const patch_input_schema = z.object({ command: z.string().min(1) })
36
37
  type PayloadFormatter = (raw_payload: string, project_root: string) => Promise<string | undefined>
37
38
 
38
39
  function parse_payload(raw_payload: string): z.infer<typeof codex_payload_schema> | undefined {
39
- try {
40
- const parsed = codex_payload_schema.safeParse(JSON.parse(raw_payload))
41
-
42
- return parsed.success ? parsed.data : undefined
43
- } catch {
44
- return undefined
45
- }
40
+ return json_value.parse_with(raw_payload, codex_payload_schema)
46
41
  }
47
42
 
48
43
  function paths_matching(command: string, pattern: RegExp): Array<string> {
@@ -96,8 +91,8 @@ function pretool_outcome(raw_payload: string): GuardOutcome {
96
91
  }
97
92
 
98
93
  // The formatters apply what eslint could fix silently and return what it could not; each patched
99
- // file's unfixed block is joined so the whole patch's lint problems reach the model on one edit
100
- // (joshuafolkken/kit#2275). `undefined` when every file was clean, so the ordinary patch adds nothing.
94
+ // file's unfixed block is joined so the whole patch's lint problems reach the model on one edit.
95
+ // `undefined` when every file was clean, so the ordinary patch adds nothing.
101
96
  async function format_posttool_payloads(
102
97
  raw_payload: string,
103
98
  project_root: string,
@@ -123,9 +118,19 @@ async function write_posttool_context(raw_payload: string): Promise<void> {
123
118
  if (context !== undefined) process.stdout.write(`${build_envelope(context)}\n`)
124
119
  }
125
120
 
121
+ // The environment file is loaded before the verdict, as `write_outcome` does, so the lane-child marker
122
+ // the phase mark reads is in place; the mark follows the written envelope.
123
+ async function write_pretool_outcome(raw_payload: string): Promise<void> {
124
+ hook_decision.load_environment_file()
125
+ const outcome = pretool_outcome(raw_payload)
126
+
127
+ hook_decision.emit_outcome(outcome)
128
+ await pretool_guard.mark_phase(outcome)
129
+ }
130
+
126
131
  async function run(raw_payload: string, mode: string): Promise<void> {
127
132
  if (mode === PRETOOL_MODE) {
128
- hook_decision.write_outcome(raw_payload, pretool_outcome)
133
+ await write_pretool_outcome(raw_payload)
129
134
 
130
135
  return
131
136
  }
@@ -149,6 +154,7 @@ const codex_hook_adapter = {
149
154
  posttool_payloads,
150
155
  pretool_outcome,
151
156
  pretool_payload,
157
+ write_pretool_outcome,
152
158
  }
153
159
 
154
160
  export { codex_hook_adapter }
@@ -3,10 +3,9 @@ import path from 'node:path'
3
3
  import { HOOK_PROCESS_TIMEOUT_MS } from '#scripts/lib/timeouts'
4
4
  import { execa } from 'execa'
5
5
 
6
- // The spell half of the edit hook (joshuafolkken/kit#2296). joshuafolkken/kit#2275 gave the hook a way
7
- // to hand the model an edit's lint problems on the spot rather than at the gate; the gate then still
8
- // ran two extra times on average, and an unregistered word was one of the two things that put it there
9
- // — a `cspell:dot` failure a run could only read one word at a time under the output cap. Checking the
6
+ // The spell half of the edit hook. The lint half hands the model an edit's lint problems on the spot
7
+ // rather than at the gate; an unregistered word is the other thing that sends a run back to the gate
8
+ // — a `cspell:dot` failure a run can only read one word at a time under the output cap. Checking the
10
9
  // one edited file for unknown words the moment it changes closes that the same way the lint half does:
11
10
  // a short `additionalContext` block, riding the same `PostToolUse` envelope, and no output at all when
12
11
  // there is nothing to say.
@@ -4,7 +4,7 @@ import { fileURLToPath } from 'node:url'
4
4
  import { report_no_payload, run_hook } from './format-edited-file'
5
5
 
6
6
  // The `PostToolUse` hook's entry, kept apart from `format-edited-file.ts` for the reason
7
- // `pretool-guard-cli.ts` gives (joshuafolkken/kit#2922): `codex-hook-adapter.ts` imports that module,
7
+ // `pretool-guard-cli.ts` gives: `codex-hook-adapter.ts` imports that module,
8
8
  // so a self-invoke left in it lands in a shared chunk and the bundled hook never runs.
9
9
  if (process.argv[1] === fileURLToPath(import.meta.url)) {
10
10
  if (process.stdin.isTTY) {