@lumerahq/cli 0.19.11 → 0.19.13
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/dist/index.js +1 -1
- package/dist/{init-QCNR4ULM.js → init-KJOWD2KQ.js} +9 -3
- package/package.json +1 -1
- package/templates/default/AGENTS.md +21 -4
- package/templates/default/_gitignore +0 -1
- package/templates/default/biome.json +1 -1
- package/templates/default/package.json +5 -8
- package/templates/default/pnpm-lock.yaml +4083 -0
- package/templates/default/src/lib/utils.ts +2 -2
- package/templates/default/src/main.tsx +1 -1
- package/templates/default/src/routes/index.tsx +21 -10
- package/templates/default/src/styles.css +96 -2
- package/templates/default/vite.config.ts +1 -4
package/dist/index.js
CHANGED
|
@@ -248,7 +248,7 @@ async function main() {
|
|
|
248
248
|
break;
|
|
249
249
|
// Project
|
|
250
250
|
case "init":
|
|
251
|
-
await import("./init-
|
|
251
|
+
await import("./init-KJOWD2KQ.js").then((m) => m.init(args.slice(1)));
|
|
252
252
|
break;
|
|
253
253
|
case "register":
|
|
254
254
|
await import("./register-QBRKXWNX.js").then((m) => m.register(args.slice(1)));
|
|
@@ -25,7 +25,7 @@ init_auth();
|
|
|
25
25
|
import pc from "picocolors";
|
|
26
26
|
import prompts from "prompts";
|
|
27
27
|
import { execSync } from "child_process";
|
|
28
|
-
import { existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync, rmSync, readlinkSync, symlinkSync } from "fs";
|
|
28
|
+
import { copyFileSync, existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync, rmSync, readlinkSync, symlinkSync } from "fs";
|
|
29
29
|
import { join, resolve } from "path";
|
|
30
30
|
function toTitleCase(str) {
|
|
31
31
|
return str.split(/[-_]/).map((word) => word.charAt(0).toUpperCase() + word.slice(1)).join(" ");
|
|
@@ -41,6 +41,7 @@ function processTemplate(content, replacements) {
|
|
|
41
41
|
}
|
|
42
42
|
var TEMPLATE_EXCLUDE = /* @__PURE__ */ new Set(["template.json"]);
|
|
43
43
|
var TEMPLATE_RENAMES = /* @__PURE__ */ new Map([["_gitignore", ".gitignore"]]);
|
|
44
|
+
var TEMPLATE_RAW_COPY = /* @__PURE__ */ new Set(["pnpm-lock.yaml"]);
|
|
44
45
|
function copyDir(src, dest, replacements, isRoot = true) {
|
|
45
46
|
if (!existsSync(dest)) {
|
|
46
47
|
mkdirSync(dest, { recursive: true });
|
|
@@ -60,6 +61,10 @@ function copyDir(src, dest, replacements, isRoot = true) {
|
|
|
60
61
|
} else if (entry.isDirectory()) {
|
|
61
62
|
copyDir(srcPath, destPath, replacements, false);
|
|
62
63
|
} else {
|
|
64
|
+
if (TEMPLATE_RAW_COPY.has(entry.name)) {
|
|
65
|
+
copyFileSync(srcPath, destPath);
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
63
68
|
const content = readFileSync(srcPath, "utf-8");
|
|
64
69
|
const processed = processTemplate(content, replacements);
|
|
65
70
|
writeFileSync(destPath, processed);
|
|
@@ -363,6 +368,7 @@ async function init(args) {
|
|
|
363
368
|
];
|
|
364
369
|
copyDir(templateDir, targetDir, replacements);
|
|
365
370
|
ensureClaudeInstructionsLink(targetDir);
|
|
371
|
+
const installCommand = existsSync(join(targetDir, "pnpm-lock.yaml")) ? "pnpm install --frozen-lockfile" : "pnpm install";
|
|
366
372
|
function listFiles(dir, prefix = "") {
|
|
367
373
|
for (const entry of readdirSync(dir, { withFileTypes: true })) {
|
|
368
374
|
const relativePath = prefix + entry.name;
|
|
@@ -405,7 +411,7 @@ async function init(args) {
|
|
|
405
411
|
if (opts.install) {
|
|
406
412
|
const stopInstall = spinner("Installing dependencies...");
|
|
407
413
|
try {
|
|
408
|
-
execSync(
|
|
414
|
+
execSync(installCommand, { cwd: targetDir, stdio: "ignore" });
|
|
409
415
|
stopInstall(pc.green("\u2713") + pc.dim(" Dependencies installed"));
|
|
410
416
|
} catch {
|
|
411
417
|
stopInstall(pc.yellow("\u26A0") + pc.dim(" Failed to install dependencies"));
|
|
@@ -453,7 +459,7 @@ async function init(args) {
|
|
|
453
459
|
console.log();
|
|
454
460
|
console.log(pc.cyan(` cd ${finalDirectory}`));
|
|
455
461
|
if (!opts.install) {
|
|
456
|
-
console.log(pc.cyan(
|
|
462
|
+
console.log(pc.cyan(` ${installCommand}`));
|
|
457
463
|
}
|
|
458
464
|
if (!registered) {
|
|
459
465
|
console.log(pc.cyan(" lumera login"));
|
package/package.json
CHANGED
|
@@ -17,6 +17,12 @@ src/
|
|
|
17
17
|
scripts/ # Utility scripts (seed data, migrations, etc.)
|
|
18
18
|
```
|
|
19
19
|
|
|
20
|
+
The starter UI is intentionally throwaway. `src/routes/index.tsx` is just the
|
|
21
|
+
default landing page shown before the real app exists, and `index.html` is only
|
|
22
|
+
the Vite shell. When building the user's first real workflow or screen, replace
|
|
23
|
+
the starter home page with the app experience instead of preserving or building
|
|
24
|
+
around the placeholder content.
|
|
25
|
+
|
|
20
26
|
## Lumera Concepts
|
|
21
27
|
|
|
22
28
|
A Lumera app is built from these primitives — all defined as code in `platform/`:
|
|
@@ -49,11 +55,11 @@ For detailed technical reference (data models, relationships, design decisions),
|
|
|
49
55
|
|
|
50
56
|
### Installing components
|
|
51
57
|
|
|
52
|
-
Install shadcn components with `pnpm dlx` (the sandbox's default JS package manager):
|
|
58
|
+
Install shadcn components with `pnpm dlx` (the sandbox's default JS package manager). Match the sandbox-pinned shadcn version:
|
|
53
59
|
|
|
54
60
|
```bash
|
|
55
|
-
pnpm dlx shadcn@
|
|
56
|
-
pnpm dlx shadcn@
|
|
61
|
+
pnpm dlx shadcn@4.1.2 add button card dialog # Install specific components
|
|
62
|
+
pnpm dlx shadcn@4.1.2 add table input label select # Install more as needed
|
|
57
63
|
```
|
|
58
64
|
|
|
59
65
|
Components install into `src/components/ui/` and are fully editable.
|
|
@@ -122,6 +128,17 @@ const invoiceLink = buildShareableAppUrl('/invoices/123', { router: 'hash' });
|
|
|
122
128
|
|
|
123
129
|
When reporting a deployed app, use `launch_url` or `url` from the deploy response. Do not share `iframe_url`; it is only the internal iframe/static asset mount.
|
|
124
130
|
|
|
131
|
+
## Preview and Verification
|
|
132
|
+
|
|
133
|
+
The Studio environment already runs the Vite dev server and exposes it through
|
|
134
|
+
the portal's **Preview tab**. Users are not expected to run local developer
|
|
135
|
+
commands, and raw localhost URLs are not reachable from the Studio portal.
|
|
136
|
+
|
|
137
|
+
**Never tell users to run `pnpm dev`, `pnpm dev:vite`, `npm run dev`, or any
|
|
138
|
+
other dev-server command. Never tell users to open `localhost`, `127.0.0.1`, or
|
|
139
|
+
Vite ports such as `http://localhost:5173/`.** When explaining how to verify UI
|
|
140
|
+
changes, tell them to open the **Preview tab**.
|
|
141
|
+
|
|
125
142
|
|
|
126
143
|
## Workflow
|
|
127
144
|
|
|
@@ -134,7 +151,7 @@ Follow the user's lead. If they tell you exactly what to build, build it. The wo
|
|
|
134
151
|
|
|
135
152
|
### Step 2: Build (one slice at a time)
|
|
136
153
|
4. **Build horizontally** — Pick the first step. Build the full slice: collection schema → `lumera apply` → seed data → UI route/components → commit. Each slice should be deployable and usable on its own.
|
|
137
|
-
5. **Stop and ask for feedback** — Tell the user to open the **Preview tab** to see the app.
|
|
154
|
+
5. **Stop and ask for feedback** — Tell the user to open the **Preview tab** to see the app. Do not mention local dev-server commands or localhost URLs. Iterate on the slice until they're happy.
|
|
138
155
|
6. **Repeat** — Move to the next step. Build, deploy, get feedback.
|
|
139
156
|
|
|
140
157
|
### Rules
|
|
@@ -24,29 +24,26 @@
|
|
|
24
24
|
"check:ci": "biome check . && tsr generate && tsc --noEmit"
|
|
25
25
|
},
|
|
26
26
|
"dependencies": {
|
|
27
|
-
"@lumerahq/ui": "^0.
|
|
27
|
+
"@lumerahq/ui": "^0.9.1",
|
|
28
28
|
"@tanstack/react-query": "^5.90.11",
|
|
29
29
|
"@tanstack/react-router": "1.155.0",
|
|
30
|
-
"@tanstack/router-plugin": "1.155.0",
|
|
31
|
-
"class-variance-authority": "^0.7.1",
|
|
32
30
|
"clsx": "^2.1.1",
|
|
33
31
|
"lucide-react": "^1.7.0",
|
|
34
|
-
"radix-ui": "^1.4.3",
|
|
35
|
-
"shadcn": "^4.1.2",
|
|
36
32
|
"tailwind-merge": "^3.4.0",
|
|
37
|
-
"tw-animate-css": "^1.4.0",
|
|
38
33
|
"react": "^19.2.0",
|
|
39
34
|
"react-dom": "^19.2.0",
|
|
40
|
-
"sonner": "^2.0.7"
|
|
41
|
-
"tailwindcss": "^4.2.2"
|
|
35
|
+
"sonner": "^2.0.7"
|
|
42
36
|
},
|
|
43
37
|
"devDependencies": {
|
|
44
38
|
"@biomejs/biome": "^2.4.10",
|
|
45
39
|
"@tailwindcss/vite": "^4.2.2",
|
|
46
40
|
"@tanstack/router-cli": "1.155.0",
|
|
41
|
+
"@tanstack/router-plugin": "1.155.0",
|
|
47
42
|
"@types/react": "^19.2.14",
|
|
48
43
|
"@types/react-dom": "^19.2.3",
|
|
49
44
|
"@vitejs/plugin-react": "^6.0.1",
|
|
45
|
+
"tailwindcss": "^4.2.2",
|
|
46
|
+
"tw-animate-css": "^1.4.0",
|
|
50
47
|
"typescript": "^6.0.2",
|
|
51
48
|
"vite": "^8.0.3"
|
|
52
49
|
}
|