@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
@@ -0,0 +1,183 @@
1
+ import { session_language } from '#scripts/josh/session-language'
2
+
3
+ // `josh cases`' two interaction boundaries (joshuafolkken/kit#4491), read off the changed source with
4
+ // no I/O: the persistent state paths it names (`state`) and the environment it reads (`env`). The four
5
+ // I/O boundaries in `cases-logic.ts` name what a call can return; these name who else shares the
6
+ // state or the environment — the breakages found only after a merge, in another component's run.
7
+
8
+ type Interaction = 'state' | 'env'
9
+
10
+ interface StatePath {
11
+ // The literal as written, cut before a template placeholder so a search finds its fixed head.
12
+ path: string
13
+ // The constants this source binds the literal to — the names another module reaches it through.
14
+ constants: ReadonlyArray<string>
15
+ }
16
+
17
+ interface Environment {
18
+ variables: ReadonlyArray<string>
19
+ residents: ReadonlyArray<string>
20
+ }
21
+
22
+ interface Binding {
23
+ name: string
24
+ value: string
25
+ }
26
+
27
+ interface Wording {
28
+ state: string
29
+ variable: string
30
+ resident: string
31
+ others: string
32
+ no_others: string
33
+ search_failed: string
34
+ state_cases: ReadonlyArray<string>
35
+ variable_cases: ReadonlyArray<string>
36
+ resident_cases: ReadonlyArray<string>
37
+ }
38
+
39
+ const INTERACTIONS: ReadonlyArray<Interaction> = ['state', 'env']
40
+ const QUOTED_LITERAL = /(?<quote>['"`])(?<literal>[^'"`\s]+)\k<quote>/gu
41
+ // A path under `.josh/` with something after the slash, a named lock file, or a `josh-<name>-` file
42
+ // prefix — the temporary-directory records (lane state, ledger, run events) are named that way. The
43
+ // bare `.josh/` root names every state at once, and a bare `.lock` suffix matches every lock in the
44
+ // repository; a `josh-` name with no trailing hyphen is a tag or a keychain service, not a file.
45
+ const STATE_PATH = /(?:\.josh\/[^/])|(?:[^/]\.lock$)|(?:^josh-[a-z][\w-]*-$)/u
46
+ const PLACEHOLDER = /\$\{|<|\*/u
47
+ const CONSTANT_BINDING =
48
+ /\b(?:const|let)\s+(?<name>[A-Za-z_]\w*)\s*(?::[^=\n]+)?=\s*(?<quote>['"`])(?<value>[^'"`\n]+)\k<quote>/gu
49
+ const ENV_MARK = 'process.env'
50
+ const ENV_LITERAL_KEY =
51
+ /\bprocess\.env\.(?<dotted>[A-Za-z_]\w*)|\b(?:process\.env|environment)\[\s*['"](?<quoted>\w+)['"]\s*\]/gu
52
+ // The `environment: X = process.env` default-parameter form reads `environment[KEY]` through a
53
+ // constant, so a key held in a constant is resolved against this source's own bindings.
54
+ const ENV_CONSTANT_KEY = /\b(?:process\.env|environment)\[\s*(?<key>[A-Za-z_]\w*)\s*\]/gu
55
+ const ENV_NAME = /^[A-Z][A-Z0-9_]*$/u
56
+ // A daemon or a beacon named as an identifier or a module (`eslint-daemon`, `daemon_status`), never
57
+ // the bare word, so prose about "the daemon" does not fire the boundary.
58
+ const RESIDENT = /\b[\w-]*(?:[_-](?:daemon|beacon)|(?:daemon|beacon)[_-])[\w-]*/giu
59
+ // A source names one daemon in many identifiers (`spawn_daemon`, `DAEMON_STOP`); its cases are the
60
+ // kind's, so the kind is the subject.
61
+ const RESIDENT_KIND = /daemon|beacon/iu
62
+ const SLASH = '/'
63
+
64
+ const JAPANESE: Wording = {
65
+ state: '共有状態',
66
+ variable: '環境変数',
67
+ resident: '常駐プロセス',
68
+ others: '他の読み書き',
69
+ no_others: 'なし',
70
+ search_failed: '検索失敗',
71
+ state_cases: [
72
+ '他の書き手との並行書き込み',
73
+ '他の読み手が古い形式・途中の状態を読む',
74
+ '自分が書く前に他の書き手が消す',
75
+ ],
76
+ variable_cases: [
77
+ '未設定',
78
+ '親プロセスから継承した値(例 GIT_DIR)',
79
+ 'lane の work tree と main で値が違う',
80
+ ],
81
+ resident_cases: [
82
+ '常駐プロセスが古い',
83
+ '常駐プロセスが不在',
84
+ 'lane の work tree と main で別のプロセスに繋がる',
85
+ ],
86
+ }
87
+
88
+ const ENGLISH: Wording = {
89
+ state: 'shared state',
90
+ variable: 'environment variable',
91
+ resident: 'resident process',
92
+ others: 'also read or written by',
93
+ no_others: 'none',
94
+ search_failed: 'search failed',
95
+ state_cases: [
96
+ 'concurrent write by another writer',
97
+ 'another reader reads an old format or a partial state',
98
+ 'another writer deletes it before this write',
99
+ ],
100
+ variable_cases: [
101
+ 'unset',
102
+ 'value inherited from the parent process (e.g. GIT_DIR)',
103
+ 'differs between the lane work tree and main',
104
+ ],
105
+ resident_cases: [
106
+ 'resident process is stale',
107
+ 'resident process is absent',
108
+ 'the lane work tree and main reach different processes',
109
+ ],
110
+ }
111
+
112
+ function fixed_head(literal: string): string {
113
+ const placeholder = PLACEHOLDER.exec(literal)
114
+
115
+ const head = placeholder === null ? literal : literal.slice(0, placeholder.index)
116
+
117
+ // `.josh/observations/` and `.josh/observations` name one state, so both search as the latter.
118
+ return head.endsWith(SLASH) ? head.slice(0, -1) : head
119
+ }
120
+
121
+ function bindings(content: string): ReadonlyArray<Binding> {
122
+ return [...content.matchAll(CONSTANT_BINDING)].map((match) => ({
123
+ name: match.groups?.['name'] ?? '',
124
+ value: match.groups?.['value'] ?? '',
125
+ }))
126
+ }
127
+
128
+ function state_literals(content: string): ReadonlyArray<string> {
129
+ const heads = [...content.matchAll(QUOTED_LITERAL)].map((match) =>
130
+ fixed_head(match.groups?.['literal'] ?? ''),
131
+ )
132
+
133
+ return [...new Set(heads.filter((head) => STATE_PATH.test(head)))]
134
+ }
135
+
136
+ function state_paths_in(content: string): ReadonlyArray<StatePath> {
137
+ const declared = bindings(content)
138
+
139
+ return state_literals(content).map((path) => ({
140
+ path,
141
+ constants: declared
142
+ .filter((binding) => fixed_head(binding.value) === path)
143
+ .map((binding) => binding.name),
144
+ }))
145
+ }
146
+
147
+ function constant_keys(content: string): ReadonlyArray<string> {
148
+ const values = new Map(bindings(content).map((binding) => [binding.name, binding.value]))
149
+ const keys = [...content.matchAll(ENV_CONSTANT_KEY)].map((match) =>
150
+ values.get(match.groups?.['key'] ?? ''),
151
+ )
152
+
153
+ return keys.filter((name): name is string => name !== undefined && ENV_NAME.test(name))
154
+ }
155
+
156
+ // A source that hands `process.env` on whole, naming no variable, still reads the environment.
157
+ function variables_in(content: string): ReadonlyArray<string> {
158
+ if (!content.includes(ENV_MARK)) return []
159
+
160
+ const literal = [...content.matchAll(ENV_LITERAL_KEY)].map(
161
+ (match) => match.groups?.['dotted'] ?? match.groups?.['quoted'] ?? '',
162
+ )
163
+ const names = [...new Set([...literal, ...constant_keys(content)])]
164
+
165
+ return names.length === 0 ? [ENV_MARK] : names
166
+ }
167
+
168
+ function environment_in(content: string): Environment {
169
+ const residents = [...content.matchAll(RESIDENT)].map((match) =>
170
+ (RESIDENT_KIND.exec(match[0])?.[0] ?? '').toLowerCase(),
171
+ )
172
+
173
+ return { variables: variables_in(content), residents: [...new Set(residents)] }
174
+ }
175
+
176
+ function wording(lang: string = session_language.DEFAULT_SESSION_LANG): Wording {
177
+ return session_language.is_japanese(lang) ? JAPANESE : ENGLISH
178
+ }
179
+
180
+ const cases_interaction = { INTERACTIONS, state_paths_in, environment_in, wording }
181
+
182
+ export type { Environment, Interaction, StatePath, Wording }
183
+ export { cases_interaction }
@@ -1,9 +1,11 @@
1
+ import { session_language } from '#scripts/josh/session-language'
1
2
  import { file_reader } from '#scripts/lib/read-file'
3
+ import { cases_interaction } from './cases-interaction'
2
4
 
3
5
  // `josh cases <path...>`: read the changed paths and answer which I/O
4
6
  // boundaries the code crosses — network, process start, filesystem — then name the abnormal cases
5
7
  // that boundary always owes. The unit suite blocks network by construction
6
- // (`scripts/test/test-network-guard.ts`), so a boundary's abnormal cases never run there; this makes
8
+ // (`tools/test/test-network-guard.ts`), so a boundary's abnormal cases never run there; this makes
7
9
  // the declaration side name them instead, read off the diff rather than off judgement.
8
10
  // `prompts/collaboration-workflow/report-format.md` is the single source of where the answer goes —
9
11
  // the second tier of the case-based test declaration ("if it breaks").
@@ -17,6 +19,8 @@ interface BoundaryDefinition {
17
19
  pattern: RegExp
18
20
  // The abnormal cases this boundary always owes, so they land in the second tier.
19
21
  cases: ReadonlyArray<string>
22
+ // The same cases for an English session, in the same order.
23
+ english_cases: ReadonlyArray<string>
20
24
  }
21
25
 
22
26
  const BOUNDARIES: ReadonlyArray<BoundaryDefinition> = [
@@ -27,6 +31,14 @@ const BOUNDARIES: ReadonlyArray<BoundaryDefinition> = [
27
31
  // would fire `network` on every markdown edit and defeat the oracle.
28
32
  pattern: /\b(?:fetch|axios|undici|node:https?|XMLHttpRequest)\b/u,
29
33
  cases: ['非200', 'タイムアウト', '接続断', '空レスポンス', '不正JSON', 'レート制限'],
34
+ english_cases: [
35
+ 'non-200',
36
+ 'timeout',
37
+ 'connection drop',
38
+ 'empty response',
39
+ 'invalid JSON',
40
+ 'rate limit',
41
+ ],
30
42
  },
31
43
  {
32
44
  boundary: 'process',
@@ -36,6 +48,7 @@ const BOUNDARIES: ReadonlyArray<BoundaryDefinition> = [
36
48
  pattern:
37
49
  /\b(?:child_process|execSync|execFileSync|spawnSync)\b|\b(?:exec|execFile|spawn)\s*\(/u,
38
50
  cases: ['非ゼロ終了', 'タイムアウト', '標準エラー出力', '実行ファイル不在'],
51
+ english_cases: ['non-zero exit', 'timeout', 'stderr output', 'missing executable'],
39
52
  },
40
53
  {
41
54
  boundary: 'fs',
@@ -45,6 +58,13 @@ const BOUNDARIES: ReadonlyArray<BoundaryDefinition> = [
45
58
  pattern:
46
59
  /\b(?:node:fs|fs\/promises|readFileSync|writeFileSync)\b|\b(?:readFile|writeFile|mkdir|unlink|readdir|rm)\s*\(/u,
47
60
  cases: ['ファイル不在', '権限エラー', '空ファイル', '不正な内容', '並行書き込み'],
61
+ english_cases: [
62
+ 'missing file',
63
+ 'permission error',
64
+ 'empty file',
65
+ 'invalid content',
66
+ 'concurrent write',
67
+ ],
48
68
  },
49
69
  {
50
70
  boundary: 'time',
@@ -57,6 +77,12 @@ const BOUNDARIES: ReadonlyArray<BoundaryDefinition> = [
57
77
  pattern:
58
78
  /\b(?:setInterval|setTimeout|setImmediate|schedule|reschedule|retry)\s*\(|\b(?:cron|crontab|heartbeat|watchdog|liveness)\b/u,
59
79
  cases: ['期待した事象が到来しない', '期限超過', '重複発火', '再試行が尽きる'],
80
+ english_cases: [
81
+ 'awaited event never arrives',
82
+ 'deadline exceeded',
83
+ 'duplicate firing',
84
+ 'retries exhausted',
85
+ ],
60
86
  },
61
87
  ]
62
88
 
@@ -76,17 +102,24 @@ function boundaries_in(paths: ReadonlyArray<string>): ReadonlyArray<Boundary> {
76
102
  )
77
103
  }
78
104
 
79
- // The abnormal cases owed by the given boundaries, in the fixed boundary order.
80
- function cases_for(boundaries: ReadonlyArray<Boundary>): ReadonlyArray<string> {
105
+ // The abnormal cases owed by the given boundaries, in the fixed boundary order and in `lang`.
106
+ function cases_for(
107
+ boundaries: ReadonlyArray<Boundary>,
108
+ lang: string = session_language.DEFAULT_SESSION_LANG,
109
+ ): ReadonlyArray<string> {
110
+ const is_japanese = session_language.is_japanese(lang)
111
+
81
112
  return BOUNDARIES.filter((definition) => boundaries.includes(definition.boundary)).flatMap(
82
- (definition) => definition.cases,
113
+ (definition) => (is_japanese ? definition.cases : definition.english_cases),
83
114
  )
84
115
  }
85
116
 
86
- // The fixed verdict vocabulary the command can print — the three boundary tokens and `none`. The
87
- // decision-oracle test asserts its registered vocabulary equals this.
117
+ // The fixed verdict vocabulary the command can print — the four boundary tokens, the two interaction
118
+ // tokens (`cases-interaction.ts`) and `none`. The decision-oracle test asserts its registered
119
+ // vocabulary equals this.
88
120
  const VOCABULARY: ReadonlyArray<string> = [
89
121
  ...BOUNDARIES.map((definition) => definition.boundary),
122
+ ...cases_interaction.INTERACTIONS,
90
123
  NONE,
91
124
  ]
92
125
 
@@ -0,0 +1,18 @@
1
+ #!/usr/bin/env tsx
2
+ import { fileURLToPath } from 'node:url'
3
+ import { pr_classification } from './pr-classification'
4
+
5
+ // The `josh pr:classification` entry, kept apart from `pr-classification.ts` because other modules
6
+ // import that one: a bundle is one file, so a main guard there would fire for every command that
7
+ // carries it (joshuafolkken/kit#4186).
8
+ if (process.argv[1] === fileURLToPath(import.meta.url)) {
9
+ const event_path = process.env['GITHUB_EVENT_PATH']
10
+ if (!event_path) throw new Error('GITHUB_EVENT_PATH is required')
11
+
12
+ const error = pr_classification.check_event(event_path)
13
+
14
+ if (error) {
15
+ console.error(`::error::${error}`)
16
+ process.exitCode = 1
17
+ }
18
+ }
@@ -1,8 +1,9 @@
1
1
  import { readFileSync } from 'node:fs'
2
- import { fileURLToPath } from 'node:url'
2
+ import { git_gh_api_path } from '#scripts/gh/git-gh-api-path'
3
3
  import { git_gh_exec } from '#scripts/gh/git-gh-exec'
4
4
  import {
5
5
  BREAKING_CHANGE_LABEL as BREAKING,
6
+ BUG_LABEL,
6
7
  BUGFIX_LABEL as BUGFIX,
7
8
  RELEASE_CLASSIFICATION_NAMES as CLASSIFICATION_LABELS,
8
9
  ENHANCEMENT_LABEL,
@@ -12,13 +13,13 @@ import { error_text } from '#scripts/lib/error-message'
12
13
  import { z } from 'zod'
13
14
 
14
15
  const CLASSIFICATION_SET: ReadonlySet<string> = new Set(CLASSIFICATION_LABELS)
15
- const ISSUE_BUG_LABEL = 'bug'
16
16
  // The line an Issue body declares its release classification with. A body written by a script
17
17
  // (`josh propagate`'s upgrade issue) builds it with `declaration`, so the writer and this parser share
18
18
  // one format.
19
19
  const DECLARATION_PREFIX = '- リリース分類: '
20
20
  const DECLARATION = new RegExp(`^${DECLARATION_PREFIX}(.+)$`, 'gmu')
21
21
  const LEGACY_LABELS: ReadonlySet<string> = new Set(['semver-major', 'semver-minor'])
22
+ const LABEL_NAMES_FILTER = '.[].name'
22
23
 
23
24
  const LABEL = z.object({ name: z.string() })
24
25
  const USER = z.object({ login: z.string() })
@@ -70,7 +71,7 @@ function issue_candidates(issue_json: string): ReadonlyArray<ReleaseClassificati
70
71
 
71
72
  if (unknown.length > 0) throw new Error(`Unknown release classification: ${unknown.join(', ')}`)
72
73
 
73
- if (names.includes(ISSUE_BUG_LABEL) && !candidates.includes(BREAKING)) {
74
+ if (names.includes(BUG_LABEL) && !candidates.includes(BREAKING)) {
74
75
  candidates.push(BUGFIX)
75
76
  }
76
77
 
@@ -96,10 +97,14 @@ function select_issue_classification(issue_json: string): ReleaseClassification
96
97
  // payload, that run fails, and when it lands in the newer check suite GitHub keeps its red result —
97
98
  // a rerun replays the same payload and fails again.
98
99
  function fetch_current_labels(repository: string, pull_number: number): ReadonlyArray<string> {
99
- const path = `repos/${repository}/issues/${String(pull_number)}/labels`
100
+ const path = git_gh_api_path.issue_labels_api_path(String(pull_number), repository)
100
101
 
101
102
  try {
102
- const names = git_gh_exec.exec_gh_api_sync({ path, jq_filter: '.[].name' })
103
+ const names = git_gh_exec.exec_gh_api_sync({
104
+ path,
105
+ should_paginate: true,
106
+ jq_filter: LABEL_NAMES_FILTER,
107
+ })
103
108
 
104
109
  return names.split('\n').filter((name) => name !== '')
105
110
  } catch (error) {
@@ -119,18 +124,6 @@ function check_event(
119
124
  return classification_error(labels, event.pull_request.user.login)
120
125
  }
121
126
 
122
- if (process.argv[1] === fileURLToPath(import.meta.url)) {
123
- const event_path = process.env['GITHUB_EVENT_PATH']
124
- if (!event_path) throw new Error('GITHUB_EVENT_PATH is required')
125
-
126
- const error = check_event(event_path)
127
-
128
- if (error) {
129
- console.error(`::error::${error}`)
130
- process.exitCode = 1
131
- }
132
- }
133
-
134
127
  const pr_classification = {
135
128
  classification_error,
136
129
  check_event,
@@ -17,7 +17,7 @@ import { clone_fingerprint } from './clone-fingerprint'
17
17
  // which is what makes two identical relative paths in different repositories a cross-repository clone.
18
18
 
19
19
  // The directories a package keeps its source in; whichever exist are scanned.
20
- const SOURCE_ROOTS = ['scripts', 'src']
20
+ const SOURCE_ROOTS = ['scripts', 'tools', 'src']
21
21
  const SOURCE_EXTENSION = '.ts'
22
22
  // Test files and declarations are not product code, so a shared test helper is not a clone to report.
23
23
  const IGNORED_SUFFIXES = ['.test.ts', '.svelte.test.ts', '.d.ts']
@@ -1,4 +1,9 @@
1
1
  import { json_value } from '#scripts/lib/json-value'
2
+ import {
3
+ transcript_record,
4
+ type TranscriptBlock,
5
+ type TranscriptContent,
6
+ } from '#scripts/lib/transcript-record'
2
7
  import { z } from 'zod'
3
8
 
4
9
  // Reading the content blocks out of a session transcript.
@@ -18,27 +23,7 @@ import { z } from 'zod'
18
23
  const CONTENT_ITEM_SCHEMA = z.object({ text: z.string().nullish() })
19
24
  const RESULT_CONTENT_SCHEMA = z.union([z.string(), z.array(CONTENT_ITEM_SCHEMA)])
20
25
 
21
- // Every field is optional, including `type`. A required field would make one unexpected block fail
22
- // the whole array it sits in, and with it every other block on that line — an entire assistant turn
23
- // dropped from the table because one tool wrote a shape this reader had not seen. A block that
24
- // parses to nothing contributes nothing, which is the cost it should have.
25
- const BLOCK_SCHEMA = z.object({
26
- type: z.string().nullish(),
27
- text: z.string().nullish(),
28
- name: z.string().nullish(),
29
- input: z.unknown().nullish(),
30
- content: RESULT_CONTENT_SCHEMA.nullish(),
31
- })
32
-
33
- const LINE_CONTENT_SCHEMA = z.union([z.string(), z.array(BLOCK_SCHEMA)])
34
- const MESSAGE_SCHEMA = z.object({ content: LINE_CONTENT_SCHEMA.nullish() })
35
- const CONTENT_LINE_SCHEMA = z.object({ type: z.string(), message: MESSAGE_SCHEMA.nullish() })
36
-
37
- type RawBlock = z.infer<typeof BLOCK_SCHEMA>
38
-
39
- const TEXT_TYPE = 'text'
40
- const TOOL_USE_TYPE = 'tool_use'
41
- const TOOL_RESULT_TYPE = 'tool_result'
26
+ const { TEXT_TYPE, TOOL_USE_TYPE, TOOL_RESULT_TYPE } = transcript_record
42
27
  const BASH_TOOL = 'Bash'
43
28
  const COMMAND_KEY = 'command'
44
29
 
@@ -71,7 +56,7 @@ function split_bash_input(input: unknown): { command: string; rest: string } {
71
56
  }
72
57
  }
73
58
 
74
- function to_tool_use(block: RawBlock): ContentBlock {
59
+ function to_tool_use(block: TranscriptBlock): ContentBlock {
75
60
  const tool_name = block.name ?? ''
76
61
  const is_bash = tool_name === BASH_TOOL
77
62
  const { command, rest } = is_bash
@@ -83,31 +68,33 @@ function to_tool_use(block: RawBlock): ContentBlock {
83
68
 
84
69
  // A tool result is either a plain string or a list of blocks. Only the textual items are counted:
85
70
  // an image block carries no text here, and inventing a size for it would put a made-up number in a
86
- // table whose whole purpose is to be compared against another run's.
87
- function result_text(content: string | ReadonlyArray<z.infer<typeof CONTENT_ITEM_SCHEMA>>): string {
88
- if (typeof content === 'string') return content
89
-
90
- return content.map((item) => item.text ?? '').join('')
71
+ // table whose whole purpose is to be compared against another run's. A body of neither shape
72
+ // contributes nothing rather than dropping the line it sits on.
73
+ function result_text(content: unknown): string {
74
+ const parsed = RESULT_CONTENT_SCHEMA.safeParse(content)
75
+ if (!parsed.success) return ''
76
+ if (typeof parsed.data === 'string') return parsed.data
77
+
78
+ return parsed.data.map((item) => item.text ?? '').join('')
91
79
  }
92
80
 
93
81
  // Everything that is not a tool call: a result contributes its textual content, and anything else —
94
82
  // text, thinking, a block type this reader has never seen — contributes its `text`, which for
95
83
  // thinking is the empty string Claude Code writes there.
96
- function to_plain_block(block: RawBlock): ContentBlock {
84
+ function to_plain_block(block: TranscriptBlock): ContentBlock {
97
85
  const base = { type: block.type ?? '', tool_name: '', command: '' }
98
- const text =
99
- block.type === TOOL_RESULT_TYPE ? result_text(block.content ?? '') : (block.text ?? '')
86
+ const text = block.type === TOOL_RESULT_TYPE ? result_text(block.content) : (block.text ?? '')
100
87
 
101
88
  return { ...base, text }
102
89
  }
103
90
 
104
- function to_block(block: RawBlock): ContentBlock {
91
+ function to_block(block: TranscriptBlock): ContentBlock {
105
92
  return block.type === TOOL_USE_TYPE ? to_tool_use(block) : to_plain_block(block)
106
93
  }
107
94
 
108
95
  // A user turn whose content is a bare string — the prompt itself, plus whatever a `UserPromptSubmit`
109
96
  // hook injected into it. Counted as text, which is what it is.
110
- function to_blocks(content: string | ReadonlyArray<RawBlock>): Array<ContentBlock> {
97
+ function to_blocks(content: string | ReadonlyArray<TranscriptBlock>): Array<ContentBlock> {
111
98
  if (typeof content === 'string') {
112
99
  return [{ type: TEXT_TYPE, tool_name: '', command: '', text: content }]
113
100
  }
@@ -116,13 +103,11 @@ function to_blocks(content: string | ReadonlyArray<RawBlock>): Array<ContentBloc
116
103
  }
117
104
 
118
105
  // A blank line, a line that is not JSON, and a line carrying no message content are one answer:
119
- // nothing to count. With `BLOCK_SCHEMA` accepting anything object-shaped, the only line lost whole
106
+ // nothing to count. With the block schema accepting anything object-shaped, the only line lost whole
120
107
  // is one that is not JSON at all — which `cost-usage.ts` already counts as unparseable, so
121
108
  // reporting it again here would double one missing-data figure.
122
- function content_of(line: string): z.infer<typeof LINE_CONTENT_SCHEMA> | undefined {
123
- const parsed = CONTENT_LINE_SCHEMA.safeParse(json_value.parse_or_undefined(line))
124
-
125
- return parsed.success ? (parsed.data.message?.content ?? undefined) : undefined
109
+ function content_of(line: string): TranscriptContent | undefined {
110
+ return transcript_record.parse(line)?.message?.content ?? undefined
126
111
  }
127
112
 
128
113
  function parse_line(line: string): Array<ContentBlock> {
@@ -1,5 +1,3 @@
1
- #!/usr/bin/env tsx
2
- import { fileURLToPath } from 'node:url'
3
1
  import { agent_role_profile, type AgentProvider } from '#scripts/agent/agent-role-profile'
4
2
  import { cli_flags } from '#scripts/lib/cli-flags'
5
3
  import { codex_usage } from './codex-usage'
@@ -20,7 +18,6 @@ import { transcript_cwd } from './transcript-cwd'
20
18
  // `backlogrun` / `halfrun` / `pre-gate-cut` ask, and the `josh time` run-timing report keeps the
21
19
  // hand-off aggregates used to compare the shared context-cut threshold.
22
20
 
23
- const ARGV_OFFSET = 2
24
21
  const FAILURE_EXIT_CODE = 1
25
22
  const USAGE = 'Usage: josh cost (--cut | --over <tokens-per-request>) [--path <dir>]'
26
23
  // The read-only verdict's third answer, beside `cost_verdict`'s over/under: a session that cannot be
@@ -29,6 +26,12 @@ const UNMEASURABLE_VERDICT = 'unmeasurable'
29
26
 
30
27
  type CostVerdict = ReturnType<typeof cost_verdict.classify> | typeof UNMEASURABLE_VERDICT
31
28
 
29
+ interface SessionFigures {
30
+ verdict: CostVerdict
31
+ cost: number | undefined
32
+ threshold: number
33
+ }
34
+
32
35
  interface Options {
33
36
  over?: number
34
37
  // The target project whose transcripts to read, or absent for this process's own working
@@ -243,6 +246,28 @@ function verdict_of(measurement: OverMeasurement | undefined): CostVerdict {
243
246
  return cost_verdict.classify(measurement, CONTEXT_CUT_THRESHOLD)
244
247
  }
245
248
 
249
+ // The verdict with the figures it was decided on — the newest request's billed input and the shared
250
+ // threshold — so a report that cites the verdict quotes the same numbers rather than re-measuring.
251
+ // An unmeasurable session has no cost to quote, which is `undefined`, never `0`.
252
+ function figures_of(measurement: OverMeasurement | undefined): SessionFigures {
253
+ const verdict = verdict_of(measurement)
254
+ const is_priced = measurement !== undefined && verdict !== UNMEASURABLE_VERDICT
255
+ const cost = is_priced ? cost_verdict.per_request_cost(measurement) : undefined
256
+
257
+ return { verdict, cost, threshold: CONTEXT_CUT_THRESHOLD }
258
+ }
259
+
260
+ // The `--cut` verdict and its figures as a value, printing nothing. `run:report --handoff` quotes the
261
+ // figures in the hand-off report; `session_verdict` reads the verdict alone.
262
+ function session_figures(
263
+ cwd: string = process.cwd(),
264
+ environment: Environment = process.env,
265
+ ): SessionFigures {
266
+ const provider = provider_of(environment)
267
+
268
+ return figures_of(provider === undefined ? undefined : measure(cwd, provider, environment))
269
+ }
270
+
246
271
  // The `--cut` verdict as a value, printing nothing. `run:status` bundles
247
272
  // this beside the issue state and the carry record, so it needs the token rather than the exit code
248
273
  // `run` returns. `unmeasurable` is the read-only counterpart of `report_empty` / the empty-session
@@ -252,10 +277,7 @@ function session_verdict(
252
277
  cwd: string = process.cwd(),
253
278
  environment: Environment = process.env,
254
279
  ): CostVerdict {
255
- const provider = provider_of(environment)
256
- if (provider === undefined) return UNMEASURABLE_VERDICT
257
-
258
- return verdict_of(measure(cwd, provider, environment))
280
+ return session_figures(cwd, environment).verdict
259
281
  }
260
282
 
261
283
  function run_context(
@@ -294,20 +316,15 @@ function run(
294
316
  return run_over(target, context.over, context.provider, environment)
295
317
  }
296
318
 
297
- function main(argv: ReadonlyArray<string>): void {
298
- process.exitCode = run(argv)
299
- }
300
-
301
319
  const cost_cli = {
302
320
  UNMEASURABLE_VERDICT,
303
321
  USAGE,
304
322
  parse_options,
305
323
  to_threshold,
306
324
  run,
325
+ session_figures,
307
326
  session_verdict,
308
327
  }
309
328
 
310
- if (process.argv[1] === fileURLToPath(import.meta.url)) main(process.argv.slice(ARGV_OFFSET))
311
-
312
- export type { CostVerdict, Options }
329
+ export type { CostVerdict, Options, SessionFigures }
313
330
  export { cost_cli }
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env tsx
2
+ import { fileURLToPath } from 'node:url'
3
+ import { cost_cli } from './cost-cli'
4
+
5
+ // The `josh cost` entry, kept apart from `cost-cli.ts` because `implementation-cut.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 = cost_cli.run(process.argv.slice(ARGV_OFFSET))
12
+ }
@@ -505,6 +505,7 @@ const cost_transcript = {
505
505
  transcript_directory,
506
506
  transcript_directories,
507
507
  session_cwd,
508
+ lane_transcript_directories,
508
509
  unit_directory,
509
510
  list_sessions,
510
511
  list_sessions_across,
@@ -26,8 +26,9 @@ interface DelegatableStep {
26
26
  // Where the pre-implementation reading stops being cheaper in the main line.
27
27
  //
28
28
  // **A count, not a forecast.** The reads are counted as they are made rather than predicted before
29
- // the investigation starts, so nothing here rests on guessing how large it will be. Two files the run
30
- // will not edit stay in the main line, because delegating costs two extra main-line turns — one to
29
+ // the investigation starts, so nothing here rests on guessing how large it will be. It is where the
30
+ // guard refuses, not a budget: a run that knows its subject needs reading delegates before the first
31
+ // read (`run:prep`, #4345). Two stray files the run will not edit are tolerated, because delegating costs two extra main-line turns — one to
31
32
  // write the brief, one to read the result, about 18 seconds at roughly 8.8 s of model
32
33
  // wait per turn — and below the threshold that round trip costs more than carrying the text.
33
34
  const INVESTIGATION_FILE_THRESHOLD = 3
@@ -38,6 +39,15 @@ const INVESTIGATION_FILE_THRESHOLD = 3
38
39
  // target, in the main line and sends the continuing sweep to a unit.
39
40
  const INVESTIGATION_SEARCH_TURN_THRESHOLD = 3
40
41
 
42
+ // `.claude/agents/investigator.md`; a consumer receives it through the plugin as `kit:investigator`.
43
+ const INVESTIGATOR_AGENT = 'investigator'
44
+
45
+ // The limit and the remedy, worded once: the guard's refusal and `run:prep`'s entry notice both print
46
+ // them, so a run told the step up front is told the same step the refusal would name.
47
+ const INVESTIGATION_LIMIT = `${String(INVESTIGATION_FILE_THRESHOLD)} files read and not edited, or ${String(INVESTIGATION_SEARCH_TURN_THRESHOLD)} search turns, since the last delegated unit`
48
+ // Only the dispatch resets the count, so the step names no `josh delegate` call before it (#4345).
49
+ const INVESTIGATION_STEP = `Dispatch the \`${INVESTIGATOR_AGENT}\` agent (\`kit:${INVESTIGATOR_AGENT}\` in a consumer); it returns \`file:line\` citations, never the file text.`
50
+
41
51
  // The enumeration. Short on purpose: every entry had to name a verifier, and most candidates could
42
52
  // not (below).
43
53
  const DELEGATABLE_STEPS: ReadonlyArray<DelegatableStep> = [
@@ -59,12 +69,12 @@ const DELEGATABLE_STEPS: ReadonlyArray<DelegatableStep> = [
59
69
  {
60
70
  name: 'followup-filing',
61
71
  // The late-run follow-up filing chain — `issue:file` (which scouts, lints, labels and runs
62
- // epic:bundle itself) → epic --add — is a dependency chain `batch:guard`
72
+ // epic:bundle itself) → epic --add — is a dependency chain the batching guard
63
73
  // correctly keeps one call per step, and what makes it expensive is the ~340k context it runs in
64
74
  // at the tail of a run, not the step count. A fresh unit runs the same
65
75
  // chain at a small context, and the review round cap already composed the finding text, so what
66
76
  // the unit is handed is mechanical: run the commands and act on their deterministic answers. This
67
- // is not `batch:guard`'s business — delegation only moves the chain to a cheaper context.
77
+ // is not the batching guard's business — delegation only moves the chain to a cheaper context.
68
78
  does: 'run the late-run follow-up filing chain in an isolated unit — issue:file (scout, lint, labels, epic:bundle), then epic --add — given the finding text the parent already composed, and return the new Issue number and the epic:bundle answer',
69
79
  verifier:
70
80
  "the parent reads the filed Issue from GitHub with `pnpm josh issue:state <new>`, not the unit's summary; a follow-up reported filed but not created is still absent, the way `epic-child`'s reported-done-but-not-merged child is still open. The finding text came from the parent and `issue:file`'s steps are deterministic, so the unit's work is the mechanical execution `issue:state` confirms",
@@ -181,7 +191,10 @@ function reason_for(name: string): string {
181
191
  const delegation_policy = {
182
192
  DELEGATE_VERDICT,
183
193
  INVESTIGATION_FILE_THRESHOLD,
194
+ INVESTIGATION_LIMIT,
184
195
  INVESTIGATION_SEARCH_TURN_THRESHOLD,
196
+ INVESTIGATION_STEP,
197
+ INVESTIGATOR_AGENT,
185
198
  KEEP_VERDICT,
186
199
  DELEGATABLE_STEPS,
187
200
  REJECTED_STEPS,