nextworks 0.1.0-alpha.1 → 0.1.0-alpha.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.
@@ -0,0 +1,244 @@
1
+ # Auth Quickstart
2
+
3
+ Follow these steps to get email/password auth (and optional GitHub OAuth) running in under 5 minutes.
4
+
5
+ If you are using the `nextworks` CLI in your own app, the recommended alpha setup is to install Blocks first, then Auth Core:
6
+
7
+ ```bash
8
+ npx nextworks add blocks
9
+ npx nextworks add auth-core
10
+ ```
11
+
12
+ Then follow the steps below inside your app.
13
+
14
+ ## 1) Copy environment variables
15
+
16
+ Create a `.env` file based on `.env.example`:
17
+
18
+ ```
19
+ cp .env.example .env
20
+ ```
21
+
22
+ Fill in values for the following environment variables used by the Auth kit:
23
+
24
+ - DATABASE_URL — PostgreSQL connection string
25
+ - NEXTAUTH_URL — URL of your app (e.g. http://localhost:3000 in dev)
26
+ - NEXTAUTH_SECRET — a strong random string (used to sign NextAuth tokens)
27
+
28
+ Optional / password reset / email provider vars:
29
+
30
+ - GITHUB_ID — (optional) GitHub OAuth client id
31
+ - GITHUB_SECRET — (optional) GitHub OAuth client secret
32
+ - NEXTWORKS_ENABLE_PASSWORD_RESET — set to `1` to enable the dev password reset scaffold (default: disabled)
33
+ - NEXTWORKS_USE_DEV_EMAIL — set to `1` to enable Ethereal dev email transport (for local testing only)
34
+ - SMTP_HOST, SMTP_PORT, SMTP_USER, SMTP_PASS, NOREPLY_EMAIL — when using a real SMTP provider (required in production if enable password reset)
35
+ - NODE_ENV — (production/dev) used to guard password-reset behavior
36
+
37
+ Notes:
38
+
39
+ - The Auth kit will only enable the GitHub provider when both GITHUB_ID and GITHUB_SECRET are present.
40
+ - Password reset remains disabled by default; enable cautiously and only after configuring a real mail provider in production.
41
+
42
+ ## 2) Install and generate Prisma
43
+
44
+ If you are using the monorepo directly:
45
+
46
+ ```bash
47
+ npm install
48
+ npx prisma generate
49
+ npx prisma migrate dev -n init
50
+ ```
51
+
52
+ If you installed Auth via the CLI (`npx nextworks add auth-core`), the schema and scripts are already in place in your app — you still need to run:
53
+
54
+ ```bash
55
+ npm install @prisma/client prisma
56
+ npx prisma generate
57
+ npx prisma migrate dev -n init
58
+ ```
59
+
60
+ This applies the Prisma schema and generates the Prisma client.
61
+
62
+ ## 3) Start the dev server
63
+
64
+ ```
65
+ npm run dev
66
+ ```
67
+
68
+ Visit:
69
+
70
+ - http://localhost:3000/auth/signup to create a user
71
+ - http://localhost:3000/auth/login to sign in
72
+ - http://localhost:3000/dashboard after login
73
+
74
+ ## 4) Optional: GitHub OAuth
75
+
76
+ If you provided GITHUB_ID and GITHUB_SECRET in `.env`, the GitHub provider will be enabled and the GitHub button will appear on the forms. If not provided, the button will be hidden and only email/password is available.
77
+
78
+ ## 5) Roles (optional)
79
+
80
+ The `User` model has a `role` field (default: `user`). Role is propagated to the JWT and session so you can gate pages/components. You can later add admin tooling or seed scripts as needed.
81
+
82
+ ## 6) Seed and promote admin scripts
83
+
84
+ - `scripts/seed-demo.mjs` (already in the repo) creates a demo admin user and sample posts for quick demos.
85
+ - `scripts/promote-admin.mjs` (new) is idempotent and promotes an existing user to `admin`:
86
+
87
+ ```
88
+ node ./scripts/promote-admin.mjs admin@example.com
89
+ ```
90
+
91
+ ## 7) Forgot password (development scaffold)
92
+
93
+ This is a development scaffold that is disabled by default. To enable the password reset feature, set:
94
+
95
+ ```
96
+ NEXTWORKS_ENABLE_PASSWORD_RESET=1
97
+ ```
98
+
99
+ - POST `/api/auth/forgot-password` accepts `{ email }`. When enabled the endpoint generates a one-time token stored in the database and (in development) prints a reset link to the server console. The endpoint always returns a generic success message to avoid user enumeration.
100
+ - GET `/api/auth/reset-password?token=...` validates a token (only when enabled).
101
+ - POST `/api/auth/reset-password` accepts `{ token, password, confirmPassword }` and updates the user password while invalidating the token (only when enabled).
102
+
103
+ Security notes:
104
+
105
+ - The scaffold is intentionally disabled by default; enable it only for local testing or after hardening.
106
+ - The forgot-password scaffold uses an in-memory rate limiter for demo purposes — replace it with a centralized rate limiter (Redis, API gateway) in production.
107
+ - Always use a real email provider (SMTP, SendGrid, etc.) in production and never log reset tokens in server logs.
108
+
109
+ Migration & upgrade notes
110
+
111
+ - A recent schema migration changed PasswordReset to store tokenHash (SHA-256) instead of the raw token. Steps we executed:
112
+ 1. Added `tokenHash` (nullable) to the PasswordReset model and made `token` nullable in Prisma.
113
+ 2. Generated a migration that adds the tokenHash column and a unique index on it.
114
+ 3. Ran a one-off script `scripts/populate-tokenhash.mjs` to compute SHA-256 hashes for previous tokens and fill `tokenHash`.
115
+ 4. Applied the migration and regenerated the Prisma client (`npx prisma generate`).
116
+
117
+ - To enable password reset behavior in your environment, set:
118
+
119
+ ```
120
+ NEXTWORKS_ENABLE_PASSWORD_RESET=1
121
+ ```
122
+
123
+ - Dev email helper (optional): there is an optional dev email helper (nodemailer + Ethereal) that can be enabled with `NEXTWORKS_USE_DEV_EMAIL=1`. When enabled (and NEXTWORKS_ENABLE_PASSWORD_RESET=1), forgot-password will send an Ethereal email and the server will log only the Ethereal preview URL (no plaintext token in logs). This helper is strictly opt-in for development only. Use a real email provider in production.
124
+
125
+ - Production hardening: Password reset should only be enabled in production when a mail provider is configured. To harden the scaffold in production, ensure the following environment variables are set for SMTP (or equivalent for other providers):
126
+
127
+ ```
128
+ SMTP_HOST=smtp.example.com
129
+ SMTP_PORT=587
130
+ SMTP_USER=user@example.com
131
+ SMTP_PASS=supersecret
132
+ NOREPLY_EMAIL=no-reply@example.com
133
+ NEXTWORKS_ENABLE_PASSWORD_RESET=1
134
+ ```
135
+
136
+ When NEXTWORKS_ENABLE_PASSWORD_RESET=1 and NODE_ENV=production the server will refuse to enable password reset unless a mail provider is configured. The server will not log reset tokens or URLs in production logs.
137
+
138
+ Security checklist before enabling reset in production:
139
+
140
+ - Set a strong NEXTAUTH_SECRET
141
+ - Use HTTPS/TLS
142
+ - Replace in-memory rate limiting with a centralized store (Redis/API Gateway)
143
+ - Configure and test a real mail provider (SMTP, SendGrid, etc.)
144
+ - Ensure password reset tokens are expired/cleaned up periodically
145
+ - Review logging to avoid token leakage
146
+
147
+ - Promotion script: to promote an existing user to admin, run:
148
+
149
+ ```
150
+ node ./scripts/promote-admin.mjs user@example.com
151
+ ```
152
+
153
+ - Important: Before turning password reset on in production, ensure you:
154
+ - Replace the in-memory rate limiter with a centralized solution (Redis or API Gateway).
155
+ - Configure a real email provider and remove console logging of tokens.
156
+ - Ensure tokens are cleaned up periodically (see scripts/prune-password-resets.mjs stub).
157
+ - Set a secure NEXTAUTH_SECRET and use HTTPS in production.
158
+
159
+ ## Files & kit manifest (what to look at)
160
+
161
+ If you want to inspect or package the Auth kit, the primary files and routes are listed below. This is a minimal manifest intended for documentation and CLI packaging reference — adjust paths if you extract the kit into another project.
162
+
163
+ Key files
164
+
165
+ - NextAuth handler & callbacks: lib/auth.ts
166
+ - Prisma client: lib/prisma.ts
167
+ - Auth helper utilities: lib/auth-helpers.ts, lib/hash.ts
168
+ - Email providers: lib/email/index.ts, lib/email/dev-transport.ts, lib/email/provider-smtp.ts
169
+ - Validation helpers: lib/validation/forms.ts
170
+ - Form error mapping: lib/forms/map-errors.ts
171
+ - UI components used by Auth: components/auth/_ and components/ui/_ (login-form.tsx, signup-form.tsx, button/input/label etc.)
172
+ - Pages & API routes:
173
+ - app/auth/login/page.tsx
174
+ - app/auth/signup/page.tsx
175
+ - app/auth/forgot-password/page.tsx
176
+ - app/auth/reset-password/page.tsx
177
+ - app/auth/verify-email/page.tsx
178
+ - app/api/auth/[...nextauth]/route.ts
179
+ - app/api/auth/forgot-password/route.ts
180
+ - app/api/auth/reset-password/route.ts
181
+ - app/api/auth/send-verify-email/route.ts
182
+ - app/api/auth/providers/route.ts
183
+ - app/api/signup/route.ts
184
+ - Prisma schema & auth models: prisma/schema.prisma and prisma/auth-models.prisma
185
+ - Seed & maintenance scripts: scripts/seed-demo.mjs, scripts/promote-admin.mjs, scripts/populate-tokenhash.mjs
186
+
187
+ Minimal manifest (JSON)
188
+
189
+ {
190
+ "name": "auth-core",
191
+ "files": [
192
+ "lib/auth.ts",
193
+ "lib/prisma.ts",
194
+ "lib/auth-helpers.ts",
195
+ "lib/hash.ts",
196
+ "lib/forms/map-errors.ts",
197
+ "lib/validation/forms.ts",
198
+ "lib/email/index.ts",
199
+ "components/auth/login-form.tsx",
200
+ "components/auth/signup-form.tsx",
201
+ "components/auth/logout-button.tsx",
202
+ "components/session-provider.tsx",
203
+ "app/auth/login/page.tsx",
204
+ "app/auth/signup/page.tsx",
205
+ "app/api/auth/[...nextauth]/route.ts",
206
+ "app/api/signup/route.ts",
207
+ "prisma/schema.prisma",
208
+ "scripts/seed-demo.mjs",
209
+ "scripts/promote-admin.mjs"
210
+ ]
211
+ }
212
+
213
+ ## Where to customize NextAuth behavior
214
+
215
+ - The NextAuth configuration and handlers live in lib/auth.ts. Common customizations include:
216
+ - Adjusting providers (add/remove OAuth providers).
217
+ - Modifying session and jwt callbacks to include or remove fields on the token/session.
218
+ - Customizing pages (e.g., pages.signIn) or redirect logic.
219
+
220
+ - Notes: lib/auth.ts already persists user.id and role into the JWT and exposes them on session.user for server components. If you change what is exposed on the session, ensure server-side checks (RBAC) are updated accordingly.
221
+
222
+ ## CLI kit source (if packaging later)
223
+
224
+ - A kit skeleton for packaging already exists in the repo at: `cli/kits/auth-core/` — it contains a compact copy of the core auth files (components, lib, prisma snippets) used by the CLI during development. Use that folder as a starting point when you implement the CLI packaging step.
225
+
226
+ ## Post-install checklist (Auth)
227
+
228
+ 1. Copy `.env.example` → `.env` and set DATABASE_URL, NEXTAUTH_URL, NEXTAUTH_SECRET (and GITHUB_ID/GITHUB_SECRET if using GitHub OAuth).
229
+ 2. Generate Prisma client and run migrations:
230
+
231
+ npx prisma generate
232
+ npx prisma migrate dev -n init
233
+
234
+ 3. (Optional) Seed demo data for quick testing:
235
+
236
+ SEED_ADMIN_EMAIL=admin@example.com SEED_ADMIN_PASSWORD=password123 node ./scripts/seed-demo.mjs
237
+
238
+ 4. Start dev server:
239
+
240
+ npm run dev
241
+
242
+ 5. Visit: `/auth/signup`, `/auth/login` and `/dashboard` for protected pages.
243
+
244
+ If you want, I can also create a short docs/AUTH_MANIFEST.json file containing the JSON manifest above in the repo (useful for CLI packaging). I will not create CLI code or copy files unless you ask.
@@ -0,0 +1,193 @@
1
+ # Blocks Quickstart
2
+
3
+ This document explains the Blocks kit: prebuilt UI sections, templates and core UI primitives included in this repository. The Blocks kit is intended to be a non-invasive copyable kit (shadCN-style) you can install into any Next.js App Router + TypeScript + Tailwind project.
4
+
5
+ > **Alpha note**
6
+ > Other kits (Auth Core, Forms, Data) are currently tested and supported on top of a default Blocks install. For the smoothest experience, install Blocks first in your app before adding other kits.
7
+
8
+ > If you are using the `nextworks` CLI in your own app, you can install this Blocks kit by running:
9
+ >
10
+ > ```bash
11
+ > npx nextworks add blocks
12
+ > ```
13
+ >
14
+ > By default this installs **core UI primitives, sections, and page templates**, so the example templates work out of the box. The CLI will copy files into your project under `components/`, `app/templates/`, `lib/`, and `public/` as described below.
15
+ >
16
+ > Advanced:
17
+ >
18
+ > - `npx nextworks add blocks --ui-only` → install core UI primitives only (no sections/templates).
19
+ > - `npx nextworks add blocks --sections` → install core + sections only.
20
+ > - `npx nextworks add blocks --templates` → install core + templates only.
21
+ > - `npx nextworks add blocks --sections --templates` → same as the default (core + sections + templates).
22
+
23
+ What’s included
24
+
25
+ - Page templates (composed from sections):
26
+ - app/templates/productlaunch
27
+ - app/templates/saasdashboard
28
+ - app/templates/digitalagency
29
+ - Reusable UI sections: components/sections/\* (Navbar, Hero, Features, Pricing, Testimonials, FAQ, Contact, Footer, etc.)
30
+ - Core UI primitives: components/ui/\* (Button, Input, Card, Select, Checkbox, Switch, Theme toggle/selector, Form primitives)
31
+ - Theme helpers and presets: components/PresetThemeVars in each template and lib/themes.ts
32
+ - Global styles: app/globals.css and optional theme variables in each template's PresetThemeVars file
33
+ - Sample placeholder assets: public/placeholders/\*
34
+
35
+ Where to look
36
+
37
+ - Templates:
38
+ - app/templates/productlaunch/page.tsx (productlaunch template)
39
+ - app/templates/saasdashboard/page.tsx (saasdashboard template)
40
+ - app/templates/digitalagency/page.tsx (digital agency template)
41
+ - Sections:
42
+ - components/sections/\*.tsx
43
+ - UI primitives and form building blocks:
44
+ - components/ui/button.tsx
45
+ - components/ui/input.tsx
46
+ - components/ui/label.tsx
47
+ - components/ui/card.tsx
48
+ - components/ui/textarea.tsx
49
+ - components/ui/select.tsx
50
+ - components/ui/checkbox.tsx
51
+ - components/ui/switch.tsx
52
+ - components/ui/form/\* (Form, FormField, FormItem, FormControl, FormLabel, FormMessage, FormDescription)
53
+ - Theme and providers:
54
+ - components/theme-provider.tsx
55
+ - components/enhanced-theme-provider.tsx
56
+ - lib/themes.ts
57
+
58
+ Minimal steps to render a template locally
59
+
60
+ 1. Install dependencies and run the dev server:
61
+
62
+ npm install
63
+ npm run dev
64
+
65
+ 2. Open the productlaunch template in your browser:
66
+
67
+ http://localhost:3000/templates/productlaunch
68
+
69
+ 3. The templates use global styles (app/globals.css). No environment variables are required for Blocks-only usage.
70
+
71
+ How to adopt / override template pieces
72
+
73
+ - Slots & component overrides
74
+ - Each template composes small sections from components/sections/\*.tsx. To override a section, copy the desired section file into your project (or replace the import) and update props or classNames.
75
+ - Example: to override the Navbar, copy components/sections/Navbar.tsx into your app and update the markup or styles. The template imports Navbar from the components directory.
76
+
77
+ - Styling and utility classes
78
+ - Tailwind is used across components. Prefer adding or modifying Tailwind utility classes on the exported component or pass className props (many components accept className).
79
+
80
+ - Theme variables and PresetThemeVars
81
+ - Each template has a PresetThemeVars component/file (e.g., app/templates/productlaunch/PresetThemeVars.tsx) that injects CSS variables for theme presets.
82
+ - To change default palette or add presets, edit the template PresetThemeVars and lib/themes.ts.
83
+ - Theme providers are implemented in components/theme-provider.tsx and components/enhanced-theme-provider.tsx — wrap your app with these if you extract blocks into another project.
84
+
85
+ Import examples
86
+
87
+ - Import a primitive in your code:
88
+
89
+ import Button from "@/components/ui/button";
90
+ import { Form, FormField } from "@/components/ui/form/form"; // path depends on your project alias
91
+
92
+ - Use a section in a page:
93
+
94
+ import Navbar from "@/components/sections/Navbar";
95
+
96
+ export default function Page() {
97
+ return (
98
+ <>
99
+ <Navbar />
100
+ <main>{/_ ... _/}</main>
101
+ </>
102
+ );
103
+ }
104
+
105
+ Public assets and placeholders
106
+
107
+ - The templates reference placeholder images in public/placeholders/. If you copy templates to another project, copy the referenced assets (public/placeholders/gallery/\*) or replace with your own images.
108
+
109
+ Simple Blocks kit manifest (for internal CLI packaging)
110
+
111
+ > This section is for maintainers of the `nextworks` CLI. You don’t need this if you’re just installing Blocks into your own app.
112
+
113
+ Use this manifest to drive a CLI copy step: it enumerates the primary files that make up the Blocks kit. Adjust paths if your CLI uses a different base.
114
+
115
+ - Suggested internal path: cli/kits/blocks/manifest.json
116
+
117
+ Contents:
118
+
119
+ {
120
+ "name": "blocks",
121
+ "description": "Frontend UI sections, templates and core UI primitives",
122
+ "files": [
123
+ "components/sections/About.tsx",
124
+ "components/sections/Contact.tsx",
125
+ "components/sections/CTA.tsx",
126
+ "components/sections/FAQ.tsx",
127
+ "components/sections/Features.tsx",
128
+ "components/sections/Footer.tsx",
129
+ "components/sections/HeroMotion.tsx",
130
+ "components/sections/HeroOverlay.tsx",
131
+ "components/sections/HeroSplit.tsx",
132
+ "components/sections/Navbar.tsx",
133
+ "components/sections/Newsletter.tsx",
134
+ "components/sections/PortfolioSimple.tsx",
135
+ "components/sections/Pricing.tsx",
136
+ "components/sections/ProcessTimeline.tsx",
137
+ "components/sections/ServicesGrid.tsx",
138
+ "components/sections/Team.tsx",
139
+ "components/sections/Testimonials.tsx",
140
+ "components/sections/TrustBadges.tsx",
141
+ "components/ui/button.tsx",
142
+ "components/ui/card.tsx",
143
+ "components/ui/checkbox.tsx",
144
+ "components/ui/cta-button.tsx",
145
+ "components/ui/dropdown-menu.tsx",
146
+ "components/ui/feature-card.tsx",
147
+ "components/ui/input.tsx",
148
+ "components/ui/label.tsx",
149
+ "components/ui/pricing-card.tsx",
150
+ "components/ui/skeleton.tsx",
151
+ "components/ui/switch.tsx",
152
+ "components/ui/table.tsx",
153
+ "components/ui/textarea.tsx",
154
+ "components/ui/theme-selector.tsx",
155
+ "components/ui/theme-toggle.tsx",
156
+ "components/ui/toaster.tsx",
157
+ "components/ui/form/form.tsx",
158
+ "components/ui/form/form-field.tsx",
159
+ "components/ui/form/form-item.tsx",
160
+ "components/ui/form/form-control.tsx",
161
+ "components/ui/form/form-description.tsx",
162
+ "components/ui/form/form-label.tsx",
163
+ "components/ui/form/form-message.tsx",
164
+ "components/enhanced-theme-provider.tsx",
165
+ "components/theme-provider.tsx",
166
+ "lib/themes.ts",
167
+ "app/globals.css",
168
+ "app/templates/productlaunch/page.tsx",
169
+ "app/templates/productlaunch/PresetThemeVars.tsx",
170
+ "app/templates/productlaunch/README.md",
171
+ "app/templates/saasdashboard/page.tsx",
172
+ "app/templates/saasdashboard/PresetThemeVars.tsx",
173
+ "app/templates/saasdashboard/README.md",
174
+ "app/templates/digitalagency/page.tsx",
175
+ "app/templates/digitalagency/PresetThemeVars.tsx",
176
+ "app/templates/digitalagency/README.md",
177
+ "public/placeholders/gallery/hero-pexels-broken-9945014.avif"
178
+ ]
179
+ }
180
+
181
+ Notes & recommendations
182
+
183
+ - Blocks are self-contained and do not require Prisma or NextAuth. If your user only needs Blocks, the CLI should copy these files and add a brief README instructing the user to import the theme provider in app/layout.tsx and ensure app/globals.css is present.
184
+ - Consider adding an examples folder demonstrating how to swap PresetThemeVars and override a section component.
185
+
186
+ ---
187
+
188
+ If you'd like, I can:
189
+
190
+ - Create the CLI manifest file at cli/kits/blocks/manifest.json using the JSON above, or
191
+ - Create a short example that demonstrates overriding Navbar and changing PresetThemeVars.
192
+
193
+ Tell me which of the above to create next.
@@ -0,0 +1,65 @@
1
+ Blocks kit (cli/kits/blocks)
2
+
3
+ This folder contains the files that the CLI copies into a target Next.js project when installing the "blocks" kit.
4
+
5
+ What the kit includes
6
+
7
+ - UI primitive components (Button, Input, Card, Form primitives, Checkbox, Switch, Toaster)
8
+ - Sections and templates (About, CTA, Contact, Hero variants, Navbar, Pricing, Features, etc.)
9
+ - Theme and provider utilities (theme-provider, enhanced-theme-provider, lib/themes)
10
+ - app/globals.css and placeholder assets used by templates
11
+
12
+ Install behavior
13
+
14
+ > **Alpha note**
15
+ > Other kits (Auth Core, Forms, Data) are currently tested and supported on top of a default Blocks install. For the smoothest experience, run `npx nextworks add blocks` before adding additional kits.
16
+
17
+ - By default, running `npx nextworks add blocks` installs **core UI primitives, sections, and templates** so the example templates work out of the box.
18
+ - You can pass flags to control what gets installed:
19
+ - `npx nextworks add blocks --ui-only` → core UI primitives only (no sections/templates).
20
+ - `npx nextworks add blocks --sections` → core + sections only.
21
+ - `npx nextworks add blocks --templates` → core + templates only.
22
+ - `npx nextworks add blocks --sections --templates` → same as the default (core + sections + templates).
23
+
24
+ Files included are defined in `cli/cli_manifests/blocks_manifest.json` in the Nextworks repository. When updating this kit inside the repo, keep that manifest and this kit folder in sync.
25
+
26
+ Post-install notes
27
+
28
+ 1. Install dependencies copied by the kit (the CLI will merge package-deps.json into your package.json):
29
+
30
+ npm install
31
+
32
+ 2. Wrap your app with the AppProviders wrapper in app/layout.tsx to enable fonts, presets, CSS variable injection, session provider, and the app toaster. Example:
33
+
34
+ // at the top of app/layout.tsx
35
+ import "./globals.css"; // optional if you already import it elsewhere in your project
36
+ import AppProviders from "@/components/app-providers";
37
+
38
+ export default function RootLayout({ children }) {
39
+ return (
40
+ <html lang="en">
41
+ <body>
42
+ <AppProviders>
43
+ {children}
44
+ </AppProviders>
45
+ </body>
46
+ </html>
47
+ );
48
+ }
49
+
50
+ Notes:
51
+ - AppProviders imports globals.css for you, so you don't strictly need to import it separately, but ensure you have the file copied into your project (app/globals.css).
52
+ - If you prefer to only use the EnhancedThemeProvider, you can still import it directly from "@/components/enhanced-theme-provider".
53
+
54
+ 3. Ensure `app/globals.css` exists in your project and that Tailwind is configured.
55
+
56
+ 4. Placeholder assets are located under `public/placeholders`. These should already have been copied by the CLI; if you move files around, keep the paths aligned or update the template image references.
57
+
58
+ Publishing notes (for maintainers)
59
+
60
+ - This kit is UI-only and has no server/api or prisma files.
61
+ - The manifest file `cli/cli_manifests/blocks_manifest.json` is used by the CLI to determine which files to copy when you build and publish the `nextworks` CLI.
62
+
63
+ CLI behavior (for maintainers)
64
+
65
+ - The CLI copies the files listed in `cli/cli_manifests/blocks_manifest.json`. Keep that manifest and this kit folder in sync when editing the Nextworks repo.