@electric-agent/agent 1.1.9 → 1.4.0

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.
@@ -1 +1 @@
1
- {"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../../src/cli/serve.ts"],"names":[],"mappings":"AAYA,wBAAsB,YAAY,CAAC,IAAI,EAAE;IACxC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,IAAI,CAAC,EAAE,OAAO,CAAA;CACd,GAAG,OAAO,CAAC,IAAI,CAAC,CA+IhB"}
1
+ {"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../../src/cli/serve.ts"],"names":[],"mappings":"AAUA,wBAAsB,YAAY,CAAC,IAAI,EAAE;IACxC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,IAAI,CAAC,EAAE,OAAO,CAAA;CACd,GAAG,OAAO,CAAC,IAAI,CAAC,CAkHhB"}
package/dist/cli/serve.js CHANGED
@@ -2,8 +2,6 @@ import { execFileSync, spawn } from "node:child_process";
2
2
  import path from "node:path";
3
3
  import { fileURLToPath } from "node:url";
4
4
  import { RoomRegistry } from "@electric-agent/studio/room-registry";
5
- import { DaytonaSandboxProvider } from "@electric-agent/studio/sandbox/daytona";
6
- import { getSnapshotStatus } from "@electric-agent/studio/sandbox/daytona-registry";
7
5
  import { DockerSandboxProvider } from "@electric-agent/studio/sandbox/docker";
8
6
  import { SpritesSandboxProvider } from "@electric-agent/studio/sandbox/sprites";
9
7
  import { startWebServer } from "@electric-agent/studio/server";
@@ -20,42 +18,14 @@ export async function serveCommand(opts) {
20
18
  }
21
19
  // Select sandbox provider:
22
20
  // SANDBOX_RUNTIME=docker → always Docker
23
- // SANDBOX_RUNTIME=daytona → always Daytona
24
- // (unset) → Daytona if DAYTONA_API_KEY is set, otherwise Docker
21
+ // SANDBOX_RUNTIME=sprites → always Sprites
22
+ // (unset) → Sprites if FLY_API_TOKEN is set, otherwise Docker
25
23
  const runtime = process.env.SANDBOX_RUNTIME?.toLowerCase();
26
24
  let sandbox;
27
25
  if (runtime === "docker") {
28
26
  sandbox = new DockerSandboxProvider();
29
27
  console.log("[serve] Sandbox runtime: Docker (SANDBOX_RUNTIME=docker)");
30
28
  }
31
- else if (runtime === "daytona" || (!runtime && process.env.DAYTONA_API_KEY)) {
32
- if (!process.env.DAYTONA_API_KEY) {
33
- console.error("Error: SANDBOX_RUNTIME=daytona requires DAYTONA_API_KEY to be set.");
34
- process.exit(1);
35
- }
36
- sandbox = new DaytonaSandboxProvider({
37
- apiKey: process.env.DAYTONA_API_KEY,
38
- apiUrl: process.env.DAYTONA_API_URL,
39
- target: process.env.DAYTONA_TARGET,
40
- });
41
- console.log(`[serve] Sandbox runtime: Daytona (target: ${process.env.DAYTONA_TARGET ?? "eu"})`);
42
- // Check snapshot status (non-blocking)
43
- const { Daytona } = await import("@daytonaio/sdk");
44
- const daytona = new Daytona({
45
- apiKey: process.env.DAYTONA_API_KEY,
46
- apiUrl: process.env.DAYTONA_API_URL,
47
- target: process.env.DAYTONA_TARGET ?? "eu",
48
- });
49
- const snapshotImage = process.env.SANDBOX_IMAGE || "electric-agent-sandbox";
50
- const status = await getSnapshotStatus(daytona, snapshotImage);
51
- if (status.exists) {
52
- console.log(`[serve] Snapshot "${snapshotImage}": ${status.state}`);
53
- }
54
- else {
55
- console.log(`[serve] Snapshot "${snapshotImage}" not found — will be created on first sandbox creation`);
56
- console.log(`[serve] To pre-push: npm run push:sandbox:daytona`);
57
- }
58
- }
59
29
  else if (runtime === "sprites" || (!runtime && process.env.FLY_API_TOKEN)) {
60
30
  if (!process.env.FLY_API_TOKEN) {
61
31
  console.error("Error: SANDBOX_RUNTIME=sprites requires FLY_API_TOKEN to be set.");
@@ -1 +1 @@
1
- {"version":3,"file":"serve.js","sourceRoot":"","sources":["../../src/cli/serve.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"serve.js","sourceRoot":"","sources":["../../src/cli/serve.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/scaffold/index.ts"],"names":[],"mappings":"AAMA,6EAA6E;AAC7E,UAAU,gBAAgB;IACzB,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACzC,WAAW,CAAC,EAAE,OAAO,CAAA;CACrB;AAKD,MAAM,WAAW,cAAc;IAC9B,UAAU,EAAE,MAAM,CAAA;IAClB,cAAc,EAAE,OAAO,CAAA;IACvB,MAAM,EAAE,MAAM,EAAE,CAAA;CAChB;AAED;;;;;;;;;GASG;AACH,wBAAsB,QAAQ,CAC7B,UAAU,EAAE,MAAM,EAClB,IAAI,CAAC,EAAE;IACN,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,EAAE,gBAAgB,CAAA;CAC3B,GACC,OAAO,CAAC,cAAc,CAAC,CAkJzB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/scaffold/index.ts"],"names":[],"mappings":"AAMA,6EAA6E;AAC7E,UAAU,gBAAgB;IACzB,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACzC,WAAW,CAAC,EAAE,OAAO,CAAA;CACrB;AAKD,MAAM,WAAW,cAAc;IAC9B,UAAU,EAAE,MAAM,CAAA;IAClB,cAAc,EAAE,OAAO,CAAA;IACvB,MAAM,EAAE,MAAM,EAAE,CAAA;CAChB;AAED;;;;;;;;;GASG;AACH,wBAAsB,QAAQ,CAC7B,UAAU,EAAE,MAAM,EAClB,IAAI,CAAC,EAAE;IACN,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,EAAE,gBAAgB,CAAA;CAC3B,GACC,OAAO,CAAC,cAAc,CAAC,CAsJzB"}
@@ -65,6 +65,9 @@ export async function scaffold(projectDir, opts) {
65
65
  // Step 6b: Fix public-dir CSS imports that break Rollup production builds
66
66
  reporter?.log("verbose", "Patching public CSS imports...");
67
67
  patchPublicCssImports(projectDir);
68
+ // Step 6c: Set Electric brand theme colors in __root.tsx
69
+ reporter?.log("verbose", "Patching theme colors...");
70
+ patchThemeColors(projectDir);
68
71
  // Step 7: Copy .env.example -> .env and ensure VITE_PORT is set
69
72
  const envExample = path.join(projectDir, ".env.example");
70
73
  const envFile = path.join(projectDir, ".env");
@@ -178,20 +181,20 @@ function copyTemplateFiles(srcDir, destDir) {
178
181
  }
179
182
  }
180
183
  const ADDED_DEPENDENCIES = {
181
- "@tanstack/db": "0.5.25",
182
- "@tanstack/react-db": "0.1.69",
183
- "@tanstack/electric-db-collection": "0.2.31",
184
- "@electric-sql/client": "1.5.1",
184
+ "@tanstack/db": "0.5.32",
185
+ "@tanstack/react-db": "0.1.76",
186
+ "@tanstack/electric-db-collection": "0.2.40",
187
+ "@electric-sql/client": "1.5.12",
185
188
  "drizzle-orm": "0.45.1",
186
189
  "drizzle-zod": "^0.8.3",
187
190
  postgres: "^3.4",
188
- zod: "^3.24",
191
+ zod: "^3.25",
189
192
  };
190
193
  const ADDED_DEV_DEPENDENCIES = {
191
194
  "drizzle-kit": "0.31.9",
192
195
  vitest: "^3.0.0",
193
- // Playbook packages (@electric-sql/playbook, @tanstack/db-playbook,
194
- // @durable-streams/playbook) come from the KPB template — don't duplicate here.
196
+ // Playbook packages (@electric-sql/playbook, @tanstack/db-playbook)
197
+ // come from the KPB template — don't duplicate here.
195
198
  };
196
199
  const ADDED_SCRIPTS = {
197
200
  generate: "drizzle-kit generate",
@@ -294,6 +297,58 @@ function patchPublicCssImports(projectDir) {
294
297
  fs.writeFileSync(rootPath, content, "utf-8");
295
298
  }
296
299
  }
300
+ function patchThemeColors(projectDir) {
301
+ const rootPath = path.join(projectDir, "src/routes/__root.tsx");
302
+ if (!fs.existsSync(rootPath))
303
+ return;
304
+ let content = fs.readFileSync(rootPath, "utf-8");
305
+ // Replace KPB default accentColor="blue" (or any other) with Electric brand violet
306
+ // Also add grayColor, radius, and panelBackground if not present
307
+ const themeRegex = /<Theme\b([^>]*)>/;
308
+ const match = content.match(themeRegex);
309
+ if (match) {
310
+ let attrs = match[1];
311
+ // Replace or add accentColor
312
+ if (attrs.includes("accentColor")) {
313
+ attrs = attrs.replace(/accentColor="[^"]*"/, 'accentColor="violet"');
314
+ }
315
+ else {
316
+ attrs += ' accentColor="violet"';
317
+ }
318
+ // Replace or add grayColor
319
+ if (attrs.includes("grayColor")) {
320
+ attrs = attrs.replace(/grayColor="[^"]*"/, 'grayColor="mauve"');
321
+ }
322
+ else {
323
+ attrs += ' grayColor="mauve"';
324
+ }
325
+ // Replace or add radius
326
+ if (attrs.includes("radius=")) {
327
+ attrs = attrs.replace(/radius="[^"]*"/, 'radius="medium"');
328
+ }
329
+ else {
330
+ attrs += ' radius="medium"';
331
+ }
332
+ // Replace or add panelBackground
333
+ if (attrs.includes("panelBackground")) {
334
+ attrs = attrs.replace(/panelBackground="[^"]*"/, 'panelBackground="translucent"');
335
+ }
336
+ else {
337
+ attrs += ' panelBackground="translucent"';
338
+ }
339
+ content = content.replace(themeRegex, `<Theme${attrs}>`);
340
+ fs.writeFileSync(rootPath, content, "utf-8");
341
+ }
342
+ // Add Electric brand CSS custom properties to styles.css if present
343
+ const stylesPath = path.join(projectDir, "src/styles.css");
344
+ if (fs.existsSync(stylesPath)) {
345
+ let styles = fs.readFileSync(stylesPath, "utf-8");
346
+ if (!styles.includes("--electric-brand")) {
347
+ styles += `\n:root {\n --electric-brand: #d0bcff;\n --electric-teal: #00d2a0;\n}\n`;
348
+ fs.writeFileSync(stylesPath, styles, "utf-8");
349
+ }
350
+ }
351
+ }
297
352
  function patchGitignore(projectDir) {
298
353
  const gitignorePath = path.join(projectDir, ".gitignore");
299
354
  let content = "";
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/scaffold/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/scaffold/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAC7C,OAAO,EAAE,MAAM,SAAS,CAAA;AACxB,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AACxC,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AAQzC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;AAC9D,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,gBAAgB,CAAC,CAAA;AAQ7D;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC7B,UAAkB,EAClB,IAKC;IAED,MAAM,MAAM,GAAa,EAAE,CAAA;IAC3B,MAAM,QAAQ,GAAG,IAAI,EAAE,QAAQ,CAAA;IAC/B,IAAI,cAAc,GAAG,IAAI,EAAE,WAAW,IAAI,KAAK,CAAA;IAE/C,6BAA6B;IAC7B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAChC,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAC9C,CAAC;IACD,IAAI,CAAC;QACJ,QAAQ,EAAE,GAAG,CAAC,SAAS,EAAE,qCAAqC,CAAC,CAAA;QAC/D,QAAQ,CAAC,gCAAgC,UAAU,KAAK,EAAE;YACzD,KAAK,EAAE,MAAM;YACb,OAAO,EAAE,OAAO;SAChB,CAAC,CAAA;QACF,QAAQ,EAAE,GAAG,CAAC,SAAS,EAAE,qBAAqB,CAAC,CAAA;IAChD,CAAC;IAAC,OAAO,CAAU,EAAE,CAAC;QACrB,MAAM,GAAG,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAA;QAC7D,MAAM,IAAI,KAAK,CAAC,iCAAiC,GAAG,EAAE,CAAC,CAAA;IACxD,CAAC;IAED,2DAA2D;IAC3D,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,CAAA;IACzD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CACd,8CAA8C,UAAU,+BAA+B;YACtF,8CAA8C,CAC/C,CAAA;IACF,CAAC;IAED,sCAAsC;IACtC,QAAQ,EAAE,GAAG,CAAC,SAAS,EAAE,uCAAuC,WAAW,KAAK,CAAC,CAAA;IACjF,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QACjC,QAAQ,EAAE,GAAG,CACZ,OAAO,EACP,mCAAmC,WAAW,qEAAqE,CACnH,CAAA;IACF,CAAC;IACD,iBAAiB,CAAC,WAAW,EAAE,UAAU,CAAC,CAAA;IAC1C,QAAQ,EAAE,GAAG,CAAC,SAAS,EAAE,2BAA2B,CAAC,CAAA;IAErD,gDAAgD;IAChD,QAAQ,EAAE,GAAG,CAAC,SAAS,EAAE,2CAA2C,CAAC,CAAA;IACrE,iBAAiB,CAAC,UAAU,EAAE,IAAI,EAAE,WAAW,CAAC,CAAA;IAEhD,2EAA2E;IAC3E,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,gBAAgB,CAAC,CAAA;IACxD,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAA;QACvB,QAAQ,EAAE,GAAG,CAAC,SAAS,EAAE,8BAA8B,CAAC,CAAA;IACzD,CAAC;IAED,+BAA+B;IAC/B,QAAQ,EAAE,GAAG,CAAC,SAAS,EAAE,4BAA4B,CAAC,CAAA;IACtD,eAAe,CAAC,UAAU,CAAC,CAAA;IAE3B,8CAA8C;IAC9C,cAAc,CAAC,UAAU,CAAC,CAAA;IAE1B,0EAA0E;IAC1E,QAAQ,EAAE,GAAG,CAAC,SAAS,EAAE,gCAAgC,CAAC,CAAA;IAC1D,qBAAqB,CAAC,UAAU,CAAC,CAAA;IAEjC,yDAAyD;IACzD,QAAQ,EAAE,GAAG,CAAC,SAAS,EAAE,0BAA0B,CAAC,CAAA;IACpD,gBAAgB,CAAC,UAAU,CAAC,CAAA;IAE5B,gEAAgE;IAChE,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,CAAA;IACxD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAA;IAC7C,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC1D,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAA;QACpC,QAAQ,EAAE,GAAG,CAAC,SAAS,EAAE,6BAA6B,CAAC,CAAA;IACxD,CAAC;IACD,kEAAkE;IAClE,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,MAAM,UAAU,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;QACpD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;YACvC,EAAE,CAAC,cAAc,CAAC,OAAO,EAAE,oBAAoB,CAAC,CAAA;QACjD,CAAC;IACF,CAAC;IAED,kDAAkD;IAClD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAA;IAChD,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAC3C,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,EAAE,iBAAiB,EAAE,OAAO,CAAC,CAAA;IAC9E,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,EAAE,qBAAqB,EAAE,OAAO,CAAC,CAAA;IACnF,QAAQ,EAAE,GAAG,CAAC,SAAS,EAAE,0CAA0C,CAAC,CAAA;IAEpE,2BAA2B;IAC3B,cAAc,CAAC,UAAU,CAAC,CAAA;IAE1B,gCAAgC;IAChC,2EAA2E;IAC3E,uEAAuE;IACvE,IAAI,CAAC,cAAc,EAAE,CAAC;QACrB,IAAI,CAAC;YACJ,MAAM,SAAS,GAAG,oBAAoB,CAAC,UAAU,CAAC,CAAA;YAClD,MAAM,QAAQ,GAAG,SAAS,KAAK,MAAM,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,EAAE,CAAA;YAClE,QAAQ,EAAE,GAAG,CAAC,SAAS,EAAE,WAAW,SAAS,aAAa,CAAC,CAAA;YAC3D,QAAQ,CAAC,GAAG,SAAS,WAAW,QAAQ,EAAE,EAAE;gBAC3C,GAAG,EAAE,UAAU;gBACf,KAAK,EAAE,MAAM;gBACb,OAAO,EAAE,OAAO;aAChB,CAAC,CAAA;YACF,QAAQ,EAAE,GAAG,CAAC,SAAS,EAAE,qCAAqC,CAAC,CAAA;QAChE,CAAC;QAAC,OAAO,CAAU,EAAE,CAAC;YACrB,MAAM,MAAM,GAAI,CAAqC,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAA;YAC/E,MAAM,MAAM,GAAI,CAAqC,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAA;YAC/E,MAAM,QAAQ,GAAG,GAAG,MAAM,KAAK,MAAM,EAAE,CAAC,IAAI,EAAE,CAAA;YAC9C,IAAI,QAAQ,EAAE,WAAW,EAAE,CAAC;gBAC3B,MAAM,CAAC,IAAI,CAAC,4BAA4B,QAAQ,EAAE,CAAC,CAAA;YACpD,CAAC;iBAAM,CAAC;gBACP,MAAM,CAAC,IAAI,CAAC,2BAA2B,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAA;YACjE,CAAC;YACD,cAAc,GAAG,IAAI,CAAA;QACtB,CAAC;IACF,CAAC;IAED,oEAAoE;IACpE,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC;QACpB,QAAQ,EAAE,GAAG,CAAC,OAAO,EAAE,gCAAgC,CAAC,CAAA;QACxD,IAAI,CAAC;YACJ,MAAM,YAAY,GAAG,OAAO,CAAC,UAAU,EAAE,IAAI,EAAE,WAAW,CAAC,CAAA;YAC3D,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,oBAAoB,YAAY,EAAE,CAAC,CAAA;QAC1D,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACZ,MAAM,GAAG,GAAG,oBAAoB,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,EAAE,CAAA;YAC5E,QAAQ,EAAE,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA;YAC3B,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;YAEhB,2EAA2E;YAC3E,iEAAiE;YACjE,IAAI,CAAC;gBACJ,QAAQ,CAAC,kBAAkB,EAAE,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAA;gBAChE,QAAQ,CAAC,8CAA8C,EAAE;oBACxD,GAAG,EAAE,UAAU;oBACf,KAAK,EAAE,MAAM;iBACb,CAAC,CAAA;gBACF,QAAQ,CAAC,uCAAuC,EAAE;oBACjD,GAAG,EAAE,UAAU;oBACf,KAAK,EAAE,MAAM;iBACb,CAAC,CAAA;gBACF,QAAQ,EAAE,GAAG,CAAC,SAAS,EAAE,mCAAmC,CAAC,CAAA;YAC9D,CAAC;YAAC,MAAM,CAAC;gBACR,MAAM,CAAC,IAAI,CAAC,8DAA8D,CAAC,CAAA;YAC5E,CAAC;QACF,CAAC;IACF,CAAC;IAED,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,EAAE,CAAA;AAC9C,CAAC;AAED,SAAS,oBAAoB,CAAC,UAAkB;IAC/C,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,gBAAgB,CAAC,CAAC;QAAE,OAAO,MAAM,CAAA;IACzE,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;QAAE,OAAO,MAAM,CAAA;IACpE,6BAA6B;IAC7B,IAAI,CAAC;QACJ,QAAQ,CAAC,gBAAgB,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAA;QAC7C,OAAO,MAAM,CAAA;IACd,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,KAAK,CAAA;IACb,CAAC;AACF,CAAC;AAED,SAAS,iBAAiB,CAAC,MAAc,EAAE,OAAe;IACzD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC;QAAE,OAAM;IAElC,KAAK,MAAM,KAAK,IAAI,EAAE,CAAC,WAAW,CAAC,MAAM,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QACrE,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,CAAA;QAC7C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,CAAA;QAE/C,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACzB,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;YAC3C,iBAAiB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;QACrC,CAAC;aAAM,CAAC;YACP,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;YACzD,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;QACnC,CAAC;IACF,CAAC;AACF,CAAC;AAED,MAAM,kBAAkB,GAA2B;IAClD,cAAc,EAAE,QAAQ;IACxB,oBAAoB,EAAE,QAAQ;IAC9B,kCAAkC,EAAE,QAAQ;IAC5C,sBAAsB,EAAE,QAAQ;IAChC,aAAa,EAAE,QAAQ;IACvB,aAAa,EAAE,QAAQ;IACvB,QAAQ,EAAE,MAAM;IAChB,GAAG,EAAE,OAAO;CACZ,CAAA;AAED,MAAM,sBAAsB,GAA2B;IACtD,aAAa,EAAE,QAAQ;IACvB,MAAM,EAAE,QAAQ;IAChB,oEAAoE;IACpE,qDAAqD;CACrD,CAAA;AAED,MAAM,aAAa,GAA2B;IAC7C,QAAQ,EAAE,sBAAsB;IAChC,OAAO,EAAE,qBAAqB;IAC9B,SAAS,EAAE,kBAAkB;IAC7B,WAAW,EAAE,2EAA2E;IACxF,UAAU,EAAE,oFAAoF;IAChG,aAAa,EAAE,iCAAiC;IAChD,IAAI,EAAE,YAAY;IAClB,YAAY,EAAE,QAAQ;IACtB,kBAAkB,EAAE,8BAA8B;CAClD,CAAA;AAED,SAAS,iBAAiB,CAAC,UAAkB,EAAE,WAAoB;IAClE,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,CAAA;IACrD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,OAAM;IAEnC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAA;IAEzD,iBAAiB;IACjB,IAAI,WAAW,EAAE,CAAC;QACjB,GAAG,CAAC,IAAI,GAAG,WAAW,CAAA;IACvB,CAAC;IAED,GAAG,CAAC,YAAY,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,YAAY,IAAI,EAAE,CAAC,EAAE,GAAG,kBAAkB,EAAE,CAAA;IACzE,GAAG,CAAC,eAAe,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,eAAe,IAAI,EAAE,CAAC,EAAE,GAAG,sBAAsB,EAAE,CAAA;IACnF,GAAG,CAAC,OAAO,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE,GAAG,aAAa,EAAE,CAAA;IAE1D,EAAE,CAAC,aAAa,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;AACxE,CAAC;AAED,SAAS,eAAe,CAAC,UAAkB;IAC1C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,gBAAgB,CAAC,CAAA;IACxD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAM;IAEpC,IAAI,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;IAEhD,mFAAmF;IACnF,gEAAgE;IAChE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,cAAc,EAAE,iDAAiD,CAAC,CAAA;IAE5F,2EAA2E;IAC3E,+EAA+E;IAC/E,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAChC,OAAO,GAAG,OAAO,CAAC,OAAO,CACxB,2DAA2D,EAC3D,mEAAmE,CACnE,CAAA;IACF,CAAC;IAED,oEAAoE;IACpE,gDAAgD;IAChD,mEAAmE;IACnE,kEAAkE;IAClE,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;QACvC,IAAI,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;YAC/B,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,qBAAqB,EAAE,6BAA6B,CAAC,CAAA;QAChF,CAAC;aAAM,IAAI,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,EAAE,CAAC;YAC1C,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,gBAAgB,EAAE,6BAA6B,CAAC,CAAA;QAC3E,CAAC;IACF,CAAC;IAED,0EAA0E;IAC1E,wDAAwD;IACxD,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QACjC,MAAM,UAAU,GAAG;YAClB,cAAc;YACd,sBAAsB;YACtB,sEAAsE;YACtE,6BAA6B;YAC7B,UAAU;YACV,QAAQ;SACR,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACZ,+CAA+C;QAC/C,IAAI,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;YACtC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,0BAA0B,EAAE,OAAO,UAAU,EAAE,CAAC,CAAA;QAC3E,CAAC;aAAM,CAAC;YACP,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,kBAAkB,EAAE,OAAO,UAAU,EAAE,CAAC,CAAA;QACnE,CAAC;IACF,CAAC;IAED,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAA;AAC7C,CAAC;AAED,yEAAyE;AACzE,sEAAsE;AACtE,yEAAyE;AACzE,qEAAqE;AACrE,SAAS,cAAc,CAAC,WAAmB;IAC1C,qCAAqC;AACtC,CAAC;AAED,SAAS,qBAAqB,CAAC,UAAkB;IAChD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,uBAAuB,CAAC,CAAA;IAC/D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAM;IAEpC,IAAI,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;IAEhD,sEAAsE;IACtE,oDAAoD;IACpD,2EAA2E;IAC3E,yEAAyE;IACzE,kDAAkD;IAClD,EAAE;IACF,uEAAuE;IACvE,uEAAuE;IACvE,oCAAoC;IACpC,MAAM,mBAAmB,GACxB,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAAC,CAAA;IAEvF,IAAI,mBAAmB,EAAE,CAAC;QACzB,8BAA8B;QAC9B,OAAO,GAAG,OAAO,CAAC,OAAO,CACxB,uEAAuE,EACvE,EAAE,CACF,CAAA;QACD,uDAAuD;QACvD,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,wBAAwB,EAAE,yBAAyB,CAAC,CAAA;QAC9E,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAA;IAC7C,CAAC;AACF,CAAC;AAED,SAAS,gBAAgB,CAAC,UAAkB;IAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,uBAAuB,CAAC,CAAA;IAC/D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAM;IAEpC,IAAI,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;IAEhD,mFAAmF;IACnF,iEAAiE;IACjE,MAAM,UAAU,GAAG,kBAAkB,CAAA;IACrC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAA;IACvC,IAAI,KAAK,EAAE,CAAC;QACX,IAAI,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;QAEpB,6BAA6B;QAC7B,IAAI,KAAK,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;YACnC,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,qBAAqB,EAAE,sBAAsB,CAAC,CAAA;QACrE,CAAC;aAAM,CAAC;YACP,KAAK,IAAI,uBAAuB,CAAA;QACjC,CAAC;QAED,2BAA2B;QAC3B,IAAI,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;YACjC,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,mBAAmB,EAAE,mBAAmB,CAAC,CAAA;QAChE,CAAC;aAAM,CAAC;YACP,KAAK,IAAI,oBAAoB,CAAA;QAC9B,CAAC;QAED,wBAAwB;QACxB,IAAI,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;YAC/B,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,gBAAgB,EAAE,iBAAiB,CAAC,CAAA;QAC3D,CAAC;aAAM,CAAC;YACP,KAAK,IAAI,kBAAkB,CAAA;QAC5B,CAAC;QAED,iCAAiC;QACjC,IAAI,KAAK,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC;YACvC,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,yBAAyB,EAAE,+BAA+B,CAAC,CAAA;QAClF,CAAC;aAAM,CAAC;YACP,KAAK,IAAI,gCAAgC,CAAA;QAC1C,CAAC;QAED,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,UAAU,EAAE,SAAS,KAAK,GAAG,CAAC,CAAA;QACxD,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAA;IAC7C,CAAC;IAED,oEAAoE;IACpE,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,gBAAgB,CAAC,CAAA;IAC1D,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,IAAI,MAAM,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAA;QACjD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC;YAC1C,MAAM,IAAI,2EAA2E,CAAA;YACrF,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,CAAA;QAC9C,CAAC;IACF,CAAC;AACF,CAAC;AAED,SAAS,cAAc,CAAC,UAAkB;IACzC,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC,CAAA;IACzD,IAAI,OAAO,GAAG,EAAE,CAAA;IAChB,IAAI,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QAClC,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,aAAa,EAAE,OAAO,CAAC,CAAA;IAClD,CAAC;IAED,MAAM,SAAS,GAAa,EAAE,CAAA;IAC9B,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC;QAAE,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IAC3D,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC;QAAE,SAAS,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA;IACvE,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IAErD,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,OAAO,IAAI,uBAAuB,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAA;QAC1D,EAAE,CAAC,aAAa,CAAC,aAAa,EAAE,OAAO,EAAE,OAAO,CAAC,CAAA;IAClD,CAAC;AACF,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@electric-agent/agent",
3
- "version": "1.1.9",
3
+ "version": "1.4.0",
4
4
  "description": "CLI tool that turns natural-language app descriptions into running reactive Electric SQL + TanStack DB applications",
5
5
  "type": "module",
6
6
  "bin": {
@@ -22,13 +22,12 @@
22
22
  },
23
23
  "dependencies": {
24
24
  "@anthropic-ai/claude-agent-sdk": "^0.1.0",
25
- "@daytonaio/sdk": "^0.144.0",
26
25
  "@durable-streams/client": "^0.2.1",
27
26
  "commander": "^13.1.0",
28
27
  "dotenv": "^17.3.1",
29
28
  "zod": "^3.24.1",
30
- "@electric-agent/protocol": "1.4.0",
31
- "@electric-agent/studio": "1.7.0"
29
+ "@electric-agent/protocol": "1.8.0",
30
+ "@electric-agent/studio": "1.12.0"
32
31
  },
33
32
  "devDependencies": {
34
33
  "@types/node": "^22.15.0",
@@ -43,7 +42,6 @@
43
42
  "serve": "node dist/index.js serve",
44
43
  "test": "node --import tsx --test tests/*.test.ts",
45
44
  "test:e2e:docker": "node --import tsx --test tests/e2e-docker.test.ts",
46
- "test:daytona": "node --import tsx --test tests/e2e-daytona.test.ts",
47
45
  "test:sprites": "node --import tsx --test tests/sprites.test.ts",
48
46
  "clean": "rm -rf dist"
49
47
  }
@@ -19,11 +19,9 @@ Patterns NOT covered by external playbooks. Read playbooks for collections, live
19
19
 
20
20
  ## Drizzle-Zod Integration (CRITICAL)
21
21
 
22
- **Import `z` from `"zod/v4"`** (NOT `"zod"`) — drizzle-zod 0.8.x uses Zod v4 internals. The v4 runtime rejects v3-style overrides with "Invalid element: expected a Zod schema".
22
+ **Import `z` from `"zod/v4"`** (NOT `"zod"`) — drizzle-zod 0.8.x peer-depends on zod >=3.25 which exports v4 as a subpath. The `createSelectSchema` function rejects v3-style overrides with "Invalid element: expected a Zod schema".
23
23
 
24
- **Always override timestamp columns** with `z.union([z.date(), z.string()]).default(() => new Date())` — Electric streams dates as ISO strings, but `createSelectSchema` generates `z.date()` which only accepts Date objects. The `.default()` is critical: it makes timestamps omittable during `collection.insert()` (the DB sets them server-side), while still accepting them when present from Electric sync. Without this, `collection.insert()` throws `SchemaValidationError` on `created_at`/`updated_at`.
25
-
26
- **Do NOT use `z.coerce.date()`** — creates ZodEffects that TanStack DB's schema introspection rejects.
24
+ **Always override timestamp columns** using the TanStack DB pattern from `tanstack-db/collections/SKILL.md`:
27
25
 
28
26
  ```typescript
29
27
  // src/db/zod-schemas.ts
@@ -31,18 +29,27 @@ import { createSelectSchema, createInsertSchema } from "drizzle-zod"
31
29
  import { z } from "zod/v4"
32
30
  import { todos } from "./schema"
33
31
 
34
- const dateOrString = z.union([z.date(), z.string()]).default(() => new Date())
32
+ const dateField = z
33
+ .union([z.string(), z.date()])
34
+ .transform((val) => (typeof val === 'string' ? new Date(val) : val))
35
+ .default(() => new Date())
35
36
 
36
37
  export const todoSelectSchema = createSelectSchema(todos, {
37
- created_at: dateOrString,
38
- updated_at: dateOrString,
38
+ created_at: dateField,
39
+ updated_at: dateField,
39
40
  })
40
41
  export const todoInsertSchema = createInsertSchema(todos, {
41
- created_at: dateOrString.optional(),
42
- updated_at: dateOrString.optional(),
42
+ created_at: dateField.optional(),
43
+ updated_at: dateField.optional(),
43
44
  })
44
45
  ```
45
46
 
47
+ This pattern:
48
+ - Accepts both strings (from Electric sync) and Dates (from local code)
49
+ - Transforms strings to Date objects (proper typing, TInput ⊇ TOutput)
50
+ - Defaults timestamps for `collection.insert()` without explicit values
51
+ - Works with `collection.update()` round-trips (Date passes back through union)
52
+
46
53
  **Use `selectSchema` as the collection schema** — it has defaults for timestamps so `collection.insert()` works without them, and validates fully populated rows from Electric sync.
47
54
 
48
55
  ## parseDates Utility (CRITICAL)
@@ -235,10 +242,9 @@ it("survives JSON round-trip", () => {
235
242
 
236
243
  | WRONG | RIGHT |
237
244
  |-------|-------|
238
- | `import { z } from "zod"` in zod-schemas | `import { z } from "zod/v4"` |
239
- | `createSelectSchema(todos)` without date overrides | Override ALL timestamps: `{ created_at: z.union([z.date(), z.string()]).default(() => new Date()) }` |
240
- | `z.union([z.date(), z.string()])` without `.default()` | Add `.default(() => new Date())` — required for `collection.insert()` to work without timestamps |
241
- | `z.coerce.date()` for timestamps | `z.union([z.date(), z.string()])` |
245
+ | `import { z } from "zod"` in zod-schemas | `import { z } from "zod/v4"` — drizzle-zod 0.8.x rejects v3 overrides |
246
+ | `createSelectSchema(todos)` without date overrides | Override ALL timestamps with `z.union([z.string(), z.date()]).transform(...).default(...)` |
247
+ | `z.date().default(() => new Date())` for timestamps | `z.union([z.string(), z.date()]).transform(val => typeof val === 'string' ? new Date(val) : val).default(() => new Date())` — Electric streams dates as strings |
242
248
  | `import { createInsertSchema } from 'drizzle-orm/zod'` | `from 'drizzle-zod'` |
243
249
  | `import { drizzle } from 'drizzle-orm'` | `from 'drizzle-orm/postgres-js'` |
244
250
  | `import { X } from '@radix-ui/react-icons'` | `from 'lucide-react'` |
@@ -7,10 +7,18 @@ allowed-tools: Read, Write, Edit, Bash, Glob, Grep, AskUserQuestion, Agent, WebS
7
7
 
8
8
  # Create Electric SQL App
9
9
 
10
- You are building a reactive, real-time application using Electric SQL + TanStack DB + Drizzle ORM inside a scaffolded TanStack Start project.
10
+ You are building a **local-first, real-time Electric SQL application** using:
11
+ - **Electric SQL** — Postgres-to-client sync via shapes
12
+ - **TanStack DB** — reactive collections, live queries, optimistic mutations
13
+ - **Drizzle ORM** — schema definitions and migrations
14
+ - **TanStack Start** — React meta-framework with SSR + server functions
15
+
16
+ The project is pre-scaffolded. Database and Electric sync service are provisioned. Your job is to design the data model, implement the app, and get it running.
11
17
 
12
18
  Follow the phases below **in strict order**. Do NOT skip phases or jump ahead.
13
19
 
20
+ ---
21
+
14
22
  ## Phase 0: Clarification
15
23
 
16
24
  Evaluate the description provided in `$ARGUMENTS`.
@@ -20,70 +28,40 @@ Evaluate the description provided in `$ARGUMENTS`.
20
28
  - 50-79: Recognizable app type but light on specifics
21
29
  - 0-49: Too vague to proceed
22
30
 
23
- **If the description scores below 70**, use AskUserQuestion to gather missing details. You can use any combination of formats — single or multiple questions, multiSelect for picking features, headers to group topics, or free-text for open-ended input. Choose whatever format best fits the gaps in the description. Keep questions specific to the described app type.
31
+ **If the description scores below 70**, use AskUserQuestion to gather missing details. Choose whatever format best fits the gaps — single or multiple questions, multiSelect for picking features, headers to group topics, or free-text for open-ended input.
24
32
 
25
- After getting answers, enrich the description mentally and proceed.
33
+ **If the description scores 70+**, proceed immediately.
26
34
 
27
- **If the description scores 70+**, proceed immediately without questions.
35
+ ---
28
36
 
29
- ## Phase 1: Generate PLAN.md
37
+ ## Phase 1: Plan
30
38
 
31
- Based on the description, write a complete `PLAN.md` file with this structure:
39
+ Write a `PLAN.md` file with this structure:
32
40
 
33
41
  ```markdown
34
42
  # [App Name] — Implementation Plan
35
43
 
36
44
  ## App Description
37
- [1-2 sentences]
45
+ [1-2 sentences describing a local-first, real-time Electric SQL application]
38
46
 
39
47
  ## Data Model
40
48
 
41
49
  ### [Entity Name]
42
- \```typescript
43
- export const entityName = pgTable("entity_name", {
44
- id: uuid().primaryKey().defaultRandom(),
45
- // ALL columns with full types, defaults, and relations
46
- created_at: timestamp({ withTimezone: true }).notNull().defaultNow(),
47
- updated_at: timestamp({ withTimezone: true }).notNull().defaultNow(),
48
- })
49
- \```
50
+ - id: UUID, primary key, defaultRandom()
51
+ - [field]: [type], [constraints]
52
+ - created_at: timestamptz, notNull, defaultNow()
53
+ - updated_at: timestamptz, notNull, defaultNow()
54
+ - Relations: [FK references with onDelete cascade]
55
+
50
56
  (Repeat for EVERY entity)
51
57
 
52
58
  ## Implementation Tasks
53
-
54
- ### Phase 1: Data Model & Migrations
55
- - [ ] Read guardrails and playbooks (electric-app-guardrails, schemas, collections, mutations, live-queries)
56
- - [ ] Define all Drizzle table schemas in src/db/schema.ts
57
- - [ ] Derive Zod schemas in src/db/zod-schemas.ts (drizzle-zod, z from "zod/v4", timestamp overrides)
58
- - [ ] Run drizzle-kit generate && drizzle-kit migrate
59
- - [ ] Write schema smoke tests in tests/schema.test.ts
60
- - [ ] Run pnpm test — STOP if tests fail
61
-
62
- ### Phase 2: Collections & API Routes
63
- - [ ] Create collection for each entity in src/db/collections/<entity>.ts
64
- - [ ] Create Electric shape proxy route: src/routes/api/<entity>.ts
65
- - [ ] Create mutation routes: src/routes/api/mutations/<entity>.ts
66
-
67
- ### Phase 3: UI Components
68
- - [ ] Create page routes with useLiveQuery (ssr: false on leaf routes)
69
- - [ ] Implement CRUD operations using mutation fetch calls
70
- - [ ] Style with Radix UI Themes + lucide-react icons
71
-
72
- ### Phase 4: Build & Lint
73
- - [ ] pnpm run build passes
74
- - [ ] pnpm run check passes
75
-
76
- ### Phase 5: Testing
77
- - [ ] Collection insert validation tests in tests/collections.test.ts
78
- - [ ] JSON round-trip tests (parseDates + schema validation)
79
- - [ ] pnpm test passes
80
-
81
- ### Phase 6: Architecture Reference
82
- - [ ] Write ARCHITECTURE.md
83
-
84
- ### Phase 7: Deploy & Preview
85
- - [ ] Run migrations (drizzle-kit generate && drizzle-kit migrate)
86
- - [ ] pnpm dev:start
59
+ - [ ] Phase 2: Discover playbook skills and read relevant ones
60
+ - [ ] Phase 3: Data model schema, zod-schemas, migrations, tests
61
+ - [ ] Phase 4: Collections & API routes
62
+ - [ ] Phase 5: UI components
63
+ - [ ] Phase 6: Build, lint & test
64
+ - [ ] Phase 7: Deploy & preview
87
65
 
88
66
  ## Design Conventions
89
67
  - UUID primary keys with defaultRandom()
@@ -92,211 +70,170 @@ export const entityName = pgTable("entity_name", {
92
70
  - Foreign keys with onDelete: "cascade" where appropriate
93
71
  ```
94
72
 
95
- **Present the plan to the user for approval** using AskUserQuestion:
96
- - "Here is the implementation plan. Should I proceed?"
73
+ **Write PLAN.md to disk first**, then present it for approval using AskUserQuestion:
74
+ - "I've written the implementation plan to PLAN.md. Please review it. Should I proceed?"
97
75
  - Options: "Approve — start building", "Revise — I have feedback", "Cancel"
98
- - If "Revise": ask for feedback, regenerate PLAN.md, present again
76
+ - If "Revise": ask for feedback, update PLAN.md, present again
99
77
  - If "Cancel": stop
100
78
 
101
- Write the approved PLAN.md to disk.
79
+ ---
80
+
81
+ ## Phase 2: Discover & Learn
102
82
 
103
- ## Phase 2: Data Model Validation (CRITICAL GATE)
83
+ After plan approval, discover the playbook skills installed in this project:
104
84
 
105
- This phase validates the data model BEFORE writing any application code. **Do NOT proceed to Phase 3 until tests pass.**
85
+ ```bash
86
+ npx @tanstack/intent list
87
+ ```
106
88
 
107
- ### Step 2a: Write Schema
108
- Write `src/db/schema.ts` with all Drizzle pgTable definitions from PLAN.md.
89
+ This outputs all available skills with their file paths. **Read the following skills** (use the paths from `intent list` output):
109
90
 
110
- Conventions:
111
- - `uuid().primaryKey().defaultRandom()` for IDs
112
- - `timestamp({ withTimezone: true }).notNull().defaultNow()` for timestamps
113
- - `.references(() => table.id, { onDelete: "cascade" })` for FKs
114
- - Do NOT import `relations` from drizzle-orm
91
+ 1. **`electric-new-feature`** — end-to-end Electric feature guide (schema → shapes → collections → mutations → queries). This is your primary implementation reference.
92
+ 2. **`db-core/collection-setup`** collection creation, Electric adapter, schema validation, timestamp handling
93
+ 3. **`db-core/mutations-optimistic`** insert, update, delete, optimistic actions
94
+ 4. **`db-core/live-queries`** query builder API (from, where, join, orderBy, etc.)
95
+ 5. **`react-db`** useLiveQuery, useLiveSuspenseQuery hooks
96
+ 6. **`meta-framework`** — TanStack Start integration, SSR constraints, route preloading
115
97
 
116
- ### Step 2b: Write Zod Schemas
117
- Write `src/db/zod-schemas.ts`:
118
- - Import `z` from `"zod/v4"` (NOT `"zod"`)
119
- - Use `createSelectSchema` and `createInsertSchema` from `drizzle-zod`
120
- - Override ALL timestamp columns: `z.union([z.date(), z.string()]).default(() => new Date())`
121
- - The `.default()` is required for `collection.insert()` to work without timestamps
122
- - Export both select and insert schemas for each entity
98
+ Also read the scaffold helper files you'll use:
99
+ - `src/db/utils.ts` — `parseDates()` (JSON date round-trip) and `generateTxId()` (Electric txid handshake)
100
+ - `src/lib/electric-proxy.ts` `proxyElectricRequest()` (Electric shape proxy for API routes)
101
+ - `tests/helpers/schema-test-utils.ts` `generateValidRow()` / `generateRowWithout()` (test data generation)
123
102
 
124
- ### Step 2c: Run Migrations
103
+ ---
104
+
105
+ ## Phase 3: Data Model (CRITICAL GATE)
106
+
107
+ Validate the data model BEFORE writing application code. **Do NOT proceed until tests pass.**
108
+
109
+ ### 3a: Write Drizzle Schema
110
+ Write `src/db/schema.ts` with all pgTable definitions from PLAN.md.
111
+
112
+ ### 3b: Write Zod Schemas
113
+ Write `src/db/zod-schemas.ts` using `createSelectSchema` / `createInsertSchema` from `drizzle-zod`.
114
+
115
+ **Scaffold-specific gotcha — zod/v4 import:**
116
+ ```typescript
117
+ import { z } from "zod/v4" // NOT "zod" — drizzle-zod 0.8.x rejects v3 overrides
118
+ ```
119
+ Playbook examples show `import { z } from "zod"` — in THIS project, always use `"zod/v4"`.
120
+
121
+ Override ALL timestamp columns — the pattern is in the `db-core/collection-setup` skill.
122
+
123
+ ### 3c: Run Migrations
125
124
  ```bash
126
125
  pnpm drizzle-kit generate && pnpm drizzle-kit migrate
127
126
  ```
128
127
 
129
- ### Step 2d: Write Schema Tests
130
- Write `tests/schema.test.ts`:
131
- ```typescript
132
- import { generateValidRow, generateRowWithout } from "./helpers/schema-test-utils"
133
- import { entitySelectSchema } from "@/db/zod-schemas"
134
-
135
- describe("entity schema", () => {
136
- it("accepts a complete row", () => {
137
- expect(entitySelectSchema.safeParse(generateValidRow(entitySelectSchema)).success).toBe(true)
138
- })
139
- it("rejects without id", () => {
140
- expect(entitySelectSchema.safeParse(generateRowWithout(entitySelectSchema, "id")).success).toBe(false)
141
- })
142
- })
143
- ```
128
+ ### 3d: Write & Run Tests
129
+ Write `tests/schema.test.ts` using `generateValidRow(schema)` and `generateRowWithout(schema, field)` from `tests/helpers/schema-test-utils.ts`.
144
130
 
145
- **Rules:**
146
- - DO NOT import collection files — they connect to Electric on import
147
- - DO NOT import `@/db` — requires Postgres
131
+ **Test rules:**
148
132
  - ONLY import from `@/db/zod-schemas` and `@/db/schema`
133
+ - DO NOT import collection files (they connect to Electric on import)
134
+ - DO NOT import `@/db` (requires Postgres)
149
135
  - Use `generateValidRow(schema)` — never hand-write test data
150
136
 
151
- ### Step 2e: Run Tests
152
137
  ```bash
153
138
  pnpm test
154
139
  ```
155
140
 
156
- **If tests fail**: fix the schema/zod-schemas and re-run. Do NOT proceed until green.
157
- **If tests pass**: mark Phase 1 tasks as `[x]` in PLAN.md and continue.
141
+ **If tests fail**: fix and re-run. Do NOT proceed until green.
142
+
143
+ ---
144
+
145
+ ## Phase 4: Collections & API Routes
158
146
 
159
- ## Phase 3: Collections & API Routes
147
+ Follow the patterns from the `electric-new-feature` and `db-core/collection-setup` skills.
160
148
 
161
- ### Collections
162
- For each entity, create `src/db/collections/<entity>.ts`:
163
- - Import the select schema from `@/db/zod-schemas`
164
- - Use absolute URL for `shapeOptions.url`:
165
- ```typescript
166
- url: new URL("/api/<entity>", typeof window !== "undefined" ? window.location.origin : "http://localhost:5174").toString()
167
- ```
149
+ **For each entity, create:**
150
+ 1. **Collection** `src/db/collections/<entity>.ts`
151
+ 2. **Electric shape proxy route** — `src/routes/api/<entity>.ts` using `proxyElectricRequest()` from `src/lib/electric-proxy.ts`
152
+ 3. **Mutation route** `src/routes/api/mutations/<entity>.ts` using `parseDates()` from `src/db/utils.ts`
168
153
 
169
- ### API Routes
154
+ **Scaffold-specific patterns:**
170
155
 
171
- **Electric Shape Proxy** (`src/routes/api/<entity>.ts`):
156
+ Shape proxy routes use the scaffold helper:
172
157
  ```typescript
173
- import { createFileRoute } from "@tanstack/react-router"
174
158
  import { proxyElectricRequest } from "@/lib/electric-proxy"
175
-
176
- export const Route = createFileRoute("/api/<entity>")({
177
- // @ts-expect-error – server.handlers types lag behind runtime support
178
- server: {
179
- handlers: {
180
- GET: async ({ request }: { request: Request }) => {
181
- return proxyElectricRequest(request, "<table_name>")
182
- },
183
- },
184
- },
185
- })
159
+ // In GET handler: return proxyElectricRequest(request, "table_name")
186
160
  ```
187
161
 
188
- **Mutation Route** (`src/routes/api/mutations/<entity>.ts`):
189
- - Use `parseDates(await request.json())` for all handlers
190
- - PUT/PATCH: destructure out `created_at` and `updated_at` before spreading
191
- - Return `{ txid }` from each mutation
192
-
193
- ## Phase 4: UI Components
194
-
195
- - Create page routes with `useLiveQuery` — add `ssr: false` to leaf routes (NOT `__root.tsx`)
196
- - Wrap `useLiveQuery` components in `ClientOnly` when used from `__root.tsx`
197
- - Use `lucide-react` for icons (NOT `@radix-ui/react-icons`)
198
- - Style with Radix UI Themes components
199
-
200
- ## Phase 5: Build & Verify
201
-
202
- Run the build tool:
203
- ```bash
204
- pnpm run build && pnpm run check
162
+ Mutation routes must use `parseDates()` for JSON date round-trip:
163
+ ```typescript
164
+ import { parseDates } from "@/db/utils"
165
+ // const body = parseDates(await request.json())
205
166
  ```
206
167
 
207
- Fix any errors. Re-run until clean.
168
+ API routes use `createFileRoute` + `server.handlers` (NOT `createAPIFileRoute`).
208
169
 
209
- ## Phase 6: Final Tests
170
+ ---
210
171
 
211
- Write additional tests:
212
- - `tests/collections.test.ts` — collection insert validation (import from zod-schemas only)
213
- - JSON round-trip test: `parseDates(JSON.parse(JSON.stringify(row)))` validates correctly
172
+ ## Phase 5: UI Components
214
173
 
215
- Run `pnpm test` fix until green.
174
+ **Before writing UI code**, read the ui-design skill:
175
+ - `.claude/skills/ui-design/SKILL.md` — design system, Radix UI Themes component patterns
216
176
 
217
- ## Phase 7: Architecture Reference
177
+ Also read the `react-db` and `meta-framework` skills for hook usage and SSR patterns.
218
178
 
219
- Write `ARCHITECTURE.md` in the project root (under 1500 tokens):
220
- ```markdown
221
- # [App Name]Architecture Reference
222
- _Last updated: [ISO date]_
179
+ Key constraints:
180
+ - `ssr: false` on leaf routes that use `useLiveQuery` (NEVER on `__root.tsx`)
181
+ - All UI from `@radix-ui/themes` never raw HTML for interactive elements
182
+ - Icons from `lucide-react` only
223
183
 
224
- ## App Description
225
- ## Data Model
226
- ### [Entity] (`table_name`)
227
- - **Columns**: ...
228
- - **Relations**: ...
229
- - **Collection**: src/db/collections/...
184
+ ---
230
185
 
231
- ## API Routes
232
- | Method | Path | File | Purpose |
186
+ ## Phase 6: Build, Lint & Test
233
187
 
234
- ## UI Routes & Components
235
- | Route | File | Description |
188
+ ```bash
189
+ pnpm run build && pnpm run check
190
+ ```
236
191
 
237
- ### Key Components
192
+ Fix any errors. Then write additional tests:
193
+ - `tests/collections.test.ts` — collection insert validation (import from zod-schemas only)
194
+ - JSON round-trip: `parseDates(JSON.parse(JSON.stringify(row)))` validates correctly
238
195
 
239
- ## Styling
240
- ## State & Context
196
+ ```bash
197
+ pnpm test
241
198
  ```
242
199
 
243
- ## Phase 8: Deploy & Preview
200
+ Fix until green.
201
+
202
+ ---
244
203
 
245
- Start the dev server so the user can preview the app:
204
+ ## Phase 7: Deploy & Preview
246
205
 
206
+ Run migrations and start the dev server:
247
207
  ```bash
208
+ pnpm drizzle-kit generate && pnpm drizzle-kit migrate
248
209
  pnpm dev:start
249
210
  ```
250
211
 
251
- **IMPORTANT**: Always use `pnpm dev:start` from the project directory. Do NOT use `sprite-env services create` or launch Vite manually — the project's `vite.config.ts` contains required settings (`allowedHosts`, `port`, `proxy`) that will not be applied if Vite is started from a different directory.
212
+ **IMPORTANT**: Always use `pnpm dev:start` from the project directory.
252
213
 
253
- After starting, the app is accessible at the preview URL (shown in the UI).
214
+ After the app is running, write `ARCHITECTURE.md` (brief reference: entities, routes, components).
254
215
 
255
- ## Critical Rules (from electric-app-guardrails)
256
-
257
- - `z` from `"zod/v4"` — NEVER from `"zod"`
258
- - ALL timestamp columns get `z.union([z.date(), z.string()]).default(() => new Date())`
259
- - NEVER use `z.coerce.date()` — creates ZodEffects rejected by TanStack DB
260
- - Mutation routes MUST use `parseDates(await request.json())`
261
- - PUT/PATCH: destructure out `created_at`, `updated_at` before spreading
262
- - `shapeOptions.url` MUST be absolute URL
263
- - API routes use `createFileRoute` + `server.handlers` — NOT `createAPIFileRoute` or `createServerFileRoute`
264
- - Icons from `lucide-react` only
265
- - `ssr: false` on leaf routes with `useLiveQuery`, NEVER on `__root.tsx`
266
- - `ClientOnly` wrapper for `useLiveQuery` in `__root.tsx`
267
- - Schema tests: import from `@/db/zod-schemas` only, NEVER from collections or `@/db`
268
-
269
- ## Drizzle Workflow Order (ALWAYS follow)
270
-
271
- 1. Edit `src/db/schema.ts`
272
- 2. Edit `src/db/zod-schemas.ts` (derive via drizzle-zod)
273
- 3. `pnpm drizzle-kit generate && pnpm drizzle-kit migrate`
274
- 4. Create collections
275
- 5. Create API routes (proxy + mutation)
276
- 6. Create UI components
216
+ Then invoke the UI design skill for interactive refinement:
217
+ ```
218
+ /ui-design
219
+ ```
277
220
 
278
- ## Deployment & Preview (Sprites / Cloud Sandboxes)
221
+ ---
279
222
 
280
- When the app runs inside a cloud sandbox (Fly.io Sprite), the following constraints apply:
223
+ ## Scaffold Gotchas (not in playbooks)
281
224
 
282
- - **Port 8080 is the ONLY externally accessible port.** The Sprite HTTP proxy routes all traffic to port 8080 inside the VM. The app MUST listen on this port this is pre-configured via the `VITE_PORT` environment variable (set to `8080` in sprites, `5173` in Docker).
283
- - **The app MUST bind to `0.0.0.0`**, not `localhost`. This is pre-configured in `vite.config.ts` via `host: true`.
284
- - **`allowedHosts: true`** is set in `vite.config.ts` so that Sprite hostnames (`*.sprites.app`) can access the dev server. Without this, Vite rejects requests from non-localhost origins.
285
- - **The preview URL** follows the pattern: `https://<sprite-name>.sprites.app`
286
- - **`vite.config.ts` is pre-configured** with `port`, `host: true`, `allowedHosts: true`, and the Electric proxy — **DO NOT MODIFY it**. Changing it WILL break the preview.
225
+ These are specific to this scaffold and NOT covered by playbook skills:
287
226
 
288
- **ALWAYS use `pnpm dev:start`** to start the dev server. This script runs Vite from the project directory where `vite.config.ts` is located. **DO NOT use `sprite-env services create`** or launch Vite manually — doing so will start Vite from the wrong directory, causing it to miss the config and reject Sprite hostnames with `allowedHosts` errors.
227
+ 1. **`zod/v4` import** Always `import { z } from "zod/v4"`, never `"zod"`. Playbooks show `"zod"` but drizzle-zod 0.8.x in this project requires the v4 subpath export.
289
228
 
290
- After finishing all code generation, always run migrations then `pnpm dev:start` so the user can preview.
229
+ 2. **Protected files DO NOT MODIFY:**
230
+ docker-compose.yml, vite.config.ts, tsconfig.json, biome.json, pnpm-lock.yaml, postgres.conf, vitest.config.ts, Caddyfile, drizzle.config.ts, src/db/index.ts, src/db/utils.ts, src/lib/electric-proxy.ts, src/components/ClientOnly.tsx, tests/helpers/schema-test-utils.ts
291
231
 
292
- ## Scaffold Files (DO NOT MODIFY)
232
+ 3. **Import rules:**
233
+ - `"lucide-react"` for icons (NOT @radix-ui/react-icons)
234
+ - `"@radix-ui/themes"` for components (NOT @radix-ui/react-*)
235
+ - `"react-router"` for routing (NOT react-router-dom)
293
236
 
294
- - `src/db/index.ts` Drizzle client setup
295
- - `src/db/utils.ts` parseDates + generateTxId
296
- - `src/lib/electric-proxy.ts` Electric shape proxy helper
297
- - `src/components/ClientOnly.tsx` — SSR wrapper
298
- - `tests/helpers/schema-test-utils.ts` — generateValidRow/generateRowWithout
299
- - `vitest.config.ts` — test config
300
- - `vite.config.ts` — Vite dev server (port, host, allowedHosts, proxy — see Deployment section)
301
- - `docker-compose.yml` — Postgres + Electric
302
- - `drizzle.config.ts` — Drizzle config
237
+ 4. **Dependency rules:**
238
+ - NEVER remove existing dependencies from package.json
239
+ - Only add new dependencies
@@ -0,0 +1,325 @@
1
+ ---
2
+ name: ui-design
3
+ description: Iterate on the UI design of an Electric SQL app. Reviews current components against Radix UI Themes best practices, suggests improvements, and applies changes interactively. Use after the app is generated to polish the UI.
4
+ allowed-tools: Read, Write, Edit, Bash, Glob, Grep, AskUserQuestion
5
+ ---
6
+
7
+ # UI Design — Interactive Iteration
8
+
9
+ You are helping the user improve the UI of their Electric SQL app. This skill loads the design system and component patterns, then enters an interactive loop to refine the interface.
10
+
11
+ ## Step 1: Audit Current UI
12
+
13
+ Read all route and component files to understand the current UI:
14
+
15
+ ```
16
+ Glob pattern: src/routes/**/*.tsx
17
+ Glob pattern: src/components/**/*.tsx
18
+ ```
19
+
20
+ For each file, check against the rules below and note violations.
21
+
22
+ ## Step 2: Present Findings
23
+
24
+ Show the user a brief summary:
25
+ - What looks good (patterns already followed)
26
+ - What needs improvement (specific violations with file:line references)
27
+ - Quick wins (changes that would have the biggest visual impact)
28
+
29
+ ## Step 3: Interactive Loop
30
+
31
+ Ask the user what they want to focus on. Suggestions:
32
+ - Fix all anti-pattern violations
33
+ - Improve a specific page/component
34
+ - Change the overall aesthetic direction
35
+ - Add missing UI patterns (empty states, loading, delete confirmations)
36
+
37
+ Apply changes, then ask for the next iteration. Repeat until the user is satisfied.
38
+
39
+ ---
40
+
41
+ # Design System Reference
42
+
43
+ ## Default Electric Theme
44
+
45
+ The `__root.tsx` `<Theme>` wrapper MUST use the Electric brand defaults:
46
+
47
+ ```tsx
48
+ <Theme accentColor="violet" grayColor="mauve" radius="medium" panelBackground="translucent">
49
+ ```
50
+
51
+ - `accentColor="violet"` — Electric brand purple
52
+ - `grayColor="mauve"` — gray with violet undertone, cohesive with accent
53
+ - `radius="medium"` — balanced, professional corners
54
+ - `panelBackground="translucent"` — subtle depth on surfaces
55
+
56
+ If `__root.tsx` has a different `accentColor` (e.g. `"blue"`), change it to the values above.
57
+
58
+ CSS custom properties in `styles.css` for Electric brand colors not covered by Radix tokens:
59
+
60
+ ```css
61
+ :root {
62
+ --electric-brand: #d0bcff;
63
+ --electric-teal: #00d2a0;
64
+ }
65
+ ```
66
+
67
+ ---
68
+
69
+ ## Design Thinking
70
+
71
+ ### Design Direction
72
+
73
+ Before making changes, commit to a coherent aesthetic:
74
+ - Understand the app's purpose and audience
75
+ - The Electric theme provides a polished violet-on-dark foundation — lean into it
76
+ - Pick a direction that complements the Electric brand: clean professional, modern minimal, or dark moody work best
77
+ - Every detail must serve that direction — fonts, colors, spacing, component variants
78
+
79
+ ### Typography Rules
80
+
81
+ - NEVER add spacing props on text elements — use `gap` on parent Flex (capsize rule)
82
+ - Work the full typographic range: size, weight, color to establish hierarchy
83
+ - Heading `size="7"` or `size="8"` for page titles, `size="5"` or `size="6"` for section titles, `size="3"` or `size="4"` for labels
84
+ - Use `color="gray"` for secondary text, `weight="medium"` for emphasis
85
+
86
+ ### Color with Conviction
87
+
88
+ - NEVER: timid evenly-distributed palettes, gray-on-gray everything, random accent colors
89
+ - INSTEAD: use the Theme's `accentColor` intentionally — primary actions get accent, secondary get `color="gray"`, destructive get `color="red"`
90
+ - Use Badge `variant="soft"` with semantic colors: green=success, orange=warning, red=error, blue=info
91
+ - Dark backgrounds via `Card variant="surface"` — do not manually set background colors
92
+
93
+ ### Spatial Composition
94
+
95
+ - NEVER: everything centered, uniform padding, flat visual hierarchy
96
+ - INSTEAD: use `justify="between"` for page headers (title left, actions right), consistent gap scale (2=tight, 3=default, 4=comfortable, 6=section), visual weight through Card/Table surfaces
97
+
98
+ ### Anti-patterns (NEVER do)
99
+
100
+ - Raw HTML elements (`<button>`, `<input>`, `<table>`) — always use Radix components
101
+ - Inline `style={{}}` for spacing/colors — use Radix props (p, m, gap, color, variant)
102
+ - Empty pages with just text — always provide empty states with icon + message + action
103
+ - Giant forms without structure — group related fields, use Dialog for create/edit
104
+ - Tables without visual anchoring — use `variant="surface"` or Card wrappers
105
+
106
+ ### Import Rules
107
+
108
+ - Use `@radix-ui/themes` for all components (NOT `@radix-ui/react-*`)
109
+ - Use `lucide-react` for icons (NOT `@radix-ui/react-icons`)
110
+ - NEVER add spacing props directly on Text/Heading — use `gap` on parent Flex
111
+
112
+ ---
113
+
114
+ ## Component Patterns
115
+
116
+ Copy-paste-ready patterns using `@radix-ui/themes` and `lucide-react`.
117
+
118
+ ### Pattern 1: Page Layout
119
+
120
+ Standard page shell with header row.
121
+
122
+ ```tsx
123
+ import { Container, Flex, Heading, Button } from "@radix-ui/themes"
124
+ import { Plus } from "lucide-react"
125
+
126
+ <Container size="3" py="6">
127
+ <Flex direction="column" gap="5">
128
+ <Flex justify="between" align="center">
129
+ <Heading size="6">Items</Heading>
130
+ <Button><Plus size={16} /> Add Item</Button>
131
+ </Flex>
132
+ {/* data table or card list */}
133
+ </Flex>
134
+ </Container>
135
+ ```
136
+
137
+ ### Pattern 2: Data Table
138
+
139
+ Table with status badges and row-level actions.
140
+
141
+ ```tsx
142
+ import { Table, Text, Badge, Flex, IconButton } from "@radix-ui/themes"
143
+ import { Pencil, Trash2 } from "lucide-react"
144
+
145
+ <Table.Root variant="surface">
146
+ <Table.Header>
147
+ <Table.Row>
148
+ <Table.ColumnHeaderCell>Name</Table.ColumnHeaderCell>
149
+ <Table.ColumnHeaderCell>Status</Table.ColumnHeaderCell>
150
+ <Table.ColumnHeaderCell width="80px" />
151
+ </Table.Row>
152
+ </Table.Header>
153
+ <Table.Body>
154
+ {items.map(item => (
155
+ <Table.Row key={item.id}>
156
+ <Table.Cell><Text weight="medium">{item.name}</Text></Table.Cell>
157
+ <Table.Cell>
158
+ <Badge color={item.done ? "green" : "orange"} variant="soft">
159
+ {item.done ? "Done" : "Pending"}
160
+ </Badge>
161
+ </Table.Cell>
162
+ <Table.Cell>
163
+ <Flex gap="2">
164
+ <IconButton size="1" variant="ghost" onClick={...}>
165
+ <Pencil size={14} />
166
+ </IconButton>
167
+ <IconButton size="1" variant="ghost" color="red" onClick={...}>
168
+ <Trash2 size={14} />
169
+ </IconButton>
170
+ </Flex>
171
+ </Table.Cell>
172
+ </Table.Row>
173
+ ))}
174
+ </Table.Body>
175
+ </Table.Root>
176
+ ```
177
+
178
+ ### Pattern 3: Card List
179
+
180
+ For rich content or mobile-friendly layouts.
181
+
182
+ ```tsx
183
+ import { Card, Flex, Text, Badge } from "@radix-ui/themes"
184
+
185
+ <Flex direction="column" gap="3">
186
+ {items.map(item => (
187
+ <Card key={item.id}>
188
+ <Flex justify="between" align="center">
189
+ <Flex direction="column" gap="1">
190
+ <Text weight="medium">{item.title}</Text>
191
+ <Text size="2" color="gray">{item.description}</Text>
192
+ </Flex>
193
+ <Badge variant="soft" color="blue">{item.category}</Badge>
194
+ </Flex>
195
+ </Card>
196
+ ))}
197
+ </Flex>
198
+ ```
199
+
200
+ ### Pattern 4: Create/Edit Dialog
201
+
202
+ ```tsx
203
+ import { Dialog, Flex, Text, TextField, Select, Button } from "@radix-ui/themes"
204
+
205
+ <Dialog.Root open={open} onOpenChange={setOpen}>
206
+ <Dialog.Trigger><Button>Add Item</Button></Dialog.Trigger>
207
+ <Dialog.Content maxWidth="450px">
208
+ <Dialog.Title>New Item</Dialog.Title>
209
+ <Flex direction="column" gap="4" mt="4">
210
+ <label>
211
+ <Text size="2" weight="medium" as="div" mb="1">Name</Text>
212
+ <TextField.Root placeholder="Enter name" value={name}
213
+ onChange={e => setName(e.target.value)} />
214
+ </label>
215
+ <label>
216
+ <Text size="2" weight="medium" as="div" mb="1">Category</Text>
217
+ <Select.Root value={category} onValueChange={setCategory}>
218
+ <Select.Trigger placeholder="Select category" />
219
+ <Select.Content>
220
+ <Select.Item value="a">Category A</Select.Item>
221
+ <Select.Item value="b">Category B</Select.Item>
222
+ </Select.Content>
223
+ </Select.Root>
224
+ </label>
225
+ <Flex gap="3" justify="end" mt="2">
226
+ <Dialog.Close>
227
+ <Button variant="soft" color="gray">Cancel</Button>
228
+ </Dialog.Close>
229
+ <Button onClick={handleSubmit}>Save</Button>
230
+ </Flex>
231
+ </Flex>
232
+ </Dialog.Content>
233
+ </Dialog.Root>
234
+ ```
235
+
236
+ ### Pattern 5: Empty State
237
+
238
+ ```tsx
239
+ import { Flex, Text, Button } from "@radix-ui/themes"
240
+ import { Inbox } from "lucide-react"
241
+
242
+ <Flex direction="column" align="center" gap="3" py="9">
243
+ <Inbox size={48} strokeWidth={1} color="var(--gray-8)" />
244
+ <Text size="4" color="gray">No items yet</Text>
245
+ <Button variant="soft" onClick={...}>Create your first item</Button>
246
+ </Flex>
247
+ ```
248
+
249
+ ### Pattern 6: Delete Confirmation
250
+
251
+ ```tsx
252
+ import { AlertDialog, Flex, Button } from "@radix-ui/themes"
253
+
254
+ <AlertDialog.Root open={!!deleteTarget} onOpenChange={...}>
255
+ <AlertDialog.Content maxWidth="400px">
256
+ <AlertDialog.Title>Delete Item</AlertDialog.Title>
257
+ <AlertDialog.Description size="2">
258
+ This action cannot be undone.
259
+ </AlertDialog.Description>
260
+ <Flex gap="3" justify="end" mt="4">
261
+ <AlertDialog.Cancel>
262
+ <Button variant="soft" color="gray">Cancel</Button>
263
+ </AlertDialog.Cancel>
264
+ <AlertDialog.Action>
265
+ <Button color="red" onClick={handleDelete}>Delete</Button>
266
+ </AlertDialog.Action>
267
+ </Flex>
268
+ </AlertDialog.Content>
269
+ </AlertDialog.Root>
270
+ ```
271
+
272
+ ### Pattern 7: Loading State
273
+
274
+ ```tsx
275
+ import { Flex, Spinner } from "@radix-ui/themes"
276
+
277
+ <Flex align="center" justify="center" py="9">
278
+ <Spinner size="3" />
279
+ </Flex>
280
+ ```
281
+
282
+ ### Pattern 8: Multi-section Navigation
283
+
284
+ ```tsx
285
+ import { TabNav } from "@radix-ui/themes"
286
+
287
+ <TabNav.Root>
288
+ <TabNav.Link href="/tasks" active={pathname === "/tasks"}>Tasks</TabNav.Link>
289
+ <TabNav.Link href="/settings" active={pathname === "/settings"}>Settings</TabNav.Link>
290
+ </TabNav.Root>
291
+ ```
292
+
293
+ ### Pattern 9: Responsive Grid Layout
294
+
295
+ ```tsx
296
+ import { Grid, Card } from "@radix-ui/themes"
297
+
298
+ <Grid columns={{ initial: "1", sm: "2", md: "3" }} gap="4">
299
+ {items.map(item => (
300
+ <Card key={item.id}>...</Card>
301
+ ))}
302
+ </Grid>
303
+ ```
304
+
305
+ ---
306
+
307
+ ## Component Quick Reference
308
+
309
+ | Need | Use | Key props |
310
+ |------|-----|-----------|
311
+ | Data list (many cols) | `Table.Root` | `variant="surface"` |
312
+ | Data list (rich content) | Card list in Flex | `direction="column" gap="3"` |
313
+ | Grid of cards | `Grid` | `columns={{ initial: "1", sm: "2", md: "3" }}` |
314
+ | Create/Edit forms | `Dialog` | `maxWidth="450px"` |
315
+ | Destructive confirm | `AlertDialog` | `maxWidth="400px"` |
316
+ | Status indicator | `Badge` | `variant="soft" color="green/orange/red"` |
317
+ | Primary action | `Button` | default (solid variant) |
318
+ | Secondary action | `Button` | `variant="soft" color="gray"` |
319
+ | Row-level action | `IconButton` | `size="1" variant="ghost"` |
320
+ | Page wrapper | `Container` | `size="2"` or `size="3"` with `py="6"` |
321
+ | Vertical stack | `Flex` | `direction="column" gap="3-5"` |
322
+ | Page header row | `Flex` | `justify="between" align="center"` |
323
+ | Multi-section nav | `TabNav` | with `active` prop on links |
324
+ | Loading | `Spinner` | `size="3"` centered |
325
+ | Empty state | Flex + icon + Text + Button | centered with `py="9"` |