@joshuafolkken/kit 1.1514.0 → 1.1784.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 (858) hide show
  1. package/.claude/agents/investigator.md +1 -1
  2. package/.claude/settings.json +5 -5
  3. package/.claude/skills/epic-commands/SKILL.md +26 -65
  4. package/.claude/skills/epic-commands/epic-bundle.md +3 -1
  5. package/.claude/skills/workflow-commands/SKILL.md +5 -5
  6. package/.claude/skills/workflow-commands/background-commands.md +5 -5
  7. package/.claude/skills/workflow-commands/backlogrun-child.md +10 -8
  8. package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +7 -25
  9. package/.claude/skills/workflow-commands/backlogrun-lanes.md +17 -13
  10. package/.claude/skills/workflow-commands/backlogrun-park.md +14 -23
  11. package/.claude/skills/workflow-commands/backlogrun-progress.md +2 -2
  12. package/.claude/skills/workflow-commands/backlogrun-recovery.md +5 -5
  13. package/.claude/skills/workflow-commands/backlogrun-steps.md +10 -10
  14. package/.claude/skills/workflow-commands/backlogrun.md +1 -1
  15. package/.claude/skills/workflow-commands/chain-rule.md +13 -7
  16. package/.claude/skills/workflow-commands/delegation.md +6 -5
  17. package/.claude/skills/workflow-commands/entry-sequence.md +9 -9
  18. package/.claude/skills/workflow-commands/followup.md +9 -31
  19. package/.claude/skills/workflow-commands/fullrun-steps.md +36 -45
  20. package/.claude/skills/workflow-commands/fullrun.md +2 -2
  21. package/.claude/skills/workflow-commands/halfrun.md +17 -25
  22. package/.claude/skills/workflow-commands/issue-comments.md +16 -12
  23. package/.claude/skills/workflow-commands/issue-scout.md +2 -2
  24. package/.claude/skills/workflow-commands/kickoff.md +24 -23
  25. package/.claude/skills/workflow-commands/latest-gate.md +7 -12
  26. package/.claude/skills/workflow-commands/needs-human-review.md +9 -14
  27. package/.claude/skills/workflow-commands/observation-filing.md +4 -36
  28. package/.claude/skills/workflow-commands/observation-ledger.md +1 -1
  29. package/.claude/skills/workflow-commands/pre-gate-cut.md +13 -30
  30. package/.claude/skills/workflow-commands/prerequisite.md +10 -16
  31. package/.claude/skills/workflow-commands/progress-watcher.md +1 -1
  32. package/.claude/skills/workflow-commands/prrun.md +3 -7
  33. package/.claude/skills/workflow-commands/retrospective.md +1 -1
  34. package/.claude/skills/workflow-commands/split-assessment.md +13 -1
  35. package/.claude/skills/workflow-commands/working-tree-hold.md +9 -9
  36. package/.codex/hooks.json +5 -5
  37. package/.github/actions/setup-node/action.yml +9 -0
  38. package/.github/actions/setup-pnpm/action.yml +1 -1
  39. package/.github/dependabot.yml +16 -0
  40. package/.github/release.yml +0 -2
  41. package/.github/workflows/ci.yml +120 -10
  42. package/.github/workflows/publish.yml +8 -1
  43. package/.github/workflows/sonar-qube.yml +1 -0
  44. package/.prettierignore +2 -0
  45. package/.vscode/tasks.json +1 -2
  46. package/CLAUDE.md +3 -7
  47. package/README.md +4 -2
  48. package/SECURITY.md +1 -1
  49. package/dist/CLAUDE.md +3 -7
  50. package/dist/commands/document-read-cli.js +882 -0
  51. package/dist/commands/{document-section-cli.js → document-section-main.js} +79 -37
  52. package/dist/commands/read-set-cli.js +1867 -0
  53. package/dist/commands/run-prep-main.js +21653 -0
  54. package/dist/commands/run-step-cli.js +23880 -0
  55. package/dist/config-merge/index.js +5 -1
  56. package/dist/hooks/audit-provision.js +20 -35
  57. package/dist/hooks/{chunk-DGT54IH5.js → chunk-AZX4FGQ3.js} +63 -17
  58. package/dist/hooks/chunk-CWMBGKYW.js +6483 -0
  59. package/dist/hooks/chunk-O2YBIDSI.js +4306 -0
  60. package/dist/hooks/{chunk-TNUMY6NL.js → chunk-PT5R6UJD.js} +4193 -1900
  61. package/dist/hooks/chunk-TUIFS5E7.js +72 -0
  62. package/dist/hooks/{chunk-723HKZO5.js → chunk-VWWCFGWK.js} +1 -1
  63. package/dist/hooks/{chunk-APUO6U4J.js → chunk-WR2KQAYZ.js} +1843 -440
  64. package/dist/hooks/{chunk-O6GDRNJB.js → chunk-XGBNSWEI.js} +248 -46
  65. package/dist/hooks/chunk-YCDOIR3I.js +3456 -0
  66. package/dist/hooks/codex-hook-adapter.js +10 -22
  67. package/dist/hooks/format-edited.js +5 -6
  68. package/dist/hooks/inputs.json +443 -317
  69. package/dist/hooks/pretool-guard.js +7 -25
  70. package/dist/hooks/session-lang.js +44 -51
  71. package/dist/hooks/stop-guard.js +7716 -2187
  72. package/dist/josh.js +6002 -3583
  73. package/dist/self-sync-guard/index.js +74 -10
  74. package/dist/version/index.js +115 -406
  75. package/eslint/base.js +1 -1
  76. package/lefthook/base.yml +3 -1
  77. package/package.json +10 -48
  78. package/pnpm-workspace.yaml +4 -2
  79. package/prompts/coding-standards.md +1 -1
  80. package/prompts/collaboration-workflow/file-edits.md +1 -7
  81. package/prompts/collaboration-workflow/issue-citation.md +1 -1
  82. package/prompts/collaboration-workflow/issue-template.md +33 -16
  83. package/prompts/collaboration-workflow/lane-instructions.md +1 -2
  84. package/prompts/collaboration-workflow/measurement.md +37 -0
  85. package/prompts/collaboration-workflow/operating-rules.md +4 -6
  86. package/prompts/collaboration-workflow/output-bounds.md +2 -7
  87. package/prompts/collaboration-workflow/plan-comment.md +3 -42
  88. package/prompts/collaboration-workflow/principles.md +5 -0
  89. package/prompts/collaboration-workflow/report-format.md +31 -60
  90. package/prompts/collaboration-workflow/residency.md +2 -2
  91. package/prompts/collaboration-workflow/shell-body.md +6 -16
  92. package/prompts/collaboration-workflow/turn-batching.md +0 -2
  93. package/prompts/collaboration-workflow/upstream-interrupt.md +14 -4
  94. package/prompts/collaboration-workflow/wip-cap.md +1 -1
  95. package/prompts/collaboration-workflow.md +3 -7
  96. package/prompts/refactoring.md +1 -1
  97. package/prompts/review-rubric.md +1 -2
  98. package/prompts/review.md +41 -21
  99. package/prompts/testing-guide.md +8 -43
  100. package/scripts/agent/agent-event.ts +15 -15
  101. package/scripts/agent/agent-exit-record.ts +13 -1
  102. package/scripts/agent/api-auth.ts +41 -0
  103. package/scripts/agent/api-outage.ts +1 -1
  104. package/scripts/auto-ok/auto-ok-cli.ts +14 -16
  105. package/scripts/auto-ok/auto-ok-judge-read.ts +12 -3
  106. package/scripts/auto-ok/auto-ok-judge-write.ts +46 -19
  107. package/scripts/auto-ok/auto-ok-judge.ts +13 -2
  108. package/scripts/auto-ok/auto-ok-main.ts +17 -0
  109. package/scripts/backlog/backlog-arrival.ts +14 -3
  110. package/scripts/backlog/backlog-budget-cli.ts +7 -33
  111. package/scripts/backlog/backlog-budget-main.ts +16 -0
  112. package/scripts/backlog/backlog-budget.ts +2 -3
  113. package/scripts/backlog/backlog-defect-priority.ts +4 -3
  114. package/scripts/backlog/backlog-drive-adopt.ts +67 -0
  115. package/scripts/backlog/backlog-drive-args.ts +4 -5
  116. package/scripts/backlog/backlog-drive-cli.ts +113 -28
  117. package/scripts/backlog/backlog-drive-hold.ts +162 -0
  118. package/scripts/backlog/backlog-drive-idle.ts +151 -0
  119. package/scripts/backlog/backlog-drive-judge.ts +25 -0
  120. package/scripts/backlog/backlog-drive-memory.ts +126 -0
  121. package/scripts/backlog/backlog-drive-named-offer.ts +5 -10
  122. package/scripts/backlog/backlog-drive-named.ts +53 -6
  123. package/scripts/backlog/backlog-drive-offer-argv.ts +3 -8
  124. package/scripts/backlog/backlog-drive-paused.ts +169 -0
  125. package/scripts/backlog/backlog-drive-restore.ts +30 -7
  126. package/scripts/backlog/backlog-drive-seats.ts +18 -8
  127. package/scripts/backlog/backlog-drive-token-handling.ts +38 -0
  128. package/scripts/backlog/backlog-drive.ts +79 -75
  129. package/scripts/backlog/backlog-next-main.ts +16 -0
  130. package/scripts/backlog/backlog-next-shared.ts +73 -0
  131. package/scripts/backlog/backlog-next.ts +48 -16
  132. package/scripts/backlog/backlog-occupied.ts +52 -39
  133. package/scripts/backlog/backlog-offer-cli.ts +6 -21
  134. package/scripts/backlog/backlog-offer-exclude.ts +15 -0
  135. package/scripts/backlog/backlog-offer-main.ts +12 -0
  136. package/scripts/backlog/backlog-offer.ts +36 -3
  137. package/scripts/backlog/backlog-overlap.ts +22 -4
  138. package/scripts/backlog/backlog-plan-read.ts +6 -2
  139. package/scripts/backlog/backlog-plan.ts +18 -4
  140. package/scripts/backlog/backlog-pool.ts +10 -10
  141. package/scripts/backlog/backlog-rank.ts +10 -2
  142. package/scripts/backlog/backlog-ready.ts +112 -30
  143. package/scripts/backlog/backlog-stalled-detect.ts +109 -36
  144. package/scripts/backlog/backlog-stalled.ts +52 -16
  145. package/scripts/backlog/backlog-wait-cause.ts +86 -0
  146. package/scripts/backlog/backlog-waves.ts +39 -13
  147. package/scripts/backlog/backlogrun-args.ts +19 -7
  148. package/scripts/backlog/backlogrun-cli.ts +19 -5
  149. package/scripts/backlog/backlogrun-launch.ts +6 -0
  150. package/scripts/backlog/backlogrun-restart.ts +97 -0
  151. package/scripts/backlog/backlogrun-stop.ts +79 -7
  152. package/scripts/behavior/behavior-cli.ts +2 -2
  153. package/scripts/behavior/behavior-rules.ts +47 -24
  154. package/scripts/build/build-bin.ts +2 -16
  155. package/scripts/build/build-claude-md.ts +0 -7
  156. package/scripts/build/build-commands.ts +0 -13
  157. package/scripts/build/build-hooks.ts +49 -48
  158. package/scripts/build/hook-bundle-stamp.ts +29 -11
  159. package/scripts/build/local-bin.ts +1 -1
  160. package/scripts/cases/cases-cli.ts +25 -13
  161. package/scripts/cases/cases-interaction-scan.ts +134 -0
  162. package/scripts/cases/cases-interaction.ts +183 -0
  163. package/scripts/cases/cases-logic.ts +39 -6
  164. package/scripts/ci/pr-classification-main.ts +18 -0
  165. package/scripts/ci/pr-classification.ts +10 -17
  166. package/scripts/clone/clone-scan.ts +1 -1
  167. package/scripts/cost-runtime/cost-blocks.ts +22 -37
  168. package/scripts/cost-runtime/cost-cli.ts +31 -14
  169. package/scripts/cost-runtime/cost-main.ts +12 -0
  170. package/scripts/cost-runtime/cost-transcript.ts +1 -0
  171. package/scripts/delegation/delegation-policy.ts +17 -4
  172. package/scripts/delegation/duplicate-read-guard.ts +0 -8
  173. package/scripts/delegation/investigation-guard.ts +0 -8
  174. package/scripts/delegation/investigation-reads.ts +3 -4
  175. package/scripts/dependabot/dependabot-cooldown.ts +194 -0
  176. package/scripts/discovery/repo-discovery.ts +24 -6
  177. package/scripts/doctor/doctor-consumer.ts +2 -5
  178. package/scripts/document/document-byte-budget.ts +8 -6
  179. package/scripts/document/document-scan.ts +1 -1
  180. package/scripts/document/document-section-cli.ts +0 -8
  181. package/scripts/document/document-section-main.ts +12 -0
  182. package/scripts/epic/epic-audit-cli.ts +12 -6
  183. package/scripts/epic/epic-bundle-apply.ts +137 -0
  184. package/scripts/epic/epic-bundle-cli.ts +32 -121
  185. package/scripts/epic/epic-bundle-format.ts +116 -0
  186. package/scripts/epic/epic-bundle-main.ts +17 -0
  187. package/scripts/epic/epic-busy.ts +5 -12
  188. package/scripts/epic/epic-classify.ts +24 -15
  189. package/scripts/epic/epic-cli-argv.ts +31 -0
  190. package/scripts/epic/epic-cli-decide.ts +42 -0
  191. package/scripts/epic/epic-cli.ts +6 -38
  192. package/scripts/epic/epic-close.ts +112 -55
  193. package/scripts/epic/epic-cross-repo.ts +4 -7
  194. package/scripts/epic/epic-decide.ts +119 -0
  195. package/scripts/epic/epic-decision.ts +9 -0
  196. package/scripts/epic/epic-fetch.ts +4 -0
  197. package/scripts/epic/epic-graph.ts +2 -0
  198. package/scripts/epic/epic-issue.ts +5 -1
  199. package/scripts/epic/epic-label-age.ts +1 -1
  200. package/scripts/epic/epic-lane-offer.ts +39 -4
  201. package/scripts/epic/epic-next-main.ts +24 -0
  202. package/scripts/epic/epic-next.ts +6 -24
  203. package/scripts/epic/epic-outside-blocker.ts +6 -2
  204. package/scripts/epic/epic-parse.ts +9 -3
  205. package/scripts/epic/epic-read.ts +1 -0
  206. package/scripts/epic/epic-reconcile.ts +39 -0
  207. package/scripts/epic/epic-run.ts +10 -1
  208. package/scripts/epic/epic-solo.ts +50 -14
  209. package/scripts/epic/epic.ts +41 -7
  210. package/scripts/exports/unused-members-cli.ts +2 -2
  211. package/scripts/followup/followup-checks-event.ts +8 -3
  212. package/scripts/followup/followup-coderabbit-wait.ts +82 -0
  213. package/scripts/followup/followup-review-gates.ts +81 -0
  214. package/scripts/followup/git-followup-stages.ts +13 -3
  215. package/scripts/followup/git-followup-workflow.ts +19 -66
  216. package/scripts/followup/git-pr-followup-wrapup.ts +9 -14
  217. package/scripts/followup/git-pr-followup.ts +36 -8
  218. package/scripts/fresh-machine/fresh-machine-cli.ts +1 -1
  219. package/scripts/fresh-machine/fresh-machine-run.ts +8 -8
  220. package/scripts/fresh-machine/specs/kit-test-backlogrun.json +1 -1
  221. package/scripts/gate/busy-average.ts +58 -0
  222. package/scripts/gate/check-cpu.ts +60 -0
  223. package/scripts/gate/check-inputs.ts +39 -95
  224. package/scripts/gate/check-reuse.ts +33 -54
  225. package/scripts/gate/command-memory.ts +192 -0
  226. package/scripts/gate/core-admission.ts +218 -28
  227. package/scripts/gate/core-budget-timing.ts +37 -0
  228. package/scripts/gate/core-budget.ts +80 -98
  229. package/scripts/gate/core-wait-record.ts +48 -0
  230. package/scripts/gate/core-wait.ts +37 -5
  231. package/scripts/gate/core-weights.ts +86 -0
  232. package/scripts/gate/free-cores.ts +27 -4
  233. package/scripts/gate/gate-ledger.ts +32 -4
  234. package/scripts/gate/gate-plan.ts +41 -34
  235. package/scripts/gate/gate-report.ts +14 -2
  236. package/scripts/gate/gate-run-steps.ts +53 -8
  237. package/scripts/gate/gate-skip.ts +12 -2
  238. package/scripts/gate/gate-steps.ts +12 -1
  239. package/scripts/gate/input-fingerprint.ts +42 -0
  240. package/scripts/gate/machine-capacity.ts +65 -31
  241. package/scripts/gate/moved-paths.ts +67 -0
  242. package/scripts/gate/project-checks.ts +5 -12
  243. package/scripts/gate/scoped-green.ts +12 -8
  244. package/scripts/gate/since-green.ts +62 -0
  245. package/scripts/gate/toolchain-inputs.ts +115 -0
  246. package/scripts/gate/verification-gate.ts +27 -24
  247. package/scripts/gate/verification-inputs.ts +250 -0
  248. package/scripts/gh/gh-author-association.ts +96 -9
  249. package/scripts/gh/git-ai-review-scan.ts +4 -2
  250. package/scripts/gh/git-gh-api-path.ts +15 -0
  251. package/scripts/gh/git-gh-branch-rules.ts +73 -0
  252. package/scripts/gh/git-gh-conditional.ts +5 -2
  253. package/scripts/gh/git-gh-issue-read.ts +5 -1
  254. package/scripts/gh/git-gh-issue-write.ts +67 -29
  255. package/scripts/gh/git-gh-issue.ts +7 -3
  256. package/scripts/gh/git-gh-poll-read.ts +89 -0
  257. package/scripts/gh/git-gh-pr-auto-merge.ts +8 -3
  258. package/scripts/gh/git-gh-pr-rest.ts +1 -1
  259. package/scripts/gh/git-gh-pr-snapshot.ts +33 -20
  260. package/scripts/gh/git-gh-pr.ts +27 -15
  261. package/scripts/gh/git-pr-checks-eval.ts +39 -7
  262. package/scripts/gh/git-pr-checks-parse.ts +39 -9
  263. package/scripts/gh/git-pr-merge-checked.ts +80 -0
  264. package/scripts/git/base-tree.ts +19 -2
  265. package/scripts/git/changed-file-scope.ts +6 -4
  266. package/scripts/git/changed-paths.ts +18 -1
  267. package/scripts/git/git-diff-reads.ts +27 -2
  268. package/scripts/git/git-grep-hits.ts +85 -0
  269. package/scripts/git/git-location-environment.ts +1 -1
  270. package/scripts/git/git-merge-conflicts.ts +83 -0
  271. package/scripts/git/git-preflight.ts +37 -12
  272. package/scripts/git/git-push-transport.ts +1 -2
  273. package/scripts/git/git-schemas.ts +17 -7
  274. package/scripts/git/git-spawn.ts +1 -2
  275. package/scripts/git/git-status.ts +4 -4
  276. package/scripts/git/main-merge-main.ts +12 -0
  277. package/scripts/git/main-merge-regenerate.ts +2 -2
  278. package/scripts/git/main-merge.ts +25 -9
  279. package/scripts/git/main-sync-main.ts +12 -0
  280. package/scripts/git/main-sync.ts +0 -9
  281. package/scripts/git/stash/git-stash.ts +27 -4
  282. package/scripts/git/stash/{stash-pop-args.ts → stash-args.ts} +13 -10
  283. package/scripts/git/stash/stash-pop-cli.ts +6 -12
  284. package/scripts/git/stash/stash-pop-main.ts +12 -0
  285. package/scripts/git/stash/stash-push-cli.ts +76 -0
  286. package/scripts/git/stash/stash-push-main.ts +12 -0
  287. package/scripts/hooks/batch-guard.ts +0 -8
  288. package/scripts/hooks/check-commit-message-main.ts +8 -0
  289. package/scripts/hooks/check-commit-message.ts +4 -7
  290. package/scripts/hooks/format-edited-file.ts +8 -24
  291. package/scripts/hooks/pre-commit-lint.ts +30 -3
  292. package/scripts/hooks/pre-push-unit.ts +4 -2
  293. package/scripts/hooks/pretool-guard-cli.ts +1 -8
  294. package/scripts/hooks/pretool-guard.ts +32 -19
  295. package/scripts/hooks/reserved-run.ts +67 -9
  296. package/scripts/hooks/run-hook.sh +13 -4
  297. package/scripts/hooks/shell-rules-notice.ts +37 -0
  298. package/scripts/hooks/stop-actions.ts +2 -21
  299. package/scripts/hooks/stop-guard.ts +13 -9
  300. package/scripts/init/hook-command-rewrite.ts +19 -5
  301. package/scripts/init/hook-launch.ts +15 -17
  302. package/scripts/init/init-actions.ts +0 -6
  303. package/scripts/init/init-ai-copy.ts +10 -36
  304. package/scripts/init/init-bootstrap.ts +9 -8
  305. package/scripts/init/init-dry-run-report.ts +1 -1
  306. package/scripts/init/init-dry-run.ts +1 -1
  307. package/scripts/init/init-file-action.ts +7 -9
  308. package/scripts/init/init-logic-json-merge.ts +2 -2
  309. package/scripts/init/init-logic-migrate.ts +9 -82
  310. package/scripts/init/init-logic.ts +3 -2
  311. package/scripts/init/init-main.ts +12 -0
  312. package/scripts/init/init.ts +5 -12
  313. package/scripts/init/kit-development-versions.ts +3 -7
  314. package/scripts/init/kit-written-paths.ts +2 -2
  315. package/scripts/init/project-profile.ts +5 -4
  316. package/scripts/init/tsconfig-preset-migration.ts +2 -1
  317. package/scripts/init/vscode-tasks.ts +1 -1
  318. package/scripts/issue/defect-origin-cli.ts +106 -0
  319. package/scripts/issue/defect-origin-line.ts +60 -0
  320. package/scripts/issue/defect-origin-main.ts +11 -0
  321. package/scripts/issue/defect-origin.ts +114 -0
  322. package/scripts/issue/defect-rate-cli.ts +34 -78
  323. package/scripts/issue/defect-rate.ts +0 -16
  324. package/scripts/issue/defect-report-cli.ts +128 -0
  325. package/scripts/issue/defect-report-format.ts +56 -0
  326. package/scripts/issue/defect-report-main.ts +11 -0
  327. package/scripts/issue/defect-report.ts +160 -0
  328. package/scripts/issue/expected-effect-lint.ts +1 -0
  329. package/scripts/issue/issue-already-done-cli.ts +62 -0
  330. package/scripts/issue/issue-body-or-comment.ts +40 -0
  331. package/scripts/issue/issue-cite-cli.ts +0 -9
  332. package/scripts/issue/issue-cite-main.ts +12 -0
  333. package/scripts/issue/issue-classification.ts +12 -7
  334. package/scripts/issue/issue-comment-cli.ts +10 -24
  335. package/scripts/issue/issue-comment-main.ts +12 -0
  336. package/scripts/issue/issue-evidence-exit.ts +100 -0
  337. package/scripts/issue/issue-file-cli.ts +29 -7
  338. package/scripts/issue/issue-file.ts +19 -19
  339. package/scripts/issue/issue-fold-cli.ts +2 -11
  340. package/scripts/issue/issue-fold-main.ts +12 -0
  341. package/scripts/issue/issue-labels.ts +81 -90
  342. package/scripts/issue/issue-lint-cli.ts +2 -10
  343. package/scripts/issue/issue-lint-main.ts +12 -0
  344. package/scripts/issue/issue-measured-cli.ts +56 -0
  345. package/scripts/issue/issue-merged.ts +19 -2
  346. package/scripts/issue/issue-not-before-label.ts +135 -0
  347. package/scripts/issue/issue-not-before.ts +111 -0
  348. package/scripts/issue/issue-number-shape.ts +15 -1
  349. package/scripts/issue/issue-park.ts +28 -0
  350. package/scripts/issue/issue-plan-cli.ts +151 -0
  351. package/scripts/issue/issue-priority.ts +151 -0
  352. package/scripts/issue/issue-rank.ts +7 -1
  353. package/scripts/issue/issue-read-cli.ts +3 -10
  354. package/scripts/issue/issue-read-main.ts +12 -0
  355. package/scripts/issue/issue-read.ts +29 -5
  356. package/scripts/issue/issue-release-cli.ts +0 -10
  357. package/scripts/issue/issue-release-main.ts +13 -0
  358. package/scripts/issue/issue-release.ts +7 -12
  359. package/scripts/issue/issue-sample-gate.ts +192 -0
  360. package/scripts/issue/issue-sample-source.ts +76 -0
  361. package/scripts/issue/issue-scout-cli.ts +0 -11
  362. package/scripts/issue/issue-scout-main.ts +14 -0
  363. package/scripts/issue/issue-state-cli.ts +0 -10
  364. package/scripts/issue/issue-state-main.ts +12 -0
  365. package/scripts/issue/issue-watch-diff.ts +56 -15
  366. package/scripts/issue/issue-watch.ts +2 -1
  367. package/scripts/issue/issue-wip.ts +2 -7
  368. package/scripts/issue/measure-rerun-cli.ts +13 -8
  369. package/scripts/issue/plan-consumers-cli.ts +39 -0
  370. package/scripts/issue/plan-consumers-main.ts +11 -0
  371. package/scripts/issue/plan-consumers-section.ts +55 -0
  372. package/scripts/issue/plan-consumers.ts +127 -0
  373. package/scripts/josh/agent-session-environment.ts +1 -1
  374. package/scripts/josh/command-usage.ts +15 -43
  375. package/scripts/josh/file-map-stamp.ts +49 -16
  376. package/scripts/josh/hook-decision.ts +32 -20
  377. package/scripts/josh/josh-command-map.ts +4 -1
  378. package/scripts/josh/josh-command-types.ts +12 -6
  379. package/scripts/josh/josh-commands-agent-hooks.ts +83 -0
  380. package/scripts/josh/josh-commands-ai.ts +157 -158
  381. package/scripts/josh/josh-commands-backlog.ts +82 -16
  382. package/scripts/josh/josh-commands-clone.ts +1 -0
  383. package/scripts/josh/josh-commands-development.ts +111 -71
  384. package/scripts/josh/josh-commands-document.ts +43 -1
  385. package/scripts/josh/josh-commands-epic.ts +171 -0
  386. package/scripts/josh/josh-commands-hooks.ts +25 -2
  387. package/scripts/josh/josh-commands-issue-write.ts +181 -0
  388. package/scripts/josh/josh-commands-issue.ts +124 -24
  389. package/scripts/josh/josh-commands-lane.ts +103 -2
  390. package/scripts/josh/josh-commands-lint.ts +19 -8
  391. package/scripts/josh/josh-commands-maintenance.ts +112 -4
  392. package/scripts/josh/josh-commands-pause.ts +29 -0
  393. package/scripts/josh/josh-commands-progress.ts +87 -0
  394. package/scripts/josh/josh-commands-project.ts +138 -9
  395. package/scripts/josh/josh-commands-review.ts +124 -0
  396. package/scripts/josh/josh-commands-run.ts +211 -23
  397. package/scripts/josh/josh-commands-ship.ts +169 -0
  398. package/scripts/josh/josh-commands-split.ts +9 -0
  399. package/scripts/josh/josh-commands-versioning.ts +49 -2
  400. package/scripts/josh/josh-commands-workflow.ts +144 -6
  401. package/scripts/josh/josh-logic.ts +6 -13
  402. package/scripts/josh/package-directory.ts +2 -4
  403. package/scripts/josh/process-identity.ts +13 -4
  404. package/scripts/josh/session-language-cli.ts +4 -8
  405. package/scripts/josh/session-language-main.ts +13 -0
  406. package/scripts/josh/session-language.ts +6 -1
  407. package/scripts/josh/shared-cache.ts +90 -0
  408. package/scripts/josh/stamp-file.ts +9 -15
  409. package/scripts/lane/lane-await.ts +51 -12
  410. package/scripts/lane/lane-cache.ts +5 -30
  411. package/scripts/lane/lane-capacity.ts +14 -23
  412. package/scripts/lane/lane-check-stats.ts +62 -21
  413. package/scripts/lane/lane-child-invocation.ts +8 -0
  414. package/scripts/lane/lane-cli.ts +15 -5
  415. package/scripts/lane/lane-close.ts +86 -18
  416. package/scripts/lane/lane-core-wait-stats.ts +66 -0
  417. package/scripts/lane/lane-dispatch.ts +24 -3
  418. package/scripts/lane/lane-gap-stats.ts +156 -0
  419. package/scripts/lane/lane-handoff.ts +69 -1
  420. package/scripts/lane/lane-held-stats.ts +129 -0
  421. package/scripts/lane/lane-install.ts +4 -11
  422. package/scripts/lane/lane-launch-cli.ts +0 -9
  423. package/scripts/lane/lane-launch-main.ts +12 -0
  424. package/scripts/lane/lane-ledger-schema.ts +266 -0
  425. package/scripts/lane/lane-ledger.ts +92 -123
  426. package/scripts/lane/lane-limit-cli.ts +12 -1
  427. package/scripts/lane/lane-measure-cli.ts +57 -11
  428. package/scripts/lane/lane-open.ts +9 -1
  429. package/scripts/lane/lane-parked.ts +3 -3
  430. package/scripts/lane/lane-pause-cli.ts +130 -0
  431. package/scripts/lane/lane-pause.ts +158 -0
  432. package/scripts/lane/lane-process-table.ts +166 -0
  433. package/scripts/lane/lane-reap-settle.ts +124 -0
  434. package/scripts/lane/lane-reap.ts +50 -15
  435. package/scripts/lane/lane-registry.ts +24 -3
  436. package/scripts/lane/lane-residents.ts +162 -0
  437. package/scripts/lane/lane-restart.ts +22 -2
  438. package/scripts/lane/lane-round-two-stats.ts +49 -0
  439. package/scripts/lane/lane-sampler.ts +4 -0
  440. package/scripts/lane/lane-session-action.ts +19 -5
  441. package/scripts/lane/lane-session-broker.ts +102 -21
  442. package/scripts/lane/lane-snapshot-trace.ts +84 -0
  443. package/scripts/lane/lane-spans.ts +51 -0
  444. package/scripts/lane/lane-spent.ts +6 -3
  445. package/scripts/lane/lane-stage-stats.ts +7 -2
  446. package/scripts/lane/lane-state.ts +302 -0
  447. package/scripts/lane/lane-stats.ts +58 -4
  448. package/scripts/lane/lane-stop-stats.ts +113 -37
  449. package/scripts/lane/lane-test-related-stats.ts +127 -0
  450. package/scripts/lane/lane-transcript-calls.ts +145 -0
  451. package/scripts/lane/lane-transcript-stats.ts +168 -0
  452. package/scripts/lane/lane-vacant.ts +13 -3
  453. package/scripts/lane/lane-withdraw-cli.ts +5 -4
  454. package/scripts/lane/lane-withdraw.ts +50 -49
  455. package/scripts/lane/process-directories.ts +70 -0
  456. package/scripts/lane/process-lane-marks.ts +94 -0
  457. package/scripts/lib/atomic-write.ts +62 -0
  458. package/scripts/lib/buffered-process.ts +12 -5
  459. package/scripts/lib/cli-flags.ts +53 -0
  460. package/scripts/lib/figure-format.ts +63 -0
  461. package/scripts/lib/json-value.ts +9 -1
  462. package/scripts/lib/package-manifest.ts +35 -0
  463. package/scripts/lib/read-file.ts +3 -1
  464. package/scripts/lib/stamped-memo.ts +63 -0
  465. package/scripts/lib/stdout-on-stderr.ts +24 -0
  466. package/scripts/lib/timeouts.ts +9 -0
  467. package/scripts/lib/transcript-record.ts +91 -0
  468. package/scripts/lines/effective-limit.ts +1 -1
  469. package/scripts/lint/eslint-cache-dependencies.ts +145 -0
  470. package/scripts/lint/eslint-daemon.ts +265 -0
  471. package/scripts/lint/format.ts +11 -2
  472. package/scripts/lint/import-graph.ts +279 -0
  473. package/scripts/lint/lint-gate-scope.ts +102 -0
  474. package/scripts/lint/lint-parallel-main.ts +19 -0
  475. package/scripts/lint/lint-parallel.ts +62 -30
  476. package/scripts/lint/lint-related-scope.ts +30 -24
  477. package/scripts/lint/lint-related.ts +38 -6
  478. package/scripts/notify/confirmation-options.ts +1 -2
  479. package/scripts/notify/telegram-notify.ts +20 -20
  480. package/scripts/notify/telegram-test-logic.ts +0 -1
  481. package/scripts/notify/telegram-test-main.ts +8 -0
  482. package/scripts/notify/telegram-test.ts +2 -6
  483. package/scripts/observations/observation-ledger.ts +13 -0
  484. package/scripts/observations/observations-flush-landing.ts +5 -3
  485. package/scripts/observations/observations-flush.ts +6 -1
  486. package/scripts/overrides/overrides-check.ts +2 -5
  487. package/scripts/overrides/overrides-files.ts +2 -1
  488. package/scripts/overrides/overrides-logic.ts +3 -6
  489. package/scripts/package/verify-optional-eslint-install.ts +8 -6
  490. package/scripts/propagate/propagate-publish.ts +2 -7
  491. package/scripts/propagate/propagate-targets.ts +4 -12
  492. package/scripts/refactor/import-graph.ts +9 -7
  493. package/scripts/release/github-release-runs.ts +17 -6
  494. package/scripts/release/release-approval-prune.ts +18 -0
  495. package/scripts/release/release-history.ts +1 -3
  496. package/scripts/release/release-progress.ts +42 -22
  497. package/scripts/release/release-publish-run.ts +39 -0
  498. package/scripts/release/release-publish.ts +6 -6
  499. package/scripts/release/release-scope-cli.ts +0 -10
  500. package/scripts/release/release-scope-main.ts +12 -0
  501. package/scripts/repo/repo-setting.ts +3 -6
  502. package/scripts/repo/required-checks-logic.ts +6 -15
  503. package/scripts/report/report-format-reference.ts +2 -0
  504. package/scripts/report/report-labels.ts +155 -0
  505. package/scripts/report/report-lint-cli.ts +3 -0
  506. package/scripts/report/report-lint.ts +85 -110
  507. package/scripts/report/report-template-cli.ts +59 -0
  508. package/scripts/report/report-template.ts +112 -0
  509. package/scripts/review/acceptance-map.ts +1 -0
  510. package/scripts/review/removed-tests-check.ts +86 -0
  511. package/scripts/review/removed-tests.ts +149 -0
  512. package/scripts/review/review-brief-cli.ts +81 -15
  513. package/scripts/review/review-brief-main.ts +12 -0
  514. package/scripts/review/review-brief.ts +31 -3
  515. package/scripts/review/review-code-tree.ts +10 -6
  516. package/scripts/review/review-comment-round.ts +26 -8
  517. package/scripts/review/review-finding-ledger.ts +30 -15
  518. package/scripts/review/review-interaction.ts +94 -0
  519. package/scripts/review/review-readers-scan.ts +163 -0
  520. package/scripts/review/review-record-cli.ts +69 -30
  521. package/scripts/review/review-record-main.ts +12 -0
  522. package/scripts/review/review-round-one-blobs.ts +221 -0
  523. package/scripts/review/review-round2-cli.ts +49 -12
  524. package/scripts/review/review-round2.ts +80 -12
  525. package/scripts/review/review-stamps.ts +19 -1
  526. package/scripts/review/review-stop-log.ts +96 -0
  527. package/scripts/review/review-stops-cli.ts +85 -0
  528. package/scripts/review/review-tree.ts +6 -17
  529. package/scripts/review/review-untouched-readers.ts +146 -0
  530. package/scripts/review/test-titles.ts +118 -0
  531. package/scripts/rules/agent-model.ts +8 -0
  532. package/scripts/rules/bash-triggers.ts +46 -3
  533. package/scripts/rules/decision-oracle-batch.ts +9 -1
  534. package/scripts/rules/decision-oracle.ts +2 -2
  535. package/scripts/rules/delivered-rules.ts +80 -2
  536. package/scripts/rules/destructive-command.ts +8 -1
  537. package/scripts/rules/direct-filing.ts +10 -2
  538. package/scripts/rules/direct-issue-comment.ts +117 -0
  539. package/scripts/rules/direct-pr-create.ts +69 -3
  540. package/scripts/rules/early-heartbeat.ts +2 -1
  541. package/scripts/rules/file-body.ts +7 -0
  542. package/scripts/rules/filing-cap.ts +7 -0
  543. package/scripts/rules/git-argv.ts +72 -14
  544. package/scripts/rules/git-force.ts +12 -2
  545. package/scripts/rules/guard-remedy.ts +4 -0
  546. package/scripts/rules/implementation-cut-verdict.ts +1 -1
  547. package/scripts/rules/implementation-cut.ts +11 -3
  548. package/scripts/rules/index-guard.ts +8 -1
  549. package/scripts/rules/issue-comments.ts +9 -1
  550. package/scripts/rules/josh-git-bare.ts +7 -0
  551. package/scripts/rules/lane-background.ts +67 -25
  552. package/scripts/rules/lane-carry-conflict.ts +6 -0
  553. package/scripts/rules/lane-direct-tool.ts +74 -0
  554. package/scripts/rules/lane-interactive-ask.ts +9 -2
  555. package/scripts/rules/lane-park.ts +45 -23
  556. package/scripts/rules/lane-split-park.ts +10 -2
  557. package/scripts/rules/lane-switch-main.ts +7 -0
  558. package/scripts/rules/oracle-consulted.ts +10 -0
  559. package/scripts/rules/oracle-firing.ts +1 -0
  560. package/scripts/rules/permission-guards.ts +3 -0
  561. package/scripts/rules/piped-verification.ts +1 -1
  562. package/scripts/rules/poll-loop.ts +7 -0
  563. package/scripts/rules/pr-merge.ts +123 -0
  564. package/scripts/rules/protected-files.ts +32 -5
  565. package/scripts/rules/raw-field-body.ts +6 -0
  566. package/scripts/rules/rule-body-guard.ts +8 -0
  567. package/scripts/rules/rule-list.ts +9 -28
  568. package/scripts/rules/rule-value-cache.ts +4 -9
  569. package/scripts/rules/rule-value-cli.ts +51 -32
  570. package/scripts/rules/rule-value.ts +1 -1
  571. package/scripts/rules/shell-segments.ts +35 -0
  572. package/scripts/rules/stop-rule-rows.ts +64 -0
  573. package/scripts/rules/stop-rules.ts +3 -4
  574. package/scripts/rules/test-declared-commit.ts +11 -1
  575. package/scripts/rules/third-party-write.ts +7 -0
  576. package/scripts/rules/timed-rerun.ts +69 -0
  577. package/scripts/rules/worktree-guard.ts +13 -3
  578. package/scripts/run/board/run-board-app-name.ts +23 -0
  579. package/scripts/run/board/run-board-cli.ts +65 -32
  580. package/scripts/run/board/run-board-earlier.ts +94 -0
  581. package/scripts/run/board/run-board-ending-reason.ts +67 -0
  582. package/scripts/run/board/run-board-estimate-schedule.ts +103 -0
  583. package/scripts/run/board/run-board-estimate.ts +98 -0
  584. package/scripts/run/board/run-board-fit.ts +153 -36
  585. package/scripts/run/board/run-board-fold.ts +123 -0
  586. package/scripts/run/board/run-board-fresh.ts +2 -2
  587. package/scripts/run/board/run-board-gather-live.ts +29 -0
  588. package/scripts/run/board/run-board-gather-thread.ts +189 -0
  589. package/scripts/run/board/run-board-gather-worker.ts +29 -0
  590. package/scripts/run/board/run-board-gather.ts +187 -0
  591. package/scripts/run/board/run-board-github.ts +118 -38
  592. package/scripts/run/board/run-board-header.ts +82 -20
  593. package/scripts/run/board/run-board-keys.ts +58 -0
  594. package/scripts/run/board/run-board-kind.ts +20 -6
  595. package/scripts/run/board/run-board-labels.ts +116 -71
  596. package/scripts/run/board/run-board-lane-state.ts +109 -0
  597. package/scripts/run/board/run-board-lane-time.ts +122 -0
  598. package/scripts/run/board/run-board-layout.ts +239 -60
  599. package/scripts/run/board/run-board-length.ts +52 -0
  600. package/scripts/run/board/run-board-machine.ts +8 -4
  601. package/scripts/run/board/run-board-main.ts +12 -0
  602. package/scripts/run/board/run-board-notes.ts +52 -31
  603. package/scripts/run/board/run-board-now.ts +1 -1
  604. package/scripts/run/board/run-board-operation.ts +15 -33
  605. package/scripts/run/board/run-board-phase.ts +1 -1
  606. package/scripts/run/board/run-board-plan-shared.ts +115 -0
  607. package/scripts/run/board/run-board-plan.ts +55 -3
  608. package/scripts/run/board/run-board-planning.ts +45 -0
  609. package/scripts/run/board/run-board-priority.ts +44 -0
  610. package/scripts/run/board/run-board-process-groups.ts +195 -0
  611. package/scripts/run/board/run-board-read.ts +151 -27
  612. package/scripts/run/board/run-board-reason.ts +235 -51
  613. package/scripts/run/board/run-board-released.ts +35 -0
  614. package/scripts/run/board/run-board-render-checks.ts +39 -5
  615. package/scripts/run/board/run-board-render-condition.ts +96 -0
  616. package/scripts/run/board/run-board-render-drawn.ts +67 -0
  617. package/scripts/run/board/run-board-render-foot.ts +59 -0
  618. package/scripts/run/board/run-board-render-icon.ts +35 -0
  619. package/scripts/run/board/run-board-render-lanes.ts +145 -0
  620. package/scripts/run/board/run-board-render-lead.ts +80 -0
  621. package/scripts/run/board/run-board-render-legend.ts +117 -48
  622. package/scripts/run/board/run-board-render-notes.ts +156 -29
  623. package/scripts/run/board/run-board-render-processes.ts +196 -0
  624. package/scripts/run/board/run-board-render-section.ts +119 -0
  625. package/scripts/run/board/run-board-render-slot.ts +3 -36
  626. package/scripts/run/board/run-board-render-tail.ts +115 -48
  627. package/scripts/run/board/run-board-render-time.ts +56 -0
  628. package/scripts/run/board/run-board-render-title.ts +117 -24
  629. package/scripts/run/board/run-board-render-waits.ts +104 -20
  630. package/scripts/run/board/run-board-render.ts +207 -265
  631. package/scripts/run/board/run-board-roots.ts +54 -0
  632. package/scripts/run/board/run-board-row-yield.ts +9 -4
  633. package/scripts/run/board/run-board-setup.ts +1 -12
  634. package/scripts/run/board/run-board-snapshot.ts +111 -0
  635. package/scripts/run/board/run-board-spin.ts +2 -2
  636. package/scripts/run/board/run-board-state.ts +22 -33
  637. package/scripts/run/board/run-board-status.ts +147 -71
  638. package/scripts/run/board/run-board-thanks-read.ts +2 -2
  639. package/scripts/run/board/run-board-tick.ts +122 -107
  640. package/scripts/run/board/run-board-usage-board.ts +78 -0
  641. package/scripts/run/board/run-board-usage-lanes.ts +113 -0
  642. package/scripts/run/board/run-board-usage-listing.ts +93 -0
  643. package/scripts/run/board/run-board-usage-read.ts +120 -150
  644. package/scripts/run/board/run-board-usage-rusage.ts +19 -7
  645. package/scripts/run/board/run-board-usage-text.ts +139 -51
  646. package/scripts/run/board/run-board-usage-top.ts +102 -0
  647. package/scripts/run/board/run-board-usage.ts +89 -72
  648. package/scripts/run/board/run-board-usual.ts +20 -9
  649. package/scripts/run/carry/run-carry-args.ts +4 -7
  650. package/scripts/run/carry/run-carry-conversation.ts +1 -1
  651. package/scripts/run/carry/run-carry.ts +9 -4
  652. package/scripts/run/cut/run-cut-handoff.ts +2 -2
  653. package/scripts/run/event/run-event-cli.ts +1 -5
  654. package/scripts/run/event/run-event-filed.ts +12 -6
  655. package/scripts/run/event/run-event-follow.ts +2 -3
  656. package/scripts/run/event/run-event-render.ts +6 -10
  657. package/scripts/run/event/run-event-scope.ts +2 -2
  658. package/scripts/run/event/run-event-stream-emit.ts +82 -22
  659. package/scripts/run/event/run-event-stream.ts +34 -8
  660. package/scripts/run/hold/run-hold-adopt.ts +65 -0
  661. package/scripts/run/hold/run-hold-cli.ts +93 -22
  662. package/scripts/run/hold/run-hold-main.ts +12 -0
  663. package/scripts/run/hold/run-hold-member.ts +37 -0
  664. package/scripts/run/hold/run-stop-notify.ts +183 -0
  665. package/scripts/run/merge/run-merge-auth.ts +31 -0
  666. package/scripts/run/merge/run-merge-cli.ts +62 -48
  667. package/scripts/run/merge/run-merge-close.ts +74 -0
  668. package/scripts/run/merge/run-merge-collect.ts +6 -13
  669. package/scripts/run/merge/run-merge-driver.ts +71 -0
  670. package/scripts/run/merge/run-merge-main.ts +12 -0
  671. package/scripts/run/merge/run-merge-outcome.ts +23 -0
  672. package/scripts/run/merge/run-merge-restart.ts +39 -0
  673. package/scripts/run/merge/run-merge-ship.ts +20 -4
  674. package/scripts/run/merge/run-merge-signals.ts +33 -9
  675. package/scripts/run/merge/run-merge-steps.ts +120 -85
  676. package/scripts/run/merge/run-merge.ts +38 -37
  677. package/scripts/run/park/run-park-cli.ts +91 -0
  678. package/scripts/run/park/run-park.ts +88 -0
  679. package/scripts/run/park/run-stalled.ts +68 -0
  680. package/scripts/run/pause/run-pause-cli.ts +73 -0
  681. package/scripts/run/pause/run-pause.ts +251 -0
  682. package/scripts/run/progress/run-progress-cli.ts +4 -12
  683. package/scripts/run/progress/run-progress-clock.ts +1 -1
  684. package/scripts/run/progress/run-progress-config.ts +6 -14
  685. package/scripts/run/progress/run-progress-main.ts +12 -0
  686. package/scripts/run/progress/run-progress.ts +1 -4
  687. package/scripts/run/review/run-review.ts +2 -1
  688. package/scripts/run/run-ending.ts +1 -0
  689. package/scripts/run/run-invocation.ts +5 -6
  690. package/scripts/run/run-liveness-cli.ts +6 -8
  691. package/scripts/run/run-liveness.ts +60 -29
  692. package/scripts/run/run-next.ts +1 -1
  693. package/scripts/run/run-parent-cut-hook.ts +2 -2
  694. package/scripts/run/run-preflight.ts +18 -3
  695. package/scripts/run/run-prep-cli.ts +1 -10
  696. package/scripts/run/run-prep-locate.ts +7 -50
  697. package/scripts/run/run-prep-main.ts +12 -0
  698. package/scripts/run/run-prep.ts +6 -0
  699. package/scripts/run/run-report-cli.ts +101 -13
  700. package/scripts/run/run-report-handoff.ts +114 -0
  701. package/scripts/run/run-step.ts +1 -1
  702. package/scripts/run/run-stranded-detect.ts +13 -0
  703. package/scripts/run/run-watcher-guard-cli.ts +1 -1
  704. package/scripts/run/run-watcher-guard.ts +1 -1
  705. package/scripts/run/ship/run-ship-args.ts +121 -0
  706. package/scripts/run/ship/run-ship-body-draft.ts +110 -0
  707. package/scripts/run/ship/run-ship-cli.ts +63 -140
  708. package/scripts/run/ship/run-ship-detach.ts +19 -8
  709. package/scripts/run/ship/run-ship-infra-retry.ts +59 -0
  710. package/scripts/run/ship/run-ship-next.ts +18 -2
  711. package/scripts/run/ship/run-ship-overlap.ts +42 -5
  712. package/scripts/run/ship/run-ship-place.ts +96 -0
  713. package/scripts/run/ship/run-ship-pre-detach-timed.ts +43 -0
  714. package/scripts/run/ship/run-ship-pre-detach.ts +81 -24
  715. package/scripts/run/ship/run-ship-preflight.ts +137 -32
  716. package/scripts/run/ship/run-ship-probe.ts +11 -3
  717. package/scripts/run/ship/run-ship-relaunch-cap.ts +70 -0
  718. package/scripts/run/ship/run-ship-removed-rows.ts +61 -0
  719. package/scripts/run/ship/run-ship-return.ts +107 -23
  720. package/scripts/run/ship/run-ship-review-steps.ts +105 -151
  721. package/scripts/run/ship/run-ship-review.ts +73 -6
  722. package/scripts/run/ship/run-ship-reviewer.ts +207 -0
  723. package/scripts/run/ship/run-ship-stage.ts +55 -6
  724. package/scripts/run/ship/run-ship-steps.ts +46 -15
  725. package/scripts/run/ship/run-ship-stop-cause.ts +135 -0
  726. package/scripts/run/ship/run-ship-stop-text.ts +11 -6
  727. package/scripts/run/ship/run-ship-sync.ts +43 -6
  728. package/scripts/run/ship/run-ship.ts +30 -2
  729. package/scripts/run/tidy/run-tidy-cli.ts +0 -4
  730. package/scripts/run/tidy/run-tidy-lanes.ts +3 -0
  731. package/scripts/run/tidy/run-tidy-main.ts +8 -0
  732. package/scripts/run/wake/run-wake-cli.ts +119 -100
  733. package/scripts/run/wake/run-wake-code.ts +83 -0
  734. package/scripts/run/wake/run-wake-driver.ts +19 -8
  735. package/scripts/run/wake/run-wake-loop.ts +34 -3
  736. package/scripts/run/wake/run-wake-main.ts +13 -0
  737. package/scripts/run/wake/run-wake-ports.ts +90 -0
  738. package/scripts/run/wake/run-wake-takeover.ts +66 -0
  739. package/scripts/run/wake/run-wake.ts +2 -1
  740. package/scripts/safe-chain/pack-hook.ts +2 -2
  741. package/scripts/safe-chain/preinstall-command.ts +2 -1
  742. package/scripts/safe-chain/project-config.ts +3 -9
  743. package/scripts/security/security-audit-main.ts +8 -0
  744. package/scripts/security/security-audit-provision-logic.ts +0 -11
  745. package/scripts/security/security-audit-provision-main.ts +12 -0
  746. package/scripts/security/security-audit-provision.ts +11 -26
  747. package/scripts/security/security-audit.ts +6 -7
  748. package/scripts/self-sync-guard/self-sync-guard-logic.ts +6 -13
  749. package/scripts/split/split-assess-cli.ts +2 -2
  750. package/scripts/split/split-assess.ts +15 -0
  751. package/scripts/split/split-measure.ts +65 -0
  752. package/scripts/sync/claude-settings-merge.ts +8 -15
  753. package/scripts/sync/directory-copy-guard.ts +4 -9
  754. package/scripts/sync/file-content.ts +78 -8
  755. package/scripts/sync/sync-ai-files.ts +3 -5
  756. package/scripts/sync/sync-configs.ts +11 -23
  757. package/scripts/sync/sync-hook-safety.ts +4 -10
  758. package/scripts/sync/sync-main.ts +11 -0
  759. package/scripts/sync/sync.ts +25 -37
  760. package/scripts/test/test-declared-changed.ts +2 -2
  761. package/scripts/test/test-declared.ts +1 -1
  762. package/scripts/test/test-e2e-guard.ts +25 -1
  763. package/scripts/test/test-e2e-stamp.ts +38 -0
  764. package/scripts/test/test-pinned-logic.ts +145 -0
  765. package/scripts/test/test-pinned-main.ts +78 -0
  766. package/scripts/test/test-pinned.ts +100 -0
  767. package/scripts/test/test-read-map.ts +264 -0
  768. package/scripts/test/test-read-recording.ts +91 -0
  769. package/scripts/test/test-read-trace.ts +148 -0
  770. package/scripts/test/test-red-main.ts +12 -0
  771. package/scripts/test/test-red.ts +12 -30
  772. package/scripts/test/test-related-main.ts +18 -0
  773. package/scripts/test/test-related-record.ts +119 -0
  774. package/scripts/test/test-related-scope.ts +229 -43
  775. package/scripts/test/test-related.ts +300 -22
  776. package/scripts/test/test-unit-guard-main.ts +15 -0
  777. package/scripts/test/test-unit-guard.ts +42 -24
  778. package/scripts/test/unit-count-file.ts +37 -0
  779. package/scripts/test/unit-run-marker.ts +162 -0
  780. package/scripts/test/unit-setup-files.ts +51 -0
  781. package/scripts/test/unit-worker-share.ts +61 -149
  782. package/scripts/test/whole-suite-files.ts +63 -0
  783. package/scripts/time-runtime/time-background.ts +20 -2
  784. package/scripts/time-runtime/time-bundles.ts +4 -3
  785. package/scripts/time-runtime/time-density-hook.ts +8 -6
  786. package/scripts/time-runtime/time-followup-stage.ts +1 -3
  787. package/scripts/time-runtime/time-format.ts +5 -28
  788. package/scripts/time-runtime/time-markers.ts +10 -1
  789. package/scripts/time-runtime/time-shell.ts +97 -10
  790. package/scripts/time-runtime/time-transcript-line.ts +49 -62
  791. package/scripts/uninstall/uninstall.ts +1 -1
  792. package/scripts/version/bump-version-main.ts +12 -0
  793. package/scripts/version/bump-version.ts +25 -25
  794. package/scripts/version/effective-upstream.ts +6 -12
  795. package/scripts/version/latest-corepack.ts +17 -32
  796. package/scripts/version/latest-if-required-cli.ts +93 -0
  797. package/scripts/version/latest-lane-guard-main.ts +8 -0
  798. package/scripts/version/latest-lane-guard.ts +0 -4
  799. package/scripts/version/latest-scope-cli.ts +0 -9
  800. package/scripts/version/latest-scope-main.ts +12 -0
  801. package/scripts/version/latest-update.ts +5 -5
  802. package/scripts/version/npm-registry.ts +44 -6
  803. package/scripts/version/publishable-range-check.ts +5 -16
  804. package/scripts/version/release-age.ts +1 -1
  805. package/scripts/version/release-hold.ts +1 -1
  806. package/scripts/version/release-window.ts +38 -0
  807. package/scripts/version/running-binary.ts +1 -1
  808. package/scripts/version/safe-chain-version-update.ts +3 -8
  809. package/scripts/version/version-targets.ts +6 -28
  810. package/templates/dependabot.yml +29 -0
  811. package/templates/gitignore +4 -1
  812. package/templates/pnpm-workspace.basic.yaml +1 -1
  813. package/templates/sonar-project.properties +3 -2
  814. package/templates/workflows/ci.yml +12 -4
  815. package/templates/workflows/github-release.yml +4 -0
  816. package/tsconfig.sonar.json +1 -1
  817. package/.ncurc.json +0 -3
  818. package/dist/hooks/batch-guard.js +0 -29
  819. package/dist/hooks/chunk-4KKD2UTK.js +0 -66
  820. package/dist/hooks/chunk-6TS2JD6D.js +0 -237
  821. package/dist/hooks/chunk-7DSBJVFH.js +0 -50
  822. package/dist/hooks/chunk-A65Y4YOR.js +0 -79
  823. package/dist/hooks/chunk-CDY4NFQG.js +0 -15
  824. package/dist/hooks/chunk-EFXE6C37.js +0 -81
  825. package/dist/hooks/chunk-GP4IEC4O.js +0 -20
  826. package/dist/hooks/chunk-JP45SOCJ.js +0 -56
  827. package/dist/hooks/chunk-LAOV7NLM.js +0 -45
  828. package/dist/hooks/chunk-M4HGZV7U.js +0 -83
  829. package/dist/hooks/chunk-PF2NZL2A.js +0 -131
  830. package/dist/hooks/chunk-PTICX4OL.js +0 -358
  831. package/dist/hooks/chunk-RT27QRJW.js +0 -6247
  832. package/dist/hooks/chunk-SYOTDYCI.js +0 -3533
  833. package/dist/hooks/chunk-UPUZF3AN.js +0 -279
  834. package/dist/hooks/chunk-WK6SMBIC.js +0 -3180
  835. package/dist/hooks/duplicate-read-guard.js +0 -30
  836. package/dist/hooks/investigation-guard.js +0 -29
  837. package/scripts/backlog/backlog-stalled-cli.ts +0 -30
  838. package/scripts/cost-runtime/cost-format.ts +0 -29
  839. package/scripts/init/basic-path-migration.ts +0 -24
  840. package/scripts/issue/issue-backlinks-cli.ts +0 -93
  841. package/scripts/josh/josh-commands-guard.ts +0 -38
  842. package/scripts/josh/josh-usage-automation.ts +0 -121
  843. package/scripts/josh/josh-usage-backlog.ts +0 -180
  844. package/scripts/josh/josh-usage-developer.ts +0 -230
  845. package/scripts/josh/josh-usage-hooks.ts +0 -38
  846. package/scripts/josh/josh-usage-issue.ts +0 -205
  847. package/scripts/josh/josh-usage-review.ts +0 -101
  848. package/scripts/josh/josh-usage-run.ts +0 -252
  849. package/scripts/josh/josh-usage-session.ts +0 -238
  850. package/scripts/josh/josh-usage-workflow.ts +0 -212
  851. package/scripts/lint/cross-file-recheck.ts +0 -155
  852. package/scripts/registry-migration/migrate-logic.ts +0 -237
  853. package/scripts/registry-migration/migrate.ts +0 -292
  854. package/scripts/registry-migration/user-npmrc.ts +0 -15
  855. package/scripts/rules/rule-guard.ts +0 -23
  856. package/scripts/rules/rule-registry-rows.ts +0 -292
  857. package/scripts/rules/rule-registry.ts +0 -112
  858. package/scripts/run/run-stranded-cli.ts +0 -27
@@ -53,10 +53,26 @@ const CHAIN_PATTERN = /&&|\|\||;|\n/u
53
53
  // body is not shell syntax at all — an `it's` there is prose — so it is removed before the quotes are
54
54
  // paired, keeping the rest of its marker line (`cat <<EOF > f && git add f`) where the shell reads it.
55
55
  // Without both, a stray quote paired with one much later and erased every command between them.
56
- const QUOTED_SPAN_PATTERN = /\\[\s\S]|'[^']*'|"(?:\\[\s\S]|[^"\\])*"/gu
56
+ //
57
+ // **A `$(…)` inside double quotes is one atom of the span** (joshuafolkken/kit#4525): the quotes in
58
+ // `"$(gh issue create --title "x")"` belong to the substitution, so the span closes at the outer `"`
59
+ // rather than at the first inner one, which left the substitution cut in half. A `$` is read one way
60
+ // only — the atom where one follows, a character where none does — because a `$` either could take
61
+ // made an unclosed `"` followed by many `$(…)` try every split of them before failing.
62
+ const SUBSTITUTION_ATOM = /\$\([^()]*\)/u
63
+ const LONE_DOLLAR = /\$(?!\([^()]*\))/u
64
+ const QUOTED_SPAN_PATTERN = new RegExp(
65
+ String.raw`\\[\s\S]|'[^']*'|"(?:\\[\s\S]|${SUBSTITUTION_ATOM.source}|${LONE_DOLLAR.source}|[^"\\$])*"`,
66
+ 'gu',
67
+ )
57
68
  const HEREDOC_MARKER = /(?<!<)<<-?\s*(['"]?)(\w+)\1/u
58
69
  const HEREDOC_DELIMITER_GROUP = 2
59
70
  const LINE_BREAK = '\n'
71
+ const DOUBLE_QUOTE = '"'
72
+ // A command substitution with no nested parenthesis — the shape a quoted `"$(cmd …)"` is written in —
73
+ // or its backtick spelling. An escaped `\$(` or `` \` `` is literal text inside double quotes, so it
74
+ // runs nothing.
75
+ const SUBSTITUTION_PATTERN = /(?<!\\)\$\((?<dollar>[^()]*)\)|(?<!\\)`(?<tick>[^`]*)`/gu
60
76
  // `set -o pipefail` tells the shell to report the pipeline with the first failing command's status,
61
77
  // so nothing in it is discarded. The flag letters are loose because `set -eo pipefail` and
62
78
  // `set -euo pipefail` are the same instruction, and the `set` word is required so that a path or a
@@ -77,14 +93,36 @@ const FLAG_PREFIX = '-'
77
93
  // Two kinds of prefix, and they are not interchangeable. A wrapper runs the command that follows it,
78
94
  // so the walk continues past it; a navigation builtin runs nothing, so its segment yields no command
79
95
  // at all and the walk moves to the next segment.
80
- const WRAPPER_COMMANDS = new Set(['time', 'env', 'sudo'])
96
+ //
97
+ // **A wrapper is skipped with the flag values and operands it takes, and named by its basename**
98
+ // (joshuafolkken/kit#4525). `/usr/bin/time -f %e pnpm josh gate` left the walk on `%e`, and
99
+ // `timeout 600 pnpm josh gate` stopped at `timeout`, so a refusal keyed on the command was escaped by
100
+ // wrapping it. Every reader that asks which command a segment runs goes through this one walk.
101
+ interface WrapperShape {
102
+ readonly valued: ReadonlySet<string>
103
+ readonly operands: number
104
+ }
105
+
106
+ const WRAPPER_COMMANDS: ReadonlyMap<string, WrapperShape> = new Map([
107
+ ['time', { valued: new Set(['-f', '-o', '--format', '--output']), operands: 0 }],
108
+ ['env', { valued: new Set(['-u', '-C', '-S', '--unset', '--chdir']), operands: 0 }],
109
+ ['sudo', { valued: new Set(['-u', '-g', '-C', '-D']), operands: 0 }],
110
+ ['timeout', { valued: new Set(['-s', '-k', '--signal', '--kill-after']), operands: 1 }],
111
+ ['nohup', { valued: new Set(), operands: 0 }],
112
+ ['nice', { valued: new Set(['-n', '--adjustment']), operands: 0 }],
113
+ ['command', { valued: new Set(), operands: 0 }],
114
+ ['exec', { valued: new Set(['-a']), operands: 0 }],
115
+ ['stdbuf', { valued: new Set(['-i', '-o', '-e']), operands: 0 }],
116
+ ])
81
117
  const NAVIGATION_COMMANDS = new Set(['cd', 'pushd', 'popd', 'export', 'source', 'set', '.'])
118
+ const PATH_SEPARATOR = '/'
119
+ const FLAG_AND_VALUE = 2
82
120
 
83
121
  // Anchored at a segment's command position, not searched anywhere in the string. A loose search
84
122
  // charged `git commit -m "ran pnpm josh gate"` to `josh gate`, and this repository's own commit
85
123
  // messages and issue comments name josh subcommands constantly. Only the first match counts: a
86
124
  // compound command naming two would otherwise charge its whole duration to each.
87
- const JOSH_PATTERN = /^(?:pnpm\s+(?:exec\s+)?)?josh\s+([a-z][\w:-]*)/u
125
+ const JOSH_PATTERN = /^(?:(?:pnpm|npx)\s+(?:exec\s+)?)?josh\s+([a-z][\w:-]*)/u
88
126
  const JOSH_PREFIX = 'josh '
89
127
  const COMMAND_KEY = 'command'
90
128
 
@@ -99,19 +137,45 @@ function bash_command(input: unknown): string {
99
137
  // A wrapper's own flags are skipped with it. Skipping only the wrapper word left the walk on a flag,
100
138
  // which is not command-shaped, so `env -i pnpm test` yielded no command at all and its duration left
101
139
  // the per-command table entirely.
102
- function is_skippable(word: string): boolean {
103
- if (word.startsWith(FLAG_PREFIX)) return true
140
+ function after_flags(
141
+ words: ReadonlyArray<string>,
142
+ start: number,
143
+ valued: ReadonlySet<string>,
144
+ ): number {
145
+ let index = start
146
+
147
+ while (words[index]?.startsWith(FLAG_PREFIX) === true) {
148
+ index += valued.has(words[index] ?? '') ? FLAG_AND_VALUE : 1
149
+ }
150
+
151
+ return index
152
+ }
153
+
154
+ // The index past the prefix word at `index`, or `index` itself when that word is the command.
155
+ function after_prefix_word(words: ReadonlyArray<string>, index: number): number {
156
+ const word = words[index] ?? ''
157
+
158
+ if (word.startsWith(FLAG_PREFIX) || ASSIGNMENT_PATTERN.test(word)) return index + 1
159
+
160
+ const wrapper = WRAPPER_COMMANDS.get(word.slice(word.lastIndexOf(PATH_SEPARATOR) + 1))
104
161
 
105
- return ASSIGNMENT_PATTERN.test(word) || WRAPPER_COMMANDS.has(word)
162
+ if (wrapper === undefined) return index
163
+
164
+ return after_flags(words, index + 1, wrapper.valued) + wrapper.operands
106
165
  }
107
166
 
108
167
  // One segment with its leading assignments and wrappers dropped, so the first entry is the command
109
168
  // position. Shared by both readers below: what counts as the command is one rule, not two.
110
169
  function command_words(segment: string): Array<string> {
111
170
  const words = segment.replaceAll(SUBSHELL_OPENER, ' ').trim().split(WHITESPACE_PATTERN)
112
- const start = words.findIndex((word) => !is_skippable(word))
171
+ let start = 0
172
+
173
+ for (let next = after_prefix_word(words, start); next !== start;) {
174
+ start = next
175
+ next = after_prefix_word(words, start)
176
+ }
113
177
 
114
- return start === -1 ? [] : words.slice(start)
178
+ return words.slice(start)
115
179
  }
116
180
 
117
181
  // The command this segment runs, or nothing. Nothing has two causes and both are deliberate: a
@@ -186,15 +250,35 @@ function without_heredoc_bodies(command: string): string {
186
250
  // removal for a different reason — a quoted `sed` script holds `|` and slashes that read as a
187
251
  // pipeline and as paths — and two spellings of "remove the quotes" would disagree the first time one
188
252
  // of them learned about a quoting form the other did not.
253
+ //
254
+ // **A `$(…)` inside double quotes runs, so it is kept as a command of its own** (joshuafolkken/kit#4525):
255
+ // `out="$(pnpm josh gate)"` runs the gate, and removing the span with its quotes hid it. A single-quoted
256
+ // span expands nothing and goes whole. The substitution's own quoted arguments go as any other.
257
+ function spoken_substitutions(span: string): string {
258
+ if (!span.startsWith(DOUBLE_QUOTE)) return ' '
259
+
260
+ const inner = [...span.matchAll(SUBSTITUTION_PATTERN)].map((match) =>
261
+ (match.groups?.['dollar'] ?? match.groups?.['tick'] ?? '').replaceAll(QUOTED_SPAN_PATTERN, ' '),
262
+ )
263
+
264
+ return inner.length === 0 ? ' ' : ` ; ${inner.join(' ; ')} ; `
265
+ }
266
+
189
267
  function unquoted(command: string): string {
190
- return without_heredoc_bodies(command).replaceAll(QUOTED_SPAN_PATTERN, ' ')
268
+ return without_heredoc_bodies(command).replaceAll(QUOTED_SPAN_PATTERN, (span) =>
269
+ spoken_substitutions(span),
270
+ )
191
271
  }
192
272
 
193
273
  // Quoted text replaced by spaces of its own length, so an offset found here is the same offset in the
194
274
  // command — what a caller cutting the command where the unquoted reading says to needs. `undefined`
195
275
  // for a line carrying a heredoc, whose body lines a cut would read as commands of their own.
276
+ function has_heredoc(command: string): boolean {
277
+ return HEREDOC_MARKER.test(command)
278
+ }
279
+
196
280
  function blanked(command: string): string | undefined {
197
- if (HEREDOC_MARKER.test(command)) return undefined
281
+ if (has_heredoc(command)) return undefined
198
282
 
199
283
  return command.replaceAll(QUOTED_SPAN_PATTERN, (span) => ' '.repeat(span.length))
200
284
  }
@@ -344,12 +428,15 @@ const time_shell = {
344
428
  blanked,
345
429
  command_segment,
346
430
  discarded_commands,
431
+ has_heredoc,
347
432
  josh_arguments,
348
433
  josh_command_of,
434
+ josh_command_of_segment,
349
435
  josh_commands_of,
350
436
  josh_signatures_of,
351
437
  leading_word,
352
438
  unquoted,
439
+ without_heredoc_bodies,
353
440
  }
354
441
 
355
442
  export { time_shell }
@@ -1,6 +1,12 @@
1
1
  import type { FollowupStage } from '#scripts/followup/git-followup-stages'
2
2
  import { json_value } from '#scripts/lib/json-value'
3
- import { z } from 'zod'
3
+ import {
4
+ transcript_record,
5
+ type TranscriptBlock,
6
+ type TranscriptContent,
7
+ type TranscriptMessage,
8
+ type TranscriptRecord,
9
+ } from '#scripts/lib/transcript-record'
4
10
  import { time_background } from './time-background'
5
11
  import { time_followup_stage } from './time-followup-stage'
6
12
  import { time_instant } from './time-instant'
@@ -10,56 +16,20 @@ import { time_reported_failure } from './time-reported-failure'
10
16
  //
11
17
  // It moved out of `time-spans.ts` when that file passed its length limit — the seam that file is
12
18
  // already cut along elsewhere (`time-shell.ts`, `time-single-check.ts`), where the *reading* of a
13
- // field lives beside the field and the arithmetic stays next door. What is here is the JSONL shape
14
- // and nothing about time: schemas, the two records a line yields, and the parse that turns a string
15
- // into one.
19
+ // field lives beside the field and the arithmetic stays next door. What is here is nothing about
20
+ // time: the two records a line yields, and the read that turns a parsed line into one.
16
21
  //
17
22
  // **The block reader is not `cost-blocks.ts` and could not have been.** That module flattens every
18
23
  // line into one list of blocks for a token estimate, dropping the `id` / `tool_use_id` pair a call is
19
24
  // matched to its result by and the line boundary a timestamp belongs to. Both are the whole input
20
25
  // here.
21
-
22
- const BLOCK_SCHEMA = z.object({
23
- type: z.string().nullish(),
24
- name: z.string().nullish(),
25
- id: z.string().nullish(),
26
-
27
- tool_use_id: z.string().nullish(),
28
- input: z.unknown().nullish(),
29
- // Whether the harness wrote this result back as a failure. Present on a
30
- // `tool_result` block and on nothing else, and absent even there for the tools that never report
31
- // one — which is why it is read as three answers rather than as a boolean with a default.
32
- is_error: z.boolean().nullish(),
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
35
- // the whole of what `time-reported-failure.ts` asks of it.
36
- content: z.unknown().nullish(),
37
- })
38
-
39
- const CONTENT_SCHEMA = z.union([z.string(), z.array(BLOCK_SCHEMA)])
40
- // `id` is the assistant *message* the line belongs to, and Claude Code writes one line per content
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.
45
- const MESSAGE_SCHEMA = z.object({ id: z.string().nullish(), content: CONTENT_SCHEMA.nullish() })
46
-
47
- const LINE_SCHEMA = z.object({
48
- type: z.string().nullish(),
49
- timestamp: z.string().nullish(),
50
- // The branch the line was written on, which is where the issue number lives — `josh git` names a
51
- // branch `<N>-<slug>`. Read here rather than re-parsed by a second reader so `josh time --issue`
52
- // and `josh cost --issue` answer from the same field.
53
- gitBranch: z.string().nullish(),
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
56
- // insisting on a string here would reject every line whose `content` is a list of blocks — which is
57
- // most of them — and a rejected line is dropped from the timeline entirely, so the shares would stop
58
- // reconstructing the elapsed time. The shape is checked at the read below instead.
59
- content: z.unknown().nullish(),
60
- attachment: z.unknown().nullish(),
61
- message: MESSAGE_SCHEMA.nullish(),
62
- })
26
+ //
27
+ // The line's schema is `transcript-record.ts`'s, shared with every other reader of these lines. A
28
+ // message `id` groups the lines of one assistant turn — Claude Code writes one line per content block
29
+ // — so "how many calls did that turn make" groups by it. `gitBranch` is where the issue number lives
30
+ // (`josh git` names a branch `<N>-<slug>`), read here so `josh time --issue` and `josh cost --issue`
31
+ // answer from the same field. A `tool_result`'s `is_error` is read as three answers — absent for the
32
+ // tools that never report one — and its `content` only to recover the outcome a pipeline threw away.
63
33
 
64
34
  const UNKNOWN_BRANCH = ''
65
35
  // The field an attachment line carries the notice in, named rather than written as a literal.
@@ -137,8 +107,8 @@ interface TranscriptLine {
137
107
  type: string
138
108
  timestamp_ms: number
139
109
  branch: string
140
- // The background run this line is the harness's end-of-task notice for, and `''` for every other
141
- // line. It is read here rather than downstream for the reason every
110
+ // The background run this line is the harness's end-of-task notice for — or the `TaskStop` result
111
+ // that stopped it, which gets no notice — and `''` for every other line. It is read here rather than downstream for the reason every
142
112
  // derived field above is: the notice is the line's whole content, which a span does not keep, and
143
113
  // it is the only thing in a transcript that says a command had *finished* rather than merely been
144
114
  // looked at.
@@ -156,9 +126,7 @@ interface TranscriptLine {
156
126
  // The four string fields, defaulted together and apart from the two that are not strings. Split out
157
127
  // so neither half carries every `??` in the block: read as one function the defaulting alone reached
158
128
  // the complexity limit, and the next field added would have had to be squeezed in beside them.
159
- function block_names(
160
- raw: z.infer<typeof BLOCK_SCHEMA>,
161
- ): Pick<Block, 'type' | 'name' | 'id' | 'result_id'> {
129
+ function block_names(raw: TranscriptBlock): Pick<Block, 'type' | 'name' | 'id' | 'result_id'> {
162
130
  return {
163
131
  type: raw.type ?? '',
164
132
  name: raw.name ?? '',
@@ -190,7 +158,7 @@ function guard_from_refusal(text: string): string {
190
158
  // **Only the harness's own feedback line counts.** It writes a Stop block back as a user turn whose
191
159
  // whole body is `Stop hook feedback:` and the reason, so a prompt that merely quotes one never opens
192
160
  // with the label and reads `''`.
193
- function stop_guard_of(data: z.infer<typeof LINE_SCHEMA>): string {
161
+ function stop_guard_of(data: TranscriptRecord): string {
194
162
  const content = data.message?.content
195
163
  if (typeof content !== 'string' || !STOP_FEEDBACK_LABEL.test(content)) return ''
196
164
 
@@ -209,7 +177,7 @@ function token_lines_of(text: string): Array<string> {
209
177
  // content field that may be a string or a list of blocks into one string, and it is idempotent on a
210
178
  // string — so passing its own output back to `has_failure_line` reads exactly as passing the raw
211
179
  // field did, at one flattening instead of two.
212
- function to_block(raw: z.infer<typeof BLOCK_SCHEMA>): Block {
180
+ function to_block(raw: TranscriptBlock): Block {
213
181
  const text = time_reported_failure.result_text(raw.content)
214
182
  const is_error = raw.is_error ?? undefined
215
183
 
@@ -229,9 +197,7 @@ function to_block(raw: z.infer<typeof BLOCK_SCHEMA>): Block {
229
197
 
230
198
  // A user turn written as a bare string carries no blocks, which is exactly right: it is a prompt,
231
199
  // and a prompt has no tool result to match.
232
- function to_blocks(
233
- content: string | Array<z.infer<typeof BLOCK_SCHEMA>> | null | undefined,
234
- ): Array<Block> {
200
+ function to_blocks(content: TranscriptContent | null | undefined): Array<Block> {
235
201
  return typeof content === 'string' || content === null || content === undefined
236
202
  ? []
237
203
  : content.map((block) => to_block(block))
@@ -241,7 +207,7 @@ function to_blocks(
241
207
  // is written as one line per content block with the message's id repeated on each, so the id is what
242
208
  // says which blocks belonged to the same turn.
243
209
  function message_fields(
244
- message: z.infer<typeof MESSAGE_SCHEMA> | null | undefined,
210
+ message: TranscriptMessage | null | undefined,
245
211
  ): Pick<TranscriptLine, 'message_id' | 'blocks'> {
246
212
  return { message_id: message?.id ?? NO_MESSAGE_ID, blocks: to_blocks(message?.content) }
247
213
  }
@@ -253,16 +219,37 @@ function message_fields(
253
219
  // session happened to hold a different one. All three are read, and `time_background.finished_at`
254
220
  // keeps the earliest instant per id, so what is paired with the launch is when the task *ended* rather
255
221
  // than when the run was told about it.
256
- function notice_text(data: z.infer<typeof LINE_SCHEMA>): string {
222
+ function notice_text(data: TranscriptRecord): string {
257
223
  const attachment = json_value.is_record(data.attachment) ? data.attachment[PROMPT_KEY] : undefined
258
224
  const carried = [data.message?.content, data.content, attachment]
259
225
 
260
226
  return carried.find((one): one is string => typeof one === 'string') ?? ''
261
227
  }
262
228
 
229
+ // The task a `TaskStop` result on this line stopped, which is an end the harness writes no notice for.
230
+ // Its result body is a plain string, so only string contents are read and nothing is flattened again.
231
+ function stopped_background(content: TranscriptContent | null | undefined): string {
232
+ if (!Array.isArray(content)) return time_background.NO_BACKGROUND
233
+
234
+ const ids = content.map((block) =>
235
+ typeof block.content === 'string' ? time_background.stopped_id(block.content) : '',
236
+ )
237
+
238
+ return ids.find((id) => id !== time_background.NO_BACKGROUND) ?? time_background.NO_BACKGROUND
239
+ }
240
+
241
+ // The task this line reports the end of: the harness's notice, or else a `TaskStop` result.
242
+ function finished_background(data: TranscriptRecord): string {
243
+ const notice = time_background.finished_id(notice_text(data))
244
+
245
+ return notice === time_background.NO_BACKGROUND
246
+ ? stopped_background(data.message?.content)
247
+ : notice
248
+ }
249
+
263
250
  // A line without a parseable timestamp is dropped rather than dated: it has no place on a timeline,
264
251
  // and inventing one would move every span around it.
265
- function to_line(data: z.infer<typeof LINE_SCHEMA>): TranscriptLine | undefined {
252
+ function to_line(data: TranscriptRecord): TranscriptLine | undefined {
266
253
  const timestamp_ms = time_instant.parse_instant(data.timestamp)
267
254
 
268
255
  if (timestamp_ms === undefined) return undefined
@@ -271,16 +258,16 @@ function to_line(data: z.infer<typeof LINE_SCHEMA>): TranscriptLine | undefined
271
258
  type: data.type ?? '',
272
259
  timestamp_ms,
273
260
  branch: data.gitBranch ?? UNKNOWN_BRANCH,
274
- finished_background: time_background.finished_id(notice_text(data)),
261
+ finished_background: finished_background(data),
275
262
  stop_guard: stop_guard_of(data),
276
263
  ...message_fields(data.message),
277
264
  }
278
265
  }
279
266
 
280
267
  function parse_line(line: string): TranscriptLine | undefined {
281
- const parsed = LINE_SCHEMA.safeParse(json_value.parse_or_undefined(line))
268
+ const record = transcript_record.parse(line)
282
269
 
283
- return parsed.success ? to_line(parsed.data) : undefined
270
+ return record === undefined ? undefined : to_line(record)
284
271
  }
285
272
 
286
273
  // A whole transcript's text read as its parsed lines, the unparseable ones dropped.
@@ -11,6 +11,7 @@ import { init_logic_sonar } from '#scripts/init/init-logic-sonar'
11
11
  import { PACKAGE_DIR, PROJECT_ROOT } from '#scripts/init/init-paths'
12
12
  import { project_profile, type ProjectProfile } from '#scripts/init/project-profile'
13
13
  import { error_text } from '#scripts/lib/error-message'
14
+ import { PACKAGE_JSON } from '#scripts/lib/package-manifest'
14
15
  import { file_reader } from '#scripts/lib/read-file'
15
16
  import { PROJECT_CONFIG_FILE } from '#scripts/safe-chain/project-config'
16
17
  import { did_refuse_self_run } from '#scripts/self-sync-guard/self-sync-refusal'
@@ -20,7 +21,6 @@ import { distributed_files } from './distributed-files'
20
21
  import { IGNORE_FILE, uninstall_plan, type FilePlan } from './uninstall-plan'
21
22
  import { uninstall_report, type UninstallPlan } from './uninstall-report'
22
23
 
23
- const PACKAGE_JSON = 'package.json'
24
24
  const LEFTHOOK_BIN = 'lefthook'
25
25
  const ARGUMENT_START_INDEX = 2
26
26
  const YES_FLAG = '--yes'
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env tsx
2
+ import { fileURLToPath } from 'node:url'
3
+ import { run_bump_version } from './bump-version'
4
+
5
+ // The `josh bump` entry, kept apart from `bump-version.ts` because `release-publish.ts` imports that
6
+ // one: a bundle is one file, so a main guard there would fire for every command that carries it
7
+ // (joshuafolkken/kit#4186).
8
+ if (process.argv[1] === fileURLToPath(import.meta.url)) {
9
+ const ARGV_OFFSET = 2
10
+
11
+ process.exitCode = run_bump_version(process.argv.slice(ARGV_OFFSET))
12
+ }
@@ -1,15 +1,16 @@
1
- #!/usr/bin/env tsx
2
- import { readFileSync, writeFileSync } from 'node:fs'
3
- import path from 'node:path'
4
- import { fileURLToPath } from 'node:url'
1
+ import { writeFileSync } from 'node:fs'
5
2
  import { error_text } from '#scripts/lib/error-message'
3
+ import { package_manifest } from '#scripts/lib/package-manifest'
6
4
  import { json_object_schema, package_with_version_schema } from '#scripts/lib/schemas'
7
5
  import semver from 'semver'
8
6
 
9
7
  const VALID_BUMP_TYPES = ['major', 'minor', 'patch'] as const
10
8
  type BumpType = (typeof VALID_BUMP_TYPES)[number]
11
9
 
10
+ const BUMP_TYPE_NAMES: ReadonlySet<string> = new Set(VALID_BUMP_TYPES)
12
11
  const PACKAGE_JSON_INDENT = '\t'
12
+ const USAGE = 'Usage: josh bump [major|minor|patch]'
13
+ const FAILURE_EXIT_CODE = 1
13
14
 
14
15
  function compute_new_version(version: string, bump_type: BumpType): string {
15
16
  const new_version = semver.inc(version, bump_type)
@@ -19,28 +20,21 @@ function compute_new_version(version: string, bump_type: BumpType): string {
19
20
  return new_version
20
21
  }
21
22
 
22
- function package_json_path(): string {
23
- return path.join(process.cwd(), 'package.json')
24
- }
25
-
26
23
  // **Set the version to an already-decided number.** `bump_version` below is this plus the decision;
27
24
  // `pnpm josh release` supplies its own, because a release raises the version by as many minors as
28
25
  // main has taken merges rather than by one. Written once so the two agree
29
26
  // on the file's shape and indentation.
30
27
  function write_version(new_version: string): void {
31
- const package_path = package_json_path()
32
- const package_json = json_object_schema.parse(JSON.parse(readFileSync(package_path, 'utf8')))
28
+ const package_json = package_manifest.read_manifest(process.cwd(), json_object_schema)
33
29
 
34
30
  writeFileSync(
35
- package_path,
31
+ package_manifest.manifest_path(process.cwd()),
36
32
  `${JSON.stringify({ ...package_json, version: new_version }, undefined, PACKAGE_JSON_INDENT)}\n`,
37
33
  )
38
34
  }
39
35
 
40
36
  function read_current_version(): string {
41
- const file_content = readFileSync(package_json_path(), 'utf8')
42
-
43
- return package_with_version_schema.parse(JSON.parse(file_content)).version
37
+ return package_manifest.read_manifest(process.cwd(), package_with_version_schema).version
44
38
  }
45
39
 
46
40
  function bump_version(bump_type: BumpType): void {
@@ -50,23 +44,29 @@ function bump_version(bump_type: BumpType): void {
50
44
  console.info(new_version)
51
45
  }
52
46
 
53
- function main(): void {
54
- const ARGV_INDEX = 2
55
- const bump_type = process.argv[ARGV_INDEX] ?? 'minor'
47
+ function is_bump_type(value: string): value is BumpType {
48
+ return BUMP_TYPE_NAMES.has(value)
49
+ }
50
+
51
+ // `josh bump`'s body, answering its exit code to `bump-version-main.ts`.
52
+ function run_bump_version(args: ReadonlyArray<string>): number {
53
+ const [bump_type = 'minor'] = args
56
54
 
57
- if (!VALID_BUMP_TYPES.includes(bump_type as BumpType)) {
58
- console.error(`Usage: tsx scripts/version/bump-version.ts [major|minor|patch]`)
59
- process.exit(1)
55
+ if (!is_bump_type(bump_type)) {
56
+ console.error(USAGE)
57
+
58
+ return FAILURE_EXIT_CODE
60
59
  }
61
60
 
62
61
  try {
63
- bump_version(bump_type as BumpType)
62
+ bump_version(bump_type)
64
63
  } catch (error) {
65
64
  console.error(error_text.message_of(error))
66
- process.exit(1)
65
+
66
+ return FAILURE_EXIT_CODE
67
67
  }
68
- }
69
68
 
70
- if (process.argv[1] === fileURLToPath(import.meta.url)) main()
69
+ return 0
70
+ }
71
71
 
72
- export { bump_version, compute_new_version, write_version }
72
+ export { bump_version, compute_new_version, run_bump_version, USAGE, write_version }
@@ -1,12 +1,9 @@
1
- import { existsSync, readFileSync } from 'node:fs'
2
1
  import { createRequire } from 'node:module'
3
2
  import path from 'node:path'
4
3
  import { ancestor_directories } from '#scripts/lib/ancestor-directories'
5
- import { json_value } from '#scripts/lib/json-value'
4
+ import { package_manifest } from '#scripts/lib/package-manifest'
6
5
  import { package_named_version_schema } from '#scripts/lib/schemas'
7
6
 
8
- const PACKAGE_JSON = 'package.json'
9
-
10
7
  // Options for `resolve_effective_upstream_version`. `resolve_marker` is a subpath specifier used for
11
8
  // `createRequire().resolve()` when the package root itself is not directly resolvable — e.g. kit does
12
9
  // not list `package.json` (nor a `.` entry) in `exports`, so a subpath like
@@ -18,21 +15,18 @@ interface EffectiveUpstreamOptions {
18
15
  // Read the `version` from a package.json only when its `name` matches the target package — undefined
19
16
  // when the file is missing, malformed, or belongs to a different (e.g. nested) package. Matching by
20
17
  // name is what lets the walk-up skip intermediate package.json files and land on the true root.
21
- function read_matching_version(manifest_path: string, package_name: string): string | undefined {
22
- if (!existsSync(manifest_path)) return undefined
23
- const parsed = package_named_version_schema.safeParse(
24
- json_value.parse_or_undefined(readFileSync(manifest_path, 'utf8')),
25
- )
26
- if (!parsed.success || parsed.data.name !== package_name) return undefined
18
+ function read_matching_version(directory: string, package_name: string): string | undefined {
19
+ const manifest = package_manifest.read_manifest_if_valid(directory, package_named_version_schema)
20
+ if (manifest?.name !== package_name) return undefined
27
21
 
28
- return parsed.data.version
22
+ return manifest.version
29
23
  }
30
24
 
31
25
  // Walk up from a resolved file's directory to the package root, returning the version of the first
32
26
  // ancestor package.json whose `name` matches the target — or undefined when no matching root exists.
33
27
  function walk_up_for_version(start_directory: string, package_name: string): string | undefined {
34
28
  for (const directory of ancestor_directories.list(start_directory)) {
35
- const version = read_matching_version(path.join(directory, PACKAGE_JSON), package_name)
29
+ const version = read_matching_version(directory, package_name)
36
30
  if (version !== undefined) return version
37
31
  }
38
32
 
@@ -42,14 +42,14 @@
42
42
  import { readFileSync, writeFileSync } from 'node:fs'
43
43
  import { fileURLToPath } from 'node:url'
44
44
  import { json_value } from '#scripts/lib/json-value'
45
- import { COMMAND_TIMEOUT_MS } from '#scripts/lib/timeouts'
45
+ import { PACKAGE_JSON } from '#scripts/lib/package-manifest'
46
46
  import { execaSync } from 'execa'
47
47
  import semver from 'semver'
48
48
  import { z } from 'zod'
49
+ import { npm_registry } from './npm-registry'
49
50
  import { package_manager_version } from './package-manager-version'
50
51
  import { release_age } from './release-age'
51
52
 
52
- const PACKAGE_JSON_PATH = 'package.json'
53
53
  const PACKAGE_MANAGER_RE = /"packageManager"\s*:\s*"pnpm@(\d+)(?:[^\d]|$)/u
54
54
  const PINNED_VERSION_RE = /"packageManager"\s*:\s*"pnpm@([^"+]+)/u
55
55
  const TARGET_PREFIX = 'pnpm@'
@@ -133,13 +133,10 @@ function extract_times_json(stdout: string): Record<string, string> | undefined
133
133
  // The registry's publish timestamps for every pnpm release (version → ISO date, plus the
134
134
  // created/modified bookkeeping keys the selector ignores).
135
135
  function query_release_times(): Record<string, string> | undefined {
136
- const result = execaSync('pnpm', ['view', 'pnpm', 'time', '--json'], {
137
- reject: false,
138
- timeout: COMMAND_TIMEOUT_MS,
139
- })
140
- if ((result.exitCode ?? FAILURE_EXIT_CODE) !== 0) return undefined
136
+ const answer = npm_registry.view('pnpm', 'time', 'json')
137
+ if (answer.exit_code !== 0) return undefined
141
138
 
142
- return extract_times_json(result.stdout)
139
+ return extract_times_json(answer.stdout)
143
140
  }
144
141
 
145
142
  function to_resolution(
@@ -179,13 +176,10 @@ function parse_latest_version(stdout: string): string | undefined {
179
176
  }
180
177
 
181
178
  function query_latest_version(): string | undefined {
182
- const result = execaSync('pnpm', ['view', 'pnpm', 'version', '--json'], {
183
- reject: false,
184
- timeout: COMMAND_TIMEOUT_MS,
185
- })
186
- if ((result.exitCode ?? FAILURE_EXIT_CODE) !== 0) return undefined
179
+ const answer = npm_registry.view('pnpm', 'version', 'json')
180
+ if (answer.exit_code !== 0) return undefined
187
181
 
188
- return parse_latest_version(result.stdout)
182
+ return parse_latest_version(answer.stdout)
189
183
  }
190
184
 
191
185
  // The target handed to pnpm self-update: an exact registry-resolved version on the pinned major, or
@@ -239,7 +233,7 @@ function run_pnpm_update(target: string): number {
239
233
  // match). Runs on every path, not just after a successful bump: a repository that arrives
240
234
  // with the two fields already out of step sits in the no-bump steady state forever, so an
241
235
  // alignment gated on a bump would never repair it.
242
- function sync_development_engines(package_json_path: string = PACKAGE_JSON_PATH): void {
236
+ function sync_development_engines(package_json_path: string = PACKAGE_JSON): void {
243
237
  const content = readFileSync(package_json_path, 'utf8')
244
238
  const aligned = package_manager_version.align_development_engines_version(content)
245
239
  if (aligned === content) return
@@ -249,10 +243,7 @@ function sync_development_engines(package_json_path: string = PACKAGE_JSON_PATH)
249
243
  }
250
244
 
251
245
  // Restore the pre-run manifest if self-update fails after changing it.
252
- function restore_package_json(
253
- content: string,
254
- package_json_path: string = PACKAGE_JSON_PATH,
255
- ): void {
246
+ function restore_package_json(content: string, package_json_path: string = PACKAGE_JSON): void {
256
247
  writeFileSync(package_json_path, content)
257
248
  console.info('✔ Restored package.json pin (pnpm bump failed)')
258
249
  }
@@ -274,20 +265,17 @@ function extract_encoded_integrity(stdout: string): string | undefined {
274
265
  }
275
266
 
276
267
  function query_integrity(target: string): string | undefined {
277
- const result = execaSync('pnpm', ['view', target, 'dist.integrity', '--json'], {
278
- reject: false,
279
- timeout: COMMAND_TIMEOUT_MS,
280
- })
281
- if ((result.exitCode ?? FAILURE_EXIT_CODE) !== 0) return undefined
268
+ const answer = npm_registry.view(target, 'dist.integrity', 'json')
269
+ if (answer.exit_code !== 0) return undefined
282
270
 
283
- const encoded = extract_encoded_integrity(result.stdout)
271
+ const encoded = extract_encoded_integrity(answer.stdout)
284
272
  if (encoded === undefined) return undefined
285
273
 
286
274
  return decode_integrity(encoded)
287
275
  }
288
276
 
289
277
  function restore_integrity(target: string, integrity: string): void {
290
- const content = readFileSync(PACKAGE_JSON_PATH, 'utf8')
278
+ const content = readFileSync(PACKAGE_JSON, 'utf8')
291
279
  const version = target.slice(TARGET_PREFIX.length)
292
280
  const expected = `pnpm@${version}`
293
281
  const current = PACKAGE_MANAGER_VALUE_RE.exec(content)?.[0]
@@ -303,10 +291,7 @@ function restore_integrity(target: string, integrity: string): void {
303
291
  },
304
292
  )
305
293
 
306
- writeFileSync(
307
- PACKAGE_JSON_PATH,
308
- package_manager_version.align_development_engines_version(pinned),
309
- )
294
+ writeFileSync(PACKAGE_JSON, package_manager_version.align_development_engines_version(pinned))
310
295
  }
311
296
 
312
297
  // The equal case is the steady state of every up-to-date run, so it logs as success; only
@@ -342,7 +327,7 @@ function pin_unpinned_manifest(original: string, target: string, integrity: stri
342
327
  )
343
328
 
344
329
  writeFileSync(
345
- PACKAGE_JSON_PATH,
330
+ PACKAGE_JSON,
346
331
  package_manager_version.align_development_engines_version(`${pinned}\n`),
347
332
  )
348
333
 
@@ -403,7 +388,7 @@ function bump_to_registry_target(original: string, major: string | undefined): n
403
388
  }
404
389
 
405
390
  function main(): number {
406
- const original = readFileSync(PACKAGE_JSON_PATH, 'utf8')
391
+ const original = readFileSync(PACKAGE_JSON, 'utf8')
407
392
  const status = bump_to_registry_target(original, extract_pnpm_major(original))
408
393
 
409
394
  sync_development_engines()