bsmnt 0.0.2 → 0.1.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 (430) hide show
  1. package/.github/workflows/release.yml +2 -0
  2. package/CHANGELOG.md +21 -0
  3. package/CLAUDE.md +42 -23
  4. package/README.md +33 -11
  5. package/biome.json +1 -0
  6. package/bun.lock +1 -1
  7. package/docs/architecture.drawio +266 -0
  8. package/docs/architecture.mermaid +91 -0
  9. package/package.json +1 -1
  10. package/{bin → packages/cli/bin}/index.js +28 -27
  11. package/packages/cli/package.json +16 -0
  12. package/{src → packages/cli/src}/commands/add-integration.js +23 -25
  13. package/{src → packages/cli/src}/commands/create.js +104 -133
  14. package/packages/create-basement-app/integrations/basehub/config.js +21 -0
  15. package/packages/create-basement-app/integrations/sanity/config.js +46 -0
  16. package/{src → packages/create-basement-app/integrations/sanity}/mergers/check-integration-merger.js +1 -1
  17. package/{src → packages/create-basement-app/integrations/sanity}/mergers/layout-merger.js +1 -1
  18. package/{src → packages/create-basement-app/integrations/sanity}/mergers/sitemap-merger.js +1 -1
  19. package/packages/create-basement-app/package.json +10 -0
  20. package/packages/create-basement-app/src/configs/animations.js +28 -0
  21. package/packages/create-basement-app/src/index.js +15 -0
  22. package/packages/create-basement-app/src/mergers/check-integration-merger.js +105 -0
  23. package/{src → packages/create-basement-app/src}/mergers/config.js +1 -7
  24. package/{src → packages/create-basement-app/src}/mergers/index.js +87 -93
  25. package/packages/create-basement-app/src/mergers/layout-merger.js +223 -0
  26. package/packages/create-basement-app/src/mergers/sitemap-merger.js +121 -0
  27. package/packages/create-basement-app/template-hooks/config.js +38 -0
  28. package/packages/create-basement-app/templates/default/.biome/plugins/README.md +21 -0
  29. package/packages/create-basement-app/templates/default/.biome/plugins/no-anchor-element.grit +12 -0
  30. package/packages/create-basement-app/templates/default/.biome/plugins/no-relative-parent-imports.grit +10 -0
  31. package/packages/create-basement-app/templates/default/.biome/plugins/no-unnecessary-forwardref.grit +9 -0
  32. package/packages/create-basement-app/templates/default/.cursor/rules/README.md +184 -0
  33. package/packages/create-basement-app/templates/default/.cursor/rules/architecture.mdc +437 -0
  34. package/packages/create-basement-app/templates/default/.cursor/rules/components.mdc +436 -0
  35. package/packages/create-basement-app/templates/default/.cursor/rules/integrations.mdc +447 -0
  36. package/packages/create-basement-app/templates/default/.cursor/rules/main.mdc +278 -0
  37. package/packages/create-basement-app/templates/default/.cursor/rules/styling.mdc +433 -0
  38. package/packages/create-basement-app/templates/default/.editorconfig +40 -0
  39. package/packages/create-basement-app/templates/default/.env.example +81 -0
  40. package/packages/create-basement-app/templates/default/.gitattributes +19 -0
  41. package/packages/create-basement-app/templates/default/.github/PULL_REQUEST_TEMPLATE.md +14 -0
  42. package/packages/create-basement-app/templates/default/.github/workflows/lighthouse-to-slack.yml +136 -0
  43. package/packages/create-basement-app/templates/default/.vscode/extensions.json +20 -0
  44. package/packages/create-basement-app/templates/default/.vscode/settings.json +105 -0
  45. package/packages/create-basement-app/templates/default/README.md +221 -0
  46. package/packages/create-basement-app/templates/default/_gitignore +67 -0
  47. package/packages/create-basement-app/templates/default/app/favicon.ico +0 -0
  48. package/packages/create-basement-app/templates/default/app/layout.tsx +104 -0
  49. package/packages/create-basement-app/templates/default/app/page.tsx +275 -0
  50. package/packages/create-basement-app/templates/default/app/robots.ts +15 -0
  51. package/packages/create-basement-app/templates/default/app/sitemap.ts +16 -0
  52. package/packages/create-basement-app/templates/default/biome.json +250 -0
  53. package/packages/create-basement-app/templates/default/components/basement.svg +1 -0
  54. package/packages/create-basement-app/templates/default/components/layout/footer/index.tsx +27 -0
  55. package/packages/create-basement-app/templates/default/components/layout/header/index.tsx +11 -0
  56. package/packages/create-basement-app/templates/default/components/layout/theme/index.tsx +66 -0
  57. package/packages/create-basement-app/templates/default/components/layout/wrapper/index.tsx +65 -0
  58. package/packages/create-basement-app/templates/default/components/ui/README.md +77 -0
  59. package/packages/create-basement-app/templates/default/components/ui/image/README.md +37 -0
  60. package/packages/create-basement-app/templates/default/components/ui/image/index.tsx +224 -0
  61. package/packages/create-basement-app/templates/default/components/ui/link/index.tsx +146 -0
  62. package/packages/create-basement-app/templates/default/lib/README.md +33 -0
  63. package/packages/create-basement-app/templates/default/lib/hooks/index.ts +12 -0
  64. package/packages/create-basement-app/templates/default/lib/hooks/use-device-detection.ts +81 -0
  65. package/packages/create-basement-app/templates/default/lib/hooks/use-media-breakpoint.ts +15 -0
  66. package/packages/create-basement-app/templates/default/lib/hooks/use-prefetch.ts +74 -0
  67. package/packages/create-basement-app/templates/default/lib/scripts/dev.ts +52 -0
  68. package/packages/create-basement-app/templates/default/lib/scripts/generate-component.ts +322 -0
  69. package/packages/create-basement-app/templates/default/lib/scripts/generate-page.ts +193 -0
  70. package/packages/create-basement-app/templates/default/lib/scripts/generate.ts +79 -0
  71. package/packages/create-basement-app/templates/default/lib/scripts/utils.ts +246 -0
  72. package/packages/create-basement-app/templates/default/lib/store/app.ts +11 -0
  73. package/packages/create-basement-app/templates/default/lib/store/index.ts +11 -0
  74. package/packages/create-basement-app/templates/default/lib/styles/README.md +64 -0
  75. package/packages/create-basement-app/templates/default/lib/styles/cn.ts +7 -0
  76. package/packages/create-basement-app/templates/default/lib/styles/colors.ts +63 -0
  77. package/packages/create-basement-app/templates/default/lib/styles/config.ts +34 -0
  78. package/packages/create-basement-app/templates/default/lib/styles/css/global.css +85 -0
  79. package/packages/create-basement-app/templates/default/lib/styles/css/index.css +6 -0
  80. package/packages/create-basement-app/templates/default/lib/styles/css/reset.css +166 -0
  81. package/packages/create-basement-app/templates/default/lib/styles/css/root.css +68 -0
  82. package/packages/create-basement-app/templates/default/lib/styles/css/tailwind.css +132 -0
  83. package/packages/create-basement-app/templates/default/lib/styles/easings.ts +21 -0
  84. package/packages/create-basement-app/templates/default/lib/styles/fonts.ts +28 -0
  85. package/packages/create-basement-app/templates/default/lib/styles/index.ts +12 -0
  86. package/packages/create-basement-app/templates/default/lib/styles/layout.mjs +27 -0
  87. package/packages/create-basement-app/templates/default/lib/styles/scripts/README.md +29 -0
  88. package/packages/create-basement-app/templates/default/lib/styles/scripts/generate-root.ts +57 -0
  89. package/packages/create-basement-app/templates/default/lib/styles/scripts/generate-tailwind.ts +162 -0
  90. package/packages/create-basement-app/templates/default/lib/styles/scripts/postcss-functions.mjs +168 -0
  91. package/packages/create-basement-app/templates/default/lib/styles/scripts/setup-styles.ts +24 -0
  92. package/packages/create-basement-app/templates/default/lib/styles/scripts/utils.ts +20 -0
  93. package/packages/create-basement-app/templates/default/lib/styles/typography.ts +36 -0
  94. package/packages/create-basement-app/templates/default/lib/utils/README.md +40 -0
  95. package/packages/create-basement-app/templates/default/lib/utils/css.d.ts +21 -0
  96. package/packages/create-basement-app/templates/default/lib/utils/easings.ts +240 -0
  97. package/packages/create-basement-app/templates/default/lib/utils/fetch.ts +84 -0
  98. package/packages/create-basement-app/templates/default/lib/utils/math.test.ts +221 -0
  99. package/packages/create-basement-app/templates/default/lib/utils/math.ts +236 -0
  100. package/packages/create-basement-app/templates/default/lib/utils/metadata.ts +126 -0
  101. package/packages/create-basement-app/templates/default/lib/utils/strings.test.ts +166 -0
  102. package/packages/create-basement-app/templates/default/lib/utils/strings.ts +246 -0
  103. package/packages/create-basement-app/templates/default/lib/utils/types.d.ts +15 -0
  104. package/packages/create-basement-app/templates/default/lib/utils/viewport.test.ts +256 -0
  105. package/packages/create-basement-app/templates/default/lib/utils/viewport.ts +193 -0
  106. package/packages/create-basement-app/templates/default/next.config.ts +142 -0
  107. package/packages/create-basement-app/templates/default/package.json +62 -0
  108. package/packages/create-basement-app/templates/default/postcss.config.mjs +42 -0
  109. package/packages/create-basement-app/templates/default/public/fonts/geist/Geist-Mono.woff2 +0 -0
  110. package/packages/create-basement-app/templates/default/tsconfig.json +43 -0
  111. package/packages/create-basement-app/templates/experiment/.biome/plugins/README.md +21 -0
  112. package/packages/create-basement-app/templates/experiment/.biome/plugins/no-anchor-element.grit +12 -0
  113. package/packages/create-basement-app/templates/experiment/.biome/plugins/no-relative-parent-imports.grit +10 -0
  114. package/packages/create-basement-app/templates/experiment/.biome/plugins/no-unnecessary-forwardref.grit +9 -0
  115. package/packages/create-basement-app/templates/experiment/.cursor/rules/README.md +184 -0
  116. package/packages/create-basement-app/templates/experiment/.cursor/rules/architecture.mdc +437 -0
  117. package/packages/create-basement-app/templates/experiment/.cursor/rules/components.mdc +436 -0
  118. package/packages/create-basement-app/templates/experiment/.cursor/rules/integrations.mdc +447 -0
  119. package/packages/create-basement-app/templates/experiment/.cursor/rules/main.mdc +278 -0
  120. package/packages/create-basement-app/templates/experiment/.cursor/rules/styling.mdc +433 -0
  121. package/packages/create-basement-app/templates/experiment/.editorconfig +40 -0
  122. package/packages/create-basement-app/templates/experiment/.env.example +81 -0
  123. package/packages/create-basement-app/templates/experiment/.gitattributes +19 -0
  124. package/packages/create-basement-app/templates/experiment/.github/PULL_REQUEST_TEMPLATE.md +14 -0
  125. package/packages/create-basement-app/templates/experiment/.github/workflows/lighthouse-to-slack.yml +136 -0
  126. package/packages/create-basement-app/templates/experiment/.vscode/extensions.json +20 -0
  127. package/packages/create-basement-app/templates/experiment/.vscode/settings.json +105 -0
  128. package/packages/create-basement-app/templates/experiment/README.md +221 -0
  129. package/packages/create-basement-app/templates/experiment/_gitignore +67 -0
  130. package/packages/create-basement-app/templates/experiment/app/favicon.ico +0 -0
  131. package/packages/create-basement-app/templates/experiment/app/layout.tsx +104 -0
  132. package/packages/create-basement-app/templates/experiment/app/page.tsx +275 -0
  133. package/packages/create-basement-app/templates/experiment/app/robots.ts +15 -0
  134. package/packages/create-basement-app/templates/experiment/app/sitemap.ts +16 -0
  135. package/packages/create-basement-app/templates/experiment/biome.json +250 -0
  136. package/packages/create-basement-app/templates/experiment/components/basement.svg +1 -0
  137. package/packages/create-basement-app/templates/experiment/components/layout/footer/index.tsx +27 -0
  138. package/packages/create-basement-app/templates/experiment/components/layout/header/index.tsx +58 -0
  139. package/packages/create-basement-app/templates/experiment/components/layout/navigation-menu.tsx +127 -0
  140. package/packages/create-basement-app/templates/experiment/components/layout/theme/index.tsx +66 -0
  141. package/packages/create-basement-app/templates/experiment/components/layout/wrapper/index.tsx +65 -0
  142. package/packages/create-basement-app/templates/experiment/components/ui/README.md +77 -0
  143. package/packages/create-basement-app/templates/experiment/components/ui/image/README.md +37 -0
  144. package/packages/create-basement-app/templates/experiment/components/ui/image/index.tsx +224 -0
  145. package/packages/create-basement-app/templates/experiment/components/ui/link/index.tsx +146 -0
  146. package/packages/create-basement-app/templates/experiment/lib/README.md +33 -0
  147. package/packages/create-basement-app/templates/experiment/lib/constants.ts +12 -0
  148. package/packages/create-basement-app/templates/experiment/lib/hooks/index.ts +12 -0
  149. package/packages/create-basement-app/templates/experiment/lib/hooks/use-device-detection.ts +81 -0
  150. package/packages/create-basement-app/templates/experiment/lib/hooks/use-media-breakpoint.ts +15 -0
  151. package/packages/create-basement-app/templates/experiment/lib/hooks/use-prefetch.ts +74 -0
  152. package/packages/create-basement-app/templates/experiment/lib/integrations/.gitkeep +0 -0
  153. package/packages/create-basement-app/templates/experiment/lib/scripts/dev.ts +52 -0
  154. package/packages/create-basement-app/templates/experiment/lib/scripts/generate-component.ts +322 -0
  155. package/packages/create-basement-app/templates/experiment/lib/scripts/generate-page.ts +193 -0
  156. package/packages/create-basement-app/templates/experiment/lib/scripts/generate.ts +79 -0
  157. package/packages/create-basement-app/templates/experiment/lib/scripts/utils.ts +246 -0
  158. package/packages/create-basement-app/templates/experiment/lib/store/app.ts +11 -0
  159. package/packages/create-basement-app/templates/experiment/lib/store/index.ts +11 -0
  160. package/packages/create-basement-app/templates/experiment/lib/styles/README.md +64 -0
  161. package/packages/create-basement-app/templates/experiment/lib/styles/cn.ts +7 -0
  162. package/packages/create-basement-app/templates/experiment/lib/styles/colors.ts +63 -0
  163. package/packages/create-basement-app/templates/experiment/lib/styles/config.ts +34 -0
  164. package/packages/create-basement-app/templates/experiment/lib/styles/css/global.css +85 -0
  165. package/packages/create-basement-app/templates/experiment/lib/styles/css/index.css +6 -0
  166. package/packages/create-basement-app/templates/experiment/lib/styles/css/reset.css +166 -0
  167. package/packages/create-basement-app/templates/experiment/lib/styles/css/root.css +68 -0
  168. package/packages/create-basement-app/templates/experiment/lib/styles/css/tailwind.css +132 -0
  169. package/packages/create-basement-app/templates/experiment/lib/styles/easings.ts +21 -0
  170. package/packages/create-basement-app/templates/experiment/lib/styles/fonts.ts +28 -0
  171. package/packages/create-basement-app/templates/experiment/lib/styles/index.ts +12 -0
  172. package/packages/create-basement-app/templates/experiment/lib/styles/layout.mjs +27 -0
  173. package/packages/create-basement-app/templates/experiment/lib/styles/scripts/README.md +29 -0
  174. package/packages/create-basement-app/templates/experiment/lib/styles/scripts/generate-root.ts +57 -0
  175. package/packages/create-basement-app/templates/experiment/lib/styles/scripts/generate-tailwind.ts +162 -0
  176. package/packages/create-basement-app/templates/experiment/lib/styles/scripts/postcss-functions.mjs +168 -0
  177. package/packages/create-basement-app/templates/experiment/lib/styles/scripts/setup-styles.ts +24 -0
  178. package/packages/create-basement-app/templates/experiment/lib/styles/scripts/utils.ts +20 -0
  179. package/packages/create-basement-app/templates/experiment/lib/styles/typography.ts +36 -0
  180. package/packages/create-basement-app/templates/experiment/lib/utils/README.md +40 -0
  181. package/packages/create-basement-app/templates/experiment/lib/utils/css.d.ts +21 -0
  182. package/packages/create-basement-app/templates/experiment/lib/utils/easings.ts +240 -0
  183. package/packages/create-basement-app/templates/experiment/lib/utils/fetch.ts +84 -0
  184. package/packages/create-basement-app/templates/experiment/lib/utils/math.test.ts +221 -0
  185. package/packages/create-basement-app/templates/experiment/lib/utils/math.ts +236 -0
  186. package/packages/create-basement-app/templates/experiment/lib/utils/metadata.ts +126 -0
  187. package/packages/create-basement-app/templates/experiment/lib/utils/strings.test.ts +166 -0
  188. package/packages/create-basement-app/templates/experiment/lib/utils/strings.ts +246 -0
  189. package/packages/create-basement-app/templates/experiment/lib/utils/types.d.ts +15 -0
  190. package/packages/create-basement-app/templates/experiment/lib/utils/viewport.test.ts +256 -0
  191. package/packages/create-basement-app/templates/experiment/lib/utils/viewport.ts +193 -0
  192. package/packages/create-basement-app/templates/experiment/next.config.ts +142 -0
  193. package/packages/create-basement-app/templates/experiment/package.json +69 -0
  194. package/packages/create-basement-app/templates/experiment/postcss.config.mjs +42 -0
  195. package/packages/create-basement-app/templates/experiment/public/fonts/geist/Geist-Mono.woff2 +0 -0
  196. package/packages/create-basement-app/templates/experiment/tsconfig.json +43 -0
  197. package/packages/create-basement-app/templates/webgl/.biome/plugins/README.md +21 -0
  198. package/packages/create-basement-app/templates/webgl/.biome/plugins/no-anchor-element.grit +12 -0
  199. package/packages/create-basement-app/templates/webgl/.biome/plugins/no-relative-parent-imports.grit +10 -0
  200. package/packages/create-basement-app/templates/webgl/.biome/plugins/no-unnecessary-forwardref.grit +9 -0
  201. package/packages/create-basement-app/templates/webgl/.cursor/rules/README.md +184 -0
  202. package/packages/create-basement-app/templates/webgl/.cursor/rules/architecture.mdc +437 -0
  203. package/packages/create-basement-app/templates/webgl/.cursor/rules/components.mdc +436 -0
  204. package/packages/create-basement-app/templates/webgl/.cursor/rules/integrations.mdc +447 -0
  205. package/packages/create-basement-app/templates/webgl/.cursor/rules/main.mdc +278 -0
  206. package/packages/create-basement-app/templates/webgl/.cursor/rules/styling.mdc +433 -0
  207. package/packages/create-basement-app/templates/webgl/.editorconfig +40 -0
  208. package/packages/create-basement-app/templates/webgl/.env.example +81 -0
  209. package/packages/create-basement-app/templates/webgl/.gitattributes +19 -0
  210. package/packages/create-basement-app/templates/webgl/.github/PULL_REQUEST_TEMPLATE.md +14 -0
  211. package/packages/create-basement-app/templates/webgl/.github/workflows/lighthouse-to-slack.yml +136 -0
  212. package/packages/create-basement-app/templates/webgl/.vscode/extensions.json +20 -0
  213. package/packages/create-basement-app/templates/webgl/.vscode/settings.json +105 -0
  214. package/packages/create-basement-app/templates/webgl/README.md +221 -0
  215. package/packages/create-basement-app/templates/webgl/_gitignore +67 -0
  216. package/packages/create-basement-app/templates/webgl/app/favicon.ico +0 -0
  217. package/packages/create-basement-app/templates/webgl/app/layout.tsx +104 -0
  218. package/packages/create-basement-app/templates/webgl/app/page.tsx +10 -0
  219. package/packages/create-basement-app/templates/webgl/app/robots.ts +15 -0
  220. package/packages/create-basement-app/templates/webgl/app/sitemap.ts +16 -0
  221. package/packages/create-basement-app/templates/webgl/biome.json +250 -0
  222. package/packages/create-basement-app/templates/webgl/components/basement.svg +1 -0
  223. package/packages/create-basement-app/templates/webgl/components/layout/footer/index.tsx +27 -0
  224. package/packages/create-basement-app/templates/webgl/components/layout/header/index.tsx +11 -0
  225. package/packages/create-basement-app/templates/webgl/components/layout/theme/index.tsx +66 -0
  226. package/packages/create-basement-app/templates/webgl/components/layout/wrapper/index.tsx +65 -0
  227. package/packages/create-basement-app/templates/webgl/components/ui/README.md +77 -0
  228. package/packages/create-basement-app/templates/webgl/components/ui/image/README.md +37 -0
  229. package/packages/create-basement-app/templates/webgl/components/ui/image/index.tsx +224 -0
  230. package/packages/create-basement-app/templates/webgl/components/ui/link/index.tsx +146 -0
  231. package/packages/create-basement-app/templates/webgl/components/webgl/canvas/dynamic.tsx +34 -0
  232. package/packages/create-basement-app/templates/webgl/components/webgl/canvas/index.tsx +43 -0
  233. package/packages/create-basement-app/templates/webgl/components/webgl/components/scene/index.tsx +21 -0
  234. package/packages/create-basement-app/templates/webgl/lib/README.md +33 -0
  235. package/packages/create-basement-app/templates/webgl/lib/hooks/index.ts +12 -0
  236. package/packages/create-basement-app/templates/webgl/lib/hooks/use-device-detection.ts +81 -0
  237. package/packages/create-basement-app/templates/webgl/lib/hooks/use-media-breakpoint.ts +15 -0
  238. package/packages/create-basement-app/templates/webgl/lib/hooks/use-prefetch.ts +74 -0
  239. package/packages/create-basement-app/templates/webgl/lib/integrations/.gitkeep +0 -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/packages/create-basement-app/templates/webgpu/.biome/plugins/README.md +21 -0
  285. package/packages/create-basement-app/templates/webgpu/.biome/plugins/no-anchor-element.grit +12 -0
  286. package/packages/create-basement-app/templates/webgpu/.biome/plugins/no-relative-parent-imports.grit +10 -0
  287. package/packages/create-basement-app/templates/webgpu/.biome/plugins/no-unnecessary-forwardref.grit +9 -0
  288. package/packages/create-basement-app/templates/webgpu/.cursor/rules/README.md +184 -0
  289. package/packages/create-basement-app/templates/webgpu/.cursor/rules/architecture.mdc +437 -0
  290. package/packages/create-basement-app/templates/webgpu/.cursor/rules/components.mdc +436 -0
  291. package/packages/create-basement-app/templates/webgpu/.cursor/rules/integrations.mdc +447 -0
  292. package/packages/create-basement-app/templates/webgpu/.cursor/rules/main.mdc +278 -0
  293. package/packages/create-basement-app/templates/webgpu/.cursor/rules/styling.mdc +433 -0
  294. package/packages/create-basement-app/templates/webgpu/.editorconfig +40 -0
  295. package/packages/create-basement-app/templates/webgpu/.env.example +81 -0
  296. package/packages/create-basement-app/templates/webgpu/.gitattributes +19 -0
  297. package/packages/create-basement-app/templates/webgpu/.github/PULL_REQUEST_TEMPLATE.md +14 -0
  298. package/packages/create-basement-app/templates/webgpu/.github/workflows/lighthouse-to-slack.yml +136 -0
  299. package/packages/create-basement-app/templates/webgpu/.vscode/extensions.json +20 -0
  300. package/packages/create-basement-app/templates/webgpu/.vscode/settings.json +105 -0
  301. package/packages/create-basement-app/templates/webgpu/README.md +221 -0
  302. package/packages/create-basement-app/templates/webgpu/_gitignore +67 -0
  303. package/packages/create-basement-app/templates/webgpu/app/favicon.ico +0 -0
  304. package/packages/create-basement-app/templates/webgpu/app/layout.tsx +104 -0
  305. package/packages/create-basement-app/templates/webgpu/app/page.tsx +275 -0
  306. package/packages/create-basement-app/templates/webgpu/app/robots.ts +15 -0
  307. package/packages/create-basement-app/templates/webgpu/app/sitemap.ts +16 -0
  308. package/packages/create-basement-app/templates/webgpu/biome.json +250 -0
  309. package/packages/create-basement-app/templates/webgpu/components/basement.svg +1 -0
  310. package/packages/create-basement-app/templates/webgpu/components/layout/footer/index.tsx +27 -0
  311. package/packages/create-basement-app/templates/webgpu/components/layout/header/index.tsx +11 -0
  312. package/packages/create-basement-app/templates/webgpu/components/layout/theme/index.tsx +66 -0
  313. package/packages/create-basement-app/templates/webgpu/components/layout/wrapper/index.tsx +65 -0
  314. package/packages/create-basement-app/templates/webgpu/components/ui/README.md +77 -0
  315. package/packages/create-basement-app/templates/webgpu/components/ui/image/README.md +37 -0
  316. package/packages/create-basement-app/templates/webgpu/components/ui/image/index.tsx +224 -0
  317. package/packages/create-basement-app/templates/webgpu/components/ui/link/index.tsx +146 -0
  318. package/packages/create-basement-app/templates/webgpu/lib/README.md +33 -0
  319. package/packages/create-basement-app/templates/webgpu/lib/hooks/index.ts +12 -0
  320. package/packages/create-basement-app/templates/webgpu/lib/hooks/use-device-detection.ts +81 -0
  321. package/packages/create-basement-app/templates/webgpu/lib/hooks/use-media-breakpoint.ts +15 -0
  322. package/packages/create-basement-app/templates/webgpu/lib/hooks/use-prefetch.ts +74 -0
  323. package/packages/create-basement-app/templates/webgpu/lib/integrations/.gitkeep +0 -0
  324. package/packages/create-basement-app/templates/webgpu/lib/scripts/dev.ts +52 -0
  325. package/packages/create-basement-app/templates/webgpu/lib/scripts/generate-component.ts +322 -0
  326. package/packages/create-basement-app/templates/webgpu/lib/scripts/generate-page.ts +193 -0
  327. package/packages/create-basement-app/templates/webgpu/lib/scripts/generate.ts +79 -0
  328. package/packages/create-basement-app/templates/webgpu/lib/scripts/utils.ts +246 -0
  329. package/packages/create-basement-app/templates/webgpu/lib/store/app.ts +11 -0
  330. package/packages/create-basement-app/templates/webgpu/lib/store/index.ts +11 -0
  331. package/packages/create-basement-app/templates/webgpu/lib/styles/README.md +64 -0
  332. package/packages/create-basement-app/templates/webgpu/lib/styles/cn.ts +7 -0
  333. package/packages/create-basement-app/templates/webgpu/lib/styles/colors.ts +63 -0
  334. package/packages/create-basement-app/templates/webgpu/lib/styles/config.ts +34 -0
  335. package/packages/create-basement-app/templates/webgpu/lib/styles/css/global.css +85 -0
  336. package/packages/create-basement-app/templates/webgpu/lib/styles/css/index.css +6 -0
  337. package/packages/create-basement-app/templates/webgpu/lib/styles/css/reset.css +166 -0
  338. package/packages/create-basement-app/templates/webgpu/lib/styles/css/root.css +68 -0
  339. package/packages/create-basement-app/templates/webgpu/lib/styles/css/tailwind.css +132 -0
  340. package/packages/create-basement-app/templates/webgpu/lib/styles/easings.ts +21 -0
  341. package/packages/create-basement-app/templates/webgpu/lib/styles/fonts.ts +28 -0
  342. package/packages/create-basement-app/templates/webgpu/lib/styles/index.ts +12 -0
  343. package/packages/create-basement-app/templates/webgpu/lib/styles/layout.mjs +27 -0
  344. package/packages/create-basement-app/templates/webgpu/lib/styles/scripts/README.md +29 -0
  345. package/packages/create-basement-app/templates/webgpu/lib/styles/scripts/generate-root.ts +57 -0
  346. package/packages/create-basement-app/templates/webgpu/lib/styles/scripts/generate-tailwind.ts +162 -0
  347. package/packages/create-basement-app/templates/webgpu/lib/styles/scripts/postcss-functions.mjs +168 -0
  348. package/packages/create-basement-app/templates/webgpu/lib/styles/scripts/setup-styles.ts +24 -0
  349. package/packages/create-basement-app/templates/webgpu/lib/styles/scripts/utils.ts +20 -0
  350. package/packages/create-basement-app/templates/webgpu/lib/styles/typography.ts +36 -0
  351. package/packages/create-basement-app/templates/webgpu/lib/utils/README.md +40 -0
  352. package/packages/create-basement-app/templates/webgpu/lib/utils/css.d.ts +21 -0
  353. package/packages/create-basement-app/templates/webgpu/lib/utils/easings.ts +240 -0
  354. package/packages/create-basement-app/templates/webgpu/lib/utils/fetch.ts +84 -0
  355. package/packages/create-basement-app/templates/webgpu/lib/utils/math.test.ts +221 -0
  356. package/packages/create-basement-app/templates/webgpu/lib/utils/math.ts +236 -0
  357. package/packages/create-basement-app/templates/webgpu/lib/utils/metadata.ts +126 -0
  358. package/packages/create-basement-app/templates/webgpu/lib/utils/strings.test.ts +166 -0
  359. package/packages/create-basement-app/templates/webgpu/lib/utils/strings.ts +246 -0
  360. package/packages/create-basement-app/templates/webgpu/lib/utils/types.d.ts +15 -0
  361. package/packages/create-basement-app/templates/webgpu/lib/utils/viewport.test.ts +256 -0
  362. package/packages/create-basement-app/templates/webgpu/lib/utils/viewport.ts +193 -0
  363. package/packages/create-basement-app/templates/webgpu/next.config.ts +142 -0
  364. package/packages/create-basement-app/templates/webgpu/package.json +69 -0
  365. package/packages/create-basement-app/templates/webgpu/postcss.config.mjs +42 -0
  366. package/packages/create-basement-app/templates/webgpu/public/fonts/geist/Geist-Mono.woff2 +0 -0
  367. package/packages/create-basement-app/templates/webgpu/tsconfig.json +43 -0
  368. package/tasks/.last-branch +1 -0
  369. package/tasks/CLAUDE.md +104 -0
  370. package/tasks/archive/2026-02-09-next-starter-dynamic-layers/prd.json +153 -0
  371. package/tasks/archive/2026-02-09-next-starter-dynamic-layers/progress.txt +115 -0
  372. package/tasks/prd-project-restructure.md +375 -0
  373. package/tasks/prd.json +227 -91
  374. package/tasks/progress.txt +281 -87
  375. package/tasks/ralph.sh +113 -0
  376. package/layers/experiment/components/layout/header/index.tsx +0 -58
  377. package/layers/experiment/components/layout/navigation-menu.tsx +0 -127
  378. package/layers/experiment/lib/constants.ts +0 -12
  379. package/layers/webgl/app/page.tsx +0 -10
  380. package/layers/webgl/components/webgl/canvas/dynamic.tsx +0 -34
  381. package/layers/webgl/components/webgl/canvas/index.tsx +0 -43
  382. package/layers/webgl/components/webgl/components/scene/index.tsx +0 -21
  383. package/src/mergers/next-config-merger.js +0 -63
  384. /package/{src → packages/cli/src}/commands/setup-sanity.js +0 -0
  385. /package/{src → packages/cli/src}/commands/worktree.js +0 -0
  386. /package/{integrations/basehub → packages/create-basement-app/integrations/basehub/files}/README.md +0 -0
  387. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/app/api/draft-mode/disable/route.ts +0 -0
  388. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/app/api/draft-mode/enable/route.ts +0 -0
  389. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/app/api/revalidate/route.ts +0 -0
  390. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/app/layout.tsx +0 -0
  391. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/app/sitemap.ts +0 -0
  392. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/app/studio/[[...tool]]/page.tsx +0 -0
  393. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/app/studio/layout.tsx +0 -0
  394. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/components/ui/sanity-image/index.tsx +0 -0
  395. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/README.md +0 -0
  396. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/check-integration.ts +0 -0
  397. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/README.md +0 -0
  398. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/client.ts +0 -0
  399. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/components/disable-draft-mode.tsx +0 -0
  400. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/components/rich-text.tsx +0 -0
  401. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/env.ts +0 -0
  402. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/live/index.tsx +0 -0
  403. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/queries.ts +0 -0
  404. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/sanity.cli.ts +0 -0
  405. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/sanity.config.ts +0 -0
  406. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/sanity.types.ts +0 -0
  407. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/schema.json +0 -0
  408. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/schemas/article.ts +0 -0
  409. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/schemas/example.ts +0 -0
  410. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/schemas/index.ts +0 -0
  411. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/schemas/link.ts +0 -0
  412. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/schemas/metadata.ts +0 -0
  413. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/schemas/navigation.ts +0 -0
  414. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/schemas/page.ts +0 -0
  415. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/schemas/richText.ts +0 -0
  416. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/structure.ts +0 -0
  417. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/utils/image.ts +0 -0
  418. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/utils/link.ts +0 -0
  419. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/scripts/copy-sanity-mcp.ts +0 -0
  420. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/scripts/generate-page.ts +0 -0
  421. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/utils/metadata.ts +0 -0
  422. /package/{plugins → packages/create-basement-app/plugins}/README.md +0 -0
  423. /package/{plugins → packages/create-basement-app/plugins}/no-anchor-element.grit +0 -0
  424. /package/{plugins → packages/create-basement-app/plugins}/no-relative-parent-imports.grit +0 -0
  425. /package/{plugins → packages/create-basement-app/plugins}/no-unnecessary-forwardref.grit +0 -0
  426. /package/{template-hooks → packages/create-basement-app/template-hooks}/use-battery.ts +0 -0
  427. /package/{template-hooks → packages/create-basement-app/template-hooks}/use-device-perf.ts +0 -0
  428. /package/{template-hooks → packages/create-basement-app/template-hooks}/use-intersection-observer.ts +0 -0
  429. /package/{template-hooks → packages/create-basement-app/template-hooks}/use-media.ts +0 -0
  430. /package/{layers/webgpu → packages/create-basement-app/templates/default/lib/integrations}/.gitkeep +0 -0
@@ -0,0 +1,153 @@
1
+ {
2
+ "project": "basement-cli",
3
+ "branchName": "ralph/next-starter-dynamic-layers",
4
+ "description": "Replace 4 static templates with next-starter clone + dynamic technology layers to eliminate maintenance burden",
5
+ "userStories": [
6
+ {
7
+ "id": "US-001",
8
+ "title": "Create layer configuration system",
9
+ "description": "As a CLI maintainer, I want technology layers defined in a config file so that adding or modifying layers only requires changing one file.",
10
+ "acceptanceCriteria": [
11
+ "Add LAYER_CONFIG export to src/mergers/config.js alongside existing CMS_CONFIG",
12
+ "Each layer config defines: replaceFiles, additivePaths, dependencies, devDependencies",
13
+ "Add getLayerConfig(layer) helper function export",
14
+ "Config contains entries for webgl, webgpu, and experiment",
15
+ "webgpu is a deps-only layer (empty replaceFiles and additivePaths arrays)",
16
+ "webgl dependencies: @react-three/fiber ^9.5.0, @react-three/drei ^10.7.7, three ^0.182.0, @gsap/react ^2.0.0, @radix-ui/react-navigation-menu ^1.2.5, leva ^0.9.35, devDeps: @types/three ^0.182.0",
17
+ "webgpu dependencies: @react-three/fiber 10.0.0-alpha.2, @react-three/drei ^11.0.0-alpha.4, three ^0.182.0, leva ^0.9.35, lucide-react ^0.474.0, @radix-ui/react-navigation-menu ^1.2.5, devDeps: @types/three ^0.182.0",
18
+ "experiment dependencies: @react-three/fiber ^9.5.0, @react-three/drei ^10.7.7, three ^0.172.0, leva ^0.9.35, lucide-react ^0.474.0, @radix-ui/react-navigation-menu ^1.2.5, devDeps: @types/three ^0.182.0",
19
+ "Typecheck passes"
20
+ ],
21
+ "priority": 1,
22
+ "passes": true,
23
+ "notes": ""
24
+ },
25
+ {
26
+ "id": "US-002",
27
+ "title": "Extract layer files from templates",
28
+ "description": "As a CLI maintainer, I need the unique files from each template extracted into a layers/ directory so they can be overlaid on next-starter.",
29
+ "acceptanceCriteria": [
30
+ "Create layers/webgl/app/page.tsx copied from template/webgl/app/page.tsx (the one that imports DynamicCanvas)",
31
+ "Create layers/webgl/components/webgl/canvas/dynamic.tsx from template/webgl/components/webgl/canvas/dynamic.tsx",
32
+ "Create layers/webgl/components/webgl/canvas/index.tsx from template/webgl/components/webgl/canvas/index.tsx",
33
+ "Create layers/webgl/components/webgl/components/scene/index.tsx from template/webgl/components/webgl/components/scene/index.tsx",
34
+ "Create layers/experiment/components/layout/header/index.tsx from template/experiment/components/layout/header/index.tsx",
35
+ "Create layers/experiment/components/layout/navigation-menu.tsx from template/experiment/components/layout/navigation-menu.tsx",
36
+ "Create layers/experiment/lib/constats.ts from template/experiment/lib/constats.ts",
37
+ "Create layers/experiment/lib/utils/cn.ts from template/experiment/lib/utils/cn.ts",
38
+ "Create empty layers/webgpu/ directory with a .gitkeep file",
39
+ "All copied files are byte-for-byte identical to their template source files",
40
+ "Typecheck passes"
41
+ ],
42
+ "priority": 2,
43
+ "passes": true,
44
+ "notes": ""
45
+ },
46
+ {
47
+ "id": "US-003",
48
+ "title": "Implement layer injection function",
49
+ "description": "As the CLI system, I need to overlay layer-specific files on top of the next-starter base so that WebGL/WebGPU/Experiment projects get their unique components.",
50
+ "acceptanceCriteria": [
51
+ "Add injectLayer(targetDir, layer, spinner) function to src/mergers/index.js",
52
+ "Function resolves layer directory from CLI repo's layers/{type}/ path using __dirname",
53
+ "Function calls existing detectPathPrefix() to handle src/ directory structure",
54
+ "Function copies additive files from local layers/ directory (no tiged clone needed)",
55
+ "Function replaces files listed in replaceFiles config (overwrites base version with overwrite: true)",
56
+ "Function uses existing transformPath() for path prefix support",
57
+ "Function returns results object with replaced, copied, skipped, and failed arrays",
58
+ "When layer is 'default' or not found in config, function returns early with skipped result (no error)",
59
+ "Extend formatMergeResults() to display replaced entries with checkmark prefix",
60
+ "Typecheck passes"
61
+ ],
62
+ "priority": 3,
63
+ "passes": true,
64
+ "notes": "Reuses existing detectPathPrefix() and transformPath() from src/mergers/index.js. Layer files are local (no network request)."
65
+ },
66
+ {
67
+ "id": "US-004",
68
+ "title": "Change create.js to clone next-starter instead of template",
69
+ "description": "As a developer using the CLI, I want my project scaffolded from the latest next-starter repo so I always get the most up-to-date base.",
70
+ "acceptanceCriteria": [
71
+ "Change tiged source on line 124 of src/commands/create.js from 'github:basementstudio/basement-cli/template/${type}#${branch}' to 'github:basementstudio/next-starter#main'",
72
+ "Remove the BASEMENT_CLI_BRANCH env var usage for template (keep if used elsewhere)",
73
+ "Delete bun.lock file after clone if it exists (since dependencies will be modified)",
74
+ "Update download spinner text to say 'Downloading next-starter from GitHub...' instead of mentioning template type",
75
+ "Update error/troubleshooting message in catch block to reference basementstudio/next-starter instead of basementstudio/basement-cli/template/{type}",
76
+ "Typecheck passes"
77
+ ],
78
+ "priority": 4,
79
+ "passes": true,
80
+ "notes": ""
81
+ },
82
+ {
83
+ "id": "US-005",
84
+ "title": "Wire layer injection into create flow",
85
+ "description": "As the CLI system, I need the layer injection step between template download and CMS integration so layers are applied at the right time.",
86
+ "acceptanceCriteria": [
87
+ "Add new step between template download (step 3) and CMS integration (step 3.5) in src/commands/create.js",
88
+ "Layer injection only runs when type !== 'default'",
89
+ "Import injectLayer and formatMergeResults from src/mergers/index.js",
90
+ "Show ora spinner with layer name during injection (e.g. 'Applying webgl layer...')",
91
+ "Display injection results to user using formatMergeResults",
92
+ "On failure, show warning (not hard error) and continue with project creation",
93
+ "Typecheck passes"
94
+ ],
95
+ "priority": 5,
96
+ "passes": true,
97
+ "notes": "Must run BEFORE CMS integration because layers don't modify layout.tsx, and CMS mergers need the base layout intact."
98
+ },
99
+ {
100
+ "id": "US-006",
101
+ "title": "Config-driven dependency injection in package.json hydration",
102
+ "description": "As the CLI system, I need package.json hydration to read layer dependencies from LAYER_CONFIG instead of being hardcoded.",
103
+ "acceptanceCriteria": [
104
+ "Import getLayerConfig from src/mergers/config.js in create.js",
105
+ "Read layer dependencies from LAYER_CONFIG and merge into package.json: pkg.dependencies = { ...pkg.dependencies, ...layerConfig.dependencies }",
106
+ "Also merge devDependencies from layer config",
107
+ "CMS dependency injection (Sanity/BaseHub) still works unchanged",
108
+ "Animation library injection (GSAP/Framer Motion) still works unchanged",
109
+ "Simplify package.json handling: next-starter uses package.json directly (not package.template.json), remove the rename logic",
110
+ "Project name still set to user-provided name, version still set to 0.1.0",
111
+ "Typecheck passes"
112
+ ],
113
+ "priority": 6,
114
+ "passes": true,
115
+ "notes": "next-starter uses package.json not package.template.json, so the existsSync check for package.template.json can be simplified."
116
+ },
117
+ {
118
+ "id": "US-007",
119
+ "title": "Delete template directory",
120
+ "description": "As a CLI maintainer, I want the template/ directory removed so there's no duplicated code to maintain.",
121
+ "acceptanceCriteria": [
122
+ "Delete template/default/ directory and all contents",
123
+ "Delete template/webgl/ directory and all contents",
124
+ "Delete template/webgpu/ directory and all contents",
125
+ "Delete template/experiment/ directory and all contents",
126
+ "Grep source code for any remaining references to 'template/' paths and remove them",
127
+ "Grep source code for any remaining references to 'basementstudio/basement-cli/template/' and remove them",
128
+ "Typecheck passes"
129
+ ],
130
+ "priority": 7,
131
+ "passes": true,
132
+ "notes": ""
133
+ },
134
+ {
135
+ "id": "US-008",
136
+ "title": "End-to-end verification of all template types",
137
+ "description": "As a CLI maintainer, I need to verify all template + CMS + animation combinations produce working projects.",
138
+ "acceptanceCriteria": [
139
+ "Run npm link to install CLI locally",
140
+ "Run: basement -c test-default -d -no-cms -no-animation -claude -no-hooks — project creates successfully",
141
+ "Run: basement -c test-webgl -webgl -no-cms -no-animation -claude -no-hooks — project has R3F components in components/webgl/",
142
+ "Run: basement -c test-webgpu -webgpu -no-cms -no-animation -claude -no-hooks — project has WebGPU deps in package.json",
143
+ "Run: basement -c test-experiment -exp -no-cms -no-animation -claude -no-hooks — project has custom header with NavigationMenu",
144
+ "Run: basement -c test-sanity -webgl -sanity -gsap -claude -no-hooks — project has CMS + animation + layer deps",
145
+ "All generated projects pass bun install without errors",
146
+ "Typecheck passes"
147
+ ],
148
+ "priority": 8,
149
+ "passes": true,
150
+ "notes": "This is the final validation step. Each test project should be cleaned up after verification."
151
+ }
152
+ ]
153
+ }
@@ -0,0 +1,115 @@
1
+ ## Codebase Patterns
2
+ - This is a plain JS (ESM) CLI project - no TypeScript, no typecheck command. "Typecheck passes" = no syntax errors.
3
+ - Config pattern: export const CONFIG object + getXConfig(name) helper that returns config or null
4
+ - src/mergers/config.js holds all configuration (CMS_CONFIG, LAYER_CONFIG)
5
+ - src/mergers/index.js holds injection/merge logic (injectIntegration for CMS, injectLayer for layers)
6
+ - src/commands/create.js is the main CLI flow
7
+ - next-starter uses package.json directly (no template rename needed)
8
+ - Layer files are local (in layers/ directory), CMS integration files are remote (fetched via tiged)
9
+ - ESM requires __dirname workaround: `path.dirname(fileURLToPath(import.meta.url))`
10
+ - CLI binary is basement (defined in package.json bin field)
11
+ - Dependency injection order in create.js: layer deps → CMS deps → animation deps
12
+
13
+ ---
14
+
15
+ ## 2026-02-09 - US-001
16
+ - Implemented LAYER_CONFIG export with webgl, webgpu, experiment entries
17
+ - Added getLayerConfig() helper function
18
+ - Each layer config has: replaceFiles, additivePaths, dependencies, devDependencies
19
+ - webgpu is deps-only (empty replaceFiles and additivePaths)
20
+ - Files changed: src/mergers/config.js
21
+ - **Learnings for future iterations:**
22
+ - The CLI project is plain JS ESM, verified by running `node --input-type=module -e "import {...}"`
23
+ - Config pattern follows existing CMS_CONFIG style - object + getter helper
24
+ - experiment uses three ^0.172.0 (not ^0.182.0 like webgl/webgpu) per PRD
25
+ ---
26
+
27
+ ## 2026-02-09 - US-002
28
+ - Created layers/webgl/ with app/page.tsx and 3 webgl component files from template/webgl/
29
+ - Created layers/experiment/ with header, navigation-menu, constats.ts, cn.ts from template/experiment/
30
+ - Created layers/webgpu/.gitkeep (empty layer, deps-only)
31
+ - Verified all files are byte-for-byte identical using diff
32
+ - Files changed: 9 new files in layers/
33
+ - **Learnings for future iterations:**
34
+ - Layer files are local to CLI repo (no network clone needed, unlike CMS integrations)
35
+ - webgl is the only layer with a different app/page.tsx (imports DynamicCanvas)
36
+ - experiment has its own header and navigation-menu components
37
+ ---
38
+
39
+ ## 2026-02-09 - US-003
40
+ - Added injectLayer(targetDir, layer, spinner) function to src/mergers/index.js
41
+ - Uses __dirname (via import.meta.url + fileURLToPath) to resolve layers/ directory
42
+ - Reuses detectPathPrefix() and transformPath() for src/ directory support
43
+ - Handles replaceFiles (overwrite: true) and additivePaths (overwrite: false) separately
44
+ - Returns results with replaced, copied, skipped, failed arrays
45
+ - Extended formatMergeResults() with defensive optional chaining for replaced/merged/copied/etc
46
+ - Files changed: src/mergers/index.js
47
+ - **Learnings for future iterations:**
48
+ - ESM doesn't have __dirname, must use: `const __dirname = path.dirname(fileURLToPath(import.meta.url))`
49
+ - Layer injection is purely local file copy (no network), unlike CMS integration which uses tiged
50
+ - formatMergeResults now handles both CMS results (merged) and layer results (replaced) gracefully
51
+ ---
52
+
53
+ ## 2026-02-09 - US-004
54
+ - Changed tiged source from basement/template/${type} to basementstudio/next-starter#main
55
+ - Removed BASEMENT_CLI_BRANCH env var usage (was only used for template, not used elsewhere)
56
+ - Added bun.lock deletion after clone (since deps will be modified by layers/CMS/animation)
57
+ - Updated spinner text to "Downloading next-starter from GitHub..."
58
+ - Updated troubleshooting message to reference basementstudio/next-starter
59
+ - Kept dotenv import as it may be used by merger modules
60
+ - Files changed: src/commands/create.js
61
+ - **Learnings for future iterations:**
62
+ - dotenv is loaded in create.js but env vars are only used in merger modules (check-integration-merger.js)
63
+ - bun.lock must be deleted before modifying package.json deps, otherwise bun install may conflict
64
+ ---
65
+
66
+ ## 2026-02-09 - US-005
67
+ - Added layer injection step (3.2) between template download and CMS integration (3.5)
68
+ - Layer injection only runs when type !== 'default'
69
+ - Uses dynamic import for injectLayer and formatMergeResults from mergers/index.js
70
+ - Shows ora spinner with layer name during injection
71
+ - On failure, shows warning and continues (not a hard error)
72
+ - Files changed: src/commands/create.js
73
+ - **Learnings for future iterations:**
74
+ - Layer injection MUST happen before CMS integration to keep layout.tsx intact for CMS mergers
75
+ - Uses dynamic import (await import) consistent with existing CMS integration pattern
76
+ ---
77
+
78
+ ## 2026-02-09 - US-006
79
+ - Imported getLayerConfig from src/mergers/config.js at top of create.js
80
+ - Layer deps injected from LAYER_CONFIG before CMS and animation deps
81
+ - Simplified package.json handling: removed package.template.json logic (next-starter uses package.json directly)
82
+ - CMS and animation dependency injection unchanged
83
+ - Project name and version still set correctly
84
+ - Files changed: src/commands/create.js
85
+ - **Learnings for future iterations:**
86
+ - Dependency injection order matters: layer deps first, then CMS, then animation (later ones override earlier)
87
+ - next-starter uses package.json directly, no need for package.template.json rename logic
88
+ ---
89
+
90
+ ## 2026-02-09 - US-007
91
+ - Deleted template/default/, template/webgl/, template/webgpu/, template/experiment/ directories
92
+ - Removed entire template/ directory (281 files, -27,778 lines)
93
+ - Verified no remaining references to template/ paths in source code (src/)
94
+ - Updated CLAUDE.md to reflect new architecture (layers/ instead of template/)
95
+ - Files changed: template/ deleted, CLAUDE.md updated
96
+ - **Learnings for future iterations:**
97
+ - CLAUDE.md should be kept in sync with architecture changes
98
+ - Only documentation files (CLAUDE.md, PRD) had remaining references to template/ paths, not source code
99
+ ---
100
+
101
+ ## 2026-02-09 - US-008
102
+ - Installed CLI locally via npm link
103
+ - E2E test results (all passed):
104
+ - test-default: Created successfully, name=test-default, version=0.1.0, has next dep, no R3F deps
105
+ - test-webgl: Created with layer applied (replaced page.tsx, added 3 webgl components), R3F ^9.5.0, three ^0.182.0, @types/three ^0.182.0
106
+ - test-webgpu: Created with deps-only layer, R3F 10.0.0-alpha.2, drei ^11.0.0-alpha.4, lucide-react ^0.474.0
107
+ - test-experiment: Created with layer (header, navigation-menu, constats.ts, cn.ts), three ^0.172.0
108
+ - test-sanity: Combined webgl + sanity + gsap - all deps present (R3F, next-sanity, sanity, gsap, @gsap/react, sanity:extract script)
109
+ - All 4 projects pass bun install without errors
110
+ - CLI command is basement (not basement-starter as PRD mentions)
111
+ - **Learnings for future iterations:**
112
+ - Skills installation may fail without network (bunx skills add), but it's non-blocking
113
+ - The sanity integration triggers an interactive Sanity setup prompt after project creation
114
+ - bun install correctly resolves all dependency versions including alpha packages
115
+ ---
@@ -0,0 +1,375 @@
1
+ # PRD: Project Restructure — Separation of CLI and Templates
2
+
3
+ ## Introduction
4
+
5
+ The `@basementstudio/cli` project has grown organically into a monolithic structure where CLI logic, templates, integrations, mergers, and hooks are tangled together in a flat directory with fragmented configuration. This restructure separates the project into a clean monorepo with two primary packages: the CLI tool (`packages/cli`) and the template scaffolder (`packages/create-basement-app`), following the pattern established by [basementstudio/xmcp](https://github.com/basementstudio/xmcp).
6
+
7
+ ### Problem
8
+
9
+ 1. **No separation of concerns** — CLI routing, prompting, template downloading, file merging, package hydration, agent setup, and hook copying all live in a single 415-line function (`create.js`)
10
+ 2. **Fragmented configuration** — Layer deps live in `config.js`, CMS deps are hardcoded in `create.js`, animation deps are hardcoded elsewhere. No single source of truth.
11
+ 3. **Templates are not standalone** — You can't preview, test, or lint a template in isolation. They're partial overlays that only make sense after being merged onto `next-starter` at runtime.
12
+ 4. **Hardcoded paths everywhere** — `../../layers`, `../../template-hooks`, `../../.env` — brittle references that break when you move files.
13
+ 5. **Duplicate/dead code** — Both `chalk` and `picocolors`, unused `inquirer` dependency, orphaned `next-config-merger.js`.
14
+ 6. **Hard to contribute** — A designer or dev who wants to update a template must understand the merger system, config files, and the full CLI pipeline.
15
+
16
+ ### Solution
17
+
18
+ Move to a **bun workspaces monorepo** with full standalone templates. Each template is a complete, working Next.js project. The CLI simply copies the right template and applies optional integrations on top.
19
+
20
+ ## Goals
21
+
22
+ - Each folder has a single responsibility and a clear owner
23
+ - Templates are complete, standalone Next.js projects that can be previewed and tested independently
24
+ - CLI code is isolated from template content — modifying one doesn't require understanding the other
25
+ - All dependency/script declarations for each integration type live in one config file (single source of truth)
26
+ - Contributors can update templates by editing familiar Next.js files, no knowledge of merger internals needed
27
+ - Dead code, duplicate libraries, and orphaned files are eliminated
28
+ - The merger system is refactored with proper validation and error handling
29
+
30
+ ## User Stories
31
+
32
+ ### US-001: Set up bun workspaces monorepo structure
33
+ **Description:** As a maintainer, I want the project organized as a bun workspaces monorepo so that packages are properly isolated with clear boundaries.
34
+
35
+ **Acceptance Criteria:**
36
+ - [ ] Root `package.json` with `"workspaces": ["packages/*"]` configuration
37
+ - [ ] Root `biome.json` shared across all packages
38
+ - [ ] `packages/cli/` — CLI entry point and command routing
39
+ - [ ] `packages/create-basement-app/` — Templates, integrations, hooks, and scaffolding logic
40
+ - [ ] Each package has its own `package.json` with correct name, version, bin, and dependencies
41
+ - [ ] `bun install` at root installs all workspace dependencies
42
+ - [ ] Existing `.changeset/`, `.github/workflows/`, and release infrastructure updated for workspaces
43
+ - [ ] Typecheck passes
44
+
45
+ ### US-002: Create standalone templates in create-basement-app
46
+ **Description:** As a contributor, I want each template (default, webgl, webgpu, experiment) to be a complete, self-contained Next.js project so I can preview, lint, and test it without running the full CLI.
47
+
48
+ **Acceptance Criteria:**
49
+ - [ ] `packages/create-basement-app/templates/default/` — Full Next.js project (cloned from next-starter baseline)
50
+ - [ ] `packages/create-basement-app/templates/webgl/` — Full Next.js project with R3F canvas, scene components, and all WebGL deps in its `package.json`
51
+ - [ ] `packages/create-basement-app/templates/webgpu/` — Full Next.js project with WebGPU setup and alpha R3F deps
52
+ - [ ] `packages/create-basement-app/templates/experiment/` — Full Next.js project with experiment navigation, header, and constants
53
+ - [ ] Each template has a valid `package.json` with all its dependencies (no external hydration needed)
54
+ - [ ] Each template can be installed and run independently (`cd templates/webgl && bun install && bun dev`)
55
+ - [ ] The old `layers/` directory and overlay-based injection for templates is removed
56
+ - [ ] `_gitignore` convention used (renamed to `.gitignore` during scaffolding, since npm strips dotfiles)
57
+
58
+ ### US-003: Move integrations into create-basement-app
59
+ **Description:** As a maintainer, I want CMS integrations co-located with templates inside `create-basement-app` so the scaffolding package is self-contained.
60
+
61
+ **Acceptance Criteria:**
62
+ - [ ] `packages/create-basement-app/integrations/sanity/` — All Sanity integration files (currently downloaded from remote branch)
63
+ - [ ] `packages/create-basement-app/integrations/basehub/` — All BaseHub integration files
64
+ - [ ] Integration config (file paths, merge rules, dependencies, scripts) lives in a single `integrations/{cms}/config.js` manifest
65
+ - [ ] No more runtime downloading from remote GitHub branches via tiged for integrations
66
+ - [ ] Merger functions co-located with their integration: `integrations/sanity/mergers/`
67
+ - [ ] CMS dependencies and scripts declared in the integration config, not hardcoded in the create command
68
+ - [ ] Typecheck passes
69
+
70
+ ### US-004: Move template-hooks into create-basement-app
71
+ **Description:** As a maintainer, I want optional hooks co-located with the scaffolding package as copyable files.
72
+
73
+ **Acceptance Criteria:**
74
+ - [ ] `packages/create-basement-app/template-hooks/` contains all four hooks
75
+ - [ ] Hook discovery (for the interactive prompt) reads from this co-located directory
76
+ - [ ] Hook copying uses the co-located path, no `../../` navigation
77
+ - [ ] Hooks with external dependencies (`use-battery.ts` -> `lodash-es`, `use-device-perf.ts` -> `detect-gpu`, `react-device-detect`, `zustand`) have their deps declared in a manifest or config so the scaffolder can inject them into the generated project's `package.json`
78
+ - [ ] Typecheck passes
79
+
80
+ ### US-005: Extract CLI package with clean command routing
81
+ **Description:** As a developer, I want the CLI package to only handle argument parsing and command routing, delegating all scaffolding logic to `create-basement-app`.
82
+
83
+ **Acceptance Criteria:**
84
+ - [ ] `packages/cli/bin/index.js` — Entry point with `"basement"` bin command
85
+ - [ ] `packages/cli/src/commands/` — Command modules that import from `create-basement-app`
86
+ - [ ] `packages/cli/` has `create-basement-app` as a workspace dependency
87
+ - [ ] Argument parsing is decoupled from hardcoded template/CMS/animation names — reads available options from `create-basement-app` exports
88
+ - [ ] Single color library (`picocolors`) — remove `chalk`
89
+ - [ ] Remove unused `inquirer` dependency
90
+ - [ ] The `worktree` command stays in the CLI package (it's a dev tool, not scaffolding)
91
+ - [ ] Typecheck passes
92
+
93
+ ### US-006: Refactor the create pipeline into composable steps
94
+ **Description:** As a maintainer, I want the project creation pipeline broken into small, testable, single-purpose functions instead of one 415-line monolith.
95
+
96
+ **Acceptance Criteria:**
97
+ - [ ] Scaffolding logic lives in `packages/create-basement-app/src/` with separate modules:
98
+ - `copy-template.ts` — Copy the selected template to target directory
99
+ - `apply-integration.ts` — Apply CMS integration (merge + additive files)
100
+ - `hydrate-package.ts` — Inject dependencies, scripts, and metadata into package.json
101
+ - `setup-agent.ts` — Agent skills installation and MCP setup
102
+ - `copy-hooks.ts` — Copy selected hooks and inject their dependencies
103
+ - `setup-sanity.ts` — Automated Sanity project creation (moved from CLI)
104
+ - [ ] Each module is independently importable and testable
105
+ - [ ] The CLI's `create` command orchestrates these modules in sequence
106
+ - [ ] The `add-integration` command reuses `apply-integration.ts` instead of duplicating logic
107
+ - [ ] Typecheck passes
108
+
109
+ ### US-007: Centralize all dependency and script declarations
110
+ **Description:** As a maintainer, I want a single source of truth for each integration's dependencies and scripts so I never have to update multiple files when a version changes.
111
+
112
+ **Acceptance Criteria:**
113
+ - [ ] Each integration (sanity, basehub) has a `config.js` manifest declaring: `dependencies`, `devDependencies`, `scripts`, `mergeFiles`, `additivePaths`
114
+ - [ ] Animation library configs (`gsap`, `motion`) declared in a `packages/create-basement-app/src/configs/animations.js` manifest
115
+ - [ ] Template configs (if any template needs runtime dep injection beyond what's in its own `package.json`) live alongside the template
116
+ - [ ] `create.js` reads ALL dependency info from config manifests — zero hardcoded version strings in the pipeline
117
+ - [ ] Typecheck passes
118
+
119
+ ### US-008: Clean up dead code and duplicate dependencies
120
+ **Description:** As a maintainer, I want all unused code, duplicate libraries, and orphaned files removed.
121
+
122
+ **Acceptance Criteria:**
123
+ - [ ] Remove `inquirer` from dependencies (unused — `prompts` is used instead)
124
+ - [ ] Remove `chalk` — standardize on `picocolors` everywhere
125
+ - [ ] Remove or integrate orphaned `next-config-merger.js` (defined but never registered in CMS_MERGERS)
126
+ - [ ] Remove `dotenv` if only used for CLI development (move to devDependencies or remove entirely)
127
+ - [ ] Remove empty `layers/webgpu/.gitkeep` and the entire old `layers/` directory
128
+ - [ ] Remove the old `integrations/` reference directory from root (files now live in create-basement-app)
129
+ - [ ] Remove old `template-hooks/` from root
130
+ - [ ] Verify no dead imports or unreachable code paths remain
131
+ - [ ] Typecheck passes
132
+
133
+ ### US-009: Migrate to TypeScript for CLI and scaffolder
134
+ **Description:** As a developer, I want the CLI and scaffolding code in TypeScript so we get type safety, better IDE support, and catch errors at build time.
135
+
136
+ **Acceptance Criteria:**
137
+ - [ ] `packages/cli/src/` — All files in TypeScript with `strict: true`
138
+ - [ ] `packages/create-basement-app/src/` — All files in TypeScript with `strict: true`
139
+ - [ ] `tsconfig.json` in each package with proper `paths`, `outDir`, `rootDir`
140
+ - [ ] Config files typed with proper interfaces (`LayerConfig`, `CmsConfig`, `AnimationConfig`)
141
+ - [ ] No `any` types — use `unknown` and narrow
142
+ - [ ] Build step compiles TS to JS for the published package
143
+ - [ ] Typecheck passes with zero errors
144
+
145
+ ### US-010: Add validation for config-filesystem consistency
146
+ **Description:** As a maintainer, I want the scaffolder to validate that config manifests match the actual filesystem so mismatches are caught early instead of failing silently at runtime.
147
+
148
+ **Acceptance Criteria:**
149
+ - [ ] On startup (or as a test), validate that every path in `additivePaths` and `mergeFiles` exists in the corresponding template/integration directory
150
+ - [ ] Validate that every merger function referenced in config has a corresponding implementation
151
+ - [ ] Clear error messages when validation fails: "Integration sanity references file X but it doesn't exist in integrations/sanity/"
152
+ - [ ] Validation runs as part of CI
153
+ - [ ] Typecheck passes
154
+
155
+ ## Functional Requirements
156
+
157
+ - FR-1: The project MUST be a bun workspaces monorepo with `packages/cli` and `packages/create-basement-app`
158
+ - FR-2: The `basement` CLI command MUST work identically to the current version after restructuring (same flags, same prompts, same output)
159
+ - FR-3: Templates MUST be full standalone Next.js projects that can be independently installed and run
160
+ - FR-4: CMS integrations MUST be local files in `create-basement-app/integrations/`, not downloaded from remote branches at runtime
161
+ - FR-5: All dependency version declarations MUST live in config manifests, not hardcoded in pipeline code
162
+ - FR-6: The `add-integration` command MUST share implementation with the `create` command's integration step (no duplication)
163
+ - FR-7: The CLI package MUST depend on `create-basement-app` as a workspace dependency for all scaffolding operations
164
+ - FR-8: Template file paths MUST NOT use relative `../../` navigation — use proper package resolution or `__dirname`-based paths relative to the package root
165
+ - FR-9: The `worktree` command MUST remain in the CLI package (not in create-basement-app)
166
+ - FR-10: The changeset/release pipeline MUST be updated to publish both packages independently
167
+ - FR-11: All source code MUST be TypeScript with `strict: true`
168
+
169
+ ## Non-Goals (Out of Scope)
170
+
171
+ - Changing the generated project's structure or conventions (output remains identical)
172
+ - Adding new templates, integrations, or hooks (only restructuring existing ones)
173
+ - Migrating from `prompts` to another prompt library
174
+ - Adding a test suite (beyond config validation — full test coverage is a separate effort)
175
+ - Changing the CLI command name from `basement`
176
+ - Moving to a different monorepo tool (no Turborepo, just bun workspaces)
177
+ - Rewriting mergers to use proper AST parsing (regex-based mergers stay, just reorganized)
178
+ - Publishing templates as separate npm packages
179
+
180
+ ## Target Directory Structure
181
+
182
+ ```
183
+ basement-starter-cli/
184
+ ├── package.json # Root: workspaces config, shared scripts
185
+ ├── biome.json # Shared linting/formatting
186
+ ├── bun.lock
187
+ ├── .changeset/ # Changeset config (updated for workspaces)
188
+ ├── .github/workflows/release.yml # Updated for multi-package publish
189
+
190
+ ├── packages/
191
+ │ ├── cli/ # @basementstudio/cli
192
+ │ │ ├── package.json # bin: "basement", depends on create-basement-app
193
+ │ │ ├── tsconfig.json
194
+ │ │ ├── bin/
195
+ │ │ │ └── index.js # CLI entry point (thin loader → dist/)
196
+ │ │ └── src/
197
+ │ │ ├── index.ts # Arg parsing + command routing
198
+ │ │ ├── commands/
199
+ │ │ │ ├── create.ts # Orchestrates create-basement-app modules
200
+ │ │ │ ├── add-integration.ts # Reuses apply-integration from create-basement-app
201
+ │ │ │ └── worktree.ts # Git worktree management (stays here)
202
+ │ │ └── utils/
203
+ │ │ └── display.ts # Banner, help text, success messages
204
+ │ │
205
+ │ └── create-basement-app/ # @basementstudio/create-basement-app
206
+ │ ├── package.json # Standalone scaffolding package
207
+ │ ├── tsconfig.json
208
+ │ ├── src/
209
+ │ │ ├── index.ts # Public API: exports all scaffolding functions
210
+ │ │ ├── copy-template.ts # Copy selected template to target dir
211
+ │ │ ├── apply-integration.ts # Apply CMS integration (merge + copy)
212
+ │ │ ├── hydrate-package.ts # Inject deps, scripts, metadata into package.json
213
+ │ │ ├── setup-agent.ts # Agent skills + MCP registration
214
+ │ │ ├── setup-sanity.ts # Automated Sanity project/token creation
215
+ │ │ ├── copy-hooks.ts # Copy selected hooks + inject their deps
216
+ │ │ ├── utils/
217
+ │ │ │ ├── paths.ts # Path resolution, src/ prefix detection
218
+ │ │ │ └── merge-utils.ts # Shared merge utilities
219
+ │ │ └── configs/
220
+ │ │ ├── animations.ts # GSAP and Motion dep declarations
221
+ │ │ └── agents.ts # Agent skill repos per template type
222
+ │ │
223
+ │ ├── templates/ # Full standalone Next.js projects
224
+ │ │ ├── default/ # Base next-starter
225
+ │ │ │ ├── package.json
226
+ │ │ │ ├── _gitignore
227
+ │ │ │ ├── app/
228
+ │ │ │ ├── components/
229
+ │ │ │ ├── lib/
230
+ │ │ │ └── ...
231
+ │ │ ├── webgl/ # next-starter + R3F canvas/scene
232
+ │ │ │ ├── package.json # Includes @react-three/fiber, three, etc.
233
+ │ │ │ ├── _gitignore
234
+ │ │ │ ├── app/page.tsx # WebGL page (not an overlay — the actual file)
235
+ │ │ │ ├── components/webgl/ # Canvas + scene components
236
+ │ │ │ └── ...
237
+ │ │ ├── webgpu/ # next-starter + WebGPU setup
238
+ │ │ │ ├── package.json # Includes alpha R3F, WebGPU deps
239
+ │ │ │ └── ...
240
+ │ │ └── experiment/ # next-starter + experiment nav
241
+ │ │ ├── package.json # Includes experiment deps
242
+ │ │ ├── components/layout/ # Experiment header + nav menu
243
+ │ │ ├── lib/constants.ts
244
+ │ │ └── ...
245
+ │ │
246
+ │ ├── integrations/ # CMS integrations (applied on top of any template)
247
+ │ │ ├── sanity/
248
+ │ │ │ ├── config.ts # Single source of truth: deps, scripts, paths, mergeFiles
249
+ │ │ │ ├── files/ # All Sanity files to copy/merge
250
+ │ │ │ │ ├── app/
251
+ │ │ │ │ │ ├── layout.tsx # Integration version (for merging)
252
+ │ │ │ │ │ ├── sitemap.ts
253
+ │ │ │ │ │ ├── api/
254
+ │ │ │ │ │ └── studio/
255
+ │ │ │ │ ├── components/ui/sanity-image/
256
+ │ │ │ │ └── lib/integrations/sanity/
257
+ │ │ │ └── mergers/ # Sanity-specific merge logic
258
+ │ │ │ ├── layout-merger.ts
259
+ │ │ │ ├── sitemap-merger.ts
260
+ │ │ │ └── check-integration-merger.ts
261
+ │ │ └── basehub/
262
+ │ │ ├── config.ts
263
+ │ │ └── files/
264
+ │ │ └── lib/integrations/basehub/
265
+ │ │
266
+ │ ├── template-hooks/ # Optional hooks (copied during scaffolding)
267
+ │ │ ├── config.ts # Hook metadata: name, file, external deps
268
+ │ │ ├── use-battery.ts
269
+ │ │ ├── use-device-perf.ts
270
+ │ │ ├── use-intersection-observer.ts
271
+ │ │ └── use-media.ts
272
+ │ │
273
+ │ └── plugins/ # Biome Grit lint rules
274
+ │ ├── no-anchor-element.grit
275
+ │ ├── no-relative-parent-imports.grit
276
+ │ └── no-unnecessary-forwardref.grit
277
+ ```
278
+
279
+ ## Technical Considerations
280
+
281
+ ### Bun Workspaces Setup
282
+
283
+ Root `package.json`:
284
+ ```json
285
+ {
286
+ "name": "basement-starter-cli",
287
+ "private": true,
288
+ "workspaces": ["packages/*"],
289
+ "scripts": {
290
+ "build": "bun run --filter '*' build",
291
+ "typecheck": "bun run --filter '*' typecheck",
292
+ "lint": "biome check .",
293
+ "lint:fix": "biome check --write ."
294
+ }
295
+ }
296
+ ```
297
+
298
+ ### Package Dependencies
299
+
300
+ - `packages/cli` depends on `packages/create-basement-app` via workspace protocol: `"@basementstudio/create-basement-app": "workspace:*"`
301
+ - `packages/create-basement-app` is independently usable: `npx @basementstudio/create-basement-app`
302
+ - Shared dev dependencies (biome, changesets) live at the root
303
+
304
+ ### Template Creation Strategy
305
+
306
+ To create the four standalone templates:
307
+
308
+ 1. Clone `basementstudio/next-starter#main` as the `default` template
309
+ 2. For `webgl`: clone default, apply the current WebGL layer files, add R3F deps to its `package.json`
310
+ 3. For `webgpu`: clone default, add WebGPU/alpha deps to its `package.json`, add any WebGPU-specific files
311
+ 4. For `experiment`: clone default, apply experiment layer files, add experiment deps
312
+
313
+ After initial creation, each template is maintained independently — no more runtime overlay system for templates.
314
+
315
+ ### Integration Application (Preserved)
316
+
317
+ CMS integrations still use the merge approach because they cross-cut all four templates. The difference:
318
+ - **Before:** Downloaded from remote GitHub branches at runtime via tiged
319
+ - **After:** Local files in `create-basement-app/integrations/{cms}/files/`, with merger functions co-located in `integrations/{cms}/mergers/`
320
+
321
+ ### Migration Path
322
+
323
+ This is a breaking change for the internal structure but NOT for end users. The `basement` CLI command, its flags, prompts, and generated output must remain identical. The migration should:
324
+
325
+ 1. Create the new structure alongside the old one
326
+ 2. Move files incrementally
327
+ 3. Verify the CLI produces identical output before removing old files
328
+ 4. Update changeset config for workspace-aware publishing
329
+
330
+ ### Config Manifest Format
331
+
332
+ Each integration config (`integrations/{cms}/config.ts`) should follow this shape:
333
+
334
+ ```typescript
335
+ interface IntegrationConfig {
336
+ name: string
337
+ dependencies: Record<string, string>
338
+ devDependencies: Record<string, string>
339
+ scripts: Record<string, string>
340
+ additivePaths: string[] // Files to copy directly
341
+ mergeFiles: { // Files requiring smart merge
342
+ path: string
343
+ merger: () => Promise<MergerFn>
344
+ }[]
345
+ }
346
+ ```
347
+
348
+ Similarly, `template-hooks/config.ts`:
349
+
350
+ ```typescript
351
+ interface HookConfig {
352
+ name: string // Display name for the prompt
353
+ file: string // Filename
354
+ dependencies: Record<string, string>
355
+ devDependencies?: Record<string, string>
356
+ }
357
+ ```
358
+
359
+ ## Success Metrics
360
+
361
+ - The `basement` CLI produces byte-identical project output before and after the restructure (verified by diffing generated projects)
362
+ - Each template can be independently installed and run (`cd templates/webgl && bun install && bun dev`)
363
+ - Adding a new template requires creating ONE new directory in `templates/` — no config files, no merger code, no CLI changes
364
+ - Adding a new CMS integration requires creating ONE new directory in `integrations/` with a `config.ts` and `files/` — no changes to CLI or pipeline code
365
+ - Zero hardcoded dependency versions in pipeline code (all from config manifests)
366
+ - Config-filesystem validation catches 100% of mismatches in CI
367
+ - TypeScript strict mode with zero errors across both packages
368
+
369
+ ## Open Questions
370
+
371
+ 1. **Should `create-basement-app` also be directly invocable via `npx @basementstudio/create-basement-app`?** (Like `create-xmcp-app` is.) This would mean it needs its own interactive prompts, not just exported functions. The xmcp pattern supports this.
372
+ 2. **How should templates be kept in sync with upstream `next-starter` changes?** With standalone templates, each one needs to be individually updated when the base starter evolves. Should there be a script or CI job that diffs templates against `next-starter` and flags drift?
373
+ 3. **Should the `next-config-merger.js` be integrated or removed?** It's currently orphaned (defined but never called). If Sanity's `next.config.ts` changes are needed, the merger should be registered. If not, it should be deleted.
374
+ 4. **Should plugins (Biome Grit rules) live in `create-basement-app` or at the root?** They're copied into generated projects but also used to lint this repo itself.
375
+ 5. **Version strategy for workspaces** — Should both packages share a version number or be independently versioned? Independent versioning is more flexible but harder to coordinate.