@pylonsync/create-pylon 0.5.0 → 0.5.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.
Files changed (49) hide show
  1. package/bin/create-pylon.js +27 -5
  2. package/package.json +1 -1
  3. package/templates/_root/AGENTS.md +1 -1
  4. package/templates/agency/AGENTS.md +1 -1
  5. package/templates/agency/app.ts +3 -0
  6. package/templates/ai-chat/AGENTS.md +1 -1
  7. package/templates/ai-chat/app.ts +3 -0
  8. package/templates/ai-studio/AGENTS.md +1 -1
  9. package/templates/ai-studio/app.ts +3 -0
  10. package/templates/backend/b2b/apps/api/schema.ts +3 -0
  11. package/templates/backend/barebones/apps/api/schema.ts +3 -0
  12. package/templates/backend/chat/apps/api/schema.ts +3 -0
  13. package/templates/backend/consumer/apps/api/schema.ts +3 -0
  14. package/templates/backend/todo/apps/api/schema.ts +3 -0
  15. package/templates/barebones/AGENTS.md +1 -1
  16. package/templates/barebones/app.ts +3 -0
  17. package/templates/chat/AGENTS.md +1 -1
  18. package/templates/chat/app.ts +3 -0
  19. package/templates/consumer/AGENTS.md +1 -1
  20. package/templates/consumer/app.ts +3 -0
  21. package/templates/creator/AGENTS.md +1 -1
  22. package/templates/creator/app.ts +3 -0
  23. package/templates/crm/AGENTS.md +1 -1
  24. package/templates/crm/app.ts +3 -0
  25. package/templates/directory/AGENTS.md +1 -1
  26. package/templates/directory/app.ts +3 -0
  27. package/templates/helpdesk/AGENTS.md +1 -1
  28. package/templates/helpdesk/app.ts +3 -0
  29. package/templates/inventory/AGENTS.md +1 -1
  30. package/templates/inventory/app.ts +3 -0
  31. package/templates/invoices/AGENTS.md +1 -1
  32. package/templates/invoices/app.ts +3 -0
  33. package/templates/local-service/AGENTS.md +1 -1
  34. package/templates/local-service/app.ts +3 -0
  35. package/templates/marketplace/AGENTS.md +1 -1
  36. package/templates/marketplace/app.ts +3 -0
  37. package/templates/marketplace/client/market.ts +4 -1
  38. package/templates/projects/AGENTS.md +1 -1
  39. package/templates/projects/app.ts +3 -0
  40. package/templates/restaurant/AGENTS.md +1 -1
  41. package/templates/restaurant/app.ts +3 -0
  42. package/templates/saas/AGENTS.md +1 -1
  43. package/templates/saas/app.ts +3 -0
  44. package/templates/shop/AGENTS.md +1 -1
  45. package/templates/shop/app.ts +3 -0
  46. package/templates/todo/AGENTS.md +1 -1
  47. package/templates/todo/app.ts +3 -0
  48. package/templates/waitlist/AGENTS.md +1 -1
  49. package/templates/waitlist/app.ts +3 -0
@@ -311,6 +311,28 @@ Examples:
311
311
  }
312
312
 
313
313
  const rl = createInterface({ input: stdin, output: stdout });
314
+
315
+ /**
316
+ * Prompt, treating Ctrl+D / Ctrl+C as a deliberate cancel.
317
+ *
318
+ * readline rejects the pending question with an AbortError, which at top
319
+ * level in an ESM script surfaces as an unhandled rejection — so someone who
320
+ * changes their mind at the template picker gets a Node stack trace instead
321
+ * of "cancelled". Nothing has been written to disk at this point, so say so
322
+ * and leave quietly.
323
+ */
324
+ async function ask(question) {
325
+ try {
326
+ return await rl.question(question);
327
+ } catch (err) {
328
+ if (err?.code === "ABORT_ERR") {
329
+ stdout.write("\nCancelled — nothing was created.\n");
330
+ rl.close();
331
+ exit(0);
332
+ }
333
+ throw err;
334
+ }
335
+ }
314
336
  // Non-interactive stdin (CI, piped, `| npm create …`): never block on a prompt.
315
337
  // Fall back to the same defaults the interactive path uses. The skill-install
316
338
  // below already gates on `stdin.isTTY`; the INPUT prompts must too — without
@@ -319,7 +341,7 @@ const rl = createInterface({ input: stdin, output: stdout });
319
341
  const isInteractive = !!stdin.isTTY;
320
342
  if (!projectName) {
321
343
  projectName =
322
- (isInteractive ? (await rl.question("Project name: ")).trim() : "") ||
344
+ (isInteractive ? (await ask("Project name: ")).trim() : "") ||
323
345
  "my-pylon-app";
324
346
  }
325
347
  if (!flags.template) {
@@ -329,7 +351,7 @@ if (!flags.template) {
329
351
  .join("\n");
330
352
  process.stdout.write(`\n${lines}\n`);
331
353
  const ans = (
332
- await rl.question(
354
+ await ask(
333
355
  `Template (${TEMPLATES_AVAILABLE.join(", ")}) [${DEFAULT_TEMPLATE}]: `,
334
356
  )
335
357
  )
@@ -352,7 +374,7 @@ if (!isUnified && !flags.platforms) {
352
374
  const supported = TEMPLATE_REGISTRY[flags.template].platforms.join(", ");
353
375
  const ans = isInteractive
354
376
  ? (
355
- await rl.question(
377
+ await ask(
356
378
  `Platforms for ${flags.template} (${supported}, comma-separated) [web]: `,
357
379
  )
358
380
  ).trim()
@@ -364,7 +386,7 @@ if (!flags.pm) {
364
386
  const def = detected ?? "bun";
365
387
  if (isInteractive) {
366
388
  const choice = (
367
- await rl.question(`Package manager (bun, pnpm, yarn, npm) [${def}]: `)
389
+ await ask(`Package manager (bun, pnpm, yarn, npm) [${def}]: `)
368
390
  )
369
391
  .trim()
370
392
  .toLowerCase();
@@ -376,7 +398,7 @@ if (!flags.pm) {
376
398
  if (flags.skill === undefined) {
377
399
  if (isInteractive) {
378
400
  const ans = (
379
- await rl.question(
401
+ await ask(
380
402
  "Add the Pylon skill to your coding agent (Claude Code / Codex / Cursor)? [Y/n]: ",
381
403
  )
382
404
  )
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pylonsync/create-pylon",
3
- "version": "0.5.0",
3
+ "version": "0.5.3",
4
4
  "description": "Scaffold a new Pylon app — realtime backend + web/mobile/expo frontends in one command. Run via `npm create @pylonsync/pylon@latest`.",
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -5,7 +5,7 @@ Pylon serves the API, auth, sync, WebSocket, SSE, and native React 19 SSR from o
5
5
  ## Directory conventions
6
6
 
7
7
  **Unified SSR app:**
8
- - `app.ts`: data model + manifest (`entity()` + `field.*`, queries/actions/policies, `routes: await discoverAppRoutes()`). Ends with `console.log(JSON.stringify(manifest))`.
8
+ - `app.ts`: data model + manifest (`entity()` + `field.*`, queries/actions/policies, `routes: await discoverAppRoutes()`). Ends with `console.log(JSON.stringify(manifest))` — that line is the manifest handoff (the CLI parses this file's stdout), not debug output. Never remove it.
9
9
  - `app/`: file-based SSR routes. `app/page.tsx` → `/`, `app/about/page.tsx` → `/about`, `app/blog/[slug]/page.tsx` → `/blog/:slug`. A `(group)` directory is stripped from the URL — `app/(marketing)/about/page.tsx` still serves `/about` — so a group's `layout.tsx` gives one section its own chrome (nav, footer) without changing any path; routes outside the group render without it. `app/layout.tsx` is the document shell; `app/error.tsx` / `app/not-found.tsx` are boundaries.
10
10
  - `app/globals.css`: Tailwind v4 entrypoint (auto-compiled and injected).
11
11
  - `functions/`: server functions, one per file, `default`-exported.
@@ -5,7 +5,7 @@ Pylon serves the API, auth, sync, WebSocket, SSE, and native React 19 SSR from o
5
5
  ## Directory conventions
6
6
 
7
7
  **Unified SSR app:**
8
- - `app.ts`: data model + manifest (`entity()` + `field.*`, queries/actions/policies, `routes: await discoverAppRoutes()`). Ends with `console.log(JSON.stringify(manifest))`.
8
+ - `app.ts`: data model + manifest (`entity()` + `field.*`, queries/actions/policies, `routes: await discoverAppRoutes()`). Ends with `console.log(JSON.stringify(manifest))` — that line is the manifest handoff (the CLI parses this file's stdout), not debug output. Never remove it.
9
9
  - `app/`: file-based SSR routes. `app/page.tsx` → `/`, `app/about/page.tsx` → `/about`, `app/blog/[slug]/page.tsx` → `/blog/:slug`. A `(group)` directory is stripped from the URL — `app/(marketing)/about/page.tsx` still serves `/about` — so a group's `layout.tsx` gives one section its own chrome (nav, footer) without changing any path; routes outside the group render without it. `app/layout.tsx` is the document shell; `app/error.tsx` / `app/not-found.tsx` are boundaries.
10
10
  - `app/globals.css`: Tailwind v4 entrypoint (auto-compiled and injected).
11
11
  - `functions/`: server functions, one per file, `default`-exported.
@@ -300,6 +300,9 @@ const manifest = buildManifest({
300
300
  routes: await discoverAppRoutes(),
301
301
  });
302
302
 
303
+ // Not a debug leftover: the CLI runs `bun run app.ts` and parses stdout as
304
+ // your manifest (see crates/cli/src/bun.rs). Deleting this line breaks every
305
+ // pylon command that reads your schema.
303
306
  console.log(JSON.stringify(manifest, null, 2));
304
307
 
305
308
  export default manifest;
@@ -5,7 +5,7 @@ Pylon serves the API, auth, sync, WebSocket, SSE, and native React 19 SSR from o
5
5
  ## Directory conventions
6
6
 
7
7
  **Unified SSR app:**
8
- - `app.ts`: data model + manifest (`entity()` + `field.*`, queries/actions/policies, `routes: await discoverAppRoutes()`). Ends with `console.log(JSON.stringify(manifest))`.
8
+ - `app.ts`: data model + manifest (`entity()` + `field.*`, queries/actions/policies, `routes: await discoverAppRoutes()`). Ends with `console.log(JSON.stringify(manifest))` — that line is the manifest handoff (the CLI parses this file's stdout), not debug output. Never remove it.
9
9
  - `app/`: file-based SSR routes. `app/page.tsx` → `/`, `app/about/page.tsx` → `/about`, `app/blog/[slug]/page.tsx` → `/blog/:slug`. A `(group)` directory is stripped from the URL — `app/(marketing)/about/page.tsx` still serves `/about` — so a group's `layout.tsx` gives one section its own chrome (nav, footer) without changing any path; routes outside the group render without it. `app/layout.tsx` is the document shell; `app/error.tsx` / `app/not-found.tsx` are boundaries.
10
10
  - `app/globals.css`: Tailwind v4 entrypoint (auto-compiled and injected).
11
11
  - `functions/`: server functions, one per file, `default`-exported.
@@ -135,6 +135,9 @@ const manifest = buildManifest({
135
135
  routes: await discoverAppRoutes(),
136
136
  });
137
137
 
138
+ // Not a debug leftover: the CLI runs `bun run app.ts` and parses stdout as
139
+ // your manifest (see crates/cli/src/bun.rs). Deleting this line breaks every
140
+ // pylon command that reads your schema.
138
141
  console.log(JSON.stringify(manifest, null, 2));
139
142
 
140
143
  export default manifest;
@@ -5,7 +5,7 @@ Pylon serves the API, auth, sync, WebSocket, SSE, and native React 19 SSR from o
5
5
  ## Directory conventions
6
6
 
7
7
  **Unified SSR app:**
8
- - `app.ts`: data model + manifest (`entity()` + `field.*`, queries/actions/policies, `routes: await discoverAppRoutes()`). Ends with `console.log(JSON.stringify(manifest))`.
8
+ - `app.ts`: data model + manifest (`entity()` + `field.*`, queries/actions/policies, `routes: await discoverAppRoutes()`). Ends with `console.log(JSON.stringify(manifest))` — that line is the manifest handoff (the CLI parses this file's stdout), not debug output. Never remove it.
9
9
  - `app/`: file-based SSR routes. `app/page.tsx` → `/`, `app/about/page.tsx` → `/about`, `app/blog/[slug]/page.tsx` → `/blog/:slug`. A `(group)` directory is stripped from the URL — `app/(marketing)/about/page.tsx` still serves `/about` — so a group's `layout.tsx` gives one section its own chrome (nav, footer) without changing any path; routes outside the group render without it. `app/layout.tsx` is the document shell; `app/error.tsx` / `app/not-found.tsx` are boundaries.
10
10
  - `app/globals.css`: Tailwind v4 entrypoint (auto-compiled and injected).
11
11
  - `functions/`: server functions, one per file, `default`-exported.
@@ -122,6 +122,9 @@ const manifest = buildManifest({
122
122
  routes: await discoverAppRoutes(),
123
123
  });
124
124
 
125
+ // Not a debug leftover: the CLI runs `bun run app.ts` and parses stdout as
126
+ // your manifest (see crates/cli/src/bun.rs). Deleting this line breaks every
127
+ // pylon command that reads your schema.
125
128
  console.log(JSON.stringify(manifest, null, 2));
126
129
 
127
130
  export default manifest;
@@ -176,4 +176,7 @@ const manifest = buildManifest({
176
176
  routes: [],
177
177
  });
178
178
 
179
+ // Not a debug leftover: the CLI runs `bun run` on this file and parses stdout
180
+ // as your manifest (see crates/cli/src/bun.rs). Deleting this line breaks every
181
+ // pylon command that reads your schema.
179
182
  console.log(JSON.stringify(manifest));
@@ -58,4 +58,7 @@ const manifest = buildManifest({
58
58
  routes: [],
59
59
  });
60
60
 
61
+ // Not a debug leftover: the CLI runs `bun run` on this file and parses stdout
62
+ // as your manifest (see crates/cli/src/bun.rs). Deleting this line breaks every
63
+ // pylon command that reads your schema.
61
64
  console.log(JSON.stringify(manifest));
@@ -93,4 +93,7 @@ const manifest = buildManifest({
93
93
  routes: [],
94
94
  });
95
95
 
96
+ // Not a debug leftover: the CLI runs `bun run` on this file and parses stdout
97
+ // as your manifest (see crates/cli/src/bun.rs). Deleting this line breaks every
98
+ // pylon command that reads your schema.
96
99
  console.log(JSON.stringify(manifest));
@@ -137,4 +137,7 @@ const manifest = buildManifest({
137
137
  routes: [],
138
138
  });
139
139
 
140
+ // Not a debug leftover: the CLI runs `bun run` on this file and parses stdout
141
+ // as your manifest (see crates/cli/src/bun.rs). Deleting this line breaks every
142
+ // pylon command that reads your schema.
140
143
  console.log(JSON.stringify(manifest));
@@ -82,4 +82,7 @@ const manifest = buildManifest({
82
82
  routes: [],
83
83
  });
84
84
 
85
+ // Not a debug leftover: the CLI runs `bun run` on this file and parses stdout
86
+ // as your manifest (see crates/cli/src/bun.rs). Deleting this line breaks every
87
+ // pylon command that reads your schema.
85
88
  console.log(JSON.stringify(manifest));
@@ -5,7 +5,7 @@ Pylon serves the API, auth, sync, WebSocket, SSE, and native React 19 SSR from o
5
5
  ## Directory conventions
6
6
 
7
7
  **Unified SSR app:**
8
- - `app.ts`: data model + manifest (`entity()` + `field.*`, queries/actions/policies, `routes: await discoverAppRoutes()`). Ends with `console.log(JSON.stringify(manifest))`.
8
+ - `app.ts`: data model + manifest (`entity()` + `field.*`, queries/actions/policies, `routes: await discoverAppRoutes()`). Ends with `console.log(JSON.stringify(manifest))` — that line is the manifest handoff (the CLI parses this file's stdout), not debug output. Never remove it.
9
9
  - `app/`: file-based SSR routes. `app/page.tsx` → `/`, `app/about/page.tsx` → `/about`, `app/blog/[slug]/page.tsx` → `/blog/:slug`. A `(group)` directory is stripped from the URL — `app/(marketing)/about/page.tsx` still serves `/about` — so a group's `layout.tsx` gives one section its own chrome (nav, footer) without changing any path; routes outside the group render without it. `app/layout.tsx` is the document shell; `app/error.tsx` / `app/not-found.tsx` are boundaries.
10
10
  - `app/globals.css`: Tailwind v4 entrypoint (auto-compiled and injected).
11
11
  - `functions/`: server functions, one per file, `default`-exported.
@@ -55,6 +55,9 @@ const manifest = buildManifest({
55
55
  routes: await discoverAppRoutes(),
56
56
  });
57
57
 
58
+ // Not a debug leftover: the CLI runs `bun run app.ts` and parses stdout as
59
+ // your manifest (see crates/cli/src/bun.rs). Deleting this line breaks every
60
+ // pylon command that reads your schema.
58
61
  console.log(JSON.stringify(manifest, null, 2));
59
62
 
60
63
  export default manifest;
@@ -5,7 +5,7 @@ Pylon serves the API, auth, sync, WebSocket, SSE, and native React 19 SSR from o
5
5
  ## Directory conventions
6
6
 
7
7
  **Unified SSR app:**
8
- - `app.ts`: data model + manifest (`entity()` + `field.*`, queries/actions/policies, `routes: await discoverAppRoutes()`). Ends with `console.log(JSON.stringify(manifest))`.
8
+ - `app.ts`: data model + manifest (`entity()` + `field.*`, queries/actions/policies, `routes: await discoverAppRoutes()`). Ends with `console.log(JSON.stringify(manifest))` — that line is the manifest handoff (the CLI parses this file's stdout), not debug output. Never remove it.
9
9
  - `app/`: file-based SSR routes. `app/page.tsx` → `/`, `app/about/page.tsx` → `/about`, `app/blog/[slug]/page.tsx` → `/blog/:slug`. A `(group)` directory is stripped from the URL — `app/(marketing)/about/page.tsx` still serves `/about` — so a group's `layout.tsx` gives one section its own chrome (nav, footer) without changing any path; routes outside the group render without it. `app/layout.tsx` is the document shell; `app/error.tsx` / `app/not-found.tsx` are boundaries.
10
10
  - `app/globals.css`: Tailwind v4 entrypoint (auto-compiled and injected).
11
11
  - `functions/`: server functions, one per file, `default`-exported.
@@ -54,6 +54,9 @@ const manifest = buildManifest({
54
54
  routes: await discoverAppRoutes(),
55
55
  });
56
56
 
57
+ // Not a debug leftover: the CLI runs `bun run app.ts` and parses stdout as
58
+ // your manifest (see crates/cli/src/bun.rs). Deleting this line breaks every
59
+ // pylon command that reads your schema.
57
60
  console.log(JSON.stringify(manifest, null, 2));
58
61
 
59
62
  export default manifest;
@@ -5,7 +5,7 @@ Pylon serves the API, auth, sync, WebSocket, SSE, and native React 19 SSR from o
5
5
  ## Directory conventions
6
6
 
7
7
  **Unified SSR app:**
8
- - `app.ts`: data model + manifest (`entity()` + `field.*`, queries/actions/policies, `routes: await discoverAppRoutes()`). Ends with `console.log(JSON.stringify(manifest))`.
8
+ - `app.ts`: data model + manifest (`entity()` + `field.*`, queries/actions/policies, `routes: await discoverAppRoutes()`). Ends with `console.log(JSON.stringify(manifest))` — that line is the manifest handoff (the CLI parses this file's stdout), not debug output. Never remove it.
9
9
  - `app/`: file-based SSR routes. `app/page.tsx` → `/`, `app/about/page.tsx` → `/about`, `app/blog/[slug]/page.tsx` → `/blog/:slug`. A `(group)` directory is stripped from the URL — `app/(marketing)/about/page.tsx` still serves `/about` — so a group's `layout.tsx` gives one section its own chrome (nav, footer) without changing any path; routes outside the group render without it. `app/layout.tsx` is the document shell; `app/error.tsx` / `app/not-found.tsx` are boundaries.
10
10
  - `app/globals.css`: Tailwind v4 entrypoint (auto-compiled and injected).
11
11
  - `functions/`: server functions, one per file, `default`-exported.
@@ -89,6 +89,9 @@ const manifest = buildManifest({
89
89
  routes: await discoverAppRoutes(),
90
90
  });
91
91
 
92
+ // Not a debug leftover: the CLI runs `bun run app.ts` and parses stdout as
93
+ // your manifest (see crates/cli/src/bun.rs). Deleting this line breaks every
94
+ // pylon command that reads your schema.
92
95
  console.log(JSON.stringify(manifest, null, 2));
93
96
 
94
97
  export default manifest;
@@ -5,7 +5,7 @@ Pylon serves the API, auth, sync, WebSocket, SSE, and native React 19 SSR from o
5
5
  ## Directory conventions
6
6
 
7
7
  **Unified SSR app:**
8
- - `app.ts`: data model + manifest (`entity()` + `field.*`, queries/actions/policies, `routes: await discoverAppRoutes()`). Ends with `console.log(JSON.stringify(manifest))`.
8
+ - `app.ts`: data model + manifest (`entity()` + `field.*`, queries/actions/policies, `routes: await discoverAppRoutes()`). Ends with `console.log(JSON.stringify(manifest))` — that line is the manifest handoff (the CLI parses this file's stdout), not debug output. Never remove it.
9
9
  - `app/`: file-based SSR routes. `app/page.tsx` → `/`, `app/about/page.tsx` → `/about`, `app/blog/[slug]/page.tsx` → `/blog/:slug`. A `(group)` directory is stripped from the URL — `app/(marketing)/about/page.tsx` still serves `/about` — so a group's `layout.tsx` gives one section its own chrome (nav, footer) without changing any path; routes outside the group render without it. `app/layout.tsx` is the document shell; `app/error.tsx` / `app/not-found.tsx` are boundaries.
10
10
  - `app/globals.css`: Tailwind v4 entrypoint (auto-compiled and injected).
11
11
  - `functions/`: server functions, one per file, `default`-exported.
@@ -148,6 +148,9 @@ const manifest = buildManifest({
148
148
  });
149
149
 
150
150
  // Emit the canonical manifest JSON to stdout — `pylon dev` captures this.
151
+ // Not a debug leftover: the CLI runs `bun run app.ts` and parses stdout as
152
+ // your manifest (see crates/cli/src/bun.rs). Deleting this line breaks every
153
+ // pylon command that reads your schema.
151
154
  console.log(JSON.stringify(manifest, null, 2));
152
155
 
153
156
  export default manifest;
@@ -5,7 +5,7 @@ Pylon serves the API, auth, sync, WebSocket, SSE, and native React 19 SSR from o
5
5
  ## Directory conventions
6
6
 
7
7
  **Unified SSR app:**
8
- - `app.ts`: data model + manifest (`entity()` + `field.*`, queries/actions/policies, `routes: await discoverAppRoutes()`). Ends with `console.log(JSON.stringify(manifest))`.
8
+ - `app.ts`: data model + manifest (`entity()` + `field.*`, queries/actions/policies, `routes: await discoverAppRoutes()`). Ends with `console.log(JSON.stringify(manifest))` — that line is the manifest handoff (the CLI parses this file's stdout), not debug output. Never remove it.
9
9
  - `app/`: file-based SSR routes. `app/page.tsx` → `/`, `app/about/page.tsx` → `/about`, `app/blog/[slug]/page.tsx` → `/blog/:slug`. A `(group)` directory is stripped from the URL — `app/(marketing)/about/page.tsx` still serves `/about` — so a group's `layout.tsx` gives one section its own chrome (nav, footer) without changing any path; routes outside the group render without it. `app/layout.tsx` is the document shell; `app/error.tsx` / `app/not-found.tsx` are boundaries.
10
10
  - `app/globals.css`: Tailwind v4 entrypoint (auto-compiled and injected).
11
11
  - `functions/`: server functions, one per file, `default`-exported.
@@ -172,6 +172,9 @@ const manifest = buildManifest({
172
172
  routes: await discoverAppRoutes(),
173
173
  });
174
174
 
175
+ // Not a debug leftover: the CLI runs `bun run app.ts` and parses stdout as
176
+ // your manifest (see crates/cli/src/bun.rs). Deleting this line breaks every
177
+ // pylon command that reads your schema.
175
178
  console.log(JSON.stringify(manifest, null, 2));
176
179
 
177
180
  export default manifest;
@@ -5,7 +5,7 @@ Pylon serves the API, auth, sync, WebSocket, SSE, and native React 19 SSR from o
5
5
  ## Directory conventions
6
6
 
7
7
  **Unified SSR app:**
8
- - `app.ts`: data model + manifest (`entity()` + `field.*`, queries/actions/policies, `routes: await discoverAppRoutes()`). Ends with `console.log(JSON.stringify(manifest))`.
8
+ - `app.ts`: data model + manifest (`entity()` + `field.*`, queries/actions/policies, `routes: await discoverAppRoutes()`). Ends with `console.log(JSON.stringify(manifest))` — that line is the manifest handoff (the CLI parses this file's stdout), not debug output. Never remove it.
9
9
  - `app/`: file-based SSR routes. `app/page.tsx` → `/`, `app/about/page.tsx` → `/about`, `app/blog/[slug]/page.tsx` → `/blog/:slug`. A `(group)` directory is stripped from the URL — `app/(marketing)/about/page.tsx` still serves `/about` — so a group's `layout.tsx` gives one section its own chrome (nav, footer) without changing any path; routes outside the group render without it. `app/layout.tsx` is the document shell; `app/error.tsx` / `app/not-found.tsx` are boundaries.
10
10
  - `app/globals.css`: Tailwind v4 entrypoint (auto-compiled and injected).
11
11
  - `functions/`: server functions, one per file, `default`-exported.
@@ -162,6 +162,9 @@ const manifest = buildManifest({
162
162
  routes: await discoverAppRoutes(),
163
163
  });
164
164
 
165
+ // Not a debug leftover: the CLI runs `bun run app.ts` and parses stdout as
166
+ // your manifest (see crates/cli/src/bun.rs). Deleting this line breaks every
167
+ // pylon command that reads your schema.
165
168
  console.log(JSON.stringify(manifest, null, 2));
166
169
 
167
170
  export default manifest;
@@ -5,7 +5,7 @@ Pylon serves the API, auth, sync, WebSocket, SSE, and native React 19 SSR from o
5
5
  ## Directory conventions
6
6
 
7
7
  **Unified SSR app:**
8
- - `app.ts`: data model + manifest (`entity()` + `field.*`, queries/actions/policies, `routes: await discoverAppRoutes()`). Ends with `console.log(JSON.stringify(manifest))`.
8
+ - `app.ts`: data model + manifest (`entity()` + `field.*`, queries/actions/policies, `routes: await discoverAppRoutes()`). Ends with `console.log(JSON.stringify(manifest))` — that line is the manifest handoff (the CLI parses this file's stdout), not debug output. Never remove it.
9
9
  - `app/`: file-based SSR routes. `app/page.tsx` → `/`, `app/about/page.tsx` → `/about`, `app/blog/[slug]/page.tsx` → `/blog/:slug`. A `(group)` directory is stripped from the URL — `app/(marketing)/about/page.tsx` still serves `/about` — so a group's `layout.tsx` gives one section its own chrome (nav, footer) without changing any path; routes outside the group render without it. `app/layout.tsx` is the document shell; `app/error.tsx` / `app/not-found.tsx` are boundaries.
10
10
  - `app/globals.css`: Tailwind v4 entrypoint (auto-compiled and injected).
11
11
  - `functions/`: server functions, one per file, `default`-exported.
@@ -143,6 +143,9 @@ const manifest = buildManifest({
143
143
  routes: await discoverAppRoutes(),
144
144
  });
145
145
 
146
+ // Not a debug leftover: the CLI runs `bun run app.ts` and parses stdout as
147
+ // your manifest (see crates/cli/src/bun.rs). Deleting this line breaks every
148
+ // pylon command that reads your schema.
146
149
  console.log(JSON.stringify(manifest, null, 2));
147
150
 
148
151
  export default manifest;
@@ -5,7 +5,7 @@ Pylon serves the API, auth, sync, WebSocket, SSE, and native React 19 SSR from o
5
5
  ## Directory conventions
6
6
 
7
7
  **Unified SSR app:**
8
- - `app.ts`: data model + manifest (`entity()` + `field.*`, queries/actions/policies, `routes: await discoverAppRoutes()`). Ends with `console.log(JSON.stringify(manifest))`.
8
+ - `app.ts`: data model + manifest (`entity()` + `field.*`, queries/actions/policies, `routes: await discoverAppRoutes()`). Ends with `console.log(JSON.stringify(manifest))` — that line is the manifest handoff (the CLI parses this file's stdout), not debug output. Never remove it.
9
9
  - `app/`: file-based SSR routes. `app/page.tsx` → `/`, `app/about/page.tsx` → `/about`, `app/blog/[slug]/page.tsx` → `/blog/:slug`. A `(group)` directory is stripped from the URL — `app/(marketing)/about/page.tsx` still serves `/about` — so a group's `layout.tsx` gives one section its own chrome (nav, footer) without changing any path; routes outside the group render without it. `app/layout.tsx` is the document shell; `app/error.tsx` / `app/not-found.tsx` are boundaries.
10
10
  - `app/globals.css`: Tailwind v4 entrypoint (auto-compiled and injected).
11
11
  - `functions/`: server functions, one per file, `default`-exported.
@@ -155,6 +155,9 @@ const manifest = buildManifest({
155
155
  routes: await discoverAppRoutes(),
156
156
  });
157
157
 
158
+ // Not a debug leftover: the CLI runs `bun run app.ts` and parses stdout as
159
+ // your manifest (see crates/cli/src/bun.rs). Deleting this line breaks every
160
+ // pylon command that reads your schema.
158
161
  console.log(JSON.stringify(manifest, null, 2));
159
162
 
160
163
  export default manifest;
@@ -5,7 +5,7 @@ Pylon serves the API, auth, sync, WebSocket, SSE, and native React 19 SSR from o
5
5
  ## Directory conventions
6
6
 
7
7
  **Unified SSR app:**
8
- - `app.ts`: data model + manifest (`entity()` + `field.*`, queries/actions/policies, `routes: await discoverAppRoutes()`). Ends with `console.log(JSON.stringify(manifest))`.
8
+ - `app.ts`: data model + manifest (`entity()` + `field.*`, queries/actions/policies, `routes: await discoverAppRoutes()`). Ends with `console.log(JSON.stringify(manifest))` — that line is the manifest handoff (the CLI parses this file's stdout), not debug output. Never remove it.
9
9
  - `app/`: file-based SSR routes. `app/page.tsx` → `/`, `app/about/page.tsx` → `/about`, `app/blog/[slug]/page.tsx` → `/blog/:slug`. A `(group)` directory is stripped from the URL — `app/(marketing)/about/page.tsx` still serves `/about` — so a group's `layout.tsx` gives one section its own chrome (nav, footer) without changing any path; routes outside the group render without it. `app/layout.tsx` is the document shell; `app/error.tsx` / `app/not-found.tsx` are boundaries.
10
10
  - `app/globals.css`: Tailwind v4 entrypoint (auto-compiled and injected).
11
11
  - `functions/`: server functions, one per file, `default`-exported.
@@ -170,6 +170,9 @@ const manifest = buildManifest({
170
170
  routes: await discoverAppRoutes(),
171
171
  });
172
172
 
173
+ // Not a debug leftover: the CLI runs `bun run app.ts` and parses stdout as
174
+ // your manifest (see crates/cli/src/bun.rs). Deleting this line breaks every
175
+ // pylon command that reads your schema.
173
176
  console.log(JSON.stringify(manifest, null, 2));
174
177
 
175
178
  export default manifest;
@@ -5,7 +5,7 @@ Pylon serves the API, auth, sync, WebSocket, SSE, and native React 19 SSR from o
5
5
  ## Directory conventions
6
6
 
7
7
  **Unified SSR app:**
8
- - `app.ts`: data model + manifest (`entity()` + `field.*`, queries/actions/policies, `routes: await discoverAppRoutes()`). Ends with `console.log(JSON.stringify(manifest))`.
8
+ - `app.ts`: data model + manifest (`entity()` + `field.*`, queries/actions/policies, `routes: await discoverAppRoutes()`). Ends with `console.log(JSON.stringify(manifest))` — that line is the manifest handoff (the CLI parses this file's stdout), not debug output. Never remove it.
9
9
  - `app/`: file-based SSR routes. `app/page.tsx` → `/`, `app/about/page.tsx` → `/about`, `app/blog/[slug]/page.tsx` → `/blog/:slug`. A `(group)` directory is stripped from the URL — `app/(marketing)/about/page.tsx` still serves `/about` — so a group's `layout.tsx` gives one section its own chrome (nav, footer) without changing any path; routes outside the group render without it. `app/layout.tsx` is the document shell; `app/error.tsx` / `app/not-found.tsx` are boundaries.
10
10
  - `app/globals.css`: Tailwind v4 entrypoint (auto-compiled and injected).
11
11
  - `functions/`: server functions, one per file, `default`-exported.
@@ -147,6 +147,9 @@ const manifest = buildManifest({
147
147
  routes: await discoverAppRoutes(),
148
148
  });
149
149
 
150
+ // Not a debug leftover: the CLI runs `bun run app.ts` and parses stdout as
151
+ // your manifest (see crates/cli/src/bun.rs). Deleting this line breaks every
152
+ // pylon command that reads your schema.
150
153
  console.log(JSON.stringify(manifest, null, 2));
151
154
 
152
155
  export default manifest;
@@ -5,7 +5,7 @@ Pylon serves the API, auth, sync, WebSocket, SSE, and native React 19 SSR from o
5
5
  ## Directory conventions
6
6
 
7
7
  **Unified SSR app:**
8
- - `app.ts`: data model + manifest (`entity()` + `field.*`, queries/actions/policies, `routes: await discoverAppRoutes()`). Ends with `console.log(JSON.stringify(manifest))`.
8
+ - `app.ts`: data model + manifest (`entity()` + `field.*`, queries/actions/policies, `routes: await discoverAppRoutes()`). Ends with `console.log(JSON.stringify(manifest))` — that line is the manifest handoff (the CLI parses this file's stdout), not debug output. Never remove it.
9
9
  - `app/`: file-based SSR routes. `app/page.tsx` → `/`, `app/about/page.tsx` → `/about`, `app/blog/[slug]/page.tsx` → `/blog/:slug`. A `(group)` directory is stripped from the URL — `app/(marketing)/about/page.tsx` still serves `/about` — so a group's `layout.tsx` gives one section its own chrome (nav, footer) without changing any path; routes outside the group render without it. `app/layout.tsx` is the document shell; `app/error.tsx` / `app/not-found.tsx` are boundaries.
10
10
  - `app/globals.css`: Tailwind v4 entrypoint (auto-compiled and injected).
11
11
  - `functions/`: server functions, one per file, `default`-exported.
@@ -192,6 +192,9 @@ const manifest = buildManifest({
192
192
  routes: await discoverAppRoutes(),
193
193
  });
194
194
 
195
+ // Not a debug leftover: the CLI runs `bun run app.ts` and parses stdout as
196
+ // your manifest (see crates/cli/src/bun.rs). Deleting this line breaks every
197
+ // pylon command that reads your schema.
195
198
  console.log(JSON.stringify(manifest, null, 2));
196
199
 
197
200
  export default manifest;
@@ -5,7 +5,10 @@
5
5
  // init() resolves window.location.origin.
6
6
  import { init, configureClient, callFn, setSessionToken, storageKey } from "@pylonsync/react";
7
7
 
8
- export const APP_NAME = "market";
8
+ // Match the manifest name (app.ts `buildManifest({ name })`) so this explicit
9
+ // appName agrees with the value the SSR runtime auto-injects at hydrate — no
10
+ // keyspace disagreement, no double token migration.
11
+ export const APP_NAME = "__APP_NAME__";
9
12
 
10
13
  // Prefilled demo account — the shopper you sign in as. Owns a couple of its
11
14
  // own listings so "My Market" isn't empty, but NOT the bulk of the catalog,
@@ -5,7 +5,7 @@ Pylon serves the API, auth, sync, WebSocket, SSE, and native React 19 SSR from o
5
5
  ## Directory conventions
6
6
 
7
7
  **Unified SSR app:**
8
- - `app.ts`: data model + manifest (`entity()` + `field.*`, queries/actions/policies, `routes: await discoverAppRoutes()`). Ends with `console.log(JSON.stringify(manifest))`.
8
+ - `app.ts`: data model + manifest (`entity()` + `field.*`, queries/actions/policies, `routes: await discoverAppRoutes()`). Ends with `console.log(JSON.stringify(manifest))` — that line is the manifest handoff (the CLI parses this file's stdout), not debug output. Never remove it.
9
9
  - `app/`: file-based SSR routes. `app/page.tsx` → `/`, `app/about/page.tsx` → `/about`, `app/blog/[slug]/page.tsx` → `/blog/:slug`. A `(group)` directory is stripped from the URL — `app/(marketing)/about/page.tsx` still serves `/about` — so a group's `layout.tsx` gives one section its own chrome (nav, footer) without changing any path; routes outside the group render without it. `app/layout.tsx` is the document shell; `app/error.tsx` / `app/not-found.tsx` are boundaries.
10
10
  - `app/globals.css`: Tailwind v4 entrypoint (auto-compiled and injected).
11
11
  - `functions/`: server functions, one per file, `default`-exported.
@@ -187,6 +187,9 @@ const manifest = buildManifest({
187
187
  routes: await discoverAppRoutes(),
188
188
  });
189
189
 
190
+ // Not a debug leftover: the CLI runs `bun run app.ts` and parses stdout as
191
+ // your manifest (see crates/cli/src/bun.rs). Deleting this line breaks every
192
+ // pylon command that reads your schema.
190
193
  console.log(JSON.stringify(manifest, null, 2));
191
194
 
192
195
  export default manifest;
@@ -5,7 +5,7 @@ Pylon serves the API, auth, sync, WebSocket, SSE, and native React 19 SSR from o
5
5
  ## Directory conventions
6
6
 
7
7
  **Unified SSR app:**
8
- - `app.ts`: data model + manifest (`entity()` + `field.*`, queries/actions/policies, `routes: await discoverAppRoutes()`). Ends with `console.log(JSON.stringify(manifest))`.
8
+ - `app.ts`: data model + manifest (`entity()` + `field.*`, queries/actions/policies, `routes: await discoverAppRoutes()`). Ends with `console.log(JSON.stringify(manifest))` — that line is the manifest handoff (the CLI parses this file's stdout), not debug output. Never remove it.
9
9
  - `app/`: file-based SSR routes. `app/page.tsx` → `/`, `app/about/page.tsx` → `/about`, `app/blog/[slug]/page.tsx` → `/blog/:slug`. A `(group)` directory is stripped from the URL — `app/(marketing)/about/page.tsx` still serves `/about` — so a group's `layout.tsx` gives one section its own chrome (nav, footer) without changing any path; routes outside the group render without it. `app/layout.tsx` is the document shell; `app/error.tsx` / `app/not-found.tsx` are boundaries.
10
10
  - `app/globals.css`: Tailwind v4 entrypoint (auto-compiled and injected).
11
11
  - `functions/`: server functions, one per file, `default`-exported.
@@ -131,6 +131,9 @@ const manifest = buildManifest({
131
131
  routes: await discoverAppRoutes(),
132
132
  });
133
133
 
134
+ // Not a debug leftover: the CLI runs `bun run app.ts` and parses stdout as
135
+ // your manifest (see crates/cli/src/bun.rs). Deleting this line breaks every
136
+ // pylon command that reads your schema.
134
137
  console.log(JSON.stringify(manifest, null, 2));
135
138
 
136
139
  export default manifest;
@@ -5,7 +5,7 @@ Pylon serves the API, auth, sync, WebSocket, SSE, and native React 19 SSR from o
5
5
  ## Directory conventions
6
6
 
7
7
  **Unified SSR app:**
8
- - `app.ts`: data model + manifest (`entity()` + `field.*`, queries/actions/policies, `routes: await discoverAppRoutes()`). Ends with `console.log(JSON.stringify(manifest))`.
8
+ - `app.ts`: data model + manifest (`entity()` + `field.*`, queries/actions/policies, `routes: await discoverAppRoutes()`). Ends with `console.log(JSON.stringify(manifest))` — that line is the manifest handoff (the CLI parses this file's stdout), not debug output. Never remove it.
9
9
  - `app/`: file-based SSR routes. `app/page.tsx` → `/`, `app/about/page.tsx` → `/about`, `app/blog/[slug]/page.tsx` → `/blog/:slug`. A `(group)` directory is stripped from the URL — `app/(marketing)/about/page.tsx` still serves `/about` — so a group's `layout.tsx` gives one section its own chrome (nav, footer) without changing any path; routes outside the group render without it. `app/layout.tsx` is the document shell; `app/error.tsx` / `app/not-found.tsx` are boundaries.
10
10
  - `app/globals.css`: Tailwind v4 entrypoint (auto-compiled and injected).
11
11
  - `functions/`: server functions, one per file, `default`-exported.
@@ -214,6 +214,9 @@ const manifest = buildManifest({
214
214
  routes: await discoverAppRoutes(),
215
215
  });
216
216
 
217
+ // Not a debug leftover: the CLI runs `bun run app.ts` and parses stdout as
218
+ // your manifest (see crates/cli/src/bun.rs). Deleting this line breaks every
219
+ // pylon command that reads your schema.
217
220
  console.log(JSON.stringify(manifest, null, 2));
218
221
 
219
222
  export default manifest;
@@ -5,7 +5,7 @@ Pylon serves the API, auth, sync, WebSocket, SSE, and native React 19 SSR from o
5
5
  ## Directory conventions
6
6
 
7
7
  **Unified SSR app:**
8
- - `app.ts`: data model + manifest (`entity()` + `field.*`, queries/actions/policies, `routes: await discoverAppRoutes()`). Ends with `console.log(JSON.stringify(manifest))`.
8
+ - `app.ts`: data model + manifest (`entity()` + `field.*`, queries/actions/policies, `routes: await discoverAppRoutes()`). Ends with `console.log(JSON.stringify(manifest))` — that line is the manifest handoff (the CLI parses this file's stdout), not debug output. Never remove it.
9
9
  - `app/`: file-based SSR routes. `app/page.tsx` → `/`, `app/about/page.tsx` → `/about`, `app/blog/[slug]/page.tsx` → `/blog/:slug`. A `(group)` directory is stripped from the URL — `app/(marketing)/about/page.tsx` still serves `/about` — so a group's `layout.tsx` gives one section its own chrome (nav, footer) without changing any path; routes outside the group render without it. `app/layout.tsx` is the document shell; `app/error.tsx` / `app/not-found.tsx` are boundaries.
10
10
  - `app/globals.css`: Tailwind v4 entrypoint (auto-compiled and injected).
11
11
  - `functions/`: server functions, one per file, `default`-exported.
@@ -150,6 +150,9 @@ const manifest = buildManifest({
150
150
  routes: await discoverAppRoutes(),
151
151
  });
152
152
 
153
+ // Not a debug leftover: the CLI runs `bun run app.ts` and parses stdout as
154
+ // your manifest (see crates/cli/src/bun.rs). Deleting this line breaks every
155
+ // pylon command that reads your schema.
153
156
  console.log(JSON.stringify(manifest, null, 2));
154
157
 
155
158
  export default manifest;
@@ -5,7 +5,7 @@ Pylon serves the API, auth, sync, WebSocket, SSE, and native React 19 SSR from o
5
5
  ## Directory conventions
6
6
 
7
7
  **Unified SSR app:**
8
- - `app.ts`: data model + manifest (`entity()` + `field.*`, queries/actions/policies, `routes: await discoverAppRoutes()`). Ends with `console.log(JSON.stringify(manifest))`.
8
+ - `app.ts`: data model + manifest (`entity()` + `field.*`, queries/actions/policies, `routes: await discoverAppRoutes()`). Ends with `console.log(JSON.stringify(manifest))` — that line is the manifest handoff (the CLI parses this file's stdout), not debug output. Never remove it.
9
9
  - `app/`: file-based SSR routes. `app/page.tsx` → `/`, `app/about/page.tsx` → `/about`, `app/blog/[slug]/page.tsx` → `/blog/:slug`. A `(group)` directory is stripped from the URL — `app/(marketing)/about/page.tsx` still serves `/about` — so a group's `layout.tsx` gives one section its own chrome (nav, footer) without changing any path; routes outside the group render without it. `app/layout.tsx` is the document shell; `app/error.tsx` / `app/not-found.tsx` are boundaries.
10
10
  - `app/globals.css`: Tailwind v4 entrypoint (auto-compiled and injected).
11
11
  - `functions/`: server functions, one per file, `default`-exported.
@@ -72,6 +72,9 @@ const manifest = buildManifest({
72
72
  });
73
73
 
74
74
  // Emit canonical manifest JSON to stdout for `pylon codegen`.
75
+ // Not a debug leftover: the CLI runs `bun run app.ts` and parses stdout as
76
+ // your manifest (see crates/cli/src/bun.rs). Deleting this line breaks every
77
+ // pylon command that reads your schema.
75
78
  console.log(JSON.stringify(manifest, null, 2));
76
79
 
77
80
  export default manifest;
@@ -5,7 +5,7 @@ Pylon serves the API, auth, sync, WebSocket, SSE, and native React 19 SSR from o
5
5
  ## Directory conventions
6
6
 
7
7
  **Unified SSR app:**
8
- - `app.ts`: data model + manifest (`entity()` + `field.*`, queries/actions/policies, `routes: await discoverAppRoutes()`). Ends with `console.log(JSON.stringify(manifest))`.
8
+ - `app.ts`: data model + manifest (`entity()` + `field.*`, queries/actions/policies, `routes: await discoverAppRoutes()`). Ends with `console.log(JSON.stringify(manifest))` — that line is the manifest handoff (the CLI parses this file's stdout), not debug output. Never remove it.
9
9
  - `app/`: file-based SSR routes. `app/page.tsx` → `/`, `app/about/page.tsx` → `/about`, `app/blog/[slug]/page.tsx` → `/blog/:slug`. A `(group)` directory is stripped from the URL — `app/(marketing)/about/page.tsx` still serves `/about` — so a group's `layout.tsx` gives one section its own chrome (nav, footer) without changing any path; routes outside the group render without it. `app/layout.tsx` is the document shell; `app/error.tsx` / `app/not-found.tsx` are boundaries.
10
10
  - `app/globals.css`: Tailwind v4 entrypoint (auto-compiled and injected).
11
11
  - `functions/`: server functions, one per file, `default`-exported.
@@ -152,6 +152,9 @@ const manifest = buildManifest({
152
152
  });
153
153
 
154
154
  // Emit the canonical manifest JSON to stdout — `pylon dev` captures this.
155
+ // Not a debug leftover: the CLI runs `bun run app.ts` and parses stdout as
156
+ // your manifest (see crates/cli/src/bun.rs). Deleting this line breaks every
157
+ // pylon command that reads your schema.
155
158
  console.log(JSON.stringify(manifest, null, 2));
156
159
 
157
160
  export default manifest;