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
|
|
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
|
|
9
|
-
|
|
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
|
|
15
|
-
|
|
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
|
-
- **
|
|
30
|
-
- **
|
|
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
|
|
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-
|
|
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
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
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-
|
|
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
|
|
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:
|
|
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 }) => {
|
package/dist/mcp-entry.mjs
CHANGED
|
@@ -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
|
|
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-
|
|
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.
|
|
4
|
-
"description": "Scaffold production-ready fullstack apps in seconds. Pick your stack from
|
|
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.
|
|
131
|
-
"@better-fullstack/types": "^1.6.
|
|
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.
|
|
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.
|
|
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",
|