@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
@@ -6,8 +6,7 @@ import { time_followup_stage } from './time-followup-stage'
6
6
  import { time_instant } from './time-instant'
7
7
  import { time_reported_failure } from './time-reported-failure'
8
8
 
9
- // One line of a session transcript, read into the shape the span walk works on
10
- // (joshuafolkken/kit#1406).
9
+ // One line of a session transcript, read into the shape the span walk works on.
11
10
  //
12
11
  // It moved out of `time-spans.ts` when that file passed its length limit — the seam that file is
13
12
  // already cut along elsewhere (`time-shell.ts`, `time-single-check.ts`), where the *reading* of a
@@ -27,22 +26,22 @@ const BLOCK_SCHEMA = z.object({
27
26
 
28
27
  tool_use_id: z.string().nullish(),
29
28
  input: z.unknown().nullish(),
30
- // Whether the harness wrote this result back as a failure (joshuafolkken/kit#1309). Present on a
29
+ // Whether the harness wrote this result back as a failure. Present on a
31
30
  // `tool_result` block and on nothing else, and absent even there for the tools that never report
32
31
  // one — which is why it is read as three answers rather than as a boolean with a default.
33
32
  is_error: z.boolean().nullish(),
34
- // What the call printed. Read only to recover the outcome a pipeline threw away
35
- // (joshuafolkken/kit#1361): it is kept as flattened text rather than as blocks, because that is
33
+ // What the call printed. Read only to recover the outcome a pipeline threw away:
34
+ // it is kept as flattened text rather than as blocks, because that is
36
35
  // the whole of what `time-reported-failure.ts` asks of it.
37
36
  content: z.unknown().nullish(),
38
37
  })
39
38
 
40
39
  const CONTENT_SCHEMA = z.union([z.string(), z.array(BLOCK_SCHEMA)])
41
40
  // `id` is the assistant *message* the line belongs to, and Claude Code writes one line per content
42
- // block — a turn that thought and then issued two calls is three lines carrying one id
43
- // (joshuafolkken/kit#1329). Anything asking "how many calls did that turn make" therefore has to
44
- // group by this field; counting one line's blocks answers one, whatever the turn actually did. Since
45
- // joshuafolkken/kit#1406 the same field is what says how many *turns* a run had.
41
+ // block — a turn that thought and then issued two calls is three lines carrying one id.
42
+ // Anything asking "how many calls did that turn make" therefore has to
43
+ // group by this field; counting one line's blocks answers one, whatever the turn actually did. The
44
+ // same field is what says how many *turns* a run had.
46
45
  const MESSAGE_SCHEMA = z.object({ id: z.string().nullish(), content: CONTENT_SCHEMA.nullish() })
47
46
 
48
47
  const LINE_SCHEMA = z.object({
@@ -50,10 +49,10 @@ const LINE_SCHEMA = z.object({
50
49
  timestamp: z.string().nullish(),
51
50
  // The branch the line was written on, which is where the issue number lives — `josh git` names a
52
51
  // branch `<N>-<slug>`. Read here rather than re-parsed by a second reader so `josh time --issue`
53
- // and `josh cost --issue` answer from the same field (joshuafolkken/kit#1268).
52
+ // and `josh cost --issue` answer from the same field.
54
53
  gitBranch: z.string().nullish(),
55
- // The two fields outside `message` that the harness writes an end-of-task notice on
56
- // (joshuafolkken/kit#1696). **Both are read as `unknown` rather than as strings**: a schema
54
+ // The two fields outside `message` that the harness writes an end-of-task notice on.
55
+ // **Both are read as `unknown` rather than as strings**: a schema
57
56
  // insisting on a string here would reject every line whose `content` is a list of blocks — which is
58
57
  // most of them — and a rejected line is dropped from the timeline entirely, so the shares would stop
59
58
  // reconstructing the elapsed time. The shape is checked at the read below instead.
@@ -63,17 +62,14 @@ const LINE_SCHEMA = z.object({
63
62
  })
64
63
 
65
64
  const UNKNOWN_BRANCH = ''
66
- // The field an attachment line carries the notice in. Named rather than written as a literal for the
67
- // reason `time-background.ts`'s `BASH_ID_KEY` is: `dot-notation` rewrote `record['prompt']` into
68
- // `record.prompt`, which a value read as an index-signature record does not have — until
69
- // joshuafolkken/kit#1783 switched that fix off. The name is kept for its own sake.
65
+ // The field an attachment line carries the notice in, named rather than written as a literal.
70
66
  const PROMPT_KEY = 'prompt'
71
67
  const NO_MESSAGE_ID = ''
72
- // How much of an errored body is kept (joshuafolkken/kit#1642). A refusal's body *is* the reason the
68
+ // How much of an errored body is kept. A refusal's body *is* the reason the
73
69
  // harness wrote back, from its first character, so an opening this long identifies the speaker
74
70
  // without retaining the output of every failed command a session ran.
75
71
  const ERROR_TEXT_LIMIT = 256
76
- // The icon every guard refusal opens with (joshuafolkken/kit#1913). It is not `status_icons.FAIL_ICON`
72
+ // The icon every guard refusal opens with. It is not `status_icons.FAIL_ICON`
77
73
  // — that one (`✗`) marks a josh check's failing item, which `has_failure_line` scans for; this one
78
74
  // marks a PreToolUse hook's *deny* reason, which is a different body carried in a different result. No
79
75
  // shared constant exists because each guard writes the literal in its own reason, so the one place a
@@ -81,8 +77,11 @@ const ERROR_TEXT_LIMIT = 256
81
77
  const REFUSAL_MARKER = '⛔'
82
78
  // The label the harness puts in front of a PreToolUse hook's deny reason, naming the hook and the tool.
83
79
  const HOOK_ERROR_LABEL = /^PreToolUse:\S+ hook error: /u
80
+ // The label the harness puts in front of a Stop hook's block reason when it sends the turn back.
81
+ // The reason follows on the next line, opening with the same `⛔` a deny does.
82
+ const STOP_FEEDBACK_LABEL = /^Stop hook feedback:\s*/u
84
83
  // A line that is one bare verdict token — `cut`, `busy`, `not-a-lane` — the single word a josh verdict
85
- // command prints on standard output (joshuafolkken/kit#3223). How many are kept bounds the field the
84
+ // command prints on standard output. How many are kept bounds the field the
86
85
  // way `ERROR_TEXT_LIMIT` bounds `error_text`.
87
86
  const TOKEN_LINE = /^[a-z][a-z-]*$/u
88
87
  const TOKEN_LINE_LIMIT = 8
@@ -97,40 +96,40 @@ interface Block {
97
96
  // `false`: one is a tool that reports no outcome, the other a call that succeeded.
98
97
  is_error: boolean | undefined
99
98
  // Whether the body carried a line opening with josh's failure icon — the one bit of it anything
100
- // reads (joshuafolkken/kit#1361). The text itself is deliberately not kept: a field holding it
99
+ // reads. The text itself is deliberately not kept: a field holding it
101
100
  // would retain every byte the session's tools printed for the length of the parse.
102
101
  has_failure_line: boolean
103
- // The stage rows a `pnpm josh followup` call printed into its own output
104
- // (joshuafolkken/kit#1445). Read here for the same reason the bit above is, and it obeys the same
102
+ // The stage rows a `pnpm josh followup` call printed into its own output.
103
+ // Read here for the same reason the bit above is, and it obeys the same
105
104
  // prohibition: what is kept is the ten-odd parsed laps, never the body they were read from. Empty
106
105
  // for every other tool result, which is nearly all of them.
107
106
  followup_stages: ReadonlyArray<FollowupStage>
108
107
  // The opening of the body of a result the harness wrote back as a failure, and `''` for every
109
- // other block (joshuafolkken/kit#1642). It obeys the same prohibition as the two fields above —
108
+ // other block. It obeys the same prohibition as the two fields above —
110
109
  // what is kept is a bounded opening, never the whole body — and it exists so a reader asking
111
110
  // which refusal a line carried can be answered from the parsed block rather than by matching
112
111
  // `"is_error":true` against the raw line, a test one whitespace in the serializer defeats and
113
112
  // which cannot tell one errored block from another on the same line.
114
113
  error_text: string
115
114
  // Which guard refused this call, read off the opening of an errored result and `''` for every other
116
- // block (joshuafolkken/kit#1913). It obeys the same prohibition as `error_text` — what is kept is a
115
+ // block. It obeys the same prohibition as `error_text` — what is kept is a
117
116
  // short label, never the body — and it exists so the per-guard refusal breakdown can be answered from
118
117
  // the parsed block rather than by re-scanning the body downstream. `''` where the result was not a
119
118
  // `⛔` refusal, so a reader tells "no guard spoke" from "this guard spoke" without a second parse.
120
119
  refusal_guard: string
121
- // The bare-token lines of a result that did not fail, and `[]` for every other block
122
- // (joshuafolkken/kit#3223). It obeys the same prohibition as `error_text` — what is kept is a few
120
+ // The bare-token lines of a result that did not fail, and `[]` for every other block.
121
+ // It obeys the same prohibition as `error_text` — what is kept is a few
123
122
  // single words, never the body — and it exists so the verdict a josh command answered with
124
123
  // (`run:cut`'s `cut`) is read from the parsed block rather than by searching the raw line.
125
124
  token_lines: ReadonlyArray<string>
126
125
  // The id the harness assigned to a command it took into the background, and `''` for every other
127
- // block (joshuafolkken/kit#1662). It is the fourth field read off the body under the same
126
+ // block. It is the fourth field read off the body under the same
128
127
  // prohibition as the three above — what is kept is the id, never the text it was read from — and
129
128
  // it is what pairs a launch with the call that later reads its output, so the minutes the command
130
129
  // actually ran can be placed on the timeline instead of only the seconds its launch call took.
131
130
  background_id: string
132
131
  // The id of a subagent this block launched into the background, and `''` for every other block
133
- // (joshuafolkken/kit#2774) — apart from `background_id` so the timeline windows stay commands only.
132
+ // — apart from `background_id` so the timeline windows stay commands only.
134
133
  agent_id: string
135
134
  }
136
135
 
@@ -139,7 +138,7 @@ interface TranscriptLine {
139
138
  timestamp_ms: number
140
139
  branch: string
141
140
  // The background run this line is the harness's end-of-task notice for, and `''` for every other
142
- // line (joshuafolkken/kit#1696). It is read here rather than downstream for the reason every
141
+ // line. It is read here rather than downstream for the reason every
143
142
  // derived field above is: the notice is the line's whole content, which a span does not keep, and
144
143
  // it is the only thing in a transcript that says a command had *finished* rather than merely been
145
144
  // looked at.
@@ -149,6 +148,9 @@ interface TranscriptLine {
149
148
  // every line lacking an id would otherwise fall into one bucket spanning the whole file.
150
149
  message_id: string
151
150
  blocks: Array<Block>
151
+ // The guard whose Stop-hook block sent this turn back, or `''` for every other line
152
+ // — read the way `Block.refusal_guard` is, off the reason's opening.
153
+ stop_guard: string
152
154
  }
153
155
 
154
156
  // The four string fields, defaulted together and apart from the two that are not strings. Split out
@@ -165,15 +167,15 @@ function block_names(
165
167
  }
166
168
  }
167
169
 
168
- // **A refusal is identified by what its body opens with, never by what it carries inside**
169
- // (joshuafolkken/kit#1913). The hook denies a call on behalf of the one guard whose trigger fired and
170
+ // **A refusal is identified by what its body opens with, never by what it carries inside**.
171
+ // The hook denies a call on behalf of the one guard whose trigger fired and
170
172
  // writes that guard's reason back as the whole result, so the speaker is the token after the `⛔` and
171
173
  // before the first `:` — `⛔ pre-gate cut: …` is `pre-gate cut`. A reason with no colon (a headline
172
174
  // like `⛔ scoped checks not green on this tree`) is taken whole. Reading the opening rather than
173
175
  // searching the body is what stops a result that merely quoted a reason being read as a refusal.
174
176
  //
175
177
  // **The harness writes the reason behind its own label** — `PreToolUse:Edit hook error: ⛔ …` — so that
176
- // label is stripped before the opening is read (joshuafolkken/kit#3223). Without it no live refusal
178
+ // label is stripped before the opening is read. Without it no live refusal
177
179
  // carried a guard: the fixtures wrote the bare `⛔` body and passed while every recorded one read `''`.
178
180
  function guard_from_refusal(text: string): string {
179
181
  const trimmed = text.trimStart().replace(HOOK_ERROR_LABEL, '')
@@ -185,6 +187,16 @@ function guard_from_refusal(text: string): string {
185
187
  return (colon === -1 ? headline : headline.slice(0, colon)).trim()
186
188
  }
187
189
 
190
+ // **Only the harness's own feedback line counts.** It writes a Stop block back as a user turn whose
191
+ // whole body is `Stop hook feedback:` and the reason, so a prompt that merely quotes one never opens
192
+ // with the label and reads `''`.
193
+ function stop_guard_of(data: z.infer<typeof LINE_SCHEMA>): string {
194
+ const content = data.message?.content
195
+ if (typeof content !== 'string' || !STOP_FEEDBACK_LABEL.test(content)) return ''
196
+
197
+ return guard_from_refusal(content.replace(STOP_FEEDBACK_LABEL, ''))
198
+ }
199
+
188
200
  function token_lines_of(text: string): Array<string> {
189
201
  return text
190
202
  .split('\n')
@@ -196,7 +208,7 @@ function token_lines_of(text: string): Array<string> {
196
208
  // **The body is flattened once and both readers are handed the text.** `result_text` is what turns a
197
209
  // content field that may be a string or a list of blocks into one string, and it is idempotent on a
198
210
  // string — so passing its own output back to `has_failure_line` reads exactly as passing the raw
199
- // field did, at one flattening instead of two (joshuafolkken/kit#1445).
211
+ // field did, at one flattening instead of two.
200
212
  function to_block(raw: z.infer<typeof BLOCK_SCHEMA>): Block {
201
213
  const text = time_reported_failure.result_text(raw.content)
202
214
  const is_error = raw.is_error ?? undefined
@@ -235,7 +247,7 @@ function message_fields(
235
247
  }
236
248
 
237
249
  // **One notice reaches the transcript on any of three line kinds, and which of them a session holds
238
- // varies** (joshuafolkken/kit#1696). The harness writes it on a `queue-operation` line when the notice
250
+ // varies**. The harness writes it on a `queue-operation` line when the notice
239
251
  // is generated, on an `attachment` line when it is delivered, and on a `user` line where it enters the
240
252
  // conversation — and a run measured against one carrier alone came back unmeasured whenever the
241
253
  // session happened to hold a different one. All three are read, and `time_background.finished_at`
@@ -260,6 +272,7 @@ function to_line(data: z.infer<typeof LINE_SCHEMA>): TranscriptLine | undefined
260
272
  timestamp_ms,
261
273
  branch: data.gitBranch ?? UNKNOWN_BRANCH,
262
274
  finished_background: time_background.finished_id(notice_text(data)),
275
+ stop_guard: stop_guard_of(data),
263
276
  ...message_fields(data.message),
264
277
  }
265
278
  }
@@ -270,12 +283,18 @@ function parse_line(line: string): TranscriptLine | undefined {
270
283
  return parsed.success ? to_line(parsed.data) : undefined
271
284
  }
272
285
 
286
+ // A whole transcript's text read as its parsed lines, the unparseable ones dropped.
287
+ function parse_text(text: string): Array<TranscriptLine> {
288
+ return text.split('\n').flatMap((line) => parse_line(line) ?? [])
289
+ }
290
+
273
291
  const time_transcript_line = {
274
292
  ERROR_TEXT_LIMIT,
275
293
  NO_MESSAGE_ID,
276
294
  TOKEN_LINE_LIMIT,
277
295
  guard_from_refusal,
278
296
  parse_line,
297
+ parse_text,
279
298
  }
280
299
 
281
300
  export type { Block, TranscriptLine }
@@ -1,7 +1,7 @@
1
1
  import { time_bundle_call } from './time-bundle-call'
2
2
  import { time_markers } from './time-markers'
3
3
 
4
- // Which files one tool call **wrote** (joshuafolkken/kit#1472).
4
+ // Which files one tool call **wrote**.
5
5
  //
6
6
  // **A span keeps no tool input**, so anything read off the input has to be read while the input is
7
7
  // still in hand — the reason `marker`, `targets` and `check_key` are already carried on `ToolCall`
@@ -22,11 +22,11 @@ import { time_markers } from './time-markers'
22
22
  // **This module is the one place that answers the question**, so the two callers cannot come to
23
23
  // disagree about it, and it reuses the extraction `time-bundle-call.ts` already owns rather than
24
24
  // writing a second one: `tool_targets` for a tool's own path fields, `targets_in` for a shell line.
25
- // Nothing here widens `BUNDLEABLE_TOOLS` — that set is what the batching measurement of
26
- // joshuafolkken/kit#1390 is defined over, and a call that writes is deliberately not bundleable.
25
+ // Nothing here widens `BUNDLEABLE_TOOLS` — that set is what the batching measurement is
26
+ // defined over, and a call that writes is deliberately not bundleable.
27
27
 
28
- // **Whether a line is an in-place `sed` is `time-bundle-call.ts`'s answer, not a second one here**
29
- // (joshuafolkken/kit#1509). That module needs the same test as a boolean for the batching sequences,
28
+ // **Whether a line is an in-place `sed` is `time-bundle-call.ts`'s answer, not a second one here**.
29
+ // That module needs the same test as a boolean for the batching sequences,
30
30
  // and while the two were written separately they disagreed in both directions at once — one read the
31
31
  // whole line, so a piped `grep -i` made a read into a write; the other missed a bundled `sed -ni`, so
32
32
  // one span could carry `writes: ['x.ts']` beside `is_writing: false`. The segment scoping and the
@@ -7,8 +7,7 @@ import { git_command } from '#scripts/git/git-command'
7
7
  import { file_reader } from '#scripts/lib/read-file'
8
8
  import { ui_routes } from './ui-routes'
9
9
 
10
- // `josh ui:routes [--staged]` — list the screenshot-target routes the current change touches
11
- // (joshuafolkken/kit#2182).
10
+ // `josh ui:routes [--staged]` — list the screenshot-target routes the current change touches.
12
11
  //
13
12
  // The derivation lives in `ui-routes.ts`; this file is the I/O around it: read the changed paths
14
13
  // (the branch diff, or the staged diff with `--staged`), and resolve a shared component to the routes
@@ -1,5 +1,4 @@
1
- // The screenshot-target routes a change touches, derived from the diff rather than chosen by eye
2
- // (joshuafolkken/kit#2182).
1
+ // The screenshot-target routes a change touches, derived from the diff rather than chosen by eye.
3
2
  //
4
3
  // The `verify-ui` skill's §1 asked the reader to read `git diff` and name the routes whose
5
4
  // components, styles or copy it touches — but in SvelteKit a file path maps to a route path
@@ -25,7 +25,7 @@ function package_json_path(): string {
25
25
 
26
26
  // **Set the version to an already-decided number.** `bump_version` below is this plus the decision;
27
27
  // `pnpm josh release` supplies its own, because a release raises the version by as many minors as
28
- // main has taken merges rather than by one (joshuafolkken/kit#1169). Written once so the two agree
28
+ // main has taken merges rather than by one. Written once so the two agree
29
29
  // on the file's shape and indentation.
30
30
  function write_version(new_version: string): void {
31
31
  const package_path = package_json_path()
@@ -16,8 +16,8 @@ function with_cache_directory(
16
16
 
17
17
  // A cached metadata file written through safe-chain lacks every version that was under 24 hours old
18
18
  // at the time, and with `minimumReleaseAge` set pnpm reuses a cache file younger than that age
19
- // instead of refetching it — so a version that has since aged in stays invisible for up to a day
20
- // (joshuafolkken/kit#2805). A fresh directory per run means nothing filtered earlier is ever read.
19
+ // instead of refetching it — so a version that has since aged in stays invisible for up to a day.
20
+ // A fresh directory per run means nothing filtered earlier is ever read.
21
21
  function run_in_fresh_cache<T>(
22
22
  stages: ReadonlyArray<ReadonlyArray<string>>,
23
23
  run_stages: (stages: Array<Array<string>>) => T,
@@ -5,34 +5,34 @@
5
5
  * The target version is resolved from the registry's publish timestamps
6
6
  * (`pnpm view pnpm time --json`) instead of a dist-tag, because pnpm publishes its
7
7
  * per-major tag `latest-<major>` only for SUPERSEDED majors — while <major> is the newest
8
- * major, the only tag covering it is `latest` (kit#750). The former `latest-<major>` pin
9
- * (kit#444) therefore failed on every run in the common case, and `latest` itself can
10
- * momentarily point below the devEngines floor. Picking the newest registry version whose
11
- * major equals the `packageManager` pin keeps both invariants: never below the adopted
12
- * major, and advancing while that major is the current one.
8
+ * major, the only tag covering it is `latest`, so a `latest-<major>` pin would fail on every
9
+ * run in the common case, and `latest` itself can momentarily point below the devEngines
10
+ * floor. Picking the newest registry version whose major equals the `packageManager` pin keeps
11
+ * both invariants: never below the adopted major, and advancing while that major is the
12
+ * current one.
13
13
  *
14
- * The `minimumReleaseAge` quarantine is applied natively from `pnpm-workspace.yaml` (kit#768,
15
- * #3267). safe-chain filters the registry only when the process tree was launched through one
16
- * of its wrapped shell commands, so `josh latest` and `pnpm josh latest` used to resolve
17
- * different answers and the pin oscillated. Reading the window from the repo-managed
14
+ * The `minimumReleaseAge` quarantine is applied natively from `pnpm-workspace.yaml`.
15
+ * safe-chain filters the registry only when the process tree was launched through one of its
16
+ * wrapped shell commands, so `josh latest` and `pnpm josh latest` would resolve different
17
+ * answers and the pin would oscillate. Reading the window from the repo-managed
18
18
  * `pnpm-workspace.yaml` and filtering by publish timestamp makes the resolution identical in
19
19
  * every invocation context; right after a pnpm release the answer is simply the previous
20
- * release, exactly as the filtered view behaved.
20
+ * release, exactly as the filtered view behaves.
21
21
  *
22
22
  * The resolved version is floored at the current `packageManager` pin: a filtered registry
23
23
  * view legitimately answers below a freshly adopted pin for the first 24 hours after every
24
- * pnpm release, and writing that answer would downgrade the protected toolchain pin
25
- * (kit#766). Not-newer answers skip the bump non-fatally instead.
24
+ * pnpm release, and writing that answer would downgrade the protected toolchain pin.
25
+ * Not-newer answers skip the bump non-fatally instead.
26
26
  *
27
27
  * `devEngines.packageManager.version` is realigned with the `packageManager` pin on every
28
- * path — bumped, skipped, or unresolvable (kit#773). Alignment used to run only after a
29
- * successful bump, which never fires in the steady state of an up-to-date repository, so a
30
- * manifest that arrived with the two fields out of step kept the pnpm dual-declaration
31
- * warning forever. The alignment is idempotent, so running it unconditionally is free.
28
+ * path — bumped, skipped, or unresolvable. A bump never fires in the steady state of an
29
+ * up-to-date repository, so alignment gated on one would leave a manifest that arrived with
30
+ * the two fields out of step warning forever. The alignment is idempotent, so running it
31
+ * unconditionally is free.
32
32
  *
33
- * A failed bump exits non-zero with its cause, the manifest restored (#3361). It used to be
34
- * swallowed as a skip, so `latest:scope --record` marked the run fresh and a pnpm that could not
35
- * self-update (the Corepack shim refuses it) stayed pinned silently. `josh latest` runs this step
33
+ * A failed bump exits non-zero with its cause, the manifest restored — a skip would let
34
+ * `latest:scope --record` mark the run fresh while a pnpm that could not self-update (the
35
+ * Corepack shim refuses it) stayed pinned silently. `josh latest` runs this step
36
36
  * last, right before the record, so the dependency update and the audit still finish and only the
37
37
  * record is withheld. A registry answer not newer than the pin, or nothing aged past the
38
38
  * quarantine window yet, remains a non-fatal skip.
@@ -60,7 +60,7 @@ const INTEGRITY_RE = /^sha512-([A-Za-z0-9+/]+={0,2})$/u
60
60
  const PACKAGE_MANAGER_VALUE_RE = /("packageManager"\s*:\s*")pnpm@[^"]+(")/u
61
61
 
62
62
  // `target` is undefined both when the registry did not answer and when it answered but nothing has
63
- // aged past the quarantine window yet; only the first is a failure (#3361).
63
+ // aged past the quarantine window yet; only the first is a failure.
64
64
  interface TargetResolution {
65
65
  target: string | undefined
66
66
  is_registry_reachable: boolean
@@ -70,7 +70,7 @@ const PNPM_DEVELOPMENT_MANAGER_SCHEMA = z.object({ name: z.literal('pnpm'), vers
70
70
  const DEV_ENGINES_SCHEMA = z.object({ packageManager: PNPM_DEVELOPMENT_MANAGER_SCHEMA })
71
71
  const DEV_ENGINES_PNPM_SCHEMA = z.object({ devEngines: DEV_ENGINES_SCHEMA.optional() })
72
72
  const COREPACK_REMEDY =
73
- 'pnpm runs through the Corepack shim, where pnpm 11+ refuses self-update (ERR_PNPM_CANT_SELF_UPDATE_IN_COREPACK). Run `corepack disable pnpm`, install a standalone pnpm (https://pnpm.io/installation), then rerun josh latest.'
73
+ 'pnpm runs through the Corepack shim, where pnpm 11+ refuses self-update (ERR_PNPM_CANT_SELF_UPDATE_IN_COREPACK). Run `corepack disable pnpm`, install a standalone pnpm (https://pnpm.io/installation), run josh sync so a devEngines.packageManager.onFail of "error" becomes "download" (the standalone pnpm then fetches the pinned version), then rerun josh latest.'
74
74
 
75
75
  function extract_development_engines_version(package_json_content: string): string | undefined {
76
76
  const parsed = DEV_ENGINES_PNPM_SCHEMA.safeParse(
@@ -108,7 +108,7 @@ function extract_pinned_version(package_json_content: string): string | undefine
108
108
 
109
109
  // Never move the pin backwards. A filtered registry view (safe-chain's minimum-release-age
110
110
  // proxy) answers below a freshly adopted pin for 24 hours after every pnpm release, and an
111
- // equal answer would only rewrite the same value — both skip instead (kit#766).
111
+ // equal answer would only rewrite the same value — both skip instead.
112
112
  function is_target_not_newer_than_pin(target: string, pinned_version: string | undefined): boolean {
113
113
  if (pinned_version === undefined) return false
114
114
  const target_version = target.slice(TARGET_PREFIX.length)
@@ -160,7 +160,7 @@ function resolve_major_target(major: string): TargetResolution {
160
160
  // The project's own `pnpm-workspace.yaml`, deliberately not the upward walk the version check
161
161
  // uses: `josh latest` reads `package.json` and writes the pnpm pin relative to the working
162
162
  // directory, so it has no subdirectory case — and honouring an ancestor's policy here could freeze
163
- // pnpm bumps in a project that declares none (joshuafolkken/kit#808).
163
+ // pnpm bumps in a project that declares none.
164
164
  const version = release_age.select_aged_version(
165
165
  times,
166
166
  major,
@@ -238,7 +238,7 @@ function run_pnpm_update(target: string): number {
238
238
  // fields keep matching (pnpm suppresses the dual-declaration warning only on an exact
239
239
  // match). Runs on every path, not just after a successful bump: a repository that arrives
240
240
  // with the two fields already out of step sits in the no-bump steady state forever, so an
241
- // alignment gated on a bump would never repair it (kit#773).
241
+ // alignment gated on a bump would never repair it.
242
242
  function sync_development_engines(package_json_path: string = PACKAGE_JSON_PATH): void {
243
243
  const content = readFileSync(package_json_path, 'utf8')
244
244
  const aligned = package_manager_version.align_development_engines_version(content)
@@ -311,7 +311,7 @@ function restore_integrity(target: string, integrity: string): void {
311
311
  }
312
312
 
313
313
  // The equal case is the steady state of every up-to-date run, so it logs as success; only
314
- // an answer strictly below the pin is the anomaly worth a warning (kit#766).
314
+ // an answer strictly below the pin is the anomaly worth a warning.
315
315
  function notify_skipped_bump(target: string, pinned_version: string): void {
316
316
  if (target === `${TARGET_PREFIX}${pinned_version}`) {
317
317
  console.info(`✔ pnpm pin ${pinned_version} already matches the newest registry release.`)
@@ -376,7 +376,7 @@ function bump_package_manager(original: string, target: string): number {
376
376
  }
377
377
 
378
378
  // An unreachable registry fails, so the unrecorded run is retried. A reachable one with nothing
379
- // aged past the quarantine window is the kit#768 skip — like a not-newer answer, there is nothing
379
+ // aged past the quarantine window is the quarantine skip — like a not-newer answer, there is nothing
380
380
  // to adopt yet, and failing would stall every run for up to the whole window.
381
381
  function report_unresolved(major: string | undefined, is_registry_reachable: boolean): number {
382
382
  const label = `pnpm ${major ?? ''}`.trimEnd()
@@ -2,7 +2,7 @@
2
2
  import { fileURLToPath } from 'node:url'
3
3
  import { lane_paths, type LaneEnvironment } from '#scripts/lane/lane-paths'
4
4
 
5
- // Refuse a dependency update inside a lane (joshuafolkken/kit#2135).
5
+ // Refuse a dependency update inside a lane.
6
6
  //
7
7
  // `latest:scope` reads how long ago `josh latest` last finished, and that stamp is keyed to the
8
8
  // project root. A lane is a linked work tree whose project root is its own directory, so a fresh
@@ -3,7 +3,7 @@ import { fileURLToPath } from 'node:url'
3
3
  import { latest_lane_guard } from './latest-lane-guard'
4
4
  import { latest_stamp, type LatestStamp } from './latest-stamp'
5
5
 
6
- // `josh latest:scope` — say whether this run has to update dependencies (joshuafolkken/kit#1215).
6
+ // `josh latest:scope` — say whether this run has to update dependencies.
7
7
  //
8
8
  // A command rather than a paragraph in a procedure, for the reason `josh review:level` is a command:
9
9
  // a rule an agent applies from memory is a rule an agent can talk itself out of, and this one is
@@ -65,7 +65,7 @@ function decide(): Decision {
65
65
  }
66
66
  }
67
67
 
68
- // A lane is answered `skip` before the stamp is even read (joshuafolkken/kit#2135): the stamp is
68
+ // A lane is answered `skip` before the stamp is even read: the stamp is
69
69
  // keyed to the project root, so a lane always reads as stale, and every lane would otherwise run its
70
70
  // own dependency update. `latest_lane_guard` is the single source of the reason and of the refusal
71
71
  // `josh latest` prints.
@@ -1,8 +1,7 @@
1
1
  import { PROJECT_ROOT } from '#scripts/init/init-paths'
2
2
  import { stamp_file } from '#scripts/josh/stamp-file'
3
3
 
4
- // When `josh latest` last finished in this checkout, and whether that is recent enough to skip
5
- // (joshuafolkken/kit#1215).
4
+ // When `josh latest` last finished in this checkout, and whether that is recent enough to skip.
6
5
  //
7
6
  // `josh latest` is a network-bound chain — pnpm update, every dependency, `ranges`, `pnpm audit` — that
8
7
  // took 60–120 seconds at the head of every `fullrun` / `halfrun` and of every child a batch ran, and
@@ -63,8 +63,8 @@ function report_kept_back(regressions: ReadonlyArray<VersionRegression>): void {
63
63
 
64
64
  // The direct-dependency `--latest` bump lifts the package.json ranges; this second, argument-less
65
65
  // pass then re-resolves every tier the lockfile carries within those ranges, which is the only stage
66
- // that reaches the indirect packages a direct-only update leaves pinned at a stale resolution
67
- // (joshuafolkken/kit#2200). `pnpm update` defaults to depth Infinity, so no flag is needed to reach
66
+ // that reaches the indirect packages a direct-only update leaves pinned at a stale resolution.
67
+ // `pnpm update` defaults to depth Infinity, so no flag is needed to reach
68
68
  // the whole tree. The re-resolution stage always runs — even when every direct dependency is
69
69
  // overridden and the `--latest` stage is absent, the indirect tiers still need re-resolving.
70
70
  const PNPM_UPDATE_ALL_TIERS = ['pnpm', 'update']
@@ -7,7 +7,7 @@ import { z } from 'zod'
7
7
  import { release_age } from './release-age'
8
8
 
9
9
  // The public npm registry, read without credentials so a consumer who installed from public npm
10
- // can see the latest release without a `read:packages` GitHub token (joshuafolkken/kit#2882). The
10
+ // can see the latest release without a `read:packages` GitHub token. The
11
11
  // GitHub Packages versions API stays the source for a scope routed there, and the fallback for a
12
12
  // package public npm does not carry.
13
13
  const PUBLIC_REGISTRY = 'https://registry.npmjs.org'
@@ -99,7 +99,7 @@ function read_release_times(package_name: string): Record<string, string> | unde
99
99
  // Whether public npm already carries `<name>@<version>`. **Asked of public npm regardless of how this
100
100
  // checkout routes the scope**, unlike the two readers above: `josh release` waits for `publish.yml`'s
101
101
  // `publish-npm` job and links the npmjs.com page, so GitHub Packages answering would not be the
102
- // question it asks (joshuafolkken/kit#3193).
102
+ // question it asks.
103
103
  function has_public_version(package_name: string, version: string): boolean {
104
104
  const parsed = times_schema.safeParse(read_packument(package_name, FULL_ACCEPT))
105
105
 
@@ -14,6 +14,12 @@ const PNPM_PIN_REGEX = /^pnpm@(.+)$/u
14
14
  const DEV_ENGINES_NAME_FIRST_REGEX = /("name":\s*"pnpm"\s*,\s*"version":\s*")[^"]+(")/u
15
15
  const DEV_ENGINES_VERSION_FIRST_REGEX = /("version":\s*")[^"]+("\s*,\s*"name":\s*"pnpm")/u
16
16
 
17
+ // An `onFail: "error"` inside a `"packageManager": { … }` object — in a manifest that is only
18
+ // `devEngines.packageManager`, since the top-level `packageManager` is a string — and never
19
+ // `devEngines.runtime`, because `[^{}]` cannot cross into another block.
20
+ const DEV_ENGINES_ON_FAIL_ERROR_REGEX = /("packageManager":\s*\{[^{}]*"onFail":\s*")error(")/u
21
+ const ON_FAIL_DOWNLOAD = 'download'
22
+
17
23
  const optional_version_schema = z.object({ version: z.string().optional() }).optional()
18
24
 
19
25
  const alignment_read_schema = z.object({
@@ -86,10 +92,22 @@ function align_development_engines_version(content: string): string {
86
92
  return set_development_engines_version(content, target)
87
93
  }
88
94
 
95
+ // `onFail: "error"` rejects any pnpm that is not byte-for-byte the pin, so a machine that left
96
+ // Corepack for a standalone pnpm cannot run pnpm at all; `"download"` fetches the pinned version
97
+ // instead. Only `"error"` is rewritten — a `"warn"` / `"ignore"` the
98
+ // project chose itself is kept, and the rest of the file is preserved byte-for-byte.
99
+ function upgrade_development_engines_on_fail(content: string): string {
100
+ return content.replace(
101
+ DEV_ENGINES_ON_FAIL_ERROR_REGEX,
102
+ (_match: string, prefix: string, suffix: string) => `${prefix}${ON_FAIL_DOWNLOAD}${suffix}`,
103
+ )
104
+ }
105
+
89
106
  const package_manager_version = {
90
107
  extract_pnpm_pin,
91
108
  align_development_engines_version,
92
109
  set_development_engines_version,
110
+ upgrade_development_engines_on_fail,
93
111
  }
94
112
 
95
113
  export { package_manager_version }
@@ -24,7 +24,8 @@ const FAILURE_EXIT_CODE = 1
24
24
  // consumer can resolve — the exact blind spot this guard exists to close.
25
25
  //
26
26
  // `pnpm view` rather than `npm view` because npm refuses to run at all inside a project whose
27
- // `devEngines.packageManager` names pnpm with `onFail: "error"`, failing every probe with
27
+ // `devEngines.packageManager` names pnpm with an `onFail` other than `"warn"` / `"ignore"` (kit
28
+ // ships `"download"`, which npm refuses on just the same), failing every probe with
28
29
  // EBADDEVENGINES instead of answering. Both are shimmed, so the filtered view is preserved.
29
30
  function probe_range(name: string, range: string): ProbeResult {
30
31
  const result = execaSync('pnpm', ['view', `${name}@${range}`, 'version'], {
@@ -4,7 +4,7 @@ import semver from 'semver'
4
4
  // kit ships a `preinstall` hook that installs @aikidosec/safe-chain, whose minimum-age policy hides
5
5
  // releases younger than its window from every install running behind it. A range whose floor sits
6
6
  // inside that window has no satisfying version for a consumer, so `pnpm install` fails with
7
- // ERR_PNPM_NO_MATCHING_VERSION naming a version that demonstrably exists and is tagged latest (#742).
7
+ // ERR_PNPM_NO_MATCHING_VERSION naming a version that demonstrably exists and is tagged latest.
8
8
  //
9
9
  // The check asks the registry through that same filtered view instead of modelling the policy:
10
10
  // `pnpm view <name>@<range> version` prints no version and exits non-zero
@@ -4,14 +4,14 @@ import { yaml_document } from '#scripts/lib/yaml-document'
4
4
  import semver from 'semver'
5
5
  import { z } from 'zod'
6
6
 
7
- // The minimum-release-age quarantine (kit#768), applied natively instead of inherited from
8
- // safe-chain's interception. safe-chain filters the registry only when the process tree was
9
- // started through one of its six wrapped shell commands, so `josh latest` and
10
- // `pnpm josh latest` used to resolve different "newest release" answers. These functions
11
- // make the resolution deterministic: the policy comes from the repo-managed `pnpm-workspace.yaml`,
12
- // the publish timestamps from the registry, and the selection is a pure computation over both.
13
- // pnpm 12 reads its settings from `pnpm-workspace.yaml` — a `minimum-release-age` line in `.npmrc`
14
- // is ignored there, so reading it would report a window pnpm does not apply (kit#3267).
7
+ // The minimum-release-age quarantine, applied natively instead of inherited from safe-chain's
8
+ // interception. safe-chain filters the registry only when the process tree was started through one
9
+ // of its wrapped shell commands, so `josh latest` and `pnpm josh latest` would resolve different
10
+ // "newest release" answers. These functions make the resolution deterministic: the policy comes
11
+ // from the repo-managed `pnpm-workspace.yaml`, the publish timestamps from the registry, and the
12
+ // selection is a pure computation over both. pnpm 12 reads its settings from `pnpm-workspace.yaml`
13
+ // — a `minimum-release-age` line in `.npmrc` is ignored there, so reading it would report a window
14
+ // pnpm does not apply.
15
15
 
16
16
  const NO_QUARANTINE_MINUTES = 0
17
17
  const WORKSPACE_PATH = 'pnpm-workspace.yaml'
@@ -78,7 +78,7 @@ function is_eligible(
78
78
  // `major` pins the search to one major line — what `josh latest` needs, since corepack validates the
79
79
  // resolved pnpm version against `devEngines`. Pass `undefined` to search every major, which is what
80
80
  // an "is this installable at all" question wants: `pnpm add pkg@latest` resolves to the newest
81
- // permitted release regardless of major (joshuafolkken/kit#808).
81
+ // permitted release regardless of major.
82
82
  function select_aged_version(
83
83
  times: Record<string, string>,
84
84
  major: string | undefined,
@@ -112,7 +112,7 @@ function read_declared_minimum_release_age(workspace_path: string): number | und
112
112
  //
113
113
  // Deliberately not the upward walk below: `josh latest` resolves this against the working directory
114
114
  // it also writes `corepack use` into, and honouring an ancestor's policy there could freeze pnpm
115
- // bumps in a project that declares none (joshuafolkken/kit#808).
115
+ // bumps in a project that declares none.
116
116
  function read_minimum_release_age(workspace_path: string = WORKSPACE_PATH): number {
117
117
  return read_declared_minimum_release_age(workspace_path) ?? NO_QUARANTINE_MINUTES
118
118
  }
@@ -121,7 +121,7 @@ function read_minimum_release_age(workspace_path: string = WORKSPACE_PATH): numb
121
121
  //
122
122
  // This walks rather than reading one path because `josh version` and `josh latest` both run from
123
123
  // anywhere inside a project — and from outside one — so resolving against the working directory
124
- // alone would silently read "no quarantine" in every subdirectory (joshuafolkken/kit#808). pnpm
124
+ // alone would silently read "no quarantine" in every subdirectory. pnpm
125
125
  // finds its workspace root the same way, by walking up to the nearest `pnpm-workspace.yaml`.
126
126
  //
127
127
  // `boundary` stops the walk at a known root. Production passes none, while tests bound the search
@@ -5,7 +5,7 @@ import { release_age } from './release-age'
5
5
  // *unpinned* resolution, so anything resolved without an explicit version stops one or more releases
6
6
  // short of `latest`. Reporting that as a bare `⚠ → <latest>` is indistinguishable from an install the
7
7
  // user forgot to upgrade — and it recurs after every successful upgrade, because the newest release
8
- // is by definition the youngest (joshuafolkken/kit#808).
8
+ // is by definition the youngest.
9
9
  //
10
10
  // **The window binds unpinned resolution only.** Measured on pnpm 11.22.0 with
11
11
  // `minimumReleaseAge: 1440` and a release published 3.5 h earlier:
@@ -14,7 +14,7 @@ import { release_age } from './release-age'
14
14
  // pnpm add pkg -> 1.78.0 (the newest release past the window)
15
15
  //
16
16
  // So a pinned `Run:` hint always works and is never suppressed. What the window actually holds back
17
- // is peer resolution — the mechanism behind an upstream's effective install (joshuafolkken/kit#698),
17
+ // is peer resolution — the mechanism behind an upstream's effective install,
18
18
  // which is why this explanation is attached there and nowhere else.
19
19
 
20
20
  const MINUTES_PER_HOUR = 60