@joshuafolkken/kit 1.1229.0 → 1.1370.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (939) hide show
  1. package/.claude/agents/investigator.md +1 -0
  2. package/.claude/settings.json +4 -0
  3. package/.claude/skills/dependency-update/SKILL.md +5 -3
  4. package/.claude/skills/epic-commands/SKILL.md +82 -113
  5. package/.claude/skills/epic-commands/epic-bundle.md +38 -63
  6. package/.claude/skills/epic-commands/execution-waves.md +30 -51
  7. package/.claude/skills/verify-ui/SKILL.md +13 -20
  8. package/.claude/skills/workflow-commands/SKILL.md +10 -10
  9. package/.claude/skills/workflow-commands/background-commands.md +4 -4
  10. package/.claude/skills/workflow-commands/backlogrun-child.md +30 -105
  11. package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +29 -0
  12. package/.claude/skills/workflow-commands/backlogrun-lanes.md +45 -131
  13. package/.claude/skills/workflow-commands/backlogrun-park.md +36 -53
  14. package/.claude/skills/workflow-commands/backlogrun-progress.md +81 -331
  15. package/.claude/skills/workflow-commands/backlogrun-recovery.md +29 -83
  16. package/.claude/skills/workflow-commands/backlogrun-steps.md +105 -424
  17. package/.claude/skills/workflow-commands/backlogrun.md +50 -61
  18. package/.claude/skills/workflow-commands/chain-rule.md +36 -40
  19. package/.claude/skills/workflow-commands/entry-sequence.md +6 -6
  20. package/.claude/skills/workflow-commands/followup.md +24 -20
  21. package/.claude/skills/workflow-commands/fullrun-steps.md +23 -27
  22. package/.claude/skills/workflow-commands/fullrun.md +10 -10
  23. package/.claude/skills/workflow-commands/halfrun.md +9 -8
  24. package/.claude/skills/workflow-commands/into-target.md +12 -18
  25. package/.claude/skills/workflow-commands/issue-comments.md +11 -26
  26. package/.claude/skills/workflow-commands/kickoff.md +27 -16
  27. package/.claude/skills/workflow-commands/latest-gate.md +18 -29
  28. package/.claude/skills/workflow-commands/needs-human-review.md +13 -24
  29. package/.claude/skills/workflow-commands/observation-filing.md +37 -28
  30. package/.claude/skills/workflow-commands/observation-ledger.md +48 -38
  31. package/.claude/skills/workflow-commands/pre-gate-cut.md +9 -9
  32. package/.claude/skills/workflow-commands/prerequisite.md +23 -15
  33. package/.claude/skills/workflow-commands/progress-watcher.md +17 -11
  34. package/.claude/skills/workflow-commands/prrun.md +3 -3
  35. package/.claude/skills/workflow-commands/retrospective.md +13 -18
  36. package/.claude/skills/workflow-commands/split-assessment.md +6 -4
  37. package/.claude/skills/workflow-commands/target-repository.md +25 -28
  38. package/.claude/skills/workflow-commands/working-tree-hold.md +11 -17
  39. package/.gitattributes +2 -1
  40. package/.github/workflows/ci.yml +14 -0
  41. package/.github/workflows/publish.yml +2 -0
  42. package/.vscode/tasks.json +14 -0
  43. package/CLAUDE.md +10 -61
  44. package/README.md +38 -57
  45. package/SECURITY.md +1 -1
  46. package/dist/CLAUDE.md +10 -61
  47. package/dist/commands/document-section-cli.js +42 -10
  48. package/dist/config-merge/index.js +11 -2
  49. package/dist/hooks/audit-provision.js +2 -2
  50. package/dist/hooks/batch-guard.js +7 -7
  51. package/dist/hooks/{chunk-FIVDHQGT.js → chunk-43G45XJF.js} +18 -20
  52. package/dist/hooks/{chunk-JUDKDCDP.js → chunk-4TW4MQUL.js} +284 -362
  53. package/dist/hooks/{chunk-5VMKCCC4.js → chunk-76RK6E3H.js} +13 -11
  54. package/dist/hooks/{chunk-RNWHN5BP.js → chunk-DZWZ3DKY.js} +4 -4
  55. package/dist/hooks/{chunk-5VNDSNG3.js → chunk-FZ6FUSBM.js} +1 -1
  56. package/dist/hooks/{chunk-VC3PZPZO.js → chunk-GG72ANKI.js} +1 -1
  57. package/dist/hooks/{chunk-6HJJXRBX.js → chunk-KPM4YIIX.js} +8 -44
  58. package/dist/hooks/chunk-MXVQMLDP.js +3705 -0
  59. package/dist/hooks/{chunk-ELCN5LCH.js → chunk-NEC4AT4Z.js} +34 -12
  60. package/dist/hooks/{chunk-TQNPDZNH.js → chunk-NZBHG6FW.js} +7 -5
  61. package/dist/hooks/chunk-NZN2UFI6.js +2409 -0
  62. package/dist/hooks/{chunk-F56MFS4B.js → chunk-R6CRQEAL.js} +4 -4
  63. package/dist/hooks/chunk-SYSRHRWU.js +1589 -0
  64. package/dist/hooks/{chunk-55HHG5PX.js → chunk-TLJYAGZK.js} +799 -903
  65. package/dist/hooks/chunk-Z5TMJIPW.js +45 -0
  66. package/dist/hooks/codex-hook-adapter.js +26 -21
  67. package/dist/hooks/duplicate-read-guard.js +8 -8
  68. package/dist/hooks/format-edited.js +4 -4
  69. package/dist/hooks/inputs.json +213 -197
  70. package/dist/hooks/investigation-guard.js +8 -8
  71. package/dist/hooks/pretool-guard.js +15 -15
  72. package/dist/hooks/session-lang.js +406 -8
  73. package/dist/hooks/stop-guard.js +122 -201
  74. package/dist/josh.js +540 -137
  75. package/dist/version/index.js +15 -13
  76. package/eslint/base.js +43 -5
  77. package/eslint/rules/english-only-prose.js +3 -3
  78. package/eslint/rules/import.js +12 -0
  79. package/eslint/rules/namespace-object-export.js +2 -2
  80. package/package.json +16 -10
  81. package/pnpm-workspace.yaml +2 -4
  82. package/prompts/coding-standards.md +14 -48
  83. package/prompts/collaboration-workflow/file-edits.md +1 -1
  84. package/prompts/collaboration-workflow/issue-citation.md +1 -1
  85. package/prompts/collaboration-workflow/issue-template.md +4 -10
  86. package/prompts/collaboration-workflow/operating-rules.md +7 -8
  87. package/prompts/collaboration-workflow/output-bounds.md +1 -1
  88. package/prompts/collaboration-workflow/overview.md +1 -1
  89. package/prompts/collaboration-workflow/plan-comment.md +2 -1
  90. package/prompts/collaboration-workflow/principles.md +21 -3
  91. package/prompts/collaboration-workflow/report-format.md +16 -29
  92. package/prompts/collaboration-workflow/residency.md +1 -1
  93. package/prompts/collaboration-workflow/rule-delivery.md +7 -95
  94. package/prompts/collaboration-workflow/shell-body.md +3 -23
  95. package/prompts/collaboration-workflow/turn-batching.md +4 -13
  96. package/prompts/collaboration-workflow/wip-cap.md +5 -11
  97. package/prompts/refactoring.md +1 -1
  98. package/prompts/review-rubric.md +3 -22
  99. package/prompts/review.md +15 -38
  100. package/prompts/testing-guide.md +2 -4
  101. package/scripts/adopt/adopt-logic.ts +5 -5
  102. package/scripts/adopt/adopt-toolkits.ts +4 -5
  103. package/scripts/adopt/adopt.ts +2 -3
  104. package/scripts/agent/agent-argv.ts +7 -7
  105. package/scripts/agent/agent-diagnostics.ts +2 -2
  106. package/scripts/agent/agent-exit-record.ts +1 -1
  107. package/scripts/agent/agent-headless.ts +1 -1
  108. package/scripts/agent/agent-launch-environment.ts +6 -1
  109. package/scripts/agent/agent-role-profile.ts +49 -22
  110. package/scripts/agent/agent-session-role.ts +32 -0
  111. package/scripts/agent/api-outage.ts +1 -1
  112. package/scripts/agent/claude-agent-argv.ts +4 -4
  113. package/scripts/agent/claude-result-event.ts +4 -4
  114. package/scripts/agent/codex-hooks.ts +2 -2
  115. package/scripts/agent/interactive-ask.ts +3 -6
  116. package/scripts/auto-ok/auto-ok-cli.ts +46 -60
  117. package/scripts/backlog/backlog-arrival-added.ts +34 -0
  118. package/scripts/backlog/backlog-arrival.ts +54 -17
  119. package/scripts/backlog/backlog-budget-cli.ts +34 -6
  120. package/scripts/backlog/backlog-budget.ts +17 -24
  121. package/scripts/backlog/backlog-defect-priority.ts +1 -1
  122. package/scripts/backlog/backlog-drive-args.ts +5 -4
  123. package/scripts/backlog/backlog-drive-cli.ts +14 -10
  124. package/scripts/backlog/backlog-drive-epic.ts +85 -0
  125. package/scripts/backlog/backlog-drive-launch.ts +1 -1
  126. package/scripts/backlog/backlog-drive-named-offer.ts +60 -9
  127. package/scripts/backlog/backlog-drive-named.ts +39 -9
  128. package/scripts/backlog/backlog-drive-offer-argv.ts +1 -1
  129. package/scripts/backlog/backlog-drive-restore.ts +1 -1
  130. package/scripts/backlog/backlog-drive-retrospective.ts +2 -2
  131. package/scripts/backlog/backlog-drive.ts +43 -28
  132. package/scripts/backlog/backlog-idle.ts +88 -0
  133. package/scripts/backlog/backlog-named.ts +11 -15
  134. package/scripts/backlog/backlog-next.ts +26 -30
  135. package/scripts/backlog/backlog-offer-cli.ts +28 -23
  136. package/scripts/backlog/backlog-offer.ts +7 -7
  137. package/scripts/backlog/backlog-overlap.ts +178 -0
  138. package/scripts/backlog/backlog-plan-cli.ts +14 -90
  139. package/scripts/backlog/backlog-plan-read.ts +111 -0
  140. package/scripts/backlog/backlog-plan.ts +11 -10
  141. package/scripts/backlog/backlog-pool.ts +13 -14
  142. package/scripts/backlog/backlog-rank.ts +11 -11
  143. package/scripts/backlog/backlog-ready.ts +15 -10
  144. package/scripts/backlog/backlog-scope.ts +14 -15
  145. package/scripts/backlog/backlog-stalled-cli.ts +2 -2
  146. package/scripts/backlog/backlog-stalled-detect.ts +4 -4
  147. package/scripts/backlog/backlog-stalled.ts +5 -6
  148. package/scripts/backlog/backlog-waves.ts +4 -4
  149. package/scripts/backlog/backlogrun-args.ts +74 -0
  150. package/scripts/backlog/backlogrun-cli.ts +113 -0
  151. package/scripts/backlog/backlogrun-launch.ts +178 -0
  152. package/scripts/behavior/behavior-assertion.ts +6 -8
  153. package/scripts/behavior/behavior-cli.ts +1 -1
  154. package/scripts/behavior/behavior-rules.ts +3 -3
  155. package/scripts/build/build-claude-md.ts +4 -4
  156. package/scripts/build/build-codex-hooks.ts +2 -2
  157. package/scripts/build/build-commands.ts +1 -1
  158. package/scripts/build/build-hooks.ts +5 -5
  159. package/scripts/build/build.ts +1 -1
  160. package/scripts/build/hook-bundle-stamp.ts +109 -7
  161. package/scripts/build/local-bin.ts +2 -2
  162. package/scripts/cases/cases-cli.ts +1 -1
  163. package/scripts/cases/cases-logic.ts +2 -2
  164. package/scripts/ci/composite-actions.ts +1 -2
  165. package/scripts/ci/pr-classification.ts +2 -2
  166. package/scripts/claude/workflow-destination.ts +1 -1
  167. package/scripts/clone/clone-aggregate.ts +1 -1
  168. package/scripts/clone/clone-fingerprint.ts +1 -1
  169. package/scripts/clone/clone-scan-cli.ts +1 -1
  170. package/scripts/clone/clone-scan.ts +1 -1
  171. package/scripts/config-merge/index.ts +1 -1
  172. package/scripts/config-merge/json-format.ts +1 -3
  173. package/scripts/config-merge/patch-json-array.ts +90 -0
  174. package/scripts/config-merge/patch-json-key.ts +6 -3
  175. package/scripts/config-merge/patch-json-list.ts +1 -1
  176. package/scripts/cost-runtime/codex-usage.ts +1 -1
  177. package/scripts/cost-runtime/context-cut-payback.ts +4 -5
  178. package/scripts/cost-runtime/context-cut-threshold.ts +4 -6
  179. package/scripts/cost-runtime/cost-attribute.ts +3 -3
  180. package/scripts/cost-runtime/cost-blocks.ts +3 -4
  181. package/scripts/cost-runtime/cost-cli.ts +14 -11
  182. package/scripts/cost-runtime/cost-corpus.ts +11 -11
  183. package/scripts/cost-runtime/cost-pricing.ts +4 -4
  184. package/scripts/cost-runtime/cost-tokens.ts +1 -2
  185. package/scripts/cost-runtime/cost-transcript.ts +29 -29
  186. package/scripts/cost-runtime/cost-usage.ts +6 -7
  187. package/scripts/cost-runtime/cost-verdict.ts +10 -11
  188. package/scripts/cost-runtime/own-session.ts +1 -1
  189. package/scripts/cost-runtime/transcript-cwd.ts +2 -2
  190. package/scripts/delegation/delegation-cli.ts +4 -4
  191. package/scripts/delegation/delegation-policy.ts +13 -15
  192. package/scripts/delegation/duplicate-read-guard.ts +9 -10
  193. package/scripts/delegation/fanout-cli.ts +1 -1
  194. package/scripts/delegation/fanout.ts +1 -1
  195. package/scripts/delegation/investigation-guard.ts +18 -22
  196. package/scripts/delegation/investigation-reads.ts +48 -238
  197. package/scripts/discovery/repo-discovery.ts +1 -1
  198. package/scripts/discovery/repo-map-logic.ts +1 -2
  199. package/scripts/discovery/repo-origin.ts +3 -3
  200. package/scripts/discovery/repo-party-cli.ts +2 -2
  201. package/scripts/discovery/repo-party.ts +2 -2
  202. package/scripts/doctor/doctor-consumer.ts +1 -1
  203. package/scripts/doctor/doctor-io.ts +6 -7
  204. package/scripts/doctor/doctor-logic.ts +1 -1
  205. package/scripts/doctor/doctor-ports.ts +1 -1
  206. package/scripts/doctor/doctor.ts +8 -9
  207. package/scripts/document/backlogrun-parent-read-set.ts +5 -6
  208. package/scripts/document/bash-output-cap.ts +5 -7
  209. package/scripts/document/capped-print-part.ts +1 -1
  210. package/scripts/document/capped-print.ts +1 -1
  211. package/scripts/document/document-byte-budget.ts +33 -64
  212. package/scripts/document/document-byte-check.ts +4 -4
  213. package/scripts/document/document-reachability.ts +7 -8
  214. package/scripts/document/document-read-cli.ts +2 -2
  215. package/scripts/document/document-scan.ts +26 -2
  216. package/scripts/document/document-section-cli.ts +6 -8
  217. package/scripts/document/document-section.ts +8 -12
  218. package/scripts/document/edit-files-cli.ts +3 -4
  219. package/scripts/document/entry-read-budget.ts +8 -70
  220. package/scripts/document/entry-read-set.ts +51 -34
  221. package/scripts/document/lane-child-read-set.ts +9 -9
  222. package/scripts/document/read-files-cli.ts +1 -2
  223. package/scripts/document/read-set-cli.ts +16 -19
  224. package/scripts/document/read-set-cost.ts +4 -4
  225. package/scripts/document/read-set-point-of-use.ts +28 -38
  226. package/scripts/document/read-set-pricing.ts +1 -1
  227. package/scripts/document/read-set-trim.ts +3 -3
  228. package/scripts/document/resident-budget.ts +8 -10
  229. package/scripts/epic/epic-add-body.ts +15 -18
  230. package/scripts/epic/epic-add-plan.ts +26 -28
  231. package/scripts/epic/epic-add.ts +32 -25
  232. package/scripts/epic/epic-audit-checks.ts +27 -37
  233. package/scripts/epic/epic-audit-cli.ts +21 -22
  234. package/scripts/epic/epic-audit-orphans.ts +16 -17
  235. package/scripts/epic/epic-audit-rationale.ts +10 -15
  236. package/scripts/epic/epic-audit-report.ts +2 -5
  237. package/scripts/epic/epic-audit.ts +18 -14
  238. package/scripts/epic/epic-body.ts +10 -10
  239. package/scripts/epic/epic-bundle-cli.ts +36 -34
  240. package/scripts/epic/epic-bundle-evidence.ts +5 -5
  241. package/scripts/epic/epic-bundle-gaps.ts +6 -9
  242. package/scripts/epic/epic-bundle-poll.ts +1 -1
  243. package/scripts/epic/epic-bundle-referenced.ts +11 -14
  244. package/scripts/epic/epic-bundle.ts +19 -20
  245. package/scripts/epic/epic-busy.ts +44 -21
  246. package/scripts/epic/epic-candidate-confirm.ts +15 -18
  247. package/scripts/epic/epic-chains.ts +18 -23
  248. package/scripts/epic/epic-classify.ts +11 -12
  249. package/scripts/epic/epic-cli-argv.ts +5 -6
  250. package/scripts/epic/epic-cli-remove.ts +9 -4
  251. package/scripts/epic/epic-cli.ts +38 -26
  252. package/scripts/epic/epic-close-comment.ts +14 -15
  253. package/scripts/epic/epic-close.ts +25 -29
  254. package/scripts/epic/epic-cross-repo.ts +18 -21
  255. package/scripts/epic/epic-decision.ts +14 -18
  256. package/scripts/epic/epic-fetch.ts +25 -31
  257. package/scripts/epic/epic-graph.ts +15 -17
  258. package/scripts/epic/epic-index.ts +14 -16
  259. package/scripts/epic/epic-issue.ts +9 -11
  260. package/scripts/epic/epic-label-age.ts +74 -0
  261. package/scripts/epic/epic-lane-offer.ts +35 -24
  262. package/scripts/epic/epic-nested.ts +1 -1
  263. package/scripts/epic/epic-next-read.ts +8 -8
  264. package/scripts/epic/epic-next-views.ts +12 -12
  265. package/scripts/epic/epic-next.ts +29 -33
  266. package/scripts/epic/epic-outside-blocker.ts +11 -10
  267. package/scripts/epic/epic-parse.ts +22 -24
  268. package/scripts/epic/epic-promote.ts +3 -2
  269. package/scripts/epic/epic-rank.ts +1 -1
  270. package/scripts/epic/epic-read.ts +10 -8
  271. package/scripts/epic/epic-reconcile.ts +8 -6
  272. package/scripts/epic/epic-reference.ts +5 -4
  273. package/scripts/epic/epic-relation-recheck.ts +10 -11
  274. package/scripts/epic/epic-relations.ts +9 -8
  275. package/scripts/epic/epic-remove-plan.ts +4 -5
  276. package/scripts/epic/epic-remove.ts +7 -5
  277. package/scripts/epic/epic-report.ts +18 -20
  278. package/scripts/epic/epic-run.ts +6 -5
  279. package/scripts/epic/epic-sections.ts +2 -2
  280. package/scripts/epic/epic-shape.ts +3 -3
  281. package/scripts/epic/epic-solo-stale.ts +3 -2
  282. package/scripts/epic/epic-solo.ts +8 -8
  283. package/scripts/epic/epic-triage.ts +5 -4
  284. package/scripts/epic/epic-validate.ts +8 -7
  285. package/scripts/epic/epic.ts +5 -5
  286. package/scripts/exports/unused-members-cli.ts +1 -1
  287. package/scripts/followup/followup-issue-number.ts +1 -2
  288. package/scripts/followup/git-followup-cleanup.ts +6 -7
  289. package/scripts/followup/git-followup-finish.ts +11 -13
  290. package/scripts/followup/git-followup-flush.ts +11 -7
  291. package/scripts/followup/git-followup-issue-close.ts +16 -13
  292. package/scripts/followup/git-followup-label.ts +9 -6
  293. package/scripts/followup/git-followup-merged.ts +1 -1
  294. package/scripts/followup/git-followup-pending.ts +7 -9
  295. package/scripts/followup/git-followup-stages.ts +28 -17
  296. package/scripts/followup/git-followup-workflow.ts +19 -21
  297. package/scripts/followup/git-pr-followup-checks.ts +13 -20
  298. package/scripts/followup/git-pr-followup-wrapup.ts +7 -7
  299. package/scripts/followup/git-pr-followup.ts +18 -17
  300. package/scripts/gate/core-admission.ts +162 -0
  301. package/scripts/gate/core-budget.ts +134 -91
  302. package/scripts/gate/gate-ledger.ts +114 -0
  303. package/scripts/gate/gate-log.ts +7 -9
  304. package/scripts/gate/gate-plan.ts +103 -35
  305. package/scripts/gate/gate-report.ts +39 -21
  306. package/scripts/gate/gate-skip.ts +11 -13
  307. package/scripts/gate/gate-steps.ts +5 -1
  308. package/scripts/gate/gate-tree.ts +3 -4
  309. package/scripts/gate/hook-gate-reuse.ts +9 -9
  310. package/scripts/gate/machine-capacity.ts +313 -0
  311. package/scripts/gate/pre-commit-type-check.ts +4 -4
  312. package/scripts/gate/project-checks.ts +12 -4
  313. package/scripts/gate/scoped-green.ts +11 -18
  314. package/scripts/gate/type-check-command.ts +2 -2
  315. package/scripts/gate/type-check-step.ts +4 -4
  316. package/scripts/gate/verification-gate.ts +60 -53
  317. package/scripts/gh/gh-spawn.ts +2 -2
  318. package/scripts/gh/git-ai-review-scan.ts +3 -2
  319. package/scripts/gh/git-gh-api-path.ts +10 -11
  320. package/scripts/gh/git-gh-exec.ts +43 -48
  321. package/scripts/gh/git-gh-failure.ts +6 -9
  322. package/scripts/gh/git-gh-helpers.ts +1 -1
  323. package/scripts/gh/git-gh-issue-list.ts +15 -19
  324. package/scripts/gh/git-gh-issue-read.ts +43 -60
  325. package/scripts/gh/git-gh-issue-rest.ts +14 -15
  326. package/scripts/gh/git-gh-issue-write.ts +52 -40
  327. package/scripts/gh/git-gh-issue.ts +23 -24
  328. package/scripts/gh/git-gh-pr-auto-merge.ts +3 -3
  329. package/scripts/gh/git-gh-pr-read.ts +46 -50
  330. package/scripts/gh/git-gh-pr-rest.ts +23 -26
  331. package/scripts/gh/git-gh-pr-review.ts +2 -2
  332. package/scripts/gh/git-gh-pr-rollup.ts +4 -4
  333. package/scripts/gh/git-gh-pr-snapshot.ts +8 -10
  334. package/scripts/gh/git-gh-pr.ts +16 -16
  335. package/scripts/gh/git-gh-reachability.ts +11 -12
  336. package/scripts/gh/git-gh-repo.ts +2 -3
  337. package/scripts/gh/git-gh-rest-state.ts +1 -1
  338. package/scripts/gh/git-pr-ai-review.ts +6 -5
  339. package/scripts/gh/git-pr-checks-eval.ts +28 -30
  340. package/scripts/gh/git-pr-checks-parse.ts +14 -16
  341. package/scripts/gh/git-pr-checks-watch.ts +17 -17
  342. package/scripts/gh/git-pr-checks.ts +20 -23
  343. package/scripts/gh/git-pr-coderabbit.ts +8 -6
  344. package/scripts/gh/git-pr-confirmation.ts +5 -5
  345. package/scripts/gh/git-pr-managed-config.ts +7 -9
  346. package/scripts/gh/git-pr-messages.ts +1 -1
  347. package/scripts/gh/git-pr.ts +15 -16
  348. package/scripts/gh/github-issue-url.ts +8 -9
  349. package/scripts/git/base-tree.ts +66 -0
  350. package/scripts/git/change-base.ts +42 -2
  351. package/scripts/git/changed-file-scope.ts +5 -5
  352. package/scripts/git/changed-paths.ts +1 -2
  353. package/scripts/git/constants.ts +2 -2
  354. package/scripts/git/git-branch.ts +1 -1
  355. package/scripts/git/git-closes-keyword.ts +3 -3
  356. package/scripts/git/git-command.ts +53 -41
  357. package/scripts/git/git-common-directory.ts +3 -3
  358. package/scripts/git/git-diff-reads.ts +14 -15
  359. package/scripts/git/git-error.ts +1 -1
  360. package/scripts/git/git-execa-error.ts +1 -2
  361. package/scripts/git/git-issue.ts +10 -8
  362. package/scripts/git/git-location-environment.ts +3 -4
  363. package/scripts/git/git-ls-remote.ts +6 -8
  364. package/scripts/git/git-pre-push-hook.ts +11 -10
  365. package/scripts/git/git-preflight.ts +5 -5
  366. package/scripts/git/git-push-transport.ts +2 -2
  367. package/scripts/git/git-remote-branch.ts +1 -2
  368. package/scripts/git/git-schemas.ts +16 -23
  369. package/scripts/git/git-spawn-sync.ts +1 -1
  370. package/scripts/git/git-spawn.ts +37 -14
  371. package/scripts/git/git-ssh-keepalive.ts +12 -5
  372. package/scripts/git/git-staging.ts +7 -8
  373. package/scripts/git/git-workflow.ts +1 -1
  374. package/scripts/git/git-worktree.ts +35 -27
  375. package/scripts/git/gone-branch.ts +2 -2
  376. package/scripts/git/listing-cutoff.ts +1 -2
  377. package/scripts/git/lockfile-sync.ts +65 -0
  378. package/scripts/git/main-merge-guard.ts +1 -2
  379. package/scripts/git/main-merge.ts +7 -7
  380. package/scripts/git/main-sync.ts +23 -8
  381. package/scripts/git/parse-json-array.ts +18 -23
  382. package/scripts/git/repository-lock.ts +34 -2
  383. package/scripts/git/stash/git-stash.ts +4 -5
  384. package/scripts/git/stash/stash-orphans.ts +5 -3
  385. package/scripts/git/stash/stash-pop-args.ts +1 -1
  386. package/scripts/git/stash/stash-pop-cli.ts +3 -3
  387. package/scripts/git/stash/stash-sweep-lock.ts +2 -2
  388. package/scripts/hooks/batch-guard.ts +11 -13
  389. package/scripts/hooks/check-commit-message.ts +12 -9
  390. package/scripts/hooks/codex-hook-adapter.ts +16 -10
  391. package/scripts/hooks/edited-cspell.ts +3 -4
  392. package/scripts/hooks/format-edited-cli.ts +1 -1
  393. package/scripts/hooks/format-edited-file.ts +11 -17
  394. package/scripts/hooks/format-rewrite-notice.ts +19 -17
  395. package/scripts/hooks/pre-push-unit.ts +10 -14
  396. package/scripts/hooks/pretool-guard-cli.ts +4 -4
  397. package/scripts/hooks/pretool-guard.ts +93 -18
  398. package/scripts/hooks/reserved-run.ts +2 -2
  399. package/scripts/hooks/step-zero-notice.ts +1 -1
  400. package/scripts/hooks/stop-guard.ts +21 -10
  401. package/scripts/init/basic-path-migration.ts +2 -2
  402. package/scripts/init/claude-kit-only-settings.ts +2 -2
  403. package/scripts/init/claude-plugin-config.ts +2 -2
  404. package/scripts/init/distributed-paths.ts +4 -4
  405. package/scripts/init/hook-command-rewrite.ts +3 -3
  406. package/scripts/init/hook-launch.ts +5 -5
  407. package/scripts/init/init-actions.ts +13 -0
  408. package/scripts/init/init-ai-copy.ts +11 -11
  409. package/scripts/init/init-bootstrap.ts +3 -3
  410. package/scripts/init/init-copy-content.ts +4 -4
  411. package/scripts/init/init-logic-json-merge.ts +7 -9
  412. package/scripts/init/init-logic-migrate.ts +1 -1
  413. package/scripts/init/init-logic-templates.ts +1 -1
  414. package/scripts/init/init-logic-workspace.ts +4 -4
  415. package/scripts/init/init-logic-yaml-merge.ts +2 -2
  416. package/scripts/init/init-logic.ts +19 -22
  417. package/scripts/init/init.ts +12 -8
  418. package/scripts/init/kit-base-preset.ts +1 -1
  419. package/scripts/init/kit-setup-state.ts +1 -1
  420. package/scripts/init/kit-written-paths.ts +1 -2
  421. package/scripts/init/package-manager-pin.ts +35 -0
  422. package/scripts/init/project-profile-cli.ts +1 -1
  423. package/scripts/init/project-profile.ts +3 -3
  424. package/scripts/init/session-language-environment.ts +1 -1
  425. package/scripts/init/start-exec.ts +3 -4
  426. package/scripts/init/start-plan.ts +2 -2
  427. package/scripts/init/start-setup-pr.ts +3 -2
  428. package/scripts/init/start-steps.ts +2 -2
  429. package/scripts/init/tsconfig-preset-migration.ts +1 -1
  430. package/scripts/init/vscode-tasks.ts +62 -0
  431. package/scripts/issue/baseline-measure.ts +2 -2
  432. package/scripts/issue/behavior-change-lint.ts +2 -2
  433. package/scripts/issue/defect-rate-cli.ts +6 -7
  434. package/scripts/issue/defect-rate.ts +37 -27
  435. package/scripts/issue/git-next-issues.ts +9 -8
  436. package/scripts/issue/issue-auto-ok.ts +49 -11
  437. package/scripts/issue/issue-backlinks-cli.ts +5 -5
  438. package/scripts/issue/issue-backlinks.ts +6 -6
  439. package/scripts/issue/issue-cite-cli.ts +20 -18
  440. package/scripts/issue/issue-cite.ts +18 -8
  441. package/scripts/issue/issue-closing-pr.ts +4 -4
  442. package/scripts/issue/issue-comment-cli.ts +6 -4
  443. package/scripts/issue/issue-file-cli.ts +75 -15
  444. package/scripts/issue/issue-file-fold.ts +155 -0
  445. package/scripts/issue/issue-file.ts +14 -6
  446. package/scripts/issue/issue-fold-cli.ts +14 -9
  447. package/scripts/issue/issue-fold.ts +23 -8
  448. package/scripts/issue/issue-labels.ts +46 -37
  449. package/scripts/issue/issue-lint-cli.ts +2 -2
  450. package/scripts/issue/issue-lint.ts +1 -1
  451. package/scripts/issue/issue-merged.ts +10 -4
  452. package/scripts/issue/issue-number-shape.ts +27 -0
  453. package/scripts/issue/issue-rank.ts +1 -1
  454. package/scripts/issue/issue-read-cli.ts +4 -5
  455. package/scripts/issue/issue-read.ts +4 -5
  456. package/scripts/issue/issue-reference.ts +5 -5
  457. package/scripts/issue/issue-release-cli.ts +165 -0
  458. package/scripts/issue/issue-release.ts +58 -0
  459. package/scripts/issue/issue-report-failures.ts +7 -4
  460. package/scripts/issue/issue-scout-cli.ts +11 -11
  461. package/scripts/issue/issue-scout-closed.ts +4 -4
  462. package/scripts/issue/issue-scout.ts +4 -5
  463. package/scripts/issue/issue-state-cli.ts +17 -10
  464. package/scripts/issue/issue-state.ts +12 -13
  465. package/scripts/issue/issue-wip.ts +7 -7
  466. package/scripts/issue/markdown-section.ts +3 -3
  467. package/scripts/issue/measure-rerun-cli.ts +10 -9
  468. package/scripts/issue/reproduction-measure.ts +3 -3
  469. package/scripts/issue/session-cite.ts +56 -0
  470. package/scripts/josh/agent-session-environment.ts +10 -8
  471. package/scripts/josh/cli-body.ts +2 -2
  472. package/scripts/josh/command-suggest.ts +1 -1
  473. package/scripts/josh/file-map-stamp.ts +20 -23
  474. package/scripts/josh/hook-decision.ts +24 -28
  475. package/scripts/josh/josh-command-map.ts +4 -1
  476. package/scripts/josh/josh-command-types.ts +32 -34
  477. package/scripts/josh/josh-commands-ai.ts +6 -6
  478. package/scripts/josh/josh-commands-backlog.ts +15 -3
  479. package/scripts/josh/josh-commands-clone.ts +1 -1
  480. package/scripts/josh/josh-commands-development.ts +33 -4
  481. package/scripts/josh/josh-commands-document.ts +3 -3
  482. package/scripts/josh/josh-commands-guard.ts +3 -3
  483. package/scripts/josh/josh-commands-issue.ts +11 -5
  484. package/scripts/josh/josh-commands-lane.ts +16 -5
  485. package/scripts/josh/josh-commands-lint.ts +1 -1
  486. package/scripts/josh/josh-commands-maintenance.ts +2 -2
  487. package/scripts/josh/josh-commands-run.ts +20 -6
  488. package/scripts/josh/josh-commands-split.ts +1 -2
  489. package/scripts/josh/josh-commands-versioning.ts +5 -5
  490. package/scripts/josh/josh-commands-workflow.ts +30 -22
  491. package/scripts/josh/josh-environment-file.ts +1 -1
  492. package/scripts/josh/josh-in-process.ts +3 -3
  493. package/scripts/josh/josh-logic.ts +10 -10
  494. package/scripts/josh/josh-run.ts +3 -3
  495. package/scripts/josh/josh-verdict.ts +9 -12
  496. package/scripts/josh/josh.ts +3 -3
  497. package/scripts/josh/kit-only.ts +2 -2
  498. package/scripts/josh/path-decision.ts +3 -3
  499. package/scripts/josh/platform-temporary.ts +7 -5
  500. package/scripts/josh/process-identity.ts +24 -6
  501. package/scripts/josh/process-owner.ts +4 -4
  502. package/scripts/josh/session-language-cli.ts +53 -11
  503. package/scripts/josh/session-language.ts +1 -1
  504. package/scripts/josh/stamp-file.ts +48 -29
  505. package/scripts/josh/stamp-record.ts +57 -0
  506. package/scripts/lane/lane-await.ts +35 -11
  507. package/scripts/lane/lane-cache.ts +6 -6
  508. package/scripts/lane/lane-capacity.ts +32 -17
  509. package/scripts/lane/lane-child-invocation.ts +17 -15
  510. package/scripts/lane/lane-child-marker.ts +12 -12
  511. package/scripts/lane/lane-cli.ts +20 -13
  512. package/scripts/lane/lane-close.ts +6 -6
  513. package/scripts/lane/lane-dispatch.ts +61 -72
  514. package/scripts/lane/lane-environment.ts +5 -5
  515. package/scripts/lane/lane-guard-policy.ts +7 -21
  516. package/scripts/lane/lane-handoff.ts +2 -2
  517. package/scripts/lane/lane-install.ts +9 -10
  518. package/scripts/lane/lane-launch-cli.ts +13 -8
  519. package/scripts/lane/lane-ledger.ts +73 -11
  520. package/scripts/lane/lane-leftover.ts +44 -30
  521. package/scripts/lane/lane-limit-cli.ts +160 -0
  522. package/scripts/lane/lane-limit-override.ts +74 -0
  523. package/scripts/lane/lane-load.ts +19 -68
  524. package/scripts/lane/lane-measure-cli.ts +15 -25
  525. package/scripts/lane/lane-occupancy.ts +6 -4
  526. package/scripts/lane/lane-open.ts +25 -24
  527. package/scripts/lane/lane-output.ts +4 -3
  528. package/scripts/lane/lane-paths.ts +22 -8
  529. package/scripts/lane/lane-phase.ts +33 -0
  530. package/scripts/lane/lane-reap.ts +2 -2
  531. package/scripts/lane/lane-registry.ts +27 -15
  532. package/scripts/lane/lane-relaunch.ts +9 -9
  533. package/scripts/lane/lane-report.ts +5 -4
  534. package/scripts/lane/lane-resume.ts +2 -2
  535. package/scripts/lane/lane-sampler.ts +55 -0
  536. package/scripts/lane/lane-seed.ts +7 -7
  537. package/scripts/lane/lane-stage-stats.ts +135 -0
  538. package/scripts/lane/lane-start-point.ts +8 -11
  539. package/scripts/lane/lane-stats.ts +60 -15
  540. package/scripts/lane/lane-stray.ts +140 -0
  541. package/scripts/lane/lane-vacant.ts +1 -1
  542. package/scripts/lane/openai-lane-supervisor-decision.ts +3 -7
  543. package/scripts/lane/openai-lane-supervisor-owner.ts +3 -9
  544. package/scripts/lane/openai-review-broker.ts +2 -4
  545. package/scripts/lib/ancestor-directories.ts +1 -1
  546. package/scripts/lib/bounded-pool.ts +2 -2
  547. package/scripts/lib/buffered-process.ts +4 -6
  548. package/scripts/lib/caddy-logs.sh +0 -0
  549. package/scripts/lib/cli-flags.ts +39 -6
  550. package/scripts/lib/error-message.ts +1 -1
  551. package/scripts/lib/json-value.ts +17 -3
  552. package/scripts/lib/poll.ts +1 -1
  553. package/scripts/lib/status-icons.ts +3 -3
  554. package/scripts/lib/timed-fetch.ts +1 -1
  555. package/scripts/lib/timeouts.ts +1 -1
  556. package/scripts/lines/bytes-command.ts +3 -4
  557. package/scripts/lines/effective-limit.ts +25 -12
  558. package/scripts/lines/line-budget.ts +47 -55
  559. package/scripts/lines/line-targets.ts +6 -2
  560. package/scripts/lines/lines-command.ts +3 -3
  561. package/scripts/lint/cspell-cached.ts +1 -1
  562. package/scripts/lint/cycle-recheck.ts +122 -0
  563. package/scripts/lint/format.ts +1 -2
  564. package/scripts/lint/lint-parallel.ts +34 -19
  565. package/scripts/lint/lint-related-scope.ts +25 -15
  566. package/scripts/lint/lint-related.ts +6 -7
  567. package/scripts/managed-marker/index.ts +1 -1
  568. package/scripts/managed-marker/managed-marker-logic.ts +1 -2
  569. package/scripts/notify/git-notify.ts +9 -7
  570. package/scripts/notify/telegram-notify.ts +53 -37
  571. package/scripts/notify/telegram-test-logic.ts +3 -3
  572. package/scripts/notify/telegram-test.ts +45 -30
  573. package/scripts/observations/observation-ledger-home.ts +14 -8
  574. package/scripts/observations/observation-ledger-line.ts +3 -2
  575. package/scripts/observations/observation-ledger-migrate.ts +3 -4
  576. package/scripts/observations/observation-ledger-prepare.ts +4 -4
  577. package/scripts/observations/observation-ledger.ts +14 -15
  578. package/scripts/observations/observation-record-cli.ts +83 -0
  579. package/scripts/observations/observation-record.ts +91 -0
  580. package/scripts/observations/observations-flush-cli.ts +1 -1
  581. package/scripts/observations/observations-flush-landing.ts +7 -6
  582. package/scripts/observations/observations-flush.ts +26 -27
  583. package/scripts/overrides/overrides-check.ts +18 -8
  584. package/scripts/package/package-scout-cli.ts +1 -1
  585. package/scripts/package/package-scout-format.ts +2 -2
  586. package/scripts/package/package-scout.ts +1 -1
  587. package/scripts/propagate/propagate-git-failure.ts +1 -1
  588. package/scripts/propagate/propagate-git.ts +7 -7
  589. package/scripts/propagate/propagate-plan.ts +2 -2
  590. package/scripts/propagate/propagate-publish.ts +2 -3
  591. package/scripts/propagate/propagate-run.ts +5 -7
  592. package/scripts/propagate/propagate-select.ts +1 -1
  593. package/scripts/propagate/propagate-steps.ts +19 -20
  594. package/scripts/propagate/propagate-targets.ts +6 -10
  595. package/scripts/propagate/propagate.ts +5 -5
  596. package/scripts/refactor/import-graph.ts +1 -1
  597. package/scripts/refactor/refactor-lint.ts +4 -10
  598. package/scripts/refactor/refactor-scan-cli.ts +1 -1
  599. package/scripts/refactor/refactor-scan.ts +2 -2
  600. package/scripts/refactor/refactor-targets.ts +1 -1
  601. package/scripts/release/github-release-cli.ts +25 -3
  602. package/scripts/release/github-release-environment.ts +1 -0
  603. package/scripts/release/github-release-runs.ts +115 -0
  604. package/scripts/release/github-release.ts +13 -67
  605. package/scripts/release/release-cli.ts +21 -4
  606. package/scripts/release/release-history.ts +6 -10
  607. package/scripts/release/release-plan.ts +3 -3
  608. package/scripts/release/release-progress.ts +3 -4
  609. package/scripts/release/release-publish.ts +8 -9
  610. package/scripts/release/release-scope-cli.ts +8 -10
  611. package/scripts/release/release-tag.ts +6 -8
  612. package/scripts/release/release-worktree.ts +5 -5
  613. package/scripts/repo/auto-merge-setting-logic.ts +7 -9
  614. package/scripts/repo/auto-merge-setting.ts +1 -1
  615. package/scripts/repo/repo-setting.ts +4 -4
  616. package/scripts/repo/repository-labels.ts +1 -1
  617. package/scripts/repo/required-checks-logic.ts +3 -3
  618. package/scripts/repo/required-checks-report.ts +1 -1
  619. package/scripts/repo/ruleset-check-cli.ts +1 -1
  620. package/scripts/repo/ruleset-check.ts +1 -1
  621. package/scripts/report/report-format-reference.ts +26 -0
  622. package/scripts/report/report-lint-cli.ts +2 -2
  623. package/scripts/report/report-lint.ts +16 -2
  624. package/scripts/review/disposition-cli.ts +2 -2
  625. package/scripts/review/disposition-logic.ts +1 -1
  626. package/scripts/review/live-evidence.ts +9 -6
  627. package/scripts/review/review-attest-cli.ts +1 -2
  628. package/scripts/review/review-attest.ts +3 -3
  629. package/scripts/review/review-brief-cli.ts +19 -20
  630. package/scripts/review/review-brief.ts +29 -32
  631. package/scripts/review/review-checkout.ts +2 -2
  632. package/scripts/review/review-diff-parts.ts +3 -5
  633. package/scripts/review/review-diff-write.ts +1 -1
  634. package/scripts/review/review-finding-ledger.ts +7 -4
  635. package/scripts/review/review-findings-cli.ts +2 -2
  636. package/scripts/review/review-level.ts +4 -7
  637. package/scripts/review/review-record-cli.ts +73 -16
  638. package/scripts/review/review-record.ts +5 -4
  639. package/scripts/review/review-round2-cli.ts +2 -3
  640. package/scripts/review/review-round2.ts +13 -21
  641. package/scripts/review/review-stamps.ts +9 -71
  642. package/scripts/review/review-tree.ts +4 -5
  643. package/scripts/rules/bash-triggers.ts +4 -4
  644. package/scripts/rules/decision-oracle-batch.ts +5 -6
  645. package/scripts/rules/decision-oracle-stage.ts +1 -1
  646. package/scripts/rules/decision-oracle-tokens.ts +1 -2
  647. package/scripts/rules/decision-oracle.ts +2 -2
  648. package/scripts/rules/delivered-rules.ts +61 -406
  649. package/scripts/rules/destructive-command.ts +2 -2
  650. package/scripts/rules/direct-filing.ts +4 -4
  651. package/scripts/rules/direct-pr-create.ts +2 -2
  652. package/scripts/rules/early-heartbeat.ts +15 -19
  653. package/scripts/rules/file-body.ts +5 -6
  654. package/scripts/rules/filing-cap.ts +6 -7
  655. package/scripts/rules/filing-offer.ts +1 -1
  656. package/scripts/rules/firing-point.ts +6 -6
  657. package/scripts/rules/gh-api.ts +2 -2
  658. package/scripts/rules/git-argv.ts +3 -3
  659. package/scripts/rules/git-force.ts +2 -2
  660. package/scripts/rules/hook-context-line.ts +31 -0
  661. package/scripts/rules/implementation-cut-verdict.ts +5 -8
  662. package/scripts/rules/implementation-cut.ts +35 -32
  663. package/scripts/rules/index-guard.ts +2 -2
  664. package/scripts/rules/issue-citation.ts +7 -7
  665. package/scripts/rules/issue-comments.ts +21 -13
  666. package/scripts/rules/josh-git-bare.ts +2 -2
  667. package/scripts/rules/lane-background.ts +14 -16
  668. package/scripts/rules/lane-carry-conflict.ts +41 -5
  669. package/scripts/rules/lane-interactive-ask.ts +6 -9
  670. package/scripts/rules/lane-park.ts +12 -16
  671. package/scripts/rules/lane-split-park.ts +1 -2
  672. package/scripts/rules/lane-switch-main.ts +10 -13
  673. package/scripts/rules/last-prompt.ts +1 -1
  674. package/scripts/rules/oracle-consulted.ts +5 -5
  675. package/scripts/rules/oracle-firing.ts +6 -9
  676. package/scripts/rules/oracle-list-cli.ts +2 -2
  677. package/scripts/rules/permission-guards.ts +2 -2
  678. package/scripts/rules/piped-verification.ts +79 -9
  679. package/scripts/rules/poll-loop.ts +9 -11
  680. package/scripts/rules/pre-gate-cut.ts +33 -30
  681. package/scripts/rules/prior-comment-read.ts +3 -3
  682. package/scripts/rules/protected-files.ts +25 -13
  683. package/scripts/rules/raw-field-body.ts +3 -4
  684. package/scripts/rules/reply-language.ts +1 -1
  685. package/scripts/rules/rule-body-guard.ts +10 -12
  686. package/scripts/rules/rule-guard.ts +1 -1
  687. package/scripts/rules/rule-list.ts +51 -0
  688. package/scripts/rules/rule-registry-rows.ts +282 -0
  689. package/scripts/rules/rule-registry.ts +109 -0
  690. package/scripts/rules/rule-value-cache.ts +2 -2
  691. package/scripts/rules/rule-value-cli.ts +6 -4
  692. package/scripts/rules/rule-value.ts +61 -22
  693. package/scripts/rules/run-tail-rule.ts +11 -15
  694. package/scripts/rules/shell-body-trigger.ts +7 -7
  695. package/scripts/rules/shell-segments.ts +2 -4
  696. package/scripts/rules/stop-rules.ts +54 -41
  697. package/scripts/rules/tail-commands.ts +1 -1
  698. package/scripts/rules/test-declared-commit.ts +2 -2
  699. package/scripts/rules/third-party-write.ts +3 -3
  700. package/scripts/rules/worktree-guard.ts +12 -5
  701. package/scripts/run/add/run-add-cli.ts +165 -0
  702. package/scripts/run/add/run-add.ts +124 -0
  703. package/scripts/run/board/run-board-cli.ts +207 -0
  704. package/scripts/run/board/run-board-closed.ts +95 -0
  705. package/scripts/run/board/run-board-every.ts +60 -0
  706. package/scripts/run/board/run-board-fetch.ts +38 -0
  707. package/scripts/run/board/run-board-fit.ts +219 -0
  708. package/scripts/run/board/run-board-github.ts +162 -0
  709. package/scripts/run/board/run-board-header.ts +275 -0
  710. package/scripts/run/board/run-board-kind.ts +35 -0
  711. package/scripts/run/board/run-board-labels.ts +299 -0
  712. package/scripts/run/board/run-board-layout.ts +222 -0
  713. package/scripts/run/board/run-board-link.ts +31 -0
  714. package/scripts/run/board/run-board-machine.ts +198 -0
  715. package/scripts/run/board/run-board-notes.ts +103 -0
  716. package/scripts/run/board/run-board-phase.ts +136 -0
  717. package/scripts/run/board/run-board-plan.ts +129 -0
  718. package/scripts/run/board/run-board-read.ts +62 -0
  719. package/scripts/run/board/run-board-render-legend.ts +82 -0
  720. package/scripts/run/board/run-board-render-notes.ts +77 -0
  721. package/scripts/run/board/run-board-render-slot.ts +50 -0
  722. package/scripts/run/board/run-board-render.ts +407 -0
  723. package/scripts/run/board/run-board-scope.ts +17 -0
  724. package/scripts/run/board/run-board-screen.ts +43 -0
  725. package/scripts/run/board/run-board-span.ts +66 -0
  726. package/scripts/run/board/run-board-spin.ts +115 -0
  727. package/scripts/run/board/run-board-state.ts +113 -0
  728. package/scripts/run/board/run-board-status.ts +279 -0
  729. package/scripts/run/board/run-board-tick.ts +210 -0
  730. package/scripts/run/board/run-board-track.ts +22 -0
  731. package/scripts/run/board/run-board-usage-read.ts +255 -0
  732. package/scripts/run/board/run-board-usage-rusage.ts +124 -0
  733. package/scripts/run/board/run-board-usage-text.ts +80 -0
  734. package/scripts/run/board/run-board-usage.ts +165 -0
  735. package/scripts/run/carry/run-carry-added.ts +62 -0
  736. package/scripts/run/carry/run-carry-args.ts +25 -22
  737. package/scripts/run/carry/run-carry-change.ts +1 -1
  738. package/scripts/run/carry/run-carry-cli.ts +71 -48
  739. package/scripts/run/carry/run-carry-conversation.ts +6 -7
  740. package/scripts/run/carry/run-carry-ended.ts +85 -0
  741. package/scripts/run/carry/run-carry-reclaim.ts +1 -1
  742. package/scripts/run/carry/run-carry-stash.ts +3 -2
  743. package/scripts/run/carry/run-carry-streak.ts +8 -10
  744. package/scripts/run/carry/run-carry.ts +85 -89
  745. package/scripts/run/cut/run-cut-args.ts +7 -7
  746. package/scripts/run/cut/run-cut-cli.ts +68 -37
  747. package/scripts/run/cut/run-cut-handoff.ts +15 -15
  748. package/scripts/run/cut/run-cut-report.ts +37 -16
  749. package/scripts/run/cut/run-cut.ts +63 -77
  750. package/scripts/run/detached-launch.ts +35 -50
  751. package/scripts/run/entry/run-entry-cli.ts +48 -27
  752. package/scripts/run/entry/run-entry-stop.ts +7 -9
  753. package/scripts/run/entry/run-entry.ts +5 -6
  754. package/scripts/run/event/run-event-cli.ts +5 -6
  755. package/scripts/run/event/run-event-filed.ts +69 -0
  756. package/scripts/run/event/run-event-follow.ts +3 -3
  757. package/scripts/run/event/run-event-plan.ts +38 -0
  758. package/scripts/run/event/run-event-render.ts +10 -4
  759. package/scripts/run/event/run-event-scope.ts +47 -18
  760. package/scripts/run/event/run-event-stream-emit.ts +64 -11
  761. package/scripts/run/event/run-event-stream.ts +172 -43
  762. package/scripts/run/event/run-event-watch.ts +4 -6
  763. package/scripts/run/hold/run-hold-cli.ts +65 -62
  764. package/scripts/run/hold/run-hold.ts +88 -46
  765. package/scripts/run/merge/run-merge-cli.ts +116 -77
  766. package/scripts/run/merge/run-merge-collect.ts +107 -0
  767. package/scripts/run/merge/run-merge-steps.ts +112 -65
  768. package/scripts/run/merge/run-merge-token.ts +30 -0
  769. package/scripts/run/merge/run-merge.ts +31 -22
  770. package/scripts/run/progress/run-progress-args.ts +4 -4
  771. package/scripts/run/progress/run-progress-cli.ts +39 -50
  772. package/scripts/run/progress/run-progress-clock.ts +25 -32
  773. package/scripts/run/progress/run-progress-config.ts +6 -9
  774. package/scripts/run/progress/run-progress-read.ts +9 -10
  775. package/scripts/run/progress/run-progress.ts +48 -53
  776. package/scripts/run/review/run-review-cli.ts +6 -6
  777. package/scripts/run/review/run-review-steps.ts +6 -6
  778. package/scripts/run/review/run-review.ts +9 -11
  779. package/scripts/run/run-cli-fault.ts +29 -0
  780. package/scripts/run/run-ending-cli.ts +3 -3
  781. package/scripts/run/run-ending.ts +10 -14
  782. package/scripts/run/run-halfrun-resume.ts +6 -8
  783. package/scripts/run/run-headless.ts +25 -12
  784. package/scripts/run/run-invocation.ts +17 -22
  785. package/scripts/run/run-label.ts +7 -5
  786. package/scripts/run/run-liveness-cli.ts +19 -6
  787. package/scripts/run/run-liveness.ts +27 -38
  788. package/scripts/run/run-next-cli.ts +5 -9
  789. package/scripts/run/run-next.ts +4 -5
  790. package/scripts/run/run-parent-cut-hook.ts +10 -12
  791. package/scripts/run/run-preflight.ts +25 -29
  792. package/scripts/run/run-prep-cli.ts +17 -13
  793. package/scripts/run/run-prep-locate.ts +4 -5
  794. package/scripts/run/run-prep.ts +7 -10
  795. package/scripts/run/run-prrun-resume.ts +2 -2
  796. package/scripts/run/run-report-cli.ts +4 -4
  797. package/scripts/run/run-report.ts +9 -14
  798. package/scripts/run/run-retrospective.ts +3 -3
  799. package/scripts/run/run-section.ts +42 -0
  800. package/scripts/run/run-stage-read.ts +2 -2
  801. package/scripts/run/run-stage.ts +6 -4
  802. package/scripts/run/run-status-cli.ts +7 -5
  803. package/scripts/run/run-status.ts +6 -7
  804. package/scripts/run/run-step-cli.ts +13 -15
  805. package/scripts/run/run-step.ts +62 -48
  806. package/scripts/run/run-stop-notify.ts +7 -8
  807. package/scripts/run/run-stranded-cli.ts +1 -1
  808. package/scripts/run/run-stranded-detect.ts +4 -4
  809. package/scripts/run/run-stranded.ts +11 -13
  810. package/scripts/run/run-tail-cli.ts +15 -16
  811. package/scripts/run/run-tail.ts +14 -33
  812. package/scripts/run/run-watcher-guard-cli.ts +3 -4
  813. package/scripts/run/run-watcher-guard.ts +11 -12
  814. package/scripts/run/run-watcher-hook.ts +6 -12
  815. package/scripts/run/ship/run-ship-cli.ts +67 -33
  816. package/scripts/run/ship/run-ship-detach.ts +15 -13
  817. package/scripts/run/ship/run-ship-lock.ts +1 -1
  818. package/scripts/run/ship/run-ship-next.ts +7 -8
  819. package/scripts/run/ship/run-ship-pre-detach.ts +27 -11
  820. package/scripts/run/ship/run-ship-preflight.ts +10 -11
  821. package/scripts/run/ship/run-ship-probe.ts +4 -4
  822. package/scripts/run/ship/run-ship-return.ts +1 -1
  823. package/scripts/run/ship/run-ship-review-steps.ts +43 -24
  824. package/scripts/run/ship/run-ship-review.ts +12 -14
  825. package/scripts/run/ship/run-ship-scoped.ts +15 -6
  826. package/scripts/run/ship/run-ship-stage.ts +80 -26
  827. package/scripts/run/ship/run-ship-steps.ts +26 -16
  828. package/scripts/run/ship/run-ship-stop-text.ts +4 -2
  829. package/scripts/run/ship/run-ship-sync.ts +9 -8
  830. package/scripts/run/ship/run-ship.ts +17 -32
  831. package/scripts/run/tidy/run-tidy-cli.ts +9 -5
  832. package/scripts/run/tidy/run-tidy-lanes.ts +18 -7
  833. package/scripts/run/tidy/run-tidy-stashes.ts +8 -8
  834. package/scripts/run/tidy/run-tidy.ts +4 -3
  835. package/scripts/run/wake/run-wake-cli.ts +27 -33
  836. package/scripts/run/wake/run-wake-describe.ts +76 -29
  837. package/scripts/run/wake/run-wake-driver.ts +14 -14
  838. package/scripts/run/wake/run-wake-handoff.ts +6 -6
  839. package/scripts/run/wake/run-wake-loop.ts +13 -21
  840. package/scripts/run/wake/run-wake-restart.ts +4 -5
  841. package/scripts/run/wake/run-wake-session.ts +23 -27
  842. package/scripts/run/wake/run-wake.ts +57 -328
  843. package/scripts/safe-chain/ci-installer-pin.ts +3 -3
  844. package/scripts/safe-chain/pack-hook.ts +2 -2
  845. package/scripts/safe-chain/preinstall-command.ts +2 -2
  846. package/scripts/security/security-audit-logic.ts +1 -1
  847. package/scripts/security/security-audit-provision-logic.ts +1 -1
  848. package/scripts/security/security-audit-provision.ts +2 -2
  849. package/scripts/security/security-audit.ts +5 -5
  850. package/scripts/security/security-updates-logic.ts +2 -3
  851. package/scripts/security/security-updates.ts +2 -4
  852. package/scripts/self-sync-guard/index.ts +1 -1
  853. package/scripts/self-sync-guard/self-sync-guard-logic.ts +2 -2
  854. package/scripts/self-sync-guard/self-sync-refusal.ts +1 -1
  855. package/scripts/sonar/sonar-hotspots-cli.ts +1 -1
  856. package/scripts/sonar/sonar-hotspots.ts +1 -1
  857. package/scripts/sonar/sonar-new-code-cli.ts +1 -1
  858. package/scripts/sonar/sonar-new-code.ts +1 -1
  859. package/scripts/sonar/sonar-project.ts +1 -1
  860. package/scripts/split/split-assess-cli.ts +1 -1
  861. package/scripts/split/split-assess.ts +3 -3
  862. package/scripts/sync/directory-copy-guard.ts +2 -3
  863. package/scripts/sync/managed-config-scope-cli.ts +1 -2
  864. package/scripts/sync/managed-config-scope.ts +4 -4
  865. package/scripts/sync/plugin-skill-directories.ts +2 -2
  866. package/scripts/sync/reconcile-templates.ts +17 -8
  867. package/scripts/sync/removed-skill-manifest.ts +2 -3
  868. package/scripts/sync/sync-ai-files.ts +7 -7
  869. package/scripts/sync/sync-configs.ts +30 -3
  870. package/scripts/sync/sync-hook-safety.ts +2 -2
  871. package/scripts/sync/sync.ts +23 -10
  872. package/scripts/sync/synced-paths.ts +2 -1
  873. package/scripts/sync/workflow-pin-logic.ts +1 -1
  874. package/scripts/test/test-declared-changed.ts +4 -4
  875. package/scripts/test/test-declared-logic.ts +2 -3
  876. package/scripts/test/test-declared-match.ts +25 -4
  877. package/scripts/test/test-declared.ts +26 -9
  878. package/scripts/test/test-red-commit.ts +3 -2
  879. package/scripts/test/test-red-logic.ts +7 -14
  880. package/scripts/test/test-red.ts +12 -47
  881. package/scripts/test/test-related-scope.ts +2 -3
  882. package/scripts/test/test-related.ts +3 -3
  883. package/scripts/test/test-type-logic.ts +1 -2
  884. package/scripts/test/test-unit-guard.ts +13 -17
  885. package/scripts/test/unit-worker-share.ts +7 -8
  886. package/scripts/time-runtime/time-agent-bundles.ts +2 -4
  887. package/scripts/time-runtime/time-background.ts +17 -21
  888. package/scripts/time-runtime/time-batch-guard.ts +67 -342
  889. package/scripts/time-runtime/time-bundle-call.ts +26 -28
  890. package/scripts/time-runtime/time-bundles.ts +11 -12
  891. package/scripts/time-runtime/time-call-identity.ts +1 -1
  892. package/scripts/time-runtime/time-command-key.ts +2 -2
  893. package/scripts/time-runtime/time-density-hook.ts +8 -11
  894. package/scripts/time-runtime/time-density.ts +5 -5
  895. package/scripts/time-runtime/time-followup-stage.ts +7 -7
  896. package/scripts/time-runtime/time-format.ts +5 -5
  897. package/scripts/time-runtime/time-hook-transcript.ts +3 -3
  898. package/scripts/time-runtime/time-instant.ts +1 -1
  899. package/scripts/time-runtime/time-markers.ts +15 -19
  900. package/scripts/time-runtime/time-phase-names.ts +3 -3
  901. package/scripts/time-runtime/time-reported-failure.ts +15 -19
  902. package/scripts/time-runtime/time-round-trips.ts +20 -23
  903. package/scripts/time-runtime/time-shell.ts +8 -8
  904. package/scripts/time-runtime/time-single-check.ts +1 -2
  905. package/scripts/time-runtime/time-spans.ts +35 -40
  906. package/scripts/time-runtime/time-tool-call.ts +15 -16
  907. package/scripts/time-runtime/time-transcript-line.ts +53 -34
  908. package/scripts/time-runtime/time-writes.ts +5 -5
  909. package/scripts/ui/ui-routes-cli.ts +1 -2
  910. package/scripts/ui/ui-routes.ts +1 -2
  911. package/scripts/version/bump-version.ts +1 -1
  912. package/scripts/version/fresh-metadata-cache.ts +2 -2
  913. package/scripts/version/latest-corepack.ts +129 -98
  914. package/scripts/version/latest-lane-guard.ts +1 -1
  915. package/scripts/version/latest-scope-cli.ts +2 -2
  916. package/scripts/version/latest-stamp.ts +1 -2
  917. package/scripts/version/latest-update.ts +2 -2
  918. package/scripts/version/npm-registry.ts +2 -2
  919. package/scripts/version/package-manager-version.ts +18 -0
  920. package/scripts/version/publishable-range-check.ts +2 -1
  921. package/scripts/version/publishable-range.ts +1 -1
  922. package/scripts/version/release-age.ts +11 -11
  923. package/scripts/version/release-hold.ts +2 -2
  924. package/scripts/version/safe-chain-version-update.ts +3 -3
  925. package/scripts/version/version-check-logic.ts +2 -3
  926. package/scripts/version/version-check.ts +1 -2
  927. package/scripts/version/version-command-config.ts +2 -2
  928. package/scripts/version/version-commands.ts +3 -3
  929. package/scripts/version/version-remote.ts +4 -4
  930. package/scripts/version/version-targets.ts +2 -2
  931. package/templates/gitignore +7 -0
  932. package/templates/workflows/github-release.yml +4 -0
  933. package/dist/hooks/chunk-NV2JRZZO.js +0 -6385
  934. package/dist/hooks/chunk-RKUAD3I6.js +0 -90
  935. package/dist/hooks/chunk-WPALEIRX.js +0 -18
  936. package/scripts/backlog/backlog-restructure.ts +0 -152
  937. package/scripts/rules/issue-fold-rule.ts +0 -72
  938. package/scripts/rules/wip-cap.ts +0 -63
  939. package/scripts/run/run-issue-number.ts +0 -19
@@ -1,26 +1,45 @@
1
1
  import { createHash } from 'node:crypto'
2
- import { existsSync, readFileSync } from 'node:fs'
2
+ import { existsSync, readFileSync, renameSync, rmSync, statSync, writeFileSync } from 'node:fs'
3
3
  import path from 'node:path'
4
4
  import { json_value } from '#scripts/lib/json-value'
5
5
 
6
6
  // What a hook build was made from, so a later launch can tell whether `dist/hooks/` still matches the
7
- // source it runs beside (joshuafolkken/kit#2984). `dist/` is git-ignored and rebuilt only by
7
+ // source it runs beside. `dist/` is git-ignored and rebuilt only by
8
8
  // `pnpm build`, so without this record an edited guard keeps running its old bundle with nothing to
9
9
  // say so — and a lane's bundles are copied from the main checkout, whose source can differ.
10
10
  //
11
11
  // **The record is a content digest, not a timestamp.** A copy (`lane-cache.ts`) or a fresh checkout
12
12
  // rewrites every mtime while leaving the content alone, and a digest is the only comparison that
13
- // neither rebuilds on that nor misses an edit that kept the old mtime.
13
+ // neither rebuilds on that nor misses an edit that kept the old mtime. The mtime memory below only
14
+ // decides when the digest is recomputed, never what it is compared against.
14
15
  //
15
16
  // **The digest is taken from the bytes the build read, never re-read from disk afterwards.** A source
16
17
  // edited while the build runs would otherwise be recorded as built, and its stale bundle read as fresh.
17
18
  //
19
+ // **A verified digest is remembered by each input's mtime and size**. Hashing
20
+ // every input on every hook launch is the gate's whole cost, so once the digest has matched, the
21
+ // inputs' signatures are written beside the stamp and a later launch whose signatures all match skips
22
+ // the hash. The digest stays the record: a copied or checked-out tree matches no remembered signature
23
+ // and is hashed once, then remembered. Each signature is taken before its input is read, so an edit
24
+ // landing during the hash leaves a signature that no longer matches. The memory is a separate file
25
+ // rather than a rewrite of the stamp, so a launch never races the build that owns the stamp, and the
26
+ // build's prune drops it with the outputs it vouched for.
27
+ //
28
+ // **Nothing is remembered while an input's mtime is still within the timestamp granularity of now.**
29
+ // On a coarse-mtime volume (HFS+ 1 s, FAT/exFAT 2 s) a same-size edit landing in the tick the
30
+ // signature was taken in keeps that signature, so it would be remembered as verified and never hashed
31
+ // again. Once an mtime is older than the window any later write moves it, so only settled inputs are
32
+ // remembered; a launch inside the window simply hashes.
33
+ //
18
34
  // This module is loaded by plain `node` on every hook launch (`scripts/hooks/hook-bundle-ready.ts`),
19
35
  // so it imports `node:` built-ins and `#scripts/*` subpaths alone — nothing slow to load.
20
36
 
21
37
  const STAMP_NAME = 'inputs.json'
38
+ const VERIFIED_NAME = '.inputs-verified.json'
22
39
  const DIGEST_ALGORITHM = 'sha256'
23
40
  const JSON_INDENT = '\t'
41
+ // The coarsest mtime resolution a remembered signature has to outlast (FAT/exFAT).
42
+ const MTIME_GRANULARITY_MS = 2000
24
43
 
25
44
  interface HookBundleStamp {
26
45
  digest: string
@@ -31,6 +50,20 @@ interface HookBundleStamp {
31
50
  // Package-relative input path → the bytes the build read for it.
32
51
  type HookSources = ReadonlyMap<string, Uint8Array>
33
52
 
53
+ // Package-relative input path → `<mtimeMs>:<size>`, as it stood when its bytes were hashed.
54
+ type InputSignatures = Record<string, string>
55
+
56
+ interface InputSnapshot {
57
+ signatures: InputSignatures
58
+ // False while any input's mtime is too recent to tell a later edit in the same tick apart.
59
+ is_settled: boolean
60
+ }
61
+
62
+ interface VerifiedDigest {
63
+ digest: string
64
+ signatures: InputSignatures
65
+ }
66
+
34
67
  // Code-unit order, so the digest does not depend on the locale of the machine that computes it.
35
68
  function by_code_unit(left: string, right: string): number {
36
69
  if (left === right) return 0
@@ -95,17 +128,86 @@ function read_stamp(out_directory: string): HookBundleStamp | undefined {
95
128
  return is_stamp(stamp) ? stamp : undefined
96
129
  }
97
130
 
131
+ // Undefined when an input is gone, like `read_sources`.
132
+ function read_snapshot(
133
+ package_directory: string,
134
+ inputs: ReadonlyArray<string>,
135
+ ): InputSnapshot | undefined {
136
+ const signatures: InputSignatures = {}
137
+ const settled_before = Date.now() - MTIME_GRANULARITY_MS
138
+ let is_settled = true
139
+
140
+ for (const input of inputs) {
141
+ const stats = statSync(path.join(package_directory, input), { throwIfNoEntry: false })
142
+ if (stats === undefined) return undefined
143
+ signatures[input] = `${String(stats.mtimeMs)}:${String(stats.size)}`
144
+ is_settled &&= stats.mtimeMs < settled_before
145
+ }
146
+
147
+ return { signatures, is_settled }
148
+ }
149
+
150
+ function read_verified(out_directory: string): Record<string, unknown> | undefined {
151
+ const verified_path = path.join(out_directory, VERIFIED_NAME)
152
+ if (!existsSync(verified_path)) return undefined
153
+ const verified = json_value.parse_or_undefined(readFileSync(verified_path, 'utf8'))
154
+
155
+ return json_value.is_record(verified) ? verified : undefined
156
+ }
157
+
158
+ // True when `digest` was verified against inputs whose signatures are all still `signatures`.
159
+ function is_remembered(
160
+ out_directory: string,
161
+ digest: string,
162
+ signatures: InputSignatures,
163
+ ): boolean {
164
+ const verified = read_verified(out_directory)
165
+ const remembered = verified?.['signatures']
166
+ if (verified?.['digest'] !== digest || !json_value.is_record(remembered)) return false
167
+
168
+ return Object.keys(signatures).every((input) => remembered[input] === signatures[input])
169
+ }
170
+
171
+ // Written through a rename so a concurrent launch never reads half a record. Best-effort: a tree that
172
+ // cannot be written is simply hashed again next time.
173
+ function remember(out_directory: string, verified: VerifiedDigest): void {
174
+ const temporary_path = path.join(out_directory, `${VERIFIED_NAME}.${String(process.pid)}`)
175
+
176
+ try {
177
+ writeFileSync(temporary_path, JSON.stringify(verified))
178
+ renameSync(temporary_path, path.join(out_directory, VERIFIED_NAME))
179
+ } catch {
180
+ rmSync(temporary_path, { force: true })
181
+ }
182
+ }
183
+
184
+ function is_digest_current(
185
+ out_directory: string,
186
+ package_directory: string,
187
+ stamp: HookBundleStamp,
188
+ { signatures, is_settled }: InputSnapshot,
189
+ ): boolean {
190
+ const sources = read_sources(package_directory, stamp.inputs)
191
+ if (sources === undefined || digest_of(sources) !== stamp.digest) return false
192
+ if (is_settled) remember(out_directory, { digest: stamp.digest, signatures })
193
+
194
+ return true
195
+ }
196
+
98
197
  // Fresh only when the record exists, every output it lists is still there, and the listed inputs hash
99
- // to the recorded digest — a missing or deleted input counts as stale.
198
+ // to the recorded digest — a missing or deleted input counts as stale. The hash is skipped when the
199
+ // inputs still carry the signatures of an earlier launch that verified this digest.
100
200
  function is_fresh(out_directory: string, package_directory: string): boolean {
101
201
  const stamp = read_stamp(out_directory)
102
202
  if (!stamp?.outputs.every((output) => existsSync(path.join(out_directory, output)))) return false
103
- const sources = read_sources(package_directory, stamp.inputs)
203
+ const snapshot = read_snapshot(package_directory, stamp.inputs)
204
+ if (snapshot === undefined) return false
205
+ if (is_remembered(out_directory, stamp.digest, snapshot.signatures)) return true
104
206
 
105
- return sources !== undefined && digest_of(sources) === stamp.digest
207
+ return is_digest_current(out_directory, package_directory, stamp, snapshot)
106
208
  }
107
209
 
108
- const hook_bundle_stamp = { is_fresh, STAMP_NAME, stamp_text }
210
+ const hook_bundle_stamp = { is_fresh, STAMP_NAME, stamp_text, VERIFIED_NAME }
109
211
 
110
212
  export type { HookSources }
111
213
  export { hook_bundle_stamp }
@@ -25,7 +25,7 @@ function resolve_local_bin(project_root: string, bin_name: string): string {
25
25
 
26
26
  // pnpm finds a shim by walking up from the working directory, so a caller that resolved only the
27
27
  // directory it was invoked in would disagree with the very commands it spawns — `josh gate` typed
28
- // in `src/lib` would miss the toolkit its sibling checks resolve fine (joshuafolkken/kit#934).
28
+ // in `src/lib` would miss the toolkit its sibling checks resolve fine.
29
29
  // Ascending for the shim itself, rather than for a `package.json` first, is what keeps the two in
30
30
  // step: a nested manifest that owns no `node_modules` is not where pnpm would stop either.
31
31
  function find_local_bin_upwards(start_directory: string, bin_name: string): string | undefined {
@@ -58,7 +58,7 @@ function read_bin_entry(
58
58
  // none in a consumer's tree — resolving it from this package's own directory finds it anyway. And
59
59
  // pnpm's shim hardcodes the store path of the version present when it was written: after a bump the
60
60
  // old store entry is pruned but the shim is not regenerated, so spawning it dies with
61
- // MODULE_NOT_FOUND (joshuafolkken/kit#668). Returns the CLI entry to hand `process.execPath`, or
61
+ // MODULE_NOT_FOUND. Returns the CLI entry to hand `process.execPath`, or
62
62
  // nothing when the package, its `bin` field or the entry on disk is missing — every caller has a
63
63
  // slower route to fall back to, so a failure here is never thrown.
64
64
  // One constraint worth knowing before adding a caller: this reads the target's manifest through
@@ -3,7 +3,7 @@ import { fileURLToPath } from 'node:url'
3
3
  import { cases, type Boundary } from './cases-logic'
4
4
 
5
5
  // `josh cases <path...>` — print the I/O boundaries the changed paths cross and the abnormal cases
6
- // each owes (joshuafolkken/kit#2246). The boundary tokens go on stdout so `$(pnpm josh cases …)` reads
6
+ // each owes. The boundary tokens go on stdout so `$(pnpm josh cases …)` reads
7
7
  // them; the required cases go on stderr so a person sees them without a shell parsing around them.
8
8
  // The logic and the vocabulary live in `cases-logic.ts`; everything here is the invocation.
9
9
 
@@ -1,6 +1,6 @@
1
1
  import { file_reader } from '#scripts/lib/read-file'
2
2
 
3
- // `josh cases <path...>` (joshuafolkken/kit#2246): read the changed paths and answer which I/O
3
+ // `josh cases <path...>`: read the changed paths and answer which I/O
4
4
  // boundaries the code crosses — network, process start, filesystem — then name the abnormal cases
5
5
  // that boundary always owes. The unit suite blocks network by construction
6
6
  // (`scripts/test/test-network-guard.ts`), so a boundary's abnormal cases never run there; this makes
@@ -50,7 +50,7 @@ const BOUNDARIES: ReadonlyArray<BoundaryDefinition> = [
50
50
  boundary: 'time',
51
51
  // The absence boundary: a change that coordinates over time — timers, schedules, retries,
52
52
  // heartbeats — owes the cases where the awaited thing never happens, which no diff of an I/O
53
- // call can surface (joshuafolkken/kit#2356). Same over-firing discipline as process and fs: the
53
+ // call can surface. Same over-firing discipline as process and fs: the
54
54
  // verbs (`setInterval`, `schedule`, `retry`) require a call paren so prose like "schedule the
55
55
  // release" no longer fires, while the domain nouns (`cron`, `heartbeat`, `watchdog`, `liveness`)
56
56
  // are unambiguous enough in source to match bare.
@@ -3,8 +3,7 @@ import { existsSync, readdirSync } from 'node:fs'
3
3
  // A local composite action is one directory under `.github/actions`, and GitHub resolves
4
4
  // `uses: ./.github/actions/<name>` to that directory's `action.yml` (or `action.yaml`). Workflow
5
5
  // scanners that read `.github/workflows` read these files too: `.github/actions/setup-pnpm` holds
6
- // the pnpm/setup pin and the safe-chain installer pin kit's workflows used to carry inline
7
- // (joshuafolkken/kit#2982).
6
+ // the pnpm/setup pin and the safe-chain installer pin kit's workflows used to carry inline.
8
7
  const ACTIONS_DIRECTORY = '.github/actions'
9
8
  const ACTION_FILE_NAMES = ['action.yml', 'action.yaml']
10
9
 
@@ -15,7 +15,7 @@ const CLASSIFICATION_SET: ReadonlySet<string> = new Set(CLASSIFICATION_LABELS)
15
15
  const ISSUE_BUG_LABEL = 'bug'
16
16
  // The line an Issue body declares its release classification with. A body written by a script
17
17
  // (`josh propagate`'s upgrade issue) builds it with `declaration`, so the writer and this parser share
18
- // one format (joshuafolkken/kit#2858).
18
+ // one format.
19
19
  const DECLARATION_PREFIX = '- リリース分類: '
20
20
  const DECLARATION = new RegExp(`^${DECLARATION_PREFIX}(.+)$`, 'gmu')
21
21
  const LEGACY_LABELS: ReadonlySet<string> = new Set(['semver-major', 'semver-minor'])
@@ -94,7 +94,7 @@ function select_issue_classification(issue_json: string): ReleaseClassification
94
94
  // The labels as they stand when the check runs, not as the event carried them. `josh pr` opens the
95
95
  // pull request and labels it in a second call, so the `opened` event carries none; judged from the
96
96
  // payload, that run fails, and when it lands in the newer check suite GitHub keeps its red result —
97
- // a rerun replays the same payload and fails again (joshuafolkken/kit#2712).
97
+ // a rerun replays the same payload and fails again.
98
98
  function fetch_current_labels(repository: string, pull_number: number): ReadonlyArray<string> {
99
99
  const path = `repos/${repository}/issues/${String(pull_number)}/labels`
100
100
 
@@ -8,7 +8,7 @@ const WORKFLOW_DESTINATION_PATTERN = /(?:^|[/\\])\.github[/\\]workflows[/\\][^/\
8
8
 
9
9
  // A local composite action is a workflow file too: it pins actions of its own, the distributed
10
10
  // `dependabot.yml` bumps it (`/.github/actions/*`), and the next sync writes it back — so it needs
11
- // the same pins and the same managed stamp as the workflow that calls it (joshuafolkken/kit#3013).
11
+ // the same pins and the same managed stamp as the workflow that calls it.
12
12
  const COMPOSITE_ACTION_DESTINATION_PATTERN =
13
13
  /(?:^|[/\\])\.github[/\\]actions[/\\][^/\\]+[/\\]action\.ya?ml$/u
14
14
 
@@ -1,4 +1,4 @@
1
- // Grouping fingerprints into clones, and classifying how far each clone spans (joshuafolkken/kit#2217).
1
+ // Grouping fingerprints into clones, and classifying how far each clone spans.
2
2
  //
3
3
  // This is the pure core the `no-clones` rule was missing a measurement for: `sonarjs/no-identical-
4
4
  // functions` sees only inside one file, and the rule's real target is duplication that crosses file
@@ -1,6 +1,6 @@
1
1
  import type { Fingerprint } from './clone-aggregate'
2
2
 
3
- // Turning source text into fingerprints (joshuafolkken/kit#2217).
3
+ // Turning source text into fingerprints.
4
4
  //
5
5
  // A fingerprint is a block of consecutive significant lines, each normalized so that reindentation
6
6
  // and reflowed whitespace do not hide a copy. Blank lines and comment-only lines are dropped before
@@ -2,7 +2,7 @@
2
2
  import { fileURLToPath } from 'node:url'
3
3
  import { clone_scan } from './clone-scan'
4
4
 
5
- // `josh clone:scan` — count duplication across files and repositories (joshuafolkken/kit#2217).
5
+ // `josh clone:scan` — count duplication across files and repositories.
6
6
  //
7
7
  // A command rather than a paragraph, for the reason `josh repo:party` is one: the `no-clones` rule
8
8
  // fires on the agent's own recognition that it is about to copy something, which is exactly the moment
@@ -9,7 +9,7 @@ import {
9
9
  } from './clone-aggregate'
10
10
  import { clone_fingerprint } from './clone-fingerprint'
11
11
 
12
- // Walking the source trees and reporting the clones (joshuafolkken/kit#2217).
12
+ // Walking the source trees and reporting the clones.
13
13
  //
14
14
  // The current repository is always scanned; every first-party sibling `repo_discovery` finds —
15
15
  // including the ones `JOSH_REPO_PATHS` adds — is scanned too, so a copy that crossed a package
@@ -3,7 +3,7 @@
3
3
  // `import` and tsconfig `extends` patches through `config_merge`, which exposes ensure + remove
4
4
  // semantics for one YAML or JSON list field while preserving every other key, value, and ordering.
5
5
  // JSON patches rewrite only the targeted field's own value, so comments, trailing commas and the
6
- // consumer's hand-formatting elsewhere in the document survive (joshuafolkken/kit#798).
6
+ // consumer's hand-formatting elsewhere in the document survive.
7
7
  import { json_list } from './patch-json-list'
8
8
  import { yaml_list } from './patch-yaml-list'
9
9
 
@@ -3,8 +3,7 @@
3
3
  // EXCEPT one case: prettier keeps a short array of primitives on a single line when it fits within
4
4
  // printWidth, whereas JSON.stringify always expands every non-empty array. We post-process the
5
5
  // stringify output, collapsing exactly those arrays back inline — reusing JSON.stringify for all
6
- // string escaping, number formatting, and key ordering so we never diverge on those. See
7
- // joshuafolkken/kit#660 (a synced tsconfig `exclude` was emitted multi-line and failed prettier).
6
+ // string escaping, number formatting, and key ordering so we never diverge on those.
8
7
  //
9
8
  // Scope note: an OVER-width array is left one-element-per-line, which matches prettier for string
10
9
  // arrays (the only kind these config files hold). prettier uses a packed "fill" layout only for
@@ -114,7 +113,6 @@ function format_json(value: unknown): string {
114
113
  // own line regardless of printWidth — so the inlining above, correct everywhere else, produces a
115
114
  // file the consumer's own `prettier --check` rejects. Plain `JSON.stringify` with tab indent is
116
115
  // byte-for-byte what that printer emits, so the fix is to skip the inlining rather than model it.
117
- // See joshuafolkken/kit#797.
118
116
  function format_package_json(value: unknown): string {
119
117
  return `${JSON.stringify(value, undefined, '\t')}\n`
120
118
  }
@@ -0,0 +1,90 @@
1
+ import { findNodeAtLocation, getNodeValue, parseTree, type Node } from 'jsonc-parser'
2
+ import { json_format } from './json-format'
3
+ import { patch_json_key } from './patch-json-key'
4
+
5
+ type ElementMatcher = (element: unknown) => boolean
6
+
7
+ interface ElementUpsert {
8
+ key: string
9
+ value: unknown
10
+ is_target: ElementMatcher
11
+ }
12
+
13
+ interface ArraySite {
14
+ property: Node
15
+ elements: ReadonlyArray<Node>
16
+ }
17
+
18
+ // `format_json({ [key]: [value] })` opens with `{` and `\t"key": [`, and closes with `\t]`, `}` and
19
+ // the empty string after the final newline; every line between them is the element.
20
+ const PROBE_HEAD_LINES = 2
21
+ const PROBE_TAIL_LINES = 3
22
+
23
+ function element_nodes(array: Node | undefined): ReadonlyArray<Node> {
24
+ if (array?.type !== 'array') return []
25
+
26
+ return array.children ?? []
27
+ }
28
+
29
+ // The top-level array `key` holds, when it has at least one element to anchor an edit to.
30
+ function find_array(content: string, key: string): ArraySite | undefined {
31
+ const root = parseTree(content)
32
+ const array = root === undefined ? undefined : findNodeAtLocation(root, [key])
33
+ const elements = element_nodes(array)
34
+ if (array?.parent === undefined || elements.length === 0) return undefined
35
+
36
+ return { property: array.parent, elements }
37
+ }
38
+
39
+ // The element's text at the depth it occupies in the document — rendered inside a probe of the same
40
+ // shape, so prettier's printWidth decisions for its nested arrays are measured at that depth. The
41
+ // first line carries no indent: it is spliced in where the element's line already starts.
42
+ function render_element(content: string, site: ArraySite, upsert: ElementUpsert): string {
43
+ const lines = json_format.format_json({ [upsert.key]: [upsert.value] }).split('\n')
44
+ const text = lines.slice(PROBE_HEAD_LINES, -PROBE_TAIL_LINES).join('\n')
45
+ const unit = patch_json_key.line_indent(content, site.property.offset)
46
+
47
+ return patch_json_key.fit_value(content, text, unit).trimStart()
48
+ }
49
+
50
+ function splice(content: string, node: Node, length: number, text: string): string {
51
+ return content.slice(0, node.offset) + text + content.slice(node.offset + length)
52
+ }
53
+
54
+ function append_element(content: string, last: Node, element_text: string): string {
55
+ const indent = patch_json_key.line_indent(content, last.offset)
56
+ const text = `,${patch_json_key.eol_of(content)}${indent}${element_text}`
57
+ const end = { ...last, offset: last.offset + last.length }
58
+
59
+ return splice(content, end, 0, text)
60
+ }
61
+
62
+ function is_equal(node: Node, value: unknown): boolean {
63
+ return JSON.stringify(getNodeValue(node)) === JSON.stringify(value)
64
+ }
65
+
66
+ function upsert_in(content: string, site: ArraySite, upsert: ElementUpsert): string {
67
+ const target = site.elements.find((element) => upsert.is_target(getNodeValue(element)))
68
+ if (target !== undefined && is_equal(target, upsert.value)) return content
69
+ const element_text = render_element(content, site, upsert)
70
+ if (target !== undefined) return splice(content, target, target.length, element_text)
71
+ const last = site.elements.at(-1)
72
+
73
+ return last === undefined ? content : append_element(content, last, element_text)
74
+ }
75
+
76
+ // Replace the element `is_target` picks with `value`, or append `value` when none matches — touching
77
+ // only that one element's text. Rewriting the whole array, as `set_json_key` does, would drop every
78
+ // comment and hand-layout inside the elements the consumer owns. An element
79
+ // already equal to `value` is left byte-for-byte as authored; an absent or empty array is created.
80
+ function upsert_element(content: string, upsert: ElementUpsert): string {
81
+ const site = find_array(content, upsert.key)
82
+ if (site === undefined) return patch_json_key.set_json_key(content, upsert.key, [upsert.value])
83
+
84
+ return upsert_in(content, site, upsert)
85
+ }
86
+
87
+ const patch_json_array = { upsert_element }
88
+
89
+ export type { ElementMatcher, ElementUpsert }
90
+ export { patch_json_array }
@@ -14,14 +14,14 @@ import { json_format } from './json-format'
14
14
  // tolerant JSONC parse and write the whole file back from the parsed object, which silently deleted
15
15
  // the consumer's comments — including the `// Path aliases are handled by ...` block `sv create`
16
16
  // ships. Editing text in place instead keeps comments, trailing commas, key order and any
17
- // hand-formatting outside the one value being changed. See joshuafolkken/kit#798.
17
+ // hand-formatting outside the one value being changed.
18
18
  //
19
19
  // jsonc-parser is used ONLY to locate text, never to produce it. Two independent reasons:
20
20
  //
21
21
  // 1. Its formatter breaks every array one element per line regardless of width — the layout
22
22
  // prettier wants for `package.json`, and the opposite of what it wants for the files edited
23
- // here, where the `json` printer keeps a short array inline. Letting it render would
24
- // re-introduce joshuafolkken/kit#797 on a new axis.
23
+ // here, where the `json` printer keeps a short array inline. Letting it render would fail
24
+ // `prettier --check` on the rewritten file.
25
25
  // 2. `modify` with `formattingOptions` reformats a region around its edit, not just the edit —
26
26
  // removing `compilerOptions` from a document also expanded the untouched `extends` array above
27
27
  // it. Dropping `formattingOptions` avoids that but then places inserted keys with no newline or
@@ -441,6 +441,9 @@ const patch_json_key = {
441
441
  set_json_key,
442
442
  remove_json_key,
443
443
  remove_json_path,
444
+ eol_of,
445
+ fit_value,
446
+ line_indent,
444
447
  }
445
448
 
446
449
  export { patch_json_key }
@@ -20,7 +20,7 @@ function normalize_list(value: unknown): ReadonlyArray<string> {
20
20
  // Ensure/remove the entries of one JSON list field, preserving every other key. A present field
21
21
  // keeps its position; a new field is appended last. Returns the input unchanged when nothing is
22
22
  // added or removed, so re-runs are idempotent. Only the field's own value is rewritten, so comments
23
- // and formatting elsewhere in the document survive (joshuafolkken/kit#798).
23
+ // and formatting elsewhere in the document survive.
24
24
  function patch_json_list_field(content: string, options: PatchJsonListOptions): string {
25
25
  const parsed = parse_jsonc(content)
26
26
  const existing = normalize_list(parsed[options.field])
@@ -28,7 +28,7 @@ function same_project(cwd: string, target: string): boolean {
28
28
  return cost_transcript.session_cwd(cwd) === cost_transcript.session_cwd(target)
29
29
  }
30
30
 
31
- // The billed input each request paid, oldest first (joshuafolkken/kit#2295). Each `token_count`
31
+ // The billed input each request paid, oldest first. Each `token_count`
32
32
  // event carries `last_token_usage` — that request's own input — so the per-request sequence the
33
33
  // hand-off's recent window reads is those deltas, not a cumulative-total difference. A session
34
34
  // resumed with inherited context is excluded for free: the inherited tokens are in the cumulative
@@ -1,7 +1,7 @@
1
1
  import { cost_pricing } from './cost-pricing'
2
2
 
3
- // **When a context cut pays back, priced from the cost model rather than fixed at a ceiling**
4
- // (joshuafolkken/kit#2406). A cut ends the oversized session and relaunches a fresh one that rebuilds
3
+ // **When a context cut pays back, priced from the cost model rather than fixed at a ceiling**.
4
+ // A cut ends the oversized session and relaunches a fresh one that rebuilds
5
5
  // only its preamble, so what it saves is not decided by a ceiling on the accumulated context but by a
6
6
  // *rate*: a cache read bills the whole context on every request, so whether to cut turns on how many
7
7
  // requests are still to come and what each would pay, not on how much has piled up.
@@ -21,9 +21,8 @@ const POST_CUT_CONTEXT = 60_000
21
21
  // The requests a resumed session is expected to still run — the horizon the break-even is measured
22
22
  // against. A cut only pays if enough requests remain to recoup the preamble rewrite; even the shortest
23
23
  // resume (into the gate, commit, PR and merge) runs on the order of ten. Ten is the conservative
24
- // horizon: it keeps the shared threshold near joshuafolkken/kit#2374's empirically validated 150_000
25
- // (this lands at 135_000, inside the 100k–200k band that PR simulated) while pricing the decision from
26
- // the cost model. It is the knob a before/after lane measurement tunes.
24
+ // horizon: it keeps the shared threshold near the empirically validated 150_000 (this lands at
25
+ // 135_000, inside the simulated 100k–200k band) while pricing the decision from the cost model. It is the knob a before/after lane measurement tunes.
27
26
  const EXPECTED_REMAINING_REQUESTS = 10
28
27
 
29
28
  // The price of a dropped token relative to a rewritten one, from `cost-pricing.ts`. A cache read bills
@@ -2,12 +2,10 @@ import { context_cut_payback } from './context-cut-payback'
2
2
 
3
3
  // The scheduler entry/hand-off and lane worker implementation cut use one threshold. Keeping the
4
4
  // value here prevents either side from drifting when the context budget changes.
5
- // joshuafolkken/kit#2374 lowered it from 200_000 by simulation; joshuafolkken/kit#2406 replaced the
6
- // hand-picked ceiling with a break-even: the threshold is no longer a chosen number but the current
7
- // per-request context at which a cut pays back over the expected remaining requests
8
- // (`context-cut-payback.ts`). At `POST_CUT_CONTEXT` 60_000 and a 10-request horizon that is 135_000 —
9
- // 10% under #2374's empirical 150_000 and inside the 100k–200k band that PR simulated — now derived
10
- // from the cache-price multipliers and the horizon rather than restated, so it moves with the model.
5
+ // The threshold is a break-even, not a chosen number: the current per-request context at which a
6
+ // cut pays back over the expected remaining requests (`context-cut-payback.ts`). At
7
+ // `POST_CUT_CONTEXT` 60_000 and a 10-request horizon that is 135_000, derived from the cache-price
8
+ // multipliers and the horizon rather than restated, so it moves with the model.
11
9
  const CONTEXT_CUT_THRESHOLD = context_cut_payback.break_even_context()
12
10
 
13
11
  export { CONTEXT_CUT_THRESHOLD }
@@ -1,9 +1,9 @@
1
1
  import type { UsageRecord } from './cost-usage'
2
2
 
3
- // Which Issue a request belongs to (joshuafolkken/kit#962).
3
+ // Which Issue a request belongs to.
4
4
  //
5
5
  // **The walk is keyed on the branch and nothing else**, which is why its input is `BranchBearing`
6
- // rather than `UsageRecord` (joshuafolkken/kit#1268). `josh time` attributes *spans* to an issue by
6
+ // rather than `UsageRecord`. `josh time` attributes *spans* to an issue by
7
7
  // exactly this rule, and the alternative to widening the parameter was a second copy of the
8
8
  // fill-forward walk over a different element type — the clone `CLAUDE.md` prohibits, in the one
9
9
  // place where a drift between the two would make `josh cost --issue` and `josh time --issue`
@@ -28,7 +28,7 @@ const UNATTRIBUTED_KEY = -1
28
28
 
29
29
  // Everything the attribution reads. `UsageRecord` satisfies it, and so does a timed span.
30
30
  //
31
- // **`issue` is the branch's answer where the branch cannot give one** (joshuafolkken/kit#1617). The
31
+ // **`issue` is the branch's answer where the branch cannot give one**. The
32
32
  // paragraph above assumes the session and the work share a checkout, and under lanes they do not: a
33
33
  // child's commands run in a linked work tree on `<N>-lane` while the session writing the transcript
34
34
  // sits on the default branch, so every line of a lane run reads `gitBranch: "main"` and no fill
@@ -1,7 +1,7 @@
1
1
  import { json_value } from '#scripts/lib/json-value'
2
2
  import { z } from 'zod'
3
3
 
4
- // Reading the content blocks out of a session transcript (joshuafolkken/kit#1151).
4
+ // Reading the content blocks out of a session transcript.
5
5
  //
6
6
  // `cost-usage.ts` reads the same file for what each request was billed and skips everything else.
7
7
  // This module reads the other half: what the conversation is actually made of. They stay apart
@@ -43,9 +43,8 @@ const BASH_TOOL = 'Bash'
43
43
  const COMMAND_KEY = 'command'
44
44
 
45
45
  // One block, reduced to what a token estimate needs. `command` is split out from the rest of a Bash
46
- // tool_use's input because the command body is the quantity joshuafolkken/kit#1150 measured at 30.2%
47
- // of one run's context and joshuafolkken/kit#1159 has to re-measure — folded into the rest of the
48
- // input it would not be readable at all.
46
+ // tool_use's input because the command body is a large, separately measured share of a run's
47
+ // context — folded into the rest of the input it would not be readable at all.
49
48
  interface ContentBlock {
50
49
  type: string
51
50
  tool_name: string
@@ -12,7 +12,7 @@ import { own_session } from './own-session'
12
12
  import { transcript_cwd } from './transcript-cwd'
13
13
 
14
14
  // `josh cost` — what the next turn of a run will cost, read from the active provider's own session
15
- // usage (joshuafolkken/kit#962).
15
+ // usage.
16
16
  //
17
17
  // Since #2016 this is the `--over` hand-off verdict alone. The readerless report scopes
18
18
  // (`--session` / `--issue` / `--all` / `--run` / `--json`) and the `--cap` counterfactual were
@@ -32,7 +32,7 @@ type CostVerdict = ReturnType<typeof cost_verdict.classify> | typeof UNMEASURABL
32
32
  interface Options {
33
33
  over?: number
34
34
  // The target project whose transcripts to read, or absent for this process's own working
35
- // directory (joshuafolkken/kit#1987). From the kit checkout, `--path <dir>` reads another
35
+ // directory. From the kit checkout, `--path <dir>` reads another
36
36
  // project's cost.
37
37
  path?: string
38
38
  }
@@ -110,7 +110,7 @@ function parse_options(argv: ReadonlyArray<string>): Options | undefined {
110
110
 
111
111
  // An empty corpus is reported, never priced at zero. "No transcript was found" and "this run was
112
112
  // free" are different answers, and only one of them is ever true. `session_id` names the session the
113
- // environment pointed at when its transcript is the one absent (joshuafolkken/kit#2403), so the
113
+ // environment pointed at when its transcript is the one absent, so the
114
114
  // message says "No transcript named <id>" rather than the whole-corpus "No transcripts found". The
115
115
  // wording is `cost_transcript`'s, so `josh time` says the same thing about the same directory.
116
116
  function report_empty(cwd: string, session_id: string | undefined): number {
@@ -121,14 +121,17 @@ function report_empty(cwd: string, session_id: string | undefined): number {
121
121
  return FAILURE_EXIT_CODE
122
122
  }
123
123
 
124
+ // The provider of this process's own session. A defaulted provider is no session at all: a launch may
125
+ // default to Claude Code, but pricing here would measure the newest transcript of some other session.
124
126
  function provider_of(environment: Environment): AgentProvider | undefined {
125
127
  const resolved = agent_role_profile.resolve_provider(environment)
128
+ if (resolved.kind !== 'provider' || resolved.is_default === true) return undefined
126
129
 
127
- return resolved.kind === 'provider' ? resolved.provider : undefined
130
+ return resolved.provider
128
131
  }
129
132
 
130
133
  // The own-session measurement, and — when there is none — which of the two "nothing to measure"
131
- // answers it is (joshuafolkken/kit#2403). `absent`: the environment named a session whose transcript
134
+ // answers it is. `absent`: the environment named a session whose transcript
132
135
  // is not in this corpus, reported by that name and never measured as another session's newest file.
133
136
  // `empty`: no transcript at all. `measured` still carries a session that exists but billed nothing,
134
137
  // which `report_over` reports as "no requests" — a third, distinct answer.
@@ -200,7 +203,7 @@ function measure(
200
203
  // `--over` for the anthropic provider: measured → the verdict; `absent` → the named session's
201
204
  // missing message; `empty` → the whole-corpus missing message. A measured session that billed
202
205
  // nothing falls to `report_over`'s "no requests", which keeps a 0-request transcript distinct from a
203
- // transcript that is not there at all (joshuafolkken/kit#2403).
206
+ // transcript that is not there at all.
204
207
  function run_over_anthropic(own: OwnMeasurement, target: string, limit: number): number {
205
208
  if (own.kind === 'measured') return cost_verdict.report_over(own.measurement, limit)
206
209
 
@@ -217,7 +220,7 @@ function run_over_codex(target: string, limit: number, environment: Environment)
217
220
  }
218
221
 
219
222
  // `--over`: what the next turn of this session will cost, read from the session's own transcript
220
- // alone — identified by id, not by mtime (joshuafolkken/kit#2403).
223
+ // alone — identified by id, not by mtime.
221
224
  function run_over(
222
225
  target: string,
223
226
  limit: number,
@@ -241,7 +244,7 @@ function verdict_of(measurement: OverMeasurement | undefined): CostVerdict {
241
244
  return cost_verdict.classify(measurement, CONTEXT_CUT_THRESHOLD)
242
245
  }
243
246
 
244
- // The `--cut` verdict as a value, printing nothing (joshuafolkken/kit#2165). `run:status` bundles
247
+ // The `--cut` verdict as a value, printing nothing. `run:status` bundles
245
248
  // this beside the issue state and the carry record, so it needs the token rather than the exit code
246
249
  // `run` returns. `unmeasurable` is the read-only counterpart of `report_empty` / the empty-session
247
250
  // error: a session with no provider, no transcript of its own, or no request cannot be priced, and
@@ -269,8 +272,8 @@ function run_context(
269
272
  }
270
273
 
271
274
  // This process's own working directory, kept as-is: from a lane the transcript search covers the
272
- // lane's own slug alone (joshuafolkken/kit#2236), so pre-rewriting the cwd to the main checkout here
273
- // would drop the lane's own slug and hide a dispatched child's transcript (joshuafolkken/kit#1749).
275
+ // lane's own slug alone, so pre-rewriting the cwd to the main checkout here
276
+ // would drop the lane's own slug and hide a dispatched child's transcript.
274
277
  // `time-cli.ts` gives the same reason.
275
278
  function run(
276
279
  argv: ReadonlyArray<string>,
@@ -285,7 +288,7 @@ function run(
285
288
  return FAILURE_EXIT_CODE
286
289
  }
287
290
 
288
- // `--path <dir>` reads the target project instead of the process cwd (joshuafolkken/kit#1987).
291
+ // `--path <dir>` reads the target project instead of the process cwd.
289
292
  const target = transcript_cwd.resolve(context.path, cwd)
290
293
  if (reject_openai_cross_project(context, target, cwd)) return FAILURE_EXIT_CODE
291
294