@joshuafolkken/kit 1.1514.0 → 1.1784.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (858) hide show
  1. package/.claude/agents/investigator.md +1 -1
  2. package/.claude/settings.json +5 -5
  3. package/.claude/skills/epic-commands/SKILL.md +26 -65
  4. package/.claude/skills/epic-commands/epic-bundle.md +3 -1
  5. package/.claude/skills/workflow-commands/SKILL.md +5 -5
  6. package/.claude/skills/workflow-commands/background-commands.md +5 -5
  7. package/.claude/skills/workflow-commands/backlogrun-child.md +10 -8
  8. package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +7 -25
  9. package/.claude/skills/workflow-commands/backlogrun-lanes.md +17 -13
  10. package/.claude/skills/workflow-commands/backlogrun-park.md +14 -23
  11. package/.claude/skills/workflow-commands/backlogrun-progress.md +2 -2
  12. package/.claude/skills/workflow-commands/backlogrun-recovery.md +5 -5
  13. package/.claude/skills/workflow-commands/backlogrun-steps.md +10 -10
  14. package/.claude/skills/workflow-commands/backlogrun.md +1 -1
  15. package/.claude/skills/workflow-commands/chain-rule.md +13 -7
  16. package/.claude/skills/workflow-commands/delegation.md +6 -5
  17. package/.claude/skills/workflow-commands/entry-sequence.md +9 -9
  18. package/.claude/skills/workflow-commands/followup.md +9 -31
  19. package/.claude/skills/workflow-commands/fullrun-steps.md +36 -45
  20. package/.claude/skills/workflow-commands/fullrun.md +2 -2
  21. package/.claude/skills/workflow-commands/halfrun.md +17 -25
  22. package/.claude/skills/workflow-commands/issue-comments.md +16 -12
  23. package/.claude/skills/workflow-commands/issue-scout.md +2 -2
  24. package/.claude/skills/workflow-commands/kickoff.md +24 -23
  25. package/.claude/skills/workflow-commands/latest-gate.md +7 -12
  26. package/.claude/skills/workflow-commands/needs-human-review.md +9 -14
  27. package/.claude/skills/workflow-commands/observation-filing.md +4 -36
  28. package/.claude/skills/workflow-commands/observation-ledger.md +1 -1
  29. package/.claude/skills/workflow-commands/pre-gate-cut.md +13 -30
  30. package/.claude/skills/workflow-commands/prerequisite.md +10 -16
  31. package/.claude/skills/workflow-commands/progress-watcher.md +1 -1
  32. package/.claude/skills/workflow-commands/prrun.md +3 -7
  33. package/.claude/skills/workflow-commands/retrospective.md +1 -1
  34. package/.claude/skills/workflow-commands/split-assessment.md +13 -1
  35. package/.claude/skills/workflow-commands/working-tree-hold.md +9 -9
  36. package/.codex/hooks.json +5 -5
  37. package/.github/actions/setup-node/action.yml +9 -0
  38. package/.github/actions/setup-pnpm/action.yml +1 -1
  39. package/.github/dependabot.yml +16 -0
  40. package/.github/release.yml +0 -2
  41. package/.github/workflows/ci.yml +120 -10
  42. package/.github/workflows/publish.yml +8 -1
  43. package/.github/workflows/sonar-qube.yml +1 -0
  44. package/.prettierignore +2 -0
  45. package/.vscode/tasks.json +1 -2
  46. package/CLAUDE.md +3 -7
  47. package/README.md +4 -2
  48. package/SECURITY.md +1 -1
  49. package/dist/CLAUDE.md +3 -7
  50. package/dist/commands/document-read-cli.js +882 -0
  51. package/dist/commands/{document-section-cli.js → document-section-main.js} +79 -37
  52. package/dist/commands/read-set-cli.js +1867 -0
  53. package/dist/commands/run-prep-main.js +21653 -0
  54. package/dist/commands/run-step-cli.js +23880 -0
  55. package/dist/config-merge/index.js +5 -1
  56. package/dist/hooks/audit-provision.js +20 -35
  57. package/dist/hooks/{chunk-DGT54IH5.js → chunk-AZX4FGQ3.js} +63 -17
  58. package/dist/hooks/chunk-CWMBGKYW.js +6483 -0
  59. package/dist/hooks/chunk-O2YBIDSI.js +4306 -0
  60. package/dist/hooks/{chunk-TNUMY6NL.js → chunk-PT5R6UJD.js} +4193 -1900
  61. package/dist/hooks/chunk-TUIFS5E7.js +72 -0
  62. package/dist/hooks/{chunk-723HKZO5.js → chunk-VWWCFGWK.js} +1 -1
  63. package/dist/hooks/{chunk-APUO6U4J.js → chunk-WR2KQAYZ.js} +1843 -440
  64. package/dist/hooks/{chunk-O6GDRNJB.js → chunk-XGBNSWEI.js} +248 -46
  65. package/dist/hooks/chunk-YCDOIR3I.js +3456 -0
  66. package/dist/hooks/codex-hook-adapter.js +10 -22
  67. package/dist/hooks/format-edited.js +5 -6
  68. package/dist/hooks/inputs.json +443 -317
  69. package/dist/hooks/pretool-guard.js +7 -25
  70. package/dist/hooks/session-lang.js +44 -51
  71. package/dist/hooks/stop-guard.js +7716 -2187
  72. package/dist/josh.js +6002 -3583
  73. package/dist/self-sync-guard/index.js +74 -10
  74. package/dist/version/index.js +115 -406
  75. package/eslint/base.js +1 -1
  76. package/lefthook/base.yml +3 -1
  77. package/package.json +10 -48
  78. package/pnpm-workspace.yaml +4 -2
  79. package/prompts/coding-standards.md +1 -1
  80. package/prompts/collaboration-workflow/file-edits.md +1 -7
  81. package/prompts/collaboration-workflow/issue-citation.md +1 -1
  82. package/prompts/collaboration-workflow/issue-template.md +33 -16
  83. package/prompts/collaboration-workflow/lane-instructions.md +1 -2
  84. package/prompts/collaboration-workflow/measurement.md +37 -0
  85. package/prompts/collaboration-workflow/operating-rules.md +4 -6
  86. package/prompts/collaboration-workflow/output-bounds.md +2 -7
  87. package/prompts/collaboration-workflow/plan-comment.md +3 -42
  88. package/prompts/collaboration-workflow/principles.md +5 -0
  89. package/prompts/collaboration-workflow/report-format.md +31 -60
  90. package/prompts/collaboration-workflow/residency.md +2 -2
  91. package/prompts/collaboration-workflow/shell-body.md +6 -16
  92. package/prompts/collaboration-workflow/turn-batching.md +0 -2
  93. package/prompts/collaboration-workflow/upstream-interrupt.md +14 -4
  94. package/prompts/collaboration-workflow/wip-cap.md +1 -1
  95. package/prompts/collaboration-workflow.md +3 -7
  96. package/prompts/refactoring.md +1 -1
  97. package/prompts/review-rubric.md +1 -2
  98. package/prompts/review.md +41 -21
  99. package/prompts/testing-guide.md +8 -43
  100. package/scripts/agent/agent-event.ts +15 -15
  101. package/scripts/agent/agent-exit-record.ts +13 -1
  102. package/scripts/agent/api-auth.ts +41 -0
  103. package/scripts/agent/api-outage.ts +1 -1
  104. package/scripts/auto-ok/auto-ok-cli.ts +14 -16
  105. package/scripts/auto-ok/auto-ok-judge-read.ts +12 -3
  106. package/scripts/auto-ok/auto-ok-judge-write.ts +46 -19
  107. package/scripts/auto-ok/auto-ok-judge.ts +13 -2
  108. package/scripts/auto-ok/auto-ok-main.ts +17 -0
  109. package/scripts/backlog/backlog-arrival.ts +14 -3
  110. package/scripts/backlog/backlog-budget-cli.ts +7 -33
  111. package/scripts/backlog/backlog-budget-main.ts +16 -0
  112. package/scripts/backlog/backlog-budget.ts +2 -3
  113. package/scripts/backlog/backlog-defect-priority.ts +4 -3
  114. package/scripts/backlog/backlog-drive-adopt.ts +67 -0
  115. package/scripts/backlog/backlog-drive-args.ts +4 -5
  116. package/scripts/backlog/backlog-drive-cli.ts +113 -28
  117. package/scripts/backlog/backlog-drive-hold.ts +162 -0
  118. package/scripts/backlog/backlog-drive-idle.ts +151 -0
  119. package/scripts/backlog/backlog-drive-judge.ts +25 -0
  120. package/scripts/backlog/backlog-drive-memory.ts +126 -0
  121. package/scripts/backlog/backlog-drive-named-offer.ts +5 -10
  122. package/scripts/backlog/backlog-drive-named.ts +53 -6
  123. package/scripts/backlog/backlog-drive-offer-argv.ts +3 -8
  124. package/scripts/backlog/backlog-drive-paused.ts +169 -0
  125. package/scripts/backlog/backlog-drive-restore.ts +30 -7
  126. package/scripts/backlog/backlog-drive-seats.ts +18 -8
  127. package/scripts/backlog/backlog-drive-token-handling.ts +38 -0
  128. package/scripts/backlog/backlog-drive.ts +79 -75
  129. package/scripts/backlog/backlog-next-main.ts +16 -0
  130. package/scripts/backlog/backlog-next-shared.ts +73 -0
  131. package/scripts/backlog/backlog-next.ts +48 -16
  132. package/scripts/backlog/backlog-occupied.ts +52 -39
  133. package/scripts/backlog/backlog-offer-cli.ts +6 -21
  134. package/scripts/backlog/backlog-offer-exclude.ts +15 -0
  135. package/scripts/backlog/backlog-offer-main.ts +12 -0
  136. package/scripts/backlog/backlog-offer.ts +36 -3
  137. package/scripts/backlog/backlog-overlap.ts +22 -4
  138. package/scripts/backlog/backlog-plan-read.ts +6 -2
  139. package/scripts/backlog/backlog-plan.ts +18 -4
  140. package/scripts/backlog/backlog-pool.ts +10 -10
  141. package/scripts/backlog/backlog-rank.ts +10 -2
  142. package/scripts/backlog/backlog-ready.ts +112 -30
  143. package/scripts/backlog/backlog-stalled-detect.ts +109 -36
  144. package/scripts/backlog/backlog-stalled.ts +52 -16
  145. package/scripts/backlog/backlog-wait-cause.ts +86 -0
  146. package/scripts/backlog/backlog-waves.ts +39 -13
  147. package/scripts/backlog/backlogrun-args.ts +19 -7
  148. package/scripts/backlog/backlogrun-cli.ts +19 -5
  149. package/scripts/backlog/backlogrun-launch.ts +6 -0
  150. package/scripts/backlog/backlogrun-restart.ts +97 -0
  151. package/scripts/backlog/backlogrun-stop.ts +79 -7
  152. package/scripts/behavior/behavior-cli.ts +2 -2
  153. package/scripts/behavior/behavior-rules.ts +47 -24
  154. package/scripts/build/build-bin.ts +2 -16
  155. package/scripts/build/build-claude-md.ts +0 -7
  156. package/scripts/build/build-commands.ts +0 -13
  157. package/scripts/build/build-hooks.ts +49 -48
  158. package/scripts/build/hook-bundle-stamp.ts +29 -11
  159. package/scripts/build/local-bin.ts +1 -1
  160. package/scripts/cases/cases-cli.ts +25 -13
  161. package/scripts/cases/cases-interaction-scan.ts +134 -0
  162. package/scripts/cases/cases-interaction.ts +183 -0
  163. package/scripts/cases/cases-logic.ts +39 -6
  164. package/scripts/ci/pr-classification-main.ts +18 -0
  165. package/scripts/ci/pr-classification.ts +10 -17
  166. package/scripts/clone/clone-scan.ts +1 -1
  167. package/scripts/cost-runtime/cost-blocks.ts +22 -37
  168. package/scripts/cost-runtime/cost-cli.ts +31 -14
  169. package/scripts/cost-runtime/cost-main.ts +12 -0
  170. package/scripts/cost-runtime/cost-transcript.ts +1 -0
  171. package/scripts/delegation/delegation-policy.ts +17 -4
  172. package/scripts/delegation/duplicate-read-guard.ts +0 -8
  173. package/scripts/delegation/investigation-guard.ts +0 -8
  174. package/scripts/delegation/investigation-reads.ts +3 -4
  175. package/scripts/dependabot/dependabot-cooldown.ts +194 -0
  176. package/scripts/discovery/repo-discovery.ts +24 -6
  177. package/scripts/doctor/doctor-consumer.ts +2 -5
  178. package/scripts/document/document-byte-budget.ts +8 -6
  179. package/scripts/document/document-scan.ts +1 -1
  180. package/scripts/document/document-section-cli.ts +0 -8
  181. package/scripts/document/document-section-main.ts +12 -0
  182. package/scripts/epic/epic-audit-cli.ts +12 -6
  183. package/scripts/epic/epic-bundle-apply.ts +137 -0
  184. package/scripts/epic/epic-bundle-cli.ts +32 -121
  185. package/scripts/epic/epic-bundle-format.ts +116 -0
  186. package/scripts/epic/epic-bundle-main.ts +17 -0
  187. package/scripts/epic/epic-busy.ts +5 -12
  188. package/scripts/epic/epic-classify.ts +24 -15
  189. package/scripts/epic/epic-cli-argv.ts +31 -0
  190. package/scripts/epic/epic-cli-decide.ts +42 -0
  191. package/scripts/epic/epic-cli.ts +6 -38
  192. package/scripts/epic/epic-close.ts +112 -55
  193. package/scripts/epic/epic-cross-repo.ts +4 -7
  194. package/scripts/epic/epic-decide.ts +119 -0
  195. package/scripts/epic/epic-decision.ts +9 -0
  196. package/scripts/epic/epic-fetch.ts +4 -0
  197. package/scripts/epic/epic-graph.ts +2 -0
  198. package/scripts/epic/epic-issue.ts +5 -1
  199. package/scripts/epic/epic-label-age.ts +1 -1
  200. package/scripts/epic/epic-lane-offer.ts +39 -4
  201. package/scripts/epic/epic-next-main.ts +24 -0
  202. package/scripts/epic/epic-next.ts +6 -24
  203. package/scripts/epic/epic-outside-blocker.ts +6 -2
  204. package/scripts/epic/epic-parse.ts +9 -3
  205. package/scripts/epic/epic-read.ts +1 -0
  206. package/scripts/epic/epic-reconcile.ts +39 -0
  207. package/scripts/epic/epic-run.ts +10 -1
  208. package/scripts/epic/epic-solo.ts +50 -14
  209. package/scripts/epic/epic.ts +41 -7
  210. package/scripts/exports/unused-members-cli.ts +2 -2
  211. package/scripts/followup/followup-checks-event.ts +8 -3
  212. package/scripts/followup/followup-coderabbit-wait.ts +82 -0
  213. package/scripts/followup/followup-review-gates.ts +81 -0
  214. package/scripts/followup/git-followup-stages.ts +13 -3
  215. package/scripts/followup/git-followup-workflow.ts +19 -66
  216. package/scripts/followup/git-pr-followup-wrapup.ts +9 -14
  217. package/scripts/followup/git-pr-followup.ts +36 -8
  218. package/scripts/fresh-machine/fresh-machine-cli.ts +1 -1
  219. package/scripts/fresh-machine/fresh-machine-run.ts +8 -8
  220. package/scripts/fresh-machine/specs/kit-test-backlogrun.json +1 -1
  221. package/scripts/gate/busy-average.ts +58 -0
  222. package/scripts/gate/check-cpu.ts +60 -0
  223. package/scripts/gate/check-inputs.ts +39 -95
  224. package/scripts/gate/check-reuse.ts +33 -54
  225. package/scripts/gate/command-memory.ts +192 -0
  226. package/scripts/gate/core-admission.ts +218 -28
  227. package/scripts/gate/core-budget-timing.ts +37 -0
  228. package/scripts/gate/core-budget.ts +80 -98
  229. package/scripts/gate/core-wait-record.ts +48 -0
  230. package/scripts/gate/core-wait.ts +37 -5
  231. package/scripts/gate/core-weights.ts +86 -0
  232. package/scripts/gate/free-cores.ts +27 -4
  233. package/scripts/gate/gate-ledger.ts +32 -4
  234. package/scripts/gate/gate-plan.ts +41 -34
  235. package/scripts/gate/gate-report.ts +14 -2
  236. package/scripts/gate/gate-run-steps.ts +53 -8
  237. package/scripts/gate/gate-skip.ts +12 -2
  238. package/scripts/gate/gate-steps.ts +12 -1
  239. package/scripts/gate/input-fingerprint.ts +42 -0
  240. package/scripts/gate/machine-capacity.ts +65 -31
  241. package/scripts/gate/moved-paths.ts +67 -0
  242. package/scripts/gate/project-checks.ts +5 -12
  243. package/scripts/gate/scoped-green.ts +12 -8
  244. package/scripts/gate/since-green.ts +62 -0
  245. package/scripts/gate/toolchain-inputs.ts +115 -0
  246. package/scripts/gate/verification-gate.ts +27 -24
  247. package/scripts/gate/verification-inputs.ts +250 -0
  248. package/scripts/gh/gh-author-association.ts +96 -9
  249. package/scripts/gh/git-ai-review-scan.ts +4 -2
  250. package/scripts/gh/git-gh-api-path.ts +15 -0
  251. package/scripts/gh/git-gh-branch-rules.ts +73 -0
  252. package/scripts/gh/git-gh-conditional.ts +5 -2
  253. package/scripts/gh/git-gh-issue-read.ts +5 -1
  254. package/scripts/gh/git-gh-issue-write.ts +67 -29
  255. package/scripts/gh/git-gh-issue.ts +7 -3
  256. package/scripts/gh/git-gh-poll-read.ts +89 -0
  257. package/scripts/gh/git-gh-pr-auto-merge.ts +8 -3
  258. package/scripts/gh/git-gh-pr-rest.ts +1 -1
  259. package/scripts/gh/git-gh-pr-snapshot.ts +33 -20
  260. package/scripts/gh/git-gh-pr.ts +27 -15
  261. package/scripts/gh/git-pr-checks-eval.ts +39 -7
  262. package/scripts/gh/git-pr-checks-parse.ts +39 -9
  263. package/scripts/gh/git-pr-merge-checked.ts +80 -0
  264. package/scripts/git/base-tree.ts +19 -2
  265. package/scripts/git/changed-file-scope.ts +6 -4
  266. package/scripts/git/changed-paths.ts +18 -1
  267. package/scripts/git/git-diff-reads.ts +27 -2
  268. package/scripts/git/git-grep-hits.ts +85 -0
  269. package/scripts/git/git-location-environment.ts +1 -1
  270. package/scripts/git/git-merge-conflicts.ts +83 -0
  271. package/scripts/git/git-preflight.ts +37 -12
  272. package/scripts/git/git-push-transport.ts +1 -2
  273. package/scripts/git/git-schemas.ts +17 -7
  274. package/scripts/git/git-spawn.ts +1 -2
  275. package/scripts/git/git-status.ts +4 -4
  276. package/scripts/git/main-merge-main.ts +12 -0
  277. package/scripts/git/main-merge-regenerate.ts +2 -2
  278. package/scripts/git/main-merge.ts +25 -9
  279. package/scripts/git/main-sync-main.ts +12 -0
  280. package/scripts/git/main-sync.ts +0 -9
  281. package/scripts/git/stash/git-stash.ts +27 -4
  282. package/scripts/git/stash/{stash-pop-args.ts → stash-args.ts} +13 -10
  283. package/scripts/git/stash/stash-pop-cli.ts +6 -12
  284. package/scripts/git/stash/stash-pop-main.ts +12 -0
  285. package/scripts/git/stash/stash-push-cli.ts +76 -0
  286. package/scripts/git/stash/stash-push-main.ts +12 -0
  287. package/scripts/hooks/batch-guard.ts +0 -8
  288. package/scripts/hooks/check-commit-message-main.ts +8 -0
  289. package/scripts/hooks/check-commit-message.ts +4 -7
  290. package/scripts/hooks/format-edited-file.ts +8 -24
  291. package/scripts/hooks/pre-commit-lint.ts +30 -3
  292. package/scripts/hooks/pre-push-unit.ts +4 -2
  293. package/scripts/hooks/pretool-guard-cli.ts +1 -8
  294. package/scripts/hooks/pretool-guard.ts +32 -19
  295. package/scripts/hooks/reserved-run.ts +67 -9
  296. package/scripts/hooks/run-hook.sh +13 -4
  297. package/scripts/hooks/shell-rules-notice.ts +37 -0
  298. package/scripts/hooks/stop-actions.ts +2 -21
  299. package/scripts/hooks/stop-guard.ts +13 -9
  300. package/scripts/init/hook-command-rewrite.ts +19 -5
  301. package/scripts/init/hook-launch.ts +15 -17
  302. package/scripts/init/init-actions.ts +0 -6
  303. package/scripts/init/init-ai-copy.ts +10 -36
  304. package/scripts/init/init-bootstrap.ts +9 -8
  305. package/scripts/init/init-dry-run-report.ts +1 -1
  306. package/scripts/init/init-dry-run.ts +1 -1
  307. package/scripts/init/init-file-action.ts +7 -9
  308. package/scripts/init/init-logic-json-merge.ts +2 -2
  309. package/scripts/init/init-logic-migrate.ts +9 -82
  310. package/scripts/init/init-logic.ts +3 -2
  311. package/scripts/init/init-main.ts +12 -0
  312. package/scripts/init/init.ts +5 -12
  313. package/scripts/init/kit-development-versions.ts +3 -7
  314. package/scripts/init/kit-written-paths.ts +2 -2
  315. package/scripts/init/project-profile.ts +5 -4
  316. package/scripts/init/tsconfig-preset-migration.ts +2 -1
  317. package/scripts/init/vscode-tasks.ts +1 -1
  318. package/scripts/issue/defect-origin-cli.ts +106 -0
  319. package/scripts/issue/defect-origin-line.ts +60 -0
  320. package/scripts/issue/defect-origin-main.ts +11 -0
  321. package/scripts/issue/defect-origin.ts +114 -0
  322. package/scripts/issue/defect-rate-cli.ts +34 -78
  323. package/scripts/issue/defect-rate.ts +0 -16
  324. package/scripts/issue/defect-report-cli.ts +128 -0
  325. package/scripts/issue/defect-report-format.ts +56 -0
  326. package/scripts/issue/defect-report-main.ts +11 -0
  327. package/scripts/issue/defect-report.ts +160 -0
  328. package/scripts/issue/expected-effect-lint.ts +1 -0
  329. package/scripts/issue/issue-already-done-cli.ts +62 -0
  330. package/scripts/issue/issue-body-or-comment.ts +40 -0
  331. package/scripts/issue/issue-cite-cli.ts +0 -9
  332. package/scripts/issue/issue-cite-main.ts +12 -0
  333. package/scripts/issue/issue-classification.ts +12 -7
  334. package/scripts/issue/issue-comment-cli.ts +10 -24
  335. package/scripts/issue/issue-comment-main.ts +12 -0
  336. package/scripts/issue/issue-evidence-exit.ts +100 -0
  337. package/scripts/issue/issue-file-cli.ts +29 -7
  338. package/scripts/issue/issue-file.ts +19 -19
  339. package/scripts/issue/issue-fold-cli.ts +2 -11
  340. package/scripts/issue/issue-fold-main.ts +12 -0
  341. package/scripts/issue/issue-labels.ts +81 -90
  342. package/scripts/issue/issue-lint-cli.ts +2 -10
  343. package/scripts/issue/issue-lint-main.ts +12 -0
  344. package/scripts/issue/issue-measured-cli.ts +56 -0
  345. package/scripts/issue/issue-merged.ts +19 -2
  346. package/scripts/issue/issue-not-before-label.ts +135 -0
  347. package/scripts/issue/issue-not-before.ts +111 -0
  348. package/scripts/issue/issue-number-shape.ts +15 -1
  349. package/scripts/issue/issue-park.ts +28 -0
  350. package/scripts/issue/issue-plan-cli.ts +151 -0
  351. package/scripts/issue/issue-priority.ts +151 -0
  352. package/scripts/issue/issue-rank.ts +7 -1
  353. package/scripts/issue/issue-read-cli.ts +3 -10
  354. package/scripts/issue/issue-read-main.ts +12 -0
  355. package/scripts/issue/issue-read.ts +29 -5
  356. package/scripts/issue/issue-release-cli.ts +0 -10
  357. package/scripts/issue/issue-release-main.ts +13 -0
  358. package/scripts/issue/issue-release.ts +7 -12
  359. package/scripts/issue/issue-sample-gate.ts +192 -0
  360. package/scripts/issue/issue-sample-source.ts +76 -0
  361. package/scripts/issue/issue-scout-cli.ts +0 -11
  362. package/scripts/issue/issue-scout-main.ts +14 -0
  363. package/scripts/issue/issue-state-cli.ts +0 -10
  364. package/scripts/issue/issue-state-main.ts +12 -0
  365. package/scripts/issue/issue-watch-diff.ts +56 -15
  366. package/scripts/issue/issue-watch.ts +2 -1
  367. package/scripts/issue/issue-wip.ts +2 -7
  368. package/scripts/issue/measure-rerun-cli.ts +13 -8
  369. package/scripts/issue/plan-consumers-cli.ts +39 -0
  370. package/scripts/issue/plan-consumers-main.ts +11 -0
  371. package/scripts/issue/plan-consumers-section.ts +55 -0
  372. package/scripts/issue/plan-consumers.ts +127 -0
  373. package/scripts/josh/agent-session-environment.ts +1 -1
  374. package/scripts/josh/command-usage.ts +15 -43
  375. package/scripts/josh/file-map-stamp.ts +49 -16
  376. package/scripts/josh/hook-decision.ts +32 -20
  377. package/scripts/josh/josh-command-map.ts +4 -1
  378. package/scripts/josh/josh-command-types.ts +12 -6
  379. package/scripts/josh/josh-commands-agent-hooks.ts +83 -0
  380. package/scripts/josh/josh-commands-ai.ts +157 -158
  381. package/scripts/josh/josh-commands-backlog.ts +82 -16
  382. package/scripts/josh/josh-commands-clone.ts +1 -0
  383. package/scripts/josh/josh-commands-development.ts +111 -71
  384. package/scripts/josh/josh-commands-document.ts +43 -1
  385. package/scripts/josh/josh-commands-epic.ts +171 -0
  386. package/scripts/josh/josh-commands-hooks.ts +25 -2
  387. package/scripts/josh/josh-commands-issue-write.ts +181 -0
  388. package/scripts/josh/josh-commands-issue.ts +124 -24
  389. package/scripts/josh/josh-commands-lane.ts +103 -2
  390. package/scripts/josh/josh-commands-lint.ts +19 -8
  391. package/scripts/josh/josh-commands-maintenance.ts +112 -4
  392. package/scripts/josh/josh-commands-pause.ts +29 -0
  393. package/scripts/josh/josh-commands-progress.ts +87 -0
  394. package/scripts/josh/josh-commands-project.ts +138 -9
  395. package/scripts/josh/josh-commands-review.ts +124 -0
  396. package/scripts/josh/josh-commands-run.ts +211 -23
  397. package/scripts/josh/josh-commands-ship.ts +169 -0
  398. package/scripts/josh/josh-commands-split.ts +9 -0
  399. package/scripts/josh/josh-commands-versioning.ts +49 -2
  400. package/scripts/josh/josh-commands-workflow.ts +144 -6
  401. package/scripts/josh/josh-logic.ts +6 -13
  402. package/scripts/josh/package-directory.ts +2 -4
  403. package/scripts/josh/process-identity.ts +13 -4
  404. package/scripts/josh/session-language-cli.ts +4 -8
  405. package/scripts/josh/session-language-main.ts +13 -0
  406. package/scripts/josh/session-language.ts +6 -1
  407. package/scripts/josh/shared-cache.ts +90 -0
  408. package/scripts/josh/stamp-file.ts +9 -15
  409. package/scripts/lane/lane-await.ts +51 -12
  410. package/scripts/lane/lane-cache.ts +5 -30
  411. package/scripts/lane/lane-capacity.ts +14 -23
  412. package/scripts/lane/lane-check-stats.ts +62 -21
  413. package/scripts/lane/lane-child-invocation.ts +8 -0
  414. package/scripts/lane/lane-cli.ts +15 -5
  415. package/scripts/lane/lane-close.ts +86 -18
  416. package/scripts/lane/lane-core-wait-stats.ts +66 -0
  417. package/scripts/lane/lane-dispatch.ts +24 -3
  418. package/scripts/lane/lane-gap-stats.ts +156 -0
  419. package/scripts/lane/lane-handoff.ts +69 -1
  420. package/scripts/lane/lane-held-stats.ts +129 -0
  421. package/scripts/lane/lane-install.ts +4 -11
  422. package/scripts/lane/lane-launch-cli.ts +0 -9
  423. package/scripts/lane/lane-launch-main.ts +12 -0
  424. package/scripts/lane/lane-ledger-schema.ts +266 -0
  425. package/scripts/lane/lane-ledger.ts +92 -123
  426. package/scripts/lane/lane-limit-cli.ts +12 -1
  427. package/scripts/lane/lane-measure-cli.ts +57 -11
  428. package/scripts/lane/lane-open.ts +9 -1
  429. package/scripts/lane/lane-parked.ts +3 -3
  430. package/scripts/lane/lane-pause-cli.ts +130 -0
  431. package/scripts/lane/lane-pause.ts +158 -0
  432. package/scripts/lane/lane-process-table.ts +166 -0
  433. package/scripts/lane/lane-reap-settle.ts +124 -0
  434. package/scripts/lane/lane-reap.ts +50 -15
  435. package/scripts/lane/lane-registry.ts +24 -3
  436. package/scripts/lane/lane-residents.ts +162 -0
  437. package/scripts/lane/lane-restart.ts +22 -2
  438. package/scripts/lane/lane-round-two-stats.ts +49 -0
  439. package/scripts/lane/lane-sampler.ts +4 -0
  440. package/scripts/lane/lane-session-action.ts +19 -5
  441. package/scripts/lane/lane-session-broker.ts +102 -21
  442. package/scripts/lane/lane-snapshot-trace.ts +84 -0
  443. package/scripts/lane/lane-spans.ts +51 -0
  444. package/scripts/lane/lane-spent.ts +6 -3
  445. package/scripts/lane/lane-stage-stats.ts +7 -2
  446. package/scripts/lane/lane-state.ts +302 -0
  447. package/scripts/lane/lane-stats.ts +58 -4
  448. package/scripts/lane/lane-stop-stats.ts +113 -37
  449. package/scripts/lane/lane-test-related-stats.ts +127 -0
  450. package/scripts/lane/lane-transcript-calls.ts +145 -0
  451. package/scripts/lane/lane-transcript-stats.ts +168 -0
  452. package/scripts/lane/lane-vacant.ts +13 -3
  453. package/scripts/lane/lane-withdraw-cli.ts +5 -4
  454. package/scripts/lane/lane-withdraw.ts +50 -49
  455. package/scripts/lane/process-directories.ts +70 -0
  456. package/scripts/lane/process-lane-marks.ts +94 -0
  457. package/scripts/lib/atomic-write.ts +62 -0
  458. package/scripts/lib/buffered-process.ts +12 -5
  459. package/scripts/lib/cli-flags.ts +53 -0
  460. package/scripts/lib/figure-format.ts +63 -0
  461. package/scripts/lib/json-value.ts +9 -1
  462. package/scripts/lib/package-manifest.ts +35 -0
  463. package/scripts/lib/read-file.ts +3 -1
  464. package/scripts/lib/stamped-memo.ts +63 -0
  465. package/scripts/lib/stdout-on-stderr.ts +24 -0
  466. package/scripts/lib/timeouts.ts +9 -0
  467. package/scripts/lib/transcript-record.ts +91 -0
  468. package/scripts/lines/effective-limit.ts +1 -1
  469. package/scripts/lint/eslint-cache-dependencies.ts +145 -0
  470. package/scripts/lint/eslint-daemon.ts +265 -0
  471. package/scripts/lint/format.ts +11 -2
  472. package/scripts/lint/import-graph.ts +279 -0
  473. package/scripts/lint/lint-gate-scope.ts +102 -0
  474. package/scripts/lint/lint-parallel-main.ts +19 -0
  475. package/scripts/lint/lint-parallel.ts +62 -30
  476. package/scripts/lint/lint-related-scope.ts +30 -24
  477. package/scripts/lint/lint-related.ts +38 -6
  478. package/scripts/notify/confirmation-options.ts +1 -2
  479. package/scripts/notify/telegram-notify.ts +20 -20
  480. package/scripts/notify/telegram-test-logic.ts +0 -1
  481. package/scripts/notify/telegram-test-main.ts +8 -0
  482. package/scripts/notify/telegram-test.ts +2 -6
  483. package/scripts/observations/observation-ledger.ts +13 -0
  484. package/scripts/observations/observations-flush-landing.ts +5 -3
  485. package/scripts/observations/observations-flush.ts +6 -1
  486. package/scripts/overrides/overrides-check.ts +2 -5
  487. package/scripts/overrides/overrides-files.ts +2 -1
  488. package/scripts/overrides/overrides-logic.ts +3 -6
  489. package/scripts/package/verify-optional-eslint-install.ts +8 -6
  490. package/scripts/propagate/propagate-publish.ts +2 -7
  491. package/scripts/propagate/propagate-targets.ts +4 -12
  492. package/scripts/refactor/import-graph.ts +9 -7
  493. package/scripts/release/github-release-runs.ts +17 -6
  494. package/scripts/release/release-approval-prune.ts +18 -0
  495. package/scripts/release/release-history.ts +1 -3
  496. package/scripts/release/release-progress.ts +42 -22
  497. package/scripts/release/release-publish-run.ts +39 -0
  498. package/scripts/release/release-publish.ts +6 -6
  499. package/scripts/release/release-scope-cli.ts +0 -10
  500. package/scripts/release/release-scope-main.ts +12 -0
  501. package/scripts/repo/repo-setting.ts +3 -6
  502. package/scripts/repo/required-checks-logic.ts +6 -15
  503. package/scripts/report/report-format-reference.ts +2 -0
  504. package/scripts/report/report-labels.ts +155 -0
  505. package/scripts/report/report-lint-cli.ts +3 -0
  506. package/scripts/report/report-lint.ts +85 -110
  507. package/scripts/report/report-template-cli.ts +59 -0
  508. package/scripts/report/report-template.ts +112 -0
  509. package/scripts/review/acceptance-map.ts +1 -0
  510. package/scripts/review/removed-tests-check.ts +86 -0
  511. package/scripts/review/removed-tests.ts +149 -0
  512. package/scripts/review/review-brief-cli.ts +81 -15
  513. package/scripts/review/review-brief-main.ts +12 -0
  514. package/scripts/review/review-brief.ts +31 -3
  515. package/scripts/review/review-code-tree.ts +10 -6
  516. package/scripts/review/review-comment-round.ts +26 -8
  517. package/scripts/review/review-finding-ledger.ts +30 -15
  518. package/scripts/review/review-interaction.ts +94 -0
  519. package/scripts/review/review-readers-scan.ts +163 -0
  520. package/scripts/review/review-record-cli.ts +69 -30
  521. package/scripts/review/review-record-main.ts +12 -0
  522. package/scripts/review/review-round-one-blobs.ts +221 -0
  523. package/scripts/review/review-round2-cli.ts +49 -12
  524. package/scripts/review/review-round2.ts +80 -12
  525. package/scripts/review/review-stamps.ts +19 -1
  526. package/scripts/review/review-stop-log.ts +96 -0
  527. package/scripts/review/review-stops-cli.ts +85 -0
  528. package/scripts/review/review-tree.ts +6 -17
  529. package/scripts/review/review-untouched-readers.ts +146 -0
  530. package/scripts/review/test-titles.ts +118 -0
  531. package/scripts/rules/agent-model.ts +8 -0
  532. package/scripts/rules/bash-triggers.ts +46 -3
  533. package/scripts/rules/decision-oracle-batch.ts +9 -1
  534. package/scripts/rules/decision-oracle.ts +2 -2
  535. package/scripts/rules/delivered-rules.ts +80 -2
  536. package/scripts/rules/destructive-command.ts +8 -1
  537. package/scripts/rules/direct-filing.ts +10 -2
  538. package/scripts/rules/direct-issue-comment.ts +117 -0
  539. package/scripts/rules/direct-pr-create.ts +69 -3
  540. package/scripts/rules/early-heartbeat.ts +2 -1
  541. package/scripts/rules/file-body.ts +7 -0
  542. package/scripts/rules/filing-cap.ts +7 -0
  543. package/scripts/rules/git-argv.ts +72 -14
  544. package/scripts/rules/git-force.ts +12 -2
  545. package/scripts/rules/guard-remedy.ts +4 -0
  546. package/scripts/rules/implementation-cut-verdict.ts +1 -1
  547. package/scripts/rules/implementation-cut.ts +11 -3
  548. package/scripts/rules/index-guard.ts +8 -1
  549. package/scripts/rules/issue-comments.ts +9 -1
  550. package/scripts/rules/josh-git-bare.ts +7 -0
  551. package/scripts/rules/lane-background.ts +67 -25
  552. package/scripts/rules/lane-carry-conflict.ts +6 -0
  553. package/scripts/rules/lane-direct-tool.ts +74 -0
  554. package/scripts/rules/lane-interactive-ask.ts +9 -2
  555. package/scripts/rules/lane-park.ts +45 -23
  556. package/scripts/rules/lane-split-park.ts +10 -2
  557. package/scripts/rules/lane-switch-main.ts +7 -0
  558. package/scripts/rules/oracle-consulted.ts +10 -0
  559. package/scripts/rules/oracle-firing.ts +1 -0
  560. package/scripts/rules/permission-guards.ts +3 -0
  561. package/scripts/rules/piped-verification.ts +1 -1
  562. package/scripts/rules/poll-loop.ts +7 -0
  563. package/scripts/rules/pr-merge.ts +123 -0
  564. package/scripts/rules/protected-files.ts +32 -5
  565. package/scripts/rules/raw-field-body.ts +6 -0
  566. package/scripts/rules/rule-body-guard.ts +8 -0
  567. package/scripts/rules/rule-list.ts +9 -28
  568. package/scripts/rules/rule-value-cache.ts +4 -9
  569. package/scripts/rules/rule-value-cli.ts +51 -32
  570. package/scripts/rules/rule-value.ts +1 -1
  571. package/scripts/rules/shell-segments.ts +35 -0
  572. package/scripts/rules/stop-rule-rows.ts +64 -0
  573. package/scripts/rules/stop-rules.ts +3 -4
  574. package/scripts/rules/test-declared-commit.ts +11 -1
  575. package/scripts/rules/third-party-write.ts +7 -0
  576. package/scripts/rules/timed-rerun.ts +69 -0
  577. package/scripts/rules/worktree-guard.ts +13 -3
  578. package/scripts/run/board/run-board-app-name.ts +23 -0
  579. package/scripts/run/board/run-board-cli.ts +65 -32
  580. package/scripts/run/board/run-board-earlier.ts +94 -0
  581. package/scripts/run/board/run-board-ending-reason.ts +67 -0
  582. package/scripts/run/board/run-board-estimate-schedule.ts +103 -0
  583. package/scripts/run/board/run-board-estimate.ts +98 -0
  584. package/scripts/run/board/run-board-fit.ts +153 -36
  585. package/scripts/run/board/run-board-fold.ts +123 -0
  586. package/scripts/run/board/run-board-fresh.ts +2 -2
  587. package/scripts/run/board/run-board-gather-live.ts +29 -0
  588. package/scripts/run/board/run-board-gather-thread.ts +189 -0
  589. package/scripts/run/board/run-board-gather-worker.ts +29 -0
  590. package/scripts/run/board/run-board-gather.ts +187 -0
  591. package/scripts/run/board/run-board-github.ts +118 -38
  592. package/scripts/run/board/run-board-header.ts +82 -20
  593. package/scripts/run/board/run-board-keys.ts +58 -0
  594. package/scripts/run/board/run-board-kind.ts +20 -6
  595. package/scripts/run/board/run-board-labels.ts +116 -71
  596. package/scripts/run/board/run-board-lane-state.ts +109 -0
  597. package/scripts/run/board/run-board-lane-time.ts +122 -0
  598. package/scripts/run/board/run-board-layout.ts +239 -60
  599. package/scripts/run/board/run-board-length.ts +52 -0
  600. package/scripts/run/board/run-board-machine.ts +8 -4
  601. package/scripts/run/board/run-board-main.ts +12 -0
  602. package/scripts/run/board/run-board-notes.ts +52 -31
  603. package/scripts/run/board/run-board-now.ts +1 -1
  604. package/scripts/run/board/run-board-operation.ts +15 -33
  605. package/scripts/run/board/run-board-phase.ts +1 -1
  606. package/scripts/run/board/run-board-plan-shared.ts +115 -0
  607. package/scripts/run/board/run-board-plan.ts +55 -3
  608. package/scripts/run/board/run-board-planning.ts +45 -0
  609. package/scripts/run/board/run-board-priority.ts +44 -0
  610. package/scripts/run/board/run-board-process-groups.ts +195 -0
  611. package/scripts/run/board/run-board-read.ts +151 -27
  612. package/scripts/run/board/run-board-reason.ts +235 -51
  613. package/scripts/run/board/run-board-released.ts +35 -0
  614. package/scripts/run/board/run-board-render-checks.ts +39 -5
  615. package/scripts/run/board/run-board-render-condition.ts +96 -0
  616. package/scripts/run/board/run-board-render-drawn.ts +67 -0
  617. package/scripts/run/board/run-board-render-foot.ts +59 -0
  618. package/scripts/run/board/run-board-render-icon.ts +35 -0
  619. package/scripts/run/board/run-board-render-lanes.ts +145 -0
  620. package/scripts/run/board/run-board-render-lead.ts +80 -0
  621. package/scripts/run/board/run-board-render-legend.ts +117 -48
  622. package/scripts/run/board/run-board-render-notes.ts +156 -29
  623. package/scripts/run/board/run-board-render-processes.ts +196 -0
  624. package/scripts/run/board/run-board-render-section.ts +119 -0
  625. package/scripts/run/board/run-board-render-slot.ts +3 -36
  626. package/scripts/run/board/run-board-render-tail.ts +115 -48
  627. package/scripts/run/board/run-board-render-time.ts +56 -0
  628. package/scripts/run/board/run-board-render-title.ts +117 -24
  629. package/scripts/run/board/run-board-render-waits.ts +104 -20
  630. package/scripts/run/board/run-board-render.ts +207 -265
  631. package/scripts/run/board/run-board-roots.ts +54 -0
  632. package/scripts/run/board/run-board-row-yield.ts +9 -4
  633. package/scripts/run/board/run-board-setup.ts +1 -12
  634. package/scripts/run/board/run-board-snapshot.ts +111 -0
  635. package/scripts/run/board/run-board-spin.ts +2 -2
  636. package/scripts/run/board/run-board-state.ts +22 -33
  637. package/scripts/run/board/run-board-status.ts +147 -71
  638. package/scripts/run/board/run-board-thanks-read.ts +2 -2
  639. package/scripts/run/board/run-board-tick.ts +122 -107
  640. package/scripts/run/board/run-board-usage-board.ts +78 -0
  641. package/scripts/run/board/run-board-usage-lanes.ts +113 -0
  642. package/scripts/run/board/run-board-usage-listing.ts +93 -0
  643. package/scripts/run/board/run-board-usage-read.ts +120 -150
  644. package/scripts/run/board/run-board-usage-rusage.ts +19 -7
  645. package/scripts/run/board/run-board-usage-text.ts +139 -51
  646. package/scripts/run/board/run-board-usage-top.ts +102 -0
  647. package/scripts/run/board/run-board-usage.ts +89 -72
  648. package/scripts/run/board/run-board-usual.ts +20 -9
  649. package/scripts/run/carry/run-carry-args.ts +4 -7
  650. package/scripts/run/carry/run-carry-conversation.ts +1 -1
  651. package/scripts/run/carry/run-carry.ts +9 -4
  652. package/scripts/run/cut/run-cut-handoff.ts +2 -2
  653. package/scripts/run/event/run-event-cli.ts +1 -5
  654. package/scripts/run/event/run-event-filed.ts +12 -6
  655. package/scripts/run/event/run-event-follow.ts +2 -3
  656. package/scripts/run/event/run-event-render.ts +6 -10
  657. package/scripts/run/event/run-event-scope.ts +2 -2
  658. package/scripts/run/event/run-event-stream-emit.ts +82 -22
  659. package/scripts/run/event/run-event-stream.ts +34 -8
  660. package/scripts/run/hold/run-hold-adopt.ts +65 -0
  661. package/scripts/run/hold/run-hold-cli.ts +93 -22
  662. package/scripts/run/hold/run-hold-main.ts +12 -0
  663. package/scripts/run/hold/run-hold-member.ts +37 -0
  664. package/scripts/run/hold/run-stop-notify.ts +183 -0
  665. package/scripts/run/merge/run-merge-auth.ts +31 -0
  666. package/scripts/run/merge/run-merge-cli.ts +62 -48
  667. package/scripts/run/merge/run-merge-close.ts +74 -0
  668. package/scripts/run/merge/run-merge-collect.ts +6 -13
  669. package/scripts/run/merge/run-merge-driver.ts +71 -0
  670. package/scripts/run/merge/run-merge-main.ts +12 -0
  671. package/scripts/run/merge/run-merge-outcome.ts +23 -0
  672. package/scripts/run/merge/run-merge-restart.ts +39 -0
  673. package/scripts/run/merge/run-merge-ship.ts +20 -4
  674. package/scripts/run/merge/run-merge-signals.ts +33 -9
  675. package/scripts/run/merge/run-merge-steps.ts +120 -85
  676. package/scripts/run/merge/run-merge.ts +38 -37
  677. package/scripts/run/park/run-park-cli.ts +91 -0
  678. package/scripts/run/park/run-park.ts +88 -0
  679. package/scripts/run/park/run-stalled.ts +68 -0
  680. package/scripts/run/pause/run-pause-cli.ts +73 -0
  681. package/scripts/run/pause/run-pause.ts +251 -0
  682. package/scripts/run/progress/run-progress-cli.ts +4 -12
  683. package/scripts/run/progress/run-progress-clock.ts +1 -1
  684. package/scripts/run/progress/run-progress-config.ts +6 -14
  685. package/scripts/run/progress/run-progress-main.ts +12 -0
  686. package/scripts/run/progress/run-progress.ts +1 -4
  687. package/scripts/run/review/run-review.ts +2 -1
  688. package/scripts/run/run-ending.ts +1 -0
  689. package/scripts/run/run-invocation.ts +5 -6
  690. package/scripts/run/run-liveness-cli.ts +6 -8
  691. package/scripts/run/run-liveness.ts +60 -29
  692. package/scripts/run/run-next.ts +1 -1
  693. package/scripts/run/run-parent-cut-hook.ts +2 -2
  694. package/scripts/run/run-preflight.ts +18 -3
  695. package/scripts/run/run-prep-cli.ts +1 -10
  696. package/scripts/run/run-prep-locate.ts +7 -50
  697. package/scripts/run/run-prep-main.ts +12 -0
  698. package/scripts/run/run-prep.ts +6 -0
  699. package/scripts/run/run-report-cli.ts +101 -13
  700. package/scripts/run/run-report-handoff.ts +114 -0
  701. package/scripts/run/run-step.ts +1 -1
  702. package/scripts/run/run-stranded-detect.ts +13 -0
  703. package/scripts/run/run-watcher-guard-cli.ts +1 -1
  704. package/scripts/run/run-watcher-guard.ts +1 -1
  705. package/scripts/run/ship/run-ship-args.ts +121 -0
  706. package/scripts/run/ship/run-ship-body-draft.ts +110 -0
  707. package/scripts/run/ship/run-ship-cli.ts +63 -140
  708. package/scripts/run/ship/run-ship-detach.ts +19 -8
  709. package/scripts/run/ship/run-ship-infra-retry.ts +59 -0
  710. package/scripts/run/ship/run-ship-next.ts +18 -2
  711. package/scripts/run/ship/run-ship-overlap.ts +42 -5
  712. package/scripts/run/ship/run-ship-place.ts +96 -0
  713. package/scripts/run/ship/run-ship-pre-detach-timed.ts +43 -0
  714. package/scripts/run/ship/run-ship-pre-detach.ts +81 -24
  715. package/scripts/run/ship/run-ship-preflight.ts +137 -32
  716. package/scripts/run/ship/run-ship-probe.ts +11 -3
  717. package/scripts/run/ship/run-ship-relaunch-cap.ts +70 -0
  718. package/scripts/run/ship/run-ship-removed-rows.ts +61 -0
  719. package/scripts/run/ship/run-ship-return.ts +107 -23
  720. package/scripts/run/ship/run-ship-review-steps.ts +105 -151
  721. package/scripts/run/ship/run-ship-review.ts +73 -6
  722. package/scripts/run/ship/run-ship-reviewer.ts +207 -0
  723. package/scripts/run/ship/run-ship-stage.ts +55 -6
  724. package/scripts/run/ship/run-ship-steps.ts +46 -15
  725. package/scripts/run/ship/run-ship-stop-cause.ts +135 -0
  726. package/scripts/run/ship/run-ship-stop-text.ts +11 -6
  727. package/scripts/run/ship/run-ship-sync.ts +43 -6
  728. package/scripts/run/ship/run-ship.ts +30 -2
  729. package/scripts/run/tidy/run-tidy-cli.ts +0 -4
  730. package/scripts/run/tidy/run-tidy-lanes.ts +3 -0
  731. package/scripts/run/tidy/run-tidy-main.ts +8 -0
  732. package/scripts/run/wake/run-wake-cli.ts +119 -100
  733. package/scripts/run/wake/run-wake-code.ts +83 -0
  734. package/scripts/run/wake/run-wake-driver.ts +19 -8
  735. package/scripts/run/wake/run-wake-loop.ts +34 -3
  736. package/scripts/run/wake/run-wake-main.ts +13 -0
  737. package/scripts/run/wake/run-wake-ports.ts +90 -0
  738. package/scripts/run/wake/run-wake-takeover.ts +66 -0
  739. package/scripts/run/wake/run-wake.ts +2 -1
  740. package/scripts/safe-chain/pack-hook.ts +2 -2
  741. package/scripts/safe-chain/preinstall-command.ts +2 -1
  742. package/scripts/safe-chain/project-config.ts +3 -9
  743. package/scripts/security/security-audit-main.ts +8 -0
  744. package/scripts/security/security-audit-provision-logic.ts +0 -11
  745. package/scripts/security/security-audit-provision-main.ts +12 -0
  746. package/scripts/security/security-audit-provision.ts +11 -26
  747. package/scripts/security/security-audit.ts +6 -7
  748. package/scripts/self-sync-guard/self-sync-guard-logic.ts +6 -13
  749. package/scripts/split/split-assess-cli.ts +2 -2
  750. package/scripts/split/split-assess.ts +15 -0
  751. package/scripts/split/split-measure.ts +65 -0
  752. package/scripts/sync/claude-settings-merge.ts +8 -15
  753. package/scripts/sync/directory-copy-guard.ts +4 -9
  754. package/scripts/sync/file-content.ts +78 -8
  755. package/scripts/sync/sync-ai-files.ts +3 -5
  756. package/scripts/sync/sync-configs.ts +11 -23
  757. package/scripts/sync/sync-hook-safety.ts +4 -10
  758. package/scripts/sync/sync-main.ts +11 -0
  759. package/scripts/sync/sync.ts +25 -37
  760. package/scripts/test/test-declared-changed.ts +2 -2
  761. package/scripts/test/test-declared.ts +1 -1
  762. package/scripts/test/test-e2e-guard.ts +25 -1
  763. package/scripts/test/test-e2e-stamp.ts +38 -0
  764. package/scripts/test/test-pinned-logic.ts +145 -0
  765. package/scripts/test/test-pinned-main.ts +78 -0
  766. package/scripts/test/test-pinned.ts +100 -0
  767. package/scripts/test/test-read-map.ts +264 -0
  768. package/scripts/test/test-read-recording.ts +91 -0
  769. package/scripts/test/test-read-trace.ts +148 -0
  770. package/scripts/test/test-red-main.ts +12 -0
  771. package/scripts/test/test-red.ts +12 -30
  772. package/scripts/test/test-related-main.ts +18 -0
  773. package/scripts/test/test-related-record.ts +119 -0
  774. package/scripts/test/test-related-scope.ts +229 -43
  775. package/scripts/test/test-related.ts +300 -22
  776. package/scripts/test/test-unit-guard-main.ts +15 -0
  777. package/scripts/test/test-unit-guard.ts +42 -24
  778. package/scripts/test/unit-count-file.ts +37 -0
  779. package/scripts/test/unit-run-marker.ts +162 -0
  780. package/scripts/test/unit-setup-files.ts +51 -0
  781. package/scripts/test/unit-worker-share.ts +61 -149
  782. package/scripts/test/whole-suite-files.ts +63 -0
  783. package/scripts/time-runtime/time-background.ts +20 -2
  784. package/scripts/time-runtime/time-bundles.ts +4 -3
  785. package/scripts/time-runtime/time-density-hook.ts +8 -6
  786. package/scripts/time-runtime/time-followup-stage.ts +1 -3
  787. package/scripts/time-runtime/time-format.ts +5 -28
  788. package/scripts/time-runtime/time-markers.ts +10 -1
  789. package/scripts/time-runtime/time-shell.ts +97 -10
  790. package/scripts/time-runtime/time-transcript-line.ts +49 -62
  791. package/scripts/uninstall/uninstall.ts +1 -1
  792. package/scripts/version/bump-version-main.ts +12 -0
  793. package/scripts/version/bump-version.ts +25 -25
  794. package/scripts/version/effective-upstream.ts +6 -12
  795. package/scripts/version/latest-corepack.ts +17 -32
  796. package/scripts/version/latest-if-required-cli.ts +93 -0
  797. package/scripts/version/latest-lane-guard-main.ts +8 -0
  798. package/scripts/version/latest-lane-guard.ts +0 -4
  799. package/scripts/version/latest-scope-cli.ts +0 -9
  800. package/scripts/version/latest-scope-main.ts +12 -0
  801. package/scripts/version/latest-update.ts +5 -5
  802. package/scripts/version/npm-registry.ts +44 -6
  803. package/scripts/version/publishable-range-check.ts +5 -16
  804. package/scripts/version/release-age.ts +1 -1
  805. package/scripts/version/release-hold.ts +1 -1
  806. package/scripts/version/release-window.ts +38 -0
  807. package/scripts/version/running-binary.ts +1 -1
  808. package/scripts/version/safe-chain-version-update.ts +3 -8
  809. package/scripts/version/version-targets.ts +6 -28
  810. package/templates/dependabot.yml +29 -0
  811. package/templates/gitignore +4 -1
  812. package/templates/pnpm-workspace.basic.yaml +1 -1
  813. package/templates/sonar-project.properties +3 -2
  814. package/templates/workflows/ci.yml +12 -4
  815. package/templates/workflows/github-release.yml +4 -0
  816. package/tsconfig.sonar.json +1 -1
  817. package/.ncurc.json +0 -3
  818. package/dist/hooks/batch-guard.js +0 -29
  819. package/dist/hooks/chunk-4KKD2UTK.js +0 -66
  820. package/dist/hooks/chunk-6TS2JD6D.js +0 -237
  821. package/dist/hooks/chunk-7DSBJVFH.js +0 -50
  822. package/dist/hooks/chunk-A65Y4YOR.js +0 -79
  823. package/dist/hooks/chunk-CDY4NFQG.js +0 -15
  824. package/dist/hooks/chunk-EFXE6C37.js +0 -81
  825. package/dist/hooks/chunk-GP4IEC4O.js +0 -20
  826. package/dist/hooks/chunk-JP45SOCJ.js +0 -56
  827. package/dist/hooks/chunk-LAOV7NLM.js +0 -45
  828. package/dist/hooks/chunk-M4HGZV7U.js +0 -83
  829. package/dist/hooks/chunk-PF2NZL2A.js +0 -131
  830. package/dist/hooks/chunk-PTICX4OL.js +0 -358
  831. package/dist/hooks/chunk-RT27QRJW.js +0 -6247
  832. package/dist/hooks/chunk-SYOTDYCI.js +0 -3533
  833. package/dist/hooks/chunk-UPUZF3AN.js +0 -279
  834. package/dist/hooks/chunk-WK6SMBIC.js +0 -3180
  835. package/dist/hooks/duplicate-read-guard.js +0 -30
  836. package/dist/hooks/investigation-guard.js +0 -29
  837. package/scripts/backlog/backlog-stalled-cli.ts +0 -30
  838. package/scripts/cost-runtime/cost-format.ts +0 -29
  839. package/scripts/init/basic-path-migration.ts +0 -24
  840. package/scripts/issue/issue-backlinks-cli.ts +0 -93
  841. package/scripts/josh/josh-commands-guard.ts +0 -38
  842. package/scripts/josh/josh-usage-automation.ts +0 -121
  843. package/scripts/josh/josh-usage-backlog.ts +0 -180
  844. package/scripts/josh/josh-usage-developer.ts +0 -230
  845. package/scripts/josh/josh-usage-hooks.ts +0 -38
  846. package/scripts/josh/josh-usage-issue.ts +0 -205
  847. package/scripts/josh/josh-usage-review.ts +0 -101
  848. package/scripts/josh/josh-usage-run.ts +0 -252
  849. package/scripts/josh/josh-usage-session.ts +0 -238
  850. package/scripts/josh/josh-usage-workflow.ts +0 -212
  851. package/scripts/lint/cross-file-recheck.ts +0 -155
  852. package/scripts/registry-migration/migrate-logic.ts +0 -237
  853. package/scripts/registry-migration/migrate.ts +0 -292
  854. package/scripts/registry-migration/user-npmrc.ts +0 -15
  855. package/scripts/rules/rule-guard.ts +0 -23
  856. package/scripts/rules/rule-registry-rows.ts +0 -292
  857. package/scripts/rules/rule-registry.ts +0 -112
  858. package/scripts/run/run-stranded-cli.ts +0 -27
@@ -0,0 +1,160 @@
1
+ import { defect_origin_line } from './defect-origin-line'
2
+
3
+ // Defects grouped by the pull request each one's origin line names: how many per pull request, per
4
+ // change kind, and per area of the tree it touched, plus how many each pull request that added a
5
+ // mechanism drew within a week of merging. Read from the bodies and the pull requests' files only,
6
+ // so nothing here asks for a judgement.
7
+
8
+ const WEEK_DAYS = 7
9
+ const MS_PER_DAY = 86_400_000
10
+ const WEEK_MS = WEEK_DAYS * MS_PER_DAY
11
+ const SCRIPTS_ROOT = 'scripts'
12
+ // `scripts/<dir>` — the two leading segments of a path under `scripts/`.
13
+ const SCRIPT_AREA_DEPTH = 2
14
+ const ROOT_AREA = '(root)'
15
+ const UNREAD_AREA = '(pull request not read)'
16
+ const TEST_FILE = /\.(?:test|e2e)\.ts$|\.snap$/u
17
+ // The run's own records — observations, accepted metrics — which nearly every merge adds, so they
18
+ // say nothing about what the pull request changed.
19
+ const RUN_RECORD_ROOT = '.josh/'
20
+
21
+ type ChangeKind = 'add' | 'fix' | 'remove'
22
+
23
+ interface ReportIssue {
24
+ number: number
25
+ created_at: string
26
+ body: string
27
+ }
28
+
29
+ interface PrFile {
30
+ filename: string
31
+ status: string
32
+ additions: number
33
+ deletions: number
34
+ }
35
+
36
+ interface OriginPr {
37
+ pr: number
38
+ merged_at: string
39
+ kind: ChangeKind
40
+ areas: ReadonlyArray<string>
41
+ }
42
+
43
+ interface Attributed {
44
+ issue: ReportIssue
45
+ pr: number
46
+ }
47
+
48
+ interface DefectReport {
49
+ by_pr: ReadonlyMap<number, number>
50
+ by_kind: ReadonlyMap<string, number>
51
+ by_area: ReadonlyMap<string, number>
52
+ unknown: number
53
+ undeclared: number
54
+ added_within_week: ReadonlyMap<number, number>
55
+ }
56
+
57
+ function changed(files: ReadonlyArray<PrFile>): ReadonlyArray<PrFile> {
58
+ return files.filter((file) => !file.filename.startsWith(RUN_RECORD_ROOT))
59
+ }
60
+
61
+ // A pull request that brought in a new non-test file added a mechanism; one that took out more than it
62
+ // put in removed; anything else changed what was there.
63
+ function change_kind(files: ReadonlyArray<PrFile>): ChangeKind {
64
+ const source = changed(files).filter((file) => !TEST_FILE.test(file.filename))
65
+
66
+ if (source.some((file) => file.status === 'added')) return 'add'
67
+
68
+ const added = source.reduce((sum, file) => sum + file.additions, 0)
69
+ const removed = source.reduce((sum, file) => sum + file.deletions, 0)
70
+
71
+ return removed > added ? 'remove' : 'fix'
72
+ }
73
+
74
+ // `scripts/<dir>` for a script, the top-level directory otherwise, and one bucket for root files.
75
+ function area_of(filename: string): string {
76
+ const segments = filename.split('/')
77
+
78
+ if (segments.length === 1) return ROOT_AREA
79
+
80
+ const is_script = segments[0] === SCRIPTS_ROOT && segments.length > SCRIPT_AREA_DEPTH
81
+ const depth = is_script ? SCRIPT_AREA_DEPTH : 1
82
+
83
+ return segments.slice(0, depth).join('/')
84
+ }
85
+
86
+ function areas(files: ReadonlyArray<PrFile>): ReadonlyArray<string> {
87
+ return [...new Set(changed(files).map((file) => area_of(file.filename)))]
88
+ }
89
+
90
+ function increment<K>(counts: Map<K, number>, key: K): void {
91
+ counts.set(key, (counts.get(key) ?? 0) + 1)
92
+ }
93
+
94
+ function count_by<K>(
95
+ items: ReadonlyArray<Attributed>,
96
+ keys: (item: Attributed) => ReadonlyArray<K>,
97
+ ): Map<K, number> {
98
+ const counts = new Map<K, number>()
99
+
100
+ for (const item of items) for (const key of keys(item)) increment(counts, key)
101
+
102
+ return counts
103
+ }
104
+
105
+ function within_week(issue: ReportIssue, origin: OriginPr): boolean {
106
+ const elapsed = Date.parse(issue.created_at) - Date.parse(origin.merged_at)
107
+
108
+ return elapsed >= 0 && elapsed <= WEEK_MS
109
+ }
110
+
111
+ function attribute(issue: ReportIssue): Attributed | undefined {
112
+ const origin = defect_origin_line.parse(issue.body)
113
+
114
+ return origin?.kind === 'pr' ? { issue, pr: origin.pr } : undefined
115
+ }
116
+
117
+ function attributed(issues: ReadonlyArray<ReportIssue>): ReadonlyArray<Attributed> {
118
+ return issues.map((issue) => attribute(issue)).filter((item) => item !== undefined)
119
+ }
120
+
121
+ // Every pull request an origin line names, once — what the report has to read.
122
+ function origin_prs(issues: ReadonlyArray<ReportIssue>): ReadonlyArray<number> {
123
+ return [...new Set(attributed(issues).map(({ pr }) => pr))]
124
+ }
125
+
126
+ function soon_after_adding(
127
+ items: ReadonlyArray<Attributed>,
128
+ prs: ReadonlyMap<number, OriginPr>,
129
+ ): Map<number, number> {
130
+ return count_by(items, ({ issue, pr }) => {
131
+ const origin = prs.get(pr)
132
+
133
+ return origin?.kind === 'add' && within_week(issue, origin) ? [pr] : []
134
+ })
135
+ }
136
+
137
+ function count_origins(issues: ReadonlyArray<ReportIssue>, kind: 'unknown' | undefined): number {
138
+ return issues.filter((issue) => defect_origin_line.parse(issue.body)?.kind === kind).length
139
+ }
140
+
141
+ function aggregate(
142
+ issues: ReadonlyArray<ReportIssue>,
143
+ prs: ReadonlyMap<number, OriginPr>,
144
+ ): DefectReport {
145
+ const items = attributed(issues)
146
+
147
+ return {
148
+ by_pr: count_by(items, ({ pr }) => [pr]),
149
+ by_kind: count_by(items, ({ pr }) => [prs.get(pr)?.kind ?? UNREAD_AREA]),
150
+ by_area: count_by(items, ({ pr }) => prs.get(pr)?.areas ?? [UNREAD_AREA]),
151
+ unknown: count_origins(issues, 'unknown'),
152
+ undeclared: count_origins(issues, undefined),
153
+ added_within_week: soon_after_adding(items, prs),
154
+ }
155
+ }
156
+
157
+ const defect_report = { aggregate, area_of, areas, change_kind, origin_prs, WEEK_DAYS }
158
+
159
+ export type { ChangeKind, DefectReport, OriginPr, PrFile, ReportIssue }
160
+ export { defect_report }
@@ -53,6 +53,7 @@ const expected_effect_lint = {
53
53
  DECLARATION_LINE,
54
54
  HEADING,
55
55
  ITEM_LABELS,
56
+ is_target,
56
57
  problems,
57
58
  }
58
59
 
@@ -0,0 +1,62 @@
1
+ #!/usr/bin/env tsx
2
+ import { fileURLToPath } from 'node:url'
3
+ import { git_gh_command } from '#scripts/gh/git-gh-command'
4
+ import { issue_evidence_exit } from '#scripts/issue/issue-evidence-exit'
5
+ import { ALREADY_DONE_LABEL } from '#scripts/issue/issue-labels'
6
+ import { issue_sample_gate } from '#scripts/issue/issue-sample-gate'
7
+ import { session_cite } from '#scripts/issue/session-cite'
8
+
9
+ // `josh issue:already-done <N> --evidence-file <path>` — the exit for an Issue whose work is already
10
+ // merged (`issue-comments.md` → "When the work turns out to be already merged"): the evidence
11
+ // comment, the `already-done` label and the `run:release`, in that order (`issue-evidence-exit.ts`).
12
+ //
13
+ // The label is provisioned by `josh start`, so nothing here creates it.
14
+ // **The Issue is never closed**: closing is a person's (Tier C), and the label is the run's exit.
15
+ //
16
+ // **A follow-up measurement is refused before anything is written** (joshuafolkken/kit#4504): its body
17
+ // declares the sample wait (`issue_sample_gate.DECLARATION`, read as `not-before` reads it), and its
18
+ // exit is `josh issue:measured`, which closes it — this one would leave it OPEN and the lane parked.
19
+
20
+ const ARGV_OFFSET = 2
21
+
22
+ function refusal_of(issue_number: string, body: string | undefined): string | undefined {
23
+ const cite = session_cite.issue(issue_number)
24
+ if (body === undefined) return `Issue ${cite} body not read; nothing written`
25
+ if (issue_sample_gate.cited_number(body) === undefined) return undefined
26
+
27
+ return `Issue ${cite} is a follow-up measurement (\`${issue_sample_gate.DECLARATION}\`): run \`josh issue:measured ${issue_number} --evidence-file <path>\` instead; nothing written`
28
+ }
29
+
30
+ async function admit(issue_number: string): Promise<boolean> {
31
+ const refusal = refusal_of(issue_number, await git_gh_command.issue_get_body(issue_number))
32
+
33
+ if (refusal !== undefined) console.error(refusal)
34
+
35
+ return refusal === undefined
36
+ }
37
+
38
+ async function apply_label(issue_number: string): Promise<boolean> {
39
+ const write = await git_gh_command.issue_apply_label(issue_number, ALREADY_DONE_LABEL)
40
+
41
+ if (!write.is_applied) console.error(`${ALREADY_DONE_LABEL} not applied: ${write.reason}`)
42
+
43
+ return write.is_applied
44
+ }
45
+
46
+ async function run(argv: ReadonlyArray<string>): Promise<number> {
47
+ return await issue_evidence_exit.run(argv, {
48
+ command: 'issue:already-done',
49
+ finish: apply_label,
50
+ admit,
51
+ })
52
+ }
53
+
54
+ async function main(argv: ReadonlyArray<string>): Promise<void> {
55
+ process.exitCode = await run(argv)
56
+ }
57
+
58
+ const issue_already_done_cli = { run }
59
+
60
+ if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
61
+
62
+ export { issue_already_done_cli }
@@ -0,0 +1,40 @@
1
+ import { git_gh_command } from '#scripts/gh/git-gh-command'
2
+
3
+ // One text written to an issue: **into the body when the body is blank, as a comment otherwise.**
4
+ // Two writers make this decision — `followup`'s completion notice and `issue:plan`'s plan — and a copy
5
+ // per caller is how the two would come to disagree about what "blank" means.
6
+ //
7
+ // A body that could not be read is not blank: overwriting a body nobody saw could erase a person's
8
+ // text, so an unreadable body falls to a comment, which loses nothing.
9
+
10
+ type Destination = 'body' | 'comment'
11
+
12
+ interface PostOutcome {
13
+ destination: Destination
14
+ url: string
15
+ }
16
+
17
+ function is_blank_body(body: string | undefined): boolean {
18
+ return body?.trim().length === 0
19
+ }
20
+
21
+ // `repo` (`owner/name`) addresses an issue in another repository; left out, the checkout's own.
22
+ async function post(issue_number: string, text: string, repo?: string): Promise<PostOutcome> {
23
+ const current_body = await git_gh_command.issue_get_body(issue_number, repo)
24
+
25
+ if (is_blank_body(current_body)) {
26
+ const url = await git_gh_command.issue_edit_body(issue_number, text, repo)
27
+
28
+ return { destination: 'body', url }
29
+ }
30
+
31
+ return {
32
+ destination: 'comment',
33
+ url: await git_gh_command.issue_comment(issue_number, text, repo),
34
+ }
35
+ }
36
+
37
+ const issue_body_or_comment = { post }
38
+
39
+ export { issue_body_or_comment }
40
+ export type { Destination, PostOutcome }
@@ -1,5 +1,3 @@
1
- #!/usr/bin/env tsx
2
- import { fileURLToPath } from 'node:url'
3
1
  import { git_gh_command } from '#scripts/gh/git-gh-command'
4
2
  import type { IssueRead } from '#scripts/gh/git-gh-issue-read'
5
3
  import { bounded_pool } from '#scripts/lib/bounded-pool'
@@ -24,7 +22,6 @@ import { issue_cite, type CiteTarget } from './issue-cite'
24
22
 
25
23
  const SUCCESS_EXIT_CODE = 0
26
24
  const FAILURE_EXIT_CODE = 1
27
- const ARGV_OFFSET = 2
28
25
  // The same bound `issue:read` puts on its batch read: every read is a `gh` process, and an unbounded
29
26
  // fan-out is answered with secondary rate limiting rather than with titles.
30
27
  const READ_CONCURRENCY = 8
@@ -160,10 +157,6 @@ async function run(args: ReadonlyArray<string>): Promise<number> {
160
157
  return report(cited)
161
158
  }
162
159
 
163
- async function main(args: ReadonlyArray<string>): Promise<void> {
164
- process.exitCode = await run(args)
165
- }
166
-
167
160
  const issue_cite_cli = {
168
161
  USAGE,
169
162
  cite,
@@ -171,6 +164,4 @@ const issue_cite_cli = {
171
164
  run,
172
165
  }
173
166
 
174
- if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
175
-
176
167
  export { issue_cite_cli }
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env tsx
2
+ import { fileURLToPath } from 'node:url'
3
+ import { issue_cite_cli } from './issue-cite-cli'
4
+
5
+ // The `josh issue:cite` entry, kept apart from `issue-cite-cli.ts` because other modules import that
6
+ // one: a bundle is one file, so a main guard there would fire for every command that carries it
7
+ // (joshuafolkken/kit#4186).
8
+ if (process.argv[1] === fileURLToPath(import.meta.url)) {
9
+ const ARGV_OFFSET = 2
10
+
11
+ process.exitCode = await issue_cite_cli.run(process.argv.slice(ARGV_OFFSET))
12
+ }
@@ -1,3 +1,4 @@
1
+ import { defect_origin_line } from './defect-origin-line'
1
2
  import { issue_bug_label } from './issue-bug-label'
2
3
  import { BREAKING_CHANGE_LABEL, BUG_LABEL, ENHANCEMENT_LABEL, has_label_name } from './issue-labels'
3
4
  import { markdown_section } from './markdown-section'
@@ -44,16 +45,20 @@ function bug_classification_problem(body: string): string | undefined {
44
45
  return undefined
45
46
  }
46
47
 
47
- function problems(body: string): ReadonlyArray<string> {
48
- const classification_problem = bug_classification_problem(body)
49
- const found: Array<string> = []
50
-
51
- if (classification_problem !== undefined) found.push(classification_problem)
48
+ function label_conflict(body: string): string | undefined {
52
49
  const labels = required_labels(body)
53
50
 
54
- if (labels.includes(BUG_LABEL) && labels.includes(ENHANCEMENT_LABEL)) found.push(CONFLICT)
51
+ return labels.includes(BUG_LABEL) && labels.includes(ENHANCEMENT_LABEL) ? CONFLICT : undefined
52
+ }
53
+
54
+ function problems(body: string): ReadonlyArray<string> {
55
+ const found = [
56
+ bug_classification_problem(body),
57
+ label_conflict(body),
58
+ defect_origin_line.problem(body),
59
+ ]
55
60
 
56
- return found
61
+ return found.filter((problem) => problem !== undefined)
57
62
  }
58
63
 
59
64
  const issue_classification = {
@@ -1,5 +1,3 @@
1
- #!/usr/bin/env tsx
2
- import { fileURLToPath } from 'node:url'
3
1
  import { git_gh_command } from '#scripts/gh/git-gh-command'
4
2
  import { issue_number_shape } from '#scripts/issue/issue-number-shape'
5
3
  import { cli_body } from '#scripts/josh/cli-body'
@@ -19,7 +17,6 @@ import { error_text } from '#scripts/lib/error-message'
19
17
 
20
18
  const SUCCESS_EXIT_CODE = 0
21
19
  const FAILURE_EXIT_CODE = 1
22
- const ARGV_OFFSET = 2
23
20
  const BODY_FLAG = '--body'
24
21
  const BODY_FILE_FLAG = '--body-file'
25
22
  const USAGE = `Usage: josh issue:comment <issue-number> ${BODY_FLAG} <text> | ${BODY_FILE_FLAG} <path>`
@@ -33,23 +30,12 @@ interface CommentRequest {
33
30
  // ignored. `cli_body.resolve` owns the both-flags-at-once refusal and the file read.
34
31
  const OPTIONS = { body: { type: 'string' }, 'body-file': { type: 'string' } } as const
35
32
 
36
- // The number is the one positional, and it must be a real issue number: a missing, malformed or
37
- // second one refuses the whole call rather than posting to some other issue.
38
- function single_issue_number(positionals: ReadonlyArray<string>): string | undefined {
39
- const [issue_number, ...rest] = positionals
40
- const is_single = rest.length === 0 && issue_number !== undefined
41
-
42
- return is_single && issue_number_shape.ISSUE_NUMBER_PATTERN.test(issue_number)
43
- ? issue_number
44
- : undefined
45
- }
46
-
47
33
  // `resolve` may throw when both body flags are given, which `run` reports — the message names the two
48
34
  // flags a caller must pick between.
49
35
  function parse_request(argv: ReadonlyArray<string>): CommentRequest | undefined {
50
36
  const parsed = cli_flags.arguments_of(argv, OPTIONS)
51
37
  if (parsed === undefined) return undefined
52
- const issue_number = single_issue_number(parsed.positionals)
38
+ const issue_number = issue_number_shape.single_of(parsed.positionals)
53
39
  if (issue_number === undefined) return undefined
54
40
 
55
41
  const body = cli_body.resolve({
@@ -67,11 +53,16 @@ function parse_request(argv: ReadonlyArray<string>): CommentRequest | undefined
67
53
  // A both-flags refusal and a file-read failure both surface as an `Error` from `resolve`, and its
68
54
  // message already names the flags or the resolved path — so it is printed as-is and `USAGE` is
69
55
  // withheld. `undefined` is the other refusal: a bad number or an empty body, which `USAGE` explains.
70
- function resolve_request(argv: ReadonlyArray<string>): CommentRequest | undefined {
56
+ // `usage` is the caller's: `run:park` parks with the same issue number and body, so it reads them here
57
+ // and prints its own usage on a refusal.
58
+ function resolve_request(
59
+ argv: ReadonlyArray<string>,
60
+ usage: string = USAGE,
61
+ ): CommentRequest | undefined {
71
62
  try {
72
63
  const request = parse_request(argv)
73
64
 
74
- if (request === undefined) console.error(USAGE)
65
+ if (request === undefined) console.error(usage)
75
66
 
76
67
  return request
77
68
  } catch (error) {
@@ -93,12 +84,7 @@ async function run(argv: ReadonlyArray<string>): Promise<number> {
93
84
  return SUCCESS_EXIT_CODE
94
85
  }
95
86
 
96
- async function main(argv: ReadonlyArray<string>): Promise<void> {
97
- process.exitCode = await run(argv)
98
- }
99
-
100
- const issue_comment_cli = { USAGE, run }
101
-
102
- if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
87
+ const issue_comment_cli = { USAGE, resolve_request, run }
103
88
 
89
+ export type { CommentRequest }
104
90
  export { issue_comment_cli }
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env tsx
2
+ import { fileURLToPath } from 'node:url'
3
+ import { issue_comment_cli } from './issue-comment-cli'
4
+
5
+ // The `josh issue:comment` entry, kept apart from `issue-comment-cli.ts` because other modules import
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 issue_comment_cli.run(process.argv.slice(ARGV_OFFSET))
12
+ }
@@ -0,0 +1,100 @@
1
+ import { git_gh_command } from '#scripts/gh/git-gh-command'
2
+ import { issue_number_shape } from '#scripts/issue/issue-number-shape'
3
+ import { cli_body } from '#scripts/josh/cli-body'
4
+ import { cli_flags } from '#scripts/lib/cli-flags'
5
+ import { error_text } from '#scripts/lib/error-message'
6
+ import { run_hold_cli } from '#scripts/run/hold/run-hold-cli'
7
+
8
+ // The shape every evidence exit shares — `josh issue:already-done` and `josh issue:measured`: the
9
+ // evidence comment, the exit's own finishing write, then the `run:release`, in that order.
10
+ //
11
+ // **The order is the point.** The finishing write without the comment is an uncited claim, so the
12
+ // comment goes first and each step runs only once the one before it landed — a failure stops there
13
+ // and names the step.
14
+
15
+ const FAILURE_EXIT_CODE = 1
16
+ const EVIDENCE_FILE_FLAG = '--evidence-file'
17
+ const OPTIONS = { 'evidence-file': { type: 'string' } } as const
18
+
19
+ interface EvidenceRequest {
20
+ issue_number: string
21
+ evidence: string
22
+ }
23
+
24
+ // `admit`, when given, runs once the request parsed and before the first write: an exit that does not
25
+ // fit the Issue refuses there, with nothing written.
26
+ interface EvidenceExit {
27
+ command: string
28
+ finish: (issue_number: string) => Promise<boolean>
29
+ admit?: (issue_number: string) => Promise<boolean>
30
+ }
31
+
32
+ // An evidence file that is empty or whitespace only is refused before anything is written: a comment
33
+ // with no citations is not the finding an exit is for. The throw carries the reason to `run`.
34
+ function parse_request(argv: ReadonlyArray<string>): EvidenceRequest | undefined {
35
+ const parsed = cli_flags.arguments_of(argv, OPTIONS)
36
+ if (parsed === undefined) return undefined
37
+ const issue_number = issue_number_shape.single_of(parsed.positionals)
38
+ const file_path = parsed.values['evidence-file']
39
+ if (issue_number === undefined || file_path === undefined) return undefined
40
+ const evidence = cli_body.read_file_or_stdin(file_path).trim()
41
+ if (evidence.length === 0) throw new Error(`Evidence file is empty: ${file_path}`)
42
+
43
+ return { issue_number, evidence }
44
+ }
45
+
46
+ // A file-read failure or an empty file is an `Error` naming the path, printed as-is; every other
47
+ // refusal is `undefined`, which the usage line explains.
48
+ function resolve_request(
49
+ argv: ReadonlyArray<string>,
50
+ command: string,
51
+ ): EvidenceRequest | undefined {
52
+ try {
53
+ const request = parse_request(argv)
54
+
55
+ if (request === undefined) {
56
+ console.error(`Usage: josh ${command} <issue-number> ${EVIDENCE_FILE_FLAG} <path>`)
57
+ }
58
+
59
+ return request
60
+ } catch (error) {
61
+ console.error(error_text.message_of(error))
62
+
63
+ return undefined
64
+ }
65
+ }
66
+
67
+ async function post_evidence(request: EvidenceRequest): Promise<boolean> {
68
+ try {
69
+ console.info(await git_gh_command.issue_comment(request.issue_number, request.evidence))
70
+
71
+ return true
72
+ } catch (error) {
73
+ console.error(`Evidence comment not posted: ${error_text.message_of(error)}`)
74
+
75
+ return false
76
+ }
77
+ }
78
+
79
+ // Each write runs only once the one before it landed: `&&` stops at the first that did not.
80
+ async function write_exit(request: EvidenceRequest, exit: EvidenceExit): Promise<boolean> {
81
+ return (await post_evidence(request)) && (await exit.finish(request.issue_number))
82
+ }
83
+
84
+ async function is_admitted(request: EvidenceRequest, exit: EvidenceExit): Promise<boolean> {
85
+ return exit.admit === undefined || (await exit.admit(request.issue_number))
86
+ }
87
+
88
+ async function run(argv: ReadonlyArray<string>, exit: EvidenceExit): Promise<number> {
89
+ const request = resolve_request(argv, exit.command)
90
+ if (request === undefined || !(await is_admitted(request, exit))) return FAILURE_EXIT_CODE
91
+
92
+ return (await write_exit(request, exit))
93
+ ? await run_hold_cli.run(['--release', request.issue_number])
94
+ : FAILURE_EXIT_CODE
95
+ }
96
+
97
+ const issue_evidence_exit = { run }
98
+
99
+ export type { EvidenceExit }
100
+ export { issue_evidence_exit }
@@ -14,20 +14,24 @@ import { repository_labels } from '#scripts/repo/repository-labels'
14
14
  import { run_event_filed } from '#scripts/run/event/run-event-filed'
15
15
  import { run_event_stream } from '#scripts/run/event/run-event-stream'
16
16
  import { run_event_stream_emit } from '#scripts/run/event/run-event-stream-emit'
17
+ import { run_hold_member } from '#scripts/run/hold/run-hold-member'
17
18
  import { issue_auto_ok } from './issue-auto-ok'
18
19
  import { issue_cite } from './issue-cite'
19
20
  import { issue_file, type FileArguments } from './issue-file'
20
21
  import { issue_file_fold } from './issue-file-fold'
21
22
  import { issue_lint_cli } from './issue-lint-cli'
23
+ import { issue_priority } from './issue-priority'
22
24
  import { issue_release_cli } from './issue-release-cli'
25
+ import { issue_sample_source } from './issue-sample-source'
23
26
  import { issue_scout_cli } from './issue-scout-cli'
24
27
  import { issue_wip } from './issue-wip'
25
28
 
26
- // `josh issue:file "<title>" --body-file <path> --depth <0|1|2> [--route <route>] [--label <name>]…
29
+ // `josh issue:file "<title>" --body-file <path> [--route <route>] [--label <name>]…
27
30
  // [--repo <owner/repo>] [--distinct <N,…>] [--over-cap] [--no-auto-ok] [--release]` — file an Issue
28
31
  // with every filing step run in order: the third-party refusal, the body
29
32
  // lint, the `## Origin` check for another repository, the `auto-ok` decision
30
- // with the run label it owes, the fold question against the run's earlier
33
+ // with the run label it owes, the start condition read as a pull request, the fold question against
34
+ // the run's earlier
31
35
  // filings, the WIP cap count, the
32
36
  // duplicate scout, the missing workflow labels created, the create call
33
37
  // carrying every label, the release link on `--release`, and `epic:bundle`.
@@ -37,7 +41,7 @@ const SUCCESS_EXIT_CODE = 0
37
41
  const FAILURE_EXIT_CODE = 1
38
42
  const ARGV_OFFSET = 2
39
43
  const USAGE =
40
- 'Usage: josh issue:file "<title>" --body-file <path> --depth <0|1|2> [--route <tier-a|split|interrupt|review-cap>] [--label <name>]… [--repo <owner/repo>] [--distinct <N,…>] [--over-cap] [--no-auto-ok] [--release]'
44
+ 'Usage: josh issue:file "<title>" --body-file <path> [--route <tier-a|split|interrupt|review-cap>] [--label <name>]… [--repo <owner/repo>] [--distinct <N,…>] [--over-cap] [--no-auto-ok] [--release]'
41
45
  const UNKNOWN_REPO_MESSAGE =
42
46
  'Could not read this repository from `git remote`, so the filing has no repository to compare against — check `gh auth status`.'
43
47
  const THIRD_PARTY_MESSAGE =
@@ -77,6 +81,7 @@ function refusals_of(filing: Filing): ReadonlyArray<string> {
77
81
  const problems = [
78
82
  ...issue_lint_cli.problems(filing.body),
79
83
  issue_auto_ok.declaration_problem(filing.body),
84
+ issue_priority.problem(filing.body, filing.args.labels),
80
85
  issue_file.origin_problem(filing.body, filing.target, filing.current),
81
86
  ]
82
87
 
@@ -223,8 +228,9 @@ async function place(url: string, target: string): Promise<void> {
223
228
  }
224
229
 
225
230
  // Every filing lands on the run's event stream: this is the one filing path, so
226
- // one append here reaches `run:board` from every route. A filing outside a run lands too and is left
227
- // out by the board's own scope to the invocation; the append is best-effort, as every emit is.
231
+ // one append here reaches `run:board` from every route. A filing outside a run lands too, unmarked as
232
+ // the run's (`run_hold_member`), and the board counts only the marked ones; the append is best-effort,
233
+ // as every emit is.
228
234
  async function record(url: string, filing: Filing, labels: ReadonlyArray<string>): Promise<void> {
229
235
  const number = String(issue_number_of(url))
230
236
  const reference = issue_cite.plain(
@@ -233,7 +239,9 @@ async function record(url: string, filing: Filing, labels: ReadonlyArray<string>
233
239
  )
234
240
  const found_during = await issue_file_fold.finder()
235
241
  const kind = run_event_filed.kind_of(labels)
236
- const text = run_event_filed.text_of({ reference, kind, title: filing.args.title, found_during })
242
+ const is_run = await run_hold_member.is_run_member()
243
+ const { title } = filing.args
244
+ const text = run_event_filed.text_of({ reference, kind, title, found_during, is_run })
237
245
 
238
246
  await run_event_stream_emit.emit(run_event_stream.EVENT_KIND.FILED, text)
239
247
  }
@@ -247,6 +255,20 @@ function is_admitted(filing: Filing): boolean {
247
255
  return false
248
256
  }
249
257
 
258
+ // The start condition's citation read against GitHub — after the local refusals, before any listing.
259
+ async function is_source_clear(filing: Filing): Promise<boolean> {
260
+ const is_here = issue_file.is_same_repository(filing.target, filing.current)
261
+ const problem = await issue_sample_source.problem(
262
+ filing.body,
263
+ is_here ? undefined : filing.target,
264
+ )
265
+
266
+ if (problem === undefined) return true
267
+ console.error(`✖ ${problem}`)
268
+
269
+ return false
270
+ }
271
+
250
272
  async function send(filing: Filing, labels: ReadonlyArray<string>): Promise<number> {
251
273
  const url = await create(filing, labels)
252
274
 
@@ -270,7 +292,7 @@ async function is_clear(filing: Filing): Promise<boolean> {
270
292
  }
271
293
 
272
294
  async function file(filing: Filing): Promise<number> {
273
- if (!is_admitted(filing)) return FAILURE_EXIT_CODE
295
+ if (!is_admitted(filing) || !(await is_source_clear(filing))) return FAILURE_EXIT_CODE
274
296
  const labels = labels_of(filing)
275
297
 
276
298
  if (labels === undefined || !(await is_clear(filing))) return FAILURE_EXIT_CODE