@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
@@ -1,12 +1,10 @@
1
1
  import { parse_json } from '#scripts/git/parse-json-array'
2
2
  import { z } from 'zod'
3
3
 
4
- // Why one `gh api` request failed, taken from **that request** rather than from a later probe
5
- // (joshuafolkken/kit#1690).
4
+ // Why one `gh api` request failed, taken from **that request** rather than from a later probe.
6
5
  //
7
- // joshuafolkken/kit#957 asked the same question by issuing a second request — `exec_gh_api_status`
8
- // against the same path — and joshuafolkken/kit#1663 asked it again with a reachability probe fired
9
- // after the answer was otherwise final. Both are inferences about a request that is already over: a
6
+ // A second request — `exec_gh_api_status` against the same path, or a reachability probe fired
7
+ // after the answer is otherwise final — is only an inference about a request that is already over: a
10
8
  // connection that dropped for three hundred milliseconds fails the read and answers the probe
11
9
  // `reachable`, so the failure keeps the meaning the probe gave it and not the one it had.
12
10
  //
@@ -14,7 +12,7 @@ import { z } from 'zod'
14
12
  // `gh api` writes the **response body** to stdout, and GitHub's REST error document carries its own
15
13
  // status — `{"message":"Not Found","documentation_url":…,"status":"404"}`. A request that never
16
14
  // reached GitHub has no response body at all, so stdout is empty. That is the whole classification,
17
- // and neither half reads gh's stderr prose, which is what joshuafolkken/kit#1024 refused to key on.
15
+ // and neither half reads gh's stderr prose, which is wording rather than protocol.
18
16
 
19
17
  // GitHub's REST error document. Only the status is read: `message` and `documentation_url` are prose
20
18
  // for a person, and every other field varies by endpoint.
@@ -41,8 +39,7 @@ interface GhFailure {
41
39
  // for a related resource, reached only because the first answered. Such a request fails about
42
40
  // itself, so its 404 says nothing about whether the subject exists: an issue read whose blocker
43
41
  // relations then 404 on a host without that endpoint is a readable issue, not a missing one. Only
44
- // the caller knows which of its requests was which, so it is the caller that sets this
45
- // (joshuafolkken/kit#1690).
42
+ // the caller knows which of its requests was which, so it is the caller that sets this.
46
43
  is_followup?: boolean
47
44
  }
48
45
 
@@ -62,7 +59,7 @@ function has_gh_failure(error: unknown): error is Error & { gh_failure: GhFailur
62
59
  // nothing in it says what the status was, and guessing one would be the inference this module
63
60
  // exists to remove.
64
61
  function parse_response_status(stdout: string): number | undefined {
65
- const document = parse_json.parse_json_object_safe(stdout, error_document_schema)
62
+ const document = parse_json.parse_json_object_or_undefined(stdout, error_document_schema)
66
63
  if (document?.status === undefined) return undefined
67
64
  const status = Number(document.status)
68
65
 
@@ -4,7 +4,7 @@ import { has_stderr_field } from './git-gh-exec'
4
4
  // string itself, so the value arrives raw and there is nothing to unquote — this used to strip a
5
5
  // leading and trailing `"` anyway, which ate real characters from any answer that legitimately
6
6
  // carried them. A title of `"queue" should stop at the first failure` reached Telegram as
7
- // `queue" should stop at the first failure` (joshuafolkken/kit#993). Trimming and the empty answer
7
+ // `queue" should stop at the first failure`. Trimming and the empty answer
8
8
  // are the whole contract.
9
9
  function parse_pr_state_string(result: string): string | undefined {
10
10
  const trimmed = result.trim()
@@ -12,13 +12,12 @@ import {
12
12
  // Listing issues through REST, in the JSON shape `gh issue list --json <fields>` answered with.
13
13
  //
14
14
  // `gh issue list` goes through GraphQL, which a cloud session is answered 403 for; the REST listing
15
- // is served normally (joshuafolkken/kit#1022). The callers differ only in filter and fields, so
15
+ // is served normally. The callers differ only in filter and fields, so
16
16
  // the request, the paging and the mapping are decided once here and every caller downstream keeps
17
- // reading the field names it already reads (joshuafolkken/kit#1025).
17
+ // reading the field names it already reads.
18
18
  //
19
- // It was `issue_list_open` until joshuafolkken/kit#1679, when the duplicate scan needed the issue
20
- // that closed an hour ago and `state` became a parameter. The name went with the behavior rather
21
- // than being left to describe six of seven callers.
19
+ // `state` is a parameter because the duplicate scan needs the issue that closed an hour ago, and the
20
+ // name describes that behavior rather than the open-only listing most callers ask for.
22
21
  //
23
22
  // The field mapping itself is `git-gh-issue-rest.ts`, the same one the single-issue read goes
24
23
  // through: a listing row and a read response are the same object, so a second copy of the state
@@ -38,7 +37,7 @@ const LISTING_DIRECTION = 'direction=desc'
38
37
 
39
38
  // `state` and `sort` are parameters rather than constants because the duplicate scan has to see the
40
39
  // issue that closed an hour ago: the work most likely to be filed twice is the work that just
41
- // finished, and a listing fixed at `state=open` cannot show it (joshuafolkken/kit#1679). Ordering a
40
+ // finished, and a listing fixed at `state=open` cannot show it. Ordering a
42
41
  // closed listing by `created` would rank it by when each issue was *filed*, which says nothing about
43
42
  // when it closed — so the sort travels with the state rather than being fixed alongside it.
44
43
  //
@@ -77,7 +76,7 @@ function listing_path(request: IssueListRequest, page: number): string {
77
76
  return `${git_gh_api_path.issues_api_path(request.repo)}?${listing_query(request)}${label}${paging}`
78
77
  }
79
78
 
80
- // `--search "<term> in:body"` matched tokens, so `#858` never matched inside `#8580`. A bare
79
+ // `--search "<term> in:body"` matches tokens, so `#858` never matches inside `#8580`. A bare
81
80
  // substring test does, and those false positives fill the caller's `limit` newest-first — crowding
82
81
  // out an older genuine match, which `epic:audit` would then never report. The term is always
83
82
  // `#<number>`, whose `#` anchors the left side, so only a trailing digit has to be refused.
@@ -126,22 +125,19 @@ async function fetch_page(
126
125
 
127
126
  // The ceiling on how far *any* listing pages. Without it a request pages until the backlog runs
128
127
  // out: the body search's matches are normally zero, so "stop once `limit` rows are selected" never
129
- // fires for it (joshuafolkken/kit#1033), and the other five reach `limit` only after the client-side
128
+ // fires for it, and the other five reach `limit` only after the client-side
130
129
  // pull-request exclusion has discarded whatever the endpoint served alongside the issues — which in
131
- // a repository with hundreds of open pull requests is the whole backlog again
132
- // (joshuafolkken/kit#1067).
130
+ // a repository with hundreds of open pull requests is the whole backlog again.
133
131
  //
134
132
  // Five pages bounds every listing at five requests, and five hundred rows is comfortably above what
135
133
  // each caller asks for: the widest is `epic:bundle`'s two hundred, which the ceiling only cuts short
136
134
  // once more than three in five of the newest five hundred open items are pull requests. A repository
137
135
  // big enough to reach it is *told* rather than handed a shorter answer.
138
136
  //
139
- // **It applies to every listing only because the flag now reaches every caller.** Until
140
- // joshuafolkken/kit#1067 `issue_list` discarded `is_capped`, so bounding a listing whose caller
141
- // could not read the flag would have shortened that listing's answer in silence — the defect the
142
- // bound exists to prevent, introduced by the fix for it. Threading the flag out came first for that
143
- // reason, and the two must never be separated again: a ceiling is only ever as safe as the caller's
144
- // ability to say it was reached.
137
+ // **It applies to every listing only because the flag reaches every caller.** Bounding a listing
138
+ // whose caller cannot read `is_capped` would shorten that listing's answer in silence — the defect
139
+ // the bound exists to prevent. So the two must never be separated: a ceiling is only ever as safe as
140
+ // the caller's ability to say it was reached.
145
141
  const MAX_PAGES = 5
146
142
  // The ceiling in issues, which is how the callers that report the gap phrase it.
147
143
  const MAX_SCANNED = MAX_PAGES * PER_PAGE
@@ -199,7 +195,7 @@ async function fetch_selected(request: IssueListRequest): Promise<SelectedRows>
199
195
  // issue GitHub itself reports as unblocked costs no request. A backlog with no declared blockers
200
196
  // therefore costs exactly what `gh` cost — one listing — rather than one request per row.
201
197
  //
202
- // Bounded rather than sequential (joshuafolkken/kit#3103): the pass was paced one request at a time,
198
+ // Bounded rather than sequential: the pass was paced one request at a time,
203
199
  // which made every `backlog:plan` wait about 0.7 s per opted-in issue declaring a blocker. The width
204
200
  // is the one `epic:bundle` already reads the same endpoint at, so the burst stays bounded while a
205
201
  // rate-limited read still fails the whole listing rather than a row (`bounded-pool.ts`).
@@ -218,7 +214,7 @@ async function read_relations(
218
214
 
219
215
  // The listing, plus what it could not cover. `json` is `undefined` — never `'[]'` — when the listing
220
216
  // could not be read: `epic:next`'s per-repository exclusion reads this answer, and "nothing is
221
- // running" is what *starts* a second run in the same checkout (joshuafolkken/kit#925).
217
+ // running" is what *starts* a second run in the same checkout.
222
218
  //
223
219
  // `is_capped` is `false` on that failure path, and says nothing there: an unreadable listing is
224
220
  // already fully described by `json`, and a caller reading a truncation flag off it would be reading
@@ -246,7 +242,7 @@ async function issue_list(request: IssueListRequest): Promise<IssueListOutcome>
246
242
  }
247
243
  }
248
244
 
249
- // The flag-discarding second entry point is gone (joshuafolkken/kit#1067). It answered
245
+ // The flag-discarding second entry point is gone. It answered
250
246
  // `string | undefined` for the five callers that could not reach the page ceiling, and once the
251
247
  // ceiling applies to all six there is no such caller left: a wrapper that dropped `is_capped` would
252
248
  // be the one way back to a silently shortened answer, so it is removed rather than left for someone
@@ -13,26 +13,22 @@ import { gh_reachability } from './git-gh-reachability'
13
13
 
14
14
  // Reading one issue. Split out of `git-gh-issue.ts`, which had grown past the file-length limit
15
15
  // while holding both the reads and the writes; the reads are what every epic command goes through,
16
- // and telling a number that resolves to nothing from a read that failed belongs with them
17
- // (joshuafolkken/kit#957).
16
+ // and telling a number that resolves to nothing from a read that failed belongs with them.
18
17
 
19
18
  // The blocker relations, which REST serves from their own endpoint rather than inside the issue.
20
19
  // `gh issue view --json blockedBy` answered them in the same response because GraphQL selects them
21
- // as a connection; REST needs a second request (joshuafolkken/kit#1024).
20
+ // as a connection; REST needs a second request.
22
21
  //
23
22
  // One page of a hundred — `FULL_PAGE_QUERY`, the same one every other listing here asks for — where
24
23
  // GraphQL asked for `blockedBy(first:50)`, so `nodes` is at least as complete as it was, while
25
24
  // `totalCount` comes from the issue's own dependency summary and stays exact whatever the page
26
- // holds. The endpoint itself is named in `git-gh-api-path.ts`, which the two writes address as well
27
- // (joshuafolkken/kit#1026).
25
+ // holds. The endpoint itself is named in `git-gh-api-path.ts`, which the two writes address as well.
28
26
  //
29
- // joshuafolkken/kit#1113 split this out for the one caller that may not consult the summary the
30
- // wrapper below trusts: the summary is GitHub's own count and it can disagree with the listing it
31
- // counts. Measured on joshuafolkken/kit#1111, whose `issue_dependencies_summary` read
32
- // `total_blocked_by: 0` while this endpoint returned `#1106` — and re-POSTing that relation was
33
- // refused with `Target issue has already been taken`, so the relation was real and only the counter
34
- // was wrong. `epic:next` then called a graph that agreed with itself contradictory and exited 1,
35
- // which stops an unattended run at its first step with nothing to fix.
27
+ // Split out for the one caller that may not consult the summary the wrapper below trusts: the
28
+ // summary is GitHub's own count and it can disagree with the listing it counts — an
29
+ // `issue_dependencies_summary` can read `total_blocked_by: 0` while this endpoint returns a real
30
+ // relation. Trusting the counter there makes `epic:next` call a graph that agrees with itself
31
+ // contradictory and exit 1, which stops an unattended run at its first step with nothing to fix.
36
32
  async function read_blocked_by_listing(
37
33
  issue_number: string,
38
34
  repo?: string,
@@ -48,22 +44,20 @@ async function read_blocked_by_listing(
48
44
  // The same relations, with the request skipped when the issue's own summary says the count is zero.
49
45
  // That skip is the common case and the one that matters for cost: `epic:bundle` reads relations for
50
46
  // the whole open backlog, up to two hundred issues, and every one of those reads names `blockedBy`.
51
- // Without it the pass would be four hundred requests where `gh` made two hundred — which is why
52
- // joshuafolkken/kit#1113 left it in place and gave the rare path its own entry point above rather
53
- // than making every read pay for it.
47
+ // Without it the pass would be four hundred requests instead of two hundred — which is why the rare
48
+ // path has its own entry point above rather than making every read pay for it.
54
49
  //
55
50
  // A pull request is skipped ahead of that, structurally rather than on a count. It carries no
56
51
  // `issue_dependencies_summary` at all, and an absent summary is deliberately not read as a zero — so
57
52
  // the numeric skip cannot fire for one, and the endpoint was asked every time. GitHub answers an
58
53
  // empty array today, but a 404 there would fail the whole read and `epic:bundle` would report the
59
- // reference as `unreadable` **before** the `/pull/` check that drops it (joshuafolkken/kit#947) ever
60
- // ran. The guard rested on API behavior nobody controls; this makes it a fact about pull requests
61
- // (joshuafolkken/kit#1066).
54
+ // reference as `unreadable` **before** the `/pull/` check that drops it ever
55
+ // ran. The guard rested on API behavior nobody controls; this makes it a fact about pull requests.
62
56
  //
63
57
  // Exported because the *listings* need exactly this, and for exactly this reason: a listing response
64
58
  // carries every row's `issue_dependencies_summary` but no `blockedBy`, so the pickup that asks for
65
59
  // the field pays one request per row that declares a blocker and nothing for the rest. A second copy
66
- // beside the listing requests is the clone `CLAUDE.md` prohibits (joshuafolkken/kit#1025).
60
+ // beside the listing requests is the clone `CLAUDE.md` prohibits.
67
61
  async function read_blocked_by(
68
62
  issue_number: string,
69
63
  rest: RestIssue,
@@ -88,7 +82,7 @@ function mark_followup(error: unknown): unknown {
88
82
  return gh_failure.attach(error, { ...failure, is_followup: true })
89
83
  }
90
84
 
91
- // The relations, marked as the follow-up request they are (joshuafolkken/kit#1690).
85
+ // The relations, marked as the follow-up request they are.
92
86
  //
93
87
  // **One read, two requests, one classifier.** The relations endpoint is reached only after the issue
94
88
  // itself came back, so by then the number has resolved — and yet the caller catches a single error
@@ -109,8 +103,7 @@ async function read_relations(
109
103
  }
110
104
 
111
105
  // One issue through REST, answered in the field names `gh issue view --json` used. Every read below
112
- // goes through it, so the request, the field mapping and the blocker relations are decided once
113
- // (joshuafolkken/kit#1024).
106
+ // goes through it, so the request, the field mapping and the blocker relations are decided once.
114
107
  //
115
108
  // The blocker request is made **only** when `blockedBy` was asked for — the title, body and
116
109
  // labels-and-body reads never name it — and, when it was, only when the issue itself reports a
@@ -136,10 +129,10 @@ async function read_issue_fields(
136
129
  // another repository's number quoted in prose — which is an answer rather than a gap. `unreadable`
137
130
  // is a gap: a rate limit, expired auth, a dropped connection. Folding the two together had one
138
131
  // non-existent number reported as something the command had failed to read, which stops an
139
- // unattended run for a reference that never existed (joshuafolkken/kit#957).
132
+ // unattended run for a reference that never existed.
140
133
  //
141
- // **`reason` splits the gap into the three answers a caller acts on differently**
142
- // (joshuafolkken/kit#1690). `unreachable` is retryable — nothing answered, or GitHub answered 429 or
134
+ // **`reason` splits the gap into the three answers a caller acts on differently**.
135
+ // `unreachable` is retryable — nothing answered, or GitHub answered 429 or
143
136
  // 5xx — so the same request a moment later can succeed and an unattended run should ask again rather
144
137
  // than report the backlog empty. `rejected` is an answer that will not change on its own: expired
145
138
  // auth, an org policy, a 403. `malformed` is a response that arrived and could not be used, which is
@@ -161,19 +154,17 @@ type FieldRead = IssueReadFailure | { kind: 'read'; text: string | undefined }
161
154
  // not there.
162
155
  const NOT_FOUND_STATUS = 404
163
156
 
164
- // Why the read failed, read off **the failed request** rather than off a second one
165
- // (joshuafolkken/kit#1690).
157
+ // Why the read failed, read off **the failed request** rather than off a second one.
166
158
  //
167
- // joshuafolkken/kit#957 answered this by probing the same path again for its status, and
168
- // joshuafolkken/kit#1024 kept the probe because gh surfaces a failure as stderr text and classifying
169
- // by that wording is prose-matching. Both premises held; the conclusion did not. `gh api` writes the
170
- // **response body** to stdout, and GitHub's own error document carries the status there — so the
171
- // status was on the failed request all along, and `git-gh-failure.ts` takes it from there.
159
+ // Classifying by gh's stderr wording would be prose-matching, but no second request is needed:
160
+ // `gh api` writes the **response body** to stdout, and GitHub's own error document carries the
161
+ // status there — so the status is on the failed request itself, and `git-gh-failure.ts` takes it
162
+ // from there.
172
163
  //
173
164
  // **A second request cannot answer about the first.** A connection that dropped for a moment fails
174
- // the read and answers the probe `reachable`, and the read then keeps the meaning the probe gave it.
175
- // Removing the probe removes that, and removes the extra request with it: the classification is now
176
- // free, so `epic:bundle`'s bounded lookup no longer trades accuracy against a rate limit it would
165
+ // the read and answers a probe `reachable`, and the read would then keep the meaning the probe gave
166
+ // it. Reading the failed request avoids that and the extra request with it: the classification is
167
+ // free, so `epic:bundle`'s bounded lookup does not trade accuracy against a rate limit it would
177
168
  // deepen.
178
169
  //
179
170
  // An error carrying no classification at all did not come from the request: `parse_rest_issue` and
@@ -191,7 +182,7 @@ function to_read_failure(error: unknown): IssueReadFailure {
191
182
 
192
183
  if (failure === undefined) return { kind: 'unreadable', reason: 'malformed', status: undefined }
193
184
  // Only the request that resolves the number can report it as resolving to nothing. A follow-up
194
- // request's own 404 is about that endpoint (joshuafolkken/kit#1690).
185
+ // request's own 404 is about that endpoint.
195
186
  if (is_number_unresolved(failure)) return { kind: 'missing' }
196
187
 
197
188
  return {
@@ -220,8 +211,7 @@ async function issue_view_json_classified(
220
211
  //
221
212
  // The unwrapped `string | undefined` below is this same read with the reason dropped, rather than a
222
213
  // second read that never had one: a caller that only wants the text keeps its signature, and one
223
- // that has to tell "the body is empty" from "the body could not be read" now can
224
- // (joshuafolkken/kit#1690).
214
+ // that has to tell "the body is empty" from "the body could not be read" now can.
225
215
  async function issue_view_field_classified(
226
216
  issue_number: string,
227
217
  field: string,
@@ -247,12 +237,10 @@ async function issue_view_field(
247
237
  return read.kind === 'read' ? read.text : undefined
248
238
  }
249
239
 
250
- // An extracted string arrives raw — nothing quotes it — and an empty answer is not a title
251
- // (joshuafolkken/kit#993).
240
+ // An extracted string arrives raw — nothing quotes it — and an empty answer is not a title.
252
241
  //
253
242
  // `repo` reads the title of an issue in another repository — what `josh notify` needs when the
254
- // `--issue-url` it was given points outside the repository the session runs in
255
- // (joshuafolkken/kit#903).
243
+ // `--issue-url` it was given points outside the repository the session runs in.
256
244
  async function issue_get_title(issue_number: string, repo?: string): Promise<string | undefined> {
257
245
  const result = await issue_view_field(issue_number, 'title', repo)
258
246
 
@@ -265,15 +253,14 @@ async function issue_get_body(issue_number: string, repo?: string): Promise<stri
265
253
 
266
254
  // The body, plus why it produced nothing when it did. An epic's body is the one read whose absence
267
255
  // is indistinguishable from a legitimate answer — an epic with no task list and an epic nobody could
268
- // read both parse to zero children — so the caller that builds the dependency graph takes this one
269
- // (joshuafolkken/kit#1690).
256
+ // read both parse to zero children — so the caller that builds the dependency graph takes this one.
270
257
  async function issue_get_body_classified(issue_number: string, repo?: string): Promise<FieldRead> {
271
258
  return await issue_view_field_classified(issue_number, 'body', repo)
272
259
  }
273
260
 
274
261
  // A JSON view of one issue, for every caller that wants several fields at once. Callers differ only
275
262
  // in which fields they ask for, and a helper per field list is how four near-identical functions
276
- // accumulated (joshuafolkken/kit#862).
263
+ // accumulated.
277
264
  //
278
265
  // The field list is still spelled the way `gh issue view --json` spelled it, and so is the answer:
279
266
  // the translation to and from REST is `git-gh-issue-rest.ts`, so no caller downstream changed.
@@ -289,11 +276,11 @@ async function issue_view_json(
289
276
 
290
277
  // State, labels and dependency relations in one read: the epic auto-close needs state and relations
291
278
  // per child, `epic:next` needs the labels too, and splitting them would multiply the API calls for
292
- // no gain (joshuafolkken/kit#860).
279
+ // no gain.
293
280
  //
294
281
  // `repo` reads a child in another repository. Cross-repository children are read this way rather
295
282
  // than from a local checkout: their state is a GitHub fact, and requiring a clone to learn it is
296
- // what kept the auto-close from ever running on such an epic (joshuafolkken/kit#864).
283
+ // what kept the auto-close from ever running on such an epic.
297
284
  const STATE_AND_RELATIONS_FIELDS = 'number,state,labels,blockedBy'
298
285
 
299
286
  async function issue_get_state_and_relations(
@@ -304,8 +291,7 @@ async function issue_get_state_and_relations(
304
291
  }
305
292
 
306
293
  // The same read, plus why it produced nothing when it did. An epic's children are read this way, and
307
- // an unattended run has to tell a child it could not reach from one it may never reach
308
- // (joshuafolkken/kit#1690).
294
+ // an unattended run has to tell a child it could not reach from one it may never reach.
309
295
  async function issue_get_state_and_relations_classified(
310
296
  issue_number: string,
311
297
  repo?: string,
@@ -325,8 +311,7 @@ function is_unreachable_read(failure: IssueReadFailure): boolean {
325
311
  //
326
312
  // `epic:bundle` reads a referenced issue through the same call rather than adding a helper for its
327
313
  // own field list — it needs the body and the state, which is a subset of this one, and a helper per
328
- // field list is exactly how the four near-identical functions above accumulated
329
- // (joshuafolkken/kit#947).
314
+ // field list is exactly how the four near-identical functions above accumulated.
330
315
  const PLAN_FIELDS = 'number,title,body,state,url,labels,blockedBy'
331
316
 
332
317
  async function issue_get_plan_fields(issue_number: string): Promise<string | undefined> {
@@ -336,12 +321,12 @@ async function issue_get_plan_fields(issue_number: string): Promise<string | und
336
321
  // The same fields, with a failed read told apart from a number that resolves to nothing.
337
322
  // `epic:bundle` reads a reference this way because the two answers belong in different places: a
338
323
  // missing number is neither a candidate nor a gap, while an unreadable one is reported so a verdict
339
- // is never quietly based on data that never arrived (joshuafolkken/kit#957).
324
+ // is never quietly based on data that never arrived.
340
325
  async function issue_get_plan_fields_classified(issue_number: string): Promise<IssueRead> {
341
326
  return await issue_view_json_classified(issue_number, PLAN_FIELDS)
342
327
  }
343
328
 
344
- // `state` rides along for `epic-add.ts`'s closed-epic refusal (joshuafolkken/kit#2337); every
329
+ // `state` rides along for `epic-add.ts`'s closed-epic refusal; every
345
330
  // other caller reads only the labels and body and ignores it, so it costs no extra request.
346
331
  async function issue_get_labels_and_body(issue_number: string): Promise<string | undefined> {
347
332
  return await issue_view_json(issue_number, 'number,state,labels,body')
@@ -349,8 +334,7 @@ async function issue_get_labels_and_body(issue_number: string): Promise<string |
349
334
 
350
335
  // The conversation comments of one issue, as REST serves them. `undefined` — never `'[]'` — when the
351
336
  // listing could not be read: the one caller has to tell "this epic carries no closing comment" from
352
- // "nobody looked", because posting on the second answer is the duplicate it exists to prevent
353
- // (joshuafolkken/kit#1039).
337
+ // "nobody looked", because posting on the second answer is the duplicate it exists to prevent.
354
338
  //
355
339
  // Paged, and for the same reason `pr_get_comments` is: REST answers 30 rows and an epic's
356
340
  // conversation outgrows that, while the comment being looked for is the **newest** one — so an
@@ -380,8 +364,7 @@ async function issue_list_comments(issue_number: string): Promise<string | undef
380
364
  // than read off `gh`'s stderr wording, because classifying by the message is prose-matching.
381
365
  //
382
366
  // **This one could read the failed request instead, and deliberately does not** — its caller reaches
383
- // it from a `catch`, where the error it holds already carries `gh_failure` since
384
- // joshuafolkken/kit#1690. What is asked here is not "why did that request fail" but "does this
367
+ // it from a `catch`, where the error it holds already carries `gh_failure`. What is asked here is not "why did that request fail" but "does this
385
368
  // endpoint exist on this host", and the answer has to hold for a `read_blocked_by_listing` that
386
369
  // failed for some other reason entirely. Reusing the caught failure would fold the two questions
387
370
  // into one.
@@ -394,17 +377,17 @@ async function has_no_relations_endpoint(issue_number: string, repo?: string): P
394
377
  }
395
378
 
396
379
  // The blocker numbers of one issue, read from the relations listing rather than from the issue's own
397
- // summary count (joshuafolkken/kit#1113). Exposed on the command object so the callers that need the
380
+ // summary count. Exposed on the command object so the callers that need the
398
381
  // uncounted answer reach it the way they reach every other read, and so a suite that already fakes
399
382
  // the command layer does not fall through to a real `gh api`.
400
383
  //
401
384
  // A 404 is answered as no relations rather than raised. `read_blocked_by` never reaches this
402
- // endpoint for a pull request — joshuafolkken/kit#1066 skips one structurally, since a PR carries no
385
+ // endpoint for a pull request — it skips one structurally, since a PR carries no
403
386
  // `issue_dependencies_summary` to skip on — and this entry point has no issue payload to make that
404
387
  // judgement from. A PR pasted into an epic's task list would otherwise turn a read of an endpoint
405
388
  // that has nothing for it into a warning about a relation nobody lost. Every other failure still
406
389
  // raises: a rate limit is a gap, and the caller says so.
407
- // The same relations, each carrying the repository it lives in (joshuafolkken/kit#1126). A
390
+ // The same relations, each carrying the repository it lives in. A
408
391
  // `blocked-by` relation may cross a repository, and a number alone cannot say which one it names —
409
392
  // issue numbers are unique per repository — so a caller that orders work has to keep the pair.
410
393
  //
@@ -1,7 +1,7 @@
1
1
  import { blocking_issue_schema } from '#scripts/git/git-schemas'
2
2
  import {
3
3
  parse_json_array_or_undefined,
4
- parse_json_object_safe,
4
+ parse_json_object_or_undefined,
5
5
  } from '#scripts/git/parse-json-array'
6
6
  import type { IssueReference } from '#scripts/issue/issue-reference'
7
7
  import { z } from 'zod'
@@ -11,11 +11,10 @@ import { MERGED_STATE, to_gh_state } from './git-gh-rest-state'
11
11
  // `gh issue view --json <fields>` used to answer with.
12
12
  //
13
13
  // `gh issue view` goes through GraphQL, which a cloud session is answered 403 for while the REST
14
- // endpoint is served normally (joshuafolkken/kit#1022). The reads in `git-gh-issue-read.ts` are what
14
+ // endpoint is served normally. The reads in `git-gh-issue-read.ts` are what
15
15
  // every epic command goes through, so they move to REST — and every caller downstream keeps reading
16
16
  // the field names it already reads. The mapping lives here rather than beside the requests because
17
- // it is pure: given the two responses, it decides the answer with nothing else to know
18
- // (joshuafolkken/kit#1024).
17
+ // it is pure: given the two responses, it decides the answer with nothing else to know.
19
18
 
20
19
  // Only the fields the mapping itself reads are named; every other key passes through untouched,
21
20
  // which is what lets a caller ask for a field this file has never heard of.
@@ -52,7 +51,7 @@ const BLOCKED_BY_FIELD = 'blockedBy'
52
51
  // purpose: `blockedBy` is a connection `gh` served inside the issue, while this is the exact count
53
52
  // GitHub already puts in the listing's own `issue_dependencies_summary`. A caller that asks for it
54
53
  // learns whether an issue has blockers **without** the per-issue request that reading `blockedBy`
55
- // costs — which is what lets `epic:bundle` stop re-reading every open issue (joshuafolkken/kit#1736).
54
+ // costs — which is what lets `epic:bundle` stop re-reading every open issue.
56
55
  //
57
56
  // It is `undefined` rather than `0` where the summary is absent — a pull request, which this
58
57
  // endpoint serves as readily as an issue, carries none. Reading that as "no blockers" is the one
@@ -63,7 +62,7 @@ const BODY_FIELD = 'body'
63
62
  const FIELD_SEPARATOR = ','
64
63
  const EMPTY_BODY = ''
65
64
 
66
- // The two field names REST and `gh --json` disagree on. `url` is the one that bites: REST's `url` is
65
+ // The field names REST and `gh --json` disagree on. `url` is the one that bites: REST's `url` is
67
66
  // the API endpoint, while `gh` answers the browser URL — and `epic_issue.is_pull_request` decides
68
67
  // from `/pull/` appearing in it, which the API endpoint never carries.
69
68
  //
@@ -71,6 +70,7 @@ const EMPTY_BODY = ''
71
70
  const REST_FIELD_NAMES = new Map<string, string>([
72
71
  ['url', 'html_url'],
73
72
  ['createdAt', 'created_at'],
73
+ ['closedAt', 'closed_at'],
74
74
  ])
75
75
 
76
76
  const NOT_AN_ISSUE_MESSAGE = 'gh api answered something other than an issue object'
@@ -123,7 +123,7 @@ function to_gh_field_value(field: string, rest: RestIssue): unknown {
123
123
  // catch it into `undefined`, which is the same "the read failed" every other failure produces, while
124
124
  // a partial object would be reported as an issue whose fields are all missing.
125
125
  function parse_rest_issue(rest_json: string): RestIssue {
126
- const parsed = parse_json_object_safe(rest_json, rest_issue_schema)
126
+ const parsed = parse_json_object_or_undefined(rest_json, rest_issue_schema)
127
127
  if (parsed === undefined) throw new Error(NOT_AN_ISSUE_MESSAGE)
128
128
 
129
129
  return parsed
@@ -131,8 +131,7 @@ function parse_rest_issue(rest_json: string): RestIssue {
131
131
 
132
132
  // `repos/{owner}/{repo}/issues` serves pull requests alongside issues; `gh issue list` never did,
133
133
  // and its six callers all read the answer as issues. The key is present on a pull request and
134
- // absent on an issue, which is the same signal `to_issue_state` already reads
135
- // (joshuafolkken/kit#1025).
134
+ // absent on an issue, which is the same signal `to_issue_state` already reads.
136
135
  function is_pull_request(rest: RestIssue): boolean {
137
136
  return rest.pull_request !== undefined && rest.pull_request !== null
138
137
  }
@@ -140,7 +139,7 @@ function is_pull_request(rest: RestIssue): boolean {
140
139
  // One page of the listing endpoint, whose elements are the same objects `parse_rest_issue` reads one
141
140
  // of. It throws for the reason that one does: a response that is not a listing — `gh` answering
142
141
  // `{"message":"API rate limit exceeded"}` — must not degrade into an empty listing, which every
143
- // caller here reads as "there is nothing" (joshuafolkken/kit#950).
142
+ // caller here reads as "there is nothing".
144
143
  function parse_rest_issues(rest_json: string): Array<RestIssue> {
145
144
  const parsed = parse_json_array_or_undefined(rest_json, rest_issue_schema)
146
145
  if (parsed === undefined) throw new Error(NOT_AN_ISSUE_LISTING_MESSAGE)
@@ -151,7 +150,7 @@ function parse_rest_issues(rest_json: string): Array<RestIssue> {
151
150
  // The connection for an issue GitHub itself says has no blockers, answered without a request. `gh`
152
151
  // sent `blockedBy` inside the issue response, so a second request per issue would double
153
152
  // `epic:bundle`'s pass over the whole open backlog — and the issue's own summary settles the common
154
- // case, which is an issue with no blockers at all (joshuafolkken/kit#1024).
153
+ // case, which is an issue with no blockers at all.
155
154
  function empty_blocked_by(): BlockedBy {
156
155
  return { nodes: [], totalCount: 0 }
157
156
  }
@@ -160,7 +159,7 @@ function empty_blocked_by(): BlockedBy {
160
159
  //
161
160
  // A blocker relation may cross a repository, and the number alone cannot say which one it is: issue
162
161
  // numbers are unique per repository, so a blocker read bare resolves against the blocked child's own
163
- // repository and names a different issue there (joshuafolkken/kit#1126). Undefined when the field is
162
+ // repository and names a different issue there. Undefined when the field is
164
163
  // absent or shaped otherwise; the caller then falls back to the repository it is reading in, which is
165
164
  // what an unqualified relation has always meant.
166
165
  function repo_of_url(repository_url: string | undefined = ''): string | undefined {
@@ -174,7 +173,7 @@ function repo_of_url(repository_url: string | undefined = ''): string | undefine
174
173
  //
175
174
  // A listing that will not parse throws instead of answering an empty connection. That direction is
176
175
  // the point: an empty `nodes` reads as "this child has no blockers", and `epic:next` would then hand
177
- // a dependent to an unattended run before its prerequisite (joshuafolkken/kit#1005).
176
+ // a dependent to an unattended run before its prerequisite.
178
177
  function to_blocked_by(blockers_json: string, exact_total?: number): BlockedBy {
179
178
  const parsed = parse_json_array_or_undefined(blockers_json, blocking_issue_schema)
180
179
  if (parsed === undefined) throw new Error(NOT_A_BLOCKER_LISTING_MESSAGE)
@@ -209,8 +208,8 @@ function to_field_text(value: unknown): string {
209
208
 
210
209
  const CLOSED = 'CLOSED'
211
210
 
212
- // One blocker node as a reference, keeping the state the relation response carried
213
- // (joshuafolkken/kit#1943). Single-sourced here because the snapshot read and the candidate re-read
211
+ // One blocker node as a reference, keeping the state the relation response carried.
212
+ // Single-sourced here because the snapshot read and the candidate re-read
214
213
  // both unwrap the same node, and the state is omitted rather than guessed when REST did not send it.
215
214
  function reference_of_blocker(
216
215
  node: z.infer<typeof blocking_issue_schema>,