@lastbrain/app 0.1.0 → 0.1.2

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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lastbrain/app",
3
- "version": "0.1.0",
3
+ "version": "0.1.2",
4
4
  "description": "Framework modulaire Next.js avec CLI et système de modules",
5
5
  "private": false,
6
6
  "type": "module",
@@ -27,11 +27,7 @@
27
27
  "lastbrain": "./dist/cli.js"
28
28
  },
29
29
  "files": [
30
- "dist",
31
- "src/app-shell",
32
- "src/layouts",
33
- "src/scripts",
34
- "src/templates"
30
+ "dist"
35
31
  ],
36
32
  "dependencies": {
37
33
  "@lastbrain/core": "0.1.0",
@@ -41,6 +37,7 @@
41
37
  "chalk": "^5.3.0",
42
38
  "commander": "^12.1.0",
43
39
  "fs-extra": "^11.2.0",
40
+ "inquirer": "^9.2.12",
44
41
  "lucide-react": "^0.554.0",
45
42
  "next-themes": "^0.4.6",
46
43
  "react": "^19.0.0",
@@ -1,13 +0,0 @@
1
- "use client";
2
-
3
- import type { PropsWithChildren } from "react";
4
-
5
- export default function AdminShellLayout({ children }: PropsWithChildren<{}>) {
6
- return (
7
- <div className="mx-auto max-w-5xl px-4 py-16">
8
- <h1 className="text-3xl font-bold">Section Admin</h1>
9
- <p className="text-slate-600">Gestion avancée des modules.</p>
10
- {children}
11
- </div>
12
- );
13
- }
@@ -1,13 +0,0 @@
1
- "use client";
2
-
3
- import type { PropsWithChildren } from "react";
4
-
5
- export default function AuthLayout({ children }: PropsWithChildren<{}>) {
6
- return (
7
- <div className="mx-auto max-w-5xl px-4 py-16">
8
- <h1 className="text-3xl font-bold">Section Auth</h1>
9
- <p className="text-slate-600">Les pages authentifiées regroupées ici.</p>
10
- {children}
11
- </div>
12
- );
13
- }
@@ -1,11 +0,0 @@
1
- "use client";
2
-
3
- export default function PublicPage() {
4
- return (
5
- <div className="mx-auto max-w-3xl space-y-4 px-4 py-16 text-center">
6
- <h1 className="text-3xl font-bold">Bienvenue sur LastBrain</h1>
7
- <p className="text-slate-600">Cette coquille publique présente la structure par défaut.</p>
8
- <button className="rounded-full bg-slate-900 px-5 py-2 text-white">Connexion</button>
9
- </div>
10
- );
11
- }
@@ -1,5 +0,0 @@
1
- "use client";
2
-
3
- import { RootLayout } from "../layouts/RootLayout.js";
4
-
5
- export default RootLayout;
@@ -1,28 +0,0 @@
1
- "use client";
2
- import { Button } from "@lastbrain/ui";
3
- import { useRouter } from "next/navigation";
4
-
5
- export default function NotFound() {
6
- const router = useRouter();
7
- return (
8
- <div className="flex min-h-screen items-center justify-center bg-background">
9
- <div className="mx-auto max-w-md text-center">
10
- <h1 className="mb-4 text-6xl font-bold text-foreground">404</h1>
11
- <h2 className="mb-4 text-2xl font-semibold text-foreground">
12
- Page non trouvée
13
- </h2>
14
- <p className="mb-8 text-muted-foreground">
15
- La page que vous recherchez n'existe pas ou a été déplacée.
16
- </p>
17
- <Button
18
- onPress={() => {
19
- router.back();
20
- }}
21
- className="inline-flex items-center justify-center rounded-md bg-primary px-6 py-3 text-sm font-medium text-primary-foreground transition-colors hover:bg-primary/90"
22
- >
23
- Retour à l'accueil
24
- </Button>
25
- </div>
26
- </div>
27
- );
28
- }
@@ -1,7 +0,0 @@
1
- "use client";
2
-
3
- import type { PropsWithChildren } from "react";
4
-
5
- export function AdminLayout({ children }: PropsWithChildren<{}>) {
6
- return <div className="pt-18 px-2 md:px-5">{children}</div>;
7
- }
@@ -1,61 +0,0 @@
1
- "use client";
2
-
3
- import type { PropsWithChildren } from "react";
4
- import { createContext, useContext, useMemo } from "react";
5
- import { getModuleConfigs } from "../modules/module-loader.js";
6
- import { Header, ToastProvider } from "@lastbrain/ui";
7
- import { useAuthSession } from "../auth/useAuthSession.js";
8
- import type { User } from "@supabase/supabase-js";
9
- import { useRouter } from "next/navigation.js";
10
-
11
- const ModuleContext = createContext(getModuleConfigs());
12
- const NotificationContext = createContext({ messages: [] as string[] });
13
- const AuthContext = createContext<{
14
- user: User | null;
15
- loading: boolean;
16
- isSuperAdmin: boolean;
17
- }>({
18
- user: null,
19
- loading: true,
20
- isSuperAdmin: false,
21
- });
22
-
23
- export function useModules() {
24
- return useContext(ModuleContext);
25
- }
26
-
27
- export function useNotifications() {
28
- return useContext(NotificationContext);
29
- }
30
-
31
- export function useAuth() {
32
- return useContext(AuthContext);
33
- }
34
-
35
- export function AppProviders({ children }: PropsWithChildren<{}>) {
36
- const modules = useMemo(() => getModuleConfigs(), []);
37
- const notifications = useMemo(() => ({ messages: [] as string[] }), []);
38
- const { user, loading, isSuperAdmin } = useAuthSession();
39
- // const router = useRouter();
40
- const authValue = useMemo(
41
- () => ({ user, loading, isSuperAdmin }),
42
- [user, loading, isSuperAdmin]
43
- );
44
-
45
- // const handleLogout = async () => {
46
- // const { signOut } = await import("../auth/authHelpers.js");
47
- // await signOut();
48
- // router.push("/auth/signin");
49
- // };
50
-
51
- return (
52
- <AuthContext.Provider value={authValue}>
53
- <ModuleContext.Provider value={modules}>
54
- <NotificationContext.Provider value={notifications}>
55
- {children}
56
- <ToastProvider placement="top-right" toastOffset={75} />
57
- </NotificationContext.Provider>
58
- </ModuleContext.Provider>
59
- </AuthContext.Provider>
60
- );
61
- }
@@ -1,7 +0,0 @@
1
- "use client";
2
-
3
- import type { PropsWithChildren } from "react";
4
-
5
- export function AuthLayout({ children }: PropsWithChildren<{}>) {
6
- return <div className="pt-18 px-2 md:px-5 ">{children}</div>;
7
- }
@@ -1,7 +0,0 @@
1
- "use client";
2
-
3
- import type { PropsWithChildren } from "react";
4
-
5
- export function PublicLayout({ children }: PropsWithChildren<{}>) {
6
- return <section className=" px-4 ">{children}</section>;
7
- }
@@ -1,27 +0,0 @@
1
- "use client";
2
-
3
- import type { PropsWithChildren } from "react";
4
- import { ThemeProvider } from "next-themes";
5
- import { AppProviders } from "./AppProviders.js";
6
-
7
- // Note: L'app Next.js doit importer son propre globals.css dans son layout
8
- export function RootLayout({ children }: PropsWithChildren<{}>) {
9
- return (
10
- <html lang="fr" suppressHydrationWarning>
11
- <body className="min-h-screen">
12
- <ThemeProvider
13
- attribute="class"
14
- defaultTheme="light"
15
- enableSystem={false}
16
- storageKey="lastbrain-theme"
17
- >
18
- <AppProviders>
19
- <div className=" min-h-screen bg-slate-50 text-slate-900 dark:bg-slate-950 dark:text-white">
20
- {children}
21
- </div>
22
- </AppProviders>
23
- </ThemeProvider>
24
- </body>
25
- </html>
26
- );
27
- }
@@ -1,262 +0,0 @@
1
- # Scripts LastBrain
2
-
3
- Ce répertoire contient tous les scripts utilitaires pour gérer les applications et modules LastBrain.
4
-
5
- ## Scripts disponibles
6
-
7
- ### `init-app.ts`
8
-
9
- Initialise une nouvelle application Next.js LastBrain avec toute la structure nécessaire.
10
-
11
- **Usage :**
12
-
13
- ```bash
14
- pnpm lastbrain init [directory] [options]
15
- ```
16
-
17
- **Options :**
18
-
19
- - `--force` : Écrase les fichiers existants
20
- - `--heroui` : Utilise HeroUI au lieu de NextUI
21
- - `--with-auth` : Inclut le module d'authentification
22
- - `--no-interactive` : Mode non-interactif
23
-
24
- ### `module-create.ts`
25
-
26
- Crée un nouveau module dans `packages/module-{nom}` avec toute la structure nécessaire.
27
-
28
- **Usage :**
29
-
30
- ```bash
31
- pnpm lastbrain create-module
32
- ```
33
-
34
- **Fonctionnalités :**
35
-
36
- - Génération interactive du module
37
- - Création des pages (public/auth/admin)
38
- - Création des routes API CRUD
39
- - Génération des migrations SQL
40
- - Configuration complète (package.json, tsconfig.json, build.config.ts)
41
-
42
- **Voir :** [MODULE_CREATION.md](../../../../docs/MODULE_CREATION.md)
43
-
44
- ### `module-add.ts`
45
-
46
- Ajoute un module existant à l'application courante.
47
-
48
- **Usage :**
49
-
50
- ```bash
51
- pnpm lastbrain add-module <nom-du-module>
52
- ```
53
-
54
- **Exemple :**
55
-
56
- ```bash
57
- pnpm lastbrain add-module auth
58
- ```
59
-
60
- **Actions effectuées :**
61
-
62
- - Ajout de la dépendance au package.json
63
- - Installation via pnpm
64
- - Copie des migrations du module
65
- - Application des migrations (avec choix reset/push/skip)
66
- - Enregistrement dans `.lastbrain/modules.json`
67
-
68
- ### `module-remove.ts`
69
-
70
- Supprime un module de l'application courante.
71
-
72
- **Usage :**
73
-
74
- ```bash
75
- pnpm lastbrain remove-module <nom-du-module>
76
- ```
77
-
78
- **Actions effectuées :**
79
-
80
- - Suppression de la dépendance du package.json
81
- - Suppression du module de `.lastbrain/modules.json`
82
- - Nettoyage via pnpm
83
-
84
- **Note :** Les migrations ne sont pas automatiquement inversées.
85
-
86
- ### `module-list.ts`
87
-
88
- Liste tous les modules disponibles et ceux installés dans l'application courante.
89
-
90
- **Usage :**
91
-
92
- ```bash
93
- pnpm lastbrain list-modules
94
- ```
95
-
96
- **Affiche :**
97
-
98
- - ✅ Modules installés
99
- - 📦 Modules disponibles
100
-
101
- ### `module-build.ts`
102
-
103
- Génère automatiquement les routes et pages de l'application à partir des modules installés.
104
-
105
- **Usage :**
106
-
107
- ```bash
108
- pnpm build:modules
109
- ```
110
-
111
- **Actions effectuées :**
112
-
113
- - Lecture des `build.config.ts` de tous les modules installés
114
- - Génération de `app/navigation.generated.ts`
115
- - Création des pages dans les sections appropriées (public/auth/admin)
116
- - Création des routes API
117
-
118
- **Note :** Utilisé par le script `dev:sync` en mode watch.
119
-
120
- ### `db-init.ts`
121
-
122
- Initialise la base de données Supabase locale.
123
-
124
- **Usage :**
125
-
126
- ```bash
127
- pnpm db:init
128
- ```
129
-
130
- **Actions effectuées :**
131
-
132
- - Démarre Supabase local (si pas déjà démarré)
133
- - Génère le fichier `.env.local` avec les clés Supabase
134
- - Applique les migrations de base
135
- - Reset de la base de données
136
-
137
- ### `db-migrations-sync.ts`
138
-
139
- Synchronise les migrations de tous les modules avec la base de données.
140
-
141
- **Usage :**
142
-
143
- ```bash
144
- pnpm db:migrations:sync
145
- ```
146
-
147
- **Actions effectuées :**
148
-
149
- - Collecte toutes les migrations des modules installés
150
- - Copie dans `supabase/migrations/`
151
- - Applique les migrations (via `supabase db push` ou `supabase db reset`)
152
-
153
- ### `dev-sync.ts`
154
-
155
- Lance le mode développement avec synchronisation automatique des modules.
156
-
157
- **Usage :**
158
-
159
- ```bash
160
- pnpm dev:sync
161
- ```
162
-
163
- **Actions effectuées :**
164
-
165
- - Watch des changements dans les modules
166
- - Régénération automatique des routes
167
- - Synchronisation des migrations
168
- - Redémarrage automatique du serveur Next.js
169
-
170
- ### `readme-build.ts`
171
-
172
- Génère la documentation README.md de l'application.
173
-
174
- **Usage :**
175
-
176
- ```bash
177
- pnpm readme:create
178
- ```
179
-
180
- **Actions effectuées :**
181
-
182
- - Analyse la structure de l'application
183
- - Collecte les informations des modules installés
184
- - Génère un README complet avec la documentation
185
-
186
- ## Architecture des scripts
187
-
188
- ### Dépendances communes
189
-
190
- Tous les scripts utilisent :
191
-
192
- - `fs-extra` : Gestion des fichiers
193
- - `chalk` : Affichage coloré dans le terminal
194
- - `inquirer` : Prompts interactifs (pour certains scripts)
195
- - `commander` : Parsing des arguments CLI
196
-
197
- ### Structure type d'un script
198
-
199
- ```typescript
200
- import fs from "fs-extra";
201
- import path from "path";
202
- import chalk from "chalk";
203
-
204
- export async function monScript(targetDir: string, options?: any) {
205
- console.log(chalk.blue("\n🚀 Début du script...\n"));
206
-
207
- try {
208
- // Logique du script
209
- console.log(chalk.green("✅ Succès!"));
210
- } catch (error) {
211
- console.error(chalk.red("❌ Erreur:"), error);
212
- process.exit(1);
213
- }
214
- }
215
- ```
216
-
217
- ## Ajouter un nouveau script
218
-
219
- 1. Créer le fichier TypeScript dans `src/scripts/`
220
- 2. Exporter une fonction principale
221
- 3. Ajouter la commande dans `src/cli.ts`
222
- 4. Ajouter éventuellement un script NPM dans `package.json`
223
- 5. Documenter ici et dans les docs principales
224
-
225
- ## Bonnes pratiques
226
-
227
- 1. **Messages clairs** : Utilisez `chalk` pour des messages colorés et informatifs
228
- 2. **Gestion d'erreurs** : Toujours catch les erreurs et donner un message explicite
229
- 3. **Confirmations** : Pour les opérations destructives, demander confirmation
230
- 4. **Idempotence** : Les scripts doivent pouvoir être exécutés plusieurs fois
231
- 5. **Logs** : Logger les actions importantes pour faciliter le debug
232
- 6. **Exit codes** : Utiliser `process.exit(1)` en cas d'erreur
233
-
234
- ## Tests
235
-
236
- Pour tester un script :
237
-
238
- ```bash
239
- # 1. Compiler le package
240
- pnpm build
241
-
242
- # 2. Exécuter la commande
243
- pnpm lastbrain <commande> [args]
244
- ```
245
-
246
- ## Contribution
247
-
248
- Pour contribuer un nouveau script :
249
-
250
- 1. Fork le projet
251
- 2. Créer une branche feature
252
- 3. Implémenter le script avec tests
253
- 4. Documenter dans ce README
254
- 5. Créer une Pull Request
255
-
256
- ## Support
257
-
258
- Pour toute question ou problème :
259
-
260
- - Ouvrir une issue sur GitHub
261
- - Consulter la documentation dans `/docs`
262
- - Rejoindre le Discord LastBrain