@atolljs/cli 0.1.12 → 0.1.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -30,10 +30,12 @@ atoll new <dir> [--framework react|vue|solid|svelte|node] [--mfe] [--pm npm]
30
30
  self-contained remote bundle) + a dev harness mounting the
31
31
  island through the contract.
32
32
 
33
- atoll init
33
+ atoll init [--name app] [--dir <path>] [--framework <fw>]
34
34
  Wire Atoll into the current project: .npmrc, installs the @atolljs/*
35
35
  packages your framework needs, and generates a working spine —
36
- app.memory.ts + app.worker.ts + app.ts under src/atoll/.
36
+ app.memory.ts + app.worker.ts + app.ts under src/atoll/. --dir
37
+ relocates the spine; --framework overrides detection (monorepos
38
+ where the root package.json doesn't describe the target project).
37
39
 
38
40
  atoll add worker <name> pooled worker + typed client (browser or node)
39
41
  atoll add memory <name> shared-memory contract module
@@ -53,3 +55,7 @@ atoll doctor [--fix] verify deps, lockfile, .npmrc policy,
53
55
 
54
56
  Existing files are never overwritten without `--force`; missing answers
55
57
  prompt interactively (or take defaults under `--yes` / no TTY).
58
+
59
+ **Nx workspaces:** use `@atolljs/nx` — `nx g @atolljs/nx:init`,
60
+ `nx g @atolljs/nx:worker <name>`, and `nx run <p>:atoll-doctor` wrap these
61
+ commands with project/`sourceRoot` scoping. See `packages/nx/README.md`.
package/dist/cli.js CHANGED
@@ -181,9 +181,10 @@ function missingDeps(pkg, want) {
181
181
  import { existsSync as existsSync2, mkdirSync, writeFileSync } from "node:fs";
182
182
  import { dirname as dirname2, join as join2, normalize } from "node:path";
183
183
  async function writeTree(io, cwd, files, opts = {}) {
184
+ const bound = normalize(opts.within ?? cwd);
184
185
  for (const f of files) {
185
186
  const abs = normalize(join2(cwd, f.path));
186
- if (!abs.startsWith(normalize(cwd))) {
187
+ if (!abs.startsWith(bound)) {
187
188
  io.error(`refusing to write outside the project: ${io.fmt.accent(f.path)}`);
188
189
  continue;
189
190
  }
@@ -579,8 +580,8 @@ var HEADERS = ` // SharedArrayBuffer is gated behind cross-origin isolation \u2
579
580
  },`;
580
581
  var SCAFFOLDS = {
581
582
  react: {
582
- deps: { react: "^19.3.0", "react-dom": "^19.3.0", "react-reconciler": "^0.34.0", "@atolljs/core": "^0.1.0", "@atolljs/react": "^0.1.0", "@atolljs/react-island": "^0.1.0", zod: "^4.6.5" },
583
- devDeps: { vite: "^8.3.1", typescript: "^7.0.2", "@vitejs/plugin-react": "^6.1.1", "@atolljs/vite": "^0.1.0", "@types/react": "^19.3.0", "@types/react-dom": "^19.3.0" },
583
+ deps: { react: "^19.3.0", "react-dom": "^19.3.0", "react-reconciler": "^0.34.0", "@atolljs/core": "^0.1.12", "@atolljs/react": "^0.1.12", "@atolljs/react-island": "^0.1.12", zod: "^4.6.5" },
584
+ devDeps: { vite: "^8.3.1", typescript: "^7.0.2", "@vitejs/plugin-react": "^6.1.1", "@atolljs/vite": "^0.1.12", "@types/react": "^19.3.0", "@types/react-dom": "^19.3.0" },
584
585
  // `exclude` replaces the plugin's default /node_modules/ — keep it, and
585
586
  // add *.worker.*: fast-refresh injects `/@react-refresh` (which reads
586
587
  // `window` unguarded) into every transformed module, including worker
@@ -588,19 +589,19 @@ var SCAFFOLDS = {
588
589
  vitePlugin: { pkg: "@vitejs/plugin-react", import_: `import react from '@vitejs/plugin-react';`, call: "react({ exclude: [/\\/node_modules\\//, /\\.worker\\./] })" }
589
590
  },
590
591
  vue: {
591
- deps: { vue: "^3.5.43", "@atolljs/core": "^0.1.0", "@atolljs/vue": "^0.1.0", "@atolljs/vue-island": "^0.1.0", zod: "^4.6.5" },
592
- devDeps: { vite: "^8.3.1", typescript: "^7.0.2", "@vitejs/plugin-vue": "^6.0.9", "@atolljs/vite": "^0.1.0" },
592
+ deps: { vue: "^3.5.43", "@atolljs/core": "^0.1.12", "@atolljs/vue": "^0.1.12", "@atolljs/vue-island": "^0.1.12", zod: "^4.6.5" },
593
+ devDeps: { vite: "^8.3.1", typescript: "^7.0.2", "@vitejs/plugin-vue": "^6.0.9", "@atolljs/vite": "^0.1.12" },
593
594
  vitePlugin: { pkg: "@vitejs/plugin-vue", import_: `import vue from '@vitejs/plugin-vue';`, call: "vue()" }
594
595
  },
595
596
  solid: {
596
- deps: { "solid-js": "^1.9.15", "@atolljs/core": "^0.1.0", "@atolljs/solidjs": "^0.1.0", "@atolljs/solid-island": "^0.1.0", zod: "^4.6.5" },
597
- devDeps: { vite: "^8.3.1", typescript: "^7.0.2", "vite-plugin-solid": "^2.11.14", "@atolljs/vite": "^0.1.0" },
597
+ deps: { "solid-js": "^1.9.15", "@atolljs/core": "^0.1.12", "@atolljs/solidjs": "^0.1.12", "@atolljs/solid-island": "^0.1.12", zod: "^4.6.5" },
598
+ devDeps: { vite: "^8.3.1", typescript: "^7.0.2", "vite-plugin-solid": "^2.11.14", "@atolljs/vite": "^0.1.12" },
598
599
  atollCall: `atoll({ jsxImportSource: 'solid-js' })`,
599
600
  vitePlugin: { pkg: "vite-plugin-solid", import_: `import solid from 'vite-plugin-solid';`, call: "solid()" }
600
601
  },
601
602
  svelte: {
602
- deps: { svelte: "^5.57.1", "@atolljs/core": "^0.1.0", "@atolljs/svelte": "^0.1.0", "@atolljs/svelte-island": "^0.1.0", zod: "^4.6.5" },
603
- devDeps: { vite: "^8.3.1", typescript: "^7.0.2", "@sveltejs/vite-plugin-svelte": "^7.3.1", "@atolljs/vite": "^0.1.0" },
603
+ deps: { svelte: "^5.57.1", "@atolljs/core": "^0.1.12", "@atolljs/svelte": "^0.1.12", "@atolljs/svelte-island": "^0.1.12", zod: "^4.6.5" },
604
+ devDeps: { vite: "^8.3.1", typescript: "^7.0.2", "@sveltejs/vite-plugin-svelte": "^7.3.1", "@atolljs/vite": "^0.1.12" },
604
605
  vitePlugin: { pkg: "@sveltejs/vite-plugin-svelte", import_: `import { svelte } from '@sveltejs/vite-plugin-svelte';`, call: "svelte()" }
605
606
  }
606
607
  };
@@ -896,7 +897,7 @@ function nodeScaffoldFiles(appName) {
896
897
  start: "tsx src/main.ts",
897
898
  bundle: "esbuild src/atoll/tasks.worker.ts --bundle --platform=node --format=esm --packages=external --outfile=dist/tasks.worker.js"
898
899
  },
899
- dependencies: { "@atolljs/core": "^0.1.0", "@atolljs/node": "^0.1.0", zod: "^4.6.5" },
900
+ dependencies: { "@atolljs/core": "^0.1.12", "@atolljs/node": "^0.1.12", zod: "^4.6.5" },
900
901
  devDependencies: { esbuild: "^0.28.2", tsx: "^4.23.15", typescript: "^7.0.2", "@types/node": "^26.6.3" }
901
902
  },
902
903
  null,
@@ -2353,21 +2354,26 @@ async function runInit(ctx) {
2353
2354
  return 1;
2354
2355
  }
2355
2356
  const rel = (abs) => relative(ctx.cwd, abs).replaceAll("\\", "/");
2357
+ const framework = flag(ctx.args, "framework") ?? project.framework;
2356
2358
  ctx.io.print(
2357
2359
  ctx.io.fmt.dim(
2358
- `detected: ${project.framework} \xB7 ${project.pm} \xB7 root ${project.root}`
2360
+ `detected: ${framework} \xB7 ${project.pm} \xB7 root ${project.root}`
2359
2361
  )
2360
2362
  );
2361
- await writeTree(ctx.io, ctx.cwd, [{ path: rel(join3(project.root, ".npmrc")), content: NPMRC }], {
2362
- force: hasFlag(ctx.args, "force")
2363
- });
2364
- const atollDir = join3(project.srcDir, "atoll");
2365
- const host = hostOf(project.framework);
2363
+ const within = project.root;
2364
+ await writeTree(
2365
+ ctx.io,
2366
+ ctx.cwd,
2367
+ [{ path: rel(join3(project.root, ".npmrc")), content: NPMRC }],
2368
+ { force: hasFlag(ctx.args, "force"), within }
2369
+ );
2370
+ const atollDir = flag(ctx.args, "dir") ? join3(ctx.cwd, flag(ctx.args, "dir")) : join3(project.srcDir, "atoll");
2371
+ const host = hostOf(framework);
2366
2372
  const name = flag(ctx.args, "name") ?? "app";
2367
2373
  const files = [
2368
2374
  { path: `${rel(atollDir)}/${name}.memory.ts`, content: memoryContract(name) }
2369
2375
  ];
2370
- if (project.framework === "nestjs") {
2376
+ if (framework === "nestjs") {
2371
2377
  files.push(
2372
2378
  ...nestjsServiceFiles(name, rel(atollDir), {
2373
2379
  import_: `./${name}.memory`,
@@ -2397,11 +2403,11 @@ async function runInit(ctx) {
2397
2403
  }
2398
2404
  );
2399
2405
  }
2400
- await writeTree(ctx.io, ctx.cwd, files, { force: hasFlag(ctx.args, "force") });
2401
- await offerInstall(ctx, project, ATOLL_DEPS[project.framework]);
2406
+ await writeTree(ctx.io, ctx.cwd, files, { force: hasFlag(ctx.args, "force"), within });
2407
+ await offerInstall(ctx, project, ATOLL_DEPS[framework]);
2402
2408
  ctx.io.print("");
2403
2409
  ctx.io.print(ctx.io.fmt.strong("next steps:"));
2404
- if (project.framework === "nestjs") {
2410
+ if (framework === "nestjs") {
2405
2411
  ctx.io.print(
2406
2412
  ` import ${ctx.io.fmt.accent(`${pascal(name)}Module`)} into AppModule, then inject ${ctx.io.fmt.accent(`${pascal(name)}Service`)} \u2014 ${ctx.io.fmt.accent(`service.echo('hi')`)} runs in a worker`
2407
2413
  );
@@ -2735,7 +2741,7 @@ bind it: pass ${ctx.io.fmt.accent(`${c}Memory`)} as ${ctx.io.fmt.accent("sharedM
2735
2741
  ...files,
2736
2742
  { path: publishCfg, content: mfePublishConfig(name, framework, dirFromRoot) }
2737
2743
  ],
2738
- force
2744
+ { ...force, within: project.root }
2739
2745
  );
2740
2746
  if (missingDeps(project.pkg, ["vite"]).length) {
2741
2747
  ctx.io.warn(
@@ -2821,7 +2827,8 @@ bind it: pass ${ctx.io.fmt.accent(`${c}Memory`)} as ${ctx.io.fmt.accent("sharedM
2821
2827
  await writeTree(
2822
2828
  ctx.io,
2823
2829
  ctx.cwd,
2824
- [nextjsInstrumentationFile(name, rel(project.srcDir))],
2830
+ // --dir names the dir instrumentation.ts lands in (default: srcDir).
2831
+ [nextjsInstrumentationFile(name, flag(ctx.args, "dir") ?? rel(project.srcDir))],
2825
2832
  force
2826
2833
  );
2827
2834
  ctx.io.print(
@@ -3059,9 +3066,11 @@ var HELP = (fmt) => `${fmt.strong("atoll")} \u2014 bootstrap multithreading ${fm
3059
3066
  or a tsx Node service with a pooled worker. --mfe scaffolds a
3060
3067
  publishable MFE package (contract + worker + bundle build).
3061
3068
 
3062
- ${fmt.accent("atoll init")} [--name app] [--force]
3069
+ ${fmt.accent("atoll init")} [--name app] [--dir <path>] [--framework <fw>] [--force]
3063
3070
  Wire Atoll into the current project: hardened .npmrc, package
3064
3071
  install, and a contract + worker + client spine under src/atoll/.
3072
+ --dir relocates the spine, --framework overrides detection \u2014 both
3073
+ are how monorepo integrations (e.g. @atolljs/nx) scope it.
3065
3074
 
3066
3075
  ${fmt.accent("atoll add [framework] <kind> [variant] [name]")}
3067
3076
  worker pool + typed client (+ framework bindings on UI projects)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atolljs/cli",
3
- "version": "0.1.12",
3
+ "version": "0.1.13",
4
4
  "description": "atoll — scaffold worker pools, shared-memory contracts, and framework islands (experimental)",
5
5
  "homepage": "https://jwhenry3.github.io/atolljs/consumer/quickstart/",
6
6
  "type": "module",
package/src/cli.ts CHANGED
@@ -21,9 +21,11 @@ const HELP = (fmt: Fmt) => `${fmt.strong('atoll')} — bootstrap multithreading
21
21
  or a tsx Node service with a pooled worker. --mfe scaffolds a
22
22
  publishable MFE package (contract + worker + bundle build).
23
23
 
24
- ${fmt.accent('atoll init')} [--name app] [--force]
24
+ ${fmt.accent('atoll init')} [--name app] [--dir <path>] [--framework <fw>] [--force]
25
25
  Wire Atoll into the current project: hardened .npmrc, package
26
26
  install, and a contract + worker + client spine under src/atoll/.
27
+ --dir relocates the spine, --framework overrides detection — both
28
+ are how monorepo integrations (e.g. @atolljs/nx) scope it.
27
29
 
28
30
  ${fmt.accent('atoll add [framework] <kind> [variant] [name]')}
29
31
  worker pool + typed client (+ framework bindings on UI projects)
package/src/commands.ts CHANGED
@@ -80,28 +80,40 @@ export async function runInit(ctx: Ctx): Promise<number> {
80
80
  return 1;
81
81
  }
82
82
  const rel = (abs: string) => relative(ctx.cwd, abs).replaceAll('\\', '/');
83
+ // --framework overrides detection (monorepos where the root package.json
84
+ // doesn't describe the target project — e.g. Nx workspaces, where the nx
85
+ // plugin also supplies --dir for the same reason).
86
+ const framework = (flag(ctx.args, 'framework') as Framework | undefined) ?? project.framework;
83
87
  ctx.io.print(
84
88
  ctx.io.fmt.dim(
85
- `detected: ${project.framework} · ${project.pm} · root ${project.root}`,
89
+ `detected: ${framework} · ${project.pm} · root ${project.root}`,
86
90
  ),
87
91
  );
88
92
 
89
- // Supply-chain baseline — the same .npmrc this repo ships.
90
- await writeTree(ctx.io, ctx.cwd, [{ path: rel(join(project.root, '.npmrc')), content: T.NPMRC }], {
91
- force: hasFlag(ctx.args, 'force'),
92
- });
93
+ // Supply-chain baseline — the same .npmrc this repo ships. Written at the
94
+ // detected project root, which may sit ABOVE cwd (the nx plugin invokes
95
+ // the CLI inside a project dir) — bound the write guard to the root.
96
+ const within = project.root;
97
+ await writeTree(
98
+ ctx.io,
99
+ ctx.cwd,
100
+ [{ path: rel(join(project.root, '.npmrc')), content: T.NPMRC }],
101
+ { force: hasFlag(ctx.args, 'force'), within },
102
+ );
93
103
 
94
104
  // A working spine — written BEFORE the install so a failed install still
95
105
  // leaves a complete, retryable scaffold. NestJS gets the DI-native spine
96
106
  // (service facade + registerPool module + worker entry); other hosts get
97
107
  // the contract + worker + client trio.
98
- const atollDir = join(project.srcDir, 'atoll');
99
- const host = hostOf(project.framework);
108
+ const atollDir = flag(ctx.args, 'dir')
109
+ ? join(ctx.cwd, flag(ctx.args, 'dir')!)
110
+ : join(project.srcDir, 'atoll');
111
+ const host = hostOf(framework);
100
112
  const name = flag(ctx.args, 'name') ?? 'app';
101
113
  const files: OutFile[] = [
102
114
  { path: `${rel(atollDir)}/${name}.memory.ts`, content: T.memoryContract(name) },
103
115
  ];
104
- if (project.framework === 'nestjs') {
116
+ if (framework === 'nestjs') {
105
117
  files.push(
106
118
  ...T.nestjsServiceFiles(name, rel(atollDir), {
107
119
  import_: `./${name}.memory`,
@@ -131,13 +143,13 @@ export async function runInit(ctx: Ctx): Promise<number> {
131
143
  },
132
144
  );
133
145
  }
134
- await writeTree(ctx.io, ctx.cwd, files, { force: hasFlag(ctx.args, 'force') });
146
+ await writeTree(ctx.io, ctx.cwd, files, { force: hasFlag(ctx.args, 'force'), within });
135
147
 
136
- await offerInstall(ctx, project, ATOLL_DEPS[project.framework]);
148
+ await offerInstall(ctx, project, ATOLL_DEPS[framework]);
137
149
 
138
150
  ctx.io.print('');
139
151
  ctx.io.print(ctx.io.fmt.strong('next steps:'));
140
- if (project.framework === 'nestjs') {
152
+ if (framework === 'nestjs') {
141
153
  ctx.io.print(
142
154
  ` import ${ctx.io.fmt.accent(`${pascal(name)}Module`)} into AppModule, then inject ${ctx.io.fmt.accent(`${pascal(name)}Service`)} — ${ctx.io.fmt.accent(`service.echo('hi')`)} runs in a worker`,
143
155
  );
@@ -546,7 +558,7 @@ export async function runAdd(ctx: Ctx): Promise<number> {
546
558
  ...files,
547
559
  { path: publishCfg, content: T.mfePublishConfig(name, framework, dirFromRoot) },
548
560
  ],
549
- force,
561
+ { ...force, within: project.root! },
550
562
  );
551
563
  if (missingDeps(project.pkg, ['vite']).length) {
552
564
  ctx.io.warn(
@@ -639,7 +651,8 @@ export async function runAdd(ctx: Ctx): Promise<number> {
639
651
  await writeTree(
640
652
  ctx.io,
641
653
  ctx.cwd,
642
- [T.nextjsInstrumentationFile(name, rel(project.srcDir))],
654
+ // --dir names the dir instrumentation.ts lands in (default: srcDir).
655
+ [T.nextjsInstrumentationFile(name, flag(ctx.args, 'dir') ?? rel(project.srcDir))],
643
656
  force,
644
657
  );
645
658
  ctx.io.print(
package/src/files.ts CHANGED
@@ -12,16 +12,22 @@ export interface OutFile {
12
12
  * Write a set of files under `cwd`. Existing files are never silently
13
13
  * clobbered — `--force` overwrites, interactive sessions get a prompt, and
14
14
  * non-interactive runs skip with a warning.
15
+ *
16
+ * `within` bounds where writes may land (default: `cwd`). Commands invoked
17
+ * from a subdirectory — e.g. the nx plugin running the CLI inside a project
18
+ * dir — pass the detected project root so artifacts that belong there
19
+ * (.npmrc, vite.mfe.config.ts) don't trip the escape guard.
15
20
  */
16
21
  export async function writeTree(
17
22
  io: Io,
18
23
  cwd: string,
19
24
  files: readonly OutFile[],
20
- opts: { force?: boolean } = {},
25
+ opts: { force?: boolean; within?: string } = {},
21
26
  ): Promise<void> {
27
+ const bound = normalize(opts.within ?? cwd);
22
28
  for (const f of files) {
23
29
  const abs = normalize(join(cwd, f.path));
24
- if (!abs.startsWith(normalize(cwd))) {
30
+ if (!abs.startsWith(bound)) {
25
31
  io.error(`refusing to write outside the project: ${io.fmt.accent(f.path)}`);
26
32
  continue;
27
33
  }
package/src/templates.ts CHANGED
@@ -423,8 +423,8 @@ interface ScaffoldSpec {
423
423
 
424
424
  const SCAFFOLDS: Record<string, ScaffoldSpec> = {
425
425
  react: {
426
- deps: { react: '^19.3.0', 'react-dom': '^19.3.0', 'react-reconciler': '^0.34.0', '@atolljs/core': '^0.1.0', '@atolljs/react': '^0.1.0', '@atolljs/react-island': '^0.1.0', zod: '^4.6.5' },
427
- devDeps: { vite: '^8.3.1', typescript: '^7.0.2', '@vitejs/plugin-react': '^6.1.1', '@atolljs/vite': '^0.1.0', '@types/react': '^19.3.0', '@types/react-dom': '^19.3.0' },
426
+ deps: { react: '^19.3.0', 'react-dom': '^19.3.0', 'react-reconciler': '^0.34.0', '@atolljs/core': '^0.1.12', '@atolljs/react': '^0.1.12', '@atolljs/react-island': '^0.1.12', zod: '^4.6.5' },
427
+ devDeps: { vite: '^8.3.1', typescript: '^7.0.2', '@vitejs/plugin-react': '^6.1.1', '@atolljs/vite': '^0.1.12', '@types/react': '^19.3.0', '@types/react-dom': '^19.3.0' },
428
428
  // `exclude` replaces the plugin's default /node_modules/ — keep it, and
429
429
  // add *.worker.*: fast-refresh injects `/@react-refresh` (which reads
430
430
  // `window` unguarded) into every transformed module, including worker
@@ -432,19 +432,19 @@ const SCAFFOLDS: Record<string, ScaffoldSpec> = {
432
432
  vitePlugin: { pkg: '@vitejs/plugin-react', import_: `import react from '@vitejs/plugin-react';`, call: 'react({ exclude: [/\\/node_modules\\//, /\\.worker\\./] })' },
433
433
  },
434
434
  vue: {
435
- deps: { vue: '^3.5.43', '@atolljs/core': '^0.1.0', '@atolljs/vue': '^0.1.0', '@atolljs/vue-island': '^0.1.0', zod: '^4.6.5' },
436
- devDeps: { vite: '^8.3.1', typescript: '^7.0.2', '@vitejs/plugin-vue': '^6.0.9', '@atolljs/vite': '^0.1.0' },
435
+ deps: { vue: '^3.5.43', '@atolljs/core': '^0.1.12', '@atolljs/vue': '^0.1.12', '@atolljs/vue-island': '^0.1.12', zod: '^4.6.5' },
436
+ devDeps: { vite: '^8.3.1', typescript: '^7.0.2', '@vitejs/plugin-vue': '^6.0.9', '@atolljs/vite': '^0.1.12' },
437
437
  vitePlugin: { pkg: '@vitejs/plugin-vue', import_: `import vue from '@vitejs/plugin-vue';`, call: 'vue()' },
438
438
  },
439
439
  solid: {
440
- deps: { 'solid-js': '^1.9.15', '@atolljs/core': '^0.1.0', '@atolljs/solidjs': '^0.1.0', '@atolljs/solid-island': '^0.1.0', zod: '^4.6.5' },
441
- devDeps: { vite: '^8.3.1', typescript: '^7.0.2', 'vite-plugin-solid': '^2.11.14', '@atolljs/vite': '^0.1.0' },
440
+ deps: { 'solid-js': '^1.9.15', '@atolljs/core': '^0.1.12', '@atolljs/solidjs': '^0.1.12', '@atolljs/solid-island': '^0.1.12', zod: '^4.6.5' },
441
+ devDeps: { vite: '^8.3.1', typescript: '^7.0.2', 'vite-plugin-solid': '^2.11.14', '@atolljs/vite': '^0.1.12' },
442
442
  atollCall: `atoll({ jsxImportSource: 'solid-js' })`,
443
443
  vitePlugin: { pkg: 'vite-plugin-solid', import_: `import solid from 'vite-plugin-solid';`, call: 'solid()' },
444
444
  },
445
445
  svelte: {
446
- deps: { svelte: '^5.57.1', '@atolljs/core': '^0.1.0', '@atolljs/svelte': '^0.1.0', '@atolljs/svelte-island': '^0.1.0', zod: '^4.6.5' },
447
- devDeps: { vite: '^8.3.1', typescript: '^7.0.2', '@sveltejs/vite-plugin-svelte': '^7.3.1', '@atolljs/vite': '^0.1.0' },
446
+ deps: { svelte: '^5.57.1', '@atolljs/core': '^0.1.12', '@atolljs/svelte': '^0.1.12', '@atolljs/svelte-island': '^0.1.12', zod: '^4.6.5' },
447
+ devDeps: { vite: '^8.3.1', typescript: '^7.0.2', '@sveltejs/vite-plugin-svelte': '^7.3.1', '@atolljs/vite': '^0.1.12' },
448
448
  vitePlugin: { pkg: '@sveltejs/vite-plugin-svelte', import_: `import { svelte } from '@sveltejs/vite-plugin-svelte';`, call: 'svelte()' },
449
449
  },
450
450
  };
@@ -726,7 +726,7 @@ export function nodeScaffoldFiles(appName: string): OutFile[] {
726
726
  bundle:
727
727
  'esbuild src/atoll/tasks.worker.ts --bundle --platform=node --format=esm --packages=external --outfile=dist/tasks.worker.js',
728
728
  },
729
- dependencies: { '@atolljs/core': '^0.1.0', '@atolljs/node': '^0.1.0', zod: '^4.6.5' },
729
+ dependencies: { '@atolljs/core': '^0.1.12', '@atolljs/node': '^0.1.12', zod: '^4.6.5' },
730
730
  devDependencies: { esbuild: '^0.28.2', tsx: '^4.23.15', typescript: '^7.0.2', '@types/node': '^26.6.3' },
731
731
  },
732
732
  null,