bsmnt 0.1.3 → 0.2.4

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 (407) hide show
  1. package/README.md +18 -18
  2. package/dist/configs/animations.d.ts +25 -0
  3. package/dist/configs/animations.d.ts.map +1 -0
  4. package/dist/configs/animations.js +29 -0
  5. package/dist/configs/animations.js.map +1 -0
  6. package/dist/helpers/add/hooks-config.d.ts +22 -0
  7. package/dist/helpers/add/hooks-config.d.ts.map +1 -0
  8. package/dist/helpers/add/hooks-config.js +37 -0
  9. package/dist/helpers/add/hooks-config.js.map +1 -0
  10. package/dist/helpers/add/index.d.ts +18 -0
  11. package/dist/helpers/add/index.d.ts.map +1 -0
  12. package/dist/helpers/add/index.js +152 -0
  13. package/dist/helpers/add/index.js.map +1 -0
  14. package/dist/helpers/create/copy-template.d.ts +11 -0
  15. package/dist/helpers/create/copy-template.d.ts.map +1 -0
  16. package/dist/helpers/create/copy-template.js +19 -0
  17. package/dist/helpers/create/copy-template.js.map +1 -0
  18. package/dist/helpers/create/index.d.ts +22 -0
  19. package/dist/helpers/create/index.d.ts.map +1 -0
  20. package/dist/helpers/create/index.js +81 -0
  21. package/dist/helpers/create/index.js.map +1 -0
  22. package/dist/helpers/create/install.d.ts +8 -0
  23. package/dist/helpers/create/install.d.ts.map +1 -0
  24. package/dist/helpers/create/install.js +20 -0
  25. package/dist/helpers/create/install.js.map +1 -0
  26. package/dist/helpers/create/rename-files.d.ts +10 -0
  27. package/dist/helpers/create/rename-files.d.ts.map +1 -0
  28. package/dist/helpers/create/rename-files.js +17 -0
  29. package/dist/helpers/create/rename-files.js.map +1 -0
  30. package/dist/helpers/create/setup-agent.d.ts +21 -0
  31. package/dist/helpers/create/setup-agent.d.ts.map +1 -0
  32. package/dist/helpers/create/setup-agent.js +65 -0
  33. package/dist/helpers/create/setup-agent.js.map +1 -0
  34. package/dist/helpers/create/setup-sanity.d.ts +23 -0
  35. package/dist/helpers/create/setup-sanity.d.ts.map +1 -0
  36. package/dist/helpers/create/setup-sanity.js +354 -0
  37. package/dist/helpers/create/setup-sanity.js.map +1 -0
  38. package/dist/helpers/create/update-package.d.ts +20 -0
  39. package/dist/helpers/create/update-package.d.ts.map +1 -0
  40. package/dist/helpers/create/update-package.js +87 -0
  41. package/dist/helpers/create/update-package.js.map +1 -0
  42. package/dist/helpers/integrate/index.d.ts +13 -0
  43. package/dist/helpers/integrate/index.d.ts.map +1 -0
  44. package/dist/helpers/integrate/index.js +204 -0
  45. package/dist/helpers/integrate/index.js.map +1 -0
  46. package/dist/helpers/integrate/merge-config.d.ts +21 -0
  47. package/dist/helpers/integrate/merge-config.d.ts.map +1 -0
  48. package/dist/helpers/integrate/merge-config.js +38 -0
  49. package/dist/helpers/integrate/merge-config.js.map +1 -0
  50. package/dist/helpers/integrate/merge-orchestrator.d.ts +10 -0
  51. package/dist/helpers/integrate/merge-orchestrator.d.ts.map +1 -0
  52. package/dist/helpers/integrate/merge-orchestrator.js +188 -0
  53. package/dist/helpers/integrate/merge-orchestrator.js.map +1 -0
  54. package/dist/helpers/integrate/sanity/config.d.ts +14 -0
  55. package/dist/helpers/integrate/sanity/config.d.ts.map +1 -0
  56. package/dist/helpers/integrate/sanity/config.js +38 -0
  57. package/dist/helpers/integrate/sanity/config.js.map +1 -0
  58. package/dist/helpers/integrate/sanity/mergers/check-integration-merger.d.ts +13 -0
  59. package/dist/helpers/integrate/sanity/mergers/check-integration-merger.d.ts.map +1 -0
  60. package/dist/helpers/integrate/sanity/mergers/check-integration-merger.js +84 -0
  61. package/dist/helpers/integrate/sanity/mergers/check-integration-merger.js.map +1 -0
  62. package/dist/helpers/integrate/sanity/mergers/layout-merger.d.ts +23 -0
  63. package/dist/helpers/integrate/sanity/mergers/layout-merger.d.ts.map +1 -0
  64. package/dist/helpers/integrate/sanity/mergers/layout-merger.js +161 -0
  65. package/dist/helpers/integrate/sanity/mergers/layout-merger.js.map +1 -0
  66. package/dist/helpers/integrate/sanity/mergers/sitemap-merger.d.ts +13 -0
  67. package/dist/helpers/integrate/sanity/mergers/sitemap-merger.d.ts.map +1 -0
  68. package/{packages/create-basement-app/src → dist/helpers/integrate/sanity}/mergers/sitemap-merger.js +33 -45
  69. package/dist/helpers/integrate/sanity/mergers/sitemap-merger.js.map +1 -0
  70. package/dist/index.d.ts +3 -0
  71. package/dist/index.d.ts.map +1 -0
  72. package/dist/index.js +337 -0
  73. package/dist/index.js.map +1 -0
  74. package/dist/paths.d.ts +14 -0
  75. package/dist/paths.d.ts.map +1 -0
  76. package/dist/paths.js +24 -0
  77. package/dist/paths.js.map +1 -0
  78. package/dist/utils/detect-project.d.ts +40 -0
  79. package/dist/utils/detect-project.d.ts.map +1 -0
  80. package/dist/utils/detect-project.js +69 -0
  81. package/dist/utils/detect-project.js.map +1 -0
  82. package/dist/utils/format-results.d.ts +24 -0
  83. package/dist/utils/format-results.d.ts.map +1 -0
  84. package/dist/utils/format-results.js +27 -0
  85. package/dist/utils/format-results.js.map +1 -0
  86. package/index.js +25 -0
  87. package/package.json +40 -15
  88. package/{packages/create-basement-app/templates/experiment → src/templates/next-default}/app/layout.tsx +18 -18
  89. package/src/templates/next-default/app/page.tsx +11 -0
  90. package/{packages/create-basement-app/templates/experiment → src/templates/next-default}/app/robots.ts +3 -3
  91. package/{packages/create-basement-app/templates/webgl → src/templates/next-default}/app/sitemap.ts +4 -4
  92. package/{packages/create-basement-app/templates/default → src/templates/next-default}/biome.json +2 -2
  93. package/{packages/create-basement-app/templates/webgl → src/templates/next-default}/components/layout/footer/index.tsx +5 -1
  94. package/{packages/create-basement-app/templates/webgl → src/templates/next-default}/components/layout/header/index.tsx +1 -3
  95. package/{packages/create-basement-app/templates/default → src/templates/next-default}/components/layout/theme/index.tsx +1 -1
  96. package/{packages/create-basement-app/templates/default → src/templates/next-default}/components/layout/wrapper/index.tsx +0 -2
  97. package/{packages/create-basement-app/templates/webgl → src/templates/next-default}/components/ui/image/index.tsx +6 -11
  98. package/{packages/create-basement-app/templates/experiment → src/templates/next-default}/components/ui/link/index.tsx +39 -33
  99. package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/utils/metadata.ts +26 -26
  100. package/{packages/create-basement-app/templates/default → src/templates/next-default}/package.json +4 -4
  101. package/{packages/create-basement-app/templates/webgl → src/templates/next-experiments}/app/layout.tsx +18 -18
  102. package/{packages/create-basement-app/templates/webgl → src/templates/next-experiments}/app/robots.ts +3 -3
  103. package/{packages/create-basement-app/templates/default → src/templates/next-experiments}/app/sitemap.ts +4 -4
  104. package/{packages/create-basement-app/templates/webgl → src/templates/next-experiments}/biome.json +2 -2
  105. package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/components/layout/theme/index.tsx +1 -1
  106. package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/components/layout/wrapper/index.tsx +7 -9
  107. package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/components/ui/image/index.tsx +39 -46
  108. package/{packages/create-basement-app/templates/default → src/templates/next-experiments}/components/ui/link/index.tsx +6 -0
  109. package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/utils/metadata.ts +26 -26
  110. package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/package.json +4 -4
  111. package/{packages/create-basement-app/templates/default → src/templates/next-webgl}/app/layout.tsx +18 -18
  112. package/{packages/create-basement-app/templates/default → src/templates/next-webgl}/app/robots.ts +3 -3
  113. package/{packages/create-basement-app/templates/experiment → src/templates/next-webgl}/app/sitemap.ts +4 -4
  114. package/{packages/create-basement-app/templates/experiment → src/templates/next-webgl}/biome.json +2 -2
  115. package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/components/layout/theme/index.tsx +1 -1
  116. package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/components/layout/wrapper/index.tsx +0 -2
  117. package/{packages/create-basement-app/templates/default → src/templates/next-webgl}/components/ui/image/index.tsx +6 -11
  118. package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/components/ui/link/index.tsx +9 -2
  119. package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/components/webgl/components/scene/index.tsx +1 -0
  120. package/src/templates/next-webgl/lib/renderer.ts +7 -0
  121. package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/utils/metadata.ts +26 -26
  122. package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/package.json +4 -4
  123. package/packages/cli/bin/index.js +0 -259
  124. package/packages/cli/src/commands/add-integration.js +0 -310
  125. package/packages/cli/src/commands/create.js +0 -409
  126. package/packages/cli/src/commands/setup-sanity.js +0 -426
  127. package/packages/cli/src/commands/worktree.js +0 -805
  128. package/packages/create-basement-app/integrations/sanity/config.js +0 -46
  129. package/packages/create-basement-app/integrations/sanity/files/app/api/draft-mode/disable/route.ts +0 -7
  130. package/packages/create-basement-app/integrations/sanity/files/app/api/draft-mode/enable/route.ts +0 -21
  131. package/packages/create-basement-app/integrations/sanity/files/app/api/revalidate/route.ts +0 -37
  132. package/packages/create-basement-app/integrations/sanity/files/app/layout.tsx +0 -111
  133. package/packages/create-basement-app/integrations/sanity/files/app/sitemap.ts +0 -80
  134. package/packages/create-basement-app/integrations/sanity/files/app/studio/[[...tool]]/page.tsx +0 -8
  135. package/packages/create-basement-app/integrations/sanity/files/app/studio/layout.tsx +0 -7
  136. package/packages/create-basement-app/integrations/sanity/files/components/ui/sanity-image/index.tsx +0 -37
  137. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/README.md +0 -58
  138. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/check-integration.ts +0 -62
  139. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/sanity/README.md +0 -144
  140. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/sanity/client.ts +0 -30
  141. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/sanity/components/disable-draft-mode.tsx +0 -29
  142. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/sanity/components/rich-text.tsx +0 -73
  143. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/sanity/env.ts +0 -38
  144. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/sanity/live/index.tsx +0 -34
  145. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/sanity/queries.ts +0 -99
  146. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/sanity/sanity.cli.ts +0 -20
  147. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/sanity/sanity.config.ts +0 -94
  148. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/sanity/sanity.types.ts +0 -337
  149. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/sanity/schema.json +0 -1850
  150. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/sanity/schemas/article.ts +0 -132
  151. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/sanity/schemas/example.ts +0 -203
  152. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/sanity/schemas/index.ts +0 -37
  153. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/sanity/schemas/link.ts +0 -127
  154. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/sanity/schemas/metadata.ts +0 -68
  155. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/sanity/schemas/navigation.ts +0 -39
  156. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/sanity/schemas/page.ts +0 -77
  157. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/sanity/schemas/richText.ts +0 -59
  158. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/sanity/structure.ts +0 -5
  159. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/sanity/utils/image.ts +0 -11
  160. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/sanity/utils/link.ts +0 -61
  161. package/packages/create-basement-app/integrations/sanity/files/lib/scripts/copy-sanity-mcp.ts +0 -23
  162. package/packages/create-basement-app/integrations/sanity/files/lib/scripts/generate-page.ts +0 -310
  163. package/packages/create-basement-app/integrations/sanity/files/lib/utils/metadata.ts +0 -190
  164. package/packages/create-basement-app/integrations/sanity/mergers/check-integration-merger.js +0 -105
  165. package/packages/create-basement-app/integrations/sanity/mergers/layout-merger.js +0 -223
  166. package/packages/create-basement-app/integrations/sanity/mergers/sitemap-merger.js +0 -121
  167. package/packages/create-basement-app/package.json +0 -10
  168. package/packages/create-basement-app/src/configs/animations.js +0 -28
  169. package/packages/create-basement-app/src/index.js +0 -15
  170. package/packages/create-basement-app/src/mergers/check-integration-merger.js +0 -105
  171. package/packages/create-basement-app/src/mergers/config.js +0 -109
  172. package/packages/create-basement-app/src/mergers/index.js +0 -346
  173. package/packages/create-basement-app/src/mergers/layout-merger.js +0 -223
  174. package/packages/create-basement-app/templates/default/.cursor/rules/README.md +0 -184
  175. package/packages/create-basement-app/templates/default/.cursor/rules/architecture.mdc +0 -437
  176. package/packages/create-basement-app/templates/default/.cursor/rules/components.mdc +0 -436
  177. package/packages/create-basement-app/templates/default/.cursor/rules/integrations.mdc +0 -447
  178. package/packages/create-basement-app/templates/default/.cursor/rules/main.mdc +0 -278
  179. package/packages/create-basement-app/templates/default/.cursor/rules/styling.mdc +0 -433
  180. package/packages/create-basement-app/templates/default/.github/workflows/lighthouse-to-slack.yml +0 -136
  181. package/packages/create-basement-app/templates/experiment/.cursor/rules/README.md +0 -184
  182. package/packages/create-basement-app/templates/experiment/.cursor/rules/architecture.mdc +0 -437
  183. package/packages/create-basement-app/templates/experiment/.cursor/rules/components.mdc +0 -436
  184. package/packages/create-basement-app/templates/experiment/.cursor/rules/integrations.mdc +0 -447
  185. package/packages/create-basement-app/templates/experiment/.cursor/rules/main.mdc +0 -278
  186. package/packages/create-basement-app/templates/experiment/.cursor/rules/styling.mdc +0 -433
  187. package/packages/create-basement-app/templates/experiment/.github/workflows/lighthouse-to-slack.yml +0 -136
  188. package/packages/create-basement-app/templates/experiment/app/page.tsx +0 -275
  189. package/packages/create-basement-app/templates/webgl/.biome/plugins/README.md +0 -21
  190. package/packages/create-basement-app/templates/webgl/.cursor/rules/README.md +0 -184
  191. package/packages/create-basement-app/templates/webgl/.cursor/rules/architecture.mdc +0 -437
  192. package/packages/create-basement-app/templates/webgl/.cursor/rules/components.mdc +0 -436
  193. package/packages/create-basement-app/templates/webgl/.cursor/rules/integrations.mdc +0 -447
  194. package/packages/create-basement-app/templates/webgl/.cursor/rules/main.mdc +0 -278
  195. package/packages/create-basement-app/templates/webgl/.cursor/rules/styling.mdc +0 -433
  196. package/packages/create-basement-app/templates/webgl/.github/workflows/lighthouse-to-slack.yml +0 -136
  197. /package/{packages/create-basement-app/plugins → plugins}/no-anchor-element.grit +0 -0
  198. /package/{packages/create-basement-app/plugins → plugins}/no-relative-parent-imports.grit +0 -0
  199. /package/{packages/create-basement-app/plugins → plugins}/no-unnecessary-forwardref.grit +0 -0
  200. /package/{packages/create-basement-app → src}/template-hooks/config.js +0 -0
  201. /package/{packages/create-basement-app → src}/template-hooks/use-battery.ts +0 -0
  202. /package/{packages/create-basement-app → src}/template-hooks/use-device-perf.ts +0 -0
  203. /package/{packages/create-basement-app → src}/template-hooks/use-intersection-observer.ts +0 -0
  204. /package/{packages/create-basement-app → src}/template-hooks/use-media.ts +0 -0
  205. /package/{packages/create-basement-app → src/templates/next-default/.biome}/plugins/README.md +0 -0
  206. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/.biome/plugins/no-anchor-element.grit +0 -0
  207. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/.biome/plugins/no-relative-parent-imports.grit +0 -0
  208. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/.biome/plugins/no-unnecessary-forwardref.grit +0 -0
  209. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/.editorconfig +0 -0
  210. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/.env.example +0 -0
  211. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/.gitattributes +0 -0
  212. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  213. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/.vscode/extensions.json +0 -0
  214. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/.vscode/settings.json +0 -0
  215. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/README.md +0 -0
  216. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/_gitignore +0 -0
  217. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/app/favicon.ico +0 -0
  218. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/components/basement.svg +0 -0
  219. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/components/ui/README.md +0 -0
  220. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/components/ui/image/README.md +0 -0
  221. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/README.md +0 -0
  222. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/hooks/index.ts +0 -0
  223. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/hooks/use-device-detection.ts +0 -0
  224. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/hooks/use-media-breakpoint.ts +0 -0
  225. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/hooks/use-prefetch.ts +0 -0
  226. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/integrations/.gitkeep +0 -0
  227. /package/{packages/create-basement-app/templates/webgl → src/templates/next-default}/lib/renderer.ts +0 -0
  228. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/scripts/dev.ts +0 -0
  229. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/scripts/generate-component.ts +0 -0
  230. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/scripts/generate-page.ts +0 -0
  231. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/scripts/generate.ts +0 -0
  232. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/scripts/utils.ts +0 -0
  233. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/store/app.ts +0 -0
  234. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/store/index.ts +0 -0
  235. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/styles/README.md +0 -0
  236. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/styles/cn.ts +0 -0
  237. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/styles/colors.ts +0 -0
  238. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/styles/config.ts +0 -0
  239. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/styles/css/global.css +0 -0
  240. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/styles/css/index.css +0 -0
  241. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/styles/css/reset.css +0 -0
  242. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/styles/css/root.css +0 -0
  243. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/styles/css/tailwind.css +0 -0
  244. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/styles/easings.ts +0 -0
  245. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/styles/fonts.ts +0 -0
  246. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/styles/index.ts +0 -0
  247. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/styles/layout.mjs +0 -0
  248. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/styles/scripts/README.md +0 -0
  249. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/styles/scripts/generate-root.ts +0 -0
  250. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/styles/scripts/generate-tailwind.ts +0 -0
  251. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/styles/scripts/postcss-functions.mjs +0 -0
  252. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/styles/scripts/setup-styles.ts +0 -0
  253. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/styles/scripts/utils.ts +0 -0
  254. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/styles/typography.ts +0 -0
  255. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/utils/README.md +0 -0
  256. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/utils/css.d.ts +0 -0
  257. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/utils/easings.ts +0 -0
  258. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/utils/fetch.ts +0 -0
  259. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/utils/math.test.ts +0 -0
  260. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/utils/math.ts +0 -0
  261. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/utils/strings.test.ts +0 -0
  262. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/utils/strings.ts +0 -0
  263. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/utils/types.d.ts +0 -0
  264. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/utils/viewport.test.ts +0 -0
  265. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/utils/viewport.ts +0 -0
  266. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/next.config.ts +0 -0
  267. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/postcss.config.mjs +0 -0
  268. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/public/fonts/geist/Geist-Mono.woff2 +0 -0
  269. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/tsconfig.json +0 -0
  270. /package/{packages/create-basement-app/templates/default → src/templates/next-experiments}/.biome/plugins/README.md +0 -0
  271. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/.biome/plugins/no-anchor-element.grit +0 -0
  272. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/.biome/plugins/no-relative-parent-imports.grit +0 -0
  273. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/.biome/plugins/no-unnecessary-forwardref.grit +0 -0
  274. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/.editorconfig +0 -0
  275. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/.env.example +0 -0
  276. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/.gitattributes +0 -0
  277. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  278. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/.vscode/extensions.json +0 -0
  279. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/.vscode/settings.json +0 -0
  280. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/README.md +0 -0
  281. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/_gitignore +0 -0
  282. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/app/favicon.ico +0 -0
  283. /package/{packages/create-basement-app/templates/default → src/templates/next-experiments}/app/page.tsx +0 -0
  284. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/components/basement.svg +0 -0
  285. /package/{packages/create-basement-app/templates/default → src/templates/next-experiments}/components/layout/footer/index.tsx +0 -0
  286. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/components/layout/header/index.tsx +0 -0
  287. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/components/layout/navigation-menu.tsx +0 -0
  288. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/components/ui/README.md +0 -0
  289. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/components/ui/image/README.md +0 -0
  290. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/README.md +0 -0
  291. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/constants.ts +0 -0
  292. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/hooks/index.ts +0 -0
  293. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/hooks/use-device-detection.ts +0 -0
  294. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/hooks/use-media-breakpoint.ts +0 -0
  295. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/hooks/use-prefetch.ts +0 -0
  296. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/integrations/.gitkeep +0 -0
  297. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/scripts/dev.ts +0 -0
  298. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/scripts/generate-component.ts +0 -0
  299. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/scripts/generate-page.ts +0 -0
  300. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/scripts/generate.ts +0 -0
  301. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/scripts/utils.ts +0 -0
  302. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/store/app.ts +0 -0
  303. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/store/index.ts +0 -0
  304. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/styles/README.md +0 -0
  305. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/styles/cn.ts +0 -0
  306. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/styles/colors.ts +0 -0
  307. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/styles/config.ts +0 -0
  308. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/styles/css/global.css +0 -0
  309. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/styles/css/index.css +0 -0
  310. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/styles/css/reset.css +0 -0
  311. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/styles/css/root.css +0 -0
  312. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/styles/css/tailwind.css +0 -0
  313. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/styles/easings.ts +0 -0
  314. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/styles/fonts.ts +0 -0
  315. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/styles/index.ts +0 -0
  316. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/styles/layout.mjs +0 -0
  317. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/styles/scripts/README.md +0 -0
  318. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/styles/scripts/generate-root.ts +0 -0
  319. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/styles/scripts/generate-tailwind.ts +0 -0
  320. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/styles/scripts/postcss-functions.mjs +0 -0
  321. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/styles/scripts/setup-styles.ts +0 -0
  322. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/styles/scripts/utils.ts +0 -0
  323. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/styles/typography.ts +0 -0
  324. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/utils/README.md +0 -0
  325. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/utils/css.d.ts +0 -0
  326. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/utils/easings.ts +0 -0
  327. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/utils/fetch.ts +0 -0
  328. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/utils/math.test.ts +0 -0
  329. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/utils/math.ts +0 -0
  330. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/utils/strings.test.ts +0 -0
  331. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/utils/strings.ts +0 -0
  332. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/utils/types.d.ts +0 -0
  333. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/utils/viewport.test.ts +0 -0
  334. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/utils/viewport.ts +0 -0
  335. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/next.config.ts +0 -0
  336. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/postcss.config.mjs +0 -0
  337. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/public/fonts/geist/Geist-Mono.woff2 +0 -0
  338. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/tsconfig.json +0 -0
  339. /package/{packages/create-basement-app/templates/experiment → src/templates/next-webgl}/.biome/plugins/README.md +0 -0
  340. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/.biome/plugins/no-anchor-element.grit +0 -0
  341. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/.biome/plugins/no-relative-parent-imports.grit +0 -0
  342. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/.biome/plugins/no-unnecessary-forwardref.grit +0 -0
  343. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/.editorconfig +0 -0
  344. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/.env.example +0 -0
  345. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/.gitattributes +0 -0
  346. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  347. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/.vscode/extensions.json +0 -0
  348. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/.vscode/settings.json +0 -0
  349. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/README.md +0 -0
  350. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/_gitignore +0 -0
  351. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/app/favicon.ico +0 -0
  352. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/app/page.tsx +0 -0
  353. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/components/basement.svg +0 -0
  354. /package/{packages/create-basement-app/templates/experiment → src/templates/next-webgl}/components/layout/footer/index.tsx +0 -0
  355. /package/{packages/create-basement-app/templates/default → src/templates/next-webgl}/components/layout/header/index.tsx +0 -0
  356. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/components/ui/README.md +0 -0
  357. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/components/ui/image/README.md +0 -0
  358. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/components/webgl/canvas/dynamic.tsx +0 -0
  359. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/components/webgl/canvas/index.tsx +0 -0
  360. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/README.md +0 -0
  361. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/hooks/index.ts +0 -0
  362. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/hooks/use-device-detection.ts +0 -0
  363. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/hooks/use-media-breakpoint.ts +0 -0
  364. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/hooks/use-prefetch.ts +0 -0
  365. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/integrations/.gitkeep +0 -0
  366. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/scripts/dev.ts +0 -0
  367. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/scripts/generate-component.ts +0 -0
  368. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/scripts/generate-page.ts +0 -0
  369. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/scripts/generate.ts +0 -0
  370. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/scripts/utils.ts +0 -0
  371. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/store/app.ts +0 -0
  372. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/store/index.ts +0 -0
  373. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/styles/README.md +0 -0
  374. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/styles/cn.ts +0 -0
  375. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/styles/colors.ts +0 -0
  376. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/styles/config.ts +0 -0
  377. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/styles/css/global.css +0 -0
  378. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/styles/css/index.css +0 -0
  379. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/styles/css/reset.css +0 -0
  380. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/styles/css/root.css +0 -0
  381. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/styles/css/tailwind.css +0 -0
  382. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/styles/easings.ts +0 -0
  383. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/styles/fonts.ts +0 -0
  384. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/styles/index.ts +0 -0
  385. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/styles/layout.mjs +0 -0
  386. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/styles/scripts/README.md +0 -0
  387. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/styles/scripts/generate-root.ts +0 -0
  388. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/styles/scripts/generate-tailwind.ts +0 -0
  389. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/styles/scripts/postcss-functions.mjs +0 -0
  390. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/styles/scripts/setup-styles.ts +0 -0
  391. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/styles/scripts/utils.ts +0 -0
  392. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/styles/typography.ts +0 -0
  393. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/utils/README.md +0 -0
  394. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/utils/css.d.ts +0 -0
  395. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/utils/easings.ts +0 -0
  396. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/utils/fetch.ts +0 -0
  397. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/utils/math.test.ts +0 -0
  398. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/utils/math.ts +0 -0
  399. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/utils/strings.test.ts +0 -0
  400. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/utils/strings.ts +0 -0
  401. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/utils/types.d.ts +0 -0
  402. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/utils/viewport.test.ts +0 -0
  403. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/utils/viewport.ts +0 -0
  404. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/next.config.ts +0 -0
  405. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/postcss.config.mjs +0 -0
  406. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/public/fonts/geist/Geist-Mono.woff2 +0 -0
  407. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/tsconfig.json +0 -0
@@ -1,310 +0,0 @@
1
- import { execSync } from "node:child_process";
2
- import path from "node:path";
3
- import fs from "fs-extra";
4
- import ora from "ora";
5
- import pc from "picocolors";
6
- import prompts from "prompts";
7
- import { sanityConfig } from "../../../create-basement-app/integrations/sanity/config.js";
8
-
9
- /**
10
- * Validates that the current directory is a valid Next.js project
11
- */
12
- async function validateProject(targetDir) {
13
- const packageJsonPath = path.join(targetDir, "package.json");
14
-
15
- // Check for package.json
16
- if (!fs.existsSync(packageJsonPath)) {
17
- return {
18
- valid: false,
19
- error: "No package.json found in current directory",
20
- };
21
- }
22
-
23
- const pkg = await fs.readJson(packageJsonPath);
24
-
25
- // Check for Next.js dependency
26
- const hasNext = pkg.dependencies?.next || pkg.devDependencies?.next;
27
- if (!hasNext) {
28
- return {
29
- valid: false,
30
- error:
31
- "This doesn't appear to be a Next.js project (next not found in dependencies)",
32
- };
33
- }
34
-
35
- // Check for app directory (App Router) - supports both root and src/ structures
36
- const appDir = path.join(targetDir, "app");
37
- const srcAppDir = path.join(targetDir, "src/app");
38
- const hasAppDir = fs.existsSync(appDir) || fs.existsSync(srcAppDir);
39
-
40
- if (!hasAppDir) {
41
- return {
42
- valid: false,
43
- error:
44
- "No app/ or src/app/ directory found. This CLI supports Next.js App Router projects only.",
45
- };
46
- }
47
-
48
- // Detect which structure is used
49
- const usesSrcPrefix = fs.existsSync(srcAppDir);
50
-
51
- return { valid: true, pkg, usesSrcPrefix };
52
- }
53
-
54
- /**
55
- * Check if an integration is already installed
56
- */
57
- async function checkExistingIntegration(targetDir, integration, usesSrcPrefix) {
58
- const integrationPaths = {
59
- sanity: "lib/integrations/sanity",
60
- };
61
-
62
- const basePath = integrationPaths[integration];
63
- const prefix = usesSrcPrefix ? "src/" : "";
64
- const integrationPath = path.join(targetDir, prefix + basePath);
65
- return fs.existsSync(integrationPath);
66
- }
67
-
68
- /**
69
- * Add CMS dependencies to package.json from integration config manifests
70
- */
71
- async function addDependencies(targetDir, integration) {
72
- const pkgPath = path.join(targetDir, "package.json");
73
- const pkg = await fs.readJson(pkgPath);
74
-
75
- const cmsConfigs = { sanity: sanityConfig };
76
- const config = cmsConfigs[integration];
77
-
78
- if (config) {
79
- pkg.dependencies = {
80
- ...pkg.dependencies,
81
- ...config.dependencies,
82
- };
83
- if (
84
- config.devDependencies &&
85
- Object.keys(config.devDependencies).length > 0
86
- ) {
87
- pkg.devDependencies = {
88
- ...pkg.devDependencies,
89
- ...config.devDependencies,
90
- };
91
- }
92
- if (config.scripts && Object.keys(config.scripts).length > 0) {
93
- pkg.scripts = {
94
- ...pkg.scripts,
95
- ...config.scripts,
96
- };
97
- }
98
- }
99
-
100
- await fs.writeJson(pkgPath, pkg, { spaces: 2 });
101
- }
102
-
103
- /**
104
- * Adds an integration to the current working directory project
105
- */
106
- export async function addIntegration(options = {}) {
107
- const targetDir = process.cwd();
108
-
109
- // 1. Validate current directory is a Next.js project
110
- const validationSpinner = ora("Validating project...").start();
111
- const validation = await validateProject(targetDir);
112
-
113
- if (!validation.valid) {
114
- validationSpinner.fail(pc.red(validation.error));
115
- console.log(
116
- pc.yellow(
117
- "\n💡 Make sure you're in a Next.js App Router project directory.\n",
118
- ),
119
- );
120
- return;
121
- }
122
- const projectStructure = validation.usesSrcPrefix ? "src/" : "root";
123
- validationSpinner.succeed(
124
- pc.green(
125
- `Found Next.js project: ${pc.cyan(validation.pkg.name || "unnamed")} (${projectStructure} structure)`,
126
- ),
127
- );
128
-
129
- // 2. Select integration (or use flag)
130
- let integration = options.cms;
131
-
132
- if (!integration || integration === "none") {
133
- const { selectedIntegration } = await prompts({
134
- type: "select",
135
- name: "selectedIntegration",
136
- message: "Which integration would you like to add?",
137
- choices: [
138
- {
139
- title: "Sanity CMS",
140
- description: "Headless CMS with real-time collaboration",
141
- value: "sanity",
142
- },
143
- ],
144
- });
145
-
146
- if (!selectedIntegration) {
147
- console.log(pc.yellow("\n⚠ Operation cancelled.\n"));
148
- return;
149
- }
150
-
151
- integration = selectedIntegration;
152
- }
153
-
154
- // 3. Check if integration already exists
155
- const alreadyExists = await checkExistingIntegration(
156
- targetDir,
157
- integration,
158
- validation.usesSrcPrefix,
159
- );
160
- if (alreadyExists) {
161
- const { overwrite } = await prompts({
162
- type: "confirm",
163
- name: "overwrite",
164
- message: `${pc.yellow(integration)} integration already exists. Overwrite?`,
165
- initial: false,
166
- });
167
-
168
- if (!overwrite) {
169
- console.log(pc.yellow("⚠ Operation cancelled."));
170
- return;
171
- }
172
- }
173
-
174
- // 4. Inject integration files using existing merger system
175
- const integrationSpinner = ora(
176
- `Adding ${pc.cyan(integration)} integration...`,
177
- ).start();
178
-
179
- try {
180
- const { injectIntegration, formatMergeResults } = await import(
181
- "../../../create-basement-app/src/mergers/index.js"
182
- );
183
- const results = await injectIntegration(
184
- targetDir,
185
- integration,
186
- integrationSpinner,
187
- );
188
-
189
- const hasErrors = results.failed.length > 0;
190
- const resultLines = formatMergeResults(results);
191
-
192
- if (hasErrors) {
193
- integrationSpinner.warn(
194
- pc.yellow(`${integration} integration completed with warnings:`),
195
- );
196
- } else {
197
- integrationSpinner.succeed(pc.green(`${integration} integration added:`));
198
- }
199
-
200
- // Display detailed results
201
- for (const line of resultLines) {
202
- console.log(pc.dim(line));
203
- }
204
- } catch (e) {
205
- integrationSpinner.fail(
206
- pc.red(`Failed to inject ${integration} integration: ${e.message}`),
207
- );
208
- return;
209
- }
210
-
211
- // 5. Add dependencies to package.json
212
- const depsSpinner = ora("Adding dependencies to package.json...").start();
213
- try {
214
- await addDependencies(targetDir, integration);
215
- depsSpinner.succeed(pc.green("Dependencies added to package.json"));
216
- } catch (e) {
217
- depsSpinner.warn(pc.yellow(`Failed to update package.json: ${e.message}`));
218
- }
219
-
220
- // 6. Register Sanity MCP Server + Agent Toolkit
221
- if (integration === "sanity") {
222
- // MCP registration (Claude Code only)
223
- const claudeDir = path.join(targetDir, ".claude");
224
- if (fs.existsSync(claudeDir)) {
225
- const mcpSpinner = ora("Registering Sanity MCP server...").start();
226
- try {
227
- execSync(
228
- "claude mcp add Sanity -t http https://mcp.sanity.io --scope user",
229
- {
230
- stdio: "pipe",
231
- },
232
- );
233
- mcpSpinner.succeed(pc.green("Sanity MCP server registered."));
234
- } catch (e) {
235
- const stderr = e.stderr?.toString() || "";
236
- if (stderr.includes("already exists")) {
237
- mcpSpinner.succeed(pc.green("Sanity MCP server already registered."));
238
- } else {
239
- mcpSpinner.warn(
240
- pc.yellow(
241
- "Could not register Sanity MCP server. Run manually: claude mcp add Sanity -t http https://mcp.sanity.io --scope user",
242
- ),
243
- );
244
- }
245
- }
246
- }
247
-
248
- // Agent toolkit skills
249
- const agentArg = fs.existsSync(path.join(targetDir, ".claude"))
250
- ? "claude-code"
251
- : fs.existsSync(path.join(targetDir, ".opencode"))
252
- ? "opencode"
253
- : null;
254
-
255
- if (agentArg) {
256
- const skillsSpinner = ora("Installing Sanity agent toolkit...").start();
257
- try {
258
- execSync(`bunx skills add sanity-io/agent-toolkit -a ${agentArg} -y`, {
259
- cwd: targetDir,
260
- stdio: "ignore",
261
- });
262
- skillsSpinner.succeed(pc.green("Sanity agent toolkit installed."));
263
- } catch (_e) {
264
- skillsSpinner.warn(
265
- pc.yellow(
266
- "Could not install Sanity agent toolkit. Add manually: bunx skills add sanity-io/agent-toolkit",
267
- ),
268
- );
269
- }
270
- }
271
- }
272
-
273
- // 7. Automated Sanity Project Setup
274
- let sanitySetupDone = false;
275
- if (integration === "sanity") {
276
- try {
277
- const { setupSanityProject } = await import("./setup-sanity.js");
278
- sanitySetupDone = await setupSanityProject(targetDir);
279
- } catch (e) {
280
- console.log(pc.yellow(`\n Sanity auto-setup skipped: ${e.message}`));
281
- console.log(pc.dim(" You can set up Sanity manually later.\n"));
282
- }
283
- }
284
-
285
- // 8. Success message with next steps
286
- console.log(
287
- `\n${pc.bold(pc.green("✅ Success!"))} ${pc.cyan(integration)} integration added to your project.`,
288
- );
289
- console.log(`\n${pc.bold("Next steps:")}`);
290
- console.log(pc.cyan(` 1. Run: bun install`));
291
-
292
- if (integration === "sanity") {
293
- if (sanitySetupDone) {
294
- console.log(pc.cyan(` 2. Run: bun sanity:typegen`));
295
- console.log(pc.cyan(` 3. Access Sanity Studio at: /studio`));
296
- } else {
297
- console.log(
298
- pc.cyan(` 2. Create a Sanity project at https://sanity.io/manage`),
299
- );
300
- console.log(pc.cyan(` 3. Add your Sanity credentials to .env.local:`));
301
- console.log(pc.dim(` NEXT_PUBLIC_SANITY_PROJECT_ID=your-project-id`));
302
- console.log(pc.dim(` NEXT_PUBLIC_SANITY_DATASET=production`));
303
- console.log(pc.dim(` SANITY_API_READ_TOKEN=your-read-token`));
304
- console.log(pc.cyan(` 4. Run: bun sanity:typegen`));
305
- console.log(pc.cyan(` 5. Access Sanity Studio at: /studio`));
306
- }
307
- }
308
-
309
- console.log();
310
- }
@@ -1,409 +0,0 @@
1
- import { execSync } from "node:child_process";
2
- import path from "node:path";
3
- import { fileURLToPath } from "node:url";
4
- import fs from "fs-extra";
5
- import ora from "ora";
6
- import pc from "picocolors";
7
- import prompts from "prompts";
8
- import { sanityConfig } from "../../../create-basement-app/integrations/sanity/config.js";
9
- import { getAnimationConfig } from "../../../create-basement-app/src/configs/animations.js";
10
- import { hooksConfig } from "../../../create-basement-app/template-hooks/config.js";
11
-
12
- const __filename = fileURLToPath(import.meta.url);
13
- const __dirname = path.dirname(__filename);
14
-
15
- /**
16
- * Creates a new project by copying a local standalone template.
17
- */
18
- export async function createProject(projectName, options = {}) {
19
- // Discover available templates dynamically from create-basement-app/templates/
20
- const templatesDir = path.resolve(
21
- __dirname,
22
- "../../../create-basement-app/templates",
23
- );
24
- const discoveredTemplates = (
25
- await fs.readdir(templatesDir, { withFileTypes: true })
26
- )
27
- .filter((d) => d.isDirectory())
28
- .map((d) => d.name);
29
-
30
- // Virtual templates that alias to an existing template folder
31
- const TEMPLATE_ALIASES = { webgpu: "webgl" };
32
-
33
- // Build full list: discovered folders + virtual aliases (preserving order)
34
- const templateNames = [
35
- ...discoveredTemplates,
36
- ...Object.keys(TEMPLATE_ALIASES).filter(
37
- (v) => !discoveredTemplates.includes(v),
38
- ),
39
- ];
40
-
41
- const templateLabels = {
42
- default: "Default (Next.js Starter)",
43
- webgl: "WebGL (3D Graphics)",
44
- webgpu: "WebGPU (Next-gen Graphics)",
45
- experiment: "Experiment (Creative Coding)",
46
- };
47
-
48
- // 1. Interactive Prompts (skip if flag provided)
49
- const answers = await prompts([
50
- {
51
- type: projectName ? null : "text",
52
- name: "projectName",
53
- message: "What is the name of your project?",
54
- initial: "my-basement-app",
55
- validate: (value) => {
56
- if (/^([A-Za-z\-_\d])+$/.test(value)) return true;
57
- return "Project name may only include letters, numbers, underscores and hashes.";
58
- },
59
- },
60
- {
61
- type: options.template ? null : "select",
62
- name: "projectType",
63
- message: "What type of project are you building?",
64
- choices: templateNames.map((name) => ({
65
- title: templateLabels[name] || name,
66
- value: name,
67
- })),
68
- },
69
- {
70
- type: options.cms ? null : "select",
71
- name: "cms",
72
- message: "Which CMS will you use?",
73
- choices: [
74
- { title: "Sanity", value: "sanity" },
75
- { title: "None", value: "none" },
76
- ],
77
- },
78
- {
79
- type: options.animation ? null : "select",
80
- name: "animation",
81
- message: "Which animation library do you prefer?",
82
- choices: [
83
- { title: "GSAP", value: "gsap" },
84
- { title: "Framer Motion", value: "motion" },
85
- { title: "None", value: "none" },
86
- ],
87
- },
88
- {
89
- type: options.agent ? null : "select",
90
- name: "agent",
91
- message: "Which agent are you using?",
92
- choices: [
93
- { title: "OpenCode", value: "opencode" },
94
- { title: "Claude Code", value: "claude" },
95
- ],
96
- },
97
- {
98
- type: options.hooks !== undefined ? null : "multiselect",
99
- name: "hooks",
100
- message: "Select hooks you want to add:",
101
- choices: hooksConfig.map((h) => ({ title: h.name, value: h.file })),
102
- },
103
- ]);
104
-
105
- const name = projectName || answers.projectName;
106
- const type = options.template || answers.projectType;
107
- const cms = options.cms || answers.cms;
108
- const animation = options.animation || answers.animation;
109
- const agent = options.agent || answers.agent;
110
- const hooks = options.hooks !== undefined ? options.hooks : answers.hooks;
111
-
112
- if (!name || !type) {
113
- console.log(pc.yellow("\n⚠ Operation cancelled.\n"));
114
- return;
115
- }
116
-
117
- const targetDir = path.join(process.cwd(), name);
118
-
119
- // 2. Directory Check
120
- if (fs.existsSync(targetDir)) {
121
- const { overwrite } = await prompts({
122
- type: "confirm",
123
- name: "overwrite",
124
- message: `Directory ${pc.cyan(name)} already exists. Overwrite?`,
125
- initial: false,
126
- });
127
-
128
- if (!overwrite) {
129
- console.log(pc.yellow("⚠ Action cancelled."));
130
- return;
131
- }
132
- await fs.remove(targetDir);
133
- }
134
-
135
- // 3. Copy local template (standalone, no network call)
136
- const actualTemplate = TEMPLATE_ALIASES[type] || type;
137
- const templateDir = path.resolve(
138
- __dirname,
139
- "../../../create-basement-app/templates",
140
- actualTemplate,
141
- );
142
- const copySpinner = ora(`Copying ${pc.cyan(type)} template...`).start();
143
-
144
- try {
145
- await fs.copy(templateDir, targetDir);
146
-
147
- // Rename _gitignore to .gitignore (npm strips dotfiles from published packages)
148
- const underscoreGitignore = path.join(targetDir, "_gitignore");
149
- if (await fs.pathExists(underscoreGitignore)) {
150
- await fs.rename(underscoreGitignore, path.join(targetDir, ".gitignore"));
151
- }
152
-
153
- // Configure renderer for aliased templates (e.g. webgpu uses webgl template with WebGPU renderer)
154
- if (type === "webgpu") {
155
- const rendererPath = path.join(targetDir, "lib/renderer.ts");
156
- if (await fs.pathExists(rendererPath)) {
157
- let content = await fs.readFile(rendererPath, "utf-8");
158
- content = content.replace(
159
- "export const FORCE_WEBGL = true",
160
- "export const FORCE_WEBGL = false",
161
- );
162
- await fs.writeFile(rendererPath, content);
163
- }
164
- }
165
-
166
- copySpinner.succeed(pc.green(`${type} template copied.`));
167
-
168
- // 3.5. Inject Integration Files (Smart Merge)
169
- if (cms && cms !== "none") {
170
- const integrationSpinner = ora(`Integrating ${pc.cyan(cms)}...`).start();
171
-
172
- try {
173
- const { injectIntegration, formatMergeResults } = await import(
174
- "../../../create-basement-app/src/mergers/index.js"
175
- );
176
- const results = await injectIntegration(
177
- targetDir,
178
- cms,
179
- integrationSpinner,
180
- );
181
-
182
- const hasErrors = results.failed.length > 0;
183
- const resultLines = formatMergeResults(results);
184
-
185
- if (hasErrors) {
186
- integrationSpinner.warn(
187
- pc.yellow(`${cms} integration completed with warnings:`),
188
- );
189
- } else {
190
- integrationSpinner.succeed(pc.green(`${cms} integration added:`));
191
- }
192
-
193
- // Display detailed results
194
- for (const line of resultLines) {
195
- console.log(pc.dim(line));
196
- }
197
- } catch (e) {
198
- integrationSpinner.warn(
199
- pc.yellow(`Failed to inject ${cms} integration: ${e.message}`),
200
- );
201
- }
202
- }
203
-
204
- // 4. Hydration: Update package.json
205
- const configSpinner = ora("Configuring project...").start();
206
- const finalPkgPath = path.join(targetDir, "package.json");
207
-
208
- if (fs.existsSync(finalPkgPath)) {
209
- const pkg = await fs.readJson(finalPkgPath);
210
- pkg.name = name;
211
- pkg.version = "0.1.0";
212
-
213
- // Layer deps are already in the standalone template's package.json — no injection needed
214
-
215
- // Inject CMS Dependencies from integration config manifests
216
- const cmsConfigs = { sanity: sanityConfig };
217
- const cmsIntegrationConfig = cmsConfigs[cms];
218
- if (cmsIntegrationConfig) {
219
- pkg.dependencies = {
220
- ...pkg.dependencies,
221
- ...cmsIntegrationConfig.dependencies,
222
- };
223
- if (
224
- cmsIntegrationConfig.devDependencies &&
225
- Object.keys(cmsIntegrationConfig.devDependencies).length > 0
226
- ) {
227
- pkg.devDependencies = {
228
- ...pkg.devDependencies,
229
- ...cmsIntegrationConfig.devDependencies,
230
- };
231
- }
232
- if (
233
- cmsIntegrationConfig.scripts &&
234
- Object.keys(cmsIntegrationConfig.scripts).length > 0
235
- ) {
236
- pkg.scripts = {
237
- ...pkg.scripts,
238
- ...cmsIntegrationConfig.scripts,
239
- };
240
- }
241
- }
242
-
243
- // Inject Animation Dependencies from config manifest
244
- const animationConfig = getAnimationConfig(animation);
245
- if (animationConfig) {
246
- pkg.dependencies = {
247
- ...pkg.dependencies,
248
- ...animationConfig.dependencies,
249
- };
250
- }
251
-
252
- // Inject Hook Dependencies from config manifest
253
- if (hooks && hooks.length > 0) {
254
- for (const hookFile of hooks) {
255
- const hookConfig = hooksConfig.find((h) => h.file === hookFile);
256
- if (hookConfig) {
257
- if (
258
- hookConfig.dependencies &&
259
- Object.keys(hookConfig.dependencies).length > 0
260
- ) {
261
- pkg.dependencies = {
262
- ...pkg.dependencies,
263
- ...hookConfig.dependencies,
264
- };
265
- }
266
- if (
267
- hookConfig.devDependencies &&
268
- Object.keys(hookConfig.devDependencies).length > 0
269
- ) {
270
- pkg.devDependencies = {
271
- ...pkg.devDependencies,
272
- ...hookConfig.devDependencies,
273
- };
274
- }
275
- }
276
- }
277
- }
278
-
279
- await fs.writeJson(finalPkgPath, pkg, { spaces: 2 });
280
- }
281
- configSpinner.succeed(pc.green("Project configured."));
282
-
283
- // 5. Agent Empowerment
284
- const agentArg = agent === "opencode" ? "opencode" : "claude-code";
285
- const agentFolder = agent === "opencode" ? ".opencode" : ".claude";
286
-
287
- const skillsSpinner = ora(
288
- `Adding skills to your super basement agents...`,
289
- ).start();
290
-
291
- // Create skills folder
292
- const skillsPath = path.join(targetDir, agentFolder, "skills");
293
- await fs.ensureDir(skillsPath);
294
- await fs.writeFile(path.join(skillsPath, ".gitkeep"), "");
295
-
296
- const skillsCommands = [
297
- `bunx skills add vercel-labs/agent-skills --skill vercel-react-best-practices --skill web-design-guidelines -a ${agentArg} -y`,
298
- `bunx skills add anthropics/skills --skill frontend-design -a ${agentArg} -y`,
299
- `bunx skills add vercel-labs/next-skills --skill next-best-practices -a ${agentArg} -y`,
300
- ];
301
-
302
- if (type === "webgpu" || type === "experiment") {
303
- skillsCommands.push(
304
- `bunx skills add https://github.com/dgreenheck/webgpu-claude-skill --skill webgpu-threejs-tsl -a ${agentArg} -y`,
305
- );
306
- }
307
-
308
- if (cms === "sanity") {
309
- skillsCommands.push(
310
- `bunx skills add sanity-io/agent-toolkit -a ${agentArg} -y`,
311
- );
312
- }
313
-
314
- try {
315
- execSync(skillsCommands.join(" && "), {
316
- cwd: targetDir,
317
- stdio: "ignore",
318
- });
319
- skillsSpinner.succeed(pc.green("Agent skills installed."));
320
- } catch (_e) {
321
- skillsSpinner.warn(
322
- pc.yellow("Some skills failed to install. Check your connection."),
323
- );
324
- }
325
-
326
- // 5.5. Automated Sanity Project Setup
327
- let sanitySetupDone = false;
328
- if (cms === "sanity") {
329
- try {
330
- const { setupSanityProject } = await import("./setup-sanity.js");
331
- sanitySetupDone = await setupSanityProject(targetDir, {
332
- projectName: name,
333
- });
334
- } catch (e) {
335
- console.log(pc.yellow(`\n Sanity auto-setup skipped: ${e.message}`));
336
- console.log(pc.dim(" You can set up Sanity manually later.\n"));
337
- }
338
- }
339
-
340
- // 5.6. Register Sanity MCP Server (Claude Code only)
341
- if (cms === "sanity" && agent === "claude") {
342
- const mcpSpinner = ora("Registering Sanity MCP server...").start();
343
- try {
344
- execSync(
345
- "claude mcp add Sanity -t http https://mcp.sanity.io --scope user",
346
- {
347
- stdio: "pipe",
348
- },
349
- );
350
- mcpSpinner.succeed(pc.green("Sanity MCP server registered."));
351
- } catch (e) {
352
- const stderr = e.stderr?.toString() || "";
353
- if (stderr.includes("already exists")) {
354
- mcpSpinner.succeed(pc.green("Sanity MCP server already registered."));
355
- } else {
356
- mcpSpinner.warn(
357
- pc.yellow(
358
- "Could not register Sanity MCP server. Run manually: claude mcp add Sanity -t http https://mcp.sanity.io --scope user",
359
- ),
360
- );
361
- }
362
- }
363
- }
364
-
365
- // 6. Add Hooks
366
- if (hooks && hooks.length > 0) {
367
- const hooksSpinner = ora("Adding selected hooks...").start();
368
- const projectHooksPath = path.join(targetDir, "hooks");
369
- await fs.ensureDir(projectHooksPath);
370
-
371
- const hooksSourceDir = path.resolve(
372
- __dirname,
373
- "../../../create-basement-app/template-hooks",
374
- );
375
- for (const hookFile of hooks) {
376
- const sourcePath = path.join(hooksSourceDir, hookFile);
377
- await fs.copy(sourcePath, path.join(projectHooksPath, hookFile));
378
- }
379
- hooksSpinner.succeed(pc.green(`${hooks.length} hooks added.`));
380
- }
381
-
382
- // 7. Final Success Message
383
- console.log(
384
- `\n${pc.bold(pc.green("✅ Success!"))} Project ${pc.cyan(name)} created with agent skills.`,
385
- );
386
- console.log(`\nNext steps:`);
387
- console.log(pc.cyan(` cd ${name}`));
388
- console.log(pc.cyan(` bun install`));
389
-
390
- if (cms === "sanity" && !sanitySetupDone) {
391
- console.log(pc.cyan(` # Set up Sanity credentials:`));
392
- console.log(pc.dim(` # Add to .env.local:`));
393
- console.log(
394
- pc.dim(` # NEXT_PUBLIC_SANITY_PROJECT_ID=your-project-id`),
395
- );
396
- console.log(pc.dim(` # NEXT_PUBLIC_SANITY_DATASET=production`));
397
- console.log(pc.dim(` # SANITY_API_READ_TOKEN=your-read-token`));
398
- }
399
-
400
- console.log(pc.cyan(` bun dev\n`));
401
- } catch (error) {
402
- copySpinner.fail(pc.red("Failed to create project."));
403
- console.error(pc.dim(`\nError details: ${error.message}`));
404
- console.log(pc.yellow("\n💡 Troubleshooting:"));
405
- console.log(`1. Verify the template exists: ${templateDir}`);
406
- console.log(`2. Check file permissions on the target directory.`);
407
- process.exit(1);
408
- }
409
- }