@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
@@ -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 }
@@ -1,4 +1,4 @@
1
- import { GIT_TIMEOUT_MS } from '#scripts/lib/timeouts'
1
+ import { GIT_TIMEOUT_MS, MS_PER_SECOND } from '#scripts/lib/timeouts'
2
2
  import { execa } from 'execa'
3
3
  import { git_utilities } from './constants'
4
4
  import {
@@ -47,7 +47,6 @@ async function read(
47
47
  // still takes this one. The push's budget is reused rather than a second number chosen: both transfer
48
48
  // objects over the same transport, and that one is already read off what a healthy transfer costs here.
49
49
  const REMOTE_TIMEOUT_MS = PUSH_TIMEOUT_MS
50
- const MS_PER_SECOND = 1000
51
50
 
52
51
  // A budget kill is reported as a timeout, never as whatever the killed process printed first, and
53
52
  // `cause` carries the same `TIMEOUT_EXIT_CODE` a timed-out push does. Unlike the push it is not
@@ -1,9 +1,9 @@
1
1
  import { animation_helpers, type AnimationOptions } from '#scripts/lib/animation-helpers'
2
+ import { PACKAGE_JSON } from '#scripts/lib/package-manifest'
2
3
  import { REQUIRED_STATUS_LENGTH, STAGED_STATUS_INDEX, UNTRACKED_FILE_PREFIX } from './constants'
3
4
  import { git_command } from './git-command'
4
5
 
5
6
  const WARNING_ICON = '🔔'
6
- const PACKAGE_JSON_FILE = 'package.json'
7
7
  const STATUS_PREFIX_LENGTH = 2
8
8
  const VERSION_NOT_UPDATED = 'Not updated'
9
9
 
@@ -62,7 +62,7 @@ function is_package_json_staged(status_output: string): boolean {
62
62
 
63
63
  const filename = extract_filename(line)
64
64
 
65
- return filename === PACKAGE_JSON_FILE
65
+ return filename === PACKAGE_JSON
66
66
  })
67
67
  }
68
68
 
@@ -148,7 +148,7 @@ async function check_package_json_version(): Promise<boolean> {
148
148
  return await animation_helpers.execute_with_animation(
149
149
  'Checking if package.json version is updated...',
150
150
  async () => {
151
- const diff_output: string = await git_command.diff_cached(PACKAGE_JSON_FILE)
151
+ const diff_output: string = await git_command.diff_cached(PACKAGE_JSON)
152
152
 
153
153
  return is_version_updated_in_diff(diff_output)
154
154
  },
@@ -166,7 +166,7 @@ async function check_branch_version(): Promise<boolean> {
166
166
  return await animation_helpers.execute_with_animation(
167
167
  'Checking if version is already updated on this branch...',
168
168
  async () => {
169
- const diff_output: string = await git_command.diff_main(PACKAGE_JSON_FILE)
169
+ const diff_output: string = await git_command.diff_main(PACKAGE_JSON)
170
170
 
171
171
  return is_version_updated_in_diff(diff_output)
172
172
  },
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env tsx
2
+ import { fileURLToPath } from 'node:url'
3
+ import { main_merge } from './main-merge'
4
+
5
+ // The `josh main:merge` entry, kept apart from `main-merge.ts` because `run-ship-sync.ts` imports
6
+ // that one: a bundle is one file, so a main guard there would fire for every command that carries it
7
+ // (joshuafolkken/kit#4186).
8
+ if (process.argv[1] === fileURLToPath(import.meta.url)) {
9
+ const ARGV_OFFSET = 2
10
+
11
+ process.exitCode = await main_merge.run(process.argv.slice(ARGV_OFFSET))
12
+ }
@@ -0,0 +1,78 @@
1
+ import { SUITE_TIMEOUT_MS } from '#scripts/lib/timeouts'
2
+ import { execa } from 'execa'
3
+ import { git_command } from './git-command'
4
+ import { git_spawn } from './git-spawn'
5
+
6
+ // A merge of the default branch that stops only on generated files is finished here rather than by a
7
+ // resumed session: each such file is the output of a command, so running that command on the merged
8
+ // tree writes the one correct resolution, with no conflict marker for anyone to read.
9
+ //
10
+ // **This table is the single list of what is resolved that way** — a file a person writes never
11
+ // belongs in it, because regenerating would discard that person's side of the merge. A conflict on any
12
+ // path not listed here still stops as `conflict`. A file belongs here only once its committed content
13
+ // is exactly what its command writes: `tools/test/pure-files.ts` is not, so regenerating it would
14
+ // rewrite far more than the conflict.
15
+
16
+ interface RegeneratedFile {
17
+ path: string
18
+ command: ReadonlyArray<string>
19
+ }
20
+
21
+ const REGENERATED_FILES: ReadonlyArray<RegeneratedFile> = [
22
+ {
23
+ path: 'docs/josh-command-catalog.md',
24
+ command: ['pnpm', 'exec', 'tsx', 'tools/document/generate-catalog.ts'],
25
+ },
26
+ ]
27
+
28
+ function regenerated_for(
29
+ files: ReadonlyArray<string>,
30
+ table: ReadonlyArray<RegeneratedFile>,
31
+ ): ReadonlyArray<RegeneratedFile> {
32
+ const entries = files.map((file) => table.find((entry) => entry.path === file))
33
+
34
+ return entries.every((entry) => entry !== undefined) ? entries : []
35
+ }
36
+
37
+ // Each generator writes only its own file, so they run side by side.
38
+ async function regenerate(entries: ReadonlyArray<RegeneratedFile>, cwd: string): Promise<void> {
39
+ await Promise.all(
40
+ entries.map(async (entry) => {
41
+ const [binary = '', ...command_arguments] = entry.command
42
+
43
+ await execa(binary, command_arguments, { cwd })
44
+ }),
45
+ )
46
+ }
47
+
48
+ // `--no-edit` keeps the message the merge was started with — the one carrying the issue number the
49
+ // `commit-msg` hook asks for.
50
+ async function conclude_merge(entries: ReadonlyArray<RegeneratedFile>): Promise<void> {
51
+ await git_spawn.with_output('add', ['--', ...entries.map((entry) => entry.path)])
52
+ await git_spawn.with_output('commit', ['--no-edit'], { timeout_ms: SUITE_TIMEOUT_MS })
53
+ }
54
+
55
+ // Whether the merge that stopped on `files` was finished. A command that fails leaves the merge in
56
+ // progress and answers `false`, so the stop is the `conflict` it would have been without this table.
57
+ async function resolve(
58
+ files: ReadonlyArray<string>,
59
+ table: ReadonlyArray<RegeneratedFile> = REGENERATED_FILES,
60
+ ): Promise<boolean> {
61
+ const entries = regenerated_for(files, table)
62
+
63
+ if (entries.length === 0) return false
64
+
65
+ try {
66
+ await regenerate(entries, await git_command.repository_root())
67
+ await conclude_merge(entries)
68
+ } catch {
69
+ return false
70
+ }
71
+
72
+ return true
73
+ }
74
+
75
+ const main_merge_regenerate = { REGENERATED_FILES, resolve }
76
+
77
+ export type { RegeneratedFile }
78
+ export { main_merge_regenerate }
@@ -1,11 +1,12 @@
1
- #!/usr/bin/env tsx
2
- import { fileURLToPath } from 'node:url'
3
1
  import { extract_issue_number } from '#scripts/hooks/check-commit-message'
4
2
  import { issue_cite } from '#scripts/issue/issue-cite'
5
3
  import { composite_arguments, USAGE_ERROR_EXIT_CODE } from '#scripts/josh/josh-composite-arguments'
6
4
  import { error_text } from '#scripts/lib/error-message'
5
+ import { split_assess } from '#scripts/split/split-assess'
6
+ import { split_measure } from '#scripts/split/split-measure'
7
7
  import { git_command } from './git-command'
8
8
  import { main_merge_guard } from './main-merge-guard'
9
+ import { main_merge_regenerate } from './main-merge-regenerate'
9
10
 
10
11
  // `josh main:merge` (`josh mm`) — bring the default branch into the branch this checkout is on.
11
12
  //
@@ -29,8 +30,9 @@ import { main_merge_guard } from './main-merge-guard'
29
30
 
30
31
  const SUCCESS_EXIT_CODE = 0
31
32
  const FAILURE_EXIT_CODE = 1
32
- const ARGV_OFFSET = 2
33
33
  const COMMAND_NAME = 'main:merge'
34
+ const SPLIT_UNMEASURED =
35
+ 'split notice: the diff could not be measured — run `pnpm josh split:assess`'
34
36
 
35
37
  // git's default merge message carries no `#N`, so on an issue branch the `commit-msg` hook refuses
36
38
  // it and leaves the index mid-merge. The number is read with the hook's
@@ -62,18 +64,26 @@ interface MergeTarget {
62
64
  }
63
65
 
64
66
  // A failure that left no unmerged path — a remote that cannot be reached, a hook that refused — is not
65
- // a conflict, so it is rethrown rather than reported as one with nothing to resolve.
67
+ // a conflict, so it is rethrown rather than reported as one with nothing to resolve. A conflict only on
68
+ // generated files is regenerated and committed (`main-merge-regenerate.ts`), so it answers `undefined`
69
+ // and the merge reads as finished.
70
+ async function unresolved_conflict(error: unknown): Promise<MergeOutcome | undefined> {
71
+ const files = main_merge_guard.unmerged_paths(await git_command.status())
72
+
73
+ if (files.length === 0) throw error
74
+
75
+ return (await main_merge_regenerate.resolve(files)) ? undefined : { kind: 'conflict', files }
76
+ }
77
+
66
78
  async function merge_into(target: MergeTarget): Promise<MergeOutcome> {
67
79
  const { default_branch, current_branch } = target
68
80
 
69
81
  try {
70
82
  await git_command.merge_branch(default_branch, merge_message(default_branch, current_branch))
71
83
  } catch (error) {
72
- const files = main_merge_guard.unmerged_paths(await git_command.status())
73
-
74
- if (files.length === 0) throw error
84
+ const conflict = await unresolved_conflict(error)
75
85
 
76
- return { kind: 'conflict', files }
86
+ if (conflict !== undefined) return conflict
77
87
  }
78
88
 
79
89
  return { kind: target.is_current ? 'current' : 'merged', branch: default_branch }
@@ -106,6 +116,25 @@ function failure_text(outcome: MergeOutcome): string | undefined {
106
116
  return undefined
107
117
  }
108
118
 
119
+ // joshuafolkken/kit#4302: every implementing run merges the default branch immediately before the
120
+ // gate, so this is where a diff that outgrew the entry's split estimate is told so. The notice is
121
+ // advisory: a finished merge never fails on it, and an unreadable diff says so rather than reading as
122
+ // under the guide. It sits on the command, not on `merge()`, because `josh ship` merges again past the
123
+ // point a run can act on it.
124
+ async function split_notice(): Promise<string | undefined> {
125
+ try {
126
+ return split_assess.notice(await split_measure.read_branch())
127
+ } catch (error) {
128
+ return `${SPLIT_UNMEASURED}: ${error_text.message_of(error)}`
129
+ }
130
+ }
131
+
132
+ async function warn_over_split_guide(): Promise<void> {
133
+ const notice = await split_notice()
134
+
135
+ if (notice !== undefined) console.warn(notice)
136
+ }
137
+
109
138
  async function merge_default_branch(): Promise<number> {
110
139
  const outcome = await merge()
111
140
  const failure = failure_text(outcome)
@@ -118,6 +147,8 @@ async function merge_default_branch(): Promise<number> {
118
147
 
119
148
  if ('branch' in outcome) console.info(outcome.branch)
120
149
 
150
+ await warn_over_split_guide()
151
+
121
152
  return SUCCESS_EXIT_CODE
122
153
  }
123
154
 
@@ -145,13 +176,7 @@ async function run(argv: ReadonlyArray<string>): Promise<number> {
145
176
  }
146
177
  }
147
178
 
148
- async function main(argv: ReadonlyArray<string>): Promise<void> {
149
- process.exitCode = await run(argv)
150
- }
151
-
152
179
  const main_merge = { merge, run }
153
180
 
154
- if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
155
-
156
181
  export { main_merge }
157
182
  export type { MergeOutcome }
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env tsx
2
+ import { fileURLToPath } from 'node:url'
3
+ import { main_sync } from './main-sync'
4
+
5
+ // The `josh main:sync` entry, kept apart from `main-sync.ts` because `observations-flush.ts` imports
6
+ // that one: a bundle is one file, so a main guard there would fire for every command that carries it
7
+ // (joshuafolkken/kit#4186).
8
+ if (process.argv[1] === fileURLToPath(import.meta.url)) {
9
+ const ARGV_OFFSET = 2
10
+
11
+ process.exitCode = await main_sync.run(process.argv.slice(ARGV_OFFSET))
12
+ }
@@ -1,5 +1,3 @@
1
- #!/usr/bin/env tsx
2
- import { fileURLToPath } from 'node:url'
3
1
  import { composite_arguments, USAGE_ERROR_EXIT_CODE } from '#scripts/josh/josh-composite-arguments'
4
2
  import { error_text } from '#scripts/lib/error-message'
5
3
  import { git_command } from './git-command'
@@ -27,7 +25,6 @@ import { lockfile_sync } from './lockfile-sync'
27
25
 
28
26
  const SUCCESS_EXIT_CODE = 0
29
27
  const FAILURE_EXIT_CODE = 1
30
- const ARGV_OFFSET = 2
31
28
  const COMMAND_NAME = 'main:sync'
32
29
  const INSTALL_FAILURE =
33
30
  'node_modules is behind pnpm-lock.yaml and `pnpm install --frozen-lockfile` failed; run `pnpm josh ms` again, or the install here by hand.'
@@ -144,12 +141,6 @@ async function run(argv: ReadonlyArray<string>): Promise<number> {
144
141
  }
145
142
  }
146
143
 
147
- async function main(argv: ReadonlyArray<string>): Promise<void> {
148
- process.exitCode = await run(argv)
149
- }
150
-
151
144
  const main_sync = { run }
152
145
 
153
- if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
154
-
155
146
  export { main_sync }
@@ -1,4 +1,5 @@
1
1
  import { git_spawn } from '#scripts/git/git-spawn'
2
+ import { LEDGER_EXCLUSION_PATHSPEC } from '#scripts/observations/observation-ledger'
2
3
 
3
4
  // The one place a sanctioned `git stash pop` is targeted by its message rather than its stack
4
5
  // position. The stash is a single repository-wide stack shared by every
@@ -97,14 +98,34 @@ async function has_conflict(directory?: string): Promise<boolean> {
97
98
 
98
99
  // Uncommitted work is anything `git status --porcelain` lists — untracked files included, which is what
99
100
  // `push` below carries with `-u`, so the two agree on what "work" means.
100
- async function has_changes(directory?: string): Promise<boolean> {
101
- return (await git_spawn.read(git_args(directory, ['status', '--porcelain']))) !== ''
101
+ // A `pathspec` narrows both to the same paths, so a push never finds nothing where this found work.
102
+ async function has_changes(
103
+ directory?: string,
104
+ pathspec: ReadonlyArray<string> = [],
105
+ ): Promise<boolean> {
106
+ const status = await git_spawn.read(git_args(directory, ['status', '--porcelain', ...pathspec]))
107
+
108
+ return status !== ''
109
+ }
110
+
111
+ // What `josh stash:push` sets aside: everything but the observation ledger, whose lines ride on the
112
+ // run's own commit (`stash-push-cli.ts`).
113
+ const STASHABLE_PATHSPEC: ReadonlyArray<string> = ['--', ...LEDGER_EXCLUSION_PATHSPEC]
114
+
115
+ // Whether `josh stash:push` would push anything — the question to ask before telling someone to run it,
116
+ // so a ledger-only tree is never sent to a push that answers `clean`.
117
+ async function has_stashable_changes(directory?: string): Promise<boolean> {
118
+ return await has_changes(directory, STASHABLE_PATHSPEC)
102
119
  }
103
120
 
104
121
  // Push with a message `josh stash:pop` can later target — the stack is shared by every work tree, so an
105
122
  // entry pushed from a lane outlives the lane's own tree.
106
- async function push(message: string, directory?: string): Promise<void> {
107
- await git_spawn.read(git_args(directory, ['stash', 'push', '-u', '-m', message]))
123
+ async function push(
124
+ message: string,
125
+ directory?: string,
126
+ pathspec: ReadonlyArray<string> = [],
127
+ ): Promise<void> {
128
+ await git_spawn.read(git_args(directory, ['stash', 'push', '-u', '-m', message, ...pathspec]))
108
129
  }
109
130
 
110
131
  // The stack keyed by commit rather than position: a sweep that reads the
@@ -181,6 +202,7 @@ const git_stash = {
181
202
  drop_by_hash,
182
203
  has_changes,
183
204
  has_conflict,
205
+ has_stashable_changes,
184
206
  list,
185
207
  list_by_hash,
186
208
  matches,
@@ -188,6 +210,7 @@ const git_stash = {
188
210
  pop,
189
211
  push,
190
212
  select,
213
+ STASHABLE_PATHSPEC,
191
214
  work_message,
192
215
  }
193
216
 
@@ -1,13 +1,12 @@
1
1
  import { cli_flags } from '#scripts/lib/cli-flags'
2
2
 
3
- // `josh stash:pop` turns its `argv` into a single request: the message of the stash to pop. Parsing
4
- // lives here, acting on the stack lives in `stash-pop-cli.ts`, and a malformed command line is
5
- // `undefined` rather than a guessed intent — a pop run on a misread argument would take the wrong
6
- // entry off a stack shared by every lane.
3
+ // `josh stash:push` and `josh stash:pop` turn their `argv` into a single request: the message of the
4
+ // stash to push or pop. Parsing lives here, acting on the stack lives in each command's cli, and a
5
+ // malformed command line is `undefined` rather than a guessed intent — a pop run on a misread argument
6
+ // would take the wrong entry off a stack shared by every lane, and a push without its message would
7
+ // leave an entry nothing can target.
7
8
 
8
- const USAGE = 'Usage: josh stash:pop "<message>" [--dir <path>]'
9
-
10
- // `--dir` points the pop at a lane's work tree; without it the pop lands in the current checkout.
9
+ // `--dir` points the command at a lane's work tree; without it, it acts on the current checkout.
11
10
  const OPTIONS = { dir: { type: 'string' } } as const
12
11
 
13
12
  interface ParsedValues {
@@ -20,12 +19,16 @@ interface Request {
20
19
  dir: string | undefined
21
20
  }
22
21
 
22
+ function usage(command: string): string {
23
+ return `Usage: josh ${command} "<message>" [--dir <path>]`
24
+ }
25
+
23
26
  function read_arguments(argv: ReadonlyArray<string>): ParsedValues | undefined {
24
27
  return cli_flags.arguments_of(argv, OPTIONS)
25
28
  }
26
29
 
27
30
  // The message is the sole positional and must be a non-empty string: an empty message matches every
28
- // stash pushed without a message, which is exactly the ambiguity this command exists to refuse.
31
+ // stash pushed without a message, which is exactly the ambiguity `stash:pop` exists to refuse.
29
32
  function message_of(positionals: ReadonlyArray<string>): string | undefined {
30
33
  if (positionals.length !== 1) return undefined
31
34
 
@@ -42,7 +45,7 @@ function to_request(parsed: ParsedValues): Request | undefined {
42
45
  return { message, dir: parsed.values.dir }
43
46
  }
44
47
 
45
- const stash_pop_args = { USAGE, read_arguments, to_request }
48
+ const stash_args = { read_arguments, to_request, usage }
46
49
 
47
50
  export type { Request }
48
- export { stash_pop_args }
51
+ export { stash_args }