@joshuafolkken/kit 1.1229.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 (939) 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 +24 -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 +27 -16
  27. package/.claude/skills/workflow-commands/latest-gate.md +18 -29
  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/.github/workflows/publish.yml +2 -0
  42. package/.vscode/tasks.json +14 -0
  43. package/CLAUDE.md +10 -61
  44. package/README.md +38 -57
  45. package/SECURITY.md +1 -1
  46. package/dist/CLAUDE.md +10 -61
  47. package/dist/commands/document-section-cli.js +42 -10
  48. package/dist/config-merge/index.js +11 -2
  49. package/dist/hooks/audit-provision.js +2 -2
  50. package/dist/hooks/batch-guard.js +7 -7
  51. package/dist/hooks/{chunk-FIVDHQGT.js → chunk-43G45XJF.js} +18 -20
  52. package/dist/hooks/{chunk-JUDKDCDP.js → chunk-4TW4MQUL.js} +284 -362
  53. package/dist/hooks/{chunk-5VMKCCC4.js → chunk-76RK6E3H.js} +13 -11
  54. package/dist/hooks/{chunk-RNWHN5BP.js → chunk-DZWZ3DKY.js} +4 -4
  55. package/dist/hooks/{chunk-5VNDSNG3.js → chunk-FZ6FUSBM.js} +1 -1
  56. package/dist/hooks/{chunk-VC3PZPZO.js → chunk-GG72ANKI.js} +1 -1
  57. package/dist/hooks/{chunk-6HJJXRBX.js → chunk-KPM4YIIX.js} +8 -44
  58. package/dist/hooks/chunk-MXVQMLDP.js +3705 -0
  59. package/dist/hooks/{chunk-ELCN5LCH.js → chunk-NEC4AT4Z.js} +34 -12
  60. package/dist/hooks/{chunk-TQNPDZNH.js → chunk-NZBHG6FW.js} +7 -5
  61. package/dist/hooks/chunk-NZN2UFI6.js +2409 -0
  62. package/dist/hooks/{chunk-F56MFS4B.js → chunk-R6CRQEAL.js} +4 -4
  63. package/dist/hooks/chunk-SYSRHRWU.js +1589 -0
  64. package/dist/hooks/{chunk-55HHG5PX.js → chunk-TLJYAGZK.js} +799 -903
  65. package/dist/hooks/chunk-Z5TMJIPW.js +45 -0
  66. package/dist/hooks/codex-hook-adapter.js +26 -21
  67. package/dist/hooks/duplicate-read-guard.js +8 -8
  68. package/dist/hooks/format-edited.js +4 -4
  69. package/dist/hooks/inputs.json +213 -197
  70. package/dist/hooks/investigation-guard.js +8 -8
  71. package/dist/hooks/pretool-guard.js +15 -15
  72. package/dist/hooks/session-lang.js +406 -8
  73. package/dist/hooks/stop-guard.js +122 -201
  74. package/dist/josh.js +540 -137
  75. package/dist/version/index.js +15 -13
  76. package/eslint/base.js +43 -5
  77. package/eslint/rules/english-only-prose.js +3 -3
  78. package/eslint/rules/import.js +12 -0
  79. package/eslint/rules/namespace-object-export.js +2 -2
  80. package/package.json +16 -10
  81. package/pnpm-workspace.yaml +2 -4
  82. package/prompts/coding-standards.md +14 -48
  83. package/prompts/collaboration-workflow/file-edits.md +1 -1
  84. package/prompts/collaboration-workflow/issue-citation.md +1 -1
  85. package/prompts/collaboration-workflow/issue-template.md +4 -10
  86. package/prompts/collaboration-workflow/operating-rules.md +7 -8
  87. package/prompts/collaboration-workflow/output-bounds.md +1 -1
  88. package/prompts/collaboration-workflow/overview.md +1 -1
  89. package/prompts/collaboration-workflow/plan-comment.md +2 -1
  90. package/prompts/collaboration-workflow/principles.md +21 -3
  91. package/prompts/collaboration-workflow/report-format.md +16 -29
  92. package/prompts/collaboration-workflow/residency.md +1 -1
  93. package/prompts/collaboration-workflow/rule-delivery.md +7 -95
  94. package/prompts/collaboration-workflow/shell-body.md +3 -23
  95. package/prompts/collaboration-workflow/turn-batching.md +4 -13
  96. package/prompts/collaboration-workflow/wip-cap.md +5 -11
  97. package/prompts/refactoring.md +1 -1
  98. package/prompts/review-rubric.md +3 -22
  99. package/prompts/review.md +15 -38
  100. package/prompts/testing-guide.md +2 -4
  101. package/scripts/adopt/adopt-logic.ts +5 -5
  102. package/scripts/adopt/adopt-toolkits.ts +4 -5
  103. package/scripts/adopt/adopt.ts +2 -3
  104. package/scripts/agent/agent-argv.ts +7 -7
  105. package/scripts/agent/agent-diagnostics.ts +2 -2
  106. package/scripts/agent/agent-exit-record.ts +1 -1
  107. package/scripts/agent/agent-headless.ts +1 -1
  108. package/scripts/agent/agent-launch-environment.ts +6 -1
  109. package/scripts/agent/agent-role-profile.ts +49 -22
  110. package/scripts/agent/agent-session-role.ts +32 -0
  111. package/scripts/agent/api-outage.ts +1 -1
  112. package/scripts/agent/claude-agent-argv.ts +4 -4
  113. package/scripts/agent/claude-result-event.ts +4 -4
  114. package/scripts/agent/codex-hooks.ts +2 -2
  115. package/scripts/agent/interactive-ask.ts +3 -6
  116. package/scripts/auto-ok/auto-ok-cli.ts +46 -60
  117. package/scripts/backlog/backlog-arrival-added.ts +34 -0
  118. package/scripts/backlog/backlog-arrival.ts +54 -17
  119. package/scripts/backlog/backlog-budget-cli.ts +34 -6
  120. package/scripts/backlog/backlog-budget.ts +17 -24
  121. package/scripts/backlog/backlog-defect-priority.ts +1 -1
  122. package/scripts/backlog/backlog-drive-args.ts +5 -4
  123. package/scripts/backlog/backlog-drive-cli.ts +14 -10
  124. package/scripts/backlog/backlog-drive-epic.ts +85 -0
  125. package/scripts/backlog/backlog-drive-launch.ts +1 -1
  126. package/scripts/backlog/backlog-drive-named-offer.ts +60 -9
  127. package/scripts/backlog/backlog-drive-named.ts +39 -9
  128. package/scripts/backlog/backlog-drive-offer-argv.ts +1 -1
  129. package/scripts/backlog/backlog-drive-restore.ts +1 -1
  130. package/scripts/backlog/backlog-drive-retrospective.ts +2 -2
  131. package/scripts/backlog/backlog-drive.ts +43 -28
  132. package/scripts/backlog/backlog-idle.ts +88 -0
  133. package/scripts/backlog/backlog-named.ts +11 -15
  134. package/scripts/backlog/backlog-next.ts +26 -30
  135. package/scripts/backlog/backlog-offer-cli.ts +28 -23
  136. package/scripts/backlog/backlog-offer.ts +7 -7
  137. package/scripts/backlog/backlog-overlap.ts +178 -0
  138. package/scripts/backlog/backlog-plan-cli.ts +14 -90
  139. package/scripts/backlog/backlog-plan-read.ts +111 -0
  140. package/scripts/backlog/backlog-plan.ts +11 -10
  141. package/scripts/backlog/backlog-pool.ts +13 -14
  142. package/scripts/backlog/backlog-rank.ts +11 -11
  143. package/scripts/backlog/backlog-ready.ts +15 -10
  144. package/scripts/backlog/backlog-scope.ts +14 -15
  145. package/scripts/backlog/backlog-stalled-cli.ts +2 -2
  146. package/scripts/backlog/backlog-stalled-detect.ts +4 -4
  147. package/scripts/backlog/backlog-stalled.ts +5 -6
  148. package/scripts/backlog/backlog-waves.ts +4 -4
  149. package/scripts/backlog/backlogrun-args.ts +74 -0
  150. package/scripts/backlog/backlogrun-cli.ts +113 -0
  151. package/scripts/backlog/backlogrun-launch.ts +178 -0
  152. package/scripts/behavior/behavior-assertion.ts +6 -8
  153. package/scripts/behavior/behavior-cli.ts +1 -1
  154. package/scripts/behavior/behavior-rules.ts +3 -3
  155. package/scripts/build/build-claude-md.ts +4 -4
  156. package/scripts/build/build-codex-hooks.ts +2 -2
  157. package/scripts/build/build-commands.ts +1 -1
  158. package/scripts/build/build-hooks.ts +5 -5
  159. package/scripts/build/build.ts +1 -1
  160. package/scripts/build/hook-bundle-stamp.ts +109 -7
  161. package/scripts/build/local-bin.ts +2 -2
  162. package/scripts/cases/cases-cli.ts +1 -1
  163. package/scripts/cases/cases-logic.ts +2 -2
  164. package/scripts/ci/composite-actions.ts +1 -2
  165. package/scripts/ci/pr-classification.ts +2 -2
  166. package/scripts/claude/workflow-destination.ts +1 -1
  167. package/scripts/clone/clone-aggregate.ts +1 -1
  168. package/scripts/clone/clone-fingerprint.ts +1 -1
  169. package/scripts/clone/clone-scan-cli.ts +1 -1
  170. package/scripts/clone/clone-scan.ts +1 -1
  171. package/scripts/config-merge/index.ts +1 -1
  172. package/scripts/config-merge/json-format.ts +1 -3
  173. package/scripts/config-merge/patch-json-array.ts +90 -0
  174. package/scripts/config-merge/patch-json-key.ts +6 -3
  175. package/scripts/config-merge/patch-json-list.ts +1 -1
  176. package/scripts/cost-runtime/codex-usage.ts +1 -1
  177. package/scripts/cost-runtime/context-cut-payback.ts +4 -5
  178. package/scripts/cost-runtime/context-cut-threshold.ts +4 -6
  179. package/scripts/cost-runtime/cost-attribute.ts +3 -3
  180. package/scripts/cost-runtime/cost-blocks.ts +3 -4
  181. package/scripts/cost-runtime/cost-cli.ts +14 -11
  182. package/scripts/cost-runtime/cost-corpus.ts +11 -11
  183. package/scripts/cost-runtime/cost-pricing.ts +4 -4
  184. package/scripts/cost-runtime/cost-tokens.ts +1 -2
  185. package/scripts/cost-runtime/cost-transcript.ts +29 -29
  186. package/scripts/cost-runtime/cost-usage.ts +6 -7
  187. package/scripts/cost-runtime/cost-verdict.ts +10 -11
  188. package/scripts/cost-runtime/own-session.ts +1 -1
  189. package/scripts/cost-runtime/transcript-cwd.ts +2 -2
  190. package/scripts/delegation/delegation-cli.ts +4 -4
  191. package/scripts/delegation/delegation-policy.ts +13 -15
  192. package/scripts/delegation/duplicate-read-guard.ts +9 -10
  193. package/scripts/delegation/fanout-cli.ts +1 -1
  194. package/scripts/delegation/fanout.ts +1 -1
  195. package/scripts/delegation/investigation-guard.ts +18 -22
  196. package/scripts/delegation/investigation-reads.ts +48 -238
  197. package/scripts/discovery/repo-discovery.ts +1 -1
  198. package/scripts/discovery/repo-map-logic.ts +1 -2
  199. package/scripts/discovery/repo-origin.ts +3 -3
  200. package/scripts/discovery/repo-party-cli.ts +2 -2
  201. package/scripts/discovery/repo-party.ts +2 -2
  202. package/scripts/doctor/doctor-consumer.ts +1 -1
  203. package/scripts/doctor/doctor-io.ts +6 -7
  204. package/scripts/doctor/doctor-logic.ts +1 -1
  205. package/scripts/doctor/doctor-ports.ts +1 -1
  206. package/scripts/doctor/doctor.ts +8 -9
  207. package/scripts/document/backlogrun-parent-read-set.ts +5 -6
  208. package/scripts/document/bash-output-cap.ts +5 -7
  209. package/scripts/document/capped-print-part.ts +1 -1
  210. package/scripts/document/capped-print.ts +1 -1
  211. package/scripts/document/document-byte-budget.ts +33 -64
  212. package/scripts/document/document-byte-check.ts +4 -4
  213. package/scripts/document/document-reachability.ts +7 -8
  214. package/scripts/document/document-read-cli.ts +2 -2
  215. package/scripts/document/document-scan.ts +26 -2
  216. package/scripts/document/document-section-cli.ts +6 -8
  217. package/scripts/document/document-section.ts +8 -12
  218. package/scripts/document/edit-files-cli.ts +3 -4
  219. package/scripts/document/entry-read-budget.ts +8 -70
  220. package/scripts/document/entry-read-set.ts +51 -34
  221. package/scripts/document/lane-child-read-set.ts +9 -9
  222. package/scripts/document/read-files-cli.ts +1 -2
  223. package/scripts/document/read-set-cli.ts +16 -19
  224. package/scripts/document/read-set-cost.ts +4 -4
  225. package/scripts/document/read-set-point-of-use.ts +28 -38
  226. package/scripts/document/read-set-pricing.ts +1 -1
  227. package/scripts/document/read-set-trim.ts +3 -3
  228. package/scripts/document/resident-budget.ts +8 -10
  229. package/scripts/epic/epic-add-body.ts +15 -18
  230. package/scripts/epic/epic-add-plan.ts +26 -28
  231. package/scripts/epic/epic-add.ts +32 -25
  232. package/scripts/epic/epic-audit-checks.ts +27 -37
  233. package/scripts/epic/epic-audit-cli.ts +21 -22
  234. package/scripts/epic/epic-audit-orphans.ts +16 -17
  235. package/scripts/epic/epic-audit-rationale.ts +10 -15
  236. package/scripts/epic/epic-audit-report.ts +2 -5
  237. package/scripts/epic/epic-audit.ts +18 -14
  238. package/scripts/epic/epic-body.ts +10 -10
  239. package/scripts/epic/epic-bundle-cli.ts +36 -34
  240. package/scripts/epic/epic-bundle-evidence.ts +5 -5
  241. package/scripts/epic/epic-bundle-gaps.ts +6 -9
  242. package/scripts/epic/epic-bundle-poll.ts +1 -1
  243. package/scripts/epic/epic-bundle-referenced.ts +11 -14
  244. package/scripts/epic/epic-bundle.ts +19 -20
  245. package/scripts/epic/epic-busy.ts +44 -21
  246. package/scripts/epic/epic-candidate-confirm.ts +15 -18
  247. package/scripts/epic/epic-chains.ts +18 -23
  248. package/scripts/epic/epic-classify.ts +11 -12
  249. package/scripts/epic/epic-cli-argv.ts +5 -6
  250. package/scripts/epic/epic-cli-remove.ts +9 -4
  251. package/scripts/epic/epic-cli.ts +38 -26
  252. package/scripts/epic/epic-close-comment.ts +14 -15
  253. package/scripts/epic/epic-close.ts +25 -29
  254. package/scripts/epic/epic-cross-repo.ts +18 -21
  255. package/scripts/epic/epic-decision.ts +14 -18
  256. package/scripts/epic/epic-fetch.ts +25 -31
  257. package/scripts/epic/epic-graph.ts +15 -17
  258. package/scripts/epic/epic-index.ts +14 -16
  259. package/scripts/epic/epic-issue.ts +9 -11
  260. package/scripts/epic/epic-label-age.ts +74 -0
  261. package/scripts/epic/epic-lane-offer.ts +35 -24
  262. package/scripts/epic/epic-nested.ts +1 -1
  263. package/scripts/epic/epic-next-read.ts +8 -8
  264. package/scripts/epic/epic-next-views.ts +12 -12
  265. package/scripts/epic/epic-next.ts +29 -33
  266. package/scripts/epic/epic-outside-blocker.ts +11 -10
  267. package/scripts/epic/epic-parse.ts +22 -24
  268. package/scripts/epic/epic-promote.ts +3 -2
  269. package/scripts/epic/epic-rank.ts +1 -1
  270. package/scripts/epic/epic-read.ts +10 -8
  271. package/scripts/epic/epic-reconcile.ts +8 -6
  272. package/scripts/epic/epic-reference.ts +5 -4
  273. package/scripts/epic/epic-relation-recheck.ts +10 -11
  274. package/scripts/epic/epic-relations.ts +9 -8
  275. package/scripts/epic/epic-remove-plan.ts +4 -5
  276. package/scripts/epic/epic-remove.ts +7 -5
  277. package/scripts/epic/epic-report.ts +18 -20
  278. package/scripts/epic/epic-run.ts +6 -5
  279. package/scripts/epic/epic-sections.ts +2 -2
  280. package/scripts/epic/epic-shape.ts +3 -3
  281. package/scripts/epic/epic-solo-stale.ts +3 -2
  282. package/scripts/epic/epic-solo.ts +8 -8
  283. package/scripts/epic/epic-triage.ts +5 -4
  284. package/scripts/epic/epic-validate.ts +8 -7
  285. package/scripts/epic/epic.ts +5 -5
  286. package/scripts/exports/unused-members-cli.ts +1 -1
  287. package/scripts/followup/followup-issue-number.ts +1 -2
  288. package/scripts/followup/git-followup-cleanup.ts +6 -7
  289. package/scripts/followup/git-followup-finish.ts +11 -13
  290. package/scripts/followup/git-followup-flush.ts +11 -7
  291. package/scripts/followup/git-followup-issue-close.ts +16 -13
  292. package/scripts/followup/git-followup-label.ts +9 -6
  293. package/scripts/followup/git-followup-merged.ts +1 -1
  294. package/scripts/followup/git-followup-pending.ts +7 -9
  295. package/scripts/followup/git-followup-stages.ts +28 -17
  296. package/scripts/followup/git-followup-workflow.ts +19 -21
  297. package/scripts/followup/git-pr-followup-checks.ts +13 -20
  298. package/scripts/followup/git-pr-followup-wrapup.ts +7 -7
  299. package/scripts/followup/git-pr-followup.ts +18 -17
  300. package/scripts/gate/core-admission.ts +162 -0
  301. package/scripts/gate/core-budget.ts +134 -91
  302. package/scripts/gate/gate-ledger.ts +114 -0
  303. package/scripts/gate/gate-log.ts +7 -9
  304. package/scripts/gate/gate-plan.ts +103 -35
  305. package/scripts/gate/gate-report.ts +39 -21
  306. package/scripts/gate/gate-skip.ts +11 -13
  307. package/scripts/gate/gate-steps.ts +5 -1
  308. package/scripts/gate/gate-tree.ts +3 -4
  309. package/scripts/gate/hook-gate-reuse.ts +9 -9
  310. package/scripts/gate/machine-capacity.ts +313 -0
  311. package/scripts/gate/pre-commit-type-check.ts +4 -4
  312. package/scripts/gate/project-checks.ts +12 -4
  313. package/scripts/gate/scoped-green.ts +11 -18
  314. package/scripts/gate/type-check-command.ts +2 -2
  315. package/scripts/gate/type-check-step.ts +4 -4
  316. package/scripts/gate/verification-gate.ts +60 -53
  317. package/scripts/gh/gh-spawn.ts +2 -2
  318. package/scripts/gh/git-ai-review-scan.ts +3 -2
  319. package/scripts/gh/git-gh-api-path.ts +10 -11
  320. package/scripts/gh/git-gh-exec.ts +43 -48
  321. package/scripts/gh/git-gh-failure.ts +6 -9
  322. package/scripts/gh/git-gh-helpers.ts +1 -1
  323. package/scripts/gh/git-gh-issue-list.ts +15 -19
  324. package/scripts/gh/git-gh-issue-read.ts +43 -60
  325. package/scripts/gh/git-gh-issue-rest.ts +14 -15
  326. package/scripts/gh/git-gh-issue-write.ts +52 -40
  327. package/scripts/gh/git-gh-issue.ts +23 -24
  328. package/scripts/gh/git-gh-pr-auto-merge.ts +3 -3
  329. package/scripts/gh/git-gh-pr-read.ts +46 -50
  330. package/scripts/gh/git-gh-pr-rest.ts +23 -26
  331. package/scripts/gh/git-gh-pr-review.ts +2 -2
  332. package/scripts/gh/git-gh-pr-rollup.ts +4 -4
  333. package/scripts/gh/git-gh-pr-snapshot.ts +8 -10
  334. package/scripts/gh/git-gh-pr.ts +16 -16
  335. package/scripts/gh/git-gh-reachability.ts +11 -12
  336. package/scripts/gh/git-gh-repo.ts +2 -3
  337. package/scripts/gh/git-gh-rest-state.ts +1 -1
  338. package/scripts/gh/git-pr-ai-review.ts +6 -5
  339. package/scripts/gh/git-pr-checks-eval.ts +28 -30
  340. package/scripts/gh/git-pr-checks-parse.ts +14 -16
  341. package/scripts/gh/git-pr-checks-watch.ts +17 -17
  342. package/scripts/gh/git-pr-checks.ts +20 -23
  343. package/scripts/gh/git-pr-coderabbit.ts +8 -6
  344. package/scripts/gh/git-pr-confirmation.ts +5 -5
  345. package/scripts/gh/git-pr-managed-config.ts +7 -9
  346. package/scripts/gh/git-pr-messages.ts +1 -1
  347. package/scripts/gh/git-pr.ts +15 -16
  348. package/scripts/gh/github-issue-url.ts +8 -9
  349. package/scripts/git/base-tree.ts +66 -0
  350. package/scripts/git/change-base.ts +42 -2
  351. package/scripts/git/changed-file-scope.ts +5 -5
  352. package/scripts/git/changed-paths.ts +1 -2
  353. package/scripts/git/constants.ts +2 -2
  354. package/scripts/git/git-branch.ts +1 -1
  355. package/scripts/git/git-closes-keyword.ts +3 -3
  356. package/scripts/git/git-command.ts +53 -41
  357. package/scripts/git/git-common-directory.ts +3 -3
  358. package/scripts/git/git-diff-reads.ts +14 -15
  359. package/scripts/git/git-error.ts +1 -1
  360. package/scripts/git/git-execa-error.ts +1 -2
  361. package/scripts/git/git-issue.ts +10 -8
  362. package/scripts/git/git-location-environment.ts +3 -4
  363. package/scripts/git/git-ls-remote.ts +6 -8
  364. package/scripts/git/git-pre-push-hook.ts +11 -10
  365. package/scripts/git/git-preflight.ts +5 -5
  366. package/scripts/git/git-push-transport.ts +2 -2
  367. package/scripts/git/git-remote-branch.ts +1 -2
  368. package/scripts/git/git-schemas.ts +16 -23
  369. package/scripts/git/git-spawn-sync.ts +1 -1
  370. package/scripts/git/git-spawn.ts +37 -14
  371. package/scripts/git/git-ssh-keepalive.ts +12 -5
  372. package/scripts/git/git-staging.ts +7 -8
  373. package/scripts/git/git-workflow.ts +1 -1
  374. package/scripts/git/git-worktree.ts +35 -27
  375. package/scripts/git/gone-branch.ts +2 -2
  376. package/scripts/git/listing-cutoff.ts +1 -2
  377. package/scripts/git/lockfile-sync.ts +65 -0
  378. package/scripts/git/main-merge-guard.ts +1 -2
  379. package/scripts/git/main-merge.ts +7 -7
  380. package/scripts/git/main-sync.ts +23 -8
  381. package/scripts/git/parse-json-array.ts +18 -23
  382. package/scripts/git/repository-lock.ts +34 -2
  383. package/scripts/git/stash/git-stash.ts +4 -5
  384. package/scripts/git/stash/stash-orphans.ts +5 -3
  385. package/scripts/git/stash/stash-pop-args.ts +1 -1
  386. package/scripts/git/stash/stash-pop-cli.ts +3 -3
  387. package/scripts/git/stash/stash-sweep-lock.ts +2 -2
  388. package/scripts/hooks/batch-guard.ts +11 -13
  389. package/scripts/hooks/check-commit-message.ts +12 -9
  390. package/scripts/hooks/codex-hook-adapter.ts +16 -10
  391. package/scripts/hooks/edited-cspell.ts +3 -4
  392. package/scripts/hooks/format-edited-cli.ts +1 -1
  393. package/scripts/hooks/format-edited-file.ts +11 -17
  394. package/scripts/hooks/format-rewrite-notice.ts +19 -17
  395. package/scripts/hooks/pre-push-unit.ts +10 -14
  396. package/scripts/hooks/pretool-guard-cli.ts +4 -4
  397. package/scripts/hooks/pretool-guard.ts +93 -18
  398. package/scripts/hooks/reserved-run.ts +2 -2
  399. package/scripts/hooks/step-zero-notice.ts +1 -1
  400. package/scripts/hooks/stop-guard.ts +21 -10
  401. package/scripts/init/basic-path-migration.ts +2 -2
  402. package/scripts/init/claude-kit-only-settings.ts +2 -2
  403. package/scripts/init/claude-plugin-config.ts +2 -2
  404. package/scripts/init/distributed-paths.ts +4 -4
  405. package/scripts/init/hook-command-rewrite.ts +3 -3
  406. package/scripts/init/hook-launch.ts +5 -5
  407. package/scripts/init/init-actions.ts +13 -0
  408. package/scripts/init/init-ai-copy.ts +11 -11
  409. package/scripts/init/init-bootstrap.ts +3 -3
  410. package/scripts/init/init-copy-content.ts +4 -4
  411. package/scripts/init/init-logic-json-merge.ts +7 -9
  412. package/scripts/init/init-logic-migrate.ts +1 -1
  413. package/scripts/init/init-logic-templates.ts +1 -1
  414. package/scripts/init/init-logic-workspace.ts +4 -4
  415. package/scripts/init/init-logic-yaml-merge.ts +2 -2
  416. package/scripts/init/init-logic.ts +19 -22
  417. package/scripts/init/init.ts +12 -8
  418. package/scripts/init/kit-base-preset.ts +1 -1
  419. package/scripts/init/kit-setup-state.ts +1 -1
  420. package/scripts/init/kit-written-paths.ts +1 -2
  421. package/scripts/init/package-manager-pin.ts +35 -0
  422. package/scripts/init/project-profile-cli.ts +1 -1
  423. package/scripts/init/project-profile.ts +3 -3
  424. package/scripts/init/session-language-environment.ts +1 -1
  425. package/scripts/init/start-exec.ts +3 -4
  426. package/scripts/init/start-plan.ts +2 -2
  427. package/scripts/init/start-setup-pr.ts +3 -2
  428. package/scripts/init/start-steps.ts +2 -2
  429. package/scripts/init/tsconfig-preset-migration.ts +1 -1
  430. package/scripts/init/vscode-tasks.ts +62 -0
  431. package/scripts/issue/baseline-measure.ts +2 -2
  432. package/scripts/issue/behavior-change-lint.ts +2 -2
  433. package/scripts/issue/defect-rate-cli.ts +6 -7
  434. package/scripts/issue/defect-rate.ts +37 -27
  435. package/scripts/issue/git-next-issues.ts +9 -8
  436. package/scripts/issue/issue-auto-ok.ts +49 -11
  437. package/scripts/issue/issue-backlinks-cli.ts +5 -5
  438. package/scripts/issue/issue-backlinks.ts +6 -6
  439. package/scripts/issue/issue-cite-cli.ts +20 -18
  440. package/scripts/issue/issue-cite.ts +18 -8
  441. package/scripts/issue/issue-closing-pr.ts +4 -4
  442. package/scripts/issue/issue-comment-cli.ts +6 -4
  443. package/scripts/issue/issue-file-cli.ts +75 -15
  444. package/scripts/issue/issue-file-fold.ts +155 -0
  445. package/scripts/issue/issue-file.ts +14 -6
  446. package/scripts/issue/issue-fold-cli.ts +14 -9
  447. package/scripts/issue/issue-fold.ts +23 -8
  448. package/scripts/issue/issue-labels.ts +46 -37
  449. package/scripts/issue/issue-lint-cli.ts +2 -2
  450. package/scripts/issue/issue-lint.ts +1 -1
  451. package/scripts/issue/issue-merged.ts +10 -4
  452. package/scripts/issue/issue-number-shape.ts +27 -0
  453. package/scripts/issue/issue-rank.ts +1 -1
  454. package/scripts/issue/issue-read-cli.ts +4 -5
  455. package/scripts/issue/issue-read.ts +4 -5
  456. package/scripts/issue/issue-reference.ts +5 -5
  457. package/scripts/issue/issue-release-cli.ts +165 -0
  458. package/scripts/issue/issue-release.ts +58 -0
  459. package/scripts/issue/issue-report-failures.ts +7 -4
  460. package/scripts/issue/issue-scout-cli.ts +11 -11
  461. package/scripts/issue/issue-scout-closed.ts +4 -4
  462. package/scripts/issue/issue-scout.ts +4 -5
  463. package/scripts/issue/issue-state-cli.ts +17 -10
  464. package/scripts/issue/issue-state.ts +12 -13
  465. package/scripts/issue/issue-wip.ts +7 -7
  466. package/scripts/issue/markdown-section.ts +3 -3
  467. package/scripts/issue/measure-rerun-cli.ts +10 -9
  468. package/scripts/issue/reproduction-measure.ts +3 -3
  469. package/scripts/issue/session-cite.ts +56 -0
  470. package/scripts/josh/agent-session-environment.ts +10 -8
  471. package/scripts/josh/cli-body.ts +2 -2
  472. package/scripts/josh/command-suggest.ts +1 -1
  473. package/scripts/josh/file-map-stamp.ts +20 -23
  474. package/scripts/josh/hook-decision.ts +24 -28
  475. package/scripts/josh/josh-command-map.ts +4 -1
  476. package/scripts/josh/josh-command-types.ts +32 -34
  477. package/scripts/josh/josh-commands-ai.ts +6 -6
  478. package/scripts/josh/josh-commands-backlog.ts +15 -3
  479. package/scripts/josh/josh-commands-clone.ts +1 -1
  480. package/scripts/josh/josh-commands-development.ts +33 -4
  481. package/scripts/josh/josh-commands-document.ts +3 -3
  482. package/scripts/josh/josh-commands-guard.ts +3 -3
  483. package/scripts/josh/josh-commands-issue.ts +11 -5
  484. package/scripts/josh/josh-commands-lane.ts +16 -5
  485. package/scripts/josh/josh-commands-lint.ts +1 -1
  486. package/scripts/josh/josh-commands-maintenance.ts +2 -2
  487. package/scripts/josh/josh-commands-run.ts +20 -6
  488. package/scripts/josh/josh-commands-split.ts +1 -2
  489. package/scripts/josh/josh-commands-versioning.ts +5 -5
  490. package/scripts/josh/josh-commands-workflow.ts +30 -22
  491. package/scripts/josh/josh-environment-file.ts +1 -1
  492. package/scripts/josh/josh-in-process.ts +3 -3
  493. package/scripts/josh/josh-logic.ts +10 -10
  494. package/scripts/josh/josh-run.ts +3 -3
  495. package/scripts/josh/josh-verdict.ts +9 -12
  496. package/scripts/josh/josh.ts +3 -3
  497. package/scripts/josh/kit-only.ts +2 -2
  498. package/scripts/josh/path-decision.ts +3 -3
  499. package/scripts/josh/platform-temporary.ts +7 -5
  500. package/scripts/josh/process-identity.ts +24 -6
  501. package/scripts/josh/process-owner.ts +4 -4
  502. package/scripts/josh/session-language-cli.ts +53 -11
  503. package/scripts/josh/session-language.ts +1 -1
  504. package/scripts/josh/stamp-file.ts +48 -29
  505. package/scripts/josh/stamp-record.ts +57 -0
  506. package/scripts/lane/lane-await.ts +35 -11
  507. package/scripts/lane/lane-cache.ts +6 -6
  508. package/scripts/lane/lane-capacity.ts +32 -17
  509. package/scripts/lane/lane-child-invocation.ts +17 -15
  510. package/scripts/lane/lane-child-marker.ts +12 -12
  511. package/scripts/lane/lane-cli.ts +20 -13
  512. package/scripts/lane/lane-close.ts +6 -6
  513. package/scripts/lane/lane-dispatch.ts +61 -72
  514. package/scripts/lane/lane-environment.ts +5 -5
  515. package/scripts/lane/lane-guard-policy.ts +7 -21
  516. package/scripts/lane/lane-handoff.ts +2 -2
  517. package/scripts/lane/lane-install.ts +9 -10
  518. package/scripts/lane/lane-launch-cli.ts +13 -8
  519. package/scripts/lane/lane-ledger.ts +73 -11
  520. package/scripts/lane/lane-leftover.ts +44 -30
  521. package/scripts/lane/lane-limit-cli.ts +160 -0
  522. package/scripts/lane/lane-limit-override.ts +74 -0
  523. package/scripts/lane/lane-load.ts +19 -68
  524. package/scripts/lane/lane-measure-cli.ts +15 -25
  525. package/scripts/lane/lane-occupancy.ts +6 -4
  526. package/scripts/lane/lane-open.ts +25 -24
  527. package/scripts/lane/lane-output.ts +4 -3
  528. package/scripts/lane/lane-paths.ts +22 -8
  529. package/scripts/lane/lane-phase.ts +33 -0
  530. package/scripts/lane/lane-reap.ts +2 -2
  531. package/scripts/lane/lane-registry.ts +27 -15
  532. package/scripts/lane/lane-relaunch.ts +9 -9
  533. package/scripts/lane/lane-report.ts +5 -4
  534. package/scripts/lane/lane-resume.ts +2 -2
  535. package/scripts/lane/lane-sampler.ts +55 -0
  536. package/scripts/lane/lane-seed.ts +7 -7
  537. package/scripts/lane/lane-stage-stats.ts +135 -0
  538. package/scripts/lane/lane-start-point.ts +8 -11
  539. package/scripts/lane/lane-stats.ts +60 -15
  540. package/scripts/lane/lane-stray.ts +140 -0
  541. package/scripts/lane/lane-vacant.ts +1 -1
  542. package/scripts/lane/openai-lane-supervisor-decision.ts +3 -7
  543. package/scripts/lane/openai-lane-supervisor-owner.ts +3 -9
  544. package/scripts/lane/openai-review-broker.ts +2 -4
  545. package/scripts/lib/ancestor-directories.ts +1 -1
  546. package/scripts/lib/bounded-pool.ts +2 -2
  547. package/scripts/lib/buffered-process.ts +4 -6
  548. package/scripts/lib/caddy-logs.sh +0 -0
  549. package/scripts/lib/cli-flags.ts +39 -6
  550. package/scripts/lib/error-message.ts +1 -1
  551. package/scripts/lib/json-value.ts +17 -3
  552. package/scripts/lib/poll.ts +1 -1
  553. package/scripts/lib/status-icons.ts +3 -3
  554. package/scripts/lib/timed-fetch.ts +1 -1
  555. package/scripts/lib/timeouts.ts +1 -1
  556. package/scripts/lines/bytes-command.ts +3 -4
  557. package/scripts/lines/effective-limit.ts +25 -12
  558. package/scripts/lines/line-budget.ts +47 -55
  559. package/scripts/lines/line-targets.ts +6 -2
  560. package/scripts/lines/lines-command.ts +3 -3
  561. package/scripts/lint/cspell-cached.ts +1 -1
  562. package/scripts/lint/cycle-recheck.ts +122 -0
  563. package/scripts/lint/format.ts +1 -2
  564. package/scripts/lint/lint-parallel.ts +34 -19
  565. package/scripts/lint/lint-related-scope.ts +25 -15
  566. package/scripts/lint/lint-related.ts +6 -7
  567. package/scripts/managed-marker/index.ts +1 -1
  568. package/scripts/managed-marker/managed-marker-logic.ts +1 -2
  569. package/scripts/notify/git-notify.ts +9 -7
  570. package/scripts/notify/telegram-notify.ts +53 -37
  571. package/scripts/notify/telegram-test-logic.ts +3 -3
  572. package/scripts/notify/telegram-test.ts +45 -30
  573. package/scripts/observations/observation-ledger-home.ts +14 -8
  574. package/scripts/observations/observation-ledger-line.ts +3 -2
  575. package/scripts/observations/observation-ledger-migrate.ts +3 -4
  576. package/scripts/observations/observation-ledger-prepare.ts +4 -4
  577. package/scripts/observations/observation-ledger.ts +14 -15
  578. package/scripts/observations/observation-record-cli.ts +83 -0
  579. package/scripts/observations/observation-record.ts +91 -0
  580. package/scripts/observations/observations-flush-cli.ts +1 -1
  581. package/scripts/observations/observations-flush-landing.ts +7 -6
  582. package/scripts/observations/observations-flush.ts +26 -27
  583. package/scripts/overrides/overrides-check.ts +18 -8
  584. package/scripts/package/package-scout-cli.ts +1 -1
  585. package/scripts/package/package-scout-format.ts +2 -2
  586. package/scripts/package/package-scout.ts +1 -1
  587. package/scripts/propagate/propagate-git-failure.ts +1 -1
  588. package/scripts/propagate/propagate-git.ts +7 -7
  589. package/scripts/propagate/propagate-plan.ts +2 -2
  590. package/scripts/propagate/propagate-publish.ts +2 -3
  591. package/scripts/propagate/propagate-run.ts +5 -7
  592. package/scripts/propagate/propagate-select.ts +1 -1
  593. package/scripts/propagate/propagate-steps.ts +19 -20
  594. package/scripts/propagate/propagate-targets.ts +6 -10
  595. package/scripts/propagate/propagate.ts +5 -5
  596. package/scripts/refactor/import-graph.ts +1 -1
  597. package/scripts/refactor/refactor-lint.ts +4 -10
  598. package/scripts/refactor/refactor-scan-cli.ts +1 -1
  599. package/scripts/refactor/refactor-scan.ts +2 -2
  600. package/scripts/refactor/refactor-targets.ts +1 -1
  601. package/scripts/release/github-release-cli.ts +25 -3
  602. package/scripts/release/github-release-environment.ts +1 -0
  603. package/scripts/release/github-release-runs.ts +115 -0
  604. package/scripts/release/github-release.ts +13 -67
  605. package/scripts/release/release-cli.ts +21 -4
  606. package/scripts/release/release-history.ts +6 -10
  607. package/scripts/release/release-plan.ts +3 -3
  608. package/scripts/release/release-progress.ts +3 -4
  609. package/scripts/release/release-publish.ts +8 -9
  610. package/scripts/release/release-scope-cli.ts +8 -10
  611. package/scripts/release/release-tag.ts +6 -8
  612. package/scripts/release/release-worktree.ts +5 -5
  613. package/scripts/repo/auto-merge-setting-logic.ts +7 -9
  614. package/scripts/repo/auto-merge-setting.ts +1 -1
  615. package/scripts/repo/repo-setting.ts +4 -4
  616. package/scripts/repo/repository-labels.ts +1 -1
  617. package/scripts/repo/required-checks-logic.ts +3 -3
  618. package/scripts/repo/required-checks-report.ts +1 -1
  619. package/scripts/repo/ruleset-check-cli.ts +1 -1
  620. package/scripts/repo/ruleset-check.ts +1 -1
  621. package/scripts/report/report-format-reference.ts +26 -0
  622. package/scripts/report/report-lint-cli.ts +2 -2
  623. package/scripts/report/report-lint.ts +16 -2
  624. package/scripts/review/disposition-cli.ts +2 -2
  625. package/scripts/review/disposition-logic.ts +1 -1
  626. package/scripts/review/live-evidence.ts +9 -6
  627. package/scripts/review/review-attest-cli.ts +1 -2
  628. package/scripts/review/review-attest.ts +3 -3
  629. package/scripts/review/review-brief-cli.ts +19 -20
  630. package/scripts/review/review-brief.ts +29 -32
  631. package/scripts/review/review-checkout.ts +2 -2
  632. package/scripts/review/review-diff-parts.ts +3 -5
  633. package/scripts/review/review-diff-write.ts +1 -1
  634. package/scripts/review/review-finding-ledger.ts +7 -4
  635. package/scripts/review/review-findings-cli.ts +2 -2
  636. package/scripts/review/review-level.ts +4 -7
  637. package/scripts/review/review-record-cli.ts +73 -16
  638. package/scripts/review/review-record.ts +5 -4
  639. package/scripts/review/review-round2-cli.ts +2 -3
  640. package/scripts/review/review-round2.ts +13 -21
  641. package/scripts/review/review-stamps.ts +9 -71
  642. package/scripts/review/review-tree.ts +4 -5
  643. package/scripts/rules/bash-triggers.ts +4 -4
  644. package/scripts/rules/decision-oracle-batch.ts +5 -6
  645. package/scripts/rules/decision-oracle-stage.ts +1 -1
  646. package/scripts/rules/decision-oracle-tokens.ts +1 -2
  647. package/scripts/rules/decision-oracle.ts +2 -2
  648. package/scripts/rules/delivered-rules.ts +61 -406
  649. package/scripts/rules/destructive-command.ts +2 -2
  650. package/scripts/rules/direct-filing.ts +4 -4
  651. package/scripts/rules/direct-pr-create.ts +2 -2
  652. package/scripts/rules/early-heartbeat.ts +15 -19
  653. package/scripts/rules/file-body.ts +5 -6
  654. package/scripts/rules/filing-cap.ts +6 -7
  655. package/scripts/rules/filing-offer.ts +1 -1
  656. package/scripts/rules/firing-point.ts +6 -6
  657. package/scripts/rules/gh-api.ts +2 -2
  658. package/scripts/rules/git-argv.ts +3 -3
  659. package/scripts/rules/git-force.ts +2 -2
  660. package/scripts/rules/hook-context-line.ts +31 -0
  661. package/scripts/rules/implementation-cut-verdict.ts +5 -8
  662. package/scripts/rules/implementation-cut.ts +35 -32
  663. package/scripts/rules/index-guard.ts +2 -2
  664. package/scripts/rules/issue-citation.ts +7 -7
  665. package/scripts/rules/issue-comments.ts +21 -13
  666. package/scripts/rules/josh-git-bare.ts +2 -2
  667. package/scripts/rules/lane-background.ts +14 -16
  668. package/scripts/rules/lane-carry-conflict.ts +41 -5
  669. package/scripts/rules/lane-interactive-ask.ts +6 -9
  670. package/scripts/rules/lane-park.ts +12 -16
  671. package/scripts/rules/lane-split-park.ts +1 -2
  672. package/scripts/rules/lane-switch-main.ts +10 -13
  673. package/scripts/rules/last-prompt.ts +1 -1
  674. package/scripts/rules/oracle-consulted.ts +5 -5
  675. package/scripts/rules/oracle-firing.ts +6 -9
  676. package/scripts/rules/oracle-list-cli.ts +2 -2
  677. package/scripts/rules/permission-guards.ts +2 -2
  678. package/scripts/rules/piped-verification.ts +79 -9
  679. package/scripts/rules/poll-loop.ts +9 -11
  680. package/scripts/rules/pre-gate-cut.ts +33 -30
  681. package/scripts/rules/prior-comment-read.ts +3 -3
  682. package/scripts/rules/protected-files.ts +25 -13
  683. package/scripts/rules/raw-field-body.ts +3 -4
  684. package/scripts/rules/reply-language.ts +1 -1
  685. package/scripts/rules/rule-body-guard.ts +10 -12
  686. package/scripts/rules/rule-guard.ts +1 -1
  687. package/scripts/rules/rule-list.ts +51 -0
  688. package/scripts/rules/rule-registry-rows.ts +282 -0
  689. package/scripts/rules/rule-registry.ts +109 -0
  690. package/scripts/rules/rule-value-cache.ts +2 -2
  691. package/scripts/rules/rule-value-cli.ts +6 -4
  692. package/scripts/rules/rule-value.ts +61 -22
  693. package/scripts/rules/run-tail-rule.ts +11 -15
  694. package/scripts/rules/shell-body-trigger.ts +7 -7
  695. package/scripts/rules/shell-segments.ts +2 -4
  696. package/scripts/rules/stop-rules.ts +54 -41
  697. package/scripts/rules/tail-commands.ts +1 -1
  698. package/scripts/rules/test-declared-commit.ts +2 -2
  699. package/scripts/rules/third-party-write.ts +3 -3
  700. package/scripts/rules/worktree-guard.ts +12 -5
  701. package/scripts/run/add/run-add-cli.ts +165 -0
  702. package/scripts/run/add/run-add.ts +124 -0
  703. package/scripts/run/board/run-board-cli.ts +207 -0
  704. package/scripts/run/board/run-board-closed.ts +95 -0
  705. package/scripts/run/board/run-board-every.ts +60 -0
  706. package/scripts/run/board/run-board-fetch.ts +38 -0
  707. package/scripts/run/board/run-board-fit.ts +219 -0
  708. package/scripts/run/board/run-board-github.ts +162 -0
  709. package/scripts/run/board/run-board-header.ts +275 -0
  710. package/scripts/run/board/run-board-kind.ts +35 -0
  711. package/scripts/run/board/run-board-labels.ts +299 -0
  712. package/scripts/run/board/run-board-layout.ts +222 -0
  713. package/scripts/run/board/run-board-link.ts +31 -0
  714. package/scripts/run/board/run-board-machine.ts +198 -0
  715. package/scripts/run/board/run-board-notes.ts +103 -0
  716. package/scripts/run/board/run-board-phase.ts +136 -0
  717. package/scripts/run/board/run-board-plan.ts +129 -0
  718. package/scripts/run/board/run-board-read.ts +62 -0
  719. package/scripts/run/board/run-board-render-legend.ts +82 -0
  720. package/scripts/run/board/run-board-render-notes.ts +77 -0
  721. package/scripts/run/board/run-board-render-slot.ts +50 -0
  722. package/scripts/run/board/run-board-render.ts +407 -0
  723. package/scripts/run/board/run-board-scope.ts +17 -0
  724. package/scripts/run/board/run-board-screen.ts +43 -0
  725. package/scripts/run/board/run-board-span.ts +66 -0
  726. package/scripts/run/board/run-board-spin.ts +115 -0
  727. package/scripts/run/board/run-board-state.ts +113 -0
  728. package/scripts/run/board/run-board-status.ts +279 -0
  729. package/scripts/run/board/run-board-tick.ts +210 -0
  730. package/scripts/run/board/run-board-track.ts +22 -0
  731. package/scripts/run/board/run-board-usage-read.ts +255 -0
  732. package/scripts/run/board/run-board-usage-rusage.ts +124 -0
  733. package/scripts/run/board/run-board-usage-text.ts +80 -0
  734. package/scripts/run/board/run-board-usage.ts +165 -0
  735. package/scripts/run/carry/run-carry-added.ts +62 -0
  736. package/scripts/run/carry/run-carry-args.ts +25 -22
  737. package/scripts/run/carry/run-carry-change.ts +1 -1
  738. package/scripts/run/carry/run-carry-cli.ts +71 -48
  739. package/scripts/run/carry/run-carry-conversation.ts +6 -7
  740. package/scripts/run/carry/run-carry-ended.ts +85 -0
  741. package/scripts/run/carry/run-carry-reclaim.ts +1 -1
  742. package/scripts/run/carry/run-carry-stash.ts +3 -2
  743. package/scripts/run/carry/run-carry-streak.ts +8 -10
  744. package/scripts/run/carry/run-carry.ts +85 -89
  745. package/scripts/run/cut/run-cut-args.ts +7 -7
  746. package/scripts/run/cut/run-cut-cli.ts +68 -37
  747. package/scripts/run/cut/run-cut-handoff.ts +15 -15
  748. package/scripts/run/cut/run-cut-report.ts +37 -16
  749. package/scripts/run/cut/run-cut.ts +63 -77
  750. package/scripts/run/detached-launch.ts +35 -50
  751. package/scripts/run/entry/run-entry-cli.ts +48 -27
  752. package/scripts/run/entry/run-entry-stop.ts +7 -9
  753. package/scripts/run/entry/run-entry.ts +5 -6
  754. package/scripts/run/event/run-event-cli.ts +5 -6
  755. package/scripts/run/event/run-event-filed.ts +69 -0
  756. package/scripts/run/event/run-event-follow.ts +3 -3
  757. package/scripts/run/event/run-event-plan.ts +38 -0
  758. package/scripts/run/event/run-event-render.ts +10 -4
  759. package/scripts/run/event/run-event-scope.ts +47 -18
  760. package/scripts/run/event/run-event-stream-emit.ts +64 -11
  761. package/scripts/run/event/run-event-stream.ts +172 -43
  762. package/scripts/run/event/run-event-watch.ts +4 -6
  763. package/scripts/run/hold/run-hold-cli.ts +65 -62
  764. package/scripts/run/hold/run-hold.ts +88 -46
  765. package/scripts/run/merge/run-merge-cli.ts +116 -77
  766. package/scripts/run/merge/run-merge-collect.ts +107 -0
  767. package/scripts/run/merge/run-merge-steps.ts +112 -65
  768. package/scripts/run/merge/run-merge-token.ts +30 -0
  769. package/scripts/run/merge/run-merge.ts +31 -22
  770. package/scripts/run/progress/run-progress-args.ts +4 -4
  771. package/scripts/run/progress/run-progress-cli.ts +39 -50
  772. package/scripts/run/progress/run-progress-clock.ts +25 -32
  773. package/scripts/run/progress/run-progress-config.ts +6 -9
  774. package/scripts/run/progress/run-progress-read.ts +9 -10
  775. package/scripts/run/progress/run-progress.ts +48 -53
  776. package/scripts/run/review/run-review-cli.ts +6 -6
  777. package/scripts/run/review/run-review-steps.ts +6 -6
  778. package/scripts/run/review/run-review.ts +9 -11
  779. package/scripts/run/run-cli-fault.ts +29 -0
  780. package/scripts/run/run-ending-cli.ts +3 -3
  781. package/scripts/run/run-ending.ts +10 -14
  782. package/scripts/run/run-halfrun-resume.ts +6 -8
  783. package/scripts/run/run-headless.ts +25 -12
  784. package/scripts/run/run-invocation.ts +17 -22
  785. package/scripts/run/run-label.ts +7 -5
  786. package/scripts/run/run-liveness-cli.ts +19 -6
  787. package/scripts/run/run-liveness.ts +27 -38
  788. package/scripts/run/run-next-cli.ts +5 -9
  789. package/scripts/run/run-next.ts +4 -5
  790. package/scripts/run/run-parent-cut-hook.ts +10 -12
  791. package/scripts/run/run-preflight.ts +25 -29
  792. package/scripts/run/run-prep-cli.ts +17 -13
  793. package/scripts/run/run-prep-locate.ts +4 -5
  794. package/scripts/run/run-prep.ts +7 -10
  795. package/scripts/run/run-prrun-resume.ts +2 -2
  796. package/scripts/run/run-report-cli.ts +4 -4
  797. package/scripts/run/run-report.ts +9 -14
  798. package/scripts/run/run-retrospective.ts +3 -3
  799. package/scripts/run/run-section.ts +42 -0
  800. package/scripts/run/run-stage-read.ts +2 -2
  801. package/scripts/run/run-stage.ts +6 -4
  802. package/scripts/run/run-status-cli.ts +7 -5
  803. package/scripts/run/run-status.ts +6 -7
  804. package/scripts/run/run-step-cli.ts +13 -15
  805. package/scripts/run/run-step.ts +62 -48
  806. package/scripts/run/run-stop-notify.ts +7 -8
  807. package/scripts/run/run-stranded-cli.ts +1 -1
  808. package/scripts/run/run-stranded-detect.ts +4 -4
  809. package/scripts/run/run-stranded.ts +11 -13
  810. package/scripts/run/run-tail-cli.ts +15 -16
  811. package/scripts/run/run-tail.ts +14 -33
  812. package/scripts/run/run-watcher-guard-cli.ts +3 -4
  813. package/scripts/run/run-watcher-guard.ts +11 -12
  814. package/scripts/run/run-watcher-hook.ts +6 -12
  815. package/scripts/run/ship/run-ship-cli.ts +67 -33
  816. package/scripts/run/ship/run-ship-detach.ts +15 -13
  817. package/scripts/run/ship/run-ship-lock.ts +1 -1
  818. package/scripts/run/ship/run-ship-next.ts +7 -8
  819. package/scripts/run/ship/run-ship-pre-detach.ts +27 -11
  820. package/scripts/run/ship/run-ship-preflight.ts +10 -11
  821. package/scripts/run/ship/run-ship-probe.ts +4 -4
  822. package/scripts/run/ship/run-ship-return.ts +1 -1
  823. package/scripts/run/ship/run-ship-review-steps.ts +43 -24
  824. package/scripts/run/ship/run-ship-review.ts +12 -14
  825. package/scripts/run/ship/run-ship-scoped.ts +15 -6
  826. package/scripts/run/ship/run-ship-stage.ts +80 -26
  827. package/scripts/run/ship/run-ship-steps.ts +26 -16
  828. package/scripts/run/ship/run-ship-stop-text.ts +4 -2
  829. package/scripts/run/ship/run-ship-sync.ts +9 -8
  830. package/scripts/run/ship/run-ship.ts +17 -32
  831. package/scripts/run/tidy/run-tidy-cli.ts +9 -5
  832. package/scripts/run/tidy/run-tidy-lanes.ts +18 -7
  833. package/scripts/run/tidy/run-tidy-stashes.ts +8 -8
  834. package/scripts/run/tidy/run-tidy.ts +4 -3
  835. package/scripts/run/wake/run-wake-cli.ts +27 -33
  836. package/scripts/run/wake/run-wake-describe.ts +76 -29
  837. package/scripts/run/wake/run-wake-driver.ts +14 -14
  838. package/scripts/run/wake/run-wake-handoff.ts +6 -6
  839. package/scripts/run/wake/run-wake-loop.ts +13 -21
  840. package/scripts/run/wake/run-wake-restart.ts +4 -5
  841. package/scripts/run/wake/run-wake-session.ts +23 -27
  842. package/scripts/run/wake/run-wake.ts +57 -328
  843. package/scripts/safe-chain/ci-installer-pin.ts +3 -3
  844. package/scripts/safe-chain/pack-hook.ts +2 -2
  845. package/scripts/safe-chain/preinstall-command.ts +2 -2
  846. package/scripts/security/security-audit-logic.ts +1 -1
  847. package/scripts/security/security-audit-provision-logic.ts +1 -1
  848. package/scripts/security/security-audit-provision.ts +2 -2
  849. package/scripts/security/security-audit.ts +5 -5
  850. package/scripts/security/security-updates-logic.ts +2 -3
  851. package/scripts/security/security-updates.ts +2 -4
  852. package/scripts/self-sync-guard/index.ts +1 -1
  853. package/scripts/self-sync-guard/self-sync-guard-logic.ts +2 -2
  854. package/scripts/self-sync-guard/self-sync-refusal.ts +1 -1
  855. package/scripts/sonar/sonar-hotspots-cli.ts +1 -1
  856. package/scripts/sonar/sonar-hotspots.ts +1 -1
  857. package/scripts/sonar/sonar-new-code-cli.ts +1 -1
  858. package/scripts/sonar/sonar-new-code.ts +1 -1
  859. package/scripts/sonar/sonar-project.ts +1 -1
  860. package/scripts/split/split-assess-cli.ts +1 -1
  861. package/scripts/split/split-assess.ts +3 -3
  862. package/scripts/sync/directory-copy-guard.ts +2 -3
  863. package/scripts/sync/managed-config-scope-cli.ts +1 -2
  864. package/scripts/sync/managed-config-scope.ts +4 -4
  865. package/scripts/sync/plugin-skill-directories.ts +2 -2
  866. package/scripts/sync/reconcile-templates.ts +17 -8
  867. package/scripts/sync/removed-skill-manifest.ts +2 -3
  868. package/scripts/sync/sync-ai-files.ts +7 -7
  869. package/scripts/sync/sync-configs.ts +30 -3
  870. package/scripts/sync/sync-hook-safety.ts +2 -2
  871. package/scripts/sync/sync.ts +23 -10
  872. package/scripts/sync/synced-paths.ts +2 -1
  873. package/scripts/sync/workflow-pin-logic.ts +1 -1
  874. package/scripts/test/test-declared-changed.ts +4 -4
  875. package/scripts/test/test-declared-logic.ts +2 -3
  876. package/scripts/test/test-declared-match.ts +25 -4
  877. package/scripts/test/test-declared.ts +26 -9
  878. package/scripts/test/test-red-commit.ts +3 -2
  879. package/scripts/test/test-red-logic.ts +7 -14
  880. package/scripts/test/test-red.ts +12 -47
  881. package/scripts/test/test-related-scope.ts +2 -3
  882. package/scripts/test/test-related.ts +3 -3
  883. package/scripts/test/test-type-logic.ts +1 -2
  884. package/scripts/test/test-unit-guard.ts +13 -17
  885. package/scripts/test/unit-worker-share.ts +7 -8
  886. package/scripts/time-runtime/time-agent-bundles.ts +2 -4
  887. package/scripts/time-runtime/time-background.ts +17 -21
  888. package/scripts/time-runtime/time-batch-guard.ts +67 -342
  889. package/scripts/time-runtime/time-bundle-call.ts +26 -28
  890. package/scripts/time-runtime/time-bundles.ts +11 -12
  891. package/scripts/time-runtime/time-call-identity.ts +1 -1
  892. package/scripts/time-runtime/time-command-key.ts +2 -2
  893. package/scripts/time-runtime/time-density-hook.ts +8 -11
  894. package/scripts/time-runtime/time-density.ts +5 -5
  895. package/scripts/time-runtime/time-followup-stage.ts +7 -7
  896. package/scripts/time-runtime/time-format.ts +5 -5
  897. package/scripts/time-runtime/time-hook-transcript.ts +3 -3
  898. package/scripts/time-runtime/time-instant.ts +1 -1
  899. package/scripts/time-runtime/time-markers.ts +15 -19
  900. package/scripts/time-runtime/time-phase-names.ts +3 -3
  901. package/scripts/time-runtime/time-reported-failure.ts +15 -19
  902. package/scripts/time-runtime/time-round-trips.ts +20 -23
  903. package/scripts/time-runtime/time-shell.ts +8 -8
  904. package/scripts/time-runtime/time-single-check.ts +1 -2
  905. package/scripts/time-runtime/time-spans.ts +35 -40
  906. package/scripts/time-runtime/time-tool-call.ts +15 -16
  907. package/scripts/time-runtime/time-transcript-line.ts +53 -34
  908. package/scripts/time-runtime/time-writes.ts +5 -5
  909. package/scripts/ui/ui-routes-cli.ts +1 -2
  910. package/scripts/ui/ui-routes.ts +1 -2
  911. package/scripts/version/bump-version.ts +1 -1
  912. package/scripts/version/fresh-metadata-cache.ts +2 -2
  913. package/scripts/version/latest-corepack.ts +129 -98
  914. package/scripts/version/latest-lane-guard.ts +1 -1
  915. package/scripts/version/latest-scope-cli.ts +2 -2
  916. package/scripts/version/latest-stamp.ts +1 -2
  917. package/scripts/version/latest-update.ts +2 -2
  918. package/scripts/version/npm-registry.ts +2 -2
  919. package/scripts/version/package-manager-version.ts +18 -0
  920. package/scripts/version/publishable-range-check.ts +2 -1
  921. package/scripts/version/publishable-range.ts +1 -1
  922. package/scripts/version/release-age.ts +11 -11
  923. package/scripts/version/release-hold.ts +2 -2
  924. package/scripts/version/safe-chain-version-update.ts +3 -3
  925. package/scripts/version/version-check-logic.ts +2 -3
  926. package/scripts/version/version-check.ts +1 -2
  927. package/scripts/version/version-command-config.ts +2 -2
  928. package/scripts/version/version-commands.ts +3 -3
  929. package/scripts/version/version-remote.ts +4 -4
  930. package/scripts/version/version-targets.ts +2 -2
  931. package/templates/gitignore +7 -0
  932. package/templates/workflows/github-release.yml +4 -0
  933. package/dist/hooks/chunk-NV2JRZZO.js +0 -6385
  934. package/dist/hooks/chunk-RKUAD3I6.js +0 -90
  935. package/dist/hooks/chunk-WPALEIRX.js +0 -18
  936. package/scripts/backlog/backlog-restructure.ts +0 -152
  937. package/scripts/rules/issue-fold-rule.ts +0 -72
  938. package/scripts/rules/wip-cap.ts +0 -63
  939. package/scripts/run/run-issue-number.ts +0 -19
@@ -13,11 +13,10 @@ import { run_progress_clock } from './run-progress-clock'
13
13
  import { run_progress_read, type ObservationRead } from './run-progress-read'
14
14
 
15
15
  // `josh run:progress` — the background watcher that breaks a long silence with one line of
16
- // observations, and `--mark`, which tells its clock that a real report just happened
17
- // (joshuafolkken/kit#1520).
16
+ // observations, and `--mark`, which tells its clock that a real report just happened.
18
17
  //
19
18
  // **This is the one josh command that is meant to be started and left running.** Every other one
20
- // answers once and the parent's own loop drives it; that shape was rejected here on purpose, because
19
+ // answers once and the parent's own loop drives it; that shape does not fit here, because
21
20
  // a parent that waits and reports spends one of its own turns per heartbeat — 36 of them in a
22
21
  // three-hour run, taken at the point its context is largest. So the loop lives here, the parent
23
22
  // starts it in the background, and all the parent does is relay what appears.
@@ -30,7 +29,8 @@ import { run_progress_read, type ObservationRead } from './run-progress-read'
30
29
  // **It cannot send a Telegram.** That is structural rather than a promise — nothing here imports
31
30
  // `scripts/notify/telegram-notify`, which is the only egress there is. A heartbeat every twenty minutes on
32
31
  // a phone is notification fatigue, and it would cheapen the `confirmation` and `completion` messages
33
- // that do need to interrupt someone.
32
+ // that do need to interrupt someone. Only an explicit `run:board --every <minutes>`, started because a
33
+ // person asked for periodic progress off-screen, sends one.
34
34
 
35
35
  const SUCCESS_EXIT_CODE = 0
36
36
  const FAILURE_EXIT_CODE = 1
@@ -52,20 +52,19 @@ const DECLINE_RETRY_SECONDS = 120
52
52
  // The clock a fresh loop starts with: nothing has declined yet, so nothing is being waited out.
53
53
  const NO_RETRY = 0
54
54
  const { DEFAULT_WAIT_MAX_HOURS } = run_progress_args
55
- const ENVIRONMENT_KEY = 'JOSH_PROGRESS'
56
- const DISABLED_VALUE = '0'
55
+ const { DISABLED_KEY, DISABLED_VALUE, is_disabled } = run_progress
57
56
 
58
- // joshuafolkken/kit#2480: a malformed `--wait` exits at once, and read as "started" it left a person
59
- // without progress until someone looked at the exit — so the refusal says the relay is down.
57
+ // A malformed `--wait` exits at once, and read as "started" it would leave a person without progress
58
+ // until someone looked at the exit — so the refusal says the relay is down.
60
59
  const USAGE =
61
60
  'Usage: josh run:progress [--repo <owner/repo>] [--interval <minutes>] [--output <path>] [--once | --wait] [--hours <hours>] | josh run:progress --mark | josh run:progress --path\nThe progress watcher did not start, so nothing is relaying progress to this session — fix the arguments (one flag and one value per argument) and start it again.'
62
- const DISABLED_NOTICE = `\`${ENVIRONMENT_KEY}=${DISABLED_VALUE}\` is set, so no progress is reported.`
61
+ const DISABLED_NOTICE = `\`${DISABLED_KEY}=${DISABLED_VALUE}\` is set, so no progress is reported.`
63
62
  const MARKED_NOTICE =
64
63
  'Recorded a report at this moment. The next progress line waits a full interval from here, so a heartbeat cannot land immediately behind a real report.'
65
64
  // A dispatched lane child carries `JOSH_LANE_CHILD`, and only the outermost run reports progress — a
66
- // child that started a watcher of its own would be the second one this command's whole design refuses
67
- // (joshuafolkken/kit#1947). The decision used to live in prose the child read as "start none"; the mark
68
- // makes it mechanical, so a bare `fullrun #N` handed to a lane no longer reads itself as outermost.
65
+ // child that started a watcher of its own would be the second one this command's whole design refuses.
66
+ // The mark makes that mechanical, so a bare `fullrun #N` handed to a lane does not read itself as
67
+ // outermost.
69
68
  const LANE_CHILD_NOTICE =
70
69
  'This session is a dispatched lane child (`JOSH_LANE_CHILD`), so no progress watcher is started — the outermost run reports for every child.'
71
70
  const IDLE_NOTICE =
@@ -74,15 +73,14 @@ const UNREADABLE_NOTICE =
74
73
  'The `in-progress` listing could not be read, so nothing is reported. That is not "nothing is running" — check `gh auth status` and ask again.'
75
74
  const FAILED_TICK_PREFIX =
76
75
  'A progress reading failed, so nothing is reported for it. The watcher is still running, and will read again after the cooldown:'
77
- const WAIT_EXPIRED_NOTICE = `The watch bound (\`--hours\`, ${String(DEFAULT_WAIT_MAX_HOURS)} by default for \`--wait\`) ran out with no newly runnable work arriving. Every report it made is already on the run's event stream (\`pnpm josh run:event --watch\`), so there is nothing to relay. Starting another \`--wait\` resumes the same clock.`
76
+ const WAIT_EXPIRED_NOTICE = `The watch bound (\`--hours\`, ${String(DEFAULT_WAIT_MAX_HOURS)} by default for \`--wait\`) ran out with no newly runnable work arriving. Every report it made is already on the run's event stream, which the \`pnpm josh run:board\` pane draws, so there is nothing to relay. Starting another \`--wait\` resumes the same clock.`
78
77
  // The repository name is only ever printed, never written against, so the bounded lookup is the right
79
78
  // one: a `gh` call that hangs would otherwise block the synchronous read at startup and leave the
80
79
  // watcher neither running nor saying so.
81
80
  const REPO_LOOKUP_TIMEOUT_SECONDS = 10
82
81
  const REPO_LOOKUP_TIMEOUT_MS = REPO_LOOKUP_TIMEOUT_SECONDS * run_progress.MS_PER_SECOND
83
82
  // A lookup that timed out or failed is not an argument the caller got wrong, so it is told apart from
84
- // the usage error — read as one, it sent a person to fix arguments that were correct
85
- // (joshuafolkken/kit#2859).
83
+ // the usage error — read as one, it would send a person to fix arguments that were correct.
86
84
  const REPO_UNRESOLVED_NOTICE = `The repository could not be resolved (\`gh\` did not answer within ${String(REPO_LOOKUP_TIMEOUT_SECONDS)}s or failed), so the progress watcher did not start. Pass \`--repo <owner/repo>\` and start it again.`
87
85
 
88
86
  const DECLINE_NOTICES: Readonly<Record<'idle' | 'unreadable', string>> = {
@@ -105,8 +103,7 @@ interface WatchOptions {
105
103
  repo: string
106
104
  tick_ms: number
107
105
  // `--wait` alone: the line goes to the run's event stream and the ambient log, never to standard
108
- // output, because a background command's output reaches the session only as a wake
109
- // (joshuafolkken/kit#3102).
106
+ // output, because a background command's output reaches the session only as a wake.
110
107
  is_stream_only?: boolean
111
108
  }
112
109
 
@@ -120,8 +117,7 @@ type DeclineKind = Exclude<ObservationRead['kind'], 'observed'>
120
117
 
121
118
  // A union rather than an optional field, so a caller that wants the reason has to establish that
122
119
  // there is one — the reason exists exactly when no line went out. `line` is the exact string printed,
123
- // handed back so the caller can persist it verbatim for `josh run:wake --list` to relay
124
- // (joshuafolkken/kit#1910).
120
+ // handed back so the caller can persist it verbatim for `josh run:wake --list` to relay.
125
121
  type EmitResult = { kind: DeclineKind } | { kind: 'observed'; state: ProgressState; line: string }
126
122
 
127
123
  interface WatchLoop {
@@ -141,10 +137,6 @@ const FRESH_LOOP: Omit<WatchLoop, 'last_ms'> = {
141
137
  state: undefined,
142
138
  }
143
139
 
144
- function is_disabled(): boolean {
145
- return process.env[ENVIRONMENT_KEY] === DISABLED_VALUE
146
- }
147
-
148
140
  function report_usage(): number {
149
141
  console.error(USAGE)
150
142
 
@@ -197,7 +189,7 @@ async function emit(options: WatchOptions, context: EmitContext): Promise<EmitRe
197
189
  const state = run_progress.next_state(context.state, key, context.now_ms)
198
190
 
199
191
  // The interval reaches the line from the options rather than being resolved a second time, so the
200
- // schedule printed and the clock `step` consults are one number (joshuafolkken/kit#1726). Both
192
+ // schedule printed and the clock `step` consults are one number. Both
201
193
  // reporting forms come through here, which is what puts the field on `--wait` and `--once` alike.
202
194
  const line = run_progress.format_line(read.observations, {
203
195
  interval_ms: options.interval_ms,
@@ -261,7 +253,7 @@ async function attempt(
261
253
  * print one straight after the run's real report — which is the single thing this command is built
262
254
  * not to do.
263
255
  *
264
- * **A tick that printed nothing does not move the report clock.** A decline now means no run has
256
+ * **A tick that printed nothing does not move the report clock.** A decline means no run has
265
257
  * started here at all, so the silence has not been broken and the first report is emitted at once
266
258
  * instead of waiting out an interval spent idle; what a decline moves instead is the read cooldown.
267
259
  */
@@ -292,9 +284,9 @@ async function step(options: WatchOptions, target: string, loop: WatchLoop): Pro
292
284
  * The loop both reporting forms are, with one difference between them.
293
285
  *
294
286
  * `watch` runs until `--hours` expires; `--wait` stops at the first arrival and keeps its lines off
295
- * standard output (joshuafolkken/kit#3102). Everything else — where the clock is seeded from, the tick, the decline
296
- * cooldown `step` keeps — is one implementation on purpose: two copies would let a fix to the bound or
297
- * to the initial silence reach one form and not the other, and `--wait` is the form a run starts.
287
+ * standard output. Everything else — where the clock is seeded from, the tick, the decline cooldown
288
+ * `step` keeps — is one implementation on purpose: two copies would let a fix to the bound or to the
289
+ * initial silence reach one form and not the other, and `--wait` is the form a run starts.
298
290
  */
299
291
  // The silence this loop starts from: the record where there is one, and otherwise the moment it began
300
292
  // watching, so a first line on a tree with no record reports the wait it actually did.
@@ -304,11 +296,11 @@ function seed_loop(target: string, started_ms: number): WatchLoop {
304
296
 
305
297
  // Why the loop stopped, so `drive` prints the bound-expired notice only when the bound is what
306
298
  // expired — not when `josh followup` ended the watcher, which is a clean stop with nothing to report.
307
- // `arrived` is a `--wait` ended early by newly runnable work (joshuafolkken/kit#2503).
299
+ // `arrived` is a `--wait` ended early by newly runnable work.
308
300
  type WatchExit = 'arrived' | 'ended' | 'bound'
309
301
 
310
302
  // `wait` is present for `--wait` alone, which ends at the first arrival its probe sees. **A report is
311
- // not an exit** (joshuafolkken/kit#3102): every exit wakes the session that started it, and a wake
303
+ // not an exit**: every exit wakes the session that started it, and a wake
312
304
  // spent relaying a line the event stream already carries is the most expensive turn a run takes, so
313
305
  // only what the parent has to act on ends the wait.
314
306
  async function wait_exit(wait: ArrivalProbe | undefined): Promise<WatchExit | undefined> {
@@ -334,10 +326,9 @@ function final_exit(life: string): WatchExit {
334
326
  }
335
327
 
336
328
  // The loop both reporting forms share, reading its own liveness record at the top of each pass — the
337
- // `run-wake-loop.ts` `run_loop` shape (joshuafolkken/kit#1727). A record gone means `josh followup`
338
- // removed it at the merge, so the watcher stops at once instead of waiting out its bound
339
- // (joshuafolkken/kit#1821); `--wait` also stops at the first arrival, and otherwise the loop runs
340
- // until `--hours` expires.
329
+ // `run-wake-loop.ts` `run_loop` shape. A record gone means `josh followup` removed it at the merge,
330
+ // so the watcher stops at once instead of waiting out its bound; `--wait` also stops at the first
331
+ // arrival, and otherwise the loop runs until `--hours` expires.
341
332
  async function run_ticks(
342
333
  options: WatchOptions,
343
334
  target: string,
@@ -370,8 +361,8 @@ async function drive(options: WatchOptions, is_wait: boolean): Promise<number> {
370
361
  const exit = await run_ticks(options, target, life, wait)
371
362
 
372
363
  if (exit === 'bound' && is_wait) console.error(WAIT_EXPIRED_NOTICE)
373
- // Every `--wait` exit is a wake, so it carries the pick-up reading with it (joshuafolkken/kit#2452) —
374
- // the reading an `arrived` exit was woken for.
364
+ // Every `--wait` exit is a wake, so it carries the pick-up reading with it — the reading an
365
+ // `arrived` exit was woken for.
375
366
  if (is_wait) await backlog_ready.print_ready_line()
376
367
 
377
368
  return SUCCESS_EXIT_CODE
@@ -398,31 +389,28 @@ async function once(options: WatchOptions): Promise<number> {
398
389
  }
399
390
 
400
391
  /**
401
- * The form a run starts in the background: it reports on its own and wakes the caller only for work
402
- * (joshuafolkken/kit#3102).
392
+ * The form a run starts in the background: it reports on its own and wakes the caller only for work.
403
393
  *
404
- * **A report is not a wake.** It once ended at its first line so a harness that delivers a background
405
- * command's output only on exit would relay it (joshuafolkken/kit#1576) — which cost the orchestrating
406
- * session one turn per heartbeat, re-reading a hundred thousand tokens of context to pass on a line it
407
- * was forbidden to change. Every line already reaches the run's event stream as a `heartbeat` and the
408
- * ambient log, which a person's `run:event --watch` pane reads with no model in between, so this form
409
- * keeps its lines off standard output and exits only on an arrival, on `josh followup` ending its life
410
- * record, or on its bound. The caller starts it once and restarts it only after one of those.
394
+ * **A report is not a wake.** Ending at each line would cost the orchestrating session one turn per
395
+ * heartbeat, re-reading its whole context to pass on a line it may not change. Every line already
396
+ * reaches the run's event stream as a `heartbeat` and the ambient log, which a person's `run:board`
397
+ * pane reads with no model in between, so this form keeps its lines off standard output and exits
398
+ * only on an arrival, on `josh followup` ending its life record, or on its bound. The caller starts it
399
+ * once and restarts it only after one of those.
411
400
  *
412
401
  * **The clock is still this command's, not the caller's.** It is the watch loop itself, a tick at a
413
402
  * time, rather than a second reading of the same record — so a real report elsewhere pushes the next
414
- * line out and a declined reading takes the same cooldown. That is what keeps joshuafolkken/kit#1570
415
- * intact: the caller arms no timer of its own.
403
+ * line out and a declined reading takes the same cooldown, and the caller arms no timer of its own.
416
404
  *
417
405
  * **One at a time is the caller's part rather than this loop's.** The record is read before the `gh`
418
406
  * reads and written after them, so two of these running at once could both find the same silence due
419
407
  * and both print; `backlogrun.md` starts exactly one, which is where that is guaranteed.
420
408
  *
421
- * **A decline is not an exit.** A decline now means no run has started here at all — no hold, no
409
+ * **A decline is not an exit.** A decline means no run has started here at all — no hold, no
422
410
  * carried budget, no lane, and no `in-progress` child — so a genuinely idle repository keeps the loop
423
411
  * waiting instead of ending it; returning there would hand the caller an instant answer to restart,
424
412
  * and the documented restart makes that a poll rather than a heartbeat. Once a run has started the
425
- * loop reports even before the first child carries `in-progress` (joshuafolkken/kit#1900).
413
+ * loop reports even before the first child carries `in-progress`.
426
414
  */
427
415
  async function wait_once(options: WatchOptions): Promise<number> {
428
416
  return await drive({ ...options, is_stream_only: true }, true)
@@ -436,7 +424,7 @@ async function mark_now(): Promise<number> {
436
424
  }
437
425
 
438
426
  // The ambient log's path on standard output, so a person can `tail -F` the surface the heartbeat keeps
439
- // across a session cut (joshuafolkken/kit#2156). It reads no run state, so it answers even before one
427
+ // across a session cut. It reads no run state, so it answers even before one
440
428
  // has started and in a lane child alike — the path is a function of the checkout, not of a live run.
441
429
  async function report_path(): Promise<number> {
442
430
  console.info(await run_progress_read.log_target())
@@ -497,6 +485,7 @@ async function main(argv: ReadonlyArray<string>): Promise<void> {
497
485
  }
498
486
 
499
487
  const run_progress_cli = {
488
+ DECLINE_RETRY_SECONDS,
500
489
  DEFAULT_WAIT_MAX_HOURS,
501
490
  DISABLED_NOTICE,
502
491
  FAILED_TICK_PREFIX,
@@ -1,12 +1,12 @@
1
1
  import { git_common_directory } from '#scripts/git/git-common-directory'
2
2
  import { stamp_file } from '#scripts/josh/stamp-file'
3
3
  import { error_text } from '#scripts/lib/error-message'
4
+ import { json_value } from '#scripts/lib/json-value'
4
5
  import { z } from 'zod'
5
6
 
6
- // The report clock `josh run:progress` keeps, in the one form both of its readers can use
7
- // (joshuafolkken/kit#1570).
7
+ // The report clock `josh run:progress` keeps, in the one form both of its readers can use.
8
8
  //
9
- // **It exists because a second reader arrived, and that one cannot await.** The watcher reads the
9
+ // **One of its two readers cannot await.** The watcher reads the
10
10
  // record between ticks, where an `async` call costs nothing; the trigger-delivered rule that refuses
11
11
  // an early heartbeat (`scripts/rules/early-heartbeat.ts`) reads it inside a `PreToolUse` hook, whose
12
12
  // decision is synchronous from payload to envelope. Copying the record's shape into the hook would be
@@ -26,17 +26,17 @@ const PROGRESS_PREFIX = 'josh-run-progress-'
26
26
  // run last reported and is written on every heartbeat, so it can never double as "should this watcher
27
27
  // still be running". This one is presence-only — the watcher writes it once when it begins, reads it
28
28
  // every tick, and ends the moment it is gone, which is how `josh followup` stops a watcher at the
29
- // merge instead of leaving it to wait out its whole bound (joshuafolkken/kit#1821). It reuses the same
30
- // key as the report clock — the work tree's own git directory — so both name one file per run.
29
+ // merge instead of leaving it to wait out its whole bound. It reuses the same key as the report clock
30
+ // — the work tree's own git directory — so both name one file per run.
31
31
  //
32
32
  // **The loop that reads its own record and exits when it is gone is `run-wake-loop.ts`'s `run_loop`
33
- // pattern (joshuafolkken/kit#1727), and the read/write is `stamp_file`.** Neither is re-implemented
33
+ // pattern, and the read/write is `stamp_file`.** Neither is re-implemented
34
34
  // here: this module only names the record, exactly as it names the report clock. Unlike `run-hold`'s
35
35
  // and `run-carry`'s records it needs no expiry, because it is read only by the one watcher that wrote
36
36
  // it — never by another run deciding whether a resource is free — so a fresh watcher always overwrites
37
37
  // a stale one and there is no cross-run read to fall open.
38
38
  const LIFE_PREFIX = 'josh-run-progress-life-'
39
- // **The ambient surface the heartbeat keeps across a session cut** (joshuafolkken/kit#2156). The report
39
+ // **The ambient surface the heartbeat keeps across a session cut.** The report
40
40
  // clock holds only the *last* line, which `josh run:wake --list` relays on demand — a person has to
41
41
  // type for it, so after a cut the heartbeat sits at the *requested* tier. This log mirrors every
42
42
  // heartbeat line into a plain-text file beside the clock, so a person who keeps `tail -F` open on it
@@ -59,7 +59,7 @@ const BLOCK_SEPARATOR = '\n\n'
59
59
 
60
60
  // `line` is the last heartbeat the watcher printed, kept verbatim beside the clock so a reader that
61
61
  // cannot see the watcher's transcript — a person checking a woken headless `backlogrun` through
62
- // `josh run:wake --list` — still reads the exact line it emitted (joshuafolkken/kit#1910). It is
62
+ // `josh run:wake --list` — still reads the exact line it emitted. It is
63
63
  // optional because a bare `--mark` moves the clock without producing one, and because a record written
64
64
  // before this field existed carries only `reported_at`.
65
65
  const report_stamp_schema = z.object({ reported_at: z.string(), line: z.string().optional() })
@@ -78,18 +78,14 @@ function parse_stamp(raw: string): number | undefined {
78
78
  * The last heartbeat line the watcher persisted, or `undefined` for an absent, unparsable, or
79
79
  * pre-`line` record. This is what `josh run:wake --list` relays to a person who is no longer the parent
80
80
  * session — the headless parent woken after a cut prints its progress only to its own transcript, and
81
- * this record is the one place that line survives (joshuafolkken/kit#1910).
81
+ * this record is the one place that line survives.
82
82
  */
83
83
  function read_last_line(target: string): string | undefined {
84
84
  const raw = stamp_file.read_stamp_text(target)
85
85
 
86
86
  if (raw === undefined) return undefined
87
87
 
88
- try {
89
- return report_stamp_schema.safeParse(JSON.parse(raw)).data?.line
90
- } catch {
91
- return undefined
92
- }
88
+ return json_value.parse_with(raw, report_stamp_schema)?.line
93
89
  }
94
90
 
95
91
  /**
@@ -112,13 +108,13 @@ function read_last_report(target: string): number | undefined {
112
108
  }
113
109
 
114
110
  // The ambient log's path, a sibling of the report clock so one directory names both and the CLI can
115
- // derive it from the clock target alone (joshuafolkken/kit#2156).
111
+ // derive it from the clock target alone.
116
112
  function log_path_of(target: string): string {
117
113
  return `${target}${LOG_SUFFIX}`
118
114
  }
119
115
 
120
- // **Staleness is read from the report clock's own last timestamp, not the log file's mtime**
121
- // (joshuafolkken/kit#2156). The clock's `reported_at` is the run's own clock — a copy or a backup can
116
+ // **Staleness is read from the report clock's own last timestamp, not the log file's mtime.** The
117
+ // clock's `reported_at` is the run's own clock — a copy or a backup can
122
118
  // move a file's mtime, and a fresh run whose first heartbeat found a previous run's log would then
123
119
  // append to it. It is read before `mark` overwrites the clock, so it sees the *previous* report.
124
120
  function is_log_stale(target: string, now_ms: number): boolean {
@@ -162,10 +158,9 @@ function append_line(
162
158
 
163
159
  // A heartbeat carries its line; a bare `--mark` (a real report resetting the clock) carries none and
164
160
  // **preserves the line already there** rather than blanking it — so `josh run:wake --list` keeps
165
- // showing the most recent heartbeat between a run's real reports rather than going empty on every one
166
- // (joshuafolkken/kit#1910). A carried line is also mirrored into the ambient log — the surface a person
167
- // keeps open across a cut — before the clock is overwritten, so staleness sees the previous report
168
- // (joshuafolkken/kit#2156).
161
+ // showing the most recent heartbeat between a run's real reports rather than going empty on every one.
162
+ // A carried line is also mirrored into the ambient log — the surface a person keeps open across a cut
163
+ // — before the clock is overwritten, so staleness sees the previous report.
169
164
  function mark(target: string, now_ms: number, line?: string): void {
170
165
  const reported_at = new Date(now_ms).toISOString()
171
166
  const kept = line ?? read_last_line(target)
@@ -177,9 +172,8 @@ function mark(target: string, now_ms: number, line?: string): void {
177
172
  stamp_file.write_stamp(target, kept === undefined ? { reported_at } : { reported_at, line: kept })
178
173
  }
179
174
 
180
- // `undefined` is passed straight through so `stamp_file`'s own default root stands, which is what the
181
- // caller got before this function existed. Hashing an empty string instead would key the record on a
182
- // path no other code path produces.
175
+ // `undefined` is passed straight through so `stamp_file`'s own default root stands. Hashing an empty
176
+ // string instead would key the record on a path no other code path produces.
183
177
  function stamp_target_of(git_directory: string | undefined): string {
184
178
  return stamp_file.stamp_path(PROGRESS_PREFIX, git_directory)
185
179
  }
@@ -193,10 +187,9 @@ function life_target_of(git_directory: string | undefined): string {
193
187
 
194
188
  // **`pinged_at` is written by every tick and checked by `is_life_fresh`.** Without it the life record
195
189
  // is presence-only — existence is the only signal, and a record from a watcher that stopped an hour
196
- // ago is indistinguishable from one whose watcher is live. Adding `pinged_at` to the payload lets a
197
- // guard detect "children in-flight but watcher stale" without a second file (joshuafolkken/kit#2113).
198
- // Old records carrying only `{ alive: true }` parse successfully; `pinged_at` is optional on read,
199
- // which is what makes this backward-compatible.
190
+ // ago is indistinguishable from one whose watcher is live. `pinged_at` in the payload lets a guard
191
+ // detect "children in-flight but watcher stale" without a second file. It is optional on read, so a
192
+ // record carrying only `{ alive: true }` still parses.
200
193
  const life_schema = z.object({ alive: z.literal(true), pinged_at: z.string().optional() })
201
194
 
202
195
  // The watcher declares itself alive. `write_stamp` unlinks first, so a fresh `--wait` cleanly replaces
@@ -221,9 +214,9 @@ function parse_pinged_at(raw: string): number | undefined {
221
214
  return Number.isNaN(pinged_ms) ? undefined : pinged_ms
222
215
  }
223
216
 
224
- // Returns `false` for any absent, unreadable or un-timestamped record — both "no watcher" and "old
225
- // watcher that predates joshuafolkken/kit#2113" produce `false`, which is the safe direction for a
226
- // guard: it speaks up rather than staying silent.
217
+ // Returns `false` for any absent, unreadable or un-timestamped record — both "no watcher" and a record
218
+ // without `pinged_at` produce `false`, which is the safe direction for a guard: it speaks up rather
219
+ // than staying silent.
227
220
  function is_life_fresh(target: string, threshold_ms: number): boolean {
228
221
  const raw = stamp_file.read_stamp_text(target)
229
222
 
@@ -243,7 +236,7 @@ function is_life_fresh(target: string, threshold_ms: number): boolean {
243
236
  // **Gone means ended.** `read_stamp_text` answers `undefined` for an absent or unowned record, and the
244
237
  // only writer is the watcher itself, so absence means `josh followup` removed it — or nobody began
245
238
  // one. Either way the watcher stops, which is the fail-quiet direction: a watcher that kept running on
246
- // a missing record would be the lingering process joshuafolkken/kit#1821 exists to end.
239
+ // a missing record would be the lingering process the liveness record exists to end.
247
240
  function is_life_ended(target: string): boolean {
248
241
  return stamp_file.read_stamp_text(target) === undefined
249
242
  }
@@ -1,17 +1,15 @@
1
1
  import { readFileSync } from 'node:fs'
2
2
  import path from 'node:path'
3
3
  import { ancestor_directories } from '#scripts/lib/ancestor-directories'
4
+ import { json_value } from '#scripts/lib/json-value'
4
5
  import { z } from 'zod'
5
6
  import { run_progress } from './run-progress'
6
7
 
7
- // Where the silence interval comes from, and in what order (joshuafolkken/kit#1576).
8
+ // Where the silence interval comes from, and in what order.
8
9
  //
9
- // **The setting existed and could not leave the machine.** `JOSH_PROGRESS_INTERVAL_MINUTES` is read
10
- // from `.env`, which is deliberately never committed — so a person who set fifteen minutes here got
11
- // twenty on every other machine and in every cloud session, and the guard that enforces the floor got
12
- // twenty with them. Reporting still happened there, at a cadence nobody asked for.
13
- //
14
- // **So the repository carries one of its own.** `josh.progress_interval_minutes` in `package.json` is
10
+ // **The repository carries a setting of its own.** `JOSH_PROGRESS_INTERVAL_MINUTES` is read from
11
+ // `.env`, which is never committed, so it cannot reach other machines or cloud sessions.
12
+ // `josh.progress_interval_minutes` in `package.json` is
15
13
  // committed, is per repository rather than per toolkit, and is read through the same reader both
16
14
  // halves of the mechanism already share — the watcher before it prints, and the `early-heartbeat` row
17
15
  // before it allows an arm. A guard that could disagree with the watcher it guards is worse than no
@@ -39,9 +37,8 @@ const package_schema = z.object({
39
37
  function read_declared_minutes(directory: string): number | undefined {
40
38
  try {
41
39
  const raw = readFileSync(path.join(directory, PACKAGE_FILE), 'utf8')
42
- const parsed = package_schema.safeParse(JSON.parse(raw))
43
40
 
44
- return parsed.success ? parsed.data.josh?.progress_interval_minutes : undefined
41
+ return json_value.parse_with(raw, package_schema)?.josh?.progress_interval_minutes
45
42
  } catch {
46
43
  return undefined
47
44
  }
@@ -12,22 +12,22 @@ import type { ChildObservation, LaneObservation, Observations } from './run-prog
12
12
  import { run_progress_clock } from './run-progress-clock'
13
13
 
14
14
  // Everything `josh run:progress` reads: the last-report record that makes the clock a silence clock,
15
- // and the observations one tick puts on the line (joshuafolkken/kit#1520).
15
+ // and the observations one tick puts on the line.
16
16
  //
17
17
  // **Every reader here is one that already exists.** The children in flight come from
18
18
  // `epic_busy.read_repository`, which is the same `in-progress` listing `epicrun` sizes its lanes
19
19
  // from — a second definition of "running" would let the progress line disagree with the loop that
20
20
  // printed the child. The pull request comes from `run_preflight`, the lanes from `lane_registry`, and
21
- // the transcript sample from `run_liveness.sample_output`, whose symlink-following `statSync` is the
22
- // whole of joshuafolkken/kit#1485; re-`stat`ing the path here would reintroduce that bug.
21
+ // the transcript sample from `run_liveness.sample_output`, whose symlink-following `statSync` is
22
+ // load-bearing; re-`stat`ing the path here would risk losing it.
23
23
  //
24
24
  // **The record is kept per work tree**, keyed the way `run_hold` keys its own: two lanes of one
25
25
  // repository are two runs, and one lane's report must not silence the other's clock.
26
26
 
27
27
  // The record itself — its name, its shape, and how it is read and written — lives in
28
28
  // `run-progress-clock.ts`, because the trigger-delivered rule that refuses an early heartbeat reads
29
- // the same record from inside a `PreToolUse` hook and cannot await the git call this file makes
30
- // (joshuafolkken/kit#1570). What stays here is the asynchronous way of naming the work tree.
29
+ // the same record from inside a `PreToolUse` hook and cannot await the git call this file makes.
30
+ // What stays here is the asynchronous way of naming the work tree.
31
31
  const { mark, parse_stamp, read_last_report } = run_progress_clock
32
32
 
33
33
  const FIRST_LOAD_AVERAGE = 0
@@ -37,7 +37,7 @@ const FIRST_LOAD_AVERAGE = 0
37
37
  // can mean "there is nothing to report", and saying so for the third would be a confident absence
38
38
  // built on a read nobody completed. **The middle one is `idle` only when no run has started** — a run
39
39
  // underway with no `in-progress` child yet is `observed` with an empty `children`, which is the
40
- // heartbeat this file emits before the first label appears (joshuafolkken/kit#1900).
40
+ // heartbeat this file emits before the first label appears.
41
41
  type ObservationRead =
42
42
  { kind: 'idle' } | { kind: 'observed'; observations: Observations } | { kind: 'unreadable' }
43
43
 
@@ -59,13 +59,13 @@ async function stamp_target(): Promise<string> {
59
59
  }
60
60
 
61
61
  // The ambient log's path, a sibling of the report clock — the surface `josh run:progress --path` names
62
- // so a person can keep it open across a session cut (joshuafolkken/kit#2156).
62
+ // so a person can keep it open across a session cut.
63
63
  async function log_target(): Promise<string> {
64
64
  return run_progress_clock.log_path_of(await stamp_target())
65
65
  }
66
66
 
67
67
  // The watcher's liveness record, resolved through the same resolver as `stamp_target`, so the file the
68
- // watcher begins is the file `josh followup` removes at the merge (joshuafolkken/kit#1821).
68
+ // watcher begins is the file `josh followup` removes at the merge.
69
69
  async function live_target(): Promise<string> {
70
70
  return run_progress_clock.life_target_of(await worktree_git_directory())
71
71
  }
@@ -146,8 +146,7 @@ async function has_run_record(): Promise<boolean> {
146
146
 
147
147
  /**
148
148
  * Whether a run has started in this checkout, read from a mechanical record rather than from the
149
- * `in-progress` label — the label is exactly what is missing in the window this bridges
150
- * (joshuafolkken/kit#1900).
149
+ * `in-progress` label — the label is exactly what is missing in the window this bridges.
151
150
  *
152
151
  * A registered lane covers an `epicrun` / `backlogrun` parent whose child has not labelled yet — and
153
152
  * it is the one signal already read for the line, so it is asked first and short-circuits the git