create-marwes 0.1.0 → 0.3.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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,31 @@
1
1
  # create-marwes
2
2
 
3
+ ## 0.3.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [#46](https://github.com/niklas-westman/marwes/pull/46) [`8b7d824`](https://github.com/niklas-westman/marwes/commit/8b7d824cfa0f8190952a45ed48030b1bac90b19d) Thanks [@niklas-westman](https://github.com/niklas-westman)! - Republish `create-marwes` now that npm trusted publishing (OIDC) is configured for it. No functional changes.
8
+
9
+ ### Patch Changes
10
+
11
+ - Updated dependencies [[`8b7d824`](https://github.com/niklas-westman/marwes/commit/8b7d824cfa0f8190952a45ed48030b1bac90b19d)]:
12
+ - @marwes-ui/cli@0.3.0
13
+
14
+ ## 0.2.0
15
+
16
+ ### Minor Changes
17
+
18
+ - [#44](https://github.com/niklas-westman/marwes/pull/44) [`6dbb453`](https://github.com/niklas-westman/marwes/commit/6dbb45356374cc50cb40204fd1dac5effc243b53) Thanks [@niklas-westman](https://github.com/niklas-westman)! - Make setup outcomes explicit, run static `doctor` checks after init, and recognize imported and rendered providers across framework aliases, Vue template/render-function forms, React namespace/render-function forms, and Svelte layouts. Report manual provider wiring with exit code 2 while preserving underlying installation and verification failure codes.
19
+
20
+ Require an app build script for `doctor --run-build`, run an optional typecheck before the production build, and stop on the first failed script while preserving its exit code. Normal init remains a static setup check rather than build verification.
21
+
22
+ Print theme setup guidance after successful init, complete typed framework provider examples for agentic and manual setup, and adapter-only import, automatic CSS, provider-scoped variable, and resolved-theme guidance. Add complete subcommand help and framework setup links.
23
+
24
+ ### Patch Changes
25
+
26
+ - Updated dependencies [[`6dbb453`](https://github.com/niklas-westman/marwes/commit/6dbb45356374cc50cb40204fd1dac5effc243b53)]:
27
+ - @marwes-ui/cli@0.2.0
28
+
3
29
  ## 0.1.0
4
30
 
5
31
  ### Minor Changes
package/README.md CHANGED
@@ -54,12 +54,18 @@ After scaffold:
54
54
 
55
55
  ```bash
56
56
  cd my-app
57
- pnpm install # if you passed --no-install
57
+ pnpm install # if you passed --no-install; the Marwes adapter is already in package.json
58
58
  pnpm dev
59
59
  ```
60
60
 
61
61
  Start building with Marwes components. See the adapter README on npm (`@marwes-ui/react`, `@marwes-ui/vue`, or `@marwes-ui/svelte`) for the full component list and theming guide.
62
62
 
63
+ Verify the generated app before continuing:
64
+
65
+ ```bash
66
+ pnpm dlx @marwes-ui/cli doctor --run-build
67
+ ```
68
+
63
69
  For the theme builder, brand-token customization, and full setup guides, visit [marwes.io](https://marwes.io).
64
70
 
65
71
  ## Options
@@ -68,8 +74,9 @@ For the theme builder, brand-token customization, and full setup guides, visit [
68
74
  | ----------------- | ------- |
69
75
  | `--template` | One of `react-ts`, `vue-ts`, `svelte-ts` (required). |
70
76
  | `--pm` | Force a package manager: `pnpm`, `npm`, `yarn`, or `bun`. |
71
- | `--no-install` | Skip dependency install after scaffolding. |
77
+ | `--no-install` | Record the Marwes adapter in `package.json`, but skip installation. |
72
78
  | `--dry-run` | Print planned actions without writing to disk. |
79
+ | `--help` | Show focused command help. |
73
80
 
74
81
  ## Existing App?
75
82
 
package/dist/cli.js CHANGED
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env node
2
2
  import { parseArgs } from 'util';
3
- import { resolve, join } from 'path';
3
+ import { readFile, writeFile, access, readdir } from 'fs/promises';
4
+ import { resolve, join, basename, extname } from 'path';
4
5
  import { spawn } from 'child_process';
5
- import { access, readFile, writeFile, readdir } from 'fs/promises';
6
6
 
7
7
  var defaultCommandRunner = (command, options) => {
8
8
  return new Promise((resolve2, reject) => {
@@ -78,6 +78,62 @@ function formatShellCommand(command) {
78
78
  return [command.command, ...command.args].join(" ");
79
79
  }
80
80
 
81
+ // ../cli/src/provider-detection.ts
82
+ function escapeRegExp(value) {
83
+ return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
84
+ }
85
+ function maskNonCode(source, maskStrings = true) {
86
+ return source.replace(
87
+ /<!--[\s\S]*?-->|\/\*[\s\S]*?\*\/|\/\/[^\r\n]*|"(?:\\[\s\S]|[^"\\])*"|'(?:\\[\s\S]|[^'\\])*'|`(?:\\[\s\S]|[^`\\])*`/g,
88
+ (match) => {
89
+ const isString = ['"', "'", "`"].includes(match[0] ?? "");
90
+ return !maskStrings && isString ? match : match.replace(/[^\r\n]/g, " ");
91
+ }
92
+ );
93
+ }
94
+ function runtimeBindings(source, code, packageName, exported) {
95
+ const names = [];
96
+ const namespaces = [];
97
+ const importSource = maskNonCode(source, false);
98
+ const pattern = /^import\s+([^;]*?)\s+from\s*(["'])([^"']+)\2/;
99
+ for (const position of code.matchAll(/\bimport\b/g)) {
100
+ const match = importSource.slice(position.index).match(pattern);
101
+ if (!match || match[3] !== packageName) continue;
102
+ const bindings = maskNonCode(match[1] ?? "").trim();
103
+ if (/^type\b/.test(bindings)) continue;
104
+ const namespace = bindings.match(/\*\s+as\s+([A-Za-z_$][\w$]*)/);
105
+ if (namespace?.[1]) namespaces.push(namespace[1]);
106
+ for (const binding of (bindings.match(/\{([^}]*)\}/)?.[1] ?? "").split(",")) {
107
+ const named = binding.trim().match(new RegExp(`^${escapeRegExp(exported)}(?:\\s+as\\s+([A-Za-z_$][\\w$]*))?$`));
108
+ if (named) names.push(named[1] ?? exported);
109
+ }
110
+ if (packageName === "react") {
111
+ const defaultBinding = bindings.match(/^([A-Za-z_$][\w$]*)\s*(?:,|$)/);
112
+ if (defaultBinding?.[1]) namespaces.push(defaultBinding[1]);
113
+ }
114
+ }
115
+ return [...names, ...namespaces.map((name) => `${name}.${exported}`)];
116
+ }
117
+ function hasConfiguredProvider(source, adapter) {
118
+ const code = maskNonCode(source);
119
+ const providers = runtimeBindings(source, code, `@marwes-ui/${adapter}`, "MarwesProvider");
120
+ const renderers = adapter === "react" ? runtimeBindings(source, code, "react", "createElement") : adapter === "vue" ? runtimeBindings(source, code, "vue", "h") : [];
121
+ return providers.some((provider) => {
122
+ const tags = [provider];
123
+ if (adapter === "vue" && !provider.includes(".")) {
124
+ tags.push(provider.replace(/([a-z0-9])([A-Z])/g, "$1-$2").toLowerCase());
125
+ }
126
+ if (tags.some((name) => new RegExp(`<\\s*${escapeRegExp(name)}(?:\\s|/?>)`).test(code))) {
127
+ return true;
128
+ }
129
+ return renderers.some(
130
+ (renderer) => new RegExp(
131
+ `(?:^|[^\\w$.])${escapeRegExp(renderer)}\\s*\\(\\s*${escapeRegExp(provider)}\\s*[,)]`
132
+ ).test(code)
133
+ );
134
+ });
135
+ }
136
+
81
137
  // ../cli/src/recipes.ts
82
138
  var adapters = ["react", "vue", "svelte"];
83
139
  var packageManagers = ["pnpm", "npm", "yarn", "bun"];
@@ -129,12 +185,17 @@ function adapterFromTemplate(template) {
129
185
  }
130
186
  return "svelte";
131
187
  }
188
+ function supportedPackageManagersLabel() {
189
+ return packageManagers.join("|");
190
+ }
132
191
  function supportedTemplatesLabel() {
133
192
  return marwesTemplates.join("|");
134
193
  }
135
194
 
136
195
  // ../cli/src/doctor.ts
137
196
  var sourceExtensions = /* @__PURE__ */ new Set([".ts", ".tsx", ".js", ".jsx", ".vue", ".svelte", ".css"]);
197
+ var sourceDirectories = ["src", "app", "pages"];
198
+ var knownRootFile = /^(?:main|app|layout|index|root)\.(?:ts|tsx|js|jsx|vue|svelte)$/i;
138
199
  function dependencyVersion(packageJson, packageName) {
139
200
  return packageJson.dependencies?.[packageName] ?? packageJson.devDependencies?.[packageName] ?? packageJson.peerDependencies?.[packageName] ?? packageJson.optionalDependencies?.[packageName];
140
201
  }
@@ -148,33 +209,51 @@ async function collectSourceFiles(directory) {
148
209
  for (const entry of entries) {
149
210
  const path = join(directory, entry.name);
150
211
  if (entry.isDirectory()) {
151
- if (entry.name === "node_modules" || entry.name === "dist" || entry.name === ".git") {
212
+ if (["node_modules", "dist", ".git", ".next", ".svelte-kit"].includes(entry.name)) {
152
213
  continue;
153
214
  }
154
215
  files.push(...await collectSourceFiles(path));
155
216
  continue;
156
217
  }
157
- const extension = entry.name.slice(entry.name.lastIndexOf("."));
158
- if (sourceExtensions.has(extension)) {
218
+ if (sourceExtensions.has(extname(entry.name))) {
159
219
  files.push(path);
160
220
  }
161
221
  }
162
222
  return files;
163
223
  }
224
+ async function readProjectSources(cwd) {
225
+ const paths = /* @__PURE__ */ new Set();
226
+ for (const directory of sourceDirectories) {
227
+ for (const file of await collectSourceFiles(join(cwd, directory))) {
228
+ paths.add(file);
229
+ }
230
+ }
231
+ const rootEntries = await readdir(cwd, { withFileTypes: true }).catch(() => []);
232
+ for (const entry of rootEntries) {
233
+ if (entry.isFile() && knownRootFile.test(entry.name)) {
234
+ paths.add(join(cwd, entry.name));
235
+ }
236
+ }
237
+ return Promise.all(
238
+ [...paths].map(async (path) => ({ path, source: await readFile(path, "utf8") }))
239
+ );
240
+ }
164
241
  function detectInstalledAdapter(packageJson) {
165
242
  return adapters.find(
166
243
  (adapter) => dependencyVersion(packageJson, getAdapterRecipe(adapter).packageName)
167
244
  );
168
245
  }
169
- async function sourceContains(cwd, needle) {
170
- const sourceFiles = await collectSourceFiles(join(cwd, "src"));
171
- for (const file of sourceFiles) {
172
- const source = await readFile(file, "utf8");
173
- if (source.includes(needle)) {
174
- return true;
175
- }
176
- }
177
- return false;
246
+ function escapeRegExp2(value) {
247
+ return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
248
+ }
249
+ function providerSetupFile(sources, adapter) {
250
+ return sources.find((file) => hasConfiguredProvider(file.source, adapter));
251
+ }
252
+ function sourceContains(sources, needle) {
253
+ return sources.some((file) => file.source.includes(needle));
254
+ }
255
+ function sourceMatches(sources, pattern) {
256
+ return sources.some((file) => pattern.test(file.source));
178
257
  }
179
258
  function formatItem(item) {
180
259
  const prefix = item.level === "pass" ? "[pass]" : item.level === "warn" ? "[warn]" : "[fail]";
@@ -187,7 +266,9 @@ async function runDoctor(options = {}) {
187
266
  const runner = options.runner ?? defaultCommandRunner;
188
267
  const packageJson = await readPackageJson(cwd);
189
268
  const adapter = options.adapter ?? detectInstalledAdapter(packageJson);
269
+ const sources = await readProjectSources(cwd);
190
270
  const items = [];
271
+ let commandFailureCode;
191
272
  if (!adapter) {
192
273
  items.push({
193
274
  level: "fail",
@@ -207,12 +288,16 @@ async function runDoctor(options = {}) {
207
288
  });
208
289
  }
209
290
  }
210
- const hasProvider = await sourceContains(cwd, "MarwesProvider");
291
+ const providerFile = providerSetupFile(sources, adapter);
292
+ const providerMentioned = sourceContains(sources, "MarwesProvider");
211
293
  items.push(
212
- hasProvider ? { level: "pass", message: "MarwesProvider is referenced in app source." } : {
213
- level: "warn",
214
- message: "MarwesProvider was not found in app source.",
215
- fix: `Wrap the app root with MarwesProvider from ${recipe.packageName}.`
294
+ providerFile ? {
295
+ level: "pass",
296
+ message: `MarwesProvider is imported from ${recipe.packageName} and rendered in ${basename(providerFile.path)}.`
297
+ } : {
298
+ level: "fail",
299
+ message: providerMentioned ? `MarwesProvider is not both imported from ${recipe.packageName} and rendered in the same app entry file.` : "MarwesProvider was not rendered in app source.",
300
+ fix: `Wrap the app root with MarwesProvider from ${recipe.packageName}. Checked src/, app/, pages/, and known root entry files.`
216
301
  }
217
302
  );
218
303
  }
@@ -224,8 +309,16 @@ async function runDoctor(options = {}) {
224
309
  fix: "App projects should import from the public adapter package instead."
225
310
  });
226
311
  }
312
+ const escapedPackage = escapeRegExp2(internalPackage);
313
+ if (sourceMatches(sources, new RegExp(`(?:from\\s*|import\\s*)["']${escapedPackage}(?:["'/])`))) {
314
+ items.push({
315
+ level: "warn",
316
+ message: `Direct source import from ${internalPackage} found.`,
317
+ fix: "Import consumer APIs from the framework adapter package instead."
318
+ });
319
+ }
227
320
  }
228
- if (await sourceContains(cwd, "@marwes-ui/presets/firstEdition/styles.css")) {
321
+ if (sourceMatches(sources, /["']@marwes-ui\/presets\/[^"']*styles\.css["']/)) {
229
322
  items.push({
230
323
  level: "warn",
231
324
  message: "Manual Marwes preset stylesheet import found.",
@@ -234,22 +327,34 @@ async function runDoctor(options = {}) {
234
327
  }
235
328
  if (options.runBuild) {
236
329
  const packageManager = options.packageManager ?? await detectPackageManager(cwd);
237
- const scriptName = packageJson.scripts?.typecheck ? "typecheck" : packageJson.scripts?.build ? "build" : void 0;
238
- if (!scriptName) {
239
- items.push({ level: "warn", message: "No typecheck or build script found to run." });
240
- } else {
330
+ if (!packageJson.scripts?.build) {
331
+ items.push({
332
+ level: "fail",
333
+ message: "No build script found to run.",
334
+ fix: "Add a production build script to package.json, then rerun marwes doctor --run-build."
335
+ });
336
+ }
337
+ const scripts = [
338
+ ...packageJson.scripts?.typecheck ? ["typecheck"] : [],
339
+ ...packageJson.scripts?.build ? ["build"] : []
340
+ ];
341
+ for (const scriptName of scripts) {
241
342
  const command = runScriptCommand(packageManager, scriptName);
242
343
  write(`Running ${formatShellCommand(command)}`);
243
344
  const exitCode3 = await runner(command, { cwd });
345
+ if (exitCode3 !== 0) {
346
+ commandFailureCode = exitCode3;
347
+ }
244
348
  items.push(
245
- exitCode3 === 0 ? { level: "pass", message: `${scriptName} completed successfully.` } : { level: "fail", message: `${scriptName} failed.` }
349
+ exitCode3 === 0 ? { level: "pass", message: `${scriptName} completed successfully.` } : { level: "fail", message: `${scriptName} failed with exit code ${exitCode3}.` }
246
350
  );
351
+ if (exitCode3 !== 0) break;
247
352
  }
248
353
  }
249
354
  for (const item of items) {
250
355
  write(formatItem(item));
251
356
  }
252
- const exitCode2 = items.some((item) => item.level === "fail") ? 1 : 0;
357
+ const exitCode2 = commandFailureCode ?? (items.some((item) => item.level === "fail") ? 1 : 0);
253
358
  return { ...adapter ? { adapter } : {}, items, exitCode: exitCode2 };
254
359
  }
255
360
  async function fileExists(path) {
@@ -303,25 +408,39 @@ async function patchReact(cwd, dryRun) {
303
408
  if (!relativeFile) {
304
409
  return {
305
410
  adapter: "react",
411
+ status: "manual-action-required",
306
412
  changed: false,
307
413
  dryRun,
414
+ searchedFiles: candidates,
308
415
  message: "No React Vite entrypoint found. Expected src/main.tsx or src/main.jsx."
309
416
  };
310
417
  }
311
418
  const file = join(cwd, relativeFile);
312
419
  const source = await readFile(file, "utf8");
313
- if (source.includes("MarwesProvider")) {
420
+ if (hasConfiguredProvider(source, "react")) {
314
421
  return {
315
422
  adapter: "react",
423
+ status: "already-configured",
316
424
  changed: false,
317
425
  dryRun,
318
426
  file: relativeFile,
319
427
  message: "React entrypoint already references MarwesProvider."
320
428
  };
321
429
  }
430
+ if (source.includes("MarwesProvider")) {
431
+ return {
432
+ adapter: "react",
433
+ status: "manual-action-required",
434
+ changed: false,
435
+ dryRun,
436
+ file: relativeFile,
437
+ message: "React entrypoint references MarwesProvider but not with a verified @marwes-ui/react import and render."
438
+ };
439
+ }
322
440
  if (!source.includes("<App />")) {
323
441
  return {
324
442
  adapter: "react",
443
+ status: "manual-action-required",
325
444
  changed: false,
326
445
  dryRun,
327
446
  file: relativeFile,
@@ -336,6 +455,7 @@ async function patchReact(cwd, dryRun) {
336
455
  const changed = await writeIfNeeded(file, next, dryRun);
337
456
  return {
338
457
  adapter: "react",
458
+ status: changed ? "applied" : "already-configured",
339
459
  changed,
340
460
  dryRun,
341
461
  file: relativeFile,
@@ -365,25 +485,39 @@ async function patchVue(cwd, dryRun) {
365
485
  if (!await fileExists(file)) {
366
486
  return {
367
487
  adapter: "vue",
488
+ status: "manual-action-required",
368
489
  changed: false,
369
490
  dryRun,
491
+ searchedFiles: [relativeFile],
370
492
  message: "No Vue starter component found. Expected src/App.vue."
371
493
  };
372
494
  }
373
495
  const source = await readFile(file, "utf8");
374
- if (source.includes("<MarwesProvider")) {
496
+ if (hasConfiguredProvider(source, "vue")) {
375
497
  return {
376
498
  adapter: "vue",
499
+ status: "already-configured",
377
500
  changed: false,
378
501
  dryRun,
379
502
  file: relativeFile,
380
503
  message: "Vue starter component already contains MarwesProvider."
381
504
  };
382
505
  }
506
+ if (source.includes("MarwesProvider")) {
507
+ return {
508
+ adapter: "vue",
509
+ status: "manual-action-required",
510
+ changed: false,
511
+ dryRun,
512
+ file: relativeFile,
513
+ message: "Vue starter references MarwesProvider but not with a verified @marwes-ui/vue import and render."
514
+ };
515
+ }
383
516
  const templateMatch = source.match(/<template>([\s\S]*?)<\/template>/);
384
517
  if (!templateMatch) {
385
518
  return {
386
519
  adapter: "vue",
520
+ status: "manual-action-required",
387
521
  changed: false,
388
522
  dryRun,
389
523
  file: relativeFile,
@@ -394,6 +528,7 @@ async function patchVue(cwd, dryRun) {
394
528
  if (!innerTemplate) {
395
529
  return {
396
530
  adapter: "vue",
531
+ status: "manual-action-required",
397
532
  changed: false,
398
533
  dryRun,
399
534
  file: relativeFile,
@@ -412,6 +547,7 @@ async function patchVue(cwd, dryRun) {
412
547
  const changed = await writeIfNeeded(file, next, dryRun);
413
548
  return {
414
549
  adapter: "vue",
550
+ status: changed ? "applied" : "already-configured",
415
551
  changed,
416
552
  dryRun,
417
553
  file: relativeFile,
@@ -444,27 +580,41 @@ async function patchSvelte(cwd, dryRun) {
444
580
  if (!await fileExists(file)) {
445
581
  return {
446
582
  adapter: "svelte",
583
+ status: "manual-action-required",
447
584
  changed: false,
448
585
  dryRun,
586
+ searchedFiles: [relativeFile],
449
587
  message: "No Svelte starter component found. Expected src/App.svelte."
450
588
  };
451
589
  }
452
590
  const source = await readFile(file, "utf8");
453
- if (source.includes("<MarwesProvider")) {
591
+ if (hasConfiguredProvider(source, "svelte")) {
454
592
  return {
455
593
  adapter: "svelte",
594
+ status: "already-configured",
456
595
  changed: false,
457
596
  dryRun,
458
597
  file: relativeFile,
459
598
  message: "Svelte starter component already contains MarwesProvider."
460
599
  };
461
600
  }
601
+ if (source.includes("MarwesProvider")) {
602
+ return {
603
+ adapter: "svelte",
604
+ status: "manual-action-required",
605
+ changed: false,
606
+ dryRun,
607
+ file: relativeFile,
608
+ message: "Svelte starter references MarwesProvider but not with a verified @marwes-ui/svelte import and render."
609
+ };
610
+ }
462
611
  const scriptBlocks = blockMatches(source, "script");
463
612
  const styleBlocks = blockMatches(source, "style");
464
613
  const body = removeBlocks(source, [...scriptBlocks, ...styleBlocks]).trim();
465
614
  if (!body) {
466
615
  return {
467
616
  adapter: "svelte",
617
+ status: "manual-action-required",
468
618
  changed: false,
469
619
  dryRun,
470
620
  file: relativeFile,
@@ -486,6 +636,7 @@ ${styles}` : ""
486
636
  `, dryRun);
487
637
  return {
488
638
  adapter: "svelte",
639
+ status: changed ? "applied" : "already-configured",
489
640
  changed,
490
641
  dryRun,
491
642
  file: relativeFile,
@@ -502,23 +653,79 @@ async function patchProject(cwd, adapter, dryRun) {
502
653
  return patchSvelte(cwd, dryRun);
503
654
  }
504
655
 
505
- // ../cli/src/init.ts
506
- function providerGuidance(adapter) {
656
+ // ../cli/src/setup-guidance.ts
657
+ function providerExample(adapter) {
658
+ const packageName = getAdapterRecipe(adapter).packageName;
659
+ const providerImport = `import { MarwesProvider, type ThemeInput } from "${packageName}"`;
660
+ const theme = 'const brandTheme = { color: { primary: "#2457FF" } } satisfies ThemeInput';
661
+ if (adapter === "react") {
662
+ return [
663
+ 'import { createRoot } from "react-dom/client"',
664
+ providerImport,
665
+ 'import App from "./App"',
666
+ "",
667
+ theme,
668
+ "",
669
+ 'createRoot(document.getElementById("root")!).render(',
670
+ " <MarwesProvider theme={brandTheme}>",
671
+ " <App />",
672
+ " </MarwesProvider>,",
673
+ ")"
674
+ ].join("\n");
675
+ }
676
+ return [
677
+ adapter === "vue" ? '<script setup lang="ts">' : '<script lang="ts">',
678
+ ` ${providerImport}`,
679
+ ` ${theme}`,
680
+ "</script>",
681
+ "",
682
+ ...adapter === "vue" ? [
683
+ "<template>",
684
+ ' <MarwesProvider :theme="brandTheme">',
685
+ " <main>Your app</main>",
686
+ " </MarwesProvider>",
687
+ "</template>"
688
+ ] : ["<MarwesProvider theme={brandTheme}>", " <main>Your app</main>", "</MarwesProvider>"]
689
+ ].join("\n");
690
+ }
691
+ function setupGuidance(adapter, fullExample) {
507
692
  const recipe = getAdapterRecipe(adapter);
508
- return `Manual follow-up: wrap the app root with ${recipe.providerImport} from ${recipe.packageName}.`;
693
+ const ssrIntegration = { react: "next", vue: "nuxt", svelte: "sveltekit" }[adapter];
694
+ const hookGuidance = {
695
+ react: "useTheme() returns resolved concrete values: const theme = useTheme(); read theme.color.primary.base.",
696
+ vue: "useTheme() returns a resolved snapshot directly, not a ref: const theme = useTheme(); read theme.color.primary.base (no .value).",
697
+ svelte: "useTheme() returns a .theme getter: const themeState = useTheme(); read themeState.theme.color.primary.base. Keep the getter object; destructuring .theme takes a snapshot."
698
+ }[adapter];
699
+ return [
700
+ "Marwes setup guidance:",
701
+ `- Import Marwes APIs only from ${recipe.packageName}.`,
702
+ "- Do not install or import @marwes-ui/core or @marwes-ui/presets directly.",
703
+ "- Default preset CSS loads automatically from the adapter; do not add a separate Marwes stylesheet import.",
704
+ "- Wrap the app once with MarwesProvider; pass a small typed ThemeInput override. Unspecified values retain defaults.",
705
+ "- --mw-* CSS variables are scoped to the provider and its descendants, not :root. Keep app styles and runtime consumers below the provider.",
706
+ "- Use mwThemeVars for CSS var(...) references, not concrete JavaScript values. Call useTheme() only in a child component below MarwesProvider.",
707
+ `- ${hookGuidance}`,
708
+ ...fullExample ? [
709
+ `Complete ${recipe.displayName} provider example:`,
710
+ providerExample(adapter),
711
+ `Component example: import { PrimaryButton } from "${recipe.packageName}"; render <PrimaryButton>Save</PrimaryButton> below the provider. Use public components, not invented mw-* replacement classes.`,
712
+ `Token example: import { mwThemeVars } from "${recipe.packageName}"; use mwThemeVars.color.text and mwThemeVars.spacing.sp24 in app-owned styles below the provider.`,
713
+ "For SSR, follow the framework guide for matching style/script helpers and provider options before hydration; changing html classes alone is not no-flash setup."
714
+ ] : [],
715
+ `Setup guide: https://marwes.io/docs/get-started/${adapter}/`,
716
+ "Theming guide: https://marwes.io/docs/theming/",
717
+ `SSR guide: https://marwes.io/docs/integrations/${ssrIntegration}/`,
718
+ ...fullExample ? [
719
+ "AI discovery: https://marwes.io/llms.txt",
720
+ `AI framework guide: https://marwes.io/ai/${adapter}.md`,
721
+ "Public export inventory: https://marwes.io/ai/v1/public-api.json"
722
+ ] : []
723
+ ];
509
724
  }
725
+
726
+ // ../cli/src/init.ts
510
727
  function shouldPrintProviderGuidance(patch) {
511
- if (!patch || patch.changed) {
512
- return false;
513
- }
514
- return !patch.message.toLowerCase().includes("already");
515
- }
516
- function writeAgenticBoundaryRules(adapter, write) {
517
- const recipe = getAdapterRecipe(adapter);
518
- write("Agentic rules:");
519
- write(`- Import Marwes APIs only from ${recipe.packageName}.`);
520
- write("- Do not install @marwes-ui/core or @marwes-ui/presets directly.");
521
- write("- Do not add a separate Marwes stylesheet import.");
728
+ return patch?.status === "manual-action-required";
522
729
  }
523
730
  async function runInit(options) {
524
731
  const cwd = options.cwd ?? process.cwd();
@@ -545,7 +752,12 @@ async function runInit(options) {
545
752
  } else {
546
753
  exitCode2 = await runner(command, { cwd });
547
754
  if (exitCode2 !== 0) {
755
+ write("Marwes init status: failed.");
756
+ write(
757
+ `Marwes init failed: installation command exited with code ${exitCode2}. Provider patching and doctor were not run.`
758
+ );
548
759
  return {
760
+ status: "failed",
549
761
  adapter: options.adapter,
550
762
  packageManager,
551
763
  installCommand: commandLabel,
@@ -562,29 +774,47 @@ async function runInit(options) {
562
774
  patch = await patchProject(cwd, options.adapter, dryRun);
563
775
  const patchLabel = patch.file ? `${patch.file}: ${patch.message}` : patch.message;
564
776
  write(dryRun && patch.changed ? `[dry-run] ${patchLabel}` : patchLabel);
777
+ if (patch.searchedFiles?.length) {
778
+ write(`Files searched: ${patch.searchedFiles.join(", ")}`);
779
+ }
565
780
  }
566
781
  let doctor;
567
- if (agentic) {
568
- if (shouldPrintProviderGuidance(patch) || noPatch) {
569
- write(providerGuidance(options.adapter));
570
- }
571
- writeAgenticBoundaryRules(options.adapter, write);
572
- if (dryRun) {
573
- write(`[dry-run] marwes doctor --adapter ${options.adapter}`);
574
- } else {
575
- write("Marwes doctor:");
576
- doctor = await runDoctor({
577
- adapter: options.adapter,
578
- cwd,
579
- packageManager,
580
- runner,
581
- write
582
- });
583
- exitCode2 = doctor.exitCode;
584
- }
782
+ if (dryRun) {
783
+ write(`[dry-run] marwes doctor --adapter ${options.adapter}`);
784
+ } else {
785
+ write("Marwes doctor:");
786
+ doctor = await runDoctor({
787
+ adapter: options.adapter,
788
+ cwd,
789
+ packageManager,
790
+ runner,
791
+ write
792
+ });
793
+ }
794
+ const providerFailure = doctor?.items.some(
795
+ (item) => item.level === "fail" && item.message.startsWith("MarwesProvider")
796
+ ) === true;
797
+ const otherFailure = doctor?.items.some(
798
+ (item) => item.level === "fail" && !item.message.startsWith("MarwesProvider")
799
+ ) === true;
800
+ const needsManualAction = providerFailure && (shouldPrintProviderGuidance(patch) || noPatch);
801
+ const status = otherFailure ? "failed" : needsManualAction ? "manual-action-required" : doctor && doctor.exitCode !== 0 ? "failed" : "complete";
802
+ if (needsManualAction) {
803
+ write(
804
+ `Manual follow-up: wrap the app root with ${recipe.providerImport} from ${recipe.packageName}.`
805
+ );
806
+ write("Automatic patching currently supports the standard Vite app layout.");
585
807
  }
586
- write("Marwes init complete.");
808
+ if (agentic || needsManualAction || status === "complete") {
809
+ for (const line of setupGuidance(options.adapter, agentic || needsManualAction)) write(line);
810
+ }
811
+ exitCode2 = status === "manual-action-required" ? 2 : status === "failed" ? doctor?.exitCode ?? 1 : 0;
812
+ write(dryRun ? `[dry-run] Planned init status: ${status}.` : `Marwes init status: ${status}.`);
813
+ write(
814
+ dryRun ? "[dry-run] Marwes init plan complete. No installation, file changes, or doctor checks performed." : status === "complete" ? "Marwes init complete." : status === "manual-action-required" ? "Marwes provider wiring requires manual action (exit code 2)." : "Marwes init failed."
815
+ );
587
816
  return {
817
+ status,
588
818
  adapter: options.adapter,
589
819
  packageManager,
590
820
  installCommand: commandLabel,
@@ -597,10 +827,35 @@ async function runInit(options) {
597
827
  }
598
828
 
599
829
  // ../cli/src/create.ts
830
+ var safeProjectPathPattern = /^[a-zA-Z0-9][a-zA-Z0-9._-]*(?:\/[a-zA-Z0-9][a-zA-Z0-9._-]*)*$/;
831
+ function isSafeProjectPath(projectName) {
832
+ return safeProjectPathPattern.test(projectName);
833
+ }
834
+ async function stageAdapterDependency(cwd, adapter) {
835
+ const packageJsonPath = resolve(cwd, "package.json");
836
+ const packageJson = JSON.parse(await readFile(packageJsonPath, "utf8"));
837
+ const packageName = getAdapterRecipe(adapter).packageName;
838
+ const dependencies = packageJson.dependencies ?? {};
839
+ if (!(packageName in dependencies) && !(packageName in (packageJson.devDependencies ?? {}))) {
840
+ packageJson.dependencies = { ...dependencies, [packageName]: "latest" };
841
+ await writeFile(packageJsonPath, `${JSON.stringify(packageJson, null, 2)}
842
+ `);
843
+ }
844
+ }
600
845
  async function runCreate(options) {
601
846
  const cwd = options.cwd ?? process.cwd();
602
847
  const write = options.write ?? ((message) => console.log(message));
603
848
  const runner = options.runner ?? defaultCommandRunner;
849
+ if (!isSafeProjectPath(options.projectName)) {
850
+ write(
851
+ "Invalid project name. Use a relative path made from letters, numbers, dots, dashes, underscores, and forward slashes."
852
+ );
853
+ return {
854
+ projectName: options.projectName,
855
+ template: options.template,
856
+ exitCode: 1
857
+ };
858
+ }
604
859
  const packageManager = options.packageManager ?? await detectPackageManager(cwd);
605
860
  const command = createViteCommand(packageManager, options.projectName, options.template);
606
861
  const adapter = adapterFromTemplate(options.template);
@@ -624,6 +879,12 @@ async function runCreate(options) {
624
879
  exitCode: createExitCode
625
880
  };
626
881
  }
882
+ if (options.noInstall) {
883
+ await stageAdapterDependency(targetCwd, adapter);
884
+ write(
885
+ `Recorded ${getAdapterRecipe(adapter).packageName} in package.json. Run ${packageManager} install before starting the app.`
886
+ );
887
+ }
627
888
  const initResult = await runInit({
628
889
  adapter,
629
890
  cwd: targetCwd,
@@ -640,11 +901,31 @@ async function runCreate(options) {
640
901
  }
641
902
 
642
903
  // ../cli/src/index.ts
904
+ function wantsHelp(args) {
905
+ return args.includes("--help") || args.includes("-h") || args[0] === "help";
906
+ }
907
+ function writeCreateHelp(write) {
908
+ write(`create-marwes <name> --template <${supportedTemplatesLabel()}>
909
+
910
+ Create a new Vite app and configure its Marwes adapter.
911
+
912
+ Options:
913
+ --template <${supportedTemplatesLabel()}>
914
+ --pm <${supportedPackageManagersLabel()}>
915
+ --dry-run
916
+ --no-install
917
+ --help
918
+ `);
919
+ }
643
920
  function parsePackageManager(value) {
644
921
  return typeof value === "string" && isPackageManager(value) ? value : void 0;
645
922
  }
646
923
  async function runCreateMarwesCli(argv, options = {}) {
647
924
  const write = options.write ?? ((message) => console.log(message));
925
+ if (wantsHelp(argv)) {
926
+ writeCreateHelp(write);
927
+ return 0;
928
+ }
648
929
  const parsed = parseArgs({
649
930
  args: argv,
650
931
  options: {
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../../cli/src/command-runner.ts","../../cli/src/package-manager.ts","../../cli/src/recipes.ts","../../cli/src/doctor.ts","../../cli/src/patchers.ts","../../cli/src/init.ts","../../cli/src/create.ts","../../cli/src/index.ts","../src/cli.ts"],"names":["resolve","join","exitCode","access","readFile"],"mappings":"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","file":"cli.js","sourcesContent":["import { spawn } from \"node:child_process\"\nimport type { ShellCommand } from \"./package-manager\"\n\nexport type CommandRunner = (\n command: ShellCommand,\n options: {\n cwd: string\n },\n) => Promise<number>\n\nexport const defaultCommandRunner: CommandRunner = (command, options) => {\n return new Promise((resolve, reject) => {\n const child = spawn(command.command, command.args, {\n cwd: options.cwd,\n stdio: \"inherit\",\n shell: process.platform === \"win32\",\n })\n\n child.on(\"error\", reject)\n child.on(\"exit\", (code) => resolve(code ?? 1))\n })\n}\n","import { access } from \"node:fs/promises\"\nimport { join } from \"node:path\"\nimport type { PackageManager } from \"./recipes\"\n\nexport type ShellCommand = {\n command: string\n args: string[]\n}\n\nasync function exists(path: string): Promise<boolean> {\n try {\n await access(path)\n return true\n } catch {\n return false\n }\n}\n\nexport async function detectPackageManager(cwd: string): Promise<PackageManager> {\n if (await exists(join(cwd, \"pnpm-lock.yaml\"))) {\n return \"pnpm\"\n }\n\n if ((await exists(join(cwd, \"bun.lockb\"))) || (await exists(join(cwd, \"bun.lock\")))) {\n return \"bun\"\n }\n\n if (await exists(join(cwd, \"yarn.lock\"))) {\n return \"yarn\"\n }\n\n if (await exists(join(cwd, \"package-lock.json\"))) {\n return \"npm\"\n }\n\n return \"pnpm\"\n}\n\nexport function installCommand(\n packageManager: PackageManager,\n packages: readonly string[],\n): ShellCommand {\n if (packageManager === \"npm\") {\n return { command: \"npm\", args: [\"install\", ...packages] }\n }\n\n return { command: packageManager, args: [\"add\", ...packages] }\n}\n\nexport function runScriptCommand(packageManager: PackageManager, scriptName: string): ShellCommand {\n if (packageManager === \"npm\" || packageManager === \"pnpm\" || packageManager === \"bun\") {\n return { command: packageManager, args: [\"run\", scriptName] }\n }\n\n return { command: \"yarn\", args: [scriptName] }\n}\n\nexport function createViteCommand(\n packageManager: PackageManager,\n projectName: string,\n viteTemplate: string,\n): ShellCommand {\n if (packageManager === \"pnpm\") {\n return {\n command: \"pnpm\",\n args: [\"create\", \"vite@latest\", projectName, \"--\", \"--template\", viteTemplate],\n }\n }\n\n if (packageManager === \"npm\") {\n return {\n command: \"npm\",\n args: [\"create\", \"vite@latest\", projectName, \"--\", \"--template\", viteTemplate],\n }\n }\n\n if (packageManager === \"bun\") {\n return {\n command: \"bun\",\n args: [\"create\", \"vite\", projectName, \"--template\", viteTemplate],\n }\n }\n\n return {\n command: \"yarn\",\n args: [\"create\", \"vite\", projectName, \"--template\", viteTemplate],\n }\n}\n\nexport function formatShellCommand(command: ShellCommand): string {\n return [command.command, ...command.args].join(\" \")\n}\n","export const adapters = [\"react\", \"vue\", \"svelte\"] as const\nexport type Adapter = (typeof adapters)[number]\n\nexport const packageManagers = [\"pnpm\", \"npm\", \"yarn\", \"bun\"] as const\nexport type PackageManager = (typeof packageManagers)[number]\n\nexport const marwesTemplates = [\"react-ts\", \"vue-ts\", \"svelte-ts\"] as const\nexport type MarwesTemplate = (typeof marwesTemplates)[number]\n\nexport type AdapterRecipe = {\n adapter: Adapter\n displayName: string\n packageName: string\n installPackages: readonly string[]\n providerImport: string\n viteTemplate: MarwesTemplate\n rootFiles: readonly string[]\n}\n\nconst adapterRecipes: Record<Adapter, AdapterRecipe> = {\n react: {\n adapter: \"react\",\n displayName: \"React\",\n packageName: \"@marwes-ui/react\",\n installPackages: [\"@marwes-ui/react\", \"react\", \"react-dom\"],\n providerImport: \"MarwesProvider\",\n viteTemplate: \"react-ts\",\n rootFiles: [\"src/main.tsx\", \"src/main.jsx\"],\n },\n vue: {\n adapter: \"vue\",\n displayName: \"Vue\",\n packageName: \"@marwes-ui/vue\",\n installPackages: [\"@marwes-ui/vue\", \"vue\"],\n providerImport: \"MarwesProvider\",\n viteTemplate: \"vue-ts\",\n rootFiles: [\"src/App.vue\", \"src/main.ts\"],\n },\n svelte: {\n adapter: \"svelte\",\n displayName: \"Svelte\",\n packageName: \"@marwes-ui/svelte\",\n installPackages: [\"@marwes-ui/svelte\"],\n providerImport: \"MarwesProvider\",\n viteTemplate: \"svelte-ts\",\n rootFiles: [\"src/App.svelte\"],\n },\n}\n\nexport function isAdapter(value: string | undefined): value is Adapter {\n return adapters.includes(value as Adapter)\n}\n\nexport function isPackageManager(value: string | undefined): value is PackageManager {\n return packageManagers.includes(value as PackageManager)\n}\n\nexport function isMarwesTemplate(value: string | undefined): value is MarwesTemplate {\n return marwesTemplates.includes(value as MarwesTemplate)\n}\n\nexport function getAdapterRecipe(adapter: Adapter): AdapterRecipe {\n return adapterRecipes[adapter]\n}\n\nexport function adapterFromTemplate(template: MarwesTemplate): Adapter {\n if (template === \"react-ts\") {\n return \"react\"\n }\n\n if (template === \"vue-ts\") {\n return \"vue\"\n }\n\n return \"svelte\"\n}\n\nexport function templateFromAdapter(adapter: Adapter): MarwesTemplate {\n return getAdapterRecipe(adapter).viteTemplate\n}\n\nexport function packageRunnerCommand(\n packageManager: PackageManager,\n packageName = \"@marwes-ui/cli\",\n): string {\n if (packageManager === \"pnpm\") {\n return `pnpm dlx ${packageName}`\n }\n\n if (packageManager === \"npm\") {\n return `npx ${packageName}`\n }\n\n if (packageManager === \"yarn\") {\n return `yarn dlx ${packageName}`\n }\n\n return `bunx ${packageName}`\n}\n\nexport function createAgenticInitCommand(adapter: Adapter, packageManager: PackageManager): string {\n return `${packageRunnerCommand(packageManager)} init --adapter ${adapter} --agentic`\n}\n\nexport function createAiPrompt(adapter: Adapter, packageManager: PackageManager): string {\n const recipe = getAdapterRecipe(adapter)\n const installCommand = createAgenticInitCommand(adapter, packageManager)\n\n return [\n `Install and wire Marwes UI for a ${recipe.displayName} app using ${packageManager}.`,\n `Run: ${installCommand}.`,\n \"Follow the CLI output exactly.\",\n `If automatic patching is skipped, wrap the app root with ${recipe.providerImport} from ${recipe.packageName}.`,\n `Import Marwes components, enums, hooks/helpers, and theme tokens only from ${recipe.packageName}.`,\n \"Do not install @marwes-ui/core or @marwes-ui/presets directly.\",\n `Do not add a separate Marwes stylesheet import; the ${recipe.displayName} adapter loads the default styles automatically.`,\n \"Add a small smoke render, for example a Marwes Button, after the installer completes.\",\n ].join(\"\\n\")\n}\n\nexport function supportedAdaptersLabel(): string {\n return adapters.join(\"|\")\n}\n\nexport function supportedPackageManagersLabel(): string {\n return packageManagers.join(\"|\")\n}\n\nexport function supportedTemplatesLabel(): string {\n return marwesTemplates.join(\"|\")\n}\n","import { readFile, readdir } from \"node:fs/promises\"\nimport { join } from \"node:path\"\nimport type { CommandRunner } from \"./command-runner\"\nimport { defaultCommandRunner } from \"./command-runner\"\nimport { detectPackageManager, formatShellCommand, runScriptCommand } from \"./package-manager\"\nimport { type Adapter, type PackageManager, adapters, getAdapterRecipe, isAdapter } from \"./recipes\"\n\nexport type DoctorLevel = \"pass\" | \"warn\" | \"fail\"\n\nexport type DoctorItem = {\n level: DoctorLevel\n message: string\n fix?: string\n}\n\nexport type DoctorOptions = {\n adapter?: Adapter\n cwd?: string\n packageManager?: PackageManager\n runBuild?: boolean\n runner?: CommandRunner\n write?: (message: string) => void\n}\n\nexport type DoctorResult = {\n adapter?: Adapter\n items: DoctorItem[]\n exitCode: number\n}\n\ntype PackageJson = {\n scripts?: Record<string, string>\n dependencies?: Record<string, string>\n devDependencies?: Record<string, string>\n peerDependencies?: Record<string, string>\n optionalDependencies?: Record<string, string>\n}\n\nconst sourceExtensions = new Set([\".ts\", \".tsx\", \".js\", \".jsx\", \".vue\", \".svelte\", \".css\"])\n\nfunction dependencyVersion(packageJson: PackageJson, packageName: string): string | undefined {\n return (\n packageJson.dependencies?.[packageName] ??\n packageJson.devDependencies?.[packageName] ??\n packageJson.peerDependencies?.[packageName] ??\n packageJson.optionalDependencies?.[packageName]\n )\n}\n\nasync function readPackageJson(cwd: string): Promise<PackageJson> {\n const source = await readFile(join(cwd, \"package.json\"), \"utf8\")\n return JSON.parse(source) as PackageJson\n}\n\nasync function collectSourceFiles(directory: string): Promise<string[]> {\n const entries = await readdir(directory, { withFileTypes: true }).catch(() => [])\n const files: string[] = []\n\n for (const entry of entries) {\n const path = join(directory, entry.name)\n\n if (entry.isDirectory()) {\n if (entry.name === \"node_modules\" || entry.name === \"dist\" || entry.name === \".git\") {\n continue\n }\n\n files.push(...(await collectSourceFiles(path)))\n continue\n }\n\n const extension = entry.name.slice(entry.name.lastIndexOf(\".\"))\n if (sourceExtensions.has(extension)) {\n files.push(path)\n }\n }\n\n return files\n}\n\nfunction detectInstalledAdapter(packageJson: PackageJson): Adapter | undefined {\n return adapters.find((adapter) =>\n dependencyVersion(packageJson, getAdapterRecipe(adapter).packageName),\n )\n}\n\nasync function sourceContains(cwd: string, needle: string): Promise<boolean> {\n const sourceFiles = await collectSourceFiles(join(cwd, \"src\"))\n\n for (const file of sourceFiles) {\n const source = await readFile(file, \"utf8\")\n if (source.includes(needle)) {\n return true\n }\n }\n\n return false\n}\n\nfunction formatItem(item: DoctorItem): string {\n const prefix = item.level === \"pass\" ? \"[pass]\" : item.level === \"warn\" ? \"[warn]\" : \"[fail]\"\n return item.fix\n ? `${prefix} ${item.message}\\n fix: ${item.fix}`\n : `${prefix} ${item.message}`\n}\n\nexport async function runDoctor(options: DoctorOptions = {}): Promise<DoctorResult> {\n const cwd = options.cwd ?? process.cwd()\n const write = options.write ?? ((message: string) => console.log(message))\n const runner = options.runner ?? defaultCommandRunner\n const packageJson = await readPackageJson(cwd)\n const adapter = options.adapter ?? detectInstalledAdapter(packageJson)\n const items: DoctorItem[] = []\n\n if (!adapter) {\n items.push({\n level: \"fail\",\n message: \"No Marwes adapter dependency found.\",\n fix: \"Run marwes init --adapter react, marwes init --adapter vue, or marwes init --adapter svelte.\",\n })\n } else {\n const recipe = getAdapterRecipe(adapter)\n\n for (const packageName of recipe.installPackages) {\n if (dependencyVersion(packageJson, packageName)) {\n items.push({ level: \"pass\", message: `${packageName} is installed.` })\n } else {\n items.push({\n level: \"fail\",\n message: `${packageName} is missing.`,\n fix: `${options.packageManager ?? (await detectPackageManager(cwd))} add ${recipe.installPackages.join(\" \")}`,\n })\n }\n }\n\n const hasProvider = await sourceContains(cwd, \"MarwesProvider\")\n items.push(\n hasProvider\n ? { level: \"pass\", message: \"MarwesProvider is referenced in app source.\" }\n : {\n level: \"warn\",\n message: \"MarwesProvider was not found in app source.\",\n fix: `Wrap the app root with MarwesProvider from ${recipe.packageName}.`,\n },\n )\n }\n\n for (const internalPackage of [\"@marwes-ui/core\", \"@marwes-ui/presets\"]) {\n if (dependencyVersion(packageJson, internalPackage)) {\n items.push({\n level: \"warn\",\n message: `${internalPackage} is installed directly.`,\n fix: \"App projects should import from the public adapter package instead.\",\n })\n }\n }\n\n if (await sourceContains(cwd, \"@marwes-ui/presets/firstEdition/styles.css\")) {\n items.push({\n level: \"warn\",\n message: \"Manual Marwes preset stylesheet import found.\",\n fix: \"Remove the stylesheet import; adapter packages load the default styles automatically.\",\n })\n }\n\n if (options.runBuild) {\n const packageManager = options.packageManager ?? (await detectPackageManager(cwd))\n const scriptName = packageJson.scripts?.typecheck\n ? \"typecheck\"\n : packageJson.scripts?.build\n ? \"build\"\n : undefined\n\n if (!scriptName) {\n items.push({ level: \"warn\", message: \"No typecheck or build script found to run.\" })\n } else {\n const command = runScriptCommand(packageManager, scriptName)\n write(`Running ${formatShellCommand(command)}`)\n const exitCode = await runner(command, { cwd })\n items.push(\n exitCode === 0\n ? { level: \"pass\", message: `${scriptName} completed successfully.` }\n : { level: \"fail\", message: `${scriptName} failed.` },\n )\n }\n }\n\n for (const item of items) {\n write(formatItem(item))\n }\n\n const exitCode = items.some((item) => item.level === \"fail\") ? 1 : 0\n return { ...(adapter ? { adapter } : {}), items, exitCode }\n}\n\nexport function adapterFromString(value: string | undefined): Adapter | undefined {\n return isAdapter(value) ? value : undefined\n}\n","import { access, readFile, writeFile } from \"node:fs/promises\"\nimport { join } from \"node:path\"\nimport type { Adapter } from \"./recipes\"\n\nexport type PatchResult = {\n adapter: Adapter\n changed: boolean\n dryRun: boolean\n file?: string\n message: string\n}\n\nasync function fileExists(path: string): Promise<boolean> {\n try {\n await access(path)\n return true\n } catch {\n return false\n }\n}\n\nfunction insertImport(source: string, importLine: string): string {\n if (source.includes(importLine)) {\n return source\n }\n\n const lines = source.split(\"\\n\")\n let lastImportIndex = -1\n\n for (let index = 0; index < lines.length; index += 1) {\n if (lines[index]?.startsWith(\"import \")) {\n lastImportIndex = index\n }\n }\n\n if (lastImportIndex === -1) {\n return `${importLine}\\n${source}`\n }\n\n lines.splice(lastImportIndex + 1, 0, importLine)\n return lines.join(\"\\n\")\n}\n\nfunction indentBlock(source: string, indentation: string): string {\n return source\n .split(\"\\n\")\n .map((line) => (line.trim().length === 0 ? \"\" : `${indentation}${line}`))\n .join(\"\\n\")\n}\n\nasync function writeIfNeeded(path: string, source: string, dryRun: boolean): Promise<boolean> {\n const current = await readFile(path, \"utf8\")\n if (current === source) {\n return false\n }\n\n if (!dryRun) {\n await writeFile(path, source)\n }\n\n return true\n}\n\nasync function patchReact(cwd: string, dryRun: boolean): Promise<PatchResult> {\n const candidates = [\"src/main.tsx\", \"src/main.jsx\"]\n let relativeFile: string | undefined\n\n for (const candidate of candidates) {\n if (await fileExists(join(cwd, candidate))) {\n relativeFile = candidate\n break\n }\n }\n\n if (!relativeFile) {\n return {\n adapter: \"react\",\n changed: false,\n dryRun,\n message: \"No React Vite entrypoint found. Expected src/main.tsx or src/main.jsx.\",\n }\n }\n\n const file = join(cwd, relativeFile)\n const source = await readFile(file, \"utf8\")\n\n if (source.includes(\"MarwesProvider\")) {\n return {\n adapter: \"react\",\n changed: false,\n dryRun,\n file: relativeFile,\n message: \"React entrypoint already references MarwesProvider.\",\n }\n }\n\n if (!source.includes(\"<App />\")) {\n return {\n adapter: \"react\",\n changed: false,\n dryRun,\n file: relativeFile,\n message: \"React entrypoint did not contain the standard <App /> starter render.\",\n }\n }\n\n const withImport = insertImport(source, 'import { MarwesProvider } from \"@marwes-ui/react\"')\n const next = withImport.replace(\n \"<App />\",\n [\"<MarwesProvider>\", \" <App />\", \" </MarwesProvider>\"].join(\"\\n\"),\n )\n const changed = await writeIfNeeded(file, next, dryRun)\n\n return {\n adapter: \"react\",\n changed,\n dryRun,\n file: relativeFile,\n message: changed\n ? \"Wrapped the React root render with MarwesProvider.\"\n : \"React entrypoint already matched the expected MarwesProvider setup.\",\n }\n}\n\nfunction ensureVueScript(source: string): string {\n if (source.includes('MarwesProvider } from \"@marwes-ui/vue\"')) {\n return source\n }\n\n const importLine = 'import { MarwesProvider } from \"@marwes-ui/vue\"'\n const scriptSetupMatch = source.match(/<script\\s+setup[^>]*>/)\n\n if (!scriptSetupMatch?.index && scriptSetupMatch?.index !== 0) {\n return `<script setup lang=\"ts\">\\n${importLine}\\n</script>\\n\\n${source}`\n }\n\n const insertAt = scriptSetupMatch.index + scriptSetupMatch[0].length\n return `${source.slice(0, insertAt)}\\n${importLine}${source.slice(insertAt)}`\n}\n\nasync function patchVue(cwd: string, dryRun: boolean): Promise<PatchResult> {\n const relativeFile = \"src/App.vue\"\n const file = join(cwd, relativeFile)\n\n if (!(await fileExists(file))) {\n return {\n adapter: \"vue\",\n changed: false,\n dryRun,\n message: \"No Vue starter component found. Expected src/App.vue.\",\n }\n }\n\n const source = await readFile(file, \"utf8\")\n if (source.includes(\"<MarwesProvider\")) {\n return {\n adapter: \"vue\",\n changed: false,\n dryRun,\n file: relativeFile,\n message: \"Vue starter component already contains MarwesProvider.\",\n }\n }\n\n const templateMatch = source.match(/<template>([\\s\\S]*?)<\\/template>/)\n if (!templateMatch) {\n return {\n adapter: \"vue\",\n changed: false,\n dryRun,\n file: relativeFile,\n message: \"Vue starter component did not contain a standard <template> block.\",\n }\n }\n\n const innerTemplate = templateMatch[1]?.trim()\n if (!innerTemplate) {\n return {\n adapter: \"vue\",\n changed: false,\n dryRun,\n file: relativeFile,\n message: \"Vue starter template was empty.\",\n }\n }\n\n const wrappedTemplate = [\n \"<template>\",\n \" <MarwesProvider>\",\n indentBlock(innerTemplate, \" \"),\n \" </MarwesProvider>\",\n \"</template>\",\n ].join(\"\\n\")\n const withProviderTemplate = source.replace(templateMatch[0], wrappedTemplate)\n const next = ensureVueScript(withProviderTemplate)\n const changed = await writeIfNeeded(file, next, dryRun)\n\n return {\n adapter: \"vue\",\n changed,\n dryRun,\n file: relativeFile,\n message: changed\n ? \"Wrapped the Vue starter template with MarwesProvider.\"\n : \"Vue starter component already matched the expected MarwesProvider setup.\",\n }\n}\n\nfunction blockMatches(source: string, tagName: \"script\" | \"style\"): string[] {\n return source.match(new RegExp(`<${tagName}[^>]*>[\\\\s\\\\S]*?<\\\\/${tagName}>`, \"g\")) ?? []\n}\n\nfunction removeBlocks(source: string, blocks: readonly string[]): string {\n return blocks.reduce((next, block) => next.replace(block, \"\"), source)\n}\n\nfunction ensureSvelteScript(scriptBlocks: readonly string[]): string {\n const importLine = ' import { MarwesProvider } from \"@marwes-ui/svelte\"'\n const script = scriptBlocks[0]\n\n if (!script) {\n return `<script lang=\"ts\">\\n${importLine}\\n</script>`\n }\n\n if (script.includes(\"MarwesProvider\")) {\n return script\n }\n\n return script.replace(/<script([^>]*)>/i, `<script$1>\\n${importLine}`)\n}\n\nasync function patchSvelte(cwd: string, dryRun: boolean): Promise<PatchResult> {\n const relativeFile = \"src/App.svelte\"\n const file = join(cwd, relativeFile)\n\n if (!(await fileExists(file))) {\n return {\n adapter: \"svelte\",\n changed: false,\n dryRun,\n message: \"No Svelte starter component found. Expected src/App.svelte.\",\n }\n }\n\n const source = await readFile(file, \"utf8\")\n if (source.includes(\"<MarwesProvider\")) {\n return {\n adapter: \"svelte\",\n changed: false,\n dryRun,\n file: relativeFile,\n message: \"Svelte starter component already contains MarwesProvider.\",\n }\n }\n\n const scriptBlocks = blockMatches(source, \"script\")\n const styleBlocks = blockMatches(source, \"style\")\n const body = removeBlocks(source, [...scriptBlocks, ...styleBlocks]).trim()\n\n if (!body) {\n return {\n adapter: \"svelte\",\n changed: false,\n dryRun,\n file: relativeFile,\n message: \"Svelte starter component had no markup to wrap.\",\n }\n }\n\n const script = ensureSvelteScript(scriptBlocks)\n const styles = styleBlocks.join(\"\\n\\n\")\n const next = [\n script,\n \"\",\n \"<MarwesProvider>\",\n indentBlock(body, \" \"),\n \"</MarwesProvider>\",\n styles ? `\\n${styles}` : \"\",\n ]\n .filter(Boolean)\n .join(\"\\n\")\n const changed = await writeIfNeeded(file, `${next.trimEnd()}\\n`, dryRun)\n\n return {\n adapter: \"svelte\",\n changed,\n dryRun,\n file: relativeFile,\n message: changed\n ? \"Wrapped the Svelte starter markup with MarwesProvider.\"\n : \"Svelte starter component already matched the expected MarwesProvider setup.\",\n }\n}\n\nexport async function patchProject(\n cwd: string,\n adapter: Adapter,\n dryRun: boolean,\n): Promise<PatchResult> {\n if (adapter === \"react\") {\n return patchReact(cwd, dryRun)\n }\n\n if (adapter === \"vue\") {\n return patchVue(cwd, dryRun)\n }\n\n return patchSvelte(cwd, dryRun)\n}\n","import type { CommandRunner } from \"./command-runner\"\nimport { defaultCommandRunner } from \"./command-runner\"\nimport { type DoctorResult, runDoctor } from \"./doctor\"\nimport { detectPackageManager, formatShellCommand, installCommand } from \"./package-manager\"\nimport { type PatchResult, patchProject } from \"./patchers\"\nimport { type Adapter, type PackageManager, getAdapterRecipe } from \"./recipes\"\n\nexport type InitOptions = {\n adapter: Adapter\n cwd?: string\n packageManager?: PackageManager\n dryRun?: boolean\n agentic?: boolean\n yes?: boolean\n noInstall?: boolean\n noPatch?: boolean\n runner?: CommandRunner\n write?: (message: string) => void\n}\n\nexport type InitResult = {\n adapter: Adapter\n packageManager: PackageManager\n installCommand: string\n installSkipped: boolean\n patchSkipped: boolean\n patch?: PatchResult\n doctor?: DoctorResult\n exitCode: number\n}\n\nfunction providerGuidance(adapter: Adapter): string {\n const recipe = getAdapterRecipe(adapter)\n return `Manual follow-up: wrap the app root with ${recipe.providerImport} from ${recipe.packageName}.`\n}\n\nfunction shouldPrintProviderGuidance(patch: PatchResult | undefined): boolean {\n if (!patch || patch.changed) {\n return false\n }\n\n return !patch.message.toLowerCase().includes(\"already\")\n}\n\nfunction writeAgenticBoundaryRules(adapter: Adapter, write: (message: string) => void): void {\n const recipe = getAdapterRecipe(adapter)\n write(\"Agentic rules:\")\n write(`- Import Marwes APIs only from ${recipe.packageName}.`)\n write(\"- Do not install @marwes-ui/core or @marwes-ui/presets directly.\")\n write(\"- Do not add a separate Marwes stylesheet import.\")\n}\n\nexport async function runInit(options: InitOptions): Promise<InitResult> {\n const cwd = options.cwd ?? process.cwd()\n const write = options.write ?? ((message: string) => console.log(message))\n const runner = options.runner ?? defaultCommandRunner\n const recipe = getAdapterRecipe(options.adapter)\n const packageManager = options.packageManager ?? (await detectPackageManager(cwd))\n const command = installCommand(packageManager, recipe.installPackages)\n const commandLabel = formatShellCommand(command)\n const dryRun = options.dryRun === true\n const agentic = options.agentic === true\n const noInstall = options.noInstall === true\n const noPatch = options.noPatch === true\n\n write(`Marwes init: ${recipe.displayName}`)\n write(`Package manager: ${packageManager}`)\n if (agentic) {\n write(\"Mode: agentic\")\n }\n\n let exitCode = 0\n\n if (noInstall) {\n write(`Install skipped. Run manually: ${commandLabel}`)\n } else if (dryRun) {\n write(`[dry-run] ${commandLabel}`)\n } else {\n exitCode = await runner(command, { cwd })\n if (exitCode !== 0) {\n return {\n adapter: options.adapter,\n packageManager,\n installCommand: commandLabel,\n installSkipped: false,\n patchSkipped: noPatch,\n exitCode,\n }\n }\n }\n\n let patch: PatchResult | undefined\n if (noPatch) {\n write(\"Patch skipped.\")\n } else {\n patch = await patchProject(cwd, options.adapter, dryRun)\n const patchLabel = patch.file ? `${patch.file}: ${patch.message}` : patch.message\n write(dryRun && patch.changed ? `[dry-run] ${patchLabel}` : patchLabel)\n }\n\n let doctor: DoctorResult | undefined\n if (agentic) {\n if (shouldPrintProviderGuidance(patch) || noPatch) {\n write(providerGuidance(options.adapter))\n }\n\n writeAgenticBoundaryRules(options.adapter, write)\n\n if (dryRun) {\n write(`[dry-run] marwes doctor --adapter ${options.adapter}`)\n } else {\n write(\"Marwes doctor:\")\n doctor = await runDoctor({\n adapter: options.adapter,\n cwd,\n packageManager,\n runner,\n write,\n })\n exitCode = doctor.exitCode\n }\n }\n\n write(\"Marwes init complete.\")\n\n return {\n adapter: options.adapter,\n packageManager,\n installCommand: commandLabel,\n installSkipped: noInstall || dryRun,\n patchSkipped: noPatch,\n ...(patch ? { patch } : {}),\n ...(doctor ? { doctor } : {}),\n exitCode,\n }\n}\n","import { resolve } from \"node:path\"\nimport type { CommandRunner } from \"./command-runner\"\nimport { defaultCommandRunner } from \"./command-runner\"\nimport { runInit } from \"./init\"\nimport { createViteCommand, detectPackageManager, formatShellCommand } from \"./package-manager\"\nimport { type MarwesTemplate, type PackageManager, adapterFromTemplate } from \"./recipes\"\n\nexport type CreateOptions = {\n projectName: string\n template: MarwesTemplate\n cwd?: string\n packageManager?: PackageManager\n dryRun?: boolean\n noInstall?: boolean\n runner?: CommandRunner\n write?: (message: string) => void\n}\n\nexport type CreateResult = {\n projectName: string\n template: MarwesTemplate\n exitCode: number\n}\n\nexport async function runCreate(options: CreateOptions): Promise<CreateResult> {\n const cwd = options.cwd ?? process.cwd()\n const write = options.write ?? ((message: string) => console.log(message))\n const runner = options.runner ?? defaultCommandRunner\n const packageManager = options.packageManager ?? (await detectPackageManager(cwd))\n const command = createViteCommand(packageManager, options.projectName, options.template)\n const adapter = adapterFromTemplate(options.template)\n const targetCwd = resolve(cwd, options.projectName)\n\n write(`Create Marwes app: ${options.projectName}`)\n write(`Template: ${options.template}`)\n\n if (options.dryRun) {\n write(`[dry-run] ${formatShellCommand(command)}`)\n write(`[dry-run] marwes init --adapter ${adapter}`)\n return {\n projectName: options.projectName,\n template: options.template,\n exitCode: 0,\n }\n }\n\n const createExitCode = await runner(command, { cwd })\n if (createExitCode !== 0) {\n return {\n projectName: options.projectName,\n template: options.template,\n exitCode: createExitCode,\n }\n }\n\n const initResult = await runInit({\n adapter,\n cwd: targetCwd,\n packageManager,\n noInstall: options.noInstall === true,\n runner,\n write,\n })\n\n return {\n projectName: options.projectName,\n template: options.template,\n exitCode: initResult.exitCode,\n }\n}\n","import { parseArgs } from \"node:util\"\nimport { type CreateOptions, runCreate } from \"./create\"\nimport { type DoctorOptions, adapterFromString, runDoctor } from \"./doctor\"\nimport { type InitOptions, runInit } from \"./init\"\nimport {\n type PackageManager,\n createAiPrompt,\n isMarwesTemplate,\n isPackageManager,\n supportedAdaptersLabel,\n supportedPackageManagersLabel,\n supportedTemplatesLabel,\n} from \"./recipes\"\n\nexport { runCreate, type CreateOptions, type CreateResult } from \"./create\"\nexport { runDoctor, type DoctorItem, type DoctorOptions, type DoctorResult } from \"./doctor\"\nexport { runInit, type InitOptions, type InitResult } from \"./init\"\nexport {\n adapters,\n createAgenticInitCommand,\n createAiPrompt,\n getAdapterRecipe,\n marwesTemplates,\n packageRunnerCommand,\n packageManagers,\n type Adapter,\n type AdapterRecipe,\n type MarwesTemplate,\n type PackageManager,\n} from \"./recipes\"\n\ntype CliOptions = {\n cwd?: string\n write?: (message: string) => void\n}\n\nfunction writeHelp(write: (message: string) => void): void {\n write(`Marwes CLI\n\nCommands:\n marwes init --adapter <${supportedAdaptersLabel()}> [--agentic]\n marwes doctor [--adapter <${supportedAdaptersLabel()}]\n marwes ai-prompt --adapter <${supportedAdaptersLabel()}>\n marwes create <name> --template <${supportedTemplatesLabel()}>\n\nOptions:\n --pm <${supportedPackageManagersLabel()}>\n --agentic\n --dry-run\n --no-install\n --no-patch\n`)\n}\n\nfunction parsePackageManager(value: unknown): PackageManager | undefined {\n return typeof value === \"string\" && isPackageManager(value) ? value : undefined\n}\n\nexport async function runMarwesCli(argv: string[], options: CliOptions = {}): Promise<number> {\n const write = options.write ?? ((message: string) => console.log(message))\n const [command, ...args] = argv\n\n if (!command || command === \"help\" || command === \"--help\" || command === \"-h\") {\n writeHelp(write)\n return 0\n }\n\n if (command === \"init\") {\n const parsed = parseArgs({\n args,\n options: {\n adapter: { type: \"string\" },\n pm: { type: \"string\" },\n agentic: { type: \"boolean\" },\n \"dry-run\": { type: \"boolean\" },\n yes: { type: \"boolean\" },\n \"no-install\": { type: \"boolean\" },\n \"no-patch\": { type: \"boolean\" },\n },\n allowPositionals: true,\n })\n const adapter = adapterFromString(String(parsed.values.adapter ?? \"\"))\n\n if (!adapter) {\n write(`Missing or invalid --adapter. Expected one of: ${supportedAdaptersLabel()}`)\n return 1\n }\n\n const packageManager = parsePackageManager(parsed.values.pm)\n const initOptions: InitOptions = {\n adapter,\n agentic: parsed.values.agentic === true,\n dryRun: parsed.values[\"dry-run\"] === true,\n yes: parsed.values.yes === true,\n noInstall: parsed.values[\"no-install\"] === true,\n noPatch: parsed.values[\"no-patch\"] === true,\n write,\n }\n\n if (options.cwd) {\n initOptions.cwd = options.cwd\n }\n\n if (packageManager) {\n initOptions.packageManager = packageManager\n }\n\n const result = await runInit(initOptions)\n return result.exitCode\n }\n\n if (command === \"doctor\") {\n const parsed = parseArgs({\n args,\n options: {\n adapter: { type: \"string\" },\n pm: { type: \"string\" },\n \"run-build\": { type: \"boolean\" },\n },\n allowPositionals: true,\n })\n const adapter = adapterFromString(String(parsed.values.adapter ?? \"\"))\n const packageManager = parsePackageManager(parsed.values.pm)\n const doctorOptions: DoctorOptions = {\n runBuild: parsed.values[\"run-build\"] === true,\n write,\n }\n\n if (adapter) {\n doctorOptions.adapter = adapter\n }\n\n if (options.cwd) {\n doctorOptions.cwd = options.cwd\n }\n\n if (packageManager) {\n doctorOptions.packageManager = packageManager\n }\n\n const result = await runDoctor(doctorOptions)\n return result.exitCode\n }\n\n if (command === \"ai-prompt\") {\n const parsed = parseArgs({\n args,\n options: {\n adapter: { type: \"string\" },\n pm: { type: \"string\" },\n },\n allowPositionals: true,\n })\n const adapter = adapterFromString(String(parsed.values.adapter ?? \"\"))\n\n if (!adapter) {\n write(`Missing or invalid --adapter. Expected one of: ${supportedAdaptersLabel()}`)\n return 1\n }\n\n write(createAiPrompt(adapter, parsePackageManager(parsed.values.pm) ?? \"pnpm\"))\n return 0\n }\n\n if (command === \"create\") {\n return runCreateMarwesCli(args, options)\n }\n\n write(`Unknown command: ${command}`)\n writeHelp(write)\n return 1\n}\n\nexport async function runCreateMarwesCli(\n argv: string[],\n options: CliOptions = {},\n): Promise<number> {\n const write = options.write ?? ((message: string) => console.log(message))\n const parsed = parseArgs({\n args: argv,\n options: {\n template: { type: \"string\" },\n pm: { type: \"string\" },\n \"dry-run\": { type: \"boolean\" },\n \"no-install\": { type: \"boolean\" },\n },\n allowPositionals: true,\n })\n const projectName = parsed.positionals[0]\n const template = String(parsed.values.template ?? \"react-ts\")\n\n if (!projectName) {\n write(\"Missing project name.\")\n return 1\n }\n\n if (!isMarwesTemplate(template)) {\n write(`Invalid --template. Expected one of: ${supportedTemplatesLabel()}`)\n return 1\n }\n\n const packageManager = parsePackageManager(parsed.values.pm)\n const createOptions: CreateOptions = {\n projectName,\n template,\n dryRun: parsed.values[\"dry-run\"] === true,\n noInstall: parsed.values[\"no-install\"] === true,\n write,\n }\n\n if (options.cwd) {\n createOptions.cwd = options.cwd\n }\n\n if (packageManager) {\n createOptions.packageManager = packageManager\n }\n\n const result = await runCreate(createOptions)\n\n return result.exitCode\n}\n","#!/usr/bin/env node\nimport { runCreateMarwesCli } from \"@marwes-ui/cli\"\n\nconst exitCode = await runCreateMarwesCli(process.argv.slice(2))\nprocess.exitCode = exitCode\n"]}
1
+ {"version":3,"sources":["../../cli/src/command-runner.ts","../../cli/src/package-manager.ts","../../cli/src/provider-detection.ts","../../cli/src/recipes.ts","../../cli/src/doctor.ts","../../cli/src/patchers.ts","../../cli/src/setup-guidance.ts","../../cli/src/init.ts","../../cli/src/create.ts","../../cli/src/index.ts","../src/cli.ts"],"names":["resolve","join","escapeRegExp","exitCode","access","readFile","writeFile"],"mappings":"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","file":"cli.js","sourcesContent":["import { spawn } from \"node:child_process\"\nimport type { ShellCommand } from \"./package-manager\"\n\nexport type CommandRunner = (\n command: ShellCommand,\n options: {\n cwd: string\n },\n) => Promise<number>\n\nexport const defaultCommandRunner: CommandRunner = (command, options) => {\n return new Promise((resolve, reject) => {\n const child = spawn(command.command, command.args, {\n cwd: options.cwd,\n stdio: \"inherit\",\n shell: process.platform === \"win32\",\n })\n\n child.on(\"error\", reject)\n child.on(\"exit\", (code) => resolve(code ?? 1))\n })\n}\n","import { access } from \"node:fs/promises\"\nimport { join } from \"node:path\"\nimport type { PackageManager } from \"./recipes\"\n\nexport type ShellCommand = {\n command: string\n args: string[]\n}\n\nasync function exists(path: string): Promise<boolean> {\n try {\n await access(path)\n return true\n } catch {\n return false\n }\n}\n\nexport async function detectPackageManager(cwd: string): Promise<PackageManager> {\n if (await exists(join(cwd, \"pnpm-lock.yaml\"))) {\n return \"pnpm\"\n }\n\n if ((await exists(join(cwd, \"bun.lockb\"))) || (await exists(join(cwd, \"bun.lock\")))) {\n return \"bun\"\n }\n\n if (await exists(join(cwd, \"yarn.lock\"))) {\n return \"yarn\"\n }\n\n if (await exists(join(cwd, \"package-lock.json\"))) {\n return \"npm\"\n }\n\n return \"pnpm\"\n}\n\nexport function installCommand(\n packageManager: PackageManager,\n packages: readonly string[],\n): ShellCommand {\n if (packageManager === \"npm\") {\n return { command: \"npm\", args: [\"install\", ...packages] }\n }\n\n return { command: packageManager, args: [\"add\", ...packages] }\n}\n\nexport function runScriptCommand(packageManager: PackageManager, scriptName: string): ShellCommand {\n if (packageManager === \"npm\" || packageManager === \"pnpm\" || packageManager === \"bun\") {\n return { command: packageManager, args: [\"run\", scriptName] }\n }\n\n return { command: \"yarn\", args: [scriptName] }\n}\n\nexport function createViteCommand(\n packageManager: PackageManager,\n projectName: string,\n viteTemplate: string,\n): ShellCommand {\n if (packageManager === \"pnpm\") {\n return {\n command: \"pnpm\",\n args: [\"create\", \"vite@latest\", projectName, \"--\", \"--template\", viteTemplate],\n }\n }\n\n if (packageManager === \"npm\") {\n return {\n command: \"npm\",\n args: [\"create\", \"vite@latest\", projectName, \"--\", \"--template\", viteTemplate],\n }\n }\n\n if (packageManager === \"bun\") {\n return {\n command: \"bun\",\n args: [\"create\", \"vite\", projectName, \"--template\", viteTemplate],\n }\n }\n\n return {\n command: \"yarn\",\n args: [\"create\", \"vite\", projectName, \"--template\", viteTemplate],\n }\n}\n\nexport function formatShellCommand(command: ShellCommand): string {\n return [command.command, ...command.args].join(\" \")\n}\n","import type { Adapter } from \"./recipes\"\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\")\n}\n\n// Keep offsets stable so imports can be read from the original source while\n// comments and string examples cannot count as rendered application code.\nfunction maskNonCode(source: string, maskStrings = true): string {\n return source.replace(\n /<!--[\\s\\S]*?-->|\\/\\*[\\s\\S]*?\\*\\/|\\/\\/[^\\r\\n]*|\"(?:\\\\[\\s\\S]|[^\"\\\\])*\"|'(?:\\\\[\\s\\S]|[^'\\\\])*'|`(?:\\\\[\\s\\S]|[^`\\\\])*`/g,\n (match) => {\n const isString = ['\"', \"'\", \"`\"].includes(match[0] ?? \"\")\n return !maskStrings && isString ? match : match.replace(/[^\\r\\n]/g, \" \")\n },\n )\n}\n\nfunction runtimeBindings(source: string, code: string, packageName: string, exported: string) {\n const names: string[] = []\n const namespaces: string[] = []\n const importSource = maskNonCode(source, false)\n const pattern = /^import\\s+([^;]*?)\\s+from\\s*([\"'])([^\"']+)\\2/\n for (const position of code.matchAll(/\\bimport\\b/g)) {\n const match = importSource.slice(position.index).match(pattern)\n if (!match || match[3] !== packageName) continue\n const bindings = maskNonCode(match[1] ?? \"\").trim()\n if (/^type\\b/.test(bindings)) continue\n const namespace = bindings.match(/\\*\\s+as\\s+([A-Za-z_$][\\w$]*)/)\n if (namespace?.[1]) namespaces.push(namespace[1])\n for (const binding of (bindings.match(/\\{([^}]*)\\}/)?.[1] ?? \"\").split(\",\")) {\n const named = binding\n .trim()\n .match(new RegExp(`^${escapeRegExp(exported)}(?:\\\\s+as\\\\s+([A-Za-z_$][\\\\w$]*))?$`))\n if (named) names.push(named[1] ?? exported)\n }\n if (packageName === \"react\") {\n const defaultBinding = bindings.match(/^([A-Za-z_$][\\w$]*)\\s*(?:,|$)/)\n if (defaultBinding?.[1]) namespaces.push(defaultBinding[1])\n }\n }\n return [...names, ...namespaces.map((name) => `${name}.${exported}`)]\n}\n\n/** Recognize common static provider wiring, not arbitrary runtime component factories. */\nexport function hasConfiguredProvider(source: string, adapter: Adapter): boolean {\n const code = maskNonCode(source)\n const providers = runtimeBindings(source, code, `@marwes-ui/${adapter}`, \"MarwesProvider\")\n const renderers =\n adapter === \"react\"\n ? runtimeBindings(source, code, \"react\", \"createElement\")\n : adapter === \"vue\"\n ? runtimeBindings(source, code, \"vue\", \"h\")\n : []\n return providers.some((provider) => {\n const tags = [provider]\n if (adapter === \"vue\" && !provider.includes(\".\")) {\n tags.push(provider.replace(/([a-z0-9])([A-Z])/g, \"$1-$2\").toLowerCase())\n }\n if (tags.some((name) => new RegExp(`<\\\\s*${escapeRegExp(name)}(?:\\\\s|/?>)`).test(code))) {\n return true\n }\n return renderers.some((renderer) =>\n new RegExp(\n `(?:^|[^\\\\w$.])${escapeRegExp(renderer)}\\\\s*\\\\(\\\\s*${escapeRegExp(provider)}\\\\s*[,)]`,\n ).test(code),\n )\n })\n}\n","export const adapters = [\"react\", \"vue\", \"svelte\"] as const\nexport type Adapter = (typeof adapters)[number]\n\nexport const packageManagers = [\"pnpm\", \"npm\", \"yarn\", \"bun\"] as const\nexport type PackageManager = (typeof packageManagers)[number]\n\nexport const marwesTemplates = [\"react-ts\", \"vue-ts\", \"svelte-ts\"] as const\nexport type MarwesTemplate = (typeof marwesTemplates)[number]\n\nexport type AdapterRecipe = {\n adapter: Adapter\n displayName: string\n packageName: string\n installPackages: readonly string[]\n providerImport: string\n viteTemplate: MarwesTemplate\n rootFiles: readonly string[]\n}\n\nconst adapterRecipes: Record<Adapter, AdapterRecipe> = {\n react: {\n adapter: \"react\",\n displayName: \"React\",\n packageName: \"@marwes-ui/react\",\n installPackages: [\"@marwes-ui/react\", \"react\", \"react-dom\"],\n providerImport: \"MarwesProvider\",\n viteTemplate: \"react-ts\",\n rootFiles: [\"src/main.tsx\", \"src/main.jsx\"],\n },\n vue: {\n adapter: \"vue\",\n displayName: \"Vue\",\n packageName: \"@marwes-ui/vue\",\n installPackages: [\"@marwes-ui/vue\", \"vue\"],\n providerImport: \"MarwesProvider\",\n viteTemplate: \"vue-ts\",\n rootFiles: [\"src/App.vue\", \"src/main.ts\"],\n },\n svelte: {\n adapter: \"svelte\",\n displayName: \"Svelte\",\n packageName: \"@marwes-ui/svelte\",\n installPackages: [\"@marwes-ui/svelte\"],\n providerImport: \"MarwesProvider\",\n viteTemplate: \"svelte-ts\",\n rootFiles: [\"src/App.svelte\"],\n },\n}\n\nexport function isAdapter(value: string | undefined): value is Adapter {\n return adapters.includes(value as Adapter)\n}\n\nexport function isPackageManager(value: string | undefined): value is PackageManager {\n return packageManagers.includes(value as PackageManager)\n}\n\nexport function isMarwesTemplate(value: string | undefined): value is MarwesTemplate {\n return marwesTemplates.includes(value as MarwesTemplate)\n}\n\nexport function getAdapterRecipe(adapter: Adapter): AdapterRecipe {\n return adapterRecipes[adapter]\n}\n\nexport function adapterFromTemplate(template: MarwesTemplate): Adapter {\n if (template === \"react-ts\") {\n return \"react\"\n }\n\n if (template === \"vue-ts\") {\n return \"vue\"\n }\n\n return \"svelte\"\n}\n\nexport function templateFromAdapter(adapter: Adapter): MarwesTemplate {\n return getAdapterRecipe(adapter).viteTemplate\n}\n\nexport function packageRunnerCommand(\n packageManager: PackageManager,\n packageName = \"@marwes-ui/cli\",\n): string {\n if (packageManager === \"pnpm\") {\n return `pnpm dlx ${packageName}`\n }\n\n if (packageManager === \"npm\") {\n return `npx ${packageName}`\n }\n\n if (packageManager === \"yarn\") {\n return `yarn dlx ${packageName}`\n }\n\n return `bunx ${packageName}`\n}\n\nexport function createAgenticInitCommand(adapter: Adapter, packageManager: PackageManager): string {\n return `${packageRunnerCommand(packageManager)} init --adapter ${adapter} --agentic`\n}\n\nexport function createAiPrompt(adapter: Adapter, packageManager: PackageManager): string {\n const recipe = getAdapterRecipe(adapter)\n const installCommand = createAgenticInitCommand(adapter, packageManager)\n\n return [\n `Install and wire Marwes UI for a ${recipe.displayName} app using ${packageManager}.`,\n `Run: ${installCommand}.`,\n \"Follow the CLI output exactly.\",\n `If automatic patching is skipped, wrap the app root with ${recipe.providerImport} from ${recipe.packageName}.`,\n `Import Marwes components, enums, hooks/helpers, and theme tokens only from ${recipe.packageName}.`,\n \"Do not install @marwes-ui/core or @marwes-ui/presets directly.\",\n `Do not add a separate Marwes stylesheet import; the ${recipe.displayName} adapter loads the default styles automatically.`,\n \"Add a small smoke render, for example a Marwes Button, after the installer completes.\",\n ].join(\"\\n\")\n}\n\nexport function supportedAdaptersLabel(): string {\n return adapters.join(\"|\")\n}\n\nexport function supportedPackageManagersLabel(): string {\n return packageManagers.join(\"|\")\n}\n\nexport function supportedTemplatesLabel(): string {\n return marwesTemplates.join(\"|\")\n}\n","import { readFile, readdir } from \"node:fs/promises\"\nimport { basename, extname, join } from \"node:path\"\nimport type { CommandRunner } from \"./command-runner\"\nimport { defaultCommandRunner } from \"./command-runner\"\nimport { detectPackageManager, formatShellCommand, runScriptCommand } from \"./package-manager\"\nimport { hasConfiguredProvider } from \"./provider-detection\"\nimport { type Adapter, type PackageManager, adapters, getAdapterRecipe, isAdapter } from \"./recipes\"\n\nexport type DoctorLevel = \"pass\" | \"warn\" | \"fail\"\n\nexport type DoctorItem = {\n level: DoctorLevel\n message: string\n fix?: string\n}\n\nexport type DoctorOptions = {\n adapter?: Adapter\n cwd?: string\n packageManager?: PackageManager\n runBuild?: boolean\n runner?: CommandRunner\n write?: (message: string) => void\n}\n\nexport type DoctorResult = {\n adapter?: Adapter\n items: DoctorItem[]\n exitCode: number\n}\n\ntype PackageJson = {\n scripts?: Record<string, string>\n dependencies?: Record<string, string>\n devDependencies?: Record<string, string>\n peerDependencies?: Record<string, string>\n optionalDependencies?: Record<string, string>\n}\n\ntype SourceFile = {\n path: string\n source: string\n}\n\nconst sourceExtensions = new Set([\".ts\", \".tsx\", \".js\", \".jsx\", \".vue\", \".svelte\", \".css\"])\nconst sourceDirectories = [\"src\", \"app\", \"pages\"]\nconst knownRootFile = /^(?:main|app|layout|index|root)\\.(?:ts|tsx|js|jsx|vue|svelte)$/i\n\nfunction dependencyVersion(packageJson: PackageJson, packageName: string): string | undefined {\n return (\n packageJson.dependencies?.[packageName] ??\n packageJson.devDependencies?.[packageName] ??\n packageJson.peerDependencies?.[packageName] ??\n packageJson.optionalDependencies?.[packageName]\n )\n}\n\nasync function readPackageJson(cwd: string): Promise<PackageJson> {\n const source = await readFile(join(cwd, \"package.json\"), \"utf8\")\n return JSON.parse(source) as PackageJson\n}\n\nasync function collectSourceFiles(directory: string): Promise<string[]> {\n const entries = await readdir(directory, { withFileTypes: true }).catch(() => [])\n const files: string[] = []\n\n for (const entry of entries) {\n const path = join(directory, entry.name)\n\n if (entry.isDirectory()) {\n if ([\"node_modules\", \"dist\", \".git\", \".next\", \".svelte-kit\"].includes(entry.name)) {\n continue\n }\n\n files.push(...(await collectSourceFiles(path)))\n continue\n }\n\n if (sourceExtensions.has(extname(entry.name))) {\n files.push(path)\n }\n }\n\n return files\n}\n\nasync function readProjectSources(cwd: string): Promise<SourceFile[]> {\n const paths = new Set<string>()\n\n for (const directory of sourceDirectories) {\n for (const file of await collectSourceFiles(join(cwd, directory))) {\n paths.add(file)\n }\n }\n\n const rootEntries = await readdir(cwd, { withFileTypes: true }).catch(() => [])\n for (const entry of rootEntries) {\n if (entry.isFile() && knownRootFile.test(entry.name)) {\n paths.add(join(cwd, entry.name))\n }\n }\n\n return Promise.all(\n [...paths].map(async (path) => ({ path, source: await readFile(path, \"utf8\") })),\n )\n}\n\nfunction detectInstalledAdapter(packageJson: PackageJson): Adapter | undefined {\n return adapters.find((adapter) =>\n dependencyVersion(packageJson, getAdapterRecipe(adapter).packageName),\n )\n}\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\")\n}\n\nfunction providerSetupFile(\n sources: readonly SourceFile[],\n adapter: Adapter,\n): SourceFile | undefined {\n return sources.find((file) => hasConfiguredProvider(file.source, adapter))\n}\n\nfunction sourceContains(sources: readonly SourceFile[], needle: string): boolean {\n return sources.some((file) => file.source.includes(needle))\n}\n\nfunction sourceMatches(sources: readonly SourceFile[], pattern: RegExp): boolean {\n return sources.some((file) => pattern.test(file.source))\n}\n\nfunction formatItem(item: DoctorItem): string {\n const prefix = item.level === \"pass\" ? \"[pass]\" : item.level === \"warn\" ? \"[warn]\" : \"[fail]\"\n return item.fix\n ? `${prefix} ${item.message}\\n fix: ${item.fix}`\n : `${prefix} ${item.message}`\n}\n\nexport async function runDoctor(options: DoctorOptions = {}): Promise<DoctorResult> {\n const cwd = options.cwd ?? process.cwd()\n const write = options.write ?? ((message: string) => console.log(message))\n const runner = options.runner ?? defaultCommandRunner\n const packageJson = await readPackageJson(cwd)\n const adapter = options.adapter ?? detectInstalledAdapter(packageJson)\n const sources = await readProjectSources(cwd)\n const items: DoctorItem[] = []\n let commandFailureCode: number | undefined\n\n if (!adapter) {\n items.push({\n level: \"fail\",\n message: \"No Marwes adapter dependency found.\",\n fix: \"Run marwes init --adapter react, marwes init --adapter vue, or marwes init --adapter svelte.\",\n })\n } else {\n const recipe = getAdapterRecipe(adapter)\n\n for (const packageName of recipe.installPackages) {\n if (dependencyVersion(packageJson, packageName)) {\n items.push({ level: \"pass\", message: `${packageName} is installed.` })\n } else {\n items.push({\n level: \"fail\",\n message: `${packageName} is missing.`,\n fix: `${options.packageManager ?? (await detectPackageManager(cwd))} add ${recipe.installPackages.join(\" \")}`,\n })\n }\n }\n\n const providerFile = providerSetupFile(sources, adapter)\n const providerMentioned = sourceContains(sources, \"MarwesProvider\")\n items.push(\n providerFile\n ? {\n level: \"pass\",\n message: `MarwesProvider is imported from ${recipe.packageName} and rendered in ${basename(providerFile.path)}.`,\n }\n : {\n level: \"fail\",\n message: providerMentioned\n ? `MarwesProvider is not both imported from ${recipe.packageName} and rendered in the same app entry file.`\n : \"MarwesProvider was not rendered in app source.\",\n fix: `Wrap the app root with MarwesProvider from ${recipe.packageName}. Checked src/, app/, pages/, and known root entry files.`,\n },\n )\n }\n\n for (const internalPackage of [\"@marwes-ui/core\", \"@marwes-ui/presets\"]) {\n if (dependencyVersion(packageJson, internalPackage)) {\n items.push({\n level: \"warn\",\n message: `${internalPackage} is installed directly.`,\n fix: \"App projects should import from the public adapter package instead.\",\n })\n }\n\n const escapedPackage = escapeRegExp(internalPackage)\n if (\n sourceMatches(sources, new RegExp(`(?:from\\\\s*|import\\\\s*)[\"']${escapedPackage}(?:[\"'/])`))\n ) {\n items.push({\n level: \"warn\",\n message: `Direct source import from ${internalPackage} found.`,\n fix: \"Import consumer APIs from the framework adapter package instead.\",\n })\n }\n }\n\n if (sourceMatches(sources, /[\"']@marwes-ui\\/presets\\/[^\"']*styles\\.css[\"']/)) {\n items.push({\n level: \"warn\",\n message: \"Manual Marwes preset stylesheet import found.\",\n fix: \"Remove the stylesheet import; adapter packages load the default styles automatically.\",\n })\n }\n\n if (options.runBuild) {\n const packageManager = options.packageManager ?? (await detectPackageManager(cwd))\n if (!packageJson.scripts?.build) {\n items.push({\n level: \"fail\",\n message: \"No build script found to run.\",\n fix: \"Add a production build script to package.json, then rerun marwes doctor --run-build.\",\n })\n }\n const scripts = [\n ...(packageJson.scripts?.typecheck ? [\"typecheck\"] : []),\n ...(packageJson.scripts?.build ? [\"build\"] : []),\n ]\n for (const scriptName of scripts) {\n const command = runScriptCommand(packageManager, scriptName)\n write(`Running ${formatShellCommand(command)}`)\n const exitCode = await runner(command, { cwd })\n if (exitCode !== 0) {\n commandFailureCode = exitCode\n }\n items.push(\n exitCode === 0\n ? { level: \"pass\", message: `${scriptName} completed successfully.` }\n : { level: \"fail\", message: `${scriptName} failed with exit code ${exitCode}.` },\n )\n if (exitCode !== 0) break\n }\n }\n\n for (const item of items) {\n write(formatItem(item))\n }\n\n const exitCode = commandFailureCode ?? (items.some((item) => item.level === \"fail\") ? 1 : 0)\n return { ...(adapter ? { adapter } : {}), items, exitCode }\n}\n\nexport function adapterFromString(value: string | undefined): Adapter | undefined {\n return isAdapter(value) ? value : undefined\n}\n","import { access, readFile, writeFile } from \"node:fs/promises\"\nimport { join } from \"node:path\"\nimport { hasConfiguredProvider } from \"./provider-detection\"\nimport type { Adapter } from \"./recipes\"\n\nexport type PatchResult = {\n adapter: Adapter\n status: \"applied\" | \"already-configured\" | \"manual-action-required\"\n changed: boolean\n dryRun: boolean\n file?: string\n searchedFiles?: string[]\n message: string\n}\n\nasync function fileExists(path: string): Promise<boolean> {\n try {\n await access(path)\n return true\n } catch {\n return false\n }\n}\n\nfunction insertImport(source: string, importLine: string): string {\n if (source.includes(importLine)) {\n return source\n }\n\n const lines = source.split(\"\\n\")\n let lastImportIndex = -1\n\n for (let index = 0; index < lines.length; index += 1) {\n if (lines[index]?.startsWith(\"import \")) {\n lastImportIndex = index\n }\n }\n\n if (lastImportIndex === -1) {\n return `${importLine}\\n${source}`\n }\n\n lines.splice(lastImportIndex + 1, 0, importLine)\n return lines.join(\"\\n\")\n}\n\nfunction indentBlock(source: string, indentation: string): string {\n return source\n .split(\"\\n\")\n .map((line) => (line.trim().length === 0 ? \"\" : `${indentation}${line}`))\n .join(\"\\n\")\n}\n\nasync function writeIfNeeded(path: string, source: string, dryRun: boolean): Promise<boolean> {\n const current = await readFile(path, \"utf8\")\n if (current === source) {\n return false\n }\n\n if (!dryRun) {\n await writeFile(path, source)\n }\n\n return true\n}\n\nasync function patchReact(cwd: string, dryRun: boolean): Promise<PatchResult> {\n const candidates = [\"src/main.tsx\", \"src/main.jsx\"]\n let relativeFile: string | undefined\n\n for (const candidate of candidates) {\n if (await fileExists(join(cwd, candidate))) {\n relativeFile = candidate\n break\n }\n }\n\n if (!relativeFile) {\n return {\n adapter: \"react\",\n status: \"manual-action-required\",\n changed: false,\n dryRun,\n searchedFiles: candidates,\n message: \"No React Vite entrypoint found. Expected src/main.tsx or src/main.jsx.\",\n }\n }\n\n const file = join(cwd, relativeFile)\n const source = await readFile(file, \"utf8\")\n\n if (hasConfiguredProvider(source, \"react\")) {\n return {\n adapter: \"react\",\n status: \"already-configured\",\n changed: false,\n dryRun,\n file: relativeFile,\n message: \"React entrypoint already references MarwesProvider.\",\n }\n }\n\n if (source.includes(\"MarwesProvider\")) {\n return {\n adapter: \"react\",\n status: \"manual-action-required\",\n changed: false,\n dryRun,\n file: relativeFile,\n message:\n \"React entrypoint references MarwesProvider but not with a verified @marwes-ui/react import and render.\",\n }\n }\n\n if (!source.includes(\"<App />\")) {\n return {\n adapter: \"react\",\n status: \"manual-action-required\",\n changed: false,\n dryRun,\n file: relativeFile,\n message: \"React entrypoint did not contain the standard <App /> starter render.\",\n }\n }\n\n const withImport = insertImport(source, 'import { MarwesProvider } from \"@marwes-ui/react\"')\n const next = withImport.replace(\n \"<App />\",\n [\"<MarwesProvider>\", \" <App />\", \" </MarwesProvider>\"].join(\"\\n\"),\n )\n const changed = await writeIfNeeded(file, next, dryRun)\n\n return {\n adapter: \"react\",\n status: changed ? \"applied\" : \"already-configured\",\n changed,\n dryRun,\n file: relativeFile,\n message: changed\n ? \"Wrapped the React root render with MarwesProvider.\"\n : \"React entrypoint already matched the expected MarwesProvider setup.\",\n }\n}\n\nfunction ensureVueScript(source: string): string {\n if (source.includes('MarwesProvider } from \"@marwes-ui/vue\"')) {\n return source\n }\n\n const importLine = 'import { MarwesProvider } from \"@marwes-ui/vue\"'\n const scriptSetupMatch = source.match(/<script\\s+setup[^>]*>/)\n\n if (!scriptSetupMatch?.index && scriptSetupMatch?.index !== 0) {\n return `<script setup lang=\"ts\">\\n${importLine}\\n</script>\\n\\n${source}`\n }\n\n const insertAt = scriptSetupMatch.index + scriptSetupMatch[0].length\n return `${source.slice(0, insertAt)}\\n${importLine}${source.slice(insertAt)}`\n}\n\nasync function patchVue(cwd: string, dryRun: boolean): Promise<PatchResult> {\n const relativeFile = \"src/App.vue\"\n const file = join(cwd, relativeFile)\n\n if (!(await fileExists(file))) {\n return {\n adapter: \"vue\",\n status: \"manual-action-required\",\n changed: false,\n dryRun,\n searchedFiles: [relativeFile],\n message: \"No Vue starter component found. Expected src/App.vue.\",\n }\n }\n\n const source = await readFile(file, \"utf8\")\n if (hasConfiguredProvider(source, \"vue\")) {\n return {\n adapter: \"vue\",\n status: \"already-configured\",\n changed: false,\n dryRun,\n file: relativeFile,\n message: \"Vue starter component already contains MarwesProvider.\",\n }\n }\n\n if (source.includes(\"MarwesProvider\")) {\n return {\n adapter: \"vue\",\n status: \"manual-action-required\",\n changed: false,\n dryRun,\n file: relativeFile,\n message:\n \"Vue starter references MarwesProvider but not with a verified @marwes-ui/vue import and render.\",\n }\n }\n\n const templateMatch = source.match(/<template>([\\s\\S]*?)<\\/template>/)\n if (!templateMatch) {\n return {\n adapter: \"vue\",\n status: \"manual-action-required\",\n changed: false,\n dryRun,\n file: relativeFile,\n message: \"Vue starter component did not contain a standard <template> block.\",\n }\n }\n\n const innerTemplate = templateMatch[1]?.trim()\n if (!innerTemplate) {\n return {\n adapter: \"vue\",\n status: \"manual-action-required\",\n changed: false,\n dryRun,\n file: relativeFile,\n message: \"Vue starter template was empty.\",\n }\n }\n\n const wrappedTemplate = [\n \"<template>\",\n \" <MarwesProvider>\",\n indentBlock(innerTemplate, \" \"),\n \" </MarwesProvider>\",\n \"</template>\",\n ].join(\"\\n\")\n const withProviderTemplate = source.replace(templateMatch[0], wrappedTemplate)\n const next = ensureVueScript(withProviderTemplate)\n const changed = await writeIfNeeded(file, next, dryRun)\n\n return {\n adapter: \"vue\",\n status: changed ? \"applied\" : \"already-configured\",\n changed,\n dryRun,\n file: relativeFile,\n message: changed\n ? \"Wrapped the Vue starter template with MarwesProvider.\"\n : \"Vue starter component already matched the expected MarwesProvider setup.\",\n }\n}\n\nfunction blockMatches(source: string, tagName: \"script\" | \"style\"): string[] {\n return source.match(new RegExp(`<${tagName}[^>]*>[\\\\s\\\\S]*?<\\\\/${tagName}>`, \"g\")) ?? []\n}\n\nfunction removeBlocks(source: string, blocks: readonly string[]): string {\n return blocks.reduce((next, block) => next.replace(block, \"\"), source)\n}\n\nfunction ensureSvelteScript(scriptBlocks: readonly string[]): string {\n const importLine = ' import { MarwesProvider } from \"@marwes-ui/svelte\"'\n const script = scriptBlocks[0]\n\n if (!script) {\n return `<script lang=\"ts\">\\n${importLine}\\n</script>`\n }\n\n if (script.includes(\"MarwesProvider\")) {\n return script\n }\n\n return script.replace(/<script([^>]*)>/i, `<script$1>\\n${importLine}`)\n}\n\nasync function patchSvelte(cwd: string, dryRun: boolean): Promise<PatchResult> {\n const relativeFile = \"src/App.svelte\"\n const file = join(cwd, relativeFile)\n\n if (!(await fileExists(file))) {\n return {\n adapter: \"svelte\",\n status: \"manual-action-required\",\n changed: false,\n dryRun,\n searchedFiles: [relativeFile],\n message: \"No Svelte starter component found. Expected src/App.svelte.\",\n }\n }\n\n const source = await readFile(file, \"utf8\")\n if (hasConfiguredProvider(source, \"svelte\")) {\n return {\n adapter: \"svelte\",\n status: \"already-configured\",\n changed: false,\n dryRun,\n file: relativeFile,\n message: \"Svelte starter component already contains MarwesProvider.\",\n }\n }\n\n if (source.includes(\"MarwesProvider\")) {\n return {\n adapter: \"svelte\",\n status: \"manual-action-required\",\n changed: false,\n dryRun,\n file: relativeFile,\n message:\n \"Svelte starter references MarwesProvider but not with a verified @marwes-ui/svelte import and render.\",\n }\n }\n\n const scriptBlocks = blockMatches(source, \"script\")\n const styleBlocks = blockMatches(source, \"style\")\n const body = removeBlocks(source, [...scriptBlocks, ...styleBlocks]).trim()\n\n if (!body) {\n return {\n adapter: \"svelte\",\n status: \"manual-action-required\",\n changed: false,\n dryRun,\n file: relativeFile,\n message: \"Svelte starter component had no markup to wrap.\",\n }\n }\n\n const script = ensureSvelteScript(scriptBlocks)\n const styles = styleBlocks.join(\"\\n\\n\")\n const next = [\n script,\n \"\",\n \"<MarwesProvider>\",\n indentBlock(body, \" \"),\n \"</MarwesProvider>\",\n styles ? `\\n${styles}` : \"\",\n ]\n .filter(Boolean)\n .join(\"\\n\")\n const changed = await writeIfNeeded(file, `${next.trimEnd()}\\n`, dryRun)\n\n return {\n adapter: \"svelte\",\n status: changed ? \"applied\" : \"already-configured\",\n changed,\n dryRun,\n file: relativeFile,\n message: changed\n ? \"Wrapped the Svelte starter markup with MarwesProvider.\"\n : \"Svelte starter component already matched the expected MarwesProvider setup.\",\n }\n}\n\nexport async function patchProject(\n cwd: string,\n adapter: Adapter,\n dryRun: boolean,\n): Promise<PatchResult> {\n if (adapter === \"react\") {\n return patchReact(cwd, dryRun)\n }\n\n if (adapter === \"vue\") {\n return patchVue(cwd, dryRun)\n }\n\n return patchSvelte(cwd, dryRun)\n}\n","import { type Adapter, getAdapterRecipe } from \"./recipes\"\n\nfunction providerExample(adapter: Adapter): string {\n const packageName = getAdapterRecipe(adapter).packageName\n const providerImport = `import { MarwesProvider, type ThemeInput } from \"${packageName}\"`\n const theme = 'const brandTheme = { color: { primary: \"#2457FF\" } } satisfies ThemeInput'\n\n if (adapter === \"react\") {\n return [\n 'import { createRoot } from \"react-dom/client\"',\n providerImport,\n 'import App from \"./App\"',\n \"\",\n theme,\n \"\",\n 'createRoot(document.getElementById(\"root\")!).render(',\n \" <MarwesProvider theme={brandTheme}>\",\n \" <App />\",\n \" </MarwesProvider>,\",\n \")\",\n ].join(\"\\n\")\n }\n\n return [\n adapter === \"vue\" ? '<script setup lang=\"ts\">' : '<script lang=\"ts\">',\n ` ${providerImport}`,\n ` ${theme}`,\n \"</script>\",\n \"\",\n ...(adapter === \"vue\"\n ? [\n \"<template>\",\n ' <MarwesProvider :theme=\"brandTheme\">',\n \" <main>Your app</main>\",\n \" </MarwesProvider>\",\n \"</template>\",\n ]\n : [\"<MarwesProvider theme={brandTheme}>\", \" <main>Your app</main>\", \"</MarwesProvider>\"]),\n ].join(\"\\n\")\n}\n\nexport function setupGuidance(adapter: Adapter, fullExample: boolean): string[] {\n const recipe = getAdapterRecipe(adapter)\n const ssrIntegration = { react: \"next\", vue: \"nuxt\", svelte: \"sveltekit\" }[adapter]\n const hookGuidance = {\n react:\n \"useTheme() returns resolved concrete values: const theme = useTheme(); read theme.color.primary.base.\",\n vue: \"useTheme() returns a resolved snapshot directly, not a ref: const theme = useTheme(); read theme.color.primary.base (no .value).\",\n svelte:\n \"useTheme() returns a .theme getter: const themeState = useTheme(); read themeState.theme.color.primary.base. Keep the getter object; destructuring .theme takes a snapshot.\",\n }[adapter]\n\n return [\n \"Marwes setup guidance:\",\n `- Import Marwes APIs only from ${recipe.packageName}.`,\n \"- Do not install or import @marwes-ui/core or @marwes-ui/presets directly.\",\n \"- Default preset CSS loads automatically from the adapter; do not add a separate Marwes stylesheet import.\",\n \"- Wrap the app once with MarwesProvider; pass a small typed ThemeInput override. Unspecified values retain defaults.\",\n \"- --mw-* CSS variables are scoped to the provider and its descendants, not :root. Keep app styles and runtime consumers below the provider.\",\n \"- Use mwThemeVars for CSS var(...) references, not concrete JavaScript values. Call useTheme() only in a child component below MarwesProvider.\",\n `- ${hookGuidance}`,\n ...(fullExample\n ? [\n `Complete ${recipe.displayName} provider example:`,\n providerExample(adapter),\n `Component example: import { PrimaryButton } from \"${recipe.packageName}\"; render <PrimaryButton>Save</PrimaryButton> below the provider. Use public components, not invented mw-* replacement classes.`,\n `Token example: import { mwThemeVars } from \"${recipe.packageName}\"; use mwThemeVars.color.text and mwThemeVars.spacing.sp24 in app-owned styles below the provider.`,\n \"For SSR, follow the framework guide for matching style/script helpers and provider options before hydration; changing html classes alone is not no-flash setup.\",\n ]\n : []),\n `Setup guide: https://marwes.io/docs/get-started/${adapter}/`,\n \"Theming guide: https://marwes.io/docs/theming/\",\n `SSR guide: https://marwes.io/docs/integrations/${ssrIntegration}/`,\n ...(fullExample\n ? [\n \"AI discovery: https://marwes.io/llms.txt\",\n `AI framework guide: https://marwes.io/ai/${adapter}.md`,\n \"Public export inventory: https://marwes.io/ai/v1/public-api.json\",\n ]\n : []),\n ]\n}\n","import type { CommandRunner } from \"./command-runner\"\nimport { defaultCommandRunner } from \"./command-runner\"\nimport { type DoctorResult, runDoctor } from \"./doctor\"\nimport { detectPackageManager, formatShellCommand, installCommand } from \"./package-manager\"\nimport { type PatchResult, patchProject } from \"./patchers\"\nimport { type Adapter, type PackageManager, getAdapterRecipe } from \"./recipes\"\nimport { setupGuidance } from \"./setup-guidance\"\n\nexport type InitOptions = {\n adapter: Adapter\n cwd?: string\n packageManager?: PackageManager\n dryRun?: boolean\n agentic?: boolean\n yes?: boolean\n noInstall?: boolean\n noPatch?: boolean\n runner?: CommandRunner\n write?: (message: string) => void\n}\n\nexport type InitResult = {\n status: \"complete\" | \"manual-action-required\" | \"failed\"\n adapter: Adapter\n packageManager: PackageManager\n installCommand: string\n installSkipped: boolean\n patchSkipped: boolean\n patch?: PatchResult\n doctor?: DoctorResult\n exitCode: number\n}\n\nfunction shouldPrintProviderGuidance(patch: PatchResult | undefined): boolean {\n return patch?.status === \"manual-action-required\"\n}\n\nexport async function runInit(options: InitOptions): Promise<InitResult> {\n const cwd = options.cwd ?? process.cwd()\n const write = options.write ?? ((message: string) => console.log(message))\n const runner = options.runner ?? defaultCommandRunner\n const recipe = getAdapterRecipe(options.adapter)\n const packageManager = options.packageManager ?? (await detectPackageManager(cwd))\n const command = installCommand(packageManager, recipe.installPackages)\n const commandLabel = formatShellCommand(command)\n const dryRun = options.dryRun === true\n const agentic = options.agentic === true\n const noInstall = options.noInstall === true\n const noPatch = options.noPatch === true\n\n write(`Marwes init: ${recipe.displayName}`)\n write(`Package manager: ${packageManager}`)\n if (agentic) {\n write(\"Mode: agentic\")\n }\n\n let exitCode = 0\n\n if (noInstall) {\n write(`Install skipped. Run manually: ${commandLabel}`)\n } else if (dryRun) {\n write(`[dry-run] ${commandLabel}`)\n } else {\n exitCode = await runner(command, { cwd })\n if (exitCode !== 0) {\n write(\"Marwes init status: failed.\")\n write(\n `Marwes init failed: installation command exited with code ${exitCode}. Provider patching and doctor were not run.`,\n )\n return {\n status: \"failed\",\n adapter: options.adapter,\n packageManager,\n installCommand: commandLabel,\n installSkipped: false,\n patchSkipped: noPatch,\n exitCode,\n }\n }\n }\n\n let patch: PatchResult | undefined\n if (noPatch) {\n write(\"Patch skipped.\")\n } else {\n patch = await patchProject(cwd, options.adapter, dryRun)\n const patchLabel = patch.file ? `${patch.file}: ${patch.message}` : patch.message\n write(dryRun && patch.changed ? `[dry-run] ${patchLabel}` : patchLabel)\n if (patch.searchedFiles?.length) {\n write(`Files searched: ${patch.searchedFiles.join(\", \")}`)\n }\n }\n\n let doctor: DoctorResult | undefined\n if (dryRun) {\n write(`[dry-run] marwes doctor --adapter ${options.adapter}`)\n } else {\n write(\"Marwes doctor:\")\n doctor = await runDoctor({\n adapter: options.adapter,\n cwd,\n packageManager,\n runner,\n write,\n })\n }\n\n const providerFailure =\n doctor?.items.some(\n (item) => item.level === \"fail\" && item.message.startsWith(\"MarwesProvider\"),\n ) === true\n const otherFailure =\n doctor?.items.some(\n (item) => item.level === \"fail\" && !item.message.startsWith(\"MarwesProvider\"),\n ) === true\n const needsManualAction = providerFailure && (shouldPrintProviderGuidance(patch) || noPatch)\n const status: InitResult[\"status\"] = otherFailure\n ? \"failed\"\n : needsManualAction\n ? \"manual-action-required\"\n : doctor && doctor.exitCode !== 0\n ? \"failed\"\n : \"complete\"\n\n if (needsManualAction) {\n write(\n `Manual follow-up: wrap the app root with ${recipe.providerImport} from ${recipe.packageName}.`,\n )\n write(\"Automatic patching currently supports the standard Vite app layout.\")\n }\n if (agentic || needsManualAction || status === \"complete\") {\n for (const line of setupGuidance(options.adapter, agentic || needsManualAction)) write(line)\n }\n\n exitCode =\n status === \"manual-action-required\" ? 2 : status === \"failed\" ? (doctor?.exitCode ?? 1) : 0\n write(dryRun ? `[dry-run] Planned init status: ${status}.` : `Marwes init status: ${status}.`)\n write(\n dryRun\n ? \"[dry-run] Marwes init plan complete. No installation, file changes, or doctor checks performed.\"\n : status === \"complete\"\n ? \"Marwes init complete.\"\n : status === \"manual-action-required\"\n ? \"Marwes provider wiring requires manual action (exit code 2).\"\n : \"Marwes init failed.\",\n )\n\n return {\n status,\n adapter: options.adapter,\n packageManager,\n installCommand: commandLabel,\n installSkipped: noInstall || dryRun,\n patchSkipped: noPatch,\n ...(patch ? { patch } : {}),\n ...(doctor ? { doctor } : {}),\n exitCode,\n }\n}\n","import { readFile, writeFile } from \"node:fs/promises\"\nimport { resolve } from \"node:path\"\nimport type { CommandRunner } from \"./command-runner\"\nimport { defaultCommandRunner } from \"./command-runner\"\nimport { runInit } from \"./init\"\nimport { createViteCommand, detectPackageManager, formatShellCommand } from \"./package-manager\"\nimport {\n type Adapter,\n type MarwesTemplate,\n type PackageManager,\n adapterFromTemplate,\n getAdapterRecipe,\n} from \"./recipes\"\n\nexport type CreateOptions = {\n projectName: string\n template: MarwesTemplate\n cwd?: string\n packageManager?: PackageManager\n dryRun?: boolean\n noInstall?: boolean\n runner?: CommandRunner\n write?: (message: string) => void\n}\n\nexport type CreateResult = {\n projectName: string\n template: MarwesTemplate\n exitCode: number\n}\n\nconst safeProjectPathPattern = /^[a-zA-Z0-9][a-zA-Z0-9._-]*(?:\\/[a-zA-Z0-9][a-zA-Z0-9._-]*)*$/\n\nexport function isSafeProjectPath(projectName: string): boolean {\n return safeProjectPathPattern.test(projectName)\n}\n\nasync function stageAdapterDependency(cwd: string, adapter: Adapter): Promise<void> {\n const packageJsonPath = resolve(cwd, \"package.json\")\n const packageJson = JSON.parse(await readFile(packageJsonPath, \"utf8\"))\n const packageName = getAdapterRecipe(adapter).packageName\n const dependencies = packageJson.dependencies ?? {}\n\n if (!(packageName in dependencies) && !(packageName in (packageJson.devDependencies ?? {}))) {\n packageJson.dependencies = { ...dependencies, [packageName]: \"latest\" }\n await writeFile(packageJsonPath, `${JSON.stringify(packageJson, null, 2)}\\n`)\n }\n}\n\nexport async function runCreate(options: CreateOptions): Promise<CreateResult> {\n const cwd = options.cwd ?? process.cwd()\n const write = options.write ?? ((message: string) => console.log(message))\n const runner = options.runner ?? defaultCommandRunner\n\n if (!isSafeProjectPath(options.projectName)) {\n write(\n \"Invalid project name. Use a relative path made from letters, numbers, dots, dashes, underscores, and forward slashes.\",\n )\n return {\n projectName: options.projectName,\n template: options.template,\n exitCode: 1,\n }\n }\n\n const packageManager = options.packageManager ?? (await detectPackageManager(cwd))\n const command = createViteCommand(packageManager, options.projectName, options.template)\n const adapter = adapterFromTemplate(options.template)\n const targetCwd = resolve(cwd, options.projectName)\n\n write(`Create Marwes app: ${options.projectName}`)\n write(`Template: ${options.template}`)\n\n if (options.dryRun) {\n write(`[dry-run] ${formatShellCommand(command)}`)\n write(`[dry-run] marwes init --adapter ${adapter}`)\n return {\n projectName: options.projectName,\n template: options.template,\n exitCode: 0,\n }\n }\n\n const createExitCode = await runner(command, { cwd })\n if (createExitCode !== 0) {\n return {\n projectName: options.projectName,\n template: options.template,\n exitCode: createExitCode,\n }\n }\n\n if (options.noInstall) {\n await stageAdapterDependency(targetCwd, adapter)\n write(\n `Recorded ${getAdapterRecipe(adapter).packageName} in package.json. Run ${packageManager} install before starting the app.`,\n )\n }\n\n const initResult = await runInit({\n adapter,\n cwd: targetCwd,\n packageManager,\n noInstall: options.noInstall === true,\n runner,\n write,\n })\n\n return {\n projectName: options.projectName,\n template: options.template,\n exitCode: initResult.exitCode,\n }\n}\n","import { parseArgs } from \"node:util\"\nimport { type CreateOptions, runCreate } from \"./create\"\nimport { type DoctorOptions, adapterFromString, runDoctor } from \"./doctor\"\nimport { type InitOptions, runInit } from \"./init\"\nimport {\n type PackageManager,\n createAiPrompt,\n isMarwesTemplate,\n isPackageManager,\n supportedAdaptersLabel,\n supportedPackageManagersLabel,\n supportedTemplatesLabel,\n} from \"./recipes\"\n\nexport { runCreate, type CreateOptions, type CreateResult } from \"./create\"\nexport { runDoctor, type DoctorItem, type DoctorOptions, type DoctorResult } from \"./doctor\"\nexport { runInit, type InitOptions, type InitResult } from \"./init\"\nexport type { PatchResult } from \"./patchers\"\nexport {\n adapters,\n createAgenticInitCommand,\n createAiPrompt,\n getAdapterRecipe,\n marwesTemplates,\n packageRunnerCommand,\n packageManagers,\n type Adapter,\n type AdapterRecipe,\n type MarwesTemplate,\n type PackageManager,\n} from \"./recipes\"\n\ntype CliOptions = {\n cwd?: string\n write?: (message: string) => void\n}\n\nfunction writeHelp(write: (message: string) => void): void {\n write(`Marwes CLI\n\nCommands:\n marwes init --adapter <${supportedAdaptersLabel()}> [--agentic]\n marwes doctor [--adapter <${supportedAdaptersLabel()}]\n marwes ai-prompt --adapter <${supportedAdaptersLabel()}>\n marwes create <name> --template <${supportedTemplatesLabel()}>\n\nOptions:\n --pm <${supportedPackageManagersLabel()}>\n --agentic\n --dry-run\n --no-install Record dependencies but skip installation\n --no-patch\n`)\n}\n\nfunction wantsHelp(args: readonly string[]): boolean {\n return args.includes(\"--help\") || args.includes(\"-h\") || args[0] === \"help\"\n}\n\nfunction writeInitHelp(write: (message: string) => void): void {\n write(`marwes init --adapter <${supportedAdaptersLabel()}>\n\nInstall a framework adapter, wire MarwesProvider into a standard Vite app, then run doctor.\n\nOptions:\n --adapter <${supportedAdaptersLabel()}> Required framework adapter\n --pm <${supportedPackageManagersLabel()}> Package manager override\n --agentic Print AI-agent boundary rules\n --dry-run Show changes without writing or installing\n --no-install Skip dependency installation\n --no-patch Skip automatic provider wiring\n --yes Accept defaults\n --help Show this help\n`)\n}\n\nfunction writeDoctorHelp(write: (message: string) => void): void {\n write(`marwes doctor [--adapter <${supportedAdaptersLabel()}>] [--run-build]\n\nVerify dependencies, adapter imports, provider rendering, and optional project compilation.\n\nOptions:\n --adapter <${supportedAdaptersLabel()}> Framework adapter override\n --pm <${supportedPackageManagersLabel()}> Package manager override\n --run-build Run optional typecheck, then the required production build\n --help Show this help\n`)\n}\n\nfunction writeAiPromptHelp(write: (message: string) => void): void {\n write(`marwes ai-prompt --adapter <${supportedAdaptersLabel()}>\n\nPrint a framework-specific setup prompt for an AI coding agent.\n\nOptions:\n --adapter <${supportedAdaptersLabel()}> Required framework adapter\n --pm <${supportedPackageManagersLabel()}> Package manager used in the prompt\n --help Show this help\n`)\n}\n\nfunction writeCreateHelp(write: (message: string) => void): void {\n write(`create-marwes <name> --template <${supportedTemplatesLabel()}>\n\nCreate a new Vite app and configure its Marwes adapter.\n\nOptions:\n --template <${supportedTemplatesLabel()}>\n --pm <${supportedPackageManagersLabel()}>\n --dry-run\n --no-install\n --help\n`)\n}\n\nfunction parsePackageManager(value: unknown): PackageManager | undefined {\n return typeof value === \"string\" && isPackageManager(value) ? value : undefined\n}\n\nexport async function runMarwesCli(argv: string[], options: CliOptions = {}): Promise<number> {\n const write = options.write ?? ((message: string) => console.log(message))\n const [command, ...args] = argv\n\n if (!command || command === \"help\" || command === \"--help\" || command === \"-h\") {\n writeHelp(write)\n return 0\n }\n\n if (command === \"init\") {\n if (wantsHelp(args)) {\n writeInitHelp(write)\n return 0\n }\n\n const parsed = parseArgs({\n args,\n options: {\n adapter: { type: \"string\" },\n pm: { type: \"string\" },\n agentic: { type: \"boolean\" },\n \"dry-run\": { type: \"boolean\" },\n yes: { type: \"boolean\" },\n \"no-install\": { type: \"boolean\" },\n \"no-patch\": { type: \"boolean\" },\n },\n allowPositionals: true,\n })\n const adapter = adapterFromString(String(parsed.values.adapter ?? \"\"))\n\n if (!adapter) {\n write(`Missing or invalid --adapter. Expected one of: ${supportedAdaptersLabel()}`)\n return 1\n }\n\n const packageManager = parsePackageManager(parsed.values.pm)\n const initOptions: InitOptions = {\n adapter,\n agentic: parsed.values.agentic === true,\n dryRun: parsed.values[\"dry-run\"] === true,\n yes: parsed.values.yes === true,\n noInstall: parsed.values[\"no-install\"] === true,\n noPatch: parsed.values[\"no-patch\"] === true,\n write,\n }\n\n if (options.cwd) {\n initOptions.cwd = options.cwd\n }\n\n if (packageManager) {\n initOptions.packageManager = packageManager\n }\n\n const result = await runInit(initOptions)\n return result.exitCode\n }\n\n if (command === \"doctor\") {\n if (wantsHelp(args)) {\n writeDoctorHelp(write)\n return 0\n }\n\n const parsed = parseArgs({\n args,\n options: {\n adapter: { type: \"string\" },\n pm: { type: \"string\" },\n \"run-build\": { type: \"boolean\" },\n },\n allowPositionals: true,\n })\n const adapter = adapterFromString(String(parsed.values.adapter ?? \"\"))\n const packageManager = parsePackageManager(parsed.values.pm)\n const doctorOptions: DoctorOptions = {\n runBuild: parsed.values[\"run-build\"] === true,\n write,\n }\n\n if (adapter) {\n doctorOptions.adapter = adapter\n }\n\n if (options.cwd) {\n doctorOptions.cwd = options.cwd\n }\n\n if (packageManager) {\n doctorOptions.packageManager = packageManager\n }\n\n const result = await runDoctor(doctorOptions)\n return result.exitCode\n }\n\n if (command === \"ai-prompt\") {\n if (wantsHelp(args)) {\n writeAiPromptHelp(write)\n return 0\n }\n\n const parsed = parseArgs({\n args,\n options: {\n adapter: { type: \"string\" },\n pm: { type: \"string\" },\n },\n allowPositionals: true,\n })\n const adapter = adapterFromString(String(parsed.values.adapter ?? \"\"))\n\n if (!adapter) {\n write(`Missing or invalid --adapter. Expected one of: ${supportedAdaptersLabel()}`)\n return 1\n }\n\n write(createAiPrompt(adapter, parsePackageManager(parsed.values.pm) ?? \"pnpm\"))\n return 0\n }\n\n if (command === \"create\") {\n return runCreateMarwesCli(args, options)\n }\n\n write(`Unknown command: ${command}`)\n writeHelp(write)\n return 1\n}\n\nexport async function runCreateMarwesCli(\n argv: string[],\n options: CliOptions = {},\n): Promise<number> {\n const write = options.write ?? ((message: string) => console.log(message))\n if (wantsHelp(argv)) {\n writeCreateHelp(write)\n return 0\n }\n\n const parsed = parseArgs({\n args: argv,\n options: {\n template: { type: \"string\" },\n pm: { type: \"string\" },\n \"dry-run\": { type: \"boolean\" },\n \"no-install\": { type: \"boolean\" },\n },\n allowPositionals: true,\n })\n const projectName = parsed.positionals[0]\n const template = String(parsed.values.template ?? \"react-ts\")\n\n if (!projectName) {\n write(\"Missing project name.\")\n return 1\n }\n\n if (!isMarwesTemplate(template)) {\n write(`Invalid --template. Expected one of: ${supportedTemplatesLabel()}`)\n return 1\n }\n\n const packageManager = parsePackageManager(parsed.values.pm)\n const createOptions: CreateOptions = {\n projectName,\n template,\n dryRun: parsed.values[\"dry-run\"] === true,\n noInstall: parsed.values[\"no-install\"] === true,\n write,\n }\n\n if (options.cwd) {\n createOptions.cwd = options.cwd\n }\n\n if (packageManager) {\n createOptions.packageManager = packageManager\n }\n\n const result = await runCreate(createOptions)\n\n return result.exitCode\n}\n","#!/usr/bin/env node\nimport { runCreateMarwesCli } from \"@marwes-ui/cli\"\n\nconst exitCode = await runCreateMarwesCli(process.argv.slice(2))\nprocess.exitCode = exitCode\n"]}
package/package.json CHANGED
@@ -1,6 +1,26 @@
1
1
  {
2
2
  "name": "create-marwes",
3
- "version": "0.1.0",
3
+ "version": "0.3.0",
4
+ "description": "Create a new Vite application configured with the Marwes UI component library.",
5
+ "homepage": "https://marwes.io/docs/get-started/react/",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "git+https://github.com/niklas-westman/marwes.git",
9
+ "directory": "packages/create-marwes"
10
+ },
11
+ "bugs": {
12
+ "url": "https://github.com/niklas-westman/marwes/issues"
13
+ },
14
+ "keywords": [
15
+ "marwes",
16
+ "vite",
17
+ "scaffold",
18
+ "design-system",
19
+ "components"
20
+ ],
21
+ "engines": {
22
+ "node": ">=20"
23
+ },
4
24
  "publishConfig": {
5
25
  "access": "public"
6
26
  },
@@ -19,14 +39,14 @@
19
39
  "CHANGELOG.md"
20
40
  ],
21
41
  "dependencies": {
22
- "@marwes-ui/cli": "0.1.0"
42
+ "@marwes-ui/cli": "0.3.0"
23
43
  },
24
44
  "devDependencies": {
25
45
  "@types/node": "24.10.10",
26
46
  "rimraf": "6.1.2",
27
47
  "tsup": "8.5.1",
28
48
  "typescript": "5.9.3",
29
- "vitest": "4.1.8"
49
+ "vitest": "4.1.11"
30
50
  },
31
51
  "scripts": {
32
52
  "dev": "tsup --watch",