@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,13 @@
1
+ #!/usr/bin/env tsx
2
+ import { fileURLToPath } from 'node:url'
3
+ import { issue_release_cli } from './issue-release-cli'
4
+
5
+ // The `josh issue:release` entry, kept apart from `issue-release-cli.ts` because other modules import
6
+ // that one: a bundle is one file, so a main guard there would fire for every command that carries it
7
+ // (joshuafolkken/kit#4186). `process.exitCode` rather than `process.exit()`, so the report on standard
8
+ // output drains first.
9
+ if (process.argv[1] === fileURLToPath(import.meta.url)) {
10
+ const ARGV_OFFSET = 2
11
+
12
+ process.exitCode = await issue_release_cli.run(process.argv.slice(ARGV_OFFSET))
13
+ }
@@ -1,4 +1,5 @@
1
- import { DEPTH_0_LABEL, RELEASE_LABEL } from './issue-labels'
1
+ import { json_value } from '#scripts/lib/json-value'
2
+ import { RELEASE_LABEL } from './issue-labels'
2
3
 
3
4
  // The decisions behind `josh issue:release`, kept apart from the command
4
5
  // that reads the network so each is a pure answer a test can pin. An Issue whose change reaches a
@@ -20,14 +21,9 @@ function is_listing_row(value: unknown): value is ListingRow {
20
21
  // release Issue at a time; were a person to open a second, the oldest is the one the next release
21
22
  // closes, so it is the one every new blocker joins.
22
23
  function open_release_of(json: string): number | undefined {
23
- try {
24
- const parsed: unknown = JSON.parse(json)
25
- const rows = Array.isArray(parsed) ? parsed.filter((row) => is_listing_row(row)) : []
26
-
27
- return rows.length === 0 ? undefined : Math.min(...rows.map((row) => row.number))
28
- } catch {
29
- return undefined
30
- }
24
+ const rows = (json_value.parse_array(json) ?? []).filter((row) => is_listing_row(row))
25
+
26
+ return rows.length === 0 ? undefined : Math.min(...rows.map((row) => row.number))
31
27
  }
32
28
 
33
29
  function title_of(repo: string): string {
@@ -51,9 +47,8 @@ function body_of(repo: string): string {
51
47
  ].join('\n')
52
48
  }
53
49
 
54
- // The release label and a depth: the subject of a release is what a consumer touches.
55
- // Never `auto-ok`.
56
- const RELEASE_LABELS: ReadonlyArray<string> = [RELEASE_LABEL, DEPTH_0_LABEL]
50
+ // The release label alone — never `auto-ok`.
51
+ const RELEASE_LABELS: ReadonlyArray<string> = [RELEASE_LABEL]
57
52
 
58
53
  const issue_release = { RELEASE_LABELS, open_release_of, title_of, body_of }
59
54
 
@@ -0,0 +1,192 @@
1
+ import { read_pull } from '#scripts/gh/git-gh-pr-read'
2
+ import { git_closes_keyword } from '#scripts/git/git-closes-keyword'
3
+ import { lane_ledger } from '#scripts/lane/lane-ledger'
4
+ import { issue_cite } from './issue-cite'
5
+ import { markdown_section } from './markdown-section'
6
+
7
+ // joshuafolkken/kit#4414: a follow-up measurement waits on samples, not on the calendar — a busy day
8
+ // collects enough merges before a dated start time, a quiet one not even after it. The body names the
9
+ // pull request whose effect it measures and how many merges the lane ledger must record after that
10
+ // pull request merged; the pickup holds the issue until then. The pull request's own merge is not a
11
+ // sample: `run:merge` records it, keyed by the issue it closes, after GitHub stamps `merged_at`.
12
+ //
13
+ // The readers that hold an issue back are synchronous and see only the body, so the one network fact
14
+ // the wait needs — when the pull request merged — is read ahead by `prime`, once per pull request per
15
+ // process, wherever bodies first arrive. A body nobody primed reads as waiting: offering it early is
16
+ // the defect this guards, and the next primed read releases it.
17
+
18
+ const BACKGROUND_HEADING = '## 背景'
19
+ const PREFIX = '- 実施可能条件:'
20
+ const CONDITION_PATTERN = /^#(?<pr>[1-9]\d*) のマージ後 (?<count>[1-9]\d*) マージ$/u
21
+ const VALUE_FORMAT = '#<PR> のマージ後 <K> マージ'
22
+ const DECLARATION = `${PREFIX} ${VALUE_FORMAT}`
23
+ const MALFORMED = `\`${PREFIX}\` must read \`${VALUE_FORMAT}\` with K at least 1`
24
+
25
+ interface Condition {
26
+ pr: number
27
+ count: number
28
+ }
29
+
30
+ type SampleWait =
31
+ | { kind: 'unread'; pr: number }
32
+ | { kind: 'unmerged'; pr: number }
33
+ | { kind: 'short'; pr: number; counted: number; needed: number }
34
+
35
+ // One pull request as read: `merged_at` absent is one found unmerged, read again as it may merge since.
36
+ // `closes` is the issue its body closes, whose ledger merge is the pull request's own.
37
+ interface PullRead {
38
+ merged_at: string | undefined
39
+ closes: number | undefined
40
+ }
41
+
42
+ interface PrimePorts {
43
+ pull: (pr: number) => Promise<PullRead>
44
+ ledger_path: () => Promise<string | undefined>
45
+ }
46
+
47
+ interface LedgerState {
48
+ path: string | undefined
49
+ }
50
+
51
+ // A pull request with no entry was never read.
52
+
53
+ const pull_by_number = new Map<number, PullRead>()
54
+ const ledger: LedgerState = { path: undefined }
55
+
56
+ function declared_value(body: string): string | undefined {
57
+ const background = markdown_section.section_lines(body, BACKGROUND_HEADING).join('\n')
58
+ const line = markdown_section
59
+ .unfenced_lines(background)
60
+ .map((text) => text.trim())
61
+ .find((text) => text.startsWith(PREFIX))
62
+
63
+ return line?.slice(PREFIX.length).trim()
64
+ }
65
+
66
+ // The declared condition, or `undefined` when there is none or it does not parse — a malformed one is
67
+ // refused by `issue:lint`, and holding a hand-edited one forever would lose the issue silently.
68
+ function condition_of(body = ''): Condition | undefined {
69
+ const groups = CONDITION_PATTERN.exec(declared_value(body) ?? '')?.groups
70
+
71
+ if (groups === undefined) return undefined
72
+
73
+ return { pr: Number(groups['pr']), count: Number(groups['count']) }
74
+ }
75
+
76
+ // The number the declared condition cites, or `undefined` when there is none or it does not parse.
77
+ function cited_number(body: string): number | undefined {
78
+ return condition_of(body)?.pr
79
+ }
80
+
81
+ function problems(body: string): ReadonlyArray<string> {
82
+ const value = declared_value(body)
83
+
84
+ return value === undefined || CONDITION_PATTERN.test(value) ? [] : [MALFORMED]
85
+ }
86
+
87
+ async function read_source(pr: number): Promise<PullRead> {
88
+ const pull = await read_pull(pr)
89
+ const closes = git_closes_keyword.parse_closes_issue_number(pull.body ?? undefined)
90
+
91
+ return {
92
+ merged_at: pull.merged_at ?? undefined,
93
+ closes: closes === undefined ? undefined : Number(closes),
94
+ }
95
+ }
96
+
97
+ const DEFAULT_PORTS: PrimePorts = { pull: read_source, ledger_path: lane_ledger.target }
98
+
99
+ // A failed read stays unread, so the next prime asks again.
100
+ async function remember(pr: number, ports: PrimePorts): Promise<void> {
101
+ try {
102
+ pull_by_number.set(pr, await ports.pull(pr))
103
+ } catch {
104
+ pull_by_number.delete(pr)
105
+ }
106
+ }
107
+
108
+ function is_merge_known(pr: number): boolean {
109
+ return pull_by_number.get(pr)?.merged_at !== undefined
110
+ }
111
+
112
+ // Reads ahead what the bodies' conditions need. Nothing is read for bodies that declare none.
113
+ async function prime(
114
+ bodies: ReadonlyArray<string | undefined>,
115
+ ports: PrimePorts = DEFAULT_PORTS,
116
+ ): Promise<void> {
117
+ const unread = bodies
118
+ .map((body) => condition_of(body)?.pr)
119
+ .filter((pr): pr is number => pr !== undefined && !is_merge_known(pr))
120
+
121
+ if (unread.length === 0) return
122
+
123
+ ledger.path = await ports.ledger_path()
124
+ await Promise.all(
125
+ [...new Set(unread)].map(async (pr) => {
126
+ await remember(pr, ports)
127
+ }),
128
+ )
129
+ }
130
+
131
+ function merges_after({ merged_at, closes }: PullRead & { merged_at: string }): number {
132
+ if (ledger.path === undefined) return 0
133
+
134
+ const since = Date.parse(merged_at)
135
+
136
+ return lane_ledger
137
+ .read_entries(ledger.path)
138
+ .filter(
139
+ (entry) =>
140
+ entry.kind === lane_ledger.KIND.MERGE &&
141
+ entry.issue !== closes &&
142
+ Date.parse(entry.at) > since,
143
+ ).length
144
+ }
145
+
146
+ // What the body still waits on, or `undefined` when it declares nothing or has its samples.
147
+ function wait_of(body?: string): SampleWait | undefined {
148
+ const condition = condition_of(body)
149
+
150
+ if (condition === undefined) return undefined
151
+
152
+ const { pr, count } = condition
153
+ const pull = pull_by_number.get(pr)
154
+
155
+ if (pull === undefined) return { kind: 'unread', pr }
156
+
157
+ const { merged_at, closes } = pull
158
+
159
+ if (merged_at === undefined) return { kind: 'unmerged', pr }
160
+
161
+ const counted = merges_after({ merged_at, closes })
162
+
163
+ return counted >= count ? undefined : { kind: 'short', pr, counted, needed: count }
164
+ }
165
+
166
+ // Why the body waits, for a reader that cites the issue itself.
167
+ function reason_of(wait: SampleWait): string {
168
+ const pr = issue_cite.plain(wait.pr)
169
+
170
+ if (wait.kind === 'unread') return `until the merge of ${pr} is read`
171
+ if (wait.kind === 'unmerged') return `until ${pr} merges`
172
+
173
+ return `${String(wait.counted)}/${String(wait.needed)} merges after ${pr}`
174
+ }
175
+
176
+ function reset(): void {
177
+ pull_by_number.clear()
178
+ ledger.path = undefined
179
+ }
180
+
181
+ const issue_sample_gate = {
182
+ DECLARATION,
183
+ cited_number,
184
+ prime,
185
+ problems,
186
+ reason_of,
187
+ reset,
188
+ wait_of,
189
+ }
190
+
191
+ export type { PrimePorts, SampleWait }
192
+ export { issue_sample_gate }
@@ -0,0 +1,76 @@
1
+ import { git_gh_api_path } from '#scripts/gh/git-gh-api-path'
2
+ import { git_gh_exec } from '#scripts/gh/git-gh-exec'
3
+ import { git_gh_issue_rest } from '#scripts/gh/git-gh-issue-rest'
4
+ import { issue_closing_pr } from './issue-closing-pr'
5
+ import { issue_sample_gate } from './issue-sample-gate'
6
+ import { session_cite } from './session-cite'
7
+
8
+ // joshuafolkken/kit#4460: the start condition cites the pull request whose merge it waits on. An issue
9
+ // number passes the format check, then reads as a pull request that is never found, so the issue waits
10
+ // forever. The filing reads what the number names and refuses an issue, citing the merged pull request
11
+ // that closed it when there is one. An unreadable number passes — an outage is no reason to stop.
12
+ //
13
+ // `repo` is the filing's target, `undefined` for this checkout. The closing pull request is looked up
14
+ // only here: `issue_closing_pr` reads this checkout's timeline, so a foreign target gets the plain hint.
15
+
16
+ interface SourcePorts {
17
+ is_pull: (number: number, repo: string | undefined) => Promise<boolean | undefined>
18
+ closing_pr: (issue: number) => Promise<string | undefined>
19
+ }
20
+
21
+ async function read_is_pull(
22
+ number: number,
23
+ repo: string | undefined,
24
+ ): Promise<boolean | undefined> {
25
+ try {
26
+ const json = await git_gh_exec.exec_gh_api({
27
+ path: git_gh_api_path.issue_api_path(String(number), repo),
28
+ })
29
+
30
+ return git_gh_issue_rest.is_pull_request(git_gh_issue_rest.parse_rest_issue(json))
31
+ } catch {
32
+ return undefined
33
+ }
34
+ }
35
+
36
+ // The closing pull request's number, read off the URL `read_closing_pr` answers.
37
+ async function read_closing_pr(issue: number): Promise<string | undefined> {
38
+ const url = await issue_closing_pr.read_closing_pr(String(issue))
39
+
40
+ return url?.slice(url.lastIndexOf('/') + 1)
41
+ }
42
+
43
+ const DEFAULT_PORTS: SourcePorts = { is_pull: read_is_pull, closing_pr: read_closing_pr }
44
+
45
+ async function hint_of(
46
+ issue: number,
47
+ repo: string | undefined,
48
+ ports: SourcePorts,
49
+ ): Promise<string> {
50
+ const closing = repo === undefined ? await ports.closing_pr(issue) : undefined
51
+
52
+ if (closing === undefined) return 'cite the pull request whose merge it waits on'
53
+
54
+ return `cite the pull request that closed it: ${session_cite.issue(closing)}`
55
+ }
56
+
57
+ // The refusal for a condition citing an issue, or `undefined` when it cites a pull request, cites
58
+ // nothing, or cannot be read.
59
+ async function problem(
60
+ body: string,
61
+ repo?: string,
62
+ ports: SourcePorts = DEFAULT_PORTS,
63
+ ): Promise<string | undefined> {
64
+ const number = issue_sample_gate.cited_number(body)
65
+
66
+ if (number === undefined || (await ports.is_pull(number, repo)) !== false) return undefined
67
+ const cited = session_cite.issue(number, undefined, repo)
68
+ const hint = await hint_of(number, repo, ports)
69
+
70
+ return `\`- 実施可能条件:\` cites ${cited}, an issue, not a pull request — ${hint}`
71
+ }
72
+
73
+ const issue_sample_source = { problem }
74
+
75
+ export type { SourcePorts }
76
+ export { issue_sample_source }
@@ -1,6 +1,4 @@
1
- #!/usr/bin/env tsx
2
1
  import { readFile } from 'node:fs/promises'
3
- import { fileURLToPath } from 'node:url'
4
2
  import { epic_audit_logic } from '#scripts/epic/epic-audit'
5
3
  import { epic_bundle, type BacklogIssue, type BundleDecision } from '#scripts/epic/epic-bundle'
6
4
  import { epic_bundle_cli } from '#scripts/epic/epic-bundle-cli'
@@ -34,7 +32,6 @@ const { CLOSED_CEILING_LINE, CLOSED_UNREADABLE_LINE, read_recently_closed, warn_
34
32
 
35
33
  const SUCCESS_EXIT_CODE = 0
36
34
  const FAILURE_EXIT_CODE = 1
37
- const ARGV_OFFSET = 2
38
35
  const SCORE_DIGITS = 2
39
36
  const USAGE = 'Usage: josh issue:scout "<title>" [--body "<draft>" | --body-file <path>]'
40
37
  const UNKNOWN_REPO_MESSAGE =
@@ -103,7 +100,7 @@ function draft_of(args: ScoutArguments, repo: string): BacklogIssue {
103
100
  }
104
101
 
105
102
  // The epic beside a candidate is the placement answer for a draft that cites nothing: the epic half
106
- // below decides from prose references, and a title-only draft has none to give it.
103
+ // below decides from signal references, and a title-only draft has none to give it.
107
104
  function format_duplicate(candidate: DuplicateCandidate): string {
108
105
  const score = candidate.is_referenced === true ? 'ref' : candidate.score.toFixed(SCORE_DIGITS)
109
106
  const epic = candidate.epic === undefined ? '' : ` (epic ${session_cite.issue(candidate.epic)})`
@@ -162,12 +159,13 @@ function format_epic(decision: BundleDecision): Array<string> {
162
159
  return lines
163
160
  }
164
161
 
165
- // A draft cites nothing, so the epic half has nothing to decide from: its two signals are prose
166
- // references and recorded dependencies, and a title carries neither. Saying "file it standalone" there
167
- // reports a scan that found nothing when none was possible — the confident wrong answer the gap
162
+ // A draft cites nothing where a citation counts, so the epic half has nothing to decide from: its two
163
+ // signals are references in the acceptance criteria or the `parent: #N` line and recorded
164
+ // dependencies, and a title or a background mention carries neither. Saying "file it standalone"
165
+ // there reports a scan that found nothing when none was possible — the confident wrong answer the gap
168
166
  // warnings exist to prevent everywhere else in this command.
169
167
  const NO_REFERENCE_LINE =
170
- 'Epic: not asked — no issue number in the summary. Pass --body "…#<N>…", or take the epic printed beside a duplicate above.'
168
+ 'Epic: not asked — no issue number in the summary\'s acceptance criteria or parent line. Pass --body "parent: #<N>", or take the epic printed beside a duplicate above.'
171
169
 
172
170
  // Every placing verdict above asserts that no epic already tracks the draft's relatives, and a cut
173
171
  // epic listing cannot support that: `epic:bundle` withholds them for it,
@@ -195,18 +193,22 @@ function format_epic_decision(
195
193
  return format_epic(decision).join('\n')
196
194
  }
197
195
 
198
- // Whether the summary names an issue at all, read through the same parser the decision itself uses —
199
- // a second reading of "does this body cite anything" could disagree with the one that matters.
200
- function has_reference(draft: BacklogIssue): boolean {
201
- return epic_audit_logic.parse_references(draft.body, draft.repo).length > 0
196
+ // The issue numbers the summary names where `decide_bundle` counts a reference — its acceptance
197
+ // criteria and its `parent: #N` line — read through the same parser the decision itself uses: a
198
+ // second reading of "does this body cite anything" could disagree with the one that matters, and an
199
+ // issue cited only as the background of the filing is not one the draft belongs with.
200
+ function signal_numbers(draft: BacklogIssue): Array<number> {
201
+ return epic_audit_logic
202
+ .signal_references(draft.body, draft.repo)
203
+ .map((reference) => reference.number)
202
204
  }
203
205
 
204
206
  // The open epics the summary names outright. `decide_bundle` excludes an epic from the candidate pool
205
- // — a container is not a sibling — so a draft saying "part of epic #1153", which is the phrasing the
206
- // workflow documents themselves suggest, otherwise reaches `none` and is told to file standalone with
207
- // the epic it named never mentioned.
207
+ // — a container is not a sibling — so a draft whose `parent: #1153` line names the epic, which is the
208
+ // phrasing the workflow documents themselves suggest, otherwise reaches `none` and is told to file
209
+ // standalone with the epic it named never mentioned.
208
210
  function named_epics(draft: BacklogIssue, issues: ReadonlyArray<BacklogIssue>): Array<number> {
209
- const named = new Set(epic_audit_logic.parse_references(draft.body, draft.repo))
211
+ const named = new Set(signal_numbers(draft))
210
212
 
211
213
  return issues
212
214
  .filter((issue) => issue.is_epic === true && named.has(issue.number))
@@ -241,7 +243,7 @@ function format_epic_answer(
241
243
 
242
244
  if (named.length > 0) return format_named_epics(named, decision).join('\n')
243
245
 
244
- return format_epic_decision(decision, has_reference(draft), is_membership_established)
246
+ return format_epic_decision(decision, signal_numbers(draft).length > 0, is_membership_established)
245
247
  }
246
248
 
247
249
  // The closed rows reach the duplicate half only. `decide_bundle` places a draft among issues that
@@ -389,12 +391,6 @@ async function run(argv: ReadonlyArray<string>): Promise<number> {
389
391
  return await report(args, repo)
390
392
  }
391
393
 
392
- // `process.exitCode` rather than `process.exit()`: the answer goes to standard output and a write to
393
- // a pipe is asynchronous on macOS, so exiting can tear the process down before it drains.
394
- async function main(argv: ReadonlyArray<string>): Promise<void> {
395
- process.exitCode = await run(argv)
396
- }
397
-
398
394
  const issue_scout_cli = {
399
395
  USAGE,
400
396
  UNKNOWN_REPO_MESSAGE,
@@ -410,7 +406,5 @@ const issue_scout_cli = {
410
406
  run,
411
407
  }
412
408
 
413
- if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
414
-
415
409
  export type { ScoutArguments, ScoutOutcome }
416
410
  export { issue_scout_cli }
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env tsx
2
+ import { fileURLToPath } from 'node:url'
3
+ import { issue_scout_cli } from './issue-scout-cli'
4
+
5
+ // The `josh issue:scout` entry, kept apart from `issue-scout-cli.ts` because other modules import
6
+ // that one: a bundle is one file, so a main guard there would fire for every command that carries it
7
+ // (joshuafolkken/kit#4186). `process.exitCode` rather than `process.exit()`: the answer goes to
8
+ // standard output and a write to a pipe is asynchronous on macOS, so exiting can tear the process
9
+ // down before it drains.
10
+ if (process.argv[1] === fileURLToPath(import.meta.url)) {
11
+ const ARGV_OFFSET = 2
12
+
13
+ process.exitCode = await issue_scout_cli.run(process.argv.slice(ARGV_OFFSET))
14
+ }
@@ -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 type { IssueReadReason } from '#scripts/gh/git-gh-issue-read'
5
3
  import { issue_number_shape } from '#scripts/issue/issue-number-shape'
@@ -29,7 +27,6 @@ import { issue_state, type IssueState } from './issue-state'
29
27
  // are told apart here and neither is a state.
30
28
 
31
29
  const FAILURE_EXIT_CODE = 1
32
- const ARGV_OFFSET = 2
33
30
  const USAGE = 'Usage: josh issue:state <issue-number> [<issue-number> ...] [--repo <owner/repo>]'
34
31
  // A blank line between the blocks of a multi-number report, so a person sees where one issue ends
35
32
  // while a reader matching `issue: ` still finds each block by its first line.
@@ -172,21 +169,14 @@ async function run(argv: ReadonlyArray<string>): Promise<number> {
172
169
  return issue_report_failures.report_failures(reports, FAILURE_TERMS)
173
170
  }
174
171
 
175
- async function main(argv: ReadonlyArray<string>): Promise<void> {
176
- process.exitCode = await run(argv)
177
- }
178
-
179
172
  const issue_state_cli = {
180
173
  READ_CONCURRENCY,
181
174
  STATE_FIELDS,
182
175
  USAGE,
183
- main,
184
176
  parse_request,
185
177
  read_issue,
186
178
  run,
187
179
  }
188
180
 
189
- if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
190
-
191
181
  export type { StateRead }
192
182
  export { issue_state_cli }
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env tsx
2
+ import { fileURLToPath } from 'node:url'
3
+ import { issue_state_cli } from './issue-state-cli'
4
+
5
+ // The `josh issue:state` entry, kept apart from `issue-state-cli.ts` because other modules import
6
+ // that one: a bundle is one file, so a main guard there would fire for every command that carries it
7
+ // (joshuafolkken/kit#4186).
8
+ if (process.argv[1] === fileURLToPath(import.meta.url)) {
9
+ const ARGV_OFFSET = 2
10
+
11
+ process.exitCode = await issue_state_cli.run(process.argv.slice(ARGV_OFFSET))
12
+ }
@@ -1,9 +1,11 @@
1
+ import { gh_author_association } from '#scripts/gh/gh-author-association'
1
2
  import { read_json_listing } from '#scripts/git/parse-json-array'
2
3
  import { z } from 'zod'
3
4
 
4
- // What a person changed on an issue since a run last read it, as the one pure answer the hook, the
5
- // review attestation, `josh issue:ack` and `josh followup` all print. Kept free of I/O so the four
6
- // callers cannot each draw the line between "a person's update" and "noise" differently.
5
+ // What a person changed on an issue since a run last read it, as the one answer the hook, the review
6
+ // attestation, `josh issue:ack` and `josh followup` all print. Kept in one place so the four callers
7
+ // cannot each draw the line between "a person's update" and "noise" differently; its only I/O is the
8
+ // write-access lookup `gh_author_association` makes for a `MEMBER` / `COLLABORATOR`.
7
9
  //
8
10
  // **A person's update is a body edit or a comment nobody automated.** A bot's comment (`type: Bot`,
9
11
  // or a `[bot]` login) is not one. A run's own comment is posted under the person's own `gh` login,
@@ -12,6 +14,13 @@ import { z } from 'zod'
12
14
  // through a raw `gh api` counts as a person's — the direction that costs one `josh issue:ack`, never a
13
15
  // missed correction.
14
16
  //
17
+ // **Only an author with write access is a person here** (`gh_author_association`). On a public
18
+ // repository anyone can comment, so a comment from anyone else is never handed to a run as an update,
19
+ // and its `RUN_MARKER` is not taken as josh's own. A `MEMBER` / `COLLABORATOR` whose lookup failed
20
+ // (`is_trusted: undefined` — the hook's timeout fired) is neither: their comment is announced with its
21
+ // body withheld, costing one `josh issue:ack` rather than a missed correction, and its marker is not
22
+ // trusted.
23
+ //
15
24
  // **Comment edits are out of scope.** A new comment carries an id above the baseline's; an edited
16
25
  // one keeps its id and is not seen. The body is compared whole, so its edits are.
17
26
 
@@ -21,6 +30,8 @@ const BOT_SUFFIX = '[bot]'
21
30
  const NO_COMMENT_ID = 0
22
31
  const UNKNOWN_AUTHOR = '(unknown)'
23
32
  const UNKNOWN_TIME = '(undated)'
33
+ const UNVERIFIED_BODY =
34
+ "(body withheld — the author's write access could not be checked; read it with `josh issue:read`)"
24
35
 
25
36
  const BODY_HEADING = 'Body edited:'
26
37
  const REMOVED_PREFIX = '- '
@@ -36,11 +47,14 @@ const comment_schema = z.looseObject({
36
47
  user: z.looseObject({ login: z.string(), type: z.string().optional() }).nullish(),
37
48
  created_at: z.string().optional(),
38
49
  body: z.string().nullish(),
50
+ author_association: z.string().nullish(),
39
51
  })
40
52
 
41
53
  interface WatchComment {
42
54
  id: number
43
55
  author: string
56
+ // `undefined` when the write-access lookup failed.
57
+ is_trusted: boolean | undefined
44
58
  is_automated: boolean
45
59
  created_at: string
46
60
  body: string
@@ -60,26 +74,48 @@ function is_bot(user: z.infer<typeof comment_schema>['user']): boolean {
60
74
  return user?.type === BOT_TYPE || (user?.login.endsWith(BOT_SUFFIX) ?? false)
61
75
  }
62
76
 
63
- function is_automated(user: z.infer<typeof comment_schema>['user'], body: string): boolean {
64
- return is_bot(user) || body.includes(RUN_MARKER)
77
+ function is_automated(
78
+ raw: z.infer<typeof comment_schema>,
79
+ is_trusted: boolean | undefined,
80
+ ): boolean {
81
+ return is_bot(raw.user) || (is_trusted === true && (raw.body?.includes(RUN_MARKER) ?? false))
65
82
  }
66
83
 
67
- function to_comment(raw: z.infer<typeof comment_schema>): WatchComment {
68
- const body = raw.body ?? ''
69
- const author = raw.user?.login ?? UNKNOWN_AUTHOR
70
- const created_at = raw.created_at ?? UNKNOWN_TIME
84
+ async function to_comment(
85
+ raw: z.infer<typeof comment_schema>,
86
+ timeout_ms?: number,
87
+ ): Promise<WatchComment> {
88
+ const login = raw.user?.login
89
+ const is_trusted = await gh_author_association.trust_of({
90
+ login,
91
+ association: raw.author_association,
92
+ timeout_ms,
93
+ })
71
94
 
72
- return { id: raw.id, author, is_automated: is_automated(raw.user, body), created_at, body }
95
+ return {
96
+ id: raw.id,
97
+ author: login ?? UNKNOWN_AUTHOR,
98
+ is_trusted,
99
+ is_automated: is_automated(raw, is_trusted),
100
+ created_at: raw.created_at ?? UNKNOWN_TIME,
101
+ body: raw.body ?? '',
102
+ }
73
103
  }
74
104
 
75
105
  // `undefined` — never `[]` — for a listing that could not be read, so a failed read is never taken
76
- // for "nobody commented".
77
- function parse_comments(json: string | undefined): ReadonlyArray<WatchComment> | undefined {
106
+ // for "nobody commented". `timeout_ms` bounds each write-access lookup, which run concurrently, so a
107
+ // hook's read stays inside its own timeout.
108
+ async function parse_comments(
109
+ json: string | undefined,
110
+ timeout_ms?: number,
111
+ ): Promise<ReadonlyArray<WatchComment> | undefined> {
78
112
  if (json === undefined) return undefined
79
113
 
80
114
  const listing = read_json_listing(json, comment_schema)
81
115
 
82
- return listing.kind === 'read' ? listing.rows.map((row) => to_comment(row)) : undefined
116
+ if (listing.kind !== 'read') return undefined
117
+
118
+ return await Promise.all(listing.rows.map(async (row) => await to_comment(row, timeout_ms)))
83
119
  }
84
120
 
85
121
  function last_comment_id(comments: ReadonlyArray<WatchComment>): number {
@@ -118,7 +154,9 @@ function body_section(previous_raw: string, current_raw: string): string | undef
118
154
  }
119
155
 
120
156
  function comment_section(comment: WatchComment): string {
121
- return `${COMMENT_HEADING}${comment.author}${AT}${comment.created_at}${LINE_SEPARATOR}${comment.body}`
157
+ const body = comment.is_trusted === true ? comment.body : UNVERIFIED_BODY
158
+
159
+ return `${COMMENT_HEADING}${comment.author}${AT}${comment.created_at}${LINE_SEPARATOR}${body}`
122
160
  }
123
161
 
124
162
  function new_person_comments(
@@ -126,7 +164,10 @@ function new_person_comments(
126
164
  snapshot: WatchSnapshot,
127
165
  ): ReadonlyArray<WatchComment> {
128
166
  return snapshot.comments.filter(
129
- (comment) => comment.id > baseline.last_comment_id && !comment.is_automated,
167
+ (comment) =>
168
+ comment.id > baseline.last_comment_id &&
169
+ comment.is_trusted !== false &&
170
+ !comment.is_automated,
130
171
  )
131
172
  }
132
173
 
@@ -76,8 +76,9 @@ async function read_snapshot(
76
76
  body: string,
77
77
  etag: string | undefined,
78
78
  ): Promise<Fetched> {
79
- const comments = issue_watch_diff.parse_comments(
79
+ const comments = await issue_watch_diff.parse_comments(
80
80
  await git_gh_issue_read.issue_list_comments(request.issue, request.timeout_ms),
81
+ request.timeout_ms,
81
82
  )
82
83
 
83
84
  return comments === undefined ? UNREADABLE : { kind: 'read', snapshot: { body, comments }, etag }
@@ -1,3 +1,4 @@
1
+ import { json_value } from '#scripts/lib/json-value'
1
2
  import { INTERRUPT_ROUTE_LABEL, SPLIT_ROUTE_LABEL, TIER_A_ROUTE_LABEL } from './issue-labels'
2
3
 
3
4
  // The WIP cap at the call that files. `josh issue:file` reads the count and asks the exemption
@@ -55,13 +56,7 @@ function count_line(count: number, repo: string, verdict: WipVerdict): string {
55
56
  // The listing's JSON is an array of rows; anything else is unreadable rather than zero, because zero
56
57
  // would pass every filing as within the cap.
57
58
  function count_of(json: string): number | undefined {
58
- try {
59
- const parsed: unknown = JSON.parse(json)
60
-
61
- return Array.isArray(parsed) ? parsed.length : undefined
62
- } catch {
63
- return undefined
64
- }
59
+ return json_value.parse_array(json)?.length
65
60
  }
66
61
 
67
62
  const issue_wip = { WIP_CAP, HELD, HELD_MESSAGE, UNREAD_MESSAGE, verdict_of, count_line, count_of }