your-ai-workflow-firebase-os 1.2.34 → 1.2.36
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/README.md +83 -51
- package/dist/{ContactPopup-DSNsuxh7.js → ContactPopup-Bm3DZkEB.js} +6418 -6311
- package/dist/ContactPopup-DY0VLjCP.cjs +9 -0
- package/dist/FirebaseOS.d.ts +1 -0
- package/dist/{PhoneInputField-CThRwHdg.js → PhoneInputField-ChHip6t8.js} +1 -1
- package/dist/index.d.ts +0 -1
- package/dist/lib/AuthContext.d.ts +6 -0
- package/dist/lib/ConfigContext.d.ts +1 -0
- package/dist/renderer.cjs.js +1 -1
- package/dist/renderer.es.js +1 -1
- package/dist/vite/index.d.ts +9 -0
- package/dist/vite.cjs.js +160 -0
- package/dist/vite.es.js +371 -0
- package/dist/your-ai-workflow-firebase-os.cjs.js +320 -559
- package/dist/your-ai-workflow-firebase-os.css +1 -1
- package/dist/your-ai-workflow-firebase-os.es.js +7294 -7541
- package/package.json +17 -4
- package/scripts/patchViteConfig.js +56 -0
- package/scripts/postinstall.js +610 -244
- package/src/configs/forms/contactForm.config.ts +0 -1
- package/src/configs/forms/supportForm.config.ts +0 -1
- package/src/configs/theme.config.ts +2 -2
- package/src/index.css +6 -1
- package/src/microcomponents/registry.ts +7 -1
- package/src/pages/Home.tsx +42 -123
- package/dist/ContactPopup-Dkcz2L0f.cjs +0 -9
- package/dist/theme.config-B2y1axZf.js +0 -2
- package/dist/theme.config-B3k_BrAV.cjs +0 -1
- package/dist/theme.config-D05RQKVy.js +0 -68
- package/scripts/logoProtection.test.ts +0 -70
- package/scripts/popoverCss.test.ts +0 -46
- package/src/App.css +0 -184
- package/src/App.tsx +0 -214
- package/src/FirebaseOS.tsx +0 -102
- package/src/assets/hero.png +0 -0
- package/src/assets/react.svg +0 -1
- package/src/assets/vite.svg +0 -1
- package/src/components/AdminNotifications.test.tsx +0 -98
- package/src/components/AdminNotifications.tsx +0 -194
- package/src/components/Button.test.tsx +0 -22
- package/src/components/Button.tsx +0 -53
- package/src/components/ConfirmModal.test.tsx +0 -98
- package/src/components/ConfirmModal.tsx +0 -73
- package/src/components/ContactPopup.test.tsx +0 -98
- package/src/components/ContactPopup.tsx +0 -465
- package/src/components/CustomSelect.test.tsx +0 -47
- package/src/components/CustomSelect.tsx +0 -95
- package/src/components/DashboardNav.test.tsx +0 -98
- package/src/components/DashboardNav.tsx +0 -324
- package/src/components/Input.test.tsx +0 -33
- package/src/components/Input.tsx +0 -61
- package/src/components/JsonEditor.tsx +0 -578
- package/src/components/Navbar.test.tsx +0 -98
- package/src/components/Navbar.tsx +0 -569
- package/src/components/PhoneInputField.tsx +0 -30
- package/src/components/popoverSurface.test.ts +0 -48
- package/src/configs/forms/index.ts +0 -27
- package/src/configs/pages/admin.config.ts +0 -29
- package/src/configs/pages/contact.config.ts +0 -6
- package/src/configs/pages/home.config.ts +0 -19
- package/src/configs/pages/mem.config.ts +0 -2
- package/src/configs/pages/menuOrders.config.ts +0 -11
- package/src/configs/pages/pub.config.ts +0 -11
- package/src/configs/pages/shared.config.ts +0 -29
- package/src/configs/pages/support.config.ts +0 -7
- package/src/configs/pages/tabOrders.config.ts +0 -33
- package/src/configs/pages/user.config.ts +0 -29
- package/src/configs/registryMerge.test.ts +0 -73
- package/src/index.ts +0 -40
- package/src/lib/AuthContext.test.tsx +0 -95
- package/src/lib/AuthContext.tsx +0 -212
- package/src/lib/ConfigContext.tsx +0 -53
- package/src/lib/ThemeContext.test.tsx +0 -98
- package/src/lib/ThemeContext.tsx +0 -307
- package/src/lib/firebase.ts +0 -101
- package/src/main.tsx +0 -38
- package/src/pages/Dashboard.test.tsx +0 -98
- package/src/pages/Dashboard.tsx +0 -60
- package/src/pages/DynamicPage.tsx +0 -431
- package/src/pages/FormsAdmin.test.tsx +0 -98
- package/src/pages/FormsAdmin.tsx +0 -579
- package/src/pages/Home.test.tsx +0 -98
- package/src/pages/Login.test.tsx +0 -98
- package/src/pages/Login.tsx +0 -132
- package/src/pages/PagesAdmin.test.tsx +0 -98
- package/src/pages/PagesAdmin.tsx +0 -1160
- package/src/pages/Profile.test.tsx +0 -98
- package/src/pages/Profile.tsx +0 -319
- package/src/pages/Register.test.tsx +0 -98
- package/src/pages/Register.tsx +0 -134
- package/src/pages/Requests.test.tsx +0 -95
- package/src/pages/Requests.tsx +0 -470
- package/src/pages/ResetPassword.test.tsx +0 -98
- package/src/pages/ResetPassword.tsx +0 -92
- package/src/pages/Settings.test.tsx +0 -98
- package/src/pages/Settings.tsx +0 -403
- package/src/pages/Setup.tsx +0 -451
- package/src/pages/StorageAdmin.test.tsx +0 -150
- package/src/pages/StorageAdmin.tsx +0 -772
- package/src/pages/Submissions.test.tsx +0 -95
- package/src/pages/Submissions.tsx +0 -420
- package/src/pages/Templates.test.tsx +0 -98
- package/src/pages/Templates.tsx +0 -103
- package/src/pages/ThemeAdmin.test.tsx +0 -144
- package/src/pages/ThemeAdmin.tsx +0 -1026
- package/src/pages/Users.test.tsx +0 -95
- package/src/pages/Users.tsx +0 -340
- package/src/pages/Verify.test.tsx +0 -98
- package/src/pages/Verify.tsx +0 -95
- package/src/prompts/aiRules.test.ts +0 -113
- package/src/prompts/index.ts +0 -14
- package/src/prompts/pages/publicPage.ts +0 -58
- package/src/prompts/prompts.test.ts +0 -73
- package/src/prompts/shared.ts +0 -57
- package/src/prompts/tabs/board/adminboard.ts +0 -36
- package/src/prompts/tabs/board/privateboard.ts +0 -36
- package/src/prompts/tabs/board/publicboard.ts +0 -35
- package/src/prompts/tabs/calendar/admincalendar.ts +0 -37
- package/src/prompts/tabs/calendar/privatecalendar.ts +0 -37
- package/src/prompts/tabs/calendar/publiccalendar.ts +0 -36
- package/src/prompts/tabs/crud/admin.ts +0 -61
- package/src/prompts/tabs/crud/private.ts +0 -61
- package/src/prompts/tabs/crud/shared.ts +0 -61
- package/src/prompts/tabs/table/admintable.ts +0 -36
- package/src/prompts/tabs/table/privatetable.ts +0 -36
- package/src/prompts/tabs/table/publictable.ts +0 -35
- package/src/renderer.ts +0 -1
- package/src/setupTests.ts +0 -1
- package/src/templates/AdminPageTemplate.tsx +0 -1134
- package/src/templates/PrivatePageTemplate.tsx +0 -1071
- package/src/templates/PublicPageTemplate.tsx +0 -92
- package/src/templates/SharedPageTemplate.tsx +0 -1053
- package/src/templates/TemplateBoard.test.tsx +0 -106
- package/src/templates/TemplateBoard.tsx +0 -717
- package/src/templates/TemplateCalendar.test.tsx +0 -106
- package/src/templates/TemplateCalendar.tsx +0 -889
- package/src/templates/TemplateConfirmation.test.tsx +0 -106
- package/src/templates/TemplateConfirmation.tsx +0 -145
- package/src/templates/TemplateInlineForm.test.tsx +0 -106
- package/src/templates/TemplateInlineForm.tsx +0 -129
- package/src/templates/TemplatePopupForm.test.tsx +0 -106
- package/src/templates/TemplatePopupForm.tsx +0 -174
- package/src/templates/TemplateTable.test.tsx +0 -106
- package/src/templates/TemplateTable.tsx +0 -720
- package/src/templates/boardRegressions.test.tsx +0 -129
- package/src/templates/calendarModal.test.tsx +0 -109
- /package/dist/{PhoneInputField-BW6qYKeg.cjs → PhoneInputField-CQ7ylxOC.cjs} +0 -0
package/README.md
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
# 🔥 Firebase
|
|
1
|
+
# 🔥 Your AI Firebase
|
|
2
2
|
|
|
3
|
-
**A complete, production-ready Firebase
|
|
3
|
+
**A complete, production-ready Firebase app — packaged as a single React component.**
|
|
4
4
|
|
|
5
|
-
Authentication, user management, role-based access control, file storage,
|
|
5
|
+
Authentication, user management, role-based access control, file storage, pages your AI assistant builds, a form builder, a theme engine and an inbox — all behind one import.
|
|
6
6
|
|
|
7
7
|
```tsx
|
|
8
|
-
import { FirebaseOS } from 'firebase-os';
|
|
9
|
-
import 'firebase-os/styles.css';
|
|
8
|
+
import { FirebaseOS } from 'your-ai-workflow-firebase-os';
|
|
9
|
+
import 'your-ai-workflow-firebase-os/styles.css';
|
|
10
10
|
|
|
11
11
|
export default function App() {
|
|
12
12
|
return <FirebaseOS />;
|
|
@@ -15,6 +15,10 @@ export default function App() {
|
|
|
15
15
|
|
|
16
16
|
That's it. **One component. Zero configuration files.**
|
|
17
17
|
|
|
18
|
+
> The component, the package and the `.firebase-os` CSS scope keep their original
|
|
19
|
+
> names — renaming them would break every existing install. The product is called
|
|
20
|
+
> Your AI Firebase.
|
|
21
|
+
|
|
18
22
|
---
|
|
19
23
|
|
|
20
24
|
## ✨ What you get
|
|
@@ -22,15 +26,17 @@ That's it. **One component. Zero configuration files.**
|
|
|
22
26
|
| Feature | Details |
|
|
23
27
|
|:--------|:--------|
|
|
24
28
|
| 🔐 **Authentication** | Email/password, email verification, password reset |
|
|
25
|
-
| 👥 **User Management** | Admin panel,
|
|
26
|
-
| 🗂️ **
|
|
27
|
-
| 📋 **Templates** | Board (Kanban), Calendar, Table, Inline Form, Popup Form, Confirmation |
|
|
29
|
+
| 👥 **User Management** | Admin panel, three access levels (Free · Internal · Admin), inactive user blocking |
|
|
30
|
+
| 🗂️ **Pages** | Ask your AI assistant for a page — for anyone, signed-in users, your team or admins only — and it appears in `/pages`, where you rename it, reorder it, hide it or change its web address |
|
|
31
|
+
| 📋 **Templates** | Board (Kanban), Calendar, Table, Drive, Inline Form, Popup Form, Confirmation |
|
|
28
32
|
| 🎨 **Theme Engine** | Full dark/light mode, custom accent colours, fonts, corner radii, logo |
|
|
29
|
-
| 📁 **File Storage** |
|
|
30
|
-
| 📬 **
|
|
31
|
-
|
|
|
33
|
+
| 📁 **File Storage** | An admin-only Assets screen for public images, plus a drive preset any page can be built on |
|
|
34
|
+
| 📬 **Forms** | Ask the AI for a form — it shows up in `/forms`, where the title, fields and button text are editable |
|
|
35
|
+
| 📥 **Inbox** | Every form entry in one list at `/inbox`, filtered "From anyone" or "From signed-in users" |
|
|
36
|
+
| 📖 **Guide** | A walkthrough at `/guide` with the sentences to paste into your assistant |
|
|
32
37
|
| 📊 **Dashboard** | Personalised user dashboard |
|
|
33
|
-
|
|
38
|
+
|
|
39
|
+
Ordering, visibility, renaming and deleting all live on the Pages screen — there is no separate settings screen, no Submissions screen and no Requests screen.
|
|
34
40
|
|
|
35
41
|
---
|
|
36
42
|
|
|
@@ -46,56 +52,59 @@ npm install firebase react react-dom react-router-dom
|
|
|
46
52
|
|
|
47
53
|
**From npm:**
|
|
48
54
|
```bash
|
|
49
|
-
npm install firebase-os
|
|
55
|
+
npm install your-ai-workflow-firebase-os
|
|
50
56
|
```
|
|
51
57
|
|
|
52
58
|
**From a local build (development):**
|
|
53
59
|
```bash
|
|
54
|
-
npm pack # in
|
|
55
|
-
npm install /path/to/firebase-os-1.0.0.tgz # in your app
|
|
60
|
+
npm pack # in this repo
|
|
61
|
+
npm install /path/to/your-ai-workflow-firebase-os-1.0.0.tgz # in your app
|
|
56
62
|
```
|
|
57
63
|
|
|
64
|
+
Installing runs a postinstall step that patches the consumer project: it clears Vite's default CSS, writes `src/main.tsx` and `src/App.tsx` (both are owned by the library — see below), adds `yourAiFirebase()` from `your-ai-workflow-firebase-os/vite` and Tailwind to `vite.config.ts`, creates `src/your-ai-workflow-firebase-os/` with the editable theme and configs, and writes `GEMINI.md` / `AGENTS.md`.
|
|
65
|
+
|
|
66
|
+
### What the build enforces
|
|
67
|
+
|
|
68
|
+
The package ships a Vite plugin, `yourAiFirebase()`, that puts the project's structure out of the assistant's reach. `src/App.tsx` and `src/main.tsx` are owned files: the plugin serves its own canonical source for both and rewrites them on disk whenever they differ, so an edit there has no effect. Pages, forms and content files are discovered from `src/your-ai-workflow-firebase-os/configs/` and `microcomponents/` through a virtual module, so a deleted registry import can no longer make a page vanish. And every discovered file is validated before the build: a config file with the wrong name, a `route` that is not one string starting with `/`, an address used twice, a `*Tab.config.ts` without a valid `pageType`, a missing `*Config` export, a `systemName` that does not match the file, or a content file with no default export fails the build with one sentence that names the fix. A hand-written `<form>` in a content file only warns — its entries would never reach the Inbox.
|
|
69
|
+
|
|
70
|
+
Manual-first recipe: the owner adds the page on `/pages` (or the form on `/forms`) and then asks the assistant for the content, which is a single `microcomponents/<PascalCaseName>Content.tsx` file — no config file, no second address.
|
|
71
|
+
|
|
58
72
|
---
|
|
59
73
|
|
|
60
74
|
## 🚀 Quick Start
|
|
61
75
|
|
|
62
76
|
### Option A — Zero config (recommended)
|
|
63
77
|
|
|
64
|
-
On first load
|
|
78
|
+
On first load the app opens its **Setup screen**, which walks through connecting a Firebase project. Nothing is stored on any server — keys are saved in the browser's `localStorage`.
|
|
65
79
|
|
|
66
80
|
```tsx
|
|
67
81
|
// App.tsx
|
|
68
|
-
import { FirebaseOS } from 'firebase-os';
|
|
69
|
-
import 'firebase-os/styles.css';
|
|
82
|
+
import { FirebaseOS } from 'your-ai-workflow-firebase-os';
|
|
83
|
+
import 'your-ai-workflow-firebase-os/styles.css';
|
|
70
84
|
|
|
71
85
|
export default function App() {
|
|
72
86
|
return <FirebaseOS />;
|
|
73
87
|
}
|
|
74
88
|
```
|
|
75
89
|
|
|
76
|
-
1. Run your app
|
|
77
|
-
2. The Setup Wizard opens automatically
|
|
78
|
-
3. Paste your Firebase config (from the Firebase Console)
|
|
79
|
-
4. Done — the full OS loads
|
|
80
|
-
|
|
81
90
|
### Option B — Pre-configured (CI/CD, teams)
|
|
82
91
|
|
|
83
|
-
Skip the
|
|
92
|
+
Skip the setup screen entirely by passing the Firebase config as props:
|
|
84
93
|
|
|
85
94
|
```tsx
|
|
86
|
-
import { FirebaseOS } from 'firebase-os';
|
|
87
|
-
import 'firebase-os/styles.css';
|
|
95
|
+
import { FirebaseOS } from 'your-ai-workflow-firebase-os';
|
|
96
|
+
import 'your-ai-workflow-firebase-os/styles.css';
|
|
88
97
|
|
|
89
98
|
export default function App() {
|
|
90
99
|
return (
|
|
91
100
|
<FirebaseOS
|
|
92
101
|
firebaseConfig={{
|
|
93
|
-
apiKey: import.meta.env.
|
|
94
|
-
authDomain: import.meta.env.
|
|
95
|
-
projectId: import.meta.env.
|
|
96
|
-
storageBucket: import.meta.env.
|
|
97
|
-
messagingSenderId: import.meta.env.
|
|
98
|
-
appId: import.meta.env.
|
|
102
|
+
apiKey: import.meta.env.VITE_FIREBASE_API_KEY,
|
|
103
|
+
authDomain: import.meta.env.VITE_FIREBASE_AUTH_DOMAIN,
|
|
104
|
+
projectId: import.meta.env.VITE_FIREBASE_PROJECT_ID,
|
|
105
|
+
storageBucket: import.meta.env.VITE_FIREBASE_STORAGE_BUCKET,
|
|
106
|
+
messagingSenderId: import.meta.env.VITE_FIREBASE_MESSAGING_SENDER_ID,
|
|
107
|
+
appId: import.meta.env.VITE_FIREBASE_APP_ID,
|
|
99
108
|
}}
|
|
100
109
|
adminEmails={['you@yourcompany.com']}
|
|
101
110
|
/>
|
|
@@ -110,8 +119,8 @@ export default function App() {
|
|
|
110
119
|
```typescript
|
|
111
120
|
interface FirebaseOSProps {
|
|
112
121
|
/**
|
|
113
|
-
* Pass Firebase config directly to skip the Setup
|
|
114
|
-
* If omitted,
|
|
122
|
+
* Pass Firebase config directly to skip the Setup screen.
|
|
123
|
+
* If omitted, setup runs on first load and saves config to localStorage.
|
|
115
124
|
*/
|
|
116
125
|
firebaseConfig?: {
|
|
117
126
|
apiKey: string;
|
|
@@ -123,24 +132,36 @@ interface FirebaseOSProps {
|
|
|
123
132
|
};
|
|
124
133
|
|
|
125
134
|
/**
|
|
126
|
-
* Email addresses that are automatically assigned the 'admin' role
|
|
127
|
-
*
|
|
135
|
+
* Email addresses that are automatically assigned the 'admin' role once
|
|
136
|
+
* they have verified their email. Replaces the VITE_ADMIN_EMAILS env var.
|
|
137
|
+
* The same addresses have to be in the Firestore rules you pasted during
|
|
138
|
+
* setup — /setup writes them in for you — since the rules, not the client,
|
|
139
|
+
* are what actually grant the role.
|
|
128
140
|
*/
|
|
129
141
|
adminEmails?: string[];
|
|
130
142
|
|
|
131
|
-
/**
|
|
132
|
-
|
|
133
|
-
|
|
143
|
+
/** Theme defaults from your own theme.config.ts. */
|
|
144
|
+
themeConfig?: any;
|
|
145
|
+
|
|
146
|
+
/** Auto-discovered page content files, keyed by page id. */
|
|
147
|
+
microcomponents?: Record<string, React.ComponentType<any>>;
|
|
148
|
+
|
|
149
|
+
/** Local overrides for built-in components — `{ Home }` is the usual one. */
|
|
150
|
+
components?: { Home?: React.ComponentType<any> };
|
|
151
|
+
|
|
152
|
+
/** Default form configs shipped with your project. */
|
|
153
|
+
defaultConfigs?: { contactForm?: any; supportForm?: any };
|
|
154
|
+
|
|
155
|
+
/** Custom router basename (e.g. "/app" if your app lives at a subdirectory). */
|
|
134
156
|
basename?: string;
|
|
135
157
|
|
|
136
|
-
/**
|
|
137
|
-
* Callback fired whenever the Firebase auth state changes.
|
|
138
|
-
* Useful for integrating with your own auth layer.
|
|
139
|
-
*/
|
|
158
|
+
/** Callback fired whenever the Firebase auth state changes. */
|
|
140
159
|
onAuthChange?: (user: any) => void;
|
|
141
160
|
}
|
|
142
161
|
```
|
|
143
162
|
|
|
163
|
+
The postinstall step writes an `App.tsx` that already passes `themeConfig`, `microcomponents`, `components` and `defaultConfigs` for you.
|
|
164
|
+
|
|
144
165
|
---
|
|
145
166
|
|
|
146
167
|
## 🪝 Advanced: Hooks
|
|
@@ -148,7 +169,7 @@ interface FirebaseOSProps {
|
|
|
148
169
|
For advanced integrations, two hooks are exported from the library:
|
|
149
170
|
|
|
150
171
|
```tsx
|
|
151
|
-
import { useAuth, useTheme } from 'firebase-os';
|
|
172
|
+
import { useAuth, useTheme } from 'your-ai-workflow-firebase-os';
|
|
152
173
|
|
|
153
174
|
// Access auth state anywhere inside <FirebaseOS />
|
|
154
175
|
function MyWidget() {
|
|
@@ -170,6 +191,8 @@ function MyWidget() {
|
|
|
170
191
|
4. Copy the `firebaseConfig` object
|
|
171
192
|
5. Enable **Authentication** (Email/Password), **Firestore**, and **Storage** in your project
|
|
172
193
|
|
|
194
|
+
The Setup screen in the app walks through all of this and generates the security rules to paste, so nobody has to work it out from here.
|
|
195
|
+
|
|
173
196
|
---
|
|
174
197
|
|
|
175
198
|
## 🎨 Theming
|
|
@@ -180,9 +203,17 @@ All CSS is scoped to `.firebase-os` — the library's styles **do not leak** int
|
|
|
180
203
|
|
|
181
204
|
---
|
|
182
205
|
|
|
206
|
+
## 🤖 Working with the AI
|
|
207
|
+
|
|
208
|
+
Your AI Firebase is built to be driven from an AI chat (Google AI Studio, Cursor, Claude Code…). On install it writes **`GEMINI.md` / `AGENTS.md`** into the project: what the assistant may build, which words to use with the owner, and what it must never touch.
|
|
209
|
+
|
|
210
|
+
**That file is the contract, and it is the only copy.** It is generated by [`scripts/postinstall.js`](scripts/postinstall.js) — read it there, and change it there. This README deliberately does not restate it, so the two can never disagree.
|
|
211
|
+
|
|
212
|
+
The short version for a person evaluating the library: you ask for a page or a form in plain language, the assistant writes it, and it appears on the `/pages` or `/forms` screen where the basics — name, web address, icon, linked form, order, visibility — are yours to edit. Everything else is the assistant's job; ask it in chat.
|
|
213
|
+
|
|
183
214
|
## 📐 CSS Isolation
|
|
184
215
|
|
|
185
|
-
|
|
216
|
+
The library uses a `.firebase-os` container div for all its CSS variable scope. This means:
|
|
186
217
|
|
|
187
218
|
- ✅ Library's theme variables stay inside `.firebase-os`
|
|
188
219
|
- ✅ Your own `:root` variables are untouched
|
|
@@ -198,7 +229,7 @@ Firebase OS uses a `.firebase-os` container div for all its CSS variable scope.
|
|
|
198
229
|
- **Files** — your own Firebase Storage
|
|
199
230
|
- **Theme / page config** — your own Firestore (`sys_configs` collection)
|
|
200
231
|
|
|
201
|
-
You own all your data. Firebase
|
|
232
|
+
You own all your data. Your AI Firebase is just the UI layer.
|
|
202
233
|
|
|
203
234
|
---
|
|
204
235
|
|
|
@@ -214,17 +245,18 @@ src/
|
|
|
214
245
|
│ ├── AuthContext ← Auth lifecycle (internal)
|
|
215
246
|
│ ├── ThemeContext ← CSS variable injection (internal)
|
|
216
247
|
│ └── ConfigContext ← Library props → internal bridge
|
|
217
|
-
├── pages/ ←
|
|
218
|
-
├── templates/ ←
|
|
219
|
-
├── components/ ← Shared UI (internal)
|
|
220
|
-
|
|
248
|
+
├── pages/ ← Page components (internal)
|
|
249
|
+
├── templates/ ← Template components (internal)
|
|
250
|
+
├── components/ ← Shared UI, incl. components/fields (internal)
|
|
251
|
+
├── configs/ ← Default configurations (internal)
|
|
252
|
+
└── contract/ ← Tests pinning the generated GEMINI.md contract
|
|
221
253
|
```
|
|
222
254
|
|
|
223
255
|
### Scripts
|
|
224
256
|
|
|
225
257
|
```bash
|
|
226
258
|
npm run dev # Run standalone app (for development)
|
|
227
|
-
npm run test # Run test suite
|
|
259
|
+
npm run test # Run the test suite
|
|
228
260
|
npm run build:lib # Build the distributable library
|
|
229
261
|
npm pack # Create .tgz for local testing
|
|
230
262
|
```
|