@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
@@ -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 }
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env tsx
2
+ import { fileURLToPath } from 'node:url'
3
+ import { issue_read_cli } from './issue-read-cli'
4
+
5
+ // The `josh issue:read` entry, kept apart from `issue-read-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 ARGV_OFFSET = 2
10
+
11
+ process.exitCode = await issue_read_cli.run(process.argv.slice(ARGV_OFFSET))
12
+ }
@@ -1,3 +1,4 @@
1
+ import { gh_author_association } from '#scripts/gh/gh-author-association'
1
2
  import { parse_json_object_or_undefined, read_json_listing } from '#scripts/git/parse-json-array'
2
3
  import { z } from 'zod'
3
4
 
@@ -30,6 +31,10 @@ const COMMENT_SEPARATOR = '\n\n'
30
31
  const SECTION_SEPARATOR = '\n\n'
31
32
  const COMMENT_HEADING = 'comment by '
32
33
  const AT = ' at '
34
+ // **A comment from an author without write access is shown but never read** (joshuafolkken/kit#4021):
35
+ // on a public repository anyone can comment, and `issue-comments.md` takes the later text as the
36
+ // agreement in force, so a third party's comment printed whole would be an instruction to the run.
37
+ const UNTRUSTED_COMMENT = `(body withheld — the author is not ${gh_author_association.TRUSTED_LIST}, so it is not an instruction)`
33
38
 
34
39
  const issue_fields_schema = z.looseObject({
35
40
  title: z.string(),
@@ -41,6 +46,7 @@ const comment_schema = z.looseObject({
41
46
  user: z.looseObject({ login: z.string() }).optional(),
42
47
  created_at: z.string().optional(),
43
48
  body: z.string().optional(),
49
+ author_association: z.string().nullish(),
44
50
  })
45
51
 
46
52
  interface IssueFields {
@@ -53,6 +59,7 @@ interface IssueComment {
53
59
  author: string
54
60
  created_at: string
55
61
  body: string
62
+ is_trusted: boolean
56
63
  }
57
64
 
58
65
  const UNKNOWN_AUTHOR = '(unknown)'
@@ -74,11 +81,17 @@ function parse_issue_fields(json: string): IssueFields | undefined {
74
81
  }
75
82
  }
76
83
 
77
- function to_comment(raw: z.infer<typeof comment_schema>): IssueComment {
84
+ async function to_comment(raw: z.infer<typeof comment_schema>): Promise<IssueComment> {
85
+ const login = raw.user?.login
86
+
78
87
  return {
79
- author: raw.user?.login ?? UNKNOWN_AUTHOR,
88
+ author: login ?? UNKNOWN_AUTHOR,
80
89
  created_at: raw.created_at ?? UNKNOWN_TIME,
81
90
  body: raw.body ?? '',
91
+ is_trusted: await gh_author_association.is_trusted({
92
+ login,
93
+ association: raw.author_association,
94
+ }),
82
95
  }
83
96
  }
84
97
 
@@ -91,18 +104,27 @@ function to_comment(raw: z.infer<typeof comment_schema>): IssueComment {
91
104
  // outcomes it already tells apart; a `JSON.parse` plus `safeParse` pair here would be the clone
92
105
  // `CLAUDE.md` prohibits, on the one endpoint two modules would then parse two ways. All three collapse
93
106
  // to `undefined` here, because the block above draws only one distinction: read, or not read.
94
- function parse_comments(json: string | undefined): ReadonlyArray<IssueComment> | undefined {
107
+ async function parse_comments(
108
+ json: string | undefined,
109
+ ): Promise<ReadonlyArray<IssueComment> | undefined> {
95
110
  if (json === undefined) return undefined
96
111
 
97
112
  const listing = read_json_listing(json, comment_schema)
98
113
 
99
- return listing.kind === 'read' ? listing.rows.map((row) => to_comment(row)) : undefined
114
+ if (listing.kind !== 'read') return undefined
115
+
116
+ return await Promise.all(listing.rows.map(async (row) => await to_comment(row)))
117
+ }
118
+
119
+ // The bodies a caller may act on — the comments of authors with write access, in order.
120
+ function trusted_bodies(comments: ReadonlyArray<IssueComment>): ReadonlyArray<string> {
121
+ return comments.filter((comment) => comment.is_trusted).map((comment) => comment.body)
100
122
  }
101
123
 
102
124
  function format_comment(comment: IssueComment): string {
103
125
  const heading = `${COMMENT_HEADING}${comment.author}${AT}${comment.created_at}`
104
126
 
105
- return `${heading}\n${comment.body}`
127
+ return `${heading}\n${comment.is_trusted ? comment.body : UNTRUSTED_COMMENT}`
106
128
  }
107
129
 
108
130
  function format_comments(comments: ReadonlyArray<IssueComment> | undefined): string {
@@ -133,9 +155,11 @@ const issue_read = {
133
155
  NO_COMMENTS,
134
156
  COMMENTS_UNREADABLE,
135
157
  COMMENT_HEADING,
158
+ UNTRUSTED_COMMENT,
136
159
  format_issue,
137
160
  parse_comments,
138
161
  parse_issue_fields,
162
+ trusted_bodies,
139
163
  }
140
164
 
141
165
  export type { IssueComment, IssueFields }
@@ -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 { git_gh_exec } from '#scripts/gh/git-gh-exec'
5
3
  import { git_gh_issue_list, MAX_SCANNED } from '#scripts/gh/git-gh-issue-list'
@@ -27,7 +25,6 @@ import { session_cite } from './session-cite'
27
25
 
28
26
  const SUCCESS_EXIT_CODE = 0
29
27
  const FAILURE_EXIT_CODE = 1
30
- const ARGV_OFFSET = 2
31
28
  const USAGE = 'Usage: josh issue:release <issue-number> [--wait]'
32
29
  const NONE = 'none'
33
30
  const UNKNOWN_REPO_MESSAGE =
@@ -199,13 +196,6 @@ async function run(argv: ReadonlyArray<string>): Promise<number> {
199
196
  return (await record(request, current)) ? SUCCESS_EXIT_CODE : FAILURE_EXIT_CODE
200
197
  }
201
198
 
202
- // `process.exitCode` rather than `process.exit()`, so the report on standard output drains first.
203
- async function main(argv: ReadonlyArray<string>): Promise<void> {
204
- process.exitCode = await run(argv)
205
- }
206
-
207
199
  const issue_release_cli = { find_open, link, run }
208
200
 
209
- if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
210
-
211
201
  export { issue_release_cli, NONE }