@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
@@ -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 }
@@ -0,0 +1,111 @@
1
+ import { issue_sample_gate } from './issue-sample-gate'
2
+ import { markdown_section } from './markdown-section'
3
+
4
+ // joshuafolkken/kit#4007: a follow-up measurement filed with `auto-ok` ("measure three days after #N
5
+ // merges") was offered by `backlog:next` the day it was filed, and its lane could only hand the hold
6
+ // back. The body now names the earliest time the work can start, and the pickup holds the issue until
7
+ // then. One UTC spelling only — a date a reader has to guess the zone of is not a deadline.
8
+ // A body may instead wait on samples recorded after a pull request merged (`issue-sample-gate.ts`);
9
+ // this module answers for both, so every reader holds an issue back the same way.
10
+
11
+ const BACKGROUND_HEADING = '## 背景'
12
+ const PREFIX = '- 実施可能日:'
13
+ const DATE_PATTERN = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}Z$/u
14
+ // What `toISOString` writes after the minutes the declaration spells.
15
+ const ISO_TAIL = ':00.000Z'
16
+ const MALFORMED = `\`${PREFIX}\` must be a UTC time written YYYY-MM-DDTHH:MMZ`
17
+ const HEADING_MARKS = /^#{1,6}\s+/u
18
+ // joshuafolkken/kit#4438: a start condition written as its own heading is never read — every reader
19
+ // sees only the declaration line under the background heading — so the issue is offered at once.
20
+ const STRAY_HEADINGS = [
21
+ { name: '実施可能日', declaration: `${PREFIX} YYYY-MM-DDTHH:MMZ` },
22
+ { name: '実施可能条件', declaration: issue_sample_gate.DECLARATION },
23
+ ]
24
+
25
+ // The value after the declaration under the background heading, or `undefined` when the body declares none.
26
+ function declared_value(body: string): string | undefined {
27
+ const background = markdown_section.section_lines(body, BACKGROUND_HEADING).join('\n')
28
+ const line = markdown_section
29
+ .unfenced_lines(background)
30
+ .map((text) => text.trim())
31
+ .find((text) => text.startsWith(PREFIX))
32
+
33
+ return line?.slice(PREFIX.length).trim()
34
+ }
35
+
36
+ // The round trip refuses a calendar-impossible value (`2026-02-30T09:30Z`, `T24:00Z`) that
37
+ // `Date.parse` silently rolls over into a different time.
38
+ function is_valid(value: string): boolean {
39
+ if (!DATE_PATTERN.test(value)) return false
40
+
41
+ const time = Date.parse(value)
42
+
43
+ return !Number.isNaN(time) && new Date(time).toISOString() === `${value.slice(0, -1)}${ISO_TAIL}`
44
+ }
45
+
46
+ // The declared time, or `undefined` when there is none or it does not parse. A malformed date reads as
47
+ // absent: `issue:file` refuses it, and holding a hand-edited one forever would lose the issue silently.
48
+ function date_of(body = ''): string | undefined {
49
+ const value = declared_value(body)
50
+
51
+ return value !== undefined && is_valid(value) ? value : undefined
52
+ }
53
+
54
+ function is_date_due(body: string | undefined, now: number): boolean {
55
+ const date = date_of(body)
56
+
57
+ return date === undefined || Date.parse(date) <= now
58
+ }
59
+
60
+ // Whether the issue may start: its declared time has arrived and its declared samples are recorded.
61
+ function is_due(body: string | undefined, now: number = Date.now()): boolean {
62
+ return is_date_due(body, now) && issue_sample_gate.wait_of(body) === undefined
63
+ }
64
+
65
+ // The declared time as epoch milliseconds while it is still ahead, or `undefined` when it has arrived —
66
+ // for a reader that spells the time its own way (`run:board` in the local zone).
67
+ function waiting_ms(body: string | undefined, now: number = Date.now()): number | undefined {
68
+ if (is_date_due(body, now)) return undefined
69
+
70
+ return Date.parse(String(date_of(body)))
71
+ }
72
+
73
+ // The declared time as written while it is still ahead, or `undefined` when it has arrived.
74
+ function waiting_date(body: string | undefined, now: number = Date.now()): string | undefined {
75
+ return is_date_due(body, now) ? undefined : date_of(body)
76
+ }
77
+
78
+ // Why `backlog:next` holds an issue back, or `undefined` when it is due. The caller cites the issue.
79
+ function waiting_reason(body: string | undefined, now: number = Date.now()): string | undefined {
80
+ const date = waiting_date(body, now)
81
+
82
+ if (date !== undefined) return `not before ${date}`
83
+
84
+ const wait = issue_sample_gate.wait_of(body)
85
+
86
+ return wait === undefined ? undefined : issue_sample_gate.reason_of(wait)
87
+ }
88
+
89
+ function stray_heading_problems(body: string): ReadonlyArray<string> {
90
+ const headings = markdown_section
91
+ .unfenced_lines(body)
92
+ .map((line) => line.trim())
93
+ .filter((line) => HEADING_MARKS.test(line))
94
+ .map((line) => line.replace(HEADING_MARKS, ''))
95
+
96
+ return STRAY_HEADINGS.filter(({ name }) => headings.some((text) => text.startsWith(name))).map(
97
+ ({ name, declaration }) =>
98
+ `heading \`${name}\` is not read — declare it under \`${BACKGROUND_HEADING}\` as \`${declaration}\``,
99
+ )
100
+ }
101
+
102
+ function problems(body: string): ReadonlyArray<string> {
103
+ const value = declared_value(body)
104
+ const date_problems = value === undefined || is_valid(value) ? [] : [MALFORMED]
105
+
106
+ return [...stray_heading_problems(body), ...date_problems, ...issue_sample_gate.problems(body)]
107
+ }
108
+
109
+ const issue_not_before = { is_due, problems, waiting_date, waiting_ms, waiting_reason }
110
+
111
+ export { issue_not_before }
@@ -22,6 +22,20 @@ function require_issue_number(issue: string): void {
22
22
  if (!is_issue_number(issue)) throw new Error(`${BAD_ISSUE_MESSAGE}${issue}`)
23
23
  }
24
24
 
25
- const issue_number_shape = { ISSUE_NUMBER_PATTERN, is_issue_number, require_issue_number }
25
+ // A command whose one positional is the issue it writes to: a missing, malformed or second number
26
+ // answers `undefined`, so the caller refuses the whole call rather than writing to some other issue.
27
+ function single_of(positionals: ReadonlyArray<string>): string | undefined {
28
+ const [issue_number, ...rest] = positionals
29
+ const is_single = rest.length === 0 && issue_number !== undefined
30
+
31
+ return is_single && ISSUE_NUMBER_PATTERN.test(issue_number) ? issue_number : undefined
32
+ }
33
+
34
+ const issue_number_shape = {
35
+ ISSUE_NUMBER_PATTERN,
36
+ is_issue_number,
37
+ require_issue_number,
38
+ single_of,
39
+ }
26
40
 
27
41
  export { issue_number_shape }
@@ -0,0 +1,28 @@
1
+ import { git_gh_issue_write } from '#scripts/gh/git-gh-issue-write'
2
+
3
+ // A park on GitHub: the label that keeps an issue from being offered again, and the comment that says
4
+ // why. `run:park` (a lane child's `needs-decision`), `run:merge` and the ship relaunch cap (both
5
+ // `run:stalled`) park the same way, so the pair is written once here (joshuafolkken/kit#4132).
6
+ //
7
+ // **The label goes first and the comment only on it.** The label is what every offer reads; a comment
8
+ // on an issue whose label failed would explain a park that did not happen.
9
+
10
+ interface ParkWrite {
11
+ is_labelled: boolean
12
+ is_commented: boolean
13
+ }
14
+
15
+ async function apply(issue: string, label: string, body: string): Promise<ParkWrite> {
16
+ const is_labelled = await git_gh_issue_write.issue_add_label(issue, label)
17
+
18
+ if (!is_labelled) return { is_labelled, is_commented: false }
19
+
20
+ const is_commented = await git_gh_issue_write.issue_try_comment(issue, body)
21
+
22
+ return { is_labelled, is_commented }
23
+ }
24
+
25
+ const issue_park = { apply }
26
+
27
+ export type { ParkWrite }
28
+ export { issue_park }
@@ -0,0 +1,151 @@
1
+ #!/usr/bin/env tsx
2
+ import { fileURLToPath } from 'node:url'
3
+ import { git_gh_command } from '#scripts/gh/git-gh-command'
4
+ import { issue_body_or_comment } from '#scripts/issue/issue-body-or-comment'
5
+ import { PLANNED_LABEL } from '#scripts/issue/issue-labels'
6
+ import { issue_number_shape } from '#scripts/issue/issue-number-shape'
7
+ import { plan_consumers_section } from '#scripts/issue/plan-consumers-section'
8
+ import { cli_body } from '#scripts/josh/cli-body'
9
+ import { cli_flags } from '#scripts/lib/cli-flags'
10
+ import { error_text } from '#scripts/lib/error-message'
11
+
12
+ // `josh issue:plan <N> --body-file <path> [--title <title>] [--planned]` — record a plan on an issue
13
+ // in one call: the title normalized, the plan written into a blank body or posted as a comment, and
14
+ // `run:planned` applied.
15
+ //
16
+ // **`kickoff` and `fullrun` spelled those three writes out by hand** — a `gh api -X PATCH` for the
17
+ // title, a second one for a blank body or `issue:comment` otherwise, and a third `gh api` for the
18
+ // label — so the blank-body decision lived in three documents. It now lives in
19
+ // `issue-body-or-comment.ts`, which `followup`'s completion notice shares.
20
+
21
+ const SUCCESS_EXIT_CODE = 0
22
+ const FAILURE_EXIT_CODE = 1
23
+ const ARGV_OFFSET = 2
24
+ const USAGE =
25
+ 'Usage: josh issue:plan <issue-number> --body-file <path> [--title <title>] [--planned] [--repo <owner/name>]'
26
+
27
+ interface PlanRequest {
28
+ issue_number: string
29
+ plan: string
30
+ title: string | undefined
31
+ is_planned: boolean
32
+ repo: string | undefined
33
+ }
34
+
35
+ const OPTIONS = {
36
+ 'body-file': { type: 'string' },
37
+ title: { type: 'string' },
38
+ planned: { type: 'boolean' },
39
+ repo: { type: 'string' },
40
+ } as const
41
+
42
+ // The plan is read last, from the path the flags named; an empty plan refuses like a missing one. A
43
+ // plan without its existing-consumers section throws its refusal, printed as-is like a read failure,
44
+ // before any write (`plan-consumers-section.ts`).
45
+ function with_plan(
46
+ flags: Omit<PlanRequest, 'plan'>,
47
+ file_path: string | undefined,
48
+ ): PlanRequest | undefined {
49
+ if (file_path === undefined) return undefined
50
+ const plan = cli_body.read_file_or_stdin(file_path)
51
+
52
+ if (plan.trim().length === 0) return undefined
53
+ const refusal = plan_consumers_section.refusal_of(plan)
54
+
55
+ if (refusal !== undefined) throw new Error(refusal)
56
+
57
+ return { ...flags, plan }
58
+ }
59
+
60
+ // An optional string flag, trimmed; given blank it is `''`, which the caller refuses.
61
+ function trimmed(value: string | undefined): string | undefined {
62
+ return value?.trim()
63
+ }
64
+
65
+ // A `--title` or `--repo` given blank refuses rather than being dropped: the caller meant to rename
66
+ // the issue, or to address another repository's — a dropped `--repo` would write to this one's.
67
+ function parse_request(argv: ReadonlyArray<string>): PlanRequest | undefined {
68
+ const parsed = cli_flags.arguments_of(argv, OPTIONS)
69
+
70
+ if (parsed === undefined) return undefined
71
+ const issue_number = issue_number_shape.single_of(parsed.positionals)
72
+ const [title, repo] = [trimmed(parsed.values.title), trimmed(parsed.values.repo)]
73
+
74
+ if (issue_number === undefined || [title, repo].includes('')) return undefined
75
+ const is_planned = parsed.values.planned === true
76
+
77
+ return with_plan({ issue_number, title, is_planned, repo }, parsed.values['body-file'])
78
+ }
79
+
80
+ // A file-read failure surfaces as an `Error` naming the resolved path, printed as-is; `undefined` is
81
+ // a malformed call, which `USAGE` explains.
82
+ function resolve_request(argv: ReadonlyArray<string>): PlanRequest | undefined {
83
+ try {
84
+ const request = parse_request(argv)
85
+
86
+ if (request === undefined) console.error(USAGE)
87
+
88
+ return request
89
+ } catch (error) {
90
+ console.error(error_text.message_of(error))
91
+
92
+ return undefined
93
+ }
94
+ }
95
+
96
+ // The title goes first, so the plan and the label land on an issue already carrying the name the
97
+ // plan was written under; the label goes last, so `run:planned` never marks an issue whose plan
98
+ // failed to post.
99
+ async function apply_planned_label(issue_number: string, repo?: string): Promise<boolean> {
100
+ const is_applied = await git_gh_command.issue_add_label(issue_number, PLANNED_LABEL, repo)
101
+
102
+ if (is_applied) console.info(`label: ${PLANNED_LABEL}`)
103
+ else console.error(`Could not apply ${PLANNED_LABEL} to issue ${issue_number}.`)
104
+
105
+ return is_applied
106
+ }
107
+
108
+ // `--repo` addresses every write — the title, the plan and the label — so `kickoff kit#<N>` run from
109
+ // another checkout records the plan on the named repository's issue, never on this one's.
110
+ async function record_plan(request: PlanRequest): Promise<boolean> {
111
+ const { issue_number, title, repo } = request
112
+
113
+ if (title !== undefined) {
114
+ console.info(`title: ${await git_gh_command.issue_edit_title(issue_number, title, repo)}`)
115
+ }
116
+
117
+ const posted = await issue_body_or_comment.post(issue_number, request.plan, repo)
118
+
119
+ console.info(`${posted.destination}: ${posted.url}`)
120
+
121
+ return request.is_planned ? await apply_planned_label(issue_number, repo) : true
122
+ }
123
+
124
+ // A refused write prints as one line, like a file-read failure, rather than escaping as a stack trace.
125
+ async function try_record_plan(request: PlanRequest): Promise<boolean> {
126
+ try {
127
+ return await record_plan(request)
128
+ } catch (error) {
129
+ console.error(error_text.message_of(error))
130
+
131
+ return false
132
+ }
133
+ }
134
+
135
+ async function run(argv: ReadonlyArray<string>): Promise<number> {
136
+ const request = resolve_request(argv)
137
+
138
+ if (request === undefined) return FAILURE_EXIT_CODE
139
+
140
+ return (await try_record_plan(request)) ? SUCCESS_EXIT_CODE : FAILURE_EXIT_CODE
141
+ }
142
+
143
+ async function main(argv: ReadonlyArray<string>): Promise<void> {
144
+ process.exitCode = await run(argv)
145
+ }
146
+
147
+ const issue_plan_cli = { USAGE, run }
148
+
149
+ if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
150
+
151
+ export { issue_plan_cli }
@@ -0,0 +1,151 @@
1
+ import { expected_effect_lint } from './expected-effect-lint'
2
+ import { has_label_name, PRIORITY_CRITICAL_LABEL, PRIORITY_HIGH_LABEL } from './issue-labels'
3
+ import { markdown_section } from './markdown-section'
4
+
5
+ // joshuafolkken/kit#4383: the priority `josh issue:file` applies, read from the body's one priority
6
+ // declaration under its background heading (`issue-template.md` holds the criteria). An urgent or high
7
+ // declaration must name its basis, so neither label is applied on a bare word. A run-time-shortening
8
+ // Issue's reduction-per-merge line sets a floor — its share of the median lane time per merge — and
9
+ // a declaration below that floor is refused. A priority label the filer typed (`kickoff new critical`)
10
+ // wins: the body is then not judged at all.
11
+
12
+ type PriorityLevel = 'critical' | 'high' | 'normal'
13
+
14
+ interface LevelParser {
15
+ pattern: RegExp
16
+ level: PriorityLevel
17
+ accepts: (basis: string) => boolean
18
+ }
19
+
20
+ const BACKGROUND_HEADING = '## 背景'
21
+ const DECLARATION_PREFIX = '- 優先度:'
22
+ const NORMAL_LINE = '- 優先度: 通常'
23
+ const CRITICAL_PATTERN = /^- 優先度: 緊急((?<basis>.*))$/u
24
+ const HIGH_PATTERN = /^- 優先度: 高((?<basis>.*))$/u
25
+ // An interrupt-filing condition number (`wip-cap.md`) or a stated reduction.
26
+ const CRITICAL_BASIS = /条件 ?[1-3]|短縮 ?\d/u
27
+ const PLACEHOLDER = /^<.*>$/u
28
+ const REDUCTION_PREFIX = '- 1 マージあたりの短縮:'
29
+ // A number with its percent sign, half- or full-width, glued to the word before it or not, one space
30
+ // before the sign or none.
31
+ const PERCENT = /(?<![\d.])(?<value>[\d.]+) ?[%%]/gu
32
+ const CRITICAL_PERCENT = 10
33
+ const HIGH_PERCENT = 3
34
+ const LEVELS: ReadonlyArray<PriorityLevel> = ['normal', 'high', 'critical']
35
+ const LABELS: Readonly<Record<PriorityLevel, string | undefined>> = {
36
+ critical: PRIORITY_CRITICAL_LABEL,
37
+ high: PRIORITY_HIGH_LABEL,
38
+ normal: undefined,
39
+ }
40
+ const DECLARATION_PROBLEM = `declare at most one priority under \`${BACKGROUND_HEADING}\`: \`- 優先度: 緊急(条件 <1-3> / 短縮 <値>)\`, \`- 優先度: 高(<根拠>)\` or \`${NORMAL_LINE}\` — an urgent or high one names its basis (\`issue-template.md\`)`
41
+
42
+ const REDUCTION_PROBLEM = `a \`${expected_effect_lint.DECLARATION_LINE}\` Issue states \`${REDUCTION_PREFIX} <分>(レーン中央値 <分> の <%>)\` under \`${expected_effect_lint.HEADING}\` with its percentage filled in (\`issue-template.md\`)`
43
+
44
+ function unfenced_lines(body: string, heading: string): ReadonlyArray<string> {
45
+ const section = markdown_section.section_lines(body, heading).join('\n')
46
+
47
+ return markdown_section.unfenced_lines(section).map((line) => line.trim())
48
+ }
49
+
50
+ function has_basis(basis: string): boolean {
51
+ const trimmed = basis.trim()
52
+
53
+ return trimmed.length > 0 && !PLACEHOLDER.test(trimmed)
54
+ }
55
+
56
+ function has_critical_basis(basis: string): boolean {
57
+ return CRITICAL_BASIS.test(basis)
58
+ }
59
+
60
+ const PARSERS: ReadonlyArray<LevelParser> = [
61
+ { pattern: CRITICAL_PATTERN, level: 'critical', accepts: has_critical_basis },
62
+ { pattern: HIGH_PATTERN, level: 'high', accepts: has_basis },
63
+ ]
64
+
65
+ function parsed_level(parser: LevelParser, line: string): PriorityLevel | undefined {
66
+ const basis = parser.pattern.exec(line)?.groups?.['basis'] ?? ''
67
+
68
+ return parser.accepts(basis) ? parser.level : undefined
69
+ }
70
+
71
+ // The level one declaration line states, or `undefined` when it is malformed or names no basis.
72
+ function level_of(line: string): PriorityLevel | undefined {
73
+ if (line === NORMAL_LINE) return 'normal'
74
+ const parser = PARSERS.find((entry) => entry.pattern.test(line))
75
+
76
+ return parser === undefined ? undefined : parsed_level(parser, line)
77
+ }
78
+
79
+ // `normal` when the body declares nothing, `undefined` when it declares more than one line or a bad one.
80
+ function declared_level(body: string): PriorityLevel | undefined {
81
+ const lines = unfenced_lines(body, BACKGROUND_HEADING).filter((line) =>
82
+ line.startsWith(DECLARATION_PREFIX),
83
+ )
84
+
85
+ if (lines.length === 0) return 'normal'
86
+
87
+ return lines.length === 1 ? level_of(lines[0] ?? '') : undefined
88
+ }
89
+
90
+ // The share of the median lane time per merge the reduction line states, the last percentage on it.
91
+ function reduction_percent(body: string): number | undefined {
92
+ const line = unfenced_lines(body, expected_effect_lint.HEADING).find((text) =>
93
+ text.startsWith(REDUCTION_PREFIX),
94
+ )
95
+ const values = [...(line ?? '').matchAll(PERCENT)].map((match) => Number(match.groups?.['value']))
96
+
97
+ return values.findLast((value) => Number.isFinite(value))
98
+ }
99
+
100
+ // The lowest level a run-time-shortening Issue may declare, from its stated reduction.
101
+ function floor_of(body: string): PriorityLevel {
102
+ const percent = expected_effect_lint.is_target(body) ? reduction_percent(body) : undefined
103
+
104
+ if (percent === undefined || percent < HIGH_PERCENT) return 'normal'
105
+
106
+ return percent >= CRITICAL_PERCENT ? 'critical' : 'high'
107
+ }
108
+
109
+ function is_typed(labels: ReadonlyArray<string>): boolean {
110
+ return (
111
+ has_label_name(labels, PRIORITY_CRITICAL_LABEL) || has_label_name(labels, PRIORITY_HIGH_LABEL)
112
+ )
113
+ }
114
+
115
+ // A run-time-shortening Issue must state its reduction as a percentage, or its floor could not be judged.
116
+ function has_missing_reduction(body: string): boolean {
117
+ return expected_effect_lint.is_target(body) && reduction_percent(body) === undefined
118
+ }
119
+
120
+ function floor_problem(body: string, level: PriorityLevel): string | undefined {
121
+ const floor = floor_of(body)
122
+
123
+ if (LEVELS.indexOf(level) >= LEVELS.indexOf(floor)) return undefined
124
+
125
+ return `the stated reduction per merge ranks this Issue \`${floor}\`, above its declared \`${level}\` — declare \`- 優先度: ${floor === 'critical' ? '緊急' : '高'}(短縮 …)\` (\`issue-template.md\`)`
126
+ }
127
+
128
+ // Why the filing is refused for its priority, or `undefined`. `typed` is the `--label` list.
129
+ function problem(body: string, typed: ReadonlyArray<string>): string | undefined {
130
+ if (is_typed(typed)) return undefined
131
+ const level = declared_level(body)
132
+
133
+ if (level === undefined) return DECLARATION_PROBLEM
134
+ if (has_missing_reduction(body)) return REDUCTION_PROBLEM
135
+
136
+ return floor_problem(body, level)
137
+ }
138
+
139
+ // The labels a new Issue is filed with — the declared priority's label added unless one was typed.
140
+ function with_label(labels: ReadonlyArray<string>, body: string): ReadonlyArray<string> {
141
+ const label = LABELS[declared_level(body) ?? 'normal']
142
+
143
+ if (label === undefined || is_typed(labels)) return labels
144
+
145
+ return [...labels, label]
146
+ }
147
+
148
+ const issue_priority = { declared_level, floor_of, problem, with_label }
149
+
150
+ export type { PriorityLevel }
151
+ export { issue_priority }
@@ -2,6 +2,7 @@ import {
2
2
  BUG_LABEL,
3
3
  has_label_name,
4
4
  INTERRUPT_ROUTE_LABEL,
5
+ PRIORITY_CRITICAL_LABEL,
5
6
  PRIORITY_HIGH_LABEL,
6
7
  RUN_SOLO_LABEL,
7
8
  } from './issue-labels'
@@ -9,7 +10,7 @@ import {
9
10
  // The keys that decide which open issue is offered first, defined once for
10
11
  // every ranking that asks: the `🗒 Next issues` display, the `auto-ok` pickup and `backlog:next`.
11
12
  //
12
- // In order: `priority:high`, then a defect on the verification path (`bug` with `run:solo`, or
13
+ // In order: `priority:critical`, then `priority:high`, then a defect on the verification path (`bug` with `run:solo`, or
13
14
  // `route:interrupt`), then how many other open issues wait on it. Below those, the caller's own order
14
15
  // stands — the sort is stable, so recency and the defect-rate adjustment survive as the last key.
15
16
  //
@@ -35,6 +36,10 @@ function flag(is_set: boolean): number {
35
36
  return is_set ? 1 : 0
36
37
  }
37
38
 
39
+ function is_critical(labels: ReadonlyArray<string>): boolean {
40
+ return has_label_name(labels, PRIORITY_CRITICAL_LABEL)
41
+ }
42
+
38
43
  function is_priority(labels: ReadonlyArray<string>): boolean {
39
44
  return has_label_name(labels, PRIORITY_HIGH_LABEL)
40
45
  }
@@ -48,6 +53,7 @@ function is_verification_defect(labels: ReadonlyArray<string>): boolean {
48
53
  // Negated so that the larger value sorts first under an ascending comparison.
49
54
  function keys_of(row: RankRow): ReadonlyArray<number> {
50
55
  return [
56
+ -flag(is_critical(row.labels)),
51
57
  -flag(is_priority(row.labels)),
52
58
  -flag(is_verification_defect(row.labels)),
53
59
  -row.dependents,
@@ -1,5 +1,3 @@
1
- #!/usr/bin/env tsx
2
- import { fileURLToPath } from 'node:url'
3
1
  import { git_gh_command } from '#scripts/gh/git-gh-command'
4
2
  import { issue_number_shape } from '#scripts/issue/issue-number-shape'
5
3
  import { bounded_pool } from '#scripts/lib/bounded-pool'
@@ -27,7 +25,6 @@ import { issue_report_failures, type ReadFailureKind } from './issue-report-fail
27
25
  // wins, and a comment nobody read cannot win anything.
28
26
 
29
27
  const FAILURE_EXIT_CODE = 1
30
- const ARGV_OFFSET = 2
31
28
  const USAGE = 'Usage: josh issue:read <issue-number> [<issue-number> ...]'
32
29
  const BLOCK_SEPARATOR = '\n\n---\n\n'
33
30
  // The same bound `issue:state` puts on its batch read, for the same reason: every read is a `gh`
@@ -82,7 +79,9 @@ async function read_issue(issue_number: string): Promise<NumberResult> {
82
79
 
83
80
  if (fields === undefined) return { kind: 'unreadable' }
84
81
 
85
- return { kind: 'issue', content: { fields, comments: issue_read.parse_comments(comments_json) } }
82
+ const comments = await issue_read.parse_comments(comments_json)
83
+
84
+ return { kind: 'issue', content: { fields, comments } }
86
85
  }
87
86
 
88
87
  // One issue's block for a caller that wants the text rather than the printing — `run:prep` composes it
@@ -134,10 +133,6 @@ async function run(argv: ReadonlyArray<string>): Promise<number> {
134
133
  return issue_report_failures.report_failures(reports, FAILURE_TERMS)
135
134
  }
136
135
 
137
- async function main(argv: ReadonlyArray<string>): Promise<void> {
138
- process.exitCode = await run(argv)
139
- }
140
-
141
136
  const issue_read_cli = {
142
137
  USAGE,
143
138
  parse_numbers,
@@ -145,7 +140,5 @@ const issue_read_cli = {
145
140
  run,
146
141
  }
147
142
 
148
- if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
149
-
150
143
  export type { BlockRead }
151
144
  export { issue_read_cli }