@joshuafolkken/kit 1.1050.0 → 1.1128.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 (630) 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 +20 -12
  4. package/.claude/skills/workflow-commands/background-commands.md +36 -84
  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 +30 -33
  8. package/.claude/skills/workflow-commands/backlogrun-steps.md +12 -12
  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 +8 -6
  16. package/.claude/skills/workflow-commands/halfrun.md +19 -21
  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 +8 -16
  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/pre-gate-cut.md +4 -8
  25. package/.claude/skills/workflow-commands/prerequisite.md +1 -1
  26. package/.claude/skills/workflow-commands/prrun.md +36 -0
  27. package/.claude/skills/workflow-commands/retrospective.md +1 -1
  28. package/.claude/skills/workflow-commands/split-assessment.md +4 -18
  29. package/.claude/skills/workflow-commands/working-tree-hold.md +22 -2
  30. package/.codex/hooks.json +16 -20
  31. package/.github/actions/setup-node/action.yml +33 -0
  32. package/.github/actions/setup-pnpm/action.yml +93 -0
  33. package/.github/dependabot.yml +5 -1
  34. package/.github/workflows/auto-tag.yml +2 -3
  35. package/.github/workflows/ci.yml +31 -134
  36. package/.github/workflows/dependabot-auto-merge.yml +1 -0
  37. package/.github/workflows/pr-classification.yml +6 -44
  38. package/.github/workflows/production.yml +1 -0
  39. package/.github/workflows/publish.yml +43 -47
  40. package/.github/workflows/sonar-qube.yml +41 -4
  41. package/.pnpmfile.mjs +29 -0
  42. package/AGENTS.md +5 -2
  43. package/CLAUDE.md +33 -27
  44. package/GEMINI.md +5 -2
  45. package/README.md +66 -20
  46. package/SECURITY.md +37 -6
  47. package/cspell/index.yaml +6 -1
  48. package/dist/CLAUDE.basic.md +6 -6
  49. package/dist/CLAUDE.md +33 -27
  50. package/dist/CLAUDE.static.md +6 -6
  51. package/dist/config-merge/index.js +48 -12
  52. package/dist/hooks/batch-guard.js +4 -4
  53. package/dist/hooks/{chunk-7VPDUBRN.js → chunk-4JZDP5X5.js} +152 -155
  54. package/dist/hooks/{chunk-HJIISEAC.js → chunk-5SD2YM7Z.js} +5 -13
  55. package/dist/hooks/{chunk-NAS4C7GP.js → chunk-77J7IEQM.js} +2 -2
  56. package/dist/hooks/{chunk-DMQN45FN.js → chunk-7HVB7SZG.js} +3 -3
  57. package/dist/hooks/{chunk-RLDX5SOC.js → chunk-AIOIOMPX.js} +4413 -1970
  58. package/dist/hooks/{chunk-5BK3K7V4.js → chunk-M7QKEKWO.js} +873 -2049
  59. package/dist/hooks/{chunk-WQ4OSBSS.js → chunk-MKVGBQPA.js} +2 -2
  60. package/dist/hooks/{chunk-EJDX2TOB.js → chunk-NXYMNPUQ.js} +7 -88
  61. package/dist/hooks/{chunk-NJQOBE6L.js → chunk-QVLT52OV.js} +2 -7
  62. package/dist/hooks/{chunk-GQ7KP45M.js → chunk-XYUIQOW3.js} +2 -2
  63. package/dist/hooks/codex-hook-adapter.js +12 -48
  64. package/dist/hooks/duplicate-read-guard.js +5 -5
  65. package/dist/hooks/format-edited.js +2 -2
  66. package/dist/hooks/inputs.json +280 -0
  67. package/dist/hooks/investigation-guard.js +5 -5
  68. package/dist/hooks/pretool-guard.js +9 -9
  69. package/dist/hooks/session-lang.js +0 -1
  70. package/dist/hooks/stop-guard.js +192 -333
  71. package/dist/josh.js +240 -148
  72. package/dist/managed-marker/index.js +2 -1
  73. package/dist/version/index.js +70 -78
  74. package/eslint/rules/promise.js +5 -0
  75. package/eslint/rules/unicorn.js +3 -2
  76. package/package.json +26 -5
  77. package/pnpm-workspace.yaml +5 -7
  78. package/prompts/collaboration-workflow/glossary.md +17 -0
  79. package/prompts/collaboration-workflow/issue-citation.md +5 -5
  80. package/prompts/collaboration-workflow/issue-template.md +1 -1
  81. package/prompts/collaboration-workflow/operating-rules.md +5 -5
  82. package/prompts/collaboration-workflow/overview.md +13 -1
  83. package/prompts/collaboration-workflow/principles.md +9 -0
  84. package/prompts/collaboration-workflow/report-format.md +1 -1
  85. package/prompts/collaboration-workflow/residency.md +3 -3
  86. package/prompts/collaboration-workflow/rule-delivery.md +1 -1
  87. package/prompts/collaboration-workflow/turn-batching.md +3 -3
  88. package/prompts/collaboration-workflow/upstream-interrupt.md +1 -1
  89. package/prompts/collaboration-workflow/wip-cap.md +25 -22
  90. package/prompts/collaboration-workflow.md +6 -8
  91. package/prompts/review-rubric.md +1 -1
  92. package/prompts/review.md +3 -3
  93. package/prompts/sonar-hotspot-handling.md +11 -3
  94. package/prompts/testing-guide.md +3 -3
  95. package/scripts/adopt/adopt-toolkits.ts +0 -2
  96. package/scripts/adopt/adopt.ts +0 -2
  97. package/scripts/agent/agent-argv.ts +0 -2
  98. package/scripts/agent/agent-diagnostics.ts +1 -1
  99. package/scripts/agent/agent-role-profile.ts +0 -7
  100. package/scripts/agent/claude-agent-argv.ts +0 -2
  101. package/scripts/agent/codex-agent-argv.ts +1 -1
  102. package/scripts/agent/codex-hooks.ts +92 -0
  103. package/scripts/agent/interactive-ask.ts +1 -1
  104. package/scripts/auto-ok/auto-ok-cli.ts +6 -16
  105. package/scripts/backlog/backlog-arrival.ts +30 -10
  106. package/scripts/backlog/backlog-budget-cli.ts +15 -16
  107. package/scripts/backlog/backlog-budget.ts +0 -2
  108. package/scripts/backlog/backlog-defect-priority.ts +2 -2
  109. package/scripts/backlog/backlog-drive-cli.ts +10 -8
  110. package/scripts/backlog/backlog-drive-named-offer.ts +16 -3
  111. package/scripts/backlog/backlog-drive-named.ts +2 -1
  112. package/scripts/backlog/backlog-drive.ts +76 -16
  113. package/scripts/backlog/backlog-named.ts +0 -3
  114. package/scripts/backlog/backlog-next.ts +9 -15
  115. package/scripts/backlog/backlog-offer-cli.ts +6 -19
  116. package/scripts/backlog/backlog-plan-cli.ts +1 -7
  117. package/scripts/backlog/backlog-plan.ts +30 -19
  118. package/scripts/backlog/backlog-pool.ts +3 -6
  119. package/scripts/backlog/backlog-rank.ts +2 -2
  120. package/scripts/backlog/backlog-ready.ts +39 -10
  121. package/scripts/backlog/backlog-scope.ts +1 -3
  122. package/scripts/backlog/backlog-stalled-detect.ts +2 -2
  123. package/scripts/backlog/backlog-stalled.ts +0 -1
  124. package/scripts/backlog/backlog-waves.ts +5 -2
  125. package/scripts/behavior/behavior-cli.ts +1 -1
  126. package/scripts/build/build-codex-hooks.ts +26 -0
  127. package/scripts/build/build-hooks.ts +85 -9
  128. package/scripts/build/hook-bundle-stamp.ts +111 -0
  129. package/scripts/cases/cases-cli.ts +1 -1
  130. package/scripts/cases/cases-logic.ts +1 -1
  131. package/scripts/ci/composite-actions.ts +30 -0
  132. package/scripts/ci/pr-classification.ts +3 -3
  133. package/scripts/claude/workflow-destination.ts +10 -1
  134. package/scripts/clone/clone-fingerprint.ts +0 -1
  135. package/scripts/clone/clone-scan-cli.ts +1 -1
  136. package/scripts/clone/clone-scan.ts +1 -1
  137. package/scripts/config-merge/json-format.ts +0 -1
  138. package/scripts/config-merge/parse-jsonc.ts +33 -3
  139. package/scripts/config-merge/patch-json-key.ts +13 -6
  140. package/scripts/config-merge/patch-yaml-list.ts +1 -1
  141. package/scripts/cost-runtime/codex-usage.ts +2 -9
  142. package/scripts/cost-runtime/cost-attribute.ts +0 -1
  143. package/scripts/cost-runtime/cost-cli.ts +3 -10
  144. package/scripts/cost-runtime/cost-corpus.ts +0 -2
  145. package/scripts/cost-runtime/cost-format.ts +0 -3
  146. package/scripts/cost-runtime/cost-pricing.ts +0 -1
  147. package/scripts/cost-runtime/cost-tokens.ts +0 -1
  148. package/scripts/delegation/delegation-cli.ts +1 -1
  149. package/scripts/delegation/delegation-policy.ts +0 -1
  150. package/scripts/delegation/duplicate-read-guard.ts +0 -8
  151. package/scripts/delegation/fanout-cli.ts +1 -1
  152. package/scripts/delegation/fanout.ts +0 -2
  153. package/scripts/delegation/investigation-reads.ts +1 -164
  154. package/scripts/discovery/repo-map-logic.ts +0 -1
  155. package/scripts/discovery/repo-party-cli.ts +1 -1
  156. package/scripts/doctor/doctor-consumer.ts +6 -10
  157. package/scripts/doctor/doctor-io.ts +9 -13
  158. package/scripts/doctor/doctor-logic.ts +0 -4
  159. package/scripts/doctor/doctor.ts +14 -9
  160. package/scripts/document/backlogrun-parent-read-set.ts +12 -1
  161. package/scripts/document/document-byte-budget.ts +5 -5
  162. package/scripts/document/document-byte-check.ts +0 -1
  163. package/scripts/document/document-read-cli.ts +0 -2
  164. package/scripts/document/document-section-cli.ts +1 -1
  165. package/scripts/document/document-section.ts +0 -3
  166. package/scripts/document/edit-files-cli.ts +0 -1
  167. package/scripts/document/entry-read-budget.ts +21 -7
  168. package/scripts/document/entry-read-set.ts +32 -8
  169. package/scripts/document/lane-child-read-set.ts +8 -6
  170. package/scripts/document/read-files-cli.ts +0 -4
  171. package/scripts/document/read-set-cli.ts +0 -2
  172. package/scripts/document/read-set-point-of-use.ts +9 -3
  173. package/scripts/document/read-set-pricing.ts +0 -1
  174. package/scripts/document/read-set-trim.ts +4 -2
  175. package/scripts/epic/epic-add.ts +1 -1
  176. package/scripts/epic/epic-audit-cli.ts +1 -4
  177. package/scripts/epic/epic-audit-orphans.ts +1 -3
  178. package/scripts/epic/epic-audit-rationale.ts +0 -1
  179. package/scripts/epic/epic-audit-report.ts +0 -2
  180. package/scripts/epic/epic-audit.ts +8 -22
  181. package/scripts/epic/epic-bundle-cli.ts +1 -1
  182. package/scripts/epic/epic-bundle-evidence.ts +0 -1
  183. package/scripts/epic/epic-bundle-referenced.ts +1 -5
  184. package/scripts/epic/epic-bundle.ts +0 -4
  185. package/scripts/epic/epic-busy.ts +4 -5
  186. package/scripts/epic/epic-candidate-confirm.ts +0 -5
  187. package/scripts/epic/epic-classify.ts +2 -2
  188. package/scripts/epic/epic-cli-argv.ts +0 -1
  189. package/scripts/epic/epic-close-comment.ts +1 -1
  190. package/scripts/epic/epic-close.ts +5 -2
  191. package/scripts/epic/epic-cross-repo.ts +2 -4
  192. package/scripts/epic/epic-decision.ts +0 -1
  193. package/scripts/epic/epic-fetch.ts +2 -2
  194. package/scripts/epic/epic-index.ts +2 -3
  195. package/scripts/epic/epic-issue.ts +1 -15
  196. package/scripts/epic/epic-lane-offer.ts +9 -8
  197. package/scripts/epic/epic-nested.ts +1 -1
  198. package/scripts/epic/epic-next-read.ts +1 -3
  199. package/scripts/epic/epic-next-views.ts +0 -1
  200. package/scripts/epic/epic-next.ts +1 -10
  201. package/scripts/epic/epic-parse.ts +0 -1
  202. package/scripts/epic/epic-promote.ts +0 -9
  203. package/scripts/epic/epic-rank.ts +2 -2
  204. package/scripts/epic/epic-read.ts +1 -2
  205. package/scripts/epic/epic-reconcile.ts +1 -1
  206. package/scripts/epic/epic-reference.ts +1 -13
  207. package/scripts/epic/epic-relation-recheck.ts +1 -1
  208. package/scripts/epic/epic-relations.ts +1 -1
  209. package/scripts/epic/epic-remove.ts +1 -1
  210. package/scripts/epic/epic-report.ts +0 -1
  211. package/scripts/epic/epic-run.ts +2 -3
  212. package/scripts/epic/epic-shape.ts +1 -1
  213. package/scripts/epic/epic-solo-stale.ts +107 -0
  214. package/scripts/epic/epic-solo.ts +3 -2
  215. package/scripts/epic/epic-triage.ts +1 -1
  216. package/scripts/epic/epic-validate.ts +1 -1
  217. package/scripts/epic/epic.ts +1 -1
  218. package/scripts/exports/unused-members-cli.ts +53 -0
  219. package/scripts/{git → followup}/followup-issue-number.ts +1 -6
  220. package/scripts/{git → followup}/git-followup-cleanup.ts +2 -1
  221. package/scripts/{git → followup}/git-followup-finish.ts +1 -3
  222. package/scripts/{git → followup}/git-followup-flush.ts +2 -2
  223. package/scripts/{git → followup}/git-followup-issue-close.ts +2 -2
  224. package/scripts/{git → followup}/git-followup-label.ts +4 -4
  225. package/scripts/followup/git-followup-merged.ts +112 -0
  226. package/scripts/{git → followup}/git-followup-pending.ts +1 -1
  227. package/scripts/{git → followup}/git-followup-workflow.ts +19 -11
  228. package/scripts/{git → followup}/git-pr-followup-wrapup.ts +9 -3
  229. package/scripts/{git → followup}/git-pr-followup.ts +53 -16
  230. package/scripts/gate/core-budget.ts +3 -9
  231. package/scripts/gate/gate-plan.ts +7 -4
  232. package/scripts/gate/gate-report.ts +0 -6
  233. package/scripts/gate/gate-tree.ts +1 -1
  234. package/scripts/gate/pre-commit-type-check.ts +0 -6
  235. package/scripts/gate/project-checks.ts +7 -8
  236. package/scripts/gate/scoped-green.ts +0 -1
  237. package/scripts/gate/type-check-step.ts +1 -1
  238. package/scripts/gate/verification-gate.ts +0 -2
  239. package/scripts/gh/fix-gh-packages.ts +15 -12
  240. package/scripts/gh/gh-spawn.ts +2 -2
  241. package/scripts/{git → gh}/git-ai-review-scan.ts +1 -5
  242. package/scripts/{git → gh}/git-gh-check.ts +2 -1
  243. package/scripts/{git → gh}/git-gh-exec.ts +1 -1
  244. package/scripts/{git → gh}/git-gh-failure.ts +1 -1
  245. package/scripts/{git → gh}/git-gh-helpers.ts +0 -1
  246. package/scripts/{git → gh}/git-gh-issue-list.ts +13 -10
  247. package/scripts/{git → gh}/git-gh-issue-read.ts +1 -1
  248. package/scripts/{git → gh}/git-gh-issue-rest.ts +6 -3
  249. package/scripts/{git → gh}/git-gh-issue-write.ts +4 -1
  250. package/scripts/{git → gh}/git-gh-pr-auto-merge.ts +4 -1
  251. package/scripts/{git → gh}/git-gh-pr-read.ts +24 -0
  252. package/scripts/{git → gh}/git-gh-pr-rest.ts +5 -2
  253. package/scripts/{git → gh}/git-gh-pr-review.ts +2 -2
  254. package/scripts/{git → gh}/git-gh-pr-rollup.ts +1 -3
  255. package/scripts/{git → gh}/git-gh-pr.ts +3 -1
  256. package/scripts/{git → gh}/git-pr-ai-review.ts +2 -5
  257. package/scripts/{git → gh}/git-pr-checks-eval.ts +0 -10
  258. package/scripts/{git → gh}/git-pr-checks-parse.ts +4 -20
  259. package/scripts/{git → gh}/git-pr-checks.ts +2 -1
  260. package/scripts/{git → gh}/git-pr-coderabbit.ts +2 -5
  261. package/scripts/{git → gh}/git-pr-confirmation.ts +1 -3
  262. package/scripts/{git → gh}/git-pr-managed-config.ts +2 -3
  263. package/scripts/{git → gh}/git-pr.ts +3 -3
  264. package/scripts/git/changed-file-scope.ts +0 -1
  265. package/scripts/git/git-branch.ts +3 -6
  266. package/scripts/git/git-command.ts +6 -1
  267. package/scripts/git/git-commit.ts +1 -1
  268. package/scripts/git/git-common-directory.ts +80 -24
  269. package/scripts/git/git-error.ts +66 -9
  270. package/scripts/git/git-issue.ts +1 -1
  271. package/scripts/git/git-preflight.ts +2 -2
  272. package/scripts/git/git-prompt.ts +6 -31
  273. package/scripts/git/git-push.ts +1 -1
  274. package/scripts/git/git-spawn-sync.ts +65 -0
  275. package/scripts/git/git-spawn.ts +5 -4
  276. package/scripts/git/git-staging.ts +1 -0
  277. package/scripts/git/git-status.ts +1 -1
  278. package/scripts/git/git-workflow.ts +1 -1
  279. package/scripts/git/gone-branch.ts +1 -0
  280. package/scripts/git/listing-cutoff.ts +1 -1
  281. package/scripts/git/main-merge.ts +1 -1
  282. package/scripts/git/main-sync.ts +19 -1
  283. package/scripts/git/parse-json-array.ts +0 -3
  284. package/scripts/git/repository-lock.ts +16 -16
  285. package/scripts/git/{git-stash.ts → stash/git-stash.ts} +1 -1
  286. package/scripts/git/{stash-pop-args.ts → stash/stash-pop-args.ts} +2 -7
  287. package/scripts/git/{stash-pop-cli.ts → stash/stash-pop-cli.ts} +0 -1
  288. package/scripts/git/{stash-sweep-lock.ts → stash/stash-sweep-lock.ts} +3 -3
  289. package/scripts/hooks/codex-hook-adapter.ts +0 -1
  290. package/scripts/hooks/edited-cspell.ts +1 -1
  291. package/scripts/hooks/format-edited-file.ts +2 -0
  292. package/scripts/hooks/pre-push-unit.ts +0 -4
  293. package/scripts/hooks/pretool-guard.ts +22 -4
  294. package/scripts/hooks/reserved-run.ts +1 -1
  295. package/scripts/hooks/step-zero-notice.ts +76 -0
  296. package/scripts/hooks/stop-guard.ts +47 -21
  297. package/scripts/init/claude-plugin-config.ts +4 -5
  298. package/scripts/init/hook-command-rewrite.ts +16 -8
  299. package/scripts/init/hook-launch.ts +41 -15
  300. package/scripts/init/init-basic.ts +2 -5
  301. package/scripts/init/init-file-action.ts +54 -0
  302. package/scripts/init/init-logic-migrate.ts +35 -17
  303. package/scripts/init/init-logic-secretlint.ts +1 -1
  304. package/scripts/init/init-logic.ts +10 -19
  305. package/scripts/init/init.ts +11 -71
  306. package/scripts/init/kit-written-paths.ts +2 -0
  307. package/scripts/init/project-profile.ts +9 -17
  308. package/scripts/init/start-exec.ts +1 -1
  309. package/scripts/init/start-setup-pr.ts +6 -6
  310. package/scripts/init/start-steps.ts +3 -1
  311. package/scripts/issue/behavior-change-lint.ts +0 -1
  312. package/scripts/issue/defect-rate-cli.ts +64 -23
  313. package/scripts/issue/defect-rate.ts +1 -2
  314. package/scripts/{git → issue}/git-next-issues.ts +3 -3
  315. package/scripts/issue/issue-backlinks-cli.ts +1 -5
  316. package/scripts/issue/issue-backlinks.ts +7 -14
  317. package/scripts/issue/issue-cite-cli.ts +2 -6
  318. package/scripts/issue/issue-cite.ts +12 -8
  319. package/scripts/issue/issue-classification.ts +1 -9
  320. package/scripts/issue/issue-closing-pr.ts +4 -4
  321. package/scripts/issue/issue-comment-cli.ts +2 -2
  322. package/scripts/issue/issue-file-cli.ts +5 -5
  323. package/scripts/issue/issue-file.ts +7 -14
  324. package/scripts/issue/issue-fold-cli.ts +1 -1
  325. package/scripts/issue/issue-fold-existing-cli.ts +1 -1
  326. package/scripts/{git → issue}/issue-labels.ts +8 -0
  327. package/scripts/issue/issue-lint-cli.ts +1 -1
  328. package/scripts/issue/issue-merged.ts +2 -2
  329. package/scripts/{git → issue}/issue-rank.ts +1 -1
  330. package/scripts/issue/issue-read-cli.ts +8 -47
  331. package/scripts/issue/issue-read.ts +0 -2
  332. package/scripts/issue/issue-report-failures.ts +80 -0
  333. package/scripts/issue/issue-scout-cli.ts +1 -7
  334. package/scripts/issue/issue-scout-closed.ts +2 -2
  335. package/scripts/issue/issue-scout.ts +0 -2
  336. package/scripts/issue/issue-state-cli.ts +5 -46
  337. package/scripts/issue/issue-state.ts +1 -5
  338. package/scripts/issue/markdown-section.ts +21 -6
  339. package/scripts/issue/measure-rerun-cli.ts +74 -15
  340. package/scripts/issue/reproduction-measure.ts +1 -1
  341. package/scripts/josh/cli-body.ts +1 -1
  342. package/scripts/josh/file-map-stamp.ts +0 -3
  343. package/scripts/josh/josh-command-map.ts +2 -0
  344. package/scripts/josh/josh-commands-ai.ts +9 -102
  345. package/scripts/josh/josh-commands-backlog.ts +5 -1
  346. package/scripts/josh/josh-commands-development.ts +8 -1
  347. package/scripts/josh/josh-commands-issue.ts +2 -2
  348. package/scripts/josh/josh-commands-maintenance.ts +7 -0
  349. package/scripts/josh/josh-commands-project.ts +7 -1
  350. package/scripts/josh/josh-commands-run.ts +114 -0
  351. package/scripts/josh/josh-commands-versioning.ts +8 -0
  352. package/scripts/josh/josh-commands-workflow.ts +3 -3
  353. package/scripts/josh/path-decision.ts +0 -3
  354. package/scripts/josh/process-owner.ts +16 -0
  355. package/scripts/josh/run-github-prerequisite.ts +3 -6
  356. package/scripts/josh/session-language-cli.ts +0 -1
  357. package/scripts/lane/lane-await.ts +46 -19
  358. package/scripts/lane/lane-capacity.ts +6 -3
  359. package/scripts/lane/lane-child-invocation.ts +20 -7
  360. package/scripts/lane/lane-cli.ts +1 -4
  361. package/scripts/lane/lane-close.ts +5 -4
  362. package/scripts/lane/lane-dispatch.ts +3 -4
  363. package/scripts/lane/lane-environment.ts +0 -9
  364. package/scripts/lane/lane-handoff.ts +38 -0
  365. package/scripts/lane/lane-launch-cli.ts +31 -27
  366. package/scripts/lane/lane-open.ts +0 -3
  367. package/scripts/lane/lane-output.ts +0 -1
  368. package/scripts/lane/lane-registry.ts +9 -0
  369. package/scripts/lane/openai-lane-ship.ts +2 -0
  370. package/scripts/lane/openai-lane-supervisor-decision.ts +2 -1
  371. package/scripts/lane/openai-lane-supervisor.ts +6 -4
  372. package/scripts/lane/openai-review-broker.ts +7 -1
  373. package/scripts/lib/bounded-pool.ts +1 -0
  374. package/scripts/lib/cli-flags.ts +31 -2
  375. package/scripts/lib/error-message.ts +12 -1
  376. package/scripts/lib/json-value.ts +5 -4
  377. package/scripts/lib/poll.ts +3 -1
  378. package/scripts/lib/timed-fetch.ts +15 -0
  379. package/scripts/lib/timeouts.ts +13 -0
  380. package/scripts/{yaml → lib}/yaml-document.ts +3 -1
  381. package/scripts/{bytes → lines}/bytes-command.ts +0 -2
  382. package/scripts/lines/line-targets.ts +0 -11
  383. package/scripts/lines/lines-command.ts +5 -4
  384. package/scripts/lint/lint-related-scope.ts +0 -1
  385. package/scripts/lint/lint-related.ts +1 -1
  386. package/scripts/{git → notify}/telegram-notify.ts +2 -2
  387. package/scripts/{git → notify}/telegram-test.ts +4 -4
  388. package/scripts/observations/observation-ledger-home.ts +0 -1
  389. package/scripts/observations/observation-ledger-line.ts +0 -1
  390. package/scripts/observations/observation-ledger-migrate.ts +1 -1
  391. package/scripts/observations/observations-flush-landing.ts +3 -3
  392. package/scripts/observations/observations-flush.ts +2 -2
  393. package/scripts/overrides/lockfile-overrides.ts +1 -1
  394. package/scripts/overrides/overrides-logic.ts +1 -1
  395. package/scripts/package/package-scout-cli.ts +2 -7
  396. package/scripts/package/package-scout.ts +0 -2
  397. package/scripts/propagate/propagate-git-failure.ts +0 -1
  398. package/scripts/propagate/propagate-git.ts +3 -10
  399. package/scripts/propagate/propagate-publish.ts +2 -3
  400. package/scripts/propagate/propagate-run.ts +0 -2
  401. package/scripts/propagate/propagate-steps.ts +3 -5
  402. package/scripts/propagate/propagate-targets.ts +0 -4
  403. package/scripts/propagate/propagate.ts +0 -4
  404. package/scripts/refactor/import-graph.ts +0 -1
  405. package/scripts/refactor/refactor-lint.ts +0 -2
  406. package/scripts/refactor/refactor-scan.ts +2 -2
  407. package/scripts/refactor/refactor-targets.ts +0 -1
  408. package/scripts/registry-migration/migrate-logic.ts +28 -21
  409. package/scripts/registry-migration/migrate.ts +25 -14
  410. package/scripts/release/github-release-cli.ts +19 -6
  411. package/scripts/release/github-release-environment.ts +46 -0
  412. package/scripts/release/github-release.ts +151 -94
  413. package/scripts/release/release-history.ts +0 -1
  414. package/scripts/release/release-plan.ts +0 -1
  415. package/scripts/release/release-publish.ts +38 -5
  416. package/scripts/release/release-scope-cli.ts +1 -2
  417. package/scripts/release/release-tag.ts +2 -4
  418. package/scripts/release/release-worktree.ts +97 -2
  419. package/scripts/repo/auto-merge-setting-logic.ts +1 -4
  420. package/scripts/repo/repo-setting.ts +1 -1
  421. package/scripts/repo/repository-labels.ts +3 -3
  422. package/scripts/repo/required-checks-logic.ts +206 -0
  423. package/scripts/repo/required-checks-report.ts +71 -0
  424. package/scripts/repo/ruleset-check-cli.ts +53 -0
  425. package/scripts/repo/ruleset-check.ts +147 -0
  426. package/scripts/report/report-lint-cli.ts +0 -4
  427. package/scripts/review/disposition-cli.ts +1 -1
  428. package/scripts/review/live-evidence.ts +1 -1
  429. package/scripts/review/review-attest-cli.ts +0 -6
  430. package/scripts/review/review-attest.ts +4 -16
  431. package/scripts/review/review-brief-cli.ts +23 -6
  432. package/scripts/review/review-brief.ts +21 -8
  433. package/scripts/review/review-checkout.ts +3 -2
  434. package/scripts/review/review-diff-parts.ts +89 -0
  435. package/scripts/review/review-diff-write.ts +97 -0
  436. package/scripts/review/review-finding-ledger.ts +0 -1
  437. package/scripts/review/review-record-cli.ts +10 -17
  438. package/scripts/review/review-record.ts +0 -1
  439. package/scripts/review/review-round2-cli.ts +1 -1
  440. package/scripts/review/review-stamps.ts +0 -3
  441. package/scripts/review/review-tree.ts +14 -2
  442. package/scripts/rules/decision-oracle-stage.ts +18 -0
  443. package/scripts/rules/decision-oracle.ts +10 -7
  444. package/scripts/rules/delivered-rules.ts +9 -1
  445. package/scripts/rules/destructive-command.ts +119 -0
  446. package/scripts/rules/direct-filing.ts +1 -1
  447. package/scripts/rules/early-heartbeat.ts +4 -3
  448. package/scripts/rules/file-body.ts +0 -3
  449. package/scripts/rules/filing-cap.ts +0 -2
  450. package/scripts/rules/gh-api.ts +7 -2
  451. package/scripts/rules/git-argv.ts +18 -7
  452. package/scripts/rules/git-force.ts +0 -2
  453. package/scripts/rules/implementation-cut.ts +0 -1
  454. package/scripts/rules/index-guard.ts +71 -0
  455. package/scripts/rules/issue-citation.ts +50 -25
  456. package/scripts/rules/lane-background.ts +15 -7
  457. package/scripts/rules/lane-park.ts +22 -6
  458. package/scripts/rules/last-prompt.ts +1 -0
  459. package/scripts/rules/oracle-consulted.ts +1 -1
  460. package/scripts/rules/oracle-firing.ts +1 -0
  461. package/scripts/rules/oracle-list-cli.ts +0 -3
  462. package/scripts/rules/permission-guards.ts +14 -0
  463. package/scripts/rules/protected-files.ts +74 -0
  464. package/scripts/rules/reply-language.ts +1 -1
  465. package/scripts/rules/rule-body-guard.ts +0 -3
  466. package/scripts/rules/rule-value-cli.ts +0 -1
  467. package/scripts/rules/shell-body-trigger.ts +0 -1
  468. package/scripts/rules/shell-segments.ts +0 -1
  469. package/scripts/rules/stop-rules.ts +20 -9
  470. package/scripts/rules/tail-commands.ts +1 -1
  471. package/scripts/rules/test-declared-commit.ts +1 -1
  472. package/scripts/rules/third-party-write.ts +0 -1
  473. package/scripts/rules/worktree-guard.ts +26 -9
  474. package/scripts/run/run-carry-args.ts +8 -12
  475. package/scripts/run/run-carry-cli.ts +0 -2
  476. package/scripts/run/run-carry-stash.ts +2 -2
  477. package/scripts/run/run-carry-streak.ts +1 -1
  478. package/scripts/run/run-cut-args.ts +1 -6
  479. package/scripts/run/run-cut-cli.ts +0 -7
  480. package/scripts/run/run-cut.ts +8 -54
  481. package/scripts/run/run-ending-cli.ts +2 -6
  482. package/scripts/run/run-ending.ts +1 -4
  483. package/scripts/run/run-entry-cli.ts +133 -25
  484. package/scripts/run/run-entry-stop.ts +104 -0
  485. package/scripts/run/run-entry.ts +0 -1
  486. package/scripts/run/run-event-cli.ts +0 -2
  487. package/scripts/run/run-event-follow.ts +1 -0
  488. package/scripts/run/run-event-render.ts +1 -1
  489. package/scripts/run/run-event-scope.ts +53 -4
  490. package/scripts/run/run-event-stream-emit.ts +7 -2
  491. package/scripts/run/run-event-stream.ts +0 -3
  492. package/scripts/run/run-event-watch.ts +1 -0
  493. package/scripts/run/run-halfrun-resume.ts +20 -7
  494. package/scripts/run/run-headless.ts +2 -2
  495. package/scripts/run/run-hold-cli.ts +33 -10
  496. package/scripts/run/run-hold.ts +29 -6
  497. package/scripts/run/run-issue-number.ts +1 -1
  498. package/scripts/run/run-liveness-cli.ts +2 -6
  499. package/scripts/run/run-liveness.ts +2 -3
  500. package/scripts/run/run-merge-cli.ts +7 -23
  501. package/scripts/run/run-merge-steps.ts +5 -5
  502. package/scripts/run/run-merge.ts +1 -1
  503. package/scripts/run/run-next-cli.ts +1 -1
  504. package/scripts/run/run-parent-cut-hook.ts +4 -2
  505. package/scripts/run/run-preflight.ts +2 -9
  506. package/scripts/run/run-prep-cli.ts +6 -3
  507. package/scripts/run/run-prep-locate.ts +1 -1
  508. package/scripts/run/run-progress-args.ts +20 -4
  509. package/scripts/run/run-progress-cli.ts +35 -36
  510. package/scripts/run/run-progress-clock.ts +10 -35
  511. package/scripts/run/run-progress-config.ts +0 -4
  512. package/scripts/run/run-progress-read.ts +1 -2
  513. package/scripts/run/run-progress.ts +1 -2
  514. package/scripts/run/run-prrun-resume.ts +117 -0
  515. package/scripts/run/run-report-cli.ts +1 -2
  516. package/scripts/run/run-report.ts +0 -1
  517. package/scripts/run/run-retrospective.ts +1 -1
  518. package/scripts/run/run-review-cli.ts +0 -3
  519. package/scripts/run/run-review-steps.ts +2 -0
  520. package/scripts/run/run-review.ts +0 -2
  521. package/scripts/run/run-ship-cli.ts +29 -19
  522. package/scripts/run/run-ship-detach.ts +1 -0
  523. package/scripts/run/run-ship-next.ts +106 -0
  524. package/scripts/run/run-ship-preflight.ts +1 -1
  525. package/scripts/run/run-ship-probe.ts +4 -1
  526. package/scripts/run/run-ship-return.ts +8 -3
  527. package/scripts/run/run-ship-review-steps.ts +18 -4
  528. package/scripts/run/run-ship-review.ts +11 -0
  529. package/scripts/run/run-ship-scoped.ts +1 -0
  530. package/scripts/run/run-ship-steps.ts +1 -1
  531. package/scripts/run/run-ship.ts +0 -1
  532. package/scripts/run/run-stage-read.ts +62 -0
  533. package/scripts/run/run-stage.ts +160 -0
  534. package/scripts/run/run-status-cli.ts +3 -16
  535. package/scripts/run/run-step-cli.ts +21 -14
  536. package/scripts/run/run-step.ts +1 -1
  537. package/scripts/run/run-stop-notify.ts +1 -3
  538. package/scripts/run/run-stranded-cli.ts +0 -4
  539. package/scripts/run/run-stranded-detect.ts +2 -2
  540. package/scripts/run/run-tail-cli.ts +17 -11
  541. package/scripts/run/run-tail.ts +2 -0
  542. package/scripts/run/run-tidy-lanes.ts +6 -2
  543. package/scripts/run/run-tidy-stashes.ts +12 -12
  544. package/scripts/run/run-wake-cli.ts +4 -13
  545. package/scripts/run/run-wake-loop.ts +2 -2
  546. package/scripts/run/run-wake.ts +2 -4
  547. package/scripts/run/run-watcher-guard-cli.ts +0 -4
  548. package/scripts/run/run-watcher-guard.ts +18 -12
  549. package/scripts/run/run-watcher-hook.ts +1 -1
  550. package/scripts/safe-chain/ci-installer-pin.ts +11 -5
  551. package/scripts/safe-chain/pack-hook.ts +92 -0
  552. package/scripts/safe-chain/project-config.ts +1 -1
  553. package/scripts/security/security-audit-provision-logic.ts +0 -1
  554. package/scripts/security/security-audit-provision.ts +3 -2
  555. package/scripts/security/security-audit.ts +0 -1
  556. package/scripts/security/security-updates-logic.ts +0 -1
  557. package/scripts/sonar/sonar-hotspots-cli.ts +10 -52
  558. package/scripts/sonar/sonar-hotspots.ts +0 -1
  559. package/scripts/sonar/sonar-new-code-cli.ts +150 -0
  560. package/scripts/sonar/sonar-new-code.ts +79 -0
  561. package/scripts/sonar/sonar-project.ts +97 -0
  562. package/scripts/split/split-assess-cli.ts +1 -1
  563. package/scripts/split/split-assess.ts +2 -5
  564. package/scripts/sync/managed-config-scope-cli.ts +1 -1
  565. package/scripts/sync/skill-migration.ts +0 -1
  566. package/scripts/sync/sync-ai-files.ts +4 -0
  567. package/scripts/sync/sync-hook-safety.ts +2 -3
  568. package/scripts/sync/sync.ts +1 -8
  569. package/scripts/sync/template-source-logic.ts +0 -1
  570. package/scripts/sync/workflow-pin-logic.ts +16 -28
  571. package/scripts/test/test-declared-changed.ts +13 -16
  572. package/scripts/test/test-declared-logic.ts +0 -1
  573. package/scripts/test/test-declared.ts +3 -9
  574. package/scripts/test/test-red-commit.ts +2 -2
  575. package/scripts/test/test-red.ts +14 -7
  576. package/scripts/test/test-type-logic.ts +1 -1
  577. package/scripts/test/unit-worker-share.ts +7 -16
  578. package/scripts/time-runtime/time-batch-guard.ts +1 -2
  579. package/scripts/time-runtime/time-bundle-call.ts +0 -1
  580. package/scripts/time-runtime/time-bundles.ts +0 -4
  581. package/scripts/time-runtime/time-density-hook.ts +0 -2
  582. package/scripts/time-runtime/time-followup-stage.ts +1 -1
  583. package/scripts/time-runtime/time-format.ts +0 -73
  584. package/scripts/time-runtime/time-round-trips.ts +0 -4
  585. package/scripts/time-runtime/time-single-check.ts +1 -1
  586. package/scripts/time-runtime/time-spans.ts +1 -1
  587. package/scripts/time-runtime/time-transcript-line.ts +1 -2
  588. package/scripts/ui/ui-routes-cli.ts +0 -5
  589. package/scripts/ui/ui-routes.ts +0 -5
  590. package/scripts/version/effective-upstream.ts +2 -2
  591. package/scripts/version/latest-corepack.ts +7 -9
  592. package/scripts/version/latest-scope-cli.ts +0 -2
  593. package/scripts/version/latest-update.ts +0 -2
  594. package/scripts/version/npm-registry.ts +2 -2
  595. package/scripts/version/publishable-range-check.ts +1 -1
  596. package/scripts/version/release-hold.ts +0 -4
  597. package/scripts/version/running-binary.ts +2 -2
  598. package/scripts/version/version-check-logic.ts +0 -2
  599. package/scripts/version/version-commands.ts +11 -1
  600. package/scripts/version/version-remote.ts +3 -3
  601. package/scripts/version/version-targets.ts +4 -4
  602. package/templates/CLAUDE.basic.md +6 -6
  603. package/templates/sonar-project.properties +28 -1
  604. package/templates/workflows/ci.yml +16 -82
  605. package/templates/workflows/dependabot-auto-merge.yml +6 -3
  606. package/templates/workflows/github-release.yml +79 -0
  607. package/tsconfig.sonar.json +4 -22
  608. package/prompts/collaboration-workflow/cross-repo-epic.md +0 -5
  609. package/prompts/collaboration-workflow/epic-audit.md +0 -5
  610. package/prompts/collaboration-workflow/epic-bundle.md +0 -5
  611. package/scripts/init/plugin-install-hint.ts +0 -47
  612. package/scripts/version/parse-json.ts +0 -13
  613. /package/scripts/{git → followup}/git-followup-stages.ts +0 -0
  614. /package/scripts/{git → gh}/git-gh-api-path.ts +0 -0
  615. /package/scripts/{git → gh}/git-gh-command.ts +0 -0
  616. /package/scripts/{git → gh}/git-gh-issue.ts +0 -0
  617. /package/scripts/{git → gh}/git-gh-pr-snapshot.ts +0 -0
  618. /package/scripts/{git → gh}/git-gh-reachability.ts +0 -0
  619. /package/scripts/{git → gh}/git-gh-repo.ts +0 -0
  620. /package/scripts/{git → gh}/git-gh-rest-state.ts +0 -0
  621. /package/scripts/{git → gh}/git-pr-checks-watch.ts +0 -0
  622. /package/scripts/{git → gh}/git-pr-error.ts +0 -0
  623. /package/scripts/{git → gh}/git-pr-messages.ts +0 -0
  624. /package/scripts/{git → gh}/github-issue-url.ts +0 -0
  625. /package/scripts/git/{stash-orphans.ts → stash/stash-orphans.ts} +0 -0
  626. /package/scripts/{git → issue}/issue-reference.ts +0 -0
  627. /package/scripts/{git → lib}/animation-helpers.ts +0 -0
  628. /package/scripts/{git → lib}/git-animation.ts +0 -0
  629. /package/scripts/{git → notify}/git-notify.ts +0 -0
  630. /package/scripts/{git → notify}/telegram-test-logic.ts +0 -0
@@ -24,6 +24,8 @@ import { version_targets } from './version-targets'
24
24
  const FAILURE_EXIT_CODE = 1
25
25
  const ALREADY_UP_TO_DATE = 'Already up to date'
26
26
  const NO_QUARANTINE_MINUTES = 0
27
+ // A global install that goes to the network — the same ten minutes `lane-install.ts` gives one.
28
+ const UPGRADE_TIMEOUT_MS = 600_000
27
29
 
28
30
  // What the local minimum-release-age policy permits for one package. Resolved per package because
29
31
  // the newest installable release is a property of that package's own publish history. Returns a hold
@@ -195,8 +197,16 @@ function run_check(config: VersionCommandConfig): void {
195
197
  )
196
198
  }
197
199
 
200
+ // Through `sh -c` because an upgrade command is the user's own configured string — `pnpm add -g …`,
201
+ // or a chain with `&&` — so it is inside the trust boundary and needs a shell to mean what it says.
202
+ // The bound keeps a registry that never answers from holding `josh version` open forever; a timed-out
203
+ // run has no exit code, so it falls through to the failure code like any other failed step.
198
204
  function run_upgrade_command(command: string): number {
199
- const result = execaSync('sh', ['-c', command], { stdio: 'inherit', reject: false })
205
+ const result = execaSync('sh', ['-c', command], {
206
+ stdio: 'inherit',
207
+ reject: false,
208
+ timeout: UPGRADE_TIMEOUT_MS,
209
+ })
200
210
 
201
211
  return result.exitCode ?? FAILURE_EXIT_CODE
202
212
  }
@@ -1,7 +1,7 @@
1
- import { git_gh_exec } from '#scripts/git/git-gh-exec'
1
+ import { git_gh_exec } from '#scripts/gh/git-gh-exec'
2
2
  import { error_text } from '#scripts/lib/error-message'
3
+ import { json_value } from '#scripts/lib/json-value'
3
4
  import { npm_registry } from './npm-registry'
4
- import { safe_json_parse } from './parse-json'
5
5
  import { release_age } from './release-age'
6
6
 
7
7
  // Enough history to reach past a quarantine window into the newest release that has aged out of it.
@@ -68,7 +68,7 @@ function read_github_release_times(versions_endpoint: string): Record<string, st
68
68
  const endpoint = with_page_size(versions_endpoint, TIMES_PAGE_SIZE)
69
69
  const stdout = git_gh_exec.read_gh_api_sync({ path: endpoint, jq_filter: TIMES_JQ })
70
70
  if (stdout === undefined) return undefined
71
- const parsed = release_age.release_times_schema.safeParse(safe_json_parse(stdout))
71
+ const parsed = release_age.release_times_schema.safeParse(json_value.parse_or_undefined(stdout))
72
72
 
73
73
  return parsed.success ? parsed.data : undefined
74
74
  }
@@ -1,8 +1,8 @@
1
1
  import path from 'node:path'
2
+ import { json_value } from '#scripts/lib/json-value'
2
3
  import { file_reader } from '#scripts/lib/read-file'
3
4
  import { package_version_schema, pnpm_ls_global_schema } from '#scripts/lib/schemas'
4
5
  import { execaSync } from 'execa'
5
- import { safe_json_parse } from './parse-json'
6
6
 
7
7
  const NODE_MODULES = 'node_modules'
8
8
  const PACKAGE_JSON = 'package.json'
@@ -15,7 +15,7 @@ function build_pnpm_ls_arguments(package_name: string): Array<string> {
15
15
  // Read the globally installed version from `pnpm ls -g --json` output. Returns undefined when
16
16
  // the package is absent or the output cannot be parsed (e.g. pnpm missing, empty stdout).
17
17
  function parse_global_version(stdout: string, package_name: string): string | undefined {
18
- const parsed = pnpm_ls_global_schema.safeParse(safe_json_parse(stdout))
18
+ const parsed = pnpm_ls_global_schema.safeParse(json_value.parse_or_undefined(stdout))
19
19
  if (!parsed.success) return undefined
20
20
 
21
21
  return parsed.data[0]?.dependencies?.[package_name]?.version
@@ -25,7 +25,7 @@ function parse_global_version(stdout: string, package_name: string): string | un
25
25
  // file is missing (raw is undefined) or malformed.
26
26
  function parse_project_version(raw: string | undefined): string | undefined {
27
27
  if (raw === undefined) return undefined
28
- const parsed = package_version_schema.safeParse(safe_json_parse(raw))
28
+ const parsed = package_version_schema.safeParse(json_value.parse_or_undefined(raw))
29
29
 
30
30
  return parsed.success ? parsed.data.version : undefined
31
31
  }
@@ -61,7 +61,7 @@ function read_workspace_version(cwd: string): string | undefined {
61
61
  // `📦 project version: <v>` for the end of a workflow. Both are gone (joshuafolkken/kit#1486): a
62
62
  // child no longer bumps, so the local manifest names the *previous* release rather than what the run
63
63
  // ships, and every caller now prints the count of unreleased merges instead
64
- // (`scripts/git/git-followup-pending.ts`). Removed rather than left unused, so nothing reaches for
64
+ // (`scripts/followup/git-followup-pending.ts`). Removed rather than left unused, so nothing reaches for
65
65
  // the misleading reading again.
66
66
 
67
67
  const version_targets = {
@@ -1,8 +1,8 @@
1
1
  # Project instructions
2
2
 
3
- - 既存のファイルと利用者の設定を尊重し、変更する前に内容を確認する。
4
- - 変更には検証を付け、実行した結果を報告する。
5
- - HTML、CSS、JavaScript のファイルがある場合は Prettier で整形する。
6
- - 画面に見える変更をした場合はブラウザーで表示と操作を確認する。
7
- - JavaScript または TypeScript の動作を変更した場合は、その動作を確認する自動テストを追加する。
8
- - Git や GitHub を使う場合だけ、それぞれのワークフローを利用する。
3
+ - Respect existing files and the user's settings, and read a file's contents before changing it.
4
+ - Verify every change, and report the results you actually observed.
5
+ - Format HTML, CSS and JavaScript files with Prettier when the project has any.
6
+ - After a change that is visible on screen, check its display and interaction in a browser.
7
+ - After changing JavaScript or TypeScript behavior, add an automated test that checks that behavior.
8
+ - Use the Git or GitHub workflow only when you use Git or GitHub.
@@ -24,7 +24,11 @@ sonar.exclusions=.claude/**,scripts/**
24
24
  # tooling. A `*-file` flag takes a path the developer typed on their own command
25
25
  # line — the same trust level as the command itself — so there is no untrusted
26
26
  # input boundary for the taint analysis to protect, exactly as with S4036.
27
- sonar.issue.ignore.multicriteria=e1,e2,e3,e4,e5,e6,e7,e8
27
+ #
28
+ # Suppress "await inside a loop" (S9382) everywhere. ESLint's `no-await-in-loop` reports the same
29
+ # pattern in the local gate, and each intentional sequential await carries its reason on an
30
+ # `eslint-disable-next-line` comment — which SonarJS does not read — so ESLint is the single gate.
31
+ sonar.issue.ignore.multicriteria=e1,e2,e3,e4,e5,e6,e7,e8,e9,e10,e11,e12,e13,e14
28
32
  sonar.issue.ignore.multicriteria.e1.ruleKey=typescript:S4036
29
33
  sonar.issue.ignore.multicriteria.e1.resourceKey=scripts/**/*
30
34
  sonar.issue.ignore.multicriteria.e2.ruleKey=typescript:S4036
@@ -41,6 +45,29 @@ sonar.issue.ignore.multicriteria.e7.ruleKey=jssecurity:S8707
41
45
  sonar.issue.ignore.multicriteria.e7.resourceKey=scripts/**/*
42
46
  sonar.issue.ignore.multicriteria.e8.ruleKey=jssecurity:S8707
43
47
  sonar.issue.ignore.multicriteria.e8.resourceKey=scripts-ai/**/*
48
+ # Suppress "async function without await" (S7503) everywhere. The shared ESLint
49
+ # config enforces `@typescript-eslint/promise-function-async`, so a function that
50
+ # returns a Promise must be `async` even when it has nothing to await; that is why
51
+ # it turns `require-await` off, and S7503 is the same rule under another name —
52
+ # the two cannot both hold.
53
+ sonar.issue.ignore.multicriteria.e9.ruleKey=typescript:S7503
54
+ sonar.issue.ignore.multicriteria.e9.resourceKey=**/*
55
+ sonar.issue.ignore.multicriteria.e10.ruleKey=javascript:S7503
56
+ sonar.issue.ignore.multicriteria.e10.resourceKey=**/*
57
+ # Suppress "prefer Number static properties" (S7773) everywhere. It asks for
58
+ # `Number.NaN`, while the unicorn recommended preset the shared ESLint config
59
+ # enforces asks for the opposite (`prefer-global-number-constants`: `NaN` over
60
+ # `Number.NaN`) — the two cannot both hold. The rest of what S7773 covers
61
+ # (`Number.parseInt`, `Number.isNaN`, …) is already enforced by
62
+ # `unicorn/prefer-number-properties`.
63
+ sonar.issue.ignore.multicriteria.e11.ruleKey=typescript:S7773
64
+ sonar.issue.ignore.multicriteria.e11.resourceKey=**/*
65
+ sonar.issue.ignore.multicriteria.e12.ruleKey=javascript:S7773
66
+ sonar.issue.ignore.multicriteria.e12.resourceKey=**/*
67
+ sonar.issue.ignore.multicriteria.e13.ruleKey=typescript:S9382
68
+ sonar.issue.ignore.multicriteria.e13.resourceKey=**/*
69
+ sonar.issue.ignore.multicriteria.e14.ruleKey=javascript:S9382
70
+ sonar.issue.ignore.multicriteria.e14.resourceKey=**/*
44
71
 
45
72
  # Files to exclude from the duplicate check.
46
73
  # Snapshot files (.snap) contain machine-generated repetitive patterns and are not authored code.
@@ -29,12 +29,11 @@ concurrency:
29
29
  # list (e.g. `chromium firefox webkit`) instead of editing this file, which josh sync overwrites.
30
30
  env:
31
31
  JOSH_PLAYWRIGHT_BROWSERS: ${{ vars.JOSH_PLAYWRIGHT_BROWSERS || 'chromium' }}
32
- # The safe-chain release every "Setup safe-chain" step installs, and the SHA-256 of that release's
33
- # install-safe-chain.sh. The installer puts the safe-chain binary under ~/.safe-chain/bin and
34
- # adds it to PATH beside the shims; `pnpm dlx … setup-ci` left only the shims, which then let
35
- # every install through without a scan (joshuafolkken/kit#2711). `josh latest` moves both together.
36
- SAFE_CHAIN_INSTALLER_VERSION: 1.5.20
37
- SAFE_CHAIN_INSTALLER_SHA256: 0ad25efe15d1fa56105157a454d647223e78eb0c53d1f85e3d10afcd722e7bfd
32
+
33
+ # Every job that needs pnpm prepares it through `.github/actions/setup-pnpm`, which `josh sync`
34
+ # writes beside this file: the pnpm version resolution, the store cache, the hash-verified safe-chain
35
+ # installer and the install. kit's own `ci.yml` calls the same action, so the path a consumer runs is
36
+ # the path kit runs (joshuafolkken/kit#3095).
38
37
 
39
38
  jobs:
40
39
  playwright-image:
@@ -126,37 +125,11 @@ jobs:
126
125
  persist-credentials: false
127
126
 
128
127
  - name: Setup Node.js
129
- uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
130
- with:
131
- node-version: '24'
128
+ uses: ./.github/actions/setup-node
132
129
 
133
130
  - name: Configure GitHub Packages authentication for existing projects
134
131
  run: printf '//npm.pkg.github.com/:_authToken=${NODE_AUTH_TOKEN}\n' >> "$HOME/.npmrc"
135
132
 
136
- - name: Resolve pnpm version
137
- id: pnpm-version
138
- run: |
139
- version=$(node -p "const m = require('./package.json'); m.packageManager?.match(/^pnpm@([^+]+)/)?.[1] ?? (m.devEngines?.packageManager?.name === 'pnpm' ? m.devEngines.packageManager.version?.split('+')[0] : 'latest') ?? 'latest'")
140
- test -n "$version"
141
- echo "version=$version" >> "$GITHUB_OUTPUT"
142
-
143
- - name: Setup pnpm
144
- uses: pnpm/setup@fbda4c85fc2e1e08721cd8763afea8f48d60f024 # v3.0.0
145
- with:
146
- version: ${{ steps.pnpm-version.outputs.version }}
147
- install: false
148
-
149
- - name: Resolve pnpm store path
150
- run: echo "PNPM_STORE_PATH=$(pnpm store path)" >> "$GITHUB_ENV"
151
-
152
- - name: Setup pnpm store cache
153
- uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
154
- with:
155
- path: ${{ env.PNPM_STORE_PATH }}
156
- key: ${{ runner.os }}-pnpm-store-${{ hashFiles('pnpm-lock.yaml') }}
157
- restore-keys: |
158
- ${{ runner.os }}-pnpm-store-
159
-
160
133
  - name: Setup ESLint cache
161
134
  uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
162
135
  id: eslint-cache
@@ -188,17 +161,10 @@ jobs:
188
161
  ${{ runner.os }}-cspell-cache-${{ hashFiles('pnpm-lock.yaml') }}-
189
162
  ${{ runner.os }}-cspell-cache-
190
163
 
191
- - name: Setup safe-chain
192
- run: |
193
- installer="$RUNNER_TEMP/install-safe-chain.sh"
194
- curl --proto '=https' -fsSL "https://github.com/AikidoSec/safe-chain/releases/download/$SAFE_CHAIN_INSTALLER_VERSION/install-safe-chain.sh" -o "$installer"
195
- echo "$SAFE_CHAIN_INSTALLER_SHA256 $installer" | sha256sum -c -
196
- sh "$installer" --ci
197
-
198
- - name: Install dependencies
199
- env:
200
- NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
201
- run: pnpm install --frozen-lockfile --ignore-scripts
164
+ - name: Setup pnpm and install dependencies
165
+ uses: ./.github/actions/setup-pnpm
166
+ with:
167
+ node-auth-token: ${{ secrets.GITHUB_TOKEN }}
202
168
 
203
169
  # A `basic` project has no `prepare`, no build and no SvelteKit, so the ordered steps below
204
170
  # would fail on its first pull request (joshuafolkken/kit#2814). The profile is read from
@@ -399,37 +365,11 @@ jobs:
399
365
  persist-credentials: false
400
366
 
401
367
  - name: Setup Node.js
402
- uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
403
- with:
404
- node-version: '24'
368
+ uses: ./.github/actions/setup-node
405
369
 
406
370
  - name: Configure GitHub Packages authentication for existing projects
407
371
  run: printf '//npm.pkg.github.com/:_authToken=${NODE_AUTH_TOKEN}\n' >> "$HOME/.npmrc"
408
372
 
409
- - name: Resolve pnpm version
410
- id: pnpm-version
411
- run: |
412
- version=$(node -p "const m = require('./package.json'); m.packageManager?.match(/^pnpm@([^+]+)/)?.[1] ?? (m.devEngines?.packageManager?.name === 'pnpm' ? m.devEngines.packageManager.version?.split('+')[0] : 'latest') ?? 'latest'")
413
- test -n "$version"
414
- echo "version=$version" >> "$GITHUB_OUTPUT"
415
-
416
- - name: Setup pnpm
417
- uses: pnpm/setup@fbda4c85fc2e1e08721cd8763afea8f48d60f024 # v3.0.0
418
- with:
419
- version: ${{ steps.pnpm-version.outputs.version }}
420
- install: false
421
-
422
- - name: Resolve pnpm store path
423
- run: echo "PNPM_STORE_PATH=$(pnpm store path)" >> "$GITHUB_ENV"
424
-
425
- - name: Setup pnpm store cache
426
- uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
427
- with:
428
- path: ${{ env.PNPM_STORE_PATH }}
429
- key: ${{ runner.os }}-pnpm-store-${{ hashFiles('pnpm-lock.yaml') }}
430
- restore-keys: |
431
- ${{ runner.os }}-pnpm-store-
432
-
433
373
  - name: Setup build cache
434
374
  uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
435
375
  id: build-cache
@@ -441,17 +381,10 @@ jobs:
441
381
  ${{ runner.os }}-build-cache-e2e-${{ hashFiles('pnpm-lock.yaml') }}-
442
382
  ${{ runner.os }}-build-cache-e2e-
443
383
 
444
- - name: Setup safe-chain
445
- run: |
446
- installer="$RUNNER_TEMP/install-safe-chain.sh"
447
- curl --proto '=https' -fsSL "https://github.com/AikidoSec/safe-chain/releases/download/$SAFE_CHAIN_INSTALLER_VERSION/install-safe-chain.sh" -o "$installer"
448
- echo "$SAFE_CHAIN_INSTALLER_SHA256 $installer" | sha256sum -c -
449
- sh "$installer" --ci
450
-
451
- - name: Install dependencies
452
- env:
453
- NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
454
- run: pnpm install --frozen-lockfile --ignore-scripts
384
+ - name: Setup pnpm and install dependencies
385
+ uses: ./.github/actions/setup-pnpm
386
+ with:
387
+ node-auth-token: ${{ secrets.GITHUB_TOKEN }}
455
388
 
456
389
  # --ignore-scripts suppresses the install-time `prepare`, so generated framework
457
390
  # files never appear. Playwright >= 1.62 hard-throws when a tsconfig `extends`
@@ -679,6 +612,7 @@ jobs:
679
612
  needs.e2e-detect.result == 'success' &&
680
613
  (needs.e2e.result == 'success' || needs.e2e.result == 'skipped')
681
614
  runs-on: ubuntu-latest
615
+ timeout-minutes: 5
682
616
  permissions:
683
617
  contents: write
684
618
  steps:
@@ -27,6 +27,7 @@ jobs:
27
27
  # what stays restricted to Dependabot's own events, on the step below.
28
28
  auto-merge:
29
29
  runs-on: ubuntu-latest
30
+ timeout-minutes: 10
30
31
  if: github.event.pull_request.user.login == 'dependabot[bot]'
31
32
  steps:
32
33
  # Whether the pull request touches a workflow some upstream package overwrites. Decided from
@@ -50,8 +51,10 @@ jobs:
50
51
  #
51
52
  # Everything comes from the API, so no checkout is needed. `--paginate` is what makes the file
52
53
  # list complete rather than the first page of a large diff, and the `select` narrows it to
53
- # workflows inside `--jq` rather than through `grep`: the default shell is `bash -e` without
54
- # `pipefail`, so a `gh` failure inside a pipeline would be masked by grep's status, and grep
54
+ # workflows — and the local composite actions under `.github/actions/`, which are stamped and
55
+ # overwritten the same way (joshuafolkken/kit#3013) — inside `--jq` rather than through `grep`:
56
+ # the default shell is `bash -e` without `pipefail`, so a `gh` failure inside a pipeline would
57
+ # be masked by grep's status, and grep
55
58
  # itself answers 1 for "no match" and 2 for "I could not look" — two readings this step must
56
59
  # not conflate, since one of them means "merge it" (joshuafolkken/kit#844). An assignment
57
60
  # carries the command's status, and `case` has no failure mode at all.
@@ -88,7 +91,7 @@ jobs:
88
91
  GH_TOKEN: ${{ github.token }}
89
92
  run: |
90
93
  changed="$(gh api "repos/$REPOSITORY/pulls/$PR_NUMBER/files" --paginate \
91
- --jq '.[] | select(.filename | startswith(".github/workflows/"))
94
+ --jq '.[] | select(.filename | startswith(".github/workflows/") or startswith(".github/actions/"))
92
95
  | [.filename, .contents_url] | @tsv')"
93
96
 
94
97
  has_managed=false
@@ -0,0 +1,79 @@
1
+ name: GitHub Release
2
+
3
+ # Creates the GitHub Release, with notes generated from `.github/release.yml`, for each tag
4
+ # `josh release` cuts (joshuafolkken/kit#3007). A repository with a Publish workflow gets its release
5
+ # once that workflow has succeeded for the tag; one without it gets the release when auto-tag.yml
6
+ # announces the tag. kit's own release is the `create-release` job of its publish.yml, which runs the
7
+ # same `josh release:github`, so this file is distributed but never runs in kit.
8
+ on:
9
+ workflow_run:
10
+ workflows: [Publish]
11
+ types: [completed]
12
+ repository_dispatch:
13
+ types: [new-tag-created]
14
+
15
+ # Deliberately no `concurrency` block: a later tag waits inside `josh release:github` for the lower
16
+ # tag's release, so serializing the runs would leave the later run holding the slot the lower one needs.
17
+
18
+ jobs:
19
+ release:
20
+ # The Publish run is titled `Publish <tag>`; its head branch is not the tag when it was started by
21
+ # repository_dispatch, so the title is where the tag is read from.
22
+ if: >-
23
+ (github.event_name == 'workflow_run' && github.event.workflow_run.conclusion == 'success' &&
24
+ startsWith(github.event.workflow_run.display_title, 'Publish v')) ||
25
+ github.event_name == 'repository_dispatch'
26
+ runs-on: ubuntu-latest
27
+ timeout-minutes: 65
28
+ permissions:
29
+ actions: read
30
+ contents: write
31
+ packages: read
32
+ steps:
33
+ - name: Checkout code
34
+ uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
35
+ with:
36
+ fetch-depth: 0
37
+ persist-credentials: false
38
+
39
+ # A repository with a Publish workflow is released from the workflow_run above, after its
40
+ # publication, so the tag announcement is left alone there and one tag never starts two releases.
41
+ - name: Select release tag
42
+ id: release
43
+ env:
44
+ EVENT_NAME: ${{ github.event_name }}
45
+ RUN_TITLE: ${{ github.event.workflow_run.display_title }}
46
+ RUN_WORKFLOW: ${{ github.event.workflow_run.workflow_id }}
47
+ DISPATCH_TAG: ${{ github.event.client_payload.tag }}
48
+ run: |
49
+ if [ "$EVENT_NAME" = workflow_run ]; then
50
+ echo "tag=${RUN_TITLE#Publish }" >> "$GITHUB_OUTPUT"
51
+ echo "workflow=$RUN_WORKFLOW" >> "$GITHUB_OUTPUT"
52
+ elif [ -f .github/workflows/publish.yml ]; then
53
+ echo "ℹ️ publish.yml releases this tag once it has published, skipping"
54
+ else
55
+ echo "tag=$DISPATCH_TAG" >> "$GITHUB_OUTPUT"
56
+ fi
57
+
58
+ - name: Setup Node.js
59
+ if: steps.release.outputs.tag != ''
60
+ uses: ./.github/actions/setup-node
61
+
62
+ - name: Configure GitHub Packages authentication for existing projects
63
+ if: steps.release.outputs.tag != ''
64
+ run: printf '//npm.pkg.github.com/:_authToken=${NODE_AUTH_TOKEN}\n' >> "$HOME/.npmrc"
65
+
66
+ - name: Setup pnpm and install dependencies
67
+ if: steps.release.outputs.tag != ''
68
+ uses: ./.github/actions/setup-pnpm
69
+ with:
70
+ node-auth-token: ${{ secrets.GITHUB_TOKEN }}
71
+ cache: 'false'
72
+
73
+ - name: Publish GitHub Release
74
+ if: steps.release.outputs.tag != ''
75
+ run: pnpm josh release:github
76
+ env:
77
+ GH_TOKEN: ${{ github.token }}
78
+ RELEASE_TAG: ${{ steps.release.outputs.tag }}
79
+ RELEASE_WORKFLOW: ${{ steps.release.outputs.workflow }}
@@ -1,29 +1,11 @@
1
1
  {
2
+ "extends": "@joshuafolkken/kit/tsconfig/base",
2
3
  "compilerOptions": {
3
- "target": "ES2020",
4
- "module": "ES2020",
5
- "lib": ["ES2020", "DOM", "DOM.Iterable"],
6
- "moduleResolution": "node",
7
- "allowImportingTsExtensions": false,
4
+ "target": "ES2022",
5
+ "lib": ["ES2023", "DOM", "DOM.Iterable"],
6
+ "types": ["node"],
8
7
  "allowJs": true,
9
8
  "checkJs": true,
10
- "esModuleInterop": true,
11
- "forceConsistentCasingInFileNames": true,
12
- "resolveJsonModule": true,
13
- "skipLibCheck": true,
14
- "sourceMap": true,
15
- "strict": true,
16
- "noUncheckedIndexedAccess": true,
17
- "noImplicitOverride": true,
18
- "noUnusedLocals": true,
19
- "noUnusedParameters": true,
20
- "exactOptionalPropertyTypes": true,
21
- "noFallthroughCasesInSwitch": true,
22
- "noImplicitReturns": true,
23
- "noPropertyAccessFromIndexSignature": true,
24
- "allowUnusedLabels": false,
25
- "allowUnreachableCode": false,
26
- "isolatedModules": true,
27
9
  "paths": {
28
10
  "$lib": ["./src/lib"],
29
11
  "$lib/*": ["./src/lib/*"]
@@ -1,5 +0,0 @@
1
- ## リポジトリをまたぐ EPIC
2
-
3
- **この規則の単一ソースは `.claude/skills/epic-commands/SKILL.md` → "Epics that span repositories" である。** 子の書き方、owner の制限、自動クローズ、公開の完了を待つ依存、配布物を持たない repo、実行のディスパッチ、`owner/repo#N` での参照はすべてそこにある。
4
-
5
- 経緯(公開待ちが要る理由、joshuafolkken/kit#1129)は [`docs/maintainers/epic-commands-rationale.md`](../../docs/maintainers/epic-commands-rationale.md) にある。
@@ -1,5 +0,0 @@
1
- ## `josh epic:audit` — 子 Issue 群を横断して矛盾を検出する
2
-
3
- **この規則の単一ソースは `.claude/skills/epic-commands/SKILL.md` → "`josh epic:audit <E>` — contradictions across the children" である。** 検査表、警告とエラーの区別、片方が closed の組を警告に降格する規則、孤児検索の 2 つの結果、Tier A の修正、計画時の波及先の点検はすべてそこにある。
4
-
5
- 経緯(joshuafolkken/kit#858 の監査で見つかった矛盾と波及漏れ、joshuafolkken/kit#1010)は [`docs/maintainers/epic-commands-rationale.md`](../../docs/maintainers/epic-commands-rationale.md) にある。
@@ -1,5 +0,0 @@
1
- ## 後から関連が判明した Issue を epic に束ねる
2
-
3
- **この規則の単一ソースは `.claude/skills/epic-commands/SKILL.md` → "`josh epic:bundle <N>` — does this new issue belong with one already filed?" である。** 発火点、強い信号、候補探索の範囲、決定木、所属先の記録、順序の記録、起票前の `issue:scout` はすべてそこにある。レビュー上限で切り出す後追い Issue の起票と答えへの対応は `prompts/review.md` → "Three-way disposition after the cap" が単一ソースである。
4
-
5
- 経緯(joshuafolkken/kit#943 / #946 / #947 の取りこぼし、CI 待ちに起票を置く根拠の計測)は [`docs/maintainers/epic-commands-rationale.md`](../../docs/maintainers/epic-commands-rationale.md) にある。
@@ -1,47 +0,0 @@
1
- import { readdirSync } from 'node:fs'
2
- import os from 'node:os'
3
- import path from 'node:path'
4
- import { claude_plugin_config } from './claude-plugin-config'
5
-
6
- // `josh init` / `josh sync` declare the kit plugin in the consumer's `.claude/settings.json`, but the
7
- // CLI does not install it from the declaration alone — a consumer runs `claude plugin install kit@kit`
8
- // once (joshuafolkken/kit#1930). Nothing said so at the end of init or sync, so a consumer whose
9
- // skills silently never loaded had no pointer to the one command that fixes it. This prints that
10
- // command on completion, unless the plugin already appears installed.
11
-
12
- const PLUGINS_SUBDIR = path.join('.claude', 'plugins')
13
-
14
- // Best effort: Claude Code records installed marketplaces under `~/.claude/plugins`. The kit
15
- // marketplace directory being present is the strongest signal available at the shell; the plugin's
16
- // enabled state is not readable here, so an uncertain read (no directory, no permission) counts as
17
- // "not installed". A hint shown once too often costs a line; one never shown costs a consumer its skills.
18
- function is_plugin_installed(home_directory: string = os.homedir()): boolean {
19
- try {
20
- return readdirSync(path.join(home_directory, PLUGINS_SUBDIR)).some(
21
- (entry) =>
22
- entry === claude_plugin_config.MARKETPLACE_NAME ||
23
- entry.startsWith(`${claude_plugin_config.MARKETPLACE_NAME}@`),
24
- )
25
- } catch {
26
- return false
27
- }
28
- }
29
-
30
- function plugin_install_hint(is_installed: boolean): string | undefined {
31
- if (is_installed) return undefined
32
-
33
- return ` ℹ Skills load from the kit plugin. If they are missing, run: claude plugin install ${claude_plugin_config.PLUGIN_ID}`
34
- }
35
-
36
- function report_plugin_install_hint(home_directory?: string): void {
37
- const hint = plugin_install_hint(is_plugin_installed(home_directory))
38
- if (hint !== undefined) console.info(hint)
39
- }
40
-
41
- const plugin_install_hint_module = {
42
- is_plugin_installed,
43
- plugin_install_hint,
44
- report_plugin_install_hint,
45
- }
46
-
47
- export { plugin_install_hint_module }
@@ -1,13 +0,0 @@
1
- // Parse JSON without throwing: returns the parsed value, or undefined when the input is not valid
2
- // JSON. Single source for the version commands that read package.json / CLI output and hand the
3
- // result to a schema's `safeParse` (running-binary, version-targets, effective-upstream), so the
4
- // permissive-parse behavior is defined once rather than re-cloned per reader.
5
- function safe_json_parse(raw: string): unknown {
6
- try {
7
- return JSON.parse(raw)
8
- } catch {
9
- return undefined
10
- }
11
- }
12
-
13
- export { safe_json_parse }
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes