@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,7 +1,4 @@
1
- #!/usr/bin/env tsx
2
1
  import { statSync } from 'node:fs'
3
- import { text } from 'node:stream/consumers'
4
- import { fileURLToPath } from 'node:url'
5
2
  import { hook_decision } from '#scripts/josh/hook-decision'
6
3
  import { lane_guard_policy, type LaneGuardMode } from '#scripts/lane/lane-guard-policy'
7
4
  import { json_value } from '#scripts/lib/json-value'
@@ -217,11 +214,6 @@ const duplicate_reads = {
217
214
  NOTICE,
218
215
  }
219
216
 
220
- if (process.argv[1] === fileURLToPath(import.meta.url)) {
221
- if (process.stdin.isTTY) hook_decision.report_no_payload('duplicate-read:guard')
222
- else hook_decision.write_outcome(await text(process.stdin), duplicate_read_outcome)
223
- }
224
-
225
217
  export {
226
218
  deny_envelope,
227
219
  DISABLED_VALUES,
@@ -1,6 +1,3 @@
1
- #!/usr/bin/env tsx
2
- import { text } from 'node:stream/consumers'
3
- import { fileURLToPath } from 'node:url'
4
1
  import { agent_session_role } from '#scripts/agent/agent-session-role'
5
2
  import { hook_decision, type GuardRun } from '#scripts/josh/hook-decision'
6
3
  import { lane_guard_policy } from '#scripts/lane/lane-guard-policy'
@@ -60,11 +57,6 @@ const investigation_outcome = GUARD.outcome
60
57
  const { is_enabled, refusal_path } = GUARD
61
58
  const { deny_envelope, load_environment_file, DISABLED_VALUES } = hook_decision
62
59
 
63
- if (process.argv[1] === fileURLToPath(import.meta.url)) {
64
- if (process.stdin.isTTY) hook_decision.report_no_payload('investigation:guard')
65
- else hook_decision.write_outcome(await text(process.stdin), investigation_outcome)
66
- }
67
-
68
60
  export {
69
61
  deny_envelope,
70
62
  investigation_outcome,
@@ -38,11 +38,10 @@ const SEARCH_LABELS: ReadonlySet<string> = new Set(
38
38
  SEARCH_COMMANDS.map((command) => time_shell.bash_label(command)),
39
39
  )
40
40
 
41
- // `.claude/agents/investigator.md`; a consumer receives it through the plugin as `kit:investigator`.
42
- const INVESTIGATOR_AGENT = 'investigator'
41
+ const { INVESTIGATOR_AGENT } = delegation_policy
43
42
 
44
43
  // The deny reason is the only text that reaches the model, so it names the count, command and return shape.
45
- const REASON = `⛔ investigation: ${String(delegation_policy.INVESTIGATION_FILE_THRESHOLD)} files read and not edited, or ${String(delegation_policy.INVESTIGATION_SEARCH_TURN_THRESHOLD)} search turns, since the last delegated unit. Run \`pnpm josh delegate investigation\`, then dispatch the \`${INVESTIGATOR_AGENT}\` agent (\`kit:${INVESTIGATOR_AGENT}\` in a consumer); it returns \`file:line\` citations, never the file text. Keep main-line reads to files you will edit; every read-only search turn counts. \`.claude/skills/workflow-commands/delegation.md\``
44
+ const REASON = `⛔ investigation: ${delegation_policy.INVESTIGATION_LIMIT}. ${delegation_policy.INVESTIGATION_STEP} Keep main-line reads to files you will edit; every read-only search turn counts. \`.claude/skills/workflow-commands/delegation.md\``
46
45
 
47
46
  interface ReadTally {
48
47
  // The files read and not since edited, resolved.
@@ -61,7 +60,7 @@ interface ReadTally {
61
60
  }
62
61
 
63
62
  // The run's own instructions are not the Issue's subject and cannot be delegated, so they never count.
64
- // Matched relative to the repository root, so `scripts/eval/prompts/x.ts` stays subject code.
63
+ // Matched relative to the repository root, so `tools/eval/prompts/x.ts` stays subject code.
65
64
  const INSTRUCTION_PATHS: ReadonlyArray<string> = ['prompts', '.claude/skills']
66
65
  const INSTRUCTION_FILES: ReadonlySet<string> = new Set(['CLAUDE.md', 'AGENTS.md', 'GEMINI.md'])
67
66
  const REPOSITORY_ROOT = process.cwd()
@@ -0,0 +1,194 @@
1
+ import { existsSync, readFileSync, writeFileSync } from 'node:fs'
2
+ import path from 'node:path'
3
+ import {
4
+ DEFAULT_RELEASE_AGE_MINUTES,
5
+ release_window,
6
+ type ReleaseWindow,
7
+ } from '#scripts/version/release-window'
8
+
9
+ // Dependabot's `cooldown` is the workspace's `minimumReleaseAge` restated in days, so a freshly
10
+ // published action or package waits out the same window pnpm and Safe Chain enforce (kit #4023).
11
+ // The edit is line-based and touches only each entry's `cooldown` block: a consumer's own keys and
12
+ // the file's comments survive, which a YAML round trip would discard.
13
+ const DEPENDABOT_FILE = path.join('.github', 'dependabot.yml')
14
+ const MINUTES_PER_DAY = 1440
15
+ // Dependabot accepts `default-days` from 1 to 90.
16
+ const MIN_DAYS = 1
17
+ const MAX_DAYS = 90
18
+ // pnpm's exclusions name npm packages, so only the npm entry receives them.
19
+ const NPM_ECOSYSTEM = 'npm'
20
+ const UPDATES_PATTERN = /^updates:\s*(?:#.*)?$/u
21
+ const ECOSYSTEM_PATTERN = /^\s*(?:-\s+)?package-ecosystem:\s*['"]?([\w-]+)/u
22
+ const TOP_LEVEL_KEY_PATTERN = /^[^\s#-]/u
23
+ const COOLDOWN_KEY = 'cooldown:'
24
+
25
+ interface UpdateEntry {
26
+ start: number
27
+ end: number
28
+ key_indent: string
29
+ }
30
+
31
+ function cooldown_days(minutes: number | undefined): number {
32
+ const days = Math.ceil((minutes ?? DEFAULT_RELEASE_AGE_MINUTES) / MINUTES_PER_DAY)
33
+
34
+ return Math.min(MAX_DAYS, Math.max(MIN_DAYS, days))
35
+ }
36
+
37
+ function quote(value: string): string {
38
+ return `'${value.replaceAll("'", "''")}'`
39
+ }
40
+
41
+ function cooldown_lines(ecosystem: string, window: ReleaseWindow, indent: string): Array<string> {
42
+ const lines = ['cooldown:', ` default-days: ${String(cooldown_days(window.minutes))}`]
43
+
44
+ if (ecosystem === NPM_ECOSYSTEM && window.exclusions.length > 0) {
45
+ lines.push(' exclude:', ...window.exclusions.map((name) => ` - ${quote(name)}`))
46
+ }
47
+
48
+ return lines.map((line) => `${indent}${line}`)
49
+ }
50
+
51
+ function indent_width(line: string): number {
52
+ return line.length - line.trimStart().length
53
+ }
54
+
55
+ function is_blank(line: string | undefined): boolean {
56
+ return line?.trim() === ''
57
+ }
58
+
59
+ function trim_trailing_blanks(lines: ReadonlyArray<string>): Array<string> {
60
+ const trimmed = [...lines]
61
+ while (trimmed.length > 1 && is_blank(trimmed.at(-1))) trimmed.pop()
62
+
63
+ return trimmed
64
+ }
65
+
66
+ function is_comment(line: string | undefined): boolean {
67
+ return line?.trimStart().startsWith('#') === true
68
+ }
69
+
70
+ // A blank line, or a comment left of `width`: it may sit inside a block or head the next one.
71
+ function is_detached(line: string | undefined, width: number): boolean {
72
+ return is_blank(line) || (is_comment(line) && indent_width(line ?? '') < width)
73
+ }
74
+
75
+ // The first key line at or after `from` that sits left of `width`, or `limit`.
76
+ function block_stop(
77
+ lines: ReadonlyArray<string>,
78
+ from: number,
79
+ width: number,
80
+ limit: number,
81
+ ): number {
82
+ const relative = lines
83
+ .slice(from, limit)
84
+ .findIndex((line) => !is_blank(line) && !is_comment(line) && indent_width(line) < width)
85
+
86
+ return relative === -1 ? limit : from + relative
87
+ }
88
+
89
+ // The block runs to the next key line left of `width`. A comment left of `width` in the middle stays
90
+ // inside, while the run of such comments right before that key belongs to what follows.
91
+ function block_end(
92
+ lines: ReadonlyArray<string>,
93
+ from: number,
94
+ width: number,
95
+ limit: number,
96
+ ): number {
97
+ const stop = block_stop(lines, from, width, limit)
98
+ let end = stop
99
+
100
+ for (let index = stop - 1; index >= from && is_detached(lines[index], width); index -= 1) {
101
+ if (!is_blank(lines[index])) end = index
102
+ }
103
+
104
+ return end
105
+ }
106
+
107
+ // The next top-level key. A list written flush with `updates:` and a comment at column 0 both still
108
+ // belong to it, so neither ends the list.
109
+ function updates_end(lines: ReadonlyArray<string>, updates: number): number {
110
+ const relative = lines.slice(updates + 1).findIndex((line) => TOP_LEVEL_KEY_PATTERN.test(line))
111
+
112
+ return relative === -1 ? lines.length : updates + 1 + relative
113
+ }
114
+
115
+ function find_entries(lines: ReadonlyArray<string>, updates: number): Array<UpdateEntry> {
116
+ const limit = updates_end(lines, updates)
117
+ const starts = lines
118
+ .map((line, index) => ({ index, item: /^(\s*-\s+)\S/u.exec(line)?.[1] }))
119
+ .filter(({ index, item }) => index > updates && index < limit && item !== undefined)
120
+ const item_width = Math.min(...starts.map(({ item }) => item?.indexOf('-') ?? 0))
121
+
122
+ return starts
123
+ .filter(({ item }) => item?.indexOf('-') === item_width)
124
+ .map(({ index, item = '' }) => ({
125
+ start: index,
126
+ end: block_end(lines, index + 1, item.length, limit),
127
+ key_indent: ' '.repeat(item.length),
128
+ }))
129
+ }
130
+
131
+ // The entry's own `cooldown:` key, either on a key line or on the item line itself (`- cooldown:`).
132
+ function is_cooldown_key(line: string, index: number, key_indent: string): boolean {
133
+ const is_key_line = index === 0 || line.startsWith(key_indent)
134
+
135
+ return is_key_line && line.slice(key_indent.length).startsWith(COOLDOWN_KEY)
136
+ }
137
+
138
+ // An entry that opened with `- cooldown:` hands its item marker to the next key once the block goes.
139
+ function promote_first_key(rest: ReadonlyArray<string>, marker: string): Array<string> {
140
+ const first = rest.findIndex((line) => !is_blank(line) && !line.trimStart().startsWith('#'))
141
+
142
+ return rest.map((line, index) =>
143
+ index === first ? `${marker}${line.slice(marker.length)}` : line,
144
+ )
145
+ }
146
+
147
+ function without_cooldown(entry: ReadonlyArray<string>, key_indent: string): Array<string> {
148
+ const start = entry.findIndex((line, index) => is_cooldown_key(line, index, key_indent))
149
+ if (start === -1) return [...entry]
150
+ const rest = entry.slice(block_end(entry, start + 1, key_indent.length + 1, entry.length))
151
+ if (start > 0) return [...entry.slice(0, start), ...rest]
152
+
153
+ return promote_first_key(rest, (entry.at(0) ?? '').slice(0, key_indent.length))
154
+ }
155
+
156
+ function rewrite_entry(
157
+ entry: ReadonlyArray<string>,
158
+ key_indent: string,
159
+ window: ReleaseWindow,
160
+ ): Array<string> {
161
+ const ecosystem = entry.map((line) => ECOSYSTEM_PATTERN.exec(line)?.[1]).find(Boolean)
162
+ if (ecosystem === undefined) return [...entry]
163
+ const body = trim_trailing_blanks(without_cooldown(entry, key_indent))
164
+ const trailing = entry.slice(trim_trailing_blanks(entry).length)
165
+
166
+ return [...body, ...cooldown_lines(ecosystem, window, key_indent), ...trailing]
167
+ }
168
+
169
+ function merge_cooldown(existing: string, window: ReleaseWindow): string {
170
+ const lines = existing.split('\n')
171
+ const updates = lines.findIndex((line) => UPDATES_PATTERN.test(line))
172
+ if (updates === -1) return existing
173
+
174
+ for (const { start, end, key_indent } of find_entries(lines, updates).toReversed()) {
175
+ lines.splice(start, end - start, ...rewrite_entry(lines.slice(start, end), key_indent, window))
176
+ }
177
+
178
+ return lines.join('\n')
179
+ }
180
+
181
+ function sync_dependabot_cooldown(root: string): boolean {
182
+ const config_path = path.join(root, DEPENDABOT_FILE)
183
+ if (!existsSync(config_path)) return false
184
+ const existing = readFileSync(config_path, 'utf8')
185
+ const merged = merge_cooldown(existing, release_window.read_release_window(root))
186
+ if (merged === existing) return false
187
+ writeFileSync(config_path, merged)
188
+
189
+ return true
190
+ }
191
+
192
+ const dependabot_cooldown = { cooldown_days, merge_cooldown, sync_dependabot_cooldown }
193
+
194
+ export { dependabot_cooldown }
@@ -1,5 +1,6 @@
1
1
  import { existsSync, readdirSync, readFileSync, statSync } from 'node:fs'
2
2
  import path from 'node:path'
3
+ import { stamped_memo } from '#scripts/lib/stamped-memo'
3
4
  import { repo_map_logic, type DiscoveredRepo, type RepoMap } from './repo-map-logic'
4
5
  import { repo_origin } from './repo-origin'
5
6
 
@@ -59,18 +60,35 @@ function resolve_git_directory(repository_path: string): string | undefined {
59
60
  }
60
61
  }
61
62
 
62
- // The work tree's git config text, or nothing when it is unreadable or not a work tree.
63
- function read_config(repository_path: string): string | undefined {
64
- const git_directory = resolve_git_directory(repository_path)
65
- if (git_directory === undefined) return undefined
66
-
63
+ function read_text(file: string): string | undefined {
67
64
  try {
68
- return readFileSync(path.join(git_directory, GIT_CONFIG), 'utf8')
65
+ return readFileSync(file, 'utf8')
69
66
  } catch {
70
67
  return undefined
71
68
  }
72
69
  }
73
70
 
71
+ // Each work tree's git directory and each config's text, read again only once the `.git` entry or the
72
+ // config itself has changed: `run:board` cites issues through the origin on every redraw
73
+ // (joshuafolkken/kit#4263).
74
+ const git_directories = stamped_memo.create<string | undefined>()
75
+ const configs = stamped_memo.create<string | undefined>()
76
+
77
+ // The work tree's git config text, or nothing when it is unreadable or not a work tree.
78
+ function read_config(repository_path: string): string | undefined {
79
+ const git_entry = path.join(repository_path, GIT_DIRECTORY)
80
+ const git_directory = git_directories.of(
81
+ repository_path,
82
+ stamped_memo.file_stamp(git_entry),
83
+ () => resolve_git_directory(repository_path),
84
+ )
85
+ if (git_directory === undefined) return undefined
86
+
87
+ const config = path.join(git_directory, GIT_CONFIG)
88
+
89
+ return configs.of(config, stamped_memo.file_stamp(config), () => read_text(config))
90
+ }
91
+
74
92
  // The `origin` URL a work tree declares, or nothing when it has no `origin`, no readable config, or
75
93
  // is not a work tree at all. Every failure reads as "no remote" so one unreadable sibling cannot
76
94
  // fail a command whose contract is to report what it could find.
@@ -2,6 +2,7 @@ import { existsSync } from 'node:fs'
2
2
  import path from 'node:path'
3
3
  import { git_spawn_sync } from '#scripts/git/git-spawn-sync'
4
4
  import { json_value } from '#scripts/lib/json-value'
5
+ import { package_manifest } from '#scripts/lib/package-manifest'
5
6
  import { file_reader } from '#scripts/lib/read-file'
6
7
  import { PROBE_TIMEOUT_MS } from '#scripts/lib/timeouts'
7
8
  import { KIT_PACKAGE_NAME } from '#scripts/version/kit-descriptor'
@@ -37,11 +38,7 @@ const STATE_MISSING = 'missing'
37
38
  type ClaudeMdState = typeof STATE_OK | typeof STATE_TARGET_MISSING | typeof STATE_MISSING
38
39
 
39
40
  function parse_manifest(root: string): ManifestShape | undefined {
40
- const content = file_reader.read_if_readable(path.join(root, 'package.json'))
41
- if (content === undefined) return undefined
42
- const parsed = manifest_schema.safeParse(json_value.parse_or_undefined(content))
43
-
44
- return parsed.success ? parsed.data : undefined
41
+ return package_manifest.read_manifest_if_valid(root, manifest_schema)
45
42
  }
46
43
 
47
44
  function lists_kit_dependency(manifest: ManifestShape | undefined): boolean {
@@ -58,7 +58,7 @@ function block_ceiling(size: number): number {
58
58
  // unreached file, so the definition cannot rot as documents move on or off the execution path.
59
59
  const DOCUMENT_BYTE_BUDGET: ReadonlyArray<DocumentBudget> = [
60
60
  { path: '.claude/skills/dependency-update/SKILL.md', bytes: 4096 },
61
- { path: '.claude/skills/epic-commands/SKILL.md', bytes: 12_288 },
61
+ { path: '.claude/skills/epic-commands/SKILL.md', bytes: 8192 },
62
62
  { path: '.claude/skills/epic-commands/epic-bundle.md', bytes: 4096 },
63
63
  { path: '.claude/skills/epic-commands/execution-waves.md', bytes: 4096 },
64
64
  { path: '.claude/skills/verify-ui/SKILL.md', bytes: 4096 },
@@ -73,10 +73,10 @@ const DOCUMENT_BYTE_BUDGET: ReadonlyArray<DocumentBudget> = [
73
73
  { path: '.claude/skills/workflow-commands/prerequisite.md', bytes: 8192 },
74
74
  { path: '.claude/skills/workflow-commands/target-repository.md', bytes: 4096 },
75
75
  { path: '.claude/skills/workflow-commands/working-tree-hold.md', bytes: 8192 },
76
- { path: 'docs/josh-commands-automation.md', bytes: 49_152 },
77
- { path: 'docs/josh-commands-run.md', bytes: 65_536 },
78
- { path: 'docs/josh-commands-backlog.md', bytes: 53_248 },
79
- { path: 'docs/josh-commands.md', bytes: 49_152 },
76
+ { path: 'docs/josh-commands-automation.md', bytes: 45_056 },
77
+ { path: 'docs/josh-commands-run.md', bytes: 69_632 },
78
+ { path: 'docs/josh-commands-backlog.md', bytes: 57_344 },
79
+ { path: 'docs/josh-commands.md', bytes: 53_248 },
80
80
  { path: 'docs/labels-and-run-states.md', bytes: 8192 },
81
81
  { path: 'prompts/coding-standards.md', bytes: 4096 },
82
82
  { path: 'prompts/collaboration-workflow.md', bytes: 4096 },
@@ -84,8 +84,10 @@ const DOCUMENT_BYTE_BUDGET: ReadonlyArray<DocumentBudget> = [
84
84
  { path: 'prompts/collaboration-workflow/gh-rest.md', bytes: 4096 },
85
85
  { path: 'prompts/collaboration-workflow/glossary.md', bytes: 4096 },
86
86
  { path: 'prompts/collaboration-workflow/issue-citation.md', bytes: 4096 },
87
- { path: 'prompts/collaboration-workflow/issue-template.md', bytes: 8192 },
87
+ // The priority declaration and its criteria (joshuafolkken/kit#4383) crossed the 8192 block.
88
+ { path: 'prompts/collaboration-workflow/issue-template.md', bytes: 12_288 },
88
89
  { path: 'prompts/collaboration-workflow/lane-instructions.md', bytes: 4096 },
90
+ { path: 'prompts/collaboration-workflow/measurement.md', bytes: 4096 },
89
91
  { path: 'prompts/collaboration-workflow/operating-rules.md', bytes: 8192 },
90
92
  { path: 'prompts/collaboration-workflow/output-bounds.md', bytes: 4096 },
91
93
  { path: 'prompts/collaboration-workflow/overview.md', bytes: 4096 },
@@ -57,7 +57,7 @@ function command_references(text: string): Array<string> {
57
57
  .filter((name) => !name.endsWith(':'))
58
58
  }
59
59
 
60
- // A `<placeholder>` inside a command, and `depth:<n>` after the char class stops at `<`, both leave a
60
+ // A `<placeholder>` inside a command, and `label:<n>` after the char class stops at `<`, both leave a
61
61
  // token that is not a real label. Real labels never end in a colon and never carry angle brackets.
62
62
  function is_real_label(token: string): boolean {
63
63
  return token.length > 0 && !token.endsWith(':') && !token.includes('<')
@@ -1,4 +1,3 @@
1
- #!/usr/bin/env tsx
2
1
  import { existsSync } from 'node:fs'
3
2
  import path from 'node:path'
4
3
  import { fileURLToPath } from 'node:url'
@@ -22,7 +21,6 @@ import { entry_read_set } from './entry-read-set'
22
21
  // renamed would otherwise print nothing and read as a section with nothing in it — the one outcome
23
22
  // that is worse than reading the whole file.
24
23
 
25
- const ARGV_OFFSET = 2
26
24
  const FAILURE_EXIT_CODE = 1
27
25
  const FILE_ARGUMENT = 0
28
26
  const HEADING_ARGUMENT = 1
@@ -101,12 +99,6 @@ function run(argv: ReadonlyArray<string>, root: string = process.cwd()): number
101
99
  return markdown === undefined ? FAILURE_EXIT_CODE : print_section(markdown, heading, root)
102
100
  }
103
101
 
104
- function main(argv: ReadonlyArray<string>): void {
105
- process.exitCode = run(argv)
106
- }
107
-
108
102
  const document_section_cli = { FAILURE_EXIT_CODE, USAGE, resolve_document, run }
109
103
 
110
- if (process.argv[1] === fileURLToPath(import.meta.url)) main(process.argv.slice(ARGV_OFFSET))
111
-
112
104
  export { document_section_cli }
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env tsx
2
+ import { fileURLToPath } from 'node:url'
3
+ import { document_section_cli } from './document-section-cli'
4
+
5
+ // The `josh doc:section` entry, kept apart from `document-section-cli.ts` because other modules import
6
+ // that one: a bundle is one file, so a main guard there would fire for every command that carries it
7
+ // (joshuafolkken/kit#4186).
8
+ if (process.argv[1] === fileURLToPath(import.meta.url)) {
9
+ const ARGV_OFFSET = 2
10
+
11
+ process.exitCode = document_section_cli.run(process.argv.slice(ARGV_OFFSET))
12
+ }
@@ -222,22 +222,27 @@ function fetch_anomalies(
222
222
  //
223
223
  // A listing that could not be read is left out of the map rather than entered as `[]`, so a
224
224
  // transport failure reads as "not asked" instead of "nobody recorded anything" — the finding it
225
- // would otherwise manufacture is an `error`, which stops the epic.
225
+ // would otherwise manufacture is an `error`, which stops the epic. Only a comment from an author with
226
+ // write access records a rationale.
226
227
  async function read_order_comments(
227
228
  pairs: ReadonlyArray<OrderPair>,
228
229
  ): Promise<Map<string, ReadonlyArray<string>>> {
229
230
  const ends = epic_audit_rationale.pair_ends(pairs)
230
- const listings = await Promise.all(
231
- ends.map(async (child) => await git_gh_command.issue_list_comments(String(child.number))),
231
+ const parsed = await Promise.all(
232
+ ends.map(async (child) => {
233
+ const listing = await git_gh_command.issue_list_comments(String(child.number))
234
+
235
+ return await issue_read.parse_comments(listing)
236
+ }),
232
237
  )
233
238
 
234
239
  return new Map(
235
240
  ends.flatMap((child, index) => {
236
- const comments = issue_read.parse_comments(listings[index])
241
+ const comments = parsed[index]
237
242
 
238
243
  return comments === undefined
239
244
  ? []
240
- : [[epic_graph.key_of(child), comments.map((comment) => comment.body)] as const]
245
+ : [[epic_graph.key_of(child), issue_read.trusted_bodies(comments)] as const]
241
246
  }),
242
247
  )
243
248
  }
@@ -349,7 +354,7 @@ async function run(argv: ReadonlyArray<string>): Promise<number> {
349
354
  // `process.exitCode` rather than `process.exit()`: the answer goes to standard output and a write to
350
355
  // a pipe is asynchronous on macOS, so exiting can tear the process down before it drains. This
351
356
  // command's answer is what a workflow reads and acts on, which is exactly that pipe. The same shape
352
- // is in `scripts/cost-runtime/cost-cli.ts`, which met the truncation first.
357
+ // is in `scripts/cost-runtime/cost-main.ts`, which met the truncation first.
353
358
  async function main(argv: ReadonlyArray<string>): Promise<void> {
354
359
  process.exitCode = await run(argv)
355
360
  }
@@ -360,6 +365,7 @@ const epic_audit_cli = {
360
365
  attach_bodies,
361
366
  resolve_reference_states,
362
367
  outside_references,
368
+ read_order_comments,
363
369
  audit,
364
370
  run,
365
371
  }
@@ -0,0 +1,137 @@
1
+ import { issue_cite } from '#scripts/issue/issue-cite'
2
+ import { epic_add } from './epic-add'
3
+ import {
4
+ epic_bundle,
5
+ type BacklogIssue,
6
+ type BundleAction,
7
+ type BundleDecision,
8
+ } from './epic-bundle'
9
+ import { epic_reconcile } from './epic-reconcile'
10
+ import { epic_run } from './epic-run'
11
+
12
+ // `josh epic:bundle <N> --apply` — write the answer whose placement is settled: `add_to_epic` through
13
+ // `epic --add`'s writer, `create_epic` through `epic`'s. Nothing here edits an epic itself, so the
14
+ // task list and the `blocked-by` relations stay as those writers keep them.
15
+ //
16
+ // **An order the candidates already record is carried into the epic body** by `epic --reconcile`,
17
+ // which declares exactly the recorded relations — an order nobody recorded is never invented.
18
+ //
19
+ // `ask` stays the caller's: which epic to choose is a judgement, recorded with its reasoning.
20
+
21
+ const SUCCESS_EXIT_CODE = 0
22
+ const FAILURE_EXIT_CODE = 1
23
+
24
+ interface ApplyInput {
25
+ decision: BundleDecision
26
+ subject: BacklogIssue
27
+ // The backlog rows of `decision.candidates`, as `format_order` reads them.
28
+ members: ReadonlyArray<BacklogIssue>
29
+ is_membership_established: boolean
30
+ }
31
+
32
+ const UNAPPLIED_LINES: Readonly<Partial<Record<BundleAction, string>>> = {
33
+ ask: '↷ `--apply` wrote nothing: the related issues sit in more than one epic. Choose one and place it with `pnpm josh epic --add <E> <N> --decision-file <path>`.',
34
+ none: '↷ `--apply` wrote nothing: there is nothing to place.',
35
+ }
36
+ const WITHHELD_LINE =
37
+ '↷ `--apply` wrote nothing: the epic listing was cut short, so no placement was confirmed.'
38
+ const UNREAD_EPIC_LINE =
39
+ "✖ The new epic's number could not be read, so the recorded order was not written; run `pnpm josh epic --reconcile <E>` on it."
40
+
41
+ function has_order(input: ApplyInput): boolean {
42
+ return epic_bundle.bundle_dependency_links(input.subject, input.members).length > 0
43
+ }
44
+
45
+ function children_of(input: ApplyInput): Array<number> {
46
+ return epic_bundle.bundle_children(input.subject, input.members)
47
+ }
48
+
49
+ // An epic whose number could not be read cannot be given the order, so that is a failure rather than
50
+ // an order silently left out.
51
+ async function reconcile_order(
52
+ epic_number: number | undefined,
53
+ input: ApplyInput,
54
+ ): Promise<number> {
55
+ if (!has_order(input)) return SUCCESS_EXIT_CODE
56
+
57
+ if (epic_number === undefined) {
58
+ console.error(UNREAD_EPIC_LINE)
59
+
60
+ return FAILURE_EXIT_CODE
61
+ }
62
+
63
+ return await epic_reconcile.reconcile_epic(epic_number)
64
+ }
65
+
66
+ // A member another epic tracks stays there: `add_to_epic` can name an inner epic while a candidate sits
67
+ // in its parent, and adding that candidate here would put one issue in two task lists.
68
+ function placeable(epic_number: number, input: ApplyInput): ApplyInput {
69
+ const members = input.members.filter(
70
+ (member) => member.epic === undefined || member.epic === epic_number,
71
+ )
72
+
73
+ return { ...input, members }
74
+ }
75
+
76
+ async function add_to_epic(epic_number: number, input: ApplyInput): Promise<number> {
77
+ const placed = placeable(epic_number, input)
78
+ const added = await epic_add.add_children({ epic_number, children: children_of(placed) })
79
+ if (added !== SUCCESS_EXIT_CODE) return added
80
+
81
+ return await reconcile_order(epic_number, placed)
82
+ }
83
+
84
+ // The title is the subject's, since the subject is what the bundle was asked about; the rationale is
85
+ // the verdict's own reason, which already names the signal that grouped them.
86
+ function title_of(subject: BacklogIssue): string {
87
+ const title = subject.title ?? `bundle with ${issue_cite.plain(subject.number)}`
88
+
89
+ return `Epic: ${title}`
90
+ }
91
+
92
+ async function create_epic(input: ApplyInput): Promise<number> {
93
+ const epic_number = await epic_run.create_epic_number({
94
+ title: title_of(input.subject),
95
+ children: children_of(input),
96
+ rationale: input.decision.reason,
97
+ is_ordered: false,
98
+ })
99
+
100
+ return await reconcile_order(epic_number, input)
101
+ }
102
+
103
+ function report_unapplied(action: BundleAction): number {
104
+ const line = UNAPPLIED_LINES[action]
105
+ if (line !== undefined) console.info(line)
106
+
107
+ return SUCCESS_EXIT_CODE
108
+ }
109
+
110
+ async function apply_decision(input: ApplyInput): Promise<number> {
111
+ const { decision } = input
112
+
113
+ if (!input.is_membership_established) {
114
+ console.info(WITHHELD_LINE)
115
+
116
+ return SUCCESS_EXIT_CODE
117
+ }
118
+
119
+ if (decision.action === 'add_to_epic' && decision.epic !== undefined) {
120
+ return await add_to_epic(decision.epic, input)
121
+ }
122
+
123
+ if (decision.action === 'create_epic') return await create_epic(input)
124
+
125
+ return report_unapplied(decision.action)
126
+ }
127
+
128
+ const epic_bundle_apply = {
129
+ UNAPPLIED_LINES,
130
+ WITHHELD_LINE,
131
+ UNREAD_EPIC_LINE,
132
+ title_of,
133
+ apply_decision,
134
+ }
135
+
136
+ export { epic_bundle_apply }
137
+ export type { ApplyInput }