@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,4 +1,5 @@
1
1
  import { report_format_reference } from './report-format-reference'
2
+ import { report_labels, type ReportLabels } from './report-labels'
2
3
 
3
4
  // The mechanical half of the two-layer work summary (`CLAUDE.md` Step 0, single-sourced in
4
5
  // `prompts/collaboration-workflow/report-format.md`) is a fixed shape, yet only an advisory echo in
@@ -8,21 +9,13 @@ import { report_format_reference } from './report-format-reference'
8
9
  // the overview. The judgement half — whether the subject is concrete — is deliberately left out,
9
10
  // because a machine cannot answer it.
10
11
 
12
+ // The labels come from `report-labels.ts` in the session language — the same table
13
+ // `report:template` prints the skeleton from, so a skeleton it printed always passes.
11
14
  const TEMPLATE_HEADING = report_format_reference.SUMMARY_TEMPLATE_HEADING
12
15
 
13
- // The session-facing labels are Japanese because that is the form the summary is written in
14
- // (`JOSH_SESSION_LANG` defaults to `ja`); `report-format.md`'s template is the single source and the
15
- // document test pins that these match it.
16
- const OVERVIEW_LABEL = '■ 概要'
17
- const OVERVIEW_ITEM_LABELS = ['今こうなっている', 'こう直す', '確かめ方'] as const
18
- const DETAILS_LABEL = '技術詳細'
19
- const CHANGES_LABEL = '変更とテスト'
20
- const REQUIRED_LABELS: ReadonlyArray<string> = [
21
- OVERVIEW_LABEL,
22
- ...OVERVIEW_ITEM_LABELS,
23
- DETAILS_LABEL,
24
- CHANGES_LABEL,
25
- ]
16
+ function required_labels(labels: ReportLabels): ReadonlyArray<string> {
17
+ return [labels.overview, labels.now, labels.change, labels.check, labels.details, labels.changes]
18
+ }
26
19
 
27
20
  // 80–100 chars is the guide; the ceiling is what a machine can enforce, so an overview sentence over
28
21
  // this many characters is the violation and the lower bound stays the writer's judgement.
@@ -36,28 +29,13 @@ const FILE_EXTENSION_PATTERN = /\.(?:ts|tsx|js|jsx|mjs|cjs|svelte|json|yaml|yml|
36
29
  const CLI_FLAG_PATTERN = /(?:^|\s)--[a-z]/u
37
30
  const BOLD_MARKER = '**'
38
31
  const LEADING_LABEL_PUNCTUATION = /^[\s::]+/u
32
+ const LETTER_PATTERN = /^\p{L}/u
39
33
 
40
34
  // The case-based test declaration: the changes section carries a first tier
41
35
  // of fixed-vocabulary cases — each non-applicable one crossed out with a reason — and a second tier
42
36
  // of at-least-three "if it breaks" conditions. This checks the mechanical half: the two tier markers
43
37
  // are present, an N/A cross-out carries a reason, and the second tier holds enough conditions (or the
44
38
  // "never breaks" escape). Whether the cases are the right ones stays the judgement half.
45
- // `report-format.md` is the single source and the document test pins these against it.
46
- const CASE_LABEL = 'ケース'
47
- const CASE_VOCABULARY: ReadonlyArray<string> = [
48
- '正常',
49
- '空・0件',
50
- '1件',
51
- '多数',
52
- '境界',
53
- '不正入力',
54
- '重複',
55
- '順序',
56
- 'null',
57
- ]
58
- const BREAK_LABEL = '壊れるとしたら'
59
- const NA_LABEL = '該当なし'
60
- const NO_BREAK_ESCAPE = 'どう呼ばれても壊れない'
61
39
  const MIN_BREAK_CONDITIONS = 3
62
40
  const LIST_ITEM_PATTERN = /^\s*(?:\d+\.|[-*])\s+/u
63
41
  const REASON_SEPARATORS = /^[\s::—|、,.。-]+/u
@@ -75,23 +53,37 @@ function is_fenced(summary: string): boolean {
75
53
  return first_content_line(summary).startsWith('```')
76
54
  }
77
55
 
78
- function missing_labels(summary: string): ReadonlyArray<string> {
79
- return REQUIRED_LABELS.filter((label) => !summary.includes(label))
56
+ // A label counts only where no letter follows it, so `Change` is not found inside `Changes and tests`.
57
+ function has_label(summary: string, label: string): boolean {
58
+ return summary
59
+ .split(label)
60
+ .slice(1)
61
+ .some((rest) => !LETTER_PATTERN.test(rest))
62
+ }
63
+
64
+ function missing_labels(summary: string, labels: ReportLabels): ReadonlyArray<string> {
65
+ return required_labels(labels).filter((label) => !has_label(summary, label))
80
66
  }
81
67
 
82
68
  function line_index_of(lines: ReadonlyArray<string>, label: string): number {
83
69
  return lines.findIndex((line) => line.includes(label))
84
70
  }
85
71
 
86
- // The overview region is the lines between OVERVIEW_LABEL and DETAILS_LABEL; the length and intrusion
87
- // checks apply there alone, since the CHANGES_LABEL region legitimately carries file paths.
88
- function overview_lines(summary: string): ReadonlyArray<string> {
72
+ // A section heading is a non-item line carrying the label, so an overview sentence that merely
73
+ // contains the word (`- **Now**: Details panel …`) does not end the region.
74
+ function heading_index_of(lines: ReadonlyArray<string>, label: string): number {
75
+ return lines.findIndex((line) => !line.startsWith(ITEM_LINE_PREFIX) && line.includes(label))
76
+ }
77
+
78
+ // The overview region is the lines between the overview and details headings; the length and
79
+ // intrusion checks apply there alone, since the changes region legitimately carries file paths.
80
+ function overview_lines(summary: string, labels: ReportLabels): ReadonlyArray<string> {
89
81
  const lines = summary.split('\n')
90
- const start = line_index_of(lines, OVERVIEW_LABEL)
82
+ const start = line_index_of(lines, labels.overview)
91
83
  if (start < 0) return []
92
84
 
93
85
  const after = lines.slice(start + 1)
94
- const end = line_index_of(after, DETAILS_LABEL)
86
+ const end = heading_index_of(after, labels.details)
95
87
 
96
88
  return (end < 0 ? after : after.slice(0, end)).filter((line) => line.startsWith(ITEM_LINE_PREFIX))
97
89
  }
@@ -107,10 +99,8 @@ function item_sentence(line: string): string {
107
99
  return raw.replace(LEADING_LABEL_PUNCTUATION, '').trim()
108
100
  }
109
101
 
110
- function over_length_sentences(summary: string): ReadonlyArray<string> {
111
- return overview_lines(summary)
112
- .map((line) => item_sentence(line))
113
- .filter((sentence) => sentence.length > MAX_OVERVIEW_CHARS)
102
+ function overview_sentences(summary: string, labels: ReportLabels): ReadonlyArray<string> {
103
+ return overview_lines(summary, labels).map((line) => item_sentence(line))
114
104
  }
115
105
 
116
106
  function has_path_or_flag(sentence: string): boolean {
@@ -121,124 +111,114 @@ function has_path_or_flag(sentence: string): boolean {
121
111
  )
122
112
  }
123
113
 
124
- function intruding_sentences(summary: string): ReadonlyArray<string> {
125
- return overview_lines(summary)
126
- .map((line) => item_sentence(line))
127
- .filter((sentence) => has_path_or_flag(sentence))
128
- }
129
-
130
114
  function fence_violation(summary: string): ReadonlyArray<string> {
131
115
  return is_fenced(summary)
132
116
  ? ['✖ the summary is wrapped in a code fence — write it as plain markdown']
133
117
  : []
134
118
  }
135
119
 
136
- function label_violations(summary: string): ReadonlyArray<string> {
137
- return missing_labels(summary).map((label) => `✖ missing label: ${label}`)
120
+ function label_violations(summary: string, labels: ReportLabels): ReadonlyArray<string> {
121
+ return missing_labels(summary, labels).map((label) => `✖ missing label: ${label}`)
138
122
  }
139
123
 
140
- function length_violations(summary: string): ReadonlyArray<string> {
141
- return over_length_sentences(summary).map(
142
- (sentence) => `✖ overview line over ${String(MAX_OVERVIEW_CHARS)} chars: ${sentence}`,
143
- )
124
+ function length_violations(summary: string, labels: ReportLabels): ReadonlyArray<string> {
125
+ return overview_sentences(summary, labels)
126
+ .filter((sentence) => sentence.length > MAX_OVERVIEW_CHARS)
127
+ .map((sentence) => `✖ overview line over ${String(MAX_OVERVIEW_CHARS)} chars: ${sentence}`)
144
128
  }
145
129
 
146
- function intrusion_violations(summary: string): ReadonlyArray<string> {
147
- return intruding_sentences(summary).map(
148
- (sentence) => `✖ file path or CLI flag in the overview: ${sentence}`,
149
- )
130
+ function intrusion_violations(summary: string, labels: ReportLabels): ReadonlyArray<string> {
131
+ return overview_sentences(summary, labels)
132
+ .filter((sentence) => has_path_or_flag(sentence))
133
+ .map((sentence) => `✖ file path or CLI flag in the overview: ${sentence}`)
150
134
  }
151
135
 
152
- // The changes region is every line after CHANGES_LABEL; the case checks apply there, since the two
153
- // tiers and their markers live under the changes section alone.
154
- function changes_region_lines(summary: string): ReadonlyArray<string> {
136
+ // The changes region is every line after the changes label; the case checks apply there, since the
137
+ // two tiers and their markers live under the changes section alone. A wholly missing section is
138
+ // already a missing label, so an empty region keeps one absence from printing as two violations.
139
+ function changes_region_lines(summary: string, labels: ReportLabels): ReadonlyArray<string> {
155
140
  const lines = summary.split('\n')
156
- const start = line_index_of(lines, CHANGES_LABEL)
141
+ const start = line_index_of(lines, labels.changes)
157
142
 
158
143
  return start < 0 ? [] : lines.slice(start + 1)
159
144
  }
160
145
 
161
- // The case checks run only when the section exists — a wholly missing section is already a missing
162
- // label, so gating here keeps one absence from printing as two violations.
163
- function has_changes_section(summary: string): boolean {
164
- return summary.includes(CHANGES_LABEL)
165
- }
166
-
167
146
  // The text after the N/A marker in a segment, with separators stripped — empty means no reason given.
168
- function reason_after_na(segment: string): string {
147
+ function reason_after_na(segment: string, marker: string): string {
169
148
  return segment
170
- .slice(segment.indexOf(NA_LABEL) + NA_LABEL.length)
149
+ .slice(segment.indexOf(marker) + marker.length)
171
150
  .replace(REASON_SEPARATORS, '')
172
151
  .trim()
173
152
  }
174
153
 
175
154
  // Cases are listed on one line separated by `/`, so each N/A cross-out is checked in its own segment
176
155
  // — a reasonless second cross-out on a line whose first one carries a reason must not escape.
177
- function line_has_reasonless_na(line: string): boolean {
156
+ function line_has_reasonless_na(line: string, marker: string): boolean {
178
157
  return line
179
158
  .split('/')
180
- .some((segment) => segment.includes(NA_LABEL) && reason_after_na(segment).length === 0)
181
- }
182
-
183
- function na_lines_without_reason(lines: ReadonlyArray<string>): ReadonlyArray<string> {
184
- return lines.filter((line) => line_has_reasonless_na(line))
159
+ .some((segment) => segment.includes(marker) && reason_after_na(segment, marker).length === 0)
185
160
  }
186
161
 
187
- function break_marker_index(lines: ReadonlyArray<string>): number {
188
- return lines.findIndex((line) => line.includes(BREAK_LABEL))
162
+ function break_marker_index(lines: ReadonlyArray<string>, labels: ReportLabels): number {
163
+ return lines.findIndex((line) => line.includes(labels.if_it_breaks))
189
164
  }
190
165
 
191
166
  // The count of list items after the second-tier marker. Over-counting a later change block's items
192
167
  // only relaxes the check, never fires a false violation, so the simple whole-tail count is enough.
193
- function break_condition_count(lines: ReadonlyArray<string>): number {
194
- const start = break_marker_index(lines)
168
+ function break_condition_count(lines: ReadonlyArray<string>, labels: ReportLabels): number {
169
+ const start = break_marker_index(lines, labels)
195
170
  if (start < 0) return 0
196
171
 
197
172
  return lines.slice(start + 1).filter((line) => LIST_ITEM_PATTERN.test(line)).length
198
173
  }
199
174
 
200
- function case_line_violations(summary: string): ReadonlyArray<string> {
175
+ function case_line_violations(summary: string, labels: ReportLabels): ReadonlyArray<string> {
201
176
  if (
202
- !has_changes_section(summary) ||
203
- changes_region_lines(summary).some((line) => line.includes(CASE_LABEL))
177
+ !summary.includes(labels.changes) ||
178
+ changes_region_lines(summary, labels).some((line) => line.includes(labels.cases))
204
179
  ) {
205
180
  return []
206
181
  }
207
182
 
208
- return [`✖ no case tier (${CASE_LABEL}:) in ${CHANGES_LABEL}`]
183
+ return [`✖ no case tier (${labels.cases}:) in ${labels.changes}`]
209
184
  }
210
185
 
211
- function na_reason_violations(summary: string): ReadonlyArray<string> {
212
- if (!has_changes_section(summary)) return []
213
-
214
- return na_lines_without_reason(changes_region_lines(summary)).map(
215
- () => `✖ ${NA_LABEL} without a reason — say why the case does not apply`,
216
- )
186
+ function na_reason_violations(summary: string, labels: ReportLabels): ReadonlyArray<string> {
187
+ return changes_region_lines(summary, labels)
188
+ .filter((line) => line_has_reasonless_na(line, labels.not_applicable))
189
+ .map(() => `✖ ${labels.not_applicable} without a reason — say why the case does not apply`)
217
190
  }
218
191
 
219
- function break_violations(summary: string): ReadonlyArray<string> {
220
- if (!has_changes_section(summary)) return []
192
+ function break_violations(summary: string, labels: ReportLabels): ReadonlyArray<string> {
193
+ if (!summary.includes(labels.changes)) return []
221
194
 
222
- const lines = changes_region_lines(summary)
223
- if (lines.some((line) => line.includes(NO_BREAK_ESCAPE))) return []
224
- if (break_marker_index(lines) < 0) return [`✖ no ${BREAK_LABEL} tier in ${CHANGES_LABEL}`]
225
- if (break_condition_count(lines) >= MIN_BREAK_CONDITIONS) return []
195
+ const lines = changes_region_lines(summary, labels)
196
+ if (lines.some((line) => line.includes(labels.never_breaks))) return []
226
197
 
227
- return [
228
- `✖ ${BREAK_LABEL} needs ${String(MIN_BREAK_CONDITIONS)} conditions or "${NO_BREAK_ESCAPE}"`,
229
- ]
198
+ if (break_marker_index(lines, labels) < 0) {
199
+ return [`✖ no ${labels.if_it_breaks} tier in ${labels.changes}`]
200
+ }
201
+
202
+ if (break_condition_count(lines, labels) >= MIN_BREAK_CONDITIONS) return []
203
+
204
+ const needed = `${String(MIN_BREAK_CONDITIONS)} conditions or "${labels.never_breaks}"`
205
+
206
+ return [`✖ ${labels.if_it_breaks} needs ${needed}`]
230
207
  }
231
208
 
232
209
  // Every violation the mechanical checks find, in a fixed order; an empty array is a clean summary.
233
- function lint_report(summary: string): ReadonlyArray<string> {
210
+ function lint_report(
211
+ summary: string,
212
+ labels: ReportLabels = report_labels.session_labels(),
213
+ ): ReadonlyArray<string> {
234
214
  return [
235
215
  ...fence_violation(summary),
236
- ...label_violations(summary),
237
- ...length_violations(summary),
238
- ...intrusion_violations(summary),
239
- ...case_line_violations(summary),
240
- ...na_reason_violations(summary),
241
- ...break_violations(summary),
216
+ ...label_violations(summary, labels),
217
+ ...length_violations(summary, labels),
218
+ ...intrusion_violations(summary, labels),
219
+ ...case_line_violations(summary, labels),
220
+ ...na_reason_violations(summary, labels),
221
+ ...break_violations(summary, labels),
242
222
  ]
243
223
  }
244
224
 
@@ -254,13 +234,8 @@ function with_reference(violations: ReadonlyArray<string>): ReadonlyArray<string
254
234
  const report_lint = {
255
235
  lint_report,
256
236
  with_reference,
257
- REQUIRED_LABELS,
237
+ required_labels,
258
238
  MAX_OVERVIEW_CHARS,
259
- CASE_LABEL,
260
- CASE_VOCABULARY,
261
- BREAK_LABEL,
262
- NA_LABEL,
263
- NO_BREAK_ESCAPE,
264
239
  MIN_BREAK_CONDITIONS,
265
240
  }
266
241
 
@@ -0,0 +1,59 @@
1
+ #!/usr/bin/env tsx
2
+ import { fileURLToPath } from 'node:url'
3
+ import { cases_interaction_scan } from '#scripts/cases/cases-interaction-scan'
4
+ import { cases } from '#scripts/cases/cases-logic'
5
+ import { josh_environment_file } from '#scripts/josh/josh-environment-file'
6
+ import { session_language } from '#scripts/josh/session-language'
7
+ import { report_labels } from './report-labels'
8
+ import { report_template, type ChangeInput } from './report-template'
9
+
10
+ // `josh report:template summary|done [<path>...]` — print the work summary or the completion report
11
+ // skeleton in the session language. Each path is a file the change touches; it fills the target and
12
+ // changed-file lines, and for the summary its own change block, opened by the abnormal cases
13
+ // `josh cases` owes for it.
14
+
15
+ const ARGV_OFFSET = 2
16
+ const SUCCESS_EXIT_CODE = 0
17
+ const FAILURE_EXIT_CODE = 1
18
+ const USAGE = `Usage: josh report:template ${report_template.KINDS.join('|')} [<path>...]`
19
+
20
+ // The owed cases follow the session language, so an English skeleton carries English conditions. The
21
+ // shared-state and environment cases lead: they name the other components a change can break with,
22
+ // which the I/O cases after them do not.
23
+ async function change_for(path: string): Promise<ChangeInput> {
24
+ const { lang } = session_language.resolve_session_lang()
25
+ const findings = await cases_interaction_scan.scan([path])
26
+ const io_cases = cases.cases_for(cases.boundaries_in([path]), lang)
27
+
28
+ return {
29
+ path,
30
+ abnormal_cases: [...cases_interaction_scan.lines_for(findings, lang), ...io_cases],
31
+ }
32
+ }
33
+
34
+ async function run(argv: ReadonlyArray<string>): Promise<number> {
35
+ const [kind = '', ...paths] = argv
36
+
37
+ if (!report_template.is_kind(kind)) {
38
+ console.error(USAGE)
39
+
40
+ return FAILURE_EXIT_CODE
41
+ }
42
+
43
+ const changes = await Promise.all(paths.map(async (path) => await change_for(path)))
44
+
45
+ console.info(report_template.build(kind, changes, report_labels.session_labels()))
46
+
47
+ return SUCCESS_EXIT_CODE
48
+ }
49
+
50
+ async function main(argv: ReadonlyArray<string>): Promise<void> {
51
+ josh_environment_file.load_environment_file()
52
+ process.exitCode = await run(argv)
53
+ }
54
+
55
+ const report_template_cli = { run }
56
+
57
+ if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
58
+
59
+ export { report_template_cli }
@@ -0,0 +1,112 @@
1
+ import type { ReportLabels } from './report-labels'
2
+ import { report_lint } from './report-lint'
3
+
4
+ // The skeletons `report:template` prints — the work summary and the completion report — built from
5
+ // the one label table `report:lint` checks against, so a printed skeleton always passes the lint in
6
+ // the session's language. What a command can answer is filled in: each changed path gets its own
7
+ // change block, and the abnormal cases `josh cases` owes for that path open its "if it breaks" tier.
8
+ // The rest is a `<…>` placeholder, the sentences only the writer can supply.
9
+
10
+ type TemplateKind = 'summary' | 'done'
11
+
12
+ interface ChangeInput {
13
+ path: string
14
+ abnormal_cases: ReadonlyArray<string>
15
+ }
16
+
17
+ const KINDS: ReadonlyArray<TemplateKind> = ['summary', 'done']
18
+ const KIND_NAMES: ReadonlySet<string> = new Set(KINDS)
19
+ const PLACEHOLDER = '<…>'
20
+ // The test line after the changed path: what changes, the test kind, the test file, the behavior.
21
+ const TEST_LINE = `${PLACEHOLDER} — Test: <Unit|E2E> — ${PLACEHOLDER} — ${PLACEHOLDER}`
22
+
23
+ function is_kind(value: string): value is TemplateKind {
24
+ return KIND_NAMES.has(value)
25
+ }
26
+
27
+ function bold(label: string): string {
28
+ return `**${label}**`
29
+ }
30
+
31
+ function item(label: string, value: string): string {
32
+ return `- ${bold(label)}: ${value}`
33
+ }
34
+
35
+ function code_list(paths: ReadonlyArray<string>): string {
36
+ return paths.length === 0 ? PLACEHOLDER : paths.map((path) => `\`${path}\``).join(', ')
37
+ }
38
+
39
+ // The owed abnormal cases first, then placeholders up to the lint's minimum — never fewer than three.
40
+ function break_conditions(abnormal_cases: ReadonlyArray<string>): ReadonlyArray<string> {
41
+ const padding = Math.max(report_lint.MIN_BREAK_CONDITIONS - abnormal_cases.length, 0)
42
+ const conditions = [...abnormal_cases, ...Array.from({ length: padding }, () => PLACEHOLDER)]
43
+
44
+ return conditions.map((condition, index) => ` ${String(index + 1)}. ${condition}`)
45
+ }
46
+
47
+ function change_block(change: ChangeInput, index: number, labels: ReportLabels): string {
48
+ return [
49
+ `${String(index + 1)}. \`${change.path}\`: ${TEST_LINE}`,
50
+ ` - ${labels.cases}: ${labels.case_vocabulary.join(' / ')}`,
51
+ ` - ${labels.if_it_breaks}:`,
52
+ ...break_conditions(change.abnormal_cases),
53
+ ].join('\n')
54
+ }
55
+
56
+ // No path still yields one block, so the skeleton keeps the shape the lint checks.
57
+ function change_blocks(changes: ReadonlyArray<ChangeInput>, labels: ReportLabels): string {
58
+ const blocks = changes.length === 0 ? [{ path: PLACEHOLDER, abnormal_cases: [] }] : changes
59
+
60
+ return blocks.map((change, index) => change_block(change, index, labels)).join('\n')
61
+ }
62
+
63
+ function summary_template(changes: ReadonlyArray<ChangeInput>, labels: ReportLabels): string {
64
+ return [
65
+ bold(labels.overview),
66
+ '',
67
+ item(labels.now, PLACEHOLDER),
68
+ item(labels.change, PLACEHOLDER),
69
+ item(labels.check, PLACEHOLDER),
70
+ '',
71
+ bold(labels.details),
72
+ '',
73
+ `- ${labels.target}: ${code_list(changes.map((change) => change.path))}`,
74
+ `- ${labels.approach}: ${PLACEHOLDER}`,
75
+ `- ${labels.out_of_scope}: ${PLACEHOLDER}`,
76
+ '',
77
+ bold(labels.changes),
78
+ '',
79
+ change_blocks(changes, labels),
80
+ ].join('\n')
81
+ }
82
+
83
+ function done_template(changes: ReadonlyArray<ChangeInput>, labels: ReportLabels): string {
84
+ return [
85
+ bold(labels.completion),
86
+ '',
87
+ item(labels.cause, PLACEHOLDER),
88
+ item(labels.fix, PLACEHOLDER),
89
+ item(labels.result, `${PLACEHOLDER} (v<version>)`),
90
+ '',
91
+ bold(labels.details),
92
+ '',
93
+ `- ${labels.changed_files}: ${code_list(changes.map((change) => change.path))}`,
94
+ `- ${labels.test_results}: ${PLACEHOLDER}`,
95
+ `- ${labels.evidence}: ${PLACEHOLDER}`,
96
+ `- ${labels.caught_by}: ${PLACEHOLDER}`,
97
+ `- ${labels.remaining}: ${PLACEHOLDER}`,
98
+ ].join('\n')
99
+ }
100
+
101
+ function build(
102
+ kind: TemplateKind,
103
+ changes: ReadonlyArray<ChangeInput>,
104
+ labels: ReportLabels,
105
+ ): string {
106
+ return kind === 'summary' ? summary_template(changes, labels) : done_template(changes, labels)
107
+ }
108
+
109
+ const report_template = { KINDS, build, is_kind }
110
+
111
+ export type { ChangeInput, TemplateKind }
112
+ export { report_template }
@@ -197,6 +197,7 @@ const acceptance_map = {
197
197
  criterion_id,
198
198
  has_map,
199
199
  refusal_message,
200
+ ROW_FORMAT,
200
201
  rows_of,
201
202
  skeleton,
202
203
  }
@@ -0,0 +1,86 @@
1
+ import { existsSync, readFileSync } from 'node:fs'
2
+ import path from 'node:path'
3
+ import { git_gh_command } from '#scripts/gh/git-gh-command'
4
+ import { change_base } from '#scripts/git/change-base'
5
+ import { changed_paths } from '#scripts/git/changed-paths'
6
+ import { git_command } from '#scripts/git/git-command'
7
+ import { test_declared_logic } from '#scripts/test/test-declared-logic'
8
+ import type { TypeScriptApi } from './comment-ranges'
9
+ import { removed_tests } from './removed-tests'
10
+ import { review_code_tree } from './review-code-tree'
11
+ import { test_titles } from './test-titles'
12
+
13
+ // The reads behind `removed_tests`: the change base, the test files changed since it, each one's text
14
+ // at the base and in the working tree, and the pull request body. Kept apart so the comparison stays
15
+ // pure.
16
+ //
17
+ // **The base is the tree's, through a merge in progress** (`change_base.resolved_through_merge`): the
18
+ // head side is the work tree, so a stopped merge of the default branch has already removed whatever
19
+ // tests the default branch removed, and measuring from `HEAD`'s older merge-base would list them as
20
+ // this change's own.
21
+ //
22
+ // **A base that cannot be resolved is a refusal, not a pass** — the tests it would have held are
23
+ // exactly what this gate exists to see. A file is read at the base only where the base holds it, so a
24
+ // failed `git show` throws rather than reading as a file that had no tests. TypeScript is an optional
25
+ // peer of this package (`review_code_tree.load_typescript`): a project without it has no titles to
26
+ // compare and merges as before.
27
+
28
+ const UNREADABLE_MESSAGE =
29
+ 'Merge refused: the change base could not be resolved, so the tests this change removes could not be listed; re-run once `git merge-base` answers.'
30
+
31
+ function titles_in(api: TypeScriptApi, texts: ReadonlyArray<string>): ReadonlyArray<string> {
32
+ return texts.flatMap((text) => test_titles.titles_of(api, text))
33
+ }
34
+
35
+ async function base_texts(
36
+ base: string,
37
+ paths: ReadonlyArray<string>,
38
+ ): Promise<ReadonlyArray<string>> {
39
+ const held = await changed_paths.read_held_at(base, paths)
40
+
41
+ return await Promise.all(
42
+ held.map(async (relative) => await git_command.show_file(`${base}:${relative}`)),
43
+ )
44
+ }
45
+
46
+ // A test file the change deleted is absent from the tree, and every title it held reads as gone.
47
+ function tree_texts(root: string, paths: ReadonlyArray<string>): ReadonlyArray<string> {
48
+ return paths
49
+ .map((relative) => path.join(root, relative))
50
+ .filter((absolute) => existsSync(absolute))
51
+ .map((absolute) => readFileSync(absolute, 'utf8'))
52
+ }
53
+
54
+ async function read(): Promise<ReadonlyArray<string> | undefined> {
55
+ const base = await change_base.resolved_through_merge()
56
+
57
+ if (base === undefined) return undefined
58
+ const root = await git_command.repository_root()
59
+ const api = review_code_tree.load_typescript(root)
60
+
61
+ if (api === undefined) return []
62
+ const changed = await changed_paths.read_changed_since(base)
63
+ const paths = changed.filter((relative) => test_declared_logic.is_test_file(relative))
64
+ const before = titles_in(api, await base_texts(base, paths))
65
+
66
+ return removed_tests.removed(before, titles_in(api, tree_texts(root, paths)))
67
+ }
68
+
69
+ // `josh ship`'s preflight asks the body it is about to deliver, so a missing disposition stops it
70
+ // before the review rather than at the merge.
71
+ async function body_refusal(pr_body: string | undefined): Promise<string | undefined> {
72
+ const removed = await read()
73
+
74
+ if (removed === undefined) return UNREADABLE_MESSAGE
75
+ const left = removed_tests.undisposed(removed, pr_body)
76
+
77
+ return left.length === 0 ? undefined : removed_tests.refusal_message(left)
78
+ }
79
+
80
+ async function refusal(branch_name: string): Promise<string | undefined> {
81
+ return await body_refusal(await git_gh_command.pr_get_body(branch_name))
82
+ }
83
+
84
+ const removed_tests_check = { body_refusal, read, refusal, UNREADABLE_MESSAGE }
85
+
86
+ export { removed_tests_check }