create-better-fullstack 2.1.8 → 2.2.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.
Files changed (26) hide show
  1. package/dist/{add-handler-ztNjzoMN.mjs → add-handler-CE3XIs3y.mjs} +8 -8
  2. package/dist/{addons-setup-LaAj43NP.mjs → addons-setup-DR924M7b.mjs} +1 -1
  3. package/dist/addons-setup-Du2VSv8V.mjs +7 -0
  4. package/dist/{analytics-DVltG11u.mjs → analytics-BXlOG6u6.mjs} +1 -1
  5. package/dist/{bts-config-DQVWvPDs.mjs → bts-config-B_HhcMXL.mjs} +30 -0
  6. package/dist/cli.mjs +2 -2
  7. package/dist/{config-processing-D9-F2Us9.mjs → config-processing-DJisMeW-.mjs} +17 -1
  8. package/dist/{doctor-a4ca3SMd.mjs → doctor-Cc7sLuow.mjs} +2 -2
  9. package/dist/{file-formatter-gvmrpd-g.mjs → file-formatter-BgbfpYf4.mjs} +442 -22
  10. package/dist/{gen-CCClL7Ve.mjs → gen-BZ0QCxCC.mjs} +1 -1
  11. package/dist/{generated-checks-BV9jol5h.mjs → generated-checks-CbioGjCh.mjs} +1 -1
  12. package/dist/index.d.mts +461 -183
  13. package/dist/index.mjs +20 -9
  14. package/dist/{install-dependencies-RoUyaE8o.mjs → install-dependencies-D__bmW4k.mjs} +86 -18
  15. package/dist/{mcp-492OkjcS.mjs → mcp-DNKAo8nO.mjs} +5 -5
  16. package/dist/mcp-entry.mjs +37 -225
  17. package/dist/{registry-DSf2CEaU.mjs → registry-Cm3D45oT.mjs} +1 -1
  18. package/dist/run-C_S7ujfY.mjs +15 -0
  19. package/dist/{run-T6g1jkfy.mjs → run-DmN7QRt5.mjs} +1155 -292
  20. package/dist/scaffold-manifest-ByKtMhTd.mjs +4 -0
  21. package/dist/{scaffold-manifest-Dyi0voqE.mjs → scaffold-manifest-CNFz-lmH.mjs} +34 -5
  22. package/dist/{update-DJ8CI5KW.mjs → update-B270pWHc.mjs} +182 -25
  23. package/package.json +6 -6
  24. package/dist/addons-setup-DnLjAzTw.mjs +0 -7
  25. package/dist/run-CD8f7PHh.mjs +0 -15
  26. package/dist/scaffold-manifest-DGRyepdb.mjs +0 -4
package/dist/index.mjs CHANGED
@@ -1,16 +1,16 @@
1
1
  #!/usr/bin/env node
2
- import "./bts-config-DQVWvPDs.mjs";
3
- import { a as createBtsCli, c as history, d as telemetry, f as update, i as create, l as router, n as builder, o as docs, r as check, s as doctor, t as add, u as sponsors } from "./run-T6g1jkfy.mjs";
2
+ import "./bts-config-B_HhcMXL.mjs";
3
+ import { a as createBtsCli, c as history, d as telemetry, f as update, i as create, l as router, n as builder, o as docs, r as check, s as doctor, t as add, u as sponsors } from "./run-DmN7QRt5.mjs";
4
4
  import "./render-title-zvyKC1ej.mjs";
5
5
  import "./errors-ns_o2OKg.mjs";
6
6
  import "./prompt-environment-BR0Kkw2W.mjs";
7
- import "./analytics-DVltG11u.mjs";
8
- import "./file-formatter-gvmrpd-g.mjs";
9
- import "./install-dependencies-RoUyaE8o.mjs";
10
- import "./generated-checks-BV9jol5h.mjs";
11
- import { t as applyEffectBackendDefaults } from "./config-processing-D9-F2Us9.mjs";
12
- import "./scaffold-manifest-Dyi0voqE.mjs";
13
- import "./addons-setup-LaAj43NP.mjs";
7
+ import "./analytics-BXlOG6u6.mjs";
8
+ import "./file-formatter-BgbfpYf4.mjs";
9
+ import "./install-dependencies-D__bmW4k.mjs";
10
+ import "./generated-checks-CbioGjCh.mjs";
11
+ import { t as applyEffectBackendDefaults } from "./config-processing-DJisMeW-.mjs";
12
+ import "./scaffold-manifest-CNFz-lmH.mjs";
13
+ import "./addons-setup-DR924M7b.mjs";
14
14
  import { EMBEDDED_TEMPLATES, TEMPLATE_COUNT, VirtualFileSystem, generateVirtualProject } from "@better-fullstack/template-generator";
15
15
 
16
16
  //#region src/index.ts
@@ -145,6 +145,12 @@ async function createVirtual(options) {
145
145
  goCaching: options.goCaching || "none",
146
146
  goConfig: options.goConfig || "none",
147
147
  goObservability: options.goObservability || "none",
148
+ goValidation: options.goValidation || "none",
149
+ goQuality: options.goQuality || "none",
150
+ goMigrations: options.goMigrations || "none",
151
+ goTemplating: options.goTemplating || "none",
152
+ goProtoTooling: options.goProtoTooling || "none",
153
+ goDI: options.goDI || "none",
148
154
  javaWebFramework: options.javaWebFramework || (options.ecosystem === "java" ? "spring-boot" : "none"),
149
155
  javaLanguage: options.javaLanguage || "java",
150
156
  javaBuildTool: options.javaBuildTool || (options.ecosystem === "java" ? "maven" : "none"),
@@ -179,6 +185,11 @@ async function createVirtual(options) {
179
185
  elixirObservability: options.elixirObservability || (options.ecosystem === "elixir" ? "telemetry" : "none"),
180
186
  elixirTesting: options.elixirTesting || (options.ecosystem === "elixir" ? "ex_unit" : "none"),
181
187
  elixirQuality: options.elixirQuality || (options.ecosystem === "elixir" ? "credo" : "none"),
188
+ elixirI18n: options.elixirI18n || "none",
189
+ elixirHttpServer: options.elixirHttpServer || (options.ecosystem === "elixir" ? "cowboy" : "none"),
190
+ elixirApplicationFramework: options.elixirApplicationFramework || "none",
191
+ elixirDocumentation: options.elixirDocumentation || "none",
192
+ elixirClustering: options.elixirClustering || "none",
182
193
  elixirDeploy: options.elixirDeploy || "none",
183
194
  elixirLibraries: options.elixirLibraries || [],
184
195
  aiDocs: options.aiDocs || ["claude-md", "agents-md"]
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
- import { b as types_exports, g as DEFAULT_CONFIG } from "./bts-config-DQVWvPDs.mjs";
2
+ import { b as types_exports, g as DEFAULT_CONFIG } from "./bts-config-B_HhcMXL.mjs";
3
3
  import { d as setLastPromptShownUI, r as exitCancelled, s as isFirstPrompt, u as setIsFirstPrompt$1 } from "./errors-ns_o2OKg.mjs";
4
- import { g as validateAddonCompatibility, o as getCompatibleAddons } from "./file-formatter-gvmrpd-g.mjs";
4
+ import { S as validateAddonCompatibility, f as getCompatibleAddons } from "./file-formatter-BgbfpYf4.mjs";
5
5
  import { log, spinner } from "@clack/prompts";
6
6
  import pc from "picocolors";
7
7
  import fs from "fs-extra";
@@ -360,6 +360,42 @@ function getAddonDisplay(addon) {
360
360
  label = "GitHub Actions";
361
361
  hint = "Ship a CI workflow (install, lint, type-check, build)";
362
362
  break;
363
+ case "eslint":
364
+ label = "ESLint";
365
+ hint = "Pluggable JavaScript and TypeScript linting with flat config";
366
+ break;
367
+ case "prettier":
368
+ label = "Prettier";
369
+ hint = "Opinionated formatting for code, JSON, Markdown, and styles";
370
+ break;
371
+ case "axios":
372
+ label = "Axios";
373
+ hint = "HTTP client with interceptors, cancellation, and typed responses";
374
+ break;
375
+ case "firebase":
376
+ label = "Firebase JS SDK";
377
+ hint = "Firebase app, Auth, Firestore, and Storage client setup";
378
+ break;
379
+ case "graphql-codegen":
380
+ label = "GraphQL Code Generator";
381
+ hint = "Generate typed GraphQL documents and client helpers";
382
+ break;
383
+ case "openapi-typescript":
384
+ label = "openapi-typescript";
385
+ hint = "Generate runtime-free TypeScript types from OpenAPI schemas";
386
+ break;
387
+ case "apollo-client":
388
+ label = "Apollo Client";
389
+ hint = "GraphQL client with normalized caching and framework integrations";
390
+ break;
391
+ case "electron":
392
+ label = "Electron";
393
+ hint = "Package compatible Vite frontends as desktop applications";
394
+ break;
395
+ case "capacitor":
396
+ label = "Capacitor";
397
+ hint = "Ship compatible Vite frontends to iOS and Android";
398
+ break;
363
399
  default:
364
400
  label = addon;
365
401
  hint = `Add ${addon}`;
@@ -375,6 +411,8 @@ const ADDON_GROUPS = {
375
411
  "nx",
376
412
  "github-actions",
377
413
  "biome",
414
+ "eslint",
415
+ "prettier",
378
416
  "oxlint",
379
417
  "ultracite",
380
418
  "husky",
@@ -382,10 +420,6 @@ const ADDON_GROUPS = {
382
420
  ],
383
421
  Documentation: ["starlight", "fumadocs"],
384
422
  Extensions: [
385
- "pwa",
386
- "tauri",
387
- "opentui",
388
- "wxt",
389
423
  "ruler",
390
424
  "devcontainer",
391
425
  "docker-compose"
@@ -393,10 +427,14 @@ const ADDON_GROUPS = {
393
427
  Integrations: [
394
428
  "msw",
395
429
  "storybook",
396
- "backend-utils"
430
+ "backend-utils",
431
+ "axios",
432
+ "firebase"
397
433
  ],
434
+ "API Tooling": ["graphql-codegen", "openapi-typescript"],
398
435
  "AI Agents": ["mcp", "skills"],
399
- "Data Fetching": ["swr"],
436
+ "App Platforms": [...types_exports.APP_PLATFORM_ADDON_VALUES],
437
+ "Data Fetching": ["swr", "apollo-client"],
400
438
  TanStack: [
401
439
  "tanstack-query",
402
440
  "tanstack-table",
@@ -411,19 +449,49 @@ function createGroupedAddonOptions() {
411
449
  function getAddonGroup(addon) {
412
450
  return Object.entries(ADDON_GROUPS).find(([, addons]) => addons.includes(addon))?.[0];
413
451
  }
414
- function validateAddonCompatibilityForPrompt(addon, frontends, auth, backend, runtime) {
415
- return validateAddonCompatibility(addon, frontends, auth, backend, runtime);
452
+ function validateAddonCompatibilityForPrompt(addon, frontends, auth, backend, runtime, api) {
453
+ return validateAddonCompatibility(addon, frontends, auth, backend, runtime, void 0, void 0, void 0, void 0, api);
416
454
  }
417
- function getCompatibleAddonsForPrompt(allAddons, frontends, existingAddons = [], auth, backend, runtime) {
418
- return getCompatibleAddons(allAddons, frontends, existingAddons, auth, backend, runtime);
455
+ function getCompatibleAddonsForPrompt(allAddons, frontends, existingAddons = [], auth, backend, runtime, api) {
456
+ return getCompatibleAddons(allAddons, frontends, existingAddons, auth, backend, runtime, api);
457
+ }
458
+ const APP_PLATFORM_ADDONS = new Set(types_exports.APP_PLATFORM_ADDON_VALUES);
459
+ /**
460
+ * Dedicated multiselect for app platforms (Electron, Tauri, Capacitor, PWA,
461
+ * WXT, OpenTUI). Selections merge into `config.addons`; when `--addons` is
462
+ * passed the flag already carries any platforms, so this returns [] to avoid
463
+ * double-collecting.
464
+ */
465
+ async function getAppPlatformsChoice(addons, frontends) {
466
+ if (addons !== void 0) return [];
467
+ const options = [];
468
+ for (const platform of types_exports.APP_PLATFORM_ADDON_VALUES) {
469
+ const { isCompatible } = validateAddonCompatibilityForPrompt(platform, frontends || []);
470
+ if (!isCompatible) continue;
471
+ const { label, hint } = getAddonDisplay(platform);
472
+ options.push({
473
+ value: platform,
474
+ label,
475
+ hint
476
+ });
477
+ }
478
+ if (options.length === 0) return [];
479
+ const response = await navigableMultiselect({
480
+ message: "Select app platforms (desktop, mobile, extension)",
481
+ options,
482
+ initialValues: [],
483
+ required: false
484
+ });
485
+ if (isCancel$1(response)) return exitCancelled("Operation cancelled");
486
+ return response;
419
487
  }
420
- async function getAddonsChoice(addons, frontends, auth, backend, runtime) {
488
+ async function getAddonsChoice(addons, frontends, auth, backend, runtime, api) {
421
489
  if (addons !== void 0) return addons;
422
- const allAddons = types_exports.AddonsSchema.options.filter((addon) => addon !== "none");
490
+ const allAddons = types_exports.AddonsSchema.options.filter((addon) => addon !== "none" && !APP_PLATFORM_ADDONS.has(addon));
423
491
  const groupedOptions = createGroupedAddonOptions();
424
492
  const frontendsArray = frontends || [];
425
493
  for (const addon of allAddons) {
426
- const { isCompatible } = validateAddonCompatibilityForPrompt(addon, frontendsArray, auth, backend, runtime);
494
+ const { isCompatible } = validateAddonCompatibilityForPrompt(addon, frontendsArray, auth, backend, runtime, api);
427
495
  if (!isCompatible) continue;
428
496
  const { label, hint } = getAddonDisplay(addon);
429
497
  const option = {
@@ -452,10 +520,10 @@ async function getAddonsChoice(addons, frontends, auth, backend, runtime) {
452
520
  if (isCancel$1(response)) return exitCancelled("Operation cancelled");
453
521
  return response;
454
522
  }
455
- async function getAddonsToAdd(frontend, existingAddons = [], auth, backend, runtime) {
523
+ async function getAddonsToAdd(frontend, existingAddons = [], auth, backend, runtime, api) {
456
524
  const groupedOptions = createGroupedAddonOptions();
457
525
  const frontendArray = frontend || [];
458
- const compatibleAddons = getCompatibleAddonsForPrompt(types_exports.AddonsSchema.options.filter((addon) => addon !== "none"), frontendArray, existingAddons, auth, backend, runtime);
526
+ const compatibleAddons = getCompatibleAddonsForPrompt(types_exports.AddonsSchema.options.filter((addon) => addon !== "none"), frontendArray, existingAddons, auth, backend, runtime, api);
459
527
  for (const addon of compatibleAddons) {
460
528
  const { label, hint } = getAddonDisplay(addon);
461
529
  const option = {
@@ -906,4 +974,4 @@ async function runMixCompile({ projectDir }) {
906
974
  }
907
975
 
908
976
  //#endregion
909
- export { isGoBack as _, runMavenTests as a, applyDependencyVersionChannel as c, isCancel$1 as d, navigableConfirm as f, GO_BACK_SYMBOL as g, setIsFirstPrompt as h, runGradleTests as i, getAddonsChoice as l, navigableSelect as m, runCargoBuild as n, runMixCompile as o, navigableMultiselect as p, runGoModTidy as r, runUvSync as s, installDependencies as t, getAddonsToAdd as u };
977
+ export { GO_BACK_SYMBOL as _, runMavenTests as a, applyDependencyVersionChannel as c, getAppPlatformsChoice as d, isCancel$1 as f, setIsFirstPrompt as g, navigableSelect as h, runGradleTests as i, getAddonsChoice as l, navigableMultiselect as m, runCargoBuild as n, runMixCompile as o, navigableConfirm as p, runGoModTidy as r, runUvSync as s, installDependencies as t, getAddonsToAdd as u, isGoBack as v };
@@ -1,11 +1,11 @@
1
1
  #!/usr/bin/env node
2
- import "./bts-config-DQVWvPDs.mjs";
2
+ import "./bts-config-B_HhcMXL.mjs";
3
3
  import "./errors-ns_o2OKg.mjs";
4
4
  import "./prompt-environment-BR0Kkw2W.mjs";
5
- import "./analytics-DVltG11u.mjs";
6
- import "./file-formatter-gvmrpd-g.mjs";
7
- import "./config-processing-D9-F2Us9.mjs";
8
- import "./scaffold-manifest-Dyi0voqE.mjs";
5
+ import "./analytics-BXlOG6u6.mjs";
6
+ import "./file-formatter-BgbfpYf4.mjs";
7
+ import "./config-processing-DJisMeW-.mjs";
8
+ import "./scaffold-manifest-CNFz-lmH.mjs";
9
9
  import { a as startMcpServer, i as recommendStackFromBrief, n as MCP_STACK_UPDATE_SCHEMA, r as getMcpGraphPreview, t as MCP_PLAN_CREATE_SCHEMA } from "./mcp-entry.mjs";
10
10
 
11
11
  export { recommendStackFromBrief, startMcpServer };
@@ -1,15 +1,15 @@
1
1
  #!/usr/bin/env node
2
- import { b as types_exports, d as getGraphSummary, m as getLatestCLIVersion, n as previewBtsConfigUpdate, o as writeBtsConfig, r as readBtsConfig, s as getEffectiveStack, t as buildBtsConfigForPersistence, v as getDefaultConfig } from "./bts-config-DQVWvPDs.mjs";
2
+ import { b as types_exports, d as getGraphSummary, m as getLatestCLIVersion, n as previewBtsConfigUpdate, o as writeBtsConfig, r as readBtsConfig, s as getEffectiveStack, t as buildBtsConfigForPersistence, v as getDefaultConfig } from "./bts-config-B_HhcMXL.mjs";
3
3
  import "./errors-ns_o2OKg.mjs";
4
4
  import "./prompt-environment-BR0Kkw2W.mjs";
5
- import { a as trackProjectCreation, i as trackEvent } from "./analytics-DVltG11u.mjs";
6
- import { r as validateConfigForProgrammaticUse, t as formatCode, v as CreateCommandOptionsSchema } from "./file-formatter-gvmrpd-g.mjs";
7
- import { a as getTemplateConfig, o as getTemplateDescription, s as generateReproducibleCommand, t as applyEffectBackendDefaults } from "./config-processing-D9-F2Us9.mjs";
8
- import { o as refreshScaffoldManifestFiles } from "./scaffold-manifest-Dyi0voqE.mjs";
5
+ import { a as trackProjectCreation, i as trackEvent } from "./analytics-BXlOG6u6.mjs";
6
+ import { a as asString, c as compatibilityChangesToProjectConfig, l as getCompatibilityBackend, o as asStringArray, r as validateConfigForProgrammaticUse, s as buildCompatibilityInputFromConfig, t as formatCode, w as CreateCommandOptionsSchema } from "./file-formatter-BgbfpYf4.mjs";
7
+ import { a as getTemplateConfig, o as getTemplateDescription, s as generateReproducibleCommand, t as applyEffectBackendDefaults } from "./config-processing-DJisMeW-.mjs";
8
+ import { c as refreshScaffoldManifestFiles, n as collectStructuredBaselines } from "./scaffold-manifest-CNFz-lmH.mjs";
9
9
  import z from "zod";
10
10
  import fs from "fs-extra";
11
11
  import path from "node:path";
12
- import { AISchema, APISchema, AddonsSchema, AiDocsSchema, AnalyticsSchema, AnimationSchema, AstroIntegrationSchema, AuthSchema, BackendSchema, CATEGORY_ORDER, CMSSchema, CSSFrameworkSchema, CachingSchema, DatabaseSchema, DatabaseSetupSchema, DotnetApiSchema, DotnetAuthSchema, DotnetCachingSchema, DotnetDeploySchema, DotnetJobQueueSchema, DotnetObservabilitySchema, DotnetOrmSchema, DotnetRealtimeSchema, DotnetTestingSchema, DotnetValidationSchema, DotnetWebFrameworkSchema, EcosystemSchema, EffectSchema, ElixirApiSchema, ElixirAuthSchema, ElixirCachingSchema, ElixirDeploySchema, ElixirEmailSchema, ElixirHttpSchema, ElixirJobsSchema, ElixirJsonSchema, ElixirLibrariesSchema, ElixirObservabilitySchema, ElixirOrmSchema, ElixirQualitySchema, ElixirRealtimeSchema, ElixirTestingSchema, ElixirValidationSchema, ElixirWebFrameworkSchema, EmailSchema, ExamplesSchema, FeatureFlagsSchema, FileStorageSchema, FileUploadSchema, FormsSchema, FrontendSchema, GoApiSchema, GoAuthSchema, GoCachingSchema, GoCliSchema, GoConfigSchema, GoLoggingSchema, GoMessageQueueSchema, GoObservabilitySchema, GoOrmSchema, GoRealtimeSchema, GoTestingSchema, GoWebFrameworkSchema, I18nSchema, JavaApiSchema, JavaAuthSchema, JavaBuildToolSchema, JavaLanguageSchema, JavaLibrariesSchema, JavaLoggingSchema, JavaOrmSchema, JavaTestingLibrariesSchema, JavaWebFrameworkSchema, JobQueueSchema, LoggingSchema, MobileDeepLinkingSchema, MobileNavigationSchema, MobileOTASchema, MobilePushSchema, MobileStorageSchema, MobileTestingSchema, MobileUISchema, OPTION_CATEGORY_METADATA, ORMSchema, ObservabilitySchema, PackageManagerSchema, PaymentsSchema, PythonAiSchema, PythonApiSchema, PythonAuthSchema, PythonCachingSchema, PythonCliSchema, PythonGraphqlSchema, PythonObservabilitySchema, PythonOrmSchema, PythonQualitySchema, PythonRealtimeSchema, PythonTaskQueueSchema, PythonTestingSchema, PythonValidationSchema, PythonWebFrameworkSchema, RateLimitSchema, RealtimeSchema, RuntimeSchema, RustApiSchema, RustAuthSchema, RustCachingSchema, RustCliSchema, RustErrorHandlingSchema, RustFrontendSchema, RustLibrariesSchema, RustLoggingSchema, RustMessageQueueSchema, RustObservabilitySchema, RustOrmSchema, RustRealtimeSchema, RustTemplatingSchema, RustWebFrameworkSchema, SearchSchema, ServerDeploySchema, ShadcnBaseColorSchema, ShadcnBaseSchema, ShadcnColorThemeSchema, ShadcnFontSchema, ShadcnIconLibrarySchema, ShadcnRadiusSchema, ShadcnStyleSchema, StateManagementSchema, TEMPLATE_VALUES, TestingSchema, UILibrarySchema, ValidationSchema, VectorDbSchema, VersionChannelSchema, WebDeploySchema, analyzeStackCompatibility, evaluateCompatibility, formatStackPartSpec, getCategoryOrderForEcosystem, legacyProjectConfigToStackParts, parseStackPartSpecs, stackPartsToLegacyProjectConfigPartial } from "@better-fullstack/types";
12
+ import { AISchema, APISchema, AddonsSchema, AiDocsSchema, AnalyticsSchema, AnimationSchema, AstroIntegrationSchema, AuthSchema, BackendSchema, CATEGORY_ORDER, CMSSchema, CSSFrameworkSchema, CachingSchema, DatabaseSchema, DatabaseSetupSchema, DotnetApiSchema, DotnetAuthSchema, DotnetCachingSchema, DotnetDeploySchema, DotnetJobQueueSchema, DotnetObservabilitySchema, DotnetOrmSchema, DotnetRealtimeSchema, DotnetTestingSchema, DotnetValidationSchema, DotnetWebFrameworkSchema, EcosystemSchema, EffectSchema, ElixirApiSchema, ElixirApplicationFrameworkSchema, ElixirAuthSchema, ElixirCachingSchema, ElixirClusteringSchema, ElixirDeploySchema, ElixirDocumentationSchema, ElixirEmailSchema, ElixirHttpSchema, ElixirHttpServerSchema, ElixirI18nSchema, ElixirJobsSchema, ElixirJsonSchema, ElixirLibrariesSchema, ElixirObservabilitySchema, ElixirOrmSchema, ElixirQualitySchema, ElixirRealtimeSchema, ElixirTestingSchema, ElixirValidationSchema, ElixirWebFrameworkSchema, EmailSchema, ExamplesSchema, FeatureFlagsSchema, FileStorageSchema, FileUploadSchema, FormsSchema, FrontendSchema, GoApiSchema, GoAuthSchema, GoCachingSchema, GoCliSchema, GoConfigSchema, GoDISchema, GoLoggingSchema, GoMessageQueueSchema, GoMigrationsSchema, GoObservabilitySchema, GoOrmSchema, GoProtoToolingSchema, GoQualitySchema, GoRealtimeSchema, GoTemplatingSchema, GoTestingSchema, GoValidationSchema, GoWebFrameworkSchema, I18nSchema, JavaApiSchema, JavaAuthSchema, JavaBuildToolSchema, JavaLanguageSchema, JavaLibrariesSchema, JavaLoggingSchema, JavaOrmSchema, JavaTestingLibrariesSchema, JavaWebFrameworkSchema, JobQueueSchema, LoggingSchema, MobileDeepLinkingSchema, MobileNavigationSchema, MobileOTASchema, MobilePushSchema, MobileStorageSchema, MobileTestingSchema, MobileUISchema, OPTION_CATEGORY_METADATA, ORMSchema, ObservabilitySchema, PackageManagerSchema, PaymentsSchema, PythonAiSchema, PythonApiSchema, PythonAuthSchema, PythonCachingSchema, PythonCliSchema, PythonGraphqlSchema, PythonObservabilitySchema, PythonOrmSchema, PythonQualitySchema, PythonRealtimeSchema, PythonTaskQueueSchema, PythonTestingSchema, PythonValidationSchema, PythonWebFrameworkSchema, RateLimitSchema, RealtimeSchema, RuntimeSchema, RustApiSchema, RustAuthSchema, RustCachingSchema, RustCliSchema, RustErrorHandlingSchema, RustFrontendSchema, RustLibrariesSchema, RustLoggingSchema, RustMessageQueueSchema, RustObservabilitySchema, RustOrmSchema, RustRealtimeSchema, RustTemplatingSchema, RustWebFrameworkSchema, SearchSchema, ServerDeploySchema, ShadcnBaseColorSchema, ShadcnBaseSchema, ShadcnColorThemeSchema, ShadcnFontSchema, ShadcnIconLibrarySchema, ShadcnRadiusSchema, ShadcnStyleSchema, StateManagementSchema, TEMPLATE_VALUES, TestingSchema, UILibrarySchema, ValidationSchema, VectorDbSchema, VersionChannelSchema, WebDeploySchema, analyzeStackCompatibility, evaluateCompatibility, formatStackPartSpec, getCategoryOrderForEcosystem, legacyProjectConfigToStackParts, parseStackPartSpecs, stackPartsToLegacyProjectConfigPartial } from "@better-fullstack/types";
13
13
  import { tmpdir } from "node:os";
14
14
  import { EMBEDDED_TEMPLATES, generateVirtualProject } from "@better-fullstack/template-generator";
15
15
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
@@ -249,9 +249,6 @@ function mergeDerivedStackPartsWithExistingGraph(currentConfig, proposedConfig)
249
249
  }
250
250
  return (0, types_exports.parseStackPartSpecs)(pruneScopedSpecsWithoutOwners([...new Set(nextSpecs)]), "selected");
251
251
  }
252
- function asString(value, fallback = "none") {
253
- return typeof value === "string" ? value : fallback;
254
- }
255
252
  function computeArchitectureChanges(currentConfig, proposedConfig) {
256
253
  const changes = [];
257
254
  for (const key of RISKY_ARCHITECTURE_KEYS) {
@@ -312,23 +309,6 @@ async function writeMigrationChecklist(projectDir, plan) {
312
309
  await fs.writeFile(migrationPath, `${existing}\n\n${section}\n`, "utf-8");
313
310
  } else await fs.writeFile(migrationPath, `# Migration checklist\n\n${section}\n`, "utf-8");
314
311
  }
315
- function asStringArray(value) {
316
- return Array.isArray(value) ? value.filter((item) => typeof item === "string") : [];
317
- }
318
- function getCompatibilityBackend(config, webFrontend) {
319
- if (config.backend !== "self") return asString(config.backend, "hono");
320
- if (webFrontend.includes("next")) return "self-next";
321
- if (webFrontend.includes("vinext")) return "self-vinext";
322
- if (webFrontend.includes("tanstack-start")) return "self-tanstack-start";
323
- if (webFrontend.includes("astro")) return "self-astro";
324
- if (webFrontend.includes("nuxt")) return "self-nuxt";
325
- if (webFrontend.includes("svelte")) return "self-svelte";
326
- if (webFrontend.includes("solid-start")) return "self-solid-start";
327
- return "self";
328
- }
329
- function getProjectBackendFromCompatibility(backend) {
330
- return backend.startsWith("self-") ? "self" : backend;
331
- }
332
312
  function getDefaultDatabaseForDbSetup(dbSetup) {
333
313
  switch (dbSetup) {
334
314
  case "turso":
@@ -391,197 +371,6 @@ function getDefaultNativeFrontendForRequestedUpdate(requestedChanges) {
391
371
  if (requestedChanges.mobileUI === "uniwind" || requestedChanges.mobileUI === "unistyles") return;
392
372
  return hasRequestedNonNoneValue(requestedChanges, "mobileNavigation") || hasRequestedNonNoneValue(requestedChanges, "mobileUI") || hasRequestedNonNoneValue(requestedChanges, "mobileStorage") || hasRequestedNonNoneValue(requestedChanges, "mobileTesting") || hasRequestedNonNoneValue(requestedChanges, "mobilePush") || hasRequestedNonNoneValue(requestedChanges, "mobileOTA") || hasRequestedNonNoneValue(requestedChanges, "mobileDeepLinking") ? "native-bare" : void 0;
393
373
  }
394
- function hasSelectedTypeScriptBackendPart(config) {
395
- return config.stackParts?.some((part) => part.source !== "provided" && !part.ownerPartId && part.role === "backend" && part.ecosystem === "typescript" && part.toolId !== "none") ?? false;
396
- }
397
- function getCompatibilityEcosystem(config) {
398
- if (config.ecosystem === "react-native" && hasSelectedTypeScriptBackendPart(config)) return "typescript";
399
- return config.ecosystem;
400
- }
401
- function buildCompatibilityInputFromConfig(config) {
402
- const frontend = asStringArray(config.frontend);
403
- const addons = asStringArray(config.addons);
404
- const webFrontend = frontend.filter((item) => !item.startsWith("native-") && item !== "none");
405
- const nativeFrontend = frontend.filter((item) => item.startsWith("native-"));
406
- const codeQuality = [];
407
- const documentation = [];
408
- const appPlatforms = [];
409
- for (const addon of addons) {
410
- const binding = (0, types_exports.getAddonStackPartBinding)(addon);
411
- if (binding?.role === "codeQuality") codeQuality.push(addon);
412
- else if (binding?.role === "documentation") documentation.push(addon);
413
- else if (addon !== "none") appPlatforms.push(addon);
414
- }
415
- return {
416
- ecosystem: getCompatibilityEcosystem(config),
417
- projectName: config.projectName ?? null,
418
- webFrontend,
419
- nativeFrontend,
420
- astroIntegration: asString(config.astroIntegration),
421
- runtime: asString(config.runtime, "bun"),
422
- backend: getCompatibilityBackend(config, webFrontend),
423
- database: asString(config.database),
424
- orm: asString(config.orm),
425
- dbSetup: asString(config.dbSetup),
426
- auth: asString(config.auth),
427
- payments: asString(config.payments),
428
- email: asString(config.email),
429
- fileUpload: asString(config.fileUpload),
430
- logging: asString(config.logging),
431
- observability: asString(config.observability),
432
- featureFlags: asString(config.featureFlags),
433
- analytics: asString(config.analytics),
434
- backendLibraries: "none",
435
- stateManagement: asString(config.stateManagement),
436
- forms: asString(config.forms),
437
- validation: asString(config.validation),
438
- testing: asString(config.testing),
439
- realtime: asString(config.realtime),
440
- jobQueue: asString(config.jobQueue),
441
- caching: asString(config.caching),
442
- rateLimit: asString(config.rateLimit),
443
- animation: asString(config.animation),
444
- cssFramework: asString(config.cssFramework),
445
- uiLibrary: asString(config.uiLibrary),
446
- shadcnBase: asString(config.shadcnBase, "radix"),
447
- shadcnStyle: asString(config.shadcnStyle, "nova"),
448
- shadcnIconLibrary: asString(config.shadcnIconLibrary, "lucide"),
449
- shadcnColorTheme: asString(config.shadcnColorTheme, "neutral"),
450
- shadcnBaseColor: asString(config.shadcnBaseColor, "neutral"),
451
- shadcnFont: asString(config.shadcnFont, "inter"),
452
- shadcnRadius: asString(config.shadcnRadius, "default"),
453
- cms: asString(config.cms),
454
- i18n: asString(config.i18n),
455
- search: asString(config.search),
456
- vectorDb: asString(config.vectorDb),
457
- fileStorage: asString(config.fileStorage),
458
- mobileNavigation: asString(config.mobileNavigation),
459
- mobileUI: asString(config.mobileUI),
460
- mobileStorage: asString(config.mobileStorage),
461
- mobileTesting: asString(config.mobileTesting),
462
- mobilePush: asString(config.mobilePush),
463
- mobileOTA: asString(config.mobileOTA),
464
- mobileDeepLinking: asString(config.mobileDeepLinking),
465
- codeQuality,
466
- documentation,
467
- appPlatforms,
468
- packageManager: asString(config.packageManager, "bun"),
469
- workspaceShape: asString(config.workspaceShape, "monorepo"),
470
- versionChannel: asString(config.versionChannel, "stable"),
471
- examples: asStringArray(config.examples),
472
- aiSdk: asString(config.ai),
473
- aiDocs: asStringArray(config.aiDocs),
474
- git: "false",
475
- install: "false",
476
- api: asString(config.api),
477
- webDeploy: asString(config.webDeploy),
478
- serverDeploy: asString(config.serverDeploy),
479
- yolo: "false",
480
- rustWebFramework: asString(config.rustWebFramework),
481
- rustFrontend: asString(config.rustFrontend),
482
- rustOrm: asString(config.rustOrm),
483
- rustApi: asString(config.rustApi),
484
- rustCli: asString(config.rustCli),
485
- rustLibraries: asStringArray(config.rustLibraries),
486
- rustLogging: asString(config.rustLogging),
487
- rustErrorHandling: asString(config.rustErrorHandling),
488
- rustCaching: asString(config.rustCaching),
489
- rustAuth: asString(config.rustAuth),
490
- rustRealtime: asString(config.rustRealtime),
491
- rustMessageQueue: asString(config.rustMessageQueue),
492
- rustObservability: asString(config.rustObservability),
493
- rustTemplating: asString(config.rustTemplating),
494
- pythonWebFramework: asString(config.pythonWebFramework),
495
- pythonOrm: asString(config.pythonOrm),
496
- pythonValidation: asString(config.pythonValidation),
497
- pythonAi: asStringArray(config.pythonAi),
498
- pythonAuth: asString(config.pythonAuth),
499
- pythonApi: asString(config.pythonApi),
500
- pythonTaskQueue: asString(config.pythonTaskQueue),
501
- pythonGraphql: asString(config.pythonGraphql),
502
- pythonQuality: asString(config.pythonQuality),
503
- pythonTesting: asStringArray(config.pythonTesting),
504
- pythonCaching: asString(config.pythonCaching),
505
- pythonRealtime: asString(config.pythonRealtime),
506
- pythonObservability: asString(config.pythonObservability),
507
- pythonCli: asStringArray(config.pythonCli),
508
- goWebFramework: asString(config.goWebFramework),
509
- goOrm: asString(config.goOrm),
510
- goApi: asString(config.goApi),
511
- goCli: asString(config.goCli),
512
- goLogging: asString(config.goLogging),
513
- goAuth: asString(config.goAuth),
514
- goTesting: asStringArray(config.goTesting),
515
- goRealtime: asString(config.goRealtime),
516
- goMessageQueue: asString(config.goMessageQueue),
517
- goCaching: asString(config.goCaching),
518
- goConfig: asString(config.goConfig),
519
- goObservability: asString(config.goObservability),
520
- javaLanguage: asString(config.javaLanguage, "java"),
521
- javaWebFramework: asString(config.javaWebFramework),
522
- javaBuildTool: asString(config.javaBuildTool),
523
- javaOrm: asString(config.javaOrm),
524
- javaAuth: asString(config.javaAuth),
525
- javaApi: asString(config.javaApi),
526
- javaLogging: asString(config.javaLogging),
527
- javaLibraries: asStringArray(config.javaLibraries),
528
- javaTestingLibraries: asStringArray(config.javaTestingLibraries),
529
- dotnetWebFramework: asString(config.dotnetWebFramework),
530
- dotnetOrm: asString(config.dotnetOrm),
531
- dotnetAuth: asString(config.dotnetAuth),
532
- dotnetApi: asString(config.dotnetApi),
533
- dotnetTesting: asStringArray(config.dotnetTesting),
534
- dotnetJobQueue: asString(config.dotnetJobQueue),
535
- dotnetRealtime: asString(config.dotnetRealtime),
536
- dotnetObservability: asStringArray(config.dotnetObservability),
537
- dotnetValidation: asString(config.dotnetValidation),
538
- dotnetCaching: asString(config.dotnetCaching),
539
- dotnetDeploy: asString(config.dotnetDeploy),
540
- elixirWebFramework: asString(config.elixirWebFramework),
541
- elixirOrm: asString(config.elixirOrm),
542
- elixirAuth: asString(config.elixirAuth),
543
- elixirApi: asString(config.elixirApi),
544
- elixirRealtime: asString(config.elixirRealtime),
545
- elixirJobs: asString(config.elixirJobs),
546
- elixirValidation: asString(config.elixirValidation),
547
- elixirHttp: asString(config.elixirHttp),
548
- elixirJson: asString(config.elixirJson),
549
- elixirEmail: asString(config.elixirEmail),
550
- elixirCaching: asString(config.elixirCaching),
551
- elixirObservability: asString(config.elixirObservability),
552
- elixirTesting: asString(config.elixirTesting),
553
- elixirQuality: asString(config.elixirQuality),
554
- elixirDeploy: asString(config.elixirDeploy),
555
- elixirLibraries: asStringArray(config.elixirLibraries)
556
- };
557
- }
558
- function compatibilityChangesToProjectConfig(adjusted, baseConfig) {
559
- const frontend = [...adjusted.webFrontend, ...adjusted.nativeFrontend];
560
- const ignoredCompatibilityKeys = new Set([
561
- "webFrontend",
562
- "nativeFrontend",
563
- "codeQuality",
564
- "documentation",
565
- "appPlatforms",
566
- "aiSdk",
567
- "backendLibraries",
568
- "projectName",
569
- "git",
570
- "install",
571
- "yolo"
572
- ]);
573
- const changes = {};
574
- for (const [key, value] of Object.entries(adjusted)) if (!ignoredCompatibilityKeys.has(key)) changes[key] = value;
575
- changes.frontend = frontend.length > 0 ? frontend : baseConfig.frontend;
576
- changes.addons = [
577
- ...adjusted.codeQuality,
578
- ...adjusted.documentation,
579
- ...adjusted.appPlatforms
580
- ];
581
- changes.ai = adjusted.aiSdk;
582
- changes.backend = getProjectBackendFromCompatibility(adjusted.backend);
583
- return changes;
584
- }
585
374
  function applyKnownDependencyExpansions(config, requestedChanges) {
586
375
  const next = { ...config };
587
376
  const adjustments = [];
@@ -795,8 +584,7 @@ function diffJsonSection(current, previous, proposed, section) {
795
584
  const blockers = [];
796
585
  for (const [name, proposedValue] of Object.entries(proposedSection)) {
797
586
  if (previousSection[name] === proposedValue) continue;
798
- const currentValue = currentSection[name];
799
- if (currentValue !== void 0 && currentValue !== previousSection[name]) {
587
+ if (currentSection[name] !== previousSection[name]) {
800
588
  blockers.push(`${section}.${name}`);
801
589
  continue;
802
590
  }
@@ -990,7 +778,7 @@ async function planStackUpdate(projectDirInput, input) {
990
778
  changes: []
991
779
  };
992
780
  const compatibilityAdjustments = [...dependencyExpansion.adjustments, ...compatibilityResult.changes.map((change) => `${change.category}: ${change.message}`)];
993
- if (compatibilityResult.adjustedStack) proposedConfig = mergeProjectConfig(proposedConfig, compatibilityChangesToProjectConfig(compatibilityResult.adjustedStack, proposedConfig));
781
+ if (compatibilityResult.adjustedStack) proposedConfig = mergeProjectConfig(proposedConfig, compatibilityChangesToProjectConfig(compatibilityResult.adjustedStack));
994
782
  proposedConfig.stackParts = mergeDerivedStackPartsWithExistingGraph(currentConfig, proposedConfig);
995
783
  Object.assign(proposedConfig, mergeStackPartSpecs(proposedConfig, stackPartSpecs));
996
784
  try {
@@ -1199,7 +987,7 @@ async function applyStackUpdate(projectDirInput, input) {
1199
987
  version: plan.proposedConfig.version,
1200
988
  createdAt: plan.proposedConfig.createdAt
1201
989
  });
1202
- await refreshScaffoldManifestFiles(plan.projectDir, plan.operations.map((operation) => operation.path));
990
+ await refreshScaffoldManifestFiles(plan.projectDir, plan.operations.map((operation) => operation.path), collectStructuredBaselines(proposedTree));
1203
991
  await writeMigrationChecklist(plan.projectDir, plan);
1204
992
  return plan;
1205
993
  }
@@ -1309,6 +1097,7 @@ const MCP_LEGACY_CATEGORY_KEYS = {
1309
1097
  backendLibraries: ["effect"],
1310
1098
  codeQuality: ["addons"],
1311
1099
  documentation: ["addons"],
1100
+ appShells: ["addons"],
1312
1101
  appPlatforms: ["addons"]
1313
1102
  };
1314
1103
  const MCP_SCHEMA_EXCLUDED_CATEGORIES = new Set([
@@ -1317,6 +1106,7 @@ const MCP_SCHEMA_EXCLUDED_CATEGORIES = new Set([
1317
1106
  "backendLibraries",
1318
1107
  "codeQuality",
1319
1108
  "documentation",
1109
+ "appShells",
1320
1110
  "appPlatforms",
1321
1111
  "aiDocs",
1322
1112
  "git",
@@ -1500,6 +1290,12 @@ const MCP_COMPATIBILITY_DEFAULTS = {
1500
1290
  goCaching: "none",
1501
1291
  goConfig: "none",
1502
1292
  goObservability: "none",
1293
+ goValidation: "none",
1294
+ goQuality: "none",
1295
+ goMigrations: "none",
1296
+ goTemplating: "none",
1297
+ goProtoTooling: "none",
1298
+ goDI: "none",
1503
1299
  javaLanguage: "java",
1504
1300
  javaWebFramework: "spring-boot",
1505
1301
  javaBuildTool: "maven",
@@ -1534,6 +1330,11 @@ const MCP_COMPATIBILITY_DEFAULTS = {
1534
1330
  elixirObservability: "telemetry",
1535
1331
  elixirTesting: "ex_unit",
1536
1332
  elixirQuality: "credo",
1333
+ elixirI18n: "none",
1334
+ elixirHttpServer: "cowboy",
1335
+ elixirApplicationFramework: "none",
1336
+ elixirDocumentation: "none",
1337
+ elixirClustering: "none",
1537
1338
  elixirDeploy: "none",
1538
1339
  elixirLibraries: []
1539
1340
  };
@@ -2128,6 +1929,12 @@ const crossEcosystemInputSchema = {
2128
1929
  goCaching: GoCachingSchema.optional().describe("Go caching library"),
2129
1930
  goConfig: GoConfigSchema.optional().describe("Go config management"),
2130
1931
  goObservability: GoObservabilitySchema.optional().describe("Go observability"),
1932
+ goValidation: GoValidationSchema.optional().describe("Go validation"),
1933
+ goQuality: GoQualitySchema.optional().describe("Go code quality"),
1934
+ goMigrations: GoMigrationsSchema.optional().describe("Go database migrations"),
1935
+ goTemplating: GoTemplatingSchema.optional().describe("Go templating"),
1936
+ goProtoTooling: GoProtoToolingSchema.optional().describe("Go protobuf tooling"),
1937
+ goDI: GoDISchema.optional().describe("Go dependency injection"),
2131
1938
  javaLanguage: JavaLanguageSchema.optional().describe("JVM language (java, kotlin)"),
2132
1939
  javaWebFramework: JavaWebFrameworkSchema.optional().describe("Java web framework"),
2133
1940
  javaBuildTool: JavaBuildToolSchema.optional().describe("Java build tool"),
@@ -2162,6 +1969,11 @@ const crossEcosystemInputSchema = {
2162
1969
  elixirObservability: ElixirObservabilitySchema.optional().describe("Elixir observability"),
2163
1970
  elixirTesting: ElixirTestingSchema.optional().describe("Elixir testing library"),
2164
1971
  elixirQuality: ElixirQualitySchema.optional().describe("Elixir code quality/security"),
1972
+ elixirI18n: ElixirI18nSchema.optional().describe("Elixir localization"),
1973
+ elixirHttpServer: ElixirHttpServerSchema.optional().describe("Elixir HTTP server"),
1974
+ elixirApplicationFramework: ElixirApplicationFrameworkSchema.optional().describe("Elixir application framework"),
1975
+ elixirDocumentation: ElixirDocumentationSchema.optional().describe("Elixir documentation tooling"),
1976
+ elixirClustering: ElixirClusteringSchema.optional().describe("Elixir clustering"),
2165
1977
  elixirDeploy: ElixirDeploySchema.optional().describe("Elixir deployment target"),
2166
1978
  elixirLibraries: z.array(ElixirLibrariesSchema).optional().describe("Elixir libraries")
2167
1979
  };
@@ -2543,11 +2355,11 @@ async function startMcpServer() {
2543
2355
  const graphPreview = getMcpGraphPreview(config);
2544
2356
  let addonWarnings = [];
2545
2357
  if (config.addons.length > 0 && config.addons[0] !== "none") {
2546
- const { setupAddons } = await import("./addons-setup-DnLjAzTw.mjs");
2358
+ const { setupAddons } = await import("./addons-setup-Du2VSv8V.mjs");
2547
2359
  addonWarnings = await setupAddons(config);
2548
2360
  }
2549
- const { recordScaffoldManifest } = await import("./scaffold-manifest-DGRyepdb.mjs");
2550
- await recordScaffoldManifest(projectDir);
2361
+ const { collectStructuredBaselines: collectStructuredBaselines$1, recordScaffoldManifest } = await import("./scaffold-manifest-ByKtMhTd.mjs");
2362
+ await recordScaffoldManifest(projectDir, { baselines: collectStructuredBaselines$1(result.tree) });
2551
2363
  const installCmd = getInstallCommand(input.ecosystem ?? "typescript", projectName, input.packageManager, input.javaBuildTool, input.javaWebFramework);
2552
2364
  await trackProjectCreation(config, false, {
2553
2365
  source: "mcp",
@@ -2893,4 +2705,4 @@ async function startMcpServer() {
2893
2705
  startMcpServer();
2894
2706
 
2895
2707
  //#endregion
2896
- export { startMcpServer as a, formatGeneratedTree as c, treeToFileMap as d, recommendStackFromBrief as i, generateTree as l, MCP_STACK_UPDATE_SCHEMA as n, applyStackUpdate as o, getMcpGraphPreview as r, configFromBtsConfig as s, MCP_PLAN_CREATE_SCHEMA as t, planStackUpdate as u };
2708
+ export { startMcpServer as a, configFromBtsConfig as c, mergeEnvExample as d, mergePackageJson as f, recommendStackFromBrief as i, formatGeneratedTree as l, treeToFileMap as m, MCP_STACK_UPDATE_SCHEMA as n, PACKAGE_JSON_SECTIONS as o, planStackUpdate as p, getMcpGraphPreview as r, applyStackUpdate as s, MCP_PLAN_CREATE_SCHEMA as t, generateTree as u };
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { b as types_exports, r as readBtsConfig } from "./bts-config-DQVWvPDs.mjs";
2
+ import { b as types_exports, r as readBtsConfig } from "./bts-config-B_HhcMXL.mjs";
3
3
  import { t as renderTitle } from "./render-title-zvyKC1ej.mjs";
4
4
  import { t as CLIError } from "./errors-ns_o2OKg.mjs";
5
5
  import { intro, log, outro } from "@clack/prompts";
@@ -0,0 +1,15 @@
1
+ #!/usr/bin/env node
2
+ import "./bts-config-B_HhcMXL.mjs";
3
+ import { a as createBtsCli, c as history, d as telemetry, f as update, i as create, l as router, n as builder, o as docs, r as check, s as doctor, t as add, u as sponsors } from "./run-DmN7QRt5.mjs";
4
+ import "./render-title-zvyKC1ej.mjs";
5
+ import "./errors-ns_o2OKg.mjs";
6
+ import "./prompt-environment-BR0Kkw2W.mjs";
7
+ import "./analytics-BXlOG6u6.mjs";
8
+ import "./file-formatter-BgbfpYf4.mjs";
9
+ import "./install-dependencies-D__bmW4k.mjs";
10
+ import "./generated-checks-CbioGjCh.mjs";
11
+ import "./config-processing-DJisMeW-.mjs";
12
+ import "./scaffold-manifest-CNFz-lmH.mjs";
13
+ import "./addons-setup-DR924M7b.mjs";
14
+
15
+ export { createBtsCli };