@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
@@ -1,5 +1,6 @@
1
1
  import { pr_raw_schema, type RollupItemData } from '#scripts/git/git-schemas'
2
2
  import { json_value } from '#scripts/lib/json-value'
3
+ import type { z } from 'zod'
3
4
 
4
5
  const CHECK_STATUS_PASS = 'pass'
5
6
  const CHECK_STATUS_PENDING = 'pending'
@@ -9,8 +10,8 @@ const CHECK_STATUS_MISSING = 'missing'
9
10
  // GitHub reports a job whose `if:` condition was false as COMPLETED with conclusion `skipped`, and
10
11
  // counts it as satisfied for branch protection — a pull request reaches CLEAN with such jobs in its
11
12
  // rollup. Recording them as `fail` would disagree with GitHub itself, and it would disable the
12
- // CodeRabbit non-blocking exemption: `is_unstable_only_from_coderabbit` opens the gate only when
13
- // every non-passing check is CodeRabbit's, so kit's own conditional jobs (`auto-merge`, `E2E`,
13
+ // CodeRabbit non-blocking exemption: `is_unstable_only_from_optional` opens the gate only when
14
+ // every non-passing check is CodeRabbit's or an optional one still running, so kit's own conditional jobs (`auto-merge`, `E2E`,
14
15
  // `Notify Auto Tag`) would keep a slow review blocking the merge until the wait loop timed out. That
15
16
  // is invisible on fast reviews, where CLEAN short-circuits the predicate — it surfaces only on the
16
17
  // exact path the exemption exists to protect.
@@ -45,6 +46,12 @@ interface PrStateSnapshot {
45
46
  rollup: Array<RollupCheck>
46
47
  merge_state_status: string | undefined
47
48
  review_decision: string | undefined
49
+ // The commit `rollup` was read from — the head a merge has to name so that it lands what passed and
50
+ // nothing pushed since (#4036). Absent where the snapshot carried none.
51
+ head_sha?: string
52
+ // The base branch's required status check contexts (joshuafolkken/kit#4351). Absent where the
53
+ // branch requires none or they could not be read, which keeps the merge gate waiting for `CLEAN`.
54
+ required_contexts?: Array<string>
48
55
  }
49
56
 
50
57
  function read_string(value: unknown): string | undefined {
@@ -118,16 +125,39 @@ function parse_rollup_checks(raw_json: string): Array<RollupCheck> {
118
125
  return checks
119
126
  }
120
127
 
121
- function parse_pr_state_snapshot(raw_json: string): PrStateSnapshot {
122
- const parsed = json_value.parse_or_undefined(raw_json)
123
- const result = pr_raw_schema.safeParse(parsed)
124
- const data = result.success ? result.data : undefined
128
+ function with_head_sha(snapshot: PrStateSnapshot, head_sha: string | undefined): PrStateSnapshot {
129
+ return head_sha === undefined ? snapshot : { ...snapshot, head_sha }
130
+ }
131
+
132
+ function with_required_contexts(
133
+ snapshot: PrStateSnapshot,
134
+ required_contexts: Array<string> | undefined,
135
+ ): PrStateSnapshot {
136
+ if (required_contexts === undefined || required_contexts.length === 0) return snapshot
137
+
138
+ return { ...snapshot, required_contexts }
139
+ }
125
140
 
126
- return {
141
+ type PrRawData = Partial<z.infer<typeof pr_raw_schema>>
142
+
143
+ function read_pr_raw_data(raw_json: string): PrRawData {
144
+ const result = pr_raw_schema.safeParse(json_value.parse_or_undefined(raw_json))
145
+
146
+ return result.success ? result.data : {}
147
+ }
148
+
149
+ function parse_pr_state_snapshot(raw_json: string): PrStateSnapshot {
150
+ const data = read_pr_raw_data(raw_json)
151
+ const snapshot = {
127
152
  rollup: parse_rollup_checks(raw_json),
128
- merge_state_status: read_string(data?.mergeStateStatus),
129
- review_decision: read_string(data?.reviewDecision),
153
+ merge_state_status: read_string(data.mergeStateStatus),
154
+ review_decision: read_string(data.reviewDecision),
130
155
  }
156
+
157
+ return with_required_contexts(
158
+ with_head_sha(snapshot, read_string(data.headRefOid)),
159
+ data.requiredContexts,
160
+ )
131
161
  }
132
162
 
133
163
  export {
@@ -0,0 +1,80 @@
1
+ import { git_gh_command } from './git-gh-command'
2
+ import { git_pr_checks, type PrStateSnapshot } from './git-pr-checks'
3
+
4
+ // **A merge lands the head the merge gate passed, and nothing pushed after it** (#4036).
5
+ //
6
+ // The gate reads the checks of one commit, and the merge request names that commit as its `sha`. A
7
+ // push between the two moves the head, GitHub answers 409, and the wait starts over on the new head
8
+ // — so the push is merged once its own checks pass, with nobody having to re-run anything. The
9
+ // retries are bounded: a branch that keeps moving under every wait is not one to merge unattended.
10
+
11
+ const MAX_HEAD_MOVES = 3
12
+ const NO_CHECKED_HEAD_MESSAGE =
13
+ 'The merge gate answered without the head commit it checked, so there is no commit to bind the merge to'
14
+ const HEAD_MOVED_NOTE =
15
+ 'The pull request head moved after its checks passed — waiting on the new head'
16
+ const HEAD_KEPT_MOVING_MESSAGE = `The pull request head moved after its checks passed ${String(MAX_HEAD_MOVES)} times, so it was not merged`
17
+
18
+ type WaitForGreen = () => Promise<PrStateSnapshot>
19
+
20
+ interface CheckedMerge {
21
+ branch_name: string
22
+ // The wait to go back to when the head moved — the caller's own, so a re-wait watches what the
23
+ // first wait watched.
24
+ wait_for_green: WaitForGreen
25
+ // The snapshot the gate already passed. Absent, the merge waits for one first.
26
+ checked?: PrStateSnapshot | undefined
27
+ }
28
+
29
+ function checked_head(snapshot: PrStateSnapshot): string {
30
+ if (snapshot.head_sha === undefined) throw new Error(NO_CHECKED_HEAD_MESSAGE)
31
+
32
+ return snapshot.head_sha
33
+ }
34
+
35
+ // `false` is "the head moved"; every other failure is the caller's to see.
36
+ async function try_merge(branch_name: string, snapshot: PrStateSnapshot): Promise<boolean> {
37
+ const head_sha = checked_head(snapshot)
38
+
39
+ try {
40
+ await git_gh_command.pr_merge(branch_name, head_sha)
41
+
42
+ return true
43
+ } catch (error) {
44
+ if (!git_gh_command.is_head_moved(error)) throw error
45
+
46
+ return false
47
+ }
48
+ }
49
+
50
+ async function merge_checked(input: CheckedMerge): Promise<void> {
51
+ let snapshot = input.checked ?? (await input.wait_for_green())
52
+
53
+ for (let move = 0; move < MAX_HEAD_MOVES; move += 1) {
54
+ // eslint-disable-next-line no-await-in-loop -- each merge names the head the wait before it passed
55
+ if (await try_merge(input.branch_name, snapshot)) return
56
+
57
+ console.info(HEAD_MOVED_NOTE)
58
+ // eslint-disable-next-line no-await-in-loop -- the new head has to pass before it is merged
59
+ snapshot = await input.wait_for_green()
60
+ }
61
+
62
+ throw new Error(HEAD_KEPT_MOVING_MESSAGE)
63
+ }
64
+
65
+ // The merge gate's default wait, then the bound merge.
66
+ async function merge_when_green(branch_name: string): Promise<void> {
67
+ async function wait_for_green(): Promise<PrStateSnapshot> {
68
+ return await git_pr_checks.wait_for_pr_success(branch_name)
69
+ }
70
+
71
+ await merge_checked({ branch_name, wait_for_green })
72
+ }
73
+
74
+ const git_pr_merge_checked = {
75
+ merge_checked,
76
+ merge_when_green,
77
+ }
78
+
79
+ export type { CheckedMerge, WaitForGreen }
80
+ export { git_pr_merge_checked, HEAD_KEPT_MOVING_MESSAGE, MAX_HEAD_MOVES, NO_CHECKED_HEAD_MESSAGE }
@@ -1,4 +1,4 @@
1
- import { mkdtemp, rm, symlink } from 'node:fs/promises'
1
+ import { copyFile, mkdir, mkdtemp, rm, symlink } from 'node:fs/promises'
2
2
  import { tmpdir } from 'node:os'
3
3
  import path from 'node:path'
4
4
  import { git_worktree } from './git-worktree'
@@ -60,7 +60,24 @@ async function with_tree<T>(
60
60
  }
61
61
  }
62
62
 
63
- const base_tree = { NODE_MODULES, with_tree }
63
+ async function copy_one(tree: string, file: string): Promise<void> {
64
+ const target = path.join(tree, file)
65
+
66
+ await mkdir(path.dirname(target), { recursive: true })
67
+ await copyFile(file, target)
68
+ }
69
+
70
+ // The caller's working-tree files into the tree at the same relative paths. Each file has its own
71
+ // target, and a recursive `mkdir` tolerates a sibling creating the same parent.
72
+ async function copy_in(tree: string, files: ReadonlyArray<string>): Promise<void> {
73
+ await Promise.all(
74
+ files.map(async (file) => {
75
+ await copy_one(tree, file)
76
+ }),
77
+ )
78
+ }
79
+
80
+ const base_tree = { NODE_MODULES, copy_in, with_tree }
64
81
 
65
82
  export type { BaseTree }
66
83
  export { base_tree }
@@ -11,9 +11,10 @@ import { git_command } from './git-command'
11
11
  // nothing, and listing what was narrowed by — is identical, so it lives here once rather than in
12
12
  // each command.
13
13
  //
14
- // **A narrowed run is added in front of the whole check, never in place of it.** Both fallbacks
15
- // therefore end at the whole check, and each says which of the two it was: the one thing this must
16
- // never do is answer "nothing to run" quietly.
14
+ // The narrowed unit run replaces the whole suite in the gate (joshuafolkken/kit#4065), and the
15
+ // narrowed lint the whole-tree lint (joshuafolkken/kit#4085), each with CI's whole run behind it.
16
+ // Either way both fallbacks end at the whole check, and each says which of the two it was: the
17
+ // one thing this must never do is answer "nothing to run" quietly.
17
18
 
18
19
  type ScopeMode = 'all' | 'related'
19
20
 
@@ -176,7 +177,7 @@ async function resolve_command_scope(request: ScopeRequest): Promise<ChangedFile
176
177
  // describing a set the caller never handed over.
177
178
  function report_unusable_arguments(
178
179
  command_arguments: ReadonlyArray<string>,
179
- scope: ChangedFileScope,
180
+ scope: Pick<ChangedFileScope, 'files'>,
180
181
  label: string,
181
182
  ): void {
182
183
  const narrowed = new Set(scope.files)
@@ -195,6 +196,7 @@ const changed_file_scope = {
195
196
  UNREADABLE_REASON,
196
197
  describe_scope,
197
198
  flags_of,
199
+ format_file_list,
198
200
  is_flag,
199
201
  read_changed_files,
200
202
  report_unusable_arguments,
@@ -24,6 +24,23 @@ async function read_changed_paths(is_staged: boolean): Promise<Array<string>> {
24
24
  return [...tracked, ...untracked]
25
25
  }
26
26
 
27
- const changed_paths = { read_changed_paths, to_paths }
27
+ // The same reading against any commit rather than the change base — the change since the tree a
28
+ // test-read map was recorded on.
29
+ async function read_changed_since(commit: string): Promise<Array<string>> {
30
+ const tracked = to_paths(await git_command.diff_names_since(commit))
31
+ const untracked = to_paths(await git_command.untracked_names())
32
+
33
+ return [...new Set([...tracked, ...untracked])]
34
+ }
35
+
36
+ // The paths among `paths` the tree of `commit` held. An empty list asks git nothing, since
37
+ // `ls-tree` with no path lists the whole tree.
38
+ async function read_held_at(commit: string, paths: ReadonlyArray<string>): Promise<Array<string>> {
39
+ if (paths.length === 0) return []
40
+
41
+ return to_paths(await git_command.tree_names_at(commit, paths))
42
+ }
43
+
44
+ const changed_paths = { read_changed_paths, read_changed_since, read_held_at, to_paths }
28
45
 
29
46
  export { changed_paths }
@@ -151,18 +151,41 @@ async function change_base_commit(): Promise<string> {
151
151
  return await git_spawn.read(['rev-parse', await change_base()])
152
152
  }
153
153
 
154
- async function diff_main_names(): Promise<string> {
154
+ // The working tree against any commit, with the same flags as the branch diff. `josh test:related`
155
+ // reads the change since the commit its test-read map was recorded on, which is not the merge base.
156
+ async function diff_names_since(commit: string): Promise<string> {
155
157
  return await git_spawn.read([
156
158
  ...NO_PATH_QUOTING,
157
159
  'diff',
158
160
  NAME_ONLY_FLAG,
159
161
  NO_RELATIVE_PATHS,
160
162
  NO_RENAME_DETECTION,
161
- await change_base(),
163
+ commit,
164
+ '--',
165
+ ])
166
+ }
167
+
168
+ // Which of `paths` a commit's tree holds. `josh test:related` asks it of the tree its test-read map
169
+ // was recorded on: a file that tree held and no test read is one no test reads, while a file added
170
+ // since is one the map knows nothing about. **Callers pass at least one path** — with none, `ls-tree`
171
+ // lists the whole tree.
172
+ async function tree_names_at(commit: string, paths: ReadonlyArray<string>): Promise<string> {
173
+ return await git_spawn.read([
174
+ ...NO_PATH_QUOTING,
175
+ 'ls-tree',
176
+ '-r',
177
+ NAME_ONLY_FLAG,
178
+ '--full-tree',
179
+ commit,
162
180
  '--',
181
+ ...paths,
163
182
  ])
164
183
  }
165
184
 
185
+ async function diff_main_names(): Promise<string> {
186
+ return await diff_names_since(await change_base())
187
+ }
188
+
166
189
  async function diff_cached_names(): Promise<string> {
167
190
  return await git_spawn.read([
168
191
  ...NO_PATH_QUOTING,
@@ -224,7 +247,9 @@ const git_diff_reads = {
224
247
  diff_main,
225
248
  diff_main_names,
226
249
  diff_main_numstat,
250
+ diff_names_since,
227
251
  get_default_branch,
252
+ tree_names_at,
228
253
  untracked_names,
229
254
  }
230
255
 
@@ -0,0 +1,85 @@
1
+ import { get_exit_code } from '#scripts/git/git-execa-error'
2
+ import { git_spawn } from '#scripts/git/git-spawn'
3
+
4
+ // One fixed-string `git grep -n` over a pathspec, read back as `file:line` hits with a short excerpt.
5
+ // `run:prep`'s code locations and `plan:consumers` both search a name this way, so the parse and the
6
+ // no-match-versus-failure reading live here rather than in each.
7
+
8
+ const GREP_LINE = /^(?<path>[^:]+):(?<line>\d+):(?<text>.*)$/u
9
+ const MAX_EXCERPT_LENGTH = 80
10
+ const ELLIPSIS = '…'
11
+ // `git grep` exits 1 for no match; any other exit is a search that never ran.
12
+ const GREP_NO_MATCH_EXIT = 1
13
+
14
+ interface Hit {
15
+ path: string
16
+ line: string
17
+ excerpt: string
18
+ }
19
+
20
+ interface GrepResult {
21
+ hits: ReadonlyArray<Hit>
22
+ has_failed: boolean
23
+ }
24
+
25
+ function shorten(text: string): string {
26
+ const trimmed = text.trim()
27
+
28
+ if (trimmed.length <= MAX_EXCERPT_LENGTH) return trimmed
29
+
30
+ return `${trimmed.slice(0, MAX_EXCERPT_LENGTH)}${ELLIPSIS}`
31
+ }
32
+
33
+ // `git grep -n` prints `path:line:text`; the text may itself hold colons, so only the first two split.
34
+ function to_hit(output_line: string): Hit | undefined {
35
+ const groups = GREP_LINE.exec(output_line)?.groups
36
+
37
+ if (groups === undefined) return undefined
38
+
39
+ // All three groups are non-optional in `GREP_LINE`, so a match always carries each of them.
40
+ const { path, line, text } = groups as Record<'line' | 'path' | 'text', string>
41
+
42
+ return { path, line, excerpt: shorten(text) }
43
+ }
44
+
45
+ function parse(stdout: string): Array<Hit> {
46
+ const hits = stdout.split('\n').map((line) => to_hit(line))
47
+
48
+ return hits.filter((hit): hit is Hit => hit !== undefined)
49
+ }
50
+
51
+ // `git grep` exits 1 when nothing matches, which `git_spawn.read` raises. Only that is "no match": a
52
+ // git without `grep -m` (older than 2.38) exits 129, and naming every target absent then would send
53
+ // the reader away from code that is there. `root` searches that checkout rather than the working
54
+ // directory's.
55
+ async function search(
56
+ target: string,
57
+ flags: ReadonlyArray<string>,
58
+ pathspecs: ReadonlyArray<string>,
59
+ root?: string,
60
+ ): Promise<GrepResult> {
61
+ const location = root === undefined ? [] : ['-C', root]
62
+ const grep_arguments = [
63
+ ...location,
64
+ 'grep',
65
+ '-n',
66
+ '-I',
67
+ '-F',
68
+ ...flags,
69
+ '-e',
70
+ target,
71
+ '--',
72
+ ...pathspecs,
73
+ ]
74
+
75
+ try {
76
+ return { hits: parse(await git_spawn.read(grep_arguments)), has_failed: false }
77
+ } catch (error) {
78
+ return { hits: [], has_failed: get_exit_code(error) !== GREP_NO_MATCH_EXIT }
79
+ }
80
+ }
81
+
82
+ const git_grep_hits = { parse, search }
83
+
84
+ export type { GrepResult, Hit }
85
+ export { git_grep_hits }
@@ -9,7 +9,7 @@
9
9
  //
10
10
  // The list is single-sourced here because it has three consumers that must not drift apart: the
11
11
  // probes that clear it, the fixture that clears it, and the unit-suite guard that refuses a write
12
- // while any of it is set (`scripts/test/test-repository-guard.ts`).
12
+ // while any of it is set (`tools/test/test-repository-guard.ts`).
13
13
  //
14
14
  // **Only the variables that redirect where git writes are listed.** `GIT_PREFIX`, `GIT_EDITOR` and
15
15
  // the `GIT_CONFIG_*` family are exported to hooks too and are deliberately absent: clearing them
@@ -0,0 +1,83 @@
1
+ import { existsSync } from 'node:fs'
2
+ import path from 'node:path'
3
+ import { git_spawn_sync } from './git-spawn-sync'
4
+
5
+ // The paths merging another branch into this working tree would stop on, read without touching any
6
+ // index or ref (joshuafolkken/kit#4348). **The working tree, not `HEAD`, is ours**: `josh ship` asks
7
+ // before its commit, so the change it is about to ship is still uncommitted. Each path is merged on
8
+ // its own, as `merge-tree` would merge its content: a side left as the merge base had it, or both
9
+ // sides alike, merges cleanly; a side that deleted or added what the other changed differently
10
+ // conflicts; otherwise `git merge-file` decides. Only blob ids are compared, so no content is read.
11
+
12
+ const CLEAN_EXIT_CODE = 0
13
+ const HEAD = 'HEAD'
14
+
15
+ interface Sides {
16
+ base: string | undefined
17
+ ours: string | undefined
18
+ theirs: string | undefined
19
+ }
20
+
21
+ interface Commits {
22
+ base: string
23
+ theirs: string
24
+ }
25
+
26
+ function blob_id(revision: string, file_path: string, cwd: string): string | undefined {
27
+ return git_spawn_sync.read(['rev-parse', '--verify', '--quiet', `${revision}:${file_path}`], {
28
+ cwd,
29
+ })
30
+ }
31
+
32
+ // Written to the object store so `merge-file --object-id` can read it; no index or ref moves.
33
+ function working_blob_id(file_path: string, cwd: string): string | undefined {
34
+ if (!existsSync(path.join(cwd, file_path))) return undefined
35
+
36
+ return git_spawn_sync.read(['hash-object', '-w', '--', file_path], { cwd })
37
+ }
38
+
39
+ function is_one_sided(sides: Sides): boolean {
40
+ return sides.ours === sides.theirs || sides.ours === sides.base || sides.theirs === sides.base
41
+ }
42
+
43
+ function is_complete(sides: Sides): sides is Record<keyof Sides, string> {
44
+ return sides.base !== undefined && sides.ours !== undefined && sides.theirs !== undefined
45
+ }
46
+
47
+ function is_merged(sides: Sides, cwd: string): boolean {
48
+ if (is_one_sided(sides)) return true
49
+ if (!is_complete(sides)) return false
50
+
51
+ const { base, ours, theirs } = sides
52
+ const result = git_spawn_sync.run(['merge-file', '-p', '--object-id', ours, base, theirs], {
53
+ cwd,
54
+ })
55
+
56
+ return result.exit_code === CLEAN_EXIT_CODE
57
+ }
58
+
59
+ function sides_of(file_path: string, commits: Commits, cwd: string): Sides {
60
+ return {
61
+ base: blob_id(commits.base, file_path, cwd),
62
+ ours: working_blob_id(file_path, cwd),
63
+ theirs: blob_id(commits.theirs, file_path, cwd),
64
+ }
65
+ }
66
+
67
+ // Of `paths` (relative to `cwd`, the working tree's root), the ones merging `theirs` would stop on;
68
+ // `undefined` where the merge base with `theirs` could not be read.
69
+ function working_tree_conflicts(
70
+ theirs: string,
71
+ paths: ReadonlyArray<string>,
72
+ cwd: string,
73
+ ): ReadonlyArray<string> | undefined {
74
+ const base = git_spawn_sync.read(['merge-base', HEAD, theirs], { cwd })
75
+
76
+ if (base === undefined) return undefined
77
+
78
+ return paths.filter((file_path) => !is_merged(sides_of(file_path, { base, theirs }, cwd), cwd))
79
+ }
80
+
81
+ const git_merge_conflicts = { working_tree_conflicts }
82
+
83
+ export { git_merge_conflicts }
@@ -13,6 +13,19 @@ import { git_issue, type IssueInfo } from './git-issue'
13
13
  // anything changes, and all of them are reported at once.** No rule is new: each
14
14
  // answer comes from the function the later stage refuses with, so the two cannot drift apart.
15
15
 
16
+ // Which precondition a problem leaves unmet, so a stopped `josh ship` records the kind beside the text
17
+ // (joshuafolkken/kit#4166).
18
+ const PRECONDITION = {
19
+ ISSUE: 'issue',
20
+ BRANCH: 'branch',
21
+ CLASSIFICATION: 'classification',
22
+ } as const
23
+
24
+ interface Unmet {
25
+ kind: string
26
+ problem: string
27
+ }
28
+
16
29
  interface PreflightInput {
17
30
  cli_input: string | undefined
18
31
  will_open_pr: boolean
@@ -26,14 +39,20 @@ interface Target {
26
39
 
27
40
  interface Resolution {
28
41
  target: Target | undefined
29
- problems: Array<string>
42
+ problems: Array<Unmet>
43
+ }
44
+
45
+ function unmet(kind: string, problem: string): Unmet {
46
+ return { kind, problem }
30
47
  }
31
48
 
32
49
  function resolve_from_branch(current_branch: string): Resolution {
33
50
  const number = git_issue.branch_number(current_branch)
34
51
 
35
52
  if (number === undefined) {
36
- return { target: undefined, problems: [git_issue.branch_derivation_error(current_branch)] }
53
+ const problem = unmet(PRECONDITION.ISSUE, git_issue.branch_derivation_error(current_branch))
54
+
55
+ return { target: undefined, problems: [problem] }
37
56
  }
38
57
 
39
58
  return { target: { number, branch_name: current_branch }, problems: [] }
@@ -55,7 +74,10 @@ function resolve_parsed(
55
74
  return {
56
75
  target,
57
76
  problems: [
58
- `Branch mismatch: on "${current_branch}", but the title resolves to "${parsed.branch_name}".`,
77
+ unmet(
78
+ PRECONDITION.BRANCH,
79
+ `Branch mismatch: on "${current_branch}", but the title resolves to "${parsed.branch_name}".`,
80
+ ),
59
81
  ],
60
82
  }
61
83
  }
@@ -68,7 +90,10 @@ function resolve_from_title(
68
90
  try {
69
91
  return resolve_parsed(git_issue.parse(cli_input), current_branch, default_branch)
70
92
  } catch (error) {
71
- return { target: undefined, problems: [error_text.message_of(error)] }
93
+ return {
94
+ target: undefined,
95
+ problems: [unmet(PRECONDITION.ISSUE, error_text.message_of(error))],
96
+ }
72
97
  }
73
98
  }
74
99
 
@@ -80,13 +105,13 @@ async function resolve_target(cli_input: string | undefined): Promise<Resolution
80
105
  return resolve_from_title(cli_input, current_branch, await git_command.get_default_branch())
81
106
  }
82
107
 
83
- async function classification_problems(target: Target): Promise<Array<string>> {
108
+ async function classification_problems(target: Target): Promise<Array<Unmet>> {
84
109
  try {
85
110
  await git_pr.release_classification(target.number, target.branch_name)
86
111
 
87
112
  return []
88
113
  } catch (error) {
89
- return [error_text.message_of(error)]
114
+ return [unmet(PRECONDITION.CLASSIFICATION, error_text.message_of(error))]
90
115
  }
91
116
  }
92
117
 
@@ -106,8 +131,8 @@ async function announce_evidence(branch_name: string): Promise<void> {
106
131
  )
107
132
  }
108
133
 
109
- function refusal(problems: ReadonlyArray<string>): Error {
110
- const lines = problems.map((problem) => ` - ${problem}`)
134
+ function refusal(problems: ReadonlyArray<Unmet>): Error {
135
+ const lines = problems.map(({ problem }) => ` - ${problem}`)
111
136
 
112
137
  return new Error(
113
138
  [
@@ -119,7 +144,7 @@ function refusal(problems: ReadonlyArray<string>): Error {
119
144
 
120
145
  interface PreflightAnswer {
121
146
  pr_target: Target | undefined
122
- problems: Array<string>
147
+ problems: Array<Unmet>
123
148
  }
124
149
 
125
150
  async function answer(input: PreflightInput): Promise<PreflightAnswer> {
@@ -131,9 +156,9 @@ async function answer(input: PreflightInput): Promise<PreflightAnswer> {
131
156
  return { pr_target, problems: [...problems, ...pr_problems] }
132
157
  }
133
158
 
134
- // The unmet preconditions as a list, so `josh ship` can ask them before its
159
+ // The unmet preconditions as a list, each with its kind, so `josh ship` can ask them before its
135
160
  // review and gate start instead of meeting the refusal at the commit stage.
136
- async function problems_of(input: PreflightInput): Promise<Array<string>> {
161
+ async function problems_of(input: PreflightInput): Promise<Array<Unmet>> {
137
162
  const { problems } = await answer(input)
138
163
 
139
164
  return problems
@@ -149,5 +174,5 @@ async function check(input: PreflightInput): Promise<void> {
149
174
 
150
175
  const git_preflight = { check, problems_of }
151
176
 
152
- export type { PreflightInput }
177
+ export type { PreflightInput, Unmet }
153
178
  export { git_preflight }
@@ -1,3 +1,4 @@
1
+ import { MS_PER_SECOND } from '#scripts/lib/timeouts'
1
2
  import { execa } from 'execa'
2
3
  import { git_utilities } from './constants'
3
4
  import {
@@ -8,8 +9,6 @@ import {
8
9
  } from './git-execa-error'
9
10
  import { git_ssh_keepalive } from './git-ssh-keepalive'
10
11
 
11
- const MS_PER_SECOND = 1000
12
-
13
12
  // The budget for one `git push`, and the reason a push can no longer wait without end.
14
13
  // Measured on PR #1244: the commit itself took 0.6 seconds and the push
15
14
  // then sat silent for 8 minutes 13 seconds before it was found by hand and killed — about 9 minutes
@@ -2,21 +2,28 @@ import { z } from 'zod'
2
2
 
3
3
  const package_name_schema = z.object({ name: z.string().min(1) })
4
4
 
5
+ // REST answers `null` for a field it has no value for yet — a running check run's `conclusion` above
6
+ // all — and one rejected element fails the whole snapshot, which then reads as an empty rollup until
7
+ // the last check completes (joshuafolkken/kit#4351). Every string field is `nullish` for that reason.
5
8
  const rollup_item_schema = z.looseObject({
6
9
  // eslint-disable-next-line @typescript-eslint/naming-convention -- GraphQL field name from GitHub API
7
- __typename: z.string().optional(),
8
- state: z.string().optional(),
9
- status: z.string().optional(),
10
- conclusion: z.string().optional(),
11
- name: z.string().optional(),
12
- context: z.string().optional(),
10
+ __typename: z.string().nullish(),
11
+ state: z.string().nullish(),
12
+ status: z.string().nullish(),
13
+ conclusion: z.string().nullish(),
14
+ name: z.string().nullish(),
15
+ context: z.string().nullish(),
13
16
  description: z.string().nullish(),
14
17
  })
15
18
 
16
19
  const pr_raw_schema = z.object({
17
20
  statusCheckRollup: z.array(rollup_item_schema).optional(),
21
+ // The base branch's required status check contexts, read from its rules — empty where none are
22
+ // set or they could not be read (`git-gh-branch-rules.ts`).
23
+ requiredContexts: z.array(z.string()).optional(),
18
24
  mergeStateStatus: z.string().optional(),
19
25
  reviewDecision: z.string().optional(),
26
+ headRefOid: z.string().optional(),
20
27
  })
21
28
 
22
29
  const pull_comment_schema = z.object({
@@ -40,6 +47,8 @@ const pr_info_schema = z.object({
40
47
  const epic_issue_schema = z.object({
41
48
  number: z.number(),
42
49
  body: z.string().optional(),
50
+ // REST answers null for an issue never closed and `reopened` for one a person reopened.
51
+ stateReason: z.string().nullish(),
43
52
  })
44
53
 
45
54
  // One blocker as `gh` reports it inside the `blockedBy` connection. `state` comes back with the
@@ -140,6 +149,7 @@ const open_issue_schema = z.object({
140
149
 
141
150
  type RollupItemData = z.infer<typeof rollup_item_schema>
142
151
  type EpicChildData = z.infer<typeof epic_child_schema>
152
+ type EpicIssueData = z.infer<typeof epic_issue_schema>
143
153
  type OpenIssueData = z.infer<typeof open_issue_schema>
144
154
  type RestCommentData = z.infer<typeof rest_comment_schema>
145
155
 
@@ -159,4 +169,4 @@ export {
159
169
  blocking_issue_schema,
160
170
  blocked_by_schema,
161
171
  }
162
- export type { RollupItemData, EpicChildData, OpenIssueData, RestCommentData }
172
+ export type { RollupItemData, EpicChildData, EpicIssueData, OpenIssueData, RestCommentData }