bsmnt 0.1.2 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (447) 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 +25 -12
  88. package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/package.json +1 -1
  89. package/src/templates/next-webgl/lib/renderer.ts +7 -0
  90. package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/package.json +1 -1
  91. package/.changeset/README.md +0 -10
  92. package/.changeset/config.json +0 -16
  93. package/.github/workflows/ci.yml +0 -37
  94. package/.github/workflows/release.yml +0 -56
  95. package/.tldr/cache/call_graph.json +0 -7
  96. package/.tldr/languages.json +0 -6
  97. package/.tldr/status +0 -1
  98. package/.tldrignore +0 -84
  99. package/.vscode/settings.json +0 -98
  100. package/CHANGELOG.md +0 -68
  101. package/CLAUDE.md +0 -156
  102. package/biome.json +0 -45
  103. package/bun.lock +0 -496
  104. package/changelog/04-02-26.md +0 -86
  105. package/changelog/05-02-26.md +0 -101
  106. package/changelog/09-02-26.md +0 -83
  107. package/docs/architecture.drawio +0 -250
  108. package/docs/architecture.mermaid +0 -85
  109. package/docs/fix-studio-hydration.md +0 -46
  110. package/docs/plans/2026-01-29-sanity-smart-merge-design.md +0 -196
  111. package/docs/plans/2026-01-29-sanity-smart-merge-implementation.md +0 -695
  112. package/docs/sanity-setup-steps.md +0 -199
  113. package/packages/cli/bin/index.js +0 -259
  114. package/packages/cli/package.json +0 -16
  115. package/packages/cli/src/commands/add-integration.js +0 -310
  116. package/packages/cli/src/commands/create.js +0 -409
  117. package/packages/cli/src/commands/setup-sanity.js +0 -426
  118. package/packages/cli/src/commands/worktree.js +0 -805
  119. package/packages/create-basement-app/integrations/sanity/config.js +0 -46
  120. package/packages/create-basement-app/integrations/sanity/files/app/api/draft-mode/disable/route.ts +0 -7
  121. package/packages/create-basement-app/integrations/sanity/files/app/api/draft-mode/enable/route.ts +0 -21
  122. package/packages/create-basement-app/integrations/sanity/files/app/api/revalidate/route.ts +0 -37
  123. package/packages/create-basement-app/integrations/sanity/files/app/layout.tsx +0 -111
  124. package/packages/create-basement-app/integrations/sanity/files/app/sitemap.ts +0 -80
  125. package/packages/create-basement-app/integrations/sanity/files/app/studio/[[...tool]]/page.tsx +0 -8
  126. package/packages/create-basement-app/integrations/sanity/files/app/studio/layout.tsx +0 -7
  127. package/packages/create-basement-app/integrations/sanity/files/components/ui/sanity-image/index.tsx +0 -37
  128. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/README.md +0 -58
  129. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/check-integration.ts +0 -62
  130. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/sanity/README.md +0 -144
  131. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/sanity/client.ts +0 -30
  132. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/sanity/components/disable-draft-mode.tsx +0 -29
  133. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/sanity/components/rich-text.tsx +0 -73
  134. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/sanity/env.ts +0 -38
  135. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/sanity/live/index.tsx +0 -34
  136. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/sanity/queries.ts +0 -99
  137. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/sanity/sanity.cli.ts +0 -20
  138. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/sanity/sanity.config.ts +0 -94
  139. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/sanity/sanity.types.ts +0 -337
  140. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/sanity/schema.json +0 -1850
  141. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/sanity/schemas/article.ts +0 -132
  142. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/sanity/schemas/example.ts +0 -203
  143. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/sanity/schemas/index.ts +0 -37
  144. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/sanity/schemas/link.ts +0 -127
  145. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/sanity/schemas/metadata.ts +0 -68
  146. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/sanity/schemas/navigation.ts +0 -39
  147. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/sanity/schemas/page.ts +0 -77
  148. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/sanity/schemas/richText.ts +0 -59
  149. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/sanity/structure.ts +0 -5
  150. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/sanity/utils/image.ts +0 -11
  151. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/sanity/utils/link.ts +0 -61
  152. package/packages/create-basement-app/integrations/sanity/files/lib/scripts/copy-sanity-mcp.ts +0 -23
  153. package/packages/create-basement-app/integrations/sanity/files/lib/scripts/generate-page.ts +0 -310
  154. package/packages/create-basement-app/integrations/sanity/files/lib/utils/metadata.ts +0 -190
  155. package/packages/create-basement-app/integrations/sanity/mergers/check-integration-merger.js +0 -105
  156. package/packages/create-basement-app/integrations/sanity/mergers/layout-merger.js +0 -223
  157. package/packages/create-basement-app/integrations/sanity/mergers/sitemap-merger.js +0 -121
  158. package/packages/create-basement-app/package.json +0 -10
  159. package/packages/create-basement-app/src/configs/animations.js +0 -28
  160. package/packages/create-basement-app/src/index.js +0 -15
  161. package/packages/create-basement-app/src/mergers/check-integration-merger.js +0 -105
  162. package/packages/create-basement-app/src/mergers/config.js +0 -109
  163. package/packages/create-basement-app/src/mergers/index.js +0 -346
  164. package/packages/create-basement-app/src/mergers/layout-merger.js +0 -223
  165. package/packages/create-basement-app/templates/experiment/.cursor/rules/README.md +0 -184
  166. package/packages/create-basement-app/templates/experiment/.cursor/rules/architecture.mdc +0 -437
  167. package/packages/create-basement-app/templates/experiment/.cursor/rules/components.mdc +0 -436
  168. package/packages/create-basement-app/templates/experiment/.cursor/rules/integrations.mdc +0 -447
  169. package/packages/create-basement-app/templates/experiment/.cursor/rules/main.mdc +0 -278
  170. package/packages/create-basement-app/templates/experiment/.cursor/rules/styling.mdc +0 -433
  171. package/packages/create-basement-app/templates/experiment/.github/PULL_REQUEST_TEMPLATE.md +0 -14
  172. package/packages/create-basement-app/templates/experiment/.vscode/extensions.json +0 -20
  173. package/packages/create-basement-app/templates/experiment/app/page.tsx +0 -275
  174. package/packages/create-basement-app/templates/webgl/.biome/plugins/README.md +0 -21
  175. package/packages/create-basement-app/templates/webgl/.biome/plugins/no-anchor-element.grit +0 -12
  176. package/packages/create-basement-app/templates/webgl/.biome/plugins/no-relative-parent-imports.grit +0 -10
  177. package/packages/create-basement-app/templates/webgl/.biome/plugins/no-unnecessary-forwardref.grit +0 -9
  178. package/packages/create-basement-app/templates/webgl/.cursor/rules/README.md +0 -184
  179. package/packages/create-basement-app/templates/webgl/.cursor/rules/architecture.mdc +0 -437
  180. package/packages/create-basement-app/templates/webgl/.cursor/rules/components.mdc +0 -436
  181. package/packages/create-basement-app/templates/webgl/.cursor/rules/integrations.mdc +0 -447
  182. package/packages/create-basement-app/templates/webgl/.cursor/rules/main.mdc +0 -278
  183. package/packages/create-basement-app/templates/webgl/.cursor/rules/styling.mdc +0 -433
  184. package/packages/create-basement-app/templates/webgl/.github/PULL_REQUEST_TEMPLATE.md +0 -14
  185. package/packages/create-basement-app/templates/webgl/.github/workflows/lighthouse-to-slack.yml +0 -136
  186. package/packages/create-basement-app/templates/webgl/.vscode/extensions.json +0 -20
  187. package/packages/create-basement-app/templates/webgl/.vscode/settings.json +0 -105
  188. package/packages/create-basement-app/templates/webgl/app/favicon.ico +0 -0
  189. package/packages/create-basement-app/templates/webgl/app/layout.tsx +0 -104
  190. package/packages/create-basement-app/templates/webgl/app/robots.ts +0 -15
  191. package/packages/create-basement-app/templates/webgl/app/sitemap.ts +0 -16
  192. package/packages/create-basement-app/templates/webgl/components/layout/footer/index.tsx +0 -27
  193. package/packages/create-basement-app/templates/webgl/components/layout/header/index.tsx +0 -11
  194. package/packages/create-basement-app/templates/webgl/components/layout/theme/index.tsx +0 -66
  195. package/packages/create-basement-app/templates/webgl/components/layout/wrapper/index.tsx +0 -65
  196. package/packages/create-basement-app/templates/webgl/components/ui/README.md +0 -77
  197. package/packages/create-basement-app/templates/webgl/components/ui/image/README.md +0 -37
  198. package/packages/create-basement-app/templates/webgl/components/ui/image/index.tsx +0 -224
  199. package/packages/create-basement-app/templates/webgl/components/ui/link/index.tsx +0 -146
  200. package/packages/create-basement-app/templates/webgl/lib/integrations/.gitkeep +0 -0
  201. package/packages/create-basement-app/templates/webgl/public/fonts/geist/Geist-Mono.woff2 +0 -0
  202. package/tasks/.last-branch +0 -1
  203. package/tasks/CLAUDE.md +0 -104
  204. package/tasks/archive/2026-02-09-next-starter-dynamic-layers/prd.json +0 -153
  205. package/tasks/archive/2026-02-09-next-starter-dynamic-layers/progress.txt +0 -115
  206. package/tasks/prd-next-starter-dynamic-layers.md +0 -184
  207. package/tasks/prd-project-restructure.md +0 -375
  208. package/tasks/prd.json +0 -289
  209. package/tasks/progress.txt +0 -309
  210. package/tasks/ralph.sh +0 -113
  211. /package/{packages/create-basement-app/plugins → plugins}/no-anchor-element.grit +0 -0
  212. /package/{packages/create-basement-app/plugins → plugins}/no-relative-parent-imports.grit +0 -0
  213. /package/{packages/create-basement-app/plugins → plugins}/no-unnecessary-forwardref.grit +0 -0
  214. /package/{packages/create-basement-app → src}/template-hooks/config.js +0 -0
  215. /package/{packages/create-basement-app → src}/template-hooks/use-battery.ts +0 -0
  216. /package/{packages/create-basement-app → src}/template-hooks/use-device-perf.ts +0 -0
  217. /package/{packages/create-basement-app → src}/template-hooks/use-intersection-observer.ts +0 -0
  218. /package/{packages/create-basement-app → src}/template-hooks/use-media.ts +0 -0
  219. /package/{packages/create-basement-app → src/templates/next-default/.biome}/plugins/README.md +0 -0
  220. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/.editorconfig +0 -0
  221. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/.env.example +0 -0
  222. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/.gitattributes +0 -0
  223. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/README.md +0 -0
  224. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/_gitignore +0 -0
  225. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/biome.json +0 -0
  226. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/components/basement.svg +0 -0
  227. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/README.md +0 -0
  228. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/hooks/index.ts +0 -0
  229. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/hooks/use-device-detection.ts +0 -0
  230. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/hooks/use-media-breakpoint.ts +0 -0
  231. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/hooks/use-prefetch.ts +0 -0
  232. /package/{.github/workflows → src/templates/next-default/lib/integrations}/.gitkeep +0 -0
  233. /package/{packages/create-basement-app/templates/webgl → src/templates/next-default}/lib/renderer.ts +0 -0
  234. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/scripts/dev.ts +0 -0
  235. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/scripts/generate-component.ts +0 -0
  236. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/scripts/generate-page.ts +0 -0
  237. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/scripts/generate.ts +0 -0
  238. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/scripts/utils.ts +0 -0
  239. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/store/app.ts +0 -0
  240. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/store/index.ts +0 -0
  241. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/styles/README.md +0 -0
  242. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/styles/cn.ts +0 -0
  243. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/styles/colors.ts +0 -0
  244. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/styles/config.ts +0 -0
  245. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/styles/css/global.css +0 -0
  246. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/styles/css/index.css +0 -0
  247. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/styles/css/reset.css +0 -0
  248. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/styles/css/root.css +0 -0
  249. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/styles/css/tailwind.css +0 -0
  250. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/styles/easings.ts +0 -0
  251. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/styles/fonts.ts +0 -0
  252. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/styles/index.ts +0 -0
  253. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/styles/layout.mjs +0 -0
  254. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/styles/scripts/README.md +0 -0
  255. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/styles/scripts/generate-root.ts +0 -0
  256. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/styles/scripts/generate-tailwind.ts +0 -0
  257. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/styles/scripts/postcss-functions.mjs +0 -0
  258. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/styles/scripts/setup-styles.ts +0 -0
  259. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/styles/scripts/utils.ts +0 -0
  260. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/styles/typography.ts +0 -0
  261. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/utils/README.md +0 -0
  262. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/utils/css.d.ts +0 -0
  263. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/utils/easings.ts +0 -0
  264. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/utils/fetch.ts +0 -0
  265. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/utils/math.test.ts +0 -0
  266. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/utils/math.ts +0 -0
  267. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/utils/metadata.ts +0 -0
  268. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/utils/strings.test.ts +0 -0
  269. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/utils/strings.ts +0 -0
  270. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/utils/types.d.ts +0 -0
  271. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/utils/viewport.test.ts +0 -0
  272. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/utils/viewport.ts +0 -0
  273. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/next.config.ts +0 -0
  274. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/package.json +0 -0
  275. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/postcss.config.mjs +0 -0
  276. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/tsconfig.json +0 -0
  277. /package/{packages/create-basement-app/templates/default → src/templates/next-experiments}/.biome/plugins/README.md +0 -0
  278. /package/{packages/create-basement-app/templates/default → src/templates/next-experiments}/.biome/plugins/no-anchor-element.grit +0 -0
  279. /package/{packages/create-basement-app/templates/default → src/templates/next-experiments}/.biome/plugins/no-relative-parent-imports.grit +0 -0
  280. /package/{packages/create-basement-app/templates/default → src/templates/next-experiments}/.biome/plugins/no-unnecessary-forwardref.grit +0 -0
  281. /package/{.cursor → src/templates/next-experiments/.cursor}/rules/README.md +0 -0
  282. /package/{.cursor → src/templates/next-experiments/.cursor}/rules/architecture.mdc +0 -0
  283. /package/{.cursor → src/templates/next-experiments/.cursor}/rules/components.mdc +0 -0
  284. /package/{.cursor → src/templates/next-experiments/.cursor}/rules/integrations.mdc +0 -0
  285. /package/{.cursor → src/templates/next-experiments/.cursor}/rules/main.mdc +0 -0
  286. /package/{.cursor → src/templates/next-experiments/.cursor}/rules/styling.mdc +0 -0
  287. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/.editorconfig +0 -0
  288. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/.env.example +0 -0
  289. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/.gitattributes +0 -0
  290. /package/{.github → src/templates/next-experiments/.github}/PULL_REQUEST_TEMPLATE.md +0 -0
  291. /package/{packages/create-basement-app/templates/default → src/templates/next-experiments}/.github/workflows/lighthouse-to-slack.yml +0 -0
  292. /package/{.vscode → src/templates/next-experiments/.vscode}/extensions.json +0 -0
  293. /package/{packages/create-basement-app/templates/default → src/templates/next-experiments}/.vscode/settings.json +0 -0
  294. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/README.md +0 -0
  295. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/_gitignore +0 -0
  296. /package/{packages/create-basement-app/templates/default → src/templates/next-experiments}/app/favicon.ico +0 -0
  297. /package/{packages/create-basement-app/templates/default → src/templates/next-experiments}/app/layout.tsx +0 -0
  298. /package/{packages/create-basement-app/templates/default → src/templates/next-experiments}/app/page.tsx +0 -0
  299. /package/{packages/create-basement-app/templates/default → src/templates/next-experiments}/app/robots.ts +0 -0
  300. /package/{packages/create-basement-app/templates/default → src/templates/next-experiments}/app/sitemap.ts +0 -0
  301. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/biome.json +0 -0
  302. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/components/basement.svg +0 -0
  303. /package/{packages/create-basement-app/templates/default → src/templates/next-experiments}/components/layout/footer/index.tsx +0 -0
  304. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/components/layout/header/index.tsx +0 -0
  305. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/components/layout/navigation-menu.tsx +0 -0
  306. /package/{packages/create-basement-app/templates/default → src/templates/next-experiments}/components/layout/theme/index.tsx +0 -0
  307. /package/{packages/create-basement-app/templates/default → src/templates/next-experiments}/components/layout/wrapper/index.tsx +0 -0
  308. /package/{packages/create-basement-app/templates/default → src/templates/next-experiments}/components/ui/README.md +0 -0
  309. /package/{packages/create-basement-app/templates/default → src/templates/next-experiments}/components/ui/image/README.md +0 -0
  310. /package/{packages/create-basement-app/templates/default → src/templates/next-experiments}/components/ui/image/index.tsx +0 -0
  311. /package/{packages/create-basement-app/templates/default → src/templates/next-experiments}/components/ui/link/index.tsx +0 -0
  312. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/README.md +0 -0
  313. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/constants.ts +0 -0
  314. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/hooks/index.ts +0 -0
  315. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/hooks/use-device-detection.ts +0 -0
  316. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/hooks/use-media-breakpoint.ts +0 -0
  317. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/hooks/use-prefetch.ts +0 -0
  318. /package/{packages/create-basement-app/templates/default → src/templates/next-experiments}/lib/integrations/.gitkeep +0 -0
  319. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/scripts/dev.ts +0 -0
  320. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/scripts/generate-component.ts +0 -0
  321. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/scripts/generate-page.ts +0 -0
  322. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/scripts/generate.ts +0 -0
  323. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/scripts/utils.ts +0 -0
  324. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/store/app.ts +0 -0
  325. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/store/index.ts +0 -0
  326. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/styles/README.md +0 -0
  327. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/styles/cn.ts +0 -0
  328. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/styles/colors.ts +0 -0
  329. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/styles/config.ts +0 -0
  330. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/styles/css/global.css +0 -0
  331. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/styles/css/index.css +0 -0
  332. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/styles/css/reset.css +0 -0
  333. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/styles/css/root.css +0 -0
  334. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/styles/css/tailwind.css +0 -0
  335. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/styles/easings.ts +0 -0
  336. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/styles/fonts.ts +0 -0
  337. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/styles/index.ts +0 -0
  338. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/styles/layout.mjs +0 -0
  339. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/styles/scripts/README.md +0 -0
  340. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/styles/scripts/generate-root.ts +0 -0
  341. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/styles/scripts/generate-tailwind.ts +0 -0
  342. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/styles/scripts/postcss-functions.mjs +0 -0
  343. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/styles/scripts/setup-styles.ts +0 -0
  344. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/styles/scripts/utils.ts +0 -0
  345. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/styles/typography.ts +0 -0
  346. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/utils/README.md +0 -0
  347. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/utils/css.d.ts +0 -0
  348. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/utils/easings.ts +0 -0
  349. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/utils/fetch.ts +0 -0
  350. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/utils/math.test.ts +0 -0
  351. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/utils/math.ts +0 -0
  352. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/utils/metadata.ts +0 -0
  353. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/utils/strings.test.ts +0 -0
  354. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/utils/strings.ts +0 -0
  355. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/utils/types.d.ts +0 -0
  356. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/utils/viewport.test.ts +0 -0
  357. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/utils/viewport.ts +0 -0
  358. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/next.config.ts +0 -0
  359. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/postcss.config.mjs +0 -0
  360. /package/{packages/create-basement-app/templates/default → src/templates/next-experiments}/public/fonts/geist/Geist-Mono.woff2 +0 -0
  361. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/tsconfig.json +0 -0
  362. /package/{packages/create-basement-app/templates/experiment → src/templates/next-webgl}/.biome/plugins/README.md +0 -0
  363. /package/{packages/create-basement-app/templates/experiment → src/templates/next-webgl}/.biome/plugins/no-anchor-element.grit +0 -0
  364. /package/{packages/create-basement-app/templates/experiment → src/templates/next-webgl}/.biome/plugins/no-relative-parent-imports.grit +0 -0
  365. /package/{packages/create-basement-app/templates/experiment → src/templates/next-webgl}/.biome/plugins/no-unnecessary-forwardref.grit +0 -0
  366. /package/{packages/create-basement-app/templates/default → src/templates/next-webgl}/.cursor/rules/README.md +0 -0
  367. /package/{packages/create-basement-app/templates/default → src/templates/next-webgl}/.cursor/rules/architecture.mdc +0 -0
  368. /package/{packages/create-basement-app/templates/default → src/templates/next-webgl}/.cursor/rules/components.mdc +0 -0
  369. /package/{packages/create-basement-app/templates/default → src/templates/next-webgl}/.cursor/rules/integrations.mdc +0 -0
  370. /package/{packages/create-basement-app/templates/default → src/templates/next-webgl}/.cursor/rules/main.mdc +0 -0
  371. /package/{packages/create-basement-app/templates/default → src/templates/next-webgl}/.cursor/rules/styling.mdc +0 -0
  372. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/.editorconfig +0 -0
  373. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/.env.example +0 -0
  374. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/.gitattributes +0 -0
  375. /package/{packages/create-basement-app/templates/default → src/templates/next-webgl}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  376. /package/{packages/create-basement-app/templates/experiment → src/templates/next-webgl}/.github/workflows/lighthouse-to-slack.yml +0 -0
  377. /package/{packages/create-basement-app/templates/default → src/templates/next-webgl}/.vscode/extensions.json +0 -0
  378. /package/{packages/create-basement-app/templates/experiment → src/templates/next-webgl}/.vscode/settings.json +0 -0
  379. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/README.md +0 -0
  380. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/_gitignore +0 -0
  381. /package/{packages/create-basement-app/templates/experiment → src/templates/next-webgl}/app/favicon.ico +0 -0
  382. /package/{packages/create-basement-app/templates/experiment → src/templates/next-webgl}/app/layout.tsx +0 -0
  383. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/app/page.tsx +0 -0
  384. /package/{packages/create-basement-app/templates/experiment → src/templates/next-webgl}/app/robots.ts +0 -0
  385. /package/{packages/create-basement-app/templates/experiment → src/templates/next-webgl}/app/sitemap.ts +0 -0
  386. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/biome.json +0 -0
  387. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/components/basement.svg +0 -0
  388. /package/{packages/create-basement-app/templates/experiment → src/templates/next-webgl}/components/layout/footer/index.tsx +0 -0
  389. /package/{packages/create-basement-app/templates/default → src/templates/next-webgl}/components/layout/header/index.tsx +0 -0
  390. /package/{packages/create-basement-app/templates/experiment → src/templates/next-webgl}/components/layout/theme/index.tsx +0 -0
  391. /package/{packages/create-basement-app/templates/experiment → src/templates/next-webgl}/components/layout/wrapper/index.tsx +0 -0
  392. /package/{packages/create-basement-app/templates/experiment → src/templates/next-webgl}/components/ui/README.md +0 -0
  393. /package/{packages/create-basement-app/templates/experiment → src/templates/next-webgl}/components/ui/image/README.md +0 -0
  394. /package/{packages/create-basement-app/templates/experiment → src/templates/next-webgl}/components/ui/image/index.tsx +0 -0
  395. /package/{packages/create-basement-app/templates/experiment → src/templates/next-webgl}/components/ui/link/index.tsx +0 -0
  396. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/components/webgl/canvas/dynamic.tsx +0 -0
  397. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/components/webgl/canvas/index.tsx +0 -0
  398. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/components/webgl/components/scene/index.tsx +0 -0
  399. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/README.md +0 -0
  400. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/hooks/index.ts +0 -0
  401. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/hooks/use-device-detection.ts +0 -0
  402. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/hooks/use-media-breakpoint.ts +0 -0
  403. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/hooks/use-prefetch.ts +0 -0
  404. /package/{packages/create-basement-app/templates/experiment → src/templates/next-webgl}/lib/integrations/.gitkeep +0 -0
  405. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/scripts/dev.ts +0 -0
  406. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/scripts/generate-component.ts +0 -0
  407. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/scripts/generate-page.ts +0 -0
  408. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/scripts/generate.ts +0 -0
  409. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/scripts/utils.ts +0 -0
  410. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/store/app.ts +0 -0
  411. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/store/index.ts +0 -0
  412. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/styles/README.md +0 -0
  413. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/styles/cn.ts +0 -0
  414. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/styles/colors.ts +0 -0
  415. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/styles/config.ts +0 -0
  416. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/styles/css/global.css +0 -0
  417. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/styles/css/index.css +0 -0
  418. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/styles/css/reset.css +0 -0
  419. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/styles/css/root.css +0 -0
  420. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/styles/css/tailwind.css +0 -0
  421. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/styles/easings.ts +0 -0
  422. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/styles/fonts.ts +0 -0
  423. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/styles/index.ts +0 -0
  424. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/styles/layout.mjs +0 -0
  425. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/styles/scripts/README.md +0 -0
  426. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/styles/scripts/generate-root.ts +0 -0
  427. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/styles/scripts/generate-tailwind.ts +0 -0
  428. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/styles/scripts/postcss-functions.mjs +0 -0
  429. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/styles/scripts/setup-styles.ts +0 -0
  430. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/styles/scripts/utils.ts +0 -0
  431. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/styles/typography.ts +0 -0
  432. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/utils/README.md +0 -0
  433. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/utils/css.d.ts +0 -0
  434. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/utils/easings.ts +0 -0
  435. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/utils/fetch.ts +0 -0
  436. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/utils/math.test.ts +0 -0
  437. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/utils/math.ts +0 -0
  438. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/utils/metadata.ts +0 -0
  439. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/utils/strings.test.ts +0 -0
  440. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/utils/strings.ts +0 -0
  441. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/utils/types.d.ts +0 -0
  442. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/utils/viewport.test.ts +0 -0
  443. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/utils/viewport.ts +0 -0
  444. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/next.config.ts +0 -0
  445. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/postcss.config.mjs +0 -0
  446. /package/{packages/create-basement-app/templates/experiment → src/templates/next-webgl}/public/fonts/geist/Geist-Mono.woff2 +0 -0
  447. /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
- }