bsmnt 0.0.2 → 0.1.1

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 (346) hide show
  1. package/.github/workflows/release.yml +2 -0
  2. package/CHANGELOG.md +31 -0
  3. package/CLAUDE.md +42 -24
  4. package/README.md +33 -12
  5. package/biome.json +1 -0
  6. package/bun.lock +2 -1
  7. package/docs/architecture.drawio +250 -0
  8. package/docs/architecture.mermaid +85 -0
  9. package/package.json +42 -42
  10. package/{bin → packages/cli/bin}/index.js +28 -31
  11. package/packages/cli/package.json +16 -0
  12. package/{src → packages/cli/src}/commands/add-integration.js +22 -37
  13. package/{src → packages/cli/src}/commands/create.js +125 -131
  14. package/packages/create-basement-app/integrations/sanity/config.js +46 -0
  15. package/{src → packages/create-basement-app/integrations/sanity}/mergers/check-integration-merger.js +1 -1
  16. package/{src → packages/create-basement-app/integrations/sanity}/mergers/layout-merger.js +1 -1
  17. package/{src → packages/create-basement-app/integrations/sanity}/mergers/sitemap-merger.js +1 -1
  18. package/packages/create-basement-app/package.json +10 -0
  19. package/packages/create-basement-app/src/configs/animations.js +28 -0
  20. package/packages/create-basement-app/src/index.js +15 -0
  21. package/packages/create-basement-app/src/mergers/check-integration-merger.js +105 -0
  22. package/{src → packages/create-basement-app/src}/mergers/config.js +5 -33
  23. package/{src → packages/create-basement-app/src}/mergers/index.js +89 -98
  24. package/packages/create-basement-app/src/mergers/layout-merger.js +223 -0
  25. package/packages/create-basement-app/src/mergers/sitemap-merger.js +121 -0
  26. package/packages/create-basement-app/template-hooks/config.js +38 -0
  27. package/packages/create-basement-app/templates/default/.biome/plugins/README.md +21 -0
  28. package/packages/create-basement-app/templates/default/.biome/plugins/no-anchor-element.grit +12 -0
  29. package/packages/create-basement-app/templates/default/.biome/plugins/no-relative-parent-imports.grit +10 -0
  30. package/packages/create-basement-app/templates/default/.biome/plugins/no-unnecessary-forwardref.grit +9 -0
  31. package/packages/create-basement-app/templates/default/.cursor/rules/README.md +184 -0
  32. package/packages/create-basement-app/templates/default/.cursor/rules/architecture.mdc +437 -0
  33. package/packages/create-basement-app/templates/default/.cursor/rules/components.mdc +436 -0
  34. package/packages/create-basement-app/templates/default/.cursor/rules/integrations.mdc +447 -0
  35. package/packages/create-basement-app/templates/default/.cursor/rules/main.mdc +278 -0
  36. package/packages/create-basement-app/templates/default/.cursor/rules/styling.mdc +433 -0
  37. package/packages/create-basement-app/templates/default/.editorconfig +40 -0
  38. package/packages/create-basement-app/templates/default/.env.example +81 -0
  39. package/packages/create-basement-app/templates/default/.gitattributes +19 -0
  40. package/packages/create-basement-app/templates/default/.github/PULL_REQUEST_TEMPLATE.md +14 -0
  41. package/packages/create-basement-app/templates/default/.github/workflows/lighthouse-to-slack.yml +136 -0
  42. package/packages/create-basement-app/templates/default/.vscode/extensions.json +20 -0
  43. package/packages/create-basement-app/templates/default/.vscode/settings.json +105 -0
  44. package/packages/create-basement-app/templates/default/README.md +221 -0
  45. package/packages/create-basement-app/templates/default/_gitignore +67 -0
  46. package/packages/create-basement-app/templates/default/app/favicon.ico +0 -0
  47. package/packages/create-basement-app/templates/default/app/layout.tsx +104 -0
  48. package/packages/create-basement-app/templates/default/app/page.tsx +275 -0
  49. package/packages/create-basement-app/templates/default/app/robots.ts +15 -0
  50. package/packages/create-basement-app/templates/default/app/sitemap.ts +16 -0
  51. package/packages/create-basement-app/templates/default/biome.json +250 -0
  52. package/packages/create-basement-app/templates/default/components/basement.svg +1 -0
  53. package/packages/create-basement-app/templates/default/components/layout/footer/index.tsx +27 -0
  54. package/packages/create-basement-app/templates/default/components/layout/header/index.tsx +11 -0
  55. package/packages/create-basement-app/templates/default/components/layout/theme/index.tsx +66 -0
  56. package/packages/create-basement-app/templates/default/components/layout/wrapper/index.tsx +65 -0
  57. package/packages/create-basement-app/templates/default/components/ui/README.md +77 -0
  58. package/packages/create-basement-app/templates/default/components/ui/image/README.md +37 -0
  59. package/packages/create-basement-app/templates/default/components/ui/image/index.tsx +224 -0
  60. package/packages/create-basement-app/templates/default/components/ui/link/index.tsx +146 -0
  61. package/packages/create-basement-app/templates/default/lib/README.md +33 -0
  62. package/packages/create-basement-app/templates/default/lib/hooks/index.ts +12 -0
  63. package/packages/create-basement-app/templates/default/lib/hooks/use-device-detection.ts +81 -0
  64. package/packages/create-basement-app/templates/default/lib/hooks/use-media-breakpoint.ts +15 -0
  65. package/packages/create-basement-app/templates/default/lib/hooks/use-prefetch.ts +74 -0
  66. package/packages/create-basement-app/templates/default/lib/scripts/dev.ts +52 -0
  67. package/packages/create-basement-app/templates/default/lib/scripts/generate-component.ts +322 -0
  68. package/packages/create-basement-app/templates/default/lib/scripts/generate-page.ts +193 -0
  69. package/packages/create-basement-app/templates/default/lib/scripts/generate.ts +79 -0
  70. package/packages/create-basement-app/templates/default/lib/scripts/utils.ts +246 -0
  71. package/packages/create-basement-app/templates/default/lib/store/app.ts +11 -0
  72. package/packages/create-basement-app/templates/default/lib/store/index.ts +11 -0
  73. package/packages/create-basement-app/templates/default/lib/styles/README.md +64 -0
  74. package/packages/create-basement-app/templates/default/lib/styles/cn.ts +7 -0
  75. package/packages/create-basement-app/templates/default/lib/styles/colors.ts +63 -0
  76. package/packages/create-basement-app/templates/default/lib/styles/config.ts +34 -0
  77. package/packages/create-basement-app/templates/default/lib/styles/css/global.css +85 -0
  78. package/packages/create-basement-app/templates/default/lib/styles/css/index.css +6 -0
  79. package/packages/create-basement-app/templates/default/lib/styles/css/reset.css +166 -0
  80. package/packages/create-basement-app/templates/default/lib/styles/css/root.css +68 -0
  81. package/packages/create-basement-app/templates/default/lib/styles/css/tailwind.css +132 -0
  82. package/packages/create-basement-app/templates/default/lib/styles/easings.ts +21 -0
  83. package/packages/create-basement-app/templates/default/lib/styles/fonts.ts +28 -0
  84. package/packages/create-basement-app/templates/default/lib/styles/index.ts +12 -0
  85. package/packages/create-basement-app/templates/default/lib/styles/layout.mjs +27 -0
  86. package/packages/create-basement-app/templates/default/lib/styles/scripts/README.md +29 -0
  87. package/packages/create-basement-app/templates/default/lib/styles/scripts/generate-root.ts +57 -0
  88. package/packages/create-basement-app/templates/default/lib/styles/scripts/generate-tailwind.ts +162 -0
  89. package/packages/create-basement-app/templates/default/lib/styles/scripts/postcss-functions.mjs +168 -0
  90. package/packages/create-basement-app/templates/default/lib/styles/scripts/setup-styles.ts +24 -0
  91. package/packages/create-basement-app/templates/default/lib/styles/scripts/utils.ts +20 -0
  92. package/packages/create-basement-app/templates/default/lib/styles/typography.ts +36 -0
  93. package/packages/create-basement-app/templates/default/lib/utils/README.md +40 -0
  94. package/packages/create-basement-app/templates/default/lib/utils/css.d.ts +21 -0
  95. package/packages/create-basement-app/templates/default/lib/utils/easings.ts +240 -0
  96. package/packages/create-basement-app/templates/default/lib/utils/fetch.ts +84 -0
  97. package/packages/create-basement-app/templates/default/lib/utils/math.test.ts +221 -0
  98. package/packages/create-basement-app/templates/default/lib/utils/math.ts +236 -0
  99. package/packages/create-basement-app/templates/default/lib/utils/metadata.ts +126 -0
  100. package/packages/create-basement-app/templates/default/lib/utils/strings.test.ts +166 -0
  101. package/packages/create-basement-app/templates/default/lib/utils/strings.ts +246 -0
  102. package/packages/create-basement-app/templates/default/lib/utils/types.d.ts +15 -0
  103. package/packages/create-basement-app/templates/default/lib/utils/viewport.test.ts +256 -0
  104. package/packages/create-basement-app/templates/default/lib/utils/viewport.ts +193 -0
  105. package/packages/create-basement-app/templates/default/next.config.ts +142 -0
  106. package/packages/create-basement-app/templates/default/package.json +62 -0
  107. package/packages/create-basement-app/templates/default/postcss.config.mjs +42 -0
  108. package/packages/create-basement-app/templates/default/public/fonts/geist/Geist-Mono.woff2 +0 -0
  109. package/packages/create-basement-app/templates/default/tsconfig.json +43 -0
  110. package/packages/create-basement-app/templates/experiment/.biome/plugins/README.md +21 -0
  111. package/packages/create-basement-app/templates/experiment/.biome/plugins/no-anchor-element.grit +12 -0
  112. package/packages/create-basement-app/templates/experiment/.biome/plugins/no-relative-parent-imports.grit +10 -0
  113. package/packages/create-basement-app/templates/experiment/.biome/plugins/no-unnecessary-forwardref.grit +9 -0
  114. package/packages/create-basement-app/templates/experiment/.cursor/rules/README.md +184 -0
  115. package/packages/create-basement-app/templates/experiment/.cursor/rules/architecture.mdc +437 -0
  116. package/packages/create-basement-app/templates/experiment/.cursor/rules/components.mdc +436 -0
  117. package/packages/create-basement-app/templates/experiment/.cursor/rules/integrations.mdc +447 -0
  118. package/packages/create-basement-app/templates/experiment/.cursor/rules/main.mdc +278 -0
  119. package/packages/create-basement-app/templates/experiment/.cursor/rules/styling.mdc +433 -0
  120. package/packages/create-basement-app/templates/experiment/.editorconfig +40 -0
  121. package/packages/create-basement-app/templates/experiment/.env.example +81 -0
  122. package/packages/create-basement-app/templates/experiment/.gitattributes +19 -0
  123. package/packages/create-basement-app/templates/experiment/.github/PULL_REQUEST_TEMPLATE.md +14 -0
  124. package/packages/create-basement-app/templates/experiment/.github/workflows/lighthouse-to-slack.yml +136 -0
  125. package/packages/create-basement-app/templates/experiment/.vscode/extensions.json +20 -0
  126. package/packages/create-basement-app/templates/experiment/.vscode/settings.json +105 -0
  127. package/packages/create-basement-app/templates/experiment/README.md +221 -0
  128. package/packages/create-basement-app/templates/experiment/_gitignore +67 -0
  129. package/packages/create-basement-app/templates/experiment/app/favicon.ico +0 -0
  130. package/packages/create-basement-app/templates/experiment/app/layout.tsx +104 -0
  131. package/packages/create-basement-app/templates/experiment/app/page.tsx +275 -0
  132. package/packages/create-basement-app/templates/experiment/app/robots.ts +15 -0
  133. package/packages/create-basement-app/templates/experiment/app/sitemap.ts +16 -0
  134. package/packages/create-basement-app/templates/experiment/biome.json +250 -0
  135. package/packages/create-basement-app/templates/experiment/components/basement.svg +1 -0
  136. package/packages/create-basement-app/templates/experiment/components/layout/footer/index.tsx +27 -0
  137. package/packages/create-basement-app/templates/experiment/components/layout/header/index.tsx +58 -0
  138. package/packages/create-basement-app/templates/experiment/components/layout/navigation-menu.tsx +127 -0
  139. package/packages/create-basement-app/templates/experiment/components/layout/theme/index.tsx +66 -0
  140. package/packages/create-basement-app/templates/experiment/components/layout/wrapper/index.tsx +65 -0
  141. package/packages/create-basement-app/templates/experiment/components/ui/README.md +77 -0
  142. package/packages/create-basement-app/templates/experiment/components/ui/image/README.md +37 -0
  143. package/packages/create-basement-app/templates/experiment/components/ui/image/index.tsx +224 -0
  144. package/packages/create-basement-app/templates/experiment/components/ui/link/index.tsx +146 -0
  145. package/packages/create-basement-app/templates/experiment/lib/README.md +33 -0
  146. package/packages/create-basement-app/templates/experiment/lib/constants.ts +12 -0
  147. package/packages/create-basement-app/templates/experiment/lib/hooks/index.ts +12 -0
  148. package/packages/create-basement-app/templates/experiment/lib/hooks/use-device-detection.ts +81 -0
  149. package/packages/create-basement-app/templates/experiment/lib/hooks/use-media-breakpoint.ts +15 -0
  150. package/packages/create-basement-app/templates/experiment/lib/hooks/use-prefetch.ts +74 -0
  151. package/packages/create-basement-app/templates/experiment/lib/integrations/.gitkeep +0 -0
  152. package/packages/create-basement-app/templates/experiment/lib/scripts/dev.ts +52 -0
  153. package/packages/create-basement-app/templates/experiment/lib/scripts/generate-component.ts +322 -0
  154. package/packages/create-basement-app/templates/experiment/lib/scripts/generate-page.ts +193 -0
  155. package/packages/create-basement-app/templates/experiment/lib/scripts/generate.ts +79 -0
  156. package/packages/create-basement-app/templates/experiment/lib/scripts/utils.ts +246 -0
  157. package/packages/create-basement-app/templates/experiment/lib/store/app.ts +11 -0
  158. package/packages/create-basement-app/templates/experiment/lib/store/index.ts +11 -0
  159. package/packages/create-basement-app/templates/experiment/lib/styles/README.md +64 -0
  160. package/packages/create-basement-app/templates/experiment/lib/styles/cn.ts +7 -0
  161. package/packages/create-basement-app/templates/experiment/lib/styles/colors.ts +63 -0
  162. package/packages/create-basement-app/templates/experiment/lib/styles/config.ts +34 -0
  163. package/packages/create-basement-app/templates/experiment/lib/styles/css/global.css +85 -0
  164. package/packages/create-basement-app/templates/experiment/lib/styles/css/index.css +6 -0
  165. package/packages/create-basement-app/templates/experiment/lib/styles/css/reset.css +166 -0
  166. package/packages/create-basement-app/templates/experiment/lib/styles/css/root.css +68 -0
  167. package/packages/create-basement-app/templates/experiment/lib/styles/css/tailwind.css +132 -0
  168. package/packages/create-basement-app/templates/experiment/lib/styles/easings.ts +21 -0
  169. package/packages/create-basement-app/templates/experiment/lib/styles/fonts.ts +28 -0
  170. package/packages/create-basement-app/templates/experiment/lib/styles/index.ts +12 -0
  171. package/packages/create-basement-app/templates/experiment/lib/styles/layout.mjs +27 -0
  172. package/packages/create-basement-app/templates/experiment/lib/styles/scripts/README.md +29 -0
  173. package/packages/create-basement-app/templates/experiment/lib/styles/scripts/generate-root.ts +57 -0
  174. package/packages/create-basement-app/templates/experiment/lib/styles/scripts/generate-tailwind.ts +162 -0
  175. package/packages/create-basement-app/templates/experiment/lib/styles/scripts/postcss-functions.mjs +168 -0
  176. package/packages/create-basement-app/templates/experiment/lib/styles/scripts/setup-styles.ts +24 -0
  177. package/packages/create-basement-app/templates/experiment/lib/styles/scripts/utils.ts +20 -0
  178. package/packages/create-basement-app/templates/experiment/lib/styles/typography.ts +36 -0
  179. package/packages/create-basement-app/templates/experiment/lib/utils/README.md +40 -0
  180. package/packages/create-basement-app/templates/experiment/lib/utils/css.d.ts +21 -0
  181. package/packages/create-basement-app/templates/experiment/lib/utils/easings.ts +240 -0
  182. package/packages/create-basement-app/templates/experiment/lib/utils/fetch.ts +84 -0
  183. package/packages/create-basement-app/templates/experiment/lib/utils/math.test.ts +221 -0
  184. package/packages/create-basement-app/templates/experiment/lib/utils/math.ts +236 -0
  185. package/packages/create-basement-app/templates/experiment/lib/utils/metadata.ts +126 -0
  186. package/packages/create-basement-app/templates/experiment/lib/utils/strings.test.ts +166 -0
  187. package/packages/create-basement-app/templates/experiment/lib/utils/strings.ts +246 -0
  188. package/packages/create-basement-app/templates/experiment/lib/utils/types.d.ts +15 -0
  189. package/packages/create-basement-app/templates/experiment/lib/utils/viewport.test.ts +256 -0
  190. package/packages/create-basement-app/templates/experiment/lib/utils/viewport.ts +193 -0
  191. package/packages/create-basement-app/templates/experiment/next.config.ts +142 -0
  192. package/packages/create-basement-app/templates/experiment/package.json +69 -0
  193. package/packages/create-basement-app/templates/experiment/postcss.config.mjs +42 -0
  194. package/packages/create-basement-app/templates/experiment/public/fonts/geist/Geist-Mono.woff2 +0 -0
  195. package/packages/create-basement-app/templates/experiment/tsconfig.json +43 -0
  196. package/packages/create-basement-app/templates/webgl/.biome/plugins/README.md +21 -0
  197. package/packages/create-basement-app/templates/webgl/.biome/plugins/no-anchor-element.grit +12 -0
  198. package/packages/create-basement-app/templates/webgl/.biome/plugins/no-relative-parent-imports.grit +10 -0
  199. package/packages/create-basement-app/templates/webgl/.biome/plugins/no-unnecessary-forwardref.grit +9 -0
  200. package/packages/create-basement-app/templates/webgl/.cursor/rules/README.md +184 -0
  201. package/packages/create-basement-app/templates/webgl/.cursor/rules/architecture.mdc +437 -0
  202. package/packages/create-basement-app/templates/webgl/.cursor/rules/components.mdc +436 -0
  203. package/packages/create-basement-app/templates/webgl/.cursor/rules/integrations.mdc +447 -0
  204. package/packages/create-basement-app/templates/webgl/.cursor/rules/main.mdc +278 -0
  205. package/packages/create-basement-app/templates/webgl/.cursor/rules/styling.mdc +433 -0
  206. package/packages/create-basement-app/templates/webgl/.editorconfig +40 -0
  207. package/packages/create-basement-app/templates/webgl/.env.example +81 -0
  208. package/packages/create-basement-app/templates/webgl/.gitattributes +19 -0
  209. package/packages/create-basement-app/templates/webgl/.github/PULL_REQUEST_TEMPLATE.md +14 -0
  210. package/packages/create-basement-app/templates/webgl/.github/workflows/lighthouse-to-slack.yml +136 -0
  211. package/packages/create-basement-app/templates/webgl/.vscode/extensions.json +20 -0
  212. package/packages/create-basement-app/templates/webgl/.vscode/settings.json +105 -0
  213. package/packages/create-basement-app/templates/webgl/README.md +221 -0
  214. package/packages/create-basement-app/templates/webgl/_gitignore +67 -0
  215. package/packages/create-basement-app/templates/webgl/app/favicon.ico +0 -0
  216. package/packages/create-basement-app/templates/webgl/app/layout.tsx +104 -0
  217. package/packages/create-basement-app/templates/webgl/app/page.tsx +10 -0
  218. package/packages/create-basement-app/templates/webgl/app/robots.ts +15 -0
  219. package/packages/create-basement-app/templates/webgl/app/sitemap.ts +16 -0
  220. package/packages/create-basement-app/templates/webgl/biome.json +250 -0
  221. package/packages/create-basement-app/templates/webgl/components/basement.svg +1 -0
  222. package/packages/create-basement-app/templates/webgl/components/layout/footer/index.tsx +27 -0
  223. package/packages/create-basement-app/templates/webgl/components/layout/header/index.tsx +11 -0
  224. package/packages/create-basement-app/templates/webgl/components/layout/theme/index.tsx +66 -0
  225. package/packages/create-basement-app/templates/webgl/components/layout/wrapper/index.tsx +65 -0
  226. package/packages/create-basement-app/templates/webgl/components/ui/README.md +77 -0
  227. package/packages/create-basement-app/templates/webgl/components/ui/image/README.md +37 -0
  228. package/packages/create-basement-app/templates/webgl/components/ui/image/index.tsx +224 -0
  229. package/packages/create-basement-app/templates/webgl/components/ui/link/index.tsx +146 -0
  230. package/packages/create-basement-app/templates/webgl/components/webgl/canvas/dynamic.tsx +34 -0
  231. package/packages/create-basement-app/templates/webgl/components/webgl/canvas/index.tsx +38 -0
  232. package/packages/create-basement-app/templates/webgl/components/webgl/components/scene/index.tsx +29 -0
  233. package/packages/create-basement-app/templates/webgl/lib/README.md +33 -0
  234. package/packages/create-basement-app/templates/webgl/lib/hooks/index.ts +12 -0
  235. package/packages/create-basement-app/templates/webgl/lib/hooks/use-device-detection.ts +81 -0
  236. package/packages/create-basement-app/templates/webgl/lib/hooks/use-media-breakpoint.ts +15 -0
  237. package/packages/create-basement-app/templates/webgl/lib/hooks/use-prefetch.ts +74 -0
  238. package/packages/create-basement-app/templates/webgl/lib/integrations/.gitkeep +0 -0
  239. package/packages/create-basement-app/templates/webgl/lib/renderer.ts +7 -0
  240. package/packages/create-basement-app/templates/webgl/lib/scripts/dev.ts +52 -0
  241. package/packages/create-basement-app/templates/webgl/lib/scripts/generate-component.ts +322 -0
  242. package/packages/create-basement-app/templates/webgl/lib/scripts/generate-page.ts +193 -0
  243. package/packages/create-basement-app/templates/webgl/lib/scripts/generate.ts +79 -0
  244. package/packages/create-basement-app/templates/webgl/lib/scripts/utils.ts +246 -0
  245. package/packages/create-basement-app/templates/webgl/lib/store/app.ts +11 -0
  246. package/packages/create-basement-app/templates/webgl/lib/store/index.ts +11 -0
  247. package/packages/create-basement-app/templates/webgl/lib/styles/README.md +64 -0
  248. package/packages/create-basement-app/templates/webgl/lib/styles/cn.ts +7 -0
  249. package/packages/create-basement-app/templates/webgl/lib/styles/colors.ts +63 -0
  250. package/packages/create-basement-app/templates/webgl/lib/styles/config.ts +34 -0
  251. package/packages/create-basement-app/templates/webgl/lib/styles/css/global.css +85 -0
  252. package/packages/create-basement-app/templates/webgl/lib/styles/css/index.css +6 -0
  253. package/packages/create-basement-app/templates/webgl/lib/styles/css/reset.css +166 -0
  254. package/packages/create-basement-app/templates/webgl/lib/styles/css/root.css +68 -0
  255. package/packages/create-basement-app/templates/webgl/lib/styles/css/tailwind.css +132 -0
  256. package/packages/create-basement-app/templates/webgl/lib/styles/easings.ts +21 -0
  257. package/packages/create-basement-app/templates/webgl/lib/styles/fonts.ts +28 -0
  258. package/packages/create-basement-app/templates/webgl/lib/styles/index.ts +12 -0
  259. package/packages/create-basement-app/templates/webgl/lib/styles/layout.mjs +27 -0
  260. package/packages/create-basement-app/templates/webgl/lib/styles/scripts/README.md +29 -0
  261. package/packages/create-basement-app/templates/webgl/lib/styles/scripts/generate-root.ts +57 -0
  262. package/packages/create-basement-app/templates/webgl/lib/styles/scripts/generate-tailwind.ts +162 -0
  263. package/packages/create-basement-app/templates/webgl/lib/styles/scripts/postcss-functions.mjs +168 -0
  264. package/packages/create-basement-app/templates/webgl/lib/styles/scripts/setup-styles.ts +24 -0
  265. package/packages/create-basement-app/templates/webgl/lib/styles/scripts/utils.ts +20 -0
  266. package/packages/create-basement-app/templates/webgl/lib/styles/typography.ts +36 -0
  267. package/packages/create-basement-app/templates/webgl/lib/utils/README.md +40 -0
  268. package/packages/create-basement-app/templates/webgl/lib/utils/css.d.ts +21 -0
  269. package/packages/create-basement-app/templates/webgl/lib/utils/easings.ts +240 -0
  270. package/packages/create-basement-app/templates/webgl/lib/utils/fetch.ts +84 -0
  271. package/packages/create-basement-app/templates/webgl/lib/utils/math.test.ts +221 -0
  272. package/packages/create-basement-app/templates/webgl/lib/utils/math.ts +236 -0
  273. package/packages/create-basement-app/templates/webgl/lib/utils/metadata.ts +126 -0
  274. package/packages/create-basement-app/templates/webgl/lib/utils/strings.test.ts +166 -0
  275. package/packages/create-basement-app/templates/webgl/lib/utils/strings.ts +246 -0
  276. package/packages/create-basement-app/templates/webgl/lib/utils/types.d.ts +15 -0
  277. package/packages/create-basement-app/templates/webgl/lib/utils/viewport.test.ts +256 -0
  278. package/packages/create-basement-app/templates/webgl/lib/utils/viewport.ts +193 -0
  279. package/packages/create-basement-app/templates/webgl/next.config.ts +142 -0
  280. package/packages/create-basement-app/templates/webgl/package.json +68 -0
  281. package/packages/create-basement-app/templates/webgl/postcss.config.mjs +42 -0
  282. package/packages/create-basement-app/templates/webgl/public/fonts/geist/Geist-Mono.woff2 +0 -0
  283. package/packages/create-basement-app/templates/webgl/tsconfig.json +43 -0
  284. package/tasks/.last-branch +1 -0
  285. package/tasks/CLAUDE.md +104 -0
  286. package/tasks/archive/2026-02-09-next-starter-dynamic-layers/prd.json +153 -0
  287. package/tasks/archive/2026-02-09-next-starter-dynamic-layers/progress.txt +115 -0
  288. package/tasks/prd-project-restructure.md +375 -0
  289. package/tasks/prd.json +227 -91
  290. package/tasks/progress.txt +281 -87
  291. package/tasks/ralph.sh +113 -0
  292. package/integrations/basehub/README.md +0 -3
  293. package/layers/experiment/components/layout/header/index.tsx +0 -58
  294. package/layers/experiment/components/layout/navigation-menu.tsx +0 -127
  295. package/layers/experiment/lib/constants.ts +0 -12
  296. package/layers/webgl/app/page.tsx +0 -10
  297. package/layers/webgl/components/webgl/canvas/dynamic.tsx +0 -34
  298. package/layers/webgl/components/webgl/canvas/index.tsx +0 -43
  299. package/layers/webgl/components/webgl/components/scene/index.tsx +0 -21
  300. package/src/mergers/next-config-merger.js +0 -63
  301. /package/{src → packages/cli/src}/commands/setup-sanity.js +0 -0
  302. /package/{src → packages/cli/src}/commands/worktree.js +0 -0
  303. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/app/api/draft-mode/disable/route.ts +0 -0
  304. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/app/api/draft-mode/enable/route.ts +0 -0
  305. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/app/api/revalidate/route.ts +0 -0
  306. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/app/layout.tsx +0 -0
  307. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/app/sitemap.ts +0 -0
  308. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/app/studio/[[...tool]]/page.tsx +0 -0
  309. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/app/studio/layout.tsx +0 -0
  310. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/components/ui/sanity-image/index.tsx +0 -0
  311. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/README.md +0 -0
  312. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/check-integration.ts +0 -0
  313. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/README.md +0 -0
  314. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/client.ts +0 -0
  315. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/components/disable-draft-mode.tsx +0 -0
  316. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/components/rich-text.tsx +0 -0
  317. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/env.ts +0 -0
  318. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/live/index.tsx +0 -0
  319. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/queries.ts +0 -0
  320. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/sanity.cli.ts +0 -0
  321. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/sanity.config.ts +0 -0
  322. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/sanity.types.ts +0 -0
  323. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/schema.json +0 -0
  324. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/schemas/article.ts +0 -0
  325. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/schemas/example.ts +0 -0
  326. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/schemas/index.ts +0 -0
  327. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/schemas/link.ts +0 -0
  328. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/schemas/metadata.ts +0 -0
  329. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/schemas/navigation.ts +0 -0
  330. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/schemas/page.ts +0 -0
  331. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/schemas/richText.ts +0 -0
  332. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/structure.ts +0 -0
  333. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/utils/image.ts +0 -0
  334. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/utils/link.ts +0 -0
  335. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/scripts/copy-sanity-mcp.ts +0 -0
  336. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/scripts/generate-page.ts +0 -0
  337. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/utils/metadata.ts +0 -0
  338. /package/{plugins → packages/create-basement-app/plugins}/README.md +0 -0
  339. /package/{plugins → packages/create-basement-app/plugins}/no-anchor-element.grit +0 -0
  340. /package/{plugins → packages/create-basement-app/plugins}/no-relative-parent-imports.grit +0 -0
  341. /package/{plugins → packages/create-basement-app/plugins}/no-unnecessary-forwardref.grit +0 -0
  342. /package/{template-hooks → packages/create-basement-app/template-hooks}/use-battery.ts +0 -0
  343. /package/{template-hooks → packages/create-basement-app/template-hooks}/use-device-perf.ts +0 -0
  344. /package/{template-hooks → packages/create-basement-app/template-hooks}/use-intersection-observer.ts +0 -0
  345. /package/{template-hooks → packages/create-basement-app/template-hooks}/use-media.ts +0 -0
  346. /package/{layers/webgpu → packages/create-basement-app/templates/default/lib/integrations}/.gitkeep +0 -0
@@ -1,23 +1,50 @@
1
1
  import { execSync } from "node:child_process";
2
2
  import path from "node:path";
3
3
  import { fileURLToPath } from "node:url";
4
- import dotenv from "dotenv";
5
4
  import fs from "fs-extra";
6
5
  import ora from "ora";
7
6
  import pc from "picocolors";
8
7
  import prompts from "prompts";
9
- import tiged from "tiged";
10
- import { getLayerConfig } from "../mergers/config.js";
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
11
 
12
12
  const __filename = fileURLToPath(import.meta.url);
13
13
  const __dirname = path.dirname(__filename);
14
14
 
15
- dotenv.config({ path: path.resolve(__dirname, "../../.env") });
16
-
17
15
  /**
18
- * Creates a new project by downloading a template from GitHub.
16
+ * Creates a new project by copying a local standalone template.
19
17
  */
20
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
+
21
48
  // 1. Interactive Prompts (skip if flag provided)
22
49
  const answers = await prompts([
23
50
  {
@@ -34,12 +61,10 @@ export async function createProject(projectName, options = {}) {
34
61
  type: options.template ? null : "select",
35
62
  name: "projectType",
36
63
  message: "What type of project are you building?",
37
- choices: [
38
- { title: "Default (Next.js Starter)", value: "default" },
39
- { title: "WebGL (3D Graphics)", value: "webgl" },
40
- { title: "WebGPU (Next-gen Graphics)", value: "webgpu" },
41
- { title: "Experiment (Creative Coding)", value: "experiment" },
42
- ],
64
+ choices: templateNames.map((name) => ({
65
+ title: templateLabels[name] || name,
66
+ value: name,
67
+ })),
43
68
  },
44
69
  {
45
70
  type: options.cms ? null : "select",
@@ -47,7 +72,6 @@ export async function createProject(projectName, options = {}) {
47
72
  message: "Which CMS will you use?",
48
73
  choices: [
49
74
  { title: "Sanity", value: "sanity" },
50
- { title: "BaseHub", value: "basehub" },
51
75
  { title: "None", value: "none" },
52
76
  ],
53
77
  },
@@ -74,13 +98,7 @@ export async function createProject(projectName, options = {}) {
74
98
  type: options.hooks !== undefined ? null : "multiselect",
75
99
  name: "hooks",
76
100
  message: "Select hooks you want to add:",
77
- choices: async () => {
78
- const hooksPath = path.join(__dirname, "..", "..", "template-hooks");
79
- const files = await fs.readdir(hooksPath);
80
- return files
81
- .filter((f) => f.endsWith(".ts"))
82
- .map((f) => ({ title: f.replace(".ts", ""), value: f }));
83
- },
101
+ choices: hooksConfig.map((h) => ({ title: h.name, value: h.file })),
84
102
  },
85
103
  ]);
86
104
 
@@ -114,76 +132,46 @@ export async function createProject(projectName, options = {}) {
114
132
  await fs.remove(targetDir);
115
133
  }
116
134
 
117
- // 3. Download from GitHub
118
- const downloadSpinner = ora(
119
- `Downloading next-starter from GitHub...`,
120
- ).start();
121
-
122
- const repoPath = `github:basementstudio/next-starter#main`;
123
- const emitter = tiged(repoPath, {
124
- cache: false,
125
- force: true,
126
- verbose: true,
127
- mode: "git",
128
- });
129
-
130
- // Diagnostic logging
131
- emitter.on("info", (info) => {
132
- downloadSpinner.text = pc.dim(`[tiged] ${info.message}`);
133
- });
134
-
135
- emitter.on("warn", (warning) => {
136
- console.warn(pc.yellow(`\n⚠ [tiged] ${warning.message}`));
137
- });
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();
138
143
 
139
144
  try {
140
- await emitter.clone(targetDir);
145
+ await fs.copy(templateDir, targetDir);
141
146
 
142
- // Delete bun.lock since dependencies will be modified by layers/CMS/animation
143
- const bunLockPath = path.join(targetDir, "bun.lock");
144
- if (fs.existsSync(bunLockPath)) {
145
- await fs.remove(bunLockPath);
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"));
146
151
  }
147
152
 
148
- downloadSpinner.succeed(pc.green("Template downloaded."));
149
-
150
- // 3.2. Inject Technology Layer
151
- if (type && type !== "default") {
152
- const layerSpinner = ora(`Applying ${pc.cyan(type)} layer...`).start();
153
-
154
- try {
155
- const { injectLayer, formatMergeResults } = await import(
156
- "../mergers/index.js"
157
- );
158
- const layerResults = await injectLayer(targetDir, type, layerSpinner);
159
-
160
- const hasErrors = layerResults.failed.length > 0;
161
- const resultLines = formatMergeResults(layerResults);
162
-
163
- if (hasErrors) {
164
- layerSpinner.warn(pc.yellow(`${type} layer applied with warnings:`));
165
- } else {
166
- layerSpinner.succeed(pc.green(`${type} layer applied:`));
167
- }
168
-
169
- for (const line of resultLines) {
170
- console.log(pc.dim(line));
171
- }
172
- } catch (e) {
173
- console.warn(
174
- pc.yellow(`\n⚠ Failed to apply ${type} layer: ${e.message}`),
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",
175
161
  );
176
- console.log(pc.dim(" Continuing with base template..."));
162
+ await fs.writeFile(rendererPath, content);
177
163
  }
178
164
  }
179
165
 
166
+ copySpinner.succeed(pc.green(`${type} template copied.`));
167
+
180
168
  // 3.5. Inject Integration Files (Smart Merge)
181
169
  if (cms && cms !== "none") {
182
170
  const integrationSpinner = ora(`Integrating ${pc.cyan(cms)}...`).start();
183
171
 
184
172
  try {
185
173
  const { injectIntegration, formatMergeResults } = await import(
186
- "../mergers/index.js"
174
+ "../../../create-basement-app/src/mergers/index.js"
187
175
  );
188
176
  const results = await injectIntegration(
189
177
  targetDir,
@@ -222,61 +210,70 @@ export async function createProject(projectName, options = {}) {
222
210
  pkg.name = name;
223
211
  pkg.version = "0.1.0";
224
212
 
225
- // Inject Layer Dependencies from LAYER_CONFIG
226
- const layerConfig = getLayerConfig(type);
227
- if (layerConfig) {
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) {
228
219
  pkg.dependencies = {
229
220
  ...pkg.dependencies,
230
- ...layerConfig.dependencies,
231
- };
232
- pkg.devDependencies = {
233
- ...pkg.devDependencies,
234
- ...layerConfig.devDependencies,
221
+ ...cmsIntegrationConfig.dependencies,
235
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
+ }
236
241
  }
237
242
 
238
- // Inject CMS Dependencies
239
- if (cms === "sanity") {
243
+ // Inject Animation Dependencies from config manifest
244
+ const animationConfig = getAnimationConfig(animation);
245
+ if (animationConfig) {
240
246
  pkg.dependencies = {
241
247
  ...pkg.dependencies,
242
- "@sanity/asset-utils": "^2.3.0",
243
- "@sanity/image-url": "^2.0.3",
244
- "@sanity/visual-editing": "^5.1.1",
245
- "@sanity/vision": "^5.7.0",
246
- "next-sanity": "^12.0.14",
247
- };
248
-
249
- pkg.devDependencies = {
250
- ...pkg.devDependencies,
251
- sanity: "^5.6.0",
252
- };
253
-
254
- pkg.scripts = {
255
- ...pkg.scripts,
256
- "sanity:extract":
257
- "cd lib/integrations/sanity && bun --env-file ../../../.env.local sanity schema extract",
258
- "sanity:typegen":
259
- "cd lib/integrations/sanity && bun --env-file ../../../.env.local sanity typegen generate && bun biome check --write --unsafe",
260
- };
261
- } else if (cms === "basehub") {
262
- pkg.dependencies = {
263
- ...pkg.dependencies,
264
- basehub: "^3.0.0",
248
+ ...animationConfig.dependencies,
265
249
  };
266
250
  }
267
251
 
268
- // Inject Animation Dependencies
269
- if (animation === "gsap") {
270
- pkg.dependencies = {
271
- ...pkg.dependencies,
272
- gsap: "^3.12.0",
273
- "@gsap/react": "^2.0.0",
274
- };
275
- } else if (animation === "motion") {
276
- pkg.dependencies = {
277
- ...pkg.dependencies,
278
- motion: "^12.0.0",
279
- };
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
+ }
280
277
  }
281
278
 
282
279
  await fs.writeJson(finalPkgPath, pkg, { spaces: 2 });
@@ -371,14 +368,12 @@ export async function createProject(projectName, options = {}) {
371
368
  const projectHooksPath = path.join(targetDir, "hooks");
372
369
  await fs.ensureDir(projectHooksPath);
373
370
 
371
+ const hooksSourceDir = path.resolve(
372
+ __dirname,
373
+ "../../../create-basement-app/template-hooks",
374
+ );
374
375
  for (const hookFile of hooks) {
375
- const sourcePath = path.join(
376
- __dirname,
377
- "..",
378
- "..",
379
- "template-hooks",
380
- hookFile,
381
- );
376
+ const sourcePath = path.join(hooksSourceDir, hookFile);
382
377
  await fs.copy(sourcePath, path.join(projectHooksPath, hookFile));
383
378
  }
384
379
  hooksSpinner.succeed(pc.green(`${hooks.length} hooks added.`));
@@ -404,12 +399,11 @@ export async function createProject(projectName, options = {}) {
404
399
 
405
400
  console.log(pc.cyan(` bun dev\n`));
406
401
  } catch (error) {
407
- downloadSpinner.fail(pc.red("Failed to create project."));
402
+ copySpinner.fail(pc.red("Failed to create project."));
408
403
  console.error(pc.dim(`\nError details: ${error.message}`));
409
404
  console.log(pc.yellow("\n💡 Troubleshooting:"));
410
- console.log(`1. Ensure you have a stable internet connection.`);
411
- console.log(`2. Verify the repo exists: basementstudio/next-starter`);
412
- console.log(`3. Branch "main" must exist in the repository.`);
405
+ console.log(`1. Verify the template exists: ${templateDir}`);
406
+ console.log(`2. Check file permissions on the target directory.`);
413
407
  process.exit(1);
414
408
  }
415
409
  }
@@ -0,0 +1,46 @@
1
+ // packages/create-basement-app/integrations/sanity/config.js
2
+
3
+ /**
4
+ * Sanity integration configuration manifest.
5
+ * Single source of truth for dependencies, scripts, paths, and merge rules.
6
+ */
7
+ export const sanityConfig = {
8
+ name: "sanity",
9
+
10
+ dependencies: {
11
+ "@sanity/asset-utils": "^2.3.0",
12
+ "@sanity/image-url": "^2.0.3",
13
+ "@sanity/visual-editing": "^5.1.1",
14
+ "@sanity/vision": "^5.7.0",
15
+ "next-sanity": "^12.0.14",
16
+ },
17
+
18
+ devDependencies: {
19
+ sanity: "^5.6.0",
20
+ },
21
+
22
+ scripts: {
23
+ "sanity:extract":
24
+ "cd lib/integrations/sanity && bun --env-file ../../../.env.local sanity schema extract",
25
+ "sanity:typegen":
26
+ "cd lib/integrations/sanity && bun --env-file ../../../.env.local sanity typegen generate && bun biome check --write --unsafe",
27
+ },
28
+
29
+ additivePaths: [
30
+ "lib/integrations/sanity",
31
+ "components/ui/sanity-image",
32
+ "app/api/draft-mode",
33
+ "app/api/revalidate",
34
+ "app/studio",
35
+ "lib/utils/metadata.ts",
36
+ "lib/scripts/generate-page.ts",
37
+ "lib/scripts/copy-sanity-mcp.ts",
38
+ "lib/integrations/README.md",
39
+ ],
40
+
41
+ mergeFiles: [
42
+ "app/layout.tsx",
43
+ "app/sitemap.ts",
44
+ "lib/integrations/check-integration.ts",
45
+ ],
46
+ };
@@ -1,4 +1,4 @@
1
- // src/mergers/check-integration-merger.js
1
+ // packages/create-basement-app/src/mergers/check-integration-merger.js
2
2
  import fs from "fs-extra";
3
3
 
4
4
  /**
@@ -1,4 +1,4 @@
1
- // src/mergers/layout-merger.js
1
+ // packages/create-basement-app/src/mergers/layout-merger.js
2
2
 
3
3
  import path from "node:path";
4
4
  import fs from "fs-extra";
@@ -1,4 +1,4 @@
1
- // src/mergers/sitemap-merger.js
1
+ // packages/create-basement-app/src/mergers/sitemap-merger.js
2
2
  import fs from "fs-extra";
3
3
 
4
4
  /**
@@ -0,0 +1,10 @@
1
+ {
2
+ "name": "@basementstudio/create-basement-app",
3
+ "version": "0.1.0",
4
+ "description": "Template scaffolding and merge logic for basement projects",
5
+ "type": "module",
6
+ "main": "src/index.js",
7
+ "dependencies": {
8
+ "fs-extra": "^11.3.3"
9
+ }
10
+ }
@@ -0,0 +1,28 @@
1
+ // packages/create-basement-app/src/configs/animations.js
2
+
3
+ /**
4
+ * Animation library configuration manifest.
5
+ * Single source of truth for animation library dependencies.
6
+ */
7
+ export const ANIMATION_CONFIG = {
8
+ gsap: {
9
+ dependencies: {
10
+ gsap: "^3.12.0",
11
+ "@gsap/react": "^2.0.0",
12
+ },
13
+ },
14
+ motion: {
15
+ dependencies: {
16
+ motion: "^12.0.0",
17
+ },
18
+ },
19
+ };
20
+
21
+ /**
22
+ * Get configuration for a specific animation library
23
+ * @param {string} name - The animation library name (e.g., 'gsap', 'motion')
24
+ * @returns {object|null} Animation configuration or null if not found
25
+ */
26
+ export function getAnimationConfig(name) {
27
+ return ANIMATION_CONFIG[name] || null;
28
+ }
@@ -0,0 +1,15 @@
1
+ // packages/create-basement-app/src/index.js
2
+
3
+ export { ANIMATION_CONFIG, getAnimationConfig } from "./configs/animations.js";
4
+ export {
5
+ CMS_CONFIG,
6
+ getCmsConfig,
7
+ getLayerConfig,
8
+ isCmsSupported,
9
+ LAYER_CONFIG,
10
+ } from "./mergers/config.js";
11
+ export {
12
+ formatMergeResults,
13
+ injectIntegration,
14
+ injectLayer,
15
+ } from "./mergers/index.js";
@@ -0,0 +1,105 @@
1
+ // packages/create-basement-app/src/mergers/check-integration-merger.js
2
+ import fs from "fs-extra";
3
+
4
+ /**
5
+ * Sanity configuration check function to add
6
+ */
7
+ const SANITY_FUNCTION = `
8
+ /**
9
+ * Check if Sanity CMS is configured
10
+ * Requires: NEXT_PUBLIC_SANITY_PROJECT_ID and NEXT_PUBLIC_SANITY_DATASET
11
+ */
12
+ export function isSanityConfigured(): boolean {
13
+ return Boolean(
14
+ process.env.NEXT_PUBLIC_SANITY_PROJECT_ID &&
15
+ process.env.NEXT_PUBLIC_SANITY_DATASET
16
+ )
17
+ }
18
+ `;
19
+
20
+ /**
21
+ * Update to getConfiguredIntegrations to include Sanity
22
+ */
23
+ const SANITY_CONFIGURED_CHECK = ` if (isSanityConfigured()) integrations.push("Sanity")`;
24
+
25
+ /**
26
+ * Update to getUnconfiguredIntegrations to include Sanity
27
+ */
28
+ const SANITY_UNCONFIGURED_CHECK = ` if (!isSanityConfigured()) integrations.push("Sanity")`;
29
+
30
+ /**
31
+ * Merge Sanity integration into template check-integration
32
+ * @param {string} templatePath - Path to the template's check-integration.ts
33
+ * @returns {Promise<{skipped?: boolean, reason?: string, success?: boolean}>}
34
+ */
35
+ export async function mergeCheckIntegration(templatePath) {
36
+ let content = await fs.readFile(templatePath, "utf-8");
37
+
38
+ // Skip if already has isSanityConfigured
39
+ if (content.includes("isSanityConfigured")) {
40
+ return { skipped: true, reason: "Already has isSanityConfigured" };
41
+ }
42
+
43
+ // 1. Add isSanityConfigured function after isAnalyticsConfigured
44
+ const analyticsMatch = content.match(
45
+ /(export function isAnalyticsConfigured\(\)[^}]+\})/s,
46
+ );
47
+ if (analyticsMatch) {
48
+ const insertPos = analyticsMatch.index + analyticsMatch[0].length;
49
+ content =
50
+ content.slice(0, insertPos) +
51
+ "\n" +
52
+ SANITY_FUNCTION +
53
+ content.slice(insertPos);
54
+ } else {
55
+ // If no isAnalyticsConfigured, add before getConfiguredIntegrations
56
+ const getConfiguredMatch = content.match(
57
+ /export function getConfiguredIntegrations/,
58
+ );
59
+ if (getConfiguredMatch) {
60
+ content =
61
+ content.slice(0, getConfiguredMatch.index) +
62
+ SANITY_FUNCTION +
63
+ "\n" +
64
+ content.slice(getConfiguredMatch.index);
65
+ } else {
66
+ // Fallback: append to end
67
+ content = `${content.trimEnd()}\n${SANITY_FUNCTION}`;
68
+ }
69
+ }
70
+
71
+ // 2. Update getConfiguredIntegrations to include Sanity check
72
+ const configuredFnMatch = content.match(
73
+ /(export function getConfiguredIntegrations\(\)[^{]*\{[\s\S]*?)(if \(isAnalyticsConfigured\(\)\))/m,
74
+ );
75
+ if (configuredFnMatch) {
76
+ const insertPos = content.indexOf(
77
+ configuredFnMatch[2],
78
+ configuredFnMatch.index,
79
+ );
80
+ content =
81
+ content.slice(0, insertPos) +
82
+ SANITY_CONFIGURED_CHECK +
83
+ "\n " +
84
+ content.slice(insertPos);
85
+ }
86
+
87
+ // 3. Update getUnconfiguredIntegrations to include Sanity check
88
+ const unconfiguredFnMatch = content.match(
89
+ /(export function getUnconfiguredIntegrations\(\)[^{]*\{[\s\S]*?)(if \(!isAnalyticsConfigured\(\)\))/m,
90
+ );
91
+ if (unconfiguredFnMatch) {
92
+ const insertPos = content.indexOf(
93
+ unconfiguredFnMatch[2],
94
+ unconfiguredFnMatch.index,
95
+ );
96
+ content =
97
+ content.slice(0, insertPos) +
98
+ SANITY_UNCONFIGURED_CHECK +
99
+ "\n " +
100
+ content.slice(insertPos);
101
+ }
102
+
103
+ await fs.writeFile(templatePath, content);
104
+ return { success: true };
105
+ }
@@ -1,4 +1,4 @@
1
- // src/mergers/config.js
1
+ // packages/create-basement-app/src/mergers/config.js
2
2
 
3
3
  /**
4
4
  * CMS-specific configuration for smart merge integration
@@ -6,9 +6,6 @@
6
6
  */
7
7
  export const CMS_CONFIG = {
8
8
  sanity: {
9
- // Git branch containing the Sanity integration files
10
- branch: "sanity-integration",
11
-
12
9
  // Files that need smart merging (exist in both template and integration)
13
10
  mergeFiles: [
14
11
  "app/layout.tsx",
@@ -29,22 +26,11 @@ export const CMS_CONFIG = {
29
26
  "lib/integrations/README.md",
30
27
  ],
31
28
  },
32
-
33
- basehub: {
34
- // Git branch containing the BaseHub integration files
35
- branch: "basehub-integration",
36
-
37
- // Files that need smart merging for BaseHub
38
- mergeFiles: [],
39
-
40
- // Paths that are purely additive for BaseHub
41
- additivePaths: ["lib/integrations/basehub"],
42
- },
43
29
  };
44
30
 
45
31
  /**
46
32
  * Get configuration for a specific CMS
47
- * @param {string} cms - The CMS name (e.g., 'sanity', 'basehub')
33
+ * @param {string} cms - The CMS name (e.g., 'sanity')
48
34
  * @returns {object|null} CMS configuration or null if not supported
49
35
  */
50
36
  export function getCmsConfig(cms) {
@@ -71,35 +57,21 @@ export function isCmsSupported(cms) {
71
57
  * Layers only add packages that are NOT in next-starter.
72
58
  */
73
59
  export const LAYER_CONFIG = {
60
+ // webgl and webgpu share the same template — renderer is configured via lib/renderer.ts
74
61
  webgl: {
75
62
  replaceFiles: ["app/page.tsx"],
76
63
  additivePaths: [
77
64
  "components/webgl/canvas/dynamic.tsx",
78
65
  "components/webgl/canvas/index.tsx",
79
66
  "components/webgl/components/scene/index.tsx",
67
+ "lib/renderer.ts",
80
68
  ],
81
- dependencies: {
82
- "@react-three/fiber": "^9.5.0",
83
- "@react-three/drei": "^10.7.7",
84
- three: "^0.182.0",
85
- "@radix-ui/react-navigation-menu": "^1.2.5",
86
- leva: "^0.9.35",
87
- },
88
- devDependencies: {
89
- "@types/three": "^0.182.0",
90
- },
91
- },
92
-
93
- webgpu: {
94
- replaceFiles: [],
95
- additivePaths: [],
96
69
  dependencies: {
97
70
  "@react-three/fiber": "10.0.0-alpha.2",
98
71
  "@react-three/drei": "^11.0.0-alpha.4",
99
72
  three: "^0.182.0",
100
- leva: "^0.9.35",
101
- "lucide-react": "^0.474.0",
102
73
  "@radix-ui/react-navigation-menu": "^1.2.5",
74
+ leva: "^0.9.35",
103
75
  },
104
76
  devDependencies: {
105
77
  "@types/three": "^0.182.0",