@joshuafolkken/kit 1.1229.0 → 1.1370.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (939) hide show
  1. package/.claude/agents/investigator.md +1 -0
  2. package/.claude/settings.json +4 -0
  3. package/.claude/skills/dependency-update/SKILL.md +5 -3
  4. package/.claude/skills/epic-commands/SKILL.md +82 -113
  5. package/.claude/skills/epic-commands/epic-bundle.md +38 -63
  6. package/.claude/skills/epic-commands/execution-waves.md +30 -51
  7. package/.claude/skills/verify-ui/SKILL.md +13 -20
  8. package/.claude/skills/workflow-commands/SKILL.md +10 -10
  9. package/.claude/skills/workflow-commands/background-commands.md +4 -4
  10. package/.claude/skills/workflow-commands/backlogrun-child.md +30 -105
  11. package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +29 -0
  12. package/.claude/skills/workflow-commands/backlogrun-lanes.md +45 -131
  13. package/.claude/skills/workflow-commands/backlogrun-park.md +36 -53
  14. package/.claude/skills/workflow-commands/backlogrun-progress.md +81 -331
  15. package/.claude/skills/workflow-commands/backlogrun-recovery.md +29 -83
  16. package/.claude/skills/workflow-commands/backlogrun-steps.md +105 -424
  17. package/.claude/skills/workflow-commands/backlogrun.md +50 -61
  18. package/.claude/skills/workflow-commands/chain-rule.md +36 -40
  19. package/.claude/skills/workflow-commands/entry-sequence.md +6 -6
  20. package/.claude/skills/workflow-commands/followup.md +24 -20
  21. package/.claude/skills/workflow-commands/fullrun-steps.md +23 -27
  22. package/.claude/skills/workflow-commands/fullrun.md +10 -10
  23. package/.claude/skills/workflow-commands/halfrun.md +9 -8
  24. package/.claude/skills/workflow-commands/into-target.md +12 -18
  25. package/.claude/skills/workflow-commands/issue-comments.md +11 -26
  26. package/.claude/skills/workflow-commands/kickoff.md +27 -16
  27. package/.claude/skills/workflow-commands/latest-gate.md +18 -29
  28. package/.claude/skills/workflow-commands/needs-human-review.md +13 -24
  29. package/.claude/skills/workflow-commands/observation-filing.md +37 -28
  30. package/.claude/skills/workflow-commands/observation-ledger.md +48 -38
  31. package/.claude/skills/workflow-commands/pre-gate-cut.md +9 -9
  32. package/.claude/skills/workflow-commands/prerequisite.md +23 -15
  33. package/.claude/skills/workflow-commands/progress-watcher.md +17 -11
  34. package/.claude/skills/workflow-commands/prrun.md +3 -3
  35. package/.claude/skills/workflow-commands/retrospective.md +13 -18
  36. package/.claude/skills/workflow-commands/split-assessment.md +6 -4
  37. package/.claude/skills/workflow-commands/target-repository.md +25 -28
  38. package/.claude/skills/workflow-commands/working-tree-hold.md +11 -17
  39. package/.gitattributes +2 -1
  40. package/.github/workflows/ci.yml +14 -0
  41. package/.github/workflows/publish.yml +2 -0
  42. package/.vscode/tasks.json +14 -0
  43. package/CLAUDE.md +10 -61
  44. package/README.md +38 -57
  45. package/SECURITY.md +1 -1
  46. package/dist/CLAUDE.md +10 -61
  47. package/dist/commands/document-section-cli.js +42 -10
  48. package/dist/config-merge/index.js +11 -2
  49. package/dist/hooks/audit-provision.js +2 -2
  50. package/dist/hooks/batch-guard.js +7 -7
  51. package/dist/hooks/{chunk-FIVDHQGT.js → chunk-43G45XJF.js} +18 -20
  52. package/dist/hooks/{chunk-JUDKDCDP.js → chunk-4TW4MQUL.js} +284 -362
  53. package/dist/hooks/{chunk-5VMKCCC4.js → chunk-76RK6E3H.js} +13 -11
  54. package/dist/hooks/{chunk-RNWHN5BP.js → chunk-DZWZ3DKY.js} +4 -4
  55. package/dist/hooks/{chunk-5VNDSNG3.js → chunk-FZ6FUSBM.js} +1 -1
  56. package/dist/hooks/{chunk-VC3PZPZO.js → chunk-GG72ANKI.js} +1 -1
  57. package/dist/hooks/{chunk-6HJJXRBX.js → chunk-KPM4YIIX.js} +8 -44
  58. package/dist/hooks/chunk-MXVQMLDP.js +3705 -0
  59. package/dist/hooks/{chunk-ELCN5LCH.js → chunk-NEC4AT4Z.js} +34 -12
  60. package/dist/hooks/{chunk-TQNPDZNH.js → chunk-NZBHG6FW.js} +7 -5
  61. package/dist/hooks/chunk-NZN2UFI6.js +2409 -0
  62. package/dist/hooks/{chunk-F56MFS4B.js → chunk-R6CRQEAL.js} +4 -4
  63. package/dist/hooks/chunk-SYSRHRWU.js +1589 -0
  64. package/dist/hooks/{chunk-55HHG5PX.js → chunk-TLJYAGZK.js} +799 -903
  65. package/dist/hooks/chunk-Z5TMJIPW.js +45 -0
  66. package/dist/hooks/codex-hook-adapter.js +26 -21
  67. package/dist/hooks/duplicate-read-guard.js +8 -8
  68. package/dist/hooks/format-edited.js +4 -4
  69. package/dist/hooks/inputs.json +213 -197
  70. package/dist/hooks/investigation-guard.js +8 -8
  71. package/dist/hooks/pretool-guard.js +15 -15
  72. package/dist/hooks/session-lang.js +406 -8
  73. package/dist/hooks/stop-guard.js +122 -201
  74. package/dist/josh.js +540 -137
  75. package/dist/version/index.js +15 -13
  76. package/eslint/base.js +43 -5
  77. package/eslint/rules/english-only-prose.js +3 -3
  78. package/eslint/rules/import.js +12 -0
  79. package/eslint/rules/namespace-object-export.js +2 -2
  80. package/package.json +16 -10
  81. package/pnpm-workspace.yaml +2 -4
  82. package/prompts/coding-standards.md +14 -48
  83. package/prompts/collaboration-workflow/file-edits.md +1 -1
  84. package/prompts/collaboration-workflow/issue-citation.md +1 -1
  85. package/prompts/collaboration-workflow/issue-template.md +4 -10
  86. package/prompts/collaboration-workflow/operating-rules.md +7 -8
  87. package/prompts/collaboration-workflow/output-bounds.md +1 -1
  88. package/prompts/collaboration-workflow/overview.md +1 -1
  89. package/prompts/collaboration-workflow/plan-comment.md +2 -1
  90. package/prompts/collaboration-workflow/principles.md +21 -3
  91. package/prompts/collaboration-workflow/report-format.md +16 -29
  92. package/prompts/collaboration-workflow/residency.md +1 -1
  93. package/prompts/collaboration-workflow/rule-delivery.md +7 -95
  94. package/prompts/collaboration-workflow/shell-body.md +3 -23
  95. package/prompts/collaboration-workflow/turn-batching.md +4 -13
  96. package/prompts/collaboration-workflow/wip-cap.md +5 -11
  97. package/prompts/refactoring.md +1 -1
  98. package/prompts/review-rubric.md +3 -22
  99. package/prompts/review.md +15 -38
  100. package/prompts/testing-guide.md +2 -4
  101. package/scripts/adopt/adopt-logic.ts +5 -5
  102. package/scripts/adopt/adopt-toolkits.ts +4 -5
  103. package/scripts/adopt/adopt.ts +2 -3
  104. package/scripts/agent/agent-argv.ts +7 -7
  105. package/scripts/agent/agent-diagnostics.ts +2 -2
  106. package/scripts/agent/agent-exit-record.ts +1 -1
  107. package/scripts/agent/agent-headless.ts +1 -1
  108. package/scripts/agent/agent-launch-environment.ts +6 -1
  109. package/scripts/agent/agent-role-profile.ts +49 -22
  110. package/scripts/agent/agent-session-role.ts +32 -0
  111. package/scripts/agent/api-outage.ts +1 -1
  112. package/scripts/agent/claude-agent-argv.ts +4 -4
  113. package/scripts/agent/claude-result-event.ts +4 -4
  114. package/scripts/agent/codex-hooks.ts +2 -2
  115. package/scripts/agent/interactive-ask.ts +3 -6
  116. package/scripts/auto-ok/auto-ok-cli.ts +46 -60
  117. package/scripts/backlog/backlog-arrival-added.ts +34 -0
  118. package/scripts/backlog/backlog-arrival.ts +54 -17
  119. package/scripts/backlog/backlog-budget-cli.ts +34 -6
  120. package/scripts/backlog/backlog-budget.ts +17 -24
  121. package/scripts/backlog/backlog-defect-priority.ts +1 -1
  122. package/scripts/backlog/backlog-drive-args.ts +5 -4
  123. package/scripts/backlog/backlog-drive-cli.ts +14 -10
  124. package/scripts/backlog/backlog-drive-epic.ts +85 -0
  125. package/scripts/backlog/backlog-drive-launch.ts +1 -1
  126. package/scripts/backlog/backlog-drive-named-offer.ts +60 -9
  127. package/scripts/backlog/backlog-drive-named.ts +39 -9
  128. package/scripts/backlog/backlog-drive-offer-argv.ts +1 -1
  129. package/scripts/backlog/backlog-drive-restore.ts +1 -1
  130. package/scripts/backlog/backlog-drive-retrospective.ts +2 -2
  131. package/scripts/backlog/backlog-drive.ts +43 -28
  132. package/scripts/backlog/backlog-idle.ts +88 -0
  133. package/scripts/backlog/backlog-named.ts +11 -15
  134. package/scripts/backlog/backlog-next.ts +26 -30
  135. package/scripts/backlog/backlog-offer-cli.ts +28 -23
  136. package/scripts/backlog/backlog-offer.ts +7 -7
  137. package/scripts/backlog/backlog-overlap.ts +178 -0
  138. package/scripts/backlog/backlog-plan-cli.ts +14 -90
  139. package/scripts/backlog/backlog-plan-read.ts +111 -0
  140. package/scripts/backlog/backlog-plan.ts +11 -10
  141. package/scripts/backlog/backlog-pool.ts +13 -14
  142. package/scripts/backlog/backlog-rank.ts +11 -11
  143. package/scripts/backlog/backlog-ready.ts +15 -10
  144. package/scripts/backlog/backlog-scope.ts +14 -15
  145. package/scripts/backlog/backlog-stalled-cli.ts +2 -2
  146. package/scripts/backlog/backlog-stalled-detect.ts +4 -4
  147. package/scripts/backlog/backlog-stalled.ts +5 -6
  148. package/scripts/backlog/backlog-waves.ts +4 -4
  149. package/scripts/backlog/backlogrun-args.ts +74 -0
  150. package/scripts/backlog/backlogrun-cli.ts +113 -0
  151. package/scripts/backlog/backlogrun-launch.ts +178 -0
  152. package/scripts/behavior/behavior-assertion.ts +6 -8
  153. package/scripts/behavior/behavior-cli.ts +1 -1
  154. package/scripts/behavior/behavior-rules.ts +3 -3
  155. package/scripts/build/build-claude-md.ts +4 -4
  156. package/scripts/build/build-codex-hooks.ts +2 -2
  157. package/scripts/build/build-commands.ts +1 -1
  158. package/scripts/build/build-hooks.ts +5 -5
  159. package/scripts/build/build.ts +1 -1
  160. package/scripts/build/hook-bundle-stamp.ts +109 -7
  161. package/scripts/build/local-bin.ts +2 -2
  162. package/scripts/cases/cases-cli.ts +1 -1
  163. package/scripts/cases/cases-logic.ts +2 -2
  164. package/scripts/ci/composite-actions.ts +1 -2
  165. package/scripts/ci/pr-classification.ts +2 -2
  166. package/scripts/claude/workflow-destination.ts +1 -1
  167. package/scripts/clone/clone-aggregate.ts +1 -1
  168. package/scripts/clone/clone-fingerprint.ts +1 -1
  169. package/scripts/clone/clone-scan-cli.ts +1 -1
  170. package/scripts/clone/clone-scan.ts +1 -1
  171. package/scripts/config-merge/index.ts +1 -1
  172. package/scripts/config-merge/json-format.ts +1 -3
  173. package/scripts/config-merge/patch-json-array.ts +90 -0
  174. package/scripts/config-merge/patch-json-key.ts +6 -3
  175. package/scripts/config-merge/patch-json-list.ts +1 -1
  176. package/scripts/cost-runtime/codex-usage.ts +1 -1
  177. package/scripts/cost-runtime/context-cut-payback.ts +4 -5
  178. package/scripts/cost-runtime/context-cut-threshold.ts +4 -6
  179. package/scripts/cost-runtime/cost-attribute.ts +3 -3
  180. package/scripts/cost-runtime/cost-blocks.ts +3 -4
  181. package/scripts/cost-runtime/cost-cli.ts +14 -11
  182. package/scripts/cost-runtime/cost-corpus.ts +11 -11
  183. package/scripts/cost-runtime/cost-pricing.ts +4 -4
  184. package/scripts/cost-runtime/cost-tokens.ts +1 -2
  185. package/scripts/cost-runtime/cost-transcript.ts +29 -29
  186. package/scripts/cost-runtime/cost-usage.ts +6 -7
  187. package/scripts/cost-runtime/cost-verdict.ts +10 -11
  188. package/scripts/cost-runtime/own-session.ts +1 -1
  189. package/scripts/cost-runtime/transcript-cwd.ts +2 -2
  190. package/scripts/delegation/delegation-cli.ts +4 -4
  191. package/scripts/delegation/delegation-policy.ts +13 -15
  192. package/scripts/delegation/duplicate-read-guard.ts +9 -10
  193. package/scripts/delegation/fanout-cli.ts +1 -1
  194. package/scripts/delegation/fanout.ts +1 -1
  195. package/scripts/delegation/investigation-guard.ts +18 -22
  196. package/scripts/delegation/investigation-reads.ts +48 -238
  197. package/scripts/discovery/repo-discovery.ts +1 -1
  198. package/scripts/discovery/repo-map-logic.ts +1 -2
  199. package/scripts/discovery/repo-origin.ts +3 -3
  200. package/scripts/discovery/repo-party-cli.ts +2 -2
  201. package/scripts/discovery/repo-party.ts +2 -2
  202. package/scripts/doctor/doctor-consumer.ts +1 -1
  203. package/scripts/doctor/doctor-io.ts +6 -7
  204. package/scripts/doctor/doctor-logic.ts +1 -1
  205. package/scripts/doctor/doctor-ports.ts +1 -1
  206. package/scripts/doctor/doctor.ts +8 -9
  207. package/scripts/document/backlogrun-parent-read-set.ts +5 -6
  208. package/scripts/document/bash-output-cap.ts +5 -7
  209. package/scripts/document/capped-print-part.ts +1 -1
  210. package/scripts/document/capped-print.ts +1 -1
  211. package/scripts/document/document-byte-budget.ts +33 -64
  212. package/scripts/document/document-byte-check.ts +4 -4
  213. package/scripts/document/document-reachability.ts +7 -8
  214. package/scripts/document/document-read-cli.ts +2 -2
  215. package/scripts/document/document-scan.ts +26 -2
  216. package/scripts/document/document-section-cli.ts +6 -8
  217. package/scripts/document/document-section.ts +8 -12
  218. package/scripts/document/edit-files-cli.ts +3 -4
  219. package/scripts/document/entry-read-budget.ts +8 -70
  220. package/scripts/document/entry-read-set.ts +51 -34
  221. package/scripts/document/lane-child-read-set.ts +9 -9
  222. package/scripts/document/read-files-cli.ts +1 -2
  223. package/scripts/document/read-set-cli.ts +16 -19
  224. package/scripts/document/read-set-cost.ts +4 -4
  225. package/scripts/document/read-set-point-of-use.ts +28 -38
  226. package/scripts/document/read-set-pricing.ts +1 -1
  227. package/scripts/document/read-set-trim.ts +3 -3
  228. package/scripts/document/resident-budget.ts +8 -10
  229. package/scripts/epic/epic-add-body.ts +15 -18
  230. package/scripts/epic/epic-add-plan.ts +26 -28
  231. package/scripts/epic/epic-add.ts +32 -25
  232. package/scripts/epic/epic-audit-checks.ts +27 -37
  233. package/scripts/epic/epic-audit-cli.ts +21 -22
  234. package/scripts/epic/epic-audit-orphans.ts +16 -17
  235. package/scripts/epic/epic-audit-rationale.ts +10 -15
  236. package/scripts/epic/epic-audit-report.ts +2 -5
  237. package/scripts/epic/epic-audit.ts +18 -14
  238. package/scripts/epic/epic-body.ts +10 -10
  239. package/scripts/epic/epic-bundle-cli.ts +36 -34
  240. package/scripts/epic/epic-bundle-evidence.ts +5 -5
  241. package/scripts/epic/epic-bundle-gaps.ts +6 -9
  242. package/scripts/epic/epic-bundle-poll.ts +1 -1
  243. package/scripts/epic/epic-bundle-referenced.ts +11 -14
  244. package/scripts/epic/epic-bundle.ts +19 -20
  245. package/scripts/epic/epic-busy.ts +44 -21
  246. package/scripts/epic/epic-candidate-confirm.ts +15 -18
  247. package/scripts/epic/epic-chains.ts +18 -23
  248. package/scripts/epic/epic-classify.ts +11 -12
  249. package/scripts/epic/epic-cli-argv.ts +5 -6
  250. package/scripts/epic/epic-cli-remove.ts +9 -4
  251. package/scripts/epic/epic-cli.ts +38 -26
  252. package/scripts/epic/epic-close-comment.ts +14 -15
  253. package/scripts/epic/epic-close.ts +25 -29
  254. package/scripts/epic/epic-cross-repo.ts +18 -21
  255. package/scripts/epic/epic-decision.ts +14 -18
  256. package/scripts/epic/epic-fetch.ts +25 -31
  257. package/scripts/epic/epic-graph.ts +15 -17
  258. package/scripts/epic/epic-index.ts +14 -16
  259. package/scripts/epic/epic-issue.ts +9 -11
  260. package/scripts/epic/epic-label-age.ts +74 -0
  261. package/scripts/epic/epic-lane-offer.ts +35 -24
  262. package/scripts/epic/epic-nested.ts +1 -1
  263. package/scripts/epic/epic-next-read.ts +8 -8
  264. package/scripts/epic/epic-next-views.ts +12 -12
  265. package/scripts/epic/epic-next.ts +29 -33
  266. package/scripts/epic/epic-outside-blocker.ts +11 -10
  267. package/scripts/epic/epic-parse.ts +22 -24
  268. package/scripts/epic/epic-promote.ts +3 -2
  269. package/scripts/epic/epic-rank.ts +1 -1
  270. package/scripts/epic/epic-read.ts +10 -8
  271. package/scripts/epic/epic-reconcile.ts +8 -6
  272. package/scripts/epic/epic-reference.ts +5 -4
  273. package/scripts/epic/epic-relation-recheck.ts +10 -11
  274. package/scripts/epic/epic-relations.ts +9 -8
  275. package/scripts/epic/epic-remove-plan.ts +4 -5
  276. package/scripts/epic/epic-remove.ts +7 -5
  277. package/scripts/epic/epic-report.ts +18 -20
  278. package/scripts/epic/epic-run.ts +6 -5
  279. package/scripts/epic/epic-sections.ts +2 -2
  280. package/scripts/epic/epic-shape.ts +3 -3
  281. package/scripts/epic/epic-solo-stale.ts +3 -2
  282. package/scripts/epic/epic-solo.ts +8 -8
  283. package/scripts/epic/epic-triage.ts +5 -4
  284. package/scripts/epic/epic-validate.ts +8 -7
  285. package/scripts/epic/epic.ts +5 -5
  286. package/scripts/exports/unused-members-cli.ts +1 -1
  287. package/scripts/followup/followup-issue-number.ts +1 -2
  288. package/scripts/followup/git-followup-cleanup.ts +6 -7
  289. package/scripts/followup/git-followup-finish.ts +11 -13
  290. package/scripts/followup/git-followup-flush.ts +11 -7
  291. package/scripts/followup/git-followup-issue-close.ts +16 -13
  292. package/scripts/followup/git-followup-label.ts +9 -6
  293. package/scripts/followup/git-followup-merged.ts +1 -1
  294. package/scripts/followup/git-followup-pending.ts +7 -9
  295. package/scripts/followup/git-followup-stages.ts +28 -17
  296. package/scripts/followup/git-followup-workflow.ts +19 -21
  297. package/scripts/followup/git-pr-followup-checks.ts +13 -20
  298. package/scripts/followup/git-pr-followup-wrapup.ts +7 -7
  299. package/scripts/followup/git-pr-followup.ts +18 -17
  300. package/scripts/gate/core-admission.ts +162 -0
  301. package/scripts/gate/core-budget.ts +134 -91
  302. package/scripts/gate/gate-ledger.ts +114 -0
  303. package/scripts/gate/gate-log.ts +7 -9
  304. package/scripts/gate/gate-plan.ts +103 -35
  305. package/scripts/gate/gate-report.ts +39 -21
  306. package/scripts/gate/gate-skip.ts +11 -13
  307. package/scripts/gate/gate-steps.ts +5 -1
  308. package/scripts/gate/gate-tree.ts +3 -4
  309. package/scripts/gate/hook-gate-reuse.ts +9 -9
  310. package/scripts/gate/machine-capacity.ts +313 -0
  311. package/scripts/gate/pre-commit-type-check.ts +4 -4
  312. package/scripts/gate/project-checks.ts +12 -4
  313. package/scripts/gate/scoped-green.ts +11 -18
  314. package/scripts/gate/type-check-command.ts +2 -2
  315. package/scripts/gate/type-check-step.ts +4 -4
  316. package/scripts/gate/verification-gate.ts +60 -53
  317. package/scripts/gh/gh-spawn.ts +2 -2
  318. package/scripts/gh/git-ai-review-scan.ts +3 -2
  319. package/scripts/gh/git-gh-api-path.ts +10 -11
  320. package/scripts/gh/git-gh-exec.ts +43 -48
  321. package/scripts/gh/git-gh-failure.ts +6 -9
  322. package/scripts/gh/git-gh-helpers.ts +1 -1
  323. package/scripts/gh/git-gh-issue-list.ts +15 -19
  324. package/scripts/gh/git-gh-issue-read.ts +43 -60
  325. package/scripts/gh/git-gh-issue-rest.ts +14 -15
  326. package/scripts/gh/git-gh-issue-write.ts +52 -40
  327. package/scripts/gh/git-gh-issue.ts +23 -24
  328. package/scripts/gh/git-gh-pr-auto-merge.ts +3 -3
  329. package/scripts/gh/git-gh-pr-read.ts +46 -50
  330. package/scripts/gh/git-gh-pr-rest.ts +23 -26
  331. package/scripts/gh/git-gh-pr-review.ts +2 -2
  332. package/scripts/gh/git-gh-pr-rollup.ts +4 -4
  333. package/scripts/gh/git-gh-pr-snapshot.ts +8 -10
  334. package/scripts/gh/git-gh-pr.ts +16 -16
  335. package/scripts/gh/git-gh-reachability.ts +11 -12
  336. package/scripts/gh/git-gh-repo.ts +2 -3
  337. package/scripts/gh/git-gh-rest-state.ts +1 -1
  338. package/scripts/gh/git-pr-ai-review.ts +6 -5
  339. package/scripts/gh/git-pr-checks-eval.ts +28 -30
  340. package/scripts/gh/git-pr-checks-parse.ts +14 -16
  341. package/scripts/gh/git-pr-checks-watch.ts +17 -17
  342. package/scripts/gh/git-pr-checks.ts +20 -23
  343. package/scripts/gh/git-pr-coderabbit.ts +8 -6
  344. package/scripts/gh/git-pr-confirmation.ts +5 -5
  345. package/scripts/gh/git-pr-managed-config.ts +7 -9
  346. package/scripts/gh/git-pr-messages.ts +1 -1
  347. package/scripts/gh/git-pr.ts +15 -16
  348. package/scripts/gh/github-issue-url.ts +8 -9
  349. package/scripts/git/base-tree.ts +66 -0
  350. package/scripts/git/change-base.ts +42 -2
  351. package/scripts/git/changed-file-scope.ts +5 -5
  352. package/scripts/git/changed-paths.ts +1 -2
  353. package/scripts/git/constants.ts +2 -2
  354. package/scripts/git/git-branch.ts +1 -1
  355. package/scripts/git/git-closes-keyword.ts +3 -3
  356. package/scripts/git/git-command.ts +53 -41
  357. package/scripts/git/git-common-directory.ts +3 -3
  358. package/scripts/git/git-diff-reads.ts +14 -15
  359. package/scripts/git/git-error.ts +1 -1
  360. package/scripts/git/git-execa-error.ts +1 -2
  361. package/scripts/git/git-issue.ts +10 -8
  362. package/scripts/git/git-location-environment.ts +3 -4
  363. package/scripts/git/git-ls-remote.ts +6 -8
  364. package/scripts/git/git-pre-push-hook.ts +11 -10
  365. package/scripts/git/git-preflight.ts +5 -5
  366. package/scripts/git/git-push-transport.ts +2 -2
  367. package/scripts/git/git-remote-branch.ts +1 -2
  368. package/scripts/git/git-schemas.ts +16 -23
  369. package/scripts/git/git-spawn-sync.ts +1 -1
  370. package/scripts/git/git-spawn.ts +37 -14
  371. package/scripts/git/git-ssh-keepalive.ts +12 -5
  372. package/scripts/git/git-staging.ts +7 -8
  373. package/scripts/git/git-workflow.ts +1 -1
  374. package/scripts/git/git-worktree.ts +35 -27
  375. package/scripts/git/gone-branch.ts +2 -2
  376. package/scripts/git/listing-cutoff.ts +1 -2
  377. package/scripts/git/lockfile-sync.ts +65 -0
  378. package/scripts/git/main-merge-guard.ts +1 -2
  379. package/scripts/git/main-merge.ts +7 -7
  380. package/scripts/git/main-sync.ts +23 -8
  381. package/scripts/git/parse-json-array.ts +18 -23
  382. package/scripts/git/repository-lock.ts +34 -2
  383. package/scripts/git/stash/git-stash.ts +4 -5
  384. package/scripts/git/stash/stash-orphans.ts +5 -3
  385. package/scripts/git/stash/stash-pop-args.ts +1 -1
  386. package/scripts/git/stash/stash-pop-cli.ts +3 -3
  387. package/scripts/git/stash/stash-sweep-lock.ts +2 -2
  388. package/scripts/hooks/batch-guard.ts +11 -13
  389. package/scripts/hooks/check-commit-message.ts +12 -9
  390. package/scripts/hooks/codex-hook-adapter.ts +16 -10
  391. package/scripts/hooks/edited-cspell.ts +3 -4
  392. package/scripts/hooks/format-edited-cli.ts +1 -1
  393. package/scripts/hooks/format-edited-file.ts +11 -17
  394. package/scripts/hooks/format-rewrite-notice.ts +19 -17
  395. package/scripts/hooks/pre-push-unit.ts +10 -14
  396. package/scripts/hooks/pretool-guard-cli.ts +4 -4
  397. package/scripts/hooks/pretool-guard.ts +93 -18
  398. package/scripts/hooks/reserved-run.ts +2 -2
  399. package/scripts/hooks/step-zero-notice.ts +1 -1
  400. package/scripts/hooks/stop-guard.ts +21 -10
  401. package/scripts/init/basic-path-migration.ts +2 -2
  402. package/scripts/init/claude-kit-only-settings.ts +2 -2
  403. package/scripts/init/claude-plugin-config.ts +2 -2
  404. package/scripts/init/distributed-paths.ts +4 -4
  405. package/scripts/init/hook-command-rewrite.ts +3 -3
  406. package/scripts/init/hook-launch.ts +5 -5
  407. package/scripts/init/init-actions.ts +13 -0
  408. package/scripts/init/init-ai-copy.ts +11 -11
  409. package/scripts/init/init-bootstrap.ts +3 -3
  410. package/scripts/init/init-copy-content.ts +4 -4
  411. package/scripts/init/init-logic-json-merge.ts +7 -9
  412. package/scripts/init/init-logic-migrate.ts +1 -1
  413. package/scripts/init/init-logic-templates.ts +1 -1
  414. package/scripts/init/init-logic-workspace.ts +4 -4
  415. package/scripts/init/init-logic-yaml-merge.ts +2 -2
  416. package/scripts/init/init-logic.ts +19 -22
  417. package/scripts/init/init.ts +12 -8
  418. package/scripts/init/kit-base-preset.ts +1 -1
  419. package/scripts/init/kit-setup-state.ts +1 -1
  420. package/scripts/init/kit-written-paths.ts +1 -2
  421. package/scripts/init/package-manager-pin.ts +35 -0
  422. package/scripts/init/project-profile-cli.ts +1 -1
  423. package/scripts/init/project-profile.ts +3 -3
  424. package/scripts/init/session-language-environment.ts +1 -1
  425. package/scripts/init/start-exec.ts +3 -4
  426. package/scripts/init/start-plan.ts +2 -2
  427. package/scripts/init/start-setup-pr.ts +3 -2
  428. package/scripts/init/start-steps.ts +2 -2
  429. package/scripts/init/tsconfig-preset-migration.ts +1 -1
  430. package/scripts/init/vscode-tasks.ts +62 -0
  431. package/scripts/issue/baseline-measure.ts +2 -2
  432. package/scripts/issue/behavior-change-lint.ts +2 -2
  433. package/scripts/issue/defect-rate-cli.ts +6 -7
  434. package/scripts/issue/defect-rate.ts +37 -27
  435. package/scripts/issue/git-next-issues.ts +9 -8
  436. package/scripts/issue/issue-auto-ok.ts +49 -11
  437. package/scripts/issue/issue-backlinks-cli.ts +5 -5
  438. package/scripts/issue/issue-backlinks.ts +6 -6
  439. package/scripts/issue/issue-cite-cli.ts +20 -18
  440. package/scripts/issue/issue-cite.ts +18 -8
  441. package/scripts/issue/issue-closing-pr.ts +4 -4
  442. package/scripts/issue/issue-comment-cli.ts +6 -4
  443. package/scripts/issue/issue-file-cli.ts +75 -15
  444. package/scripts/issue/issue-file-fold.ts +155 -0
  445. package/scripts/issue/issue-file.ts +14 -6
  446. package/scripts/issue/issue-fold-cli.ts +14 -9
  447. package/scripts/issue/issue-fold.ts +23 -8
  448. package/scripts/issue/issue-labels.ts +46 -37
  449. package/scripts/issue/issue-lint-cli.ts +2 -2
  450. package/scripts/issue/issue-lint.ts +1 -1
  451. package/scripts/issue/issue-merged.ts +10 -4
  452. package/scripts/issue/issue-number-shape.ts +27 -0
  453. package/scripts/issue/issue-rank.ts +1 -1
  454. package/scripts/issue/issue-read-cli.ts +4 -5
  455. package/scripts/issue/issue-read.ts +4 -5
  456. package/scripts/issue/issue-reference.ts +5 -5
  457. package/scripts/issue/issue-release-cli.ts +165 -0
  458. package/scripts/issue/issue-release.ts +58 -0
  459. package/scripts/issue/issue-report-failures.ts +7 -4
  460. package/scripts/issue/issue-scout-cli.ts +11 -11
  461. package/scripts/issue/issue-scout-closed.ts +4 -4
  462. package/scripts/issue/issue-scout.ts +4 -5
  463. package/scripts/issue/issue-state-cli.ts +17 -10
  464. package/scripts/issue/issue-state.ts +12 -13
  465. package/scripts/issue/issue-wip.ts +7 -7
  466. package/scripts/issue/markdown-section.ts +3 -3
  467. package/scripts/issue/measure-rerun-cli.ts +10 -9
  468. package/scripts/issue/reproduction-measure.ts +3 -3
  469. package/scripts/issue/session-cite.ts +56 -0
  470. package/scripts/josh/agent-session-environment.ts +10 -8
  471. package/scripts/josh/cli-body.ts +2 -2
  472. package/scripts/josh/command-suggest.ts +1 -1
  473. package/scripts/josh/file-map-stamp.ts +20 -23
  474. package/scripts/josh/hook-decision.ts +24 -28
  475. package/scripts/josh/josh-command-map.ts +4 -1
  476. package/scripts/josh/josh-command-types.ts +32 -34
  477. package/scripts/josh/josh-commands-ai.ts +6 -6
  478. package/scripts/josh/josh-commands-backlog.ts +15 -3
  479. package/scripts/josh/josh-commands-clone.ts +1 -1
  480. package/scripts/josh/josh-commands-development.ts +33 -4
  481. package/scripts/josh/josh-commands-document.ts +3 -3
  482. package/scripts/josh/josh-commands-guard.ts +3 -3
  483. package/scripts/josh/josh-commands-issue.ts +11 -5
  484. package/scripts/josh/josh-commands-lane.ts +16 -5
  485. package/scripts/josh/josh-commands-lint.ts +1 -1
  486. package/scripts/josh/josh-commands-maintenance.ts +2 -2
  487. package/scripts/josh/josh-commands-run.ts +20 -6
  488. package/scripts/josh/josh-commands-split.ts +1 -2
  489. package/scripts/josh/josh-commands-versioning.ts +5 -5
  490. package/scripts/josh/josh-commands-workflow.ts +30 -22
  491. package/scripts/josh/josh-environment-file.ts +1 -1
  492. package/scripts/josh/josh-in-process.ts +3 -3
  493. package/scripts/josh/josh-logic.ts +10 -10
  494. package/scripts/josh/josh-run.ts +3 -3
  495. package/scripts/josh/josh-verdict.ts +9 -12
  496. package/scripts/josh/josh.ts +3 -3
  497. package/scripts/josh/kit-only.ts +2 -2
  498. package/scripts/josh/path-decision.ts +3 -3
  499. package/scripts/josh/platform-temporary.ts +7 -5
  500. package/scripts/josh/process-identity.ts +24 -6
  501. package/scripts/josh/process-owner.ts +4 -4
  502. package/scripts/josh/session-language-cli.ts +53 -11
  503. package/scripts/josh/session-language.ts +1 -1
  504. package/scripts/josh/stamp-file.ts +48 -29
  505. package/scripts/josh/stamp-record.ts +57 -0
  506. package/scripts/lane/lane-await.ts +35 -11
  507. package/scripts/lane/lane-cache.ts +6 -6
  508. package/scripts/lane/lane-capacity.ts +32 -17
  509. package/scripts/lane/lane-child-invocation.ts +17 -15
  510. package/scripts/lane/lane-child-marker.ts +12 -12
  511. package/scripts/lane/lane-cli.ts +20 -13
  512. package/scripts/lane/lane-close.ts +6 -6
  513. package/scripts/lane/lane-dispatch.ts +61 -72
  514. package/scripts/lane/lane-environment.ts +5 -5
  515. package/scripts/lane/lane-guard-policy.ts +7 -21
  516. package/scripts/lane/lane-handoff.ts +2 -2
  517. package/scripts/lane/lane-install.ts +9 -10
  518. package/scripts/lane/lane-launch-cli.ts +13 -8
  519. package/scripts/lane/lane-ledger.ts +73 -11
  520. package/scripts/lane/lane-leftover.ts +44 -30
  521. package/scripts/lane/lane-limit-cli.ts +160 -0
  522. package/scripts/lane/lane-limit-override.ts +74 -0
  523. package/scripts/lane/lane-load.ts +19 -68
  524. package/scripts/lane/lane-measure-cli.ts +15 -25
  525. package/scripts/lane/lane-occupancy.ts +6 -4
  526. package/scripts/lane/lane-open.ts +25 -24
  527. package/scripts/lane/lane-output.ts +4 -3
  528. package/scripts/lane/lane-paths.ts +22 -8
  529. package/scripts/lane/lane-phase.ts +33 -0
  530. package/scripts/lane/lane-reap.ts +2 -2
  531. package/scripts/lane/lane-registry.ts +27 -15
  532. package/scripts/lane/lane-relaunch.ts +9 -9
  533. package/scripts/lane/lane-report.ts +5 -4
  534. package/scripts/lane/lane-resume.ts +2 -2
  535. package/scripts/lane/lane-sampler.ts +55 -0
  536. package/scripts/lane/lane-seed.ts +7 -7
  537. package/scripts/lane/lane-stage-stats.ts +135 -0
  538. package/scripts/lane/lane-start-point.ts +8 -11
  539. package/scripts/lane/lane-stats.ts +60 -15
  540. package/scripts/lane/lane-stray.ts +140 -0
  541. package/scripts/lane/lane-vacant.ts +1 -1
  542. package/scripts/lane/openai-lane-supervisor-decision.ts +3 -7
  543. package/scripts/lane/openai-lane-supervisor-owner.ts +3 -9
  544. package/scripts/lane/openai-review-broker.ts +2 -4
  545. package/scripts/lib/ancestor-directories.ts +1 -1
  546. package/scripts/lib/bounded-pool.ts +2 -2
  547. package/scripts/lib/buffered-process.ts +4 -6
  548. package/scripts/lib/caddy-logs.sh +0 -0
  549. package/scripts/lib/cli-flags.ts +39 -6
  550. package/scripts/lib/error-message.ts +1 -1
  551. package/scripts/lib/json-value.ts +17 -3
  552. package/scripts/lib/poll.ts +1 -1
  553. package/scripts/lib/status-icons.ts +3 -3
  554. package/scripts/lib/timed-fetch.ts +1 -1
  555. package/scripts/lib/timeouts.ts +1 -1
  556. package/scripts/lines/bytes-command.ts +3 -4
  557. package/scripts/lines/effective-limit.ts +25 -12
  558. package/scripts/lines/line-budget.ts +47 -55
  559. package/scripts/lines/line-targets.ts +6 -2
  560. package/scripts/lines/lines-command.ts +3 -3
  561. package/scripts/lint/cspell-cached.ts +1 -1
  562. package/scripts/lint/cycle-recheck.ts +122 -0
  563. package/scripts/lint/format.ts +1 -2
  564. package/scripts/lint/lint-parallel.ts +34 -19
  565. package/scripts/lint/lint-related-scope.ts +25 -15
  566. package/scripts/lint/lint-related.ts +6 -7
  567. package/scripts/managed-marker/index.ts +1 -1
  568. package/scripts/managed-marker/managed-marker-logic.ts +1 -2
  569. package/scripts/notify/git-notify.ts +9 -7
  570. package/scripts/notify/telegram-notify.ts +53 -37
  571. package/scripts/notify/telegram-test-logic.ts +3 -3
  572. package/scripts/notify/telegram-test.ts +45 -30
  573. package/scripts/observations/observation-ledger-home.ts +14 -8
  574. package/scripts/observations/observation-ledger-line.ts +3 -2
  575. package/scripts/observations/observation-ledger-migrate.ts +3 -4
  576. package/scripts/observations/observation-ledger-prepare.ts +4 -4
  577. package/scripts/observations/observation-ledger.ts +14 -15
  578. package/scripts/observations/observation-record-cli.ts +83 -0
  579. package/scripts/observations/observation-record.ts +91 -0
  580. package/scripts/observations/observations-flush-cli.ts +1 -1
  581. package/scripts/observations/observations-flush-landing.ts +7 -6
  582. package/scripts/observations/observations-flush.ts +26 -27
  583. package/scripts/overrides/overrides-check.ts +18 -8
  584. package/scripts/package/package-scout-cli.ts +1 -1
  585. package/scripts/package/package-scout-format.ts +2 -2
  586. package/scripts/package/package-scout.ts +1 -1
  587. package/scripts/propagate/propagate-git-failure.ts +1 -1
  588. package/scripts/propagate/propagate-git.ts +7 -7
  589. package/scripts/propagate/propagate-plan.ts +2 -2
  590. package/scripts/propagate/propagate-publish.ts +2 -3
  591. package/scripts/propagate/propagate-run.ts +5 -7
  592. package/scripts/propagate/propagate-select.ts +1 -1
  593. package/scripts/propagate/propagate-steps.ts +19 -20
  594. package/scripts/propagate/propagate-targets.ts +6 -10
  595. package/scripts/propagate/propagate.ts +5 -5
  596. package/scripts/refactor/import-graph.ts +1 -1
  597. package/scripts/refactor/refactor-lint.ts +4 -10
  598. package/scripts/refactor/refactor-scan-cli.ts +1 -1
  599. package/scripts/refactor/refactor-scan.ts +2 -2
  600. package/scripts/refactor/refactor-targets.ts +1 -1
  601. package/scripts/release/github-release-cli.ts +25 -3
  602. package/scripts/release/github-release-environment.ts +1 -0
  603. package/scripts/release/github-release-runs.ts +115 -0
  604. package/scripts/release/github-release.ts +13 -67
  605. package/scripts/release/release-cli.ts +21 -4
  606. package/scripts/release/release-history.ts +6 -10
  607. package/scripts/release/release-plan.ts +3 -3
  608. package/scripts/release/release-progress.ts +3 -4
  609. package/scripts/release/release-publish.ts +8 -9
  610. package/scripts/release/release-scope-cli.ts +8 -10
  611. package/scripts/release/release-tag.ts +6 -8
  612. package/scripts/release/release-worktree.ts +5 -5
  613. package/scripts/repo/auto-merge-setting-logic.ts +7 -9
  614. package/scripts/repo/auto-merge-setting.ts +1 -1
  615. package/scripts/repo/repo-setting.ts +4 -4
  616. package/scripts/repo/repository-labels.ts +1 -1
  617. package/scripts/repo/required-checks-logic.ts +3 -3
  618. package/scripts/repo/required-checks-report.ts +1 -1
  619. package/scripts/repo/ruleset-check-cli.ts +1 -1
  620. package/scripts/repo/ruleset-check.ts +1 -1
  621. package/scripts/report/report-format-reference.ts +26 -0
  622. package/scripts/report/report-lint-cli.ts +2 -2
  623. package/scripts/report/report-lint.ts +16 -2
  624. package/scripts/review/disposition-cli.ts +2 -2
  625. package/scripts/review/disposition-logic.ts +1 -1
  626. package/scripts/review/live-evidence.ts +9 -6
  627. package/scripts/review/review-attest-cli.ts +1 -2
  628. package/scripts/review/review-attest.ts +3 -3
  629. package/scripts/review/review-brief-cli.ts +19 -20
  630. package/scripts/review/review-brief.ts +29 -32
  631. package/scripts/review/review-checkout.ts +2 -2
  632. package/scripts/review/review-diff-parts.ts +3 -5
  633. package/scripts/review/review-diff-write.ts +1 -1
  634. package/scripts/review/review-finding-ledger.ts +7 -4
  635. package/scripts/review/review-findings-cli.ts +2 -2
  636. package/scripts/review/review-level.ts +4 -7
  637. package/scripts/review/review-record-cli.ts +73 -16
  638. package/scripts/review/review-record.ts +5 -4
  639. package/scripts/review/review-round2-cli.ts +2 -3
  640. package/scripts/review/review-round2.ts +13 -21
  641. package/scripts/review/review-stamps.ts +9 -71
  642. package/scripts/review/review-tree.ts +4 -5
  643. package/scripts/rules/bash-triggers.ts +4 -4
  644. package/scripts/rules/decision-oracle-batch.ts +5 -6
  645. package/scripts/rules/decision-oracle-stage.ts +1 -1
  646. package/scripts/rules/decision-oracle-tokens.ts +1 -2
  647. package/scripts/rules/decision-oracle.ts +2 -2
  648. package/scripts/rules/delivered-rules.ts +61 -406
  649. package/scripts/rules/destructive-command.ts +2 -2
  650. package/scripts/rules/direct-filing.ts +4 -4
  651. package/scripts/rules/direct-pr-create.ts +2 -2
  652. package/scripts/rules/early-heartbeat.ts +15 -19
  653. package/scripts/rules/file-body.ts +5 -6
  654. package/scripts/rules/filing-cap.ts +6 -7
  655. package/scripts/rules/filing-offer.ts +1 -1
  656. package/scripts/rules/firing-point.ts +6 -6
  657. package/scripts/rules/gh-api.ts +2 -2
  658. package/scripts/rules/git-argv.ts +3 -3
  659. package/scripts/rules/git-force.ts +2 -2
  660. package/scripts/rules/hook-context-line.ts +31 -0
  661. package/scripts/rules/implementation-cut-verdict.ts +5 -8
  662. package/scripts/rules/implementation-cut.ts +35 -32
  663. package/scripts/rules/index-guard.ts +2 -2
  664. package/scripts/rules/issue-citation.ts +7 -7
  665. package/scripts/rules/issue-comments.ts +21 -13
  666. package/scripts/rules/josh-git-bare.ts +2 -2
  667. package/scripts/rules/lane-background.ts +14 -16
  668. package/scripts/rules/lane-carry-conflict.ts +41 -5
  669. package/scripts/rules/lane-interactive-ask.ts +6 -9
  670. package/scripts/rules/lane-park.ts +12 -16
  671. package/scripts/rules/lane-split-park.ts +1 -2
  672. package/scripts/rules/lane-switch-main.ts +10 -13
  673. package/scripts/rules/last-prompt.ts +1 -1
  674. package/scripts/rules/oracle-consulted.ts +5 -5
  675. package/scripts/rules/oracle-firing.ts +6 -9
  676. package/scripts/rules/oracle-list-cli.ts +2 -2
  677. package/scripts/rules/permission-guards.ts +2 -2
  678. package/scripts/rules/piped-verification.ts +79 -9
  679. package/scripts/rules/poll-loop.ts +9 -11
  680. package/scripts/rules/pre-gate-cut.ts +33 -30
  681. package/scripts/rules/prior-comment-read.ts +3 -3
  682. package/scripts/rules/protected-files.ts +25 -13
  683. package/scripts/rules/raw-field-body.ts +3 -4
  684. package/scripts/rules/reply-language.ts +1 -1
  685. package/scripts/rules/rule-body-guard.ts +10 -12
  686. package/scripts/rules/rule-guard.ts +1 -1
  687. package/scripts/rules/rule-list.ts +51 -0
  688. package/scripts/rules/rule-registry-rows.ts +282 -0
  689. package/scripts/rules/rule-registry.ts +109 -0
  690. package/scripts/rules/rule-value-cache.ts +2 -2
  691. package/scripts/rules/rule-value-cli.ts +6 -4
  692. package/scripts/rules/rule-value.ts +61 -22
  693. package/scripts/rules/run-tail-rule.ts +11 -15
  694. package/scripts/rules/shell-body-trigger.ts +7 -7
  695. package/scripts/rules/shell-segments.ts +2 -4
  696. package/scripts/rules/stop-rules.ts +54 -41
  697. package/scripts/rules/tail-commands.ts +1 -1
  698. package/scripts/rules/test-declared-commit.ts +2 -2
  699. package/scripts/rules/third-party-write.ts +3 -3
  700. package/scripts/rules/worktree-guard.ts +12 -5
  701. package/scripts/run/add/run-add-cli.ts +165 -0
  702. package/scripts/run/add/run-add.ts +124 -0
  703. package/scripts/run/board/run-board-cli.ts +207 -0
  704. package/scripts/run/board/run-board-closed.ts +95 -0
  705. package/scripts/run/board/run-board-every.ts +60 -0
  706. package/scripts/run/board/run-board-fetch.ts +38 -0
  707. package/scripts/run/board/run-board-fit.ts +219 -0
  708. package/scripts/run/board/run-board-github.ts +162 -0
  709. package/scripts/run/board/run-board-header.ts +275 -0
  710. package/scripts/run/board/run-board-kind.ts +35 -0
  711. package/scripts/run/board/run-board-labels.ts +299 -0
  712. package/scripts/run/board/run-board-layout.ts +222 -0
  713. package/scripts/run/board/run-board-link.ts +31 -0
  714. package/scripts/run/board/run-board-machine.ts +198 -0
  715. package/scripts/run/board/run-board-notes.ts +103 -0
  716. package/scripts/run/board/run-board-phase.ts +136 -0
  717. package/scripts/run/board/run-board-plan.ts +129 -0
  718. package/scripts/run/board/run-board-read.ts +62 -0
  719. package/scripts/run/board/run-board-render-legend.ts +82 -0
  720. package/scripts/run/board/run-board-render-notes.ts +77 -0
  721. package/scripts/run/board/run-board-render-slot.ts +50 -0
  722. package/scripts/run/board/run-board-render.ts +407 -0
  723. package/scripts/run/board/run-board-scope.ts +17 -0
  724. package/scripts/run/board/run-board-screen.ts +43 -0
  725. package/scripts/run/board/run-board-span.ts +66 -0
  726. package/scripts/run/board/run-board-spin.ts +115 -0
  727. package/scripts/run/board/run-board-state.ts +113 -0
  728. package/scripts/run/board/run-board-status.ts +279 -0
  729. package/scripts/run/board/run-board-tick.ts +210 -0
  730. package/scripts/run/board/run-board-track.ts +22 -0
  731. package/scripts/run/board/run-board-usage-read.ts +255 -0
  732. package/scripts/run/board/run-board-usage-rusage.ts +124 -0
  733. package/scripts/run/board/run-board-usage-text.ts +80 -0
  734. package/scripts/run/board/run-board-usage.ts +165 -0
  735. package/scripts/run/carry/run-carry-added.ts +62 -0
  736. package/scripts/run/carry/run-carry-args.ts +25 -22
  737. package/scripts/run/carry/run-carry-change.ts +1 -1
  738. package/scripts/run/carry/run-carry-cli.ts +71 -48
  739. package/scripts/run/carry/run-carry-conversation.ts +6 -7
  740. package/scripts/run/carry/run-carry-ended.ts +85 -0
  741. package/scripts/run/carry/run-carry-reclaim.ts +1 -1
  742. package/scripts/run/carry/run-carry-stash.ts +3 -2
  743. package/scripts/run/carry/run-carry-streak.ts +8 -10
  744. package/scripts/run/carry/run-carry.ts +85 -89
  745. package/scripts/run/cut/run-cut-args.ts +7 -7
  746. package/scripts/run/cut/run-cut-cli.ts +68 -37
  747. package/scripts/run/cut/run-cut-handoff.ts +15 -15
  748. package/scripts/run/cut/run-cut-report.ts +37 -16
  749. package/scripts/run/cut/run-cut.ts +63 -77
  750. package/scripts/run/detached-launch.ts +35 -50
  751. package/scripts/run/entry/run-entry-cli.ts +48 -27
  752. package/scripts/run/entry/run-entry-stop.ts +7 -9
  753. package/scripts/run/entry/run-entry.ts +5 -6
  754. package/scripts/run/event/run-event-cli.ts +5 -6
  755. package/scripts/run/event/run-event-filed.ts +69 -0
  756. package/scripts/run/event/run-event-follow.ts +3 -3
  757. package/scripts/run/event/run-event-plan.ts +38 -0
  758. package/scripts/run/event/run-event-render.ts +10 -4
  759. package/scripts/run/event/run-event-scope.ts +47 -18
  760. package/scripts/run/event/run-event-stream-emit.ts +64 -11
  761. package/scripts/run/event/run-event-stream.ts +172 -43
  762. package/scripts/run/event/run-event-watch.ts +4 -6
  763. package/scripts/run/hold/run-hold-cli.ts +65 -62
  764. package/scripts/run/hold/run-hold.ts +88 -46
  765. package/scripts/run/merge/run-merge-cli.ts +116 -77
  766. package/scripts/run/merge/run-merge-collect.ts +107 -0
  767. package/scripts/run/merge/run-merge-steps.ts +112 -65
  768. package/scripts/run/merge/run-merge-token.ts +30 -0
  769. package/scripts/run/merge/run-merge.ts +31 -22
  770. package/scripts/run/progress/run-progress-args.ts +4 -4
  771. package/scripts/run/progress/run-progress-cli.ts +39 -50
  772. package/scripts/run/progress/run-progress-clock.ts +25 -32
  773. package/scripts/run/progress/run-progress-config.ts +6 -9
  774. package/scripts/run/progress/run-progress-read.ts +9 -10
  775. package/scripts/run/progress/run-progress.ts +48 -53
  776. package/scripts/run/review/run-review-cli.ts +6 -6
  777. package/scripts/run/review/run-review-steps.ts +6 -6
  778. package/scripts/run/review/run-review.ts +9 -11
  779. package/scripts/run/run-cli-fault.ts +29 -0
  780. package/scripts/run/run-ending-cli.ts +3 -3
  781. package/scripts/run/run-ending.ts +10 -14
  782. package/scripts/run/run-halfrun-resume.ts +6 -8
  783. package/scripts/run/run-headless.ts +25 -12
  784. package/scripts/run/run-invocation.ts +17 -22
  785. package/scripts/run/run-label.ts +7 -5
  786. package/scripts/run/run-liveness-cli.ts +19 -6
  787. package/scripts/run/run-liveness.ts +27 -38
  788. package/scripts/run/run-next-cli.ts +5 -9
  789. package/scripts/run/run-next.ts +4 -5
  790. package/scripts/run/run-parent-cut-hook.ts +10 -12
  791. package/scripts/run/run-preflight.ts +25 -29
  792. package/scripts/run/run-prep-cli.ts +17 -13
  793. package/scripts/run/run-prep-locate.ts +4 -5
  794. package/scripts/run/run-prep.ts +7 -10
  795. package/scripts/run/run-prrun-resume.ts +2 -2
  796. package/scripts/run/run-report-cli.ts +4 -4
  797. package/scripts/run/run-report.ts +9 -14
  798. package/scripts/run/run-retrospective.ts +3 -3
  799. package/scripts/run/run-section.ts +42 -0
  800. package/scripts/run/run-stage-read.ts +2 -2
  801. package/scripts/run/run-stage.ts +6 -4
  802. package/scripts/run/run-status-cli.ts +7 -5
  803. package/scripts/run/run-status.ts +6 -7
  804. package/scripts/run/run-step-cli.ts +13 -15
  805. package/scripts/run/run-step.ts +62 -48
  806. package/scripts/run/run-stop-notify.ts +7 -8
  807. package/scripts/run/run-stranded-cli.ts +1 -1
  808. package/scripts/run/run-stranded-detect.ts +4 -4
  809. package/scripts/run/run-stranded.ts +11 -13
  810. package/scripts/run/run-tail-cli.ts +15 -16
  811. package/scripts/run/run-tail.ts +14 -33
  812. package/scripts/run/run-watcher-guard-cli.ts +3 -4
  813. package/scripts/run/run-watcher-guard.ts +11 -12
  814. package/scripts/run/run-watcher-hook.ts +6 -12
  815. package/scripts/run/ship/run-ship-cli.ts +67 -33
  816. package/scripts/run/ship/run-ship-detach.ts +15 -13
  817. package/scripts/run/ship/run-ship-lock.ts +1 -1
  818. package/scripts/run/ship/run-ship-next.ts +7 -8
  819. package/scripts/run/ship/run-ship-pre-detach.ts +27 -11
  820. package/scripts/run/ship/run-ship-preflight.ts +10 -11
  821. package/scripts/run/ship/run-ship-probe.ts +4 -4
  822. package/scripts/run/ship/run-ship-return.ts +1 -1
  823. package/scripts/run/ship/run-ship-review-steps.ts +43 -24
  824. package/scripts/run/ship/run-ship-review.ts +12 -14
  825. package/scripts/run/ship/run-ship-scoped.ts +15 -6
  826. package/scripts/run/ship/run-ship-stage.ts +80 -26
  827. package/scripts/run/ship/run-ship-steps.ts +26 -16
  828. package/scripts/run/ship/run-ship-stop-text.ts +4 -2
  829. package/scripts/run/ship/run-ship-sync.ts +9 -8
  830. package/scripts/run/ship/run-ship.ts +17 -32
  831. package/scripts/run/tidy/run-tidy-cli.ts +9 -5
  832. package/scripts/run/tidy/run-tidy-lanes.ts +18 -7
  833. package/scripts/run/tidy/run-tidy-stashes.ts +8 -8
  834. package/scripts/run/tidy/run-tidy.ts +4 -3
  835. package/scripts/run/wake/run-wake-cli.ts +27 -33
  836. package/scripts/run/wake/run-wake-describe.ts +76 -29
  837. package/scripts/run/wake/run-wake-driver.ts +14 -14
  838. package/scripts/run/wake/run-wake-handoff.ts +6 -6
  839. package/scripts/run/wake/run-wake-loop.ts +13 -21
  840. package/scripts/run/wake/run-wake-restart.ts +4 -5
  841. package/scripts/run/wake/run-wake-session.ts +23 -27
  842. package/scripts/run/wake/run-wake.ts +57 -328
  843. package/scripts/safe-chain/ci-installer-pin.ts +3 -3
  844. package/scripts/safe-chain/pack-hook.ts +2 -2
  845. package/scripts/safe-chain/preinstall-command.ts +2 -2
  846. package/scripts/security/security-audit-logic.ts +1 -1
  847. package/scripts/security/security-audit-provision-logic.ts +1 -1
  848. package/scripts/security/security-audit-provision.ts +2 -2
  849. package/scripts/security/security-audit.ts +5 -5
  850. package/scripts/security/security-updates-logic.ts +2 -3
  851. package/scripts/security/security-updates.ts +2 -4
  852. package/scripts/self-sync-guard/index.ts +1 -1
  853. package/scripts/self-sync-guard/self-sync-guard-logic.ts +2 -2
  854. package/scripts/self-sync-guard/self-sync-refusal.ts +1 -1
  855. package/scripts/sonar/sonar-hotspots-cli.ts +1 -1
  856. package/scripts/sonar/sonar-hotspots.ts +1 -1
  857. package/scripts/sonar/sonar-new-code-cli.ts +1 -1
  858. package/scripts/sonar/sonar-new-code.ts +1 -1
  859. package/scripts/sonar/sonar-project.ts +1 -1
  860. package/scripts/split/split-assess-cli.ts +1 -1
  861. package/scripts/split/split-assess.ts +3 -3
  862. package/scripts/sync/directory-copy-guard.ts +2 -3
  863. package/scripts/sync/managed-config-scope-cli.ts +1 -2
  864. package/scripts/sync/managed-config-scope.ts +4 -4
  865. package/scripts/sync/plugin-skill-directories.ts +2 -2
  866. package/scripts/sync/reconcile-templates.ts +17 -8
  867. package/scripts/sync/removed-skill-manifest.ts +2 -3
  868. package/scripts/sync/sync-ai-files.ts +7 -7
  869. package/scripts/sync/sync-configs.ts +30 -3
  870. package/scripts/sync/sync-hook-safety.ts +2 -2
  871. package/scripts/sync/sync.ts +23 -10
  872. package/scripts/sync/synced-paths.ts +2 -1
  873. package/scripts/sync/workflow-pin-logic.ts +1 -1
  874. package/scripts/test/test-declared-changed.ts +4 -4
  875. package/scripts/test/test-declared-logic.ts +2 -3
  876. package/scripts/test/test-declared-match.ts +25 -4
  877. package/scripts/test/test-declared.ts +26 -9
  878. package/scripts/test/test-red-commit.ts +3 -2
  879. package/scripts/test/test-red-logic.ts +7 -14
  880. package/scripts/test/test-red.ts +12 -47
  881. package/scripts/test/test-related-scope.ts +2 -3
  882. package/scripts/test/test-related.ts +3 -3
  883. package/scripts/test/test-type-logic.ts +1 -2
  884. package/scripts/test/test-unit-guard.ts +13 -17
  885. package/scripts/test/unit-worker-share.ts +7 -8
  886. package/scripts/time-runtime/time-agent-bundles.ts +2 -4
  887. package/scripts/time-runtime/time-background.ts +17 -21
  888. package/scripts/time-runtime/time-batch-guard.ts +67 -342
  889. package/scripts/time-runtime/time-bundle-call.ts +26 -28
  890. package/scripts/time-runtime/time-bundles.ts +11 -12
  891. package/scripts/time-runtime/time-call-identity.ts +1 -1
  892. package/scripts/time-runtime/time-command-key.ts +2 -2
  893. package/scripts/time-runtime/time-density-hook.ts +8 -11
  894. package/scripts/time-runtime/time-density.ts +5 -5
  895. package/scripts/time-runtime/time-followup-stage.ts +7 -7
  896. package/scripts/time-runtime/time-format.ts +5 -5
  897. package/scripts/time-runtime/time-hook-transcript.ts +3 -3
  898. package/scripts/time-runtime/time-instant.ts +1 -1
  899. package/scripts/time-runtime/time-markers.ts +15 -19
  900. package/scripts/time-runtime/time-phase-names.ts +3 -3
  901. package/scripts/time-runtime/time-reported-failure.ts +15 -19
  902. package/scripts/time-runtime/time-round-trips.ts +20 -23
  903. package/scripts/time-runtime/time-shell.ts +8 -8
  904. package/scripts/time-runtime/time-single-check.ts +1 -2
  905. package/scripts/time-runtime/time-spans.ts +35 -40
  906. package/scripts/time-runtime/time-tool-call.ts +15 -16
  907. package/scripts/time-runtime/time-transcript-line.ts +53 -34
  908. package/scripts/time-runtime/time-writes.ts +5 -5
  909. package/scripts/ui/ui-routes-cli.ts +1 -2
  910. package/scripts/ui/ui-routes.ts +1 -2
  911. package/scripts/version/bump-version.ts +1 -1
  912. package/scripts/version/fresh-metadata-cache.ts +2 -2
  913. package/scripts/version/latest-corepack.ts +129 -98
  914. package/scripts/version/latest-lane-guard.ts +1 -1
  915. package/scripts/version/latest-scope-cli.ts +2 -2
  916. package/scripts/version/latest-stamp.ts +1 -2
  917. package/scripts/version/latest-update.ts +2 -2
  918. package/scripts/version/npm-registry.ts +2 -2
  919. package/scripts/version/package-manager-version.ts +18 -0
  920. package/scripts/version/publishable-range-check.ts +2 -1
  921. package/scripts/version/publishable-range.ts +1 -1
  922. package/scripts/version/release-age.ts +11 -11
  923. package/scripts/version/release-hold.ts +2 -2
  924. package/scripts/version/safe-chain-version-update.ts +3 -3
  925. package/scripts/version/version-check-logic.ts +2 -3
  926. package/scripts/version/version-check.ts +1 -2
  927. package/scripts/version/version-command-config.ts +2 -2
  928. package/scripts/version/version-commands.ts +3 -3
  929. package/scripts/version/version-remote.ts +4 -4
  930. package/scripts/version/version-targets.ts +2 -2
  931. package/templates/gitignore +7 -0
  932. package/templates/workflows/github-release.yml +4 -0
  933. package/dist/hooks/chunk-NV2JRZZO.js +0 -6385
  934. package/dist/hooks/chunk-RKUAD3I6.js +0 -90
  935. package/dist/hooks/chunk-WPALEIRX.js +0 -18
  936. package/scripts/backlog/backlog-restructure.ts +0 -152
  937. package/scripts/rules/issue-fold-rule.ts +0 -72
  938. package/scripts/rules/wip-cap.ts +0 -63
  939. package/scripts/run/run-issue-number.ts +0 -19
@@ -61,8 +61,8 @@ function refused(refusal: string): StepPlan {
61
61
  }
62
62
 
63
63
  // Main already has a history but not kit's setup, so the setup reaches main the way every later change
64
- // does — an Issue and a pull request a person merges — rather than a commit on main
65
- // (joshuafolkken/kit#2816). On another branch the pull request would not be based on main, so it waits
64
+ // does — an Issue and a pull request a person merges — rather than a commit on main.
65
+ // On another branch the pull request would not be based on main, so it waits
66
66
  // — except the setup branch a failed hook left checked out, where a re-run resumes. Once kit is
67
67
  // committed there, nothing is left for the step, so a later run on that branch plans none.
68
68
  function needs_setup_pr(state: GitState): boolean {
@@ -4,6 +4,7 @@ import { git_gh_issue_write } from '#scripts/gh/git-gh-issue-write'
4
4
  import { git_pr } from '#scripts/gh/git-pr'
5
5
  import { github_issue_url } from '#scripts/gh/github-issue-url'
6
6
  import { git_issue, type IssueInfo } from '#scripts/git/git-issue'
7
+ import { issue_cite } from '#scripts/issue/issue-cite'
7
8
  import { IGNORE_FOR_RELEASE_LABEL } from '#scripts/issue/issue-labels'
8
9
  import { KIT_PACKAGE_NAME } from '#scripts/version/kit-descriptor'
9
10
  import { kit_written_paths } from './kit-written-paths'
@@ -31,7 +32,7 @@ function listing(args: ReadonlyArray<string>, root: string): Array<string> {
31
32
  }
32
33
 
33
34
  function setup_issue(issue_number: string): IssueInfo {
34
- return git_issue.parse(`${SETUP_TITLE} #${issue_number}`)
35
+ return git_issue.parse(`${SETUP_TITLE} ${issue_cite.plain(issue_number)}`)
35
36
  }
36
37
 
37
38
  // The Issue number when `branch` is the branch an earlier `josh start` created for the setup pull
@@ -64,7 +65,7 @@ function carried_paths(root: string, current: string | undefined): Array<string>
64
65
  }
65
66
 
66
67
  // The Issue carries the release classification the pull request is opened with, so the PR step finds
67
- // one without a person adding it (joshuafolkken/kit#2816).
68
+ // one without a person adding it.
68
69
  function file_setup_issue(): string {
69
70
  const request = git_gh_issue_write.issue_create_request({
70
71
  title: SETUP_TITLE,
@@ -104,7 +104,7 @@ function add_missing_labels(): void {
104
104
  }
105
105
 
106
106
  // Main already has a history here, so the setup reaches it the way every other change does: through
107
- // an Issue and a pull request a person merges (joshuafolkken/kit#2816).
107
+ // an Issue and a pull request a person merges.
108
108
  async function open_setup_pull_request(context: RunContext): Promise<void> {
109
109
  await start_setup_pr.open(context.root, context.baseline)
110
110
  }
@@ -112,7 +112,7 @@ async function open_setup_pull_request(context: RunContext): Promise<void> {
112
112
  // What was already changed before the setup ran, read whenever a setup pull request will follow, so
113
113
  // it can tell the setup's files from the user's own (#2872). Kit's own `josh init` needs it as much as
114
114
  // a caller's command: its `josh format` rewrites the project's own sources, which kit cannot name, and
115
- // leaving them out failed the pull request's Prettier check (joshuafolkken/kit#3136).
115
+ // leaving them out failed the pull request's Prettier check.
116
116
  function baseline_of(
117
117
  steps: ReadonlyArray<StartStep>,
118
118
  context: StepContext,
@@ -12,7 +12,7 @@ import { string_array_schema } from '#scripts/lib/schemas'
12
12
  // `*.json`; a consumer whose `extends` still points at the old path would never be repaired by the
13
13
  // ensure-based merge — an `@joshuafolkken/*` tsconfig entry is already present, so nothing is added
14
14
  // — hence the rewrite here. Scoped to `@joshuafolkken/*/tsconfig/*` paths so an unrelated
15
- // project-local `.jsonc` config is left alone. See joshuafolkken/kit#681.
15
+ // project-local `.jsonc` config is left alone.
16
16
  const LEGACY_PRESET_ENTRY = /@joshuafolkken\/[^/]+\/tsconfig\/[^/]+\.jsonc$/u
17
17
  const LEGACY_SUFFIX = '.jsonc'
18
18
  const CURRENT_SUFFIX = '.json'
@@ -0,0 +1,62 @@
1
+ import { parse_jsonc } from '#scripts/config-merge/parse-jsonc'
2
+ import { patch_json_array } from '#scripts/config-merge/patch-json-array'
3
+ import { json_object_schema } from '#scripts/lib/schemas'
4
+ import { z } from 'zod'
5
+ import { init_logic_json_merge } from './init-logic-json-merge'
6
+
7
+ type Task = Record<string, unknown>
8
+
9
+ const TASKS_KEY = 'tasks'
10
+ const LABEL_KEY = 'label'
11
+ const TASKS_VERSION = '2.0.0'
12
+ const VSCODE_TASKS_FILENAME = 'tasks.json'
13
+
14
+ // A label kit once shipped a task under, mapped to the label that replaced it. A consumer's task still
15
+ // carrying the retired label is the same kit task under its old name, so it is replaced in place — an
16
+ // append would leave the retired folder-open pane starting beside its successor.
17
+ const RETIRED_LABELS: ReadonlyMap<unknown, string> = new Map([
18
+ ['josh: run event watch', 'josh: run board'],
19
+ ])
20
+
21
+ const task_array_schema = z.array(json_object_schema)
22
+
23
+ function read_tasks(parsed: Record<string, unknown>): Array<Task> {
24
+ const result = task_array_schema.safeParse(parsed[TASKS_KEY])
25
+
26
+ return result.success ? result.data : []
27
+ }
28
+
29
+ // A task is identified by its `label` — the name VSCode runs it by and `dependsOn` refers to it by.
30
+ function has_label(element: unknown, label: unknown): boolean {
31
+ const result = json_object_schema.safeParse(element)
32
+ if (!result.success) return false
33
+ const own = result.data[LABEL_KEY]
34
+
35
+ return (RETIRED_LABELS.get(own) ?? own) === label
36
+ }
37
+
38
+ // Kit owns the tasks whose label it ships: each is replaced with kit's current definition in place,
39
+ // a kit task the file lacks is appended, and every other task the consumer declared is kept as
40
+ // authored, comments included — the label-level counterpart of the key-level merge
41
+ // `.vscode/settings.json` gets.
42
+ function merge_tasks(content: string, kit_tasks: ReadonlyArray<Task>): string {
43
+ let merged = init_logic_json_merge.merge_json_object(content, { version: TASKS_VERSION })
44
+
45
+ for (const task of kit_tasks) {
46
+ merged = patch_json_array.upsert_element(merged, {
47
+ key: TASKS_KEY,
48
+ value: task,
49
+ is_target: (element) => has_label(element, task[LABEL_KEY]),
50
+ })
51
+ }
52
+
53
+ return merged
54
+ }
55
+
56
+ function read_kit_tasks(content: string): Array<Task> {
57
+ return read_tasks(parse_jsonc(content))
58
+ }
59
+
60
+ const vscode_tasks = { VSCODE_TASKS_FILENAME, merge_tasks, read_kit_tasks }
61
+
62
+ export { vscode_tasks }
@@ -1,8 +1,8 @@
1
1
  import { markdown_section } from './markdown-section'
2
2
 
3
3
  // A behavior-change Issue's baseline section is written as `command + value`, never prose, so that
4
- // `pnpm josh measure:rerun` can re-run the command after merge and print a before/after pair
5
- // (joshuafolkken/kit#2212). When the value has not moved, the premise the rule rested on is recorded
4
+ // `pnpm josh measure:rerun` can re-run the command after merge and print a before/after pair.
5
+ // When the value has not moved, the premise the rule rested on is recorded
6
6
  // as refuted in the observation ledger — reusing that append-only mechanism rather than a second one.
7
7
 
8
8
  const BASELINE_HEADING = '## ベースライン'
@@ -6,8 +6,8 @@ import { reproduction_measure } from './reproduction-measure'
6
6
  // A behavior-change Issue owes three headings the ordinary template does not — a firing-point heading
7
7
  // (the tool call the rule breaks on), a baseline heading (a re-runnable measurement) and a
8
8
  // reproduction heading (the command and its actual output). This checks them, but only for an Issue
9
- // that declares itself one, and never asks the model to judge whether it is (joshuafolkken/kit#2212,
10
- // joshuafolkken/kit#2353). The declaration, the headings and the grammars are the template's, pinned
9
+ // that declares itself one, and never asks the model to judge whether it is. The declaration, the
10
+ // headings and the grammars are the template's, pinned
11
11
  // by the document test.
12
12
 
13
13
  // The body declares itself a behavior-change Issue with this exact line under its opening heading.
@@ -79,7 +79,7 @@ function search_path(query: string, page: number = FIRST_PAGE): string {
79
79
 
80
80
  // How many pages the search holds, read off the first page's own count. Bounded by the API's
81
81
  // ceiling, past which GitHub serves no page at all — so this asks for exactly the pages `gh api
82
- // --paginate` used to walk to.
82
+ // --paginate` would walk to.
83
83
  function page_count(first: SearchPage): number {
84
84
  return Math.ceil(Math.min(first.total_count, SEARCH_RESULT_CEILING) / Number(PER_PAGE))
85
85
  }
@@ -87,13 +87,12 @@ function page_count(first: SearchPage): number {
87
87
  async function read_page(query: string, page: number): Promise<SearchPage | undefined> {
88
88
  const raw = await git_gh_exec.exec_gh_api({ path: search_path(query, page) })
89
89
 
90
- return parse_json.parse_json_object_safe(raw, search_page_schema)
90
+ return parse_json.parse_json_object_or_undefined(raw, search_page_schema)
91
91
  }
92
92
 
93
- // Every page of one search. joshuafolkken/kit#3103: `--paginate` follows each page's `next` link, so
94
- // a two-week window of ~5 pages cost ~1.5 s a page, one after another, on every `backlog:plan`. The
95
- // first page names the total, so the rest are fetched together; any page that does not read fails
96
- // the whole search, as a failed `--paginate` did.
93
+ // Every page of one search. Not `gh api --paginate`: it follows each page's `next` link one page
94
+ // after another, at about 1.5 s a page, on every `backlog:plan`. The first page names the total, so
95
+ // the rest are fetched together; any page that does not read fails the whole search.
97
96
  async function read_pages(query: string): Promise<ReadonlyArray<SearchPage> | undefined> {
98
97
  const first = await read_page(query, FIRST_PAGE)
99
98
 
@@ -138,7 +137,7 @@ async function search(query: string): Promise<SearchResult | undefined> {
138
137
  }
139
138
 
140
139
  // The rate over a window, or `undefined` when either search could not be read. `backlog:next` asks
141
- // this same measurement (joshuafolkken/kit#2455), so the two cannot disagree about the rate.
140
+ // this same measurement, so the two cannot disagree about the rate.
142
141
  async function measure_window(
143
142
  repo: string,
144
143
  days: number,
@@ -1,20 +1,27 @@
1
1
  import { behavior_change_lint } from './behavior-change-lint'
2
- import { has_label_name, INTERRUPT_ROUTE_LABEL } from './issue-labels'
2
+ import {
3
+ BUG_LABEL,
4
+ BUGFIX_LABEL,
5
+ ENHANCEMENT_LABEL,
6
+ has_label_name,
7
+ INTERRUPT_ROUTE_LABEL,
8
+ } from './issue-labels'
3
9
  import { markdown_section } from './markdown-section'
4
10
 
5
- // The defect rate of merged work over a window (joshuafolkken/kit#2449): issues filed as defects
6
- // divided by behavior changes completed. Both sides are read from an issue-kind declaration line and
7
- // the `route:interrupt` label, so nothing here asks for a judgement.
11
+ // The defect rate of merged work over a window: issues filed as defects
12
+ // divided by enhancements completed. Both sides are read from labels and the defect declaration line,
13
+ // so nothing here asks for a judgement.
8
14
 
9
15
  // A body declares itself a defect with this exact line, the sibling of the behavior-change declaration.
10
- // Filers already write it, but the issue template does not list it yet and no filing lint enforces it,
11
- // so a defect filed without it is counted only when it carries `route:interrupt`.
16
+ // Older bodies rarely wrote it, so the labels a maintainer re-applied after review count as well — the
17
+ // name changed over time (`bugfix` earlier, `bug` from `issue:file`), and the labels read both periods
18
+ // by one standard where the declaration alone moved the rate with the filing habit.
12
19
  const DEFECT_DECLARATION_LINE = '- 種別: 不具合'
20
+ const DEFECT_LABELS: ReadonlyArray<string> = [BUG_LABEL, BUGFIX_LABEL, INTERRUPT_ROUTE_LABEL]
13
21
  const DEFAULT_WINDOW_DAYS = 14
14
- // The rate measured when the command was introduced — 20 / 48 over 2026-09-09 to 2026-09-23, recorded
15
- // on joshuafolkken/kit#2449 as the rounded 0.42, which is the threshold that issue fixed. `backlog:next` defers new mechanisms while the current rate is above it
16
- // (joshuafolkken/kit#2455).
17
- const BASELINE_RATE = 0.42
22
+ // The rate over 2026-09-09 to 2026-09-23 measured by the label definition — 150 / 206, rounded.
23
+ // `backlog:next` defers new mechanisms while the current rate is above it.
24
+ const BASELINE_RATE = 0.73
18
25
  const MS_PER_DAY = 86_400_000
19
26
  const ISO_DATE_LENGTH = 10
20
27
  const RATE_DIGITS = 2
@@ -28,7 +35,7 @@ interface DefectRate {
28
35
  days: number
29
36
  since: string
30
37
  defects: number
31
- behavior_changes: number
38
+ enhancements: number
32
39
  is_capped: boolean
33
40
  }
34
41
 
@@ -53,27 +60,30 @@ function filed_query(repo: string, since: string): string {
53
60
  return `repo:${repo} is:issue created:>=${since}`
54
61
  }
55
62
 
63
+ // Narrowed to the denominator's label, so the search pages only through what is counted.
56
64
  function completed_query(repo: string, since: string): string {
57
- return `repo:${repo} is:issue is:closed reason:completed closed:>=${since}`
65
+ return `repo:${repo} is:issue is:closed reason:completed label:${ENHANCEMENT_LABEL} closed:>=${since}`
58
66
  }
59
67
 
60
68
  function is_defect(issue: RateIssue): boolean {
61
69
  return (
62
70
  markdown_section.has_line(issue.body, DEFECT_DECLARATION_LINE) ||
63
- has_label_name(issue.labels, INTERRUPT_ROUTE_LABEL)
71
+ DEFECT_LABELS.some((label) => has_label_name(issue.labels, label))
64
72
  )
65
73
  }
66
74
 
67
- function is_behavior_change(issue: RateIssue): boolean {
68
- return behavior_change_lint.is_target(issue.body)
75
+ // The denominator is every enhancement, not only the behavior changes `backlog:next` defers: a count
76
+ // the priority itself shrinks would push the rate further up while it is above the baseline.
77
+ function is_enhancement(issue: RateIssue): boolean {
78
+ return has_label_name(issue.labels, ENHANCEMENT_LABEL)
69
79
  }
70
80
 
71
- // A defect declaration or `route:interrupt` wins over a behavior-change declaration, so an issue that
72
- // is both counts as the fix it is.
81
+ // A defect label or declaration wins over a behavior-change declaration, so an issue that is both
82
+ // counts as the fix it is.
73
83
  function kind_of(issue: RateIssue): IssueKind {
74
84
  if (is_defect(issue)) return 'defect'
75
85
 
76
- return is_behavior_change(issue) ? 'mechanism' : 'other'
86
+ return behavior_change_lint.is_target(issue.body) ? 'mechanism' : 'other'
77
87
  }
78
88
 
79
89
  function measure(input: DefectRateInput): DefectRate {
@@ -81,17 +91,17 @@ function measure(input: DefectRateInput): DefectRate {
81
91
  days: input.days,
82
92
  since: input.since,
83
93
  defects: input.filed.filter((issue) => is_defect(issue)).length,
84
- behavior_changes: input.completed.filter((issue) => is_behavior_change(issue)).length,
94
+ enhancements: input.completed.filter((issue) => is_enhancement(issue)).length,
85
95
  is_capped: input.is_capped,
86
96
  }
87
97
  }
88
98
 
89
- // Undefined when no behavior change completed in the window: a rate over zero is no answer, and
90
- // printing 0 or Infinity would read as one.
99
+ // Undefined when no enhancement completed in the window: a rate over zero is no answer, and printing
100
+ // 0 or Infinity would read as one.
91
101
  function rate_of(result: DefectRate): number | undefined {
92
- if (result.behavior_changes === 0) return undefined
102
+ if (result.enhancements === 0) return undefined
93
103
 
94
- return result.defects / result.behavior_changes
104
+ return result.defects / result.enhancements
95
105
  }
96
106
 
97
107
  // Strictly above: a rate equal to the baseline has not risen, and a window with no rate is no answer.
@@ -104,16 +114,16 @@ function is_above_baseline(result: DefectRate): boolean {
104
114
  function rate_text(result: DefectRate): string {
105
115
  const rate = rate_of(result)
106
116
 
107
- if (rate === undefined) return 'n/a (no behavior change completed in the window)'
117
+ if (rate === undefined) return 'n/a (no enhancement completed in the window)'
108
118
 
109
- return `${rate.toFixed(RATE_DIGITS)} (${String(result.defects)} / ${String(result.behavior_changes)})`
119
+ return `${rate.toFixed(RATE_DIGITS)} (${String(result.defects)} / ${String(result.enhancements)})`
110
120
  }
111
121
 
112
122
  function format(result: DefectRate): ReadonlyArray<string> {
113
123
  const lines = [
114
124
  `Defect rate over the last ${String(result.days)} days (since ${result.since}): ${rate_text(result)}`,
115
- ` Defects filed: ${String(result.defects)} — declared \`${DEFECT_DECLARATION_LINE}\` or labelled ${INTERRUPT_ROUTE_LABEL}`,
116
- ` Behavior changes completed: ${String(result.behavior_changes)} — declared \`${behavior_change_lint.DECLARATION_LINE}\`, closed as completed`,
125
+ ` Defects filed: ${String(result.defects)} — labelled ${DEFECT_LABELS.join(' / ')} or declared \`${DEFECT_DECLARATION_LINE}\``,
126
+ ` Enhancements completed: ${String(result.enhancements)} — labelled ${ENHANCEMENT_LABEL}, closed as completed`,
117
127
  ]
118
128
 
119
129
  if (!result.is_capped) return lines
@@ -3,14 +3,15 @@ import { open_issue_schema, type OpenIssueData } from '#scripts/git/git-schemas'
3
3
  import { parse_json_array_safe } from '#scripts/git/parse-json-array'
4
4
  import { has_any_label, NOT_DIRECTLY_RUNNABLE_LABELS } from './issue-labels'
5
5
  import { issue_rank, type DependencyRow } from './issue-rank'
6
+ import { session_cite } from './session-cite'
6
7
 
7
- // The next-issues display printed when a workflow completes (#821): up to five open issues in
8
+ // The next-issues display printed when a workflow completes: up to five open issues in
8
9
  // priority order, so the user picks the next run from the completion output instead of opening the
9
10
  // issue list. Priority is recency — a newer issue usually encodes the most current understanding
10
11
  // of the backlog — with the label-based exclusions below, under the ranking keys `issue-rank.ts`
11
- // defines (joshuafolkken/kit#2928).
12
+ // defines.
12
13
  //
13
- // `prioritize` is also the order `epicrun` picks up `auto-ok` issues in (joshuafolkken/kit#906).
14
+ // `prioritize` is also the order `epicrun` picks up `auto-ok` issues in.
14
15
  // The two ask one question — which open issue outside an epic is run next — so they share one
15
16
  // answer; a second ordering would have the run start something other than what this display, shown
16
17
  // at the end of every workflow, has just told the person is next.
@@ -19,7 +20,7 @@ const DISPLAY_LIMIT = 5
19
20
  const HEADER = '🗒 Next issues (newest first):'
20
21
 
21
22
  // Surfacing an `epic`, an `in-progress` or a `needs-decision` issue as "next" would suggest a run
22
- // the workflow rules forbid, duplicate, or cannot finish (joshuafolkken/kit#861). The set itself is
23
+ // the workflow rules forbid, duplicate, or cannot finish. The set itself is
23
24
  // shared with the `auto-ok` pickup, which asks the same question of the same listing shape.
24
25
  function has_excluded_label(issue: OpenIssueData): boolean {
25
26
  return has_any_label(issue.labels, NOT_DIRECTLY_RUNNABLE_LABELS)
@@ -51,7 +52,7 @@ function dependency_row(issue: OpenIssueData): DependencyRow {
51
52
  }
52
53
 
53
54
  // Every candidate in rank order, uncapped. `backlog:next` takes this rather than `prioritize`, so the
54
- // `run:solo` gate sees the whole ranking before anything is cut (joshuafolkken/kit#2928).
55
+ // `run:solo` gate sees the whole ranking before anything is cut.
55
56
  function order(
56
57
  issues: ReadonlyArray<OpenIssueData>,
57
58
  completed_issue_number?: number,
@@ -69,7 +70,7 @@ function order(
69
70
 
70
71
  // **This display deliberately does not drop a blocked issue, and the `auto-ok` pickup deliberately
71
72
  // does.** They share this ordering and differ on the set, which reads as an inconsistency and is not
72
- // one (joshuafolkken/kit#1005).
73
+ // one.
73
74
  //
74
75
  // The display is read by a person, who can see that an issue is blocked, judge that the blocker is
75
76
  // nearly done or does not really block it, and start anyway. The pickup feeds an unattended run,
@@ -87,7 +88,7 @@ function prioritize(
87
88
  function format_lines(issues: ReadonlyArray<OpenIssueData>): Array<string> {
88
89
  if (issues.length === 0) return []
89
90
  const rows = issues.map(
90
- (issue, index) => ` ${String(index + 1)}. #${String(issue.number)} ${issue.title}`,
91
+ (issue, index) => ` ${String(index + 1)}. ${session_cite.issue(issue.number, issue.title)}`,
91
92
  )
92
93
 
93
94
  return [HEADER, ...rows]
@@ -99,7 +100,7 @@ function format_lines(issues: ReadonlyArray<OpenIssueData>): Array<string> {
99
100
  // failed over a purely informational display.
100
101
  async function fetch_next_issue_lines(completed_issue_number?: number): Promise<Array<string>> {
101
102
  try {
102
- // **`is_capped` is deliberately not read here** (joshuafolkken/kit#1067). The paging is
103
+ // **`is_capped` is deliberately not read here**. The paging is
103
104
  // newest-first and this display keeps only the five newest of the twenty it asks for, so a
104
105
  // listing the page ceiling cut short is a *prefix* of the one it would otherwise have got — the
105
106
  // same five rows, in the same order. There is nothing the truncation hides that this display
@@ -2,19 +2,29 @@ import { git_branch } from '#scripts/git/git-branch'
2
2
  import { git_command } from '#scripts/git/git-command'
3
3
  import { run_carry } from '#scripts/run/carry/run-carry'
4
4
  import { issue_file } from './issue-file'
5
- import { AUTO_OK_LABEL, has_label_name } from './issue-labels'
5
+ import { AUTO_OK_LABEL, has_label_name, RELEASE_LABEL } from './issue-labels'
6
6
  import { issue_state_cli } from './issue-state-cli'
7
7
 
8
- // Whether `josh issue:file` applies `auto-ok` to the Issue it files (joshuafolkken/kit#3213). Work
9
- // found during an unattended run used to wait in the backlog until a person labelled it, so the
10
- // filing now computes the answer instead of leaving it to the agent's memory: an Issue filed while a
8
+ // Whether `josh issue:file` applies `auto-ok` to the Issue it files. So that work found during an
9
+ // unattended run does not wait in the backlog until a person labels it, the filing computes the
10
+ // answer instead of leaving it to the agent's memory: an Issue filed while a
11
11
  // `backlogrun` carry record is live, or from a branch whose Issue carries `auto-ok`, is opted in by
12
12
  // default. `--no-auto-ok` is the one exception, declared for an Issue that needs a person's judgement
13
13
  // (a Tier B toss-up or a Tier C action). A filing to another repository is never opted in: that
14
14
  // repository's own `backlogrun` would implement and merge it though nobody opted that repository in.
15
+ // A `release` Issue is never opted in either: a release is Tier C, so only a
16
+ // person applies `auto-ok` to it, whatever the carry record or the branch's Issue says.
17
+ // `--requested` withholds the default the same way: a person asked for this filing (a `new` entry, or
18
+ // a request in conversation), so the run's own opt-in does not speak for them — `auto-ok` comes only
19
+ // from their own `--label auto-ok`. A filing without the declaration — an observation, a
20
+ // retrospective, a routed filing — keeps the default above.
15
21
 
16
22
  interface AutoOkSignals {
17
23
  is_opted_out: boolean
24
+ // `--requested`: a person asked for the filing, so neither the carry record nor the branch speaks.
25
+ is_requested: boolean
26
+ // The filing carries the `release` label.
27
+ is_release: boolean
18
28
  is_carried: boolean
19
29
  // The labels of the Issue the current branch names; `undefined` when the branch names none or the
20
30
  // Issue could not be read.
@@ -31,6 +41,14 @@ const CROSS_REPOSITORY: AutoOkDecision = {
31
41
  is_applied: false,
32
42
  reason: 'the Issue is filed to another repository',
33
43
  }
44
+ const RELEASE: AutoOkDecision = {
45
+ is_applied: false,
46
+ reason: `a ${RELEASE_LABEL} Issue is opted in by a person only`,
47
+ }
48
+ const REQUESTED: AutoOkDecision = {
49
+ is_applied: false,
50
+ reason: 'a person asked for this filing; auto-ok only when they declare it',
51
+ }
34
52
  const CARRIED: AutoOkDecision = { is_applied: true, reason: 'a backlogrun carry record is live' }
35
53
  const BRANCH_OPTED_IN: AutoOkDecision = {
36
54
  is_applied: true,
@@ -41,9 +59,25 @@ const NOT_OPTED_IN: AutoOkDecision = {
41
59
  reason: 'no backlogrun carry record is live and the branch names no auto-ok Issue',
42
60
  }
43
61
 
44
- // The opt-out wins over every signal, then the carry record, then the branch's Issue.
45
- function decide(signals: AutoOkSignals): AutoOkDecision {
62
+ // What the filing itself declares: `--no-auto-ok` and `--requested`.
63
+ type AutoOkDeclared = Pick<AutoOkSignals, 'is_opted_out' | 'is_requested'>
64
+ type Withholding = AutoOkDeclared & Pick<AutoOkSignals, 'is_release'>
65
+
66
+ // The three signals that withhold `auto-ok` before any other is read, or `undefined` when none holds.
67
+ function withheld(signals: Withholding): AutoOkDecision | undefined {
46
68
  if (signals.is_opted_out) return OPTED_OUT
69
+ if (signals.is_release) return RELEASE
70
+ if (signals.is_requested) return REQUESTED
71
+
72
+ return undefined
73
+ }
74
+
75
+ // The opt-out, the `release` label and `--requested` win over every signal, then the carry record,
76
+ // then the branch's Issue.
77
+ function decide(signals: AutoOkSignals): AutoOkDecision {
78
+ const decision = withheld(signals)
79
+
80
+ if (decision !== undefined) return decision
47
81
  if (signals.is_carried) return CARRIED
48
82
  if (has_label_name(signals.branch_labels ?? [], AUTO_OK_LABEL)) return BRANCH_OPTED_IN
49
83
 
@@ -76,20 +110,24 @@ async function branch_labels(current: string): Promise<ReadonlyArray<string> | u
76
110
  }
77
111
 
78
112
  // Each read is skipped once an earlier signal has already decided the answer; a cross-repository
79
- // filing is refused before any signal is read.
113
+ // filing is refused before any signal is read. `labels` are the ones the filing declares.
80
114
  async function resolve(
81
- is_opted_out: boolean,
115
+ declared: AutoOkDeclared,
82
116
  target: string,
83
117
  current: string,
118
+ labels: ReadonlyArray<string> = [],
84
119
  ): Promise<AutoOkDecision> {
85
- if (is_opted_out) return OPTED_OUT
120
+ const withholding = { ...declared, is_release: has_label_name(labels, RELEASE_LABEL) }
121
+ const decision = withheld(withholding)
122
+
123
+ if (decision !== undefined) return decision
86
124
  if (!issue_file.is_same_repository(target, current)) return CROSS_REPOSITORY
87
125
  if (await is_carried()) return CARRIED
88
126
 
89
- return decide({ is_opted_out, is_carried: false, branch_labels: await branch_labels(current) })
127
+ return decide({ ...withholding, is_carried: false, branch_labels: await branch_labels(current) })
90
128
  }
91
129
 
92
130
  const issue_auto_ok = { decide, line_of, resolve }
93
131
 
94
- export type { AutoOkDecision, AutoOkSignals }
132
+ export type { AutoOkDeclared, AutoOkDecision, AutoOkSignals }
95
133
  export { issue_auto_ok }
@@ -1,18 +1,18 @@
1
1
  #!/usr/bin/env tsx
2
2
  import { fileURLToPath } from 'node:url'
3
3
  import { git_gh_command } from '#scripts/gh/git-gh-command'
4
- import { parse_json_object_safe } from '#scripts/git/parse-json-array'
4
+ import { parse_json_object_or_undefined } from '#scripts/git/parse-json-array'
5
+ import { issue_number_shape } from '#scripts/issue/issue-number-shape'
5
6
  import { z } from 'zod'
6
7
  import { issue_backlinks, type UpstreamEntry } from './issue-backlinks'
7
8
 
8
9
  // `josh issue:backlinks <N>` — read origin issue N, then the upstream issues it lists, and print one
9
10
  // of `ok` / `missing-origin` / `missing-upstream` / `wrong-heading`, exiting non-zero on anything but
10
- // `ok` so it works as a gate (joshuafolkken/kit#2123).
11
+ // `ok` so it works as a gate.
11
12
 
12
13
  const SUCCESS_EXIT_CODE = 0
13
14
  const FAILURE_EXIT_CODE = 1
14
15
  const ARGV_OFFSET = 2
15
- const ISSUE_NUMBER_PATTERN = /^[1-9]\d*$/u
16
16
  const REF_PATTERN = /^([\w.-]+\/[\w.-]+)#(\d+)$/u
17
17
  const BODY_FIELD = 'body'
18
18
  const USAGE = 'Usage: josh issue:backlinks <issue-number>'
@@ -21,7 +21,7 @@ const body_schema = z.object({ body: z.string().nullish() })
21
21
 
22
22
  function parse_body(raw_json: string | undefined): string | undefined {
23
23
  if (raw_json === undefined) return undefined
24
- const parsed = parse_json_object_safe(raw_json, body_schema)
24
+ const parsed = parse_json_object_or_undefined(raw_json, body_schema)
25
25
 
26
26
  return parsed === undefined ? undefined : (parsed.body ?? '')
27
27
  }
@@ -67,7 +67,7 @@ async function classify(issue_number: string): Promise<string | undefined> {
67
67
  async function run(argv: ReadonlyArray<string>): Promise<number> {
68
68
  const [issue_number] = argv
69
69
 
70
- if (issue_number === undefined || !ISSUE_NUMBER_PATTERN.test(issue_number)) {
70
+ if (issue_number === undefined || !issue_number_shape.ISSUE_NUMBER_PATTERN.test(issue_number)) {
71
71
  console.error(USAGE)
72
72
 
73
73
  return FAILURE_EXIT_CODE
@@ -1,9 +1,10 @@
1
1
  // The upstream backlink headings (`prompts/collaboration-workflow/issue-template.md`) are fixed so
2
2
  // they can be found by grep — the document says so outright — yet nothing greps them, and a
3
3
  // one-directional link (an origin that lists an upstream the upstream never points back at) survives
4
- // undetected. This classifies an origin issue's filed backlinks into one of four fixed words
5
- // (joshuafolkken/kit#2123). The headings are the single source's, pinned by the document test.
4
+ // undetected. This classifies an origin issue's filed backlinks into one of four fixed words.
5
+ // The headings are the single source's, pinned by the document test.
6
6
 
7
+ import { issue_number_shape } from '#scripts/issue/issue-number-shape'
7
8
  import { markdown_section } from './markdown-section'
8
9
 
9
10
  const ORIGIN_HEADING = '## Origin'
@@ -12,7 +13,6 @@ const UPSTREAM_CANDIDATE_HEADING = '## Upstream candidate'
12
13
  const CHECKBOX_PATTERN = /^\s*-\s*\[[ xX]\]/u
13
14
  const WRONG_UPSTREAM_HEADING_PATTERN = /^##\s+Upstream\b/iu
14
15
  const BARE_REFERENCE_PATTERN = /^#\d+$/u
15
- const DIGITS_PATTERN = /^\d+$/u
16
16
  const REFERENCE_MARK = '#'
17
17
  const PATH_SEPARATOR = '/'
18
18
  const PATH_SEGMENT_COUNT = 2
@@ -28,7 +28,7 @@ interface UpstreamEntry {
28
28
  body: string
29
29
  }
30
30
 
31
- // A heading inside a code fence is example text, so neither lookup counts one (joshuafolkken/kit#3066).
31
+ // A heading inside a code fence is example text, so neither lookup counts one.
32
32
  function has_heading(body: string, heading: string): boolean {
33
33
  return markdown_section.has_line(body, heading)
34
34
  }
@@ -71,7 +71,7 @@ function is_qualified_reference(token: string): boolean {
71
71
  const [path, number, ...rest] = token.split(REFERENCE_MARK)
72
72
  if (number === undefined || rest.length > 0) return false
73
73
 
74
- return DIGITS_PATTERN.test(number) && has_two_segments(path)
74
+ return issue_number_shape.ISSUE_NUMBER_PATTERN.test(number) && has_two_segments(path)
75
75
  }
76
76
 
77
77
  function has_bare_reference(section: ReadonlyArray<string>): boolean {
@@ -134,7 +134,7 @@ function upstream_references(origin_body: string): ReadonlyArray<string> {
134
134
  // Whether classifying the origin needs the upstream bodies fetched. Only the `## Origin` back-check
135
135
  // does; a wrong, malformed or missing upstream heading is decided from the origin body alone. So the
136
136
  // CLI can skip the network for those, and never mask a `wrong-heading` verdict behind an upstream
137
- // that happens to be unreadable (joshuafolkken/kit#2123).
137
+ // that happens to be unreadable.
138
138
  function needs_upstreams(origin_body: string): boolean {
139
139
  if (has_wrong_upstream_heading(origin_body)) return false
140
140