@joshuafolkken/kit 1.1240.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 (934) 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 +19 -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 +26 -16
  27. package/.claude/skills/workflow-commands/latest-gate.md +17 -28
  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/.vscode/tasks.json +14 -0
  42. package/CLAUDE.md +10 -61
  43. package/README.md +29 -47
  44. package/SECURITY.md +1 -1
  45. package/dist/CLAUDE.md +10 -61
  46. package/dist/commands/document-section-cli.js +42 -10
  47. package/dist/config-merge/index.js +11 -2
  48. package/dist/hooks/audit-provision.js +2 -2
  49. package/dist/hooks/batch-guard.js +7 -7
  50. package/dist/hooks/{chunk-KHGB5S3Y.js → chunk-43G45XJF.js} +18 -20
  51. package/dist/hooks/{chunk-4TZVB44A.js → chunk-4TW4MQUL.js} +284 -362
  52. package/dist/hooks/{chunk-XZYKEM6J.js → chunk-76RK6E3H.js} +13 -11
  53. package/dist/hooks/{chunk-F3ELQ2AF.js → chunk-DZWZ3DKY.js} +4 -4
  54. package/dist/hooks/{chunk-5VNDSNG3.js → chunk-FZ6FUSBM.js} +1 -1
  55. package/dist/hooks/{chunk-GPTFMK5E.js → chunk-GG72ANKI.js} +1 -1
  56. package/dist/hooks/{chunk-ZQGD4GBY.js → chunk-KPM4YIIX.js} +8 -44
  57. package/dist/hooks/chunk-MXVQMLDP.js +3705 -0
  58. package/dist/hooks/{chunk-ELCN5LCH.js → chunk-NEC4AT4Z.js} +34 -12
  59. package/dist/hooks/{chunk-QVSWU24O.js → chunk-NZBHG6FW.js} +7 -5
  60. package/dist/hooks/chunk-NZN2UFI6.js +2409 -0
  61. package/dist/hooks/{chunk-KRBERBBI.js → chunk-R6CRQEAL.js} +4 -4
  62. package/dist/hooks/chunk-SYSRHRWU.js +1589 -0
  63. package/dist/hooks/{chunk-WK2XSHSI.js → chunk-TLJYAGZK.js} +549 -874
  64. package/dist/hooks/chunk-Z5TMJIPW.js +45 -0
  65. package/dist/hooks/codex-hook-adapter.js +26 -21
  66. package/dist/hooks/duplicate-read-guard.js +8 -8
  67. package/dist/hooks/format-edited.js +4 -4
  68. package/dist/hooks/inputs.json +216 -202
  69. package/dist/hooks/investigation-guard.js +8 -8
  70. package/dist/hooks/pretool-guard.js +15 -15
  71. package/dist/hooks/session-lang.js +406 -8
  72. package/dist/hooks/stop-guard.js +122 -187
  73. package/dist/josh.js +281 -94
  74. package/dist/version/index.js +15 -13
  75. package/eslint/base.js +43 -5
  76. package/eslint/rules/english-only-prose.js +3 -3
  77. package/eslint/rules/import.js +12 -0
  78. package/eslint/rules/namespace-object-export.js +2 -2
  79. package/package.json +16 -10
  80. package/pnpm-workspace.yaml +2 -4
  81. package/prompts/coding-standards.md +14 -48
  82. package/prompts/collaboration-workflow/file-edits.md +1 -1
  83. package/prompts/collaboration-workflow/issue-citation.md +1 -1
  84. package/prompts/collaboration-workflow/issue-template.md +3 -10
  85. package/prompts/collaboration-workflow/operating-rules.md +7 -8
  86. package/prompts/collaboration-workflow/output-bounds.md +1 -1
  87. package/prompts/collaboration-workflow/overview.md +1 -1
  88. package/prompts/collaboration-workflow/plan-comment.md +2 -1
  89. package/prompts/collaboration-workflow/principles.md +21 -3
  90. package/prompts/collaboration-workflow/report-format.md +16 -29
  91. package/prompts/collaboration-workflow/residency.md +1 -1
  92. package/prompts/collaboration-workflow/rule-delivery.md +7 -95
  93. package/prompts/collaboration-workflow/shell-body.md +3 -23
  94. package/prompts/collaboration-workflow/turn-batching.md +4 -13
  95. package/prompts/collaboration-workflow/wip-cap.md +5 -11
  96. package/prompts/refactoring.md +1 -1
  97. package/prompts/review-rubric.md +3 -22
  98. package/prompts/review.md +15 -38
  99. package/prompts/testing-guide.md +2 -4
  100. package/scripts/adopt/adopt-logic.ts +5 -5
  101. package/scripts/adopt/adopt-toolkits.ts +4 -5
  102. package/scripts/adopt/adopt.ts +2 -3
  103. package/scripts/agent/agent-argv.ts +7 -7
  104. package/scripts/agent/agent-diagnostics.ts +2 -2
  105. package/scripts/agent/agent-exit-record.ts +1 -1
  106. package/scripts/agent/agent-headless.ts +1 -1
  107. package/scripts/agent/agent-launch-environment.ts +6 -1
  108. package/scripts/agent/agent-role-profile.ts +49 -22
  109. package/scripts/agent/agent-session-role.ts +32 -0
  110. package/scripts/agent/api-outage.ts +1 -1
  111. package/scripts/agent/claude-agent-argv.ts +4 -4
  112. package/scripts/agent/claude-result-event.ts +4 -4
  113. package/scripts/agent/codex-hooks.ts +2 -2
  114. package/scripts/agent/interactive-ask.ts +3 -6
  115. package/scripts/auto-ok/auto-ok-cli.ts +46 -60
  116. package/scripts/backlog/backlog-arrival-added.ts +34 -0
  117. package/scripts/backlog/backlog-arrival.ts +54 -17
  118. package/scripts/backlog/backlog-budget-cli.ts +34 -6
  119. package/scripts/backlog/backlog-budget.ts +17 -24
  120. package/scripts/backlog/backlog-defect-priority.ts +1 -1
  121. package/scripts/backlog/backlog-drive-args.ts +5 -4
  122. package/scripts/backlog/backlog-drive-cli.ts +14 -10
  123. package/scripts/backlog/backlog-drive-epic.ts +85 -0
  124. package/scripts/backlog/backlog-drive-launch.ts +1 -1
  125. package/scripts/backlog/backlog-drive-named-offer.ts +60 -9
  126. package/scripts/backlog/backlog-drive-named.ts +39 -9
  127. package/scripts/backlog/backlog-drive-offer-argv.ts +1 -1
  128. package/scripts/backlog/backlog-drive-restore.ts +1 -1
  129. package/scripts/backlog/backlog-drive-retrospective.ts +2 -2
  130. package/scripts/backlog/backlog-drive.ts +43 -28
  131. package/scripts/backlog/backlog-idle.ts +88 -0
  132. package/scripts/backlog/backlog-named.ts +11 -15
  133. package/scripts/backlog/backlog-next.ts +26 -30
  134. package/scripts/backlog/backlog-offer-cli.ts +28 -23
  135. package/scripts/backlog/backlog-offer.ts +7 -7
  136. package/scripts/backlog/backlog-overlap.ts +178 -0
  137. package/scripts/backlog/backlog-plan-cli.ts +14 -90
  138. package/scripts/backlog/backlog-plan-read.ts +111 -0
  139. package/scripts/backlog/backlog-plan.ts +11 -10
  140. package/scripts/backlog/backlog-pool.ts +13 -14
  141. package/scripts/backlog/backlog-rank.ts +11 -11
  142. package/scripts/backlog/backlog-ready.ts +15 -10
  143. package/scripts/backlog/backlog-scope.ts +14 -15
  144. package/scripts/backlog/backlog-stalled-cli.ts +2 -2
  145. package/scripts/backlog/backlog-stalled-detect.ts +4 -4
  146. package/scripts/backlog/backlog-stalled.ts +5 -6
  147. package/scripts/backlog/backlog-waves.ts +4 -4
  148. package/scripts/backlog/backlogrun-args.ts +74 -0
  149. package/scripts/backlog/backlogrun-cli.ts +113 -0
  150. package/scripts/backlog/backlogrun-launch.ts +178 -0
  151. package/scripts/behavior/behavior-assertion.ts +6 -8
  152. package/scripts/behavior/behavior-cli.ts +1 -1
  153. package/scripts/behavior/behavior-rules.ts +3 -3
  154. package/scripts/build/build-claude-md.ts +4 -4
  155. package/scripts/build/build-codex-hooks.ts +2 -2
  156. package/scripts/build/build-commands.ts +1 -1
  157. package/scripts/build/build-hooks.ts +5 -5
  158. package/scripts/build/build.ts +1 -1
  159. package/scripts/build/hook-bundle-stamp.ts +109 -7
  160. package/scripts/build/local-bin.ts +2 -2
  161. package/scripts/cases/cases-cli.ts +1 -1
  162. package/scripts/cases/cases-logic.ts +2 -2
  163. package/scripts/ci/composite-actions.ts +1 -2
  164. package/scripts/ci/pr-classification.ts +2 -2
  165. package/scripts/claude/workflow-destination.ts +1 -1
  166. package/scripts/clone/clone-aggregate.ts +1 -1
  167. package/scripts/clone/clone-fingerprint.ts +1 -1
  168. package/scripts/clone/clone-scan-cli.ts +1 -1
  169. package/scripts/clone/clone-scan.ts +1 -1
  170. package/scripts/config-merge/index.ts +1 -1
  171. package/scripts/config-merge/json-format.ts +1 -3
  172. package/scripts/config-merge/patch-json-array.ts +90 -0
  173. package/scripts/config-merge/patch-json-key.ts +6 -3
  174. package/scripts/config-merge/patch-json-list.ts +1 -1
  175. package/scripts/cost-runtime/codex-usage.ts +1 -1
  176. package/scripts/cost-runtime/context-cut-payback.ts +4 -5
  177. package/scripts/cost-runtime/context-cut-threshold.ts +4 -6
  178. package/scripts/cost-runtime/cost-attribute.ts +3 -3
  179. package/scripts/cost-runtime/cost-blocks.ts +3 -4
  180. package/scripts/cost-runtime/cost-cli.ts +14 -11
  181. package/scripts/cost-runtime/cost-corpus.ts +11 -11
  182. package/scripts/cost-runtime/cost-pricing.ts +4 -4
  183. package/scripts/cost-runtime/cost-tokens.ts +1 -2
  184. package/scripts/cost-runtime/cost-transcript.ts +29 -29
  185. package/scripts/cost-runtime/cost-usage.ts +6 -7
  186. package/scripts/cost-runtime/cost-verdict.ts +10 -11
  187. package/scripts/cost-runtime/own-session.ts +1 -1
  188. package/scripts/cost-runtime/transcript-cwd.ts +2 -2
  189. package/scripts/delegation/delegation-cli.ts +4 -4
  190. package/scripts/delegation/delegation-policy.ts +13 -15
  191. package/scripts/delegation/duplicate-read-guard.ts +9 -10
  192. package/scripts/delegation/fanout-cli.ts +1 -1
  193. package/scripts/delegation/fanout.ts +1 -1
  194. package/scripts/delegation/investigation-guard.ts +18 -22
  195. package/scripts/delegation/investigation-reads.ts +48 -238
  196. package/scripts/discovery/repo-discovery.ts +1 -1
  197. package/scripts/discovery/repo-map-logic.ts +1 -2
  198. package/scripts/discovery/repo-origin.ts +3 -3
  199. package/scripts/discovery/repo-party-cli.ts +2 -2
  200. package/scripts/discovery/repo-party.ts +2 -2
  201. package/scripts/doctor/doctor-consumer.ts +1 -1
  202. package/scripts/doctor/doctor-io.ts +6 -7
  203. package/scripts/doctor/doctor-logic.ts +1 -1
  204. package/scripts/doctor/doctor-ports.ts +1 -1
  205. package/scripts/doctor/doctor.ts +8 -9
  206. package/scripts/document/backlogrun-parent-read-set.ts +5 -6
  207. package/scripts/document/bash-output-cap.ts +5 -7
  208. package/scripts/document/capped-print-part.ts +1 -1
  209. package/scripts/document/capped-print.ts +1 -1
  210. package/scripts/document/document-byte-budget.ts +33 -64
  211. package/scripts/document/document-byte-check.ts +4 -4
  212. package/scripts/document/document-reachability.ts +7 -8
  213. package/scripts/document/document-read-cli.ts +2 -2
  214. package/scripts/document/document-scan.ts +26 -2
  215. package/scripts/document/document-section-cli.ts +6 -8
  216. package/scripts/document/document-section.ts +8 -12
  217. package/scripts/document/edit-files-cli.ts +3 -4
  218. package/scripts/document/entry-read-budget.ts +8 -70
  219. package/scripts/document/entry-read-set.ts +51 -34
  220. package/scripts/document/lane-child-read-set.ts +9 -9
  221. package/scripts/document/read-files-cli.ts +1 -2
  222. package/scripts/document/read-set-cli.ts +16 -19
  223. package/scripts/document/read-set-cost.ts +4 -4
  224. package/scripts/document/read-set-point-of-use.ts +28 -38
  225. package/scripts/document/read-set-pricing.ts +1 -1
  226. package/scripts/document/read-set-trim.ts +3 -3
  227. package/scripts/document/resident-budget.ts +8 -10
  228. package/scripts/epic/epic-add-body.ts +15 -18
  229. package/scripts/epic/epic-add-plan.ts +26 -28
  230. package/scripts/epic/epic-add.ts +32 -25
  231. package/scripts/epic/epic-audit-checks.ts +27 -37
  232. package/scripts/epic/epic-audit-cli.ts +21 -22
  233. package/scripts/epic/epic-audit-orphans.ts +16 -17
  234. package/scripts/epic/epic-audit-rationale.ts +10 -15
  235. package/scripts/epic/epic-audit-report.ts +2 -5
  236. package/scripts/epic/epic-audit.ts +18 -14
  237. package/scripts/epic/epic-body.ts +10 -10
  238. package/scripts/epic/epic-bundle-cli.ts +36 -34
  239. package/scripts/epic/epic-bundle-evidence.ts +5 -5
  240. package/scripts/epic/epic-bundle-gaps.ts +6 -9
  241. package/scripts/epic/epic-bundle-poll.ts +1 -1
  242. package/scripts/epic/epic-bundle-referenced.ts +11 -14
  243. package/scripts/epic/epic-bundle.ts +19 -20
  244. package/scripts/epic/epic-busy.ts +44 -21
  245. package/scripts/epic/epic-candidate-confirm.ts +15 -18
  246. package/scripts/epic/epic-chains.ts +18 -23
  247. package/scripts/epic/epic-classify.ts +11 -12
  248. package/scripts/epic/epic-cli-argv.ts +5 -6
  249. package/scripts/epic/epic-cli-remove.ts +9 -4
  250. package/scripts/epic/epic-cli.ts +38 -26
  251. package/scripts/epic/epic-close-comment.ts +14 -15
  252. package/scripts/epic/epic-close.ts +25 -29
  253. package/scripts/epic/epic-cross-repo.ts +18 -21
  254. package/scripts/epic/epic-decision.ts +14 -18
  255. package/scripts/epic/epic-fetch.ts +25 -31
  256. package/scripts/epic/epic-graph.ts +15 -17
  257. package/scripts/epic/epic-index.ts +14 -16
  258. package/scripts/epic/epic-issue.ts +9 -11
  259. package/scripts/epic/epic-label-age.ts +74 -0
  260. package/scripts/epic/epic-lane-offer.ts +35 -24
  261. package/scripts/epic/epic-nested.ts +1 -1
  262. package/scripts/epic/epic-next-read.ts +8 -8
  263. package/scripts/epic/epic-next-views.ts +12 -12
  264. package/scripts/epic/epic-next.ts +29 -33
  265. package/scripts/epic/epic-outside-blocker.ts +11 -10
  266. package/scripts/epic/epic-parse.ts +22 -24
  267. package/scripts/epic/epic-promote.ts +3 -2
  268. package/scripts/epic/epic-rank.ts +1 -1
  269. package/scripts/epic/epic-read.ts +10 -8
  270. package/scripts/epic/epic-reconcile.ts +8 -6
  271. package/scripts/epic/epic-reference.ts +5 -4
  272. package/scripts/epic/epic-relation-recheck.ts +10 -11
  273. package/scripts/epic/epic-relations.ts +9 -8
  274. package/scripts/epic/epic-remove-plan.ts +4 -5
  275. package/scripts/epic/epic-remove.ts +7 -5
  276. package/scripts/epic/epic-report.ts +18 -20
  277. package/scripts/epic/epic-run.ts +6 -5
  278. package/scripts/epic/epic-sections.ts +2 -2
  279. package/scripts/epic/epic-shape.ts +3 -3
  280. package/scripts/epic/epic-solo-stale.ts +3 -2
  281. package/scripts/epic/epic-solo.ts +8 -8
  282. package/scripts/epic/epic-triage.ts +5 -4
  283. package/scripts/epic/epic-validate.ts +8 -7
  284. package/scripts/epic/epic.ts +5 -5
  285. package/scripts/exports/unused-members-cli.ts +1 -1
  286. package/scripts/followup/followup-issue-number.ts +1 -2
  287. package/scripts/followup/git-followup-cleanup.ts +6 -7
  288. package/scripts/followup/git-followup-finish.ts +11 -13
  289. package/scripts/followup/git-followup-flush.ts +11 -7
  290. package/scripts/followup/git-followup-issue-close.ts +16 -13
  291. package/scripts/followup/git-followup-label.ts +9 -6
  292. package/scripts/followup/git-followup-merged.ts +1 -1
  293. package/scripts/followup/git-followup-pending.ts +7 -9
  294. package/scripts/followup/git-followup-stages.ts +28 -17
  295. package/scripts/followup/git-followup-workflow.ts +19 -21
  296. package/scripts/followup/git-pr-followup-checks.ts +13 -20
  297. package/scripts/followup/git-pr-followup-wrapup.ts +7 -7
  298. package/scripts/followup/git-pr-followup.ts +18 -17
  299. package/scripts/gate/core-admission.ts +2 -2
  300. package/scripts/gate/core-budget.ts +15 -26
  301. package/scripts/gate/gate-ledger.ts +114 -0
  302. package/scripts/gate/gate-log.ts +7 -9
  303. package/scripts/gate/gate-plan.ts +70 -35
  304. package/scripts/gate/gate-report.ts +14 -15
  305. package/scripts/gate/gate-skip.ts +11 -13
  306. package/scripts/gate/gate-steps.ts +5 -1
  307. package/scripts/gate/gate-tree.ts +3 -4
  308. package/scripts/gate/hook-gate-reuse.ts +9 -9
  309. package/scripts/gate/machine-capacity.ts +168 -30
  310. package/scripts/gate/pre-commit-type-check.ts +4 -4
  311. package/scripts/gate/project-checks.ts +12 -4
  312. package/scripts/gate/scoped-green.ts +11 -18
  313. package/scripts/gate/type-check-command.ts +2 -2
  314. package/scripts/gate/type-check-step.ts +4 -4
  315. package/scripts/gate/verification-gate.ts +53 -51
  316. package/scripts/gh/gh-spawn.ts +2 -2
  317. package/scripts/gh/git-ai-review-scan.ts +3 -2
  318. package/scripts/gh/git-gh-api-path.ts +10 -11
  319. package/scripts/gh/git-gh-exec.ts +43 -48
  320. package/scripts/gh/git-gh-failure.ts +6 -9
  321. package/scripts/gh/git-gh-helpers.ts +1 -1
  322. package/scripts/gh/git-gh-issue-list.ts +15 -19
  323. package/scripts/gh/git-gh-issue-read.ts +43 -60
  324. package/scripts/gh/git-gh-issue-rest.ts +14 -15
  325. package/scripts/gh/git-gh-issue-write.ts +52 -40
  326. package/scripts/gh/git-gh-issue.ts +23 -24
  327. package/scripts/gh/git-gh-pr-auto-merge.ts +3 -3
  328. package/scripts/gh/git-gh-pr-read.ts +46 -50
  329. package/scripts/gh/git-gh-pr-rest.ts +23 -26
  330. package/scripts/gh/git-gh-pr-review.ts +2 -2
  331. package/scripts/gh/git-gh-pr-rollup.ts +4 -4
  332. package/scripts/gh/git-gh-pr-snapshot.ts +8 -10
  333. package/scripts/gh/git-gh-pr.ts +16 -16
  334. package/scripts/gh/git-gh-reachability.ts +11 -12
  335. package/scripts/gh/git-gh-repo.ts +2 -3
  336. package/scripts/gh/git-gh-rest-state.ts +1 -1
  337. package/scripts/gh/git-pr-ai-review.ts +6 -5
  338. package/scripts/gh/git-pr-checks-eval.ts +28 -30
  339. package/scripts/gh/git-pr-checks-parse.ts +14 -16
  340. package/scripts/gh/git-pr-checks-watch.ts +17 -17
  341. package/scripts/gh/git-pr-checks.ts +20 -23
  342. package/scripts/gh/git-pr-coderabbit.ts +8 -6
  343. package/scripts/gh/git-pr-confirmation.ts +5 -5
  344. package/scripts/gh/git-pr-managed-config.ts +7 -9
  345. package/scripts/gh/git-pr-messages.ts +1 -1
  346. package/scripts/gh/git-pr.ts +15 -16
  347. package/scripts/gh/github-issue-url.ts +8 -9
  348. package/scripts/git/base-tree.ts +66 -0
  349. package/scripts/git/change-base.ts +42 -2
  350. package/scripts/git/changed-file-scope.ts +5 -5
  351. package/scripts/git/changed-paths.ts +1 -2
  352. package/scripts/git/constants.ts +2 -2
  353. package/scripts/git/git-branch.ts +1 -1
  354. package/scripts/git/git-closes-keyword.ts +3 -3
  355. package/scripts/git/git-command.ts +53 -41
  356. package/scripts/git/git-common-directory.ts +3 -3
  357. package/scripts/git/git-diff-reads.ts +14 -15
  358. package/scripts/git/git-error.ts +1 -1
  359. package/scripts/git/git-execa-error.ts +1 -2
  360. package/scripts/git/git-issue.ts +10 -8
  361. package/scripts/git/git-location-environment.ts +3 -4
  362. package/scripts/git/git-ls-remote.ts +6 -8
  363. package/scripts/git/git-pre-push-hook.ts +11 -10
  364. package/scripts/git/git-preflight.ts +5 -5
  365. package/scripts/git/git-push-transport.ts +2 -2
  366. package/scripts/git/git-remote-branch.ts +1 -2
  367. package/scripts/git/git-schemas.ts +16 -23
  368. package/scripts/git/git-spawn-sync.ts +1 -1
  369. package/scripts/git/git-spawn.ts +37 -14
  370. package/scripts/git/git-ssh-keepalive.ts +12 -5
  371. package/scripts/git/git-staging.ts +7 -8
  372. package/scripts/git/git-workflow.ts +1 -1
  373. package/scripts/git/git-worktree.ts +35 -27
  374. package/scripts/git/gone-branch.ts +2 -2
  375. package/scripts/git/listing-cutoff.ts +1 -2
  376. package/scripts/git/lockfile-sync.ts +65 -0
  377. package/scripts/git/main-merge-guard.ts +1 -2
  378. package/scripts/git/main-merge.ts +7 -7
  379. package/scripts/git/main-sync.ts +23 -8
  380. package/scripts/git/parse-json-array.ts +18 -23
  381. package/scripts/git/repository-lock.ts +34 -2
  382. package/scripts/git/stash/git-stash.ts +4 -5
  383. package/scripts/git/stash/stash-orphans.ts +5 -3
  384. package/scripts/git/stash/stash-pop-args.ts +1 -1
  385. package/scripts/git/stash/stash-pop-cli.ts +3 -3
  386. package/scripts/git/stash/stash-sweep-lock.ts +2 -2
  387. package/scripts/hooks/batch-guard.ts +11 -13
  388. package/scripts/hooks/check-commit-message.ts +12 -9
  389. package/scripts/hooks/codex-hook-adapter.ts +16 -10
  390. package/scripts/hooks/edited-cspell.ts +3 -4
  391. package/scripts/hooks/format-edited-cli.ts +1 -1
  392. package/scripts/hooks/format-edited-file.ts +11 -17
  393. package/scripts/hooks/format-rewrite-notice.ts +19 -17
  394. package/scripts/hooks/pre-push-unit.ts +10 -14
  395. package/scripts/hooks/pretool-guard-cli.ts +4 -4
  396. package/scripts/hooks/pretool-guard.ts +93 -18
  397. package/scripts/hooks/reserved-run.ts +2 -2
  398. package/scripts/hooks/step-zero-notice.ts +1 -1
  399. package/scripts/hooks/stop-guard.ts +21 -10
  400. package/scripts/init/basic-path-migration.ts +2 -2
  401. package/scripts/init/claude-kit-only-settings.ts +2 -2
  402. package/scripts/init/claude-plugin-config.ts +2 -2
  403. package/scripts/init/distributed-paths.ts +4 -4
  404. package/scripts/init/hook-command-rewrite.ts +3 -3
  405. package/scripts/init/hook-launch.ts +5 -5
  406. package/scripts/init/init-actions.ts +13 -0
  407. package/scripts/init/init-ai-copy.ts +11 -11
  408. package/scripts/init/init-bootstrap.ts +3 -3
  409. package/scripts/init/init-copy-content.ts +4 -4
  410. package/scripts/init/init-logic-json-merge.ts +7 -9
  411. package/scripts/init/init-logic-migrate.ts +1 -1
  412. package/scripts/init/init-logic-templates.ts +1 -1
  413. package/scripts/init/init-logic-workspace.ts +4 -4
  414. package/scripts/init/init-logic-yaml-merge.ts +2 -2
  415. package/scripts/init/init-logic.ts +19 -22
  416. package/scripts/init/init.ts +7 -7
  417. package/scripts/init/kit-base-preset.ts +1 -1
  418. package/scripts/init/kit-setup-state.ts +1 -1
  419. package/scripts/init/kit-written-paths.ts +1 -2
  420. package/scripts/init/package-manager-pin.ts +1 -1
  421. package/scripts/init/project-profile-cli.ts +1 -1
  422. package/scripts/init/project-profile.ts +3 -3
  423. package/scripts/init/session-language-environment.ts +1 -1
  424. package/scripts/init/start-exec.ts +3 -4
  425. package/scripts/init/start-plan.ts +2 -2
  426. package/scripts/init/start-setup-pr.ts +3 -2
  427. package/scripts/init/start-steps.ts +2 -2
  428. package/scripts/init/tsconfig-preset-migration.ts +1 -1
  429. package/scripts/init/vscode-tasks.ts +62 -0
  430. package/scripts/issue/baseline-measure.ts +2 -2
  431. package/scripts/issue/behavior-change-lint.ts +2 -2
  432. package/scripts/issue/defect-rate-cli.ts +6 -7
  433. package/scripts/issue/defect-rate.ts +37 -27
  434. package/scripts/issue/git-next-issues.ts +9 -8
  435. package/scripts/issue/issue-auto-ok.ts +24 -11
  436. package/scripts/issue/issue-backlinks-cli.ts +5 -5
  437. package/scripts/issue/issue-backlinks.ts +6 -6
  438. package/scripts/issue/issue-cite-cli.ts +20 -18
  439. package/scripts/issue/issue-cite.ts +18 -8
  440. package/scripts/issue/issue-closing-pr.ts +4 -4
  441. package/scripts/issue/issue-comment-cli.ts +6 -4
  442. package/scripts/issue/issue-file-cli.ts +52 -15
  443. package/scripts/issue/issue-file-fold.ts +155 -0
  444. package/scripts/issue/issue-file.ts +9 -6
  445. package/scripts/issue/issue-fold-cli.ts +14 -9
  446. package/scripts/issue/issue-fold.ts +23 -8
  447. package/scripts/issue/issue-labels.ts +34 -38
  448. package/scripts/issue/issue-lint-cli.ts +2 -2
  449. package/scripts/issue/issue-lint.ts +1 -1
  450. package/scripts/issue/issue-merged.ts +10 -4
  451. package/scripts/issue/issue-number-shape.ts +27 -0
  452. package/scripts/issue/issue-rank.ts +1 -1
  453. package/scripts/issue/issue-read-cli.ts +4 -5
  454. package/scripts/issue/issue-read.ts +4 -5
  455. package/scripts/issue/issue-reference.ts +5 -5
  456. package/scripts/issue/issue-release-cli.ts +17 -7
  457. package/scripts/issue/issue-release.ts +3 -3
  458. package/scripts/issue/issue-report-failures.ts +7 -4
  459. package/scripts/issue/issue-scout-cli.ts +11 -11
  460. package/scripts/issue/issue-scout-closed.ts +4 -4
  461. package/scripts/issue/issue-scout.ts +4 -5
  462. package/scripts/issue/issue-state-cli.ts +17 -10
  463. package/scripts/issue/issue-state.ts +12 -13
  464. package/scripts/issue/issue-wip.ts +7 -7
  465. package/scripts/issue/markdown-section.ts +3 -3
  466. package/scripts/issue/measure-rerun-cli.ts +10 -9
  467. package/scripts/issue/reproduction-measure.ts +3 -3
  468. package/scripts/issue/session-cite.ts +56 -0
  469. package/scripts/josh/agent-session-environment.ts +10 -8
  470. package/scripts/josh/cli-body.ts +2 -2
  471. package/scripts/josh/command-suggest.ts +1 -1
  472. package/scripts/josh/file-map-stamp.ts +20 -23
  473. package/scripts/josh/hook-decision.ts +24 -28
  474. package/scripts/josh/josh-command-map.ts +4 -1
  475. package/scripts/josh/josh-command-types.ts +30 -35
  476. package/scripts/josh/josh-commands-ai.ts +6 -6
  477. package/scripts/josh/josh-commands-backlog.ts +15 -3
  478. package/scripts/josh/josh-commands-clone.ts +1 -1
  479. package/scripts/josh/josh-commands-development.ts +25 -4
  480. package/scripts/josh/josh-commands-document.ts +3 -3
  481. package/scripts/josh/josh-commands-guard.ts +3 -3
  482. package/scripts/josh/josh-commands-issue.ts +4 -5
  483. package/scripts/josh/josh-commands-lane.ts +14 -4
  484. package/scripts/josh/josh-commands-lint.ts +1 -1
  485. package/scripts/josh/josh-commands-run.ts +20 -6
  486. package/scripts/josh/josh-commands-split.ts +1 -2
  487. package/scripts/josh/josh-commands-versioning.ts +5 -5
  488. package/scripts/josh/josh-commands-workflow.ts +30 -22
  489. package/scripts/josh/josh-environment-file.ts +1 -1
  490. package/scripts/josh/josh-in-process.ts +3 -3
  491. package/scripts/josh/josh-logic.ts +6 -7
  492. package/scripts/josh/josh-run.ts +3 -3
  493. package/scripts/josh/josh-verdict.ts +9 -12
  494. package/scripts/josh/josh.ts +3 -3
  495. package/scripts/josh/kit-only.ts +2 -2
  496. package/scripts/josh/path-decision.ts +3 -3
  497. package/scripts/josh/platform-temporary.ts +7 -5
  498. package/scripts/josh/process-identity.ts +24 -6
  499. package/scripts/josh/process-owner.ts +4 -4
  500. package/scripts/josh/session-language-cli.ts +53 -11
  501. package/scripts/josh/session-language.ts +1 -1
  502. package/scripts/josh/stamp-file.ts +48 -29
  503. package/scripts/josh/stamp-record.ts +57 -0
  504. package/scripts/lane/lane-await.ts +35 -11
  505. package/scripts/lane/lane-cache.ts +6 -6
  506. package/scripts/lane/lane-capacity.ts +32 -17
  507. package/scripts/lane/lane-child-invocation.ts +17 -15
  508. package/scripts/lane/lane-child-marker.ts +12 -12
  509. package/scripts/lane/lane-cli.ts +12 -13
  510. package/scripts/lane/lane-close.ts +6 -6
  511. package/scripts/lane/lane-dispatch.ts +61 -72
  512. package/scripts/lane/lane-environment.ts +5 -5
  513. package/scripts/lane/lane-guard-policy.ts +7 -21
  514. package/scripts/lane/lane-handoff.ts +2 -2
  515. package/scripts/lane/lane-install.ts +9 -10
  516. package/scripts/lane/lane-launch-cli.ts +13 -8
  517. package/scripts/lane/lane-ledger.ts +73 -11
  518. package/scripts/lane/lane-leftover.ts +2 -2
  519. package/scripts/lane/lane-limit-cli.ts +160 -0
  520. package/scripts/lane/lane-limit-override.ts +74 -0
  521. package/scripts/lane/lane-load.ts +19 -68
  522. package/scripts/lane/lane-measure-cli.ts +15 -25
  523. package/scripts/lane/lane-occupancy.ts +6 -4
  524. package/scripts/lane/lane-open.ts +20 -19
  525. package/scripts/lane/lane-output.ts +4 -3
  526. package/scripts/lane/lane-paths.ts +12 -11
  527. package/scripts/lane/lane-phase.ts +33 -0
  528. package/scripts/lane/lane-reap.ts +2 -2
  529. package/scripts/lane/lane-registry.ts +16 -15
  530. package/scripts/lane/lane-relaunch.ts +9 -9
  531. package/scripts/lane/lane-report.ts +5 -4
  532. package/scripts/lane/lane-resume.ts +2 -2
  533. package/scripts/lane/lane-sampler.ts +55 -0
  534. package/scripts/lane/lane-seed.ts +7 -7
  535. package/scripts/lane/lane-stage-stats.ts +135 -0
  536. package/scripts/lane/lane-start-point.ts +8 -11
  537. package/scripts/lane/lane-stats.ts +60 -15
  538. package/scripts/lane/lane-stray.ts +1 -1
  539. package/scripts/lane/lane-vacant.ts +1 -1
  540. package/scripts/lane/openai-lane-supervisor-decision.ts +3 -7
  541. package/scripts/lane/openai-lane-supervisor-owner.ts +3 -9
  542. package/scripts/lane/openai-review-broker.ts +2 -4
  543. package/scripts/lib/ancestor-directories.ts +1 -1
  544. package/scripts/lib/bounded-pool.ts +2 -2
  545. package/scripts/lib/buffered-process.ts +4 -6
  546. package/scripts/lib/caddy-logs.sh +0 -0
  547. package/scripts/lib/cli-flags.ts +39 -6
  548. package/scripts/lib/error-message.ts +1 -1
  549. package/scripts/lib/json-value.ts +17 -3
  550. package/scripts/lib/poll.ts +1 -1
  551. package/scripts/lib/status-icons.ts +3 -3
  552. package/scripts/lib/timed-fetch.ts +1 -1
  553. package/scripts/lib/timeouts.ts +1 -1
  554. package/scripts/lines/bytes-command.ts +3 -4
  555. package/scripts/lines/effective-limit.ts +25 -12
  556. package/scripts/lines/line-budget.ts +47 -55
  557. package/scripts/lines/line-targets.ts +6 -2
  558. package/scripts/lines/lines-command.ts +3 -3
  559. package/scripts/lint/cspell-cached.ts +1 -1
  560. package/scripts/lint/cycle-recheck.ts +122 -0
  561. package/scripts/lint/format.ts +1 -2
  562. package/scripts/lint/lint-parallel.ts +34 -19
  563. package/scripts/lint/lint-related-scope.ts +25 -15
  564. package/scripts/lint/lint-related.ts +6 -7
  565. package/scripts/managed-marker/index.ts +1 -1
  566. package/scripts/managed-marker/managed-marker-logic.ts +1 -2
  567. package/scripts/notify/git-notify.ts +9 -7
  568. package/scripts/notify/telegram-notify.ts +53 -37
  569. package/scripts/notify/telegram-test-logic.ts +3 -3
  570. package/scripts/notify/telegram-test.ts +45 -30
  571. package/scripts/observations/observation-ledger-home.ts +14 -8
  572. package/scripts/observations/observation-ledger-line.ts +3 -2
  573. package/scripts/observations/observation-ledger-migrate.ts +3 -4
  574. package/scripts/observations/observation-ledger-prepare.ts +4 -4
  575. package/scripts/observations/observation-ledger.ts +14 -15
  576. package/scripts/observations/observation-record-cli.ts +83 -0
  577. package/scripts/observations/observation-record.ts +91 -0
  578. package/scripts/observations/observations-flush-cli.ts +1 -1
  579. package/scripts/observations/observations-flush-landing.ts +7 -6
  580. package/scripts/observations/observations-flush.ts +26 -27
  581. package/scripts/overrides/overrides-check.ts +18 -8
  582. package/scripts/package/package-scout-cli.ts +1 -1
  583. package/scripts/package/package-scout-format.ts +2 -2
  584. package/scripts/package/package-scout.ts +1 -1
  585. package/scripts/propagate/propagate-git-failure.ts +1 -1
  586. package/scripts/propagate/propagate-git.ts +7 -7
  587. package/scripts/propagate/propagate-plan.ts +2 -2
  588. package/scripts/propagate/propagate-publish.ts +2 -3
  589. package/scripts/propagate/propagate-run.ts +5 -7
  590. package/scripts/propagate/propagate-select.ts +1 -1
  591. package/scripts/propagate/propagate-steps.ts +19 -20
  592. package/scripts/propagate/propagate-targets.ts +6 -10
  593. package/scripts/propagate/propagate.ts +5 -5
  594. package/scripts/refactor/import-graph.ts +1 -1
  595. package/scripts/refactor/refactor-lint.ts +4 -10
  596. package/scripts/refactor/refactor-scan-cli.ts +1 -1
  597. package/scripts/refactor/refactor-scan.ts +2 -2
  598. package/scripts/refactor/refactor-targets.ts +1 -1
  599. package/scripts/release/github-release-cli.ts +25 -3
  600. package/scripts/release/github-release-runs.ts +1 -1
  601. package/scripts/release/release-cli.ts +21 -4
  602. package/scripts/release/release-history.ts +6 -10
  603. package/scripts/release/release-plan.ts +3 -3
  604. package/scripts/release/release-progress.ts +3 -4
  605. package/scripts/release/release-publish.ts +8 -9
  606. package/scripts/release/release-scope-cli.ts +8 -10
  607. package/scripts/release/release-tag.ts +6 -8
  608. package/scripts/release/release-worktree.ts +5 -5
  609. package/scripts/repo/auto-merge-setting-logic.ts +7 -9
  610. package/scripts/repo/auto-merge-setting.ts +1 -1
  611. package/scripts/repo/repo-setting.ts +4 -4
  612. package/scripts/repo/repository-labels.ts +1 -1
  613. package/scripts/repo/required-checks-logic.ts +3 -3
  614. package/scripts/repo/required-checks-report.ts +1 -1
  615. package/scripts/repo/ruleset-check-cli.ts +1 -1
  616. package/scripts/repo/ruleset-check.ts +1 -1
  617. package/scripts/report/report-format-reference.ts +26 -0
  618. package/scripts/report/report-lint-cli.ts +2 -2
  619. package/scripts/report/report-lint.ts +16 -2
  620. package/scripts/review/disposition-cli.ts +2 -2
  621. package/scripts/review/disposition-logic.ts +1 -1
  622. package/scripts/review/live-evidence.ts +9 -6
  623. package/scripts/review/review-attest-cli.ts +1 -2
  624. package/scripts/review/review-attest.ts +3 -3
  625. package/scripts/review/review-brief-cli.ts +19 -20
  626. package/scripts/review/review-brief.ts +29 -32
  627. package/scripts/review/review-checkout.ts +2 -2
  628. package/scripts/review/review-diff-parts.ts +3 -5
  629. package/scripts/review/review-diff-write.ts +1 -1
  630. package/scripts/review/review-finding-ledger.ts +7 -4
  631. package/scripts/review/review-findings-cli.ts +2 -2
  632. package/scripts/review/review-level.ts +4 -7
  633. package/scripts/review/review-record-cli.ts +73 -16
  634. package/scripts/review/review-record.ts +5 -4
  635. package/scripts/review/review-round2-cli.ts +2 -3
  636. package/scripts/review/review-round2.ts +13 -21
  637. package/scripts/review/review-stamps.ts +9 -71
  638. package/scripts/review/review-tree.ts +4 -5
  639. package/scripts/rules/bash-triggers.ts +4 -4
  640. package/scripts/rules/decision-oracle-batch.ts +5 -6
  641. package/scripts/rules/decision-oracle-stage.ts +1 -1
  642. package/scripts/rules/decision-oracle-tokens.ts +1 -2
  643. package/scripts/rules/decision-oracle.ts +2 -2
  644. package/scripts/rules/delivered-rules.ts +61 -406
  645. package/scripts/rules/destructive-command.ts +2 -2
  646. package/scripts/rules/direct-filing.ts +4 -4
  647. package/scripts/rules/direct-pr-create.ts +2 -2
  648. package/scripts/rules/early-heartbeat.ts +15 -19
  649. package/scripts/rules/file-body.ts +5 -6
  650. package/scripts/rules/filing-cap.ts +6 -7
  651. package/scripts/rules/filing-offer.ts +1 -1
  652. package/scripts/rules/firing-point.ts +6 -6
  653. package/scripts/rules/gh-api.ts +2 -2
  654. package/scripts/rules/git-argv.ts +3 -3
  655. package/scripts/rules/git-force.ts +2 -2
  656. package/scripts/rules/hook-context-line.ts +31 -0
  657. package/scripts/rules/implementation-cut-verdict.ts +5 -8
  658. package/scripts/rules/implementation-cut.ts +35 -32
  659. package/scripts/rules/index-guard.ts +2 -2
  660. package/scripts/rules/issue-citation.ts +7 -7
  661. package/scripts/rules/issue-comments.ts +21 -13
  662. package/scripts/rules/josh-git-bare.ts +2 -2
  663. package/scripts/rules/lane-background.ts +14 -16
  664. package/scripts/rules/lane-carry-conflict.ts +41 -5
  665. package/scripts/rules/lane-interactive-ask.ts +6 -9
  666. package/scripts/rules/lane-park.ts +12 -16
  667. package/scripts/rules/lane-split-park.ts +1 -2
  668. package/scripts/rules/lane-switch-main.ts +10 -13
  669. package/scripts/rules/last-prompt.ts +1 -1
  670. package/scripts/rules/oracle-consulted.ts +5 -5
  671. package/scripts/rules/oracle-firing.ts +6 -9
  672. package/scripts/rules/oracle-list-cli.ts +2 -2
  673. package/scripts/rules/permission-guards.ts +2 -2
  674. package/scripts/rules/piped-verification.ts +79 -9
  675. package/scripts/rules/poll-loop.ts +9 -11
  676. package/scripts/rules/pre-gate-cut.ts +33 -30
  677. package/scripts/rules/prior-comment-read.ts +3 -3
  678. package/scripts/rules/protected-files.ts +25 -13
  679. package/scripts/rules/raw-field-body.ts +3 -4
  680. package/scripts/rules/reply-language.ts +1 -1
  681. package/scripts/rules/rule-body-guard.ts +10 -12
  682. package/scripts/rules/rule-guard.ts +1 -1
  683. package/scripts/rules/rule-list.ts +51 -0
  684. package/scripts/rules/rule-registry-rows.ts +282 -0
  685. package/scripts/rules/rule-registry.ts +109 -0
  686. package/scripts/rules/rule-value-cache.ts +2 -2
  687. package/scripts/rules/rule-value-cli.ts +6 -4
  688. package/scripts/rules/rule-value.ts +61 -22
  689. package/scripts/rules/run-tail-rule.ts +11 -15
  690. package/scripts/rules/shell-body-trigger.ts +7 -7
  691. package/scripts/rules/shell-segments.ts +2 -4
  692. package/scripts/rules/stop-rules.ts +54 -41
  693. package/scripts/rules/tail-commands.ts +1 -1
  694. package/scripts/rules/test-declared-commit.ts +2 -2
  695. package/scripts/rules/third-party-write.ts +3 -3
  696. package/scripts/rules/worktree-guard.ts +12 -5
  697. package/scripts/run/add/run-add-cli.ts +165 -0
  698. package/scripts/run/add/run-add.ts +124 -0
  699. package/scripts/run/board/run-board-cli.ts +207 -0
  700. package/scripts/run/board/run-board-closed.ts +95 -0
  701. package/scripts/run/board/run-board-every.ts +60 -0
  702. package/scripts/run/board/run-board-fetch.ts +38 -0
  703. package/scripts/run/board/run-board-fit.ts +219 -0
  704. package/scripts/run/board/run-board-github.ts +162 -0
  705. package/scripts/run/board/run-board-header.ts +275 -0
  706. package/scripts/run/board/run-board-kind.ts +35 -0
  707. package/scripts/run/board/run-board-labels.ts +299 -0
  708. package/scripts/run/board/run-board-layout.ts +222 -0
  709. package/scripts/run/board/run-board-link.ts +31 -0
  710. package/scripts/run/board/run-board-machine.ts +198 -0
  711. package/scripts/run/board/run-board-notes.ts +103 -0
  712. package/scripts/run/board/run-board-phase.ts +136 -0
  713. package/scripts/run/board/run-board-plan.ts +129 -0
  714. package/scripts/run/board/run-board-read.ts +62 -0
  715. package/scripts/run/board/run-board-render-legend.ts +82 -0
  716. package/scripts/run/board/run-board-render-notes.ts +77 -0
  717. package/scripts/run/board/run-board-render-slot.ts +50 -0
  718. package/scripts/run/board/run-board-render.ts +407 -0
  719. package/scripts/run/board/run-board-scope.ts +17 -0
  720. package/scripts/run/board/run-board-screen.ts +43 -0
  721. package/scripts/run/board/run-board-span.ts +66 -0
  722. package/scripts/run/board/run-board-spin.ts +115 -0
  723. package/scripts/run/board/run-board-state.ts +113 -0
  724. package/scripts/run/board/run-board-status.ts +279 -0
  725. package/scripts/run/board/run-board-tick.ts +210 -0
  726. package/scripts/run/board/run-board-track.ts +22 -0
  727. package/scripts/run/board/run-board-usage-read.ts +255 -0
  728. package/scripts/run/board/run-board-usage-rusage.ts +124 -0
  729. package/scripts/run/board/run-board-usage-text.ts +80 -0
  730. package/scripts/run/board/run-board-usage.ts +165 -0
  731. package/scripts/run/carry/run-carry-added.ts +62 -0
  732. package/scripts/run/carry/run-carry-args.ts +25 -22
  733. package/scripts/run/carry/run-carry-change.ts +1 -1
  734. package/scripts/run/carry/run-carry-cli.ts +71 -48
  735. package/scripts/run/carry/run-carry-conversation.ts +6 -7
  736. package/scripts/run/carry/run-carry-ended.ts +85 -0
  737. package/scripts/run/carry/run-carry-reclaim.ts +1 -1
  738. package/scripts/run/carry/run-carry-stash.ts +3 -2
  739. package/scripts/run/carry/run-carry-streak.ts +8 -10
  740. package/scripts/run/carry/run-carry.ts +85 -89
  741. package/scripts/run/cut/run-cut-args.ts +7 -7
  742. package/scripts/run/cut/run-cut-cli.ts +54 -36
  743. package/scripts/run/cut/run-cut-handoff.ts +15 -15
  744. package/scripts/run/cut/run-cut-report.ts +37 -16
  745. package/scripts/run/cut/run-cut.ts +63 -77
  746. package/scripts/run/detached-launch.ts +35 -50
  747. package/scripts/run/entry/run-entry-cli.ts +48 -27
  748. package/scripts/run/entry/run-entry-stop.ts +7 -9
  749. package/scripts/run/entry/run-entry.ts +5 -6
  750. package/scripts/run/event/run-event-cli.ts +5 -6
  751. package/scripts/run/event/run-event-filed.ts +69 -0
  752. package/scripts/run/event/run-event-follow.ts +3 -3
  753. package/scripts/run/event/run-event-plan.ts +38 -0
  754. package/scripts/run/event/run-event-render.ts +9 -4
  755. package/scripts/run/event/run-event-scope.ts +47 -18
  756. package/scripts/run/event/run-event-stream-emit.ts +64 -11
  757. package/scripts/run/event/run-event-stream.ts +171 -46
  758. package/scripts/run/event/run-event-watch.ts +4 -6
  759. package/scripts/run/hold/run-hold-cli.ts +65 -62
  760. package/scripts/run/hold/run-hold.ts +88 -46
  761. package/scripts/run/merge/run-merge-cli.ts +116 -77
  762. package/scripts/run/merge/run-merge-collect.ts +107 -0
  763. package/scripts/run/merge/run-merge-steps.ts +112 -65
  764. package/scripts/run/merge/run-merge-token.ts +30 -0
  765. package/scripts/run/merge/run-merge.ts +31 -22
  766. package/scripts/run/progress/run-progress-args.ts +4 -4
  767. package/scripts/run/progress/run-progress-cli.ts +39 -50
  768. package/scripts/run/progress/run-progress-clock.ts +25 -32
  769. package/scripts/run/progress/run-progress-config.ts +6 -9
  770. package/scripts/run/progress/run-progress-read.ts +9 -10
  771. package/scripts/run/progress/run-progress.ts +48 -53
  772. package/scripts/run/review/run-review-cli.ts +6 -6
  773. package/scripts/run/review/run-review-steps.ts +6 -6
  774. package/scripts/run/review/run-review.ts +9 -11
  775. package/scripts/run/run-cli-fault.ts +29 -0
  776. package/scripts/run/run-ending-cli.ts +3 -3
  777. package/scripts/run/run-ending.ts +10 -14
  778. package/scripts/run/run-halfrun-resume.ts +6 -8
  779. package/scripts/run/run-headless.ts +25 -12
  780. package/scripts/run/run-invocation.ts +17 -22
  781. package/scripts/run/run-label.ts +7 -5
  782. package/scripts/run/run-liveness-cli.ts +19 -6
  783. package/scripts/run/run-liveness.ts +27 -38
  784. package/scripts/run/run-next-cli.ts +5 -9
  785. package/scripts/run/run-next.ts +4 -5
  786. package/scripts/run/run-parent-cut-hook.ts +10 -12
  787. package/scripts/run/run-preflight.ts +25 -29
  788. package/scripts/run/run-prep-cli.ts +17 -13
  789. package/scripts/run/run-prep-locate.ts +4 -5
  790. package/scripts/run/run-prep.ts +7 -10
  791. package/scripts/run/run-prrun-resume.ts +2 -2
  792. package/scripts/run/run-report-cli.ts +4 -4
  793. package/scripts/run/run-report.ts +9 -14
  794. package/scripts/run/run-retrospective.ts +3 -3
  795. package/scripts/run/run-section.ts +42 -0
  796. package/scripts/run/run-stage-read.ts +2 -2
  797. package/scripts/run/run-stage.ts +6 -4
  798. package/scripts/run/run-status-cli.ts +7 -5
  799. package/scripts/run/run-status.ts +6 -7
  800. package/scripts/run/run-step-cli.ts +13 -15
  801. package/scripts/run/run-step.ts +58 -47
  802. package/scripts/run/run-stop-notify.ts +7 -8
  803. package/scripts/run/run-stranded-cli.ts +1 -1
  804. package/scripts/run/run-stranded-detect.ts +4 -4
  805. package/scripts/run/run-stranded.ts +11 -13
  806. package/scripts/run/run-tail-cli.ts +15 -16
  807. package/scripts/run/run-tail.ts +14 -33
  808. package/scripts/run/run-watcher-guard-cli.ts +3 -4
  809. package/scripts/run/run-watcher-guard.ts +11 -12
  810. package/scripts/run/run-watcher-hook.ts +6 -12
  811. package/scripts/run/ship/run-ship-cli.ts +67 -33
  812. package/scripts/run/ship/run-ship-detach.ts +15 -13
  813. package/scripts/run/ship/run-ship-lock.ts +1 -1
  814. package/scripts/run/ship/run-ship-next.ts +7 -8
  815. package/scripts/run/ship/run-ship-pre-detach.ts +27 -11
  816. package/scripts/run/ship/run-ship-preflight.ts +10 -11
  817. package/scripts/run/ship/run-ship-probe.ts +4 -4
  818. package/scripts/run/ship/run-ship-return.ts +1 -1
  819. package/scripts/run/ship/run-ship-review-steps.ts +43 -24
  820. package/scripts/run/ship/run-ship-review.ts +12 -14
  821. package/scripts/run/ship/run-ship-scoped.ts +15 -6
  822. package/scripts/run/ship/run-ship-stage.ts +80 -26
  823. package/scripts/run/ship/run-ship-steps.ts +26 -16
  824. package/scripts/run/ship/run-ship-stop-text.ts +4 -2
  825. package/scripts/run/ship/run-ship-sync.ts +9 -8
  826. package/scripts/run/ship/run-ship.ts +17 -32
  827. package/scripts/run/tidy/run-tidy-cli.ts +9 -5
  828. package/scripts/run/tidy/run-tidy-lanes.ts +18 -7
  829. package/scripts/run/tidy/run-tidy-stashes.ts +8 -8
  830. package/scripts/run/tidy/run-tidy.ts +4 -3
  831. package/scripts/run/wake/run-wake-cli.ts +27 -32
  832. package/scripts/run/wake/run-wake-describe.ts +24 -28
  833. package/scripts/run/wake/run-wake-driver.ts +14 -14
  834. package/scripts/run/wake/run-wake-handoff.ts +6 -6
  835. package/scripts/run/wake/run-wake-loop.ts +9 -9
  836. package/scripts/run/wake/run-wake-restart.ts +4 -5
  837. package/scripts/run/wake/run-wake-session.ts +23 -27
  838. package/scripts/run/wake/run-wake.ts +57 -279
  839. package/scripts/safe-chain/ci-installer-pin.ts +3 -3
  840. package/scripts/safe-chain/pack-hook.ts +2 -2
  841. package/scripts/safe-chain/preinstall-command.ts +2 -2
  842. package/scripts/security/security-audit-logic.ts +1 -1
  843. package/scripts/security/security-audit-provision-logic.ts +1 -1
  844. package/scripts/security/security-audit-provision.ts +2 -2
  845. package/scripts/security/security-audit.ts +5 -5
  846. package/scripts/security/security-updates-logic.ts +2 -3
  847. package/scripts/security/security-updates.ts +2 -4
  848. package/scripts/self-sync-guard/index.ts +1 -1
  849. package/scripts/self-sync-guard/self-sync-guard-logic.ts +2 -2
  850. package/scripts/self-sync-guard/self-sync-refusal.ts +1 -1
  851. package/scripts/sonar/sonar-hotspots-cli.ts +1 -1
  852. package/scripts/sonar/sonar-hotspots.ts +1 -1
  853. package/scripts/sonar/sonar-new-code-cli.ts +1 -1
  854. package/scripts/sonar/sonar-new-code.ts +1 -1
  855. package/scripts/sonar/sonar-project.ts +1 -1
  856. package/scripts/split/split-assess-cli.ts +1 -1
  857. package/scripts/split/split-assess.ts +3 -3
  858. package/scripts/sync/directory-copy-guard.ts +2 -3
  859. package/scripts/sync/managed-config-scope-cli.ts +1 -2
  860. package/scripts/sync/managed-config-scope.ts +4 -4
  861. package/scripts/sync/plugin-skill-directories.ts +2 -2
  862. package/scripts/sync/reconcile-templates.ts +17 -8
  863. package/scripts/sync/removed-skill-manifest.ts +2 -3
  864. package/scripts/sync/sync-ai-files.ts +7 -7
  865. package/scripts/sync/sync-configs.ts +30 -3
  866. package/scripts/sync/sync-hook-safety.ts +2 -2
  867. package/scripts/sync/sync.ts +23 -10
  868. package/scripts/sync/synced-paths.ts +2 -1
  869. package/scripts/sync/workflow-pin-logic.ts +1 -1
  870. package/scripts/test/test-declared-changed.ts +4 -4
  871. package/scripts/test/test-declared-logic.ts +2 -3
  872. package/scripts/test/test-declared-match.ts +25 -4
  873. package/scripts/test/test-declared.ts +26 -9
  874. package/scripts/test/test-red-commit.ts +3 -2
  875. package/scripts/test/test-red-logic.ts +7 -14
  876. package/scripts/test/test-red.ts +12 -47
  877. package/scripts/test/test-related-scope.ts +2 -3
  878. package/scripts/test/test-related.ts +3 -3
  879. package/scripts/test/test-type-logic.ts +1 -2
  880. package/scripts/test/test-unit-guard.ts +13 -17
  881. package/scripts/test/unit-worker-share.ts +7 -8
  882. package/scripts/time-runtime/time-agent-bundles.ts +2 -4
  883. package/scripts/time-runtime/time-background.ts +17 -21
  884. package/scripts/time-runtime/time-batch-guard.ts +67 -342
  885. package/scripts/time-runtime/time-bundle-call.ts +26 -28
  886. package/scripts/time-runtime/time-bundles.ts +11 -12
  887. package/scripts/time-runtime/time-call-identity.ts +1 -1
  888. package/scripts/time-runtime/time-command-key.ts +2 -2
  889. package/scripts/time-runtime/time-density-hook.ts +8 -11
  890. package/scripts/time-runtime/time-density.ts +5 -5
  891. package/scripts/time-runtime/time-followup-stage.ts +7 -7
  892. package/scripts/time-runtime/time-format.ts +5 -5
  893. package/scripts/time-runtime/time-hook-transcript.ts +3 -3
  894. package/scripts/time-runtime/time-instant.ts +1 -1
  895. package/scripts/time-runtime/time-markers.ts +15 -19
  896. package/scripts/time-runtime/time-phase-names.ts +3 -3
  897. package/scripts/time-runtime/time-reported-failure.ts +15 -19
  898. package/scripts/time-runtime/time-round-trips.ts +20 -23
  899. package/scripts/time-runtime/time-shell.ts +8 -8
  900. package/scripts/time-runtime/time-single-check.ts +1 -2
  901. package/scripts/time-runtime/time-spans.ts +35 -40
  902. package/scripts/time-runtime/time-tool-call.ts +15 -16
  903. package/scripts/time-runtime/time-transcript-line.ts +53 -34
  904. package/scripts/time-runtime/time-writes.ts +5 -5
  905. package/scripts/ui/ui-routes-cli.ts +1 -2
  906. package/scripts/ui/ui-routes.ts +1 -2
  907. package/scripts/version/bump-version.ts +1 -1
  908. package/scripts/version/fresh-metadata-cache.ts +2 -2
  909. package/scripts/version/latest-corepack.ts +26 -26
  910. package/scripts/version/latest-lane-guard.ts +1 -1
  911. package/scripts/version/latest-scope-cli.ts +2 -2
  912. package/scripts/version/latest-stamp.ts +1 -2
  913. package/scripts/version/latest-update.ts +2 -2
  914. package/scripts/version/npm-registry.ts +2 -2
  915. package/scripts/version/package-manager-version.ts +18 -0
  916. package/scripts/version/publishable-range-check.ts +2 -1
  917. package/scripts/version/publishable-range.ts +1 -1
  918. package/scripts/version/release-age.ts +11 -11
  919. package/scripts/version/release-hold.ts +2 -2
  920. package/scripts/version/safe-chain-version-update.ts +3 -3
  921. package/scripts/version/version-check-logic.ts +2 -3
  922. package/scripts/version/version-check.ts +1 -2
  923. package/scripts/version/version-command-config.ts +2 -2
  924. package/scripts/version/version-commands.ts +3 -3
  925. package/scripts/version/version-remote.ts +4 -4
  926. package/scripts/version/version-targets.ts +2 -2
  927. package/templates/gitignore +7 -0
  928. package/dist/hooks/chunk-KHX4U3BG.js +0 -6400
  929. package/dist/hooks/chunk-RKUAD3I6.js +0 -90
  930. package/dist/hooks/chunk-WPALEIRX.js +0 -18
  931. package/scripts/backlog/backlog-restructure.ts +0 -152
  932. package/scripts/rules/issue-fold-rule.ts +0 -72
  933. package/scripts/rules/wip-cap.ts +0 -63
  934. package/scripts/run/run-issue-number.ts +0 -19
@@ -20,9 +20,9 @@ import { epic_parse } from './epic-parse'
20
20
  import { epic_report, type EpicNextResult } from './epic-report'
21
21
 
22
22
  // `josh epic:next <E…>` — which of the named epics' children can be started right now, bundled per
23
- // repository, and what the rest are waiting on (joshuafolkken/kit#860).
23
+ // repository, and what the rest are waiting on.
24
24
  //
25
- // **Several epics answer as one** (joshuafolkken/kit#1493). Every leading argument is an epic
25
+ // **Several epics answer as one**. Every leading argument is an epic
26
26
  // reference, and their children merge into one candidate pool per repository — so a repository with
27
27
  // six free lanes fills them from every named epic rather than from whichever one was typed first.
28
28
  // The merge itself, and why the priority order is the order they were named, is
@@ -33,17 +33,14 @@ const SUCCESS_EXIT_CODE = 0
33
33
  const FAILURE_EXIT_CODE = 1
34
34
  const ARGV_OFFSET = 2
35
35
  // Asking for every free lane (`--lanes`) is opt-in, so the answer stays one token for a caller that
36
- // has not been changed. `--repo` alone still prints exactly one number — what joshuafolkken/kit#1491
37
- // changed for it is *when* that number appears, not how many arrive (joshuafolkken/kit#1491).
36
+ // has not been changed. `--repo` alone prints exactly one number.
38
37
  const OPTIONS = { repo: { type: 'string' }, lanes: { type: 'boolean' } } as const
39
38
  const USAGE =
40
39
  'Usage: josh epic:next <epic-number|owner/repo#number>... [--repo <owner/repo>] [--lanes]'
41
- // A repository that could not be read is refused rather than stood in for. Since
42
- // joshuafolkken/kit#1126 a blocker carries the repository it lives in, so a placeholder on the
43
- // children keys them as `unknown/unknown#N` while their blockers keep their real names: every
44
- // relation misses, `from_blockers([])` calls the child runnable, and an unattended run starts a
45
- // dependent before its prerequisite. The old placeholder was harmless only while every blocker
46
- // inherited the child's own repository — it matched itself.
40
+ // A repository that could not be read is refused rather than stood in for. A blocker carries the
41
+ // repository it lives in, so a placeholder on the children would key them as `unknown/unknown#N`
42
+ // while their blockers keep their real names: every relation misses, `from_blockers([])` calls the
43
+ // child runnable, and an unattended run starts a dependent before its prerequisite.
47
44
  const UNKNOWN_REPO =
48
45
  'Could not read this repository from `git remote`, so the children cannot be keyed by repository — check `gh auth status` and that this is a checkout with an `origin` remote.'
49
46
  const EXTERNAL_NOTICE = 'Note: this epic tracks children in other repositories.'
@@ -55,7 +52,7 @@ const UNCHECKED_EXCLUSION =
55
52
 
56
53
  interface NextOptions {
57
54
  // Every epic named, in the order they were named — which is the order their children then take
58
- // free lanes in (joshuafolkken/kit#1493). Each reference carries the repository the *epic* lives
55
+ // free lanes in. Each reference carries the repository the *epic* lives
59
56
  // in when it was qualified (`owner/repo#858`).
60
57
  references?: ReadonlyArray<EpicReference>
61
58
  // The repository to narrow the candidates to (`--repo`).
@@ -93,9 +90,9 @@ function with_repo(
93
90
  }
94
91
 
95
92
  // The positional arguments are epic references and the flags are options, so `epic:next 858 909 --repo
96
- // X` reads two epics and `epic:next 858 --repo X` still reads one (joshuafolkken/kit#1493). The read is
93
+ // X` reads two epics and `epic:next 858 --repo X` still reads one. The read is
97
94
  // strict: an unknown flag reaches the usage line rather than being ignored, and a value that is itself
98
- // a flag is no value at all — `--repo --lanes` used to narrow to a repository literally named
95
+ // a flag is no value at all — `--repo --lanes` must not narrow to a repository literally named
99
96
  // `--lanes` and report `No runnable child in --lanes` with exit 0.
100
97
  //
101
98
  // `--lanes` without `--repo` is refused rather than ignored: the lane count is a property of one
@@ -118,10 +115,10 @@ function parse_options(argv: ReadonlyArray<string>): NextOptions {
118
115
  // leaves whatever it blocks looking unblocked.
119
116
  //
120
117
  // Each one is named with the repository it lives in, through the same writer the audit uses: an epic
121
- // tracking `- [ ] sveltejs/kit#7` reported `Could not read #7`, and a reader sent to this
122
- // repository's issue 7 finds a different issue or none (joshuafolkken/kit#1016).
123
- // **The epic's own body failing to read is its own anomaly, ahead of the children's**
124
- // (joshuafolkken/kit#1690). Without it the failure is silent: a body that never arrived parses to
118
+ // tracking `- [ ] sveltejs/kit#7` reporting `Could not read #7` would send a reader to this
119
+ // repository's issue 7, a different issue or none.
120
+ // **The epic's own body failing to read is its own anomaly, ahead of the children's**.
121
+ // Without it the failure is silent: a body that never arrived parses to
125
122
  // zero children, the epic is dropped from the views as an unpopulated one, no anomaly is raised, and
126
123
  // the verdict falls through to `complete` — which `backlog:next` prints as `none`, so the run reports
127
124
  // the backlog exhausted over one request that never left the machine. It is checked first because a
@@ -153,8 +150,8 @@ function unreadable_anomaly(snapshot: EpicSnapshot): GraphAnomaly | undefined {
153
150
  // every correct relation as undeclared.
154
151
  //
155
152
  // Deliberately a disjunction where `epic:check` takes exactly one of the two: a body declaring both
156
- // a chain and the `None — ...` literal is a contradiction, and reporting it is the check's job
157
- // (joshuafolkken/kit#1155). Refusing to hand out work here as well would stop an unattended run on a
153
+ // a chain and the `None — ...` literal is a contradiction, and reporting it is the check's job.
154
+ // Refusing to hand out work here as well would stop an unattended run on a
158
155
  // body whose declared chain and recorded relations agree — a worse outcome than following the chain
159
156
  // the run's own `epic:check` already flagged.
160
157
  function is_order_declared(body: string | undefined, links: ReadonlyArray<unknown>): boolean {
@@ -178,7 +175,7 @@ function decide(
178
175
  )
179
176
  : [unreadable]
180
177
  // The cross-repository resolver, not the default one: a blocker in another repository is not
181
- // finished when it closes, only when its release is published (joshuafolkken/kit#864).
178
+ // finished when it closes, only when its release is published.
182
179
  const classification = epic_classify.classify_children(
183
180
  snapshot.children,
184
181
  epic_cross_repo.resolve_cross_repo,
@@ -203,8 +200,8 @@ function repo_verdict(verdict: LaneOffer['verdict']): LaneOffer['verdict'] {
203
200
  }
204
201
 
205
202
  // The confirmed candidates' numbers, one per line, or the verdict that stands in their place when
206
- // there was no free lane or the relations listing withheld every one of them
207
- // (joshuafolkken/kit#1121). Standard output carries numbers or a verdict and nothing else, so
203
+ // there was no free lane or the relations listing withheld every one of them.
204
+ // Standard output carries numbers or a verdict and nothing else, so
208
205
  // `child=$(josh epic:next … --repo …)` is unchanged for the caller that asked for one child — which
209
206
  // is every caller that did not pass `--lanes`.
210
207
  function report_offer(offer: LaneOffer): number {
@@ -222,23 +219,22 @@ function report_offer(offer: LaneOffer): number {
222
219
  }
223
220
 
224
221
  // The candidates, once the repository has been asked **how many lanes it already has running** —
225
- // whichever epic those belong to (joshuafolkken/kit#925, counted rather than excluded since
226
- // joshuafolkken/kit#1491). The invariant is per *repository* rather than per epic, and it is a
222
+ // whichever epic those belong to, counted rather than excluded. The invariant is per *repository* rather than per epic, and it is a
227
223
  // ceiling on how many children run there at once rather than a lock on the whole checkout.
228
224
  //
229
225
  // Asked only when there *is* a candidate: consulted on `stop` or `complete` too, an unrelated
230
226
  // `in-progress` issue would turn a finished epic into a permanent `wait`, and neither of those
231
227
  // verdicts is about to start anything. It also never reaches a third party's tracker, since a child
232
- // in a repository with another owner is refused before it is read (joshuafolkken/kit#869).
228
+ // in a repository with another owner is refused before it is read.
233
229
  //
234
230
  // **A read that failed answers `wait` too** — never a child, and not an error either
235
231
  // (`epic-busy.ts` records why both wrong answers are wrong). **So does a listing that was cut
236
- // short**: since joshuafolkken/kit#1067 the page ceiling bounds this listing as well, and a short
232
+ // short**: the page ceiling bounds this listing as well, and a short
237
233
  // listing with no visible holder is not "nothing is running".
238
234
  //
239
235
  // One pool per named epic, in the order they were named. Nothing below this line knows what an epic
240
236
  // is (`epic-lane-offer.ts` records why), so the whole cost of running several of them is here: build
241
- // the pools, and let the scheduler spend the free lanes across them (joshuafolkken/kit#1493).
237
+ // the pools, and let the scheduler spend the free lanes across them.
242
238
  async function offer_children(
243
239
  views: ReadonlyArray<EpicView>,
244
240
  request: LaneRequest,
@@ -287,7 +283,7 @@ async function report_single(
287
283
  // The aggregate listing does not consult the repository-level exclusion — `--repo` is what asks a
288
284
  // repository whether it is busy, and doing it here would be one listing per repository for a report
289
285
  // nobody branches on. Said out loud rather than left implicit: this output names runnable children,
290
- // and the `--repo` form may answer `wait` for the very same child (joshuafolkken/kit#925).
286
+ // and the `--repo` form may answer `wait` for the very same child.
291
287
  function note_unchecked_exclusion(views: ReadonlyArray<EpicView>): void {
292
288
  if (epic_next_views.combined_verdict(views) === 'run') console.error(UNCHECKED_EXCLUSION)
293
289
  }
@@ -295,7 +291,7 @@ function note_unchecked_exclusion(views: ReadonlyArray<EpicView>): void {
295
291
  // One block per epic, and the notice printed once for all of them rather than once each: it says
296
292
  // what this listing does not check, which is the same sentence however many graphs it covers. The
297
293
  // listing names each epic and its children as `#N`, linkified against the current repository so the
298
- // output a run reads carries clickable references rather than bare ones (joshuafolkken/kit#2329).
294
+ // output a run reads carries clickable references rather than bare ones.
299
295
  function report_aggregate(views: ReadonlyArray<EpicView>, current_repo: string): number {
300
296
  note_unchecked_exclusion(views)
301
297
 
@@ -339,7 +335,7 @@ async function report(
339
335
  return report_aggregate(views, current_repo)
340
336
  }
341
337
 
342
- // The checkout each repository's children would be run in comes from joshuafolkken/kit#869's map. A
338
+ // The checkout each repository's children would be run in comes from the workspace map. A
343
339
  // repository absent from it is reported without a path rather than cloned.
344
340
  //
345
341
  // **Every epic is classified against the same reset**, not one reset each: `reset_reported` and
@@ -352,7 +348,7 @@ async function report_epics(
352
348
  ): Promise<number> {
353
349
  if (options.repo === undefined) return await report(views, undefined, current_repo)
354
350
 
355
- const choice = lane_capacity.lane_limit()
351
+ const choice = await lane_capacity.lane_limit()
356
352
  if (choice.kind === 'problem') return refuse(choice.problem)
357
353
 
358
354
  return await report(
@@ -364,7 +360,7 @@ async function report_epics(
364
360
 
365
361
  // One view per named epic, classified against one shared registry read. `running` is every named
366
362
  // epic's children unless a caller that runs more — `backlog:next` — passes its own set, so a blocker
367
- // in another named epic waits rather than stops (joshuafolkken/kit#1943).
363
+ // in another named epic waits rather than stops.
368
364
  function views_of(
369
365
  reads: ReadonlyArray<EpicRead>,
370
366
  running = epic_outside_blocker.running_keys(reads.flatMap((read) => read.snapshot.children)),
@@ -423,7 +419,7 @@ async function run(argv: ReadonlyArray<string>): Promise<number> {
423
419
  // `process.exitCode` rather than `process.exit()`, for the reason `scripts/cost-runtime/cost-cli.ts` records:
424
420
  // the answer goes to standard output and a write to a pipe is asynchronous on macOS, so exiting can
425
421
  // tear the process down before it drains. This command's contract is `answer=$(pnpm josh epic:next
426
- // <E>)`, which is exactly that pipe (joshuafolkken/kit#996).
422
+ // <E>)`, which is exactly that pipe.
427
423
  async function main(argv: ReadonlyArray<string>): Promise<void> {
428
424
  process.exitCode = await run(argv)
429
425
  }
@@ -1,10 +1,11 @@
1
+ import { session_cite } from '#scripts/issue/session-cite'
1
2
  import { epic_graph, type EpicChild, type IssueReference } from './epic-graph'
2
3
 
3
- // A blocker no graph in this invocation tracks, weighed rather than ignored (joshuafolkken/kit#1943).
4
+ // A blocker no graph in this invocation tracks, weighed rather than ignored.
4
5
  //
5
- // Until this, a relation pointing outside the epic was announced and dropped, so a child waiting on
6
- // another epic's open issue was offered as runnable — `backlogrun` would start joshuafolkken/kit#1936's
7
- // children before joshuafolkken/kit#1921 had restored CI, whatever `blocked-by` said. What decides the
6
+ // A relation pointing outside the epic is weighed rather than announced and dropped, so a child
7
+ // waiting on another epic's open issue is not offered as runnable, whatever `blocked-by` says. What
8
+ // decides the
8
9
  // answer is whether *this run* can finish the blocker: an open blocker the run also runs is `time`
9
10
  // (waiting resolves it), one it does not is `human` (only a person can), and a blocker whose state was
10
11
  // never read is `time` rather than runnable, because an unknown is never read as finished.
@@ -15,12 +16,12 @@ import { epic_graph, type EpicChild, type IssueReference } from './epic-graph'
15
16
  //
16
17
  // `inherit` is the ordinary answer: the blocker is not finished, so this child's fate is the
17
18
  // blocker's fate. `time` and `human` are for a dependency that is unresolved for a reason the
18
- // blocker's own state does not show — joshuafolkken/kit#864's case, where a blocker is closed but
19
- // its package has not been published yet, is `time`.
19
+ // blocker's own state does not show — a blocker that is closed but whose package has not been
20
+ // published yet is `time`.
20
21
  type DependencyVerdict = 'resolved' | 'time' | 'human' | 'inherit'
21
22
 
22
- // The extension point. Replaced wholesale by joshuafolkken/kit#864 to add the publish condition;
23
- // the default knows only that a closed blocker is a finished one.
23
+ // The extension point, replaced wholesale to add the publish condition; the default knows only that
24
+ // a closed blocker is a finished one.
24
25
  type ResolveDependency = (blocker: EpicChild, blocked: EpicChild) => DependencyVerdict
25
26
 
26
27
  type OutsideCategory = 'time' | 'human'
@@ -39,11 +40,11 @@ interface OutsideAnswer {
39
40
  const CLOSED = 'CLOSED'
40
41
 
41
42
  function name_of(child: EpicChild): string {
42
- return `#${String(child.number)}`
43
+ return session_cite.issue(child.number, undefined, child.repo)
43
44
  }
44
45
 
45
46
  // A closed reference as the child record a resolver takes, so a closed blocker in another repository
46
- // still waits for its release exactly as a tracked one does (joshuafolkken/kit#864).
47
+ // still waits for its release exactly as a tracked one does.
47
48
  function as_closed_child(reference: IssueReference): EpicChild {
48
49
  return {
49
50
  number: reference.number,
@@ -1,20 +1,21 @@
1
+ import { issue_cite } from '#scripts/issue/issue-cite'
2
+
1
3
  // An epic Issue tracks its children as a markdown task list (`- [ ] #101`). Only that syntax
2
4
  // counts as tracked: GitHub auto-checks such an entry when the referenced Issue closes, whereas a
3
5
  // bare `#101` reference produces a cross-link with no progress tracking.
4
6
  //
5
7
  // The source is shared by the whole-body scan and the single-line test rather than written twice: a
6
8
  // rewriter has to recognize exactly the rows the reader counts, and two copies of this pattern would
7
- // be two chances to disagree about what a tracked row is (joshuafolkken/kit#890).
9
+ // be two chances to disagree about what a tracked row is.
8
10
  const TASK_LIST_ISSUE_SOURCE = String.raw`^[ \t]*[-*+][ \t]+\[[ xX]\][ \t]+#(\d+)\b`
9
11
  const TASK_LIST_ISSUE_PATTERN = new RegExp(TASK_LIST_ISSUE_SOURCE, 'gmu')
10
12
  const TASK_LIST_LINE_PATTERN = new RegExp(TASK_LIST_ISSUE_SOURCE, 'u')
11
13
 
12
14
  // A task list may also reference an Issue in another repository (`owner/repo#101`, or a full URL).
13
- // Detecting one is what the auto-close used to bail on; joshuafolkken/kit#864 reads them instead,
14
- // against their own repository, and the pattern below extracts which repository and which issue.
15
+ // Such a reference is read against its own repository, and the pattern below extracts which repository and which issue.
15
16
  // `owner/repo#101` on its own. The row patterns below are built from this source, so what counts as
16
17
  // a cross-repository reference has one definition — a second copy would let a form the task list
17
- // accepts be refused where a person types it, or the reverse (joshuafolkken/kit#985).
18
+ // accepts be refused where a person types it, or the reverse.
18
19
  const EXTERNAL_REFERENCE_SOURCE = String.raw`([\w.-]+)\/([\w.-]+)#(\d+)`
19
20
  const EXTERNAL_REFERENCE_PATTERN = new RegExp(`^${EXTERNAL_REFERENCE_SOURCE}$`, 'u')
20
21
  const TASK_LIST_ROW_SOURCE = String.raw`^[ \t]*[-*+][ \t]+\[[ xX]\][ \t]+`
@@ -39,12 +40,12 @@ const FENCE_LINE_PATTERN = /^[ \t]*(?:`{3,}|~{3,})/u
39
40
  // A chain between two Issue references (`#101 -> #102`, or the arrow written as `→`), read for its
40
41
  // links. `epic:next` compares what the body declares against the `blocked-by` relations actually
41
42
  // recorded, and a body that says one order while the relations say another must stop the run rather
42
- // than silently follow either (joshuafolkken/kit#860).
43
+ // than silently follow either.
43
44
  //
44
- // Only a line that is *nothing but* a chain counts, optionally behind a list marker. Measured
45
- // against joshuafolkken/kit#858, whose Dependencies section is followed by a prose line recommending
46
- // an execution order — e.g. `recommended order: #869 -> #863 -> …`. Those arrows are a suggestion, not a
47
- // declaration, and reading them as one reported four disagreements that did not exist.
45
+ // Only a line that is *nothing but* a chain counts, optionally behind a list marker. A Dependencies
46
+ // section may be followed by a prose line recommending an execution order — e.g.
47
+ // `recommended order: #869 -> #863 -> …`. Those arrows are a suggestion, not a declaration, and
48
+ // reading them as one reports disagreements that do not exist.
48
49
  const DECLARED_CHAIN_LINE = /^(?:[-*+][ \t]+)?#\d+(?:[ \t]*(?:->|→)[ \t]*#\d+)+$/u
49
50
  const CHAIN_REFERENCE_PATTERN = /#(\d+)/gu
50
51
 
@@ -59,7 +60,7 @@ const CLOSED_STATE = 'CLOSED'
59
60
  // Which lines a body predicate is allowed to read: `false` for a fence line and for everything
60
61
  // between a pair of them. Returned as a mask rather than a filtered string because a rewriter has to
61
62
  // put lines back where it found them, and it must skip exactly the lines the readers skip — two
62
- // separate fence walks would be two chances to disagree (joshuafolkken/kit#890).
63
+ // separate fence walks would be two chances to disagree.
63
64
  //
64
65
  // Toggling on each fence line keeps this linear — a single regex spanning the block would backtrack.
65
66
  // An unterminated fence swallows the rest of the body, which fails safe: fewer children means the
@@ -141,7 +142,7 @@ function to_external_child(match: RegExpMatchArray): ExternalChild | undefined {
141
142
 
142
143
  // A bare `owner/repo#101`, as a person types it — the same shape the task-list rows carry, read
143
144
  // from a command argument rather than from a body. It reuses `to_external_child` so the two cannot
144
- // disagree about which owner and repository names are acceptable (joshuafolkken/kit#985).
145
+ // disagree about which owner and repository names are acceptable.
145
146
  function parse_external_reference(text: string): ExternalChild | undefined {
146
147
  const match = EXTERNAL_REFERENCE_PATTERN.exec(text.trim())
147
148
  if (match === null) return undefined
@@ -157,7 +158,7 @@ function match_external(body: string, pattern: RegExp): Array<ExternalChild> {
157
158
 
158
159
  // Every cross-repository child the task list tracks, in both spellings. Reported as `owner/repo`
159
160
  // plus a number rather than a URL, which is the form the repository map takes and the form the
160
- // read's REST path is built from (joshuafolkken/kit#864).
161
+ // read's REST path is built from.
161
162
  function parse_external_task_list_children(body: string | undefined): Array<ExternalChild> {
162
163
  if (body === undefined) return []
163
164
  const stripped = strip_fenced_blocks(body)
@@ -168,7 +169,7 @@ function parse_external_task_list_children(body: string | undefined): Array<Exte
168
169
  const seen = new Set<string>()
169
170
 
170
171
  return found.filter((child) => {
171
- const key = `${child.repo}#${String(child.number)}`
172
+ const key = issue_cite.plain(child.number, child.repo)
172
173
  const is_new = !seen.has(key)
173
174
 
174
175
  seen.add(key)
@@ -194,7 +195,7 @@ function has_unordered_declaration(body: string | undefined): boolean {
194
195
  // Whether one line, on its own, is part of a machine-readable `Dependencies` declaration — a chain or
195
196
  // the unordered sentence. It lives here beside the two patterns it tests rather than in either of the
196
197
  // modules that rewrite a body, because both of them need it and a second copy is where one comes to
197
- // disagree with the parser about what counts as a declaration (joshuafolkken/kit#1350).
198
+ // disagree with the parser about what counts as a declaration.
198
199
  function is_declaration_line(line: string): boolean {
199
200
  const trimmed = line.trim()
200
201
 
@@ -227,7 +228,7 @@ function chain_links(references: ReadonlyArray<number>): Array<DependencyLink> {
227
228
  // Every declared chain, one entry per chain line, each holding its references in the order written.
228
229
  // Read at this granularity rather than as a flat link list because an insertion has to know *which*
229
230
  // chain a target sits in: two disjoint chains and one branching chain produce the same links, and
230
- // only the line structure tells them apart (joshuafolkken/kit#890).
231
+ // only the line structure tells them apart.
231
232
  //
232
233
  // Fenced blocks are stripped first for the reason they are everywhere else: a quoted template's
233
234
  // sample chain is an illustration.
@@ -251,13 +252,11 @@ function parse_dependency_links(body: string | undefined): Array<DependencyLink>
251
252
  // warning, which need to tell "the order was never recorded" from "there is no order".
252
253
  //
253
254
  // Answered from the chains above rather than from a pattern of its own, because a second pattern is
254
- // a second answer: until joshuafolkken/kit#1155 this scanned the whole body for a bare `#N -> #M`,
255
- // so a rationale paragraph recommending an execution order made an epic declared
256
- // `None — the children are independent` report as ordered, and `josh followup` then said the batch
257
- // order was never recorded on every child's merge. The narrowing joshuafolkken/kit#858 applied to
258
- // the link reader was the same judgement, and `epic --add` writes on that judgement too
259
- // (`epic-add-body.ts` protects an arrow outside the `Dependencies` section as prose) — so the
260
- // three readers of one body now recognize the same lines, instead of two patterns that could
255
+ // a second answer: scanning the whole body for a bare `#N -> #M` would let a rationale paragraph
256
+ // recommending an execution order make an epic declared `None — the children are independent`
257
+ // report as ordered. The link reader applies the same narrowing, and `epic --add` writes on that
258
+ // judgement too (`epic-add-body.ts` protects an arrow outside the `Dependencies` section as prose) —
259
+ // so the three readers of one body recognize the same lines, instead of two patterns that could
261
260
  // disagree about which line is a declaration. They still answer different questions of those lines:
262
261
  // a self-loop (`#101 -> #101`) is a declaration here and yields no link, since `chain_links` drops
263
262
  // an edge from an issue to itself.
@@ -283,8 +282,7 @@ function read_declaration(body: string | undefined): DeclarationState {
283
282
 
284
283
  // Whether that declaration says something a machine can act on: exactly one of the two forms, never
285
284
  // both. A body carrying a chain *and* the `None — ...` literal declares an order and declares that
286
- // there is none, and `epic:check` used to pass it while reporting only the half that contradicts the
287
- // other (joshuafolkken/kit#1155). Single-sourced here because `epic:check`, `epic --add` and
285
+ // there is none, so `epic:check` must not pass it. Single-sourced here because `epic:check`, `epic --add` and
288
286
  // `epic --promote` all mean this same question, and three copies of the disjunction were three
289
287
  // chances to accept a body the check rejects.
290
288
  function is_declaration_readable(state: DeclarationState): boolean {
@@ -1,3 +1,4 @@
1
+ import { session_cite } from '#scripts/issue/session-cite'
1
2
  import { epic_body } from './epic-body'
2
3
  import { epic_parse } from './epic-parse'
3
4
 
@@ -33,7 +34,7 @@ function has_conflicting_tracking(body: string | undefined): boolean {
33
34
  function conflict_reason(body: string | undefined): string {
34
35
  if (body?.includes(PROMOTED_HEADING) === true) return 'it already carries the epic sections'
35
36
  const tracked = epic_parse.parse_task_list_issue_numbers(body)
36
- const list = tracked.map((child) => `#${String(child)}`).join(', ')
37
+ const list = tracked.map((child) => session_cite.issue(child)).join(', ')
37
38
 
38
39
  return `its body already tracks ${list} as a task list, which would become a second child list`
39
40
  }
@@ -61,7 +62,7 @@ function build_promoted_body(input: PromoteInput): string {
61
62
  // the children: a declaration-shaped line already present in the issue being promoted is carried
62
63
  // into the epic verbatim, and an unordered promotion then adds the `None — ...` literal beside it,
63
64
  // so the body would declare an order and declare that there is none. Reported as "does not track
64
- // every child", that state left nothing to act on (joshuafolkken/kit#1155).
65
+ // every child", that state left nothing to act on.
65
66
  function declaration_error(body: string): string | undefined {
66
67
  const state = epic_parse.read_declaration(body)
67
68
  if (epic_parse.is_declaration_readable(state)) return undefined
@@ -1,7 +1,7 @@
1
1
  import { issue_rank } from '#scripts/issue/issue-rank'
2
2
  import { epic_graph, type EpicChild } from './epic-graph'
3
3
 
4
- // `issue-rank.ts`'s keys over graph children (joshuafolkken/kit#2928), for both offer paths that hand
4
+ // `issue-rank.ts`'s keys over graph children, for both offer paths that hand
5
5
  // out children: `backlog:next` (`backlog-rank.ts`) and a named epic's `epic:next --lanes`
6
6
  // (`epic-lane-offer.ts`). One ranking, so the two cannot disagree about which child goes first.
7
7
 
@@ -1,4 +1,5 @@
1
1
  import { git_gh_command } from '#scripts/gh/git-gh-command'
2
+ import { session_cite } from '#scripts/issue/session-cite'
2
3
  import { epic_fetch } from './epic-fetch'
3
4
  import { epic_graph, type EpicChild } from './epic-graph'
4
5
  import { epic_parse } from './epic-parse'
@@ -8,14 +9,14 @@ import { epic_validate, type EpicSubject } from './epic-validate'
8
9
  //
9
10
  // `--add` and `--remove` need exactly the same three things before they may compute anything: the
10
11
  // epic's labels and body, the repository a declared bare number names, and every child with its
11
- // native relations. They were the same forty lines twice until joshuafolkken/kit#1712 gave the
12
- // removal a home; a second copy is where one of them comes to accept a graph the other refuses.
12
+ // native relations. They share this one read because a second copy is where one of them comes to
13
+ // accept a graph the other refuses.
13
14
 
14
- // Refused rather than stood in for, and both callers *write*. Since joshuafolkken/kit#1126 a plan
15
- // filters recorded relations by the declared repository, so a placeholder drops every one of them:
16
- // the "reconcile them before inserting" guard never fires, the superseded link is never dropped, and
17
- // relations that already exist are re-POSTed — leaving the epic in exactly the mismatched state
18
- // `epic:audit` refuses to run on.
15
+ // Refused rather than stood in for, and both callers *write*. A plan filters recorded relations by
16
+ // the declared repository, so a placeholder drops every one of them: the "reconcile them before
17
+ // inserting" guard never fires, the superseded link is never dropped, and relations that already
18
+ // exist are re-POSTed — leaving the epic in exactly the mismatched state `epic:audit` refuses to run
19
+ // on.
19
20
  const UNKNOWN_REPO =
20
21
  "Could not read this repository from `git remote`, so the epic's relations cannot be keyed by repository — check `gh auth status` and that this is a checkout with an `origin` remote."
21
22
 
@@ -56,7 +57,8 @@ async function read_recorded(
56
57
  // The epic and its current graph, or the reason neither could be read.
57
58
  async function read_epic(epic_number: number): Promise<EpicReading | { error: string }> {
58
59
  const subject = await read_subject(epic_number)
59
- if (subject === undefined) return { error: `Could not read issue #${String(epic_number)}.` }
60
+ const unread = `Could not read issue ${session_cite.issue(epic_number)}.`
61
+ if (subject === undefined) return { error: unread }
60
62
 
61
63
  const recorded = await read_recorded(subject.body)
62
64
  if ('error' in recorded) return { error: recorded.error }
@@ -1,4 +1,5 @@
1
1
  import { git_gh_command } from '#scripts/gh/git-gh-command'
2
+ import { session_cite } from '#scripts/issue/session-cite'
2
3
  import { epic_add_body } from './epic-add-body'
3
4
  import { epic_chains } from './epic-chains'
4
5
  import { epic_graph, type EpicChild, type IssueReference } from './epic-graph'
@@ -8,8 +9,7 @@ import { format_dependency_links } from './epic-reference'
8
9
  import { epic_relations } from './epic-relations'
9
10
 
10
11
  // `josh epic --reconcile <E>` — bring an epic's `## Dependencies` declaration and its native
11
- // `blocked-by` relations back into agreement, without a hand edit and without recording a decision
12
- // (joshuafolkken/kit#2235).
12
+ // `blocked-by` relations back into agreement, without a hand edit and without recording a decision.
13
13
  //
14
14
  // `--add` and `--remove` refuse the moment the two disagree, and `backlog:next` reports the graph
15
15
  // unusable, so the only exit was to edit the epic body by hand — the very edit those commands exist
@@ -36,7 +36,7 @@ interface ReconcilePlanInput {
36
36
  body: string | undefined
37
37
  // The epic's children with their native relations, exactly as `epic_read` reads them.
38
38
  recorded: ReadonlyArray<EpicChild>
39
- // The epic's own repository — what a declared bare number names (joshuafolkken/kit#1126).
39
+ // The epic's own repository — what a declared bare number names.
40
40
  repo: string
41
41
  }
42
42
 
@@ -60,7 +60,7 @@ function to_chain(link: DependencyLink): Array<number> {
60
60
  }
61
61
 
62
62
  // A blocker of `blocked`, keyed to the epic's own repository so a declared bare number names the
63
- // right issue (joshuafolkken/kit#1126).
63
+ // right issue.
64
64
  function to_blocker(link: DependencyLink, repo: string): IssueReference {
65
65
  return { repo, number: link.blocker }
66
66
  }
@@ -161,7 +161,7 @@ function build_reconcile_plan(input: ReconcilePlanInput): ReconcilePlan {
161
161
  // refused the mismatched epic agree on its order.
162
162
  function report_agreement(epic_number: number): void {
163
163
  console.info(
164
- `${RECONCILED} #${String(epic_number)} — epic:audit and backlog:next now agree on this epic's order.`,
164
+ `${RECONCILED} ${session_cite.issue(epic_number)} — epic:audit and backlog:next now agree on this epic's order.`,
165
165
  )
166
166
  }
167
167
 
@@ -169,7 +169,9 @@ function report_declared(epic_number: number, declare: ReadonlyArray<DependencyL
169
169
  if (declare.length === 0) return
170
170
 
171
171
  console.info(
172
- `📋 Declared ${format_dependency_links(declare)} in epic #${String(epic_number)} to match the recorded relations.`,
172
+ session_cite.text(
173
+ `📋 Declared ${format_dependency_links(declare)} in epic ${session_cite.issue(epic_number)} to match the recorded relations.`,
174
+ ),
173
175
  )
174
176
  }
175
177
 
@@ -1,3 +1,4 @@
1
+ import { issue_cite } from '#scripts/issue/issue-cite'
1
2
  import type { DependencyLink } from './epic-parse'
2
3
 
3
4
  // How an issue and a dependency between two of them are written down.
@@ -5,7 +6,7 @@ import type { DependencyLink } from './epic-parse'
5
6
  // Both spellings had accumulated a copy per module — the body generator, the graph, the chain model
6
7
  // and the insertion planner each rendered `#N` and `#B -> #M` themselves. They are one-liners, which
7
8
  // is exactly why the copies spread; and a link rendered one way in a message and another way as a
8
- // dedup key is a difference nothing would report (joshuafolkken/kit#890).
9
+ // dedup key is a difference nothing would report.
9
10
 
10
11
  const DEPENDENCY_ARROW = ' -> '
11
12
  // How a list of references is written out. One definition rather than a `join` per caller: the
@@ -14,7 +15,7 @@ const DEPENDENCY_ARROW = ' -> '
14
15
  const REFERENCE_SEPARATOR = ', '
15
16
 
16
17
  function to_issue_reference(issue_number: number): string {
17
- return `#${String(issue_number)}`
18
+ return issue_cite.plain(issue_number)
18
19
  }
19
20
 
20
21
  function format_dependency_link(link: DependencyLink): string {
@@ -27,7 +28,7 @@ function join_references(references: ReadonlyArray<string>): string {
27
28
 
28
29
  // A list of links, in the same form a single one takes. One definition rather than a `map().join()`
29
30
  // per caller: the insertion planner and the relation reporter now print the same list side by side,
30
- // and two spellings of it would read as two different things (joshuafolkken/kit#1080).
31
+ // and two spellings of it would read as two different things.
31
32
  function format_dependency_links(links: ReadonlyArray<DependencyLink>): string {
32
33
  return join_references(links.map((link) => format_dependency_link(link)))
33
34
  }
@@ -37,7 +38,7 @@ function format_issue_references(issue_numbers: ReadonlyArray<number>): string {
37
38
  }
38
39
 
39
40
  // The `blocked-by` relations a positioned `--add` dropped, named the same way wherever they are
40
- // reported — on stdout and inside the `--decision-file` record (joshuafolkken/kit#1711). One string
41
+ // reported — on stdout and inside the `--decision-file` record. One string
41
42
  // rather than two, because the two are read side by side: a reader comparing the console against the
42
43
  // record must not have to decide whether two spellings mean the same thing.
43
44
  //
@@ -1,21 +1,20 @@
1
+ import { session_cite } from '#scripts/issue/session-cite'
1
2
  import { error_text } from '#scripts/lib/error-message'
2
3
  import { epic_graph, type EpicChild, type IssueReference } from './epic-graph'
3
4
  import { epic_parse } from './epic-parse'
4
5
 
5
- // joshuafolkken/kit#1113: a second look at the relations, taken only where the first one is about to
6
- // become a verdict.
6
+ // A second look at the relations, taken only where the first one is about to become a verdict.
7
7
  //
8
8
  // `read_blocked_by` answers from the issue's own `issue_dependencies_summary` when that summary says
9
9
  // zero, which is what keeps a pass over the whole backlog to one request per issue that declares a
10
- // blocker (joshuafolkken/kit#1024). The summary is GitHub's count, and it can disagree with the
11
- // listing it counts: measured on joshuafolkken/kit#1111, whose summary read `total_blocked_by: 0`
12
- // while `dependencies/blocked_by` returned `#1106`, and where re-POSTing that relation was refused
13
- // with `Target issue has already been taken` — so the relation was real and only the counter was
14
- // wrong. `epic:next` read the epic as self-contradictory, printed `declared but not recorded:
15
- // #1106 -> #1111`, and exited 1. An unattended run stops there, on a graph with nothing to fix.
10
+ // blocker. The summary is GitHub's count, and it can disagree with the listing it counts: a summary
11
+ // can read `total_blocked_by: 0` while `dependencies/blocked_by` returns a blocker whose re-POST is
12
+ // refused with `Target issue has already been taken` — the relation is real and only the counter is
13
+ // wrong. Trusting that counter, `epic:next` reads the epic as self-contradictory, prints `declared
14
+ // but not recorded`, and exits 1. An unattended run stops there, on a graph with nothing to fix.
16
15
  //
17
16
  // It corrects nothing else. A relation that is genuinely absent still comes back absent, and the
18
- // mismatch is still reported — the point is that the report is now about the relations rather than
17
+ // mismatch is still reported — the point is that the report is about the relations rather than
19
18
  // about a counter.
20
19
 
21
20
  // A body may legitimately be ahead of its relations — an epic written before `josh` recorded them,
@@ -37,7 +36,7 @@ type BlockersReader = (child: EpicChild) => Promise<Array<IssueReference>>
37
36
  // Restricted to `declared_repo` because a declared link is written as a bare number, which names an
38
37
  // issue in the epic's own repository — `epic_graph` matches those by number alone. An epic tracking
39
38
  // both `#40` and `owner/other#40` would otherwise have the second child re-read on the first one's
40
- // account, and its relations replaced with a different issue's (joshuafolkken/kit#1014).
39
+ // account, and its relations replaced with a different issue's.
41
40
  function suspect_children(
42
41
  children: ReadonlyArray<EpicChild>,
43
42
  body: string | undefined,
@@ -61,7 +60,7 @@ async function reread_child(child: EpicChild, read_blockers: BlockersReader): Pr
61
60
  const reason = error_text.message_of(error)
62
61
 
63
62
  console.warn(
64
- `⚠ could not re-read the blockers of #${String(child.number)}: ${reason}\n` +
63
+ `⚠ could not re-read the blockers of ${session_cite.issue(child.number, undefined, child.repo)}: ${reason}\n` +
65
64
  ' a mismatch reported below may be this read failing rather than a missing relation',
66
65
  )
67
66
 
@@ -1,4 +1,5 @@
1
1
  import { git_gh_command } from '#scripts/gh/git-gh-command'
2
+ import { session_cite } from '#scripts/issue/session-cite'
2
3
  import type { DependencyLink } from './epic-parse'
3
4
  import { format_dependency_links } from './epic-reference'
4
5
 
@@ -7,11 +8,10 @@ import { format_dependency_links } from './epic-reference'
7
8
  // The relation is a nicety, not part of the contract: losing it costs only the native link, while
8
9
  // the Issue and its task list are already correct. A failure is therefore counted and reported
9
10
  // rather than aborting a batch that is otherwise fine. It no longer depends on the gh CLI's version
10
- // — the relation is written through the REST dependencies endpoint (joshuafolkken/kit#1026).
11
+ // — the relation is written through the REST dependencies endpoint.
11
12
  //
12
13
  // Shared by epic creation and `--add` rather than written once per caller: both apply the same
13
- // relations for the same reason, and a second copy would be the place a fix is forgotten
14
- // (joshuafolkken/kit#890).
14
+ // relations for the same reason, and a second copy would be the place a fix is forgotten.
15
15
 
16
16
  type RelationAction = 'record' | 'drop'
17
17
 
@@ -41,10 +41,9 @@ function describe_action(action: RelationAction): string {
41
41
  return action === 'record' ? 'recorded' : 'removed'
42
42
  }
43
43
 
44
- // What happened, and to which pairs. The count used to stand on its own, and a count cannot be
45
- // checked: an insertion that recorded an order nobody declared printed the same
46
- // `1 blocked-by relation(s) recorded.` as a correct one, so the invented chains of
47
- // joshuafolkken/kit#1080 were caught only by whoever thought to open the epic body afterwards. The
44
+ // What happened, and to which pairs. A count on its own cannot be checked: an insertion that
45
+ // recorded an order nobody declared would print the same `1 blocked-by relation(s) recorded.` as a
46
+ // correct one, so an invented chain would be caught only by whoever opened the epic body. The
48
47
  // links are named in the `#blocker -> #blocked` form the declaration itself uses, so the reader
49
48
  // compares like with like.
50
49
  //
@@ -63,7 +62,9 @@ function format_relation_report(input: {
63
62
  if (input.links.length === 0) return `🔗 No blocked-by relation was ${verb}.`
64
63
 
65
64
  if (input.failures === 0) {
66
- return `🔗 ${total} blocked-by relation(s) ${verb}: ${format_dependency_links(input.links)}.`
65
+ return session_cite.text(
66
+ `🔗 ${total} blocked-by relation(s) ${verb}: ${format_dependency_links(input.links)}.`,
67
+ )
67
68
  }
68
69
 
69
70
  return `⚠️ ${String(input.failures)} of ${total} blocked-by relation(s) could not be ${verb}; the epic body is intact.`