@joshuafolkken/kit 1.1471.0 → 1.1784.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (895) hide show
  1. package/.claude/agents/investigator.md +1 -1
  2. package/.claude/settings.json +6 -6
  3. package/.claude/skills/epic-commands/SKILL.md +26 -77
  4. package/.claude/skills/epic-commands/epic-bundle.md +12 -6
  5. package/.claude/skills/epic-commands/execution-waves.md +1 -2
  6. package/.claude/skills/verify-ui/SKILL.md +1 -2
  7. package/.claude/skills/workflow-commands/SKILL.md +12 -14
  8. package/.claude/skills/workflow-commands/background-commands.md +8 -12
  9. package/.claude/skills/workflow-commands/backlogrun-child.md +13 -18
  10. package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +7 -25
  11. package/.claude/skills/workflow-commands/backlogrun-lanes.md +23 -28
  12. package/.claude/skills/workflow-commands/backlogrun-park.md +16 -31
  13. package/.claude/skills/workflow-commands/backlogrun-progress.md +12 -21
  14. package/.claude/skills/workflow-commands/backlogrun-recovery.md +12 -12
  15. package/.claude/skills/workflow-commands/backlogrun-steps.md +12 -20
  16. package/.claude/skills/workflow-commands/backlogrun.md +32 -51
  17. package/.claude/skills/workflow-commands/chain-rule.md +18 -11
  18. package/.claude/skills/workflow-commands/delegation.md +13 -8
  19. package/.claude/skills/workflow-commands/entry-sequence.md +10 -12
  20. package/.claude/skills/workflow-commands/followup.md +10 -35
  21. package/.claude/skills/workflow-commands/fullrun-steps.md +38 -49
  22. package/.claude/skills/workflow-commands/fullrun.md +6 -8
  23. package/.claude/skills/workflow-commands/halfrun.md +20 -32
  24. package/.claude/skills/workflow-commands/into-target.md +1 -2
  25. package/.claude/skills/workflow-commands/issue-comments.md +19 -15
  26. package/.claude/skills/workflow-commands/issue-scout.md +5 -4
  27. package/.claude/skills/workflow-commands/kickoff.md +24 -23
  28. package/.claude/skills/workflow-commands/latest-gate.md +9 -18
  29. package/.claude/skills/workflow-commands/needs-human-review.md +11 -19
  30. package/.claude/skills/workflow-commands/observation-filing.md +4 -50
  31. package/.claude/skills/workflow-commands/observation-ledger.md +5 -10
  32. package/.claude/skills/workflow-commands/pre-gate-cut.md +22 -44
  33. package/.claude/skills/workflow-commands/prerequisite.md +11 -18
  34. package/.claude/skills/workflow-commands/progress-watcher.md +3 -8
  35. package/.claude/skills/workflow-commands/prrun.md +6 -12
  36. package/.claude/skills/workflow-commands/retrospective.md +5 -5
  37. package/.claude/skills/workflow-commands/split-assessment.md +14 -4
  38. package/.claude/skills/workflow-commands/target-repository.md +1 -2
  39. package/.claude/skills/workflow-commands/working-tree-hold.md +11 -13
  40. package/.codex/hooks.json +6 -6
  41. package/.github/actions/setup-node/action.yml +10 -1
  42. package/.github/actions/setup-pnpm/action.yml +1 -1
  43. package/.github/dependabot.yml +16 -0
  44. package/.github/release.yml +0 -2
  45. package/.github/workflows/ci.yml +121 -11
  46. package/.github/workflows/publish.yml +10 -3
  47. package/.github/workflows/sonar-qube.yml +1 -0
  48. package/.prettierignore +2 -0
  49. package/.vscode/tasks.json +1 -2
  50. package/CLAUDE.md +4 -8
  51. package/README.md +4 -2
  52. package/SECURITY.md +1 -1
  53. package/cspell/index.yaml +7 -0
  54. package/dist/CLAUDE.md +4 -8
  55. package/dist/commands/document-read-cli.js +882 -0
  56. package/dist/commands/{document-section-cli.js → document-section-main.js} +137 -62
  57. package/dist/commands/read-set-cli.js +1867 -0
  58. package/dist/commands/run-prep-main.js +21653 -0
  59. package/dist/commands/run-step-cli.js +23880 -0
  60. package/dist/config-merge/index.js +5 -1
  61. package/dist/hooks/audit-provision.js +20 -35
  62. package/dist/hooks/{chunk-DGT54IH5.js → chunk-AZX4FGQ3.js} +63 -17
  63. package/dist/hooks/chunk-CWMBGKYW.js +6483 -0
  64. package/dist/hooks/chunk-O2YBIDSI.js +4306 -0
  65. package/dist/hooks/{chunk-AS74OU3D.js → chunk-PT5R6UJD.js} +4582 -2118
  66. package/dist/hooks/chunk-TUIFS5E7.js +72 -0
  67. package/dist/hooks/{chunk-723HKZO5.js → chunk-VWWCFGWK.js} +1 -1
  68. package/dist/hooks/{chunk-E7OIKX5Z.js → chunk-WR2KQAYZ.js} +1863 -382
  69. package/dist/hooks/{chunk-KC5AK2GF.js → chunk-XGBNSWEI.js} +248 -46
  70. package/dist/hooks/chunk-YCDOIR3I.js +3456 -0
  71. package/dist/hooks/codex-hook-adapter.js +10 -19
  72. package/dist/hooks/format-edited.js +5 -5
  73. package/dist/hooks/inputs.json +436 -257
  74. package/dist/hooks/pretool-guard.js +7 -22
  75. package/dist/hooks/session-lang.js +380 -42
  76. package/dist/hooks/stop-guard.js +8711 -782
  77. package/dist/josh.js +5263 -997
  78. package/dist/self-sync-guard/index.js +74 -10
  79. package/dist/version/index.js +115 -406
  80. package/eslint/base.js +1 -1
  81. package/lefthook/base.yml +8 -4
  82. package/package.json +17 -53
  83. package/pnpm-workspace.yaml +4 -2
  84. package/prompts/coding-standards.md +1 -1
  85. package/prompts/collaboration-workflow/file-edits.md +1 -9
  86. package/prompts/collaboration-workflow/gh-rest.md +1 -2
  87. package/prompts/collaboration-workflow/issue-citation.md +2 -4
  88. package/prompts/collaboration-workflow/issue-template.md +42 -17
  89. package/prompts/collaboration-workflow/lane-instructions.md +34 -0
  90. package/prompts/collaboration-workflow/measurement.md +37 -0
  91. package/prompts/collaboration-workflow/operating-rules.md +6 -12
  92. package/prompts/collaboration-workflow/output-bounds.md +4 -9
  93. package/prompts/collaboration-workflow/overview.md +1 -1
  94. package/prompts/collaboration-workflow/plan-comment.md +3 -42
  95. package/prompts/collaboration-workflow/principles.md +19 -8
  96. package/prompts/collaboration-workflow/report-format.md +37 -57
  97. package/prompts/collaboration-workflow/residency.md +12 -8
  98. package/prompts/collaboration-workflow/rule-delivery.md +3 -11
  99. package/prompts/collaboration-workflow/shell-body.md +8 -18
  100. package/prompts/collaboration-workflow/turn-batching.md +4 -6
  101. package/prompts/collaboration-workflow/upstream-interrupt.md +16 -6
  102. package/prompts/collaboration-workflow/wip-cap.md +7 -7
  103. package/prompts/collaboration-workflow.md +4 -7
  104. package/prompts/refactoring.md +1 -1
  105. package/prompts/review-rubric.md +1 -2
  106. package/prompts/review.md +45 -26
  107. package/prompts/testing-guide.md +10 -45
  108. package/scripts/agent/agent-argv.ts +20 -4
  109. package/scripts/agent/agent-event.ts +15 -15
  110. package/scripts/agent/agent-exit-record.ts +13 -1
  111. package/scripts/agent/agent-role-profile.ts +101 -45
  112. package/scripts/agent/agent-safe-text.ts +60 -0
  113. package/scripts/agent/api-auth.ts +41 -0
  114. package/scripts/agent/api-outage.ts +1 -1
  115. package/scripts/agent/claude-agent-argv.ts +14 -0
  116. package/scripts/agent/codex-agent-argv.ts +2 -0
  117. package/scripts/agent/lane-instructions.ts +144 -0
  118. package/scripts/auto-ok/auto-ok-cli.ts +14 -16
  119. package/scripts/auto-ok/auto-ok-judge-read.ts +12 -3
  120. package/scripts/auto-ok/auto-ok-judge-write.ts +46 -19
  121. package/scripts/auto-ok/auto-ok-judge.ts +13 -2
  122. package/scripts/auto-ok/auto-ok-main.ts +17 -0
  123. package/scripts/backlog/backlog-arrival.ts +14 -3
  124. package/scripts/backlog/backlog-budget-cli.ts +7 -33
  125. package/scripts/backlog/backlog-budget-main.ts +16 -0
  126. package/scripts/backlog/backlog-budget.ts +6 -7
  127. package/scripts/backlog/backlog-defect-priority.ts +4 -3
  128. package/scripts/backlog/backlog-drive-adopt.ts +67 -0
  129. package/scripts/backlog/backlog-drive-args.ts +4 -5
  130. package/scripts/backlog/backlog-drive-cli.ts +113 -28
  131. package/scripts/backlog/backlog-drive-hold.ts +162 -0
  132. package/scripts/backlog/backlog-drive-idle.ts +151 -0
  133. package/scripts/backlog/backlog-drive-judge.ts +25 -0
  134. package/scripts/backlog/backlog-drive-memory.ts +126 -0
  135. package/scripts/backlog/backlog-drive-named-offer.ts +5 -10
  136. package/scripts/backlog/backlog-drive-named.ts +54 -7
  137. package/scripts/backlog/backlog-drive-offer-argv.ts +3 -8
  138. package/scripts/backlog/backlog-drive-paused.ts +169 -0
  139. package/scripts/backlog/backlog-drive-restore.ts +39 -8
  140. package/scripts/backlog/backlog-drive-seats.ts +18 -8
  141. package/scripts/backlog/backlog-drive-token-handling.ts +38 -0
  142. package/scripts/backlog/backlog-drive.ts +79 -75
  143. package/scripts/backlog/backlog-next-main.ts +16 -0
  144. package/scripts/backlog/backlog-next-shared.ts +73 -0
  145. package/scripts/backlog/backlog-next.ts +48 -16
  146. package/scripts/backlog/backlog-occupied.ts +69 -0
  147. package/scripts/backlog/backlog-offer-cli.ts +6 -21
  148. package/scripts/backlog/backlog-offer-exclude.ts +15 -0
  149. package/scripts/backlog/backlog-offer-main.ts +12 -0
  150. package/scripts/backlog/backlog-offer.ts +36 -3
  151. package/scripts/backlog/backlog-overlap.ts +22 -4
  152. package/scripts/backlog/backlog-plan-read.ts +6 -2
  153. package/scripts/backlog/backlog-plan.ts +18 -4
  154. package/scripts/backlog/backlog-pool.ts +10 -10
  155. package/scripts/backlog/backlog-rank.ts +10 -2
  156. package/scripts/backlog/backlog-ready.ts +137 -18
  157. package/scripts/backlog/backlog-stalled-detect.ts +109 -36
  158. package/scripts/backlog/backlog-stalled.ts +52 -16
  159. package/scripts/backlog/backlog-wait-cause.ts +86 -0
  160. package/scripts/backlog/backlog-waves.ts +39 -13
  161. package/scripts/backlog/backlogrun-args.ts +19 -7
  162. package/scripts/backlog/backlogrun-cli.ts +19 -5
  163. package/scripts/backlog/backlogrun-launch.ts +6 -0
  164. package/scripts/backlog/backlogrun-restart.ts +97 -0
  165. package/scripts/backlog/backlogrun-stop.ts +79 -7
  166. package/scripts/behavior/behavior-cli.ts +2 -2
  167. package/scripts/behavior/behavior-rules.ts +47 -24
  168. package/scripts/build/build-bin.ts +2 -16
  169. package/scripts/build/build-claude-md.ts +0 -7
  170. package/scripts/build/build-commands.ts +0 -13
  171. package/scripts/build/build-hooks.ts +49 -48
  172. package/scripts/build/hook-bundle-stamp.ts +29 -11
  173. package/scripts/build/local-bin.ts +1 -1
  174. package/scripts/cases/cases-cli.ts +25 -13
  175. package/scripts/cases/cases-interaction-scan.ts +134 -0
  176. package/scripts/cases/cases-interaction.ts +183 -0
  177. package/scripts/cases/cases-logic.ts +39 -6
  178. package/scripts/ci/pr-classification-main.ts +18 -0
  179. package/scripts/ci/pr-classification.ts +10 -17
  180. package/scripts/clone/clone-scan.ts +1 -1
  181. package/scripts/cost-runtime/cost-blocks.ts +22 -37
  182. package/scripts/cost-runtime/cost-cli.ts +31 -14
  183. package/scripts/cost-runtime/cost-main.ts +12 -0
  184. package/scripts/cost-runtime/cost-transcript.ts +1 -0
  185. package/scripts/delegation/delegation-policy.ts +17 -4
  186. package/scripts/delegation/duplicate-read-guard.ts +2 -10
  187. package/scripts/delegation/investigation-guard.ts +15 -73
  188. package/scripts/delegation/investigation-reads.ts +3 -5
  189. package/scripts/dependabot/dependabot-cooldown.ts +194 -0
  190. package/scripts/discovery/repo-discovery.ts +24 -6
  191. package/scripts/doctor/doctor-consumer.ts +2 -5
  192. package/scripts/document/document-byte-budget.ts +9 -6
  193. package/scripts/document/document-scan.ts +1 -1
  194. package/scripts/document/document-section-cli.ts +17 -13
  195. package/scripts/document/document-section-main.ts +12 -0
  196. package/scripts/document/entry-read-budget.ts +2 -2
  197. package/scripts/document/read-set-cli.ts +4 -1
  198. package/scripts/epic/epic-audit-cli.ts +12 -6
  199. package/scripts/epic/epic-audit-orphans.ts +5 -8
  200. package/scripts/epic/epic-audit.ts +52 -1
  201. package/scripts/epic/epic-bundle-apply.ts +137 -0
  202. package/scripts/epic/epic-bundle-cli.ts +32 -121
  203. package/scripts/epic/epic-bundle-evidence.ts +49 -26
  204. package/scripts/epic/epic-bundle-format.ts +116 -0
  205. package/scripts/epic/epic-bundle-main.ts +17 -0
  206. package/scripts/epic/epic-bundle-referenced.ts +14 -3
  207. package/scripts/epic/epic-bundle.ts +17 -9
  208. package/scripts/epic/epic-busy.ts +5 -12
  209. package/scripts/epic/epic-classify.ts +24 -15
  210. package/scripts/epic/epic-cli-argv.ts +31 -0
  211. package/scripts/epic/epic-cli-decide.ts +42 -0
  212. package/scripts/epic/epic-cli.ts +6 -38
  213. package/scripts/epic/epic-close.ts +112 -55
  214. package/scripts/epic/epic-cross-repo.ts +4 -7
  215. package/scripts/epic/epic-decide.ts +119 -0
  216. package/scripts/epic/epic-decision.ts +9 -0
  217. package/scripts/epic/epic-fetch.ts +4 -0
  218. package/scripts/epic/epic-graph.ts +2 -0
  219. package/scripts/epic/epic-issue.ts +5 -1
  220. package/scripts/epic/epic-label-age.ts +1 -1
  221. package/scripts/epic/epic-lane-offer.ts +39 -4
  222. package/scripts/epic/epic-next-main.ts +24 -0
  223. package/scripts/epic/epic-next.ts +6 -24
  224. package/scripts/epic/epic-outside-blocker.ts +6 -2
  225. package/scripts/epic/epic-parse.ts +9 -3
  226. package/scripts/epic/epic-read.ts +1 -0
  227. package/scripts/epic/epic-reconcile.ts +39 -0
  228. package/scripts/epic/epic-run.ts +10 -1
  229. package/scripts/epic/epic-solo.ts +50 -14
  230. package/scripts/epic/epic.ts +41 -7
  231. package/scripts/exports/unused-members-cli.ts +2 -2
  232. package/scripts/followup/followup-checks-event.ts +8 -3
  233. package/scripts/followup/followup-coderabbit-wait.ts +82 -0
  234. package/scripts/followup/followup-review-gates.ts +81 -0
  235. package/scripts/followup/git-followup-stages.ts +13 -3
  236. package/scripts/followup/git-followup-workflow.ts +31 -60
  237. package/scripts/followup/git-pr-followup-wrapup.ts +9 -14
  238. package/scripts/followup/git-pr-followup.ts +36 -8
  239. package/scripts/fresh-machine/fresh-machine-cli.ts +1 -1
  240. package/scripts/fresh-machine/fresh-machine-run.ts +8 -8
  241. package/scripts/fresh-machine/specs/kit-test-backlogrun.json +1 -1
  242. package/scripts/gate/busy-average.ts +58 -0
  243. package/scripts/gate/check-cpu.ts +60 -0
  244. package/scripts/gate/check-inputs.ts +73 -0
  245. package/scripts/gate/check-reuse.ts +141 -0
  246. package/scripts/gate/command-memory.ts +192 -0
  247. package/scripts/gate/core-admission.ts +218 -28
  248. package/scripts/gate/core-budget-timing.ts +37 -0
  249. package/scripts/gate/core-budget.ts +150 -119
  250. package/scripts/gate/core-wait-record.ts +48 -0
  251. package/scripts/gate/core-wait.ts +162 -0
  252. package/scripts/gate/core-weights.ts +86 -0
  253. package/scripts/gate/free-cores.ts +72 -0
  254. package/scripts/gate/gate-ledger.ts +49 -7
  255. package/scripts/gate/gate-plan.ts +44 -15
  256. package/scripts/gate/gate-report.ts +29 -4
  257. package/scripts/gate/gate-run-steps.ts +195 -0
  258. package/scripts/gate/gate-skip.ts +12 -2
  259. package/scripts/gate/gate-steps.ts +12 -1
  260. package/scripts/gate/held-mark.ts +55 -0
  261. package/scripts/gate/input-fingerprint.ts +42 -0
  262. package/scripts/gate/machine-capacity.ts +124 -31
  263. package/scripts/gate/moved-paths.ts +67 -0
  264. package/scripts/gate/pre-commit-type-check.ts +14 -1
  265. package/scripts/gate/project-checks.ts +5 -12
  266. package/scripts/gate/scoped-green.ts +12 -8
  267. package/scripts/gate/since-green.ts +62 -0
  268. package/scripts/gate/toolchain-inputs.ts +115 -0
  269. package/scripts/gate/verification-gate.ts +65 -129
  270. package/scripts/gate/verification-inputs.ts +250 -0
  271. package/scripts/gh/gh-author-association.ts +96 -9
  272. package/scripts/gh/git-ai-review-scan.ts +4 -2
  273. package/scripts/gh/git-gh-api-path.ts +15 -0
  274. package/scripts/gh/git-gh-branch-rules.ts +73 -0
  275. package/scripts/gh/git-gh-conditional.ts +5 -2
  276. package/scripts/gh/git-gh-issue-read.ts +5 -1
  277. package/scripts/gh/git-gh-issue-rest.ts +1 -0
  278. package/scripts/gh/git-gh-issue-write.ts +77 -17
  279. package/scripts/gh/git-gh-issue.ts +7 -3
  280. package/scripts/gh/git-gh-poll-read.ts +89 -0
  281. package/scripts/gh/git-gh-pr-auto-merge.ts +8 -3
  282. package/scripts/gh/git-gh-pr-rest.ts +1 -1
  283. package/scripts/gh/git-gh-pr-snapshot.ts +33 -20
  284. package/scripts/gh/git-gh-pr.ts +27 -15
  285. package/scripts/gh/git-pr-checks-eval.ts +39 -7
  286. package/scripts/gh/git-pr-checks-parse.ts +39 -9
  287. package/scripts/gh/git-pr-merge-checked.ts +80 -0
  288. package/scripts/gh/git-pr.ts +13 -1
  289. package/scripts/git/base-tree.ts +19 -2
  290. package/scripts/git/changed-file-scope.ts +6 -4
  291. package/scripts/git/changed-paths.ts +18 -1
  292. package/scripts/git/git-diff-reads.ts +27 -2
  293. package/scripts/git/git-grep-hits.ts +85 -0
  294. package/scripts/git/git-location-environment.ts +1 -1
  295. package/scripts/git/git-merge-conflicts.ts +83 -0
  296. package/scripts/git/git-preflight.ts +37 -12
  297. package/scripts/git/git-push-transport.ts +1 -2
  298. package/scripts/git/git-schemas.ts +17 -7
  299. package/scripts/git/git-spawn.ts +1 -2
  300. package/scripts/git/git-status.ts +4 -4
  301. package/scripts/git/main-merge-main.ts +12 -0
  302. package/scripts/git/main-merge-regenerate.ts +78 -0
  303. package/scripts/git/main-merge.ts +39 -14
  304. package/scripts/git/main-sync-main.ts +12 -0
  305. package/scripts/git/main-sync.ts +0 -9
  306. package/scripts/git/stash/git-stash.ts +27 -4
  307. package/scripts/git/stash/{stash-pop-args.ts → stash-args.ts} +13 -10
  308. package/scripts/git/stash/stash-pop-cli.ts +6 -12
  309. package/scripts/git/stash/stash-pop-main.ts +12 -0
  310. package/scripts/git/stash/stash-push-cli.ts +76 -0
  311. package/scripts/git/stash/stash-push-main.ts +12 -0
  312. package/scripts/hooks/batch-guard.ts +5 -16
  313. package/scripts/hooks/check-commit-message-main.ts +8 -0
  314. package/scripts/hooks/check-commit-message.ts +4 -7
  315. package/scripts/hooks/format-edited-file.ts +8 -24
  316. package/scripts/hooks/pre-commit-lint.ts +118 -0
  317. package/scripts/hooks/pre-push-unit.ts +4 -2
  318. package/scripts/hooks/pretool-guard-cli.ts +1 -8
  319. package/scripts/hooks/pretool-guard.ts +57 -69
  320. package/scripts/hooks/reserved-run.ts +67 -8
  321. package/scripts/hooks/run-hook.sh +18 -11
  322. package/scripts/hooks/shell-rules-notice.ts +37 -0
  323. package/scripts/hooks/stop-actions.ts +185 -0
  324. package/scripts/hooks/stop-guard.ts +72 -27
  325. package/scripts/init/hook-command-rewrite.ts +19 -5
  326. package/scripts/init/hook-launch.ts +15 -12
  327. package/scripts/init/init-actions.ts +0 -6
  328. package/scripts/init/init-ai-copy.ts +10 -36
  329. package/scripts/init/init-bootstrap.ts +9 -8
  330. package/scripts/init/init-dry-run-report.ts +1 -1
  331. package/scripts/init/init-dry-run.ts +1 -1
  332. package/scripts/init/init-file-action.ts +7 -9
  333. package/scripts/init/init-logic-json-merge.ts +2 -2
  334. package/scripts/init/init-logic-migrate.ts +9 -82
  335. package/scripts/init/init-logic.ts +3 -2
  336. package/scripts/init/init-main.ts +12 -0
  337. package/scripts/init/init.ts +5 -12
  338. package/scripts/init/kit-development-versions.ts +3 -7
  339. package/scripts/init/kit-written-paths.ts +2 -2
  340. package/scripts/init/project-profile.ts +5 -4
  341. package/scripts/init/tsconfig-preset-migration.ts +2 -1
  342. package/scripts/init/vscode-tasks.ts +1 -1
  343. package/scripts/issue/defect-origin-cli.ts +106 -0
  344. package/scripts/issue/defect-origin-line.ts +60 -0
  345. package/scripts/issue/defect-origin-main.ts +11 -0
  346. package/scripts/issue/defect-origin.ts +114 -0
  347. package/scripts/issue/defect-rate-cli.ts +34 -78
  348. package/scripts/issue/defect-rate.ts +0 -16
  349. package/scripts/issue/defect-report-cli.ts +128 -0
  350. package/scripts/issue/defect-report-format.ts +56 -0
  351. package/scripts/issue/defect-report-main.ts +11 -0
  352. package/scripts/issue/defect-report.ts +160 -0
  353. package/scripts/issue/expected-effect-lint.ts +60 -0
  354. package/scripts/issue/issue-already-done-cli.ts +62 -0
  355. package/scripts/issue/issue-body-or-comment.ts +40 -0
  356. package/scripts/issue/issue-cite-cli.ts +33 -22
  357. package/scripts/issue/issue-cite-main.ts +12 -0
  358. package/scripts/issue/issue-classification.ts +13 -8
  359. package/scripts/issue/issue-comment-cli.ts +10 -24
  360. package/scripts/issue/issue-comment-main.ts +12 -0
  361. package/scripts/issue/issue-evidence-exit.ts +100 -0
  362. package/scripts/issue/issue-file-cli.ts +29 -7
  363. package/scripts/issue/issue-file.ts +19 -19
  364. package/scripts/issue/issue-fold-cli.ts +2 -11
  365. package/scripts/issue/issue-fold-main.ts +12 -0
  366. package/scripts/issue/issue-labels.ts +81 -90
  367. package/scripts/issue/issue-lint-cli.ts +7 -13
  368. package/scripts/issue/issue-lint-main.ts +12 -0
  369. package/scripts/issue/issue-measured-cli.ts +56 -0
  370. package/scripts/issue/issue-merged.ts +19 -2
  371. package/scripts/issue/issue-not-before-label.ts +135 -0
  372. package/scripts/issue/issue-not-before.ts +111 -0
  373. package/scripts/issue/issue-number-shape.ts +15 -1
  374. package/scripts/issue/issue-park.ts +28 -0
  375. package/scripts/issue/issue-plan-cli.ts +151 -0
  376. package/scripts/issue/issue-priority.ts +151 -0
  377. package/scripts/issue/issue-rank.ts +7 -1
  378. package/scripts/issue/issue-read-cli.ts +3 -10
  379. package/scripts/issue/issue-read-main.ts +12 -0
  380. package/scripts/issue/issue-read.ts +29 -5
  381. package/scripts/issue/issue-release-cli.ts +0 -10
  382. package/scripts/issue/issue-release-main.ts +13 -0
  383. package/scripts/issue/issue-release.ts +7 -12
  384. package/scripts/issue/issue-sample-gate.ts +192 -0
  385. package/scripts/issue/issue-sample-source.ts +76 -0
  386. package/scripts/issue/issue-scout-cli.ts +19 -25
  387. package/scripts/issue/issue-scout-main.ts +14 -0
  388. package/scripts/issue/issue-state-cli.ts +0 -10
  389. package/scripts/issue/issue-state-main.ts +12 -0
  390. package/scripts/issue/issue-watch-diff.ts +56 -15
  391. package/scripts/issue/issue-watch.ts +2 -1
  392. package/scripts/issue/issue-wip.ts +2 -7
  393. package/scripts/issue/markdown-section.ts +19 -5
  394. package/scripts/issue/measure-rerun-cli.ts +13 -8
  395. package/scripts/issue/plan-consumers-cli.ts +39 -0
  396. package/scripts/issue/plan-consumers-main.ts +11 -0
  397. package/scripts/issue/plan-consumers-section.ts +55 -0
  398. package/scripts/issue/plan-consumers.ts +127 -0
  399. package/scripts/josh/agent-session-environment.ts +1 -1
  400. package/scripts/josh/command-usage.ts +82 -0
  401. package/scripts/josh/file-map-stamp.ts +49 -16
  402. package/scripts/josh/hook-decision.ts +32 -20
  403. package/scripts/josh/josh-command-map.ts +6 -1
  404. package/scripts/josh/josh-command-types.ts +65 -13
  405. package/scripts/josh/josh-commands-agent-hooks.ts +83 -0
  406. package/scripts/josh/josh-commands-ai.ts +169 -157
  407. package/scripts/josh/josh-commands-backlog.ts +82 -16
  408. package/scripts/josh/josh-commands-clone.ts +1 -0
  409. package/scripts/josh/josh-commands-development.ts +111 -71
  410. package/scripts/josh/josh-commands-document.ts +43 -1
  411. package/scripts/josh/josh-commands-epic.ts +171 -0
  412. package/scripts/josh/josh-commands-hooks.ts +31 -2
  413. package/scripts/josh/josh-commands-issue-write.ts +181 -0
  414. package/scripts/josh/josh-commands-issue.ts +124 -24
  415. package/scripts/josh/josh-commands-lane.ts +112 -2
  416. package/scripts/josh/josh-commands-lint.ts +19 -8
  417. package/scripts/josh/josh-commands-maintenance.ts +112 -4
  418. package/scripts/josh/josh-commands-pause.ts +29 -0
  419. package/scripts/josh/josh-commands-progress.ts +87 -0
  420. package/scripts/josh/josh-commands-project.ts +138 -9
  421. package/scripts/josh/josh-commands-review.ts +124 -0
  422. package/scripts/josh/josh-commands-run.ts +211 -23
  423. package/scripts/josh/josh-commands-ship.ts +169 -0
  424. package/scripts/josh/josh-commands-split.ts +9 -0
  425. package/scripts/josh/josh-commands-versioning.ts +49 -2
  426. package/scripts/josh/josh-commands-workflow.ts +149 -6
  427. package/scripts/josh/josh-logic.ts +11 -27
  428. package/scripts/josh/josh.ts +14 -5
  429. package/scripts/josh/package-directory.ts +18 -0
  430. package/scripts/josh/process-identity.ts +13 -4
  431. package/scripts/josh/session-language-cli.ts +4 -8
  432. package/scripts/josh/session-language-main.ts +13 -0
  433. package/scripts/josh/session-language.ts +6 -1
  434. package/scripts/josh/shared-cache.ts +90 -0
  435. package/scripts/josh/stamp-file.ts +9 -15
  436. package/scripts/lane/lane-await.ts +51 -12
  437. package/scripts/lane/lane-cache.ts +5 -30
  438. package/scripts/lane/lane-capacity.ts +19 -22
  439. package/scripts/lane/lane-check-stats.ts +97 -0
  440. package/scripts/lane/lane-child-invocation.ts +43 -4
  441. package/scripts/lane/lane-cli.ts +15 -5
  442. package/scripts/lane/lane-close.ts +86 -18
  443. package/scripts/lane/lane-core-wait-stats.ts +66 -0
  444. package/scripts/lane/lane-dispatch.ts +27 -6
  445. package/scripts/lane/lane-gap-stats.ts +156 -0
  446. package/scripts/lane/lane-guard-policy.ts +2 -2
  447. package/scripts/lane/lane-handoff.ts +76 -1
  448. package/scripts/lane/lane-held-stats.ts +129 -0
  449. package/scripts/lane/lane-install.ts +16 -15
  450. package/scripts/lane/lane-launch-cli.ts +0 -9
  451. package/scripts/lane/lane-launch-main.ts +12 -0
  452. package/scripts/lane/lane-ledger-schema.ts +266 -0
  453. package/scripts/lane/lane-ledger.ts +108 -97
  454. package/scripts/lane/lane-limit-cli.ts +19 -9
  455. package/scripts/lane/lane-measure-cli.ts +58 -10
  456. package/scripts/lane/lane-open.ts +9 -1
  457. package/scripts/lane/lane-parked.ts +3 -3
  458. package/scripts/lane/lane-pause-cli.ts +130 -0
  459. package/scripts/lane/lane-pause.ts +158 -0
  460. package/scripts/lane/lane-preserve.ts +29 -1
  461. package/scripts/lane/lane-process-table.ts +166 -0
  462. package/scripts/lane/lane-reap-settle.ts +124 -0
  463. package/scripts/lane/lane-reap.ts +50 -15
  464. package/scripts/lane/lane-registry.ts +33 -10
  465. package/scripts/lane/lane-residents.ts +162 -0
  466. package/scripts/lane/lane-restart.ts +26 -27
  467. package/scripts/lane/lane-round-two-stats.ts +49 -0
  468. package/scripts/lane/lane-sampler.ts +4 -0
  469. package/scripts/lane/lane-session-action.ts +160 -0
  470. package/scripts/lane/lane-session-broker.ts +134 -134
  471. package/scripts/lane/lane-snapshot-trace.ts +84 -0
  472. package/scripts/lane/lane-spans.ts +51 -0
  473. package/scripts/lane/lane-spent.ts +6 -3
  474. package/scripts/lane/lane-stage-stats.ts +7 -2
  475. package/scripts/lane/lane-state.ts +302 -0
  476. package/scripts/lane/lane-stats.ts +58 -4
  477. package/scripts/lane/lane-stop-stats.ts +113 -37
  478. package/scripts/lane/lane-test-related-stats.ts +127 -0
  479. package/scripts/lane/lane-transcript-calls.ts +145 -0
  480. package/scripts/lane/lane-transcript-stats.ts +168 -0
  481. package/scripts/lane/lane-vacant.ts +13 -3
  482. package/scripts/lane/lane-withdraw-cli.ts +72 -0
  483. package/scripts/lane/lane-withdraw.ts +183 -0
  484. package/scripts/lane/process-directories.ts +70 -0
  485. package/scripts/lane/process-lane-marks.ts +94 -0
  486. package/scripts/lib/atomic-write.ts +62 -0
  487. package/scripts/lib/buffered-process.ts +12 -5
  488. package/scripts/lib/cli-flags.ts +53 -0
  489. package/scripts/lib/figure-format.ts +63 -0
  490. package/scripts/lib/json-value.ts +9 -1
  491. package/scripts/lib/package-manifest.ts +35 -0
  492. package/scripts/lib/read-file.ts +3 -1
  493. package/scripts/lib/stamped-memo.ts +63 -0
  494. package/scripts/lib/stdout-on-stderr.ts +24 -0
  495. package/scripts/lib/timeouts.ts +9 -0
  496. package/scripts/lib/transcript-record.ts +91 -0
  497. package/scripts/lines/effective-limit.ts +1 -1
  498. package/scripts/lint/eslint-cache-dependencies.ts +145 -0
  499. package/scripts/lint/eslint-daemon.ts +265 -0
  500. package/scripts/lint/format.ts +14 -5
  501. package/scripts/lint/import-graph.ts +279 -0
  502. package/scripts/lint/lint-gate-scope.ts +102 -0
  503. package/scripts/lint/lint-parallel-main.ts +19 -0
  504. package/scripts/lint/lint-parallel.ts +72 -33
  505. package/scripts/lint/lint-related-scope.ts +33 -24
  506. package/scripts/lint/lint-related.ts +38 -6
  507. package/scripts/notify/confirmation-options.ts +1 -2
  508. package/scripts/notify/telegram-notify.ts +20 -20
  509. package/scripts/notify/telegram-test-logic.ts +0 -1
  510. package/scripts/notify/telegram-test-main.ts +8 -0
  511. package/scripts/notify/telegram-test.ts +12 -11
  512. package/scripts/observations/observation-ledger.ts +13 -0
  513. package/scripts/observations/observations-flush-landing.ts +5 -3
  514. package/scripts/observations/observations-flush.ts +6 -1
  515. package/scripts/overrides/overrides-check.ts +2 -5
  516. package/scripts/overrides/overrides-files.ts +2 -1
  517. package/scripts/overrides/overrides-logic.ts +3 -6
  518. package/scripts/package/verify-optional-eslint-install.ts +8 -6
  519. package/scripts/propagate/propagate-publish.ts +2 -7
  520. package/scripts/propagate/propagate-targets.ts +4 -12
  521. package/scripts/refactor/import-graph.ts +9 -7
  522. package/scripts/release/github-release-runs.ts +17 -6
  523. package/scripts/release/release-approval-prune.ts +18 -0
  524. package/scripts/release/release-history.ts +1 -3
  525. package/scripts/release/release-progress.ts +42 -22
  526. package/scripts/release/release-publish-run.ts +39 -0
  527. package/scripts/release/release-publish.ts +6 -6
  528. package/scripts/release/release-scope-cli.ts +0 -10
  529. package/scripts/release/release-scope-main.ts +12 -0
  530. package/scripts/repo/repo-setting.ts +3 -6
  531. package/scripts/repo/required-checks-logic.ts +6 -15
  532. package/scripts/report/report-format-reference.ts +4 -0
  533. package/scripts/report/report-labels.ts +155 -0
  534. package/scripts/report/report-lint-cli.ts +3 -0
  535. package/scripts/report/report-lint.ts +85 -110
  536. package/scripts/report/report-template-cli.ts +59 -0
  537. package/scripts/report/report-template.ts +112 -0
  538. package/scripts/review/acceptance-map-check.ts +61 -0
  539. package/scripts/review/acceptance-map.ts +206 -0
  540. package/scripts/review/removed-tests-check.ts +86 -0
  541. package/scripts/review/removed-tests.ts +149 -0
  542. package/scripts/review/review-brief-cli.ts +82 -16
  543. package/scripts/review/review-brief-main.ts +12 -0
  544. package/scripts/review/review-brief.ts +31 -3
  545. package/scripts/review/review-code-tree.ts +10 -6
  546. package/scripts/review/review-comment-round.ts +26 -8
  547. package/scripts/review/review-finding-ledger.ts +30 -15
  548. package/scripts/review/review-interaction.ts +94 -0
  549. package/scripts/review/review-readers-scan.ts +163 -0
  550. package/scripts/review/review-record-cli.ts +69 -30
  551. package/scripts/review/review-record-main.ts +12 -0
  552. package/scripts/review/review-round-one-blobs.ts +221 -0
  553. package/scripts/review/review-round2-cli.ts +49 -12
  554. package/scripts/review/review-round2.ts +80 -12
  555. package/scripts/review/review-stamps.ts +19 -1
  556. package/scripts/review/review-stop-log.ts +96 -0
  557. package/scripts/review/review-stops-cli.ts +85 -0
  558. package/scripts/review/review-tree.ts +6 -17
  559. package/scripts/review/review-untouched-readers.ts +146 -0
  560. package/scripts/review/test-titles.ts +118 -0
  561. package/scripts/rules/agent-model.ts +67 -0
  562. package/scripts/rules/bash-triggers.ts +46 -3
  563. package/scripts/rules/decision-oracle-batch.ts +9 -1
  564. package/scripts/rules/decision-oracle.ts +2 -2
  565. package/scripts/rules/delivered-rules.ts +90 -3
  566. package/scripts/rules/destructive-command.ts +8 -1
  567. package/scripts/rules/direct-filing.ts +10 -2
  568. package/scripts/rules/direct-issue-comment.ts +117 -0
  569. package/scripts/rules/direct-pr-create.ts +69 -3
  570. package/scripts/rules/early-heartbeat.ts +2 -1
  571. package/scripts/rules/file-body.ts +7 -0
  572. package/scripts/rules/filing-cap.ts +8 -0
  573. package/scripts/rules/firing-point.ts +6 -5
  574. package/scripts/rules/git-argv.ts +72 -14
  575. package/scripts/rules/git-force.ts +12 -2
  576. package/scripts/rules/guard-remedy.ts +121 -0
  577. package/scripts/rules/implementation-cut-verdict.ts +1 -1
  578. package/scripts/rules/implementation-cut.ts +11 -3
  579. package/scripts/rules/index-guard.ts +8 -1
  580. package/scripts/rules/issue-comments.ts +76 -7
  581. package/scripts/rules/josh-git-bare.ts +7 -0
  582. package/scripts/rules/lane-background.ts +67 -25
  583. package/scripts/rules/lane-carry-conflict.ts +6 -0
  584. package/scripts/rules/lane-direct-tool.ts +74 -0
  585. package/scripts/rules/lane-interactive-ask.ts +9 -2
  586. package/scripts/rules/lane-park.ts +45 -23
  587. package/scripts/rules/lane-split-park.ts +10 -2
  588. package/scripts/rules/lane-switch-main.ts +7 -0
  589. package/scripts/rules/last-prompt.ts +50 -5
  590. package/scripts/rules/oracle-consulted.ts +10 -0
  591. package/scripts/rules/oracle-firing.ts +1 -0
  592. package/scripts/rules/oracle-list-cli.ts +7 -0
  593. package/scripts/rules/permission-guards.ts +3 -0
  594. package/scripts/rules/piped-verification.ts +4 -2
  595. package/scripts/rules/poll-loop.ts +7 -0
  596. package/scripts/rules/pr-merge.ts +123 -0
  597. package/scripts/rules/protected-files.ts +32 -5
  598. package/scripts/rules/raw-field-body.ts +6 -0
  599. package/scripts/rules/rule-body-guard.ts +8 -0
  600. package/scripts/rules/rule-list.ts +12 -28
  601. package/scripts/rules/rule-rewrite.ts +114 -0
  602. package/scripts/rules/rule-value-cache.ts +4 -9
  603. package/scripts/rules/rule-value-cli.ts +51 -32
  604. package/scripts/rules/rule-value.ts +8 -2
  605. package/scripts/rules/shell-segments.ts +50 -0
  606. package/scripts/rules/stop-decision.ts +77 -0
  607. package/scripts/rules/stop-rule-rows.ts +64 -0
  608. package/scripts/rules/stop-rules.ts +150 -51
  609. package/scripts/rules/tail-commands.ts +15 -1
  610. package/scripts/rules/test-declared-commit.ts +11 -1
  611. package/scripts/rules/third-party-write.ts +7 -0
  612. package/scripts/rules/timed-rerun.ts +69 -0
  613. package/scripts/rules/worktree-guard.ts +13 -3
  614. package/scripts/run/board/run-board-app-name.ts +23 -0
  615. package/scripts/run/board/run-board-cli.ts +65 -30
  616. package/scripts/run/board/run-board-closed.ts +8 -2
  617. package/scripts/run/board/run-board-earlier.ts +94 -0
  618. package/scripts/run/board/run-board-ending-reason.ts +67 -0
  619. package/scripts/run/board/run-board-estimate-schedule.ts +103 -0
  620. package/scripts/run/board/run-board-estimate.ts +98 -0
  621. package/scripts/run/board/run-board-fit.ts +153 -36
  622. package/scripts/run/board/run-board-fold.ts +123 -0
  623. package/scripts/run/board/run-board-fresh.ts +2 -2
  624. package/scripts/run/board/run-board-gather-live.ts +29 -0
  625. package/scripts/run/board/run-board-gather-thread.ts +189 -0
  626. package/scripts/run/board/run-board-gather-worker.ts +29 -0
  627. package/scripts/run/board/run-board-gather.ts +187 -0
  628. package/scripts/run/board/run-board-github.ts +119 -31
  629. package/scripts/run/board/run-board-header.ts +86 -21
  630. package/scripts/run/board/run-board-keys.ts +58 -0
  631. package/scripts/run/board/run-board-kind.ts +20 -6
  632. package/scripts/run/board/run-board-labels.ts +118 -71
  633. package/scripts/run/board/run-board-lane-state.ts +109 -0
  634. package/scripts/run/board/run-board-lane-time.ts +122 -0
  635. package/scripts/run/board/run-board-layout.ts +240 -61
  636. package/scripts/run/board/run-board-length.ts +52 -0
  637. package/scripts/run/board/run-board-machine.ts +8 -4
  638. package/scripts/run/board/run-board-main.ts +12 -0
  639. package/scripts/run/board/run-board-notes.ts +52 -31
  640. package/scripts/run/board/run-board-now.ts +1 -1
  641. package/scripts/run/board/run-board-operation.ts +15 -33
  642. package/scripts/run/board/run-board-phase.ts +1 -1
  643. package/scripts/run/board/run-board-plan-shared.ts +115 -0
  644. package/scripts/run/board/run-board-plan.ts +55 -3
  645. package/scripts/run/board/run-board-planning.ts +45 -0
  646. package/scripts/run/board/run-board-priority.ts +44 -0
  647. package/scripts/run/board/run-board-process-groups.ts +195 -0
  648. package/scripts/run/board/run-board-read.ts +153 -13
  649. package/scripts/run/board/run-board-reason.ts +238 -45
  650. package/scripts/run/board/run-board-released.ts +35 -0
  651. package/scripts/run/board/run-board-render-checks.ts +39 -5
  652. package/scripts/run/board/run-board-render-condition.ts +96 -0
  653. package/scripts/run/board/run-board-render-drawn.ts +67 -0
  654. package/scripts/run/board/run-board-render-foot.ts +59 -0
  655. package/scripts/run/board/run-board-render-icon.ts +35 -0
  656. package/scripts/run/board/run-board-render-lanes.ts +145 -0
  657. package/scripts/run/board/run-board-render-lead.ts +80 -0
  658. package/scripts/run/board/run-board-render-legend.ts +117 -47
  659. package/scripts/run/board/run-board-render-notes.ts +156 -29
  660. package/scripts/run/board/run-board-render-processes.ts +196 -0
  661. package/scripts/run/board/run-board-render-section.ts +119 -0
  662. package/scripts/run/board/run-board-render-slot.ts +3 -36
  663. package/scripts/run/board/run-board-render-tail.ts +115 -48
  664. package/scripts/run/board/run-board-render-time.ts +56 -0
  665. package/scripts/run/board/run-board-render-title.ts +117 -24
  666. package/scripts/run/board/run-board-render-waits.ts +125 -0
  667. package/scripts/run/board/run-board-render.ts +206 -259
  668. package/scripts/run/board/run-board-roots.ts +54 -0
  669. package/scripts/run/board/run-board-row-yield.ts +10 -4
  670. package/scripts/run/board/run-board-setup.ts +1 -12
  671. package/scripts/run/board/run-board-snapshot.ts +111 -0
  672. package/scripts/run/board/run-board-spin.ts +2 -2
  673. package/scripts/run/board/run-board-state.ts +23 -29
  674. package/scripts/run/board/run-board-status.ts +206 -79
  675. package/scripts/run/board/run-board-thanks-read.ts +2 -2
  676. package/scripts/run/board/run-board-tick.ts +123 -104
  677. package/scripts/run/board/run-board-usage-board.ts +78 -0
  678. package/scripts/run/board/run-board-usage-lanes.ts +113 -0
  679. package/scripts/run/board/run-board-usage-listing.ts +93 -0
  680. package/scripts/run/board/run-board-usage-read.ts +120 -150
  681. package/scripts/run/board/run-board-usage-rusage.ts +19 -7
  682. package/scripts/run/board/run-board-usage-text.ts +139 -51
  683. package/scripts/run/board/run-board-usage-top.ts +102 -0
  684. package/scripts/run/board/run-board-usage.ts +89 -72
  685. package/scripts/run/board/run-board-usual.ts +20 -9
  686. package/scripts/run/carry/run-carry-args.ts +4 -7
  687. package/scripts/run/carry/run-carry-conversation.ts +1 -1
  688. package/scripts/run/carry/run-carry.ts +9 -4
  689. package/scripts/run/cut/run-cut-cli.ts +3 -2
  690. package/scripts/run/cut/run-cut-handoff.ts +2 -2
  691. package/scripts/run/cut/run-cut-report.ts +16 -0
  692. package/scripts/run/detached-launch.ts +23 -4
  693. package/scripts/run/entry/run-entry-cli.ts +8 -1
  694. package/scripts/run/event/run-event-cli.ts +1 -5
  695. package/scripts/run/event/run-event-filed.ts +12 -6
  696. package/scripts/run/event/run-event-follow.ts +2 -3
  697. package/scripts/run/event/run-event-render.ts +7 -10
  698. package/scripts/run/event/run-event-scope.ts +20 -2
  699. package/scripts/run/event/run-event-stream-emit.ts +78 -11
  700. package/scripts/run/event/run-event-stream.ts +37 -7
  701. package/scripts/run/hold/run-hold-adopt.ts +65 -0
  702. package/scripts/run/hold/run-hold-cli.ts +93 -22
  703. package/scripts/run/hold/run-hold-main.ts +12 -0
  704. package/scripts/run/hold/run-hold-member.ts +37 -0
  705. package/scripts/run/hold/run-hold-session.ts +46 -0
  706. package/scripts/run/hold/run-hold.ts +7 -1
  707. package/scripts/run/hold/run-stop-notify.ts +183 -0
  708. package/scripts/run/launch-priority.ts +32 -0
  709. package/scripts/run/merge/run-merge-auth.ts +31 -0
  710. package/scripts/run/merge/run-merge-cli.ts +72 -107
  711. package/scripts/run/merge/run-merge-close.ts +74 -0
  712. package/scripts/run/merge/run-merge-collect.ts +6 -13
  713. package/scripts/run/merge/run-merge-driver.ts +71 -0
  714. package/scripts/run/merge/run-merge-main.ts +12 -0
  715. package/scripts/run/merge/run-merge-outcome.ts +23 -0
  716. package/scripts/run/merge/run-merge-restart.ts +39 -0
  717. package/scripts/run/merge/run-merge-ship.ts +20 -4
  718. package/scripts/run/merge/run-merge-signals.ts +123 -0
  719. package/scripts/run/merge/run-merge-steps.ts +128 -83
  720. package/scripts/run/merge/run-merge.ts +53 -40
  721. package/scripts/run/park/run-park-cli.ts +91 -0
  722. package/scripts/run/park/run-park.ts +88 -0
  723. package/scripts/run/park/run-stalled.ts +68 -0
  724. package/scripts/run/pause/run-pause-cli.ts +73 -0
  725. package/scripts/run/pause/run-pause.ts +251 -0
  726. package/scripts/run/progress/run-progress-cli.ts +4 -12
  727. package/scripts/run/progress/run-progress-clock.ts +1 -1
  728. package/scripts/run/progress/run-progress-config.ts +6 -14
  729. package/scripts/run/progress/run-progress-main.ts +12 -0
  730. package/scripts/run/progress/run-progress.ts +1 -4
  731. package/scripts/run/review/run-review.ts +2 -1
  732. package/scripts/run/run-ending.ts +1 -0
  733. package/scripts/run/run-invocation.ts +5 -6
  734. package/scripts/run/run-liveness-cli.ts +6 -8
  735. package/scripts/run/run-liveness.ts +61 -30
  736. package/scripts/run/run-next.ts +1 -1
  737. package/scripts/run/run-parent-cut-hook.ts +2 -2
  738. package/scripts/run/run-poll-hook.ts +157 -0
  739. package/scripts/run/run-preflight.ts +18 -3
  740. package/scripts/run/run-prep-cli.ts +1 -10
  741. package/scripts/run/run-prep-locate.ts +7 -50
  742. package/scripts/run/run-prep-main.ts +12 -0
  743. package/scripts/run/run-prep.ts +6 -0
  744. package/scripts/run/run-report-cli.ts +101 -13
  745. package/scripts/run/run-report-handoff.ts +114 -0
  746. package/scripts/run/run-step-cli.ts +22 -15
  747. package/scripts/run/run-step-section.ts +85 -0
  748. package/scripts/run/run-step.ts +1 -1
  749. package/scripts/run/run-stranded-detect.ts +13 -0
  750. package/scripts/run/run-watcher-guard-cli.ts +1 -1
  751. package/scripts/run/run-watcher-guard.ts +1 -1
  752. package/scripts/run/ship/run-ship-args.ts +121 -0
  753. package/scripts/run/ship/run-ship-body-draft.ts +110 -0
  754. package/scripts/run/ship/run-ship-cli.ts +67 -151
  755. package/scripts/run/ship/run-ship-detach.ts +27 -7
  756. package/scripts/run/ship/run-ship-infra-retry.ts +59 -0
  757. package/scripts/run/ship/run-ship-next.ts +27 -3
  758. package/scripts/run/ship/run-ship-overlap.ts +232 -0
  759. package/scripts/run/ship/run-ship-place.ts +96 -0
  760. package/scripts/run/ship/run-ship-pre-detach-timed.ts +43 -0
  761. package/scripts/run/ship/run-ship-pre-detach.ts +102 -27
  762. package/scripts/run/ship/run-ship-preflight.ts +161 -30
  763. package/scripts/run/ship/run-ship-probe.ts +11 -3
  764. package/scripts/run/ship/run-ship-relaunch-cap.ts +70 -0
  765. package/scripts/run/ship/run-ship-removed-rows.ts +61 -0
  766. package/scripts/run/ship/run-ship-return.ts +123 -15
  767. package/scripts/run/ship/run-ship-review-steps.ts +105 -149
  768. package/scripts/run/ship/run-ship-review.ts +73 -6
  769. package/scripts/run/ship/run-ship-reviewer.ts +207 -0
  770. package/scripts/run/ship/run-ship-stage.ts +55 -6
  771. package/scripts/run/ship/run-ship-steps.ts +46 -15
  772. package/scripts/run/ship/run-ship-stop-cause.ts +135 -0
  773. package/scripts/run/ship/run-ship-stop-context.ts +206 -0
  774. package/scripts/run/ship/run-ship-stop-text.ts +11 -6
  775. package/scripts/run/ship/run-ship-sync.ts +57 -12
  776. package/scripts/run/ship/run-ship.ts +30 -2
  777. package/scripts/run/tidy/run-tidy-cli.ts +0 -4
  778. package/scripts/run/tidy/run-tidy-lanes.ts +3 -0
  779. package/scripts/run/tidy/run-tidy-main.ts +8 -0
  780. package/scripts/run/wake/run-wake-cli.ts +119 -100
  781. package/scripts/run/wake/run-wake-code.ts +83 -0
  782. package/scripts/run/wake/run-wake-driver.ts +19 -8
  783. package/scripts/run/wake/run-wake-loop.ts +34 -3
  784. package/scripts/run/wake/run-wake-main.ts +13 -0
  785. package/scripts/run/wake/run-wake-ports.ts +90 -0
  786. package/scripts/run/wake/run-wake-takeover.ts +66 -0
  787. package/scripts/run/wake/run-wake.ts +2 -1
  788. package/scripts/safe-chain/pack-hook.ts +2 -2
  789. package/scripts/safe-chain/preinstall-command.ts +2 -1
  790. package/scripts/safe-chain/project-config.ts +3 -9
  791. package/scripts/security/security-audit-main.ts +8 -0
  792. package/scripts/security/security-audit-provision-logic.ts +0 -11
  793. package/scripts/security/security-audit-provision-main.ts +12 -0
  794. package/scripts/security/security-audit-provision.ts +11 -26
  795. package/scripts/security/security-audit.ts +6 -7
  796. package/scripts/self-sync-guard/self-sync-guard-logic.ts +6 -13
  797. package/scripts/split/split-assess-cli.ts +2 -2
  798. package/scripts/split/split-assess.ts +15 -0
  799. package/scripts/split/split-measure.ts +65 -0
  800. package/scripts/sync/claude-settings-merge.ts +8 -15
  801. package/scripts/sync/directory-copy-guard.ts +4 -9
  802. package/scripts/sync/file-content.ts +78 -8
  803. package/scripts/sync/sync-ai-files.ts +3 -5
  804. package/scripts/sync/sync-configs.ts +11 -23
  805. package/scripts/sync/sync-hook-safety.ts +4 -10
  806. package/scripts/sync/sync-main.ts +11 -0
  807. package/scripts/sync/sync.ts +25 -37
  808. package/scripts/test/test-declared-changed.ts +2 -2
  809. package/scripts/test/test-declared.ts +1 -1
  810. package/scripts/test/test-e2e-guard.ts +55 -6
  811. package/scripts/test/test-e2e-stamp.ts +38 -0
  812. package/scripts/test/test-pinned-logic.ts +145 -0
  813. package/scripts/test/test-pinned-main.ts +78 -0
  814. package/scripts/test/test-pinned.ts +100 -0
  815. package/scripts/test/test-read-map.ts +264 -0
  816. package/scripts/test/test-read-recording.ts +91 -0
  817. package/scripts/test/test-read-trace.ts +148 -0
  818. package/scripts/test/test-red-main.ts +12 -0
  819. package/scripts/test/test-red.ts +12 -30
  820. package/scripts/test/test-related-main.ts +18 -0
  821. package/scripts/test/test-related-record.ts +119 -0
  822. package/scripts/test/test-related-scope.ts +229 -43
  823. package/scripts/test/test-related.ts +300 -22
  824. package/scripts/test/test-unit-guard-main.ts +15 -0
  825. package/scripts/test/test-unit-guard.ts +54 -21
  826. package/scripts/test/unit-count-file.ts +37 -0
  827. package/scripts/test/unit-run-marker.ts +162 -0
  828. package/scripts/test/unit-setup-files.ts +51 -0
  829. package/scripts/test/unit-worker-share.ts +71 -137
  830. package/scripts/test/whole-suite-files.ts +63 -0
  831. package/scripts/time-runtime/time-background.ts +20 -2
  832. package/scripts/time-runtime/time-bundles.ts +4 -3
  833. package/scripts/time-runtime/time-density-hook.ts +8 -6
  834. package/scripts/time-runtime/time-followup-stage.ts +1 -3
  835. package/scripts/time-runtime/time-format.ts +5 -28
  836. package/scripts/time-runtime/time-markers.ts +10 -1
  837. package/scripts/time-runtime/time-shell.ts +126 -14
  838. package/scripts/time-runtime/time-spans.ts +1 -0
  839. package/scripts/time-runtime/time-tool-call.ts +7 -0
  840. package/scripts/time-runtime/time-transcript-line.ts +49 -62
  841. package/scripts/uninstall/uninstall.ts +1 -1
  842. package/scripts/version/bump-version-main.ts +12 -0
  843. package/scripts/version/bump-version.ts +25 -25
  844. package/scripts/version/effective-upstream.ts +6 -12
  845. package/scripts/version/latest-corepack.ts +17 -32
  846. package/scripts/version/latest-if-required-cli.ts +93 -0
  847. package/scripts/version/latest-lane-guard-main.ts +8 -0
  848. package/scripts/version/latest-lane-guard.ts +0 -4
  849. package/scripts/version/latest-scope-cli.ts +0 -9
  850. package/scripts/version/latest-scope-main.ts +12 -0
  851. package/scripts/version/latest-update.ts +5 -5
  852. package/scripts/version/npm-registry.ts +44 -6
  853. package/scripts/version/publishable-range-check.ts +5 -16
  854. package/scripts/version/release-age.ts +1 -1
  855. package/scripts/version/release-hold.ts +1 -1
  856. package/scripts/version/release-window.ts +38 -0
  857. package/scripts/version/running-binary.ts +1 -1
  858. package/scripts/version/safe-chain-version-update.ts +3 -8
  859. package/scripts/version/version-targets.ts +6 -28
  860. package/templates/dependabot.yml +29 -0
  861. package/templates/gitignore +10 -3
  862. package/templates/pnpm-workspace.basic.yaml +1 -1
  863. package/templates/sonar-project.properties +3 -2
  864. package/templates/workflows/ci.yml +12 -4
  865. package/templates/workflows/github-release.yml +4 -0
  866. package/tsconfig.sonar.json +1 -1
  867. package/.ncurc.json +0 -3
  868. package/dist/hooks/batch-guard.js +0 -29
  869. package/dist/hooks/chunk-43ZHT22P.js +0 -3495
  870. package/dist/hooks/chunk-CDY4NFQG.js +0 -15
  871. package/dist/hooks/chunk-EUMACUK2.js +0 -2038
  872. package/dist/hooks/chunk-H5HVWYXK.js +0 -359
  873. package/dist/hooks/chunk-IIGFYXKC.js +0 -7104
  874. package/dist/hooks/chunk-IX6TTTI6.js +0 -95
  875. package/dist/hooks/chunk-J47HU5H5.js +0 -237
  876. package/dist/hooks/chunk-K4EOONYM.js +0 -45
  877. package/dist/hooks/chunk-K4LMBQC2.js +0 -68
  878. package/dist/hooks/chunk-SHGPANFB.js +0 -56
  879. package/dist/hooks/chunk-YHBZAJSV.js +0 -79
  880. package/dist/hooks/chunk-YYPI7SJZ.js +0 -131
  881. package/dist/hooks/duplicate-read-guard.js +0 -30
  882. package/dist/hooks/investigation-guard.js +0 -32
  883. package/scripts/backlog/backlog-stalled-cli.ts +0 -30
  884. package/scripts/cost-runtime/cost-format.ts +0 -29
  885. package/scripts/init/basic-path-migration.ts +0 -24
  886. package/scripts/issue/issue-backlinks-cli.ts +0 -93
  887. package/scripts/josh/josh-commands-guard.ts +0 -38
  888. package/scripts/lint/cross-file-recheck.ts +0 -155
  889. package/scripts/registry-migration/migrate-logic.ts +0 -237
  890. package/scripts/registry-migration/migrate.ts +0 -292
  891. package/scripts/registry-migration/user-npmrc.ts +0 -15
  892. package/scripts/rules/rule-guard.ts +0 -23
  893. package/scripts/rules/rule-registry-rows.ts +0 -282
  894. package/scripts/rules/rule-registry.ts +0 -109
  895. package/scripts/run/run-stranded-cli.ts +0 -27
@@ -1,6 +1,12 @@
1
1
  // The workflow label names, defined once. The epic auto-close, the epic validator, the issue-prep
2
2
  // labeler and the next-issues display all key on these exact strings, and a drifted copy would
3
3
  // fail silently — an epic filtered on the wrong name is simply never closed or never excluded.
4
+ //
5
+ // **A new label is defined here and added to `REPOSITORY_LABELS`**, so `josh start` and `josh sync`
6
+ // create it; a label deliberately not provisioned goes into `EXEMPT_FROM_PROVISIONING` with its
7
+ // reason. Every other module imports the constant rather than spelling the name —
8
+ // `issue-label-scan.test.ts` fails on a `*_LABEL` constant missing from `ALL_LABELS`, on a label name
9
+ // spelled outside this module, and on a label call naming a label `ALL_LABELS` does not hold.
4
10
  const EPIC_LABEL = 'epic'
5
11
  const BUG_LABEL = 'bug'
6
12
  const ENHANCEMENT_LABEL = 'enhancement'
@@ -15,6 +21,11 @@ const PLANNED_LABEL = 'run:planned'
15
21
  // it: a parked child is why a run reports "nothing left that time will fix" rather than waiting
16
22
  // forever.
17
23
  const NEEDS_DECISION_LABEL = 'needs-decision'
24
+ // Parks a child the `backlogrun` driver could not finish mechanically — its session ended unfinished, or
25
+ // its ship hit the relaunch cap. **Not `needs-decision`**: nothing is asked of a person beyond fixing the
26
+ // cause and removing it, so the board and the idle report keep it out of the decisions they list. Parked
27
+ // all the same, so a child failing on one cause is not handed straight back until the cause is fixed.
28
+ const RUN_STALLED_LABEL = 'run:stalled'
18
29
  // Marks an issue whose defect reaches the verification path, so it runs with nothing beside it.
19
30
  // A run applies it from the verification-path enumeration in `backlogrun-lanes.md`;
20
31
  // `backlog:next` enforces it (`backlog-solo.ts`), so the rule no longer rests on a judgement at
@@ -24,11 +35,15 @@ const RUN_SOLO_LABEL = 'run:solo'
24
35
  // Without it an issue lacking `run:solo` could mean "judged parallel" or
25
36
  // "never judged", and `backlog:next` withholds the second (`epic-triage.ts`).
26
37
  const RUN_LANE_LABEL = 'run:lane'
27
- // Puts an issue at the head of the backlog's ranking. A person or a run may
28
- // apply it — a run only where it can cite a deadline or a stated urgency, or a policy a person wrote
29
- // (`backlogrun-steps.md`) — and **only a person removes it**: a run that could clear it could undo
30
- // the person's ordering. Read by `issue-rank.ts`, the one place the ranking keys are decided.
38
+ // Puts an issue at the head of the backlog's ranking, below `priority:critical`. `issue:file` applies
39
+ // it from the body's priority declaration at its high level (`issue-priority.ts`), a person may apply it by
40
+ // hand, and **only a person removes it**: a run that could clear it could undo the person's ordering.
41
+ // Read by `issue-rank.ts`, the one place the ranking keys are decided.
31
42
  const PRIORITY_HIGH_LABEL = 'priority:high'
43
+ // Ranks above `priority:high` — an urgent defect (one of the interrupt-filing conditions) or a lane
44
+ // speed-up worth at least a tenth of a merge's median lane time. Applied from the urgent declaration;
45
+ // it never interrupts a running lane, only takes the next free one. Only a person removes it.
46
+ const PRIORITY_CRITICAL_LABEL = 'priority:critical'
32
47
  // Opts one issue outside any epic into unattended execution. **Only a
33
48
  // person applies it.** `epicrun #<E>` approves the merges inside `#<E>`; this label is the only way
34
49
  // a person extends that approval past the epic's edge, so a label an AI could apply to itself would
@@ -64,6 +79,10 @@ const NEEDS_HUMAN_REVIEW_LABEL = 'needs-human-review'
64
79
  // takes it off, because taking it off asserts the work is *not* done, which is the same claim in
65
80
  // reverse and is no more a run's to make.
66
81
  const ALREADY_DONE_LABEL = 'already-done'
82
+ // The mark of a measurement-only Issue a run closed itself (`josh issue:measured`). No pull request
83
+ // closes such an Issue, so the merge reference a sweep reads is missing; this label is what tells the
84
+ // run's own close from a person's, so every sweep counts it as merged (`issue-merged.ts`).
85
+ const MEASURED_LABEL = 'measured'
67
86
  // Marks the Issue that tracks a repository's next release. An Issue whose
68
87
  // change reaches a consumer only once published is linked to it as a `blocked_by` blocker
69
88
  // (`josh issue:release`), so "merged but not yet released" is visible in the backlog. A run applies
@@ -71,16 +90,28 @@ const ALREADY_DONE_LABEL = 'already-done'
71
90
  // and only a person opts it into unattended execution.
72
91
  const RELEASE_LABEL = 'release'
73
92
  // A person's mark for work set aside for now; `issue-auto-ok.ts` reads it as an exclusion. Applied by
74
- // hand and never provisioned, so it is not in `REPOSITORY_LABELS`.
93
+ // hand, so it is provisioned: a person cannot apply a label the repository does not have.
75
94
  const DEFERRED_LABEL = 'deferred'
76
- // Applied to an Issue whose second review round was skipped, so the condition stays auditable
77
- // (`prompts/review.md` → "When round 2 is skipped entirely, and when it is not").
78
- const REVIEW_ROUND2_SKIPPED_LABEL = 'review-round2-skipped'
95
+ // A copy of the body's start-time declaration while that time is still ahead (`issue-not-before.ts`), so a
96
+ // listing tells an issue that waits on the clock from one that can start. The body stays the source:
97
+ // `issue-not-before-label.ts` applies and removes it. Only `run:merge` reads it as a reason to wait,
98
+ // and only where the body itself could not be read (`run-merge-steps.ts`).
99
+ const NOT_BEFORE_LABEL = 'not-before'
100
+
101
+ // The labels that park an open issue: a run never starts or restarts it, and only a person lifts
102
+ // them — `needs-decision` waits for an answer, `run:stalled` for a mechanical cause to be fixed, and
103
+ // `already-done` for the close. The run that applied any of them committed nothing, so the checkout
104
+ // is clean. Held once because the merge, the board, the pool, the classification and the liveness
105
+ // read all ask "is this child parked", and a copy that missed a label would answer differently.
106
+ const PARKED_LABELS: ReadonlySet<string> = new Set([
107
+ NEEDS_DECISION_LABEL,
108
+ RUN_STALLED_LABEL,
109
+ ALREADY_DONE_LABEL,
110
+ ])
79
111
 
80
- // The four labels that mean an open issue must not be handed to a run as it stands: an `epic`
112
+ // The labels that mean an open issue must not be handed to a run as it stands: an `epic`
81
113
  // tracks a batch and is never run directly (its children are), `in-progress` is already claimed by
82
- // a running workflow, `needs-decision` was parked precisely because it cannot advance without a
83
- // person, and `already-done` names work that is already merged. Held here rather than in either
114
+ // a running workflow, and a parked issue (`PARKED_LABELS`) waits on a person. Held here rather than in either
84
115
  // caller because both the next-issues display and the `auto-ok` pickup ask the same question, and
85
116
  // two copies would answer it differently the first time one of them gained another label.
86
117
  //
@@ -91,8 +122,7 @@ const REVIEW_ROUND2_SKIPPED_LABEL = 'review-round2-skipped'
91
122
  const NOT_DIRECTLY_RUNNABLE_LABELS: ReadonlySet<string> = new Set([
92
123
  EPIC_LABEL,
93
124
  IN_PROGRESS_LABEL,
94
- NEEDS_DECISION_LABEL,
95
- ALREADY_DONE_LABEL,
125
+ ...PARKED_LABELS,
96
126
  ])
97
127
 
98
128
  // Filing-route labels, applied at filing time so the backlog's composition — a review-cap
@@ -149,61 +179,6 @@ const FILING_ROUTE_LABELS: ReadonlyArray<{
149
179
  },
150
180
  ]
151
181
 
152
- // The depth of an issue's subject, recorded as a label at filing time.
153
- //
154
- // **The definition is not here.** `.claude/skills/workflow-commands/observation-filing.md` → "The depth test",
155
- // is the single source: depth 0 is what a consumer of this package touches, depth 1 the run
156
- // orchestration that executes an Issue, depth 2 what measures a run. These constants are the
157
- // recording of that table, never a second copy of it — a label whose description restated the rule
158
- // would be the clone `CLAUDE.md` prohibits, and the descriptions below therefore name the section
159
- // rather than paraphrase it.
160
- //
161
- // **Why a label at all.** The share of open issues at depth 0 is a measured target, and without a
162
- // recorded depth it could only be obtained by reading every open issue's body by hand — hand counts
163
- // disagree on the denominator and are not comparable, which is the failure a recorded label removes.
164
- //
165
- // **The depth is read off the subject, so a run applies it.** Unlike `auto-ok` and
166
- // `needs-human-review` this is not a person's judgement about authorization; it is the same reading
167
- // `observation-filing.md` already asks a run to make before it files, and none of the three withholds or widens anything
168
- // a run may do.
169
- const DEPTH_0_LABEL = 'depth:0'
170
- const DEPTH_1_LABEL = 'depth:1'
171
- const DEPTH_2_LABEL = 'depth:2'
172
-
173
- // Ordered shallowest first, which is what makes `depth_label_of` deterministic: an issue carrying
174
- // more than one depth label counts as the **lowest** depth present, the one closest to the consumer.
175
- // Without a fixed tie-break the same listing measured twice could answer differently.
176
- const DEPTH_LABEL_ORDER: ReadonlyArray<string> = [DEPTH_0_LABEL, DEPTH_1_LABEL, DEPTH_2_LABEL]
177
-
178
- // The metadata `gh api ... labels` needs, in the shape `FILING_ROUTE_LABELS` above uses and for the
179
- // same reason: applying a label at issue-creation auto-creates it with a generated color and no
180
- // description, so provisioning from here is what gives each one a stable color a reader can scan by.
181
- // Green, amber and pale blue, so the consumer-facing depth is the one that stands out in a listing.
182
- //
183
- // **`josh issue:file` provisions them** through `repository_labels.ensure_labels` before its create
184
- // call, so no document carries a creation command to keep in step.
185
- const DEPTH_LABELS: ReadonlyArray<{
186
- name: string
187
- color: string
188
- description: string
189
- }> = [
190
- {
191
- name: DEPTH_0_LABEL,
192
- color: '0e8a16',
193
- description: 'Depth 0 — what a consumer of this package touches (observation-filing.md)',
194
- },
195
- {
196
- name: DEPTH_1_LABEL,
197
- color: 'fbc02d',
198
- description: 'Depth 1 — the run orchestration that executes an Issue (observation-filing.md)',
199
- },
200
- {
201
- name: DEPTH_2_LABEL,
202
- color: 'c5def5',
203
- description: 'Depth 2 — what measures a run (observation-filing.md)',
204
- },
205
- ]
206
-
207
182
  interface LabelDefinition {
208
183
  name: string
209
184
  color: string
@@ -234,6 +209,11 @@ const WORKFLOW_LABELS: ReadonlyArray<LabelDefinition> = [
234
209
  color: '0e8a16',
235
210
  description: 'Judged safe to run beside others in a backlogrun',
236
211
  },
212
+ {
213
+ name: PRIORITY_CRITICAL_LABEL,
214
+ color: 'b60205',
215
+ description: 'Offered before priority:high in a backlogrun; only a person removes it',
216
+ },
237
217
  {
238
218
  name: PRIORITY_HIGH_LABEL,
239
219
  color: 'e99695',
@@ -254,6 +234,12 @@ const WORKFLOW_LABELS: ReadonlyArray<LabelDefinition> = [
254
234
  color: 'd93f0b',
255
235
  description: 'Parked: needs a decision before it can run',
256
236
  },
237
+ {
238
+ name: RUN_STALLED_LABEL,
239
+ color: 'e99d42',
240
+ description:
241
+ 'Parked: the driver could not finish it mechanically — no decision; fix the cause and remove',
242
+ },
257
243
  {
258
244
  name: NEEDS_HUMAN_REVIEW_LABEL,
259
245
  color: 'd93f0b',
@@ -265,13 +251,22 @@ const WORKFLOW_LABELS: ReadonlyArray<LabelDefinition> = [
265
251
  description: 'Verified already merged — a person closes it',
266
252
  },
267
253
  {
268
- name: REVIEW_ROUND2_SKIPPED_LABEL,
269
- color: 'c5def5',
270
- description: 'Review round 2 was skipped under the condition in prompts/review.md',
254
+ name: MEASURED_LABEL,
255
+ color: '6f42c1',
256
+ description: 'Measurement-only — a run recorded the result and closed it',
257
+ },
258
+ {
259
+ name: DEFERRED_LABEL,
260
+ color: 'd4c5f9',
261
+ description: 'Set aside for now; never opted in to unattended execution',
262
+ },
263
+ {
264
+ name: NOT_BEFORE_LABEL,
265
+ color: 'bfd4f2',
266
+ description: "Waiting: the body's 実施可能日 has not arrived yet",
271
267
  },
272
268
  { name: BUG_LABEL, color: 'd73a4a', description: "Something isn't working" },
273
269
  ...FILING_ROUTE_LABELS,
274
- ...DEPTH_LABELS,
275
270
  ]
276
271
 
277
272
  // The pull request release classifications `pr-classification.yml` requires exactly one of.
@@ -350,13 +345,9 @@ function has_label_name(labels: ReadonlyArray<string>, wanted: string): boolean
350
345
  return label_name_of(labels, wanted) !== undefined
351
346
  }
352
347
 
353
- // The depth recorded on one listing row, or `undefined` where none is — the reading every share
354
- // measurement makes. Lowercased through the same comparison as every other membership test above,
355
- // because GitHub keeps the casing a label was created with and `Depth:0` is the same label.
356
- function depth_label_of(labels: ReadonlyArray<LabelReference> | undefined): string | undefined {
357
- const names = new Set((labels ?? []).map((label) => label.name.toLowerCase()))
358
-
359
- return DEPTH_LABEL_ORDER.find((name) => names.has(name))
348
+ // Whether label names carry any park label (`PARKED_LABELS`), compared as `has_label_name` does.
349
+ function has_parked_label(labels: ReadonlyArray<string>): boolean {
350
+ return [...PARKED_LABELS].some((label) => has_label_name(labels, label))
360
351
  }
361
352
 
362
353
  // Every workflow label this package manages. The label-reference scan
@@ -372,21 +363,22 @@ const ALL_LABELS: ReadonlySet<string> = new Set([
372
363
  IN_PROGRESS_LABEL,
373
364
  PLANNED_LABEL,
374
365
  NEEDS_DECISION_LABEL,
366
+ RUN_STALLED_LABEL,
375
367
  AUTO_OK_LABEL,
376
368
  NEEDS_HUMAN_REVIEW_LABEL,
377
369
  ALREADY_DONE_LABEL,
370
+ MEASURED_LABEL,
371
+ DEFERRED_LABEL,
372
+ PRIORITY_CRITICAL_LABEL,
378
373
  PRIORITY_HIGH_LABEL,
379
374
  RELEASE_LABEL,
375
+ NOT_BEFORE_LABEL,
380
376
  INTERRUPT_ROUTE_LABEL,
381
377
  REVIEW_CAP_ROUTE_LABEL,
382
- REVIEW_ROUND2_SKIPPED_LABEL,
383
378
  RUN_LANE_LABEL,
384
379
  RUN_SOLO_LABEL,
385
380
  SPLIT_ROUTE_LABEL,
386
381
  TIER_A_ROUTE_LABEL,
387
- DEPTH_0_LABEL,
388
- DEPTH_1_LABEL,
389
- DEPTH_2_LABEL,
390
382
  BUGFIX_LABEL,
391
383
  OTHER_CHANGE_LABEL,
392
384
  IGNORE_FOR_RELEASE_LABEL,
@@ -406,36 +398,35 @@ export {
406
398
  BUGFIX_LABEL,
407
399
  BREAKING_CHANGE_LABEL,
408
400
  DEFERRED_LABEL,
409
- depth_label_of,
410
- DEPTH_0_LABEL,
411
- DEPTH_1_LABEL,
412
- DEPTH_2_LABEL,
413
- DEPTH_LABEL_ORDER,
414
- DEPTH_LABELS,
415
401
  ENHANCEMENT_LABEL,
416
402
  EPIC_LABEL,
417
403
  EXEMPT_FROM_PROVISIONING,
418
404
  FILING_ROUTE_LABELS,
419
405
  has_any_label,
420
406
  has_label_name,
407
+ has_parked_label,
421
408
  IGNORE_FOR_RELEASE_LABEL,
422
409
  IN_PROGRESS_LABEL,
423
410
  INTERRUPT_ROUTE_LABEL,
424
411
  label_name_of,
412
+ MEASURED_LABEL,
425
413
  NEEDS_DECISION_LABEL,
426
414
  NEEDS_HUMAN_REVIEW_LABEL,
415
+ NOT_BEFORE_LABEL,
427
416
  NOT_DIRECTLY_RUNNABLE_LABELS,
428
417
  OTHER_CHANGE_LABEL,
418
+ PARKED_LABELS,
429
419
  PLANNED_LABEL,
420
+ PRIORITY_CRITICAL_LABEL,
430
421
  PRIORITY_HIGH_LABEL,
431
422
  RELEASE_CLASSIFICATION_LABELS,
432
423
  RELEASE_CLASSIFICATION_NAMES,
433
424
  RELEASE_LABEL,
434
425
  REPOSITORY_LABELS,
435
426
  REVIEW_CAP_ROUTE_LABEL,
436
- REVIEW_ROUND2_SKIPPED_LABEL,
437
427
  RUN_LANE_LABEL,
438
428
  RUN_SOLO_LABEL,
429
+ RUN_STALLED_LABEL,
439
430
  SPLIT_ROUTE_LABEL,
440
431
  TIER_A_ROUTE_LABEL,
441
432
  WORKFLOW_LABELS,
@@ -1,15 +1,15 @@
1
- #!/usr/bin/env tsx
2
1
  import { readFile } from 'node:fs/promises'
3
- import { fileURLToPath } from 'node:url'
4
2
  import { behavior_change_lint } from './behavior-change-lint'
3
+ import { expected_effect_lint } from './expected-effect-lint'
5
4
  import { issue_classification } from './issue-classification'
6
5
  import { issue_lint } from './issue-lint'
6
+ import { issue_not_before } from './issue-not-before'
7
7
 
8
8
  // `josh issue:lint <path>` — read an Issue body from a file and print `ok`, or every template problem
9
9
  // one per line, exiting non-zero. It reads a path rather than stdin so it can
10
10
  // lint a body written to a file before the `gh api … issues` call that files it. A body that declares
11
11
  // itself a behavior-change Issue is additionally held to the firing-point, baseline and reproduction
12
- // rules.
12
+ // rules, and one that declares a run-time-shortening aim to the expected-effect estimate.
13
13
 
14
14
  const SUCCESS_EXIT_CODE = 0
15
15
  const FAILURE_EXIT_CODE = 1
@@ -17,15 +17,17 @@ const OK_MESSAGE = 'ok'
17
17
  const NO_LABELS = 'none'
18
18
  const USAGE = 'Usage: josh issue:lint <path-to-issue-body>'
19
19
 
20
- // Every problem a body has: the four base template headings it lacks, then the behavior-change
21
- // problems (empty for an Issue that does not declare itself one).
20
+ // Every problem a body has: the four base template headings it lacks, then the behavior-change and
21
+ // expected-effect problems (each empty for an Issue that does not declare itself one).
22
22
  function problems(body: string): ReadonlyArray<string> {
23
23
  const missing = issue_lint.missing_headings(body).map((heading) => `missing heading: ${heading}`)
24
24
 
25
25
  return [
26
26
  ...missing,
27
27
  ...behavior_change_lint.problems(body),
28
+ ...expected_effect_lint.problems(body),
28
29
  ...issue_classification.problems(body),
30
+ ...issue_not_before.problems(body),
29
31
  ]
30
32
  }
31
33
 
@@ -54,14 +56,6 @@ async function run(body_path: string | undefined): Promise<number> {
54
56
  return report(problems(body), body)
55
57
  }
56
58
 
57
- async function main(argv: ReadonlyArray<string>): Promise<void> {
58
- process.exitCode = await run(argv[0])
59
- }
60
-
61
59
  const issue_lint_cli = { problems, run }
62
60
 
63
- const ARGV_OFFSET = 2
64
-
65
- if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
66
-
67
61
  export { issue_lint_cli }
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env tsx
2
+ import { fileURLToPath } from 'node:url'
3
+ import { issue_lint_cli } from './issue-lint-cli'
4
+
5
+ // The `josh issue:lint` entry, kept apart from `issue-lint-cli.ts` because other modules import that
6
+ // 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 PATH_ARGUMENT_INDEX = 2
10
+
11
+ process.exitCode = await issue_lint_cli.run(process.argv[PATH_ARGUMENT_INDEX])
12
+ }
@@ -0,0 +1,56 @@
1
+ #!/usr/bin/env tsx
2
+ import { fileURLToPath } from 'node:url'
3
+ import { epic_close } from '#scripts/epic/epic-close'
4
+ import { git_gh_command } from '#scripts/gh/git-gh-command'
5
+ import { issue_evidence_exit } from '#scripts/issue/issue-evidence-exit'
6
+ import { MEASURED_LABEL } from '#scripts/issue/issue-labels'
7
+ import { session_cite } from '#scripts/issue/session-cite'
8
+
9
+ // `josh issue:measured <N> --evidence-file <path>` — the completion of a measurement-only Issue
10
+ // (`issue-comments.md` → "A measurement-only Issue"): the result comment, the
11
+ // `measured` label, the close and the `run:release`, in that order (`issue-evidence-exit.ts`).
12
+ //
13
+ // **The close is the run's own**: such an Issue changes no code, so no pull request's `closes #N`
14
+ // can close it, and an OPEN child `run:merge` reads as `failed` and parks with `run:stalled`. A
15
+ // CLOSED one it reads as `merged` (`run-merge.ts` → `classify_child`). The label goes on before the
16
+ // close because it is what every sweep — `run:carry --end`, `run:tidy` — tells this close from a
17
+ // person's by (`issue-merged.ts`); a close without it would be one they never count as merged.
18
+
19
+ const ARGV_OFFSET = 2
20
+
21
+ async function apply_label(issue_number: string): Promise<boolean> {
22
+ const write = await git_gh_command.issue_apply_label(issue_number, MEASURED_LABEL)
23
+
24
+ if (!write.is_applied) console.error(`${MEASURED_LABEL} not applied: ${write.reason}`)
25
+
26
+ return write.is_applied
27
+ }
28
+
29
+ // A closed measurement may be its epic's last child, and no `followup` runs for it — so the epic
30
+ // auto-close is run here, through the one entry every child close takes (`epic-close.ts`).
31
+ async function close_issue(issue_number: string): Promise<boolean> {
32
+ const is_closed = await git_gh_command.issue_close(issue_number, undefined)
33
+
34
+ if (is_closed) await epic_close.close_completed_epics({ issue_number, is_merged: true })
35
+ else console.error(`Issue ${session_cite.issue(issue_number)} not closed`)
36
+
37
+ return is_closed
38
+ }
39
+
40
+ async function label_and_close(issue_number: string): Promise<boolean> {
41
+ return (await apply_label(issue_number)) && (await close_issue(issue_number))
42
+ }
43
+
44
+ async function run(argv: ReadonlyArray<string>): Promise<number> {
45
+ return await issue_evidence_exit.run(argv, { command: 'issue:measured', finish: label_and_close })
46
+ }
47
+
48
+ async function main(argv: ReadonlyArray<string>): Promise<void> {
49
+ process.exitCode = await run(argv)
50
+ }
51
+
52
+ const issue_measured_cli = { run }
53
+
54
+ if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
55
+
56
+ export { issue_measured_cli }
@@ -1,5 +1,6 @@
1
1
  import { git_gh_api_path } from '#scripts/gh/git-gh-api-path'
2
2
  import { git_gh_exec } from '#scripts/gh/git-gh-exec'
3
+ import { MEASURED_LABEL } from '#scripts/issue/issue-labels'
3
4
 
4
5
  // Whether an issue was closed by a merge, read from its REST timeline. The
5
6
  // issue's own `state_reason` cannot tell: a pull request's `closes #N` and a person's "Close as
@@ -8,9 +9,15 @@ import { git_gh_exec } from '#scripts/gh/git-gh-exec'
8
9
  // pull request. A manual "completed" close still reads as merged when a merged pull request also
9
10
  // references the issue — the one case the timeline cannot separate — and every other doubt falls to
10
11
  // `false`, because a sweep deletes work on this answer.
12
+ //
13
+ // **A measurement-only issue stands in for the merge with its `measured` label**: it changes no code,
14
+ // so no pull request closes it, and `josh issue:measured` labels it before closing it. A completed
15
+ // close while the label is on is the run's own, so every sweep reading this answer agrees on it.
11
16
 
12
17
  const CLOSED_EVENT = 'closed'
13
18
  const REOPENED_EVENT = 'reopened'
19
+ const LABELED_EVENT = 'labeled'
20
+ const UNLABELED_EVENT = 'unlabeled'
14
21
  const MERGED_REFERENCE = 'merged-reference'
15
22
  // A close by a pull request's `closes #N` carries no reason in the timeline; a person's "Close as
16
23
  // completed" carries `completed`. Any other reason — `not_planned`, `duplicate` — is not a merge, and
@@ -19,13 +26,16 @@ const COMPLETED_REASONS: ReadonlySet<string> = new Set(['', 'completed'])
19
26
  const FIELD_SEPARATOR = '\t'
20
27
  const LINE_SEPARATOR = '\n'
21
28
  // One `<event>\t<state_reason>` line per closed/reopened event, and a `merged-reference` line per
22
- // merged pull request that cross-references the issue — the three kinds the answer reads.
29
+ // merged pull request that cross-references the issue, and a `labeled` / `unlabeled` line per change of
30
+ // the `measured` label — the kinds the answer reads.
23
31
  const TIMELINE_FILTER = [
24
32
  '.[]',
25
33
  '| if .event == "cross-referenced" and .source.issue.pull_request.merged_at != null',
26
34
  String.raw`then "${MERGED_REFERENCE}\t"`,
27
35
  `elif .event == "${CLOSED_EVENT}" or .event == "${REOPENED_EVENT}"`,
28
36
  String.raw`then "\(.event)\t\(.state_reason // "")"`,
37
+ `elif (.event == "${LABELED_EVENT}" or .event == "${UNLABELED_EVENT}") and .label.name == "${MEASURED_LABEL}"`,
38
+ String.raw`then "\(.event)\t"`,
29
39
  'else empty end',
30
40
  ].join(' ')
31
41
 
@@ -45,6 +55,13 @@ function parse_rows(raw: string): Array<TimelineRow> {
45
55
  })
46
56
  }
47
57
 
58
+ // The last `labeled` / `unlabeled` event of the `measured` label is whether it is on now.
59
+ function is_measured(rows: ReadonlyArray<TimelineRow>): boolean {
60
+ const last = rows.findLast((row) => row.event === LABELED_EVENT || row.event === UNLABELED_EVENT)
61
+
62
+ return last?.event === LABELED_EVENT
63
+ }
64
+
48
65
  // The last closed/reopened event is the issue's current state, so a reopened issue is not merged
49
66
  // even with a merged reference from an earlier attempt.
50
67
  function is_merged_close(rows: ReadonlyArray<TimelineRow>): boolean {
@@ -52,7 +69,7 @@ function is_merged_close(rows: ReadonlyArray<TimelineRow>): boolean {
52
69
 
53
70
  if (last?.event !== CLOSED_EVENT || !COMPLETED_REASONS.has(last.reason)) return false
54
71
 
55
- return rows.some((row) => row.event === MERGED_REFERENCE)
72
+ return is_measured(rows) || rows.some((row) => row.event === MERGED_REFERENCE)
56
73
  }
57
74
 
58
75
  // `undefined` when the timeline could not be read, so a caller that keeps the answer can tell "not
@@ -0,0 +1,135 @@
1
+ import { git_gh_command } from '#scripts/gh/git-gh-command'
2
+ import { git_gh_issue_write } from '#scripts/gh/git-gh-issue-write'
3
+ import { epic_issue_schema } from '#scripts/git/git-schemas'
4
+ import { parse_json_array_or_undefined } from '#scripts/git/parse-json-array'
5
+ import { error_text } from '#scripts/lib/error-message'
6
+ import { has_label_name, NOT_BEFORE_LABEL, REPOSITORY_LABELS } from './issue-labels'
7
+ import { issue_not_before } from './issue-not-before'
8
+ import { issue_sample_gate } from './issue-sample-gate'
9
+ import { session_cite } from './session-cite'
10
+
11
+ // joshuafolkken/kit#4079: the body's start-time declaration held an issue back from `backlog:next`,
12
+ // but neither the issue listing nor `run:board` showed it waited on the clock. `not-before` is a copy
13
+ // of that declaration, kept here alone: the body stays the source, and this module is the one place
14
+ // that decides whether the copy is owed.
15
+
16
+ type LabelChange = 'add' | 'remove'
17
+
18
+ // One issue as the listings return it; `labels` may be absent.
19
+ interface LabelledIssue {
20
+ number: number
21
+ body?: string | undefined
22
+ labels?: ReadonlyArray<{ name: string }> | undefined
23
+ }
24
+
25
+ const DEFINITION = REPOSITORY_LABELS.find((label) => label.name === NOT_BEFORE_LABEL)
26
+ const NOT_APPLIED = 'the label was not applied'
27
+ const LABELLED_LIMIT = 200
28
+
29
+ function is_waiting(body: string | undefined, now: number): boolean {
30
+ return !issue_not_before.is_due(body, now)
31
+ }
32
+
33
+ // What the label owes one issue: `add` while the declared time is ahead and the label is absent,
34
+ // `remove` once the time has passed or the declaration is gone, else nothing.
35
+ function change_of(
36
+ body: string | undefined,
37
+ labels: ReadonlyArray<string>,
38
+ now: number = Date.now(),
39
+ ): LabelChange | undefined {
40
+ const is_labelled = has_label_name(labels, NOT_BEFORE_LABEL)
41
+
42
+ if (is_waiting(body, now) === is_labelled) return undefined
43
+
44
+ return is_labelled ? 'remove' : 'add'
45
+ }
46
+
47
+ // The labels a new issue is filed with — the label added when its body declares a time still ahead.
48
+ function with_label(
49
+ labels: ReadonlyArray<string>,
50
+ body: string,
51
+ now: number = Date.now(),
52
+ ): ReadonlyArray<string> {
53
+ return change_of(body, labels, now) === 'add' ? [...labels, NOT_BEFORE_LABEL] : labels
54
+ }
55
+
56
+ function changes_of(
57
+ issues: ReadonlyArray<LabelledIssue>,
58
+ now: number,
59
+ ): ReadonlyArray<readonly [LabelledIssue, LabelChange]> {
60
+ return issues.flatMap(function change(issue): Array<readonly [LabelledIssue, LabelChange]> {
61
+ const names = (issue.labels ?? []).map((label) => label.name)
62
+ const owed = change_of(issue.body, names, now)
63
+
64
+ return owed === undefined ? [] : [[issue, owed]]
65
+ })
66
+ }
67
+
68
+ // The addition answers `false` where the removal throws; both fail here the same way.
69
+ async function write(number: string, owed: LabelChange): Promise<void> {
70
+ if (owed === 'remove') {
71
+ await git_gh_issue_write.issue_remove_label(number, NOT_BEFORE_LABEL)
72
+
73
+ return
74
+ }
75
+
76
+ if (!(await git_gh_issue_write.issue_add_label(number, NOT_BEFORE_LABEL))) {
77
+ throw new Error(NOT_APPLIED)
78
+ }
79
+ }
80
+
81
+ // A failed write is named and left: the next scan owes the same change and makes it then.
82
+ async function apply(issue: LabelledIssue, owed: LabelChange): Promise<void> {
83
+ try {
84
+ await write(String(issue.number), owed)
85
+ } catch (error) {
86
+ const cited = session_cite.issue(issue.number)
87
+
88
+ console.warn(
89
+ `${cited}: could not ${owed} \`${NOT_BEFORE_LABEL}\`: ${error_text.message_of(error)}`,
90
+ )
91
+ }
92
+ }
93
+
94
+ // Brings every issue's label in line with its body. The label is created before the first addition,
95
+ // so it carries its color and description rather than the ones GitHub generates for a missing label.
96
+ async function sync(issues: ReadonlyArray<LabelledIssue>, now: number = Date.now()): Promise<void> {
97
+ const changes = changes_of(issues, now)
98
+
99
+ if (DEFINITION !== undefined && changes.some(([, owed]) => owed === 'add')) {
100
+ await git_gh_issue_write.label_ensure(DEFINITION)
101
+ }
102
+
103
+ await Promise.all(
104
+ changes.map(async ([issue, owed]) => {
105
+ await apply(issue, owed)
106
+ }),
107
+ )
108
+ }
109
+
110
+ // Every open issue already carrying the label. A failed read is an empty list: the next scan reads it
111
+ // again.
112
+ async function read_labelled(): Promise<ReadonlyArray<LabelledIssue>> {
113
+ const { json } = await git_gh_command.issue_list_by_label(NOT_BEFORE_LABEL, LABELLED_LIMIT)
114
+ const rows =
115
+ json === undefined ? undefined : parse_json_array_or_undefined(json, epic_issue_schema)
116
+
117
+ return (rows ?? []).map((row) => ({ ...row, labels: [{ name: NOT_BEFORE_LABEL }] }))
118
+ }
119
+
120
+ // `sync` over the scanned issues plus every issue the label is on. `issue:file` labels a filing that
121
+ // may never be scanned — one never opted in — so only the label's own listing reaches it to remove it.
122
+ async function sweep(
123
+ scanned: ReadonlyArray<LabelledIssue>,
124
+ now: number = Date.now(),
125
+ ): Promise<void> {
126
+ const seen = new Set(scanned.map((issue) => issue.number))
127
+ const labelled = await read_labelled()
128
+
129
+ await issue_sample_gate.prime(labelled.map((issue) => issue.body))
130
+ await sync([...scanned, ...labelled.filter((issue) => !seen.has(issue.number))], now)
131
+ }
132
+
133
+ const issue_not_before_label = { change_of, sweep, sync, with_label }
134
+
135
+ export { issue_not_before_label }