@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,146 @@
1
+ import { readFileSync } from 'node:fs'
2
+ import path from 'node:path'
3
+ import { git_grep_hits, type Hit } from '#scripts/git/git-grep-hits'
4
+ import { git_spawn } from '#scripts/git/git-spawn'
5
+ import { review_readers_scan, type Edited } from './review-readers-scan'
6
+
7
+ // The readers outside the diff of each exported name the diff edits, listed in the brief
8
+ // (joshuafolkken/kit#4515). A reader the change left on the old meaning was the most common kind of
9
+ // finding that stopped a lane review; the self-check's "Every caller moved with it" asked for the
10
+ // search and left it to the implementer, and this does it mechanically for the reviewer to read.
11
+ //
12
+ // **A reader is a line outside the changed paths that names the edited name as a word** — a
13
+ // re-derivation or an alias is not found, and the list says so. A grep that could not run is printed
14
+ // as such, never as "no readers".
15
+
16
+ const SOURCE_FILE = /\.(?:ts|js)$/u
17
+ const SEARCH_PATHS = ['*.ts', '*.js', '*.svelte', ':(exclude)*.snap']
18
+ const WORD_FLAG = '-w'
19
+ const MAX_HITS = 10
20
+ const MAX_NAMES = 30
21
+ const HEADING = '## Readers outside the diff'
22
+ const ROLE_LINE =
23
+ 'Each exported name this change edits, with every line outside the changed paths that names it (`git grep -w`). Check each reader still holds under the new meaning — the self-check\'s "Every caller moved with it" (`prompts/review.md`). A reader left on the old meaning is a finding at the reader\'s `file:line`. A reader reaching the name through an alias or a re-derivation is not listed.'
24
+ const SEARCH_FAILED = ' - git grep failed; not searched'
25
+ const READ_FAILED = 'The readers outside the diff could not be read; search them yourself:'
26
+ const OMITTED_TAIL = 'not searched; search their readers yourself'
27
+
28
+ interface Readers {
29
+ target: string
30
+ origin: string
31
+ hits: ReadonlyArray<Hit>
32
+ has_failed: boolean
33
+ }
34
+
35
+ // `omitted` counts the edited names past `MAX_NAMES`, which were never searched.
36
+ interface ReadersRead {
37
+ readers: ReadonlyArray<Readers>
38
+ omitted: number
39
+ has_failed: boolean
40
+ }
41
+
42
+ const NO_READ: ReadersRead = { readers: [], omitted: 0, has_failed: false }
43
+ const FAILED_READ: ReadersRead = { readers: [], omitted: 0, has_failed: true }
44
+
45
+ interface ReadRequest {
46
+ root: string
47
+ base: string
48
+ paths: ReadonlyArray<string>
49
+ }
50
+
51
+ interface FileEdits {
52
+ relative: string
53
+ edits: ReadonlyArray<Edited>
54
+ }
55
+
56
+ async function file_edits(request: ReadRequest, relative: string): Promise<FileEdits> {
57
+ const { root, base } = request
58
+ const diff = await git_spawn.read(['-C', root, 'diff', '-U0', '--no-color', base, '--', relative])
59
+
60
+ if (diff.length === 0) return { relative, edits: [] }
61
+
62
+ // A path the change deletes has no text; its readers fail the typecheck rather than read stale.
63
+ try {
64
+ const source = readFileSync(path.join(root, relative), 'utf8')
65
+
66
+ return { relative, edits: review_readers_scan.edited(source, diff) }
67
+ } catch {
68
+ return { relative, edits: [] }
69
+ }
70
+ }
71
+
72
+ function excluded(paths: ReadonlyArray<string>): Array<string> {
73
+ return paths.map((relative) => `:(exclude,literal)${relative}`)
74
+ }
75
+
76
+ async function readers_of(request: ReadRequest, entry: FileEdits, edit: Edited): Promise<Readers> {
77
+ const pathspecs = [...SEARCH_PATHS, ...excluded(request.paths)]
78
+ const found = await git_grep_hits.search(edit.target, [WORD_FLAG], pathspecs, request.root)
79
+
80
+ return { target: edit.target, origin: `${entry.relative}:${String(edit.line)}`, ...found }
81
+ }
82
+
83
+ // Every edited name, with its readers outside `paths`. Only names that have a reader, or whose search
84
+ // failed, are returned; the names past the cap are counted, never dropped silently.
85
+ async function read(request: ReadRequest): Promise<ReadersRead> {
86
+ const sources = request.paths.filter((relative) => SOURCE_FILE.test(relative))
87
+ const files = await Promise.all(
88
+ sources.map(async (relative) => await file_edits(request, relative)),
89
+ )
90
+ const pairs = files.flatMap((entry) => entry.edits.map((edit) => ({ entry, edit })))
91
+ const capped = pairs.slice(0, MAX_NAMES)
92
+ const all = await Promise.all(
93
+ capped.map(async ({ entry, edit }) => await readers_of(request, entry, edit)),
94
+ )
95
+
96
+ const readers = all.filter((entry) => entry.has_failed || entry.hits.length > 0)
97
+
98
+ return { readers, omitted: pairs.length - capped.length, has_failed: false }
99
+ }
100
+
101
+ function hit_line(hit: Hit): string {
102
+ return ` - ${hit.path}:${hit.line} ${hit.excerpt}`
103
+ }
104
+
105
+ function readers_lines(readers: Readers): Array<string> {
106
+ const head = `- \`${readers.target}\` — ${readers.origin}`
107
+
108
+ if (readers.has_failed) return [head, SEARCH_FAILED]
109
+
110
+ const more = readers.hits.length - MAX_HITS
111
+ const tail = more > 0 ? [` - … and ${String(more)} more`] : []
112
+
113
+ return [head, ...readers.hits.slice(0, MAX_HITS).map((hit) => hit_line(hit)), ...tail]
114
+ }
115
+
116
+ function omitted_lines(omitted: number): Array<string> {
117
+ if (omitted === 0) return []
118
+
119
+ return [`- … and ${String(omitted)} more edited names ${OMITTED_TAIL}`]
120
+ }
121
+
122
+ // A read that failed as a whole says so, never reads as a change with no reader outside it; absent
123
+ // or empty, no section.
124
+ function brief_block(read_result: ReadersRead = NO_READ): ReadonlyArray<string> {
125
+ const { readers, omitted, has_failed } = read_result
126
+
127
+ if (has_failed) return ['', `${HEADING}\n${READ_FAILED}`]
128
+ if (omitted === 0 && readers.length === 0) return []
129
+
130
+ const listed = readers.flatMap((entry) => readers_lines(entry))
131
+
132
+ return ['', [HEADING, ROLE_LINE, ...listed, ...omitted_lines(omitted)].join('\n')]
133
+ }
134
+
135
+ const review_untouched_readers = {
136
+ brief_block,
137
+ FAILED_READ,
138
+ HEADING,
139
+ MAX_NAMES,
140
+ OMITTED_TAIL,
141
+ read,
142
+ READ_FAILED,
143
+ }
144
+
145
+ export type { Readers, ReadersRead }
146
+ export { review_untouched_readers }
@@ -0,0 +1,118 @@
1
+ import type ts from 'typescript'
2
+ import type { TypeScriptApi } from './comment-ranges'
3
+
4
+ // The tests a test file declares, each as its full name — the titles of the `describe` blocks around it
5
+ // joined to its own `it` / `test` title — so two tests with the same title under different blocks
6
+ // stay apart.
7
+ //
8
+ // **Read from the TypeScript parser, never from a pattern**: a title holding a quote or a bracket, or
9
+ // a call split over lines, is exactly what a hand-written scanner misreads. `it.skip(…)`,
10
+ // `test.each([…])(…)` and `describe.concurrent(…)` are the same test with a modifier, so a call
11
+ // counts by the names its callee chain is built from: Playwright's `test.describe(…)` is a block and
12
+ // its `test.step(…)` is part of the test around it, never a test. A template title with substitutions is kept
13
+ // as its source text; a title held in a variable has no text to compare and is not listed.
14
+ //
15
+ // **A `describe` is a name, never a test**: renaming one moves the tests under it, and removing it
16
+ // removes them, so only the `it` / `test` calls are listed.
17
+
18
+ const BLOCK_FUNCTION = 'describe'
19
+ const STEP_FUNCTION = 'step'
20
+ const TEST_FUNCTIONS: ReadonlySet<string> = new Set(['it', 'test'])
21
+ const TITLE_SEPARATOR = ' > '
22
+ const VIRTUAL_FILE_NAME = 'test-titles.ts'
23
+
24
+ type Prefix = ReadonlyArray<string>
25
+
26
+ interface NamedCall {
27
+ chain: ReadonlyArray<string>
28
+ title: string
29
+ }
30
+
31
+ interface Walk {
32
+ api: TypeScriptApi
33
+ source: ts.SourceFile
34
+ into: Array<string>
35
+ }
36
+
37
+ function member_name(api: TypeScriptApi, expression: ts.Expression): ReadonlyArray<string> {
38
+ return api.isPropertyAccessExpression(expression) ? [expression.name.text] : []
39
+ }
40
+
41
+ // The names a callee chain is built from, root first: `test.describe.parallel` is
42
+ // `['test', 'describe', 'parallel']`, and `it.each([…])` is `['it', 'each']`.
43
+ function callee_chain(
44
+ api: TypeScriptApi,
45
+ expression: ts.Expression,
46
+ ): ReadonlyArray<string> | undefined {
47
+ if (api.isIdentifier(expression)) return [expression.text]
48
+ const is_chained = api.isPropertyAccessExpression(expression) || api.isCallExpression(expression)
49
+ const chain = is_chained ? callee_chain(api, expression.expression) : undefined
50
+
51
+ return chain === undefined ? undefined : [...chain, ...member_name(api, expression)]
52
+ }
53
+
54
+ function is_block(chain: ReadonlyArray<string>): boolean {
55
+ return chain.includes(BLOCK_FUNCTION)
56
+ }
57
+
58
+ function is_test(chain: ReadonlyArray<string>): boolean {
59
+ const [root = ''] = chain
60
+
61
+ return TEST_FUNCTIONS.has(root) && !is_block(chain) && !chain.includes(STEP_FUNCTION)
62
+ }
63
+
64
+ // Only a string or a template can be a title: the array `it.each([…])` is first called with is the
65
+ // table of cases, not a name.
66
+ function title_of(walk: Walk, call: ts.CallExpression): string | undefined {
67
+ const [first] = call.arguments
68
+
69
+ if (first === undefined) return undefined
70
+ if (walk.api.isStringLiteralLike(first)) return first.text
71
+
72
+ return walk.api.isTemplateExpression(first) ? first.getText(walk.source) : undefined
73
+ }
74
+
75
+ function named_call(walk: Walk, node: ts.Node): NamedCall | undefined {
76
+ if (!walk.api.isCallExpression(node)) return undefined
77
+ const chain = callee_chain(walk.api, node.expression)
78
+ const title = chain === undefined ? undefined : title_of(walk, node)
79
+
80
+ return chain === undefined || title === undefined ? undefined : { chain, title }
81
+ }
82
+
83
+ // The block titles a call adds to the name of everything inside it: a `describe` adds its own, a
84
+ // test is listed and adds nothing further down, and any other node passes its prefix through.
85
+ function entered(walk: Walk, call: NamedCall | undefined, prefix: Prefix): Prefix {
86
+ if (call === undefined) return prefix
87
+ const named = [...prefix, call.title]
88
+
89
+ if (is_test(call.chain)) walk.into.push(named.join(TITLE_SEPARATOR))
90
+
91
+ return is_block(call.chain) ? named : prefix
92
+ }
93
+
94
+ function visit(walk: Walk, node: ts.Node, prefix: Prefix): void {
95
+ const inner = entered(walk, named_call(walk, node), prefix)
96
+
97
+ walk.api.forEachChild(node, (child) => {
98
+ visit(walk, child, inner)
99
+ })
100
+ }
101
+
102
+ function titles_of(api: TypeScriptApi, text: string): ReadonlyArray<string> {
103
+ const source = api.createSourceFile(VIRTUAL_FILE_NAME, text, api.ScriptTarget.Latest, true)
104
+ const into: Array<string> = []
105
+
106
+ visit({ api, source, into }, source, [])
107
+
108
+ return into
109
+ }
110
+
111
+ // The title a test carries itself, without the blocks around it.
112
+ function leaf_of(full_name: string): string {
113
+ return full_name.split(TITLE_SEPARATOR).at(-1) ?? full_name
114
+ }
115
+
116
+ const test_titles = { leaf_of, titles_of }
117
+
118
+ export { test_titles }
@@ -52,6 +52,14 @@ const ROW = {
52
52
  decide: (): boolean => true,
53
53
  keeps: keeps_model,
54
54
  reaches: is_general_purpose,
55
+ about: {
56
+ title: 'Subagent model named',
57
+ topic:
58
+ '`.claude/skills/workflow-commands/delegation.md` → "A `general-purpose` subagent names its model"',
59
+ fires:
60
+ 'an `Agent` / `Task` call of the `general-purpose` type with no `model`. Every occurrence',
61
+ quiet: 'a named agent type, or a `model` set',
62
+ },
55
63
  }
56
64
 
57
65
  const agent_model = { AGENT_MODEL_REASON, ROW, is_unnamed_model }
@@ -1,6 +1,7 @@
1
1
  import { cost_blocks } from '#scripts/cost-runtime/cost-blocks'
2
2
  import type { GuardedCall } from '#scripts/time-runtime/time-batch-guard'
3
3
  import { time_shell } from '#scripts/time-runtime/time-shell'
4
+ import { git_argv } from './git-argv'
4
5
  import { shell_segments } from './shell-segments'
5
6
 
6
7
  // The trigger helpers the enumeration in `delivered-rules.ts` is built from, held here so a rule
@@ -35,10 +36,52 @@ const TITLE_FIELD = /(?:-f|-F|--field|--raw-field)\s*'?title=/u
35
36
 
36
37
  // A filing made by hand rather than through `josh issue:file` — the call the `direct-filing` row
37
38
  // refuses on every occurrence.
39
+ //
40
+ // **Read outside quotes, but not outside a heredoc** (joshuafolkken/kit#4525). `echo "… gh issue create
41
+ // …"` files nothing, so the `gh` call is matched on the unquoted line — which keeps a `"$(gh issue
42
+ // create …)"` that runs. A heredoc body is matched as written: `bash <<EOF` runs it, and the body cannot
43
+ // be told apart from prose, so the rule errs on the refusing side. The endpoint and the title field are
44
+ // still read from the line as written, where a quoted path or field keeps them.
45
+ //
46
+ // **A quoted script handed to a shell runs, so it is read as written too**: `bash -c "gh issue create
47
+ // …"`, `sh -c '…'` and `eval "…"` file the Issue the quotes would otherwise hide.
48
+ const GH_API_COMMAND = /\bgh\s+api\b/u
49
+ const SHELL_SCRIPT_RUNNER = /\b(?:(?:ba|z|da|k)?sh\s+(?:-\w+\s+)*-\w*c\b|eval\b)/u
50
+
51
+ function spoken_line(command: string): string {
52
+ if (time_shell.has_heredoc(command)) return command
53
+
54
+ const plain = time_shell.unquoted(command)
55
+
56
+ return SHELL_SCRIPT_RUNNER.test(plain) ? command : plain
57
+ }
58
+
59
+ const LEADING_SHELL_SCRIPT_RUNNER = new RegExp(`^${SHELL_SCRIPT_RUNNER.source}`, 'u')
60
+ const QUOTE_MARK = /["']/gu
61
+
62
+ // The quoted script a segment's shell runs, as a line of its own: `sh -c 'pnpm exec eslint .'` reads
63
+ // as `pnpm exec eslint .`, so a caller cutting it into commands reads the programs the script
64
+ // launches. Only when the segment's program is the runner — `echo sh -c x` hands no script to a shell.
65
+ // `undefined` when the segment runs no shell script.
66
+ function shell_script_of(segment: string): string | undefined {
67
+ const call = git_argv.program_of(segment)
68
+
69
+ if (call === undefined) return undefined
70
+
71
+ const spoken = [call.name, ...call.args].join(' ')
72
+ const runner = LEADING_SHELL_SCRIPT_RUNNER.exec(spoken)
73
+
74
+ if (runner === null) return undefined
75
+
76
+ return spoken.slice(runner[0].length).replaceAll(QUOTE_MARK, '').trim()
77
+ }
78
+
38
79
  function is_direct_filing(command: string): boolean {
39
- if (ISSUE_CREATE_COMMAND.test(command)) return true
80
+ const spoken = spoken_line(command)
81
+
82
+ if (ISSUE_CREATE_COMMAND.test(spoken)) return true
40
83
 
41
- return ISSUES_ENDPOINT.test(command) && TITLE_FIELD.test(command)
84
+ return GH_API_COMMAND.test(spoken) && ISSUES_ENDPOINT.test(command) && TITLE_FIELD.test(command)
42
85
  }
43
86
 
44
87
  // `pnpm josh issue:file`, in either spelling — **the** filing act once a direct one is refused, so the
@@ -52,6 +95,6 @@ function is_issue_filing(command: string): boolean {
52
95
  .some((segment) => shell_segments.is_josh_command(segment, FILING_NAMES))
53
96
  }
54
97
 
55
- const bash_triggers = { is_direct_filing, is_issue_filing, on_bash_command }
98
+ const bash_triggers = { is_direct_filing, is_issue_filing, on_bash_command, shell_script_of }
56
99
 
57
100
  export { bash_triggers }
@@ -33,6 +33,7 @@ const EPIC_NEXT_REFERENCE = 'docs/josh-commands-backlog.md → `josh epic:next`'
33
33
  const BACKLOG_BUDGET_REFERENCE = 'docs/josh-commands-backlog.md → `josh backlog:budget`'
34
34
  const RUN_LIVENESS_REFERENCE = 'docs/josh-commands-run.md → `josh run:liveness`'
35
35
  const AUTO_OK_NEXT_REFERENCE = 'docs/josh-commands-backlog.md → `josh auto-ok:next`'
36
+ const STASH_PUSH_REFERENCE = 'docs/josh-commands-backlog.md → `josh stash:push`'
36
37
 
37
38
  // Command used by two separate oracle entries (run:cut:resume and run:cut:gate).
38
39
  const RUN_CUT_CMD = 'run:cut'
@@ -65,9 +66,16 @@ const BATCH_ORACLES: ReadonlyArray<DecisionOracle> = [
65
66
  name: 'run:liveness',
66
67
  decision: 'Whether a delegated unit is still working or has stopped without reporting',
67
68
  args: `${ISSUE_N_ARG} --output <path>`,
68
- vocabulary: ['alive', 'stopped', 'settled', 'undetermined'],
69
+ vocabulary: ['alive', 'paused', 'stopped', 'settled', 'undetermined'],
69
70
  single_source: RUN_LIVENESS_REFERENCE,
70
71
  },
72
+ {
73
+ name: 'stash:push',
74
+ decision: 'Whether the working tree had anything outside the observation ledger to set aside',
75
+ args: '<message>',
76
+ vocabulary: ['stashed', 'clean'],
77
+ single_source: STASH_PUSH_REFERENCE,
78
+ },
71
79
  {
72
80
  name: 'stash:pop',
73
81
  decision: 'Whether a named stash entry exists and can be applied',
@@ -152,9 +152,9 @@ const DECISION_ORACLES: ReadonlyArray<DecisionOracle> = [
152
152
  {
153
153
  name: 'cases',
154
154
  decision:
155
- 'Each boundary a change crosses (network, process, fs, time) and the abnormal cases it owes',
155
+ 'Each boundary a change crosses (network, process, fs, time, shared state, environment) and the abnormal cases it owes',
156
156
  args: '<path...>',
157
- vocabulary: ['network', 'process', 'fs', 'time', NONE],
157
+ vocabulary: ['network', 'process', 'fs', 'time', 'state', 'env', NONE],
158
158
  single_source: 'prompts/collaboration-workflow/report-format.md → 変更とテスト',
159
159
  },
160
160
  {
@@ -5,6 +5,7 @@ import { time_batch_guard, type GuardedCall } from '#scripts/time-runtime/time-b
5
5
  import { agent_model } from './agent-model'
6
6
  import { bash_triggers } from './bash-triggers'
7
7
  import { direct_filing } from './direct-filing'
8
+ import { direct_issue_comment } from './direct-issue-comment'
8
9
  import { early_heartbeat } from './early-heartbeat'
9
10
  import { file_body } from './file-body'
10
11
  import { filing_cap } from './filing-cap'
@@ -14,6 +15,7 @@ import { issue_comments } from './issue-comments'
14
15
  import { josh_git_bare } from './josh-git-bare'
15
16
  import { lane_background } from './lane-background'
16
17
  import { lane_carry_conflict } from './lane-carry-conflict'
18
+ import { lane_direct_tool } from './lane-direct-tool'
17
19
  import { lane_interactive_ask } from './lane-interactive-ask'
18
20
  import { lane_park } from './lane-park'
19
21
  import { lane_split_park } from './lane-split-park'
@@ -29,6 +31,7 @@ import { run_tail_rule } from './run-tail-rule'
29
31
  import { shell_body_trigger } from './shell-body-trigger'
30
32
  import { test_declared_commit } from './test-declared-commit'
31
33
  import { third_party_write } from './third-party-write'
34
+ import { timed_rerun } from './timed-rerun'
32
35
  import { worktree_guard } from './worktree-guard'
33
36
 
34
37
  // The rules delivered by a `PreToolUse` refusal at the moment they bind, rather than carried resident
@@ -50,12 +53,29 @@ type CallTest = (
50
53
  // The tail is read lazily: most calls no rewrite applies to never need it.
51
54
  type CallRewrite = (call: GuardedCall, tail: () => string) => Record<string, unknown> | undefined
52
55
 
56
+ // The human-readable side `pnpm josh rule:list` renders, carried on the row so a rule is one entry.
57
+ interface RuleAbout {
58
+ title: string
59
+ // The single source of the rule's procedure.
60
+ topic: string
61
+ fires: string
62
+ // The silent turn — it matches the state in which the rule is already kept.
63
+ quiet: string
64
+ // The hook command that delivers it; absent reads as `PRETOOL_GUARD`.
65
+ entry?: string
66
+ }
67
+
68
+ // Every row here — batching and investigation included — is delivered by the one `PreToolUse`
69
+ // process (`scripts/hooks/pretool-guard.ts`).
70
+ const PRETOOL_GUARD = 'pnpm josh pretool:guard'
71
+
53
72
  // `id` keys the rule's own refusal record, so one rule firing never spends another's budget.
54
73
  interface DeliveredRule {
55
74
  id: string
56
75
  is_trigger: (call: GuardedCall) => boolean
57
76
  // The only text that reaches the model: the instruction and the pointer.
58
77
  reason: string
78
+ about: RuleAbout
59
79
  // A stand-down when an earlier act on the tail already satisfied the rule; checked first, so a
60
80
  // satisfied call spends no record.
61
81
  already_satisfied?: (tail: string, call: GuardedCall) => boolean
@@ -78,7 +98,7 @@ interface DeliveredRule {
78
98
  former_reasons?: ReadonlyArray<string>
79
99
  }
80
100
 
81
- // Scored but possibly delivered by its own binary (batching, investigation) — joining `DELIVERED_RULES`
101
+ // Scored but possibly delivered by its own guard inside `pretool-guard.ts` (batching, investigation) — joining `DELIVERED_RULES`
82
102
  // would refuse one violation twice — so `is_trigger` is optional here.
83
103
  type MeasuredRule = Omit<DeliveredRule, 'is_trigger'> & {
84
104
  is_trigger?: DeliveredRule['is_trigger']
@@ -98,6 +118,9 @@ const DELIVERED_RULES: ReadonlyArray<DeliveredRule> = [
98
118
  // The direct call only; `filing-cap` below triggers on `issue:file`. The WIP cap and the fold
99
119
  // question are `issue:file`'s own steps, so no row gates them.
100
120
  direct_filing.ROW,
121
+ // Before the body rows: a comment posted by hand is refused whatever its body, and the command it
122
+ // points at takes the body by path, so the body rows have nothing left to say.
123
+ direct_issue_comment.ROW,
101
124
  filing_cap.ROW,
102
125
  issue_comments.ROW,
103
126
  {
@@ -106,6 +129,13 @@ const DELIVERED_RULES: ReadonlyArray<DeliveredRule> = [
106
129
  reason: SHELL_BODY_REASON,
107
130
  keeps: on_bash_command(keeps_body_safe),
108
131
  reaches: on_bash_command(carries_a_body),
132
+ about: {
133
+ title: 'No body on the shell',
134
+ topic: '`shell-body.md`',
135
+ fires:
136
+ 'a double-quoted body value (`-f body="…"` / `-f "body=…"` / `--body "…"` / `--notify-message "…"`) carrying a backtick or `$`',
137
+ quiet: 'the shell does not evaluate the body',
138
+ },
109
139
  },
110
140
  raw_field_body.ROW,
111
141
  {
@@ -117,6 +147,13 @@ const DELIVERED_RULES: ReadonlyArray<DeliveredRule> = [
117
147
  // A masking whose filter reads to the end is rewritten under `pipefail`, never refused.
118
148
  rewrite: piped_verification.pipefail_input,
119
149
  rewrite_note: piped_verification.PIPEFAIL_NOTE,
150
+ about: {
151
+ title: 'Piped verification',
152
+ topic: '`output-bounds.md`',
153
+ fires:
154
+ 'a pass/fail josh check (`gate` / `check` / `lint*` / `cspell*` / `test*` / `eval` / `overrides` / `ranges`) in front of a pipe — rewritten under `set -o pipefail` when every filter is `tail` or a full-reading `grep`, refused otherwise',
155
+ quiet: 'the exit code reaches the caller — a failure reads as a failure',
156
+ },
120
157
  },
121
158
  {
122
159
  id: 'early-heartbeat',
@@ -125,6 +162,14 @@ const DELIVERED_RULES: ReadonlyArray<DeliveredRule> = [
125
162
  decide: early_heartbeat.decide,
126
163
  keeps: on_bash_command(early_heartbeat.is_progress_watch),
127
164
  reaches: on_bash_command(early_heartbeat.waits_for_progress),
165
+ about: {
166
+ title: 'Early progress report',
167
+ topic:
168
+ '`.claude/skills/workflow-commands/progress-watcher.md` → "Progress while the run is quiet"',
169
+ fires:
170
+ 'a `Bash` whose only purpose is waiting (`sleep` alone, or `echo` / `:` / `date`) while a timer is live or before the interval. Every occurrence',
171
+ quiet: 'no hand-made wait timer — `run:progress` holds the one clock',
172
+ },
128
173
  },
129
174
  // Before `run-tail`: whether to commit at all is decided before how to push.
130
175
  test_declared_commit.ROW,
@@ -138,6 +183,13 @@ const DELIVERED_RULES: ReadonlyArray<DeliveredRule> = [
138
183
  decide: run_tail_rule.decide,
139
184
  keeps: run_tail_rule.is_backgrounded_push_step,
140
185
  reaches: run_tail_rule.is_push_step_call,
186
+ about: {
187
+ title: 'Idle run tail',
188
+ topic: '`.claude/skills/workflow-commands/background-commands.md`',
189
+ fires:
190
+ '`pnpm josh git -y` (`josh g`, `--yes` alike) issued in the **foreground**. Every occurrence',
191
+ quiet: 'issued in the background — its completion resumes the run',
192
+ },
141
193
  },
142
194
  // Reads the lane name and the cut record. Once per run, not `decide`: taking the cut ends the
143
195
  // process, and the verdicts that leave a run at the gate all need the reissue through. `reaches`
@@ -149,6 +201,13 @@ const DELIVERED_RULES: ReadonlyArray<DeliveredRule> = [
149
201
  reason: pre_gate_cut.PRE_GATE_CUT_REASON,
150
202
  keeps: on_bash_command(pre_gate_cut.takes_the_cut),
151
203
  reaches: pre_gate_cut.reaches_the_pre_gate_boundary,
204
+ about: {
205
+ title: 'The cut before the gate',
206
+ topic: '`.claude/skills/workflow-commands/pre-gate-cut.md`',
207
+ fires:
208
+ '`pnpm josh gate` (`josh ga`) in a lane work tree whose `JOSH_LANE_CHILD` names the Issue and has no cut record',
209
+ quiet: 'outside a lane, no marker (a person in the lane), or already cut',
210
+ },
152
211
  },
153
212
  // A split child's park is refused before `lane-park` sees it.
154
213
  lane_split_park.ROW,
@@ -157,6 +216,10 @@ const DELIVERED_RULES: ReadonlyArray<DeliveredRule> = [
157
216
  agent_model.ROW,
158
217
  lane_carry_conflict.ROW,
159
218
  lane_switch_main.ROW,
219
+ // Before `lane-direct-tool`, its one overlap (a timed tool in a lane): the record is the right first
220
+ // act, and `lane-direct-tool` delivers on the reissue of a `time`-prefixed tool.
221
+ timed_rerun.ROW,
222
+ lane_direct_tool.ROW,
160
223
  // Disjoint from `run-tail` by the `-y` flag.
161
224
  josh_git_bare.ROW,
162
225
  // The Bash-string gaps the deny glob cannot express, read by argv; `delivered-rules-bash.test.ts`
@@ -186,6 +249,13 @@ const BATCHING_RULE: MeasuredRule = {
186
249
  reason: time_batch_guard.REASON,
187
250
  keeps: batches_the_turn,
188
251
  reaches: time_batch_guard.is_guarded_call,
252
+ about: {
253
+ title: 'Turn batching',
254
+ topic: '`turn-batching.md`',
255
+ fires:
256
+ 'the `Bash` / `Edit` / `Read` after three single-call turns in a row; fires **again** every three more such turns',
257
+ quiet: 'calls per round trip above the floor',
258
+ },
189
259
  }
190
260
 
191
261
  // No `is_trigger`, as for batching. No `keeps`: any dispatch would read as compliance, so it is left
@@ -194,6 +264,13 @@ const INVESTIGATION_RULE: MeasuredRule = {
194
264
  id: 'investigation',
195
265
  reason: investigation_reads.REASON,
196
266
  reaches: investigation_reads.is_refusable_call,
267
+ about: {
268
+ title: 'Investigation delegation threshold',
269
+ topic: '`delegation.md`',
270
+ fires:
271
+ 'the `Read` / `Bash` that makes the third read of a file the run will not edit; fires **again** once reads pile up to the threshold again',
272
+ quiet: 'reads under the threshold — nothing to delegate yet',
273
+ },
197
274
  }
198
275
 
199
276
  const MEASURED_RULES: ReadonlyArray<MeasuredRule> = [
@@ -300,6 +377,7 @@ const delivered_rules = {
300
377
  PIPED_VERIFICATION_REASON: piped_verification.PIPED_VERIFICATION_REASON,
301
378
  POLL_LOOP_REASON: poll_loop.POLL_LOOP_REASON,
302
379
  PRE_GATE_CUT_REASON: pre_gate_cut.PRE_GATE_CUT_REASON,
380
+ PRETOOL_GUARD,
303
381
  RAW_FIELD_BODY_REASON: raw_field_body.RAW_FIELD_BODY_REASON,
304
382
  RUN_TAIL_REASON: run_tail_rule.RUN_TAIL_REASON,
305
383
  SHELL_BODY_REASON,
@@ -313,5 +391,5 @@ const delivered_rules = {
313
391
  is_issue_filing,
314
392
  }
315
393
 
316
- export type { CallRewrite, DeliveredRule, MeasuredRule }
394
+ export type { CallRewrite, DeliveredRule, MeasuredRule, RuleAbout }
317
395
  export { delivered_rules }
@@ -93,7 +93,7 @@ function is_destructive_segment(segment: string): boolean {
93
93
  }
94
94
 
95
95
  function is_destructive_command(command: string): boolean {
96
- return shell_segments.segments_of(command).some((segment) => is_destructive_segment(segment))
96
+ return shell_segments.commands_of(command).some((segment) => is_destructive_segment(segment))
97
97
  }
98
98
 
99
99
  const DESTRUCTIVE_COMMAND_REASON =
@@ -109,6 +109,13 @@ const ROW = {
109
109
  decide: (): boolean => true,
110
110
  // The opening the reason carried before it was cut to the action and the next command.
111
111
  former_reasons: ['⛔ destructive command: a recursive forced `rm` (`rm -rf`'],
112
+ about: {
113
+ title: 'Destructive command',
114
+ topic: '`operating-rules.md`',
115
+ fires:
116
+ '`rm -rf` (any spelling), `gh repo delete` / `archive`, `gh pr close`, `gh api -X DELETE`. Every occurrence',
117
+ quiet: "`gh issue close` or removing an Issue label — the workflow's own steps",
118
+ },
112
119
  }
113
120
 
114
121
  const destructive_command = { DESTRUCTIVE_COMMAND_REASON, ROW, is_destructive_command }
@@ -8,8 +8,8 @@ import { bash_triggers } from './bash-triggers'
8
8
  // pointed there.
9
9
 
10
10
  const DIRECT_FILING_REASON =
11
- '⛔ direct filing: an Issue is filed with `pnpm josh issue:file "<title>" --body-file <path> ' +
12
- '--depth <0|1|2>`, never with `gh api …/issues` or `gh issue create` — it runs the scout, the lint, ' +
11
+ '⛔ direct filing: an Issue is filed with `pnpm josh issue:file "<title>" --body-file <path>`, ' +
12
+ 'never with `gh api …/issues` or `gh issue create` — it runs the scout, the lint, ' +
13
13
  'the labels and `epic:bundle` itself. It fires on every occurrence (`docs/josh-commands-backlog.md` ' +
14
14
  '→ "`josh issue:file`").'
15
15
 
@@ -27,6 +27,14 @@ const ROW = {
27
27
  decide: (): boolean => true,
28
28
  keeps: bash_triggers.on_bash_command(bash_triggers.is_issue_filing),
29
29
  reaches: bash_triggers.on_bash_command(is_any_filing),
30
+ about: {
31
+ title: 'Direct filing',
32
+ topic: '`docs/josh-commands-backlog.md` → `josh issue:file`',
33
+ fires:
34
+ 'a `Bash` that creates an Issue outside `josh issue:file` (`gh issue create`, or a POST with `title` to `…/issues`); the refusal hands over the `pnpm josh issue:file` form. Every occurrence',
35
+ quiet:
36
+ 'filing through `pnpm josh issue:file` — the duplicate scan, the body check and `epic:bundle` all run',
37
+ },
30
38
  }
31
39
 
32
40
  const direct_filing = { DIRECT_FILING_REASON, ROW }