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.
- package/dist/{add-handler-ztNjzoMN.mjs → add-handler-CE3XIs3y.mjs} +8 -8
- package/dist/{addons-setup-LaAj43NP.mjs → addons-setup-DR924M7b.mjs} +1 -1
- package/dist/addons-setup-Du2VSv8V.mjs +7 -0
- package/dist/{analytics-DVltG11u.mjs → analytics-BXlOG6u6.mjs} +1 -1
- package/dist/{bts-config-DQVWvPDs.mjs → bts-config-B_HhcMXL.mjs} +30 -0
- package/dist/cli.mjs +2 -2
- package/dist/{config-processing-D9-F2Us9.mjs → config-processing-DJisMeW-.mjs} +17 -1
- package/dist/{doctor-a4ca3SMd.mjs → doctor-Cc7sLuow.mjs} +2 -2
- package/dist/{file-formatter-gvmrpd-g.mjs → file-formatter-BgbfpYf4.mjs} +442 -22
- package/dist/{gen-CCClL7Ve.mjs → gen-BZ0QCxCC.mjs} +1 -1
- package/dist/{generated-checks-BV9jol5h.mjs → generated-checks-CbioGjCh.mjs} +1 -1
- package/dist/index.d.mts +461 -183
- package/dist/index.mjs +20 -9
- package/dist/{install-dependencies-RoUyaE8o.mjs → install-dependencies-D__bmW4k.mjs} +86 -18
- package/dist/{mcp-492OkjcS.mjs → mcp-DNKAo8nO.mjs} +5 -5
- package/dist/mcp-entry.mjs +37 -225
- package/dist/{registry-DSf2CEaU.mjs → registry-Cm3D45oT.mjs} +1 -1
- package/dist/run-C_S7ujfY.mjs +15 -0
- package/dist/{run-T6g1jkfy.mjs → run-DmN7QRt5.mjs} +1155 -292
- package/dist/scaffold-manifest-ByKtMhTd.mjs +4 -0
- package/dist/{scaffold-manifest-Dyi0voqE.mjs → scaffold-manifest-CNFz-lmH.mjs} +34 -5
- package/dist/{update-DJ8CI5KW.mjs → update-B270pWHc.mjs} +182 -25
- package/package.json +6 -6
- package/dist/addons-setup-DnLjAzTw.mjs +0 -7
- package/dist/run-CD8f7PHh.mjs +0 -15
- 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-
|
|
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-
|
|
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-
|
|
8
|
-
import "./file-formatter-
|
|
9
|
-
import "./install-dependencies-
|
|
10
|
-
import "./generated-checks-
|
|
11
|
-
import { t as applyEffectBackendDefaults } from "./config-processing-
|
|
12
|
-
import "./scaffold-manifest-
|
|
13
|
-
import "./addons-setup-
|
|
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-
|
|
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 {
|
|
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
|
-
"
|
|
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 {
|
|
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-
|
|
2
|
+
import "./bts-config-B_HhcMXL.mjs";
|
|
3
3
|
import "./errors-ns_o2OKg.mjs";
|
|
4
4
|
import "./prompt-environment-BR0Kkw2W.mjs";
|
|
5
|
-
import "./analytics-
|
|
6
|
-
import "./file-formatter-
|
|
7
|
-
import "./config-processing-
|
|
8
|
-
import "./scaffold-manifest-
|
|
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 };
|
package/dist/mcp-entry.mjs
CHANGED
|
@@ -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-
|
|
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-
|
|
6
|
-
import { r as validateConfigForProgrammaticUse, t as formatCode,
|
|
7
|
-
import { a as getTemplateConfig, o as getTemplateDescription, s as generateReproducibleCommand, t as applyEffectBackendDefaults } from "./config-processing-
|
|
8
|
-
import {
|
|
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
|
-
|
|
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
|
|
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-
|
|
2358
|
+
const { setupAddons } = await import("./addons-setup-Du2VSv8V.mjs");
|
|
2547
2359
|
addonWarnings = await setupAddons(config);
|
|
2548
2360
|
}
|
|
2549
|
-
const { recordScaffoldManifest } = await import("./scaffold-manifest-
|
|
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,
|
|
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-
|
|
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 };
|