@joshuafolkken/kit 1.1471.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 (895) hide show
  1. package/.claude/agents/investigator.md +1 -1
  2. package/.claude/settings.json +6 -6
  3. package/.claude/skills/epic-commands/SKILL.md +26 -77
  4. package/.claude/skills/epic-commands/epic-bundle.md +12 -6
  5. package/.claude/skills/epic-commands/execution-waves.md +1 -2
  6. package/.claude/skills/verify-ui/SKILL.md +1 -2
  7. package/.claude/skills/workflow-commands/SKILL.md +12 -14
  8. package/.claude/skills/workflow-commands/background-commands.md +8 -12
  9. package/.claude/skills/workflow-commands/backlogrun-child.md +13 -18
  10. package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +7 -25
  11. package/.claude/skills/workflow-commands/backlogrun-lanes.md +23 -28
  12. package/.claude/skills/workflow-commands/backlogrun-park.md +16 -31
  13. package/.claude/skills/workflow-commands/backlogrun-progress.md +12 -21
  14. package/.claude/skills/workflow-commands/backlogrun-recovery.md +12 -12
  15. package/.claude/skills/workflow-commands/backlogrun-steps.md +12 -20
  16. package/.claude/skills/workflow-commands/backlogrun.md +32 -51
  17. package/.claude/skills/workflow-commands/chain-rule.md +18 -11
  18. package/.claude/skills/workflow-commands/delegation.md +13 -8
  19. package/.claude/skills/workflow-commands/entry-sequence.md +10 -12
  20. package/.claude/skills/workflow-commands/followup.md +10 -35
  21. package/.claude/skills/workflow-commands/fullrun-steps.md +38 -49
  22. package/.claude/skills/workflow-commands/fullrun.md +6 -8
  23. package/.claude/skills/workflow-commands/halfrun.md +20 -32
  24. package/.claude/skills/workflow-commands/into-target.md +1 -2
  25. package/.claude/skills/workflow-commands/issue-comments.md +19 -15
  26. package/.claude/skills/workflow-commands/issue-scout.md +5 -4
  27. package/.claude/skills/workflow-commands/kickoff.md +24 -23
  28. package/.claude/skills/workflow-commands/latest-gate.md +9 -18
  29. package/.claude/skills/workflow-commands/needs-human-review.md +11 -19
  30. package/.claude/skills/workflow-commands/observation-filing.md +4 -50
  31. package/.claude/skills/workflow-commands/observation-ledger.md +5 -10
  32. package/.claude/skills/workflow-commands/pre-gate-cut.md +22 -44
  33. package/.claude/skills/workflow-commands/prerequisite.md +11 -18
  34. package/.claude/skills/workflow-commands/progress-watcher.md +3 -8
  35. package/.claude/skills/workflow-commands/prrun.md +6 -12
  36. package/.claude/skills/workflow-commands/retrospective.md +5 -5
  37. package/.claude/skills/workflow-commands/split-assessment.md +14 -4
  38. package/.claude/skills/workflow-commands/target-repository.md +1 -2
  39. package/.claude/skills/workflow-commands/working-tree-hold.md +11 -13
  40. package/.codex/hooks.json +6 -6
  41. package/.github/actions/setup-node/action.yml +10 -1
  42. package/.github/actions/setup-pnpm/action.yml +1 -1
  43. package/.github/dependabot.yml +16 -0
  44. package/.github/release.yml +0 -2
  45. package/.github/workflows/ci.yml +121 -11
  46. package/.github/workflows/publish.yml +10 -3
  47. package/.github/workflows/sonar-qube.yml +1 -0
  48. package/.prettierignore +2 -0
  49. package/.vscode/tasks.json +1 -2
  50. package/CLAUDE.md +4 -8
  51. package/README.md +4 -2
  52. package/SECURITY.md +1 -1
  53. package/cspell/index.yaml +7 -0
  54. package/dist/CLAUDE.md +4 -8
  55. package/dist/commands/document-read-cli.js +882 -0
  56. package/dist/commands/{document-section-cli.js → document-section-main.js} +137 -62
  57. package/dist/commands/read-set-cli.js +1867 -0
  58. package/dist/commands/run-prep-main.js +21653 -0
  59. package/dist/commands/run-step-cli.js +23880 -0
  60. package/dist/config-merge/index.js +5 -1
  61. package/dist/hooks/audit-provision.js +20 -35
  62. package/dist/hooks/{chunk-DGT54IH5.js → chunk-AZX4FGQ3.js} +63 -17
  63. package/dist/hooks/chunk-CWMBGKYW.js +6483 -0
  64. package/dist/hooks/chunk-O2YBIDSI.js +4306 -0
  65. package/dist/hooks/{chunk-AS74OU3D.js → chunk-PT5R6UJD.js} +4582 -2118
  66. package/dist/hooks/chunk-TUIFS5E7.js +72 -0
  67. package/dist/hooks/{chunk-723HKZO5.js → chunk-VWWCFGWK.js} +1 -1
  68. package/dist/hooks/{chunk-E7OIKX5Z.js → chunk-WR2KQAYZ.js} +1863 -382
  69. package/dist/hooks/{chunk-KC5AK2GF.js → chunk-XGBNSWEI.js} +248 -46
  70. package/dist/hooks/chunk-YCDOIR3I.js +3456 -0
  71. package/dist/hooks/codex-hook-adapter.js +10 -19
  72. package/dist/hooks/format-edited.js +5 -5
  73. package/dist/hooks/inputs.json +436 -257
  74. package/dist/hooks/pretool-guard.js +7 -22
  75. package/dist/hooks/session-lang.js +380 -42
  76. package/dist/hooks/stop-guard.js +8711 -782
  77. package/dist/josh.js +5263 -997
  78. package/dist/self-sync-guard/index.js +74 -10
  79. package/dist/version/index.js +115 -406
  80. package/eslint/base.js +1 -1
  81. package/lefthook/base.yml +8 -4
  82. package/package.json +17 -53
  83. package/pnpm-workspace.yaml +4 -2
  84. package/prompts/coding-standards.md +1 -1
  85. package/prompts/collaboration-workflow/file-edits.md +1 -9
  86. package/prompts/collaboration-workflow/gh-rest.md +1 -2
  87. package/prompts/collaboration-workflow/issue-citation.md +2 -4
  88. package/prompts/collaboration-workflow/issue-template.md +42 -17
  89. package/prompts/collaboration-workflow/lane-instructions.md +34 -0
  90. package/prompts/collaboration-workflow/measurement.md +37 -0
  91. package/prompts/collaboration-workflow/operating-rules.md +6 -12
  92. package/prompts/collaboration-workflow/output-bounds.md +4 -9
  93. package/prompts/collaboration-workflow/overview.md +1 -1
  94. package/prompts/collaboration-workflow/plan-comment.md +3 -42
  95. package/prompts/collaboration-workflow/principles.md +19 -8
  96. package/prompts/collaboration-workflow/report-format.md +37 -57
  97. package/prompts/collaboration-workflow/residency.md +12 -8
  98. package/prompts/collaboration-workflow/rule-delivery.md +3 -11
  99. package/prompts/collaboration-workflow/shell-body.md +8 -18
  100. package/prompts/collaboration-workflow/turn-batching.md +4 -6
  101. package/prompts/collaboration-workflow/upstream-interrupt.md +16 -6
  102. package/prompts/collaboration-workflow/wip-cap.md +7 -7
  103. package/prompts/collaboration-workflow.md +4 -7
  104. package/prompts/refactoring.md +1 -1
  105. package/prompts/review-rubric.md +1 -2
  106. package/prompts/review.md +45 -26
  107. package/prompts/testing-guide.md +10 -45
  108. package/scripts/agent/agent-argv.ts +20 -4
  109. package/scripts/agent/agent-event.ts +15 -15
  110. package/scripts/agent/agent-exit-record.ts +13 -1
  111. package/scripts/agent/agent-role-profile.ts +101 -45
  112. package/scripts/agent/agent-safe-text.ts +60 -0
  113. package/scripts/agent/api-auth.ts +41 -0
  114. package/scripts/agent/api-outage.ts +1 -1
  115. package/scripts/agent/claude-agent-argv.ts +14 -0
  116. package/scripts/agent/codex-agent-argv.ts +2 -0
  117. package/scripts/agent/lane-instructions.ts +144 -0
  118. package/scripts/auto-ok/auto-ok-cli.ts +14 -16
  119. package/scripts/auto-ok/auto-ok-judge-read.ts +12 -3
  120. package/scripts/auto-ok/auto-ok-judge-write.ts +46 -19
  121. package/scripts/auto-ok/auto-ok-judge.ts +13 -2
  122. package/scripts/auto-ok/auto-ok-main.ts +17 -0
  123. package/scripts/backlog/backlog-arrival.ts +14 -3
  124. package/scripts/backlog/backlog-budget-cli.ts +7 -33
  125. package/scripts/backlog/backlog-budget-main.ts +16 -0
  126. package/scripts/backlog/backlog-budget.ts +6 -7
  127. package/scripts/backlog/backlog-defect-priority.ts +4 -3
  128. package/scripts/backlog/backlog-drive-adopt.ts +67 -0
  129. package/scripts/backlog/backlog-drive-args.ts +4 -5
  130. package/scripts/backlog/backlog-drive-cli.ts +113 -28
  131. package/scripts/backlog/backlog-drive-hold.ts +162 -0
  132. package/scripts/backlog/backlog-drive-idle.ts +151 -0
  133. package/scripts/backlog/backlog-drive-judge.ts +25 -0
  134. package/scripts/backlog/backlog-drive-memory.ts +126 -0
  135. package/scripts/backlog/backlog-drive-named-offer.ts +5 -10
  136. package/scripts/backlog/backlog-drive-named.ts +54 -7
  137. package/scripts/backlog/backlog-drive-offer-argv.ts +3 -8
  138. package/scripts/backlog/backlog-drive-paused.ts +169 -0
  139. package/scripts/backlog/backlog-drive-restore.ts +39 -8
  140. package/scripts/backlog/backlog-drive-seats.ts +18 -8
  141. package/scripts/backlog/backlog-drive-token-handling.ts +38 -0
  142. package/scripts/backlog/backlog-drive.ts +79 -75
  143. package/scripts/backlog/backlog-next-main.ts +16 -0
  144. package/scripts/backlog/backlog-next-shared.ts +73 -0
  145. package/scripts/backlog/backlog-next.ts +48 -16
  146. package/scripts/backlog/backlog-occupied.ts +69 -0
  147. package/scripts/backlog/backlog-offer-cli.ts +6 -21
  148. package/scripts/backlog/backlog-offer-exclude.ts +15 -0
  149. package/scripts/backlog/backlog-offer-main.ts +12 -0
  150. package/scripts/backlog/backlog-offer.ts +36 -3
  151. package/scripts/backlog/backlog-overlap.ts +22 -4
  152. package/scripts/backlog/backlog-plan-read.ts +6 -2
  153. package/scripts/backlog/backlog-plan.ts +18 -4
  154. package/scripts/backlog/backlog-pool.ts +10 -10
  155. package/scripts/backlog/backlog-rank.ts +10 -2
  156. package/scripts/backlog/backlog-ready.ts +137 -18
  157. package/scripts/backlog/backlog-stalled-detect.ts +109 -36
  158. package/scripts/backlog/backlog-stalled.ts +52 -16
  159. package/scripts/backlog/backlog-wait-cause.ts +86 -0
  160. package/scripts/backlog/backlog-waves.ts +39 -13
  161. package/scripts/backlog/backlogrun-args.ts +19 -7
  162. package/scripts/backlog/backlogrun-cli.ts +19 -5
  163. package/scripts/backlog/backlogrun-launch.ts +6 -0
  164. package/scripts/backlog/backlogrun-restart.ts +97 -0
  165. package/scripts/backlog/backlogrun-stop.ts +79 -7
  166. package/scripts/behavior/behavior-cli.ts +2 -2
  167. package/scripts/behavior/behavior-rules.ts +47 -24
  168. package/scripts/build/build-bin.ts +2 -16
  169. package/scripts/build/build-claude-md.ts +0 -7
  170. package/scripts/build/build-commands.ts +0 -13
  171. package/scripts/build/build-hooks.ts +49 -48
  172. package/scripts/build/hook-bundle-stamp.ts +29 -11
  173. package/scripts/build/local-bin.ts +1 -1
  174. package/scripts/cases/cases-cli.ts +25 -13
  175. package/scripts/cases/cases-interaction-scan.ts +134 -0
  176. package/scripts/cases/cases-interaction.ts +183 -0
  177. package/scripts/cases/cases-logic.ts +39 -6
  178. package/scripts/ci/pr-classification-main.ts +18 -0
  179. package/scripts/ci/pr-classification.ts +10 -17
  180. package/scripts/clone/clone-scan.ts +1 -1
  181. package/scripts/cost-runtime/cost-blocks.ts +22 -37
  182. package/scripts/cost-runtime/cost-cli.ts +31 -14
  183. package/scripts/cost-runtime/cost-main.ts +12 -0
  184. package/scripts/cost-runtime/cost-transcript.ts +1 -0
  185. package/scripts/delegation/delegation-policy.ts +17 -4
  186. package/scripts/delegation/duplicate-read-guard.ts +2 -10
  187. package/scripts/delegation/investigation-guard.ts +15 -73
  188. package/scripts/delegation/investigation-reads.ts +3 -5
  189. package/scripts/dependabot/dependabot-cooldown.ts +194 -0
  190. package/scripts/discovery/repo-discovery.ts +24 -6
  191. package/scripts/doctor/doctor-consumer.ts +2 -5
  192. package/scripts/document/document-byte-budget.ts +9 -6
  193. package/scripts/document/document-scan.ts +1 -1
  194. package/scripts/document/document-section-cli.ts +17 -13
  195. package/scripts/document/document-section-main.ts +12 -0
  196. package/scripts/document/entry-read-budget.ts +2 -2
  197. package/scripts/document/read-set-cli.ts +4 -1
  198. package/scripts/epic/epic-audit-cli.ts +12 -6
  199. package/scripts/epic/epic-audit-orphans.ts +5 -8
  200. package/scripts/epic/epic-audit.ts +52 -1
  201. package/scripts/epic/epic-bundle-apply.ts +137 -0
  202. package/scripts/epic/epic-bundle-cli.ts +32 -121
  203. package/scripts/epic/epic-bundle-evidence.ts +49 -26
  204. package/scripts/epic/epic-bundle-format.ts +116 -0
  205. package/scripts/epic/epic-bundle-main.ts +17 -0
  206. package/scripts/epic/epic-bundle-referenced.ts +14 -3
  207. package/scripts/epic/epic-bundle.ts +17 -9
  208. package/scripts/epic/epic-busy.ts +5 -12
  209. package/scripts/epic/epic-classify.ts +24 -15
  210. package/scripts/epic/epic-cli-argv.ts +31 -0
  211. package/scripts/epic/epic-cli-decide.ts +42 -0
  212. package/scripts/epic/epic-cli.ts +6 -38
  213. package/scripts/epic/epic-close.ts +112 -55
  214. package/scripts/epic/epic-cross-repo.ts +4 -7
  215. package/scripts/epic/epic-decide.ts +119 -0
  216. package/scripts/epic/epic-decision.ts +9 -0
  217. package/scripts/epic/epic-fetch.ts +4 -0
  218. package/scripts/epic/epic-graph.ts +2 -0
  219. package/scripts/epic/epic-issue.ts +5 -1
  220. package/scripts/epic/epic-label-age.ts +1 -1
  221. package/scripts/epic/epic-lane-offer.ts +39 -4
  222. package/scripts/epic/epic-next-main.ts +24 -0
  223. package/scripts/epic/epic-next.ts +6 -24
  224. package/scripts/epic/epic-outside-blocker.ts +6 -2
  225. package/scripts/epic/epic-parse.ts +9 -3
  226. package/scripts/epic/epic-read.ts +1 -0
  227. package/scripts/epic/epic-reconcile.ts +39 -0
  228. package/scripts/epic/epic-run.ts +10 -1
  229. package/scripts/epic/epic-solo.ts +50 -14
  230. package/scripts/epic/epic.ts +41 -7
  231. package/scripts/exports/unused-members-cli.ts +2 -2
  232. package/scripts/followup/followup-checks-event.ts +8 -3
  233. package/scripts/followup/followup-coderabbit-wait.ts +82 -0
  234. package/scripts/followup/followup-review-gates.ts +81 -0
  235. package/scripts/followup/git-followup-stages.ts +13 -3
  236. package/scripts/followup/git-followup-workflow.ts +31 -60
  237. package/scripts/followup/git-pr-followup-wrapup.ts +9 -14
  238. package/scripts/followup/git-pr-followup.ts +36 -8
  239. package/scripts/fresh-machine/fresh-machine-cli.ts +1 -1
  240. package/scripts/fresh-machine/fresh-machine-run.ts +8 -8
  241. package/scripts/fresh-machine/specs/kit-test-backlogrun.json +1 -1
  242. package/scripts/gate/busy-average.ts +58 -0
  243. package/scripts/gate/check-cpu.ts +60 -0
  244. package/scripts/gate/check-inputs.ts +73 -0
  245. package/scripts/gate/check-reuse.ts +141 -0
  246. package/scripts/gate/command-memory.ts +192 -0
  247. package/scripts/gate/core-admission.ts +218 -28
  248. package/scripts/gate/core-budget-timing.ts +37 -0
  249. package/scripts/gate/core-budget.ts +150 -119
  250. package/scripts/gate/core-wait-record.ts +48 -0
  251. package/scripts/gate/core-wait.ts +162 -0
  252. package/scripts/gate/core-weights.ts +86 -0
  253. package/scripts/gate/free-cores.ts +72 -0
  254. package/scripts/gate/gate-ledger.ts +49 -7
  255. package/scripts/gate/gate-plan.ts +44 -15
  256. package/scripts/gate/gate-report.ts +29 -4
  257. package/scripts/gate/gate-run-steps.ts +195 -0
  258. package/scripts/gate/gate-skip.ts +12 -2
  259. package/scripts/gate/gate-steps.ts +12 -1
  260. package/scripts/gate/held-mark.ts +55 -0
  261. package/scripts/gate/input-fingerprint.ts +42 -0
  262. package/scripts/gate/machine-capacity.ts +124 -31
  263. package/scripts/gate/moved-paths.ts +67 -0
  264. package/scripts/gate/pre-commit-type-check.ts +14 -1
  265. package/scripts/gate/project-checks.ts +5 -12
  266. package/scripts/gate/scoped-green.ts +12 -8
  267. package/scripts/gate/since-green.ts +62 -0
  268. package/scripts/gate/toolchain-inputs.ts +115 -0
  269. package/scripts/gate/verification-gate.ts +65 -129
  270. package/scripts/gate/verification-inputs.ts +250 -0
  271. package/scripts/gh/gh-author-association.ts +96 -9
  272. package/scripts/gh/git-ai-review-scan.ts +4 -2
  273. package/scripts/gh/git-gh-api-path.ts +15 -0
  274. package/scripts/gh/git-gh-branch-rules.ts +73 -0
  275. package/scripts/gh/git-gh-conditional.ts +5 -2
  276. package/scripts/gh/git-gh-issue-read.ts +5 -1
  277. package/scripts/gh/git-gh-issue-rest.ts +1 -0
  278. package/scripts/gh/git-gh-issue-write.ts +77 -17
  279. package/scripts/gh/git-gh-issue.ts +7 -3
  280. package/scripts/gh/git-gh-poll-read.ts +89 -0
  281. package/scripts/gh/git-gh-pr-auto-merge.ts +8 -3
  282. package/scripts/gh/git-gh-pr-rest.ts +1 -1
  283. package/scripts/gh/git-gh-pr-snapshot.ts +33 -20
  284. package/scripts/gh/git-gh-pr.ts +27 -15
  285. package/scripts/gh/git-pr-checks-eval.ts +39 -7
  286. package/scripts/gh/git-pr-checks-parse.ts +39 -9
  287. package/scripts/gh/git-pr-merge-checked.ts +80 -0
  288. package/scripts/gh/git-pr.ts +13 -1
  289. package/scripts/git/base-tree.ts +19 -2
  290. package/scripts/git/changed-file-scope.ts +6 -4
  291. package/scripts/git/changed-paths.ts +18 -1
  292. package/scripts/git/git-diff-reads.ts +27 -2
  293. package/scripts/git/git-grep-hits.ts +85 -0
  294. package/scripts/git/git-location-environment.ts +1 -1
  295. package/scripts/git/git-merge-conflicts.ts +83 -0
  296. package/scripts/git/git-preflight.ts +37 -12
  297. package/scripts/git/git-push-transport.ts +1 -2
  298. package/scripts/git/git-schemas.ts +17 -7
  299. package/scripts/git/git-spawn.ts +1 -2
  300. package/scripts/git/git-status.ts +4 -4
  301. package/scripts/git/main-merge-main.ts +12 -0
  302. package/scripts/git/main-merge-regenerate.ts +78 -0
  303. package/scripts/git/main-merge.ts +39 -14
  304. package/scripts/git/main-sync-main.ts +12 -0
  305. package/scripts/git/main-sync.ts +0 -9
  306. package/scripts/git/stash/git-stash.ts +27 -4
  307. package/scripts/git/stash/{stash-pop-args.ts → stash-args.ts} +13 -10
  308. package/scripts/git/stash/stash-pop-cli.ts +6 -12
  309. package/scripts/git/stash/stash-pop-main.ts +12 -0
  310. package/scripts/git/stash/stash-push-cli.ts +76 -0
  311. package/scripts/git/stash/stash-push-main.ts +12 -0
  312. package/scripts/hooks/batch-guard.ts +5 -16
  313. package/scripts/hooks/check-commit-message-main.ts +8 -0
  314. package/scripts/hooks/check-commit-message.ts +4 -7
  315. package/scripts/hooks/format-edited-file.ts +8 -24
  316. package/scripts/hooks/pre-commit-lint.ts +118 -0
  317. package/scripts/hooks/pre-push-unit.ts +4 -2
  318. package/scripts/hooks/pretool-guard-cli.ts +1 -8
  319. package/scripts/hooks/pretool-guard.ts +57 -69
  320. package/scripts/hooks/reserved-run.ts +67 -8
  321. package/scripts/hooks/run-hook.sh +18 -11
  322. package/scripts/hooks/shell-rules-notice.ts +37 -0
  323. package/scripts/hooks/stop-actions.ts +185 -0
  324. package/scripts/hooks/stop-guard.ts +72 -27
  325. package/scripts/init/hook-command-rewrite.ts +19 -5
  326. package/scripts/init/hook-launch.ts +15 -12
  327. package/scripts/init/init-actions.ts +0 -6
  328. package/scripts/init/init-ai-copy.ts +10 -36
  329. package/scripts/init/init-bootstrap.ts +9 -8
  330. package/scripts/init/init-dry-run-report.ts +1 -1
  331. package/scripts/init/init-dry-run.ts +1 -1
  332. package/scripts/init/init-file-action.ts +7 -9
  333. package/scripts/init/init-logic-json-merge.ts +2 -2
  334. package/scripts/init/init-logic-migrate.ts +9 -82
  335. package/scripts/init/init-logic.ts +3 -2
  336. package/scripts/init/init-main.ts +12 -0
  337. package/scripts/init/init.ts +5 -12
  338. package/scripts/init/kit-development-versions.ts +3 -7
  339. package/scripts/init/kit-written-paths.ts +2 -2
  340. package/scripts/init/project-profile.ts +5 -4
  341. package/scripts/init/tsconfig-preset-migration.ts +2 -1
  342. package/scripts/init/vscode-tasks.ts +1 -1
  343. package/scripts/issue/defect-origin-cli.ts +106 -0
  344. package/scripts/issue/defect-origin-line.ts +60 -0
  345. package/scripts/issue/defect-origin-main.ts +11 -0
  346. package/scripts/issue/defect-origin.ts +114 -0
  347. package/scripts/issue/defect-rate-cli.ts +34 -78
  348. package/scripts/issue/defect-rate.ts +0 -16
  349. package/scripts/issue/defect-report-cli.ts +128 -0
  350. package/scripts/issue/defect-report-format.ts +56 -0
  351. package/scripts/issue/defect-report-main.ts +11 -0
  352. package/scripts/issue/defect-report.ts +160 -0
  353. package/scripts/issue/expected-effect-lint.ts +60 -0
  354. package/scripts/issue/issue-already-done-cli.ts +62 -0
  355. package/scripts/issue/issue-body-or-comment.ts +40 -0
  356. package/scripts/issue/issue-cite-cli.ts +33 -22
  357. package/scripts/issue/issue-cite-main.ts +12 -0
  358. package/scripts/issue/issue-classification.ts +13 -8
  359. package/scripts/issue/issue-comment-cli.ts +10 -24
  360. package/scripts/issue/issue-comment-main.ts +12 -0
  361. package/scripts/issue/issue-evidence-exit.ts +100 -0
  362. package/scripts/issue/issue-file-cli.ts +29 -7
  363. package/scripts/issue/issue-file.ts +19 -19
  364. package/scripts/issue/issue-fold-cli.ts +2 -11
  365. package/scripts/issue/issue-fold-main.ts +12 -0
  366. package/scripts/issue/issue-labels.ts +81 -90
  367. package/scripts/issue/issue-lint-cli.ts +7 -13
  368. package/scripts/issue/issue-lint-main.ts +12 -0
  369. package/scripts/issue/issue-measured-cli.ts +56 -0
  370. package/scripts/issue/issue-merged.ts +19 -2
  371. package/scripts/issue/issue-not-before-label.ts +135 -0
  372. package/scripts/issue/issue-not-before.ts +111 -0
  373. package/scripts/issue/issue-number-shape.ts +15 -1
  374. package/scripts/issue/issue-park.ts +28 -0
  375. package/scripts/issue/issue-plan-cli.ts +151 -0
  376. package/scripts/issue/issue-priority.ts +151 -0
  377. package/scripts/issue/issue-rank.ts +7 -1
  378. package/scripts/issue/issue-read-cli.ts +3 -10
  379. package/scripts/issue/issue-read-main.ts +12 -0
  380. package/scripts/issue/issue-read.ts +29 -5
  381. package/scripts/issue/issue-release-cli.ts +0 -10
  382. package/scripts/issue/issue-release-main.ts +13 -0
  383. package/scripts/issue/issue-release.ts +7 -12
  384. package/scripts/issue/issue-sample-gate.ts +192 -0
  385. package/scripts/issue/issue-sample-source.ts +76 -0
  386. package/scripts/issue/issue-scout-cli.ts +19 -25
  387. package/scripts/issue/issue-scout-main.ts +14 -0
  388. package/scripts/issue/issue-state-cli.ts +0 -10
  389. package/scripts/issue/issue-state-main.ts +12 -0
  390. package/scripts/issue/issue-watch-diff.ts +56 -15
  391. package/scripts/issue/issue-watch.ts +2 -1
  392. package/scripts/issue/issue-wip.ts +2 -7
  393. package/scripts/issue/markdown-section.ts +19 -5
  394. package/scripts/issue/measure-rerun-cli.ts +13 -8
  395. package/scripts/issue/plan-consumers-cli.ts +39 -0
  396. package/scripts/issue/plan-consumers-main.ts +11 -0
  397. package/scripts/issue/plan-consumers-section.ts +55 -0
  398. package/scripts/issue/plan-consumers.ts +127 -0
  399. package/scripts/josh/agent-session-environment.ts +1 -1
  400. package/scripts/josh/command-usage.ts +82 -0
  401. package/scripts/josh/file-map-stamp.ts +49 -16
  402. package/scripts/josh/hook-decision.ts +32 -20
  403. package/scripts/josh/josh-command-map.ts +6 -1
  404. package/scripts/josh/josh-command-types.ts +65 -13
  405. package/scripts/josh/josh-commands-agent-hooks.ts +83 -0
  406. package/scripts/josh/josh-commands-ai.ts +169 -157
  407. package/scripts/josh/josh-commands-backlog.ts +82 -16
  408. package/scripts/josh/josh-commands-clone.ts +1 -0
  409. package/scripts/josh/josh-commands-development.ts +111 -71
  410. package/scripts/josh/josh-commands-document.ts +43 -1
  411. package/scripts/josh/josh-commands-epic.ts +171 -0
  412. package/scripts/josh/josh-commands-hooks.ts +31 -2
  413. package/scripts/josh/josh-commands-issue-write.ts +181 -0
  414. package/scripts/josh/josh-commands-issue.ts +124 -24
  415. package/scripts/josh/josh-commands-lane.ts +112 -2
  416. package/scripts/josh/josh-commands-lint.ts +19 -8
  417. package/scripts/josh/josh-commands-maintenance.ts +112 -4
  418. package/scripts/josh/josh-commands-pause.ts +29 -0
  419. package/scripts/josh/josh-commands-progress.ts +87 -0
  420. package/scripts/josh/josh-commands-project.ts +138 -9
  421. package/scripts/josh/josh-commands-review.ts +124 -0
  422. package/scripts/josh/josh-commands-run.ts +211 -23
  423. package/scripts/josh/josh-commands-ship.ts +169 -0
  424. package/scripts/josh/josh-commands-split.ts +9 -0
  425. package/scripts/josh/josh-commands-versioning.ts +49 -2
  426. package/scripts/josh/josh-commands-workflow.ts +149 -6
  427. package/scripts/josh/josh-logic.ts +11 -27
  428. package/scripts/josh/josh.ts +14 -5
  429. package/scripts/josh/package-directory.ts +18 -0
  430. package/scripts/josh/process-identity.ts +13 -4
  431. package/scripts/josh/session-language-cli.ts +4 -8
  432. package/scripts/josh/session-language-main.ts +13 -0
  433. package/scripts/josh/session-language.ts +6 -1
  434. package/scripts/josh/shared-cache.ts +90 -0
  435. package/scripts/josh/stamp-file.ts +9 -15
  436. package/scripts/lane/lane-await.ts +51 -12
  437. package/scripts/lane/lane-cache.ts +5 -30
  438. package/scripts/lane/lane-capacity.ts +19 -22
  439. package/scripts/lane/lane-check-stats.ts +97 -0
  440. package/scripts/lane/lane-child-invocation.ts +43 -4
  441. package/scripts/lane/lane-cli.ts +15 -5
  442. package/scripts/lane/lane-close.ts +86 -18
  443. package/scripts/lane/lane-core-wait-stats.ts +66 -0
  444. package/scripts/lane/lane-dispatch.ts +27 -6
  445. package/scripts/lane/lane-gap-stats.ts +156 -0
  446. package/scripts/lane/lane-guard-policy.ts +2 -2
  447. package/scripts/lane/lane-handoff.ts +76 -1
  448. package/scripts/lane/lane-held-stats.ts +129 -0
  449. package/scripts/lane/lane-install.ts +16 -15
  450. package/scripts/lane/lane-launch-cli.ts +0 -9
  451. package/scripts/lane/lane-launch-main.ts +12 -0
  452. package/scripts/lane/lane-ledger-schema.ts +266 -0
  453. package/scripts/lane/lane-ledger.ts +108 -97
  454. package/scripts/lane/lane-limit-cli.ts +19 -9
  455. package/scripts/lane/lane-measure-cli.ts +58 -10
  456. package/scripts/lane/lane-open.ts +9 -1
  457. package/scripts/lane/lane-parked.ts +3 -3
  458. package/scripts/lane/lane-pause-cli.ts +130 -0
  459. package/scripts/lane/lane-pause.ts +158 -0
  460. package/scripts/lane/lane-preserve.ts +29 -1
  461. package/scripts/lane/lane-process-table.ts +166 -0
  462. package/scripts/lane/lane-reap-settle.ts +124 -0
  463. package/scripts/lane/lane-reap.ts +50 -15
  464. package/scripts/lane/lane-registry.ts +33 -10
  465. package/scripts/lane/lane-residents.ts +162 -0
  466. package/scripts/lane/lane-restart.ts +26 -27
  467. package/scripts/lane/lane-round-two-stats.ts +49 -0
  468. package/scripts/lane/lane-sampler.ts +4 -0
  469. package/scripts/lane/lane-session-action.ts +160 -0
  470. package/scripts/lane/lane-session-broker.ts +134 -134
  471. package/scripts/lane/lane-snapshot-trace.ts +84 -0
  472. package/scripts/lane/lane-spans.ts +51 -0
  473. package/scripts/lane/lane-spent.ts +6 -3
  474. package/scripts/lane/lane-stage-stats.ts +7 -2
  475. package/scripts/lane/lane-state.ts +302 -0
  476. package/scripts/lane/lane-stats.ts +58 -4
  477. package/scripts/lane/lane-stop-stats.ts +113 -37
  478. package/scripts/lane/lane-test-related-stats.ts +127 -0
  479. package/scripts/lane/lane-transcript-calls.ts +145 -0
  480. package/scripts/lane/lane-transcript-stats.ts +168 -0
  481. package/scripts/lane/lane-vacant.ts +13 -3
  482. package/scripts/lane/lane-withdraw-cli.ts +72 -0
  483. package/scripts/lane/lane-withdraw.ts +183 -0
  484. package/scripts/lane/process-directories.ts +70 -0
  485. package/scripts/lane/process-lane-marks.ts +94 -0
  486. package/scripts/lib/atomic-write.ts +62 -0
  487. package/scripts/lib/buffered-process.ts +12 -5
  488. package/scripts/lib/cli-flags.ts +53 -0
  489. package/scripts/lib/figure-format.ts +63 -0
  490. package/scripts/lib/json-value.ts +9 -1
  491. package/scripts/lib/package-manifest.ts +35 -0
  492. package/scripts/lib/read-file.ts +3 -1
  493. package/scripts/lib/stamped-memo.ts +63 -0
  494. package/scripts/lib/stdout-on-stderr.ts +24 -0
  495. package/scripts/lib/timeouts.ts +9 -0
  496. package/scripts/lib/transcript-record.ts +91 -0
  497. package/scripts/lines/effective-limit.ts +1 -1
  498. package/scripts/lint/eslint-cache-dependencies.ts +145 -0
  499. package/scripts/lint/eslint-daemon.ts +265 -0
  500. package/scripts/lint/format.ts +14 -5
  501. package/scripts/lint/import-graph.ts +279 -0
  502. package/scripts/lint/lint-gate-scope.ts +102 -0
  503. package/scripts/lint/lint-parallel-main.ts +19 -0
  504. package/scripts/lint/lint-parallel.ts +72 -33
  505. package/scripts/lint/lint-related-scope.ts +33 -24
  506. package/scripts/lint/lint-related.ts +38 -6
  507. package/scripts/notify/confirmation-options.ts +1 -2
  508. package/scripts/notify/telegram-notify.ts +20 -20
  509. package/scripts/notify/telegram-test-logic.ts +0 -1
  510. package/scripts/notify/telegram-test-main.ts +8 -0
  511. package/scripts/notify/telegram-test.ts +12 -11
  512. package/scripts/observations/observation-ledger.ts +13 -0
  513. package/scripts/observations/observations-flush-landing.ts +5 -3
  514. package/scripts/observations/observations-flush.ts +6 -1
  515. package/scripts/overrides/overrides-check.ts +2 -5
  516. package/scripts/overrides/overrides-files.ts +2 -1
  517. package/scripts/overrides/overrides-logic.ts +3 -6
  518. package/scripts/package/verify-optional-eslint-install.ts +8 -6
  519. package/scripts/propagate/propagate-publish.ts +2 -7
  520. package/scripts/propagate/propagate-targets.ts +4 -12
  521. package/scripts/refactor/import-graph.ts +9 -7
  522. package/scripts/release/github-release-runs.ts +17 -6
  523. package/scripts/release/release-approval-prune.ts +18 -0
  524. package/scripts/release/release-history.ts +1 -3
  525. package/scripts/release/release-progress.ts +42 -22
  526. package/scripts/release/release-publish-run.ts +39 -0
  527. package/scripts/release/release-publish.ts +6 -6
  528. package/scripts/release/release-scope-cli.ts +0 -10
  529. package/scripts/release/release-scope-main.ts +12 -0
  530. package/scripts/repo/repo-setting.ts +3 -6
  531. package/scripts/repo/required-checks-logic.ts +6 -15
  532. package/scripts/report/report-format-reference.ts +4 -0
  533. package/scripts/report/report-labels.ts +155 -0
  534. package/scripts/report/report-lint-cli.ts +3 -0
  535. package/scripts/report/report-lint.ts +85 -110
  536. package/scripts/report/report-template-cli.ts +59 -0
  537. package/scripts/report/report-template.ts +112 -0
  538. package/scripts/review/acceptance-map-check.ts +61 -0
  539. package/scripts/review/acceptance-map.ts +206 -0
  540. package/scripts/review/removed-tests-check.ts +86 -0
  541. package/scripts/review/removed-tests.ts +149 -0
  542. package/scripts/review/review-brief-cli.ts +82 -16
  543. package/scripts/review/review-brief-main.ts +12 -0
  544. package/scripts/review/review-brief.ts +31 -3
  545. package/scripts/review/review-code-tree.ts +10 -6
  546. package/scripts/review/review-comment-round.ts +26 -8
  547. package/scripts/review/review-finding-ledger.ts +30 -15
  548. package/scripts/review/review-interaction.ts +94 -0
  549. package/scripts/review/review-readers-scan.ts +163 -0
  550. package/scripts/review/review-record-cli.ts +69 -30
  551. package/scripts/review/review-record-main.ts +12 -0
  552. package/scripts/review/review-round-one-blobs.ts +221 -0
  553. package/scripts/review/review-round2-cli.ts +49 -12
  554. package/scripts/review/review-round2.ts +80 -12
  555. package/scripts/review/review-stamps.ts +19 -1
  556. package/scripts/review/review-stop-log.ts +96 -0
  557. package/scripts/review/review-stops-cli.ts +85 -0
  558. package/scripts/review/review-tree.ts +6 -17
  559. package/scripts/review/review-untouched-readers.ts +146 -0
  560. package/scripts/review/test-titles.ts +118 -0
  561. package/scripts/rules/agent-model.ts +67 -0
  562. package/scripts/rules/bash-triggers.ts +46 -3
  563. package/scripts/rules/decision-oracle-batch.ts +9 -1
  564. package/scripts/rules/decision-oracle.ts +2 -2
  565. package/scripts/rules/delivered-rules.ts +90 -3
  566. package/scripts/rules/destructive-command.ts +8 -1
  567. package/scripts/rules/direct-filing.ts +10 -2
  568. package/scripts/rules/direct-issue-comment.ts +117 -0
  569. package/scripts/rules/direct-pr-create.ts +69 -3
  570. package/scripts/rules/early-heartbeat.ts +2 -1
  571. package/scripts/rules/file-body.ts +7 -0
  572. package/scripts/rules/filing-cap.ts +8 -0
  573. package/scripts/rules/firing-point.ts +6 -5
  574. package/scripts/rules/git-argv.ts +72 -14
  575. package/scripts/rules/git-force.ts +12 -2
  576. package/scripts/rules/guard-remedy.ts +121 -0
  577. package/scripts/rules/implementation-cut-verdict.ts +1 -1
  578. package/scripts/rules/implementation-cut.ts +11 -3
  579. package/scripts/rules/index-guard.ts +8 -1
  580. package/scripts/rules/issue-comments.ts +76 -7
  581. package/scripts/rules/josh-git-bare.ts +7 -0
  582. package/scripts/rules/lane-background.ts +67 -25
  583. package/scripts/rules/lane-carry-conflict.ts +6 -0
  584. package/scripts/rules/lane-direct-tool.ts +74 -0
  585. package/scripts/rules/lane-interactive-ask.ts +9 -2
  586. package/scripts/rules/lane-park.ts +45 -23
  587. package/scripts/rules/lane-split-park.ts +10 -2
  588. package/scripts/rules/lane-switch-main.ts +7 -0
  589. package/scripts/rules/last-prompt.ts +50 -5
  590. package/scripts/rules/oracle-consulted.ts +10 -0
  591. package/scripts/rules/oracle-firing.ts +1 -0
  592. package/scripts/rules/oracle-list-cli.ts +7 -0
  593. package/scripts/rules/permission-guards.ts +3 -0
  594. package/scripts/rules/piped-verification.ts +4 -2
  595. package/scripts/rules/poll-loop.ts +7 -0
  596. package/scripts/rules/pr-merge.ts +123 -0
  597. package/scripts/rules/protected-files.ts +32 -5
  598. package/scripts/rules/raw-field-body.ts +6 -0
  599. package/scripts/rules/rule-body-guard.ts +8 -0
  600. package/scripts/rules/rule-list.ts +12 -28
  601. package/scripts/rules/rule-rewrite.ts +114 -0
  602. package/scripts/rules/rule-value-cache.ts +4 -9
  603. package/scripts/rules/rule-value-cli.ts +51 -32
  604. package/scripts/rules/rule-value.ts +8 -2
  605. package/scripts/rules/shell-segments.ts +50 -0
  606. package/scripts/rules/stop-decision.ts +77 -0
  607. package/scripts/rules/stop-rule-rows.ts +64 -0
  608. package/scripts/rules/stop-rules.ts +150 -51
  609. package/scripts/rules/tail-commands.ts +15 -1
  610. package/scripts/rules/test-declared-commit.ts +11 -1
  611. package/scripts/rules/third-party-write.ts +7 -0
  612. package/scripts/rules/timed-rerun.ts +69 -0
  613. package/scripts/rules/worktree-guard.ts +13 -3
  614. package/scripts/run/board/run-board-app-name.ts +23 -0
  615. package/scripts/run/board/run-board-cli.ts +65 -30
  616. package/scripts/run/board/run-board-closed.ts +8 -2
  617. package/scripts/run/board/run-board-earlier.ts +94 -0
  618. package/scripts/run/board/run-board-ending-reason.ts +67 -0
  619. package/scripts/run/board/run-board-estimate-schedule.ts +103 -0
  620. package/scripts/run/board/run-board-estimate.ts +98 -0
  621. package/scripts/run/board/run-board-fit.ts +153 -36
  622. package/scripts/run/board/run-board-fold.ts +123 -0
  623. package/scripts/run/board/run-board-fresh.ts +2 -2
  624. package/scripts/run/board/run-board-gather-live.ts +29 -0
  625. package/scripts/run/board/run-board-gather-thread.ts +189 -0
  626. package/scripts/run/board/run-board-gather-worker.ts +29 -0
  627. package/scripts/run/board/run-board-gather.ts +187 -0
  628. package/scripts/run/board/run-board-github.ts +119 -31
  629. package/scripts/run/board/run-board-header.ts +86 -21
  630. package/scripts/run/board/run-board-keys.ts +58 -0
  631. package/scripts/run/board/run-board-kind.ts +20 -6
  632. package/scripts/run/board/run-board-labels.ts +118 -71
  633. package/scripts/run/board/run-board-lane-state.ts +109 -0
  634. package/scripts/run/board/run-board-lane-time.ts +122 -0
  635. package/scripts/run/board/run-board-layout.ts +240 -61
  636. package/scripts/run/board/run-board-length.ts +52 -0
  637. package/scripts/run/board/run-board-machine.ts +8 -4
  638. package/scripts/run/board/run-board-main.ts +12 -0
  639. package/scripts/run/board/run-board-notes.ts +52 -31
  640. package/scripts/run/board/run-board-now.ts +1 -1
  641. package/scripts/run/board/run-board-operation.ts +15 -33
  642. package/scripts/run/board/run-board-phase.ts +1 -1
  643. package/scripts/run/board/run-board-plan-shared.ts +115 -0
  644. package/scripts/run/board/run-board-plan.ts +55 -3
  645. package/scripts/run/board/run-board-planning.ts +45 -0
  646. package/scripts/run/board/run-board-priority.ts +44 -0
  647. package/scripts/run/board/run-board-process-groups.ts +195 -0
  648. package/scripts/run/board/run-board-read.ts +153 -13
  649. package/scripts/run/board/run-board-reason.ts +238 -45
  650. package/scripts/run/board/run-board-released.ts +35 -0
  651. package/scripts/run/board/run-board-render-checks.ts +39 -5
  652. package/scripts/run/board/run-board-render-condition.ts +96 -0
  653. package/scripts/run/board/run-board-render-drawn.ts +67 -0
  654. package/scripts/run/board/run-board-render-foot.ts +59 -0
  655. package/scripts/run/board/run-board-render-icon.ts +35 -0
  656. package/scripts/run/board/run-board-render-lanes.ts +145 -0
  657. package/scripts/run/board/run-board-render-lead.ts +80 -0
  658. package/scripts/run/board/run-board-render-legend.ts +117 -47
  659. package/scripts/run/board/run-board-render-notes.ts +156 -29
  660. package/scripts/run/board/run-board-render-processes.ts +196 -0
  661. package/scripts/run/board/run-board-render-section.ts +119 -0
  662. package/scripts/run/board/run-board-render-slot.ts +3 -36
  663. package/scripts/run/board/run-board-render-tail.ts +115 -48
  664. package/scripts/run/board/run-board-render-time.ts +56 -0
  665. package/scripts/run/board/run-board-render-title.ts +117 -24
  666. package/scripts/run/board/run-board-render-waits.ts +125 -0
  667. package/scripts/run/board/run-board-render.ts +206 -259
  668. package/scripts/run/board/run-board-roots.ts +54 -0
  669. package/scripts/run/board/run-board-row-yield.ts +10 -4
  670. package/scripts/run/board/run-board-setup.ts +1 -12
  671. package/scripts/run/board/run-board-snapshot.ts +111 -0
  672. package/scripts/run/board/run-board-spin.ts +2 -2
  673. package/scripts/run/board/run-board-state.ts +23 -29
  674. package/scripts/run/board/run-board-status.ts +206 -79
  675. package/scripts/run/board/run-board-thanks-read.ts +2 -2
  676. package/scripts/run/board/run-board-tick.ts +123 -104
  677. package/scripts/run/board/run-board-usage-board.ts +78 -0
  678. package/scripts/run/board/run-board-usage-lanes.ts +113 -0
  679. package/scripts/run/board/run-board-usage-listing.ts +93 -0
  680. package/scripts/run/board/run-board-usage-read.ts +120 -150
  681. package/scripts/run/board/run-board-usage-rusage.ts +19 -7
  682. package/scripts/run/board/run-board-usage-text.ts +139 -51
  683. package/scripts/run/board/run-board-usage-top.ts +102 -0
  684. package/scripts/run/board/run-board-usage.ts +89 -72
  685. package/scripts/run/board/run-board-usual.ts +20 -9
  686. package/scripts/run/carry/run-carry-args.ts +4 -7
  687. package/scripts/run/carry/run-carry-conversation.ts +1 -1
  688. package/scripts/run/carry/run-carry.ts +9 -4
  689. package/scripts/run/cut/run-cut-cli.ts +3 -2
  690. package/scripts/run/cut/run-cut-handoff.ts +2 -2
  691. package/scripts/run/cut/run-cut-report.ts +16 -0
  692. package/scripts/run/detached-launch.ts +23 -4
  693. package/scripts/run/entry/run-entry-cli.ts +8 -1
  694. package/scripts/run/event/run-event-cli.ts +1 -5
  695. package/scripts/run/event/run-event-filed.ts +12 -6
  696. package/scripts/run/event/run-event-follow.ts +2 -3
  697. package/scripts/run/event/run-event-render.ts +7 -10
  698. package/scripts/run/event/run-event-scope.ts +20 -2
  699. package/scripts/run/event/run-event-stream-emit.ts +78 -11
  700. package/scripts/run/event/run-event-stream.ts +37 -7
  701. package/scripts/run/hold/run-hold-adopt.ts +65 -0
  702. package/scripts/run/hold/run-hold-cli.ts +93 -22
  703. package/scripts/run/hold/run-hold-main.ts +12 -0
  704. package/scripts/run/hold/run-hold-member.ts +37 -0
  705. package/scripts/run/hold/run-hold-session.ts +46 -0
  706. package/scripts/run/hold/run-hold.ts +7 -1
  707. package/scripts/run/hold/run-stop-notify.ts +183 -0
  708. package/scripts/run/launch-priority.ts +32 -0
  709. package/scripts/run/merge/run-merge-auth.ts +31 -0
  710. package/scripts/run/merge/run-merge-cli.ts +72 -107
  711. package/scripts/run/merge/run-merge-close.ts +74 -0
  712. package/scripts/run/merge/run-merge-collect.ts +6 -13
  713. package/scripts/run/merge/run-merge-driver.ts +71 -0
  714. package/scripts/run/merge/run-merge-main.ts +12 -0
  715. package/scripts/run/merge/run-merge-outcome.ts +23 -0
  716. package/scripts/run/merge/run-merge-restart.ts +39 -0
  717. package/scripts/run/merge/run-merge-ship.ts +20 -4
  718. package/scripts/run/merge/run-merge-signals.ts +123 -0
  719. package/scripts/run/merge/run-merge-steps.ts +128 -83
  720. package/scripts/run/merge/run-merge.ts +53 -40
  721. package/scripts/run/park/run-park-cli.ts +91 -0
  722. package/scripts/run/park/run-park.ts +88 -0
  723. package/scripts/run/park/run-stalled.ts +68 -0
  724. package/scripts/run/pause/run-pause-cli.ts +73 -0
  725. package/scripts/run/pause/run-pause.ts +251 -0
  726. package/scripts/run/progress/run-progress-cli.ts +4 -12
  727. package/scripts/run/progress/run-progress-clock.ts +1 -1
  728. package/scripts/run/progress/run-progress-config.ts +6 -14
  729. package/scripts/run/progress/run-progress-main.ts +12 -0
  730. package/scripts/run/progress/run-progress.ts +1 -4
  731. package/scripts/run/review/run-review.ts +2 -1
  732. package/scripts/run/run-ending.ts +1 -0
  733. package/scripts/run/run-invocation.ts +5 -6
  734. package/scripts/run/run-liveness-cli.ts +6 -8
  735. package/scripts/run/run-liveness.ts +61 -30
  736. package/scripts/run/run-next.ts +1 -1
  737. package/scripts/run/run-parent-cut-hook.ts +2 -2
  738. package/scripts/run/run-poll-hook.ts +157 -0
  739. package/scripts/run/run-preflight.ts +18 -3
  740. package/scripts/run/run-prep-cli.ts +1 -10
  741. package/scripts/run/run-prep-locate.ts +7 -50
  742. package/scripts/run/run-prep-main.ts +12 -0
  743. package/scripts/run/run-prep.ts +6 -0
  744. package/scripts/run/run-report-cli.ts +101 -13
  745. package/scripts/run/run-report-handoff.ts +114 -0
  746. package/scripts/run/run-step-cli.ts +22 -15
  747. package/scripts/run/run-step-section.ts +85 -0
  748. package/scripts/run/run-step.ts +1 -1
  749. package/scripts/run/run-stranded-detect.ts +13 -0
  750. package/scripts/run/run-watcher-guard-cli.ts +1 -1
  751. package/scripts/run/run-watcher-guard.ts +1 -1
  752. package/scripts/run/ship/run-ship-args.ts +121 -0
  753. package/scripts/run/ship/run-ship-body-draft.ts +110 -0
  754. package/scripts/run/ship/run-ship-cli.ts +67 -151
  755. package/scripts/run/ship/run-ship-detach.ts +27 -7
  756. package/scripts/run/ship/run-ship-infra-retry.ts +59 -0
  757. package/scripts/run/ship/run-ship-next.ts +27 -3
  758. package/scripts/run/ship/run-ship-overlap.ts +232 -0
  759. package/scripts/run/ship/run-ship-place.ts +96 -0
  760. package/scripts/run/ship/run-ship-pre-detach-timed.ts +43 -0
  761. package/scripts/run/ship/run-ship-pre-detach.ts +102 -27
  762. package/scripts/run/ship/run-ship-preflight.ts +161 -30
  763. package/scripts/run/ship/run-ship-probe.ts +11 -3
  764. package/scripts/run/ship/run-ship-relaunch-cap.ts +70 -0
  765. package/scripts/run/ship/run-ship-removed-rows.ts +61 -0
  766. package/scripts/run/ship/run-ship-return.ts +123 -15
  767. package/scripts/run/ship/run-ship-review-steps.ts +105 -149
  768. package/scripts/run/ship/run-ship-review.ts +73 -6
  769. package/scripts/run/ship/run-ship-reviewer.ts +207 -0
  770. package/scripts/run/ship/run-ship-stage.ts +55 -6
  771. package/scripts/run/ship/run-ship-steps.ts +46 -15
  772. package/scripts/run/ship/run-ship-stop-cause.ts +135 -0
  773. package/scripts/run/ship/run-ship-stop-context.ts +206 -0
  774. package/scripts/run/ship/run-ship-stop-text.ts +11 -6
  775. package/scripts/run/ship/run-ship-sync.ts +57 -12
  776. package/scripts/run/ship/run-ship.ts +30 -2
  777. package/scripts/run/tidy/run-tidy-cli.ts +0 -4
  778. package/scripts/run/tidy/run-tidy-lanes.ts +3 -0
  779. package/scripts/run/tidy/run-tidy-main.ts +8 -0
  780. package/scripts/run/wake/run-wake-cli.ts +119 -100
  781. package/scripts/run/wake/run-wake-code.ts +83 -0
  782. package/scripts/run/wake/run-wake-driver.ts +19 -8
  783. package/scripts/run/wake/run-wake-loop.ts +34 -3
  784. package/scripts/run/wake/run-wake-main.ts +13 -0
  785. package/scripts/run/wake/run-wake-ports.ts +90 -0
  786. package/scripts/run/wake/run-wake-takeover.ts +66 -0
  787. package/scripts/run/wake/run-wake.ts +2 -1
  788. package/scripts/safe-chain/pack-hook.ts +2 -2
  789. package/scripts/safe-chain/preinstall-command.ts +2 -1
  790. package/scripts/safe-chain/project-config.ts +3 -9
  791. package/scripts/security/security-audit-main.ts +8 -0
  792. package/scripts/security/security-audit-provision-logic.ts +0 -11
  793. package/scripts/security/security-audit-provision-main.ts +12 -0
  794. package/scripts/security/security-audit-provision.ts +11 -26
  795. package/scripts/security/security-audit.ts +6 -7
  796. package/scripts/self-sync-guard/self-sync-guard-logic.ts +6 -13
  797. package/scripts/split/split-assess-cli.ts +2 -2
  798. package/scripts/split/split-assess.ts +15 -0
  799. package/scripts/split/split-measure.ts +65 -0
  800. package/scripts/sync/claude-settings-merge.ts +8 -15
  801. package/scripts/sync/directory-copy-guard.ts +4 -9
  802. package/scripts/sync/file-content.ts +78 -8
  803. package/scripts/sync/sync-ai-files.ts +3 -5
  804. package/scripts/sync/sync-configs.ts +11 -23
  805. package/scripts/sync/sync-hook-safety.ts +4 -10
  806. package/scripts/sync/sync-main.ts +11 -0
  807. package/scripts/sync/sync.ts +25 -37
  808. package/scripts/test/test-declared-changed.ts +2 -2
  809. package/scripts/test/test-declared.ts +1 -1
  810. package/scripts/test/test-e2e-guard.ts +55 -6
  811. package/scripts/test/test-e2e-stamp.ts +38 -0
  812. package/scripts/test/test-pinned-logic.ts +145 -0
  813. package/scripts/test/test-pinned-main.ts +78 -0
  814. package/scripts/test/test-pinned.ts +100 -0
  815. package/scripts/test/test-read-map.ts +264 -0
  816. package/scripts/test/test-read-recording.ts +91 -0
  817. package/scripts/test/test-read-trace.ts +148 -0
  818. package/scripts/test/test-red-main.ts +12 -0
  819. package/scripts/test/test-red.ts +12 -30
  820. package/scripts/test/test-related-main.ts +18 -0
  821. package/scripts/test/test-related-record.ts +119 -0
  822. package/scripts/test/test-related-scope.ts +229 -43
  823. package/scripts/test/test-related.ts +300 -22
  824. package/scripts/test/test-unit-guard-main.ts +15 -0
  825. package/scripts/test/test-unit-guard.ts +54 -21
  826. package/scripts/test/unit-count-file.ts +37 -0
  827. package/scripts/test/unit-run-marker.ts +162 -0
  828. package/scripts/test/unit-setup-files.ts +51 -0
  829. package/scripts/test/unit-worker-share.ts +71 -137
  830. package/scripts/test/whole-suite-files.ts +63 -0
  831. package/scripts/time-runtime/time-background.ts +20 -2
  832. package/scripts/time-runtime/time-bundles.ts +4 -3
  833. package/scripts/time-runtime/time-density-hook.ts +8 -6
  834. package/scripts/time-runtime/time-followup-stage.ts +1 -3
  835. package/scripts/time-runtime/time-format.ts +5 -28
  836. package/scripts/time-runtime/time-markers.ts +10 -1
  837. package/scripts/time-runtime/time-shell.ts +126 -14
  838. package/scripts/time-runtime/time-spans.ts +1 -0
  839. package/scripts/time-runtime/time-tool-call.ts +7 -0
  840. package/scripts/time-runtime/time-transcript-line.ts +49 -62
  841. package/scripts/uninstall/uninstall.ts +1 -1
  842. package/scripts/version/bump-version-main.ts +12 -0
  843. package/scripts/version/bump-version.ts +25 -25
  844. package/scripts/version/effective-upstream.ts +6 -12
  845. package/scripts/version/latest-corepack.ts +17 -32
  846. package/scripts/version/latest-if-required-cli.ts +93 -0
  847. package/scripts/version/latest-lane-guard-main.ts +8 -0
  848. package/scripts/version/latest-lane-guard.ts +0 -4
  849. package/scripts/version/latest-scope-cli.ts +0 -9
  850. package/scripts/version/latest-scope-main.ts +12 -0
  851. package/scripts/version/latest-update.ts +5 -5
  852. package/scripts/version/npm-registry.ts +44 -6
  853. package/scripts/version/publishable-range-check.ts +5 -16
  854. package/scripts/version/release-age.ts +1 -1
  855. package/scripts/version/release-hold.ts +1 -1
  856. package/scripts/version/release-window.ts +38 -0
  857. package/scripts/version/running-binary.ts +1 -1
  858. package/scripts/version/safe-chain-version-update.ts +3 -8
  859. package/scripts/version/version-targets.ts +6 -28
  860. package/templates/dependabot.yml +29 -0
  861. package/templates/gitignore +10 -3
  862. package/templates/pnpm-workspace.basic.yaml +1 -1
  863. package/templates/sonar-project.properties +3 -2
  864. package/templates/workflows/ci.yml +12 -4
  865. package/templates/workflows/github-release.yml +4 -0
  866. package/tsconfig.sonar.json +1 -1
  867. package/.ncurc.json +0 -3
  868. package/dist/hooks/batch-guard.js +0 -29
  869. package/dist/hooks/chunk-43ZHT22P.js +0 -3495
  870. package/dist/hooks/chunk-CDY4NFQG.js +0 -15
  871. package/dist/hooks/chunk-EUMACUK2.js +0 -2038
  872. package/dist/hooks/chunk-H5HVWYXK.js +0 -359
  873. package/dist/hooks/chunk-IIGFYXKC.js +0 -7104
  874. package/dist/hooks/chunk-IX6TTTI6.js +0 -95
  875. package/dist/hooks/chunk-J47HU5H5.js +0 -237
  876. package/dist/hooks/chunk-K4EOONYM.js +0 -45
  877. package/dist/hooks/chunk-K4LMBQC2.js +0 -68
  878. package/dist/hooks/chunk-SHGPANFB.js +0 -56
  879. package/dist/hooks/chunk-YHBZAJSV.js +0 -79
  880. package/dist/hooks/chunk-YYPI7SJZ.js +0 -131
  881. package/dist/hooks/duplicate-read-guard.js +0 -30
  882. package/dist/hooks/investigation-guard.js +0 -32
  883. package/scripts/backlog/backlog-stalled-cli.ts +0 -30
  884. package/scripts/cost-runtime/cost-format.ts +0 -29
  885. package/scripts/init/basic-path-migration.ts +0 -24
  886. package/scripts/issue/issue-backlinks-cli.ts +0 -93
  887. package/scripts/josh/josh-commands-guard.ts +0 -38
  888. package/scripts/lint/cross-file-recheck.ts +0 -155
  889. package/scripts/registry-migration/migrate-logic.ts +0 -237
  890. package/scripts/registry-migration/migrate.ts +0 -292
  891. package/scripts/registry-migration/user-npmrc.ts +0 -15
  892. package/scripts/rules/rule-guard.ts +0 -23
  893. package/scripts/rules/rule-registry-rows.ts +0 -282
  894. package/scripts/rules/rule-registry.ts +0 -109
  895. package/scripts/run/run-stranded-cli.ts +0 -27
@@ -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 }
@@ -0,0 +1,67 @@
1
+ import { json_value } from '#scripts/lib/json-value'
2
+ import type { GuardedCall } from '#scripts/time-runtime/time-batch-guard'
3
+
4
+ // A `general-purpose` subagent dispatched without a `model` is refused until it names one
5
+ // (joshuafolkken/kit#3927).
6
+ //
7
+ // **The omission is the cost, not the dispatch.** A subagent with no `model` inherits the parent's,
8
+ // so a routine unit runs on the main line's model — measured at 94 such dispatches on Opus. A named
9
+ // agent type carries its own `model` in its definition, so only the catch-all type is in scope; an
10
+ // absent `subagent_type` is that type, the harness's default.
11
+ //
12
+ // **It fires on every occurrence**: the remedy is one field on the same call, so a refusal costs one
13
+ // round trip and never wedges the run.
14
+
15
+ // Both spellings of the subagent tool are in use: `Task` (published) and `Agent` (this harness).
16
+ const SUBAGENT_TOOLS: ReadonlySet<string> = new Set(['Agent', 'Task'])
17
+ const GENERAL_PURPOSE = 'general-purpose'
18
+
19
+ // A dispatch of the catch-all type — the one whose model is otherwise inherited.
20
+ function is_general_purpose(call: GuardedCall): boolean {
21
+ if (!SUBAGENT_TOOLS.has(call.name) || !json_value.is_record(call.input)) return false
22
+
23
+ const type = call.input['subagent_type']
24
+
25
+ return type === undefined || type === GENERAL_PURPOSE
26
+ }
27
+
28
+ function names_model(call: GuardedCall): boolean {
29
+ const model = json_value.is_record(call.input) ? call.input['model'] : undefined
30
+
31
+ return typeof model === 'string' && model.length > 0
32
+ }
33
+
34
+ function is_unnamed_model(call: GuardedCall): boolean {
35
+ return is_general_purpose(call) && !names_model(call)
36
+ }
37
+
38
+ function keeps_model(call: GuardedCall): boolean {
39
+ return is_general_purpose(call) && names_model(call)
40
+ }
41
+
42
+ const AGENT_MODEL_REASON =
43
+ '⛔ agent model: a `general-purpose` subagent with no `model` inherits the parent model. ' +
44
+ 'Reissue the call with `model` set — `sonnet` for routine work, `opus` for judgment such as a review. ' +
45
+ 'It fires on every occurrence (`.claude/skills/workflow-commands/delegation.md`).'
46
+
47
+ // `reaches` is every catch-all dispatch, so `rule-value.ts` scores the named-model ones against it.
48
+ const ROW = {
49
+ id: 'agent-model',
50
+ is_trigger: is_unnamed_model,
51
+ reason: AGENT_MODEL_REASON,
52
+ decide: (): boolean => true,
53
+ keeps: keeps_model,
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
+ },
63
+ }
64
+
65
+ const agent_model = { AGENT_MODEL_REASON, ROW, is_unnamed_model }
66
+
67
+ export { agent_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
  {
@@ -2,8 +2,10 @@ import { investigation_reads } from '#scripts/delegation/investigation-reads'
2
2
  import { hook_decision, type GuardRun, type TranscriptGuardSpec } from '#scripts/josh/hook-decision'
3
3
  import { lane_guard_policy } from '#scripts/lane/lane-guard-policy'
4
4
  import { time_batch_guard, type GuardedCall } from '#scripts/time-runtime/time-batch-guard'
5
+ import { agent_model } from './agent-model'
5
6
  import { bash_triggers } from './bash-triggers'
6
7
  import { direct_filing } from './direct-filing'
8
+ import { direct_issue_comment } from './direct-issue-comment'
7
9
  import { early_heartbeat } from './early-heartbeat'
8
10
  import { file_body } from './file-body'
9
11
  import { filing_cap } from './filing-cap'
@@ -13,6 +15,7 @@ import { issue_comments } from './issue-comments'
13
15
  import { josh_git_bare } from './josh-git-bare'
14
16
  import { lane_background } from './lane-background'
15
17
  import { lane_carry_conflict } from './lane-carry-conflict'
18
+ import { lane_direct_tool } from './lane-direct-tool'
16
19
  import { lane_interactive_ask } from './lane-interactive-ask'
17
20
  import { lane_park } from './lane-park'
18
21
  import { lane_split_park } from './lane-split-park'
@@ -28,6 +31,7 @@ import { run_tail_rule } from './run-tail-rule'
28
31
  import { shell_body_trigger } from './shell-body-trigger'
29
32
  import { test_declared_commit } from './test-declared-commit'
30
33
  import { third_party_write } from './third-party-write'
34
+ import { timed_rerun } from './timed-rerun'
31
35
  import { worktree_guard } from './worktree-guard'
32
36
 
33
37
  // The rules delivered by a `PreToolUse` refusal at the moment they bind, rather than carried resident
@@ -46,12 +50,32 @@ type CallTest = (
46
50
  run: ReadonlyArray<GuardedCall>,
47
51
  ) => boolean
48
52
 
53
+ // The tail is read lazily: most calls no rewrite applies to never need it.
54
+ type CallRewrite = (call: GuardedCall, tail: () => string) => Record<string, unknown> | undefined
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
+
49
72
  // `id` keys the rule's own refusal record, so one rule firing never spends another's budget.
50
73
  interface DeliveredRule {
51
74
  id: string
52
75
  is_trigger: (call: GuardedCall) => boolean
53
76
  // The only text that reaches the model: the instruction and the pointer.
54
77
  reason: string
78
+ about: RuleAbout
55
79
  // A stand-down when an earlier act on the tail already satisfied the rule; checked first, so a
56
80
  // satisfied call spends no record.
57
81
  already_satisfied?: (tail: string, call: GuardedCall) => boolean
@@ -63,6 +87,9 @@ interface DeliveredRule {
63
87
  // The occasion the rule governs, for a row whose trigger is the violation itself (else `is_trigger`
64
88
  // would only count runs that broke it).
65
89
  reaches?: CallTest
90
+ // The call made right, for a row `guard-remedy.ts` classes as a rewrite: `rule-rewrite.ts` runs it
91
+ // in place of the refusal. `undefined` where this call has no mechanical fix, so it is refused.
92
+ rewrite?: CallRewrite
66
93
  // The note a hook attaches where it rewrites a violating call instead of refusing it, so
67
94
  // `rule-value.ts` counts the rewrite as this row's delivery.
68
95
  rewrite_note?: string
@@ -71,7 +98,7 @@ interface DeliveredRule {
71
98
  former_reasons?: ReadonlyArray<string>
72
99
  }
73
100
 
74
- // 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`
75
102
  // would refuse one violation twice — so `is_trigger` is optional here.
76
103
  type MeasuredRule = Omit<DeliveredRule, 'is_trigger'> & {
77
104
  is_trigger?: DeliveredRule['is_trigger']
@@ -91,6 +118,9 @@ const DELIVERED_RULES: ReadonlyArray<DeliveredRule> = [
91
118
  // The direct call only; `filing-cap` below triggers on `issue:file`. The WIP cap and the fold
92
119
  // question are `issue:file`'s own steps, so no row gates them.
93
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,
94
124
  filing_cap.ROW,
95
125
  issue_comments.ROW,
96
126
  {
@@ -99,6 +129,13 @@ const DELIVERED_RULES: ReadonlyArray<DeliveredRule> = [
99
129
  reason: SHELL_BODY_REASON,
100
130
  keeps: on_bash_command(keeps_body_safe),
101
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
+ },
102
139
  },
103
140
  raw_field_body.ROW,
104
141
  {
@@ -107,8 +144,16 @@ const DELIVERED_RULES: ReadonlyArray<DeliveredRule> = [
107
144
  reason: piped_verification.PIPED_VERIFICATION_REASON,
108
145
  keeps: on_bash_command(piped_verification.keeps_verdict_intact),
109
146
  reaches: on_bash_command(piped_verification.runs_verification),
110
- // A `| tail` / `| grep` masking is rewritten under `pipefail` by `pretool-guard.ts`, never refused.
147
+ // A masking whose filter reads to the end is rewritten under `pipefail`, never refused.
148
+ rewrite: piped_verification.pipefail_input,
111
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
+ },
112
157
  },
113
158
  {
114
159
  id: 'early-heartbeat',
@@ -117,6 +162,14 @@ const DELIVERED_RULES: ReadonlyArray<DeliveredRule> = [
117
162
  decide: early_heartbeat.decide,
118
163
  keeps: on_bash_command(early_heartbeat.is_progress_watch),
119
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
+ },
120
173
  },
121
174
  // Before `run-tail`: whether to commit at all is decided before how to push.
122
175
  test_declared_commit.ROW,
@@ -130,6 +183,13 @@ const DELIVERED_RULES: ReadonlyArray<DeliveredRule> = [
130
183
  decide: run_tail_rule.decide,
131
184
  keeps: run_tail_rule.is_backgrounded_push_step,
132
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
+ },
133
193
  },
134
194
  // Reads the lane name and the cut record. Once per run, not `decide`: taking the cut ends the
135
195
  // process, and the verdicts that leave a run at the gate all need the reissue through. `reaches`
@@ -141,13 +201,25 @@ const DELIVERED_RULES: ReadonlyArray<DeliveredRule> = [
141
201
  reason: pre_gate_cut.PRE_GATE_CUT_REASON,
142
202
  keeps: on_bash_command(pre_gate_cut.takes_the_cut),
143
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
+ },
144
211
  },
145
212
  // A split child's park is refused before `lane-park` sees it.
146
213
  lane_split_park.ROW,
147
214
  lane_park.ROW,
148
215
  lane_interactive_ask.ROW,
216
+ agent_model.ROW,
149
217
  lane_carry_conflict.ROW,
150
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,
151
223
  // Disjoint from `run-tail` by the `-y` flag.
152
224
  josh_git_bare.ROW,
153
225
  // The Bash-string gaps the deny glob cannot express, read by argv; `delivered-rules-bash.test.ts`
@@ -177,6 +249,13 @@ const BATCHING_RULE: MeasuredRule = {
177
249
  reason: time_batch_guard.REASON,
178
250
  keeps: batches_the_turn,
179
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
+ },
180
259
  }
181
260
 
182
261
  // No `is_trigger`, as for batching. No `keeps`: any dispatch would read as compliance, so it is left
@@ -185,6 +264,13 @@ const INVESTIGATION_RULE: MeasuredRule = {
185
264
  id: 'investigation',
186
265
  reason: investigation_reads.REASON,
187
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
+ },
188
274
  }
189
275
 
190
276
  const MEASURED_RULES: ReadonlyArray<MeasuredRule> = [
@@ -291,6 +377,7 @@ const delivered_rules = {
291
377
  PIPED_VERIFICATION_REASON: piped_verification.PIPED_VERIFICATION_REASON,
292
378
  POLL_LOOP_REASON: poll_loop.POLL_LOOP_REASON,
293
379
  PRE_GATE_CUT_REASON: pre_gate_cut.PRE_GATE_CUT_REASON,
380
+ PRETOOL_GUARD,
294
381
  RAW_FIELD_BODY_REASON: raw_field_body.RAW_FIELD_BODY_REASON,
295
382
  RUN_TAIL_REASON: run_tail_rule.RUN_TAIL_REASON,
296
383
  SHELL_BODY_REASON,
@@ -304,5 +391,5 @@ const delivered_rules = {
304
391
  is_issue_filing,
305
392
  }
306
393
 
307
- export type { DeliveredRule, MeasuredRule }
394
+ export type { CallRewrite, DeliveredRule, MeasuredRule, RuleAbout }
308
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 }