@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
@@ -1,8 +1,11 @@
1
1
  #!/usr/bin/env tsx
2
2
  import { existsSync } from 'node:fs'
3
+ import path from 'node:path'
3
4
  import { fileURLToPath } from 'node:url'
4
5
  import { document_byte_check } from '#scripts/document/document-byte-check'
6
+ import { gate_plan } from '#scripts/gate/gate-plan'
5
7
  import { scoped_green } from '#scripts/gate/scoped-green'
8
+ import { since_green } from '#scripts/gate/since-green'
6
9
  import { changed_file_scope, type ChangedFileScope } from '#scripts/git/changed-file-scope'
7
10
  import { review_stamps } from '#scripts/review/review-stamps'
8
11
  import { lint_parallel } from './lint-parallel'
@@ -36,7 +39,8 @@ async function lint_exit_code(scope: ChangedFileScope): Promise<number> {
36
39
  return await lint_parallel.run_lint_checks(
37
40
  lint_related_scope.prettier_arguments(scope.files),
38
41
  lint_related_scope.eslint_arguments(scope.files),
39
- lint_related_scope.cross_file_recheck_options(scope.files),
42
+ lint_related_scope.RELATED_CACHES.eslint_file,
43
+ { warm_daemon: true },
40
44
  )
41
45
  }
42
46
 
@@ -63,6 +67,38 @@ async function scoped_exit_code(scope: ChangedFileScope, root: string): Promise<
63
67
  return byte_check_exit_code(scope, root)
64
68
  }
65
69
 
70
+ // **A bare run reads only what moved since its last green run** (`since-green.ts`), while a lintable file
71
+ // is among it; otherwise the whole branch change, as before.
72
+ async function since_green_scope(root: string): Promise<ChangedFileScope | undefined> {
73
+ const moved = await since_green.read_moved(review_stamps.lint_related_stamp, gate_plan.LINT_LABEL)
74
+
75
+ if (moved === undefined) return undefined
76
+
77
+ const inputs = lint_related_scope.scope_inputs(existsSync)
78
+ const files = moved.map((file) => path.join(root, file))
79
+
80
+ if (changed_file_scope.select_files(files, inputs).length === 0) return undefined
81
+
82
+ process.stdout.write(`${since_green.describe(lint_related_scope.COMMAND_LABEL, moved)}\n`)
83
+
84
+ return changed_file_scope.resolve_scope(files, inputs)
85
+ }
86
+
87
+ async function resolve_lint_scope(
88
+ command_arguments: ReadonlyArray<string>,
89
+ root: string,
90
+ ): Promise<ChangedFileScope> {
91
+ const since = command_arguments.length === 0 ? await since_green_scope(root) : undefined
92
+
93
+ if (since !== undefined) return since
94
+
95
+ return await changed_file_scope.resolve_command_scope({
96
+ command_arguments,
97
+ root,
98
+ inputs: lint_related_scope.scope_inputs(existsSync),
99
+ })
100
+ }
101
+
66
102
  // The narrowing line is printed before either child starts, so a scoped run is never read as a
67
103
  // whole one, and a fallback says which of the two it was rather than looking like a narrow run
68
104
  // that found nothing.
@@ -72,11 +108,7 @@ async function scoped_exit_code(scope: ChangedFileScope, root: string): Promise<
72
108
  // and the three states in which it is withheld, are `scoped-green.ts`.
73
109
  async function run_related_lint(command_arguments: ReadonlyArray<string>): Promise<number> {
74
110
  const root = await changed_file_scope.repository_root_or_cwd()
75
- const scope = await changed_file_scope.resolve_command_scope({
76
- command_arguments,
77
- root,
78
- inputs: lint_related_scope.scope_inputs(existsSync),
79
- })
111
+ const scope = await resolve_lint_scope(command_arguments, root)
80
112
 
81
113
  changed_file_scope.report_unusable_arguments(
82
114
  command_arguments,
@@ -15,7 +15,6 @@ interface Headings {
15
15
  none: string
16
16
  }
17
17
 
18
- const JAPANESE_LANG_PREFIX = 'ja'
19
18
  const JAPANESE_HEADINGS: Headings = {
20
19
  recommended: '推奨:',
21
20
  alternatives: '他の選択肢:',
@@ -31,7 +30,7 @@ const ENGLISH_HEADINGS: Headings = {
31
30
  function headings(): Headings {
32
31
  const { lang } = session_language.resolve_session_lang()
33
32
 
34
- return lang.toLowerCase().startsWith(JAPANESE_LANG_PREFIX) ? JAPANESE_HEADINGS : ENGLISH_HEADINGS
33
+ return session_language.is_japanese(lang) ? JAPANESE_HEADINGS : ENGLISH_HEADINGS
35
34
  }
36
35
 
37
36
  // An empty list is stated as none, so a confirmation with no other option says so rather than
@@ -20,14 +20,14 @@ const telegram_environment_schema = z.object({
20
20
  // Sending `failure` (❌) there would say the merge failed, which is false and is
21
21
  // the more expensive lie of the two; sending `completion` (✅) twice says nothing went wrong, which
22
22
  // is the silence this type exists to end.
23
- // **`stalled` is not `warning`**. `warning` names a run that *finished* and
24
- // merged alongside something that did not work; a stall is the opposite — the run is alive and has not
25
- // finished, it has simply stopped advancing while ready work waits for a free lane. The ⏳ icon says
26
- // exactly that: not done, not broken, just not moving.
27
- // **`stranded` is not `stalled`**. A stall is a *live* run that is not
28
- // dispatching; a strand is the step before it — the run's own driver is gone. The session that cut the
29
- // budget handed it off and died, no successor claimed it, and no supervisor is watching, so nothing can
30
- // take the next step at all. The 🚨 icon says a run needs a hand, not that ready work is merely waiting.
23
+ // **`idle` is not `warning`**. `warning` names a run that *finished* and
24
+ // merged alongside something that did not work; an idle run is alive and has not finished — it has
25
+ // nothing left to dispatch and no child running, so what remains waits on a person. The 💤 icon says
26
+ // exactly that: not done, not broken, just waiting for a hand.
27
+ // **`stranded` is not `idle`**. An idle run still has a driver watching the
28
+ // backlog; a stranded one has none. The session that cut the budget handed it off and died, no
29
+ // successor claimed it, and no supervisor is watching, so nothing can take the next step at all. The
30
+ // 🚨 icon says a run needs a hand to keep running at all.
31
31
  type TelegramTaskType =
32
32
  | 'planning'
33
33
  | 'completion'
@@ -35,7 +35,7 @@ type TelegramTaskType =
35
35
  | 'warning'
36
36
  | 'kickoff_retry'
37
37
  | 'confirmation'
38
- | 'stalled'
38
+ | 'idle'
39
39
  | 'stranded'
40
40
  | 'progress'
41
41
 
@@ -68,7 +68,7 @@ const TASK_DEFINITIONS: Record<TelegramTaskType, TaskDefinition> = {
68
68
  warning: { icon: '⚠️', label: 'Completed with a warning' },
69
69
  kickoff_retry: { icon: '🔄', label: 'Kickoff retry' },
70
70
  confirmation: { icon: '⏸️', label: 'Confirmation required' },
71
- stalled: { icon: '⏳', label: 'Ready work is sitting undispatched' },
71
+ idle: { icon: '💤', label: 'Backlog run idle — nothing left to dispatch' },
72
72
  stranded: { icon: '🚨', label: 'Run stranded — nobody is driving it' },
73
73
  progress: { icon: '📊', label: 'Progress' },
74
74
  }
@@ -389,25 +389,25 @@ async function confirm(input: ConfirmInput): Promise<boolean> {
389
389
  )
390
390
  }
391
391
 
392
- interface StalledInput {
392
+ interface IdleInput {
393
393
  body: string
394
394
  recovery: string
395
395
  }
396
396
 
397
397
  /**
398
- * Push the ⏳ stalled type — ready backlog work with a free lane that nothing has dispatched for a while.
399
- * Off-screen is the whole point: the state is invisible on the terminal until
400
- * a person asks, so it reaches them where they are not watching.
398
+ * Push the 💤 idle type — a backlog run with no child running and nothing left to dispatch.
399
+ * Off-screen is the whole point: what is left waits on a person, and the
400
+ * terminal shows that only to someone already watching.
401
401
  *
402
402
  * **`warn`'s shape exactly** — the repository looked up under the shared bound, the tolerant
403
- * `send_or_report` so a gateway timeout at Telegram never fails the detector that is only reporting, and
403
+ * `send_or_report` so a gateway timeout at Telegram never fails the loop that is only reporting, and
404
404
  * the caller's own `recovery` line. No `issue_title`: the header label already names what this is, and
405
405
  * the body carries what is waiting, so a title line would only repeat the header.
406
406
  */
407
- async function stalled(input: StalledInput): Promise<boolean> {
407
+ async function idle(input: IdleInput): Promise<boolean> {
408
408
  return await send_or_report(
409
409
  {
410
- task_type: 'stalled',
410
+ task_type: 'idle',
411
411
  repo_name: gh_spawn.get_repo_name_with_owner_within(REPO_LOOKUP_TIMEOUT_MS),
412
412
  issue_title: undefined,
413
413
  body: input.body,
@@ -425,11 +425,11 @@ interface StrandedInput {
425
425
 
426
426
  /**
427
427
  * Push the 🚨 stranded type — a run whose driver is gone and which nothing can advance.
428
- * Off-screen is the whole point, as it is for `stalled`: the state is
428
+ * Off-screen is the whole point, as it is for `idle`: the state is
429
429
  * invisible on the terminal because the session that would show it has died, so the person hears about
430
430
  * it where they are not watching, rather than by asking.
431
431
  *
432
- * **`stalled`'s shape exactly** — the repository looked up under the shared bound, the tolerant
432
+ * **`idle`'s shape exactly** — the repository looked up under the shared bound, the tolerant
433
433
  * `send_or_report` so a Telegram timeout never fails the detector that is only reporting, and the
434
434
  * caller's own `recovery` line naming the command that hands the run to a fresh supervisor. No
435
435
  * `issue_title`: the header label already names what this is.
@@ -471,10 +471,10 @@ async function progress(body: string): Promise<boolean> {
471
471
 
472
472
  const telegram_notify = {
473
473
  confirm,
474
+ idle,
474
475
  progress,
475
476
  send,
476
477
  send_or_report,
477
- stalled,
478
478
  stranded,
479
479
  warn,
480
480
  }
@@ -28,7 +28,6 @@ const VALID_TASK_TYPES: ReadonlyArray<TelegramTaskType> = [
28
28
  'warning',
29
29
  'kickoff_retry',
30
30
  'confirmation',
31
- 'stalled',
32
31
  ]
33
32
 
34
33
  const DEFAULT_TASK_TYPE: TelegramTaskType = 'planning'
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env tsx
2
+ import { fileURLToPath } from 'node:url'
3
+ import { telegram_test } from './telegram-test'
4
+
5
+ // The `josh notify` entry, kept apart from `telegram-test.ts` because the stop hook and
6
+ // `run-stop-notify.ts` import that one: a bundle is one file, so a main guard there would fire for
7
+ // every command that carries it (joshuafolkken/kit#4186). The flags are read from `process.argv`.
8
+ if (process.argv[1] === fileURLToPath(import.meta.url)) await telegram_test.run_cli()
@@ -1,5 +1,3 @@
1
- #!/usr/bin/env tsx
2
- import { fileURLToPath } from 'node:url'
3
1
  import { git_gh_issue_read } from '#scripts/gh/git-gh-issue-read'
4
2
  import { git_gh_repo } from '#scripts/gh/git-gh-repo'
5
3
  import { github_issue_url, type IssueUrlTarget } from '#scripts/gh/github-issue-url'
@@ -112,6 +110,14 @@ async function resolve_context(values: CliValues): Promise<ResolvedContext> {
112
110
  return { repo_name, issue_title }
113
111
  }
114
112
 
113
+ // The send behind the command line, for a caller that already holds the values — the `Stop` hook's
114
+ // own confirmation (`stop-actions.ts`). It throws as `telegram_notify.send` does.
115
+ async function send_values(values: CliValues): Promise<void> {
116
+ const context = await resolve_context(values)
117
+
118
+ await telegram_notify.send(telegram_test_logic.build_input({ values, context }))
119
+ }
120
+
115
121
  async function main(): Promise<void> {
116
122
  josh_environment_file.load_environment_file()
117
123
  const values = parse_cli_arguments()
@@ -122,10 +128,7 @@ async function main(): Promise<void> {
122
128
  return
123
129
  }
124
130
 
125
- const context = await resolve_context(values)
126
- const input = telegram_test_logic.build_input({ values, context })
127
-
128
- await telegram_notify.send(input)
131
+ await send_values(values)
129
132
  }
130
133
 
131
134
  // **A notification nobody received must not read as success**. This command
@@ -136,8 +139,8 @@ async function main(): Promise<void> {
136
139
  // and exits non-zero. Both the message and the `cause` whose text `handle` also prints reach it
137
140
  // already free of the bot token and the chat id — `telegram_notify` redacts each before throwing.
138
141
  //
139
- // Separated from the `import.meta.url` guard so the wiring is reachable from a unit test; the guard
140
- // itself stays the canonical one the in-process dispatcher matches on.
142
+ // The `josh notify` entry is `telegram-test-main.ts`, kept apart because other modules import this one
143
+ // (joshuafolkken/kit#4186).
141
144
  async function run_cli(): Promise<void> {
142
145
  try {
143
146
  await main()
@@ -146,8 +149,6 @@ async function run_cli(): Promise<void> {
146
149
  }
147
150
  }
148
151
 
149
- if (process.argv[1] === fileURLToPath(import.meta.url)) await run_cli()
150
-
151
- const telegram_test = { fetch_repo_name, fetch_issue_title, resolve_context, run_cli }
152
+ const telegram_test = { fetch_repo_name, fetch_issue_title, resolve_context, run_cli, send_values }
152
153
 
153
154
  export { telegram_test }
@@ -89,6 +89,18 @@ function is_ledger_path(file_path: string): boolean {
89
89
  )
90
90
  }
91
91
 
92
+ // The git pathspec of every path but the ledger — the same paths `is_ledger_path` answers, for a git
93
+ // command to leave out. `:/` and `top` anchor it at the repository root, so a command run from a
94
+ // subdirectory still covers the whole tree and still leaves the root's ledger alone.
95
+ const LEDGER_EXCLUSION_PATHSPEC: ReadonlyArray<string> = [
96
+ ':/',
97
+ ...LEDGER_DIRECTORIES.map((directory) => `:(top,exclude)${directory}`),
98
+ ...LEGACY_OBSERVATION_LEDGER_PATHS.map((legacy) => `:(top,exclude)${legacy}`),
99
+ ...LEGACY_OBSERVATION_LEDGER_PATHS.map(
100
+ (legacy) => `:(top,exclude,glob)${legacy}.*${MIGRATION_CLAIM_SUFFIX}`,
101
+ ),
102
+ ]
103
+
92
104
  function is_ledger_line(line: string): boolean {
93
105
  return is_ledger_path(status_path(line))
94
106
  }
@@ -124,6 +136,7 @@ const observation_ledger = {
124
136
 
125
137
  export {
126
138
  LEDGER_DIRECTORIES,
139
+ LEDGER_EXCLUSION_PATHSPEC,
127
140
  LEDGER_FILE_EXTENSION,
128
141
  LEGACY_LEDGER_FILE,
129
142
  LEGACY_OBSERVATION_LEDGER_DIRECTORY,
@@ -1,6 +1,8 @@
1
1
  import { git_gh_command } from '#scripts/gh/git-gh-command'
2
2
  import type { OpenPull } from '#scripts/gh/git-gh-pr-auto-merge'
3
3
  import { git_pr_checks } from '#scripts/gh/git-pr-checks'
4
+ import { git_pr_merge_checked } from '#scripts/gh/git-pr-merge-checked'
5
+ import { git_command } from '#scripts/git/git-command'
4
6
  import { issue_cite } from '#scripts/issue/issue-cite'
5
7
  import { error_text } from '#scripts/lib/error-message'
6
8
 
@@ -21,9 +23,10 @@ const MERGE_FAILED_REASON =
21
23
  // **Best-effort, and the answer says which wait to use.** GraphQL — the only way to enable auto-merge
22
24
  // — can be refused in a cloud session, and that loses the safety net rather
23
25
  // than the flush: the in-process wait-and-merge still runs, exactly as before auto-merge existed.
26
+ // The checkout's head is the commit this flush just pushed, so that is the one auto-merge may land.
24
27
  async function request_auto_merge(branch_name: string): Promise<boolean> {
25
28
  try {
26
- await git_gh_command.pr_enable_auto_merge(branch_name)
29
+ await git_gh_command.pr_enable_auto_merge(branch_name, await git_command.head_commit())
27
30
 
28
31
  return true
29
32
  } catch (error) {
@@ -37,8 +40,7 @@ async function request_auto_merge(branch_name: string): Promise<boolean> {
37
40
  // the merge gate's wait would run out its budget on a pull request that is already merged.
38
41
  async function wait_for_landing(branch_name: string, is_auto_merge: boolean): Promise<void> {
39
42
  if (!is_auto_merge) {
40
- await git_pr_checks.wait_for_pr_success(branch_name)
41
- await git_gh_command.pr_merge(branch_name)
43
+ await git_pr_merge_checked.merge_when_green(branch_name)
42
44
 
43
45
  return
44
46
  }
@@ -1,6 +1,7 @@
1
1
  import { git_gh_command } from '#scripts/gh/git-gh-command'
2
2
  import { git_command } from '#scripts/git/git-command'
3
3
  import { main_sync } from '#scripts/git/main-sync'
4
+ import { IGNORE_FOR_RELEASE_LABEL } from '#scripts/issue/issue-labels'
4
5
  import { error_text } from '#scripts/lib/error-message'
5
6
  import { observation_ledger, OBSERVATION_LEDGER_DIRECTORY } from './observation-ledger'
6
7
  import type { BrokenLine } from './observation-ledger-line'
@@ -258,7 +259,11 @@ async function push_and_open(branch_name: string): Promise<string> {
258
259
  try {
259
260
  await git_command.push()
260
261
 
261
- return await git_gh_command.pr_create(COMMIT_MESSAGE, pull_request_body(), 'ignore-for-release')
262
+ return await git_gh_command.pr_create(
263
+ COMMIT_MESSAGE,
264
+ pull_request_body(),
265
+ IGNORE_FOR_RELEASE_LABEL,
266
+ )
262
267
  } catch (error) {
263
268
  throw new Error(stranded_branch_message(branch_name, error_text.message_of(error)), {
264
269
  cause: error,
@@ -11,6 +11,7 @@
11
11
  import { readFileSync, writeFileSync } from 'node:fs'
12
12
  import { fileURLToPath } from 'node:url'
13
13
  import { cli_flags } from '#scripts/lib/cli-flags'
14
+ import { file_reader } from '#scripts/lib/read-file'
14
15
  import { overrides_snapshot_schema } from '#scripts/lib/schemas'
15
16
  import { overrides_files } from './overrides-files'
16
17
  import { overrides_check, type OverridesDiff } from './overrides-logic'
@@ -19,17 +20,13 @@ const ARGV_OFFSET = 2
19
20
  const OPTIONS = { save: { type: 'boolean', default: false } } as const
20
21
  const USAGE = cli_flags.usage_line(['--save'], 'overrides')
21
22
 
22
- function is_file_not_found(error: unknown): boolean {
23
- return error instanceof Error && 'code' in error && error.code === 'ENOENT'
24
- }
25
-
26
23
  function load_snapshot(): Record<string, string> {
27
24
  try {
28
25
  return overrides_snapshot_schema.parse(
29
26
  JSON.parse(readFileSync(overrides_check.SNAPSHOT_PATH, 'utf8')),
30
27
  )
31
28
  } catch (error) {
32
- if (is_file_not_found(error)) {
29
+ if (file_reader.is_absent(error)) {
33
30
  console.error(`✖ Snapshot not found: ${overrides_check.SNAPSHOT_PATH}`)
34
31
  console.error(' Run with --save first to create a snapshot.')
35
32
  } else {
@@ -1,3 +1,4 @@
1
+ import { PACKAGE_JSON } from '#scripts/lib/package-manifest'
1
2
  import { file_reader } from '#scripts/lib/read-file'
2
3
  import { overrides_check, type OverridesSources } from './overrides-logic'
3
4
 
@@ -5,7 +6,7 @@ import { overrides_check, type OverridesSources } from './overrides-logic'
5
6
  // field at all — so a missing file reads as an empty document rather than aborting the check.
6
7
  function read_current_sources(): OverridesSources {
7
8
  return {
8
- package_json: file_reader.read_file_or_empty(overrides_check.PACKAGE_JSON_PATH),
9
+ package_json: file_reader.read_file_or_empty(PACKAGE_JSON),
9
10
  workspace_yaml: file_reader.read_file_or_empty(overrides_check.WORKSPACE_YAML_PATH),
10
11
  }
11
12
  }
@@ -1,3 +1,4 @@
1
+ import { PACKAGE_JSON } from '#scripts/lib/package-manifest'
1
2
  import { yaml_document } from '#scripts/lib/yaml-document'
2
3
  import {
3
4
  package_pnpm_schema,
@@ -68,7 +69,6 @@ function compare(snapshot: Record<string, string>, current: Record<string, strin
68
69
  }
69
70
 
70
71
  const SNAPSHOT_PATH = '.overrides-snapshot.json'
71
- const PACKAGE_JSON_PATH = 'package.json'
72
72
  const WORKSPACE_YAML_PATH = 'pnpm-workspace.yaml'
73
73
 
74
74
  // Both source files are optional and either may be absent from a project entirely, so an empty
@@ -109,14 +109,12 @@ function count_entry(path: string, overrides: Record<string, string>): Array<str
109
109
  function describe_sources(sources: OverridesSources): string {
110
110
  const counts = [
111
111
  ...count_entry(WORKSPACE_YAML_PATH, read_overrides_from_workspace(sources.workspace_yaml)),
112
- ...count_entry(PACKAGE_JSON_PATH, read_overrides_from_package(sources.package_json)).map(
112
+ ...count_entry(PACKAGE_JSON, read_overrides_from_package(sources.package_json)).map(
113
113
  (entry) => `${entry} (ignored by pnpm)`,
114
114
  ),
115
115
  ]
116
116
 
117
- if (counts.length === 0) {
118
- return `no overrides found in ${WORKSPACE_YAML_PATH} or ${PACKAGE_JSON_PATH}`
119
- }
117
+ if (counts.length === 0) return `no overrides found in ${WORKSPACE_YAML_PATH} or ${PACKAGE_JSON}`
120
118
 
121
119
  return counts.join(', ')
122
120
  }
@@ -202,7 +200,6 @@ const overrides_check = {
202
200
  list_excluded_package_names,
203
201
  read_dependency_names,
204
202
  build_update_command,
205
- PACKAGE_JSON_PATH,
206
203
  WORKSPACE_YAML_PATH,
207
204
  SNAPSHOT_PATH,
208
205
  }
@@ -1,16 +1,18 @@
1
- import { mkdtempSync, readFileSync, rmSync, writeFileSync } from 'node:fs'
1
+ import { mkdtempSync, rmSync, writeFileSync } from 'node:fs'
2
2
  import os from 'node:os'
3
3
  import path from 'node:path'
4
+ import { PACKAGE_JSON, package_manifest } from '#scripts/lib/package-manifest'
4
5
  import { execaSync } from 'execa'
6
+ import { z } from 'zod'
5
7
 
6
8
  const root = process.cwd()
7
9
  const scratch = mkdtempSync(path.join(os.tmpdir(), 'kit-eslint-install-'))
8
- const PACKAGE_JSON = 'package.json'
9
10
  const IGNORE_SCRIPTS = '--ignore-scripts'
10
- const manifest = JSON.parse(readFileSync(path.join(root, PACKAGE_JSON), 'utf8')) as {
11
- devDependencies: Record<string, string>
12
- peerDependencies: Record<string, string>
13
- }
11
+ const version_map_schema = z.record(z.string(), z.string())
12
+ const manifest = package_manifest.read_manifest(
13
+ root,
14
+ z.object({ devDependencies: version_map_schema, peerDependencies: version_map_schema }),
15
+ )
14
16
  const eslint_peers = Object.keys(manifest.peerDependencies).filter((name) =>
15
17
  /^(?:@eslint\/|@stylistic\/|eslint|globals$|typescript)/u.test(name),
16
18
  )
@@ -1,4 +1,5 @@
1
1
  import { git_gh_exec } from '#scripts/gh/git-gh-exec'
2
+ import { json_value } from '#scripts/lib/json-value'
2
3
  import { poll } from '#scripts/lib/poll'
3
4
  import { GH_API_TIMEOUT_MS } from '#scripts/lib/timeouts'
4
5
  import { with_page_size } from '#scripts/version/version-remote'
@@ -63,13 +64,7 @@ function fetch_published_versions(versions_endpoint: string): Array<string> | un
63
64
  })
64
65
  if (stdout === undefined) return undefined
65
66
 
66
- try {
67
- const parsed: unknown = JSON.parse(stdout)
68
-
69
- return Array.isArray(parsed) ? parsed.filter((name) => typeof name === 'string') : undefined
70
- } catch {
71
- return undefined
72
- }
67
+ return json_value.parse_array(stdout)?.filter((name) => typeof name === 'string')
73
68
  }
74
69
 
75
70
  // The knobs the wait exposes. Every one of them is injectable so the unit suite can drive the loop
@@ -1,7 +1,7 @@
1
- import { existsSync, readFileSync } from 'node:fs'
1
+ import { existsSync } from 'node:fs'
2
2
  import path from 'node:path'
3
3
  import type { RepoMap } from '#scripts/discovery/repo-map-logic'
4
- import { json_value } from '#scripts/lib/json-value'
4
+ import { package_manifest } from '#scripts/lib/package-manifest'
5
5
  import { z } from 'zod'
6
6
 
7
7
  // Deciding which repositories a published release should be carried into.
@@ -16,7 +16,6 @@ import { z } from 'zod'
16
16
  // us rather than a roster, so a new consumer needs no edit here — and it covers a consumer that is
17
17
  // not a published package at all, which a list of downstream package names cannot.
18
18
 
19
- const MANIFEST_NAME = 'package.json'
20
19
  const NODE_MODULES = 'node_modules'
21
20
 
22
21
  // Why a candidate is not going to be processed, or that it is. `not_selected` is the one state set
@@ -64,14 +63,7 @@ function has_checkout(repository_path: string): boolean {
64
63
  }
65
64
 
66
65
  function read_manifest(repository_path: string): Manifest | undefined {
67
- const manifest_path = path.join(repository_path, MANIFEST_NAME)
68
- if (!existsSync(manifest_path)) return undefined
69
-
70
- try {
71
- return json_value.parse_with(readFileSync(manifest_path, 'utf8'), manifest_schema)
72
- } catch {
73
- return undefined
74
- }
66
+ return package_manifest.read_manifest_if_valid(repository_path, manifest_schema)
75
67
  }
76
68
 
77
69
  // The range a manifest declares for `package_name`, from either dependency field. Undefined when the
@@ -95,7 +87,7 @@ function installed_version(repository_path: string, package_name: string): strin
95
87
  // the parent directory), which is an ordinary "not downstream" rather than damage.
96
88
  function classify_manifest_absence(repository_path: string): TargetState | undefined {
97
89
  if (!has_checkout(repository_path)) return 'missing_checkout'
98
- if (!existsSync(path.join(repository_path, MANIFEST_NAME))) return 'not_downstream'
90
+ if (!existsSync(package_manifest.manifest_path(repository_path))) return 'not_downstream'
99
91
 
100
92
  return undefined
101
93
  }
@@ -12,10 +12,12 @@ import { file_reader } from '#scripts/lib/read-file'
12
12
  const FROM_PATTERN = /\bfrom[ \t]*['"]([^'"\n]+)['"]/gu
13
13
  // A side-effect import carries no `from`: `import './register'`.
14
14
  const BARE_IMPORT_PATTERN = /^[ \t]*import[ \t]+['"]([^'"\n]+)['"]/gmu
15
- // The subpath import this package uses for cross-directory `scripts/` imports; `#scripts/x` resolves
16
- // to `scripts/x`. Relative specifiers resolve against the importer's directory.
17
- const SUBPATH_PREFIX = '#scripts/'
18
- const SCRIPTS_DIR = 'scripts'
15
+ // The subpath imports this package uses for cross-directory imports; `#scripts/x` resolves to
16
+ // `scripts/x` and `#tools/x` to `tools/x`. Relative specifiers resolve against the importer's directory.
17
+ const SUBPATH_DIRECTORIES: ReadonlyArray<readonly [string, string]> = [
18
+ ['#scripts/', 'scripts'],
19
+ ['#tools/', 'tools'],
20
+ ]
19
21
  const RELATIVE_PREFIX = '.'
20
22
  // A specifier omits its extension, so a resolved base is tried against the real files these suffixes
21
23
  // would produce — a sibling module or a directory's index, in the order a resolver would.
@@ -38,9 +40,9 @@ function parse_imports(source: string): ReadonlyArray<string> {
38
40
  // Where a local specifier points before extension resolution, or `undefined` for a package import
39
41
  // this graph does not follow.
40
42
  function specifier_base(spec: string, importer: string, root: string): string | undefined {
41
- if (spec.startsWith(SUBPATH_PREFIX)) {
42
- return path.resolve(root, SCRIPTS_DIR, spec.slice(SUBPATH_PREFIX.length))
43
- }
43
+ const subpath = SUBPATH_DIRECTORIES.find(([prefix]) => spec.startsWith(prefix))
44
+
45
+ if (subpath !== undefined) return path.resolve(root, subpath[1], spec.slice(subpath[0].length))
44
46
 
45
47
  if (spec.startsWith(RELATIVE_PREFIX)) return path.resolve(path.dirname(importer), spec)
46
48
 
@@ -96,20 +96,31 @@ async function is_release_lost(source: RunSource, tag: string): Promise<boolean>
96
96
  return run.status === 'completed' && (await is_release_over(source, tag))
97
97
  }
98
98
 
99
+ async function publish_run(
100
+ source: RunSource,
101
+ workflow: string,
102
+ tag: string,
103
+ ): Promise<Run | undefined> {
104
+ return await find_run(source, workflow, `Publish ${tag}`)
105
+ }
106
+
99
107
  // A run not listed yet is pending too: the announcement that starts this release also starts the
100
108
  // publication, so the release can ask before GitHub has queued that run.
109
+ function run_state(run: Run | undefined): PollState {
110
+ if (run?.status !== 'completed') return 'pending'
111
+
112
+ return run.conclusion === 'success' ? 'ready' : 'failed'
113
+ }
114
+
101
115
  async function publication_state(
102
116
  source: RunSource,
103
117
  workflow: string,
104
118
  tag: string,
105
119
  ): Promise<PollState> {
106
- const run = await find_run(source, workflow, `Publish ${tag}`)
107
- if (run?.status !== 'completed') return 'pending'
108
-
109
- return run.conclusion === 'success' ? 'ready' : 'failed'
120
+ return run_state(await publish_run(source, workflow, tag))
110
121
  }
111
122
 
112
- const github_release_runs = { is_release_lost, publication_state }
123
+ const github_release_runs = { is_release_lost, publication_state, publish_run, run_state }
113
124
 
114
- export type { PollState, RunSource }
125
+ export type { PollState, Run, RunSource }
115
126
  export { github_release_runs }
@@ -0,0 +1,18 @@
1
+ import { git_spawn } from '#scripts/git/git-spawn'
2
+
3
+ // **A release drops every `josh metrics` approval the default branch holds** (joshuafolkken/kit#4187).
4
+ // The release work tree is cut from `origin/<default>`, so every file it holds under the directory
5
+ // belongs to an issue that already merged. Such a file is read only to tell it apart from a branch's
6
+ // new one (`tools/metrics/metrics-ratchet.ts` → `fresh_approvals`): a branch's merge-base still holds
7
+ // it unchanged, and a branch that merges the release in loses it on both sides, so removing it changes
8
+ // no verdict. `--ignore-unmatch` makes a repository with no approvals a no-op.
9
+
10
+ const APPROVAL_DIRECTORY = '.josh/metrics-accepted'
11
+
12
+ async function prune(): Promise<void> {
13
+ await git_spawn.read(['rm', '-r', '-q', '--ignore-unmatch', '--', APPROVAL_DIRECTORY])
14
+ }
15
+
16
+ const release_approval_prune = { APPROVAL_DIRECTORY, prune }
17
+
18
+ export { release_approval_prune }
@@ -1,14 +1,12 @@
1
1
  import { git_command } from '#scripts/git/git-command'
2
2
  import { json_value } from '#scripts/lib/json-value'
3
+ import { PACKAGE_JSON } from '#scripts/lib/package-manifest'
3
4
  import { package_with_version_schema } from '#scripts/lib/schemas'
4
- import { version_targets } from '#scripts/version/version-targets'
5
5
  import { release_plan, type ReleasePlan, type VersionedCommit } from './release-plan'
6
6
 
7
7
  // Reading main's history for the two numbers a release is made of: where the version last changed,
8
8
  // and how many merges have landed since.
9
9
 
10
- const { PACKAGE_JSON } = version_targets
11
-
12
10
  // How far back the search for "the commit that last changed the version" goes, counted in commits
13
11
  // that touched `package.json`. Once children stop bumping that file still
14
12
  // changes for every dependency update, so the base can sit several entries down — but a repository