@joshuafolkken/kit 1.1240.0 → 1.1373.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 (934) hide show
  1. package/.claude/agents/investigator.md +1 -0
  2. package/.claude/settings.json +4 -0
  3. package/.claude/skills/dependency-update/SKILL.md +5 -3
  4. package/.claude/skills/epic-commands/SKILL.md +82 -113
  5. package/.claude/skills/epic-commands/epic-bundle.md +38 -63
  6. package/.claude/skills/epic-commands/execution-waves.md +30 -51
  7. package/.claude/skills/verify-ui/SKILL.md +13 -20
  8. package/.claude/skills/workflow-commands/SKILL.md +10 -10
  9. package/.claude/skills/workflow-commands/background-commands.md +4 -4
  10. package/.claude/skills/workflow-commands/backlogrun-child.md +30 -105
  11. package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +29 -0
  12. package/.claude/skills/workflow-commands/backlogrun-lanes.md +45 -131
  13. package/.claude/skills/workflow-commands/backlogrun-park.md +36 -53
  14. package/.claude/skills/workflow-commands/backlogrun-progress.md +81 -331
  15. package/.claude/skills/workflow-commands/backlogrun-recovery.md +29 -83
  16. package/.claude/skills/workflow-commands/backlogrun-steps.md +105 -424
  17. package/.claude/skills/workflow-commands/backlogrun.md +52 -61
  18. package/.claude/skills/workflow-commands/chain-rule.md +36 -40
  19. package/.claude/skills/workflow-commands/entry-sequence.md +6 -6
  20. package/.claude/skills/workflow-commands/followup.md +19 -20
  21. package/.claude/skills/workflow-commands/fullrun-steps.md +23 -27
  22. package/.claude/skills/workflow-commands/fullrun.md +10 -10
  23. package/.claude/skills/workflow-commands/halfrun.md +9 -8
  24. package/.claude/skills/workflow-commands/into-target.md +12 -18
  25. package/.claude/skills/workflow-commands/issue-comments.md +11 -26
  26. package/.claude/skills/workflow-commands/kickoff.md +26 -16
  27. package/.claude/skills/workflow-commands/latest-gate.md +17 -28
  28. package/.claude/skills/workflow-commands/needs-human-review.md +13 -24
  29. package/.claude/skills/workflow-commands/observation-filing.md +37 -28
  30. package/.claude/skills/workflow-commands/observation-ledger.md +48 -38
  31. package/.claude/skills/workflow-commands/pre-gate-cut.md +9 -9
  32. package/.claude/skills/workflow-commands/prerequisite.md +23 -15
  33. package/.claude/skills/workflow-commands/progress-watcher.md +17 -11
  34. package/.claude/skills/workflow-commands/prrun.md +3 -3
  35. package/.claude/skills/workflow-commands/retrospective.md +13 -18
  36. package/.claude/skills/workflow-commands/split-assessment.md +6 -4
  37. package/.claude/skills/workflow-commands/target-repository.md +25 -28
  38. package/.claude/skills/workflow-commands/working-tree-hold.md +11 -17
  39. package/.gitattributes +2 -1
  40. package/.github/workflows/ci.yml +14 -0
  41. package/.vscode/tasks.json +14 -0
  42. package/CLAUDE.md +10 -61
  43. package/README.md +23 -66
  44. package/SECURITY.md +1 -1
  45. package/dist/CLAUDE.md +10 -61
  46. package/dist/commands/document-section-cli.js +43 -11
  47. package/dist/config-merge/index.js +11 -2
  48. package/dist/hooks/audit-provision.js +2 -2
  49. package/dist/hooks/batch-guard.js +7 -7
  50. package/dist/hooks/{chunk-KHGB5S3Y.js → chunk-7UBFU3CL.js} +18 -20
  51. package/dist/hooks/{chunk-ZQGD4GBY.js → chunk-7WKYHEGU.js} +8 -44
  52. package/dist/hooks/{chunk-4TZVB44A.js → chunk-AKGCP4LX.js} +285 -363
  53. package/dist/hooks/{chunk-QVSWU24O.js → chunk-BZMPVFDY.js} +7 -5
  54. package/dist/hooks/{chunk-5VNDSNG3.js → chunk-FZ6FUSBM.js} +1 -1
  55. package/dist/hooks/{chunk-GPTFMK5E.js → chunk-GG72ANKI.js} +1 -1
  56. package/dist/hooks/{chunk-XZYKEM6J.js → chunk-JCRDBQXB.js} +13 -11
  57. package/dist/hooks/{chunk-F3ELQ2AF.js → chunk-JGW24KKM.js} +4 -4
  58. package/dist/hooks/{chunk-ELCN5LCH.js → chunk-NEC4AT4Z.js} +34 -12
  59. package/dist/hooks/chunk-NZN2UFI6.js +2409 -0
  60. package/dist/hooks/{chunk-WK2XSHSI.js → chunk-SLSFIWTX.js} +550 -875
  61. package/dist/hooks/chunk-UTHMB4O2.js +1590 -0
  62. package/dist/hooks/{chunk-KRBERBBI.js → chunk-V4TKZHER.js} +4 -4
  63. package/dist/hooks/chunk-YLBBSSTF.js +3705 -0
  64. package/dist/hooks/chunk-Z5TMJIPW.js +45 -0
  65. package/dist/hooks/codex-hook-adapter.js +26 -21
  66. package/dist/hooks/duplicate-read-guard.js +8 -8
  67. package/dist/hooks/format-edited.js +4 -4
  68. package/dist/hooks/inputs.json +195 -181
  69. package/dist/hooks/investigation-guard.js +8 -8
  70. package/dist/hooks/pretool-guard.js +15 -15
  71. package/dist/hooks/session-lang.js +406 -8
  72. package/dist/hooks/stop-guard.js +122 -187
  73. package/dist/josh.js +282 -95
  74. package/dist/version/index.js +15 -13
  75. package/eslint/base.js +43 -5
  76. package/eslint/rules/english-only-prose.js +3 -3
  77. package/eslint/rules/import.js +12 -0
  78. package/eslint/rules/namespace-object-export.js +2 -2
  79. package/package.json +17 -11
  80. package/pnpm-workspace.yaml +2 -4
  81. package/prompts/coding-standards.md +14 -48
  82. package/prompts/collaboration-workflow/file-edits.md +1 -1
  83. package/prompts/collaboration-workflow/issue-citation.md +1 -1
  84. package/prompts/collaboration-workflow/issue-template.md +3 -10
  85. package/prompts/collaboration-workflow/operating-rules.md +7 -8
  86. package/prompts/collaboration-workflow/output-bounds.md +1 -1
  87. package/prompts/collaboration-workflow/overview.md +1 -1
  88. package/prompts/collaboration-workflow/plan-comment.md +2 -1
  89. package/prompts/collaboration-workflow/principles.md +21 -3
  90. package/prompts/collaboration-workflow/report-format.md +16 -29
  91. package/prompts/collaboration-workflow/residency.md +1 -1
  92. package/prompts/collaboration-workflow/rule-delivery.md +7 -95
  93. package/prompts/collaboration-workflow/shell-body.md +3 -23
  94. package/prompts/collaboration-workflow/turn-batching.md +4 -13
  95. package/prompts/collaboration-workflow/wip-cap.md +5 -11
  96. package/prompts/refactoring.md +1 -1
  97. package/prompts/review-rubric.md +3 -22
  98. package/prompts/review.md +15 -38
  99. package/prompts/testing-guide.md +2 -4
  100. package/scripts/adopt/adopt-logic.ts +5 -5
  101. package/scripts/adopt/adopt-toolkits.ts +4 -5
  102. package/scripts/adopt/adopt.ts +2 -3
  103. package/scripts/agent/agent-argv.ts +7 -7
  104. package/scripts/agent/agent-diagnostics.ts +2 -2
  105. package/scripts/agent/agent-exit-record.ts +1 -1
  106. package/scripts/agent/agent-headless.ts +1 -1
  107. package/scripts/agent/agent-launch-environment.ts +6 -1
  108. package/scripts/agent/agent-role-profile.ts +49 -22
  109. package/scripts/agent/agent-session-role.ts +32 -0
  110. package/scripts/agent/api-outage.ts +1 -1
  111. package/scripts/agent/claude-agent-argv.ts +4 -4
  112. package/scripts/agent/claude-result-event.ts +4 -4
  113. package/scripts/agent/codex-hooks.ts +2 -2
  114. package/scripts/agent/interactive-ask.ts +3 -6
  115. package/scripts/auto-ok/auto-ok-cli.ts +46 -60
  116. package/scripts/backlog/backlog-arrival-added.ts +34 -0
  117. package/scripts/backlog/backlog-arrival.ts +54 -17
  118. package/scripts/backlog/backlog-budget-cli.ts +34 -6
  119. package/scripts/backlog/backlog-budget.ts +17 -24
  120. package/scripts/backlog/backlog-defect-priority.ts +1 -1
  121. package/scripts/backlog/backlog-drive-args.ts +5 -4
  122. package/scripts/backlog/backlog-drive-cli.ts +14 -10
  123. package/scripts/backlog/backlog-drive-epic.ts +85 -0
  124. package/scripts/backlog/backlog-drive-launch.ts +1 -1
  125. package/scripts/backlog/backlog-drive-named-offer.ts +60 -9
  126. package/scripts/backlog/backlog-drive-named.ts +39 -9
  127. package/scripts/backlog/backlog-drive-offer-argv.ts +1 -1
  128. package/scripts/backlog/backlog-drive-restore.ts +1 -1
  129. package/scripts/backlog/backlog-drive-retrospective.ts +2 -2
  130. package/scripts/backlog/backlog-drive.ts +43 -28
  131. package/scripts/backlog/backlog-idle.ts +88 -0
  132. package/scripts/backlog/backlog-named.ts +11 -15
  133. package/scripts/backlog/backlog-next.ts +26 -30
  134. package/scripts/backlog/backlog-offer-cli.ts +28 -23
  135. package/scripts/backlog/backlog-offer.ts +7 -7
  136. package/scripts/backlog/backlog-overlap.ts +178 -0
  137. package/scripts/backlog/backlog-plan-cli.ts +14 -90
  138. package/scripts/backlog/backlog-plan-read.ts +111 -0
  139. package/scripts/backlog/backlog-plan.ts +11 -10
  140. package/scripts/backlog/backlog-pool.ts +13 -14
  141. package/scripts/backlog/backlog-rank.ts +11 -11
  142. package/scripts/backlog/backlog-ready.ts +15 -10
  143. package/scripts/backlog/backlog-scope.ts +14 -15
  144. package/scripts/backlog/backlog-stalled-cli.ts +2 -2
  145. package/scripts/backlog/backlog-stalled-detect.ts +4 -4
  146. package/scripts/backlog/backlog-stalled.ts +5 -6
  147. package/scripts/backlog/backlog-waves.ts +4 -4
  148. package/scripts/backlog/backlogrun-args.ts +74 -0
  149. package/scripts/backlog/backlogrun-cli.ts +113 -0
  150. package/scripts/backlog/backlogrun-launch.ts +178 -0
  151. package/scripts/behavior/behavior-assertion.ts +6 -8
  152. package/scripts/behavior/behavior-cli.ts +1 -1
  153. package/scripts/behavior/behavior-rules.ts +3 -3
  154. package/scripts/build/build-claude-md.ts +4 -4
  155. package/scripts/build/build-codex-hooks.ts +2 -2
  156. package/scripts/build/build-commands.ts +1 -1
  157. package/scripts/build/build-hooks.ts +5 -5
  158. package/scripts/build/build.ts +1 -1
  159. package/scripts/build/hook-bundle-stamp.ts +109 -7
  160. package/scripts/build/local-bin.ts +2 -2
  161. package/scripts/cases/cases-cli.ts +1 -1
  162. package/scripts/cases/cases-logic.ts +2 -2
  163. package/scripts/ci/composite-actions.ts +1 -2
  164. package/scripts/ci/pr-classification.ts +2 -2
  165. package/scripts/claude/workflow-destination.ts +1 -1
  166. package/scripts/clone/clone-aggregate.ts +1 -1
  167. package/scripts/clone/clone-fingerprint.ts +1 -1
  168. package/scripts/clone/clone-scan-cli.ts +1 -1
  169. package/scripts/clone/clone-scan.ts +1 -1
  170. package/scripts/config-merge/index.ts +1 -1
  171. package/scripts/config-merge/json-format.ts +1 -3
  172. package/scripts/config-merge/patch-json-array.ts +90 -0
  173. package/scripts/config-merge/patch-json-key.ts +6 -3
  174. package/scripts/config-merge/patch-json-list.ts +1 -1
  175. package/scripts/cost-runtime/codex-usage.ts +1 -1
  176. package/scripts/cost-runtime/context-cut-payback.ts +4 -5
  177. package/scripts/cost-runtime/context-cut-threshold.ts +4 -6
  178. package/scripts/cost-runtime/cost-attribute.ts +3 -3
  179. package/scripts/cost-runtime/cost-blocks.ts +3 -4
  180. package/scripts/cost-runtime/cost-cli.ts +14 -11
  181. package/scripts/cost-runtime/cost-corpus.ts +11 -11
  182. package/scripts/cost-runtime/cost-pricing.ts +4 -4
  183. package/scripts/cost-runtime/cost-tokens.ts +1 -2
  184. package/scripts/cost-runtime/cost-transcript.ts +29 -29
  185. package/scripts/cost-runtime/cost-usage.ts +6 -7
  186. package/scripts/cost-runtime/cost-verdict.ts +10 -11
  187. package/scripts/cost-runtime/own-session.ts +1 -1
  188. package/scripts/cost-runtime/transcript-cwd.ts +2 -2
  189. package/scripts/delegation/delegation-cli.ts +4 -4
  190. package/scripts/delegation/delegation-policy.ts +13 -15
  191. package/scripts/delegation/duplicate-read-guard.ts +9 -10
  192. package/scripts/delegation/fanout-cli.ts +1 -1
  193. package/scripts/delegation/fanout.ts +1 -1
  194. package/scripts/delegation/investigation-guard.ts +18 -22
  195. package/scripts/delegation/investigation-reads.ts +48 -238
  196. package/scripts/discovery/repo-discovery.ts +1 -1
  197. package/scripts/discovery/repo-map-logic.ts +1 -2
  198. package/scripts/discovery/repo-origin.ts +3 -3
  199. package/scripts/discovery/repo-party-cli.ts +2 -2
  200. package/scripts/discovery/repo-party.ts +2 -2
  201. package/scripts/doctor/doctor-consumer.ts +1 -1
  202. package/scripts/doctor/doctor-io.ts +6 -7
  203. package/scripts/doctor/doctor-logic.ts +1 -1
  204. package/scripts/doctor/doctor-ports.ts +1 -1
  205. package/scripts/doctor/doctor.ts +8 -9
  206. package/scripts/document/backlogrun-parent-read-set.ts +5 -6
  207. package/scripts/document/bash-output-cap.ts +5 -7
  208. package/scripts/document/capped-print-part.ts +1 -1
  209. package/scripts/document/capped-print.ts +1 -1
  210. package/scripts/document/document-byte-budget.ts +33 -64
  211. package/scripts/document/document-byte-check.ts +4 -4
  212. package/scripts/document/document-reachability.ts +7 -8
  213. package/scripts/document/document-read-cli.ts +2 -2
  214. package/scripts/document/document-scan.ts +30 -5
  215. package/scripts/document/document-section-cli.ts +6 -8
  216. package/scripts/document/document-section.ts +8 -12
  217. package/scripts/document/edit-files-cli.ts +3 -4
  218. package/scripts/document/entry-read-budget.ts +8 -70
  219. package/scripts/document/entry-read-set.ts +51 -34
  220. package/scripts/document/lane-child-read-set.ts +9 -9
  221. package/scripts/document/read-files-cli.ts +1 -2
  222. package/scripts/document/read-set-cli.ts +16 -19
  223. package/scripts/document/read-set-cost.ts +4 -4
  224. package/scripts/document/read-set-point-of-use.ts +28 -38
  225. package/scripts/document/read-set-pricing.ts +1 -1
  226. package/scripts/document/read-set-trim.ts +3 -3
  227. package/scripts/document/resident-budget.ts +8 -10
  228. package/scripts/epic/epic-add-body.ts +15 -18
  229. package/scripts/epic/epic-add-plan.ts +26 -28
  230. package/scripts/epic/epic-add.ts +32 -25
  231. package/scripts/epic/epic-audit-checks.ts +27 -37
  232. package/scripts/epic/epic-audit-cli.ts +21 -22
  233. package/scripts/epic/epic-audit-orphans.ts +16 -17
  234. package/scripts/epic/epic-audit-rationale.ts +10 -15
  235. package/scripts/epic/epic-audit-report.ts +2 -5
  236. package/scripts/epic/epic-audit.ts +18 -14
  237. package/scripts/epic/epic-body.ts +10 -10
  238. package/scripts/epic/epic-bundle-cli.ts +36 -34
  239. package/scripts/epic/epic-bundle-evidence.ts +5 -5
  240. package/scripts/epic/epic-bundle-gaps.ts +6 -9
  241. package/scripts/epic/epic-bundle-poll.ts +1 -1
  242. package/scripts/epic/epic-bundle-referenced.ts +11 -14
  243. package/scripts/epic/epic-bundle.ts +19 -20
  244. package/scripts/epic/epic-busy.ts +44 -21
  245. package/scripts/epic/epic-candidate-confirm.ts +15 -18
  246. package/scripts/epic/epic-chains.ts +18 -23
  247. package/scripts/epic/epic-classify.ts +11 -12
  248. package/scripts/epic/epic-cli-argv.ts +5 -6
  249. package/scripts/epic/epic-cli-remove.ts +9 -4
  250. package/scripts/epic/epic-cli.ts +38 -26
  251. package/scripts/epic/epic-close-comment.ts +14 -15
  252. package/scripts/epic/epic-close.ts +25 -29
  253. package/scripts/epic/epic-cross-repo.ts +18 -21
  254. package/scripts/epic/epic-decision.ts +14 -18
  255. package/scripts/epic/epic-fetch.ts +25 -31
  256. package/scripts/epic/epic-graph.ts +15 -17
  257. package/scripts/epic/epic-index.ts +14 -16
  258. package/scripts/epic/epic-issue.ts +9 -11
  259. package/scripts/epic/epic-label-age.ts +74 -0
  260. package/scripts/epic/epic-lane-offer.ts +35 -24
  261. package/scripts/epic/epic-nested.ts +1 -1
  262. package/scripts/epic/epic-next-read.ts +8 -8
  263. package/scripts/epic/epic-next-views.ts +12 -12
  264. package/scripts/epic/epic-next.ts +29 -33
  265. package/scripts/epic/epic-outside-blocker.ts +11 -10
  266. package/scripts/epic/epic-parse.ts +22 -24
  267. package/scripts/epic/epic-promote.ts +3 -2
  268. package/scripts/epic/epic-rank.ts +1 -1
  269. package/scripts/epic/epic-read.ts +10 -8
  270. package/scripts/epic/epic-reconcile.ts +8 -6
  271. package/scripts/epic/epic-reference.ts +5 -4
  272. package/scripts/epic/epic-relation-recheck.ts +10 -11
  273. package/scripts/epic/epic-relations.ts +9 -8
  274. package/scripts/epic/epic-remove-plan.ts +4 -5
  275. package/scripts/epic/epic-remove.ts +7 -5
  276. package/scripts/epic/epic-report.ts +18 -20
  277. package/scripts/epic/epic-run.ts +6 -5
  278. package/scripts/epic/epic-sections.ts +2 -2
  279. package/scripts/epic/epic-shape.ts +3 -3
  280. package/scripts/epic/epic-solo-stale.ts +3 -2
  281. package/scripts/epic/epic-solo.ts +8 -8
  282. package/scripts/epic/epic-triage.ts +5 -4
  283. package/scripts/epic/epic-validate.ts +8 -7
  284. package/scripts/epic/epic.ts +5 -5
  285. package/scripts/exports/unused-members-cli.ts +1 -1
  286. package/scripts/followup/followup-issue-number.ts +1 -2
  287. package/scripts/followup/git-followup-cleanup.ts +6 -7
  288. package/scripts/followup/git-followup-finish.ts +11 -13
  289. package/scripts/followup/git-followup-flush.ts +11 -7
  290. package/scripts/followup/git-followup-issue-close.ts +16 -13
  291. package/scripts/followup/git-followup-label.ts +9 -6
  292. package/scripts/followup/git-followup-merged.ts +1 -1
  293. package/scripts/followup/git-followup-pending.ts +7 -9
  294. package/scripts/followup/git-followup-stages.ts +28 -17
  295. package/scripts/followup/git-followup-workflow.ts +19 -21
  296. package/scripts/followup/git-pr-followup-checks.ts +13 -20
  297. package/scripts/followup/git-pr-followup-wrapup.ts +7 -7
  298. package/scripts/followup/git-pr-followup.ts +18 -17
  299. package/scripts/gate/core-admission.ts +2 -2
  300. package/scripts/gate/core-budget.ts +15 -26
  301. package/scripts/gate/gate-ledger.ts +114 -0
  302. package/scripts/gate/gate-log.ts +7 -9
  303. package/scripts/gate/gate-plan.ts +70 -35
  304. package/scripts/gate/gate-report.ts +14 -15
  305. package/scripts/gate/gate-skip.ts +11 -13
  306. package/scripts/gate/gate-steps.ts +5 -1
  307. package/scripts/gate/gate-tree.ts +3 -4
  308. package/scripts/gate/hook-gate-reuse.ts +9 -9
  309. package/scripts/gate/machine-capacity.ts +168 -30
  310. package/scripts/gate/pre-commit-type-check.ts +4 -4
  311. package/scripts/gate/project-checks.ts +12 -4
  312. package/scripts/gate/scoped-green.ts +11 -18
  313. package/scripts/gate/type-check-command.ts +2 -2
  314. package/scripts/gate/type-check-step.ts +4 -4
  315. package/scripts/gate/verification-gate.ts +53 -51
  316. package/scripts/gh/gh-spawn.ts +2 -2
  317. package/scripts/gh/git-ai-review-scan.ts +3 -2
  318. package/scripts/gh/git-gh-api-path.ts +10 -11
  319. package/scripts/gh/git-gh-exec.ts +43 -48
  320. package/scripts/gh/git-gh-failure.ts +6 -9
  321. package/scripts/gh/git-gh-helpers.ts +1 -1
  322. package/scripts/gh/git-gh-issue-list.ts +15 -19
  323. package/scripts/gh/git-gh-issue-read.ts +43 -60
  324. package/scripts/gh/git-gh-issue-rest.ts +14 -15
  325. package/scripts/gh/git-gh-issue-write.ts +52 -40
  326. package/scripts/gh/git-gh-issue.ts +23 -24
  327. package/scripts/gh/git-gh-pr-auto-merge.ts +3 -3
  328. package/scripts/gh/git-gh-pr-read.ts +46 -50
  329. package/scripts/gh/git-gh-pr-rest.ts +23 -26
  330. package/scripts/gh/git-gh-pr-review.ts +2 -2
  331. package/scripts/gh/git-gh-pr-rollup.ts +4 -4
  332. package/scripts/gh/git-gh-pr-snapshot.ts +8 -10
  333. package/scripts/gh/git-gh-pr.ts +16 -16
  334. package/scripts/gh/git-gh-reachability.ts +11 -12
  335. package/scripts/gh/git-gh-repo.ts +2 -3
  336. package/scripts/gh/git-gh-rest-state.ts +1 -1
  337. package/scripts/gh/git-pr-ai-review.ts +6 -5
  338. package/scripts/gh/git-pr-checks-eval.ts +28 -30
  339. package/scripts/gh/git-pr-checks-parse.ts +14 -16
  340. package/scripts/gh/git-pr-checks-watch.ts +17 -17
  341. package/scripts/gh/git-pr-checks.ts +20 -23
  342. package/scripts/gh/git-pr-coderabbit.ts +8 -6
  343. package/scripts/gh/git-pr-confirmation.ts +5 -5
  344. package/scripts/gh/git-pr-managed-config.ts +7 -9
  345. package/scripts/gh/git-pr-messages.ts +1 -1
  346. package/scripts/gh/git-pr.ts +15 -16
  347. package/scripts/gh/github-issue-url.ts +8 -9
  348. package/scripts/git/base-tree.ts +66 -0
  349. package/scripts/git/change-base.ts +42 -2
  350. package/scripts/git/changed-file-scope.ts +5 -5
  351. package/scripts/git/changed-paths.ts +1 -2
  352. package/scripts/git/constants.ts +2 -2
  353. package/scripts/git/git-branch.ts +1 -1
  354. package/scripts/git/git-closes-keyword.ts +3 -3
  355. package/scripts/git/git-command.ts +53 -41
  356. package/scripts/git/git-common-directory.ts +3 -3
  357. package/scripts/git/git-diff-reads.ts +14 -15
  358. package/scripts/git/git-error.ts +1 -1
  359. package/scripts/git/git-execa-error.ts +1 -2
  360. package/scripts/git/git-issue.ts +10 -8
  361. package/scripts/git/git-location-environment.ts +3 -4
  362. package/scripts/git/git-ls-remote.ts +6 -8
  363. package/scripts/git/git-pre-push-hook.ts +11 -10
  364. package/scripts/git/git-preflight.ts +5 -5
  365. package/scripts/git/git-push-transport.ts +2 -2
  366. package/scripts/git/git-remote-branch.ts +1 -2
  367. package/scripts/git/git-schemas.ts +16 -23
  368. package/scripts/git/git-spawn-sync.ts +1 -1
  369. package/scripts/git/git-spawn.ts +37 -14
  370. package/scripts/git/git-ssh-keepalive.ts +12 -5
  371. package/scripts/git/git-staging.ts +7 -8
  372. package/scripts/git/git-workflow.ts +1 -1
  373. package/scripts/git/git-worktree.ts +35 -27
  374. package/scripts/git/gone-branch.ts +2 -2
  375. package/scripts/git/listing-cutoff.ts +1 -2
  376. package/scripts/git/lockfile-sync.ts +65 -0
  377. package/scripts/git/main-merge-guard.ts +1 -2
  378. package/scripts/git/main-merge.ts +7 -7
  379. package/scripts/git/main-sync.ts +23 -8
  380. package/scripts/git/parse-json-array.ts +18 -23
  381. package/scripts/git/repository-lock.ts +34 -2
  382. package/scripts/git/stash/git-stash.ts +4 -5
  383. package/scripts/git/stash/stash-orphans.ts +5 -3
  384. package/scripts/git/stash/stash-pop-args.ts +1 -1
  385. package/scripts/git/stash/stash-pop-cli.ts +3 -3
  386. package/scripts/git/stash/stash-sweep-lock.ts +2 -2
  387. package/scripts/hooks/batch-guard.ts +11 -13
  388. package/scripts/hooks/check-commit-message.ts +12 -9
  389. package/scripts/hooks/codex-hook-adapter.ts +16 -10
  390. package/scripts/hooks/edited-cspell.ts +3 -4
  391. package/scripts/hooks/format-edited-cli.ts +1 -1
  392. package/scripts/hooks/format-edited-file.ts +11 -17
  393. package/scripts/hooks/format-rewrite-notice.ts +19 -17
  394. package/scripts/hooks/pre-push-unit.ts +10 -14
  395. package/scripts/hooks/pretool-guard-cli.ts +4 -4
  396. package/scripts/hooks/pretool-guard.ts +93 -18
  397. package/scripts/hooks/reserved-run.ts +2 -2
  398. package/scripts/hooks/step-zero-notice.ts +1 -1
  399. package/scripts/hooks/stop-guard.ts +21 -10
  400. package/scripts/init/basic-path-migration.ts +2 -2
  401. package/scripts/init/claude-kit-only-settings.ts +2 -2
  402. package/scripts/init/claude-plugin-config.ts +2 -2
  403. package/scripts/init/distributed-paths.ts +4 -4
  404. package/scripts/init/hook-command-rewrite.ts +3 -3
  405. package/scripts/init/hook-launch.ts +5 -5
  406. package/scripts/init/init-actions.ts +13 -0
  407. package/scripts/init/init-ai-copy.ts +11 -11
  408. package/scripts/init/init-bootstrap.ts +3 -3
  409. package/scripts/init/init-copy-content.ts +4 -4
  410. package/scripts/init/init-logic-json-merge.ts +7 -9
  411. package/scripts/init/init-logic-migrate.ts +1 -1
  412. package/scripts/init/init-logic-templates.ts +1 -1
  413. package/scripts/init/init-logic-workspace.ts +4 -4
  414. package/scripts/init/init-logic-yaml-merge.ts +2 -2
  415. package/scripts/init/init-logic.ts +19 -22
  416. package/scripts/init/init.ts +7 -7
  417. package/scripts/init/kit-base-preset.ts +1 -1
  418. package/scripts/init/kit-setup-state.ts +1 -1
  419. package/scripts/init/kit-written-paths.ts +1 -2
  420. package/scripts/init/package-manager-pin.ts +1 -1
  421. package/scripts/init/project-profile-cli.ts +1 -1
  422. package/scripts/init/project-profile.ts +3 -3
  423. package/scripts/init/session-language-environment.ts +1 -1
  424. package/scripts/init/start-exec.ts +3 -4
  425. package/scripts/init/start-plan.ts +2 -2
  426. package/scripts/init/start-setup-pr.ts +3 -2
  427. package/scripts/init/start-steps.ts +2 -2
  428. package/scripts/init/tsconfig-preset-migration.ts +1 -1
  429. package/scripts/init/vscode-tasks.ts +62 -0
  430. package/scripts/issue/baseline-measure.ts +2 -2
  431. package/scripts/issue/behavior-change-lint.ts +2 -2
  432. package/scripts/issue/defect-rate-cli.ts +6 -7
  433. package/scripts/issue/defect-rate.ts +37 -27
  434. package/scripts/issue/git-next-issues.ts +9 -8
  435. package/scripts/issue/issue-auto-ok.ts +24 -11
  436. package/scripts/issue/issue-backlinks-cli.ts +5 -5
  437. package/scripts/issue/issue-backlinks.ts +6 -6
  438. package/scripts/issue/issue-cite-cli.ts +20 -18
  439. package/scripts/issue/issue-cite.ts +18 -8
  440. package/scripts/issue/issue-closing-pr.ts +4 -4
  441. package/scripts/issue/issue-comment-cli.ts +6 -4
  442. package/scripts/issue/issue-file-cli.ts +52 -15
  443. package/scripts/issue/issue-file-fold.ts +155 -0
  444. package/scripts/issue/issue-file.ts +9 -6
  445. package/scripts/issue/issue-fold-cli.ts +14 -9
  446. package/scripts/issue/issue-fold.ts +23 -8
  447. package/scripts/issue/issue-labels.ts +34 -38
  448. package/scripts/issue/issue-lint-cli.ts +2 -2
  449. package/scripts/issue/issue-lint.ts +1 -1
  450. package/scripts/issue/issue-merged.ts +10 -4
  451. package/scripts/issue/issue-number-shape.ts +27 -0
  452. package/scripts/issue/issue-rank.ts +1 -1
  453. package/scripts/issue/issue-read-cli.ts +4 -5
  454. package/scripts/issue/issue-read.ts +4 -5
  455. package/scripts/issue/issue-reference.ts +5 -5
  456. package/scripts/issue/issue-release-cli.ts +17 -7
  457. package/scripts/issue/issue-release.ts +3 -3
  458. package/scripts/issue/issue-report-failures.ts +7 -4
  459. package/scripts/issue/issue-scout-cli.ts +11 -11
  460. package/scripts/issue/issue-scout-closed.ts +4 -4
  461. package/scripts/issue/issue-scout.ts +4 -5
  462. package/scripts/issue/issue-state-cli.ts +17 -10
  463. package/scripts/issue/issue-state.ts +12 -13
  464. package/scripts/issue/issue-wip.ts +7 -7
  465. package/scripts/issue/markdown-section.ts +3 -3
  466. package/scripts/issue/measure-rerun-cli.ts +10 -9
  467. package/scripts/issue/reproduction-measure.ts +3 -3
  468. package/scripts/issue/session-cite.ts +56 -0
  469. package/scripts/josh/agent-session-environment.ts +10 -8
  470. package/scripts/josh/cli-body.ts +2 -2
  471. package/scripts/josh/command-suggest.ts +1 -1
  472. package/scripts/josh/file-map-stamp.ts +20 -23
  473. package/scripts/josh/hook-decision.ts +24 -28
  474. package/scripts/josh/josh-command-map.ts +4 -1
  475. package/scripts/josh/josh-command-types.ts +30 -35
  476. package/scripts/josh/josh-commands-ai.ts +6 -6
  477. package/scripts/josh/josh-commands-backlog.ts +15 -3
  478. package/scripts/josh/josh-commands-clone.ts +1 -1
  479. package/scripts/josh/josh-commands-development.ts +25 -4
  480. package/scripts/josh/josh-commands-document.ts +3 -3
  481. package/scripts/josh/josh-commands-guard.ts +3 -3
  482. package/scripts/josh/josh-commands-issue.ts +4 -5
  483. package/scripts/josh/josh-commands-lane.ts +14 -4
  484. package/scripts/josh/josh-commands-lint.ts +1 -1
  485. package/scripts/josh/josh-commands-run.ts +21 -7
  486. package/scripts/josh/josh-commands-split.ts +1 -2
  487. package/scripts/josh/josh-commands-versioning.ts +5 -5
  488. package/scripts/josh/josh-commands-workflow.ts +30 -22
  489. package/scripts/josh/josh-environment-file.ts +1 -1
  490. package/scripts/josh/josh-in-process.ts +3 -3
  491. package/scripts/josh/josh-logic.ts +6 -7
  492. package/scripts/josh/josh-run.ts +3 -3
  493. package/scripts/josh/josh-verdict.ts +9 -12
  494. package/scripts/josh/josh.ts +3 -3
  495. package/scripts/josh/kit-only.ts +2 -2
  496. package/scripts/josh/path-decision.ts +3 -3
  497. package/scripts/josh/platform-temporary.ts +7 -5
  498. package/scripts/josh/process-identity.ts +24 -6
  499. package/scripts/josh/process-owner.ts +4 -4
  500. package/scripts/josh/session-language-cli.ts +53 -11
  501. package/scripts/josh/session-language.ts +1 -1
  502. package/scripts/josh/stamp-file.ts +48 -29
  503. package/scripts/josh/stamp-record.ts +57 -0
  504. package/scripts/lane/lane-await.ts +35 -11
  505. package/scripts/lane/lane-cache.ts +6 -6
  506. package/scripts/lane/lane-capacity.ts +32 -17
  507. package/scripts/lane/lane-child-invocation.ts +17 -15
  508. package/scripts/lane/lane-child-marker.ts +12 -12
  509. package/scripts/lane/lane-cli.ts +12 -13
  510. package/scripts/lane/lane-close.ts +6 -6
  511. package/scripts/lane/lane-dispatch.ts +61 -72
  512. package/scripts/lane/lane-environment.ts +5 -5
  513. package/scripts/lane/lane-guard-policy.ts +7 -21
  514. package/scripts/lane/lane-handoff.ts +2 -2
  515. package/scripts/lane/lane-install.ts +9 -10
  516. package/scripts/lane/lane-launch-cli.ts +13 -8
  517. package/scripts/lane/lane-ledger.ts +73 -11
  518. package/scripts/lane/lane-leftover.ts +2 -2
  519. package/scripts/lane/lane-limit-cli.ts +160 -0
  520. package/scripts/lane/lane-limit-override.ts +74 -0
  521. package/scripts/lane/lane-load.ts +19 -68
  522. package/scripts/lane/lane-measure-cli.ts +15 -25
  523. package/scripts/lane/lane-occupancy.ts +6 -4
  524. package/scripts/lane/lane-open.ts +20 -19
  525. package/scripts/lane/lane-output.ts +4 -3
  526. package/scripts/lane/lane-paths.ts +12 -11
  527. package/scripts/lane/lane-phase.ts +33 -0
  528. package/scripts/lane/lane-reap.ts +2 -2
  529. package/scripts/lane/lane-registry.ts +16 -15
  530. package/scripts/lane/lane-relaunch.ts +9 -9
  531. package/scripts/lane/lane-report.ts +5 -4
  532. package/scripts/lane/lane-resume.ts +2 -2
  533. package/scripts/lane/lane-sampler.ts +55 -0
  534. package/scripts/lane/lane-seed.ts +7 -7
  535. package/scripts/lane/lane-stage-stats.ts +135 -0
  536. package/scripts/lane/lane-start-point.ts +8 -11
  537. package/scripts/lane/lane-stats.ts +60 -15
  538. package/scripts/lane/lane-stray.ts +1 -1
  539. package/scripts/lane/lane-vacant.ts +1 -1
  540. package/scripts/lane/openai-lane-supervisor-decision.ts +3 -7
  541. package/scripts/lane/openai-lane-supervisor-owner.ts +3 -9
  542. package/scripts/lane/openai-review-broker.ts +2 -4
  543. package/scripts/lib/ancestor-directories.ts +1 -1
  544. package/scripts/lib/bounded-pool.ts +2 -2
  545. package/scripts/lib/buffered-process.ts +4 -6
  546. package/scripts/lib/caddy-logs.sh +0 -0
  547. package/scripts/lib/cli-flags.ts +39 -6
  548. package/scripts/lib/error-message.ts +1 -1
  549. package/scripts/lib/json-value.ts +17 -3
  550. package/scripts/lib/poll.ts +1 -1
  551. package/scripts/lib/status-icons.ts +3 -3
  552. package/scripts/lib/timed-fetch.ts +1 -1
  553. package/scripts/lib/timeouts.ts +1 -1
  554. package/scripts/lines/bytes-command.ts +3 -4
  555. package/scripts/lines/effective-limit.ts +25 -12
  556. package/scripts/lines/line-budget.ts +47 -55
  557. package/scripts/lines/line-targets.ts +6 -2
  558. package/scripts/lines/lines-command.ts +3 -3
  559. package/scripts/lint/cross-file-recheck.ts +155 -0
  560. package/scripts/lint/cspell-cached.ts +1 -1
  561. package/scripts/lint/format.ts +1 -2
  562. package/scripts/lint/lint-parallel.ts +35 -19
  563. package/scripts/lint/lint-related-scope.ts +25 -15
  564. package/scripts/lint/lint-related.ts +6 -7
  565. package/scripts/managed-marker/index.ts +1 -1
  566. package/scripts/managed-marker/managed-marker-logic.ts +1 -2
  567. package/scripts/notify/git-notify.ts +9 -7
  568. package/scripts/notify/telegram-notify.ts +53 -37
  569. package/scripts/notify/telegram-test-logic.ts +3 -3
  570. package/scripts/notify/telegram-test.ts +45 -30
  571. package/scripts/observations/observation-ledger-home.ts +14 -8
  572. package/scripts/observations/observation-ledger-line.ts +3 -2
  573. package/scripts/observations/observation-ledger-migrate.ts +3 -4
  574. package/scripts/observations/observation-ledger-prepare.ts +4 -4
  575. package/scripts/observations/observation-ledger.ts +14 -15
  576. package/scripts/observations/observation-record-cli.ts +83 -0
  577. package/scripts/observations/observation-record.ts +91 -0
  578. package/scripts/observations/observations-flush-cli.ts +1 -1
  579. package/scripts/observations/observations-flush-landing.ts +7 -6
  580. package/scripts/observations/observations-flush.ts +26 -27
  581. package/scripts/overrides/overrides-check.ts +18 -8
  582. package/scripts/package/package-scout-cli.ts +1 -1
  583. package/scripts/package/package-scout-format.ts +2 -2
  584. package/scripts/package/package-scout.ts +1 -1
  585. package/scripts/propagate/propagate-git-failure.ts +1 -1
  586. package/scripts/propagate/propagate-git.ts +7 -7
  587. package/scripts/propagate/propagate-plan.ts +2 -2
  588. package/scripts/propagate/propagate-publish.ts +2 -3
  589. package/scripts/propagate/propagate-run.ts +5 -7
  590. package/scripts/propagate/propagate-select.ts +1 -1
  591. package/scripts/propagate/propagate-steps.ts +19 -20
  592. package/scripts/propagate/propagate-targets.ts +6 -10
  593. package/scripts/propagate/propagate.ts +5 -5
  594. package/scripts/refactor/import-graph.ts +1 -1
  595. package/scripts/refactor/refactor-lint.ts +4 -10
  596. package/scripts/refactor/refactor-scan-cli.ts +1 -1
  597. package/scripts/refactor/refactor-scan.ts +2 -2
  598. package/scripts/refactor/refactor-targets.ts +1 -1
  599. package/scripts/release/github-release-cli.ts +25 -3
  600. package/scripts/release/github-release-runs.ts +1 -1
  601. package/scripts/release/release-cli.ts +21 -4
  602. package/scripts/release/release-history.ts +6 -10
  603. package/scripts/release/release-plan.ts +3 -3
  604. package/scripts/release/release-progress.ts +3 -4
  605. package/scripts/release/release-publish.ts +8 -9
  606. package/scripts/release/release-scope-cli.ts +8 -10
  607. package/scripts/release/release-tag.ts +6 -8
  608. package/scripts/release/release-worktree.ts +5 -5
  609. package/scripts/repo/auto-merge-setting-logic.ts +7 -9
  610. package/scripts/repo/auto-merge-setting.ts +1 -1
  611. package/scripts/repo/repo-setting.ts +4 -4
  612. package/scripts/repo/repository-labels.ts +1 -1
  613. package/scripts/repo/required-checks-logic.ts +3 -3
  614. package/scripts/repo/required-checks-report.ts +1 -1
  615. package/scripts/repo/ruleset-check-cli.ts +1 -1
  616. package/scripts/repo/ruleset-check.ts +1 -1
  617. package/scripts/report/report-format-reference.ts +26 -0
  618. package/scripts/report/report-lint-cli.ts +2 -2
  619. package/scripts/report/report-lint.ts +16 -2
  620. package/scripts/review/disposition-cli.ts +2 -2
  621. package/scripts/review/disposition-logic.ts +1 -1
  622. package/scripts/review/live-evidence.ts +9 -6
  623. package/scripts/review/review-attest-cli.ts +1 -2
  624. package/scripts/review/review-attest.ts +3 -3
  625. package/scripts/review/review-brief-cli.ts +19 -20
  626. package/scripts/review/review-brief.ts +29 -32
  627. package/scripts/review/review-checkout.ts +2 -2
  628. package/scripts/review/review-diff-parts.ts +3 -5
  629. package/scripts/review/review-diff-write.ts +1 -1
  630. package/scripts/review/review-finding-ledger.ts +7 -4
  631. package/scripts/review/review-findings-cli.ts +2 -2
  632. package/scripts/review/review-level.ts +4 -7
  633. package/scripts/review/review-record-cli.ts +73 -16
  634. package/scripts/review/review-record.ts +5 -4
  635. package/scripts/review/review-round2-cli.ts +2 -3
  636. package/scripts/review/review-round2.ts +13 -21
  637. package/scripts/review/review-stamps.ts +9 -71
  638. package/scripts/review/review-tree.ts +4 -5
  639. package/scripts/rules/bash-triggers.ts +4 -4
  640. package/scripts/rules/decision-oracle-batch.ts +6 -7
  641. package/scripts/rules/decision-oracle-stage.ts +1 -1
  642. package/scripts/rules/decision-oracle-tokens.ts +1 -2
  643. package/scripts/rules/decision-oracle.ts +2 -2
  644. package/scripts/rules/delivered-rules.ts +61 -406
  645. package/scripts/rules/destructive-command.ts +2 -2
  646. package/scripts/rules/direct-filing.ts +4 -4
  647. package/scripts/rules/direct-pr-create.ts +2 -2
  648. package/scripts/rules/early-heartbeat.ts +15 -19
  649. package/scripts/rules/file-body.ts +5 -6
  650. package/scripts/rules/filing-cap.ts +6 -7
  651. package/scripts/rules/filing-offer.ts +1 -1
  652. package/scripts/rules/firing-point.ts +6 -6
  653. package/scripts/rules/gh-api.ts +2 -2
  654. package/scripts/rules/git-argv.ts +3 -3
  655. package/scripts/rules/git-force.ts +2 -2
  656. package/scripts/rules/hook-context-line.ts +31 -0
  657. package/scripts/rules/implementation-cut-verdict.ts +5 -8
  658. package/scripts/rules/implementation-cut.ts +35 -32
  659. package/scripts/rules/index-guard.ts +2 -2
  660. package/scripts/rules/issue-citation.ts +7 -7
  661. package/scripts/rules/issue-comments.ts +21 -13
  662. package/scripts/rules/josh-git-bare.ts +2 -2
  663. package/scripts/rules/lane-background.ts +14 -16
  664. package/scripts/rules/lane-carry-conflict.ts +41 -5
  665. package/scripts/rules/lane-interactive-ask.ts +6 -9
  666. package/scripts/rules/lane-park.ts +12 -16
  667. package/scripts/rules/lane-split-park.ts +1 -2
  668. package/scripts/rules/lane-switch-main.ts +10 -13
  669. package/scripts/rules/last-prompt.ts +1 -1
  670. package/scripts/rules/oracle-consulted.ts +5 -5
  671. package/scripts/rules/oracle-firing.ts +6 -9
  672. package/scripts/rules/oracle-list-cli.ts +2 -2
  673. package/scripts/rules/permission-guards.ts +2 -2
  674. package/scripts/rules/piped-verification.ts +79 -9
  675. package/scripts/rules/poll-loop.ts +9 -11
  676. package/scripts/rules/pre-gate-cut.ts +33 -30
  677. package/scripts/rules/prior-comment-read.ts +3 -3
  678. package/scripts/rules/protected-files.ts +25 -13
  679. package/scripts/rules/raw-field-body.ts +3 -4
  680. package/scripts/rules/reply-language.ts +1 -1
  681. package/scripts/rules/rule-body-guard.ts +10 -12
  682. package/scripts/rules/rule-guard.ts +1 -1
  683. package/scripts/rules/rule-list.ts +51 -0
  684. package/scripts/rules/rule-registry-rows.ts +282 -0
  685. package/scripts/rules/rule-registry.ts +109 -0
  686. package/scripts/rules/rule-value-cache.ts +2 -2
  687. package/scripts/rules/rule-value-cli.ts +6 -4
  688. package/scripts/rules/rule-value.ts +61 -22
  689. package/scripts/rules/run-tail-rule.ts +11 -15
  690. package/scripts/rules/shell-body-trigger.ts +7 -7
  691. package/scripts/rules/shell-segments.ts +2 -4
  692. package/scripts/rules/stop-rules.ts +54 -41
  693. package/scripts/rules/tail-commands.ts +1 -1
  694. package/scripts/rules/test-declared-commit.ts +2 -2
  695. package/scripts/rules/third-party-write.ts +3 -3
  696. package/scripts/rules/worktree-guard.ts +12 -5
  697. package/scripts/run/add/run-add-cli.ts +165 -0
  698. package/scripts/run/add/run-add.ts +124 -0
  699. package/scripts/run/board/run-board-cli.ts +207 -0
  700. package/scripts/run/board/run-board-closed.ts +95 -0
  701. package/scripts/run/board/run-board-every.ts +60 -0
  702. package/scripts/run/board/run-board-fetch.ts +38 -0
  703. package/scripts/run/board/run-board-fit.ts +219 -0
  704. package/scripts/run/board/run-board-github.ts +162 -0
  705. package/scripts/run/board/run-board-header.ts +275 -0
  706. package/scripts/run/board/run-board-kind.ts +35 -0
  707. package/scripts/run/board/run-board-labels.ts +299 -0
  708. package/scripts/run/board/run-board-layout.ts +222 -0
  709. package/scripts/run/board/run-board-link.ts +31 -0
  710. package/scripts/run/board/run-board-machine.ts +198 -0
  711. package/scripts/run/board/run-board-notes.ts +103 -0
  712. package/scripts/run/board/run-board-phase.ts +136 -0
  713. package/scripts/run/board/run-board-plan.ts +129 -0
  714. package/scripts/run/board/run-board-read.ts +62 -0
  715. package/scripts/run/board/run-board-render-legend.ts +82 -0
  716. package/scripts/run/board/run-board-render-notes.ts +77 -0
  717. package/scripts/run/board/run-board-render-slot.ts +50 -0
  718. package/scripts/run/board/run-board-render.ts +407 -0
  719. package/scripts/run/board/run-board-scope.ts +17 -0
  720. package/scripts/run/board/run-board-screen.ts +43 -0
  721. package/scripts/run/board/run-board-span.ts +66 -0
  722. package/scripts/run/board/run-board-spin.ts +115 -0
  723. package/scripts/run/board/run-board-state.ts +113 -0
  724. package/scripts/run/board/run-board-status.ts +279 -0
  725. package/scripts/run/board/run-board-tick.ts +210 -0
  726. package/scripts/run/board/run-board-track.ts +22 -0
  727. package/scripts/run/board/run-board-usage-read.ts +255 -0
  728. package/scripts/run/board/run-board-usage-rusage.ts +124 -0
  729. package/scripts/run/board/run-board-usage-text.ts +80 -0
  730. package/scripts/run/board/run-board-usage.ts +165 -0
  731. package/scripts/run/carry/run-carry-added.ts +62 -0
  732. package/scripts/run/carry/run-carry-args.ts +25 -22
  733. package/scripts/run/carry/run-carry-change.ts +1 -1
  734. package/scripts/run/carry/run-carry-cli.ts +71 -48
  735. package/scripts/run/carry/run-carry-conversation.ts +6 -7
  736. package/scripts/run/carry/run-carry-ended.ts +85 -0
  737. package/scripts/run/carry/run-carry-reclaim.ts +1 -1
  738. package/scripts/run/carry/run-carry-stash.ts +3 -2
  739. package/scripts/run/carry/run-carry-streak.ts +8 -10
  740. package/scripts/run/carry/run-carry.ts +85 -89
  741. package/scripts/run/cut/run-cut-args.ts +7 -7
  742. package/scripts/run/cut/run-cut-cli.ts +54 -36
  743. package/scripts/run/cut/run-cut-handoff.ts +15 -15
  744. package/scripts/run/cut/run-cut-report.ts +37 -16
  745. package/scripts/run/cut/run-cut.ts +63 -77
  746. package/scripts/run/detached-launch.ts +35 -50
  747. package/scripts/run/entry/run-entry-cli.ts +48 -27
  748. package/scripts/run/entry/run-entry-stop.ts +7 -9
  749. package/scripts/run/entry/run-entry.ts +5 -6
  750. package/scripts/run/event/run-event-cli.ts +5 -6
  751. package/scripts/run/event/run-event-filed.ts +69 -0
  752. package/scripts/run/event/run-event-follow.ts +3 -3
  753. package/scripts/run/event/run-event-plan.ts +38 -0
  754. package/scripts/run/event/run-event-render.ts +9 -4
  755. package/scripts/run/event/run-event-scope.ts +47 -18
  756. package/scripts/run/event/run-event-stream-emit.ts +64 -11
  757. package/scripts/run/event/run-event-stream.ts +171 -46
  758. package/scripts/run/event/run-event-watch.ts +4 -6
  759. package/scripts/run/hold/run-hold-cli.ts +65 -62
  760. package/scripts/run/hold/run-hold.ts +88 -46
  761. package/scripts/run/merge/run-merge-cli.ts +116 -77
  762. package/scripts/run/merge/run-merge-collect.ts +107 -0
  763. package/scripts/run/merge/run-merge-steps.ts +112 -65
  764. package/scripts/run/merge/run-merge-token.ts +30 -0
  765. package/scripts/run/merge/run-merge.ts +31 -22
  766. package/scripts/run/progress/run-progress-args.ts +4 -4
  767. package/scripts/run/progress/run-progress-cli.ts +39 -50
  768. package/scripts/run/progress/run-progress-clock.ts +25 -32
  769. package/scripts/run/progress/run-progress-config.ts +6 -9
  770. package/scripts/run/progress/run-progress-read.ts +9 -10
  771. package/scripts/run/progress/run-progress.ts +48 -53
  772. package/scripts/run/review/run-review-cli.ts +6 -6
  773. package/scripts/run/review/run-review-steps.ts +6 -6
  774. package/scripts/run/review/run-review.ts +9 -11
  775. package/scripts/run/run-cli-fault.ts +29 -0
  776. package/scripts/run/run-ending-cli.ts +3 -3
  777. package/scripts/run/run-ending.ts +10 -14
  778. package/scripts/run/run-halfrun-resume.ts +6 -8
  779. package/scripts/run/run-headless.ts +26 -12
  780. package/scripts/run/run-invocation.ts +17 -22
  781. package/scripts/run/run-label.ts +7 -5
  782. package/scripts/run/run-liveness-cli.ts +19 -6
  783. package/scripts/run/run-liveness.ts +27 -38
  784. package/scripts/run/run-next-cli.ts +5 -9
  785. package/scripts/run/run-next.ts +4 -5
  786. package/scripts/run/run-parent-cut-hook.ts +10 -12
  787. package/scripts/run/run-preflight.ts +25 -29
  788. package/scripts/run/run-prep-cli.ts +17 -13
  789. package/scripts/run/run-prep-locate.ts +4 -5
  790. package/scripts/run/run-prep.ts +7 -10
  791. package/scripts/run/run-prrun-resume.ts +2 -2
  792. package/scripts/run/run-report-cli.ts +4 -4
  793. package/scripts/run/run-report.ts +9 -14
  794. package/scripts/run/run-retrospective.ts +3 -3
  795. package/scripts/run/run-section.ts +42 -0
  796. package/scripts/run/run-stage-read.ts +2 -2
  797. package/scripts/run/run-stage.ts +6 -4
  798. package/scripts/run/run-status-cli.ts +7 -5
  799. package/scripts/run/run-status.ts +6 -7
  800. package/scripts/run/run-step-cli.ts +64 -18
  801. package/scripts/run/run-step.ts +107 -51
  802. package/scripts/run/run-stop-notify.ts +7 -8
  803. package/scripts/run/run-stranded-cli.ts +1 -1
  804. package/scripts/run/run-stranded-detect.ts +4 -4
  805. package/scripts/run/run-stranded.ts +11 -13
  806. package/scripts/run/run-tail-cli.ts +15 -16
  807. package/scripts/run/run-tail.ts +14 -33
  808. package/scripts/run/run-watcher-guard-cli.ts +3 -4
  809. package/scripts/run/run-watcher-guard.ts +11 -12
  810. package/scripts/run/run-watcher-hook.ts +6 -12
  811. package/scripts/run/ship/run-ship-cli.ts +67 -33
  812. package/scripts/run/ship/run-ship-detach.ts +15 -13
  813. package/scripts/run/ship/run-ship-lock.ts +1 -1
  814. package/scripts/run/ship/run-ship-next.ts +7 -8
  815. package/scripts/run/ship/run-ship-pre-detach.ts +27 -11
  816. package/scripts/run/ship/run-ship-preflight.ts +10 -11
  817. package/scripts/run/ship/run-ship-probe.ts +4 -4
  818. package/scripts/run/ship/run-ship-return.ts +1 -1
  819. package/scripts/run/ship/run-ship-review-steps.ts +43 -24
  820. package/scripts/run/ship/run-ship-review.ts +12 -14
  821. package/scripts/run/ship/run-ship-scoped.ts +15 -6
  822. package/scripts/run/ship/run-ship-stage.ts +80 -26
  823. package/scripts/run/ship/run-ship-steps.ts +26 -16
  824. package/scripts/run/ship/run-ship-stop-text.ts +4 -2
  825. package/scripts/run/ship/run-ship-sync.ts +9 -8
  826. package/scripts/run/ship/run-ship.ts +17 -32
  827. package/scripts/run/tidy/run-tidy-cli.ts +9 -5
  828. package/scripts/run/tidy/run-tidy-lanes.ts +18 -7
  829. package/scripts/run/tidy/run-tidy-stashes.ts +8 -8
  830. package/scripts/run/tidy/run-tidy.ts +4 -3
  831. package/scripts/run/wake/run-wake-cli.ts +27 -32
  832. package/scripts/run/wake/run-wake-describe.ts +24 -28
  833. package/scripts/run/wake/run-wake-driver.ts +14 -14
  834. package/scripts/run/wake/run-wake-handoff.ts +6 -6
  835. package/scripts/run/wake/run-wake-loop.ts +9 -9
  836. package/scripts/run/wake/run-wake-restart.ts +4 -5
  837. package/scripts/run/wake/run-wake-session.ts +23 -27
  838. package/scripts/run/wake/run-wake.ts +57 -279
  839. package/scripts/safe-chain/ci-installer-pin.ts +3 -3
  840. package/scripts/safe-chain/pack-hook.ts +2 -2
  841. package/scripts/safe-chain/preinstall-command.ts +2 -2
  842. package/scripts/security/security-audit-logic.ts +1 -1
  843. package/scripts/security/security-audit-provision-logic.ts +1 -1
  844. package/scripts/security/security-audit-provision.ts +2 -2
  845. package/scripts/security/security-audit.ts +5 -5
  846. package/scripts/security/security-updates-logic.ts +2 -3
  847. package/scripts/security/security-updates.ts +2 -4
  848. package/scripts/self-sync-guard/index.ts +1 -1
  849. package/scripts/self-sync-guard/self-sync-guard-logic.ts +2 -2
  850. package/scripts/self-sync-guard/self-sync-refusal.ts +1 -1
  851. package/scripts/sonar/sonar-hotspots-cli.ts +1 -1
  852. package/scripts/sonar/sonar-hotspots.ts +1 -1
  853. package/scripts/sonar/sonar-new-code-cli.ts +1 -1
  854. package/scripts/sonar/sonar-new-code.ts +1 -1
  855. package/scripts/sonar/sonar-project.ts +1 -1
  856. package/scripts/split/split-assess-cli.ts +1 -1
  857. package/scripts/split/split-assess.ts +3 -3
  858. package/scripts/sync/directory-copy-guard.ts +2 -3
  859. package/scripts/sync/managed-config-scope-cli.ts +1 -2
  860. package/scripts/sync/managed-config-scope.ts +4 -4
  861. package/scripts/sync/plugin-skill-directories.ts +2 -2
  862. package/scripts/sync/reconcile-templates.ts +17 -8
  863. package/scripts/sync/removed-skill-manifest.ts +2 -3
  864. package/scripts/sync/sync-ai-files.ts +7 -7
  865. package/scripts/sync/sync-configs.ts +30 -3
  866. package/scripts/sync/sync-hook-safety.ts +2 -2
  867. package/scripts/sync/sync.ts +23 -10
  868. package/scripts/sync/synced-paths.ts +2 -1
  869. package/scripts/sync/workflow-pin-logic.ts +1 -1
  870. package/scripts/test/test-declared-changed.ts +4 -4
  871. package/scripts/test/test-declared-logic.ts +2 -3
  872. package/scripts/test/test-declared-match.ts +25 -4
  873. package/scripts/test/test-declared.ts +26 -9
  874. package/scripts/test/test-red-commit.ts +3 -2
  875. package/scripts/test/test-red-logic.ts +7 -14
  876. package/scripts/test/test-red.ts +12 -47
  877. package/scripts/test/test-related-scope.ts +2 -3
  878. package/scripts/test/test-related.ts +3 -3
  879. package/scripts/test/test-type-logic.ts +1 -2
  880. package/scripts/test/test-unit-guard.ts +13 -17
  881. package/scripts/test/unit-worker-share.ts +7 -8
  882. package/scripts/time-runtime/time-agent-bundles.ts +2 -4
  883. package/scripts/time-runtime/time-background.ts +17 -21
  884. package/scripts/time-runtime/time-batch-guard.ts +67 -342
  885. package/scripts/time-runtime/time-bundle-call.ts +26 -28
  886. package/scripts/time-runtime/time-bundles.ts +11 -12
  887. package/scripts/time-runtime/time-call-identity.ts +1 -1
  888. package/scripts/time-runtime/time-command-key.ts +2 -2
  889. package/scripts/time-runtime/time-density-hook.ts +8 -11
  890. package/scripts/time-runtime/time-density.ts +5 -5
  891. package/scripts/time-runtime/time-followup-stage.ts +7 -7
  892. package/scripts/time-runtime/time-format.ts +5 -5
  893. package/scripts/time-runtime/time-hook-transcript.ts +3 -3
  894. package/scripts/time-runtime/time-instant.ts +1 -1
  895. package/scripts/time-runtime/time-markers.ts +15 -19
  896. package/scripts/time-runtime/time-phase-names.ts +3 -3
  897. package/scripts/time-runtime/time-reported-failure.ts +15 -19
  898. package/scripts/time-runtime/time-round-trips.ts +20 -23
  899. package/scripts/time-runtime/time-shell.ts +8 -8
  900. package/scripts/time-runtime/time-single-check.ts +1 -2
  901. package/scripts/time-runtime/time-spans.ts +35 -40
  902. package/scripts/time-runtime/time-tool-call.ts +15 -16
  903. package/scripts/time-runtime/time-transcript-line.ts +53 -34
  904. package/scripts/time-runtime/time-writes.ts +5 -5
  905. package/scripts/ui/ui-routes-cli.ts +1 -2
  906. package/scripts/ui/ui-routes.ts +1 -2
  907. package/scripts/version/bump-version.ts +1 -1
  908. package/scripts/version/fresh-metadata-cache.ts +2 -2
  909. package/scripts/version/latest-corepack.ts +26 -26
  910. package/scripts/version/latest-lane-guard.ts +1 -1
  911. package/scripts/version/latest-scope-cli.ts +2 -2
  912. package/scripts/version/latest-stamp.ts +1 -2
  913. package/scripts/version/latest-update.ts +2 -2
  914. package/scripts/version/npm-registry.ts +2 -2
  915. package/scripts/version/package-manager-version.ts +18 -0
  916. package/scripts/version/publishable-range-check.ts +2 -1
  917. package/scripts/version/publishable-range.ts +1 -1
  918. package/scripts/version/release-age.ts +11 -11
  919. package/scripts/version/release-hold.ts +2 -2
  920. package/scripts/version/safe-chain-version-update.ts +3 -3
  921. package/scripts/version/version-check-logic.ts +2 -3
  922. package/scripts/version/version-check.ts +1 -2
  923. package/scripts/version/version-command-config.ts +2 -2
  924. package/scripts/version/version-commands.ts +3 -3
  925. package/scripts/version/version-remote.ts +4 -4
  926. package/scripts/version/version-targets.ts +2 -2
  927. package/templates/gitignore +7 -0
  928. package/dist/hooks/chunk-KHX4U3BG.js +0 -6400
  929. package/dist/hooks/chunk-RKUAD3I6.js +0 -90
  930. package/dist/hooks/chunk-WPALEIRX.js +0 -18
  931. package/scripts/backlog/backlog-restructure.ts +0 -152
  932. package/scripts/rules/issue-fold-rule.ts +0 -72
  933. package/scripts/rules/wip-cap.ts +0 -63
  934. package/scripts/run/run-issue-number.ts +0 -19
@@ -0,0 +1,198 @@
1
+ import { machine_capacity, type MachineSample } from '#scripts/gate/machine-capacity'
2
+ import { run_board_labels, type Paint } from './run-board-labels'
3
+
4
+ // The machine line of `run:board`: whether a quiet run is stuck or only slow on a machine that has
5
+ // run out of room.
6
+ //
7
+ // **The reading is the gate's own** (`machine-capacity.ts`), so the board shows what the core budget
8
+ // admits against. 🔥 is the busy share of the CPU between two samples; 🧠 the kernel's memory pressure,
9
+ // never a GB figure that would disagree with Activity Monitor's "memory used"; 💾 how fast pages are
10
+ // swapped, never how much swap is held — macOS grows its swap files, so a usage share reads near 100%
11
+ // and the amount itself does no harm. A figure that needs two samples is not drawn on the first, and a
12
+ // figure that could not be read is not drawn at all.
13
+ //
14
+ // **Each gauge is green, yellow or red**, the three Activity Monitor draws. 🧠 takes its color from
15
+ // the kernel's pressure verdict, as Activity Monitor does, and from its thresholds only where no
16
+ // verdict was read; 💾 takes no color until it swaps. The three are `GAUGE_SHADES`, so no terminal
17
+ // palette draws them blue or orange.
18
+
19
+ const { GAUGE_SHADES, HEADER_ICONS, bar_of, painted } = run_board_labels
20
+ const PERCENT = 100
21
+ const MS_PER_SECOND = 1000
22
+ const PERCENT_WIDTH = '100%'.length
23
+ const RATE_WIDTH = '3.1M/s'.length
24
+ // Below this a rate keeps one decimal, so `0.4M/s` is not drawn as `0M/s`.
25
+ const RATE_DECIMAL_BELOW = 10
26
+ // The header's gap between its parts, the gauges' as well.
27
+ const GAP = ' '
28
+
29
+ // Where each gauge is full and where it turns yellow and red. **Provisional, not yet measured**: to
30
+ // be tuned against a heavy run's readings.
31
+ const CPU_YELLOW = 70
32
+ const CPU_RED = 90
33
+ const MEMORY_YELLOW = 70
34
+ const MEMORY_RED = 85
35
+ const SWAP_FULL_MB_PER_S = 20
36
+ const SWAP_RED_MB_PER_S = 10
37
+
38
+ type Alert = 'normal' | 'yellow' | 'red'
39
+
40
+ // `kern.memorystatus_vm_pressure_level`'s verdicts.
41
+ const PRESSURE_NORMAL = 1
42
+ const PRESSURE_WARNING = 2
43
+ const PRESSURE_CRITICAL = 4
44
+ const PRESSURE_ALERTS: ReadonlyMap<number, Alert> = new Map([
45
+ [PRESSURE_NORMAL, 'normal'],
46
+ [PRESSURE_WARNING, 'yellow'],
47
+ [PRESSURE_CRITICAL, 'red'],
48
+ ])
49
+
50
+ // One sample and the moment it was taken, so a rate is over the time that really passed.
51
+ interface MachineMark {
52
+ sample: MachineSample
53
+ at_ms: number
54
+ }
55
+
56
+ interface MachineGauges {
57
+ cpu_percent: number | undefined
58
+ memory_percent: number | undefined
59
+ swap_mb_per_s: number | undefined
60
+ memory_pressure: number | undefined
61
+ }
62
+
63
+ interface GaugeSpec {
64
+ icon: string
65
+ // The done part's color below the yellow threshold; `undefined` leaves it the terminal's own.
66
+ normal: Paint | undefined
67
+ full: number
68
+ yellow: number
69
+ red: number
70
+ format: (value: number) => string
71
+ }
72
+
73
+ function percent_text(value: number): string {
74
+ return `${String(Math.round(value))}%`.padStart(PERCENT_WIDTH)
75
+ }
76
+
77
+ function rate_text(value: number): string {
78
+ const figure = value < RATE_DECIMAL_BELOW ? value.toFixed(1) : String(Math.round(value))
79
+
80
+ return `${figure}M/s`.padStart(RATE_WIDTH)
81
+ }
82
+
83
+ const SPECS = {
84
+ cpu: {
85
+ icon: HEADER_ICONS.cpu,
86
+ normal: GAUGE_SHADES.normal,
87
+ full: PERCENT,
88
+ yellow: CPU_YELLOW,
89
+ red: CPU_RED,
90
+ format: percent_text,
91
+ },
92
+ memory: {
93
+ icon: HEADER_ICONS.memory,
94
+ normal: GAUGE_SHADES.normal,
95
+ full: PERCENT,
96
+ yellow: MEMORY_YELLOW,
97
+ red: MEMORY_RED,
98
+ format: percent_text,
99
+ },
100
+ swap: {
101
+ icon: HEADER_ICONS.swap,
102
+ normal: undefined,
103
+ full: SWAP_FULL_MB_PER_S,
104
+ yellow: 1,
105
+ red: SWAP_RED_MB_PER_S,
106
+ format: rate_text,
107
+ },
108
+ } as const satisfies Readonly<Record<string, GaugeSpec>>
109
+
110
+ function cpu_percent(before: MachineMark | undefined, after: MachineMark): number | undefined {
111
+ if (before === undefined) return undefined
112
+
113
+ const share = machine_capacity.busy_share_between(before.sample.cpu, after.sample.cpu)
114
+
115
+ return share === undefined ? undefined : share * PERCENT
116
+ }
117
+
118
+ function memory_percent(sample: MachineSample): number | undefined {
119
+ const { available_mb } = sample.memory
120
+
121
+ return available_mb === undefined
122
+ ? undefined
123
+ : PERCENT - (available_mb / sample.total_mb) * PERCENT
124
+ }
125
+
126
+ function swap_rate(before: MachineMark | undefined, after: MachineMark): number | undefined {
127
+ if (before === undefined) return undefined
128
+
129
+ const swapped = machine_capacity.swapped_between(
130
+ before.sample.memory.swapped_mb,
131
+ after.sample.memory.swapped_mb,
132
+ )
133
+ const seconds = (after.at_ms - before.at_ms) / MS_PER_SECOND
134
+
135
+ return swapped === undefined || seconds <= 0 ? undefined : swapped / seconds
136
+ }
137
+
138
+ function gauges_of(before: MachineMark | undefined, after: MachineMark): MachineGauges {
139
+ return {
140
+ cpu_percent: cpu_percent(before, after),
141
+ memory_percent: memory_percent(after.sample),
142
+ swap_mb_per_s: swap_rate(before, after),
143
+ memory_pressure: after.sample.memory.pressure_level,
144
+ }
145
+ }
146
+
147
+ function threshold_alert(value: number, spec: Pick<GaugeSpec, 'red' | 'yellow'>): Alert {
148
+ if (value >= spec.red) return 'red'
149
+
150
+ return value >= spec.yellow ? 'yellow' : 'normal'
151
+ }
152
+
153
+ // A pressure verdict the kernel gave decides the color; an unread or unknown one falls to the thresholds.
154
+ function alert_of(spec: GaugeSpec, value: number, pressure: number | undefined): Alert {
155
+ const verdict = pressure === undefined ? undefined : PRESSURE_ALERTS.get(pressure)
156
+
157
+ return verdict ?? threshold_alert(value, spec)
158
+ }
159
+
160
+ // Icon, figure, then bar: the figure is what a person reads, and its fixed
161
+ // width keeps every bar starting in one column. The bar stops full past `spec.full`; the figure still
162
+ // says how far past, and takes the warning colors only, so a quiet machine's figures stay the terminal's
163
+ // own.
164
+ function gauge(spec: GaugeSpec, value: number | undefined, pressure?: number): string | undefined {
165
+ if (value === undefined) return undefined
166
+
167
+ const alert = alert_of(spec, value, pressure)
168
+ const warning = alert === 'normal' ? undefined : GAUGE_SHADES[alert]
169
+ const bar = bar_of(value, spec.full, undefined, warning ?? spec.normal)
170
+
171
+ return `${spec.icon} ${painted(warning, spec.format(value))} ${bar}`
172
+ }
173
+
174
+ // `undefined` when not one gauge could be read, so the header draws no line at all.
175
+ function line_of(gauges: MachineGauges | undefined): string | undefined {
176
+ if (gauges === undefined) return undefined
177
+
178
+ const parts = [
179
+ gauge(SPECS.cpu, gauges.cpu_percent),
180
+ gauge(SPECS.memory, gauges.memory_percent, gauges.memory_pressure),
181
+ gauge(SPECS.swap, gauges.swap_mb_per_s),
182
+ ].filter((part) => part !== undefined)
183
+
184
+ return parts.length === 0 ? undefined : parts.join(GAP)
185
+ }
186
+
187
+ const run_board_machine = {
188
+ CPU_YELLOW,
189
+ GAP,
190
+ MEMORY_YELLOW,
191
+ gauges_of,
192
+ line_of,
193
+ percent_text,
194
+ threshold_alert,
195
+ }
196
+
197
+ export { run_board_machine }
198
+ export type { Alert, MachineGauges, MachineMark }
@@ -0,0 +1,103 @@
1
+ import { NEEDS_DECISION_LABEL } from '#scripts/issue/issue-labels'
2
+ import { run_event_filed, type FiledKind } from '#scripts/run/event/run-event-filed'
3
+ import { run_event_scope } from '#scripts/run/event/run-event-scope'
4
+ import { run_event_stream, type RunEvent } from '#scripts/run/event/run-event-stream'
5
+
6
+ // The board's findings section: what a run filed, what it parked and the
7
+ // one-line observations it left, read off the event stream alone. A run started from the command line
8
+ // says these in no chat a person reads, so the board is where they surface. Nothing is inferred from a
9
+ // conversation log — an event that is not on the stream is not on the board.
10
+
11
+ type NoteKind = 'filed' | 'park' | 'note'
12
+
13
+ interface BoardNote {
14
+ kind: NoteKind
15
+ at_ms: number
16
+ // The issue the line is about: the filed Issue, the parked child, or the one a note names.
17
+ issue: string | undefined
18
+ text: string
19
+ // Whose work turned up a filed Issue: the lane child, else the Issue the branch names.
20
+ found_during?: string | undefined
21
+ // A filed Issue's classification, which its line leads with.
22
+ filed_kind?: FiledKind | undefined
23
+ // A park waiting on a person's decision, drawn apart from an ordinary park.
24
+ is_decision: boolean
25
+ }
26
+
27
+ const KIND = run_event_stream.EVENT_KIND
28
+ // `#<N> parked`, `#<N> parked (<reason>)` and `#<N> waiting on #<M>` lose their leading number, so a
29
+ // waiting park does not name its issue twice.
30
+ const PARK_PREFIX = /^#\d+ (?:parked\s*)?/u
31
+ const PARENTHESES = /^\((?<inner>.*)\)$/u
32
+
33
+ function filed_note(event: RunEvent): BoardNote | undefined {
34
+ const filed = run_event_filed.parse(event.text)
35
+
36
+ if (filed === undefined) return undefined
37
+
38
+ return {
39
+ kind: 'filed',
40
+ at_ms: Date.parse(event.at),
41
+ issue: filed.reference.replace(/^#/u, ''),
42
+ text: filed.title,
43
+ found_during: filed.found_during,
44
+ filed_kind: filed.kind,
45
+ is_decision: false,
46
+ }
47
+ }
48
+
49
+ // The board's titles by issue number: the plan's listing with its closed children's.
50
+ type Titles = ReadonlyMap<number, string>
51
+
52
+ // `#<N> parked (needs-decision)` reads as the reason `needs-decision`; a bare park has none.
53
+ function reason_of(event: RunEvent): string {
54
+ const rest = event.text.replace(PARK_PREFIX, '')
55
+
56
+ return PARENTHESES.exec(rest)?.groups?.['inner'] ?? rest
57
+ }
58
+
59
+ // The parked issue's title with its reason after it; before the plan is read there is no title, and
60
+ // the reason alone is drawn.
61
+ function park_text(title: string | undefined, reason: string): string {
62
+ if (title === undefined) return reason
63
+
64
+ return reason === '' ? title : `${title} (${reason})`
65
+ }
66
+
67
+ function park_note(event: RunEvent, titles: Titles): BoardNote {
68
+ const reason = reason_of(event)
69
+ const issue = run_event_scope.issue_named(event)
70
+ const title = issue === undefined ? undefined : titles.get(Number(issue))
71
+ const is_decision = reason.includes(NEEDS_DECISION_LABEL)
72
+
73
+ return {
74
+ kind: 'park',
75
+ at_ms: Date.parse(event.at),
76
+ issue,
77
+ text: park_text(title, reason),
78
+ is_decision,
79
+ }
80
+ }
81
+
82
+ function plain_note(event: RunEvent): BoardNote {
83
+ const issue = run_event_scope.issue_named(event)
84
+
85
+ return { kind: 'note', at_ms: Date.parse(event.at), issue, text: event.text, is_decision: false }
86
+ }
87
+
88
+ function note_of(event: RunEvent, titles: Titles): BoardNote | undefined {
89
+ if (event.kind === KIND.FILED) return filed_note(event)
90
+ if (event.kind === KIND.PARK) return park_note(event, titles)
91
+
92
+ return event.kind === KIND.NOTE ? plain_note(event) : undefined
93
+ }
94
+
95
+ // Newest first: the line a person glancing at the board needs is the latest one.
96
+ function notes_of(events: ReadonlyArray<RunEvent>, titles: Titles): ReadonlyArray<BoardNote> {
97
+ return events.flatMap((event) => note_of(event, titles) ?? []).toReversed()
98
+ }
99
+
100
+ const run_board_notes = { notes_of }
101
+
102
+ export { run_board_notes }
103
+ export type { BoardNote, Titles }
@@ -0,0 +1,136 @@
1
+ import { run_event_stream, type RunEvent } from '#scripts/run/event/run-event-stream'
2
+ import { run_ship_stage } from '#scripts/run/ship/run-ship-stage'
3
+
4
+ // How far a running lane child has got, read from the events that name its issue. **Each phase comes
5
+ // from a record a step already writes**: the launch, the `plan` event `run-event-plan.ts` writes, the
6
+ // `lane-phase` the PreToolUse hook writes at the first implementation edit of each session, the ship
7
+ // supervisor's launch, `josh ship`'s own stage trace and its stop. Nothing is guessed from the clock,
8
+ // so a child that never reaches a record stays on the phase before it rather than being drawn further
9
+ // on.
10
+ //
11
+ // **A child's phases are a history, not a high-water mark**: a ship that stops sends the child back to
12
+ // implement, so a furthest phase that never went back would hold a row on 👀 while it codes again.
13
+ // Each phase is written after the last, and a failed ship's own stages fold into the `ship`, `failed`
14
+ // pair, so the retries read as the count of 🔨 and of 🚢💥. A stage line that lists its attempt
15
+ // redraws that attempt whole (`replayed`).
16
+
17
+ const PHASES = [
18
+ 'investigate',
19
+ 'plan',
20
+ 'implement',
21
+ 'ship',
22
+ 'review',
23
+ 'gate',
24
+ 'sync',
25
+ 'commit',
26
+ 'round_two',
27
+ 'followup',
28
+ 'report',
29
+ 'failed',
30
+ ] as const
31
+
32
+ type Phase = (typeof PHASES)[number]
33
+
34
+ const KIND = run_event_stream.EVENT_KIND
35
+ const { STAGE } = run_ship_stage
36
+ // A launched child is investigating until a later record says otherwise — no event marks the start.
37
+ const LAUNCHED_PHASE: Phase = 'investigate'
38
+ const WORD_SEPARATOR = ' '
39
+ const STAGE_INDEX = 1
40
+
41
+ // `josh ship`'s stages, each its own phase; the preflight is the ship's own start.
42
+ const SHIP_PHASES: Readonly<Partial<Record<string, Phase>>> = {
43
+ [STAGE.PREFLIGHT]: 'ship',
44
+ [STAGE.REVIEW]: 'review',
45
+ [STAGE.GATE]: 'gate',
46
+ [STAGE.SYNC]: 'sync',
47
+ [STAGE.COMMIT]: 'commit',
48
+ [STAGE.ROUND_TWO]: 'round_two',
49
+ [STAGE.FOLLOWUP]: 'followup',
50
+ [STAGE.REPORT]: 'report',
51
+ }
52
+
53
+ const LANE_PHASES: Readonly<Partial<Record<string, Phase>>> = { implement: 'implement' }
54
+
55
+ // The kinds that mark one phase whatever their text says.
56
+ const KIND_PHASES: Readonly<Partial<Record<string, Phase>>> = {
57
+ [KIND.PLAN]: 'plan',
58
+ [KIND.SHIP_LAUNCH]: 'ship',
59
+ [KIND.SHIP_STOP]: 'failed',
60
+ }
61
+
62
+ // The word after the issue — `#<N> <stage> <phase>` carries the stage second.
63
+ function stage_word_of(event: RunEvent): string {
64
+ return event.text.split(WORD_SEPARATOR)[STAGE_INDEX] ?? ''
65
+ }
66
+
67
+ // A stage marks its phase when it starts; its `done`, and one a resumed ship passed over, mark none.
68
+ function ship_phase_of(event: RunEvent): Phase | undefined {
69
+ if (!run_event_stream.is_stage_start(event)) return undefined
70
+
71
+ return SHIP_PHASES[stage_word_of(event)]
72
+ }
73
+
74
+ // The phase one event marks, or `undefined` for an event that marks none.
75
+ function phase_of(event: RunEvent): Phase | undefined {
76
+ if (event.kind === KIND.LANE_PHASE) return LANE_PHASES[stage_word_of(event)]
77
+ if (event.kind === KIND.SHIP_STAGE) return ship_phase_of(event)
78
+
79
+ return KIND_PHASES[event.kind]
80
+ }
81
+
82
+ // A failed ship keeps only its own start: everything after the newest `ship` folds into `failed`.
83
+ function failed_after(track: ReadonlyArray<Phase>): Array<Phase> {
84
+ const ship = track.lastIndexOf('ship')
85
+
86
+ return [...track.slice(0, ship + 1), 'failed']
87
+ }
88
+
89
+ // The history after one more phase: the same phase twice in a row — a `ship-launch` and its preflight,
90
+ // a second session's first edit — is written once.
91
+ function history_after(track: ReadonlyArray<Phase>, next: Phase): Array<Phase> {
92
+ if (next === 'failed') return failed_after(track)
93
+
94
+ return track.at(-1) === next ? [...track] : [...track, next]
95
+ }
96
+
97
+ const ATTEMPT_PHASES: ReadonlySet<Phase | undefined> = new Set(Object.values(SHIP_PHASES))
98
+
99
+ // The phases a `ship-stage` line says its attempt has started (`run-ship-stage.ts` → `event_text`), in
100
+ // the order they ran and led by the ship's own start, which a resumed ship's passed-over preflight does
101
+ // not list. `undefined` for a line that carries none — an older three-word line is read one phase at a
102
+ // time.
103
+ function attempt_of(event: RunEvent): ReadonlyArray<Phase> | undefined {
104
+ const started = event.kind === KIND.SHIP_STAGE ? run_ship_stage.started_of(event.text) : undefined
105
+
106
+ if (started === undefined) return undefined
107
+
108
+ return [...new Set<Phase>(['ship', ...started.flatMap((stage) => SHIP_PHASES[stage] ?? [])])]
109
+ }
110
+
111
+ // Where the current ship attempt starts on a track: the first `ship` of the stages that end it, else the
112
+ // end — a failed or re-implemented attempt before it is history, never redrawn. A supervisor restarted
113
+ // with no stop between adds a second `ship` inside the same attempt, which the line redraws whole.
114
+ function attempt_start(track: ReadonlyArray<Phase>): number {
115
+ const tail = track.findLastIndex((phase) => !ATTEMPT_PHASES.has(phase)) + 1
116
+ const ship = track.indexOf('ship', tail)
117
+
118
+ return ship === -1 ? track.length : ship
119
+ }
120
+
121
+ // **The newest line restores what the bound dropped**: on a stream full of
122
+ // positions only each issue's newest stage line survives, so the current attempt is redrawn from it, in
123
+ // the order the line lists. A line that misses a phase the track holds — a restarted supervisor's, which
124
+ // lists none of the stages it passed over — is added after them rather than replacing them.
125
+ function replayed(track: ReadonlyArray<Phase>, attempt: ReadonlyArray<Phase>): Array<Phase> {
126
+ const start = attempt_start(track)
127
+ const current = track.slice(start)
128
+ const is_covered = current.every((phase) => attempt.includes(phase))
129
+
130
+ return [...track.slice(0, start), ...(is_covered ? attempt : new Set([...current, ...attempt]))]
131
+ }
132
+
133
+ const run_board_phase = { LAUNCHED_PHASE, PHASES, attempt_of, history_after, phase_of, replayed }
134
+
135
+ export { run_board_phase }
136
+ export type { Phase }
@@ -0,0 +1,129 @@
1
+ import { auto_ok_cli, type OptedInRead } from '#scripts/auto-ok/auto-ok-cli'
2
+ import type { OptedIn } from '#scripts/backlog/backlog-next'
3
+ import type { NamedPlan } from '#scripts/backlog/backlog-plan'
4
+ import { backlog_plan_read, type OpenListing, type Plan } from '#scripts/backlog/backlog-plan-read'
5
+ import { backlog_waves } from '#scripts/backlog/backlog-waves'
6
+ import type { EpicChild } from '#scripts/epic/epic-graph'
7
+ import type { OpenIssueData } from '#scripts/git/git-schemas'
8
+ import type { BoardPlan } from './run-board-layout'
9
+
10
+ // The plan `run:board` lays the run over, scoped to what the run was asked to do.
11
+ // **`--only`** draws the named issues alone — a named epic expanded into its children; **a named prefix
12
+ // without it** draws the named issues first and the opted-in waves after them; **nothing named** draws the
13
+ // opted-in waves. The named issues are classified through the very function `backlog:next`
14
+ // places the pool with, fed as an opted-in set of their own, so an epic is expanded the way the run
15
+ // expands it and no second placement exists to disagree with it.
16
+
17
+ // The reads the plan is drawn from, a seam so each scope is tested without GitHub.
18
+ interface PlanPorts {
19
+ fetch_open: () => Promise<OpenListing | undefined>
20
+ fetch_opted_in: () => Promise<OptedInRead>
21
+ classify: (opted_in: OptedIn, exclude: ReadonlyArray<number>) => Promise<Plan | undefined>
22
+ }
23
+
24
+ const LIVE_PORTS: PlanPorts = {
25
+ fetch_open: backlog_plan_read.fetch_open,
26
+ fetch_opted_in: auto_ok_cli.fetch_opted_in,
27
+ classify: backlog_plan_read.classify,
28
+ }
29
+
30
+ // One classified plan, against the listing it was read with.
31
+ interface PlanRead {
32
+ listing: OpenListing
33
+ ports: PlanPorts
34
+ }
35
+
36
+ // A row the listing read without its labels is left out, so it reads as unknown rather than unlabelled.
37
+ function labels_of(rows: ReadonlyArray<OpenIssueData>): ReadonlyMap<number, ReadonlyArray<string>> {
38
+ const labelled = rows.flatMap((row) =>
39
+ row.labels === undefined ? [] : [[row.number, row.labels.map((label) => label.name)] as const],
40
+ )
41
+
42
+ return new Map(labelled)
43
+ }
44
+
45
+ async function board_of(
46
+ opted_in: OptedIn,
47
+ exclude: ReadonlyArray<number>,
48
+ read: PlanRead,
49
+ ): Promise<BoardPlan | undefined> {
50
+ const plan = await read.ports.classify(opted_in, exclude)
51
+
52
+ if (plan === undefined) return undefined
53
+
54
+ return {
55
+ waves: backlog_waves.build(plan.result, plan.repo, plan.scope),
56
+ tracked: plan.tracked,
57
+ context: backlog_plan_read.context_of(plan, read.listing),
58
+ labels: labels_of(read.listing.rows),
59
+ }
60
+ }
61
+
62
+ async function pool_board(
63
+ exclude: ReadonlyArray<number>,
64
+ read: PlanRead,
65
+ ): Promise<BoardPlan | undefined> {
66
+ const opted_in = await read.ports.fetch_opted_in()
67
+
68
+ return opted_in.kind === 'read' ? await board_of(opted_in, exclude, read) : undefined
69
+ }
70
+
71
+ // The named issues as the open listing holds them — a closed one is the stream's to show, not the plan's.
72
+ async function named_board(named: NamedPlan, read: PlanRead): Promise<BoardPlan | undefined> {
73
+ const issues = read.listing.rows.filter((row) => named.issues.includes(row.number))
74
+
75
+ return await board_of({ kind: 'read', issues, cutoff: 'none' }, [], read)
76
+ }
77
+
78
+ function children_of(plan: BoardPlan): Array<EpicChild> {
79
+ return [...plan.waves.waves.flat(), ...plan.waves.unreached]
80
+ }
81
+
82
+ function not_held(children: ReadonlyArray<EpicChild>, held: ReadonlySet<number>): Array<EpicChild> {
83
+ return children.filter((child) => !held.has(child.number))
84
+ }
85
+
86
+ // The named waves lead and the pool's follow, a child the named plan already holds left out of the pool
87
+ // so a named epic's children are not drawn twice.
88
+ function joined(lead: BoardPlan, pool: BoardPlan): BoardPlan {
89
+ const held = new Set(children_of(lead).map((child) => child.number))
90
+
91
+ return {
92
+ waves: {
93
+ waves: [...lead.waves.waves, ...pool.waves.waves.map((wave) => not_held(wave, held))],
94
+ unreached: [...lead.waves.unreached, ...not_held(pool.waves.unreached, held)],
95
+ },
96
+ tracked: new Map([...pool.tracked, ...lead.tracked]),
97
+ context: pool.context,
98
+ labels: pool.labels,
99
+ }
100
+ }
101
+
102
+ async function scoped_board(named: NamedPlan, read: PlanRead): Promise<BoardPlan | undefined> {
103
+ const lead = await named_board(named, read)
104
+
105
+ if (lead === undefined || named.only) return lead
106
+
107
+ const pool = await pool_board(named.issues, read)
108
+
109
+ return pool === undefined ? undefined : joined(lead, pool)
110
+ }
111
+
112
+ // `undefined` is a failed read, which the board answers by keeping the plan it already has.
113
+ async function read_plan(
114
+ named: NamedPlan,
115
+ ports: PlanPorts = LIVE_PORTS,
116
+ ): Promise<BoardPlan | undefined> {
117
+ const listing = await ports.fetch_open()
118
+
119
+ if (listing === undefined) return undefined
120
+
121
+ const read = { listing, ports }
122
+
123
+ return named.issues.length === 0 ? await pool_board([], read) : await scoped_board(named, read)
124
+ }
125
+
126
+ const run_board_plan = { read_plan }
127
+
128
+ export { run_board_plan }
129
+ export type { PlanPorts }
@@ -0,0 +1,62 @@
1
+ import type { NamedPlan } from '#scripts/backlog/backlog-plan'
2
+ import { lane_registry } from '#scripts/lane/lane-registry'
3
+ import { run_carry } from '#scripts/run/carry/run-carry'
4
+ import { run_carry_ended } from '#scripts/run/carry/run-carry-ended'
5
+ import { run_event_stream, type RunEvent } from '#scripts/run/event/run-event-stream'
6
+ import { run_board_scope } from './run-board-scope'
7
+ import { run_board_span, type BoardSpan } from './run-board-span'
8
+
9
+ // What `run:board` reads locally each tick: the run's span and scope, its events and its open lanes.
10
+ // The run is the running one, or the one that last ended until the next run begins.
11
+ interface LocalRead {
12
+ started_ms: number
13
+ // Set only once the run has ended; the board then draws its end-of-run screen.
14
+ ended_ms: number | undefined
15
+ // What the run was asked to do, from its invocation.
16
+ scope: NamedPlan
17
+ events: ReadonlyArray<RunEvent>
18
+ lanes: ReadonlyArray<string>
19
+ // The session a stopped run is resumed from; `undefined` otherwise.
20
+ resume: string | undefined
21
+ }
22
+
23
+ interface SpanHere {
24
+ span: BoardSpan | undefined
25
+ resume: string | undefined
26
+ }
27
+
28
+ function span_here(repository: string): SpanHere {
29
+ const read = run_carry.read_carry(run_carry.carry_path(repository))
30
+ const ended = run_carry_ended.read_ended(run_carry_ended.ended_path(repository))
31
+
32
+ return {
33
+ span: run_board_span.span_of(read, ended),
34
+ resume: run_board_span.resume_of(read, ended),
35
+ }
36
+ }
37
+
38
+ // `undefined` when no run has started here.
39
+ async function read_local(): Promise<LocalRead | undefined> {
40
+ const repository = await run_carry.repository_directory()
41
+ const { span, resume } =
42
+ repository === undefined ? { span: undefined, resume: undefined } : span_here(repository)
43
+
44
+ if (repository === undefined || span === undefined) return undefined
45
+
46
+ const events = run_event_stream.read_events(run_event_stream.target_of(repository))
47
+ const lanes = await lane_registry.list_lanes()
48
+
49
+ return {
50
+ started_ms: span.started_ms,
51
+ ended_ms: span.ended_ms,
52
+ scope: run_board_scope.scope_of(span.invocation),
53
+ events: run_board_span.events_of(events, span),
54
+ lanes: lanes.map((lane) => lane.issue),
55
+ resume,
56
+ }
57
+ }
58
+
59
+ const run_board_read = { read_local }
60
+
61
+ export { run_board_read }
62
+ export type { LocalRead }