bsmnt 0.0.0 → 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 (431) hide show
  1. package/.github/workflows/release.yml +2 -0
  2. package/CHANGELOG.md +39 -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/.changeset/2026-02-11-test-patch-bump.md +0 -5
  377. package/layers/experiment/components/layout/header/index.tsx +0 -58
  378. package/layers/experiment/components/layout/navigation-menu.tsx +0 -127
  379. package/layers/experiment/lib/constants.ts +0 -12
  380. package/layers/webgl/app/page.tsx +0 -10
  381. package/layers/webgl/components/webgl/canvas/dynamic.tsx +0 -34
  382. package/layers/webgl/components/webgl/canvas/index.tsx +0 -43
  383. package/layers/webgl/components/webgl/components/scene/index.tsx +0 -21
  384. package/src/mergers/next-config-merger.js +0 -63
  385. /package/{src → packages/cli/src}/commands/setup-sanity.js +0 -0
  386. /package/{src → packages/cli/src}/commands/worktree.js +0 -0
  387. /package/{integrations/basehub → packages/create-basement-app/integrations/basehub/files}/README.md +0 -0
  388. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/app/api/draft-mode/disable/route.ts +0 -0
  389. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/app/api/draft-mode/enable/route.ts +0 -0
  390. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/app/api/revalidate/route.ts +0 -0
  391. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/app/layout.tsx +0 -0
  392. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/app/sitemap.ts +0 -0
  393. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/app/studio/[[...tool]]/page.tsx +0 -0
  394. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/app/studio/layout.tsx +0 -0
  395. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/components/ui/sanity-image/index.tsx +0 -0
  396. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/README.md +0 -0
  397. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/check-integration.ts +0 -0
  398. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/README.md +0 -0
  399. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/client.ts +0 -0
  400. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/components/disable-draft-mode.tsx +0 -0
  401. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/components/rich-text.tsx +0 -0
  402. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/env.ts +0 -0
  403. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/live/index.tsx +0 -0
  404. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/queries.ts +0 -0
  405. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/sanity.cli.ts +0 -0
  406. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/sanity.config.ts +0 -0
  407. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/sanity.types.ts +0 -0
  408. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/schema.json +0 -0
  409. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/schemas/article.ts +0 -0
  410. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/schemas/example.ts +0 -0
  411. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/schemas/index.ts +0 -0
  412. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/schemas/link.ts +0 -0
  413. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/schemas/metadata.ts +0 -0
  414. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/schemas/navigation.ts +0 -0
  415. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/schemas/page.ts +0 -0
  416. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/schemas/richText.ts +0 -0
  417. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/structure.ts +0 -0
  418. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/utils/image.ts +0 -0
  419. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/utils/link.ts +0 -0
  420. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/scripts/copy-sanity-mcp.ts +0 -0
  421. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/scripts/generate-page.ts +0 -0
  422. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/utils/metadata.ts +0 -0
  423. /package/{plugins → packages/create-basement-app/plugins}/README.md +0 -0
  424. /package/{plugins → packages/create-basement-app/plugins}/no-anchor-element.grit +0 -0
  425. /package/{plugins → packages/create-basement-app/plugins}/no-relative-parent-imports.grit +0 -0
  426. /package/{plugins → packages/create-basement-app/plugins}/no-unnecessary-forwardref.grit +0 -0
  427. /package/{template-hooks → packages/create-basement-app/template-hooks}/use-battery.ts +0 -0
  428. /package/{template-hooks → packages/create-basement-app/template-hooks}/use-device-perf.ts +0 -0
  429. /package/{template-hooks → packages/create-basement-app/template-hooks}/use-intersection-observer.ts +0 -0
  430. /package/{template-hooks → packages/create-basement-app/template-hooks}/use-media.ts +0 -0
  431. /package/{layers/webgpu → packages/create-basement-app/templates/default/lib/integrations}/.gitkeep +0 -0
@@ -0,0 +1,91 @@
1
+ graph TD
2
+ subgraph ROOT["basement-starter-cli (root)"]
3
+ PKG_ROOT["package.json<br/><i>workspaces: packages/*</i>"]
4
+ BIOME["biome.json<br/><i>shared linting</i>"]
5
+ CHANGESET[".changeset/<br/><i>versioning</i>"]
6
+ CI[".github/workflows/<br/><i>release pipeline</i>"]
7
+ end
8
+
9
+ subgraph CLI["packages/cli — @basementstudio/cli"]
10
+ CLI_BIN["bin/index.js<br/><i>CLI entry point</i><br/><i>basement command</i>"]
11
+ CLI_CREATE["src/commands/create.js<br/><i>orchestrates scaffolding</i>"]
12
+ CLI_ADD["src/commands/add-integration.js<br/><i>add CMS to existing project</i>"]
13
+ CLI_WORKTREE["src/commands/worktree.js<br/><i>git worktree management</i>"]
14
+ CLI_SANITY["src/commands/setup-sanity.js<br/><i>automated Sanity setup</i>"]
15
+ CLI_PKG["package.json<br/><i>depends on create-basement-app</i>"]
16
+ end
17
+
18
+ subgraph CBA["packages/create-basement-app — @basementstudio/create-basement-app"]
19
+ CBA_INDEX["src/index.js<br/><i>public API barrel export</i>"]
20
+
21
+ subgraph MERGERS["src/mergers/"]
22
+ MERGER_INDEX["index.js<br/><i>injectLayer, injectIntegration</i>"]
23
+ MERGER_CONFIG["config.js<br/><i>CMS_CONFIG, LAYER_CONFIG</i>"]
24
+ end
25
+
26
+ subgraph CONFIGS["src/configs/"]
27
+ ANIM_CONFIG["animations.js<br/><i>GSAP, Motion deps</i>"]
28
+ end
29
+
30
+ subgraph TEMPLATES["templates/ — standalone Next.js projects"]
31
+ T_DEFAULT["default/<br/><i>84 files, base starter</i>"]
32
+ T_WEBGL["webgl/<br/><i>87 files, R3F + canvas</i>"]
33
+ T_WEBGPU["webgpu/<br/><i>84 files, alpha R3F deps</i>"]
34
+ T_EXPERIMENT["experiment/<br/><i>86 files, nav components</i>"]
35
+ end
36
+
37
+ subgraph INTEGRATIONS["integrations/ — CMS overlays"]
38
+ subgraph SANITY["sanity/"]
39
+ S_CONFIG["config.js<br/><i>deps, scripts, paths</i>"]
40
+ S_FILES["files/<br/><i>35 Sanity files</i>"]
41
+ S_MERGERS["mergers/<br/><i>layout, sitemap, check</i>"]
42
+ end
43
+ subgraph BASEHUB["basehub/"]
44
+ B_CONFIG["config.js<br/><i>basehub ^3.0.0</i>"]
45
+ B_FILES["files/<br/><i>README.md</i>"]
46
+ end
47
+ end
48
+
49
+ subgraph HOOKS["template-hooks/"]
50
+ H_CONFIG["config.js<br/><i>hook metadata + deps</i>"]
51
+ H_BATTERY["use-battery.ts"]
52
+ H_PERF["use-device-perf.ts"]
53
+ H_OBSERVER["use-intersection-observer.ts"]
54
+ H_MEDIA["use-media.ts"]
55
+ end
56
+
57
+ PLUGINS["plugins/<br/><i>3 Biome Grit rules</i>"]
58
+ end
59
+
60
+ %% Dependencies
61
+ CLI_BIN --> CLI_CREATE
62
+ CLI_BIN --> CLI_ADD
63
+ CLI_BIN --> CLI_WORKTREE
64
+ CLI_CREATE --> CBA_INDEX
65
+ CLI_CREATE --> S_CONFIG
66
+ CLI_CREATE --> B_CONFIG
67
+ CLI_CREATE --> H_CONFIG
68
+ CLI_ADD --> CBA_INDEX
69
+ CLI_ADD --> S_CONFIG
70
+ CLI_ADD --> B_CONFIG
71
+ CBA_INDEX --> MERGER_INDEX
72
+ CBA_INDEX --> ANIM_CONFIG
73
+ MERGER_INDEX --> MERGER_CONFIG
74
+ MERGER_INDEX --> S_MERGERS
75
+ CLI_CREATE --> TEMPLATES
76
+ CLI_CREATE --> CLI_SANITY
77
+
78
+ %% Styling
79
+ classDef root fill:#1a1a2e,stroke:#e94560,color:#fff
80
+ classDef cli fill:#16213e,stroke:#0f3460,color:#fff
81
+ classDef cba fill:#0f3460,stroke:#533483,color:#fff
82
+ classDef template fill:#533483,stroke:#e94560,color:#fff
83
+ classDef integration fill:#e94560,stroke:#fff,color:#fff
84
+ classDef hook fill:#0f3460,stroke:#e94560,color:#fff
85
+
86
+ class ROOT root
87
+ class CLI cli
88
+ class CBA cba
89
+ class TEMPLATES,T_DEFAULT,T_WEBGL,T_WEBGPU,T_EXPERIMENT template
90
+ class INTEGRATIONS,SANITY,BASEHUB integration
91
+ class HOOKS hook
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bsmnt",
3
- "version": "0.0.0",
3
+ "version": "0.1.0",
4
4
  "description": "CLI to scaffold basement projects and add integrations",
5
5
  "type": "module",
6
6
  "bin": {
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- import chalk from "chalk";
3
+ import pc from "picocolors";
4
4
  import prompts from "prompts";
5
5
  import { addIntegration } from "../src/commands/add-integration.js";
6
6
  import { createProject } from "../src/commands/create.js";
@@ -104,88 +104,89 @@ function parseArgs(args) {
104
104
 
105
105
  function showHelp() {
106
106
  console.log(`
107
- ${chalk.bold("Usage:")} basement [mode] [project-name] [flags]
107
+ ${pc.bold("Usage:")} basement [mode] [project-name] [flags]
108
108
 
109
- ${chalk.bold("Modes:")}
109
+ ${pc.bold("Modes:")}
110
110
  -c, --create Setup a new basement project
111
111
  -a, --add Add integration to current project
112
112
  -w, --worktree Manage git worktrees
113
113
 
114
- ${chalk.bold("Create Flags:")}
115
- ${chalk.cyan("Template:")}
114
+ ${pc.bold("Create Flags:")}
115
+ ${pc.cyan("Template:")}
116
116
  -d, --default Use Default (Next.js) template
117
117
  -webgl Use WebGL template
118
118
  -webgpu Use WebGPU template
119
119
  -exp, -experiment Use Experiment template
120
120
 
121
- ${chalk.cyan("CMS:")}
121
+ ${pc.cyan("CMS:")}
122
122
  -sanity Use Sanity CMS
123
123
  -basehub Use BaseHub CMS
124
124
  -no-cms No CMS
125
125
 
126
- ${chalk.cyan("Animation:")}
126
+ ${pc.cyan("Animation:")}
127
127
  -gsap Use GSAP
128
128
  -motion Use Framer Motion
129
129
  -no-animation No animation library
130
130
 
131
- ${chalk.cyan("Agent:")}
131
+ ${pc.cyan("Agent:")}
132
132
  -claude Use Claude Code
133
133
  -opencode Use OpenCode
134
134
 
135
- ${chalk.cyan("Other:")}
135
+ ${pc.cyan("Other:")}
136
136
  -no-hooks Skip hooks selection
137
137
  -h, --help Show this help
138
138
 
139
- ${chalk.bold("Add Integration Flags:")}
139
+ ${pc.bold("Add Integration Flags:")}
140
140
  -sanity Add Sanity CMS integration
141
141
  -basehub Add BaseHub integration
142
142
 
143
- ${chalk.bold("Worktree Flags:")}
144
- ${chalk.cyan("Actions:")}
143
+ ${pc.bold("Worktree Flags:")}
144
+ ${pc.cyan("Actions:")}
145
145
  -wc, --worktree-create Create a new worktree
146
146
  -wl, --worktree-list List all worktrees
147
147
  -ws, --worktree-switch Switch to a worktree
148
148
  -wr, --worktree-remove Remove a worktree
149
149
  -wp, --worktree-prune Clean up stale worktrees
150
150
 
151
- ${chalk.cyan("Options:")}
151
+ ${pc.cyan("Options:")}
152
152
  -b=<name>, --branch=<name> Specify branch name (comma-separated for multiple)
153
153
  -db, --delete-branch Delete branch when removing worktree
154
154
  -f, --force Skip confirmation prompts
155
155
 
156
- ${chalk.bold("Examples:")}
157
- ${chalk.dim("# Interactive mode")}
156
+ ${pc.bold("Examples:")}
157
+ ${pc.dim("# Interactive mode")}
158
158
  basement
159
159
 
160
- ${chalk.dim("# Quick create with all flags")}
160
+ ${pc.dim("# Quick create with all flags")}
161
161
  basement -c my-app -d -sanity -gsap -claude -no-hooks
162
162
 
163
- ${chalk.dim("# Add Sanity to current project")}
163
+ ${pc.dim("# Add Sanity to current project")}
164
164
  basement -a -sanity
165
165
 
166
- ${chalk.dim("# Interactive add integration")}
166
+ ${pc.dim("# Interactive add integration")}
167
167
  basement -a
168
168
 
169
- ${chalk.dim("# Create worktree interactively")}
169
+ ${pc.dim("# Create worktree interactively")}
170
170
  basement -w
171
171
 
172
- ${chalk.dim("# Create worktree with branch name")}
172
+ ${pc.dim("# Create worktree with branch name")}
173
173
  basement -wc -b=feature/auth
174
174
 
175
- ${chalk.dim("# Create multiple worktrees at once")}
175
+ ${pc.dim("# Create multiple worktrees at once")}
176
176
  basement -wc -b=feature/auth,feature/dashboard,fix/bug-123
177
177
 
178
- ${chalk.dim("# List all worktrees")}
178
+ ${pc.dim("# List all worktrees")}
179
179
  basement -wl
180
180
 
181
- ${chalk.dim("# Remove worktree and delete branch")}
181
+ ${pc.dim("# Remove worktree and delete branch")}
182
182
  basement -wr -b=feature/auth -db -f
183
183
  `);
184
184
  }
185
185
 
186
186
  function showBanner() {
187
+ const orange = (text) => `\x1b[1m\x1b[38;2;255;77;0m${text}\x1b[0m`;
187
188
  console.log(
188
- chalk.bold.hex("#FF4D00")(`
189
+ orange(`
189
190
  ██████╗ █████╗ ███████╗███████╗███╗ ███╗███████╗███╗ ██╗████████╗
190
191
  ██╔══██╗██╔══██╗██╔════╝██╔════╝████╗ ████║██╔════╝████╗ ██║╚══██╔══╝
191
192
  ██████╔╝███████║███████╗█████╗ ██╔████╔██║█████╗ ██╔██╗ ██║ ██║
@@ -194,7 +195,7 @@ function showBanner() {
194
195
  ╚═════╝ ╚═╝ ╚═╝╚══════╝╚══════╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═══╝ ╚═╝
195
196
  `),
196
197
  );
197
- console.log(chalk.bold.hex("#FF4D00")("\n🚀 Welcome to basement-cli\n"));
198
+ console.log(orange("\n Welcome to basement-cli\n"));
198
199
  }
199
200
 
200
201
  async function main() {
@@ -238,7 +239,7 @@ async function main() {
238
239
  });
239
240
 
240
241
  if (!selectedMode) {
241
- console.log(chalk.yellow("\nOperation cancelled.\n"));
242
+ console.log(pc.yellow("\n Operation cancelled.\n"));
242
243
  return;
243
244
  }
244
245
 
@@ -254,7 +255,7 @@ async function main() {
254
255
  await worktreeCommand(options);
255
256
  }
256
257
  } catch (error) {
257
- console.error(chalk.red("\nAn error occurred:"), error.message);
258
+ console.error(pc.red("\n An error occurred:"), error.message);
258
259
  process.exit(1);
259
260
  }
260
261
  }
@@ -0,0 +1,16 @@
1
+ {
2
+ "name": "@basementstudio/cli",
3
+ "version": "0.2.2",
4
+ "description": "CLI to scaffold basement projects and add integrations",
5
+ "type": "module",
6
+ "bin": {
7
+ "basement": "./bin/index.js"
8
+ },
9
+ "dependencies": {
10
+ "@basementstudio/create-basement-app": "workspace:*",
11
+ "fs-extra": "^11.3.3",
12
+ "ora": "^9.1.0",
13
+ "picocolors": "^1.1.1",
14
+ "prompts": "^2.4.2"
15
+ }
16
+ }
@@ -4,6 +4,8 @@ import fs from "fs-extra";
4
4
  import ora from "ora";
5
5
  import pc from "picocolors";
6
6
  import prompts from "prompts";
7
+ import { basehubConfig } from "../../../create-basement-app/integrations/basehub/config.js";
8
+ import { sanityConfig } from "../../../create-basement-app/integrations/sanity/config.js";
7
9
 
8
10
  /**
9
11
  * Validates that the current directory is a valid Next.js project
@@ -66,39 +68,35 @@ async function checkExistingIntegration(targetDir, integration, usesSrcPrefix) {
66
68
  }
67
69
 
68
70
  /**
69
- * Add CMS depeπzckage.json
71
+ * Add CMS dependencies to package.json from integration config manifests
70
72
  */
71
73
  async function addDependencies(targetDir, integration) {
72
74
  const pkgPath = path.join(targetDir, "package.json");
73
75
  const pkg = await fs.readJson(pkgPath);
74
76
 
75
- if (integration === "sanity") {
76
- pkg.dependencies = {
77
- ...pkg.dependencies,
78
- "@sanity/asset-utils": "^2.3.0",
79
- "@sanity/image-url": "^2.0.3",
80
- "@sanity/visual-editing": "^5.1.1",
81
- "@sanity/vision": "^5.7.0",
82
- "next-sanity": "^12.0.14",
83
- };
84
-
85
- pkg.devDependencies = {
86
- ...pkg.devDependencies,
87
- sanity: "^5.6.0",
88
- };
77
+ const cmsConfigs = { sanity: sanityConfig, basehub: basehubConfig };
78
+ const config = cmsConfigs[integration];
89
79
 
90
- pkg.scripts = {
91
- ...pkg.scripts,
92
- "sanity:extract":
93
- "cd lib/integrations/sanity && bun --env-file ../../../.env.local sanity schema extract",
94
- "sanity:typegen":
95
- "cd lib/integrations/sanity && bun --env-file ../../../.env.local sanity typegen generate && bun biome check --write --unsafe",
96
- };
97
- } else if (integration === "basehub") {
80
+ if (config) {
98
81
  pkg.dependencies = {
99
82
  ...pkg.dependencies,
100
- basehub: "^3.0.0",
83
+ ...config.dependencies,
101
84
  };
85
+ if (
86
+ config.devDependencies &&
87
+ Object.keys(config.devDependencies).length > 0
88
+ ) {
89
+ pkg.devDependencies = {
90
+ ...pkg.devDependencies,
91
+ ...config.devDependencies,
92
+ };
93
+ }
94
+ if (config.scripts && Object.keys(config.scripts).length > 0) {
95
+ pkg.scripts = {
96
+ ...pkg.scripts,
97
+ ...config.scripts,
98
+ };
99
+ }
102
100
  }
103
101
 
104
102
  await fs.writeJson(pkgPath, pkg, { spaces: 2 });
@@ -187,7 +185,7 @@ export async function addIntegration(options = {}) {
187
185
 
188
186
  try {
189
187
  const { injectIntegration, formatMergeResults } = await import(
190
- "../mergers/index.js"
188
+ "../../../create-basement-app/src/mergers/index.js"
191
189
  );
192
190
  const results = await injectIntegration(
193
191
  targetDir,
@@ -1,23 +1,40 @@
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 { basehubConfig } from "../../../create-basement-app/integrations/basehub/config.js";
9
+ import { sanityConfig } from "../../../create-basement-app/integrations/sanity/config.js";
10
+ import { getAnimationConfig } from "../../../create-basement-app/src/configs/animations.js";
11
+ import { hooksConfig } from "../../../create-basement-app/template-hooks/config.js";
11
12
 
12
13
  const __filename = fileURLToPath(import.meta.url);
13
14
  const __dirname = path.dirname(__filename);
14
15
 
15
- dotenv.config({ path: path.resolve(__dirname, "../../.env") });
16
-
17
16
  /**
18
- * Creates a new project by downloading a template from GitHub.
17
+ * Creates a new project by copying a local standalone template.
19
18
  */
20
19
  export async function createProject(projectName, options = {}) {
20
+ // Discover available templates dynamically from create-basement-app/templates/
21
+ const templatesDir = path.resolve(
22
+ __dirname,
23
+ "../../../create-basement-app/templates",
24
+ );
25
+ const templateNames = (
26
+ await fs.readdir(templatesDir, { withFileTypes: true })
27
+ )
28
+ .filter((d) => d.isDirectory())
29
+ .map((d) => d.name);
30
+
31
+ const templateLabels = {
32
+ default: "Default (Next.js Starter)",
33
+ webgl: "WebGL (3D Graphics)",
34
+ webgpu: "WebGPU (Next-gen Graphics)",
35
+ experiment: "Experiment (Creative Coding)",
36
+ };
37
+
21
38
  // 1. Interactive Prompts (skip if flag provided)
22
39
  const answers = await prompts([
23
40
  {
@@ -34,12 +51,10 @@ export async function createProject(projectName, options = {}) {
34
51
  type: options.template ? null : "select",
35
52
  name: "projectType",
36
53
  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
- ],
54
+ choices: templateNames.map((name) => ({
55
+ title: templateLabels[name] || name,
56
+ value: name,
57
+ })),
43
58
  },
44
59
  {
45
60
  type: options.cms ? null : "select",
@@ -74,13 +89,7 @@ export async function createProject(projectName, options = {}) {
74
89
  type: options.hooks !== undefined ? null : "multiselect",
75
90
  name: "hooks",
76
91
  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
- },
92
+ choices: hooksConfig.map((h) => ({ title: h.name, value: h.file })),
84
93
  },
85
94
  ]);
86
95
 
@@ -114,68 +123,24 @@ export async function createProject(projectName, options = {}) {
114
123
  await fs.remove(targetDir);
115
124
  }
116
125
 
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
- });
126
+ // 3. Copy local template (standalone, no network call)
127
+ const templateDir = path.resolve(
128
+ __dirname,
129
+ "../../../create-basement-app/templates",
130
+ type,
131
+ );
132
+ const copySpinner = ora(`Copying ${pc.cyan(type)} template...`).start();
138
133
 
139
134
  try {
140
- await emitter.clone(targetDir);
135
+ await fs.copy(templateDir, targetDir);
141
136
 
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);
137
+ // Rename _gitignore to .gitignore (npm strips dotfiles from published packages)
138
+ const underscoreGitignore = path.join(targetDir, "_gitignore");
139
+ if (await fs.pathExists(underscoreGitignore)) {
140
+ await fs.rename(underscoreGitignore, path.join(targetDir, ".gitignore"));
146
141
  }
147
142
 
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}`),
175
- );
176
- console.log(pc.dim(" Continuing with base template..."));
177
- }
178
- }
143
+ copySpinner.succeed(pc.green(`${type} template copied.`));
179
144
 
180
145
  // 3.5. Inject Integration Files (Smart Merge)
181
146
  if (cms && cms !== "none") {
@@ -183,7 +148,7 @@ export async function createProject(projectName, options = {}) {
183
148
 
184
149
  try {
185
150
  const { injectIntegration, formatMergeResults } = await import(
186
- "../mergers/index.js"
151
+ "../../../create-basement-app/src/mergers/index.js"
187
152
  );
188
153
  const results = await injectIntegration(
189
154
  targetDir,
@@ -222,61 +187,70 @@ export async function createProject(projectName, options = {}) {
222
187
  pkg.name = name;
223
188
  pkg.version = "0.1.0";
224
189
 
225
- // Inject Layer Dependencies from LAYER_CONFIG
226
- const layerConfig = getLayerConfig(type);
227
- if (layerConfig) {
228
- pkg.dependencies = {
229
- ...pkg.dependencies,
230
- ...layerConfig.dependencies,
231
- };
232
- pkg.devDependencies = {
233
- ...pkg.devDependencies,
234
- ...layerConfig.devDependencies,
235
- };
236
- }
190
+ // Layer deps are already in the standalone template's package.json — no injection needed
237
191
 
238
- // Inject CMS Dependencies
239
- if (cms === "sanity") {
192
+ // Inject CMS Dependencies from integration config manifests
193
+ const cmsConfigs = { sanity: sanityConfig, basehub: basehubConfig };
194
+ const cmsIntegrationConfig = cmsConfigs[cms];
195
+ if (cmsIntegrationConfig) {
240
196
  pkg.dependencies = {
241
197
  ...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",
198
+ ...cmsIntegrationConfig.dependencies,
252
199
  };
200
+ if (
201
+ cmsIntegrationConfig.devDependencies &&
202
+ Object.keys(cmsIntegrationConfig.devDependencies).length > 0
203
+ ) {
204
+ pkg.devDependencies = {
205
+ ...pkg.devDependencies,
206
+ ...cmsIntegrationConfig.devDependencies,
207
+ };
208
+ }
209
+ if (
210
+ cmsIntegrationConfig.scripts &&
211
+ Object.keys(cmsIntegrationConfig.scripts).length > 0
212
+ ) {
213
+ pkg.scripts = {
214
+ ...pkg.scripts,
215
+ ...cmsIntegrationConfig.scripts,
216
+ };
217
+ }
218
+ }
253
219
 
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") {
220
+ // Inject Animation Dependencies from config manifest
221
+ const animationConfig = getAnimationConfig(animation);
222
+ if (animationConfig) {
262
223
  pkg.dependencies = {
263
224
  ...pkg.dependencies,
264
- basehub: "^3.0.0",
225
+ ...animationConfig.dependencies,
265
226
  };
266
227
  }
267
228
 
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
- };
229
+ // Inject Hook Dependencies from config manifest
230
+ if (hooks && hooks.length > 0) {
231
+ for (const hookFile of hooks) {
232
+ const hookConfig = hooksConfig.find((h) => h.file === hookFile);
233
+ if (hookConfig) {
234
+ if (
235
+ hookConfig.dependencies &&
236
+ Object.keys(hookConfig.dependencies).length > 0
237
+ ) {
238
+ pkg.dependencies = {
239
+ ...pkg.dependencies,
240
+ ...hookConfig.dependencies,
241
+ };
242
+ }
243
+ if (
244
+ hookConfig.devDependencies &&
245
+ Object.keys(hookConfig.devDependencies).length > 0
246
+ ) {
247
+ pkg.devDependencies = {
248
+ ...pkg.devDependencies,
249
+ ...hookConfig.devDependencies,
250
+ };
251
+ }
252
+ }
253
+ }
280
254
  }
281
255
 
282
256
  await fs.writeJson(finalPkgPath, pkg, { spaces: 2 });
@@ -371,14 +345,12 @@ export async function createProject(projectName, options = {}) {
371
345
  const projectHooksPath = path.join(targetDir, "hooks");
372
346
  await fs.ensureDir(projectHooksPath);
373
347
 
348
+ const hooksSourceDir = path.resolve(
349
+ __dirname,
350
+ "../../../create-basement-app/template-hooks",
351
+ );
374
352
  for (const hookFile of hooks) {
375
- const sourcePath = path.join(
376
- __dirname,
377
- "..",
378
- "..",
379
- "template-hooks",
380
- hookFile,
381
- );
353
+ const sourcePath = path.join(hooksSourceDir, hookFile);
382
354
  await fs.copy(sourcePath, path.join(projectHooksPath, hookFile));
383
355
  }
384
356
  hooksSpinner.succeed(pc.green(`${hooks.length} hooks added.`));
@@ -404,12 +376,11 @@ export async function createProject(projectName, options = {}) {
404
376
 
405
377
  console.log(pc.cyan(` bun dev\n`));
406
378
  } catch (error) {
407
- downloadSpinner.fail(pc.red("Failed to create project."));
379
+ copySpinner.fail(pc.red("Failed to create project."));
408
380
  console.error(pc.dim(`\nError details: ${error.message}`));
409
381
  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.`);
382
+ console.log(`1. Verify the template exists: ${templateDir}`);
383
+ console.log(`2. Check file permissions on the target directory.`);
413
384
  process.exit(1);
414
385
  }
415
386
  }