create-better-fullstack 1.5.4 → 1.6.1
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/dist/{addons-setup-Bll5VFJd.mjs → addons-setup-Cgup_RHm.mjs} +138 -101
- package/dist/addons-setup-Cx9DU_sr.mjs +5 -0
- package/dist/{bts-config-BYD8mHt-.mjs → bts-config-B_rZ4_sj.mjs} +30 -68
- package/dist/cli.mjs +1 -1
- package/dist/index.d.mts +180 -45
- package/dist/index.mjs +2697 -1089
- package/dist/{mcp-CRjipp-w.mjs → mcp-CuEEG8e5.mjs} +1 -1
- package/dist/mcp-entry.mjs +112 -21
- package/dist/virtual.d.mts +1 -1
- package/package.json +24 -9
- package/dist/addons-setup-CWGwxN68.mjs +0 -5
package/dist/mcp-entry.mjs
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { i as getLatestCLIVersion, r as writeBtsConfig, t as readBtsConfig } from "./bts-config-
|
|
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, GoCliSchema, GoLoggingSchema, GoOrmSchema, GoWebFrameworkSchema, JobQueueSchema, LoggingSchema, ORMSchema, ObservabilitySchema, PackageManagerSchema, PaymentsSchema, PythonAiSchema, PythonOrmSchema, PythonQualitySchema, PythonTaskQueueSchema, PythonValidationSchema, PythonWebFrameworkSchema, RealtimeSchema, RuntimeSchema, RustApiSchema, RustCliSchema, 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, 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, and
|
|
9
|
+
const INSTRUCTIONS = `Better-Fullstack scaffolds fullstack projects across TypeScript, Rust, Go, Python, and Java ecosystems with 270+ configurable options.
|
|
10
10
|
|
|
11
11
|
RECOMMENDED WORKFLOW:
|
|
12
12
|
1. Call bfs_get_guidance to understand field semantics, required fields, and workflow rules.
|
|
@@ -21,10 +21,10 @@ For existing projects:
|
|
|
21
21
|
|
|
22
22
|
CRITICAL RULES:
|
|
23
23
|
- Dependency installation is ALWAYS skipped in MCP mode (timeout risk). After scaffolding, tell the user to run install manually.
|
|
24
|
-
- "frontend"
|
|
24
|
+
- Array fields: "frontend", "addons", "examples", "aiDocs", "rustLibraries", "pythonAi", "javaLibraries", and "javaTestingLibraries". Most other option fields are strings.
|
|
25
25
|
- "none" means "skip this feature entirely", not "use the default".
|
|
26
26
|
- Always specify "ecosystem" first — it determines which other fields are relevant.
|
|
27
|
-
- TypeScript-specific fields (frontend, backend, orm, etc.) are IGNORED for rust/python/go ecosystems.
|
|
27
|
+
- TypeScript-specific fields (frontend, backend, orm, etc.) are IGNORED for rust/python/go/java ecosystems.
|
|
28
28
|
- The compatibility engine auto-adjusts invalid combinations — always call bfs_check_compatibility first to see adjustments.`;
|
|
29
29
|
function getGuidance() {
|
|
30
30
|
return {
|
|
@@ -40,19 +40,21 @@ function getGuidance() {
|
|
|
40
40
|
typescript: "Full-featured: frontend + backend + database + ORM + auth + payments + 20+ feature categories.",
|
|
41
41
|
rust: "Backend/CLI: web framework (axum/actix-web), ORM (sea-orm/sqlx), gRPC, GraphQL, CLI tools.",
|
|
42
42
|
python: "Backend/AI: web framework (fastapi/django), ORM (sqlalchemy/sqlmodel), AI/ML integrations, task queues.",
|
|
43
|
-
go: "Backend/CLI: web framework (gin/echo), ORM (gorm/sqlc), gRPC, CLI tools, logging."
|
|
43
|
+
go: "Backend/CLI: web framework (gin/echo), ORM (gorm/sqlc), gRPC, CLI tools, logging.",
|
|
44
|
+
java: "Backend/API: Spring Boot with Maven or Gradle Wrapper, optional Spring Data JPA, Spring Security, app libraries, and Java testing libraries."
|
|
44
45
|
},
|
|
45
46
|
fieldRules: {
|
|
46
47
|
projectName: "kebab-case directory name. Required for bfs_create_project.",
|
|
47
48
|
ecosystem: "Must be set first. Determines which other fields are relevant.",
|
|
48
49
|
frontend: "ARRAY of strings. TypeScript only. Supports multiple frontends in one monorepo. Use [] for API-only.",
|
|
50
|
+
arrayFields: "Use arrays for frontend, addons, examples, aiDocs, rustLibraries, pythonAi, javaLibraries, and javaTestingLibraries. Use [] for \"none\" on multi-select fields.",
|
|
49
51
|
backend: "String. \"self\" means fullstack mode (Next.js/TanStack Start/Nuxt/Astro API routes). \"none\" for frontend-only.",
|
|
50
52
|
runtime: "\"bun\" or \"node\". Must be \"none\" when backend is \"self\" or \"convex\".",
|
|
51
53
|
addons: "ARRAY of strings. Monorepo tools, code quality, desktop (tauri), browser extensions (wxt), etc."
|
|
52
54
|
},
|
|
53
55
|
ambiguityRules: [
|
|
54
56
|
"If the user request leaves major stack choices unspecified, ASK the user before proceeding. Do not guess.",
|
|
55
|
-
"Do not infer addons, examples, or optional features the user did not mention. Default to \"none\".",
|
|
57
|
+
"Do not infer addons, examples, or optional features the user did not mention. Default strings to \"none\" and multi-select arrays to [].",
|
|
56
58
|
"When the user says 'fullstack Next.js', use backend='self', frontend=['next'], runtime='none'.",
|
|
57
59
|
"When the user says 'React + Hono', use frontend=['tanstack-router'] (or ask which React framework), backend='hono'."
|
|
58
60
|
],
|
|
@@ -99,6 +101,7 @@ const SCHEMA_MAP = {
|
|
|
99
101
|
analytics: AnalyticsSchema,
|
|
100
102
|
cms: CMSSchema,
|
|
101
103
|
caching: CachingSchema,
|
|
104
|
+
i18n: I18nSchema,
|
|
102
105
|
search: SearchSchema,
|
|
103
106
|
fileStorage: FileStorageSchema,
|
|
104
107
|
addons: AddonsSchema,
|
|
@@ -115,17 +118,29 @@ const SCHEMA_MAP = {
|
|
|
115
118
|
rustCli: RustCliSchema,
|
|
116
119
|
rustLibraries: RustLibrariesSchema,
|
|
117
120
|
rustLogging: RustLoggingSchema,
|
|
121
|
+
rustErrorHandling: RustErrorHandlingSchema,
|
|
122
|
+
rustCaching: RustCachingSchema,
|
|
123
|
+
rustAuth: RustAuthSchema,
|
|
118
124
|
pythonWebFramework: PythonWebFrameworkSchema,
|
|
119
125
|
pythonOrm: PythonOrmSchema,
|
|
120
126
|
pythonValidation: PythonValidationSchema,
|
|
121
127
|
pythonAi: PythonAiSchema,
|
|
128
|
+
pythonAuth: PythonAuthSchema,
|
|
122
129
|
pythonTaskQueue: PythonTaskQueueSchema,
|
|
130
|
+
pythonGraphql: PythonGraphqlSchema,
|
|
123
131
|
pythonQuality: PythonQualitySchema,
|
|
124
132
|
goWebFramework: GoWebFrameworkSchema,
|
|
125
133
|
goOrm: GoOrmSchema,
|
|
126
134
|
goApi: GoApiSchema,
|
|
127
135
|
goCli: GoCliSchema,
|
|
128
|
-
goLogging: GoLoggingSchema
|
|
136
|
+
goLogging: GoLoggingSchema,
|
|
137
|
+
goAuth: GoAuthSchema,
|
|
138
|
+
javaWebFramework: JavaWebFrameworkSchema,
|
|
139
|
+
javaBuildTool: JavaBuildToolSchema,
|
|
140
|
+
javaOrm: JavaOrmSchema,
|
|
141
|
+
javaAuth: JavaAuthSchema,
|
|
142
|
+
javaLibraries: JavaLibrariesSchema,
|
|
143
|
+
javaTestingLibraries: JavaTestingLibrariesSchema
|
|
129
144
|
};
|
|
130
145
|
const ECOSYSTEM_CATEGORIES = {
|
|
131
146
|
typescript: [
|
|
@@ -156,6 +171,7 @@ const ECOSYSTEM_CATEGORIES = {
|
|
|
156
171
|
"analytics",
|
|
157
172
|
"cms",
|
|
158
173
|
"caching",
|
|
174
|
+
"i18n",
|
|
159
175
|
"search",
|
|
160
176
|
"fileStorage",
|
|
161
177
|
"astroIntegration"
|
|
@@ -167,14 +183,19 @@ const ECOSYSTEM_CATEGORIES = {
|
|
|
167
183
|
"rustApi",
|
|
168
184
|
"rustCli",
|
|
169
185
|
"rustLibraries",
|
|
170
|
-
"rustLogging"
|
|
186
|
+
"rustLogging",
|
|
187
|
+
"rustErrorHandling",
|
|
188
|
+
"rustCaching",
|
|
189
|
+
"rustAuth"
|
|
171
190
|
],
|
|
172
191
|
python: [
|
|
173
192
|
"pythonWebFramework",
|
|
174
193
|
"pythonOrm",
|
|
175
194
|
"pythonValidation",
|
|
176
195
|
"pythonAi",
|
|
196
|
+
"pythonAuth",
|
|
177
197
|
"pythonTaskQueue",
|
|
198
|
+
"pythonGraphql",
|
|
178
199
|
"pythonQuality"
|
|
179
200
|
],
|
|
180
201
|
go: [
|
|
@@ -182,7 +203,16 @@ const ECOSYSTEM_CATEGORIES = {
|
|
|
182
203
|
"goOrm",
|
|
183
204
|
"goApi",
|
|
184
205
|
"goCli",
|
|
185
|
-
"goLogging"
|
|
206
|
+
"goLogging",
|
|
207
|
+
"goAuth"
|
|
208
|
+
],
|
|
209
|
+
java: [
|
|
210
|
+
"javaWebFramework",
|
|
211
|
+
"javaBuildTool",
|
|
212
|
+
"javaOrm",
|
|
213
|
+
"javaAuth",
|
|
214
|
+
"javaLibraries",
|
|
215
|
+
"javaTestingLibraries"
|
|
186
216
|
],
|
|
187
217
|
shared: [
|
|
188
218
|
"ecosystem",
|
|
@@ -215,11 +245,12 @@ function getSchemaOptions(category, ecosystem) {
|
|
|
215
245
|
}
|
|
216
246
|
return result;
|
|
217
247
|
}
|
|
218
|
-
function getInstallCommand(ecosystem, projectName, packageManager) {
|
|
248
|
+
function getInstallCommand(ecosystem, projectName, packageManager, javaBuildTool) {
|
|
219
249
|
switch (ecosystem) {
|
|
220
250
|
case "rust": return `cd ${projectName} && cargo build`;
|
|
221
251
|
case "python": return `cd ${projectName} && uv sync`;
|
|
222
252
|
case "go": return `cd ${projectName} && go mod tidy`;
|
|
253
|
+
case "java": return javaBuildTool === "gradle" ? `cd ${projectName} && ./gradlew test && ./gradlew bootRun` : `cd ${projectName} && ./mvnw test && ./mvnw spring-boot:run`;
|
|
223
254
|
default: return `cd ${projectName} && ${packageManager ?? "bun"} install`;
|
|
224
255
|
}
|
|
225
256
|
}
|
|
@@ -285,6 +316,7 @@ function buildProjectConfig(input, overrides) {
|
|
|
285
316
|
analytics: "none",
|
|
286
317
|
cms: input.cms ?? "none",
|
|
287
318
|
caching: input.caching ?? "none",
|
|
319
|
+
i18n: input.i18n ?? "none",
|
|
288
320
|
search: input.search ?? "none",
|
|
289
321
|
fileStorage: input.fileStorage ?? "none",
|
|
290
322
|
addons: input.addons ?? [],
|
|
@@ -305,17 +337,29 @@ function buildProjectConfig(input, overrides) {
|
|
|
305
337
|
rustCli: input.rustCli ?? "none",
|
|
306
338
|
rustLibraries: input.rustLibraries ?? [],
|
|
307
339
|
rustLogging: input.rustLogging ?? "none",
|
|
340
|
+
rustErrorHandling: input.rustErrorHandling ?? "none",
|
|
341
|
+
rustCaching: input.rustCaching ?? "none",
|
|
342
|
+
rustAuth: input.rustAuth ?? "none",
|
|
308
343
|
pythonWebFramework: input.pythonWebFramework ?? "none",
|
|
309
344
|
pythonOrm: input.pythonOrm ?? "none",
|
|
310
345
|
pythonValidation: input.pythonValidation ?? "none",
|
|
311
346
|
pythonAi: input.pythonAi ?? [],
|
|
347
|
+
pythonAuth: input.pythonAuth ?? "none",
|
|
312
348
|
pythonTaskQueue: input.pythonTaskQueue ?? "none",
|
|
349
|
+
pythonGraphql: input.pythonGraphql ?? "none",
|
|
313
350
|
pythonQuality: input.pythonQuality ?? "none",
|
|
314
351
|
goWebFramework: input.goWebFramework ?? "none",
|
|
315
352
|
goOrm: input.goOrm ?? "none",
|
|
316
353
|
goApi: input.goApi ?? "none",
|
|
317
354
|
goCli: input.goCli ?? "none",
|
|
318
|
-
goLogging: input.goLogging ?? "none"
|
|
355
|
+
goLogging: input.goLogging ?? "none",
|
|
356
|
+
goAuth: input.goAuth ?? "none",
|
|
357
|
+
javaWebFramework: input.javaWebFramework ?? "spring-boot",
|
|
358
|
+
javaBuildTool: input.javaBuildTool ?? "maven",
|
|
359
|
+
javaOrm: input.javaOrm ?? "none",
|
|
360
|
+
javaAuth: input.javaAuth ?? "none",
|
|
361
|
+
javaLibraries: input.javaLibraries ?? [],
|
|
362
|
+
javaTestingLibraries: input.javaTestingLibraries ?? ["junit5"]
|
|
319
363
|
};
|
|
320
364
|
}
|
|
321
365
|
function sanitizePath(input) {
|
|
@@ -367,9 +411,17 @@ function buildCompatibilityInput(input) {
|
|
|
367
411
|
realtime: input.realtime ?? "none",
|
|
368
412
|
jobQueue: input.jobQueue ?? "none",
|
|
369
413
|
caching: input.caching ?? "none",
|
|
414
|
+
i18n: input.i18n ?? "none",
|
|
370
415
|
animation: input.animation ?? "none",
|
|
371
416
|
cssFramework: input.cssFramework ?? "tailwind",
|
|
372
417
|
uiLibrary: input.uiLibrary ?? "none",
|
|
418
|
+
shadcnBase: input.shadcnBase ?? "radix",
|
|
419
|
+
shadcnStyle: input.shadcnStyle ?? "nova",
|
|
420
|
+
shadcnIconLibrary: input.shadcnIconLibrary ?? "lucide",
|
|
421
|
+
shadcnColorTheme: input.shadcnColorTheme ?? "neutral",
|
|
422
|
+
shadcnBaseColor: input.shadcnBaseColor ?? "neutral",
|
|
423
|
+
shadcnFont: input.shadcnFont ?? "inter",
|
|
424
|
+
shadcnRadius: input.shadcnRadius ?? "default",
|
|
373
425
|
cms: input.cms ?? "none",
|
|
374
426
|
search: input.search ?? "none",
|
|
375
427
|
fileStorage: input.fileStorage ?? "none",
|
|
@@ -392,19 +444,31 @@ function buildCompatibilityInput(input) {
|
|
|
392
444
|
rustOrm: input.rustOrm ?? "none",
|
|
393
445
|
rustApi: input.rustApi ?? "none",
|
|
394
446
|
rustCli: input.rustCli ?? "none",
|
|
395
|
-
rustLibraries:
|
|
447
|
+
rustLibraries: input.rustLibraries ?? [],
|
|
396
448
|
rustLogging: input.rustLogging ?? "none",
|
|
449
|
+
rustErrorHandling: input.rustErrorHandling ?? "none",
|
|
450
|
+
rustCaching: input.rustCaching ?? "none",
|
|
451
|
+
rustAuth: input.rustAuth ?? "none",
|
|
397
452
|
pythonWebFramework: input.pythonWebFramework ?? "none",
|
|
398
453
|
pythonOrm: input.pythonOrm ?? "none",
|
|
399
454
|
pythonValidation: input.pythonValidation ?? "none",
|
|
400
|
-
pythonAi:
|
|
455
|
+
pythonAi: input.pythonAi ?? [],
|
|
456
|
+
pythonAuth: input.pythonAuth ?? "none",
|
|
401
457
|
pythonTaskQueue: input.pythonTaskQueue ?? "none",
|
|
458
|
+
pythonGraphql: input.pythonGraphql ?? "none",
|
|
402
459
|
pythonQuality: input.pythonQuality ?? "none",
|
|
403
460
|
goWebFramework: input.goWebFramework ?? "none",
|
|
404
461
|
goOrm: input.goOrm ?? "none",
|
|
405
462
|
goApi: input.goApi ?? "none",
|
|
406
463
|
goCli: input.goCli ?? "none",
|
|
407
|
-
goLogging: input.goLogging ?? "none"
|
|
464
|
+
goLogging: input.goLogging ?? "none",
|
|
465
|
+
goAuth: input.goAuth ?? "none",
|
|
466
|
+
javaWebFramework: input.javaWebFramework ?? "spring-boot",
|
|
467
|
+
javaBuildTool: input.javaBuildTool ?? "maven",
|
|
468
|
+
javaOrm: input.javaOrm ?? "none",
|
|
469
|
+
javaAuth: input.javaAuth ?? "none",
|
|
470
|
+
javaLibraries: input.javaLibraries ?? [],
|
|
471
|
+
javaTestingLibraries: input.javaTestingLibraries ?? ["junit5"]
|
|
408
472
|
};
|
|
409
473
|
}
|
|
410
474
|
function summarizeTree(tree) {
|
|
@@ -456,7 +520,7 @@ const COMPATIBILITY_RULES_MD = `# Better-Fullstack Compatibility Rules
|
|
|
456
520
|
- Polar requires better-auth and a web frontend.
|
|
457
521
|
|
|
458
522
|
## Ecosystem Isolation
|
|
459
|
-
- Rust, Python, Go ecosystems are independent — TypeScript fields are ignored.
|
|
523
|
+
- Rust, Python, Go, and Java ecosystems are independent — TypeScript fields are ignored.
|
|
460
524
|
- Each ecosystem generates a standalone project with its own build system.
|
|
461
525
|
`;
|
|
462
526
|
const GETTING_STARTED_MD = `# Getting Started with Better-Fullstack MCP
|
|
@@ -496,6 +560,14 @@ const GETTING_STARTED_MD = `# Getting Started with Better-Fullstack MCP
|
|
|
496
560
|
- goOrm: "gorm"
|
|
497
561
|
2. Tell the user to run: cd my-go-app && go mod tidy && go run cmd/server/main.go
|
|
498
562
|
|
|
563
|
+
## Quick Start — Java Project
|
|
564
|
+
1. Call bfs_create_project with:
|
|
565
|
+
- projectName: "my-java-app"
|
|
566
|
+
- ecosystem: "java"
|
|
567
|
+
- javaWebFramework: "spring-boot"
|
|
568
|
+
- javaBuildTool: "maven"
|
|
569
|
+
2. Tell the user to run: cd my-java-app && ./mvnw test && ./mvnw spring-boot:run
|
|
570
|
+
|
|
499
571
|
## Adding Features to Existing Projects
|
|
500
572
|
1. Call bfs_add_feature with projectDir pointing to the project root.
|
|
501
573
|
2. Provide addons array with features to add (e.g., ["biome", "turborepo"]).
|
|
@@ -537,7 +609,13 @@ async function startMcpServer() {
|
|
|
537
609
|
payments: z.string().optional().describe("Payments provider"),
|
|
538
610
|
uiLibrary: z.string().optional().describe("UI component library"),
|
|
539
611
|
cssFramework: z.string().optional().describe("CSS framework"),
|
|
540
|
-
addons: z.array(z.string()).optional().describe("Addon list")
|
|
612
|
+
addons: z.array(z.string()).optional().describe("Addon list"),
|
|
613
|
+
javaWebFramework: JavaWebFrameworkSchema.optional().describe("Java web framework"),
|
|
614
|
+
javaBuildTool: JavaBuildToolSchema.optional().describe("Java build tool"),
|
|
615
|
+
javaOrm: JavaOrmSchema.optional().describe("Java ORM"),
|
|
616
|
+
javaAuth: JavaAuthSchema.optional().describe("Java authentication library"),
|
|
617
|
+
javaLibraries: z.array(JavaLibrariesSchema).optional().describe("Java application libraries"),
|
|
618
|
+
javaTestingLibraries: z.array(JavaTestingLibrariesSchema).optional().describe("Java testing libraries")
|
|
541
619
|
}, async (input) => {
|
|
542
620
|
try {
|
|
543
621
|
const filtered = filterCompatibilityResult(analyzeStackCompatibility(buildCompatibilityInput(input)), input.ecosystem);
|
|
@@ -584,6 +662,7 @@ async function startMcpServer() {
|
|
|
584
662
|
observability: ObservabilitySchema.optional().describe("Observability"),
|
|
585
663
|
search: SearchSchema.optional().describe("Search engine"),
|
|
586
664
|
caching: CachingSchema.optional().describe("Caching solution"),
|
|
665
|
+
i18n: I18nSchema.optional().describe("Internationalization (i18n) library"),
|
|
587
666
|
cms: CMSSchema.optional().describe("CMS"),
|
|
588
667
|
fileStorage: FileStorageSchema.optional().describe("File storage"),
|
|
589
668
|
fileUpload: FileUploadSchema.optional().describe("File upload"),
|
|
@@ -597,17 +676,28 @@ async function startMcpServer() {
|
|
|
597
676
|
rustCli: RustCliSchema.optional().describe("Rust CLI framework"),
|
|
598
677
|
rustLibraries: z.array(RustLibrariesSchema).optional().describe("Rust libraries"),
|
|
599
678
|
rustLogging: RustLoggingSchema.optional().describe("Rust logging library"),
|
|
679
|
+
rustErrorHandling: RustErrorHandlingSchema.optional().describe("Rust error handling library"),
|
|
680
|
+
rustCaching: RustCachingSchema.optional().describe("Rust caching library"),
|
|
681
|
+
rustAuth: RustAuthSchema.optional().describe("Rust authentication library"),
|
|
600
682
|
pythonWebFramework: PythonWebFrameworkSchema.optional().describe("Python web framework"),
|
|
601
683
|
pythonOrm: PythonOrmSchema.optional().describe("Python ORM"),
|
|
602
684
|
pythonValidation: PythonValidationSchema.optional().describe("Python validation"),
|
|
603
685
|
pythonAi: z.array(PythonAiSchema).optional().describe("Python AI libraries"),
|
|
686
|
+
pythonAuth: PythonAuthSchema.optional().describe("Python auth library"),
|
|
604
687
|
pythonTaskQueue: PythonTaskQueueSchema.optional().describe("Python task queue"),
|
|
605
688
|
pythonQuality: PythonQualitySchema.optional().describe("Python code quality"),
|
|
606
689
|
goWebFramework: GoWebFrameworkSchema.optional().describe("Go web framework"),
|
|
607
690
|
goOrm: GoOrmSchema.optional().describe("Go ORM"),
|
|
608
691
|
goApi: GoApiSchema.optional().describe("Go API layer"),
|
|
609
692
|
goCli: GoCliSchema.optional().describe("Go CLI framework"),
|
|
610
|
-
goLogging: GoLoggingSchema.optional().describe("Go logging library")
|
|
693
|
+
goLogging: GoLoggingSchema.optional().describe("Go logging library"),
|
|
694
|
+
goAuth: GoAuthSchema.optional().describe("Go authentication library"),
|
|
695
|
+
javaWebFramework: JavaWebFrameworkSchema.optional().describe("Java web framework"),
|
|
696
|
+
javaBuildTool: JavaBuildToolSchema.optional().describe("Java build tool"),
|
|
697
|
+
javaOrm: JavaOrmSchema.optional().describe("Java ORM"),
|
|
698
|
+
javaAuth: JavaAuthSchema.optional().describe("Java authentication library"),
|
|
699
|
+
javaLibraries: z.array(JavaLibrariesSchema).optional().describe("Java application libraries"),
|
|
700
|
+
javaTestingLibraries: z.array(JavaTestingLibrariesSchema).optional().describe("Java testing libraries")
|
|
611
701
|
};
|
|
612
702
|
server.tool("bfs_plan_project", "Dry-run: generates a project in-memory and returns the file tree WITHOUT writing to disk. Use this to preview what would be created.", planCreateSchema, async (input) => {
|
|
613
703
|
try {
|
|
@@ -676,10 +766,10 @@ async function startMcpServer() {
|
|
|
676
766
|
await writeBtsConfig(config);
|
|
677
767
|
let addonWarnings = [];
|
|
678
768
|
if (config.addons.length > 0 && config.addons[0] !== "none") {
|
|
679
|
-
const { setupAddons } = await import("./addons-setup-
|
|
769
|
+
const { setupAddons } = await import("./addons-setup-Cx9DU_sr.mjs");
|
|
680
770
|
addonWarnings = await setupAddons(config);
|
|
681
771
|
}
|
|
682
|
-
const installCmd = getInstallCommand(input.ecosystem ?? "typescript", projectName, input.packageManager);
|
|
772
|
+
const installCmd = getInstallCommand(input.ecosystem ?? "typescript", projectName, input.packageManager, input.javaBuildTool);
|
|
683
773
|
return { content: [{
|
|
684
774
|
type: "text",
|
|
685
775
|
text: JSON.stringify({
|
|
@@ -777,7 +867,8 @@ async function startMcpServer() {
|
|
|
777
867
|
packageManager: input.packageManager
|
|
778
868
|
});
|
|
779
869
|
if (result?.success) {
|
|
780
|
-
const
|
|
870
|
+
const existingConfig = await readBtsConfig(safePath);
|
|
871
|
+
const installCmd = getInstallCommand(existingConfig?.ecosystem ?? "typescript", safePath.split("/").pop() ?? "project", input.packageManager, existingConfig?.javaBuildTool);
|
|
781
872
|
return { content: [{
|
|
782
873
|
type: "text",
|
|
783
874
|
text: JSON.stringify({
|
package/dist/virtual.d.mts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { EMBEDDED_TEMPLATES, GeneratorOptions, GeneratorResult, TEMPLATE_COUNT, VirtualDirectory, VirtualFile, VirtualFileSystem, VirtualFileTree, VirtualNode, generateVirtualProject } from "@better-fullstack/template-generator";
|
|
3
2
|
import { API, Addons, Auth, Backend, Database, DatabaseSetup, Examples, Frontend, ORM, PackageManager, Payments, ProjectConfig, Runtime, ServerDeploy, WebDeploy } from "@better-fullstack/types";
|
|
3
|
+
import { EMBEDDED_TEMPLATES, GeneratorOptions, GeneratorResult, TEMPLATE_COUNT, VirtualDirectory, VirtualFile, VirtualFileSystem, VirtualFileTree, VirtualNode, generateVirtualProject } from "@better-fullstack/template-generator";
|
|
4
4
|
export { type API, type Addons, type Auth, type Backend, type Database, type DatabaseSetup, EMBEDDED_TEMPLATES, type Examples, type Frontend, type GeneratorOptions, type GeneratorResult, type ORM, type PackageManager, type Payments, type ProjectConfig, type Runtime, type ServerDeploy, TEMPLATE_COUNT, type VirtualDirectory, type VirtualFile, VirtualFileSystem, type VirtualFileTree, type VirtualNode, type WebDeploy, generateVirtualProject };
|
package/package.json
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "create-better-fullstack",
|
|
3
|
-
"version": "1.
|
|
4
|
-
"description": "Scaffold production-ready fullstack apps in seconds. Pick your stack from
|
|
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.",
|
|
5
5
|
"keywords": [
|
|
6
|
+
"algolia",
|
|
6
7
|
"angular",
|
|
7
8
|
"astro",
|
|
8
9
|
"authentication",
|
|
@@ -16,27 +17,38 @@
|
|
|
16
17
|
"create-app",
|
|
17
18
|
"desktop",
|
|
18
19
|
"developer-tools",
|
|
20
|
+
"diesel",
|
|
19
21
|
"docker",
|
|
20
22
|
"drizzle",
|
|
21
23
|
"elysia",
|
|
24
|
+
"ent",
|
|
22
25
|
"expo",
|
|
23
26
|
"fastapi",
|
|
27
|
+
"fiber",
|
|
28
|
+
"flask",
|
|
24
29
|
"fullstack",
|
|
25
30
|
"go",
|
|
26
31
|
"golang",
|
|
32
|
+
"graphql-yoga",
|
|
27
33
|
"hono",
|
|
34
|
+
"i18next",
|
|
35
|
+
"litestar",
|
|
28
36
|
"mobile",
|
|
37
|
+
"moka",
|
|
29
38
|
"monorepo",
|
|
39
|
+
"next-intl",
|
|
30
40
|
"nextjs",
|
|
31
41
|
"nuxt",
|
|
32
42
|
"payments",
|
|
33
43
|
"pnpm",
|
|
44
|
+
"pothos",
|
|
34
45
|
"prisma",
|
|
35
46
|
"project-generator",
|
|
36
47
|
"pwa",
|
|
37
48
|
"python",
|
|
38
49
|
"react",
|
|
39
50
|
"react-native",
|
|
51
|
+
"rocket",
|
|
40
52
|
"rust",
|
|
41
53
|
"scaffold",
|
|
42
54
|
"scaffolding",
|
|
@@ -44,6 +56,7 @@
|
|
|
44
56
|
"solid",
|
|
45
57
|
"starter",
|
|
46
58
|
"starter-kit",
|
|
59
|
+
"strawberry",
|
|
47
60
|
"svelte",
|
|
48
61
|
"sveltekit",
|
|
49
62
|
"tailwind",
|
|
@@ -54,10 +67,12 @@
|
|
|
54
67
|
"turborepo",
|
|
55
68
|
"type-safety",
|
|
56
69
|
"typescript",
|
|
70
|
+
"vercel",
|
|
57
71
|
"vite",
|
|
58
72
|
"vue",
|
|
59
73
|
"web-app",
|
|
60
|
-
"yarn"
|
|
74
|
+
"yarn",
|
|
75
|
+
"zerolog"
|
|
61
76
|
],
|
|
62
77
|
"homepage": "https://better-fullstack.dev/",
|
|
63
78
|
"license": "MIT",
|
|
@@ -112,11 +127,11 @@
|
|
|
112
127
|
"prepublishOnly": "npm run build"
|
|
113
128
|
},
|
|
114
129
|
"dependencies": {
|
|
115
|
-
"@better-fullstack/template-generator": "^1.
|
|
116
|
-
"@better-fullstack/types": "^1.
|
|
130
|
+
"@better-fullstack/template-generator": "^1.6.1",
|
|
131
|
+
"@better-fullstack/types": "^1.6.1",
|
|
117
132
|
"@clack/core": "^0.5.0",
|
|
118
133
|
"@clack/prompts": "^1.2.0",
|
|
119
|
-
"@orpc/server": "^1.13.
|
|
134
|
+
"@orpc/server": "^1.13.14",
|
|
120
135
|
"consola": "^3.4.2",
|
|
121
136
|
"env-paths": "^4.0.0",
|
|
122
137
|
"execa": "^9.6.1",
|
|
@@ -126,7 +141,7 @@
|
|
|
126
141
|
"jsonc-parser": "^3.3.1",
|
|
127
142
|
"oxfmt": "^0.19.0",
|
|
128
143
|
"picocolors": "^1.1.1",
|
|
129
|
-
"tinyglobby": "^0.2.
|
|
144
|
+
"tinyglobby": "^0.2.16",
|
|
130
145
|
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
131
146
|
"trpc-cli": "^0.12.1",
|
|
132
147
|
"ts-morph": "^27.0.2",
|
|
@@ -134,9 +149,9 @@
|
|
|
134
149
|
"zod": "^4.3.6"
|
|
135
150
|
},
|
|
136
151
|
"devDependencies": {
|
|
137
|
-
"@types/bun": "^1.3.
|
|
152
|
+
"@types/bun": "^1.3.12",
|
|
138
153
|
"@types/fs-extra": "^11.0.4",
|
|
139
|
-
"@types/node": "^25.
|
|
154
|
+
"@types/node": "^25.6.0",
|
|
140
155
|
"publint": "^0.3.18",
|
|
141
156
|
"tsdown": "^0.18.2",
|
|
142
157
|
"typescript": "^5.9.3"
|