@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,117 @@
1
+ import { bash_triggers } from './bash-triggers'
2
+ import { direct_pr_create } from './direct-pr-create'
3
+ import { gh_api } from './gh-api'
4
+ import { git_argv } from './git-argv'
5
+ import { shell_segments } from './shell-segments'
6
+
7
+ // The `direct-issue-comment` row of `delivered-rules.ts`. A run's own comment has to carry
8
+ // `RUN_MARKER`, or `issue-watch-diff.ts` reads it as a person's update: the run's review then reads as
9
+ // briefed before the issue changed, and `josh followup` refuses the merge (joshuafolkken/kit#4221).
10
+ // `pnpm josh issue:comment` is the one path that writes the marker, so a hand-built `gh issue comment`
11
+ // or `gh api` write to `…/issues/<N>/comments` is refused and pointed there. It reads the argv through
12
+ // `direct-pr-create.ts`'s cut, so a quoted mention is not a call and `bash -c '…'` still is.
13
+ //
14
+ // **Only the checkout's own repository**: `issue:comment` posts there and nowhere else, so the row
15
+ // claims the spellings that target it — the `{owner}` placeholder, and `gh issue comment` with no
16
+ // repository selector. A comment to another repository named outright is left to `third-party-write`.
17
+ //
18
+ // **It fires on every occurrence**, for the reason `git-force.ts` does.
19
+
20
+ const ISSUE_GROUP = 'issue'
21
+ const COMMENT_ACTION = 'comment'
22
+ const API_SUBCOMMAND = 'api'
23
+ const REPO_SELECTOR = /^(?:-R|--repo)(?:=|$)/u
24
+ // One issue's (or pull request's — REST serves both as issues) comment collection. Anchored on the
25
+ // whole endpoint argument, so `…/issues/comments/<id>` and a listing elsewhere are not read as it. The
26
+ // number is any one segment, so `issues/$N/comments` is seen as well.
27
+ const SEGMENT = String.raw`[^/\s'"]+`
28
+ const QUOTE = `['"]?`
29
+ const API_ORIGIN = String.raw`(?:https://api\.github\.com)?/?`
30
+ const COMMENTS_PATH = new RegExp(
31
+ `^${QUOTE}${API_ORIGIN}repos/${SEGMENT}/${SEGMENT}/issues/${SEGMENT}/comments/?${QUOTE}$`,
32
+ 'u',
33
+ )
34
+
35
+ function is_comment_cli_call(args: ReadonlyArray<string>): boolean {
36
+ if (args.some((argument) => REPO_SELECTOR.test(argument))) return false
37
+
38
+ const [group, action] = direct_pr_create.positional_words(
39
+ args,
40
+ direct_pr_create.VALUE_TAKING_FLAGS,
41
+ )
42
+
43
+ return group === ISSUE_GROUP && action === COMMENT_ACTION
44
+ }
45
+
46
+ function is_own_comments_endpoint(endpoint: string): boolean {
47
+ const owner = gh_api.repo_target(endpoint)?.owner ?? ''
48
+
49
+ return gh_api.is_owner_placeholder(owner) && COMMENTS_PATH.test(endpoint)
50
+ }
51
+
52
+ function is_comment_api_call(args: ReadonlyArray<string>): boolean {
53
+ const call = [direct_pr_create.GH_COMMAND, ...args].join(' ')
54
+
55
+ if (!gh_api.is_gh_api(call) || !gh_api.is_write(call)) return false
56
+
57
+ const [subcommand, endpoint = ''] = direct_pr_create.positional_words(
58
+ args,
59
+ direct_pr_create.API_VALUE_TAKING_FLAGS,
60
+ )
61
+
62
+ return subcommand === API_SUBCOMMAND && is_own_comments_endpoint(endpoint)
63
+ }
64
+
65
+ function is_comment_segment(segment: string): boolean {
66
+ const args = git_argv.arguments_of(segment, direct_pr_create.GH_COMMAND)
67
+
68
+ if (args === undefined || direct_pr_create.is_help_call(args)) return false
69
+
70
+ return is_comment_cli_call(args) || is_comment_api_call(args)
71
+ }
72
+
73
+ function is_direct_issue_comment(command: string): boolean {
74
+ return direct_pr_create.has_run_segment(command, is_comment_segment)
75
+ }
76
+
77
+ // `pnpm josh issue:comment` — the act that keeps the rule, segment-wise so a spelling quoted inside
78
+ // another command's body is not read as one.
79
+ const COMMENT_NAMES: ReadonlySet<string> = new Set(['issue:comment'])
80
+
81
+ function is_josh_comment(command: string): boolean {
82
+ return shell_segments
83
+ .segments_of(command)
84
+ .some((segment) => shell_segments.is_josh_command(segment, COMMENT_NAMES))
85
+ }
86
+
87
+ function is_any_comment(command: string): boolean {
88
+ return is_direct_issue_comment(command) || is_josh_comment(command)
89
+ }
90
+
91
+ const DIRECT_ISSUE_COMMENT_REASON =
92
+ '⛔ direct issue comment: `gh issue comment` (or a `gh api` write to `…/issues/<N>/comments`) posts ' +
93
+ 'without the run marker, so the run reads its own comment as a person updating the issue — the ' +
94
+ 'review goes stale and `pnpm josh followup` refuses the merge. Post with ' +
95
+ '`pnpm josh issue:comment <N> --body-file <path>` instead (`shell-body.md`). ' +
96
+ '**This rule fires on every occurrence, not once per run.**'
97
+
98
+ const ROW = {
99
+ id: 'direct-issue-comment',
100
+ is_trigger: bash_triggers.on_bash_command(is_direct_issue_comment),
101
+ reason: DIRECT_ISSUE_COMMENT_REASON,
102
+ decide: (): boolean => true,
103
+ keeps: bash_triggers.on_bash_command(is_josh_comment),
104
+ reaches: bash_triggers.on_bash_command(is_any_comment),
105
+ about: {
106
+ title: 'Direct issue comment',
107
+ topic: '`shell-body.md`',
108
+ fires:
109
+ "a comment to the checkout's own repository outside `josh issue:comment` (`gh issue comment` with no `--repo`, or a `gh api` write to `repos/{owner}/<r>/issues/<N>/comments`); it points at `pnpm josh issue:comment`. Every occurrence",
110
+ quiet:
111
+ '`pnpm josh issue:comment`, or reading the comments — the path that writes the run marker',
112
+ },
113
+ }
114
+
115
+ const direct_issue_comment = { DIRECT_ISSUE_COMMENT_REASON, ROW, is_direct_issue_comment }
116
+
117
+ export { direct_issue_comment }
@@ -17,6 +17,7 @@ const PR_GROUP = 'pr'
17
17
  // `new` is gh's own alias for `pr create`.
18
18
  const PR_CREATE_ACTIONS: ReadonlySet<string> = new Set(['create', 'new'])
19
19
  const FLAG_PREFIX = '-'
20
+ const HELP_FLAGS: ReadonlySet<string> = new Set(['-h', '--help'])
20
21
  // The repository selector gh accepts before `pr` or between `pr` and its action; with no `=` it
21
22
  // swallows the next word, so that word is not read as the group or the action.
22
23
  const VALUE_TAKING_FLAGS: ReadonlySet<string> = new Set(['-R', '--repo'])
@@ -80,16 +81,64 @@ function is_pr_create_cli_call(args: ReadonlyArray<string>): boolean {
80
81
  return group === PR_GROUP && PR_CREATE_ACTIONS.has(action)
81
82
  }
82
83
 
84
+ // A help call prints the usage and creates nothing. A help flag right after another flag may be that
85
+ // flag's value (`--title -h`), so it is not read as one — a boolean flag before it errs toward refusal.
86
+ function is_help_call(args: ReadonlyArray<string>): boolean {
87
+ return args.some(
88
+ (argument, index) =>
89
+ HELP_FLAGS.has(argument) && !(args[index - 1] ?? '').startsWith(FLAG_PREFIX),
90
+ )
91
+ }
92
+
83
93
  function is_pr_create_segment(segment: string): boolean {
84
94
  const args = git_argv.arguments_of(segment, GH_COMMAND)
85
95
 
86
- if (args === undefined) return false
96
+ if (args === undefined || is_help_call(args)) return false
87
97
 
88
98
  return is_pr_create_cli_call(args) || is_pr_create_api_call(args)
89
99
  }
90
100
 
101
+ // Quoted text the shell still runs: a command substitution, or the string `sh -c` (its `-c` alone or
102
+ // in a cluster such as `-lc`, after any other flags), `ssh` or `eval` executes. `ssh` and `eval` count
103
+ // only as the segment's program, so `grep -E "ssh|gh pr create"` stays one quoted pattern.
104
+ const RUNS_QUOTED_TEXT = /\$\(|`/u
105
+ const QUOTED_TEXT_RUNNERS: ReadonlySet<string> = new Set(['ssh', 'eval'])
106
+ const SHELL_DASH_C = /\b(?:ba|da|k|z)?sh\s+(?:-\S+\s+)*-[A-Za-z]*c\b/u
107
+ // A `#` comment hides its apostrophe from the shell but not from the quote pairing, so a multi-line
108
+ // segment holding one may be lines the pairing joined (`# don't` … `'`) rather than one quoted span.
109
+ const COMMENT_MARKER = /(?:^|\s)#/mu
110
+ const LINE_BREAK = '\n'
111
+
112
+ function is_run_by_shell(segment: string): boolean {
113
+ if (RUNS_QUOTED_TEXT.test(segment) || SHELL_DASH_C.test(segment)) return true
114
+
115
+ return QUOTED_TEXT_RUNNERS.has(git_argv.program_of(segment)?.name ?? '')
116
+ }
117
+
118
+ function is_runs_quoted_text(segment: string): boolean {
119
+ if (is_run_by_shell(segment)) return true
120
+
121
+ return segment.includes(LINE_BREAK) && COMMENT_MARKER.test(segment)
122
+ }
123
+
124
+ // A segment whose quotes still run keeps the plain cut, so `bash -c 'git push && gh pr create --fill'`
125
+ // is refused as it was before the quote-aware cut.
126
+ function judged_segments(segment: string): Array<string> {
127
+ return is_runs_quoted_text(segment) ? shell_segments.commands_of(segment) : [segment]
128
+ }
129
+
130
+ // The cut is quote-aware, so `grep -E "a|gh pr create|b"` stays one `grep` call rather than yielding
131
+ // a `gh pr create` segment from inside its pattern (joshuafolkken/kit#4091). Shared with the
132
+ // `direct-issue-comment` row, which judges a `gh` call by the same cut.
133
+ function has_run_segment(command: string, is_match: (segment: string) => boolean): boolean {
134
+ return shell_segments
135
+ .quote_aware_commands_of(command)
136
+ .flatMap((segment) => judged_segments(segment))
137
+ .some((segment) => is_match(segment))
138
+ }
139
+
91
140
  function is_direct_pr_create(command: string): boolean {
92
- return shell_segments.segments_of(command).some((segment) => is_pr_create_segment(segment))
141
+ return has_run_segment(command, is_pr_create_segment)
93
142
  }
94
143
 
95
144
  const DIRECT_PR_CREATE_REASON =
@@ -103,8 +152,25 @@ const ROW = {
103
152
  is_trigger: bash_triggers.on_bash_command(is_direct_pr_create),
104
153
  reason: DIRECT_PR_CREATE_REASON,
105
154
  decide: (): boolean => true,
155
+ about: {
156
+ title: 'Direct PR creation',
157
+ topic: '`CLAUDE.md` → Git Rules',
158
+ fires:
159
+ '`gh pr create`, or a `gh api` write to `repos/<o>/<r>/pulls`; it points at `pnpm josh pr`. Every occurrence',
160
+ quiet: '`pnpm josh pr`, or reading a PR — the path that writes `closes #N`',
161
+ },
106
162
  }
107
163
 
108
- const direct_pr_create = { DIRECT_PR_CREATE_REASON, ROW, is_direct_pr_create }
164
+ const direct_pr_create = {
165
+ API_VALUE_TAKING_FLAGS,
166
+ DIRECT_PR_CREATE_REASON,
167
+ GH_COMMAND,
168
+ ROW,
169
+ VALUE_TAKING_FLAGS,
170
+ has_run_segment,
171
+ is_direct_pr_create,
172
+ is_help_call,
173
+ positional_words,
174
+ }
109
175
 
110
176
  export { direct_pr_create }
@@ -1,4 +1,5 @@
1
1
  import { hook_decision, type GuardRun } from '#scripts/josh/hook-decision'
2
+ import { MS_PER_SECOND } from '#scripts/lib/timeouts'
2
3
  import { run_progress } from '#scripts/run/progress/run-progress'
3
4
  import { run_progress_clock } from '#scripts/run/progress/run-progress-clock'
4
5
  import { run_progress_config } from '#scripts/run/progress/run-progress-config'
@@ -105,7 +106,7 @@ function wait_duration_ms(command: string): number {
105
106
  NO_SECONDS,
106
107
  )
107
108
 
108
- return seconds * run_progress.MS_PER_SECOND
109
+ return seconds * MS_PER_SECOND
109
110
  }
110
111
 
111
112
  function is_armed(target: string, now_ms: number): boolean {
@@ -184,6 +184,13 @@ const ROW = {
184
184
  is_trigger: bash_triggers.on_bash_command((command: string) => carries_a_file_body(command)),
185
185
  reason: FILE_BODY_REASON,
186
186
  decide: (): boolean => true,
187
+ about: {
188
+ title: 'No file body on the shell',
189
+ topic: '`file-edits.md`',
190
+ fires:
191
+ 'a heredoc write to an existing file, a writing `node -e` / interpreter heredoc, or `perl -0pi -e`. Every occurrence',
192
+ quiet: 'a new file, a read-only heredoc, or a short `sed -i`',
193
+ },
187
194
  }
188
195
 
189
196
  const file_body = {
@@ -117,6 +117,13 @@ const ROW = {
117
117
  is_trigger: bash_triggers.on_bash_command(bash_triggers.is_issue_filing),
118
118
  reason: FILING_CAP_REASON,
119
119
  decide,
120
+ about: {
121
+ title: 'The 10-Issue filing cap per run',
122
+ topic: '`.claude/skills/workflow-commands/prerequisite.md`, `observation-filing.md`',
123
+ fires:
124
+ 'the 11th `pnpm josh issue:file` in a run that already has 10 filings not refused; failed calls do not count. Every occurrence',
125
+ quiet: 'fewer than 10 filings not refused',
126
+ },
120
127
  }
121
128
 
122
129
  const filing_cap = {
@@ -13,8 +13,9 @@
13
13
 
14
14
  // The wrapper words that may stand in front of `git`, the same ones `run-tail-rule.ts` skips in front of
15
15
  // `josh`: environment assignments, the package-manager launchers, `sudo`, `env`, and an opening
16
- // subshell parenthesis. Left in, `sudo git push --force`, `env git commit` and `(git push -f)` are
17
- // silently not a git command.
16
+ // subshell parenthesis — plus `time` with its flags, read here only. Left in, `sudo git push --force`,
17
+ // `env git commit` and `(git push -f)` are silently not a git command, and
18
+ // `/usr/bin/time -p pnpm exec eslint .` is not an `eslint` run (joshuafolkken/kit#4356).
18
19
  const ENV_ASSIGNMENT = /^[A-Za-z_]\w*=/u
19
20
  const WRAPPER_WORDS: ReadonlySet<string> = new Set([
20
21
  'pnpm',
@@ -24,7 +25,13 @@ const WRAPPER_WORDS: ReadonlySet<string> = new Set([
24
25
  'sudo',
25
26
  'command',
26
27
  'env',
28
+ 'time',
27
29
  ])
30
+ // The wrappers whose own flags stand between them and the program (`time -p`), skipped with them.
31
+ const FLAGGED_WRAPPERS: ReadonlySet<string> = new Set(['time'])
32
+ // Their flags that consume a separate following value (`time -o <file>`, `time -f <format>`), so the
33
+ // value is not read as the program.
34
+ const WRAPPER_VALUE_FLAGS: ReadonlySet<string> = new Set(['-o', '-f', '--output', '--format'])
28
35
  const SUBSHELL_OPEN = '('
29
36
 
30
37
  // The git global options that consume a **separate** following token as their value, so the parser
@@ -50,18 +57,50 @@ interface GitCall {
50
57
  args: ReadonlyArray<string>
51
58
  }
52
59
 
53
- // Split on whitespace alone. A refspec such as `:branch` and a short cluster such as `-uf` are single
54
- // tokens with no inner spaces, and neither force detection nor stash detection needs to look inside a
55
- // quoted argument — the one place a quote matters (a commit message) belongs to a subcommand neither
56
- // caller judges.
57
- const WHITESPACE = /\s+/u
60
+ // Split on whitespace outside quotes, keeping each quote in its word. A quoted span is one word, so
61
+ // `c='x; gh pr create'` is one environment assignment rather than an assignment followed by a `gh`
62
+ // call (joshuafolkken/kit#4091); a backslash-escaped character outside quotes opens no span, and a
63
+ // quote left unclosed is read as a plain character.
64
+ const WORD = /(?:\\.|'[^']*'|"(?:\\.|[^"\\])*"|\S)+/gsu
58
65
 
59
66
  function words_of(segment: string): Array<string> {
60
- return segment.split(WHITESPACE).filter((word) => word !== '')
67
+ return segment.match(WORD) ?? []
68
+ }
69
+
70
+ const PATH_SEPARATOR = '/'
71
+
72
+ // The program a word launches, read off the path's last component, so `/usr/bin/git` is `git`.
73
+ function program_name(word: string): string {
74
+ return word.slice(word.lastIndexOf(PATH_SEPARATOR) + NEXT)
61
75
  }
62
76
 
63
77
  function is_wrapper_token(word: string): boolean {
64
- return word === SUBSHELL_OPEN || ENV_ASSIGNMENT.test(word) || WRAPPER_WORDS.has(word)
78
+ return (
79
+ word === SUBSHELL_OPEN || ENV_ASSIGNMENT.test(word) || WRAPPER_WORDS.has(program_name(word))
80
+ )
81
+ }
82
+
83
+ // The words a flagged wrapper's flag spans, its value included; 0 when the word is not a flag.
84
+ function wrapper_flag_width(word = ''): number {
85
+ if (!word.startsWith(FLAG_PREFIX)) return 0
86
+
87
+ return WRAPPER_VALUE_FLAGS.has(word) ? AFTER_VALUE : NEXT
88
+ }
89
+
90
+ // The index after the wrapper word at `index`, past its own flags when it is a flagged wrapper.
91
+ function after_wrapper_word(words: ReadonlyArray<string>, index: number): number {
92
+ let next = index + NEXT
93
+
94
+ if (!FLAGGED_WRAPPERS.has(program_name(words[index] ?? ''))) return next
95
+
96
+ let width = wrapper_flag_width(words[next])
97
+
98
+ while (width > 0) {
99
+ next += width
100
+ width = wrapper_flag_width(words[next])
101
+ }
102
+
103
+ return next
65
104
  }
66
105
 
67
106
  // Skip the wrapper: environment assignments, a launcher word, and a leading subshell parenthesis. The
@@ -69,7 +108,9 @@ function is_wrapper_token(word: string): boolean {
69
108
  function after_wrapper(words: ReadonlyArray<string>): number {
70
109
  let index = 0
71
110
 
72
- while (index < words.length && is_wrapper_token(words[index] ?? '')) index += NEXT
111
+ while (index < words.length && is_wrapper_token(words[index] ?? '')) {
112
+ index = after_wrapper_word(words, index)
113
+ }
73
114
 
74
115
  return index
75
116
  }
@@ -94,14 +135,30 @@ function after_globals(words: ReadonlyArray<string>, start: number): number {
94
135
  return index
95
136
  }
96
137
 
138
+ interface ProgramCall {
139
+ name: string
140
+ args: Array<string>
141
+ }
142
+
143
+ // The program the segment launches once the wrapper is skipped, with the words after it, or
144
+ // `undefined` for a segment with no program word.
145
+ function program_of(segment: string): ProgramCall | undefined {
146
+ const words = words_of(segment)
147
+ const command_index = after_wrapper(words)
148
+ const word = words[command_index]
149
+
150
+ if (word === undefined) return undefined
151
+
152
+ return { name: program_name(word), args: words.slice(command_index + NEXT) }
153
+ }
154
+
97
155
  // The words after `command` once the wrapper is skipped, or `undefined` when the segment does not
98
156
  // invoke it. `gh` and `rm` are judged by the same wrapper cut as `git`, so
99
157
  // `env gh pr close` and `sudo rm -rf` are read as the calls they are.
100
158
  function arguments_of(segment: string, command: string): Array<string> | undefined {
101
- const words = words_of(segment)
102
- const command_index = after_wrapper(words)
159
+ const call = program_of(segment)
103
160
 
104
- return words[command_index] === command ? words.slice(command_index + NEXT) : undefined
161
+ return call?.name === command ? call.args : undefined
105
162
  }
106
163
 
107
164
  // The subcommand and the arguments after it, or `undefined` when the segment is not a git invocation.
@@ -135,6 +192,7 @@ function short_cluster_has(token: string, letters: string): boolean {
135
192
  return false
136
193
  }
137
194
 
138
- const git_argv = { arguments_of, parse, short_cluster_has }
195
+ const git_argv = { arguments_of, parse, program_of, short_cluster_has }
139
196
 
140
197
  export { git_argv }
198
+ export type { ProgramCall }
@@ -24,6 +24,9 @@ import { shell_segments } from './shell-segments'
24
24
  // deletes (`:branch`). Both open the refspec with a character the deny list cannot match as a literal.
25
25
  const FORCE_LONG_PREFIX = '--force'
26
26
  const DELETE_LONG = '--delete'
27
+ // `--mirror` force-updates every remote ref to the local set and deletes the rest; `--prune` deletes
28
+ // every remote branch with no local counterpart. Both are a delete with no refspec to read.
29
+ const DESTRUCTIVE_PUSH_LONG: ReadonlySet<string> = new Set([DELETE_LONG, '--mirror', '--prune'])
27
30
  const PUSH_SHORT_LETTERS = 'fd'
28
31
  const FORCE_OR_DELETE_REFSPEC = /^[+:]/u
29
32
 
@@ -31,7 +34,7 @@ function is_force_or_delete_push(args: ReadonlyArray<string>): boolean {
31
34
  return args.some(
32
35
  (argument) =>
33
36
  argument.startsWith(FORCE_LONG_PREFIX) ||
34
- argument === DELETE_LONG ||
37
+ DESTRUCTIVE_PUSH_LONG.has(argument) ||
35
38
  git_argv.short_cluster_has(argument, PUSH_SHORT_LETTERS) ||
36
39
  FORCE_OR_DELETE_REFSPEC.test(argument),
37
40
  )
@@ -66,7 +69,7 @@ function is_destructive_segment(segment: string): boolean {
66
69
  // quoted inside another command's argument is read as the write it is not, exactly as every other
67
70
  // trigger in this directory reads its own.
68
71
  function is_force_or_delete(command: string): boolean {
69
- return shell_segments.segments_of(command).some((segment) => is_destructive_segment(segment))
72
+ return shell_segments.commands_of(command).some((segment) => is_destructive_segment(segment))
70
73
  }
71
74
 
72
75
  // The instruction in the shape a refusal can carry: what the command does and the one route left. The
@@ -87,6 +90,13 @@ const ROW = {
87
90
  is_trigger: bash_triggers.on_bash_command(is_force_or_delete),
88
91
  reason: GIT_FORCE_REASON,
89
92
  decide: (): boolean => true,
93
+ about: {
94
+ title: 'Force push / branch delete',
95
+ topic: '`operating-rules.md`',
96
+ fires:
97
+ 'a `git push` / `git branch` read as force (`--force` / `-f` / `-uf` …) or delete (`--delete` / `-d` / `-D` / `:branch`) in any spelling. Every occurrence',
98
+ quiet: 'a plain `git push` / `git branch`',
99
+ },
90
100
  }
91
101
 
92
102
  const git_force = {
@@ -52,7 +52,9 @@ const GUARD_REMEDIES: Readonly<Record<string, GuardRemedy>> = {
52
52
  'raw-field-body': judgment('the body moves to a file the call does not name'),
53
53
  'rule-body': judgment('a trigger-plus-pointer line is written, not derived'),
54
54
  'direct-filing': judgment(ANOTHER_COMMAND),
55
+ 'direct-issue-comment': judgment(ANOTHER_COMMAND),
55
56
  'direct-pr-create': judgment(ANOTHER_COMMAND),
57
+ 'pr-merge': judgment(ANOTHER_COMMAND),
56
58
  'josh-git-bare': judgment(ANOTHER_COMMAND),
57
59
  'run-tail': judgment(ANOTHER_COMMAND),
58
60
  'pre-gate-cut': judgment(ANOTHER_COMMAND),
@@ -65,6 +67,8 @@ const GUARD_REMEDIES: Readonly<Record<string, GuardRemedy>> = {
65
67
  'agent-model': judgment("which model fits the unit is the author's call"),
66
68
  'lane-carry-conflict': judgment(ANOTHER_COMMAND),
67
69
  'lane-switch-main': judgment(ANOTHER_COMMAND),
70
+ 'lane-direct-tool': judgment(ANOTHER_COMMAND),
71
+ 'timed-rerun': judgment(ANOTHER_COMMAND),
68
72
  'oracle-consulted': judgment(ANOTHER_COMMAND),
69
73
  'test-declared': judgment(ANOTHER_COMMAND),
70
74
  batching: judgment(ANOTHER_COMMAND),
@@ -11,7 +11,7 @@ import { z } from 'zod'
11
11
  // threshold crossing rather than once per run, that read can no longer be paid on every edit, so the
12
12
  // verdict is cached beside the instant it was read and a burst of edits shares one read.
13
13
  //
14
- // **An in-memory memo cannot span two edits.** `pnpm josh rule:guard` runs as a fresh process on each
14
+ // **An in-memory memo cannot span two edits.** `pnpm josh pretool:guard` runs as a fresh process on each
15
15
  // `PreToolUse`, so the cache is a per-checkout stamp rather than a module variable — the same handoff
16
16
  // shape the refusal stamp itself uses.
17
17
  //
@@ -1,11 +1,11 @@
1
1
  import { agent_session_role } from '#scripts/agent/agent-session-role'
2
2
  import { CONTEXT_CUT_THRESHOLD } from '#scripts/cost-runtime/context-cut-threshold'
3
3
  import { cost_cli, type CostVerdict } from '#scripts/cost-runtime/cost-cli'
4
- import { cost_format } from '#scripts/cost-runtime/cost-format'
5
4
  import { cost_verdict } from '#scripts/cost-runtime/cost-verdict'
6
5
  import type { GuardRun } from '#scripts/josh/hook-decision'
7
6
  import { lane_child_marker, type MarkerSource } from '#scripts/lane/lane-child-marker'
8
7
  import { lane_paths } from '#scripts/lane/lane-paths'
8
+ import { figure_format } from '#scripts/lib/figure-format'
9
9
  import { run_cut, type RunCut } from '#scripts/run/cut/run-cut'
10
10
  import { run_cut_decline } from '#scripts/run/cut/run-cut-decline'
11
11
  import { run_cut_handoff } from '#scripts/run/cut/run-cut-handoff'
@@ -170,8 +170,8 @@ function is_over_threshold_edit(
170
170
 
171
171
  // **The threshold in the refusal text is assembled from the constant, never spelled**.
172
172
  // A spelled literal is left behind when the shared threshold moves, telling agents the wrong number;
173
- // building it from `CONTEXT_CUT_THRESHOLD` keeps the two from drifting. `cost_format.format_tokens` renders it the way every cost report does.
174
- const THRESHOLD_TEXT = `${cost_format.format_tokens(CONTEXT_CUT_THRESHOLD)}-token`
173
+ // building it from `CONTEXT_CUT_THRESHOLD` keeps the two from drifting. `figure_format.format_tokens` renders it the way every cost report does.
174
+ const THRESHOLD_TEXT = `${figure_format.format_tokens(CONTEXT_CUT_THRESHOLD)}-token`
175
175
 
176
176
  // The instruction in the shape a refusal can carry: the handoff in the format the parser reads, the
177
177
  // cut, and the one verdict that ends the turn — `cut` is the only one, so a run told merely to "take
@@ -224,6 +224,14 @@ const ROW = {
224
224
  '⛔ implementation-phase cut: this checkout is a lane dispatched',
225
225
  "⛔ implementation-phase cut: this run's context crossed the",
226
226
  ],
227
+ about: {
228
+ title: 'The implementation-phase cut',
229
+ topic:
230
+ '`.claude/skills/workflow-commands/pre-gate-cut.md` → "It is a guard, fired at the edit that crosses the threshold"',
231
+ fires:
232
+ 'an `Edit` / `Write` by an uncut lane child whose recent context is over the `pnpm josh cost --cut` threshold; it hands over `pnpm josh run:cut --impl <N> --handoff <path>`. At each threshold crossing',
233
+ quiet: 'not a lane child, a non-editing tool, already cut, or under the threshold',
234
+ },
227
235
  }
228
236
 
229
237
  const implementation_cut = {
@@ -46,7 +46,7 @@ function is_index_segment(segment: string): boolean {
46
46
  }
47
47
 
48
48
  function is_index_mutation(command: string): boolean {
49
- return shell_segments.segments_of(command).some((segment) => is_index_segment(segment))
49
+ return shell_segments.commands_of(command).some((segment) => is_index_segment(segment))
50
50
  }
51
51
 
52
52
  const INDEX_MUTATION_REASON =
@@ -61,6 +61,13 @@ const ROW = {
61
61
  is_trigger: bash_triggers.on_bash_command(is_index_mutation),
62
62
  reason: INDEX_MUTATION_REASON,
63
63
  decide: (): boolean => true,
64
+ about: {
65
+ title: 'Index mutation',
66
+ topic: '`operating-rules.md`',
67
+ fires:
68
+ '`git add` / `commit` / `reset` / `rm` / `mv` / `restore --staged` in any spelling. Every occurrence',
69
+ quiet: '`pnpm josh git` — the approved commit flow',
70
+ },
64
71
  }
65
72
 
66
73
  const index_guard = { INDEX_MUTATION_REASON, ROW, is_index_mutation }
@@ -21,7 +21,7 @@ const ISSUE_VIEW_COMMAND = new RegExp(String.raw`^gh\s+${gh_api.GH_FLAGS}issue\s
21
21
  // (`…/issues`) and every sub-resource under it (`…/issues/1319/comments`) are left alone.
22
22
  const ISSUE_BODY_PATH = /repos\/[^\s'"]*\/issues\/\d+(?=$|["'\s])/u
23
23
  // **A write to that path is not a read of it**, which is why the body read below asks `gh_api.is_read`:
24
- // `gh api` sends POST as soon as any field flag appears, and `kickoff` PATCHes `…/issues/<N>` to
24
+ // `gh api` sends POST as soon as any field flag appears, and a run PATCHes `…/issues/<N>` to
25
25
  // normalize a title and to fill a blank body — so without the read check the delivery would be spent
26
26
  // refusing a write, and the genuine body read later in the same run would never be guarded.
27
27
  // A segment that fetches comments: the flag, a `comments` field in a `--json` projection, or the
@@ -164,6 +164,14 @@ const ROW = {
164
164
  rewrite_note: COMMENTS_NOTE,
165
165
  // The opening the reason carried before it led with the command.
166
166
  former_reasons: ["⛔ an Issue's comments are part of the Issue: read them before implementing"],
167
+ about: {
168
+ title: 'Reading Issue comments',
169
+ topic: '`issue-comments.md`',
170
+ fires:
171
+ 'a `Bash` that reads only the Issue body (`gh issue view <N>`, or a GET ending in `…/issues/<N>`). Refused until it is re-read with the comments',
172
+ quiet:
173
+ 'no Issue read, or a read with `--comments` / `--json comments` / `…/comments` from the start',
174
+ },
167
175
  }
168
176
 
169
177
  const issue_comments = {
@@ -66,6 +66,13 @@ const ROW = {
66
66
  is_trigger: bash_triggers.on_bash_command(is_bare_josh_git),
67
67
  reason: JOSH_GIT_BARE_REASON,
68
68
  decide: (): boolean => true,
69
+ about: {
70
+ title: 'Bare `pnpm josh git`',
71
+ topic: '`CLAUDE.md` → Git Rules',
72
+ fires:
73
+ '`pnpm josh git` without `-y`, whose staging prompt cancels with no TTY. Every occurrence',
74
+ quiet: '`pnpm josh git -y`',
75
+ },
69
76
  }
70
77
 
71
78
  const josh_git_bare = {