@joshuafolkken/kit 1.1240.0 → 1.1373.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 +52 -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 +23 -66
  44. package/SECURITY.md +1 -1
  45. package/dist/CLAUDE.md +10 -61
  46. package/dist/commands/document-section-cli.js +43 -11
  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-7UBFU3CL.js} +18 -20
  51. package/dist/hooks/{chunk-ZQGD4GBY.js → chunk-7WKYHEGU.js} +8 -44
  52. package/dist/hooks/{chunk-4TZVB44A.js → chunk-AKGCP4LX.js} +285 -363
  53. package/dist/hooks/{chunk-QVSWU24O.js → chunk-BZMPVFDY.js} +7 -5
  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-XZYKEM6J.js → chunk-JCRDBQXB.js} +13 -11
  57. package/dist/hooks/{chunk-F3ELQ2AF.js → chunk-JGW24KKM.js} +4 -4
  58. package/dist/hooks/{chunk-ELCN5LCH.js → chunk-NEC4AT4Z.js} +34 -12
  59. package/dist/hooks/chunk-NZN2UFI6.js +2409 -0
  60. package/dist/hooks/{chunk-WK2XSHSI.js → chunk-SLSFIWTX.js} +550 -875
  61. package/dist/hooks/chunk-UTHMB4O2.js +1590 -0
  62. package/dist/hooks/{chunk-KRBERBBI.js → chunk-V4TKZHER.js} +4 -4
  63. package/dist/hooks/chunk-YLBBSSTF.js +3705 -0
  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 +195 -181
  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 +282 -95
  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 +17 -11
  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 +30 -5
  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 +21 -7
  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/cross-file-recheck.ts +155 -0
  560. package/scripts/lint/cspell-cached.ts +1 -1
  561. package/scripts/lint/format.ts +1 -2
  562. package/scripts/lint/lint-parallel.ts +35 -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 +6 -7
  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 +26 -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 +64 -18
  801. package/scripts/run/run-step.ts +107 -51
  802. package/scripts/run/run-stop-notify.ts +7 -8
  803. package/scripts/run/run-stranded-cli.ts +1 -1
  804. package/scripts/run/run-stranded-detect.ts +4 -4
  805. package/scripts/run/run-stranded.ts +11 -13
  806. package/scripts/run/run-tail-cli.ts +15 -16
  807. package/scripts/run/run-tail.ts +14 -33
  808. package/scripts/run/run-watcher-guard-cli.ts +3 -4
  809. package/scripts/run/run-watcher-guard.ts +11 -12
  810. package/scripts/run/run-watcher-hook.ts +6 -12
  811. package/scripts/run/ship/run-ship-cli.ts +67 -33
  812. package/scripts/run/ship/run-ship-detach.ts +15 -13
  813. package/scripts/run/ship/run-ship-lock.ts +1 -1
  814. package/scripts/run/ship/run-ship-next.ts +7 -8
  815. package/scripts/run/ship/run-ship-pre-detach.ts +27 -11
  816. package/scripts/run/ship/run-ship-preflight.ts +10 -11
  817. package/scripts/run/ship/run-ship-probe.ts +4 -4
  818. package/scripts/run/ship/run-ship-return.ts +1 -1
  819. package/scripts/run/ship/run-ship-review-steps.ts +43 -24
  820. package/scripts/run/ship/run-ship-review.ts +12 -14
  821. package/scripts/run/ship/run-ship-scoped.ts +15 -6
  822. package/scripts/run/ship/run-ship-stage.ts +80 -26
  823. package/scripts/run/ship/run-ship-steps.ts +26 -16
  824. package/scripts/run/ship/run-ship-stop-text.ts +4 -2
  825. package/scripts/run/ship/run-ship-sync.ts +9 -8
  826. package/scripts/run/ship/run-ship.ts +17 -32
  827. package/scripts/run/tidy/run-tidy-cli.ts +9 -5
  828. package/scripts/run/tidy/run-tidy-lanes.ts +18 -7
  829. package/scripts/run/tidy/run-tidy-stashes.ts +8 -8
  830. package/scripts/run/tidy/run-tidy.ts +4 -3
  831. package/scripts/run/wake/run-wake-cli.ts +27 -32
  832. package/scripts/run/wake/run-wake-describe.ts +24 -28
  833. package/scripts/run/wake/run-wake-driver.ts +14 -14
  834. package/scripts/run/wake/run-wake-handoff.ts +6 -6
  835. package/scripts/run/wake/run-wake-loop.ts +9 -9
  836. package/scripts/run/wake/run-wake-restart.ts +4 -5
  837. package/scripts/run/wake/run-wake-session.ts +23 -27
  838. package/scripts/run/wake/run-wake.ts +57 -279
  839. package/scripts/safe-chain/ci-installer-pin.ts +3 -3
  840. package/scripts/safe-chain/pack-hook.ts +2 -2
  841. package/scripts/safe-chain/preinstall-command.ts +2 -2
  842. package/scripts/security/security-audit-logic.ts +1 -1
  843. package/scripts/security/security-audit-provision-logic.ts +1 -1
  844. package/scripts/security/security-audit-provision.ts +2 -2
  845. package/scripts/security/security-audit.ts +5 -5
  846. package/scripts/security/security-updates-logic.ts +2 -3
  847. package/scripts/security/security-updates.ts +2 -4
  848. package/scripts/self-sync-guard/index.ts +1 -1
  849. package/scripts/self-sync-guard/self-sync-guard-logic.ts +2 -2
  850. package/scripts/self-sync-guard/self-sync-refusal.ts +1 -1
  851. package/scripts/sonar/sonar-hotspots-cli.ts +1 -1
  852. package/scripts/sonar/sonar-hotspots.ts +1 -1
  853. package/scripts/sonar/sonar-new-code-cli.ts +1 -1
  854. package/scripts/sonar/sonar-new-code.ts +1 -1
  855. package/scripts/sonar/sonar-project.ts +1 -1
  856. package/scripts/split/split-assess-cli.ts +1 -1
  857. package/scripts/split/split-assess.ts +3 -3
  858. package/scripts/sync/directory-copy-guard.ts +2 -3
  859. package/scripts/sync/managed-config-scope-cli.ts +1 -2
  860. package/scripts/sync/managed-config-scope.ts +4 -4
  861. package/scripts/sync/plugin-skill-directories.ts +2 -2
  862. package/scripts/sync/reconcile-templates.ts +17 -8
  863. package/scripts/sync/removed-skill-manifest.ts +2 -3
  864. package/scripts/sync/sync-ai-files.ts +7 -7
  865. package/scripts/sync/sync-configs.ts +30 -3
  866. package/scripts/sync/sync-hook-safety.ts +2 -2
  867. package/scripts/sync/sync.ts +23 -10
  868. package/scripts/sync/synced-paths.ts +2 -1
  869. package/scripts/sync/workflow-pin-logic.ts +1 -1
  870. package/scripts/test/test-declared-changed.ts +4 -4
  871. package/scripts/test/test-declared-logic.ts +2 -3
  872. package/scripts/test/test-declared-match.ts +25 -4
  873. package/scripts/test/test-declared.ts +26 -9
  874. package/scripts/test/test-red-commit.ts +3 -2
  875. package/scripts/test/test-red-logic.ts +7 -14
  876. package/scripts/test/test-red.ts +12 -47
  877. package/scripts/test/test-related-scope.ts +2 -3
  878. package/scripts/test/test-related.ts +3 -3
  879. package/scripts/test/test-type-logic.ts +1 -2
  880. package/scripts/test/test-unit-guard.ts +13 -17
  881. package/scripts/test/unit-worker-share.ts +7 -8
  882. package/scripts/time-runtime/time-agent-bundles.ts +2 -4
  883. package/scripts/time-runtime/time-background.ts +17 -21
  884. package/scripts/time-runtime/time-batch-guard.ts +67 -342
  885. package/scripts/time-runtime/time-bundle-call.ts +26 -28
  886. package/scripts/time-runtime/time-bundles.ts +11 -12
  887. package/scripts/time-runtime/time-call-identity.ts +1 -1
  888. package/scripts/time-runtime/time-command-key.ts +2 -2
  889. package/scripts/time-runtime/time-density-hook.ts +8 -11
  890. package/scripts/time-runtime/time-density.ts +5 -5
  891. package/scripts/time-runtime/time-followup-stage.ts +7 -7
  892. package/scripts/time-runtime/time-format.ts +5 -5
  893. package/scripts/time-runtime/time-hook-transcript.ts +3 -3
  894. package/scripts/time-runtime/time-instant.ts +1 -1
  895. package/scripts/time-runtime/time-markers.ts +15 -19
  896. package/scripts/time-runtime/time-phase-names.ts +3 -3
  897. package/scripts/time-runtime/time-reported-failure.ts +15 -19
  898. package/scripts/time-runtime/time-round-trips.ts +20 -23
  899. package/scripts/time-runtime/time-shell.ts +8 -8
  900. package/scripts/time-runtime/time-single-check.ts +1 -2
  901. package/scripts/time-runtime/time-spans.ts +35 -40
  902. package/scripts/time-runtime/time-tool-call.ts +15 -16
  903. package/scripts/time-runtime/time-transcript-line.ts +53 -34
  904. package/scripts/time-runtime/time-writes.ts +5 -5
  905. package/scripts/ui/ui-routes-cli.ts +1 -2
  906. package/scripts/ui/ui-routes.ts +1 -2
  907. package/scripts/version/bump-version.ts +1 -1
  908. package/scripts/version/fresh-metadata-cache.ts +2 -2
  909. package/scripts/version/latest-corepack.ts +26 -26
  910. package/scripts/version/latest-lane-guard.ts +1 -1
  911. package/scripts/version/latest-scope-cli.ts +2 -2
  912. package/scripts/version/latest-stamp.ts +1 -2
  913. package/scripts/version/latest-update.ts +2 -2
  914. package/scripts/version/npm-registry.ts +2 -2
  915. package/scripts/version/package-manager-version.ts +18 -0
  916. package/scripts/version/publishable-range-check.ts +2 -1
  917. package/scripts/version/publishable-range.ts +1 -1
  918. package/scripts/version/release-age.ts +11 -11
  919. package/scripts/version/release-hold.ts +2 -2
  920. package/scripts/version/safe-chain-version-update.ts +3 -3
  921. package/scripts/version/version-check-logic.ts +2 -3
  922. package/scripts/version/version-check.ts +1 -2
  923. package/scripts/version/version-command-config.ts +2 -2
  924. package/scripts/version/version-commands.ts +3 -3
  925. package/scripts/version/version-remote.ts +4 -4
  926. package/scripts/version/version-targets.ts +2 -2
  927. package/templates/gitignore +7 -0
  928. package/dist/hooks/chunk-KHX4U3BG.js +0 -6400
  929. package/dist/hooks/chunk-RKUAD3I6.js +0 -90
  930. package/dist/hooks/chunk-WPALEIRX.js +0 -18
  931. package/scripts/backlog/backlog-restructure.ts +0 -152
  932. package/scripts/rules/issue-fold-rule.ts +0 -72
  933. package/scripts/rules/wip-cap.ts +0 -63
  934. package/scripts/run/run-issue-number.ts +0 -19
@@ -1,5 +1,4 @@
1
- // The verdict `josh test:declared` prints, decided from the changed paths alone
2
- // (joshuafolkken/kit#2118).
1
+ // The verdict `josh test:declared` prints, decided from the changed paths alone.
3
2
  //
4
3
  // **The input is a set of paths, never a judgement.** The spelling of a test file is fixed by
5
4
  // `eslint/rules/test-filename.js` (`*.test.ts` / `*.e2e.ts`), and the mechanically-exempt non-runtime
@@ -30,7 +29,7 @@ const EXEMPT_PREFIXES: ReadonlyArray<string> = ['.idea/', '.vscode/', 'prompts/'
30
29
  const EXEMPT_SUFFIXES: ReadonlyArray<string> = ['.md']
31
30
  const BASIC_VISUAL_SUFFIXES: ReadonlyArray<string> = ['.html', '.css']
32
31
 
33
- // What stays `required` under the basic profile (joshuafolkken/kit#2820): the languages kit's own
32
+ // What stays `required` under the basic profile: the languages kit's own
34
33
  // runner can test, and the data and config formats a JS/TS test can load. Any other file — HTML/CSS, or
35
34
  // the source of a project kit does not run, such as Lua — has no test kit could execute, so `required`
36
35
  // there would be unsatisfiable; it is confirmed by hand instead. The kept side is enumerated rather than
@@ -1,7 +1,7 @@
1
1
  import { test_type_logic, type TestType } from './test-type-logic'
2
2
 
3
- // The Step 0 declaration lines checked against the tests actually in the working-tree change set
4
- // (joshuafolkken/kit#2181). `CLAUDE.md` Step 0 fixes the shape of each line —
3
+ // The Step 0 declaration lines checked against the tests actually in the working-tree change set.
4
+ // `CLAUDE.md` Step 0 fixes the shape of each line —
5
5
  // `<what changes> — Test: <Unit|E2E> — <path> — <what it verifies>` — and `testing-guide.md` §0 asks
6
6
  // that the count of declared tests match the count added, yet nothing read the correspondence. This
7
7
  // reads it: for every declaration, whether the declared type matches the path, whether the path was
@@ -11,6 +11,9 @@ import { test_type_logic, type TestType } from './test-type-logic'
11
11
  const FIELD_SEPARATOR = ' — '
12
12
  const TEST_MARKER = 'Test:'
13
13
  const TYPES: ReadonlyArray<TestType> = [test_type_logic.UNIT, test_type_logic.E2E]
14
+ // The template writes the path in a code span (`report-format.md`), so one wrapping pair of backticks
15
+ // is the path's markup, not part of it — read raw, every template-shaped line was `path-missing`.
16
+ const CODE_SPAN_PATTERN = /^`(?<path>[^`]+)`$/u
14
17
 
15
18
  type MatchStatus = 'match' | 'type-mismatch' | 'path-missing' | 'test-not-created'
16
19
 
@@ -42,6 +45,12 @@ function type_in_field(field: string): TestType | undefined {
42
45
  return TYPES.find((type) => type === value)
43
46
  }
44
47
 
48
+ function path_of(field: string): string {
49
+ const trimmed = field.trim()
50
+
51
+ return CODE_SPAN_PATTERN.exec(trimmed)?.groups?.['path'] ?? trimmed
52
+ }
53
+
45
54
  // One declaration parsed from a summary line, or undefined when the line carries no `Test:` field with
46
55
  // a recognized type and a path after it.
47
56
  function parse_line(line: string): Declaration | undefined {
@@ -54,7 +63,19 @@ function parse_line(line: string): Declaration | undefined {
54
63
  const declared_type = type_in_field(marker_field)
55
64
  if (declared_type === undefined) return undefined
56
65
 
57
- return { declared_type, path: path_field.trim() }
66
+ return { declared_type, path: path_of(path_field) }
67
+ }
68
+
69
+ function file_name_of(path: string): string {
70
+ return path.slice(directory_of(path).length)
71
+ }
72
+
73
+ // The changed paths a `path-missing` declaration probably meant — the same file name in another
74
+ // directory — so the refusal names the fix rather than leaving the reader to diff by hand.
75
+ function path_candidates(path: string, changed: ReadonlyArray<string>): ReadonlyArray<string> {
76
+ const name = file_name_of(path)
77
+
78
+ return changed.filter((candidate) => candidate !== path && file_name_of(candidate) === name)
58
79
  }
59
80
 
60
81
  function parse_declarations(summary: string): ReadonlyArray<Declaration> {
@@ -100,7 +121,7 @@ function match_report(summary: string, changed: ReadonlyArray<string>): Readonly
100
121
  }))
101
122
  }
102
123
 
103
- const test_declared_match = { directory_of, match_report, parse_declarations }
124
+ const test_declared_match = { directory_of, match_report, parse_declarations, path_candidates }
104
125
 
105
126
  export type { Declaration, MatchResult, MatchStatus }
106
127
  export { test_declared_match }
@@ -3,30 +3,32 @@ import { text } from 'node:stream/consumers'
3
3
  import { fileURLToPath } from 'node:url'
4
4
  import { project_checks } from '#scripts/gate/project-checks'
5
5
  import { cli_flags } from '#scripts/lib/cli-flags'
6
+ import { report_format_reference } from '#scripts/report/report-format-reference'
6
7
  import { test_declared_changed } from './test-declared-changed'
7
8
  import { test_declared_logic, type Verdict } from './test-declared-logic'
8
9
  import { test_declared_match, type MatchResult } from './test-declared-match'
9
10
  import { test_type_logic } from './test-type-logic'
10
11
 
11
12
  // `josh test:declared` — prints one of `required` / `exempt` / `satisfied` to stdout from the
12
- // working-tree diff, with the reason on stderr (joshuafolkken/kit#2118). The verdict is
13
+ // working-tree diff, with the reason on stderr. The verdict is
13
14
  // `test-declared-logic.ts`, the tree read is `test-declared-changed.ts`. This command is the way a
14
15
  // person confirms the same answer by hand; the refusal itself is delivered by the `test-declared` row
15
16
  // of `delivered-rules.ts` at the commit stage.
16
17
  //
17
18
  // `--match` reads a Step 0 work summary on stdin and checks each declared `Test: <type> — <path>`
18
19
  // line against the change set, printing `match` / `type-mismatch` / `path-missing` /
19
- // `test-not-created` per line and exiting non-zero on any mismatch (joshuafolkken/kit#2181).
20
+ // `test-not-created` per line and exiting non-zero on any mismatch.
20
21
 
21
22
  const CLEAN_EXIT = 0
22
23
  const MISMATCH_EXIT = 1
23
24
  const MATCH_STATUS = 'match'
25
+ const PATH_MISSING_STATUS = 'path-missing'
24
26
  const ARGV_OFFSET = 2
25
27
  const NO_DECLARATIONS =
26
28
  'no Test: declarations parsed from stdin — pipe the Step 0 work summary in, e.g. `pnpm josh test:declared --match < summary.md`'
27
29
 
28
30
  // **An unknown flag is a refusal, not a default** — `scripts/time/time-cli.ts` states the same
29
- // convention (joshuafolkken/kit#2297). Ignoring `--foo` and re-printing the verdict is what sent a
31
+ // convention. Ignoring `--foo` and re-printing the verdict is what sent a
30
32
  // reader off to read the source by hand, so a misspelled or retired flag stops here with the usage.
31
33
  const PARSE_ARGS_OPTIONS = {
32
34
  help: { type: 'boolean', short: 'h', default: false },
@@ -42,7 +44,7 @@ const USAGE = [
42
44
  ].join('\n')
43
45
 
44
46
  // The one command a `required` verdict leaves to run next: declare a test for each named runtime file,
45
- // then verify the declarations against the change set (joshuafolkken/kit#2297). Printed after the
47
+ // then verify the declarations against the change set. Printed after the
46
48
  // detail so the verdict-to-detail mapping the report test pins stays untouched.
47
49
  const NEXT_STEP =
48
50
  'next: declare a test for each runtime file above, then verify with `pnpm josh test:declared --match < summary.md`'
@@ -67,7 +69,7 @@ function next_step(verdict: Verdict): string | undefined {
67
69
  }
68
70
 
69
71
  // A runtime file with the test type its path calls for, so the required detail says which kind of
70
- // test to add rather than only that one is missing (joshuafolkken/kit#2181).
72
+ // test to add rather than only that one is missing.
71
73
  function typed_runtime_file(path: string): string {
72
74
  return `${test_type_logic.test_type_for(path)} — ${path}`
73
75
  }
@@ -76,7 +78,7 @@ const BROWSER_CHECK = 'confirm the rendered page in a browser'
76
78
  const RUN_CHECK = 'run the changed code by hand and report what you observed'
77
79
 
78
80
  // The manual confirmation a basic-profile exemption owes, one instruction per kind of file it covers:
79
- // HTML/CSS is looked at in a browser, a source kit cannot test is run by hand (joshuafolkken/kit#2820).
81
+ // HTML/CSS is looked at in a browser, a source kit cannot test is run by hand.
80
82
  function manual_instruction(paths: ReadonlyArray<string>, is_basic: boolean): string {
81
83
  const manual = test_declared_logic.manual_check_files(paths, is_basic)
82
84
  const has_visual = manual.some((path) => test_declared_logic.is_basic_visual(path))
@@ -127,8 +129,23 @@ function run(): void {
127
129
  if (next !== undefined) process.stderr.write(`${next}\n`)
128
130
  }
129
131
 
130
- function format_match(result: MatchResult): string {
131
- return `${result.status}: ${result.declared_type} — ${result.path}`
132
+ // A `path-missing` line names the changed paths it probably meant and where the declaration's shape is
133
+ // written, so the summary is fixed without reading this command's source.
134
+ function path_missing_hints(path: string, changed: ReadonlyArray<string>): ReadonlyArray<string> {
135
+ const candidates = test_declared_match.path_candidates(path, changed)
136
+ const shape = ` the declaration line's shape: ${report_format_reference.pointer(report_format_reference.SUMMARY_RULES_HEADING)}`
137
+
138
+ if (candidates.length === 0) return [shape]
139
+
140
+ return [` changed with the same file name: ${candidates.join(', ')}`, shape]
141
+ }
142
+
143
+ function format_match(result: MatchResult, changed: ReadonlyArray<string> = []): string {
144
+ const line = `${result.status}: ${result.declared_type} — ${result.path}`
145
+
146
+ if (result.status !== PATH_MISSING_STATUS) return line
147
+
148
+ return [line, ...path_missing_hints(result.path, changed)].join('\n')
132
149
  }
133
150
 
134
151
  // The exit code the match run leaves: clean only when every declaration matched, so it gates. A
@@ -143,7 +160,7 @@ function run_match(summary: string, changed: ReadonlyArray<string>): number {
143
160
  return MISMATCH_EXIT
144
161
  }
145
162
 
146
- for (const result of results) process.stdout.write(`${format_match(result)}\n`)
163
+ for (const result of results) process.stdout.write(`${format_match(result, changed)}\n`)
147
164
 
148
165
  return results.every((result) => result.status === MATCH_STATUS) ? CLEAN_EXIT : MISMATCH_EXIT
149
166
  }
@@ -1,8 +1,9 @@
1
1
  import { git_gh_issue_read } from '#scripts/gh/git-gh-issue-read'
2
+ import { session_cite } from '#scripts/issue/session-cite'
2
3
  import { test_red, type RedRun } from './test-red'
3
4
  import { test_red_logic } from './test-red-logic'
4
5
 
5
- // The commit-stage half of joshuafolkken/kit#2448: `josh git -y` on an Issue that declares itself a
6
+ // The commit-stage half of `josh test:red`: `josh git -y` on an Issue that declares itself a
6
7
  // bug fix (`test_red_logic.BUG_DECLARATION_LINE`) refuses a commit whose tests are all green on the
7
8
  // pre-fix tree.
8
9
  //
@@ -22,7 +23,7 @@ const DEFAULT_PORTS: RedCommitPorts = {
22
23
 
23
24
  function reason_for(issue_number: string, files: ReadonlyArray<string>): string {
24
25
  return (
25
- `⛔ test:red — #${issue_number} declares \`${test_red_logic.BUG_DECLARATION_LINE}\`, but every ` +
26
+ `⛔ test:red — ${session_cite.issue(issue_number)} declares \`${test_red_logic.BUG_DECLARATION_LINE}\`, but every ` +
26
27
  'changed test passes on the pre-fix tree (the merge-base), so none of them reproduces the ' +
27
28
  `reported symptom:\n ${files.join('\n ')}\n` +
28
29
  'Write a regression test at the grain the user saw the symptom (the whole output, not a ' +
@@ -1,14 +1,13 @@
1
1
  import { issue_bug_label } from '#scripts/issue/issue-bug-label'
2
+ import { json_value } from '#scripts/lib/json-value'
2
3
  import { observation_ledger } from '#scripts/observations/observation-ledger'
3
4
  import { z } from 'zod'
4
5
  import { test_declared_logic } from './test-declared-logic'
5
6
 
6
- // The verdict `josh test:red` prints, and the Issue declaration that makes `josh git -y` ask for it
7
- // (joshuafolkken/kit#2448).
7
+ // The verdict `josh test:red` prints, and the Issue declaration that makes `josh git -y` ask for it.
8
8
  //
9
9
  // **A regression test that is green on the pre-fix tree does not reproduce the reported symptom.**
10
- // joshuafolkken/kit#2308 closed with a test that never went red, and joshuafolkken/kit#2393 was the
11
- // same symptom back. `josh test:declared` only answers whether a test was added; this answers whether
10
+ // An Issue closed with such a test leaves the symptom free to come back. `josh test:declared` only answers whether a test was added; this answers whether
12
11
  // that test catches anything — the added and changed tests run against the merge-base, and at least one
13
12
  // of them has to fail there.
14
13
 
@@ -34,11 +33,11 @@ function unit_test_files(paths: ReadonlyArray<string>): Array<string> {
34
33
  .filter((path) => test_declared_logic.is_test_file(path) && path.endsWith(UNIT_TEST_SUFFIX))
35
34
  }
36
35
 
37
- // **A change whose every path is a test file has no pre-fix code to run against**
38
- // (joshuafolkken/kit#3214). The merge-base then runs the same code as HEAD, so its result equals HEAD's
36
+ // **A change whose every path is a test file has no pre-fix code to run against**.
37
+ // The merge-base then runs the same code as HEAD, so its result equals HEAD's
39
38
  // and says nothing about the fix. Exempt paths do not count: a document-rule test reads `*.md` and
40
39
  // `prompts/` files, so a change to one of those is pre-fix content the test can be red against.
41
- // Observation ledger paths do not count either way (joshuafolkken/kit#3230): a run commits its own
40
+ // Observation ledger paths do not count either way: a run commits its own
42
41
  // ledger entry, and no test reads it as pre-fix content.
43
42
  function is_test_only(paths: ReadonlyArray<string>): boolean {
44
43
  const counted = paths.filter((path) => !observation_ledger.is_ledger_path(path))
@@ -53,13 +52,7 @@ function is_test_only(paths: ReadonlyArray<string>): boolean {
53
52
  const REPORT_SCHEMA = z.object({ testResults: z.array(z.unknown()) })
54
53
 
55
54
  function ran_file_count(report: string): number {
56
- try {
57
- const parsed = REPORT_SCHEMA.safeParse(JSON.parse(report))
58
-
59
- return parsed.success ? parsed.data.testResults.length : 0
60
- } catch {
61
- return 0
62
- }
55
+ return json_value.parse_with(report, REPORT_SCHEMA)?.testResults.length ?? 0
63
56
  }
64
57
 
65
58
  // `no-test` when nothing ran; otherwise a failing run is `red` — the test caught the pre-fix tree — and
@@ -1,30 +1,25 @@
1
1
  import { existsSync } from 'node:fs'
2
- import { copyFile, mkdir, mkdtemp, readFile, rm, symlink } from 'node:fs/promises'
3
- import { tmpdir } from 'node:os'
2
+ import { copyFile, mkdir, readFile } from 'node:fs/promises'
4
3
  import path from 'node:path'
5
4
  import { fileURLToPath } from 'node:url'
5
+ import { base_tree, type BaseTree } from '#scripts/git/base-tree'
6
6
  import { change_base } from '#scripts/git/change-base'
7
7
  import { changed_paths } from '#scripts/git/changed-paths'
8
8
  import { git_location_environment } from '#scripts/git/git-location-environment'
9
- import { git_worktree } from '#scripts/git/git-worktree'
10
9
  import { execa } from 'execa'
11
10
  import { test_red_logic, type RedVerdict } from './test-red-logic'
12
11
 
13
12
  // `josh test:red` — run the added and changed Vitest files against the pre-fix tree and print `red`,
14
- // `green`, `no-test` or `test-only` (joshuafolkken/kit#2448).
13
+ // `green`, `no-test` or `test-only`.
15
14
  //
16
- // **The pre-fix tree is a detached worktree at the merge-base, never the caller's checkout.** The tests
17
- // are copied in from the working tree, so what runs is the new test against the old code, and the
18
- // caller's tree and index are never read back or written. The worktree borrows this checkout's
19
- // `node_modules` through a symlink rather than installing its own: what is being asked about is the
20
- // source the fix changed, and an install would add seconds and a network dependency to every commit.
15
+ // **The pre-fix tree is a detached worktree at the merge-base, never the caller's checkout**
16
+ // (`base-tree.ts`). The tests are copied in from the working tree, so what runs is the new test
17
+ // against the old code.
21
18
 
22
19
  const ARGV_OFFSET = 2
23
20
  const TREE_PREFIX = 'josh-test-red-'
24
- const TREE_NAME = 'tree'
25
21
  const REPORT_NAME = 'report.json'
26
- const NODE_MODULES = 'node_modules'
27
- const VITEST_BIN = path.join(NODE_MODULES, '.bin', 'vitest')
22
+ const VITEST_BIN = path.join(base_tree.NODE_MODULES, '.bin', 'vitest')
28
23
  const USAGE =
29
24
  'Usage: josh test:red — prints red / green / no-test / test-only for the changed tests on the merge-base'
30
25
 
@@ -54,12 +49,6 @@ async function copy_in(tree: string, files: ReadonlyArray<string>): Promise<void
54
49
  )
55
50
  }
56
51
 
57
- async function prepare(tree: string, base: string, files: ReadonlyArray<string>): Promise<void> {
58
- await git_worktree.worktree_add_detached(tree, base)
59
- await symlink(path.resolve(NODE_MODULES), path.join(tree, NODE_MODULES), 'dir')
60
- await copy_in(tree, files)
61
- }
62
-
63
52
  function reporter_arguments(report: string): Array<string> {
64
53
  // The plain `--outputFile`, not `--outputFile.json`: a config that sets `test.outputFile` as a string
65
54
  // wins over the keyed form, which would send the report into the tree and read every run `no-test`.
@@ -75,8 +64,7 @@ async function read_report(report: string): Promise<string> {
75
64
  // all, so a file the old config excludes is `no-test` rather than a `green` that refuses a correct fix.
76
65
  // A test that ran and broke, or a file that could not load against the old code, makes it `red`.
77
66
  async function verdict_in(
78
- parent: string,
79
- tree: string,
67
+ { parent, tree }: BaseTree,
80
68
  files: ReadonlyArray<string>,
81
69
  ): Promise<RedVerdict> {
82
70
  const report = path.join(parent, REPORT_NAME)
@@ -92,35 +80,12 @@ async function verdict_in(
92
80
  return test_red_logic.verdict_for(ran, result.exitCode !== 0)
93
81
  }
94
82
 
95
- // Best effort: a removal that fails leaves a registration `worktree prune` drops once the directory is
96
- // gone, so the cleanup never replaces the verdict with its own error.
97
- async function remove_tree(parent: string, tree: string): Promise<void> {
98
- try {
99
- await git_worktree.worktree_remove(tree)
100
- } catch {
101
- // The directory is deleted below and the prune drops the stale registration.
102
- }
103
-
104
- await rm(parent, { force: true, recursive: true })
105
-
106
- try {
107
- await git_worktree.worktree_prune()
108
- } catch {
109
- // A failed prune leaves a stale registration the next prune drops; the verdict stands.
110
- }
111
- }
112
-
113
83
  async function verdict_on(base: string, files: ReadonlyArray<string>): Promise<RedVerdict> {
114
- const parent = await mkdtemp(path.join(tmpdir(), TREE_PREFIX))
115
- const tree = path.join(parent, TREE_NAME)
116
-
117
- try {
118
- await prepare(tree, base, files)
84
+ return await base_tree.with_tree(TREE_PREFIX, base, async (pre_fix) => {
85
+ await copy_in(pre_fix.tree, files)
119
86
 
120
- return await verdict_in(parent, tree, files)
121
- } finally {
122
- await remove_tree(parent, tree)
123
- }
87
+ return await verdict_in(pre_fix, files)
88
+ })
124
89
  }
125
90
 
126
91
  // The verdict over the current checkout. No merge-base (not a repository, no default branch) reads as
@@ -6,7 +6,7 @@ import {
6
6
  type ScopeVocabulary,
7
7
  } from '#scripts/git/changed-file-scope'
8
8
 
9
- // joshuafolkken/kit#1257: the unit suite always ran whole. Measured warm on kit, that is 384 files
9
+ // The whole unit suite is expensive. Measured warm on kit, that is 384 files
10
10
  // and 6,616 tests — 13.9s wall and 110s of CPU, 84% of everything the four gate checks spend, and
11
11
  // an implementation loop paid it again on every re-check. The same tree narrowed to one changed
12
12
  // file runs 31 files and 566 tests in 2.4s (7.9s of CPU, −93%).
@@ -19,8 +19,7 @@ import {
19
19
  // The decision this file makes is which extensions vitest can walk a module graph back from, and
20
20
  // what to print about it. Everything the decision shares with `josh lint:related` — reading the
21
21
  // change, dropping what the tree no longer holds, and the two fallbacks — is
22
- // `changed-file-scope.ts`, so the two commands cannot drift apart about what "changed" means
23
- // (joshuafolkken/kit#1298).
22
+ // `changed-file-scope.ts`, so the two commands cannot drift apart about what "changed" means.
24
23
 
25
24
  type RelatedScope = ChangedFileScope
26
25
 
@@ -8,12 +8,12 @@ import { review_stamps } from '#scripts/review/review-stamps'
8
8
  import { related_scope } from './test-related-scope'
9
9
  import { test_unit_guard } from './test-unit-guard'
10
10
 
11
- // `josh test:related` — the unit check an implementation loop runs between edits
12
- // (joshuafolkken/kit#1257). The narrowing itself is `test-related-scope.ts` over the shared
11
+ // `josh test:related` — the unit check an implementation loop runs between edits.
12
+ // The narrowing itself is `test-related-scope.ts` over the shared
13
13
  // decision in `changed-file-scope.ts`; this is the process around it — how the run reaches vitest
14
14
  // through the same guard `josh test:unit` goes through.
15
15
  //
16
- // **A green run leaves a record of the tree it was green on** (joshuafolkken/kit#1511), so
16
+ // **A green run leaves a record of the tree it was green on**, so
17
17
  // `josh review:brief` can tell a tree this check has read from one it has not. What the record means,
18
18
  // and the three states in which it is withheld, are `scoped-green.ts`.
19
19
 
@@ -1,5 +1,4 @@
1
- // The test type a changed path calls for — `Unit` or `E2E` — decided from the path alone
2
- // (joshuafolkken/kit#2181).
1
+ // The test type a changed path calls for — `Unit` or `E2E` — decided from the path alone.
3
2
  //
4
3
  // **This mechanizes `prompts/testing-guide.md` §1's two-row table**, whose last line used to be "When
5
4
  // ambiguous, ask the user" — a Tier B stop on a question the path already answers. The table routes
@@ -16,7 +16,7 @@ const UNIT_GLOB = '**/*.{test,spec}.{ts,js}'
16
16
  const NODE_MODULES = 'node_modules'
17
17
 
18
18
  // **A unit check that executed nothing may report success only where the project has no unit suite
19
- // at all** (joshuafolkken/kit#1224). The two halves of "nothing ran" are not the same state:
19
+ // at all**. The two halves of "nothing ran" are not the same state:
20
20
  //
21
21
  // - **`vitest` absent is the young project.** `josh init` installs no vitest and writes no
22
22
  // `test:unit` script, so a freshly-bootstrapped project always lands here — which is the case the
@@ -26,11 +26,10 @@ const NODE_MODULES = 'node_modules'
26
26
  // project may carry vitest as an unused dependency without declaring a unit suite; zero files
27
27
  // there are reported as skipped, never as a test pass.
28
28
  //
29
- // Rejected: leaving both halves green — joshuafolkken/kit#1216's `--verbose` makes the zero count
30
- // *readable* in the CI log, but nobody reads a green log and the merge gate reads only pass/fail;
31
- // and putting the failing half behind an opt-in such as `JOSH_REQUIRE_UNIT_TESTS`, which is off in
32
- // exactly the projects that need it. The full decision, including why the absent-vitest half is
33
- // deliberately left asymmetric, is on joshuafolkken/kit#1224.
29
+ // Rejected: leaving both halves green — `--verbose` makes the zero count *readable* in the CI log,
30
+ // but nobody reads a green log and the merge gate reads only pass/fail; and putting the failing half
31
+ // behind an opt-in such as `JOSH_REQUIRE_UNIT_TESTS`, which is off in exactly the projects that need
32
+ // it.
34
33
  //
35
34
  // **`scripts/test/test-e2e-guard.ts` deliberately keeps both skips, and that divergence is not an
36
35
  // oversight.** The argument above rests on the package's presence being a declaration, and
@@ -43,9 +42,8 @@ const FAIL_ACTION = 'fail-no-tests'
43
42
  type GuardAction = 'run' | typeof SKIP_ACTION | typeof SKIP_NO_TESTS_ACTION | typeof FAIL_ACTION
44
43
 
45
44
  // The word the gate looks for to know a passing step did not actually run. Exported and reused on
46
- // both sides rather than matched by eye: joshuafolkken/kit#967 stopped printing a passing check's
47
- // body, and without this a gate that skipped the whole unit suite printed the same five lines as one
48
- // that ran it.
45
+ // both sides rather than matched by eye: the gate does not print a passing check's body, so without
46
+ // this a gate that skipped the whole unit suite would print the same lines as one that ran it.
49
47
  const SKIP_REASON = 'vitest is not installed'
50
48
  const SKIP_NO_TESTS_REASON = 'no unit test files were found in this basic project'
51
49
  const FAIL_REASON =
@@ -80,7 +78,7 @@ function has_unit_tests(project_directory: string): boolean {
80
78
  }
81
79
 
82
80
  // The guard's decision for one project, asked here once so the run, the scoped record and the gate's
83
- // precondition can never disagree about whether this project's vitest runs (joshuafolkken/kit#3136).
81
+ // precondition can never disagree about whether this project's vitest runs.
84
82
  function guard_action(project_directory: string): GuardAction {
85
83
  return resolve_guard_action(
86
84
  is_vitest_installed(project_directory),
@@ -112,12 +110,11 @@ function isolated_unit_environment(
112
110
 
113
111
  // The whole vitest invocation after the binary, not just the flags: `josh test:related` runs
114
112
  // `vitest related <files> --run` where this command runs `vitest run`, and the two must not grow
115
- // two copies of the guard, the spawn or the skip notice around that one difference
116
- // (joshuafolkken/kit#1257).
113
+ // two copies of the guard, the spawn or the skip notice around that one difference.
117
114
  // **The share is read from inside the marker, not before it.** This is the one funnel every
118
115
  // josh-driven vitest goes through — `test:unit`, `test:related` and the pre-push hook alike — so it is
119
- // where a run both learns how many others are in flight and announces itself to them
120
- // (joshuafolkken/kit#1515). The pre-push hook is the reason it is here rather than only in the gate:
116
+ // where a run both learns how many others are in flight and announces itself to them.
117
+ // The pre-push hook is the reason it is here rather than only in the gate:
121
118
  // it passed no cap at all, so vitest opened one worker per core in every lane at once.
122
119
  //
123
120
  // Reading the share first and claiming afterwards leaves a window in which two hooks firing together
@@ -147,7 +144,7 @@ const UNIT_COMMAND_LABEL = 'test:unit'
147
144
 
148
145
  // The two non-running outcomes report through different streams and different exit codes, because
149
146
  // they mean different things: one says the project has no unit suite yet, the other says it has one
150
- // that could not be found (joshuafolkken/kit#1224). Only the first keeps `SKIP_MARKER`, so the
147
+ // that could not be found. Only the first keeps `SKIP_MARKER`, so the
151
148
  // gate's "passed without running" handling still means exactly what it did.
152
149
  function report_no_run(action: Exclude<GuardAction, 'run'>, command_label: string): number {
153
150
  if (action === FAIL_ACTION) {
@@ -165,8 +162,7 @@ function report_no_run(action: Exclude<GuardAction, 'run'>, command_label: strin
165
162
 
166
163
  // `announcement` is printed only on the branch that actually spawns vitest. A caller that wrote it
167
164
  // itself would claim a run before this guard had decided there would be one — the same "a passing
168
- // step did not actually run" ambiguity `SKIP_MARKER` exists for, reintroduced one layer up
169
- // (joshuafolkken/kit#1257).
165
+ // step did not actually run" ambiguity `SKIP_MARKER` exists for, reintroduced one layer up.
170
166
  async function run_guarded_vitest(
171
167
  project_directory: string,
172
168
  vitest_arguments: ReadonlyArray<string>,
@@ -7,19 +7,18 @@ import { process_owner_schema, type ProcessOwner } from '#scripts/josh/process-o
7
7
  import { stamp_file } from '#scripts/josh/stamp-file'
8
8
  import { json_value } from '#scripts/lib/json-value'
9
9
 
10
- // How wide one vitest run may fan out when it is not the only one on the machine
11
- // (joshuafolkken/kit#1515).
10
+ // How wide one vitest run may fan out when it is not the only one on the machine.
12
11
  //
13
12
  // **`gate-plan.ts` sizes the unit suite from the core count and nothing else**, so six lanes running
14
13
  // `josh gate` at once each concluded "11 cores, take 7 workers" and put 42 workers on 11 cores. The
15
- // pre-push hook once passed no cap at all; it now runs the suite through `test_unit_guard.run_guarded_unit`
16
- // (joshuafolkken/kit#1334), the same guard `josh test:unit` uses, so the share below applies there too.
14
+ // pre-push hook once passed no cap at all; it now runs the suite through `test_unit_guard.run_guarded_unit`,
15
+ // the same guard `josh test:unit` uses, so the share below applies there too.
17
16
  // Measured on the machine this was found on — load average 14.97 in the field, and 209 in a deliberate
18
17
  // reproduction of six concurrent suites, against 22 once the share below was applied.
19
18
  //
20
19
  // **What it fixes, and what it does not.** Six concurrent copies of the full suite produced ten
21
20
  // `Test timed out in 10000ms` failures across six runs; at the share this module hands out, the same
22
- // six runs produced **none**. It is the *second* multiplicand of joshuafolkken/kit#1515 — the first
21
+ // six runs produced **none**. It is the *second* multiplicand of those timeouts — the first
23
22
  // was a live `git fetch` inside two test files, which is fixed in `test-network-guard.ts` and its
24
23
  // callers, and which no worker count would have repaired: that one failed on an idle machine at one
25
24
  // worker.
@@ -57,7 +56,7 @@ function marker_path(pid: number = process.pid): string {
57
56
  // long-lived one, so unlike a `run:hold` record its identity is a liveness test rather than a note for
58
57
  // the reader.
59
58
  //
60
- // **The pid alone was not that identity** (joshuafolkken/kit#1245). The section below already named
59
+ // **The pid alone was not that identity**. The section below already named
61
60
  // what goes wrong — a reissued pid turns a leaked marker into a permanent phantom — and answered it by
62
61
  // sweeping, which only ever collected the markers whose pid had *not* yet been reissued. Since the
63
62
  // record now carries the writing process's start time beside its pid, a reissued pid is recognized as
@@ -69,8 +68,8 @@ function marker_path(pid: number = process.pid): string {
69
68
  // readers do with it, and deliberately so.** A marker with no recorded start time — written before the
70
69
  // field existed, or on a platform where it cannot be read — resolves toward *more* sharing: being
71
70
  // wrong that way costs this run a narrower share of the machine, while being wrong the other way puts
72
- // six unit suites on eleven cores, which is the oversubscription joshuafolkken/kit#1515 measured at a
73
- // load average of 209.
71
+ // six unit suites on eleven cores, an oversubscription measured at a load
72
+ // average of 209.
74
73
  function is_running(marker: RunMarker): boolean {
75
74
  return process_identity.is_same_process(marker.pid, marker.process_start) !== false
76
75
  }
@@ -2,8 +2,7 @@ import { time_bundle_call } from './time-bundle-call'
2
2
  import { time_round_trips } from './time-round-trips'
3
3
  import { time_spans, type Span } from './time-spans'
4
4
 
5
- // Independent subagent launches that went out one per turn, when they could have fanned out in one
6
- // (joshuafolkken/kit#1854).
5
+ // Independent subagent launches that went out one per turn, when they could have fanned out in one.
7
6
  //
8
7
  // **This is a second series, deliberately kept apart from the consecutive one in `time-bundles.ts`.**
9
8
  // That one reads *consecutive* single-call turns, so a launch fired minutes apart with implementation
@@ -36,8 +35,7 @@ import { time_spans, type Span } from './time-spans'
36
35
  //
37
36
  // **A prompt that references a prior finding** (`has_prior_reference`, from `time-bundle-call.ts`). A
38
37
  // read-only investigation chain — the second question only askable once the first is answered — writes
39
- // nothing between its links, so the write test cannot see it; the marker scan is what does, and it is
40
- // the caveat joshuafolkken/kit#1847 recorded.
38
+ // nothing between its links, so the write test cannot see it; the marker scan is what does.
41
39
  //
42
40
  // **Parallel launches are one turn and cost nothing.** Launches sharing a non-empty message id were
43
41
  // issued together, so they collapse to a single turn here — the review trio is one turn, not three —