@joshuafolkken/kit 1.1240.0 → 1.1370.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 +50 -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 +29 -47
  44. package/SECURITY.md +1 -1
  45. package/dist/CLAUDE.md +10 -61
  46. package/dist/commands/document-section-cli.js +42 -10
  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-43G45XJF.js} +18 -20
  51. package/dist/hooks/{chunk-4TZVB44A.js → chunk-4TW4MQUL.js} +284 -362
  52. package/dist/hooks/{chunk-XZYKEM6J.js → chunk-76RK6E3H.js} +13 -11
  53. package/dist/hooks/{chunk-F3ELQ2AF.js → chunk-DZWZ3DKY.js} +4 -4
  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-ZQGD4GBY.js → chunk-KPM4YIIX.js} +8 -44
  57. package/dist/hooks/chunk-MXVQMLDP.js +3705 -0
  58. package/dist/hooks/{chunk-ELCN5LCH.js → chunk-NEC4AT4Z.js} +34 -12
  59. package/dist/hooks/{chunk-QVSWU24O.js → chunk-NZBHG6FW.js} +7 -5
  60. package/dist/hooks/chunk-NZN2UFI6.js +2409 -0
  61. package/dist/hooks/{chunk-KRBERBBI.js → chunk-R6CRQEAL.js} +4 -4
  62. package/dist/hooks/chunk-SYSRHRWU.js +1589 -0
  63. package/dist/hooks/{chunk-WK2XSHSI.js → chunk-TLJYAGZK.js} +549 -874
  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 +216 -202
  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 +281 -94
  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 +16 -10
  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 +26 -2
  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 +20 -6
  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/cspell-cached.ts +1 -1
  560. package/scripts/lint/cycle-recheck.ts +122 -0
  561. package/scripts/lint/format.ts +1 -2
  562. package/scripts/lint/lint-parallel.ts +34 -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 +5 -6
  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 +25 -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 +13 -15
  801. package/scripts/run/run-step.ts +58 -47
  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
@@ -3,8 +3,8 @@ import { fileURLToPath } from 'node:url'
3
3
  import { backlog_stalled } from './backlog-stalled'
4
4
  import { backlog_stalled_detect } from './backlog-stalled-detect'
5
5
 
6
- // `josh backlog:stalled` — read the three conditions once and print the verdict
7
- // (joshuafolkken/kit#2359). This is the manual and testable face of the detector `stop-guard.ts` runs
6
+ // `josh backlog:stalled` — read the three conditions once and print the verdict.
7
+ // This is the manual and testable face of the detector `stop-guard.ts` runs
8
8
  // on every stop; both call the one `detect_and_report`, so the command and the hook can never drift.
9
9
  //
10
10
  // **It reports, it never stops.** The exit code is always success — a stall is a state to surface, not
@@ -4,7 +4,7 @@ import { run_event_stream_emit } from '#scripts/run/event/run-event-stream-emit'
4
4
  import { backlog_ready, type ReadyPorts } from './backlog-ready'
5
5
  import { backlog_stalled, type StallReading, type StallVerdict } from './backlog-stalled'
6
6
 
7
- // The I/O half of the stall detector (joshuafolkken/kit#2359): it gathers the three counts the pure
7
+ // The I/O half of the stall detector: it gathers the three counts the pure
8
8
  // judge in `backlog-stalled.ts` weighs, then — on a stall — leaves the marker and sends the one
9
9
  // notification. `stop-guard.ts` wires it into the Stop hook, so it runs at each loop boundary; the CLI
10
10
  // exposes the same call for a person to run by hand.
@@ -37,8 +37,8 @@ interface DetectPorts {
37
37
  }
38
38
 
39
39
  // The free-lane and runnable-issue reads are `backlog-ready.ts`'s — the watcher's ready line reads the
40
- // same two, so they live once there (joshuafolkken/kit#2452) — and a caller that reads them again after
41
- // this check hands its own ports in, so the two share one reading (joshuafolkken/kit#2472).
40
+ // same two, so they live once there — and a caller that reads them again after
41
+ // this check hands its own ports in, so the two share one reading.
42
42
  function ready_count_of(ready: ReadyPorts): () => Promise<number> {
43
43
  return async function (): Promise<number> {
44
44
  const issues = await ready.ready_issues()
@@ -48,7 +48,7 @@ function ready_count_of(ready: ReadyPorts): () => Promise<number> {
48
48
  }
49
49
 
50
50
  // One stall per episode, and the episode ends at a dispatch rather than at whatever event lands next
51
- // (joshuafolkken/kit#2464) — every parallel lane appends to this stream, so a newest-event dedup re-fired.
51
+ // — every parallel lane appends to this stream, so a newest-event dedup re-fired.
52
52
  async function real_emit_stall(text: string): Promise<boolean> {
53
53
  const { STALL, CHILD_LAUNCH } = run_event_stream.EVENT_KIND
54
54
 
@@ -1,8 +1,9 @@
1
1
  import { epic_triage } from '#scripts/epic/epic-triage'
2
+ import { issue_number_shape } from '#scripts/issue/issue-number-shape'
2
3
  import { run_event_stream, type RunEvent } from '#scripts/run/event/run-event-stream'
3
4
 
4
- // When ready backlog work sits undispatched while lanes are free, nobody notices until a person asks
5
- // (joshuafolkken/kit#2359). This is the mechanical judge of that state: three facts read, never
5
+ // When ready backlog work sits undispatched while lanes are free, nobody notices until a person asks.
6
+ // This is the mechanical judge of that state: three facts read, never
6
7
  // weighed — is there runnable work, is there a free lane, and has nothing been dispatched for a while.
7
8
  // The verdict is a report, not a stop: a false positive costs one notification, never a halted run.
8
9
  //
@@ -86,8 +87,6 @@ function describe(reading: StallReading): string {
86
87
  return `${String(reading.ready_count)} ready, ${String(reading.free_lanes)} free lane(s), ${String(minutes)}m since the last dispatch`
87
88
  }
88
89
 
89
- const NUMERIC_TOKEN = /^\d+$/u
90
-
91
90
  // The runnable issue numbers `backlog:next` printed: one token per line, a bare number per runnable
92
91
  // issue and a verdict word (`wait`, `stop`, …) when there is none — so the numeric lines are the ready
93
92
  // issues.
@@ -95,14 +94,14 @@ function ready_tokens(out: string): ReadonlyArray<string> {
95
94
  return out
96
95
  .split('\n')
97
96
  .map((token) => token.trim())
98
- .filter((token) => NUMERIC_TOKEN.test(token))
97
+ .filter((token) => issue_number_shape.is_issue_number(token))
99
98
  }
100
99
 
101
100
  function count_ready_tokens(out: string): number {
102
101
  return ready_tokens(out).length
103
102
  }
104
103
 
105
- // Whether `backlog:next` answered `triage` (joshuafolkken/kit#2779): no number is runnable, yet a session
104
+ // Whether `backlog:next` answered `triage`: no number is runnable, yet a session
106
105
  // has work — judging the untriaged issues — so a reader of the numeric lines alone would take it for an
107
106
  // empty pool.
108
107
  function needs_triage(out: string): boolean {
@@ -12,16 +12,16 @@ import {
12
12
  import { backlog_plan, type PlanContext } from './backlog-plan'
13
13
  import { backlog_rank, type GateScope } from './backlog-rank'
14
14
 
15
- // The order a `backlogrun` takes, wave by wave, before it starts (joshuafolkken/kit#2778).
15
+ // The order a `backlogrun` takes, wave by wave, before it starts.
16
16
  //
17
17
  // `backlog:next` answers one ask — what may start now — and `backlog:plan` shows the pool that ask is
18
18
  // made from, so the order past the first answer was left for a person to work out by hand. This plays
19
19
  // the asks forward under one assumption: **every issue of a wave merges before the next wave starts**.
20
20
  //
21
21
  // **No rule is written twice.** The first wave is `backlog_rank.select` — rank, `run:solo` gate,
22
- // restructure separation, cap —
22
+ // overlap separation, cap —
23
23
  // over the very candidates `backlog:next` resolves, asked of an idle repository — so it is what
24
- // `backlog:next` prints when nothing is running (joshuafolkken/kit#2928). Each later wave marks the earlier waves closed and re-classifies the same pool
24
+ // `backlog:next` prints when nothing is running. Each later wave marks the earlier waves closed and re-classifies the same pool
25
25
  // through `epic_classify.classify_children` with the resolver `epic:next` sorted it with the first
26
26
  // time — `epic_cross_repo.resolve_cross_repo`, so a blocker in another repository still waits for its
27
27
  // release rather than counting as done on close — then puts the runnable set through
@@ -109,7 +109,7 @@ function next_wave(pool: WavePool, done: ReadonlySet<string>): ReadonlyArray<Epi
109
109
 
110
110
  // Each wave is closed before the next is asked for; a wave that offers nothing ends the plan, which
111
111
  // the pool's size bounds because every wave closes at least one child. `scope` names the rows the
112
- // offer's cap bounds and the paths each issue restructures; left empty, no wave is capped or separated.
112
+ // offer's cap bounds and the paths each issue declares; left empty, no wave is capped or separated.
113
113
  function build(result: EpicNextResult, repo: string, scope: GateScope = EMPTY_SCOPE): WavePlan {
114
114
  const pool = pool_of(result, repo, scope)
115
115
  const done = new Set<string>()
@@ -0,0 +1,74 @@
1
+ import type { AgentProvider } from '#scripts/agent/agent-role-profile'
2
+ import { issue_number_shape } from '#scripts/issue/issue-number-shape'
3
+ import { run_invocation } from '#scripts/run/run-invocation'
4
+
5
+ // `josh backlogrun`'s arguments. `--agent claude|codex` picks the agent the run
6
+ // is started in; everything else is the `backlogrun` invocation itself, read by `run-invocation.ts`'s
7
+ // grammar — the one the carry record and the woken session read — so the launcher accepts exactly what a
8
+ // typed `backlogrun` would carry, and the text the agent is handed is the grammar's rebuild of it.
9
+ //
10
+ // **A bare number is an issue.** A shell reads an unquoted `#3437` as a comment, so `3437` in the named
11
+ // list is taken as `#3437`; a number after the first flag is that flag's value and is left alone.
12
+
13
+ const AGENT_FLAG = '--agent'
14
+ const BACKLOG_COMMAND = 'backlogrun'
15
+ const ISSUE_PREFIX = '#'
16
+ const FLAG_PREFIX = '-'
17
+ const NOT_FOUND = -1
18
+ const FLAG_AND_VALUE = 2
19
+ const AGENTS: Readonly<Record<string, AgentProvider>> = { claude: 'anthropic', codex: 'openai' }
20
+ const DEFAULT_AGENT = 'claude'
21
+
22
+ interface BacklogrunArguments {
23
+ provider: AgentProvider
24
+ // The canonical `backlogrun …` text the agent is started with.
25
+ invocation: string
26
+ issues: ReadonlyArray<number>
27
+ }
28
+
29
+ type ArgumentsResult = { kind: 'args'; args: BacklogrunArguments } | { kind: 'refused' }
30
+
31
+ interface AgentSplit {
32
+ agent: string | undefined
33
+ rest: ReadonlyArray<string>
34
+ }
35
+
36
+ // `--agent` and its value out of the list; a second `--agent` stays in and the grammar refuses it.
37
+ function split_agent(argv: ReadonlyArray<string>): AgentSplit {
38
+ const at = argv.indexOf(AGENT_FLAG)
39
+
40
+ if (at === NOT_FOUND) return { agent: DEFAULT_AGENT, rest: argv }
41
+
42
+ const after = at + FLAG_AND_VALUE
43
+
44
+ return { agent: argv[at + 1], rest: [...argv.slice(0, at), ...argv.slice(after)] }
45
+ }
46
+
47
+ function issue_token(token: string): string {
48
+ return issue_number_shape.ISSUE_NUMBER_PATTERN.test(token) ? `${ISSUE_PREFIX}${token}` : token
49
+ }
50
+
51
+ // The named list is the leading block before the first flag, as the grammar reads it.
52
+ function normalized(rest: ReadonlyArray<string>): Array<string> {
53
+ const stop = rest.findIndex((token) => token.startsWith(FLAG_PREFIX))
54
+ const split_at = stop === NOT_FOUND ? rest.length : stop
55
+
56
+ return [...rest.slice(0, split_at).map((token) => issue_token(token)), ...rest.slice(split_at)]
57
+ }
58
+
59
+ function parse(argv: ReadonlyArray<string>): ArgumentsResult {
60
+ const { agent, rest } = split_agent(argv)
61
+ const provider = agent === undefined ? undefined : AGENTS[agent]
62
+ const invocation = run_invocation.rebuild([BACKLOG_COMMAND, ...normalized(rest)].join(' '))
63
+
64
+ if (provider === undefined || invocation === undefined) return { kind: 'refused' }
65
+
66
+ const issues = run_invocation.issue_numbers(invocation) ?? []
67
+
68
+ return { kind: 'args', args: { provider, invocation, issues } }
69
+ }
70
+
71
+ const backlogrun_args = { parse }
72
+
73
+ export type { BacklogrunArguments }
74
+ export { backlogrun_args }
@@ -0,0 +1,113 @@
1
+ #!/usr/bin/env tsx
2
+ import path from 'node:path'
3
+ import { fileURLToPath } from 'node:url'
4
+ import { josh_environment_file } from '#scripts/josh/josh-environment-file'
5
+ import { run_board_cli } from '#scripts/run/board/run-board-cli'
6
+ import { run_carry } from '#scripts/run/carry/run-carry'
7
+ import { backlogrun_args, type BacklogrunArguments } from './backlogrun-args'
8
+ import { backlogrun_launch, type LaunchTarget, type StartResult } from './backlogrun-launch'
9
+
10
+ // `josh backlogrun` — start a `backlogrun` from the terminal and watch it. A
11
+ // run already going is never joined by a second one: the board is shown, and any issue named is pointed
12
+ // at `run:add` rather than added behind the person's back. Otherwise the agent is started in the
13
+ // background, its output to a log file, and the board takes over the terminal at once. Closing the
14
+ // board closes only the board.
15
+
16
+ const ARGV_OFFSET = 2
17
+ const FAILURE_EXIT_CODE = 1
18
+ const USAGE =
19
+ 'Usage: josh backlogrun [#<n>...] [--only] [--max <n>] [--idle <minutes>] [--agent claude|codex]'
20
+
21
+ interface BacklogrunPorts {
22
+ repository_directory: () => Promise<string | undefined>
23
+ is_running: (git_directory: string) => boolean
24
+ start: (args: BacklogrunArguments, target: LaunchTarget) => StartResult
25
+ show_board: () => Promise<number>
26
+ write: (line: string) => void
27
+ }
28
+
29
+ const LIVE_PORTS: BacklogrunPorts = {
30
+ repository_directory: run_carry.repository_directory,
31
+ is_running: backlogrun_launch.is_running,
32
+ start: (args, target) => backlogrun_launch.start(args.invocation, args.provider, target),
33
+ show_board: async () => await run_board_cli.run([]),
34
+ write: (line) => process.stdout.write(`${line}\n`),
35
+ }
36
+
37
+ function running_notes(issues: ReadonlyArray<number>): Array<string> {
38
+ const additions = issues.map((issue) => ` pnpm josh run:add ${String(issue)}`)
39
+ const guidance = additions.length > 0 ? ['To add the named issues to it:', ...additions] : []
40
+
41
+ return ['backlogrun: a run is already going; showing its board.', ...guidance]
42
+ }
43
+
44
+ function launched_note(result: Extract<StartResult, { kind: 'launched' }>): string {
45
+ const { pid, session, log_path } = result.launched
46
+ const session_part = session === undefined ? '' : `, session ${session}`
47
+
48
+ return `backlogrun: started (pid ${String(pid)}${session_part}); log ${log_path}`
49
+ }
50
+
51
+ // The agent starts in the main checkout, the parent of the common git directory every record is keyed on.
52
+ function target_of(git_directory: string): LaunchTarget {
53
+ return { worktree: path.dirname(git_directory), git_directory }
54
+ }
55
+
56
+ async function begin(
57
+ args: BacklogrunArguments,
58
+ git_directory: string,
59
+ ports: BacklogrunPorts,
60
+ ): Promise<number> {
61
+ if (ports.is_running(git_directory)) {
62
+ for (const note of running_notes(args.issues)) ports.write(note)
63
+
64
+ return await ports.show_board()
65
+ }
66
+
67
+ const result = ports.start(args, target_of(git_directory))
68
+
69
+ if (result.kind === 'failed') {
70
+ ports.write(`backlogrun: could not start: ${result.note}`)
71
+
72
+ return FAILURE_EXIT_CODE
73
+ }
74
+
75
+ ports.write(launched_note(result))
76
+
77
+ return await ports.show_board()
78
+ }
79
+
80
+ async function run(
81
+ argv: ReadonlyArray<string>,
82
+ ports: BacklogrunPorts = LIVE_PORTS,
83
+ ): Promise<number> {
84
+ const parsed = backlogrun_args.parse(argv)
85
+
86
+ if (parsed.kind === 'refused') {
87
+ ports.write(USAGE)
88
+
89
+ return FAILURE_EXIT_CODE
90
+ }
91
+
92
+ const git_directory = await ports.repository_directory()
93
+
94
+ if (git_directory === undefined) {
95
+ ports.write('backlogrun: not inside a git repository')
96
+
97
+ return FAILURE_EXIT_CODE
98
+ }
99
+
100
+ return await begin(parsed.args, git_directory, ports)
101
+ }
102
+
103
+ const backlogrun_cli = { run }
104
+
105
+ // `.env` is read inside the guard, as `run:board` reads it, so the board draws in the person's
106
+ // `JOSH_SESSION_LANG` while the unit tests see no developer's `.env`.
107
+ if (process.argv[1] === fileURLToPath(import.meta.url)) {
108
+ josh_environment_file.load_environment_file()
109
+ process.exitCode = await run(process.argv.slice(ARGV_OFFSET))
110
+ }
111
+
112
+ export type { BacklogrunPorts }
113
+ export { backlogrun_cli }
@@ -0,0 +1,178 @@
1
+ import { randomUUID } from 'node:crypto'
2
+ import { agent_argv, type AgentArgvResult } from '#scripts/agent/agent-argv'
3
+ import {
4
+ agent_role_profile,
5
+ type AgentEnvironment,
6
+ type AgentProvider,
7
+ } from '#scripts/agent/agent-role-profile'
8
+ import { agent_session_environment } from '#scripts/josh/agent-session-environment'
9
+ import { process_identity } from '#scripts/josh/process-identity'
10
+ import { stamp_file } from '#scripts/josh/stamp-file'
11
+ import { json_value } from '#scripts/lib/json-value'
12
+ import { run_carry, type CarryRead } from '#scripts/run/carry/run-carry'
13
+ import { detached_launch, type LaunchResult } from '#scripts/run/detached-launch'
14
+ import { run_headless } from '#scripts/run/run-headless'
15
+ import { z } from 'zod'
16
+
17
+ // How `josh backlogrun` starts a `backlogrun` parent in the background, and how
18
+ // it tells one is already running so a second is never started beside it.
19
+ //
20
+ // **Running is two records, not one.** A parent claims the carry record a little after it starts, so
21
+ // between the launch and the claim only the launch record this file writes says a run is coming; once
22
+ // the claim is made the carry record's owner is what answers. Either one live is a run.
23
+ //
24
+ // **The agent is the person's choice, not the shell's.** The provider is resolved from an environment
25
+ // with every agent-session key cleared and the choice handed in, so a command typed inside a Claude Code
26
+ // session can still start a Codex parent. The same choice is handed to the parent as
27
+ // `JOSH_AGENT_PROVIDER`, the key a detached child with no session of its own resolves from.
28
+
29
+ const LAUNCH_PREFIX = 'josh-backlogrun-launch-'
30
+ const LOG_PREFIX = 'josh-backlogrun-log-'
31
+ const LOG_SUFFIX = '.log'
32
+
33
+ const launch_schema = z.object({
34
+ pid: z.number(),
35
+ start: z.string().optional(),
36
+ session: z.string().optional(),
37
+ })
38
+
39
+ type LaunchRecord = z.infer<typeof launch_schema>
40
+
41
+ interface LaunchTarget {
42
+ // The checkout the parent runs in, and its common git directory the records are keyed on.
43
+ worktree: string
44
+ git_directory: string
45
+ }
46
+
47
+ interface Launched {
48
+ pid: number
49
+ session: string | undefined
50
+ log_path: string
51
+ }
52
+
53
+ type StartResult = { kind: 'launched'; launched: Launched } | { kind: 'failed'; note: string }
54
+
55
+ function launch_path(git_directory: string): string {
56
+ return stamp_file.stamp_path(LAUNCH_PREFIX, git_directory)
57
+ }
58
+
59
+ function log_path(git_directory: string): string {
60
+ return stamp_file.stamp_path(LOG_PREFIX, git_directory, LOG_SUFFIX)
61
+ }
62
+
63
+ function read_launch(target: string): LaunchRecord | undefined {
64
+ return json_value.parse_with(stamp_file.read_stamp_text(target) ?? '', launch_schema)
65
+ }
66
+
67
+ // The launched parent is still the process it was: a pid reused by another process is not a run.
68
+ function is_launch_live(record: LaunchRecord | undefined): boolean {
69
+ if (record === undefined) return false
70
+
71
+ return process_identity.is_same_process(record.pid, record.start) !== false
72
+ }
73
+
74
+ function is_carry_live(read: CarryRead): boolean {
75
+ return read.kind === 'carried' && run_carry.is_owner_live(read.carry)
76
+ }
77
+
78
+ function is_running(git_directory: string): boolean {
79
+ if (is_carry_live(run_carry.read_carry(run_carry.carry_path(git_directory)))) return true
80
+
81
+ return is_launch_live(read_launch(launch_path(git_directory)))
82
+ }
83
+
84
+ // The environment the chosen provider resolves from, whatever session this command was typed in.
85
+ function chosen_environment(
86
+ provider: AgentProvider,
87
+ environment: AgentEnvironment = process.env,
88
+ ): AgentEnvironment {
89
+ return {
90
+ ...environment,
91
+ ...agent_session_environment.removed_environment(environment),
92
+ [agent_role_profile.CODEX_SESSION_KEY]: undefined,
93
+ [agent_role_profile.HANDED_PROVIDER_KEY]: provider,
94
+ }
95
+ }
96
+
97
+ // Only a Claude parent takes a forced session id, so only it can be resumed by one later.
98
+ function session_for(provider: AgentProvider): string | undefined {
99
+ return provider === 'anthropic' ? randomUUID() : undefined
100
+ }
101
+
102
+ function argv_of(
103
+ invocation: string,
104
+ provider: AgentProvider,
105
+ worktree: string,
106
+ session: string | undefined,
107
+ ): AgentArgvResult {
108
+ const environment = chosen_environment(provider)
109
+ const resolved = agent_role_profile.resolve(agent_role_profile.SCHEDULER, environment)
110
+
111
+ if (resolved.kind === 'rejected') return resolved
112
+
113
+ return agent_argv.with_profile_in(invocation, resolved.profile, worktree, session)
114
+ }
115
+
116
+ function note_to_stderr(note: string): void {
117
+ console.error(`backlogrun: ${note}`)
118
+ }
119
+
120
+ function record_launch(git_directory: string, pid: number, session: string | undefined): void {
121
+ const started = process_identity.read_start(pid)
122
+
123
+ stamp_file.replace_stamp(launch_path(git_directory), { pid, start: started, session })
124
+ }
125
+
126
+ // The headless mark holds the parent's turn open while its lanes run, as `run:wake`'s does. The launch
127
+ // strips only Claude's session keys, so a Codex session this was typed in is cleared here too — inherited,
128
+ // it would make the parent's own `josh` commands resolve the wrong provider.
129
+ function spawn_parent(
130
+ argv: Extract<AgentArgvResult, { kind: 'argv' }>,
131
+ provider: AgentProvider,
132
+ target: LaunchTarget,
133
+ ): LaunchResult {
134
+ const environment = {
135
+ ...run_headless.environment(),
136
+ [agent_role_profile.CODEX_SESSION_KEY]: undefined,
137
+ [agent_role_profile.HANDED_PROVIDER_KEY]: provider,
138
+ }
139
+ const log = log_path(target.git_directory)
140
+
141
+ return detached_launch.launch(
142
+ {
143
+ argv: argv.argv,
144
+ cwd: target.worktree,
145
+ env: environment,
146
+ log_path: log,
147
+ profile: argv.profile,
148
+ },
149
+ note_to_stderr,
150
+ )
151
+ }
152
+
153
+ function start(invocation: string, provider: AgentProvider, target: LaunchTarget): StartResult {
154
+ const session = session_for(provider)
155
+ const built = argv_of(invocation, provider, target.worktree, session)
156
+
157
+ if (built.kind === 'rejected') return { kind: 'failed', note: built.note }
158
+
159
+ const result = spawn_parent(built, provider, target)
160
+
161
+ if (result.kind === 'failed') return result
162
+
163
+ record_launch(target.git_directory, result.pid, session)
164
+
165
+ const launched = { pid: result.pid, session, log_path: log_path(target.git_directory) }
166
+
167
+ return { kind: 'launched', launched }
168
+ }
169
+
170
+ const backlogrun_launch = {
171
+ argv_of,
172
+ chosen_environment,
173
+ is_running,
174
+ start,
175
+ }
176
+
177
+ export type { Launched, LaunchTarget, StartResult }
178
+ export { backlogrun_launch }
@@ -4,15 +4,13 @@ import {
4
4
  } from '#scripts/time-runtime/time-transcript-line'
5
5
 
6
6
  // Verifying an agent's behavior against the transcripts every run already writes, with no live
7
- // Claude session and no model call (joshuafolkken/kit#2365).
7
+ // Claude session and no model call.
8
8
  //
9
- // **The mechanism that measured behavior used to be the completion gate's own, and it was removed
10
- // for being slow rather than for being wrong.** joshuafolkken/kit#1922 took `josh eval`'s five
11
- // scenarios out of the gate because each starts a real Claude session, so the step never ran without
12
- // `JOSH_EVAL` and paid a prompt-and-report cost every run for nothing. What it left behind is a gate
13
- // that proves the *machinery* works — 8,000-odd unit tests — and nothing at all that proves the
14
- // agent *behaves*. This is the half worth keeping, separated from the half worth removing: an
15
- // assertion read off a recorded transcript is deterministic, re-runnable and never calls a model.
9
+ // **`josh eval`'s scenarios stay out of the completion gate for being slow rather than for being
10
+ // wrong**: each starts a real Claude session. Without them the gate would prove only that the
11
+ // *machinery* works and nothing at all that the agent *behaves*. This module is the half of eval
12
+ // worth keeping: an assertion read off a recorded transcript is deterministic, re-runnable and never
13
+ // calls a model.
16
14
  //
17
15
  // **The reading is single-sourced, not re-implemented.** One transcript line is parsed by
18
16
  // `time-transcript-line.ts` — the reader the span walk and the guards already use — and the files are
@@ -6,7 +6,7 @@ import { behavior_assertion, type Violation } from './behavior-assertion'
6
6
  import { behavior_rules } from './behavior-rules'
7
7
 
8
8
  // `josh behavior` — check the current run's recorded transcript against the behavior assertions and
9
- // report where any broke (joshuafolkken/kit#2365). It runs inside `pnpm josh gate`, calls no model,
9
+ // report where any broke. It runs inside `pnpm josh gate`, calls no model,
10
10
  // and reads one file: the session it is running in.
11
11
  //
12
12
  // **The scope is the current run, not the whole corpus.** The store holds thousands of transcripts
@@ -3,7 +3,7 @@ import { time_shell } from '#scripts/time-runtime/time-shell'
3
3
  import type { Block, TranscriptLine } from '#scripts/time-runtime/time-transcript-line'
4
4
  import type { Assertion, Finding } from './behavior-assertion'
5
5
 
6
- // The behavior assertions checked against recorded transcripts (joshuafolkken/kit#2365). This is the
6
+ // The behavior assertions checked against recorded transcripts. This is the
7
7
  // **seed set** — the issue's own plan is to land one rule that is green across the recorded corpus,
8
8
  // then add more one at a time, each verified green before it joins. Starting with many would land a
9
9
  // wall of red that says nothing about which behavior actually regressed.
@@ -14,7 +14,7 @@ const COMMAND_KEY = 'command'
14
14
  const FIRST_POSITION_OFFSET = 1
15
15
  const TOOL_RESULT = 'tool_result'
16
16
  // The openings of the two results that mean a Bash call never ran: the permission layer's refusal,
17
- // and a PreToolUse hook's block (joshuafolkken/kit#3197). A PostToolUse hook error is deliberately
17
+ // and a PreToolUse hook's block. A PostToolUse hook error is deliberately
18
18
  // absent — that hook fires after the command has already run.
19
19
  const DENIED_BASH_PREFIXES = [
20
20
  'Permission to use Bash with command ',
@@ -65,7 +65,7 @@ function command_of(block: Block): string | undefined {
65
65
  // subcommand and is not a dry run. Each `;`/`&&`/`|`-separated segment is judged on its own, so a
66
66
  // mutation anywhere in a chain is caught while a mention inside another command's argument is not.
67
67
  //
68
- // Quoted spans are removed before the split (joshuafolkken/kit#2841): a `|` inside a quoted pattern —
68
+ // Quoted spans are removed before the split: a `|` inside a quoted pattern —
69
69
  // `grep -E "commit|git add" file` — is not a separator, and cutting there synthesized a segment that
70
70
  // began with `git add` out of a read-only search. `unquoted` honors escapes and heredoc bodies, so a
71
71
  // stray `it's` cannot pair with a later quote and erase the real `git add` between them.
@@ -11,9 +11,9 @@ const BASIC_CLAUDE_FILENAME = 'CLAUDE.basic.md'
11
11
  const SOURCE_CLAUDE_MD = path.join(REPO_ROOT, 'CLAUDE.md')
12
12
  const DIST_CLAUDE_MD = path.join(DIST_ROOT, 'CLAUDE.md')
13
13
  const SOURCE_BASIC_CLAUDE_MD = path.join(REPO_ROOT, 'templates', BASIC_CLAUDE_FILENAME)
14
- // A basic project's `CLAUDE.md` imports the rules from dist/. One initialized before
15
- // joshuafolkken/kit#2829 imports them under the profile's old name until `josh init` is re-run
16
- // and migrates that import, so the same rules ship under both names.
14
+ // A basic project's `CLAUDE.md` imports the rules from dist/. An older one imports them under the
15
+ // profile's old name until `josh init` is re-run and migrates that import, so the same rules ship
16
+ // under both names.
17
17
  const DIST_BASIC_CLAUDE_MDS: ReadonlyArray<string> = [
18
18
  path.join(DIST_ROOT, BASIC_CLAUDE_FILENAME),
19
19
  path.join(DIST_ROOT, 'CLAUDE.static.md'),
@@ -21,7 +21,7 @@ const DIST_BASIC_CLAUDE_MDS: ReadonlyArray<string> = [
21
21
 
22
22
  // Read kit's own CLAUDE.md and apply the distribution path transform. kit's source keeps relative
23
23
  // paths so it resolves inside the kit repository; the published copy rewrites them so every backtick
24
- // reference resolves in a consumer too (joshuafolkken/kit#1878). Pure — the guard test asserts the
24
+ // reference resolves in a consumer too. Pure — the guard test asserts the
25
25
  // result carries no reference a consumer cannot open.
26
26
  function generate_distributed_claude_md(): string {
27
27
  return init_logic.transform_distributed_paths(readFileSync(SOURCE_CLAUDE_MD, 'utf8'))
@@ -8,10 +8,10 @@ const REPO_ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..
8
8
  const CLAUDE_SETTINGS = path.join(REPO_ROOT, '.claude', 'settings.json')
9
9
  const CODEX_HOOKS = path.join(REPO_ROOT, '.codex', 'hooks.json')
10
10
 
11
- // Regenerate `.codex/hooks.json` from `.claude/settings.json` (joshuafolkken/kit#2997). The output is
11
+ // Regenerate `.codex/hooks.json` from `.claude/settings.json`. The output is
12
12
  // committed rather than gitignored: Codex reads it straight from a fresh clone of kit, before any
13
13
  // build has run, and `josh init` / `josh sync` copy it to consumers from the package. It is run by
14
- // hand, never from `pnpm build`, so a build never rewrites a committed file (joshuafolkken/kit#3324):
14
+ // hand, never from `pnpm build`, so a build never rewrites a committed file:
15
15
  // `codex-project-config.test.ts` fails the gate when the committed copy has drifted.
16
16
  function build_codex_hooks(): string {
17
17
  writeFileSync(CODEX_HOOKS, codex_hooks.codex_hooks_text(readFileSync(CLAUDE_SETTINGS, 'utf8')))
@@ -12,7 +12,7 @@ const OUT_DIR = path.join(PACKAGE_DIR, BUNDLED_COMMAND_DIRECTORY)
12
12
 
13
13
  // Each `is_bundled` command is pre-built to its own `dist/commands/<script basename>.js`, so a
14
14
  // consumer's `dist/josh.js` imports it under plain node instead of spawning tsx for its `.ts`
15
- // (joshuafolkken/kit#3328, `docs/maintainers/runtime-bundling.md`).
15
+ // (`docs/maintainers/runtime-bundling.md`).
16
16
  //
17
17
  // **No code splitting, and that is why the import closure is checked.** Every entry is one
18
18
  // self-contained file, so every module it imports shares the entry's `import.meta.url`; a second
@@ -25,7 +25,7 @@ const ANY_PATH = /.*/
25
25
 
26
26
  // Each Claude Code hook is bundled to its own `dist/hooks/<name>.js`, so a consumer (and kit itself)
27
27
  // invokes `node dist/hooks/<name>.js` directly — no `pnpm` launch and no `tsx` re-spawn from the
28
- // `dist/josh.js` dispatcher (joshuafolkken/kit#2023).
28
+ // `dist/josh.js` dispatcher.
29
29
  //
30
30
  // **`splitting: true` is load-bearing, not an optimization.** Every hook module decides whether to
31
31
  // run its main from `process.argv[1] === fileURLToPath(import.meta.url)`. A single-file bundle would
@@ -35,7 +35,7 @@ const ANY_PATH = /.*/
35
35
  // splitting keeps every entry in its own file with its own `import.meta.url`, so an imported guard's
36
36
  // `import.meta.url` never equals `argv[1]` and only the file actually launched runs its main.
37
37
  //
38
- // **The flip side: an entry another entry imports loses its main** (joshuafolkken/kit#2922). Splitting
38
+ // **The flip side: an entry another entry imports loses its main**. Splitting
39
39
  // moves a module two entries share into a chunk, so a launched hook whose own module is imported
40
40
  // elsewhere becomes a re-export stub that runs nothing. Each launched hook is therefore a `*-cli.ts`
41
41
  // file holding only the self-invoke, which no other module imports.
@@ -136,12 +136,12 @@ function place_build(out_directory: string, files: ReadonlyArray<OutputFile>, st
136
136
  }
137
137
 
138
138
  // With `splitting: true` every build emits freshly hashed `chunk-*.js` files, so without a cleanup
139
- // the chunks of every earlier build pile up beside the live ones and ship in any local pack
140
- // (joshuafolkken/kit#2885). The cleanup runs after the new files are in place rather than emptying
139
+ // the chunks of every earlier build pile up beside the live ones and ship in any local pack.
140
+ // The cleanup runs after the new files are in place rather than emptying
141
141
  // the directory first: this checkout's own settings.json launches `node dist/hooks/<name>.js` on
142
142
  // every tool call, and an emptied directory would make a hook launched mid-build fail to load and its
143
143
  // guard fail open. The source digest is placed last (`hook-bundle-stamp.ts`), so a launch only reads
144
- // the bundles as fresh once every one of them is in place (joshuafolkken/kit#2984).
144
+ // the bundles as fresh once every one of them is in place.
145
145
  async function build_hooks(out_directory: string = OUT_DIR): Promise<void> {
146
146
  const sources = new Map<string, Uint8Array>()
147
147
  const { outputFiles: files } = await build({
@@ -34,7 +34,7 @@ async function claude_md_step(): Promise<string> {
34
34
  return build_claude_md()
35
35
  }
36
36
 
37
- // Every step `pnpm build` runs (joshuafolkken/kit#3324). The steps write disjoint paths under
37
+ // Every step `pnpm build` runs. The steps write disjoint paths under
38
38
  // `dist/`, so they run concurrently from this one entry instead of eight serial `tsx` launches.
39
39
  // Nothing here writes a git-tracked file: `.codex/hooks.json` is regenerated by hand with
40
40
  // `tsx scripts/build/build-codex-hooks.ts`, and `codex-project-config.test.ts` fails the gate when