bsmnt 0.1.2 → 0.1.3
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.
- package/package.json +7 -2
- package/.changeset/README.md +0 -10
- package/.changeset/config.json +0 -16
- package/.cursor/rules/README.md +0 -184
- package/.cursor/rules/architecture.mdc +0 -437
- package/.cursor/rules/components.mdc +0 -436
- package/.cursor/rules/integrations.mdc +0 -447
- package/.cursor/rules/main.mdc +0 -278
- package/.cursor/rules/styling.mdc +0 -433
- package/.github/PULL_REQUEST_TEMPLATE.md +0 -14
- package/.github/workflows/.gitkeep +0 -0
- package/.github/workflows/ci.yml +0 -37
- package/.github/workflows/release.yml +0 -56
- package/.tldr/cache/call_graph.json +0 -7
- package/.tldr/languages.json +0 -6
- package/.tldr/status +0 -1
- package/.tldrignore +0 -84
- package/.vscode/extensions.json +0 -20
- package/.vscode/settings.json +0 -98
- package/CHANGELOG.md +0 -68
- package/CLAUDE.md +0 -156
- package/biome.json +0 -45
- package/bun.lock +0 -496
- package/changelog/04-02-26.md +0 -86
- package/changelog/05-02-26.md +0 -101
- package/changelog/09-02-26.md +0 -83
- package/docs/architecture.drawio +0 -250
- package/docs/architecture.mermaid +0 -85
- package/docs/fix-studio-hydration.md +0 -46
- package/docs/plans/2026-01-29-sanity-smart-merge-design.md +0 -196
- package/docs/plans/2026-01-29-sanity-smart-merge-implementation.md +0 -695
- package/docs/sanity-setup-steps.md +0 -199
- package/packages/cli/package.json +0 -16
- package/tasks/.last-branch +0 -1
- package/tasks/CLAUDE.md +0 -104
- package/tasks/archive/2026-02-09-next-starter-dynamic-layers/prd.json +0 -153
- package/tasks/archive/2026-02-09-next-starter-dynamic-layers/progress.txt +0 -115
- package/tasks/prd-next-starter-dynamic-layers.md +0 -184
- package/tasks/prd-project-restructure.md +0 -375
- package/tasks/prd.json +0 -289
- package/tasks/progress.txt +0 -309
- package/tasks/ralph.sh +0 -113
|
File without changes
|
package/.github/workflows/ci.yml
DELETED
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
name: CI
|
|
2
|
-
|
|
3
|
-
on:
|
|
4
|
-
pull_request:
|
|
5
|
-
branches:
|
|
6
|
-
- main
|
|
7
|
-
push:
|
|
8
|
-
branches:
|
|
9
|
-
- main
|
|
10
|
-
|
|
11
|
-
jobs:
|
|
12
|
-
validate:
|
|
13
|
-
runs-on: ubuntu-latest
|
|
14
|
-
|
|
15
|
-
steps:
|
|
16
|
-
- name: Checkout
|
|
17
|
-
uses: actions/checkout@v4
|
|
18
|
-
with:
|
|
19
|
-
fetch-depth: 0
|
|
20
|
-
|
|
21
|
-
- name: Setup Bun
|
|
22
|
-
uses: oven-sh/setup-bun@v2
|
|
23
|
-
with:
|
|
24
|
-
bun-version: latest
|
|
25
|
-
|
|
26
|
-
- name: Install dependencies
|
|
27
|
-
run: bun install --frozen-lockfile
|
|
28
|
-
|
|
29
|
-
- name: Type check
|
|
30
|
-
run: bun run check
|
|
31
|
-
|
|
32
|
-
- name: Build
|
|
33
|
-
run: bun run build
|
|
34
|
-
|
|
35
|
-
- name: Ensure changeset exists for PR changes
|
|
36
|
-
if: github.event_name == 'pull_request'
|
|
37
|
-
run: bunx changeset status --since=origin/${{ github.base_ref }}
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
name: Version and Release
|
|
2
|
-
|
|
3
|
-
on:
|
|
4
|
-
push:
|
|
5
|
-
branches:
|
|
6
|
-
- main
|
|
7
|
-
workflow_dispatch:
|
|
8
|
-
|
|
9
|
-
permissions:
|
|
10
|
-
contents: write
|
|
11
|
-
pull-requests: write
|
|
12
|
-
id-token: write
|
|
13
|
-
|
|
14
|
-
jobs:
|
|
15
|
-
release:
|
|
16
|
-
runs-on: ubuntu-latest
|
|
17
|
-
|
|
18
|
-
steps:
|
|
19
|
-
- name: Checkout
|
|
20
|
-
uses: actions/checkout@v4
|
|
21
|
-
with:
|
|
22
|
-
fetch-depth: 0
|
|
23
|
-
|
|
24
|
-
- name: Setup Bun
|
|
25
|
-
uses: oven-sh/setup-bun@v2
|
|
26
|
-
with:
|
|
27
|
-
bun-version: latest
|
|
28
|
-
|
|
29
|
-
- name: Setup Node for npm publishing
|
|
30
|
-
uses: actions/setup-node@v4
|
|
31
|
-
with:
|
|
32
|
-
node-version: 24
|
|
33
|
-
|
|
34
|
-
- name: Use npm 11.6.2
|
|
35
|
-
run: npm i -g npm@11.6.2
|
|
36
|
-
|
|
37
|
-
- name: Install dependencies
|
|
38
|
-
run: bun install --frozen-lockfile
|
|
39
|
-
|
|
40
|
-
- name: Configure npm for publishing
|
|
41
|
-
run: |
|
|
42
|
-
cat > ~/.npmrc <<'EOF'
|
|
43
|
-
registry=https://registry.npmjs.org/
|
|
44
|
-
access=public
|
|
45
|
-
EOF
|
|
46
|
-
|
|
47
|
-
- name: Version packages or publish
|
|
48
|
-
uses: changesets/action@v1
|
|
49
|
-
with:
|
|
50
|
-
version: bun run version-packages
|
|
51
|
-
publish: bun run release
|
|
52
|
-
createGithubReleases: true
|
|
53
|
-
env:
|
|
54
|
-
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
55
|
-
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
|
|
56
|
-
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
|
package/.tldr/languages.json
DELETED
package/.tldr/status
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
stopped
|
package/.tldrignore
DELETED
|
@@ -1,84 +0,0 @@
|
|
|
1
|
-
# TLDR ignore patterns (gitignore syntax)
|
|
2
|
-
# Auto-generated - review and customize for your project
|
|
3
|
-
# Docs: https://git-scm.com/docs/gitignore
|
|
4
|
-
|
|
5
|
-
# ===================
|
|
6
|
-
# Dependencies
|
|
7
|
-
# ===================
|
|
8
|
-
node_modules/
|
|
9
|
-
.venv/
|
|
10
|
-
venv/
|
|
11
|
-
env/
|
|
12
|
-
__pycache__/
|
|
13
|
-
.tox/
|
|
14
|
-
.nox/
|
|
15
|
-
.pytest_cache/
|
|
16
|
-
.mypy_cache/
|
|
17
|
-
.ruff_cache/
|
|
18
|
-
vendor/
|
|
19
|
-
Pods/
|
|
20
|
-
|
|
21
|
-
# ===================
|
|
22
|
-
# Build outputs
|
|
23
|
-
# ===================
|
|
24
|
-
dist/
|
|
25
|
-
build/
|
|
26
|
-
out/
|
|
27
|
-
target/
|
|
28
|
-
*.egg-info/
|
|
29
|
-
*.whl
|
|
30
|
-
*.pyc
|
|
31
|
-
*.pyo
|
|
32
|
-
|
|
33
|
-
# ===================
|
|
34
|
-
# Binary/large files
|
|
35
|
-
# ===================
|
|
36
|
-
*.so
|
|
37
|
-
*.dylib
|
|
38
|
-
*.dll
|
|
39
|
-
*.exe
|
|
40
|
-
*.bin
|
|
41
|
-
*.o
|
|
42
|
-
*.a
|
|
43
|
-
*.lib
|
|
44
|
-
|
|
45
|
-
# ===================
|
|
46
|
-
# IDE/editors
|
|
47
|
-
# ===================
|
|
48
|
-
.idea/
|
|
49
|
-
.vscode/
|
|
50
|
-
*.swp
|
|
51
|
-
*.swo
|
|
52
|
-
*~
|
|
53
|
-
|
|
54
|
-
# ===================
|
|
55
|
-
# Security (always exclude)
|
|
56
|
-
# ===================
|
|
57
|
-
.env
|
|
58
|
-
.env.*
|
|
59
|
-
*.pem
|
|
60
|
-
*.key
|
|
61
|
-
*.p12
|
|
62
|
-
*.pfx
|
|
63
|
-
credentials.*
|
|
64
|
-
secrets.*
|
|
65
|
-
|
|
66
|
-
# ===================
|
|
67
|
-
# Version control
|
|
68
|
-
# ===================
|
|
69
|
-
.git/
|
|
70
|
-
.hg/
|
|
71
|
-
.svn/
|
|
72
|
-
|
|
73
|
-
# ===================
|
|
74
|
-
# OS files
|
|
75
|
-
# ===================
|
|
76
|
-
.DS_Store
|
|
77
|
-
Thumbs.db
|
|
78
|
-
|
|
79
|
-
# ===================
|
|
80
|
-
# Project-specific
|
|
81
|
-
# Add your custom patterns below
|
|
82
|
-
# ===================
|
|
83
|
-
# large_test_fixtures/
|
|
84
|
-
# data/
|
package/.vscode/extensions.json
DELETED
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"recommendations": [
|
|
3
|
-
// Formatting & Linting
|
|
4
|
-
"biomejs.biome",
|
|
5
|
-
|
|
6
|
-
// CSS & Styling
|
|
7
|
-
"bradlc.vscode-tailwindcss",
|
|
8
|
-
"csstools.postcss",
|
|
9
|
-
|
|
10
|
-
// GraphQL (Shopify, etc.)
|
|
11
|
-
"graphql.vscode-graphql-syntax",
|
|
12
|
-
|
|
13
|
-
// Sanity CMS (GROQ syntax + validation)
|
|
14
|
-
"sanity-io.vscode-sanity",
|
|
15
|
-
|
|
16
|
-
// DX Enhancements
|
|
17
|
-
"yoavbls.pretty-ts-errors",
|
|
18
|
-
"waderyan.gitblame"
|
|
19
|
-
]
|
|
20
|
-
}
|
package/.vscode/settings.json
DELETED
|
@@ -1,98 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
// Formatting
|
|
3
|
-
"editor.formatOnSave": true,
|
|
4
|
-
"editor.defaultFormatter": "biomejs.biome",
|
|
5
|
-
"editor.codeActionsOnSave": {
|
|
6
|
-
"source.fixAll.biome": "always",
|
|
7
|
-
"source.organizeImports.biome": "always"
|
|
8
|
-
},
|
|
9
|
-
|
|
10
|
-
// TypeScript
|
|
11
|
-
"typescript.suggest.autoImports": true,
|
|
12
|
-
"typescript.preferences.importModuleSpecifier": "non-relative",
|
|
13
|
-
"typescript.tsdk": "node_modules/typescript/lib",
|
|
14
|
-
// "typescript.experimental.useTsgo": true, // Disabled: tsgo doesn't support Next.js plugin
|
|
15
|
-
"javascript.suggest.autoImports": true,
|
|
16
|
-
|
|
17
|
-
// Editor labels (fixed for .tsx files)
|
|
18
|
-
"workbench.editor.customLabels.patterns": {
|
|
19
|
-
"**/app/**/page.tsx": "${dirname(1)}/${dirname} <page>",
|
|
20
|
-
"**/app/**/layout.tsx": "${dirname(1)}/${dirname} <layout>",
|
|
21
|
-
"**/app/api/**/route.ts": "${dirname(1)}/${dirname} <route>",
|
|
22
|
-
"**/components/**/index.tsx": "${dirname} <component>"
|
|
23
|
-
},
|
|
24
|
-
|
|
25
|
-
// File associations
|
|
26
|
-
"files.associations": {
|
|
27
|
-
"*.json": "jsonc"
|
|
28
|
-
},
|
|
29
|
-
|
|
30
|
-
// CSS (Tailwind v4)
|
|
31
|
-
"css.lint.validProperties": ["user-drag"],
|
|
32
|
-
"css.lint.unknownAtRules": "ignore",
|
|
33
|
-
"tailwindCSS.experimental.configFile": "./lib/styles/css/tailwind.css",
|
|
34
|
-
"tailwindCSS.includeLanguages": {
|
|
35
|
-
"typescriptreact": "html"
|
|
36
|
-
},
|
|
37
|
-
"tailwindCSS.classFunctions": ["cn", "cva", "twMerge", "cx"],
|
|
38
|
-
"tailwindCSS.classAttributes": [
|
|
39
|
-
"class",
|
|
40
|
-
"className",
|
|
41
|
-
".*ClassName",
|
|
42
|
-
".*Styles"
|
|
43
|
-
],
|
|
44
|
-
"tailwindCSS.experimental.classRegex": [
|
|
45
|
-
["cn\\(([^)]*)\\)", "(?:'|\"|`)([^\"'`]*)(?:'|\"|`)"],
|
|
46
|
-
["cva\\(([^)]*)\\)", "[\"'`]([^\"'`]*).*?[\"'`]"]
|
|
47
|
-
],
|
|
48
|
-
|
|
49
|
-
// Search exclusions (performance)
|
|
50
|
-
"search.exclude": {
|
|
51
|
-
"**/node_modules": true,
|
|
52
|
-
"**/.next": true,
|
|
53
|
-
"**/bun.lock": true,
|
|
54
|
-
"**/.vercel": true,
|
|
55
|
-
"**/lib/integrations/sanity/sanity.types.ts": true
|
|
56
|
-
},
|
|
57
|
-
|
|
58
|
-
// Language-specific formatters
|
|
59
|
-
"[css]": {
|
|
60
|
-
"editor.defaultFormatter": "biomejs.biome"
|
|
61
|
-
},
|
|
62
|
-
"[javascript]": {
|
|
63
|
-
"editor.defaultFormatter": "biomejs.biome"
|
|
64
|
-
},
|
|
65
|
-
"[typescript]": {
|
|
66
|
-
"editor.defaultFormatter": "biomejs.biome"
|
|
67
|
-
},
|
|
68
|
-
"[javascriptreact]": {
|
|
69
|
-
"editor.defaultFormatter": "biomejs.biome"
|
|
70
|
-
},
|
|
71
|
-
"[typescriptreact]": {
|
|
72
|
-
"editor.defaultFormatter": "biomejs.biome"
|
|
73
|
-
},
|
|
74
|
-
"[json]": {
|
|
75
|
-
"editor.defaultFormatter": "biomejs.biome"
|
|
76
|
-
},
|
|
77
|
-
"[jsonc]": {
|
|
78
|
-
"editor.defaultFormatter": "biomejs.biome"
|
|
79
|
-
},
|
|
80
|
-
|
|
81
|
-
// General
|
|
82
|
-
"files.eol": "\n",
|
|
83
|
-
"workbench.editorAssociations": {
|
|
84
|
-
"*.svg": "default"
|
|
85
|
-
},
|
|
86
|
-
"colorize.languages": [
|
|
87
|
-
"javascript",
|
|
88
|
-
"typescript",
|
|
89
|
-
"css",
|
|
90
|
-
"scss",
|
|
91
|
-
"less",
|
|
92
|
-
"html",
|
|
93
|
-
"json",
|
|
94
|
-
"yaml",
|
|
95
|
-
"markdown",
|
|
96
|
-
"glsl"
|
|
97
|
-
]
|
|
98
|
-
}
|
package/CHANGELOG.md
DELETED
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
# @basementstudio/cli
|
|
2
|
-
|
|
3
|
-
## 0.1.2
|
|
4
|
-
|
|
5
|
-
### Patch Changes
|
|
6
|
-
|
|
7
|
-
- [#40](https://github.com/basementstudio/basement-cli/pull/40) [`bf969b1`](https://github.com/basementstudio/basement-cli/commit/bf969b1908fc8bfc0bcca0b1de24721c1de9c992) Thanks [@BertovDev](https://github.com/BertovDev)! - Fix bunx compatibility by aligning bin name with package name
|
|
8
|
-
|
|
9
|
-
## 0.1.1
|
|
10
|
-
|
|
11
|
-
### Patch Changes
|
|
12
|
-
|
|
13
|
-
- [#39](https://github.com/basementstudio/basement-cli/pull/39) [`43a5857`](https://github.com/basementstudio/basement-cli/commit/43a5857a33350e344494d85c70a2400ac038695c) Thanks [@BertovDev](https://github.com/BertovDev)! - Add WebGPU template support
|
|
14
|
-
|
|
15
|
-
- [#33](https://github.com/basementstudio/basement-cli/pull/33) [`9bef7ca`](https://github.com/basementstudio/basement-cli/commit/9bef7ca91ba7fa5928263c76adcc9f6bf77c3143) Thanks [@BertovDev](https://github.com/BertovDev)! - Remove BaseHub CMS integration. BaseHub was a stub that was never fully implemented. Sanity remains as the only CMS option.
|
|
16
|
-
|
|
17
|
-
- [#36](https://github.com/basementstudio/basement-cli/pull/36) [`ffa1407`](https://github.com/basementstudio/basement-cli/commit/ffa1407c299a50dbf27c4472e3e8d89bf66ed4fa) Thanks [@mustache-dev](https://github.com/mustache-dev)! - One r3f canvas for webgl-webgpu avoids redundancy
|
|
18
|
-
|
|
19
|
-
## 0.1.0
|
|
20
|
-
|
|
21
|
-
### Minor Changes
|
|
22
|
-
|
|
23
|
-
- [#29](https://github.com/basementstudio/basement-cli/pull/29) [`e30588e`](https://github.com/basementstudio/basement-cli/commit/e30588e8609835add7314cbbfc4453ca6d47c195) Thanks [@BertovDev](https://github.com/BertovDev)! - Restructure project into a bun workspaces monorepo with two packages: @basementstudio/cli and @basementstudio/create-basement-app.
|
|
24
|
-
|
|
25
|
-
Split CLI entry point and commands into packages/cli
|
|
26
|
-
|
|
27
|
-
Move template scaffolding, mergers, integrations, hooks, and plugins into packages/create-basement-app
|
|
28
|
-
|
|
29
|
-
Replace remote tiged template downloads with local standalone templates (default, webgl, webgpu, experiment)
|
|
30
|
-
|
|
31
|
-
Move Sanity and BaseHub integration files locally with declarative config manifests (config.js)
|
|
32
|
-
|
|
33
|
-
Centralize animation and hook dependency configs in create-basement-app/src/configs/
|
|
34
|
-
|
|
35
|
-
Update CI workflow and changeset config for workspace publishing
|
|
36
|
-
|
|
37
|
-
Remove old root-level bin/, src/, layers/, and dead
|
|
38
|
-
code
|
|
39
|
-
|
|
40
|
-
## 0.0.2
|
|
41
|
-
|
|
42
|
-
### Patch Changes
|
|
43
|
-
|
|
44
|
-
- [#27](https://github.com/basementstudio/basement-cli/pull/27) [`3c4844f`](https://github.com/basementstudio/basement-cli/commit/3c4844f4e8de13a7618e655badc9be96a39bd059) Thanks [@valebearzotti](https://github.com/valebearzotti)! - Test changeset to validate the release PR and publish workflow flow after 0.0.1.
|
|
45
|
-
|
|
46
|
-
## 0.0.1
|
|
47
|
-
|
|
48
|
-
### Patch Changes
|
|
49
|
-
|
|
50
|
-
- [#24](https://github.com/basementstudio/basement-cli/pull/24) [`378fa57`](https://github.com/basementstudio/basement-cli/commit/378fa579a5b4ee1ad5364090fff10d7fb3acecd6) Thanks [@valebearzotti](https://github.com/valebearzotti)! - Rename package to bsmnt and trigger first patch release to 0.0.1.
|
|
51
|
-
|
|
52
|
-
## 0.2.3
|
|
53
|
-
|
|
54
|
-
### Patch Changes
|
|
55
|
-
|
|
56
|
-
- [#22](https://github.com/basementstudio/basement-cli/pull/22) [`56ab8fe`](https://github.com/basementstudio/basement-cli/commit/56ab8fe4e1bbbfb014887719ba308af26e1a7c1c) Thanks [@valebearzotti](https://github.com/valebearzotti)! - Test changeset to trigger automated patch version bump flow.
|
|
57
|
-
|
|
58
|
-
## 0.2.2
|
|
59
|
-
|
|
60
|
-
### Patch Changes
|
|
61
|
-
|
|
62
|
-
- [#14](https://github.com/basementstudio/basement-cli/pull/14) [`c3e43db`](https://github.com/basementstudio/basement-cli/commit/c3e43db93e417b46ffc6dbe9d7120a5600a1bf08) Thanks [@valebearzotti](https://github.com/valebearzotti)! - Retry npm release after fixing trusted publisher workflow configuration.
|
|
63
|
-
|
|
64
|
-
## 0.2.1
|
|
65
|
-
|
|
66
|
-
### Patch Changes
|
|
67
|
-
|
|
68
|
-
- [#12](https://github.com/basementstudio/basement-cli/pull/12) [`9af1be7`](https://github.com/basementstudio/basement-cli/commit/9af1be7701eeea3d1843cacdce52e144954aac0d) Thanks [@valebearzotti](https://github.com/valebearzotti)! - Set up automated npm releases with Changesets and GitHub Actions.
|
package/CLAUDE.md
DELETED
|
@@ -1,156 +0,0 @@
|
|
|
1
|
-
# CLAUDE.md
|
|
2
|
-
|
|
3
|
-
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
|
|
4
|
-
|
|
5
|
-
## Project Overview
|
|
6
|
-
|
|
7
|
-
This is **basement**, a CLI tool that scaffolds Next.js projects with AI agent integration. It creates projects from templates (Default, WebGL, WebGPU, Experiment) and optionally injects CMS integrations (Sanity) and animation libraries (GSAP, Framer Motion).
|
|
8
|
-
|
|
9
|
-
## Commands
|
|
10
|
-
|
|
11
|
-
### CLI Development
|
|
12
|
-
```bash
|
|
13
|
-
cd packages/cli && npm link # Install CLI locally for testing
|
|
14
|
-
basement # Run the CLI
|
|
15
|
-
```
|
|
16
|
-
|
|
17
|
-
### Generated Project Commands
|
|
18
|
-
Projects created by this CLI use these commands:
|
|
19
|
-
```bash
|
|
20
|
-
bun dev # Start dev server with Turbopack
|
|
21
|
-
bun build # Build for production
|
|
22
|
-
bun lint # Run Biome linter
|
|
23
|
-
bun lint:fix # Auto-fix linting issues
|
|
24
|
-
bun typecheck # Type check with tsgo
|
|
25
|
-
bun generate # Scaffold components/hooks
|
|
26
|
-
bun analyze # Bundle size analysis
|
|
27
|
-
```
|
|
28
|
-
|
|
29
|
-
Sanity-specific (when Sanity CMS is selected):
|
|
30
|
-
```bash
|
|
31
|
-
bun sanity:extract # Extract Sanity schema
|
|
32
|
-
bun sanity:typegen # Generate TS types from Sanity schema
|
|
33
|
-
```
|
|
34
|
-
|
|
35
|
-
## Architecture
|
|
36
|
-
|
|
37
|
-
This project is a **bun workspaces monorepo** with two packages:
|
|
38
|
-
|
|
39
|
-
```
|
|
40
|
-
basement-starter-cli/
|
|
41
|
-
├── packages/
|
|
42
|
-
│ ├── cli/ # @basementstudio/cli
|
|
43
|
-
│ │ ├── bin/index.js # CLI entry point (basement command)
|
|
44
|
-
│ │ └── src/commands/
|
|
45
|
-
│ │ ├── create.js # Main project creation logic
|
|
46
|
-
│ │ ├── add-integration.js # Add CMS to existing projects
|
|
47
|
-
│ │ ├── worktree.js # Git worktree management
|
|
48
|
-
│ │ └── setup-sanity.js # Sanity project provisioning
|
|
49
|
-
│ └── create-basement-app/ # @basementstudio/create-basement-app
|
|
50
|
-
│ ├── src/
|
|
51
|
-
│ │ ├── index.js # Barrel exports (public API)
|
|
52
|
-
│ │ ├── mergers/ # File merge logic (layout, sitemap, config)
|
|
53
|
-
│ │ └── configs/animations.js # Animation dependency configs
|
|
54
|
-
│ ├── templates/ # Standalone project templates
|
|
55
|
-
│ │ ├── default/ # Next.js 16 + React 19 + Tailwind v4
|
|
56
|
-
│ │ ├── webgl/ # + React Three Fiber + Three.js
|
|
57
|
-
│ │ ├── webgpu/ # + R3F WebGPU renderer (alpha)
|
|
58
|
-
│ │ └── experiment/ # + Creative coding navigation UI
|
|
59
|
-
│ ├── integrations/ # CMS integration files + config manifests
|
|
60
|
-
│ │ └── sanity/ # Sanity files, mergers, config.js
|
|
61
|
-
│ ├── template-hooks/ # Reusable React hooks + config.js
|
|
62
|
-
│ └── plugins/ # Biome linting rules (Grit patterns)
|
|
63
|
-
├── .changeset/ # Changeset config for versioning
|
|
64
|
-
├── .github/workflows/release.yml # CI: publish both packages to npm
|
|
65
|
-
├── biome.json # Shared Biome config (root-level)
|
|
66
|
-
└── package.json # Workspace root (private, no runtime deps)
|
|
67
|
-
```
|
|
68
|
-
|
|
69
|
-
### CLI Flow (packages/cli/src/commands/create.js)
|
|
70
|
-
1. **Prompts**: Collect project name, template type, CMS, animation library, agent preference, hooks
|
|
71
|
-
2. **Template Copy**: Copy standalone template from `create-basement-app/templates/{type}/` (instant, no network)
|
|
72
|
-
3. **Integration Injection**: Merge CMS files from local `create-basement-app/integrations/{cms}/files/`
|
|
73
|
-
4. **Package Hydration**: Inject CMS deps, animation deps, hook deps, and scripts (all from config manifests)
|
|
74
|
-
5. **Agent Skills**: Install AI agent skills via `bunx skills add`
|
|
75
|
-
6. **Hooks**: Copy selected hooks from `create-basement-app/template-hooks/`
|
|
76
|
-
|
|
77
|
-
## Generated Project Stack
|
|
78
|
-
|
|
79
|
-
Projects created by this CLI use:
|
|
80
|
-
- **Next.js 16+** with App Router, Turbopack, Cache Components
|
|
81
|
-
- **React 19+** with React Compiler (no manual useMemo/useCallback needed)
|
|
82
|
-
- **TypeScript** strict mode with `noUncheckedIndexedAccess`
|
|
83
|
-
- **Tailwind CSS v4** (CSS-first configuration)
|
|
84
|
-
- **Biome** for linting/formatting
|
|
85
|
-
- **Zustand** for state management
|
|
86
|
-
- **Bun** as runtime/package manager
|
|
87
|
-
|
|
88
|
-
## Key Guidelines from Cursor Rules
|
|
89
|
-
|
|
90
|
-
### React Compiler
|
|
91
|
-
React Compiler is enabled - do NOT use `useMemo`, `useCallback`, or `React.memo`. Exception: use `useRef` for object instantiation to prevent infinite loops.
|
|
92
|
-
|
|
93
|
-
```tsx
|
|
94
|
-
// ❌ DON'T
|
|
95
|
-
const instance = new SomeClass()
|
|
96
|
-
|
|
97
|
-
// ✅ DO
|
|
98
|
-
const instanceRef = useRef<SomeClass | null>(null)
|
|
99
|
-
if (!instanceRef.current) instanceRef.current = new SomeClass()
|
|
100
|
-
```
|
|
101
|
-
|
|
102
|
-
### React 19 Features
|
|
103
|
-
- `<Activity />` - Defer off-screen component updates (tabs, carousels, WebGL scenes)
|
|
104
|
-
- `useEffectEvent` - Separate event logic from effect dependencies
|
|
105
|
-
- `cacheSignal()` - Auto-abort signal for server component data fetching
|
|
106
|
-
- Refs as regular props (no forwardRef needed)
|
|
107
|
-
|
|
108
|
-
### Image Components
|
|
109
|
-
- Use `@/components/ui/image` for standard images (not `next/image` directly)
|
|
110
|
-
- For WebGL: use `@/lib/webgl/components/image`
|
|
111
|
-
|
|
112
|
-
### CSS Modules
|
|
113
|
-
Import as `s`, use `cn` from `@/styles/cn` for className conditionals:
|
|
114
|
-
```tsx
|
|
115
|
-
import s from './component.module.css'
|
|
116
|
-
import { cn } from '@/styles/cn'
|
|
117
|
-
```
|
|
118
|
-
|
|
119
|
-
### Custom PostCSS Functions
|
|
120
|
-
- `tovw(pixels)` - Convert to viewport width
|
|
121
|
-
- `torem(pixels)` - Convert to rem
|
|
122
|
-
- `columns(n)` - Width based on grid columns
|
|
123
|
-
|
|
124
|
-
### Sanity CMS
|
|
125
|
-
- All files in `/lib/integrations/sanity/`
|
|
126
|
-
- Use `defineType`, `defineField`, `defineArrayMember` for schemas
|
|
127
|
-
- GROQ queries use `SCREAMING_SNAKE_CASE`, wrap with `defineQuery`
|
|
128
|
-
- Use `sanityFetch` (includes `cacheSignal()` automatically)
|
|
129
|
-
- Visual editing: add `data-sanity` attributes
|
|
130
|
-
- Nested layouts (e.g. `app/studio/layout.tsx`) must NOT render `<html>` or `<body>` tags — the root layout already provides them. Just return `children`.
|
|
131
|
-
- Studio route guard: site chrome (nav, skip link, footer) is wrapped in `<SanityStudioGuard>` — a `"use client"` component using `useSelectedLayoutSegment()` that returns `null` on `/studio` routes. This prevents layout duplication in the Sanity Presentation tool.
|
|
132
|
-
|
|
133
|
-
### Next.js Dynamic Rendering Rules
|
|
134
|
-
**NEVER call `headers()`, `cookies()`, `draftMode()`, or `searchParams` in root layouts** — these trigger "uncached data / Runtime data accessed outside `<Suspense>`" errors that block the entire page. Instead:
|
|
135
|
-
- For route detection in layouts: use `useSelectedLayoutSegment()` in a `"use client"` wrapper component
|
|
136
|
-
- For draft mode / visual editing: extract into an async server component wrapped in its own `<Suspense>` boundary (see `components/sanity/visual-editing.tsx`)
|
|
137
|
-
- Root layouts should have ZERO dynamic function calls — encapsulate all dynamic behavior in child components with proper Suspense boundaries
|
|
138
|
-
|
|
139
|
-
### Integration File Sources
|
|
140
|
-
- **Templates** (`packages/create-basement-app/templates/`) are standalone, complete Next.js projects (no layer overlay needed)
|
|
141
|
-
- **CMS integrations** (`packages/create-basement-app/integrations/`) are LOCAL files with config manifests — no remote GitHub cloning
|
|
142
|
-
- **Config manifests** (`config.js` in each integration) declare deps, scripts, additivePaths, and mergeFiles
|
|
143
|
-
- Files that need to exist in generated projects but aren't in the integration directory must be **generated inline by the merger** (e.g., `SanityStudioGuard` component is written by `layout-merger.js`)
|
|
144
|
-
|
|
145
|
-
### Debug Components
|
|
146
|
-
Always gate debug UI (not auto-removed in production):
|
|
147
|
-
```tsx
|
|
148
|
-
{process.env.NODE_ENV === 'development' && <Stats />}
|
|
149
|
-
```
|
|
150
|
-
|
|
151
|
-
## Biome Plugins
|
|
152
|
-
|
|
153
|
-
Custom linting rules in `packages/create-basement-app/plugins/`:
|
|
154
|
-
- `no-anchor-element.grit` - Enforce Next.js `<Link>` over `<a>`
|
|
155
|
-
- `no-unnecessary-forwardref.grit` - Prevent forwardRef with React 19
|
|
156
|
-
- `no-relative-parent-imports.grit` - Enforce `@/` alias imports
|
package/biome.json
DELETED
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"$schema": "https://biomejs.dev/schemas/2.3.14/schema.json",
|
|
3
|
-
"vcs": {
|
|
4
|
-
"enabled": true,
|
|
5
|
-
"clientKind": "git",
|
|
6
|
-
"useIgnoreFile": true
|
|
7
|
-
},
|
|
8
|
-
"files": {
|
|
9
|
-
"ignoreUnknown": false,
|
|
10
|
-
"includes": [
|
|
11
|
-
"bin/**",
|
|
12
|
-
"src/**",
|
|
13
|
-
"integrations/**",
|
|
14
|
-
"layers/**",
|
|
15
|
-
"template-hooks/**",
|
|
16
|
-
"plugins/**",
|
|
17
|
-
"packages/**",
|
|
18
|
-
"biome.json",
|
|
19
|
-
"package.json"
|
|
20
|
-
]
|
|
21
|
-
},
|
|
22
|
-
"formatter": {
|
|
23
|
-
"enabled": true,
|
|
24
|
-
"indentStyle": "tab"
|
|
25
|
-
},
|
|
26
|
-
"linter": {
|
|
27
|
-
"enabled": true,
|
|
28
|
-
"rules": {
|
|
29
|
-
"recommended": true
|
|
30
|
-
}
|
|
31
|
-
},
|
|
32
|
-
"javascript": {
|
|
33
|
-
"formatter": {
|
|
34
|
-
"quoteStyle": "double"
|
|
35
|
-
}
|
|
36
|
-
},
|
|
37
|
-
"assist": {
|
|
38
|
-
"enabled": true,
|
|
39
|
-
"actions": {
|
|
40
|
-
"source": {
|
|
41
|
-
"organizeImports": "on"
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
}
|