@joshuafolkken/kit 1.1229.0 → 1.1370.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 (939) hide show
  1. package/.claude/agents/investigator.md +1 -0
  2. package/.claude/settings.json +4 -0
  3. package/.claude/skills/dependency-update/SKILL.md +5 -3
  4. package/.claude/skills/epic-commands/SKILL.md +82 -113
  5. package/.claude/skills/epic-commands/epic-bundle.md +38 -63
  6. package/.claude/skills/epic-commands/execution-waves.md +30 -51
  7. package/.claude/skills/verify-ui/SKILL.md +13 -20
  8. package/.claude/skills/workflow-commands/SKILL.md +10 -10
  9. package/.claude/skills/workflow-commands/background-commands.md +4 -4
  10. package/.claude/skills/workflow-commands/backlogrun-child.md +30 -105
  11. package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +29 -0
  12. package/.claude/skills/workflow-commands/backlogrun-lanes.md +45 -131
  13. package/.claude/skills/workflow-commands/backlogrun-park.md +36 -53
  14. package/.claude/skills/workflow-commands/backlogrun-progress.md +81 -331
  15. package/.claude/skills/workflow-commands/backlogrun-recovery.md +29 -83
  16. package/.claude/skills/workflow-commands/backlogrun-steps.md +105 -424
  17. package/.claude/skills/workflow-commands/backlogrun.md +50 -61
  18. package/.claude/skills/workflow-commands/chain-rule.md +36 -40
  19. package/.claude/skills/workflow-commands/entry-sequence.md +6 -6
  20. package/.claude/skills/workflow-commands/followup.md +24 -20
  21. package/.claude/skills/workflow-commands/fullrun-steps.md +23 -27
  22. package/.claude/skills/workflow-commands/fullrun.md +10 -10
  23. package/.claude/skills/workflow-commands/halfrun.md +9 -8
  24. package/.claude/skills/workflow-commands/into-target.md +12 -18
  25. package/.claude/skills/workflow-commands/issue-comments.md +11 -26
  26. package/.claude/skills/workflow-commands/kickoff.md +27 -16
  27. package/.claude/skills/workflow-commands/latest-gate.md +18 -29
  28. package/.claude/skills/workflow-commands/needs-human-review.md +13 -24
  29. package/.claude/skills/workflow-commands/observation-filing.md +37 -28
  30. package/.claude/skills/workflow-commands/observation-ledger.md +48 -38
  31. package/.claude/skills/workflow-commands/pre-gate-cut.md +9 -9
  32. package/.claude/skills/workflow-commands/prerequisite.md +23 -15
  33. package/.claude/skills/workflow-commands/progress-watcher.md +17 -11
  34. package/.claude/skills/workflow-commands/prrun.md +3 -3
  35. package/.claude/skills/workflow-commands/retrospective.md +13 -18
  36. package/.claude/skills/workflow-commands/split-assessment.md +6 -4
  37. package/.claude/skills/workflow-commands/target-repository.md +25 -28
  38. package/.claude/skills/workflow-commands/working-tree-hold.md +11 -17
  39. package/.gitattributes +2 -1
  40. package/.github/workflows/ci.yml +14 -0
  41. package/.github/workflows/publish.yml +2 -0
  42. package/.vscode/tasks.json +14 -0
  43. package/CLAUDE.md +10 -61
  44. package/README.md +38 -57
  45. package/SECURITY.md +1 -1
  46. package/dist/CLAUDE.md +10 -61
  47. package/dist/commands/document-section-cli.js +42 -10
  48. package/dist/config-merge/index.js +11 -2
  49. package/dist/hooks/audit-provision.js +2 -2
  50. package/dist/hooks/batch-guard.js +7 -7
  51. package/dist/hooks/{chunk-FIVDHQGT.js → chunk-43G45XJF.js} +18 -20
  52. package/dist/hooks/{chunk-JUDKDCDP.js → chunk-4TW4MQUL.js} +284 -362
  53. package/dist/hooks/{chunk-5VMKCCC4.js → chunk-76RK6E3H.js} +13 -11
  54. package/dist/hooks/{chunk-RNWHN5BP.js → chunk-DZWZ3DKY.js} +4 -4
  55. package/dist/hooks/{chunk-5VNDSNG3.js → chunk-FZ6FUSBM.js} +1 -1
  56. package/dist/hooks/{chunk-VC3PZPZO.js → chunk-GG72ANKI.js} +1 -1
  57. package/dist/hooks/{chunk-6HJJXRBX.js → chunk-KPM4YIIX.js} +8 -44
  58. package/dist/hooks/chunk-MXVQMLDP.js +3705 -0
  59. package/dist/hooks/{chunk-ELCN5LCH.js → chunk-NEC4AT4Z.js} +34 -12
  60. package/dist/hooks/{chunk-TQNPDZNH.js → chunk-NZBHG6FW.js} +7 -5
  61. package/dist/hooks/chunk-NZN2UFI6.js +2409 -0
  62. package/dist/hooks/{chunk-F56MFS4B.js → chunk-R6CRQEAL.js} +4 -4
  63. package/dist/hooks/chunk-SYSRHRWU.js +1589 -0
  64. package/dist/hooks/{chunk-55HHG5PX.js → chunk-TLJYAGZK.js} +799 -903
  65. package/dist/hooks/chunk-Z5TMJIPW.js +45 -0
  66. package/dist/hooks/codex-hook-adapter.js +26 -21
  67. package/dist/hooks/duplicate-read-guard.js +8 -8
  68. package/dist/hooks/format-edited.js +4 -4
  69. package/dist/hooks/inputs.json +213 -197
  70. package/dist/hooks/investigation-guard.js +8 -8
  71. package/dist/hooks/pretool-guard.js +15 -15
  72. package/dist/hooks/session-lang.js +406 -8
  73. package/dist/hooks/stop-guard.js +122 -201
  74. package/dist/josh.js +540 -137
  75. package/dist/version/index.js +15 -13
  76. package/eslint/base.js +43 -5
  77. package/eslint/rules/english-only-prose.js +3 -3
  78. package/eslint/rules/import.js +12 -0
  79. package/eslint/rules/namespace-object-export.js +2 -2
  80. package/package.json +16 -10
  81. package/pnpm-workspace.yaml +2 -4
  82. package/prompts/coding-standards.md +14 -48
  83. package/prompts/collaboration-workflow/file-edits.md +1 -1
  84. package/prompts/collaboration-workflow/issue-citation.md +1 -1
  85. package/prompts/collaboration-workflow/issue-template.md +4 -10
  86. package/prompts/collaboration-workflow/operating-rules.md +7 -8
  87. package/prompts/collaboration-workflow/output-bounds.md +1 -1
  88. package/prompts/collaboration-workflow/overview.md +1 -1
  89. package/prompts/collaboration-workflow/plan-comment.md +2 -1
  90. package/prompts/collaboration-workflow/principles.md +21 -3
  91. package/prompts/collaboration-workflow/report-format.md +16 -29
  92. package/prompts/collaboration-workflow/residency.md +1 -1
  93. package/prompts/collaboration-workflow/rule-delivery.md +7 -95
  94. package/prompts/collaboration-workflow/shell-body.md +3 -23
  95. package/prompts/collaboration-workflow/turn-batching.md +4 -13
  96. package/prompts/collaboration-workflow/wip-cap.md +5 -11
  97. package/prompts/refactoring.md +1 -1
  98. package/prompts/review-rubric.md +3 -22
  99. package/prompts/review.md +15 -38
  100. package/prompts/testing-guide.md +2 -4
  101. package/scripts/adopt/adopt-logic.ts +5 -5
  102. package/scripts/adopt/adopt-toolkits.ts +4 -5
  103. package/scripts/adopt/adopt.ts +2 -3
  104. package/scripts/agent/agent-argv.ts +7 -7
  105. package/scripts/agent/agent-diagnostics.ts +2 -2
  106. package/scripts/agent/agent-exit-record.ts +1 -1
  107. package/scripts/agent/agent-headless.ts +1 -1
  108. package/scripts/agent/agent-launch-environment.ts +6 -1
  109. package/scripts/agent/agent-role-profile.ts +49 -22
  110. package/scripts/agent/agent-session-role.ts +32 -0
  111. package/scripts/agent/api-outage.ts +1 -1
  112. package/scripts/agent/claude-agent-argv.ts +4 -4
  113. package/scripts/agent/claude-result-event.ts +4 -4
  114. package/scripts/agent/codex-hooks.ts +2 -2
  115. package/scripts/agent/interactive-ask.ts +3 -6
  116. package/scripts/auto-ok/auto-ok-cli.ts +46 -60
  117. package/scripts/backlog/backlog-arrival-added.ts +34 -0
  118. package/scripts/backlog/backlog-arrival.ts +54 -17
  119. package/scripts/backlog/backlog-budget-cli.ts +34 -6
  120. package/scripts/backlog/backlog-budget.ts +17 -24
  121. package/scripts/backlog/backlog-defect-priority.ts +1 -1
  122. package/scripts/backlog/backlog-drive-args.ts +5 -4
  123. package/scripts/backlog/backlog-drive-cli.ts +14 -10
  124. package/scripts/backlog/backlog-drive-epic.ts +85 -0
  125. package/scripts/backlog/backlog-drive-launch.ts +1 -1
  126. package/scripts/backlog/backlog-drive-named-offer.ts +60 -9
  127. package/scripts/backlog/backlog-drive-named.ts +39 -9
  128. package/scripts/backlog/backlog-drive-offer-argv.ts +1 -1
  129. package/scripts/backlog/backlog-drive-restore.ts +1 -1
  130. package/scripts/backlog/backlog-drive-retrospective.ts +2 -2
  131. package/scripts/backlog/backlog-drive.ts +43 -28
  132. package/scripts/backlog/backlog-idle.ts +88 -0
  133. package/scripts/backlog/backlog-named.ts +11 -15
  134. package/scripts/backlog/backlog-next.ts +26 -30
  135. package/scripts/backlog/backlog-offer-cli.ts +28 -23
  136. package/scripts/backlog/backlog-offer.ts +7 -7
  137. package/scripts/backlog/backlog-overlap.ts +178 -0
  138. package/scripts/backlog/backlog-plan-cli.ts +14 -90
  139. package/scripts/backlog/backlog-plan-read.ts +111 -0
  140. package/scripts/backlog/backlog-plan.ts +11 -10
  141. package/scripts/backlog/backlog-pool.ts +13 -14
  142. package/scripts/backlog/backlog-rank.ts +11 -11
  143. package/scripts/backlog/backlog-ready.ts +15 -10
  144. package/scripts/backlog/backlog-scope.ts +14 -15
  145. package/scripts/backlog/backlog-stalled-cli.ts +2 -2
  146. package/scripts/backlog/backlog-stalled-detect.ts +4 -4
  147. package/scripts/backlog/backlog-stalled.ts +5 -6
  148. package/scripts/backlog/backlog-waves.ts +4 -4
  149. package/scripts/backlog/backlogrun-args.ts +74 -0
  150. package/scripts/backlog/backlogrun-cli.ts +113 -0
  151. package/scripts/backlog/backlogrun-launch.ts +178 -0
  152. package/scripts/behavior/behavior-assertion.ts +6 -8
  153. package/scripts/behavior/behavior-cli.ts +1 -1
  154. package/scripts/behavior/behavior-rules.ts +3 -3
  155. package/scripts/build/build-claude-md.ts +4 -4
  156. package/scripts/build/build-codex-hooks.ts +2 -2
  157. package/scripts/build/build-commands.ts +1 -1
  158. package/scripts/build/build-hooks.ts +5 -5
  159. package/scripts/build/build.ts +1 -1
  160. package/scripts/build/hook-bundle-stamp.ts +109 -7
  161. package/scripts/build/local-bin.ts +2 -2
  162. package/scripts/cases/cases-cli.ts +1 -1
  163. package/scripts/cases/cases-logic.ts +2 -2
  164. package/scripts/ci/composite-actions.ts +1 -2
  165. package/scripts/ci/pr-classification.ts +2 -2
  166. package/scripts/claude/workflow-destination.ts +1 -1
  167. package/scripts/clone/clone-aggregate.ts +1 -1
  168. package/scripts/clone/clone-fingerprint.ts +1 -1
  169. package/scripts/clone/clone-scan-cli.ts +1 -1
  170. package/scripts/clone/clone-scan.ts +1 -1
  171. package/scripts/config-merge/index.ts +1 -1
  172. package/scripts/config-merge/json-format.ts +1 -3
  173. package/scripts/config-merge/patch-json-array.ts +90 -0
  174. package/scripts/config-merge/patch-json-key.ts +6 -3
  175. package/scripts/config-merge/patch-json-list.ts +1 -1
  176. package/scripts/cost-runtime/codex-usage.ts +1 -1
  177. package/scripts/cost-runtime/context-cut-payback.ts +4 -5
  178. package/scripts/cost-runtime/context-cut-threshold.ts +4 -6
  179. package/scripts/cost-runtime/cost-attribute.ts +3 -3
  180. package/scripts/cost-runtime/cost-blocks.ts +3 -4
  181. package/scripts/cost-runtime/cost-cli.ts +14 -11
  182. package/scripts/cost-runtime/cost-corpus.ts +11 -11
  183. package/scripts/cost-runtime/cost-pricing.ts +4 -4
  184. package/scripts/cost-runtime/cost-tokens.ts +1 -2
  185. package/scripts/cost-runtime/cost-transcript.ts +29 -29
  186. package/scripts/cost-runtime/cost-usage.ts +6 -7
  187. package/scripts/cost-runtime/cost-verdict.ts +10 -11
  188. package/scripts/cost-runtime/own-session.ts +1 -1
  189. package/scripts/cost-runtime/transcript-cwd.ts +2 -2
  190. package/scripts/delegation/delegation-cli.ts +4 -4
  191. package/scripts/delegation/delegation-policy.ts +13 -15
  192. package/scripts/delegation/duplicate-read-guard.ts +9 -10
  193. package/scripts/delegation/fanout-cli.ts +1 -1
  194. package/scripts/delegation/fanout.ts +1 -1
  195. package/scripts/delegation/investigation-guard.ts +18 -22
  196. package/scripts/delegation/investigation-reads.ts +48 -238
  197. package/scripts/discovery/repo-discovery.ts +1 -1
  198. package/scripts/discovery/repo-map-logic.ts +1 -2
  199. package/scripts/discovery/repo-origin.ts +3 -3
  200. package/scripts/discovery/repo-party-cli.ts +2 -2
  201. package/scripts/discovery/repo-party.ts +2 -2
  202. package/scripts/doctor/doctor-consumer.ts +1 -1
  203. package/scripts/doctor/doctor-io.ts +6 -7
  204. package/scripts/doctor/doctor-logic.ts +1 -1
  205. package/scripts/doctor/doctor-ports.ts +1 -1
  206. package/scripts/doctor/doctor.ts +8 -9
  207. package/scripts/document/backlogrun-parent-read-set.ts +5 -6
  208. package/scripts/document/bash-output-cap.ts +5 -7
  209. package/scripts/document/capped-print-part.ts +1 -1
  210. package/scripts/document/capped-print.ts +1 -1
  211. package/scripts/document/document-byte-budget.ts +33 -64
  212. package/scripts/document/document-byte-check.ts +4 -4
  213. package/scripts/document/document-reachability.ts +7 -8
  214. package/scripts/document/document-read-cli.ts +2 -2
  215. package/scripts/document/document-scan.ts +26 -2
  216. package/scripts/document/document-section-cli.ts +6 -8
  217. package/scripts/document/document-section.ts +8 -12
  218. package/scripts/document/edit-files-cli.ts +3 -4
  219. package/scripts/document/entry-read-budget.ts +8 -70
  220. package/scripts/document/entry-read-set.ts +51 -34
  221. package/scripts/document/lane-child-read-set.ts +9 -9
  222. package/scripts/document/read-files-cli.ts +1 -2
  223. package/scripts/document/read-set-cli.ts +16 -19
  224. package/scripts/document/read-set-cost.ts +4 -4
  225. package/scripts/document/read-set-point-of-use.ts +28 -38
  226. package/scripts/document/read-set-pricing.ts +1 -1
  227. package/scripts/document/read-set-trim.ts +3 -3
  228. package/scripts/document/resident-budget.ts +8 -10
  229. package/scripts/epic/epic-add-body.ts +15 -18
  230. package/scripts/epic/epic-add-plan.ts +26 -28
  231. package/scripts/epic/epic-add.ts +32 -25
  232. package/scripts/epic/epic-audit-checks.ts +27 -37
  233. package/scripts/epic/epic-audit-cli.ts +21 -22
  234. package/scripts/epic/epic-audit-orphans.ts +16 -17
  235. package/scripts/epic/epic-audit-rationale.ts +10 -15
  236. package/scripts/epic/epic-audit-report.ts +2 -5
  237. package/scripts/epic/epic-audit.ts +18 -14
  238. package/scripts/epic/epic-body.ts +10 -10
  239. package/scripts/epic/epic-bundle-cli.ts +36 -34
  240. package/scripts/epic/epic-bundle-evidence.ts +5 -5
  241. package/scripts/epic/epic-bundle-gaps.ts +6 -9
  242. package/scripts/epic/epic-bundle-poll.ts +1 -1
  243. package/scripts/epic/epic-bundle-referenced.ts +11 -14
  244. package/scripts/epic/epic-bundle.ts +19 -20
  245. package/scripts/epic/epic-busy.ts +44 -21
  246. package/scripts/epic/epic-candidate-confirm.ts +15 -18
  247. package/scripts/epic/epic-chains.ts +18 -23
  248. package/scripts/epic/epic-classify.ts +11 -12
  249. package/scripts/epic/epic-cli-argv.ts +5 -6
  250. package/scripts/epic/epic-cli-remove.ts +9 -4
  251. package/scripts/epic/epic-cli.ts +38 -26
  252. package/scripts/epic/epic-close-comment.ts +14 -15
  253. package/scripts/epic/epic-close.ts +25 -29
  254. package/scripts/epic/epic-cross-repo.ts +18 -21
  255. package/scripts/epic/epic-decision.ts +14 -18
  256. package/scripts/epic/epic-fetch.ts +25 -31
  257. package/scripts/epic/epic-graph.ts +15 -17
  258. package/scripts/epic/epic-index.ts +14 -16
  259. package/scripts/epic/epic-issue.ts +9 -11
  260. package/scripts/epic/epic-label-age.ts +74 -0
  261. package/scripts/epic/epic-lane-offer.ts +35 -24
  262. package/scripts/epic/epic-nested.ts +1 -1
  263. package/scripts/epic/epic-next-read.ts +8 -8
  264. package/scripts/epic/epic-next-views.ts +12 -12
  265. package/scripts/epic/epic-next.ts +29 -33
  266. package/scripts/epic/epic-outside-blocker.ts +11 -10
  267. package/scripts/epic/epic-parse.ts +22 -24
  268. package/scripts/epic/epic-promote.ts +3 -2
  269. package/scripts/epic/epic-rank.ts +1 -1
  270. package/scripts/epic/epic-read.ts +10 -8
  271. package/scripts/epic/epic-reconcile.ts +8 -6
  272. package/scripts/epic/epic-reference.ts +5 -4
  273. package/scripts/epic/epic-relation-recheck.ts +10 -11
  274. package/scripts/epic/epic-relations.ts +9 -8
  275. package/scripts/epic/epic-remove-plan.ts +4 -5
  276. package/scripts/epic/epic-remove.ts +7 -5
  277. package/scripts/epic/epic-report.ts +18 -20
  278. package/scripts/epic/epic-run.ts +6 -5
  279. package/scripts/epic/epic-sections.ts +2 -2
  280. package/scripts/epic/epic-shape.ts +3 -3
  281. package/scripts/epic/epic-solo-stale.ts +3 -2
  282. package/scripts/epic/epic-solo.ts +8 -8
  283. package/scripts/epic/epic-triage.ts +5 -4
  284. package/scripts/epic/epic-validate.ts +8 -7
  285. package/scripts/epic/epic.ts +5 -5
  286. package/scripts/exports/unused-members-cli.ts +1 -1
  287. package/scripts/followup/followup-issue-number.ts +1 -2
  288. package/scripts/followup/git-followup-cleanup.ts +6 -7
  289. package/scripts/followup/git-followup-finish.ts +11 -13
  290. package/scripts/followup/git-followup-flush.ts +11 -7
  291. package/scripts/followup/git-followup-issue-close.ts +16 -13
  292. package/scripts/followup/git-followup-label.ts +9 -6
  293. package/scripts/followup/git-followup-merged.ts +1 -1
  294. package/scripts/followup/git-followup-pending.ts +7 -9
  295. package/scripts/followup/git-followup-stages.ts +28 -17
  296. package/scripts/followup/git-followup-workflow.ts +19 -21
  297. package/scripts/followup/git-pr-followup-checks.ts +13 -20
  298. package/scripts/followup/git-pr-followup-wrapup.ts +7 -7
  299. package/scripts/followup/git-pr-followup.ts +18 -17
  300. package/scripts/gate/core-admission.ts +162 -0
  301. package/scripts/gate/core-budget.ts +134 -91
  302. package/scripts/gate/gate-ledger.ts +114 -0
  303. package/scripts/gate/gate-log.ts +7 -9
  304. package/scripts/gate/gate-plan.ts +103 -35
  305. package/scripts/gate/gate-report.ts +39 -21
  306. package/scripts/gate/gate-skip.ts +11 -13
  307. package/scripts/gate/gate-steps.ts +5 -1
  308. package/scripts/gate/gate-tree.ts +3 -4
  309. package/scripts/gate/hook-gate-reuse.ts +9 -9
  310. package/scripts/gate/machine-capacity.ts +313 -0
  311. package/scripts/gate/pre-commit-type-check.ts +4 -4
  312. package/scripts/gate/project-checks.ts +12 -4
  313. package/scripts/gate/scoped-green.ts +11 -18
  314. package/scripts/gate/type-check-command.ts +2 -2
  315. package/scripts/gate/type-check-step.ts +4 -4
  316. package/scripts/gate/verification-gate.ts +60 -53
  317. package/scripts/gh/gh-spawn.ts +2 -2
  318. package/scripts/gh/git-ai-review-scan.ts +3 -2
  319. package/scripts/gh/git-gh-api-path.ts +10 -11
  320. package/scripts/gh/git-gh-exec.ts +43 -48
  321. package/scripts/gh/git-gh-failure.ts +6 -9
  322. package/scripts/gh/git-gh-helpers.ts +1 -1
  323. package/scripts/gh/git-gh-issue-list.ts +15 -19
  324. package/scripts/gh/git-gh-issue-read.ts +43 -60
  325. package/scripts/gh/git-gh-issue-rest.ts +14 -15
  326. package/scripts/gh/git-gh-issue-write.ts +52 -40
  327. package/scripts/gh/git-gh-issue.ts +23 -24
  328. package/scripts/gh/git-gh-pr-auto-merge.ts +3 -3
  329. package/scripts/gh/git-gh-pr-read.ts +46 -50
  330. package/scripts/gh/git-gh-pr-rest.ts +23 -26
  331. package/scripts/gh/git-gh-pr-review.ts +2 -2
  332. package/scripts/gh/git-gh-pr-rollup.ts +4 -4
  333. package/scripts/gh/git-gh-pr-snapshot.ts +8 -10
  334. package/scripts/gh/git-gh-pr.ts +16 -16
  335. package/scripts/gh/git-gh-reachability.ts +11 -12
  336. package/scripts/gh/git-gh-repo.ts +2 -3
  337. package/scripts/gh/git-gh-rest-state.ts +1 -1
  338. package/scripts/gh/git-pr-ai-review.ts +6 -5
  339. package/scripts/gh/git-pr-checks-eval.ts +28 -30
  340. package/scripts/gh/git-pr-checks-parse.ts +14 -16
  341. package/scripts/gh/git-pr-checks-watch.ts +17 -17
  342. package/scripts/gh/git-pr-checks.ts +20 -23
  343. package/scripts/gh/git-pr-coderabbit.ts +8 -6
  344. package/scripts/gh/git-pr-confirmation.ts +5 -5
  345. package/scripts/gh/git-pr-managed-config.ts +7 -9
  346. package/scripts/gh/git-pr-messages.ts +1 -1
  347. package/scripts/gh/git-pr.ts +15 -16
  348. package/scripts/gh/github-issue-url.ts +8 -9
  349. package/scripts/git/base-tree.ts +66 -0
  350. package/scripts/git/change-base.ts +42 -2
  351. package/scripts/git/changed-file-scope.ts +5 -5
  352. package/scripts/git/changed-paths.ts +1 -2
  353. package/scripts/git/constants.ts +2 -2
  354. package/scripts/git/git-branch.ts +1 -1
  355. package/scripts/git/git-closes-keyword.ts +3 -3
  356. package/scripts/git/git-command.ts +53 -41
  357. package/scripts/git/git-common-directory.ts +3 -3
  358. package/scripts/git/git-diff-reads.ts +14 -15
  359. package/scripts/git/git-error.ts +1 -1
  360. package/scripts/git/git-execa-error.ts +1 -2
  361. package/scripts/git/git-issue.ts +10 -8
  362. package/scripts/git/git-location-environment.ts +3 -4
  363. package/scripts/git/git-ls-remote.ts +6 -8
  364. package/scripts/git/git-pre-push-hook.ts +11 -10
  365. package/scripts/git/git-preflight.ts +5 -5
  366. package/scripts/git/git-push-transport.ts +2 -2
  367. package/scripts/git/git-remote-branch.ts +1 -2
  368. package/scripts/git/git-schemas.ts +16 -23
  369. package/scripts/git/git-spawn-sync.ts +1 -1
  370. package/scripts/git/git-spawn.ts +37 -14
  371. package/scripts/git/git-ssh-keepalive.ts +12 -5
  372. package/scripts/git/git-staging.ts +7 -8
  373. package/scripts/git/git-workflow.ts +1 -1
  374. package/scripts/git/git-worktree.ts +35 -27
  375. package/scripts/git/gone-branch.ts +2 -2
  376. package/scripts/git/listing-cutoff.ts +1 -2
  377. package/scripts/git/lockfile-sync.ts +65 -0
  378. package/scripts/git/main-merge-guard.ts +1 -2
  379. package/scripts/git/main-merge.ts +7 -7
  380. package/scripts/git/main-sync.ts +23 -8
  381. package/scripts/git/parse-json-array.ts +18 -23
  382. package/scripts/git/repository-lock.ts +34 -2
  383. package/scripts/git/stash/git-stash.ts +4 -5
  384. package/scripts/git/stash/stash-orphans.ts +5 -3
  385. package/scripts/git/stash/stash-pop-args.ts +1 -1
  386. package/scripts/git/stash/stash-pop-cli.ts +3 -3
  387. package/scripts/git/stash/stash-sweep-lock.ts +2 -2
  388. package/scripts/hooks/batch-guard.ts +11 -13
  389. package/scripts/hooks/check-commit-message.ts +12 -9
  390. package/scripts/hooks/codex-hook-adapter.ts +16 -10
  391. package/scripts/hooks/edited-cspell.ts +3 -4
  392. package/scripts/hooks/format-edited-cli.ts +1 -1
  393. package/scripts/hooks/format-edited-file.ts +11 -17
  394. package/scripts/hooks/format-rewrite-notice.ts +19 -17
  395. package/scripts/hooks/pre-push-unit.ts +10 -14
  396. package/scripts/hooks/pretool-guard-cli.ts +4 -4
  397. package/scripts/hooks/pretool-guard.ts +93 -18
  398. package/scripts/hooks/reserved-run.ts +2 -2
  399. package/scripts/hooks/step-zero-notice.ts +1 -1
  400. package/scripts/hooks/stop-guard.ts +21 -10
  401. package/scripts/init/basic-path-migration.ts +2 -2
  402. package/scripts/init/claude-kit-only-settings.ts +2 -2
  403. package/scripts/init/claude-plugin-config.ts +2 -2
  404. package/scripts/init/distributed-paths.ts +4 -4
  405. package/scripts/init/hook-command-rewrite.ts +3 -3
  406. package/scripts/init/hook-launch.ts +5 -5
  407. package/scripts/init/init-actions.ts +13 -0
  408. package/scripts/init/init-ai-copy.ts +11 -11
  409. package/scripts/init/init-bootstrap.ts +3 -3
  410. package/scripts/init/init-copy-content.ts +4 -4
  411. package/scripts/init/init-logic-json-merge.ts +7 -9
  412. package/scripts/init/init-logic-migrate.ts +1 -1
  413. package/scripts/init/init-logic-templates.ts +1 -1
  414. package/scripts/init/init-logic-workspace.ts +4 -4
  415. package/scripts/init/init-logic-yaml-merge.ts +2 -2
  416. package/scripts/init/init-logic.ts +19 -22
  417. package/scripts/init/init.ts +12 -8
  418. package/scripts/init/kit-base-preset.ts +1 -1
  419. package/scripts/init/kit-setup-state.ts +1 -1
  420. package/scripts/init/kit-written-paths.ts +1 -2
  421. package/scripts/init/package-manager-pin.ts +35 -0
  422. package/scripts/init/project-profile-cli.ts +1 -1
  423. package/scripts/init/project-profile.ts +3 -3
  424. package/scripts/init/session-language-environment.ts +1 -1
  425. package/scripts/init/start-exec.ts +3 -4
  426. package/scripts/init/start-plan.ts +2 -2
  427. package/scripts/init/start-setup-pr.ts +3 -2
  428. package/scripts/init/start-steps.ts +2 -2
  429. package/scripts/init/tsconfig-preset-migration.ts +1 -1
  430. package/scripts/init/vscode-tasks.ts +62 -0
  431. package/scripts/issue/baseline-measure.ts +2 -2
  432. package/scripts/issue/behavior-change-lint.ts +2 -2
  433. package/scripts/issue/defect-rate-cli.ts +6 -7
  434. package/scripts/issue/defect-rate.ts +37 -27
  435. package/scripts/issue/git-next-issues.ts +9 -8
  436. package/scripts/issue/issue-auto-ok.ts +49 -11
  437. package/scripts/issue/issue-backlinks-cli.ts +5 -5
  438. package/scripts/issue/issue-backlinks.ts +6 -6
  439. package/scripts/issue/issue-cite-cli.ts +20 -18
  440. package/scripts/issue/issue-cite.ts +18 -8
  441. package/scripts/issue/issue-closing-pr.ts +4 -4
  442. package/scripts/issue/issue-comment-cli.ts +6 -4
  443. package/scripts/issue/issue-file-cli.ts +75 -15
  444. package/scripts/issue/issue-file-fold.ts +155 -0
  445. package/scripts/issue/issue-file.ts +14 -6
  446. package/scripts/issue/issue-fold-cli.ts +14 -9
  447. package/scripts/issue/issue-fold.ts +23 -8
  448. package/scripts/issue/issue-labels.ts +46 -37
  449. package/scripts/issue/issue-lint-cli.ts +2 -2
  450. package/scripts/issue/issue-lint.ts +1 -1
  451. package/scripts/issue/issue-merged.ts +10 -4
  452. package/scripts/issue/issue-number-shape.ts +27 -0
  453. package/scripts/issue/issue-rank.ts +1 -1
  454. package/scripts/issue/issue-read-cli.ts +4 -5
  455. package/scripts/issue/issue-read.ts +4 -5
  456. package/scripts/issue/issue-reference.ts +5 -5
  457. package/scripts/issue/issue-release-cli.ts +165 -0
  458. package/scripts/issue/issue-release.ts +58 -0
  459. package/scripts/issue/issue-report-failures.ts +7 -4
  460. package/scripts/issue/issue-scout-cli.ts +11 -11
  461. package/scripts/issue/issue-scout-closed.ts +4 -4
  462. package/scripts/issue/issue-scout.ts +4 -5
  463. package/scripts/issue/issue-state-cli.ts +17 -10
  464. package/scripts/issue/issue-state.ts +12 -13
  465. package/scripts/issue/issue-wip.ts +7 -7
  466. package/scripts/issue/markdown-section.ts +3 -3
  467. package/scripts/issue/measure-rerun-cli.ts +10 -9
  468. package/scripts/issue/reproduction-measure.ts +3 -3
  469. package/scripts/issue/session-cite.ts +56 -0
  470. package/scripts/josh/agent-session-environment.ts +10 -8
  471. package/scripts/josh/cli-body.ts +2 -2
  472. package/scripts/josh/command-suggest.ts +1 -1
  473. package/scripts/josh/file-map-stamp.ts +20 -23
  474. package/scripts/josh/hook-decision.ts +24 -28
  475. package/scripts/josh/josh-command-map.ts +4 -1
  476. package/scripts/josh/josh-command-types.ts +32 -34
  477. package/scripts/josh/josh-commands-ai.ts +6 -6
  478. package/scripts/josh/josh-commands-backlog.ts +15 -3
  479. package/scripts/josh/josh-commands-clone.ts +1 -1
  480. package/scripts/josh/josh-commands-development.ts +33 -4
  481. package/scripts/josh/josh-commands-document.ts +3 -3
  482. package/scripts/josh/josh-commands-guard.ts +3 -3
  483. package/scripts/josh/josh-commands-issue.ts +11 -5
  484. package/scripts/josh/josh-commands-lane.ts +16 -5
  485. package/scripts/josh/josh-commands-lint.ts +1 -1
  486. package/scripts/josh/josh-commands-maintenance.ts +2 -2
  487. package/scripts/josh/josh-commands-run.ts +20 -6
  488. package/scripts/josh/josh-commands-split.ts +1 -2
  489. package/scripts/josh/josh-commands-versioning.ts +5 -5
  490. package/scripts/josh/josh-commands-workflow.ts +30 -22
  491. package/scripts/josh/josh-environment-file.ts +1 -1
  492. package/scripts/josh/josh-in-process.ts +3 -3
  493. package/scripts/josh/josh-logic.ts +10 -10
  494. package/scripts/josh/josh-run.ts +3 -3
  495. package/scripts/josh/josh-verdict.ts +9 -12
  496. package/scripts/josh/josh.ts +3 -3
  497. package/scripts/josh/kit-only.ts +2 -2
  498. package/scripts/josh/path-decision.ts +3 -3
  499. package/scripts/josh/platform-temporary.ts +7 -5
  500. package/scripts/josh/process-identity.ts +24 -6
  501. package/scripts/josh/process-owner.ts +4 -4
  502. package/scripts/josh/session-language-cli.ts +53 -11
  503. package/scripts/josh/session-language.ts +1 -1
  504. package/scripts/josh/stamp-file.ts +48 -29
  505. package/scripts/josh/stamp-record.ts +57 -0
  506. package/scripts/lane/lane-await.ts +35 -11
  507. package/scripts/lane/lane-cache.ts +6 -6
  508. package/scripts/lane/lane-capacity.ts +32 -17
  509. package/scripts/lane/lane-child-invocation.ts +17 -15
  510. package/scripts/lane/lane-child-marker.ts +12 -12
  511. package/scripts/lane/lane-cli.ts +20 -13
  512. package/scripts/lane/lane-close.ts +6 -6
  513. package/scripts/lane/lane-dispatch.ts +61 -72
  514. package/scripts/lane/lane-environment.ts +5 -5
  515. package/scripts/lane/lane-guard-policy.ts +7 -21
  516. package/scripts/lane/lane-handoff.ts +2 -2
  517. package/scripts/lane/lane-install.ts +9 -10
  518. package/scripts/lane/lane-launch-cli.ts +13 -8
  519. package/scripts/lane/lane-ledger.ts +73 -11
  520. package/scripts/lane/lane-leftover.ts +44 -30
  521. package/scripts/lane/lane-limit-cli.ts +160 -0
  522. package/scripts/lane/lane-limit-override.ts +74 -0
  523. package/scripts/lane/lane-load.ts +19 -68
  524. package/scripts/lane/lane-measure-cli.ts +15 -25
  525. package/scripts/lane/lane-occupancy.ts +6 -4
  526. package/scripts/lane/lane-open.ts +25 -24
  527. package/scripts/lane/lane-output.ts +4 -3
  528. package/scripts/lane/lane-paths.ts +22 -8
  529. package/scripts/lane/lane-phase.ts +33 -0
  530. package/scripts/lane/lane-reap.ts +2 -2
  531. package/scripts/lane/lane-registry.ts +27 -15
  532. package/scripts/lane/lane-relaunch.ts +9 -9
  533. package/scripts/lane/lane-report.ts +5 -4
  534. package/scripts/lane/lane-resume.ts +2 -2
  535. package/scripts/lane/lane-sampler.ts +55 -0
  536. package/scripts/lane/lane-seed.ts +7 -7
  537. package/scripts/lane/lane-stage-stats.ts +135 -0
  538. package/scripts/lane/lane-start-point.ts +8 -11
  539. package/scripts/lane/lane-stats.ts +60 -15
  540. package/scripts/lane/lane-stray.ts +140 -0
  541. package/scripts/lane/lane-vacant.ts +1 -1
  542. package/scripts/lane/openai-lane-supervisor-decision.ts +3 -7
  543. package/scripts/lane/openai-lane-supervisor-owner.ts +3 -9
  544. package/scripts/lane/openai-review-broker.ts +2 -4
  545. package/scripts/lib/ancestor-directories.ts +1 -1
  546. package/scripts/lib/bounded-pool.ts +2 -2
  547. package/scripts/lib/buffered-process.ts +4 -6
  548. package/scripts/lib/caddy-logs.sh +0 -0
  549. package/scripts/lib/cli-flags.ts +39 -6
  550. package/scripts/lib/error-message.ts +1 -1
  551. package/scripts/lib/json-value.ts +17 -3
  552. package/scripts/lib/poll.ts +1 -1
  553. package/scripts/lib/status-icons.ts +3 -3
  554. package/scripts/lib/timed-fetch.ts +1 -1
  555. package/scripts/lib/timeouts.ts +1 -1
  556. package/scripts/lines/bytes-command.ts +3 -4
  557. package/scripts/lines/effective-limit.ts +25 -12
  558. package/scripts/lines/line-budget.ts +47 -55
  559. package/scripts/lines/line-targets.ts +6 -2
  560. package/scripts/lines/lines-command.ts +3 -3
  561. package/scripts/lint/cspell-cached.ts +1 -1
  562. package/scripts/lint/cycle-recheck.ts +122 -0
  563. package/scripts/lint/format.ts +1 -2
  564. package/scripts/lint/lint-parallel.ts +34 -19
  565. package/scripts/lint/lint-related-scope.ts +25 -15
  566. package/scripts/lint/lint-related.ts +6 -7
  567. package/scripts/managed-marker/index.ts +1 -1
  568. package/scripts/managed-marker/managed-marker-logic.ts +1 -2
  569. package/scripts/notify/git-notify.ts +9 -7
  570. package/scripts/notify/telegram-notify.ts +53 -37
  571. package/scripts/notify/telegram-test-logic.ts +3 -3
  572. package/scripts/notify/telegram-test.ts +45 -30
  573. package/scripts/observations/observation-ledger-home.ts +14 -8
  574. package/scripts/observations/observation-ledger-line.ts +3 -2
  575. package/scripts/observations/observation-ledger-migrate.ts +3 -4
  576. package/scripts/observations/observation-ledger-prepare.ts +4 -4
  577. package/scripts/observations/observation-ledger.ts +14 -15
  578. package/scripts/observations/observation-record-cli.ts +83 -0
  579. package/scripts/observations/observation-record.ts +91 -0
  580. package/scripts/observations/observations-flush-cli.ts +1 -1
  581. package/scripts/observations/observations-flush-landing.ts +7 -6
  582. package/scripts/observations/observations-flush.ts +26 -27
  583. package/scripts/overrides/overrides-check.ts +18 -8
  584. package/scripts/package/package-scout-cli.ts +1 -1
  585. package/scripts/package/package-scout-format.ts +2 -2
  586. package/scripts/package/package-scout.ts +1 -1
  587. package/scripts/propagate/propagate-git-failure.ts +1 -1
  588. package/scripts/propagate/propagate-git.ts +7 -7
  589. package/scripts/propagate/propagate-plan.ts +2 -2
  590. package/scripts/propagate/propagate-publish.ts +2 -3
  591. package/scripts/propagate/propagate-run.ts +5 -7
  592. package/scripts/propagate/propagate-select.ts +1 -1
  593. package/scripts/propagate/propagate-steps.ts +19 -20
  594. package/scripts/propagate/propagate-targets.ts +6 -10
  595. package/scripts/propagate/propagate.ts +5 -5
  596. package/scripts/refactor/import-graph.ts +1 -1
  597. package/scripts/refactor/refactor-lint.ts +4 -10
  598. package/scripts/refactor/refactor-scan-cli.ts +1 -1
  599. package/scripts/refactor/refactor-scan.ts +2 -2
  600. package/scripts/refactor/refactor-targets.ts +1 -1
  601. package/scripts/release/github-release-cli.ts +25 -3
  602. package/scripts/release/github-release-environment.ts +1 -0
  603. package/scripts/release/github-release-runs.ts +115 -0
  604. package/scripts/release/github-release.ts +13 -67
  605. package/scripts/release/release-cli.ts +21 -4
  606. package/scripts/release/release-history.ts +6 -10
  607. package/scripts/release/release-plan.ts +3 -3
  608. package/scripts/release/release-progress.ts +3 -4
  609. package/scripts/release/release-publish.ts +8 -9
  610. package/scripts/release/release-scope-cli.ts +8 -10
  611. package/scripts/release/release-tag.ts +6 -8
  612. package/scripts/release/release-worktree.ts +5 -5
  613. package/scripts/repo/auto-merge-setting-logic.ts +7 -9
  614. package/scripts/repo/auto-merge-setting.ts +1 -1
  615. package/scripts/repo/repo-setting.ts +4 -4
  616. package/scripts/repo/repository-labels.ts +1 -1
  617. package/scripts/repo/required-checks-logic.ts +3 -3
  618. package/scripts/repo/required-checks-report.ts +1 -1
  619. package/scripts/repo/ruleset-check-cli.ts +1 -1
  620. package/scripts/repo/ruleset-check.ts +1 -1
  621. package/scripts/report/report-format-reference.ts +26 -0
  622. package/scripts/report/report-lint-cli.ts +2 -2
  623. package/scripts/report/report-lint.ts +16 -2
  624. package/scripts/review/disposition-cli.ts +2 -2
  625. package/scripts/review/disposition-logic.ts +1 -1
  626. package/scripts/review/live-evidence.ts +9 -6
  627. package/scripts/review/review-attest-cli.ts +1 -2
  628. package/scripts/review/review-attest.ts +3 -3
  629. package/scripts/review/review-brief-cli.ts +19 -20
  630. package/scripts/review/review-brief.ts +29 -32
  631. package/scripts/review/review-checkout.ts +2 -2
  632. package/scripts/review/review-diff-parts.ts +3 -5
  633. package/scripts/review/review-diff-write.ts +1 -1
  634. package/scripts/review/review-finding-ledger.ts +7 -4
  635. package/scripts/review/review-findings-cli.ts +2 -2
  636. package/scripts/review/review-level.ts +4 -7
  637. package/scripts/review/review-record-cli.ts +73 -16
  638. package/scripts/review/review-record.ts +5 -4
  639. package/scripts/review/review-round2-cli.ts +2 -3
  640. package/scripts/review/review-round2.ts +13 -21
  641. package/scripts/review/review-stamps.ts +9 -71
  642. package/scripts/review/review-tree.ts +4 -5
  643. package/scripts/rules/bash-triggers.ts +4 -4
  644. package/scripts/rules/decision-oracle-batch.ts +5 -6
  645. package/scripts/rules/decision-oracle-stage.ts +1 -1
  646. package/scripts/rules/decision-oracle-tokens.ts +1 -2
  647. package/scripts/rules/decision-oracle.ts +2 -2
  648. package/scripts/rules/delivered-rules.ts +61 -406
  649. package/scripts/rules/destructive-command.ts +2 -2
  650. package/scripts/rules/direct-filing.ts +4 -4
  651. package/scripts/rules/direct-pr-create.ts +2 -2
  652. package/scripts/rules/early-heartbeat.ts +15 -19
  653. package/scripts/rules/file-body.ts +5 -6
  654. package/scripts/rules/filing-cap.ts +6 -7
  655. package/scripts/rules/filing-offer.ts +1 -1
  656. package/scripts/rules/firing-point.ts +6 -6
  657. package/scripts/rules/gh-api.ts +2 -2
  658. package/scripts/rules/git-argv.ts +3 -3
  659. package/scripts/rules/git-force.ts +2 -2
  660. package/scripts/rules/hook-context-line.ts +31 -0
  661. package/scripts/rules/implementation-cut-verdict.ts +5 -8
  662. package/scripts/rules/implementation-cut.ts +35 -32
  663. package/scripts/rules/index-guard.ts +2 -2
  664. package/scripts/rules/issue-citation.ts +7 -7
  665. package/scripts/rules/issue-comments.ts +21 -13
  666. package/scripts/rules/josh-git-bare.ts +2 -2
  667. package/scripts/rules/lane-background.ts +14 -16
  668. package/scripts/rules/lane-carry-conflict.ts +41 -5
  669. package/scripts/rules/lane-interactive-ask.ts +6 -9
  670. package/scripts/rules/lane-park.ts +12 -16
  671. package/scripts/rules/lane-split-park.ts +1 -2
  672. package/scripts/rules/lane-switch-main.ts +10 -13
  673. package/scripts/rules/last-prompt.ts +1 -1
  674. package/scripts/rules/oracle-consulted.ts +5 -5
  675. package/scripts/rules/oracle-firing.ts +6 -9
  676. package/scripts/rules/oracle-list-cli.ts +2 -2
  677. package/scripts/rules/permission-guards.ts +2 -2
  678. package/scripts/rules/piped-verification.ts +79 -9
  679. package/scripts/rules/poll-loop.ts +9 -11
  680. package/scripts/rules/pre-gate-cut.ts +33 -30
  681. package/scripts/rules/prior-comment-read.ts +3 -3
  682. package/scripts/rules/protected-files.ts +25 -13
  683. package/scripts/rules/raw-field-body.ts +3 -4
  684. package/scripts/rules/reply-language.ts +1 -1
  685. package/scripts/rules/rule-body-guard.ts +10 -12
  686. package/scripts/rules/rule-guard.ts +1 -1
  687. package/scripts/rules/rule-list.ts +51 -0
  688. package/scripts/rules/rule-registry-rows.ts +282 -0
  689. package/scripts/rules/rule-registry.ts +109 -0
  690. package/scripts/rules/rule-value-cache.ts +2 -2
  691. package/scripts/rules/rule-value-cli.ts +6 -4
  692. package/scripts/rules/rule-value.ts +61 -22
  693. package/scripts/rules/run-tail-rule.ts +11 -15
  694. package/scripts/rules/shell-body-trigger.ts +7 -7
  695. package/scripts/rules/shell-segments.ts +2 -4
  696. package/scripts/rules/stop-rules.ts +54 -41
  697. package/scripts/rules/tail-commands.ts +1 -1
  698. package/scripts/rules/test-declared-commit.ts +2 -2
  699. package/scripts/rules/third-party-write.ts +3 -3
  700. package/scripts/rules/worktree-guard.ts +12 -5
  701. package/scripts/run/add/run-add-cli.ts +165 -0
  702. package/scripts/run/add/run-add.ts +124 -0
  703. package/scripts/run/board/run-board-cli.ts +207 -0
  704. package/scripts/run/board/run-board-closed.ts +95 -0
  705. package/scripts/run/board/run-board-every.ts +60 -0
  706. package/scripts/run/board/run-board-fetch.ts +38 -0
  707. package/scripts/run/board/run-board-fit.ts +219 -0
  708. package/scripts/run/board/run-board-github.ts +162 -0
  709. package/scripts/run/board/run-board-header.ts +275 -0
  710. package/scripts/run/board/run-board-kind.ts +35 -0
  711. package/scripts/run/board/run-board-labels.ts +299 -0
  712. package/scripts/run/board/run-board-layout.ts +222 -0
  713. package/scripts/run/board/run-board-link.ts +31 -0
  714. package/scripts/run/board/run-board-machine.ts +198 -0
  715. package/scripts/run/board/run-board-notes.ts +103 -0
  716. package/scripts/run/board/run-board-phase.ts +136 -0
  717. package/scripts/run/board/run-board-plan.ts +129 -0
  718. package/scripts/run/board/run-board-read.ts +62 -0
  719. package/scripts/run/board/run-board-render-legend.ts +82 -0
  720. package/scripts/run/board/run-board-render-notes.ts +77 -0
  721. package/scripts/run/board/run-board-render-slot.ts +50 -0
  722. package/scripts/run/board/run-board-render.ts +407 -0
  723. package/scripts/run/board/run-board-scope.ts +17 -0
  724. package/scripts/run/board/run-board-screen.ts +43 -0
  725. package/scripts/run/board/run-board-span.ts +66 -0
  726. package/scripts/run/board/run-board-spin.ts +115 -0
  727. package/scripts/run/board/run-board-state.ts +113 -0
  728. package/scripts/run/board/run-board-status.ts +279 -0
  729. package/scripts/run/board/run-board-tick.ts +210 -0
  730. package/scripts/run/board/run-board-track.ts +22 -0
  731. package/scripts/run/board/run-board-usage-read.ts +255 -0
  732. package/scripts/run/board/run-board-usage-rusage.ts +124 -0
  733. package/scripts/run/board/run-board-usage-text.ts +80 -0
  734. package/scripts/run/board/run-board-usage.ts +165 -0
  735. package/scripts/run/carry/run-carry-added.ts +62 -0
  736. package/scripts/run/carry/run-carry-args.ts +25 -22
  737. package/scripts/run/carry/run-carry-change.ts +1 -1
  738. package/scripts/run/carry/run-carry-cli.ts +71 -48
  739. package/scripts/run/carry/run-carry-conversation.ts +6 -7
  740. package/scripts/run/carry/run-carry-ended.ts +85 -0
  741. package/scripts/run/carry/run-carry-reclaim.ts +1 -1
  742. package/scripts/run/carry/run-carry-stash.ts +3 -2
  743. package/scripts/run/carry/run-carry-streak.ts +8 -10
  744. package/scripts/run/carry/run-carry.ts +85 -89
  745. package/scripts/run/cut/run-cut-args.ts +7 -7
  746. package/scripts/run/cut/run-cut-cli.ts +68 -37
  747. package/scripts/run/cut/run-cut-handoff.ts +15 -15
  748. package/scripts/run/cut/run-cut-report.ts +37 -16
  749. package/scripts/run/cut/run-cut.ts +63 -77
  750. package/scripts/run/detached-launch.ts +35 -50
  751. package/scripts/run/entry/run-entry-cli.ts +48 -27
  752. package/scripts/run/entry/run-entry-stop.ts +7 -9
  753. package/scripts/run/entry/run-entry.ts +5 -6
  754. package/scripts/run/event/run-event-cli.ts +5 -6
  755. package/scripts/run/event/run-event-filed.ts +69 -0
  756. package/scripts/run/event/run-event-follow.ts +3 -3
  757. package/scripts/run/event/run-event-plan.ts +38 -0
  758. package/scripts/run/event/run-event-render.ts +10 -4
  759. package/scripts/run/event/run-event-scope.ts +47 -18
  760. package/scripts/run/event/run-event-stream-emit.ts +64 -11
  761. package/scripts/run/event/run-event-stream.ts +172 -43
  762. package/scripts/run/event/run-event-watch.ts +4 -6
  763. package/scripts/run/hold/run-hold-cli.ts +65 -62
  764. package/scripts/run/hold/run-hold.ts +88 -46
  765. package/scripts/run/merge/run-merge-cli.ts +116 -77
  766. package/scripts/run/merge/run-merge-collect.ts +107 -0
  767. package/scripts/run/merge/run-merge-steps.ts +112 -65
  768. package/scripts/run/merge/run-merge-token.ts +30 -0
  769. package/scripts/run/merge/run-merge.ts +31 -22
  770. package/scripts/run/progress/run-progress-args.ts +4 -4
  771. package/scripts/run/progress/run-progress-cli.ts +39 -50
  772. package/scripts/run/progress/run-progress-clock.ts +25 -32
  773. package/scripts/run/progress/run-progress-config.ts +6 -9
  774. package/scripts/run/progress/run-progress-read.ts +9 -10
  775. package/scripts/run/progress/run-progress.ts +48 -53
  776. package/scripts/run/review/run-review-cli.ts +6 -6
  777. package/scripts/run/review/run-review-steps.ts +6 -6
  778. package/scripts/run/review/run-review.ts +9 -11
  779. package/scripts/run/run-cli-fault.ts +29 -0
  780. package/scripts/run/run-ending-cli.ts +3 -3
  781. package/scripts/run/run-ending.ts +10 -14
  782. package/scripts/run/run-halfrun-resume.ts +6 -8
  783. package/scripts/run/run-headless.ts +25 -12
  784. package/scripts/run/run-invocation.ts +17 -22
  785. package/scripts/run/run-label.ts +7 -5
  786. package/scripts/run/run-liveness-cli.ts +19 -6
  787. package/scripts/run/run-liveness.ts +27 -38
  788. package/scripts/run/run-next-cli.ts +5 -9
  789. package/scripts/run/run-next.ts +4 -5
  790. package/scripts/run/run-parent-cut-hook.ts +10 -12
  791. package/scripts/run/run-preflight.ts +25 -29
  792. package/scripts/run/run-prep-cli.ts +17 -13
  793. package/scripts/run/run-prep-locate.ts +4 -5
  794. package/scripts/run/run-prep.ts +7 -10
  795. package/scripts/run/run-prrun-resume.ts +2 -2
  796. package/scripts/run/run-report-cli.ts +4 -4
  797. package/scripts/run/run-report.ts +9 -14
  798. package/scripts/run/run-retrospective.ts +3 -3
  799. package/scripts/run/run-section.ts +42 -0
  800. package/scripts/run/run-stage-read.ts +2 -2
  801. package/scripts/run/run-stage.ts +6 -4
  802. package/scripts/run/run-status-cli.ts +7 -5
  803. package/scripts/run/run-status.ts +6 -7
  804. package/scripts/run/run-step-cli.ts +13 -15
  805. package/scripts/run/run-step.ts +62 -48
  806. package/scripts/run/run-stop-notify.ts +7 -8
  807. package/scripts/run/run-stranded-cli.ts +1 -1
  808. package/scripts/run/run-stranded-detect.ts +4 -4
  809. package/scripts/run/run-stranded.ts +11 -13
  810. package/scripts/run/run-tail-cli.ts +15 -16
  811. package/scripts/run/run-tail.ts +14 -33
  812. package/scripts/run/run-watcher-guard-cli.ts +3 -4
  813. package/scripts/run/run-watcher-guard.ts +11 -12
  814. package/scripts/run/run-watcher-hook.ts +6 -12
  815. package/scripts/run/ship/run-ship-cli.ts +67 -33
  816. package/scripts/run/ship/run-ship-detach.ts +15 -13
  817. package/scripts/run/ship/run-ship-lock.ts +1 -1
  818. package/scripts/run/ship/run-ship-next.ts +7 -8
  819. package/scripts/run/ship/run-ship-pre-detach.ts +27 -11
  820. package/scripts/run/ship/run-ship-preflight.ts +10 -11
  821. package/scripts/run/ship/run-ship-probe.ts +4 -4
  822. package/scripts/run/ship/run-ship-return.ts +1 -1
  823. package/scripts/run/ship/run-ship-review-steps.ts +43 -24
  824. package/scripts/run/ship/run-ship-review.ts +12 -14
  825. package/scripts/run/ship/run-ship-scoped.ts +15 -6
  826. package/scripts/run/ship/run-ship-stage.ts +80 -26
  827. package/scripts/run/ship/run-ship-steps.ts +26 -16
  828. package/scripts/run/ship/run-ship-stop-text.ts +4 -2
  829. package/scripts/run/ship/run-ship-sync.ts +9 -8
  830. package/scripts/run/ship/run-ship.ts +17 -32
  831. package/scripts/run/tidy/run-tidy-cli.ts +9 -5
  832. package/scripts/run/tidy/run-tidy-lanes.ts +18 -7
  833. package/scripts/run/tidy/run-tidy-stashes.ts +8 -8
  834. package/scripts/run/tidy/run-tidy.ts +4 -3
  835. package/scripts/run/wake/run-wake-cli.ts +27 -33
  836. package/scripts/run/wake/run-wake-describe.ts +76 -29
  837. package/scripts/run/wake/run-wake-driver.ts +14 -14
  838. package/scripts/run/wake/run-wake-handoff.ts +6 -6
  839. package/scripts/run/wake/run-wake-loop.ts +13 -21
  840. package/scripts/run/wake/run-wake-restart.ts +4 -5
  841. package/scripts/run/wake/run-wake-session.ts +23 -27
  842. package/scripts/run/wake/run-wake.ts +57 -328
  843. package/scripts/safe-chain/ci-installer-pin.ts +3 -3
  844. package/scripts/safe-chain/pack-hook.ts +2 -2
  845. package/scripts/safe-chain/preinstall-command.ts +2 -2
  846. package/scripts/security/security-audit-logic.ts +1 -1
  847. package/scripts/security/security-audit-provision-logic.ts +1 -1
  848. package/scripts/security/security-audit-provision.ts +2 -2
  849. package/scripts/security/security-audit.ts +5 -5
  850. package/scripts/security/security-updates-logic.ts +2 -3
  851. package/scripts/security/security-updates.ts +2 -4
  852. package/scripts/self-sync-guard/index.ts +1 -1
  853. package/scripts/self-sync-guard/self-sync-guard-logic.ts +2 -2
  854. package/scripts/self-sync-guard/self-sync-refusal.ts +1 -1
  855. package/scripts/sonar/sonar-hotspots-cli.ts +1 -1
  856. package/scripts/sonar/sonar-hotspots.ts +1 -1
  857. package/scripts/sonar/sonar-new-code-cli.ts +1 -1
  858. package/scripts/sonar/sonar-new-code.ts +1 -1
  859. package/scripts/sonar/sonar-project.ts +1 -1
  860. package/scripts/split/split-assess-cli.ts +1 -1
  861. package/scripts/split/split-assess.ts +3 -3
  862. package/scripts/sync/directory-copy-guard.ts +2 -3
  863. package/scripts/sync/managed-config-scope-cli.ts +1 -2
  864. package/scripts/sync/managed-config-scope.ts +4 -4
  865. package/scripts/sync/plugin-skill-directories.ts +2 -2
  866. package/scripts/sync/reconcile-templates.ts +17 -8
  867. package/scripts/sync/removed-skill-manifest.ts +2 -3
  868. package/scripts/sync/sync-ai-files.ts +7 -7
  869. package/scripts/sync/sync-configs.ts +30 -3
  870. package/scripts/sync/sync-hook-safety.ts +2 -2
  871. package/scripts/sync/sync.ts +23 -10
  872. package/scripts/sync/synced-paths.ts +2 -1
  873. package/scripts/sync/workflow-pin-logic.ts +1 -1
  874. package/scripts/test/test-declared-changed.ts +4 -4
  875. package/scripts/test/test-declared-logic.ts +2 -3
  876. package/scripts/test/test-declared-match.ts +25 -4
  877. package/scripts/test/test-declared.ts +26 -9
  878. package/scripts/test/test-red-commit.ts +3 -2
  879. package/scripts/test/test-red-logic.ts +7 -14
  880. package/scripts/test/test-red.ts +12 -47
  881. package/scripts/test/test-related-scope.ts +2 -3
  882. package/scripts/test/test-related.ts +3 -3
  883. package/scripts/test/test-type-logic.ts +1 -2
  884. package/scripts/test/test-unit-guard.ts +13 -17
  885. package/scripts/test/unit-worker-share.ts +7 -8
  886. package/scripts/time-runtime/time-agent-bundles.ts +2 -4
  887. package/scripts/time-runtime/time-background.ts +17 -21
  888. package/scripts/time-runtime/time-batch-guard.ts +67 -342
  889. package/scripts/time-runtime/time-bundle-call.ts +26 -28
  890. package/scripts/time-runtime/time-bundles.ts +11 -12
  891. package/scripts/time-runtime/time-call-identity.ts +1 -1
  892. package/scripts/time-runtime/time-command-key.ts +2 -2
  893. package/scripts/time-runtime/time-density-hook.ts +8 -11
  894. package/scripts/time-runtime/time-density.ts +5 -5
  895. package/scripts/time-runtime/time-followup-stage.ts +7 -7
  896. package/scripts/time-runtime/time-format.ts +5 -5
  897. package/scripts/time-runtime/time-hook-transcript.ts +3 -3
  898. package/scripts/time-runtime/time-instant.ts +1 -1
  899. package/scripts/time-runtime/time-markers.ts +15 -19
  900. package/scripts/time-runtime/time-phase-names.ts +3 -3
  901. package/scripts/time-runtime/time-reported-failure.ts +15 -19
  902. package/scripts/time-runtime/time-round-trips.ts +20 -23
  903. package/scripts/time-runtime/time-shell.ts +8 -8
  904. package/scripts/time-runtime/time-single-check.ts +1 -2
  905. package/scripts/time-runtime/time-spans.ts +35 -40
  906. package/scripts/time-runtime/time-tool-call.ts +15 -16
  907. package/scripts/time-runtime/time-transcript-line.ts +53 -34
  908. package/scripts/time-runtime/time-writes.ts +5 -5
  909. package/scripts/ui/ui-routes-cli.ts +1 -2
  910. package/scripts/ui/ui-routes.ts +1 -2
  911. package/scripts/version/bump-version.ts +1 -1
  912. package/scripts/version/fresh-metadata-cache.ts +2 -2
  913. package/scripts/version/latest-corepack.ts +129 -98
  914. package/scripts/version/latest-lane-guard.ts +1 -1
  915. package/scripts/version/latest-scope-cli.ts +2 -2
  916. package/scripts/version/latest-stamp.ts +1 -2
  917. package/scripts/version/latest-update.ts +2 -2
  918. package/scripts/version/npm-registry.ts +2 -2
  919. package/scripts/version/package-manager-version.ts +18 -0
  920. package/scripts/version/publishable-range-check.ts +2 -1
  921. package/scripts/version/publishable-range.ts +1 -1
  922. package/scripts/version/release-age.ts +11 -11
  923. package/scripts/version/release-hold.ts +2 -2
  924. package/scripts/version/safe-chain-version-update.ts +3 -3
  925. package/scripts/version/version-check-logic.ts +2 -3
  926. package/scripts/version/version-check.ts +1 -2
  927. package/scripts/version/version-command-config.ts +2 -2
  928. package/scripts/version/version-commands.ts +3 -3
  929. package/scripts/version/version-remote.ts +4 -4
  930. package/scripts/version/version-targets.ts +2 -2
  931. package/templates/gitignore +7 -0
  932. package/templates/workflows/github-release.yml +4 -0
  933. package/dist/hooks/chunk-NV2JRZZO.js +0 -6385
  934. package/dist/hooks/chunk-RKUAD3I6.js +0 -90
  935. package/dist/hooks/chunk-WPALEIRX.js +0 -18
  936. package/scripts/backlog/backlog-restructure.ts +0 -152
  937. package/scripts/rules/issue-fold-rule.ts +0 -72
  938. package/scripts/rules/wip-cap.ts +0 -63
  939. package/scripts/run/run-issue-number.ts +0 -19
@@ -4,27 +4,23 @@ import type { GuardedCall } from '#scripts/time-runtime/time-batch-guard'
4
4
  import { time_shell } from '#scripts/time-runtime/time-shell'
5
5
  import { shell_segments } from './shell-segments'
6
6
 
7
- // The trigger and the decision behind the `run-tail` row of `delivered-rules.ts`
8
- // (joshuafolkken/kit#1510).
7
+ // The trigger and the decision behind the `run-tail` row of `delivered-rules.ts`.
9
8
  //
10
- // **Two stops, one cause.** `fullrun #1501` ran 45m03s on about 17 minutes of work. Of the 25 idle
11
- // minutes, 6m28s was a `pnpm josh git -y` issued in the **foreground** with a 900-second tool
12
- // timeout — above the harness's 600-second cap, so the harness detached it at the cap and nothing
13
- // read the output file afterwards — and 6m06s was bare CI: the push landed, the turn ended, and the
14
- // merge started only when the person asked whether it was merging. Both halves handed the deciding
15
- // of when to look back to something that was never going to decide it.
9
+ // **Two stops, one cause.** A `pnpm josh git -y` issued in the **foreground** with a tool timeout
10
+ // above the harness's 600-second cap is detached at the cap with nothing reading the output file
11
+ // afterwards; and a push that ends the turn leaves the merge waiting until a person asks. Both hand
12
+ // the deciding of when to look back to something that is never going to decide it.
16
13
  //
17
14
  // **So the refusal is put in front of the foreground call, which is the last call before the seam.**
18
15
  // A turn ending between the push and `pnpm josh followup` is an *absence* of a call, and no
19
16
  // `PreToolUse` hook can see one; the foreground push is a call, and refusing it delivers both halves
20
- // at the one moment they still bind. That is the same reading joshuafolkken/kit#1570 took for a wait
21
- // timer and joshuafolkken/kit#1556 for a verification behind a pipe.
17
+ // at the one moment they still bind. That is the same reading `early-heartbeat.ts` takes for a wait
18
+ // timer and `piped-verification.ts` for a verification behind a pipe.
22
19
  //
23
20
  // **Backgrounding is what closes the seam, rather than a second rule about turns.** A command issued
24
21
  // with `run_in_background` re-invokes the run when it exits, so the completion notification is what
25
- // resumes the tail — not a person noticing the silence. joshuafolkken/kit#1333 had already
26
- // established the same end state as a procedure, and symptom 2 is its regression; prose that had to
27
- // be remembered was what regressed, so this time the moment is named as a call.
22
+ // resumes the tail — not a person noticing the silence. Prose that has to be remembered is what
23
+ // regresses, so the moment is named as a call.
28
24
  //
29
25
  // **A call already made properly is not a trigger.** Reissued with `run_in_background`, the same
30
26
  // command falls through and the run pays nothing — the shape `is_body_only_issue_read` takes for a
@@ -90,7 +86,7 @@ function is_backgrounded(input: unknown): boolean {
90
86
  }
91
87
 
92
88
  /**
93
- * The occasion this rule governs: the push step, in either spelling (joshuafolkken/kit#1643).
89
+ * The occasion this rule governs: the push step, in either spelling.
94
90
  *
95
91
  * It is the denominator `scripts/rules/rule-value.ts` reads for this row, because the trigger below
96
92
  * fires only on the foreground spelling — a run that detached every push never trips it, so the rate
@@ -129,7 +125,7 @@ function is_foreground_push_step(call: GuardedCall): boolean {
129
125
  * changes what the run *knows*. A push does not work that way: a `queue` or an `epicrun` issues one
130
126
  * per child, and a round-2 fix commit issues a second inside a single `fullrun`. Refused once and
131
127
  * free afterwards, every push but the first is back to the run's own self-restraint, which is the
132
- * thing joshuafolkken/kit#1333 already measured failing.
128
+ * thing that fails.
133
129
  *
134
130
  * **It also removes the stand-aside this row has no use for.** `is_first_delivery` stays silent for
135
131
  * ten seconds after the batching guard stamps any refusal; the push step is never a candidate of that
@@ -1,5 +1,5 @@
1
- // The `shell-body` row's trigger, in a module of its own rather than inside the enumeration
2
- // (joshuafolkken/kit#1198). Every other row's trigger is already shaped that way — `time_batch_guard`
1
+ // The `shell-body` row's trigger, in a module of its own rather than inside the enumeration.
2
+ // Every other row's trigger is already shaped that way — `time_batch_guard`
3
3
  // and `cost_blocks` each hold their own reading of a call — and this one needs a small model of what
4
4
  // zsh does inside double quotes, which is more than an enumeration row should carry. The split also
5
5
  // gives that model a suite of its own, so a regex change is read beside the cases it has to keep.
@@ -53,8 +53,8 @@ const INLINE_BODY_VALUE = new RegExp(
53
53
  'gu',
54
54
  )
55
55
 
56
- // **What zsh evaluates inside double quotes, measured in this harness rather than assumed**
57
- // (joshuafolkken/kit#1198): a backtick runs as command substitution and a `$` expands. `!` does
56
+ // **What zsh evaluates inside double quotes, measured in this harness rather than assumed**:
57
+ // a backtick runs as command substitution and a `$` expands. `!` does
58
58
  // **not** — history expansion is off in a non-interactive zsh, and `"hello!world"` survives intact —
59
59
  // so it is deliberately absent: a rule that fired on every exclamation mark would be firing on turns
60
60
  // where nothing is wrong, which `prompts/collaboration-workflow/rule-delivery.md` names as worse than
@@ -73,8 +73,8 @@ const WHOLE_VALUE_SUBSTITUTION = new RegExp(`^${SUBSTITUTION}$`, 'u')
73
73
 
74
74
  // **A backtick inside the substitution voids the exemption.** The exemption's reason is that the
75
75
  // *output* is not re-scanned — but the substitution's own command is shell text, and a backtick in it
76
- // runs exactly as an inline one does. `body="$(echo \`date\`)"` executes `date`, which is the damage
77
- // joshuafolkken/kit#1198 was filed over, merely written one level in. A nested `$( … )` is the safe
76
+ // runs exactly as an inline one does. `body="$(echo \`date\`)"` executes `date`, which is the inline
77
+ // damage merely written one level in. A nested `$( … )` is the safe
78
78
  // spelling of the same composition and stays exempt.
79
79
  const BACKTICK = '`'
80
80
 
@@ -118,7 +118,7 @@ function is_shell_evaluated_body(command: string): boolean {
118
118
  return false
119
119
  }
120
120
 
121
- // **The safe spellings, which is what keeping this rule looks like** (joshuafolkken/kit#1643). They
121
+ // **The safe spellings, which is what keeping this rule looks like**. They
122
122
  // are the ones the refusal hands back: the `*-file` flags, a field whose value is a file reference,
123
123
  // and `$'…'` quoting. The `*-file` flags cannot reach `INLINE_BODY_VALUE` at all — the note at the top
124
124
  // of this file records why — so they are read straight off the command rather than out of a value.
@@ -20,10 +20,8 @@ function segments_of(command: string): Array<string> {
20
20
  return command.split(SEGMENT_SEPARATOR).map((segment) => segment.trim())
21
21
  }
22
22
 
23
- // **Both spellings still match, and the expansion is no longer this file's** (joshuafolkken/kit#1643
24
- // for the reading, joshuafolkken/kit#1789 for where it now happens). A `josh_names` here used to widen
25
- // each caller's set with every alias standing for one of its names; `josh_command_of` expands the
26
- // alias in the command it reads, so `pnpm josh ga` arrives as `josh gate` and a caller's canonical set
23
+ // **Both spellings match, and the expansion is not this file's.** `josh_command_of` expands the alias
24
+ // in the command it reads, so `pnpm josh ga` arrives as `josh gate` and a caller's canonical set
27
25
  // matches it as it is. Widening as well would be a second copy of one rule, and the caller that
28
26
  // forgot it would be the one that stops seeing `pnpm josh ga` at all — which is why each caller's own
29
27
  // suite names a call in its alias spelling.
@@ -5,8 +5,7 @@ import { issue_citation } from './issue-citation'
5
5
  import { lane_background } from './lane-background'
6
6
  import { reply_language } from './reply-language'
7
7
 
8
- // The stop-time rules, delivered on the `Stop` hook (joshuafolkken/kit#2121, joshuafolkken/kit#2422,
9
- // joshuafolkken/kit#2445).
8
+ // The stop-time rules, delivered on the `Stop` hook.
10
9
  //
11
10
  // **It exists because `.claude/settings.json` wired no `Stop` event.** The four events it did wire
12
11
  // (`SessionStart` / `UserPromptSubmit` / `PreToolUse` / `PostToolUse`) can catch the moment a call is
@@ -20,7 +19,7 @@ import { reply_language } from './reply-language'
20
19
  // permission envelope. The stop guard is a second *entry* on the one foundation, exactly as
21
20
  // `pretool-guard` is one — not a second copy of the plumbing.
22
21
  //
23
- // **Every rule refuses** (joshuafolkken/kit#2247). Missing the stop notification or leaving a hold
22
+ // **Every rule refuses**. Missing the stop notification or leaving a hold
24
23
  // on a clean tree costs a person a silent wait or a trampled tree; a bare `#N` in the reply reaches
25
24
  // the person watching but not the model that could fix it, so it too blocks — `{"decision":"block"}`
26
25
  // is the one channel a `Stop` hook has to the model, and `stop_hook_active` caps a false positive at a
@@ -45,14 +44,14 @@ interface StopContext {
45
44
  hold_present: boolean
46
45
  // `git status --porcelain` came back empty.
47
46
  tree_clean: boolean
48
- // That record carries a `prrun` stop mark (joshuafolkken/kit#3023): the run stopped at a green pull
47
+ // That record carries a `prrun` stop mark: the run stopped at a green pull
49
48
  // request and keeps the hold over a clean tree on purpose, so a person can look before it merges.
50
49
  prrun_stopped: boolean
51
50
  // A `confirmation` notify is on this run's transcript tail.
52
51
  notified: boolean
53
52
  // The turn's session-facing reply text.
54
53
  message: string
55
- // The person's last prompt — a `#N` it already carried is quoted, not cited (joshuafolkken/kit#2819).
54
+ // The person's last prompt — a `#N` it already carried is quoted, not cited.
56
55
  prompt: string
57
56
  // This stop already forced a continuation earlier in the prompt — the loop-breaker Claude Code
58
57
  // documents, so a run that will not comply is not blocked forever.
@@ -66,26 +65,29 @@ interface StopContext {
66
65
  // The owner of the repository the session runs in, or `undefined` when it cannot be read.
67
66
  session_owner: string | undefined
68
67
  // This session is a headless `backlogrun` parent with lanes still in flight and no cut handed its
69
- // record off — `run-headless.ts` → `must_keep_waiting` (joshuafolkken/kit#2437).
68
+ // record off — `run-headless.ts` → `must_keep_waiting`.
70
69
  headless_waiting: boolean
71
70
  // How many headless-wait refusals sit on this run's transcript tail — the spin bound below.
72
71
  headless_refusals: number
73
72
  // This session is a dispatched lane child for this checkout — `lane_child_marker.is_child_of`.
74
73
  lane_child: boolean
75
74
  // A background task this run launched — a command or a subagent — has not finished —
76
- // `lane_background.pending_background_ids` over the transcript tail (joshuafolkken/kit#2704).
75
+ // `lane_background.pending_background_ids` over the transcript tail.
77
76
  background_pending: boolean
78
- // A backgrounded subagent this run launched has not finished — `lane_background.pending_agent_ids`
79
- // (joshuafolkken/kit#2774). Apart from `background_pending`, since only a subagent is sure to end.
77
+ // A backgrounded subagent this run launched has not finished — `lane_background.pending_agent_ids`.
78
+ // Apart from `background_pending`, since only a subagent is sure to end.
80
79
  agent_pending: boolean
81
- // This lane child handed its region to a running detached ship — `lane_handoff.is_handed_off`
82
- // (joshuafolkken/kit#2962). The supervisor notifies on its own outcome, so nobody waits on this stop.
80
+ // This lane child handed its region to a running detached ship — `lane_handoff.is_handed_off`.
81
+ // The supervisor notifies on its own outcome, so nobody waits on this stop.
83
82
  handed_off: boolean
84
- // The resolved `JOSH_SESSION_LANG` — `session_language.resolve_session_lang` (joshuafolkken/kit#2470).
83
+ // The resolved `JOSH_SESSION_LANG` — `session_language.resolve_session_lang`.
85
84
  session_lang: string
86
- // This session is an agent kit launched under `claude -p` — `agent_headless.is_headless`
87
- // (joshuafolkken/kit#3245). No person reads its reply, so the rules on how a reply is written stand down.
85
+ // This session is an agent kit launched under `claude -p` — `agent_headless.is_headless`.
86
+ // No person reads its reply, so the rules on how a reply is written stand down.
88
87
  headless_agent: boolean
88
+ // This session drives a live `backlogrun` carry record — `run_headless.is_backlog_parent`.
89
+ // With `headless_agent` and `lane_child`, what makes a run unattended.
90
+ backlog_parent: boolean
89
91
  }
90
92
 
91
93
  interface StopOutcome {
@@ -111,18 +113,18 @@ const STOP_NOTIFY_REASON =
111
113
  // keep it because their tree is dirty, which is why this row is silent whenever the tree is not clean.
112
114
  const HOLD_RELEASE_REASON =
113
115
  '⛔ working-tree hold not released: this working tree is clean but its `run:hold` record is still in ' +
114
- 'place, so the next run here runs `git switch main && git pull` believing the tree is free while ' +
116
+ 'place, so the next run here runs `pnpm josh ms` believing the tree is free while ' +
115
117
  'you hold it. The workflow-commands skill → `working-tree-hold.md`: a stop that leaves the tree clean ' +
116
118
  'releases the hold with `pnpm josh run:release <N>` (bare for a `new` entry). A `halfrun` ' +
117
119
  'pre-commit stop and a `needs-human-review` stop keep the hold because their tree is dirty, and a ' +
118
120
  '`prrun` stop keeps it by its stop mark — this row is silent there. Release it, then end with a one-line confirmation that it was released — do ' +
119
121
  'not repeat your previous reply.'
120
122
 
121
- // **A refusal that corrects rather than advises** (joshuafolkken/kit#2247). The bare `#N` is already
123
+ // **A refusal that corrects rather than advises**. The bare `#N` is already
122
124
  // on screen and the hook cannot unsay it, so the reason does the one thing that helps the *next* reply:
123
125
  // it names the numbers it detected and hands over the exact `issue:cite` call that prints the
124
- // paste-ready lines, then asks for the corrected citation lines alone — not the whole reply reissued
125
- // (joshuafolkken/kit#2329). Reprinting the whole reply is what made the correction read as a duplicate;
126
+ // paste-ready lines, then asks for the corrected citation lines alone — not the whole reply reissued.
127
+ // Reprinting the whole reply is what made the correction read as a duplicate;
126
128
  // the bare copy already scrolled past stays, and the fix follows it as a short correction. The rule
127
129
  // itself is not restated — it is resident in `CLAUDE.md` — only pointed at.
128
130
  const ISSUE_CITATION_REASON =
@@ -140,19 +142,21 @@ function build_citation_reason(references: ReadonlyArray<string>): string {
140
142
  )
141
143
  }
142
144
 
143
- // **An offer to file is a Tier A filing deferred to the user** (joshuafolkken/kit#2422). The judgement
144
- // is already made, so the reason hands over the filing chain rather than a question; the rule itself
145
- // is resident in `observation-filing.md` and only pointed at.
145
+ // **An offer to file in an unattended run is a Tier A filing deferred to nobody**.
146
+ // The judgement is already made, so the reason hands over the filing chain rather than a question; the
147
+ // rule itself is resident in `observation-filing.md` and only pointed at. **An interactive session asks
148
+ // first**: there the offer is the correct reply, so `needs_filing` is silent.
146
149
  const FILING_OFFER_REASON =
147
- '⛔ filing offer: your reply offers to file an Issue instead of filing it. Filing into a ' +
148
- 'first-party repository is Tier A — the trigger is the judgement that it is worth filing, not the ' +
149
- "run's progress (the workflow-commands skill → `observation-filing.md`). Run " +
150
+ '⛔ filing offer: your reply offers to file an Issue instead of filing it, and this run is ' +
151
+ 'unattended — nobody is there to answer. Filing into a first-party repository there is Tier A — ' +
152
+ "the trigger is the judgement that it is worth filing, not the run's progress (the " +
153
+ 'workflow-commands skill → `observation-filing.md`). Run ' +
150
154
  '`pnpm josh issue:file "<title>" --body-file <path> --depth <0|1|2>` — it scouts, lints, labels and ' +
151
155
  'runs `epic:bundle` itself — then end with the one-line citation of what was filed; do not repeat ' +
152
156
  'your previous reply. If it is not worth filing ' +
153
157
  'after all, say so in one line instead.'
154
158
 
155
- // **A headless parent's turn-end is its process's end** (joshuafolkken/kit#2437). Under `claude -p` the
159
+ // **A headless parent's turn-end is its process's end**. Under `claude -p` the
156
160
  // background waits die with the turn, so the lanes lose their parent and nothing re-invokes it. The
157
161
  // reason hands over the foreground wait rather than a question, because there is nobody to answer one.
158
162
  // The refusal's opening, which the transcript tail is counted by.
@@ -166,7 +170,7 @@ const HEADLESS_REFUSAL_CAP = 3
166
170
 
167
171
  // The foreground waits as they appear in a transcript's tool-call input — the JSON `command` field, so
168
172
  // the refusal's own prose, which names the same commands, never matches. `run:progress --wait` is not
169
- // one (joshuafolkken/kit#3102): it streams its reports and runs until work arrives, so it is started in
173
+ // one: it streams its reports and runs until work arrives, so it is started in
170
174
  // the background, where it lives as long as the turn the foreground wait keeps open.
171
175
  const HEADLESS_WAIT_CALLS = ['"command":"pnpm josh lane:await']
172
176
 
@@ -180,7 +184,7 @@ const HEADLESS_WAIT_BODY =
180
184
 
181
185
  const HEADLESS_WAIT_REASON = `${HEADLESS_WAIT_MARKER}${HEADLESS_WAIT_BODY}`
182
186
 
183
- // **A lane child never asks a person for the index** (joshuafolkken/kit#2445). The index rule protects
187
+ // **A lane child never asks a person for the index**. The index rule protects
184
188
  // a person's own staging, and a lane is a per-run work tree with none to protect; the sanctioned commit
185
189
  // flow is already authorized, so the reason hands it over instead of letting the run wait on a person.
186
190
  // Both halves must appear — an index command and a request for permission — so a report that merely
@@ -204,8 +208,8 @@ function needs_index_route(context: StopContext): boolean {
204
208
  return context.lane_child && asks_index_permission(context.message)
205
209
  }
206
210
 
207
- // **A refusal is the turn's only input, so it names the language the answer is written in**
208
- // (joshuafolkken/kit#2470). The session-language line reaches a turn only through `UserPromptSubmit`;
211
+ // **A refusal is the turn's only input, so it names the language the answer is written in**.
212
+ // The session-language line reaches a turn only through `UserPromptSubmit`;
209
213
  // a turn this hook continues has no prompt, and an English refusal read alone was answered in English.
210
214
  function language_note(lang: string): string {
211
215
  return (
@@ -214,8 +218,8 @@ function language_note(lang: string): string {
214
218
  )
215
219
  }
216
220
 
217
- // **A reply that drifted out of the session language is sent back once to be rewritten**
218
- // (joshuafolkken/kit#2470). The drift persists — each turn matches the language of the one before — so
221
+ // **A reply that drifted out of the session language is sent back once to be rewritten**.
222
+ // The drift persists — each turn matches the language of the one before — so
219
223
  // the rewrite has to happen on the turn it starts; `stop_hook_active` bounds it to one.
220
224
  function build_language_reason(lang: string): string {
221
225
  return (
@@ -231,19 +235,28 @@ function language_reason(context: StopContext): string | undefined {
231
235
  return build_language_reason(context.session_lang)
232
236
  }
233
237
 
238
+ // The sessions no person answers: one kit launched under `claude -p` (a lane child, a woken session), a
239
+ // dispatched lane child, or the `backlogrun` parent the user handed the backlog to.
240
+ function is_unattended(context: StopContext): boolean {
241
+ return context.headless_agent || context.lane_child || context.backlog_parent
242
+ }
243
+
234
244
  function needs_filing(context: StopContext): boolean {
235
- if (context.filed || !filing_offer.offers_filing(context.message)) return false
245
+ if (!is_unattended(context) || context.filed) return false
236
246
 
237
- return filing_offer.is_first_party_target(context.message, context.session_owner)
247
+ return (
248
+ filing_offer.offers_filing(context.message) &&
249
+ filing_offer.is_first_party_target(context.message, context.session_owner)
250
+ )
238
251
  }
239
252
 
240
- // **A running background subagent stands both hold rules down** (joshuafolkken/kit#2774). Its completion
253
+ // **A running background subagent stands both hold rules down**. Its completion
241
254
  // notice re-invokes the session, so the turn-end is a wait on the run's own work, not on a person — a
242
255
  // notify there says "nothing needed" and dilutes the ones that do. A backgrounded command does not
243
256
  // count: a dev server never ends, and a stop behind it would leave a person silently waiting. A lane
244
257
  // child never reaches this with a task running: `needs_background_wait` answers it first.
245
258
  //
246
- // **A lane handed to the detached ship stands them down too** (joshuafolkken/kit#2962): the hold now
259
+ // **A lane handed to the detached ship stands them down too**: the hold now
247
260
  // belongs to the supervisor driving the merge, and the person hears from that supervisor's own notify.
248
261
  function is_held_idle(context: StopContext): boolean {
249
262
  return context.hold_present && !context.agent_pending && !context.handed_off
@@ -264,8 +277,8 @@ function citation_reason(context: StopContext): string | undefined {
264
277
  return build_citation_reason(references)
265
278
  }
266
279
 
267
- // The two rules on how a reply is written. **A headless agent's reply has no reader**
268
- // (joshuafolkken/kit#3245): its text lands in a stream-json log, so correcting its citations or its
280
+ // The two rules on how a reply is written. **A headless agent's reply has no reader**:
281
+ // its text lands in a stream-json log, so correcting its citations or its
269
282
  // language costs a turn and reaches nobody. The artifacts a person does read — a Telegram, an Issue, a
270
283
  // pull request — are held to the same rules by their own guards, not here.
271
284
  function wording_reason(context: StopContext): string | undefined {
@@ -298,15 +311,15 @@ function count_headless_refusals(tail: string): number {
298
311
  return tail.slice(Math.max(last_wait, 0)).split(HEADLESS_WAIT_MARKER).length - 1
299
312
  }
300
313
 
301
- // **A lane child with a task still running is sent back to wait, not to notify** (joshuafolkken/kit#2704).
314
+ // **A lane child with a task still running is sent back to wait, not to notify**.
302
315
  // Its turn-end kills the task, so the notify the hold rules would ask for announces a stop that loses
303
316
  // the work; the #2606 child obeyed exactly that and its gate died at `exit code 143`.
304
317
  function needs_background_wait(context: StopContext): boolean {
305
318
  return context.lane_child && context.background_pending
306
319
  }
307
320
 
308
- // The two hold rules, notify ahead of release — behind the lane index route (joshuafolkken/kit#2445)
309
- // and the lane background wait (joshuafolkken/kit#2704), since the notify they would ask for announces
321
+ // The two hold rules, notify ahead of release — behind the lane index route
322
+ // and the lane background wait, since the notify they would ask for announces
310
323
  // a pause the run has no reason to take.
311
324
  function hold_reason(context: StopContext): string | undefined {
312
325
  if (needs_index_route(context)) return LANE_INDEX_REASON
@@ -324,7 +337,7 @@ function hold_reason(context: StopContext): string | undefined {
324
337
  // reports the notify first; the filing offer goes ahead of the citation, since the filing it forces
325
338
  // produces the citation the reply then needs.
326
339
  //
327
- // **The headless wait comes first and outlasts `stop_hook_active` up to its spin bound** (joshuafolkken/kit#2437).
340
+ // **The headless wait comes first and outlasts `stop_hook_active` up to its spin bound**.
328
341
  // The loop-breaker exists so a person is not wedged behind a rule the run will not satisfy; a headless
329
342
  // parent has no person, and letting its second stop through is exactly the silent end the rule is for.
330
343
  // Each continuation it forces is a foreground wait of minutes, and the rule falls silent by itself once
@@ -3,7 +3,7 @@ import { time_shell } from '#scripts/time-runtime/time-shell'
3
3
  import { time_transcript_line, type Block } from '#scripts/time-runtime/time-transcript-line'
4
4
 
5
5
  // The `Bash` commands a run's transcript tail already issued, parsed once here rather than in each
6
- // rule that needs them (joshuafolkken/kit#2119). `prior-comment-read.ts` had this reading first; the
6
+ // rule that needs them. `prior-comment-read.ts` had this reading first; the
7
7
  // scout gate needs the same "what did the run already run" question, so a second copy would be the
8
8
  // clone `CLAUDE.md` prohibits. The delivery path sees only the raw tail — `delivered-rules.ts` names
9
9
  // the reason a run's own calls are not handed to it — so the earlier calls are recovered by parsing
@@ -2,8 +2,8 @@ import { test_declared_changed } from '#scripts/test/test-declared-changed'
2
2
  import type { GuardedCall } from '#scripts/time-runtime/time-batch-guard'
3
3
  import { run_tail_rule } from './run-tail-rule'
4
4
 
5
- // The trigger and the delivered text behind the `test-declared` row of `delivered-rules.ts`
6
- // (joshuafolkken/kit#2118). It lives beside `run-tail-rule.ts` and the other per-rule modules rather than
5
+ // The trigger and the delivered text behind the `test-declared` row of `delivered-rules.ts`.
6
+ // It lives beside `run-tail-rule.ts` and the other per-rule modules rather than
7
7
  // inline in the enumeration, so the enumeration stays a list of rows.
8
8
  //
9
9
  // **A commit whose code change carries no test, refused at the commit stage `run-tail` already
@@ -3,8 +3,8 @@ import { bash_triggers } from './bash-triggers'
3
3
  import { gh_api } from './gh-api'
4
4
  import { shell_segments } from './shell-segments'
5
5
 
6
- // The trigger and the delivered text behind the `third-party-write` row of `delivered-rules.ts`
7
- // (joshuafolkken/kit#2122). A `gh api` write to a repository whose owner is not this session's — a
6
+ // The trigger and the delivered text behind the `third-party-write` row of `delivered-rules.ts`.
7
+ // A `gh api` write to a repository whose owner is not this session's — a
8
8
  // tracker we do not own — is Tier C: `CLAUDE.md` → "Third-party repositories are Tier C" and
9
9
  // `upstream-interrupt.md` forbid it without explicit current-turn user instruction, and a correct
10
10
  // diagnosis is not that instruction.
@@ -25,7 +25,7 @@ import { shell_segments } from './shell-segments'
25
25
  // A third-party write means all three: a `gh api` call, a write, and a repository target whose owner
26
26
  // the classification calls third-party. `unknown` (an unreadable session remote, an unparseable path)
27
27
  // is not third-party — the rule stays silent rather than refusing a write it cannot prove is external.
28
- // The `{owner}` placeholder (joshuafolkken/kit#3188) is judged by every owner `gh` could expand it to:
28
+ // The `{owner}` placeholder is judged by every owner `gh` could expand it to:
29
29
  // first-party only when all of them are, so a fork checkout whose `upstream` is another owner's still
30
30
  // refuses the write `gh` may send there. A candidate whose owner could not be read counts as
31
31
  // third-party here — unlike an unreadable session owner, it is a remote `gh` may really write to.
@@ -2,8 +2,8 @@ import { bash_triggers } from './bash-triggers'
2
2
  import { git_argv } from './git-argv'
3
3
  import { shell_segments } from './shell-segments'
4
4
 
5
- // The trigger and the delivered text behind the `worktree-mutation` row of `delivered-rules.ts`
6
- // (joshuafolkken/kit#2120). Group 2 of the three Bash-string gaps: a working-tree change made outside
5
+ // The trigger and the delivered text behind the `worktree-mutation` row of `delivered-rules.ts`.
6
+ // Group 2 of the three Bash-string gaps: a working-tree change made outside
7
7
  // the authorized routes.
8
8
  //
9
9
  // **The deny list does not cover these at all.** `git checkout -- <path>` and `git restore <path>`
@@ -19,6 +19,10 @@ import { shell_segments } from './shell-segments'
19
19
  // (with or without `-u`) and the read-only `git stash list` / `show` pass, and everything else — bare
20
20
  // `git stash`, a message-less push, `pop` / `apply` / `drop` / `save` / `clear` — is refused.
21
21
  //
22
+ // **The refusal names the way on for a handed-over stash.** joshuafolkken/kit#3630's plan restored a
23
+ // stash with `git stash apply`, and the lane parked on how to apply it instead of popping by message;
24
+ // the reason now says the substitution is the run's own to make (joshuafolkken/kit#3648).
25
+ //
22
26
  // **It fires on every occurrence**, for the reason `git-force.ts` does: discarding the working tree is
23
27
  // destructive each time it is issued.
24
28
 
@@ -83,7 +87,7 @@ function is_unauthorized_stash(args: ReadonlyArray<string>): boolean {
83
87
  return true
84
88
  }
85
89
 
86
- // `git clean` deletes untracked files, which no commit can bring back (joshuafolkken/kit#2983). It
90
+ // `git clean` deletes untracked files, which no commit can bring back. It
87
91
  // refuses to act without a force (`clean.requireForce`), so a force — `--force`, or a cluster carrying
88
92
  // `f` — is what marks the destructive call; `git clean -n` is a dry run and passes.
89
93
  const CLEAN_SUBCOMMAND = 'clean'
@@ -127,8 +131,11 @@ const WORKTREE_MUTATION_REASON =
127
131
  'josh stash:pop "<message>"`, never a positional `git stash pop` a shared stack lets another lane ' +
128
132
  'divert. A stash push is authorized only inside a documented flow and only with a findable message ' +
129
133
  '— `git stash push -u -m "<message>"` — which this row allows; a bare `git stash`, a message-less ' +
130
- 'push, or `pop` / `apply` / `drop` is refused. **This rule fires on every occurrence, not once per ' +
131
- 'run.**'
134
+ 'push, or `pop` / `apply` / `drop` is refused. A plan that restores a handed-over stash with `git ' +
135
+ 'stash apply` / `git stash pop` is read as `pnpm josh stash:pop "<message>"`: apply it that way, ' +
136
+ 'continue, and record the substitution on the Issue — Tier A, never a `needs-decision` park ' +
137
+ 'unless the plan says why the owner keeps the stash: then stop and confirm (`operating-rules.md` ' +
138
+ '→ "no-self-staging"). **This rule fires on every occurrence, not once per run.**'
132
139
 
133
140
  const ROW = {
134
141
  id: 'worktree-mutation',
@@ -0,0 +1,165 @@
1
+ #!/usr/bin/env tsx
2
+ import { fileURLToPath } from 'node:url'
3
+ import { epic_issue } from '#scripts/epic/epic-issue'
4
+ import { git_gh_command } from '#scripts/gh/git-gh-command'
5
+ import { issue_number_shape } from '#scripts/issue/issue-number-shape'
6
+ import { run_carry, type RunCarry } from '#scripts/run/carry/run-carry'
7
+ import { run_carry_added, type CarryAddition } from '#scripts/run/carry/run-carry-added'
8
+ import { run_event_stream } from '#scripts/run/event/run-event-stream'
9
+ import { run_event_stream_emit } from '#scripts/run/event/run-event-stream-emit'
10
+ import { run_invocation } from '#scripts/run/run-invocation'
11
+ import { run_add, type AddOutcome, type AddPorts, type IssueView } from './run-add'
12
+
13
+ // `josh run:add <issue...> [--no-priority]` — the wiring around `run-add.ts`.
14
+ // It refuses unless a `backlogrun` holds the carry record here: an issue labelled with no run to take
15
+ // it would be picked up by whichever run starts next, which is not what was asked. A run that named
16
+ // issues reads its list off the record — with `--only` or without, since a named run drains the pool
17
+ // only after that list — so the queued issues are written there too; a pool run reads the labels alone. Each queued issue is announced as an `add` event, which wakes a `run:progress --wait` parked
18
+ // on a full house so the parent offers it the next freed lane.
19
+
20
+ const SUCCESS_EXIT_CODE = 0
21
+ const FAILURE_EXIT_CODE = 1
22
+ const USAGE_EXIT_CODE = 2
23
+ const ARGV_OFFSET = 2
24
+ const ISSUE_PREFIX = '#'
25
+ const NO_PRIORITY_FLAG = '--no-priority'
26
+ const USAGE = `Usage: josh run:add <issue...> [${NO_PRIORITY_FLAG}]`
27
+ const NO_RUN_MESSAGE =
28
+ 'No backlogrun is running here, so nothing was added. Start one with `backlogrun #N`.'
29
+
30
+ interface AddRequest {
31
+ issues: ReadonlyArray<number>
32
+ is_priority: boolean
33
+ }
34
+
35
+ interface LiveRun {
36
+ target: string
37
+ carry: RunCarry
38
+ }
39
+
40
+ function parse_issue(token: string): number | undefined {
41
+ const digits = token.startsWith(ISSUE_PREFIX) ? token.slice(ISSUE_PREFIX.length) : token
42
+
43
+ return issue_number_shape.ISSUE_NUMBER_PATTERN.test(digits) ? Number(digits) : undefined
44
+ }
45
+
46
+ // Every token but the flag must be an issue number: a typo is refused whole rather than adding the
47
+ // rest, so the queue never holds half of what was typed.
48
+ function parse_request(argv: ReadonlyArray<string>): AddRequest | undefined {
49
+ const tokens = argv.filter((token) => token !== NO_PRIORITY_FLAG)
50
+ const issues = tokens.map((token) => parse_issue(token)).filter((issue) => issue !== undefined)
51
+
52
+ if (issues.length === 0 || issues.length !== tokens.length) return undefined
53
+
54
+ return { issues, is_priority: !argv.includes(NO_PRIORITY_FLAG) }
55
+ }
56
+
57
+ async function live_run(): Promise<LiveRun | undefined> {
58
+ const directory = await run_carry.repository_directory()
59
+
60
+ if (directory === undefined) return undefined
61
+
62
+ const target = run_carry.carry_path(directory)
63
+ const read = run_carry.read_carry(target)
64
+
65
+ return read.kind === 'carried' ? { target, carry: read.carry } : undefined
66
+ }
67
+
68
+ // Re-read rather than reusing the record found before the labels were written: the parent may have
69
+ // marked an issue done in between, and writing the stale copy back would undo that.
70
+ function record(target: string, additions: ReadonlyArray<CarryAddition>): void {
71
+ const read = run_carry.read_carry(target)
72
+
73
+ if (
74
+ read.kind !== 'carried' ||
75
+ run_invocation.issue_numbers(read.carry.invocation) === undefined
76
+ ) {
77
+ return
78
+ }
79
+
80
+ if (additions.length > 0) run_carry_added.add_issues(target, read.carry, additions)
81
+ }
82
+
83
+ async function announce(issues: ReadonlyArray<number>): Promise<void> {
84
+ const [issue, ...rest] = issues
85
+
86
+ if (issue === undefined) return
87
+
88
+ await run_event_stream_emit.emit(
89
+ run_event_stream.EVENT_KIND.ADD,
90
+ `added ${ISSUE_PREFIX}${String(issue)}`,
91
+ )
92
+ await announce(rest)
93
+ }
94
+
95
+ // The blockers still open. A blocker whose state did not come back counts as open, so an issue is
96
+ // never reported free to run on a read that did not say so.
97
+ function view_of(json: string): IssueView | undefined {
98
+ const issue = epic_issue.parse_epic_issue(json)
99
+
100
+ if (issue === undefined) return undefined
101
+
102
+ const blockers = (issue.blockedBy?.nodes ?? [])
103
+ .filter((blocker) => epic_issue.normalize_state(blocker.state ?? '') !== epic_issue.CLOSED)
104
+ .map((blocker) => blocker.number)
105
+
106
+ return { is_open: epic_issue.is_open(issue.state), blockers }
107
+ }
108
+
109
+ async function read_issue(issue: number): Promise<IssueView | undefined> {
110
+ const read = await git_gh_command.issue_get_state_and_relations_classified(String(issue))
111
+
112
+ return read.kind === 'read' ? view_of(read.json) : undefined
113
+ }
114
+
115
+ async function apply_label(issue: number, label: string): Promise<boolean> {
116
+ return await git_gh_command.issue_add_label(String(issue), label)
117
+ }
118
+
119
+ const GH_PORTS: AddPorts = { read_issue, apply_label }
120
+
121
+ async function add(request: AddRequest, target: string, ports: AddPorts): Promise<number> {
122
+ const outcomes: ReadonlyArray<AddOutcome> = await run_add.add_all(
123
+ request.issues,
124
+ request.is_priority,
125
+ ports,
126
+ )
127
+ const additions = run_add.additions_of(outcomes, request.is_priority)
128
+
129
+ record(target, additions)
130
+ await announce(additions.map((addition) => addition.issue))
131
+
132
+ for (const outcome of outcomes) console.info(run_add.describe(outcome, request.is_priority))
133
+
134
+ return run_add.is_all_queued(outcomes) ? SUCCESS_EXIT_CODE : FAILURE_EXIT_CODE
135
+ }
136
+
137
+ async function run(argv: ReadonlyArray<string>, ports: AddPorts = GH_PORTS): Promise<number> {
138
+ const request = parse_request(argv)
139
+
140
+ if (request === undefined) {
141
+ console.error(USAGE)
142
+
143
+ return USAGE_EXIT_CODE
144
+ }
145
+
146
+ const live = await live_run()
147
+
148
+ if (live === undefined) {
149
+ console.error(NO_RUN_MESSAGE)
150
+
151
+ return FAILURE_EXIT_CODE
152
+ }
153
+
154
+ return await add(request, live.target, ports)
155
+ }
156
+
157
+ async function main(argv: ReadonlyArray<string>): Promise<void> {
158
+ process.exitCode = await run(argv)
159
+ }
160
+
161
+ const run_add_cli = { NO_RUN_MESSAGE, USAGE, parse_request, run }
162
+
163
+ if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
164
+
165
+ export { run_add_cli }