@joshuafolkken/kit 1.1035.0 → 1.1094.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 (605) hide show
  1. package/.claude/settings.json +9 -8
  2. package/.claude/skills/epic-commands/SKILL.md +5 -7
  3. package/.claude/skills/verify-ui/SKILL.md +1 -1
  4. package/.claude/skills/workflow-commands/SKILL.md +21 -13
  5. package/.claude/skills/workflow-commands/background-commands.md +5 -4
  6. package/.claude/skills/workflow-commands/backlogrun-child.md +3 -3
  7. package/.claude/skills/workflow-commands/backlogrun-lanes.md +9 -7
  8. package/.claude/skills/workflow-commands/backlogrun-park.md +6 -0
  9. package/.claude/skills/workflow-commands/backlogrun-progress.md +31 -37
  10. package/.claude/skills/workflow-commands/backlogrun-steps.md +25 -25
  11. package/.claude/skills/workflow-commands/backlogrun.md +2 -2
  12. package/.claude/skills/workflow-commands/chain-rule.md +6 -4
  13. package/.claude/skills/workflow-commands/delegation.md +3 -3
  14. package/.claude/skills/workflow-commands/followup-reference.md +3 -3
  15. package/.claude/skills/workflow-commands/followup.md +7 -3
  16. package/.claude/skills/workflow-commands/fullrun-steps.md +3 -2
  17. package/.claude/skills/workflow-commands/fullrun.md +3 -2
  18. package/.claude/skills/workflow-commands/halfrun.md +16 -19
  19. package/.claude/skills/workflow-commands/issue-comments.md +2 -2
  20. package/.claude/skills/workflow-commands/issue-fold-existing.md +10 -10
  21. package/.claude/skills/workflow-commands/issue-scout.md +1 -1
  22. package/.claude/skills/workflow-commands/kickoff.md +9 -4
  23. package/.claude/skills/workflow-commands/latest-gate.md +1 -1
  24. package/.claude/skills/workflow-commands/needs-human-review.md +1 -1
  25. package/.claude/skills/workflow-commands/observation-filing.md +44 -89
  26. package/.claude/skills/workflow-commands/pre-gate-cut.md +33 -36
  27. package/.claude/skills/workflow-commands/prerequisite.md +1 -1
  28. package/.claude/skills/workflow-commands/prrun.md +36 -0
  29. package/.claude/skills/workflow-commands/retrospective.md +1 -1
  30. package/.claude/skills/workflow-commands/working-tree-hold.md +24 -4
  31. package/.codex/hooks.json +16 -20
  32. package/.github/actions/setup-pnpm/action.yml +93 -0
  33. package/.github/dependabot.yml +5 -1
  34. package/.github/workflows/auto-tag.yml +21 -0
  35. package/.github/workflows/ci.yml +26 -128
  36. package/.github/workflows/pr-classification.yml +5 -41
  37. package/.github/workflows/publish.yml +42 -48
  38. package/.github/workflows/sonar-qube.yml +37 -4
  39. package/AGENTS.md +12 -2
  40. package/CLAUDE.md +15 -16
  41. package/GEMINI.md +14 -2
  42. package/README.md +59 -18
  43. package/SECURITY.md +36 -6
  44. package/cspell/index.yaml +2 -1
  45. package/dist/CLAUDE.md +15 -16
  46. package/dist/config-merge/index.js +15 -3
  47. package/dist/hooks/batch-guard.js +4 -4
  48. package/dist/hooks/{chunk-Y27M6A7X.js → chunk-3C4YCCEF.js} +5 -13
  49. package/dist/hooks/{chunk-D67KVGGY.js → chunk-7ZPFAVR7.js} +17 -88
  50. package/dist/hooks/{chunk-HOYJU5RM.js → chunk-E54KGFEQ.js} +11 -4
  51. package/dist/hooks/{chunk-KG6PZD72.js → chunk-IL27YTPH.js} +2 -2
  52. package/dist/hooks/{chunk-GJT4BNVE.js → chunk-KHWHKJOM.js} +3 -3
  53. package/dist/hooks/{chunk-HU66PWWL.js → chunk-M2XDCUKD.js} +1076 -509
  54. package/dist/hooks/{chunk-GLBDBJOK.js → chunk-NKOG3XAV.js} +199 -304
  55. package/dist/hooks/{chunk-ZXNE6NY3.js → chunk-O4LL4HTI.js} +2 -7
  56. package/dist/hooks/{chunk-XPLP27WA.js → chunk-OIZUHPJI.js} +5 -27
  57. package/dist/hooks/{chunk-EIFCAJRB.js → chunk-UD24EAIL.js} +2546 -1636
  58. package/dist/hooks/codex-hook-adapter.js +10 -11
  59. package/dist/hooks/duplicate-read-guard.js +5 -5
  60. package/dist/hooks/format-edited.js +15 -34
  61. package/dist/hooks/inputs.json +279 -0
  62. package/dist/hooks/investigation-guard.js +5 -5
  63. package/dist/hooks/pretool-guard.js +23 -16
  64. package/dist/hooks/session-lang.js +0 -1
  65. package/dist/hooks/stop-guard.js +188 -509
  66. package/dist/josh.js +166 -225
  67. package/dist/managed-marker/index.js +2 -1
  68. package/dist/version/index.js +412 -64
  69. package/eslint/rules/promise.js +5 -0
  70. package/package.json +13 -8
  71. package/prompts/collaboration-workflow/file-edits.md +6 -53
  72. package/prompts/collaboration-workflow/issue-citation.md +5 -5
  73. package/prompts/collaboration-workflow/operating-rules.md +4 -4
  74. package/prompts/collaboration-workflow/overview.md +13 -1
  75. package/prompts/collaboration-workflow/report-format.md +1 -1
  76. package/prompts/collaboration-workflow/residency.md +4 -4
  77. package/prompts/collaboration-workflow/rule-delivery.md +5 -36
  78. package/prompts/collaboration-workflow/shell-body.md +7 -9
  79. package/prompts/collaboration-workflow/turn-batching.md +21 -37
  80. package/prompts/collaboration-workflow/upstream-interrupt.md +1 -1
  81. package/prompts/collaboration-workflow/wip-cap.md +36 -36
  82. package/prompts/collaboration-workflow.md +5 -8
  83. package/prompts/review-rubric.md +1 -1
  84. package/prompts/review.md +3 -3
  85. package/prompts/sonar-hotspot-handling.md +12 -4
  86. package/prompts/testing-guide.md +3 -3
  87. package/scripts/adopt/adopt-toolkits.ts +2 -2
  88. package/scripts/adopt/adopt.ts +0 -2
  89. package/scripts/agent/agent-argv.ts +0 -2
  90. package/scripts/agent/agent-diagnostics.ts +1 -1
  91. package/scripts/agent/agent-role-profile.ts +0 -7
  92. package/scripts/agent/claude-agent-argv.ts +0 -2
  93. package/scripts/agent/codex-agent-argv.ts +1 -1
  94. package/scripts/agent/codex-hooks.ts +92 -0
  95. package/scripts/agent/interactive-ask.ts +1 -1
  96. package/scripts/auto-ok/auto-ok-cli.ts +15 -25
  97. package/scripts/backlog/backlog-budget.ts +0 -2
  98. package/scripts/backlog/backlog-defect-priority.ts +2 -2
  99. package/scripts/backlog/backlog-drive-cli.ts +10 -8
  100. package/scripts/backlog/backlog-drive-named-offer.ts +16 -3
  101. package/scripts/backlog/backlog-drive-named.ts +2 -1
  102. package/scripts/backlog/backlog-drive.ts +76 -16
  103. package/scripts/backlog/backlog-named.ts +0 -3
  104. package/scripts/backlog/backlog-next.ts +32 -22
  105. package/scripts/backlog/backlog-offer-cli.ts +0 -5
  106. package/scripts/backlog/backlog-plan-cli.ts +6 -8
  107. package/scripts/backlog/backlog-plan.ts +1 -1
  108. package/scripts/backlog/backlog-pool.ts +34 -17
  109. package/scripts/backlog/backlog-rank.ts +106 -0
  110. package/scripts/backlog/backlog-ready.ts +19 -3
  111. package/scripts/backlog/backlog-scope.ts +1 -3
  112. package/scripts/backlog/backlog-stalled-detect.ts +2 -2
  113. package/scripts/backlog/backlog-stalled.ts +0 -1
  114. package/scripts/backlog/backlog-waves.ts +47 -31
  115. package/scripts/behavior/behavior-cli.ts +1 -1
  116. package/scripts/build/build-codex-hooks.ts +26 -0
  117. package/scripts/build/build-hooks.ts +92 -11
  118. package/scripts/build/hook-bundle-stamp.ts +111 -0
  119. package/scripts/cases/cases-cli.ts +1 -1
  120. package/scripts/cases/cases-logic.ts +1 -1
  121. package/scripts/ci/composite-actions.ts +30 -0
  122. package/scripts/ci/pr-classification.ts +3 -3
  123. package/scripts/claude/workflow-destination.ts +10 -1
  124. package/scripts/clone/clone-fingerprint.ts +0 -1
  125. package/scripts/clone/clone-scan-cli.ts +1 -1
  126. package/scripts/clone/clone-scan.ts +1 -1
  127. package/scripts/config-merge/json-format.ts +0 -1
  128. package/scripts/config-merge/patch-yaml-list.ts +1 -1
  129. package/scripts/cost-runtime/codex-usage.ts +2 -9
  130. package/scripts/cost-runtime/cost-attribute.ts +0 -1
  131. package/scripts/cost-runtime/cost-cli.ts +0 -3
  132. package/scripts/cost-runtime/cost-corpus.ts +0 -2
  133. package/scripts/cost-runtime/cost-format.ts +0 -3
  134. package/scripts/cost-runtime/cost-pricing.ts +0 -1
  135. package/scripts/cost-runtime/cost-tokens.ts +0 -1
  136. package/scripts/delegation/delegation-cli.ts +1 -1
  137. package/scripts/delegation/delegation-policy.ts +11 -1
  138. package/scripts/delegation/duplicate-read-guard.ts +0 -8
  139. package/scripts/delegation/fanout-cli.ts +1 -1
  140. package/scripts/delegation/fanout.ts +0 -2
  141. package/scripts/delegation/investigation-reads.ts +1 -164
  142. package/scripts/discovery/repo-map-logic.ts +0 -1
  143. package/scripts/discovery/repo-party-cli.ts +1 -1
  144. package/scripts/doctor/doctor-consumer.ts +4 -6
  145. package/scripts/doctor/doctor-logic.ts +0 -4
  146. package/scripts/doctor/doctor.ts +14 -9
  147. package/scripts/document/document-byte-budget.ts +8 -9
  148. package/scripts/document/document-byte-check.ts +0 -1
  149. package/scripts/document/document-read-cli.ts +0 -2
  150. package/scripts/document/document-section-cli.ts +1 -1
  151. package/scripts/document/document-section.ts +0 -3
  152. package/scripts/document/edit-files-cli.ts +0 -1
  153. package/scripts/document/entry-read-budget.ts +13 -4
  154. package/scripts/document/lane-child-read-set.ts +1 -6
  155. package/scripts/document/read-files-cli.ts +0 -4
  156. package/scripts/document/read-set-cli.ts +0 -2
  157. package/scripts/document/read-set-point-of-use.ts +1 -0
  158. package/scripts/document/read-set-pricing.ts +0 -1
  159. package/scripts/document/read-set-trim.ts +1 -1
  160. package/scripts/epic/epic-add.ts +1 -1
  161. package/scripts/epic/epic-audit-cli.ts +1 -4
  162. package/scripts/epic/epic-audit-orphans.ts +1 -3
  163. package/scripts/epic/epic-audit-rationale.ts +0 -1
  164. package/scripts/epic/epic-audit-report.ts +0 -2
  165. package/scripts/epic/epic-audit.ts +5 -4
  166. package/scripts/epic/epic-bundle-cli.ts +1 -1
  167. package/scripts/epic/epic-bundle-evidence.ts +0 -1
  168. package/scripts/epic/epic-bundle-referenced.ts +1 -5
  169. package/scripts/epic/epic-bundle.ts +0 -4
  170. package/scripts/epic/epic-busy.ts +4 -5
  171. package/scripts/epic/epic-candidate-confirm.ts +0 -5
  172. package/scripts/epic/epic-classify.ts +2 -2
  173. package/scripts/epic/epic-cli-argv.ts +0 -1
  174. package/scripts/epic/epic-close-comment.ts +1 -1
  175. package/scripts/epic/epic-close.ts +5 -2
  176. package/scripts/epic/epic-cross-repo.ts +2 -4
  177. package/scripts/epic/epic-decision.ts +0 -1
  178. package/scripts/epic/epic-fetch.ts +2 -2
  179. package/scripts/epic/epic-index.ts +2 -3
  180. package/scripts/epic/epic-issue.ts +1 -15
  181. package/scripts/epic/epic-lane-offer.ts +20 -30
  182. package/scripts/epic/epic-nested.ts +1 -1
  183. package/scripts/epic/epic-next-read.ts +1 -3
  184. package/scripts/epic/epic-next-views.ts +0 -1
  185. package/scripts/epic/epic-next.ts +1 -10
  186. package/scripts/epic/epic-parse.ts +0 -1
  187. package/scripts/epic/epic-promote.ts +0 -9
  188. package/scripts/epic/epic-rank.ts +37 -0
  189. package/scripts/epic/epic-read.ts +1 -2
  190. package/scripts/epic/epic-reconcile.ts +1 -1
  191. package/scripts/epic/epic-reference.ts +1 -13
  192. package/scripts/epic/epic-relation-recheck.ts +1 -1
  193. package/scripts/epic/epic-relations.ts +1 -1
  194. package/scripts/epic/epic-remove.ts +1 -1
  195. package/scripts/epic/epic-report.ts +0 -1
  196. package/scripts/epic/epic-run.ts +2 -3
  197. package/scripts/epic/epic-shape.ts +1 -1
  198. package/scripts/epic/epic-solo-stale.ts +107 -0
  199. package/scripts/epic/epic-solo.ts +32 -30
  200. package/scripts/epic/epic-triage.ts +1 -1
  201. package/scripts/epic/epic-validate.ts +1 -1
  202. package/scripts/epic/epic.ts +1 -1
  203. package/scripts/exports/unused-members-cli.ts +53 -0
  204. package/scripts/{git → followup}/followup-issue-number.ts +1 -6
  205. package/scripts/{git → followup}/git-followup-cleanup.ts +2 -1
  206. package/scripts/{git → followup}/git-followup-finish.ts +1 -3
  207. package/scripts/{git → followup}/git-followup-flush.ts +2 -2
  208. package/scripts/{git → followup}/git-followup-issue-close.ts +2 -2
  209. package/scripts/{git → followup}/git-followup-label.ts +4 -4
  210. package/scripts/followup/git-followup-merged.ts +112 -0
  211. package/scripts/{git → followup}/git-followup-pending.ts +1 -1
  212. package/scripts/{git → followup}/git-followup-workflow.ts +19 -11
  213. package/scripts/{git → followup}/git-pr-followup-wrapup.ts +9 -3
  214. package/scripts/{git → followup}/git-pr-followup.ts +53 -16
  215. package/scripts/gate/core-budget.ts +3 -9
  216. package/scripts/gate/gate-plan.ts +7 -4
  217. package/scripts/gate/gate-report.ts +0 -6
  218. package/scripts/gate/gate-tree.ts +1 -1
  219. package/scripts/gate/pre-commit-type-check.ts +0 -6
  220. package/scripts/gate/project-checks.ts +7 -8
  221. package/scripts/gate/scoped-green.ts +0 -1
  222. package/scripts/gate/type-check-step.ts +1 -1
  223. package/scripts/gate/verification-gate.ts +0 -2
  224. package/scripts/gh/fix-gh-packages.ts +15 -12
  225. package/scripts/gh/gh-spawn.ts +2 -2
  226. package/scripts/{git → gh}/git-ai-review-scan.ts +1 -5
  227. package/scripts/{git → gh}/git-gh-check.ts +2 -1
  228. package/scripts/{git → gh}/git-gh-exec.ts +1 -1
  229. package/scripts/{git → gh}/git-gh-failure.ts +1 -1
  230. package/scripts/{git → gh}/git-gh-helpers.ts +0 -1
  231. package/scripts/{git → gh}/git-gh-issue-list.ts +2 -0
  232. package/scripts/{git → gh}/git-gh-issue-read.ts +1 -1
  233. package/scripts/{git → gh}/git-gh-issue-rest.ts +6 -3
  234. package/scripts/{git → gh}/git-gh-pr-read.ts +24 -0
  235. package/scripts/{git → gh}/git-gh-pr-rest.ts +5 -2
  236. package/scripts/{git → gh}/git-gh-pr-review.ts +2 -2
  237. package/scripts/{git → gh}/git-gh-pr-rollup.ts +1 -3
  238. package/scripts/{git → gh}/git-gh-pr.ts +3 -1
  239. package/scripts/{git → gh}/git-pr-ai-review.ts +2 -5
  240. package/scripts/{git → gh}/git-pr-checks-eval.ts +0 -10
  241. package/scripts/{git → gh}/git-pr-checks-parse.ts +4 -20
  242. package/scripts/{git → gh}/git-pr-checks.ts +2 -1
  243. package/scripts/{git → gh}/git-pr-coderabbit.ts +2 -5
  244. package/scripts/{git → gh}/git-pr-confirmation.ts +1 -3
  245. package/scripts/{git → gh}/git-pr-managed-config.ts +2 -3
  246. package/scripts/{git → gh}/git-pr.ts +3 -3
  247. package/scripts/git/changed-file-scope.ts +0 -1
  248. package/scripts/git/git-branch.ts +3 -6
  249. package/scripts/git/git-command.ts +1 -1
  250. package/scripts/git/git-commit.ts +1 -1
  251. package/scripts/git/git-common-directory.ts +80 -24
  252. package/scripts/git/git-error.ts +66 -9
  253. package/scripts/git/git-execa-error.ts +6 -1
  254. package/scripts/git/git-issue.ts +1 -1
  255. package/scripts/git/git-preflight.ts +24 -6
  256. package/scripts/git/git-prompt.ts +6 -31
  257. package/scripts/git/git-push-transport.ts +12 -69
  258. package/scripts/git/git-push.ts +1 -1
  259. package/scripts/git/git-spawn.ts +79 -3
  260. package/scripts/git/git-ssh-keepalive.ts +74 -0
  261. package/scripts/git/git-staging.ts +1 -0
  262. package/scripts/git/git-status.ts +1 -1
  263. package/scripts/git/git-workflow.ts +1 -1
  264. package/scripts/git/gone-branch.ts +4 -2
  265. package/scripts/git/listing-cutoff.ts +1 -1
  266. package/scripts/git/main-merge.ts +1 -1
  267. package/scripts/git/main-sync.ts +19 -1
  268. package/scripts/git/parse-json-array.ts +0 -3
  269. package/scripts/git/repository-lock.ts +16 -16
  270. package/scripts/git/{git-stash.ts → stash/git-stash.ts} +1 -1
  271. package/scripts/git/{stash-pop-args.ts → stash/stash-pop-args.ts} +1 -1
  272. package/scripts/git/{stash-pop-cli.ts → stash/stash-pop-cli.ts} +0 -1
  273. package/scripts/git/{stash-sweep-lock.ts → stash/stash-sweep-lock.ts} +3 -3
  274. package/scripts/hooks/codex-hook-adapter.ts +0 -1
  275. package/scripts/hooks/edited-cspell.ts +1 -1
  276. package/scripts/hooks/format-edited-cli.ts +15 -0
  277. package/scripts/hooks/format-edited-file.ts +4 -9
  278. package/scripts/hooks/pre-push-unit.ts +0 -4
  279. package/scripts/hooks/pretool-guard-cli.ts +21 -0
  280. package/scripts/hooks/pretool-guard.ts +36 -19
  281. package/scripts/hooks/reserved-run.ts +1 -1
  282. package/scripts/hooks/step-zero-notice.ts +76 -0
  283. package/scripts/hooks/stop-guard.ts +47 -21
  284. package/scripts/init/claude-plugin-config.ts +4 -5
  285. package/scripts/init/hook-command-rewrite.ts +16 -8
  286. package/scripts/init/hook-launch.ts +41 -15
  287. package/scripts/init/init-basic.ts +2 -5
  288. package/scripts/init/init-logic.ts +7 -0
  289. package/scripts/init/init.ts +0 -3
  290. package/scripts/init/project-profile.ts +6 -11
  291. package/scripts/init/start-exec.ts +8 -2
  292. package/scripts/init/start-plan.ts +18 -5
  293. package/scripts/init/start-setup-pr.ts +52 -25
  294. package/scripts/init/start-steps.ts +42 -9
  295. package/scripts/init/start.ts +40 -10
  296. package/scripts/issue/behavior-change-lint.ts +0 -1
  297. package/scripts/issue/defect-rate-cli.ts +3 -3
  298. package/scripts/issue/defect-rate.ts +1 -2
  299. package/scripts/{git → issue}/git-next-issues.ts +37 -8
  300. package/scripts/issue/issue-backlinks-cli.ts +1 -5
  301. package/scripts/issue/issue-cite-cli.ts +2 -6
  302. package/scripts/issue/issue-cite.ts +19 -3
  303. package/scripts/issue/issue-classification.ts +1 -9
  304. package/scripts/issue/issue-closing-pr.ts +4 -4
  305. package/scripts/issue/issue-comment-cli.ts +2 -2
  306. package/scripts/issue/issue-file-cli.ts +5 -5
  307. package/scripts/issue/issue-file.ts +2 -2
  308. package/scripts/issue/issue-fold-cli.ts +1 -1
  309. package/scripts/issue/issue-fold-existing-cli.ts +1 -1
  310. package/scripts/{git → issue}/issue-labels.ts +20 -0
  311. package/scripts/issue/issue-lint-cli.ts +1 -1
  312. package/scripts/issue/issue-merged.ts +2 -2
  313. package/scripts/issue/issue-rank.ts +89 -0
  314. package/scripts/issue/issue-read-cli.ts +8 -47
  315. package/scripts/issue/issue-read.ts +0 -2
  316. package/scripts/issue/issue-report-failures.ts +80 -0
  317. package/scripts/issue/issue-scout-cli.ts +1 -7
  318. package/scripts/issue/issue-scout-closed.ts +2 -2
  319. package/scripts/issue/issue-scout.ts +0 -2
  320. package/scripts/issue/issue-state-cli.ts +5 -46
  321. package/scripts/issue/issue-state.ts +1 -5
  322. package/scripts/issue/markdown-section.ts +1 -1
  323. package/scripts/issue/measure-rerun-cli.ts +1 -1
  324. package/scripts/issue/reproduction-measure.ts +1 -1
  325. package/scripts/josh/cli-body.ts +1 -1
  326. package/scripts/josh/file-map-stamp.ts +0 -3
  327. package/scripts/josh/josh-command-map.ts +2 -102
  328. package/scripts/josh/josh-commands-ai.ts +9 -102
  329. package/scripts/josh/josh-commands-backlog.ts +5 -1
  330. package/scripts/josh/josh-commands-development.ts +10 -3
  331. package/scripts/josh/josh-commands-issue.ts +2 -2
  332. package/scripts/josh/josh-commands-maintenance.ts +7 -0
  333. package/scripts/josh/josh-commands-project.ts +7 -1
  334. package/scripts/josh/josh-commands-run.ts +114 -0
  335. package/scripts/josh/josh-commands-versioning.ts +8 -0
  336. package/scripts/josh/josh-commands-workflow.ts +2 -2
  337. package/scripts/josh/path-decision.ts +0 -3
  338. package/scripts/josh/process-owner.ts +16 -0
  339. package/scripts/josh/session-language-cli.ts +0 -1
  340. package/scripts/lane/lane-await.ts +3 -6
  341. package/scripts/lane/lane-capacity.ts +6 -3
  342. package/scripts/lane/lane-child-invocation.ts +20 -7
  343. package/scripts/lane/lane-child-marker.ts +16 -2
  344. package/scripts/lane/lane-cli.ts +33 -18
  345. package/scripts/lane/lane-close.ts +1 -3
  346. package/scripts/lane/lane-dispatch.ts +3 -4
  347. package/scripts/lane/lane-environment.ts +0 -9
  348. package/scripts/lane/lane-handoff.ts +38 -0
  349. package/scripts/lane/lane-launch-cli.ts +21 -11
  350. package/scripts/lane/lane-open.ts +0 -3
  351. package/scripts/lane/lane-output.ts +0 -1
  352. package/scripts/lane/lane-registry.ts +9 -0
  353. package/scripts/lane/lane-report.ts +10 -4
  354. package/scripts/lane/openai-lane-ship.ts +2 -0
  355. package/scripts/lane/openai-lane-supervisor-decision.ts +2 -1
  356. package/scripts/lane/openai-lane-supervisor.ts +6 -4
  357. package/scripts/lane/openai-review-broker.ts +3 -0
  358. package/scripts/lib/bounded-pool.ts +1 -0
  359. package/scripts/lib/json-value.ts +5 -4
  360. package/scripts/lib/poll.ts +3 -1
  361. package/scripts/lib/timed-fetch.ts +15 -0
  362. package/scripts/lib/timeouts.ts +13 -0
  363. package/scripts/{yaml → lib}/yaml-document.ts +3 -1
  364. package/scripts/{bytes → lines}/bytes-command.ts +0 -2
  365. package/scripts/lines/lines-command.ts +0 -1
  366. package/scripts/lint/lint-related-scope.ts +0 -1
  367. package/scripts/lint/lint-related.ts +1 -1
  368. package/scripts/{git → notify}/telegram-notify.ts +2 -2
  369. package/scripts/{git → notify}/telegram-test.ts +4 -4
  370. package/scripts/observations/observation-ledger-home.ts +0 -1
  371. package/scripts/observations/observation-ledger-line.ts +0 -1
  372. package/scripts/observations/observation-ledger-migrate.ts +1 -1
  373. package/scripts/observations/observations-flush-landing.ts +3 -3
  374. package/scripts/observations/observations-flush.ts +2 -2
  375. package/scripts/overrides/lockfile-overrides.ts +1 -1
  376. package/scripts/overrides/overrides-logic.ts +1 -1
  377. package/scripts/package/package-scout-cli.ts +2 -7
  378. package/scripts/package/package-scout.ts +0 -2
  379. package/scripts/propagate/propagate-git-failure.ts +0 -1
  380. package/scripts/propagate/propagate-git.ts +0 -2
  381. package/scripts/propagate/propagate-plan.ts +185 -0
  382. package/scripts/propagate/propagate-publish.ts +2 -3
  383. package/scripts/propagate/propagate-run.ts +5 -3
  384. package/scripts/propagate/propagate-steps.ts +19 -6
  385. package/scripts/propagate/propagate-targets.ts +13 -6
  386. package/scripts/propagate/propagate.ts +60 -46
  387. package/scripts/refactor/import-graph.ts +0 -1
  388. package/scripts/refactor/refactor-lint.ts +0 -2
  389. package/scripts/refactor/refactor-scan.ts +0 -1
  390. package/scripts/refactor/refactor-targets.ts +0 -1
  391. package/scripts/registry-migration/migrate-logic.ts +1 -2
  392. package/scripts/registry-migration/migrate.ts +19 -9
  393. package/scripts/release/github-release-cli.ts +8 -6
  394. package/scripts/release/github-release-environment.ts +46 -0
  395. package/scripts/release/github-release.ts +151 -94
  396. package/scripts/release/release-history.ts +0 -1
  397. package/scripts/release/release-plan.ts +0 -1
  398. package/scripts/release/release-publish.ts +2 -3
  399. package/scripts/release/release-scope-cli.ts +1 -2
  400. package/scripts/release/release-tag.ts +2 -4
  401. package/scripts/repo/auto-merge-setting-logic.ts +1 -4
  402. package/scripts/repo/repo-setting.ts +1 -1
  403. package/scripts/repo/repository-labels.ts +3 -3
  404. package/scripts/repo/required-checks-logic.ts +206 -0
  405. package/scripts/repo/required-checks-report.ts +71 -0
  406. package/scripts/repo/ruleset-check-cli.ts +53 -0
  407. package/scripts/repo/ruleset-check.ts +147 -0
  408. package/scripts/report/report-lint-cli.ts +0 -4
  409. package/scripts/review/disposition-cli.ts +1 -1
  410. package/scripts/review/live-evidence.ts +1 -1
  411. package/scripts/review/review-attest-cli.ts +0 -6
  412. package/scripts/review/review-attest.ts +48 -16
  413. package/scripts/review/review-brief-cli.ts +72 -8
  414. package/scripts/review/review-brief.ts +67 -9
  415. package/scripts/review/review-diff-parts.ts +89 -0
  416. package/scripts/review/review-diff-write.ts +97 -0
  417. package/scripts/review/review-finding-ledger.ts +0 -1
  418. package/scripts/review/review-record-cli.ts +1 -1
  419. package/scripts/review/review-record.ts +0 -1
  420. package/scripts/review/review-round2-cli.ts +1 -1
  421. package/scripts/review/review-stamps.ts +6 -2
  422. package/scripts/review/review-tree.ts +14 -2
  423. package/scripts/rules/decision-oracle-stage.ts +18 -0
  424. package/scripts/rules/decision-oracle.ts +10 -7
  425. package/scripts/rules/delivered-rules.ts +9 -1
  426. package/scripts/rules/destructive-command.ts +119 -0
  427. package/scripts/rules/direct-filing.ts +1 -1
  428. package/scripts/rules/file-body.ts +0 -3
  429. package/scripts/rules/filing-cap.ts +0 -2
  430. package/scripts/rules/gh-api.ts +7 -2
  431. package/scripts/rules/git-argv.ts +18 -7
  432. package/scripts/rules/git-force.ts +0 -2
  433. package/scripts/rules/implementation-cut.ts +1 -2
  434. package/scripts/rules/index-guard.ts +71 -0
  435. package/scripts/rules/issue-citation.ts +50 -25
  436. package/scripts/rules/issue-fold.ts +1 -2
  437. package/scripts/rules/lane-background.ts +15 -7
  438. package/scripts/rules/lane-carry-conflict.ts +1 -2
  439. package/scripts/rules/lane-park.ts +14 -8
  440. package/scripts/rules/last-prompt.ts +1 -0
  441. package/scripts/rules/oracle-consulted.ts +1 -1
  442. package/scripts/rules/oracle-firing.ts +1 -0
  443. package/scripts/rules/oracle-list-cli.ts +0 -3
  444. package/scripts/rules/permission-guards.ts +14 -0
  445. package/scripts/rules/pre-gate-cut.ts +2 -2
  446. package/scripts/rules/protected-files.ts +74 -0
  447. package/scripts/rules/reply-language.ts +1 -1
  448. package/scripts/rules/rule-body-guard.ts +0 -3
  449. package/scripts/rules/rule-value-cli.ts +0 -1
  450. package/scripts/rules/shell-body-trigger.ts +0 -1
  451. package/scripts/rules/shell-segments.ts +0 -1
  452. package/scripts/rules/stop-rules.ts +13 -5
  453. package/scripts/rules/tail-commands.ts +1 -1
  454. package/scripts/rules/test-declared-commit.ts +1 -1
  455. package/scripts/rules/third-party-write.ts +0 -1
  456. package/scripts/rules/worktree-guard.ts +26 -9
  457. package/scripts/run/run-carry-cli.ts +0 -2
  458. package/scripts/run/run-carry-stash.ts +2 -2
  459. package/scripts/run/run-carry-streak.ts +1 -1
  460. package/scripts/run/run-cut-cli.ts +0 -7
  461. package/scripts/run/run-cut.ts +8 -54
  462. package/scripts/run/run-ending-cli.ts +1 -1
  463. package/scripts/run/run-ending.ts +1 -4
  464. package/scripts/run/run-entry-cli.ts +101 -24
  465. package/scripts/run/run-entry.ts +0 -1
  466. package/scripts/run/run-event-cli.ts +0 -2
  467. package/scripts/run/run-event-follow.ts +1 -0
  468. package/scripts/run/run-event-render.ts +1 -1
  469. package/scripts/run/run-event-scope.ts +53 -4
  470. package/scripts/run/run-event-stream.ts +0 -3
  471. package/scripts/run/run-event-watch.ts +1 -0
  472. package/scripts/run/run-halfrun-resume.ts +20 -7
  473. package/scripts/run/run-headless.ts +24 -8
  474. package/scripts/run/run-hold-cli.ts +33 -10
  475. package/scripts/run/run-hold.ts +25 -5
  476. package/scripts/run/run-issue-number.ts +1 -1
  477. package/scripts/run/run-liveness-cli.ts +1 -1
  478. package/scripts/run/run-liveness.ts +2 -3
  479. package/scripts/run/run-merge-cli.ts +5 -13
  480. package/scripts/run/run-merge-steps.ts +5 -5
  481. package/scripts/run/run-merge.ts +1 -1
  482. package/scripts/run/run-next-cli.ts +1 -1
  483. package/scripts/run/run-parent-cut-hook.ts +143 -0
  484. package/scripts/run/run-preflight.ts +2 -9
  485. package/scripts/run/run-prep-cli.ts +2 -2
  486. package/scripts/run/run-prep-locate.ts +1 -1
  487. package/scripts/run/run-progress-cli.ts +4 -7
  488. package/scripts/run/run-progress-clock.ts +6 -34
  489. package/scripts/run/run-progress-config.ts +0 -4
  490. package/scripts/run/run-progress-read.ts +3 -3
  491. package/scripts/run/run-progress.ts +22 -10
  492. package/scripts/run/run-prrun-resume.ts +117 -0
  493. package/scripts/run/run-report-cli.ts +1 -2
  494. package/scripts/run/run-report.ts +0 -1
  495. package/scripts/run/run-retrospective.ts +1 -1
  496. package/scripts/run/run-review-cli.ts +0 -3
  497. package/scripts/run/run-review-steps.ts +2 -0
  498. package/scripts/run/run-review.ts +0 -2
  499. package/scripts/run/run-ship-cli.ts +27 -77
  500. package/scripts/run/run-ship-detach.ts +1 -0
  501. package/scripts/run/run-ship-next.ts +106 -0
  502. package/scripts/run/run-ship-preflight.ts +87 -0
  503. package/scripts/run/run-ship-return.ts +8 -3
  504. package/scripts/run/run-ship-review-steps.ts +23 -30
  505. package/scripts/run/run-ship-review.ts +20 -0
  506. package/scripts/run/run-ship-scoped.ts +45 -0
  507. package/scripts/run/run-ship-stage.ts +5 -1
  508. package/scripts/run/run-ship-steps.ts +105 -0
  509. package/scripts/run/run-ship.ts +2 -1
  510. package/scripts/run/run-stage-read.ts +62 -0
  511. package/scripts/run/run-stage.ts +160 -0
  512. package/scripts/run/run-status-cli.ts +1 -1
  513. package/scripts/run/run-step-cli.ts +21 -14
  514. package/scripts/run/run-step.ts +1 -1
  515. package/scripts/run/run-stop-notify.ts +1 -3
  516. package/scripts/run/run-stranded-cli.ts +0 -4
  517. package/scripts/run/run-stranded-detect.ts +2 -2
  518. package/scripts/run/run-tail-cli.ts +17 -11
  519. package/scripts/run/run-tail.ts +2 -0
  520. package/scripts/run/run-tidy-lanes.ts +2 -1
  521. package/scripts/run/run-tidy-stashes.ts +12 -12
  522. package/scripts/run/run-wake-cli.ts +4 -5
  523. package/scripts/run/run-wake-describe.ts +19 -1
  524. package/scripts/run/run-wake-loop.ts +2 -2
  525. package/scripts/run/run-wake.ts +2 -4
  526. package/scripts/run/run-watcher-guard-cli.ts +0 -4
  527. package/scripts/run/run-watcher-guard.ts +9 -7
  528. package/scripts/run/run-watcher-hook.ts +1 -1
  529. package/scripts/safe-chain/ci-installer-pin.ts +11 -5
  530. package/scripts/safe-chain/project-config.ts +1 -1
  531. package/scripts/security/security-audit-provision-logic.ts +0 -1
  532. package/scripts/security/security-audit-provision.ts +3 -2
  533. package/scripts/security/security-audit.ts +0 -1
  534. package/scripts/security/security-updates-logic.ts +0 -1
  535. package/scripts/sonar/sonar-hotspots-cli.ts +10 -52
  536. package/scripts/sonar/sonar-hotspots.ts +0 -1
  537. package/scripts/sonar/sonar-new-code-cli.ts +150 -0
  538. package/scripts/sonar/sonar-new-code.ts +79 -0
  539. package/scripts/sonar/sonar-project.ts +97 -0
  540. package/scripts/split/split-assess-cli.ts +1 -1
  541. package/scripts/split/split-assess.ts +2 -5
  542. package/scripts/sync/managed-config-scope-cli.ts +1 -1
  543. package/scripts/sync/skill-migration.ts +0 -1
  544. package/scripts/sync/sync-hook-safety.ts +2 -3
  545. package/scripts/sync/sync.ts +1 -8
  546. package/scripts/sync/template-source-logic.ts +0 -1
  547. package/scripts/sync/workflow-pin-logic.ts +16 -28
  548. package/scripts/test/test-declared-logic.ts +0 -1
  549. package/scripts/test/test-declared.ts +0 -2
  550. package/scripts/test/test-red-commit.ts +2 -2
  551. package/scripts/test/test-red.ts +14 -7
  552. package/scripts/test/test-type-logic.ts +1 -1
  553. package/scripts/test/unit-worker-share.ts +7 -16
  554. package/scripts/time-runtime/time-batch-guard.ts +1 -2
  555. package/scripts/time-runtime/time-bundle-call.ts +2 -3
  556. package/scripts/time-runtime/time-bundles.ts +0 -4
  557. package/scripts/time-runtime/time-density-hook.ts +0 -2
  558. package/scripts/time-runtime/time-followup-stage.ts +1 -1
  559. package/scripts/time-runtime/time-format.ts +0 -73
  560. package/scripts/time-runtime/time-round-trips.ts +0 -4
  561. package/scripts/time-runtime/time-single-check.ts +1 -1
  562. package/scripts/time-runtime/time-spans.ts +1 -1
  563. package/scripts/time-runtime/time-transcript-line.ts +1 -2
  564. package/scripts/ui/ui-routes-cli.ts +0 -5
  565. package/scripts/ui/ui-routes.ts +0 -5
  566. package/scripts/version/effective-upstream.ts +2 -2
  567. package/scripts/version/latest-corepack.ts +7 -9
  568. package/scripts/version/latest-scope-cli.ts +0 -2
  569. package/scripts/version/latest-update.ts +0 -2
  570. package/scripts/version/npm-registry.ts +97 -0
  571. package/scripts/version/publishable-range-check.ts +1 -1
  572. package/scripts/version/release-hold.ts +0 -4
  573. package/scripts/version/running-binary.ts +2 -2
  574. package/scripts/version/version-check-logic.ts +0 -2
  575. package/scripts/version/version-commands.ts +5 -4
  576. package/scripts/version/version-remote.ts +28 -14
  577. package/scripts/version/version-targets.ts +4 -4
  578. package/templates/sonar-project.properties +28 -1
  579. package/templates/workflows/dependabot-auto-merge.yml +5 -3
  580. package/templates/workflows/github-release.yml +81 -0
  581. package/prompts/collaboration-workflow/cross-repo-epic.md +0 -5
  582. package/prompts/collaboration-workflow/epic-audit.md +0 -5
  583. package/prompts/collaboration-workflow/epic-bundle.md +0 -5
  584. package/scripts/init/plugin-install-hint.ts +0 -47
  585. package/scripts/version/parse-json.ts +0 -13
  586. /package/scripts/{git → followup}/git-followup-stages.ts +0 -0
  587. /package/scripts/{git → gh}/git-gh-api-path.ts +0 -0
  588. /package/scripts/{git → gh}/git-gh-command.ts +0 -0
  589. /package/scripts/{git → gh}/git-gh-issue-write.ts +0 -0
  590. /package/scripts/{git → gh}/git-gh-issue.ts +0 -0
  591. /package/scripts/{git → gh}/git-gh-pr-auto-merge.ts +0 -0
  592. /package/scripts/{git → gh}/git-gh-pr-snapshot.ts +0 -0
  593. /package/scripts/{git → gh}/git-gh-reachability.ts +0 -0
  594. /package/scripts/{git → gh}/git-gh-repo.ts +0 -0
  595. /package/scripts/{git → gh}/git-gh-rest-state.ts +0 -0
  596. /package/scripts/{git → gh}/git-pr-checks-watch.ts +0 -0
  597. /package/scripts/{git → gh}/git-pr-error.ts +0 -0
  598. /package/scripts/{git → gh}/git-pr-messages.ts +0 -0
  599. /package/scripts/{git → gh}/github-issue-url.ts +0 -0
  600. /package/scripts/git/{stash-orphans.ts → stash/stash-orphans.ts} +0 -0
  601. /package/scripts/{git → issue}/issue-reference.ts +0 -0
  602. /package/scripts/{git → lib}/animation-helpers.ts +0 -0
  603. /package/scripts/{git → lib}/git-animation.ts +0 -0
  604. /package/scripts/{git → notify}/git-notify.ts +0 -0
  605. /package/scripts/{git → notify}/telegram-test-logic.ts +0 -0
@@ -3,8 +3,9 @@ import { availableParallelism } from 'node:os'
3
3
  import path from 'node:path'
4
4
  import { PLATFORM_TEMP_ROOT } from '#scripts/josh/platform-temporary'
5
5
  import { process_identity } from '#scripts/josh/process-identity'
6
+ import { process_owner_schema, type ProcessOwner } from '#scripts/josh/process-owner'
6
7
  import { stamp_file } from '#scripts/josh/stamp-file'
7
- import { z } from 'zod'
8
+ import { json_value } from '#scripts/lib/json-value'
8
9
 
9
10
  // How wide one vitest run may fan out when it is not the only one on the machine
10
11
  // (joshuafolkken/kit#1515).
@@ -41,12 +42,9 @@ const MIN_WORKERS = 1
41
42
  // One run in flight is this run alone, which is the case that changes nothing.
42
43
  const SOLO_RUNS = 1
43
44
 
44
- // `process_start` is optional because a marker written before joshuafolkken/kit#1245, or on a platform
45
- // whose start time cannot be read, carries only the pid — and that case has an answer of its own
46
- // below rather than being rejected here.
47
- const run_marker_schema = z.object({ pid: z.number(), process_start: z.string().optional() })
48
-
49
- type RunMarker = z.infer<typeof run_marker_schema>
45
+ // A marker is the writing process's identity and nothing else; a pid-only marker has an answer of its
46
+ // own below (`is_running`) rather than being rejected here.
47
+ type RunMarker = ProcessOwner
50
48
 
51
49
  function marker_path(pid: number = process.pid): string {
52
50
  return stamp_file.stamp_path(RUN_PREFIX, String(pid))
@@ -82,13 +80,9 @@ function read_marker(source: string): RunMarker | undefined {
82
80
 
83
81
  if (raw === undefined) return undefined
84
82
 
85
- try {
86
- const parsed = run_marker_schema.safeParse(JSON.parse(raw))
83
+ const parsed = process_owner_schema.safeParse(json_value.parse_or_undefined(raw))
87
84
 
88
- return parsed.success ? parsed.data : undefined
89
- } catch {
90
- return undefined
91
- }
85
+ return parsed.success ? parsed.data : undefined
92
86
  }
93
87
 
94
88
  // An unreadable temp directory answers "no other run", which is the direction that leaves behavior
@@ -235,12 +229,9 @@ const unit_worker_share = {
235
229
  NESTED_KEY,
236
230
  RUN_PREFIX,
237
231
  SOLO_RUNS,
238
- WORKER_FLAG,
239
232
  current_share,
240
233
  is_nested_run,
241
- is_running,
242
234
  live_run_count,
243
- marker_files,
244
235
  marker_path,
245
236
  read_marker,
246
237
  resolve_unit_workers,
@@ -147,7 +147,7 @@ interface GuardedCall {
147
147
  //
148
148
  // **The dispatch it adds is measured, and it is not the figure the deleted text quoted.** One hook run
149
149
  // is **0.53 s** in this checkout and about 0.4 s in a consumer, essentially all of it process startup —
150
- // measured under `docs/josh-commands.md` → "`josh format:edited`", which is where that reading was
150
+ // measured under `docs/josh-commands-automation.md` → "`josh format:edited`", which is where that reading was
151
151
  // taken. The "about 2.4 s" above was a `pnpm josh` dispatch measured before joshuafolkken/kit#1342 made
152
152
  // this command eligible for the in-process path. Against that, one recovered round trip is a whole
153
153
  // model turn.
@@ -509,7 +509,6 @@ const time_batch_guard = {
509
509
  CONSECUTIVE_LIMIT,
510
510
  GUARD_LABEL,
511
511
  LANE_NOTICE,
512
- NAMED_CANDIDATE_COUNT,
513
512
  NOTICE,
514
513
  NOTICE_REFIRE_EVERY,
515
514
  NOTICE_STAMP_PREFIX,
@@ -336,8 +336,8 @@ function josh_subcommand(command: string): string | undefined {
336
336
  }
337
337
 
338
338
  // Whether a shell line is one of the read-only `josh` bookkeeping commands, and nothing else. A chained
339
- // line falls through. An alias is resolved to its canonical name first — a run may type `josh ist` for
340
- // `issue:state` — so the allow-list holds canonical names alone. Everything not on the list falls
339
+ // line falls through. An alias is resolved to its canonical name first, so the allow-list holds
340
+ // canonical names alone. Everything not on the list falls
341
341
  // through to the read/mutation test, which is what keeps `josh gate` / `followup` / `git`
342
342
  // non-bundleable (joshuafolkken/kit#1875).
343
343
  function is_read_josh(command: string): boolean {
@@ -555,7 +555,6 @@ const time_bundle_call = {
555
555
  tool_targets,
556
556
  // Exported for the batching guard's own word scan (joshuafolkken/kit#1390), so the two scanners
557
557
  // cannot come to disagree about where one word of a shell line ends and the next begins.
558
- words_of,
559
558
  // Exported for the read-fold notice (joshuafolkken/kit#2311), which offers `read:files <path>` only
560
559
  // over file-shaped targets — a bare directory like `scripts/` is a target here but not something
561
560
  // `read:files` can read, so the notice reuses this test rather than keep a second copy that could
@@ -520,11 +520,7 @@ function bundle_lines(totals: BundleTotals, price: TripPrice): Array<string> {
520
520
 
521
521
  const time_bundles = {
522
522
  HEADING,
523
- SEQUENCE_LABEL,
524
- RECOVERABLE_LABEL,
525
- SAVING_LABEL,
526
523
  BY_TOOL_LABEL,
527
- MIN_SEQUENCE,
528
524
  NO_BUNDLES,
529
525
  build_bundles,
530
526
  bundle_lines,
@@ -156,8 +156,6 @@ function density_notice(raw_payload: string, now_ms: number = Date.now()): strin
156
156
  }
157
157
 
158
158
  const time_density_hook = {
159
- NOTICE_PREFIX,
160
- TAIL_BYTES,
161
159
  density_notice,
162
160
  notice_path,
163
161
  read_tail,
@@ -1,4 +1,4 @@
1
- import { git_followup_stages, type FollowupStage } from '#scripts/git/git-followup-stages'
1
+ import { git_followup_stages, type FollowupStage } from '#scripts/followup/git-followup-stages'
2
2
 
3
3
  // Reading `followup`'s own stage rows back out of what it printed (joshuafolkken/kit#1445).
4
4
  //
@@ -31,21 +31,6 @@ const NOT_MEASURED = 'not measured'
31
31
  // than in `time-report.ts` because two blocks print it — the round-trip price and the bundling block —
32
32
  // and `time-bundles.ts` cannot import `time-report.ts`, which imports it (joshuafolkken/kit#1344).
33
33
  const NO_CALLS = 'no tool call to divide'
34
- // The word both the CI-cycle block and the gate-runtime block put in front of their naked-seconds
35
- // figure (joshuafolkken/kit#1812). Two renderers of the same report, and `time-cycles.ts` cannot
36
- // import `time-gate-runs.ts` nor the reverse, so it is written once here — the rule this file's header
37
- // states, and the reason `NO_CALLS` already sits beside it.
38
- const NAKED_PREFIX = 'naked '
39
- // The category labels, shared with the epic scope's table and with the round-trip block's price row
40
- // rather than spelled out in each. The tables answer the same question at three scales, so a label
41
- // renamed in one and not the others is a report that disagrees with itself — which is the defect
42
- // joshuafolkken/kit#1295 was filed for. They moved here from `time-report.ts` when the price row
43
- // became a third printer and its block a module that cannot import that file
44
- // (joshuafolkken/kit#1385).
45
- const MODEL_LABEL = 'model wait'
46
- const TOOL_LABEL = 'tool execution'
47
- const HUMAN_LABEL = 'human wait'
48
- const CI_LABEL = 'CI wait'
49
34
  // How many rows of a table any of these reports prints. Capped, because a long run touches thirty-odd
50
35
  // distinct leading commands and a table that long is read by nobody. `--json` carries every row the
51
36
  // report holds, so the display cap costs a caller nothing.
@@ -54,28 +39,6 @@ const CI_LABEL = 'CI wait'
54
39
  // need it** (joshuafolkken/kit#1311). Those two cannot import `time-report.ts`, which imports them —
55
40
  // and a second cap beside a second renderer is exactly the drift this file was split out to prevent.
56
41
  const MAX_ROWS = 15
57
- // What separates the facts inside one row's third column — a check's conclusion from its outcome
58
- // note, a distribution's range from its sample count. Written once so two renderers of the same
59
- // report cannot come to punctuate their suffixes differently (joshuafolkken/kit#1312).
60
- const SUFFIX_SEPARATOR = ' · '
61
- // What joins the two ends of an aggregated row's range, and the unit the sample behind it is counted
62
- // in. They sit here rather than beside one renderer because two of them print a spread now — the
63
- // duration tables of `--last` and the turn-count table both scopes share — and a private copy beside
64
- // the second is how one report would come to punctuate its ranges two ways
65
- // (joshuafolkken/kit#1763).
66
- const RANGE_SEPARATOR = ' – '
67
- const RUN_UNIT = 'run(s)'
68
- // The `HH:MM:SS` slice of an ISO instant, and what joins two of them into a window. UTC rather than
69
- // local time, because the report's own `started_at` / `ended_at` already are — a table in one zone
70
- // beside a header in another is a report that cannot be read against itself.
71
- //
72
- // **They moved here from `time-segments.ts` when the model-gap block became a second renderer of a
73
- // clock window** (joshuafolkken/kit#1386). A private copy beside the second block is the clone
74
- // `CLAUDE.md` prohibits, in the one place a drift would make two tables of the same report disagree
75
- // about which hour a stretch sat in.
76
- const CLOCK_START = 11
77
- const CLOCK_END = 19
78
- const WINDOW_ARROW = ' → '
79
42
 
80
43
  // **The parenthetical says "this report" rather than "them all"** (joshuafolkken/kit#1301): since
81
44
  // `--top` can cut the record itself before either rendering, a promise that `--json` carries every row
@@ -133,54 +96,18 @@ function unmeasured_row(label: string): string {
133
96
  return format_columns(label, '', NOT_MEASURED)
134
97
  }
135
98
 
136
- // **The ends are handed over already formatted**, so one aggregated table can spell its range in
137
- // minutes and another in turns while both are punctuated identically. The sample count rides at the
138
- // end because it is the qualifier: two rows with the same spread are not the same evidence when one
139
- // was read from nine runs and the other from two.
140
- function format_spread(min: string, max: string, sample_count: number): string {
141
- const range = `${min}${RANGE_SEPARATOR}${max}`
142
-
143
- return `${range}${SUFFIX_SEPARATOR}${String(sample_count)} ${RUN_UNIT}`
144
- }
145
-
146
- function format_clock(timestamp_ms: number): string {
147
- return new Date(timestamp_ms).toISOString().slice(CLOCK_START, CLOCK_END)
148
- }
149
-
150
- function format_window(started_ms: number, ended_ms: number): string {
151
- return `${format_clock(started_ms)}${WINDOW_ARROW}${format_clock(ended_ms)}`
152
- }
153
-
154
- // The indent a report's notes sit under, beneath its heading. Written once because three renderers
155
- // print them — the run scope, the epic scope and the distribution — and a fourth copy is how two
156
- // tables of one command would come to indent the same sentence differently (joshuafolkken/kit#1312).
157
- function note_lines(notes: ReadonlyArray<string>): Array<string> {
158
- return notes.map((note) => ` ${note}`)
159
- }
160
-
161
99
  const time_format = {
162
100
  MAX_ROWS,
163
101
  NO_CALLS,
164
- NAKED_PREFIX,
165
- SUFFIX_SEPARATOR,
166
- NOT_MEASURED,
167
- MODEL_LABEL,
168
- TOOL_LABEL,
169
- HUMAN_LABEL,
170
- CI_LABEL,
171
102
  overflow_line,
172
- format_minutes,
173
103
  format_seconds,
174
104
  format_share,
175
105
  usd,
176
106
  format_columns,
177
107
  format_row,
178
- format_spread,
179
108
  // `format_clock` stays private: `format_window` is its only caller, and a namespace that offers
180
109
  // both invites a second renderer to join the two with its own arrow.
181
- format_window,
182
110
  unmeasured_row,
183
- note_lines,
184
111
  }
185
112
 
186
113
  export { time_format }
@@ -269,11 +269,7 @@ const time_round_trips = {
269
269
  // `time-model-gaps.ts` and needed the same predicates and the same opener test this walk uses. A
270
270
  // private copy there would be the clone `CLAUDE.md` prohibits, in the one place a drift would have
271
271
  // the distribution and the count disagreeing about what a round trip is.
272
- is_call,
273
- is_model,
274
- opens_round_trip,
275
272
  per_round_trip,
276
- started_ms,
277
273
  }
278
274
 
279
275
  export { time_round_trips }
@@ -60,6 +60,6 @@ function check_key(josh_command: string, command: string): string {
60
60
  return [josh_command, ...argument_key(command)].join(KEY_SEPARATOR)
61
61
  }
62
62
 
63
- const time_single_check = { CHECK_COMMANDS, NO_CHECK, check_key }
63
+ const time_single_check = { NO_CHECK, check_key }
64
64
 
65
65
  export { time_single_check }
@@ -1,5 +1,5 @@
1
1
  import { cost_blocks } from '#scripts/cost-runtime/cost-blocks'
2
- import type { FollowupStage } from '#scripts/git/git-followup-stages'
2
+ import type { FollowupStage } from '#scripts/followup/git-followup-stages'
3
3
  import { time_background } from './time-background'
4
4
  import { time_bundle_call } from './time-bundle-call'
5
5
  import { time_followup_stage } from './time-followup-stage'
@@ -1,4 +1,4 @@
1
- import type { FollowupStage } from '#scripts/git/git-followup-stages'
1
+ import type { FollowupStage } from '#scripts/followup/git-followup-stages'
2
2
  import { json_value } from '#scripts/lib/json-value'
3
3
  import { z } from 'zod'
4
4
  import { time_background } from './time-background'
@@ -247,7 +247,6 @@ function parse_line(line: string): TranscriptLine | undefined {
247
247
 
248
248
  const time_transcript_line = {
249
249
  ERROR_TEXT_LIMIT,
250
- REFUSAL_MARKER,
251
250
  NO_MESSAGE_ID,
252
251
  guard_from_refusal,
253
252
  parse_line,
@@ -105,12 +105,7 @@ async function main(argv: ReadonlyArray<string>): Promise<void> {
105
105
  }
106
106
 
107
107
  const ui_routes_cli = {
108
- build_find_importers,
109
- main,
110
108
  parse_staged,
111
- print_routes,
112
- route_files,
113
- run,
114
109
  USAGE,
115
110
  }
116
111
 
@@ -92,11 +92,6 @@ function derive_routes(
92
92
 
93
93
  const ui_routes = {
94
94
  derive_routes,
95
- is_route_file,
96
- is_shared_svelte,
97
- route_path_of,
98
- ROUTES_PREFIX,
99
- SVELTE_EXTENSION,
100
95
  }
101
96
 
102
97
  export { ui_routes }
@@ -1,8 +1,8 @@
1
1
  import { existsSync, readFileSync } from 'node:fs'
2
2
  import { createRequire } from 'node:module'
3
3
  import path from 'node:path'
4
+ import { json_value } from '#scripts/lib/json-value'
4
5
  import { package_named_version_schema } from '#scripts/lib/schemas'
5
- import { safe_json_parse } from './parse-json'
6
6
 
7
7
  const PACKAGE_JSON = 'package.json'
8
8
  // Node module paths never nest anywhere near this deep; the bound only guards against an unexpected
@@ -23,7 +23,7 @@ interface EffectiveUpstreamOptions {
23
23
  function read_matching_version(manifest_path: string, package_name: string): string | undefined {
24
24
  if (!existsSync(manifest_path)) return undefined
25
25
  const parsed = package_named_version_schema.safeParse(
26
- safe_json_parse(readFileSync(manifest_path, 'utf8')),
26
+ json_value.parse_or_undefined(readFileSync(manifest_path, 'utf8')),
27
27
  )
28
28
  if (!parsed.success) return undefined
29
29
  if (parsed.data.name !== package_name) return undefined
@@ -37,11 +37,11 @@
37
37
  */
38
38
  import { readFileSync, writeFileSync } from 'node:fs'
39
39
  import { fileURLToPath } from 'node:url'
40
+ import { json_value } from '#scripts/lib/json-value'
40
41
  import { execaSync } from 'execa'
41
42
  import semver from 'semver'
42
43
  import { z } from 'zod'
43
44
  import { package_manager_version } from './package-manager-version'
44
- import { safe_json_parse } from './parse-json'
45
45
  import { release_age } from './release-age'
46
46
 
47
47
  const PACKAGE_JSON_PATH = 'package.json'
@@ -59,7 +59,9 @@ const DEV_ENGINES_SCHEMA = z.object({ packageManager: PNPM_DEVELOPMENT_MANAGER_S
59
59
  const DEV_ENGINES_PNPM_SCHEMA = z.object({ devEngines: DEV_ENGINES_SCHEMA.optional() })
60
60
 
61
61
  function extract_development_engines_version(package_json_content: string): string | undefined {
62
- const parsed = DEV_ENGINES_PNPM_SCHEMA.safeParse(safe_json_parse(package_json_content))
62
+ const parsed = DEV_ENGINES_PNPM_SCHEMA.safeParse(
63
+ json_value.parse_or_undefined(package_json_content),
64
+ )
63
65
 
64
66
  return parsed.success ? parsed.data.devEngines?.packageManager.version : undefined
65
67
  }
@@ -108,7 +110,7 @@ function extract_times_json(stdout: string): Record<string, string> | undefined
108
110
  const end = stdout.lastIndexOf('}')
109
111
  if (start === -1 || end <= start) return undefined
110
112
  const parsed = release_age.release_times_schema.safeParse(
111
- safe_json_parse(stdout.slice(start, end + 1)),
113
+ json_value.parse_or_undefined(stdout.slice(start, end + 1)),
112
114
  )
113
115
 
114
116
  return parsed.success ? parsed.data : undefined
@@ -236,7 +238,7 @@ function decode_integrity(encoded: string): string | undefined {
236
238
  function extract_encoded_integrity(stdout: string): string | undefined {
237
239
  const payload = /"sha512-[A-Za-z0-9+/]+={0,2}"/u.exec(stdout)?.[0]
238
240
  if (payload === undefined) return undefined
239
- const parsed: unknown = safe_json_parse(payload)
241
+ const parsed: unknown = json_value.parse_or_undefined(payload)
240
242
  if (typeof parsed !== 'string') return undefined
241
243
 
242
244
  return INTEGRITY_RE.exec(parsed)?.[1]
@@ -319,7 +321,7 @@ function restore_after_update(original: string, target: string, integrity: strin
319
321
  }
320
322
 
321
323
  function pin_unpinned_manifest(original: string, target: string, integrity: string): void {
322
- const manifest = z.record(z.string(), z.unknown()).parse(safe_json_parse(original))
324
+ const manifest = z.record(z.string(), z.unknown()).parse(json_value.parse_or_undefined(original))
323
325
  const pinned = JSON.stringify(
324
326
  { ...manifest, packageManager: `${target}+${integrity}` },
325
327
  undefined,
@@ -386,18 +388,14 @@ const latest_corepack = {
386
388
  is_target_not_newer_than_pin,
387
389
  notify_skipped_bump,
388
390
  extract_times_json,
389
- query_release_times,
390
391
  query_major_latest_version,
391
392
  resolve_corepack_target,
392
- warn_skip,
393
- warn_unresolved,
394
393
  run_pnpm_update,
395
394
  query_integrity,
396
395
  restore_integrity,
397
396
  did_warn_skip,
398
397
  sync_development_engines,
399
398
  restore_package_json,
400
- bump_package_manager,
401
399
  main,
402
400
  }
403
401
 
@@ -130,9 +130,7 @@ function main(argv: ReadonlyArray<string>): void {
130
130
 
131
131
  const latest_scope_cli = {
132
132
  decide,
133
- describe_stamp,
134
133
  JSON_KEY,
135
- main,
136
134
  NO_STAMP_REASON,
137
135
  RECORD_FLAG,
138
136
  REQUIRED_SCOPE,
@@ -190,10 +190,8 @@ const latest_update = {
190
190
  main,
191
191
  build_update_commands,
192
192
  run_update_stages,
193
- update_without_downgrading,
194
193
  take_snapshot,
195
194
  restore_snapshot,
196
- report_lockfile_overrides,
197
195
  }
198
196
 
199
197
  export { latest_update }
@@ -0,0 +1,97 @@
1
+ import { json_value } from '#scripts/lib/json-value'
2
+ import { migrate_logic } from '#scripts/registry-migration/migrate-logic'
3
+ import { execaSync } from 'execa'
4
+ import { z } from 'zod'
5
+ import { release_age } from './release-age'
6
+
7
+ // The public npm registry, read without credentials so a consumer who installed from public npm
8
+ // can see the latest release without a `read:packages` GitHub token (joshuafolkken/kit#2882). The
9
+ // GitHub Packages versions API stays the source for a scope routed there, and the fallback for a
10
+ // package public npm does not carry.
11
+ const PUBLIC_REGISTRY = 'https://registry.npmjs.org'
12
+ // The abbreviated packument carries `dist-tags` without every version's full manifest.
13
+ const ABBREVIATED_ACCEPT = 'application/vnd.npm.install-v1+json'
14
+ const FULL_ACCEPT = 'application/json'
15
+ const REQUEST_TIMEOUT_MS = 10_000
16
+ const SCOPE_SEPARATOR = '/'
17
+ const ENCODED_SCOPE_SEPARATOR = '%2f'
18
+ const SCOPE_PATTERN = /^@[^/]+(?=\/)/u
19
+ const SCOPE_REGISTRY_SUFFIX = ':registry'
20
+ const github_scopes = new Map<string, boolean>()
21
+
22
+ // The version commands are synchronous end to end and exported that way to consumers, so the
23
+ // request runs in a child Node process rather than turning the whole chain async. Node's own
24
+ // `fetch` needs no external binary, and a non-2xx answer exits non-zero so it reads as "no answer".
25
+ const FETCH_SCRIPT = [
26
+ 'const [url, accept] = process.argv.slice(1)',
27
+ 'const response = await fetch(url, { headers: { accept } })',
28
+ 'if (!response.ok) process.exit(1)',
29
+ 'process.stdout.write(await response.text())',
30
+ ].join('\n')
31
+
32
+ const latest_schema = z.looseObject({ 'dist-tags': z.looseObject({ latest: z.string() }) })
33
+ const times_schema = z.looseObject({ time: release_age.release_times_schema })
34
+
35
+ // The packument URL for a package name; a scoped name keeps its `@` and encodes the separator, the
36
+ // form the registry documents for scoped packages.
37
+ function packument_url(package_name: string): string {
38
+ return `${PUBLIC_REGISTRY}/${package_name.replace(SCOPE_SEPARATOR, () => ENCODED_SCOPE_SEPARATOR)}`
39
+ }
40
+
41
+ function read_packument(package_name: string, accept: string): unknown {
42
+ const result = execaSync(
43
+ process.execPath,
44
+ ['--input-type=module', '-e', FETCH_SCRIPT, packument_url(package_name), accept],
45
+ { reject: false, timeout: REQUEST_TIMEOUT_MS },
46
+ )
47
+ if (result.exitCode !== 0) return undefined
48
+
49
+ return json_value.parse_or_undefined(result.stdout)
50
+ }
51
+
52
+ // Whether this checkout installs the package's scope from GitHub Packages, read with the same
53
+ // `pnpm config get` `josh registry:migrate` uses (project `.npmrc` over user `~/.npmrc`). The two
54
+ // registries are published by parallel jobs and can drift, so a consumer routed to GitHub Packages
55
+ // keeps reading it: public npm could otherwise offer a release its registry does not carry yet.
56
+ // Memoized per scope — kit and app-kit share one, and one report asks for both packages.
57
+ function is_github_scope(scope: string): boolean {
58
+ const is_cached_github = github_scopes.get(scope)
59
+ if (is_cached_github !== undefined) return is_cached_github
60
+ const result = execaSync('pnpm', ['config', 'get', `${scope}${SCOPE_REGISTRY_SUFFIX}`], {
61
+ reject: false,
62
+ timeout: REQUEST_TIMEOUT_MS,
63
+ })
64
+ const is_github = result.exitCode === 0 && migrate_logic.is_github_tarball(result.stdout.trim())
65
+
66
+ github_scopes.set(scope, is_github)
67
+
68
+ return is_github
69
+ }
70
+
71
+ function is_public_source(package_name: string): boolean {
72
+ const scope = SCOPE_PATTERN.exec(package_name)?.[0]
73
+
74
+ return scope === undefined || !is_github_scope(scope)
75
+ }
76
+
77
+ // The `latest` dist-tag on public npm, or nothing when the package is not installed from there or
78
+ // the registry cannot answer for it (offline, timed out, or not published there).
79
+ function read_latest(package_name: string): string | undefined {
80
+ if (!is_public_source(package_name)) return undefined
81
+ const parsed = latest_schema.safeParse(read_packument(package_name, ABBREVIATED_ACCEPT))
82
+
83
+ return parsed.success ? parsed.data['dist-tags'].latest : undefined
84
+ }
85
+
86
+ // The version → publish-date map from public npm, under the same source rule as `read_latest`. It
87
+ // also carries `created` / `modified` keys, which the release-age selector skips as non-semver.
88
+ function read_release_times(package_name: string): Record<string, string> | undefined {
89
+ if (!is_public_source(package_name)) return undefined
90
+ const parsed = times_schema.safeParse(read_packument(package_name, FULL_ACCEPT))
91
+
92
+ return parsed.success ? parsed.data.time : undefined
93
+ }
94
+
95
+ const npm_registry = { packument_url, read_latest, read_release_times }
96
+
97
+ export { npm_registry }
@@ -69,6 +69,6 @@ function main(): void {
69
69
 
70
70
  if (process.argv[1] === fileURLToPath(import.meta.url)) main()
71
71
 
72
- const publishable_range_check = { check, probe_range }
72
+ const publishable_range_check = { check }
73
73
 
74
74
  export { publishable_range_check }
@@ -129,13 +129,9 @@ function build_release_hold_notes(
129
129
  }
130
130
 
131
131
  const release_hold = {
132
- HOLD_LABEL,
133
- is_at_or_above,
134
- is_latest_withheld,
135
132
  resolve_installable,
136
133
  is_release_age_hold,
137
134
  format_window,
138
- format_release_hold_note,
139
135
  build_release_hold_notes,
140
136
  }
141
137
 
@@ -1,7 +1,7 @@
1
1
  import { existsSync, readFileSync } from 'node:fs'
2
2
  import path from 'node:path'
3
+ import { json_value } from '#scripts/lib/json-value'
3
4
  import { package_version_schema } from '#scripts/lib/schemas'
4
- import { safe_json_parse } from './parse-json'
5
5
 
6
6
  const PACKAGE_JSON = 'package.json'
7
7
  // Scripts live two levels under the package root (scripts/<group>/<file>.ts), so the running
@@ -27,7 +27,7 @@ function read_running_version(self_directory: string): string | undefined {
27
27
  const package_path = resolve_self_package_path(self_directory)
28
28
  if (!existsSync(package_path)) return undefined
29
29
  const parsed = package_version_schema.safeParse(
30
- safe_json_parse(readFileSync(package_path, 'utf8')),
30
+ json_value.parse_or_undefined(readFileSync(package_path, 'utf8')),
31
31
  )
32
32
 
33
33
  return parsed.success ? parsed.data.version : undefined
@@ -309,13 +309,11 @@ const version_check_logic = {
309
309
  format_dual_version_output,
310
310
  format_running_line,
311
311
  format_upstream_lines,
312
- format_upstream_global_line,
313
312
  build_dual_upgrade_commands,
314
313
  build_upstream_upgrade_commands,
315
314
  build_upstream_upgrade_notes,
316
315
  build_effective_upgrade_commands,
317
316
  build_effective_upgrade_notes,
318
- build_project_upgrade_commands,
319
317
  format_update_command,
320
318
  format_effective_outcome,
321
319
  build_upgrade_shell_command,
@@ -13,6 +13,7 @@ import {
13
13
  type VersionSnapshot,
14
14
  } from './version-check-logic'
15
15
  import type {
16
+ PackageVersionConfig,
16
17
  UpstreamHookContext,
17
18
  UpstreamVersionConfig,
18
19
  VersionCommandConfig,
@@ -29,11 +30,11 @@ const NO_QUARANTINE_MINUTES = 0
29
30
  // whose `installable` is undefined when the timestamps cannot be read — the report then renders
30
31
  // exactly as it did before (joshuafolkken/kit#808).
31
32
  //
32
- // Skipped entirely unless some target is behind `latest`: the timestamps cost a second `gh api`
33
+ // Skipped entirely unless some target is behind `latest`: the timestamps cost a second registry
33
34
  // round trip per package, and a package with nothing stale has no gap for a hold to explain. On the
34
35
  // common all-current run the report costs exactly what it did before this feature.
35
36
  function read_release_hold(
36
- versions_endpoint: string | undefined,
37
+ package_config: PackageVersionConfig,
37
38
  latest: string,
38
39
  versions: ReadonlyArray<string | undefined>,
39
40
  ): ReleaseHold | undefined {
@@ -45,7 +46,7 @@ function read_release_hold(
45
46
  // a registry round trip discovering that.
46
47
  if (minimum_age_minutes <= NO_QUARANTINE_MINUTES) return undefined
47
48
  const installable = release_hold.resolve_installable(
48
- fetch_release_times(versions_endpoint),
49
+ fetch_release_times(package_config.versions_endpoint, package_config.package_name),
49
50
  latest,
50
51
  minimum_age_minutes,
51
52
  Date.now(),
@@ -157,7 +158,7 @@ function read_upstream_report(
157
158
  // After the effective install is attached, so its version counts toward the staleness gate.
158
159
  // Only the effective install is peer-resolved, so it is the only target the window can hold back.
159
160
  const hold = is_hold_wanted
160
- ? read_release_hold(upstream.versions_endpoint, latest, [report.effective?.version])
161
+ ? read_release_hold(upstream, latest, [report.effective?.version])
161
162
  : undefined
162
163
  if (hold !== undefined) report.hold = hold
163
164