@joshuafolkken/kit 1.1471.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 (895) hide show
  1. package/.claude/agents/investigator.md +1 -1
  2. package/.claude/settings.json +6 -6
  3. package/.claude/skills/epic-commands/SKILL.md +26 -77
  4. package/.claude/skills/epic-commands/epic-bundle.md +12 -6
  5. package/.claude/skills/epic-commands/execution-waves.md +1 -2
  6. package/.claude/skills/verify-ui/SKILL.md +1 -2
  7. package/.claude/skills/workflow-commands/SKILL.md +12 -14
  8. package/.claude/skills/workflow-commands/background-commands.md +8 -12
  9. package/.claude/skills/workflow-commands/backlogrun-child.md +13 -18
  10. package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +7 -25
  11. package/.claude/skills/workflow-commands/backlogrun-lanes.md +23 -28
  12. package/.claude/skills/workflow-commands/backlogrun-park.md +16 -31
  13. package/.claude/skills/workflow-commands/backlogrun-progress.md +12 -21
  14. package/.claude/skills/workflow-commands/backlogrun-recovery.md +12 -12
  15. package/.claude/skills/workflow-commands/backlogrun-steps.md +12 -20
  16. package/.claude/skills/workflow-commands/backlogrun.md +32 -51
  17. package/.claude/skills/workflow-commands/chain-rule.md +18 -11
  18. package/.claude/skills/workflow-commands/delegation.md +13 -8
  19. package/.claude/skills/workflow-commands/entry-sequence.md +10 -12
  20. package/.claude/skills/workflow-commands/followup.md +10 -35
  21. package/.claude/skills/workflow-commands/fullrun-steps.md +38 -49
  22. package/.claude/skills/workflow-commands/fullrun.md +6 -8
  23. package/.claude/skills/workflow-commands/halfrun.md +20 -32
  24. package/.claude/skills/workflow-commands/into-target.md +1 -2
  25. package/.claude/skills/workflow-commands/issue-comments.md +19 -15
  26. package/.claude/skills/workflow-commands/issue-scout.md +5 -4
  27. package/.claude/skills/workflow-commands/kickoff.md +24 -23
  28. package/.claude/skills/workflow-commands/latest-gate.md +9 -18
  29. package/.claude/skills/workflow-commands/needs-human-review.md +11 -19
  30. package/.claude/skills/workflow-commands/observation-filing.md +4 -50
  31. package/.claude/skills/workflow-commands/observation-ledger.md +5 -10
  32. package/.claude/skills/workflow-commands/pre-gate-cut.md +22 -44
  33. package/.claude/skills/workflow-commands/prerequisite.md +11 -18
  34. package/.claude/skills/workflow-commands/progress-watcher.md +3 -8
  35. package/.claude/skills/workflow-commands/prrun.md +6 -12
  36. package/.claude/skills/workflow-commands/retrospective.md +5 -5
  37. package/.claude/skills/workflow-commands/split-assessment.md +14 -4
  38. package/.claude/skills/workflow-commands/target-repository.md +1 -2
  39. package/.claude/skills/workflow-commands/working-tree-hold.md +11 -13
  40. package/.codex/hooks.json +6 -6
  41. package/.github/actions/setup-node/action.yml +10 -1
  42. package/.github/actions/setup-pnpm/action.yml +1 -1
  43. package/.github/dependabot.yml +16 -0
  44. package/.github/release.yml +0 -2
  45. package/.github/workflows/ci.yml +121 -11
  46. package/.github/workflows/publish.yml +10 -3
  47. package/.github/workflows/sonar-qube.yml +1 -0
  48. package/.prettierignore +2 -0
  49. package/.vscode/tasks.json +1 -2
  50. package/CLAUDE.md +4 -8
  51. package/README.md +4 -2
  52. package/SECURITY.md +1 -1
  53. package/cspell/index.yaml +7 -0
  54. package/dist/CLAUDE.md +4 -8
  55. package/dist/commands/document-read-cli.js +882 -0
  56. package/dist/commands/{document-section-cli.js → document-section-main.js} +137 -62
  57. package/dist/commands/read-set-cli.js +1867 -0
  58. package/dist/commands/run-prep-main.js +21653 -0
  59. package/dist/commands/run-step-cli.js +23880 -0
  60. package/dist/config-merge/index.js +5 -1
  61. package/dist/hooks/audit-provision.js +20 -35
  62. package/dist/hooks/{chunk-DGT54IH5.js → chunk-AZX4FGQ3.js} +63 -17
  63. package/dist/hooks/chunk-CWMBGKYW.js +6483 -0
  64. package/dist/hooks/chunk-O2YBIDSI.js +4306 -0
  65. package/dist/hooks/{chunk-AS74OU3D.js → chunk-PT5R6UJD.js} +4582 -2118
  66. package/dist/hooks/chunk-TUIFS5E7.js +72 -0
  67. package/dist/hooks/{chunk-723HKZO5.js → chunk-VWWCFGWK.js} +1 -1
  68. package/dist/hooks/{chunk-E7OIKX5Z.js → chunk-WR2KQAYZ.js} +1863 -382
  69. package/dist/hooks/{chunk-KC5AK2GF.js → chunk-XGBNSWEI.js} +248 -46
  70. package/dist/hooks/chunk-YCDOIR3I.js +3456 -0
  71. package/dist/hooks/codex-hook-adapter.js +10 -19
  72. package/dist/hooks/format-edited.js +5 -5
  73. package/dist/hooks/inputs.json +436 -257
  74. package/dist/hooks/pretool-guard.js +7 -22
  75. package/dist/hooks/session-lang.js +380 -42
  76. package/dist/hooks/stop-guard.js +8711 -782
  77. package/dist/josh.js +5263 -997
  78. package/dist/self-sync-guard/index.js +74 -10
  79. package/dist/version/index.js +115 -406
  80. package/eslint/base.js +1 -1
  81. package/lefthook/base.yml +8 -4
  82. package/package.json +17 -53
  83. package/pnpm-workspace.yaml +4 -2
  84. package/prompts/coding-standards.md +1 -1
  85. package/prompts/collaboration-workflow/file-edits.md +1 -9
  86. package/prompts/collaboration-workflow/gh-rest.md +1 -2
  87. package/prompts/collaboration-workflow/issue-citation.md +2 -4
  88. package/prompts/collaboration-workflow/issue-template.md +42 -17
  89. package/prompts/collaboration-workflow/lane-instructions.md +34 -0
  90. package/prompts/collaboration-workflow/measurement.md +37 -0
  91. package/prompts/collaboration-workflow/operating-rules.md +6 -12
  92. package/prompts/collaboration-workflow/output-bounds.md +4 -9
  93. package/prompts/collaboration-workflow/overview.md +1 -1
  94. package/prompts/collaboration-workflow/plan-comment.md +3 -42
  95. package/prompts/collaboration-workflow/principles.md +19 -8
  96. package/prompts/collaboration-workflow/report-format.md +37 -57
  97. package/prompts/collaboration-workflow/residency.md +12 -8
  98. package/prompts/collaboration-workflow/rule-delivery.md +3 -11
  99. package/prompts/collaboration-workflow/shell-body.md +8 -18
  100. package/prompts/collaboration-workflow/turn-batching.md +4 -6
  101. package/prompts/collaboration-workflow/upstream-interrupt.md +16 -6
  102. package/prompts/collaboration-workflow/wip-cap.md +7 -7
  103. package/prompts/collaboration-workflow.md +4 -7
  104. package/prompts/refactoring.md +1 -1
  105. package/prompts/review-rubric.md +1 -2
  106. package/prompts/review.md +45 -26
  107. package/prompts/testing-guide.md +10 -45
  108. package/scripts/agent/agent-argv.ts +20 -4
  109. package/scripts/agent/agent-event.ts +15 -15
  110. package/scripts/agent/agent-exit-record.ts +13 -1
  111. package/scripts/agent/agent-role-profile.ts +101 -45
  112. package/scripts/agent/agent-safe-text.ts +60 -0
  113. package/scripts/agent/api-auth.ts +41 -0
  114. package/scripts/agent/api-outage.ts +1 -1
  115. package/scripts/agent/claude-agent-argv.ts +14 -0
  116. package/scripts/agent/codex-agent-argv.ts +2 -0
  117. package/scripts/agent/lane-instructions.ts +144 -0
  118. package/scripts/auto-ok/auto-ok-cli.ts +14 -16
  119. package/scripts/auto-ok/auto-ok-judge-read.ts +12 -3
  120. package/scripts/auto-ok/auto-ok-judge-write.ts +46 -19
  121. package/scripts/auto-ok/auto-ok-judge.ts +13 -2
  122. package/scripts/auto-ok/auto-ok-main.ts +17 -0
  123. package/scripts/backlog/backlog-arrival.ts +14 -3
  124. package/scripts/backlog/backlog-budget-cli.ts +7 -33
  125. package/scripts/backlog/backlog-budget-main.ts +16 -0
  126. package/scripts/backlog/backlog-budget.ts +6 -7
  127. package/scripts/backlog/backlog-defect-priority.ts +4 -3
  128. package/scripts/backlog/backlog-drive-adopt.ts +67 -0
  129. package/scripts/backlog/backlog-drive-args.ts +4 -5
  130. package/scripts/backlog/backlog-drive-cli.ts +113 -28
  131. package/scripts/backlog/backlog-drive-hold.ts +162 -0
  132. package/scripts/backlog/backlog-drive-idle.ts +151 -0
  133. package/scripts/backlog/backlog-drive-judge.ts +25 -0
  134. package/scripts/backlog/backlog-drive-memory.ts +126 -0
  135. package/scripts/backlog/backlog-drive-named-offer.ts +5 -10
  136. package/scripts/backlog/backlog-drive-named.ts +54 -7
  137. package/scripts/backlog/backlog-drive-offer-argv.ts +3 -8
  138. package/scripts/backlog/backlog-drive-paused.ts +169 -0
  139. package/scripts/backlog/backlog-drive-restore.ts +39 -8
  140. package/scripts/backlog/backlog-drive-seats.ts +18 -8
  141. package/scripts/backlog/backlog-drive-token-handling.ts +38 -0
  142. package/scripts/backlog/backlog-drive.ts +79 -75
  143. package/scripts/backlog/backlog-next-main.ts +16 -0
  144. package/scripts/backlog/backlog-next-shared.ts +73 -0
  145. package/scripts/backlog/backlog-next.ts +48 -16
  146. package/scripts/backlog/backlog-occupied.ts +69 -0
  147. package/scripts/backlog/backlog-offer-cli.ts +6 -21
  148. package/scripts/backlog/backlog-offer-exclude.ts +15 -0
  149. package/scripts/backlog/backlog-offer-main.ts +12 -0
  150. package/scripts/backlog/backlog-offer.ts +36 -3
  151. package/scripts/backlog/backlog-overlap.ts +22 -4
  152. package/scripts/backlog/backlog-plan-read.ts +6 -2
  153. package/scripts/backlog/backlog-plan.ts +18 -4
  154. package/scripts/backlog/backlog-pool.ts +10 -10
  155. package/scripts/backlog/backlog-rank.ts +10 -2
  156. package/scripts/backlog/backlog-ready.ts +137 -18
  157. package/scripts/backlog/backlog-stalled-detect.ts +109 -36
  158. package/scripts/backlog/backlog-stalled.ts +52 -16
  159. package/scripts/backlog/backlog-wait-cause.ts +86 -0
  160. package/scripts/backlog/backlog-waves.ts +39 -13
  161. package/scripts/backlog/backlogrun-args.ts +19 -7
  162. package/scripts/backlog/backlogrun-cli.ts +19 -5
  163. package/scripts/backlog/backlogrun-launch.ts +6 -0
  164. package/scripts/backlog/backlogrun-restart.ts +97 -0
  165. package/scripts/backlog/backlogrun-stop.ts +79 -7
  166. package/scripts/behavior/behavior-cli.ts +2 -2
  167. package/scripts/behavior/behavior-rules.ts +47 -24
  168. package/scripts/build/build-bin.ts +2 -16
  169. package/scripts/build/build-claude-md.ts +0 -7
  170. package/scripts/build/build-commands.ts +0 -13
  171. package/scripts/build/build-hooks.ts +49 -48
  172. package/scripts/build/hook-bundle-stamp.ts +29 -11
  173. package/scripts/build/local-bin.ts +1 -1
  174. package/scripts/cases/cases-cli.ts +25 -13
  175. package/scripts/cases/cases-interaction-scan.ts +134 -0
  176. package/scripts/cases/cases-interaction.ts +183 -0
  177. package/scripts/cases/cases-logic.ts +39 -6
  178. package/scripts/ci/pr-classification-main.ts +18 -0
  179. package/scripts/ci/pr-classification.ts +10 -17
  180. package/scripts/clone/clone-scan.ts +1 -1
  181. package/scripts/cost-runtime/cost-blocks.ts +22 -37
  182. package/scripts/cost-runtime/cost-cli.ts +31 -14
  183. package/scripts/cost-runtime/cost-main.ts +12 -0
  184. package/scripts/cost-runtime/cost-transcript.ts +1 -0
  185. package/scripts/delegation/delegation-policy.ts +17 -4
  186. package/scripts/delegation/duplicate-read-guard.ts +2 -10
  187. package/scripts/delegation/investigation-guard.ts +15 -73
  188. package/scripts/delegation/investigation-reads.ts +3 -5
  189. package/scripts/dependabot/dependabot-cooldown.ts +194 -0
  190. package/scripts/discovery/repo-discovery.ts +24 -6
  191. package/scripts/doctor/doctor-consumer.ts +2 -5
  192. package/scripts/document/document-byte-budget.ts +9 -6
  193. package/scripts/document/document-scan.ts +1 -1
  194. package/scripts/document/document-section-cli.ts +17 -13
  195. package/scripts/document/document-section-main.ts +12 -0
  196. package/scripts/document/entry-read-budget.ts +2 -2
  197. package/scripts/document/read-set-cli.ts +4 -1
  198. package/scripts/epic/epic-audit-cli.ts +12 -6
  199. package/scripts/epic/epic-audit-orphans.ts +5 -8
  200. package/scripts/epic/epic-audit.ts +52 -1
  201. package/scripts/epic/epic-bundle-apply.ts +137 -0
  202. package/scripts/epic/epic-bundle-cli.ts +32 -121
  203. package/scripts/epic/epic-bundle-evidence.ts +49 -26
  204. package/scripts/epic/epic-bundle-format.ts +116 -0
  205. package/scripts/epic/epic-bundle-main.ts +17 -0
  206. package/scripts/epic/epic-bundle-referenced.ts +14 -3
  207. package/scripts/epic/epic-bundle.ts +17 -9
  208. package/scripts/epic/epic-busy.ts +5 -12
  209. package/scripts/epic/epic-classify.ts +24 -15
  210. package/scripts/epic/epic-cli-argv.ts +31 -0
  211. package/scripts/epic/epic-cli-decide.ts +42 -0
  212. package/scripts/epic/epic-cli.ts +6 -38
  213. package/scripts/epic/epic-close.ts +112 -55
  214. package/scripts/epic/epic-cross-repo.ts +4 -7
  215. package/scripts/epic/epic-decide.ts +119 -0
  216. package/scripts/epic/epic-decision.ts +9 -0
  217. package/scripts/epic/epic-fetch.ts +4 -0
  218. package/scripts/epic/epic-graph.ts +2 -0
  219. package/scripts/epic/epic-issue.ts +5 -1
  220. package/scripts/epic/epic-label-age.ts +1 -1
  221. package/scripts/epic/epic-lane-offer.ts +39 -4
  222. package/scripts/epic/epic-next-main.ts +24 -0
  223. package/scripts/epic/epic-next.ts +6 -24
  224. package/scripts/epic/epic-outside-blocker.ts +6 -2
  225. package/scripts/epic/epic-parse.ts +9 -3
  226. package/scripts/epic/epic-read.ts +1 -0
  227. package/scripts/epic/epic-reconcile.ts +39 -0
  228. package/scripts/epic/epic-run.ts +10 -1
  229. package/scripts/epic/epic-solo.ts +50 -14
  230. package/scripts/epic/epic.ts +41 -7
  231. package/scripts/exports/unused-members-cli.ts +2 -2
  232. package/scripts/followup/followup-checks-event.ts +8 -3
  233. package/scripts/followup/followup-coderabbit-wait.ts +82 -0
  234. package/scripts/followup/followup-review-gates.ts +81 -0
  235. package/scripts/followup/git-followup-stages.ts +13 -3
  236. package/scripts/followup/git-followup-workflow.ts +31 -60
  237. package/scripts/followup/git-pr-followup-wrapup.ts +9 -14
  238. package/scripts/followup/git-pr-followup.ts +36 -8
  239. package/scripts/fresh-machine/fresh-machine-cli.ts +1 -1
  240. package/scripts/fresh-machine/fresh-machine-run.ts +8 -8
  241. package/scripts/fresh-machine/specs/kit-test-backlogrun.json +1 -1
  242. package/scripts/gate/busy-average.ts +58 -0
  243. package/scripts/gate/check-cpu.ts +60 -0
  244. package/scripts/gate/check-inputs.ts +73 -0
  245. package/scripts/gate/check-reuse.ts +141 -0
  246. package/scripts/gate/command-memory.ts +192 -0
  247. package/scripts/gate/core-admission.ts +218 -28
  248. package/scripts/gate/core-budget-timing.ts +37 -0
  249. package/scripts/gate/core-budget.ts +150 -119
  250. package/scripts/gate/core-wait-record.ts +48 -0
  251. package/scripts/gate/core-wait.ts +162 -0
  252. package/scripts/gate/core-weights.ts +86 -0
  253. package/scripts/gate/free-cores.ts +72 -0
  254. package/scripts/gate/gate-ledger.ts +49 -7
  255. package/scripts/gate/gate-plan.ts +44 -15
  256. package/scripts/gate/gate-report.ts +29 -4
  257. package/scripts/gate/gate-run-steps.ts +195 -0
  258. package/scripts/gate/gate-skip.ts +12 -2
  259. package/scripts/gate/gate-steps.ts +12 -1
  260. package/scripts/gate/held-mark.ts +55 -0
  261. package/scripts/gate/input-fingerprint.ts +42 -0
  262. package/scripts/gate/machine-capacity.ts +124 -31
  263. package/scripts/gate/moved-paths.ts +67 -0
  264. package/scripts/gate/pre-commit-type-check.ts +14 -1
  265. package/scripts/gate/project-checks.ts +5 -12
  266. package/scripts/gate/scoped-green.ts +12 -8
  267. package/scripts/gate/since-green.ts +62 -0
  268. package/scripts/gate/toolchain-inputs.ts +115 -0
  269. package/scripts/gate/verification-gate.ts +65 -129
  270. package/scripts/gate/verification-inputs.ts +250 -0
  271. package/scripts/gh/gh-author-association.ts +96 -9
  272. package/scripts/gh/git-ai-review-scan.ts +4 -2
  273. package/scripts/gh/git-gh-api-path.ts +15 -0
  274. package/scripts/gh/git-gh-branch-rules.ts +73 -0
  275. package/scripts/gh/git-gh-conditional.ts +5 -2
  276. package/scripts/gh/git-gh-issue-read.ts +5 -1
  277. package/scripts/gh/git-gh-issue-rest.ts +1 -0
  278. package/scripts/gh/git-gh-issue-write.ts +77 -17
  279. package/scripts/gh/git-gh-issue.ts +7 -3
  280. package/scripts/gh/git-gh-poll-read.ts +89 -0
  281. package/scripts/gh/git-gh-pr-auto-merge.ts +8 -3
  282. package/scripts/gh/git-gh-pr-rest.ts +1 -1
  283. package/scripts/gh/git-gh-pr-snapshot.ts +33 -20
  284. package/scripts/gh/git-gh-pr.ts +27 -15
  285. package/scripts/gh/git-pr-checks-eval.ts +39 -7
  286. package/scripts/gh/git-pr-checks-parse.ts +39 -9
  287. package/scripts/gh/git-pr-merge-checked.ts +80 -0
  288. package/scripts/gh/git-pr.ts +13 -1
  289. package/scripts/git/base-tree.ts +19 -2
  290. package/scripts/git/changed-file-scope.ts +6 -4
  291. package/scripts/git/changed-paths.ts +18 -1
  292. package/scripts/git/git-diff-reads.ts +27 -2
  293. package/scripts/git/git-grep-hits.ts +85 -0
  294. package/scripts/git/git-location-environment.ts +1 -1
  295. package/scripts/git/git-merge-conflicts.ts +83 -0
  296. package/scripts/git/git-preflight.ts +37 -12
  297. package/scripts/git/git-push-transport.ts +1 -2
  298. package/scripts/git/git-schemas.ts +17 -7
  299. package/scripts/git/git-spawn.ts +1 -2
  300. package/scripts/git/git-status.ts +4 -4
  301. package/scripts/git/main-merge-main.ts +12 -0
  302. package/scripts/git/main-merge-regenerate.ts +78 -0
  303. package/scripts/git/main-merge.ts +39 -14
  304. package/scripts/git/main-sync-main.ts +12 -0
  305. package/scripts/git/main-sync.ts +0 -9
  306. package/scripts/git/stash/git-stash.ts +27 -4
  307. package/scripts/git/stash/{stash-pop-args.ts → stash-args.ts} +13 -10
  308. package/scripts/git/stash/stash-pop-cli.ts +6 -12
  309. package/scripts/git/stash/stash-pop-main.ts +12 -0
  310. package/scripts/git/stash/stash-push-cli.ts +76 -0
  311. package/scripts/git/stash/stash-push-main.ts +12 -0
  312. package/scripts/hooks/batch-guard.ts +5 -16
  313. package/scripts/hooks/check-commit-message-main.ts +8 -0
  314. package/scripts/hooks/check-commit-message.ts +4 -7
  315. package/scripts/hooks/format-edited-file.ts +8 -24
  316. package/scripts/hooks/pre-commit-lint.ts +118 -0
  317. package/scripts/hooks/pre-push-unit.ts +4 -2
  318. package/scripts/hooks/pretool-guard-cli.ts +1 -8
  319. package/scripts/hooks/pretool-guard.ts +57 -69
  320. package/scripts/hooks/reserved-run.ts +67 -8
  321. package/scripts/hooks/run-hook.sh +18 -11
  322. package/scripts/hooks/shell-rules-notice.ts +37 -0
  323. package/scripts/hooks/stop-actions.ts +185 -0
  324. package/scripts/hooks/stop-guard.ts +72 -27
  325. package/scripts/init/hook-command-rewrite.ts +19 -5
  326. package/scripts/init/hook-launch.ts +15 -12
  327. package/scripts/init/init-actions.ts +0 -6
  328. package/scripts/init/init-ai-copy.ts +10 -36
  329. package/scripts/init/init-bootstrap.ts +9 -8
  330. package/scripts/init/init-dry-run-report.ts +1 -1
  331. package/scripts/init/init-dry-run.ts +1 -1
  332. package/scripts/init/init-file-action.ts +7 -9
  333. package/scripts/init/init-logic-json-merge.ts +2 -2
  334. package/scripts/init/init-logic-migrate.ts +9 -82
  335. package/scripts/init/init-logic.ts +3 -2
  336. package/scripts/init/init-main.ts +12 -0
  337. package/scripts/init/init.ts +5 -12
  338. package/scripts/init/kit-development-versions.ts +3 -7
  339. package/scripts/init/kit-written-paths.ts +2 -2
  340. package/scripts/init/project-profile.ts +5 -4
  341. package/scripts/init/tsconfig-preset-migration.ts +2 -1
  342. package/scripts/init/vscode-tasks.ts +1 -1
  343. package/scripts/issue/defect-origin-cli.ts +106 -0
  344. package/scripts/issue/defect-origin-line.ts +60 -0
  345. package/scripts/issue/defect-origin-main.ts +11 -0
  346. package/scripts/issue/defect-origin.ts +114 -0
  347. package/scripts/issue/defect-rate-cli.ts +34 -78
  348. package/scripts/issue/defect-rate.ts +0 -16
  349. package/scripts/issue/defect-report-cli.ts +128 -0
  350. package/scripts/issue/defect-report-format.ts +56 -0
  351. package/scripts/issue/defect-report-main.ts +11 -0
  352. package/scripts/issue/defect-report.ts +160 -0
  353. package/scripts/issue/expected-effect-lint.ts +60 -0
  354. package/scripts/issue/issue-already-done-cli.ts +62 -0
  355. package/scripts/issue/issue-body-or-comment.ts +40 -0
  356. package/scripts/issue/issue-cite-cli.ts +33 -22
  357. package/scripts/issue/issue-cite-main.ts +12 -0
  358. package/scripts/issue/issue-classification.ts +13 -8
  359. package/scripts/issue/issue-comment-cli.ts +10 -24
  360. package/scripts/issue/issue-comment-main.ts +12 -0
  361. package/scripts/issue/issue-evidence-exit.ts +100 -0
  362. package/scripts/issue/issue-file-cli.ts +29 -7
  363. package/scripts/issue/issue-file.ts +19 -19
  364. package/scripts/issue/issue-fold-cli.ts +2 -11
  365. package/scripts/issue/issue-fold-main.ts +12 -0
  366. package/scripts/issue/issue-labels.ts +81 -90
  367. package/scripts/issue/issue-lint-cli.ts +7 -13
  368. package/scripts/issue/issue-lint-main.ts +12 -0
  369. package/scripts/issue/issue-measured-cli.ts +56 -0
  370. package/scripts/issue/issue-merged.ts +19 -2
  371. package/scripts/issue/issue-not-before-label.ts +135 -0
  372. package/scripts/issue/issue-not-before.ts +111 -0
  373. package/scripts/issue/issue-number-shape.ts +15 -1
  374. package/scripts/issue/issue-park.ts +28 -0
  375. package/scripts/issue/issue-plan-cli.ts +151 -0
  376. package/scripts/issue/issue-priority.ts +151 -0
  377. package/scripts/issue/issue-rank.ts +7 -1
  378. package/scripts/issue/issue-read-cli.ts +3 -10
  379. package/scripts/issue/issue-read-main.ts +12 -0
  380. package/scripts/issue/issue-read.ts +29 -5
  381. package/scripts/issue/issue-release-cli.ts +0 -10
  382. package/scripts/issue/issue-release-main.ts +13 -0
  383. package/scripts/issue/issue-release.ts +7 -12
  384. package/scripts/issue/issue-sample-gate.ts +192 -0
  385. package/scripts/issue/issue-sample-source.ts +76 -0
  386. package/scripts/issue/issue-scout-cli.ts +19 -25
  387. package/scripts/issue/issue-scout-main.ts +14 -0
  388. package/scripts/issue/issue-state-cli.ts +0 -10
  389. package/scripts/issue/issue-state-main.ts +12 -0
  390. package/scripts/issue/issue-watch-diff.ts +56 -15
  391. package/scripts/issue/issue-watch.ts +2 -1
  392. package/scripts/issue/issue-wip.ts +2 -7
  393. package/scripts/issue/markdown-section.ts +19 -5
  394. package/scripts/issue/measure-rerun-cli.ts +13 -8
  395. package/scripts/issue/plan-consumers-cli.ts +39 -0
  396. package/scripts/issue/plan-consumers-main.ts +11 -0
  397. package/scripts/issue/plan-consumers-section.ts +55 -0
  398. package/scripts/issue/plan-consumers.ts +127 -0
  399. package/scripts/josh/agent-session-environment.ts +1 -1
  400. package/scripts/josh/command-usage.ts +82 -0
  401. package/scripts/josh/file-map-stamp.ts +49 -16
  402. package/scripts/josh/hook-decision.ts +32 -20
  403. package/scripts/josh/josh-command-map.ts +6 -1
  404. package/scripts/josh/josh-command-types.ts +65 -13
  405. package/scripts/josh/josh-commands-agent-hooks.ts +83 -0
  406. package/scripts/josh/josh-commands-ai.ts +169 -157
  407. package/scripts/josh/josh-commands-backlog.ts +82 -16
  408. package/scripts/josh/josh-commands-clone.ts +1 -0
  409. package/scripts/josh/josh-commands-development.ts +111 -71
  410. package/scripts/josh/josh-commands-document.ts +43 -1
  411. package/scripts/josh/josh-commands-epic.ts +171 -0
  412. package/scripts/josh/josh-commands-hooks.ts +31 -2
  413. package/scripts/josh/josh-commands-issue-write.ts +181 -0
  414. package/scripts/josh/josh-commands-issue.ts +124 -24
  415. package/scripts/josh/josh-commands-lane.ts +112 -2
  416. package/scripts/josh/josh-commands-lint.ts +19 -8
  417. package/scripts/josh/josh-commands-maintenance.ts +112 -4
  418. package/scripts/josh/josh-commands-pause.ts +29 -0
  419. package/scripts/josh/josh-commands-progress.ts +87 -0
  420. package/scripts/josh/josh-commands-project.ts +138 -9
  421. package/scripts/josh/josh-commands-review.ts +124 -0
  422. package/scripts/josh/josh-commands-run.ts +211 -23
  423. package/scripts/josh/josh-commands-ship.ts +169 -0
  424. package/scripts/josh/josh-commands-split.ts +9 -0
  425. package/scripts/josh/josh-commands-versioning.ts +49 -2
  426. package/scripts/josh/josh-commands-workflow.ts +149 -6
  427. package/scripts/josh/josh-logic.ts +11 -27
  428. package/scripts/josh/josh.ts +14 -5
  429. package/scripts/josh/package-directory.ts +18 -0
  430. package/scripts/josh/process-identity.ts +13 -4
  431. package/scripts/josh/session-language-cli.ts +4 -8
  432. package/scripts/josh/session-language-main.ts +13 -0
  433. package/scripts/josh/session-language.ts +6 -1
  434. package/scripts/josh/shared-cache.ts +90 -0
  435. package/scripts/josh/stamp-file.ts +9 -15
  436. package/scripts/lane/lane-await.ts +51 -12
  437. package/scripts/lane/lane-cache.ts +5 -30
  438. package/scripts/lane/lane-capacity.ts +19 -22
  439. package/scripts/lane/lane-check-stats.ts +97 -0
  440. package/scripts/lane/lane-child-invocation.ts +43 -4
  441. package/scripts/lane/lane-cli.ts +15 -5
  442. package/scripts/lane/lane-close.ts +86 -18
  443. package/scripts/lane/lane-core-wait-stats.ts +66 -0
  444. package/scripts/lane/lane-dispatch.ts +27 -6
  445. package/scripts/lane/lane-gap-stats.ts +156 -0
  446. package/scripts/lane/lane-guard-policy.ts +2 -2
  447. package/scripts/lane/lane-handoff.ts +76 -1
  448. package/scripts/lane/lane-held-stats.ts +129 -0
  449. package/scripts/lane/lane-install.ts +16 -15
  450. package/scripts/lane/lane-launch-cli.ts +0 -9
  451. package/scripts/lane/lane-launch-main.ts +12 -0
  452. package/scripts/lane/lane-ledger-schema.ts +266 -0
  453. package/scripts/lane/lane-ledger.ts +108 -97
  454. package/scripts/lane/lane-limit-cli.ts +19 -9
  455. package/scripts/lane/lane-measure-cli.ts +58 -10
  456. package/scripts/lane/lane-open.ts +9 -1
  457. package/scripts/lane/lane-parked.ts +3 -3
  458. package/scripts/lane/lane-pause-cli.ts +130 -0
  459. package/scripts/lane/lane-pause.ts +158 -0
  460. package/scripts/lane/lane-preserve.ts +29 -1
  461. package/scripts/lane/lane-process-table.ts +166 -0
  462. package/scripts/lane/lane-reap-settle.ts +124 -0
  463. package/scripts/lane/lane-reap.ts +50 -15
  464. package/scripts/lane/lane-registry.ts +33 -10
  465. package/scripts/lane/lane-residents.ts +162 -0
  466. package/scripts/lane/lane-restart.ts +26 -27
  467. package/scripts/lane/lane-round-two-stats.ts +49 -0
  468. package/scripts/lane/lane-sampler.ts +4 -0
  469. package/scripts/lane/lane-session-action.ts +160 -0
  470. package/scripts/lane/lane-session-broker.ts +134 -134
  471. package/scripts/lane/lane-snapshot-trace.ts +84 -0
  472. package/scripts/lane/lane-spans.ts +51 -0
  473. package/scripts/lane/lane-spent.ts +6 -3
  474. package/scripts/lane/lane-stage-stats.ts +7 -2
  475. package/scripts/lane/lane-state.ts +302 -0
  476. package/scripts/lane/lane-stats.ts +58 -4
  477. package/scripts/lane/lane-stop-stats.ts +113 -37
  478. package/scripts/lane/lane-test-related-stats.ts +127 -0
  479. package/scripts/lane/lane-transcript-calls.ts +145 -0
  480. package/scripts/lane/lane-transcript-stats.ts +168 -0
  481. package/scripts/lane/lane-vacant.ts +13 -3
  482. package/scripts/lane/lane-withdraw-cli.ts +72 -0
  483. package/scripts/lane/lane-withdraw.ts +183 -0
  484. package/scripts/lane/process-directories.ts +70 -0
  485. package/scripts/lane/process-lane-marks.ts +94 -0
  486. package/scripts/lib/atomic-write.ts +62 -0
  487. package/scripts/lib/buffered-process.ts +12 -5
  488. package/scripts/lib/cli-flags.ts +53 -0
  489. package/scripts/lib/figure-format.ts +63 -0
  490. package/scripts/lib/json-value.ts +9 -1
  491. package/scripts/lib/package-manifest.ts +35 -0
  492. package/scripts/lib/read-file.ts +3 -1
  493. package/scripts/lib/stamped-memo.ts +63 -0
  494. package/scripts/lib/stdout-on-stderr.ts +24 -0
  495. package/scripts/lib/timeouts.ts +9 -0
  496. package/scripts/lib/transcript-record.ts +91 -0
  497. package/scripts/lines/effective-limit.ts +1 -1
  498. package/scripts/lint/eslint-cache-dependencies.ts +145 -0
  499. package/scripts/lint/eslint-daemon.ts +265 -0
  500. package/scripts/lint/format.ts +14 -5
  501. package/scripts/lint/import-graph.ts +279 -0
  502. package/scripts/lint/lint-gate-scope.ts +102 -0
  503. package/scripts/lint/lint-parallel-main.ts +19 -0
  504. package/scripts/lint/lint-parallel.ts +72 -33
  505. package/scripts/lint/lint-related-scope.ts +33 -24
  506. package/scripts/lint/lint-related.ts +38 -6
  507. package/scripts/notify/confirmation-options.ts +1 -2
  508. package/scripts/notify/telegram-notify.ts +20 -20
  509. package/scripts/notify/telegram-test-logic.ts +0 -1
  510. package/scripts/notify/telegram-test-main.ts +8 -0
  511. package/scripts/notify/telegram-test.ts +12 -11
  512. package/scripts/observations/observation-ledger.ts +13 -0
  513. package/scripts/observations/observations-flush-landing.ts +5 -3
  514. package/scripts/observations/observations-flush.ts +6 -1
  515. package/scripts/overrides/overrides-check.ts +2 -5
  516. package/scripts/overrides/overrides-files.ts +2 -1
  517. package/scripts/overrides/overrides-logic.ts +3 -6
  518. package/scripts/package/verify-optional-eslint-install.ts +8 -6
  519. package/scripts/propagate/propagate-publish.ts +2 -7
  520. package/scripts/propagate/propagate-targets.ts +4 -12
  521. package/scripts/refactor/import-graph.ts +9 -7
  522. package/scripts/release/github-release-runs.ts +17 -6
  523. package/scripts/release/release-approval-prune.ts +18 -0
  524. package/scripts/release/release-history.ts +1 -3
  525. package/scripts/release/release-progress.ts +42 -22
  526. package/scripts/release/release-publish-run.ts +39 -0
  527. package/scripts/release/release-publish.ts +6 -6
  528. package/scripts/release/release-scope-cli.ts +0 -10
  529. package/scripts/release/release-scope-main.ts +12 -0
  530. package/scripts/repo/repo-setting.ts +3 -6
  531. package/scripts/repo/required-checks-logic.ts +6 -15
  532. package/scripts/report/report-format-reference.ts +4 -0
  533. package/scripts/report/report-labels.ts +155 -0
  534. package/scripts/report/report-lint-cli.ts +3 -0
  535. package/scripts/report/report-lint.ts +85 -110
  536. package/scripts/report/report-template-cli.ts +59 -0
  537. package/scripts/report/report-template.ts +112 -0
  538. package/scripts/review/acceptance-map-check.ts +61 -0
  539. package/scripts/review/acceptance-map.ts +206 -0
  540. package/scripts/review/removed-tests-check.ts +86 -0
  541. package/scripts/review/removed-tests.ts +149 -0
  542. package/scripts/review/review-brief-cli.ts +82 -16
  543. package/scripts/review/review-brief-main.ts +12 -0
  544. package/scripts/review/review-brief.ts +31 -3
  545. package/scripts/review/review-code-tree.ts +10 -6
  546. package/scripts/review/review-comment-round.ts +26 -8
  547. package/scripts/review/review-finding-ledger.ts +30 -15
  548. package/scripts/review/review-interaction.ts +94 -0
  549. package/scripts/review/review-readers-scan.ts +163 -0
  550. package/scripts/review/review-record-cli.ts +69 -30
  551. package/scripts/review/review-record-main.ts +12 -0
  552. package/scripts/review/review-round-one-blobs.ts +221 -0
  553. package/scripts/review/review-round2-cli.ts +49 -12
  554. package/scripts/review/review-round2.ts +80 -12
  555. package/scripts/review/review-stamps.ts +19 -1
  556. package/scripts/review/review-stop-log.ts +96 -0
  557. package/scripts/review/review-stops-cli.ts +85 -0
  558. package/scripts/review/review-tree.ts +6 -17
  559. package/scripts/review/review-untouched-readers.ts +146 -0
  560. package/scripts/review/test-titles.ts +118 -0
  561. package/scripts/rules/agent-model.ts +67 -0
  562. package/scripts/rules/bash-triggers.ts +46 -3
  563. package/scripts/rules/decision-oracle-batch.ts +9 -1
  564. package/scripts/rules/decision-oracle.ts +2 -2
  565. package/scripts/rules/delivered-rules.ts +90 -3
  566. package/scripts/rules/destructive-command.ts +8 -1
  567. package/scripts/rules/direct-filing.ts +10 -2
  568. package/scripts/rules/direct-issue-comment.ts +117 -0
  569. package/scripts/rules/direct-pr-create.ts +69 -3
  570. package/scripts/rules/early-heartbeat.ts +2 -1
  571. package/scripts/rules/file-body.ts +7 -0
  572. package/scripts/rules/filing-cap.ts +8 -0
  573. package/scripts/rules/firing-point.ts +6 -5
  574. package/scripts/rules/git-argv.ts +72 -14
  575. package/scripts/rules/git-force.ts +12 -2
  576. package/scripts/rules/guard-remedy.ts +121 -0
  577. package/scripts/rules/implementation-cut-verdict.ts +1 -1
  578. package/scripts/rules/implementation-cut.ts +11 -3
  579. package/scripts/rules/index-guard.ts +8 -1
  580. package/scripts/rules/issue-comments.ts +76 -7
  581. package/scripts/rules/josh-git-bare.ts +7 -0
  582. package/scripts/rules/lane-background.ts +67 -25
  583. package/scripts/rules/lane-carry-conflict.ts +6 -0
  584. package/scripts/rules/lane-direct-tool.ts +74 -0
  585. package/scripts/rules/lane-interactive-ask.ts +9 -2
  586. package/scripts/rules/lane-park.ts +45 -23
  587. package/scripts/rules/lane-split-park.ts +10 -2
  588. package/scripts/rules/lane-switch-main.ts +7 -0
  589. package/scripts/rules/last-prompt.ts +50 -5
  590. package/scripts/rules/oracle-consulted.ts +10 -0
  591. package/scripts/rules/oracle-firing.ts +1 -0
  592. package/scripts/rules/oracle-list-cli.ts +7 -0
  593. package/scripts/rules/permission-guards.ts +3 -0
  594. package/scripts/rules/piped-verification.ts +4 -2
  595. package/scripts/rules/poll-loop.ts +7 -0
  596. package/scripts/rules/pr-merge.ts +123 -0
  597. package/scripts/rules/protected-files.ts +32 -5
  598. package/scripts/rules/raw-field-body.ts +6 -0
  599. package/scripts/rules/rule-body-guard.ts +8 -0
  600. package/scripts/rules/rule-list.ts +12 -28
  601. package/scripts/rules/rule-rewrite.ts +114 -0
  602. package/scripts/rules/rule-value-cache.ts +4 -9
  603. package/scripts/rules/rule-value-cli.ts +51 -32
  604. package/scripts/rules/rule-value.ts +8 -2
  605. package/scripts/rules/shell-segments.ts +50 -0
  606. package/scripts/rules/stop-decision.ts +77 -0
  607. package/scripts/rules/stop-rule-rows.ts +64 -0
  608. package/scripts/rules/stop-rules.ts +150 -51
  609. package/scripts/rules/tail-commands.ts +15 -1
  610. package/scripts/rules/test-declared-commit.ts +11 -1
  611. package/scripts/rules/third-party-write.ts +7 -0
  612. package/scripts/rules/timed-rerun.ts +69 -0
  613. package/scripts/rules/worktree-guard.ts +13 -3
  614. package/scripts/run/board/run-board-app-name.ts +23 -0
  615. package/scripts/run/board/run-board-cli.ts +65 -30
  616. package/scripts/run/board/run-board-closed.ts +8 -2
  617. package/scripts/run/board/run-board-earlier.ts +94 -0
  618. package/scripts/run/board/run-board-ending-reason.ts +67 -0
  619. package/scripts/run/board/run-board-estimate-schedule.ts +103 -0
  620. package/scripts/run/board/run-board-estimate.ts +98 -0
  621. package/scripts/run/board/run-board-fit.ts +153 -36
  622. package/scripts/run/board/run-board-fold.ts +123 -0
  623. package/scripts/run/board/run-board-fresh.ts +2 -2
  624. package/scripts/run/board/run-board-gather-live.ts +29 -0
  625. package/scripts/run/board/run-board-gather-thread.ts +189 -0
  626. package/scripts/run/board/run-board-gather-worker.ts +29 -0
  627. package/scripts/run/board/run-board-gather.ts +187 -0
  628. package/scripts/run/board/run-board-github.ts +119 -31
  629. package/scripts/run/board/run-board-header.ts +86 -21
  630. package/scripts/run/board/run-board-keys.ts +58 -0
  631. package/scripts/run/board/run-board-kind.ts +20 -6
  632. package/scripts/run/board/run-board-labels.ts +118 -71
  633. package/scripts/run/board/run-board-lane-state.ts +109 -0
  634. package/scripts/run/board/run-board-lane-time.ts +122 -0
  635. package/scripts/run/board/run-board-layout.ts +240 -61
  636. package/scripts/run/board/run-board-length.ts +52 -0
  637. package/scripts/run/board/run-board-machine.ts +8 -4
  638. package/scripts/run/board/run-board-main.ts +12 -0
  639. package/scripts/run/board/run-board-notes.ts +52 -31
  640. package/scripts/run/board/run-board-now.ts +1 -1
  641. package/scripts/run/board/run-board-operation.ts +15 -33
  642. package/scripts/run/board/run-board-phase.ts +1 -1
  643. package/scripts/run/board/run-board-plan-shared.ts +115 -0
  644. package/scripts/run/board/run-board-plan.ts +55 -3
  645. package/scripts/run/board/run-board-planning.ts +45 -0
  646. package/scripts/run/board/run-board-priority.ts +44 -0
  647. package/scripts/run/board/run-board-process-groups.ts +195 -0
  648. package/scripts/run/board/run-board-read.ts +153 -13
  649. package/scripts/run/board/run-board-reason.ts +238 -45
  650. package/scripts/run/board/run-board-released.ts +35 -0
  651. package/scripts/run/board/run-board-render-checks.ts +39 -5
  652. package/scripts/run/board/run-board-render-condition.ts +96 -0
  653. package/scripts/run/board/run-board-render-drawn.ts +67 -0
  654. package/scripts/run/board/run-board-render-foot.ts +59 -0
  655. package/scripts/run/board/run-board-render-icon.ts +35 -0
  656. package/scripts/run/board/run-board-render-lanes.ts +145 -0
  657. package/scripts/run/board/run-board-render-lead.ts +80 -0
  658. package/scripts/run/board/run-board-render-legend.ts +117 -47
  659. package/scripts/run/board/run-board-render-notes.ts +156 -29
  660. package/scripts/run/board/run-board-render-processes.ts +196 -0
  661. package/scripts/run/board/run-board-render-section.ts +119 -0
  662. package/scripts/run/board/run-board-render-slot.ts +3 -36
  663. package/scripts/run/board/run-board-render-tail.ts +115 -48
  664. package/scripts/run/board/run-board-render-time.ts +56 -0
  665. package/scripts/run/board/run-board-render-title.ts +117 -24
  666. package/scripts/run/board/run-board-render-waits.ts +125 -0
  667. package/scripts/run/board/run-board-render.ts +206 -259
  668. package/scripts/run/board/run-board-roots.ts +54 -0
  669. package/scripts/run/board/run-board-row-yield.ts +10 -4
  670. package/scripts/run/board/run-board-setup.ts +1 -12
  671. package/scripts/run/board/run-board-snapshot.ts +111 -0
  672. package/scripts/run/board/run-board-spin.ts +2 -2
  673. package/scripts/run/board/run-board-state.ts +23 -29
  674. package/scripts/run/board/run-board-status.ts +206 -79
  675. package/scripts/run/board/run-board-thanks-read.ts +2 -2
  676. package/scripts/run/board/run-board-tick.ts +123 -104
  677. package/scripts/run/board/run-board-usage-board.ts +78 -0
  678. package/scripts/run/board/run-board-usage-lanes.ts +113 -0
  679. package/scripts/run/board/run-board-usage-listing.ts +93 -0
  680. package/scripts/run/board/run-board-usage-read.ts +120 -150
  681. package/scripts/run/board/run-board-usage-rusage.ts +19 -7
  682. package/scripts/run/board/run-board-usage-text.ts +139 -51
  683. package/scripts/run/board/run-board-usage-top.ts +102 -0
  684. package/scripts/run/board/run-board-usage.ts +89 -72
  685. package/scripts/run/board/run-board-usual.ts +20 -9
  686. package/scripts/run/carry/run-carry-args.ts +4 -7
  687. package/scripts/run/carry/run-carry-conversation.ts +1 -1
  688. package/scripts/run/carry/run-carry.ts +9 -4
  689. package/scripts/run/cut/run-cut-cli.ts +3 -2
  690. package/scripts/run/cut/run-cut-handoff.ts +2 -2
  691. package/scripts/run/cut/run-cut-report.ts +16 -0
  692. package/scripts/run/detached-launch.ts +23 -4
  693. package/scripts/run/entry/run-entry-cli.ts +8 -1
  694. package/scripts/run/event/run-event-cli.ts +1 -5
  695. package/scripts/run/event/run-event-filed.ts +12 -6
  696. package/scripts/run/event/run-event-follow.ts +2 -3
  697. package/scripts/run/event/run-event-render.ts +7 -10
  698. package/scripts/run/event/run-event-scope.ts +20 -2
  699. package/scripts/run/event/run-event-stream-emit.ts +78 -11
  700. package/scripts/run/event/run-event-stream.ts +37 -7
  701. package/scripts/run/hold/run-hold-adopt.ts +65 -0
  702. package/scripts/run/hold/run-hold-cli.ts +93 -22
  703. package/scripts/run/hold/run-hold-main.ts +12 -0
  704. package/scripts/run/hold/run-hold-member.ts +37 -0
  705. package/scripts/run/hold/run-hold-session.ts +46 -0
  706. package/scripts/run/hold/run-hold.ts +7 -1
  707. package/scripts/run/hold/run-stop-notify.ts +183 -0
  708. package/scripts/run/launch-priority.ts +32 -0
  709. package/scripts/run/merge/run-merge-auth.ts +31 -0
  710. package/scripts/run/merge/run-merge-cli.ts +72 -107
  711. package/scripts/run/merge/run-merge-close.ts +74 -0
  712. package/scripts/run/merge/run-merge-collect.ts +6 -13
  713. package/scripts/run/merge/run-merge-driver.ts +71 -0
  714. package/scripts/run/merge/run-merge-main.ts +12 -0
  715. package/scripts/run/merge/run-merge-outcome.ts +23 -0
  716. package/scripts/run/merge/run-merge-restart.ts +39 -0
  717. package/scripts/run/merge/run-merge-ship.ts +20 -4
  718. package/scripts/run/merge/run-merge-signals.ts +123 -0
  719. package/scripts/run/merge/run-merge-steps.ts +128 -83
  720. package/scripts/run/merge/run-merge.ts +53 -40
  721. package/scripts/run/park/run-park-cli.ts +91 -0
  722. package/scripts/run/park/run-park.ts +88 -0
  723. package/scripts/run/park/run-stalled.ts +68 -0
  724. package/scripts/run/pause/run-pause-cli.ts +73 -0
  725. package/scripts/run/pause/run-pause.ts +251 -0
  726. package/scripts/run/progress/run-progress-cli.ts +4 -12
  727. package/scripts/run/progress/run-progress-clock.ts +1 -1
  728. package/scripts/run/progress/run-progress-config.ts +6 -14
  729. package/scripts/run/progress/run-progress-main.ts +12 -0
  730. package/scripts/run/progress/run-progress.ts +1 -4
  731. package/scripts/run/review/run-review.ts +2 -1
  732. package/scripts/run/run-ending.ts +1 -0
  733. package/scripts/run/run-invocation.ts +5 -6
  734. package/scripts/run/run-liveness-cli.ts +6 -8
  735. package/scripts/run/run-liveness.ts +61 -30
  736. package/scripts/run/run-next.ts +1 -1
  737. package/scripts/run/run-parent-cut-hook.ts +2 -2
  738. package/scripts/run/run-poll-hook.ts +157 -0
  739. package/scripts/run/run-preflight.ts +18 -3
  740. package/scripts/run/run-prep-cli.ts +1 -10
  741. package/scripts/run/run-prep-locate.ts +7 -50
  742. package/scripts/run/run-prep-main.ts +12 -0
  743. package/scripts/run/run-prep.ts +6 -0
  744. package/scripts/run/run-report-cli.ts +101 -13
  745. package/scripts/run/run-report-handoff.ts +114 -0
  746. package/scripts/run/run-step-cli.ts +22 -15
  747. package/scripts/run/run-step-section.ts +85 -0
  748. package/scripts/run/run-step.ts +1 -1
  749. package/scripts/run/run-stranded-detect.ts +13 -0
  750. package/scripts/run/run-watcher-guard-cli.ts +1 -1
  751. package/scripts/run/run-watcher-guard.ts +1 -1
  752. package/scripts/run/ship/run-ship-args.ts +121 -0
  753. package/scripts/run/ship/run-ship-body-draft.ts +110 -0
  754. package/scripts/run/ship/run-ship-cli.ts +67 -151
  755. package/scripts/run/ship/run-ship-detach.ts +27 -7
  756. package/scripts/run/ship/run-ship-infra-retry.ts +59 -0
  757. package/scripts/run/ship/run-ship-next.ts +27 -3
  758. package/scripts/run/ship/run-ship-overlap.ts +232 -0
  759. package/scripts/run/ship/run-ship-place.ts +96 -0
  760. package/scripts/run/ship/run-ship-pre-detach-timed.ts +43 -0
  761. package/scripts/run/ship/run-ship-pre-detach.ts +102 -27
  762. package/scripts/run/ship/run-ship-preflight.ts +161 -30
  763. package/scripts/run/ship/run-ship-probe.ts +11 -3
  764. package/scripts/run/ship/run-ship-relaunch-cap.ts +70 -0
  765. package/scripts/run/ship/run-ship-removed-rows.ts +61 -0
  766. package/scripts/run/ship/run-ship-return.ts +123 -15
  767. package/scripts/run/ship/run-ship-review-steps.ts +105 -149
  768. package/scripts/run/ship/run-ship-review.ts +73 -6
  769. package/scripts/run/ship/run-ship-reviewer.ts +207 -0
  770. package/scripts/run/ship/run-ship-stage.ts +55 -6
  771. package/scripts/run/ship/run-ship-steps.ts +46 -15
  772. package/scripts/run/ship/run-ship-stop-cause.ts +135 -0
  773. package/scripts/run/ship/run-ship-stop-context.ts +206 -0
  774. package/scripts/run/ship/run-ship-stop-text.ts +11 -6
  775. package/scripts/run/ship/run-ship-sync.ts +57 -12
  776. package/scripts/run/ship/run-ship.ts +30 -2
  777. package/scripts/run/tidy/run-tidy-cli.ts +0 -4
  778. package/scripts/run/tidy/run-tidy-lanes.ts +3 -0
  779. package/scripts/run/tidy/run-tidy-main.ts +8 -0
  780. package/scripts/run/wake/run-wake-cli.ts +119 -100
  781. package/scripts/run/wake/run-wake-code.ts +83 -0
  782. package/scripts/run/wake/run-wake-driver.ts +19 -8
  783. package/scripts/run/wake/run-wake-loop.ts +34 -3
  784. package/scripts/run/wake/run-wake-main.ts +13 -0
  785. package/scripts/run/wake/run-wake-ports.ts +90 -0
  786. package/scripts/run/wake/run-wake-takeover.ts +66 -0
  787. package/scripts/run/wake/run-wake.ts +2 -1
  788. package/scripts/safe-chain/pack-hook.ts +2 -2
  789. package/scripts/safe-chain/preinstall-command.ts +2 -1
  790. package/scripts/safe-chain/project-config.ts +3 -9
  791. package/scripts/security/security-audit-main.ts +8 -0
  792. package/scripts/security/security-audit-provision-logic.ts +0 -11
  793. package/scripts/security/security-audit-provision-main.ts +12 -0
  794. package/scripts/security/security-audit-provision.ts +11 -26
  795. package/scripts/security/security-audit.ts +6 -7
  796. package/scripts/self-sync-guard/self-sync-guard-logic.ts +6 -13
  797. package/scripts/split/split-assess-cli.ts +2 -2
  798. package/scripts/split/split-assess.ts +15 -0
  799. package/scripts/split/split-measure.ts +65 -0
  800. package/scripts/sync/claude-settings-merge.ts +8 -15
  801. package/scripts/sync/directory-copy-guard.ts +4 -9
  802. package/scripts/sync/file-content.ts +78 -8
  803. package/scripts/sync/sync-ai-files.ts +3 -5
  804. package/scripts/sync/sync-configs.ts +11 -23
  805. package/scripts/sync/sync-hook-safety.ts +4 -10
  806. package/scripts/sync/sync-main.ts +11 -0
  807. package/scripts/sync/sync.ts +25 -37
  808. package/scripts/test/test-declared-changed.ts +2 -2
  809. package/scripts/test/test-declared.ts +1 -1
  810. package/scripts/test/test-e2e-guard.ts +55 -6
  811. package/scripts/test/test-e2e-stamp.ts +38 -0
  812. package/scripts/test/test-pinned-logic.ts +145 -0
  813. package/scripts/test/test-pinned-main.ts +78 -0
  814. package/scripts/test/test-pinned.ts +100 -0
  815. package/scripts/test/test-read-map.ts +264 -0
  816. package/scripts/test/test-read-recording.ts +91 -0
  817. package/scripts/test/test-read-trace.ts +148 -0
  818. package/scripts/test/test-red-main.ts +12 -0
  819. package/scripts/test/test-red.ts +12 -30
  820. package/scripts/test/test-related-main.ts +18 -0
  821. package/scripts/test/test-related-record.ts +119 -0
  822. package/scripts/test/test-related-scope.ts +229 -43
  823. package/scripts/test/test-related.ts +300 -22
  824. package/scripts/test/test-unit-guard-main.ts +15 -0
  825. package/scripts/test/test-unit-guard.ts +54 -21
  826. package/scripts/test/unit-count-file.ts +37 -0
  827. package/scripts/test/unit-run-marker.ts +162 -0
  828. package/scripts/test/unit-setup-files.ts +51 -0
  829. package/scripts/test/unit-worker-share.ts +71 -137
  830. package/scripts/test/whole-suite-files.ts +63 -0
  831. package/scripts/time-runtime/time-background.ts +20 -2
  832. package/scripts/time-runtime/time-bundles.ts +4 -3
  833. package/scripts/time-runtime/time-density-hook.ts +8 -6
  834. package/scripts/time-runtime/time-followup-stage.ts +1 -3
  835. package/scripts/time-runtime/time-format.ts +5 -28
  836. package/scripts/time-runtime/time-markers.ts +10 -1
  837. package/scripts/time-runtime/time-shell.ts +126 -14
  838. package/scripts/time-runtime/time-spans.ts +1 -0
  839. package/scripts/time-runtime/time-tool-call.ts +7 -0
  840. package/scripts/time-runtime/time-transcript-line.ts +49 -62
  841. package/scripts/uninstall/uninstall.ts +1 -1
  842. package/scripts/version/bump-version-main.ts +12 -0
  843. package/scripts/version/bump-version.ts +25 -25
  844. package/scripts/version/effective-upstream.ts +6 -12
  845. package/scripts/version/latest-corepack.ts +17 -32
  846. package/scripts/version/latest-if-required-cli.ts +93 -0
  847. package/scripts/version/latest-lane-guard-main.ts +8 -0
  848. package/scripts/version/latest-lane-guard.ts +0 -4
  849. package/scripts/version/latest-scope-cli.ts +0 -9
  850. package/scripts/version/latest-scope-main.ts +12 -0
  851. package/scripts/version/latest-update.ts +5 -5
  852. package/scripts/version/npm-registry.ts +44 -6
  853. package/scripts/version/publishable-range-check.ts +5 -16
  854. package/scripts/version/release-age.ts +1 -1
  855. package/scripts/version/release-hold.ts +1 -1
  856. package/scripts/version/release-window.ts +38 -0
  857. package/scripts/version/running-binary.ts +1 -1
  858. package/scripts/version/safe-chain-version-update.ts +3 -8
  859. package/scripts/version/version-targets.ts +6 -28
  860. package/templates/dependabot.yml +29 -0
  861. package/templates/gitignore +10 -3
  862. package/templates/pnpm-workspace.basic.yaml +1 -1
  863. package/templates/sonar-project.properties +3 -2
  864. package/templates/workflows/ci.yml +12 -4
  865. package/templates/workflows/github-release.yml +4 -0
  866. package/tsconfig.sonar.json +1 -1
  867. package/.ncurc.json +0 -3
  868. package/dist/hooks/batch-guard.js +0 -29
  869. package/dist/hooks/chunk-43ZHT22P.js +0 -3495
  870. package/dist/hooks/chunk-CDY4NFQG.js +0 -15
  871. package/dist/hooks/chunk-EUMACUK2.js +0 -2038
  872. package/dist/hooks/chunk-H5HVWYXK.js +0 -359
  873. package/dist/hooks/chunk-IIGFYXKC.js +0 -7104
  874. package/dist/hooks/chunk-IX6TTTI6.js +0 -95
  875. package/dist/hooks/chunk-J47HU5H5.js +0 -237
  876. package/dist/hooks/chunk-K4EOONYM.js +0 -45
  877. package/dist/hooks/chunk-K4LMBQC2.js +0 -68
  878. package/dist/hooks/chunk-SHGPANFB.js +0 -56
  879. package/dist/hooks/chunk-YHBZAJSV.js +0 -79
  880. package/dist/hooks/chunk-YYPI7SJZ.js +0 -131
  881. package/dist/hooks/duplicate-read-guard.js +0 -30
  882. package/dist/hooks/investigation-guard.js +0 -32
  883. package/scripts/backlog/backlog-stalled-cli.ts +0 -30
  884. package/scripts/cost-runtime/cost-format.ts +0 -29
  885. package/scripts/init/basic-path-migration.ts +0 -24
  886. package/scripts/issue/issue-backlinks-cli.ts +0 -93
  887. package/scripts/josh/josh-commands-guard.ts +0 -38
  888. package/scripts/lint/cross-file-recheck.ts +0 -155
  889. package/scripts/registry-migration/migrate-logic.ts +0 -237
  890. package/scripts/registry-migration/migrate.ts +0 -292
  891. package/scripts/registry-migration/user-npmrc.ts +0 -15
  892. package/scripts/rules/rule-guard.ts +0 -23
  893. package/scripts/rules/rule-registry-rows.ts +0 -282
  894. package/scripts/rules/rule-registry.ts +0 -109
  895. package/scripts/run/run-stranded-cli.ts +0 -27
@@ -32,8 +32,9 @@ const SEGMENT_PATTERN = /&&|\|\||;|\|/u
32
32
  // last, while `||` keeps the first command's and runs the second only when it failed. `|&` is a pipe
33
33
  // and is cut here, its `&` left in the fragment that follows.
34
34
  const PIPE_PATTERN = /(?<!\|)\|(?!\|)/u
35
- // What `SEGMENT_PATTERN` cuts on minus the pipe, for reading *inside* one pipe segment.
36
- const CHAIN_PATTERN = /&&|\|\||;/u
35
+ // What `SEGMENT_PATTERN` cuts on minus the pipe, for reading *inside* one pipe segment — plus the
36
+ // newline, which ends a command as `;` does, so a line typed before the piped check is not read as it.
37
+ const CHAIN_PATTERN = /&&|\|\||;|\n/u
37
38
  // A quoted span is text, not shell syntax, and it is removed before the pipe reading below. This
38
39
  // repository's issue bodies, comment bodies and commit messages quote command chains constantly, so
39
40
  // `--body "cd x && pnpm josh gate | tail"` is a `gh` call and nothing else — a reader that split its
@@ -52,10 +53,26 @@ const CHAIN_PATTERN = /&&|\|\||;/u
52
53
  // body is not shell syntax at all — an `it's` there is prose — so it is removed before the quotes are
53
54
  // paired, keeping the rest of its marker line (`cat <<EOF > f && git add f`) where the shell reads it.
54
55
  // Without both, a stray quote paired with one much later and erased every command between them.
55
- 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
+ )
56
68
  const HEREDOC_MARKER = /(?<!<)<<-?\s*(['"]?)(\w+)\1/u
57
69
  const HEREDOC_DELIMITER_GROUP = 2
58
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
59
76
  // `set -o pipefail` tells the shell to report the pipeline with the first failing command's status,
60
77
  // so nothing in it is discarded. The flag letters are loose because `set -eo pipefail` and
61
78
  // `set -euo pipefail` are the same instruction, and the `set` word is required so that a path or a
@@ -76,14 +93,36 @@ const FLAG_PREFIX = '-'
76
93
  // Two kinds of prefix, and they are not interchangeable. A wrapper runs the command that follows it,
77
94
  // so the walk continues past it; a navigation builtin runs nothing, so its segment yields no command
78
95
  // at all and the walk moves to the next segment.
79
- 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
+ ])
80
117
  const NAVIGATION_COMMANDS = new Set(['cd', 'pushd', 'popd', 'export', 'source', 'set', '.'])
118
+ const PATH_SEPARATOR = '/'
119
+ const FLAG_AND_VALUE = 2
81
120
 
82
121
  // Anchored at a segment's command position, not searched anywhere in the string. A loose search
83
122
  // charged `git commit -m "ran pnpm josh gate"` to `josh gate`, and this repository's own commit
84
123
  // messages and issue comments name josh subcommands constantly. Only the first match counts: a
85
124
  // compound command naming two would otherwise charge its whole duration to each.
86
- 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
87
126
  const JOSH_PREFIX = 'josh '
88
127
  const COMMAND_KEY = 'command'
89
128
 
@@ -98,19 +137,45 @@ function bash_command(input: unknown): string {
98
137
  // A wrapper's own flags are skipped with it. Skipping only the wrapper word left the walk on a flag,
99
138
  // which is not command-shaped, so `env -i pnpm test` yielded no command at all and its duration left
100
139
  // the per-command table entirely.
101
- function is_skippable(word: string): boolean {
102
- 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] ?? ''
103
157
 
104
- return ASSIGNMENT_PATTERN.test(word) || WRAPPER_COMMANDS.has(word)
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))
161
+
162
+ if (wrapper === undefined) return index
163
+
164
+ return after_flags(words, index + 1, wrapper.valued) + wrapper.operands
105
165
  }
106
166
 
107
167
  // One segment with its leading assignments and wrappers dropped, so the first entry is the command
108
168
  // position. Shared by both readers below: what counts as the command is one rule, not two.
109
169
  function command_words(segment: string): Array<string> {
110
170
  const words = segment.replaceAll(SUBSHELL_OPENER, ' ').trim().split(WHITESPACE_PATTERN)
111
- 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
+ }
112
177
 
113
- return start === -1 ? [] : words.slice(start)
178
+ return words.slice(start)
114
179
  }
115
180
 
116
181
  // The command this segment runs, or nothing. Nothing has two causes and both are deliberate: a
@@ -185,15 +250,35 @@ function without_heredoc_bodies(command: string): string {
185
250
  // removal for a different reason — a quoted `sed` script holds `|` and slashes that read as a
186
251
  // pipeline and as paths — and two spellings of "remove the quotes" would disagree the first time one
187
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
+
188
267
  function unquoted(command: string): string {
189
- 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
+ )
190
271
  }
191
272
 
192
273
  // Quoted text replaced by spaces of its own length, so an offset found here is the same offset in the
193
274
  // command — what a caller cutting the command where the unquoted reading says to needs. `undefined`
194
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
+
195
280
  function blanked(command: string): string | undefined {
196
- if (HEREDOC_MARKER.test(command)) return undefined
281
+ if (has_heredoc(command)) return undefined
197
282
 
198
283
  return command.replaceAll(QUOTED_SPAN_PATTERN, (span) => ' '.repeat(span.length))
199
284
  }
@@ -299,8 +384,8 @@ function drop_redirections(words: ReadonlyArray<string>): Array<string> {
299
384
  // **The match's own text is what is sliced off, not a fixed word count.** The prefix is two words in
300
385
  // `josh lint`, three in `pnpm josh lint` and four in `pnpm exec josh lint`, so counting words would
301
386
  // leave `josh` itself in the argument list for one of the three spellings.
302
- function josh_arguments(command: string): Array<string> {
303
- const text = command_words(command_segment(command)).join(' ')
387
+ function josh_arguments_of_segment(segment: string): Array<string> {
388
+ const text = command_words(segment).join(' ')
304
389
  const match = JOSH_PATTERN.exec(text)
305
390
 
306
391
  if (match === null) return []
@@ -313,6 +398,29 @@ function josh_arguments(command: string): Array<string> {
313
398
  return drop_redirections(words)
314
399
  }
315
400
 
401
+ function josh_arguments(command: string): Array<string> {
402
+ return josh_arguments_of_segment(command_segment(command))
403
+ }
404
+
405
+ // The josh subcommand one segment runs plus every argument it passes, redirections dropped, or `''`
406
+ // for a segment that runs none. **Flags are kept**: which of them ask nothing new (`run:board --chat`)
407
+ // and which turn a read into a write (`run:carry --cut`) is the reader's rule, not this one's.
408
+ function josh_signature_of_segment(segment: string): string {
409
+ const name = josh_command_of_segment(segment)
410
+
411
+ if (name === '') return ''
412
+
413
+ return [name, ...josh_arguments_of_segment(segment)].join(' ')
414
+ }
415
+
416
+ // Every segment's signature, read over the same unquoted chain `josh_commands_of` walks.
417
+ function josh_signatures_of(command: string): Array<string> {
418
+ return unquoted(command)
419
+ .split(SEGMENT_PATTERN)
420
+ .map((segment) => josh_signature_of_segment(segment))
421
+ .filter((signature) => signature !== '')
422
+ }
423
+
316
424
  const time_shell = {
317
425
  JOSH_PREFIX,
318
426
  bash_command,
@@ -320,11 +428,15 @@ const time_shell = {
320
428
  blanked,
321
429
  command_segment,
322
430
  discarded_commands,
431
+ has_heredoc,
323
432
  josh_arguments,
324
433
  josh_command_of,
434
+ josh_command_of_segment,
325
435
  josh_commands_of,
436
+ josh_signatures_of,
326
437
  leading_word,
327
438
  unquoted,
439
+ without_heredoc_bodies,
328
440
  }
329
441
 
330
442
  export { time_shell }
@@ -334,6 +334,7 @@ function to_spans(events: ReadonlyArray<TimelineEvent>, finished: FinishedAt): A
334
334
  label: event.label,
335
335
  josh_command: event.josh_command,
336
336
  josh_commands: event.josh_commands,
337
+ josh_signatures: event.josh_signatures,
337
338
  check_key: event.check_key,
338
339
  marker: event.marker,
339
340
  is_bundleable: event.is_bundleable,
@@ -55,6 +55,9 @@ interface ToolCall {
55
55
  // A chained `pnpm josh lint:related && pnpm josh test:related` carries both; the count tables expand
56
56
  // it so the ones `josh_command` drops are still counted.
57
57
  josh_commands: ReadonlyArray<string>
58
+ // Each of those with the operands it named, flags dropped — what tells `lane:output 1` from
59
+ // `lane:output 2` once the span has kept no command string. `run-poll-hook.ts` reads it.
60
+ josh_signatures: ReadonlyArray<string>
58
61
  check_key: string
59
62
  marker: PhaseMarker
60
63
  is_bundleable: boolean
@@ -83,6 +86,7 @@ const NO_CALL: ToolCall = {
83
86
  label: '',
84
87
  josh_command: '',
85
88
  josh_commands: [],
89
+ josh_signatures: [],
86
90
  check_key: time_single_check.NO_CHECK,
87
91
  marker: time_markers.NO_MARKER,
88
92
  message_id: NO_MESSAGE_ID,
@@ -95,6 +99,7 @@ const UNKNOWN_CALL: ToolCall = {
95
99
  label: UNKNOWN_TOOL,
96
100
  josh_command: '',
97
101
  josh_commands: [],
102
+ josh_signatures: [],
98
103
  check_key: time_single_check.NO_CHECK,
99
104
  marker: time_markers.NO_MARKER,
100
105
  message_id: NO_MESSAGE_ID,
@@ -111,6 +116,7 @@ function non_bash_call(name: string, input: unknown, message_id: string): ToolCa
111
116
  label: name,
112
117
  josh_command: '',
113
118
  josh_commands: [],
119
+ josh_signatures: [],
114
120
  check_key: time_single_check.NO_CHECK,
115
121
  marker: time_markers.tool_marker(name, input),
116
122
  message_id,
@@ -132,6 +138,7 @@ function bash_call(input: unknown, message_id: string): ToolCall {
132
138
  label: time_shell.bash_label(command),
133
139
  josh_command,
134
140
  josh_commands: time_shell.josh_commands_of(command),
141
+ josh_signatures: time_shell.josh_signatures_of(command),
135
142
  check_key: time_single_check.check_key(josh_command, command),
136
143
  marker: time_markers.bash_marker(command),
137
144
  message_id,
@@ -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