@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
@@ -1,20 +1,19 @@
1
+ import { session_cite } from '#scripts/issue/session-cite'
1
2
  import { error_text } from '#scripts/lib/error-message'
2
3
  import { epic_classify, type ResolveDependency } from './epic-classify'
3
4
  import { epic_graph, type EpicChild, type IssueReference } from './epic-graph'
4
5
  import type { BlockersReader } from './epic-relation-recheck'
5
6
  import { epic_report, type EpicVerdict } from './epic-report'
6
7
 
7
- // joshuafolkken/kit#1121: the other direction of joshuafolkken/kit#1113's defect, checked where it
8
- // would otherwise start work.
8
+ // A stale dependency counter, checked where it would otherwise start work.
9
9
  //
10
10
  // `read_blocked_by` answers from the issue's own `issue_dependencies_summary` when that summary says
11
- // zero, so a child whose counter is stale is read as `blocked_by: []`. joshuafolkken/kit#1113
11
+ // zero, so a child whose counter is stale is read as `blocked_by: []`. `epic-relation-recheck.ts`
12
12
  // re-reads such a child only when the epic body *declared* the missing link, which is the direction
13
13
  // that makes `epic:next` exit 1 on a graph with nothing to fix. A relation recorded but never
14
14
  // declared leaves no trace in the body, so nothing marks the child as a suspect — and there the
15
15
  // mistake runs the other way: the child is classified runnable and handed to an unattended run,
16
- // which then implements a deliverable before the thing it needs. That is exactly the ordering
17
- // joshuafolkken/kit#1005 exists to preserve.
16
+ // which then implements a deliverable before the thing it needs.
18
17
  //
19
18
  // So the summary is not trusted for the one child that is about to be offered. The candidate's
20
19
  // relations are read from the listing, and a listing that disagrees replaces that child's
@@ -29,14 +28,14 @@ interface ConfirmContext {
29
28
  resolve: ResolveDependency
30
29
  read_blockers: BlockersReader
31
30
  // The issues this invocation may run, so a re-classified candidate weighs an outside blocker exactly
32
- // as `decide` did (joshuafolkken/kit#1943). Absent, the classifier's own default applies.
31
+ // as `decide` did. Absent, the classifier's own default applies.
33
32
  running?: ReadonlySet<string> | undefined
34
33
  }
35
34
 
36
35
  // The answer for one repository: the children to offer, or the verdict that stands in its place when
37
36
  // every candidate was withheld.
38
37
  //
39
- // A list rather than one child since joshuafolkken/kit#1491: a repository runs as many children at
38
+ // A list rather than one child: a repository runs as many children at
40
39
  // once as it has free lanes, and how many that is comes from the caller as `wanted`. The type says
41
40
  // nothing about lanes or epics — it is a list and a verdict, so the same walk serves one lane, six,
42
41
  // or a caller that has not been written yet.
@@ -123,7 +122,7 @@ async function read_or_withhold(
123
122
  const reason = error_text.message_of(error)
124
123
 
125
124
  console.warn(
126
- `⚠ could not confirm the blockers of #${String(candidate.number)}: ${reason}\n` +
125
+ `⚠ could not confirm the blockers of ${session_cite.issue(candidate.number, undefined, candidate.repo)}: ${reason}\n` +
127
126
  ' it is withheld rather than offered; asking again is what resolves this',
128
127
  )
129
128
 
@@ -137,17 +136,17 @@ function warn_withheld(candidate: EpicChild, listed: ReadonlyArray<IssueReferenc
137
136
  const named = listed.map((blocker) => epic_graph.key_of(blocker)).join(', ')
138
137
 
139
138
  console.warn(
140
- `⚠ #${String(candidate.number)} is withheld: its relations listing names ${named}, ` +
139
+ `⚠ ${session_cite.issue(candidate.number, undefined, candidate.repo)} is withheld: its relations listing names ${named}, ` +
141
140
  'which the dependency summary it was classified from did not count',
142
141
  )
143
142
  }
144
143
 
145
144
  // Relations the listing recovered that this epic does not track as a child.
146
145
  //
147
- // `classify_children` weighs such a blocker since joshuafolkken/kit#1943, so a candidate that is still
146
+ // `classify_children` weighs such a blocker, so a candidate that is still
148
147
  // offered here has only outside blockers the classifier found finished. The relation is still named,
149
148
  // because the run has just paid a request to learn it exists and the graph holds nothing to order it
150
- // against (joshuafolkken/kit#1121).
149
+ // against.
151
150
  function untracked_blockers(
152
151
  listed: ReadonlyArray<IssueReference>,
153
152
  children: ReadonlyArray<EpicChild>,
@@ -161,7 +160,7 @@ function warn_untracked(candidate: EpicChild, untracked: ReadonlyArray<IssueRefe
161
160
  const named = untracked.map((blocker) => epic_graph.key_of(blocker)).join(', ')
162
161
 
163
162
  console.warn(
164
- `⚠ #${String(candidate.number)} is offered although its relations listing names ${named}: ` +
163
+ `⚠ ${session_cite.issue(candidate.number, undefined, candidate.repo)} is offered although its relations listing names ${named}: ` +
165
164
  'this epic does not track those, and every one of them is already finished',
166
165
  )
167
166
  }
@@ -207,14 +206,13 @@ async function confirm_one(
207
206
 
208
207
  // The bundle walked from its head until `wanted` candidates have confirmed, or the bundle runs out.
209
208
  //
210
- // Walking on rather than making the whole repository wait is the recorded decision on
211
- // joshuafolkken/kit#1108: a healthy sibling should not be held for one child whose counter is stale,
209
+ // Walking on rather than making the whole repository wait is deliberate: a healthy sibling should not be held for one child whose counter is stale,
212
210
  // and nobody repairs that counter — so the next poll would put the same child at the head and answer
213
211
  // the same way, and the wait would never clear. The worst case is one request per candidate, and it
214
212
  // happens only when every candidate is withheld, where the epic is broken and stopping is right.
215
213
  //
216
- // **It stops the moment the caller's appetite is met**, so asking for one child costs exactly what
217
- // it cost before joshuafolkken/kit#1491: the walk ends at the first confirmation.
214
+ // **It stops the moment the caller's appetite is met**, so asking for one child costs one walk to
215
+ // the first confirmation.
218
216
  //
219
217
  // Recursive rather than a loop with two exits, because the corrected graph has to be threaded from
220
218
  // one candidate to the next: a second candidate is classified against what the first read
@@ -254,8 +252,7 @@ function withheld_verdict(
254
252
  // The answer for one repository. An empty bundle costs no request and re-derives the verdict the
255
253
  // caller already had, so the path a repository with nothing to offer takes is unchanged.
256
254
  //
257
- // `wanted` defaults to one lane, so a caller written before joshuafolkken/kit#1491 asks for exactly
258
- // what it used to get.
255
+ // `wanted` defaults to one lane.
259
256
  async function answer_for_repo(
260
257
  candidates: ReadonlyArray<EpicChild>,
261
258
  context: ConfirmContext,
@@ -6,8 +6,7 @@ import { DEPENDENCY_ARROW, format_dependency_link, to_issue_reference } from './
6
6
  // `epic:next` reads the declaration as a flat list of links, which is all a comparison against the
7
7
  // native relations requires. An insertion cannot work from that: two disjoint chains and one
8
8
  // branching chain produce the same links, and only the line structure says which chain a target sits
9
- // in. So this module works in chains — one per declared line — and derives the links from them
10
- // (joshuafolkken/kit#890).
9
+ // in. So this module works in chains — one per declared line — and derives the links from them.
11
10
  //
12
11
  // Every relation the caller applies comes from diffing the links before against the links after.
13
12
  // That is what makes `--before` need no special case: inserting `#N` between `#B` and `#M` drops
@@ -104,7 +103,7 @@ function start_chain(additions: ReadonlyArray<number>, position: InsertPosition)
104
103
  // A second declaration alongside the existing ones. Every other chain is copied through untouched,
105
104
  // so nothing that was declared about anything else changes. Two callers reach it: a target that no
106
105
  // chain names yet, and a `--after` whose target already has a successor — a branch rather than a
107
- // splice (joshuafolkken/kit#1080).
106
+ // splice.
108
107
  function add_chain(
109
108
  chains: Chains,
110
109
  additions: ReadonlyArray<number>,
@@ -116,9 +115,9 @@ function add_chain(
116
115
  // No declared chain names the target. Two states look identical from the chains alone, and they are
117
116
  // not the same thing: a child the epic tracks simply has no order yet — legitimate in an epic mixing
118
117
  // ordered and unordered children — and gets the first order anyone declared for it, as a new line.
119
- // A number that is not a child at all is still refused (joshuafolkken/kit#949).
120
- // The only reason left to refuse a position. "Not named in the declared order" used to be it, and is
121
- // now a legitimate state — a child with no order constraint (joshuafolkken/kit#949). The wording
118
+ // A number that is not a child at all is still refused.
119
+ // The only reason left to refuse a position. "Not named in the declared order" is not one — it is a
120
+ // legitimate state, a child with no order constraint. The wording
122
121
  // matches `find_addition_error`'s, which is what the workflow docs tell the operator to expect.
123
122
  function not_a_child_error(target: number): InsertOutcome {
124
123
  return {
@@ -145,7 +144,7 @@ function has_successor(chain: Chain, target: number): boolean {
145
144
 
146
145
  // `--after <M>` where the declaration already names something after `#M`. Splicing there puts the
147
146
  // additions between `#M` and that successor, which records `#N -> #<successor>` — an order nobody
148
- // declared, and the second of joshuafolkken/kit#1080's two paths. What `--after <M>` states is that
147
+ // declared. What `--after <M>` states is that
149
148
  // `#M` must finish first, and a fan-out (`#A -> #B` beside `#A -> #C`) already expresses exactly
150
149
  // that, so the addition becomes a chain line of its own and the existing one is left as it stood.
151
150
  // Appending after the tail is not a branch: with no successor to displace it keeps extending the
@@ -178,8 +177,7 @@ function to_ambiguous_position_error(position: InsertPosition): string {
178
177
  // an ambiguity rather than resolve it: with `#890 -> #891` beside `#892 -> #891`, moving `#892` before
179
178
  // `#891` leaves one chain naming `#891`, and the insertion then splices into a place nobody
180
179
  // identified — recording `#890 -> #892`, an order the caller never asked for, and dropping
181
- // `#890 -> #891`, one they never asked to lose. So the plan asks this of the declaration as it stands
182
- // (joshuafolkken/kit#1701).
180
+ // `#890 -> #891`, one they never asked to lose. So the plan asks this of the declaration as it stands.
183
181
  //
184
182
  // **`before` is the only kind that can do it, and asking it of `after` too refuses the very case this
185
183
  // Issue is about.** A `before` splices its child in *front* of the target, so the child inherits
@@ -237,12 +235,10 @@ function insert_at_position(
237
235
  // No position given: nothing was declared about the additions, so the declaration is copied through
238
236
  // exactly as it stood. An order is recorded only where `--before` / `--after` names one.
239
237
  //
240
- // The additions used to extend the **last declared chain**, and that invented a dependency
241
- // (joshuafolkken/kit#1253). An epic mixing ordered and unordered children is the normal state
242
- // (joshuafolkken/kit#949), so an unrelated child added to one came out blocked by whatever issue
243
- // happened to sit at that chain's tail — and `epic:next` then withheld it as blocked, with neither a
244
- // park nor a `needs-decision` label to show that it was stuck. An epic with no chain at all was
245
- // already left alone, which is the same answer this gives for every epic.
238
+ // Extending the **last declared chain** instead would invent a dependency. An epic mixing ordered
239
+ // and unordered children is the normal state, so an unrelated child added to one would come out
240
+ // blocked by whatever issue happened to sit at that chain's tail — and `epic:next` would withhold it
241
+ // as blocked, with neither a park nor a `needs-decision` label to show that it was stuck.
246
242
  function keep_declaration(chains: Chains): InsertOutcome {
247
243
  return { chains: chains.map((chain) => [...chain]) }
248
244
  }
@@ -292,20 +288,19 @@ function already_declared_error(issue_number: number): string {
292
288
  // Checked on the way in *and* on the way out. The result matters more than the input: a child the
293
289
  // task list has lost but the declaration still names would otherwise be written into a chain a second
294
290
  // time — `--after #892` on `#890 -> #891 -> #892 -> #891` produces a cycle, whose verdict is `error`,
295
- // which halts the very run this command exists to keep going (joshuafolkken/kit#890). The example was
296
- // a no-position add until joshuafolkken/kit#1253 stopped that path touching the declaration at all;
297
- // the guard still matters, because a positioned insert writes into a chain.
291
+ // which halts the very run this command exists to keep going. A no-position add never touches the
292
+ // declaration; the guard matters because a positioned insert writes into a chain.
298
293
  //
299
294
  // The two guards cover different things, and both are needed since `add_chain` can write into a
300
295
  // chain the addition is not in. The in-guard refuses an addition the declaration already names
301
296
  // **anywhere**; the out-guard catches a repeat **within one chain**. The out-guard deliberately does
302
297
  // not scan across chains: one issue named by two of them is a fan-out — `#A -> #B` and `#A -> #C` —
303
- // which is a legitimate declaration, not a duplicate (joshuafolkken/kit#949).
298
+ // which is a legitimate declaration, not a duplicate.
304
299
  // `tracked` is the epic's task list, and it is required rather than defaulted. It separates "this
305
300
  // child has no order yet" from "this number is not a child at all": the first gets a new chain, the
306
301
  // second is refused. A default would make one path refuse everything and the other check nothing, so
307
302
  // the same input would be accepted or refused depending only on whether anything happened to be
308
- // declared yet (joshuafolkken/kit#949).
303
+ // declared yet.
309
304
  // Everything that can refuse the input, before anything is built from it.
310
305
  function find_insertion_error(
311
306
  chains: Chains,
@@ -325,7 +320,7 @@ function find_insertion_error(
325
320
  // A reorder expressed as a removal followed by the ordinary insertion. Splicing the child out of
326
321
  // every chain that names it closes the chain around it — `#A -> #N -> #B` becomes `#A -> #B` — so the
327
322
  // re-insertion goes through `insert_children` unchanged, and the relations to drop still fall out of
328
- // diffing the declaration before against the declaration after (joshuafolkken/kit#1701).
323
+ // diffing the declaration before against the declaration after.
329
324
  //
330
325
  // A chain left with one reference declares nothing and is dropped rather than rendered as a bare
331
326
  // `#N`, which the parser would read as prose. Its remaining child simply has no order any more,
@@ -358,7 +353,7 @@ function split_chain(chain: Chain, dropped: ReadonlySet<string>): Array<Array<nu
358
353
  }
359
354
 
360
355
  // A declared order removed: every chain is cut at each named link, and **the ends are never
361
- // reconnected** (joshuafolkken/kit#1712). `#A -> #B -> #C` minus `#B -> #C` leaves `#A -> #B`, and
356
+ // reconnected**. `#A -> #B -> #C` minus `#B -> #C` leaves `#A -> #B`, and
362
357
  // removing a middle child's two links leaves `#A` and `#C` with no order rather than `#A -> #C`.
363
358
  //
364
359
  // Reconnecting would declare an order nobody stated, which is exactly what the audit shipped beside
@@ -397,7 +392,7 @@ const epic_chains = {
397
392
  links_of,
398
393
  diff_links,
399
394
  find_position_ambiguity,
400
- // Exported since joshuafolkken/kit#1738 so `--order-before` / `--order-after` can pass the
395
+ // Exported so `--order-before` / `--order-after` can pass the
401
396
  // declaration through by the same function `--add` without a position uses. An order-only move is
402
397
  // "leave the declaration exactly as it stood" applied to a call that *does* name a position, so a
403
398
  // second copy of the passthrough would be the clone `CLAUDE.md` prohibits.
@@ -19,14 +19,13 @@ import {
19
19
  // difference is not academic: the moment kit's child closes and app-kit's child is waiting for the
20
20
  // release to publish, there is no runnable child, nothing carries `in-progress` (kit's child is
21
21
  // closed) and nothing carries `needs-decision` (nothing was parked). A label-based reading sees
22
- // "nothing running, nothing parked" and stops — in the one situation where it should wait
23
- // (joshuafolkken/kit#860).
22
+ // "nothing running, nothing parked" and stops — in the one situation where it should wait.
24
23
 
25
24
  // What a caller does with a child: run it, wait for it, or stop and report it.
26
25
  type ChildCategory = 'runnable' | 'time' | 'human' | 'done'
27
26
 
28
27
  // `DependencyVerdict` and `ResolveDependency` live in `epic-outside-blocker.ts`, which weighs a
29
- // blocker no graph tracks with the same resolver (joshuafolkken/kit#1943), and are re-exported below.
28
+ // blocker no graph tracks with the same resolver, and are re-exported below.
30
29
 
31
30
  interface Classification {
32
31
  runnable: ReadonlyArray<EpicChild>
@@ -51,7 +50,7 @@ function has_label(child: EpicChild, label: string): boolean {
51
50
 
52
51
  // The labels that put a child in `human` on their own. `needs-decision` waits for an answer nobody
53
52
  // has given; `already-done` has its answer — the work is merged, and the close that is left is Tier C
54
- // and so a person's (joshuafolkken/kit#1679). Neither is resolved by waiting, which is what separates
53
+ // and so a person's. Neither is resolved by waiting, which is what separates
55
54
  // them from `in-progress` below.
56
55
  const HUMAN_LABELS: ReadonlyArray<string> = [NEEDS_DECISION_LABEL, ALREADY_DONE_LABEL]
57
56
 
@@ -62,12 +61,12 @@ function has_human_label(child: EpicChild): boolean {
62
61
  // What a child is before its dependencies are considered. A parked child is `human` whatever blocks
63
62
  // it, and a child already being worked on is `time` — someone else's session will finish it.
64
63
  //
65
- // **A child that is itself an epic is `human`** (joshuafolkken/kit#1476). An epic is not a unit of
64
+ // **A child that is itself an epic is `human`**. An epic is not a unit of
66
65
  // work, so a run handed one has nothing to implement; before this the row fell straight through to
67
66
  // `from_blockers`, which mints `runnable` for anything unblocked, and `epicrun` passed the epic to
68
67
  // `fullrun` as an ordinary issue. `human` rather than `time` because no amount of waiting turns an
69
68
  // epic into work: a person has to flatten the row or restructure the epics, and meta-epic support is
70
- // frozen (joshuafolkken/kit#894). What the question is — and, just as importantly, what it is not —
69
+ // frozen. What the question is — and, just as importantly, what it is not —
71
70
  // is `epic-nested.ts`, which the audit asks the same way.
72
71
  function local_category(child: EpicChild): ChildCategory | undefined {
73
72
  if (child.state === CLOSED) return 'done'
@@ -99,9 +98,9 @@ interface ClassifyContext {
99
98
  index: ReadonlyMap<string, EpicChild>
100
99
  resolve: ResolveDependency
101
100
  // Keyed by identity — repository plus number — because two children of one epic can share a
102
- // number across repositories (joshuafolkken/kit#864).
101
+ // number across repositories.
103
102
  memo: Map<string, ChildCategory>
104
- // Every issue this invocation may run, keyed like `index` (joshuafolkken/kit#1943). A blocker
103
+ // Every issue this invocation may run, keyed like `index`. A blocker
105
104
  // outside `index` waits when it is in here and goes to a person when it is not.
106
105
  running: ReadonlySet<string>
107
106
  }
@@ -125,9 +124,9 @@ function report_notice(notice: OutsideNotice): void {
125
124
  console.warn(notice.message)
126
125
  }
127
126
 
128
- // A blocker no graph in this invocation tracks. It used to be announced and dropped, which offered a
129
- // child waiting on another epic's open issue as runnable; it is weighed now, and what could not be
130
- // decided is still said out loud (joshuafolkken/kit#1126, joshuafolkken/kit#1943).
127
+ // A blocker no graph in this invocation tracks. It is weighed rather than announced and dropped, which
128
+ // would offer a child waiting on another epic's open issue as runnable; what could not be decided is
129
+ // still said out loud.
131
130
  function outside_category(
132
131
  child: EpicChild,
133
132
  reference: IssueReference,
@@ -147,7 +146,7 @@ function outside_category(
147
146
 
148
147
  // Said out loud because the report cannot say it: a withheld epic prints as a bare `#N` under
149
148
  // "Waiting on a person", which is true of a parked issue and of an epic alike, and the two need
150
- // entirely different things done to them (joshuafolkken/kit#1476).
149
+ // entirely different things done to them.
151
150
  function report_nested_epic(child: EpicChild): void {
152
151
  const line = `epic:${epic_graph.key_of(child)}`
153
152
  if (reported.has(line)) return
@@ -1,20 +1,19 @@
1
1
  import type { ParseArgsOptionsConfig } from 'node:util'
2
2
  import { cli_flags } from '#scripts/lib/cli-flags'
3
3
 
4
- // The argument reading every `josh epic` form shares, on top of `cli_flags` (joshuafolkken/kit#3261).
4
+ // The argument reading every `josh epic` form shares, on top of `cli_flags`.
5
5
  //
6
- // They were private to `epic-cli.ts` until `--remove` needed the same readers (joshuafolkken/kit#1712),
6
+ // They were private to `epic-cli.ts` until `--remove` needed the same readers,
7
7
  // at which point the choice was to copy them or to name them. Copying is what `CLAUDE.md` prohibits,
8
8
  // and the failure it would produce is specific: two readers disagreeing about what counts as a flag
9
9
  // value would have one form silently take a `--decision-file` path for an issue number.
10
10
  //
11
11
  // **Each form names its own flags, and the read is strict.** Which flags consume the argument after
12
12
  // them is per form: `--before` takes a value only under `--add`, and treating it as one everywhere had
13
- // `josh epic "T" 101 102 --after 103` silently drop #103 (joshuafolkken/kit#890). A flag the form does
13
+ // `josh epic "T" 101 102 --after 103` silently drop #103. A flag the form does
14
14
  // not know refuses the invocation — a mistyped flag would otherwise leave its value positional, so it
15
15
  // becomes an issue number and the edit silently lands somewhere else.
16
16
 
17
- const ISSUE_NUMBER_PATTERN = /^[1-9]\d*$/u
18
17
  // Every value flag is read as a list so a repeat is visible rather than resolved to one of the two:
19
18
  // two `--decision-file` paths name two records, and two `--before` targets name two places.
20
19
  const VALUE_OPTION = { type: 'string', multiple: true } as const
@@ -88,7 +87,7 @@ function is_switch_set(parsed: EpicArgv, flag: string): boolean {
88
87
  // A value-taking flag given without a usable value, or given twice. **Refused rather than read as "none
89
88
  // was asked for"** — `--decision-file` is passed precisely because the record has to exist, so a shell
90
89
  // that ate the path would otherwise land the edit, write no record, post no comment and exit 0: success
91
- // reported for half the job. Repeated, it names two records (joshuafolkken/kit#1350).
90
+ // reported for half the job. Repeated, it names two records.
92
91
  function is_value_unusable(argv: ReadonlyArray<string>, flag: string): boolean {
93
92
  return (
94
93
  cli_flags.given_values(argv, flag).length > SINGLE || cli_flags.is_value_unusable(argv, flag)
@@ -104,5 +103,5 @@ const epic_cli_argv = {
104
103
  is_value_unusable,
105
104
  }
106
105
 
107
- export { epic_cli_argv, ISSUE_NUMBER_PATTERN }
106
+ export { epic_cli_argv }
108
107
  export type { EpicArgv, FormFlags }
@@ -1,6 +1,7 @@
1
- import { epic_cli_argv, ISSUE_NUMBER_PATTERN, type EpicArgv, type FormFlags } from './epic-cli-argv'
1
+ import { issue_number_shape } from '#scripts/issue/issue-number-shape'
2
+ import { epic_cli_argv, type EpicArgv, type FormFlags } from './epic-cli-argv'
2
3
 
3
- // `josh epic --remove <E> <M> <N> …`'s argument rules (joshuafolkken/kit#1712).
4
+ // `josh epic --remove <E> <M> <N> …`'s argument rules.
4
5
  //
5
6
  // Its own module rather than a fourth parser inside `epic-cli.ts`, which sits at its line ceiling —
6
7
  // and because the rules read as one thing: the arguments after the epic are a **path**, which is the
@@ -30,14 +31,18 @@ function is_removal(argv: ReadonlyArray<string>): boolean {
30
31
  // repeat would silently delete a different set of orders than the one typed, and skipping an
31
32
  // unparsable argument would shift every pair after it.
32
33
  function to_path_numbers(raw_path: ReadonlyArray<string>): Array<number> | undefined {
33
- if (raw_path.some((raw) => !ISSUE_NUMBER_PATTERN.test(raw))) return undefined
34
+ if (raw_path.some((raw) => !issue_number_shape.is_issue_number(raw))) return undefined
34
35
 
35
36
  return raw_path.length < MINIMUM_PATH_LENGTH ? undefined : raw_path.map(Number)
36
37
  }
37
38
 
38
39
  function read_subject(parsed: EpicArgv): { epic_number: number; path: Array<number> } | undefined {
39
40
  const [raw_epic, ...raw_path] = parsed.positionals
40
- if (raw_epic === undefined || !ISSUE_NUMBER_PATTERN.test(raw_epic)) return undefined
41
+
42
+ if (raw_epic === undefined || !issue_number_shape.ISSUE_NUMBER_PATTERN.test(raw_epic)) {
43
+ return undefined
44
+ }
45
+
41
46
  const path = to_path_numbers(raw_path)
42
47
 
43
48
  return path === undefined ? undefined : { epic_number: Number(raw_epic), path }
@@ -1,6 +1,8 @@
1
+ import { issue_number_shape } from '#scripts/issue/issue-number-shape'
2
+ import { session_cite } from '#scripts/issue/session-cite'
1
3
  import { cli_body } from '#scripts/josh/cli-body'
2
4
  import type { InsertKind, InsertPosition } from './epic-chains'
3
- import { epic_cli_argv, ISSUE_NUMBER_PATTERN, type EpicArgv, type FormFlags } from './epic-cli-argv'
5
+ import { epic_cli_argv, type EpicArgv, type FormFlags } from './epic-cli-argv'
4
6
  import { epic_cli_remove } from './epic-cli-remove'
5
7
  import { epic_parse, type ExternalChild } from './epic-parse'
6
8
 
@@ -12,20 +14,20 @@ const RATIONALE_FLAG = '--rationale-file'
12
14
  const ORIGIN_FLAG = '--origin'
13
15
  const PROMOTE_FLAG = '--promote'
14
16
  const ADD_FLAG = '--add'
15
- // `--reconcile <E>`: bring the epic's declaration and its recorded relations back into agreement
16
- // (joshuafolkken/kit#2235). It takes no value flags — the epic number is the whole subject.
17
+ // `--reconcile <E>`: bring the epic's declaration and its recorded relations back into agreement.
18
+ // It takes no value flags — the epic number is the whole subject.
17
19
  const RECONCILE_FLAG = '--reconcile'
18
20
  const BEFORE_FLAG = '--before'
19
21
  const AFTER_FLAG = '--after'
20
22
  // The same two places with the declaration withheld: move the task-list row and write neither the
21
- // dependency declaration nor the `blocked-by` relation (joshuafolkken/kit#1738). They exist because
23
+ // dependency declaration nor the `blocked-by` relation. They exist because
22
24
  // `epic:next` offers children in task-list order, so "no dependency, but run this one first" had no
23
25
  // spelling at all — only a false dependency, or a row nobody would reach.
24
26
  const ORDER_BEFORE_FLAG = '--order-before'
25
27
  const ORDER_AFTER_FLAG = '--order-after'
26
28
  // The decision record for an insertion, read the same way `--rationale-file` is read for a creation:
27
29
  // from a file, or from stdin as `-`. The text is a judgement, so the caller writes it; what the command
28
- // contributes is placing it in the epic's `## Decisions` and on each child (joshuafolkken/kit#1350).
30
+ // contributes is placing it in the epic's `## Decisions` and on each child.
29
31
  const DECISION_FLAG = '--decision-file'
30
32
  // Which flags each form knows, and which of them consume the argument after them — per form, for the
31
33
  // reason `epic-cli-argv.ts` gives.
@@ -53,7 +55,7 @@ interface CreateArguments {
53
55
  }
54
56
 
55
57
  // `--promote <N> <N1> <N2> …`: the issue to promote, then its children. No title — the issue already
56
- // has one, and the discussion in it is usually the split rationale (joshuafolkken/kit#865).
58
+ // has one, and the discussion in it is usually the split rationale.
57
59
  interface PromoteArguments {
58
60
  epic_number: number
59
61
  children: Array<number>
@@ -66,7 +68,7 @@ interface PromoteArguments {
66
68
  // `--ordered` would ask GitHub to make an issue block itself.
67
69
  function to_child_numbers(raw_children: ReadonlyArray<string>): Array<number> {
68
70
  const numbers = raw_children
69
- .filter((raw) => ISSUE_NUMBER_PATTERN.test(raw))
71
+ .filter((raw) => issue_number_shape.is_issue_number(raw))
70
72
  .map(Number)
71
73
  .filter((value) => Number.isSafeInteger(value))
72
74
 
@@ -120,7 +122,10 @@ interface ReconcileArguments {
120
122
  // and no position — the repair reads what the epic already records rather than being told an order.
121
123
  function parse_reconcile_arguments(argv: ReadonlyArray<string>): ReconcileArguments | undefined {
122
124
  const [raw_epic] = positionals_of(argv, RECONCILE_FORM)
123
- if (raw_epic === undefined || !ISSUE_NUMBER_PATTERN.test(raw_epic)) return undefined
125
+
126
+ if (raw_epic === undefined || !issue_number_shape.ISSUE_NUMBER_PATTERN.test(raw_epic)) {
127
+ return undefined
128
+ }
124
129
 
125
130
  return { epic_number: Number(raw_epic) }
126
131
  }
@@ -130,7 +135,11 @@ function parse_reconcile_arguments(argv: ReadonlyArray<string>): ReconcileArgume
130
135
  // have it block itself under `--ordered`.
131
136
  function to_promote_arguments(parsed: EpicArgv): PromoteArguments | undefined {
132
137
  const [raw_epic, ...raw_children] = parsed.positionals
133
- if (raw_epic === undefined || !ISSUE_NUMBER_PATTERN.test(raw_epic)) return undefined
138
+
139
+ if (raw_epic === undefined || !issue_number_shape.ISSUE_NUMBER_PATTERN.test(raw_epic)) {
140
+ return undefined
141
+ }
142
+
134
143
  const epic_number = Number(raw_epic)
135
144
  const children = to_child_numbers(raw_children).filter((child) => child !== epic_number)
136
145
  if (children.length === 0) return undefined
@@ -146,13 +155,13 @@ function parse_promote_arguments(argv: ReadonlyArray<string>): PromoteArguments
146
155
 
147
156
  // `--add <E> <N...> [--before <M> | --after <M> | --order-before <M> | --order-after <M>]`: the epic
148
157
  // to insert into, then the children. The epic comes first for the same reason it does under
149
- // `--promote`, so the children stay a bare list of numbers (joshuafolkken/kit#890).
158
+ // `--promote`, so the children stay a bare list of numbers.
150
159
  interface AddArguments {
151
160
  epic_number: number
152
161
  children: Array<number>
153
162
  position?: InsertPosition | undefined
154
163
  // `--order-before` / `--order-after` rather than `--before` / `--after`: the row moves and nothing
155
- // else is written (joshuafolkken/kit#1738).
164
+ // else is written.
156
165
  is_order_only?: boolean | undefined
157
166
  decision_path?: string | undefined
158
167
  }
@@ -165,7 +174,7 @@ function is_addition(argv: ReadonlyArray<string>): boolean {
165
174
  // The outcome of reading a positioning flag: the position, nothing, or a refusal. One shape for all
166
175
  // three so the caller branches on a field rather than on a value's type. `is_order_only` rides on the
167
176
  // same value because one flag decides both halves — where the row goes, and whether a dependency is
168
- // written behind it (joshuafolkken/kit#1738).
177
+ // written behind it.
169
178
  interface PositionOutcome {
170
179
  position?: InsertPosition
171
180
  is_order_only?: boolean
@@ -176,7 +185,7 @@ const NO_POSITION: PositionOutcome = { is_refused: false }
176
185
  const REFUSED_POSITION: PositionOutcome = { is_refused: true }
177
186
 
178
187
  // The four positioning flags as one table: the place each one names, and whether a dependency is
179
- // written behind the row it moves. **One table rather than two branches** (joshuafolkken/kit#1738) —
188
+ // written behind the row it moves. **One table rather than two branches** —
180
189
  // `--order-before` asks the same placement question `--before` does, so a second parsing path could
181
190
  // come to disagree with this one about what a repeated flag or a non-numeric target means.
182
191
  interface PositionFlag {
@@ -224,7 +233,7 @@ function parse_position(parsed: EpicArgv): PositionOutcome {
224
233
  const has_flag = count_position_flags(parsed) > 0
225
234
  const target = read_position_target(parsed)
226
235
  if (target === undefined) return has_flag ? REFUSED_POSITION : NO_POSITION
227
- if (!ISSUE_NUMBER_PATTERN.test(target.raw)) return REFUSED_POSITION
236
+ if (!issue_number_shape.ISSUE_NUMBER_PATTERN.test(target.raw)) return REFUSED_POSITION
228
237
 
229
238
  return {
230
239
  position: { kind: target.kind, target: Number(target.raw) },
@@ -245,7 +254,11 @@ function read_add_subject(
245
254
  parsed: EpicArgv,
246
255
  ): { epic_number: number; children: Array<number> } | undefined {
247
256
  const [raw_epic, ...raw_children] = parsed.positionals
248
- if (raw_epic === undefined || !ISSUE_NUMBER_PATTERN.test(raw_epic)) return undefined
257
+
258
+ if (raw_epic === undefined || !issue_number_shape.ISSUE_NUMBER_PATTERN.test(raw_epic)) {
259
+ return undefined
260
+ }
261
+
249
262
  const epic_number = Number(raw_epic)
250
263
  const children = to_child_numbers(raw_children).filter((child) => child !== epic_number)
251
264
 
@@ -267,7 +280,7 @@ function to_add_arguments(parsed: EpicArgv): AddArguments | undefined {
267
280
  }
268
281
 
269
282
  // An unknown flag is refused by the strict read: a mistyped positioning flag would otherwise leave its
270
- // value positional, so it becomes a child and the edit lands somewhere else (joshuafolkken/kit#890).
283
+ // value positional, so it becomes a child and the edit lands somewhere else.
271
284
  function parse_add_arguments(argv: ReadonlyArray<string>): AddArguments | undefined {
272
285
  const parsed = is_decision_path_unusable(argv) ? undefined : read_form(argv, ADD_FORM)
273
286
 
@@ -277,7 +290,7 @@ function parse_add_arguments(argv: ReadonlyArray<string>): AddArguments | undefi
277
290
  // The one refusal `--add` has to explain rather than merely report. `into owner/repo#N` is a legal
278
291
  // thing for a person to type, and this command cannot serve it: it reads and edits issues in the
279
292
  // repository it is run from. Falling through to the usage line would read as "that form does not
280
- // exist" when what it means is "run it in the other checkout" (joshuafolkken/kit#985).
293
+ // exist" when what it means is "run it in the other checkout".
281
294
  interface CrossRepoAddTarget {
282
295
  epic: ExternalChild
283
296
  local: AddArguments
@@ -307,7 +320,7 @@ function find_cross_repo_add_target(argv: ReadonlyArray<string>): CrossRepoAddTa
307
320
  function format_add_arguments(local: AddArguments): string {
308
321
  const { position } = local
309
322
  // The order-only prefix rides along, since it is what decides whether the other checkout writes a
310
- // dependency — a suggestion that dropped it would be a different instruction (joshuafolkken/kit#1738).
323
+ // dependency — a suggestion that dropped it would be a different instruction.
311
324
  const prefix = local.is_order_only === true ? '--order-' : '--'
312
325
  const suffix =
313
326
  position === undefined ? '' : ` ${prefix}${position.kind} ${String(position.target)}`
@@ -315,7 +328,7 @@ function format_add_arguments(local: AddArguments): string {
315
328
  return `${[local.epic_number, ...local.children].map(String).join(' ')}${suffix}`
316
329
  }
317
330
 
318
- // **`--decision-file` is named rather than relayed** (joshuafolkken/kit#1350). The suggestion is a
331
+ // **`--decision-file` is named rather than relayed**. The suggestion is a
319
332
  // command to run in a *different* checkout, and the path was resolved against this one: a relative path
320
333
  // does not exist there, `-` cannot be re-read from a consumed stdin, and an unquoted path with a space
321
334
  // would break the line the person copies. So the flag is asked for again instead of pasted in wrong.
@@ -329,8 +342,8 @@ function format_decision_note(local: AddArguments): Array<string> {
329
342
 
330
343
  // A fully-qualified reference to *this* repository is the same instruction spelled longer, not a
331
344
  // cross-repository one — and `into owner/repo#N` is exactly how the suffix is documented, so a run
332
- // inside that repository would otherwise be refused and told to go to the checkout it is already in
333
- // (joshuafolkken/kit#985). An unreadable current repository resolves to a refusal rather than to a
345
+ // inside that repository would otherwise be refused and told to go to the checkout it is already in.
346
+ // An unreadable current repository resolves to a refusal rather than to a
334
347
  // write: refusing costs one command, and guessing wrong writes into the wrong epic.
335
348
  function resolve_local_add(
336
349
  found: CrossRepoAddTarget,
@@ -342,7 +355,7 @@ function resolve_local_add(
342
355
  // What to type instead. `josh doctor` prints the checkout for each repository, which is the part a
343
356
  // run cannot guess.
344
357
  function format_cross_repo_refusal(found: CrossRepoAddTarget): string {
345
- const reference = `${found.epic.repo}#${String(found.epic.number)}`
358
+ const reference = session_cite.issue(found.epic.number, undefined, found.epic.repo)
346
359
 
347
360
  return [
348
361
  `✖ ${reference} is an epic in another repository; this command reads and writes issues in the repository it runs from.`,
@@ -353,14 +366,14 @@ function format_cross_repo_refusal(found: CrossRepoAddTarget): string {
353
366
 
354
367
  function parse_check_argument(argv: ReadonlyArray<string>): number | undefined {
355
368
  const [raw] = positionals_of(argv, CHECK_FORM)
356
- if (raw === undefined || !ISSUE_NUMBER_PATTERN.test(raw)) return undefined
369
+ if (raw === undefined || !issue_number_shape.ISSUE_NUMBER_PATTERN.test(raw)) return undefined
357
370
 
358
371
  return Number(raw)
359
372
  }
360
373
 
361
374
  // `-` reads stdin, matching `gh issue create --body-file -`. The reader is `cli_body`'s, shared with
362
375
  // `josh notify --body-file` and `josh followup --notify-message-file` rather than copied per entry
363
- // point (joshuafolkken/kit#1198), so the stdin form cannot come to mean one thing here and something
376
+ // point, so the stdin form cannot come to mean one thing here and something
364
377
  // else there.
365
378
  const { read_file_or_stdin } = cli_body
366
379
 
@@ -371,8 +384,7 @@ function read_rationale(rationale_path: string | undefined): string {
371
384
  }
372
385
 
373
386
  // `undefined` rather than `''` for an omitted path: an insertion that records no decision is the
374
- // ordinary case, and an empty string is a record that says nothing — which `epic --add` refuses
375
- // (joshuafolkken/kit#1350).
387
+ // ordinary case, and an empty string is a record that says nothing — which `epic --add` refuses.
376
388
  function read_decision(decision_path: string | undefined): string | undefined {
377
389
  return decision_path === undefined ? undefined : read_file_or_stdin(decision_path)
378
390
  }