@joshuafolkken/kit 1.1050.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 (581) hide show
  1. package/.claude/settings.json +9 -8
  2. package/.claude/skills/epic-commands/SKILL.md +5 -7
  3. package/.claude/skills/workflow-commands/SKILL.md +19 -11
  4. package/.claude/skills/workflow-commands/background-commands.md +4 -3
  5. package/.claude/skills/workflow-commands/backlogrun-child.md +1 -1
  6. package/.claude/skills/workflow-commands/backlogrun-lanes.md +8 -6
  7. package/.claude/skills/workflow-commands/backlogrun-progress.md +1 -1
  8. package/.claude/skills/workflow-commands/backlogrun-steps.md +10 -10
  9. package/.claude/skills/workflow-commands/backlogrun.md +2 -2
  10. package/.claude/skills/workflow-commands/chain-rule.md +4 -2
  11. package/.claude/skills/workflow-commands/delegation.md +3 -3
  12. package/.claude/skills/workflow-commands/followup-reference.md +1 -1
  13. package/.claude/skills/workflow-commands/followup.md +7 -3
  14. package/.claude/skills/workflow-commands/fullrun-steps.md +3 -2
  15. package/.claude/skills/workflow-commands/fullrun.md +3 -2
  16. package/.claude/skills/workflow-commands/halfrun.md +16 -19
  17. package/.claude/skills/workflow-commands/issue-comments.md +1 -1
  18. package/.claude/skills/workflow-commands/issue-fold-existing.md +10 -10
  19. package/.claude/skills/workflow-commands/issue-scout.md +1 -1
  20. package/.claude/skills/workflow-commands/kickoff.md +9 -4
  21. package/.claude/skills/workflow-commands/latest-gate.md +1 -1
  22. package/.claude/skills/workflow-commands/needs-human-review.md +1 -1
  23. package/.claude/skills/workflow-commands/observation-filing.md +3 -3
  24. package/.claude/skills/workflow-commands/prerequisite.md +1 -1
  25. package/.claude/skills/workflow-commands/prrun.md +36 -0
  26. package/.claude/skills/workflow-commands/retrospective.md +1 -1
  27. package/.claude/skills/workflow-commands/working-tree-hold.md +22 -2
  28. package/.codex/hooks.json +16 -20
  29. package/.github/actions/setup-pnpm/action.yml +93 -0
  30. package/.github/dependabot.yml +5 -1
  31. package/.github/workflows/ci.yml +26 -128
  32. package/.github/workflows/pr-classification.yml +5 -41
  33. package/.github/workflows/publish.yml +33 -38
  34. package/.github/workflows/sonar-qube.yml +37 -4
  35. package/AGENTS.md +12 -2
  36. package/CLAUDE.md +15 -16
  37. package/GEMINI.md +14 -2
  38. package/README.md +59 -18
  39. package/SECURITY.md +36 -6
  40. package/cspell/index.yaml +2 -1
  41. package/dist/CLAUDE.md +15 -16
  42. package/dist/config-merge/index.js +15 -3
  43. package/dist/hooks/batch-guard.js +4 -4
  44. package/dist/hooks/{chunk-HJIISEAC.js → chunk-3C4YCCEF.js} +5 -13
  45. package/dist/hooks/{chunk-EJDX2TOB.js → chunk-7ZPFAVR7.js} +7 -88
  46. package/dist/hooks/{chunk-WQ4OSBSS.js → chunk-E54KGFEQ.js} +2 -2
  47. package/dist/hooks/{chunk-GQ7KP45M.js → chunk-IL27YTPH.js} +2 -2
  48. package/dist/hooks/{chunk-DMQN45FN.js → chunk-KHWHKJOM.js} +3 -3
  49. package/dist/hooks/{chunk-5BK3K7V4.js → chunk-M2XDCUKD.js} +997 -478
  50. package/dist/hooks/{chunk-7VPDUBRN.js → chunk-NKOG3XAV.js} +150 -153
  51. package/dist/hooks/{chunk-NJQOBE6L.js → chunk-O4LL4HTI.js} +2 -7
  52. package/dist/hooks/{chunk-NAS4C7GP.js → chunk-OIZUHPJI.js} +2 -2
  53. package/dist/hooks/{chunk-RLDX5SOC.js → chunk-UD24EAIL.js} +2084 -1412
  54. package/dist/hooks/codex-hook-adapter.js +10 -11
  55. package/dist/hooks/duplicate-read-guard.js +5 -5
  56. package/dist/hooks/format-edited.js +2 -2
  57. package/dist/hooks/inputs.json +279 -0
  58. package/dist/hooks/investigation-guard.js +5 -5
  59. package/dist/hooks/pretool-guard.js +9 -9
  60. package/dist/hooks/session-lang.js +0 -1
  61. package/dist/hooks/stop-guard.js +178 -324
  62. package/dist/josh.js +162 -119
  63. package/dist/managed-marker/index.js +2 -1
  64. package/dist/version/index.js +34 -58
  65. package/eslint/rules/promise.js +5 -0
  66. package/package.json +9 -4
  67. package/prompts/collaboration-workflow/issue-citation.md +5 -5
  68. package/prompts/collaboration-workflow/operating-rules.md +4 -4
  69. package/prompts/collaboration-workflow/overview.md +13 -1
  70. package/prompts/collaboration-workflow/report-format.md +1 -1
  71. package/prompts/collaboration-workflow/residency.md +3 -3
  72. package/prompts/collaboration-workflow/rule-delivery.md +1 -1
  73. package/prompts/collaboration-workflow/turn-batching.md +3 -3
  74. package/prompts/collaboration-workflow/upstream-interrupt.md +1 -1
  75. package/prompts/collaboration-workflow/wip-cap.md +25 -22
  76. package/prompts/collaboration-workflow.md +5 -8
  77. package/prompts/review-rubric.md +1 -1
  78. package/prompts/review.md +3 -3
  79. package/prompts/sonar-hotspot-handling.md +11 -3
  80. package/prompts/testing-guide.md +3 -3
  81. package/scripts/adopt/adopt-toolkits.ts +0 -2
  82. package/scripts/adopt/adopt.ts +0 -2
  83. package/scripts/agent/agent-argv.ts +0 -2
  84. package/scripts/agent/agent-diagnostics.ts +1 -1
  85. package/scripts/agent/agent-role-profile.ts +0 -7
  86. package/scripts/agent/claude-agent-argv.ts +0 -2
  87. package/scripts/agent/codex-agent-argv.ts +1 -1
  88. package/scripts/agent/codex-hooks.ts +92 -0
  89. package/scripts/agent/interactive-ask.ts +1 -1
  90. package/scripts/auto-ok/auto-ok-cli.ts +6 -16
  91. package/scripts/backlog/backlog-budget.ts +0 -2
  92. package/scripts/backlog/backlog-defect-priority.ts +2 -2
  93. package/scripts/backlog/backlog-drive-cli.ts +10 -8
  94. package/scripts/backlog/backlog-drive-named-offer.ts +16 -3
  95. package/scripts/backlog/backlog-drive-named.ts +2 -1
  96. package/scripts/backlog/backlog-drive.ts +76 -16
  97. package/scripts/backlog/backlog-named.ts +0 -3
  98. package/scripts/backlog/backlog-next.ts +9 -15
  99. package/scripts/backlog/backlog-offer-cli.ts +0 -5
  100. package/scripts/backlog/backlog-plan-cli.ts +1 -7
  101. package/scripts/backlog/backlog-plan.ts +1 -1
  102. package/scripts/backlog/backlog-pool.ts +3 -6
  103. package/scripts/backlog/backlog-rank.ts +2 -2
  104. package/scripts/backlog/backlog-ready.ts +19 -3
  105. package/scripts/backlog/backlog-scope.ts +1 -3
  106. package/scripts/backlog/backlog-stalled-detect.ts +2 -2
  107. package/scripts/backlog/backlog-stalled.ts +0 -1
  108. package/scripts/backlog/backlog-waves.ts +5 -2
  109. package/scripts/behavior/behavior-cli.ts +1 -1
  110. package/scripts/build/build-codex-hooks.ts +26 -0
  111. package/scripts/build/build-hooks.ts +85 -9
  112. package/scripts/build/hook-bundle-stamp.ts +111 -0
  113. package/scripts/cases/cases-cli.ts +1 -1
  114. package/scripts/cases/cases-logic.ts +1 -1
  115. package/scripts/ci/composite-actions.ts +30 -0
  116. package/scripts/ci/pr-classification.ts +3 -3
  117. package/scripts/claude/workflow-destination.ts +10 -1
  118. package/scripts/clone/clone-fingerprint.ts +0 -1
  119. package/scripts/clone/clone-scan-cli.ts +1 -1
  120. package/scripts/clone/clone-scan.ts +1 -1
  121. package/scripts/config-merge/json-format.ts +0 -1
  122. package/scripts/config-merge/patch-yaml-list.ts +1 -1
  123. package/scripts/cost-runtime/codex-usage.ts +2 -9
  124. package/scripts/cost-runtime/cost-attribute.ts +0 -1
  125. package/scripts/cost-runtime/cost-cli.ts +0 -3
  126. package/scripts/cost-runtime/cost-corpus.ts +0 -2
  127. package/scripts/cost-runtime/cost-format.ts +0 -3
  128. package/scripts/cost-runtime/cost-pricing.ts +0 -1
  129. package/scripts/cost-runtime/cost-tokens.ts +0 -1
  130. package/scripts/delegation/delegation-cli.ts +1 -1
  131. package/scripts/delegation/delegation-policy.ts +0 -1
  132. package/scripts/delegation/duplicate-read-guard.ts +0 -8
  133. package/scripts/delegation/fanout-cli.ts +1 -1
  134. package/scripts/delegation/fanout.ts +0 -2
  135. package/scripts/delegation/investigation-reads.ts +1 -164
  136. package/scripts/discovery/repo-map-logic.ts +0 -1
  137. package/scripts/discovery/repo-party-cli.ts +1 -1
  138. package/scripts/doctor/doctor-consumer.ts +4 -6
  139. package/scripts/doctor/doctor-logic.ts +0 -4
  140. package/scripts/doctor/doctor.ts +14 -9
  141. package/scripts/document/document-byte-budget.ts +4 -5
  142. package/scripts/document/document-byte-check.ts +0 -1
  143. package/scripts/document/document-read-cli.ts +0 -2
  144. package/scripts/document/document-section-cli.ts +1 -1
  145. package/scripts/document/document-section.ts +0 -3
  146. package/scripts/document/edit-files-cli.ts +0 -1
  147. package/scripts/document/entry-read-budget.ts +10 -2
  148. package/scripts/document/lane-child-read-set.ts +1 -6
  149. package/scripts/document/read-files-cli.ts +0 -4
  150. package/scripts/document/read-set-cli.ts +0 -2
  151. package/scripts/document/read-set-point-of-use.ts +1 -0
  152. package/scripts/document/read-set-pricing.ts +0 -1
  153. package/scripts/document/read-set-trim.ts +1 -1
  154. package/scripts/epic/epic-add.ts +1 -1
  155. package/scripts/epic/epic-audit-cli.ts +1 -4
  156. package/scripts/epic/epic-audit-orphans.ts +1 -3
  157. package/scripts/epic/epic-audit-rationale.ts +0 -1
  158. package/scripts/epic/epic-audit-report.ts +0 -2
  159. package/scripts/epic/epic-audit.ts +5 -4
  160. package/scripts/epic/epic-bundle-cli.ts +1 -1
  161. package/scripts/epic/epic-bundle-evidence.ts +0 -1
  162. package/scripts/epic/epic-bundle-referenced.ts +1 -5
  163. package/scripts/epic/epic-bundle.ts +0 -4
  164. package/scripts/epic/epic-busy.ts +4 -5
  165. package/scripts/epic/epic-candidate-confirm.ts +0 -5
  166. package/scripts/epic/epic-classify.ts +2 -2
  167. package/scripts/epic/epic-cli-argv.ts +0 -1
  168. package/scripts/epic/epic-close-comment.ts +1 -1
  169. package/scripts/epic/epic-close.ts +5 -2
  170. package/scripts/epic/epic-cross-repo.ts +2 -4
  171. package/scripts/epic/epic-decision.ts +0 -1
  172. package/scripts/epic/epic-fetch.ts +2 -2
  173. package/scripts/epic/epic-index.ts +2 -3
  174. package/scripts/epic/epic-issue.ts +1 -15
  175. package/scripts/epic/epic-lane-offer.ts +9 -8
  176. package/scripts/epic/epic-nested.ts +1 -1
  177. package/scripts/epic/epic-next-read.ts +1 -3
  178. package/scripts/epic/epic-next-views.ts +0 -1
  179. package/scripts/epic/epic-next.ts +1 -10
  180. package/scripts/epic/epic-parse.ts +0 -1
  181. package/scripts/epic/epic-promote.ts +0 -9
  182. package/scripts/epic/epic-rank.ts +2 -2
  183. package/scripts/epic/epic-read.ts +1 -2
  184. package/scripts/epic/epic-reconcile.ts +1 -1
  185. package/scripts/epic/epic-reference.ts +1 -13
  186. package/scripts/epic/epic-relation-recheck.ts +1 -1
  187. package/scripts/epic/epic-relations.ts +1 -1
  188. package/scripts/epic/epic-remove.ts +1 -1
  189. package/scripts/epic/epic-report.ts +0 -1
  190. package/scripts/epic/epic-run.ts +2 -3
  191. package/scripts/epic/epic-shape.ts +1 -1
  192. package/scripts/epic/epic-solo-stale.ts +107 -0
  193. package/scripts/epic/epic-solo.ts +3 -2
  194. package/scripts/epic/epic-triage.ts +1 -1
  195. package/scripts/epic/epic-validate.ts +1 -1
  196. package/scripts/epic/epic.ts +1 -1
  197. package/scripts/exports/unused-members-cli.ts +53 -0
  198. package/scripts/{git → followup}/followup-issue-number.ts +1 -6
  199. package/scripts/{git → followup}/git-followup-cleanup.ts +2 -1
  200. package/scripts/{git → followup}/git-followup-finish.ts +1 -3
  201. package/scripts/{git → followup}/git-followup-flush.ts +2 -2
  202. package/scripts/{git → followup}/git-followup-issue-close.ts +2 -2
  203. package/scripts/{git → followup}/git-followup-label.ts +4 -4
  204. package/scripts/followup/git-followup-merged.ts +112 -0
  205. package/scripts/{git → followup}/git-followup-pending.ts +1 -1
  206. package/scripts/{git → followup}/git-followup-workflow.ts +19 -11
  207. package/scripts/{git → followup}/git-pr-followup-wrapup.ts +9 -3
  208. package/scripts/{git → followup}/git-pr-followup.ts +53 -16
  209. package/scripts/gate/core-budget.ts +3 -9
  210. package/scripts/gate/gate-plan.ts +7 -4
  211. package/scripts/gate/gate-report.ts +0 -6
  212. package/scripts/gate/gate-tree.ts +1 -1
  213. package/scripts/gate/pre-commit-type-check.ts +0 -6
  214. package/scripts/gate/project-checks.ts +7 -8
  215. package/scripts/gate/scoped-green.ts +0 -1
  216. package/scripts/gate/type-check-step.ts +1 -1
  217. package/scripts/gate/verification-gate.ts +0 -2
  218. package/scripts/gh/fix-gh-packages.ts +15 -12
  219. package/scripts/gh/gh-spawn.ts +2 -2
  220. package/scripts/{git → gh}/git-ai-review-scan.ts +1 -5
  221. package/scripts/{git → gh}/git-gh-check.ts +2 -1
  222. package/scripts/{git → gh}/git-gh-exec.ts +1 -1
  223. package/scripts/{git → gh}/git-gh-failure.ts +1 -1
  224. package/scripts/{git → gh}/git-gh-helpers.ts +0 -1
  225. package/scripts/{git → gh}/git-gh-issue-list.ts +2 -0
  226. package/scripts/{git → gh}/git-gh-issue-read.ts +1 -1
  227. package/scripts/{git → gh}/git-gh-issue-rest.ts +6 -3
  228. package/scripts/{git → gh}/git-gh-pr-read.ts +24 -0
  229. package/scripts/{git → gh}/git-gh-pr-rest.ts +5 -2
  230. package/scripts/{git → gh}/git-gh-pr-review.ts +2 -2
  231. package/scripts/{git → gh}/git-gh-pr-rollup.ts +1 -3
  232. package/scripts/{git → gh}/git-gh-pr.ts +3 -1
  233. package/scripts/{git → gh}/git-pr-ai-review.ts +2 -5
  234. package/scripts/{git → gh}/git-pr-checks-eval.ts +0 -10
  235. package/scripts/{git → gh}/git-pr-checks-parse.ts +4 -20
  236. package/scripts/{git → gh}/git-pr-checks.ts +2 -1
  237. package/scripts/{git → gh}/git-pr-coderabbit.ts +2 -5
  238. package/scripts/{git → gh}/git-pr-confirmation.ts +1 -3
  239. package/scripts/{git → gh}/git-pr-managed-config.ts +2 -3
  240. package/scripts/{git → gh}/git-pr.ts +3 -3
  241. package/scripts/git/changed-file-scope.ts +0 -1
  242. package/scripts/git/git-branch.ts +3 -6
  243. package/scripts/git/git-commit.ts +1 -1
  244. package/scripts/git/git-common-directory.ts +80 -24
  245. package/scripts/git/git-error.ts +66 -9
  246. package/scripts/git/git-issue.ts +1 -1
  247. package/scripts/git/git-preflight.ts +2 -2
  248. package/scripts/git/git-prompt.ts +6 -31
  249. package/scripts/git/git-push.ts +1 -1
  250. package/scripts/git/git-staging.ts +1 -0
  251. package/scripts/git/git-status.ts +1 -1
  252. package/scripts/git/git-workflow.ts +1 -1
  253. package/scripts/git/gone-branch.ts +1 -0
  254. package/scripts/git/listing-cutoff.ts +1 -1
  255. package/scripts/git/main-merge.ts +1 -1
  256. package/scripts/git/main-sync.ts +19 -1
  257. package/scripts/git/parse-json-array.ts +0 -3
  258. package/scripts/git/repository-lock.ts +16 -16
  259. package/scripts/git/{git-stash.ts → stash/git-stash.ts} +1 -1
  260. package/scripts/git/{stash-pop-args.ts → stash/stash-pop-args.ts} +1 -1
  261. package/scripts/git/{stash-pop-cli.ts → stash/stash-pop-cli.ts} +0 -1
  262. package/scripts/git/{stash-sweep-lock.ts → stash/stash-sweep-lock.ts} +3 -3
  263. package/scripts/hooks/codex-hook-adapter.ts +0 -1
  264. package/scripts/hooks/edited-cspell.ts +1 -1
  265. package/scripts/hooks/format-edited-file.ts +2 -0
  266. package/scripts/hooks/pre-push-unit.ts +0 -4
  267. package/scripts/hooks/pretool-guard.ts +22 -4
  268. package/scripts/hooks/reserved-run.ts +1 -1
  269. package/scripts/hooks/step-zero-notice.ts +76 -0
  270. package/scripts/hooks/stop-guard.ts +47 -21
  271. package/scripts/init/claude-plugin-config.ts +4 -5
  272. package/scripts/init/hook-command-rewrite.ts +16 -8
  273. package/scripts/init/hook-launch.ts +41 -15
  274. package/scripts/init/init-basic.ts +2 -5
  275. package/scripts/init/init-logic.ts +7 -0
  276. package/scripts/init/init.ts +0 -3
  277. package/scripts/init/project-profile.ts +6 -11
  278. package/scripts/init/start-exec.ts +1 -1
  279. package/scripts/init/start-setup-pr.ts +6 -6
  280. package/scripts/init/start-steps.ts +1 -0
  281. package/scripts/issue/behavior-change-lint.ts +0 -1
  282. package/scripts/issue/defect-rate-cli.ts +3 -3
  283. package/scripts/issue/defect-rate.ts +1 -2
  284. package/scripts/{git → issue}/git-next-issues.ts +3 -3
  285. package/scripts/issue/issue-backlinks-cli.ts +1 -5
  286. package/scripts/issue/issue-cite-cli.ts +2 -6
  287. package/scripts/issue/issue-cite.ts +0 -2
  288. package/scripts/issue/issue-classification.ts +1 -9
  289. package/scripts/issue/issue-closing-pr.ts +4 -4
  290. package/scripts/issue/issue-comment-cli.ts +2 -2
  291. package/scripts/issue/issue-file-cli.ts +5 -5
  292. package/scripts/issue/issue-file.ts +2 -2
  293. package/scripts/issue/issue-fold-cli.ts +1 -1
  294. package/scripts/issue/issue-fold-existing-cli.ts +1 -1
  295. package/scripts/{git → issue}/issue-labels.ts +8 -0
  296. package/scripts/issue/issue-lint-cli.ts +1 -1
  297. package/scripts/issue/issue-merged.ts +2 -2
  298. package/scripts/{git → issue}/issue-rank.ts +1 -1
  299. package/scripts/issue/issue-read-cli.ts +8 -47
  300. package/scripts/issue/issue-read.ts +0 -2
  301. package/scripts/issue/issue-report-failures.ts +80 -0
  302. package/scripts/issue/issue-scout-cli.ts +1 -7
  303. package/scripts/issue/issue-scout-closed.ts +2 -2
  304. package/scripts/issue/issue-scout.ts +0 -2
  305. package/scripts/issue/issue-state-cli.ts +5 -46
  306. package/scripts/issue/issue-state.ts +1 -5
  307. package/scripts/issue/markdown-section.ts +1 -1
  308. package/scripts/issue/measure-rerun-cli.ts +1 -1
  309. package/scripts/issue/reproduction-measure.ts +1 -1
  310. package/scripts/josh/cli-body.ts +1 -1
  311. package/scripts/josh/file-map-stamp.ts +0 -3
  312. package/scripts/josh/josh-command-map.ts +2 -0
  313. package/scripts/josh/josh-commands-ai.ts +9 -102
  314. package/scripts/josh/josh-commands-backlog.ts +5 -1
  315. package/scripts/josh/josh-commands-development.ts +8 -1
  316. package/scripts/josh/josh-commands-issue.ts +2 -2
  317. package/scripts/josh/josh-commands-maintenance.ts +7 -0
  318. package/scripts/josh/josh-commands-project.ts +6 -0
  319. package/scripts/josh/josh-commands-run.ts +114 -0
  320. package/scripts/josh/josh-commands-versioning.ts +8 -0
  321. package/scripts/josh/josh-commands-workflow.ts +2 -2
  322. package/scripts/josh/path-decision.ts +0 -3
  323. package/scripts/josh/process-owner.ts +16 -0
  324. package/scripts/josh/session-language-cli.ts +0 -1
  325. package/scripts/lane/lane-await.ts +3 -6
  326. package/scripts/lane/lane-capacity.ts +6 -3
  327. package/scripts/lane/lane-child-invocation.ts +20 -7
  328. package/scripts/lane/lane-cli.ts +1 -4
  329. package/scripts/lane/lane-close.ts +1 -3
  330. package/scripts/lane/lane-dispatch.ts +3 -4
  331. package/scripts/lane/lane-environment.ts +0 -9
  332. package/scripts/lane/lane-handoff.ts +38 -0
  333. package/scripts/lane/lane-launch-cli.ts +21 -11
  334. package/scripts/lane/lane-open.ts +0 -3
  335. package/scripts/lane/lane-output.ts +0 -1
  336. package/scripts/lane/lane-registry.ts +9 -0
  337. package/scripts/lane/openai-lane-ship.ts +2 -0
  338. package/scripts/lane/openai-lane-supervisor-decision.ts +2 -1
  339. package/scripts/lane/openai-lane-supervisor.ts +6 -4
  340. package/scripts/lane/openai-review-broker.ts +3 -0
  341. package/scripts/lib/bounded-pool.ts +1 -0
  342. package/scripts/lib/json-value.ts +5 -4
  343. package/scripts/lib/poll.ts +3 -1
  344. package/scripts/lib/timed-fetch.ts +15 -0
  345. package/scripts/lib/timeouts.ts +13 -0
  346. package/scripts/{yaml → lib}/yaml-document.ts +3 -1
  347. package/scripts/{bytes → lines}/bytes-command.ts +0 -2
  348. package/scripts/lines/lines-command.ts +0 -1
  349. package/scripts/lint/lint-related-scope.ts +0 -1
  350. package/scripts/lint/lint-related.ts +1 -1
  351. package/scripts/{git → notify}/telegram-notify.ts +2 -2
  352. package/scripts/{git → notify}/telegram-test.ts +4 -4
  353. package/scripts/observations/observation-ledger-home.ts +0 -1
  354. package/scripts/observations/observation-ledger-line.ts +0 -1
  355. package/scripts/observations/observation-ledger-migrate.ts +1 -1
  356. package/scripts/observations/observations-flush-landing.ts +3 -3
  357. package/scripts/observations/observations-flush.ts +2 -2
  358. package/scripts/overrides/lockfile-overrides.ts +1 -1
  359. package/scripts/overrides/overrides-logic.ts +1 -1
  360. package/scripts/package/package-scout-cli.ts +2 -7
  361. package/scripts/package/package-scout.ts +0 -2
  362. package/scripts/propagate/propagate-git-failure.ts +0 -1
  363. package/scripts/propagate/propagate-git.ts +0 -2
  364. package/scripts/propagate/propagate-publish.ts +2 -3
  365. package/scripts/propagate/propagate-run.ts +0 -2
  366. package/scripts/propagate/propagate-steps.ts +3 -5
  367. package/scripts/propagate/propagate-targets.ts +0 -4
  368. package/scripts/propagate/propagate.ts +0 -4
  369. package/scripts/refactor/import-graph.ts +0 -1
  370. package/scripts/refactor/refactor-lint.ts +0 -2
  371. package/scripts/refactor/refactor-scan.ts +0 -1
  372. package/scripts/refactor/refactor-targets.ts +0 -1
  373. package/scripts/registry-migration/migrate-logic.ts +0 -2
  374. package/scripts/registry-migration/migrate.ts +19 -9
  375. package/scripts/release/github-release-cli.ts +8 -6
  376. package/scripts/release/github-release-environment.ts +46 -0
  377. package/scripts/release/github-release.ts +151 -94
  378. package/scripts/release/release-history.ts +0 -1
  379. package/scripts/release/release-plan.ts +0 -1
  380. package/scripts/release/release-publish.ts +2 -3
  381. package/scripts/release/release-scope-cli.ts +1 -2
  382. package/scripts/release/release-tag.ts +2 -4
  383. package/scripts/repo/auto-merge-setting-logic.ts +1 -4
  384. package/scripts/repo/repo-setting.ts +1 -1
  385. package/scripts/repo/repository-labels.ts +3 -3
  386. package/scripts/repo/required-checks-logic.ts +206 -0
  387. package/scripts/repo/required-checks-report.ts +71 -0
  388. package/scripts/repo/ruleset-check-cli.ts +53 -0
  389. package/scripts/repo/ruleset-check.ts +147 -0
  390. package/scripts/report/report-lint-cli.ts +0 -4
  391. package/scripts/review/disposition-cli.ts +1 -1
  392. package/scripts/review/live-evidence.ts +1 -1
  393. package/scripts/review/review-attest-cli.ts +0 -6
  394. package/scripts/review/review-attest.ts +4 -16
  395. package/scripts/review/review-brief-cli.ts +23 -6
  396. package/scripts/review/review-brief.ts +21 -8
  397. package/scripts/review/review-diff-parts.ts +89 -0
  398. package/scripts/review/review-diff-write.ts +97 -0
  399. package/scripts/review/review-finding-ledger.ts +0 -1
  400. package/scripts/review/review-record-cli.ts +1 -1
  401. package/scripts/review/review-record.ts +0 -1
  402. package/scripts/review/review-round2-cli.ts +1 -1
  403. package/scripts/review/review-stamps.ts +0 -3
  404. package/scripts/review/review-tree.ts +14 -2
  405. package/scripts/rules/decision-oracle-stage.ts +18 -0
  406. package/scripts/rules/decision-oracle.ts +10 -7
  407. package/scripts/rules/delivered-rules.ts +9 -1
  408. package/scripts/rules/destructive-command.ts +119 -0
  409. package/scripts/rules/direct-filing.ts +1 -1
  410. package/scripts/rules/file-body.ts +0 -3
  411. package/scripts/rules/filing-cap.ts +0 -2
  412. package/scripts/rules/gh-api.ts +7 -2
  413. package/scripts/rules/git-argv.ts +18 -7
  414. package/scripts/rules/git-force.ts +0 -2
  415. package/scripts/rules/implementation-cut.ts +0 -1
  416. package/scripts/rules/index-guard.ts +71 -0
  417. package/scripts/rules/issue-citation.ts +50 -25
  418. package/scripts/rules/lane-background.ts +15 -7
  419. package/scripts/rules/lane-park.ts +13 -6
  420. package/scripts/rules/last-prompt.ts +1 -0
  421. package/scripts/rules/oracle-consulted.ts +1 -1
  422. package/scripts/rules/oracle-firing.ts +1 -0
  423. package/scripts/rules/oracle-list-cli.ts +0 -3
  424. package/scripts/rules/permission-guards.ts +14 -0
  425. package/scripts/rules/protected-files.ts +74 -0
  426. package/scripts/rules/reply-language.ts +1 -1
  427. package/scripts/rules/rule-body-guard.ts +0 -3
  428. package/scripts/rules/rule-value-cli.ts +0 -1
  429. package/scripts/rules/shell-body-trigger.ts +0 -1
  430. package/scripts/rules/shell-segments.ts +0 -1
  431. package/scripts/rules/stop-rules.ts +13 -5
  432. package/scripts/rules/tail-commands.ts +1 -1
  433. package/scripts/rules/test-declared-commit.ts +1 -1
  434. package/scripts/rules/third-party-write.ts +0 -1
  435. package/scripts/rules/worktree-guard.ts +26 -9
  436. package/scripts/run/run-carry-cli.ts +0 -2
  437. package/scripts/run/run-carry-stash.ts +2 -2
  438. package/scripts/run/run-carry-streak.ts +1 -1
  439. package/scripts/run/run-cut-cli.ts +0 -7
  440. package/scripts/run/run-cut.ts +8 -54
  441. package/scripts/run/run-ending-cli.ts +1 -1
  442. package/scripts/run/run-ending.ts +1 -4
  443. package/scripts/run/run-entry-cli.ts +101 -24
  444. package/scripts/run/run-entry.ts +0 -1
  445. package/scripts/run/run-event-cli.ts +0 -2
  446. package/scripts/run/run-event-follow.ts +1 -0
  447. package/scripts/run/run-event-render.ts +1 -1
  448. package/scripts/run/run-event-scope.ts +53 -4
  449. package/scripts/run/run-event-stream.ts +0 -3
  450. package/scripts/run/run-event-watch.ts +1 -0
  451. package/scripts/run/run-halfrun-resume.ts +20 -7
  452. package/scripts/run/run-headless.ts +2 -2
  453. package/scripts/run/run-hold-cli.ts +33 -10
  454. package/scripts/run/run-hold.ts +25 -5
  455. package/scripts/run/run-issue-number.ts +1 -1
  456. package/scripts/run/run-liveness-cli.ts +1 -1
  457. package/scripts/run/run-liveness.ts +2 -3
  458. package/scripts/run/run-merge-cli.ts +5 -13
  459. package/scripts/run/run-merge-steps.ts +5 -5
  460. package/scripts/run/run-merge.ts +1 -1
  461. package/scripts/run/run-next-cli.ts +1 -1
  462. package/scripts/run/run-parent-cut-hook.ts +0 -1
  463. package/scripts/run/run-preflight.ts +2 -9
  464. package/scripts/run/run-prep-cli.ts +2 -2
  465. package/scripts/run/run-prep-locate.ts +1 -1
  466. package/scripts/run/run-progress-cli.ts +4 -7
  467. package/scripts/run/run-progress-clock.ts +6 -34
  468. package/scripts/run/run-progress-config.ts +0 -4
  469. package/scripts/run/run-progress-read.ts +1 -2
  470. package/scripts/run/run-progress.ts +1 -2
  471. package/scripts/run/run-prrun-resume.ts +117 -0
  472. package/scripts/run/run-report-cli.ts +1 -2
  473. package/scripts/run/run-report.ts +0 -1
  474. package/scripts/run/run-retrospective.ts +1 -1
  475. package/scripts/run/run-review-cli.ts +0 -3
  476. package/scripts/run/run-review-steps.ts +2 -0
  477. package/scripts/run/run-review.ts +0 -2
  478. package/scripts/run/run-ship-cli.ts +21 -3
  479. package/scripts/run/run-ship-detach.ts +1 -0
  480. package/scripts/run/run-ship-next.ts +106 -0
  481. package/scripts/run/run-ship-preflight.ts +1 -1
  482. package/scripts/run/run-ship-return.ts +8 -3
  483. package/scripts/run/run-ship-review-steps.ts +18 -4
  484. package/scripts/run/run-ship-review.ts +11 -0
  485. package/scripts/run/run-ship-scoped.ts +1 -0
  486. package/scripts/run/run-ship-steps.ts +1 -1
  487. package/scripts/run/run-ship.ts +0 -1
  488. package/scripts/run/run-stage-read.ts +62 -0
  489. package/scripts/run/run-stage.ts +160 -0
  490. package/scripts/run/run-status-cli.ts +1 -1
  491. package/scripts/run/run-step-cli.ts +21 -14
  492. package/scripts/run/run-step.ts +1 -1
  493. package/scripts/run/run-stop-notify.ts +1 -3
  494. package/scripts/run/run-stranded-cli.ts +0 -4
  495. package/scripts/run/run-stranded-detect.ts +2 -2
  496. package/scripts/run/run-tail-cli.ts +17 -11
  497. package/scripts/run/run-tail.ts +2 -0
  498. package/scripts/run/run-tidy-lanes.ts +2 -1
  499. package/scripts/run/run-tidy-stashes.ts +12 -12
  500. package/scripts/run/run-wake-cli.ts +2 -3
  501. package/scripts/run/run-wake-loop.ts +2 -2
  502. package/scripts/run/run-wake.ts +2 -4
  503. package/scripts/run/run-watcher-guard-cli.ts +0 -4
  504. package/scripts/run/run-watcher-guard.ts +9 -7
  505. package/scripts/run/run-watcher-hook.ts +1 -1
  506. package/scripts/safe-chain/ci-installer-pin.ts +11 -5
  507. package/scripts/safe-chain/project-config.ts +1 -1
  508. package/scripts/security/security-audit-provision-logic.ts +0 -1
  509. package/scripts/security/security-audit-provision.ts +3 -2
  510. package/scripts/security/security-audit.ts +0 -1
  511. package/scripts/security/security-updates-logic.ts +0 -1
  512. package/scripts/sonar/sonar-hotspots-cli.ts +10 -52
  513. package/scripts/sonar/sonar-hotspots.ts +0 -1
  514. package/scripts/sonar/sonar-new-code-cli.ts +150 -0
  515. package/scripts/sonar/sonar-new-code.ts +79 -0
  516. package/scripts/sonar/sonar-project.ts +97 -0
  517. package/scripts/split/split-assess-cli.ts +1 -1
  518. package/scripts/split/split-assess.ts +2 -5
  519. package/scripts/sync/managed-config-scope-cli.ts +1 -1
  520. package/scripts/sync/skill-migration.ts +0 -1
  521. package/scripts/sync/sync-hook-safety.ts +2 -3
  522. package/scripts/sync/sync.ts +1 -8
  523. package/scripts/sync/template-source-logic.ts +0 -1
  524. package/scripts/sync/workflow-pin-logic.ts +16 -28
  525. package/scripts/test/test-declared-logic.ts +0 -1
  526. package/scripts/test/test-declared.ts +0 -2
  527. package/scripts/test/test-red-commit.ts +2 -2
  528. package/scripts/test/test-red.ts +14 -7
  529. package/scripts/test/test-type-logic.ts +1 -1
  530. package/scripts/test/unit-worker-share.ts +7 -16
  531. package/scripts/time-runtime/time-batch-guard.ts +1 -2
  532. package/scripts/time-runtime/time-bundle-call.ts +0 -1
  533. package/scripts/time-runtime/time-bundles.ts +0 -4
  534. package/scripts/time-runtime/time-density-hook.ts +0 -2
  535. package/scripts/time-runtime/time-followup-stage.ts +1 -1
  536. package/scripts/time-runtime/time-format.ts +0 -73
  537. package/scripts/time-runtime/time-round-trips.ts +0 -4
  538. package/scripts/time-runtime/time-single-check.ts +1 -1
  539. package/scripts/time-runtime/time-spans.ts +1 -1
  540. package/scripts/time-runtime/time-transcript-line.ts +1 -2
  541. package/scripts/ui/ui-routes-cli.ts +0 -5
  542. package/scripts/ui/ui-routes.ts +0 -5
  543. package/scripts/version/effective-upstream.ts +2 -2
  544. package/scripts/version/latest-corepack.ts +7 -9
  545. package/scripts/version/latest-scope-cli.ts +0 -2
  546. package/scripts/version/latest-update.ts +0 -2
  547. package/scripts/version/npm-registry.ts +2 -2
  548. package/scripts/version/publishable-range-check.ts +1 -1
  549. package/scripts/version/release-hold.ts +0 -4
  550. package/scripts/version/running-binary.ts +2 -2
  551. package/scripts/version/version-check-logic.ts +0 -2
  552. package/scripts/version/version-remote.ts +3 -3
  553. package/scripts/version/version-targets.ts +4 -4
  554. package/templates/sonar-project.properties +28 -1
  555. package/templates/workflows/dependabot-auto-merge.yml +5 -3
  556. package/templates/workflows/github-release.yml +81 -0
  557. package/prompts/collaboration-workflow/cross-repo-epic.md +0 -5
  558. package/prompts/collaboration-workflow/epic-audit.md +0 -5
  559. package/prompts/collaboration-workflow/epic-bundle.md +0 -5
  560. package/scripts/init/plugin-install-hint.ts +0 -47
  561. package/scripts/version/parse-json.ts +0 -13
  562. /package/scripts/{git → followup}/git-followup-stages.ts +0 -0
  563. /package/scripts/{git → gh}/git-gh-api-path.ts +0 -0
  564. /package/scripts/{git → gh}/git-gh-command.ts +0 -0
  565. /package/scripts/{git → gh}/git-gh-issue-write.ts +0 -0
  566. /package/scripts/{git → gh}/git-gh-issue.ts +0 -0
  567. /package/scripts/{git → gh}/git-gh-pr-auto-merge.ts +0 -0
  568. /package/scripts/{git → gh}/git-gh-pr-snapshot.ts +0 -0
  569. /package/scripts/{git → gh}/git-gh-reachability.ts +0 -0
  570. /package/scripts/{git → gh}/git-gh-repo.ts +0 -0
  571. /package/scripts/{git → gh}/git-gh-rest-state.ts +0 -0
  572. /package/scripts/{git → gh}/git-pr-checks-watch.ts +0 -0
  573. /package/scripts/{git → gh}/git-pr-error.ts +0 -0
  574. /package/scripts/{git → gh}/git-pr-messages.ts +0 -0
  575. /package/scripts/{git → gh}/github-issue-url.ts +0 -0
  576. /package/scripts/git/{stash-orphans.ts → stash/stash-orphans.ts} +0 -0
  577. /package/scripts/{git → issue}/issue-reference.ts +0 -0
  578. /package/scripts/{git → lib}/animation-helpers.ts +0 -0
  579. /package/scripts/{git → lib}/git-animation.ts +0 -0
  580. /package/scripts/{git → notify}/git-notify.ts +0 -0
  581. /package/scripts/{git → notify}/telegram-test-logic.ts +0 -0
@@ -454,173 +454,10 @@ function should_block(
454
454
  )
455
455
  }
456
456
 
457
- // What a read this rule saw was, in the four answers the rule itself can give
458
- // (joshuafolkken/kit#1764). `pnpm josh time` prints them as a block, and the ids are here rather than
459
- // there because each one is a fact about the guard: the two above the line are the reading §2b leaves
460
- // in the main line on purpose, and the two below it are the reading it sends to a unit.
461
- //
462
- // **The last is the gap, and naming it is the point.** A read that reached the threshold and was not
463
- // refused is neither by design nor caught, and nothing could see it — so the 35.9% of a run's turns
464
- // that `investigation` accounts for could not be told apart from the reading that belongs there. Two
465
- // things put a read in it, and the row deliberately covers both: a refusal already standing that the
466
- // arm above had not re-armed, and a spelling the guard never refuses at all (`sed -n`, below).
467
- const EDIT_TARGET_CLASS = 'edit targets'
468
- const UNDER_THRESHOLD_CLASS = 'under the threshold'
469
- const REFUSED_CLASS = 'refused'
470
- // Kept inside `time-format.ts`'s 24-character label column, which the fuller phrasing overflowed —
471
- // the prose beside the block is where the two reasons are named.
472
- const LET_THROUGH_CLASS = 'let through'
473
- const READ_CLASSES: ReadonlyArray<string> = [
474
- EDIT_TARGET_CLASS,
475
- UNDER_THRESHOLD_CLASS,
476
- REFUSED_CLASS,
477
- LET_THROUGH_CLASS,
478
- ]
479
-
480
- // **The live guard refuses a `Read` always and a shell read only where the line cannot also write**,
481
- // which is why `Bash: sed` is counted and never refused: `sed -n` prints and `sed -i` rewrites, and
482
- // `time-batch-guard.ts` → `is_read_only_call` answers conservatively for both. A span carries the
483
- // label but not the command, so the replay asks the question the span *can* answer — and of the eight
484
- // printing commands, `sed` is the only one on `time-bundle-call.ts`'s writing list. **The residual is
485
- // named rather than hidden**: a redirection inside a `cat` line also stops the live call being refusable
486
- // and is invisible here, so a handful of such reads land in `refused` that the guard would have let
487
- // through. It is the same direction as the row below and far smaller.
488
- const NEVER_REFUSED_LABELS: ReadonlySet<string> = new Set([time_shell.bash_label('sed')])
489
-
490
- // The guard's state as a replay walks a recorded run, which is `ReadTally` plus the one thing a live
491
- // hook keeps on disk instead — the instant it last refused.
492
- interface Replay {
493
- pending: Map<string, number>
494
- reset_ms: number
495
- window_start_ms: number
496
- refused_at_ms: number
497
- // The whole run's successful writes, gathered once by `classified_reads` and carried so `tally_now`
498
- // can hand them to the same exclusion the live guard makes (joshuafolkken/kit#1840).
499
- edited: ReadonlySet<string>
500
- }
501
-
502
- // The tally the live guard would have held at this instant, so the re-arm is asked of the one
503
- // function that answers it rather than of a second copy of the rule.
504
- function tally_now(replay: Replay): ReadTally {
505
- return {
506
- pending: [...replay.pending.keys()],
507
- pending_since: pending_after(replay.pending, replay.refused_at_ms),
508
- reset_ms: replay.reset_ms,
509
- window_start_ms: replay.window_start_ms,
510
- edited: replay.edited,
511
- }
512
- }
513
-
514
- // The same two conditions `should_block` asks: the accumulated count is at the boundary, and this
515
- // read actually adds a file to it.
516
- function reaches_threshold(replay: Replay, targets: ReadonlyArray<string>): boolean {
517
- const added = targets.filter((target) => !replay.pending.has(target))
518
-
519
- return added.length > 0 && is_at_threshold(replay.pending.size)
520
- }
521
-
522
- // Whether the guard would have refused this read had it been armed — the same two conditions
523
- // `is_refusable_call` puts in front of every refusal, asked of a span.
524
- function would_refuse(replay: Replay, span: Span): boolean {
525
- if (NEVER_REFUSED_LABELS.has(span.label)) return false
526
-
527
- return is_rearmed(tally_now(replay), replay.refused_at_ms)
528
- }
529
-
530
- function class_of(replay: Replay, span: Span, edited: ReadonlySet<string>): string {
531
- // Exclude the edited files first, so the threshold is judged on the same set `should_block` judges
532
- // it on: an all-edited read is an edit target, and a mixed read reaches the threshold only on its
533
- // genuinely new files, never on a file the run edited (joshuafolkken/kit#1840).
534
- const fresh = subject_targets(span.targets).filter((target) => !edited.has(target))
535
-
536
- if (fresh.length === 0) return EDIT_TARGET_CLASS
537
- if (!reaches_threshold(replay, fresh)) return UNDER_THRESHOLD_CLASS
538
-
539
- return would_refuse(replay, span) ? REFUSED_CLASS : LET_THROUGH_CLASS
540
- }
541
-
542
- // A span that is not a read, or whose every target was an instruction document or a session file,
543
- // classifies as nothing at all — it never reached the count, so putting it in a row would report the
544
- // guard as having an opinion about it.
545
- function read_class(replay: Replay, span: Span, edited: ReadonlySet<string>): string | undefined {
546
- if (!is_content_read(span.label)) return undefined
547
- if (subject_targets(span.targets).length === 0) return undefined
548
-
549
- return class_of(replay, span, edited)
550
- }
551
-
552
- function step(replay: Replay, span: Span, edited: ReadonlySet<string>): string | undefined {
553
- if (DELEGATION_TOOLS.has(span.label)) {
554
- replay.reset_ms = span.ended_ms
555
- apply_span(replay.pending, span, edited)
556
-
557
- return undefined
558
- }
559
-
560
- const found = read_class(replay, span, edited)
561
-
562
- // A refusal moves the disarm forward, exactly as the hook's own stamp does.
563
- if (found === REFUSED_CLASS) replay.refused_at_ms = span.ended_ms
564
-
565
- apply_span(replay.pending, span, edited)
566
-
567
- return found
568
- }
569
-
570
- // **A read paired with where it fell in the run** (joshuafolkken/kit#1868). `index` is the read span's
571
- // position in the array handed to `classified_reads`; `time-investigation.ts` classifies that same
572
- // array's phases and pairs the two by index, so it can say which phase — setup above all — each read
573
- // landed in.
574
- interface ClassifiedRead {
575
- found: string
576
- index: number
577
- }
578
-
579
- const FIRST_SPAN = 0
580
-
581
- function fresh_replay(spans: ReadonlyArray<Span>, edited: ReadonlySet<string>): Replay {
582
- return {
583
- pending: new Map<string, number>(),
584
- reset_ms: hook_decision.NEVER_MS,
585
- window_start_ms: spans[FIRST_SPAN]?.ended_ms ?? hook_decision.NEVER_MS,
586
- refused_at_ms: hook_decision.NEVER_MS,
587
- edited,
588
- }
589
- }
590
-
591
- // **What each of a run's reads was, replayed through this rule's own predicates**
592
- // (joshuafolkken/kit#1764). It is the measurement half of the guard and shares every decision with
593
- // it — the subject test, the threshold, the delegation reset and the re-arm — because a second walk
594
- // that merely resembled the guard would answer about a rule nobody ships. Each read carries its span's
595
- // index, so `time-investigation.ts` can place it in a phase (joshuafolkken/kit#1868).
596
- function classified_reads(spans: ReadonlyArray<Span>): Array<ClassifiedRead> {
597
- const edited = edited_files(spans)
598
- const replay = fresh_replay(spans, edited)
599
- const reads: Array<ClassifiedRead> = []
600
-
601
- for (const [index, span] of spans.entries()) {
602
- const found = step(replay, span, edited)
603
-
604
- if (found !== undefined) reads.push({ found, index })
605
- }
606
-
607
- return reads
608
- }
609
-
610
457
  const investigation_reads = {
611
- CONTENT_READ_COMMANDS,
612
- EDIT_TARGET_CLASS,
613
- LET_THROUGH_CLASS,
614
- READ_CLASSES,
615
- REFUSED_CLASS,
616
- UNDER_THRESHOLD_CLASS,
617
- classified_reads,
618
- subject_targets,
619
- DELEGATION_TOOLS,
620
458
  READ_TOOLS,
621
459
  REASON,
622
460
  is_at_threshold,
623
- is_content_read,
624
461
  is_instruction_document,
625
462
  is_rearmed,
626
463
  is_refusable_call,
@@ -633,5 +470,5 @@ const investigation_reads = {
633
470
  tally_of,
634
471
  }
635
472
 
636
- export type { ClassifiedRead, ReadTally }
473
+ export type { ReadTally }
637
474
  export { investigation_reads }
@@ -94,7 +94,6 @@ function build_repository_map(
94
94
 
95
95
  const repo_map_logic = {
96
96
  is_same_owner,
97
- parse_overrides,
98
97
  build_repository_map,
99
98
  }
100
99
 
@@ -62,7 +62,7 @@ function main(argv: ReadonlyArray<string>): void {
62
62
  process.exitCode = run(argv)
63
63
  }
64
64
 
65
- const repo_party_cli = { USAGE, decide, main, run }
65
+ const repo_party_cli = { USAGE, decide, run }
66
66
 
67
67
  if (process.argv[1] === fileURLToPath(import.meta.url)) main(process.argv.slice(ARGV_OFFSET))
68
68
 
@@ -1,9 +1,9 @@
1
1
  import { existsSync } from 'node:fs'
2
2
  import path from 'node:path'
3
+ import { json_value } from '#scripts/lib/json-value'
3
4
  import { file_reader } from '#scripts/lib/read-file'
4
5
  import { read_spawn_stdout } from '#scripts/lib/spawn-exit'
5
6
  import { KIT_PACKAGE_NAME } from '#scripts/version/kit-descriptor'
6
- import { safe_json_parse } from '#scripts/version/parse-json'
7
7
  import { execaSync } from 'execa'
8
8
  import { z } from 'zod'
9
9
 
@@ -40,7 +40,7 @@ type ClaudeMdState = typeof STATE_OK | typeof STATE_TARGET_MISSING | typeof STAT
40
40
  function parse_manifest(root: string): ManifestShape | undefined {
41
41
  const content = file_reader.read_if_readable(path.join(root, 'package.json'))
42
42
  if (content === undefined) return undefined
43
- const parsed = manifest_schema.safeParse(safe_json_parse(content))
43
+ const parsed = manifest_schema.safeParse(json_value.parse_or_undefined(content))
44
44
 
45
45
  return parsed.success ? parsed.data : undefined
46
46
  }
@@ -69,7 +69,7 @@ function is_kit_consumer(root: string): boolean {
69
69
  function is_plugin_declared(root: string): boolean {
70
70
  const content = file_reader.read_if_readable(path.join(root, SETTINGS_PATH))
71
71
  if (content === undefined) return false
72
- const parsed = settings_schema.safeParse(safe_json_parse(content))
72
+ const parsed = settings_schema.safeParse(json_value.parse_or_undefined(content))
73
73
 
74
74
  return parsed.success && parsed.data.enabledPlugins?.[PLUGIN_ID] === true
75
75
  }
@@ -107,7 +107,7 @@ function status_line(is_ok: boolean, ok_text: string, warn_text: string): string
107
107
  function plugin_line(is_declared: boolean): string {
108
108
  return status_line(
109
109
  is_declared,
110
- `kit plugin declared (run \`claude plugin install ${PLUGIN_ID}\` once if skills are missing)`,
110
+ 'kit plugin declared (skills load in a trusted workspace; headless from its second session)',
111
111
  'kit plugin not declared in .claude/settings.json — run `pnpm josh sync`',
112
112
  )
113
113
  }
@@ -159,8 +159,6 @@ function report_consumer_setup(root: string): void {
159
159
  const doctor_consumer = {
160
160
  claude_md_line,
161
161
  claude_md_state,
162
- configured_hooks_path,
163
- consumer_setup_lines,
164
162
  hooks_path_line,
165
163
  is_kit_consumer,
166
164
  is_plugin_declared,
@@ -3,7 +3,6 @@ import path from 'node:path'
3
3
  const RECOVERY_COMMAND = 'josh doctor --fix'
4
4
  const REPOSITORY_MAP_HEADING = 'Repositories (same owner, discovered next to this one):'
5
5
  const NO_REPOSITORIES_FOUND = ' (none discovered — see JOSH_REPO_PATHS in docs/josh-commands.md)'
6
- const GLOBAL_REINSTALL_COMMAND = 'pnpm add -g @joshuafolkken/kit'
7
6
  // Markers identifying a `josh` on PATH that was generated by an old kit `postinstall`
8
7
  // (pre-0.200.0 `install-bin.ts` wrote a shim referencing the kit package / tsx runner).
9
8
  const KIT_SHIM_MARKERS: ReadonlyArray<string> = [
@@ -102,14 +101,11 @@ function format_shadow_warning(path_josh: string, global_josh: string): string {
102
101
 
103
102
  const doctor_logic = {
104
103
  RECOVERY_COMMAND,
105
- GLOBAL_REINSTALL_COMMAND,
106
104
  NO_SHADOW_REASON,
107
105
  NOT_KIT_SHIM_REASON,
108
- RECLAIM_REASON,
109
106
  REPOSITORY_MAP_HEADING,
110
107
  NO_REPOSITORIES_FOUND,
111
108
  format_repository_map,
112
- normalize_path,
113
109
  path_lookup_command,
114
110
  first_path_line,
115
111
  is_shadowed,
@@ -6,6 +6,7 @@ import { repo_discovery } from '#scripts/discovery/repo-discovery'
6
6
  import { gh_spawn } from '#scripts/gh/gh-spawn'
7
7
  import { PROJECT_ROOT } from '#scripts/init/init-paths'
8
8
  import { auto_merge_setting } from '#scripts/repo/auto-merge-setting'
9
+ import { ruleset_check } from '#scripts/repo/ruleset-check'
9
10
  import { security_updates } from '#scripts/security/security-updates'
10
11
  import { running_binary } from '#scripts/version/running-binary'
11
12
  import { doctor_consumer } from './doctor-consumer'
@@ -32,8 +33,10 @@ interface GateScope {
32
33
 
33
34
  // Which repository-scoped reports this project has a prerequisite for.
34
35
  interface ApplicableSettings {
36
+ root: string
35
37
  security_updates: boolean
36
38
  auto_merge: boolean
39
+ required_checks: boolean
37
40
  }
38
41
 
39
42
  interface DoctorContext {
@@ -110,11 +113,17 @@ function resolve_gate_scope(git: GitTopLevel): GateScope | undefined {
110
113
  // workflow of its own has the second prerequisite and not the first.
111
114
  function resolve_applicable(scope: GateScope): ApplicableSettings {
112
115
  return {
116
+ root: scope.root,
113
117
  security_updates: doctor_io.has_distributed_dependabot_config(scope.root, scope.boundary),
114
118
  auto_merge: doctor_io.has_auto_merge_workflow(scope.root, scope.boundary),
119
+ required_checks: ruleset_check.expected_in(scope.root).length > 0,
115
120
  }
116
121
  }
117
122
 
123
+ function has_any_applicable(applicable: ApplicableSettings): boolean {
124
+ return applicable.security_updates || applicable.auto_merge || applicable.required_checks
125
+ }
126
+
118
127
  // Everything past the gate reports, including a failed lookup: `could not be read` is informative
119
128
  // while silence is the false all-clear joshuafolkken/kit#805 exists to remove.
120
129
  function report_applicable_settings(
@@ -123,6 +132,10 @@ function report_applicable_settings(
123
132
  ): void {
124
133
  if (applicable.security_updates) security_updates.report_security_updates_section(repo)
125
134
  if (applicable.auto_merge) auto_merge_setting.report_auto_merge_section(repo)
135
+
136
+ if (applicable.required_checks) {
137
+ ruleset_check.report_required_checks_section(repo, applicable.root)
138
+ }
126
139
  }
127
140
 
128
141
  // Last, and after the local diagnosis: this is the only part of `doctor` that touches the network,
@@ -143,7 +156,7 @@ function report_repository_settings(git: GitTopLevel): void {
143
156
  const scope = resolve_gate_scope(git)
144
157
  if (scope === undefined) return
145
158
  const applicable = resolve_applicable(scope)
146
- if (!applicable.security_updates && !applicable.auto_merge) return
159
+ if (!has_any_applicable(applicable)) return
147
160
 
148
161
  report_applicable_settings(
149
162
  applicable,
@@ -216,15 +229,7 @@ function main(): void {
216
229
  if (process.argv[1] === fileURLToPath(import.meta.url)) main()
217
230
 
218
231
  const doctor = {
219
- gather_context,
220
- print_report,
221
- reclaim_shim,
222
- handle_shadow,
223
232
  parse_options,
224
- consumer_root,
225
- run_reports,
226
- report_repository_map,
227
- report_port_seeds,
228
233
  main,
229
234
  }
230
235
 
@@ -6,7 +6,7 @@
6
6
  // documents no entry reads — the reference documents a human browses, drawn by
7
7
  // `document-reachability.ts` from `read:set`'s output rather than by a hand-written table.
8
8
  //
9
- // Agent-read documents (`.claude/skills/**/*.md`, `prompts/**/*.md` and `docs/josh-commands.md`) have
9
+ // Agent-read documents (`.claude/skills/**/*.md`, `prompts/**/*.md` and the two `docs/josh-commands*.md` references) have
10
10
  // been shrunk by reduction epics (joshuafolkken/kit#1929, joshuafolkken/kit#1924) only to swell
11
11
  // again, because nothing held the reduced size — a PR that adds a few lines at a time goes unseen
12
12
  // until the next reduction epic. This list is that hold for the unreached ones:
@@ -81,12 +81,11 @@ const DOCUMENT_BYTE_BUDGET: ReadonlyArray<DocumentBudget> = [
81
81
  { path: '.claude/skills/workflow-commands/prerequisite.md', bytes: 8192 },
82
82
  { path: '.claude/skills/workflow-commands/target-repository.md', bytes: 8192 },
83
83
  { path: '.claude/skills/workflow-commands/working-tree-hold.md', bytes: 8192 },
84
- { path: 'docs/josh-commands.md', bytes: 184_320 },
84
+ // joshuafolkken/kit#2998 split the reference: the developer commands stay, the rest moved out.
85
+ { path: 'docs/josh-commands-automation.md', bytes: 155_648 },
86
+ { path: 'docs/josh-commands.md', bytes: 36_864 },
85
87
  { path: 'prompts/coding-standards.md', bytes: 8192 },
86
88
  { path: 'prompts/collaboration-workflow.md', bytes: 8192 },
87
- { path: 'prompts/collaboration-workflow/cross-repo-epic.md', bytes: 4096 },
88
- { path: 'prompts/collaboration-workflow/epic-audit.md', bytes: 4096 },
89
- { path: 'prompts/collaboration-workflow/epic-bundle.md', bytes: 4096 },
90
89
  { path: 'prompts/collaboration-workflow/file-edits.md', bytes: 12_288 },
91
90
  { path: 'prompts/collaboration-workflow/gh-rest.md', bytes: 8192 },
92
91
  { path: 'prompts/collaboration-workflow/issue-citation.md', bytes: 8192 },
@@ -123,7 +123,6 @@ const document_byte_check = {
123
123
  ceiling_message,
124
124
  check_all,
125
125
  check_files,
126
- entry_over_budget_messages,
127
126
  over_budget_for,
128
127
  over_budget_messages,
129
128
  }
@@ -71,8 +71,6 @@ function main(argv: ReadonlyArray<string>): void {
71
71
  const document_read_cli = {
72
72
  OVER_CAP_PREFIX,
73
73
  READ_TOOL_DIRECTIVE,
74
- USAGE,
75
- main,
76
74
  over_cap_directive,
77
75
  run,
78
76
  }
@@ -94,7 +94,7 @@ function main(argv: ReadonlyArray<string>): void {
94
94
  process.exitCode = run(argv)
95
95
  }
96
96
 
97
- const document_section_cli = { FAILURE_EXIT_CODE, USAGE, main, resolve_document, run }
97
+ const document_section_cli = { FAILURE_EXIT_CODE, USAGE, resolve_document, run }
98
98
 
99
99
  if (process.argv[1] === fileURLToPath(import.meta.url)) main(process.argv.slice(ARGV_OFFSET))
100
100
 
@@ -138,13 +138,10 @@ function read_optional(file_path: string): string | undefined {
138
138
  }
139
139
 
140
140
  const document_section = {
141
- FENCE,
142
- HEADING_PATTERN,
143
141
  candidates,
144
142
  headings,
145
143
  read_optional,
146
144
  section,
147
- select,
148
145
  titles,
149
146
  }
150
147
 
@@ -270,7 +270,6 @@ function main(argv: ReadonlyArray<string>): void {
270
270
 
271
271
  const edit_files_cli = {
272
272
  USAGE,
273
- main,
274
273
  parse_plan,
275
274
  run,
276
275
  }
@@ -69,7 +69,7 @@ const ENTRY_READ_BUDGET: ReadonlyArray<EntryBudget> = [
69
69
  // list, so its ~48KB read crossed a block downward and the recorded ceiling drops to the block multiple
70
70
  // the stale-ratchet message named. The other entries still read it, so their rows hold.
71
71
  // joshuafolkken/kit#2345 added the `implementation-unit` delegation row (full fan-out procedure in
72
- // `docs/josh-commands.md` → "`josh fanout`"); `SKILL.md` §2b gained only a one-clause mention and a
72
+ // `docs/josh-commands-automation.md` → "`josh fanout`"); `SKILL.md` §2b gained only a one-clause mention and a
73
73
  // pointer, folded into the existing enumeration and offset by tightening §2b prose, so every entry
74
74
  // stayed within its block (kickoff has no block of headroom — its pre-#2294 ceiling is the next
75
75
  // multiple, which the downward ratchet holds shut).
@@ -79,10 +79,18 @@ const ENTRY_READ_BUDGET: ReadonlyArray<EntryBudget> = [
79
79
  // joshuafolkken/kit#2762 moved the rationale of five point-of-use documents to
80
80
  // `docs/maintainers/*-rationale.md`, and the ratchet holds the reduction. joshuafolkken/kit#2895 did
81
81
  // the same for eight more, lowering fullrun, halfrun and backlogrun one block each.
82
+ // joshuafolkken/kit#2998 split the command reference, so every reference to an automation command
83
+ // now names `josh-commands-automation.md`; the longer path tipped backlogrun one block over.
84
+ // joshuafolkken/kit#2994 moved `CLAUDE.md`'s explanations to `docs/maintainers/claude-md-history.md`,
85
+ // lowering backlogrun one block; kickoff's reduction was offset by joshuafolkken/kit#3024's longer
86
+ // `wip-cap.md`, so its ceiling stays.
87
+ // joshuafolkken/kit#3023 added the `prrun` keyword to `SKILL.md` and `CLAUDE.md`, tipping backlogrun
88
+ // one block over; `prrun` reads `fullrun`'s set plus its own short manifest.
82
89
  { entry: 'kickoff', bytes: 229_376 },
83
90
  { entry: 'fullrun', bytes: 225_280 },
84
91
  { entry: 'halfrun', bytes: 225_280 },
85
- { entry: 'backlogrun', bytes: 229_376 },
92
+ { entry: 'prrun', bytes: 229_376 },
93
+ { entry: 'backlogrun', bytes: 233_472 },
86
94
  { entry: LANE_CHILD, bytes: 77_824 },
87
95
  ]
88
96
 
@@ -12,7 +12,7 @@
12
12
  // section level, and the point-of-use documents a leaf never reaches dropped — applied by the shared
13
13
  // `read-set-trim`, which the `backlogrun` parent trim uses too (joshuafolkken/kit#2256).
14
14
 
15
- import type { Cost, ReadSetCost } from './entry-read-set'
15
+ import type { ReadSetCost } from './entry-read-set'
16
16
  import { read_set_trim } from './read-set-trim'
17
17
 
18
18
  const LANE_CHILD = 'lane-child'
@@ -73,16 +73,11 @@ function costed(root: string): ReadSetCost {
73
73
  })
74
74
  }
75
75
 
76
- function unused_skill_cost(root: string): Cost {
77
- return read_set_trim.unused_skill_cost(root, UNUSED_SKILL_SECTIONS)
78
- }
79
-
80
76
  const lane_child_read_set = {
81
77
  LANE_CHILD,
82
78
  SKIPPED_POINT_OF_USE,
83
79
  UNUSED_SKILL_SECTIONS,
84
80
  costed,
85
- unused_skill_cost,
86
81
  }
87
82
 
88
83
  export { lane_child_read_set }
@@ -122,11 +122,7 @@ function main(argv: ReadonlyArray<string>): void {
122
122
 
123
123
  const read_files_cli = {
124
124
  OVER_CAP_PREFIX,
125
- READ_TOOL_DIRECTIVE,
126
- SUCCESS_EXIT_CODE,
127
125
  USAGE,
128
- main,
129
- over_cap_directive,
130
126
  run,
131
127
  }
132
128
 
@@ -282,10 +282,8 @@ const read_set_cli = {
282
282
  POINT_OF_USE_LABEL,
283
283
  SCOPED_LABEL,
284
284
  TOTAL_READ_LABEL,
285
- USAGE,
286
285
  WHOLE_LABEL,
287
286
  known_entries,
288
- main,
289
287
  run,
290
288
  saved_percent,
291
289
  }
@@ -62,6 +62,7 @@ const POINT_OF_USE_BY_ENTRY: ReadonlyMap<string, ReadonlySet<string>> = new Map(
62
62
  ['kickoff', DEFERRED_DECISIONS],
63
63
  ['fullrun', DEFERRED_DECISIONS],
64
64
  ['halfrun', DEFERRED_DECISIONS],
65
+ ['prrun', DEFERRED_DECISIONS],
65
66
  ['backlogrun', new Set([...DEFERRED_DECISIONS, 'fullrun.md', 'split-assessment.md'])],
66
67
  ])
67
68
 
@@ -45,7 +45,6 @@ function dollars_per_run(tokens: number): number {
45
45
 
46
46
  const read_set_pricing = {
47
47
  ASSUMED_REQUESTS,
48
- REFERENCE_MODEL,
49
48
  dollars_per_run,
50
49
  }
51
50
 
@@ -72,7 +72,7 @@ function costed(root: string, spec: TrimSpec): ReadSetCost {
72
72
  }
73
73
  }
74
74
 
75
- const read_set_trim = { costed, unused_skill_cost }
75
+ const read_set_trim = { costed }
76
76
 
77
77
  export type { TrimSpec }
78
78
  export { read_set_trim }
@@ -1,5 +1,5 @@
1
1
  import { backlog_ready } from '#scripts/backlog/backlog-ready'
2
- import { git_gh_command } from '#scripts/git/git-gh-command'
2
+ import { git_gh_command } from '#scripts/gh/git-gh-command'
3
3
  import { epic_add_plan, type AddPlan } from './epic-add-plan'
4
4
  import type { InsertPosition } from './epic-chains'
5
5
  import { epic_decision } from './epic-decision'
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env tsx
2
2
  import { fileURLToPath } from 'node:url'
3
- import { git_gh_command } from '#scripts/git/git-gh-command'
3
+ import { git_gh_command } from '#scripts/gh/git-gh-command'
4
4
  import { issue_read } from '#scripts/issue/issue-read'
5
5
  import { epic_audit_logic, type AuditFinding, type ReferenceState } from './epic-audit'
6
6
  import { epic_audit_checks, type AuditChild } from './epic-audit-checks'
@@ -356,16 +356,13 @@ async function main(argv: ReadonlyArray<string>): Promise<void> {
356
356
  }
357
357
 
358
358
  const epic_audit_cli = {
359
- USAGE,
360
359
  UNREADABLE_REPO,
361
360
  parse_epic_number: epic_issue.parse_epic_number,
362
361
  attach_bodies,
363
362
  resolve_reference_states,
364
363
  outside_references,
365
- read_order_comments,
366
364
  audit,
367
365
  run,
368
- main,
369
366
  }
370
367
 
371
368
  if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
@@ -1,4 +1,4 @@
1
- import { git_gh_command } from '#scripts/git/git-gh-command'
1
+ import { git_gh_command } from '#scripts/gh/git-gh-command'
2
2
  import { cutoff_of, PAGE_CEILING_CAUSE, type ScanCutoff } from '#scripts/git/listing-cutoff'
3
3
  import { parse_json_array_safe } from '#scripts/git/parse-json-array'
4
4
  import { z } from 'zod'
@@ -129,8 +129,6 @@ function locally_tracked(snapshot: EpicSnapshot): Array<number> {
129
129
  }
130
130
 
131
131
  const epic_audit_orphans = {
132
- PARENT_MARKERS,
133
- ORPHAN_SEARCH,
134
132
  claimed_numbers,
135
133
  claims_parent,
136
134
  find_claiming_issues,
@@ -181,7 +181,6 @@ function find_unjustified_orders(input: RationaleInput): Array<AuditFinding> {
181
181
  }
182
182
 
183
183
  const epic_audit_rationale = {
184
- UNJUSTIFIED_ORDER,
185
184
  order_pairs,
186
185
  pair_ends,
187
186
  find_unjustified_orders,
@@ -91,9 +91,7 @@ const epic_audit_report = {
91
91
  PASS_LINE,
92
92
  anomaly_findings,
93
93
  unreadable_findings,
94
- has_error,
95
94
  build_result,
96
- sort_findings,
97
95
  format_report,
98
96
  }
99
97
 
@@ -39,7 +39,10 @@ const REPO_NAME_DOT = '.'
39
39
  const NO_KNOWN_REPOS: ReadonlySet<string> = new Set()
40
40
  // Where a child states what it must deliver. Both spellings, because the bodies are written in
41
41
  // whichever language the session was in.
42
- const ACCEPTANCE_HEADINGS: ReadonlyArray<string> = ['## 受け入れ条件', '## Acceptance criteria']
42
+ const ACCEPTANCE_HEADINGS: ReadonlySet<string> = new Set([
43
+ '## 受け入れ条件',
44
+ '## Acceptance criteria',
45
+ ])
43
46
  const HEADING_PREFIX = '## '
44
47
 
45
48
  type FindingLevel = 'error' | 'warning'
@@ -163,7 +166,7 @@ function parse_references(text: string, repo = ''): Array<number> {
163
166
  }
164
167
 
165
168
  function is_acceptance_heading(line: string): boolean {
166
- return ACCEPTANCE_HEADINGS.includes(line.trim())
169
+ return ACCEPTANCE_HEADINGS.has(line.trim())
167
170
  }
168
171
 
169
172
  function is_heading(line: string): boolean {
@@ -226,13 +229,11 @@ function depends_on(
226
229
  // a `#` lives in `prefix_before`, so the pattern on its own matches the tail of `owner/repo#12` —
227
230
  // the very reading this module exists to prevent.
228
231
  const epic_audit_logic = {
229
- ACCEPTANCE_HEADINGS,
230
232
  unique_references,
231
233
  known_repos,
232
234
  parse_issue_references,
233
235
  parse_references,
234
236
  acceptance_section,
235
- collect_blockers,
236
237
  depends_on,
237
238
  }
238
239
 
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env tsx
2
2
  import { fileURLToPath } from 'node:url'
3
- import { git_gh_command } from '#scripts/git/git-gh-command'
3
+ import { git_gh_command } from '#scripts/gh/git-gh-command'
4
4
  import { cutoff_of, type ScanCutoff } from '#scripts/git/listing-cutoff'
5
5
  import { parse_json_array_or_undefined } from '#scripts/git/parse-json-array'
6
6
  import { bounded_pool } from '#scripts/lib/bounded-pool'
@@ -139,7 +139,6 @@ function format_evidence(
139
139
 
140
140
  const epic_bundle_evidence = {
141
141
  EVIDENCE_HEADING,
142
- ordering_evidence,
143
142
  format_evidence,
144
143
  }
145
144