@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
@@ -3,6 +3,9 @@
3
3
  // way, so the slicing lives in one place rather than being written twice.
4
4
 
5
5
  const HEADING_PREFIX = '## '
6
+ // A body saved from GitHub's web editor ends its lines with CRLF; a kept `\r` would end every line's
7
+ // text with it and defeat each `$`-anchored match downstream.
8
+ const LINE_BREAK_PATTERN = /\r?\n/u
6
9
 
7
10
  function is_heading(line: string): boolean {
8
11
  return line.trimStart().startsWith(HEADING_PREFIX)
@@ -29,21 +32,31 @@ function next_fence(line: string, fence: string): string | undefined {
29
32
  return undefined
30
33
  }
31
34
 
32
- function unfenced_lines(body: string): ReadonlyArray<string> {
35
+ function lines_of(body: string): ReadonlyArray<string> {
36
+ return body.split(LINE_BREAK_PATTERN)
37
+ }
38
+
39
+ // The body's lines with every fenced line, fences included, blanked. Indentation is kept, so a list
40
+ // item's indented continuation survives.
41
+ function fence_free_lines(body: string): ReadonlyArray<string> {
33
42
  let fence = ''
34
43
  const visible: Array<string> = []
35
44
 
36
- for (const line of body.split('\n')) {
45
+ for (const line of lines_of(body)) {
37
46
  const next = next_fence(line, fence)
38
- const visible_line = line.replace(/^(?: {4}|\t).*/u, '')
39
47
 
40
- visible.push(next === undefined && fence === '' ? visible_line : '')
48
+ visible.push(next === undefined && fence === '' ? line : '')
41
49
  fence = next ?? fence
42
50
  }
43
51
 
44
52
  return visible
45
53
  }
46
54
 
55
+ // As `fence_free_lines`, with an indented code line (4 spaces or a tab) blanked too.
56
+ function unfenced_lines(body: string): ReadonlyArray<string> {
57
+ return fence_free_lines(body).map((line) => line.replace(/^(?: {4}|\t).*/u, ''))
58
+ }
59
+
47
60
  function has_unfenced_line(body: string, text: string): boolean {
48
61
  return unfenced_lines(body).some((line) => line.trim() === text)
49
62
  }
@@ -59,7 +72,7 @@ function section_lines_matching(
59
72
  body: string,
60
73
  is_target: (line: string) => boolean,
61
74
  ): ReadonlyArray<string> {
62
- const lines = body.split('\n')
75
+ const lines = lines_of(body)
63
76
  const visible = unfenced_lines(body)
64
77
  const start = visible.findIndex((line) => is_target(line))
65
78
 
@@ -80,6 +93,7 @@ function section_lines(body: string, heading: string): ReadonlyArray<string> {
80
93
  const markdown_section = {
81
94
  section_lines,
82
95
  section_lines_matching,
96
+ fence_free_lines,
83
97
  unfenced_lines,
84
98
  has_line,
85
99
  has_unfenced_line,
@@ -24,7 +24,7 @@ import { session_cite } from './session-cite'
24
24
 
25
25
  const FAILURE_EXIT_CODE = 1
26
26
  const ARGV_OFFSET = 2
27
- const ISSUE_FIELDS = 'body,author_association'
27
+ const ISSUE_FIELDS = 'body,author_association,user'
28
28
  const UNKNOWN_ASSOCIATION = 'unknown'
29
29
  const USAGE = 'Usage: josh measure:rerun <issue-number>'
30
30
  const NO_BASELINE = 'no `command → value` baseline found in ## ベースライン — nothing to re-run'
@@ -36,6 +36,7 @@ const MEASURE_TIMEOUT_MS = 60_000
36
36
  const issue_schema = z.object({
37
37
  body: z.string().nullish(),
38
38
  author_association: z.string().nullish(),
39
+ user: z.looseObject({ login: z.string() }).nullish(),
39
40
  })
40
41
 
41
42
  type IssueFields = z.infer<typeof issue_schema>
@@ -88,6 +89,15 @@ async function read_issue(issue_number: string): Promise<IssueFields | undefined
88
89
  return json === undefined ? undefined : parse_json_object_or_undefined(json, issue_schema)
89
90
  }
90
91
 
92
+ function untrusted(issue_number: string, issue: IssueFields): BodyRead {
93
+ const association = issue.author_association ?? UNKNOWN_ASSOCIATION
94
+
95
+ return {
96
+ kind: 'refused',
97
+ reason: `refusing to run the baseline of ${session_cite.issue(issue_number)}: its author (${association}) is not ${gh_author_association.TRUSTED_LIST}`,
98
+ }
99
+ }
100
+
91
101
  // The body, only when its author can write to the repository. A read that fails is refused as well:
92
102
  // an unknown author is not a trusted one.
93
103
  async function read_trusted_body(issue_number: string): Promise<BodyRead> {
@@ -97,14 +107,9 @@ async function read_trusted_body(issue_number: string): Promise<BodyRead> {
97
107
  return { kind: 'refused', reason: `could not read issue ${session_cite.issue(issue_number)}` }
98
108
  }
99
109
 
100
- const association = issue.author_association ?? UNKNOWN_ASSOCIATION
110
+ const author = { login: issue.user?.login, association: issue.author_association }
101
111
 
102
- if (!gh_author_association.is_trusted(association)) {
103
- return {
104
- kind: 'refused',
105
- reason: `refusing to run the baseline of ${session_cite.issue(issue_number)}: its author is ${association}, not ${gh_author_association.TRUSTED_LIST}`,
106
- }
107
- }
112
+ if (!(await gh_author_association.is_trusted(author))) return untrusted(issue_number, issue)
108
113
 
109
114
  return { kind: 'trusted', body: issue.body ?? '' }
110
115
  }
@@ -0,0 +1,39 @@
1
+ import { plan_consumers } from '#scripts/issue/plan-consumers'
2
+
3
+ // `josh plan:consumers <identifier...>` — prints each identifier's existing references and the draft
4
+ // of a plan's existing-consumers section (`plan-consumers.ts`). A flag is refused rather than searched
5
+ // for, since an identifier never starts with `-`.
6
+
7
+ const SUCCESS_EXIT_CODE = 0
8
+ const FAILURE_EXIT_CODE = 1
9
+ const USAGE = 'Usage: josh plan:consumers <identifier...>'
10
+
11
+ function identifiers_of(argv: ReadonlyArray<string>): Array<string> | undefined {
12
+ const identifiers = [...new Set(argv.map((argument) => argument.trim()))]
13
+
14
+ if (identifiers.length === 0) return undefined
15
+
16
+ return identifiers.some((identifier) => identifier === '' || identifier.startsWith('-'))
17
+ ? undefined
18
+ : identifiers
19
+ }
20
+
21
+ async function run(argv: ReadonlyArray<string>): Promise<number> {
22
+ const identifiers = identifiers_of(argv)
23
+
24
+ if (identifiers === undefined) {
25
+ console.error(USAGE)
26
+
27
+ return FAILURE_EXIT_CODE
28
+ }
29
+
30
+ const { text, has_failed } = await plan_consumers.report(identifiers)
31
+
32
+ console.info(text)
33
+
34
+ return has_failed ? FAILURE_EXIT_CODE : SUCCESS_EXIT_CODE
35
+ }
36
+
37
+ const plan_consumers_cli = { USAGE, run }
38
+
39
+ export { plan_consumers_cli }
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env tsx
2
+ import { fileURLToPath } from 'node:url'
3
+ import { plan_consumers_cli } from './plan-consumers-cli'
4
+
5
+ // The `josh plan:consumers` entry, kept apart from `plan-consumers-cli.ts` so a bundle carrying that
6
+ // module never fires this guard (joshuafolkken/kit#4186).
7
+ if (process.argv[1] === fileURLToPath(import.meta.url)) {
8
+ const ARGV_OFFSET = 2
9
+
10
+ process.exitCode = await plan_consumers_cli.run(process.argv.slice(ARGV_OFFSET))
11
+ }
@@ -0,0 +1,55 @@
1
+ import { markdown_section } from '#scripts/issue/markdown-section'
2
+
3
+ // A plan's existing-consumers section (`HEADING`) — the existing code, prompts and documents that
4
+ // read or write each state, command, label, file or process the plan adds or changes, and what this
5
+ // issue does with each. A concept added without it shipped while its readers still assumed the old
6
+ // world (joshuafolkken/kit#4270, #4265 after `lane:pause`), so `issue:plan` refuses a plan that omits
7
+ // it.
8
+ //
9
+ // **"None" is an answer only with its reason** (`NONE_WITH_REASON`), since a bare "none" cannot be
10
+ // told from a section filled in to get past the check.
11
+
12
+ const HEADING = '### 影響を受ける既存の利用者'
13
+ const ANY_HEADING = /^#{1,6}\s/u
14
+ const LIST_MARKER = /^(?:[-*+]|\d+\.)\s+/u
15
+ const NONE_WORD = 'なし'
16
+ const NONE_WITH_REASON = /^なし\s*[((]\s*\S.*[))]$/u
17
+ const MISSING = `The plan has no \`${HEADING}\` section: list, for each state, command, label, file or process it adds or changes, the existing places that read or write it and what this issue does with each (\`pnpm josh plan:consumers <identifier...>\` drafts it), or write \`なし(<reason>)\`.`
18
+ const EMPTY = `The plan's \`${HEADING}\` section is empty: list the existing consumers, or write \`なし(<reason>)\`.`
19
+ const BARE_NONE = `The plan's \`${HEADING}\` section says \`なし\` without a reason: write \`なし(<reason>)\`.`
20
+
21
+ // The section runs to the next heading of any level, since the plan's own sections are `###`. Fenced
22
+ // lines are blanked first, so a `# comment` in a code block neither ends the section nor is an entry.
23
+ function section_entries(plan: string): ReadonlyArray<string> | undefined {
24
+ if (!markdown_section.has_line(plan, HEADING)) return undefined
25
+ const raw = markdown_section.section_lines(plan, HEADING).join('\n')
26
+ const lines = markdown_section.fence_free_lines(raw)
27
+ const end = lines.findIndex((line) => ANY_HEADING.test(line.trim()))
28
+ const body = end === -1 ? lines : lines.slice(0, end)
29
+
30
+ return body.map((line) => line.trim().replace(LIST_MARKER, '')).filter((line) => line !== '')
31
+ }
32
+
33
+ // "None" answers for the whole section, so only a section that opens with it is read as one — a "none"
34
+ // nested under a consumer entry is that entry's note. A reason wrapped onto later lines is joined back.
35
+ function is_bare_none(entries: ReadonlyArray<string>): boolean {
36
+ const [first = ''] = entries
37
+
38
+ if (!first.startsWith(NONE_WORD) || NONE_WITH_REASON.test(first)) return false
39
+
40
+ return !NONE_WITH_REASON.test(entries.join(' '))
41
+ }
42
+
43
+ // The refusal for a plan whose section is missing, empty or a reasonless "none"; `undefined` passes.
44
+ function refusal_of(plan: string): string | undefined {
45
+ const entries = section_entries(plan)
46
+
47
+ if (entries === undefined) return MISSING
48
+ if (entries.length === 0) return EMPTY
49
+
50
+ return is_bare_none(entries) ? BARE_NONE : undefined
51
+ }
52
+
53
+ const plan_consumers_section = { HEADING, refusal_of }
54
+
55
+ export { plan_consumers_section }
@@ -0,0 +1,127 @@
1
+ import { git_grep_hits, type Hit } from '#scripts/git/git-grep-hits'
2
+ import { plan_consumers_section } from '#scripts/issue/plan-consumers-section'
3
+
4
+ // `josh plan:consumers <identifier...>` — where each identifier a plan adds or changes is already
5
+ // read or written, so its existing-consumers section names them rather than leaving them for the
6
+ // next incident to find. Every reference in the tracked tree — a CI workflow or a settings file reads
7
+ // a name as surely as code does — grouped by kind, then a draft of the section for the plan to finish.
8
+ // `.josh/` is left out: its observations and metrics record past runs rather than read the name.
9
+ //
10
+ // **Unlike `run:prep`'s code locations it keeps every line and every kind** — a prompt that tells a
11
+ // run to count a label is as much a consumer of it as the code that does — but caps each kind, so one
12
+ // common name cannot bury the rest.
13
+
14
+ type Kind = 'code' | 'config' | 'doc' | 'prompt' | 'test'
15
+
16
+ interface Consumers {
17
+ identifier: string
18
+ hits: ReadonlyArray<Hit>
19
+ has_failed: boolean
20
+ }
21
+
22
+ const PATHSPECS = [':(exclude).josh']
23
+ const KINDS: ReadonlyArray<readonly [Kind, string]> = [
24
+ ['code', 'code'],
25
+ ['config', 'config and workflows'],
26
+ ['prompt', 'prompts and skills'],
27
+ ['doc', 'docs'],
28
+ ['test', 'tests'],
29
+ ]
30
+ const TEST_PATH = /(?:\.test\.ts|\.e2e\.ts|\.snap)$/u
31
+ const CODE_PATH = /\.(?:ts|js|mjs|cjs|svelte|sh)$/u
32
+ const PROMPT_ROOTS = ['prompts/', '.claude/']
33
+ const MAX_HITS_PER_KIND = 20
34
+ const MAX_DRAFT_FILES = 8
35
+ const INDENT = ' '
36
+ const HIT_INDENT = `${INDENT}${INDENT}`
37
+ const HIT_SEPARATOR = ' '
38
+ const NO_REFERENCE = ' — no reference in the tracked tree'
39
+ const SEARCH_FAILED = ' — git grep failed; not searched'
40
+ const DRAFT_ACTION = '<直す | 影響なし | 別 Issue>'
41
+ const DRAFT_NO_REFERENCE = 'no existing reference'
42
+
43
+ // Markdown under `prompts/` or `.claude/` instructs a run and other Markdown is read by people; the
44
+ // rest that is neither code nor a test — workflows, settings, JSON and YAML data — is configuration.
45
+ function markdown_kind(path: string): Kind {
46
+ return PROMPT_ROOTS.some((root) => path.startsWith(root)) ? 'prompt' : 'doc'
47
+ }
48
+
49
+ function kind_of(path: string): Kind {
50
+ if (TEST_PATH.test(path)) return 'test'
51
+ if (CODE_PATH.test(path)) return 'code'
52
+
53
+ return path.endsWith('.md') ? markdown_kind(path) : 'config'
54
+ }
55
+
56
+ function more_line(count: number): Array<string> {
57
+ return count > MAX_HITS_PER_KIND
58
+ ? [`${HIT_INDENT}… +${String(count - MAX_HITS_PER_KIND)} more`]
59
+ : []
60
+ }
61
+
62
+ function format_kind(hits: ReadonlyArray<Hit>, kind: Kind, label: string): Array<string> {
63
+ const of_kind = hits.filter((hit) => kind_of(hit.path) === kind)
64
+
65
+ if (of_kind.length === 0) return []
66
+ const lines = of_kind
67
+ .slice(0, MAX_HITS_PER_KIND)
68
+ .map((hit) => `${HIT_INDENT}${hit.path}:${hit.line}${HIT_SEPARATOR}${hit.excerpt}`)
69
+
70
+ return [`${INDENT}${label}`, ...lines, ...more_line(of_kind.length)]
71
+ }
72
+
73
+ function format_consumers(consumers: Consumers): string {
74
+ if (consumers.has_failed) return `${consumers.identifier}${SEARCH_FAILED}`
75
+ if (consumers.hits.length === 0) return `${consumers.identifier}${NO_REFERENCE}`
76
+ const kinds = KINDS.flatMap(([kind, label]) => format_kind(consumers.hits, kind, label))
77
+
78
+ return [consumers.identifier, ...kinds].join('\n')
79
+ }
80
+
81
+ // Tests are left out of the draft: a test follows the code it covers, so it is never the consumer a
82
+ // plan has to decide about.
83
+ function kind_rank(path: string): number {
84
+ return KINDS.findIndex(([kind]) => kind === kind_of(path))
85
+ }
86
+
87
+ // Code first, in `KINDS` order, so the cap drops docs before the code a plan most has to decide on.
88
+ function draft_files(hits: ReadonlyArray<Hit>): Array<string> {
89
+ const paths = [...new Set(hits.map((hit) => hit.path))]
90
+ .filter((path) => kind_of(path) !== 'test')
91
+ .toSorted((left, right) => kind_rank(left) - kind_rank(right))
92
+ const shown = paths.slice(0, MAX_DRAFT_FILES).map((path) => `\`${path}\``)
93
+ const rest = paths.length - shown.length
94
+
95
+ return rest > 0 ? [...shown, `+${String(rest)} more`] : shown
96
+ }
97
+
98
+ function draft_entry(consumers: Consumers): string {
99
+ const files = draft_files(consumers.hits)
100
+
101
+ if (files.length === 0) return `- \`${consumers.identifier}\`: ${DRAFT_NO_REFERENCE}`
102
+
103
+ return `- \`${consumers.identifier}\`: ${files.join(', ')} — ${DRAFT_ACTION}`
104
+ }
105
+
106
+ function format_draft(all: ReadonlyArray<Consumers>): string {
107
+ const entries = all.map((consumers) => draft_entry(consumers))
108
+
109
+ return ['draft:', plan_consumers_section.HEADING, '', ...entries].join('\n')
110
+ }
111
+
112
+ async function find(identifier: string): Promise<Consumers> {
113
+ return { identifier, ...(await git_grep_hits.search(identifier, [], PATHSPECS)) }
114
+ }
115
+
116
+ async function report(
117
+ identifiers: ReadonlyArray<string>,
118
+ ): Promise<{ text: string; has_failed: boolean }> {
119
+ const all = await Promise.all(identifiers.map(async (identifier) => await find(identifier)))
120
+ const sections = [...all.map((consumers) => format_consumers(consumers)), format_draft(all)]
121
+
122
+ return { text: sections.join('\n\n'), has_failed: all.some((consumers) => consumers.has_failed) }
123
+ }
124
+
125
+ const plan_consumers = { kind_of, report }
126
+
127
+ export { plan_consumers }
@@ -1,7 +1,7 @@
1
1
  // The environment variables that name the **parent** agent session, and which a child session must
2
2
  // not inherit.
3
3
  //
4
- // `scripts/eval/eval-session.ts` and `josh run:wake` both launch a headless session. Two copies of
4
+ // `tools/eval/eval-session.ts` and `josh run:wake` both launch a headless session. Two copies of
5
5
  // this list is the clone `CLAUDE.md`
6
6
  // prohibits, and this is the shape of clone that fails silently: the copy that drifts does not throw
7
7
  // or lint — the child dials the parent's private socket, is refused, and the session dies as
@@ -0,0 +1,82 @@
1
+ import { canonical_command, COMMAND_MAP } from './josh-command-map'
2
+ import type { CommandUsage } from './josh-command-types'
3
+
4
+ // The single renderer of a command's usage. `josh help <command>` prints it and
5
+ // `tools/document/generate-command-usage.ts` writes it between a reference page's usage markers,
6
+ // so the terminal and the page are one text (#3932). The usage itself sits on each command's entry
7
+ // (#4185); which page renders it is the page's own `<!-- usage: <command> -->` span.
8
+
9
+ const USAGE_PAGES: ReadonlyArray<string> = [
10
+ 'docs/josh-commands.md',
11
+ 'docs/josh-commands-run.md',
12
+ 'docs/josh-commands-backlog.md',
13
+ 'docs/josh-commands-automation.md',
14
+ ]
15
+ const NOTE_GAP = 3
16
+
17
+ interface ExampleLine {
18
+ command: string
19
+ note: string | undefined
20
+ }
21
+
22
+ function usage_for(name: string): CommandUsage | undefined {
23
+ return Object.hasOwn(COMMAND_MAP, name) ? COMMAND_MAP[name]?.usage : undefined
24
+ }
25
+
26
+ function example_line(name: string, example: CommandUsage['examples'][number]): ExampleLine {
27
+ const command = example.arguments ? `pnpm josh ${name} ${example.arguments}` : `pnpm josh ${name}`
28
+
29
+ return { command, note: example.note }
30
+ }
31
+
32
+ // Every comment starts in one column, so a block reads as a table of what each spelling does.
33
+ function format_examples(name: string, usage: CommandUsage): string {
34
+ const lines = usage.examples.map((example) => example_line(name, example))
35
+ const width = Math.max(...lines.map((line) => line.command.length)) + NOTE_GAP
36
+ const rendered = lines.map((line) =>
37
+ line.note === undefined ? line.command : `${line.command.padEnd(width)}# ${line.note}`,
38
+ )
39
+
40
+ return ['```bash', ...rendered, '```'].join('\n')
41
+ }
42
+
43
+ function code_span(text: string): string {
44
+ return `\`${text}\``
45
+ }
46
+
47
+ function format_flags(flags: NonNullable<CommandUsage['flags']>): string {
48
+ const items = flags.map(
49
+ (flag) =>
50
+ `- ${flag.names.map((spelling) => code_span(spelling)).join(' / ')} — ${flag.description}`,
51
+ )
52
+
53
+ return ['**Options:**', '', ...items].join('\n')
54
+ }
55
+
56
+ function format_usage(name: string): string | undefined {
57
+ const usage = usage_for(name)
58
+ if (usage === undefined) return undefined
59
+ const flags = usage.flags === undefined ? [] : [format_flags(usage.flags)]
60
+
61
+ return [format_examples(name, usage), ...flags].join('\n\n')
62
+ }
63
+
64
+ // `josh help <command>`: the synopsis line, the description, then the usage block. An alias
65
+ // resolves to its command; a name that is neither answers `undefined`.
66
+ function format_command_help(input: string): string | undefined {
67
+ const name = canonical_command(input)
68
+ const entry = Object.hasOwn(COMMAND_MAP, name) ? COMMAND_MAP[name] : undefined
69
+ if (entry === undefined) return undefined
70
+ const [synopsis] = entry.reference
71
+ const head = synopsis ? `josh ${name} ${synopsis}` : `josh ${name}`
72
+
73
+ return [head, '', entry.description, '', format_usage(name)].join('\n')
74
+ }
75
+
76
+ const command_usage = {
77
+ USAGE_PAGES,
78
+ format_command_help,
79
+ format_usage,
80
+ }
81
+
82
+ export { command_usage }
@@ -3,7 +3,7 @@ import { stamp_file } from './stamp-file'
3
3
 
4
4
  // A stamp whose payload is "when this was taken, and the digest of every file it covers".
5
5
  //
6
- // `scripts/eval/eval-stamp.ts` was the only holder of this shape. `josh review:brief` needs two more
6
+ // `tools/eval/eval-stamp.ts` was the only holder of this shape. `josh review:brief` needs two more
7
7
  // records of exactly the same kind — the gate's result, and the snapshot round 1 takes so round 2
8
8
  // can name the fix delta — and copying the payload type, its validation, the guarded read and the
9
9
  // comparison into a second module is the clone `CLAUDE.md` prohibits. What genuinely differs between
@@ -48,6 +48,14 @@ interface FileMapStamp {
48
48
  // reads it and the two `josh review:brief` records, which assert a completed past fact by
49
49
  // existing at all, neither write nor read it.
50
50
  completed_at?: string
51
+ // The git blob of each mapped path as it was read — written only by the round-1 review snapshot
52
+ // (`review-round-one-blobs.ts`). When `base` moves, round 2 carries these onto the new base and
53
+ // measures the fix delta from there; a record without them falls back to the moved-base refusal.
54
+ blobs?: Record<string, string>
55
+ // The fingerprint of what the vouched check reads beside the files — its tools' versions and its
56
+ // environment (`verification-inputs.ts`, joshuafolkken/kit#4495). Written by a record created with an
57
+ // `inputs` source; a reader of such a record refuses one whose fingerprint is absent or differs.
58
+ inputs?: string
51
59
  }
52
60
 
53
61
  // Takes `unknown` rather than the declared field type, because the declared type is an assertion
@@ -64,28 +72,38 @@ function is_file_map(value: unknown): value is Record<string, string> {
64
72
  // reader treats an absent field as the safe answer — "not running" for a `pid`, "cannot be reused"
65
73
  // for a `base`. Spread rather than assigned, because `exactOptionalPropertyTypes` makes an explicit
66
74
  // `undefined` a different thing from an absent key.
67
- function optional_fields(
68
- pid: unknown,
69
- base: unknown,
70
- completed_at: unknown,
71
- process_start: unknown,
72
- ): Partial<FileMapStamp> {
75
+ function identity_fields({ pid, process_start }: Partial<FileMapStamp>): Partial<FileMapStamp> {
73
76
  return {
74
77
  ...(typeof pid === 'number' && { pid }),
78
+ ...(typeof process_start === 'string' && { process_start }),
79
+ }
80
+ }
81
+
82
+ function tree_fields({ base, completed_at, blobs }: Partial<FileMapStamp>): Partial<FileMapStamp> {
83
+ return {
75
84
  ...(typeof base === 'string' && { base }),
76
85
  ...(typeof completed_at === 'string' && { completed_at }),
77
- ...(typeof process_start === 'string' && { process_start }),
86
+ ...(is_file_map(blobs) && { blobs }),
78
87
  }
79
88
  }
80
89
 
90
+ function input_fields({ inputs }: Partial<FileMapStamp>): Partial<FileMapStamp> {
91
+ return typeof inputs === 'string' ? { inputs } : {}
92
+ }
93
+
81
94
  function parse_stamp(raw: string): FileMapStamp | undefined {
82
- const { taken_at, files, pid, base, completed_at, process_start } = JSON.parse(
83
- raw,
84
- ) as Partial<FileMapStamp>
95
+ const parsed = JSON.parse(raw) as Partial<FileMapStamp>
96
+ const { taken_at, files } = parsed
85
97
 
86
98
  if (typeof taken_at !== 'string' || !is_file_map(files)) return undefined
87
99
 
88
- return { taken_at, files, ...optional_fields(pid, base, completed_at, process_start) }
100
+ return {
101
+ taken_at,
102
+ files,
103
+ ...identity_fields(parsed),
104
+ ...tree_fields(parsed),
105
+ ...input_fields(parsed),
106
+ }
89
107
  }
90
108
 
91
109
  // Whether the process that wrote this record is still running. It takes the
@@ -152,14 +170,22 @@ function changed_since(stamp: FileMapStamp, tree: Record<string, string>): Reado
152
170
  interface FileMapStampAccess {
153
171
  stamp_path: () => string
154
172
  // `base` is written by the one record that is acted on rather than merely reported — the
155
- // green-gate reuse. The others omit it and are unaffected.
156
- write: (files: Record<string, string>, target?: string, base?: string) => string
173
+ // green-gate reuse. The others omit it and are unaffected. `blobs` is the round-1 snapshot's alone.
174
+ write: (
175
+ files: Record<string, string>,
176
+ target?: string,
177
+ base?: string,
178
+ blobs?: Record<string, string>,
179
+ ) => string
157
180
  // Marks an existing record as belonging to a run that finished. It
158
181
  // amends rather than rewrites, and answers `undefined` where there is no record to amend: a run
159
182
  // whose record never got written has nothing to assert a completion about, and inventing one here
160
183
  // would manufacture the very vouching the field exists to withhold.
161
184
  complete: (target?: string) => string | undefined
162
185
  read: (source?: string) => FileMapStamp | undefined
186
+ // Whether `stamp` was written under the inputs fingerprint read now; always `true` for a record
187
+ // created without an `inputs` source, which never vouches for a check.
188
+ describes_inputs: (stamp: FileMapStamp) => boolean
163
189
  // For a record whose meaning is its existence rather than its contents — the in-flight gate marker.
164
190
  // A record nobody removes would go on asserting a gate that ended.
165
191
  remove: (target?: string) => void
@@ -219,7 +245,11 @@ function complete_at(target: string): string | undefined {
219
245
  // The destination is a parameter on both sides so a test can exercise the round trip without
220
246
  // overwriting the record a real run may be relying on — two commands share one path by design, and a
221
247
  // suite that wrote to it would be a second writer nobody declared.
222
- function create(prefix: string, root?: string): FileMapStampAccess {
248
+ //
249
+ // `inputs` answers the fingerprint of what the record vouches for beside its files
250
+ // (`verification-inputs.ts`); it is read at each write and each comparison, so a tool reinstalled or an
251
+ // environment variable changed between them leaves the record standing for nobody.
252
+ function create(prefix: string, root?: string, inputs?: () => string): FileMapStampAccess {
223
253
  function resolve(): string {
224
254
  return stamp_file.stamp_path(prefix, root)
225
255
  }
@@ -229,15 +259,18 @@ function create(prefix: string, root?: string): FileMapStampAccess {
229
259
  // `base` goes into the payload undefined and all — `JSON.stringify` drops an undefined value,
230
260
  // so a caller that has no base writes exactly the record it wrote before this field existed.
231
261
  // `own_fields` is what writes the pid, and the writing process's start time beside it — assembled in one place so no record can carry half an identity.
232
- write: (files, target = resolve(), base?: string) =>
262
+ write: (files, target = resolve(), base?: string, blobs?: Record<string, string>) =>
233
263
  stamp_file.write_stamp(target, {
234
264
  taken_at: new Date().toISOString(),
235
265
  files,
236
266
  ...process_identity.own_fields(),
237
267
  base,
268
+ blobs,
269
+ inputs: inputs?.(),
238
270
  }),
239
271
  complete: (target = resolve()) => complete_at(target),
240
272
  read: (source = resolve()) => read_at(source),
273
+ describes_inputs: (stamp) => inputs === undefined || stamp.inputs === inputs(),
241
274
  remove: (target = resolve()) => {
242
275
  stamp_file.remove_stamp(target)
243
276
  },