@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
@@ -1,8 +1,10 @@
1
1
  #!/usr/bin/env tsx
2
2
  import { fileURLToPath } from 'node:url'
3
3
  import { git_stash } from '#scripts/git/stash/git-stash'
4
+ import { issue_number_shape } from '#scripts/issue/issue-number-shape'
4
5
  import { issue_read_cli, type BlockRead } from '#scripts/issue/issue-read-cli'
5
6
  import { issue_state_cli, type StateRead } from '#scripts/issue/issue-state-cli'
7
+ import { session_cite } from '#scripts/issue/session-cite'
6
8
  import { lane_child_marker } from '#scripts/lane/lane-child-marker'
7
9
  import { error_text } from '#scripts/lib/error-message'
8
10
  import { run_ship_preflight } from '#scripts/run/ship/run-ship-preflight'
@@ -10,8 +12,8 @@ import { latest_scope_cli } from '#scripts/version/latest-scope-cli'
10
12
  import { run_prep, type PrepParts } from './run-prep'
11
13
  import { run_prep_locate } from './run-prep-locate'
12
14
 
13
- // `josh run:prep <N>` — one call for the reads a `fullrun` makes before its first edit
14
- // (joshuafolkken/kit#1978): the issue body and comments (`issue:read`), the state, labels and
15
+ // `josh run:prep <N>` — one call for the reads a `fullrun` makes before its first edit:
16
+ // the issue body and comments (`issue:read`), the state, labels and
15
17
  // `human_review` line (`issue:state`), the dependency-update scope (`latest:scope`), and where the
16
18
  // paths and identifiers the body names occur in code (`run-prep-locate.ts`). Each is
17
19
  // reused rather than reproduced, and the two body reads run concurrently, so three round trips become
@@ -25,7 +27,6 @@ import { run_prep_locate } from './run-prep-locate'
25
27
  const SUCCESS_EXIT_CODE = 0
26
28
  const FAILURE_EXIT_CODE = 1
27
29
  const ARGV_OFFSET = 2
28
- const ISSUE_NUMBER_PATTERN = /^[1-9]\d*$/u
29
30
  const USAGE = 'Usage: josh run:prep <issue-number>'
30
31
  const LANE_SKIP_SCOPE = 'not asked'
31
32
  const LANE_SKIP_REASON =
@@ -50,7 +51,11 @@ interface PrepReads {
50
51
  function parse_number(argv: ReadonlyArray<string>): string | undefined {
51
52
  const [first] = argv
52
53
 
53
- if (first === undefined || argv.length !== 1 || !ISSUE_NUMBER_PATTERN.test(first)) {
54
+ if (
55
+ first === undefined ||
56
+ argv.length !== 1 ||
57
+ !issue_number_shape.ISSUE_NUMBER_PATTERN.test(first)
58
+ ) {
54
59
  return undefined
55
60
  }
56
61
 
@@ -60,7 +65,7 @@ function parse_number(argv: ReadonlyArray<string>): string | undefined {
60
65
  // One note for a read that produced nothing, naming which of the two it was — the same distinction
61
66
  // `issue:read` and `issue:state` keep, so a bundled failure still tells a retry from an answer.
62
67
  function failure_note(issue_number: string, kind: string): string {
63
- return `(issue #${issue_number} not bundled: ${kind})`
68
+ return `(issue ${session_cite.issue(issue_number)} not bundled: ${kind})`
64
69
  }
65
70
 
66
71
  // A dispatched lane child never runs `josh latest` — the parent does it once per session
@@ -75,11 +80,10 @@ function latest_decision(): LatestDecision {
75
80
  return latest_scope_cli.decide()
76
81
  }
77
82
 
78
- // Whether a dispatched lane child's tree holds uncommitted work (joshuafolkken/kit#2476). A lane child
79
- // that popped its parked work back and then found its issue closed is the one position that work is
80
- // lost from — the lane is removed by force — so only a lane is asked; a person's own checkout keeps its
81
- // unrelated edits out of the verdict. A status that cannot be read reports none, leaving the verdict
82
- // printed before this read existed.
83
+ // Whether a dispatched lane child's tree holds uncommitted work. A lane child that popped
84
+ // its parked work back and then found its issue closed is the one position that work is lost from —
85
+ // the lane is removed by force — so only a lane is asked; a person's own checkout keeps its unrelated
86
+ // edits out of the verdict. A status that cannot be read reports none, leaving the verdict unchanged.
83
87
  async function lane_has_changes(): Promise<boolean> {
84
88
  if (!lane_child_marker.is_child_of(process.cwd())) return false
85
89
 
@@ -144,8 +148,9 @@ async function run(argv: ReadonlyArray<string>): Promise<number> {
144
148
  }
145
149
 
146
150
  const reads = await gather(issue_number)
151
+ const report = run_prep.format_report(to_parts(issue_number, reads))
147
152
 
148
- console.info(run_prep.format_report(to_parts(issue_number, reads)))
153
+ console.info(session_cite.text(report))
149
154
 
150
155
  return exit_code(reads)
151
156
  }
@@ -155,8 +160,7 @@ async function main(argv: ReadonlyArray<string>): Promise<void> {
155
160
  }
156
161
 
157
162
  // `gather` and `to_parts` are exported so `run:next` reads the same state from the same three reads
158
- // rather than growing a second copy of the gather (joshuafolkken/kit#2188) — `run:next` is the
159
- // consumer of `run:prep` the epic #2166 wanted.
163
+ // rather than growing a second copy of the gather.
160
164
  const run_prep_cli = { gather, parse_number, run, to_parts }
161
165
 
162
166
  if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
@@ -1,11 +1,10 @@
1
1
  import { get_exit_code } from '#scripts/git/git-execa-error'
2
2
  import { git_spawn } from '#scripts/git/git-spawn'
3
3
 
4
- // The code locations an issue names, bundled into `run:prep` (joshuafolkken/kit#2761). Across the 90
5
- // runs `.time-history.jsonl` split by contributor, 53% of round trips were investigation, and most of
6
- // it opened the files an issue names one read at a time. This finds each path, identifier and command
7
- // the body puts in backticks and hands back where it occurs in code — `file:line` and a short excerpt,
8
- // never a whole file — so the first read lands on the right place.
4
+ // The code locations an issue names, bundled into `run:prep`. Investigation is most of a run's
5
+ // round trips, and most of it opens the files an issue names one read at a time. This finds each
6
+ // path, identifier and command the body puts in backticks and hands back where it occurs in code —
7
+ // `file:line` and a short excerpt, never a whole file — so the first read lands on the right place.
9
8
  //
10
9
  // **Only a backticked span is a target.** A prose word is not a name, and a span holding a space is a
11
10
  // command line or a sentence rather than one thing to look up; the one exception is a `josh` command,
@@ -1,11 +1,9 @@
1
1
  import { issue_state, type IssueState } from '#scripts/issue/issue-state'
2
2
 
3
- // `josh run:prep <N>` — the reads a `fullrun` makes before its first edit, assembled into one report
4
- // (joshuafolkken/kit#1978). Two earlier passes at the setup phase were a documentation rule
5
- // (joshuafolkken/kit#1847) and a measurement (joshuafolkken/kit#1868); neither was an execution-side
6
- // change, and the `setup` median did not move. This joins the issue body and comments, the state and
7
- // `human_review` line, and the dependency-update scope that `issue:read`, `issue:state` and
8
- // `latest:scope` answered in three separate calls — reusing each rather than reproducing it.
3
+ // `josh run:prep <N>` — the reads a `fullrun` makes before its first edit, assembled into one report.
4
+ // This joins the issue body and comments, the state and `human_review` line, and the dependency-update
5
+ // scope that `issue:read`, `issue:state` and `latest:scope` answer in three separate calls — reusing
6
+ // each rather than reproducing it.
9
7
  //
10
8
  // The leading summary line carries the three facts a run branches on — the state, whether the issue
11
9
  // stops before its commit, and whether a dependency update is owed — so the decision is read off the
@@ -40,13 +38,12 @@ interface PrepParts {
40
38
  state_failure: string
41
39
  latest_scope: string
42
40
  latest_reason: string
43
- // Where the paths and identifiers the issue names occur in code (joshuafolkken/kit#2761).
41
+ // Where the paths and identifiers the issue names occur in code.
44
42
  locations: string
45
43
  // Whether a lane child's tree holds uncommitted work — read for the verdict, not printed in the
46
- // report (joshuafolkken/kit#2476).
44
+ // report.
47
45
  has_changes: boolean
48
- // What `josh ship` would refuse on as the tree stands — `run_ship_preflight.ahead`
49
- // (joshuafolkken/kit#3154).
46
+ // What `josh ship` would refuse on as the tree stands — `run_ship_preflight.ahead`.
50
47
  ship_problems: ReadonlyArray<string>
51
48
  }
52
49
 
@@ -5,7 +5,7 @@ import { git_command } from '#scripts/git/git-command'
5
5
  import { run_hold, type HoldRead } from '#scripts/run/hold/run-hold'
6
6
  import { run_halfrun_resume, type StopMark } from './run-halfrun-resume'
7
7
 
8
- // joshuafolkken/kit#3023: a `prrun` stops at a green, mergeable pull request and **keeps** its hold, so
8
+ // A `prrun` stops at a green, mergeable pull request and **keeps** its hold, so
9
9
  // a person can look before anything merges. What comes next is one of three, and `run:entry` answers
10
10
  // which as the resume token `fullrun #N` acts on — read, never inferred:
11
11
  //
@@ -74,7 +74,7 @@ async function read_facts(stop_head: string): Promise<ResumeFacts> {
74
74
  }
75
75
 
76
76
  // Read-only, so `run:entry` can ask the session budget before it takes anything over. `undefined` is
77
- // "no `prrun` stop for this issue here", and the ordinary claim decides the tree as before.
77
+ // "no `prrun` stop for this issue here", and the ordinary claim decides the tree.
78
78
  async function resume_token(issue: string): Promise<PrrunToken | undefined> {
79
79
  const target = await run_halfrun_resume.hold_target()
80
80
 
@@ -9,7 +9,7 @@ import { run_event_stream_emit } from '#scripts/run/event/run-event-stream-emit'
9
9
  import { run_report } from './run-report'
10
10
 
11
11
  // `josh run:report` — the session-facing report, generated from the run's event stream rather than
12
- // composed by hand (joshuafolkken/kit#2249). It reads the events the run appended, asks `release:scope`
12
+ // composed by hand. It reads the events the run appended, asks `release:scope`
13
13
  // the same question `josh followup` already asks, and prints `run_report.build_report` of the two. The AI
14
14
  // writes only Step 0's three lines (Now / Change / Check), which `report-format.md` names as the half a
15
15
  // machine cannot answer; this owns the mechanical half — what merged, what parked and why, what was cut,
@@ -31,9 +31,9 @@ async function read_stream(): Promise<ReadonlyArray<RunEvent>> {
31
31
  return run_event_stream.read_events(target)
32
32
  }
33
33
 
34
- // The invocation this report covers, taken from the run record that already holds the start time
35
- // (joshuafolkken/kit#2393). A checkout whose git directory cannot be resolved has no record to read, which is
36
- // the same undetermined answer an absent record gives — and neither one falls back to the whole stream.
34
+ // The invocation this report covers, taken from the run record that already holds the start time.
35
+ // A checkout whose git directory cannot be resolved has no record to read, which is the same
36
+ // undetermined answer an absent record gives — and neither one falls back to the whole stream.
37
37
  async function read_scope(): Promise<EventScope> {
38
38
  const directory = await run_carry.repository_directory()
39
39
 
@@ -3,13 +3,10 @@ import { run_event_scope, type EventScope } from '#scripts/run/event/run-event-s
3
3
  import { run_event_stream, type RunEvent } from '#scripts/run/event/run-event-stream'
4
4
 
5
5
  // The session-facing report generated *from* the run's event stream, rather than composed by hand each
6
- // time (joshuafolkken/kit#2249). #2205 gave the run a typed, ordered stream of what happened — a plan, a
7
- // launch, a merge, a park, a cut — and `format_event` already single-sources what one of those reads as.
8
- // What was never single-sourced is the report a person receives: `backlogrun-progress.md` defined the
9
- // epic completion summary in prose ("naming what was merged, what was parked and why, and what was
10
- // filed"), so the AI reassembled the wording every run and two runs' summaries never lined up.
6
+ // time, so two runs' summaries line up. The run has a typed, ordered stream of what happened — a plan,
7
+ // a launch, a merge, a park, a cut — and `format_event` single-sources what one of those reads as.
11
8
  //
12
- // **This is that generator, and it owns nothing `format_event` owns.** Each event line is `format_event`'s
9
+ // **This generator owns nothing `format_event` owns.** Each event line is `format_event`'s
13
10
  // verbatim — the merges, the parks with their reason in the text, the cuts — so the enumeration is the
14
11
  // stream rendered, not a second rendering of it. The only thing this adds is the release tail, which is
15
12
  // not on the stream: whether a release is owed is `release:scope`'s answer, appended once at the end.
@@ -18,15 +15,13 @@ import { run_event_stream, type RunEvent } from '#scripts/run/event/run-event-st
18
15
  // exactly what was printed, so the body a person reads off-screen and the summary a session shows are one
19
16
  // text with one generator — the "no second format" the acceptance criteria pin.
20
17
  //
21
- // **And it covers one invocation, not the whole stream** (joshuafolkken/kit#2393, reported a second time
22
- // after #2308 was closed with no fix behind it). The stream outlives an invocation by design — it is the
23
- // repository's event log, not this run's — so a generator handed every event renders every run that ever
24
- // appended one. Two days of merges arrived in one completion summary, and the Telegram body built from that
25
- // output was rejected for length, which is the failure the generated report exists to prevent. The scope is
18
+ // **And it covers one invocation, not the whole stream.** The stream outlives an invocation by design —
19
+ // it is the repository's event log, not this run's — so a generator handed every event renders every
20
+ // run that ever appended one, and a Telegram body built from that is rejected for length. The scope is
26
21
  // therefore an **input**: the caller answers which invocation this is, from the run record that already
27
22
  // holds the start time, and a scope nobody could determine prints a notice rather than everything. **The
28
- // scoping itself is `run-event-scope.ts`'s** (joshuafolkken/kit#2395), shared with every other stream
29
- // consumer rather than kept private here.
23
+ // scoping itself is `run-event-scope.ts`'s**, shared with every other stream consumer rather than kept
24
+ // private here.
30
25
 
31
26
  const LINE_SEPARATOR = '\n'
32
27
 
@@ -56,7 +51,7 @@ function release_tail(release: Decision): string | undefined {
56
51
  // The report: this invocation's events as `format_event`'s lines, then the release tail when there is one.
57
52
  // Handed the same events, scope and verdict it returns the same string, which is what the determinism test
58
53
  // pins — nothing here reads a clock or the environment. The scoping is `run-event-scope.ts`'s, shared with
59
- // every other stream consumer (joshuafolkken/kit#2395).
54
+ // every other stream consumer.
60
55
  function build_report(input: ReportInput): string {
61
56
  const scoped = run_event_scope.scoped_events(input.events, input.scope)
62
57
  const lines =
@@ -1,10 +1,10 @@
1
1
  import { hook_decision } from '#scripts/josh/hook-decision'
2
2
 
3
3
  // Whether a run owes its end-of-run retrospective, single-sourced so `run:step` and `backlog:drive`
4
- // never disagree on it (joshuafolkken/kit#2750): a drive that read "owed" where `run:step` read "not
5
- // owed" handed back at every drain to a session that had nothing to run.
4
+ // never disagree on it: a drive that read "owed" where `run:step` read "not owed" would hand back at
5
+ // every drain to a session that had nothing to run.
6
6
 
7
- // The opt-in switch that gates the retrospective (joshuafolkken/kit#2370). It defaults off, so an unset
7
+ // The opt-in switch that gates the retrospective. It defaults off, so an unset
8
8
  // variable owes no retrospective.
9
9
  const RETROSPECTIVE_ENV_KEY = 'JOSH_RETROSPECTIVE'
10
10
 
@@ -0,0 +1,42 @@
1
+ // The section report the composite commands share — `run:tail` and `ship` each run a fixed chain of
2
+ // steps and print every step's output under its own header. The section shape, the join and the
3
+ // clean/red verdict read off the collected codes are the same in both, so they live here once; what a
4
+ // composite adds on top (ship's `stopped at:` line, tail's stderr fold) stays in its own module.
5
+
6
+ const SECTION_SEPARATOR = '\n\n'
7
+
8
+ const SUCCESS_EXIT_CODE = 0
9
+ const FAILURE_EXIT_CODE = 1
10
+
11
+ interface Section {
12
+ header: string
13
+ body: string
14
+ code: number
15
+ }
16
+
17
+ function section_report(section: Section): string {
18
+ return `${section.header}\n${section.body}`
19
+ }
20
+
21
+ function format_sections(sections: ReadonlyArray<Section>): string {
22
+ return sections.map((section) => section_report(section)).join(SECTION_SEPARATOR)
23
+ }
24
+
25
+ // Non-zero when any step failed, exactly as each step exits on its own — a bundle where one step
26
+ // failed is never read as clean because the steps around it succeeded.
27
+ function exit_code_of(sections: ReadonlyArray<Section>): number {
28
+ const is_clean = sections.every((section) => section.code === SUCCESS_EXIT_CODE)
29
+
30
+ return is_clean ? SUCCESS_EXIT_CODE : FAILURE_EXIT_CODE
31
+ }
32
+
33
+ const run_section = {
34
+ FAILURE_EXIT_CODE,
35
+ SECTION_SEPARATOR,
36
+ SUCCESS_EXIT_CODE,
37
+ exit_code_of,
38
+ format_sections,
39
+ }
40
+
41
+ export type { Section }
42
+ export { run_section }
@@ -4,7 +4,7 @@ import { run_halfrun_resume } from './run-halfrun-resume'
4
4
  import { run_prrun_resume, type PrrunToken } from './run-prrun-resume'
5
5
  import { run_stage, type StageState } from './run-stage'
6
6
 
7
- // The reading half of the stage ladder (joshuafolkken/kit#3042): the facts `run_stage.state_of` folds
7
+ // The reading half of the stage ladder: the facts `run_stage.state_of` folds
8
8
  // into one state, each read from where the stage that produced it left it — never from the
9
9
  // conversation. A closed issue and the `run:planned` label come from GitHub; a `halfrun` stop and a `prrun`
10
10
  // stop come from the stop's own mark on the tree's hold (`run-halfrun-resume.ts`,
@@ -40,7 +40,7 @@ async function read_stop(
40
40
  }
41
41
 
42
42
  // An unreadable issue reads as neither closed nor planned: the ordinary entry that follows reads it
43
- // again and answers `unknown` for it, exactly as before the ladder existed.
43
+ // again and answers `unknown` for it.
44
44
  async function read_stage(issue: string): Promise<StageRead> {
45
45
  const [issue_read, stop] = await Promise.all([
46
46
  issue_state_cli.read_issue(issue),
@@ -1,4 +1,6 @@
1
- // joshuafolkken/kit#3042: the workflow commands form a ladder — `kickoff` → `halfrun` → `prrun` →
1
+ import { issue_cite } from '#scripts/issue/issue-cite'
2
+
3
+ // The workflow commands form a ladder — `kickoff` → `halfrun` → `prrun` →
2
4
  // `fullrun` — and **the command typed decides only how far a run goes; where it starts is read off the
3
5
  // issue**. A run that finds work already done resumes after it rather than redoing it, and a command
4
6
  // whose stopping point the issue has already reached reports that and stops.
@@ -19,7 +21,7 @@ const COMMANDS = [KICKOFF, HALFRUN, PRRUN, FULLRUN] as const
19
21
 
20
22
  type StageCommand = (typeof COMMANDS)[number]
21
23
 
22
- // What `run:entry` serves when no command is named — the one it served alone before the ladder existed.
24
+ // What `run:entry` serves when no command is named.
23
25
  const DEFAULT_COMMAND: StageCommand = FULLRUN
24
26
 
25
27
  const FRESH = 'fresh'
@@ -105,7 +107,7 @@ function next_commands(command: StageCommand): ReadonlyArray<StageCommand> {
105
107
 
106
108
  // The `Next:` line a stop's Telegram and report carry, e.g. `Next: prrun #<N> | fullrun #<N>`.
107
109
  function next_line(command: StageCommand, issue: string): string {
108
- const commands = next_commands(command).map((next) => `${next} #${issue}`)
110
+ const commands = next_commands(command).map((next) => `${next} ${issue_cite.plain(issue)}`)
109
111
 
110
112
  return `${NEXT_PREFIX}${commands.join(NEXT_SEPARATOR)}`
111
113
  }
@@ -113,7 +115,7 @@ function next_line(command: StageCommand, issue: string): string {
113
115
  function format_decision(issue: string, decision: StageDecision): string {
114
116
  const fields = [`at: ${decision.state}`, `to: ${decision.command}`, `start: ${decision.start}`]
115
117
 
116
- return `stage #${issue} — ${fields.join(' · ')}`
118
+ return `stage ${issue_cite.plain(issue)} — ${fields.join(' · ')}`
117
119
  }
118
120
 
119
121
  function cell(state: StageState, command: StageCommand): string {
@@ -1,12 +1,14 @@
1
1
  #!/usr/bin/env tsx
2
2
  import { fileURLToPath } from 'node:url'
3
3
  import { cost_cli, type CostVerdict } from '#scripts/cost-runtime/cost-cli'
4
+ import { issue_number_shape } from '#scripts/issue/issue-number-shape'
4
5
  import { issue_state_cli, type StateRead } from '#scripts/issue/issue-state-cli'
6
+ import { session_cite } from '#scripts/issue/session-cite'
5
7
  import { cli_flags } from '#scripts/lib/cli-flags'
6
8
  import { run_carry, type CarryRead } from '#scripts/run/carry/run-carry'
7
9
  import { run_status, type StatusParts } from './run-status'
8
10
 
9
- // `josh run:status <N>` — one call for the read-only status a run glances at (joshuafolkken/kit#2165):
11
+ // `josh run:status <N>` — one call for the read-only status a run glances at:
10
12
  // the issue's state and labels (`issue:state`), the session's hand-off verdict (`cost --cut`), and the
11
13
  // invocation's carry counters (`run:carry`). Each is reused rather than reproduced, and the two async
12
14
  // reads run concurrently, so three round trips become one.
@@ -19,7 +21,6 @@ import { run_status, type StatusParts } from './run-status'
19
21
  const SUCCESS_EXIT_CODE = 0
20
22
  const FAILURE_EXIT_CODE = 1
21
23
  const ARGV_OFFSET = 2
22
- const ISSUE_NUMBER_PATTERN = /^[1-9]\d*$/u
23
24
  const USAGE = 'Usage: josh run:status <issue-number> [--repo <owner/repo>]'
24
25
  const CARRY_NONE_NOTE = 'no run recorded here'
25
26
  const CARRY_UNREADABLE_NOTE = '(run record not bundled: unreadable)'
@@ -48,7 +49,7 @@ function valid_issue(positionals: ReadonlyArray<string>): string | undefined {
48
49
 
49
50
  if (first === undefined || rest.length > 0) return undefined
50
51
 
51
- return ISSUE_NUMBER_PATTERN.test(first) ? first : undefined
52
+ return issue_number_shape.ISSUE_NUMBER_PATTERN.test(first) ? first : undefined
52
53
  }
53
54
 
54
55
  function parse(argv: ReadonlyArray<string>): StatusRequest | undefined {
@@ -88,7 +89,7 @@ async function gather(request: StatusRequest): Promise<StatusReads> {
88
89
  // One note for a read that produced nothing, naming which of the two it was — the same distinction
89
90
  // `issue:state` keeps, so a bundled failure still tells a retry from an answer.
90
91
  function failure_note(issue_number: string, kind: string): string {
91
- return `(issue #${issue_number} not bundled: ${kind})`
92
+ return `(issue ${session_cite.issue(issue_number)} not bundled: ${kind})`
92
93
  }
93
94
 
94
95
  function carry_summary(carry: CarryRead): string {
@@ -145,8 +146,9 @@ async function run(argv: ReadonlyArray<string>): Promise<number> {
145
146
  }
146
147
 
147
148
  const reads = await gather(request)
149
+ const report = run_status.format_report(to_parts(request.issue_number, reads))
148
150
 
149
- console.info(run_status.format_report(to_parts(request.issue_number, reads)))
151
+ console.info(session_cite.text(report))
150
152
 
151
153
  return exit_code(reads)
152
154
  }
@@ -1,14 +1,13 @@
1
1
  import { issue_state, type IssueState } from '#scripts/issue/issue-state'
2
2
 
3
- // `josh run:status <N>` — the read-only status a run glances at, assembled into one report
4
- // (joshuafolkken/kit#2165). A run reads three independent facts to know where it stands — the issue's
5
- // own state, whether the session has crossed the hand-off budget, and its own carry counters — and
6
- // the procedure had it type `issue:state`, `cost --cut` and `run:carry` as three separate steps. This
7
- // joins the answers those three commands give, reusing each rather than reproducing it.
3
+ // `josh run:status <N>` — the read-only status a run glances at, assembled into one report.
4
+ // A run reads three independent facts to know where it stands — the issue's own state, whether the
5
+ // session has crossed the hand-off budget, and its own carry counters. This joins the answers
6
+ // `issue:state`, `cost --cut` and `run:carry` give, reusing each rather than reproducing it.
8
7
  //
9
8
  // **It is read-only, and that is the whole point** — the merge event has its own composite
10
- // (`run:merge`), and the pre-edit reads have theirs (`run:prep`); what was left was the passive glance
11
- // a resumed session or a non-merge decision takes, which must not write. `run:hold`'s claim and
9
+ // (`run:merge`), and the pre-edit reads have theirs (`run:prep`); this is the passive glance a resumed
10
+ // session or a non-merge decision takes, which must not write. `run:hold`'s claim and
12
11
  // `run:progress`'s clock mark are excluded for exactly that reason.
13
12
  //
14
13
  // The leading summary line carries the three facts on one line — the state, the cost verdict and the
@@ -13,10 +13,10 @@ import { run_headless } from './run-headless'
13
13
  import { run_prep, type PrepParts } from './run-prep'
14
14
  import { run_prep_cli } from './run-prep-cli'
15
15
  import { run_retrospective } from './run-retrospective'
16
- import { run_step, type StepInput } from './run-step'
16
+ import { run_step, type ParentInput, type StepInput } from './run-step'
17
17
 
18
- // `josh run:step <N>` — print the run's next single action, computed from the event stream, the carry
19
- // record and the issue state (joshuafolkken/kit#2248). It reads exactly those three, never the
18
+ // `josh run:step [<N>]` — print the run's next single action, computed from the event stream, the carry
19
+ // record and the issue state. It reads exactly those three, never the
20
20
  // conversation: the issue facts through `run:prep`'s own gather (so this and `run:next` never answer
21
21
  // from different reads), the newest event off the stream, and the carry record's kind. The reader runs
22
22
  // the printed line, returns the result through `run:event`, and asks again — the loop `run:step`
@@ -25,17 +25,19 @@ import { run_step, type StepInput } from './run-step'
25
25
  const SUCCESS_EXIT_CODE = 0
26
26
  const FAILURE_EXIT_CODE = 1
27
27
  const ARGV_OFFSET = 2
28
- const USAGE = 'Usage: josh run:step <issue-number>'
28
+ const USAGE =
29
+ 'Usage: josh run:step [<issue-number>] — without a number it answers for the `backlogrun` carry record this session drives'
29
30
 
30
31
  interface RunReads {
31
32
  carry_kind: CarryRead['kind']
32
33
  is_retrospective_done: boolean
33
34
  is_at_cut_cap: boolean
34
35
  is_handed_off: boolean
36
+ is_merge_owed: boolean
35
37
  last_event: string | undefined
36
38
  }
37
39
 
38
- // **A hand-off stops only the session that declared the record** (joshuafolkken/kit#2760). The record is
40
+ // **A hand-off stops only the session that declared the record**. The record is
39
41
  // one per repository, so a `fullrun #M` a person starts in a fresh conversation beside a `backlogrun`
40
42
  // waiting for its successor reads the same handed-off mark — and would be told to stop on every step.
41
43
  // The owner is `--owner "$PPID"`, an ancestor of this process only in the session that took the cut.
@@ -50,6 +52,7 @@ const UNREADABLE_RUN: RunReads = {
50
52
  is_retrospective_done: false,
51
53
  is_at_cut_cap: false,
52
54
  is_handed_off: false,
55
+ is_merge_owed: false,
53
56
  last_event: undefined,
54
57
  }
55
58
 
@@ -65,23 +68,18 @@ function read_run(
65
68
  const carry = run_carry.read_carry(run_carry.carry_path(directory))
66
69
  const events = run_event_stream.read_events(run_event_stream.target_of(directory))
67
70
  // The last event *within this invocation's scope*, not the raw newest one: a stale event a previous
68
- // invocation left on the stream must not be read as this run's position (joshuafolkken/kit#2395). The
69
- // observed defect was a `run:step` that printed `wait` on a fresh run because an old `child-launch` was
70
- // still the stream's tail. Another issue's detached ship supervisor is left out the same way
71
- // (joshuafolkken/kit#2428), and so — for a lane child — is every event that does not name its own issue
72
- // (joshuafolkken/kit#3039).
73
- const last = run_event_scope.last_issue_event(
74
- events,
75
- run_event_scope.scope_of(carry),
76
- issue_number,
77
- is_lane_child,
78
- )
71
+ // invocation left on the stream — an old `child-launch`, say — must not be read as this run's
72
+ // position. Another issue's detached ship supervisor is left out the same way, and so — for a lane
73
+ // child — is every event that does not name its own issue.
74
+ const scope = run_event_scope.scope_of(carry)
75
+ const last = run_event_scope.last_issue_event(events, scope, issue_number, is_lane_child)
79
76
 
80
77
  return {
81
78
  carry_kind: carry.kind,
82
79
  is_retrospective_done: run_carry.retrospective_done_of(carry),
83
- is_at_cut_cap: carry.kind === 'carried' && run_carry.is_at_cut_cap(carry.carry),
80
+ is_at_cut_cap: carry.kind === 'carried' && run_headless.is_cut_capped(carry.carry),
84
81
  is_handed_off: is_handed_off_here(carry),
82
+ is_merge_owed: run_event_scope.is_merge_owed(events, scope, issue_number),
85
83
  last_event: last?.kind,
86
84
  }
87
85
  }
@@ -102,6 +100,7 @@ function step_input(parts: PrepParts, run_reads: RunReads, is_lane_child: boolea
102
100
  is_retrospective_done: run_reads.is_retrospective_done,
103
101
  is_at_cut_cap: run_reads.is_at_cut_cap,
104
102
  is_handed_off: run_reads.is_handed_off,
103
+ is_merge_owed: run_reads.is_merge_owed,
105
104
  is_lane_child,
106
105
  is_consumer: doctor_consumer.is_kit_consumer(find_package_directory(process.cwd())),
107
106
  // Read here rather than in `run-step.ts` so the position logic stays a pure function of its input.
@@ -120,7 +119,54 @@ async function gather(issue_number: string): Promise<Gathered> {
120
119
  return { input: step_input(parts, run_reads, is_lane_child), ship_problems: parts.ship_problems }
121
120
  }
122
121
 
122
+ const UNREADABLE_CARRY: CarryRead = { kind: 'unreadable' }
123
+
124
+ // The parent's own position — a run asked about with no issue. The last event is the run's newest in
125
+ // scope, whichever issue it names: a parent is positioned by the whole batch, never by one child.
126
+ function parent_reads(directory: string): Pick<ParentInput, 'carry_kind' | 'last_event'> & {
127
+ carry: CarryRead
128
+ } {
129
+ const carry = run_carry.read_carry(run_carry.carry_path(directory))
130
+ const events = run_event_stream.read_events(run_event_stream.target_of(directory))
131
+ const last = run_event_scope.last_scoped_event(events, run_event_scope.scope_of(carry))
132
+
133
+ return { carry, carry_kind: carry.kind, last_event: last?.kind }
134
+ }
135
+
136
+ function parent_input(directory: string | undefined): ParentInput {
137
+ const { carry, ...position } =
138
+ directory === undefined
139
+ ? { carry: UNREADABLE_CARRY, carry_kind: UNREADABLE_CARRY.kind, last_event: undefined }
140
+ : parent_reads(directory)
141
+
142
+ return {
143
+ ...position,
144
+ is_driving: run_headless.driven_here(carry, lane_reap.own_ancestry) !== undefined,
145
+ is_handed_off: is_handed_off_here(carry),
146
+ is_at_cut_cap: carry.kind === 'carried' && run_headless.is_cut_capped(carry.carry),
147
+ is_lane_child: lane_child_marker.is_child_of(process.cwd()),
148
+ is_retrospective_done: run_carry.retrospective_done_of(carry),
149
+ is_consumer: doctor_consumer.is_kit_consumer(find_package_directory(process.cwd())),
150
+ is_retrospective_enabled: run_retrospective.is_enabled(),
151
+ }
152
+ }
153
+
154
+ // `unknown` is the one answer with nothing to run — no record this session drives — so it exits non-zero
155
+ // with the usage, exactly as a position missing its issue state does.
156
+ async function run_parent(): Promise<number> {
157
+ const { line } = run_step.parent_action(parent_input(await run_carry.repository_directory()))
158
+
159
+ console.info(line)
160
+ if (line !== run_step.UNKNOWN) return SUCCESS_EXIT_CODE
161
+
162
+ console.error(USAGE)
163
+
164
+ return FAILURE_EXIT_CODE
165
+ }
166
+
123
167
  async function run(argv: ReadonlyArray<string>): Promise<number> {
168
+ if (argv.length === 0) return await run_parent()
169
+
124
170
  const issue_number = run_prep_cli.parse_number(argv)
125
171
 
126
172
  if (issue_number === undefined) {
@@ -132,7 +178,7 @@ async function run(argv: ReadonlyArray<string>): Promise<number> {
132
178
  const { input, ship_problems } = await gather(issue_number)
133
179
 
134
180
  console.info(run_step.next_action(input).line)
135
- // On stderr, so stdout stays the one action line (joshuafolkken/kit#3154): what `josh ship` would
181
+ // On stderr, so stdout stays the one action line: what `josh ship` would
136
182
  // refuse on is said at every step, while it is still cheap to meet.
137
183
  if (ship_problems.length > 0) console.error(run_prep.ship_body(ship_problems))
138
184