@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
@@ -6,7 +6,7 @@ import { lane_cache_run } from '#scripts/lane/lane-cache-run'
6
6
  import { buffered_process, FAIL_EXIT_CODE } from '#scripts/lib/buffered-process'
7
7
 
8
8
  const ARGV_START = 2
9
- // `--no-progress` turns off cspell's per-file `N/1607 <path> cached` line (joshuafolkken/kit#2296).
9
+ // `--no-progress` turns off cspell's per-file `N/1607 <path> cached` line.
10
10
  // Those lines ran to 1,607 of them — the whole output past the 8,000-character tool cap — so a gate
11
11
  // that failed on one unknown word buried the failure under progress and a run could read only the
12
12
  // first of several failures. The summary and the issue lines it prints are untouched; only the
@@ -19,8 +19,7 @@ async function run_step(args: ReadonlyArray<string>, directory: string): Promise
19
19
 
20
20
  // prettier first, deliberately: `eslint --fix` exits 1 whenever a non-autofixable error remains, so
21
21
  // putting it first would mean one unused variable anywhere in the tree stops prettier from running.
22
- // A basic project without Prettier or ESLint is skipped with the same reason `josh lint` prints
23
- // (joshuafolkken/kit#2693, joshuafolkken/kit#2606).
22
+ // A basic project without Prettier or ESLint is skipped with the same reason `josh lint` prints.
24
23
  async function run_unless_skipped(
25
24
  check: string,
26
25
  reason: string | undefined,
@@ -8,22 +8,35 @@ import {
8
8
  FAIL_EXIT_CODE,
9
9
  type BufferedProcessResult,
10
10
  } from '#scripts/lib/buffered-process'
11
+ import { cross_file_recheck, type CrossFileRecheckOptions } from './cross-file-recheck'
11
12
 
12
13
  const PRETTIER_ARGS = ['exec', 'prettier', '--check', '.'] as const
13
14
  // This — not the `lint:eslint` map entry — is the eslint invocation `josh gate` reaches, so the
14
- // cache flags come from the same constant the ignore rules are asserted against
15
- // (joshuafolkken/kit#1256). A copy here would keep writing the old location the day that constant
15
+ // cache flags come from the same constant the ignore rules are asserted against.
16
+ // A copy here would keep writing the old location the day that constant
16
17
  // moves, with every test still green.
17
- const ESLINT_ARGS = ['exec', 'eslint', '.', ...ESLINT_CACHE_FLAGS] as const
18
+ const WHOLE_TREE = '.'
19
+ const ESLINT_ARGS = ['exec', 'eslint', WHOLE_TREE, ...ESLINT_CACHE_FLAGS] as const
20
+ const WHOLE_TREE_RECHECK: CrossFileRecheckOptions = {
21
+ cache_file: ESLINT_CACHE_FILE,
22
+ patterns: [WHOLE_TREE],
23
+ }
18
24
 
19
- async function run_eslint(
20
- eslint_args: ReadonlyArray<string>,
21
- cache_file: string,
22
- ): Promise<BufferedProcessResult> {
23
- return await lane_cache_run.run(
24
- cache_file,
25
- async () => await buffered_process.run_buffered_process(eslint_args),
26
- )
25
+ // What one eslint run is made of: the child's arguments, and what re-reading a cached cross-file report
26
+ // (`cross-file-recheck.ts`) needs to ask the same question again — the cache file and the targets.
27
+ interface EslintRun {
28
+ args: ReadonlyArray<string>
29
+ recheck: CrossFileRecheckOptions
30
+ }
31
+
32
+ // The finished report is re-read before it is returned, inside the lane's cache sharing, because
33
+ // the re-reading uses that same cache file.
34
+ async function run_eslint(eslint: EslintRun): Promise<BufferedProcessResult> {
35
+ return await lane_cache_run.run(eslint.recheck.cache_file, async () => {
36
+ const result = await buffered_process.run_buffered_process(eslint.args)
37
+
38
+ return await cross_file_recheck.verify(result, eslint.recheck)
39
+ })
27
40
  }
28
41
 
29
42
  function write_output(result: BufferedProcessResult): void {
@@ -46,13 +59,12 @@ async function run_prettier(
46
59
 
47
60
  async function run_checked_eslint(
48
61
  directory: string,
49
- eslint_args: ReadonlyArray<string>,
50
- cache_file: string,
62
+ eslint: EslintRun,
51
63
  ): Promise<BufferedProcessResult> {
52
64
  const reason = project_checks.eslint_skip_reason(directory)
53
65
  if (reason !== undefined) return skipped('eslint', reason)
54
66
 
55
- return await run_eslint(eslint_args, cache_file)
67
+ return await run_eslint(eslint)
56
68
  }
57
69
 
58
70
  function lint_exit_code(prettier: BufferedProcessResult, eslint: BufferedProcessResult): number {
@@ -63,19 +75,23 @@ function lint_exit_code(prettier: BufferedProcessResult, eslint: BufferedProcess
63
75
 
64
76
  // The two checks are run from here whether they were pointed at the whole tree or at one change's
65
77
  // files, so `josh lint:related` reaches prettier and eslint through the same buffering, the same
66
- // "one failure does not abort the other" reading, and the same exit code (joshuafolkken/kit#1298) —
78
+ // "one failure does not abort the other" reading, and the same exit code —
67
79
  // and through the same basic-project skip, so a narrowed run never reaches a tool the whole-tree
68
- // run would have skipped (joshuafolkken/kit#2709). The skip reasons answer nothing for a full
80
+ // run would have skipped. The skip reasons answer nothing for a full
69
81
  // project, so the one path serves both profiles.
82
+ //
83
+ // A narrowed run re-reads a cached cross-file report too (`cross-file-recheck.ts`): one change's
84
+ // files can hold both the reported file and the one it reads, and fixing the second leaves the
85
+ // first's cached report standing.
70
86
  async function run_lint_checks(
71
87
  prettier_args: ReadonlyArray<string>,
72
88
  eslint_args: ReadonlyArray<string>,
73
- eslint_cache_file: string = ESLINT_CACHE_FILE,
89
+ recheck: CrossFileRecheckOptions,
74
90
  ): Promise<number> {
75
91
  const directory = process.cwd()
76
92
  const [prettier, eslint] = await Promise.all([
77
93
  run_prettier(directory, prettier_args),
78
- run_checked_eslint(directory, eslint_args, eslint_cache_file),
94
+ run_checked_eslint(directory, { args: eslint_args, recheck }),
79
95
  ])
80
96
 
81
97
  write_output(prettier)
@@ -85,7 +101,7 @@ async function run_lint_checks(
85
101
  }
86
102
 
87
103
  async function run_lint_parallel_checks(): Promise<number> {
88
- return await run_lint_checks(PRETTIER_ARGS, ESLINT_ARGS)
104
+ return await run_lint_checks(PRETTIER_ARGS, ESLINT_ARGS, WHOLE_TREE_RECHECK)
89
105
  }
90
106
 
91
107
  // `process.exitCode` rather than `process.exit()`: both reports are buffered and written here in
@@ -5,12 +5,14 @@ import {
5
5
  type ScopeInputs,
6
6
  type ScopeVocabulary,
7
7
  } from '#scripts/git/changed-file-scope'
8
- import { ESLINT_RELATED_CACHE_FLAGS } from '#scripts/josh/josh-command-types'
8
+ import {
9
+ ESLINT_RELATED_CACHE_FILE,
10
+ ESLINT_RELATED_CACHE_FLAGS,
11
+ } from '#scripts/josh/josh-command-types'
12
+ import type { CrossFileRecheckOptions } from './cross-file-recheck'
9
13
 
10
- // joshuafolkken/kit#1298: `josh lint` read the whole repository on every call, and an
11
- // implementation loop calls it after every few edits. Measured across four runs with
12
- // `pnpm josh time`, that came to 47–188 seconds per run — 18% of #1292's 1,043-second
13
- // implementation phase, spent re-reading files the change never touched.
14
+ // `josh lint` reads the whole repository on every call, and an implementation loop calls it after
15
+ // every few edits — re-reading files the change never touched.
14
16
  //
15
17
  // **This narrowing is added in front of the whole check, never in place of it.** `josh gate` still
16
18
  // runs `josh lint` over everything before the commit: a formatting rule can be broken by a file the
@@ -96,17 +98,14 @@ function prettier_arguments(files: ReadonlyArray<string>): ReadonlyArray<string>
96
98
  return [...PRETTIER_ARGS, ...files]
97
99
  }
98
100
 
99
- // The cache file is this command's own rather than the gate's, because the two run at the same time
100
- // (joshuafolkken/kit#1347). `josh gate` lints the whole tree beside the review while an
101
+ // The cache file is this command's own rather than the gate's, because the two run at the same time.
102
+ // `josh gate` lints the whole tree beside the review while an
101
103
  // implementation loop calls this command between edits, and each eslint run rewrites its cache file
102
- // whole from the copy it loaded at start-up — so on one file the run that finished last discarded
103
- // the other's entries, and a narrowed run finishing during a whole-tree run rolled the cache back to
104
- // its pre-gate state.
105
- //
106
- // **The earlier comment here claimed the opposite and was reasoning about the wrong thing.** It said
107
- // sharing let a narrowed run warm the gate's cache, since eslint leaves the entries a run did not
108
- // visit alone; that holds for pruning and says nothing about two writers. It is the same judgement
109
- // joshuafolkken/kit#1332 made for the edit hook, applied to the second place it was needed.
104
+ // whole from the copy it loaded at start-up — so on one file the run that finished last would
105
+ // discard the other's entries, and a narrowed run finishing during a whole-tree run would roll the
106
+ // cache back to its pre-gate state. Sharing would let a narrowed run warm the gate's cache only for
107
+ // pruning, which says nothing about two writers. It is the same judgement the edit hook's own cache
108
+ // file makes.
110
109
  //
111
110
  // **What is narrowed is still only the target list, never the gate.** `josh gate` runs `josh lint`
112
111
  // over the whole tree before any commit; this file decides which files a repeat call reads.
@@ -114,8 +113,19 @@ function eslint_arguments(files: ReadonlyArray<string>): ReadonlyArray<string> {
114
113
  return [...ESLINT_ARGS, ...files, ...ESLINT_RELATED_CACHE_FLAGS, ...ESLINT_SCOPED_FLAGS]
115
114
  }
116
115
 
116
+ // What re-reading a cached cross-file report (`cross-file-recheck.ts`) needs to ask the narrowed run's question
117
+ // again: the same targets, the same cache file, and the Node API's spelling of `--no-warn-ignored`.
118
+ function cross_file_recheck_options(files: ReadonlyArray<string>): CrossFileRecheckOptions {
119
+ return {
120
+ cache_file: ESLINT_RELATED_CACHE_FILE,
121
+ patterns: files,
122
+ eslint_options: { warnIgnored: false },
123
+ }
124
+ }
125
+
117
126
  const lint_related_scope = {
118
127
  COMMAND_LABEL,
128
+ cross_file_recheck_options,
119
129
  NOTHING_LINTABLE_REASON,
120
130
  describe_scope,
121
131
  eslint_arguments,
@@ -4,13 +4,12 @@ import { fileURLToPath } from 'node:url'
4
4
  import { document_byte_check } from '#scripts/document/document-byte-check'
5
5
  import { scoped_green } from '#scripts/gate/scoped-green'
6
6
  import { changed_file_scope, type ChangedFileScope } from '#scripts/git/changed-file-scope'
7
- import { ESLINT_RELATED_CACHE_FILE } from '#scripts/josh/josh-command-types'
8
7
  import { review_stamps } from '#scripts/review/review-stamps'
9
8
  import { lint_parallel } from './lint-parallel'
10
9
  import { lint_related_scope } from './lint-related-scope'
11
10
 
12
- // `josh lint:related` — the lint check an implementation loop runs between edits
13
- // (joshuafolkken/kit#1298). The narrowing itself is `lint-related-scope.ts` over the shared
11
+ // `josh lint:related` — the lint check an implementation loop runs between edits.
12
+ // The narrowing itself is `lint-related-scope.ts` over the shared
14
13
  // decision in `changed-file-scope.ts`; this is the process around it — how the run reaches the same
15
14
  // two child processes `josh lint` runs.
16
15
 
@@ -37,20 +36,20 @@ async function lint_exit_code(scope: ChangedFileScope): Promise<number> {
37
36
  return await lint_parallel.run_lint_checks(
38
37
  lint_related_scope.prettier_arguments(scope.files),
39
38
  lint_related_scope.eslint_arguments(scope.files),
40
- ESLINT_RELATED_CACHE_FILE,
39
+ lint_related_scope.cross_file_recheck_options(scope.files),
41
40
  )
42
41
  }
43
42
 
44
43
  // The byte check over the same scope the lint just ran: the resolved file list when narrowed, and
45
44
  // the whole budget when lint fell back to the whole tree — so the byte check is a superset in the
46
- // fallback exactly as lint is, never an empty list that would pass silently (joshuafolkken/kit#2176).
45
+ // fallback exactly as lint is, never an empty list that would pass silently.
47
46
  function byte_check_exit_code(scope: ChangedFileScope, root: string): number {
48
47
  if (scope.mode === 'all') return document_byte_check.check_all(root)
49
48
 
50
49
  return document_byte_check.check_files(root, scope.files)
51
50
  }
52
51
 
53
- // The lint result folded together with the fast byte-ceiling check (joshuafolkken/kit#2176): the
52
+ // The lint result folded together with the fast byte-ceiling check: the
54
53
  // same check the gate's `document-byte-budget.test.ts` runs, brought forward to this between-edits
55
54
  // path so a mandated documentation update over its ceiling surfaces in seconds. It reads no change
56
55
  // of its own — it takes the files this run already resolved, so the git contract is the lint
@@ -68,7 +67,7 @@ async function scoped_exit_code(scope: ChangedFileScope, root: string): Promise<
68
67
  // whole one, and a fallback says which of the two it was rather than looking like a narrow run
69
68
  // that found nothing.
70
69
  //
71
- // **A green run leaves a record of the tree it was green on** (joshuafolkken/kit#1511), so
70
+ // **A green run leaves a record of the tree it was green on**, so
72
71
  // `josh review:brief` can tell a tree this check has read from one it has not. What the record means,
73
72
  // and the three states in which it is withheld, are `scoped-green.ts`.
74
73
  async function run_related_lint(command_arguments: ReadonlyArray<string>): Promise<number> {
@@ -1,5 +1,5 @@
1
1
  // The public surface a downstream distribution package imports to stamp the workflows it writes.
2
2
  // Exported rather than left internal because the alternative is every distributor re-implementing
3
3
  // the header, and a second implementation that spells the token differently or stacks a duplicate
4
- // silently breaks the check that reads it (joshuafolkken/kit#844).
4
+ // silently breaks the check that reads it.
5
5
  export { managed_marker_logic } from './managed-marker-logic'
@@ -4,8 +4,7 @@ import { is_workflow_destination } from '#scripts/claude/workflow-destination'
4
4
  // answer has to survive being copied on: a consumer of a consumer receives `ci.yml` from kit and
5
5
  // `dast.yml` from app-kit, and neither distributor knows what the other manages. So the answer is
6
6
  // written into the artifact rather than kept in a list beside it — every distributor stamps its own
7
- // output, and the auto-merge workflow reads the stamp off the very file it is asking about
8
- // (joshuafolkken/kit#844).
7
+ // output, and the auto-merge workflow reads the stamp off the very file it is asking about.
9
8
  //
10
9
  // A list cannot reach that far. kit's write time is the only moment kit controls, and at that moment
11
10
  // it knows nothing of what app-kit distributes; whichever sync ran last would decide the list, and
@@ -1,3 +1,5 @@
1
+ import { issue_cite } from '#scripts/issue/issue-cite'
2
+
1
3
  type NotifyTarget = 'pr' | 'issue' | 'both'
2
4
 
3
5
  interface GitNotifyConfig {
@@ -35,14 +37,13 @@ function parse_notify_mentions(raw_mentions: string | undefined): Array<string>
35
37
  }
36
38
 
37
39
  // The `\n` escape the inline `--notify-message` form needs is expanded by `cli_body` at the point the
38
- // flag is read, not here (joshuafolkken/kit#1198). Expanding again would rewrite a literal backslash-n
40
+ // flag is read, not here. Expanding again would rewrite a literal backslash-n
39
41
  // that `--notify-message-file` legitimately carries — a file already holds real newlines, so an
40
42
  // escape sequence in one is the author's text rather than a quoting workaround.
41
43
  //
42
- // **Trimming moved up with it, and for the same reason.** This function used to read
43
- // `raw.trim().replaceAll(…)` — trim first, expand second. Keeping the trim here after the expansion
44
- // had moved reversed that order, so `--notify-message "…\n"` lost the newline its own escape had just
45
- // produced. `trim` survives only as the emptiness test, where the whitespace is being counted rather
44
+ // **Trimming happens with the expansion, and for the same reason.** Trimming here, after the
45
+ // expansion, would make `--notify-message "…\n"` lose the newline its own escape had just produced.
46
+ // `trim` survives only as the emptiness test, where the whitespace is being counted rather
46
47
  // than removed.
47
48
  function resolve_notify_message(raw_message: string | undefined): string {
48
49
  if (raw_message === undefined || raw_message.trim().length === 0) return DEFAULT_NOTIFY_MESSAGE
@@ -66,7 +67,7 @@ function build_notify_config(input: {
66
67
  }
67
68
 
68
69
  // **`notes` is what the run has to say about itself beyond the message it was handed**, and today
69
- // that is the managed config-file report (joshuafolkken/kit#1592). It is a separate field rather than
70
+ // that is the managed config-file report. It is a separate field rather than
70
71
  // text folded into `message`, because the message is the person's own completion summary and the
71
72
  // notes are the command's — folding them together would leave a caller unable to tell which half it
72
73
  // wrote. **A run with nothing to note adds no line at all**, blank separator included, so the
@@ -87,7 +88,8 @@ function build_completion_comment_body(input: {
87
88
  notes?: ReadonlyArray<string>
88
89
  }): string {
89
90
  const base_lines = [`✅ ${input.message}`]
90
- const issue_lines = input.issue_number === undefined ? [] : [`Issue: #${input.issue_number}`]
91
+ const issue_lines =
92
+ input.issue_number === undefined ? [] : [`Issue: ${issue_cite.plain(input.issue_number)}`]
91
93
  const pr_lines = input.pr_url === undefined ? [] : [`PR: ${input.pr_url}`]
92
94
  const note_lines = note_section(input.notes)
93
95
  const mention_lines = input.mentions.length === 0 ? [] : ['', input.mentions.join(' ')]
@@ -13,16 +13,16 @@ const telegram_environment_schema = z.object({
13
13
  telegram_chat_id: z.string().min(1, { message: 'TELEGRAM_CHAT_ID is required' }),
14
14
  })
15
15
 
16
- // **`warning` is not `failure`** (joshuafolkken/kit#1628). It names a run that finished and merged,
16
+ // **`warning` is not `failure`**. It names a run that finished and merged,
17
17
  // alongside something that did not work — a post-merge cleanup step that could not complete is one.
18
18
  // Sending `failure` (❌) there would say the merge failed, which is false and is
19
19
  // the more expensive lie of the two; sending `completion` (✅) twice says nothing went wrong, which
20
20
  // is the silence this type exists to end.
21
- // **`stalled` is not `warning`** (joshuafolkken/kit#2359). `warning` names a run that *finished* and
21
+ // **`stalled` is not `warning`**. `warning` names a run that *finished* and
22
22
  // merged alongside something that did not work; a stall is the opposite — the run is alive and has not
23
23
  // finished, it has simply stopped advancing while ready work waits for a free lane. The ⏳ icon says
24
24
  // exactly that: not done, not broken, just not moving.
25
- // **`stranded` is not `stalled`** (joshuafolkken/kit#2375). A stall is a *live* run that is not
25
+ // **`stranded` is not `stalled`**. A stall is a *live* run that is not
26
26
  // dispatching; a strand is the step before it — the run's own driver is gone. The session that cut the
27
27
  // budget handed it off and died, no successor claimed it, and no supervisor is watching, so nothing can
28
28
  // take the next step at all. The 🚨 icon says a run needs a hand, not that ready work is merely waiting.
@@ -35,6 +35,7 @@ type TelegramTaskType =
35
35
  | 'confirmation'
36
36
  | 'stalled'
37
37
  | 'stranded'
38
+ | 'progress'
38
39
 
39
40
  interface TelegramSendInput {
40
41
  task_type: TelegramTaskType
@@ -64,6 +65,7 @@ const TASK_DEFINITIONS: Record<TelegramTaskType, TaskDefinition> = {
64
65
  confirmation: { icon: '⏸️', label: 'Confirmation required' },
65
66
  stalled: { icon: '⏳', label: 'Ready work is sitting undispatched' },
66
67
  stranded: { icon: '🚨', label: 'Run stranded — nobody is driving it' },
68
+ progress: { icon: '📊', label: 'Progress' },
67
69
  }
68
70
 
69
71
  const NOTIFY_SWITCH_KEY = 'JOSH_NOTIFY'
@@ -82,9 +84,8 @@ function parse_environment_string(value: string | undefined): string {
82
84
  // so it would pull a subprocess concern into an HTTP one and degrade to exactly this line anyway.
83
85
  // **The `cause` is read, not only the message.** A `fetch` rejection's own message is the bare string
84
86
  // `fetch failed`; what says whether this was DNS, a refused connection or a timeout lives one level
85
- // down. Reporting the top line alone would exit non-zero with nothing a reader can act on, which is
86
- // half of what joshuafolkken/kit#1564 set out to fix. Redaction runs over the joined text, so the
87
- // deeper line is covered exactly as the top one is.
87
+ // down. Reporting the top line alone would exit non-zero with nothing a reader can act on.
88
+ // Redaction runs over the joined text, so the deeper line is covered exactly as the top one is.
88
89
  function join_cause(error: Error): string {
89
90
  const { cause } = error
90
91
 
@@ -114,17 +115,14 @@ function describe_symptom(error: unknown): string {
114
115
 
115
116
  // The request URL carries the bot token in its own path, so an error raised anywhere near the
116
117
  // request can carry a credential into a log. Both values are taken out of the text before it leaves
117
- // this module, so no caller has to remember to do it (joshuafolkken/kit#1564).
118
+ // this module, so no caller has to remember to do it.
118
119
  function redact_credentials(text: string, config: TelegramConfig): string {
119
120
  return text.split(config.bot_token).join(REDACTED).split(config.chat_id).join(REDACTED)
120
121
  }
121
122
 
122
- // **Missing credentials are a failure, not a skip** (joshuafolkken/kit#1564). This used to warn and
123
- // return `undefined`, and `send` then returned quietly — so a run with no credentials was
124
- // indistinguishable from one whose notification arrived. Until this Issue the mandatory
125
- // `--env-file=.env` flag on `josh notify` and `josh followup` made a machine without that file die
126
- // before node started, which was loud by accident; with the flag relaxed to the optional form, this
127
- // is where the noise has to come from instead.
123
+ // **Missing credentials are a failure, not a skip**: a run with no credentials that returned quietly
124
+ // would be indistinguishable from one whose notification arrived. `josh notify` and `josh followup`
125
+ // load `.env` only optionally, so this is where the noise has to come from.
128
126
  //
129
127
  // The message names the variables and never their values — the schema's own messages are the
130
128
  // variable names, so nothing read out of the environment reaches it.
@@ -143,10 +141,10 @@ function load_config(): TelegramConfig {
143
141
  return { bot_token: result.data.telegram_bot_token, chat_id: result.data.telegram_chat_id }
144
142
  }
145
143
 
146
- // **An explicit opt-out is not a missing credential** (joshuafolkken/kit#2821). A consumer who never
147
- // meant to use Telegram had no way to say so, so every stop printed the #1564 failure as noise. Only
148
- // the stated value `off` disables the send: an unset or mistyped switch still falls through to
149
- // `load_config`, so a forgotten setup stays the loud failure #1564 made it.
144
+ // **An explicit opt-out is not a missing credential**: a consumer who never means to use Telegram
145
+ // says so, rather than seeing the missing-credential failure on every stop. Only the stated value
146
+ // `off` disables the send: an unset or mistyped switch still falls through to `load_config`, so a
147
+ // forgotten setup stays a loud failure.
150
148
  function is_notify_disabled(): boolean {
151
149
  return parse_environment_string(process.env[NOTIFY_SWITCH_KEY]).toLowerCase() === NOTIFY_OFF_VALUE
152
150
  }
@@ -204,10 +202,9 @@ function head_of(body: string, kept: number): string {
204
202
  return TRAILING_HIGH_SURROGATE.test(head) ? head.slice(0, -1) : head
205
203
  }
206
204
 
207
- // **The body is cut to fit Telegram's length limit, keeping its head** (joshuafolkken/kit#3242). A
208
- // warning carrying a whole driver stderr ran past 4096 characters and was refused with `400 Bad
209
- // Request`, so it reached nobody. A caller puts the cause first, so the tail is what is dropped, and the
210
- // header and the URLs around the body survive.
205
+ // **The body is cut to fit Telegram's length limit, keeping its head**: a text past the limit is
206
+ // refused with `400 Bad Request` and reaches nobody. A caller puts the cause first, so the tail is
207
+ // what is dropped, and the header and the URLs around the body survive.
211
208
  function build_text(input: TelegramSendInput): string {
212
209
  const text = join_blocks(input)
213
210
  const overflow = text.length - TELEGRAM_TEXT_LIMIT
@@ -230,7 +227,7 @@ async function post_message(config: TelegramConfig, text: string): Promise<void>
230
227
  }
231
228
  }
232
229
 
233
- // **The cause is re-wrapped rather than passed through** (joshuafolkken/kit#1564). The chain is kept,
230
+ // **The cause is re-wrapped rather than passed through**. The chain is kept,
234
231
  // because a symptom error that drops its cause loses where the failure came from — but the original
235
232
  // is the one object on this path nothing has redacted, and `git_error.handle` prints a cause's own
236
233
  // message straight to the console. Both layers therefore carry the same already-redacted text.
@@ -241,9 +238,8 @@ function build_send_failure(error: unknown, config: TelegramConfig): Error {
241
238
  }
242
239
 
243
240
  // **The strict form.** A caller whose whole job is the notification has nothing left to report when
244
- // this fails, so it throws and `pnpm josh notify` exits non-zero. joshuafolkken/kit#1564 measured
245
- // the state this replaces: three notifications lost to a `504 Gateway Time-out`, each one printing a
246
- // warning and exiting 0, so a message that reached nobody looked exactly like one that arrived.
241
+ // this fails, so it throws and `pnpm josh notify` exits non-zero — a warning and exit 0 would make a
242
+ // message that reached nobody look exactly like one that arrived.
247
243
  //
248
244
  // The failure it throws carries a `cause`, and that cause is redacted too — see `build_send_failure`.
249
245
  //
@@ -272,13 +268,12 @@ async function send(input: TelegramSendInput): Promise<void> {
272
268
 
273
269
  // **The tolerant form**, for a caller whose job is something other than the notification.
274
270
  // `followup` sends the completion message on its way to the merge, and a gateway timeout at
275
- // Telegram is not a reason to leave a reviewed, green pull request unmerged — joshuafolkken/kit#1564
276
- // measured exactly that 504 with six lanes running at once. So the failure is reported and the run
277
- // carries on.
271
+ // Telegram is not a reason to leave a reviewed, green pull request unmerged. So the failure is
272
+ // reported and the run carries on.
278
273
  //
279
274
  // **Reported under `❗` on stderr, in its own block, with the caller's own recovery line** — the bar
280
- // joshuafolkken/kit#1539 set for a step that failed and was not allowed to end the run. The `⚠️`
281
- // this used to print is what every routine notice prints, which is how the failure got buried.
275
+ // for a step that failed and was not allowed to end the run. A `⚠️` is what every routine notice
276
+ // prints, so the failure would be buried under one.
282
277
  //
283
278
  // `recovery` is the caller's because only the caller knows one. It is `string | undefined` and not
284
279
  // optional for the reason `CleanupStep.recovery` is: a caller with no command that finishes the job
@@ -326,7 +321,7 @@ interface WarningInput {
326
321
  /**
327
322
  * Warn that something an unattended run depended on did not work.
328
323
  *
329
- * **One function rather than one per caller** (joshuafolkken/kit#1749). Every warning fills in the
324
+ * **One function rather than one per caller**. Every warning fills in the
330
325
  * same four fields the same way — the task type, the repository looked up under the same bound, and
331
326
  * two urls that are never known here — so a second caller composing its own would be free to drift
332
327
  * on the one field that is not obvious: a repository lookup with no timeout hangs the warning behind
@@ -354,8 +349,7 @@ interface ConfirmInput {
354
349
 
355
350
  /**
356
351
  * Push the ⏸️ confirmation type — a state change an unattended run made that a person now has to act
357
- * on, a `backlogrun` that stopped needing a decision being the one this was written for
358
- * (joshuafolkken/kit#2136).
352
+ * on, a `backlogrun` that stopped needing a decision being the one this was written for.
359
353
  *
360
354
  * **One function rather than one per caller, for `warn`'s reason exactly**: the repository lookup
361
355
  * under a timeout is the field a second caller composing the four itself would drift on, and a lookup
@@ -384,8 +378,8 @@ interface StalledInput {
384
378
  }
385
379
 
386
380
  /**
387
- * Push the ⏳ stalled type — ready backlog work with a free lane that nothing has dispatched for a while
388
- * (joshuafolkken/kit#2359). Off-screen is the whole point: the state is invisible on the terminal until
381
+ * Push the ⏳ stalled type — ready backlog work with a free lane that nothing has dispatched for a while.
382
+ * Off-screen is the whole point: the state is invisible on the terminal until
389
383
  * a person asks, so it reaches them where they are not watching.
390
384
  *
391
385
  * **`warn`'s shape exactly** — the repository looked up under the shared bound, the tolerant
@@ -413,8 +407,8 @@ interface StrandedInput {
413
407
  }
414
408
 
415
409
  /**
416
- * Push the 🚨 stranded type — a run whose driver is gone and which nothing can advance
417
- * (joshuafolkken/kit#2375). Off-screen is the whole point, as it is for `stalled`: the state is
410
+ * Push the 🚨 stranded type — a run whose driver is gone and which nothing can advance.
411
+ * Off-screen is the whole point, as it is for `stalled`: the state is
418
412
  * invisible on the terminal because the session that would show it has died, so the person hears about
419
413
  * it where they are not watching, rather than by asking.
420
414
  *
@@ -437,8 +431,30 @@ async function stranded(input: StrandedInput): Promise<boolean> {
437
431
  )
438
432
  }
439
433
 
434
+ /**
435
+ * Push the 📊 progress type — one `run:board` frame a person asked to receive periodically off-screen
436
+ * with `run:board --every`. Never a heartbeat: nothing sends it unasked.
437
+ *
438
+ * **`stranded`'s shape exactly**, with the board's own one-frame answer as the recovery — a frame lost
439
+ * to a Telegram timeout is read again by asking for it.
440
+ */
441
+ async function progress(body: string): Promise<boolean> {
442
+ return await send_or_report(
443
+ {
444
+ task_type: 'progress',
445
+ repo_name: gh_spawn.get_repo_name_with_owner_within(REPO_LOOKUP_TIMEOUT_MS),
446
+ issue_title: undefined,
447
+ body,
448
+ issue_url: undefined,
449
+ pr_url: undefined,
450
+ },
451
+ 'pnpm josh run:board --chat',
452
+ )
453
+ }
454
+
440
455
  const telegram_notify = {
441
456
  confirm,
457
+ progress,
442
458
  send,
443
459
  send_or_report,
444
460
  stalled,
@@ -44,7 +44,7 @@ function parse_task_type(raw: string | undefined): TelegramTaskType {
44
44
 
45
45
  // A flag counts as given only when it carries text, so `--issue-title ''` is not an answer. The
46
46
  // callers that *skip* a lookup because the flag already answered it read the same predicate, or the
47
- // two could disagree about an empty string and leave the field blank (joshuafolkken/kit#903).
47
+ // two could disagree about an empty string and leave the field blank.
48
48
  // It is `cli_body`'s predicate rather than a second copy: the body flags are resolved there, and two
49
49
  // definitions of "given" would let `--body ''` count on one side and not the other.
50
50
  const has_flag_value = cli_body.has_value
@@ -56,8 +56,8 @@ function coalesce(primary: string | undefined, fallback: string | undefined): st
56
56
  }
57
57
 
58
58
  // `--body-file` is the form to reach for whenever the body carries a backtick or a `$`: inside shell
59
- // double quotes those are evaluated before this process starts, and the text runs
60
- // (joshuafolkken/kit#1198). The resolution itself is `cli_body`'s, shared with `josh followup`.
59
+ // double quotes those are evaluated before this process starts, and the text runs.
60
+ // The resolution itself is `cli_body`'s, shared with `josh followup`.
61
61
  function normalize_body(values: CliValues): string | undefined {
62
62
  return cli_body.resolve({
63
63
  inline: values.body,