create-better-fullstack 1.6.1 → 1.6.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,23 +1,28 @@
1
1
  # Better Fullstack
2
2
 
3
- Scaffold production-ready fullstack apps in seconds. Pick your stack from 270+ options — the CLI wires everything together.
3
+ Scaffold production-ready fullstack apps in seconds. Pick your stack from 424 options — the CLI wires everything together.
4
4
 
5
5
  ## Quick Start
6
6
 
7
7
  ```bash
8
- # Using bun (recommended)
9
- bun create better-fullstack@latest
8
+ # Using npm
9
+ npm create better-fullstack@latest
10
+
11
+ # Using npx
12
+ npx create-better-fullstack@latest
10
13
 
11
14
  # Using pnpm
12
15
  pnpm create better-fullstack@latest
13
16
 
14
- # Using npm
15
- npx create-better-fullstack@latest
17
+ # Using bun
18
+ bun create better-fullstack@latest
16
19
 
17
20
  # Using yarn
18
21
  yarn create better-fullstack@latest
19
22
  ```
20
23
 
24
+ Bun is required only when the generated project selects Bun as its runtime or package manager. Node.js with npm is enough for Node-based projects.
25
+
21
26
  ## Web Builder
22
27
 
23
28
  Configure your stack visually — pick every option from a UI, preview your choices, and get a ready-to-run command.
@@ -26,8 +31,8 @@ Configure your stack visually — pick every option from a UI, preview your choi
26
31
 
27
32
  ## Features
28
33
 
29
- - **270+ options** — frontend, backend, database, auth, payments, AI, DevOps, and more
30
- - **4 ecosystems** — TypeScript, Rust, Python, Go
34
+ - **424 options** — frontend, backend, database, auth, payments, AI, DevOps, and more
35
+ - **5 ecosystems** — TypeScript, Rust, Python, Go, Java
31
36
  - **Visual builder** — configure your stack in the browser
32
37
  - **Wired for you** — every picked integration is preconfigured and working out of the box
33
38
 
@@ -37,7 +42,7 @@ Configure your stack visually — pick every option from a UI, preview your choi
37
42
  --yes # Accept all defaults
38
43
  --yolo # Scaffold a random stack — good for exploring
39
44
  --template <name> # Use a preset (t3, mern, pern, uniwind)
40
- --ecosystem <lang> # Start in rust, python, or go mode
45
+ --ecosystem <lang> # Start in typescript, rust, python, go, or java mode
41
46
  --version-channel # Dependency channel: stable, latest, beta
42
47
  --no-git # Skip git initialization
43
48
  --no-install # Skip dependency installation
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
2
  import "./bts-config-B_rZ4_sj.mjs";
3
- import { i as setupLefthook, n as setupBiome, r as setupHusky, t as setupAddons } from "./addons-setup-Cgup_RHm.mjs";
3
+ import { i as setupLefthook, n as setupBiome, r as setupHusky, t as setupAddons } from "./addons-setup-DQa6TRrx.mjs";
4
4
 
5
5
  export { setupAddons };
@@ -626,45 +626,50 @@ async function setupRuler(config) {
626
626
  log.error(pc.red("Ruler template directory not found. Please ensure ruler addon is properly installed."));
627
627
  return;
628
628
  }
629
- const selectedEditors = await autocompleteMultiselect({
630
- message: "Select AI assistants for Ruler",
631
- options: Object.entries({
632
- agentsmd: { label: "Agents.md" },
633
- aider: { label: "Aider" },
634
- amazonqcli: { label: "Amazon Q CLI" },
635
- amp: { label: "AMP" },
636
- antigravity: { label: "Antigravity" },
637
- augmentcode: { label: "AugmentCode" },
638
- claude: { label: "Claude Code" },
639
- cline: { label: "Cline" },
640
- codex: { label: "OpenAI Codex CLI" },
641
- copilot: { label: "GitHub Copilot" },
642
- crush: { label: "Crush" },
643
- cursor: { label: "Cursor" },
644
- firebase: { label: "Firebase Studio" },
645
- firebender: { label: "Firebender" },
646
- "gemini-cli": { label: "Gemini CLI" },
647
- goose: { label: "Goose" },
648
- jules: { label: "Jules" },
649
- junie: { label: "Junie" },
650
- kilocode: { label: "Kilo Code" },
651
- kiro: { label: "Kiro" },
652
- mistral: { label: "Mistral" },
653
- opencode: { label: "OpenCode" },
654
- openhands: { label: "Open Hands" },
655
- qwen: { label: "Qwen" },
656
- roo: { label: "RooCode" },
657
- trae: { label: "Trae AI" },
658
- warp: { label: "Warp" },
659
- windsurf: { label: "Windsurf" },
660
- zed: { label: "Zed" }
661
- }).map(([key, v]) => ({
662
- value: key,
663
- label: v.label
664
- })),
665
- required: false
666
- });
667
- if (isCancel(selectedEditors)) return exitCancelled("Operation cancelled");
629
+ const EDITORS$1 = {
630
+ agentsmd: { label: "Agents.md" },
631
+ aider: { label: "Aider" },
632
+ amazonqcli: { label: "Amazon Q CLI" },
633
+ amp: { label: "AMP" },
634
+ antigravity: { label: "Antigravity" },
635
+ augmentcode: { label: "AugmentCode" },
636
+ claude: { label: "Claude Code" },
637
+ cline: { label: "Cline" },
638
+ codex: { label: "OpenAI Codex CLI" },
639
+ copilot: { label: "GitHub Copilot" },
640
+ crush: { label: "Crush" },
641
+ cursor: { label: "Cursor" },
642
+ firebase: { label: "Firebase Studio" },
643
+ firebender: { label: "Firebender" },
644
+ "gemini-cli": { label: "Gemini CLI" },
645
+ goose: { label: "Goose" },
646
+ jules: { label: "Jules" },
647
+ junie: { label: "Junie" },
648
+ kilocode: { label: "Kilo Code" },
649
+ kiro: { label: "Kiro" },
650
+ mistral: { label: "Mistral" },
651
+ opencode: { label: "OpenCode" },
652
+ openhands: { label: "Open Hands" },
653
+ qwen: { label: "Qwen" },
654
+ roo: { label: "RooCode" },
655
+ trae: { label: "Trae AI" },
656
+ warp: { label: "Warp" },
657
+ windsurf: { label: "Windsurf" },
658
+ zed: { label: "Zed" }
659
+ };
660
+ let selectedEditors = [];
661
+ if (canPromptInteractively()) {
662
+ const prompted = await autocompleteMultiselect({
663
+ message: "Select AI assistants for Ruler",
664
+ options: Object.entries(EDITORS$1).map(([key, v]) => ({
665
+ value: key,
666
+ label: v.label
667
+ })),
668
+ required: false
669
+ });
670
+ if (isCancel(prompted)) return exitCancelled("Operation cancelled");
671
+ selectedEditors = [...prompted];
672
+ } else log.info("Skipping AI assistant selection (non-interactive mode).");
668
673
  if (selectedEditors.length === 0) {
669
674
  log.info("No AI assistants selected. To apply rules later, run:");
670
675
  log.info(pc.cyan(`${getPackageExecutionCommand(packageManager, "@intellectronica/ruler@latest apply --local-only")}`));
@@ -940,6 +945,10 @@ async function setupSkills(config) {
940
945
  }));
941
946
  });
942
947
  if (skillOptions.length === 0) return;
948
+ if (!canPromptInteractively()) {
949
+ log.info("Skipping skills installation (non-interactive mode). Run the skills CLI manually to install.");
950
+ return;
951
+ }
943
952
  const scope = await select({
944
953
  message: "Where should skills be installed?",
945
954
  options: [{
package/dist/index.d.mts CHANGED
@@ -602,12 +602,23 @@ declare const router: {
602
602
  "spring-actuator": "spring-actuator";
603
603
  "spring-validation": "spring-validation";
604
604
  flyway: "flyway";
605
+ liquibase: "liquibase";
606
+ "springdoc-openapi": "springdoc-openapi";
607
+ lombok: "lombok";
608
+ mapstruct: "mapstruct";
609
+ caffeine: "caffeine";
605
610
  }>>>;
606
611
  javaTestingLibraries: z.ZodOptional<z.ZodArray<z.ZodEnum<{
607
612
  none: "none";
608
613
  junit5: "junit5";
609
614
  mockito: "mockito";
610
615
  testcontainers: "testcontainers";
616
+ assertj: "assertj";
617
+ "rest-assured": "rest-assured";
618
+ wiremock: "wiremock";
619
+ awaitility: "awaitility";
620
+ archunit: "archunit";
621
+ jqwik: "jqwik";
611
622
  }>>>;
612
623
  aiDocs: z.ZodOptional<z.ZodArray<z.ZodEnum<{
613
624
  none: "none";
@@ -689,8 +700,8 @@ declare const router: {
689
700
  javaBuildTool: "none" | "maven" | "gradle";
690
701
  javaOrm: "none" | "spring-data-jpa";
691
702
  javaAuth: "none" | "spring-security";
692
- javaLibraries: ("none" | "spring-actuator" | "spring-validation" | "flyway")[];
693
- javaTestingLibraries: ("none" | "junit5" | "mockito" | "testcontainers")[];
703
+ javaLibraries: ("none" | "spring-actuator" | "spring-validation" | "flyway" | "liquibase" | "springdoc-openapi" | "lombok" | "mapstruct" | "caffeine")[];
704
+ javaTestingLibraries: ("none" | "junit5" | "mockito" | "testcontainers" | "assertj" | "rest-assured" | "wiremock" | "awaitility" | "archunit" | "jqwik")[];
694
705
  aiDocs: ("none" | "claude-md" | "agents-md" | "cursorrules")[];
695
706
  astroIntegration?: "none" | "svelte" | "solid" | "react" | "vue" | undefined;
696
707
  shadcnBase?: "radix" | "base" | undefined;
@@ -785,8 +796,8 @@ declare const router: {
785
796
  javaBuildTool: "none" | "maven" | "gradle";
786
797
  javaOrm: "none" | "spring-data-jpa";
787
798
  javaAuth: "none" | "spring-security";
788
- javaLibraries: ("none" | "spring-actuator" | "spring-validation" | "flyway")[];
789
- javaTestingLibraries: ("none" | "junit5" | "mockito" | "testcontainers")[];
799
+ javaLibraries: ("none" | "spring-actuator" | "spring-validation" | "flyway" | "liquibase" | "springdoc-openapi" | "lombok" | "mapstruct" | "caffeine")[];
800
+ javaTestingLibraries: ("none" | "junit5" | "mockito" | "testcontainers" | "assertj" | "rest-assured" | "wiremock" | "awaitility" | "archunit" | "jqwik")[];
790
801
  aiDocs: ("none" | "claude-md" | "agents-md" | "cursorrules")[];
791
802
  astroIntegration?: "none" | "svelte" | "solid" | "react" | "vue" | undefined;
792
803
  shadcnBase?: "radix" | "base" | undefined;
@@ -894,8 +905,8 @@ declare const router: {
894
905
  javaBuildTool: "none" | "maven" | "gradle";
895
906
  javaOrm: "none" | "spring-data-jpa";
896
907
  javaAuth: "none" | "spring-security";
897
- javaLibraries: ("none" | "spring-actuator" | "spring-validation" | "flyway")[];
898
- javaTestingLibraries: ("none" | "junit5" | "mockito" | "testcontainers")[];
908
+ javaLibraries: ("none" | "spring-actuator" | "spring-validation" | "flyway" | "liquibase" | "springdoc-openapi" | "lombok" | "mapstruct" | "caffeine")[];
909
+ javaTestingLibraries: ("none" | "junit5" | "mockito" | "testcontainers" | "assertj" | "rest-assured" | "wiremock" | "awaitility" | "archunit" | "jqwik")[];
899
910
  aiDocs: ("none" | "claude-md" | "agents-md" | "cursorrules")[];
900
911
  astroIntegration?: "none" | "svelte" | "solid" | "react" | "vue" | undefined;
901
912
  shadcnBase?: "radix" | "base" | undefined;
@@ -990,8 +1001,8 @@ declare const router: {
990
1001
  javaBuildTool: "none" | "maven" | "gradle";
991
1002
  javaOrm: "none" | "spring-data-jpa";
992
1003
  javaAuth: "none" | "spring-security";
993
- javaLibraries: ("none" | "spring-actuator" | "spring-validation" | "flyway")[];
994
- javaTestingLibraries: ("none" | "junit5" | "mockito" | "testcontainers")[];
1004
+ javaLibraries: ("none" | "spring-actuator" | "spring-validation" | "flyway" | "liquibase" | "springdoc-openapi" | "lombok" | "mapstruct" | "caffeine")[];
1005
+ javaTestingLibraries: ("none" | "junit5" | "mockito" | "testcontainers" | "assertj" | "rest-assured" | "wiremock" | "awaitility" | "archunit" | "jqwik")[];
995
1006
  aiDocs: ("none" | "claude-md" | "agents-md" | "cursorrules")[];
996
1007
  astroIntegration?: "none" | "svelte" | "solid" | "react" | "vue" | undefined;
997
1008
  shadcnBase?: "radix" | "base" | undefined;
package/dist/index.mjs CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import { t as __reExport } from "./chunk-CCII7kTE.mjs";
3
3
  import { a as DEFAULT_CONFIG, c as getDefaultConfig, i as getLatestCLIVersion, l as getUserPkgManager, n as updateBtsConfig, o as DEFAULT_UI_LIBRARY_BY_FRONTEND, r as writeBtsConfig, t as readBtsConfig } from "./bts-config-B_rZ4_sj.mjs";
4
- import { _ as setIsFirstPrompt$1, a as canPromptInteractively, c as CLIError, d as exitWithError, f as handleError, g as runWithContextAsync, h as isSilent, l as UserCancelledError, m as isFirstPrompt, o as getPackageExecutionArgs, p as didLastPromptShowUI, s as addPackageDependency, t as setupAddons, u as exitCancelled, v as setLastPromptShownUI } from "./addons-setup-Cgup_RHm.mjs";
4
+ import { _ as setIsFirstPrompt$1, a as canPromptInteractively, c as CLIError, d as exitWithError, f as handleError, g as runWithContextAsync, h as isSilent, l as UserCancelledError, m as isFirstPrompt, o as getPackageExecutionArgs, p as didLastPromptShowUI, s as addPackageDependency, t as setupAddons, u as exitCancelled, v as setLastPromptShownUI } from "./addons-setup-DQa6TRrx.mjs";
5
5
  import { cancel, confirm, intro, isCancel, log, outro, select, spinner, text } from "@clack/prompts";
6
6
  import { createRouterClient, os } from "@orpc/server";
7
7
  import pc from "picocolors";
@@ -3480,6 +3480,36 @@ const JAVA_TESTING_LIBRARY_PROMPT_OPTIONS = [
3480
3480
  label: "Testcontainers",
3481
3481
  hint: "Disposable Docker-based integration tests"
3482
3482
  },
3483
+ {
3484
+ value: "assertj",
3485
+ label: "AssertJ",
3486
+ hint: "Fluent assertions for Java tests"
3487
+ },
3488
+ {
3489
+ value: "rest-assured",
3490
+ label: "REST Assured",
3491
+ hint: "DSL for HTTP API and REST endpoint tests"
3492
+ },
3493
+ {
3494
+ value: "wiremock",
3495
+ label: "WireMock",
3496
+ hint: "HTTP service stubs for integration tests"
3497
+ },
3498
+ {
3499
+ value: "awaitility",
3500
+ label: "Awaitility",
3501
+ hint: "Wait helpers for asynchronous Java tests"
3502
+ },
3503
+ {
3504
+ value: "archunit",
3505
+ label: "ArchUnit",
3506
+ hint: "Architecture rules for Java package boundaries"
3507
+ },
3508
+ {
3509
+ value: "jqwik",
3510
+ label: "jqwik",
3511
+ hint: "Property-based testing on the JUnit Platform"
3512
+ },
3483
3513
  {
3484
3514
  value: "none",
3485
3515
  label: "None",
@@ -3502,6 +3532,31 @@ const JAVA_LIBRARY_PROMPT_OPTIONS = [
3502
3532
  label: "Flyway",
3503
3533
  hint: "Versioned SQL database migrations for JPA-backed apps"
3504
3534
  },
3535
+ {
3536
+ value: "liquibase",
3537
+ label: "Liquibase",
3538
+ hint: "Database change management for JPA-backed apps"
3539
+ },
3540
+ {
3541
+ value: "springdoc-openapi",
3542
+ label: "Springdoc OpenAPI",
3543
+ hint: "OpenAPI and Swagger UI documentation for Spring MVC APIs"
3544
+ },
3545
+ {
3546
+ value: "lombok",
3547
+ label: "Lombok",
3548
+ hint: "Annotation processor for reducing Java boilerplate"
3549
+ },
3550
+ {
3551
+ value: "mapstruct",
3552
+ label: "MapStruct",
3553
+ hint: "Compile-time generated mappers for DTO and entity conversions"
3554
+ },
3555
+ {
3556
+ value: "caffeine",
3557
+ label: "Caffeine",
3558
+ hint: "High-performance in-memory caching through Spring Cache"
3559
+ },
3505
3560
  {
3506
3561
  value: "none",
3507
3562
  label: "None",
@@ -8833,7 +8888,15 @@ function displayJavaInstructions(config) {
8833
8888
  const { projectName, relativePath, depsInstalled, javaWebFramework, javaBuildTool, javaOrm, javaAuth, javaLibraries, javaTestingLibraries } = config;
8834
8889
  const cdCmd = `cd ${relativePath}`;
8835
8890
  const isSpringBoot = javaWebFramework === "spring-boot" && javaBuildTool !== "none";
8836
- const effectiveJavaLibraries = isSpringBoot ? javaLibraries.filter((library) => library !== "none") : [];
8891
+ const rawJavaLibraries = isSpringBoot ? javaLibraries.filter((library) => library !== "none") : [];
8892
+ const rawJavaLibrarySet = new Set(rawJavaLibraries);
8893
+ const jpaRequiredJavaLibraries = new Set(["flyway", "liquibase"]);
8894
+ const effectiveJavaLibraries = [];
8895
+ for (const library of rawJavaLibraries) {
8896
+ if (jpaRequiredJavaLibraries.has(library) && javaOrm !== "spring-data-jpa") continue;
8897
+ if (library === "liquibase" && rawJavaLibrarySet.has("flyway")) continue;
8898
+ effectiveJavaLibraries.push(library);
8899
+ }
8837
8900
  const effectiveJavaTestingLibraries = javaBuildTool === "none" ? [] : javaTestingLibraries.filter((library) => library !== "none");
8838
8901
  const buildToolCommand = javaBuildTool === "none" ? null : javaBuildTool === "gradle" ? process.platform === "win32" ? "gradlew.bat" : "./gradlew" : process.platform === "win32" ? "mvnw.cmd" : "./mvnw";
8839
8902
  const runCommand = buildToolCommand ? isSpringBoot ? javaBuildTool === "gradle" ? `${buildToolCommand} bootRun` : `${buildToolCommand} spring-boot:run` : javaBuildTool === "gradle" ? `${buildToolCommand} run` : `${buildToolCommand} exec:java` : null;
@@ -8862,7 +8925,12 @@ function displayJavaInstructions(config) {
8862
8925
  const libraryNames = {
8863
8926
  "spring-actuator": "Spring Actuator",
8864
8927
  "spring-validation": "Spring Validation",
8865
- flyway: "Flyway"
8928
+ flyway: "Flyway",
8929
+ liquibase: "Liquibase",
8930
+ "springdoc-openapi": "Springdoc OpenAPI",
8931
+ lombok: "Lombok",
8932
+ mapstruct: "MapStruct",
8933
+ caffeine: "Caffeine"
8866
8934
  };
8867
8935
  const libraryList = effectiveJavaLibraries.map((library) => libraryNames[library] || library).join(", ");
8868
8936
  output += `${pc.cyan("•")} Libraries: ${libraryList}\n`;
@@ -8871,7 +8939,13 @@ function displayJavaInstructions(config) {
8871
8939
  const testingNames = {
8872
8940
  junit5: "JUnit 5",
8873
8941
  mockito: "Mockito",
8874
- testcontainers: "Testcontainers"
8942
+ testcontainers: "Testcontainers",
8943
+ assertj: "AssertJ",
8944
+ "rest-assured": "REST Assured",
8945
+ wiremock: "WireMock",
8946
+ awaitility: "Awaitility",
8947
+ archunit: "ArchUnit",
8948
+ jqwik: "jqwik"
8875
8949
  };
8876
8950
  const testingList = effectiveJavaTestingLibraries.map((library) => testingNames[library] || library).join(", ");
8877
8951
  output += `${pc.cyan("•")} Testing: ${testingList}\n`;
@@ -9402,9 +9476,10 @@ function displaySponsorsBox(sponsors$1) {
9402
9476
 
9403
9477
  //#endregion
9404
9478
  //#region src/index.ts
9479
+ const OPTION_ENTRY_COUNT = Object.values(types_exports.OPTION_CATEGORY_METADATA).reduce((sum, metadata) => sum + metadata.options.length, 0);
9405
9480
  const router = os.router({
9406
9481
  create: os.meta({
9407
- description: "Scaffold a new Better Fullstack project from 270+ compatible stack options",
9482
+ description: `Scaffold a new Better Fullstack project from ${OPTION_ENTRY_COUNT} compatible stack options`,
9408
9483
  default: true,
9409
9484
  negateBooleans: true
9410
9485
  }).input(CreateCommandInputSchema).handler(async ({ input }) => {
@@ -1,12 +1,12 @@
1
1
  #!/usr/bin/env node
2
2
  import { i as getLatestCLIVersion, r as writeBtsConfig, t as readBtsConfig } from "./bts-config-B_rZ4_sj.mjs";
3
3
  import z from "zod";
4
- import { AISchema, APISchema, AddonsSchema, AnalyticsSchema, AnimationSchema, AstroIntegrationSchema, AuthSchema, BackendSchema, CMSSchema, CSSFrameworkSchema, CachingSchema, DatabaseSchema, DatabaseSetupSchema, EcosystemSchema, EffectSchema, EmailSchema, ExamplesSchema, FeatureFlagsSchema, FileStorageSchema, FileUploadSchema, FormsSchema, FrontendSchema, GoApiSchema, GoAuthSchema, GoCliSchema, GoLoggingSchema, GoOrmSchema, GoWebFrameworkSchema, I18nSchema, JavaAuthSchema, JavaBuildToolSchema, JavaLibrariesSchema, JavaOrmSchema, JavaTestingLibrariesSchema, JavaWebFrameworkSchema, JobQueueSchema, LoggingSchema, ORMSchema, ObservabilitySchema, PackageManagerSchema, PaymentsSchema, PythonAiSchema, PythonAuthSchema, PythonGraphqlSchema, PythonOrmSchema, PythonQualitySchema, PythonTaskQueueSchema, PythonValidationSchema, PythonWebFrameworkSchema, RealtimeSchema, RuntimeSchema, RustApiSchema, RustAuthSchema, RustCachingSchema, RustCliSchema, RustErrorHandlingSchema, RustFrontendSchema, RustLibrariesSchema, RustLoggingSchema, RustOrmSchema, RustWebFrameworkSchema, SearchSchema, ServerDeploySchema, StateManagementSchema, TestingSchema, UILibrarySchema, ValidationSchema, WebDeploySchema, analyzeStackCompatibility } from "@better-fullstack/types";
4
+ import { AISchema, APISchema, AddonsSchema, AnalyticsSchema, AnimationSchema, AstroIntegrationSchema, AuthSchema, BackendSchema, CMSSchema, CSSFrameworkSchema, CachingSchema, DatabaseSchema, DatabaseSetupSchema, EcosystemSchema, EffectSchema, EmailSchema, ExamplesSchema, FeatureFlagsSchema, FileStorageSchema, FileUploadSchema, FormsSchema, FrontendSchema, GoApiSchema, GoAuthSchema, GoCliSchema, GoLoggingSchema, GoOrmSchema, GoWebFrameworkSchema, I18nSchema, JavaAuthSchema, JavaBuildToolSchema, JavaLibrariesSchema, JavaOrmSchema, JavaTestingLibrariesSchema, JavaWebFrameworkSchema, JobQueueSchema, LoggingSchema, OPTION_CATEGORY_METADATA, ORMSchema, ObservabilitySchema, PackageManagerSchema, PaymentsSchema, PythonAiSchema, PythonAuthSchema, PythonGraphqlSchema, PythonOrmSchema, PythonQualitySchema, PythonTaskQueueSchema, PythonValidationSchema, PythonWebFrameworkSchema, RealtimeSchema, RuntimeSchema, RustApiSchema, RustAuthSchema, RustCachingSchema, RustCliSchema, RustErrorHandlingSchema, RustFrontendSchema, RustLibrariesSchema, RustLoggingSchema, RustOrmSchema, RustWebFrameworkSchema, SearchSchema, ServerDeploySchema, StateManagementSchema, TestingSchema, UILibrarySchema, ValidationSchema, WebDeploySchema, analyzeStackCompatibility } from "@better-fullstack/types";
5
5
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
6
6
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
7
7
 
8
8
  //#region src/mcp.ts
9
- const INSTRUCTIONS = `Better-Fullstack scaffolds fullstack projects across TypeScript, Rust, Go, Python, and Java ecosystems with 270+ configurable options.
9
+ const INSTRUCTIONS = `Better-Fullstack scaffolds fullstack projects across TypeScript, Rust, Go, Python, and Java ecosystems with ${Object.values(OPTION_CATEGORY_METADATA).reduce((sum, metadata) => sum + metadata.options.length, 0)} configurable options.
10
10
 
11
11
  RECOMMENDED WORKFLOW:
12
12
  1. Call bfs_get_guidance to understand field semantics, required fields, and workflow rules.
@@ -766,7 +766,7 @@ async function startMcpServer() {
766
766
  await writeBtsConfig(config);
767
767
  let addonWarnings = [];
768
768
  if (config.addons.length > 0 && config.addons[0] !== "none") {
769
- const { setupAddons } = await import("./addons-setup-Cx9DU_sr.mjs");
769
+ const { setupAddons } = await import("./addons-setup-CBK1Htlc.mjs");
770
770
  addonWarnings = await setupAddons(config);
771
771
  }
772
772
  const installCmd = getInstallCommand(input.ecosystem ?? "typescript", projectName, input.packageManager, input.javaBuildTool);
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "create-better-fullstack",
3
- "version": "1.6.1",
4
- "description": "Scaffold production-ready fullstack apps in seconds. Pick your stack from 340+ options — the CLI wires everything together.",
3
+ "version": "1.6.2",
4
+ "description": "Scaffold production-ready fullstack apps in seconds. Pick your stack from 424 options — the CLI wires everything together.",
5
5
  "keywords": [
6
6
  "algolia",
7
7
  "angular",
@@ -127,11 +127,11 @@
127
127
  "prepublishOnly": "npm run build"
128
128
  },
129
129
  "dependencies": {
130
- "@better-fullstack/template-generator": "^1.6.1",
131
- "@better-fullstack/types": "^1.6.1",
130
+ "@better-fullstack/template-generator": "^1.6.2",
131
+ "@better-fullstack/types": "^1.6.2",
132
132
  "@clack/core": "^0.5.0",
133
133
  "@clack/prompts": "^1.2.0",
134
- "@orpc/server": "^1.13.14",
134
+ "@orpc/server": "^1.14.0",
135
135
  "consola": "^3.4.2",
136
136
  "env-paths": "^4.0.0",
137
137
  "execa": "^9.6.1",
@@ -149,7 +149,7 @@
149
149
  "zod": "^4.3.6"
150
150
  },
151
151
  "devDependencies": {
152
- "@types/bun": "^1.3.12",
152
+ "@types/bun": "^1.3.13",
153
153
  "@types/fs-extra": "^11.0.4",
154
154
  "@types/node": "^25.6.0",
155
155
  "publint": "^0.3.18",