@aussieljk/forkbook 0.0.0-stage → 0.0.1-2

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 (598) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +77 -2
  3. package/assets/addon-vitest/templates/vitest.config.4.template.ts +36 -0
  4. package/assets/browser/favicon-wrapper.svg +46 -0
  5. package/assets/browser/favicon.svg +1 -0
  6. package/assets/browser/nunito-sans-bold-italic.woff2 +0 -0
  7. package/assets/browser/nunito-sans-bold.woff2 +0 -0
  8. package/assets/browser/nunito-sans-italic.woff2 +0 -0
  9. package/assets/browser/nunito-sans-regular.woff2 +0 -0
  10. package/assets/builder-vite/iframe.html +99 -0
  11. package/assets/create/rendererAssets/.eslintrc.json +16 -0
  12. package/assets/create/rendererAssets/common/Configure.mdx +388 -0
  13. package/assets/create/rendererAssets/common/assets/accessibility.png +0 -0
  14. package/assets/create/rendererAssets/common/assets/accessibility.svg +1 -0
  15. package/assets/create/rendererAssets/common/assets/addon-library.png +0 -0
  16. package/assets/create/rendererAssets/common/assets/assets.png +0 -0
  17. package/assets/create/rendererAssets/common/assets/avif-test-image.avif +0 -0
  18. package/assets/create/rendererAssets/common/assets/context.png +0 -0
  19. package/assets/create/rendererAssets/common/assets/discord.svg +1 -0
  20. package/assets/create/rendererAssets/common/assets/docs.png +0 -0
  21. package/assets/create/rendererAssets/common/assets/figma-plugin.png +0 -0
  22. package/assets/create/rendererAssets/common/assets/github.svg +1 -0
  23. package/assets/create/rendererAssets/common/assets/share.png +0 -0
  24. package/assets/create/rendererAssets/common/assets/styling.png +0 -0
  25. package/assets/create/rendererAssets/common/assets/testing.png +0 -0
  26. package/assets/create/rendererAssets/common/assets/theming.png +0 -0
  27. package/assets/create/rendererAssets/common/assets/tutorials.svg +1 -0
  28. package/assets/create/rendererAssets/common/assets/youtube.svg +1 -0
  29. package/assets/create/rendererAssets/common/button.css +30 -0
  30. package/assets/create/rendererAssets/common/header.css +32 -0
  31. package/assets/create/rendererAssets/common/page.css +68 -0
  32. package/assets/create/templates/react-native/index.expo.js +20 -0
  33. package/assets/create/templates/react-native/index.js +25 -0
  34. package/assets/docs/addon-backgrounds.gif +0 -0
  35. package/assets/docs/addon-controls-args-annotated.png +0 -0
  36. package/assets/docs/addon-controls-args-background-color.png +0 -0
  37. package/assets/docs/addon-controls-args-background-string.png +0 -0
  38. package/assets/docs/addon-controls-args-docs.png +0 -0
  39. package/assets/docs/addon-controls-args-logging.png +0 -0
  40. package/assets/docs/addon-controls-args-no-annotation.png +0 -0
  41. package/assets/docs/addon-controls-args-reflow-slider.png +0 -0
  42. package/assets/docs/addon-controls-args-reflow.png +0 -0
  43. package/assets/docs/addon-controls-args-template.png +0 -0
  44. package/assets/docs/addon-controls-expanded.png +0 -0
  45. package/assets/docs/addon-controls-hero.gif +0 -0
  46. package/assets/docs/addon-controls-install.png +0 -0
  47. package/assets/docs/hero.gif +0 -0
  48. package/assets/docs/highlight.png +0 -0
  49. package/assets/docs/message-reference.png +0 -0
  50. package/assets/docs/viewport.png +0 -0
  51. package/assets/react-native/metro-env.d.ts +69 -0
  52. package/assets/server/addon.tsconfig.json +6 -0
  53. package/assets/server/base-preview-body.html +116 -0
  54. package/assets/server/base-preview-head.html +494 -0
  55. package/assets/server/openBrowser.applescript +94 -0
  56. package/assets/server/template.ejs +87 -0
  57. package/dist/.build-stamp +0 -0
  58. package/dist/_browser-chunks/Color-PCLE2J36.js +1025 -0
  59. package/dist/_browser-chunks/DocsRenderer-JXND3PVQ.js +10 -0
  60. package/dist/_browser-chunks/WithTooltip-XSQFTBMB.js +1619 -0
  61. package/dist/_browser-chunks/chunk-2JDQ35OA.js +247 -0
  62. package/dist/_browser-chunks/chunk-2JT76G3E.js +104 -0
  63. package/dist/_browser-chunks/chunk-2MEPHP35.js +17 -0
  64. package/dist/_browser-chunks/chunk-2SCZVUKW.js +24 -0
  65. package/dist/_browser-chunks/chunk-46Z7NGAS.js +41 -0
  66. package/dist/_browser-chunks/chunk-4ATQOMJB.js +30 -0
  67. package/dist/_browser-chunks/chunk-52CW7FF7.js +49 -0
  68. package/dist/_browser-chunks/chunk-5I7E4GMO.js +62 -0
  69. package/dist/_browser-chunks/chunk-5P4QA6MY.js +20 -0
  70. package/dist/_browser-chunks/chunk-5WMXI5GW.js +816 -0
  71. package/dist/_browser-chunks/chunk-66OCZ54D.js +2604 -0
  72. package/dist/_browser-chunks/chunk-6SXYJQST.js +253 -0
  73. package/dist/_browser-chunks/chunk-AYRF6EJB.js +36 -0
  74. package/dist/_browser-chunks/chunk-B4AUNNU4.js +156 -0
  75. package/dist/_browser-chunks/chunk-BCP2FFXF.js +369 -0
  76. package/dist/_browser-chunks/chunk-C3D4HEFY.js +3396 -0
  77. package/dist/_browser-chunks/chunk-CFAOWGL7.js +43 -0
  78. package/dist/_browser-chunks/chunk-CFWWCCZV.js +223 -0
  79. package/dist/_browser-chunks/chunk-CNED6RYH.js +18 -0
  80. package/dist/_browser-chunks/chunk-DRQKCCAG.js +136 -0
  81. package/dist/_browser-chunks/chunk-ECQ75MKQ.js +0 -0
  82. package/dist/_browser-chunks/chunk-EIYAKDGP.js +302 -0
  83. package/dist/_browser-chunks/chunk-ENKK74N4.js +12 -0
  84. package/dist/_browser-chunks/chunk-FENFYI4X.js +698 -0
  85. package/dist/_browser-chunks/chunk-FJGWSWL5.js +155 -0
  86. package/dist/_browser-chunks/chunk-FVSEPWWX.js +2810 -0
  87. package/dist/_browser-chunks/chunk-GNZY6LOW.js +10116 -0
  88. package/dist/_browser-chunks/chunk-IE4ULIOQ.js +14 -0
  89. package/dist/_browser-chunks/chunk-IMSF75WX.js +42 -0
  90. package/dist/_browser-chunks/chunk-IWQGIXJS.js +14 -0
  91. package/dist/_browser-chunks/chunk-JMC7AIKT.js +108 -0
  92. package/dist/_browser-chunks/chunk-JPUOQJUI.js +8 -0
  93. package/dist/_browser-chunks/chunk-JSBKXXXF.js +218 -0
  94. package/dist/_browser-chunks/chunk-JWSKPMPC.js +73 -0
  95. package/dist/_browser-chunks/chunk-JYVGARBG.js +2943 -0
  96. package/dist/_browser-chunks/chunk-KBK7GKBN.js +35 -0
  97. package/dist/_browser-chunks/chunk-KQ7CRO2B.js +108 -0
  98. package/dist/_browser-chunks/chunk-LAWXTSXK.js +18 -0
  99. package/dist/_browser-chunks/chunk-LE2LTDW3.js +14 -0
  100. package/dist/_browser-chunks/chunk-LEVSOOLQ.js +48 -0
  101. package/dist/_browser-chunks/chunk-LV5PIKV4.js +93 -0
  102. package/dist/_browser-chunks/chunk-MDOL7KML.js +56 -0
  103. package/dist/_browser-chunks/chunk-MFMDGWP6.js +34 -0
  104. package/dist/_browser-chunks/chunk-MLBOOZL4.js +67 -0
  105. package/dist/_browser-chunks/chunk-NQUD4B7H.js +91 -0
  106. package/dist/_browser-chunks/chunk-NULBREPZ.js +43 -0
  107. package/dist/_browser-chunks/chunk-NZMVUW5T.js +7 -0
  108. package/dist/_browser-chunks/chunk-OD6IBQCC.js +117 -0
  109. package/dist/_browser-chunks/chunk-ODVJ3XZJ.js +157 -0
  110. package/dist/_browser-chunks/chunk-OQWFVDIN.js +386 -0
  111. package/dist/_browser-chunks/chunk-OVH3USFB.js +20 -0
  112. package/dist/_browser-chunks/chunk-OZZPSYQR.js +14 -0
  113. package/dist/_browser-chunks/chunk-P6PK47TQ.js +1970 -0
  114. package/dist/_browser-chunks/chunk-PFRNG3UC.js +22 -0
  115. package/dist/_browser-chunks/chunk-PJSMZ27A.js +13 -0
  116. package/dist/_browser-chunks/chunk-QC4HFS6K.js +41 -0
  117. package/dist/_browser-chunks/chunk-QDXFODK4.js +274 -0
  118. package/dist/_browser-chunks/chunk-RBCHTR7C.js +28 -0
  119. package/dist/_browser-chunks/chunk-RMYQ3QN3.js +294 -0
  120. package/dist/_browser-chunks/chunk-RNTIV5CE.js +411 -0
  121. package/dist/_browser-chunks/chunk-RSPAQWVJ.js +80 -0
  122. package/dist/_browser-chunks/chunk-S6TK43XQ.js +836 -0
  123. package/dist/_browser-chunks/chunk-SC67XZST.js +18 -0
  124. package/dist/_browser-chunks/chunk-SFVA4SBT.js +683 -0
  125. package/dist/_browser-chunks/chunk-SZYFOQMT.js +25 -0
  126. package/dist/_browser-chunks/chunk-TBJCJXK4.js +18 -0
  127. package/dist/_browser-chunks/chunk-UMDO3KB7.js +205 -0
  128. package/dist/_browser-chunks/chunk-V2G23FV7.js +11 -0
  129. package/dist/_browser-chunks/chunk-V5M7Q4HT.js +88 -0
  130. package/dist/_browser-chunks/chunk-W5M6NPS3.js +198 -0
  131. package/dist/_browser-chunks/chunk-W7NE2JXW.js +84 -0
  132. package/dist/_browser-chunks/chunk-WGVAAM43.js +1110 -0
  133. package/dist/_browser-chunks/chunk-WHQRNHXD.js +8 -0
  134. package/dist/_browser-chunks/chunk-WOSOWBCA.js +12 -0
  135. package/dist/_browser-chunks/chunk-WZ7KR7SH.js +85 -0
  136. package/dist/_browser-chunks/chunk-YEKO6BHJ.js +20 -0
  137. package/dist/_browser-chunks/chunk-YI2IBIQS.js +7 -0
  138. package/dist/_browser-chunks/chunk-YTIT5NA5.js +1966 -0
  139. package/dist/_browser-chunks/chunk-ZEHRUHTA.js +6 -0
  140. package/dist/_browser-chunks/chunk-ZTQ5MEJ5.js +203 -0
  141. package/dist/_browser-chunks/matchers-YLBYSYAF.js +1263 -0
  142. package/dist/_browser-chunks/react-dom-client-4OHE3QDV.js +9 -0
  143. package/dist/_node-chunks/attached-runtime-I2G4WLJI.js +282 -0
  144. package/dist/_node-chunks/builder-manager-VVHYQXCH.js +1661 -0
  145. package/dist/_node-chunks/chunk-2BUPBPFB.js +82 -0
  146. package/dist/_node-chunks/chunk-2DSIDINN.js +884 -0
  147. package/dist/_node-chunks/chunk-2RU7BKEW.js +23 -0
  148. package/dist/_node-chunks/chunk-34EO2PUT.js +26 -0
  149. package/dist/_node-chunks/chunk-3BKIBF5S.js +3008 -0
  150. package/dist/_node-chunks/chunk-3SDUYDXH.js +98 -0
  151. package/dist/_node-chunks/chunk-3T4ZSNPH.js +662 -0
  152. package/dist/_node-chunks/chunk-3W7F2B7P.js +79 -0
  153. package/dist/_node-chunks/chunk-3Y6AAY5H.js +80 -0
  154. package/dist/_node-chunks/chunk-42UWAGPW.js +1193 -0
  155. package/dist/_node-chunks/chunk-4FEANXWU.js +1986 -0
  156. package/dist/_node-chunks/chunk-5DQFEZEA.js +40 -0
  157. package/dist/_node-chunks/chunk-6KEHV53S.js +1218 -0
  158. package/dist/_node-chunks/chunk-6LMWA44H.js +3837 -0
  159. package/dist/_node-chunks/chunk-6YKBRP72.js +20 -0
  160. package/dist/_node-chunks/chunk-7GUDZVRQ.js +110 -0
  161. package/dist/_node-chunks/chunk-B5J7Q7J4.js +21 -0
  162. package/dist/_node-chunks/chunk-BS2WMZMR.js +90 -0
  163. package/dist/_node-chunks/chunk-BSKFCWQD.js +47 -0
  164. package/dist/_node-chunks/chunk-BXVYT7SB.js +36 -0
  165. package/dist/_node-chunks/chunk-CCOTJ4FC.js +688 -0
  166. package/dist/_node-chunks/chunk-CQKMLL5J.js +33 -0
  167. package/dist/_node-chunks/chunk-CXRU72ET.js +63 -0
  168. package/dist/_node-chunks/chunk-DC7DKR5K.js +20 -0
  169. package/dist/_node-chunks/chunk-DHJFTB4K.js +25 -0
  170. package/dist/_node-chunks/chunk-DUR55DJJ.js +1094 -0
  171. package/dist/_node-chunks/chunk-E6YESGLX.js +7032 -0
  172. package/dist/_node-chunks/chunk-EHUNOMDD.js +52345 -0
  173. package/dist/_node-chunks/chunk-ET7PWEO7.js +298 -0
  174. package/dist/_node-chunks/chunk-EWOX7HPJ.js +20 -0
  175. package/dist/_node-chunks/chunk-F3ZFKBHY.js +844 -0
  176. package/dist/_node-chunks/chunk-FK7KGTV7.js +26 -0
  177. package/dist/_node-chunks/chunk-FPZB5OI7.js +35 -0
  178. package/dist/_node-chunks/chunk-FW2HQUBQ.js +25 -0
  179. package/dist/_node-chunks/chunk-FY6UXW6G.js +11 -0
  180. package/dist/_node-chunks/chunk-GEFQN7K3.js +499 -0
  181. package/dist/_node-chunks/chunk-GRBLDJCR.js +989 -0
  182. package/dist/_node-chunks/chunk-H32DYT6P.js +87 -0
  183. package/dist/_node-chunks/chunk-H4PPVMP5.js +23 -0
  184. package/dist/_node-chunks/chunk-HMP2G23X.js +25 -0
  185. package/dist/_node-chunks/chunk-ICPBH3E7.js +59 -0
  186. package/dist/_node-chunks/chunk-IDEL2J23.js +23 -0
  187. package/dist/_node-chunks/chunk-IK4FGZLR.js +223 -0
  188. package/dist/_node-chunks/chunk-JDXXX6LB.js +68 -0
  189. package/dist/_node-chunks/chunk-JGGFYIG5.js +5468 -0
  190. package/dist/_node-chunks/chunk-JPAZLYJ3.js +29 -0
  191. package/dist/_node-chunks/chunk-JZOO7GGC.js +48 -0
  192. package/dist/_node-chunks/chunk-KISMCCP5.js +4744 -0
  193. package/dist/_node-chunks/chunk-LCK4ZQKG.js +115 -0
  194. package/dist/_node-chunks/chunk-LO56I6E2.js +132 -0
  195. package/dist/_node-chunks/chunk-LXBD4UL4.js +104 -0
  196. package/dist/_node-chunks/chunk-MA24JW6C.js +7162 -0
  197. package/dist/_node-chunks/chunk-MK2KYAI6.js +5414 -0
  198. package/dist/_node-chunks/chunk-NDWKJ4CL.js +2102 -0
  199. package/dist/_node-chunks/chunk-NIBT7XDZ.js +168 -0
  200. package/dist/_node-chunks/chunk-NPO45IMH.js +33 -0
  201. package/dist/_node-chunks/chunk-OISX4AGQ.js +414 -0
  202. package/dist/_node-chunks/chunk-OUW6R7C3.js +26 -0
  203. package/dist/_node-chunks/chunk-OWNFOGTA.js +194 -0
  204. package/dist/_node-chunks/chunk-Q7QNUM5H.js +49 -0
  205. package/dist/_node-chunks/chunk-QEQLR22M.js +1877 -0
  206. package/dist/_node-chunks/chunk-RRN2V55B.js +45 -0
  207. package/dist/_node-chunks/chunk-RWFIFGO5.js +144 -0
  208. package/dist/_node-chunks/chunk-RXNJDRGO.js +209 -0
  209. package/dist/_node-chunks/chunk-RZMQ7S3L.js +92 -0
  210. package/dist/_node-chunks/chunk-SIEXZVCR.js +51 -0
  211. package/dist/_node-chunks/chunk-SLWQNBGO.js +2034 -0
  212. package/dist/_node-chunks/chunk-SVTBJ7Q3.js +35 -0
  213. package/dist/_node-chunks/chunk-SWO5CDYU.js +32 -0
  214. package/dist/_node-chunks/chunk-TD5PLLQG.js +121 -0
  215. package/dist/_node-chunks/chunk-TEQGGSP7.js +33 -0
  216. package/dist/_node-chunks/chunk-TFCEV2XX.js +155 -0
  217. package/dist/_node-chunks/chunk-TFEWM4E3.js +1073 -0
  218. package/dist/_node-chunks/chunk-TINO74G5.js +21 -0
  219. package/dist/_node-chunks/chunk-TNJIXE37.js +40 -0
  220. package/dist/_node-chunks/chunk-TWI4GVH7.js +19 -0
  221. package/dist/_node-chunks/chunk-U5W53R2J.js +1011 -0
  222. package/dist/_node-chunks/chunk-UBOGWBEA.js +148 -0
  223. package/dist/_node-chunks/chunk-UMUBKI6E.js +3787 -0
  224. package/dist/_node-chunks/chunk-UVINFLGY.js +56 -0
  225. package/dist/_node-chunks/chunk-V2DY426G.js +1133 -0
  226. package/dist/_node-chunks/chunk-VLOXOXXE.js +45 -0
  227. package/dist/_node-chunks/chunk-W4OMYLSP.js +1297 -0
  228. package/dist/_node-chunks/chunk-WAXVSN3O.js +18 -0
  229. package/dist/_node-chunks/chunk-WCULS5TP.js +3767 -0
  230. package/dist/_node-chunks/chunk-WNZ2UMFM.js +153 -0
  231. package/dist/_node-chunks/chunk-WZJF2OUH.js +74 -0
  232. package/dist/_node-chunks/chunk-XGIUVY52.js +611 -0
  233. package/dist/_node-chunks/chunk-XHL2LVBM.js +415 -0
  234. package/dist/_node-chunks/chunk-XI6B6P47.js +59 -0
  235. package/dist/_node-chunks/chunk-XLP2ZKXV.js +60 -0
  236. package/dist/_node-chunks/chunk-YCMRA6RX.js +95 -0
  237. package/dist/_node-chunks/chunk-YZFWBA5L.js +2700 -0
  238. package/dist/_node-chunks/chunk-ZMAMXQKP.js +4731 -0
  239. package/dist/_node-chunks/chunk-ZWBCQ4MJ.js +110 -0
  240. package/dist/_node-chunks/dist-VTSTZKUB.js +16 -0
  241. package/dist/_node-chunks/globby-OEMHPBFY.js +2884 -0
  242. package/dist/_node-chunks/jiti-NFX6UU74.js +3848 -0
  243. package/dist/_node-chunks/lib-MDVARD7W.js +366 -0
  244. package/dist/_node-chunks/local-runtime-NTKIN2QT.js +78 -0
  245. package/dist/_node-chunks/mdx-plugin-MWISDWDQ.js +5680 -0
  246. package/dist/_node-chunks/monorepo-LIRFMQXE.js +121 -0
  247. package/dist/_node-chunks/monorepo-optimized-tests-relaxed-limits-no-story-deletion-CPDW4XTW.js +121 -0
  248. package/dist/_node-chunks/optimized-tests-HDOLR3EY.js +22 -0
  249. package/dist/_node-chunks/pattern-copy-play-EKHIUAU2.js +807 -0
  250. package/dist/_node-chunks/postinstallAddon-GYGMWDL6.js +20 -0
  251. package/dist/_node-chunks/rehype-external-links-BUN3HUCO.js +121 -0
  252. package/dist/_node-chunks/rehype-slug-PLADX223.js +52 -0
  253. package/dist/_node-chunks/relaxed-limits-GBHW6KIQ.js +117 -0
  254. package/dist/_node-chunks/run-KDTIZNSY.js +103 -0
  255. package/dist/_node-chunks/run-NL66VTNR.js +4532 -0
  256. package/dist/_node-chunks/session-id-KIIVOQLR.js +23 -0
  257. package/dist/_node-chunks/setup-MGC7BQO6.js +278 -0
  258. package/dist/_node-chunks/vitest.config.4.template-JH2THZFG.js +54 -0
  259. package/dist/actions/decorator.d.ts +7 -0
  260. package/dist/actions/decorator.js +43 -0
  261. package/dist/actions/index.d.ts +67 -0
  262. package/dist/actions/index.js +28 -0
  263. package/dist/addon-a11y/index.d.ts +52 -0
  264. package/dist/addon-a11y/index.js +16 -0
  265. package/dist/addon-a11y/manager.js +1429 -0
  266. package/dist/addon-a11y/preset.js +18 -0
  267. package/dist/addon-a11y/preview.d.ts +17 -0
  268. package/dist/addon-a11y/preview.js +15 -0
  269. package/dist/addon-docs/blocks.d.ts +1061 -0
  270. package/dist/addon-docs/blocks.js +2461 -0
  271. package/dist/addon-docs/index.d.ts +236 -0
  272. package/dist/addon-docs/index.js +16 -0
  273. package/dist/addon-docs/manager.js +90 -0
  274. package/dist/addon-docs/mdx-react-shim.d.ts +1 -0
  275. package/dist/addon-docs/mdx-react-shim.js +2 -0
  276. package/dist/addon-docs/preset.js +378 -0
  277. package/dist/addon-docs/preview.d.ts +4 -0
  278. package/dist/addon-docs/preview.js +7 -0
  279. package/dist/addon-links/index.d.ts +22 -0
  280. package/dist/addon-links/index.js +20 -0
  281. package/dist/addon-links/manager.js +14 -0
  282. package/dist/addon-links/preview.d.ts +6 -0
  283. package/dist/addon-links/preview.js +9 -0
  284. package/dist/addon-links/react/index.d.ts +25 -0
  285. package/dist/addon-links/react/index.js +52 -0
  286. package/dist/addon-mcp/preset.js +1345 -0
  287. package/dist/addon-mcp/preview.js +29 -0
  288. package/dist/addon-mcp/tools/preview-stories/preview-stories-app-script.js +1153 -0
  289. package/dist/addon-ondevice-actions/index.d.ts +4 -0
  290. package/dist/addon-ondevice-actions/index.js +7 -0
  291. package/dist/addon-ondevice-actions/register.js +7 -0
  292. package/dist/addon-ondevice-controls/index.d.ts +6 -0
  293. package/dist/addon-ondevice-controls/index.js +14 -0
  294. package/dist/addon-ondevice-controls/register.js +10 -0
  295. package/dist/addon-pseudo-states/index.d.ts +35 -0
  296. package/dist/addon-pseudo-states/index.js +15 -0
  297. package/dist/addon-pseudo-states/manager.js +53 -0
  298. package/dist/addon-pseudo-states/preview.d.ts +9 -0
  299. package/dist/addon-pseudo-states/preview.js +10 -0
  300. package/dist/addon-themes/index.d.ts +80 -0
  301. package/dist/addon-themes/index.js +104 -0
  302. package/dist/addon-themes/manager.js +97 -0
  303. package/dist/addon-themes/postinstall.js +33 -0
  304. package/dist/addon-themes/preview.d.ts +6 -0
  305. package/dist/addon-themes/preview.js +8 -0
  306. package/dist/addon-vitest/constants.d.ts +132 -0
  307. package/dist/addon-vitest/constants.js +66 -0
  308. package/dist/addon-vitest/index.d.ts +4 -0
  309. package/dist/addon-vitest/index.js +8 -0
  310. package/dist/addon-vitest/manager.js +665 -0
  311. package/dist/addon-vitest/node/coverage-reporter.js +1284 -0
  312. package/dist/addon-vitest/node/vitest.js +674 -0
  313. package/dist/addon-vitest/postinstall.js +24 -0
  314. package/dist/addon-vitest/preset.js +943 -0
  315. package/dist/addon-vitest/vitest-plugin/global-setup.js +162 -0
  316. package/dist/addon-vitest/vitest-plugin/index.d.ts +56 -0
  317. package/dist/addon-vitest/vitest-plugin/index.js +463 -0
  318. package/dist/addon-vitest/vitest-plugin/setup-file-with-project-annotations.js +9 -0
  319. package/dist/addon-vitest/vitest-plugin/setup-file.browser.4.js +20 -0
  320. package/dist/addon-vitest/vitest-plugin/setup-file.js +50 -0
  321. package/dist/addon-vitest/vitest-plugin/test-utils.js +128 -0
  322. package/dist/babel/index.d.ts +2301 -0
  323. package/dist/babel/index.js +61 -0
  324. package/dist/backgrounds/index.d.ts +6 -0
  325. package/dist/backgrounds/index.js +15 -0
  326. package/dist/bin/core.js +1705 -0
  327. package/dist/bin/dispatcher.js +43 -0
  328. package/dist/bin/loader.js +115 -0
  329. package/dist/builder-vite/index.d.ts +50 -0
  330. package/dist/builder-vite/index.js +245 -0
  331. package/dist/builder-vite/preset.js +27 -0
  332. package/dist/channels/index.d.ts +2 -0
  333. package/dist/channels/index.js +352 -0
  334. package/dist/chunk-B2t1tGRh.d.ts +284 -0
  335. package/dist/chunk-BCoJQE-f.d.ts +602 -0
  336. package/dist/chunk-BGkgZp-H.d.ts +214 -0
  337. package/dist/chunk-BTVrWliM.d.ts +115 -0
  338. package/dist/chunk-BXLImeLy.d.ts +197 -0
  339. package/dist/chunk-BfBzpgct.d.ts +916 -0
  340. package/dist/chunk-Bpi2tz-6.d.ts +511 -0
  341. package/dist/chunk-BxWufQms.d.ts +142 -0
  342. package/dist/chunk-C-bavsOH.d.ts +34 -0
  343. package/dist/chunk-C2p5r3Vt.d.ts +13001 -0
  344. package/dist/chunk-C6PAgHLT.d.ts +12 -0
  345. package/dist/chunk-CMeX4WRe.d.ts +179 -0
  346. package/dist/chunk-Ct9xd6IM.d.ts +65 -0
  347. package/dist/chunk-CwQKNaYL.d.ts +15 -0
  348. package/dist/chunk-D7DwV41f.d.ts +3622 -0
  349. package/dist/chunk-DEVFdzxR.d.ts +253 -0
  350. package/dist/chunk-DaVb55-_.d.ts +124 -0
  351. package/dist/chunk-DgRNfmj_.d.ts +40 -0
  352. package/dist/chunk-DoIGKY33.d.ts +666 -0
  353. package/dist/chunk-Dr3R0DXk.d.ts +40 -0
  354. package/dist/chunk-DtHByo32.d.ts +55 -0
  355. package/dist/chunk-Dw1z1Pki.d.ts +933 -0
  356. package/dist/chunk-DzuY9DXg.d.ts +79 -0
  357. package/dist/chunk-FjDVzZTj.d.ts +62 -0
  358. package/dist/chunk-Kt1tW-D1.d.ts +59 -0
  359. package/dist/chunk-XP8oHzpE.d.ts +6 -0
  360. package/dist/chunk-gCX81nOr.d.ts +61 -0
  361. package/dist/chunk-pcFXCimE.d.ts +741 -0
  362. package/dist/cli/index.d.ts +1174 -0
  363. package/dist/cli/index.js +5613 -0
  364. package/dist/cli/skills/content/index.d.ts +72 -0
  365. package/dist/cli/skills/content/index.js +335 -0
  366. package/dist/cli/tools/sdk/child-host.d.ts +61 -0
  367. package/dist/cli/tools/sdk/child-host.js +131 -0
  368. package/dist/cli/tools/sdk/index.d.ts +137 -0
  369. package/dist/cli/tools/sdk/index.js +44 -0
  370. package/dist/cli-commands/bin/index.js +25 -0
  371. package/dist/client-logger/index.d.ts +31 -0
  372. package/dist/client-logger/index.js +63 -0
  373. package/dist/common/index.d.ts +1103 -0
  374. package/dist/common/index.js +364 -0
  375. package/dist/components/index.d.ts +1924 -0
  376. package/dist/components/index.js +13759 -0
  377. package/dist/core-events/index.d.ts +155 -0
  378. package/dist/core-events/index.js +136 -0
  379. package/dist/core-server/index.d.ts +2200 -0
  380. package/dist/core-server/index.js +4165 -0
  381. package/dist/core-server/presets/common-manager.css +170 -0
  382. package/dist/core-server/presets/common-manager.js +4168 -0
  383. package/dist/core-server/presets/common-override-preset.js +81 -0
  384. package/dist/core-server/presets/common-preset.js +2187 -0
  385. package/dist/create/bin/index.js +23 -0
  386. package/dist/create/index.js +25 -0
  387. package/dist/csf/csf-utils.d.ts +2 -0
  388. package/dist/csf/csf-utils.js +19 -0
  389. package/dist/csf/index.d.ts +7 -0
  390. package/dist/csf/index.js +2142 -0
  391. package/dist/csf-tools/index.d.ts +1157 -0
  392. package/dist/csf-tools/index.js +736 -0
  393. package/dist/docs-tools/index.d.ts +197 -0
  394. package/dist/docs-tools/index.js +61 -0
  395. package/dist/highlight/index.d.ts +10 -0
  396. package/dist/highlight/index.js +15 -0
  397. package/dist/instrumenter/index.d.ts +113 -0
  398. package/dist/instrumenter/index.js +2595 -0
  399. package/dist/manager/_manager-chunks/globals-runtime-8HkdnU2F.js +6144 -0
  400. package/dist/manager/_manager-chunks/globals-runtime-BIKBO23x.js +3389 -0
  401. package/dist/manager/_manager-chunks/globals-runtime-BdGkqNEt.js +45 -0
  402. package/dist/manager/_manager-chunks/globals-runtime-BmphMP6z.js +1190 -0
  403. package/dist/manager/_manager-chunks/globals-runtime-BvM-NY2g.js +13307 -0
  404. package/dist/manager/_manager-chunks/globals-runtime-C02fvgcd.js +9243 -0
  405. package/dist/manager/_manager-chunks/globals-runtime-DkAPXCvc.js +9766 -0
  406. package/dist/manager/_manager-chunks/globals-runtime-DpNYC-qi.js +5564 -0
  407. package/dist/manager/_manager-chunks/globals-runtime-DtcOnYHR.js +5357 -0
  408. package/dist/manager/_manager-chunks/globals-runtime-DwFqpqya.js +722 -0
  409. package/dist/manager/_manager-chunks/globals-runtime-FC201B7s.js +6837 -0
  410. package/dist/manager/_manager-chunks/globals-runtime-Rp_zjGnh.js +121 -0
  411. package/dist/manager/_manager-chunks/globals-runtime-ZHrQFa3-.js +10463 -0
  412. package/dist/manager/_manager-chunks/globals-runtime-eLPTIfX-.js +7759 -0
  413. package/dist/manager/_manager-chunks/globals-runtime-qKvCZHFY.js +4468 -0
  414. package/dist/manager/_manager-chunks/globals-runtime-sGpNlIJ1.js +5102 -0
  415. package/dist/manager/_manager-chunks/runtime-B1L9TH89.js +452 -0
  416. package/dist/manager/_manager-chunks/runtime-BK0zF7FN.js +22 -0
  417. package/dist/manager/_manager-chunks/runtime-BhkT2CXl.js +1408 -0
  418. package/dist/manager/_manager-chunks/runtime-Bly6WJLN.js +998 -0
  419. package/dist/manager/_manager-chunks/runtime-D0UOWx0U.js +979 -0
  420. package/dist/manager/_manager-chunks/runtime-D94Vq3oR.js +4014 -0
  421. package/dist/manager/_manager-chunks/runtime-DMig8mT7.js +77 -0
  422. package/dist/manager/_manager-chunks/runtime-EITvVbkG.js +46 -0
  423. package/dist/manager/_manager-chunks/runtime-cp5pazY2.js +8936 -0
  424. package/dist/manager/_manager-chunks/runtime-eDVAYF7N.js +6860 -0
  425. package/dist/manager/_manager-chunks/runtime-i-PDAHLR.js +2493 -0
  426. package/dist/manager/globals-runtime.js +2 -0
  427. package/dist/manager/globals.d.ts +23 -0
  428. package/dist/manager/globals.js +26 -0
  429. package/dist/manager/manager-stores.d.ts +2 -0
  430. package/dist/manager/manager-stores.js +19 -0
  431. package/dist/manager/runtime.js +2 -0
  432. package/dist/manager-api/index.d.ts +2 -0
  433. package/dist/manager-api/index.js +3257 -0
  434. package/dist/manager-errors.d.ts +89 -0
  435. package/dist/manager-errors.js +20 -0
  436. package/dist/mcp/index.d.ts +270 -0
  437. package/dist/mcp/index.js +305 -0
  438. package/dist/mocking-utils/index.d.ts +689 -0
  439. package/dist/mocking-utils/index.js +521 -0
  440. package/dist/mocking-utils/mocker-runtime.js +1254 -0
  441. package/dist/nextjs-vite/config/preview.js +3 -0
  442. package/dist/nextjs-vite/export-mocks/cache/index.d.ts +25 -0
  443. package/dist/nextjs-vite/export-mocks/cache/index.js +29 -0
  444. package/dist/nextjs-vite/export-mocks/headers/index.d.ts +37 -0
  445. package/dist/nextjs-vite/export-mocks/headers/index.js +54 -0
  446. package/dist/nextjs-vite/export-mocks/link/index.d.ts +9 -0
  447. package/dist/nextjs-vite/export-mocks/link/index.js +59 -0
  448. package/dist/nextjs-vite/export-mocks/navigation/index.d.ts +28 -0
  449. package/dist/nextjs-vite/export-mocks/navigation/index.js +58 -0
  450. package/dist/nextjs-vite/export-mocks/router/index.d.ts +34 -0
  451. package/dist/nextjs-vite/export-mocks/router/index.js +63 -0
  452. package/dist/nextjs-vite/index.d.ts +92 -0
  453. package/dist/nextjs-vite/index.js +58 -0
  454. package/dist/nextjs-vite/node/index.d.ts +6 -0
  455. package/dist/nextjs-vite/node/index.js +20 -0
  456. package/dist/nextjs-vite/preset.js +648 -0
  457. package/dist/nextjs-vite/preview.d.ts +20 -0
  458. package/dist/nextjs-vite/preview.js +11 -0
  459. package/dist/nextjs-vite/vite-plugin/index.d.ts +6 -0
  460. package/dist/nextjs-vite/vite-plugin/index.js +19 -0
  461. package/dist/nextjs-vite-plugin/index.d.ts +28 -0
  462. package/dist/nextjs-vite-plugin/index.js +923 -0
  463. package/dist/nextjs-vite-plugin/mocks/storybook.global.js +29 -0
  464. package/dist/nextjs-vite-plugin/plugins/next-image/alias/image-context.js +8 -0
  465. package/dist/nextjs-vite-plugin/plugins/next-image/alias/image-default-loader.js +23 -0
  466. package/dist/nextjs-vite-plugin/plugins/next-image/alias/next-image.js +28 -0
  467. package/dist/nextjs-vite-plugin/plugins/next-image/alias/next-legacy-image.js +17 -0
  468. package/dist/nextjs-vite-plugin/plugins/next-mocks/alias/cache/index.js +29 -0
  469. package/dist/nextjs-vite-plugin/plugins/next-mocks/alias/dynamic/index.js +40 -0
  470. package/dist/nextjs-vite-plugin/plugins/next-mocks/alias/headers/index.js +55 -0
  471. package/dist/nextjs-vite-plugin/plugins/next-mocks/alias/link/index.js +63 -0
  472. package/dist/nextjs-vite-plugin/plugins/next-mocks/alias/navigation/index.js +71 -0
  473. package/dist/nextjs-vite-plugin/plugins/next-mocks/alias/router/index.js +74 -0
  474. package/dist/nextjs-vite-plugin/plugins/next-mocks/alias/rsc/server-only.js +7 -0
  475. package/dist/nextjs-vite-plugin/plugins/next-mocks/alias/safe-stable-stringify/index.js +13 -0
  476. package/dist/nextjs-vite-plugin/plugins/next-mocks/compatibility/draft-mode.compat.js +7 -0
  477. package/dist/node-logger/index.d.ts +495 -0
  478. package/dist/node-logger/index.js +42 -0
  479. package/dist/oxc-parser/index.d.ts +99 -0
  480. package/dist/oxc-parser/index.js +275 -0
  481. package/dist/oxc-parser/worker.js +37 -0
  482. package/dist/preview/_chunks/runtime-BIzIdDbb.js +10263 -0
  483. package/dist/preview/_chunks/runtime-BTPtVY1p.js +1102 -0
  484. package/dist/preview/_chunks/runtime-BZSnICCg.js +8484 -0
  485. package/dist/preview/_chunks/runtime-BdGkqNEt.js +45 -0
  486. package/dist/preview/_chunks/runtime-BwSxqk3t.js +63 -0
  487. package/dist/preview/_chunks/runtime-CqHxptiK.js +6143 -0
  488. package/dist/preview/_chunks/runtime-CsV4HZPV.js +5064 -0
  489. package/dist/preview/_chunks/runtime-CxZK_Ln3.js +284 -0
  490. package/dist/preview/_chunks/runtime-DZToXfvO.js +9767 -0
  491. package/dist/preview/_chunks/runtime-DrTjJkPY.js +3872 -0
  492. package/dist/preview/_chunks/runtime-DuHdxMFA.js +387 -0
  493. package/dist/preview/_chunks/runtime-iXdo8CR8.js +3635 -0
  494. package/dist/preview/_chunks/runtime-q3wt0e_N.js +6838 -0
  495. package/dist/preview/globals.d.ts +16 -0
  496. package/dist/preview/globals.js +20 -0
  497. package/dist/preview/runtime.js +6 -0
  498. package/dist/preview-api/index.d.ts +4 -0
  499. package/dist/preview-api/index.js +147 -0
  500. package/dist/preview-errors.d.ts +186 -0
  501. package/dist/preview-errors.js +56 -0
  502. package/dist/react/docgen/docgen-worker.js +38 -0
  503. package/dist/react/entry-preview-argtypes.js +9 -0
  504. package/dist/react/entry-preview-docs.js +12 -0
  505. package/dist/react/entry-preview-rsc.js +11 -0
  506. package/dist/react/entry-preview.js +21 -0
  507. package/dist/react/index.d.ts +119 -0
  508. package/dist/react/index.js +26 -0
  509. package/dist/react/preset.js +301 -0
  510. package/dist/react/preview.d.ts +2 -0
  511. package/dist/react/preview.js +11 -0
  512. package/dist/react-native/bin/get-stories.js +34 -0
  513. package/dist/react-native/index.d.ts +160 -0
  514. package/dist/react-native/index.js +1547 -0
  515. package/dist/react-native/metro/node.d.ts +83 -0
  516. package/dist/react-native/metro/node.js +21 -0
  517. package/dist/react-native/metro/withStorybook.d.ts +2269 -0
  518. package/dist/react-native/metro/withStorybook.js +138 -0
  519. package/dist/react-native/preview.d.ts +6 -0
  520. package/dist/react-native/preview.js +20 -0
  521. package/dist/react-native/scripts/generate.d.ts +22 -0
  522. package/dist/react-native/scripts/generate.js +18 -0
  523. package/dist/react-native/stub.js +20 -0
  524. package/dist/react-native-theming/index.d.ts +175 -0
  525. package/dist/react-native-theming/index.js +2591 -0
  526. package/dist/react-native-ui/index.d.ts +130 -0
  527. package/dist/react-native-ui/index.js +1448 -0
  528. package/dist/react-native-ui-common/index.d.ts +230 -0
  529. package/dist/react-native-ui-common/index.js +514 -0
  530. package/dist/react-vite/index.d.ts +4 -0
  531. package/dist/react-vite/index.js +8 -0
  532. package/dist/react-vite/node/index.d.ts +6 -0
  533. package/dist/react-vite/node/index.js +20 -0
  534. package/dist/react-vite/preset.d.ts +6 -0
  535. package/dist/react-vite/preset.js +21 -0
  536. package/dist/router/index.d.ts +141 -0
  537. package/dist/router/index.js +1217 -0
  538. package/dist/server-errors.d.ts +2 -0
  539. package/dist/server-errors.js +149 -0
  540. package/dist/shared/open-service/index.d.ts +3 -0
  541. package/dist/shared/open-service/index.js +115 -0
  542. package/dist/shared/open-service/services/docgen/worker/docgen-worker.js +75 -0
  543. package/dist/shared/open-service/toolsets/docs/public.d.ts +1296 -0
  544. package/dist/shared/open-service/toolsets/docs/public.js +991 -0
  545. package/dist/telemetry/index.d.ts +314 -0
  546. package/dist/telemetry/index.js +103 -0
  547. package/dist/test/index.d.ts +158 -0
  548. package/dist/test/index.js +19421 -0
  549. package/dist/theming/create.d.ts +15 -0
  550. package/dist/theming/create.js +11 -0
  551. package/dist/theming/index.d.ts +54 -0
  552. package/dist/theming/index.js +511 -0
  553. package/dist/types/index.d.ts +2 -0
  554. package/dist/types/index.js +48 -0
  555. package/dist/viewport/index.d.ts +275 -0
  556. package/dist/viewport/index.js +21 -0
  557. package/package.json +1054 -4
  558. package/template/nextjs-vite/cli/.eslintrc.json +6 -0
  559. package/template/nextjs-vite/cli/js/Button.jsx +42 -0
  560. package/template/nextjs-vite/cli/js/Button.stories.js +49 -0
  561. package/template/nextjs-vite/cli/js/Configure.mdx +470 -0
  562. package/template/nextjs-vite/cli/js/Header.jsx +58 -0
  563. package/template/nextjs-vite/cli/js/Header.stories.js +30 -0
  564. package/template/nextjs-vite/cli/js/Page.jsx +68 -0
  565. package/template/nextjs-vite/cli/js/Page.stories.js +28 -0
  566. package/template/nextjs-vite/cli/ts/Button.stories.ts +54 -0
  567. package/template/nextjs-vite/cli/ts/Button.tsx +39 -0
  568. package/template/nextjs-vite/cli/ts/Configure.mdx +446 -0
  569. package/template/nextjs-vite/cli/ts/Header.stories.ts +34 -0
  570. package/template/nextjs-vite/cli/ts/Header.tsx +54 -0
  571. package/template/nextjs-vite/cli/ts/Page.stories.ts +33 -0
  572. package/template/nextjs-vite/cli/ts/Page.tsx +73 -0
  573. package/template/react/cli/.eslintrc.json +5 -0
  574. package/template/react/cli/js/Button.jsx +39 -0
  575. package/template/react/cli/js/Button.stories.js +49 -0
  576. package/template/react/cli/js/Header.jsx +56 -0
  577. package/template/react/cli/js/Header.stories.js +29 -0
  578. package/template/react/cli/js/Page.jsx +69 -0
  579. package/template/react/cli/js/Page.stories.js +28 -0
  580. package/template/react/cli/ts/Button.stories.ts +54 -0
  581. package/template/react/cli/ts/Button.tsx +37 -0
  582. package/template/react/cli/ts/Header.stories.ts +34 -0
  583. package/template/react/cli/ts/Header.tsx +56 -0
  584. package/template/react/cli/ts/Page.stories.ts +33 -0
  585. package/template/react/cli/ts/Page.tsx +73 -0
  586. package/template/react-vite/cli/.eslintrc.json +5 -0
  587. package/template/react-vite/cli/js/Button.jsx +39 -0
  588. package/template/react-vite/cli/js/Button.stories.js +49 -0
  589. package/template/react-vite/cli/js/Header.jsx +56 -0
  590. package/template/react-vite/cli/js/Header.stories.js +29 -0
  591. package/template/react-vite/cli/js/Page.jsx +69 -0
  592. package/template/react-vite/cli/js/Page.stories.js +28 -0
  593. package/template/react-vite/cli/ts/Button.stories.ts +54 -0
  594. package/template/react-vite/cli/ts/Button.tsx +37 -0
  595. package/template/react-vite/cli/ts/Header.stories.ts +34 -0
  596. package/template/react-vite/cli/ts/Header.tsx +56 -0
  597. package/template/react-vite/cli/ts/Page.stories.ts +33 -0
  598. package/template/react-vite/cli/ts/Page.tsx +73 -0
@@ -0,0 +1,688 @@
1
+ import CJS_COMPAT_NODE_URL_ro17f80mg6k from 'node:url';
2
+ import CJS_COMPAT_NODE_PATH_ro17f80mg6k from 'node:path';
3
+ import CJS_COMPAT_NODE_MODULE_ro17f80mg6k from "node:module";
4
+
5
+ var __filename = CJS_COMPAT_NODE_URL_ro17f80mg6k.fileURLToPath(import.meta.url);
6
+ var __dirname = CJS_COMPAT_NODE_PATH_ro17f80mg6k.dirname(__filename);
7
+ var require = CJS_COMPAT_NODE_MODULE_ro17f80mg6k.createRequire(import.meta.url);
8
+
9
+ // ------------------------------------------------------------
10
+ // end of CJS compatibility banner, injected by Forkbook's esbuild configuration
11
+ // ------------------------------------------------------------
12
+ import {
13
+ getTypeImportSource
14
+ } from "./chunk-6YKBRP72.js";
15
+ import {
16
+ frameworkToRendererMap
17
+ } from "./chunk-B5J7Q7J4.js";
18
+
19
+ // src/cli/skills/content/setup-utils/is-react-project.ts
20
+ function isReactProject(projectInfo) {
21
+ return (projectInfo.rendererPackage ?? (projectInfo.framework ? frameworkToRendererMap[projectInfo.framework] : void 0)) === "@aussieljk/forkbook/react";
22
+ }
23
+
24
+ // src/cli/skills/content/setup-utils/ext.ts
25
+ function ext(language, jsx) {
26
+ return language === "ts" ? jsx ? "tsx" : "ts" : jsx ? "jsx" : "js";
27
+ }
28
+
29
+ // src/cli/skills/content/setup-utils/markdown.ts
30
+ import { dedent } from "ts-dedent";
31
+ function listRules(rules) {
32
+ return dedent`
33
+ ${rules.filter(Boolean).map((s, i) => `${i + 1}. ${s}`).join(`
34
+ `)}
35
+ `;
36
+ }
37
+ function listSteps(steps, options) {
38
+ let level = options?.level ?? 2, prefix = "#".repeat(level);
39
+ return dedent`
40
+ ${steps.filter(Boolean).map((step, i) => `${prefix} Step ${i + 1} \u2014 ${step.title}
41
+
42
+ ${step.body}`).join(`
43
+
44
+ `)}
45
+ `;
46
+ }
47
+ function listDOD(dods) {
48
+ return dedent`
49
+ ${dods.filter(Boolean).map((s) => `- ${s}`).join(`
50
+ `)}
51
+ `;
52
+ }
53
+
54
+ // src/cli/skills/content/setup-prompts/partials/dod.ts
55
+ import { getVitestStorybookRunCommand } from "@aussieljk/forkbook/internal/common";
56
+ import { dedent as dedent2 } from "ts-dedent";
57
+ function cssCheckDOD(ctx) {
58
+ return dedent2`**Exactly one \`CssCheck\` story exists** somewhere in the new stories, asserting a concrete computed style value read from the component's source.`;
59
+ }
60
+ function storyTagsV1DOD(ctx) {
61
+ return dedent2`Every story file you wrote that vitest confirmed passing has had \`'needs-work'\` stripped, leaving \`tags: ['ai-generated']\`. Anything still failing keeps \`['ai-generated', 'needs-work']\`.`;
62
+ }
63
+ function storyTagsV2DOD(ctx) {
64
+ return dedent2`Every story file that passes vitest tests has had \`'needs-work'\` stripped, leaving \`tags: ['ai-generated']\`. Story files with vitest failures keep \`['ai-generated', 'needs-work']\`.`;
65
+ }
66
+ function vitestPassesStrictDOD({ packageManager }) {
67
+ return dedent2`\`${getVitestStorybookRunCommand(packageManager)}\` passes for the new files.`;
68
+ }
69
+ function vitestPassesWhenExpectedDOD({ packageManager }) {
70
+ return dedent2`\`${getVitestStorybookRunCommand(packageManager)}\` passes for the new files that don't have \`'needs-work'\` in their tags. Files with \`'needs-work'\` may still fail.`;
71
+ }
72
+ function typeCheckPassesStrictDOD(ctx) {
73
+ return dedent2`The project's TypeScript check passes for changed files.`;
74
+ }
75
+ function typeCheckPassesWhenExpectedDOD(ctx) {
76
+ return dedent2`The project's TypeScript check passes for the new files that don't have \`'needs-work'\` in their tags. Files with \`'needs-work'\` may still fail.`;
77
+ }
78
+ function sharedPreviewDOD(ctx) {
79
+ return dedent2`The shared preview is strong enough that stories don't need per-story fetch/provider workarounds.`;
80
+ }
81
+ function optionalTestInfrastructureDOD(_ctx) {
82
+ return dedent2`MSW was added only if at least one selected story makes network requests, and MockDate only if at least one selected story depends on the current date or time. Each dependency you added is exercised by at least one verified story. Existing MSW or MockDate setup in the project is left in place.`;
83
+ }
84
+
85
+ // src/cli/skills/content/setup-prompts/partials/rules.ts
86
+ import { PackageManagerName } from "@aussieljk/forkbook/internal/common";
87
+ import { dedent as dedent3 } from "ts-dedent";
88
+ function nodeModuleReadsRule(ctx) {
89
+ return dedent3`**Never read or grep inside \`node_modules\`.** The imports shown in this prompt are correct — don't verify them by introspecting installed packages. If something seems off, re-read this prompt, not \`node_modules\`.`;
90
+ }
91
+ function monorepoRule({
92
+ monorepoType
93
+ }) {
94
+ if (monorepoType)
95
+ return `**${monorepoType} monorepo.** Don't initially look for config or existing Forkbook content in other packages. Start exploring from config and tooling local to the package where you are asked to set up Forkbook. If it uses local monorepo dependencies, build all dependencies found during discovery before writing stories or running tests.`;
96
+ }
97
+ function packageManagerRule({
98
+ packageManager,
99
+ packageManagerName
100
+ }) {
101
+ let storybookCmd = packageManager.getPackageCommand(["forkbook"]);
102
+ return packageManager.type === PackageManagerName.NPM ? dedent3`**Use \`npm\` for installs and \`${storybookCmd}\` for Forkbook/Vitest CLI commands** (detected from this project's lockfile).` : packageManagerName ? dedent3`**Use \`${packageManagerName}\` for installs and \`${storybookCmd}\` for Forkbook/Vitest CLI commands** (detected from this project's lockfile). Do not use \`npx\` — it invokes npm and fails when the repo enforces a different package manager.` : dedent3`**Detect the package manager once** from the lockfile (\`pnpm-lock.yaml\` → pnpm, \`yarn.lock\` → yarn, \`bun.lockb\` → bun, otherwise npm) and use it for every install and CLI command in this trial. Do not use \`npx\` when the project uses pnpm, yarn, or bun.`;
103
+ }
104
+ function editOverWriteRule({ configDir, tsx }) {
105
+ return dedent3`**Edit > Write.** For any file you've Read, use \`Edit\`. Use \`Write\` only for new files. The project already has a \`${configDir}/preview.${tsx}\` from \`forkbook init\` — **Edit** it, do not overwrite.`;
106
+ }
107
+ function keepUserWorkRule(ctx) {
108
+ return dedent3`**Keep the user's work.** Never delete, move, or rewrite the stories, components, or config that existed before you started; add to them instead. The only exception is the \`forkbook init\` examples described in the clean-up step.`;
109
+ }
110
+ function batchTestsRule(ctx) {
111
+ return dedent3`**Batch the test loop.** Write **all** stories first, then run vitest **once** across everything. No per-file vitest runs until after that first batch run reveals failures.`;
112
+ }
113
+ function readBudgetRule(ctx) {
114
+ return dedent3`**Read budget: ~12 files for discovery.** Before writing any code you may Read at most ~12 files (\`index.html\`, entry, App, providers, routing, root CSS, 2–3 representative pages/components, 1–2 hooks, 1 test). If you need more, summarize and move on.`;
115
+ }
116
+ function readBudgetRuleRelaxed(ctx) {
117
+ return dedent3`**Read budget: ~40 files for discovery.** Before writing any code you may Read at most ~40 files: \`index.html\`, entry, App, providers, routing, root CSS, 1–2 hooks, 1 test, and spend the rest on components. You may read direct component dependencies essential to their understanding only after having read 20 components (or all components if fewer in the codebase).`;
118
+ }
119
+ function preferSharedFixesRule({
120
+ configDir,
121
+ tsx
122
+ }) {
123
+ return dedent3`**Prefer fixing the shared \`${configDir}/preview.${tsx}\`** over story-local workarounds when multiple stories fail the same way.`;
124
+ }
125
+ function noPolishRule(ctx) {
126
+ return dedent3`**Stop when the success criteria are met** — don't keep polishing.`;
127
+ }
128
+
129
+ // src/cli/skills/content/setup-prompts/partials/steps.ts
130
+ import {
131
+ getMswInitCommand,
132
+ getVitestStorybookRunCommand as getVitestStorybookRunCommand2
133
+ } from "@aussieljk/forkbook/internal/common";
134
+ import { dedent as dedent5 } from "ts-dedent";
135
+
136
+ // src/cli/skills/content/setup-prompts/partials/examples.ts
137
+ import { dedent as dedent4 } from "ts-dedent";
138
+ function getPreviewExample(projectInfo) {
139
+ let { configDir, language, hasCsfFactoryPreview } = projectInfo, tsx = ext(language, isReactProject(projectInfo)), typeImport = getTypeImportSource(projectInfo), providerImport = isReactProject(projectInfo) ? "import { SessionProvider } from '../src/contexts/SessionContext';" : "", decorators = isReactProject(projectInfo) ? dedent4`
140
+ decorators: [
141
+ (Story) => (
142
+ <SessionProvider>
143
+ <Story />
144
+ </SessionProvider>
145
+ ),
146
+ ],
147
+ ` : "";
148
+ return hasCsfFactoryPreview ? dedent4`
149
+ \`\`\`${tsx}
150
+ // ${configDir}/preview.${tsx}
151
+ import { definePreview } from '${typeImport}';
152
+ import '../src/index.css';
153
+ // Only include MockDate when selected stories depend on the current date or time.
154
+ import MockDate from 'mockdate';
155
+ // Only include MSW when selected stories make network requests.
156
+ import addonMsw from 'msw-storybook-addon';
157
+ ${providerImport}
158
+ import { mswHandlers } from './msw-handlers';
159
+
160
+ export default definePreview({
161
+ addons: [addonMsw()],
162
+ ${decorators}
163
+ async beforeEach({ msw }) {
164
+ msw.use(...mswHandlers);
165
+ localStorage.setItem('theme', 'dark');
166
+ MockDate.set('2024-04-01T12:00:00Z');
167
+ },
168
+ });
169
+ \`\`\`
170
+ ` : language === "js" ? dedent4`
171
+ \`\`\`${tsx}
172
+ // ${configDir}/preview.${tsx}
173
+ import '../src/index.css';
174
+ // Only include MockDate when selected stories depend on the current date or time.
175
+ import MockDate from 'mockdate';
176
+ // Only include MSW when selected stories make network requests.
177
+ import { mswLoader } from 'msw-storybook-addon/csf3';
178
+ ${providerImport}
179
+ import { mswHandlers } from './msw-handlers';
180
+
181
+ const preview = {
182
+ ${decorators}
183
+ loaders: [mswLoader()],
184
+ async beforeEach({ msw }) {
185
+ msw.use(...mswHandlers);
186
+ localStorage.setItem('theme', 'dark');
187
+ MockDate.set('2024-04-01T12:00:00Z');
188
+ },
189
+ };
190
+
191
+ export default preview;
192
+ \`\`\`
193
+ ` : dedent4`
194
+ \`\`\`${tsx}
195
+ // ${configDir}/preview.${tsx}
196
+ import type { Preview } from '${typeImport}';
197
+ import '../src/index.css';
198
+ // Only include MockDate when selected stories depend on the current date or time.
199
+ import MockDate from 'mockdate';
200
+ // Only include MSW when selected stories make network requests.
201
+ import { mswLoader } from 'msw-storybook-addon/csf3';
202
+ ${providerImport}
203
+ import { mswHandlers } from './msw-handlers';
204
+
205
+ const preview: Preview = {
206
+ ${decorators}
207
+ loaders: [mswLoader()],
208
+ async beforeEach({ msw }) {
209
+ msw.use(...mswHandlers);
210
+ localStorage.setItem('theme', 'dark');
211
+ MockDate.set('2024-04-01T12:00:00Z');
212
+ },
213
+ };
214
+
215
+ export default preview;
216
+ \`\`\`
217
+ `;
218
+ }
219
+ function getPortalDecoratorExample(projectInfo) {
220
+ let { language } = projectInfo, tsx = ext(language, isReactProject(projectInfo));
221
+ return dedent4`
222
+ \`\`\`${tsx}
223
+ // Add this entry to the \`decorators\` array of your preview config:
224
+ (Story) => {
225
+ for (const id of ['modal-root', 'drawer-root', 'toast-root']) {
226
+ if (!document.getElementById(id)) {
227
+ const el = document.createElement('div');
228
+ el.id = id;
229
+ document.body.appendChild(el);
230
+ }
231
+ }
232
+ return ${isReactProject(projectInfo) ? "<Story />" : "Story()"};
233
+ }
234
+ \`\`\`
235
+ `;
236
+ }
237
+ function getMainConfigExample(projectInfo) {
238
+ let { configDir, language } = projectInfo, ts = ext(language, !1), typeImport = getTypeImportSource(projectInfo);
239
+ return language === "js" ? dedent4`
240
+ \`\`\`js
241
+ // ${configDir}/main.js
242
+ const config = { staticDirs: ['../public'] };
243
+ export default config;
244
+ \`\`\`
245
+ ` : dedent4`
246
+ \`\`\`${ts}
247
+ // ${configDir}/main.${ts}
248
+ import type { StorybookConfig } from '${typeImport}';
249
+
250
+ const config: StorybookConfig = { staticDirs: ['../public'] };
251
+ export default config;
252
+ \`\`\`
253
+ `;
254
+ }
255
+ function getStoryExample(projectInfo) {
256
+ if (!isReactProject(projectInfo))
257
+ return dedent4`
258
+ Follow existing stories and the installed framework's Component Story Format. Import the real component using the project's conventions and use its actual props or inputs as \`args\`. Use the framework's rendering syntax for composition, projected content, slots, and event bindings when needed.
259
+
260
+ For TypeScript, import \`Meta\` and \`StoryObj\` from '${getTypeImportSource(projectInfo)}' and use the type parameters supported by that framework. Add \`tags: ['ai-generated', 'needs-work']\` to the meta, then export story objects for the component's meaningful states. Include a \`play\` function only when it verifies behavior.
261
+ `;
262
+ let { language } = projectInfo, tsx = ext(language, isReactProject(projectInfo)), typeImport = getTypeImportSource(projectInfo);
263
+ return language === "js" ? dedent4`
264
+ \`\`\`${tsx}
265
+ import { expect } from '@aussieljk/forkbook/test';
266
+ import { Button } from './Button';
267
+
268
+ const meta = {
269
+ component: Button,
270
+ tags: ['ai-generated', 'needs-work'], // strip 'needs-work' once vitest passes
271
+ };
272
+
273
+ export default meta;
274
+
275
+ // Smoke check — one is enough per file
276
+ export const Primary = {
277
+ args: { children: 'Order now' },
278
+ play: async ({ canvas }) => {
279
+ await expect(canvas.getByRole('button', { name: /order now/i })).toBeVisible();
280
+ },
281
+ };
282
+
283
+ // Variant-only stories: no play needed
284
+ export const Clear = { args: { children: 'Cancel', clear: true } };
285
+ export const Large = { args: { children: 'Checkout', large: true } };
286
+ export const WithIcon = { args: { icon: 'cart', 'aria-label': 'food cart' } };
287
+ \`\`\`
288
+ ` : dedent4`
289
+ \`\`\`${tsx}
290
+ import type { Meta, StoryObj } from '${typeImport}';
291
+ import { expect } from '@aussieljk/forkbook/test';
292
+ import { Button } from './Button';
293
+
294
+ const meta = {
295
+ component: Button,
296
+ tags: ['ai-generated', 'needs-work'], // strip 'needs-work' once vitest passes
297
+ } satisfies Meta<typeof Button>;
298
+
299
+ export default meta;
300
+ type Story = StoryObj<typeof meta>;
301
+
302
+ // Smoke check — one is enough per file
303
+ export const Primary: Story = {
304
+ args: { children: 'Order now' },
305
+ play: async ({ canvas }) => {
306
+ await expect(canvas.getByRole('button', { name: /order now/i })).toBeVisible();
307
+ },
308
+ };
309
+
310
+ // Variant-only stories: no play needed
311
+ export const Clear: Story = { args: { children: 'Cancel', clear: true } };
312
+ export const Large: Story = { args: { children: 'Checkout', large: true } };
313
+ export const WithIcon: Story = { args: { icon: 'cart', 'aria-label': 'food cart' } };
314
+ \`\`\`
315
+ `;
316
+ }
317
+ function getInteractionPlayExample(projectInfo) {
318
+ let { language } = projectInfo, tsx = ext(language, isReactProject(projectInfo));
319
+ return dedent4`
320
+ \`\`\`${tsx}
321
+ export const FilledForm${language === "ts" ? ": Story" : ""} = {
322
+ play: async ({ canvas, userEvent }) => {
323
+ await userEvent.type(canvas.getByLabelText('email'), 'a@b.com', { delay: 50 });
324
+ await userEvent.click(canvas.getByRole('button', { name: /submit/i }));
325
+ await expect(await canvas.findByText(/welcome/i)).toBeVisible();
326
+ },
327
+ };
328
+ \`\`\`
329
+ `;
330
+ }
331
+
332
+ // src/cli/skills/content/setup-prompts/partials/steps.ts
333
+ function discoveryStepStrict(projectInfo, { tsx }) {
334
+ let isReact = isReactProject(projectInfo);
335
+ return {
336
+ title: "Discover the runtime (\u226412 reads)",
337
+ body: dedent5`
338
+ Identify, in this order:
339
+
340
+ - \`index.html\` — \`<link rel="stylesheet">\` tags, inline \`<style>\` blocks, fonts, and any \`<div id="...">\` mount or portal roots that aren't created by JS
341
+ - ${isReact ? `entry file (\`main.${tsx}\` / \`index.${tsx}\`) \u2014 providers wrapping \`<App />\`, root CSS imports` : "application entry file \u2014 framework initialization, shared services or providers, root CSS imports"}
342
+ - ${isReact ? `\`App.${tsx}\` \u2014 top-level layout, router usage, providers it consumes` : "root component \u2014 top-level layout, router usage, shared state and services it consumes"}
343
+ - ${isReact ? "providers / context files \u2014 what they expose" : "shared state / service configuration \u2014 what it exposes"}
344
+ - root CSS — global styles, CSS variables, theme tokens (both JS-imported CSS **and** anything linked from \`index.html\`)
345
+ - ${isReact ? "data hooks \u2014 `fetch(...)`, `useQuery`, `axios`, etc." : "data fetching \u2014 network clients, services, and query utilities"} (capture base URL + endpoints actually called during render)
346
+ - browser state actually read at render — \`localStorage\`/\`sessionStorage\`/cookie keys
347
+ - portal targets — ${isReact ? "`createPortal(...)` and the DOM ids it mounts to" : "content rendered outside the component root and the DOM ids it targets"} (e.g. \`#modal-root\`)
348
+ - 1–2 real page or feature components (your story source-of-truth for ${isReact ? "JSX" : "component usage"} patterns)
349
+
350
+ Stop reading once you can answer: *"What providers, CSS, browser state, and network calls must the preview supply for a typical page to render?"*
351
+ `
352
+ };
353
+ }
354
+ function discoveryStepRelaxed(projectInfo, { tsx }) {
355
+ let isReact = isReactProject(projectInfo);
356
+ return {
357
+ title: "Discover the runtime (\u226440 reads)",
358
+ body: dedent5`
359
+ Identify, in this order:
360
+
361
+ - \`index.html\` — \`<link rel="stylesheet">\` tags, inline \`<style>\` blocks, fonts, and any \`<div id="...">\` mount or portal roots that aren't created by JS
362
+ - ${isReact ? `entry file (\`main.${tsx}\` / \`index.${tsx}\`) \u2014 providers wrapping \`<App />\`, root CSS imports` : "application entry file \u2014 framework initialization, shared services or providers, root CSS imports"}
363
+ - ${isReact ? `\`App.${tsx}\` \u2014 top-level layout, router usage, providers it consumes` : "root component \u2014 top-level layout, router usage, shared state and services it consumes"}
364
+ - ${isReact ? "providers / context files \u2014 what they expose" : "shared state / service configuration \u2014 what it exposes"}
365
+ - root CSS — global styles, CSS variables, theme tokens (both JS-imported CSS **and** anything linked from \`index.html\`)
366
+ - ${isReact ? "data hooks \u2014 `fetch(...)`, `useQuery`, `axios`, etc." : "data fetching \u2014 network clients, services, and query utilities"} (capture base URL + endpoints actually called during render)
367
+ - browser state actually read at render — \`localStorage\`/\`sessionStorage\`/cookie keys
368
+ - portal targets — ${isReact ? "`createPortal(...)` and the DOM ids it mounts to" : "content rendered outside the component root and the DOM ids it targets"} (e.g. \`#modal-root\`)
369
+ - 1–20 real page or feature components (your story source-of-truth for ${isReact ? "JSX" : "component usage"} patterns)
370
+
371
+ Stop reading once you can answer: *"What providers, CSS, browser state, and network calls must the preview supply for a typical page to render? What surrounding context do components need to render?"*
372
+ `
373
+ };
374
+ }
375
+ function missingVitestAddonNote({ addons }, packageManager) {
376
+ return addons.includes("@aussieljk/forkbook/addon-vitest") ? "" : `This project doesn't have \`@aussieljk/forkbook/addon-vitest\` yet, which runs stories as tests. Add it first with \`${packageManager.getPackageCommand([
377
+ "forkbook",
378
+ "add",
379
+ "@aussieljk/forkbook/addon-vitest",
380
+ "--yes"
381
+ ])}\`; the steps below need it.
382
+
383
+ `;
384
+ }
385
+ function verifyStep(projectInfo, { packageManager, tsx }) {
386
+ let vitestRunAll = getVitestStorybookRunCommand2(packageManager), vitestRunFile = getVitestStorybookRunCommand2(packageManager, `path/to/Foo.stories.${tsx}`);
387
+ return {
388
+ title: "Verify in one batch, then iterate only on failures",
389
+ body: missingVitestAddonNote(projectInfo, packageManager) + dedent5`**Read this rule once before running anything:** the first vitest invocation must run **all** the new stories together. No single-file runs before the batch.
390
+
391
+ \`\`\`bash
392
+ ${vitestRunAll}
393
+ \`\`\`
394
+
395
+ Then run the project's TypeScript check (use the script from \`package.json\` — typically \`tsc --noEmit\` or \`${packageManager.getRunCommand("typecheck")}\`). Read the raw output once; don't pipe it through repeated \`grep\`/\`head\` invocations to slice it.
396
+
397
+ For each failure:
398
+
399
+ 1. Read the error.
400
+ 2. If multiple stories share the failure, fix the shared preview setup, not the stories.
401
+ 3. Re-run vitest **only for the affected file(s)**: \`${vitestRunFile}\`.
402
+ 4. Repeat until the file passes, then move on. Cap retries at ~5 per file — if it still fails, leave \`'needs-work'\` tag to inform the user.
403
+ 5. When you keep failing on a story, play function, etc., do not substitute it for easier content that contributes less to codebase understanding.
404
+
405
+ **After a file passes**, edit its meta and remove \`'needs-work'\` so its tags become \`['ai-generated']\`. Files you couldn't fix keep \`['ai-generated', 'needs-work']\` — move on, don't loop forever.`
406
+ };
407
+ }
408
+ function verifyWithAllowedFailureStep(projectInfo, { packageManager, tsx }) {
409
+ let vitestRunAll = getVitestStorybookRunCommand2(packageManager), vitestRunFile = getVitestStorybookRunCommand2(packageManager, `path/to/Foo.stories.${tsx}`);
410
+ return {
411
+ title: "Verify in one batch, then iterate only on failures",
412
+ body: missingVitestAddonNote(projectInfo, packageManager) + dedent5`**Read this rule once before running anything:** the first vitest invocation must run **all** the new stories together. No single-file runs before the batch.
413
+
414
+ \`\`\`bash
415
+ ${vitestRunAll}
416
+ \`\`\`
417
+
418
+ Then run the project's TypeScript check (use the script from \`package.json\` — typically \`tsc --noEmit\` or \`${packageManager.getRunCommand("typecheck")}\`). Read the raw output once; don't pipe it through repeated \`grep\`/\`head\` invocations to slice it.
419
+
420
+ For each failure:
421
+
422
+ 1. Read the error.
423
+ 2. If multiple stories share the failure, fix the shared preview setup, not the stories.
424
+ 3. In subsequent runs, re-run Vitest **only for the affected file(s)**: \`${vitestRunFile}\`.
425
+ 4. Fix any TypeScript issues needed for story files to pass, then re-run TS and Vitest only for those files. Repeat until files pass, or until you have tried 5 times.
426
+ 5. If a story file still fails after those retries, leave the file tagged \`'needs-work'\` and move on — do not keep chasing project-wide TS errors caused by preserved \`'needs-work'\` files.
427
+ 6. When you keep failing on a story, play function, etc., do not substitute it for easier content that contributes less to codebase understanding.
428
+ **After a file passes**, edit its meta and remove \`'needs-work'\` so its tags become \`['ai-generated']\`. Files you couldn't fix keep \`['ai-generated', 'needs-work']\` — move on, don't loop forever.`
429
+ };
430
+ }
431
+ function cleanupStep() {
432
+ return {
433
+ title: "Clean up",
434
+ body: "Before finishing, remove debug code, broad mocks added during diagnosis, unused deps, and eval artifacts. If you managed to write successful stories, delete the examples that `forkbook init` generated (a `stories/` folder with `Configure.mdx` next to `Button`, `Header`, and `Page`). Don't delete any other stories."
435
+ };
436
+ }
437
+ function monorepoStep(projectInfo, ctx) {
438
+ return {
439
+ title: "Monorepo preparation",
440
+ body: dedent5`Build any local monorepo dependencies identified during discovery, and keep track of existing errors in the codebase unrelated to the package changes you'll make.`
441
+ };
442
+ }
443
+ function buildSharedPreviewStep(projectInfo, { configDir, tsx }) {
444
+ let isReact = isReactProject(projectInfo);
445
+ return {
446
+ title: "Build the shared preview",
447
+ body: dedent5` Set up Forkbook **once** so most stories work without per-story setup. **Edit the existing \`${configDir}/preview.${tsx}\`** (created by \`forkbook init\`) — add to its existing config object, don't replace it. Add MSW only if a selected story makes network requests. Add MockDate only if a selected story's rendered output depends on the current date or time. Omit their imports and hooks otherwise.
448
+
449
+ The example below shows both optional paths. Merge only the pieces the selected stories need into what's already there:
450
+
451
+ ${getPreviewExample(projectInfo)}
452
+
453
+ Rules for the preview:
454
+
455
+ - ${isReact ? "Use the **real** provider tree and the **real** root CSS import. Don't invent providers." : "Use the **real** application setup and the **real** root CSS import. Configure shared services, plugins, routing, and state using the installed framework's setup APIs. Don't invent providers."}
456
+ - If the app's CSS is loaded via \`<link>\` in \`index.html\` (rather than imported in JS), import the same file from preview so stories render with the same styles.
457
+ - Seed only the specific browser-state keys the app actually reads. Do **not** clear all of \`localStorage\`/\`sessionStorage\`/cookies, and do not reset Forkbook's own state.
458
+ - Use \`mockdate\` only when render output depends on the date.
459
+ - Do not mock \`window\`, \`document\`, \`navigator\`, observers, or \`fetch\` directly.
460
+ `
461
+ };
462
+ }
463
+ function buildPortalStep(projectInfo, { configDir, tsx }) {
464
+ let isReact = isReactProject(projectInfo);
465
+ return {
466
+ title: "Portals (in a decorator, not `preview-body.html`)",
467
+ body: dedent5`If you found ${isReact ? "`createPortal(..., document.getElementById('foo'))`" : "content rendered into a separate DOM target"} in discovery, **add a decorator in \`${configDir}/preview.${tsx}\` that creates the portal root** before the story renders. Do not use \`preview-body.html\`.
468
+
469
+ ${getPortalDecoratorExample(projectInfo)}
470
+
471
+ Add this decorator to the \`decorators\` array of your preview config. Skip this step entirely if portals only target \`document.body\`.`
472
+ };
473
+ }
474
+ function mswStep(projectInfo, { configDir, mockDateInstall, mswInstall, packageManager, ts }) {
475
+ let mswInit = getMswInitCommand(packageManager), mswAddonAdd = packageManager.getPackageCommand([
476
+ "forkbook",
477
+ "add",
478
+ "msw-storybook-addon@3"
479
+ ]), csfNextNote = projectInfo.hasCsfFactoryPreview ? "\n\n If `forkbook add` injects `import * as mswStorybookAddon from 'msw-storybook-addon/preview'` and a `mswStorybookAddon` entry into your `definePreview` `addons`, remove both \u2014 that form breaks TypeScript inference for the entire preview. Register the addon with `addonMsw()` as shown below instead.\n" : "";
480
+ return {
481
+ title: "Add only the test infrastructure the selected stories need",
482
+ body: `If a selected story makes network requests during rendering or interaction, register \`msw-storybook-addon\` with \`forkbook add\` (which also adds it to the \`addons\` field of \`${configDir}/main.${ts}\`), install MSW, and generate the worker script:
483
+
484
+ \`\`\`bash
485
+ ${mswAddonAdd}
486
+ ${mswInstall}
487
+ ${mswInit}
488
+ \`\`\`
489
+ ${csfNextNote}
490
+ Make sure \`${configDir}/main.${ts}\` serves \`./public\`:
491
+
492
+ ${getMainConfigExample(projectInfo)}
493
+
494
+ Put handlers in \`${configDir}/msw-handlers.${ts}\`. Cover only the endpoints your stories will exercise \u2014 no catch-alls.
495
+
496
+ \`\`\`${ts}
497
+ // ${configDir}/msw-handlers.${ts}
498
+ import { http, HttpResponse } from 'msw';
499
+
500
+ export const mswHandlers = [
501
+ http.get('https://api.example.com/products', () =>
502
+ HttpResponse.json({ items: [{ id: 'p1', name: 'Example', price: 42 }] })
503
+ ),
504
+ ];
505
+ \`\`\`
506
+
507
+ If a selected story's rendered output depends on the current date or time, install MockDate and configure it in \`beforeEach\`:
508
+
509
+ \`\`\`bash
510
+ ${mockDateInstall}
511
+ \`\`\`
512
+
513
+ If neither condition applies, skip this step. Do not create an empty MSW handler file or install unused dependencies.
514
+ `
515
+ };
516
+ }
517
+ function writeStoriesStep(projectInfo, { tsx }) {
518
+ let isReact = isReactProject(projectInfo);
519
+ return {
520
+ title: "Write up to 10 story files (in one batch)",
521
+ body: dedent5`
522
+
523
+ This step has **two required deliverables**:
524
+
525
+ a. Up to 10 colocated \`*.stories.${tsx}\` files for meaningful targets in the codebase.
526
+ b. **Exactly one \`CssCheck\` story** added to one of those files (spec below). This step is not complete without it.
527
+
528
+ **Substep a — pick targets and write the files.** Pick ~10 meaningful targets from the real codebase (low-level reusable → page components). Skip subcomponents, hooks, contexts, helpers, and \`App\` itself when real page components exist.
529
+
530
+ Each story file: ~3 exports for typical components, up to ~10 when warranted by real usage. Copy ${isReact ? "JSX" : "component usage"} patterns from real pages/routes/tests. If a component already has a story file, add your stories to that file instead of writing a second one.
531
+
532
+ **Tag every new story file with \`['ai-generated', 'needs-work']\` from the start.** You will remove \`'needs-work'\` only after vitest confirms the file passes. This way, anything not yet verified — including stories you ran out of time to fix — stays correctly marked.
533
+
534
+ ${getStoryExample(projectInfo)}
535
+
536
+ Story rules:
537
+
538
+ - Start every meta with \`tags: ['ai-generated', 'needs-work']\`.
539
+ - Show all imports explicitly.
540
+ - Don't add a custom \`title\`.
541
+ - Don't build large story-specific harnesses — fix preview instead.
542
+ - Don't create new app components.
543
+
544
+ **Substep b — add the single \`CssCheck\` story.** Before you finish this step, pick **one** visually distinctive component from the files you just wrote and add a \`CssCheck\` export to that file. Exactly **one** \`CssCheck\` across the whole project — not one per file. This step is not complete until the story exists.
545
+
546
+ Why it's mandatory: \`toBeVisible\` passes on an unstyled component. A concrete \`getComputedStyle\` value is the only proof that the shared preview actually loaded the app's CSS — without it, you have no idea whether your stories are rendering correctly.
547
+
548
+ How: read a real styling value from the component's source (e.g. a hex color in ${isReact ? "styled-components" : "a stylesheet"}, a Tailwind class like \`bg-blue-600\`, a CSS variable from the theme), and assert the resolved \`getComputedStyle\` value:
549
+
550
+ \`\`\`${tsx}
551
+ export const CssCheck${projectInfo.language === "ts" ? ": Story" : ""} = {
552
+ ${isReact ? "args: { children: 'Submit' }," : "...Primary,"}
553
+ play: async ({ canvas }) => {
554
+ const button = canvas.getByRole('button'${isReact ? ", { name: /submit/i }" : ""});
555
+ // PrimaryButton uses bg-blue-600 — fails if Tailwind / global CSS did not load.
556
+ await expect(getComputedStyle(button).backgroundColor).toBe('rgb(37, 99, 235)');
557
+ },
558
+ };
559
+ \`\`\`
560
+ `
561
+ };
562
+ }
563
+ function writeStoriesWithAllowedFailuresStep(projectInfo, { tsx }) {
564
+ let isReact = isReactProject(projectInfo);
565
+ return {
566
+ title: "Write up to 10 story files (in one batch)",
567
+ body: dedent5`
568
+
569
+ This step has **two required deliverables**:
570
+
571
+ a. Up to 10 colocated \`*.stories.${tsx}\` files for meaningful targets in the codebase.
572
+ b. **Exactly one \`CssCheck\` story** added to one of those files (spec below). This step is not complete without it.
573
+
574
+ **Substep a — pick targets and write the files.** Pick ~10 meaningful targets from the real codebase (low-level reusable → page components). Skip subcomponents, hooks, contexts, helpers, and \`App\` itself when real page components exist.
575
+
576
+ Each story file: ~3 exports for typical components, up to ~10 when warranted by real usage. Copy ${isReact ? "JSX" : "component usage"} patterns from real pages/routes/tests. If a component already has a story file, add your stories to that file instead of writing a second one.
577
+
578
+ **Tag every new story file with \`['ai-generated', 'needs-work']\` from the start.** You will remove \`'needs-work'\` only after vitest confirms the file passes, and you will leave the tag if the file is not fully functional at the end of your self-healing loop.
579
+
580
+ ${getStoryExample(projectInfo)}
581
+
582
+ Story rules:
583
+
584
+ - Start every meta with \`tags: ['ai-generated', 'needs-work']\`.
585
+ - Show all imports explicitly.
586
+ - Don't add a custom \`title\`.
587
+ - Don't build large story-specific harnesses — fix preview instead.
588
+ - Don't create new app components.
589
+
590
+ **Substep b — add the single \`CssCheck\` story.** Before you finish this step, pick **one** visually distinctive component from the files you just wrote and add a \`CssCheck\` export to that file. Exactly **one** \`CssCheck\` across the whole project — not one per file. This step is not complete until the story exists.
591
+
592
+ Why it's mandatory: \`toBeVisible\` passes on an unstyled component. A concrete \`getComputedStyle\` value is the only proof that the shared preview actually loaded the app's CSS — without it, you have no idea whether your stories are rendering correctly.
593
+
594
+ How: read a real styling value from the component's source (e.g. a hex color in ${isReact ? "styled-components" : "a stylesheet"}, a Tailwind class like \`bg-blue-600\`, a CSS variable from the theme), and assert the resolved \`getComputedStyle\` value:
595
+
596
+ \`\`\`${tsx}
597
+ export const CssCheck${projectInfo.language === "ts" ? ": Story" : ""} = {
598
+ ${isReact ? "args: { children: 'Submit' }," : "...Primary,"}
599
+ play: async ({ canvas }) => {
600
+ const button = canvas.getByRole('button'${isReact ? ", { name: /submit/i }" : ""});
601
+ // PrimaryButton uses bg-blue-600 — fails if Tailwind / global CSS did not load.
602
+ await expect(getComputedStyle(button).backgroundColor).toBe('rgb(37, 99, 235)');
603
+ },
604
+ };
605
+ \`\`\`
606
+ `
607
+ };
608
+ }
609
+ function interactionPlayStep(projectInfo, { tsx }) {
610
+ return {
611
+ title: "Add `play` functions only where they prove something non-trivial",
612
+ body: dedent5`
613
+ **Do not put a \`play\` on every story.** A \`play\` is worth writing only when it asserts something the rendered output alone doesn't already prove. Prefer one good \`play\` per file over five redundant ones.
614
+
615
+ Write a \`play\` when it can verify:
616
+
617
+ - an **interaction** (form fill + submit, click → menu opens, tab change reveals panel)
618
+ - **async data** actually arrived from MSW (waiting for mocked content to replace a spinner)
619
+ - a **portal** rendered into the right root (query via \`canvasElement.ownerDocument\`)
620
+ - a **CSS-driven state** that matters semantically (e.g. theme color, disabled styling, layout that confirms the global stylesheet loaded)
621
+ - **accessibility** that the component is responsible for (correct role/label exposure)
622
+
623
+ **Skip \`play\` entirely** when a story is just a static variant of the same component (different \`args\`, no new behavior). Repeating \`getByRole(...).toBeVisible()\` across \`Clear\`, \`Large\`, \`WithIcon\` etc. is redundant — the render itself already fails the test if the component throws or doesn't mount.
624
+
625
+ **Smoke plays must prove something the render alone doesn't.** A play that does only \`await expect(canvas.getByRole('button')).toBeVisible()\` adds nothing — the render already failed if the button didn't mount. Acceptable smoke plays assert one of:
626
+
627
+ - an **aria attribute reflecting state** (\`aria-expanded\`, \`aria-disabled\`, \`aria-checked\`, \`aria-current\`)
628
+ - a **prop value rendered as text or attribute** (e.g. \`args.label\` appears in the DOM, \`href\` matches \`args.to\`)
629
+ - **async content arriving** (\`findBy*\`, \`waitFor\` — proves the loader/MSW handler actually resolved)
630
+ - a **portal mounting in the right root** (queried via \`canvasElement.ownerDocument.body\`)
631
+
632
+ If none of those apply, skip the \`play\` and rely on the render itself.
633
+
634
+ Concretely, in a \`Button.stories.${tsx}\` with \`Primary\`, \`Clear\`, \`Large\`, \`WithIcon\`:
635
+
636
+ - \`Primary\` — keep one smoke \`play\` (one is enough for the file).
637
+ - \`Clear\`, \`Large\`, \`WithIcon\` — **no \`play\`**. They're variant-only stories.
638
+
639
+ (The single \`CssCheck\` story for the whole project was added in Step 5 — don't add another one here.)
640
+
641
+ Imports & play context — get this right or vitest will fail in subtle ways:
642
+
643
+ - \`expect\` and \`waitFor\` come from \`'@aussieljk/forkbook/test'\` — import those.
644
+ - \`canvas\`, \`userEvent\`, and \`canvasElement\` come from the **play arguments**: \`async ({ canvas, userEvent, canvasElement }) => { ... }\`. **Do not** \`import { userEvent } from '@aussieljk/forkbook/test'\` and **do not** write \`const canvas = within(canvasElement)\` — both are already provided.
645
+ - For **portal queries only**, query via \`canvasElement.ownerDocument.body\`. You may import \`within\` from \`'@aussieljk/forkbook/test'\` for that case (e.g. \`within(canvasElement.ownerDocument.body).findByTestId(...)\`). Don't use \`within\` for anything else.
646
+
647
+ ${getInteractionPlayExample(projectInfo)}`
648
+ };
649
+ }
650
+
651
+ export {
652
+ isReactProject,
653
+ ext,
654
+ listRules,
655
+ listSteps,
656
+ listDOD,
657
+ cssCheckDOD,
658
+ storyTagsV1DOD,
659
+ storyTagsV2DOD,
660
+ vitestPassesStrictDOD,
661
+ vitestPassesWhenExpectedDOD,
662
+ typeCheckPassesStrictDOD,
663
+ typeCheckPassesWhenExpectedDOD,
664
+ sharedPreviewDOD,
665
+ optionalTestInfrastructureDOD,
666
+ nodeModuleReadsRule,
667
+ monorepoRule,
668
+ packageManagerRule,
669
+ editOverWriteRule,
670
+ keepUserWorkRule,
671
+ batchTestsRule,
672
+ readBudgetRule,
673
+ readBudgetRuleRelaxed,
674
+ preferSharedFixesRule,
675
+ noPolishRule,
676
+ discoveryStepStrict,
677
+ discoveryStepRelaxed,
678
+ verifyStep,
679
+ verifyWithAllowedFailureStep,
680
+ cleanupStep,
681
+ monorepoStep,
682
+ buildSharedPreviewStep,
683
+ buildPortalStep,
684
+ mswStep,
685
+ writeStoriesStep,
686
+ writeStoriesWithAllowedFailuresStep,
687
+ interactionPlayStep
688
+ };