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
@@ -5,111 +5,305 @@
5
5
  - src/mergers/index.js holds injection/merge logic (injectIntegration for CMS, injectLayer for layers)
6
6
  - src/commands/create.js is the main CLI flow
7
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))`
8
+ - Layer files are in templates/{type}/ directory, CMS integration files are LOCAL in integrations/{cms}/files/ (no more tiged remote clone)
9
+ - ESM requires __dirname workaround: `const __dirname = path.dirname(fileURLToPath(import.meta.url))`
10
10
  - CLI binary is basement (defined in package.json bin field)
11
- - Dependency injection order in create.js: layer deps CMS deps animation deps
11
+ - Dependency injection order in create.js: layer deps -> CMS deps -> animation deps
12
+ - bin/index.js now uses picocolors (chalk replaced in US-002), all files use picocolors
13
+ - CMS deps now come from integration config manifests (sanityConfig, basehubConfig) imported in create.js and add-integration.js
14
+ - Layer deps still in LAYER_CONFIG in config.js — animation deps now in src/configs/animations.js (centralized in US-011)
15
+ - Animation config pattern: ANIMATION_CONFIG object + getAnimationConfig(name) helper in src/configs/animations.js
16
+ - Dependency injection order in create.js: layer deps -> CMS deps -> animation deps -> hook deps
17
+ - Hook deps are now injected into target package.json during hydration (from hooksConfig)
18
+ - Template prompt is dynamic: reads directory listing from create-basement-app/templates/
19
+ - Hook prompt choices are config-driven: from hooksConfig (not fs.readdir)
20
+ - inquirer and chalk removed from root package.json (unused — prompts and picocolors used instead)
21
+ - Integration config pattern: `integrations/{cms}/config.js` exports `{name}Config` with deps, devDeps, scripts, additivePaths, mergeFiles
22
+ - Sanity has 35 source files, 3 mergers, and a config manifest in packages/create-basement-app/integrations/sanity/
23
+ - Sanity deps: @sanity/asset-utils, @sanity/image-url, @sanity/visual-editing, @sanity/vision, next-sanity (deps) + sanity (devDep)
24
+ - next-config-merger.js was orphaned (deleted in US-003)
25
+
26
+ - Hook deps: use-battery -> lodash-es; use-device-perf -> detect-gpu, react-device-detect, zustand; use-intersection-observer -> none; use-media -> none
27
+ - BaseHub integration is minimal: basehub ^3.0.0 dep only, one additivePath, no mergeFiles, no scripts
28
+ - Root biome.json `includes` now covers packages/** (updated in US-002)
29
+ - `bun run lint` fails with "nested root configuration" error — templates/ contain their own biome.json with root:true, which conflicts with the root biome.json. This is pre-existing and expected (templates are standalone projects).
30
+ - Empty directories in packages/ won't be tracked by git unless they have files - each has package.json
31
+ - CLI commands now import mergers from ../../../create-basement-app/src/mergers/ (updated in US-003)
32
+ - Merger code lives in packages/create-basement-app/src/mergers/ with barrel export at src/index.js
33
+ - Old root dirs (layers, integrations, template-hooks, plugins, src, bin) deleted in US-013 — all code lives in packages/
34
+ - injectIntegration resolves integration files via: path.resolve(__dirname, "../../integrations", cms, "files")
35
+ - injectLayer resolves layer files via: path.resolve(__dirname, "../../templates", layer)
36
+ - CMS_MERGERS imports from ../../integrations/sanity/mergers/ (not co-located ./layout-merger.js)
37
+ - tiged fully removed from all packages (no longer needed anywhere)
38
+ - CMS_CONFIG no longer has `branch` field (files are local, no remote clone needed)
39
+ - Templates are standalone: fs.copy from create-basement-app/templates/{type}/ directly to target dir (no tiged, no layer overlay)
40
+ - _gitignore must be renamed to .gitignore after copying template to target dir
41
+ - Root package.json is now "basement-starter-cli" with private:true, no bin, no runtime deps — only workspaces + devDeps (biome, changesets)
42
+ - dotenv removed from CLI (was only for dev .env loading from source tree)
43
+ - packages/cli has workspace:* dep on @basementstudio/create-basement-app
44
+ - packages/create-basement-app has "main": "src/index.js"
12
45
 
13
46
  ---
14
47
 
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
48
+ ## 2026-02-11 - US-001
49
+ - What was implemented: Monorepo skeleton with bun workspaces
50
+ - Files changed:
51
+ - package.json (added "workspaces": ["packages/*"])
52
+ - packages/cli/package.json (new)
53
+ - packages/create-basement-app/package.json (new)
54
+ - packages/create-basement-app/templates/ (new dir)
55
+ - packages/create-basement-app/integrations/ (new dir)
56
+ - packages/create-basement-app/template-hooks/ (new dir)
57
+ - packages/create-basement-app/plugins/ (new dir)
21
58
  - **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
59
+ - biome.json includes list doesn't cover packages/ - will need updating when code moves there
60
+ - bun workspaces use "workspaces" field in root package.json (same as npm/yarn)
61
+ - Empty subdirectories (templates, integrations, etc.) are created but won't be git-tracked until they contain files
25
62
  ---
26
63
 
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/
64
+ ## 2026-02-11 - US-002
65
+ - What was implemented: Moved CLI code (bin/index.js, src/commands/*) to packages/cli/
66
+ - Files changed:
67
+ - packages/cli/bin/index.js (new - copied from bin/index.js, chalk replaced with picocolors)
68
+ - packages/cli/src/commands/create.js (new - copied from src/commands/create.js, merger paths updated)
69
+ - packages/cli/src/commands/add-integration.js (new - copied, merger paths updated)
70
+ - packages/cli/src/commands/worktree.js (new - copied as-is, no external imports to update)
71
+ - packages/cli/src/commands/setup-sanity.js (new - copied as-is)
72
+ - packages/cli/package.json (updated with runtime dependencies)
73
+ - biome.json (added packages/** to includes)
74
+ - package.json (fixed formatting for biome compliance)
33
75
  - **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
76
+ - chalk.bold.hex("#FF4D00") has no picocolors equivalent - use ANSI escape codes: `\x1b[1m\x1b[38;2;255;77;0m${text}\x1b[0m`
77
+ - Static imports in ESM fail at module load time even for --help - merger imports in create.js are mostly dynamic (await import) except getLayerConfig which is static
78
+ - For intermediate stories, import paths to not-yet-moved modules use `../../../../src/mergers/` - these will be cleaned up in US-003
79
+ - `node --check file.js` validates syntax without executing (useful for ESM files that would fail on missing deps)
80
+ - dotenv path in create.js uses __dirname-relative resolution - needs updating when file moves
81
+ ---
82
+
83
+ ## 2026-02-11 - US-003
84
+ - What was implemented: Moved all merger code to packages/create-basement-app/src/mergers/
85
+ - Files changed:
86
+ - packages/create-basement-app/src/mergers/index.js (new - copied from src/mergers/index.js)
87
+ - packages/create-basement-app/src/mergers/config.js (new - copied from src/mergers/config.js)
88
+ - packages/create-basement-app/src/mergers/layout-merger.js (new - copied from src/mergers/layout-merger.js)
89
+ - packages/create-basement-app/src/mergers/sitemap-merger.js (new - copied from src/mergers/sitemap-merger.js)
90
+ - packages/create-basement-app/src/mergers/check-integration-merger.js (new - copied from src/mergers/check-integration-merger.js)
91
+ - packages/create-basement-app/src/index.js (new - barrel re-export of public API)
92
+ - packages/create-basement-app/package.json (added fs-extra, picocolors, tiged deps)
93
+ - packages/cli/src/commands/create.js (3 import paths updated to create-basement-app)
94
+ - packages/cli/src/commands/add-integration.js (1 import path updated to create-basement-app)
95
+ - src/mergers/next-config-merger.js (DELETED - orphaned, never in CMS_MERGERS)
47
96
  - **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
97
+ - From packages/cli/src/commands/ to packages/create-basement-app/src/mergers/ the relative path is ../../../create-basement-app/src/mergers/
98
+ - Old src/mergers/ files are preserved (not deleted) until US-013 cleanup to avoid breaking anything
99
+ - index.js barrel export pattern: re-export named exports from submodules for clean public API
100
+ - Merger code deps (fs-extra, tiged) need to be declared in create-basement-app's package.json since that's where the code now lives
101
+ - next-starter is a PRIVATE repo — tiged can't clone it. Use `gh repo clone` instead for authenticated access.
102
+ - Default template is the base for all other templates (webgl, webgpu, experiment will copy from it)
103
+ - Template cleanup: remove .tldr cache, .tldrignore; rename .gitignore to _gitignore; delete bun.lock
104
+ ---
105
+
106
+ ## 2026-02-11 - US-004
107
+ - What was implemented: Generated default template by cloning basementstudio/next-starter#main
108
+ - Files changed:
109
+ - packages/create-basement-app/templates/default/ (84 files — complete Next.js project)
110
+ - Renamed .gitignore to _gitignore (npm strips dotfiles)
111
+ - Deleted bun.lock (should not be committed in templates)
112
+ - Removed .tldr/ cache and .tldrignore (repo-specific caches)
61
113
  - **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
114
+ - basementstudio/next-starter is a private repo — `npx tiged` fails. Use `gh repo clone` with `--depth 1` for auth.
115
+ - After cloning, remove .git/ before copying to template directory
116
+ - next-starter includes .biome/plugins (Grit lint rules), .cursor/rules, .vscode, .github, .editorconfig — all part of the project template
117
+ - Template package.json has: next 16.1.4, react 19.2.4, react-dom 19.2.4, plus tailwindcss, biome, zustand, etc.
118
+ - Template includes lib/scripts/ for code generation (generate-component.ts, generate-page.ts)
64
119
  ---
65
120
 
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
121
+ ## 2026-02-11 - US-005
122
+ - What was implemented: Generated WebGL template from default template + layer overlay files
123
+ - Files changed:
124
+ - packages/create-basement-app/templates/webgl/ (87 files complete Next.js project with WebGL)
125
+ - app/page.tsx overwritten with WebGL version (imports DynamicCanvas)
126
+ - components/webgl/canvas/dynamic.tsx (new client-side dynamic loader for R3F canvas)
127
+ - components/webgl/canvas/index.tsx (new — R3F Canvas with production GL settings)
128
+ - components/webgl/components/scene/index.tsx (new — demo rotating orange cube)
129
+ - package.json updated with WebGL deps: @react-three/fiber ^9.5.0, @react-three/drei ^10.7.7, three ^0.182.0, @radix-ui/react-navigation-menu ^1.2.5, leva ^0.9.35, @types/three ^0.182.0
73
130
  - **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
131
+ - Template generation pattern: cp -r default/ {name}/, overlay files, edit package.json deps
132
+ - WebGL layer has 1 replaceFile (app/page.tsx) and 3 additivePaths (canvas + scene components)
133
+ - Dependencies are alphabetically sorted in package.json to keep diffs clean
134
+ - _gitignore already present from default template copy (no need to rename again)
135
+ - No bun.lock in templates (already cleaned in default template)
76
136
  ---
77
137
 
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
138
+ ## 2026-02-11 - US-006
139
+ - What was implemented: Generated WebGPU template from default template + alpha R3F dependencies
140
+ - Files changed:
141
+ - packages/create-basement-app/templates/webgpu/ (84 files complete Next.js project, deps-only)
142
+ - package.json updated with WebGPU deps: @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, @types/three ^0.182.0
85
143
  - **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
144
+ - WebGPU is deps-only no overlay files, simplest template generation (just copy + edit package.json)
145
+ - WebGPU uses ALPHA versions of R3F (10.0.0-alpha.2 for fiber, ^11.0.0-alpha.4 for drei) — different from webgl which uses stable versions
146
+ - File count matches default template exactly (84 files) since no components were added
88
147
  ---
89
148
 
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
149
+ ## 2026-02-11 - US-007
150
+ - What was implemented: Generated experiment template from default template + experiment layer overlay files
151
+ - Files changed:
152
+ - packages/create-basement-app/templates/experiment/ (86 files complete Next.js project with experiment nav)
153
+ - components/layout/header/index.tsx overwritten with experiment version (Radix NavigationMenu-based header with experiment links)
154
+ - components/layout/navigation-menu.tsx (new full Radix NavigationMenu component library with CVA styling)
155
+ - lib/constants.ts (new — EXPERIMENTS array with route definitions)
156
+ - package.json updated with experiment deps: @radix-ui/react-navigation-menu ^1.2.5, @react-three/fiber ^9.5.0, @react-three/drei ^10.7.7, three ^0.182.0, leva ^0.9.35, lucide-react ^0.474.0, @types/three ^0.182.0
96
157
  - **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)
158
+ - Experiment layer has 1 replaceFile (header/index.tsx) and 2 additivePaths (navigation-menu.tsx, constants.ts) different from webgl which has 1 replace + 3 additive
159
+ - class-variance-authority already exists in default template at ^0.7.1, LAYER_CONFIG declares ^0.7.0 no need to downgrade, existing version satisfies the constraint
160
+ - PRD notes said three ^0.172.0 but actual LAYER_CONFIG uses ^0.182.0 — always check the source code config, not PRD notes
161
+ - Dependencies should be alphabetically sorted in package.json devDependencies too (caught and fixed @types/three ordering)
162
+ - 86 files = 84 default + 2 additive files (navigation-menu.tsx + constants.ts). replaceFile doesn't change count.
163
+ ---
164
+
165
+ ## 2026-02-11 - US-008
166
+ - What was implemented: Moved Sanity integration files locally into create-basement-app with a unified config manifest
167
+ - Files changed:
168
+ - packages/create-basement-app/integrations/sanity/config.js (new single source of truth: deps, devDeps, scripts, additivePaths, mergeFiles)
169
+ - packages/create-basement-app/integrations/sanity/files/ (35 files complete Sanity integration: app/, components/, lib/)
170
+ - packages/create-basement-app/integrations/sanity/mergers/layout-merger.js (copied from src/mergers/)
171
+ - packages/create-basement-app/integrations/sanity/mergers/sitemap-merger.js (copied from src/mergers/)
172
+ - packages/create-basement-app/integrations/sanity/mergers/check-integration-merger.js (copied from src/mergers/)
111
173
  - **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
174
+ - Integration config pattern: export const {name}Config with name, dependencies, devDependencies, scripts, additivePaths, mergeFiles
175
+ - Sanity has 5 deps, 1 devDep, 2 scripts, 9 additivePaths, 3 mergeFiles
176
+ - additivePaths and mergeFiles were sourced from CMS_CONFIG.sanity in config.js; deps/scripts from hardcoded values in create.js lines 239-260
177
+ - PRD acceptance criteria listed @sanity/vision as a dep, but in create.js it's actually listed alongside other @sanity/* deps (version ^5.7.0)
178
+ - Mergers are COPIES (not moves) — originals in src/mergers/ stay until US-013 cleanup. US-010 will rewire imports.
115
179
  ---
180
+
181
+ ## 2026-02-11 - US-009
182
+ - What was implemented: Moved BaseHub integration, template-hooks, and plugins into packages/create-basement-app
183
+ - Files changed:
184
+ - packages/create-basement-app/integrations/basehub/config.js (new — basehubConfig with deps, additivePaths, mergeFiles)
185
+ - packages/create-basement-app/integrations/basehub/files/README.md (copied from integrations/basehub/)
186
+ - packages/create-basement-app/template-hooks/config.js (new — hooksConfig array with 4 hook entries + deps)
187
+ - packages/create-basement-app/template-hooks/use-battery.ts (copied from template-hooks/)
188
+ - packages/create-basement-app/template-hooks/use-device-perf.ts (copied from template-hooks/)
189
+ - packages/create-basement-app/template-hooks/use-intersection-observer.ts (copied from template-hooks/)
190
+ - packages/create-basement-app/template-hooks/use-media.ts (copied from template-hooks/)
191
+ - packages/create-basement-app/plugins/no-anchor-element.grit (copied from plugins/)
192
+ - packages/create-basement-app/plugins/no-unnecessary-forwardref.grit (copied from plugins/)
193
+ - packages/create-basement-app/plugins/no-relative-parent-imports.grit (copied from plugins/)
194
+ - packages/create-basement-app/plugins/README.md (copied from plugins/)
195
+ - **Learnings for future iterations:**
196
+ - BaseHub integration is minimal — only adds basehub: ^3.0.0 as a dependency, no scripts, no mergeFiles, one additivePath
197
+ - Hook dependency discovery: use-battery imports lodash-es/isEqual; use-device-perf imports detect-gpu, react-device-detect, zustand; use-intersection-observer and use-media have zero npm deps
198
+ - use-device-perf also has an internal dependency on use-battery (imports ./use-battery) — this is a file-level dep, not an npm dep
199
+ - Hooks are currently just copied as files — create.js does NOT inject hook npm deps into the target project's package.json (that will need US-011 to wire up)
200
+ - The config.js pattern for hooks mirrors the integration config pattern: name, file, dependencies, devDependencies
201
+ ---
202
+
203
+ ## 2026-02-11 - US-010
204
+ - What was implemented: Updated merger paths to use local create-basement-app locations instead of remote GitHub clones
205
+ - Files changed:
206
+ - packages/create-basement-app/src/mergers/index.js (replaced tiged remote clone with local fs.copy from integrations/{cms}/files/; updated injectLayer path from ../../layers to ../../templates; removed os and tiged imports)
207
+ - packages/create-basement-app/src/mergers/config.js (removed `branch` field from CMS_CONFIG for both sanity and basehub)
208
+ - packages/cli/src/commands/create.js (added imports for sanityConfig/basehubConfig; replaced hardcoded CMS deps/devDeps/scripts with config manifest reads)
209
+ - packages/cli/src/commands/add-integration.js (added imports for sanityConfig/basehubConfig; replaced hardcoded addDependencies function with config-driven approach)
210
+ - packages/create-basement-app/package.json (removed tiged dependency)
211
+ - CMS_MERGERS updated to import from ../../integrations/sanity/mergers/ instead of co-located ./layout-merger.js
212
+ - **Learnings for future iterations:**
213
+ - injectIntegration path resolution: path.resolve(__dirname, "../../integrations", cms, "files") from src/mergers/index.js
214
+ - injectLayer path resolution: path.resolve(__dirname, "../../templates", layer) from src/mergers/index.js
215
+ - CMS deps are now config-driven: import { sanityConfig } from "../../../create-basement-app/integrations/sanity/config.js"
216
+ - The addDependencies function in add-integration.js was duplicating deps from create.js — both now use config manifests
217
+ - tiged is still needed in packages/cli/ (for template download from GitHub in create.js) but NOT in create-basement-app
218
+ - With this change, adding a new integration only requires: 1) files in integrations/{name}/files/, 2) config.js with deps, 3) optional mergers
219
+ ---
220
+
221
+ ## 2026-02-12 - US-011
222
+ - What was implemented: Centralized all dependency configs — zero hardcoded version strings remain in create.js
223
+ - Files changed:
224
+ - packages/create-basement-app/src/configs/animations.js (new — ANIMATION_CONFIG with gsap and motion deps + getAnimationConfig helper)
225
+ - packages/create-basement-app/src/index.js (added export for getAnimationConfig and ANIMATION_CONFIG)
226
+ - packages/cli/src/commands/create.js (replaced hardcoded animation deps with config; added hooksConfig import; dynamic template discovery; hook dep injection into package.json; updated hooks source path to create-basement-app)
227
+ - package.json (removed unused inquirer and chalk from root dependencies)
228
+ - **Learnings for future iterations:**
229
+ - Animation config follows same pattern as CMS config: ANIMATION_CONFIG object + getAnimationConfig(name) helper
230
+ - Hook dependency injection is a NEW behavior: previously hooks were copied as files but their npm deps were NOT injected. Now hooksConfig is used to inject deps during hydration step.
231
+ - Template prompt choices are dynamically generated from fs.readdir of templates/ dir, with a templateLabels lookup for friendly names
232
+ - dotenv is kept in root deps (not just devDeps) because create.js loads .env at runtime for CLI dev — could be moved in US-013 cleanup
233
+ - Biome auto-fix reorders imports alphabetically and formats long conditionals across multiple lines — run `biome check --write` after edits
234
+ - Hook source path: from packages/cli/src/commands/ to create-basement-app/template-hooks/ is ../../../create-basement-app/template-hooks
235
+ ---
236
+
237
+ ## 2026-02-12 - US-012
238
+ - What was implemented: Replaced tiged remote clone with local fs.copy from standalone templates
239
+ - Files changed:
240
+ - packages/cli/src/commands/create.js (replaced tiged clone with fs.copy; removed layer injection step 3.2; removed layer dep injection from hydration; added _gitignore rename; updated error messages)
241
+ - packages/cli/package.json (removed tiged dependency)
242
+ - **Learnings for future iterations:**
243
+ - Templates are now fully standalone — no more two-step "download base + overlay layer" process
244
+ - _gitignore -> .gitignore rename is needed because npm strips dotfiles from published packages
245
+ - Layer deps no longer need injection during hydration — they're already in each template's package.json
246
+ - tiged is no longer needed anywhere in packages/ (still referenced in old root src/ which will be cleaned in US-013)
247
+ - The template copy is instant (no network call), making CLI significantly faster
248
+ - Template path resolution from create.js: path.resolve(__dirname, "../../../create-basement-app/templates", type)
249
+ ---
250
+
251
+ ## 2026-02-12 - US-013
252
+ - What was implemented: Deleted all old root directories and cleaned up dead code/dependencies
253
+ - Files changed:
254
+ - DELETED: bin/ (262 lines — old CLI entry point, now in packages/cli/bin/)
255
+ - DELETED: src/ (4 commands + 5 mergers — all moved to packages/)
256
+ - DELETED: layers/ (3 layer directories — content in packages/create-basement-app/templates/)
257
+ - DELETED: integrations/ (sanity + basehub — content in packages/create-basement-app/integrations/)
258
+ - DELETED: template-hooks/ (4 hooks — content in packages/create-basement-app/template-hooks/)
259
+ - DELETED: plugins/ (3 grit rules + README — content in packages/create-basement-app/plugins/)
260
+ - package.json (cleaned: renamed to basement-starter-cli, added private:true, removed bin field, removed test script, removed all runtime deps)
261
+ - packages/cli/package.json (removed dotenv dep, added workspace:* dep on create-basement-app)
262
+ - packages/cli/src/commands/create.js (removed dotenv import and config call)
263
+ - packages/create-basement-app/package.json (removed unused picocolors dep, added "main": "src/index.js")
264
+ - bun.lock (regenerated — 4 packages installed, 8 removed)
265
+ - **Learnings for future iterations:**
266
+ - 67 files changed, 8605 lines deleted — the bulk of this story is deletions
267
+ - Root package.json should be private:true and have no bin/deps (those belong in workspace packages)
268
+ - dotenv was loading .env from CLI source tree for dev convenience — not needed in production, removed
269
+ - picocolors was declared in create-basement-app but never imported — always verify deps are actually used
270
+ - workspace:* protocol links packages without publishing — bun resolves it to the local package
271
+ - After cleanup, the project root only has: package.json, biome.json, bun.lock, .changeset/, .github/, packages/
272
+ ---
273
+
274
+ ## 2026-02-12 - US-014
275
+ - What was implemented: Updated changeset config, CI workflow, CLAUDE.md, and README.md for workspace-aware publishing
276
+ - Files changed:
277
+ - .github/workflows/release.yml (added NPM_TOKEN and NODE_AUTH_TOKEN env vars for npm publishing)
278
+ - CLAUDE.md (rewrote Architecture section for monorepo, updated CLI flow, integration sources, plugin paths, dev commands)
279
+ - README.md (added Project Structure section with monorepo layout and package table)
280
+ - **Learnings for future iterations:**
281
+ - Changeset config was already workspace-ready — `access: "public"` and `updateInternalDependencies: "patch"` were set from the original single-package setup
282
+ - CI release workflow needs both GITHUB_TOKEN (for PR creation) and NPM_TOKEN/NODE_AUTH_TOKEN (for npm publishing) — the original only had GITHUB_TOKEN
283
+ - `changesets/action@v1` handles workspace publishing automatically — `changeset publish` publishes all packages with pending version bumps
284
+ - `workspace:*` is resolved at publish time — changesets replace it with the actual semver version in the published package.json
285
+ - Biome lint fails on this repo due to nested root configs in templates/ — this is pre-existing and not related to any story changes
286
+ - CLAUDE.md Architecture section should match actual directory structure — the old section described layers/, integrations/, template-hooks/ at root which no longer exist
287
+ ---
288
+
289
+ ## 2026-02-12 - US-015
290
+ - What was implemented: End-to-end verification of all 4 template types
291
+ - Verification results:
292
+ - npm link from packages/cli/ succeeded
293
+ - basement -c /tmp/test-default -d -no-cms -no-animation -claude -no-hooks — SUCCESS
294
+ - basement -c /tmp/test-webgl -webgl -no-cms -no-animation -claude -no-hooks — SUCCESS
295
+ - basement -c /tmp/test-webgpu -webgpu -no-cms -no-animation -claude -no-hooks — SUCCESS
296
+ - basement -c /tmp/test-experiment -experiment -no-cms -no-animation -claude -no-hooks — SUCCESS
297
+ - 26/26 structural checks pass (deps, .gitignore rename, template-specific files/dirs)
298
+ - bun install succeeds on generated projects (392 packages, 5.25s)
299
+ - **Learnings:**
300
+ - All templates produce valid Next.js projects with react@19.2.4, next@16.1.4, react-dom@19.2.4
301
+ - _gitignore -> .gitignore rename works correctly for all templates
302
+ - Local template copy is instant (no network call) — significantly faster than the old tiged-based approach
303
+ - WebGL template includes components/webgl/ with canvas/ and components/ subdirectories
304
+ - WebGPU template is deps-only (alpha R3F versions, no extra component files)
305
+ - Experiment template includes navigation-menu.tsx and lib/constants.ts
306
+
307
+ ## RESTRUCTURE COMPLETE — 15/15 stories pass
308
+ ---
309
+
package/tasks/ralph.sh ADDED
@@ -0,0 +1,113 @@
1
+ #!/bin/bash
2
+ # Ralph Wiggum - Long-running AI agent loop
3
+ # Usage: ./ralph.sh [--tool amp|claude] [max_iterations]
4
+
5
+ set -e
6
+
7
+ # Parse arguments
8
+ TOOL="amp" # Default to amp for backwards compatibility
9
+ MAX_ITERATIONS=10
10
+
11
+ while [[ $# -gt 0 ]]; do
12
+ case $1 in
13
+ --tool)
14
+ TOOL="$2"
15
+ shift 2
16
+ ;;
17
+ --tool=*)
18
+ TOOL="${1#*=}"
19
+ shift
20
+ ;;
21
+ *)
22
+ # Assume it's max_iterations if it's a number
23
+ if [[ "$1" =~ ^[0-9]+$ ]]; then
24
+ MAX_ITERATIONS="$1"
25
+ fi
26
+ shift
27
+ ;;
28
+ esac
29
+ done
30
+
31
+ # Validate tool choice
32
+ if [[ "$TOOL" != "amp" && "$TOOL" != "claude" ]]; then
33
+ echo "Error: Invalid tool '$TOOL'. Must be 'amp' or 'claude'."
34
+ exit 1
35
+ fi
36
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
37
+ PRD_FILE="$SCRIPT_DIR/prd.json"
38
+ PROGRESS_FILE="$SCRIPT_DIR/progress.txt"
39
+ ARCHIVE_DIR="$SCRIPT_DIR/archive"
40
+ LAST_BRANCH_FILE="$SCRIPT_DIR/.last-branch"
41
+
42
+ # Archive previous run if branch changed
43
+ if [ -f "$PRD_FILE" ] && [ -f "$LAST_BRANCH_FILE" ]; then
44
+ CURRENT_BRANCH=$(jq -r '.branchName // empty' "$PRD_FILE" 2>/dev/null || echo "")
45
+ LAST_BRANCH=$(cat "$LAST_BRANCH_FILE" 2>/dev/null || echo "")
46
+
47
+ if [ -n "$CURRENT_BRANCH" ] && [ -n "$LAST_BRANCH" ] && [ "$CURRENT_BRANCH" != "$LAST_BRANCH" ]; then
48
+ # Archive the previous run
49
+ DATE=$(date +%Y-%m-%d)
50
+ # Strip "ralph/" prefix from branch name for folder
51
+ FOLDER_NAME=$(echo "$LAST_BRANCH" | sed 's|^ralph/||')
52
+ ARCHIVE_FOLDER="$ARCHIVE_DIR/$DATE-$FOLDER_NAME"
53
+
54
+ echo "Archiving previous run: $LAST_BRANCH"
55
+ mkdir -p "$ARCHIVE_FOLDER"
56
+ [ -f "$PRD_FILE" ] && cp "$PRD_FILE" "$ARCHIVE_FOLDER/"
57
+ [ -f "$PROGRESS_FILE" ] && cp "$PROGRESS_FILE" "$ARCHIVE_FOLDER/"
58
+ echo " Archived to: $ARCHIVE_FOLDER"
59
+
60
+ # Reset progress file for new run
61
+ echo "# Ralph Progress Log" > "$PROGRESS_FILE"
62
+ echo "Started: $(date)" >> "$PROGRESS_FILE"
63
+ echo "---" >> "$PROGRESS_FILE"
64
+ fi
65
+ fi
66
+
67
+ # Track current branch
68
+ if [ -f "$PRD_FILE" ]; then
69
+ CURRENT_BRANCH=$(jq -r '.branchName // empty' "$PRD_FILE" 2>/dev/null || echo "")
70
+ if [ -n "$CURRENT_BRANCH" ]; then
71
+ echo "$CURRENT_BRANCH" > "$LAST_BRANCH_FILE"
72
+ fi
73
+ fi
74
+
75
+ # Initialize progress file if it doesn't exist
76
+ if [ ! -f "$PROGRESS_FILE" ]; then
77
+ echo "# Ralph Progress Log" > "$PROGRESS_FILE"
78
+ echo "Started: $(date)" >> "$PROGRESS_FILE"
79
+ echo "---" >> "$PROGRESS_FILE"
80
+ fi
81
+
82
+ echo "Starting Ralph - Tool: $TOOL - Max iterations: $MAX_ITERATIONS"
83
+
84
+ for i in $(seq 1 $MAX_ITERATIONS); do
85
+ echo ""
86
+ echo "==============================================================="
87
+ echo " Ralph Iteration $i of $MAX_ITERATIONS ($TOOL)"
88
+ echo "==============================================================="
89
+
90
+ # Run the selected tool with the ralph prompt
91
+ if [[ "$TOOL" == "amp" ]]; then
92
+ OUTPUT=$(cat "$SCRIPT_DIR/prompt.md" | amp --dangerously-allow-all 2>&1 | tee /dev/stderr) || true
93
+ else
94
+ # Claude Code: use --dangerously-skip-permissions for autonomous operation, --print for output
95
+ OUTPUT=$(claude --dangerously-skip-permissions --print < "$SCRIPT_DIR/CLAUDE.md" 2>&1 | tee /dev/stderr) || true
96
+ fi
97
+
98
+ # Check for completion signal
99
+ if echo "$OUTPUT" | grep -q "<promise>COMPLETE</promise>"; then
100
+ echo ""
101
+ echo "Ralph completed all tasks!"
102
+ echo "Completed at iteration $i of $MAX_ITERATIONS"
103
+ exit 0
104
+ fi
105
+
106
+ echo "Iteration $i complete. Continuing..."
107
+ sleep 2
108
+ done
109
+
110
+ echo ""
111
+ echo "Ralph reached max iterations ($MAX_ITERATIONS) without completing all tasks."
112
+ echo "Check $PROGRESS_FILE for status."
113
+ exit 1
@@ -1,58 +0,0 @@
1
- "use client";
2
-
3
- import { usePathname } from "next/navigation";
4
- import { Link } from "@/components/ui/link";
5
- import EXPERIMENTS from "@/lib/constants";
6
- import { cn } from "@/lib/styles/cn";
7
- import {
8
- NavigationMenu,
9
- NavigationMenuContent,
10
- NavigationMenuItem,
11
- NavigationMenuLink,
12
- NavigationMenuList,
13
- NavigationMenuTrigger,
14
- } from "../navigation-menu";
15
-
16
- export const Header = () => {
17
- const pathname = usePathname();
18
-
19
- return (
20
- <nav className="fixed top-0 z-50 w-full py-2">
21
- <div className="mx-auto flex items-center justify-between px-4">
22
- <Link href="/" className="flex items-center gap-2 text-xl font-bold">
23
- Basement Experiments Starter
24
- </Link>
25
- <NavigationMenu>
26
- <NavigationMenuList>
27
- <NavigationMenuItem>
28
- <NavigationMenuTrigger className="text-sm font-medium px-8 py-6">
29
- Experiments
30
- </NavigationMenuTrigger>
31
- <NavigationMenuContent>
32
- <ul className="grid w-48 p-2 gap-1 bg-indigo-950/70 backdrop-blur-3xl text-white">
33
- {EXPERIMENTS.map((experiment) => (
34
- <li key={experiment.path}>
35
- <NavigationMenuLink asChild>
36
- <Link
37
- href={experiment.path}
38
- className={cn(
39
- "block px-2 py-2 text-sm transition-colors duration-200 rounded-sm font-medium",
40
- pathname === experiment.path
41
- ? "bg-purple-600 text-white"
42
- : "text-white hover:bg-purple-500/20",
43
- )}
44
- >
45
- {experiment.name}
46
- </Link>
47
- </NavigationMenuLink>
48
- </li>
49
- ))}
50
- </ul>
51
- </NavigationMenuContent>
52
- </NavigationMenuItem>
53
- </NavigationMenuList>
54
- </NavigationMenu>
55
- </div>
56
- </nav>
57
- );
58
- };