@joshuafolkken/kit 1.1514.0 → 1.1784.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (858) hide show
  1. package/.claude/agents/investigator.md +1 -1
  2. package/.claude/settings.json +5 -5
  3. package/.claude/skills/epic-commands/SKILL.md +26 -65
  4. package/.claude/skills/epic-commands/epic-bundle.md +3 -1
  5. package/.claude/skills/workflow-commands/SKILL.md +5 -5
  6. package/.claude/skills/workflow-commands/background-commands.md +5 -5
  7. package/.claude/skills/workflow-commands/backlogrun-child.md +10 -8
  8. package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +7 -25
  9. package/.claude/skills/workflow-commands/backlogrun-lanes.md +17 -13
  10. package/.claude/skills/workflow-commands/backlogrun-park.md +14 -23
  11. package/.claude/skills/workflow-commands/backlogrun-progress.md +2 -2
  12. package/.claude/skills/workflow-commands/backlogrun-recovery.md +5 -5
  13. package/.claude/skills/workflow-commands/backlogrun-steps.md +10 -10
  14. package/.claude/skills/workflow-commands/backlogrun.md +1 -1
  15. package/.claude/skills/workflow-commands/chain-rule.md +13 -7
  16. package/.claude/skills/workflow-commands/delegation.md +6 -5
  17. package/.claude/skills/workflow-commands/entry-sequence.md +9 -9
  18. package/.claude/skills/workflow-commands/followup.md +9 -31
  19. package/.claude/skills/workflow-commands/fullrun-steps.md +36 -45
  20. package/.claude/skills/workflow-commands/fullrun.md +2 -2
  21. package/.claude/skills/workflow-commands/halfrun.md +17 -25
  22. package/.claude/skills/workflow-commands/issue-comments.md +16 -12
  23. package/.claude/skills/workflow-commands/issue-scout.md +2 -2
  24. package/.claude/skills/workflow-commands/kickoff.md +24 -23
  25. package/.claude/skills/workflow-commands/latest-gate.md +7 -12
  26. package/.claude/skills/workflow-commands/needs-human-review.md +9 -14
  27. package/.claude/skills/workflow-commands/observation-filing.md +4 -36
  28. package/.claude/skills/workflow-commands/observation-ledger.md +1 -1
  29. package/.claude/skills/workflow-commands/pre-gate-cut.md +13 -30
  30. package/.claude/skills/workflow-commands/prerequisite.md +10 -16
  31. package/.claude/skills/workflow-commands/progress-watcher.md +1 -1
  32. package/.claude/skills/workflow-commands/prrun.md +3 -7
  33. package/.claude/skills/workflow-commands/retrospective.md +1 -1
  34. package/.claude/skills/workflow-commands/split-assessment.md +13 -1
  35. package/.claude/skills/workflow-commands/working-tree-hold.md +9 -9
  36. package/.codex/hooks.json +5 -5
  37. package/.github/actions/setup-node/action.yml +9 -0
  38. package/.github/actions/setup-pnpm/action.yml +1 -1
  39. package/.github/dependabot.yml +16 -0
  40. package/.github/release.yml +0 -2
  41. package/.github/workflows/ci.yml +120 -10
  42. package/.github/workflows/publish.yml +8 -1
  43. package/.github/workflows/sonar-qube.yml +1 -0
  44. package/.prettierignore +2 -0
  45. package/.vscode/tasks.json +1 -2
  46. package/CLAUDE.md +3 -7
  47. package/README.md +4 -2
  48. package/SECURITY.md +1 -1
  49. package/dist/CLAUDE.md +3 -7
  50. package/dist/commands/document-read-cli.js +882 -0
  51. package/dist/commands/{document-section-cli.js → document-section-main.js} +79 -37
  52. package/dist/commands/read-set-cli.js +1867 -0
  53. package/dist/commands/run-prep-main.js +21653 -0
  54. package/dist/commands/run-step-cli.js +23880 -0
  55. package/dist/config-merge/index.js +5 -1
  56. package/dist/hooks/audit-provision.js +20 -35
  57. package/dist/hooks/{chunk-DGT54IH5.js → chunk-AZX4FGQ3.js} +63 -17
  58. package/dist/hooks/chunk-CWMBGKYW.js +6483 -0
  59. package/dist/hooks/chunk-O2YBIDSI.js +4306 -0
  60. package/dist/hooks/{chunk-TNUMY6NL.js → chunk-PT5R6UJD.js} +4193 -1900
  61. package/dist/hooks/chunk-TUIFS5E7.js +72 -0
  62. package/dist/hooks/{chunk-723HKZO5.js → chunk-VWWCFGWK.js} +1 -1
  63. package/dist/hooks/{chunk-APUO6U4J.js → chunk-WR2KQAYZ.js} +1843 -440
  64. package/dist/hooks/{chunk-O6GDRNJB.js → chunk-XGBNSWEI.js} +248 -46
  65. package/dist/hooks/chunk-YCDOIR3I.js +3456 -0
  66. package/dist/hooks/codex-hook-adapter.js +10 -22
  67. package/dist/hooks/format-edited.js +5 -6
  68. package/dist/hooks/inputs.json +443 -317
  69. package/dist/hooks/pretool-guard.js +7 -25
  70. package/dist/hooks/session-lang.js +44 -51
  71. package/dist/hooks/stop-guard.js +7716 -2187
  72. package/dist/josh.js +6002 -3583
  73. package/dist/self-sync-guard/index.js +74 -10
  74. package/dist/version/index.js +115 -406
  75. package/eslint/base.js +1 -1
  76. package/lefthook/base.yml +3 -1
  77. package/package.json +10 -48
  78. package/pnpm-workspace.yaml +4 -2
  79. package/prompts/coding-standards.md +1 -1
  80. package/prompts/collaboration-workflow/file-edits.md +1 -7
  81. package/prompts/collaboration-workflow/issue-citation.md +1 -1
  82. package/prompts/collaboration-workflow/issue-template.md +33 -16
  83. package/prompts/collaboration-workflow/lane-instructions.md +1 -2
  84. package/prompts/collaboration-workflow/measurement.md +37 -0
  85. package/prompts/collaboration-workflow/operating-rules.md +4 -6
  86. package/prompts/collaboration-workflow/output-bounds.md +2 -7
  87. package/prompts/collaboration-workflow/plan-comment.md +3 -42
  88. package/prompts/collaboration-workflow/principles.md +5 -0
  89. package/prompts/collaboration-workflow/report-format.md +31 -60
  90. package/prompts/collaboration-workflow/residency.md +2 -2
  91. package/prompts/collaboration-workflow/shell-body.md +6 -16
  92. package/prompts/collaboration-workflow/turn-batching.md +0 -2
  93. package/prompts/collaboration-workflow/upstream-interrupt.md +14 -4
  94. package/prompts/collaboration-workflow/wip-cap.md +1 -1
  95. package/prompts/collaboration-workflow.md +3 -7
  96. package/prompts/refactoring.md +1 -1
  97. package/prompts/review-rubric.md +1 -2
  98. package/prompts/review.md +41 -21
  99. package/prompts/testing-guide.md +8 -43
  100. package/scripts/agent/agent-event.ts +15 -15
  101. package/scripts/agent/agent-exit-record.ts +13 -1
  102. package/scripts/agent/api-auth.ts +41 -0
  103. package/scripts/agent/api-outage.ts +1 -1
  104. package/scripts/auto-ok/auto-ok-cli.ts +14 -16
  105. package/scripts/auto-ok/auto-ok-judge-read.ts +12 -3
  106. package/scripts/auto-ok/auto-ok-judge-write.ts +46 -19
  107. package/scripts/auto-ok/auto-ok-judge.ts +13 -2
  108. package/scripts/auto-ok/auto-ok-main.ts +17 -0
  109. package/scripts/backlog/backlog-arrival.ts +14 -3
  110. package/scripts/backlog/backlog-budget-cli.ts +7 -33
  111. package/scripts/backlog/backlog-budget-main.ts +16 -0
  112. package/scripts/backlog/backlog-budget.ts +2 -3
  113. package/scripts/backlog/backlog-defect-priority.ts +4 -3
  114. package/scripts/backlog/backlog-drive-adopt.ts +67 -0
  115. package/scripts/backlog/backlog-drive-args.ts +4 -5
  116. package/scripts/backlog/backlog-drive-cli.ts +113 -28
  117. package/scripts/backlog/backlog-drive-hold.ts +162 -0
  118. package/scripts/backlog/backlog-drive-idle.ts +151 -0
  119. package/scripts/backlog/backlog-drive-judge.ts +25 -0
  120. package/scripts/backlog/backlog-drive-memory.ts +126 -0
  121. package/scripts/backlog/backlog-drive-named-offer.ts +5 -10
  122. package/scripts/backlog/backlog-drive-named.ts +53 -6
  123. package/scripts/backlog/backlog-drive-offer-argv.ts +3 -8
  124. package/scripts/backlog/backlog-drive-paused.ts +169 -0
  125. package/scripts/backlog/backlog-drive-restore.ts +30 -7
  126. package/scripts/backlog/backlog-drive-seats.ts +18 -8
  127. package/scripts/backlog/backlog-drive-token-handling.ts +38 -0
  128. package/scripts/backlog/backlog-drive.ts +79 -75
  129. package/scripts/backlog/backlog-next-main.ts +16 -0
  130. package/scripts/backlog/backlog-next-shared.ts +73 -0
  131. package/scripts/backlog/backlog-next.ts +48 -16
  132. package/scripts/backlog/backlog-occupied.ts +52 -39
  133. package/scripts/backlog/backlog-offer-cli.ts +6 -21
  134. package/scripts/backlog/backlog-offer-exclude.ts +15 -0
  135. package/scripts/backlog/backlog-offer-main.ts +12 -0
  136. package/scripts/backlog/backlog-offer.ts +36 -3
  137. package/scripts/backlog/backlog-overlap.ts +22 -4
  138. package/scripts/backlog/backlog-plan-read.ts +6 -2
  139. package/scripts/backlog/backlog-plan.ts +18 -4
  140. package/scripts/backlog/backlog-pool.ts +10 -10
  141. package/scripts/backlog/backlog-rank.ts +10 -2
  142. package/scripts/backlog/backlog-ready.ts +112 -30
  143. package/scripts/backlog/backlog-stalled-detect.ts +109 -36
  144. package/scripts/backlog/backlog-stalled.ts +52 -16
  145. package/scripts/backlog/backlog-wait-cause.ts +86 -0
  146. package/scripts/backlog/backlog-waves.ts +39 -13
  147. package/scripts/backlog/backlogrun-args.ts +19 -7
  148. package/scripts/backlog/backlogrun-cli.ts +19 -5
  149. package/scripts/backlog/backlogrun-launch.ts +6 -0
  150. package/scripts/backlog/backlogrun-restart.ts +97 -0
  151. package/scripts/backlog/backlogrun-stop.ts +79 -7
  152. package/scripts/behavior/behavior-cli.ts +2 -2
  153. package/scripts/behavior/behavior-rules.ts +47 -24
  154. package/scripts/build/build-bin.ts +2 -16
  155. package/scripts/build/build-claude-md.ts +0 -7
  156. package/scripts/build/build-commands.ts +0 -13
  157. package/scripts/build/build-hooks.ts +49 -48
  158. package/scripts/build/hook-bundle-stamp.ts +29 -11
  159. package/scripts/build/local-bin.ts +1 -1
  160. package/scripts/cases/cases-cli.ts +25 -13
  161. package/scripts/cases/cases-interaction-scan.ts +134 -0
  162. package/scripts/cases/cases-interaction.ts +183 -0
  163. package/scripts/cases/cases-logic.ts +39 -6
  164. package/scripts/ci/pr-classification-main.ts +18 -0
  165. package/scripts/ci/pr-classification.ts +10 -17
  166. package/scripts/clone/clone-scan.ts +1 -1
  167. package/scripts/cost-runtime/cost-blocks.ts +22 -37
  168. package/scripts/cost-runtime/cost-cli.ts +31 -14
  169. package/scripts/cost-runtime/cost-main.ts +12 -0
  170. package/scripts/cost-runtime/cost-transcript.ts +1 -0
  171. package/scripts/delegation/delegation-policy.ts +17 -4
  172. package/scripts/delegation/duplicate-read-guard.ts +0 -8
  173. package/scripts/delegation/investigation-guard.ts +0 -8
  174. package/scripts/delegation/investigation-reads.ts +3 -4
  175. package/scripts/dependabot/dependabot-cooldown.ts +194 -0
  176. package/scripts/discovery/repo-discovery.ts +24 -6
  177. package/scripts/doctor/doctor-consumer.ts +2 -5
  178. package/scripts/document/document-byte-budget.ts +8 -6
  179. package/scripts/document/document-scan.ts +1 -1
  180. package/scripts/document/document-section-cli.ts +0 -8
  181. package/scripts/document/document-section-main.ts +12 -0
  182. package/scripts/epic/epic-audit-cli.ts +12 -6
  183. package/scripts/epic/epic-bundle-apply.ts +137 -0
  184. package/scripts/epic/epic-bundle-cli.ts +32 -121
  185. package/scripts/epic/epic-bundle-format.ts +116 -0
  186. package/scripts/epic/epic-bundle-main.ts +17 -0
  187. package/scripts/epic/epic-busy.ts +5 -12
  188. package/scripts/epic/epic-classify.ts +24 -15
  189. package/scripts/epic/epic-cli-argv.ts +31 -0
  190. package/scripts/epic/epic-cli-decide.ts +42 -0
  191. package/scripts/epic/epic-cli.ts +6 -38
  192. package/scripts/epic/epic-close.ts +112 -55
  193. package/scripts/epic/epic-cross-repo.ts +4 -7
  194. package/scripts/epic/epic-decide.ts +119 -0
  195. package/scripts/epic/epic-decision.ts +9 -0
  196. package/scripts/epic/epic-fetch.ts +4 -0
  197. package/scripts/epic/epic-graph.ts +2 -0
  198. package/scripts/epic/epic-issue.ts +5 -1
  199. package/scripts/epic/epic-label-age.ts +1 -1
  200. package/scripts/epic/epic-lane-offer.ts +39 -4
  201. package/scripts/epic/epic-next-main.ts +24 -0
  202. package/scripts/epic/epic-next.ts +6 -24
  203. package/scripts/epic/epic-outside-blocker.ts +6 -2
  204. package/scripts/epic/epic-parse.ts +9 -3
  205. package/scripts/epic/epic-read.ts +1 -0
  206. package/scripts/epic/epic-reconcile.ts +39 -0
  207. package/scripts/epic/epic-run.ts +10 -1
  208. package/scripts/epic/epic-solo.ts +50 -14
  209. package/scripts/epic/epic.ts +41 -7
  210. package/scripts/exports/unused-members-cli.ts +2 -2
  211. package/scripts/followup/followup-checks-event.ts +8 -3
  212. package/scripts/followup/followup-coderabbit-wait.ts +82 -0
  213. package/scripts/followup/followup-review-gates.ts +81 -0
  214. package/scripts/followup/git-followup-stages.ts +13 -3
  215. package/scripts/followup/git-followup-workflow.ts +19 -66
  216. package/scripts/followup/git-pr-followup-wrapup.ts +9 -14
  217. package/scripts/followup/git-pr-followup.ts +36 -8
  218. package/scripts/fresh-machine/fresh-machine-cli.ts +1 -1
  219. package/scripts/fresh-machine/fresh-machine-run.ts +8 -8
  220. package/scripts/fresh-machine/specs/kit-test-backlogrun.json +1 -1
  221. package/scripts/gate/busy-average.ts +58 -0
  222. package/scripts/gate/check-cpu.ts +60 -0
  223. package/scripts/gate/check-inputs.ts +39 -95
  224. package/scripts/gate/check-reuse.ts +33 -54
  225. package/scripts/gate/command-memory.ts +192 -0
  226. package/scripts/gate/core-admission.ts +218 -28
  227. package/scripts/gate/core-budget-timing.ts +37 -0
  228. package/scripts/gate/core-budget.ts +80 -98
  229. package/scripts/gate/core-wait-record.ts +48 -0
  230. package/scripts/gate/core-wait.ts +37 -5
  231. package/scripts/gate/core-weights.ts +86 -0
  232. package/scripts/gate/free-cores.ts +27 -4
  233. package/scripts/gate/gate-ledger.ts +32 -4
  234. package/scripts/gate/gate-plan.ts +41 -34
  235. package/scripts/gate/gate-report.ts +14 -2
  236. package/scripts/gate/gate-run-steps.ts +53 -8
  237. package/scripts/gate/gate-skip.ts +12 -2
  238. package/scripts/gate/gate-steps.ts +12 -1
  239. package/scripts/gate/input-fingerprint.ts +42 -0
  240. package/scripts/gate/machine-capacity.ts +65 -31
  241. package/scripts/gate/moved-paths.ts +67 -0
  242. package/scripts/gate/project-checks.ts +5 -12
  243. package/scripts/gate/scoped-green.ts +12 -8
  244. package/scripts/gate/since-green.ts +62 -0
  245. package/scripts/gate/toolchain-inputs.ts +115 -0
  246. package/scripts/gate/verification-gate.ts +27 -24
  247. package/scripts/gate/verification-inputs.ts +250 -0
  248. package/scripts/gh/gh-author-association.ts +96 -9
  249. package/scripts/gh/git-ai-review-scan.ts +4 -2
  250. package/scripts/gh/git-gh-api-path.ts +15 -0
  251. package/scripts/gh/git-gh-branch-rules.ts +73 -0
  252. package/scripts/gh/git-gh-conditional.ts +5 -2
  253. package/scripts/gh/git-gh-issue-read.ts +5 -1
  254. package/scripts/gh/git-gh-issue-write.ts +67 -29
  255. package/scripts/gh/git-gh-issue.ts +7 -3
  256. package/scripts/gh/git-gh-poll-read.ts +89 -0
  257. package/scripts/gh/git-gh-pr-auto-merge.ts +8 -3
  258. package/scripts/gh/git-gh-pr-rest.ts +1 -1
  259. package/scripts/gh/git-gh-pr-snapshot.ts +33 -20
  260. package/scripts/gh/git-gh-pr.ts +27 -15
  261. package/scripts/gh/git-pr-checks-eval.ts +39 -7
  262. package/scripts/gh/git-pr-checks-parse.ts +39 -9
  263. package/scripts/gh/git-pr-merge-checked.ts +80 -0
  264. package/scripts/git/base-tree.ts +19 -2
  265. package/scripts/git/changed-file-scope.ts +6 -4
  266. package/scripts/git/changed-paths.ts +18 -1
  267. package/scripts/git/git-diff-reads.ts +27 -2
  268. package/scripts/git/git-grep-hits.ts +85 -0
  269. package/scripts/git/git-location-environment.ts +1 -1
  270. package/scripts/git/git-merge-conflicts.ts +83 -0
  271. package/scripts/git/git-preflight.ts +37 -12
  272. package/scripts/git/git-push-transport.ts +1 -2
  273. package/scripts/git/git-schemas.ts +17 -7
  274. package/scripts/git/git-spawn.ts +1 -2
  275. package/scripts/git/git-status.ts +4 -4
  276. package/scripts/git/main-merge-main.ts +12 -0
  277. package/scripts/git/main-merge-regenerate.ts +2 -2
  278. package/scripts/git/main-merge.ts +25 -9
  279. package/scripts/git/main-sync-main.ts +12 -0
  280. package/scripts/git/main-sync.ts +0 -9
  281. package/scripts/git/stash/git-stash.ts +27 -4
  282. package/scripts/git/stash/{stash-pop-args.ts → stash-args.ts} +13 -10
  283. package/scripts/git/stash/stash-pop-cli.ts +6 -12
  284. package/scripts/git/stash/stash-pop-main.ts +12 -0
  285. package/scripts/git/stash/stash-push-cli.ts +76 -0
  286. package/scripts/git/stash/stash-push-main.ts +12 -0
  287. package/scripts/hooks/batch-guard.ts +0 -8
  288. package/scripts/hooks/check-commit-message-main.ts +8 -0
  289. package/scripts/hooks/check-commit-message.ts +4 -7
  290. package/scripts/hooks/format-edited-file.ts +8 -24
  291. package/scripts/hooks/pre-commit-lint.ts +30 -3
  292. package/scripts/hooks/pre-push-unit.ts +4 -2
  293. package/scripts/hooks/pretool-guard-cli.ts +1 -8
  294. package/scripts/hooks/pretool-guard.ts +32 -19
  295. package/scripts/hooks/reserved-run.ts +67 -9
  296. package/scripts/hooks/run-hook.sh +13 -4
  297. package/scripts/hooks/shell-rules-notice.ts +37 -0
  298. package/scripts/hooks/stop-actions.ts +2 -21
  299. package/scripts/hooks/stop-guard.ts +13 -9
  300. package/scripts/init/hook-command-rewrite.ts +19 -5
  301. package/scripts/init/hook-launch.ts +15 -17
  302. package/scripts/init/init-actions.ts +0 -6
  303. package/scripts/init/init-ai-copy.ts +10 -36
  304. package/scripts/init/init-bootstrap.ts +9 -8
  305. package/scripts/init/init-dry-run-report.ts +1 -1
  306. package/scripts/init/init-dry-run.ts +1 -1
  307. package/scripts/init/init-file-action.ts +7 -9
  308. package/scripts/init/init-logic-json-merge.ts +2 -2
  309. package/scripts/init/init-logic-migrate.ts +9 -82
  310. package/scripts/init/init-logic.ts +3 -2
  311. package/scripts/init/init-main.ts +12 -0
  312. package/scripts/init/init.ts +5 -12
  313. package/scripts/init/kit-development-versions.ts +3 -7
  314. package/scripts/init/kit-written-paths.ts +2 -2
  315. package/scripts/init/project-profile.ts +5 -4
  316. package/scripts/init/tsconfig-preset-migration.ts +2 -1
  317. package/scripts/init/vscode-tasks.ts +1 -1
  318. package/scripts/issue/defect-origin-cli.ts +106 -0
  319. package/scripts/issue/defect-origin-line.ts +60 -0
  320. package/scripts/issue/defect-origin-main.ts +11 -0
  321. package/scripts/issue/defect-origin.ts +114 -0
  322. package/scripts/issue/defect-rate-cli.ts +34 -78
  323. package/scripts/issue/defect-rate.ts +0 -16
  324. package/scripts/issue/defect-report-cli.ts +128 -0
  325. package/scripts/issue/defect-report-format.ts +56 -0
  326. package/scripts/issue/defect-report-main.ts +11 -0
  327. package/scripts/issue/defect-report.ts +160 -0
  328. package/scripts/issue/expected-effect-lint.ts +1 -0
  329. package/scripts/issue/issue-already-done-cli.ts +62 -0
  330. package/scripts/issue/issue-body-or-comment.ts +40 -0
  331. package/scripts/issue/issue-cite-cli.ts +0 -9
  332. package/scripts/issue/issue-cite-main.ts +12 -0
  333. package/scripts/issue/issue-classification.ts +12 -7
  334. package/scripts/issue/issue-comment-cli.ts +10 -24
  335. package/scripts/issue/issue-comment-main.ts +12 -0
  336. package/scripts/issue/issue-evidence-exit.ts +100 -0
  337. package/scripts/issue/issue-file-cli.ts +29 -7
  338. package/scripts/issue/issue-file.ts +19 -19
  339. package/scripts/issue/issue-fold-cli.ts +2 -11
  340. package/scripts/issue/issue-fold-main.ts +12 -0
  341. package/scripts/issue/issue-labels.ts +81 -90
  342. package/scripts/issue/issue-lint-cli.ts +2 -10
  343. package/scripts/issue/issue-lint-main.ts +12 -0
  344. package/scripts/issue/issue-measured-cli.ts +56 -0
  345. package/scripts/issue/issue-merged.ts +19 -2
  346. package/scripts/issue/issue-not-before-label.ts +135 -0
  347. package/scripts/issue/issue-not-before.ts +111 -0
  348. package/scripts/issue/issue-number-shape.ts +15 -1
  349. package/scripts/issue/issue-park.ts +28 -0
  350. package/scripts/issue/issue-plan-cli.ts +151 -0
  351. package/scripts/issue/issue-priority.ts +151 -0
  352. package/scripts/issue/issue-rank.ts +7 -1
  353. package/scripts/issue/issue-read-cli.ts +3 -10
  354. package/scripts/issue/issue-read-main.ts +12 -0
  355. package/scripts/issue/issue-read.ts +29 -5
  356. package/scripts/issue/issue-release-cli.ts +0 -10
  357. package/scripts/issue/issue-release-main.ts +13 -0
  358. package/scripts/issue/issue-release.ts +7 -12
  359. package/scripts/issue/issue-sample-gate.ts +192 -0
  360. package/scripts/issue/issue-sample-source.ts +76 -0
  361. package/scripts/issue/issue-scout-cli.ts +0 -11
  362. package/scripts/issue/issue-scout-main.ts +14 -0
  363. package/scripts/issue/issue-state-cli.ts +0 -10
  364. package/scripts/issue/issue-state-main.ts +12 -0
  365. package/scripts/issue/issue-watch-diff.ts +56 -15
  366. package/scripts/issue/issue-watch.ts +2 -1
  367. package/scripts/issue/issue-wip.ts +2 -7
  368. package/scripts/issue/measure-rerun-cli.ts +13 -8
  369. package/scripts/issue/plan-consumers-cli.ts +39 -0
  370. package/scripts/issue/plan-consumers-main.ts +11 -0
  371. package/scripts/issue/plan-consumers-section.ts +55 -0
  372. package/scripts/issue/plan-consumers.ts +127 -0
  373. package/scripts/josh/agent-session-environment.ts +1 -1
  374. package/scripts/josh/command-usage.ts +15 -43
  375. package/scripts/josh/file-map-stamp.ts +49 -16
  376. package/scripts/josh/hook-decision.ts +32 -20
  377. package/scripts/josh/josh-command-map.ts +4 -1
  378. package/scripts/josh/josh-command-types.ts +12 -6
  379. package/scripts/josh/josh-commands-agent-hooks.ts +83 -0
  380. package/scripts/josh/josh-commands-ai.ts +157 -158
  381. package/scripts/josh/josh-commands-backlog.ts +82 -16
  382. package/scripts/josh/josh-commands-clone.ts +1 -0
  383. package/scripts/josh/josh-commands-development.ts +111 -71
  384. package/scripts/josh/josh-commands-document.ts +43 -1
  385. package/scripts/josh/josh-commands-epic.ts +171 -0
  386. package/scripts/josh/josh-commands-hooks.ts +25 -2
  387. package/scripts/josh/josh-commands-issue-write.ts +181 -0
  388. package/scripts/josh/josh-commands-issue.ts +124 -24
  389. package/scripts/josh/josh-commands-lane.ts +103 -2
  390. package/scripts/josh/josh-commands-lint.ts +19 -8
  391. package/scripts/josh/josh-commands-maintenance.ts +112 -4
  392. package/scripts/josh/josh-commands-pause.ts +29 -0
  393. package/scripts/josh/josh-commands-progress.ts +87 -0
  394. package/scripts/josh/josh-commands-project.ts +138 -9
  395. package/scripts/josh/josh-commands-review.ts +124 -0
  396. package/scripts/josh/josh-commands-run.ts +211 -23
  397. package/scripts/josh/josh-commands-ship.ts +169 -0
  398. package/scripts/josh/josh-commands-split.ts +9 -0
  399. package/scripts/josh/josh-commands-versioning.ts +49 -2
  400. package/scripts/josh/josh-commands-workflow.ts +144 -6
  401. package/scripts/josh/josh-logic.ts +6 -13
  402. package/scripts/josh/package-directory.ts +2 -4
  403. package/scripts/josh/process-identity.ts +13 -4
  404. package/scripts/josh/session-language-cli.ts +4 -8
  405. package/scripts/josh/session-language-main.ts +13 -0
  406. package/scripts/josh/session-language.ts +6 -1
  407. package/scripts/josh/shared-cache.ts +90 -0
  408. package/scripts/josh/stamp-file.ts +9 -15
  409. package/scripts/lane/lane-await.ts +51 -12
  410. package/scripts/lane/lane-cache.ts +5 -30
  411. package/scripts/lane/lane-capacity.ts +14 -23
  412. package/scripts/lane/lane-check-stats.ts +62 -21
  413. package/scripts/lane/lane-child-invocation.ts +8 -0
  414. package/scripts/lane/lane-cli.ts +15 -5
  415. package/scripts/lane/lane-close.ts +86 -18
  416. package/scripts/lane/lane-core-wait-stats.ts +66 -0
  417. package/scripts/lane/lane-dispatch.ts +24 -3
  418. package/scripts/lane/lane-gap-stats.ts +156 -0
  419. package/scripts/lane/lane-handoff.ts +69 -1
  420. package/scripts/lane/lane-held-stats.ts +129 -0
  421. package/scripts/lane/lane-install.ts +4 -11
  422. package/scripts/lane/lane-launch-cli.ts +0 -9
  423. package/scripts/lane/lane-launch-main.ts +12 -0
  424. package/scripts/lane/lane-ledger-schema.ts +266 -0
  425. package/scripts/lane/lane-ledger.ts +92 -123
  426. package/scripts/lane/lane-limit-cli.ts +12 -1
  427. package/scripts/lane/lane-measure-cli.ts +57 -11
  428. package/scripts/lane/lane-open.ts +9 -1
  429. package/scripts/lane/lane-parked.ts +3 -3
  430. package/scripts/lane/lane-pause-cli.ts +130 -0
  431. package/scripts/lane/lane-pause.ts +158 -0
  432. package/scripts/lane/lane-process-table.ts +166 -0
  433. package/scripts/lane/lane-reap-settle.ts +124 -0
  434. package/scripts/lane/lane-reap.ts +50 -15
  435. package/scripts/lane/lane-registry.ts +24 -3
  436. package/scripts/lane/lane-residents.ts +162 -0
  437. package/scripts/lane/lane-restart.ts +22 -2
  438. package/scripts/lane/lane-round-two-stats.ts +49 -0
  439. package/scripts/lane/lane-sampler.ts +4 -0
  440. package/scripts/lane/lane-session-action.ts +19 -5
  441. package/scripts/lane/lane-session-broker.ts +102 -21
  442. package/scripts/lane/lane-snapshot-trace.ts +84 -0
  443. package/scripts/lane/lane-spans.ts +51 -0
  444. package/scripts/lane/lane-spent.ts +6 -3
  445. package/scripts/lane/lane-stage-stats.ts +7 -2
  446. package/scripts/lane/lane-state.ts +302 -0
  447. package/scripts/lane/lane-stats.ts +58 -4
  448. package/scripts/lane/lane-stop-stats.ts +113 -37
  449. package/scripts/lane/lane-test-related-stats.ts +127 -0
  450. package/scripts/lane/lane-transcript-calls.ts +145 -0
  451. package/scripts/lane/lane-transcript-stats.ts +168 -0
  452. package/scripts/lane/lane-vacant.ts +13 -3
  453. package/scripts/lane/lane-withdraw-cli.ts +5 -4
  454. package/scripts/lane/lane-withdraw.ts +50 -49
  455. package/scripts/lane/process-directories.ts +70 -0
  456. package/scripts/lane/process-lane-marks.ts +94 -0
  457. package/scripts/lib/atomic-write.ts +62 -0
  458. package/scripts/lib/buffered-process.ts +12 -5
  459. package/scripts/lib/cli-flags.ts +53 -0
  460. package/scripts/lib/figure-format.ts +63 -0
  461. package/scripts/lib/json-value.ts +9 -1
  462. package/scripts/lib/package-manifest.ts +35 -0
  463. package/scripts/lib/read-file.ts +3 -1
  464. package/scripts/lib/stamped-memo.ts +63 -0
  465. package/scripts/lib/stdout-on-stderr.ts +24 -0
  466. package/scripts/lib/timeouts.ts +9 -0
  467. package/scripts/lib/transcript-record.ts +91 -0
  468. package/scripts/lines/effective-limit.ts +1 -1
  469. package/scripts/lint/eslint-cache-dependencies.ts +145 -0
  470. package/scripts/lint/eslint-daemon.ts +265 -0
  471. package/scripts/lint/format.ts +11 -2
  472. package/scripts/lint/import-graph.ts +279 -0
  473. package/scripts/lint/lint-gate-scope.ts +102 -0
  474. package/scripts/lint/lint-parallel-main.ts +19 -0
  475. package/scripts/lint/lint-parallel.ts +62 -30
  476. package/scripts/lint/lint-related-scope.ts +30 -24
  477. package/scripts/lint/lint-related.ts +38 -6
  478. package/scripts/notify/confirmation-options.ts +1 -2
  479. package/scripts/notify/telegram-notify.ts +20 -20
  480. package/scripts/notify/telegram-test-logic.ts +0 -1
  481. package/scripts/notify/telegram-test-main.ts +8 -0
  482. package/scripts/notify/telegram-test.ts +2 -6
  483. package/scripts/observations/observation-ledger.ts +13 -0
  484. package/scripts/observations/observations-flush-landing.ts +5 -3
  485. package/scripts/observations/observations-flush.ts +6 -1
  486. package/scripts/overrides/overrides-check.ts +2 -5
  487. package/scripts/overrides/overrides-files.ts +2 -1
  488. package/scripts/overrides/overrides-logic.ts +3 -6
  489. package/scripts/package/verify-optional-eslint-install.ts +8 -6
  490. package/scripts/propagate/propagate-publish.ts +2 -7
  491. package/scripts/propagate/propagate-targets.ts +4 -12
  492. package/scripts/refactor/import-graph.ts +9 -7
  493. package/scripts/release/github-release-runs.ts +17 -6
  494. package/scripts/release/release-approval-prune.ts +18 -0
  495. package/scripts/release/release-history.ts +1 -3
  496. package/scripts/release/release-progress.ts +42 -22
  497. package/scripts/release/release-publish-run.ts +39 -0
  498. package/scripts/release/release-publish.ts +6 -6
  499. package/scripts/release/release-scope-cli.ts +0 -10
  500. package/scripts/release/release-scope-main.ts +12 -0
  501. package/scripts/repo/repo-setting.ts +3 -6
  502. package/scripts/repo/required-checks-logic.ts +6 -15
  503. package/scripts/report/report-format-reference.ts +2 -0
  504. package/scripts/report/report-labels.ts +155 -0
  505. package/scripts/report/report-lint-cli.ts +3 -0
  506. package/scripts/report/report-lint.ts +85 -110
  507. package/scripts/report/report-template-cli.ts +59 -0
  508. package/scripts/report/report-template.ts +112 -0
  509. package/scripts/review/acceptance-map.ts +1 -0
  510. package/scripts/review/removed-tests-check.ts +86 -0
  511. package/scripts/review/removed-tests.ts +149 -0
  512. package/scripts/review/review-brief-cli.ts +81 -15
  513. package/scripts/review/review-brief-main.ts +12 -0
  514. package/scripts/review/review-brief.ts +31 -3
  515. package/scripts/review/review-code-tree.ts +10 -6
  516. package/scripts/review/review-comment-round.ts +26 -8
  517. package/scripts/review/review-finding-ledger.ts +30 -15
  518. package/scripts/review/review-interaction.ts +94 -0
  519. package/scripts/review/review-readers-scan.ts +163 -0
  520. package/scripts/review/review-record-cli.ts +69 -30
  521. package/scripts/review/review-record-main.ts +12 -0
  522. package/scripts/review/review-round-one-blobs.ts +221 -0
  523. package/scripts/review/review-round2-cli.ts +49 -12
  524. package/scripts/review/review-round2.ts +80 -12
  525. package/scripts/review/review-stamps.ts +19 -1
  526. package/scripts/review/review-stop-log.ts +96 -0
  527. package/scripts/review/review-stops-cli.ts +85 -0
  528. package/scripts/review/review-tree.ts +6 -17
  529. package/scripts/review/review-untouched-readers.ts +146 -0
  530. package/scripts/review/test-titles.ts +118 -0
  531. package/scripts/rules/agent-model.ts +8 -0
  532. package/scripts/rules/bash-triggers.ts +46 -3
  533. package/scripts/rules/decision-oracle-batch.ts +9 -1
  534. package/scripts/rules/decision-oracle.ts +2 -2
  535. package/scripts/rules/delivered-rules.ts +80 -2
  536. package/scripts/rules/destructive-command.ts +8 -1
  537. package/scripts/rules/direct-filing.ts +10 -2
  538. package/scripts/rules/direct-issue-comment.ts +117 -0
  539. package/scripts/rules/direct-pr-create.ts +69 -3
  540. package/scripts/rules/early-heartbeat.ts +2 -1
  541. package/scripts/rules/file-body.ts +7 -0
  542. package/scripts/rules/filing-cap.ts +7 -0
  543. package/scripts/rules/git-argv.ts +72 -14
  544. package/scripts/rules/git-force.ts +12 -2
  545. package/scripts/rules/guard-remedy.ts +4 -0
  546. package/scripts/rules/implementation-cut-verdict.ts +1 -1
  547. package/scripts/rules/implementation-cut.ts +11 -3
  548. package/scripts/rules/index-guard.ts +8 -1
  549. package/scripts/rules/issue-comments.ts +9 -1
  550. package/scripts/rules/josh-git-bare.ts +7 -0
  551. package/scripts/rules/lane-background.ts +67 -25
  552. package/scripts/rules/lane-carry-conflict.ts +6 -0
  553. package/scripts/rules/lane-direct-tool.ts +74 -0
  554. package/scripts/rules/lane-interactive-ask.ts +9 -2
  555. package/scripts/rules/lane-park.ts +45 -23
  556. package/scripts/rules/lane-split-park.ts +10 -2
  557. package/scripts/rules/lane-switch-main.ts +7 -0
  558. package/scripts/rules/oracle-consulted.ts +10 -0
  559. package/scripts/rules/oracle-firing.ts +1 -0
  560. package/scripts/rules/permission-guards.ts +3 -0
  561. package/scripts/rules/piped-verification.ts +1 -1
  562. package/scripts/rules/poll-loop.ts +7 -0
  563. package/scripts/rules/pr-merge.ts +123 -0
  564. package/scripts/rules/protected-files.ts +32 -5
  565. package/scripts/rules/raw-field-body.ts +6 -0
  566. package/scripts/rules/rule-body-guard.ts +8 -0
  567. package/scripts/rules/rule-list.ts +9 -28
  568. package/scripts/rules/rule-value-cache.ts +4 -9
  569. package/scripts/rules/rule-value-cli.ts +51 -32
  570. package/scripts/rules/rule-value.ts +1 -1
  571. package/scripts/rules/shell-segments.ts +35 -0
  572. package/scripts/rules/stop-rule-rows.ts +64 -0
  573. package/scripts/rules/stop-rules.ts +3 -4
  574. package/scripts/rules/test-declared-commit.ts +11 -1
  575. package/scripts/rules/third-party-write.ts +7 -0
  576. package/scripts/rules/timed-rerun.ts +69 -0
  577. package/scripts/rules/worktree-guard.ts +13 -3
  578. package/scripts/run/board/run-board-app-name.ts +23 -0
  579. package/scripts/run/board/run-board-cli.ts +65 -32
  580. package/scripts/run/board/run-board-earlier.ts +94 -0
  581. package/scripts/run/board/run-board-ending-reason.ts +67 -0
  582. package/scripts/run/board/run-board-estimate-schedule.ts +103 -0
  583. package/scripts/run/board/run-board-estimate.ts +98 -0
  584. package/scripts/run/board/run-board-fit.ts +153 -36
  585. package/scripts/run/board/run-board-fold.ts +123 -0
  586. package/scripts/run/board/run-board-fresh.ts +2 -2
  587. package/scripts/run/board/run-board-gather-live.ts +29 -0
  588. package/scripts/run/board/run-board-gather-thread.ts +189 -0
  589. package/scripts/run/board/run-board-gather-worker.ts +29 -0
  590. package/scripts/run/board/run-board-gather.ts +187 -0
  591. package/scripts/run/board/run-board-github.ts +118 -38
  592. package/scripts/run/board/run-board-header.ts +82 -20
  593. package/scripts/run/board/run-board-keys.ts +58 -0
  594. package/scripts/run/board/run-board-kind.ts +20 -6
  595. package/scripts/run/board/run-board-labels.ts +116 -71
  596. package/scripts/run/board/run-board-lane-state.ts +109 -0
  597. package/scripts/run/board/run-board-lane-time.ts +122 -0
  598. package/scripts/run/board/run-board-layout.ts +239 -60
  599. package/scripts/run/board/run-board-length.ts +52 -0
  600. package/scripts/run/board/run-board-machine.ts +8 -4
  601. package/scripts/run/board/run-board-main.ts +12 -0
  602. package/scripts/run/board/run-board-notes.ts +52 -31
  603. package/scripts/run/board/run-board-now.ts +1 -1
  604. package/scripts/run/board/run-board-operation.ts +15 -33
  605. package/scripts/run/board/run-board-phase.ts +1 -1
  606. package/scripts/run/board/run-board-plan-shared.ts +115 -0
  607. package/scripts/run/board/run-board-plan.ts +55 -3
  608. package/scripts/run/board/run-board-planning.ts +45 -0
  609. package/scripts/run/board/run-board-priority.ts +44 -0
  610. package/scripts/run/board/run-board-process-groups.ts +195 -0
  611. package/scripts/run/board/run-board-read.ts +151 -27
  612. package/scripts/run/board/run-board-reason.ts +235 -51
  613. package/scripts/run/board/run-board-released.ts +35 -0
  614. package/scripts/run/board/run-board-render-checks.ts +39 -5
  615. package/scripts/run/board/run-board-render-condition.ts +96 -0
  616. package/scripts/run/board/run-board-render-drawn.ts +67 -0
  617. package/scripts/run/board/run-board-render-foot.ts +59 -0
  618. package/scripts/run/board/run-board-render-icon.ts +35 -0
  619. package/scripts/run/board/run-board-render-lanes.ts +145 -0
  620. package/scripts/run/board/run-board-render-lead.ts +80 -0
  621. package/scripts/run/board/run-board-render-legend.ts +117 -48
  622. package/scripts/run/board/run-board-render-notes.ts +156 -29
  623. package/scripts/run/board/run-board-render-processes.ts +196 -0
  624. package/scripts/run/board/run-board-render-section.ts +119 -0
  625. package/scripts/run/board/run-board-render-slot.ts +3 -36
  626. package/scripts/run/board/run-board-render-tail.ts +115 -48
  627. package/scripts/run/board/run-board-render-time.ts +56 -0
  628. package/scripts/run/board/run-board-render-title.ts +117 -24
  629. package/scripts/run/board/run-board-render-waits.ts +104 -20
  630. package/scripts/run/board/run-board-render.ts +207 -265
  631. package/scripts/run/board/run-board-roots.ts +54 -0
  632. package/scripts/run/board/run-board-row-yield.ts +9 -4
  633. package/scripts/run/board/run-board-setup.ts +1 -12
  634. package/scripts/run/board/run-board-snapshot.ts +111 -0
  635. package/scripts/run/board/run-board-spin.ts +2 -2
  636. package/scripts/run/board/run-board-state.ts +22 -33
  637. package/scripts/run/board/run-board-status.ts +147 -71
  638. package/scripts/run/board/run-board-thanks-read.ts +2 -2
  639. package/scripts/run/board/run-board-tick.ts +122 -107
  640. package/scripts/run/board/run-board-usage-board.ts +78 -0
  641. package/scripts/run/board/run-board-usage-lanes.ts +113 -0
  642. package/scripts/run/board/run-board-usage-listing.ts +93 -0
  643. package/scripts/run/board/run-board-usage-read.ts +120 -150
  644. package/scripts/run/board/run-board-usage-rusage.ts +19 -7
  645. package/scripts/run/board/run-board-usage-text.ts +139 -51
  646. package/scripts/run/board/run-board-usage-top.ts +102 -0
  647. package/scripts/run/board/run-board-usage.ts +89 -72
  648. package/scripts/run/board/run-board-usual.ts +20 -9
  649. package/scripts/run/carry/run-carry-args.ts +4 -7
  650. package/scripts/run/carry/run-carry-conversation.ts +1 -1
  651. package/scripts/run/carry/run-carry.ts +9 -4
  652. package/scripts/run/cut/run-cut-handoff.ts +2 -2
  653. package/scripts/run/event/run-event-cli.ts +1 -5
  654. package/scripts/run/event/run-event-filed.ts +12 -6
  655. package/scripts/run/event/run-event-follow.ts +2 -3
  656. package/scripts/run/event/run-event-render.ts +6 -10
  657. package/scripts/run/event/run-event-scope.ts +2 -2
  658. package/scripts/run/event/run-event-stream-emit.ts +82 -22
  659. package/scripts/run/event/run-event-stream.ts +34 -8
  660. package/scripts/run/hold/run-hold-adopt.ts +65 -0
  661. package/scripts/run/hold/run-hold-cli.ts +93 -22
  662. package/scripts/run/hold/run-hold-main.ts +12 -0
  663. package/scripts/run/hold/run-hold-member.ts +37 -0
  664. package/scripts/run/hold/run-stop-notify.ts +183 -0
  665. package/scripts/run/merge/run-merge-auth.ts +31 -0
  666. package/scripts/run/merge/run-merge-cli.ts +62 -48
  667. package/scripts/run/merge/run-merge-close.ts +74 -0
  668. package/scripts/run/merge/run-merge-collect.ts +6 -13
  669. package/scripts/run/merge/run-merge-driver.ts +71 -0
  670. package/scripts/run/merge/run-merge-main.ts +12 -0
  671. package/scripts/run/merge/run-merge-outcome.ts +23 -0
  672. package/scripts/run/merge/run-merge-restart.ts +39 -0
  673. package/scripts/run/merge/run-merge-ship.ts +20 -4
  674. package/scripts/run/merge/run-merge-signals.ts +33 -9
  675. package/scripts/run/merge/run-merge-steps.ts +120 -85
  676. package/scripts/run/merge/run-merge.ts +38 -37
  677. package/scripts/run/park/run-park-cli.ts +91 -0
  678. package/scripts/run/park/run-park.ts +88 -0
  679. package/scripts/run/park/run-stalled.ts +68 -0
  680. package/scripts/run/pause/run-pause-cli.ts +73 -0
  681. package/scripts/run/pause/run-pause.ts +251 -0
  682. package/scripts/run/progress/run-progress-cli.ts +4 -12
  683. package/scripts/run/progress/run-progress-clock.ts +1 -1
  684. package/scripts/run/progress/run-progress-config.ts +6 -14
  685. package/scripts/run/progress/run-progress-main.ts +12 -0
  686. package/scripts/run/progress/run-progress.ts +1 -4
  687. package/scripts/run/review/run-review.ts +2 -1
  688. package/scripts/run/run-ending.ts +1 -0
  689. package/scripts/run/run-invocation.ts +5 -6
  690. package/scripts/run/run-liveness-cli.ts +6 -8
  691. package/scripts/run/run-liveness.ts +60 -29
  692. package/scripts/run/run-next.ts +1 -1
  693. package/scripts/run/run-parent-cut-hook.ts +2 -2
  694. package/scripts/run/run-preflight.ts +18 -3
  695. package/scripts/run/run-prep-cli.ts +1 -10
  696. package/scripts/run/run-prep-locate.ts +7 -50
  697. package/scripts/run/run-prep-main.ts +12 -0
  698. package/scripts/run/run-prep.ts +6 -0
  699. package/scripts/run/run-report-cli.ts +101 -13
  700. package/scripts/run/run-report-handoff.ts +114 -0
  701. package/scripts/run/run-step.ts +1 -1
  702. package/scripts/run/run-stranded-detect.ts +13 -0
  703. package/scripts/run/run-watcher-guard-cli.ts +1 -1
  704. package/scripts/run/run-watcher-guard.ts +1 -1
  705. package/scripts/run/ship/run-ship-args.ts +121 -0
  706. package/scripts/run/ship/run-ship-body-draft.ts +110 -0
  707. package/scripts/run/ship/run-ship-cli.ts +63 -140
  708. package/scripts/run/ship/run-ship-detach.ts +19 -8
  709. package/scripts/run/ship/run-ship-infra-retry.ts +59 -0
  710. package/scripts/run/ship/run-ship-next.ts +18 -2
  711. package/scripts/run/ship/run-ship-overlap.ts +42 -5
  712. package/scripts/run/ship/run-ship-place.ts +96 -0
  713. package/scripts/run/ship/run-ship-pre-detach-timed.ts +43 -0
  714. package/scripts/run/ship/run-ship-pre-detach.ts +81 -24
  715. package/scripts/run/ship/run-ship-preflight.ts +137 -32
  716. package/scripts/run/ship/run-ship-probe.ts +11 -3
  717. package/scripts/run/ship/run-ship-relaunch-cap.ts +70 -0
  718. package/scripts/run/ship/run-ship-removed-rows.ts +61 -0
  719. package/scripts/run/ship/run-ship-return.ts +107 -23
  720. package/scripts/run/ship/run-ship-review-steps.ts +105 -151
  721. package/scripts/run/ship/run-ship-review.ts +73 -6
  722. package/scripts/run/ship/run-ship-reviewer.ts +207 -0
  723. package/scripts/run/ship/run-ship-stage.ts +55 -6
  724. package/scripts/run/ship/run-ship-steps.ts +46 -15
  725. package/scripts/run/ship/run-ship-stop-cause.ts +135 -0
  726. package/scripts/run/ship/run-ship-stop-text.ts +11 -6
  727. package/scripts/run/ship/run-ship-sync.ts +43 -6
  728. package/scripts/run/ship/run-ship.ts +30 -2
  729. package/scripts/run/tidy/run-tidy-cli.ts +0 -4
  730. package/scripts/run/tidy/run-tidy-lanes.ts +3 -0
  731. package/scripts/run/tidy/run-tidy-main.ts +8 -0
  732. package/scripts/run/wake/run-wake-cli.ts +119 -100
  733. package/scripts/run/wake/run-wake-code.ts +83 -0
  734. package/scripts/run/wake/run-wake-driver.ts +19 -8
  735. package/scripts/run/wake/run-wake-loop.ts +34 -3
  736. package/scripts/run/wake/run-wake-main.ts +13 -0
  737. package/scripts/run/wake/run-wake-ports.ts +90 -0
  738. package/scripts/run/wake/run-wake-takeover.ts +66 -0
  739. package/scripts/run/wake/run-wake.ts +2 -1
  740. package/scripts/safe-chain/pack-hook.ts +2 -2
  741. package/scripts/safe-chain/preinstall-command.ts +2 -1
  742. package/scripts/safe-chain/project-config.ts +3 -9
  743. package/scripts/security/security-audit-main.ts +8 -0
  744. package/scripts/security/security-audit-provision-logic.ts +0 -11
  745. package/scripts/security/security-audit-provision-main.ts +12 -0
  746. package/scripts/security/security-audit-provision.ts +11 -26
  747. package/scripts/security/security-audit.ts +6 -7
  748. package/scripts/self-sync-guard/self-sync-guard-logic.ts +6 -13
  749. package/scripts/split/split-assess-cli.ts +2 -2
  750. package/scripts/split/split-assess.ts +15 -0
  751. package/scripts/split/split-measure.ts +65 -0
  752. package/scripts/sync/claude-settings-merge.ts +8 -15
  753. package/scripts/sync/directory-copy-guard.ts +4 -9
  754. package/scripts/sync/file-content.ts +78 -8
  755. package/scripts/sync/sync-ai-files.ts +3 -5
  756. package/scripts/sync/sync-configs.ts +11 -23
  757. package/scripts/sync/sync-hook-safety.ts +4 -10
  758. package/scripts/sync/sync-main.ts +11 -0
  759. package/scripts/sync/sync.ts +25 -37
  760. package/scripts/test/test-declared-changed.ts +2 -2
  761. package/scripts/test/test-declared.ts +1 -1
  762. package/scripts/test/test-e2e-guard.ts +25 -1
  763. package/scripts/test/test-e2e-stamp.ts +38 -0
  764. package/scripts/test/test-pinned-logic.ts +145 -0
  765. package/scripts/test/test-pinned-main.ts +78 -0
  766. package/scripts/test/test-pinned.ts +100 -0
  767. package/scripts/test/test-read-map.ts +264 -0
  768. package/scripts/test/test-read-recording.ts +91 -0
  769. package/scripts/test/test-read-trace.ts +148 -0
  770. package/scripts/test/test-red-main.ts +12 -0
  771. package/scripts/test/test-red.ts +12 -30
  772. package/scripts/test/test-related-main.ts +18 -0
  773. package/scripts/test/test-related-record.ts +119 -0
  774. package/scripts/test/test-related-scope.ts +229 -43
  775. package/scripts/test/test-related.ts +300 -22
  776. package/scripts/test/test-unit-guard-main.ts +15 -0
  777. package/scripts/test/test-unit-guard.ts +42 -24
  778. package/scripts/test/unit-count-file.ts +37 -0
  779. package/scripts/test/unit-run-marker.ts +162 -0
  780. package/scripts/test/unit-setup-files.ts +51 -0
  781. package/scripts/test/unit-worker-share.ts +61 -149
  782. package/scripts/test/whole-suite-files.ts +63 -0
  783. package/scripts/time-runtime/time-background.ts +20 -2
  784. package/scripts/time-runtime/time-bundles.ts +4 -3
  785. package/scripts/time-runtime/time-density-hook.ts +8 -6
  786. package/scripts/time-runtime/time-followup-stage.ts +1 -3
  787. package/scripts/time-runtime/time-format.ts +5 -28
  788. package/scripts/time-runtime/time-markers.ts +10 -1
  789. package/scripts/time-runtime/time-shell.ts +97 -10
  790. package/scripts/time-runtime/time-transcript-line.ts +49 -62
  791. package/scripts/uninstall/uninstall.ts +1 -1
  792. package/scripts/version/bump-version-main.ts +12 -0
  793. package/scripts/version/bump-version.ts +25 -25
  794. package/scripts/version/effective-upstream.ts +6 -12
  795. package/scripts/version/latest-corepack.ts +17 -32
  796. package/scripts/version/latest-if-required-cli.ts +93 -0
  797. package/scripts/version/latest-lane-guard-main.ts +8 -0
  798. package/scripts/version/latest-lane-guard.ts +0 -4
  799. package/scripts/version/latest-scope-cli.ts +0 -9
  800. package/scripts/version/latest-scope-main.ts +12 -0
  801. package/scripts/version/latest-update.ts +5 -5
  802. package/scripts/version/npm-registry.ts +44 -6
  803. package/scripts/version/publishable-range-check.ts +5 -16
  804. package/scripts/version/release-age.ts +1 -1
  805. package/scripts/version/release-hold.ts +1 -1
  806. package/scripts/version/release-window.ts +38 -0
  807. package/scripts/version/running-binary.ts +1 -1
  808. package/scripts/version/safe-chain-version-update.ts +3 -8
  809. package/scripts/version/version-targets.ts +6 -28
  810. package/templates/dependabot.yml +29 -0
  811. package/templates/gitignore +4 -1
  812. package/templates/pnpm-workspace.basic.yaml +1 -1
  813. package/templates/sonar-project.properties +3 -2
  814. package/templates/workflows/ci.yml +12 -4
  815. package/templates/workflows/github-release.yml +4 -0
  816. package/tsconfig.sonar.json +1 -1
  817. package/.ncurc.json +0 -3
  818. package/dist/hooks/batch-guard.js +0 -29
  819. package/dist/hooks/chunk-4KKD2UTK.js +0 -66
  820. package/dist/hooks/chunk-6TS2JD6D.js +0 -237
  821. package/dist/hooks/chunk-7DSBJVFH.js +0 -50
  822. package/dist/hooks/chunk-A65Y4YOR.js +0 -79
  823. package/dist/hooks/chunk-CDY4NFQG.js +0 -15
  824. package/dist/hooks/chunk-EFXE6C37.js +0 -81
  825. package/dist/hooks/chunk-GP4IEC4O.js +0 -20
  826. package/dist/hooks/chunk-JP45SOCJ.js +0 -56
  827. package/dist/hooks/chunk-LAOV7NLM.js +0 -45
  828. package/dist/hooks/chunk-M4HGZV7U.js +0 -83
  829. package/dist/hooks/chunk-PF2NZL2A.js +0 -131
  830. package/dist/hooks/chunk-PTICX4OL.js +0 -358
  831. package/dist/hooks/chunk-RT27QRJW.js +0 -6247
  832. package/dist/hooks/chunk-SYOTDYCI.js +0 -3533
  833. package/dist/hooks/chunk-UPUZF3AN.js +0 -279
  834. package/dist/hooks/chunk-WK6SMBIC.js +0 -3180
  835. package/dist/hooks/duplicate-read-guard.js +0 -30
  836. package/dist/hooks/investigation-guard.js +0 -29
  837. package/scripts/backlog/backlog-stalled-cli.ts +0 -30
  838. package/scripts/cost-runtime/cost-format.ts +0 -29
  839. package/scripts/init/basic-path-migration.ts +0 -24
  840. package/scripts/issue/issue-backlinks-cli.ts +0 -93
  841. package/scripts/josh/josh-commands-guard.ts +0 -38
  842. package/scripts/josh/josh-usage-automation.ts +0 -121
  843. package/scripts/josh/josh-usage-backlog.ts +0 -180
  844. package/scripts/josh/josh-usage-developer.ts +0 -230
  845. package/scripts/josh/josh-usage-hooks.ts +0 -38
  846. package/scripts/josh/josh-usage-issue.ts +0 -205
  847. package/scripts/josh/josh-usage-review.ts +0 -101
  848. package/scripts/josh/josh-usage-run.ts +0 -252
  849. package/scripts/josh/josh-usage-session.ts +0 -238
  850. package/scripts/josh/josh-usage-workflow.ts +0 -212
  851. package/scripts/lint/cross-file-recheck.ts +0 -155
  852. package/scripts/registry-migration/migrate-logic.ts +0 -237
  853. package/scripts/registry-migration/migrate.ts +0 -292
  854. package/scripts/registry-migration/user-npmrc.ts +0 -15
  855. package/scripts/rules/rule-guard.ts +0 -23
  856. package/scripts/rules/rule-registry-rows.ts +0 -292
  857. package/scripts/rules/rule-registry.ts +0 -112
  858. package/scripts/run/run-stranded-cli.ts +0 -27
@@ -1,9 +1,11 @@
1
+ import { gh_author_association } from '#scripts/gh/gh-author-association'
1
2
  import { read_json_listing } from '#scripts/git/parse-json-array'
2
3
  import { z } from 'zod'
3
4
 
4
- // What a person changed on an issue since a run last read it, as the one pure answer the hook, the
5
- // review attestation, `josh issue:ack` and `josh followup` all print. Kept free of I/O so the four
6
- // callers cannot each draw the line between "a person's update" and "noise" differently.
5
+ // What a person changed on an issue since a run last read it, as the one answer the hook, the review
6
+ // attestation, `josh issue:ack` and `josh followup` all print. Kept in one place so the four callers
7
+ // cannot each draw the line between "a person's update" and "noise" differently; its only I/O is the
8
+ // write-access lookup `gh_author_association` makes for a `MEMBER` / `COLLABORATOR`.
7
9
  //
8
10
  // **A person's update is a body edit or a comment nobody automated.** A bot's comment (`type: Bot`,
9
11
  // or a `[bot]` login) is not one. A run's own comment is posted under the person's own `gh` login,
@@ -12,6 +14,13 @@ import { z } from 'zod'
12
14
  // through a raw `gh api` counts as a person's — the direction that costs one `josh issue:ack`, never a
13
15
  // missed correction.
14
16
  //
17
+ // **Only an author with write access is a person here** (`gh_author_association`). On a public
18
+ // repository anyone can comment, so a comment from anyone else is never handed to a run as an update,
19
+ // and its `RUN_MARKER` is not taken as josh's own. A `MEMBER` / `COLLABORATOR` whose lookup failed
20
+ // (`is_trusted: undefined` — the hook's timeout fired) is neither: their comment is announced with its
21
+ // body withheld, costing one `josh issue:ack` rather than a missed correction, and its marker is not
22
+ // trusted.
23
+ //
15
24
  // **Comment edits are out of scope.** A new comment carries an id above the baseline's; an edited
16
25
  // one keeps its id and is not seen. The body is compared whole, so its edits are.
17
26
 
@@ -21,6 +30,8 @@ const BOT_SUFFIX = '[bot]'
21
30
  const NO_COMMENT_ID = 0
22
31
  const UNKNOWN_AUTHOR = '(unknown)'
23
32
  const UNKNOWN_TIME = '(undated)'
33
+ const UNVERIFIED_BODY =
34
+ "(body withheld — the author's write access could not be checked; read it with `josh issue:read`)"
24
35
 
25
36
  const BODY_HEADING = 'Body edited:'
26
37
  const REMOVED_PREFIX = '- '
@@ -36,11 +47,14 @@ const comment_schema = z.looseObject({
36
47
  user: z.looseObject({ login: z.string(), type: z.string().optional() }).nullish(),
37
48
  created_at: z.string().optional(),
38
49
  body: z.string().nullish(),
50
+ author_association: z.string().nullish(),
39
51
  })
40
52
 
41
53
  interface WatchComment {
42
54
  id: number
43
55
  author: string
56
+ // `undefined` when the write-access lookup failed.
57
+ is_trusted: boolean | undefined
44
58
  is_automated: boolean
45
59
  created_at: string
46
60
  body: string
@@ -60,26 +74,48 @@ function is_bot(user: z.infer<typeof comment_schema>['user']): boolean {
60
74
  return user?.type === BOT_TYPE || (user?.login.endsWith(BOT_SUFFIX) ?? false)
61
75
  }
62
76
 
63
- function is_automated(user: z.infer<typeof comment_schema>['user'], body: string): boolean {
64
- return is_bot(user) || body.includes(RUN_MARKER)
77
+ function is_automated(
78
+ raw: z.infer<typeof comment_schema>,
79
+ is_trusted: boolean | undefined,
80
+ ): boolean {
81
+ return is_bot(raw.user) || (is_trusted === true && (raw.body?.includes(RUN_MARKER) ?? false))
65
82
  }
66
83
 
67
- function to_comment(raw: z.infer<typeof comment_schema>): WatchComment {
68
- const body = raw.body ?? ''
69
- const author = raw.user?.login ?? UNKNOWN_AUTHOR
70
- const created_at = raw.created_at ?? UNKNOWN_TIME
84
+ async function to_comment(
85
+ raw: z.infer<typeof comment_schema>,
86
+ timeout_ms?: number,
87
+ ): Promise<WatchComment> {
88
+ const login = raw.user?.login
89
+ const is_trusted = await gh_author_association.trust_of({
90
+ login,
91
+ association: raw.author_association,
92
+ timeout_ms,
93
+ })
71
94
 
72
- return { id: raw.id, author, is_automated: is_automated(raw.user, body), created_at, body }
95
+ return {
96
+ id: raw.id,
97
+ author: login ?? UNKNOWN_AUTHOR,
98
+ is_trusted,
99
+ is_automated: is_automated(raw, is_trusted),
100
+ created_at: raw.created_at ?? UNKNOWN_TIME,
101
+ body: raw.body ?? '',
102
+ }
73
103
  }
74
104
 
75
105
  // `undefined` — never `[]` — for a listing that could not be read, so a failed read is never taken
76
- // for "nobody commented".
77
- function parse_comments(json: string | undefined): ReadonlyArray<WatchComment> | undefined {
106
+ // for "nobody commented". `timeout_ms` bounds each write-access lookup, which run concurrently, so a
107
+ // hook's read stays inside its own timeout.
108
+ async function parse_comments(
109
+ json: string | undefined,
110
+ timeout_ms?: number,
111
+ ): Promise<ReadonlyArray<WatchComment> | undefined> {
78
112
  if (json === undefined) return undefined
79
113
 
80
114
  const listing = read_json_listing(json, comment_schema)
81
115
 
82
- return listing.kind === 'read' ? listing.rows.map((row) => to_comment(row)) : undefined
116
+ if (listing.kind !== 'read') return undefined
117
+
118
+ return await Promise.all(listing.rows.map(async (row) => await to_comment(row, timeout_ms)))
83
119
  }
84
120
 
85
121
  function last_comment_id(comments: ReadonlyArray<WatchComment>): number {
@@ -118,7 +154,9 @@ function body_section(previous_raw: string, current_raw: string): string | undef
118
154
  }
119
155
 
120
156
  function comment_section(comment: WatchComment): string {
121
- return `${COMMENT_HEADING}${comment.author}${AT}${comment.created_at}${LINE_SEPARATOR}${comment.body}`
157
+ const body = comment.is_trusted === true ? comment.body : UNVERIFIED_BODY
158
+
159
+ return `${COMMENT_HEADING}${comment.author}${AT}${comment.created_at}${LINE_SEPARATOR}${body}`
122
160
  }
123
161
 
124
162
  function new_person_comments(
@@ -126,7 +164,10 @@ function new_person_comments(
126
164
  snapshot: WatchSnapshot,
127
165
  ): ReadonlyArray<WatchComment> {
128
166
  return snapshot.comments.filter(
129
- (comment) => comment.id > baseline.last_comment_id && !comment.is_automated,
167
+ (comment) =>
168
+ comment.id > baseline.last_comment_id &&
169
+ comment.is_trusted !== false &&
170
+ !comment.is_automated,
130
171
  )
131
172
  }
132
173
 
@@ -76,8 +76,9 @@ async function read_snapshot(
76
76
  body: string,
77
77
  etag: string | undefined,
78
78
  ): Promise<Fetched> {
79
- const comments = issue_watch_diff.parse_comments(
79
+ const comments = await issue_watch_diff.parse_comments(
80
80
  await git_gh_issue_read.issue_list_comments(request.issue, request.timeout_ms),
81
+ request.timeout_ms,
81
82
  )
82
83
 
83
84
  return comments === undefined ? UNREADABLE : { kind: 'read', snapshot: { body, comments }, etag }
@@ -1,3 +1,4 @@
1
+ import { json_value } from '#scripts/lib/json-value'
1
2
  import { INTERRUPT_ROUTE_LABEL, SPLIT_ROUTE_LABEL, TIER_A_ROUTE_LABEL } from './issue-labels'
2
3
 
3
4
  // The WIP cap at the call that files. `josh issue:file` reads the count and asks the exemption
@@ -55,13 +56,7 @@ function count_line(count: number, repo: string, verdict: WipVerdict): string {
55
56
  // The listing's JSON is an array of rows; anything else is unreadable rather than zero, because zero
56
57
  // would pass every filing as within the cap.
57
58
  function count_of(json: string): number | undefined {
58
- try {
59
- const parsed: unknown = JSON.parse(json)
60
-
61
- return Array.isArray(parsed) ? parsed.length : undefined
62
- } catch {
63
- return undefined
64
- }
59
+ return json_value.parse_array(json)?.length
65
60
  }
66
61
 
67
62
  const issue_wip = { WIP_CAP, HELD, HELD_MESSAGE, UNREAD_MESSAGE, verdict_of, count_line, count_of }
@@ -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
@@ -1,36 +1,17 @@
1
1
  import { canonical_command, COMMAND_MAP } from './josh-command-map'
2
2
  import type { CommandUsage } from './josh-command-types'
3
- import { AUTOMATION_USAGE } from './josh-usage-automation'
4
- import { BACKLOG_USAGE } from './josh-usage-backlog'
5
- import { DEVELOPER_USAGE } from './josh-usage-developer'
6
- import { HOOK_USAGE } from './josh-usage-hooks'
7
- import { ISSUE_USAGE } from './josh-usage-issue'
8
- import { REVIEW_USAGE } from './josh-usage-review'
9
- import { RUN_USAGE } from './josh-usage-run'
10
- import { SESSION_USAGE } from './josh-usage-session'
11
- import { WORKFLOW_USAGE } from './josh-usage-workflow'
12
3
 
13
4
  // The single renderer of a command's usage. `josh help <command>` prints it and
14
- // `scripts/document/generate-command-usage.ts` writes it between a reference page's usage markers,
15
- // so the terminal and the page are one text (#3932).
16
-
17
- type UsageTable = Readonly<Record<string, CommandUsage>>
18
-
19
- // Which reference page renders each usage table — the one place a table is tied to its page, so the
20
- // generator's coverage check and `josh help` read the same set (#3981).
21
- /* eslint-disable @typescript-eslint/naming-convention */
22
- const USAGE_PAGE_TABLES: Readonly<Record<string, ReadonlyArray<UsageTable>>> = {
23
- 'docs/josh-commands.md': [DEVELOPER_USAGE],
24
- 'docs/josh-commands-run.md': [RUN_USAGE, SESSION_USAGE],
25
- 'docs/josh-commands-backlog.md': [ISSUE_USAGE, BACKLOG_USAGE, REVIEW_USAGE],
26
- 'docs/josh-commands-automation.md': [AUTOMATION_USAGE, WORKFLOW_USAGE, HOOK_USAGE],
27
- }
28
- /* eslint-enable @typescript-eslint/naming-convention */
29
- const COMMAND_USAGE: UsageTable = Object.fromEntries(
30
- Object.values(USAGE_PAGE_TABLES)
31
- .flat()
32
- .flatMap((table) => Object.entries(table)),
33
- )
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
+ ]
34
15
  const NOTE_GAP = 3
35
16
 
36
17
  interface ExampleLine {
@@ -39,7 +20,7 @@ interface ExampleLine {
39
20
  }
40
21
 
41
22
  function usage_for(name: string): CommandUsage | undefined {
42
- return Object.hasOwn(COMMAND_USAGE, name) ? COMMAND_USAGE[name] : undefined
23
+ return Object.hasOwn(COMMAND_MAP, name) ? COMMAND_MAP[name]?.usage : undefined
43
24
  }
44
25
 
45
26
  function example_line(name: string, example: CommandUsage['examples'][number]): ExampleLine {
@@ -80,31 +61,22 @@ function format_usage(name: string): string | undefined {
80
61
  return [format_examples(name, usage), ...flags].join('\n\n')
81
62
  }
82
63
 
83
- // `josh help <command>`: the synopsis line, the description, then the usage block when the command
84
- // has one. An alias resolves to its command; a name that is neither answers `undefined`.
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`.
85
66
  function format_command_help(input: string): string | undefined {
86
67
  const name = canonical_command(input)
87
68
  const entry = Object.hasOwn(COMMAND_MAP, name) ? COMMAND_MAP[name] : undefined
88
69
  if (entry === undefined) return undefined
89
70
  const [synopsis] = entry.reference
90
71
  const head = synopsis ? `josh ${name} ${synopsis}` : `josh ${name}`
91
- const usage = format_usage(name)
92
-
93
- return [head, '', entry.description, ...(usage === undefined ? [] : ['', usage])].join('\n')
94
- }
95
-
96
- // The commands whose usage blocks a reference page renders — the keys of the tables tied to it.
97
- function page_commands(page: string): Array<string> {
98
- const tables = Object.hasOwn(USAGE_PAGE_TABLES, page) ? USAGE_PAGE_TABLES[page] : undefined
99
72
 
100
- return (tables ?? []).flatMap((table) => Object.keys(table))
73
+ return [head, '', entry.description, '', format_usage(name)].join('\n')
101
74
  }
102
75
 
103
76
  const command_usage = {
104
- USAGE_PAGES: Object.keys(USAGE_PAGE_TABLES),
77
+ USAGE_PAGES,
105
78
  format_command_help,
106
79
  format_usage,
107
- page_commands,
108
80
  }
109
81
 
110
82
  export { command_usage }