@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
@@ -30,10 +30,13 @@ const KEYWORD_BEFORE_ARGUMENT = -2
30
30
 
31
31
  const PROMPT_LINE_SCHEMA = z.object({
32
32
  isMeta: z.boolean().nullish(),
33
+ timestamp: z.string().nullish(),
33
34
  origin: z.object({ kind: z.string().nullish() }).nullish(),
34
35
  message: z.object({ content: z.unknown() }),
35
36
  })
36
37
 
38
+ const TIMED_LINE_SCHEMA = z.object({ timestamp: z.string() })
39
+
37
40
  type PromptLine = z.infer<typeof PROMPT_LINE_SCHEMA>
38
41
 
39
42
  function is_person(line: PromptLine): boolean {
@@ -42,13 +45,20 @@ function is_person(line: PromptLine): boolean {
42
45
  return line.origin === null || line.origin === undefined || line.origin.kind === HUMAN_ORIGIN
43
46
  }
44
47
 
45
- // The prompt line's text, or `undefined` when the harness wrote it or it does not read as one.
46
- function person_text(line: string): string | undefined {
48
+ // The prompt line as the person wrote it, or `undefined` when the harness wrote it or it does not
49
+ // read as one.
50
+ function person_line(line: string): PromptLine | undefined {
47
51
  const parsed = PROMPT_LINE_SCHEMA.safeParse(json_value.parse_or_undefined(line))
48
52
 
49
- if (!parsed.success || !is_person(parsed.data)) return undefined
53
+ return parsed.success && is_person(parsed.data) ? parsed.data : undefined
54
+ }
50
55
 
51
- return time_reported_failure.result_text(parsed.data.message.content)
56
+ // The prompt line's text, or `undefined` when the harness wrote it or it does not read as one.
57
+ function person_text(line: string): string | undefined {
58
+ const person = person_line(line)
59
+ if (person === undefined) return undefined
60
+
61
+ return time_reported_failure.result_text(person.message.content)
52
62
  }
53
63
 
54
64
  // A keyword opening the prompt is what a person types; a keyword before its one trailing argument is a
@@ -75,6 +85,41 @@ function prompt_text(tail: string): string {
75
85
  return text === undefined || is_invocation(text) ? NO_PROMPT : text
76
86
  }
77
87
 
78
- const last_prompt = { prompt_text }
88
+ // **The prompt that opened this turn, when a person typed it** — '' when the harness opened it (a task
89
+ // notification, a subagent's hand-back), so a question asked turns ago does not answer for a stop the
90
+ // run reached on its own since (`stop-decision.ts` → `is_question`).
91
+ function turn_prompt(tail: string): string {
92
+ const opener = tail.split('\n').findLast((line) => filing_cap.is_prompt_line(line))
93
+ if (opener === undefined) return NO_PROMPT
94
+
95
+ return person_text(opener) ?? NO_PROMPT
96
+ }
97
+
98
+ // When the person last prompted on the tail, or `undefined` when no prompt of theirs is on it.
99
+ function prompt_time(tail: string): string | undefined {
100
+ return tail
101
+ .split('\n')
102
+ .filter((line) => filing_cap.is_prompt_line(line))
103
+ .map((line) => person_line(line)?.timestamp ?? undefined)
104
+ .findLast((time) => time !== undefined)
105
+ }
106
+
107
+ // The first dated line on the tail, or `undefined` when none is.
108
+ function tail_time(tail: string): string | undefined {
109
+ return tail
110
+ .split('\n')
111
+ .map((line) => TIMED_LINE_SCHEMA.safeParse(json_value.parse_or_undefined(line)).data?.timestamp)
112
+ .find((time) => time !== undefined)
113
+ }
114
+
115
+ // **When the current pause began, as far as the tail shows** — what a recorded notify is compared
116
+ // against. A person's prompt ends the pause it reported, so the last one opens the next; with none on
117
+ // the tail, only a send dated inside the tail is provably after every prompt, and an older send is
118
+ // announced again (joshuafolkken/kit#3961).
119
+ function pause_start(tail: string): string | undefined {
120
+ return prompt_time(tail) ?? tail_time(tail)
121
+ }
122
+
123
+ const last_prompt = { pause_start, prompt_text, turn_prompt }
79
124
 
80
125
  export { last_prompt }
@@ -55,6 +55,15 @@ function reason_for(oracle: Oracle, firing_point: FiringPoint): string {
55
55
  )
56
56
  }
57
57
 
58
+ // One description for every generated row: the rule is the same act whichever oracle it names.
59
+ const ABOUT: DeliveredRule['about'] = {
60
+ title: 'An act its oracle was not asked about',
61
+ topic: '`decision-oracle.ts`',
62
+ fires:
63
+ 'a `Bash` governed by an oracle that declared a firing point (`pkg:scout` governs `pnpm add`), issued without that `pnpm josh <command>`. Refused until it ran',
64
+ quiet: 'no governed act, or the oracle already ran',
65
+ }
66
+
58
67
  function row_for(oracle: Oracle, firing_point: FiringPoint): DeliveredRule {
59
68
  const names = command_names(oracle)
60
69
 
@@ -65,6 +74,7 @@ function row_for(oracle: Oracle, firing_point: FiringPoint): DeliveredRule {
65
74
  already_satisfied: (tail: string, _call: GuardedCall): boolean =>
66
75
  tail_commands.prior_bash_commands(tail).some((command) => runs_the_oracle(command, names)),
67
76
  keeps: bash_triggers.on_bash_command((command: string) => runs_the_oracle(command, names)),
77
+ about: ABOUT,
68
78
  }
69
79
  }
70
80
 
@@ -90,6 +90,7 @@ const NOT_NAMED: ReadonlyMap<string, string> = new Map([
90
90
  ['run:cut:gate', SELF],
91
91
  ['backlog:budget', READ],
92
92
  ['run:liveness', READ],
93
+ ['stash:push', SELF],
93
94
  ['stash:pop', SELF],
94
95
  ['backlog:next', READ],
95
96
  ['auto-ok:next', READ],
@@ -12,6 +12,10 @@ import { oracle_firing } from './oracle-firing'
12
12
  const ARGV_OFFSET = 2
13
13
  const INDENT = ' '
14
14
  const FIELD_WIDTH = 10
15
+ // The rule-prose guard sends a rule author here first, so the list closes on the placement order a new
16
+ // rule is weighed against before it becomes a guard or a document line.
17
+ const AUTOMATION_ORDER =
18
+ 'automate first: a command > a hook that runs it > a refusal guard > a document — a lower rung states why the higher cannot hold (`principles.md` → "automate-first"; a guard\'s `why` is `scripts/rules/guard-remedy.ts`)'
15
19
 
16
20
  function pad_field(label: string): string {
17
21
  return label.padEnd(FIELD_WIDTH)
@@ -51,6 +55,8 @@ function print_list(): void {
51
55
  for (const oracle of decision_oracle.DECISION_ORACLES) {
52
56
  console.info(format_oracle(oracle))
53
57
  }
58
+
59
+ console.info(AUTOMATION_ORDER)
54
60
  }
55
61
 
56
62
  function run(argv: ReadonlyArray<string>): number {
@@ -70,6 +76,7 @@ function main(argv: ReadonlyArray<string>): void {
70
76
  }
71
77
 
72
78
  const oracle_list_cli = {
79
+ AUTOMATION_ORDER,
73
80
  print_list,
74
81
  }
75
82
 
@@ -1,6 +1,7 @@
1
1
  import { destructive_command } from './destructive-command'
2
2
  import { direct_pr_create } from './direct-pr-create'
3
3
  import { index_guard } from './index-guard'
4
+ import { pr_merge } from './pr-merge'
4
5
  import { protected_files } from './protected-files'
5
6
 
6
7
  // The three rows that close the deny-list bypasses, gathered so
@@ -10,11 +11,13 @@ import { protected_files } from './protected-files'
10
11
  // other row's — `git restore` is split with `worktree-mutation` by `--staged` alone. The fourth row,
11
12
  // `direct-pr-create`, closes the same kind of gap for `gh pr create`, which
12
13
  // the deny list never listed: it claims `gh pr create` and a `gh api` write to the pulls collection.
14
+ // The fifth, `pr-merge`, claims a merge in every spelling the `gh pr merge*` glob misses.
13
15
  const ROWS = [
14
16
  index_guard.ROW,
15
17
  destructive_command.ROW,
16
18
  protected_files.ROW,
17
19
  direct_pr_create.ROW,
20
+ pr_merge.ROW,
18
21
  ] as const
19
22
 
20
23
  const permission_guards = { ROWS }
@@ -16,7 +16,7 @@ import { shell_segments } from './shell-segments'
16
16
  // document, prompt and skill in this repository found exactly one piped verification example, and it
17
17
  // was the repository's own explanation of this bug — so there were no examples to rewrite, and the
18
18
  // pipe is invented each time rather than copied. The other candidate, a calling convention, had
19
- // already been rejected in writing by `scripts/time/time-reported-failure.ts`: a convention is obeyed
19
+ // already been rejected in writing by `tools/time/time-reported-failure.ts`: a convention is obeyed
20
20
  // or it is not. `prompts/collaboration-workflow/output-bounds.md` is the single source for the rule.
21
21
  //
22
22
  // It lives beside the enumeration rather than inside it because `delivered-rules.ts` is the list —
@@ -124,6 +124,8 @@ function keeps_verdict_intact(command: string): boolean {
124
124
  // **Only a filter that reads its input to the end qualifies.** One that exits early — `head`, or a
125
125
  // `grep` stopping at its first match — closes the pipe on a check still writing, and under `pipefail` the
126
126
  // check's SIGPIPE turns a passing run into exit 141; `head` also cuts the verdict line josh prints last.
127
+ // `cut`, `sort`, `uniq` and `wc` read to the end as well, and a `grep … | cut -c1-250` narrowing was the
128
+ // commonest masking still refused after #3875 (joshuafolkken/kit#3920).
127
129
  //
128
130
  // **Each masked check is wrapped on its own, and the rest of the line runs as typed.** Most of the
129
131
  // refusals left after #3570 were a check chained beside other work — `vitest …; pnpm josh lint:related
@@ -141,7 +143,7 @@ function keeps_verdict_intact(command: string): boolean {
141
143
  const PIPEFAIL_OPEN = '(set -o pipefail; '
142
144
  const PIPEFAIL_CLOSE = ')'
143
145
  const COMMENT_START = /(?:^|\s)#/u
144
- const FULL_READING_FILTER = /^(?:tail|grep)\b/u
146
+ const FULL_READING_FILTER = /^(?:tail|grep|cut|sort|uniq|wc)\b/u
145
147
  const EARLY_EXIT_GREP =
146
148
  /^grep\b.*\s(?:-[a-zA-Z]*[lLmq]|--(?:quiet|silent|max-count|files-with(?:out)?-match))/u
147
149
 
@@ -102,6 +102,13 @@ const ROW = {
102
102
  is_trigger: bash_triggers.on_bash_command(is_poll_loop),
103
103
  reason: POLL_LOOP_REASON,
104
104
  decide: (): boolean => true,
105
+ about: {
106
+ title: 'Output poll loop',
107
+ topic: '`.claude/skills/workflow-commands/background-commands.md`',
108
+ fires:
109
+ "a hand-written `while` / `until` wait loop over a command's output, a marker file or a process. Every occurrence",
110
+ quiet: 'the command started with `run_in_background` — its exit ends the wait',
111
+ },
105
112
  }
106
113
 
107
114
  const poll_loop = {
@@ -0,0 +1,123 @@
1
+ import { bash_triggers } from './bash-triggers'
2
+ import { direct_pr_create } from './direct-pr-create'
3
+ import { git_argv } from './git-argv'
4
+ import { shell_segments } from './shell-segments'
5
+
6
+ // The trigger and the delivered text behind the `pr-merge` row of `delivered-rules.ts`: a pull
7
+ // request merged by the agent's own `Bash` call. A merge is Tier C, and the one authorized route is
8
+ // `pnpm josh followup` (and `pnpm josh observations:flush`), which merges inside its own process —
9
+ // the word after the wrapper is `josh`, so neither is claimed here.
10
+ //
11
+ // **The deny list matches globs; this reads the program.** `Bash(gh pr merge*)` and
12
+ // `Bash(gh api *pulls/*/merge*)` miss `curl -X PUT …/pulls/5/merge`, a GraphQL body read from a file
13
+ // (`gh api graphql -F query=@merge.graphql`), and `enablePullRequestAutoMerge`, which merges once
14
+ // the checks pass. A body kept in a file or computed by the shell cannot be read here, so such a
15
+ // GraphQL call is refused whatever it holds — kit's own GitHub calls are REST (`gh-rest.md`).
16
+ //
17
+ // **It fires on every occurrence**, for the reason `git-force.ts` does.
18
+
19
+ const GH_COMMAND = 'gh'
20
+ const CURL_COMMAND = 'curl'
21
+ const PR_GROUP = 'pr'
22
+ const MERGE_ACTION = 'merge'
23
+ const API_SUBCOMMAND = 'api'
24
+ const GRAPHQL_ENDPOINT = 'graphql'
25
+ // The REST merge endpoint, in any spelling of the number (`5`, `$N`, `${PR}`).
26
+ const MERGE_PATH = /pulls\/[^/\s'"]+\/merge(?![\w-])/u
27
+ const MERGE_MUTATIONS = /\b(?:mergePullRequest|enablePullRequestAutoMerge)\b/u
28
+ const GRAPHQL_URL = /\/graphql\b/u
29
+ // A body read from a file or stdin: `@file` / `field=@file` for `gh api -F` and curl's `-d`, a
30
+ // short flag with the value attached (`-d@file`), and the flags that upload a whole file.
31
+ const FILE_BODY_VALUE = /^(?:-[A-Za-z]|[^=\s]*=)?['"]?@/u
32
+ const FILE_BODY_FLAGS: ReadonlySet<string> = new Set(['--input', '-T', '--upload-file'])
33
+ // A body the shell computes (`query="$(cat merge.graphql)"`, backticks) is no more readable here.
34
+ const SUBSTITUTED_BODY = /\$\(|`/u
35
+
36
+ type ApiCall = NonNullable<ReturnType<typeof git_argv.program_of>>
37
+
38
+ // The words that are neither a flag nor a flag's value, with `gh api`'s value-taking flags, so
39
+ // `gh api -X POST graphql` reaches `graphql` as the endpoint.
40
+ function positional_words(args: ReadonlyArray<string>): Array<string> {
41
+ return direct_pr_create.positional_words(args, direct_pr_create.API_VALUE_TAKING_FLAGS)
42
+ }
43
+
44
+ function is_pr_merge_cli_call(args: ReadonlyArray<string>): boolean {
45
+ const [group, action] = positional_words(args)
46
+
47
+ return group === PR_GROUP && action === MERGE_ACTION
48
+ }
49
+
50
+ function is_github_api_call(name: string, args: ReadonlyArray<string>): boolean {
51
+ if (name === CURL_COMMAND) return true
52
+
53
+ return name === GH_COMMAND && positional_words(args)[0] === API_SUBCOMMAND
54
+ }
55
+
56
+ // `gh api` reaches GraphQL through its `graphql` endpoint or, like curl, through the `/graphql` path
57
+ // or URL (`gh api /graphql --input body.json`).
58
+ function is_graphql_call(name: string, args: ReadonlyArray<string>): boolean {
59
+ if (args.some((argument) => GRAPHQL_URL.test(argument))) return true
60
+
61
+ return name === GH_COMMAND && positional_words(args)[1] === GRAPHQL_ENDPOINT
62
+ }
63
+
64
+ function is_unreadable_body(argument: string): boolean {
65
+ if (FILE_BODY_FLAGS.has(argument)) return true
66
+
67
+ return FILE_BODY_VALUE.test(argument) || SUBSTITUTED_BODY.test(argument)
68
+ }
69
+
70
+ // The segment cut ignores quotes, so a multi-line `-f query='mutation {⏎ mergePullRequest…'` leaves
71
+ // the mutation name in a later segment: a GraphQL call's mutation is looked for in the whole line.
72
+ function is_graphql_merge(command: string, name: string, args: ReadonlyArray<string>): boolean {
73
+ if (!is_graphql_call(name, args)) return false
74
+
75
+ return MERGE_MUTATIONS.test(command) || args.some((argument) => is_unreadable_body(argument))
76
+ }
77
+
78
+ function is_api_merge(command: string, segment: string, call: ApiCall): boolean {
79
+ if (MERGE_PATH.test(segment) || MERGE_MUTATIONS.test(segment)) return true
80
+
81
+ return is_graphql_merge(command, call.name, call.args)
82
+ }
83
+
84
+ function is_pr_merge_segment(command: string, segment: string): boolean {
85
+ const call = git_argv.program_of(segment)
86
+
87
+ if (call === undefined) return false
88
+ if (call.name === GH_COMMAND && is_pr_merge_cli_call(call.args)) return true
89
+
90
+ return is_github_api_call(call.name, call.args) && is_api_merge(command, segment, call)
91
+ }
92
+
93
+ function is_pr_merge(command: string): boolean {
94
+ return shell_segments
95
+ .commands_of(command)
96
+ .some((segment) => is_pr_merge_segment(command, segment))
97
+ }
98
+
99
+ const PR_MERGE_REASON =
100
+ '⛔ direct PR merge: `gh pr merge`, a `gh api` / `curl` call to `…/pulls/<N>/merge`, a ' +
101
+ '`mergePullRequest` / `enablePullRequestAutoMerge` mutation, or a GraphQL body read from a file ' +
102
+ 'merges outside the verified route, and a merge is Tier C. Merge with `pnpm josh followup` when the ' +
103
+ 'run authorizes it; otherwise leave it to the user (`CLAUDE.md` → Git Rules). This rule fires on ' +
104
+ 'every occurrence.'
105
+
106
+ const ROW = {
107
+ id: 'pr-merge',
108
+ is_trigger: bash_triggers.on_bash_command(is_pr_merge),
109
+ reason: PR_MERGE_REASON,
110
+ decide: (): boolean => true,
111
+ about: {
112
+ title: 'Direct PR merge',
113
+ topic: '`CLAUDE.md` → Git Rules',
114
+ fires:
115
+ '`gh pr merge`, a `gh api` / `curl` call to `…/pulls/<N>/merge`, a `mergePullRequest` / `enablePullRequestAutoMerge` mutation, or a GraphQL body read from a file. Every occurrence',
116
+ quiet:
117
+ '`pnpm josh followup` and `pnpm josh observations:flush`, which merge in their own process',
118
+ },
119
+ }
120
+
121
+ const pr_merge = { PR_MERGE_REASON, ROW, is_pr_merge }
122
+
123
+ export { pr_merge }
@@ -3,6 +3,7 @@ import { doctor_consumer } from '#scripts/doctor/doctor-consumer'
3
3
  import { json_value } from '#scripts/lib/json-value'
4
4
  import type { GuardedCall } from '#scripts/time-runtime/time-batch-guard'
5
5
  import { bash_triggers } from './bash-triggers'
6
+ import { git_argv } from './git-argv'
6
7
  import { shell_segments } from './shell-segments'
7
8
 
8
9
  // The trigger and the delivered text behind the `protected-file` row of `delivered-rules.ts`:
@@ -31,25 +32,44 @@ const SETTINGS_FILE = path.join('.claude', 'settings.json')
31
32
  const WHITESPACE = /\s+/u
32
33
  const TOKEN_QUOTES = /["']/gu
33
34
  const INPUT_REDIRECT = '<'
35
+ // Programs that print a named file's bytes, or run them. `cp` and `mv` are deliberately absent: they
36
+ // write rather than print, and `cp .env.example .env` is how a checkout's `.env` is made.
34
37
  const SHELL_READERS: ReadonlySet<string> = new Set([
35
38
  '.',
36
39
  'awk',
40
+ 'base64',
37
41
  'bat',
38
42
  'cat',
43
+ 'cmp',
44
+ 'column',
45
+ 'comm',
39
46
  'cut',
47
+ 'diff',
48
+ 'fold',
40
49
  'grep',
41
50
  'head',
51
+ 'hexdump',
52
+ 'jq',
42
53
  'less',
43
54
  'more',
44
55
  'nl',
45
56
  'od',
57
+ 'paste',
58
+ 'perl',
59
+ 'python',
60
+ 'python3',
61
+ 'rev',
46
62
  'rg',
63
+ 'ruby',
47
64
  'sed',
48
65
  'sort',
49
66
  'source',
50
67
  'strings',
68
+ 'tac',
51
69
  'tail',
70
+ 'uniq',
52
71
  'xxd',
72
+ 'yq',
53
73
  ])
54
74
 
55
75
  function file_path_of(call: GuardedCall): string {
@@ -80,15 +100,15 @@ function is_environment_read_segment(segment: string): boolean {
80
100
  const is_redirected = words.some(
81
101
  (word, index) => word === INPUT_REDIRECT && is_environment_path(words[index + 1] ?? ''),
82
102
  )
83
- const [command = '', ...rest] = words
103
+ const call = git_argv.program_of(segment)
84
104
 
85
- return (
86
- is_redirected || (SHELL_READERS.has(command) && rest.some((word) => is_environment_path(word)))
87
- )
105
+ if (is_redirected || call === undefined) return is_redirected
106
+
107
+ return SHELL_READERS.has(call.name) && call.args.some((word) => is_environment_path(word))
88
108
  }
89
109
 
90
110
  function is_environment_shell_read(command: string): boolean {
91
- return shell_segments.segments_of(command).some((segment) => is_environment_read_segment(segment))
111
+ return shell_segments.commands_of(command).some((segment) => is_environment_read_segment(segment))
92
112
  }
93
113
 
94
114
  function is_environment_read(call: GuardedCall): boolean {
@@ -130,6 +150,13 @@ const ROW = {
130
150
  decide: (): boolean => true,
131
151
  // The opening the reason carried before it was cut to the action and the next command.
132
152
  former_reasons: ['⛔ protected file: `.env` holds the Telegram bot token'],
153
+ about: {
154
+ title: 'Protected file',
155
+ topic: '`operating-rules.md`',
156
+ fires:
157
+ 'a `Read` of `.env`, or an `Edit` / `Write` of `.claude/settings.json` outside kit. Every occurrence',
158
+ quiet: "kit itself, or the user's `~/.claude/settings.json`",
159
+ },
133
160
  }
134
161
 
135
162
  const protected_files = { ROW, is_protected_file_call }
@@ -44,6 +44,12 @@ const ROW = {
44
44
  is_trigger: bash_triggers.on_bash_command(posts_at_path_literally),
45
45
  reason: RAW_FIELD_BODY_REASON,
46
46
  decide: (): boolean => true,
47
+ about: {
48
+ title: 'Posting `@path` literally',
49
+ topic: '`shell-body.md`',
50
+ fires: 'a raw field (`-f` / `--raw-field`) passing `body=@<path>`. Every occurrence',
51
+ quiet: '`-F` / `--field body=@`, a body without `@`, or `pnpm josh issue:comment`',
52
+ },
47
53
  }
48
54
 
49
55
  const raw_field_body = { RAW_FIELD_BODY_REASON, ROW, posts_at_path_literally }
@@ -178,6 +178,14 @@ const ROW = {
178
178
  reason: RULE_BODY_REASON,
179
179
  already_satisfied: answered_placement,
180
180
  keeps: bash_triggers.on_bash_command(runs_placement_oracle),
181
+ about: {
182
+ title: 'Question 0 and the ordering question before writing a rule into prose',
183
+ topic: '`residency.md`',
184
+ fires:
185
+ 'an `Edit` / `Write` to `CLAUDE.md` / `prompts/**/*.md` / `.claude/skills/**/*.md` appending at least the threshold. Refused until both `pnpm josh oracle:list` and `pnpm josh run:step` ran',
186
+ quiet:
187
+ 'not a rule document, an append under the threshold (typo, link swap, deletion), or both commands ran',
188
+ },
181
189
  }
182
190
 
183
191
  const rule_body_guard = {
@@ -1,51 +1,35 @@
1
1
  #!/usr/bin/env tsx
2
2
  import { fileURLToPath } from 'node:url'
3
3
  import { delivered_rules } from './delivered-rules'
4
- import { rule_registry, type RegisteredRule } from './rule-registry'
4
+ import { guard_remedy } from './guard-remedy'
5
+ import { stop_rule_rows, type StopRule } from './stop-rule-rows'
5
6
 
6
7
  // `josh rule:list` — the list of trigger-delivered rules, rendered from the guard rows themselves.
7
8
  // One item per `MEASURED_RULES` row in delivery order, then the `Stop`
8
9
  // hook's rows; each carries its single source, the call it fires on and the turn it stays silent on.
9
- // The prose is `rule-registry.ts`; the order and the set are `delivered-rules.ts`, so a row added
10
- // there is listed without a document edit — and a row with no registry entry is listed as missing.
10
+ // The prose is each row's own `about`, so a row added there is listed without a document edit.
11
11
 
12
12
  const HEADER =
13
13
  '# Trigger-delivered rules — rendered by `pnpm josh rule:list` from `scripts/rules/delivered-rules.ts`'
14
- const MISSING = '(no entry in `scripts/rules/rule-registry.ts`)'
15
-
16
- function item(id: string, rule: RegisteredRule | undefined): string {
17
- if (rule === undefined) return `- \`${id}\` ${MISSING}`
14
+ const MISSING_WHY = '(no `why` in `scripts/rules/guard-remedy.ts`)'
18
15
 
16
+ function item({ id, about }: StopRule): string {
19
17
  return [
20
- `- **${rule.title}** (\`${id}\`, ${rule.topic})`,
21
- ` - fires: \`${rule.entry}\` — ${rule.fires}`,
22
- ` - silent: ${rule.quiet}`,
18
+ `- **${about.title}** (\`${id}\`, ${about.topic})`,
19
+ ` - fires: \`${about.entry ?? delivered_rules.PRETOOL_GUARD}\` — ${about.fires}`,
20
+ ` - silent: ${about.quiet}`,
21
+ ` - not automated: ${guard_remedy.why_of(id) ?? MISSING_WHY}`,
23
22
  ].join('\n')
24
23
  }
25
24
 
26
- function row_ids(): ReadonlyArray<string> {
27
- return delivered_rules.MEASURED_RULES.map((rule) => rule.id)
28
- }
29
-
30
25
  function render(): string {
31
- const rows = row_ids().map((id) => item(id, rule_registry.entry_for(id)))
32
- const stops = rule_registry.STOP_ROWS.map((rule) => item(rule.id, rule))
33
-
34
- return [HEADER, '', ...rows, ...stops].join('\n')
35
- }
36
-
37
- // Registry entries no guard row reaches — a renamed or removed row left its prose behind.
38
- function orphans(): ReadonlyArray<string> {
39
- const reached = new Set(row_ids().map((id) => rule_registry.registry_id(id)))
40
- const stop_ids = new Set(rule_registry.STOP_ROWS.map((rule) => rule.id))
26
+ const rows = [...delivered_rules.MEASURED_RULES, ...stop_rule_rows.ROWS].map((rule) => item(rule))
41
27
 
42
- return rule_registry.REGISTERED_RULES.map((rule) => rule.id).filter(
43
- (id) => !reached.has(id) && !stop_ids.has(id),
44
- )
28
+ return [HEADER, '', ...rows].join('\n')
45
29
  }
46
30
 
47
31
  if (process.argv[1] === fileURLToPath(import.meta.url)) process.stdout.write(`${render()}\n`)
48
32
 
49
- const rule_list = { MISSING, orphans, render }
33
+ const rule_list = { MISSING_WHY, render }
50
34
 
51
35
  export { rule_list }
@@ -0,0 +1,114 @@
1
+ import { hook_decision } from '#scripts/josh/hook-decision'
2
+ import { json_value } from '#scripts/lib/json-value'
3
+ import { time_density_hook } from '#scripts/time-runtime/time-density-hook'
4
+ import { time_hook_transcript } from '#scripts/time-runtime/time-hook-transcript'
5
+ import { delivered_rules, type DeliveredRule } from './delivered-rules'
6
+ import { guard_remedy } from './guard-remedy'
7
+
8
+ // The call a `PreToolUse` hook runs in place of a mechanically fixable refusal (joshuafolkken/kit#3920).
9
+ // Each row `guard-remedy.ts` classes as a rewrite gets the call in turn, so one line that both pipes a
10
+ // check and reads a body is made right by both rows. The rewrite is the rule guard's delivery, so the
11
+ // rule guard's switch turns it off too.
12
+
13
+ interface RuleRewrite {
14
+ // The payload carrying the rewritten input, which the guards judge in place of the typed one.
15
+ payload: string
16
+ input: Record<string, unknown>
17
+ // The notes of the rows that rewrote, in row order.
18
+ note: string
19
+ }
20
+
21
+ interface Folded {
22
+ input: Record<string, unknown>
23
+ notes: ReadonlyArray<string>
24
+ }
25
+
26
+ const REWRITING_RULES: ReadonlyArray<DeliveredRule> = delivered_rules.DELIVERED_RULES.filter(
27
+ (rule) => guard_remedy.is_rewrite(rule.id) && rule.rewrite !== undefined,
28
+ )
29
+
30
+ const NOTE_SEPARATOR = '\n\n'
31
+
32
+ // **A tail that cannot be read is an empty one**, as every guard fails open (`hook-decision.ts`): a
33
+ // throw here would end the hook before any guard judged the call.
34
+ function read_payload_tail(raw_payload: string): string {
35
+ try {
36
+ const payload = hook_decision.parse_hook_payload(raw_payload)
37
+
38
+ return payload
39
+ ? time_density_hook.read_tail(
40
+ time_hook_transcript.transcript_of(payload.transcript_path, payload.agent_id),
41
+ )
42
+ : ''
43
+ } catch {
44
+ return ''
45
+ }
46
+ }
47
+
48
+ function tail_reader(raw_payload: string): () => string {
49
+ const cache: { tail?: string } = {}
50
+
51
+ return function tail(): string {
52
+ cache.tail ??= read_payload_tail(raw_payload)
53
+
54
+ return cache.tail
55
+ }
56
+ }
57
+
58
+ function fold(name: string, typed: Record<string, unknown>, tail: () => string): Folded {
59
+ const folded: Folded = { input: typed, notes: [] }
60
+
61
+ for (const rule of REWRITING_RULES) {
62
+ const input = rule.rewrite?.({ name, input: folded.input }, tail)
63
+
64
+ if (input === undefined) {
65
+ continue
66
+ }
67
+
68
+ folded.input = input
69
+ folded.notes = [...folded.notes, rule.rewrite_note ?? '']
70
+ }
71
+
72
+ return folded
73
+ }
74
+
75
+ // The typed call, beside the whole payload its rewrite is spread back into.
76
+ interface TypedPayload {
77
+ fields: Record<string, unknown>
78
+ name: string
79
+ input: Record<string, unknown>
80
+ }
81
+
82
+ function typed_payload(raw_payload: string): TypedPayload | undefined {
83
+ const fields = json_value.parse_or_undefined(raw_payload)
84
+
85
+ if (!json_value.is_record(fields)) return undefined
86
+
87
+ const input = fields['tool_input']
88
+
89
+ return json_value.is_record(input)
90
+ ? { fields, name: String(fields['tool_name']), input }
91
+ : undefined
92
+ }
93
+
94
+ function rewrite(raw_payload: string): RuleRewrite | undefined {
95
+ const typed = delivered_rules.is_enabled() ? typed_payload(raw_payload) : undefined
96
+
97
+ if (typed === undefined) return undefined
98
+
99
+ const { input, notes } = fold(typed.name, typed.input, tail_reader(raw_payload))
100
+
101
+ if (notes.length === 0) return undefined
102
+
103
+ const note = notes.join(NOTE_SEPARATOR)
104
+
105
+ return { payload: JSON.stringify({ ...typed.fields, tool_input: input }), input, note }
106
+ }
107
+
108
+ const rule_rewrite = {
109
+ NOTE_SEPARATOR,
110
+ rewrite,
111
+ }
112
+
113
+ export type { RuleRewrite }
114
+ export { rule_rewrite }
@@ -1,7 +1,9 @@
1
1
  import { spawn } from 'node:child_process'
2
- import { mkdirSync, renameSync, statSync, writeFileSync } from 'node:fs'
2
+ import { statSync } from 'node:fs'
3
3
  import path from 'node:path'
4
+ import { atomic_write } from '#scripts/lib/atomic-write'
4
5
  import { file_reader } from '#scripts/lib/read-file'
6
+ import { MS_PER_MINUTE } from '#scripts/lib/timeouts'
5
7
 
6
8
  // The `rule:value` reading at the `backlogrun` loop head, without the loop waiting on it.
7
9
  // Measuring re-reads every transcript and takes minutes, and `backlog:offer`
@@ -16,12 +18,10 @@ const CACHE_DIRECTORY = ['node_modules', '.cache', 'josh']
16
18
  const CACHE_FILE = 'rule-value.txt'
17
19
  // Touched when a refresh starts, so the loop head starts at most one per interval however often it runs.
18
20
  const STAMP_FILE = 'rule-value.stamp'
19
- const MS_PER_MINUTE = 60_000
20
21
  const REFRESH_MINUTES = 15
21
22
  const REFRESH_MS = REFRESH_MINUTES * MS_PER_MINUTE
22
23
  const REFRESH_ARGV = ['josh', 'rule:value', '--refresh']
23
24
  const PNPM = 'pnpm'
24
- const TEMPORARY_SUFFIX = '.tmp'
25
25
 
26
26
  interface CachePorts {
27
27
  now: () => number
@@ -45,12 +45,7 @@ function is_refresh_due(cwd: string, now_ms: number): boolean {
45
45
  }
46
46
 
47
47
  function write_cache_file(cwd: string, file: string, text: string): void {
48
- const target = cache_path(cwd, file)
49
- const temporary = `${target}${TEMPORARY_SUFFIX}`
50
-
51
- mkdirSync(path.dirname(target), { recursive: true })
52
- writeFileSync(temporary, text)
53
- renameSync(temporary, target)
48
+ atomic_write.replace_file(cache_path(cwd, file), text)
54
49
  }
55
50
 
56
51
  function ignore_spawn_error(): void {