@joshuafolkken/kit 1.1514.0 → 1.1784.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 (858) hide show
  1. package/.claude/agents/investigator.md +1 -1
  2. package/.claude/settings.json +5 -5
  3. package/.claude/skills/epic-commands/SKILL.md +26 -65
  4. package/.claude/skills/epic-commands/epic-bundle.md +3 -1
  5. package/.claude/skills/workflow-commands/SKILL.md +5 -5
  6. package/.claude/skills/workflow-commands/background-commands.md +5 -5
  7. package/.claude/skills/workflow-commands/backlogrun-child.md +10 -8
  8. package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +7 -25
  9. package/.claude/skills/workflow-commands/backlogrun-lanes.md +17 -13
  10. package/.claude/skills/workflow-commands/backlogrun-park.md +14 -23
  11. package/.claude/skills/workflow-commands/backlogrun-progress.md +2 -2
  12. package/.claude/skills/workflow-commands/backlogrun-recovery.md +5 -5
  13. package/.claude/skills/workflow-commands/backlogrun-steps.md +10 -10
  14. package/.claude/skills/workflow-commands/backlogrun.md +1 -1
  15. package/.claude/skills/workflow-commands/chain-rule.md +13 -7
  16. package/.claude/skills/workflow-commands/delegation.md +6 -5
  17. package/.claude/skills/workflow-commands/entry-sequence.md +9 -9
  18. package/.claude/skills/workflow-commands/followup.md +9 -31
  19. package/.claude/skills/workflow-commands/fullrun-steps.md +36 -45
  20. package/.claude/skills/workflow-commands/fullrun.md +2 -2
  21. package/.claude/skills/workflow-commands/halfrun.md +17 -25
  22. package/.claude/skills/workflow-commands/issue-comments.md +16 -12
  23. package/.claude/skills/workflow-commands/issue-scout.md +2 -2
  24. package/.claude/skills/workflow-commands/kickoff.md +24 -23
  25. package/.claude/skills/workflow-commands/latest-gate.md +7 -12
  26. package/.claude/skills/workflow-commands/needs-human-review.md +9 -14
  27. package/.claude/skills/workflow-commands/observation-filing.md +4 -36
  28. package/.claude/skills/workflow-commands/observation-ledger.md +1 -1
  29. package/.claude/skills/workflow-commands/pre-gate-cut.md +13 -30
  30. package/.claude/skills/workflow-commands/prerequisite.md +10 -16
  31. package/.claude/skills/workflow-commands/progress-watcher.md +1 -1
  32. package/.claude/skills/workflow-commands/prrun.md +3 -7
  33. package/.claude/skills/workflow-commands/retrospective.md +1 -1
  34. package/.claude/skills/workflow-commands/split-assessment.md +13 -1
  35. package/.claude/skills/workflow-commands/working-tree-hold.md +9 -9
  36. package/.codex/hooks.json +5 -5
  37. package/.github/actions/setup-node/action.yml +9 -0
  38. package/.github/actions/setup-pnpm/action.yml +1 -1
  39. package/.github/dependabot.yml +16 -0
  40. package/.github/release.yml +0 -2
  41. package/.github/workflows/ci.yml +120 -10
  42. package/.github/workflows/publish.yml +8 -1
  43. package/.github/workflows/sonar-qube.yml +1 -0
  44. package/.prettierignore +2 -0
  45. package/.vscode/tasks.json +1 -2
  46. package/CLAUDE.md +3 -7
  47. package/README.md +4 -2
  48. package/SECURITY.md +1 -1
  49. package/dist/CLAUDE.md +3 -7
  50. package/dist/commands/document-read-cli.js +882 -0
  51. package/dist/commands/{document-section-cli.js → document-section-main.js} +79 -37
  52. package/dist/commands/read-set-cli.js +1867 -0
  53. package/dist/commands/run-prep-main.js +21653 -0
  54. package/dist/commands/run-step-cli.js +23880 -0
  55. package/dist/config-merge/index.js +5 -1
  56. package/dist/hooks/audit-provision.js +20 -35
  57. package/dist/hooks/{chunk-DGT54IH5.js → chunk-AZX4FGQ3.js} +63 -17
  58. package/dist/hooks/chunk-CWMBGKYW.js +6483 -0
  59. package/dist/hooks/chunk-O2YBIDSI.js +4306 -0
  60. package/dist/hooks/{chunk-TNUMY6NL.js → chunk-PT5R6UJD.js} +4193 -1900
  61. package/dist/hooks/chunk-TUIFS5E7.js +72 -0
  62. package/dist/hooks/{chunk-723HKZO5.js → chunk-VWWCFGWK.js} +1 -1
  63. package/dist/hooks/{chunk-APUO6U4J.js → chunk-WR2KQAYZ.js} +1843 -440
  64. package/dist/hooks/{chunk-O6GDRNJB.js → chunk-XGBNSWEI.js} +248 -46
  65. package/dist/hooks/chunk-YCDOIR3I.js +3456 -0
  66. package/dist/hooks/codex-hook-adapter.js +10 -22
  67. package/dist/hooks/format-edited.js +5 -6
  68. package/dist/hooks/inputs.json +443 -317
  69. package/dist/hooks/pretool-guard.js +7 -25
  70. package/dist/hooks/session-lang.js +44 -51
  71. package/dist/hooks/stop-guard.js +7716 -2187
  72. package/dist/josh.js +6002 -3583
  73. package/dist/self-sync-guard/index.js +74 -10
  74. package/dist/version/index.js +115 -406
  75. package/eslint/base.js +1 -1
  76. package/lefthook/base.yml +3 -1
  77. package/package.json +10 -48
  78. package/pnpm-workspace.yaml +4 -2
  79. package/prompts/coding-standards.md +1 -1
  80. package/prompts/collaboration-workflow/file-edits.md +1 -7
  81. package/prompts/collaboration-workflow/issue-citation.md +1 -1
  82. package/prompts/collaboration-workflow/issue-template.md +33 -16
  83. package/prompts/collaboration-workflow/lane-instructions.md +1 -2
  84. package/prompts/collaboration-workflow/measurement.md +37 -0
  85. package/prompts/collaboration-workflow/operating-rules.md +4 -6
  86. package/prompts/collaboration-workflow/output-bounds.md +2 -7
  87. package/prompts/collaboration-workflow/plan-comment.md +3 -42
  88. package/prompts/collaboration-workflow/principles.md +5 -0
  89. package/prompts/collaboration-workflow/report-format.md +31 -60
  90. package/prompts/collaboration-workflow/residency.md +2 -2
  91. package/prompts/collaboration-workflow/shell-body.md +6 -16
  92. package/prompts/collaboration-workflow/turn-batching.md +0 -2
  93. package/prompts/collaboration-workflow/upstream-interrupt.md +14 -4
  94. package/prompts/collaboration-workflow/wip-cap.md +1 -1
  95. package/prompts/collaboration-workflow.md +3 -7
  96. package/prompts/refactoring.md +1 -1
  97. package/prompts/review-rubric.md +1 -2
  98. package/prompts/review.md +41 -21
  99. package/prompts/testing-guide.md +8 -43
  100. package/scripts/agent/agent-event.ts +15 -15
  101. package/scripts/agent/agent-exit-record.ts +13 -1
  102. package/scripts/agent/api-auth.ts +41 -0
  103. package/scripts/agent/api-outage.ts +1 -1
  104. package/scripts/auto-ok/auto-ok-cli.ts +14 -16
  105. package/scripts/auto-ok/auto-ok-judge-read.ts +12 -3
  106. package/scripts/auto-ok/auto-ok-judge-write.ts +46 -19
  107. package/scripts/auto-ok/auto-ok-judge.ts +13 -2
  108. package/scripts/auto-ok/auto-ok-main.ts +17 -0
  109. package/scripts/backlog/backlog-arrival.ts +14 -3
  110. package/scripts/backlog/backlog-budget-cli.ts +7 -33
  111. package/scripts/backlog/backlog-budget-main.ts +16 -0
  112. package/scripts/backlog/backlog-budget.ts +2 -3
  113. package/scripts/backlog/backlog-defect-priority.ts +4 -3
  114. package/scripts/backlog/backlog-drive-adopt.ts +67 -0
  115. package/scripts/backlog/backlog-drive-args.ts +4 -5
  116. package/scripts/backlog/backlog-drive-cli.ts +113 -28
  117. package/scripts/backlog/backlog-drive-hold.ts +162 -0
  118. package/scripts/backlog/backlog-drive-idle.ts +151 -0
  119. package/scripts/backlog/backlog-drive-judge.ts +25 -0
  120. package/scripts/backlog/backlog-drive-memory.ts +126 -0
  121. package/scripts/backlog/backlog-drive-named-offer.ts +5 -10
  122. package/scripts/backlog/backlog-drive-named.ts +53 -6
  123. package/scripts/backlog/backlog-drive-offer-argv.ts +3 -8
  124. package/scripts/backlog/backlog-drive-paused.ts +169 -0
  125. package/scripts/backlog/backlog-drive-restore.ts +30 -7
  126. package/scripts/backlog/backlog-drive-seats.ts +18 -8
  127. package/scripts/backlog/backlog-drive-token-handling.ts +38 -0
  128. package/scripts/backlog/backlog-drive.ts +79 -75
  129. package/scripts/backlog/backlog-next-main.ts +16 -0
  130. package/scripts/backlog/backlog-next-shared.ts +73 -0
  131. package/scripts/backlog/backlog-next.ts +48 -16
  132. package/scripts/backlog/backlog-occupied.ts +52 -39
  133. package/scripts/backlog/backlog-offer-cli.ts +6 -21
  134. package/scripts/backlog/backlog-offer-exclude.ts +15 -0
  135. package/scripts/backlog/backlog-offer-main.ts +12 -0
  136. package/scripts/backlog/backlog-offer.ts +36 -3
  137. package/scripts/backlog/backlog-overlap.ts +22 -4
  138. package/scripts/backlog/backlog-plan-read.ts +6 -2
  139. package/scripts/backlog/backlog-plan.ts +18 -4
  140. package/scripts/backlog/backlog-pool.ts +10 -10
  141. package/scripts/backlog/backlog-rank.ts +10 -2
  142. package/scripts/backlog/backlog-ready.ts +112 -30
  143. package/scripts/backlog/backlog-stalled-detect.ts +109 -36
  144. package/scripts/backlog/backlog-stalled.ts +52 -16
  145. package/scripts/backlog/backlog-wait-cause.ts +86 -0
  146. package/scripts/backlog/backlog-waves.ts +39 -13
  147. package/scripts/backlog/backlogrun-args.ts +19 -7
  148. package/scripts/backlog/backlogrun-cli.ts +19 -5
  149. package/scripts/backlog/backlogrun-launch.ts +6 -0
  150. package/scripts/backlog/backlogrun-restart.ts +97 -0
  151. package/scripts/backlog/backlogrun-stop.ts +79 -7
  152. package/scripts/behavior/behavior-cli.ts +2 -2
  153. package/scripts/behavior/behavior-rules.ts +47 -24
  154. package/scripts/build/build-bin.ts +2 -16
  155. package/scripts/build/build-claude-md.ts +0 -7
  156. package/scripts/build/build-commands.ts +0 -13
  157. package/scripts/build/build-hooks.ts +49 -48
  158. package/scripts/build/hook-bundle-stamp.ts +29 -11
  159. package/scripts/build/local-bin.ts +1 -1
  160. package/scripts/cases/cases-cli.ts +25 -13
  161. package/scripts/cases/cases-interaction-scan.ts +134 -0
  162. package/scripts/cases/cases-interaction.ts +183 -0
  163. package/scripts/cases/cases-logic.ts +39 -6
  164. package/scripts/ci/pr-classification-main.ts +18 -0
  165. package/scripts/ci/pr-classification.ts +10 -17
  166. package/scripts/clone/clone-scan.ts +1 -1
  167. package/scripts/cost-runtime/cost-blocks.ts +22 -37
  168. package/scripts/cost-runtime/cost-cli.ts +31 -14
  169. package/scripts/cost-runtime/cost-main.ts +12 -0
  170. package/scripts/cost-runtime/cost-transcript.ts +1 -0
  171. package/scripts/delegation/delegation-policy.ts +17 -4
  172. package/scripts/delegation/duplicate-read-guard.ts +0 -8
  173. package/scripts/delegation/investigation-guard.ts +0 -8
  174. package/scripts/delegation/investigation-reads.ts +3 -4
  175. package/scripts/dependabot/dependabot-cooldown.ts +194 -0
  176. package/scripts/discovery/repo-discovery.ts +24 -6
  177. package/scripts/doctor/doctor-consumer.ts +2 -5
  178. package/scripts/document/document-byte-budget.ts +8 -6
  179. package/scripts/document/document-scan.ts +1 -1
  180. package/scripts/document/document-section-cli.ts +0 -8
  181. package/scripts/document/document-section-main.ts +12 -0
  182. package/scripts/epic/epic-audit-cli.ts +12 -6
  183. package/scripts/epic/epic-bundle-apply.ts +137 -0
  184. package/scripts/epic/epic-bundle-cli.ts +32 -121
  185. package/scripts/epic/epic-bundle-format.ts +116 -0
  186. package/scripts/epic/epic-bundle-main.ts +17 -0
  187. package/scripts/epic/epic-busy.ts +5 -12
  188. package/scripts/epic/epic-classify.ts +24 -15
  189. package/scripts/epic/epic-cli-argv.ts +31 -0
  190. package/scripts/epic/epic-cli-decide.ts +42 -0
  191. package/scripts/epic/epic-cli.ts +6 -38
  192. package/scripts/epic/epic-close.ts +112 -55
  193. package/scripts/epic/epic-cross-repo.ts +4 -7
  194. package/scripts/epic/epic-decide.ts +119 -0
  195. package/scripts/epic/epic-decision.ts +9 -0
  196. package/scripts/epic/epic-fetch.ts +4 -0
  197. package/scripts/epic/epic-graph.ts +2 -0
  198. package/scripts/epic/epic-issue.ts +5 -1
  199. package/scripts/epic/epic-label-age.ts +1 -1
  200. package/scripts/epic/epic-lane-offer.ts +39 -4
  201. package/scripts/epic/epic-next-main.ts +24 -0
  202. package/scripts/epic/epic-next.ts +6 -24
  203. package/scripts/epic/epic-outside-blocker.ts +6 -2
  204. package/scripts/epic/epic-parse.ts +9 -3
  205. package/scripts/epic/epic-read.ts +1 -0
  206. package/scripts/epic/epic-reconcile.ts +39 -0
  207. package/scripts/epic/epic-run.ts +10 -1
  208. package/scripts/epic/epic-solo.ts +50 -14
  209. package/scripts/epic/epic.ts +41 -7
  210. package/scripts/exports/unused-members-cli.ts +2 -2
  211. package/scripts/followup/followup-checks-event.ts +8 -3
  212. package/scripts/followup/followup-coderabbit-wait.ts +82 -0
  213. package/scripts/followup/followup-review-gates.ts +81 -0
  214. package/scripts/followup/git-followup-stages.ts +13 -3
  215. package/scripts/followup/git-followup-workflow.ts +19 -66
  216. package/scripts/followup/git-pr-followup-wrapup.ts +9 -14
  217. package/scripts/followup/git-pr-followup.ts +36 -8
  218. package/scripts/fresh-machine/fresh-machine-cli.ts +1 -1
  219. package/scripts/fresh-machine/fresh-machine-run.ts +8 -8
  220. package/scripts/fresh-machine/specs/kit-test-backlogrun.json +1 -1
  221. package/scripts/gate/busy-average.ts +58 -0
  222. package/scripts/gate/check-cpu.ts +60 -0
  223. package/scripts/gate/check-inputs.ts +39 -95
  224. package/scripts/gate/check-reuse.ts +33 -54
  225. package/scripts/gate/command-memory.ts +192 -0
  226. package/scripts/gate/core-admission.ts +218 -28
  227. package/scripts/gate/core-budget-timing.ts +37 -0
  228. package/scripts/gate/core-budget.ts +80 -98
  229. package/scripts/gate/core-wait-record.ts +48 -0
  230. package/scripts/gate/core-wait.ts +37 -5
  231. package/scripts/gate/core-weights.ts +86 -0
  232. package/scripts/gate/free-cores.ts +27 -4
  233. package/scripts/gate/gate-ledger.ts +32 -4
  234. package/scripts/gate/gate-plan.ts +41 -34
  235. package/scripts/gate/gate-report.ts +14 -2
  236. package/scripts/gate/gate-run-steps.ts +53 -8
  237. package/scripts/gate/gate-skip.ts +12 -2
  238. package/scripts/gate/gate-steps.ts +12 -1
  239. package/scripts/gate/input-fingerprint.ts +42 -0
  240. package/scripts/gate/machine-capacity.ts +65 -31
  241. package/scripts/gate/moved-paths.ts +67 -0
  242. package/scripts/gate/project-checks.ts +5 -12
  243. package/scripts/gate/scoped-green.ts +12 -8
  244. package/scripts/gate/since-green.ts +62 -0
  245. package/scripts/gate/toolchain-inputs.ts +115 -0
  246. package/scripts/gate/verification-gate.ts +27 -24
  247. package/scripts/gate/verification-inputs.ts +250 -0
  248. package/scripts/gh/gh-author-association.ts +96 -9
  249. package/scripts/gh/git-ai-review-scan.ts +4 -2
  250. package/scripts/gh/git-gh-api-path.ts +15 -0
  251. package/scripts/gh/git-gh-branch-rules.ts +73 -0
  252. package/scripts/gh/git-gh-conditional.ts +5 -2
  253. package/scripts/gh/git-gh-issue-read.ts +5 -1
  254. package/scripts/gh/git-gh-issue-write.ts +67 -29
  255. package/scripts/gh/git-gh-issue.ts +7 -3
  256. package/scripts/gh/git-gh-poll-read.ts +89 -0
  257. package/scripts/gh/git-gh-pr-auto-merge.ts +8 -3
  258. package/scripts/gh/git-gh-pr-rest.ts +1 -1
  259. package/scripts/gh/git-gh-pr-snapshot.ts +33 -20
  260. package/scripts/gh/git-gh-pr.ts +27 -15
  261. package/scripts/gh/git-pr-checks-eval.ts +39 -7
  262. package/scripts/gh/git-pr-checks-parse.ts +39 -9
  263. package/scripts/gh/git-pr-merge-checked.ts +80 -0
  264. package/scripts/git/base-tree.ts +19 -2
  265. package/scripts/git/changed-file-scope.ts +6 -4
  266. package/scripts/git/changed-paths.ts +18 -1
  267. package/scripts/git/git-diff-reads.ts +27 -2
  268. package/scripts/git/git-grep-hits.ts +85 -0
  269. package/scripts/git/git-location-environment.ts +1 -1
  270. package/scripts/git/git-merge-conflicts.ts +83 -0
  271. package/scripts/git/git-preflight.ts +37 -12
  272. package/scripts/git/git-push-transport.ts +1 -2
  273. package/scripts/git/git-schemas.ts +17 -7
  274. package/scripts/git/git-spawn.ts +1 -2
  275. package/scripts/git/git-status.ts +4 -4
  276. package/scripts/git/main-merge-main.ts +12 -0
  277. package/scripts/git/main-merge-regenerate.ts +2 -2
  278. package/scripts/git/main-merge.ts +25 -9
  279. package/scripts/git/main-sync-main.ts +12 -0
  280. package/scripts/git/main-sync.ts +0 -9
  281. package/scripts/git/stash/git-stash.ts +27 -4
  282. package/scripts/git/stash/{stash-pop-args.ts → stash-args.ts} +13 -10
  283. package/scripts/git/stash/stash-pop-cli.ts +6 -12
  284. package/scripts/git/stash/stash-pop-main.ts +12 -0
  285. package/scripts/git/stash/stash-push-cli.ts +76 -0
  286. package/scripts/git/stash/stash-push-main.ts +12 -0
  287. package/scripts/hooks/batch-guard.ts +0 -8
  288. package/scripts/hooks/check-commit-message-main.ts +8 -0
  289. package/scripts/hooks/check-commit-message.ts +4 -7
  290. package/scripts/hooks/format-edited-file.ts +8 -24
  291. package/scripts/hooks/pre-commit-lint.ts +30 -3
  292. package/scripts/hooks/pre-push-unit.ts +4 -2
  293. package/scripts/hooks/pretool-guard-cli.ts +1 -8
  294. package/scripts/hooks/pretool-guard.ts +32 -19
  295. package/scripts/hooks/reserved-run.ts +67 -9
  296. package/scripts/hooks/run-hook.sh +13 -4
  297. package/scripts/hooks/shell-rules-notice.ts +37 -0
  298. package/scripts/hooks/stop-actions.ts +2 -21
  299. package/scripts/hooks/stop-guard.ts +13 -9
  300. package/scripts/init/hook-command-rewrite.ts +19 -5
  301. package/scripts/init/hook-launch.ts +15 -17
  302. package/scripts/init/init-actions.ts +0 -6
  303. package/scripts/init/init-ai-copy.ts +10 -36
  304. package/scripts/init/init-bootstrap.ts +9 -8
  305. package/scripts/init/init-dry-run-report.ts +1 -1
  306. package/scripts/init/init-dry-run.ts +1 -1
  307. package/scripts/init/init-file-action.ts +7 -9
  308. package/scripts/init/init-logic-json-merge.ts +2 -2
  309. package/scripts/init/init-logic-migrate.ts +9 -82
  310. package/scripts/init/init-logic.ts +3 -2
  311. package/scripts/init/init-main.ts +12 -0
  312. package/scripts/init/init.ts +5 -12
  313. package/scripts/init/kit-development-versions.ts +3 -7
  314. package/scripts/init/kit-written-paths.ts +2 -2
  315. package/scripts/init/project-profile.ts +5 -4
  316. package/scripts/init/tsconfig-preset-migration.ts +2 -1
  317. package/scripts/init/vscode-tasks.ts +1 -1
  318. package/scripts/issue/defect-origin-cli.ts +106 -0
  319. package/scripts/issue/defect-origin-line.ts +60 -0
  320. package/scripts/issue/defect-origin-main.ts +11 -0
  321. package/scripts/issue/defect-origin.ts +114 -0
  322. package/scripts/issue/defect-rate-cli.ts +34 -78
  323. package/scripts/issue/defect-rate.ts +0 -16
  324. package/scripts/issue/defect-report-cli.ts +128 -0
  325. package/scripts/issue/defect-report-format.ts +56 -0
  326. package/scripts/issue/defect-report-main.ts +11 -0
  327. package/scripts/issue/defect-report.ts +160 -0
  328. package/scripts/issue/expected-effect-lint.ts +1 -0
  329. package/scripts/issue/issue-already-done-cli.ts +62 -0
  330. package/scripts/issue/issue-body-or-comment.ts +40 -0
  331. package/scripts/issue/issue-cite-cli.ts +0 -9
  332. package/scripts/issue/issue-cite-main.ts +12 -0
  333. package/scripts/issue/issue-classification.ts +12 -7
  334. package/scripts/issue/issue-comment-cli.ts +10 -24
  335. package/scripts/issue/issue-comment-main.ts +12 -0
  336. package/scripts/issue/issue-evidence-exit.ts +100 -0
  337. package/scripts/issue/issue-file-cli.ts +29 -7
  338. package/scripts/issue/issue-file.ts +19 -19
  339. package/scripts/issue/issue-fold-cli.ts +2 -11
  340. package/scripts/issue/issue-fold-main.ts +12 -0
  341. package/scripts/issue/issue-labels.ts +81 -90
  342. package/scripts/issue/issue-lint-cli.ts +2 -10
  343. package/scripts/issue/issue-lint-main.ts +12 -0
  344. package/scripts/issue/issue-measured-cli.ts +56 -0
  345. package/scripts/issue/issue-merged.ts +19 -2
  346. package/scripts/issue/issue-not-before-label.ts +135 -0
  347. package/scripts/issue/issue-not-before.ts +111 -0
  348. package/scripts/issue/issue-number-shape.ts +15 -1
  349. package/scripts/issue/issue-park.ts +28 -0
  350. package/scripts/issue/issue-plan-cli.ts +151 -0
  351. package/scripts/issue/issue-priority.ts +151 -0
  352. package/scripts/issue/issue-rank.ts +7 -1
  353. package/scripts/issue/issue-read-cli.ts +3 -10
  354. package/scripts/issue/issue-read-main.ts +12 -0
  355. package/scripts/issue/issue-read.ts +29 -5
  356. package/scripts/issue/issue-release-cli.ts +0 -10
  357. package/scripts/issue/issue-release-main.ts +13 -0
  358. package/scripts/issue/issue-release.ts +7 -12
  359. package/scripts/issue/issue-sample-gate.ts +192 -0
  360. package/scripts/issue/issue-sample-source.ts +76 -0
  361. package/scripts/issue/issue-scout-cli.ts +0 -11
  362. package/scripts/issue/issue-scout-main.ts +14 -0
  363. package/scripts/issue/issue-state-cli.ts +0 -10
  364. package/scripts/issue/issue-state-main.ts +12 -0
  365. package/scripts/issue/issue-watch-diff.ts +56 -15
  366. package/scripts/issue/issue-watch.ts +2 -1
  367. package/scripts/issue/issue-wip.ts +2 -7
  368. package/scripts/issue/measure-rerun-cli.ts +13 -8
  369. package/scripts/issue/plan-consumers-cli.ts +39 -0
  370. package/scripts/issue/plan-consumers-main.ts +11 -0
  371. package/scripts/issue/plan-consumers-section.ts +55 -0
  372. package/scripts/issue/plan-consumers.ts +127 -0
  373. package/scripts/josh/agent-session-environment.ts +1 -1
  374. package/scripts/josh/command-usage.ts +15 -43
  375. package/scripts/josh/file-map-stamp.ts +49 -16
  376. package/scripts/josh/hook-decision.ts +32 -20
  377. package/scripts/josh/josh-command-map.ts +4 -1
  378. package/scripts/josh/josh-command-types.ts +12 -6
  379. package/scripts/josh/josh-commands-agent-hooks.ts +83 -0
  380. package/scripts/josh/josh-commands-ai.ts +157 -158
  381. package/scripts/josh/josh-commands-backlog.ts +82 -16
  382. package/scripts/josh/josh-commands-clone.ts +1 -0
  383. package/scripts/josh/josh-commands-development.ts +111 -71
  384. package/scripts/josh/josh-commands-document.ts +43 -1
  385. package/scripts/josh/josh-commands-epic.ts +171 -0
  386. package/scripts/josh/josh-commands-hooks.ts +25 -2
  387. package/scripts/josh/josh-commands-issue-write.ts +181 -0
  388. package/scripts/josh/josh-commands-issue.ts +124 -24
  389. package/scripts/josh/josh-commands-lane.ts +103 -2
  390. package/scripts/josh/josh-commands-lint.ts +19 -8
  391. package/scripts/josh/josh-commands-maintenance.ts +112 -4
  392. package/scripts/josh/josh-commands-pause.ts +29 -0
  393. package/scripts/josh/josh-commands-progress.ts +87 -0
  394. package/scripts/josh/josh-commands-project.ts +138 -9
  395. package/scripts/josh/josh-commands-review.ts +124 -0
  396. package/scripts/josh/josh-commands-run.ts +211 -23
  397. package/scripts/josh/josh-commands-ship.ts +169 -0
  398. package/scripts/josh/josh-commands-split.ts +9 -0
  399. package/scripts/josh/josh-commands-versioning.ts +49 -2
  400. package/scripts/josh/josh-commands-workflow.ts +144 -6
  401. package/scripts/josh/josh-logic.ts +6 -13
  402. package/scripts/josh/package-directory.ts +2 -4
  403. package/scripts/josh/process-identity.ts +13 -4
  404. package/scripts/josh/session-language-cli.ts +4 -8
  405. package/scripts/josh/session-language-main.ts +13 -0
  406. package/scripts/josh/session-language.ts +6 -1
  407. package/scripts/josh/shared-cache.ts +90 -0
  408. package/scripts/josh/stamp-file.ts +9 -15
  409. package/scripts/lane/lane-await.ts +51 -12
  410. package/scripts/lane/lane-cache.ts +5 -30
  411. package/scripts/lane/lane-capacity.ts +14 -23
  412. package/scripts/lane/lane-check-stats.ts +62 -21
  413. package/scripts/lane/lane-child-invocation.ts +8 -0
  414. package/scripts/lane/lane-cli.ts +15 -5
  415. package/scripts/lane/lane-close.ts +86 -18
  416. package/scripts/lane/lane-core-wait-stats.ts +66 -0
  417. package/scripts/lane/lane-dispatch.ts +24 -3
  418. package/scripts/lane/lane-gap-stats.ts +156 -0
  419. package/scripts/lane/lane-handoff.ts +69 -1
  420. package/scripts/lane/lane-held-stats.ts +129 -0
  421. package/scripts/lane/lane-install.ts +4 -11
  422. package/scripts/lane/lane-launch-cli.ts +0 -9
  423. package/scripts/lane/lane-launch-main.ts +12 -0
  424. package/scripts/lane/lane-ledger-schema.ts +266 -0
  425. package/scripts/lane/lane-ledger.ts +92 -123
  426. package/scripts/lane/lane-limit-cli.ts +12 -1
  427. package/scripts/lane/lane-measure-cli.ts +57 -11
  428. package/scripts/lane/lane-open.ts +9 -1
  429. package/scripts/lane/lane-parked.ts +3 -3
  430. package/scripts/lane/lane-pause-cli.ts +130 -0
  431. package/scripts/lane/lane-pause.ts +158 -0
  432. package/scripts/lane/lane-process-table.ts +166 -0
  433. package/scripts/lane/lane-reap-settle.ts +124 -0
  434. package/scripts/lane/lane-reap.ts +50 -15
  435. package/scripts/lane/lane-registry.ts +24 -3
  436. package/scripts/lane/lane-residents.ts +162 -0
  437. package/scripts/lane/lane-restart.ts +22 -2
  438. package/scripts/lane/lane-round-two-stats.ts +49 -0
  439. package/scripts/lane/lane-sampler.ts +4 -0
  440. package/scripts/lane/lane-session-action.ts +19 -5
  441. package/scripts/lane/lane-session-broker.ts +102 -21
  442. package/scripts/lane/lane-snapshot-trace.ts +84 -0
  443. package/scripts/lane/lane-spans.ts +51 -0
  444. package/scripts/lane/lane-spent.ts +6 -3
  445. package/scripts/lane/lane-stage-stats.ts +7 -2
  446. package/scripts/lane/lane-state.ts +302 -0
  447. package/scripts/lane/lane-stats.ts +58 -4
  448. package/scripts/lane/lane-stop-stats.ts +113 -37
  449. package/scripts/lane/lane-test-related-stats.ts +127 -0
  450. package/scripts/lane/lane-transcript-calls.ts +145 -0
  451. package/scripts/lane/lane-transcript-stats.ts +168 -0
  452. package/scripts/lane/lane-vacant.ts +13 -3
  453. package/scripts/lane/lane-withdraw-cli.ts +5 -4
  454. package/scripts/lane/lane-withdraw.ts +50 -49
  455. package/scripts/lane/process-directories.ts +70 -0
  456. package/scripts/lane/process-lane-marks.ts +94 -0
  457. package/scripts/lib/atomic-write.ts +62 -0
  458. package/scripts/lib/buffered-process.ts +12 -5
  459. package/scripts/lib/cli-flags.ts +53 -0
  460. package/scripts/lib/figure-format.ts +63 -0
  461. package/scripts/lib/json-value.ts +9 -1
  462. package/scripts/lib/package-manifest.ts +35 -0
  463. package/scripts/lib/read-file.ts +3 -1
  464. package/scripts/lib/stamped-memo.ts +63 -0
  465. package/scripts/lib/stdout-on-stderr.ts +24 -0
  466. package/scripts/lib/timeouts.ts +9 -0
  467. package/scripts/lib/transcript-record.ts +91 -0
  468. package/scripts/lines/effective-limit.ts +1 -1
  469. package/scripts/lint/eslint-cache-dependencies.ts +145 -0
  470. package/scripts/lint/eslint-daemon.ts +265 -0
  471. package/scripts/lint/format.ts +11 -2
  472. package/scripts/lint/import-graph.ts +279 -0
  473. package/scripts/lint/lint-gate-scope.ts +102 -0
  474. package/scripts/lint/lint-parallel-main.ts +19 -0
  475. package/scripts/lint/lint-parallel.ts +62 -30
  476. package/scripts/lint/lint-related-scope.ts +30 -24
  477. package/scripts/lint/lint-related.ts +38 -6
  478. package/scripts/notify/confirmation-options.ts +1 -2
  479. package/scripts/notify/telegram-notify.ts +20 -20
  480. package/scripts/notify/telegram-test-logic.ts +0 -1
  481. package/scripts/notify/telegram-test-main.ts +8 -0
  482. package/scripts/notify/telegram-test.ts +2 -6
  483. package/scripts/observations/observation-ledger.ts +13 -0
  484. package/scripts/observations/observations-flush-landing.ts +5 -3
  485. package/scripts/observations/observations-flush.ts +6 -1
  486. package/scripts/overrides/overrides-check.ts +2 -5
  487. package/scripts/overrides/overrides-files.ts +2 -1
  488. package/scripts/overrides/overrides-logic.ts +3 -6
  489. package/scripts/package/verify-optional-eslint-install.ts +8 -6
  490. package/scripts/propagate/propagate-publish.ts +2 -7
  491. package/scripts/propagate/propagate-targets.ts +4 -12
  492. package/scripts/refactor/import-graph.ts +9 -7
  493. package/scripts/release/github-release-runs.ts +17 -6
  494. package/scripts/release/release-approval-prune.ts +18 -0
  495. package/scripts/release/release-history.ts +1 -3
  496. package/scripts/release/release-progress.ts +42 -22
  497. package/scripts/release/release-publish-run.ts +39 -0
  498. package/scripts/release/release-publish.ts +6 -6
  499. package/scripts/release/release-scope-cli.ts +0 -10
  500. package/scripts/release/release-scope-main.ts +12 -0
  501. package/scripts/repo/repo-setting.ts +3 -6
  502. package/scripts/repo/required-checks-logic.ts +6 -15
  503. package/scripts/report/report-format-reference.ts +2 -0
  504. package/scripts/report/report-labels.ts +155 -0
  505. package/scripts/report/report-lint-cli.ts +3 -0
  506. package/scripts/report/report-lint.ts +85 -110
  507. package/scripts/report/report-template-cli.ts +59 -0
  508. package/scripts/report/report-template.ts +112 -0
  509. package/scripts/review/acceptance-map.ts +1 -0
  510. package/scripts/review/removed-tests-check.ts +86 -0
  511. package/scripts/review/removed-tests.ts +149 -0
  512. package/scripts/review/review-brief-cli.ts +81 -15
  513. package/scripts/review/review-brief-main.ts +12 -0
  514. package/scripts/review/review-brief.ts +31 -3
  515. package/scripts/review/review-code-tree.ts +10 -6
  516. package/scripts/review/review-comment-round.ts +26 -8
  517. package/scripts/review/review-finding-ledger.ts +30 -15
  518. package/scripts/review/review-interaction.ts +94 -0
  519. package/scripts/review/review-readers-scan.ts +163 -0
  520. package/scripts/review/review-record-cli.ts +69 -30
  521. package/scripts/review/review-record-main.ts +12 -0
  522. package/scripts/review/review-round-one-blobs.ts +221 -0
  523. package/scripts/review/review-round2-cli.ts +49 -12
  524. package/scripts/review/review-round2.ts +80 -12
  525. package/scripts/review/review-stamps.ts +19 -1
  526. package/scripts/review/review-stop-log.ts +96 -0
  527. package/scripts/review/review-stops-cli.ts +85 -0
  528. package/scripts/review/review-tree.ts +6 -17
  529. package/scripts/review/review-untouched-readers.ts +146 -0
  530. package/scripts/review/test-titles.ts +118 -0
  531. package/scripts/rules/agent-model.ts +8 -0
  532. package/scripts/rules/bash-triggers.ts +46 -3
  533. package/scripts/rules/decision-oracle-batch.ts +9 -1
  534. package/scripts/rules/decision-oracle.ts +2 -2
  535. package/scripts/rules/delivered-rules.ts +80 -2
  536. package/scripts/rules/destructive-command.ts +8 -1
  537. package/scripts/rules/direct-filing.ts +10 -2
  538. package/scripts/rules/direct-issue-comment.ts +117 -0
  539. package/scripts/rules/direct-pr-create.ts +69 -3
  540. package/scripts/rules/early-heartbeat.ts +2 -1
  541. package/scripts/rules/file-body.ts +7 -0
  542. package/scripts/rules/filing-cap.ts +7 -0
  543. package/scripts/rules/git-argv.ts +72 -14
  544. package/scripts/rules/git-force.ts +12 -2
  545. package/scripts/rules/guard-remedy.ts +4 -0
  546. package/scripts/rules/implementation-cut-verdict.ts +1 -1
  547. package/scripts/rules/implementation-cut.ts +11 -3
  548. package/scripts/rules/index-guard.ts +8 -1
  549. package/scripts/rules/issue-comments.ts +9 -1
  550. package/scripts/rules/josh-git-bare.ts +7 -0
  551. package/scripts/rules/lane-background.ts +67 -25
  552. package/scripts/rules/lane-carry-conflict.ts +6 -0
  553. package/scripts/rules/lane-direct-tool.ts +74 -0
  554. package/scripts/rules/lane-interactive-ask.ts +9 -2
  555. package/scripts/rules/lane-park.ts +45 -23
  556. package/scripts/rules/lane-split-park.ts +10 -2
  557. package/scripts/rules/lane-switch-main.ts +7 -0
  558. package/scripts/rules/oracle-consulted.ts +10 -0
  559. package/scripts/rules/oracle-firing.ts +1 -0
  560. package/scripts/rules/permission-guards.ts +3 -0
  561. package/scripts/rules/piped-verification.ts +1 -1
  562. package/scripts/rules/poll-loop.ts +7 -0
  563. package/scripts/rules/pr-merge.ts +123 -0
  564. package/scripts/rules/protected-files.ts +32 -5
  565. package/scripts/rules/raw-field-body.ts +6 -0
  566. package/scripts/rules/rule-body-guard.ts +8 -0
  567. package/scripts/rules/rule-list.ts +9 -28
  568. package/scripts/rules/rule-value-cache.ts +4 -9
  569. package/scripts/rules/rule-value-cli.ts +51 -32
  570. package/scripts/rules/rule-value.ts +1 -1
  571. package/scripts/rules/shell-segments.ts +35 -0
  572. package/scripts/rules/stop-rule-rows.ts +64 -0
  573. package/scripts/rules/stop-rules.ts +3 -4
  574. package/scripts/rules/test-declared-commit.ts +11 -1
  575. package/scripts/rules/third-party-write.ts +7 -0
  576. package/scripts/rules/timed-rerun.ts +69 -0
  577. package/scripts/rules/worktree-guard.ts +13 -3
  578. package/scripts/run/board/run-board-app-name.ts +23 -0
  579. package/scripts/run/board/run-board-cli.ts +65 -32
  580. package/scripts/run/board/run-board-earlier.ts +94 -0
  581. package/scripts/run/board/run-board-ending-reason.ts +67 -0
  582. package/scripts/run/board/run-board-estimate-schedule.ts +103 -0
  583. package/scripts/run/board/run-board-estimate.ts +98 -0
  584. package/scripts/run/board/run-board-fit.ts +153 -36
  585. package/scripts/run/board/run-board-fold.ts +123 -0
  586. package/scripts/run/board/run-board-fresh.ts +2 -2
  587. package/scripts/run/board/run-board-gather-live.ts +29 -0
  588. package/scripts/run/board/run-board-gather-thread.ts +189 -0
  589. package/scripts/run/board/run-board-gather-worker.ts +29 -0
  590. package/scripts/run/board/run-board-gather.ts +187 -0
  591. package/scripts/run/board/run-board-github.ts +118 -38
  592. package/scripts/run/board/run-board-header.ts +82 -20
  593. package/scripts/run/board/run-board-keys.ts +58 -0
  594. package/scripts/run/board/run-board-kind.ts +20 -6
  595. package/scripts/run/board/run-board-labels.ts +116 -71
  596. package/scripts/run/board/run-board-lane-state.ts +109 -0
  597. package/scripts/run/board/run-board-lane-time.ts +122 -0
  598. package/scripts/run/board/run-board-layout.ts +239 -60
  599. package/scripts/run/board/run-board-length.ts +52 -0
  600. package/scripts/run/board/run-board-machine.ts +8 -4
  601. package/scripts/run/board/run-board-main.ts +12 -0
  602. package/scripts/run/board/run-board-notes.ts +52 -31
  603. package/scripts/run/board/run-board-now.ts +1 -1
  604. package/scripts/run/board/run-board-operation.ts +15 -33
  605. package/scripts/run/board/run-board-phase.ts +1 -1
  606. package/scripts/run/board/run-board-plan-shared.ts +115 -0
  607. package/scripts/run/board/run-board-plan.ts +55 -3
  608. package/scripts/run/board/run-board-planning.ts +45 -0
  609. package/scripts/run/board/run-board-priority.ts +44 -0
  610. package/scripts/run/board/run-board-process-groups.ts +195 -0
  611. package/scripts/run/board/run-board-read.ts +151 -27
  612. package/scripts/run/board/run-board-reason.ts +235 -51
  613. package/scripts/run/board/run-board-released.ts +35 -0
  614. package/scripts/run/board/run-board-render-checks.ts +39 -5
  615. package/scripts/run/board/run-board-render-condition.ts +96 -0
  616. package/scripts/run/board/run-board-render-drawn.ts +67 -0
  617. package/scripts/run/board/run-board-render-foot.ts +59 -0
  618. package/scripts/run/board/run-board-render-icon.ts +35 -0
  619. package/scripts/run/board/run-board-render-lanes.ts +145 -0
  620. package/scripts/run/board/run-board-render-lead.ts +80 -0
  621. package/scripts/run/board/run-board-render-legend.ts +117 -48
  622. package/scripts/run/board/run-board-render-notes.ts +156 -29
  623. package/scripts/run/board/run-board-render-processes.ts +196 -0
  624. package/scripts/run/board/run-board-render-section.ts +119 -0
  625. package/scripts/run/board/run-board-render-slot.ts +3 -36
  626. package/scripts/run/board/run-board-render-tail.ts +115 -48
  627. package/scripts/run/board/run-board-render-time.ts +56 -0
  628. package/scripts/run/board/run-board-render-title.ts +117 -24
  629. package/scripts/run/board/run-board-render-waits.ts +104 -20
  630. package/scripts/run/board/run-board-render.ts +207 -265
  631. package/scripts/run/board/run-board-roots.ts +54 -0
  632. package/scripts/run/board/run-board-row-yield.ts +9 -4
  633. package/scripts/run/board/run-board-setup.ts +1 -12
  634. package/scripts/run/board/run-board-snapshot.ts +111 -0
  635. package/scripts/run/board/run-board-spin.ts +2 -2
  636. package/scripts/run/board/run-board-state.ts +22 -33
  637. package/scripts/run/board/run-board-status.ts +147 -71
  638. package/scripts/run/board/run-board-thanks-read.ts +2 -2
  639. package/scripts/run/board/run-board-tick.ts +122 -107
  640. package/scripts/run/board/run-board-usage-board.ts +78 -0
  641. package/scripts/run/board/run-board-usage-lanes.ts +113 -0
  642. package/scripts/run/board/run-board-usage-listing.ts +93 -0
  643. package/scripts/run/board/run-board-usage-read.ts +120 -150
  644. package/scripts/run/board/run-board-usage-rusage.ts +19 -7
  645. package/scripts/run/board/run-board-usage-text.ts +139 -51
  646. package/scripts/run/board/run-board-usage-top.ts +102 -0
  647. package/scripts/run/board/run-board-usage.ts +89 -72
  648. package/scripts/run/board/run-board-usual.ts +20 -9
  649. package/scripts/run/carry/run-carry-args.ts +4 -7
  650. package/scripts/run/carry/run-carry-conversation.ts +1 -1
  651. package/scripts/run/carry/run-carry.ts +9 -4
  652. package/scripts/run/cut/run-cut-handoff.ts +2 -2
  653. package/scripts/run/event/run-event-cli.ts +1 -5
  654. package/scripts/run/event/run-event-filed.ts +12 -6
  655. package/scripts/run/event/run-event-follow.ts +2 -3
  656. package/scripts/run/event/run-event-render.ts +6 -10
  657. package/scripts/run/event/run-event-scope.ts +2 -2
  658. package/scripts/run/event/run-event-stream-emit.ts +82 -22
  659. package/scripts/run/event/run-event-stream.ts +34 -8
  660. package/scripts/run/hold/run-hold-adopt.ts +65 -0
  661. package/scripts/run/hold/run-hold-cli.ts +93 -22
  662. package/scripts/run/hold/run-hold-main.ts +12 -0
  663. package/scripts/run/hold/run-hold-member.ts +37 -0
  664. package/scripts/run/hold/run-stop-notify.ts +183 -0
  665. package/scripts/run/merge/run-merge-auth.ts +31 -0
  666. package/scripts/run/merge/run-merge-cli.ts +62 -48
  667. package/scripts/run/merge/run-merge-close.ts +74 -0
  668. package/scripts/run/merge/run-merge-collect.ts +6 -13
  669. package/scripts/run/merge/run-merge-driver.ts +71 -0
  670. package/scripts/run/merge/run-merge-main.ts +12 -0
  671. package/scripts/run/merge/run-merge-outcome.ts +23 -0
  672. package/scripts/run/merge/run-merge-restart.ts +39 -0
  673. package/scripts/run/merge/run-merge-ship.ts +20 -4
  674. package/scripts/run/merge/run-merge-signals.ts +33 -9
  675. package/scripts/run/merge/run-merge-steps.ts +120 -85
  676. package/scripts/run/merge/run-merge.ts +38 -37
  677. package/scripts/run/park/run-park-cli.ts +91 -0
  678. package/scripts/run/park/run-park.ts +88 -0
  679. package/scripts/run/park/run-stalled.ts +68 -0
  680. package/scripts/run/pause/run-pause-cli.ts +73 -0
  681. package/scripts/run/pause/run-pause.ts +251 -0
  682. package/scripts/run/progress/run-progress-cli.ts +4 -12
  683. package/scripts/run/progress/run-progress-clock.ts +1 -1
  684. package/scripts/run/progress/run-progress-config.ts +6 -14
  685. package/scripts/run/progress/run-progress-main.ts +12 -0
  686. package/scripts/run/progress/run-progress.ts +1 -4
  687. package/scripts/run/review/run-review.ts +2 -1
  688. package/scripts/run/run-ending.ts +1 -0
  689. package/scripts/run/run-invocation.ts +5 -6
  690. package/scripts/run/run-liveness-cli.ts +6 -8
  691. package/scripts/run/run-liveness.ts +60 -29
  692. package/scripts/run/run-next.ts +1 -1
  693. package/scripts/run/run-parent-cut-hook.ts +2 -2
  694. package/scripts/run/run-preflight.ts +18 -3
  695. package/scripts/run/run-prep-cli.ts +1 -10
  696. package/scripts/run/run-prep-locate.ts +7 -50
  697. package/scripts/run/run-prep-main.ts +12 -0
  698. package/scripts/run/run-prep.ts +6 -0
  699. package/scripts/run/run-report-cli.ts +101 -13
  700. package/scripts/run/run-report-handoff.ts +114 -0
  701. package/scripts/run/run-step.ts +1 -1
  702. package/scripts/run/run-stranded-detect.ts +13 -0
  703. package/scripts/run/run-watcher-guard-cli.ts +1 -1
  704. package/scripts/run/run-watcher-guard.ts +1 -1
  705. package/scripts/run/ship/run-ship-args.ts +121 -0
  706. package/scripts/run/ship/run-ship-body-draft.ts +110 -0
  707. package/scripts/run/ship/run-ship-cli.ts +63 -140
  708. package/scripts/run/ship/run-ship-detach.ts +19 -8
  709. package/scripts/run/ship/run-ship-infra-retry.ts +59 -0
  710. package/scripts/run/ship/run-ship-next.ts +18 -2
  711. package/scripts/run/ship/run-ship-overlap.ts +42 -5
  712. package/scripts/run/ship/run-ship-place.ts +96 -0
  713. package/scripts/run/ship/run-ship-pre-detach-timed.ts +43 -0
  714. package/scripts/run/ship/run-ship-pre-detach.ts +81 -24
  715. package/scripts/run/ship/run-ship-preflight.ts +137 -32
  716. package/scripts/run/ship/run-ship-probe.ts +11 -3
  717. package/scripts/run/ship/run-ship-relaunch-cap.ts +70 -0
  718. package/scripts/run/ship/run-ship-removed-rows.ts +61 -0
  719. package/scripts/run/ship/run-ship-return.ts +107 -23
  720. package/scripts/run/ship/run-ship-review-steps.ts +105 -151
  721. package/scripts/run/ship/run-ship-review.ts +73 -6
  722. package/scripts/run/ship/run-ship-reviewer.ts +207 -0
  723. package/scripts/run/ship/run-ship-stage.ts +55 -6
  724. package/scripts/run/ship/run-ship-steps.ts +46 -15
  725. package/scripts/run/ship/run-ship-stop-cause.ts +135 -0
  726. package/scripts/run/ship/run-ship-stop-text.ts +11 -6
  727. package/scripts/run/ship/run-ship-sync.ts +43 -6
  728. package/scripts/run/ship/run-ship.ts +30 -2
  729. package/scripts/run/tidy/run-tidy-cli.ts +0 -4
  730. package/scripts/run/tidy/run-tidy-lanes.ts +3 -0
  731. package/scripts/run/tidy/run-tidy-main.ts +8 -0
  732. package/scripts/run/wake/run-wake-cli.ts +119 -100
  733. package/scripts/run/wake/run-wake-code.ts +83 -0
  734. package/scripts/run/wake/run-wake-driver.ts +19 -8
  735. package/scripts/run/wake/run-wake-loop.ts +34 -3
  736. package/scripts/run/wake/run-wake-main.ts +13 -0
  737. package/scripts/run/wake/run-wake-ports.ts +90 -0
  738. package/scripts/run/wake/run-wake-takeover.ts +66 -0
  739. package/scripts/run/wake/run-wake.ts +2 -1
  740. package/scripts/safe-chain/pack-hook.ts +2 -2
  741. package/scripts/safe-chain/preinstall-command.ts +2 -1
  742. package/scripts/safe-chain/project-config.ts +3 -9
  743. package/scripts/security/security-audit-main.ts +8 -0
  744. package/scripts/security/security-audit-provision-logic.ts +0 -11
  745. package/scripts/security/security-audit-provision-main.ts +12 -0
  746. package/scripts/security/security-audit-provision.ts +11 -26
  747. package/scripts/security/security-audit.ts +6 -7
  748. package/scripts/self-sync-guard/self-sync-guard-logic.ts +6 -13
  749. package/scripts/split/split-assess-cli.ts +2 -2
  750. package/scripts/split/split-assess.ts +15 -0
  751. package/scripts/split/split-measure.ts +65 -0
  752. package/scripts/sync/claude-settings-merge.ts +8 -15
  753. package/scripts/sync/directory-copy-guard.ts +4 -9
  754. package/scripts/sync/file-content.ts +78 -8
  755. package/scripts/sync/sync-ai-files.ts +3 -5
  756. package/scripts/sync/sync-configs.ts +11 -23
  757. package/scripts/sync/sync-hook-safety.ts +4 -10
  758. package/scripts/sync/sync-main.ts +11 -0
  759. package/scripts/sync/sync.ts +25 -37
  760. package/scripts/test/test-declared-changed.ts +2 -2
  761. package/scripts/test/test-declared.ts +1 -1
  762. package/scripts/test/test-e2e-guard.ts +25 -1
  763. package/scripts/test/test-e2e-stamp.ts +38 -0
  764. package/scripts/test/test-pinned-logic.ts +145 -0
  765. package/scripts/test/test-pinned-main.ts +78 -0
  766. package/scripts/test/test-pinned.ts +100 -0
  767. package/scripts/test/test-read-map.ts +264 -0
  768. package/scripts/test/test-read-recording.ts +91 -0
  769. package/scripts/test/test-read-trace.ts +148 -0
  770. package/scripts/test/test-red-main.ts +12 -0
  771. package/scripts/test/test-red.ts +12 -30
  772. package/scripts/test/test-related-main.ts +18 -0
  773. package/scripts/test/test-related-record.ts +119 -0
  774. package/scripts/test/test-related-scope.ts +229 -43
  775. package/scripts/test/test-related.ts +300 -22
  776. package/scripts/test/test-unit-guard-main.ts +15 -0
  777. package/scripts/test/test-unit-guard.ts +42 -24
  778. package/scripts/test/unit-count-file.ts +37 -0
  779. package/scripts/test/unit-run-marker.ts +162 -0
  780. package/scripts/test/unit-setup-files.ts +51 -0
  781. package/scripts/test/unit-worker-share.ts +61 -149
  782. package/scripts/test/whole-suite-files.ts +63 -0
  783. package/scripts/time-runtime/time-background.ts +20 -2
  784. package/scripts/time-runtime/time-bundles.ts +4 -3
  785. package/scripts/time-runtime/time-density-hook.ts +8 -6
  786. package/scripts/time-runtime/time-followup-stage.ts +1 -3
  787. package/scripts/time-runtime/time-format.ts +5 -28
  788. package/scripts/time-runtime/time-markers.ts +10 -1
  789. package/scripts/time-runtime/time-shell.ts +97 -10
  790. package/scripts/time-runtime/time-transcript-line.ts +49 -62
  791. package/scripts/uninstall/uninstall.ts +1 -1
  792. package/scripts/version/bump-version-main.ts +12 -0
  793. package/scripts/version/bump-version.ts +25 -25
  794. package/scripts/version/effective-upstream.ts +6 -12
  795. package/scripts/version/latest-corepack.ts +17 -32
  796. package/scripts/version/latest-if-required-cli.ts +93 -0
  797. package/scripts/version/latest-lane-guard-main.ts +8 -0
  798. package/scripts/version/latest-lane-guard.ts +0 -4
  799. package/scripts/version/latest-scope-cli.ts +0 -9
  800. package/scripts/version/latest-scope-main.ts +12 -0
  801. package/scripts/version/latest-update.ts +5 -5
  802. package/scripts/version/npm-registry.ts +44 -6
  803. package/scripts/version/publishable-range-check.ts +5 -16
  804. package/scripts/version/release-age.ts +1 -1
  805. package/scripts/version/release-hold.ts +1 -1
  806. package/scripts/version/release-window.ts +38 -0
  807. package/scripts/version/running-binary.ts +1 -1
  808. package/scripts/version/safe-chain-version-update.ts +3 -8
  809. package/scripts/version/version-targets.ts +6 -28
  810. package/templates/dependabot.yml +29 -0
  811. package/templates/gitignore +4 -1
  812. package/templates/pnpm-workspace.basic.yaml +1 -1
  813. package/templates/sonar-project.properties +3 -2
  814. package/templates/workflows/ci.yml +12 -4
  815. package/templates/workflows/github-release.yml +4 -0
  816. package/tsconfig.sonar.json +1 -1
  817. package/.ncurc.json +0 -3
  818. package/dist/hooks/batch-guard.js +0 -29
  819. package/dist/hooks/chunk-4KKD2UTK.js +0 -66
  820. package/dist/hooks/chunk-6TS2JD6D.js +0 -237
  821. package/dist/hooks/chunk-7DSBJVFH.js +0 -50
  822. package/dist/hooks/chunk-A65Y4YOR.js +0 -79
  823. package/dist/hooks/chunk-CDY4NFQG.js +0 -15
  824. package/dist/hooks/chunk-EFXE6C37.js +0 -81
  825. package/dist/hooks/chunk-GP4IEC4O.js +0 -20
  826. package/dist/hooks/chunk-JP45SOCJ.js +0 -56
  827. package/dist/hooks/chunk-LAOV7NLM.js +0 -45
  828. package/dist/hooks/chunk-M4HGZV7U.js +0 -83
  829. package/dist/hooks/chunk-PF2NZL2A.js +0 -131
  830. package/dist/hooks/chunk-PTICX4OL.js +0 -358
  831. package/dist/hooks/chunk-RT27QRJW.js +0 -6247
  832. package/dist/hooks/chunk-SYOTDYCI.js +0 -3533
  833. package/dist/hooks/chunk-UPUZF3AN.js +0 -279
  834. package/dist/hooks/chunk-WK6SMBIC.js +0 -3180
  835. package/dist/hooks/duplicate-read-guard.js +0 -30
  836. package/dist/hooks/investigation-guard.js +0 -29
  837. package/scripts/backlog/backlog-stalled-cli.ts +0 -30
  838. package/scripts/cost-runtime/cost-format.ts +0 -29
  839. package/scripts/init/basic-path-migration.ts +0 -24
  840. package/scripts/issue/issue-backlinks-cli.ts +0 -93
  841. package/scripts/josh/josh-commands-guard.ts +0 -38
  842. package/scripts/josh/josh-usage-automation.ts +0 -121
  843. package/scripts/josh/josh-usage-backlog.ts +0 -180
  844. package/scripts/josh/josh-usage-developer.ts +0 -230
  845. package/scripts/josh/josh-usage-hooks.ts +0 -38
  846. package/scripts/josh/josh-usage-issue.ts +0 -205
  847. package/scripts/josh/josh-usage-review.ts +0 -101
  848. package/scripts/josh/josh-usage-run.ts +0 -252
  849. package/scripts/josh/josh-usage-session.ts +0 -238
  850. package/scripts/josh/josh-usage-workflow.ts +0 -212
  851. package/scripts/lint/cross-file-recheck.ts +0 -155
  852. package/scripts/registry-migration/migrate-logic.ts +0 -237
  853. package/scripts/registry-migration/migrate.ts +0 -292
  854. package/scripts/registry-migration/user-npmrc.ts +0 -15
  855. package/scripts/rules/rule-guard.ts +0 -23
  856. package/scripts/rules/rule-registry-rows.ts +0 -292
  857. package/scripts/rules/rule-registry.ts +0 -112
  858. package/scripts/run/run-stranded-cli.ts +0 -27
@@ -0,0 +1,149 @@
1
+ import { markdown_section } from '#scripts/issue/markdown-section'
2
+ import { report_format_reference } from '#scripts/report/report-format-reference'
3
+ import { test_titles } from './test-titles'
4
+
5
+ // A test is the record of a behavior, and a change that deletes one with no word of what replaced it
6
+ // loses that behavior silently: the gate stays green and the review reads only what is there
7
+ // (joshuafolkken/kit#4287, after #4171 dropped `lane_thresholds()` with the tests that guarded it).
8
+ // **This is the seam where a deleted test has to be accounted for**: every test the base had and the
9
+ // change no longer has is listed in the review brief, and the merge is refused until the pull request
10
+ // body names, for each, the test that replaced it or the Issue that retired its behavior.
11
+ //
12
+ // **A test that moved is not deleted.** Tests are compared by full name across every changed test
13
+ // file, so one moved to another file keeps its name. One moved under another `describe` keeps its own
14
+ // title, so a gone name is matched against an arrived name with the same title, one for one — a common
15
+ // title such as "returns undefined" deleted under one block is still listed when another block keeps
16
+ // its own copy.
17
+
18
+ const DISPOSITION_HEADING = '## 消えたテストの処置'
19
+ // The heading as a line of its own, never the mention of it inside a format hint.
20
+ const HEADING_LINE = new RegExp(String.raw`^${DISPOSITION_HEADING}[ \t]*$`, 'mu')
21
+ const REPLACED = '置き換え'
22
+ const RETIRED = '廃止'
23
+ const PENDING_SUFFIX = '— 未記入'
24
+ const BRIEF_HEADING = 'Removed tests'
25
+ // The title runs to the first backtick that a disposition follows, so a title holding backticks of its
26
+ // own — `it('reads the \`.each\` table')` — can still be disposed.
27
+ const ROW_PATTERN = new RegExp(
28
+ String.raw`^[-*]\s+\x60(?<title>.+?)\x60\s+—\s+(?<kind>${REPLACED}|${RETIRED}):\s*(?<rest>\S.*)$`,
29
+ 'u',
30
+ )
31
+ // A retirement names the Issue that decided it first — an Issue or a plan comment on one — then why.
32
+ const RETIREMENT_PATTERN = /^(?:[\w.-]+\/[\w.-]+)?#\d+\s+\S/u
33
+ const ROW_FORMAT = `under ${DISPOSITION_HEADING}, one line per removed test: \`- \`<test>\` — ${REPLACED}: <the test that guards the behavior now>\` or \`- \`<test>\` — ${RETIRED}: #<Issue that retired the behavior> <reason>\``
34
+
35
+ function unique(titles: ReadonlyArray<string>): ReadonlyArray<string> {
36
+ return [...new Set(titles)]
37
+ }
38
+
39
+ function leaf_counts(titles: ReadonlyArray<string>): Map<string, number> {
40
+ const counts = new Map<string, number>()
41
+
42
+ for (const title of titles) {
43
+ const leaf = test_titles.leaf_of(title)
44
+
45
+ counts.set(leaf, (counts.get(leaf) ?? 0) + 1)
46
+ }
47
+
48
+ return counts
49
+ }
50
+
51
+ // Spends one arrived name with the same title, so each arrival accounts for one departure only.
52
+ function is_moved(arrived: Map<string, number>, title: string): boolean {
53
+ const leaf = test_titles.leaf_of(title)
54
+ const left = arrived.get(leaf) ?? 0
55
+
56
+ if (left === 0) return false
57
+ arrived.set(leaf, left - 1)
58
+
59
+ return true
60
+ }
61
+
62
+ function removed(base: ReadonlyArray<string>, head: ReadonlyArray<string>): ReadonlyArray<string> {
63
+ const base_names = new Set(base)
64
+ const head_names = new Set(head)
65
+ const arrived = leaf_counts(unique(head).filter((title) => !base_names.has(title)))
66
+
67
+ return unique(base)
68
+ .filter((title) => !head_names.has(title))
69
+ .filter((title) => !is_moved(arrived, title))
70
+ }
71
+
72
+ // A retirement with no Issue is no row at all, so its test reads as undisposed.
73
+ function is_cited(groups: Readonly<Record<string, string>>): boolean {
74
+ return groups['kind'] === REPLACED || RETIREMENT_PATTERN.test(groups['rest'] ?? '')
75
+ }
76
+
77
+ function disposed_title(line: string): string | undefined {
78
+ const groups = ROW_PATTERN.exec(line.trim())?.groups
79
+
80
+ if (groups === undefined || !is_cited(groups)) return undefined
81
+
82
+ return groups['title']
83
+ }
84
+
85
+ function undisposed(removed_titles: ReadonlyArray<string>, pr_body = ''): ReadonlyArray<string> {
86
+ const disposed = new Set(
87
+ markdown_section
88
+ .section_lines(pr_body, DISPOSITION_HEADING)
89
+ .map((line) => disposed_title(line)),
90
+ )
91
+
92
+ return removed_titles.filter((title) => !disposed.has(title))
93
+ }
94
+
95
+ function pending_rows(titles: ReadonlyArray<string>): ReadonlyArray<string> {
96
+ return titles.map((title) => `- \`${title}\` ${PENDING_SUFFIX}`)
97
+ }
98
+
99
+ function has_row(lines: ReadonlyArray<string>, title: string): boolean {
100
+ return lines.some((line) => line.trim().startsWith(`- \`${title}\` `))
101
+ }
102
+
103
+ // The pending rows a body still lacks, put under its disposition heading — added at the end when the
104
+ // body has none — so a run fills them in before `josh ship` rather than meeting them at its preflight
105
+ // (joshuafolkken/kit#4563). A title with any row already, pending or filled, is left as it is.
106
+ function with_pending_rows(body: string, titles: ReadonlyArray<string>): string {
107
+ const lines = markdown_section.section_lines(body, DISPOSITION_HEADING)
108
+ const rows = pending_rows(titles.filter((title) => !has_row(lines, title))).join('\n')
109
+
110
+ if (rows === '') return body
111
+ if (!HEADING_LINE.test(body)) return `${body.trimEnd()}\n\n${DISPOSITION_HEADING}\n\n${rows}\n`
112
+
113
+ return body.replace(HEADING_LINE, () => `${DISPOSITION_HEADING}\n\n${rows}`)
114
+ }
115
+
116
+ // Nothing when the change removed no test, so an ordinary brief is not one line longer.
117
+ function brief_block(removed_titles: ReadonlyArray<string>): ReadonlyArray<string> {
118
+ if (removed_titles.length === 0) return []
119
+
120
+ return [
121
+ '',
122
+ `${BRIEF_HEADING} — these tests existed at the base and are gone from the change. For each, find the test that guards its behavior now, or the Issue that retired the behavior; a removed test with neither is a finding (missing test). The pull request body must dispose of each ${ROW_FORMAT}, or \`josh followup\` refuses the merge:`,
123
+ ...pending_rows(removed_titles),
124
+ ]
125
+ }
126
+
127
+ function refusal_message(titles: ReadonlyArray<string>): string {
128
+ return [
129
+ `Merge refused: this change removes ${String(titles.length)} test(s) the pull request body does not account for.`,
130
+ `Put these rows into the body's ${DISPOSITION_HEADING} section, replacing each ending with the test that replaced it or the Issue that retired its behavior:`,
131
+ DISPOSITION_HEADING,
132
+ '',
133
+ ...pending_rows(titles),
134
+ `Write ${ROW_FORMAT} — format: ${report_format_reference.pointer(report_format_reference.REMOVED_TESTS_HEADING)}`,
135
+ 'Write it into the `--body-file` before `josh ship`, or update an open PR with `gh api -X PATCH repos/{owner}/{repo}/pulls/<N> -F body=@<path>`, then re-run.',
136
+ ].join('\n')
137
+ }
138
+
139
+ const removed_tests = {
140
+ brief_block,
141
+ DISPOSITION_HEADING,
142
+ refusal_message,
143
+ removed,
144
+ ROW_FORMAT,
145
+ undisposed,
146
+ with_pending_rows,
147
+ }
148
+
149
+ export { removed_tests }
@@ -1,4 +1,3 @@
1
- #!/usr/bin/env tsx
2
1
  import path from 'node:path'
3
2
  import { fileURLToPath } from 'node:url'
4
3
  import { agent_role_profile, type AgentProfile } from '#scripts/agent/agent-role-profile'
@@ -8,21 +7,26 @@ import { change_base } from '#scripts/git/change-base'
8
7
  import { changed_paths } from '#scripts/git/changed-paths'
9
8
  import { git_command } from '#scripts/git/git-command'
10
9
  import { PROJECT_ROOT } from '#scripts/init/init-paths'
10
+ import { issue_watch_gate } from '#scripts/issue/issue-watch-gate'
11
11
  import type { FileMapStamp } from '#scripts/josh/file-map-stamp'
12
12
  import { find_package_directory } from '#scripts/josh/josh-logic'
13
13
  import { path_decision } from '#scripts/josh/path-decision'
14
14
  import { stamp_file } from '#scripts/josh/stamp-file'
15
15
  import { lane_session_broker } from '#scripts/lane/lane-session-broker'
16
16
  import { run_ship_review } from '#scripts/run/ship/run-ship-review'
17
+ import { removed_tests_check } from './removed-tests-check'
17
18
  import { review_attest } from './review-attest'
18
19
  import { review_brief } from './review-brief'
19
20
  import { review_checkout, type ReviewCheckout } from './review-checkout'
20
21
  import { review_code_tree } from './review-code-tree'
21
22
  import type { DiffParts } from './review-diff-parts'
22
23
  import { review_diff_write } from './review-diff-write'
24
+ import { review_interaction } from './review-interaction'
23
25
  import { review_level, type ReviewLevel } from './review-level'
26
+ import { review_round_one_blobs } from './review-round-one-blobs'
24
27
  import { review_stamps } from './review-stamps'
25
28
  import { review_tree } from './review-tree'
29
+ import { review_untouched_readers, type ReadersRead } from './review-untouched-readers'
26
30
 
27
31
  // `josh review:brief` — print the whole `/code-review` invocation, not just the level.
28
32
  //
@@ -33,8 +37,8 @@ import { review_tree } from './review-tree'
33
37
  // so "still running" is the usual answer at this point), how this project runs its unit tests, and —
34
38
  // on round 2 — which files the first round's fixes touched.
35
39
 
36
- const ARGV_OFFSET = 2
37
- const USAGE = 'Usage: josh review:brief [--round <1|2>] | --level-only [--staged] [--json]'
40
+ const USAGE =
41
+ 'Usage: josh review:brief [--round <1|2>] | --interaction | --level-only [--staged] [--json]'
38
42
 
39
43
  // The rubric's absolute path, resolved against the kit package rather than the review checkout root.
40
44
  // The rubric ships inside the package, so a consumer that keeps no
@@ -54,6 +58,7 @@ const ROUND_FLAG = '--round'
54
58
  // paths and nothing else. `--staged` and `--json` are passed straight through, exactly as the old
55
59
  // command took them.
56
60
  const LEVEL_ONLY_FLAG = '--level-only'
61
+ const INTERACTION_FLAG = '--interaction'
57
62
  const LEVEL_KEY = 'level'
58
63
  const FIRST_ROUND = 1
59
64
  const FAILURE_EXIT_CODE = 1
@@ -132,7 +137,12 @@ function record_round_one(
132
137
  return false
133
138
  }
134
139
 
135
- review_stamps.round_one_stamp.write(tree, target, base)
140
+ review_stamps.round_one_stamp.write(
141
+ tree,
142
+ target,
143
+ base,
144
+ review_round_one_blobs.capture(Object.keys(tree)),
145
+ )
136
146
 
137
147
  return true
138
148
  } catch {
@@ -202,6 +212,7 @@ interface ComposeRequest {
202
212
  tree: Record<string, string>
203
213
  base: string
204
214
  profile: AgentProfile
215
+ interaction?: ReadonlyArray<string> | undefined
205
216
  }
206
217
 
207
218
  // **Swallowed, and the brief keeps its target line**: parts that could not be
@@ -221,9 +232,35 @@ async function read_diff(
221
232
  }
222
233
  }
223
234
 
235
+ // **Swallowed, and the brief omits the list**: `josh ship` and `followup` read the same list again
236
+ // and refuse on a failure, so the merge never rests on this reading.
237
+ async function read_removed_tests(): Promise<ReadonlyArray<string>> {
238
+ try {
239
+ return (await removed_tests_check.read()) ?? []
240
+ } catch {
241
+ return []
242
+ }
243
+ }
244
+
245
+ // **A failure is marked, and the brief says the list could not be read** — never an empty list,
246
+ // which would read as a change with no reader outside it.
247
+ async function read_readers(
248
+ root: string,
249
+ base: string,
250
+ paths: ReadonlyArray<string>,
251
+ ): Promise<ReadersRead> {
252
+ try {
253
+ return await review_untouched_readers.read({ root, base, paths })
254
+ } catch {
255
+ return review_untouched_readers.FAILED_READ
256
+ }
257
+ }
258
+
224
259
  async function compose_brief(request: ComposeRequest): Promise<string> {
225
- const { round, paths, tree, base, profile } = request
226
- const contract = await open_contract()
260
+ const { round, paths, tree, base, profile, interaction } = request
261
+ const opened = await open_contract()
262
+ // The interaction review reads the whole change, never a resume's narrowing (joshuafolkken/kit#4276).
263
+ const contract = interaction === undefined ? opened : { ...opened, resumed_from: undefined }
227
264
  const stamps = {
228
265
  gate: review_stamps.gate_stamp.read(),
229
266
  in_flight: review_stamps.in_flight_stamp.read(),
@@ -245,6 +282,9 @@ async function compose_brief(request: ComposeRequest): Promise<string> {
245
282
  rubric_path: RUBRIC_PATH,
246
283
  ...contract,
247
284
  diff: await read_diff(contract.checkout.root, base, paths),
285
+ readers: await read_readers(contract.checkout.root, base, paths),
286
+ removed_tests: await read_removed_tests(),
287
+ interaction,
248
288
  })
249
289
  }
250
290
 
@@ -325,7 +365,13 @@ async function record_review(
325
365
  record_briefed(round, tree, commit)
326
366
  }
327
367
 
328
- async function run_review(round: number, reading: ChangeReading): Promise<number> {
368
+ // An interaction brief records nothing: the round-one and briefed stamps describe `/code-review`'s
369
+ // round, which already ran, and retaking them would move the delta round 2 is measured from.
370
+ async function run_review(
371
+ round: number,
372
+ reading: ChangeReading,
373
+ interaction?: ReadonlyArray<string>,
374
+ ): Promise<number> {
329
375
  const { base, commit, paths, tree } = reading
330
376
  const refusal = scoped_green.refusal_for(tree, commit)
331
377
 
@@ -334,14 +380,40 @@ async function run_review(round: number, reading: ChangeReading): Promise<number
334
380
 
335
381
  if (resolved.kind === 'rejected') return report_error(resolved.note)
336
382
  agent_role_profile.warn_of_default()
337
- console.info(await compose_brief({ round, paths, tree, base, profile: resolved.profile }))
338
- await record_review(round, tree, commit)
383
+ const { profile } = resolved
384
+
385
+ console.info(await compose_brief({ round, paths, tree, base, profile, interaction }))
386
+ if (interaction === undefined) await record_review(round, tree, commit)
339
387
 
340
388
  return 0
341
389
  }
342
390
 
391
+ // The interaction review's brief (joshuafolkken/kit#4276): `/code-review`'s round-1 brief over the
392
+ // whole change, with the role and the run-tooling paths appended. Not due, it says so and exits 0.
393
+ //
394
+ // **An issue update taken in after round 1's brief refuses it**: minting this brief moves the pointer
395
+ // `josh followup` measures that update against (`issue-watch-gate.ts`), so a round 1 that read the
396
+ // earlier specification would merge without that refusal.
397
+ async function run_interaction(): Promise<number> {
398
+ const reading = await read_change()
399
+ const targets = review_interaction.due_paths(reading.paths)
400
+
401
+ if (targets.length === 0) {
402
+ console.info(review_interaction.NOT_DUE_LINE)
403
+
404
+ return 0
405
+ }
406
+
407
+ const stale = await issue_watch_gate.review_refusal_here()
408
+
409
+ if (stale !== undefined) return report_error(stale)
410
+
411
+ return await run_review(FIRST_ROUND, reading, targets)
412
+ }
413
+
343
414
  async function run(argv: ReadonlyArray<string>): Promise<number> {
344
415
  if (argv[0] === LEVEL_ONLY_FLAG) return await run_level(argv.slice(1))
416
+ if (argv.length === 1 && argv[0] === INTERACTION_FLAG) return await run_interaction()
345
417
 
346
418
  const round = parse_round(argv)
347
419
 
@@ -350,10 +422,6 @@ async function run(argv: ReadonlyArray<string>): Promise<number> {
350
422
  return await run_review(round, await read_change())
351
423
  }
352
424
 
353
- async function main(argv: ReadonlyArray<string>): Promise<void> {
354
- process.exitCode = await run(argv)
355
- }
356
-
357
425
  const review_brief_cli = {
358
426
  FIRST_ROUND,
359
427
  format_reason,
@@ -365,6 +433,4 @@ const review_brief_cli = {
365
433
  run,
366
434
  }
367
435
 
368
- if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
369
-
370
436
  export { review_brief_cli }
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env tsx
2
+ import { fileURLToPath } from 'node:url'
3
+ import { review_brief_cli } from './review-brief-cli'
4
+
5
+ // The `josh review:brief` entry, kept apart from `review-brief-cli.ts` because `run-review-cli.ts`
6
+ // imports that one: a bundle is one file, so a main guard there would fire for every command that
7
+ // carries it (joshuafolkken/kit#4186).
8
+ if (process.argv[1] === fileURLToPath(import.meta.url)) {
9
+ const ARGV_OFFSET = 2
10
+
11
+ process.exitCode = await review_brief_cli.run(process.argv.slice(ARGV_OFFSET))
12
+ }
@@ -1,7 +1,10 @@
1
1
  import { agent_role_profile, type AgentProfile } from '#scripts/agent/agent-role-profile'
2
2
  import { file_map_stamp, type FileMapStamp } from '#scripts/josh/file-map-stamp'
3
+ import { removed_tests } from './removed-tests'
3
4
  import { review_checkout, type ReviewCheckout } from './review-checkout'
4
5
  import { review_diff_parts, type DiffParts } from './review-diff-parts'
6
+ import { review_interaction } from './review-interaction'
7
+ import { review_untouched_readers, type ReadersRead } from './review-untouched-readers'
5
8
 
6
9
  // The text `josh review:brief` prints — the `/code-review` invocation, composed from what the run
7
10
  // already knows.
@@ -414,6 +417,14 @@ interface BriefInput {
414
417
  // The change written as parts under the Bash output cap. Absent when the
415
418
  // write failed, and the target line alone then names the change.
416
419
  diff?: { parts: DiffParts; cap: number } | undefined
420
+ // The tests the change removes, listed for the reviewer to account for. Absent or empty, no section.
421
+ removed_tests?: ReadonlyArray<string> | undefined
422
+ // The run-tooling paths an interaction review is briefed on (joshuafolkken/kit#4276). Absent, the
423
+ // brief is `/code-review`'s alone.
424
+ interaction?: ReadonlyArray<string> | undefined
425
+ // The readers outside the diff of each exported name it edits (joshuafolkken/kit#4515). A failed
426
+ // read is printed as one; absent or empty, no section.
427
+ readers?: ReadersRead | undefined
417
428
  }
418
429
 
419
430
  const SECOND_ROUND = 2
@@ -437,16 +448,30 @@ function target_block(input: BriefInput): string {
437
448
  // code that narrowing exists to keep out of scope. Decided by the target actually printed, not by
438
449
  // the round: every round that cannot narrow widens through `whole_change_target`, and that round
439
450
  // needs the parts as much as a first one does.
440
- function diff_block(input: BriefInput, target: string): ReadonlyArray<string> {
441
- const is_whole_change = target.includes(whole_change_target(input.checkout.root, input.base))
451
+ function is_whole_change(input: BriefInput, target: string): boolean {
452
+ return target.includes(whole_change_target(input.checkout.root, input.base))
453
+ }
442
454
 
443
- if (!is_whole_change || input.diff === undefined) return []
455
+ function diff_block(input: BriefInput, target: string): ReadonlyArray<string> {
456
+ if (!is_whole_change(input, target) || input.diff === undefined) return []
444
457
 
445
458
  return ['', review_diff_parts.reading_block(input.diff.parts, input.diff.cap)]
446
459
  }
447
460
 
461
+ // Beside a whole-change target only, for the reason `diff_block` gives: a narrowed round keeps the
462
+ // rest of the change, and so its readers, out of scope.
463
+ function readers_block(input: BriefInput, target: string): ReadonlyArray<string> {
464
+ if (!is_whole_change(input, target)) return []
465
+
466
+ return review_untouched_readers.brief_block(input.readers)
467
+ }
468
+
448
469
  // The level alone on the first line, because the level-only mode's contract — a caller reading the
449
470
  // answer with `$(...)` — is the one thing a brief must not break.
471
+ function interaction_block(targets: ReadonlyArray<string> | undefined): ReadonlyArray<string> {
472
+ return targets === undefined ? [] : ['', review_interaction.brief_block(targets)]
473
+ }
474
+
450
475
  function compose(input: BriefInput): string {
451
476
  const profile = input.profile ?? agent_role_profile.DEFAULT_PROFILES.reviewer
452
477
  const target = target_block(input)
@@ -465,6 +490,9 @@ function compose(input: BriefInput): string {
465
490
  '',
466
491
  target,
467
492
  ...diff_block(input, target),
493
+ ...readers_block(input, target),
494
+ ...removed_tests.brief_block(input.removed_tests ?? []),
495
+ ...interaction_block(input.interaction),
468
496
  ].join('\n')
469
497
  }
470
498
 
@@ -4,6 +4,7 @@ import path from 'node:path'
4
4
  import { git_command } from '#scripts/git/git-command'
5
5
  import type { FileMapStamp } from '#scripts/josh/file-map-stamp'
6
6
  import { stamp_file } from '#scripts/josh/stamp-file'
7
+ import { PACKAGE_JSON } from '#scripts/lib/package-manifest'
7
8
  import { comment_ranges, type TypeScriptApi } from './comment-ranges'
8
9
  import { review_stamps } from './review-stamps'
9
10
 
@@ -26,7 +27,6 @@ const SCRIPT_EXTENSIONS: ReadonlyArray<string> = ['.ts', '.js']
26
27
  const SVELTE_EXTENSION = '.svelte'
27
28
  const EXCLUDED_PREFIX = '.claude/'
28
29
  const TYPESCRIPT_MODULE = 'typescript'
29
- const PACKAGE_JSON = 'package.json'
30
30
 
31
31
  function is_svelte(relative: string): boolean {
32
32
  return relative.endsWith(SVELTE_EXTENSION)
@@ -100,20 +100,24 @@ async function record(
100
100
  }
101
101
 
102
102
  // The paths whose code round 1's fixes left as it was — whose difference, if any, is in comments.
103
- // Nothing qualifies against a record taken on another base, for the reason the round-1 snapshot is
104
- // refused on one.
103
+ // Against a record taken on another base only `unmoved` qualifies — the paths the move left alone
104
+ // (`review_round_one_blobs.unmoved`), where the carried file is round 1's own and equal code digests
105
+ // still mean a comment-only fix (joshuafolkken/kit#4165).
105
106
  function comment_only(
106
107
  snapshot: FileMapStamp | undefined,
107
108
  tree: Record<string, string>,
108
109
  base: string | undefined,
110
+ unmoved: ReadonlyArray<string> = [],
109
111
  ): ReadonlyArray<string> {
110
- if (snapshot === undefined || base === undefined || snapshot.base !== base) return []
112
+ if (snapshot === undefined || base === undefined) return []
113
+ const is_same_base = snapshot.base === base
111
114
 
112
115
  return Object.keys(snapshot.files).filter(
113
- (relative) => snapshot.files[relative] === tree[relative],
116
+ (relative) =>
117
+ snapshot.files[relative] === tree[relative] && (is_same_base || unmoved.includes(relative)),
114
118
  )
115
119
  }
116
120
 
117
- const review_code_tree = { comment_only, read, record, tree_of }
121
+ const review_code_tree = { comment_only, load_typescript, read, record, tree_of }
118
122
 
119
123
  export { review_code_tree }
@@ -33,12 +33,14 @@ const PER_PAGE = '100'
33
33
  const UNNAMED_REPOSITORY = 'Could not name this repository from `git remote`.'
34
34
  const UNREAD_SEARCH = 'Could not read the search for closed issues with a comment round.'
35
35
  const UNREAD_COMMENTS = 'Could not read the comments of'
36
+ const UNREAD_PERMISSION = 'Could not read the write permission of'
36
37
 
37
38
  const search_item_schema = z.object({ number: z.number() })
38
39
  const search_schema = z.object({ items: z.array(search_item_schema) })
39
40
  const comment_schema = z.object({
40
41
  body: z.string().nullish(),
41
42
  author_association: z.string().nullish(),
43
+ user: z.looseObject({ login: z.string() }).nullish(),
42
44
  })
43
45
 
44
46
  type IssueComment = z.infer<typeof comment_schema>
@@ -50,13 +52,29 @@ function body_of(lines: ReadonlyArray<string>): string {
50
52
  // The ledger lines of every comment round among one issue's comments, oldest first; any other
51
53
  // comment, one that only quotes the heading among them, carries none — nor does one whose author
52
54
  // cannot write to the repository: anyone can comment on a public issue, and the carried lines ride
53
- // the run's commit unreviewed.
54
- function lines_of(comments: ReadonlyArray<IssueComment>): Array<string> {
55
- return comments
56
- .filter((comment) => gh_author_association.is_trusted(comment.author_association))
57
- .map((comment) => comment.body ?? '')
58
- .filter((body) => body.startsWith(COMMENT_HEADING))
59
- .flatMap((body) => body.split('\n'))
55
+ // the run's commit unreviewed. A permission lookup that failed throws instead: the carried file is
56
+ // written once, so a round dropped on a transient failure would never be carried.
57
+ async function is_trusted_comment(comment: IssueComment): Promise<boolean> {
58
+ const login = comment.user?.login
59
+ const is_trusted = await gh_author_association.trust_of({
60
+ login,
61
+ association: comment.author_association,
62
+ })
63
+
64
+ if (is_trusted === undefined) throw new Error(`${UNREAD_PERMISSION} ${login ?? ''}`)
65
+
66
+ return is_trusted
67
+ }
68
+
69
+ async function lines_of(comments: ReadonlyArray<IssueComment>): Promise<Array<string>> {
70
+ const rounds = comments.filter((comment) => (comment.body ?? '').startsWith(COMMENT_HEADING))
71
+ const trusted = await Promise.all(
72
+ rounds.map(async (comment) => await is_trusted_comment(comment)),
73
+ )
74
+
75
+ return rounds
76
+ .filter((_comment, index) => trusted[index] === true)
77
+ .flatMap((comment) => (comment.body ?? '').split('\n'))
60
78
  .filter((line) => review_finding_ledger.is_finding_line(line))
61
79
  }
62
80
 
@@ -93,7 +111,7 @@ async function carry_issue(issue: number, root: string): Promise<number> {
93
111
 
94
112
  if (raw === undefined) throw new Error(`${UNREAD_COMMENTS} ${session_cite.issue(issue)}`)
95
113
 
96
- const lines = lines_of(parse_json_array_safe(raw, comment_schema))
114
+ const lines = await lines_of(parse_json_array_safe(raw, comment_schema))
97
115
 
98
116
  await observation_ledger_home.append(carried_path(issue, root), lines)
99
117
 
@@ -7,7 +7,10 @@ import { issue_cite } from '#scripts/issue/issue-cite'
7
7
  // prefix so `observation-ledger-line.ts`'s `- k:` grammar never treats them as its own — one ledger,
8
8
  // one commit path, a second line *type* rather than a second ledger.
9
9
 
10
- const FINDING_PREFIX = '- rf:'
10
+ // **The interaction review writes the same grammar under its own prefix** (joshuafolkken/kit#4276), so
11
+ // its round is told apart from `/code-review`'s by the merge gate, and its findings stay out of the
12
+ // `/code-review` tally a reader compares rounds by.
13
+ const PREFIX = { code: '- rf:', interaction: '- ri:' } as const
11
14
  const FIELD_SEPARATOR = ' | '
12
15
  const FIELD_COUNT = 5
13
16
 
@@ -34,6 +37,7 @@ const NO_FILE = '-'
34
37
 
35
38
  type Category = (typeof CATEGORIES)[number]
36
39
  type Severity = (typeof SEVERITIES)[number]
40
+ type LineKind = keyof typeof PREFIX
37
41
 
38
42
  interface Finding {
39
43
  category: Category
@@ -65,27 +69,36 @@ function issue_field(issue: number): string {
65
69
  return issue_cite.plain(issue)
66
70
  }
67
71
 
68
- function line_of(fields: ReadonlyArray<string>): string {
69
- return `${FINDING_PREFIX}${fields.join(FIELD_SEPARATOR)}`
72
+ function line_of(fields: ReadonlyArray<string>, kind: LineKind): string {
73
+ return `${PREFIX[kind]}${fields.join(FIELD_SEPARATOR)}`
70
74
  }
71
75
 
72
- function finding_line(finding: Finding, date: string, issue: number): string {
73
- return line_of([finding.category, finding.severity, finding.file, date, issue_field(issue)])
76
+ function finding_line(
77
+ finding: Finding,
78
+ date: string,
79
+ issue: number,
80
+ kind: LineKind = 'code',
81
+ ): string {
82
+ return line_of([finding.category, finding.severity, finding.file, date, issue_field(issue)], kind)
74
83
  }
75
84
 
76
85
  // **A zero-finding round records `none`, not nothing.** Reading its absence as "no findings" would
77
86
  // merge the round that found nothing with the round nobody recorded, which is the exact confusion the
78
87
  // ledger exists to end.
79
- function zero_round_line(date: string, issue: number): string {
80
- return line_of([NONE, NONE, NO_FILE, date, issue_field(issue)])
88
+ function zero_round_line(date: string, issue: number, kind: LineKind = 'code'): string {
89
+ return line_of([NONE, NONE, NO_FILE, date, issue_field(issue)], kind)
81
90
  }
82
91
 
83
- function is_finding_line(line: string): boolean {
84
- return line.trimStart().startsWith(FINDING_PREFIX)
92
+ function is_finding_line(line: string, kind: LineKind = 'code'): boolean {
93
+ return line.trimStart().startsWith(PREFIX[kind])
94
+ }
95
+
96
+ function fields_of(line: string, kind: LineKind = 'code'): ReadonlyArray<string> {
97
+ return line.trimStart().slice(PREFIX[kind].length).split(FIELD_SEPARATOR)
85
98
  }
86
99
 
87
100
  function category_of(line: string): string | undefined {
88
- const fields = line.trimStart().slice(FINDING_PREFIX.length).split(FIELD_SEPARATOR)
101
+ const fields = fields_of(line)
89
102
 
90
103
  return fields.length === FIELD_COUNT ? fields[0] : undefined
91
104
  }
@@ -135,8 +148,8 @@ function zero_round_count(content: string): number {
135
148
  // The issue a finding line is keyed to — its fifth field, the `#<N>` token — or `undefined` for a
136
149
  // non-finding or malformed line. The record check reads this to ask whether a given issue's round was
137
150
  // recorded at all.
138
- function issue_of(line: string): string | undefined {
139
- const fields = line.trimStart().slice(FINDING_PREFIX.length).split(FIELD_SEPARATOR)
151
+ function issue_of(line: string, kind: LineKind): string | undefined {
152
+ const fields = fields_of(line, kind)
140
153
 
141
154
  return fields.length === FIELD_COUNT ? fields[FIELD_COUNT - 1] : undefined
142
155
  }
@@ -145,10 +158,12 @@ function issue_of(line: string): string | undefined {
145
158
  // asks whether the round was recorded, not whether it found anything — reading the issue field, which
146
159
  // a zero-finding line carries too, is what keeps a clean round's single line from reading as "nobody
147
160
  // recorded this".
148
- function has_issue_record(content: string, issue: number): boolean {
161
+ function has_issue_record(content: string, issue: number, kind: LineKind = 'code'): boolean {
149
162
  const target = issue_field(issue)
150
163
 
151
- return content.split('\n').some((line) => is_finding_line(line) && issue_of(line) === target)
164
+ return content
165
+ .split('\n')
166
+ .some((line) => is_finding_line(line, kind) && issue_of(line, kind) === target)
152
167
  }
153
168
 
154
169
  const review_finding_ledger = {
@@ -165,5 +180,5 @@ const review_finding_ledger = {
165
180
  zero_round_line,
166
181
  }
167
182
 
168
- export type { CategoryCount, Finding }
183
+ export type { CategoryCount, Finding, LineKind }
169
184
  export { review_finding_ledger }