@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
@@ -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
@@ -5,18 +5,24 @@ import { issue_file } from './issue-file'
5
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 (joshuafolkken/kit#3360): a release is Tier C, so only a
15
+ // A `release` Issue is never opted in either: a release is Tier C, so only a
16
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.
17
21
 
18
22
  interface AutoOkSignals {
19
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
20
26
  // The filing carries the `release` label.
21
27
  is_release: boolean
22
28
  is_carried: boolean
@@ -39,6 +45,10 @@ const RELEASE: AutoOkDecision = {
39
45
  is_applied: false,
40
46
  reason: `a ${RELEASE_LABEL} Issue is opted in by a person only`,
41
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
+ }
42
52
  const CARRIED: AutoOkDecision = { is_applied: true, reason: 'a backlogrun carry record is live' }
43
53
  const BRANCH_OPTED_IN: AutoOkDecision = {
44
54
  is_applied: true,
@@ -49,18 +59,21 @@ const NOT_OPTED_IN: AutoOkDecision = {
49
59
  reason: 'no backlogrun carry record is live and the branch names no auto-ok Issue',
50
60
  }
51
61
 
52
- type Withholding = Pick<AutoOkSignals, 'is_opted_out' | 'is_release'>
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'>
53
65
 
54
- // The two signals that withhold `auto-ok` before any other is read, or `undefined` when neither holds.
66
+ // The three signals that withhold `auto-ok` before any other is read, or `undefined` when none holds.
55
67
  function withheld(signals: Withholding): AutoOkDecision | undefined {
56
68
  if (signals.is_opted_out) return OPTED_OUT
57
69
  if (signals.is_release) return RELEASE
70
+ if (signals.is_requested) return REQUESTED
58
71
 
59
72
  return undefined
60
73
  }
61
74
 
62
- // The opt-out and the `release` label win over every signal, then the carry record, then the branch's
63
- // Issue.
75
+ // The opt-out, the `release` label and `--requested` win over every signal, then the carry record,
76
+ // then the branch's Issue.
64
77
  function decide(signals: AutoOkSignals): AutoOkDecision {
65
78
  const decision = withheld(signals)
66
79
 
@@ -99,12 +112,12 @@ async function branch_labels(current: string): Promise<ReadonlyArray<string> | u
99
112
  // Each read is skipped once an earlier signal has already decided the answer; a cross-repository
100
113
  // filing is refused before any signal is read. `labels` are the ones the filing declares.
101
114
  async function resolve(
102
- is_opted_out: boolean,
115
+ declared: AutoOkDeclared,
103
116
  target: string,
104
117
  current: string,
105
118
  labels: ReadonlyArray<string> = [],
106
119
  ): Promise<AutoOkDecision> {
107
- const withholding = { is_opted_out, is_release: has_label_name(labels, RELEASE_LABEL) }
120
+ const withholding = { ...declared, is_release: has_label_name(labels, RELEASE_LABEL) }
108
121
  const decision = withheld(withholding)
109
122
 
110
123
  if (decision !== undefined) return decision
@@ -116,5 +129,5 @@ async function resolve(
116
129
 
117
130
  const issue_auto_ok = { decide, line_of, resolve }
118
131
 
119
- export type { AutoOkDecision, AutoOkSignals }
132
+ export type { AutoOkDeclared, AutoOkDecision, AutoOkSignals }
120
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
 
@@ -1,19 +1,20 @@
1
1
  #!/usr/bin/env tsx
2
2
  import { fileURLToPath } from 'node:url'
3
- import { parseArgs } from 'node:util'
4
3
  import { git_gh_command } from '#scripts/gh/git-gh-command'
5
4
  import type { IssueRead } from '#scripts/gh/git-gh-issue-read'
6
5
  import { bounded_pool } from '#scripts/lib/bounded-pool'
6
+ import { cli_flags } from '#scripts/lib/cli-flags'
7
+ import { json_value } from '#scripts/lib/json-value'
7
8
  import { z } from 'zod'
8
9
  import { issue_cite, type CiteTarget } from './issue-cite'
9
10
 
10
11
  // `josh issue:cite <N> [<N> ...] [--repo <owner/repo>]` — the paste-ready citation line for every
11
- // Issue named, in one call (joshuafolkken/kit#2220).
12
+ // Issue named, in one call.
12
13
  //
13
- // It answers the cost that made the bare `#N` cheaper than the correct citation: the title each line
14
- // needs used to be a per-Issue `gh api` read, and naming several Issues at once — a backlog listing, a
15
- // lane status report — meant several round trips before a single correct line could be written. The
16
- // numbers go in together and the titles come back together, so the correct form is now the cheap one.
14
+ // It answers the cost that makes the bare `#N` cheaper than the correct citation: a per-Issue
15
+ // `gh api` read for each title means several round trips before a single correct line of a backlog
16
+ // listing or lane status report can be written. The numbers go in together and the titles come back
17
+ // together, so the correct form is the cheap one.
17
18
  //
18
19
  // **A token that is not a number refuses the whole invocation**, exactly as `issue:read` does: an
19
20
  // argument the parser cannot read is a mistake, and dropping it answers fewer Issues than were asked
@@ -30,6 +31,7 @@ const READ_CONCURRENCY = 8
30
31
  const TITLE_FIELD = 'title'
31
32
  const LINE_SEPARATOR = '\n'
32
33
  const USAGE = 'Usage: josh issue:cite <issue-number|owner/repo#N> [ ... ] [--repo <owner/repo>]'
34
+ const OPTIONS = { repo: { type: 'string' } } as const
33
35
 
34
36
  const title_schema = z.looseObject({ title: z.string() })
35
37
 
@@ -38,13 +40,9 @@ type LineResult = { kind: 'ok'; line: string } | { kind: 'fail'; line: string }
38
40
  // The title out of the one-field read, or `undefined` for an empty or unparseable one — an empty title
39
41
  // is not a summary, so it is reported as a read that produced nothing rather than cited as a blank.
40
42
  function parse_title(json: string): string | undefined {
41
- try {
42
- const title = title_schema.parse(JSON.parse(json)).title.trim()
43
+ const title = json_value.parse_with(json, title_schema)?.title.trim()
43
44
 
44
- return title === '' ? undefined : title
45
- } catch {
46
- return undefined
47
- }
45
+ return title === '' ? undefined : title
48
46
  }
49
47
 
50
48
  // A read's outcome as one line: the citation on success, the matching failure line otherwise. The
@@ -115,13 +113,17 @@ function report(results: ReadonlyArray<LineResult>): number {
115
113
  return failures.length === 0 ? SUCCESS_EXIT_CODE : FAILURE_EXIT_CODE
116
114
  }
117
115
 
116
+ // The targets the command line names, or `undefined` for a line nobody can read — an unknown flag and
117
+ // a `--repo` given no value are refused with the same usage a non-numeric token is.
118
+ function read_targets(args: ReadonlyArray<string>): ReadonlyArray<CiteTarget> | undefined {
119
+ const parsed = cli_flags.arguments_of(args, OPTIONS)
120
+ if (parsed === undefined) return undefined
121
+
122
+ return parse_targets(parsed.positionals, parsed.values.repo)
123
+ }
124
+
118
125
  async function run(args: ReadonlyArray<string>): Promise<number> {
119
- const parsed = parseArgs({
120
- args: [...args],
121
- options: { repo: { type: 'string' } },
122
- allowPositionals: true,
123
- })
124
- const targets = parse_targets(parsed.positionals, parsed.values.repo)
126
+ const targets = read_targets(args)
125
127
 
126
128
  if (targets === undefined) {
127
129
  console.error(USAGE)