@joshuafolkken/kit 1.872.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 (1108) hide show
  1. package/.claude/.claude-plugin/plugin.json +11 -0
  2. package/.claude/settings.json +110 -0
  3. package/.claude/skills/dependency-update/SKILL.md +76 -0
  4. package/.claude/skills/epic-commands/SKILL.md +463 -0
  5. package/.claude/skills/verify-ui/SKILL.md +96 -0
  6. package/.claude/skills/workflow-commands/SKILL.md +265 -0
  7. package/.claude/skills/workflow-commands/background-commands.md +130 -0
  8. package/.claude/skills/workflow-commands/backlogrun-child.md +364 -0
  9. package/.claude/skills/workflow-commands/backlogrun-lanes.md +345 -0
  10. package/.claude/skills/workflow-commands/backlogrun-park.md +179 -0
  11. package/.claude/skills/workflow-commands/backlogrun-progress.md +600 -0
  12. package/.claude/skills/workflow-commands/backlogrun-steps.md +604 -0
  13. package/.claude/skills/workflow-commands/backlogrun.md +109 -0
  14. package/.claude/skills/workflow-commands/chain-rule.md +98 -0
  15. package/.claude/skills/workflow-commands/delegation.md +52 -0
  16. package/.claude/skills/workflow-commands/followup-reference.md +118 -0
  17. package/.claude/skills/workflow-commands/followup.md +222 -0
  18. package/.claude/skills/workflow-commands/fullrun-steps.md +93 -0
  19. package/.claude/skills/workflow-commands/fullrun.md +82 -0
  20. package/.claude/skills/workflow-commands/halfrun.md +73 -0
  21. package/.claude/skills/workflow-commands/into-target.md +48 -0
  22. package/.claude/skills/workflow-commands/issue-comments.md +109 -0
  23. package/.claude/skills/workflow-commands/issue-fold-existing.md +27 -0
  24. package/.claude/skills/workflow-commands/issue-scout.md +45 -0
  25. package/.claude/skills/workflow-commands/kickoff.md +82 -0
  26. package/.claude/skills/workflow-commands/latest-gate.md +85 -0
  27. package/.claude/skills/workflow-commands/needs-human-review.md +64 -0
  28. package/.claude/skills/workflow-commands/observation-filing.md +349 -0
  29. package/.claude/skills/workflow-commands/pre-gate-cut.md +340 -0
  30. package/.claude/skills/workflow-commands/prerequisite.md +62 -0
  31. package/.claude/skills/workflow-commands/retrospective.md +81 -0
  32. package/.claude/skills/workflow-commands/rule-residency.md +267 -0
  33. package/.claude/skills/workflow-commands/split-assessment.md +130 -0
  34. package/.claude/skills/workflow-commands/target-repository.md +58 -0
  35. package/.claude/skills/workflow-commands/working-tree-hold.md +66 -0
  36. package/.claude-plugin/marketplace.json +15 -0
  37. package/.coderabbit.yaml +50 -0
  38. package/.codex/config.toml +8 -0
  39. package/.codex/hooks.json +71 -0
  40. package/.cursorrules +45 -0
  41. package/.gitattributes +7 -0
  42. package/.github/dependabot.yml +19 -0
  43. package/.github/pull_request_template.md +1 -0
  44. package/.github/release.yml +18 -0
  45. package/.github/workflows/auto-tag.yml +111 -0
  46. package/.github/workflows/ci.yml +681 -0
  47. package/.github/workflows/dependabot-auto-merge.yml +55 -0
  48. package/.github/workflows/production.yml +47 -0
  49. package/.github/workflows/publish.yml +39 -0
  50. package/.github/workflows/sonar-qube.yml +34 -0
  51. package/.mcp.json +8 -0
  52. package/.ncurc.json +3 -0
  53. package/.prettierignore +20 -0
  54. package/.vscode/extensions.json +21 -0
  55. package/.vscode/settings.json +41 -0
  56. package/AGENTS.md +29 -0
  57. package/CLAUDE.md +207 -0
  58. package/CODE_OF_CONDUCT.md +132 -0
  59. package/GEMINI.md +30 -0
  60. package/LICENSE +21 -0
  61. package/README.md +41 -0
  62. package/SECURITY.md +34 -0
  63. package/cspell/index.yaml +177 -0
  64. package/dist/CLAUDE.md +207 -0
  65. package/dist/config-merge/index.d.ts +29 -0
  66. package/dist/config-merge/index.js +459 -0
  67. package/dist/hooks/batch-guard.js +28 -0
  68. package/dist/hooks/chunk-25JL6FMS.js +4970 -0
  69. package/dist/hooks/chunk-2ANGT3XM.js +375 -0
  70. package/dist/hooks/chunk-2EI5GBSW.js +42 -0
  71. package/dist/hooks/chunk-2OT5XE2N.js +5014 -0
  72. package/dist/hooks/chunk-2RUPMGGV.js +137 -0
  73. package/dist/hooks/chunk-2XIGZQMQ.js +3299 -0
  74. package/dist/hooks/chunk-33ELOKEV.js +910 -0
  75. package/dist/hooks/chunk-33YRTKM7.js +230 -0
  76. package/dist/hooks/chunk-36JQU5NN.js +77 -0
  77. package/dist/hooks/chunk-3EJBTWVS.js +1769 -0
  78. package/dist/hooks/chunk-3FK5SFAC.js +432 -0
  79. package/dist/hooks/chunk-3PWPYDD2.js +240 -0
  80. package/dist/hooks/chunk-3TQU7TDH.js +375 -0
  81. package/dist/hooks/chunk-3TVLSFZ6.js +432 -0
  82. package/dist/hooks/chunk-3VXYCB4E.js +77 -0
  83. package/dist/hooks/chunk-44M6JXGV.js +3398 -0
  84. package/dist/hooks/chunk-46EEEHC3.js +240 -0
  85. package/dist/hooks/chunk-4A7UVP2P.js +364 -0
  86. package/dist/hooks/chunk-4LFQEZS4.js +137 -0
  87. package/dist/hooks/chunk-4OCX3V2T.js +469 -0
  88. package/dist/hooks/chunk-4OHA5DE7.js +49 -0
  89. package/dist/hooks/chunk-4PMDW3YD.js +68 -0
  90. package/dist/hooks/chunk-4QHBNAI4.js +68 -0
  91. package/dist/hooks/chunk-4SSB3FEE.js +3273 -0
  92. package/dist/hooks/chunk-5A2WQ2CQ.js +5390 -0
  93. package/dist/hooks/chunk-5EVA2JQB.js +5390 -0
  94. package/dist/hooks/chunk-5P7VF5VE.js +3230 -0
  95. package/dist/hooks/chunk-5QWJGGZP.js +49 -0
  96. package/dist/hooks/chunk-5U5EZYG6.js +77 -0
  97. package/dist/hooks/chunk-5VUUF3ZV.js +240 -0
  98. package/dist/hooks/chunk-5WA7UBT3.js +374 -0
  99. package/dist/hooks/chunk-6EBGRQ3Q.js +301 -0
  100. package/dist/hooks/chunk-6TVHWMD3.js +432 -0
  101. package/dist/hooks/chunk-6V5OPIUU.js +13 -0
  102. package/dist/hooks/chunk-6VAGLEMB.js +68 -0
  103. package/dist/hooks/chunk-75BTXKFJ.js +3424 -0
  104. package/dist/hooks/chunk-75RHN67S.js +137 -0
  105. package/dist/hooks/chunk-76KC3BDD.js +3414 -0
  106. package/dist/hooks/chunk-76SLS7CZ.js +898 -0
  107. package/dist/hooks/chunk-7DHZ4DWT.js +5015 -0
  108. package/dist/hooks/chunk-7INSJDGE.js +458 -0
  109. package/dist/hooks/chunk-7VJ4FTDX.js +268 -0
  110. package/dist/hooks/chunk-7XCYNHQK.js +77 -0
  111. package/dist/hooks/chunk-A5YJ3H7E.js +375 -0
  112. package/dist/hooks/chunk-AAEXXUUL.js +268 -0
  113. package/dist/hooks/chunk-ABVEVV2M.js +432 -0
  114. package/dist/hooks/chunk-ACN3YXFL.js +68 -0
  115. package/dist/hooks/chunk-AD3XE3QZ.js +397 -0
  116. package/dist/hooks/chunk-AENFZPZH.js +230 -0
  117. package/dist/hooks/chunk-AFKRFQ6W.js +68 -0
  118. package/dist/hooks/chunk-AHD5IPWI.js +375 -0
  119. package/dist/hooks/chunk-AMK5JGV7.js +77 -0
  120. package/dist/hooks/chunk-ARN7NCQI.js +425 -0
  121. package/dist/hooks/chunk-AUFY653N.js +3425 -0
  122. package/dist/hooks/chunk-AXQBNFEF.js +375 -0
  123. package/dist/hooks/chunk-AYC7R6U4.js +3316 -0
  124. package/dist/hooks/chunk-AYEA2FJ7.js +5015 -0
  125. package/dist/hooks/chunk-B2LIXYFL.js +77 -0
  126. package/dist/hooks/chunk-B4HPNY2I.js +375 -0
  127. package/dist/hooks/chunk-B4YNCUGB.js +469 -0
  128. package/dist/hooks/chunk-B57S3VWT.js +922 -0
  129. package/dist/hooks/chunk-BINZ3PLI.js +364 -0
  130. package/dist/hooks/chunk-BIWLABFK.js +432 -0
  131. package/dist/hooks/chunk-BODUSXKK.js +410 -0
  132. package/dist/hooks/chunk-BQBAT2YK.js +375 -0
  133. package/dist/hooks/chunk-BUJEBW75.js +391 -0
  134. package/dist/hooks/chunk-BVNWORKA.js +72 -0
  135. package/dist/hooks/chunk-BWI47LQS.js +5205 -0
  136. package/dist/hooks/chunk-C25HRMJX.js +137 -0
  137. package/dist/hooks/chunk-CBFZNC74.js +375 -0
  138. package/dist/hooks/chunk-CECYXS4Y.js +3424 -0
  139. package/dist/hooks/chunk-CELGUP5F.js +49 -0
  140. package/dist/hooks/chunk-CMHANU3F.js +3442 -0
  141. package/dist/hooks/chunk-CMN372LI.js +68 -0
  142. package/dist/hooks/chunk-CPGZLMMK.js +3299 -0
  143. package/dist/hooks/chunk-CTQKXDC7.js +268 -0
  144. package/dist/hooks/chunk-CYAT4RIT.js +68 -0
  145. package/dist/hooks/chunk-CYTWYCH2.js +5014 -0
  146. package/dist/hooks/chunk-CZSOLRBA.js +77 -0
  147. package/dist/hooks/chunk-D2PIDYJR.js +3438 -0
  148. package/dist/hooks/chunk-DE57HI6T.js +137 -0
  149. package/dist/hooks/chunk-DGXDGAPG.js +5306 -0
  150. package/dist/hooks/chunk-DNYRSYQG.js +5014 -0
  151. package/dist/hooks/chunk-DTAXH2A2.js +240 -0
  152. package/dist/hooks/chunk-E2IZUWI5.js +375 -0
  153. package/dist/hooks/chunk-E4L2K2BL.js +397 -0
  154. package/dist/hooks/chunk-E55NKX5F.js +68 -0
  155. package/dist/hooks/chunk-ECXVCCVD.js +3079 -0
  156. package/dist/hooks/chunk-EPHO443D.js +68 -0
  157. package/dist/hooks/chunk-EUFK2BI2.js +375 -0
  158. package/dist/hooks/chunk-EYCD5ZAV.js +137 -0
  159. package/dist/hooks/chunk-F2SDYJU4.js +240 -0
  160. package/dist/hooks/chunk-F4B5D5TF.js +68 -0
  161. package/dist/hooks/chunk-FGEO3NDX.js +432 -0
  162. package/dist/hooks/chunk-FJYI52RE.js +137 -0
  163. package/dist/hooks/chunk-FXAKJKTB.js +18 -0
  164. package/dist/hooks/chunk-FYTZHIY4.js +3085 -0
  165. package/dist/hooks/chunk-G7JL2A5K.js +375 -0
  166. package/dist/hooks/chunk-GA3ITDBW.js +42 -0
  167. package/dist/hooks/chunk-GDR4H4SV.js +469 -0
  168. package/dist/hooks/chunk-GFKDXPSM.js +2855 -0
  169. package/dist/hooks/chunk-GIMRTKFU.js +566 -0
  170. package/dist/hooks/chunk-GOPHRLGO.js +240 -0
  171. package/dist/hooks/chunk-GX4HO7SJ.js +230 -0
  172. package/dist/hooks/chunk-GXKKK23T.js +240 -0
  173. package/dist/hooks/chunk-GZ6FUVIK.js +566 -0
  174. package/dist/hooks/chunk-H5HPY5M5.js +2869 -0
  175. package/dist/hooks/chunk-HCF3OGEE.js +1829 -0
  176. package/dist/hooks/chunk-HDEXAOUM.js +469 -0
  177. package/dist/hooks/chunk-HM2TY3TN.js +469 -0
  178. package/dist/hooks/chunk-HOA7NXA2.js +55 -0
  179. package/dist/hooks/chunk-HOFEWH6H.js +240 -0
  180. package/dist/hooks/chunk-HUUI6S5J.js +2669 -0
  181. package/dist/hooks/chunk-I4D3NVUD.js +469 -0
  182. package/dist/hooks/chunk-I4Q6WAJE.js +68 -0
  183. package/dist/hooks/chunk-IB6N4CR2.js +432 -0
  184. package/dist/hooks/chunk-IFLDYJMD.js +469 -0
  185. package/dist/hooks/chunk-IGU466YD.js +77 -0
  186. package/dist/hooks/chunk-IJCQUHKY.js +375 -0
  187. package/dist/hooks/chunk-IKUMBDJB.js +230 -0
  188. package/dist/hooks/chunk-IM3BDIBJ.js +5005 -0
  189. package/dist/hooks/chunk-IMYMAODK.js +3431 -0
  190. package/dist/hooks/chunk-IN2ZVGXA.js +5005 -0
  191. package/dist/hooks/chunk-ITVJ2MKQ.js +18 -0
  192. package/dist/hooks/chunk-J5RIJYTM.js +2669 -0
  193. package/dist/hooks/chunk-JFLMH4K5.js +3460 -0
  194. package/dist/hooks/chunk-JR25IFML.js +77 -0
  195. package/dist/hooks/chunk-JT5AUXFI.js +432 -0
  196. package/dist/hooks/chunk-JY5YVN6N.js +3234 -0
  197. package/dist/hooks/chunk-K5Q4ETVI.js +391 -0
  198. package/dist/hooks/chunk-K67V2F24.js +137 -0
  199. package/dist/hooks/chunk-KABG6AEW.js +3460 -0
  200. package/dist/hooks/chunk-KATZESEC.js +3273 -0
  201. package/dist/hooks/chunk-KFH4H7W7.js +469 -0
  202. package/dist/hooks/chunk-KMUEI6RX.js +910 -0
  203. package/dist/hooks/chunk-KMV4OY77.js +3438 -0
  204. package/dist/hooks/chunk-KQAZNWEY.js +137 -0
  205. package/dist/hooks/chunk-KZZR6JER.js +5015 -0
  206. package/dist/hooks/chunk-LAR6DREP.js +77 -0
  207. package/dist/hooks/chunk-LNCJWEZD.js +5015 -0
  208. package/dist/hooks/chunk-LRYD2GLM.js +6 -0
  209. package/dist/hooks/chunk-LXBKYHDV.js +77 -0
  210. package/dist/hooks/chunk-LYLKIUNE.js +5024 -0
  211. package/dist/hooks/chunk-LZKCFOVC.js +432 -0
  212. package/dist/hooks/chunk-M4FCIYRI.js +77 -0
  213. package/dist/hooks/chunk-M5M7327Q.js +3425 -0
  214. package/dist/hooks/chunk-MF72MHSX.js +3455 -0
  215. package/dist/hooks/chunk-MK56LKDO.js +397 -0
  216. package/dist/hooks/chunk-N3MJADY7.js +240 -0
  217. package/dist/hooks/chunk-NFQSUDBN.js +458 -0
  218. package/dist/hooks/chunk-NHREKY45.js +137 -0
  219. package/dist/hooks/chunk-NP5TTAAW.js +375 -0
  220. package/dist/hooks/chunk-NQTLTKTJ.js +2993 -0
  221. package/dist/hooks/chunk-NVRCZPBZ.js +391 -0
  222. package/dist/hooks/chunk-O46HMMLJ.js +469 -0
  223. package/dist/hooks/chunk-OFJGH2L4.js +240 -0
  224. package/dist/hooks/chunk-OLFMCZH5.js +240 -0
  225. package/dist/hooks/chunk-OMCZS46I.js +49 -0
  226. package/dist/hooks/chunk-OQZEZW5G.js +469 -0
  227. package/dist/hooks/chunk-P2MDAT2Y.js +1897 -0
  228. package/dist/hooks/chunk-P3M2JJIF.js +68 -0
  229. package/dist/hooks/chunk-PDVHQITQ.js +3453 -0
  230. package/dist/hooks/chunk-PNT2AMDH.js +391 -0
  231. package/dist/hooks/chunk-PR2LVSY6.js +3445 -0
  232. package/dist/hooks/chunk-PRR5R4JK.js +137 -0
  233. package/dist/hooks/chunk-PXT44QVN.js +566 -0
  234. package/dist/hooks/chunk-PZLWJLAP.js +469 -0
  235. package/dist/hooks/chunk-Q2FEAZJ2.js +77 -0
  236. package/dist/hooks/chunk-Q32WETDO.js +3265 -0
  237. package/dist/hooks/chunk-Q45DUBLE.js +3600 -0
  238. package/dist/hooks/chunk-Q7NZSWQ5.js +240 -0
  239. package/dist/hooks/chunk-QH2JNAMK.js +3085 -0
  240. package/dist/hooks/chunk-QNNWYQ2R.js +375 -0
  241. package/dist/hooks/chunk-QPU5H2OS.js +68 -0
  242. package/dist/hooks/chunk-QRAHZ5TO.js +1829 -0
  243. package/dist/hooks/chunk-QUZ5HPIE.js +469 -0
  244. package/dist/hooks/chunk-QVCRG34O.js +2893 -0
  245. package/dist/hooks/chunk-R3MY4E3S.js +1675 -0
  246. package/dist/hooks/chunk-R6TXJJXP.js +77 -0
  247. package/dist/hooks/chunk-REJU6VT7.js +1829 -0
  248. package/dist/hooks/chunk-REQAQLRC.js +2993 -0
  249. package/dist/hooks/chunk-RFCXPAHH.js +391 -0
  250. package/dist/hooks/chunk-RHI6Y22X.js +137 -0
  251. package/dist/hooks/chunk-RKZVOBBS.js +469 -0
  252. package/dist/hooks/chunk-RL57TT2Y.js +566 -0
  253. package/dist/hooks/chunk-RORDOD4S.js +3321 -0
  254. package/dist/hooks/chunk-RZKYW5P2.js +77 -0
  255. package/dist/hooks/chunk-SJPJ6VSI.js +391 -0
  256. package/dist/hooks/chunk-SKSIJQQQ.js +432 -0
  257. package/dist/hooks/chunk-SSQDZKXG.js +268 -0
  258. package/dist/hooks/chunk-SSX23SJ2.js +89 -0
  259. package/dist/hooks/chunk-SYHFKE4C.js +77 -0
  260. package/dist/hooks/chunk-TCGNI2ZY.js +42 -0
  261. package/dist/hooks/chunk-TG3WXJF5.js +137 -0
  262. package/dist/hooks/chunk-TH7IJAY5.js +77 -0
  263. package/dist/hooks/chunk-TLZ27PCY.js +240 -0
  264. package/dist/hooks/chunk-U652FXTN.js +566 -0
  265. package/dist/hooks/chunk-UEK47YUF.js +268 -0
  266. package/dist/hooks/chunk-UIO45H3O.js +432 -0
  267. package/dist/hooks/chunk-UNLZEEVH.js +5005 -0
  268. package/dist/hooks/chunk-UNRVF3SZ.js +432 -0
  269. package/dist/hooks/chunk-USLFAFOI.js +3453 -0
  270. package/dist/hooks/chunk-VAEELMLL.js +442 -0
  271. package/dist/hooks/chunk-VALSWLDQ.js +3453 -0
  272. package/dist/hooks/chunk-VC5JEPNY.js +3398 -0
  273. package/dist/hooks/chunk-VEZVK6C7.js +230 -0
  274. package/dist/hooks/chunk-VK5JKFAR.js +49 -0
  275. package/dist/hooks/chunk-VNF2KP7Z.js +469 -0
  276. package/dist/hooks/chunk-VWWCUMW6.js +2669 -0
  277. package/dist/hooks/chunk-W4JARUQV.js +137 -0
  278. package/dist/hooks/chunk-WCYPBPJC.js +5014 -0
  279. package/dist/hooks/chunk-WEOBMNJG.js +2993 -0
  280. package/dist/hooks/chunk-WKJU3J5Y.js +5390 -0
  281. package/dist/hooks/chunk-WMN4TSVF.js +3299 -0
  282. package/dist/hooks/chunk-WNON54PT.js +3469 -0
  283. package/dist/hooks/chunk-WOVKBPPX.js +137 -0
  284. package/dist/hooks/chunk-WRVFORYJ.js +432 -0
  285. package/dist/hooks/chunk-WUBVYGQZ.js +240 -0
  286. package/dist/hooks/chunk-WWULTUOM.js +68 -0
  287. package/dist/hooks/chunk-WXHKKB45.js +4962 -0
  288. package/dist/hooks/chunk-XAI3YTHJ.js +469 -0
  289. package/dist/hooks/chunk-XFZH6JZJ.js +77 -0
  290. package/dist/hooks/chunk-XGPWX6IA.js +137 -0
  291. package/dist/hooks/chunk-XIXXIVGY.js +566 -0
  292. package/dist/hooks/chunk-XKDOYJGA.js +922 -0
  293. package/dist/hooks/chunk-YALTVBHM.js +432 -0
  294. package/dist/hooks/chunk-YEBEPBFK.js +5014 -0
  295. package/dist/hooks/chunk-YI2BQ3DK.js +3441 -0
  296. package/dist/hooks/chunk-YVNBCFGG.js +1829 -0
  297. package/dist/hooks/chunk-YXBN3RGG.js +432 -0
  298. package/dist/hooks/chunk-Z2OOJSW3.js +3163 -0
  299. package/dist/hooks/chunk-ZA3HVBOY.js +2644 -0
  300. package/dist/hooks/chunk-ZKID46U3.js +137 -0
  301. package/dist/hooks/chunk-ZPMU2JV6.js +49 -0
  302. package/dist/hooks/chunk-ZRKY4W7O.js +432 -0
  303. package/dist/hooks/chunk-ZTMRB7LJ.js +268 -0
  304. package/dist/hooks/chunk-ZVPPBQ3L.js +3413 -0
  305. package/dist/hooks/codex-hook-adapter.js +164 -0
  306. package/dist/hooks/duplicate-read-guard.js +29 -0
  307. package/dist/hooks/format-edited.js +37 -0
  308. package/dist/hooks/investigation-guard.js +31 -0
  309. package/dist/hooks/pretool-guard.js +21 -0
  310. package/dist/hooks/session-lang.js +34 -0
  311. package/dist/hooks/stop-guard.js +1597 -0
  312. package/dist/josh.js +1795 -0
  313. package/dist/managed-marker/index.d.ts +10 -0
  314. package/dist/managed-marker/index.js +32 -0
  315. package/dist/self-sync-guard/index.d.ts +10 -0
  316. package/dist/self-sync-guard/index.js +49 -0
  317. package/dist/version/index.d.ts +93 -0
  318. package/dist/version/index.js +1024 -0
  319. package/env/index.d.ts +7 -0
  320. package/env/index.js +62 -0
  321. package/eslint/base.js +233 -0
  322. package/eslint/checkout-rooted-parser.js +34 -0
  323. package/eslint/config-fingerprint.js +103 -0
  324. package/eslint/rules/code-quality.js +292 -0
  325. package/eslint/rules/english-only-prose.js +135 -0
  326. package/eslint/rules/formatting.js +44 -0
  327. package/eslint/rules/import.js +83 -0
  328. package/eslint/rules/namespace-object-export.js +107 -0
  329. package/eslint/rules/naming-convention.js +109 -0
  330. package/eslint/rules/promise.js +17 -0
  331. package/eslint/rules/sonarjs.js +45 -0
  332. package/eslint/rules/test-filename.js +91 -0
  333. package/eslint/rules/typescript.js +186 -0
  334. package/eslint/rules/unicorn.js +191 -0
  335. package/eslint/vanilla.js +1 -0
  336. package/evals/scenarios/consult-not-execute.json +20 -0
  337. package/evals/scenarios/no-implicit-workflow.json +26 -0
  338. package/evals/scenarios/overrides-both-locations.json +29 -0
  339. package/evals/scenarios/upstream-interrupt.json +23 -0
  340. package/evals/scenarios/workflow-skill-loaded.json +16 -0
  341. package/lefthook/base.yml +131 -0
  342. package/lefthook/vanilla.yml +7 -0
  343. package/package.json +169 -0
  344. package/playwright.config.ts +160 -0
  345. package/pnpm-workspace.yaml +41 -0
  346. package/ports/index.d.ts +17 -0
  347. package/ports/index.js +256 -0
  348. package/prettier/index.d.ts +3 -0
  349. package/prettier/index.js +31 -0
  350. package/prompts/agent-lint-protocol.json +79 -0
  351. package/prompts/agent-rules.md +63 -0
  352. package/prompts/coding-standards.md +382 -0
  353. package/prompts/collaboration-workflow/consultation-vs-execution.md +8 -0
  354. package/prompts/collaboration-workflow/cross-repo-epic.md +54 -0
  355. package/prompts/collaboration-workflow/distributed-docs.md +7 -0
  356. package/prompts/collaboration-workflow/durable-rules.md +24 -0
  357. package/prompts/collaboration-workflow/epic-audit.md +56 -0
  358. package/prompts/collaboration-workflow/epic-bundle.md +109 -0
  359. package/prompts/collaboration-workflow/file-edits.md +124 -0
  360. package/prompts/collaboration-workflow/gh-rest.md +57 -0
  361. package/prompts/collaboration-workflow/issue-citation.md +38 -0
  362. package/prompts/collaboration-workflow/issue-template.md +190 -0
  363. package/prompts/collaboration-workflow/latest-first.md +14 -0
  364. package/prompts/collaboration-workflow/no-clones.md +11 -0
  365. package/prompts/collaboration-workflow/operating-rules.md +123 -0
  366. package/prompts/collaboration-workflow/output-bounds.md +107 -0
  367. package/prompts/collaboration-workflow/overview.md +35 -0
  368. package/prompts/collaboration-workflow/plan-comment.md +85 -0
  369. package/prompts/collaboration-workflow/proposal-request.md +23 -0
  370. package/prompts/collaboration-workflow/report-format.md +206 -0
  371. package/prompts/collaboration-workflow/residency.md +94 -0
  372. package/prompts/collaboration-workflow/rule-delivery.md +146 -0
  373. package/prompts/collaboration-workflow/shell-body.md +82 -0
  374. package/prompts/collaboration-workflow/simplicity-first.md +9 -0
  375. package/prompts/collaboration-workflow/single-source-rules.md +13 -0
  376. package/prompts/collaboration-workflow/turn-batching.md +137 -0
  377. package/prompts/collaboration-workflow/upstream-interrupt.md +51 -0
  378. package/prompts/collaboration-workflow/wip-cap.md +118 -0
  379. package/prompts/collaboration-workflow.md +52 -0
  380. package/prompts/refactoring.md +103 -0
  381. package/prompts/review-rubric.md +338 -0
  382. package/prompts/review.md +217 -0
  383. package/prompts/sonar-hotspot-handling.md +77 -0
  384. package/prompts/testing-guide.md +277 -0
  385. package/scripts/adopt/adopt-logic.ts +107 -0
  386. package/scripts/adopt/adopt-toolkits.ts +181 -0
  387. package/scripts/adopt/adopt.ts +171 -0
  388. package/scripts/agent/agent-argv.ts +140 -0
  389. package/scripts/agent/agent-diagnostics.ts +120 -0
  390. package/scripts/agent/agent-event.ts +173 -0
  391. package/scripts/agent/agent-exit-record.ts +32 -0
  392. package/scripts/agent/agent-launch-environment.ts +71 -0
  393. package/scripts/agent/agent-role-profile.ts +329 -0
  394. package/scripts/agent/api-outage.ts +51 -0
  395. package/scripts/agent/claude-agent-argv.ts +151 -0
  396. package/scripts/agent/claude-result-event.ts +98 -0
  397. package/scripts/agent/codex-agent-argv.ts +94 -0
  398. package/scripts/agent/codex-home-source.ts +11 -0
  399. package/scripts/agent/interactive-ask.ts +91 -0
  400. package/scripts/auto-ok/auto-ok-cli.ts +516 -0
  401. package/scripts/backlog/backlog-arrival.ts +147 -0
  402. package/scripts/backlog/backlog-budget-cli.ts +220 -0
  403. package/scripts/backlog/backlog-budget.ts +284 -0
  404. package/scripts/backlog/backlog-defect-priority.ts +77 -0
  405. package/scripts/backlog/backlog-drive-cli.ts +377 -0
  406. package/scripts/backlog/backlog-drive-finish.ts +23 -0
  407. package/scripts/backlog/backlog-drive-named-offer.ts +81 -0
  408. package/scripts/backlog/backlog-drive-named.ts +101 -0
  409. package/scripts/backlog/backlog-drive-offer-argv.ts +29 -0
  410. package/scripts/backlog/backlog-drive-owner.ts +22 -0
  411. package/scripts/backlog/backlog-drive-restore.ts +67 -0
  412. package/scripts/backlog/backlog-drive.ts +322 -0
  413. package/scripts/backlog/backlog-named.ts +164 -0
  414. package/scripts/backlog/backlog-next.ts +376 -0
  415. package/scripts/backlog/backlog-offer-cli.ts +279 -0
  416. package/scripts/backlog/backlog-offer.ts +93 -0
  417. package/scripts/backlog/backlog-plan-cli.ts +235 -0
  418. package/scripts/backlog/backlog-plan.ts +231 -0
  419. package/scripts/backlog/backlog-pool.ts +322 -0
  420. package/scripts/backlog/backlog-ready.ts +146 -0
  421. package/scripts/backlog/backlog-scope.ts +144 -0
  422. package/scripts/backlog/backlog-stalled-cli.ts +30 -0
  423. package/scripts/backlog/backlog-stalled-detect.ts +143 -0
  424. package/scripts/backlog/backlog-stalled.ts +118 -0
  425. package/scripts/behavior/behavior-assertion.ts +87 -0
  426. package/scripts/behavior/behavior-cli.ts +88 -0
  427. package/scripts/behavior/behavior-rules.ts +128 -0
  428. package/scripts/build/build-bin.ts +36 -0
  429. package/scripts/build/build-claude-md.ts +42 -0
  430. package/scripts/build/build-config-merge.ts +26 -0
  431. package/scripts/build/build-hooks.ts +79 -0
  432. package/scripts/build/build-library.ts +83 -0
  433. package/scripts/build/build-managed-marker.ts +26 -0
  434. package/scripts/build/build-self-sync-guard.ts +26 -0
  435. package/scripts/build/build-version.ts +25 -0
  436. package/scripts/build/local-bin.ts +97 -0
  437. package/scripts/build/shim-shell.ts +25 -0
  438. package/scripts/bytes/bytes-command.ts +181 -0
  439. package/scripts/cases/cases-cli.ts +48 -0
  440. package/scripts/cases/cases-logic.ts +100 -0
  441. package/scripts/claude/skill-meta.ts +37 -0
  442. package/scripts/claude/workflow-destination.ts +13 -0
  443. package/scripts/clone/clone-aggregate.ts +76 -0
  444. package/scripts/clone/clone-fingerprint.ts +96 -0
  445. package/scripts/clone/clone-scan-cli.ts +39 -0
  446. package/scripts/clone/clone-scan.ts +158 -0
  447. package/scripts/config-merge/index.ts +19 -0
  448. package/scripts/config-merge/json-format.ts +128 -0
  449. package/scripts/config-merge/list-patch.ts +61 -0
  450. package/scripts/config-merge/parse-jsonc.ts +14 -0
  451. package/scripts/config-merge/patch-json-key.ts +439 -0
  452. package/scripts/config-merge/patch-json-list.ts +38 -0
  453. package/scripts/config-merge/patch-yaml-list.ts +107 -0
  454. package/scripts/cost-runtime/codex-usage.ts +119 -0
  455. package/scripts/cost-runtime/context-cut-payback.ts +77 -0
  456. package/scripts/cost-runtime/context-cut-threshold.ts +21 -0
  457. package/scripts/cost-runtime/cost-attribute.ts +168 -0
  458. package/scripts/cost-runtime/cost-blocks.ts +149 -0
  459. package/scripts/cost-runtime/cost-cli.ts +318 -0
  460. package/scripts/cost-runtime/cost-corpus.ts +278 -0
  461. package/scripts/cost-runtime/cost-format.ts +32 -0
  462. package/scripts/cost-runtime/cost-pricing.ts +176 -0
  463. package/scripts/cost-runtime/cost-tokens.ts +84 -0
  464. package/scripts/cost-runtime/cost-transcript.ts +531 -0
  465. package/scripts/cost-runtime/cost-usage.ts +287 -0
  466. package/scripts/cost-runtime/cost-verdict.ts +89 -0
  467. package/scripts/cost-runtime/own-session.ts +58 -0
  468. package/scripts/cost-runtime/transcript-cwd.ts +14 -0
  469. package/scripts/delegation/delegation-cli.ts +91 -0
  470. package/scripts/delegation/delegation-policy.ts +178 -0
  471. package/scripts/delegation/duplicate-read-guard.ts +244 -0
  472. package/scripts/delegation/fanout-cli.ts +61 -0
  473. package/scripts/delegation/fanout.ts +95 -0
  474. package/scripts/delegation/investigation-guard.ts +131 -0
  475. package/scripts/delegation/investigation-reads.ts +637 -0
  476. package/scripts/discovery/repo-discovery.ts +166 -0
  477. package/scripts/discovery/repo-map-logic.ts +102 -0
  478. package/scripts/discovery/repo-origin.ts +153 -0
  479. package/scripts/discovery/repo-party-cli.ts +69 -0
  480. package/scripts/discovery/repo-party.ts +46 -0
  481. package/scripts/doctor/doctor-consumer.ts +181 -0
  482. package/scripts/doctor/doctor-io.ts +210 -0
  483. package/scripts/doctor/doctor-logic.ts +122 -0
  484. package/scripts/doctor/doctor-ports.ts +117 -0
  485. package/scripts/doctor/doctor.ts +232 -0
  486. package/scripts/document/backlogrun-parent-read-set.ts +48 -0
  487. package/scripts/document/bash-output-cap.ts +45 -0
  488. package/scripts/document/document-byte-budget.ts +183 -0
  489. package/scripts/document/document-byte-check.ts +131 -0
  490. package/scripts/document/document-reachability.ts +131 -0
  491. package/scripts/document/document-read-cli.ts +82 -0
  492. package/scripts/document/document-scan.ts +108 -0
  493. package/scripts/document/document-section-cli.ts +101 -0
  494. package/scripts/document/document-section.ts +156 -0
  495. package/scripts/document/edit-files-cli.ts +280 -0
  496. package/scripts/document/entry-read-budget.ts +154 -0
  497. package/scripts/document/entry-read-set.ts +471 -0
  498. package/scripts/document/generate-catalog.ts +69 -0
  499. package/scripts/document/lane-child-read-set.ts +88 -0
  500. package/scripts/document/read-files-cli.ts +135 -0
  501. package/scripts/document/read-set-cli.ts +295 -0
  502. package/scripts/document/read-set-point-of-use.ts +89 -0
  503. package/scripts/document/read-set-pricing.ts +52 -0
  504. package/scripts/document/read-set-trim.ts +78 -0
  505. package/scripts/document/retired-phrases.ts +143 -0
  506. package/scripts/document/review-agent-type.ts +46 -0
  507. package/scripts/document/single-source.ts +73 -0
  508. package/scripts/epic/epic-audit-checks.ts +452 -0
  509. package/scripts/epic/epic-audit-cli.ts +374 -0
  510. package/scripts/epic/epic-audit-orphans.ts +142 -0
  511. package/scripts/epic/epic-audit-rationale.ts +191 -0
  512. package/scripts/epic/epic-audit-report.ts +101 -0
  513. package/scripts/epic/epic-audit.ts +240 -0
  514. package/scripts/epic/epic-bundle-cli.ts +472 -0
  515. package/scripts/epic/epic-bundle-evidence.ts +147 -0
  516. package/scripts/epic/epic-bundle-gaps.ts +86 -0
  517. package/scripts/epic/epic-bundle-referenced.ts +195 -0
  518. package/scripts/epic/epic-bundle.ts +309 -0
  519. package/scripts/epic/epic-busy.ts +204 -0
  520. package/scripts/epic/epic-candidate-confirm.ts +279 -0
  521. package/scripts/epic/epic-classify.ts +294 -0
  522. package/scripts/epic/epic-cross-repo.ts +366 -0
  523. package/scripts/epic/epic-fetch.ts +370 -0
  524. package/scripts/epic/epic-graph.ts +279 -0
  525. package/scripts/epic/epic-index.ts +209 -0
  526. package/scripts/epic/epic-issue.ts +172 -0
  527. package/scripts/epic/epic-lane-offer.ts +207 -0
  528. package/scripts/epic/epic-nested.ts +37 -0
  529. package/scripts/epic/epic-next-read.ts +141 -0
  530. package/scripts/epic/epic-next-views.ts +144 -0
  531. package/scripts/epic/epic-next.ts +477 -0
  532. package/scripts/epic/epic-outside-blocker.ts +113 -0
  533. package/scripts/epic/epic-relation-recheck.ts +108 -0
  534. package/scripts/epic/epic-report.ts +200 -0
  535. package/scripts/gate/core-budget.ts +292 -0
  536. package/scripts/gate/gate-log.ts +95 -0
  537. package/scripts/gate/gate-plan.ts +356 -0
  538. package/scripts/gate/gate-report.ts +207 -0
  539. package/scripts/gate/gate-skip.ts +123 -0
  540. package/scripts/gate/gate-tree.ts +49 -0
  541. package/scripts/gate/hook-gate-reuse.ts +130 -0
  542. package/scripts/gate/pre-commit-type-check.ts +187 -0
  543. package/scripts/gate/scoped-green.ts +260 -0
  544. package/scripts/gate/type-check-step.ts +90 -0
  545. package/scripts/gate/verification-gate.ts +531 -0
  546. package/scripts/gh/fix-gh-packages-logic.ts +232 -0
  547. package/scripts/gh/fix-gh-packages.ts +129 -0
  548. package/scripts/gh/gh-cli-token.ts +18 -0
  549. package/scripts/gh/gh-spawn.ts +44 -0
  550. package/scripts/git/animation-helpers.ts +81 -0
  551. package/scripts/git/change-base.ts +26 -0
  552. package/scripts/git/changed-file-scope.ts +209 -0
  553. package/scripts/git/changed-paths.ts +30 -0
  554. package/scripts/git/constants.ts +41 -0
  555. package/scripts/git/git-ai-review-scan.ts +154 -0
  556. package/scripts/git/git-animation.ts +41 -0
  557. package/scripts/git/git-branch.ts +127 -0
  558. package/scripts/git/git-command.ts +587 -0
  559. package/scripts/git/git-commit.ts +27 -0
  560. package/scripts/git/git-common-directory.ts +38 -0
  561. package/scripts/git/git-epic-add-body.ts +365 -0
  562. package/scripts/git/git-epic-add-plan.ts +421 -0
  563. package/scripts/git/git-epic-add.ts +249 -0
  564. package/scripts/git/git-epic-body.ts +150 -0
  565. package/scripts/git/git-epic-chains.ts +411 -0
  566. package/scripts/git/git-epic-close-comment.ts +199 -0
  567. package/scripts/git/git-epic-close.ts +393 -0
  568. package/scripts/git/git-epic-decision.ts +171 -0
  569. package/scripts/git/git-epic-parse.ts +351 -0
  570. package/scripts/git/git-epic-promote.ts +102 -0
  571. package/scripts/git/git-epic-read.ts +73 -0
  572. package/scripts/git/git-epic-reconcile.ts +246 -0
  573. package/scripts/git/git-epic-reference.ts +98 -0
  574. package/scripts/git/git-epic-relations.ts +78 -0
  575. package/scripts/git/git-epic-remove-plan.ts +152 -0
  576. package/scripts/git/git-epic-remove.ts +101 -0
  577. package/scripts/git/git-epic-run.ts +223 -0
  578. package/scripts/git/git-epic-sections.ts +98 -0
  579. package/scripts/git/git-epic-shape.ts +81 -0
  580. package/scripts/git/git-epic-validate.ts +155 -0
  581. package/scripts/git/git-error.ts +78 -0
  582. package/scripts/git/git-execa-error.ts +35 -0
  583. package/scripts/git/git-fixture-workspace.ts +88 -0
  584. package/scripts/git/git-followup-cleanup.ts +88 -0
  585. package/scripts/git/git-followup-flush.ts +63 -0
  586. package/scripts/git/git-followup-label.ts +67 -0
  587. package/scripts/git/git-followup-pending.ts +95 -0
  588. package/scripts/git/git-followup-stages.ts +149 -0
  589. package/scripts/git/git-gh-api-path.ts +118 -0
  590. package/scripts/git/git-gh-check.ts +21 -0
  591. package/scripts/git/git-gh-command.ts +17 -0
  592. package/scripts/git/git-gh-exec.ts +344 -0
  593. package/scripts/git/git-gh-failure.ts +103 -0
  594. package/scripts/git/git-gh-helpers.ts +44 -0
  595. package/scripts/git/git-gh-issue-list.ts +257 -0
  596. package/scripts/git/git-gh-issue-read.ts +457 -0
  597. package/scripts/git/git-gh-issue-rest.ts +238 -0
  598. package/scripts/git/git-gh-issue-write.ts +285 -0
  599. package/scripts/git/git-gh-issue.ts +161 -0
  600. package/scripts/git/git-gh-pr-auto-merge.ts +85 -0
  601. package/scripts/git/git-gh-pr-read.ts +322 -0
  602. package/scripts/git/git-gh-pr-rest.ts +172 -0
  603. package/scripts/git/git-gh-pr-review.ts +103 -0
  604. package/scripts/git/git-gh-pr-rollup.ts +91 -0
  605. package/scripts/git/git-gh-pr-snapshot.ts +138 -0
  606. package/scripts/git/git-gh-pr.ts +219 -0
  607. package/scripts/git/git-gh-reachability.ts +56 -0
  608. package/scripts/git/git-gh-repo.ts +37 -0
  609. package/scripts/git/git-gh-rest-state.ts +14 -0
  610. package/scripts/git/git-issue.ts +168 -0
  611. package/scripts/git/git-location-environment.ts +62 -0
  612. package/scripts/git/git-ls-remote.ts +28 -0
  613. package/scripts/git/git-next-issues.ts +98 -0
  614. package/scripts/git/git-notify.ts +104 -0
  615. package/scripts/git/git-pr-ai-review.ts +180 -0
  616. package/scripts/git/git-pr-checks-eval.ts +265 -0
  617. package/scripts/git/git-pr-checks-parse.ts +153 -0
  618. package/scripts/git/git-pr-checks-watch.ts +184 -0
  619. package/scripts/git/git-pr-checks.ts +387 -0
  620. package/scripts/git/git-pr-coderabbit.ts +129 -0
  621. package/scripts/git/git-pr-confirmation.ts +64 -0
  622. package/scripts/git/git-pr-error.ts +25 -0
  623. package/scripts/git/git-pr-followup-wrapup.ts +225 -0
  624. package/scripts/git/git-pr-followup.ts +436 -0
  625. package/scripts/git/git-pr-managed-config.ts +69 -0
  626. package/scripts/git/git-pr-messages.ts +37 -0
  627. package/scripts/git/git-pr.ts +181 -0
  628. package/scripts/git/git-prompt-display.ts +22 -0
  629. package/scripts/git/git-prompt.ts +207 -0
  630. package/scripts/git/git-push-transport.ts +173 -0
  631. package/scripts/git/git-push.ts +27 -0
  632. package/scripts/git/git-remote-branch.ts +40 -0
  633. package/scripts/git/git-spawn.ts +47 -0
  634. package/scripts/git/git-staging.ts +128 -0
  635. package/scripts/git/git-stash.ts +124 -0
  636. package/scripts/git/git-status.ts +198 -0
  637. package/scripts/git/git-worktree.ts +110 -0
  638. package/scripts/git/github-issue-url.ts +105 -0
  639. package/scripts/git/gone-branch.ts +113 -0
  640. package/scripts/git/issue-labels.ts +279 -0
  641. package/scripts/git/listing-cutoff.ts +51 -0
  642. package/scripts/git/main-merge-guard.ts +134 -0
  643. package/scripts/git/main-merge.ts +120 -0
  644. package/scripts/git/main-sync.ts +121 -0
  645. package/scripts/git/parse-json-array.ts +102 -0
  646. package/scripts/git/schemas.ts +166 -0
  647. package/scripts/git/stash-orphans.ts +91 -0
  648. package/scripts/git/stash-pop-args.ts +59 -0
  649. package/scripts/git/stash-pop-cli.ts +105 -0
  650. package/scripts/git/telegram-notify.ts +404 -0
  651. package/scripts/hooks/batch-guard.ts +144 -0
  652. package/scripts/hooks/check-commit-message.ts +134 -0
  653. package/scripts/hooks/codex-hook-adapter.ts +155 -0
  654. package/scripts/hooks/edited-cspell.ts +128 -0
  655. package/scripts/hooks/format-edited-file-fixtures.ts +109 -0
  656. package/scripts/hooks/format-edited-file.ts +510 -0
  657. package/scripts/hooks/format-rewrite-notice.ts +99 -0
  658. package/scripts/hooks/pre-push-unit.ts +146 -0
  659. package/scripts/hooks/pretool-guard.ts +96 -0
  660. package/scripts/hooks/prevent-main-commit.ts +38 -0
  661. package/scripts/hooks/prompt-hooks.ts +38 -0
  662. package/scripts/hooks/reserved-run.ts +90 -0
  663. package/scripts/hooks/stop-guard.ts +135 -0
  664. package/scripts/init/claude-plugin-config.ts +51 -0
  665. package/scripts/init/distributed-paths.ts +100 -0
  666. package/scripts/init/hook-command-rewrite.ts +85 -0
  667. package/scripts/init/hook-launch.ts +31 -0
  668. package/scripts/init/init-actions.ts +147 -0
  669. package/scripts/init/init-ai-copy.ts +235 -0
  670. package/scripts/init/init-copy-content.ts +50 -0
  671. package/scripts/init/init-logic-deploy-vps.ts +43 -0
  672. package/scripts/init/init-logic-json-merge.ts +340 -0
  673. package/scripts/init/init-logic-migrate.ts +62 -0
  674. package/scripts/init/init-logic-package-key-order.ts +50 -0
  675. package/scripts/init/init-logic-secretlint.ts +36 -0
  676. package/scripts/init/init-logic-sonar.ts +197 -0
  677. package/scripts/init/init-logic-templates.ts +142 -0
  678. package/scripts/init/init-logic-workspace.ts +59 -0
  679. package/scripts/init/init-logic-yaml-merge.ts +57 -0
  680. package/scripts/init/init-logic.ts +474 -0
  681. package/scripts/init/init-paths.ts +11 -0
  682. package/scripts/init/init-sonar.ts +32 -0
  683. package/scripts/init/init.ts +219 -0
  684. package/scripts/init/kit-base-preset.ts +60 -0
  685. package/scripts/init/plugin-install-hint.ts +47 -0
  686. package/scripts/init/tsconfig-preset-migration.ts +67 -0
  687. package/scripts/issue/baseline-measure.ts +105 -0
  688. package/scripts/issue/behavior-change-lint.ts +122 -0
  689. package/scripts/issue/defect-rate-cli.ts +167 -0
  690. package/scripts/issue/defect-rate.ts +145 -0
  691. package/scripts/issue/issue-backlinks-cli.ts +97 -0
  692. package/scripts/issue/issue-backlinks.ts +164 -0
  693. package/scripts/issue/issue-cite-cli.ts +158 -0
  694. package/scripts/issue/issue-cite.ts +102 -0
  695. package/scripts/issue/issue-comment-cli.ts +95 -0
  696. package/scripts/issue/issue-fold-cli.ts +104 -0
  697. package/scripts/issue/issue-fold-existing-cli.ts +81 -0
  698. package/scripts/issue/issue-fold-existing.ts +73 -0
  699. package/scripts/issue/issue-fold.ts +42 -0
  700. package/scripts/issue/issue-lint-cli.ts +60 -0
  701. package/scripts/issue/issue-lint.ts +26 -0
  702. package/scripts/issue/issue-logic.ts +50 -0
  703. package/scripts/issue/issue-read-cli.ts +190 -0
  704. package/scripts/issue/issue-read.ts +145 -0
  705. package/scripts/issue/issue-scout-cli.ts +482 -0
  706. package/scripts/issue/issue-scout.ts +244 -0
  707. package/scripts/issue/issue-state-cli.ts +260 -0
  708. package/scripts/issue/issue-state.ts +109 -0
  709. package/scripts/issue/markdown-section.ts +39 -0
  710. package/scripts/issue/measure-rerun-cli.ts +98 -0
  711. package/scripts/issue/reproduction-measure.ts +59 -0
  712. package/scripts/josh/__snapshots__/josh-command-map.test.ts.snap +1171 -0
  713. package/scripts/josh/agent-session-environment.ts +188 -0
  714. package/scripts/josh/cli-body.ts +96 -0
  715. package/scripts/josh/command-suggest.ts +57 -0
  716. package/scripts/josh/file-map-stamp.ts +264 -0
  717. package/scripts/josh/hook-decision.ts +479 -0
  718. package/scripts/josh/josh-command-map.ts +196 -0
  719. package/scripts/josh/josh-command-types.ts +226 -0
  720. package/scripts/josh/josh-commands-ai.ts +327 -0
  721. package/scripts/josh/josh-commands-backlog.ts +54 -0
  722. package/scripts/josh/josh-commands-clone.ts +18 -0
  723. package/scripts/josh/josh-commands-development.ts +206 -0
  724. package/scripts/josh/josh-commands-document.ts +45 -0
  725. package/scripts/josh/josh-commands-guard.ts +38 -0
  726. package/scripts/josh/josh-commands-hooks.ts +42 -0
  727. package/scripts/josh/josh-commands-issue.ts +69 -0
  728. package/scripts/josh/josh-commands-lane.ts +75 -0
  729. package/scripts/josh/josh-commands-lint.ts +37 -0
  730. package/scripts/josh/josh-commands-maintenance.ts +80 -0
  731. package/scripts/josh/josh-commands-project.ts +53 -0
  732. package/scripts/josh/josh-commands-split.ts +20 -0
  733. package/scripts/josh/josh-commands-versioning.ts +48 -0
  734. package/scripts/josh/josh-commands-workflow.ts +116 -0
  735. package/scripts/josh/josh-composite-arguments.ts +55 -0
  736. package/scripts/josh/josh-environment-file.ts +31 -0
  737. package/scripts/josh/josh-in-process.ts +80 -0
  738. package/scripts/josh/josh-logic.ts +308 -0
  739. package/scripts/josh/josh-run.ts +53 -0
  740. package/scripts/josh/josh-script-reader.ts +11 -0
  741. package/scripts/josh/josh-verdict.ts +111 -0
  742. package/scripts/josh/josh.ts +60 -0
  743. package/scripts/josh/kit-only.ts +33 -0
  744. package/scripts/josh/path-decision.ts +104 -0
  745. package/scripts/josh/platform-temporary.ts +66 -0
  746. package/scripts/josh/process-identity.ts +335 -0
  747. package/scripts/josh/session-language-cli.ts +51 -0
  748. package/scripts/josh/session-language.ts +30 -0
  749. package/scripts/josh/stamp-file.ts +194 -0
  750. package/scripts/lane/lane-await.ts +165 -0
  751. package/scripts/lane/lane-cache-run.ts +39 -0
  752. package/scripts/lane/lane-cache.ts +135 -0
  753. package/scripts/lane/lane-capacity.ts +69 -0
  754. package/scripts/lane/lane-child-invocation.ts +73 -0
  755. package/scripts/lane/lane-child-marker.ts +58 -0
  756. package/scripts/lane/lane-cli.ts +410 -0
  757. package/scripts/lane/lane-close.ts +197 -0
  758. package/scripts/lane/lane-dispatch-log.ts +13 -0
  759. package/scripts/lane/lane-dispatch.ts +458 -0
  760. package/scripts/lane/lane-environment.ts +253 -0
  761. package/scripts/lane/lane-guard-policy.ts +136 -0
  762. package/scripts/lane/lane-install.ts +94 -0
  763. package/scripts/lane/lane-launch-cli.ts +133 -0
  764. package/scripts/lane/lane-occupancy.ts +112 -0
  765. package/scripts/lane/lane-open.ts +275 -0
  766. package/scripts/lane/lane-output.ts +124 -0
  767. package/scripts/lane/lane-paths.ts +96 -0
  768. package/scripts/lane/lane-reap.ts +137 -0
  769. package/scripts/lane/lane-registry.ts +261 -0
  770. package/scripts/lane/lane-relaunch.ts +68 -0
  771. package/scripts/lane/lane-report.ts +95 -0
  772. package/scripts/lane/lane-resume.ts +61 -0
  773. package/scripts/lane/lane-seed.ts +44 -0
  774. package/scripts/lane/lane-start-point.ts +175 -0
  775. package/scripts/lane/openai-lane-supervisor-cli.ts +32 -0
  776. package/scripts/lane/openai-lane-supervisor-decision.ts +63 -0
  777. package/scripts/lane/openai-lane-supervisor.ts +337 -0
  778. package/scripts/lib/bounded-pool.ts +109 -0
  779. package/scripts/lib/buffered-process.ts +82 -0
  780. package/scripts/lib/caddy-logs.sh +45 -0
  781. package/scripts/lib/cli-flags.ts +19 -0
  782. package/scripts/lib/json-value.ts +24 -0
  783. package/scripts/lib/poll.ts +57 -0
  784. package/scripts/lib/read-file.ts +16 -0
  785. package/scripts/lib/schemas.ts +67 -0
  786. package/scripts/lib/spawn-exit.ts +45 -0
  787. package/scripts/lib/status-icons.ts +24 -0
  788. package/scripts/lines/effective-limit.ts +156 -0
  789. package/scripts/lines/line-budget.ts +404 -0
  790. package/scripts/lines/line-targets.ts +80 -0
  791. package/scripts/lines/lines-command.ts +174 -0
  792. package/scripts/lint/cspell-cached.ts +41 -0
  793. package/scripts/lint/lint-parallel.ts +72 -0
  794. package/scripts/lint/lint-related-scope.ts +128 -0
  795. package/scripts/lint/lint-related.ts +104 -0
  796. package/scripts/managed-marker/index.ts +5 -0
  797. package/scripts/managed-marker/managed-marker-logic.ts +67 -0
  798. package/scripts/observations/observation-ledger-home.ts +32 -0
  799. package/scripts/observations/observation-ledger-line.ts +93 -0
  800. package/scripts/observations/observation-ledger.ts +35 -0
  801. package/scripts/observations/observations-flush-cli.ts +42 -0
  802. package/scripts/observations/observations-flush-landing.ts +97 -0
  803. package/scripts/observations/observations-flush.ts +420 -0
  804. package/scripts/overrides/lockfile-overrides.ts +105 -0
  805. package/scripts/overrides/overrides-check.ts +84 -0
  806. package/scripts/overrides/overrides-files.ts +19 -0
  807. package/scripts/overrides/overrides-logic.ts +211 -0
  808. package/scripts/overrides/schemas.ts +49 -0
  809. package/scripts/package/package-scout-cli.ts +195 -0
  810. package/scripts/package/package-scout-format.ts +151 -0
  811. package/scripts/package/package-scout.ts +121 -0
  812. package/scripts/ports/port-command.ts +87 -0
  813. package/scripts/propagate/propagate-git-failure.ts +191 -0
  814. package/scripts/propagate/propagate-git.ts +224 -0
  815. package/scripts/propagate/propagate-publish.ts +181 -0
  816. package/scripts/propagate/propagate-run.ts +201 -0
  817. package/scripts/propagate/propagate-steps.ts +421 -0
  818. package/scripts/propagate/propagate-targets.ts +160 -0
  819. package/scripts/propagate/propagate.ts +216 -0
  820. package/scripts/refactor/import-graph.ts +187 -0
  821. package/scripts/refactor/refactor-lint.ts +250 -0
  822. package/scripts/refactor/refactor-scan-cli.ts +10 -0
  823. package/scripts/refactor/refactor-scan.ts +124 -0
  824. package/scripts/refactor/refactor-targets.ts +103 -0
  825. package/scripts/release/release-cli.ts +88 -0
  826. package/scripts/release/release-history.ts +132 -0
  827. package/scripts/release/release-plan.ts +130 -0
  828. package/scripts/release/release-publish.ts +152 -0
  829. package/scripts/release/release-scope-cli.ts +103 -0
  830. package/scripts/release/release-tag.ts +93 -0
  831. package/scripts/release/release-worktree.ts +71 -0
  832. package/scripts/repo/auto-merge-setting-logic.ts +100 -0
  833. package/scripts/repo/auto-merge-setting.ts +37 -0
  834. package/scripts/repo/repo-setting.ts +112 -0
  835. package/scripts/report/report-lint-cli.ts +49 -0
  836. package/scripts/report/report-lint.ts +250 -0
  837. package/scripts/retrospective/retrospective-cli.ts +97 -0
  838. package/scripts/retrospective/retrospective.ts +127 -0
  839. package/scripts/review/disposition-cli.ts +44 -0
  840. package/scripts/review/disposition-logic.ts +45 -0
  841. package/scripts/review/live-evidence.ts +62 -0
  842. package/scripts/review/review-attest-cli.ts +115 -0
  843. package/scripts/review/review-attest.ts +319 -0
  844. package/scripts/review/review-brief-cli.ts +290 -0
  845. package/scripts/review/review-brief.ts +440 -0
  846. package/scripts/review/review-checkout.ts +56 -0
  847. package/scripts/review/review-finding-ledger.ts +167 -0
  848. package/scripts/review/review-findings-cli.ts +57 -0
  849. package/scripts/review/review-level.ts +86 -0
  850. package/scripts/review/review-record-cli.ts +196 -0
  851. package/scripts/review/review-record.ts +74 -0
  852. package/scripts/review/review-round2-cli.ts +84 -0
  853. package/scripts/review/review-round2.ts +139 -0
  854. package/scripts/review/review-stamps.ts +113 -0
  855. package/scripts/review/review-tree.ts +58 -0
  856. package/scripts/rules/bash-triggers.ts +44 -0
  857. package/scripts/rules/decision-oracle.ts +342 -0
  858. package/scripts/rules/delivered-rules-harness.ts +72 -0
  859. package/scripts/rules/delivered-rules.ts +793 -0
  860. package/scripts/rules/early-heartbeat.ts +241 -0
  861. package/scripts/rules/file-body.ts +150 -0
  862. package/scripts/rules/filing-cap.ts +133 -0
  863. package/scripts/rules/filing-offer.ts +81 -0
  864. package/scripts/rules/firing-point.ts +63 -0
  865. package/scripts/rules/gh-api.ts +65 -0
  866. package/scripts/rules/git-argv.ts +129 -0
  867. package/scripts/rules/git-force.ts +104 -0
  868. package/scripts/rules/implementation-cut-verdict.ts +84 -0
  869. package/scripts/rules/implementation-cut.ts +202 -0
  870. package/scripts/rules/issue-citation.ts +242 -0
  871. package/scripts/rules/issue-fold.ts +73 -0
  872. package/scripts/rules/issue-scout.ts +64 -0
  873. package/scripts/rules/josh-git-bare.ts +80 -0
  874. package/scripts/rules/lane-carry-conflict.ts +96 -0
  875. package/scripts/rules/lane-interactive-ask.ts +71 -0
  876. package/scripts/rules/lane-park.ts +122 -0
  877. package/scripts/rules/lane-switch-main.ts +139 -0
  878. package/scripts/rules/oracle-consulted.ts +81 -0
  879. package/scripts/rules/oracle-firing.ts +151 -0
  880. package/scripts/rules/oracle-list-cli.ts +81 -0
  881. package/scripts/rules/piped-verification.ts +126 -0
  882. package/scripts/rules/poll-loop.ts +125 -0
  883. package/scripts/rules/pre-gate-cut.ts +207 -0
  884. package/scripts/rules/prior-comment-read.ts +106 -0
  885. package/scripts/rules/raw-field-body.ts +56 -0
  886. package/scripts/rules/reply-language.ts +116 -0
  887. package/scripts/rules/rule-body-guard.ts +206 -0
  888. package/scripts/rules/rule-guard.ts +23 -0
  889. package/scripts/rules/rule-value-cli.ts +129 -0
  890. package/scripts/rules/rule-value.ts +397 -0
  891. package/scripts/rules/run-tail.ts +178 -0
  892. package/scripts/rules/shell-body-trigger.ts +204 -0
  893. package/scripts/rules/shell-segments.ts +45 -0
  894. package/scripts/rules/stop-rules.ts +329 -0
  895. package/scripts/rules/tail-commands.ts +35 -0
  896. package/scripts/rules/test-declared-commit.ts +51 -0
  897. package/scripts/rules/third-party-write.ts +90 -0
  898. package/scripts/rules/top-level-scripts-guard.ts +47 -0
  899. package/scripts/rules/worktree-guard.ts +130 -0
  900. package/scripts/run/detached-launch.ts +360 -0
  901. package/scripts/run/run-carry-args.ts +264 -0
  902. package/scripts/run/run-carry-change.ts +69 -0
  903. package/scripts/run/run-carry-cli.ts +441 -0
  904. package/scripts/run/run-carry-flush.ts +63 -0
  905. package/scripts/run/run-carry-stash.ts +71 -0
  906. package/scripts/run/run-carry-streak.ts +113 -0
  907. package/scripts/run/run-carry.ts +550 -0
  908. package/scripts/run/run-cut-args.ts +132 -0
  909. package/scripts/run/run-cut-cli.ts +461 -0
  910. package/scripts/run/run-cut-handoff.ts +126 -0
  911. package/scripts/run/run-cut.ts +531 -0
  912. package/scripts/run/run-ending-cli.ts +111 -0
  913. package/scripts/run/run-ending.ts +239 -0
  914. package/scripts/run/run-entry-cli.ts +135 -0
  915. package/scripts/run/run-entry.ts +95 -0
  916. package/scripts/run/run-event-cli.ts +210 -0
  917. package/scripts/run/run-event-follow.ts +65 -0
  918. package/scripts/run/run-event-render.ts +75 -0
  919. package/scripts/run/run-event-scope.ts +127 -0
  920. package/scripts/run/run-event-stream-emit.ts +140 -0
  921. package/scripts/run/run-event-stream.ts +258 -0
  922. package/scripts/run/run-event-watch.ts +37 -0
  923. package/scripts/run/run-headless.ts +105 -0
  924. package/scripts/run/run-hold-cli.ts +310 -0
  925. package/scripts/run/run-hold.ts +264 -0
  926. package/scripts/run/run-invocation.ts +237 -0
  927. package/scripts/run/run-issue-number.ts +19 -0
  928. package/scripts/run/run-liveness-cli.ts +169 -0
  929. package/scripts/run/run-liveness.ts +424 -0
  930. package/scripts/run/run-merge-cli.ts +385 -0
  931. package/scripts/run/run-merge-steps.ts +326 -0
  932. package/scripts/run/run-merge.ts +158 -0
  933. package/scripts/run/run-next-cli.ts +48 -0
  934. package/scripts/run/run-next.ts +80 -0
  935. package/scripts/run/run-preflight.ts +337 -0
  936. package/scripts/run/run-prep-cli.ts +151 -0
  937. package/scripts/run/run-prep.ts +84 -0
  938. package/scripts/run/run-progress-args.ts +65 -0
  939. package/scripts/run/run-progress-cli.ts +508 -0
  940. package/scripts/run/run-progress-clock.ts +320 -0
  941. package/scripts/run/run-progress-config.ts +119 -0
  942. package/scripts/run/run-progress-read.ts +199 -0
  943. package/scripts/run/run-progress.ts +366 -0
  944. package/scripts/run/run-report-cli.ts +71 -0
  945. package/scripts/run/run-report.ts +78 -0
  946. package/scripts/run/run-review-cli.ts +130 -0
  947. package/scripts/run/run-review-steps.ts +161 -0
  948. package/scripts/run/run-review.ts +121 -0
  949. package/scripts/run/run-ship-cli.ts +431 -0
  950. package/scripts/run/run-ship-detach.ts +200 -0
  951. package/scripts/run/run-ship-probe.ts +103 -0
  952. package/scripts/run/run-ship-return.ts +75 -0
  953. package/scripts/run/run-ship-review-steps.ts +227 -0
  954. package/scripts/run/run-ship-review.ts +177 -0
  955. package/scripts/run/run-ship-stage.ts +150 -0
  956. package/scripts/run/run-ship.ts +78 -0
  957. package/scripts/run/run-status-cli.ts +175 -0
  958. package/scripts/run/run-status.ts +77 -0
  959. package/scripts/run/run-step-cli.ts +111 -0
  960. package/scripts/run/run-step.ts +292 -0
  961. package/scripts/run/run-stop-notify.ts +52 -0
  962. package/scripts/run/run-stranded-cli.ts +31 -0
  963. package/scripts/run/run-stranded-detect.ts +134 -0
  964. package/scripts/run/run-stranded.ts +120 -0
  965. package/scripts/run/run-tail-cli.ts +105 -0
  966. package/scripts/run/run-tail.ts +61 -0
  967. package/scripts/run/run-transcript.golden.txt +57 -0
  968. package/scripts/run/run-wake-cli.ts +428 -0
  969. package/scripts/run/run-wake-describe.ts +97 -0
  970. package/scripts/run/run-wake-driver.ts +80 -0
  971. package/scripts/run/run-wake-handoff.ts +29 -0
  972. package/scripts/run/run-wake-loop.ts +223 -0
  973. package/scripts/run/run-wake-session.ts +150 -0
  974. package/scripts/run/run-wake-work.ts +104 -0
  975. package/scripts/run/run-wake.ts +607 -0
  976. package/scripts/run/run-watcher-guard-cli.ts +37 -0
  977. package/scripts/run/run-watcher-guard.ts +59 -0
  978. package/scripts/run/run-watcher-hook.ts +86 -0
  979. package/scripts/security/secretlint-scan.ts +86 -0
  980. package/scripts/security/security-audit-logic.ts +51 -0
  981. package/scripts/security/security-audit-provision-logic.ts +217 -0
  982. package/scripts/security/security-audit-provision.ts +186 -0
  983. package/scripts/security/security-audit.ts +132 -0
  984. package/scripts/security/security-updates-logic.ts +131 -0
  985. package/scripts/security/security-updates.ts +38 -0
  986. package/scripts/security/sonar-file.ts +44 -0
  987. package/scripts/self-sync-guard/index.ts +5 -0
  988. package/scripts/self-sync-guard/self-sync-guard-logic.ts +98 -0
  989. package/scripts/self-sync-guard/self-sync-refusal.ts +22 -0
  990. package/scripts/sonar/sonar-hotspots-cli.ts +149 -0
  991. package/scripts/sonar/sonar-hotspots.ts +111 -0
  992. package/scripts/split/split-assess-cli.ts +52 -0
  993. package/scripts/split/split-assess.ts +124 -0
  994. package/scripts/sync/dependabot-pin-logic.ts +135 -0
  995. package/scripts/sync/directory-copy-guard.ts +187 -0
  996. package/scripts/sync/file-content.ts +49 -0
  997. package/scripts/sync/managed-config-scope-cli.ts +64 -0
  998. package/scripts/sync/managed-config-scope.ts +123 -0
  999. package/scripts/sync/plugin-skill-directories.ts +15 -0
  1000. package/scripts/sync/reconcile-templates.ts +53 -0
  1001. package/scripts/sync/removed-skill-manifest.ts +27 -0
  1002. package/scripts/sync/skill-migration.ts +192 -0
  1003. package/scripts/sync/sync-configs.ts +156 -0
  1004. package/scripts/sync/sync-hook-safety.ts +82 -0
  1005. package/scripts/sync/sync.ts +417 -0
  1006. package/scripts/sync/synced-paths.ts +52 -0
  1007. package/scripts/sync/template-source-logic.ts +122 -0
  1008. package/scripts/sync/workflow-pin-logic.ts +240 -0
  1009. package/scripts/test/classify-isolation.ts +149 -0
  1010. package/scripts/test/e2e-retry-check.ts +150 -0
  1011. package/scripts/test/http-fault-injection.ts +79 -0
  1012. package/scripts/test/josh-harness-environment.ts +260 -0
  1013. package/scripts/test/josh-harness.ts +96 -0
  1014. package/scripts/test/pilot-files.ts +457 -0
  1015. package/scripts/test/pilot-measure.ts +78 -0
  1016. package/scripts/test/test-declared-changed.ts +99 -0
  1017. package/scripts/test/test-declared-logic.ts +91 -0
  1018. package/scripts/test/test-declared-match.ts +106 -0
  1019. package/scripts/test/test-declared.ts +180 -0
  1020. package/scripts/test/test-e2e-guard.ts +86 -0
  1021. package/scripts/test/test-network-guard.ts +453 -0
  1022. package/scripts/test/test-red-commit.ts +51 -0
  1023. package/scripts/test/test-red-logic.ts +76 -0
  1024. package/scripts/test/test-red.ts +154 -0
  1025. package/scripts/test/test-related-scope.ts +115 -0
  1026. package/scripts/test/test-related.ts +73 -0
  1027. package/scripts/test/test-repository-guard.ts +317 -0
  1028. package/scripts/test/test-state-guard.ts +85 -0
  1029. package/scripts/test/test-stdout-guard.ts +54 -0
  1030. package/scripts/test/test-telegram-guard.ts +90 -0
  1031. package/scripts/test/test-type-logic.ts +31 -0
  1032. package/scripts/test/test-unit-guard.ts +185 -0
  1033. package/scripts/test/unit-guard-environment.ts +12 -0
  1034. package/scripts/test/unit-projects.ts +139 -0
  1035. package/scripts/test/unit-worker-share.ts +251 -0
  1036. package/scripts/test/vitest-include-globs.ts +12 -0
  1037. package/scripts/time-runtime/time-agent-bundles.ts +128 -0
  1038. package/scripts/time-runtime/time-background.ts +300 -0
  1039. package/scripts/time-runtime/time-batch-guard-fixtures.ts +66 -0
  1040. package/scripts/time-runtime/time-batch-guard.ts +529 -0
  1041. package/scripts/time-runtime/time-bundle-call.ts +575 -0
  1042. package/scripts/time-runtime/time-bundles.ts +536 -0
  1043. package/scripts/time-runtime/time-call-identity.ts +37 -0
  1044. package/scripts/time-runtime/time-command-key.ts +35 -0
  1045. package/scripts/time-runtime/time-density-hook.ts +166 -0
  1046. package/scripts/time-runtime/time-density.ts +147 -0
  1047. package/scripts/time-runtime/time-followup-stage.ts +107 -0
  1048. package/scripts/time-runtime/time-format.ts +186 -0
  1049. package/scripts/time-runtime/time-hook-transcript.ts +82 -0
  1050. package/scripts/time-runtime/time-instant.ts +20 -0
  1051. package/scripts/time-runtime/time-markers.ts +228 -0
  1052. package/scripts/time-runtime/time-phase-names.ts +123 -0
  1053. package/scripts/time-runtime/time-reported-failure.ts +227 -0
  1054. package/scripts/time-runtime/time-round-trips.ts +279 -0
  1055. package/scripts/time-runtime/time-shell.ts +286 -0
  1056. package/scripts/time-runtime/time-single-check.ts +65 -0
  1057. package/scripts/time-runtime/time-spans.ts +545 -0
  1058. package/scripts/time-runtime/time-transcript-line.ts +253 -0
  1059. package/scripts/time-runtime/time-writes.ts +71 -0
  1060. package/scripts/ui/ui-routes-cli.ts +122 -0
  1061. package/scripts/ui/ui-routes.ts +102 -0
  1062. package/scripts/version/bump-version.ts +71 -0
  1063. package/scripts/version/effective-upstream.ts +93 -0
  1064. package/scripts/version/index.ts +25 -0
  1065. package/scripts/version/kit-descriptor.ts +10 -0
  1066. package/scripts/version/kit-version-config.ts +30 -0
  1067. package/scripts/version/latest-corepack.ts +404 -0
  1068. package/scripts/version/latest-lane-guard.ts +49 -0
  1069. package/scripts/version/latest-regression.ts +93 -0
  1070. package/scripts/version/latest-scope-cli.ts +147 -0
  1071. package/scripts/version/latest-stamp.ts +107 -0
  1072. package/scripts/version/latest-update.ts +198 -0
  1073. package/scripts/version/package-manager-version.ts +95 -0
  1074. package/scripts/version/parse-json.ts +13 -0
  1075. package/scripts/version/preinstall-version-update.ts +84 -0
  1076. package/scripts/version/publishable-range-check.ts +74 -0
  1077. package/scripts/version/publishable-range.ts +123 -0
  1078. package/scripts/version/release-age.ts +146 -0
  1079. package/scripts/version/release-hold.ts +142 -0
  1080. package/scripts/version/running-binary.ts +42 -0
  1081. package/scripts/version/upgrade-command-guard.ts +49 -0
  1082. package/scripts/version/upgrade-shell-command.ts +30 -0
  1083. package/scripts/version/version-check-logic.ts +333 -0
  1084. package/scripts/version/version-check.ts +14 -0
  1085. package/scripts/version/version-command-config.ts +177 -0
  1086. package/scripts/version/version-commands.ts +296 -0
  1087. package/scripts/version/version-remote.ts +86 -0
  1088. package/scripts/version/version-targets.ts +81 -0
  1089. package/scripts/yaml/yaml-document.ts +46 -0
  1090. package/scripts-ai/completion-gate.ts +13 -0
  1091. package/scripts-ai/environment-loader.ts +9 -0
  1092. package/scripts-ai/epic-check.ts +34 -0
  1093. package/scripts-ai/epic-cli-argv.ts +77 -0
  1094. package/scripts-ai/epic-cli-remove.ts +71 -0
  1095. package/scripts-ai/epic-cli.ts +413 -0
  1096. package/scripts-ai/epic.ts +192 -0
  1097. package/scripts-ai/followup-issue-number.ts +31 -0
  1098. package/scripts-ai/git-followup-finish.ts +217 -0
  1099. package/scripts-ai/git-followup-workflow.ts +252 -0
  1100. package/scripts-ai/git-workflow.ts +246 -0
  1101. package/scripts-ai/telegram-test-logic.ts +88 -0
  1102. package/scripts-ai/telegram-test.ts +130 -0
  1103. package/templates/gitignore +76 -0
  1104. package/templates/sonar-project.properties +52 -0
  1105. package/templates/workflows/ci.yml +639 -0
  1106. package/templates/workflows/dependabot-auto-merge.yml +428 -0
  1107. package/tsconfig/base.json +50 -0
  1108. package/tsconfig.sonar.json +34 -0
@@ -0,0 +1,232 @@
1
+ #!/usr/bin/env tsx
2
+ import { readFileSync, rmSync } from 'node:fs'
3
+ import path from 'node:path'
4
+ import { fileURLToPath } from 'node:url'
5
+ import { repo_discovery } from '#scripts/discovery/repo-discovery'
6
+ import { gh_spawn } from '#scripts/gh/gh-spawn'
7
+ import { PROJECT_ROOT } from '#scripts/init/init-paths'
8
+ import { auto_merge_setting } from '#scripts/repo/auto-merge-setting'
9
+ import { security_updates } from '#scripts/security/security-updates'
10
+ import { running_binary } from '#scripts/version/running-binary'
11
+ import { doctor_consumer } from './doctor-consumer'
12
+ import { doctor_io, type GitTopLevel } from './doctor-io'
13
+ import { doctor_logic } from './doctor-logic'
14
+ import { doctor_ports } from './doctor-ports'
15
+
16
+ const FIX_FLAG = '--fix'
17
+ const PORTS_FLAG = '--ports'
18
+ const UNKNOWN = '(unknown)'
19
+ const NOT_ON_PATH = '(not on PATH)'
20
+ const SELF_DIR = path.dirname(fileURLToPath(import.meta.url))
21
+ // Deliberately smaller than the setting query's budget: the two run back to back, so `doctor`'s
22
+ // worst case is the git probe plus this plus GH_TIMEOUT_MS — 2000 + 3000 + 5000, ten seconds. That
23
+ // keeps a command which made no network calls at all before joshuafolkken/kit#805 prompt enough to
24
+ // stay usable when the network is unreachable.
25
+ const REPO_LOOKUP_TIMEOUT_MS = 3000
26
+
27
+ // Where the local applicability gates look for the artifacts that decide whether a report applies.
28
+ interface GateScope {
29
+ root: string
30
+ boundary: string | undefined
31
+ }
32
+
33
+ // Which repository-scoped reports this project has a prerequisite for.
34
+ interface ApplicableSettings {
35
+ security_updates: boolean
36
+ auto_merge: boolean
37
+ }
38
+
39
+ interface DoctorContext {
40
+ running_version: string | undefined
41
+ running_path: string
42
+ path_josh: string | undefined
43
+ global_josh: string | undefined
44
+ }
45
+
46
+ function gather_context(): DoctorContext {
47
+ return {
48
+ running_version: running_binary.read_running_version(SELF_DIR),
49
+ running_path: running_binary.running_package_directory(SELF_DIR),
50
+ path_josh: doctor_io.resolve_path_josh(),
51
+ global_josh: doctor_io.resolve_pnpm_global_josh(),
52
+ }
53
+ }
54
+
55
+ function print_report(ctx: DoctorContext): void {
56
+ console.info('josh doctor')
57
+ console.info(` Running: ${ctx.running_version ?? UNKNOWN} (${ctx.running_path})`)
58
+ console.info(` On PATH: ${ctx.path_josh ?? NOT_ON_PATH}`)
59
+ console.info(` pnpm global: ${ctx.global_josh ?? UNKNOWN}`)
60
+ }
61
+
62
+ // Remove a confirmed stale kit shim so the pnpm-global josh reclaims PATH precedence. Any other
63
+ // shadowing binary is left in place and reported for manual review.
64
+ function reclaim_shim(path_josh: string, global_josh: string): void {
65
+ const content = readFileSync(path_josh, 'utf8')
66
+ const decision = doctor_logic.decide_reclaim(path_josh, global_josh, content)
67
+
68
+ if (decision.action !== 'remove' || decision.target === undefined) {
69
+ console.info(` ${decision.reason}`)
70
+
71
+ return
72
+ }
73
+
74
+ rmSync(decision.target)
75
+ console.info(` ✓ ${decision.reason}: ${decision.target}`)
76
+ }
77
+
78
+ function handle_shadow(ctx: DoctorContext, is_fix: boolean): void {
79
+ if (ctx.path_josh === undefined || ctx.global_josh === undefined) return
80
+ console.info('')
81
+ console.info(doctor_logic.format_shadow_warning(ctx.path_josh, ctx.global_josh))
82
+ if (is_fix) reclaim_shim(ctx.path_josh, ctx.global_josh)
83
+ }
84
+
85
+ function report_path_diagnosis(ctx: DoctorContext, is_fix: boolean): void {
86
+ if (doctor_logic.is_shadowed(ctx.path_josh, ctx.global_josh)) {
87
+ handle_shadow(ctx, is_fix)
88
+
89
+ return
90
+ }
91
+
92
+ console.info(' ✓ no PATH shadowing detected')
93
+ }
94
+
95
+ // Where a repository-scoped check should look for the artifact that decides whether it applies.
96
+ // An undetermined root still gets gated, against the working directory as the best root available:
97
+ // skipping the gate there would warn about a nonexistent repository from a home directory whenever
98
+ // `git` is missing or refuses the repository. Inside a known repository the search is bounded to its
99
+ // root, so a repository nested under a kit consumer does not inherit the parent's files.
100
+ function resolve_gate_scope(git: GitTopLevel): GateScope | undefined {
101
+ if (git.state === 'outside') return undefined
102
+ if (git.state === 'inside') return { root: git.top_level, boundary: git.top_level }
103
+
104
+ return { root: PROJECT_ROOT, boundary: undefined }
105
+ }
106
+
107
+ // Which prerequisites this repository actually has, decided locally so the answer does not depend on
108
+ // `gh` working. The two are independent: a consumer synced before joshuafolkken/kit#834 has the
109
+ // Dependabot config and no auto-merge workflow, and a repository that only ever added an auto-merge
110
+ // workflow of its own has the second prerequisite and not the first.
111
+ function resolve_applicable(scope: GateScope): ApplicableSettings {
112
+ return {
113
+ security_updates: doctor_io.has_distributed_dependabot_config(scope.root, scope.boundary),
114
+ auto_merge: doctor_io.has_auto_merge_workflow(scope.root, scope.boundary),
115
+ }
116
+ }
117
+
118
+ // Everything past the gate reports, including a failed lookup: `could not be read` is informative
119
+ // while silence is the false all-clear joshuafolkken/kit#805 exists to remove.
120
+ function report_applicable_settings(
121
+ applicable: ApplicableSettings,
122
+ repo: string | undefined,
123
+ ): void {
124
+ if (applicable.security_updates) security_updates.report_security_updates_section(repo)
125
+ if (applicable.auto_merge) auto_merge_setting.report_auto_merge_section(repo)
126
+ }
127
+
128
+ // Last, and after the local diagnosis: this is the only part of `doctor` that touches the network,
129
+ // and `doctor` is what a user runs when the install is already broken. Offline or behind a hanging
130
+ // proxy the PATH report and `--fix` must still complete (joshuafolkken/kit#805).
131
+ //
132
+ // Applicability is decided by the artifact rather than by the directory. `doctor` diagnoses the
133
+ // global install and is routinely run from a home directory or from a clone of an unrelated project;
134
+ // each prerequisite only exists where the file that creates it landed, so those files are the gates.
135
+ // Without them the warnings would describe a repository that either does not exist or never consumed
136
+ // kit, and would print enabling commands for someone else's repository. `init` and `sync` always run
137
+ // inside the project they just wrote those files into.
138
+ //
139
+ // The repository name is resolved once, and only when at least one report will use it: `doctor`
140
+ // writes nothing, so the bounded lookup is the right one, and spawning it for a repository with no
141
+ // prerequisite at all would be a network call with nothing to report.
142
+ function report_repository_settings(git: GitTopLevel): void {
143
+ const scope = resolve_gate_scope(git)
144
+ if (scope === undefined) return
145
+ const applicable = resolve_applicable(scope)
146
+ if (!applicable.security_updates && !applicable.auto_merge) return
147
+
148
+ report_applicable_settings(
149
+ applicable,
150
+ gh_spawn.get_repo_name_with_owner_within(REPO_LOOKUP_TIMEOUT_MS),
151
+ )
152
+ }
153
+
154
+ // The discovery map, printed for whichever repository `doctor` is standing in. Nothing is printed
155
+ // from outside a repository: discovery is anchored on the current repository's own owner, so without
156
+ // one there is no map to be right or wrong about (joshuafolkken/kit#869).
157
+ function report_repository_map(git: GitTopLevel): void {
158
+ if (git.state !== 'inside') return
159
+
160
+ const map = repo_discovery.discover_repositories(git.top_level)
161
+
162
+ console.info('')
163
+ console.info(doctor_logic.format_repository_map(map))
164
+ }
165
+
166
+ // Each discovered repository's port seed and the ports it resolves to, and any seed shared by more
167
+ // than one of them (joshuafolkken/kit#1494). Anchored on the same map as `report_repository_map`, so
168
+ // it prints from inside a repository and nowhere else.
169
+ function report_port_seeds(git: GitTopLevel): void {
170
+ if (git.state !== 'inside') return
171
+
172
+ const map = repo_discovery.discover_repositories(git.top_level)
173
+
174
+ console.info('')
175
+ console.info(doctor_ports.report_port_seeds(map))
176
+ }
177
+
178
+ interface DoctorOptions {
179
+ is_fix: boolean
180
+ show_ports: boolean
181
+ }
182
+
183
+ function parse_options(argv: ReadonlyArray<string>): DoctorOptions {
184
+ return { is_fix: argv.includes(FIX_FLAG), show_ports: argv.includes(PORTS_FLAG) }
185
+ }
186
+
187
+ // The consumer checks run against the repository root when inside one, and against the working
188
+ // directory otherwise — the same best-available root the settings gate falls back to.
189
+ function consumer_root(git: GitTopLevel): string {
190
+ return git.state === 'inside' ? git.top_level : PROJECT_ROOT
191
+ }
192
+
193
+ // The port seed table is opt-in since joshuafolkken/kit#1930: it discovers every sibling repository
194
+ // and was the slowest, least diagnostic part of the default output. `--ports` brings it back.
195
+ function run_reports(ctx: DoctorContext, git: GitTopLevel, options: DoctorOptions): void {
196
+ print_report(ctx)
197
+ report_path_diagnosis(ctx, options.is_fix)
198
+ doctor_consumer.report_consumer_setup(consumer_root(git))
199
+ report_repository_map(git)
200
+ if (options.show_ports) report_port_seeds(git)
201
+ report_repository_settings(git)
202
+ }
203
+
204
+ function main(): void {
205
+ const options = parse_options(process.argv)
206
+ const ctx = gather_context()
207
+
208
+ // Resolved once and shared: `doctor` is what a user runs when things are already broken, and a
209
+ // second `git rev-parse` would add a second timeout to a command whose whole contract is to stay
210
+ // responsive when git itself is hanging (joshuafolkken/kit#805).
211
+ const git = doctor_io.resolve_git_top_level()
212
+
213
+ run_reports(ctx, git, options)
214
+ }
215
+
216
+ if (process.argv[1] === fileURLToPath(import.meta.url)) main()
217
+
218
+ const doctor = {
219
+ gather_context,
220
+ print_report,
221
+ reclaim_shim,
222
+ handle_shadow,
223
+ parse_options,
224
+ consumer_root,
225
+ run_reports,
226
+ report_repository_map,
227
+ report_port_seeds,
228
+ main,
229
+ }
230
+
231
+ export type { DoctorContext }
232
+ export { doctor }
@@ -0,0 +1,48 @@
1
+ // What a `backlogrun` parent reads, and what that trims from a full read (joshuafolkken/kit#2256).
2
+ //
3
+ // **The parent is the scheduler, and it never implements.** It reads `backlog:next`, dispatches each
4
+ // child in its own delegated `fullrun` unit, opens lanes, runs the progress watcher and the hand-off,
5
+ // and parks a child that cannot finish (`backlogrun.md` step 1: "Claim nothing at the entry — this
6
+ // parent orchestrates and never implements"). So the `SKILL.md` sections only an *implementing* entry
7
+ // uses are read at the section level rather than whole, exactly as the worker trims its own read
8
+ // (`lane-child-read-set.ts`) — through the shared `read-set-trim`.
9
+ //
10
+ // **This is a different set from the worker's.** The parent keeps §0 (its session-cut / resume
11
+ // paragraph is the parent's own), §2b (the parent's whole job is the epic-child delegation §2b
12
+ // defines), §2c (the parent is the entry that receives an `owner/repo#` prefix), §2e and §2i (the
13
+ // parent files prerequisites and observations for the batch) — all of which the worker drops. What the
14
+ // parent drops is the implementer-only set below. **The parent owns every point-of-use document**, so
15
+ // unlike the worker it drops none of them: the trim is the `SKILL.md` sections alone.
16
+
17
+ import type { ReadSetCost } from './entry-read-set'
18
+ import { read_set_trim } from './read-set-trim'
19
+
20
+ const BACKLOGRUN = 'backlogrun'
21
+
22
+ // **The `SKILL.md` sections the `backlogrun` parent never uses.** The parent has no `new` entry, so it
23
+ // names no `into` target (§2a); it claims no working tree, a dispatched child does that in its own
24
+ // unit (§2f, `backlogrun.md:47-49`); it implements nothing, so it reads no Issue's comments before
25
+ // implementing (§2g); and it edits no rule mid-run (§3, read only on an editing turn).
26
+ const UNUSED_SKILL_SECTIONS: ReadonlyArray<string> = [
27
+ '2a. The `into <target>` suffix — where the new Issue lands',
28
+ '2f. The working-tree hold — one run per tree',
29
+ "2g. An Issue's comments are part of the Issue",
30
+ '3. What stays resident, and what is read from here',
31
+ ]
32
+
33
+ // The parent runs every point-of-use document itself — child dispatch, lanes, the progress watcher,
34
+ // the park — so it drops none. Named empty so the shared trim reads the same shape as the worker's.
35
+ const SKIPPED_POINT_OF_USE: ReadonlySet<string> = new Set<string>()
36
+
37
+ function costed(root: string): ReadSetCost {
38
+ return read_set_trim.costed(root, {
39
+ base_entry: BACKLOGRUN,
40
+ label: BACKLOGRUN,
41
+ unused_skill_sections: UNUSED_SKILL_SECTIONS,
42
+ skipped_point_of_use: SKIPPED_POINT_OF_USE,
43
+ })
44
+ }
45
+
46
+ const backlogrun_parent_read_set = { BACKLOGRUN, UNUSED_SKILL_SECTIONS, costed }
47
+
48
+ export { backlogrun_parent_read_set }
@@ -0,0 +1,45 @@
1
+ // The character cap a Bash result is truncated at, read from the settings file rather than restated
2
+ // (joshuafolkken/kit#1797). Every entry-read document is larger than it, so a `cat` of one hands back
3
+ // a middle-truncated preview and the file is then read a second time — the two wasted requests #1797
4
+ // measured. A number copied into code would be a second declaration of the cap and would drift the
5
+ // first time the settings changed; the harness's own default stands in only where the file declares
6
+ // nothing. Split out of `entry-read-set.ts` in joshuafolkken/kit#2161 to keep that file under its
7
+ // line ceiling.
8
+
9
+ import path from 'node:path'
10
+ import { document_section } from './document-section'
11
+
12
+ const SETTINGS_FILE = path.join('.claude', 'settings.json')
13
+ const HARNESS_DEFAULT_CAP_CHARS = 30_000
14
+ const ENV_KEY = 'env'
15
+ const CAP_KEY = 'BASH_MAX_OUTPUT_LENGTH'
16
+ const NONE = 0
17
+
18
+ function property_of(value: unknown, key: string): unknown {
19
+ if (typeof value !== 'object' || value === null) return undefined
20
+
21
+ return Reflect.get(value, key)
22
+ }
23
+
24
+ // **Parsed as JSON rather than matched in the raw text.** A regular expression takes the first
25
+ // occurrence anywhere in the file, so a hook command string naming the variable would win over the
26
+ // `env` block — and the report would then mark a file `cat`-able that a `cat` truncates. A file that
27
+ // is missing or does not parse answers `undefined` and falls through to the harness default below.
28
+ function declared_cap(text: string): unknown {
29
+ try {
30
+ return property_of(property_of(JSON.parse(text), ENV_KEY), CAP_KEY)
31
+ } catch {
32
+ return undefined
33
+ }
34
+ }
35
+
36
+ function bash_output_cap(root: string): number {
37
+ const text = document_section.read_optional(path.join(root, SETTINGS_FILE)) ?? ''
38
+ const chars = Number(declared_cap(text))
39
+
40
+ return Number.isSafeInteger(chars) && chars > NONE ? chars : HARNESS_DEFAULT_CAP_CHARS
41
+ }
42
+
43
+ const bash_output_cap_reader = { HARNESS_DEFAULT_CAP_CHARS, bash_output_cap }
44
+
45
+ export { bash_output_cap_reader }
@@ -0,0 +1,183 @@
1
+ // The byte ceiling for every agent-read document NO entry reads — the fallback budget, a ratchet.
2
+ //
3
+ // **This is now the secondary budget** (joshuafolkken/kit#2257). The primary one is the entry total
4
+ // (`entry-read-budget.ts`): a document a workflow entry reads is held by that entry's total and
5
+ // carries no ceiling here, so neither budget holds it twice. What is left for this list is the
6
+ // documents no entry reads — the reference documents a human browses, drawn by
7
+ // `document-reachability.ts` from `read:set`'s output rather than by a hand-written table.
8
+ //
9
+ // Agent-read documents (`.claude/skills/**/*.md`, `prompts/**/*.md` and `docs/josh-commands.md`) have
10
+ // been shrunk by reduction epics (joshuafolkken/kit#1929, joshuafolkken/kit#1924) only to swell
11
+ // again, because nothing held the reduced size — a PR that adds a few lines at a time goes unseen
12
+ // until the next reduction epic. This list is that hold for the unreached ones:
13
+ // `document-byte-budget.test.ts` fails `pnpm josh gate` when such a document grows past its recorded
14
+ // ceiling, when the list names a file that no longer exists, or when an unreached file has no entry
15
+ // here.
16
+ //
17
+ // THE RECORDED CEILING IS BLOCK-QUANTIZED — this is what stops parallel command-adding lanes from
18
+ // serializing on this file (joshuafolkken/kit#2231). Each entry's `bytes` is not the document's exact
19
+ // size but the smallest multiple of `BLOCK_BYTES` at or above it, and that value IS the ceiling. A
20
+ // document that grows within its current block needs no edit here, so most command-adding PRs leave
21
+ // this file untouched rather than bumping a shared line; a document that crosses a block boundary
22
+ // bumps to the next multiple — the same value from every lane, an identical change git auto-merges,
23
+ // not a hand-picked slack unit two branches fight over. Growth is still bounded: the block is the
24
+ // whole of a document's headroom, so it cannot swell without a visible, deterministic bump in the
25
+ // diff. This replaced the earlier exact-size-plus-512-slack ratchet, whose tight slack forced
26
+ // `docs/josh-commands.md` — pinned at its ceiling — to bump on every command addition, the
27
+ // serialization point #2231 removed. It also retired the bespoke `JOSH_COMMANDS_CEILING_BYTES` hard
28
+ // cap and its per-bump changelog comment: the uniform block ratchet now holds that document like any
29
+ // other, so the second cap was a second line to bump for no added hold.
30
+ //
31
+ // HOW TO RAISE (or LOWER) A CEILING — this file is the only place, on purpose. When the gate reports a
32
+ // document over its ceiling, copy the exact value the message names (the next block multiple) into
33
+ // that document's entry, in the same PR, so the reason for the growth is visible in the diff a
34
+ // reviewer reads. A reduction epic that shrinks a document below a block lowers its entry the same
35
+ // way, to the multiple the stale-ratchet message names. Do NOT widen `BLOCK_BYTES` to dodge a bump —
36
+ // that loosens every ceiling at once, which is the opposite of the ratchet's purpose.
37
+ //
38
+ // It is a list of records rather than a path-keyed object because file paths are not valid object
39
+ // property names under the naming-convention lint rule.
40
+
41
+ interface DocumentBudget {
42
+ path: string
43
+ bytes: number
44
+ }
45
+
46
+ // The quantization block. A recorded ceiling is a multiple of this, so a document growing within a
47
+ // block needs no edit and one crossing a boundary bumps to the same next multiple from every lane —
48
+ // the property that keeps parallel lanes from conflicting on this file. Kept small enough that the
49
+ // ratchet still holds growth tightly: the block is the entire headroom a document has before its next
50
+ // deterministic bump. Widening it to dodge a bump is the workaround the ratchet exists to forbid, so
51
+ // its value is pinned by a test.
52
+ const BLOCK_BYTES = 4096
53
+
54
+ // The smallest multiple of `BLOCK_BYTES` at or above `size` — the recorded ceiling for a document of
55
+ // that size. Two lanes that grow the same document into the same block compute the same ceiling, so
56
+ // the edit they both make is identical and merges cleanly; a document growing within its block
57
+ // computes the ceiling it already has, so it needs no edit at all.
58
+ function block_ceiling(size: number): number {
59
+ return Math.ceil(size / BLOCK_BYTES) * BLOCK_BYTES
60
+ }
61
+
62
+ // Recorded byte ceiling of each unreached document — the block multiple at or above its size. Must
63
+ // name exactly the documents `document_reachability.unreached_documents()` derives: the test fails on
64
+ // a stale entry (a file that no longer exists or that an entry now reads) and on an un-budgeted
65
+ // unreached file, so the definition cannot rot as documents move on or off the execution path.
66
+ const DOCUMENT_BYTE_BUDGET: ReadonlyArray<DocumentBudget> = [
67
+ { path: '.claude/skills/dependency-update/SKILL.md', bytes: 8192 },
68
+ { path: '.claude/skills/epic-commands/SKILL.md', bytes: 32_768 },
69
+ { path: '.claude/skills/verify-ui/SKILL.md', bytes: 8192 },
70
+ { path: '.claude/skills/workflow-commands/followup-reference.md', bytes: 16_384 },
71
+ { path: '.claude/skills/workflow-commands/fullrun-steps.md', bytes: 8192 },
72
+ { path: '.claude/skills/workflow-commands/into-target.md', bytes: 4096 },
73
+ { path: '.claude/skills/workflow-commands/issue-comments.md', bytes: 8192 },
74
+ { path: '.claude/skills/workflow-commands/issue-fold-existing.md', bytes: 4096 },
75
+ { path: '.claude/skills/workflow-commands/needs-human-review.md', bytes: 8192 },
76
+ { path: '.claude/skills/workflow-commands/observation-filing.md', bytes: 28_672 },
77
+ // `pre-gate-cut.md` left this per-document budget in joshuafolkken/kit#2289: it became a point-of-use
78
+ // document, so its bytes are now held by every entry's total read (`entry-read-budget.ts`) and the
79
+ // two budgets must not hold it twice — the reachability line moved it from `unreached` to
80
+ // `point-of-use`.
81
+ { path: '.claude/skills/workflow-commands/prerequisite.md', bytes: 8192 },
82
+ { path: '.claude/skills/workflow-commands/rule-residency.md', bytes: 24_576 },
83
+ { path: '.claude/skills/workflow-commands/target-repository.md', bytes: 8192 },
84
+ { path: '.claude/skills/workflow-commands/working-tree-hold.md', bytes: 8192 },
85
+ { path: 'docs/josh-commands.md', bytes: 163_840 },
86
+ { path: 'prompts/agent-rules.md', bytes: 4096 },
87
+ { path: 'prompts/coding-standards.md', bytes: 16_384 },
88
+ { path: 'prompts/collaboration-workflow.md', bytes: 8192 },
89
+ { path: 'prompts/collaboration-workflow/consultation-vs-execution.md', bytes: 4096 },
90
+ { path: 'prompts/collaboration-workflow/cross-repo-epic.md', bytes: 8192 },
91
+ { path: 'prompts/collaboration-workflow/distributed-docs.md', bytes: 4096 },
92
+ { path: 'prompts/collaboration-workflow/durable-rules.md', bytes: 4096 },
93
+ { path: 'prompts/collaboration-workflow/epic-audit.md', bytes: 12_288 },
94
+ { path: 'prompts/collaboration-workflow/epic-bundle.md', bytes: 24_576 },
95
+ { path: 'prompts/collaboration-workflow/file-edits.md', bytes: 12_288 },
96
+ { path: 'prompts/collaboration-workflow/gh-rest.md', bytes: 8192 },
97
+ { path: 'prompts/collaboration-workflow/issue-citation.md', bytes: 8192 },
98
+ { path: 'prompts/collaboration-workflow/issue-template.md', bytes: 24_576 },
99
+ { path: 'prompts/collaboration-workflow/latest-first.md', bytes: 4096 },
100
+ { path: 'prompts/collaboration-workflow/no-clones.md', bytes: 4096 },
101
+ { path: 'prompts/collaboration-workflow/operating-rules.md', bytes: 24_576 },
102
+ { path: 'prompts/collaboration-workflow/output-bounds.md', bytes: 16_384 },
103
+ { path: 'prompts/collaboration-workflow/overview.md', bytes: 8192 },
104
+ { path: 'prompts/collaboration-workflow/plan-comment.md', bytes: 20_480 },
105
+ { path: 'prompts/collaboration-workflow/proposal-request.md', bytes: 4096 },
106
+ { path: 'prompts/collaboration-workflow/report-format.md', bytes: 28_672 },
107
+ { path: 'prompts/collaboration-workflow/residency.md', bytes: 20_480 },
108
+ { path: 'prompts/collaboration-workflow/rule-delivery.md', bytes: 57_344 },
109
+ { path: 'prompts/collaboration-workflow/shell-body.md', bytes: 12_288 },
110
+ { path: 'prompts/collaboration-workflow/simplicity-first.md', bytes: 4096 },
111
+ { path: 'prompts/collaboration-workflow/single-source-rules.md', bytes: 4096 },
112
+ { path: 'prompts/collaboration-workflow/turn-batching.md', bytes: 24_576 },
113
+ { path: 'prompts/collaboration-workflow/upstream-interrupt.md', bytes: 12_288 },
114
+ { path: 'prompts/collaboration-workflow/wip-cap.md', bytes: 20_480 },
115
+ { path: 'prompts/refactoring.md', bytes: 8192 },
116
+ { path: 'prompts/review-rubric.md', bytes: 20_480 },
117
+ { path: 'prompts/review.md', bytes: 20_480 },
118
+ { path: 'prompts/sonar-hotspot-handling.md', bytes: 8192 },
119
+ { path: 'prompts/testing-guide.md', bytes: 20_480 },
120
+ ]
121
+
122
+ // The recorded ceiling for one path, or undefined when it carries no budget entry.
123
+ function recorded_bytes_for(relative_path: string): number | undefined {
124
+ return DOCUMENT_BYTE_BUDGET.find((entry) => entry.path === relative_path)?.bytes
125
+ }
126
+
127
+ // The bytes an entry has left before its ceiling — the recorded ceiling minus the document's current
128
+ // size. Negative when the document is already over. `josh bytes` prints it as the headroom before an
129
+ // edit, the same number `josh lines` prints for code lines (joshuafolkken/kit#2176).
130
+ function remaining_bytes(recorded_bytes: number, current_bytes: number): number {
131
+ return recorded_bytes - current_bytes
132
+ }
133
+
134
+ // The failure message the size test raises — names the file, its current byte size, its recorded
135
+ // ceiling, and where to raise it (this file), per the acceptance criteria.
136
+ //
137
+ // **It names the exact value to record**: the recorded ceiling is the block multiple at or above the
138
+ // document's size, so the number to write is `block_ceiling(current)` — a reader raising the ceiling
139
+ // copies it rather than computing it by hand. Two lanes that both cross into the same block copy the
140
+ // same value, so the edit they make merges without conflict.
141
+ function over_budget_message(
142
+ relative_path: string,
143
+ current_bytes: number,
144
+ recorded_bytes: number,
145
+ ): string {
146
+ const ceiling = recorded_bytes.toString()
147
+ const current = current_bytes.toString()
148
+ const next = block_ceiling(current_bytes).toString()
149
+ const raise_hint = `raise its recorded size to ${next} in scripts/document/document-byte-budget.ts so the reason shows in the PR diff`
150
+
151
+ return `${relative_path} is ${current} bytes, over its ${ceiling}-byte ceiling. Shrink the document, or ${raise_hint}.`
152
+ }
153
+
154
+ // The failure message the staleness test raises. A recorded ceiling more than a block above the
155
+ // document's actual size is a stale-loose ratchet: the document shrank across a block boundary and
156
+ // its record was never lowered, so the ceiling no longer holds the reduction (the drift
157
+ // joshuafolkken/kit#2125 swept). It names the file, its recorded ceiling, its actual size, and the
158
+ // block multiple to lower the record to.
159
+ function stale_budget_message(
160
+ relative_path: string,
161
+ recorded_bytes: number,
162
+ current_bytes: number,
163
+ ): string {
164
+ const recorded = recorded_bytes.toString()
165
+ const current = current_bytes.toString()
166
+ const next = block_ceiling(current_bytes).toString()
167
+ const lower_hint = `lower its recorded size to ${next} in scripts/document/document-byte-budget.ts so the ratchet holds the reduction`
168
+
169
+ return `${relative_path} records ${recorded} bytes but is ${current}, more than a block above actual. ${lower_hint}.`
170
+ }
171
+
172
+ const document_byte_budget = {
173
+ DOCUMENT_BYTE_BUDGET,
174
+ BLOCK_BYTES,
175
+ block_ceiling,
176
+ over_budget_message,
177
+ recorded_bytes_for,
178
+ remaining_bytes,
179
+ stale_budget_message,
180
+ }
181
+
182
+ export type { DocumentBudget }
183
+ export { document_byte_budget }
@@ -0,0 +1,131 @@
1
+ import { existsSync, statSync } from 'node:fs'
2
+ import path from 'node:path'
3
+ import { document_byte_budget } from './document-byte-budget'
4
+ import { document_reachability } from './document-reachability'
5
+ import { entry_read_budget } from './entry-read-budget'
6
+
7
+ // The byte-ceiling check the gate's `document-byte-budget.test.ts` runs, made reachable on the fast
8
+ // between-edits path — `josh lint:related` calls it over the files it already resolved so a mandated
9
+ // documentation update that grows a document past its ceiling is caught in seconds rather than after
10
+ // the 80–90-second gate (joshuafolkken/kit#2176). The ceiling and its message are
11
+ // `document-byte-budget.ts`'s alone: this adds no budget of its own, so the fast path can never hold
12
+ // a different line from the gate, and widening one can never loosen the other.
13
+ //
14
+ // **It reads no change of its own.** `lint:related` has already resolved which files the change
15
+ // touched; taking that same list keeps the check inside the lint command's git contract — no second
16
+ // reading, and none at all when the caller narrowed by explicit arguments.
17
+
18
+ const LABEL = 'byte budget'
19
+
20
+ // The over-ceiling message given a size that is already known — the recorded value and the current
21
+ // size are handed in, so the decision is pure and tested without a filesystem or a budget lookup. A
22
+ // path with no budget entry (`recorded` undefined) is out of scope: the budget names exactly the
23
+ // agent-read documents, and everything else is not this check's to hold.
24
+ function ceiling_message(
25
+ relative_path: string,
26
+ current_bytes: number,
27
+ recorded_bytes: number | undefined,
28
+ ): string | undefined {
29
+ if (recorded_bytes === undefined) return undefined
30
+ if (current_bytes <= recorded_bytes) return undefined
31
+
32
+ return document_byte_budget.over_budget_message(relative_path, current_bytes, recorded_bytes)
33
+ }
34
+
35
+ // The same decision for an absolute path the caller resolved: its budget looked up by the
36
+ // repository-relative spelling, its size read from disk. A path with no budget entry, or one the
37
+ // tree no longer holds, is not over budget.
38
+ function over_budget_for(root: string, absolute_path: string): string | undefined {
39
+ const relative_path = path.relative(root, absolute_path)
40
+ const recorded = document_byte_budget.recorded_bytes_for(relative_path)
41
+ if (recorded === undefined || !existsSync(absolute_path)) return undefined
42
+
43
+ return ceiling_message(relative_path, statSync(absolute_path).size, recorded)
44
+ }
45
+
46
+ // Every over-ceiling message across the resolved file list, in the order the files came in.
47
+ function over_budget_messages(
48
+ root: string,
49
+ absolute_files: ReadonlyArray<string>,
50
+ ): ReadonlyArray<string> {
51
+ return absolute_files
52
+ .map((absolute_path) => over_budget_for(root, absolute_path))
53
+ .filter((message): message is string => message !== undefined)
54
+ }
55
+
56
+ // The entry-total counterpart: an entry over its recorded ceiling. This is the primary budget
57
+ // (joshuafolkken/kit#2257), so an edit to a covered document — which grows an entry's total, not a
58
+ // per-document ceiling — is caught here on the same fast path. Stale ceilings are left to the gate's
59
+ // `entry-read-budget.test.ts`, exactly as the per-document staleness is: this path blocks growth.
60
+ function entry_over_budget_message(root: string, entry: string): string | undefined {
61
+ const recorded = entry_read_budget.recorded_bytes_for(entry)
62
+ if (recorded === undefined) return undefined
63
+
64
+ const current = entry_read_budget.entry_total_bytes(root, entry)
65
+ if (current <= recorded) return undefined
66
+
67
+ return entry_read_budget.over_budget_message(entry, current, recorded)
68
+ }
69
+
70
+ function entry_over_budget_messages(root: string): ReadonlyArray<string> {
71
+ return entry_read_budget.ENTRY_READ_BUDGET.map((entry) =>
72
+ entry_over_budget_message(root, entry.entry),
73
+ ).filter((message): message is string => message !== undefined)
74
+ }
75
+
76
+ // Whether the change touches a document some entry reads. A covered document's edit moves an entry
77
+ // total rather than a per-document ceiling, so the entry check runs only when one is in scope.
78
+ function touches_covered(root: string, absolute_files: ReadonlyArray<string>): boolean {
79
+ const covered = new Set(document_reachability.covered_documents(root))
80
+
81
+ return absolute_files.some((absolute_path) => covered.has(path.relative(root, absolute_path)))
82
+ }
83
+
84
+ // Prints one labelled line per over-ceiling message and answers non-zero, or stays silent and
85
+ // answers zero when nothing is over budget.
86
+ function report(messages: ReadonlyArray<string>): number {
87
+ if (messages.length === 0) return 0
88
+
89
+ const lines = messages.map((message) => `${LABEL}: ${message}`)
90
+
91
+ process.stdout.write(`${lines.join('\n')}\n`)
92
+
93
+ return 1
94
+ }
95
+
96
+ // The check over a resolved change — every over-ceiling document among the files the caller narrowed
97
+ // by, plus the entry totals when the change touches a document some entry reads.
98
+ function check_files(root: string, absolute_files: ReadonlyArray<string>): number {
99
+ const entry_messages = touches_covered(root, absolute_files)
100
+ ? entry_over_budget_messages(root)
101
+ : []
102
+
103
+ return report([...over_budget_messages(root, absolute_files), ...entry_messages])
104
+ }
105
+
106
+ // The check the caller runs when its scope widened to the whole tree (`mode === 'all'`) instead of a
107
+ // resolved change. `lint:related`'s own fallback lints a superset of the change, so the byte check
108
+ // widens to the whole budget rather than an empty file list — otherwise the fallback would report
109
+ // success on a tree it never read for bytes, and the green record the caller then writes would vouch
110
+ // for a byte dimension it never checked (joshuafolkken/kit#2176).
111
+ function check_all(root: string): number {
112
+ const absolute_files = document_byte_budget.DOCUMENT_BYTE_BUDGET.map((entry) =>
113
+ path.join(root, entry.path),
114
+ )
115
+
116
+ return report([
117
+ ...over_budget_messages(root, absolute_files),
118
+ ...entry_over_budget_messages(root),
119
+ ])
120
+ }
121
+
122
+ const document_byte_check = {
123
+ ceiling_message,
124
+ check_all,
125
+ check_files,
126
+ entry_over_budget_messages,
127
+ over_budget_for,
128
+ over_budget_messages,
129
+ }
130
+
131
+ export { document_byte_check }