@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,65 @@
1
+ import { stamp_file } from '#scripts/josh/stamp-file'
2
+ import { run_halfrun_resume } from '#scripts/run/run-halfrun-resume'
3
+ import { run_label } from '#scripts/run/run-label'
4
+ import { run_hold } from './run-hold'
5
+
6
+ // `josh run:hold --adopt <N>` — a `new` run's hand-over once its Issue is filed (joshuafolkken/kit#4156).
7
+ // The unnumbered record is re-keyed in place to `<N>`, so every later stop of the run releases with
8
+ // `run:release <N>` and that release takes `in-progress` back off; the adopt applies the label the
9
+ // numbered entry would have. **In place, not released and re-claimed**: a release would free the tree
10
+ // for a moment another session could claim it in, and the record's owner and stop marks stay as written.
11
+
12
+ const ADOPTED = 'adopted'
13
+ // The tree holds no record, so there is nothing to hand over.
14
+ const NO_RECORD = 'none'
15
+ const FOREIGN = 'foreign'
16
+ const UNREADABLE = 'unreadable'
17
+
18
+ type AdoptResult = typeof ADOPTED | typeof FOREIGN | typeof NO_RECORD | typeof UNREADABLE
19
+
20
+ // The record re-keyed: the unnumbered run's own, or one already naming `<N>` — a repeated adopt is
21
+ // the same hand-over, so it answers alike. Another issue's record is never touched.
22
+ function rekey(target: string, issue: string): AdoptResult {
23
+ const read = run_hold.read_hold(target)
24
+
25
+ if (read.kind === 'unreadable') return UNREADABLE
26
+
27
+ const hold = run_halfrun_resume.hold_of(read)
28
+
29
+ if (hold === undefined) return NO_RECORD
30
+
31
+ if (hold.issue !== run_hold.UNNUMBERED_ISSUE && hold.issue !== issue) return FOREIGN
32
+
33
+ stamp_file.write_stamp(target, { ...hold, issue })
34
+
35
+ return ADOPTED
36
+ }
37
+
38
+ function no_record_message(issue: string): string {
39
+ return `run:hold --adopt: this tree holds no record to adopt — claim it with \`pnpm josh run:hold ${issue}\`.`
40
+ }
41
+
42
+ // Not the claim race's message: that one advises `--force`, which here would free another run's tree.
43
+ function foreign_message(issue: string): string {
44
+ return `run:hold --adopt: this tree is held for another issue, so it is not handed to issue ${issue}; \`--adopt\` only re-keys a \`new\` run's unnumbered record.`
45
+ }
46
+
47
+ async function adopt(target: string, issue: string): Promise<AdoptResult> {
48
+ const result = rekey(target, issue)
49
+
50
+ if (result === ADOPTED) await run_label.mark(issue)
51
+
52
+ return result
53
+ }
54
+
55
+ const run_hold_adopt = {
56
+ ADOPTED,
57
+ NO_RECORD,
58
+ UNREADABLE,
59
+ adopt,
60
+ foreign_message,
61
+ no_record_message,
62
+ }
63
+
64
+ export type { AdoptResult }
65
+ export { run_hold_adopt }
@@ -1,5 +1,3 @@
1
- #!/usr/bin/env tsx
2
- import { fileURLToPath } from 'node:url'
3
1
  import { issue_number_shape } from '#scripts/issue/issue-number-shape'
4
2
  import { run_cli_fault } from '#scripts/run/run-cli-fault'
5
3
  import { run_halfrun_resume } from '#scripts/run/run-halfrun-resume'
@@ -7,7 +5,10 @@ import { run_label } from '#scripts/run/run-label'
7
5
  import { run_preflight, type PreflightDecision } from '#scripts/run/run-preflight'
8
6
  import { run_prrun_resume } from '#scripts/run/run-prrun-resume'
9
7
  import { run_tidy_cli } from '#scripts/run/tidy/run-tidy-cli'
8
+ import { test_e2e_stamp } from '#scripts/test/test-e2e-stamp'
10
9
  import { run_hold, type HoldRead, type RunHold } from './run-hold'
10
+ import { run_hold_adopt } from './run-hold-adopt'
11
+ import { run_stop_notify } from './run-stop-notify'
11
12
 
12
13
  // `josh run:hold [<N>]` and `josh run:release [<N> | --force]` — the working-tree guard the typed
13
14
  // entry points ask before they start.
@@ -37,7 +38,6 @@ import { run_hold, type HoldRead, type RunHold } from './run-hold'
37
38
 
38
39
  const SUCCESS_EXIT_CODE = 0
39
40
  const FAILURE_EXIT_CODE = 1
40
- const ARGV_OFFSET = 2
41
41
  const RELEASE_FLAG = '--release'
42
42
  // What removes a record this run did not write. **Deliberate friction**: every release names the run
43
43
  // it belongs to, and the one act that cannot — clearing a record somebody else left behind — is
@@ -49,10 +49,14 @@ const FULLRUN_FLAG = '--fullrun'
49
49
  const HALFRUN_STOP_FLAG = '--halfrun-stop'
50
50
  // A `prrun`'s stop before merge: its record keeps the commit it stopped on.
51
51
  const PRRUN_STOP_FLAG = '--prrun-stop'
52
+ // A `needs-human-review` stop: marked as a `halfrun` stop is, with its own confirmation.
53
+ const HUMAN_REVIEW_STOP_FLAG = '--human-review-stop'
54
+ // A `new` run's hand-over of its unnumbered record to the Issue it filed (`run-hold-adopt.ts`).
55
+ const ADOPT_FLAG = '--adopt'
52
56
  // The most a claim reads: the issue number and the one flag after it.
53
57
  const MAX_CLAIM_ARGUMENTS = 2
54
58
  const USAGE =
55
- 'Usage: josh run:hold [<issue-number> [--fullrun | --halfrun-stop | --prrun-stop]] | josh run:release [<issue-number> | --force]'
59
+ 'Usage: josh run:hold [<issue-number> [--fullrun | --halfrun-stop | --human-review-stop | --prrun-stop]] | josh run:hold --adopt <issue-number> | josh run:release [<issue-number> | --force]'
56
60
 
57
61
  const COMMAND = 'run:hold'
58
62
 
@@ -64,10 +68,16 @@ const NONE_VERDICT = 'none'
64
68
  // The record is another run's, so nothing was removed. **It is not `none`**: a release that did not
65
69
  // happen must never read to a script as a tree it has just freed.
66
70
  const HELD_VERDICT = 'held'
71
+ // A stop before commit asked on a tree `josh test:e2e` has not answered green on: nothing was marked.
72
+ const E2E_OWED_VERDICT = 'e2e-owed'
67
73
 
68
74
  const FORCE_RELEASE_KIND = 'force-release'
69
75
  const HALFRUN_STOP_KIND = 'halfrun-stop'
76
+ const HUMAN_REVIEW_STOP_KIND = 'human-review-stop'
70
77
  const PRRUN_STOP_KIND = 'prrun-stop'
78
+ const ADOPT_KIND = 'adopt'
79
+
80
+ type StopKind = typeof HALFRUN_STOP_KIND | typeof HUMAN_REVIEW_STOP_KIND | typeof PRRUN_STOP_KIND
71
81
 
72
82
  interface ClaimRequest {
73
83
  kind: 'claim'
@@ -76,18 +86,25 @@ interface ClaimRequest {
76
86
  }
77
87
 
78
88
  interface StopRequest {
79
- kind: typeof HALFRUN_STOP_KIND | typeof PRRUN_STOP_KIND
89
+ kind: StopKind
80
90
  issue: string
81
91
  }
82
92
 
83
93
  type HoldRequest =
84
94
  | ClaimRequest
85
95
  | StopRequest
96
+ | { kind: typeof ADOPT_KIND; issue: string }
86
97
  | { kind: 'release'; claimant: string }
87
98
  | { kind: typeof FORCE_RELEASE_KIND }
88
99
 
100
+ const STOP_KINDS: ReadonlySet<string> = new Set([
101
+ HALFRUN_STOP_KIND,
102
+ HUMAN_REVIEW_STOP_KIND,
103
+ PRRUN_STOP_KIND,
104
+ ])
105
+
89
106
  function is_stop_request(request: HoldRequest): request is StopRequest {
90
- return request.kind === HALFRUN_STOP_KIND || request.kind === PRRUN_STOP_KIND
107
+ return STOP_KINDS.has(request.kind)
91
108
  }
92
109
 
93
110
  const FORCE_RELEASE_REQUEST: HoldRequest = { kind: FORCE_RELEASE_KIND }
@@ -96,14 +113,14 @@ function release_request(claimant: string): HoldRequest {
96
113
  return { kind: 'release', claimant }
97
114
  }
98
115
 
99
- const STOP_KIND_BY_FLAG: ReadonlyMap<string, typeof HALFRUN_STOP_KIND | typeof PRRUN_STOP_KIND> =
100
- new Map([
101
- [HALFRUN_STOP_FLAG, HALFRUN_STOP_KIND],
102
- [PRRUN_STOP_FLAG, PRRUN_STOP_KIND],
103
- ])
116
+ const STOP_KIND_BY_FLAG: ReadonlyMap<string, StopKind> = new Map([
117
+ [HALFRUN_STOP_FLAG, HALFRUN_STOP_KIND],
118
+ [HUMAN_REVIEW_STOP_FLAG, HUMAN_REVIEW_STOP_KIND],
119
+ [PRRUN_STOP_FLAG, PRRUN_STOP_KIND],
120
+ ])
104
121
 
105
- // The flag after a numbered claim: absent, `--fullrun`, `--halfrun-stop` or `--prrun-stop`. Anything
106
- // else is a usage error.
122
+ // The flag after a numbered claim: absent, `--fullrun`, `--halfrun-stop`, `--human-review-stop` or
123
+ // `--prrun-stop`. Anything else is a usage error.
107
124
  function numbered_claim(issue: string, flag: string | undefined): HoldRequest | undefined {
108
125
  if (flag === undefined) return { kind: 'claim', issue }
109
126
 
@@ -142,9 +159,21 @@ function parse_release(argv: ReadonlyArray<string>): HoldRequest | undefined {
142
159
  return argv.length > 1 ? undefined : parse_release_argument(first)
143
160
  }
144
161
 
162
+ function parse_adopt(argv: ReadonlyArray<string>): HoldRequest | undefined {
163
+ const [issue] = argv
164
+
165
+ if (issue === undefined || argv.length > 1) return undefined
166
+
167
+ return issue_number_shape.ISSUE_NUMBER_PATTERN.test(issue)
168
+ ? { kind: ADOPT_KIND, issue }
169
+ : undefined
170
+ }
171
+
145
172
  function parse_request(argv: ReadonlyArray<string>): HoldRequest | undefined {
146
173
  if (argv[0] === RELEASE_FLAG) return parse_release(argv.slice(1))
147
174
 
175
+ if (argv[0] === ADOPT_FLAG) return parse_adopt(argv.slice(1))
176
+
148
177
  return parse_claim(argv)
149
178
  }
150
179
 
@@ -339,25 +368,73 @@ function report_usage(): number {
339
368
  return FAILURE_EXIT_CODE
340
369
  }
341
370
 
371
+ const SEND_BY_KIND: Readonly<Record<StopKind, (target: string, issue: string) => Promise<void>>> = {
372
+ [HALFRUN_STOP_KIND]: run_stop_notify.send_halfrun,
373
+ [HUMAN_REVIEW_STOP_KIND]: run_stop_notify.send_human_review,
374
+ [PRRUN_STOP_KIND]: run_stop_notify.send_prrun,
375
+ }
376
+
342
377
  // **A `halfrun` stop marks its own record** — the positive "this run has ended over its verified diff"
343
- // that `run:entry` adopts on `fullrun #N`. Another run's record is left alone. A `prrun` stop marks
344
- // its record the same way, with the commit it stopped on.
378
+ // that `run:entry` adopts on `fullrun #N`. Another run's record is left alone. A `needs-human-review`
379
+ // stop is the same mark, since its resume is `halfrun`'s. A `prrun` stop marks its record the same
380
+ // way, with the commit it stopped on. **A marked stop then sends its own `confirmation`**
381
+ // (`run-stop-notify.ts`), after the mark, since the mark rewrites the record its send is stamped on.
382
+ async function marked_stop(target: string, request: StopRequest): Promise<number> {
383
+ await SEND_BY_KIND[request.kind](target, request.issue)
384
+
385
+ return report_hold()
386
+ }
387
+
388
+ // **A stop before commit has no CI E2E job behind it**, so it is refused until `josh test:e2e` has
389
+ // answered green on this exact tree (`test-e2e-stamp.ts`). A `prrun` stop has a pull request, and CI's.
390
+ async function e2e_refusal(request: StopRequest): Promise<number | undefined> {
391
+ if (request.kind === PRRUN_STOP_KIND || (await test_e2e_stamp.is_current_tree())) return undefined
392
+
393
+ return report(
394
+ 'run:hold: `pnpm josh test:e2e` has not answered green on this tree — run it, then mark the stop again.',
395
+ E2E_OWED_VERDICT,
396
+ FAILURE_EXIT_CODE,
397
+ )
398
+ }
399
+
345
400
  async function mark_stop(target: string, request: StopRequest): Promise<number> {
401
+ const refusal = await e2e_refusal(request)
402
+
403
+ if (refusal !== undefined) return refusal
404
+
346
405
  const mark =
347
406
  request.kind === PRRUN_STOP_KIND
348
407
  ? await run_prrun_resume.mark_stop_at(target, request.issue)
349
408
  : run_halfrun_resume.mark_stop_at(target, request.issue)
350
409
 
351
- if (mark === run_halfrun_resume.MARKED) return report_hold()
410
+ if (mark === run_halfrun_resume.MARKED) return await marked_stop(target, request)
352
411
 
353
412
  if (mark === run_halfrun_resume.UNREADABLE) return report_unreadable_record()
354
413
 
355
414
  return report_busy(run_hold.race_message(run_hold.read_hold(target), target))
356
415
  }
357
416
 
417
+ // The re-keyed record answers `hold`; no record answers `none` and another issue's `busy`, each a
418
+ // failure, since the run asking holds nothing it can stop on.
419
+ async function adopt(target: string, issue: string): Promise<number> {
420
+ const result = await run_hold_adopt.adopt(target, issue)
421
+
422
+ if (result === run_hold_adopt.ADOPTED) return report_hold()
423
+
424
+ if (result === run_hold_adopt.UNREADABLE) return report_unreadable_record()
425
+
426
+ if (result === run_hold_adopt.NO_RECORD) {
427
+ return report(run_hold_adopt.no_record_message(issue), NONE_VERDICT, FAILURE_EXIT_CODE)
428
+ }
429
+
430
+ return report(run_hold_adopt.foreign_message(issue), BUSY_VERDICT, FAILURE_EXIT_CODE)
431
+ }
432
+
358
433
  async function dispatch(request: HoldRequest, target: string, is_linked: boolean): Promise<number> {
359
434
  if (request.kind === 'claim') return await claim(target, request, is_linked)
360
435
 
436
+ if (request.kind === ADOPT_KIND) return await adopt(target, request.issue)
437
+
361
438
  if (is_stop_request(request)) return await mark_stop(target, request)
362
439
 
363
440
  if (request.kind === FORCE_RELEASE_KIND) return force_release(target)
@@ -392,10 +469,6 @@ async function run(argv: ReadonlyArray<string>): Promise<number> {
392
469
  }
393
470
  }
394
471
 
395
- async function main(argv: ReadonlyArray<string>): Promise<void> {
396
- process.exitCode = await run(argv)
397
- }
398
-
399
472
  const run_hold_cli = {
400
473
  BUSY_VERDICT,
401
474
  HELD_VERDICT,
@@ -408,6 +481,4 @@ const run_hold_cli = {
408
481
  run,
409
482
  }
410
483
 
411
- if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
412
-
413
484
  export { run_hold_cli }
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env tsx
2
+ import { fileURLToPath } from 'node:url'
3
+ import { run_hold_cli } from './run-hold-cli'
4
+
5
+ // The `josh run:hold` and `josh run:release` entry, kept apart from `run-hold-cli.ts` because other
6
+ // modules import that one: a bundle is one file, so a main guard there would fire for every command
7
+ // that carries it (joshuafolkken/kit#4186).
8
+ if (process.argv[1] === fileURLToPath(import.meta.url)) {
9
+ const ARGV_OFFSET = 2
10
+
11
+ process.exitCode = await run_hold_cli.run(process.argv.slice(ARGV_OFFSET))
12
+ }
@@ -0,0 +1,37 @@
1
+ import { lane_child_marker } from '#scripts/lane/lane-child-marker'
2
+ import { run_hold, type RunHold, type SessionOwner } from './run-hold'
3
+ import { run_hold_session } from './run-hold-session'
4
+
5
+ // Whether this session is one of a run's own (joshuafolkken/kit#4099): a lane child, or the session
6
+ // holding the run's hold on this working tree. The run's event stream is the repository's, so a
7
+ // session outside the run — a question answered beside a `backlogrun` — writes to it too, and what it
8
+ // files is not the run's.
9
+ //
10
+ // **Unknown is outside.** Unlike the `Stop` hook's question (`run-hold-session.ts`), a hold or a session
11
+ // with no owner recorded is not this session's: counting another session's filing as the run's is the
12
+ // failure this answers.
13
+
14
+ function is_owned(hold: RunHold, owner: SessionOwner): boolean {
15
+ if (hold.owner_pid === undefined || owner.owner_pid === undefined) return false
16
+
17
+ return run_hold_session.is_session_hold(hold, owner)
18
+ }
19
+
20
+ async function is_hold_owner(owner: SessionOwner): Promise<boolean> {
21
+ const directory = await run_hold.worktree_directory()
22
+ if (directory === undefined) return false
23
+
24
+ const read = run_hold.read_hold(run_hold.hold_path(directory))
25
+
26
+ return read.kind === 'held' && is_owned(read.hold, owner)
27
+ }
28
+
29
+ async function is_run_member(owner: SessionOwner = run_hold.session_owner()): Promise<boolean> {
30
+ if (lane_child_marker.marked_issue() !== undefined) return true
31
+
32
+ return await is_hold_owner(owner)
33
+ }
34
+
35
+ const run_hold_member = { is_run_member }
36
+
37
+ export { run_hold_member }
@@ -0,0 +1,46 @@
1
+ import { stamp_file } from '#scripts/josh/stamp-file'
2
+ import { run_halfrun_resume } from '#scripts/run/run-halfrun-resume'
3
+ import { run_hold, type RunHold, type SessionOwner } from './run-hold'
4
+
5
+ // What the `Stop` hook asks of a hold beyond "is one in place" (joshuafolkken/kit#3961): whether it is
6
+ // this session's own run's, and whether its pause was already announced.
7
+ //
8
+ // **Another run's hold is not this session's pause.** A `kickoff`, or a question answered while a
9
+ // `backlogrun` parent holds the same tree, stops in a session that holds nothing — announcing that stop
10
+ // as the held run's "confirmation required" reports a decision nobody is waiting on.
11
+ //
12
+ // **Unknown is this session's own.** A record written outside an agent session, or a hook that cannot
13
+ // read its own session, keeps the behavior the hold had before ownership was recorded: a missed notify
14
+ // costs a person a silent pause, a wrong one only a needless Telegram.
15
+
16
+ function is_same_start(recorded: string | undefined, own: string | undefined): boolean {
17
+ return recorded === undefined || own === undefined || recorded === own
18
+ }
19
+
20
+ function is_session_hold(hold: RunHold, owner: SessionOwner = run_hold.session_owner()): boolean {
21
+ if (hold.owner_pid === undefined || owner.owner_pid === undefined) return true
22
+
23
+ return hold.owner_pid === owner.owner_pid && is_same_start(hold.owner_start, owner.owner_start)
24
+ }
25
+
26
+ // **A pause is announced once, and a person's prompt ends it.** The hook's own send is recorded on the
27
+ // hold, so a later stop of the same pause — a background notice that woke the session — finds it; a send before `pause_start` belongs to an earlier pause. An unknown start
28
+ // announces again: a needless Telegram costs less than a silent wait.
29
+ function is_notified_since(hold: RunHold, pause_start: string | undefined): boolean {
30
+ if (pause_start === undefined || hold.notified_at === undefined) return false
31
+
32
+ return Date.parse(hold.notified_at) >= Date.parse(pause_start)
33
+ }
34
+
35
+ // Stamps the send on the record in place; a tree no longer held has nothing to stamp. A stale record is
36
+ // stamped too: the hook reads it as the hold (`hold_of`), so a run past the expiry age still finds its send.
37
+ function mark_notified(target: string, now: Date = new Date()): void {
38
+ const hold = run_halfrun_resume.hold_of(run_hold.read_hold(target, now))
39
+ if (hold === undefined) return
40
+
41
+ stamp_file.write_stamp(target, { ...hold, notified_at: now.toISOString() })
42
+ }
43
+
44
+ const run_hold_session = { is_notified_since, is_session_hold, mark_notified }
45
+
46
+ export { run_hold_session }
@@ -65,6 +65,10 @@ interface RunHold {
65
65
  // fields, or by a claim made outside an agent session.
66
66
  owner_pid?: number | undefined
67
67
  owner_start?: string | undefined
68
+ // When the `Stop` hook last sent this run's `confirmation` Telegram — its own send leaves no command
69
+ // on the transcript, so the record is what keeps one pause from being announced twice
70
+ // (`run-hold-session.ts`).
71
+ notified_at?: string | undefined
68
72
  }
69
73
 
70
74
  type HoldRead =
@@ -107,6 +111,7 @@ const run_hold_schema = z.object({
107
111
  prrun_stop_head: z.string().optional(),
108
112
  owner_pid: z.number().optional(),
109
113
  owner_start: z.string().optional(),
114
+ notified_at: z.string().optional(),
110
115
  })
111
116
 
112
117
  // `undefined` for anything that is not a well-formed record, so the caller decides what a broken one
@@ -342,6 +347,7 @@ const run_hold = {
342
347
  race_message,
343
348
  read_hold,
344
349
  release_hold,
350
+ session_owner,
345
351
  stale_message,
346
352
  uncommitted_message,
347
353
  unknown_message,
@@ -350,5 +356,5 @@ const run_hold = {
350
356
  write_hold,
351
357
  }
352
358
 
353
- export type { HoldRead, RunHold, StopMarkFields }
359
+ export type { HoldRead, RunHold, SessionOwner, StopMarkFields }
354
360
  export { run_hold }
@@ -0,0 +1,183 @@
1
+ import { git_gh_issue_read } from '#scripts/gh/git-gh-issue-read'
2
+ import { git_gh_pr_read } from '#scripts/gh/git-gh-pr-read'
3
+ import { git_gh_repo } from '#scripts/gh/git-gh-repo'
4
+ import { git_command } from '#scripts/git/git-command'
5
+ import { issue_cite } from '#scripts/issue/issue-cite'
6
+ import { stdout_on_stderr } from '#scripts/lib/stdout-on-stderr'
7
+ import { telegram_test } from '#scripts/notify/telegram-test'
8
+ import type { CliValues } from '#scripts/notify/telegram-test-logic'
9
+ import { run_stage } from '#scripts/run/run-stage'
10
+ import { run_hold_session } from './run-hold-session'
11
+
12
+ // The `confirmation` a `halfrun`, `needs-human-review` or `prrun` stop sends from `josh run:hold
13
+ // --halfrun-stop` / `--human-review-stop` / `--prrun-stop` (joshuafolkken/kit#4135, #4156): every line is fixed once the Issue, its title and the pull
14
+ // request are known, so it is composed here rather than copied from prose. The send goes through
15
+ // `josh notify`'s own call and is stamped on the hold, so the `Stop` hook's own confirmation
16
+ // (`stop-actions.ts`) finds the pause announced and does not send it again.
17
+ //
18
+ // **A failed send does not fail the stop**: the mark is written, and an unstamped hold is exactly what
19
+ // lets the `Stop` hook send the confirmation in its place.
20
+
21
+ const TITLE_PLACEHOLDER = '<title>'
22
+ const PR_PLACEHOLDER = '<pr-url>'
23
+ const HALFRUN = 'halfrun'
24
+ const PRRUN = 'prrun'
25
+ // Single quotes expand nothing, so a title stays one argument whatever it carries; its own `'` closes
26
+ // the quote, emits an escaped one and reopens.
27
+ const QUOTE = "'"
28
+
29
+ interface StopFacts {
30
+ issue: string
31
+ title: string | undefined
32
+ issue_url: string | undefined
33
+ pr_url?: string | undefined
34
+ }
35
+
36
+ interface Composed {
37
+ values: CliValues
38
+ title: string | undefined
39
+ }
40
+
41
+ function single_quoted(text: string): string {
42
+ return QUOTE + text.replaceAll(QUOTE, String.raw`'\''`) + QUOTE
43
+ }
44
+
45
+ // Plain, not linked: every line is a command a person copies out of the Telegram.
46
+ function reference_of(facts: StopFacts): string {
47
+ return issue_cite.plain(facts.issue)
48
+ }
49
+
50
+ function commit_title(facts: StopFacts): string {
51
+ return single_quoted(`${facts.title ?? TITLE_PLACEHOLDER} ${reference_of(facts)}`)
52
+ }
53
+
54
+ function with_urls(values: CliValues, facts: StopFacts): CliValues {
55
+ const with_issue =
56
+ facts.issue_url === undefined ? values : { ...values, 'issue-url': facts.issue_url }
57
+
58
+ return facts.pr_url === undefined ? with_issue : { ...with_issue, 'pr-url': facts.pr_url }
59
+ }
60
+
61
+ function halfrun_values(facts: StopFacts): CliValues {
62
+ const title = commit_title(facts)
63
+ const body = [
64
+ 'halfrun ready for manual verification',
65
+ run_stage.next_line(HALFRUN, facts.issue),
66
+ `Without an agent: pnpm josh git -y ${title} && pnpm josh followup ${title}`,
67
+ ].join('\n')
68
+ const values: CliValues = {
69
+ 'task-type': 'confirmation',
70
+ body,
71
+ recommended: `Verify by hand, then prrun ${reference_of(facts)}`,
72
+ alternative: [`fullrun ${reference_of(facts)}`],
73
+ }
74
+
75
+ return with_urls(values, facts)
76
+ }
77
+
78
+ // A `needs-human-review` stop resumes as `halfrun`'s does, so its next line is `halfrun`'s; the lane
79
+ // directory is named because the uncommitted work a person must look at lives only there.
80
+ function human_review_values(facts: StopFacts, directory: string): CliValues {
81
+ const body = [
82
+ 'needs-human-review: implemented and gated, stopped before the commit',
83
+ run_stage.next_line(HALFRUN, facts.issue),
84
+ `Working tree: ${directory}`,
85
+ ].join('\n')
86
+ const values: CliValues = {
87
+ 'task-type': 'confirmation',
88
+ body,
89
+ recommended: `Review the working tree, then prrun ${reference_of(facts)}`,
90
+ alternative: [`fullrun ${reference_of(facts)}`],
91
+ }
92
+
93
+ return with_urls(values, facts)
94
+ }
95
+
96
+ function prrun_values(facts: StopFacts): CliValues {
97
+ const body = [
98
+ `prrun ready to merge: ${facts.pr_url ?? PR_PLACEHOLDER}`,
99
+ run_stage.next_line(PRRUN, facts.issue),
100
+ `After a manual merge, without an agent: pnpm josh followup ${commit_title(facts)}`,
101
+ ].join('\n')
102
+ const values: CliValues = {
103
+ 'task-type': 'confirmation',
104
+ body,
105
+ recommended: `fullrun ${reference_of(facts)}`,
106
+ alternative: ['Merge by hand, then pnpm josh followup'],
107
+ }
108
+
109
+ return with_urls(values, facts)
110
+ }
111
+
112
+ async function issue_facts(issue: string): Promise<StopFacts> {
113
+ const slug = await git_gh_repo.repo_get_name_with_owner()
114
+ const title = await git_gh_issue_read.issue_get_title(issue)
115
+
116
+ return {
117
+ issue,
118
+ title,
119
+ issue_url: slug === undefined ? undefined : issue_cite.issue_url(slug, issue),
120
+ }
121
+ }
122
+
123
+ async function prrun_facts(issue: string): Promise<StopFacts> {
124
+ const pr_url = await git_gh_pr_read.pr_get_url(await git_command.branch())
125
+
126
+ return { ...(await issue_facts(issue)), pr_url }
127
+ }
128
+
129
+ // The title is passed with the values, so the send does not read it a second time.
130
+ async function send_composed(target: string, compose: () => Promise<Composed>): Promise<void> {
131
+ const { values, title } = await compose()
132
+ const titled = title === undefined ? values : { ...values, 'issue-title': title }
133
+
134
+ await stdout_on_stderr.run(async () => {
135
+ await telegram_test.send_values(titled)
136
+ })
137
+ run_hold_session.mark_notified(target)
138
+ }
139
+
140
+ // A `gh` read that fails is a send that did not happen, never a failed stop: the mark is already written.
141
+ async function send(target: string, compose: () => Promise<Composed>): Promise<void> {
142
+ try {
143
+ await send_composed(target, compose)
144
+ } catch (error) {
145
+ console.error(`⚠️ run:hold could not send the stop confirmation: ${String(error)}`)
146
+ }
147
+ }
148
+
149
+ async function send_halfrun(target: string, issue: string): Promise<void> {
150
+ await send(target, async () => {
151
+ const facts = await issue_facts(issue)
152
+
153
+ return { values: halfrun_values(facts), title: facts.title }
154
+ })
155
+ }
156
+
157
+ async function send_prrun(target: string, issue: string): Promise<void> {
158
+ await send(target, async () => {
159
+ const facts = await prrun_facts(issue)
160
+
161
+ return { values: prrun_values(facts), title: facts.title }
162
+ })
163
+ }
164
+
165
+ async function send_human_review(target: string, issue: string): Promise<void> {
166
+ await send(target, async () => {
167
+ const facts = await issue_facts(issue)
168
+ const directory = await git_command.repository_root()
169
+
170
+ return { values: human_review_values(facts, directory), title: facts.title }
171
+ })
172
+ }
173
+
174
+ const run_stop_notify = {
175
+ halfrun_values,
176
+ human_review_values,
177
+ prrun_values,
178
+ send_halfrun,
179
+ send_human_review,
180
+ send_prrun,
181
+ }
182
+
183
+ export { run_stop_notify }
@@ -0,0 +1,32 @@
1
+ import { setPriority } from 'node:os'
2
+
3
+ // **A launched session runs below the interactive one, so a saturated machine still answers the
4
+ // user.** Every headless session and everything it starts — gates, tests, builds — used to share the
5
+ // interactive session's priority, and at a load of ~30 the lanes took the terminal's responsiveness
6
+ // with them (#3947). The niceness is set on the child right after `spawn` returns: a process inherits
7
+ // its parent's niceness at fork, and an agent CLI boots for far longer than this takes before it forks
8
+ // anything, so every descendant inherits it. Efficiency-core confinement (`taskpolicy -b`) is not
9
+ // used — it throttles a lane far beyond yielding to the user.
10
+ const LANE_NICENESS = 10
11
+
12
+ type SetPriority = (pid: number, priority: number) => void
13
+
14
+ // **A priority that cannot be lowered starts the session as before.** A platform without the call, or
15
+ // a child that already runs at a lower priority than this, is not a reason to fail the launch.
16
+ function lower(pid: number | undefined, set_priority: SetPriority = setPriority): void {
17
+ if (pid === undefined) return
18
+
19
+ try {
20
+ set_priority(pid, LANE_NICENESS)
21
+ } catch {
22
+ // the session keeps the priority it was started with
23
+ }
24
+ }
25
+
26
+ const launch_priority = {
27
+ LANE_NICENESS,
28
+ lower,
29
+ }
30
+
31
+ export type { SetPriority }
32
+ export { launch_priority }
@@ -0,0 +1,31 @@
1
+ import { issue_cite } from '#scripts/issue/issue-cite'
2
+ import { telegram_notify } from '#scripts/notify/telegram-notify'
3
+ import { run_event_stream } from '#scripts/run/event/run-event-stream'
4
+ import { run_event_stream_emit } from '#scripts/run/event/run-event-stream-emit'
5
+
6
+ // A returned child whose session could not authenticate (joshuafolkken/kit#4216). Nothing is counted
7
+ // and no label is touched — the child keeps `in-progress`, so it resumes once a person runs `/login` —
8
+ // and the run stops, since every child dispatched before that fails the same way. The stop is pushed
9
+ // as a `confirmation`: `/login` is a person's to run, and the driver's own stop notice names no cause.
10
+ // Script-emitted, so English.
11
+
12
+ const RECOVERY =
13
+ 'If this did not arrive, `pnpm josh run:wake --list` relays the last progress line.'
14
+
15
+ async function stop(child: string): Promise<void> {
16
+ const cite = issue_cite.plain(child)
17
+ const text = `${cite} could not authenticate — run /login, then resume it`
18
+
19
+ await run_event_stream_emit.emit(run_event_stream.EVENT_KIND.OUTAGE, text)
20
+ await telegram_notify.confirm({
21
+ issue_title: 'backlogrun stopped: Claude authentication failed',
22
+ body: `${text}. The child stays in-progress and was neither parked nor counted as a failure.`,
23
+ recovery: RECOVERY,
24
+ recommended: `Run /login, then run backlogrun again to resume ${cite}`,
25
+ alternatives: ['Leave the backlog stopped until a later session'],
26
+ })
27
+ }
28
+
29
+ const run_merge_auth = { stop }
30
+
31
+ export { run_merge_auth }